diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md index 523eb00ea..922026fb0 100644 --- a/.github/ISSUE_TEMPLATE/Bug_report.md +++ b/.github/ISSUE_TEMPLATE/Bug_report.md @@ -32,6 +32,7 @@ _Make sure your have performed every step and checked the applicable boxes befor - [ ] Searched the problem in [discussions](https://github.com/arendst/Tasmota/discussions) - [ ] Searched the problem in the [docs](https://tasmota.github.io/docs/FAQ) - [ ] Searched the problem in the [chat](https://discord.gg/Ks2Kzd4) +- [ ] Problem is not scripter related, in this case open a discussion and tag @gemu2015 - [ ] Device used (e.g., Sonoff Basic): _____ - [ ] Tasmota binary firmware version number used: _____ - [ ] Pre-compiled diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 4fa824a5f..4573fa759 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,7 +7,7 @@ - [ ] Only relevant files were touched - [ ] Only one feature/fix was added per PR and the code change compiles without warnings - [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.8 - - [ ] The code change is tested and works with Tasmota core ESP32 V.3.1.0.241206 + - [ ] The code change is tested and works with Tasmota core ESP32 V.3.1.1.250203 - [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla). _NOTE: The code change must pass CI tests. **Your PR cannot be merged unless tests pass**_ diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 5dc38dc11..2aa33737a 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -25,35 +25,31 @@ jobs: uses: actions/setup-python@v5 with: python-version: '3.x' - #- name: Install clang compiler - #run: | - #sudo apt-get install -f clang - - name: Make Berry and Tasmota Berry code + + - name: Make Berry and Solidify code run: | cd lib/libesp32/berry make cd ../berry_tasmota ../berry/berry -s -g solidify_all.be - - name: Matter Berry Code - run: | - cd lib/libesp32/berry_matter + cd ../berry_matter ../berry/berry -s -g solidify_all.be - - name: Berry Animate Code - run: | - cd lib/libesp32/berry_animate + cd ../berry_animate ../berry/berry -s -g solidify_all.be - - name: LVGL Berry Code - run: | - cd lib/libesp32_lvgl/lv_binding_berry + cd ../../libesp32_lvgl/lv_binding_berry ../../libesp32/berry/berry -s -g solidify_all.be - - name: HASPmota Berry Code - run: | - cd lib/libesp32_lvgl/lv_haspmota + cd ../lv_haspmota ../../libesp32/berry/berry -s -g solidify_all.be - - uses: jason2866/upload-artifact@v2.0.3 + - uses: actions/upload-artifact@v4 with: - name: '["berry_tasmota", "berry_matter", "berry_animate", "berry_lvgl", "berry_haspmota", "berry_header"]' - path: '["./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32/berry_animate/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify", "./lib/libesp32_lvgl/lv_haspmota/src/solidify", "./lib/libesp32/berry/generate"]' + name: berry + path: | + ./lib/libesp32/berry_tasmota/src/solidify + ./lib/libesp32/berry_matter/src/solidify + ./lib/libesp32/berry_animate/src/solidify + ./lib/libesp32_lvgl/lv_binding_berry/src/solidify + ./lib/libesp32_lvgl/lv_haspmota/src/solidify + ./lib/libesp32/berry/generate push_solidified: needs: be_solidify @@ -66,22 +62,19 @@ jobs: uses: actions/setup-python@v5 with: python-version: '3.x' - - uses: jason2866/download-artifact@v3.0.4 + - uses: actions/download-artifact@v4 with: - name: | - berry_tasmota - berry_matter - berry_animate - berry_lvgl - berry_haspmota - berry_header - path: | - ./lib/libesp32/berry_tasmota/src/solidify - ./lib/libesp32/berry_matter/src/solidify - ./lib/libesp32/berry_animate/src/solidify - ./lib/libesp32_lvgl/lv_binding_berry/src/solidify - ./lib/libesp32_lvgl/lv_haspmota/src/solidify - ./lib/libesp32/berry/generate + pattern: berry + path: berry + - name: Move solidified Berry files back + run: | + ls -R ./berry + mv berry/berry/libesp32/berry_tasmota/src/solidify/* ./lib/libesp32/berry_tasmota/src/solidify + mv berry/berry/libesp32/berry_matter/src/solidify/* ./lib/libesp32/berry_matter/src/solidify + mv berry/berry/libesp32/berry_animate/src/solidify/* ./lib/libesp32/berry_animate/src/solidify + mv berry/berry/libesp32_lvgl/lv_binding_berry/src/solidify/* ./lib/libesp32_lvgl/lv_binding_berry/src/solidify + mv berry/berry/libesp32_lvgl/lv_haspmota/src/solidify/* ./lib/libesp32_lvgl/lv_haspmota/src/solidify + mv berry/berry/libesp32/berry/generate/* ./lib/libesp32/berry/generate - uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: Solidified Code updated @@ -129,9 +122,9 @@ jobs: #run: | #cp ./build_output/firmware/tasmota32solo1-safeboot.bin ./build_output/firmware/tasmota32-safeboot.bin - name: Upload safeboot firmware artifacts - uses: jason2866/upload-artifact@v2.0.3 + uses: actions/upload-artifact@v4 with: - name: firmware_safeboot + name: ${{ matrix.variant }} path: ./build_output base-images: @@ -172,9 +165,9 @@ jobs: - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - name: Upload firmware artifacts - uses: jason2866/upload-artifact@v2.0.3 + uses: actions/upload-artifact@v4 with: - name: firmware + name: ${{ matrix.variant }} path: ./build_output base32-images: @@ -214,10 +207,14 @@ jobs: pip install -U platformio cp ./platformio_override_sample.ini ./platformio_override.ini - name: Download safeboot firmwares - uses: jason2866/download-artifact@v3.0.4 + uses: actions/download-artifact@v4 with: - name: firmware_safeboot - path: ./firmware + pattern: tasmota32* + path: ./temp + - name: Move safeboot files + run: | + mkdir -p ./firmware/firmware + find ./temp -type f -exec cp -t ./firmware/firmware {} + - name: Add SHA to footer run: | COMMIT_SHA_LONG=$(git rev-parse --short HEAD || echo "") @@ -226,9 +223,9 @@ jobs: - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - name: Upload firmware artifacts - uses: jason2866/upload-artifact@v2.0.3 + uses: actions/upload-artifact@v4 with: - name: firmware + name: ${{ matrix.variant }} path: ./build_output language-images: @@ -239,7 +236,7 @@ jobs: strategy: matrix: variant: [ tasmota, tasmota32 ] - language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ] + language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, LT, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ] steps: - uses: actions/checkout@v4 with: @@ -254,10 +251,14 @@ jobs: pip install -U platformio cp ./platformio_override_sample.ini ./platformio_override.ini - name: Download safeboot firmwares - uses: jason2866/download-artifact@v3.0.4 + uses: actions/download-artifact@v4 with: - name: firmware_safeboot - path: ./firmware + pattern: tasmota32* + path: ./temp + - name: Move safeboot files + run: | + mkdir -p ./firmware/firmware + find ./temp -type f -exec cp -t ./firmware/firmware {} + - name: Add SHA to footer run: | COMMIT_SHA_LONG=$(git rev-parse --short HEAD || echo "") @@ -266,9 +267,9 @@ jobs: - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }}-${{ matrix.language }} - name: Upload language firmware artifacts - uses: jason2866/upload-artifact@v2.0.3 + uses: actions/upload-artifact@v4 with: - name: firmware + name: ${{ matrix.variant }}-${{ matrix.language }} path: ./build_output Start_final_copy: diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index d52e5a2ea..8228dc63d 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -51,9 +51,9 @@ jobs: - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - name: Upload safeboot firmware artifacts - uses: jason2866/upload-artifact@v2.0.3 + uses: actions/upload-artifact@v4 with: - name: firmware_safeboot + name: ${{ matrix.variant }} path: ./build_output base-images: @@ -92,9 +92,9 @@ jobs: - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - name: Upload firmware artifacts - uses: jason2866/upload-artifact@v2.0.3 + uses: actions/upload-artifact@v4 with: - name: firmware + name: ${{ matrix.variant }} path: ./build_output base32-images: @@ -134,22 +134,23 @@ jobs: pip install -U platformio cp ./platformio_override_sample.ini ./platformio_override.ini - name: Download safeboot firmwares - uses: jason2866/download-artifact@v3.0.4 + uses: actions/download-artifact@v4 with: - name: firmware_safeboot - path: ./firmware - - name: Display downloaded files + pattern: tasmota32* + path: ./temp + - name: Move safeboot files run: | - ls -R ./firmware/ + mkdir -p ./firmware/firmware + find ./temp -type f -exec cp -t ./firmware/firmware {} + - name: Add "release" to footer run: | sed -i -e "s/TASMOTA_SHA_SHORT/TASMOTA_SHA_SHORT release-/g" ./tasmota/include/tasmota_version.h - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - name: Upload firmware artifacts - uses: jason2866/upload-artifact@v2.0.3 + uses: actions/upload-artifact@v4 with: - name: firmware + name: ${{ matrix.variant }} path: ./build_output language-images: @@ -160,7 +161,7 @@ jobs: strategy: matrix: variant: [ tasmota, tasmota32 ] - language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ] + language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, LT, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ] steps: - uses: actions/checkout@v4 with: @@ -175,22 +176,23 @@ jobs: pip install -U platformio cp ./platformio_override_sample.ini ./platformio_override.ini - name: Download safeboot firmwares - uses: jason2866/download-artifact@v3.0.4 + uses: actions/download-artifact@v4 with: - name: firmware_safeboot - path: ./firmware - - name: Display downloaded files + pattern: tasmota32* + path: ./temp + - name: Move safeboot files run: | - ls -R ./firmware/ + mkdir -p ./firmware/firmware + find ./temp -type f -exec cp -t ./firmware/firmware {} + - name: Add "release" to footer run: | sed -i -e "s/TASMOTA_SHA_SHORT/TASMOTA_SHA_SHORT release-/g" ./tasmota/include/tasmota_version.h - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }}-${{ matrix.language }} - name: Upload language firmware artifacts - uses: jason2866/upload-artifact@v2.0.3 + uses: actions/upload-artifact@v4 with: - name: firmware + name: ${{ matrix.variant }}-${{ matrix.language }} path: ./build_output Release: @@ -199,28 +201,24 @@ jobs: continue-on-error: true steps: - uses: actions/checkout@v4 - - name: Download Tasmota firmwares - uses: jason2866/download-artifact@v3.0.4 + - name: Download all Tasmota artifacts + uses: actions/download-artifact@v4 with: - name: firmware - path: ./mv_firmware - - name: Download safeboot firmwares - uses: jason2866/download-artifact@v3.0.4 - with: - name: firmware_safeboot - path: ./mv_firmware + pattern: tasmota* + path: ./temp + - name: Move files + run: | + mkdir -p ./release + find ./temp -type f -exec cp -t ./release {} + - name: Display structure of downloaded files - run: ls -R ./mv_firmware/ - - name: Zip all map.gz files in one file -> map_all.zip - run: 7z a -mx=9 -tzip -xr'!.*' map_all.zip mv_firmware/map + run: ls -R ./release/ - name: Release uses: jason2866/action-gh-release@v1.2 #if: startsWith(github.ref, 'refs/tags/') with: tag_name: ${{ github.run_number }} files: | - ./mv_firmware/firmware/* - map_all.zip + ./release/tasmota* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/build_all_the_things.yml b/.github/workflows/build_all_the_things.yml index aa80aa913..5fe75a5d8 100644 --- a/.github/workflows/build_all_the_things.yml +++ b/.github/workflows/build_all_the_things.yml @@ -41,9 +41,9 @@ jobs: #platformio update - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - - uses: jason2866/upload-artifact@v2.0.3 + - uses: actions/upload-artifact@v4 with: - name: firmware + name: ${{ matrix.variant }} path: ./build_output os-check-mac: @@ -69,9 +69,9 @@ jobs: #platformio update - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - - uses: jason2866/upload-artifact@v2.0.3 + - uses: actions/upload-artifact@v4 with: - name: firmware + name: ${{ matrix.variant }} path: ./build_output base-images: @@ -128,9 +128,9 @@ jobs: cp ./platformio_override_sample.ini ./platformio_override.ini - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - - uses: jason2866/upload-artifact@v2.0.3 + - uses: actions/upload-artifact@v4 with: - name: firmware + name: ${{ matrix.variant }} path: ./build_output language-images: @@ -140,7 +140,7 @@ jobs: fail-fast: true matrix: variant: [ tasmota ] - language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ] + language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, LT, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ] steps: - uses: actions/checkout@v4 - name: Set up Python @@ -156,7 +156,7 @@ jobs: #platformio update - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }}-${{ matrix.language }} - - uses: jason2866/upload-artifact@v2.0.3 + - uses: actions/upload-artifact@v4 with: - name: firmware + name: ${{ matrix.variant }}-${{ matrix.language }} path: ./build_output diff --git a/.gitignore b/.gitignore index 2b1761446..820b5a561 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,8 @@ data unpacked_fs unpacked_boards tasmota/user_config_override.h +tasmota/include/local_ca_data.h +tasmota/include/local_ca_descriptor.h variants variants3 build diff --git a/BUILDS.md b/BUILDS.md index 91294c5e1..f73691be2 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -105,8 +105,9 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the | **Feature or Sensor** | **l** | **t** | **k** | **s** | **i** | **d** | **Remarks** | | USE_I2C | - | x / x | x | x | - | x | | USE_RTC_CHIPS | - | - / x | - | - | - | - | -| -USE_DS3231 | - | - / - | - | - | - | - | | -USE_BM8563 | - | - / x | - | - | - | - | +| -USE_DS3231 | - | - / - | - | - | - | - | +| -USE_PCF85063 | - | - / - | - | - | - | - | | -USE_PCF85363 | - | - / - | - | - | - | - | | -USE_RX8010 | - | - / - | - | - | - | - | | USE_SHT | - | - / x | - | x | - | - | @@ -233,6 +234,7 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the | USE_HC8 | - | - / - | - | - | - | - | | USE_PIPSOLAR | - | - / - | - | - | - | - | | USE_WOOLIIS | - | - / - | - | - | - | - | +| USE_C8_CO2_5K | - | - / - | - | - | - | - | | | | | | | | | | USE_NRF24 | - | - / - | - | - | - | - | | USE_MIBLE | - | - / - | - | - | - | - | @@ -244,11 +246,14 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the | USE_IR_RECEIVE | - | x / - | x | x | x | x | | USE_IR_REMOTE_FULL | - | - / - | - | - | x | - | Enable ALL protocols | | | | | | | | | +| USE_WIZMOTE | - | - / - | - | - | - | - | +| | | | | | | | | USE_SR04 | - | - / - | - | x | - | - | | USE_ME007 | - | - / - | - | - | - | - | | USE_DYP | - | - / - | - | - | - | - | | USE_TM1638 | - | - / x | - | x | - | - | | USE_HX711 | - | - / x | - | x | - | - | +| -USE_HX711_M5SCALES | - | - / - | - | - | - | - | | USE_TX2x_WIND_SENSOR | - | - / - | - | - | - | - | | USE_WINDMETER | - | - / - | - | - | - | - | | USE_RC_SWITCH | - | - / x | - | x | - | - | @@ -283,6 +288,7 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the | USE_SONOFF_SPM | | / x | | | | | | USE_DISPLAY_TM1621_SONOFF | | / x | | | | | | USE_SHELLY_PRO | | / x | | | | | +| USE_ESP32_TWAI | | / x | | | | | | USE_DALI | | / x | | | | | | USE_DINGTIAN_RELAY | | / - | | | | | | USE_MATTER_DEVICE | | / x | | | | | See SetOption151 | diff --git a/CHANGELOG.md b/CHANGELOG.md index 8982cc94d..9bb2b45b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,107 @@ All notable changes to this project will be documented in this file. ## [Released] +## [14.5.0] 20250219 +- Release Ruth + +## [14.4.1.4] 20250219 +### Added +- Formatter `%_U` for `ext_snprintf_P()` to print uint64_t variable as decimal equivalent to `%llu` +- Support for RC-switch decoding of 64-bit received data +- Berry `tasmota.defer()` (#22976) +- Support for Lithuanian language translations by zzdovydas (#22971) +- `MqttTLS` field in `Status 6` to indicate if the MQTT connection is encrypted (#22995) +- Support for WiZ Smart Remote using `#define USE_WIZMOTE` and command `SetOption164 1` +- Berry `bytes().appendb64()` (#22767) + +### Changed +- ESP32 Platform from 2025.01.31 to 2025.02.30, Framework (Arduino Core) from v3.1.1.250109 to v3.1.1.250203 and IDF to 5.3.2 (#22943) + +### Fixed +- Berry parser error in rare case (#22997) +- ESP32 TasMesh broker MAC address all zeros (#23005) + +## [14.4.1.3] 20250204 +### Added +- Command `FileLog 0..4` to enable logging to filesystem using up to 16 rotating log files of 100kB (`#define FILE_LOG_SIZE 100`) +- Command `FileLog 10..14` to enable logging to filesystem using up to 16 log files of 100kB (`#define FILE_LOG_SIZE 100`) +- I2S Opus stream and file support for opus/aac (#22795) +- I2S command I2sLoop (#22807) +- Berry `serial.read()` read only `n` bytes (#22835) +- Display template for Waveshare ESP32-C6 LCD 1.47 (#22863) +- Berry `tasmota.global.tele_period` and `tasmota.settings.tele_period` (#22865) +- ESP32 command `PixelType` to change the WS2812 color order and channel number (#22876) +- Berry driver for AXP2102 and M5CoreS3 (#22878) +- GPS driver select baudrate using GPIO GPS_RX1 (9600bps), GPS_RX2 (19200bps) or GPS_RX3 (38400bps) (#22869) +- LVLG/HASPmota add color names from OpenHASP (#22879) +- HASPmota support for `buttonmatrix` events (#22898) +- Berry driver for PN532 NFC/Mifare reader (#22899) +- Berry `tasmota.add_rule_once` and auto-remove rules with same pattern and id (#22900) +- Berry example for HeatFan WiFi Controller +- LVGL `lv.set_paint_cb()` to register a callback when screen is refreshed (#22909) +- Berry `tasmota.settings` entries for PixelType (#22912) +- Support for C8-CO2-5K CO2 sensor (#22905) +- `#define FIX_JSON_HEXADECIMAL` to change JSON hexadecimal value "FF5F78" into "0xFF5F78" (#22919) + +### Changed +- ESP32 Platform from 2024.12.30 to 2025.01.30, Framework (Arduino Core) from v3.1.0.241206 to v3.1.1.250109 and IDF to 5.3.2 (#22792) +- Allow negative values for AdcParam/AdcGpio INPUT, TEMP and RANGE parameters (#22809) +- GPIOViewer from v1.5.9 to v1.6.0 (No functional change) +- ESP32 Platform from 2025.01.30 to 2025.01.31 (#22832) +- Berry `gpio.pin_mode` frees PWM on pin +- GPIOViewer from v1.6.0 to v1.6.1 (No functional change) +- Berry callback now passes 5 arguments instead of 4 (in line with documentation) (#22908) + +### Fixed +- Sonoff SPM `PowerOnState` overrules `SSPMPowerOnState` in mixed 4Relay setup with 4Relay version 1.0.0 +- ESP32-Cx compilation fails on Windows (#22832) +- LoraWan decoding of Dragino LDS02 and MerryIoT DW10 (#22880) + +## [14.4.1.2] 20250110 +### Added +- Support for ESP32 Two-Wire Automotive Interface (TWAI) or Controller Area Network (CAN) busses +- Support for Senseair S88 CO2 sensor (#22733) +- ESP32 TasmotaLED change dynamically the number of pixels (#22754) +- ESP32 expand `Pixels` with reverse, height and alternate (#22755) +- Berry add light_pixels values to `tasmota.settings` (#22762) +- Berry add `bytes().appendhex()` (#22767) +- I2S AAC support for web radio (#22787) +- Berry WS2812 real-time Leds panel as app (#22788) + +### Changed +- GPIOViewer from v1.5.8 to v1.5.9 (No functional change) +- `Pixels` has backwards compatible arguments fixing #22755 (#22791) + +### Fixed +- Shutter discovery message regression from v14.4.1 (#22730) + +## [14.4.1.1] 20241231 +### Added +- Command ``SetOption163 1`` to disable display of Device name in GUI header +- Berry `animate.crenel` primitive (#22673) +- Berry scroll to Leds_matrix (#22693) +- HASPmota support for `tabview` (#22707) +- Berry bit-shift operators to `int64` (#22709) +- Berry add unicode encoding to string parsing (#22713) +- Berry `tasmota.int(v, min, max)` function (#22723) +- Berry driver for M5Stack 8encoder (#22724) +- Support for PCF85063 RTC (#22727) + +### Changed +- ESP32 disable PSRAM check (and on restart some relay toggles) with `#define DISABLE_PSRAMCHECK true` (#21266) +- TLS disable ECDSA for MQTT to ensure we don't break fingerprints after #22649 +- GPIOViewer from v1.5.6 to v1.5.8 +- HASPmota use 'roboto.ttf' for automatic sizing of default font (#22697) +- HASPmota add 'tag' attribute for free-form JSON (#22698) +- Postpone save_data during light animation when fade is Off + +### Fixed +- Berry Zigbee fix wrong attributes (#22684) +- Berry walrus operator (#22685) +- Webcam compilation with `define USE_WEBCAM` but without `define ENABLE_RTSPSERVER` (#22686) +- LVGL updated `Antiburn.tapp` (#22699) +- Matter Air Quality sensor (#22708) + ## [14.4.1] 20241215 - Release Rudolph diff --git a/CODE_OWNERS.md b/CODE_OWNERS.md index f70f2b8ff..b2de285ee 100644 --- a/CODE_OWNERS.md +++ b/CODE_OWNERS.md @@ -85,10 +85,10 @@ In addition to @arendst the following code is mainly owned by: | xdrv_71_magic_switch | @barbudor | xdrv_72_pipsolar | @chefpro | xdrv_73_lora | @arendst -| xdrv_74 | +| xdrv_74_lorawan | @arendst | xdrv_75_dali | @eeak, @arendst -| xdrv_76 | -| xdrv_77 | +| xdrv_76_serial_i2c | @s-hadinger +| xdrv_77_wizmote | @arendst | xdrv_78 | | xdrv_79_esp32_ble | @staars, @btsimonh | xdrv_81_esp32_webcam | @gemu, @philrich @@ -230,6 +230,7 @@ In addition to @arendst the following code is mainly owned by: | xsns_113_hc8 | Daniel Maier | xsns_114_amsx915 | Bastian Urschel | xsns_115_wooliis | Luca Melette +| xsns_117_c8_co2_5k | @jeroenvermeulen | | | xsns_127_esp32_sensors | @arendst | | diff --git a/I2CDEVICES.md b/I2CDEVICES.md index 79a2bf81a..616d3aa56 100644 --- a/I2CDEVICES.md +++ b/I2CDEVICES.md @@ -129,5 +129,6 @@ Index | Define | Driver | Device | Address(es) | Bus2 | Descrip 89 | USE_HX711_M5SCALES | xsns_34 | M5SCALES | 0x26 | Yes | M5Unit (Mini)Scales(HX711 STM32) U177 90 | USE_RX8010 | xdrv_56 | RX8010 | 0x32 | Yes | RX8010 RTC from IOTTIMER 91 | USE_MS5837 | xsns_116 | MS5837 | 0x76 | | Pressure and temperature sensor + 92 | USE_PCF85063 | xdrv_56 | PCF85063 | 0x51 | | PCF85063 Real time clock NOTE: Bus2 supported on ESP32 only. diff --git a/MODULES.md b/MODULES.md index f82f7b465..faee0a801 100644 --- a/MODULES.md +++ b/MODULES.md @@ -94,4 +94,4 @@ Module | LCode | Description 06 TTGO Watch | x | TTGO Watch 07 M5Stack Core2 | x | M5Stack Core2 -Over 2500 additional devices are supported using [templates](TEMPLATES.md). +Over 2800 additional devices are supported using [templates](TEMPLATES.md). diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f0d398490..ad58b44cb 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -36,9 +36,9 @@ While fallback or downgrading is common practice it was never supported due to S This release will be supported from ESP8266/Arduino library Core version **2.7.8** due to reported security and stability issues on previous Core version. This will also support gzipped binaries. -This release will be supported from ESP32/Arduino library Core version **v3.1.0.241206**. +This release will be supported from ESP32/Arduino library Core version **v3.1.1.250203**. -Support of ESP8266 Core versions before 2.7.8 and ESP32 Core versions before v3.1.0.241206 have been removed. +Support of ESP8266 Core versions before 2.7.8 and ESP32 Core versions before v3.1.1.250203 have been removed. ## Support of TLS @@ -75,12 +75,12 @@ Latest released binaries can be downloaded from - http://ota.tasmota.com/tasmota/release Historical binaries can be downloaded from -- http://ota.tasmota.com/tasmota/release-14.4.1 +- http://ota.tasmota.com/tasmota/release-14.5.0 The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz`` ### ESP32, ESP32-C2, ESP32-C3, ESP32-C6, ESP32-S2 and ESP32-S3 based -The following binary downloads have been compiled with ESP32/Arduino library core version **v3.1.0.241206**. +The following binary downloads have been compiled with ESP32/Arduino library core version **v3.1.1.250203**. - **tasmota32.bin** = The Tasmota version with most drivers including additional sensors and KNX for 4M+ flash. **RECOMMENDED RELEASE BINARY** - **tasmota32solo1.bin** = The Tasmota version with most drivers including additional sensors and KNX for single core ESP32 and 4M+ flash. @@ -104,7 +104,7 @@ Latest released binaries can be downloaded from - https://ota.tasmota.com/tasmota32/release Historical binaries can be downloaded from -- https://ota.tasmota.com/tasmota32/release-14.4.1 +- https://ota.tasmota.com/tasmota32/release-14.5.0 The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasmota.com/tasmota32/release/tasmota32.bin`` @@ -114,99 +114,73 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm [Complete list](BUILDS.md) of available feature and sensors. -## Changelog v14.4.1 Rudolph +## Changelog v14.5.0 Ruth ### Added -- MCP23XXX_DRV control register IOCON in template [#22622](https://github.com/arendst/Tasmota/issues/22622) -- ESP32 support for TLS ECDSA [#22649](https://github.com/arendst/Tasmota/issues/22649) +- Command `SetOption163 1` to disable display of Device name in GUI header +- Command `FileLog 0..4` to enable logging to filesystem using up to 16 rotating log files of 100kB (`#define FILE_LOG_SIZE 100`) +- Command `FileLog 10..14` to enable logging to filesystem using up to 16 log files of 100kB (`#define FILE_LOG_SIZE 100`) +- Command I2sLoop [#22807](https://github.com/arendst/Tasmota/issues/22807) +- Support for Lithuanian language translations by zzdovydas [#22971](https://github.com/arendst/Tasmota/issues/22971) +- Support for PCF85063 RTC [#22727](https://github.com/arendst/Tasmota/issues/22727) +- Support for Senseair S88 CO2 sensor [#22733](https://github.com/arendst/Tasmota/issues/22733) +- Support for C8-CO2-5K CO2 sensor [#22905](https://github.com/arendst/Tasmota/issues/22905) +- Support for ESP32 Two-Wire Automotive Interface (TWAI) or Controller Area Network (CAN) busses +- `#define FIX_JSON_HEXADECIMAL` to change JSON hexadecimal value "FF5F78" into "0xFF5F78" [#22919](https://github.com/arendst/Tasmota/issues/22919) +- Support for RC-switch decoding of 64-bit received data +- Support for WiZ Smart Remote using `#define USE_WIZMOTE` and command `SetOption164 1` +- `MqttTLS` field in `Status 6` to indicate if the MQTT connection is encrypted [#22995](https://github.com/arendst/Tasmota/issues/22995) +- Formatter `%_U` for `ext_snprintf_P()` to print uint64_t variable as decimal equivalent to `%llu` +- GPS driver select baudrate using GPIO GPS_RX1 (9600bps), GPS_RX2 (19200bps) or GPS_RX3 (38400bps) [#22869](https://github.com/arendst/Tasmota/issues/22869) +- I2S AAC support for web radio [#22787](https://github.com/arendst/Tasmota/issues/22787) +- I2S Opus stream and file support for opus/aac [#22795](https://github.com/arendst/Tasmota/issues/22795) +- ESP32 command `PixelType` to change the WS2812 color order and channel number [#22876](https://github.com/arendst/Tasmota/issues/22876) +- ESP32 TasmotaLED change dynamically the number of pixels [#22754](https://github.com/arendst/Tasmota/issues/22754) +- ESP32 expand `Pixels` with reverse, height and alternate [#22755](https://github.com/arendst/Tasmota/issues/22755) +- Display template for Waveshare ESP32-C6 LCD 1.47 [#22863](https://github.com/arendst/Tasmota/issues/22863) +- Berry `animate.crenel` primitive [#22673](https://github.com/arendst/Tasmota/issues/22673) +- Berry `tasmota.int(v, min, max)` function [#22723](https://github.com/arendst/Tasmota/issues/22723) +- Berry `bytes().appendhex()` [#22767](https://github.com/arendst/Tasmota/issues/22767) +- Berry `serial.read()` read only `n` bytes [#22835](https://github.com/arendst/Tasmota/issues/22835) +- Berry `tasmota.global.tele_period` and `tasmota.settings.tele_period` [#22865](https://github.com/arendst/Tasmota/issues/22865) +- Berry `tasmota.settings` entries for PixelType [#22912](https://github.com/arendst/Tasmota/issues/22912) +- Berry `tasmota.add_rule_once` and auto-remove rules with same pattern and id [#22900](https://github.com/arendst/Tasmota/issues/22900) +- Berry driver for M5Stack 8encoder [#22724](https://github.com/arendst/Tasmota/issues/22724) +- Berry driver for AXP2102 and M5CoreS3 [#22878](https://github.com/arendst/Tasmota/issues/22878) +- Berry driver for PN532 NFC/Mifare reader [#22899](https://github.com/arendst/Tasmota/issues/22899) +- Berry example for HeatFan WiFi Controller +- Berry WS2812 real-time Leds panel as app [#22788](https://github.com/arendst/Tasmota/issues/22788) +- Berry scroll to Leds_matrix [#22693](https://github.com/arendst/Tasmota/issues/22693) +- Berry unicode encoding to string parsing [#22713](https://github.com/arendst/Tasmota/issues/22713) +- Berry light_pixels values to `tasmota.settings` [#22762](https://github.com/arendst/Tasmota/issues/22762) +- Berry `tasmota.defer()` [#22976](https://github.com/arendst/Tasmota/issues/22976) +- Berry `bytes().appendb64()` [#22767](https://github.com/arendst/Tasmota/issues/22767) +- LVLG/HASPmota add color names from OpenHASP [#22879](https://github.com/arendst/Tasmota/issues/22879) +- LVGL `lv.set_paint_cb()` to register a callback when screen is refreshed [#22909](https://github.com/arendst/Tasmota/issues/22909) +- HASPmota support for `buttonmatrix` events [#22898](https://github.com/arendst/Tasmota/issues/22898) ### Changed -- Display removed PWM control of backlight GPIO regression from v14.1.0 -- SSL clean up remnants of old fingerprint algorithm [#22645](https://github.com/arendst/Tasmota/issues/22645) -- Berry make Leds animate calls reentrant [#22643](https://github.com/arendst/Tasmota/issues/22643) +- ESP32 Platform from 2024.12.30 to 2025.02.30, Framework (Arduino Core) from v3.1.0.241206 to v3.1.1.250203 and IDF to 5.3.2 [#22943](https://github.com/arendst/Tasmota/issues/22943) +- GPIOViewer from v1.5.6 to v1.6.1 (No functional change) +- Postpone save_data during light animation when fade is Off +- Allow negative values for AdcParam/AdcGpio INPUT, TEMP and RANGE parameters [#22809](https://github.com/arendst/Tasmota/issues/22809) +- Command `Pixels` has backwards compatible arguments fixing #22755 [#22791](https://github.com/arendst/Tasmota/issues/22791) +- ESP32 disable PSRAM check (and on restart some relay toggles) with `#define DISABLE_PSRAMCHECK true` [#21266](https://github.com/arendst/Tasmota/issues/21266) +- Berry `gpio.pin_mode` frees PWM on pin +- Berry bit-shift operators to `int64` [#22709](https://github.com/arendst/Tasmota/issues/22709) +- Berry callback now passes 5 arguments instead of 4 (in line with documentation) [#22908](https://github.com/arendst/Tasmota/issues/22908) +- HASPmota use 'roboto.ttf' for automatic sizing of default font [#22697](https://github.com/arendst/Tasmota/issues/22697) +- HASPmota add 'tag' attribute for free-form JSON [#22698](https://github.com/arendst/Tasmota/issues/22698) +- HASPmota support for `tabview` [#22707](https://github.com/arendst/Tasmota/issues/22707) ### Fixed -- Display DisplayMode adds a display device while not configured -- GUI display power button regression from v14.3.0.5 [#15788](https://github.com/arendst/Tasmota/issues/15788) -- MCP23xxx, PCF8574 and Shift595 power control when a display is configured regression from v14.3.0.7 -- ESP32 rules operation priority regression from v13.3.0.4 [#22636](https://github.com/arendst/Tasmota/issues/22636) - -## Changelog v14.4.0 Rudolph -### Added -- Command `WebColor20` to control color of Button when Off -- Command `SetOption161 1` to disable display of state text [#22515](https://github.com/arendst/Tasmota/issues/22515) -- Command `SetOption162 1` to disable adding export energy to energy today [#22578](https://github.com/arendst/Tasmota/issues/22578) -- DALI support for short addresses (gear) and groups -- DALI command `DaliGear` to set max found gear to speed up scan response -- DALI command `DaliGroup` to add gear to groups -- DALI command `DaliTarget` to set light control broadcast, group number or gear number -- DALI command `DaliGroupSliders 0..16` to show GUI group sliders with feedback disabling `DaliLight` -- DALI inverted signal configuration using GPIO DALI RX_i/TX_i -- Support for I2C over Serial [#22444](https://github.com/arendst/Tasmota/issues/22444) -- Support KNX for scripts [#22429](https://github.com/arendst/Tasmota/issues/22429) -- Support deep sleep (standby) for VL53L0X [#22441](https://github.com/arendst/Tasmota/issues/22441) -- Support for Shelly DALI Dimmer Gen3 -- Support for HLK-LD2410S 24GHz smart wave motion sensor [#22253](https://github.com/arendst/Tasmota/issues/22253) -- Support for US AQI and EPA AQI in PMS5003x sensors [#22294](https://github.com/arendst/Tasmota/issues/22294) -- Support for MS5837 pressure and temperature sensor [#22376](https://github.com/arendst/Tasmota/issues/22376) -- Support for TM1640 based IoTTimer by Stefan Oskamp [#21376](https://github.com/arendst/Tasmota/issues/21376) -- Support for Sonoff POWCT Energy Export Active [#22596](https://github.com/arendst/Tasmota/issues/22596) -- HLK-LD2410 Engineering mode [#21880](https://github.com/arendst/Tasmota/issues/21880) -- Mitsubishi Electric HVAC Operation time for MiElHVAC [#22334](https://github.com/arendst/Tasmota/issues/22334) -- Mitsubishi Electric HVAC Outdoor Temperature for MiElHVAC [#22345](https://github.com/arendst/Tasmota/issues/22345) -- Mitsubishi Electric HVAC Compressor Frequency for MiElHVAC [#22347](https://github.com/arendst/Tasmota/issues/22347) -- Mitsubishi Electric HVAC Auto Clear Remote Temp for MiElHVAC [#22370](https://github.com/arendst/Tasmota/issues/22370) -- SolaxX1 Meter mode [#22330](https://github.com/arendst/Tasmota/issues/22330) -- Show Active Power Total with any multi-phase energy monitoring [#22579](https://github.com/arendst/Tasmota/issues/22579) -- ESP32 support for WPA2/3 Enterprise conditional in core v3.1.0.241206 [#22600](https://github.com/arendst/Tasmota/issues/22600) -- ESP32 ULP lp_core to Berry ULP module (#22567)[#22567](https://github.com/arendst/Tasmota/issues/22567) -- ESP32 new BLE filters by name and minimum RSSI [#22530](https://github.com/arendst/Tasmota/issues/22530) -- ESP32 Hybrid compile take custom boards settings in account [#22542](https://github.com/arendst/Tasmota/issues/22542) -- ESP32 MI32 legacy add config operations [#22458](https://github.com/arendst/Tasmota/issues/22458) -- BLE track devices with RPA [#22300](https://github.com/arendst/Tasmota/issues/22300) -- Berry add I2C read16/write16 supporting Little Endian [#22448](https://github.com/arendst/Tasmota/issues/22448) -- Berry drivers for PCA9535 (generic and in SenseCAP D1) [#22451](https://github.com/arendst/Tasmota/issues/22451) -- HASPmota `haspmota.get_pages()` to get the sorted list of pages [#22358](https://github.com/arendst/Tasmota/issues/22358) - -### Breaking Changed -- ESP32 ArtNet switches from GRB to RGB encoding [#22556](https://github.com/arendst/Tasmota/issues/22556) - -### Changed -- ESP32 Platform from 2024.09.30 to 2024.12.30, Framework (Arduino Core) from v3.1.0.240926 to v3.1.0.241206 and IDF to 5.3.2 [#22600](https://github.com/arendst/Tasmota/issues/22600) -- ESP32 LVGL library from v9.2.0 to v9.2.2 [#22385](https://github.com/arendst/Tasmota/issues/22385) -- ESP32 replaced NeoPixelBus with TasmotaLED [#22556](https://github.com/arendst/Tasmota/issues/22556) -- Redesign GUI adding feedback to buttons, shutters and lights -- Add GUI submenu headers and refresh configuration button text (#22592) -- Use command `WebButton1` to change GUI shutter 1 name -- RG-15 sensor name from RG-15 to RG15 [#22612](https://github.com/arendst/Tasmota/issues/22612) -- Unit (k)VAr(h) to (k)var(h) [#22435](https://github.com/arendst/Tasmota/issues/22435) -- AHT1X/AHT2X/AHT3X ready for virtual I2C [#22427](https://github.com/arendst/Tasmota/issues/22427) -- SGP4X ready for virtual I2C [#22427](https://github.com/arendst/Tasmota/issues/22427) -- SCD40 reduce logging levels [#22443](https://github.com/arendst/Tasmota/issues/22443) -- SCD40 ready for virtual I2C [#22443](https://github.com/arendst/Tasmota/issues/22443) -- Refactored `i2c_enabled` as array [#22387](https://github.com/arendst/Tasmota/issues/22387) -- DALI renamed commands `DaliCommission` to `DaliScan` and `DaliWeb` to `DaliLight` -- DALI set Tasmota light control as default -- Shutter optimized behavior to publish shutter data with sensor request [#22353](https://github.com/arendst/Tasmota/issues/22353) -- Prevent active BLE operations with unencrypted MI-format beacons [#22453](https://github.com/arendst/Tasmota/issues/22453) -- ESP32 max number of supported switches/buttons/relays from 28 to 32 -- ESP32 max number of interlocks from 14 to 16 -- HASPmota support for page delete and object updates [#22311](https://github.com/arendst/Tasmota/issues/22311) - -### Fixed -- FUNC_COMMAND linked list command buffer corruption by shutter driver -- Shift595 output offsets and restart relay toggles -- Use HTML escape on File System Edit File load [#22492](https://github.com/arendst/Tasmota/issues/22492) -- Prevent crashing when `display.ini` is missing end `#` [#22471](https://github.com/arendst/Tasmota/issues/22471) -- KNX Scenes index change regression from v14.2.0.4 [#22405](https://github.com/arendst/Tasmota/issues/22405) -- Magic switch applying masking window to any power change [#22535](https://github.com/arendst/Tasmota/issues/22535) -- Shutter wrong power ON state [#22548](https://github.com/arendst/Tasmota/issues/22548) -- Alexa Hue with multiple devices [#22383](https://github.com/arendst/Tasmota/issues/22383) -- Mitsubishi Electric HVAC Standby Stage for MiElHVAC [#22430](https://github.com/arendst/Tasmota/issues/22430) -- EQ3 TRV firmware version 1.46 fails if the default true is used in subscribe on the notify characteristic [#22328](https://github.com/arendst/Tasmota/issues/22328) -- Ethernet on -DFRAMEWORK_ARDUINO_ITEAD framework regression from v14.3.0 [#22367](https://github.com/arendst/Tasmota/issues/22367) -- ESP8266 Device Group exception due to lack of stack space (#22271)[#22271](https://github.com/arendst/Tasmota/issues/22271) -- ESP32 Upgrade by file upload response based on file size [#22500](https://github.com/arendst/Tasmota/issues/22500) -- ESP32 Arduino Core IPv6 zones used by Matter [#22378](https://github.com/arendst/Tasmota/issues/22378) -- ESP32, ESP32-S2 and ESP32-S3 re-enable touch buttons [#22446](https://github.com/arendst/Tasmota/issues/22446) -- ESP32-S3 UART output mode for Tx [#22426](https://github.com/arendst/Tasmota/issues/22426) -- Matter provisioning with matter.js controller [#22470](https://github.com/arendst/Tasmota/issues/22470) +- Shutter discovery message regression from v14.4.1 [#22730](https://github.com/arendst/Tasmota/issues/22730) +- LoraWan decoding of Dragino LDS02 and MerryIoT DW10 [#22880](https://github.com/arendst/Tasmota/issues/22880) +- ESP32 TasMesh broker MAC address all zeros [#23005](https://github.com/arendst/Tasmota/issues/23005) +- ESP32-Cx compilation fails on Windows [#22832](https://github.com/arendst/Tasmota/issues/22832) +- Sonoff SPM `PowerOnState` overrules `SSPMPowerOnState` in mixed 4Relay setup with 4Relay version 1.0.0 +- Webcam compilation with `define USE_WEBCAM` but without `define ENABLE_RTSPSERVER` [#22686](https://github.com/arendst/Tasmota/issues/22686) +- Berry Zigbee fix wrong attributes [#22684](https://github.com/arendst/Tasmota/issues/22684) +- Berry walrus operator [#22685](https://github.com/arendst/Tasmota/issues/22685) +- Berry parser error in rare case [#22997](https://github.com/arendst/Tasmota/issues/22997) +- LVGL updated `Antiburn.tapp` [#22699](https://github.com/arendst/Tasmota/issues/22699) +- Matter Air Quality sensor [#22708](https://github.com/arendst/Tasmota/issues/22708) diff --git a/TEMPLATES.md b/TEMPLATES.md index 997e02d80..7116ced19 100644 --- a/TEMPLATES.md +++ b/TEMPLATES.md @@ -5,7 +5,7 @@ # Templates -Find below the available templates as of December 2024. More template information can be found in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates) +Find below the available templates as of February 2025. More template information can be found in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates) ## Adapter Board ``` @@ -186,7 +186,6 @@ LE lampUX 15W RGBCCT {"NAME":"LE lampUX 15W","GPIO":[0,0,0,0,416,419,0,0 LightZone MeLiTec {"NAME":"LightZone MeLiTec D114 Light ","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} Lohas ZN026CL10 RGBCCT {"NAME":"Lohas LED Lamp","GPIO":[0,0,0,0,417,416,0,0,419,418,420,0,0,0],"FLAG":0,"BASE":18} LOLAsmart Uranus White 70 cm {"NAME":"lola smart","GPIO":[0,0,0,1088,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} -LSC 20W 1400lm White Ambiance {"NAME":"LSC RGBCW LED","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18} Luminea 24W CCT {"NAME":"Luminea NX6205-944","GPIO":[0,0,0,0,0,0,0,0,449,0,416,0,0,0],"FLAG":0,"BASE":48} LVL 300mm Round {"NAME":"LVL 300m Round 24W Ceiling LED","GPIO":[0,0,0,0,0,416,0,0,0,449,0,0,0,0],"FLAG":0,"BASE":48} Nedis CCT 800lm {"NAME":"NEDIS WIFILAW10WT","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18} @@ -266,6 +265,9 @@ EARU DIN Circuit Breaker 2P 63/80A eWeLink White {"NAME":"RDCBC-2P","GPIO":[32, Hoch Circuit Breaker 1P {"NAME":"HOCH ZJSB9","GPIO":[32,0,0,0,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":18} Ketotek Single Phase Energy Monitor {"NAME":"Ketotek KTEM06","GPIO":[0,2272,0,2304,0,0,0,0,0,0,320,0,32,0],"FLAG":0,"BASE":54} Martin Jerry 30A Circuit Breaker {"NAME":"30A Breaker","GPIO":[0,0,0,0,7584,224,0,0,2720,32,2656,2624,320,0],"FLAG":0,"BASE":18} +Nous DIN Smart Switch 16A {"NAME":"Nous D1T","GPIO":[32,1,9312,1,1,320,1,1,9313,8160,3200,544,1,1,1,1,0,1,1,1,0,0,1,1,0,0,0,0,1,1,4736,1,1,0,0,1],"FLAG":0,"BASE":1} +Nous DIN Smart Switch 20A {"NAME":"Nous D1T","GPIO":[32,1,9312,1,1,320,1,1,9313,8160,3200,544,1,1,1,1,0,1,1,1,0,0,1,1,0,0,0,0,1,1,4736,1,1,0,0,1],"FLAG":0,"BASE":1} +Nous DIN Smart Switch 25A {"NAME":"Nous D1T","GPIO":[32,1,9312,1,1,320,1,1,9313,8160,3200,544,1,1,1,1,0,1,1,1,0,0,1,1,0,0,0,0,1,1,4736,1,1,0,0,1],"FLAG":0,"BASE":1} OpenEnergyMonitor WiFi MQTT Thermostat {"NAME":"MQTT-RELAY","GPIO":[32,0,1,0,0,224,0,0,0,0,0,0,320,0],"FLAG":0,"BASE":18} RocketController ASTRA Controller {"NAME":"ASTRA R4A4","GPIO":[1,1,1,1,576,1,1,1,480,1,1,1,3232,3200,1,1,0,640,608,1,0,224,225,1152,0,0,0,0,227,226,160,161,162,0,0,163],"FLAG":0,"BASE":1} Shelly Pro 1 {"NAME":"Shelly Pro 1","GPIO":[0,1,0,1,768,0,0,0,672,704,736,0,0,0,5600,6214,0,0,0,5568,0,0,0,0,0,0,0,0,0,0,0,32,4736,0,160,0],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,10000,10000,3350"} @@ -601,6 +603,7 @@ EBERG ROT 720 Infrared {"NAME":"Tuya MCU","GPIO":[0,2272,0,2304,0,0,0,0,0, Klarstein Bornholm Smart 2000W {"NAME":"Klarstein Bornholm","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} Kogan 1500W Panel {"NAME":"Kogan Panel Heater","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54} LSC Smart Connect 500W IR Panel {"NAME":"LSC Connect Smart IR Panel Heater","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} +Mursche 450W Infrared Heater {"NAME":"Mursche Infrared Heater","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} SmartMi Electric Air {"NAME":"ZNNFJ07ZM","GPIO":[0,0,0,0,0,0,0,0,0,0,0,0,0,3200,3232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1} ``` @@ -989,6 +992,8 @@ Merkury {"NAME":"Merkury Switch","GPIO":[0,0,0,0,32,0,0,0,0 Meross MSS620 16A IP44 {"NAME":"MSS620","GPIO":[0,320,0,320,225,0,0,0,224,576,32,0,0,0],"FLAG":0,"BASE":18} Minoston MP22W {"NAME":"Minoston MP22W","GPIO":[0,0,0,0,320,0,0,0,224,64,0,0,0,0],"FLAG":0,"BASE":18} Nedis PO120 IP44 {"NAME":"WIFIPO120FWT","GPIO":[32,0,0,0,2688,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":49} +Nous A6T Smart Socket {"NAME":"NOUS A5T","GPIO":[0,3072,544,3104,0,259,0,0,225,226,224,0,35,4704],"FLAG":1,"BASE":18} +Nous Dual Smart Socket {"NAME":"NOUS A4T","GPIO":[0,2624,0,576,2656,2720,0,0,224,225,32,0,0,0],"FLAG":0,"BASE":18} Obi Stecker IP44 {"NAME":"OBI-Outdoor-Socket2","GPIO":[0,0,0,0,224,32,0,0,576,288,1,1,1,1],"FLAG":0,"BASE":18} Oittm IP44 15A {"NAME":"Oittm Outdoor","GPIO":[576,0,320,0,2688,2656,0,0,224,2592,0,0,0,0],"FLAG":0,"BASE":57} Oittm Outdoor {"NAME":"Oittm Outdoor","GPIO":[32,0,0,0,0,0,0,0,0,0,320,224,1,0],"FLAG":0,"BASE":18} @@ -1073,6 +1078,7 @@ Arlec Twin Socket with Energy Meter {"NAME":"Arlec PC287HA","GPIO":[0,32,0,320, Athom 16A {"NAME":"Athom Power Monitoring Plug","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,1],"FLAG":0,"BASE":18} Athom 16A AU {"NAME":"Athom PG05-AU16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":1} Athom 16A AU {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18} +Athom 16A AU V3 {"NAME":"Athom Plug V3","GPIO":[0,0,0,32,0,224,576,0,0,0,0,0,0,0,0,0,0,0,0,0,3104,0],"FLAG":0,"BASE":1} Athom 16A BR V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18} Athom 16A Brazil {"NAME":"Athom PG05-BR16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":1} Athom 16A EU V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18} @@ -1082,8 +1088,10 @@ Athom 16A Italy {"NAME":"Athom PG05-IT16A","GPIO":[0,0,0,32,2720,26 Athom 16A Switzerland v2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18} Athom 16A UK {"NAME":"Athom PG04-UK16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18} Athom 16A UK V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18} +Athom 16A UK V3 {"NAME":"Athom Plug V3","GPIO":[0,0,0,32,0,224,576,0,0,0,0,0,0,0,0,0,0,0,0,0,3104,0],"FLAG":0,"BASE":1} Athom 16A US {"NAME":"Athom PG03-US16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,288,224,0,0,0],"FLAG":0,"BASE":18} Athom 16A US V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18} +Athom 16A US V3 {"NAME":"Athom Plug V3","GPIO":[0,0,0,32,0,224,576,0,0,0,0,0,0,0,0,0,0,0,0,0,3104,0],"FLAG":0,"BASE":1} Atlantis {"NAME":"Atlantis Smart Plug","GPIO":[32,0,0,0,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":18} Atomi AT1217 {"NAME":"AT1217","GPIO":[0,0,0,0,320,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Aubess 16A {"NAME":"Aubess 16A Power Monitoring Plug","GPIO":[0,32,0,0,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18} @@ -1458,6 +1466,7 @@ Nishica SM-PW701I {"NAME":"SM-PW701I","GPIO":[1,1,1,1,1,1,1,1,224,288 Nivian {"NAME":"Nivian Smart Socket","GPIO":[0,0,320,0,0,2688,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":18} Nous A1 {"NAME":"NOUS A1","GPIO":[320,0,576,0,2656,2720,0,0,2624,32,0,224,0,0],"FLAG":0,"BASE":45} Nous A1T 16A {"NAME":"NOUS A1T","GPIO":[32,0,0,0,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":49} +Nous A8T 10A {"NAME":"NOUS A8T","GPIO":[1,1,320,1,32,1,1,1,1,224,2624,1,1,1,1,1,0,1,1,1,0,1,2656,2720,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1} NX-SM112 {"NAME":"NX-SM112v3","GPIO":[0,0,0,0,2720,2656,0,0,576,32,2592,224,0,0],"FLAG":0,"BASE":45} NX-SM200 {"NAME":"NX-SM200","GPIO":[320,0,0,0,0,2720,0,0,224,32,2656,321,2624,0],"FLAG":0,"BASE":18} NX-SM210 {"NAME":"NX-SM210","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} @@ -1833,6 +1842,7 @@ ZLD64-EU-W {"NAME":"ZLD64-EU-W","GPIO":[0,320,0,32,225,224,0,0 ## Presence Sensor ``` +Athom Human Presence Sensor {"NAME":"Athom PS01 Sensor","GPIO":[32,0,0,0,640,608,0,0,161,3232,160,3200,576,0],"FLAG":0,"BASE":18} Everything Presence Lite {"NAME":"Everything Presence Lite","GPIO":[0,0,0,0,0,0,0,0,0,0,544,0,3232,3200,160,161,0,640,608,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0],"FLAG":0,"BASE":1} Everything Presence One {"NAME":"Everything Presence One","GPIO":[0,0,0,0,0,0,0,0,0,3200,3232,160,0,1,1,1,0,0,1,1,0,608,640,0,0,0,0,0,544,161,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"SO114 1 | SwitchMode1 1 | SwitchMode2 1"} Tuya mmWave {"NAME":"ZY-M100","GPIO":[1,1,1,1,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54,"CMND":"SO97 1 | TuyaMCU 99,1 | TuyaMCU 75,104"} @@ -2209,7 +2219,7 @@ Rogoei EBE-QPZ04 6.5W 450lm {"NAME":"EBE-QPZ04","GPIO":[0,0,0,0,4032,0,0,0,0,0, Saudio 7W 700lm {"NAME":"X002BU0DOL","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Sengled {"NAME":"Sengled RGBW","GPIO":[0,0,0,0,0,0,0,0,417,416,419,418,0,0],"FLAG":0,"BASE":18} Shelly Duo RGBW 5W 400lm {"NAME":"Shelly Duo RGBW","GPIO":[0,0,0,0,0,419,0,0,417,416,418,0,0,0],"FLAG":0,"BASE":18} -Shelly Duo RGBW 9W 800lm {"NAME":"Shelly Duo RGBW","GPIO":[0,0,0,0,0,419,0,0,417,416,418,0,0,0],"FLAG":0,"BASE":18} +Shelly Duo RGBW 9W 800lm {"NAME":"Shelly Duo RGBW","GPIO":[0,0,0,0,0,419,0,0,417,416,418,0,0,4736],"FLAG":0,"BASE":18,"CMND":"AdcParam 2, 32000, 1000, 3950|SetOption37 128|SetOption106 1|SetOption107 0|WebButton1 COLOR|WebButton2 WHITE|SetOption42 85|Fade ON|Speed 2|SetOption91 1|Rule1 ON POWER2#state=1 DO POWER1 OFF ENDON ON POWER1#state=1 DO POWER2 OFF ENDON ON Dimmer1#State DO POWER2 OFF ENDON ON Dimmer2#State DO POWER1 OFF ENDON|Rule1 ON"} Smart 810lm {"NAME":"OOOLED 60W RGB","GPIO":[0,0,0,0,418,419,0,0,416,0,417,0,0,4704],"FLAG":0,"BASE":18} SmartLED 9W 400lm {"NAME":"SmartLED RGBWW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Smartyfi 600lm {"NAME":"SMARTYFI 9W","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} @@ -2266,7 +2276,7 @@ Anmbest 2 Channel Inching Self-locking Switch Module {"NAME":"Generic","GPIO":[ Aptinex IOT RelayNode 4 Channel {"NAME":"APTINEX","GPIO":[0,0,1,0,0,0,0,0,224,225,226,227,0,0],"FLAG":0,"BASE":18} Armtronix Quad {"NAME":"Armtronix Wifi Four Relay Board","GPIO":[1,0,0,0,224,1,0,0,225,226,227,0,1,0],"FLAG":0,"BASE":7} Athom 1Ch Inching/Self-locking {"NAME":"Athom R01","GPIO":[1,1,1,1,1,224,1,1,1,1,1,1,576,0],"FLAG":0,"BASE":18} -Athom 8Ch Inching/Self-locking 10A {"NAME":"Athom R08","GPIO":[229,1,1,1,230,231,1,1,226,227,225,228,224,0],"FLAG":0,"BASE":18} +Athom 8Ch Inching/Self-locking 10A {"NAME":"Athom 8CH Relay Board","GPIO":[0,0,228,0,229,230,1,1,226,227,225,544,1,1152,231,0,0,0,0,0,0,33,32,224,0,0,0,0,35,34,37,36,39,0,0,38],"FLAG":0,"BASE":1} Claudy 5V {"NAME":"CLAUDY","GPIO":[0,0,225,0,0,0,0,0,0,0,0,224,0,0],"FLAG":0,"BASE":18} Devantech 8x16A {"NAME":"ESP32LR88","GPIO":[0,0,231,0,32,35,0,0,229,230,228,0,33,34,36,37,0,38,39,544,0,225,226,227,0,0,0,0,0,224,3232,3200,0,0,0,0],"FLAG":0,"BASE":1} Dingtian 16 Channel {"NAME":"Dingtian DT-R008","GPIO":[1,9408,1,9440,1,1,1,1,1,9760,9729,9856,9792,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,9824,9952,1,1,1,0,0,1],"FLAG":0,"BASE":1} @@ -2365,6 +2375,10 @@ Connex Smart Indoor {"NAME":"Connex Siren","GPIO":[0,2272,0,2304,0,0,0, NEO Coolcam Temperature and Humidity 3in1 Alarm {"NAME":"Neo Siren 3in1","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} ``` +## Smart Meter +``` +``` + ## Smoke Sensor ``` Nedis Smoke Detector {"NAME":"Nedis WIFIDS10WT","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} @@ -2636,7 +2650,7 @@ Smatrul 5A RF433MHz 4 Gang Touch {"NAME":"Smatrul RF433MHz 3 Gang Touch Switch Smatrul Infrared Sensor {"NAME":"WHS-2","GPIO":[0,0,0,160,288,0,0,0,0,224,0,0,0,0],"FLAG":0,"BASE":18,"CMND":"SwitchMode1 4 | SO13 1"} Sonoff IW101 {"NAME":"Sonoff IW101","GPIO":[32,3072,0,3104,0,0,0,0,224,544,0,0,0,0],"FLAG":0,"BASE":41} Sonoff SwitchMan M5-1C 1 Gang {"NAME":"Sonoff SwitchMan M5-1C-86","GPIO":[32,0,0,0,288,576,0,0,0,0,0,0,0,0,416,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1} -Sonoff SwitchMan M5-2C 2 Gang {"NAME":"Sonoff SwitchMan 2C","GPIO":[0,0,0,0,32,576,0,0,0,0,0,33,0,0,416,225,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1} +Sonoff SwitchMan M5-2C 2 Gang {"NAME":"Sonoff SwitchMan 2C","GPIO":[0,0,0,0,32,576,0,0,0,0,0,33,0,0,416,225,0,0,289,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,288],"FLAG":0,"BASE":1} Sonoff SwitchMan M5-3C 3 Gang {"NAME":"Sonoff M5-3C","GPIO":[33,0,0,0,32,576,0,0,0,0,0,34,0,0,416,225,0,0,226,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1} Sonoff T1 EU 1 Gang {"NAME":"Sonoff T1 1CH","GPIO":[32,1,1,1,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":28} Sonoff T1 EU 2 Gang {"NAME":"Sonoff T1 2CH","GPIO":[32,1,1,1,0,225,33,0,224,320,0,0,0,0],"FLAG":0,"BASE":29} @@ -2742,9 +2756,9 @@ ZUCZUG 3 Gang {"NAME":"2ph105626a x3","GPIO":[0,288,0,32,34,33,0, AGL Módulo Relé 01 Canal {"NAME":"AGL-Basic","GPIO":[0,1,0,0,224,32,0,0,0,0,320,0,0,0],"FLAG":0,"BASE":18} Albohes 2 Channel {"NAME":"Albohes SH-08","GPIO":[0,3200,33,3232,321,320,0,0,224,544,32,0,225,1],"FLAG":0,"BASE":18} Athom 10A {"NAME":"CB01-TAS-1","GPIO":[0,0,0,32,320,0,0,0,0,224,0,0,0,1],"FLAG":0,"BASE":18} -Athom 2Ch Inching/Self-locking {"NAME":"Athom R02","GPIO":[1,1,1,1,225,224,1,1,1,1,1,1,576,0],"FLAG":0,"BASE":18} +Athom 2Ch Inching/Self-locking {"NAME":"Athom 2CH Relay Board","GPIO":[0,0,0,0,0,0,1,1,0,0,225,544,1,1152,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,32,0,0,33],"FLAG":0,"BASE":1} Athom 3-Way Mini Relay {"NAME":"RS01-TAS-1","GPIO":[0,0,0,32,576,0,0,0,0,224,160,0,0,0],"FLAG":0,"BASE":18} -Athom 4Ch Inching/Self-locking 10A {"NAME":"Athom R04","GPIO":[1,1,1,1,32,576,1,1,226,227,225,1,224,0],"FLAG":0,"BASE":18} +Athom 4Ch Inching/Self-locking 10A {"NAME":"Athom 4CH Relay Board","GPIO":[0,0,0,0,0,0,1,1,226,227,225,544,1,1152,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,34,35,32,0,0,33],"FLAG":0,"BASE":1} Athom 4Ch Inching/Self-locking 30A {"NAME":"Athom R04-30A","GPIO":[1,1,1,1,32,576,1,1,226,227,225,1,224,0],"FLAG":0,"BASE":18} ATMS1601 230VAC DIN Timer/Switch {"NAME":"ATMS1601","GPIO":[1,1,1,1,544,320,1,1,224,32,1,1,1,1],"FLAG":0,"BASE":18} Aubess Power Monitor Switch 16A {"NAME":"Aubess with (BL0942)","GPIO":[0,3200,0,7520,0,0,0,0,160,0,224,0,0,0],"FLAG":0,"BASE":18} @@ -2782,8 +2796,11 @@ Moes {"NAME":"Moes MS-104B","GPIO":[0,0,32,0,480,0,0,0,1 Moes 10A {"NAME":"Moes MS-101","GPIO":[0,0,0,0,0,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Moes Mini 3 Gang 1/2 Way {"NAME":"Moes MS-104C","GPIO":[0,0,0,34,32,33,0,0,224,225,226,0,0,0],"FLAG":0,"BASE":18} Nedis 10A {"NAME":"Nedis WIFIPS10WT","GPIO":[0,0,0,0,224,0,0,0,32,321,0,288,0,0],"FLAG":0,"BASE":18} +Nous 1 Channel {"NAME":"NOUS B1T","GPIO":[544,0,1,0,32,160,1,1,224,0,0,1,1,1,0,1,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,0,0,1],"FLAG":0,"BASE":1} Nous 1 Channel Touch {"NAME":"NOUS L1T","GPIO":[544,0,1,32,0,0,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1} Nous 1/2 Channel {"NAME":"NOUS L13T Smart Switch Module","GPIO":[1,161,1,160,225,224,1,1,544,1,32,1,1,1],"FLAG":0,"BASE":18} +Nous 2 Channel {"NAME":"NOUS B2T","GPIO":[544,3200,1,8160,32,160,1,1,224,0,0,1,1,1,0,1,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,0,0,1],"FLAG":0,"BASE":1} +Nous 2 Channel / Curtain {"NAME":"NOUS B3T","GPIO":[544,3200,1,8128,32,160,1,1,224,225,0,1,1,1,161,1,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,0,0,1],"FLAG":0,"BASE":1} Nous 2 Channel Touch {"NAME":"NOUS L2T","GPIO":[544,289,1,32,225,33,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1} Nova Digital Basic 1 MS101 {"NAME":"NovaDigBasic1","GPIO":[0,1,0,1,320,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} ONiOFF Smart Switch {"NAME":"ONOFF SmartSwitch","GPIO":[1,320,1,1,1,32,0,0,224,1,1,0,0,0],"FLAG":0,"BASE":1} @@ -2937,6 +2954,10 @@ Xenon {"NAME":"Xenon SM-PM801-K1","GPIO":[0,320,0,32,2720 Xenon 2AC 1USB {"NAME":"Xenon SM-PW801-U1","GPIO":[0,0,0,0,288,32,0,0,224,0,225,0,226,0],"FLAG":0,"BASE":18} ``` +## Wall Switch +``` +``` + ## Water Sensor ``` Nedis SmartLife Water Detector {"NAME":"Nedis WIFIDW10WT","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 51,21"} diff --git a/lib/default/Ext-printf/src/ext_printf.cpp b/lib/default/Ext-printf/src/ext_printf.cpp index 48499685c..65ff73212 100644 --- a/lib/default/Ext-printf/src/ext_printf.cpp +++ b/lib/default/Ext-printf/src/ext_printf.cpp @@ -177,6 +177,22 @@ char * ToBinary(uint32_t value, char *str, int32_t digits) { return str; } +char * U64toStr(uint64_t value, char *str) { + // str must be at least 24 bytes long + uint32_t i = 23; + str[--i] = 0; // end of string + do { + uint64_t m = value; + value /= 10; + char c = m - 10 * value; + str[--i] = c < 10 ? c + '0' : c + 'A' - 10; + } while (value); + if (i) { + memmove(str, str +i, 23 -i); + } + return str; +} + char * U64toHex(uint64_t value, char *str, uint32_t zeroleads) { // str must be at least 17 bytes long str[16] = 0; // end of string @@ -310,6 +326,7 @@ int32_t ext_vsnprintf_P(char * out_buf, size_t buf_len, const char * fmt_P, va_l } } break; + case 'B': // Pointer to SBuffer { if (cur_val < min_valid_ptr) { new_val_str = ext_invalid_mem; } @@ -326,6 +343,7 @@ int32_t ext_vsnprintf_P(char * out_buf, size_t buf_len, const char * fmt_P, va_l } } break; + // '%_b' outputs a uint32_t to binary // '%8_b' outputs a uint8_t to binary case 'b': // Binary, decimals indicates the zero prefill @@ -416,6 +434,7 @@ int32_t ext_vsnprintf_P(char * out_buf, size_t buf_len, const char * fmt_P, va_l } } break; + // '%_X' outputs a 64 bits unsigned int to uppercase HEX with 16 digits case 'X': // input is `uint64_t*`, printed as 16 hex digits (no prefix 0x) { @@ -429,6 +448,20 @@ int32_t ext_vsnprintf_P(char * out_buf, size_t buf_len, const char * fmt_P, va_l } } break; + + // '%_U' outputs a 64 bits unsigned int to decimal + case 'U': // input is `uint64_t*`, printed as decimal + { + if (cur_val < min_valid_ptr) { new_val_str = ext_invalid_mem; } + else { + U64toStr(*(uint64_t*)cur_val, hex); + new_val_str = copyStr(hex); + if (new_val_str == nullptr) { goto free_allocs; } + allocs[alloc_idx++] = new_val_str; + } + } + break; + } *cur_val_ptr = new_val_str; *fmt = 's'; // replace `%_X` with `%0s` to display a string instead diff --git a/lib/default/Ext-printf/test/test_ext_printf.cpp b/lib/default/Ext-printf/test/test_ext_printf.cpp index f8b7b2ff9..b58203076 100644 --- a/lib/default/Ext-printf/test/test_ext_printf.cpp +++ b/lib/default/Ext-printf/test/test_ext_printf.cpp @@ -66,11 +66,14 @@ void test_ext_snprintf_P(void) { Serial.printf("--> out=%s\n", c); ext_snprintf_P(c, sizeof(c), "Float default=%*_f, int(3)=%*_f, int(3)=%*_f, int(3)=%*_f, 6dec=%*_f", 1, &fpi, 4, &f3, -4, &f3, -4, &f31, -8, &fpi); Serial.printf("--> out=%s\n", c); - uint64_t u641 = 0x1122334455667788LL; - uint64_t u642 = 0x0123456789ABCDEFLL; - uint64_t u643 = 0xFEDCBA9876543210LL; + + uint64_t u641 = 0x1122334455667788LL; // 1234605616436508552 + uint64_t u642 = 0x0123456789ABCDEFLL; // 81985529216486895 + uint64_t u643 = 0xFEDCBA9876543210LL; // 18364758544493064720 ext_snprintf_P(c, sizeof(c), "Int64 0x%_X 0x%_X 0x%_X", &u641, &u642, &u643); Serial.printf("--> out=%s\n", c); + ext_snprintf_P(c, sizeof(c), "Int64 decimal %_U %_U %_U", &u641, &u642, &u643); + Serial.printf("--> out=%s\n", c); // ext_snprintf_P(c, sizeof(c), "Float default=%*_f, int(3)=%*_f, int(3)=%*_f, int(3)=%*_f, 6dec=%*_f", &fpi, &f3, &f3, &f31, &fpi); diff --git a/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.cpp b/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.cpp index 119b6d149..242aa5a99 100644 --- a/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.cpp +++ b/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.cpp @@ -172,10 +172,13 @@ void TasmotaSerial::Esp32Begin(void) { // At 19200, 120 chars are ~60ms // At 76800, 120 chars are ~15ms uart_set_rx_full_threshold(m_uart, 120); - } else { + } else if (m_speed == 115200) { // At 115200, 256 chars are ~20ms // Zigbee requires to keep frames together, i.e. 256 bytes max uart_set_rx_full_threshold(m_uart, 256); + } else { + // At even higher speeds set 75% of the buffer + uart_set_rx_full_threshold(m_uart, serial_buffer_size * 3 / 4); } // For bitrate below 115200, set the Rx time out to 6 chars instead of the default 10 if (m_speed < 115200) { diff --git a/lib/lib_audio/ESP8266Audio/src/AudioGeneratorAAC.cpp b/lib/lib_audio/ESP8266Audio/src/AudioGeneratorAAC.cpp index c7568676a..9b30aefd9 100644 --- a/lib/lib_audio/ESP8266Audio/src/AudioGeneratorAAC.cpp +++ b/lib/lib_audio/ESP8266Audio/src/AudioGeneratorAAC.cpp @@ -18,7 +18,7 @@ along with this program. If not, see . */ -#pragma GCC optimize ("O3") +#pragma GCC optimize ("Os") #include "AudioGeneratorAAC.h" diff --git a/lib/lib_audio/ESP8266Audio/src/libhelix-aac/aaccommon.h b/lib/lib_audio/ESP8266Audio/src/libhelix-aac/aaccommon.h index 804337cd0..ca32837b2 100644 --- a/lib/lib_audio/ESP8266Audio/src/libhelix-aac/aaccommon.h +++ b/lib/lib_audio/ESP8266Audio/src/libhelix-aac/aaccommon.h @@ -54,7 +54,7 @@ #define AAC_ENABLE_SBR 1 #endif -#pragma GCC optimize ("O3") +#pragma GCC optimize ("Os") #include "aacdec.h" #include "statname.h" diff --git a/lib/lib_audio/ESP8266Audio/src/libopus/celt/celt_decoder.c b/lib/lib_audio/ESP8266Audio/src/libopus/celt/celt_decoder.c index 7e7296ed5..329b6f6cc 100644 --- a/lib/lib_audio/ESP8266Audio/src/libopus/celt/celt_decoder.c +++ b/lib/lib_audio/ESP8266Audio/src/libopus/celt/celt_decoder.c @@ -482,7 +482,7 @@ static int celt_plc_pitch_search(celt_sig *decode_mem[2], int C, int arch) int pitch_index; VARDECL( opus_val16, lp_pitch_buf ); SAVE_STACK; - opus_val16 *lp_pitch_buf = (opus_val16*)malloc((DECODE_BUFFER_SIZE>>1) * sizeof(opus_val16)); //ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 ); + ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 ); pitch_downsample(decode_mem, lp_pitch_buf, DECODE_BUFFER_SIZE, C, arch); pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf, @@ -490,7 +490,6 @@ static int celt_plc_pitch_search(celt_sig *decode_mem[2], int C, int arch) PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index, arch); pitch_index = PLC_PITCH_LAG_MAX-pitch_index; RESTORE_STACK; - free(lp_pitch_buf); return pitch_index; } diff --git a/lib/lib_audio/ESP8266Audio/src/libopus/config.h b/lib/lib_audio/ESP8266Audio/src/libopus/config.h index dc1ee1e98..52bcb1667 100644 --- a/lib/lib_audio/ESP8266Audio/src/libopus/config.h +++ b/lib/lib_audio/ESP8266Audio/src/libopus/config.h @@ -207,4 +207,3 @@ # define __restrict__ #endif -#include diff --git a/lib/lib_audio/ESP8266Audio/src/libopus/opus_defines.h b/lib/lib_audio/ESP8266Audio/src/libopus/opus_defines.h index d141418b2..f3c38c663 100644 --- a/lib/lib_audio/ESP8266Audio/src/libopus/opus_defines.h +++ b/lib/lib_audio/ESP8266Audio/src/libopus/opus_defines.h @@ -171,7 +171,7 @@ extern "C" { #define OPUS_GET_IN_DTX_REQUEST 4049 /** Defines for the presence of extended APIs. */ -#define OPUS_HAVE_OPUS_PROJECTION_H +// #define OPUS_HAVE_OPUS_PROJECTION_H /* Macros to trigger compilation errors when the wrong types are provided to a CTL */ #define __opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x)) diff --git a/lib/lib_audio/ESP8266Audio/src/libopus/repacketizer.c b/lib/lib_audio/ESP8266Audio/src/libopus/repacketizer.c index 36732293f..5a1eb675e 100644 --- a/lib/lib_audio/ESP8266Audio/src/libopus/repacketizer.c +++ b/lib/lib_audio/ESP8266Audio/src/libopus/repacketizer.c @@ -239,30 +239,21 @@ opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len) { - OpusRepacketizer *rp = (OpusRepacketizer*)malloc(sizeof(OpusRepacketizer)); + OpusRepacketizer rp; opus_int32 ret; - if (len < 1) { - free(rp); + if (len < 1) return OPUS_BAD_ARG; - } - if (len==new_len) { - free(rp); + if (len==new_len) return OPUS_OK; - } - else if (len > new_len) { - free(rp); + else if (len > new_len) return OPUS_BAD_ARG; - } - opus_repacketizer_init(rp); + opus_repacketizer_init(&rp); /* Moving payload to the end of the packet so we can do in-place padding */ OPUS_MOVE(data+new_len-len, data, len); - ret = opus_repacketizer_cat(rp, data+new_len-len, len); - if (ret != OPUS_OK) { - free(rp); + ret = opus_repacketizer_cat(&rp, data+new_len-len, len); + if (ret != OPUS_OK) return ret; - } - ret = opus_repacketizer_out_range_impl(rp, 0, rp->nb_frames, data, new_len, 0, 1); - free(rp); + ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, data, new_len, 0, 1); if (ret > 0) return OPUS_OK; else @@ -271,20 +262,15 @@ int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len) opus_int32 opus_packet_unpad(unsigned char *data, opus_int32 len) { - OpusRepacketizer *rp = (OpusRepacketizer*)malloc(sizeof(OpusRepacketizer)); + OpusRepacketizer rp; opus_int32 ret; - if (len < 1) { - free(rp); + if (len < 1) return OPUS_BAD_ARG; - } - opus_repacketizer_init(rp); - ret = opus_repacketizer_cat(rp, data, len); - if (ret < 0) { - free(rp); + opus_repacketizer_init(&rp); + ret = opus_repacketizer_cat(&rp, data, len); + if (ret < 0) return ret; - } - ret = opus_repacketizer_out_range_impl(rp, 0, rp->nb_frames, data, len, 0, 0); - free(rp); + ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, data, len, 0, 0); celt_assert(ret > 0 && ret <= len); return ret; } @@ -326,14 +312,12 @@ opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, in unsigned char toc; opus_int16 size[48]; opus_int32 packet_offset; - OpusRepacketizer *rp = (OpusRepacketizer*)malloc(sizeof(OpusRepacketizer)); + OpusRepacketizer rp; unsigned char *dst; opus_int32 dst_len; - if (len < 1){ - free(rp); + if (len < 1) return OPUS_BAD_ARG; - } dst = data; dst_len = 0; /* Unpad all frames */ @@ -341,34 +325,25 @@ opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, in { opus_int32 ret; int self_delimited = s!=nb_streams-1; - if (len<=0) { - free(rp); + if (len<=0) return OPUS_INVALID_PACKET; - } - opus_repacketizer_init(rp); + opus_repacketizer_init(&rp); ret = opus_packet_parse_impl(data, len, self_delimited, &toc, NULL, size, NULL, &packet_offset); - if (ret<0) { - free(rp); + if (ret<0) return ret; - } - ret = opus_repacketizer_cat_impl(rp, data, packet_offset, self_delimited); - if (ret < 0) { - free(rp); + ret = opus_repacketizer_cat_impl(&rp, data, packet_offset, self_delimited); + if (ret < 0) return ret; - } - ret = opus_repacketizer_out_range_impl(rp, 0, rp->nb_frames, dst, len, self_delimited, 0); - if (ret < 0) { - free(rp); + ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, dst, len, self_delimited, 0); + if (ret < 0) return ret; - } else dst_len += ret; dst += ret; data += packet_offset; len -= packet_offset; } - free(rp); return dst_len; } diff --git a/lib/lib_audio/ESP8266Audio/src/libopus/silk/NLSF2A.c b/lib/lib_audio/ESP8266Audio/src/libopus/silk/NLSF2A.c index 2b3e3340d..40718e7a8 100644 --- a/lib/lib_audio/ESP8266Audio/src/libopus/silk/NLSF2A.c +++ b/lib/lib_audio/ESP8266Audio/src/libopus/silk/NLSF2A.c @@ -80,11 +80,10 @@ void silk_NLSF2A( }; const unsigned char *ordering; opus_int k, i, dd; - opus_int32 *cos_LSF_QA = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC ); - opus_int32 *P = (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC / 2 + 1)); - opus_int32 *Q= (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC / 2 + 1)); + opus_int32 cos_LSF_QA[ SILK_MAX_ORDER_LPC ]; + opus_int32 P[ SILK_MAX_ORDER_LPC / 2 + 1 ], Q[ SILK_MAX_ORDER_LPC / 2 + 1 ]; opus_int32 Ptmp, Qtmp, f_int, f_frac, cos_val, delta; - opus_int32 *a32_QA1 = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC ); + opus_int32 a32_QA1[ SILK_MAX_ORDER_LPC ]; silk_assert( LSF_COS_TAB_SZ_FIX == 128 ); celt_assert( d==10 || d==16 ); @@ -138,9 +137,5 @@ void silk_NLSF2A( a_Q12[ k ] = (opus_int16)silk_RSHIFT_ROUND( a32_QA1[ k ], QA + 1 - 12 ); /* QA+1 -> Q12 */ } } - free(cos_LSF_QA); - free(P); - free(Q); - free(a32_QA1); } diff --git a/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/burg_modified_FIX.c b/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/burg_modified_FIX.c index dd7862983..b4a31d605 100644 --- a/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/burg_modified_FIX.c +++ b/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/burg_modified_FIX.c @@ -57,12 +57,12 @@ void silk_burg_modified_c( opus_int k, n, s, lz, rshifts, reached_max_gain; opus_int32 C0, num, nrg, rc_Q31, invGain_Q30, Atmp_QA, Atmp1, tmp1, tmp2, x1, x2; const opus_int16 *x_ptr; - opus_int32 *C_first_row = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC); - opus_int32 *C_last_row = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC); - opus_int32 *Af_QA = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC); - opus_int32 *CAf = (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC+1)); - opus_int32 *CAb = (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC+1)); - opus_int32 *xcorr = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC); + opus_int32 C_first_row[ SILK_MAX_ORDER_LPC ]; + opus_int32 C_last_row[ SILK_MAX_ORDER_LPC ]; + opus_int32 Af_QA[ SILK_MAX_ORDER_LPC ]; + opus_int32 CAf[ SILK_MAX_ORDER_LPC + 1 ]; + opus_int32 CAb[ SILK_MAX_ORDER_LPC + 1 ]; + opus_int32 xcorr[ SILK_MAX_ORDER_LPC ]; opus_int64 C0_64; celt_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE ); @@ -277,10 +277,4 @@ void silk_burg_modified_c( *res_nrg = silk_SMLAWW( nrg, silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ), -tmp1 );/* Q( -rshifts ) */ *res_nrg_Q = -rshifts; } - free(C_first_row); - free(C_last_row); - free(Af_QA); - free(CAf); - free(CAb); - free(xcorr); } diff --git a/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/warped_autocorrelation_FIX.c b/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/warped_autocorrelation_FIX.c index 9c21f2a9b..7ef3a7efc 100644 --- a/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/warped_autocorrelation_FIX.c +++ b/lib/lib_audio/ESP8266Audio/src/libopus/silk/fixed/warped_autocorrelation_FIX.c @@ -49,8 +49,8 @@ void silk_warped_autocorrelation_FIX_c( { opus_int n, i, lsh; opus_int32 tmp1_QS, tmp2_QS; - opus_int32 *state_QS = (opus_int32*)calloc(MAX_SHAPE_LPC_ORDER + 1, sizeof(opus_int32)); - opus_int64 *corr_QC = (opus_int64*)calloc(MAX_SHAPE_LPC_ORDER + 1, sizeof(opus_int64)); + opus_int32 state_QS[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; + opus_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; /* Order must be even */ celt_assert( ( order & 1 ) == 0 ); @@ -88,7 +88,5 @@ void silk_warped_autocorrelation_FIX_c( } } silk_assert( corr_QC[ 0 ] >= 0 ); /* If breaking, decrease QC*/ - free(state_QS); - free(corr_QC); } #endif /* OVERRIDE_silk_warped_autocorrelation_FIX_c */ diff --git a/lib/lib_audio/ESP8266Audio/src/libopus/silk/resampler_down2_3.c b/lib/lib_audio/ESP8266Audio/src/libopus/silk/resampler_down2_3.c index 62aab5682..d8ce95c68 100644 --- a/lib/lib_audio/ESP8266Audio/src/libopus/silk/resampler_down2_3.c +++ b/lib/lib_audio/ESP8266Audio/src/libopus/silk/resampler_down2_3.c @@ -48,8 +48,7 @@ void silk_resampler_down2_3( opus_int32 *buf_ptr; SAVE_STACK; -// ALLOC( buf, RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR, opus_int32 ); - opus_int32 *buf = (opus_int32*)malloc((RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR) * sizeof(opus_int32)); + ALLOC( buf, RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR, opus_int32 ); /* Copy buffered samples to start of buffer */ silk_memcpy( buf, S, ORDER_FIR * sizeof( opus_int32 ) ); @@ -100,6 +99,5 @@ void silk_resampler_down2_3( /* Copy last part of filtered signal to the state for the next call */ silk_memcpy( S, &buf[ nSamplesIn ], ORDER_FIR * sizeof( opus_int32 ) ); - free(buf); RESTORE_STACK; } diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/.clang-format b/lib/lib_audio/ESP8266Audio/src/libwebm/.clang-format new file mode 100644 index 000000000..e9e41bbce --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/.clang-format @@ -0,0 +1,35 @@ +--- +Language: Cpp +BasedOnStyle: Google +AlignTrailingComments: false +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false + +# A separate 'Other libraries' grouping is added before libwebm's headers for +# gtest and gmock includes. This is based on the suggested grouping in the +# Google C++ Style Guide: +# https://google.github.io/styleguide/cppguide.html#Names_and_Order_of_Includes +# The other categories come from `clang-format-14 --dump-config --style=Google`. +# See the clang-format documentation for more information on this option: +# https://clang.llvm.org/docs/ClangFormatStyleOptions.html#includecategories +IncludeCategories: + - Regex: '^' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^<.*\.h>' + Priority: 1 + SortPriority: 0 + CaseSensitive: false + - Regex: '^<.*' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^((<|")(gtest|gmock)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 4 + SortPriority: 0 + CaseSensitive: false diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/.gitattributes b/lib/lib_audio/ESP8266Audio/src/libwebm/.gitattributes new file mode 100644 index 000000000..2b5cda5f0 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/.gitattributes @@ -0,0 +1,6 @@ +*.sln eol=crlf +*.vcproj eol=crlf +*.vsprops eol=crlf +*.vcxproj eol=crlf +*.mkv -text -diff +*.webm -text -diff diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/.gitignore b/lib/lib_audio/ESP8266Audio/src/libwebm/.gitignore new file mode 100644 index 000000000..ad6fba196 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/.gitignore @@ -0,0 +1,36 @@ +*.MKV +*.a +*.cmake +*.d +*.exe +*.mkv +*.ncb +*.o +*.opensdf +*.sdf +*.so* +*.suo +*.swp +*.user +*~ +.vscode +/*.webm +CMakeCache.txt +CMakeFiles +Debug +Makefile +Release +core +dumpvtt +ipch +mkvmuxer_sample +mkvmuxer_tests +mkvparser_sample +mkvparser_tests +vp9_header_parser_tests +vp9_level_stats_tests +vttdemux +webm2pes +webm2pes_tests +webm2ts +webm_info diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/.mailmap b/lib/lib_audio/ESP8266Audio/src/libwebm/.mailmap new file mode 100644 index 000000000..63683a07b --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/.mailmap @@ -0,0 +1,6 @@ +Hui Su +Matthew Heaney +Neil Birkbeck +Patrik Carlsson +Roberto Alanis Baez +Tom Finegan diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/.pylintrc b/lib/lib_audio/ESP8266Audio/src/libwebm/.pylintrc new file mode 100644 index 000000000..4658b844b --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/.pylintrc @@ -0,0 +1,441 @@ +# This Pylint rcfile contains a best-effort configuration to uphold the +# best-practices and style described in the Google Python style guide: +# https://google.github.io/styleguide/pyguide.html +# +# Its canonical open-source location is: +# https://google.github.io/styleguide/pylintrc + +[MASTER] + +# Files or directories to be skipped. They should be base names, not paths. +ignore=third_party + +# Files or directories matching the regex patterns are skipped. The regex +# matches against base names, not paths. +ignore-patterns= + +# Pickle collected data for later comparisons. +persistent=no + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# Use multiple processes to speed up Pylint. +jobs=4 + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +confidence= + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +#enable= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +disable=abstract-method, + apply-builtin, + arguments-differ, + attribute-defined-outside-init, + backtick, + bad-option-value, + basestring-builtin, + buffer-builtin, + c-extension-no-member, + consider-using-enumerate, + cmp-builtin, + cmp-method, + coerce-builtin, + coerce-method, + delslice-method, + div-method, + duplicate-code, + eq-without-hash, + execfile-builtin, + file-builtin, + filter-builtin-not-iterating, + fixme, + getslice-method, + global-statement, + hex-method, + idiv-method, + implicit-str-concat-in-sequence, + import-error, + import-self, + import-star-module-level, + inconsistent-return-statements, + input-builtin, + intern-builtin, + invalid-str-codec, + locally-disabled, + long-builtin, + long-suffix, + map-builtin-not-iterating, + misplaced-comparison-constant, + missing-function-docstring, + metaclass-assignment, + next-method-called, + next-method-defined, + no-absolute-import, + no-else-break, + no-else-continue, + no-else-raise, + no-else-return, + no-init, # added + no-member, + no-name-in-module, + no-self-use, + nonzero-method, + oct-method, + old-division, + old-ne-operator, + old-octal-literal, + old-raise-syntax, + parameter-unpacking, + print-statement, + raising-string, + range-builtin-not-iterating, + raw_input-builtin, + rdiv-method, + reduce-builtin, + relative-import, + reload-builtin, + round-builtin, + setslice-method, + signature-differs, + standarderror-builtin, + suppressed-message, + sys-max-int, + too-few-public-methods, + too-many-ancestors, + too-many-arguments, + too-many-boolean-expressions, + too-many-branches, + too-many-instance-attributes, + too-many-locals, + too-many-nested-blocks, + too-many-public-methods, + too-many-return-statements, + too-many-statements, + trailing-newlines, + unichr-builtin, + unicode-builtin, + unnecessary-pass, + unpacking-in-except, + useless-else-on-loop, + useless-object-inheritance, + useless-suppression, + using-cmp-argument, + wrong-import-order, + xrange-builtin, + zip-builtin-not-iterating, + + +[REPORTS] + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html. You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". This option is deprecated +# and it will be removed in Pylint 2.0. +files-output=no + +# Tells whether to display a full report or only the messages +reports=no + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +#msg-template= + + +[BASIC] + +# Good variable names which should always be accepted, separated by a comma +good-names=main,_,PRESUBMIT + +# Bad variable names which should always be refused, separated by a comma +bad-names= + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +property-classes=abc.abstractproperty,cached_property.cached_property,cached_property.threaded_cached_property,cached_property.cached_property_with_ttl,cached_property.threaded_cached_property_with_ttl + +# Regular expression matching correct function names +function-rgx=^(?:(?PsetUp|tearDown|setUpModule|tearDownModule)|(?P_?[A-Z][a-zA-Z0-9]*)|(?P_?[a-z][a-z0-9_]*))$ + +# Regular expression matching correct variable names +variable-rgx=^[a-z][a-z0-9_]*$ + +# Regular expression matching correct constant names +const-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ + +# Regular expression matching correct attribute names +attr-rgx=^_{0,2}[a-z][a-z0-9_]*$ + +# Regular expression matching correct argument names +argument-rgx=^[a-z][a-z0-9_]*$ + +# Regular expression matching correct class attribute names +class-attribute-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ + +# Regular expression matching correct inline iteration names +inlinevar-rgx=^[a-z][a-z0-9_]*$ + +# Regular expression matching correct class names +class-rgx=^_?[A-Z][a-zA-Z0-9]*$ + +# Regular expression matching correct module names +module-rgx=^(_?[a-z][a-z0-9_]*|__init__)$ + +# Regular expression matching correct method names +method-rgx=(?x)^(?:(?P_[a-z0-9_]+__|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass|(test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|next)|(?P_{0,2}[A-Z][a-zA-Z0-9_]*)|(?P_{0,2}[a-z][a-z0-9_]*))$ + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=(__.*__|main|test.*|.*test|.*Test)$ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=10 + + +[TYPECHECK] + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager,contextlib2.contextmanager + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + + +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=80 + +# TODO(https://github.com/PyCQA/pylint/issues/3352): Direct pylint to exempt +# lines made too long by directives to pytype. + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=(?x)( + ^\s*(\#\ )??$| + ^\s*(from\s+\S+\s+)?import\s+.+$) + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=yes + +# List of optional constructs for which whitespace checking is disabled. `dict- +# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. +# `trailing-comma` allows a space between comma and closing bracket: (a, ). +# `empty-line` allows space-only lines. +no-space-check= + +# Maximum number of lines in a module +max-module-lines=99999 + +# String used as indentation unit. The internal Google style guide mandates 2 +# spaces. Google's externaly-published style guide says 4, consistent with +# PEP 8. Here, we use 2 spaces, for conformity with many open-sourced Google +# projects (like TensorFlow). +indent-string=' ' + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=TODO + + +[STRING] + +# This flag controls whether inconsistent-quotes generates a warning when the +# character used as a quote delimiter is used inconsistently within a module. +check-quote-consistency=yes + + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +dummy-variables-rgx=^\*{0,2}(_$|unused_|dummy_) + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_,_cb + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six,six.moves,past.builtins,future.builtins,functools + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging,absl.logging,tensorflow.io.logging + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + + +[SPELLING] + +# Spelling dictionary name. Available dictionaries: none. To make it working +# install python-enchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub, + TERMIOS, + Bastion, + rexec, + sets + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant, absl + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls, + class_ + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=StandardError, + Exception, + BaseException diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/AUTHORS.TXT b/lib/lib_audio/ESP8266Audio/src/libwebm/AUTHORS.TXT new file mode 100644 index 000000000..59b648ca6 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/AUTHORS.TXT @@ -0,0 +1,5 @@ +# Names should be added to this file like so: +# Name or Organization + +Google Inc. +Elijah Cirioli diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/CONTRIBUTING.md b/lib/lib_audio/ESP8266Audio/src/libwebm/CONTRIBUTING.md new file mode 100644 index 000000000..a30c5121f --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/CONTRIBUTING.md @@ -0,0 +1,41 @@ +# How to Contribute + +We'd love to accept your patches and contributions to this project. There are +just a few small guidelines you need to follow. + +## Contributor License Agreement + +Contributions to this project must be accompanied by a Contributor License +Agreement. You (or your employer) retain the copyright to your contribution; +this simply gives us permission to use and redistribute your contributions as +part of the project. Head over to to see +your current agreements on file or to sign a new one. + +You generally only need to submit a CLA once, so if you've already submitted one +(even if it was for a different project), you probably don't need to do it +again. + +## Code reviews + +All submissions, including submissions by project members, require review. We +use a [Gerrit](https://www.gerritcodereview.com) instance hosted at +https://chromium-review.googlesource.com for this purpose. See the +[WebM Project page](https://www.webmproject.org/code/contribute/submitting-patches/) +for additional details. + +## Code Style + +The C++ code style is based on the +[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) and +`clang-format --style=Google`. `clang-format -i --style=file` can be used to +format individual files, it will use the settings from `.clang-format`. + +CMake files are formatted with +[cmake-format](https://cmake-format.readthedocs.io/en/latest/). `cmake-format +-i` can be used to format individual files, it will use the settings from +`.cmake-format.py`. + +## Community Guidelines + +This project follows +[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/). diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/LICENSE.TXT b/lib/lib_audio/ESP8266Audio/src/libwebm/LICENSE.TXT new file mode 100644 index 000000000..7a6f99547 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/LICENSE.TXT @@ -0,0 +1,30 @@ +Copyright (c) 2010, Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/PATENTS.TXT b/lib/lib_audio/ESP8266Audio/src/libwebm/PATENTS.TXT new file mode 100644 index 000000000..caedf607e --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/PATENTS.TXT @@ -0,0 +1,23 @@ +Additional IP Rights Grant (Patents) +------------------------------------ + +"These implementations" means the copyrightable works that implement the WebM +codecs distributed by Google as part of the WebM Project. + +Google hereby grants to you a perpetual, worldwide, non-exclusive, no-charge, +royalty-free, irrevocable (except as stated in this section) patent license to +make, have made, use, offer to sell, sell, import, transfer, and otherwise +run, modify and propagate the contents of these implementations of WebM, where +such license applies only to those patent claims, both currently owned by +Google and acquired in the future, licensable by Google that are necessarily +infringed by these implementations of WebM. This grant does not include claims +that would be infringed only as a consequence of further modification of these +implementations. If you or your agent or exclusive licensee institute or order +or agree to the institution of patent litigation or any other patent +enforcement activity against any entity (including a cross-claim or +counterclaim in a lawsuit) alleging that any of these implementations of WebM +or any code incorporated within any of these implementations of WebM +constitute direct or contributory patent infringement, or inducement of +patent infringement, then any patent rights granted to you under this License +for these implementations of WebM shall terminate as of the date such +litigation is filed. diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/PRESUBMIT.py b/lib/lib_audio/ESP8266Audio/src/libwebm/PRESUBMIT.py new file mode 100644 index 000000000..58be26d48 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/PRESUBMIT.py @@ -0,0 +1,202 @@ +# Copyright (c) 2021, Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# * Neither the name of Google nor the names of its contributors may +# be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +"""Top-level presubmit script for libwebm. + +See https://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for +details on the presubmit API built into depot_tools. +""" +import re +import subprocess2 + +USE_PYTHON3 = True +_BASH_INDENTATION = "2" +_GIT_COMMIT_SUBJECT_LENGTH = 65 +_INCLUDE_BASH_FILES_ONLY = [r".*\.sh$"] +_INCLUDE_SOURCE_FILES_ONLY = [r".*\.(c|cc|[hc]pp|h)$"] +_LIBWEBM_MAX_LINE_LENGTH = 80 + + +def _CheckCommitSubjectLength(input_api, output_api): + """Ensures commit's subject length is no longer than 65 chars.""" + name = "git-commit subject" + cmd = ["git", "log", "-1", "--pretty=%s"] + start = input_api.time.time() + proc = subprocess2.Popen( + cmd, + stderr=subprocess2.PIPE, + stdout=subprocess2.PIPE, + universal_newlines=True) + + stdout, _ = proc.communicate() + duration = input_api.time.time() - start + + if not re.match(r"^Revert", + stdout) and (len(stdout) - 1) > _GIT_COMMIT_SUBJECT_LENGTH: + failure_msg = ( + "The commit subject: %s is too long (%d chars)\n" + "Try to keep this to 50 or less (up to 65 is permitted for " + "non-reverts).\n" + "https://www.git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-" + "Project#_commit_guidelines") % (stdout, len(stdout) - 1) + return output_api.PresubmitError("%s\n (%4.2fs) failed\n%s" % + (name, duration, failure_msg)) + + return output_api.PresubmitResult("%s\n (%4.2fs) success" % (name, duration)) + + +def _GetFilesToSkip(input_api): + """Skips libwebm-specific files.""" + return list(input_api.DEFAULT_FILES_TO_SKIP) + [ + r"\.pylintrc$", + ] + + +def _CheckChangeLintsClean(input_api, output_api): + """Makes sure that libwebm/ code is cpplint clean.""" + sources = lambda x: input_api.FilterSourceFile( + x, files_to_check=_INCLUDE_SOURCE_FILES_ONLY, files_to_skip=None) + return input_api.canned_checks.CheckChangeLintsClean(input_api, output_api, + sources) + + +def _RunShellCheckCmd(input_api, output_api, bash_file): + """shellcheck command wrapper.""" + cmd = ["shellcheck", "-x", "-oall", "-sbash", bash_file] + name = "Check %s file." % bash_file + start = input_api.time.time() + output, rc = subprocess2.communicate( + cmd, stdout=None, stderr=subprocess2.PIPE, universal_newlines=True) + duration = input_api.time.time() - start + if rc == 0: + return output_api.PresubmitResult("%s\n%s (%4.2fs)\n" % + (name, " ".join(cmd), duration)) + return output_api.PresubmitError("%s\n%s (%4.2fs) failed\n%s" % + (name, " ".join(cmd), duration, output[1])) + + +def _RunShfmtCheckCmd(input_api, output_api, bash_file): + """shfmt command wrapper.""" + cmd = [ + "shfmt", "-i", _BASH_INDENTATION, "-bn", "-ci", "-sr", "-kp", "-d", + bash_file + ] + name = "Check %s file." % bash_file + start = input_api.time.time() + output, rc = subprocess2.communicate( + cmd, stdout=None, stderr=subprocess2.PIPE, universal_newlines=True) + duration = input_api.time.time() - start + if rc == 0: + return output_api.PresubmitResult("%s\n%s (%4.2fs)\n" % + (name, " ".join(cmd), duration)) + return output_api.PresubmitError("%s\n%s (%4.2fs) failed\n%s" % + (name, " ".join(cmd), duration, output[1])) + + +def _RunCmdOnCheckedFiles(input_api, output_api, run_cmd, files_to_check): + """Ensure that libwebm/ files are clean.""" + file_filter = lambda x: input_api.FilterSourceFile( + x, files_to_check=files_to_check, files_to_skip=None) + + affected_files = input_api.change.AffectedFiles(file_filter=file_filter) + results = [ + run_cmd(input_api, output_api, f.AbsoluteLocalPath()) + for f in affected_files + ] + return results + + +def _CommonChecks(input_api, output_api): + results = [] + results.extend( + input_api.canned_checks.CheckChangeHasNoCrAndHasOnlyOneEol( + input_api, output_api)) + results.extend( + input_api.canned_checks.CheckChangeHasNoTabs(input_api, output_api)) + results.extend( + input_api.canned_checks.CheckChangeHasNoStrayWhitespace( + input_api, output_api)) + results.append(_CheckCommitSubjectLength(input_api, output_api)) + + source_file_filter = lambda x: input_api.FilterSourceFile( + x, files_to_skip=_GetFilesToSkip(input_api)) + results.extend( + input_api.canned_checks.CheckLongLines( + input_api, + output_api, + maxlen=_LIBWEBM_MAX_LINE_LENGTH, + source_file_filter=source_file_filter)) + + results.extend( + input_api.canned_checks.CheckPatchFormatted( + input_api, + output_api, + check_clang_format=True, + check_python=True, + result_factory=output_api.PresubmitError)) + results.extend(_CheckChangeLintsClean(input_api, output_api)) + + # Run pylint. + results.extend( + input_api.canned_checks.RunPylint( + input_api, + output_api, + files_to_skip=_GetFilesToSkip(input_api), + pylintrc=".pylintrc", + version="2.7")) + + # Binaries shellcheck and shfmt are not installed in depot_tools. + # Installation is needed + try: + subprocess2.communicate(["shellcheck", "--version"]) + results.extend( + _RunCmdOnCheckedFiles(input_api, output_api, _RunShellCheckCmd, + _INCLUDE_BASH_FILES_ONLY)) + print("shfmt") + subprocess2.communicate(["shfmt", "-version"]) + results.extend( + _RunCmdOnCheckedFiles(input_api, output_api, _RunShfmtCheckCmd, + _INCLUDE_BASH_FILES_ONLY)) + except OSError as os_error: + results.append( + output_api.PresubmitPromptWarning( + "%s\nPlease install missing binaries locally." % os_error.args[0])) + return results + + +def CheckChangeOnUpload(input_api, output_api): + results = [] + results.extend(_CommonChecks(input_api, output_api)) + return results + + +def CheckChangeOnCommit(input_api, output_api): + results = [] + results.extend(_CommonChecks(input_api, output_api)) + return results diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/README.libwebm b/lib/lib_audio/ESP8266Audio/src/libwebm/README.libwebm new file mode 100644 index 000000000..64c8111f2 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/README.libwebm @@ -0,0 +1,148 @@ +Building Libwebm + +To build libwebm you must first create project files. To do this run cmake +and pass it the path to your libwebm repo. + +Makefile.unix can be used as a fallback on systems that cmake does not +support. + + +CMake Basics + +To generate project/make files for the default toolchain on your system simply +run cmake with the path to the libwebm repo: + +$ cmake path/to/libwebm + +On Windows the above command will produce Visual Studio project files for the +newest Visual Studio detected on the system. On Mac OS X and Linux systems, the +above command will produce a makefile. + +To control what types of projects are generated the -G parameter is added to +the cmake command line. This argument must be followed by the name of a +generator. Running cmake with the --help argument will list the available +generators for your system. + +On Mac OS X you would run the following command to generate Xcode projects: + +$ cmake path/to/libwebm -G Xcode + +On a Windows box you would run the following command to generate Visual Studio +2013 projects: + +$ cmake path/to/libwebm -G "Visual Studio 12" + +To generate 64-bit Windows Visual Studio 2013 projects: + +$ cmake path/to/libwebm "Visual Studio 12 Win64" + + +CMake Makefiles: Debugging and Optimization + +Unlike Visual Studio and Xcode projects, the build configuration for make builds +is controlled when you run cmake. The following examples demonstrate various +build configurations. + +Omitting the build type produces makefiles that use build flags containing +neither optimization nor debug flags: +$ cmake path/to/libwebm + +A makefile using release (optimized) flags is produced like this: +$ cmake path/to/libwebm -DCMAKE_BUILD_TYPE=release + +A release build with debug info can be produced as well: +$ cmake path/to/libwebm -DCMAKE_BUILD_TYPE=relwithdebinfo + +And your standard debug build will be produced using: +$ cmake path/to/libwebm -DCMAKE_BUILD_TYPE=debug + + +Tests + +To enable libwebm tests add -DENABLE_TESTS=ON CMake generation command line. For +example: + +$ cmake path/to/libwebm -G Xcode -DENABLE_TESTS=ON + +Libwebm tests depend on googletest. By default googletest is expected to be a +sibling directory of the Libwebm repository. To change that, update your CMake +command to be similar to the following: + +$ cmake path/to/libwebm -G Xcode -DENABLE_TESTS=ON \ + -DGTEST_SRC_DIR=/path/to/googletest + +The tests rely upon the LIBWEBM_TEST_DATA_PATH environment variable to locate +test input. The following example demonstrates running the muxer tests from the +build directory: + +$ LIBWEBM_TEST_DATA_PATH=path/to/libwebm/testing/testdata ./mkvmuxer_tests + +Note: Libwebm Googletest integration was built with googletest from + https://github.com/google/googletest.git at git revision + ddb8012eb48bc203aa93dcc2b22c1db516302b29. + + +CMake Include-what-you-use integration + +Include-what-you-use is an analysis tool that helps ensure libwebm includes the +C/C++ header files actually in use. To enable the integration support +ENABLE_IWYU must be turned on at cmake run time: + +$ cmake path/to/libwebm -G "Unix Makefiles" -DENABLE_IWYU=ON + +This adds the iwyu target to the build. To run include-what-you-use: + +$ make iwyu + +The following requirements must be met for ENABLE_IWYU to enable the iwyu +target: + +1. include-what-you-use and iwyu_tool.py must be in your PATH. +2. A python interpreter must be on the system and available to CMake. + +The values of the following variables are used to determine if the requirements +have been met. Values to the right of the equals sign are what a successful run +might look like: + iwyu_path=/path/to/iwyu_tool.py + iwyu_tool_path=/path/to/include-what-you-use + PYTHONINTERP_FOUND=TRUE + +An empty PYTHONINTERP_FOUND, or iwyu_path/iwyu_tool_path suffixed with NOTFOUND +are failures. + +For Include-what-you-use setup instructions, see: +https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/InstructionsForUsers.md + +If, when building the iwyu target, compile errors reporting failures loading +standard include files occur, one solution can be found here: +https://github.com/include-what-you-use/include-what-you-use/issues/100 + + +CMake cross compile +To cross compile libwebm for Windows using mingw-w64 run cmake with the +following arguments: + +$ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/libwebm/build/mingw-w64_toolchain.cmake \ + path/to/libwebm + +Note1: As of this writing googletest will not build via mingw-w64 without +disabling pthreads. +googletest hash: d225acc90bc3a8c420a9bcd1f033033c1ccd7fe0 + +To build with tests when using mingw-w64 use the following arguments when +running CMake: + +$ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/libwebm/build/mingw-w64_toolchain.cmake \ + -DENABLE_TESTS=ON -Dgtest_disable_pthreads=ON path/to/libwebm + +Note2: i686-w64-mingw32 is the default compiler. This can be controlled using +the MINGW_PREFIX variable: + +$ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/libwebm/build/mingw-w64_toolchain.cmake \ + -DMINGW_PREFIX=x86_64-w64-mingw32 path/to/libwebm + +Bug reports + +Bug reports can be filed in the libwebm issue tracker: +https://issues.webmproject.org/. +For security reports, select 'Security report' from the Template dropdown. diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/codereview.settings b/lib/lib_audio/ESP8266Audio/src/libwebm/codereview.settings new file mode 100644 index 000000000..ccba2eeed --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/codereview.settings @@ -0,0 +1,4 @@ +# This file is used by git cl to get repository specific information. +GERRIT_HOST: True +CODE_REVIEW_SERVER: chromium-review.googlesource.com +GERRIT_SQUASH_UPLOADS: False diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/common/webmids.h b/lib/lib_audio/ESP8266Audio/src/libwebm/common/webmids.h new file mode 100644 index 000000000..fc0c20814 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/common/webmids.h @@ -0,0 +1,193 @@ +// Copyright (c) 2012 The WebM project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. + +#ifndef COMMON_WEBMIDS_H_ +#define COMMON_WEBMIDS_H_ + +namespace libwebm { + +enum MkvId { + kMkvEBML = 0x1A45DFA3, + kMkvEBMLVersion = 0x4286, + kMkvEBMLReadVersion = 0x42F7, + kMkvEBMLMaxIDLength = 0x42F2, + kMkvEBMLMaxSizeLength = 0x42F3, + kMkvDocType = 0x4282, + kMkvDocTypeVersion = 0x4287, + kMkvDocTypeReadVersion = 0x4285, + kMkvVoid = 0xEC, + kMkvSignatureSlot = 0x1B538667, + kMkvSignatureAlgo = 0x7E8A, + kMkvSignatureHash = 0x7E9A, + kMkvSignaturePublicKey = 0x7EA5, + kMkvSignature = 0x7EB5, + kMkvSignatureElements = 0x7E5B, + kMkvSignatureElementList = 0x7E7B, + kMkvSignedElement = 0x6532, + // segment + kMkvSegment = 0x18538067, + // Meta Seek Information + kMkvSeekHead = 0x114D9B74, + kMkvSeek = 0x4DBB, + kMkvSeekID = 0x53AB, + kMkvSeekPosition = 0x53AC, + // Segment Information + kMkvInfo = 0x1549A966, + kMkvTimecodeScale = 0x2AD7B1, + kMkvDuration = 0x4489, + kMkvDateUTC = 0x4461, + kMkvTitle = 0x7BA9, + kMkvMuxingApp = 0x4D80, + kMkvWritingApp = 0x5741, + // Cluster + kMkvCluster = 0x1F43B675, + kMkvTimecode = 0xE7, + kMkvPrevSize = 0xAB, + kMkvBlockGroup = 0xA0, + kMkvBlock = 0xA1, + kMkvBlockDuration = 0x9B, + kMkvReferenceBlock = 0xFB, + kMkvLaceNumber = 0xCC, + kMkvSimpleBlock = 0xA3, + kMkvBlockAdditions = 0x75A1, + kMkvBlockMore = 0xA6, + kMkvBlockAddID = 0xEE, + kMkvBlockAdditional = 0xA5, + kMkvDiscardPadding = 0x75A2, + // Track + kMkvTracks = 0x1654AE6B, + kMkvTrackEntry = 0xAE, + kMkvTrackNumber = 0xD7, + kMkvTrackUID = 0x73C5, + kMkvTrackType = 0x83, + kMkvFlagEnabled = 0xB9, + kMkvFlagDefault = 0x88, + kMkvFlagForced = 0x55AA, + kMkvFlagLacing = 0x9C, + kMkvDefaultDuration = 0x23E383, + kMkvMaxBlockAdditionID = 0x55EE, + kMkvName = 0x536E, + kMkvLanguage = 0x22B59C, + kMkvCodecID = 0x86, + kMkvCodecPrivate = 0x63A2, + kMkvCodecName = 0x258688, + kMkvCodecDelay = 0x56AA, + kMkvSeekPreRoll = 0x56BB, + // video + kMkvVideo = 0xE0, + kMkvFlagInterlaced = 0x9A, + kMkvStereoMode = 0x53B8, + kMkvAlphaMode = 0x53C0, + kMkvPixelWidth = 0xB0, + kMkvPixelHeight = 0xBA, + kMkvPixelCropBottom = 0x54AA, + kMkvPixelCropTop = 0x54BB, + kMkvPixelCropLeft = 0x54CC, + kMkvPixelCropRight = 0x54DD, + kMkvDisplayWidth = 0x54B0, + kMkvDisplayHeight = 0x54BA, + kMkvDisplayUnit = 0x54B2, + kMkvAspectRatioType = 0x54B3, + kMkvColourSpace = 0x2EB524, + kMkvFrameRate = 0x2383E3, + // end video + // colour + kMkvColour = 0x55B0, + kMkvMatrixCoefficients = 0x55B1, + kMkvBitsPerChannel = 0x55B2, + kMkvChromaSubsamplingHorz = 0x55B3, + kMkvChromaSubsamplingVert = 0x55B4, + kMkvCbSubsamplingHorz = 0x55B5, + kMkvCbSubsamplingVert = 0x55B6, + kMkvChromaSitingHorz = 0x55B7, + kMkvChromaSitingVert = 0x55B8, + kMkvRange = 0x55B9, + kMkvTransferCharacteristics = 0x55BA, + kMkvPrimaries = 0x55BB, + kMkvMaxCLL = 0x55BC, + kMkvMaxFALL = 0x55BD, + // mastering metadata + kMkvMasteringMetadata = 0x55D0, + kMkvPrimaryRChromaticityX = 0x55D1, + kMkvPrimaryRChromaticityY = 0x55D2, + kMkvPrimaryGChromaticityX = 0x55D3, + kMkvPrimaryGChromaticityY = 0x55D4, + kMkvPrimaryBChromaticityX = 0x55D5, + kMkvPrimaryBChromaticityY = 0x55D6, + kMkvWhitePointChromaticityX = 0x55D7, + kMkvWhitePointChromaticityY = 0x55D8, + kMkvLuminanceMax = 0x55D9, + kMkvLuminanceMin = 0x55DA, + // end mastering metadata + // end colour + // projection + kMkvProjection = 0x7670, + kMkvProjectionType = 0x7671, + kMkvProjectionPrivate = 0x7672, + kMkvProjectionPoseYaw = 0x7673, + kMkvProjectionPosePitch = 0x7674, + kMkvProjectionPoseRoll = 0x7675, + // end projection + // audio + kMkvAudio = 0xE1, + kMkvSamplingFrequency = 0xB5, + kMkvOutputSamplingFrequency = 0x78B5, + kMkvChannels = 0x9F, + kMkvBitDepth = 0x6264, + // end audio + // ContentEncodings + kMkvContentEncodings = 0x6D80, + kMkvContentEncoding = 0x6240, + kMkvContentEncodingOrder = 0x5031, + kMkvContentEncodingScope = 0x5032, + kMkvContentEncodingType = 0x5033, + kMkvContentCompression = 0x5034, + kMkvContentCompAlgo = 0x4254, + kMkvContentCompSettings = 0x4255, + kMkvContentEncryption = 0x5035, + kMkvContentEncAlgo = 0x47E1, + kMkvContentEncKeyID = 0x47E2, + kMkvContentSignature = 0x47E3, + kMkvContentSigKeyID = 0x47E4, + kMkvContentSigAlgo = 0x47E5, + kMkvContentSigHashAlgo = 0x47E6, + kMkvContentEncAESSettings = 0x47E7, + kMkvAESSettingsCipherMode = 0x47E8, + kMkvAESSettingsCipherInitData = 0x47E9, + // end ContentEncodings + // Cueing Data + kMkvCues = 0x1C53BB6B, + kMkvCuePoint = 0xBB, + kMkvCueTime = 0xB3, + kMkvCueTrackPositions = 0xB7, + kMkvCueTrack = 0xF7, + kMkvCueClusterPosition = 0xF1, + kMkvCueBlockNumber = 0x5378, + // Chapters + kMkvChapters = 0x1043A770, + kMkvEditionEntry = 0x45B9, + kMkvChapterAtom = 0xB6, + kMkvChapterUID = 0x73C4, + kMkvChapterStringUID = 0x5654, + kMkvChapterTimeStart = 0x91, + kMkvChapterTimeEnd = 0x92, + kMkvChapterDisplay = 0x80, + kMkvChapString = 0x85, + kMkvChapLanguage = 0x437C, + kMkvChapCountry = 0x437E, + // Tags + kMkvTags = 0x1254C367, + kMkvTag = 0x7373, + kMkvSimpleTag = 0x67C8, + kMkvTagName = 0x45A3, + kMkvTagString = 0x4487 +}; + +} // namespace libwebm + +#endif // COMMON_WEBMIDS_H_ diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxer.cc b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxer.cc new file mode 100644 index 000000000..f59c4584d --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxer.cc @@ -0,0 +1,4207 @@ +// Copyright (c) 2012 The WebM project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. + +#include "mkvmuxer.h" +#ifdef ESP32 + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../common/webmids.h" +#include "mkvmuxerutil.h" +#include "mkvwriter.h" +#include "../mkvparser/mkvparser.h" + +namespace mkvmuxer { + +const float PrimaryChromaticity::kChromaticityMin = 0.0f; +const float PrimaryChromaticity::kChromaticityMax = 1.0f; +const float MasteringMetadata::kMinLuminance = 0.0f; +const float MasteringMetadata::kMinLuminanceMax = 999.99f; +const float MasteringMetadata::kMaxLuminanceMax = 9999.99f; +const float MasteringMetadata::kValueNotPresent = FLT_MAX; +const uint64_t Colour::kValueNotPresent = UINT64_MAX; + +namespace { + +const char kDocTypeWebm[] = "webm"; +const char kDocTypeMatroska[] = "matroska"; + +// Deallocate the string designated by |dst|, and then copy the |src| +// string to |dst|. The caller owns both the |src| string and the +// |dst| copy (hence the caller is responsible for eventually +// deallocating the strings, either directly, or indirectly via +// StrCpy). Returns true if the source string was successfully copied +// to the destination. +bool StrCpy(const char* src, char** dst_ptr) { + if (dst_ptr == NULL) + return false; + + char*& dst = *dst_ptr; + + delete[] dst; + dst = NULL; + + if (src == NULL) + return true; + + const size_t size = strlen(src) + 1; + + dst = new (std::nothrow) char[size]; // NOLINT + if (dst == NULL) + return false; + + memcpy(dst, src, size - 1); + dst[size - 1] = '\0'; + return true; +} + +typedef std::unique_ptr PrimaryChromaticityPtr; +bool CopyChromaticity(const PrimaryChromaticity* src, + PrimaryChromaticityPtr* dst) { + if (!dst) + return false; + + dst->reset(new (std::nothrow) PrimaryChromaticity(src->x(), src->y())); + if (!dst->get()) + return false; + + return true; +} + +} // namespace + +/////////////////////////////////////////////////////////////// +// +// IMkvWriter Class + +IMkvWriter::IMkvWriter() {} + +IMkvWriter::~IMkvWriter() {} + +bool WriteEbmlHeader(IMkvWriter* writer, uint64_t doc_type_version, + const char* const doc_type) { + // Level 0 + uint64_t size = + EbmlElementSize(libwebm::kMkvEBMLVersion, static_cast(1)); + size += EbmlElementSize(libwebm::kMkvEBMLReadVersion, static_cast(1)); + size += EbmlElementSize(libwebm::kMkvEBMLMaxIDLength, static_cast(4)); + size += + EbmlElementSize(libwebm::kMkvEBMLMaxSizeLength, static_cast(8)); + size += EbmlElementSize(libwebm::kMkvDocType, doc_type); + size += EbmlElementSize(libwebm::kMkvDocTypeVersion, + static_cast(doc_type_version)); + size += + EbmlElementSize(libwebm::kMkvDocTypeReadVersion, static_cast(2)); + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvEBML, size)) + return false; + if (!WriteEbmlElement(writer, libwebm::kMkvEBMLVersion, + static_cast(1))) { + return false; + } + if (!WriteEbmlElement(writer, libwebm::kMkvEBMLReadVersion, + static_cast(1))) { + return false; + } + if (!WriteEbmlElement(writer, libwebm::kMkvEBMLMaxIDLength, + static_cast(4))) { + return false; + } + if (!WriteEbmlElement(writer, libwebm::kMkvEBMLMaxSizeLength, + static_cast(8))) { + return false; + } + if (!WriteEbmlElement(writer, libwebm::kMkvDocType, doc_type)) + return false; + if (!WriteEbmlElement(writer, libwebm::kMkvDocTypeVersion, + static_cast(doc_type_version))) { + return false; + } + if (!WriteEbmlElement(writer, libwebm::kMkvDocTypeReadVersion, + static_cast(2))) { + return false; + } + + return true; +} + +bool WriteEbmlHeader(IMkvWriter* writer, uint64_t doc_type_version) { + return WriteEbmlHeader(writer, doc_type_version, kDocTypeWebm); +} + +bool WriteEbmlHeader(IMkvWriter* writer) { + return WriteEbmlHeader(writer, mkvmuxer::Segment::kDefaultDocTypeVersion); +} + +bool ChunkedCopy(mkvparser::IMkvReader* source, mkvmuxer::IMkvWriter* dst, + int64_t start, int64_t size) { + // TODO(vigneshv): Check if this is a reasonable value. + const uint32_t kBufSize = 2048; + uint8_t* buf = new uint8_t[kBufSize]; + int64_t offset = start; + while (size > 0) { + const int64_t read_len = (size > kBufSize) ? kBufSize : size; + if (source->Read(offset, static_cast(read_len), buf)) + return false; + dst->Write(buf, static_cast(read_len)); + offset += read_len; + size -= read_len; + } + delete[] buf; + return true; +} + +/////////////////////////////////////////////////////////////// +// +// Frame Class + +Frame::Frame() + : add_id_(0), + additional_(NULL), + additional_length_(0), + duration_(0), + duration_set_(false), + frame_(NULL), + is_key_(false), + length_(0), + track_number_(0), + timestamp_(0), + discard_padding_(0), + reference_block_timestamp_(0), + reference_block_timestamp_set_(false) {} + +Frame::~Frame() { + delete[] frame_; + delete[] additional_; +} + +bool Frame::CopyFrom(const Frame& frame) { + delete[] frame_; + frame_ = NULL; + length_ = 0; + if (frame.length() > 0 && frame.frame() != NULL && + !Init(frame.frame(), frame.length())) { + return false; + } + add_id_ = 0; + delete[] additional_; + additional_ = NULL; + additional_length_ = 0; + if (frame.additional_length() > 0 && frame.additional() != NULL && + !AddAdditionalData(frame.additional(), frame.additional_length(), + frame.add_id())) { + return false; + } + duration_ = frame.duration(); + duration_set_ = frame.duration_set(); + is_key_ = frame.is_key(); + track_number_ = frame.track_number(); + timestamp_ = frame.timestamp(); + discard_padding_ = frame.discard_padding(); + reference_block_timestamp_ = frame.reference_block_timestamp(); + reference_block_timestamp_set_ = frame.reference_block_timestamp_set(); + return true; +} + +bool Frame::Init(const uint8_t* frame, uint64_t length) { + uint8_t* const data = + new (std::nothrow) uint8_t[static_cast(length)]; // NOLINT + if (!data) + return false; + + delete[] frame_; + frame_ = data; + length_ = length; + + memcpy(frame_, frame, static_cast(length_)); + return true; +} + +bool Frame::AddAdditionalData(const uint8_t* additional, uint64_t length, + uint64_t add_id) { + uint8_t* const data = + new (std::nothrow) uint8_t[static_cast(length)]; // NOLINT + if (!data) + return false; + + delete[] additional_; + additional_ = data; + additional_length_ = length; + add_id_ = add_id; + + memcpy(additional_, additional, static_cast(additional_length_)); + return true; +} + +bool Frame::IsValid() const { + if (length_ == 0 || !frame_) { + return false; + } + if ((additional_length_ != 0 && !additional_) || + (additional_ != NULL && additional_length_ == 0)) { + return false; + } + if (track_number_ == 0 || track_number_ > kMaxTrackNumber) { + return false; + } + if (!CanBeSimpleBlock() && !is_key_ && !reference_block_timestamp_set_) { + return false; + } + return true; +} + +bool Frame::CanBeSimpleBlock() const { + return additional_ == NULL && discard_padding_ == 0 && duration_ == 0; +} + +void Frame::set_duration(uint64_t duration) { + duration_ = duration; + duration_set_ = true; +} + +void Frame::set_reference_block_timestamp(int64_t reference_block_timestamp) { + reference_block_timestamp_ = reference_block_timestamp; + reference_block_timestamp_set_ = true; +} + +/////////////////////////////////////////////////////////////// +// +// CuePoint Class + +CuePoint::CuePoint() + : time_(0), + track_(0), + cluster_pos_(0), + block_number_(1), + output_block_number_(true) {} + +CuePoint::~CuePoint() {} + +bool CuePoint::Write(IMkvWriter* writer) const { + if (!writer || track_ < 1 || cluster_pos_ < 1) + return false; + + uint64_t size = EbmlElementSize(libwebm::kMkvCueClusterPosition, + static_cast(cluster_pos_)); + size += EbmlElementSize(libwebm::kMkvCueTrack, static_cast(track_)); + if (output_block_number_ && block_number_ > 1) + size += EbmlElementSize(libwebm::kMkvCueBlockNumber, + static_cast(block_number_)); + const uint64_t track_pos_size = + EbmlMasterElementSize(libwebm::kMkvCueTrackPositions, size) + size; + const uint64_t payload_size = + EbmlElementSize(libwebm::kMkvCueTime, static_cast(time_)) + + track_pos_size; + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvCuePoint, payload_size)) + return false; + + const int64_t payload_position = writer->Position(); + if (payload_position < 0) + return false; + + if (!WriteEbmlElement(writer, libwebm::kMkvCueTime, + static_cast(time_))) { + return false; + } + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvCueTrackPositions, size)) + return false; + if (!WriteEbmlElement(writer, libwebm::kMkvCueTrack, + static_cast(track_))) { + return false; + } + if (!WriteEbmlElement(writer, libwebm::kMkvCueClusterPosition, + static_cast(cluster_pos_))) { + return false; + } + if (output_block_number_ && block_number_ > 1) { + if (!WriteEbmlElement(writer, libwebm::kMkvCueBlockNumber, + static_cast(block_number_))) { + return false; + } + } + + const int64_t stop_position = writer->Position(); + if (stop_position < 0) + return false; + + if (stop_position - payload_position != static_cast(payload_size)) + return false; + + return true; +} + +uint64_t CuePoint::PayloadSize() const { + uint64_t size = EbmlElementSize(libwebm::kMkvCueClusterPosition, + static_cast(cluster_pos_)); + size += EbmlElementSize(libwebm::kMkvCueTrack, static_cast(track_)); + if (output_block_number_ && block_number_ > 1) + size += EbmlElementSize(libwebm::kMkvCueBlockNumber, + static_cast(block_number_)); + const uint64_t track_pos_size = + EbmlMasterElementSize(libwebm::kMkvCueTrackPositions, size) + size; + const uint64_t payload_size = + EbmlElementSize(libwebm::kMkvCueTime, static_cast(time_)) + + track_pos_size; + + return payload_size; +} + +uint64_t CuePoint::Size() const { + const uint64_t payload_size = PayloadSize(); + return EbmlMasterElementSize(libwebm::kMkvCuePoint, payload_size) + + payload_size; +} + +/////////////////////////////////////////////////////////////// +// +// Cues Class + +Cues::Cues() + : cue_entries_capacity_(0), + cue_entries_size_(0), + cue_entries_(NULL), + output_block_number_(true) {} + +Cues::~Cues() { + if (cue_entries_) { + for (int32_t i = 0; i < cue_entries_size_; ++i) { + CuePoint* const cue = cue_entries_[i]; + delete cue; + } + delete[] cue_entries_; + } +} + +bool Cues::AddCue(CuePoint* cue) { + if (!cue) + return false; + + if ((cue_entries_size_ + 1) > cue_entries_capacity_) { + // Add more CuePoints. + const int32_t new_capacity = + (!cue_entries_capacity_) ? 2 : cue_entries_capacity_ * 2; + + if (new_capacity < 1) + return false; + + CuePoint** const cues = + new (std::nothrow) CuePoint*[new_capacity]; // NOLINT + if (!cues) + return false; + + for (int32_t i = 0; i < cue_entries_size_; ++i) { + cues[i] = cue_entries_[i]; + } + + delete[] cue_entries_; + + cue_entries_ = cues; + cue_entries_capacity_ = new_capacity; + } + + cue->set_output_block_number(output_block_number_); + cue_entries_[cue_entries_size_++] = cue; + return true; +} + +CuePoint* Cues::GetCueByIndex(int32_t index) const { + if (cue_entries_ == NULL) + return NULL; + + if (index >= cue_entries_size_) + return NULL; + + return cue_entries_[index]; +} + +uint64_t Cues::Size() { + uint64_t size = 0; + for (int32_t i = 0; i < cue_entries_size_; ++i) + size += GetCueByIndex(i)->Size(); + size += EbmlMasterElementSize(libwebm::kMkvCues, size); + return size; +} + +bool Cues::Write(IMkvWriter* writer) const { + if (!writer) + return false; + + uint64_t size = 0; + for (int32_t i = 0; i < cue_entries_size_; ++i) { + const CuePoint* const cue = GetCueByIndex(i); + + if (!cue) + return false; + + size += cue->Size(); + } + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvCues, size)) + return false; + + const int64_t payload_position = writer->Position(); + if (payload_position < 0) + return false; + + for (int32_t i = 0; i < cue_entries_size_; ++i) { + const CuePoint* const cue = GetCueByIndex(i); + + if (!cue->Write(writer)) + return false; + } + + const int64_t stop_position = writer->Position(); + if (stop_position < 0) + return false; + + if (stop_position - payload_position != static_cast(size)) + return false; + + return true; +} + +/////////////////////////////////////////////////////////////// +// +// ContentEncAESSettings Class + +ContentEncAESSettings::ContentEncAESSettings() : cipher_mode_(kCTR) {} + +uint64_t ContentEncAESSettings::Size() const { + const uint64_t payload = PayloadSize(); + const uint64_t size = + EbmlMasterElementSize(libwebm::kMkvContentEncAESSettings, payload) + + payload; + return size; +} + +bool ContentEncAESSettings::Write(IMkvWriter* writer) const { + const uint64_t payload = PayloadSize(); + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvContentEncAESSettings, + payload)) + return false; + + const int64_t payload_position = writer->Position(); + if (payload_position < 0) + return false; + + if (!WriteEbmlElement(writer, libwebm::kMkvAESSettingsCipherMode, + static_cast(cipher_mode_))) { + return false; + } + + const int64_t stop_position = writer->Position(); + if (stop_position < 0 || + stop_position - payload_position != static_cast(payload)) + return false; + + return true; +} + +uint64_t ContentEncAESSettings::PayloadSize() const { + uint64_t size = EbmlElementSize(libwebm::kMkvAESSettingsCipherMode, + static_cast(cipher_mode_)); + return size; +} + +/////////////////////////////////////////////////////////////// +// +// ContentEncoding Class + +ContentEncoding::ContentEncoding() + : enc_algo_(5), + enc_key_id_(NULL), + encoding_order_(0), + encoding_scope_(1), + encoding_type_(1), + enc_key_id_length_(0) {} + +ContentEncoding::~ContentEncoding() { delete[] enc_key_id_; } + +bool ContentEncoding::SetEncryptionID(const uint8_t* id, uint64_t length) { + if (!id || length < 1) + return false; + + delete[] enc_key_id_; + + enc_key_id_ = + new (std::nothrow) uint8_t[static_cast(length)]; // NOLINT + if (!enc_key_id_) + return false; + + memcpy(enc_key_id_, id, static_cast(length)); + enc_key_id_length_ = length; + + return true; +} + +uint64_t ContentEncoding::Size() const { + const uint64_t encryption_size = EncryptionSize(); + const uint64_t encoding_size = EncodingSize(0, encryption_size); + const uint64_t encodings_size = + EbmlMasterElementSize(libwebm::kMkvContentEncoding, encoding_size) + + encoding_size; + + return encodings_size; +} + +bool ContentEncoding::Write(IMkvWriter* writer) const { + const uint64_t encryption_size = EncryptionSize(); + const uint64_t encoding_size = EncodingSize(0, encryption_size); + const uint64_t size = + EbmlMasterElementSize(libwebm::kMkvContentEncoding, encoding_size) + + encoding_size; + + const int64_t payload_position = writer->Position(); + if (payload_position < 0) + return false; + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvContentEncoding, + encoding_size)) + return false; + if (!WriteEbmlElement(writer, libwebm::kMkvContentEncodingOrder, + static_cast(encoding_order_))) + return false; + if (!WriteEbmlElement(writer, libwebm::kMkvContentEncodingScope, + static_cast(encoding_scope_))) + return false; + if (!WriteEbmlElement(writer, libwebm::kMkvContentEncodingType, + static_cast(encoding_type_))) + return false; + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvContentEncryption, + encryption_size)) + return false; + if (!WriteEbmlElement(writer, libwebm::kMkvContentEncAlgo, + static_cast(enc_algo_))) { + return false; + } + if (!WriteEbmlElement(writer, libwebm::kMkvContentEncKeyID, enc_key_id_, + enc_key_id_length_)) + return false; + + if (!enc_aes_settings_.Write(writer)) + return false; + + const int64_t stop_position = writer->Position(); + if (stop_position < 0 || + stop_position - payload_position != static_cast(size)) + return false; + + return true; +} + +uint64_t ContentEncoding::EncodingSize(uint64_t compression_size, + uint64_t encryption_size) const { + // TODO(fgalligan): Add support for compression settings. + if (compression_size != 0) + return 0; + + uint64_t encoding_size = 0; + + if (encryption_size > 0) { + encoding_size += + EbmlMasterElementSize(libwebm::kMkvContentEncryption, encryption_size) + + encryption_size; + } + encoding_size += EbmlElementSize(libwebm::kMkvContentEncodingType, + static_cast(encoding_type_)); + encoding_size += EbmlElementSize(libwebm::kMkvContentEncodingScope, + static_cast(encoding_scope_)); + encoding_size += EbmlElementSize(libwebm::kMkvContentEncodingOrder, + static_cast(encoding_order_)); + + return encoding_size; +} + +uint64_t ContentEncoding::EncryptionSize() const { + const uint64_t aes_size = enc_aes_settings_.Size(); + + uint64_t encryption_size = EbmlElementSize(libwebm::kMkvContentEncKeyID, + enc_key_id_, enc_key_id_length_); + encryption_size += EbmlElementSize(libwebm::kMkvContentEncAlgo, + static_cast(enc_algo_)); + + return encryption_size + aes_size; +} + +/////////////////////////////////////////////////////////////// +// +// Track Class + +Track::Track(unsigned int* seed) + : codec_id_(NULL), + codec_private_(NULL), + language_(NULL), + max_block_additional_id_(0), + name_(NULL), + number_(0), + type_(0), + uid_(MakeUID(seed)), + codec_delay_(0), + seek_pre_roll_(0), + default_duration_(0), + codec_private_length_(0), + content_encoding_entries_(NULL), + content_encoding_entries_size_(0) {} + +Track::~Track() { + delete[] codec_id_; + delete[] codec_private_; + delete[] language_; + delete[] name_; + + if (content_encoding_entries_) { + for (uint32_t i = 0; i < content_encoding_entries_size_; ++i) { + ContentEncoding* const encoding = content_encoding_entries_[i]; + delete encoding; + } + delete[] content_encoding_entries_; + } +} + +bool Track::AddContentEncoding() { + const uint32_t count = content_encoding_entries_size_ + 1; + + ContentEncoding** const content_encoding_entries = + new (std::nothrow) ContentEncoding*[count]; // NOLINT + if (!content_encoding_entries) + return false; + + ContentEncoding* const content_encoding = + new (std::nothrow) ContentEncoding(); // NOLINT + if (!content_encoding) { + delete[] content_encoding_entries; + return false; + } + + for (uint32_t i = 0; i < content_encoding_entries_size_; ++i) { + content_encoding_entries[i] = content_encoding_entries_[i]; + } + + delete[] content_encoding_entries_; + + content_encoding_entries_ = content_encoding_entries; + content_encoding_entries_[content_encoding_entries_size_] = content_encoding; + content_encoding_entries_size_ = count; + return true; +} + +ContentEncoding* Track::GetContentEncodingByIndex(uint32_t index) const { + if (content_encoding_entries_ == NULL) + return NULL; + + if (index >= content_encoding_entries_size_) + return NULL; + + return content_encoding_entries_[index]; +} + +uint64_t Track::PayloadSize() const { + uint64_t size = + EbmlElementSize(libwebm::kMkvTrackNumber, static_cast(number_)); + size += EbmlElementSize(libwebm::kMkvTrackUID, static_cast(uid_)); + size += EbmlElementSize(libwebm::kMkvTrackType, static_cast(type_)); + if (codec_id_) + size += EbmlElementSize(libwebm::kMkvCodecID, codec_id_); + if (codec_private_) + size += EbmlElementSize(libwebm::kMkvCodecPrivate, codec_private_, + codec_private_length_); + if (language_) + size += EbmlElementSize(libwebm::kMkvLanguage, language_); + if (name_) + size += EbmlElementSize(libwebm::kMkvName, name_); + if (max_block_additional_id_) { + size += EbmlElementSize(libwebm::kMkvMaxBlockAdditionID, + static_cast(max_block_additional_id_)); + } + if (codec_delay_) { + size += EbmlElementSize(libwebm::kMkvCodecDelay, + static_cast(codec_delay_)); + } + if (seek_pre_roll_) { + size += EbmlElementSize(libwebm::kMkvSeekPreRoll, + static_cast(seek_pre_roll_)); + } + if (default_duration_) { + size += EbmlElementSize(libwebm::kMkvDefaultDuration, + static_cast(default_duration_)); + } + + if (content_encoding_entries_size_ > 0) { + uint64_t content_encodings_size = 0; + for (uint32_t i = 0; i < content_encoding_entries_size_; ++i) { + ContentEncoding* const encoding = content_encoding_entries_[i]; + content_encodings_size += encoding->Size(); + } + + size += EbmlMasterElementSize(libwebm::kMkvContentEncodings, + content_encodings_size) + + content_encodings_size; + } + + return size; +} + +uint64_t Track::Size() const { + uint64_t size = PayloadSize(); + size += EbmlMasterElementSize(libwebm::kMkvTrackEntry, size); + return size; +} + +bool Track::Write(IMkvWriter* writer) const { + if (!writer) + return false; + + // mandatory elements without a default value. + if (!type_ || !codec_id_) + return false; + + // AV1 tracks require a CodecPrivate. See + // https://github.com/ietf-wg-cellar/matroska-specification/blob/HEAD/codec/av1.md + // TODO(tomfinegan): Update the above link to the AV1 Matroska mappings to + // point to a stable version once it is finalized, or our own WebM mappings + // page on webmproject.org should we decide to release them. + if (!strcmp(codec_id_, Tracks::kAv1CodecId) && !codec_private_) + return false; + + // |size| may be bigger than what is written out in this function because + // derived classes may write out more data in the Track element. + const uint64_t payload_size = PayloadSize(); + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvTrackEntry, payload_size)) + return false; + + uint64_t size = + EbmlElementSize(libwebm::kMkvTrackNumber, static_cast(number_)); + size += EbmlElementSize(libwebm::kMkvTrackUID, static_cast(uid_)); + size += EbmlElementSize(libwebm::kMkvTrackType, static_cast(type_)); + if (codec_id_) + size += EbmlElementSize(libwebm::kMkvCodecID, codec_id_); + if (codec_private_) + size += EbmlElementSize(libwebm::kMkvCodecPrivate, codec_private_, + static_cast(codec_private_length_)); + if (language_) + size += EbmlElementSize(libwebm::kMkvLanguage, language_); + if (name_) + size += EbmlElementSize(libwebm::kMkvName, name_); + if (max_block_additional_id_) + size += EbmlElementSize(libwebm::kMkvMaxBlockAdditionID, + static_cast(max_block_additional_id_)); + if (codec_delay_) + size += EbmlElementSize(libwebm::kMkvCodecDelay, + static_cast(codec_delay_)); + if (seek_pre_roll_) + size += EbmlElementSize(libwebm::kMkvSeekPreRoll, + static_cast(seek_pre_roll_)); + if (default_duration_) + size += EbmlElementSize(libwebm::kMkvDefaultDuration, + static_cast(default_duration_)); + + const int64_t payload_position = writer->Position(); + if (payload_position < 0) + return false; + + if (!WriteEbmlElement(writer, libwebm::kMkvTrackNumber, + static_cast(number_))) + return false; + if (!WriteEbmlElement(writer, libwebm::kMkvTrackUID, + static_cast(uid_))) + return false; + if (!WriteEbmlElement(writer, libwebm::kMkvTrackType, + static_cast(type_))) + return false; + if (max_block_additional_id_) { + if (!WriteEbmlElement(writer, libwebm::kMkvMaxBlockAdditionID, + static_cast(max_block_additional_id_))) { + return false; + } + } + if (codec_delay_) { + if (!WriteEbmlElement(writer, libwebm::kMkvCodecDelay, + static_cast(codec_delay_))) + return false; + } + if (seek_pre_roll_) { + if (!WriteEbmlElement(writer, libwebm::kMkvSeekPreRoll, + static_cast(seek_pre_roll_))) + return false; + } + if (default_duration_) { + if (!WriteEbmlElement(writer, libwebm::kMkvDefaultDuration, + static_cast(default_duration_))) + return false; + } + if (codec_id_) { + if (!WriteEbmlElement(writer, libwebm::kMkvCodecID, codec_id_)) + return false; + } + if (codec_private_) { + if (!WriteEbmlElement(writer, libwebm::kMkvCodecPrivate, codec_private_, + static_cast(codec_private_length_))) + return false; + } + if (language_) { + if (!WriteEbmlElement(writer, libwebm::kMkvLanguage, language_)) + return false; + } + if (name_) { + if (!WriteEbmlElement(writer, libwebm::kMkvName, name_)) + return false; + } + + int64_t stop_position = writer->Position(); + if (stop_position < 0 || + stop_position - payload_position != static_cast(size)) + return false; + + if (content_encoding_entries_size_ > 0) { + uint64_t content_encodings_size = 0; + for (uint32_t i = 0; i < content_encoding_entries_size_; ++i) { + ContentEncoding* const encoding = content_encoding_entries_[i]; + content_encodings_size += encoding->Size(); + } + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvContentEncodings, + content_encodings_size)) + return false; + + for (uint32_t i = 0; i < content_encoding_entries_size_; ++i) { + ContentEncoding* const encoding = content_encoding_entries_[i]; + if (!encoding->Write(writer)) + return false; + } + } + + stop_position = writer->Position(); + if (stop_position < 0) + return false; + return true; +} + +bool Track::SetCodecPrivate(const uint8_t* codec_private, uint64_t length) { + if (!codec_private || length < 1) + return false; + + delete[] codec_private_; + + codec_private_ = + new (std::nothrow) uint8_t[static_cast(length)]; // NOLINT + if (!codec_private_) + return false; + + memcpy(codec_private_, codec_private, static_cast(length)); + codec_private_length_ = length; + + return true; +} + +void Track::set_codec_id(const char* codec_id) { + if (codec_id) { + delete[] codec_id_; + + const size_t length = strlen(codec_id) + 1; + codec_id_ = new (std::nothrow) char[length]; // NOLINT + if (codec_id_) { + memcpy(codec_id_, codec_id, length - 1); + codec_id_[length - 1] = '\0'; + } + } +} + +// TODO(fgalligan): Vet the language parameter. +void Track::set_language(const char* language) { + if (language) { + delete[] language_; + + const size_t length = strlen(language) + 1; + language_ = new (std::nothrow) char[length]; // NOLINT + if (language_) { + memcpy(language_, language, length - 1); + language_[length - 1] = '\0'; + } + } +} + +void Track::set_name(const char* name) { + if (name) { + delete[] name_; + + const size_t length = strlen(name) + 1; + name_ = new (std::nothrow) char[length]; // NOLINT + if (name_) { + memcpy(name_, name, length - 1); + name_[length - 1] = '\0'; + } + } +} + +/////////////////////////////////////////////////////////////// +// +// Colour and its child elements + +uint64_t PrimaryChromaticity::PrimaryChromaticitySize( + libwebm::MkvId x_id, libwebm::MkvId y_id) const { + return EbmlElementSize(x_id, x_) + EbmlElementSize(y_id, y_); +} + +bool PrimaryChromaticity::Write(IMkvWriter* writer, libwebm::MkvId x_id, + libwebm::MkvId y_id) const { + if (!Valid()) { + return false; + } + return WriteEbmlElement(writer, x_id, x_) && + WriteEbmlElement(writer, y_id, y_); +} + +bool PrimaryChromaticity::Valid() const { + return (x_ >= kChromaticityMin && x_ <= kChromaticityMax && + y_ >= kChromaticityMin && y_ <= kChromaticityMax); +} + +uint64_t MasteringMetadata::MasteringMetadataSize() const { + uint64_t size = PayloadSize(); + + if (size > 0) + size += EbmlMasterElementSize(libwebm::kMkvMasteringMetadata, size); + + return size; +} + +bool MasteringMetadata::Valid() const { + if (luminance_min_ != kValueNotPresent) { + if (luminance_min_ < kMinLuminance || luminance_min_ > kMinLuminanceMax || + luminance_min_ > luminance_max_) { + return false; + } + } + if (luminance_max_ != kValueNotPresent) { + if (luminance_max_ < kMinLuminance || luminance_max_ > kMaxLuminanceMax || + luminance_max_ < luminance_min_) { + return false; + } + } + if (r_ && !r_->Valid()) + return false; + if (g_ && !g_->Valid()) + return false; + if (b_ && !b_->Valid()) + return false; + if (white_point_ && !white_point_->Valid()) + return false; + + return true; +} + +bool MasteringMetadata::Write(IMkvWriter* writer) const { + const uint64_t size = PayloadSize(); + + // Don't write an empty element. + if (size == 0) + return true; + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvMasteringMetadata, size)) + return false; + if (luminance_max_ != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvLuminanceMax, luminance_max_)) { + return false; + } + if (luminance_min_ != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvLuminanceMin, luminance_min_)) { + return false; + } + if (r_ && !r_->Write(writer, libwebm::kMkvPrimaryRChromaticityX, + libwebm::kMkvPrimaryRChromaticityY)) { + return false; + } + if (g_ && !g_->Write(writer, libwebm::kMkvPrimaryGChromaticityX, + libwebm::kMkvPrimaryGChromaticityY)) { + return false; + } + if (b_ && !b_->Write(writer, libwebm::kMkvPrimaryBChromaticityX, + libwebm::kMkvPrimaryBChromaticityY)) { + return false; + } + if (white_point_ && + !white_point_->Write(writer, libwebm::kMkvWhitePointChromaticityX, + libwebm::kMkvWhitePointChromaticityY)) { + return false; + } + + return true; +} + +bool MasteringMetadata::SetChromaticity( + const PrimaryChromaticity* r, const PrimaryChromaticity* g, + const PrimaryChromaticity* b, const PrimaryChromaticity* white_point) { + PrimaryChromaticityPtr r_ptr(nullptr); + if (r) { + if (!CopyChromaticity(r, &r_ptr)) + return false; + } + PrimaryChromaticityPtr g_ptr(nullptr); + if (g) { + if (!CopyChromaticity(g, &g_ptr)) + return false; + } + PrimaryChromaticityPtr b_ptr(nullptr); + if (b) { + if (!CopyChromaticity(b, &b_ptr)) + return false; + } + PrimaryChromaticityPtr wp_ptr(nullptr); + if (white_point) { + if (!CopyChromaticity(white_point, &wp_ptr)) + return false; + } + + r_ = r_ptr.release(); + g_ = g_ptr.release(); + b_ = b_ptr.release(); + white_point_ = wp_ptr.release(); + return true; +} + +uint64_t MasteringMetadata::PayloadSize() const { + uint64_t size = 0; + + if (luminance_max_ != kValueNotPresent) + size += EbmlElementSize(libwebm::kMkvLuminanceMax, luminance_max_); + if (luminance_min_ != kValueNotPresent) + size += EbmlElementSize(libwebm::kMkvLuminanceMin, luminance_min_); + + if (r_) { + size += r_->PrimaryChromaticitySize(libwebm::kMkvPrimaryRChromaticityX, + libwebm::kMkvPrimaryRChromaticityY); + } + if (g_) { + size += g_->PrimaryChromaticitySize(libwebm::kMkvPrimaryGChromaticityX, + libwebm::kMkvPrimaryGChromaticityY); + } + if (b_) { + size += b_->PrimaryChromaticitySize(libwebm::kMkvPrimaryBChromaticityX, + libwebm::kMkvPrimaryBChromaticityY); + } + if (white_point_) { + size += white_point_->PrimaryChromaticitySize( + libwebm::kMkvWhitePointChromaticityX, + libwebm::kMkvWhitePointChromaticityY); + } + + return size; +} + +uint64_t Colour::ColourSize() const { + uint64_t size = PayloadSize(); + + if (size > 0) + size += EbmlMasterElementSize(libwebm::kMkvColour, size); + + return size; +} + +bool Colour::Valid() const { + if (mastering_metadata_ && !mastering_metadata_->Valid()) + return false; + if (matrix_coefficients_ != kValueNotPresent && + !IsMatrixCoefficientsValueValid(matrix_coefficients_)) { + return false; + } + if (chroma_siting_horz_ != kValueNotPresent && + !IsChromaSitingHorzValueValid(chroma_siting_horz_)) { + return false; + } + if (chroma_siting_vert_ != kValueNotPresent && + !IsChromaSitingVertValueValid(chroma_siting_vert_)) { + return false; + } + if (range_ != kValueNotPresent && !IsColourRangeValueValid(range_)) + return false; + if (transfer_characteristics_ != kValueNotPresent && + !IsTransferCharacteristicsValueValid(transfer_characteristics_)) { + return false; + } + if (primaries_ != kValueNotPresent && !IsPrimariesValueValid(primaries_)) + return false; + + return true; +} + +bool Colour::Write(IMkvWriter* writer) const { + const uint64_t size = PayloadSize(); + + // Don't write an empty element. + if (size == 0) + return true; + + // Don't write an invalid element. + if (!Valid()) + return false; + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvColour, size)) + return false; + + if (matrix_coefficients_ != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvMatrixCoefficients, + static_cast(matrix_coefficients_))) { + return false; + } + if (bits_per_channel_ != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvBitsPerChannel, + static_cast(bits_per_channel_))) { + return false; + } + if (chroma_subsampling_horz_ != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvChromaSubsamplingHorz, + static_cast(chroma_subsampling_horz_))) { + return false; + } + if (chroma_subsampling_vert_ != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvChromaSubsamplingVert, + static_cast(chroma_subsampling_vert_))) { + return false; + } + + if (cb_subsampling_horz_ != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvCbSubsamplingHorz, + static_cast(cb_subsampling_horz_))) { + return false; + } + if (cb_subsampling_vert_ != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvCbSubsamplingVert, + static_cast(cb_subsampling_vert_))) { + return false; + } + if (chroma_siting_horz_ != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvChromaSitingHorz, + static_cast(chroma_siting_horz_))) { + return false; + } + if (chroma_siting_vert_ != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvChromaSitingVert, + static_cast(chroma_siting_vert_))) { + return false; + } + if (range_ != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvRange, + static_cast(range_))) { + return false; + } + if (transfer_characteristics_ != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvTransferCharacteristics, + static_cast(transfer_characteristics_))) { + return false; + } + if (primaries_ != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvPrimaries, + static_cast(primaries_))) { + return false; + } + if (max_cll_ != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvMaxCLL, + static_cast(max_cll_))) { + return false; + } + if (max_fall_ != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvMaxFALL, + static_cast(max_fall_))) { + return false; + } + + if (mastering_metadata_ && !mastering_metadata_->Write(writer)) + return false; + + return true; +} + +bool Colour::SetMasteringMetadata(const MasteringMetadata& mastering_metadata) { + std::unique_ptr mm_ptr(new MasteringMetadata()); + if (!mm_ptr.get()) + return false; + + mm_ptr->set_luminance_max(mastering_metadata.luminance_max()); + mm_ptr->set_luminance_min(mastering_metadata.luminance_min()); + + if (!mm_ptr->SetChromaticity(mastering_metadata.r(), mastering_metadata.g(), + mastering_metadata.b(), + mastering_metadata.white_point())) { + return false; + } + + delete mastering_metadata_; + mastering_metadata_ = mm_ptr.release(); + return true; +} + +uint64_t Colour::PayloadSize() const { + uint64_t size = 0; + + if (matrix_coefficients_ != kValueNotPresent) { + size += EbmlElementSize(libwebm::kMkvMatrixCoefficients, + static_cast(matrix_coefficients_)); + } + if (bits_per_channel_ != kValueNotPresent) { + size += EbmlElementSize(libwebm::kMkvBitsPerChannel, + static_cast(bits_per_channel_)); + } + if (chroma_subsampling_horz_ != kValueNotPresent) { + size += EbmlElementSize(libwebm::kMkvChromaSubsamplingHorz, + static_cast(chroma_subsampling_horz_)); + } + if (chroma_subsampling_vert_ != kValueNotPresent) { + size += EbmlElementSize(libwebm::kMkvChromaSubsamplingVert, + static_cast(chroma_subsampling_vert_)); + } + if (cb_subsampling_horz_ != kValueNotPresent) { + size += EbmlElementSize(libwebm::kMkvCbSubsamplingHorz, + static_cast(cb_subsampling_horz_)); + } + if (cb_subsampling_vert_ != kValueNotPresent) { + size += EbmlElementSize(libwebm::kMkvCbSubsamplingVert, + static_cast(cb_subsampling_vert_)); + } + if (chroma_siting_horz_ != kValueNotPresent) { + size += EbmlElementSize(libwebm::kMkvChromaSitingHorz, + static_cast(chroma_siting_horz_)); + } + if (chroma_siting_vert_ != kValueNotPresent) { + size += EbmlElementSize(libwebm::kMkvChromaSitingVert, + static_cast(chroma_siting_vert_)); + } + if (range_ != kValueNotPresent) { + size += EbmlElementSize(libwebm::kMkvRange, static_cast(range_)); + } + if (transfer_characteristics_ != kValueNotPresent) { + size += EbmlElementSize(libwebm::kMkvTransferCharacteristics, + static_cast(transfer_characteristics_)); + } + if (primaries_ != kValueNotPresent) { + size += EbmlElementSize(libwebm::kMkvPrimaries, + static_cast(primaries_)); + } + if (max_cll_ != kValueNotPresent) { + size += EbmlElementSize(libwebm::kMkvMaxCLL, static_cast(max_cll_)); + } + if (max_fall_ != kValueNotPresent) { + size += + EbmlElementSize(libwebm::kMkvMaxFALL, static_cast(max_fall_)); + } + + if (mastering_metadata_) + size += mastering_metadata_->MasteringMetadataSize(); + + return size; +} + +/////////////////////////////////////////////////////////////// +// +// Projection element + +uint64_t Projection::ProjectionSize() const { + uint64_t size = PayloadSize(); + + if (size > 0) + size += EbmlMasterElementSize(libwebm::kMkvProjection, size); + + return size; +} + +bool Projection::Write(IMkvWriter* writer) const { + const uint64_t size = PayloadSize(); + + // Don't write an empty element. + if (size == 0) + return true; + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvProjection, size)) + return false; + + if (!WriteEbmlElement(writer, libwebm::kMkvProjectionType, + static_cast(type_))) { + return false; + } + + if (private_data_length_ > 0 && private_data_ != NULL && + !WriteEbmlElement(writer, libwebm::kMkvProjectionPrivate, private_data_, + private_data_length_)) { + return false; + } + + if (!WriteEbmlElement(writer, libwebm::kMkvProjectionPoseYaw, pose_yaw_)) + return false; + + if (!WriteEbmlElement(writer, libwebm::kMkvProjectionPosePitch, + pose_pitch_)) { + return false; + } + + if (!WriteEbmlElement(writer, libwebm::kMkvProjectionPoseRoll, pose_roll_)) { + return false; + } + + return true; +} + +bool Projection::SetProjectionPrivate(const uint8_t* data, + uint64_t data_length) { + if (data == NULL || data_length == 0) { + return false; + } + + if (data_length != static_cast(data_length)) { + return false; + } + + uint8_t* new_private_data = + new (std::nothrow) uint8_t[static_cast(data_length)]; + if (new_private_data == NULL) { + return false; + } + + delete[] private_data_; + private_data_ = new_private_data; + private_data_length_ = data_length; + memcpy(private_data_, data, static_cast(data_length)); + + return true; +} + +uint64_t Projection::PayloadSize() const { + uint64_t size = + EbmlElementSize(libwebm::kMkvProjection, static_cast(type_)); + + if (private_data_length_ > 0 && private_data_ != NULL) { + size += EbmlElementSize(libwebm::kMkvProjectionPrivate, private_data_, + private_data_length_); + } + + size += EbmlElementSize(libwebm::kMkvProjectionPoseYaw, pose_yaw_); + size += EbmlElementSize(libwebm::kMkvProjectionPosePitch, pose_pitch_); + size += EbmlElementSize(libwebm::kMkvProjectionPoseRoll, pose_roll_); + + return size; +} + +/////////////////////////////////////////////////////////////// +// +// VideoTrack Class + +VideoTrack::VideoTrack(unsigned int* seed) + : Track(seed), + display_height_(0), + display_width_(0), + pixel_height_(0), + pixel_width_(0), + crop_left_(0), + crop_right_(0), + crop_top_(0), + crop_bottom_(0), + frame_rate_(0.0), + height_(0), + stereo_mode_(0), + alpha_mode_(0), + width_(0), + colour_space_(NULL), + colour_(NULL), + projection_(NULL) {} + +VideoTrack::~VideoTrack() { + delete colour_; + delete projection_; +} + +bool VideoTrack::SetStereoMode(uint64_t stereo_mode) { + if (stereo_mode != kMono && stereo_mode != kSideBySideLeftIsFirst && + stereo_mode != kTopBottomRightIsFirst && + stereo_mode != kTopBottomLeftIsFirst && + stereo_mode != kSideBySideRightIsFirst) + return false; + + stereo_mode_ = stereo_mode; + return true; +} + +bool VideoTrack::SetAlphaMode(uint64_t alpha_mode) { + if (alpha_mode != kNoAlpha && alpha_mode != kAlpha) + return false; + + alpha_mode_ = alpha_mode; + return true; +} + +uint64_t VideoTrack::PayloadSize() const { + const uint64_t parent_size = Track::PayloadSize(); + + uint64_t size = VideoPayloadSize(); + size += EbmlMasterElementSize(libwebm::kMkvVideo, size); + + return parent_size + size; +} + +bool VideoTrack::Write(IMkvWriter* writer) const { + if (!Track::Write(writer)) + return false; + + const uint64_t size = VideoPayloadSize(); + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvVideo, size)) + return false; + + const int64_t payload_position = writer->Position(); + if (payload_position < 0) + return false; + + if (!WriteEbmlElement( + writer, libwebm::kMkvPixelWidth, + static_cast((pixel_width_ > 0) ? pixel_width_ : width_))) + return false; + if (!WriteEbmlElement( + writer, libwebm::kMkvPixelHeight, + static_cast((pixel_height_ > 0) ? pixel_height_ : height_))) + return false; + if (display_width_ > 0) { + if (!WriteEbmlElement(writer, libwebm::kMkvDisplayWidth, + static_cast(display_width_))) + return false; + } + if (display_height_ > 0) { + if (!WriteEbmlElement(writer, libwebm::kMkvDisplayHeight, + static_cast(display_height_))) + return false; + } + if (crop_left_ > 0) { + if (!WriteEbmlElement(writer, libwebm::kMkvPixelCropLeft, + static_cast(crop_left_))) + return false; + } + if (crop_right_ > 0) { + if (!WriteEbmlElement(writer, libwebm::kMkvPixelCropRight, + static_cast(crop_right_))) + return false; + } + if (crop_top_ > 0) { + if (!WriteEbmlElement(writer, libwebm::kMkvPixelCropTop, + static_cast(crop_top_))) + return false; + } + if (crop_bottom_ > 0) { + if (!WriteEbmlElement(writer, libwebm::kMkvPixelCropBottom, + static_cast(crop_bottom_))) + return false; + } + if (stereo_mode_ > kMono) { + if (!WriteEbmlElement(writer, libwebm::kMkvStereoMode, + static_cast(stereo_mode_))) + return false; + } + if (alpha_mode_ > kNoAlpha) { + if (!WriteEbmlElement(writer, libwebm::kMkvAlphaMode, + static_cast(alpha_mode_))) + return false; + } + if (colour_space_) { + if (!WriteEbmlElement(writer, libwebm::kMkvColourSpace, colour_space_)) + return false; + } + if (frame_rate_ > 0.0) { + if (!WriteEbmlElement(writer, libwebm::kMkvFrameRate, + static_cast(frame_rate_))) { + return false; + } + } + if (colour_) { + if (!colour_->Write(writer)) + return false; + } + if (projection_) { + if (!projection_->Write(writer)) + return false; + } + + const int64_t stop_position = writer->Position(); + if (stop_position < 0 || + stop_position - payload_position != static_cast(size)) { + return false; + } + + return true; +} + +void VideoTrack::set_colour_space(const char* colour_space) { + if (colour_space) { + delete[] colour_space_; + + const size_t length = strlen(colour_space) + 1; + colour_space_ = new (std::nothrow) char[length]; // NOLINT + if (colour_space_) { + memcpy(colour_space_, colour_space, length - 1); + colour_space_[length - 1] = '\0'; + } + } +} + +bool VideoTrack::SetColour(const Colour& colour) { + std::unique_ptr colour_ptr(new Colour()); + if (!colour_ptr.get()) + return false; + + if (colour.mastering_metadata()) { + if (!colour_ptr->SetMasteringMetadata(*colour.mastering_metadata())) + return false; + } + + colour_ptr->set_matrix_coefficients(colour.matrix_coefficients()); + colour_ptr->set_bits_per_channel(colour.bits_per_channel()); + colour_ptr->set_chroma_subsampling_horz(colour.chroma_subsampling_horz()); + colour_ptr->set_chroma_subsampling_vert(colour.chroma_subsampling_vert()); + colour_ptr->set_cb_subsampling_horz(colour.cb_subsampling_horz()); + colour_ptr->set_cb_subsampling_vert(colour.cb_subsampling_vert()); + colour_ptr->set_chroma_siting_horz(colour.chroma_siting_horz()); + colour_ptr->set_chroma_siting_vert(colour.chroma_siting_vert()); + colour_ptr->set_range(colour.range()); + colour_ptr->set_transfer_characteristics(colour.transfer_characteristics()); + colour_ptr->set_primaries(colour.primaries()); + colour_ptr->set_max_cll(colour.max_cll()); + colour_ptr->set_max_fall(colour.max_fall()); + delete colour_; + colour_ = colour_ptr.release(); + return true; +} + +bool VideoTrack::SetProjection(const Projection& projection) { + std::unique_ptr projection_ptr(new Projection()); + if (!projection_ptr.get()) + return false; + + if (projection.private_data()) { + if (!projection_ptr->SetProjectionPrivate( + projection.private_data(), projection.private_data_length())) { + return false; + } + } + + projection_ptr->set_type(projection.type()); + projection_ptr->set_pose_yaw(projection.pose_yaw()); + projection_ptr->set_pose_pitch(projection.pose_pitch()); + projection_ptr->set_pose_roll(projection.pose_roll()); + delete projection_; + projection_ = projection_ptr.release(); + return true; +} + +uint64_t VideoTrack::VideoPayloadSize() const { + uint64_t size = EbmlElementSize( + libwebm::kMkvPixelWidth, + static_cast((pixel_width_ > 0) ? pixel_width_ : width_)); + size += EbmlElementSize( + libwebm::kMkvPixelHeight, + static_cast((pixel_height_ > 0) ? pixel_height_ : height_)); + if (display_width_ > 0) + size += EbmlElementSize(libwebm::kMkvDisplayWidth, + static_cast(display_width_)); + if (display_height_ > 0) + size += EbmlElementSize(libwebm::kMkvDisplayHeight, + static_cast(display_height_)); + if (crop_left_ > 0) + size += EbmlElementSize(libwebm::kMkvPixelCropLeft, + static_cast(crop_left_)); + if (crop_right_ > 0) + size += EbmlElementSize(libwebm::kMkvPixelCropRight, + static_cast(crop_right_)); + if (crop_top_ > 0) + size += EbmlElementSize(libwebm::kMkvPixelCropTop, + static_cast(crop_top_)); + if (crop_bottom_ > 0) + size += EbmlElementSize(libwebm::kMkvPixelCropBottom, + static_cast(crop_bottom_)); + if (stereo_mode_ > kMono) + size += EbmlElementSize(libwebm::kMkvStereoMode, + static_cast(stereo_mode_)); + if (alpha_mode_ > kNoAlpha) + size += EbmlElementSize(libwebm::kMkvAlphaMode, + static_cast(alpha_mode_)); + if (frame_rate_ > 0.0) + size += EbmlElementSize(libwebm::kMkvFrameRate, + static_cast(frame_rate_)); + if (colour_space_) + size += EbmlElementSize(libwebm::kMkvColourSpace, colour_space_); + if (colour_) + size += colour_->ColourSize(); + if (projection_) + size += projection_->ProjectionSize(); + + return size; +} + +/////////////////////////////////////////////////////////////// +// +// AudioTrack Class + +AudioTrack::AudioTrack(unsigned int* seed) + : Track(seed), bit_depth_(0), channels_(1), sample_rate_(0.0) {} + +AudioTrack::~AudioTrack() {} + +uint64_t AudioTrack::PayloadSize() const { + const uint64_t parent_size = Track::PayloadSize(); + + uint64_t size = EbmlElementSize(libwebm::kMkvSamplingFrequency, + static_cast(sample_rate_)); + size += + EbmlElementSize(libwebm::kMkvChannels, static_cast(channels_)); + if (bit_depth_ > 0) + size += + EbmlElementSize(libwebm::kMkvBitDepth, static_cast(bit_depth_)); + size += EbmlMasterElementSize(libwebm::kMkvAudio, size); + + return parent_size + size; +} + +bool AudioTrack::Write(IMkvWriter* writer) const { + if (!Track::Write(writer)) + return false; + + // Calculate AudioSettings size. + uint64_t size = EbmlElementSize(libwebm::kMkvSamplingFrequency, + static_cast(sample_rate_)); + size += + EbmlElementSize(libwebm::kMkvChannels, static_cast(channels_)); + if (bit_depth_ > 0) + size += + EbmlElementSize(libwebm::kMkvBitDepth, static_cast(bit_depth_)); + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvAudio, size)) + return false; + + const int64_t payload_position = writer->Position(); + if (payload_position < 0) + return false; + + if (!WriteEbmlElement(writer, libwebm::kMkvSamplingFrequency, + static_cast(sample_rate_))) + return false; + if (!WriteEbmlElement(writer, libwebm::kMkvChannels, + static_cast(channels_))) + return false; + if (bit_depth_ > 0) + if (!WriteEbmlElement(writer, libwebm::kMkvBitDepth, + static_cast(bit_depth_))) + return false; + + const int64_t stop_position = writer->Position(); + if (stop_position < 0 || + stop_position - payload_position != static_cast(size)) + return false; + + return true; +} + +/////////////////////////////////////////////////////////////// +// +// Tracks Class + +const char Tracks::kOpusCodecId[] = "A_OPUS"; +const char Tracks::kVorbisCodecId[] = "A_VORBIS"; +const char Tracks::kAv1CodecId[] = "V_AV1"; +const char Tracks::kVp8CodecId[] = "V_VP8"; +const char Tracks::kVp9CodecId[] = "V_VP9"; +const char Tracks::kWebVttCaptionsId[] = "D_WEBVTT/CAPTIONS"; +const char Tracks::kWebVttDescriptionsId[] = "D_WEBVTT/DESCRIPTIONS"; +const char Tracks::kWebVttMetadataId[] = "D_WEBVTT/METADATA"; +const char Tracks::kWebVttSubtitlesId[] = "D_WEBVTT/SUBTITLES"; + +Tracks::Tracks() + : track_entries_(NULL), track_entries_size_(0), wrote_tracks_(false) {} + +Tracks::~Tracks() { + if (track_entries_) { + for (uint32_t i = 0; i < track_entries_size_; ++i) { + Track* const track = track_entries_[i]; + delete track; + } + delete[] track_entries_; + } +} + +bool Tracks::AddTrack(Track* track, int32_t number) { + if (number < 0 || wrote_tracks_) + return false; + + // This muxer only supports track numbers in the range [1, 126], in + // order to be able (to use Matroska integer representation) to + // serialize the block header (of which the track number is a part) + // for a frame using exactly 4 bytes. + + if (number > 0x7E) + return false; + + uint32_t track_num = number; + + if (track_num > 0) { + // Check to make sure a track does not already have |track_num|. + for (uint32_t i = 0; i < track_entries_size_; ++i) { + if (track_entries_[i]->number() == track_num) + return false; + } + } + + const uint32_t count = track_entries_size_ + 1; + + Track** const track_entries = new (std::nothrow) Track*[count]; // NOLINT + if (!track_entries) + return false; + + for (uint32_t i = 0; i < track_entries_size_; ++i) { + track_entries[i] = track_entries_[i]; + } + + delete[] track_entries_; + + // Find the lowest availible track number > 0. + if (track_num == 0) { + track_num = count; + + // Check to make sure a track does not already have |track_num|. + bool exit = false; + do { + exit = true; + for (uint32_t i = 0; i < track_entries_size_; ++i) { + if (track_entries[i]->number() == track_num) { + track_num++; + exit = false; + break; + } + } + } while (!exit); + } + track->set_number(track_num); + + track_entries_ = track_entries; + track_entries_[track_entries_size_] = track; + track_entries_size_ = count; + return true; +} + +const Track* Tracks::GetTrackByIndex(uint32_t index) const { + if (track_entries_ == NULL) + return NULL; + + if (index >= track_entries_size_) + return NULL; + + return track_entries_[index]; +} + +Track* Tracks::GetTrackByNumber(uint64_t track_number) const { + const int32_t count = track_entries_size(); + for (int32_t i = 0; i < count; ++i) { + if (track_entries_[i]->number() == track_number) + return track_entries_[i]; + } + + return NULL; +} + +bool Tracks::TrackIsAudio(uint64_t track_number) const { + const Track* const track = GetTrackByNumber(track_number); + + if (track->type() == kAudio) + return true; + + return false; +} + +bool Tracks::TrackIsVideo(uint64_t track_number) const { + const Track* const track = GetTrackByNumber(track_number); + + if (track->type() == kVideo) + return true; + + return false; +} + +bool Tracks::Write(IMkvWriter* writer) const { + uint64_t size = 0; + const int32_t count = track_entries_size(); + for (int32_t i = 0; i < count; ++i) { + const Track* const track = GetTrackByIndex(i); + + if (!track) + return false; + + size += track->Size(); + } + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvTracks, size)) + return false; + + const int64_t payload_position = writer->Position(); + if (payload_position < 0) + return false; + + for (int32_t i = 0; i < count; ++i) { + const Track* const track = GetTrackByIndex(i); + if (!track->Write(writer)) + return false; + } + + const int64_t stop_position = writer->Position(); + if (stop_position < 0 || + stop_position - payload_position != static_cast(size)) + return false; + + wrote_tracks_ = true; + return true; +} + +/////////////////////////////////////////////////////////////// +// +// Chapter Class + +bool Chapter::set_id(const char* id) { return StrCpy(id, &id_); } + +void Chapter::set_time(const Segment& segment, uint64_t start_ns, + uint64_t end_ns) { + const SegmentInfo* const info = segment.GetSegmentInfo(); + const uint64_t timecode_scale = info->timecode_scale(); + start_timecode_ = start_ns / timecode_scale; + end_timecode_ = end_ns / timecode_scale; +} + +bool Chapter::add_string(const char* title, const char* language, + const char* country) { + if (!ExpandDisplaysArray()) + return false; + + Display& d = displays_[displays_count_++]; + d.Init(); + + if (!d.set_title(title)) + return false; + + if (!d.set_language(language)) + return false; + + if (!d.set_country(country)) + return false; + + return true; +} + +Chapter::Chapter() { + // This ctor only constructs the object. Proper initialization is + // done in Init() (called in Chapters::AddChapter()). The only + // reason we bother implementing this ctor is because we had to + // declare it as private (along with the dtor), in order to prevent + // clients from creating Chapter instances (a privelege we grant + // only to the Chapters class). Doing no initialization here also + // means that creating arrays of chapter objects is more efficient, + // because we only initialize each new chapter object as it becomes + // active on the array. +} + +Chapter::~Chapter() {} + +void Chapter::Init(unsigned int* seed) { + id_ = NULL; + start_timecode_ = 0; + end_timecode_ = 0; + displays_ = NULL; + displays_size_ = 0; + displays_count_ = 0; + uid_ = MakeUID(seed); +} + +void Chapter::ShallowCopy(Chapter* dst) const { + dst->id_ = id_; + dst->start_timecode_ = start_timecode_; + dst->end_timecode_ = end_timecode_; + dst->uid_ = uid_; + dst->displays_ = displays_; + dst->displays_size_ = displays_size_; + dst->displays_count_ = displays_count_; +} + +void Chapter::Clear() { + StrCpy(NULL, &id_); + + while (displays_count_ > 0) { + Display& d = displays_[--displays_count_]; + d.Clear(); + } + + delete[] displays_; + displays_ = NULL; + + displays_size_ = 0; +} + +bool Chapter::ExpandDisplaysArray() { + if (displays_size_ > displays_count_) + return true; // nothing to do yet + + const int size = (displays_size_ == 0) ? 1 : 2 * displays_size_; + + Display* const displays = new (std::nothrow) Display[size]; // NOLINT + if (displays == NULL) + return false; + + for (int idx = 0; idx < displays_count_; ++idx) { + displays[idx] = displays_[idx]; // shallow copy + } + + delete[] displays_; + + displays_ = displays; + displays_size_ = size; + + return true; +} + +uint64_t Chapter::WriteAtom(IMkvWriter* writer) const { + uint64_t payload_size = + EbmlElementSize(libwebm::kMkvChapterStringUID, id_) + + EbmlElementSize(libwebm::kMkvChapterUID, static_cast(uid_)) + + EbmlElementSize(libwebm::kMkvChapterTimeStart, + static_cast(start_timecode_)) + + EbmlElementSize(libwebm::kMkvChapterTimeEnd, + static_cast(end_timecode_)); + + for (int idx = 0; idx < displays_count_; ++idx) { + const Display& d = displays_[idx]; + payload_size += d.WriteDisplay(NULL); + } + + const uint64_t atom_size = + EbmlMasterElementSize(libwebm::kMkvChapterAtom, payload_size) + + payload_size; + + if (writer == NULL) + return atom_size; + + const int64_t start = writer->Position(); + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvChapterAtom, payload_size)) + return 0; + + if (!WriteEbmlElement(writer, libwebm::kMkvChapterStringUID, id_)) + return 0; + + if (!WriteEbmlElement(writer, libwebm::kMkvChapterUID, + static_cast(uid_))) + return 0; + + if (!WriteEbmlElement(writer, libwebm::kMkvChapterTimeStart, + static_cast(start_timecode_))) + return 0; + + if (!WriteEbmlElement(writer, libwebm::kMkvChapterTimeEnd, + static_cast(end_timecode_))) + return 0; + + for (int idx = 0; idx < displays_count_; ++idx) { + const Display& d = displays_[idx]; + + if (!d.WriteDisplay(writer)) + return 0; + } + + const int64_t stop = writer->Position(); + + if (stop >= start && uint64_t(stop - start) != atom_size) + return 0; + + return atom_size; +} + +void Chapter::Display::Init() { + title_ = NULL; + language_ = NULL; + country_ = NULL; +} + +void Chapter::Display::Clear() { + StrCpy(NULL, &title_); + StrCpy(NULL, &language_); + StrCpy(NULL, &country_); +} + +bool Chapter::Display::set_title(const char* title) { + return StrCpy(title, &title_); +} + +bool Chapter::Display::set_language(const char* language) { + return StrCpy(language, &language_); +} + +bool Chapter::Display::set_country(const char* country) { + return StrCpy(country, &country_); +} + +uint64_t Chapter::Display::WriteDisplay(IMkvWriter* writer) const { + uint64_t payload_size = EbmlElementSize(libwebm::kMkvChapString, title_); + + if (language_) + payload_size += EbmlElementSize(libwebm::kMkvChapLanguage, language_); + + if (country_) + payload_size += EbmlElementSize(libwebm::kMkvChapCountry, country_); + + const uint64_t display_size = + EbmlMasterElementSize(libwebm::kMkvChapterDisplay, payload_size) + + payload_size; + + if (writer == NULL) + return display_size; + + const int64_t start = writer->Position(); + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvChapterDisplay, + payload_size)) + return 0; + + if (!WriteEbmlElement(writer, libwebm::kMkvChapString, title_)) + return 0; + + if (language_) { + if (!WriteEbmlElement(writer, libwebm::kMkvChapLanguage, language_)) + return 0; + } + + if (country_) { + if (!WriteEbmlElement(writer, libwebm::kMkvChapCountry, country_)) + return 0; + } + + const int64_t stop = writer->Position(); + + if (stop >= start && uint64_t(stop - start) != display_size) + return 0; + + return display_size; +} + +/////////////////////////////////////////////////////////////// +// +// Chapters Class + +Chapters::Chapters() : chapters_size_(0), chapters_count_(0), chapters_(NULL) {} + +Chapters::~Chapters() { + while (chapters_count_ > 0) { + Chapter& chapter = chapters_[--chapters_count_]; + chapter.Clear(); + } + + delete[] chapters_; + chapters_ = NULL; +} + +int Chapters::Count() const { return chapters_count_; } + +Chapter* Chapters::AddChapter(unsigned int* seed) { + if (!ExpandChaptersArray()) + return NULL; + + Chapter& chapter = chapters_[chapters_count_++]; + chapter.Init(seed); + + return &chapter; +} + +bool Chapters::Write(IMkvWriter* writer) const { + if (writer == NULL) + return false; + + const uint64_t payload_size = WriteEdition(NULL); // return size only + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvChapters, payload_size)) + return false; + + const int64_t start = writer->Position(); + + if (WriteEdition(writer) == 0) // error + return false; + + const int64_t stop = writer->Position(); + + if (stop >= start && uint64_t(stop - start) != payload_size) + return false; + + return true; +} + +bool Chapters::ExpandChaptersArray() { + if (chapters_size_ > chapters_count_) + return true; // nothing to do yet + + const int size = (chapters_size_ == 0) ? 1 : 2 * chapters_size_; + + Chapter* const chapters = new (std::nothrow) Chapter[size]; // NOLINT + if (chapters == NULL) + return false; + + for (int idx = 0; idx < chapters_count_; ++idx) { + const Chapter& src = chapters_[idx]; + Chapter* const dst = chapters + idx; + src.ShallowCopy(dst); + } + + delete[] chapters_; + + chapters_ = chapters; + chapters_size_ = size; + + return true; +} + +uint64_t Chapters::WriteEdition(IMkvWriter* writer) const { + uint64_t payload_size = 0; + + for (int idx = 0; idx < chapters_count_; ++idx) { + const Chapter& chapter = chapters_[idx]; + payload_size += chapter.WriteAtom(NULL); + } + + const uint64_t edition_size = + EbmlMasterElementSize(libwebm::kMkvEditionEntry, payload_size) + + payload_size; + + if (writer == NULL) // return size only + return edition_size; + + const int64_t start = writer->Position(); + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvEditionEntry, payload_size)) + return 0; // error + + for (int idx = 0; idx < chapters_count_; ++idx) { + const Chapter& chapter = chapters_[idx]; + + const uint64_t chapter_size = chapter.WriteAtom(writer); + if (chapter_size == 0) // error + return 0; + } + + const int64_t stop = writer->Position(); + + if (stop >= start && uint64_t(stop - start) != edition_size) + return 0; + + return edition_size; +} + +// Tag Class + +bool Tag::add_simple_tag(const char* tag_name, const char* tag_string) { + if (!ExpandSimpleTagsArray()) + return false; + + SimpleTag& st = simple_tags_[simple_tags_count_++]; + st.Init(); + + if (!st.set_tag_name(tag_name)) + return false; + + if (!st.set_tag_string(tag_string)) + return false; + + return true; +} + +Tag::Tag() { + simple_tags_ = NULL; + simple_tags_size_ = 0; + simple_tags_count_ = 0; +} + +Tag::~Tag() {} + +void Tag::ShallowCopy(Tag* dst) const { + dst->simple_tags_ = simple_tags_; + dst->simple_tags_size_ = simple_tags_size_; + dst->simple_tags_count_ = simple_tags_count_; +} + +void Tag::Clear() { + while (simple_tags_count_ > 0) { + SimpleTag& st = simple_tags_[--simple_tags_count_]; + st.Clear(); + } + + delete[] simple_tags_; + simple_tags_ = NULL; + + simple_tags_size_ = 0; +} + +bool Tag::ExpandSimpleTagsArray() { + if (simple_tags_size_ > simple_tags_count_) + return true; // nothing to do yet + + const int size = (simple_tags_size_ == 0) ? 1 : 2 * simple_tags_size_; + + SimpleTag* const simple_tags = new (std::nothrow) SimpleTag[size]; // NOLINT + if (simple_tags == NULL) + return false; + + for (int idx = 0; idx < simple_tags_count_; ++idx) { + simple_tags[idx] = simple_tags_[idx]; // shallow copy + } + + delete[] simple_tags_; + + simple_tags_ = simple_tags; + simple_tags_size_ = size; + + return true; +} + +uint64_t Tag::Write(IMkvWriter* writer) const { + uint64_t payload_size = 0; + + for (int idx = 0; idx < simple_tags_count_; ++idx) { + const SimpleTag& st = simple_tags_[idx]; + payload_size += st.Write(NULL); + } + + const uint64_t tag_size = + EbmlMasterElementSize(libwebm::kMkvTag, payload_size) + payload_size; + + if (writer == NULL) + return tag_size; + + const int64_t start = writer->Position(); + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvTag, payload_size)) + return 0; + + for (int idx = 0; idx < simple_tags_count_; ++idx) { + const SimpleTag& st = simple_tags_[idx]; + + if (!st.Write(writer)) + return 0; + } + + const int64_t stop = writer->Position(); + + if (stop >= start && uint64_t(stop - start) != tag_size) + return 0; + + return tag_size; +} + +// Tag::SimpleTag + +void Tag::SimpleTag::Init() { + tag_name_ = NULL; + tag_string_ = NULL; +} + +void Tag::SimpleTag::Clear() { + StrCpy(NULL, &tag_name_); + StrCpy(NULL, &tag_string_); +} + +bool Tag::SimpleTag::set_tag_name(const char* tag_name) { + return StrCpy(tag_name, &tag_name_); +} + +bool Tag::SimpleTag::set_tag_string(const char* tag_string) { + return StrCpy(tag_string, &tag_string_); +} + +uint64_t Tag::SimpleTag::Write(IMkvWriter* writer) const { + uint64_t payload_size = EbmlElementSize(libwebm::kMkvTagName, tag_name_); + + payload_size += EbmlElementSize(libwebm::kMkvTagString, tag_string_); + + const uint64_t simple_tag_size = + EbmlMasterElementSize(libwebm::kMkvSimpleTag, payload_size) + + payload_size; + + if (writer == NULL) + return simple_tag_size; + + const int64_t start = writer->Position(); + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvSimpleTag, payload_size)) + return 0; + + if (!WriteEbmlElement(writer, libwebm::kMkvTagName, tag_name_)) + return 0; + + if (!WriteEbmlElement(writer, libwebm::kMkvTagString, tag_string_)) + return 0; + + const int64_t stop = writer->Position(); + + if (stop >= start && uint64_t(stop - start) != simple_tag_size) + return 0; + + return simple_tag_size; +} + +// Tags Class + +Tags::Tags() : tags_size_(0), tags_count_(0), tags_(NULL) {} + +Tags::~Tags() { + while (tags_count_ > 0) { + Tag& tag = tags_[--tags_count_]; + tag.Clear(); + } + + delete[] tags_; + tags_ = NULL; +} + +int Tags::Count() const { return tags_count_; } + +Tag* Tags::AddTag() { + if (!ExpandTagsArray()) + return NULL; + + Tag& tag = tags_[tags_count_++]; + + return &tag; +} + +bool Tags::Write(IMkvWriter* writer) const { + if (writer == NULL) + return false; + + uint64_t payload_size = 0; + + for (int idx = 0; idx < tags_count_; ++idx) { + const Tag& tag = tags_[idx]; + payload_size += tag.Write(NULL); + } + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvTags, payload_size)) + return false; + + const int64_t start = writer->Position(); + + for (int idx = 0; idx < tags_count_; ++idx) { + const Tag& tag = tags_[idx]; + + const uint64_t tag_size = tag.Write(writer); + if (tag_size == 0) // error + return 0; + } + + const int64_t stop = writer->Position(); + + if (stop >= start && uint64_t(stop - start) != payload_size) + return false; + + return true; +} + +bool Tags::ExpandTagsArray() { + if (tags_size_ > tags_count_) + return true; // nothing to do yet + + const int size = (tags_size_ == 0) ? 1 : 2 * tags_size_; + + Tag* const tags = new (std::nothrow) Tag[size]; // NOLINT + if (tags == NULL) + return false; + + for (int idx = 0; idx < tags_count_; ++idx) { + const Tag& src = tags_[idx]; + Tag* const dst = tags + idx; + src.ShallowCopy(dst); + } + + delete[] tags_; + + tags_ = tags; + tags_size_ = size; + + return true; +} + +/////////////////////////////////////////////////////////////// +// +// Cluster class + +Cluster::Cluster(uint64_t timecode, int64_t cues_pos, uint64_t timecode_scale, + bool write_last_frame_with_duration, bool fixed_size_timecode) + : blocks_added_(0), + finalized_(false), + fixed_size_timecode_(fixed_size_timecode), + header_written_(false), + payload_size_(0), + position_for_cues_(cues_pos), + size_position_(-1), + timecode_(timecode), + timecode_scale_(timecode_scale), + write_last_frame_with_duration_(write_last_frame_with_duration), + writer_(NULL) {} + +Cluster::~Cluster() { + // Delete any stored frames that are left behind. This will happen if the + // Cluster was not Finalized for whatever reason. + while (!stored_frames_.empty()) { + while (!stored_frames_.begin()->second.empty()) { + delete stored_frames_.begin()->second.front(); + stored_frames_.begin()->second.pop_front(); + } + stored_frames_.erase(stored_frames_.begin()->first); + } +} + +bool Cluster::Init(IMkvWriter* ptr_writer) { + if (!ptr_writer) { + return false; + } + writer_ = ptr_writer; + return true; +} + +bool Cluster::AddFrame(const Frame* const frame) { + return QueueOrWriteFrame(frame); +} + +bool Cluster::AddFrame(const uint8_t* data, uint64_t length, + uint64_t track_number, uint64_t abs_timecode, + bool is_key) { + Frame frame; + if (!frame.Init(data, length)) + return false; + frame.set_track_number(track_number); + frame.set_timestamp(abs_timecode); + frame.set_is_key(is_key); + return QueueOrWriteFrame(&frame); +} + +bool Cluster::AddFrameWithAdditional(const uint8_t* data, uint64_t length, + const uint8_t* additional, + uint64_t additional_length, + uint64_t add_id, uint64_t track_number, + uint64_t abs_timecode, bool is_key) { + if (!additional || additional_length == 0) { + return false; + } + Frame frame; + if (!frame.Init(data, length) || + !frame.AddAdditionalData(additional, additional_length, add_id)) { + return false; + } + frame.set_track_number(track_number); + frame.set_timestamp(abs_timecode); + frame.set_is_key(is_key); + return QueueOrWriteFrame(&frame); +} + +bool Cluster::AddFrameWithDiscardPadding(const uint8_t* data, uint64_t length, + int64_t discard_padding, + uint64_t track_number, + uint64_t abs_timecode, bool is_key) { + Frame frame; + if (!frame.Init(data, length)) + return false; + frame.set_discard_padding(discard_padding); + frame.set_track_number(track_number); + frame.set_timestamp(abs_timecode); + frame.set_is_key(is_key); + return QueueOrWriteFrame(&frame); +} + +bool Cluster::AddMetadata(const uint8_t* data, uint64_t length, + uint64_t track_number, uint64_t abs_timecode, + uint64_t duration_timecode) { + Frame frame; + if (!frame.Init(data, length)) + return false; + frame.set_track_number(track_number); + frame.set_timestamp(abs_timecode); + frame.set_duration(duration_timecode); + frame.set_is_key(true); // All metadata blocks are keyframes. + return QueueOrWriteFrame(&frame); +} + +void Cluster::AddPayloadSize(uint64_t size) { payload_size_ += size; } + +bool Cluster::Finalize() { + return !write_last_frame_with_duration_ && Finalize(false, 0); +} + +bool Cluster::Finalize(bool set_last_frame_duration, uint64_t duration) { + if (!writer_ || finalized_) + return false; + + if (write_last_frame_with_duration_) { + // Write out held back Frames. This essentially performs a k-way merge + // across all tracks in the increasing order of timestamps. + while (!stored_frames_.empty()) { + Frame* frame = stored_frames_.begin()->second.front(); + + // Get the next frame to write (frame with least timestamp across all + // tracks). + for (FrameMapIterator frames_iterator = ++stored_frames_.begin(); + frames_iterator != stored_frames_.end(); ++frames_iterator) { + if (frames_iterator->second.front()->timestamp() < frame->timestamp()) { + frame = frames_iterator->second.front(); + } + } + + // Set the duration if it's the last frame for the track. + if (set_last_frame_duration && + stored_frames_[frame->track_number()].size() == 1 && + !frame->duration_set()) { + frame->set_duration(duration - frame->timestamp()); + if (!frame->is_key() && !frame->reference_block_timestamp_set()) { + frame->set_reference_block_timestamp( + last_block_timestamp_[frame->track_number()]); + } + } + + // Write the frame and remove it from |stored_frames_|. + const bool wrote_frame = DoWriteFrame(frame); + stored_frames_[frame->track_number()].pop_front(); + if (stored_frames_[frame->track_number()].empty()) { + stored_frames_.erase(frame->track_number()); + } + delete frame; + if (!wrote_frame) + return false; + } + } + + if (size_position_ == -1) + return false; + + if (writer_->Seekable()) { + const int64_t pos = writer_->Position(); + + if (writer_->Position(size_position_)) + return false; + + if (WriteUIntSize(writer_, payload_size(), 8)) + return false; + + if (writer_->Position(pos)) + return false; + } + + finalized_ = true; + + return true; +} + +uint64_t Cluster::Size() const { + const uint64_t element_size = + EbmlMasterElementSize(libwebm::kMkvCluster, 0xFFFFFFFFFFFFFFFFULL) + + payload_size_; + return element_size; +} + +bool Cluster::PreWriteBlock() { + if (finalized_) + return false; + + if (!header_written_) { + if (!WriteClusterHeader()) + return false; + } + + return true; +} + +void Cluster::PostWriteBlock(uint64_t element_size) { + AddPayloadSize(element_size); + ++blocks_added_; +} + +int64_t Cluster::GetRelativeTimecode(int64_t abs_timecode) const { + const int64_t cluster_timecode = this->Cluster::timecode(); + const int64_t rel_timecode = + static_cast(abs_timecode) - cluster_timecode; + + if (rel_timecode < 0 || rel_timecode > kMaxBlockTimecode) + return -1; + + return rel_timecode; +} + +bool Cluster::DoWriteFrame(const Frame* const frame) { + if (!frame || !frame->IsValid()) + return false; + + if (!PreWriteBlock()) + return false; + + const uint64_t element_size = WriteFrame(writer_, frame, this); + if (element_size == 0) + return false; + + PostWriteBlock(element_size); + last_block_timestamp_[frame->track_number()] = frame->timestamp(); + return true; +} + +bool Cluster::QueueOrWriteFrame(const Frame* const frame) { + if (!frame || !frame->IsValid()) + return false; + + // If |write_last_frame_with_duration_| is not set, then write the frame right + // away. + if (!write_last_frame_with_duration_) { + return DoWriteFrame(frame); + } + + // Queue the current frame. + uint64_t track_number = frame->track_number(); + Frame* const frame_to_store = new Frame(); + frame_to_store->CopyFrom(*frame); + stored_frames_[track_number].push_back(frame_to_store); + + // Iterate through all queued frames in the current track except the last one + // and write it if it is okay to do so (i.e.) no other track has an held back + // frame with timestamp <= the timestamp of the frame in question. + std::vector::iterator> frames_to_erase; + for (std::list::iterator + current_track_iterator = stored_frames_[track_number].begin(), + end = --stored_frames_[track_number].end(); + current_track_iterator != end; ++current_track_iterator) { + const Frame* const frame_to_write = *current_track_iterator; + bool okay_to_write = true; + for (FrameMapIterator track_iterator = stored_frames_.begin(); + track_iterator != stored_frames_.end(); ++track_iterator) { + if (track_iterator->first == track_number) { + continue; + } + if (track_iterator->second.front()->timestamp() < + frame_to_write->timestamp()) { + okay_to_write = false; + break; + } + } + if (okay_to_write) { + const bool wrote_frame = DoWriteFrame(frame_to_write); + delete frame_to_write; + if (!wrote_frame) + return false; + frames_to_erase.push_back(current_track_iterator); + } else { + break; + } + } + for (std::vector::iterator>::iterator iterator = + frames_to_erase.begin(); + iterator != frames_to_erase.end(); ++iterator) { + stored_frames_[track_number].erase(*iterator); + } + return true; +} + +bool Cluster::WriteClusterHeader() { + if (finalized_) + return false; + + if (WriteID(writer_, libwebm::kMkvCluster)) + return false; + + // Save for later. + size_position_ = writer_->Position(); + + // Write "unknown" (EBML coded -1) as cluster size value. We need to write 8 + // bytes because we do not know how big our cluster will be. + if (SerializeInt(writer_, kEbmlUnknownValue, 8)) + return false; + + if (!WriteEbmlElement(writer_, libwebm::kMkvTimecode, timecode(), + fixed_size_timecode_ ? 8 : 0)) { + return false; + } + AddPayloadSize(EbmlElementSize(libwebm::kMkvTimecode, timecode(), + fixed_size_timecode_ ? 8 : 0)); + header_written_ = true; + + return true; +} + +/////////////////////////////////////////////////////////////// +// +// SeekHead Class + +SeekHead::SeekHead() : start_pos_(0ULL) { + for (int32_t i = 0; i < kSeekEntryCount; ++i) { + seek_entry_id_[i] = 0; + seek_entry_pos_[i] = 0; + } +} + +SeekHead::~SeekHead() {} + +bool SeekHead::Finalize(IMkvWriter* writer) const { + if (writer->Seekable()) { + if (start_pos_ == -1) + return false; + + uint64_t payload_size = 0; + uint64_t entry_size[kSeekEntryCount]; + + for (int32_t i = 0; i < kSeekEntryCount; ++i) { + if (seek_entry_id_[i] != 0) { + entry_size[i] = EbmlElementSize(libwebm::kMkvSeekID, + static_cast(seek_entry_id_[i])); + entry_size[i] += EbmlElementSize( + libwebm::kMkvSeekPosition, static_cast(seek_entry_pos_[i])); + + payload_size += + EbmlMasterElementSize(libwebm::kMkvSeek, entry_size[i]) + + entry_size[i]; + } + } + + // No SeekHead elements + if (payload_size == 0) + return true; + + const int64_t pos = writer->Position(); + if (writer->Position(start_pos_)) + return false; + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvSeekHead, payload_size)) + return false; + + for (int32_t i = 0; i < kSeekEntryCount; ++i) { + if (seek_entry_id_[i] != 0) { + if (!WriteEbmlMasterElement(writer, libwebm::kMkvSeek, entry_size[i])) + return false; + + if (!WriteEbmlElement(writer, libwebm::kMkvSeekID, + static_cast(seek_entry_id_[i]))) + return false; + + if (!WriteEbmlElement(writer, libwebm::kMkvSeekPosition, + static_cast(seek_entry_pos_[i]))) + return false; + } + } + + const uint64_t total_entry_size = kSeekEntryCount * MaxEntrySize(); + const uint64_t total_size = + EbmlMasterElementSize(libwebm::kMkvSeekHead, total_entry_size) + + total_entry_size; + const int64_t size_left = total_size - (writer->Position() - start_pos_); + + const uint64_t bytes_written = WriteVoidElement(writer, size_left); + if (!bytes_written) + return false; + + if (writer->Position(pos)) + return false; + } + + return true; +} + +bool SeekHead::Write(IMkvWriter* writer) { + const uint64_t entry_size = kSeekEntryCount * MaxEntrySize(); + const uint64_t size = + EbmlMasterElementSize(libwebm::kMkvSeekHead, entry_size); + + start_pos_ = writer->Position(); + + const uint64_t bytes_written = WriteVoidElement(writer, size + entry_size); + if (!bytes_written) + return false; + + return true; +} + +bool SeekHead::AddSeekEntry(uint32_t id, uint64_t pos) { + for (int32_t i = 0; i < kSeekEntryCount; ++i) { + if (seek_entry_id_[i] == 0) { + seek_entry_id_[i] = id; + seek_entry_pos_[i] = pos; + return true; + } + } + return false; +} + +uint32_t SeekHead::GetId(int index) const { + if (index < 0 || index >= kSeekEntryCount) + return UINT32_MAX; + return seek_entry_id_[index]; +} + +uint64_t SeekHead::GetPosition(int index) const { + if (index < 0 || index >= kSeekEntryCount) + return UINT64_MAX; + return seek_entry_pos_[index]; +} + +bool SeekHead::SetSeekEntry(int index, uint32_t id, uint64_t position) { + if (index < 0 || index >= kSeekEntryCount) + return false; + seek_entry_id_[index] = id; + seek_entry_pos_[index] = position; + return true; +} + +uint64_t SeekHead::MaxEntrySize() const { + const uint64_t max_entry_payload_size = + EbmlElementSize(libwebm::kMkvSeekID, + static_cast(UINT64_C(0xffffffff))) + + EbmlElementSize(libwebm::kMkvSeekPosition, + static_cast(UINT64_C(0xffffffffffffffff))); + const uint64_t max_entry_size = + EbmlMasterElementSize(libwebm::kMkvSeek, max_entry_payload_size) + + max_entry_payload_size; + + return max_entry_size; +} + +/////////////////////////////////////////////////////////////// +// +// SegmentInfo Class + +SegmentInfo::SegmentInfo() + : duration_(-1.0), + muxing_app_(NULL), + timecode_scale_(1000000ULL), + writing_app_(NULL), + date_utc_(INT64_MIN), + duration_pos_(-1) {} + +SegmentInfo::~SegmentInfo() { + delete[] muxing_app_; + delete[] writing_app_; +} + +bool SegmentInfo::Init() { + int32_t major; + int32_t minor; + int32_t build; + int32_t revision; + GetVersion(&major, &minor, &build, &revision); + char temp[256]; +#ifdef _MSC_VER + sprintf_s(temp, sizeof(temp) / sizeof(temp[0]), "libwebm-%d.%d.%d.%d", major, + minor, build, revision); +#else + snprintf(temp, sizeof(temp) / sizeof(temp[0]), "libwebm-%d.%d.%d.%d", major, + minor, build, revision); +#endif + + const size_t app_len = strlen(temp) + 1; + + delete[] muxing_app_; + + muxing_app_ = new (std::nothrow) char[app_len]; // NOLINT + if (!muxing_app_) + return false; + + memcpy(muxing_app_, temp, app_len - 1); + muxing_app_[app_len - 1] = '\0'; + + set_writing_app(temp); + if (!writing_app_) + return false; + return true; +} + +bool SegmentInfo::Finalize(IMkvWriter* writer) const { + if (!writer) + return false; + + if (duration_ > 0.0) { + if (writer->Seekable()) { + if (duration_pos_ == -1) + return false; + + const int64_t pos = writer->Position(); + + if (writer->Position(duration_pos_)) + return false; + + if (!WriteEbmlElement(writer, libwebm::kMkvDuration, + static_cast(duration_))) + return false; + + if (writer->Position(pos)) + return false; + } + } + + return true; +} + +bool SegmentInfo::Write(IMkvWriter* writer) { + if (!writer || !muxing_app_ || !writing_app_) + return false; + + uint64_t size = EbmlElementSize(libwebm::kMkvTimecodeScale, + static_cast(timecode_scale_)); + if (duration_ > 0.0) + size += + EbmlElementSize(libwebm::kMkvDuration, static_cast(duration_)); + if (date_utc_ != INT64_MIN) + size += EbmlDateElementSize(libwebm::kMkvDateUTC); + size += EbmlElementSize(libwebm::kMkvMuxingApp, muxing_app_); + size += EbmlElementSize(libwebm::kMkvWritingApp, writing_app_); + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvInfo, size)) + return false; + + const int64_t payload_position = writer->Position(); + if (payload_position < 0) + return false; + + if (!WriteEbmlElement(writer, libwebm::kMkvTimecodeScale, + static_cast(timecode_scale_))) + return false; + + if (duration_ > 0.0) { + // Save for later + duration_pos_ = writer->Position(); + + if (!WriteEbmlElement(writer, libwebm::kMkvDuration, + static_cast(duration_))) + return false; + } + + if (date_utc_ != INT64_MIN) + WriteEbmlDateElement(writer, libwebm::kMkvDateUTC, date_utc_); + + if (!WriteEbmlElement(writer, libwebm::kMkvMuxingApp, muxing_app_)) + return false; + if (!WriteEbmlElement(writer, libwebm::kMkvWritingApp, writing_app_)) + return false; + + const int64_t stop_position = writer->Position(); + if (stop_position < 0 || + stop_position - payload_position != static_cast(size)) + return false; + + return true; +} + +void SegmentInfo::set_muxing_app(const char* app) { + if (app) { + const size_t length = strlen(app) + 1; + char* temp_str = new (std::nothrow) char[length]; // NOLINT + if (!temp_str) + return; + + memcpy(temp_str, app, length - 1); + temp_str[length - 1] = '\0'; + + delete[] muxing_app_; + muxing_app_ = temp_str; + } +} + +void SegmentInfo::set_writing_app(const char* app) { + if (app) { + const size_t length = strlen(app) + 1; + char* temp_str = new (std::nothrow) char[length]; // NOLINT + if (!temp_str) + return; + + memcpy(temp_str, app, length - 1); + temp_str[length - 1] = '\0'; + + delete[] writing_app_; + writing_app_ = temp_str; + } +} + +/////////////////////////////////////////////////////////////// +// +// Segment Class + +Segment::Segment() + : chunk_count_(0), + chunk_name_(NULL), + chunk_writer_cluster_(NULL), + chunk_writer_cues_(NULL), + chunk_writer_header_(NULL), + chunking_(false), + chunking_base_name_(NULL), + cluster_list_(NULL), + cluster_list_capacity_(0), + cluster_list_size_(0), + cues_position_(kAfterClusters), + cues_track_(0), + force_new_cluster_(false), + frames_(NULL), + frames_capacity_(0), + frames_size_(0), + has_video_(false), + header_written_(false), + last_block_duration_(0), + last_timestamp_(0), + max_cluster_duration_(kDefaultMaxClusterDuration), + max_cluster_size_(0), + mode_(kFile), + new_cuepoint_(false), + output_cues_(true), + accurate_cluster_duration_(false), + fixed_size_cluster_timecode_(false), + estimate_file_duration_(false), + ebml_header_size_(0), + payload_pos_(0), + size_position_(0), + doc_type_version_(kDefaultDocTypeVersion), + doc_type_version_written_(0), + duration_(0.0), + writer_cluster_(NULL), + writer_cues_(NULL), + writer_header_(NULL) { + const time_t curr_time = time(NULL); + seed_ = static_cast(curr_time); +#ifdef _WIN32 + srand(seed_); +#endif +} + +Segment::~Segment() { + if (cluster_list_) { + for (int32_t i = 0; i < cluster_list_size_; ++i) { + Cluster* const cluster = cluster_list_[i]; + delete cluster; + } + delete[] cluster_list_; + } + + if (frames_) { + for (int32_t i = 0; i < frames_size_; ++i) { + Frame* const frame = frames_[i]; + delete frame; + } + delete[] frames_; + } + + delete[] chunk_name_; + delete[] chunking_base_name_; + + if (chunk_writer_cluster_) { + chunk_writer_cluster_->Close(); + delete chunk_writer_cluster_; + } + if (chunk_writer_cues_) { + chunk_writer_cues_->Close(); + delete chunk_writer_cues_; + } + if (chunk_writer_header_) { + chunk_writer_header_->Close(); + delete chunk_writer_header_; + } +} + +void Segment::MoveCuesBeforeClustersHelper(uint64_t diff, int index, + uint64_t* cues_size) { + CuePoint* const cue_point = cues_.GetCueByIndex(index); + if (cue_point == NULL) + return; + const uint64_t old_cue_point_size = cue_point->Size(); + const uint64_t cluster_pos = cue_point->cluster_pos() + diff; + cue_point->set_cluster_pos(cluster_pos); // update the new cluster position + // New size of the cue is computed as follows + // Let a = current sum of size of all CuePoints + // Let b = Increase in Cue Point's size due to this iteration + // Let c = Increase in size of Cues Element's length due to this iteration + // (This is computed as CodedSize(a + b) - CodedSize(a)) + // Let d = b + c. Now d is the |diff| passed to the next recursive call. + // Let e = a + b. Now e is the |cues_size| passed to the next recursive + // call. + const uint64_t cue_point_size_diff = cue_point->Size() - old_cue_point_size; + const uint64_t cue_size_diff = + GetCodedUIntSize(*cues_size + cue_point_size_diff) - + GetCodedUIntSize(*cues_size); + *cues_size += cue_point_size_diff; + diff = cue_size_diff + cue_point_size_diff; + if (diff > 0) { + for (int32_t i = 0; i < cues_.cue_entries_size(); ++i) { + MoveCuesBeforeClustersHelper(diff, i, cues_size); + } + } +} + +void Segment::MoveCuesBeforeClusters() { + const uint64_t current_cue_size = cues_.Size(); + uint64_t cue_size = 0; + for (int32_t i = 0; i < cues_.cue_entries_size(); ++i) + cue_size += cues_.GetCueByIndex(i)->Size(); + for (int32_t i = 0; i < cues_.cue_entries_size(); ++i) + MoveCuesBeforeClustersHelper(current_cue_size, i, &cue_size); + + // Adjust the Seek Entry to reflect the change in position + // of Cluster and Cues + int32_t cluster_index = 0; + int32_t cues_index = 0; + for (int32_t i = 0; i < SeekHead::kSeekEntryCount; ++i) { + if (seek_head_.GetId(i) == libwebm::kMkvCluster) + cluster_index = i; + if (seek_head_.GetId(i) == libwebm::kMkvCues) + cues_index = i; + } + seek_head_.SetSeekEntry(cues_index, libwebm::kMkvCues, + seek_head_.GetPosition(cluster_index)); + seek_head_.SetSeekEntry(cluster_index, libwebm::kMkvCluster, + cues_.Size() + seek_head_.GetPosition(cues_index)); +} + +bool Segment::Init(IMkvWriter* ptr_writer) { + if (!ptr_writer) { + return false; + } + writer_cluster_ = ptr_writer; + writer_cues_ = ptr_writer; + writer_header_ = ptr_writer; + memset(&track_frames_written_, 0, + sizeof(track_frames_written_[0]) * kMaxTrackNumber); + memset(&last_track_timestamp_, 0, + sizeof(last_track_timestamp_[0]) * kMaxTrackNumber); + return segment_info_.Init(); +} + +bool Segment::CopyAndMoveCuesBeforeClusters(mkvparser::IMkvReader* reader, + IMkvWriter* writer) { + if (!writer->Seekable() || chunking_) + return false; + const int64_t cluster_offset = + cluster_list_[0]->size_position() - GetUIntSize(libwebm::kMkvCluster); + + // Copy the headers. + if (!ChunkedCopy(reader, writer, 0, cluster_offset)) + return false; + + // Recompute cue positions and seek entries. + MoveCuesBeforeClusters(); + + // Write cues and seek entries. + // TODO(vigneshv): As of now, it's safe to call seek_head_.Finalize() for the + // second time with a different writer object. But the name Finalize() doesn't + // indicate something we want to call more than once. So consider renaming it + // to write() or some such. + if (!cues_.Write(writer) || !seek_head_.Finalize(writer)) + return false; + + // Copy the Clusters. + if (!ChunkedCopy(reader, writer, cluster_offset, + cluster_end_offset_ - cluster_offset)) + return false; + + // Update the Segment size in case the Cues size has changed. + const int64_t pos = writer->Position(); + const int64_t segment_size = writer->Position() - payload_pos_; + if (writer->Position(size_position_) || + WriteUIntSize(writer, segment_size, 8) || writer->Position(pos)) + return false; + return true; +} + +bool Segment::Finalize() { + if (WriteFramesAll() < 0) + return false; + + // In kLive mode, call Cluster::Finalize only if |accurate_cluster_duration_| + // is set. In all other modes, always call Cluster::Finalize. + if ((mode_ == kLive ? accurate_cluster_duration_ : true) && + cluster_list_size_ > 0) { + // Update last cluster's size + Cluster* const old_cluster = cluster_list_[cluster_list_size_ - 1]; + + // For the last frame of the last Cluster, we don't write it as a BlockGroup + // with Duration unless the frame itself has duration set explicitly. + if (!old_cluster || !old_cluster->Finalize(false, 0)) + return false; + } + + if (mode_ == kFile) { + if (chunking_ && chunk_writer_cluster_) { + chunk_writer_cluster_->Close(); + chunk_count_++; + } + + double duration = + (static_cast(last_timestamp_) + last_block_duration_) / + segment_info_.timecode_scale(); + if (duration_ > 0.0) { + duration = duration_; + } else { + if (last_block_duration_ == 0 && estimate_file_duration_) { + const int num_tracks = static_cast(tracks_.track_entries_size()); + for (int i = 0; i < num_tracks; ++i) { + if (track_frames_written_[i] < 2) + continue; + + // Estimate the duration for the last block of a Track. + const double nano_per_frame = + static_cast(last_track_timestamp_[i]) / + (track_frames_written_[i] - 1); + const double track_duration = + (last_track_timestamp_[i] + nano_per_frame) / + segment_info_.timecode_scale(); + if (track_duration > duration) + duration = track_duration; + } + } + } + segment_info_.set_duration(duration); + if (!segment_info_.Finalize(writer_header_)) + return false; + + if (output_cues_) + if (!seek_head_.AddSeekEntry(libwebm::kMkvCues, MaxOffset())) + return false; + + if (chunking_) { + if (!chunk_writer_cues_) + return false; + + char* name = NULL; + if (!UpdateChunkName("cues", &name)) + return false; + + const bool cues_open = chunk_writer_cues_->Open(name); + delete[] name; + if (!cues_open) + return false; + } + + cluster_end_offset_ = writer_cluster_->Position(); + + // Write the seek headers and cues + if (output_cues_) + if (!cues_.Write(writer_cues_)) + return false; + + if (!seek_head_.Finalize(writer_header_)) + return false; + + if (writer_header_->Seekable()) { + if (size_position_ == -1) + return false; + + const int64_t segment_size = MaxOffset(); + if (segment_size < 1) + return false; + + const int64_t pos = writer_header_->Position(); + UpdateDocTypeVersion(); + if (doc_type_version_ != doc_type_version_written_) { + if (writer_header_->Position(0)) + return false; + + const char* const doc_type = + DocTypeIsWebm() ? kDocTypeWebm : kDocTypeMatroska; + if (!WriteEbmlHeader(writer_header_, doc_type_version_, doc_type)) + return false; + if (writer_header_->Position() != ebml_header_size_) + return false; + + doc_type_version_written_ = doc_type_version_; + } + + if (writer_header_->Position(size_position_)) + return false; + + if (WriteUIntSize(writer_header_, segment_size, 8)) + return false; + + if (writer_header_->Position(pos)) + return false; + } + + if (chunking_) { + // Do not close any writers until the segment size has been written, + // otherwise the size may be off. + if (!chunk_writer_cues_ || !chunk_writer_header_) + return false; + + chunk_writer_cues_->Close(); + chunk_writer_header_->Close(); + } + } + + return true; +} + +Track* Segment::AddTrack(int32_t number) { + Track* const track = new (std::nothrow) Track(&seed_); // NOLINT + + if (!track) + return NULL; + + if (!tracks_.AddTrack(track, number)) { + delete track; + return NULL; + } + + return track; +} + +Chapter* Segment::AddChapter() { return chapters_.AddChapter(&seed_); } + +Tag* Segment::AddTag() { return tags_.AddTag(); } + +uint64_t Segment::AddVideoTrack(int32_t width, int32_t height, int32_t number) { + VideoTrack* const track = new (std::nothrow) VideoTrack(&seed_); // NOLINT + if (!track) + return 0; + + track->set_type(Tracks::kVideo); + track->set_codec_id(Tracks::kVp8CodecId); + track->set_width(width); + track->set_height(height); + + if (!tracks_.AddTrack(track, number)) { + delete track; + return 0; + } + has_video_ = true; + + return track->number(); +} + +bool Segment::AddCuePoint(uint64_t timestamp, uint64_t track) { + if (cluster_list_size_ < 1) + return false; + + const Cluster* const cluster = cluster_list_[cluster_list_size_ - 1]; + if (!cluster) + return false; + + CuePoint* const cue = new (std::nothrow) CuePoint(); // NOLINT + if (!cue) + return false; + + cue->set_time(timestamp / segment_info_.timecode_scale()); + cue->set_block_number(cluster->blocks_added()); + cue->set_cluster_pos(cluster->position_for_cues()); + cue->set_track(track); + if (!cues_.AddCue(cue)) { + delete cue; + return false; + } + + new_cuepoint_ = false; + return true; +} + +uint64_t Segment::AddAudioTrack(int32_t sample_rate, int32_t channels, + int32_t number) { + AudioTrack* const track = new (std::nothrow) AudioTrack(&seed_); // NOLINT + if (!track) + return 0; + + track->set_type(Tracks::kAudio); + track->set_codec_id(Tracks::kVorbisCodecId); + track->set_sample_rate(sample_rate); + track->set_channels(channels); + + if (!tracks_.AddTrack(track, number)) { + delete track; + return 0; + } + + return track->number(); +} + +bool Segment::AddFrame(const uint8_t* data, uint64_t length, + uint64_t track_number, uint64_t timestamp, bool is_key) { + if (!data) + return false; + + Frame frame; + if (!frame.Init(data, length)) + return false; + frame.set_track_number(track_number); + frame.set_timestamp(timestamp); + frame.set_is_key(is_key); + return AddGenericFrame(&frame); +} + +bool Segment::AddFrameWithAdditional(const uint8_t* data, uint64_t length, + const uint8_t* additional, + uint64_t additional_length, + uint64_t add_id, uint64_t track_number, + uint64_t timestamp, bool is_key) { + if (!data || !additional) + return false; + + Frame frame; + if (!frame.Init(data, length) || + !frame.AddAdditionalData(additional, additional_length, add_id)) { + return false; + } + frame.set_track_number(track_number); + frame.set_timestamp(timestamp); + frame.set_is_key(is_key); + return AddGenericFrame(&frame); +} + +bool Segment::AddFrameWithDiscardPadding(const uint8_t* data, uint64_t length, + int64_t discard_padding, + uint64_t track_number, + uint64_t timestamp, bool is_key) { + if (!data) + return false; + + Frame frame; + if (!frame.Init(data, length)) + return false; + frame.set_discard_padding(discard_padding); + frame.set_track_number(track_number); + frame.set_timestamp(timestamp); + frame.set_is_key(is_key); + return AddGenericFrame(&frame); +} + +bool Segment::AddMetadata(const uint8_t* data, uint64_t length, + uint64_t track_number, uint64_t timestamp_ns, + uint64_t duration_ns) { + if (!data) + return false; + + Frame frame; + if (!frame.Init(data, length)) + return false; + frame.set_track_number(track_number); + frame.set_timestamp(timestamp_ns); + frame.set_duration(duration_ns); + frame.set_is_key(true); // All metadata blocks are keyframes. + return AddGenericFrame(&frame); +} + +bool Segment::AddGenericFrame(const Frame* frame) { + if (!frame) + return false; + + if (!CheckHeaderInfo()) + return false; + + // Check for non-monotonically increasing timestamps. + if (frame->timestamp() < last_timestamp_) + return false; + + // Check if the track number is valid. + if (!tracks_.GetTrackByNumber(frame->track_number())) + return false; + + if (frame->discard_padding() != 0) + doc_type_version_ = 4; + + if (cluster_list_size_ > 0) { + const uint64_t timecode_scale = segment_info_.timecode_scale(); + const uint64_t frame_timecode = frame->timestamp() / timecode_scale; + + const Cluster* const last_cluster = cluster_list_[cluster_list_size_ - 1]; + const uint64_t last_cluster_timecode = last_cluster->timecode(); + + const uint64_t rel_timecode = frame_timecode - last_cluster_timecode; + if (rel_timecode > kMaxBlockTimecode) { + force_new_cluster_ = true; + } + } + + // If the segment has a video track hold onto audio frames to make sure the + // audio that is associated with the start time of a video key-frame is + // muxed into the same cluster. + if (has_video_ && tracks_.TrackIsAudio(frame->track_number()) && + !force_new_cluster_) { + Frame* const new_frame = new (std::nothrow) Frame(); + if (!new_frame || !new_frame->CopyFrom(*frame)) { + delete new_frame; + return false; + } + if (!QueueFrame(new_frame)) { + delete new_frame; + return false; + } + track_frames_written_[frame->track_number() - 1]++; + return true; + } + + if (!DoNewClusterProcessing(frame->track_number(), frame->timestamp(), + frame->is_key())) { + return false; + } + + if (cluster_list_size_ < 1) + return false; + + Cluster* const cluster = cluster_list_[cluster_list_size_ - 1]; + if (!cluster) + return false; + + // If the Frame is not a SimpleBlock, then set the reference_block_timestamp + // if it is not set already. + bool frame_created = false; + if (!frame->CanBeSimpleBlock() && !frame->is_key() && + !frame->reference_block_timestamp_set()) { + Frame* const new_frame = new (std::nothrow) Frame(); + if (!new_frame || !new_frame->CopyFrom(*frame)) { + delete new_frame; + return false; + } + new_frame->set_reference_block_timestamp( + last_track_timestamp_[frame->track_number() - 1]); + frame = new_frame; + frame_created = true; + } + + if (!cluster->AddFrame(frame)) + return false; + + if (new_cuepoint_ && cues_track_ == frame->track_number()) { + if (!AddCuePoint(frame->timestamp(), cues_track_)) + return false; + } + + last_timestamp_ = frame->timestamp(); + last_track_timestamp_[frame->track_number() - 1] = frame->timestamp(); + last_block_duration_ = frame->duration(); + track_frames_written_[frame->track_number() - 1]++; + + if (frame_created) + delete frame; + return true; +} + +void Segment::OutputCues(bool output_cues) { output_cues_ = output_cues; } + +void Segment::AccurateClusterDuration(bool accurate_cluster_duration) { + accurate_cluster_duration_ = accurate_cluster_duration; +} + +void Segment::UseFixedSizeClusterTimecode(bool fixed_size_cluster_timecode) { + fixed_size_cluster_timecode_ = fixed_size_cluster_timecode; +} + +bool Segment::SetChunking(bool chunking, const char* filename) { + if (chunk_count_ > 0) + return false; + + if (chunking) { + if (!filename) + return false; + + // Check if we are being set to what is already set. + if (chunking_ && !strcmp(filename, chunking_base_name_)) + return true; + + const size_t filename_length = strlen(filename); + char* const temp = new (std::nothrow) char[filename_length + 1]; // NOLINT + if (!temp) + return false; + + memcpy(temp, filename, filename_length); + temp[filename_length] = '\0'; + + delete[] chunking_base_name_; + chunking_base_name_ = temp; + // From this point, strlen(chunking_base_name_) == filename_length + + if (!UpdateChunkName("chk", &chunk_name_)) + return false; + + if (!chunk_writer_cluster_) { + chunk_writer_cluster_ = new (std::nothrow) MkvWriter(); // NOLINT + if (!chunk_writer_cluster_) + return false; + } + + if (!chunk_writer_cues_) { + chunk_writer_cues_ = new (std::nothrow) MkvWriter(); // NOLINT + if (!chunk_writer_cues_) + return false; + } + + if (!chunk_writer_header_) { + chunk_writer_header_ = new (std::nothrow) MkvWriter(); // NOLINT + if (!chunk_writer_header_) + return false; + } + + if (!chunk_writer_cluster_->Open(chunk_name_)) + return false; + + const size_t hdr_length = strlen(".hdr"); + const size_t header_length = filename_length + hdr_length + 1; + char* const header = new (std::nothrow) char[header_length]; // NOLINT + if (!header) + return false; + + memcpy(header, chunking_base_name_, filename_length); + memcpy(&header[filename_length], ".hdr", hdr_length); + header[filename_length + hdr_length] = '\0'; + + if (!chunk_writer_header_->Open(header)) { + delete[] header; + return false; + } + + writer_cluster_ = chunk_writer_cluster_; + writer_cues_ = chunk_writer_cues_; + writer_header_ = chunk_writer_header_; + + delete[] header; + } + + chunking_ = chunking; + + return true; +} + +bool Segment::CuesTrack(uint64_t track_number) { + const Track* const track = GetTrackByNumber(track_number); + if (!track) + return false; + + cues_track_ = track_number; + return true; +} + +void Segment::ForceNewClusterOnNextFrame() { force_new_cluster_ = true; } + +Track* Segment::GetTrackByNumber(uint64_t track_number) const { + return tracks_.GetTrackByNumber(track_number); +} + +bool Segment::WriteSegmentHeader() { + UpdateDocTypeVersion(); + + const char* const doc_type = + DocTypeIsWebm() ? kDocTypeWebm : kDocTypeMatroska; + if (!WriteEbmlHeader(writer_header_, doc_type_version_, doc_type)) + return false; + doc_type_version_written_ = doc_type_version_; + ebml_header_size_ = static_cast(writer_header_->Position()); + + // Write "unknown" (-1) as segment size value. If mode is kFile, Segment + // will write over duration when the file is finalized. + if (WriteID(writer_header_, libwebm::kMkvSegment)) + return false; + + // Save for later. + size_position_ = writer_header_->Position(); + + // Write "unknown" (EBML coded -1) as segment size value. We need to write 8 + // bytes because if we are going to overwrite the segment size later we do + // not know how big our segment will be. + if (SerializeInt(writer_header_, kEbmlUnknownValue, 8)) + return false; + + payload_pos_ = writer_header_->Position(); + + if (mode_ == kFile && writer_header_->Seekable()) { + // Set the duration > 0.0 so SegmentInfo will write out the duration. When + // the muxer is done writing we will set the correct duration and have + // SegmentInfo upadte it. + segment_info_.set_duration(1.0); + + if (!seek_head_.Write(writer_header_)) + return false; + } + + if (!seek_head_.AddSeekEntry(libwebm::kMkvInfo, MaxOffset())) + return false; + if (!segment_info_.Write(writer_header_)) + return false; + + if (!seek_head_.AddSeekEntry(libwebm::kMkvTracks, MaxOffset())) + return false; + if (!tracks_.Write(writer_header_)) + return false; + + if (chapters_.Count() > 0) { + if (!seek_head_.AddSeekEntry(libwebm::kMkvChapters, MaxOffset())) + return false; + if (!chapters_.Write(writer_header_)) + return false; + } + + if (tags_.Count() > 0) { + if (!seek_head_.AddSeekEntry(libwebm::kMkvTags, MaxOffset())) + return false; + if (!tags_.Write(writer_header_)) + return false; + } + + if (chunking_ && (mode_ == kLive || !writer_header_->Seekable())) { + if (!chunk_writer_header_) + return false; + + chunk_writer_header_->Close(); + } + + header_written_ = true; + + return true; +} + +// Here we are testing whether to create a new cluster, given a frame +// having time frame_timestamp_ns. +// +int Segment::TestFrame(uint64_t track_number, uint64_t frame_timestamp_ns, + bool is_key) const { + if (force_new_cluster_) + return 1; + + // If no clusters have been created yet, then create a new cluster + // and write this frame immediately, in the new cluster. This path + // should only be followed once, the first time we attempt to write + // a frame. + + if (cluster_list_size_ <= 0) + return 1; + + // There exists at least one cluster. We must compare the frame to + // the last cluster, in order to determine whether the frame is + // written to the existing cluster, or that a new cluster should be + // created. + + const uint64_t timecode_scale = segment_info_.timecode_scale(); + const uint64_t frame_timecode = frame_timestamp_ns / timecode_scale; + + const Cluster* const last_cluster = cluster_list_[cluster_list_size_ - 1]; + const uint64_t last_cluster_timecode = last_cluster->timecode(); + + // For completeness we test for the case when the frame's timecode + // is less than the cluster's timecode. Although in principle that + // is allowed, this muxer doesn't actually write clusters like that, + // so this indicates a bug somewhere in our algorithm. + + if (frame_timecode < last_cluster_timecode) // should never happen + return -1; + + // If the frame has a timestamp significantly larger than the last + // cluster (in Matroska, cluster-relative timestamps are serialized + // using a 16-bit signed integer), then we cannot write this frame + // to that cluster, and so we must create a new cluster. + + const int64_t delta_timecode = frame_timecode - last_cluster_timecode; + + if (delta_timecode > kMaxBlockTimecode) + return 2; + + // We decide to create a new cluster when we have a video keyframe. + // This will flush queued (audio) frames, and write the keyframe + // immediately, in the newly-created cluster. + + if (is_key && tracks_.TrackIsVideo(track_number)) + return 1; + + // Create a new cluster if we have accumulated too many frames + // already, where "too many" is defined as "the total time of frames + // in the cluster exceeds a threshold". + + const uint64_t delta_ns = delta_timecode * timecode_scale; + + if (max_cluster_duration_ > 0 && delta_ns >= max_cluster_duration_) + return 1; + + // This is similar to the case above, with the difference that a new + // cluster is created when the size of the current cluster exceeds a + // threshold. + + const uint64_t cluster_size = last_cluster->payload_size(); + + if (max_cluster_size_ > 0 && cluster_size >= max_cluster_size_) + return 1; + + // There's no need to create a new cluster, so emit this frame now. + + return 0; +} + +bool Segment::MakeNewCluster(uint64_t frame_timestamp_ns) { + const int32_t new_size = cluster_list_size_ + 1; + + if (new_size > cluster_list_capacity_) { + // Add more clusters. + const int32_t new_capacity = + (cluster_list_capacity_ <= 0) ? 1 : cluster_list_capacity_ * 2; + Cluster** const clusters = + new (std::nothrow) Cluster*[new_capacity]; // NOLINT + if (!clusters) + return false; + + for (int32_t i = 0; i < cluster_list_size_; ++i) { + clusters[i] = cluster_list_[i]; + } + + delete[] cluster_list_; + + cluster_list_ = clusters; + cluster_list_capacity_ = new_capacity; + } + + if (!WriteFramesLessThan(frame_timestamp_ns)) + return false; + + if (cluster_list_size_ > 0) { + // Update old cluster's size + Cluster* const old_cluster = cluster_list_[cluster_list_size_ - 1]; + + if (!old_cluster || !old_cluster->Finalize(true, frame_timestamp_ns)) + return false; + } + + if (output_cues_) + new_cuepoint_ = true; + + if (chunking_ && cluster_list_size_ > 0) { + chunk_writer_cluster_->Close(); + chunk_count_++; + + if (!UpdateChunkName("chk", &chunk_name_)) + return false; + if (!chunk_writer_cluster_->Open(chunk_name_)) + return false; + } + + const uint64_t timecode_scale = segment_info_.timecode_scale(); + const uint64_t frame_timecode = frame_timestamp_ns / timecode_scale; + + uint64_t cluster_timecode = frame_timecode; + + if (frames_size_ > 0) { + const Frame* const f = frames_[0]; // earliest queued frame + const uint64_t ns = f->timestamp(); + const uint64_t tc = ns / timecode_scale; + + if (tc < cluster_timecode) + cluster_timecode = tc; + } + + Cluster*& cluster = cluster_list_[cluster_list_size_]; + const int64_t offset = MaxOffset(); + cluster = new (std::nothrow) + Cluster(cluster_timecode, offset, segment_info_.timecode_scale(), + accurate_cluster_duration_, fixed_size_cluster_timecode_); + if (!cluster) + return false; + + if (!cluster->Init(writer_cluster_)) + return false; + + cluster_list_size_ = new_size; + return true; +} + +bool Segment::DoNewClusterProcessing(uint64_t track_number, + uint64_t frame_timestamp_ns, bool is_key) { + for (;;) { + // Based on the characteristics of the current frame and current + // cluster, decide whether to create a new cluster. + const int result = TestFrame(track_number, frame_timestamp_ns, is_key); + if (result < 0) // error + return false; + + // Always set force_new_cluster_ to false after TestFrame. + force_new_cluster_ = false; + + // A non-zero result means create a new cluster. + if (result > 0 && !MakeNewCluster(frame_timestamp_ns)) + return false; + + // Write queued (audio) frames. + const int frame_count = WriteFramesAll(); + if (frame_count < 0) // error + return false; + + // Write the current frame to the current cluster (if TestFrame + // returns 0) or to a newly created cluster (TestFrame returns 1). + if (result <= 1) + return true; + + // TestFrame returned 2, which means there was a large time + // difference between the cluster and the frame itself. Do the + // test again, comparing the frame to the new cluster. + } +} + +bool Segment::CheckHeaderInfo() { + if (!header_written_) { + if (!WriteSegmentHeader()) + return false; + + if (!seek_head_.AddSeekEntry(libwebm::kMkvCluster, MaxOffset())) + return false; + + if (output_cues_ && cues_track_ == 0) { + // Check for a video track + for (uint32_t i = 0; i < tracks_.track_entries_size(); ++i) { + const Track* const track = tracks_.GetTrackByIndex(i); + if (!track) + return false; + + if (tracks_.TrackIsVideo(track->number())) { + cues_track_ = track->number(); + break; + } + } + + // Set first track found + if (cues_track_ == 0) { + const Track* const track = tracks_.GetTrackByIndex(0); + if (!track) + return false; + + cues_track_ = track->number(); + } + } + } + return true; +} + +void Segment::UpdateDocTypeVersion() { + for (uint32_t index = 0; index < tracks_.track_entries_size(); ++index) { + const Track* track = tracks_.GetTrackByIndex(index); + if (track == NULL) + break; + if ((track->codec_delay() || track->seek_pre_roll()) && + doc_type_version_ < 4) { + doc_type_version_ = 4; + break; + } + } +} + +bool Segment::UpdateChunkName(const char* ext, char** name) const { + if (!name || !ext) + return false; + + char ext_chk[64]; +#ifdef _MSC_VER + sprintf_s(ext_chk, sizeof(ext_chk), "_%06d.%s", chunk_count_, ext); +#else + snprintf(ext_chk, sizeof(ext_chk), "_%06d.%s", chunk_count_, ext); +#endif + + const size_t chunking_base_name_length = strlen(chunking_base_name_); + const size_t ext_chk_length = strlen(ext_chk); + const size_t length = chunking_base_name_length + ext_chk_length + 1; + char* const str = new (std::nothrow) char[length]; // NOLINT + if (!str) + return false; + + memcpy(str, chunking_base_name_, chunking_base_name_length); + memcpy(&str[chunking_base_name_length], ext_chk, ext_chk_length); + str[chunking_base_name_length + ext_chk_length] = '\0'; + + delete[] * name; + *name = str; + + return true; +} + +int64_t Segment::MaxOffset() { + if (!writer_header_) + return -1; + + int64_t offset = writer_header_->Position() - payload_pos_; + + if (chunking_) { + for (int32_t i = 0; i < cluster_list_size_; ++i) { + Cluster* const cluster = cluster_list_[i]; + offset += cluster->Size(); + } + + if (writer_cues_) + offset += writer_cues_->Position(); + } + + return offset; +} + +bool Segment::QueueFrame(Frame* frame) { + const int32_t new_size = frames_size_ + 1; + + if (new_size > frames_capacity_) { + // Add more frames. + const int32_t new_capacity = (!frames_capacity_) ? 2 : frames_capacity_ * 2; + + if (new_capacity < 1) + return false; + + Frame** const frames = new (std::nothrow) Frame*[new_capacity]; // NOLINT + if (!frames) + return false; + + for (int32_t i = 0; i < frames_size_; ++i) { + frames[i] = frames_[i]; + } + + delete[] frames_; + frames_ = frames; + frames_capacity_ = new_capacity; + } + + frames_[frames_size_++] = frame; + + return true; +} + +int Segment::WriteFramesAll() { + if (frames_ == NULL) + return 0; + + if (cluster_list_size_ < 1) + return -1; + + Cluster* const cluster = cluster_list_[cluster_list_size_ - 1]; + + if (!cluster) + return -1; + + for (int32_t i = 0; i < frames_size_; ++i) { + Frame*& frame = frames_[i]; + // TODO(jzern/vigneshv): using Segment::AddGenericFrame here would limit the + // places where |doc_type_version_| needs to be updated. + if (frame->discard_padding() != 0) + doc_type_version_ = 4; + if (!cluster->AddFrame(frame)) { + delete frame; + continue; + } + + if (new_cuepoint_ && cues_track_ == frame->track_number()) { + if (!AddCuePoint(frame->timestamp(), cues_track_)) { + delete frame; + continue; + } + } + + if (frame->timestamp() > last_timestamp_) { + last_timestamp_ = frame->timestamp(); + last_track_timestamp_[frame->track_number() - 1] = frame->timestamp(); + } + + delete frame; + frame = NULL; + } + + const int result = frames_size_; + frames_size_ = 0; + + return result; +} + +bool Segment::WriteFramesLessThan(uint64_t timestamp) { + // Check |cluster_list_size_| to see if this is the first cluster. If it is + // the first cluster the audio frames that are less than the first video + // timesatmp will be written in a later step. + if (frames_size_ > 0 && cluster_list_size_ > 0) { + if (!frames_) + return false; + + Cluster* const cluster = cluster_list_[cluster_list_size_ - 1]; + if (!cluster) + return false; + + int32_t shift_left = 0; + + // TODO(fgalligan): Change this to use the durations of frames instead of + // the next frame's start time if the duration is accurate. + for (int32_t i = 1; i < frames_size_; ++i) { + const Frame* const frame_curr = frames_[i]; + + if (frame_curr->timestamp() > timestamp) + break; + + const Frame* const frame_prev = frames_[i - 1]; + if (frame_prev->discard_padding() != 0) + doc_type_version_ = 4; + if (!cluster->AddFrame(frame_prev)) { + delete frame_prev; + continue; + } + + if (new_cuepoint_ && cues_track_ == frame_prev->track_number()) { + if (!AddCuePoint(frame_prev->timestamp(), cues_track_)) { + delete frame_prev; + continue; + } + } + + ++shift_left; + if (frame_prev->timestamp() > last_timestamp_) { + last_timestamp_ = frame_prev->timestamp(); + last_track_timestamp_[frame_prev->track_number() - 1] = + frame_prev->timestamp(); + } + + delete frame_prev; + } + + if (shift_left > 0) { + if (shift_left >= frames_size_) + return false; + + const int32_t new_frames_size = frames_size_ - shift_left; + for (int32_t i = 0; i < new_frames_size; ++i) { + frames_[i] = frames_[i + shift_left]; + } + + frames_size_ = new_frames_size; + } + } + + return true; +} + +bool Segment::DocTypeIsWebm() const { + const int kNumCodecIds = 9; + + // TODO(vigneshv): Tweak .clang-format. + const char* kWebmCodecIds[kNumCodecIds] = { + Tracks::kOpusCodecId, Tracks::kVorbisCodecId, + Tracks::kAv1CodecId, Tracks::kVp8CodecId, + Tracks::kVp9CodecId, Tracks::kWebVttCaptionsId, + Tracks::kWebVttDescriptionsId, Tracks::kWebVttMetadataId, + Tracks::kWebVttSubtitlesId}; + + const int num_tracks = static_cast(tracks_.track_entries_size()); + for (int track_index = 0; track_index < num_tracks; ++track_index) { + const Track* const track = tracks_.GetTrackByIndex(track_index); + const std::string codec_id = track->codec_id(); + + bool id_is_webm = false; + for (int id_index = 0; id_index < kNumCodecIds; ++id_index) { + if (codec_id == kWebmCodecIds[id_index]) { + id_is_webm = true; + break; + } + } + + if (!id_is_webm) + return false; + } + + return true; +} + +} // namespace mkvmuxer + +#endif //ESP32 \ No newline at end of file diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxer.h b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxer.h new file mode 100644 index 000000000..a7d0984df --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxer.h @@ -0,0 +1,1926 @@ +// Copyright (c) 2012 The WebM project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. + +#ifndef MKVMUXER_MKVMUXER_H_ +#define MKVMUXER_MKVMUXER_H_ +#ifdef ESP32 + +#include + +#include +#include +#include + +#include "../common/webmids.h" +#include "mkvmuxertypes.h" + +// For a description of the WebM elements see +// http://www.webmproject.org/code/specs/container/. + +namespace mkvparser { +class IMkvReader; +} // namespace mkvparser + +namespace mkvmuxer { + +class MkvWriter; +class Segment; + +const uint64_t kMaxTrackNumber = 126; + +/////////////////////////////////////////////////////////////// +// Interface used by the mkvmuxer to write out the Mkv data. +class IMkvWriter { + public: + // Writes out |len| bytes of |buf|. Returns 0 on success. + virtual int32 Write(const void* buf, uint32 len) = 0; + + // Returns the offset of the output position from the beginning of the + // output. + virtual int64 Position() const = 0; + + // Set the current File position. Returns 0 on success. + virtual int32 Position(int64 position) = 0; + + // Returns true if the writer is seekable. + virtual bool Seekable() const = 0; + + // Element start notification. Called whenever an element identifier is about + // to be written to the stream. |element_id| is the element identifier, and + // |position| is the location in the WebM stream where the first octet of the + // element identifier will be written. + // Note: the |MkvId| enumeration in webmids.hpp defines element values. + virtual void ElementStartNotify(uint64 element_id, int64 position) = 0; + + protected: + IMkvWriter(); + virtual ~IMkvWriter(); + + private: + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(IMkvWriter); +}; + +// Writes out the EBML header for a WebM file, but allows caller to specify +// DocType. This function must be called before any other libwebm writing +// functions are called. +bool WriteEbmlHeader(IMkvWriter* writer, uint64_t doc_type_version, + const char* const doc_type); + +// Writes out the EBML header for a WebM file. This function must be called +// before any other libwebm writing functions are called. +bool WriteEbmlHeader(IMkvWriter* writer, uint64_t doc_type_version); + +// Deprecated. Writes out EBML header with doc_type_version as +// kDefaultDocTypeVersion. Exists for backward compatibility. +bool WriteEbmlHeader(IMkvWriter* writer); + +// Copies in Chunk from source to destination between the given byte positions +bool ChunkedCopy(mkvparser::IMkvReader* source, IMkvWriter* dst, int64_t start, + int64_t size); + +/////////////////////////////////////////////////////////////// +// Class to hold data the will be written to a block. +class Frame { + public: + Frame(); + ~Frame(); + + // Sets this frame's contents based on |frame|. Returns true on success. On + // failure, this frame's existing contents may be lost. + bool CopyFrom(const Frame& frame); + + // Copies |frame| data into |frame_|. Returns true on success. + bool Init(const uint8_t* frame, uint64_t length); + + // Copies |additional| data into |additional_|. Returns true on success. + bool AddAdditionalData(const uint8_t* additional, uint64_t length, + uint64_t add_id); + + // Returns true if the frame has valid parameters. + bool IsValid() const; + + // Returns true if the frame can be written as a SimpleBlock based on current + // parameters. + bool CanBeSimpleBlock() const; + + uint64_t add_id() const { return add_id_; } + const uint8_t* additional() const { return additional_; } + uint64_t additional_length() const { return additional_length_; } + void set_duration(uint64_t duration); + uint64_t duration() const { return duration_; } + bool duration_set() const { return duration_set_; } + const uint8_t* frame() const { return frame_; } + void set_is_key(bool key) { is_key_ = key; } + bool is_key() const { return is_key_; } + uint64_t length() const { return length_; } + void set_track_number(uint64_t track_number) { track_number_ = track_number; } + uint64_t track_number() const { return track_number_; } + void set_timestamp(uint64_t timestamp) { timestamp_ = timestamp; } + uint64_t timestamp() const { return timestamp_; } + void set_discard_padding(int64_t discard_padding) { + discard_padding_ = discard_padding; + } + int64_t discard_padding() const { return discard_padding_; } + void set_reference_block_timestamp(int64_t reference_block_timestamp); + int64_t reference_block_timestamp() const { + return reference_block_timestamp_; + } + bool reference_block_timestamp_set() const { + return reference_block_timestamp_set_; + } + + private: + // Id of the Additional data. + uint64_t add_id_; + + // Pointer to additional data. Owned by this class. + uint8_t* additional_; + + // Length of the additional data. + uint64_t additional_length_; + + // Duration of the frame in nanoseconds. + uint64_t duration_; + + // Flag indicating that |duration_| has been set. Setting duration causes the + // frame to be written out as a Block with BlockDuration instead of as a + // SimpleBlock. + bool duration_set_; + + // Pointer to the data. Owned by this class. + uint8_t* frame_; + + // Flag telling if the data should set the key flag of a block. + bool is_key_; + + // Length of the data. + uint64_t length_; + + // Mkv track number the data is associated with. + uint64_t track_number_; + + // Timestamp of the data in nanoseconds. + uint64_t timestamp_; + + // Discard padding for the frame. + int64_t discard_padding_; + + // Reference block timestamp. + int64_t reference_block_timestamp_; + + // Flag indicating if |reference_block_timestamp_| has been set. + bool reference_block_timestamp_set_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Frame); +}; + +/////////////////////////////////////////////////////////////// +// Class to hold one cue point in a Cues element. +class CuePoint { + public: + CuePoint(); + ~CuePoint(); + + // Returns the size in bytes for the entire CuePoint element. + uint64_t Size() const; + + // Output the CuePoint element to the writer. Returns true on success. + bool Write(IMkvWriter* writer) const; + + void set_time(uint64_t time) { time_ = time; } + uint64_t time() const { return time_; } + void set_track(uint64_t track) { track_ = track; } + uint64_t track() const { return track_; } + void set_cluster_pos(uint64_t cluster_pos) { cluster_pos_ = cluster_pos; } + uint64_t cluster_pos() const { return cluster_pos_; } + void set_block_number(uint64_t block_number) { block_number_ = block_number; } + uint64_t block_number() const { return block_number_; } + void set_output_block_number(bool output_block_number) { + output_block_number_ = output_block_number; + } + bool output_block_number() const { return output_block_number_; } + + private: + // Returns the size in bytes for the payload of the CuePoint element. + uint64_t PayloadSize() const; + + // Absolute timecode according to the segment time base. + uint64_t time_; + + // The Track element associated with the CuePoint. + uint64_t track_; + + // The position of the Cluster containing the Block. + uint64_t cluster_pos_; + + // Number of the Block within the Cluster, starting from 1. + uint64_t block_number_; + + // If true the muxer will write out the block number for the cue if the + // block number is different than the default of 1. Default is set to true. + bool output_block_number_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(CuePoint); +}; + +/////////////////////////////////////////////////////////////// +// Cues element. +class Cues { + public: + Cues(); + ~Cues(); + + // Adds a cue point to the Cues element. Returns true on success. + bool AddCue(CuePoint* cue); + + // Returns the cue point by index. Returns NULL if there is no cue point + // match. + CuePoint* GetCueByIndex(int32_t index) const; + + // Returns the total size of the Cues element + uint64_t Size(); + + // Output the Cues element to the writer. Returns true on success. + bool Write(IMkvWriter* writer) const; + + int32_t cue_entries_size() const { return cue_entries_size_; } + void set_output_block_number(bool output_block_number) { + output_block_number_ = output_block_number; + } + bool output_block_number() const { return output_block_number_; } + + private: + // Number of allocated elements in |cue_entries_|. + int32_t cue_entries_capacity_; + + // Number of CuePoints in |cue_entries_|. + int32_t cue_entries_size_; + + // CuePoint list. + CuePoint** cue_entries_; + + // If true the muxer will write out the block number for the cue if the + // block number is different than the default of 1. Default is set to true. + bool output_block_number_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Cues); +}; + +/////////////////////////////////////////////////////////////// +// ContentEncAESSettings element +class ContentEncAESSettings { + public: + enum { kCTR = 1 }; + + ContentEncAESSettings(); + ~ContentEncAESSettings() {} + + // Returns the size in bytes for the ContentEncAESSettings element. + uint64_t Size() const; + + // Writes out the ContentEncAESSettings element to |writer|. Returns true on + // success. + bool Write(IMkvWriter* writer) const; + + uint64_t cipher_mode() const { return cipher_mode_; } + + private: + // Returns the size in bytes for the payload of the ContentEncAESSettings + // element. + uint64_t PayloadSize() const; + + // Sub elements + uint64_t cipher_mode_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(ContentEncAESSettings); +}; + +/////////////////////////////////////////////////////////////// +// ContentEncoding element +// Elements used to describe if the track data has been encrypted or +// compressed with zlib or header stripping. +// Currently only whole frames can be encrypted with AES. This dictates that +// ContentEncodingOrder will be 0, ContentEncodingScope will be 1, +// ContentEncodingType will be 1, and ContentEncAlgo will be 5. +class ContentEncoding { + public: + ContentEncoding(); + ~ContentEncoding(); + + // Sets the content encryption id. Copies |length| bytes from |id| to + // |enc_key_id_|. Returns true on success. + bool SetEncryptionID(const uint8_t* id, uint64_t length); + + // Returns the size in bytes for the ContentEncoding element. + uint64_t Size() const; + + // Writes out the ContentEncoding element to |writer|. Returns true on + // success. + bool Write(IMkvWriter* writer) const; + + uint64_t enc_algo() const { return enc_algo_; } + uint64_t encoding_order() const { return encoding_order_; } + uint64_t encoding_scope() const { return encoding_scope_; } + uint64_t encoding_type() const { return encoding_type_; } + ContentEncAESSettings* enc_aes_settings() { return &enc_aes_settings_; } + + private: + // Returns the size in bytes for the encoding elements. + uint64_t EncodingSize(uint64_t compression_size, + uint64_t encryption_size) const; + + // Returns the size in bytes for the encryption elements. + uint64_t EncryptionSize() const; + + // Track element names + uint64_t enc_algo_; + uint8_t* enc_key_id_; + uint64_t encoding_order_; + uint64_t encoding_scope_; + uint64_t encoding_type_; + + // ContentEncAESSettings element. + ContentEncAESSettings enc_aes_settings_; + + // Size of the ContentEncKeyID data in bytes. + uint64_t enc_key_id_length_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(ContentEncoding); +}; + +/////////////////////////////////////////////////////////////// +// Colour element. +class PrimaryChromaticity { + public: + static const float kChromaticityMin; + static const float kChromaticityMax; + + PrimaryChromaticity(float x_val, float y_val) : x_(x_val), y_(y_val) {} + PrimaryChromaticity() : x_(0), y_(0) {} + ~PrimaryChromaticity() {} + + // Returns sum of |x_id| and |y_id| element id sizes and payload sizes. + uint64_t PrimaryChromaticitySize(libwebm::MkvId x_id, + libwebm::MkvId y_id) const; + bool Valid() const; + bool Write(IMkvWriter* writer, libwebm::MkvId x_id, + libwebm::MkvId y_id) const; + + float x() const { return x_; } + void set_x(float new_x) { x_ = new_x; } + float y() const { return y_; } + void set_y(float new_y) { y_ = new_y; } + + private: + float x_; + float y_; +}; + +class MasteringMetadata { + public: + static const float kValueNotPresent; + static const float kMinLuminance; + static const float kMinLuminanceMax; + static const float kMaxLuminanceMax; + + MasteringMetadata() + : luminance_max_(kValueNotPresent), + luminance_min_(kValueNotPresent), + r_(NULL), + g_(NULL), + b_(NULL), + white_point_(NULL) {} + ~MasteringMetadata() { + delete r_; + delete g_; + delete b_; + delete white_point_; + } + + // Returns total size of the MasteringMetadata element. + uint64_t MasteringMetadataSize() const; + bool Valid() const; + bool Write(IMkvWriter* writer) const; + + // Copies non-null chromaticity. + bool SetChromaticity(const PrimaryChromaticity* r, + const PrimaryChromaticity* g, + const PrimaryChromaticity* b, + const PrimaryChromaticity* white_point); + const PrimaryChromaticity* r() const { return r_; } + const PrimaryChromaticity* g() const { return g_; } + const PrimaryChromaticity* b() const { return b_; } + const PrimaryChromaticity* white_point() const { return white_point_; } + + float luminance_max() const { return luminance_max_; } + void set_luminance_max(float luminance_max) { + luminance_max_ = luminance_max; + } + float luminance_min() const { return luminance_min_; } + void set_luminance_min(float luminance_min) { + luminance_min_ = luminance_min; + } + + private: + // Returns size of MasteringMetadata child elements. + uint64_t PayloadSize() const; + + float luminance_max_; + float luminance_min_; + PrimaryChromaticity* r_; + PrimaryChromaticity* g_; + PrimaryChromaticity* b_; + PrimaryChromaticity* white_point_; +}; + +class Colour { + public: + enum MatrixCoefficients { + kGbr = 0, + kBt709 = 1, + kUnspecifiedMc = 2, + kReserved = 3, + kFcc = 4, + kBt470bg = 5, + kSmpte170MMc = 6, + kSmpte240MMc = 7, + kYcocg = 8, + kBt2020NonConstantLuminance = 9, + kBt2020ConstantLuminance = 10, + }; + enum ChromaSitingHorz { + kUnspecifiedCsh = 0, + kLeftCollocated = 1, + kHalfCsh = 2, + }; + enum ChromaSitingVert { + kUnspecifiedCsv = 0, + kTopCollocated = 1, + kHalfCsv = 2, + }; + enum Range { + kUnspecifiedCr = 0, + kBroadcastRange = 1, + kFullRange = 2, + kMcTcDefined = 3, // Defined by MatrixCoefficients/TransferCharacteristics. + }; + enum TransferCharacteristics { + kIturBt709Tc = 1, + kUnspecifiedTc = 2, + kReservedTc = 3, + kGamma22Curve = 4, + kGamma28Curve = 5, + kSmpte170MTc = 6, + kSmpte240MTc = 7, + kLinear = 8, + kLog = 9, + kLogSqrt = 10, + kIec6196624 = 11, + kIturBt1361ExtendedColourGamut = 12, + kIec6196621 = 13, + kIturBt202010bit = 14, + kIturBt202012bit = 15, + kSmpteSt2084 = 16, + kSmpteSt4281Tc = 17, + kAribStdB67Hlg = 18, + }; + enum Primaries { + kReservedP0 = 0, + kIturBt709P = 1, + kUnspecifiedP = 2, + kReservedP3 = 3, + kIturBt470M = 4, + kIturBt470Bg = 5, + kSmpte170MP = 6, + kSmpte240MP = 7, + kFilm = 8, + kIturBt2020 = 9, + kSmpteSt4281P = 10, + kJedecP22Phosphors = 22, + }; + static const uint64_t kValueNotPresent; + Colour() + : matrix_coefficients_(kValueNotPresent), + bits_per_channel_(kValueNotPresent), + chroma_subsampling_horz_(kValueNotPresent), + chroma_subsampling_vert_(kValueNotPresent), + cb_subsampling_horz_(kValueNotPresent), + cb_subsampling_vert_(kValueNotPresent), + chroma_siting_horz_(kValueNotPresent), + chroma_siting_vert_(kValueNotPresent), + range_(kValueNotPresent), + transfer_characteristics_(kValueNotPresent), + primaries_(kValueNotPresent), + max_cll_(kValueNotPresent), + max_fall_(kValueNotPresent), + mastering_metadata_(NULL) {} + ~Colour() { delete mastering_metadata_; } + + // Returns total size of the Colour element. + uint64_t ColourSize() const; + bool Valid() const; + bool Write(IMkvWriter* writer) const; + + // Deep copies |mastering_metadata|. + bool SetMasteringMetadata(const MasteringMetadata& mastering_metadata); + + const MasteringMetadata* mastering_metadata() const { + return mastering_metadata_; + } + + uint64_t matrix_coefficients() const { return matrix_coefficients_; } + void set_matrix_coefficients(uint64_t matrix_coefficients) { + matrix_coefficients_ = matrix_coefficients; + } + uint64_t bits_per_channel() const { return bits_per_channel_; } + void set_bits_per_channel(uint64_t bits_per_channel) { + bits_per_channel_ = bits_per_channel; + } + uint64_t chroma_subsampling_horz() const { return chroma_subsampling_horz_; } + void set_chroma_subsampling_horz(uint64_t chroma_subsampling_horz) { + chroma_subsampling_horz_ = chroma_subsampling_horz; + } + uint64_t chroma_subsampling_vert() const { return chroma_subsampling_vert_; } + void set_chroma_subsampling_vert(uint64_t chroma_subsampling_vert) { + chroma_subsampling_vert_ = chroma_subsampling_vert; + } + uint64_t cb_subsampling_horz() const { return cb_subsampling_horz_; } + void set_cb_subsampling_horz(uint64_t cb_subsampling_horz) { + cb_subsampling_horz_ = cb_subsampling_horz; + } + uint64_t cb_subsampling_vert() const { return cb_subsampling_vert_; } + void set_cb_subsampling_vert(uint64_t cb_subsampling_vert) { + cb_subsampling_vert_ = cb_subsampling_vert; + } + uint64_t chroma_siting_horz() const { return chroma_siting_horz_; } + void set_chroma_siting_horz(uint64_t chroma_siting_horz) { + chroma_siting_horz_ = chroma_siting_horz; + } + uint64_t chroma_siting_vert() const { return chroma_siting_vert_; } + void set_chroma_siting_vert(uint64_t chroma_siting_vert) { + chroma_siting_vert_ = chroma_siting_vert; + } + uint64_t range() const { return range_; } + void set_range(uint64_t range) { range_ = range; } + uint64_t transfer_characteristics() const { + return transfer_characteristics_; + } + void set_transfer_characteristics(uint64_t transfer_characteristics) { + transfer_characteristics_ = transfer_characteristics; + } + uint64_t primaries() const { return primaries_; } + void set_primaries(uint64_t primaries) { primaries_ = primaries; } + uint64_t max_cll() const { return max_cll_; } + void set_max_cll(uint64_t max_cll) { max_cll_ = max_cll; } + uint64_t max_fall() const { return max_fall_; } + void set_max_fall(uint64_t max_fall) { max_fall_ = max_fall; } + + private: + // Returns size of Colour child elements. + uint64_t PayloadSize() const; + + uint64_t matrix_coefficients_; + uint64_t bits_per_channel_; + uint64_t chroma_subsampling_horz_; + uint64_t chroma_subsampling_vert_; + uint64_t cb_subsampling_horz_; + uint64_t cb_subsampling_vert_; + uint64_t chroma_siting_horz_; + uint64_t chroma_siting_vert_; + uint64_t range_; + uint64_t transfer_characteristics_; + uint64_t primaries_; + uint64_t max_cll_; + uint64_t max_fall_; + + MasteringMetadata* mastering_metadata_; +}; + +/////////////////////////////////////////////////////////////// +// Projection element. +class Projection { + public: + enum ProjectionType { + kTypeNotPresent = -1, + kRectangular = 0, + kEquirectangular = 1, + kCubeMap = 2, + kMesh = 3, + }; + static const uint64_t kValueNotPresent; + Projection() + : type_(kRectangular), + pose_yaw_(0.0), + pose_pitch_(0.0), + pose_roll_(0.0), + private_data_(NULL), + private_data_length_(0) {} + ~Projection() { delete[] private_data_; } + + uint64_t ProjectionSize() const; + bool Write(IMkvWriter* writer) const; + + bool SetProjectionPrivate(const uint8_t* private_data, + uint64_t private_data_length); + + ProjectionType type() const { return type_; } + void set_type(ProjectionType type) { type_ = type; } + float pose_yaw() const { return pose_yaw_; } + void set_pose_yaw(float pose_yaw) { pose_yaw_ = pose_yaw; } + float pose_pitch() const { return pose_pitch_; } + void set_pose_pitch(float pose_pitch) { pose_pitch_ = pose_pitch; } + float pose_roll() const { return pose_roll_; } + void set_pose_roll(float pose_roll) { pose_roll_ = pose_roll; } + uint8_t* private_data() const { return private_data_; } + uint64_t private_data_length() const { return private_data_length_; } + + private: + // Returns size of VideoProjection child elements. + uint64_t PayloadSize() const; + + ProjectionType type_; + float pose_yaw_; + float pose_pitch_; + float pose_roll_; + uint8_t* private_data_; + uint64_t private_data_length_; +}; + +/////////////////////////////////////////////////////////////// +// Track element. +class Track { + public: + // The |seed| parameter is used to synthesize a UID for the track. + explicit Track(unsigned int* seed); + virtual ~Track(); + + // Adds a ContentEncoding element to the Track. Returns true on success. + virtual bool AddContentEncoding(); + + // Returns the ContentEncoding by index. Returns NULL if there is no + // ContentEncoding match. + ContentEncoding* GetContentEncodingByIndex(uint32_t index) const; + + // Returns the size in bytes for the payload of the Track element. + virtual uint64_t PayloadSize() const; + + // Returns the size in bytes of the Track element. + virtual uint64_t Size() const; + + // Output the Track element to the writer. Returns true on success. + virtual bool Write(IMkvWriter* writer) const; + + // Sets the CodecPrivate element of the Track element. Copies |length| + // bytes from |codec_private| to |codec_private_|. Returns true on success. + bool SetCodecPrivate(const uint8_t* codec_private, uint64_t length); + + void set_codec_id(const char* codec_id); + const char* codec_id() const { return codec_id_; } + const uint8_t* codec_private() const { return codec_private_; } + void set_language(const char* language); + const char* language() const { return language_; } + void set_max_block_additional_id(uint64_t max_block_additional_id) { + max_block_additional_id_ = max_block_additional_id; + } + uint64_t max_block_additional_id() const { return max_block_additional_id_; } + void set_name(const char* name); + const char* name() const { return name_; } + void set_number(uint64_t number) { number_ = number; } + uint64_t number() const { return number_; } + void set_type(uint64_t type) { type_ = type; } + uint64_t type() const { return type_; } + void set_uid(uint64_t uid) { uid_ = uid; } + uint64_t uid() const { return uid_; } + void set_codec_delay(uint64_t codec_delay) { codec_delay_ = codec_delay; } + uint64_t codec_delay() const { return codec_delay_; } + void set_seek_pre_roll(uint64_t seek_pre_roll) { + seek_pre_roll_ = seek_pre_roll; + } + uint64_t seek_pre_roll() const { return seek_pre_roll_; } + void set_default_duration(uint64_t default_duration) { + default_duration_ = default_duration; + } + uint64_t default_duration() const { return default_duration_; } + + uint64_t codec_private_length() const { return codec_private_length_; } + uint32_t content_encoding_entries_size() const { + return content_encoding_entries_size_; + } + + private: + // Track element names. + char* codec_id_; + uint8_t* codec_private_; + char* language_; + uint64_t max_block_additional_id_; + char* name_; + uint64_t number_; + uint64_t type_; + uint64_t uid_; + uint64_t codec_delay_; + uint64_t seek_pre_roll_; + uint64_t default_duration_; + + // Size of the CodecPrivate data in bytes. + uint64_t codec_private_length_; + + // ContentEncoding element list. + ContentEncoding** content_encoding_entries_; + + // Number of ContentEncoding elements added. + uint32_t content_encoding_entries_size_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Track); +}; + +/////////////////////////////////////////////////////////////// +// Track that has video specific elements. +class VideoTrack : public Track { + public: + // Supported modes for stereo 3D. + enum StereoMode { + kMono = 0, + kSideBySideLeftIsFirst = 1, + kTopBottomRightIsFirst = 2, + kTopBottomLeftIsFirst = 3, + kSideBySideRightIsFirst = 11 + }; + + enum AlphaMode { kNoAlpha = 0, kAlpha = 1 }; + + // The |seed| parameter is used to synthesize a UID for the track. + explicit VideoTrack(unsigned int* seed); + virtual ~VideoTrack(); + + // Returns the size in bytes for the payload of the Track element plus the + // video specific elements. + virtual uint64_t PayloadSize() const; + + // Output the VideoTrack element to the writer. Returns true on success. + virtual bool Write(IMkvWriter* writer) const; + + // Sets the video's stereo mode. Returns true on success. + bool SetStereoMode(uint64_t stereo_mode); + + // Sets the video's alpha mode. Returns true on success. + bool SetAlphaMode(uint64_t alpha_mode); + + void set_display_height(uint64_t height) { display_height_ = height; } + uint64_t display_height() const { return display_height_; } + void set_display_width(uint64_t width) { display_width_ = width; } + uint64_t display_width() const { return display_width_; } + void set_pixel_height(uint64_t height) { pixel_height_ = height; } + uint64_t pixel_height() const { return pixel_height_; } + void set_pixel_width(uint64_t width) { pixel_width_ = width; } + uint64_t pixel_width() const { return pixel_width_; } + + void set_crop_left(uint64_t crop_left) { crop_left_ = crop_left; } + uint64_t crop_left() const { return crop_left_; } + void set_crop_right(uint64_t crop_right) { crop_right_ = crop_right; } + uint64_t crop_right() const { return crop_right_; } + void set_crop_top(uint64_t crop_top) { crop_top_ = crop_top; } + uint64_t crop_top() const { return crop_top_; } + void set_crop_bottom(uint64_t crop_bottom) { crop_bottom_ = crop_bottom; } + uint64_t crop_bottom() const { return crop_bottom_; } + + void set_frame_rate(double frame_rate) { frame_rate_ = frame_rate; } + double frame_rate() const { return frame_rate_; } + void set_height(uint64_t height) { height_ = height; } + uint64_t height() const { return height_; } + uint64_t stereo_mode() { return stereo_mode_; } + uint64_t alpha_mode() { return alpha_mode_; } + void set_width(uint64_t width) { width_ = width; } + uint64_t width() const { return width_; } + void set_colour_space(const char* colour_space); + const char* colour_space() const { return colour_space_; } + + Colour* colour() { return colour_; } + + // Deep copies |colour|. + bool SetColour(const Colour& colour); + + Projection* projection() { return projection_; } + + // Deep copies |projection|. + bool SetProjection(const Projection& projection); + + private: + // Returns the size in bytes of the Video element. + uint64_t VideoPayloadSize() const; + + // Video track element names. + uint64_t display_height_; + uint64_t display_width_; + uint64_t pixel_height_; + uint64_t pixel_width_; + uint64_t crop_left_; + uint64_t crop_right_; + uint64_t crop_top_; + uint64_t crop_bottom_; + double frame_rate_; + uint64_t height_; + uint64_t stereo_mode_; + uint64_t alpha_mode_; + uint64_t width_; + char* colour_space_; + + Colour* colour_; + Projection* projection_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(VideoTrack); +}; + +/////////////////////////////////////////////////////////////// +// Track that has audio specific elements. +class AudioTrack : public Track { + public: + // The |seed| parameter is used to synthesize a UID for the track. + explicit AudioTrack(unsigned int* seed); + virtual ~AudioTrack(); + + // Returns the size in bytes for the payload of the Track element plus the + // audio specific elements. + virtual uint64_t PayloadSize() const; + + // Output the AudioTrack element to the writer. Returns true on success. + virtual bool Write(IMkvWriter* writer) const; + + void set_bit_depth(uint64_t bit_depth) { bit_depth_ = bit_depth; } + uint64_t bit_depth() const { return bit_depth_; } + void set_channels(uint64_t channels) { channels_ = channels; } + uint64_t channels() const { return channels_; } + void set_sample_rate(double sample_rate) { sample_rate_ = sample_rate; } + double sample_rate() const { return sample_rate_; } + + private: + // Audio track element names. + uint64_t bit_depth_; + uint64_t channels_; + double sample_rate_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(AudioTrack); +}; + +/////////////////////////////////////////////////////////////// +// Tracks element +class Tracks { + public: + // Audio and video type defined by the Matroska specs. + enum { kVideo = 0x1, kAudio = 0x2 }; + + static const char kOpusCodecId[]; + static const char kVorbisCodecId[]; + static const char kAv1CodecId[]; + static const char kVp8CodecId[]; + static const char kVp9CodecId[]; + static const char kWebVttCaptionsId[]; + static const char kWebVttDescriptionsId[]; + static const char kWebVttMetadataId[]; + static const char kWebVttSubtitlesId[]; + + Tracks(); + ~Tracks(); + + // Adds a Track element to the Tracks object. |track| will be owned and + // deleted by the Tracks object. Returns true on success. |number| is the + // number to use for the track. |number| must be >= 0. If |number| == 0 + // then the muxer will decide on the track number. + bool AddTrack(Track* track, int32_t number); + + // Returns the track by index. Returns NULL if there is no track match. + const Track* GetTrackByIndex(uint32_t idx) const; + + // Search the Tracks and return the track that matches |tn|. Returns NULL + // if there is no track match. + Track* GetTrackByNumber(uint64_t track_number) const; + + // Returns true if the track number is an audio track. + bool TrackIsAudio(uint64_t track_number) const; + + // Returns true if the track number is a video track. + bool TrackIsVideo(uint64_t track_number) const; + + // Output the Tracks element to the writer. Returns true on success. + bool Write(IMkvWriter* writer) const; + + uint32_t track_entries_size() const { return track_entries_size_; } + + private: + // Track element list. + Track** track_entries_; + + // Number of Track elements added. + uint32_t track_entries_size_; + + // Whether or not Tracks element has already been written via IMkvWriter. + mutable bool wrote_tracks_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Tracks); +}; + +/////////////////////////////////////////////////////////////// +// Chapter element +// +class Chapter { + public: + // Set the identifier for this chapter. (This corresponds to the + // Cue Identifier line in WebVTT.) + // TODO(matthewjheaney): the actual serialization of this item in + // MKV is pending. + bool set_id(const char* id); + + // Converts the nanosecond start and stop times of this chapter to + // their corresponding timecode values, and stores them that way. + void set_time(const Segment& segment, uint64_t start_time_ns, + uint64_t end_time_ns); + + // Sets the uid for this chapter. Primarily used to enable + // deterministic output from the muxer. + void set_uid(const uint64_t uid) { uid_ = uid; } + + // Add a title string to this chapter, per the semantics described + // here: + // http://www.matroska.org/technical/specs/index.html + // + // The title ("chapter string") is a UTF-8 string. + // + // The language has ISO 639-2 representation, described here: + // http://www.loc.gov/standards/iso639-2/englangn.html + // http://www.loc.gov/standards/iso639-2/php/English_list.php + // If you specify NULL as the language value, this implies + // English ("eng"). + // + // The country value corresponds to the codes listed here: + // http://www.iana.org/domains/root/db/ + // + // The function returns false if the string could not be allocated. + bool add_string(const char* title, const char* language, const char* country); + + private: + friend class Chapters; + + // For storage of chapter titles that differ by language. + class Display { + public: + // Establish representation invariant for new Display object. + void Init(); + + // Reclaim resources, in anticipation of destruction. + void Clear(); + + // Copies the title to the |title_| member. Returns false on + // error. + bool set_title(const char* title); + + // Copies the language to the |language_| member. Returns false + // on error. + bool set_language(const char* language); + + // Copies the country to the |country_| member. Returns false on + // error. + bool set_country(const char* country); + + // If |writer| is non-NULL, serialize the Display sub-element of + // the Atom into the stream. Returns the Display element size on + // success, 0 if error. + uint64_t WriteDisplay(IMkvWriter* writer) const; + + private: + char* title_; + char* language_; + char* country_; + }; + + Chapter(); + ~Chapter(); + + // Establish the representation invariant for a newly-created + // Chapter object. The |seed| parameter is used to create the UID + // for this chapter atom. + void Init(unsigned int* seed); + + // Copies this Chapter object to a different one. This is used when + // expanding a plain array of Chapter objects (see Chapters). + void ShallowCopy(Chapter* dst) const; + + // Reclaim resources used by this Chapter object, pending its + // destruction. + void Clear(); + + // If there is no storage remaining on the |displays_| array for a + // new display object, creates a new, longer array and copies the + // existing Display objects to the new array. Returns false if the + // array cannot be expanded. + bool ExpandDisplaysArray(); + + // If |writer| is non-NULL, serialize the Atom sub-element into the + // stream. Returns the total size of the element on success, 0 if + // error. + uint64_t WriteAtom(IMkvWriter* writer) const; + + // The string identifier for this chapter (corresponds to WebVTT cue + // identifier). + char* id_; + + // Start timecode of the chapter. + uint64_t start_timecode_; + + // Stop timecode of the chapter. + uint64_t end_timecode_; + + // The binary identifier for this chapter. + uint64_t uid_; + + // The Atom element can contain multiple Display sub-elements, as + // the same logical title can be rendered in different languages. + Display* displays_; + + // The physical length (total size) of the |displays_| array. + int displays_size_; + + // The logical length (number of active elements) on the |displays_| + // array. + int displays_count_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Chapter); +}; + +/////////////////////////////////////////////////////////////// +// Chapters element +// +class Chapters { + public: + Chapters(); + ~Chapters(); + + Chapter* AddChapter(unsigned int* seed); + + // Returns the number of chapters that have been added. + int Count() const; + + // Output the Chapters element to the writer. Returns true on success. + bool Write(IMkvWriter* writer) const; + + private: + // Expands the chapters_ array if there is not enough space to contain + // another chapter object. Returns true on success. + bool ExpandChaptersArray(); + + // If |writer| is non-NULL, serialize the Edition sub-element of the + // Chapters element into the stream. Returns the Edition element + // size on success, 0 if error. + uint64_t WriteEdition(IMkvWriter* writer) const; + + // Total length of the chapters_ array. + int chapters_size_; + + // Number of active chapters on the chapters_ array. + int chapters_count_; + + // Array for storage of chapter objects. + Chapter* chapters_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Chapters); +}; + +/////////////////////////////////////////////////////////////// +// Tag element +// +class Tag { + public: + bool add_simple_tag(const char* tag_name, const char* tag_string); + + private: + // Tags calls Clear and the destructor of Tag + friend class Tags; + + // For storage of simple tags + class SimpleTag { + public: + // Establish representation invariant for new SimpleTag object. + void Init(); + + // Reclaim resources, in anticipation of destruction. + void Clear(); + + // Copies the title to the |tag_name_| member. Returns false on + // error. + bool set_tag_name(const char* tag_name); + + // Copies the language to the |tag_string_| member. Returns false + // on error. + bool set_tag_string(const char* tag_string); + + // If |writer| is non-NULL, serialize the SimpleTag sub-element of + // the Atom into the stream. Returns the SimpleTag element size on + // success, 0 if error. + uint64_t Write(IMkvWriter* writer) const; + + private: + char* tag_name_; + char* tag_string_; + }; + + Tag(); + ~Tag(); + + // Copies this Tag object to a different one. This is used when + // expanding a plain array of Tag objects (see Tags). + void ShallowCopy(Tag* dst) const; + + // Reclaim resources used by this Tag object, pending its + // destruction. + void Clear(); + + // If there is no storage remaining on the |simple_tags_| array for a + // new display object, creates a new, longer array and copies the + // existing SimpleTag objects to the new array. Returns false if the + // array cannot be expanded. + bool ExpandSimpleTagsArray(); + + // If |writer| is non-NULL, serialize the Tag sub-element into the + // stream. Returns the total size of the element on success, 0 if + // error. + uint64_t Write(IMkvWriter* writer) const; + + // The Atom element can contain multiple SimpleTag sub-elements + SimpleTag* simple_tags_; + + // The physical length (total size) of the |simple_tags_| array. + int simple_tags_size_; + + // The logical length (number of active elements) on the |simple_tags_| + // array. + int simple_tags_count_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Tag); +}; + +/////////////////////////////////////////////////////////////// +// Tags element +// +class Tags { + public: + Tags(); + ~Tags(); + + Tag* AddTag(); + + // Returns the number of tags that have been added. + int Count() const; + + // Output the Tags element to the writer. Returns true on success. + bool Write(IMkvWriter* writer) const; + + private: + // Expands the tags_ array if there is not enough space to contain + // another tag object. Returns true on success. + bool ExpandTagsArray(); + + // Total length of the tags_ array. + int tags_size_; + + // Number of active tags on the tags_ array. + int tags_count_; + + // Array for storage of tag objects. + Tag* tags_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Tags); +}; + +/////////////////////////////////////////////////////////////// +// Cluster element +// +// Notes: +// |Init| must be called before any other method in this class. +class Cluster { + public: + // |timecode| is the absolute timecode of the cluster. |cues_pos| is the + // position for the cluster within the segment that should be written in + // the cues element. |timecode_scale| is the timecode scale of the segment. + Cluster(uint64_t timecode, int64_t cues_pos, uint64_t timecode_scale, + bool write_last_frame_with_duration = false, + bool fixed_size_timecode = false); + ~Cluster(); + + bool Init(IMkvWriter* ptr_writer); + + // Adds a frame to be output in the file. The frame is written out through + // |writer_| if successful. Returns true on success. + bool AddFrame(const Frame* frame); + + // Adds a frame to be output in the file. The frame is written out through + // |writer_| if successful. Returns true on success. + // Inputs: + // data: Pointer to the data + // length: Length of the data + // track_number: Track to add the data to. Value returned by Add track + // functions. The range of allowed values is [1, 126]. + // timecode: Absolute (not relative to cluster) timestamp of the + // frame, expressed in timecode units. + // is_key: Flag telling whether or not this frame is a key frame. + bool AddFrame(const uint8_t* data, uint64_t length, uint64_t track_number, + uint64_t timecode, // timecode units (absolute) + bool is_key); + + // Adds a frame to be output in the file. The frame is written out through + // |writer_| if successful. Returns true on success. + // Inputs: + // data: Pointer to the data + // length: Length of the data + // additional: Pointer to the additional data + // additional_length: Length of the additional data + // add_id: Value of BlockAddID element + // track_number: Track to add the data to. Value returned by Add track + // functions. The range of allowed values is [1, 126]. + // abs_timecode: Absolute (not relative to cluster) timestamp of the + // frame, expressed in timecode units. + // is_key: Flag telling whether or not this frame is a key frame. + bool AddFrameWithAdditional(const uint8_t* data, uint64_t length, + const uint8_t* additional, + uint64_t additional_length, uint64_t add_id, + uint64_t track_number, uint64_t abs_timecode, + bool is_key); + + // Adds a frame to be output in the file. The frame is written out through + // |writer_| if successful. Returns true on success. + // Inputs: + // data: Pointer to the data. + // length: Length of the data. + // discard_padding: DiscardPadding element value. + // track_number: Track to add the data to. Value returned by Add track + // functions. The range of allowed values is [1, 126]. + // abs_timecode: Absolute (not relative to cluster) timestamp of the + // frame, expressed in timecode units. + // is_key: Flag telling whether or not this frame is a key frame. + bool AddFrameWithDiscardPadding(const uint8_t* data, uint64_t length, + int64_t discard_padding, + uint64_t track_number, uint64_t abs_timecode, + bool is_key); + + // Writes a frame of metadata to the output medium; returns true on + // success. + // Inputs: + // data: Pointer to the data + // length: Length of the data + // track_number: Track to add the data to. Value returned by Add track + // functions. The range of allowed values is [1, 126]. + // timecode: Absolute (not relative to cluster) timestamp of the + // metadata frame, expressed in timecode units. + // duration: Duration of metadata frame, in timecode units. + // + // The metadata frame is written as a block group, with a duration + // sub-element but no reference time sub-elements (indicating that + // it is considered a keyframe, per Matroska semantics). + bool AddMetadata(const uint8_t* data, uint64_t length, uint64_t track_number, + uint64_t timecode, uint64_t duration); + + // Increments the size of the cluster's data in bytes. + void AddPayloadSize(uint64_t size); + + // Closes the cluster so no more data can be written to it. Will update the + // cluster's size if |writer_| is seekable. Returns true on success. This + // variant of Finalize() fails when |write_last_frame_with_duration_| is set + // to true. + bool Finalize(); + + // Closes the cluster so no more data can be written to it. Will update the + // cluster's size if |writer_| is seekable. Returns true on success. + // Inputs: + // set_last_frame_duration: Boolean indicating whether or not the duration + // of the last frame should be set. If set to + // false, the |duration| value is ignored and + // |write_last_frame_with_duration_| will not be + // honored. + // duration: Duration of the Cluster in timecode scale. + bool Finalize(bool set_last_frame_duration, uint64_t duration); + + // Returns the size in bytes for the entire Cluster element. + uint64_t Size() const; + + // Given |abs_timecode|, calculates timecode relative to most recent timecode. + // Returns -1 on failure, or a relative timecode. + int64_t GetRelativeTimecode(int64_t abs_timecode) const; + + int64_t size_position() const { return size_position_; } + int32_t blocks_added() const { return blocks_added_; } + uint64_t payload_size() const { return payload_size_; } + int64_t position_for_cues() const { return position_for_cues_; } + uint64_t timecode() const { return timecode_; } + uint64_t timecode_scale() const { return timecode_scale_; } + void set_write_last_frame_with_duration(bool write_last_frame_with_duration) { + write_last_frame_with_duration_ = write_last_frame_with_duration; + } + bool write_last_frame_with_duration() const { + return write_last_frame_with_duration_; + } + + private: + // Iterator type for the |stored_frames_| map. + typedef std::map >::iterator FrameMapIterator; + + // Utility method that confirms that blocks can still be added, and that the + // cluster header has been written. Used by |DoWriteFrame*|. Returns true + // when successful. + bool PreWriteBlock(); + + // Utility method used by the |DoWriteFrame*| methods that handles the book + // keeping required after each block is written. + void PostWriteBlock(uint64_t element_size); + + // Does some verification and calls WriteFrame. + bool DoWriteFrame(const Frame* const frame); + + // Either holds back the given frame, or writes it out depending on whether or + // not |write_last_frame_with_duration_| is set. + bool QueueOrWriteFrame(const Frame* const frame); + + // Outputs the Cluster header to |writer_|. Returns true on success. + bool WriteClusterHeader(); + + // Number of blocks added to the cluster. + int32_t blocks_added_; + + // Flag telling if the cluster has been closed. + bool finalized_; + + // Flag indicating whether the cluster's timecode will always be written out + // using 8 bytes. + bool fixed_size_timecode_; + + // Flag telling if the cluster's header has been written. + bool header_written_; + + // The size of the cluster elements in bytes. + uint64_t payload_size_; + + // The file position used for cue points. + const int64_t position_for_cues_; + + // The file position of the cluster's size element. + int64_t size_position_; + + // The absolute timecode of the cluster. + const uint64_t timecode_; + + // The timecode scale of the Segment containing the cluster. + const uint64_t timecode_scale_; + + // Flag indicating whether the last frame of the cluster should be written as + // a Block with Duration. If set to true, then it will result in holding back + // of frames and the parameterized version of Finalize() must be called to + // finish writing the Cluster. + bool write_last_frame_with_duration_; + + // Map used to hold back frames, if required. Track number is the key. + std::map > stored_frames_; + + // Map from track number to the timestamp of the last block written for that + // track. + std::map last_block_timestamp_; + + // Pointer to the writer object. Not owned by this class. + IMkvWriter* writer_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Cluster); +}; + +/////////////////////////////////////////////////////////////// +// SeekHead element +class SeekHead { + public: + SeekHead(); + ~SeekHead(); + + // TODO(fgalligan): Change this to reserve a certain size. Then check how + // big the seek entry to be added is as not every seek entry will be the + // maximum size it could be. + // Adds a seek entry to be written out when the element is finalized. |id| + // must be the coded mkv element id. |pos| is the file position of the + // element. Returns true on success. + bool AddSeekEntry(uint32_t id, uint64_t pos); + + // Writes out SeekHead and SeekEntry elements. Returns true on success. + bool Finalize(IMkvWriter* writer) const; + + // Returns the id of the Seek Entry at the given index. Returns -1 if index is + // out of range. + uint32_t GetId(int index) const; + + // Returns the position of the Seek Entry at the given index. Returns -1 if + // index is out of range. + uint64_t GetPosition(int index) const; + + // Sets the Seek Entry id and position at given index. + // Returns true on success. + bool SetSeekEntry(int index, uint32_t id, uint64_t position); + + // Reserves space by writing out a Void element which will be updated with + // a SeekHead element later. Returns true on success. + bool Write(IMkvWriter* writer); + + // We are going to put a cap on the number of Seek Entries. + constexpr static int32_t kSeekEntryCount = 5; + + private: + // Returns the maximum size in bytes of one seek entry. + uint64_t MaxEntrySize() const; + + // Seek entry id element list. + uint32_t seek_entry_id_[kSeekEntryCount]; + + // Seek entry pos element list. + uint64_t seek_entry_pos_[kSeekEntryCount]; + + // The file position of SeekHead element. + int64_t start_pos_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(SeekHead); +}; + +/////////////////////////////////////////////////////////////// +// Segment Information element +class SegmentInfo { + public: + SegmentInfo(); + ~SegmentInfo(); + + // Will update the duration if |duration_| is > 0.0. Returns true on success. + bool Finalize(IMkvWriter* writer) const; + + // Sets |muxing_app_| and |writing_app_|. + bool Init(); + + // Output the Segment Information element to the writer. Returns true on + // success. + bool Write(IMkvWriter* writer); + + void set_duration(double duration) { duration_ = duration; } + double duration() const { return duration_; } + void set_muxing_app(const char* app); + const char* muxing_app() const { return muxing_app_; } + void set_timecode_scale(uint64_t scale) { timecode_scale_ = scale; } + uint64_t timecode_scale() const { return timecode_scale_; } + void set_writing_app(const char* app); + const char* writing_app() const { return writing_app_; } + void set_date_utc(int64_t date_utc) { date_utc_ = date_utc; } + int64_t date_utc() const { return date_utc_; } + + private: + // Segment Information element names. + // Initially set to -1 to signify that a duration has not been set and should + // not be written out. + double duration_; + // Set to libwebm-%d.%d.%d.%d, major, minor, build, revision. + char* muxing_app_; + uint64_t timecode_scale_; + // Initially set to libwebm-%d.%d.%d.%d, major, minor, build, revision. + char* writing_app_; + // INT64_MIN when DateUTC is not set. + int64_t date_utc_; + + // The file position of the duration element. + int64_t duration_pos_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(SegmentInfo); +}; + +/////////////////////////////////////////////////////////////// +// This class represents the main segment in a WebM file. Currently only +// supports one Segment element. +// +// Notes: +// |Init| must be called before any other method in this class. +class Segment { + public: + enum Mode { kLive = 0x1, kFile = 0x2 }; + + enum CuesPosition { + kAfterClusters = 0x0, // Position Cues after Clusters - Default + kBeforeClusters = 0x1 // Position Cues before Clusters + }; + + static constexpr uint32_t kDefaultDocTypeVersion = 4; + static constexpr uint64_t kDefaultMaxClusterDuration = 30000000000ULL; + + Segment(); + ~Segment(); + + // Initializes |SegmentInfo| and returns result. Always returns false when + // |ptr_writer| is NULL. + bool Init(IMkvWriter* ptr_writer); + + // Adds a generic track to the segment. Returns the newly-allocated + // track object (which is owned by the segment) on success, NULL on + // error. |number| is the number to use for the track. |number| + // must be >= 0. If |number| == 0 then the muxer will decide on the + // track number. + Track* AddTrack(int32_t number); + + // Adds a Vorbis audio track to the segment. Returns the number of the track + // on success, 0 on error. |number| is the number to use for the audio track. + // |number| must be >= 0. If |number| == 0 then the muxer will decide on + // the track number. + uint64_t AddAudioTrack(int32_t sample_rate, int32_t channels, int32_t number); + + // Adds an empty chapter to the chapters of this segment. Returns + // non-NULL on success. After adding the chapter, the caller should + // populate its fields via the Chapter member functions. + Chapter* AddChapter(); + + // Adds an empty tag to the tags of this segment. Returns + // non-NULL on success. After adding the tag, the caller should + // populate its fields via the Tag member functions. + Tag* AddTag(); + + // Adds a cue point to the Cues element. |timestamp| is the time in + // nanoseconds of the cue's time. |track| is the Track of the Cue. This + // function must be called after AddFrame to calculate the correct + // BlockNumber for the CuePoint. Returns true on success. + bool AddCuePoint(uint64_t timestamp, uint64_t track); + + // Adds a frame to be output in the file. Returns true on success. + // Inputs: + // data: Pointer to the data + // length: Length of the data + // track_number: Track to add the data to. Value returned by Add track + // functions. + // timestamp: Timestamp of the frame in nanoseconds from 0. + // is_key: Flag telling whether or not this frame is a key frame. + bool AddFrame(const uint8_t* data, uint64_t length, uint64_t track_number, + uint64_t timestamp_ns, bool is_key); + + // Writes a frame of metadata to the output medium; returns true on + // success. + // Inputs: + // data: Pointer to the data + // length: Length of the data + // track_number: Track to add the data to. Value returned by Add track + // functions. + // timecode: Absolute timestamp of the metadata frame, expressed + // in nanosecond units. + // duration: Duration of metadata frame, in nanosecond units. + // + // The metadata frame is written as a block group, with a duration + // sub-element but no reference time sub-elements (indicating that + // it is considered a keyframe, per Matroska semantics). + bool AddMetadata(const uint8_t* data, uint64_t length, uint64_t track_number, + uint64_t timestamp_ns, uint64_t duration_ns); + + // Writes a frame with additional data to the output medium; returns true on + // success. + // Inputs: + // data: Pointer to the data. + // length: Length of the data. + // additional: Pointer to additional data. + // additional_length: Length of additional data. + // add_id: Additional ID which identifies the type of additional data. + // track_number: Track to add the data to. Value returned by Add track + // functions. + // timestamp: Absolute timestamp of the frame, expressed in nanosecond + // units. + // is_key: Flag telling whether or not this frame is a key frame. + bool AddFrameWithAdditional(const uint8_t* data, uint64_t length, + const uint8_t* additional, + uint64_t additional_length, uint64_t add_id, + uint64_t track_number, uint64_t timestamp, + bool is_key); + + // Writes a frame with DiscardPadding to the output medium; returns true on + // success. + // Inputs: + // data: Pointer to the data. + // length: Length of the data. + // discard_padding: DiscardPadding element value. + // track_number: Track to add the data to. Value returned by Add track + // functions. + // timestamp: Absolute timestamp of the frame, expressed in nanosecond + // units. + // is_key: Flag telling whether or not this frame is a key frame. + bool AddFrameWithDiscardPadding(const uint8_t* data, uint64_t length, + int64_t discard_padding, + uint64_t track_number, uint64_t timestamp, + bool is_key); + + // Writes a Frame to the output medium. Chooses the correct way of writing + // the frame (Block vs SimpleBlock) based on the parameters passed. + // Inputs: + // frame: frame object + bool AddGenericFrame(const Frame* frame); + + // Adds a VP8 video track to the segment. Returns the number of the track on + // success, 0 on error. |number| is the number to use for the video track. + // |number| must be >= 0. If |number| == 0 then the muxer will decide on + // the track number. + uint64_t AddVideoTrack(int32_t width, int32_t height, int32_t number); + + // This function must be called after Finalize() if you need a copy of the + // output with Cues written before the Clusters. It will return false if the + // writer is not seekable of if chunking is set to true. + // Input parameters: + // reader - an IMkvReader object created with the same underlying file of the + // current writer object. Make sure to close the existing writer + // object before creating this so that all the data is properly + // flushed and available for reading. + // writer - an IMkvWriter object pointing to a *different* file than the one + // pointed by the current writer object. This file will contain the + // Cues element before the Clusters. + bool CopyAndMoveCuesBeforeClusters(mkvparser::IMkvReader* reader, + IMkvWriter* writer); + + // Sets which track to use for the Cues element. Must have added the track + // before calling this function. Returns true on success. |track_number| is + // returned by the Add track functions. + bool CuesTrack(uint64_t track_number); + + // This will force the muxer to create a new Cluster when the next frame is + // added. + void ForceNewClusterOnNextFrame(); + + // Writes out any frames that have not been written out. Finalizes the last + // cluster. May update the size and duration of the segment. May output the + // Cues element. May finalize the SeekHead element. Returns true on success. + bool Finalize(); + + // Returns the Cues object. + Cues* GetCues() { return &cues_; } + + // Returns the Segment Information object. + const SegmentInfo* GetSegmentInfo() const { return &segment_info_; } + SegmentInfo* GetSegmentInfo() { return &segment_info_; } + + // Search the Tracks and return the track that matches |track_number|. + // Returns NULL if there is no track match. + Track* GetTrackByNumber(uint64_t track_number) const; + + // Toggles whether to output a cues element. + void OutputCues(bool output_cues); + + // Toggles whether to write the last frame in each Cluster with Duration. + void AccurateClusterDuration(bool accurate_cluster_duration); + + // Toggles whether to write the Cluster Timecode using exactly 8 bytes. + void UseFixedSizeClusterTimecode(bool fixed_size_cluster_timecode); + + // Sets if the muxer will output files in chunks or not. |chunking| is a + // flag telling whether or not to turn on chunking. |filename| is the base + // filename for the chunk files. The header chunk file will be named + // |filename|.hdr and the data chunks will be named + // |filename|_XXXXXX.chk. Chunking implies that the muxer will be writing + // to files so the muxer will use the default MkvWriter class to control + // what data is written to what files. Returns true on success. + // TODO: Should we change the IMkvWriter Interface to add Open and Close? + // That will force the interface to be dependent on files. + bool SetChunking(bool chunking, const char* filename); + + bool chunking() const { return chunking_; } + uint64_t cues_track() const { return cues_track_; } + void set_max_cluster_duration(uint64_t max_cluster_duration) { + max_cluster_duration_ = max_cluster_duration; + } + uint64_t max_cluster_duration() const { return max_cluster_duration_; } + void set_max_cluster_size(uint64_t max_cluster_size) { + max_cluster_size_ = max_cluster_size; + } + uint64_t max_cluster_size() const { return max_cluster_size_; } + void set_mode(Mode mode) { mode_ = mode; } + Mode mode() const { return mode_; } + CuesPosition cues_position() const { return cues_position_; } + bool output_cues() const { return output_cues_; } + void set_estimate_file_duration(bool estimate_duration) { + estimate_file_duration_ = estimate_duration; + } + bool estimate_file_duration() const { return estimate_file_duration_; } + const SegmentInfo* segment_info() const { return &segment_info_; } + void set_duration(double duration) { duration_ = duration; } + double duration() const { return duration_; } + + // Returns true when codec IDs are valid for WebM. + bool DocTypeIsWebm() const; + + private: + // Checks if header information has been output and initialized. If not it + // will output the Segment element and initialize the SeekHead elment and + // Cues elements. + bool CheckHeaderInfo(); + + // Sets |doc_type_version_| based on the current element requirements. + void UpdateDocTypeVersion(); + + // Sets |name| according to how many chunks have been written. |ext| is the + // file extension. |name| must be deleted by the calling app. Returns true + // on success. + bool UpdateChunkName(const char* ext, char** name) const; + + // Returns the maximum offset within the segment's payload. When chunking + // this function is needed to determine offsets of elements within the + // chunked files. Returns -1 on error. + int64_t MaxOffset(); + + // Adds the frame to our frame array. + bool QueueFrame(Frame* frame); + + // Output all frames that are queued. Returns -1 on error, otherwise + // it returns the number of frames written. + int WriteFramesAll(); + + // Output all frames that are queued that have an end time that is less + // then |timestamp|. Returns true on success and if there are no frames + // queued. + bool WriteFramesLessThan(uint64_t timestamp); + + // Outputs the segment header, Segment Information element, SeekHead element, + // and Tracks element to |writer_|. + bool WriteSegmentHeader(); + + // Given a frame with the specified timestamp (nanosecond units) and + // keyframe status, determine whether a new cluster should be + // created, before writing enqueued frames and the frame itself. The + // function returns one of the following values: + // -1 = error: an out-of-order frame was detected + // 0 = do not create a new cluster, and write frame to the existing cluster + // 1 = create a new cluster, and write frame to that new cluster + // 2 = create a new cluster, and re-run test + int TestFrame(uint64_t track_num, uint64_t timestamp_ns, bool key) const; + + // Create a new cluster, using the earlier of the first enqueued + // frame, or the indicated time. Returns true on success. + bool MakeNewCluster(uint64_t timestamp_ns); + + // Checks whether a new cluster needs to be created, and if so + // creates a new cluster. Returns false if creation of a new cluster + // was necessary but creation was not successful. + bool DoNewClusterProcessing(uint64_t track_num, uint64_t timestamp_ns, + bool key); + + // Adjusts Cue Point values (to place Cues before Clusters) so that they + // reflect the correct offsets. + void MoveCuesBeforeClusters(); + + // This function recursively computes the correct cluster offsets (this is + // done to move the Cues before Clusters). It recursively updates the change + // in size (which indicates a change in cluster offset) until no sizes change. + // Parameters: + // diff - indicates the difference in size of the Cues element that needs to + // accounted for. + // index - index in the list of Cues which is currently being adjusted. + // cue_size - sum of size of all the CuePoint elements. + void MoveCuesBeforeClustersHelper(uint64_t diff, int index, + uint64_t* cue_size); + + // Seeds the random number generator used to make UIDs. + unsigned int seed_; + + // WebM elements + Cues cues_; + SeekHead seek_head_; + SegmentInfo segment_info_; + Tracks tracks_; + Chapters chapters_; + Tags tags_; + + // Number of chunks written. + int chunk_count_; + + // Current chunk filename. + char* chunk_name_; + + // Default MkvWriter object created by this class used for writing clusters + // out in separate files. + MkvWriter* chunk_writer_cluster_; + + // Default MkvWriter object created by this class used for writing Cues + // element out to a file. + MkvWriter* chunk_writer_cues_; + + // Default MkvWriter object created by this class used for writing the + // Matroska header out to a file. + MkvWriter* chunk_writer_header_; + + // Flag telling whether or not the muxer is chunking output to multiple + // files. + bool chunking_; + + // Base filename for the chunked files. + char* chunking_base_name_; + + // File position offset where the Clusters end. + int64_t cluster_end_offset_; + + // List of clusters. + Cluster** cluster_list_; + + // Number of cluster pointers allocated in the cluster list. + int32_t cluster_list_capacity_; + + // Number of clusters in the cluster list. + int32_t cluster_list_size_; + + // Indicates whether Cues should be written before or after Clusters + CuesPosition cues_position_; + + // Track number that is associated with the cues element for this segment. + uint64_t cues_track_; + + // Tells the muxer to force a new cluster on the next Block. + bool force_new_cluster_; + + // List of stored audio frames. These variables are used to store frames so + // the muxer can follow the guideline "Audio blocks that contain the video + // key frame's timecode should be in the same cluster as the video key frame + // block." + Frame** frames_; + + // Number of frame pointers allocated in the frame list. + int32_t frames_capacity_; + + // Number of frames in the frame list. + int32_t frames_size_; + + // Flag telling if a video track has been added to the segment. + bool has_video_; + + // Flag telling if the segment's header has been written. + bool header_written_; + + // Duration of the last block in nanoseconds. + uint64_t last_block_duration_; + + // Last timestamp in nanoseconds added to a cluster. + uint64_t last_timestamp_; + + // Last timestamp in nanoseconds by track number added to a cluster. + uint64_t last_track_timestamp_[kMaxTrackNumber]; + + // Number of frames written per track. + uint64_t track_frames_written_[kMaxTrackNumber]; + + // Maximum time in nanoseconds for a cluster duration. This variable is a + // guideline and some clusters may have a longer duration. Default is 30 + // seconds. + uint64_t max_cluster_duration_; + + // Maximum size in bytes for a cluster. This variable is a guideline and + // some clusters may have a larger size. Default is 0 which signifies that + // the muxer will decide the size. + uint64_t max_cluster_size_; + + // The mode that segment is in. If set to |kLive| the writer must not + // seek backwards. + Mode mode_; + + // Flag telling the muxer that a new cue point should be added. + bool new_cuepoint_; + + // TODO(fgalligan): Should we add support for more than one Cues element? + // Flag whether or not the muxer should output a Cues element. + bool output_cues_; + + // Flag whether or not the last frame in each Cluster will have a Duration + // element in it. + bool accurate_cluster_duration_; + + // Flag whether or not to write the Cluster Timecode using exactly 8 bytes. + bool fixed_size_cluster_timecode_; + + // Flag whether or not to estimate the file duration. + bool estimate_file_duration_; + + // The size of the EBML header, used to validate the header if + // WriteEbmlHeader() is called more than once. + int32_t ebml_header_size_; + + // The file position of the segment's payload. + int64_t payload_pos_; + + // The file position of the element's size. + int64_t size_position_; + + // Current DocTypeVersion (|doc_type_version_|) and that written in + // WriteSegmentHeader(). + // WriteEbmlHeader() will be called from Finalize() if |doc_type_version_| + // differs from |doc_type_version_written_|. + uint32_t doc_type_version_; + uint32_t doc_type_version_written_; + + // If |duration_| is > 0, then explicitly set the duration of the segment. + double duration_; + + // Pointer to the writer objects. Not owned by this class. + IMkvWriter* writer_cluster_; + IMkvWriter* writer_cues_; + IMkvWriter* writer_header_; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Segment); +}; + +} // namespace mkvmuxer + +#endif // ESP32 +#endif // MKVMUXER_MKVMUXER_H_ diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxertypes.h b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxertypes.h new file mode 100644 index 000000000..e5db12160 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxertypes.h @@ -0,0 +1,28 @@ +// Copyright (c) 2012 The WebM project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. + +#ifndef MKVMUXER_MKVMUXERTYPES_H_ +#define MKVMUXER_MKVMUXERTYPES_H_ + +namespace mkvmuxer { +typedef unsigned char uint8; +typedef short int16; +typedef int int32; +typedef unsigned int uint32; +typedef long long int64; +typedef unsigned long long uint64; +} // namespace mkvmuxer + +// Copied from Chromium basictypes.h +// A macro to disallow the copy constructor and operator= functions +// This should be used in the private: declarations for a class +#define LIBWEBM_DISALLOW_COPY_AND_ASSIGN(TypeName) \ + TypeName(const TypeName&); \ + void operator=(const TypeName&) + +#endif // MKVMUXER_MKVMUXERTYPES_HPP_ diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxerutil.cc b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxerutil.cc new file mode 100644 index 000000000..f1941e258 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxerutil.cc @@ -0,0 +1,739 @@ +// Copyright (c) 2012 The WebM project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. + +#include "mkvmuxerutil.h" +#ifdef ESP32 + +#ifdef __ANDROID__ +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "../common/webmids.h" +#include "mkvmuxer.h" +#include "mkvwriter.h" + +namespace mkvmuxer { + +namespace { + +// Date elements are always 8 octets in size. +const int kDateElementSize = 8; + +uint64 WriteBlock(IMkvWriter* writer, const Frame* const frame, int64 timecode, + uint64 timecode_scale) { + uint64 block_additional_elem_size = 0; + uint64 block_addid_elem_size = 0; + uint64 block_more_payload_size = 0; + uint64 block_more_elem_size = 0; + uint64 block_additions_payload_size = 0; + uint64 block_additions_elem_size = 0; + if (frame->additional()) { + block_additional_elem_size = + EbmlElementSize(libwebm::kMkvBlockAdditional, frame->additional(), + frame->additional_length()); + block_addid_elem_size = EbmlElementSize( + libwebm::kMkvBlockAddID, static_cast(frame->add_id())); + + block_more_payload_size = + block_addid_elem_size + block_additional_elem_size; + block_more_elem_size = + EbmlMasterElementSize(libwebm::kMkvBlockMore, block_more_payload_size) + + block_more_payload_size; + block_additions_payload_size = block_more_elem_size; + block_additions_elem_size = + EbmlMasterElementSize(libwebm::kMkvBlockAdditions, + block_additions_payload_size) + + block_additions_payload_size; + } + + uint64 discard_padding_elem_size = 0; + if (frame->discard_padding() != 0) { + discard_padding_elem_size = + EbmlElementSize(libwebm::kMkvDiscardPadding, + static_cast(frame->discard_padding())); + } + + const uint64 reference_block_timestamp = + frame->reference_block_timestamp() / timecode_scale; + uint64 reference_block_elem_size = 0; + if (!frame->is_key()) { + reference_block_elem_size = + EbmlElementSize(libwebm::kMkvReferenceBlock, reference_block_timestamp); + } + + const uint64 duration = frame->duration() / timecode_scale; + uint64 block_duration_elem_size = 0; + if (duration > 0) + block_duration_elem_size = + EbmlElementSize(libwebm::kMkvBlockDuration, duration); + + const uint64 block_payload_size = 4 + frame->length(); + const uint64 block_elem_size = + EbmlMasterElementSize(libwebm::kMkvBlock, block_payload_size) + + block_payload_size; + + const uint64 block_group_payload_size = + block_elem_size + block_additions_elem_size + block_duration_elem_size + + discard_padding_elem_size + reference_block_elem_size; + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlockGroup, + block_group_payload_size)) { + return 0; + } + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlock, block_payload_size)) + return 0; + + if (WriteUInt(writer, frame->track_number())) + return 0; + + if (SerializeInt(writer, timecode, 2)) + return 0; + + // For a Block, flags is always 0. + if (SerializeInt(writer, 0, 1)) + return 0; + + if (writer->Write(frame->frame(), static_cast(frame->length()))) + return 0; + + if (frame->additional()) { + if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlockAdditions, + block_additions_payload_size)) { + return 0; + } + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlockMore, + block_more_payload_size)) + return 0; + + if (!WriteEbmlElement(writer, libwebm::kMkvBlockAddID, + static_cast(frame->add_id()))) + return 0; + + if (!WriteEbmlElement(writer, libwebm::kMkvBlockAdditional, + frame->additional(), frame->additional_length())) { + return 0; + } + } + + if (frame->discard_padding() != 0 && + !WriteEbmlElement(writer, libwebm::kMkvDiscardPadding, + static_cast(frame->discard_padding()))) { + return false; + } + + if (!frame->is_key() && !WriteEbmlElement(writer, libwebm::kMkvReferenceBlock, + reference_block_timestamp)) { + return false; + } + + if (duration > 0 && + !WriteEbmlElement(writer, libwebm::kMkvBlockDuration, duration)) { + return false; + } + return EbmlMasterElementSize(libwebm::kMkvBlockGroup, + block_group_payload_size) + + block_group_payload_size; +} + +uint64 WriteSimpleBlock(IMkvWriter* writer, const Frame* const frame, + int64 timecode) { + if (WriteID(writer, libwebm::kMkvSimpleBlock)) + return 0; + + const int32 size = static_cast(frame->length()) + 4; + if (WriteUInt(writer, size)) + return 0; + + if (WriteUInt(writer, static_cast(frame->track_number()))) + return 0; + + if (SerializeInt(writer, timecode, 2)) + return 0; + + uint64 flags = 0; + if (frame->is_key()) + flags |= 0x80; + + if (SerializeInt(writer, flags, 1)) + return 0; + + if (writer->Write(frame->frame(), static_cast(frame->length()))) + return 0; + + return GetUIntSize(libwebm::kMkvSimpleBlock) + GetCodedUIntSize(size) + 4 + + frame->length(); +} + +} // namespace + +int32 GetCodedUIntSize(uint64 value) { + if (value < 0x000000000000007FULL) + return 1; + else if (value < 0x0000000000003FFFULL) + return 2; + else if (value < 0x00000000001FFFFFULL) + return 3; + else if (value < 0x000000000FFFFFFFULL) + return 4; + else if (value < 0x00000007FFFFFFFFULL) + return 5; + else if (value < 0x000003FFFFFFFFFFULL) + return 6; + else if (value < 0x0001FFFFFFFFFFFFULL) + return 7; + return 8; +} + +int32 GetUIntSize(uint64 value) { + if (value < 0x0000000000000100ULL) + return 1; + else if (value < 0x0000000000010000ULL) + return 2; + else if (value < 0x0000000001000000ULL) + return 3; + else if (value < 0x0000000100000000ULL) + return 4; + else if (value < 0x0000010000000000ULL) + return 5; + else if (value < 0x0001000000000000ULL) + return 6; + else if (value < 0x0100000000000000ULL) + return 7; + return 8; +} + +int32 GetIntSize(int64 value) { + // Doubling the requested value ensures positive values with their high bit + // set are written with 0-padding to avoid flipping the signedness. + const uint64 v = (value < 0) ? value ^ -1LL : value; + return GetUIntSize(2 * v); +} + +uint64 EbmlMasterElementSize(uint64 type, uint64 value) { + // Size of EBML ID + int32 ebml_size = GetUIntSize(type); + + // Datasize + ebml_size += GetCodedUIntSize(value); + + return ebml_size; +} + +uint64 EbmlElementSize(uint64 type, int64 value) { + // Size of EBML ID + int32 ebml_size = GetUIntSize(type); + + // Datasize + ebml_size += GetIntSize(value); + + // Size of Datasize + ebml_size++; + + return ebml_size; +} + +uint64 EbmlElementSize(uint64 type, uint64 value) { + return EbmlElementSize(type, value, 0); +} + +uint64 EbmlElementSize(uint64 type, uint64 value, uint64 fixed_size) { + // Size of EBML ID + uint64 ebml_size = GetUIntSize(type); + + // Datasize + ebml_size += (fixed_size > 0) ? fixed_size : GetUIntSize(value); + + // Size of Datasize + ebml_size++; + + return ebml_size; +} + +uint64 EbmlElementSize(uint64 type, float /* value */) { + // Size of EBML ID + uint64 ebml_size = GetUIntSize(type); + + // Datasize + ebml_size += sizeof(float); + + // Size of Datasize + ebml_size++; + + return ebml_size; +} + +uint64 EbmlElementSize(uint64 type, const char* value) { + if (!value) + return 0; + + // Size of EBML ID + uint64 ebml_size = GetUIntSize(type); + + // Datasize + ebml_size += strlen(value); + + // Size of Datasize + ebml_size += GetCodedUIntSize(strlen(value)); + + return ebml_size; +} + +uint64 EbmlElementSize(uint64 type, const uint8* value, uint64 size) { + if (!value) + return 0; + + // Size of EBML ID + uint64 ebml_size = GetUIntSize(type); + + // Datasize + ebml_size += size; + + // Size of Datasize + ebml_size += GetCodedUIntSize(size); + + return ebml_size; +} + +uint64 EbmlDateElementSize(uint64 type) { + // Size of EBML ID + uint64 ebml_size = GetUIntSize(type); + + // Datasize + ebml_size += kDateElementSize; + + // Size of Datasize + ebml_size++; + + return ebml_size; +} + +int32 SerializeInt(IMkvWriter* writer, int64 value, int32 size) { + if (!writer || size < 1 || size > 8) + return -1; + + for (int32 i = 1; i <= size; ++i) { + const int32 byte_count = size - i; + const int32 bit_count = byte_count * 8; + + const int64 bb = value >> bit_count; + const uint8 b = static_cast(bb); + + const int32 status = writer->Write(&b, 1); + + if (status < 0) + return status; + } + + return 0; +} + +int32 SerializeFloat(IMkvWriter* writer, float f) { + if (!writer) + return -1; + + assert(sizeof(uint32) == sizeof(float)); + // This union is merely used to avoid a reinterpret_cast from float& to + // uint32& which will result in violation of strict aliasing. + union U32 { + uint32 u32; + float f; + } value; + value.f = f; + + for (int32 i = 1; i <= 4; ++i) { + const int32 byte_count = 4 - i; + const int32 bit_count = byte_count * 8; + + const uint8 byte = static_cast(value.u32 >> bit_count); + + const int32 status = writer->Write(&byte, 1); + + if (status < 0) + return status; + } + + return 0; +} + +int32 WriteUInt(IMkvWriter* writer, uint64 value) { + if (!writer) + return -1; + + int32 size = GetCodedUIntSize(value); + + return WriteUIntSize(writer, value, size); +} + +int32 WriteUIntSize(IMkvWriter* writer, uint64 value, int32 size) { + if (!writer || size < 0 || size > 8) + return -1; + + if (size > 0) { + const uint64 bit = 1LL << (size * 7); + + if (value > (bit - 2)) + return -1; + + value |= bit; + } else { + size = 1; + int64 bit; + + for (;;) { + bit = 1LL << (size * 7); + const uint64 max = bit - 2; + + if (value <= max) + break; + + ++size; + } + + if (size > 8) + return false; + + value |= bit; + } + + return SerializeInt(writer, value, size); +} + +int32 WriteID(IMkvWriter* writer, uint64 type) { + if (!writer) + return -1; + + writer->ElementStartNotify(type, writer->Position()); + + const int32 size = GetUIntSize(type); + + return SerializeInt(writer, type, size); +} + +bool WriteEbmlMasterElement(IMkvWriter* writer, uint64 type, uint64 size) { + if (!writer) + return false; + + if (WriteID(writer, type)) + return false; + + if (WriteUInt(writer, size)) + return false; + + return true; +} + +bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value) { + return WriteEbmlElement(writer, type, value, 0); +} + +bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value, + uint64 fixed_size) { + if (!writer) + return false; + + if (WriteID(writer, type)) + return false; + + uint64 size = GetUIntSize(value); + if (fixed_size > 0) { + if (size > fixed_size) + return false; + size = fixed_size; + } + if (WriteUInt(writer, size)) + return false; + + if (SerializeInt(writer, value, static_cast(size))) + return false; + + return true; +} + +bool WriteEbmlElement(IMkvWriter* writer, uint64 type, int64 value) { + if (!writer) + return false; + + if (WriteID(writer, type)) + return 0; + + const uint64 size = GetIntSize(value); + if (WriteUInt(writer, size)) + return false; + + if (SerializeInt(writer, value, static_cast(size))) + return false; + + return true; +} + +bool WriteEbmlElement(IMkvWriter* writer, uint64 type, float value) { + if (!writer) + return false; + + if (WriteID(writer, type)) + return false; + + if (WriteUInt(writer, 4)) + return false; + + if (SerializeFloat(writer, value)) + return false; + + return true; +} + +bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const char* value) { + if (!writer || !value) + return false; + + if (WriteID(writer, type)) + return false; + + const uint64 length = strlen(value); + if (WriteUInt(writer, length)) + return false; + + if (writer->Write(value, static_cast(length))) + return false; + + return true; +} + +bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const uint8* value, + uint64 size) { + if (!writer || !value || size < 1) + return false; + + if (WriteID(writer, type)) + return false; + + if (WriteUInt(writer, size)) + return false; + + if (writer->Write(value, static_cast(size))) + return false; + + return true; +} + +bool WriteEbmlDateElement(IMkvWriter* writer, uint64 type, int64 value) { + if (!writer) + return false; + + if (WriteID(writer, type)) + return false; + + if (WriteUInt(writer, kDateElementSize)) + return false; + + if (SerializeInt(writer, value, kDateElementSize)) + return false; + + return true; +} + +uint64 WriteFrame(IMkvWriter* writer, const Frame* const frame, + Cluster* cluster) { + if (!writer || !frame || !frame->IsValid() || !cluster || + !cluster->timecode_scale()) + return 0; + + // Technically the timecode for a block can be less than the + // timecode for the cluster itself (remember that block timecode + // is a signed, 16-bit integer). However, as a simplification we + // only permit non-negative cluster-relative timecodes for blocks. + const int64 relative_timecode = cluster->GetRelativeTimecode( + frame->timestamp() / cluster->timecode_scale()); + if (relative_timecode < 0 || relative_timecode > kMaxBlockTimecode) + return 0; + + return frame->CanBeSimpleBlock() + ? WriteSimpleBlock(writer, frame, relative_timecode) + : WriteBlock(writer, frame, relative_timecode, + cluster->timecode_scale()); +} + +uint64 WriteVoidElement(IMkvWriter* writer, uint64 size) { + if (!writer) + return false; + + // Subtract one for the void ID and the coded size. + uint64 void_entry_size = size - 1 - GetCodedUIntSize(size - 1); + uint64 void_size = EbmlMasterElementSize(libwebm::kMkvVoid, void_entry_size) + + void_entry_size; + + if (void_size != size) + return 0; + + const int64 payload_position = writer->Position(); + if (payload_position < 0) + return 0; + + if (WriteID(writer, libwebm::kMkvVoid)) + return 0; + + if (WriteUInt(writer, void_entry_size)) + return 0; + + const uint8 value = 0; + for (int32 i = 0; i < static_cast(void_entry_size); ++i) { + if (writer->Write(&value, 1)) + return 0; + } + + const int64 stop_position = writer->Position(); + if (stop_position < 0 || + stop_position - payload_position != static_cast(void_size)) + return 0; + + return void_size; +} + +void GetVersion(int32_t* major, int32_t* minor, int32_t* build, int32_t* revision) { + *major = 0; + *minor = 3; + *build = 3; + *revision = 0; +} + +uint64 MakeUID(unsigned int* seed) { + uint64 uid = 0; + + for (int i = 0; i < 7; ++i) { // avoid problems with 8-byte values + uid <<= 8; + +// TODO(fgalligan): Move random number generation to platform specific code. +#ifdef _WIN32 + (void)seed; + const int32 nn = rand(); +#elif defined(__ANDROID__) + (void)seed; + int32 temp_num = 1; + int fd = open("/dev/urandom", O_RDONLY); + if (fd != -1) { + read(fd, &temp_num, sizeof(temp_num)); + close(fd); + } + const int32 nn = temp_num; +#else + const int32 nn = rand_r(seed); +#endif + const int32 n = 0xFF & (nn >> 4); // throw away low-order bits + + uid |= n; + } + + return uid; +} + +bool IsMatrixCoefficientsValueValid(uint64_t value) { + switch (value) { + case mkvmuxer::Colour::kGbr: + case mkvmuxer::Colour::kBt709: + case mkvmuxer::Colour::kUnspecifiedMc: + case mkvmuxer::Colour::kReserved: + case mkvmuxer::Colour::kFcc: + case mkvmuxer::Colour::kBt470bg: + case mkvmuxer::Colour::kSmpte170MMc: + case mkvmuxer::Colour::kSmpte240MMc: + case mkvmuxer::Colour::kYcocg: + case mkvmuxer::Colour::kBt2020NonConstantLuminance: + case mkvmuxer::Colour::kBt2020ConstantLuminance: + return true; + } + return false; +} + +bool IsChromaSitingHorzValueValid(uint64_t value) { + switch (value) { + case mkvmuxer::Colour::kUnspecifiedCsh: + case mkvmuxer::Colour::kLeftCollocated: + case mkvmuxer::Colour::kHalfCsh: + return true; + } + return false; +} + +bool IsChromaSitingVertValueValid(uint64_t value) { + switch (value) { + case mkvmuxer::Colour::kUnspecifiedCsv: + case mkvmuxer::Colour::kTopCollocated: + case mkvmuxer::Colour::kHalfCsv: + return true; + } + return false; +} + +bool IsColourRangeValueValid(uint64_t value) { + switch (value) { + case mkvmuxer::Colour::kUnspecifiedCr: + case mkvmuxer::Colour::kBroadcastRange: + case mkvmuxer::Colour::kFullRange: + case mkvmuxer::Colour::kMcTcDefined: + return true; + } + return false; +} + +bool IsTransferCharacteristicsValueValid(uint64_t value) { + switch (value) { + case mkvmuxer::Colour::kIturBt709Tc: + case mkvmuxer::Colour::kUnspecifiedTc: + case mkvmuxer::Colour::kReservedTc: + case mkvmuxer::Colour::kGamma22Curve: + case mkvmuxer::Colour::kGamma28Curve: + case mkvmuxer::Colour::kSmpte170MTc: + case mkvmuxer::Colour::kSmpte240MTc: + case mkvmuxer::Colour::kLinear: + case mkvmuxer::Colour::kLog: + case mkvmuxer::Colour::kLogSqrt: + case mkvmuxer::Colour::kIec6196624: + case mkvmuxer::Colour::kIturBt1361ExtendedColourGamut: + case mkvmuxer::Colour::kIec6196621: + case mkvmuxer::Colour::kIturBt202010bit: + case mkvmuxer::Colour::kIturBt202012bit: + case mkvmuxer::Colour::kSmpteSt2084: + case mkvmuxer::Colour::kSmpteSt4281Tc: + case mkvmuxer::Colour::kAribStdB67Hlg: + return true; + } + return false; +} + +bool IsPrimariesValueValid(uint64_t value) { + switch (value) { + case mkvmuxer::Colour::kReservedP0: + case mkvmuxer::Colour::kIturBt709P: + case mkvmuxer::Colour::kUnspecifiedP: + case mkvmuxer::Colour::kReservedP3: + case mkvmuxer::Colour::kIturBt470M: + case mkvmuxer::Colour::kIturBt470Bg: + case mkvmuxer::Colour::kSmpte170MP: + case mkvmuxer::Colour::kSmpte240MP: + case mkvmuxer::Colour::kFilm: + case mkvmuxer::Colour::kIturBt2020: + case mkvmuxer::Colour::kSmpteSt4281P: + case mkvmuxer::Colour::kJedecP22Phosphors: + return true; + } + return false; +} + +} // namespace mkvmuxer +#endif // ESP32 \ No newline at end of file diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxerutil.h b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxerutil.h new file mode 100644 index 000000000..461b16ac0 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxerutil.h @@ -0,0 +1,117 @@ +// Copyright (c) 2012 The WebM project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +#ifndef MKVMUXER_MKVMUXERUTIL_H_ +#define MKVMUXER_MKVMUXERUTIL_H_ +#ifdef ESP32 + +#include + +#include "mkvmuxertypes.h" + +namespace mkvmuxer { +class Cluster; +class Frame; +class IMkvWriter; + +// TODO(tomfinegan): mkvmuxer:: integer types continue to be used here because +// changing them causes pain for downstream projects. It would be nice if a +// solution that allows removal of the mkvmuxer:: integer types while avoiding +// pain for downstream users of libwebm. Considering that mkvmuxerutil.{cc,h} +// are really, for the great majority of cases, EBML size calculation and writer +// functions, perhaps a more EBML focused utility would be the way to go as a +// first step. + +const uint64 kEbmlUnknownValue = 0x01FFFFFFFFFFFFFFULL; +const int64 kMaxBlockTimecode = 0x07FFFLL; + +// Writes out |value| in Big Endian order. Returns 0 on success. +int32 SerializeInt(IMkvWriter* writer, int64 value, int32 size); + +// Writes out |f| in Big Endian order. Returns 0 on success. +int32 SerializeFloat(IMkvWriter* writer, float f); + +// Returns the size in bytes of the element. +int32 GetUIntSize(uint64 value); +int32 GetIntSize(int64 value); +int32 GetCodedUIntSize(uint64 value); +uint64 EbmlMasterElementSize(uint64 type, uint64 value); +uint64 EbmlElementSize(uint64 type, int64 value); +uint64 EbmlElementSize(uint64 type, uint64 value); +uint64 EbmlElementSize(uint64 type, float value); +uint64 EbmlElementSize(uint64 type, const char* value); +uint64 EbmlElementSize(uint64 type, const uint8* value, uint64 size); +uint64 EbmlDateElementSize(uint64 type); + +// Returns the size in bytes of the element assuming that the element was +// written using |fixed_size| bytes. If |fixed_size| is set to zero, then it +// computes the necessary number of bytes based on |value|. +uint64 EbmlElementSize(uint64 type, uint64 value, uint64 fixed_size); + +// Creates an EBML coded number from |value| and writes it out. The size of +// the coded number is determined by the value of |value|. |value| must not +// be in a coded form. Returns 0 on success. +int32 WriteUInt(IMkvWriter* writer, uint64 value); + +// Creates an EBML coded number from |value| and writes it out. The size of +// the coded number is determined by the value of |size|. |value| must not +// be in a coded form. Returns 0 on success. +int32 WriteUIntSize(IMkvWriter* writer, uint64 value, int32 size); + +// Output an Mkv master element. Returns true if the element was written. +bool WriteEbmlMasterElement(IMkvWriter* writer, uint64 value, uint64 size); + +// Outputs an Mkv ID, calls |IMkvWriter::ElementStartNotify|, and passes the +// ID to |SerializeInt|. Returns 0 on success. +int32 WriteID(IMkvWriter* writer, uint64 type); + +// Output an Mkv non-master element. Returns true if the element was written. +bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value); +bool WriteEbmlElement(IMkvWriter* writer, uint64 type, int64 value); +bool WriteEbmlElement(IMkvWriter* writer, uint64 type, float value); +bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const char* value); +bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const uint8* value, + uint64 size); +bool WriteEbmlDateElement(IMkvWriter* writer, uint64 type, int64 value); + +// Output an Mkv non-master element using fixed size. The element will be +// written out using exactly |fixed_size| bytes. If |fixed_size| is set to zero +// then it computes the necessary number of bytes based on |value|. Returns true +// if the element was written. +bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value, + uint64 fixed_size); + +// Output a Mkv Frame. It decides the correct element to write (Block vs +// SimpleBlock) based on the parameters of the Frame. +uint64 WriteFrame(IMkvWriter* writer, const Frame* const frame, + Cluster* cluster); + +// Output a void element. |size| must be the entire size in bytes that will be +// void. The function will calculate the size of the void header and subtract +// it from |size|. +uint64 WriteVoidElement(IMkvWriter* writer, uint64 size); + +// Returns the version number of the muxer in |major|, |minor|, |build|, +// and |revision|. +void GetVersion(int32_t* major, int32_t* minor, int32_t* build, int32_t* revision); + +// Returns a random number to be used for UID, using |seed| to seed +// the random-number generator (see POSIX rand_r() for semantics). +uint64 MakeUID(unsigned int* seed); + +// Colour field validation helpers. All return true when |value| is valid. +bool IsMatrixCoefficientsValueValid(uint64_t value); +bool IsChromaSitingHorzValueValid(uint64_t value); +bool IsChromaSitingVertValueValid(uint64_t value); +bool IsColourRangeValueValid(uint64_t value); +bool IsTransferCharacteristicsValueValid(uint64_t value); +bool IsPrimariesValueValid(uint64_t value); + +} // namespace mkvmuxer + +#endif // ESP32 +#endif // MKVMUXER_MKVMUXERUTIL_H_ diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvwriter.cc b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvwriter.cc new file mode 100644 index 000000000..47b62f034 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvwriter.cc @@ -0,0 +1,101 @@ +// Copyright (c) 2012 The WebM project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. + +#include "mkvwriter.h" +#ifdef ESP32 + +#include + +#ifdef _MSC_VER +#include // for _SH_DENYWR +#endif + +namespace mkvmuxer { + +MkvWriter::MkvWriter() : file_(NULL), writer_owns_file_(true) {} + +MkvWriter::MkvWriter(File* fp) : file_(fp), writer_owns_file_(false), use_write_cb_(false) {} + +MkvWriter::MkvWriter(void* userdata, int(*cb)(void* userdata, const void* buffer, uint32 length)) : write_cb_(cb), cb_userdata_(userdata), writer_owns_file_(false), use_write_cb_(true) {} + +MkvWriter::~MkvWriter() { Close(); } + +int32 MkvWriter::Write(const void* buffer, uint32 length) { + if (!file_ && !write_cb_) + return -1; + + if (length == 0) + return 0; + + if (buffer == NULL) + return -1; + + size_t bytes_written = 0; + if(!use_write_cb_){ + bytes_written = file_->write((const uint8_t *)buffer, (size_t)length); + } else { + bytes_written = write_cb_(cb_userdata_, buffer, length); + write_cb_written_ += bytes_written; + } + + return (bytes_written == length) ? 0 : -1; +} + +bool MkvWriter::Open(const char* filename) { + return false; +} + +void MkvWriter::Close() { + if (file_ && writer_owns_file_) { + file_->close(); + } + file_ = NULL; +} + +int64 MkvWriter::Position() const { + if (!file_ || use_write_cb_) + return write_cb_written_; + + return file_->position(); +} + +int32 MkvWriter::Position(int64 position) { + if (use_write_cb_ && write_cb_written_ == position) + return 0; + if (!file_ || use_write_cb_) + return -1; + + return file_->seek(position); + +// #ifdef _MSC_VER +// return _fseeki64(file_, position, SEEK_SET); +// #elif defined(_WIN32) +// return fseeko64(file_, static_cast(position), SEEK_SET); +// #elif !(defined(__ANDROID__) && __ANDROID_API__ < 24 && !defined(__LP64__) && \ +// defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64) +// // POSIX.1 has fseeko and ftello. fseeko and ftello are not available before +// // Android API level 24. See +// // https://android.googlesource.com/platform/bionic/+/main/docs/32-bit-abi.md +// // return fseeko(file_, static_cast(position), SEEK_SET); +// #else +// return fseek(file_, static_cast(position), SEEK_SET); +// #endif +// return -1; +} + +bool MkvWriter::Seekable() const { + if (!file_ || use_write_cb_) + return false; + + return true; +} + +void MkvWriter::ElementStartNotify(uint64, int64) {} + +} // namespace mkvmuxer +#endif // ESP32 \ No newline at end of file diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvwriter.h b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvwriter.h new file mode 100644 index 000000000..b242505cc --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvwriter.h @@ -0,0 +1,60 @@ +// Copyright (c) 2012 The WebM project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. + +#ifndef MKVMUXER_MKVWRITER_H_ +#define MKVMUXER_MKVWRITER_H_ + +#ifdef ESP32 +#include + +#include +#include "mkvmuxer.h" +#include "mkvmuxertypes.h" + +namespace mkvmuxer { + +// Default implementation of the IMkvWriter interface on Windows. +class MkvWriter : public IMkvWriter { + public: + MkvWriter(); + MkvWriter(File* fp); + MkvWriter(void* userdata, int(*cb)(void* userdata, const void* buffer, uint32 length)); + virtual ~MkvWriter(); + + // IMkvWriter interface + virtual int64 Position() const; + virtual int32 Position(int64 position); + virtual bool Seekable() const; + virtual int32 Write(const void* buffer, uint32 length); + virtual void ElementStartNotify(uint64 element_id, int64 position); + + // Creates and opens a file for writing. |filename| is the name of the file + // to open. This function will overwrite the contents of |filename|. Returns + // true on success. + bool Open(const char* filename); + + // Closes an opened file. + void Close(); + + private: + // File handle to output file. + File* file_; + // Callback function to output stream. + int(*write_cb_)(void* userdata, const void* buffer, uint32 length); + void* cb_userdata_; + bool writer_owns_file_; + bool use_write_cb_; + uint32_t write_cb_written_ = 0; + + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(MkvWriter); +}; + +} // namespace mkvmuxer + +#endif // ESP32 +#endif // MKVMUXER_MKVWRITER_H_ diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/mkvparser/mkvparser.cc b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvparser/mkvparser.cc new file mode 100644 index 000000000..32c42317c --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvparser/mkvparser.cc @@ -0,0 +1,8107 @@ +// Copyright (c) 2012 The WebM project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +#include "mkvparser.h" + +#if defined(_MSC_VER) && _MSC_VER < 1800 +#define MSC_COMPAT +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../common/webmids.h" + +namespace mkvparser { +const long long kStringElementSizeLimit = 20 * 1000 * 1000; +const float MasteringMetadata::kValueNotPresent = FLT_MAX; +const long long Colour::kValueNotPresent = LLONG_MAX; +const float Projection::kValueNotPresent = FLT_MAX; + +#ifdef MSC_COMPAT +inline bool isnan(double val) { return !!_isnan(val); } +inline bool isinf(double val) { return !_finite(val); } +#else +inline bool isnan(double val) { return std::isnan(val); } +inline bool isinf(double val) { return std::isinf(val); } +#endif // MSC_COMPAT + +template +Type* SafeArrayAlloc(unsigned long long num_elements, + unsigned long long element_size) { + if (num_elements == 0 || element_size == 0) + return NULL; + + const size_t kMaxAllocSize = 0x80000000; // 2GiB + const unsigned long long num_bytes = num_elements * element_size; + if (element_size > (kMaxAllocSize / num_elements)) + return NULL; + if (num_bytes != static_cast(num_bytes)) + return NULL; + + return new (std::nothrow) Type[static_cast(num_bytes)]; +} + +void GetVersion(int& major, int& minor, int& build, int& revision) { + major = 1; + minor = 1; + build = 3; + revision = 0; +} + +long long ReadUInt(IMkvReader* pReader, long long pos, long& len) { + if (!pReader || pos < 0) + return E_FILE_FORMAT_INVALID; + + len = 1; + unsigned char b; + int status = pReader->Read(pos, 1, &b); + + if (status < 0) // error or underflow + return status; + + if (status > 0) // interpreted as "underflow" + return E_BUFFER_NOT_FULL; + + if (b == 0) // we can't handle u-int values larger than 8 bytes + return E_FILE_FORMAT_INVALID; + + unsigned char m = 0x80; + + while (!(b & m)) { + m >>= 1; + ++len; + } + + long long result = b & (~m); + ++pos; + + for (int i = 1; i < len; ++i) { + status = pReader->Read(pos, 1, &b); + + if (status < 0) { + len = 1; + return status; + } + + if (status > 0) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + result <<= 8; + result |= b; + + ++pos; + } + + return result; +} + +// Reads an EBML ID and returns it. +// An ID must at least 1 byte long, cannot exceed 4, and its value must be +// greater than 0. +// See known EBML values and EBMLMaxIDLength: +// http://www.matroska.org/technical/specs/index.html +// Returns the ID, or a value less than 0 to report an error while reading the +// ID. +long long ReadID(IMkvReader* pReader, long long pos, long& len) { + if (pReader == NULL || pos < 0) + return E_FILE_FORMAT_INVALID; + + // Read the first byte. The length in bytes of the ID is determined by + // finding the first set bit in the first byte of the ID. + unsigned char temp_byte = 0; + int read_status = pReader->Read(pos, 1, &temp_byte); + + if (read_status < 0) + return E_FILE_FORMAT_INVALID; + else if (read_status > 0) // No data to read. + return E_BUFFER_NOT_FULL; + + if (temp_byte == 0) // ID length > 8 bytes; invalid file. + return E_FILE_FORMAT_INVALID; + + int bit_pos = 0; + const int kMaxIdLengthInBytes = 4; + const int kCheckByte = 0x80; + + // Find the first bit that's set. + bool found_bit = false; + for (; bit_pos < kMaxIdLengthInBytes; ++bit_pos) { + if ((kCheckByte >> bit_pos) & temp_byte) { + found_bit = true; + break; + } + } + + if (!found_bit) { + // The value is too large to be a valid ID. + return E_FILE_FORMAT_INVALID; + } + + // Read the remaining bytes of the ID (if any). + const int id_length = bit_pos + 1; + long long ebml_id = temp_byte; + for (int i = 1; i < id_length; ++i) { + ebml_id <<= 8; + read_status = pReader->Read(pos + i, 1, &temp_byte); + + if (read_status < 0) + return E_FILE_FORMAT_INVALID; + else if (read_status > 0) + return E_BUFFER_NOT_FULL; + + ebml_id |= temp_byte; + } + + len = id_length; + return ebml_id; +} + +long long GetUIntLength(IMkvReader* pReader, long long pos, long& len) { + if (!pReader || pos < 0) + return E_FILE_FORMAT_INVALID; + + long long total, available; + + int status = pReader->Length(&total, &available); + if (status < 0 || (total >= 0 && available > total)) + return E_FILE_FORMAT_INVALID; + + len = 1; + + if (pos >= available) + return pos; // too few bytes available + + unsigned char b; + + status = pReader->Read(pos, 1, &b); + + if (status != 0) + return status; + + if (b == 0) // we can't handle u-int values larger than 8 bytes + return E_FILE_FORMAT_INVALID; + + unsigned char m = 0x80; + + while (!(b & m)) { + m >>= 1; + ++len; + } + + return 0; // success +} + +// TODO(vigneshv): This function assumes that unsigned values never have their +// high bit set. +long long UnserializeUInt(IMkvReader* pReader, long long pos, long long size) { + if (!pReader || pos < 0 || (size <= 0) || (size > 8)) + return E_FILE_FORMAT_INVALID; + + long long result = 0; + + for (long long i = 0; i < size; ++i) { + unsigned char b; + + const long status = pReader->Read(pos, 1, &b); + + if (status < 0) + return status; + + result <<= 8; + result |= b; + + ++pos; + } + + return result; +} + +long UnserializeFloat(IMkvReader* pReader, long long pos, long long size_, + double& result) { + if (!pReader || pos < 0 || ((size_ != 4) && (size_ != 8))) + return E_FILE_FORMAT_INVALID; + + const long size = static_cast(size_); + + unsigned char buf[8]; + + const int status = pReader->Read(pos, size, buf); + + if (status < 0) // error + return status; + + if (size == 4) { + union { + float f; + uint32_t ff; + static_assert(sizeof(float) == sizeof(uint32_t), ""); + }; + + ff = 0; + + for (int i = 0;;) { + ff |= buf[i]; + + if (++i >= 4) + break; + + ff <<= 8; + } + + result = f; + } else { + union { + double d; + uint64_t dd; + static_assert(sizeof(double) == sizeof(uint64_t), ""); + }; + + dd = 0; + + for (int i = 0;;) { + dd |= buf[i]; + + if (++i >= 8) + break; + + dd <<= 8; + } + + result = d; + } + + if (mkvparser::isinf(result) || mkvparser::isnan(result)) + return E_FILE_FORMAT_INVALID; + + return 0; +} + +long UnserializeInt(IMkvReader* pReader, long long pos, long long size, + long long& result_ref) { + if (!pReader || pos < 0 || size < 1 || size > 8) + return E_FILE_FORMAT_INVALID; + + signed char first_byte = 0; + const long status = pReader->Read(pos, 1, (unsigned char*)&first_byte); + + if (status < 0) + return status; + + unsigned long long result = static_cast(first_byte); + ++pos; + + for (long i = 1; i < size; ++i) { + unsigned char b; + + const long status = pReader->Read(pos, 1, &b); + + if (status < 0) + return status; + + result <<= 8; + result |= b; + + ++pos; + } + + result_ref = static_cast(result); + return 0; +} + +long UnserializeString(IMkvReader* pReader, long long pos, long long size, + char*& str) { + delete[] str; + str = NULL; + + if (size >= LONG_MAX || size < 0 || size > kStringElementSizeLimit) + return E_FILE_FORMAT_INVALID; + + // +1 for '\0' terminator + const long required_size = static_cast(size) + 1; + + str = SafeArrayAlloc(1, required_size); + if (str == NULL) + return E_FILE_FORMAT_INVALID; + + unsigned char* const buf = reinterpret_cast(str); + + const long status = pReader->Read(pos, static_cast(size), buf); + + if (status) { + delete[] str; + str = NULL; + + return status; + } + + str[required_size - 1] = '\0'; + return 0; +} + +long ParseElementHeader(IMkvReader* pReader, long long& pos, long long stop, + long long& id, long long& size) { + if (stop >= 0 && pos >= stop) + return E_FILE_FORMAT_INVALID; + + long len; + + id = ReadID(pReader, pos, len); + + if (id < 0) + return E_FILE_FORMAT_INVALID; + + pos += len; // consume id + + if (stop >= 0 && pos >= stop) + return E_FILE_FORMAT_INVALID; + + size = ReadUInt(pReader, pos, len); + + if (size < 0 || len < 1 || len > 8) { + // Invalid: Negative payload size, negative or 0 length integer, or integer + // larger than 64 bits (libwebm cannot handle them). + return E_FILE_FORMAT_INVALID; + } + + // Avoid rolling over pos when very close to LLONG_MAX. + const unsigned long long rollover_check = + static_cast(pos) + len; + if (rollover_check > LLONG_MAX) + return E_FILE_FORMAT_INVALID; + + pos += len; // consume length of size + + // pos now designates payload + + if (stop >= 0 && pos > stop) + return E_FILE_FORMAT_INVALID; + + return 0; // success +} + +bool Match(IMkvReader* pReader, long long& pos, unsigned long expected_id, + long long& val) { + if (!pReader || pos < 0) + return false; + + long long total = 0; + long long available = 0; + + const long status = pReader->Length(&total, &available); + if (status < 0 || (total >= 0 && available > total)) + return false; + + long len = 0; + + const long long id = ReadID(pReader, pos, len); + if (id < 0 || (available - pos) > len) + return false; + + if (static_cast(id) != expected_id) + return false; + + pos += len; // consume id + + const long long size = ReadUInt(pReader, pos, len); + if (size < 0 || size > 8 || len < 1 || len > 8 || (available - pos) > len) + return false; + + pos += len; // consume length of size of payload + + val = UnserializeUInt(pReader, pos, size); + if (val < 0) + return false; + + pos += size; // consume size of payload + + return true; +} + +bool Match(IMkvReader* pReader, long long& pos, unsigned long expected_id, + unsigned char*& buf, size_t& buflen) { + if (!pReader || pos < 0) + return false; + + long long total = 0; + long long available = 0; + + long status = pReader->Length(&total, &available); + if (status < 0 || (total >= 0 && available > total)) + return false; + + long len = 0; + const long long id = ReadID(pReader, pos, len); + if (id < 0 || (available - pos) > len) + return false; + + if (static_cast(id) != expected_id) + return false; + + pos += len; // consume id + + const long long size = ReadUInt(pReader, pos, len); + if (size < 0 || len <= 0 || len > 8 || (available - pos) > len) + return false; + + unsigned long long rollover_check = + static_cast(pos) + len; + if (rollover_check > LLONG_MAX) + return false; + + pos += len; // consume length of size of payload + + rollover_check = static_cast(pos) + size; + if (rollover_check > LLONG_MAX) + return false; + + if ((pos + size) > available) + return false; + + if (size >= LONG_MAX) + return false; + + const long buflen_ = static_cast(size); + + buf = SafeArrayAlloc(1, buflen_); + if (!buf) + return false; + + status = pReader->Read(pos, buflen_, buf); + if (status != 0) + return false; + + buflen = buflen_; + + pos += size; // consume size of payload + return true; +} + +EBMLHeader::EBMLHeader() : m_docType(NULL) { Init(); } + +EBMLHeader::~EBMLHeader() { delete[] m_docType; } + +void EBMLHeader::Init() { + m_version = 1; + m_readVersion = 1; + m_maxIdLength = 4; + m_maxSizeLength = 8; + + if (m_docType) { + delete[] m_docType; + m_docType = NULL; + } + + m_docTypeVersion = 1; + m_docTypeReadVersion = 1; +} + +long long EBMLHeader::Parse(IMkvReader* pReader, long long& pos) { + if (!pReader) + return E_FILE_FORMAT_INVALID; + + long long total, available; + + long status = pReader->Length(&total, &available); + + if (status < 0) // error + return status; + + pos = 0; + + // Scan until we find what looks like the first byte of the EBML header. + const long long kMaxScanBytes = (available >= 1024) ? 1024 : available; + const unsigned char kEbmlByte0 = 0x1A; + unsigned char scan_byte = 0; + + while (pos < kMaxScanBytes) { + status = pReader->Read(pos, 1, &scan_byte); + + if (status < 0) // error + return status; + else if (status > 0) + return E_BUFFER_NOT_FULL; + + if (scan_byte == kEbmlByte0) + break; + + ++pos; + } + + long len = 0; + const long long ebml_id = ReadID(pReader, pos, len); + + if (ebml_id == E_BUFFER_NOT_FULL) + return E_BUFFER_NOT_FULL; + + if (len != 4 || ebml_id != libwebm::kMkvEBML) + return E_FILE_FORMAT_INVALID; + + // Move read pos forward to the EBML header size field. + pos += 4; + + // Read length of size field. + long long result = GetUIntLength(pReader, pos, len); + + if (result < 0) // error + return E_FILE_FORMAT_INVALID; + else if (result > 0) // need more data + return E_BUFFER_NOT_FULL; + + if (len < 1 || len > 8) + return E_FILE_FORMAT_INVALID; + + if ((total >= 0) && ((total - pos) < len)) + return E_FILE_FORMAT_INVALID; + + if ((available - pos) < len) + return pos + len; // try again later + + // Read the EBML header size. + result = ReadUInt(pReader, pos, len); + + if (result < 0) // error + return result; + + pos += len; // consume size field + + // pos now designates start of payload + + if ((total >= 0) && ((total - pos) < result)) + return E_FILE_FORMAT_INVALID; + + if ((available - pos) < result) + return pos + result; + + const long long end = pos + result; + + Init(); + + while (pos < end) { + long long id, size; + + status = ParseElementHeader(pReader, pos, end, id, size); + + if (status < 0) // error + return status; + + if (size == 0) + return E_FILE_FORMAT_INVALID; + + if (id == libwebm::kMkvEBMLVersion) { + m_version = UnserializeUInt(pReader, pos, size); + + if (m_version <= 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvEBMLReadVersion) { + m_readVersion = UnserializeUInt(pReader, pos, size); + + if (m_readVersion <= 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvEBMLMaxIDLength) { + m_maxIdLength = UnserializeUInt(pReader, pos, size); + + if (m_maxIdLength <= 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvEBMLMaxSizeLength) { + m_maxSizeLength = UnserializeUInt(pReader, pos, size); + + if (m_maxSizeLength <= 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvDocType) { + if (m_docType) + return E_FILE_FORMAT_INVALID; + + status = UnserializeString(pReader, pos, size, m_docType); + + if (status) // error + return status; + } else if (id == libwebm::kMkvDocTypeVersion) { + m_docTypeVersion = UnserializeUInt(pReader, pos, size); + + if (m_docTypeVersion <= 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvDocTypeReadVersion) { + m_docTypeReadVersion = UnserializeUInt(pReader, pos, size); + + if (m_docTypeReadVersion <= 0) + return E_FILE_FORMAT_INVALID; + } + + pos += size; + } + + if (pos != end) + return E_FILE_FORMAT_INVALID; + + // Make sure DocType, DocTypeReadVersion, and DocTypeVersion are valid. + if (m_docType == NULL || m_docTypeReadVersion <= 0 || m_docTypeVersion <= 0) + return E_FILE_FORMAT_INVALID; + + // Make sure EBMLMaxIDLength and EBMLMaxSizeLength are valid. + if (m_maxIdLength <= 0 || m_maxIdLength > 4 || m_maxSizeLength <= 0 || + m_maxSizeLength > 8) + return E_FILE_FORMAT_INVALID; + + return 0; +} + +Segment::Segment(IMkvReader* pReader, long long elem_start, + // long long elem_size, + long long start, long long size) + : m_pReader(pReader), + m_element_start(elem_start), + // m_element_size(elem_size), + m_start(start), + m_size(size), + m_pos(start), + m_pUnknownSize(0), + m_pSeekHead(NULL), + m_pInfo(NULL), + m_pTracks(NULL), + m_pCues(NULL), + m_pChapters(NULL), + m_pTags(NULL), + m_clusters(NULL), + m_clusterCount(0), + m_clusterPreloadCount(0), + m_clusterSize(0) {} + +Segment::~Segment() { + const long count = m_clusterCount + m_clusterPreloadCount; + + Cluster** i = m_clusters; + Cluster** j = m_clusters + count; + + while (i != j) { + Cluster* const p = *i++; + delete p; + } + + delete[] m_clusters; + + delete m_pTracks; + delete m_pInfo; + delete m_pCues; + delete m_pChapters; + delete m_pTags; + delete m_pSeekHead; +} + +long long Segment::CreateInstance(IMkvReader* pReader, long long pos, + Segment*& pSegment) { + if (pReader == NULL || pos < 0) + return E_PARSE_FAILED; + + pSegment = NULL; + + long long total, available; + + const long status = pReader->Length(&total, &available); + + if (status < 0) // error + return status; + + if (available < 0) + return -1; + + if ((total >= 0) && (available > total)) + return -1; + + // I would assume that in practice this loop would execute + // exactly once, but we allow for other elements (e.g. Void) + // to immediately follow the EBML header. This is fine for + // the source filter case (since the entire file is available), + // but in the splitter case over a network we should probably + // just give up early. We could for example decide only to + // execute this loop a maximum of, say, 10 times. + // TODO: + // There is an implied "give up early" by only parsing up + // to the available limit. We do do that, but only if the + // total file size is unknown. We could decide to always + // use what's available as our limit (irrespective of whether + // we happen to know the total file length). This would have + // as its sense "parse this much of the file before giving up", + // which a slightly different sense from "try to parse up to + // 10 EMBL elements before giving up". + + for (;;) { + if ((total >= 0) && (pos >= total)) + return E_FILE_FORMAT_INVALID; + + // Read ID + long len; + long long result = GetUIntLength(pReader, pos, len); + + if (result) // error, or too few available bytes + return result; + + if ((total >= 0) && ((pos + len) > total)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > available) + return pos + len; + + const long long idpos = pos; + const long long id = ReadID(pReader, pos, len); + + if (id < 0) + return E_FILE_FORMAT_INVALID; + + pos += len; // consume ID + + // Read Size + + result = GetUIntLength(pReader, pos, len); + + if (result) // error, or too few available bytes + return result; + + if ((total >= 0) && ((pos + len) > total)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > available) + return pos + len; + + long long size = ReadUInt(pReader, pos, len); + + if (size < 0) // error + return size; + + pos += len; // consume length of size of element + + // Pos now points to start of payload + + // Handle "unknown size" for live streaming of webm files. + const long long unknown_size = (1LL << (7 * len)) - 1; + + if (id == libwebm::kMkvSegment) { + if (size == unknown_size) + size = -1; + + else if (total < 0) + size = -1; + + else if ((pos + size) > total) + size = -1; + + pSegment = new (std::nothrow) Segment(pReader, idpos, pos, size); + if (pSegment == NULL) + return E_PARSE_FAILED; + + return 0; // success + } + + if (size == unknown_size) + return E_FILE_FORMAT_INVALID; + + if ((total >= 0) && ((pos + size) > total)) + return E_FILE_FORMAT_INVALID; + + if ((pos + size) > available) + return pos + size; + + pos += size; // consume payload + } +} + +long long Segment::ParseHeaders() { + // Outermost (level 0) segment object has been constructed, + // and pos designates start of payload. We need to find the + // inner (level 1) elements. + long long total, available; + + const int status = m_pReader->Length(&total, &available); + + if (status < 0) // error + return status; + + if (total > 0 && available > total) + return E_FILE_FORMAT_INVALID; + + const long long segment_stop = (m_size < 0) ? -1 : m_start + m_size; + + if ((segment_stop >= 0 && total >= 0 && segment_stop > total) || + (segment_stop >= 0 && m_pos > segment_stop)) { + return E_FILE_FORMAT_INVALID; + } + + for (;;) { + if ((total >= 0) && (m_pos >= total)) + break; + + if ((segment_stop >= 0) && (m_pos >= segment_stop)) + break; + + long long pos = m_pos; + const long long element_start = pos; + + // Avoid rolling over pos when very close to LLONG_MAX. + unsigned long long rollover_check = pos + 1ULL; + if (rollover_check > LLONG_MAX) + return E_FILE_FORMAT_INVALID; + + if ((pos + 1) > available) + return (pos + 1); + + long len; + long long result = GetUIntLength(m_pReader, pos, len); + + if (result < 0) // error + return result; + + if (result > 0) { + // MkvReader doesn't have enough data to satisfy this read attempt. + return (pos + 1); + } + + if ((segment_stop >= 0) && ((pos + len) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > available) + return pos + len; + + const long long idpos = pos; + const long long id = ReadID(m_pReader, idpos, len); + + if (id < 0) + return E_FILE_FORMAT_INVALID; + + if (id == libwebm::kMkvCluster) + break; + + pos += len; // consume ID + + if ((pos + 1) > available) + return (pos + 1); + + // Read Size + result = GetUIntLength(m_pReader, pos, len); + + if (result < 0) // error + return result; + + if (result > 0) { + // MkvReader doesn't have enough data to satisfy this read attempt. + return (pos + 1); + } + + if ((segment_stop >= 0) && ((pos + len) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > available) + return pos + len; + + const long long size = ReadUInt(m_pReader, pos, len); + + if (size < 0 || len < 1 || len > 8) { + // TODO(tomfinegan): ReadUInt should return an error when len is < 1 or + // len > 8 is true instead of checking this _everywhere_. + return size; + } + + pos += len; // consume length of size of element + + // Avoid rolling over pos when very close to LLONG_MAX. + rollover_check = static_cast(pos) + size; + if (rollover_check > LLONG_MAX) + return E_FILE_FORMAT_INVALID; + + const long long element_size = size + pos - element_start; + + // Pos now points to start of payload + + if ((segment_stop >= 0) && ((pos + size) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + // We read EBML elements either in total or nothing at all. + + if ((pos + size) > available) + return pos + size; + + if (id == libwebm::kMkvInfo) { + if (m_pInfo) + return E_FILE_FORMAT_INVALID; + + m_pInfo = new (std::nothrow) + SegmentInfo(this, pos, size, element_start, element_size); + + if (m_pInfo == NULL) + return -1; + + const long status = m_pInfo->Parse(); + + if (status) + return status; + } else if (id == libwebm::kMkvTracks) { + if (m_pTracks) + return E_FILE_FORMAT_INVALID; + + m_pTracks = new (std::nothrow) + Tracks(this, pos, size, element_start, element_size); + + if (m_pTracks == NULL) + return -1; + + const long status = m_pTracks->Parse(); + + if (status) + return status; + } else if (id == libwebm::kMkvCues) { + if (m_pCues == NULL) { + m_pCues = new (std::nothrow) + Cues(this, pos, size, element_start, element_size); + + if (m_pCues == NULL) + return -1; + } + } else if (id == libwebm::kMkvSeekHead) { + if (m_pSeekHead == NULL) { + m_pSeekHead = new (std::nothrow) + SeekHead(this, pos, size, element_start, element_size); + + if (m_pSeekHead == NULL) + return -1; + + const long status = m_pSeekHead->Parse(); + + if (status) + return status; + } + } else if (id == libwebm::kMkvChapters) { + if (m_pChapters == NULL) { + m_pChapters = new (std::nothrow) + Chapters(this, pos, size, element_start, element_size); + + if (m_pChapters == NULL) + return -1; + + const long status = m_pChapters->Parse(); + + if (status) + return status; + } + } else if (id == libwebm::kMkvTags) { + if (m_pTags == NULL) { + m_pTags = new (std::nothrow) + Tags(this, pos, size, element_start, element_size); + + if (m_pTags == NULL) + return -1; + + const long status = m_pTags->Parse(); + + if (status) + return status; + } + } + + m_pos = pos + size; // consume payload + } + + if (segment_stop >= 0 && m_pos > segment_stop) + return E_FILE_FORMAT_INVALID; + + if (m_pInfo == NULL) // TODO: liberalize this behavior + return E_FILE_FORMAT_INVALID; + + if (m_pTracks == NULL) + return E_FILE_FORMAT_INVALID; + + return 0; // success +} + +long Segment::LoadCluster(long long& pos, long& len) { + for (;;) { + const long result = DoLoadCluster(pos, len); + + if (result <= 1) + return result; + } +} + +long Segment::DoLoadCluster(long long& pos, long& len) { + if (m_pos < 0) + return DoLoadClusterUnknownSize(pos, len); + + long long total, avail; + + long status = m_pReader->Length(&total, &avail); + + if (status < 0) // error + return status; + + if (total >= 0 && avail > total) + return E_FILE_FORMAT_INVALID; + + const long long segment_stop = (m_size < 0) ? -1 : m_start + m_size; + + long long cluster_off = -1; // offset relative to start of segment + long long cluster_size = -1; // size of cluster payload + + for (;;) { + if ((total >= 0) && (m_pos >= total)) + return 1; // no more clusters + + if ((segment_stop >= 0) && (m_pos >= segment_stop)) + return 1; // no more clusters + + pos = m_pos; + + // Read ID + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + long long result = GetUIntLength(m_pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) + return E_BUFFER_NOT_FULL; + + if ((segment_stop >= 0) && ((pos + len) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long idpos = pos; + const long long id = ReadID(m_pReader, idpos, len); + + if (id < 0) + return E_FILE_FORMAT_INVALID; + + pos += len; // consume ID + + // Read Size + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + result = GetUIntLength(m_pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) + return E_BUFFER_NOT_FULL; + + if ((segment_stop >= 0) && ((pos + len) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long size = ReadUInt(m_pReader, pos, len); + + if (size < 0) // error + return static_cast(size); + + pos += len; // consume length of size of element + + // pos now points to start of payload + + if (size == 0) { + // Missing element payload: move on. + m_pos = pos; + continue; + } + + const long long unknown_size = (1LL << (7 * len)) - 1; + + if ((segment_stop >= 0) && (size != unknown_size) && + ((pos + size) > segment_stop)) { + return E_FILE_FORMAT_INVALID; + } + + if (id == libwebm::kMkvCues) { + if (size == unknown_size) { + // Cues element of unknown size: Not supported. + return E_FILE_FORMAT_INVALID; + } + + if (m_pCues == NULL) { + const long long element_size = (pos - idpos) + size; + + m_pCues = new (std::nothrow) Cues(this, pos, size, idpos, element_size); + if (m_pCues == NULL) + return -1; + } + + m_pos = pos + size; // consume payload + continue; + } + + if (id != libwebm::kMkvCluster) { + // Besides the Segment, Libwebm allows only cluster elements of unknown + // size. Fail the parse upon encountering a non-cluster element reporting + // unknown size. + if (size == unknown_size) + return E_FILE_FORMAT_INVALID; + + m_pos = pos + size; // consume payload + continue; + } + + // We have a cluster. + + cluster_off = idpos - m_start; // relative pos + + if (size != unknown_size) + cluster_size = size; + + break; + } + + if (cluster_off < 0) { + // No cluster, die. + return E_FILE_FORMAT_INVALID; + } + + long long pos_; + long len_; + + status = Cluster::HasBlockEntries(this, cluster_off, pos_, len_); + + if (status < 0) { // error, or underflow + pos = pos_; + len = len_; + + return status; + } + + // status == 0 means "no block entries found" + // status > 0 means "found at least one block entry" + + // TODO: + // The issue here is that the segment increments its own + // pos ptr past the most recent cluster parsed, and then + // starts from there to parse the next cluster. If we + // don't know the size of the current cluster, then we + // must either parse its payload (as we do below), looking + // for the cluster (or cues) ID to terminate the parse. + // This isn't really what we want: rather, we really need + // a way to create the curr cluster object immediately. + // The pity is that cluster::parse can determine its own + // boundary, and we largely duplicate that same logic here. + // + // Maybe we need to get rid of our look-ahead preloading + // in source::parse??? + // + // As we're parsing the blocks in the curr cluster + //(in cluster::parse), we should have some way to signal + // to the segment that we have determined the boundary, + // so it can adjust its own segment::m_pos member. + // + // The problem is that we're asserting in asyncreadinit, + // because we adjust the pos down to the curr seek pos, + // and the resulting adjusted len is > 2GB. I'm suspicious + // that this is even correct, but even if it is, we can't + // be loading that much data in the cache anyway. + + const long idx = m_clusterCount; + + if (m_clusterPreloadCount > 0) { + if (idx >= m_clusterSize) + return E_FILE_FORMAT_INVALID; + + Cluster* const pCluster = m_clusters[idx]; + if (pCluster == NULL || pCluster->m_index >= 0) + return E_FILE_FORMAT_INVALID; + + const long long off = pCluster->GetPosition(); + if (off < 0) + return E_FILE_FORMAT_INVALID; + + if (off == cluster_off) { // preloaded already + if (status == 0) // no entries found + return E_FILE_FORMAT_INVALID; + + if (cluster_size >= 0) + pos += cluster_size; + else { + const long long element_size = pCluster->GetElementSize(); + + if (element_size <= 0) + return E_FILE_FORMAT_INVALID; // TODO: handle this case + + pos = pCluster->m_element_start + element_size; + } + + pCluster->m_index = idx; // move from preloaded to loaded + ++m_clusterCount; + --m_clusterPreloadCount; + + m_pos = pos; // consume payload + if (segment_stop >= 0 && m_pos > segment_stop) + return E_FILE_FORMAT_INVALID; + + return 0; // success + } + } + + if (status == 0) { // no entries found + if (cluster_size >= 0) + pos += cluster_size; + + if ((total >= 0) && (pos >= total)) { + m_pos = total; + return 1; // no more clusters + } + + if ((segment_stop >= 0) && (pos >= segment_stop)) { + m_pos = segment_stop; + return 1; // no more clusters + } + + m_pos = pos; + return 2; // try again + } + + // status > 0 means we have an entry + + Cluster* const pCluster = Cluster::Create(this, idx, cluster_off); + if (pCluster == NULL) + return -1; + + if (!AppendCluster(pCluster)) { + delete pCluster; + return -1; + } + + if (cluster_size >= 0) { + pos += cluster_size; + + m_pos = pos; + + if (segment_stop > 0 && m_pos > segment_stop) + return E_FILE_FORMAT_INVALID; + + return 0; + } + + m_pUnknownSize = pCluster; + m_pos = -pos; + + return 0; // partial success, since we have a new cluster + + // status == 0 means "no block entries found" + // pos designates start of payload + // m_pos has NOT been adjusted yet (in case we need to come back here) +} + +long Segment::DoLoadClusterUnknownSize(long long& pos, long& len) { + if (m_pos >= 0 || m_pUnknownSize == NULL) + return E_PARSE_FAILED; + + const long status = m_pUnknownSize->Parse(pos, len); + + if (status < 0) // error or underflow + return status; + + if (status == 0) // parsed a block + return 2; // continue parsing + + const long long start = m_pUnknownSize->m_element_start; + const long long size = m_pUnknownSize->GetElementSize(); + + if (size < 0) + return E_FILE_FORMAT_INVALID; + + pos = start + size; + m_pos = pos; + + m_pUnknownSize = 0; + + return 2; // continue parsing +} + +bool Segment::AppendCluster(Cluster* pCluster) { + if (pCluster == NULL || pCluster->m_index < 0) + return false; + + const long count = m_clusterCount + m_clusterPreloadCount; + + long& size = m_clusterSize; + const long idx = pCluster->m_index; + + if (size < count || idx != m_clusterCount) + return false; + + if (count >= size) { + const long n = (size <= 0) ? 2048 : 2 * size; + + Cluster** const qq = new (std::nothrow) Cluster*[n]; + if (qq == NULL) + return false; + + Cluster** q = qq; + Cluster** p = m_clusters; + Cluster** const pp = p + count; + + while (p != pp) + *q++ = *p++; + + delete[] m_clusters; + + m_clusters = qq; + size = n; + } + + if (m_clusterPreloadCount > 0) { + Cluster** const p = m_clusters + m_clusterCount; + if (*p == NULL || (*p)->m_index >= 0) + return false; + + Cluster** q = p + m_clusterPreloadCount; + if (q >= (m_clusters + size)) + return false; + + for (;;) { + Cluster** const qq = q - 1; + if ((*qq)->m_index >= 0) + return false; + + *q = *qq; + q = qq; + + if (q == p) + break; + } + } + + m_clusters[idx] = pCluster; + ++m_clusterCount; + return true; +} + +bool Segment::PreloadCluster(Cluster* pCluster, ptrdiff_t idx) { + if (pCluster == NULL || pCluster->m_index >= 0 || idx < m_clusterCount) + return false; + + const long count = m_clusterCount + m_clusterPreloadCount; + + long& size = m_clusterSize; + if (size < count) + return false; + + if (count >= size) { + const long n = (size <= 0) ? 2048 : 2 * size; + + Cluster** const qq = new (std::nothrow) Cluster*[n]; + if (qq == NULL) + return false; + Cluster** q = qq; + + Cluster** p = m_clusters; + Cluster** const pp = p + count; + + while (p != pp) + *q++ = *p++; + + delete[] m_clusters; + + m_clusters = qq; + size = n; + } + + if (m_clusters == NULL) + return false; + + Cluster** const p = m_clusters + idx; + + Cluster** q = m_clusters + count; + if (q < p || q >= (m_clusters + size)) + return false; + + while (q > p) { + Cluster** const qq = q - 1; + + if ((*qq)->m_index >= 0) + return false; + + *q = *qq; + q = qq; + } + + m_clusters[idx] = pCluster; + ++m_clusterPreloadCount; + return true; +} + +long Segment::Load() { + if (m_clusters != NULL || m_clusterSize != 0 || m_clusterCount != 0) + return E_PARSE_FAILED; + + // Outermost (level 0) segment object has been constructed, + // and pos designates start of payload. We need to find the + // inner (level 1) elements. + + const long long header_status = ParseHeaders(); + + if (header_status < 0) // error + return static_cast(header_status); + + if (header_status > 0) // underflow + return E_BUFFER_NOT_FULL; + + if (m_pInfo == NULL || m_pTracks == NULL) + return E_FILE_FORMAT_INVALID; + + for (;;) { + const long status = LoadCluster(); + + if (status < 0) // error + return status; + + if (status >= 1) // no more clusters + return 0; + } +} + +SeekHead::Entry::Entry() : id(0), pos(0), element_start(0), element_size(0) {} + +SeekHead::SeekHead(Segment* pSegment, long long start, long long size_, + long long element_start, long long element_size) + : m_pSegment(pSegment), + m_start(start), + m_size(size_), + m_element_start(element_start), + m_element_size(element_size), + m_entries(0), + m_entry_count(0), + m_void_elements(0), + m_void_element_count(0) {} + +SeekHead::~SeekHead() { + delete[] m_entries; + delete[] m_void_elements; +} + +long SeekHead::Parse() { + IMkvReader* const pReader = m_pSegment->m_pReader; + + long long pos = m_start; + const long long stop = m_start + m_size; + + // first count the seek head entries + + long long entry_count = 0; + long long void_element_count = 0; + + while (pos < stop) { + long long id, size; + + const long status = ParseElementHeader(pReader, pos, stop, id, size); + + if (status < 0) // error + return status; + + if (id == libwebm::kMkvSeek) { + ++entry_count; + if (entry_count > INT_MAX) + return E_PARSE_FAILED; + } else if (id == libwebm::kMkvVoid) { + ++void_element_count; + if (void_element_count > INT_MAX) + return E_PARSE_FAILED; + } + + pos += size; // consume payload + + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + + if (entry_count > 0) { + m_entries = new (std::nothrow) Entry[static_cast(entry_count)]; + + if (m_entries == NULL) + return -1; + } + + if (void_element_count > 0) { + m_void_elements = + new (std::nothrow) VoidElement[static_cast(void_element_count)]; + + if (m_void_elements == NULL) + return -1; + } + + // now parse the entries and void elements + + Entry* pEntry = m_entries; + VoidElement* pVoidElement = m_void_elements; + + pos = m_start; + + while (pos < stop) { + const long long idpos = pos; + + long long id, size; + + const long status = ParseElementHeader(pReader, pos, stop, id, size); + + if (status < 0) // error + return status; + + if (id == libwebm::kMkvSeek && entry_count > 0) { + if (ParseEntry(pReader, pos, size, pEntry)) { + Entry& e = *pEntry++; + + e.element_start = idpos; + e.element_size = (pos + size) - idpos; + } + } else if (id == libwebm::kMkvVoid && void_element_count > 0) { + VoidElement& e = *pVoidElement++; + + e.element_start = idpos; + e.element_size = (pos + size) - idpos; + } + + pos += size; // consume payload + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + + ptrdiff_t count_ = ptrdiff_t(pEntry - m_entries); + assert(count_ >= 0); + assert(static_cast(count_) <= entry_count); + + m_entry_count = static_cast(count_); + + count_ = ptrdiff_t(pVoidElement - m_void_elements); + assert(count_ >= 0); + assert(static_cast(count_) <= void_element_count); + + m_void_element_count = static_cast(count_); + + return 0; +} + +int SeekHead::GetCount() const { return m_entry_count; } + +const SeekHead::Entry* SeekHead::GetEntry(int idx) const { + if (idx < 0) + return 0; + + if (idx >= m_entry_count) + return 0; + + return m_entries + idx; +} + +int SeekHead::GetVoidElementCount() const { return m_void_element_count; } + +const SeekHead::VoidElement* SeekHead::GetVoidElement(int idx) const { + if (idx < 0) + return 0; + + if (idx >= m_void_element_count) + return 0; + + return m_void_elements + idx; +} + +long Segment::ParseCues(long long off, long long& pos, long& len) { + if (m_pCues) + return 0; // success + + if (off < 0) + return -1; + + long long total, avail; + + const int status = m_pReader->Length(&total, &avail); + + if (status < 0) // error + return status; + + assert((total < 0) || (avail <= total)); + + pos = m_start + off; + + if ((total < 0) || (pos >= total)) + return 1; // don't bother parsing cues + + const long long element_start = pos; + const long long segment_stop = (m_size < 0) ? -1 : m_start + m_size; + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + long long result = GetUIntLength(m_pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // underflow (weird) + { + len = 1; + return E_BUFFER_NOT_FULL; + } + + if ((segment_stop >= 0) && ((pos + len) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long idpos = pos; + + const long long id = ReadID(m_pReader, idpos, len); + + if (id != libwebm::kMkvCues) + return E_FILE_FORMAT_INVALID; + + pos += len; // consume ID + assert((segment_stop < 0) || (pos <= segment_stop)); + + // Read Size + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + result = GetUIntLength(m_pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // underflow (weird) + { + len = 1; + return E_BUFFER_NOT_FULL; + } + + if ((segment_stop >= 0) && ((pos + len) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long size = ReadUInt(m_pReader, pos, len); + + if (size < 0) // error + return static_cast(size); + + if (size == 0) // weird, although technically not illegal + return 1; // done + + pos += len; // consume length of size of element + assert((segment_stop < 0) || (pos <= segment_stop)); + + // Pos now points to start of payload + + const long long element_stop = pos + size; + + if ((segment_stop >= 0) && (element_stop > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((total >= 0) && (element_stop > total)) + return 1; // don't bother parsing anymore + + len = static_cast(size); + + if (element_stop > avail) + return E_BUFFER_NOT_FULL; + + const long long element_size = element_stop - element_start; + + m_pCues = + new (std::nothrow) Cues(this, pos, size, element_start, element_size); + if (m_pCues == NULL) + return -1; + + return 0; // success +} + +bool SeekHead::ParseEntry(IMkvReader* pReader, long long start, long long size_, + Entry* pEntry) { + if (size_ <= 0) + return false; + + long long pos = start; + const long long stop = start + size_; + + long len; + + // parse the container for the level-1 element ID + + const long long seekIdId = ReadID(pReader, pos, len); + if (seekIdId < 0) + return false; + + if (seekIdId != libwebm::kMkvSeekID) + return false; + + if ((pos + len) > stop) + return false; + + pos += len; // consume SeekID id + + const long long seekIdSize = ReadUInt(pReader, pos, len); + + if (seekIdSize <= 0) + return false; + + if ((pos + len) > stop) + return false; + + pos += len; // consume size of field + + if ((pos + seekIdSize) > stop) + return false; + + pEntry->id = ReadID(pReader, pos, len); // payload + + if (pEntry->id <= 0) + return false; + + if (len != seekIdSize) + return false; + + pos += seekIdSize; // consume SeekID payload + + const long long seekPosId = ReadID(pReader, pos, len); + + if (seekPosId != libwebm::kMkvSeekPosition) + return false; + + if ((pos + len) > stop) + return false; + + pos += len; // consume id + + const long long seekPosSize = ReadUInt(pReader, pos, len); + + if (seekPosSize <= 0) + return false; + + if ((pos + len) > stop) + return false; + + pos += len; // consume size + + if ((pos + seekPosSize) > stop) + return false; + + pEntry->pos = UnserializeUInt(pReader, pos, seekPosSize); + + if (pEntry->pos < 0) + return false; + + pos += seekPosSize; // consume payload + + if (pos != stop) + return false; + + return true; +} + +Cues::Cues(Segment* pSegment, long long start_, long long size_, + long long element_start, long long element_size) + : m_pSegment(pSegment), + m_start(start_), + m_size(size_), + m_element_start(element_start), + m_element_size(element_size), + m_cue_points(NULL), + m_count(0), + m_preload_count(0), + m_pos(start_) {} + +Cues::~Cues() { + const long n = m_count + m_preload_count; + + CuePoint** p = m_cue_points; + CuePoint** const q = p + n; + + while (p != q) { + CuePoint* const pCP = *p++; + assert(pCP); + + delete pCP; + } + + delete[] m_cue_points; +} + +long Cues::GetCount() const { + if (m_cue_points == NULL) + return -1; + + return m_count; // TODO: really ignore preload count? +} + +bool Cues::DoneParsing() const { + const long long stop = m_start + m_size; + return (m_pos >= stop); +} + +bool Cues::Init() const { + if (m_cue_points) + return true; + + if (m_count != 0 || m_preload_count != 0) + return false; + + IMkvReader* const pReader = m_pSegment->m_pReader; + + const long long stop = m_start + m_size; + long long pos = m_start; + + long cue_points_size = 0; + + while (pos < stop) { + const long long idpos = pos; + + long len; + + const long long id = ReadID(pReader, pos, len); + if (id < 0 || (pos + len) > stop) { + return false; + } + + pos += len; // consume ID + + const long long size = ReadUInt(pReader, pos, len); + if (size < 0 || (pos + len > stop)) { + return false; + } + + pos += len; // consume Size field + if (pos + size > stop) { + return false; + } + + if (id == libwebm::kMkvCuePoint) { + if (!PreloadCuePoint(cue_points_size, idpos)) + return false; + } + + pos += size; // skip payload + } + return true; +} + +bool Cues::PreloadCuePoint(long& cue_points_size, long long pos) const { + if (m_count != 0) + return false; + + if (m_preload_count >= cue_points_size) { + const long n = (cue_points_size <= 0) ? 2048 : 2 * cue_points_size; + + CuePoint** const qq = new (std::nothrow) CuePoint*[n]; + if (qq == NULL) + return false; + + CuePoint** q = qq; // beginning of target + + CuePoint** p = m_cue_points; // beginning of source + CuePoint** const pp = p + m_preload_count; // end of source + + while (p != pp) + *q++ = *p++; + + delete[] m_cue_points; + + m_cue_points = qq; + cue_points_size = n; + } + + CuePoint* const pCP = new (std::nothrow) CuePoint(m_preload_count, pos); + if (pCP == NULL) + return false; + + m_cue_points[m_preload_count++] = pCP; + return true; +} + +bool Cues::LoadCuePoint() const { + const long long stop = m_start + m_size; + + if (m_pos >= stop) + return false; // nothing else to do + + if (!Init()) { + m_pos = stop; + return false; + } + + IMkvReader* const pReader = m_pSegment->m_pReader; + + while (m_pos < stop) { + const long long idpos = m_pos; + + long len; + + const long long id = ReadID(pReader, m_pos, len); + if (id < 0 || (m_pos + len) > stop) + return false; + + m_pos += len; // consume ID + + const long long size = ReadUInt(pReader, m_pos, len); + if (size < 0 || (m_pos + len) > stop) + return false; + + m_pos += len; // consume Size field + if ((m_pos + size) > stop) + return false; + + if (id != libwebm::kMkvCuePoint) { + m_pos += size; // consume payload + if (m_pos > stop) + return false; + + continue; + } + + if (m_preload_count < 1) + return false; + + CuePoint* const pCP = m_cue_points[m_count]; + if (!pCP || (pCP->GetTimeCode() < 0 && (-pCP->GetTimeCode() != idpos))) + return false; + + if (!pCP->Load(pReader)) { + m_pos = stop; + return false; + } + ++m_count; + --m_preload_count; + + m_pos += size; // consume payload + if (m_pos > stop) + return false; + + return true; // yes, we loaded a cue point + } + + return false; // no, we did not load a cue point +} + +bool Cues::Find(long long time_ns, const Track* pTrack, const CuePoint*& pCP, + const CuePoint::TrackPosition*& pTP) const { + if (time_ns < 0 || pTrack == NULL || m_cue_points == NULL || m_count == 0) + return false; + + CuePoint** const ii = m_cue_points; + CuePoint** i = ii; + + CuePoint** const jj = ii + m_count; + CuePoint** j = jj; + + pCP = *i; + if (pCP == NULL) + return false; + + if (time_ns <= pCP->GetTime(m_pSegment)) { + pTP = pCP->Find(pTrack); + return (pTP != NULL); + } + + while (i < j) { + // INVARIANT: + //[ii, i) <= time_ns + //[i, j) ? + //[j, jj) > time_ns + + CuePoint** const k = i + (j - i) / 2; + if (k >= jj) + return false; + + CuePoint* const pCP = *k; + if (pCP == NULL) + return false; + + const long long t = pCP->GetTime(m_pSegment); + + if (t <= time_ns) + i = k + 1; + else + j = k; + + if (i > j) + return false; + } + + if (i != j || i > jj || i <= ii) + return false; + + pCP = *--i; + + if (pCP == NULL || pCP->GetTime(m_pSegment) > time_ns) + return false; + + // TODO: here and elsewhere, it's probably not correct to search + // for the cue point with this time, and then search for a matching + // track. In principle, the matching track could be on some earlier + // cue point, and with our current algorithm, we'd miss it. To make + // this bullet-proof, we'd need to create a secondary structure, + // with a list of cue points that apply to a track, and then search + // that track-based structure for a matching cue point. + + pTP = pCP->Find(pTrack); + return (pTP != NULL); +} + +const CuePoint* Cues::GetFirst() const { + if (m_cue_points == NULL || m_count == 0) + return NULL; + + CuePoint* const* const pp = m_cue_points; + if (pp == NULL) + return NULL; + + CuePoint* const pCP = pp[0]; + if (pCP == NULL || pCP->GetTimeCode() < 0) + return NULL; + + return pCP; +} + +const CuePoint* Cues::GetLast() const { + if (m_cue_points == NULL || m_count <= 0) + return NULL; + + const long index = m_count - 1; + + CuePoint* const* const pp = m_cue_points; + if (pp == NULL) + return NULL; + + CuePoint* const pCP = pp[index]; + if (pCP == NULL || pCP->GetTimeCode() < 0) + return NULL; + + return pCP; +} + +const CuePoint* Cues::GetNext(const CuePoint* pCurr) const { + if (pCurr == NULL || pCurr->GetTimeCode() < 0 || m_cue_points == NULL || + m_count < 1) { + return NULL; + } + + long index = pCurr->m_index; + if (index >= m_count) + return NULL; + + CuePoint* const* const pp = m_cue_points; + if (pp == NULL || pp[index] != pCurr) + return NULL; + + ++index; + + if (index >= m_count) + return NULL; + + CuePoint* const pNext = pp[index]; + + if (pNext == NULL || pNext->GetTimeCode() < 0) + return NULL; + + return pNext; +} + +const BlockEntry* Cues::GetBlock(const CuePoint* pCP, + const CuePoint::TrackPosition* pTP) const { + if (pCP == NULL || pTP == NULL) + return NULL; + + return m_pSegment->GetBlock(*pCP, *pTP); +} + +const BlockEntry* Segment::GetBlock(const CuePoint& cp, + const CuePoint::TrackPosition& tp) { + Cluster** const ii = m_clusters; + Cluster** i = ii; + + const long count = m_clusterCount + m_clusterPreloadCount; + + Cluster** const jj = ii + count; + Cluster** j = jj; + + while (i < j) { + // INVARIANT: + //[ii, i) < pTP->m_pos + //[i, j) ? + //[j, jj) > pTP->m_pos + + Cluster** const k = i + (j - i) / 2; + assert(k < jj); + + Cluster* const pCluster = *k; + assert(pCluster); + + // const long long pos_ = pCluster->m_pos; + // assert(pos_); + // const long long pos = pos_ * ((pos_ < 0) ? -1 : 1); + + const long long pos = pCluster->GetPosition(); + assert(pos >= 0); + + if (pos < tp.m_pos) + i = k + 1; + else if (pos > tp.m_pos) + j = k; + else + return pCluster->GetEntry(cp, tp); + } + + assert(i == j); + // assert(Cluster::HasBlockEntries(this, tp.m_pos)); + + Cluster* const pCluster = Cluster::Create(this, -1, tp.m_pos); //, -1); + if (pCluster == NULL) + return NULL; + + const ptrdiff_t idx = i - m_clusters; + + if (!PreloadCluster(pCluster, idx)) { + delete pCluster; + return NULL; + } + assert(m_clusters); + assert(m_clusterPreloadCount > 0); + assert(m_clusters[idx] == pCluster); + + return pCluster->GetEntry(cp, tp); +} + +const Cluster* Segment::FindOrPreloadCluster(long long requested_pos) { + if (requested_pos < 0) + return 0; + + Cluster** const ii = m_clusters; + Cluster** i = ii; + + const long count = m_clusterCount + m_clusterPreloadCount; + + Cluster** const jj = ii + count; + Cluster** j = jj; + + while (i < j) { + // INVARIANT: + //[ii, i) < pTP->m_pos + //[i, j) ? + //[j, jj) > pTP->m_pos + + Cluster** const k = i + (j - i) / 2; + assert(k < jj); + + Cluster* const pCluster = *k; + assert(pCluster); + + // const long long pos_ = pCluster->m_pos; + // assert(pos_); + // const long long pos = pos_ * ((pos_ < 0) ? -1 : 1); + + const long long pos = pCluster->GetPosition(); + assert(pos >= 0); + + if (pos < requested_pos) + i = k + 1; + else if (pos > requested_pos) + j = k; + else + return pCluster; + } + + assert(i == j); + // assert(Cluster::HasBlockEntries(this, tp.m_pos)); + + Cluster* const pCluster = Cluster::Create(this, -1, requested_pos); + if (pCluster == NULL) + return NULL; + + const ptrdiff_t idx = i - m_clusters; + + if (!PreloadCluster(pCluster, idx)) { + delete pCluster; + return NULL; + } + assert(m_clusters); + assert(m_clusterPreloadCount > 0); + assert(m_clusters[idx] == pCluster); + + return pCluster; +} + +CuePoint::CuePoint(long idx, long long pos) + : m_element_start(0), + m_element_size(0), + m_index(idx), + m_timecode(-1 * pos), + m_track_positions(NULL), + m_track_positions_count(0) { + assert(pos > 0); +} + +CuePoint::~CuePoint() { delete[] m_track_positions; } + +bool CuePoint::Load(IMkvReader* pReader) { + // odbgstream os; + // os << "CuePoint::Load(begin): timecode=" << m_timecode << endl; + + if (m_timecode >= 0) // already loaded + return true; + + assert(m_track_positions == NULL); + assert(m_track_positions_count == 0); + + long long pos_ = -m_timecode; + const long long element_start = pos_; + + long long stop; + + { + long len; + + const long long id = ReadID(pReader, pos_, len); + if (id != libwebm::kMkvCuePoint) + return false; + + pos_ += len; // consume ID + + const long long size = ReadUInt(pReader, pos_, len); + assert(size >= 0); + + pos_ += len; // consume Size field + // pos_ now points to start of payload + + stop = pos_ + size; + } + + const long long element_size = stop - element_start; + + long long pos = pos_; + + // First count number of track positions + unsigned long long track_positions_count = 0; + while (pos < stop) { + long len; + + const long long id = ReadID(pReader, pos, len); + if ((id < 0) || (pos + len > stop)) { + return false; + } + + pos += len; // consume ID + + const long long size = ReadUInt(pReader, pos, len); + if ((size < 0) || (pos + len > stop)) { + return false; + } + + pos += len; // consume Size field + if ((pos + size) > stop) { + return false; + } + + if (id == libwebm::kMkvCueTime) + m_timecode = UnserializeUInt(pReader, pos, size); + + else if (id == libwebm::kMkvCueTrackPositions) { + ++track_positions_count; + if (track_positions_count > UINT_MAX) + return E_PARSE_FAILED; + } + + pos += size; // consume payload + } + + m_track_positions_count = static_cast(track_positions_count); + + if (m_timecode < 0 || m_track_positions_count <= 0) { + return false; + } + + // os << "CuePoint::Load(cont'd): idpos=" << idpos + // << " timecode=" << m_timecode + // << endl; + + m_track_positions = new (std::nothrow) TrackPosition[m_track_positions_count]; + if (m_track_positions == NULL) + return false; + + // Now parse track positions + + TrackPosition* p = m_track_positions; + pos = pos_; + + while (pos < stop) { + long len; + + const long long id = ReadID(pReader, pos, len); + if (id < 0 || (pos + len) > stop) + return false; + + pos += len; // consume ID + + const long long size = ReadUInt(pReader, pos, len); + assert(size >= 0); + assert((pos + len) <= stop); + + pos += len; // consume Size field + assert((pos + size) <= stop); + + if (id == libwebm::kMkvCueTrackPositions) { + TrackPosition& tp = *p++; + if (!tp.Parse(pReader, pos, size)) { + return false; + } + } + + pos += size; // consume payload + if (pos > stop) + return false; + } + + assert(size_t(p - m_track_positions) == m_track_positions_count); + + m_element_start = element_start; + m_element_size = element_size; + + return true; +} + +bool CuePoint::TrackPosition::Parse(IMkvReader* pReader, long long start_, + long long size_) { + const long long stop = start_ + size_; + long long pos = start_; + + m_track = -1; + m_pos = -1; + m_block = 1; // default + + while (pos < stop) { + long len; + + const long long id = ReadID(pReader, pos, len); + if ((id < 0) || ((pos + len) > stop)) { + return false; + } + + pos += len; // consume ID + + const long long size = ReadUInt(pReader, pos, len); + if ((size < 0) || ((pos + len) > stop)) { + return false; + } + + pos += len; // consume Size field + if ((pos + size) > stop) { + return false; + } + + if (id == libwebm::kMkvCueTrack) + m_track = UnserializeUInt(pReader, pos, size); + else if (id == libwebm::kMkvCueClusterPosition) + m_pos = UnserializeUInt(pReader, pos, size); + else if (id == libwebm::kMkvCueBlockNumber) + m_block = UnserializeUInt(pReader, pos, size); + + pos += size; // consume payload + } + + if ((m_pos < 0) || (m_track <= 0) || (m_block < 0) || (m_block > LONG_MAX)) { + return false; + } + + return true; +} + +const CuePoint::TrackPosition* CuePoint::Find(const Track* pTrack) const { + if (pTrack == NULL) { + return NULL; + } + + const long long n = pTrack->GetNumber(); + + const TrackPosition* i = m_track_positions; + const TrackPosition* const j = i + m_track_positions_count; + + while (i != j) { + const TrackPosition& p = *i++; + + if (p.m_track == n) + return &p; + } + + return NULL; // no matching track number found +} + +long long CuePoint::GetTimeCode() const { return m_timecode; } + +long long CuePoint::GetTime(const Segment* pSegment) const { + assert(pSegment); + assert(m_timecode >= 0); + + const SegmentInfo* const pInfo = pSegment->GetInfo(); + assert(pInfo); + + const long long scale = pInfo->GetTimeCodeScale(); + assert(scale >= 1); + + const long long time = scale * m_timecode; + + return time; +} + +bool Segment::DoneParsing() const { + if (m_size < 0) { + long long total, avail; + + const int status = m_pReader->Length(&total, &avail); + + if (status < 0) // error + return true; // must assume done + + if (total < 0) + return false; // assume live stream + + return (m_pos >= total); + } + + const long long stop = m_start + m_size; + + return (m_pos >= stop); +} + +const Cluster* Segment::GetFirst() const { + if ((m_clusters == NULL) || (m_clusterCount <= 0)) + return &m_eos; + + Cluster* const pCluster = m_clusters[0]; + assert(pCluster); + + return pCluster; +} + +const Cluster* Segment::GetLast() const { + if ((m_clusters == NULL) || (m_clusterCount <= 0)) + return &m_eos; + + const long idx = m_clusterCount - 1; + + Cluster* const pCluster = m_clusters[idx]; + assert(pCluster); + + return pCluster; +} + +unsigned long Segment::GetCount() const { return m_clusterCount; } + +const Cluster* Segment::GetNext(const Cluster* pCurr) { + assert(pCurr); + assert(pCurr != &m_eos); + assert(m_clusters); + + long idx = pCurr->m_index; + + if (idx >= 0) { + assert(m_clusterCount > 0); + assert(idx < m_clusterCount); + assert(pCurr == m_clusters[idx]); + + ++idx; + + if (idx >= m_clusterCount) + return &m_eos; // caller will LoadCluster as desired + + Cluster* const pNext = m_clusters[idx]; + assert(pNext); + assert(pNext->m_index >= 0); + assert(pNext->m_index == idx); + + return pNext; + } + + assert(m_clusterPreloadCount > 0); + + long long pos = pCurr->m_element_start; + + assert(m_size >= 0); // TODO + const long long stop = m_start + m_size; // end of segment + + { + long len; + + long long result = GetUIntLength(m_pReader, pos, len); + assert(result == 0); + assert((pos + len) <= stop); // TODO + if (result != 0) + return NULL; + + const long long id = ReadID(m_pReader, pos, len); + if (id != libwebm::kMkvCluster) + return NULL; + + pos += len; // consume ID + + // Read Size + result = GetUIntLength(m_pReader, pos, len); + assert(result == 0); // TODO + assert((pos + len) <= stop); // TODO + + const long long size = ReadUInt(m_pReader, pos, len); + assert(size > 0); // TODO + // assert((pCurr->m_size <= 0) || (pCurr->m_size == size)); + + pos += len; // consume length of size of element + assert((pos + size) <= stop); // TODO + + // Pos now points to start of payload + + pos += size; // consume payload + } + + long long off_next = 0; + + while (pos < stop) { + long len; + + long long result = GetUIntLength(m_pReader, pos, len); + assert(result == 0); + assert((pos + len) <= stop); // TODO + if (result != 0) + return NULL; + + const long long idpos = pos; // pos of next (potential) cluster + + const long long id = ReadID(m_pReader, idpos, len); + if (id < 0) + return NULL; + + pos += len; // consume ID + + // Read Size + result = GetUIntLength(m_pReader, pos, len); + assert(result == 0); // TODO + assert((pos + len) <= stop); // TODO + + const long long size = ReadUInt(m_pReader, pos, len); + assert(size >= 0); // TODO + + pos += len; // consume length of size of element + assert((pos + size) <= stop); // TODO + + // Pos now points to start of payload + + if (size == 0) // weird + continue; + + if (id == libwebm::kMkvCluster) { + const long long off_next_ = idpos - m_start; + + long long pos_; + long len_; + + const long status = Cluster::HasBlockEntries(this, off_next_, pos_, len_); + + assert(status >= 0); + + if (status > 0) { + off_next = off_next_; + break; + } + } + + pos += size; // consume payload + } + + if (off_next <= 0) + return 0; + + Cluster** const ii = m_clusters + m_clusterCount; + Cluster** i = ii; + + Cluster** const jj = ii + m_clusterPreloadCount; + Cluster** j = jj; + + while (i < j) { + // INVARIANT: + //[0, i) < pos_next + //[i, j) ? + //[j, jj) > pos_next + + Cluster** const k = i + (j - i) / 2; + assert(k < jj); + + Cluster* const pNext = *k; + assert(pNext); + assert(pNext->m_index < 0); + + // const long long pos_ = pNext->m_pos; + // assert(pos_); + // pos = pos_ * ((pos_ < 0) ? -1 : 1); + + pos = pNext->GetPosition(); + + if (pos < off_next) + i = k + 1; + else if (pos > off_next) + j = k; + else + return pNext; + } + + assert(i == j); + + Cluster* const pNext = Cluster::Create(this, -1, off_next); + if (pNext == NULL) + return NULL; + + const ptrdiff_t idx_next = i - m_clusters; // insertion position + + if (!PreloadCluster(pNext, idx_next)) { + delete pNext; + return NULL; + } + assert(m_clusters); + assert(idx_next < m_clusterSize); + assert(m_clusters[idx_next] == pNext); + + return pNext; +} + +long Segment::ParseNext(const Cluster* pCurr, const Cluster*& pResult, + long long& pos, long& len) { + assert(pCurr); + assert(!pCurr->EOS()); + assert(m_clusters); + + pResult = 0; + + if (pCurr->m_index >= 0) { // loaded (not merely preloaded) + assert(m_clusters[pCurr->m_index] == pCurr); + + const long next_idx = pCurr->m_index + 1; + + if (next_idx < m_clusterCount) { + pResult = m_clusters[next_idx]; + return 0; // success + } + + // curr cluster is last among loaded + + const long result = LoadCluster(pos, len); + + if (result < 0) // error or underflow + return result; + + if (result > 0) // no more clusters + { + // pResult = &m_eos; + return 1; + } + + pResult = GetLast(); + return 0; // success + } + + assert(m_pos > 0); + + long long total, avail; + + long status = m_pReader->Length(&total, &avail); + + if (status < 0) // error + return status; + + assert((total < 0) || (avail <= total)); + + const long long segment_stop = (m_size < 0) ? -1 : m_start + m_size; + + // interrogate curr cluster + + pos = pCurr->m_element_start; + + if (pCurr->m_element_size >= 0) + pos += pCurr->m_element_size; + else { + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + long long result = GetUIntLength(m_pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // weird + return E_BUFFER_NOT_FULL; + + if ((segment_stop >= 0) && ((pos + len) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long id = ReadUInt(m_pReader, pos, len); + + if (id != libwebm::kMkvCluster) + return -1; + + pos += len; // consume ID + + // Read Size + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + result = GetUIntLength(m_pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // weird + return E_BUFFER_NOT_FULL; + + if ((segment_stop >= 0) && ((pos + len) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long size = ReadUInt(m_pReader, pos, len); + + if (size < 0) // error + return static_cast(size); + + pos += len; // consume size field + + const long long unknown_size = (1LL << (7 * len)) - 1; + + if (size == unknown_size) // TODO: should never happen + return E_FILE_FORMAT_INVALID; // TODO: resolve this + + // assert((pCurr->m_size <= 0) || (pCurr->m_size == size)); + + if ((segment_stop >= 0) && ((pos + size) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + // Pos now points to start of payload + + pos += size; // consume payload (that is, the current cluster) + if (segment_stop >= 0 && pos > segment_stop) + return E_FILE_FORMAT_INVALID; + + // By consuming the payload, we are assuming that the curr + // cluster isn't interesting. That is, we don't bother checking + // whether the payload of the curr cluster is less than what + // happens to be available (obtained via IMkvReader::Length). + // Presumably the caller has already dispensed with the current + // cluster, and really does want the next cluster. + } + + // pos now points to just beyond the last fully-loaded cluster + + for (;;) { + const long status = DoParseNext(pResult, pos, len); + + if (status <= 1) + return status; + } +} + +long Segment::DoParseNext(const Cluster*& pResult, long long& pos, long& len) { + long long total, avail; + + long status = m_pReader->Length(&total, &avail); + + if (status < 0) // error + return status; + + assert((total < 0) || (avail <= total)); + + const long long segment_stop = (m_size < 0) ? -1 : m_start + m_size; + + // Parse next cluster. This is strictly a parsing activity. + // Creation of a new cluster object happens later, after the + // parsing is done. + + long long off_next = 0; + long long cluster_size = -1; + + for (;;) { + if ((total >= 0) && (pos >= total)) + return 1; // EOF + + if ((segment_stop >= 0) && (pos >= segment_stop)) + return 1; // EOF + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + long long result = GetUIntLength(m_pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // weird + return E_BUFFER_NOT_FULL; + + if ((segment_stop >= 0) && ((pos + len) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long idpos = pos; // absolute + const long long idoff = pos - m_start; // relative + + const long long id = ReadID(m_pReader, idpos, len); // absolute + + if (id < 0) // error + return static_cast(id); + + if (id == 0) // weird + return -1; // generic error + + pos += len; // consume ID + + // Read Size + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + result = GetUIntLength(m_pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // weird + return E_BUFFER_NOT_FULL; + + if ((segment_stop >= 0) && ((pos + len) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long size = ReadUInt(m_pReader, pos, len); + + if (size < 0) // error + return static_cast(size); + + pos += len; // consume length of size of element + + // Pos now points to start of payload + + if (size == 0) // weird + continue; + + const long long unknown_size = (1LL << (7 * len)) - 1; + + if ((segment_stop >= 0) && (size != unknown_size) && + ((pos + size) > segment_stop)) { + return E_FILE_FORMAT_INVALID; + } + + if (id == libwebm::kMkvCues) { + if (size == unknown_size) + return E_FILE_FORMAT_INVALID; + + const long long element_stop = pos + size; + + if ((segment_stop >= 0) && (element_stop > segment_stop)) + return E_FILE_FORMAT_INVALID; + + const long long element_start = idpos; + const long long element_size = element_stop - element_start; + + if (m_pCues == NULL) { + m_pCues = new (std::nothrow) + Cues(this, pos, size, element_start, element_size); + if (m_pCues == NULL) + return false; + } + + pos += size; // consume payload + if (segment_stop >= 0 && pos > segment_stop) + return E_FILE_FORMAT_INVALID; + + continue; + } + + if (id != libwebm::kMkvCluster) { // not a Cluster ID + if (size == unknown_size) + return E_FILE_FORMAT_INVALID; + + pos += size; // consume payload + if (segment_stop >= 0 && pos > segment_stop) + return E_FILE_FORMAT_INVALID; + + continue; + } + + // We have a cluster. + off_next = idoff; + + if (size != unknown_size) + cluster_size = size; + + break; + } + + assert(off_next > 0); // have cluster + + // We have parsed the next cluster. + // We have not created a cluster object yet. What we need + // to do now is determine whether it has already be preloaded + //(in which case, an object for this cluster has already been + // created), and if not, create a new cluster object. + + Cluster** const ii = m_clusters + m_clusterCount; + Cluster** i = ii; + + Cluster** const jj = ii + m_clusterPreloadCount; + Cluster** j = jj; + + while (i < j) { + // INVARIANT: + //[0, i) < pos_next + //[i, j) ? + //[j, jj) > pos_next + + Cluster** const k = i + (j - i) / 2; + assert(k < jj); + + const Cluster* const pNext = *k; + assert(pNext); + assert(pNext->m_index < 0); + + pos = pNext->GetPosition(); + assert(pos >= 0); + + if (pos < off_next) + i = k + 1; + else if (pos > off_next) + j = k; + else { + pResult = pNext; + return 0; // success + } + } + + assert(i == j); + + long long pos_; + long len_; + + status = Cluster::HasBlockEntries(this, off_next, pos_, len_); + + if (status < 0) { // error or underflow + pos = pos_; + len = len_; + + return status; + } + + if (status > 0) { // means "found at least one block entry" + Cluster* const pNext = Cluster::Create(this, + -1, // preloaded + off_next); + if (pNext == NULL) + return -1; + + const ptrdiff_t idx_next = i - m_clusters; // insertion position + + if (!PreloadCluster(pNext, idx_next)) { + delete pNext; + return -1; + } + assert(m_clusters); + assert(idx_next < m_clusterSize); + assert(m_clusters[idx_next] == pNext); + + pResult = pNext; + return 0; // success + } + + // status == 0 means "no block entries found" + + if (cluster_size < 0) { // unknown size + const long long payload_pos = pos; // absolute pos of cluster payload + + for (;;) { // determine cluster size + if ((total >= 0) && (pos >= total)) + break; + + if ((segment_stop >= 0) && (pos >= segment_stop)) + break; // no more clusters + + // Read ID + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + long long result = GetUIntLength(m_pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // weird + return E_BUFFER_NOT_FULL; + + if ((segment_stop >= 0) && ((pos + len) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long idpos = pos; + const long long id = ReadID(m_pReader, idpos, len); + + if (id < 0) // error (or underflow) + return static_cast(id); + + // This is the distinguished set of ID's we use to determine + // that we have exhausted the sub-element's inside the cluster + // whose ID we parsed earlier. + + if (id == libwebm::kMkvCluster || id == libwebm::kMkvCues) + break; + + pos += len; // consume ID (of sub-element) + + // Read Size + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + result = GetUIntLength(m_pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // weird + return E_BUFFER_NOT_FULL; + + if ((segment_stop >= 0) && ((pos + len) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long size = ReadUInt(m_pReader, pos, len); + + if (size < 0) // error + return static_cast(size); + + pos += len; // consume size field of element + + // pos now points to start of sub-element's payload + + if (size == 0) // weird + continue; + + const long long unknown_size = (1LL << (7 * len)) - 1; + + if (size == unknown_size) + return E_FILE_FORMAT_INVALID; // not allowed for sub-elements + + if ((segment_stop >= 0) && ((pos + size) > segment_stop)) // weird + return E_FILE_FORMAT_INVALID; + + pos += size; // consume payload of sub-element + if (segment_stop >= 0 && pos > segment_stop) + return E_FILE_FORMAT_INVALID; + } // determine cluster size + + cluster_size = pos - payload_pos; + assert(cluster_size >= 0); // TODO: handle cluster_size = 0 + + pos = payload_pos; // reset and re-parse original cluster + } + + pos += cluster_size; // consume payload + if (segment_stop >= 0 && pos > segment_stop) + return E_FILE_FORMAT_INVALID; + + return 2; // try to find a cluster that follows next +} + +const Cluster* Segment::FindCluster(long long time_ns) const { + if ((m_clusters == NULL) || (m_clusterCount <= 0)) + return &m_eos; + + { + Cluster* const pCluster = m_clusters[0]; + assert(pCluster); + assert(pCluster->m_index == 0); + + if (time_ns <= pCluster->GetTime()) + return pCluster; + } + + // Binary search of cluster array + + long i = 0; + long j = m_clusterCount; + + while (i < j) { + // INVARIANT: + //[0, i) <= time_ns + //[i, j) ? + //[j, m_clusterCount) > time_ns + + const long k = i + (j - i) / 2; + assert(k < m_clusterCount); + + Cluster* const pCluster = m_clusters[k]; + assert(pCluster); + assert(pCluster->m_index == k); + + const long long t = pCluster->GetTime(); + + if (t <= time_ns) + i = k + 1; + else + j = k; + + assert(i <= j); + } + + assert(i == j); + assert(i > 0); + assert(i <= m_clusterCount); + + const long k = i - 1; + + Cluster* const pCluster = m_clusters[k]; + assert(pCluster); + assert(pCluster->m_index == k); + assert(pCluster->GetTime() <= time_ns); + + return pCluster; +} + +const Tracks* Segment::GetTracks() const { return m_pTracks; } +const SegmentInfo* Segment::GetInfo() const { return m_pInfo; } +const Cues* Segment::GetCues() const { return m_pCues; } +const Chapters* Segment::GetChapters() const { return m_pChapters; } +const Tags* Segment::GetTags() const { return m_pTags; } +const SeekHead* Segment::GetSeekHead() const { return m_pSeekHead; } + +long long Segment::GetDuration() const { + assert(m_pInfo); + return m_pInfo->GetDuration(); +} + +Chapters::Chapters(Segment* pSegment, long long payload_start, + long long payload_size, long long element_start, + long long element_size) + : m_pSegment(pSegment), + m_start(payload_start), + m_size(payload_size), + m_element_start(element_start), + m_element_size(element_size), + m_editions(NULL), + m_editions_size(0), + m_editions_count(0) {} + +Chapters::~Chapters() { + while (m_editions_count > 0) { + Edition& e = m_editions[--m_editions_count]; + e.Clear(); + } + delete[] m_editions; +} + +long Chapters::Parse() { + IMkvReader* const pReader = m_pSegment->m_pReader; + + long long pos = m_start; // payload start + const long long stop = pos + m_size; // payload stop + + while (pos < stop) { + long long id, size; + + long status = ParseElementHeader(pReader, pos, stop, id, size); + + if (status < 0) // error + return status; + + if (size == 0) // weird + continue; + + if (id == libwebm::kMkvEditionEntry) { + status = ParseEdition(pos, size); + + if (status < 0) // error + return status; + } + + pos += size; + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + return 0; +} + +int Chapters::GetEditionCount() const { return m_editions_count; } + +const Chapters::Edition* Chapters::GetEdition(int idx) const { + if (idx < 0) + return NULL; + + if (idx >= m_editions_count) + return NULL; + + return m_editions + idx; +} + +bool Chapters::ExpandEditionsArray() { + if (m_editions_size > m_editions_count) + return true; // nothing else to do + + const int size = (m_editions_size == 0) ? 1 : 2 * m_editions_size; + + Edition* const editions = new (std::nothrow) Edition[size]; + + if (editions == NULL) + return false; + + for (int idx = 0; idx < m_editions_count; ++idx) { + m_editions[idx].ShallowCopy(editions[idx]); + } + + delete[] m_editions; + m_editions = editions; + + m_editions_size = size; + return true; +} + +long Chapters::ParseEdition(long long pos, long long size) { + if (!ExpandEditionsArray()) + return -1; + + Edition& e = m_editions[m_editions_count++]; + e.Init(); + + return e.Parse(m_pSegment->m_pReader, pos, size); +} + +Chapters::Edition::Edition() {} + +Chapters::Edition::~Edition() {} + +int Chapters::Edition::GetAtomCount() const { return m_atoms_count; } + +const Chapters::Atom* Chapters::Edition::GetAtom(int index) const { + if (index < 0) + return NULL; + + if (index >= m_atoms_count) + return NULL; + + return m_atoms + index; +} + +void Chapters::Edition::Init() { + m_atoms = NULL; + m_atoms_size = 0; + m_atoms_count = 0; +} + +void Chapters::Edition::ShallowCopy(Edition& rhs) const { + rhs.m_atoms = m_atoms; + rhs.m_atoms_size = m_atoms_size; + rhs.m_atoms_count = m_atoms_count; +} + +void Chapters::Edition::Clear() { + while (m_atoms_count > 0) { + Atom& a = m_atoms[--m_atoms_count]; + a.Clear(); + } + + delete[] m_atoms; + m_atoms = NULL; + + m_atoms_size = 0; +} + +long Chapters::Edition::Parse(IMkvReader* pReader, long long pos, + long long size) { + const long long stop = pos + size; + + while (pos < stop) { + long long id, size; + + long status = ParseElementHeader(pReader, pos, stop, id, size); + + if (status < 0) // error + return status; + + if (size == 0) + continue; + + if (id == libwebm::kMkvChapterAtom) { + status = ParseAtom(pReader, pos, size); + + if (status < 0) // error + return status; + } + + pos += size; + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + return 0; +} + +long Chapters::Edition::ParseAtom(IMkvReader* pReader, long long pos, + long long size) { + if (!ExpandAtomsArray()) + return -1; + + Atom& a = m_atoms[m_atoms_count++]; + a.Init(); + + return a.Parse(pReader, pos, size); +} + +bool Chapters::Edition::ExpandAtomsArray() { + if (m_atoms_size > m_atoms_count) + return true; // nothing else to do + + const int size = (m_atoms_size == 0) ? 1 : 2 * m_atoms_size; + + Atom* const atoms = new (std::nothrow) Atom[size]; + + if (atoms == NULL) + return false; + + for (int idx = 0; idx < m_atoms_count; ++idx) { + m_atoms[idx].ShallowCopy(atoms[idx]); + } + + delete[] m_atoms; + m_atoms = atoms; + + m_atoms_size = size; + return true; +} + +Chapters::Atom::Atom() {} + +Chapters::Atom::~Atom() {} + +unsigned long long Chapters::Atom::GetUID() const { return m_uid; } + +const char* Chapters::Atom::GetStringUID() const { return m_string_uid; } + +long long Chapters::Atom::GetStartTimecode() const { return m_start_timecode; } + +long long Chapters::Atom::GetStopTimecode() const { return m_stop_timecode; } + +long long Chapters::Atom::GetStartTime(const Chapters* pChapters) const { + return GetTime(pChapters, m_start_timecode); +} + +long long Chapters::Atom::GetStopTime(const Chapters* pChapters) const { + return GetTime(pChapters, m_stop_timecode); +} + +int Chapters::Atom::GetDisplayCount() const { return m_displays_count; } + +const Chapters::Display* Chapters::Atom::GetDisplay(int index) const { + if (index < 0) + return NULL; + + if (index >= m_displays_count) + return NULL; + + return m_displays + index; +} + +void Chapters::Atom::Init() { + m_string_uid = NULL; + m_uid = 0; + m_start_timecode = -1; + m_stop_timecode = -1; + + m_displays = NULL; + m_displays_size = 0; + m_displays_count = 0; +} + +void Chapters::Atom::ShallowCopy(Atom& rhs) const { + rhs.m_string_uid = m_string_uid; + rhs.m_uid = m_uid; + rhs.m_start_timecode = m_start_timecode; + rhs.m_stop_timecode = m_stop_timecode; + + rhs.m_displays = m_displays; + rhs.m_displays_size = m_displays_size; + rhs.m_displays_count = m_displays_count; +} + +void Chapters::Atom::Clear() { + delete[] m_string_uid; + m_string_uid = NULL; + + while (m_displays_count > 0) { + Display& d = m_displays[--m_displays_count]; + d.Clear(); + } + + delete[] m_displays; + m_displays = NULL; + + m_displays_size = 0; +} + +long Chapters::Atom::Parse(IMkvReader* pReader, long long pos, long long size) { + const long long stop = pos + size; + + while (pos < stop) { + long long id, size; + + long status = ParseElementHeader(pReader, pos, stop, id, size); + + if (status < 0) // error + return status; + + if (size == 0) // 0 length payload, skip. + continue; + + if (id == libwebm::kMkvChapterDisplay) { + status = ParseDisplay(pReader, pos, size); + + if (status < 0) // error + return status; + } else if (id == libwebm::kMkvChapterStringUID) { + status = UnserializeString(pReader, pos, size, m_string_uid); + + if (status < 0) // error + return status; + } else if (id == libwebm::kMkvChapterUID) { + long long val; + status = UnserializeInt(pReader, pos, size, val); + + if (status < 0) // error + return status; + + m_uid = static_cast(val); + } else if (id == libwebm::kMkvChapterTimeStart) { + const long long val = UnserializeUInt(pReader, pos, size); + + if (val < 0) // error + return static_cast(val); + + m_start_timecode = val; + } else if (id == libwebm::kMkvChapterTimeEnd) { + const long long val = UnserializeUInt(pReader, pos, size); + + if (val < 0) // error + return static_cast(val); + + m_stop_timecode = val; + } + + pos += size; + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + return 0; +} + +long long Chapters::Atom::GetTime(const Chapters* pChapters, + long long timecode) { + if (pChapters == NULL) + return -1; + + Segment* const pSegment = pChapters->m_pSegment; + + if (pSegment == NULL) // weird + return -1; + + const SegmentInfo* const pInfo = pSegment->GetInfo(); + + if (pInfo == NULL) + return -1; + + const long long timecode_scale = pInfo->GetTimeCodeScale(); + + if (timecode_scale < 1) // weird + return -1; + + if (timecode < 0) + return -1; + + const long long result = timecode_scale * timecode; + + return result; +} + +long Chapters::Atom::ParseDisplay(IMkvReader* pReader, long long pos, + long long size) { + if (!ExpandDisplaysArray()) + return -1; + + Display& d = m_displays[m_displays_count++]; + d.Init(); + + return d.Parse(pReader, pos, size); +} + +bool Chapters::Atom::ExpandDisplaysArray() { + if (m_displays_size > m_displays_count) + return true; // nothing else to do + + const int size = (m_displays_size == 0) ? 1 : 2 * m_displays_size; + + Display* const displays = new (std::nothrow) Display[size]; + + if (displays == NULL) + return false; + + for (int idx = 0; idx < m_displays_count; ++idx) { + m_displays[idx].ShallowCopy(displays[idx]); + } + + delete[] m_displays; + m_displays = displays; + + m_displays_size = size; + return true; +} + +Chapters::Display::Display() {} + +Chapters::Display::~Display() {} + +const char* Chapters::Display::GetString() const { return m_string; } + +const char* Chapters::Display::GetLanguage() const { return m_language; } + +const char* Chapters::Display::GetCountry() const { return m_country; } + +void Chapters::Display::Init() { + m_string = NULL; + m_language = NULL; + m_country = NULL; +} + +void Chapters::Display::ShallowCopy(Display& rhs) const { + rhs.m_string = m_string; + rhs.m_language = m_language; + rhs.m_country = m_country; +} + +void Chapters::Display::Clear() { + delete[] m_string; + m_string = NULL; + + delete[] m_language; + m_language = NULL; + + delete[] m_country; + m_country = NULL; +} + +long Chapters::Display::Parse(IMkvReader* pReader, long long pos, + long long size) { + const long long stop = pos + size; + + while (pos < stop) { + long long id, size; + + long status = ParseElementHeader(pReader, pos, stop, id, size); + + if (status < 0) // error + return status; + + if (size == 0) // No payload. + continue; + + if (id == libwebm::kMkvChapString) { + status = UnserializeString(pReader, pos, size, m_string); + + if (status) + return status; + } else if (id == libwebm::kMkvChapLanguage) { + status = UnserializeString(pReader, pos, size, m_language); + + if (status) + return status; + } else if (id == libwebm::kMkvChapCountry) { + status = UnserializeString(pReader, pos, size, m_country); + + if (status) + return status; + } + + pos += size; + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + return 0; +} + +Tags::Tags(Segment* pSegment, long long payload_start, long long payload_size, + long long element_start, long long element_size) + : m_pSegment(pSegment), + m_start(payload_start), + m_size(payload_size), + m_element_start(element_start), + m_element_size(element_size), + m_tags(NULL), + m_tags_size(0), + m_tags_count(0) {} + +Tags::~Tags() { + while (m_tags_count > 0) { + Tag& t = m_tags[--m_tags_count]; + t.Clear(); + } + delete[] m_tags; +} + +long Tags::Parse() { + IMkvReader* const pReader = m_pSegment->m_pReader; + + long long pos = m_start; // payload start + const long long stop = pos + m_size; // payload stop + + while (pos < stop) { + long long id, size; + + long status = ParseElementHeader(pReader, pos, stop, id, size); + + if (status < 0) + return status; + + if (size == 0) // 0 length tag, read another + continue; + + if (id == libwebm::kMkvTag) { + status = ParseTag(pos, size); + + if (status < 0) + return status; + } + + pos += size; + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + + return 0; +} + +int Tags::GetTagCount() const { return m_tags_count; } + +const Tags::Tag* Tags::GetTag(int idx) const { + if (idx < 0) + return NULL; + + if (idx >= m_tags_count) + return NULL; + + return m_tags + idx; +} + +bool Tags::ExpandTagsArray() { + if (m_tags_size > m_tags_count) + return true; // nothing else to do + + const int size = (m_tags_size == 0) ? 1 : 2 * m_tags_size; + + Tag* const tags = new (std::nothrow) Tag[size]; + + if (tags == NULL) + return false; + + for (int idx = 0; idx < m_tags_count; ++idx) { + m_tags[idx].ShallowCopy(tags[idx]); + } + + delete[] m_tags; + m_tags = tags; + + m_tags_size = size; + return true; +} + +long Tags::ParseTag(long long pos, long long size) { + if (!ExpandTagsArray()) + return -1; + + Tag& t = m_tags[m_tags_count++]; + t.Init(); + + return t.Parse(m_pSegment->m_pReader, pos, size); +} + +Tags::Tag::Tag() {} + +Tags::Tag::~Tag() {} + +int Tags::Tag::GetSimpleTagCount() const { return m_simple_tags_count; } + +const Tags::SimpleTag* Tags::Tag::GetSimpleTag(int index) const { + if (index < 0) + return NULL; + + if (index >= m_simple_tags_count) + return NULL; + + return m_simple_tags + index; +} + +void Tags::Tag::Init() { + m_simple_tags = NULL; + m_simple_tags_size = 0; + m_simple_tags_count = 0; +} + +void Tags::Tag::ShallowCopy(Tag& rhs) const { + rhs.m_simple_tags = m_simple_tags; + rhs.m_simple_tags_size = m_simple_tags_size; + rhs.m_simple_tags_count = m_simple_tags_count; +} + +void Tags::Tag::Clear() { + while (m_simple_tags_count > 0) { + SimpleTag& d = m_simple_tags[--m_simple_tags_count]; + d.Clear(); + } + + delete[] m_simple_tags; + m_simple_tags = NULL; + + m_simple_tags_size = 0; +} + +long Tags::Tag::Parse(IMkvReader* pReader, long long pos, long long size) { + const long long stop = pos + size; + + while (pos < stop) { + long long id, size; + + long status = ParseElementHeader(pReader, pos, stop, id, size); + + if (status < 0) + return status; + + if (size == 0) // 0 length tag, read another + continue; + + if (id == libwebm::kMkvSimpleTag) { + status = ParseSimpleTag(pReader, pos, size); + + if (status < 0) + return status; + } + + pos += size; + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + return 0; +} + +long Tags::Tag::ParseSimpleTag(IMkvReader* pReader, long long pos, + long long size) { + if (!ExpandSimpleTagsArray()) + return -1; + + SimpleTag& st = m_simple_tags[m_simple_tags_count++]; + st.Init(); + + return st.Parse(pReader, pos, size); +} + +bool Tags::Tag::ExpandSimpleTagsArray() { + if (m_simple_tags_size > m_simple_tags_count) + return true; // nothing else to do + + const int size = (m_simple_tags_size == 0) ? 1 : 2 * m_simple_tags_size; + + SimpleTag* const displays = new (std::nothrow) SimpleTag[size]; + + if (displays == NULL) + return false; + + for (int idx = 0; idx < m_simple_tags_count; ++idx) { + m_simple_tags[idx].ShallowCopy(displays[idx]); + } + + delete[] m_simple_tags; + m_simple_tags = displays; + + m_simple_tags_size = size; + return true; +} + +Tags::SimpleTag::SimpleTag() {} + +Tags::SimpleTag::~SimpleTag() {} + +const char* Tags::SimpleTag::GetTagName() const { return m_tag_name; } + +const char* Tags::SimpleTag::GetTagString() const { return m_tag_string; } + +void Tags::SimpleTag::Init() { + m_tag_name = NULL; + m_tag_string = NULL; +} + +void Tags::SimpleTag::ShallowCopy(SimpleTag& rhs) const { + rhs.m_tag_name = m_tag_name; + rhs.m_tag_string = m_tag_string; +} + +void Tags::SimpleTag::Clear() { + delete[] m_tag_name; + m_tag_name = NULL; + + delete[] m_tag_string; + m_tag_string = NULL; +} + +long Tags::SimpleTag::Parse(IMkvReader* pReader, long long pos, + long long size) { + const long long stop = pos + size; + + while (pos < stop) { + long long id, size; + + long status = ParseElementHeader(pReader, pos, stop, id, size); + + if (status < 0) // error + return status; + + if (size == 0) // weird + continue; + + if (id == libwebm::kMkvTagName) { + status = UnserializeString(pReader, pos, size, m_tag_name); + + if (status) + return status; + } else if (id == libwebm::kMkvTagString) { + status = UnserializeString(pReader, pos, size, m_tag_string); + + if (status) + return status; + } + + pos += size; + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + return 0; +} + +SegmentInfo::SegmentInfo(Segment* pSegment, long long start, long long size_, + long long element_start, long long element_size) + : m_pSegment(pSegment), + m_start(start), + m_size(size_), + m_element_start(element_start), + m_element_size(element_size), + m_pMuxingAppAsUTF8(NULL), + m_pWritingAppAsUTF8(NULL), + m_pTitleAsUTF8(NULL) {} + +SegmentInfo::~SegmentInfo() { + delete[] m_pMuxingAppAsUTF8; + m_pMuxingAppAsUTF8 = NULL; + + delete[] m_pWritingAppAsUTF8; + m_pWritingAppAsUTF8 = NULL; + + delete[] m_pTitleAsUTF8; + m_pTitleAsUTF8 = NULL; +} + +long SegmentInfo::Parse() { + assert(m_pMuxingAppAsUTF8 == NULL); + assert(m_pWritingAppAsUTF8 == NULL); + assert(m_pTitleAsUTF8 == NULL); + + IMkvReader* const pReader = m_pSegment->m_pReader; + + long long pos = m_start; + const long long stop = m_start + m_size; + + m_timecodeScale = 1000000; + m_duration = -1; + + while (pos < stop) { + long long id, size; + + const long status = ParseElementHeader(pReader, pos, stop, id, size); + + if (status < 0) // error + return status; + + if (id == libwebm::kMkvTimecodeScale) { + m_timecodeScale = UnserializeUInt(pReader, pos, size); + + if (m_timecodeScale <= 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvDuration) { + const long status = UnserializeFloat(pReader, pos, size, m_duration); + + if (status < 0) + return status; + + if (m_duration < 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvMuxingApp) { + const long status = + UnserializeString(pReader, pos, size, m_pMuxingAppAsUTF8); + + if (status) + return status; + } else if (id == libwebm::kMkvWritingApp) { + const long status = + UnserializeString(pReader, pos, size, m_pWritingAppAsUTF8); + + if (status) + return status; + } else if (id == libwebm::kMkvTitle) { + const long status = UnserializeString(pReader, pos, size, m_pTitleAsUTF8); + + if (status) + return status; + } + + pos += size; + + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + const double rollover_check = m_duration * m_timecodeScale; + if (rollover_check > static_cast(LLONG_MAX)) + return E_FILE_FORMAT_INVALID; + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + + return 0; +} + +long long SegmentInfo::GetTimeCodeScale() const { return m_timecodeScale; } + +long long SegmentInfo::GetDuration() const { + if (m_duration < 0) + return -1; + + assert(m_timecodeScale >= 1); + + const double dd = double(m_duration) * double(m_timecodeScale); + const long long d = static_cast(dd); + + return d; +} + +const char* SegmentInfo::GetMuxingAppAsUTF8() const { + return m_pMuxingAppAsUTF8; +} + +const char* SegmentInfo::GetWritingAppAsUTF8() const { + return m_pWritingAppAsUTF8; +} + +const char* SegmentInfo::GetTitleAsUTF8() const { return m_pTitleAsUTF8; } + +/////////////////////////////////////////////////////////////// +// ContentEncoding element +ContentEncoding::ContentCompression::ContentCompression() + : algo(0), settings(NULL), settings_len(0) {} + +ContentEncoding::ContentCompression::~ContentCompression() { + delete[] settings; +} + +ContentEncoding::ContentEncryption::ContentEncryption() + : algo(0), + key_id(NULL), + key_id_len(0), + signature(NULL), + signature_len(0), + sig_key_id(NULL), + sig_key_id_len(0), + sig_algo(0), + sig_hash_algo(0) {} + +ContentEncoding::ContentEncryption::~ContentEncryption() { + delete[] key_id; + delete[] signature; + delete[] sig_key_id; +} + +ContentEncoding::ContentEncoding() + : compression_entries_(NULL), + compression_entries_end_(NULL), + encryption_entries_(NULL), + encryption_entries_end_(NULL), + encoding_order_(0), + encoding_scope_(1), + encoding_type_(0) {} + +ContentEncoding::~ContentEncoding() { + ContentCompression** comp_i = compression_entries_; + ContentCompression** const comp_j = compression_entries_end_; + + while (comp_i != comp_j) { + ContentCompression* const comp = *comp_i++; + delete comp; + } + + delete[] compression_entries_; + + ContentEncryption** enc_i = encryption_entries_; + ContentEncryption** const enc_j = encryption_entries_end_; + + while (enc_i != enc_j) { + ContentEncryption* const enc = *enc_i++; + delete enc; + } + + delete[] encryption_entries_; +} + +const ContentEncoding::ContentCompression* +ContentEncoding::GetCompressionByIndex(unsigned long idx) const { + const ptrdiff_t count = compression_entries_end_ - compression_entries_; + assert(count >= 0); + + if (idx >= static_cast(count)) + return NULL; + + return compression_entries_[idx]; +} + +unsigned long ContentEncoding::GetCompressionCount() const { + const ptrdiff_t count = compression_entries_end_ - compression_entries_; + assert(count >= 0); + + return static_cast(count); +} + +const ContentEncoding::ContentEncryption* ContentEncoding::GetEncryptionByIndex( + unsigned long idx) const { + const ptrdiff_t count = encryption_entries_end_ - encryption_entries_; + assert(count >= 0); + + if (idx >= static_cast(count)) + return NULL; + + return encryption_entries_[idx]; +} + +unsigned long ContentEncoding::GetEncryptionCount() const { + const ptrdiff_t count = encryption_entries_end_ - encryption_entries_; + assert(count >= 0); + + return static_cast(count); +} + +long ContentEncoding::ParseContentEncAESSettingsEntry( + long long start, long long size, IMkvReader* pReader, + ContentEncAESSettings* aes) { + assert(pReader); + assert(aes); + + long long pos = start; + const long long stop = start + size; + + while (pos < stop) { + long long id, size; + const long status = ParseElementHeader(pReader, pos, stop, id, size); + if (status < 0) // error + return status; + + if (id == libwebm::kMkvAESSettingsCipherMode) { + aes->cipher_mode = UnserializeUInt(pReader, pos, size); + if (aes->cipher_mode != 1) + return E_FILE_FORMAT_INVALID; + } + + pos += size; // consume payload + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + return 0; +} + +long ContentEncoding::ParseContentEncodingEntry(long long start, long long size, + IMkvReader* pReader) { + assert(pReader); + + long long pos = start; + const long long stop = start + size; + + // Count ContentCompression and ContentEncryption elements. + long long compression_count = 0; + long long encryption_count = 0; + + while (pos < stop) { + long long id, size; + const long status = ParseElementHeader(pReader, pos, stop, id, size); + if (status < 0) // error + return status; + + if (id == libwebm::kMkvContentCompression) { + ++compression_count; + if (compression_count > INT_MAX) + return E_PARSE_FAILED; + } + + if (id == libwebm::kMkvContentEncryption) { + ++encryption_count; + if (encryption_count > INT_MAX) + return E_PARSE_FAILED; + } + + pos += size; // consume payload + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (compression_count <= 0 && encryption_count <= 0) + return -1; + + if (compression_count > 0) { + compression_entries_ = new (std::nothrow) + ContentCompression*[static_cast(compression_count)]; + if (!compression_entries_) + return -1; + compression_entries_end_ = compression_entries_; + } + + if (encryption_count > 0) { + encryption_entries_ = new (std::nothrow) + ContentEncryption*[static_cast(encryption_count)]; + if (!encryption_entries_) { + delete[] compression_entries_; + compression_entries_ = NULL; + return -1; + } + encryption_entries_end_ = encryption_entries_; + } + + pos = start; + while (pos < stop) { + long long id, size; + long status = ParseElementHeader(pReader, pos, stop, id, size); + if (status < 0) // error + return status; + + if (id == libwebm::kMkvContentEncodingOrder) { + encoding_order_ = UnserializeUInt(pReader, pos, size); + } else if (id == libwebm::kMkvContentEncodingScope) { + encoding_scope_ = UnserializeUInt(pReader, pos, size); + if (encoding_scope_ < 1) + return -1; + } else if (id == libwebm::kMkvContentEncodingType) { + encoding_type_ = UnserializeUInt(pReader, pos, size); + } else if (id == libwebm::kMkvContentCompression) { + ContentCompression* const compression = + new (std::nothrow) ContentCompression(); + if (!compression) + return -1; + + status = ParseCompressionEntry(pos, size, pReader, compression); + if (status) { + delete compression; + return status; + } + assert(compression_count > 0); + *compression_entries_end_++ = compression; + } else if (id == libwebm::kMkvContentEncryption) { + ContentEncryption* const encryption = + new (std::nothrow) ContentEncryption(); + if (!encryption) + return -1; + + status = ParseEncryptionEntry(pos, size, pReader, encryption); + if (status) { + delete encryption; + return status; + } + assert(encryption_count > 0); + *encryption_entries_end_++ = encryption; + } + + pos += size; // consume payload + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + return 0; +} + +long ContentEncoding::ParseCompressionEntry(long long start, long long size, + IMkvReader* pReader, + ContentCompression* compression) { + assert(pReader); + assert(compression); + + long long pos = start; + const long long stop = start + size; + + bool valid = false; + + while (pos < stop) { + long long id, size; + const long status = ParseElementHeader(pReader, pos, stop, id, size); + if (status < 0) // error + return status; + + if (id == libwebm::kMkvContentCompAlgo) { + long long algo = UnserializeUInt(pReader, pos, size); + if (algo < 0) + return E_FILE_FORMAT_INVALID; + compression->algo = algo; + valid = true; + } else if (id == libwebm::kMkvContentCompSettings) { + if (size <= 0) + return E_FILE_FORMAT_INVALID; + + const size_t buflen = static_cast(size); + unsigned char* buf = SafeArrayAlloc(1, buflen); + if (buf == NULL) + return -1; + + const int read_status = + pReader->Read(pos, static_cast(buflen), buf); + if (read_status) { + delete[] buf; + return status; + } + + // There should be only one settings element per content compression. + if (compression->settings != NULL) { + delete[] buf; + return E_FILE_FORMAT_INVALID; + } + + compression->settings = buf; + compression->settings_len = buflen; + } + + pos += size; // consume payload + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + // ContentCompAlgo is mandatory + if (!valid) + return E_FILE_FORMAT_INVALID; + + return 0; +} + +long ContentEncoding::ParseEncryptionEntry(long long start, long long size, + IMkvReader* pReader, + ContentEncryption* encryption) { + assert(pReader); + assert(encryption); + + long long pos = start; + const long long stop = start + size; + + while (pos < stop) { + long long id, size; + const long status = ParseElementHeader(pReader, pos, stop, id, size); + if (status < 0) // error + return status; + + if (id == libwebm::kMkvContentEncAlgo) { + encryption->algo = UnserializeUInt(pReader, pos, size); + if (encryption->algo != 5) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvContentEncKeyID) { + delete[] encryption->key_id; + encryption->key_id = NULL; + encryption->key_id_len = 0; + + if (size <= 0) + return E_FILE_FORMAT_INVALID; + + const size_t buflen = static_cast(size); + unsigned char* buf = SafeArrayAlloc(1, buflen); + if (buf == NULL) + return -1; + + const int read_status = + pReader->Read(pos, static_cast(buflen), buf); + if (read_status) { + delete[] buf; + return status; + } + + encryption->key_id = buf; + encryption->key_id_len = buflen; + } else if (id == libwebm::kMkvContentSignature) { + delete[] encryption->signature; + encryption->signature = NULL; + encryption->signature_len = 0; + + if (size <= 0) + return E_FILE_FORMAT_INVALID; + + const size_t buflen = static_cast(size); + unsigned char* buf = SafeArrayAlloc(1, buflen); + if (buf == NULL) + return -1; + + const int read_status = + pReader->Read(pos, static_cast(buflen), buf); + if (read_status) { + delete[] buf; + return status; + } + + encryption->signature = buf; + encryption->signature_len = buflen; + } else if (id == libwebm::kMkvContentSigKeyID) { + delete[] encryption->sig_key_id; + encryption->sig_key_id = NULL; + encryption->sig_key_id_len = 0; + + if (size <= 0) + return E_FILE_FORMAT_INVALID; + + const size_t buflen = static_cast(size); + unsigned char* buf = SafeArrayAlloc(1, buflen); + if (buf == NULL) + return -1; + + const int read_status = + pReader->Read(pos, static_cast(buflen), buf); + if (read_status) { + delete[] buf; + return status; + } + + encryption->sig_key_id = buf; + encryption->sig_key_id_len = buflen; + } else if (id == libwebm::kMkvContentSigAlgo) { + encryption->sig_algo = UnserializeUInt(pReader, pos, size); + } else if (id == libwebm::kMkvContentSigHashAlgo) { + encryption->sig_hash_algo = UnserializeUInt(pReader, pos, size); + } else if (id == libwebm::kMkvContentEncAESSettings) { + const long status = ParseContentEncAESSettingsEntry( + pos, size, pReader, &encryption->aes_settings); + if (status) + return status; + } + + pos += size; // consume payload + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + return 0; +} + +Track::Track(Segment* pSegment, long long element_start, long long element_size) + : m_pSegment(pSegment), + m_element_start(element_start), + m_element_size(element_size), + content_encoding_entries_(NULL), + content_encoding_entries_end_(NULL) {} + +Track::~Track() { + Info& info = const_cast(m_info); + info.Clear(); + + ContentEncoding** i = content_encoding_entries_; + ContentEncoding** const j = content_encoding_entries_end_; + + while (i != j) { + ContentEncoding* const encoding = *i++; + delete encoding; + } + + delete[] content_encoding_entries_; +} + +long Track::Create(Segment* pSegment, const Info& info, long long element_start, + long long element_size, Track*& pResult) { + if (pResult) + return -1; + + Track* const pTrack = + new (std::nothrow) Track(pSegment, element_start, element_size); + + if (pTrack == NULL) + return -1; // generic error + + const int status = info.Copy(pTrack->m_info); + + if (status) { // error + delete pTrack; + return status; + } + + pResult = pTrack; + return 0; // success +} + +Track::Info::Info() + : uid(0), + defaultDuration(0), + codecDelay(0), + seekPreRoll(0), + nameAsUTF8(NULL), + language(NULL), + codecId(NULL), + codecNameAsUTF8(NULL), + codecPrivate(NULL), + codecPrivateSize(0), + lacing(false) {} + +Track::Info::~Info() { Clear(); } + +void Track::Info::Clear() { + delete[] nameAsUTF8; + nameAsUTF8 = NULL; + + delete[] language; + language = NULL; + + delete[] codecId; + codecId = NULL; + + delete[] codecPrivate; + codecPrivate = NULL; + codecPrivateSize = 0; + + delete[] codecNameAsUTF8; + codecNameAsUTF8 = NULL; +} + +int Track::Info::CopyStr(char* Info::*str, Info& dst_) const { + if (str == static_cast(NULL)) + return -1; + + char*& dst = dst_.*str; + + if (dst) // should be NULL already + return -1; + + const char* const src = this->*str; + + if (src == NULL) + return 0; + + const size_t len = strlen(src); + + dst = SafeArrayAlloc(1, len + 1); + + if (dst == NULL) + return -1; + + memcpy(dst, src, len); + dst[len] = '\0'; + + return 0; +} + +int Track::Info::Copy(Info& dst) const { + if (&dst == this) + return 0; + + dst.type = type; + dst.number = number; + dst.defaultDuration = defaultDuration; + dst.codecDelay = codecDelay; + dst.seekPreRoll = seekPreRoll; + dst.uid = uid; + dst.lacing = lacing; + dst.settings = settings; + + // We now copy the string member variables from src to dst. + // This involves memory allocation so in principle the operation + // can fail (indeed, that's why we have Info::Copy), so we must + // report this to the caller. An error return from this function + // therefore implies that the copy was only partially successful. + + if (int status = CopyStr(&Info::nameAsUTF8, dst)) + return status; + + if (int status = CopyStr(&Info::language, dst)) + return status; + + if (int status = CopyStr(&Info::codecId, dst)) + return status; + + if (int status = CopyStr(&Info::codecNameAsUTF8, dst)) + return status; + + if (codecPrivateSize > 0) { + if (codecPrivate == NULL) + return -1; + + if (dst.codecPrivate) + return -1; + + if (dst.codecPrivateSize != 0) + return -1; + + dst.codecPrivate = SafeArrayAlloc(1, codecPrivateSize); + + if (dst.codecPrivate == NULL) + return -1; + + memcpy(dst.codecPrivate, codecPrivate, codecPrivateSize); + dst.codecPrivateSize = codecPrivateSize; + } + + return 0; +} + +const BlockEntry* Track::GetEOS() const { return &m_eos; } + +long Track::GetType() const { return m_info.type; } + +long Track::GetNumber() const { return m_info.number; } + +unsigned long long Track::GetUid() const { return m_info.uid; } + +const char* Track::GetNameAsUTF8() const { return m_info.nameAsUTF8; } + +const char* Track::GetLanguage() const { return m_info.language; } + +const char* Track::GetCodecNameAsUTF8() const { return m_info.codecNameAsUTF8; } + +const char* Track::GetCodecId() const { return m_info.codecId; } + +const unsigned char* Track::GetCodecPrivate(size_t& size) const { + size = m_info.codecPrivateSize; + return m_info.codecPrivate; +} + +bool Track::GetLacing() const { return m_info.lacing; } + +unsigned long long Track::GetDefaultDuration() const { + return m_info.defaultDuration; +} + +unsigned long long Track::GetCodecDelay() const { return m_info.codecDelay; } + +unsigned long long Track::GetSeekPreRoll() const { return m_info.seekPreRoll; } + +long Track::GetFirst(const BlockEntry*& pBlockEntry) const { + const Cluster* pCluster = m_pSegment->GetFirst(); + + for (int i = 0;;) { + if (pCluster == NULL) { + pBlockEntry = GetEOS(); + return 1; + } + + if (pCluster->EOS()) { + if (m_pSegment->DoneParsing()) { + pBlockEntry = GetEOS(); + return 1; + } + + pBlockEntry = 0; + return E_BUFFER_NOT_FULL; + } + + long status = pCluster->GetFirst(pBlockEntry); + + if (status < 0) // error + return status; + + if (pBlockEntry == 0) { // empty cluster + pCluster = m_pSegment->GetNext(pCluster); + continue; + } + + for (;;) { + const Block* const pBlock = pBlockEntry->GetBlock(); + assert(pBlock); + + const long long tn = pBlock->GetTrackNumber(); + + if ((tn == m_info.number) && VetEntry(pBlockEntry)) + return 0; + + const BlockEntry* pNextEntry; + + status = pCluster->GetNext(pBlockEntry, pNextEntry); + + if (status < 0) // error + return status; + + if (pNextEntry == 0) + break; + + pBlockEntry = pNextEntry; + } + + ++i; + + if (i >= 100) + break; + + pCluster = m_pSegment->GetNext(pCluster); + } + + // NOTE: if we get here, it means that we didn't find a block with + // a matching track number. We interpret that as an error (which + // might be too conservative). + + pBlockEntry = GetEOS(); // so we can return a non-NULL value + return 1; +} + +long Track::GetNext(const BlockEntry* pCurrEntry, + const BlockEntry*& pNextEntry) const { + assert(pCurrEntry); + assert(!pCurrEntry->EOS()); //? + + const Block* const pCurrBlock = pCurrEntry->GetBlock(); + assert(pCurrBlock && pCurrBlock->GetTrackNumber() == m_info.number); + if (!pCurrBlock || pCurrBlock->GetTrackNumber() != m_info.number) + return -1; + + const Cluster* pCluster = pCurrEntry->GetCluster(); + assert(pCluster); + assert(!pCluster->EOS()); + + long status = pCluster->GetNext(pCurrEntry, pNextEntry); + + if (status < 0) // error + return status; + + for (int i = 0;;) { + while (pNextEntry) { + const Block* const pNextBlock = pNextEntry->GetBlock(); + assert(pNextBlock); + + if (pNextBlock->GetTrackNumber() == m_info.number) + return 0; + + pCurrEntry = pNextEntry; + + status = pCluster->GetNext(pCurrEntry, pNextEntry); + + if (status < 0) // error + return status; + } + + pCluster = m_pSegment->GetNext(pCluster); + + if (pCluster == NULL) { + pNextEntry = GetEOS(); + return 1; + } + + if (pCluster->EOS()) { + if (m_pSegment->DoneParsing()) { + pNextEntry = GetEOS(); + return 1; + } + + // TODO: there is a potential O(n^2) problem here: we tell the + // caller to (pre)load another cluster, which he does, but then he + // calls GetNext again, which repeats the same search. This is + // a pathological case, since the only way it can happen is if + // there exists a long sequence of clusters none of which contain a + // block from this track. One way around this problem is for the + // caller to be smarter when he loads another cluster: don't call + // us back until you have a cluster that contains a block from this + // track. (Of course, that's not cheap either, since our caller + // would have to scan the each cluster as it's loaded, so that + // would just push back the problem.) + + pNextEntry = NULL; + return E_BUFFER_NOT_FULL; + } + + status = pCluster->GetFirst(pNextEntry); + + if (status < 0) // error + return status; + + if (pNextEntry == NULL) // empty cluster + continue; + + ++i; + + if (i >= 100) + break; + } + + // NOTE: if we get here, it means that we didn't find a block with + // a matching track number after lots of searching, so we give + // up trying. + + pNextEntry = GetEOS(); // so we can return a non-NULL value + return 1; +} + +bool Track::VetEntry(const BlockEntry* pBlockEntry) const { + assert(pBlockEntry); + const Block* const pBlock = pBlockEntry->GetBlock(); + assert(pBlock); + assert(pBlock->GetTrackNumber() == m_info.number); + if (!pBlock || pBlock->GetTrackNumber() != m_info.number) + return false; + + // This function is used during a seek to determine whether the + // frame is a valid seek target. This default function simply + // returns true, which means all frames are valid seek targets. + // It gets overridden by the VideoTrack class, because only video + // keyframes can be used as seek target. + + return true; +} + +long Track::Seek(long long time_ns, const BlockEntry*& pResult) const { + const long status = GetFirst(pResult); + + if (status < 0) // buffer underflow, etc + return status; + + assert(pResult); + + if (pResult->EOS()) + return 0; + + const Cluster* pCluster = pResult->GetCluster(); + assert(pCluster); + assert(pCluster->GetIndex() >= 0); + + if (time_ns <= pResult->GetBlock()->GetTime(pCluster)) + return 0; + + Cluster** const clusters = m_pSegment->m_clusters; + assert(clusters); + + const long count = m_pSegment->GetCount(); // loaded only, not preloaded + assert(count > 0); + + Cluster** const i = clusters + pCluster->GetIndex(); + assert(i); + assert(*i == pCluster); + assert(pCluster->GetTime() <= time_ns); + + Cluster** const j = clusters + count; + + Cluster** lo = i; + Cluster** hi = j; + + while (lo < hi) { + // INVARIANT: + //[i, lo) <= time_ns + //[lo, hi) ? + //[hi, j) > time_ns + + Cluster** const mid = lo + (hi - lo) / 2; + assert(mid < hi); + + pCluster = *mid; + assert(pCluster); + assert(pCluster->GetIndex() >= 0); + assert(pCluster->GetIndex() == long(mid - m_pSegment->m_clusters)); + + const long long t = pCluster->GetTime(); + + if (t <= time_ns) + lo = mid + 1; + else + hi = mid; + + assert(lo <= hi); + } + + assert(lo == hi); + assert(lo > i); + assert(lo <= j); + + while (lo > i) { + pCluster = *--lo; + assert(pCluster); + assert(pCluster->GetTime() <= time_ns); + + pResult = pCluster->GetEntry(this); + + if ((pResult != 0) && !pResult->EOS()) + return 0; + + // landed on empty cluster (no entries) + } + + pResult = GetEOS(); // weird + return 0; +} + +const ContentEncoding* Track::GetContentEncodingByIndex( + unsigned long idx) const { + const ptrdiff_t count = + content_encoding_entries_end_ - content_encoding_entries_; + assert(count >= 0); + + if (idx >= static_cast(count)) + return NULL; + + return content_encoding_entries_[idx]; +} + +unsigned long Track::GetContentEncodingCount() const { + const ptrdiff_t count = + content_encoding_entries_end_ - content_encoding_entries_; + assert(count >= 0); + + return static_cast(count); +} + +long Track::ParseContentEncodingsEntry(long long start, long long size) { + IMkvReader* const pReader = m_pSegment->m_pReader; + assert(pReader); + + long long pos = start; + const long long stop = start + size; + + // Count ContentEncoding elements. + long long count = 0; + while (pos < stop) { + long long id, size; + const long status = ParseElementHeader(pReader, pos, stop, id, size); + if (status < 0) // error + return status; + + // pos now designates start of element + if (id == libwebm::kMkvContentEncoding) { + ++count; + if (count > INT_MAX) + return E_PARSE_FAILED; + } + + pos += size; // consume payload + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (count <= 0) + return -1; + + content_encoding_entries_ = + new (std::nothrow) ContentEncoding*[static_cast(count)]; + if (!content_encoding_entries_) + return -1; + + content_encoding_entries_end_ = content_encoding_entries_; + + pos = start; + while (pos < stop) { + long long id, size; + long status = ParseElementHeader(pReader, pos, stop, id, size); + if (status < 0) // error + return status; + + // pos now designates start of element + if (id == libwebm::kMkvContentEncoding) { + ContentEncoding* const content_encoding = + new (std::nothrow) ContentEncoding(); + if (!content_encoding) + return -1; + + status = content_encoding->ParseContentEncodingEntry(pos, size, pReader); + if (status) { + delete content_encoding; + return status; + } + + *content_encoding_entries_end_++ = content_encoding; + } + + pos += size; // consume payload + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + + return 0; +} + +Track::EOSBlock::EOSBlock() : BlockEntry(NULL, LONG_MIN) {} + +BlockEntry::Kind Track::EOSBlock::GetKind() const { return kBlockEOS; } + +const Block* Track::EOSBlock::GetBlock() const { return NULL; } + +bool PrimaryChromaticity::Parse(IMkvReader* reader, long long read_pos, + long long value_size, bool is_x, + PrimaryChromaticity** chromaticity) { + if (!reader) + return false; + + if (!*chromaticity) + *chromaticity = new PrimaryChromaticity(); + + if (!*chromaticity) + return false; + + PrimaryChromaticity* pc = *chromaticity; + float* value = is_x ? &pc->x : &pc->y; + + double parser_value = 0; + const long long parse_status = + UnserializeFloat(reader, read_pos, value_size, parser_value); + + // Valid range is [0, 1]. Make sure the double is representable as a float + // before casting. + if (parse_status < 0 || parser_value < 0.0 || parser_value > 1.0 || + (parser_value > 0.0 && parser_value < FLT_MIN)) + return false; + + *value = static_cast(parser_value); + + return true; +} + +bool MasteringMetadata::Parse(IMkvReader* reader, long long mm_start, + long long mm_size, MasteringMetadata** mm) { + if (!reader || *mm) + return false; + + std::unique_ptr mm_ptr(new MasteringMetadata()); + if (!mm_ptr.get()) + return false; + + const long long mm_end = mm_start + mm_size; + long long read_pos = mm_start; + + while (read_pos < mm_end) { + long long child_id = 0; + long long child_size = 0; + + const long long status = + ParseElementHeader(reader, read_pos, mm_end, child_id, child_size); + if (status < 0) + return false; + + if (child_id == libwebm::kMkvLuminanceMax) { + double value = 0; + const long long value_parse_status = + UnserializeFloat(reader, read_pos, child_size, value); + if (value < -FLT_MAX || value > FLT_MAX || + (value > 0.0 && value < FLT_MIN)) { + return false; + } + mm_ptr->luminance_max = static_cast(value); + if (value_parse_status < 0 || mm_ptr->luminance_max < 0.0 || + mm_ptr->luminance_max > 9999.99) { + return false; + } + } else if (child_id == libwebm::kMkvLuminanceMin) { + double value = 0; + const long long value_parse_status = + UnserializeFloat(reader, read_pos, child_size, value); + if (value < -FLT_MAX || value > FLT_MAX || + (value > 0.0 && value < FLT_MIN)) { + return false; + } + mm_ptr->luminance_min = static_cast(value); + if (value_parse_status < 0 || mm_ptr->luminance_min < 0.0 || + mm_ptr->luminance_min > 999.9999) { + return false; + } + } else { + bool is_x = false; + PrimaryChromaticity** chromaticity; + switch (child_id) { + case libwebm::kMkvPrimaryRChromaticityX: + case libwebm::kMkvPrimaryRChromaticityY: + is_x = child_id == libwebm::kMkvPrimaryRChromaticityX; + chromaticity = &mm_ptr->r; + break; + case libwebm::kMkvPrimaryGChromaticityX: + case libwebm::kMkvPrimaryGChromaticityY: + is_x = child_id == libwebm::kMkvPrimaryGChromaticityX; + chromaticity = &mm_ptr->g; + break; + case libwebm::kMkvPrimaryBChromaticityX: + case libwebm::kMkvPrimaryBChromaticityY: + is_x = child_id == libwebm::kMkvPrimaryBChromaticityX; + chromaticity = &mm_ptr->b; + break; + case libwebm::kMkvWhitePointChromaticityX: + case libwebm::kMkvWhitePointChromaticityY: + is_x = child_id == libwebm::kMkvWhitePointChromaticityX; + chromaticity = &mm_ptr->white_point; + break; + default: + return false; + } + const bool value_parse_status = PrimaryChromaticity::Parse( + reader, read_pos, child_size, is_x, chromaticity); + if (!value_parse_status) + return false; + } + + read_pos += child_size; + if (read_pos > mm_end) + return false; + } + + *mm = mm_ptr.release(); + return true; +} + +bool Colour::Parse(IMkvReader* reader, long long colour_start, + long long colour_size, Colour** colour) { + if (!reader || *colour) + return false; + + std::unique_ptr colour_ptr(new Colour()); + if (!colour_ptr.get()) + return false; + + const long long colour_end = colour_start + colour_size; + long long read_pos = colour_start; + + while (read_pos < colour_end) { + long long child_id = 0; + long long child_size = 0; + + const long status = + ParseElementHeader(reader, read_pos, colour_end, child_id, child_size); + if (status < 0) + return false; + + if (child_id == libwebm::kMkvMatrixCoefficients) { + colour_ptr->matrix_coefficients = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->matrix_coefficients < 0) + return false; + } else if (child_id == libwebm::kMkvBitsPerChannel) { + colour_ptr->bits_per_channel = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->bits_per_channel < 0) + return false; + } else if (child_id == libwebm::kMkvChromaSubsamplingHorz) { + colour_ptr->chroma_subsampling_horz = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->chroma_subsampling_horz < 0) + return false; + } else if (child_id == libwebm::kMkvChromaSubsamplingVert) { + colour_ptr->chroma_subsampling_vert = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->chroma_subsampling_vert < 0) + return false; + } else if (child_id == libwebm::kMkvCbSubsamplingHorz) { + colour_ptr->cb_subsampling_horz = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->cb_subsampling_horz < 0) + return false; + } else if (child_id == libwebm::kMkvCbSubsamplingVert) { + colour_ptr->cb_subsampling_vert = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->cb_subsampling_vert < 0) + return false; + } else if (child_id == libwebm::kMkvChromaSitingHorz) { + colour_ptr->chroma_siting_horz = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->chroma_siting_horz < 0) + return false; + } else if (child_id == libwebm::kMkvChromaSitingVert) { + colour_ptr->chroma_siting_vert = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->chroma_siting_vert < 0) + return false; + } else if (child_id == libwebm::kMkvRange) { + colour_ptr->range = UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->range < 0) + return false; + } else if (child_id == libwebm::kMkvTransferCharacteristics) { + colour_ptr->transfer_characteristics = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->transfer_characteristics < 0) + return false; + } else if (child_id == libwebm::kMkvPrimaries) { + colour_ptr->primaries = UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->primaries < 0) + return false; + } else if (child_id == libwebm::kMkvMaxCLL) { + colour_ptr->max_cll = UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->max_cll < 0) + return false; + } else if (child_id == libwebm::kMkvMaxFALL) { + colour_ptr->max_fall = UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->max_fall < 0) + return false; + } else if (child_id == libwebm::kMkvMasteringMetadata) { + if (!MasteringMetadata::Parse(reader, read_pos, child_size, + &colour_ptr->mastering_metadata)) + return false; + } else { + return false; + } + + read_pos += child_size; + if (read_pos > colour_end) + return false; + } + *colour = colour_ptr.release(); + return true; +} + +bool Projection::Parse(IMkvReader* reader, long long start, long long size, + Projection** projection) { + if (!reader || *projection) + return false; + + std::unique_ptr projection_ptr(new Projection()); + if (!projection_ptr.get()) + return false; + + const long long end = start + size; + long long read_pos = start; + + while (read_pos < end) { + long long child_id = 0; + long long child_size = 0; + + const long long status = + ParseElementHeader(reader, read_pos, end, child_id, child_size); + if (status < 0) + return false; + + if (child_id == libwebm::kMkvProjectionType) { + long long projection_type = kTypeNotPresent; + projection_type = UnserializeUInt(reader, read_pos, child_size); + if (projection_type < 0) + return false; + + projection_ptr->type = static_cast(projection_type); + } else if (child_id == libwebm::kMkvProjectionPrivate) { + if (projection_ptr->private_data != NULL) + return false; + unsigned char* data = SafeArrayAlloc(1, child_size); + + if (data == NULL) + return false; + + const int status = + reader->Read(read_pos, static_cast(child_size), data); + + if (status) { + delete[] data; + return false; + } + + projection_ptr->private_data = data; + projection_ptr->private_data_length = static_cast(child_size); + } else { + double value = 0; + const long long value_parse_status = + UnserializeFloat(reader, read_pos, child_size, value); + // Make sure value is representable as a float before casting. + if (value_parse_status < 0 || value < -FLT_MAX || value > FLT_MAX || + (value > 0.0 && value < FLT_MIN)) { + return false; + } + + switch (child_id) { + case libwebm::kMkvProjectionPoseYaw: + projection_ptr->pose_yaw = static_cast(value); + break; + case libwebm::kMkvProjectionPosePitch: + projection_ptr->pose_pitch = static_cast(value); + break; + case libwebm::kMkvProjectionPoseRoll: + projection_ptr->pose_roll = static_cast(value); + break; + default: + return false; + } + } + + read_pos += child_size; + if (read_pos > end) + return false; + } + + *projection = projection_ptr.release(); + return true; +} + +VideoTrack::VideoTrack(Segment* pSegment, long long element_start, + long long element_size) + : Track(pSegment, element_start, element_size), + m_colour_space(NULL), + m_colour(NULL), + m_projection(NULL) {} + +VideoTrack::~VideoTrack() { + delete[] m_colour_space; + delete m_colour; + delete m_projection; +} + +long VideoTrack::Parse(Segment* pSegment, const Info& info, + long long element_start, long long element_size, + VideoTrack*& pResult) { + if (pResult) + return -1; + + if (info.type != Track::kVideo) + return -1; + + long long width = 0; + long long height = 0; + long long display_width = 0; + long long display_height = 0; + long long display_unit = 0; + long long stereo_mode = 0; + + double rate = 0.0; + std::unique_ptr colour_space_ptr; + + IMkvReader* const pReader = pSegment->m_pReader; + + const Settings& s = info.settings; + assert(s.start >= 0); + assert(s.size >= 0); + + long long pos = s.start; + assert(pos >= 0); + + const long long stop = pos + s.size; + + std::unique_ptr colour_ptr; + std::unique_ptr projection_ptr; + + while (pos < stop) { + long long id, size; + + const long status = ParseElementHeader(pReader, pos, stop, id, size); + + if (status < 0) // error + return status; + + if (id == libwebm::kMkvPixelWidth) { + width = UnserializeUInt(pReader, pos, size); + + if (width <= 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvPixelHeight) { + height = UnserializeUInt(pReader, pos, size); + + if (height <= 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvDisplayWidth) { + display_width = UnserializeUInt(pReader, pos, size); + + if (display_width <= 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvDisplayHeight) { + display_height = UnserializeUInt(pReader, pos, size); + + if (display_height <= 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvDisplayUnit) { + display_unit = UnserializeUInt(pReader, pos, size); + + if (display_unit < 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvStereoMode) { + stereo_mode = UnserializeUInt(pReader, pos, size); + + if (stereo_mode < 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvFrameRate) { + const long status = UnserializeFloat(pReader, pos, size, rate); + + if (status < 0) + return status; + + if (rate <= 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvColour) { + Colour* colour = NULL; + if (!Colour::Parse(pReader, pos, size, &colour)) { + return E_FILE_FORMAT_INVALID; + } else { + colour_ptr.reset(colour); + } + } else if (id == libwebm::kMkvProjection) { + Projection* projection = NULL; + if (!Projection::Parse(pReader, pos, size, &projection)) { + return E_FILE_FORMAT_INVALID; + } else { + projection_ptr.reset(projection); + } + } else if (id == libwebm::kMkvColourSpace) { + char* colour_space = NULL; + const long status = UnserializeString(pReader, pos, size, colour_space); + if (status < 0) + return status; + colour_space_ptr.reset(colour_space); + } + + pos += size; // consume payload + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + + VideoTrack* const pTrack = + new (std::nothrow) VideoTrack(pSegment, element_start, element_size); + + if (pTrack == NULL) + return -1; // generic error + + const int status = info.Copy(pTrack->m_info); + + if (status) { // error + delete pTrack; + return status; + } + + pTrack->m_width = width; + pTrack->m_height = height; + pTrack->m_display_width = display_width; + pTrack->m_display_height = display_height; + pTrack->m_display_unit = display_unit; + pTrack->m_stereo_mode = stereo_mode; + pTrack->m_rate = rate; + pTrack->m_colour = colour_ptr.release(); + pTrack->m_colour_space = colour_space_ptr.release(); + pTrack->m_projection = projection_ptr.release(); + + pResult = pTrack; + return 0; // success +} + +bool VideoTrack::VetEntry(const BlockEntry* pBlockEntry) const { + return Track::VetEntry(pBlockEntry) && pBlockEntry->GetBlock()->IsKey(); +} + +long VideoTrack::Seek(long long time_ns, const BlockEntry*& pResult) const { + const long status = GetFirst(pResult); + + if (status < 0) // buffer underflow, etc + return status; + + assert(pResult); + + if (pResult->EOS()) + return 0; + + const Cluster* pCluster = pResult->GetCluster(); + assert(pCluster); + assert(pCluster->GetIndex() >= 0); + + if (time_ns <= pResult->GetBlock()->GetTime(pCluster)) + return 0; + + Cluster** const clusters = m_pSegment->m_clusters; + assert(clusters); + + const long count = m_pSegment->GetCount(); // loaded only, not pre-loaded + assert(count > 0); + + Cluster** const i = clusters + pCluster->GetIndex(); + assert(i); + assert(*i == pCluster); + assert(pCluster->GetTime() <= time_ns); + + Cluster** const j = clusters + count; + + Cluster** lo = i; + Cluster** hi = j; + + while (lo < hi) { + // INVARIANT: + //[i, lo) <= time_ns + //[lo, hi) ? + //[hi, j) > time_ns + + Cluster** const mid = lo + (hi - lo) / 2; + assert(mid < hi); + + pCluster = *mid; + assert(pCluster); + assert(pCluster->GetIndex() >= 0); + assert(pCluster->GetIndex() == long(mid - m_pSegment->m_clusters)); + + const long long t = pCluster->GetTime(); + + if (t <= time_ns) + lo = mid + 1; + else + hi = mid; + + assert(lo <= hi); + } + + assert(lo == hi); + assert(lo > i); + assert(lo <= j); + + pCluster = *--lo; + assert(pCluster); + assert(pCluster->GetTime() <= time_ns); + + pResult = pCluster->GetEntry(this, time_ns); + + if ((pResult != 0) && !pResult->EOS()) // found a keyframe + return 0; + + while (lo != i) { + pCluster = *--lo; + assert(pCluster); + assert(pCluster->GetTime() <= time_ns); + + pResult = pCluster->GetEntry(this, time_ns); + + if ((pResult != 0) && !pResult->EOS()) + return 0; + } + + // weird: we're on the first cluster, but no keyframe found + // should never happen but we must return something anyway + + pResult = GetEOS(); + return 0; +} + +Colour* VideoTrack::GetColour() const { return m_colour; } + +Projection* VideoTrack::GetProjection() const { return m_projection; } + +long long VideoTrack::GetWidth() const { return m_width; } + +long long VideoTrack::GetHeight() const { return m_height; } + +long long VideoTrack::GetDisplayWidth() const { + return m_display_width > 0 ? m_display_width : GetWidth(); +} + +long long VideoTrack::GetDisplayHeight() const { + return m_display_height > 0 ? m_display_height : GetHeight(); +} + +long long VideoTrack::GetDisplayUnit() const { return m_display_unit; } + +long long VideoTrack::GetStereoMode() const { return m_stereo_mode; } + +double VideoTrack::GetFrameRate() const { return m_rate; } + +AudioTrack::AudioTrack(Segment* pSegment, long long element_start, + long long element_size) + : Track(pSegment, element_start, element_size) {} + +long AudioTrack::Parse(Segment* pSegment, const Info& info, + long long element_start, long long element_size, + AudioTrack*& pResult) { + if (pResult) + return -1; + + if (info.type != Track::kAudio) + return -1; + + IMkvReader* const pReader = pSegment->m_pReader; + + const Settings& s = info.settings; + assert(s.start >= 0); + assert(s.size >= 0); + + long long pos = s.start; + assert(pos >= 0); + + const long long stop = pos + s.size; + + double rate = 8000.0; // MKV default + long long channels = 1; + long long bit_depth = 0; + + while (pos < stop) { + long long id, size; + + long status = ParseElementHeader(pReader, pos, stop, id, size); + + if (status < 0) // error + return status; + + if (id == libwebm::kMkvSamplingFrequency) { + status = UnserializeFloat(pReader, pos, size, rate); + + if (status < 0) + return status; + + if (rate <= 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvChannels) { + channels = UnserializeUInt(pReader, pos, size); + + if (channels <= 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvBitDepth) { + bit_depth = UnserializeUInt(pReader, pos, size); + + if (bit_depth <= 0) + return E_FILE_FORMAT_INVALID; + } + + pos += size; // consume payload + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + + AudioTrack* const pTrack = + new (std::nothrow) AudioTrack(pSegment, element_start, element_size); + + if (pTrack == NULL) + return -1; // generic error + + const int status = info.Copy(pTrack->m_info); + + if (status) { + delete pTrack; + return status; + } + + pTrack->m_rate = rate; + pTrack->m_channels = channels; + pTrack->m_bitDepth = bit_depth; + + pResult = pTrack; + return 0; // success +} + +double AudioTrack::GetSamplingRate() const { return m_rate; } + +long long AudioTrack::GetChannels() const { return m_channels; } + +long long AudioTrack::GetBitDepth() const { return m_bitDepth; } + +Tracks::Tracks(Segment* pSegment, long long start, long long size_, + long long element_start, long long element_size) + : m_pSegment(pSegment), + m_start(start), + m_size(size_), + m_element_start(element_start), + m_element_size(element_size), + m_trackEntries(NULL), + m_trackEntriesEnd(NULL) {} + +long Tracks::Parse() { + assert(m_trackEntries == NULL); + assert(m_trackEntriesEnd == NULL); + + const long long stop = m_start + m_size; + IMkvReader* const pReader = m_pSegment->m_pReader; + + long long count = 0; + long long pos = m_start; + + while (pos < stop) { + long long id, size; + + const long status = ParseElementHeader(pReader, pos, stop, id, size); + + if (status < 0) // error + return status; + + if (size == 0) // weird + continue; + + if (id == libwebm::kMkvTrackEntry) { + ++count; + if (count > INT_MAX) + return E_PARSE_FAILED; + } + + pos += size; // consume payload + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + + if (count <= 0) + return 0; // success + + m_trackEntries = new (std::nothrow) Track*[static_cast(count)]; + + if (m_trackEntries == NULL) + return -1; + + m_trackEntriesEnd = m_trackEntries; + + pos = m_start; + + while (pos < stop) { + const long long element_start = pos; + + long long id, payload_size; + + const long status = + ParseElementHeader(pReader, pos, stop, id, payload_size); + + if (status < 0) // error + return status; + + if (payload_size == 0) // weird + continue; + + const long long payload_stop = pos + payload_size; + assert(payload_stop <= stop); // checked in ParseElement + + const long long element_size = payload_stop - element_start; + + if (id == libwebm::kMkvTrackEntry) { + Track*& pTrack = *m_trackEntriesEnd; + pTrack = NULL; + + const long status = ParseTrackEntry(pos, payload_size, element_start, + element_size, pTrack); + if (status) + return status; + + if (pTrack) + ++m_trackEntriesEnd; + } + + pos = payload_stop; + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + + return 0; // success +} + +unsigned long Tracks::GetTracksCount() const { + const ptrdiff_t result = m_trackEntriesEnd - m_trackEntries; + assert(result >= 0); + + return static_cast(result); +} + +long Tracks::ParseTrackEntry(long long track_start, long long track_size, + long long element_start, long long element_size, + Track*& pResult) const { + if (pResult) + return -1; + + IMkvReader* const pReader = m_pSegment->m_pReader; + + long long pos = track_start; + const long long track_stop = track_start + track_size; + + Track::Info info; + + info.type = 0; + info.number = 0; + info.uid = 0; + info.defaultDuration = 0; + + Track::Settings v; + v.start = -1; + v.size = -1; + + Track::Settings a; + a.start = -1; + a.size = -1; + + Track::Settings e; // content_encodings_settings; + e.start = -1; + e.size = -1; + + long long lacing = 1; // default is true + + while (pos < track_stop) { + long long id, size; + + const long status = ParseElementHeader(pReader, pos, track_stop, id, size); + + if (status < 0) // error + return status; + + if (size < 0) + return E_FILE_FORMAT_INVALID; + + const long long start = pos; + + if (id == libwebm::kMkvVideo) { + v.start = start; + v.size = size; + } else if (id == libwebm::kMkvAudio) { + a.start = start; + a.size = size; + } else if (id == libwebm::kMkvContentEncodings) { + e.start = start; + e.size = size; + } else if (id == libwebm::kMkvTrackUID) { + if (size > 8) + return E_FILE_FORMAT_INVALID; + + info.uid = 0; + + long long pos_ = start; + const long long pos_end = start + size; + + while (pos_ != pos_end) { + unsigned char b; + + const int status = pReader->Read(pos_, 1, &b); + + if (status) + return status; + + info.uid <<= 8; + info.uid |= b; + + ++pos_; + } + } else if (id == libwebm::kMkvTrackNumber) { + const long long num = UnserializeUInt(pReader, pos, size); + + if ((num <= 0) || (num > 127)) + return E_FILE_FORMAT_INVALID; + + info.number = static_cast(num); + } else if (id == libwebm::kMkvTrackType) { + const long long type = UnserializeUInt(pReader, pos, size); + + if ((type <= 0) || (type > 254)) + return E_FILE_FORMAT_INVALID; + + info.type = static_cast(type); + } else if (id == libwebm::kMkvName) { + const long status = + UnserializeString(pReader, pos, size, info.nameAsUTF8); + + if (status) + return status; + } else if (id == libwebm::kMkvLanguage) { + const long status = UnserializeString(pReader, pos, size, info.language); + + if (status) + return status; + } else if (id == libwebm::kMkvDefaultDuration) { + const long long duration = UnserializeUInt(pReader, pos, size); + + if (duration < 0) + return E_FILE_FORMAT_INVALID; + + info.defaultDuration = static_cast(duration); + } else if (id == libwebm::kMkvCodecID) { + const long status = UnserializeString(pReader, pos, size, info.codecId); + + if (status) + return status; + } else if (id == libwebm::kMkvFlagLacing) { + lacing = UnserializeUInt(pReader, pos, size); + + if ((lacing < 0) || (lacing > 1)) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvCodecPrivate) { + delete[] info.codecPrivate; + info.codecPrivate = NULL; + info.codecPrivateSize = 0; + + const size_t buflen = static_cast(size); + + if (buflen) { + unsigned char* buf = SafeArrayAlloc(1, buflen); + + if (buf == NULL) + return -1; + + const int status = pReader->Read(pos, static_cast(buflen), buf); + + if (status) { + delete[] buf; + return status; + } + + info.codecPrivate = buf; + info.codecPrivateSize = buflen; + } + } else if (id == libwebm::kMkvCodecName) { + const long status = + UnserializeString(pReader, pos, size, info.codecNameAsUTF8); + + if (status) + return status; + } else if (id == libwebm::kMkvCodecDelay) { + info.codecDelay = UnserializeUInt(pReader, pos, size); + } else if (id == libwebm::kMkvSeekPreRoll) { + info.seekPreRoll = UnserializeUInt(pReader, pos, size); + } + + pos += size; // consume payload + if (pos > track_stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != track_stop) + return E_FILE_FORMAT_INVALID; + + if (info.number <= 0) // not specified + return E_FILE_FORMAT_INVALID; + + if (GetTrackByNumber(info.number)) + return E_FILE_FORMAT_INVALID; + + if (info.type <= 0) // not specified + return E_FILE_FORMAT_INVALID; + + info.lacing = (lacing > 0) ? true : false; + + if (info.type == Track::kVideo) { + if (v.start < 0) + return E_FILE_FORMAT_INVALID; + + if (a.start >= 0) + return E_FILE_FORMAT_INVALID; + + info.settings = v; + + VideoTrack* pTrack = NULL; + + const long status = VideoTrack::Parse(m_pSegment, info, element_start, + element_size, pTrack); + + if (status) + return status; + + pResult = pTrack; + assert(pResult); + + if (e.start >= 0) + pResult->ParseContentEncodingsEntry(e.start, e.size); + } else if (info.type == Track::kAudio) { + if (a.start < 0) + return E_FILE_FORMAT_INVALID; + + if (v.start >= 0) + return E_FILE_FORMAT_INVALID; + + info.settings = a; + + AudioTrack* pTrack = NULL; + + const long status = AudioTrack::Parse(m_pSegment, info, element_start, + element_size, pTrack); + + if (status) + return status; + + pResult = pTrack; + assert(pResult); + + if (e.start >= 0) + pResult->ParseContentEncodingsEntry(e.start, e.size); + } else { + // neither video nor audio - probably metadata or subtitles + + if (a.start >= 0) + return E_FILE_FORMAT_INVALID; + + if (v.start >= 0) + return E_FILE_FORMAT_INVALID; + + if (info.type == Track::kMetadata && e.start >= 0) + return E_FILE_FORMAT_INVALID; + + info.settings.start = -1; + info.settings.size = 0; + + Track* pTrack = NULL; + + const long status = + Track::Create(m_pSegment, info, element_start, element_size, pTrack); + + if (status) + return status; + + pResult = pTrack; + assert(pResult); + } + + return 0; // success +} + +Tracks::~Tracks() { + Track** i = m_trackEntries; + Track** const j = m_trackEntriesEnd; + + while (i != j) { + Track* const pTrack = *i++; + delete pTrack; + } + + delete[] m_trackEntries; +} + +const Track* Tracks::GetTrackByNumber(long tn) const { + if (tn < 0) + return NULL; + + Track** i = m_trackEntries; + Track** const j = m_trackEntriesEnd; + + while (i != j) { + Track* const pTrack = *i++; + + if (pTrack == NULL) + continue; + + if (tn == pTrack->GetNumber()) + return pTrack; + } + + return NULL; // not found +} + +const Track* Tracks::GetTrackByIndex(unsigned long idx) const { + const ptrdiff_t count = m_trackEntriesEnd - m_trackEntries; + + if (idx >= static_cast(count)) + return NULL; + + return m_trackEntries[idx]; +} + +long Cluster::Load(long long& pos, long& len) const { + if (m_pSegment == NULL) + return E_PARSE_FAILED; + + if (m_timecode >= 0) // at least partially loaded + return 0; + + if (m_pos != m_element_start || m_element_size >= 0) + return E_PARSE_FAILED; + + IMkvReader* const pReader = m_pSegment->m_pReader; + long long total, avail; + const int status = pReader->Length(&total, &avail); + + if (status < 0) // error + return status; + + if (total >= 0 && (avail > total || m_pos > total)) + return E_FILE_FORMAT_INVALID; + + pos = m_pos; + + long long cluster_size = -1; + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + long long result = GetUIntLength(pReader, pos, len); + + if (result < 0) // error or underflow + return static_cast(result); + + if (result > 0) + return E_BUFFER_NOT_FULL; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long id_ = ReadID(pReader, pos, len); + + if (id_ < 0) // error + return static_cast(id_); + + if (id_ != libwebm::kMkvCluster) + return E_FILE_FORMAT_INVALID; + + pos += len; // consume id + + // read cluster size + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + result = GetUIntLength(pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) + return E_BUFFER_NOT_FULL; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long size = ReadUInt(pReader, pos, len); + + if (size < 0) // error + return static_cast(cluster_size); + + if (size == 0) + return E_FILE_FORMAT_INVALID; + + pos += len; // consume length of size of element + + const long long unknown_size = (1LL << (7 * len)) - 1; + + if (size != unknown_size) + cluster_size = size; + + // pos points to start of payload + long long timecode = -1; + long long new_pos = -1; + bool bBlock = false; + + long long cluster_stop = (cluster_size < 0) ? -1 : pos + cluster_size; + + for (;;) { + if ((cluster_stop >= 0) && (pos >= cluster_stop)) + break; + + // Parse ID + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + long long result = GetUIntLength(pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) + return E_BUFFER_NOT_FULL; + + if ((cluster_stop >= 0) && ((pos + len) > cluster_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long id = ReadID(pReader, pos, len); + + if (id < 0) // error + return static_cast(id); + + if (id == 0) + return E_FILE_FORMAT_INVALID; + + // This is the distinguished set of ID's we use to determine + // that we have exhausted the sub-element's inside the cluster + // whose ID we parsed earlier. + + if (id == libwebm::kMkvCluster) + break; + + if (id == libwebm::kMkvCues) + break; + + pos += len; // consume ID field + + // Parse Size + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + result = GetUIntLength(pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) + return E_BUFFER_NOT_FULL; + + if ((cluster_stop >= 0) && ((pos + len) > cluster_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long size = ReadUInt(pReader, pos, len); + + if (size < 0) // error + return static_cast(size); + + const long long unknown_size = (1LL << (7 * len)) - 1; + + if (size == unknown_size) + return E_FILE_FORMAT_INVALID; + + pos += len; // consume size field + + if ((cluster_stop >= 0) && (pos > cluster_stop)) + return E_FILE_FORMAT_INVALID; + + // pos now points to start of payload + + if (size == 0) + continue; + + if ((cluster_stop >= 0) && ((pos + size) > cluster_stop)) + return E_FILE_FORMAT_INVALID; + + if (id == libwebm::kMkvTimecode) { + len = static_cast(size); + + if ((pos + size) > avail) + return E_BUFFER_NOT_FULL; + + timecode = UnserializeUInt(pReader, pos, size); + + if (timecode < 0) // error (or underflow) + return static_cast(timecode); + + new_pos = pos + size; + + if (bBlock) + break; + } else if (id == libwebm::kMkvBlockGroup) { + bBlock = true; + break; + } else if (id == libwebm::kMkvSimpleBlock) { + bBlock = true; + break; + } + + pos += size; // consume payload + if (cluster_stop >= 0 && pos > cluster_stop) + return E_FILE_FORMAT_INVALID; + } + + if (cluster_stop >= 0 && pos > cluster_stop) + return E_FILE_FORMAT_INVALID; + + if (timecode < 0) // no timecode found + return E_FILE_FORMAT_INVALID; + + if (!bBlock) + return E_FILE_FORMAT_INVALID; + + m_pos = new_pos; // designates position just beyond timecode payload + m_timecode = timecode; // m_timecode >= 0 means we're partially loaded + + if (cluster_size >= 0) + m_element_size = cluster_stop - m_element_start; + + return 0; +} + +long Cluster::Parse(long long& pos, long& len) const { + long status = Load(pos, len); + + if (status < 0) + return status; + + if (m_pos < m_element_start || m_timecode < 0) + return E_PARSE_FAILED; + + const long long cluster_stop = + (m_element_size < 0) ? -1 : m_element_start + m_element_size; + + if ((cluster_stop >= 0) && (m_pos >= cluster_stop)) + return 1; // nothing else to do + + IMkvReader* const pReader = m_pSegment->m_pReader; + + long long total, avail; + + status = pReader->Length(&total, &avail); + + if (status < 0) // error + return status; + + if (total >= 0 && avail > total) + return E_FILE_FORMAT_INVALID; + + pos = m_pos; + + for (;;) { + if ((cluster_stop >= 0) && (pos >= cluster_stop)) + break; + + if ((total >= 0) && (pos >= total)) { + if (m_element_size < 0) + m_element_size = pos - m_element_start; + + break; + } + + // Parse ID + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + long long result = GetUIntLength(pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) + return E_BUFFER_NOT_FULL; + + if ((cluster_stop >= 0) && ((pos + len) > cluster_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long id = ReadID(pReader, pos, len); + + if (id < 0) + return E_FILE_FORMAT_INVALID; + + // This is the distinguished set of ID's we use to determine + // that we have exhausted the sub-element's inside the cluster + // whose ID we parsed earlier. + + if ((id == libwebm::kMkvCluster) || (id == libwebm::kMkvCues)) { + if (m_element_size < 0) + m_element_size = pos - m_element_start; + + break; + } + + pos += len; // consume ID field + + // Parse Size + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + result = GetUIntLength(pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) + return E_BUFFER_NOT_FULL; + + if ((cluster_stop >= 0) && ((pos + len) > cluster_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long size = ReadUInt(pReader, pos, len); + + if (size < 0) // error + return static_cast(size); + + const long long unknown_size = (1LL << (7 * len)) - 1; + + if (size == unknown_size) + return E_FILE_FORMAT_INVALID; + + pos += len; // consume size field + + if ((cluster_stop >= 0) && (pos > cluster_stop)) + return E_FILE_FORMAT_INVALID; + + // pos now points to start of payload + + if (size == 0) + continue; + + // const long long block_start = pos; + const long long block_stop = pos + size; + + if (cluster_stop >= 0) { + if (block_stop > cluster_stop) { + if (id == libwebm::kMkvBlockGroup || id == libwebm::kMkvSimpleBlock) { + return E_FILE_FORMAT_INVALID; + } + + pos = cluster_stop; + break; + } + } else if ((total >= 0) && (block_stop > total)) { + m_element_size = total - m_element_start; + pos = total; + break; + } else if (block_stop > avail) { + len = static_cast(size); + return E_BUFFER_NOT_FULL; + } + + Cluster* const this_ = const_cast(this); + + if (id == libwebm::kMkvBlockGroup) + return this_->ParseBlockGroup(size, pos, len); + + if (id == libwebm::kMkvSimpleBlock) + return this_->ParseSimpleBlock(size, pos, len); + + pos += size; // consume payload + if (cluster_stop >= 0 && pos > cluster_stop) + return E_FILE_FORMAT_INVALID; + } + + if (m_element_size < 1) + return E_FILE_FORMAT_INVALID; + + m_pos = pos; + if (cluster_stop >= 0 && m_pos > cluster_stop) + return E_FILE_FORMAT_INVALID; + + if (m_entries_count > 0) { + const long idx = m_entries_count - 1; + + const BlockEntry* const pLast = m_entries[idx]; + if (pLast == NULL) + return E_PARSE_FAILED; + + const Block* const pBlock = pLast->GetBlock(); + if (pBlock == NULL) + return E_PARSE_FAILED; + + const long long start = pBlock->m_start; + + if ((total >= 0) && (start > total)) + return E_PARSE_FAILED; // defend against trucated stream + + const long long size = pBlock->m_size; + + const long long stop = start + size; + if (cluster_stop >= 0 && stop > cluster_stop) + return E_FILE_FORMAT_INVALID; + + if ((total >= 0) && (stop > total)) + return E_PARSE_FAILED; // defend against trucated stream + } + + return 1; // no more entries +} + +long Cluster::ParseSimpleBlock(long long block_size, long long& pos, + long& len) { + const long long block_start = pos; + const long long block_stop = pos + block_size; + + IMkvReader* const pReader = m_pSegment->m_pReader; + + long long total, avail; + + long status = pReader->Length(&total, &avail); + + if (status < 0) // error + return status; + + assert((total < 0) || (avail <= total)); + + // parse track number + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + long long result = GetUIntLength(pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // weird + return E_BUFFER_NOT_FULL; + + if ((pos + len) > block_stop) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long track = ReadUInt(pReader, pos, len); + + if (track < 0) // error + return static_cast(track); + + if (track == 0) + return E_FILE_FORMAT_INVALID; + + pos += len; // consume track number + + if ((pos + 2) > block_stop) + return E_FILE_FORMAT_INVALID; + + if ((pos + 2) > avail) { + len = 2; + return E_BUFFER_NOT_FULL; + } + + pos += 2; // consume timecode + + if ((pos + 1) > block_stop) + return E_FILE_FORMAT_INVALID; + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + unsigned char flags; + + status = pReader->Read(pos, 1, &flags); + + if (status < 0) { // error or underflow + len = 1; + return status; + } + + ++pos; // consume flags byte + assert(pos <= avail); + + if (pos >= block_stop) + return E_FILE_FORMAT_INVALID; + + const int lacing = int(flags & 0x06) >> 1; + + if ((lacing != 0) && (block_stop > avail)) { + len = static_cast(block_stop - pos); + return E_BUFFER_NOT_FULL; + } + + status = CreateBlock(libwebm::kMkvSimpleBlock, block_start, block_size, + 0); // DiscardPadding + + if (status != 0) + return status; + + m_pos = block_stop; + + return 0; // success +} + +long Cluster::ParseBlockGroup(long long payload_size, long long& pos, + long& len) { + const long long payload_start = pos; + const long long payload_stop = pos + payload_size; + + IMkvReader* const pReader = m_pSegment->m_pReader; + + long long total, avail; + + long status = pReader->Length(&total, &avail); + + if (status < 0) // error + return status; + + assert((total < 0) || (avail <= total)); + + if ((total >= 0) && (payload_stop > total)) + return E_FILE_FORMAT_INVALID; + + if (payload_stop > avail) { + len = static_cast(payload_size); + return E_BUFFER_NOT_FULL; + } + + long long discard_padding = 0; + + while (pos < payload_stop) { + // parse sub-block element ID + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + long long result = GetUIntLength(pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // weird + return E_BUFFER_NOT_FULL; + + if ((pos + len) > payload_stop) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long id = ReadID(pReader, pos, len); + + if (id < 0) // error + return static_cast(id); + + if (id == 0) // not a valid ID + return E_FILE_FORMAT_INVALID; + + pos += len; // consume ID field + + // Parse Size + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + result = GetUIntLength(pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // weird + return E_BUFFER_NOT_FULL; + + if ((pos + len) > payload_stop) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long size = ReadUInt(pReader, pos, len); + + if (size < 0) // error + return static_cast(size); + + pos += len; // consume size field + + // pos now points to start of sub-block group payload + + if (pos > payload_stop) + return E_FILE_FORMAT_INVALID; + + if (size == 0) // weird + continue; + + const long long unknown_size = (1LL << (7 * len)) - 1; + + if (size == unknown_size) + return E_FILE_FORMAT_INVALID; + + if (id == libwebm::kMkvDiscardPadding) { + status = UnserializeInt(pReader, pos, size, discard_padding); + + if (status < 0) // error + return status; + } + + if (id != libwebm::kMkvBlock) { + pos += size; // consume sub-part of block group + + if (pos > payload_stop) + return E_FILE_FORMAT_INVALID; + + continue; + } + + const long long block_stop = pos + size; + + if (block_stop > payload_stop) + return E_FILE_FORMAT_INVALID; + + // parse track number + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + result = GetUIntLength(pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // weird + return E_BUFFER_NOT_FULL; + + if ((pos + len) > block_stop) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long track = ReadUInt(pReader, pos, len); + + if (track < 0) // error + return static_cast(track); + + if (track == 0) + return E_FILE_FORMAT_INVALID; + + pos += len; // consume track number + + if ((pos + 2) > block_stop) + return E_FILE_FORMAT_INVALID; + + if ((pos + 2) > avail) { + len = 2; + return E_BUFFER_NOT_FULL; + } + + pos += 2; // consume timecode + + if ((pos + 1) > block_stop) + return E_FILE_FORMAT_INVALID; + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + unsigned char flags; + + status = pReader->Read(pos, 1, &flags); + + if (status < 0) { // error or underflow + len = 1; + return status; + } + + ++pos; // consume flags byte + assert(pos <= avail); + + if (pos >= block_stop) + return E_FILE_FORMAT_INVALID; + + const int lacing = int(flags & 0x06) >> 1; + + if ((lacing != 0) && (block_stop > avail)) { + len = static_cast(block_stop - pos); + return E_BUFFER_NOT_FULL; + } + + pos = block_stop; // consume block-part of block group + if (pos > payload_stop) + return E_FILE_FORMAT_INVALID; + } + + if (pos != payload_stop) + return E_FILE_FORMAT_INVALID; + + status = CreateBlock(libwebm::kMkvBlockGroup, payload_start, payload_size, + discard_padding); + if (status != 0) + return status; + + m_pos = payload_stop; + + return 0; // success +} + +long Cluster::GetEntry(long index, const mkvparser::BlockEntry*& pEntry) const { + assert(m_pos >= m_element_start); + + pEntry = NULL; + + if (index < 0) + return -1; // generic error + + if (m_entries_count < 0) + return E_BUFFER_NOT_FULL; + + assert(m_entries); + assert(m_entries_size > 0); + assert(m_entries_count <= m_entries_size); + + if (index < m_entries_count) { + pEntry = m_entries[index]; + assert(pEntry); + + return 1; // found entry + } + + if (m_element_size < 0) // we don't know cluster end yet + return E_BUFFER_NOT_FULL; // underflow + + const long long element_stop = m_element_start + m_element_size; + + if (m_pos >= element_stop) + return 0; // nothing left to parse + + return E_BUFFER_NOT_FULL; // underflow, since more remains to be parsed +} + +Cluster* Cluster::Create(Segment* pSegment, long idx, long long off) { + if (!pSegment || off < 0) + return NULL; + + const long long element_start = pSegment->m_start + off; + + Cluster* const pCluster = + new (std::nothrow) Cluster(pSegment, idx, element_start); + + return pCluster; +} + +Cluster::Cluster() + : m_pSegment(NULL), + m_element_start(0), + m_index(0), + m_pos(0), + m_element_size(0), + m_timecode(0), + m_entries(NULL), + m_entries_size(0), + m_entries_count(0) // means "no entries" +{} + +Cluster::Cluster(Segment* pSegment, long idx, long long element_start + /* long long element_size */) + : m_pSegment(pSegment), + m_element_start(element_start), + m_index(idx), + m_pos(element_start), + m_element_size(-1 /* element_size */), + m_timecode(-1), + m_entries(NULL), + m_entries_size(0), + m_entries_count(-1) // means "has not been parsed yet" +{} + +Cluster::~Cluster() { + if (m_entries_count <= 0) { + delete[] m_entries; + return; + } + + BlockEntry** i = m_entries; + BlockEntry** const j = m_entries + m_entries_count; + + while (i != j) { + BlockEntry* p = *i++; + assert(p); + + delete p; + } + + delete[] m_entries; +} + +bool Cluster::EOS() const { return (m_pSegment == NULL); } + +long Cluster::GetIndex() const { return m_index; } + +long long Cluster::GetPosition() const { + const long long pos = m_element_start - m_pSegment->m_start; + assert(pos >= 0); + + return pos; +} + +long long Cluster::GetElementSize() const { return m_element_size; } + +long Cluster::HasBlockEntries( + const Segment* pSegment, + long long off, // relative to start of segment payload + long long& pos, long& len) { + assert(pSegment); + assert(off >= 0); // relative to segment + + IMkvReader* const pReader = pSegment->m_pReader; + + long long total, avail; + + long status = pReader->Length(&total, &avail); + + if (status < 0) // error + return status; + + assert((total < 0) || (avail <= total)); + + pos = pSegment->m_start + off; // absolute + + if ((total >= 0) && (pos >= total)) + return 0; // we don't even have a complete cluster + + const long long segment_stop = + (pSegment->m_size < 0) ? -1 : pSegment->m_start + pSegment->m_size; + + long long cluster_stop = -1; // interpreted later to mean "unknown size" + + { + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + long long result = GetUIntLength(pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // need more data + return E_BUFFER_NOT_FULL; + + if ((segment_stop >= 0) && ((pos + len) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((total >= 0) && ((pos + len) > total)) + return 0; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long id = ReadID(pReader, pos, len); + + if (id < 0) // error + return static_cast(id); + + if (id != libwebm::kMkvCluster) + return E_PARSE_FAILED; + + pos += len; // consume Cluster ID field + + // read size field + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + result = GetUIntLength(pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // weird + return E_BUFFER_NOT_FULL; + + if ((segment_stop >= 0) && ((pos + len) > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((total >= 0) && ((pos + len) > total)) + return 0; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long size = ReadUInt(pReader, pos, len); + + if (size < 0) // error + return static_cast(size); + + if (size == 0) + return 0; // cluster does not have entries + + pos += len; // consume size field + + // pos now points to start of payload + + const long long unknown_size = (1LL << (7 * len)) - 1; + + if (size != unknown_size) { + cluster_stop = pos + size; + assert(cluster_stop >= 0); + + if ((segment_stop >= 0) && (cluster_stop > segment_stop)) + return E_FILE_FORMAT_INVALID; + + if ((total >= 0) && (cluster_stop > total)) + // return E_FILE_FORMAT_INVALID; //too conservative + return 0; // cluster does not have any entries + } + } + + for (;;) { + if ((cluster_stop >= 0) && (pos >= cluster_stop)) + return 0; // no entries detected + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + long long result = GetUIntLength(pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // need more data + return E_BUFFER_NOT_FULL; + + if ((cluster_stop >= 0) && ((pos + len) > cluster_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long id = ReadID(pReader, pos, len); + + if (id < 0) // error + return static_cast(id); + + // This is the distinguished set of ID's we use to determine + // that we have exhausted the sub-element's inside the cluster + // whose ID we parsed earlier. + + if (id == libwebm::kMkvCluster) + return 0; // no entries found + + if (id == libwebm::kMkvCues) + return 0; // no entries found + + pos += len; // consume id field + + if ((cluster_stop >= 0) && (pos >= cluster_stop)) + return E_FILE_FORMAT_INVALID; + + // read size field + + if ((pos + 1) > avail) { + len = 1; + return E_BUFFER_NOT_FULL; + } + + result = GetUIntLength(pReader, pos, len); + + if (result < 0) // error + return static_cast(result); + + if (result > 0) // underflow + return E_BUFFER_NOT_FULL; + + if ((cluster_stop >= 0) && ((pos + len) > cluster_stop)) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > avail) + return E_BUFFER_NOT_FULL; + + const long long size = ReadUInt(pReader, pos, len); + + if (size < 0) // error + return static_cast(size); + + pos += len; // consume size field + + // pos now points to start of payload + + if ((cluster_stop >= 0) && (pos > cluster_stop)) + return E_FILE_FORMAT_INVALID; + + if (size == 0) // weird + continue; + + const long long unknown_size = (1LL << (7 * len)) - 1; + + if (size == unknown_size) + return E_FILE_FORMAT_INVALID; // not supported inside cluster + + if ((cluster_stop >= 0) && ((pos + size) > cluster_stop)) + return E_FILE_FORMAT_INVALID; + + if (id == libwebm::kMkvBlockGroup) + return 1; // have at least one entry + + if (id == libwebm::kMkvSimpleBlock) + return 1; // have at least one entry + + pos += size; // consume payload + if (cluster_stop >= 0 && pos > cluster_stop) + return E_FILE_FORMAT_INVALID; + } +} + +long long Cluster::GetTimeCode() const { + long long pos; + long len; + + const long status = Load(pos, len); + + if (status < 0) // error + return status; + + return m_timecode; +} + +long long Cluster::GetTime() const { + const long long tc = GetTimeCode(); + + if (tc < 0) + return tc; + + const SegmentInfo* const pInfo = m_pSegment->GetInfo(); + assert(pInfo); + + const long long scale = pInfo->GetTimeCodeScale(); + assert(scale >= 1); + + const long long t = m_timecode * scale; + + return t; +} + +long long Cluster::GetFirstTime() const { + const BlockEntry* pEntry; + + const long status = GetFirst(pEntry); + + if (status < 0) // error + return status; + + if (pEntry == NULL) // empty cluster + return GetTime(); + + const Block* const pBlock = pEntry->GetBlock(); + assert(pBlock); + + return pBlock->GetTime(this); +} + +long long Cluster::GetLastTime() const { + const BlockEntry* pEntry; + + const long status = GetLast(pEntry); + + if (status < 0) // error + return status; + + if (pEntry == NULL) // empty cluster + return GetTime(); + + const Block* const pBlock = pEntry->GetBlock(); + assert(pBlock); + + return pBlock->GetTime(this); +} + +long Cluster::CreateBlock(long long id, + long long pos, // absolute pos of payload + long long size, long long discard_padding) { + if (id != libwebm::kMkvBlockGroup && id != libwebm::kMkvSimpleBlock) + return E_PARSE_FAILED; + + if (m_entries_count < 0) { // haven't parsed anything yet + assert(m_entries == NULL); + assert(m_entries_size == 0); + + m_entries_size = 1024; + m_entries = new (std::nothrow) BlockEntry*[m_entries_size]; + if (m_entries == NULL) + return -1; + + m_entries_count = 0; + } else { + assert(m_entries); + assert(m_entries_size > 0); + assert(m_entries_count <= m_entries_size); + + if (m_entries_count >= m_entries_size) { + const long entries_size = 2 * m_entries_size; + + BlockEntry** const entries = new (std::nothrow) BlockEntry*[entries_size]; + if (entries == NULL) + return -1; + + BlockEntry** src = m_entries; + BlockEntry** const src_end = src + m_entries_count; + + BlockEntry** dst = entries; + + while (src != src_end) + *dst++ = *src++; + + delete[] m_entries; + + m_entries = entries; + m_entries_size = entries_size; + } + } + + if (id == libwebm::kMkvBlockGroup) + return CreateBlockGroup(pos, size, discard_padding); + else + return CreateSimpleBlock(pos, size); +} + +long Cluster::CreateBlockGroup(long long start_offset, long long size, + long long discard_padding) { + assert(m_entries); + assert(m_entries_size > 0); + assert(m_entries_count >= 0); + assert(m_entries_count < m_entries_size); + + IMkvReader* const pReader = m_pSegment->m_pReader; + + long long pos = start_offset; + const long long stop = start_offset + size; + + // For WebM files, there is a bias towards previous reference times + //(in order to support alt-ref frames, which refer back to the previous + // keyframe). Normally a 0 value is not possible, but here we tenatively + // allow 0 as the value of a reference frame, with the interpretation + // that this is a "previous" reference time. + + long long prev = 1; // nonce + long long next = 0; // nonce + long long duration = -1; // really, this is unsigned + + long long bpos = -1; + long long bsize = -1; + + while (pos < stop) { + long len; + const long long id = ReadID(pReader, pos, len); + if (id < 0 || (pos + len) > stop) + return E_FILE_FORMAT_INVALID; + + pos += len; // consume ID + + const long long size = ReadUInt(pReader, pos, len); + assert(size >= 0); // TODO + assert((pos + len) <= stop); + + pos += len; // consume size + + if (id == libwebm::kMkvBlock) { + if (bpos < 0) { // Block ID + bpos = pos; + bsize = size; + } + } else if (id == libwebm::kMkvBlockDuration) { + if (size > 8) + return E_FILE_FORMAT_INVALID; + + duration = UnserializeUInt(pReader, pos, size); + + if (duration < 0) + return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvReferenceBlock) { + if (size > 8 || size <= 0) + return E_FILE_FORMAT_INVALID; + const long size_ = static_cast(size); + + long long time; + + long status = UnserializeInt(pReader, pos, size_, time); + assert(status == 0); + if (status != 0) + return -1; + + if (time <= 0) // see note above + prev = time; + else + next = time; + } + + pos += size; // consume payload + if (pos > stop) + return E_FILE_FORMAT_INVALID; + } + if (bpos < 0) + return E_FILE_FORMAT_INVALID; + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + assert(bsize >= 0); + + const long idx = m_entries_count; + + BlockEntry** const ppEntry = m_entries + idx; + BlockEntry*& pEntry = *ppEntry; + + pEntry = new (std::nothrow) + BlockGroup(this, idx, bpos, bsize, prev, next, duration, discard_padding); + + if (pEntry == NULL) + return -1; // generic error + + BlockGroup* const p = static_cast(pEntry); + + const long status = p->Parse(); + + if (status == 0) { // success + ++m_entries_count; + return 0; + } + + delete pEntry; + pEntry = 0; + + return status; +} + +long Cluster::CreateSimpleBlock(long long st, long long sz) { + assert(m_entries); + assert(m_entries_size > 0); + assert(m_entries_count >= 0); + assert(m_entries_count < m_entries_size); + + const long idx = m_entries_count; + + BlockEntry** const ppEntry = m_entries + idx; + BlockEntry*& pEntry = *ppEntry; + + pEntry = new (std::nothrow) SimpleBlock(this, idx, st, sz); + + if (pEntry == NULL) + return -1; // generic error + + SimpleBlock* const p = static_cast(pEntry); + + const long status = p->Parse(); + + if (status == 0) { + ++m_entries_count; + return 0; + } + + delete pEntry; + pEntry = 0; + + return status; +} + +long Cluster::GetFirst(const BlockEntry*& pFirst) const { + if (m_entries_count <= 0) { + long long pos; + long len; + + const long status = Parse(pos, len); + + if (status < 0) { // error + pFirst = NULL; + return status; + } + + if (m_entries_count <= 0) { // empty cluster + pFirst = NULL; + return 0; + } + } + + assert(m_entries); + + pFirst = m_entries[0]; + assert(pFirst); + + return 0; // success +} + +long Cluster::GetLast(const BlockEntry*& pLast) const { + for (;;) { + long long pos; + long len; + + const long status = Parse(pos, len); + + if (status < 0) { // error + pLast = NULL; + return status; + } + + if (status > 0) // no new block + break; + } + + if (m_entries_count <= 0) { + pLast = NULL; + return 0; + } + + assert(m_entries); + + const long idx = m_entries_count - 1; + + pLast = m_entries[idx]; + assert(pLast); + + return 0; +} + +long Cluster::GetNext(const BlockEntry* pCurr, const BlockEntry*& pNext) const { + assert(pCurr); + assert(m_entries); + assert(m_entries_count > 0); + + size_t idx = pCurr->GetIndex(); + assert(idx < size_t(m_entries_count)); + assert(m_entries[idx] == pCurr); + + ++idx; + + if (idx >= size_t(m_entries_count)) { + long long pos; + long len; + + const long status = Parse(pos, len); + + if (status < 0) { // error + pNext = NULL; + return status; + } + + if (status > 0) { + pNext = NULL; + return 0; + } + + assert(m_entries); + assert(m_entries_count > 0); + assert(idx < size_t(m_entries_count)); + } + + pNext = m_entries[idx]; + assert(pNext); + + return 0; +} + +long Cluster::GetEntryCount() const { return m_entries_count; } + +const BlockEntry* Cluster::GetEntry(const Track* pTrack, + long long time_ns) const { + assert(pTrack); + + if (m_pSegment == NULL) // this is the special EOS cluster + return pTrack->GetEOS(); + + const BlockEntry* pResult = pTrack->GetEOS(); + + long index = 0; + + for (;;) { + if (index >= m_entries_count) { + long long pos; + long len; + + const long status = Parse(pos, len); + assert(status >= 0); + + if (status > 0) // completely parsed, and no more entries + return pResult; + + if (status < 0) // should never happen + return 0; + + assert(m_entries); + assert(index < m_entries_count); + } + + const BlockEntry* const pEntry = m_entries[index]; + assert(pEntry); + assert(!pEntry->EOS()); + + const Block* const pBlock = pEntry->GetBlock(); + assert(pBlock); + + if (pBlock->GetTrackNumber() != pTrack->GetNumber()) { + ++index; + continue; + } + + if (pTrack->VetEntry(pEntry)) { + if (time_ns < 0) // just want first candidate block + return pEntry; + + const long long ns = pBlock->GetTime(this); + + if (ns > time_ns) + return pResult; + + pResult = pEntry; // have a candidate + } else if (time_ns >= 0) { + const long long ns = pBlock->GetTime(this); + + if (ns > time_ns) + return pResult; + } + + ++index; + } +} + +const BlockEntry* Cluster::GetEntry(const CuePoint& cp, + const CuePoint::TrackPosition& tp) const { + assert(m_pSegment); + const long long tc = cp.GetTimeCode(); + + if (tp.m_block > 0) { + const long block = static_cast(tp.m_block); + const long index = block - 1; + + while (index >= m_entries_count) { + long long pos; + long len; + + const long status = Parse(pos, len); + + if (status < 0) // TODO: can this happen? + return NULL; + + if (status > 0) // nothing remains to be parsed + return NULL; + } + + const BlockEntry* const pEntry = m_entries[index]; + assert(pEntry); + assert(!pEntry->EOS()); + + const Block* const pBlock = pEntry->GetBlock(); + assert(pBlock); + + if ((pBlock->GetTrackNumber() == tp.m_track) && + (pBlock->GetTimeCode(this) == tc)) { + return pEntry; + } + } + + long index = 0; + + for (;;) { + if (index >= m_entries_count) { + long long pos; + long len; + + const long status = Parse(pos, len); + + if (status < 0) // TODO: can this happen? + return NULL; + + if (status > 0) // nothing remains to be parsed + return NULL; + + assert(m_entries); + assert(index < m_entries_count); + } + + const BlockEntry* const pEntry = m_entries[index]; + assert(pEntry); + assert(!pEntry->EOS()); + + const Block* const pBlock = pEntry->GetBlock(); + assert(pBlock); + + if (pBlock->GetTrackNumber() != tp.m_track) { + ++index; + continue; + } + + const long long tc_ = pBlock->GetTimeCode(this); + + if (tc_ < tc) { + ++index; + continue; + } + + if (tc_ > tc) + return NULL; + + const Tracks* const pTracks = m_pSegment->GetTracks(); + assert(pTracks); + + const long tn = static_cast(tp.m_track); + const Track* const pTrack = pTracks->GetTrackByNumber(tn); + + if (pTrack == NULL) + return NULL; + + const long long type = pTrack->GetType(); + + if (type == 2) // audio + return pEntry; + + if (type != 1) // not video + return NULL; + + if (!pBlock->IsKey()) + return NULL; + + return pEntry; + } +} + +BlockEntry::BlockEntry(Cluster* p, long idx) : m_pCluster(p), m_index(idx) {} +BlockEntry::~BlockEntry() {} +const Cluster* BlockEntry::GetCluster() const { return m_pCluster; } +long BlockEntry::GetIndex() const { return m_index; } + +SimpleBlock::SimpleBlock(Cluster* pCluster, long idx, long long start, + long long size) + : BlockEntry(pCluster, idx), m_block(start, size, 0) {} + +long SimpleBlock::Parse() { return m_block.Parse(m_pCluster); } +BlockEntry::Kind SimpleBlock::GetKind() const { return kBlockSimple; } +const Block* SimpleBlock::GetBlock() const { return &m_block; } + +BlockGroup::BlockGroup(Cluster* pCluster, long idx, long long block_start, + long long block_size, long long prev, long long next, + long long duration, long long discard_padding) + : BlockEntry(pCluster, idx), + m_block(block_start, block_size, discard_padding), + m_prev(prev), + m_next(next), + m_duration(duration) {} + +long BlockGroup::Parse() { + const long status = m_block.Parse(m_pCluster); + + if (status) + return status; + + m_block.SetKey((m_prev > 0) && (m_next <= 0)); + + return 0; +} + +BlockEntry::Kind BlockGroup::GetKind() const { return kBlockGroup; } +const Block* BlockGroup::GetBlock() const { return &m_block; } +long long BlockGroup::GetPrevTimeCode() const { return m_prev; } +long long BlockGroup::GetNextTimeCode() const { return m_next; } +long long BlockGroup::GetDurationTimeCode() const { return m_duration; } + +Block::Block(long long start, long long size_, long long discard_padding) + : m_start(start), + m_size(size_), + m_track(0), + m_timecode(-1), + m_flags(0), + m_frames(NULL), + m_frame_count(-1), + m_discard_padding(discard_padding) {} + +Block::~Block() { delete[] m_frames; } + +long Block::Parse(const Cluster* pCluster) { + if (pCluster == NULL) + return -1; + + if (pCluster->m_pSegment == NULL) + return -1; + + assert(m_start >= 0); + assert(m_size >= 0); + assert(m_track <= 0); + assert(m_frames == NULL); + assert(m_frame_count <= 0); + + long long pos = m_start; + const long long stop = m_start + m_size; + + long len; + + IMkvReader* const pReader = pCluster->m_pSegment->m_pReader; + + m_track = ReadUInt(pReader, pos, len); + + if (m_track <= 0) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > stop) + return E_FILE_FORMAT_INVALID; + + pos += len; // consume track number + + if ((stop - pos) < 2) + return E_FILE_FORMAT_INVALID; + + long status; + long long value; + + status = UnserializeInt(pReader, pos, 2, value); + + if (status) + return E_FILE_FORMAT_INVALID; + + if (value < SHRT_MIN) + return E_FILE_FORMAT_INVALID; + + if (value > SHRT_MAX) + return E_FILE_FORMAT_INVALID; + + m_timecode = static_cast(value); + + pos += 2; + + if ((stop - pos) <= 0) + return E_FILE_FORMAT_INVALID; + + status = pReader->Read(pos, 1, &m_flags); + + if (status) + return E_FILE_FORMAT_INVALID; + + const int lacing = int(m_flags & 0x06) >> 1; + + ++pos; // consume flags byte + + if (lacing == 0) { // no lacing + if (pos > stop) + return E_FILE_FORMAT_INVALID; + + m_frame_count = 1; + m_frames = new (std::nothrow) Frame[m_frame_count]; + if (m_frames == NULL) + return -1; + + Frame& f = m_frames[0]; + f.pos = pos; + + const long long frame_size = stop - pos; + + if (frame_size > LONG_MAX || frame_size <= 0) + return E_FILE_FORMAT_INVALID; + + f.len = static_cast(frame_size); + + return 0; // success + } + + if (pos >= stop) + return E_FILE_FORMAT_INVALID; + + unsigned char biased_count; + + status = pReader->Read(pos, 1, &biased_count); + + if (status) + return E_FILE_FORMAT_INVALID; + + ++pos; // consume frame count + if (pos > stop) + return E_FILE_FORMAT_INVALID; + + m_frame_count = int(biased_count) + 1; + + m_frames = new (std::nothrow) Frame[m_frame_count]; + if (m_frames == NULL) + return -1; + + if (!m_frames) + return E_FILE_FORMAT_INVALID; + + if (lacing == 1) { // Xiph + Frame* pf = m_frames; + Frame* const pf_end = pf + m_frame_count; + + long long size = 0; + int frame_count = m_frame_count; + + while (frame_count > 1) { + long frame_size = 0; + + for (;;) { + unsigned char val; + + if (pos >= stop) + return E_FILE_FORMAT_INVALID; + + status = pReader->Read(pos, 1, &val); + + if (status) + return E_FILE_FORMAT_INVALID; + + ++pos; // consume xiph size byte + + frame_size += val; + + if (val < 255) + break; + } + + Frame& f = *pf++; + assert(pf < pf_end); + if (pf >= pf_end) + return E_FILE_FORMAT_INVALID; + + f.pos = 0; // patch later + + if (frame_size <= 0) + return E_FILE_FORMAT_INVALID; + + f.len = frame_size; + size += frame_size; // contribution of this frame + + --frame_count; + } + + if (pf >= pf_end || pos > stop) + return E_FILE_FORMAT_INVALID; + + { + Frame& f = *pf++; + + if (pf != pf_end) + return E_FILE_FORMAT_INVALID; + + f.pos = 0; // patch later + + const long long total_size = stop - pos; + + if (total_size < size) + return E_FILE_FORMAT_INVALID; + + const long long frame_size = total_size - size; + + if (frame_size > LONG_MAX || frame_size <= 0) + return E_FILE_FORMAT_INVALID; + + f.len = static_cast(frame_size); + } + + pf = m_frames; + while (pf != pf_end) { + Frame& f = *pf++; + assert((pos + f.len) <= stop); + + if ((pos + f.len) > stop) + return E_FILE_FORMAT_INVALID; + + f.pos = pos; + pos += f.len; + } + + assert(pos == stop); + if (pos != stop) + return E_FILE_FORMAT_INVALID; + + } else if (lacing == 2) { // fixed-size lacing + if (pos >= stop) + return E_FILE_FORMAT_INVALID; + + const long long total_size = stop - pos; + + if ((total_size % m_frame_count) != 0) + return E_FILE_FORMAT_INVALID; + + const long long frame_size = total_size / m_frame_count; + + if (frame_size > LONG_MAX || frame_size <= 0) + return E_FILE_FORMAT_INVALID; + + Frame* pf = m_frames; + Frame* const pf_end = pf + m_frame_count; + + while (pf != pf_end) { + assert((pos + frame_size) <= stop); + if ((pos + frame_size) > stop) + return E_FILE_FORMAT_INVALID; + + Frame& f = *pf++; + + f.pos = pos; + f.len = static_cast(frame_size); + + pos += frame_size; + } + + assert(pos == stop); + if (pos != stop) + return E_FILE_FORMAT_INVALID; + + } else { + assert(lacing == 3); // EBML lacing + + if (pos >= stop) + return E_FILE_FORMAT_INVALID; + + long long size = 0; + int frame_count = m_frame_count; + + long long frame_size = ReadUInt(pReader, pos, len); + + if (frame_size <= 0) + return E_FILE_FORMAT_INVALID; + +#if LLONG_MAX > LONG_MAX + if (frame_size > LONG_MAX) + return E_FILE_FORMAT_INVALID; +#endif + + if ((pos + len) > stop) + return E_FILE_FORMAT_INVALID; + + pos += len; // consume length of size of first frame + + if ((pos + frame_size) > stop) + return E_FILE_FORMAT_INVALID; + + Frame* pf = m_frames; + Frame* const pf_end = pf + m_frame_count; + + { + Frame& curr = *pf; + + curr.pos = 0; // patch later + + curr.len = static_cast(frame_size); + size += curr.len; // contribution of this frame + } + + --frame_count; + + while (frame_count > 1) { + if (pos >= stop) + return E_FILE_FORMAT_INVALID; + + assert(pf < pf_end); + if (pf >= pf_end) + return E_FILE_FORMAT_INVALID; + + const Frame& prev = *pf++; + assert(prev.len == frame_size); + if (prev.len != frame_size) + return E_FILE_FORMAT_INVALID; + + assert(pf < pf_end); + if (pf >= pf_end) + return E_FILE_FORMAT_INVALID; + + Frame& curr = *pf; + + curr.pos = 0; // patch later + + const long long delta_size_ = ReadUInt(pReader, pos, len); + + if (delta_size_ < 0) + return E_FILE_FORMAT_INVALID; + + if ((pos + len) > stop) + return E_FILE_FORMAT_INVALID; + + pos += len; // consume length of (delta) size + if (pos > stop) + return E_FILE_FORMAT_INVALID; + + const long exp = 7 * len - 1; + const long long bias = (1LL << exp) - 1LL; + const long long delta_size = delta_size_ - bias; + + frame_size += delta_size; + + if (frame_size <= 0) + return E_FILE_FORMAT_INVALID; + +#if LLONG_MAX > LONG_MAX + if (frame_size > LONG_MAX) + return E_FILE_FORMAT_INVALID; +#endif + + curr.len = static_cast(frame_size); + // Check if size + curr.len could overflow. + if (size > LLONG_MAX - curr.len) { + return E_FILE_FORMAT_INVALID; + } + size += curr.len; // contribution of this frame + + --frame_count; + } + + // parse last frame + if (frame_count > 0) { + if (pos > stop || pf >= pf_end) + return E_FILE_FORMAT_INVALID; + + const Frame& prev = *pf++; + assert(prev.len == frame_size); + if (prev.len != frame_size) + return E_FILE_FORMAT_INVALID; + + if (pf >= pf_end) + return E_FILE_FORMAT_INVALID; + + Frame& curr = *pf++; + if (pf != pf_end) + return E_FILE_FORMAT_INVALID; + + curr.pos = 0; // patch later + + const long long total_size = stop - pos; + + if (total_size < size) + return E_FILE_FORMAT_INVALID; + + frame_size = total_size - size; + + if (frame_size > LONG_MAX || frame_size <= 0) + return E_FILE_FORMAT_INVALID; + + curr.len = static_cast(frame_size); + } + + pf = m_frames; + while (pf != pf_end) { + Frame& f = *pf++; + if ((pos + f.len) > stop) + return E_FILE_FORMAT_INVALID; + + f.pos = pos; + pos += f.len; + } + + if (pos != stop) + return E_FILE_FORMAT_INVALID; + } + + return 0; // success +} + +long long Block::GetTimeCode(const Cluster* pCluster) const { + if (pCluster == 0) + return m_timecode; + + const long long tc0 = pCluster->GetTimeCode(); + assert(tc0 >= 0); + + // Check if tc0 + m_timecode would overflow. + if (tc0 < 0 || LLONG_MAX - tc0 < m_timecode) { + return -1; + } + + const long long tc = tc0 + m_timecode; + + return tc; // unscaled timecode units +} + +long long Block::GetTime(const Cluster* pCluster) const { + assert(pCluster); + + const long long tc = GetTimeCode(pCluster); + + const Segment* const pSegment = pCluster->m_pSegment; + const SegmentInfo* const pInfo = pSegment->GetInfo(); + assert(pInfo); + + const long long scale = pInfo->GetTimeCodeScale(); + assert(scale >= 1); + + // Check if tc * scale could overflow. + if (tc != 0 && scale > LLONG_MAX / tc) { + return -1; + } + const long long ns = tc * scale; + + return ns; +} + +long long Block::GetTrackNumber() const { return m_track; } + +bool Block::IsKey() const { + return ((m_flags & static_cast(1 << 7)) != 0); +} + +void Block::SetKey(bool bKey) { + if (bKey) + m_flags |= static_cast(1 << 7); + else + m_flags &= 0x7F; +} + +bool Block::IsInvisible() const { return bool(int(m_flags & 0x08) != 0); } + +Block::Lacing Block::GetLacing() const { + const int value = int(m_flags & 0x06) >> 1; + return static_cast(value); +} + +int Block::GetFrameCount() const { return m_frame_count; } + +const Block::Frame& Block::GetFrame(int idx) const { + assert(idx >= 0); + assert(idx < m_frame_count); + + const Frame& f = m_frames[idx]; + assert(f.pos > 0); + assert(f.len > 0); + + return f; +} + +long Block::Frame::Read(IMkvReader* pReader, unsigned char* buf) const { + assert(pReader); + assert(buf); + + const long status = pReader->Read(pos, len, buf); + return status; +} + +long long Block::GetDiscardPadding() const { return m_discard_padding; } + +} // namespace mkvparser diff --git a/lib/lib_audio/ESP8266Audio/src/libwebm/mkvparser/mkvparser.h b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvparser/mkvparser.h new file mode 100644 index 000000000..848d01f03 --- /dev/null +++ b/lib/lib_audio/ESP8266Audio/src/libwebm/mkvparser/mkvparser.h @@ -0,0 +1,1147 @@ +// Copyright (c) 2012 The WebM project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +#ifndef MKVPARSER_MKVPARSER_H_ +#define MKVPARSER_MKVPARSER_H_ + +#include + +namespace mkvparser { + +const int E_PARSE_FAILED = -1; +const int E_FILE_FORMAT_INVALID = -2; +const int E_BUFFER_NOT_FULL = -3; + +class IMkvReader { + public: + virtual int Read(long long pos, long len, unsigned char* buf) = 0; + virtual int Length(long long* total, long long* available) = 0; + + protected: + virtual ~IMkvReader() {} +}; + +template +Type* SafeArrayAlloc(unsigned long long num_elements, + unsigned long long element_size); +long long GetUIntLength(IMkvReader*, long long, long&); +long long ReadUInt(IMkvReader*, long long, long&); +long long ReadID(IMkvReader* pReader, long long pos, long& len); +long long UnserializeUInt(IMkvReader*, long long pos, long long size); + +long UnserializeFloat(IMkvReader*, long long pos, long long size, double&); +long UnserializeInt(IMkvReader*, long long pos, long long size, + long long& result); + +long UnserializeString(IMkvReader*, long long pos, long long size, char*& str); + +long ParseElementHeader(IMkvReader* pReader, + long long& pos, // consume id and size fields + long long stop, // if you know size of element's parent + long long& id, long long& size); + +bool Match(IMkvReader*, long long&, unsigned long, long long&); +bool Match(IMkvReader*, long long&, unsigned long, unsigned char*&, size_t&); + +void GetVersion(int& major, int& minor, int& build, int& revision); + +struct EBMLHeader { + EBMLHeader(); + ~EBMLHeader(); + long long m_version; + long long m_readVersion; + long long m_maxIdLength; + long long m_maxSizeLength; + char* m_docType; + long long m_docTypeVersion; + long long m_docTypeReadVersion; + + long long Parse(IMkvReader*, long long&); + void Init(); +}; + +class Segment; +class Track; +class Cluster; + +class Block { + Block(const Block&); + Block& operator=(const Block&); + + public: + const long long m_start; + const long long m_size; + + Block(long long start, long long size, long long discard_padding); + ~Block(); + + long Parse(const Cluster*); + + long long GetTrackNumber() const; + long long GetTimeCode(const Cluster*) const; // absolute, but not scaled + long long GetTime(const Cluster*) const; // absolute, and scaled (ns) + bool IsKey() const; + void SetKey(bool); + bool IsInvisible() const; + + enum Lacing { kLacingNone, kLacingXiph, kLacingFixed, kLacingEbml }; + Lacing GetLacing() const; + + int GetFrameCount() const; // to index frames: [0, count) + + struct Frame { + long long pos; // absolute offset + long len; + + long Read(IMkvReader*, unsigned char*) const; + }; + + const Frame& GetFrame(int frame_index) const; + + long long GetDiscardPadding() const; + + private: + long long m_track; // Track::Number() + short m_timecode; // relative to cluster + unsigned char m_flags; + + Frame* m_frames; + int m_frame_count; + + protected: + const long long m_discard_padding; +}; + +class BlockEntry { + BlockEntry(const BlockEntry&); + BlockEntry& operator=(const BlockEntry&); + + protected: + BlockEntry(Cluster*, long index); + + public: + virtual ~BlockEntry(); + + bool EOS() const { return (GetKind() == kBlockEOS); } + const Cluster* GetCluster() const; + long GetIndex() const; + virtual const Block* GetBlock() const = 0; + + enum Kind { kBlockEOS, kBlockSimple, kBlockGroup }; + virtual Kind GetKind() const = 0; + + protected: + Cluster* const m_pCluster; + const long m_index; +}; + +class SimpleBlock : public BlockEntry { + SimpleBlock(const SimpleBlock&); + SimpleBlock& operator=(const SimpleBlock&); + + public: + SimpleBlock(Cluster*, long index, long long start, long long size); + long Parse(); + + Kind GetKind() const; + const Block* GetBlock() const; + + protected: + Block m_block; +}; + +class BlockGroup : public BlockEntry { + BlockGroup(const BlockGroup&); + BlockGroup& operator=(const BlockGroup&); + + public: + BlockGroup(Cluster*, long index, + long long block_start, // absolute pos of block's payload + long long block_size, // size of block's payload + long long prev, long long next, long long duration, + long long discard_padding); + + long Parse(); + + Kind GetKind() const; + const Block* GetBlock() const; + + long long GetPrevTimeCode() const; // relative to block's time + long long GetNextTimeCode() const; // as above + long long GetDurationTimeCode() const; + + private: + Block m_block; + const long long m_prev; + const long long m_next; + const long long m_duration; +}; + +/////////////////////////////////////////////////////////////// +// ContentEncoding element +// Elements used to describe if the track data has been encrypted or +// compressed with zlib or header stripping. +class ContentEncoding { + public: + enum { kCTR = 1 }; + + ContentEncoding(); + ~ContentEncoding(); + + // ContentCompression element names + struct ContentCompression { + ContentCompression(); + ~ContentCompression(); + + unsigned long long algo; + unsigned char* settings; + long long settings_len; + }; + + // ContentEncAESSettings element names + struct ContentEncAESSettings { + ContentEncAESSettings() : cipher_mode(kCTR) {} + ~ContentEncAESSettings() {} + + unsigned long long cipher_mode; + }; + + // ContentEncryption element names + struct ContentEncryption { + ContentEncryption(); + ~ContentEncryption(); + + unsigned long long algo; + unsigned char* key_id; + long long key_id_len; + unsigned char* signature; + long long signature_len; + unsigned char* sig_key_id; + long long sig_key_id_len; + unsigned long long sig_algo; + unsigned long long sig_hash_algo; + + ContentEncAESSettings aes_settings; + }; + + // Returns ContentCompression represented by |idx|. Returns NULL if |idx| + // is out of bounds. + const ContentCompression* GetCompressionByIndex(unsigned long idx) const; + + // Returns number of ContentCompression elements in this ContentEncoding + // element. + unsigned long GetCompressionCount() const; + + // Parses the ContentCompression element from |pReader|. |start| is the + // starting offset of the ContentCompression payload. |size| is the size in + // bytes of the ContentCompression payload. |compression| is where the parsed + // values will be stored. + long ParseCompressionEntry(long long start, long long size, + IMkvReader* pReader, + ContentCompression* compression); + + // Returns ContentEncryption represented by |idx|. Returns NULL if |idx| + // is out of bounds. + const ContentEncryption* GetEncryptionByIndex(unsigned long idx) const; + + // Returns number of ContentEncryption elements in this ContentEncoding + // element. + unsigned long GetEncryptionCount() const; + + // Parses the ContentEncAESSettings element from |pReader|. |start| is the + // starting offset of the ContentEncAESSettings payload. |size| is the + // size in bytes of the ContentEncAESSettings payload. |encryption| is + // where the parsed values will be stored. + long ParseContentEncAESSettingsEntry(long long start, long long size, + IMkvReader* pReader, + ContentEncAESSettings* aes); + + // Parses the ContentEncoding element from |pReader|. |start| is the + // starting offset of the ContentEncoding payload. |size| is the size in + // bytes of the ContentEncoding payload. Returns true on success. + long ParseContentEncodingEntry(long long start, long long size, + IMkvReader* pReader); + + // Parses the ContentEncryption element from |pReader|. |start| is the + // starting offset of the ContentEncryption payload. |size| is the size in + // bytes of the ContentEncryption payload. |encryption| is where the parsed + // values will be stored. + long ParseEncryptionEntry(long long start, long long size, + IMkvReader* pReader, ContentEncryption* encryption); + + unsigned long long encoding_order() const { return encoding_order_; } + unsigned long long encoding_scope() const { return encoding_scope_; } + unsigned long long encoding_type() const { return encoding_type_; } + + private: + // Member variables for list of ContentCompression elements. + ContentCompression** compression_entries_; + ContentCompression** compression_entries_end_; + + // Member variables for list of ContentEncryption elements. + ContentEncryption** encryption_entries_; + ContentEncryption** encryption_entries_end_; + + // ContentEncoding element names + unsigned long long encoding_order_; + unsigned long long encoding_scope_; + unsigned long long encoding_type_; + + // LIBWEBM_DISALLOW_COPY_AND_ASSIGN(ContentEncoding); + ContentEncoding(const ContentEncoding&); + ContentEncoding& operator=(const ContentEncoding&); +}; + +class Track { + Track(const Track&); + Track& operator=(const Track&); + + public: + class Info; + static long Create(Segment*, const Info&, long long element_start, + long long element_size, Track*&); + + enum Type { kVideo = 1, kAudio = 2, kSubtitle = 0x11, kMetadata = 0x21 }; + + Segment* const m_pSegment; + const long long m_element_start; + const long long m_element_size; + virtual ~Track(); + + long GetType() const; + long GetNumber() const; + unsigned long long GetUid() const; + const char* GetNameAsUTF8() const; + const char* GetLanguage() const; + const char* GetCodecNameAsUTF8() const; + const char* GetCodecId() const; + const unsigned char* GetCodecPrivate(size_t&) const; + bool GetLacing() const; + unsigned long long GetDefaultDuration() const; + unsigned long long GetCodecDelay() const; + unsigned long long GetSeekPreRoll() const; + + const BlockEntry* GetEOS() const; + + struct Settings { + long long start; + long long size; + }; + + class Info { + public: + Info(); + ~Info(); + int Copy(Info&) const; + void Clear(); + long type; + long number; + unsigned long long uid; + unsigned long long defaultDuration; + unsigned long long codecDelay; + unsigned long long seekPreRoll; + char* nameAsUTF8; + char* language; + char* codecId; + char* codecNameAsUTF8; + unsigned char* codecPrivate; + size_t codecPrivateSize; + bool lacing; + Settings settings; + + private: + Info(const Info&); + Info& operator=(const Info&); + int CopyStr(char* Info::*str, Info&) const; + }; + + long GetFirst(const BlockEntry*&) const; + long GetNext(const BlockEntry* pCurr, const BlockEntry*& pNext) const; + virtual bool VetEntry(const BlockEntry*) const; + virtual long Seek(long long time_ns, const BlockEntry*&) const; + + const ContentEncoding* GetContentEncodingByIndex(unsigned long idx) const; + unsigned long GetContentEncodingCount() const; + + long ParseContentEncodingsEntry(long long start, long long size); + + protected: + Track(Segment*, long long element_start, long long element_size); + + Info m_info; + + class EOSBlock : public BlockEntry { + public: + EOSBlock(); + + Kind GetKind() const; + const Block* GetBlock() const; + }; + + EOSBlock m_eos; + + private: + ContentEncoding** content_encoding_entries_; + ContentEncoding** content_encoding_entries_end_; +}; + +struct PrimaryChromaticity { + PrimaryChromaticity() : x(0), y(0) {} + ~PrimaryChromaticity() {} + static bool Parse(IMkvReader* reader, long long read_pos, + long long value_size, bool is_x, + PrimaryChromaticity** chromaticity); + float x; + float y; +}; + +struct MasteringMetadata { + static const float kValueNotPresent; + + MasteringMetadata() + : r(NULL), + g(NULL), + b(NULL), + white_point(NULL), + luminance_max(kValueNotPresent), + luminance_min(kValueNotPresent) {} + ~MasteringMetadata() { + delete r; + delete g; + delete b; + delete white_point; + } + + static bool Parse(IMkvReader* reader, long long element_start, + long long element_size, + MasteringMetadata** mastering_metadata); + + PrimaryChromaticity* r; + PrimaryChromaticity* g; + PrimaryChromaticity* b; + PrimaryChromaticity* white_point; + float luminance_max; + float luminance_min; +}; + +struct Colour { + static const long long kValueNotPresent; + + // Unless otherwise noted all values assigned upon construction are the + // equivalent of unspecified/default. + Colour() + : matrix_coefficients(kValueNotPresent), + bits_per_channel(kValueNotPresent), + chroma_subsampling_horz(kValueNotPresent), + chroma_subsampling_vert(kValueNotPresent), + cb_subsampling_horz(kValueNotPresent), + cb_subsampling_vert(kValueNotPresent), + chroma_siting_horz(kValueNotPresent), + chroma_siting_vert(kValueNotPresent), + range(kValueNotPresent), + transfer_characteristics(kValueNotPresent), + primaries(kValueNotPresent), + max_cll(kValueNotPresent), + max_fall(kValueNotPresent), + mastering_metadata(NULL) {} + ~Colour() { + delete mastering_metadata; + mastering_metadata = NULL; + } + + static bool Parse(IMkvReader* reader, long long element_start, + long long element_size, Colour** colour); + + long long matrix_coefficients; + long long bits_per_channel; + long long chroma_subsampling_horz; + long long chroma_subsampling_vert; + long long cb_subsampling_horz; + long long cb_subsampling_vert; + long long chroma_siting_horz; + long long chroma_siting_vert; + long long range; + long long transfer_characteristics; + long long primaries; + long long max_cll; + long long max_fall; + + MasteringMetadata* mastering_metadata; +}; + +struct Projection { + enum ProjectionType { + kTypeNotPresent = -1, + kRectangular = 0, + kEquirectangular = 1, + kCubeMap = 2, + kMesh = 3, + }; + static const float kValueNotPresent; + Projection() + : type(kTypeNotPresent), + private_data(NULL), + private_data_length(0), + pose_yaw(kValueNotPresent), + pose_pitch(kValueNotPresent), + pose_roll(kValueNotPresent) {} + ~Projection() { delete[] private_data; } + static bool Parse(IMkvReader* reader, long long element_start, + long long element_size, Projection** projection); + + ProjectionType type; + unsigned char* private_data; + size_t private_data_length; + float pose_yaw; + float pose_pitch; + float pose_roll; +}; + +class VideoTrack : public Track { + VideoTrack(const VideoTrack&); + VideoTrack& operator=(const VideoTrack&); + + VideoTrack(Segment*, long long element_start, long long element_size); + + public: + virtual ~VideoTrack(); + static long Parse(Segment*, const Info&, long long element_start, + long long element_size, VideoTrack*&); + + long long GetWidth() const; + long long GetHeight() const; + long long GetDisplayWidth() const; + long long GetDisplayHeight() const; + long long GetDisplayUnit() const; + long long GetStereoMode() const; + double GetFrameRate() const; + + bool VetEntry(const BlockEntry*) const; + long Seek(long long time_ns, const BlockEntry*&) const; + + Colour* GetColour() const; + + Projection* GetProjection() const; + + const char* GetColourSpace() const { return m_colour_space; } + + private: + long long m_width; + long long m_height; + long long m_display_width; + long long m_display_height; + long long m_display_unit; + long long m_stereo_mode; + char* m_colour_space; + double m_rate; + + Colour* m_colour; + Projection* m_projection; +}; + +class AudioTrack : public Track { + AudioTrack(const AudioTrack&); + AudioTrack& operator=(const AudioTrack&); + + AudioTrack(Segment*, long long element_start, long long element_size); + + public: + static long Parse(Segment*, const Info&, long long element_start, + long long element_size, AudioTrack*&); + + double GetSamplingRate() const; + long long GetChannels() const; + long long GetBitDepth() const; + + private: + double m_rate; + long long m_channels; + long long m_bitDepth; +}; + +class Tracks { + Tracks(const Tracks&); + Tracks& operator=(const Tracks&); + + public: + Segment* const m_pSegment; + const long long m_start; + const long long m_size; + const long long m_element_start; + const long long m_element_size; + + Tracks(Segment*, long long start, long long size, long long element_start, + long long element_size); + + ~Tracks(); + + long Parse(); + + unsigned long GetTracksCount() const; + + const Track* GetTrackByNumber(long tn) const; + const Track* GetTrackByIndex(unsigned long idx) const; + + private: + Track** m_trackEntries; + Track** m_trackEntriesEnd; + + long ParseTrackEntry(long long payload_start, long long payload_size, + long long element_start, long long element_size, + Track*&) const; +}; + +class Chapters { + Chapters(const Chapters&); + Chapters& operator=(const Chapters&); + + public: + Segment* const m_pSegment; + const long long m_start; + const long long m_size; + const long long m_element_start; + const long long m_element_size; + + Chapters(Segment*, long long payload_start, long long payload_size, + long long element_start, long long element_size); + + ~Chapters(); + + long Parse(); + + class Atom; + class Edition; + + class Display { + friend class Atom; + Display(); + Display(const Display&); + ~Display(); + Display& operator=(const Display&); + + public: + const char* GetString() const; + const char* GetLanguage() const; + const char* GetCountry() const; + + private: + void Init(); + void ShallowCopy(Display&) const; + void Clear(); + long Parse(IMkvReader*, long long pos, long long size); + + char* m_string; + char* m_language; + char* m_country; + }; + + class Atom { + friend class Edition; + Atom(); + Atom(const Atom&); + ~Atom(); + Atom& operator=(const Atom&); + + public: + unsigned long long GetUID() const; + const char* GetStringUID() const; + + long long GetStartTimecode() const; + long long GetStopTimecode() const; + + long long GetStartTime(const Chapters*) const; + long long GetStopTime(const Chapters*) const; + + int GetDisplayCount() const; + const Display* GetDisplay(int index) const; + + private: + void Init(); + void ShallowCopy(Atom&) const; + void Clear(); + long Parse(IMkvReader*, long long pos, long long size); + static long long GetTime(const Chapters*, long long timecode); + + long ParseDisplay(IMkvReader*, long long pos, long long size); + bool ExpandDisplaysArray(); + + char* m_string_uid; + unsigned long long m_uid; + long long m_start_timecode; + long long m_stop_timecode; + + Display* m_displays; + int m_displays_size; + int m_displays_count; + }; + + class Edition { + friend class Chapters; + Edition(); + Edition(const Edition&); + ~Edition(); + Edition& operator=(const Edition&); + + public: + int GetAtomCount() const; + const Atom* GetAtom(int index) const; + + private: + void Init(); + void ShallowCopy(Edition&) const; + void Clear(); + long Parse(IMkvReader*, long long pos, long long size); + + long ParseAtom(IMkvReader*, long long pos, long long size); + bool ExpandAtomsArray(); + + Atom* m_atoms; + int m_atoms_size; + int m_atoms_count; + }; + + int GetEditionCount() const; + const Edition* GetEdition(int index) const; + + private: + long ParseEdition(long long pos, long long size); + bool ExpandEditionsArray(); + + Edition* m_editions; + int m_editions_size; + int m_editions_count; +}; + +class Tags { + Tags(const Tags&); + Tags& operator=(const Tags&); + + public: + Segment* const m_pSegment; + const long long m_start; + const long long m_size; + const long long m_element_start; + const long long m_element_size; + + Tags(Segment*, long long payload_start, long long payload_size, + long long element_start, long long element_size); + + ~Tags(); + + long Parse(); + + class Tag; + class SimpleTag; + + class SimpleTag { + friend class Tag; + SimpleTag(); + SimpleTag(const SimpleTag&); + ~SimpleTag(); + SimpleTag& operator=(const SimpleTag&); + + public: + const char* GetTagName() const; + const char* GetTagString() const; + + private: + void Init(); + void ShallowCopy(SimpleTag&) const; + void Clear(); + long Parse(IMkvReader*, long long pos, long long size); + + char* m_tag_name; + char* m_tag_string; + }; + + class Tag { + friend class Tags; + Tag(); + Tag(const Tag&); + ~Tag(); + Tag& operator=(const Tag&); + + public: + int GetSimpleTagCount() const; + const SimpleTag* GetSimpleTag(int index) const; + + private: + void Init(); + void ShallowCopy(Tag&) const; + void Clear(); + long Parse(IMkvReader*, long long pos, long long size); + + long ParseSimpleTag(IMkvReader*, long long pos, long long size); + bool ExpandSimpleTagsArray(); + + SimpleTag* m_simple_tags; + int m_simple_tags_size; + int m_simple_tags_count; + }; + + int GetTagCount() const; + const Tag* GetTag(int index) const; + + private: + long ParseTag(long long pos, long long size); + bool ExpandTagsArray(); + + Tag* m_tags; + int m_tags_size; + int m_tags_count; +}; + +class SegmentInfo { + SegmentInfo(const SegmentInfo&); + SegmentInfo& operator=(const SegmentInfo&); + + public: + Segment* const m_pSegment; + const long long m_start; + const long long m_size; + const long long m_element_start; + const long long m_element_size; + + SegmentInfo(Segment*, long long start, long long size, + long long element_start, long long element_size); + + ~SegmentInfo(); + + long Parse(); + + long long GetTimeCodeScale() const; + long long GetDuration() const; // scaled + const char* GetMuxingAppAsUTF8() const; + const char* GetWritingAppAsUTF8() const; + const char* GetTitleAsUTF8() const; + + private: + long long m_timecodeScale; + double m_duration; + char* m_pMuxingAppAsUTF8; + char* m_pWritingAppAsUTF8; + char* m_pTitleAsUTF8; +}; + +class SeekHead { + SeekHead(const SeekHead&); + SeekHead& operator=(const SeekHead&); + + public: + Segment* const m_pSegment; + const long long m_start; + const long long m_size; + const long long m_element_start; + const long long m_element_size; + + SeekHead(Segment*, long long start, long long size, long long element_start, + long long element_size); + + ~SeekHead(); + + long Parse(); + + struct Entry { + Entry(); + + // the SeekHead entry payload + long long id; + long long pos; + + // absolute pos of SeekEntry ID + long long element_start; + + // SeekEntry ID size + size size + payload + long long element_size; + }; + + int GetCount() const; + const Entry* GetEntry(int idx) const; + + struct VoidElement { + // absolute pos of Void ID + long long element_start; + + // ID size + size size + payload size + long long element_size; + }; + + int GetVoidElementCount() const; + const VoidElement* GetVoidElement(int idx) const; + + private: + Entry* m_entries; + int m_entry_count; + + VoidElement* m_void_elements; + int m_void_element_count; + + static bool ParseEntry(IMkvReader*, + long long pos, // payload + long long size, Entry*); +}; + +class Cues; +class CuePoint { + friend class Cues; + + CuePoint(long, long long); + ~CuePoint(); + + CuePoint(const CuePoint&); + CuePoint& operator=(const CuePoint&); + + public: + long long m_element_start; + long long m_element_size; + + bool Load(IMkvReader*); + + long long GetTimeCode() const; // absolute but unscaled + long long GetTime(const Segment*) const; // absolute and scaled (ns units) + + struct TrackPosition { + long long m_track; + long long m_pos; // of cluster + long long m_block; + // codec_state //defaults to 0 + // reference = clusters containing req'd referenced blocks + // reftime = timecode of the referenced block + + bool Parse(IMkvReader*, long long, long long); + }; + + const TrackPosition* Find(const Track*) const; + + private: + const long m_index; + long long m_timecode; + TrackPosition* m_track_positions; + size_t m_track_positions_count; +}; + +class Cues { + friend class Segment; + + Cues(Segment*, long long start, long long size, long long element_start, + long long element_size); + ~Cues(); + + Cues(const Cues&); + Cues& operator=(const Cues&); + + public: + Segment* const m_pSegment; + const long long m_start; + const long long m_size; + const long long m_element_start; + const long long m_element_size; + + bool Find( // lower bound of time_ns + long long time_ns, const Track*, const CuePoint*&, + const CuePoint::TrackPosition*&) const; + + const CuePoint* GetFirst() const; + const CuePoint* GetLast() const; + const CuePoint* GetNext(const CuePoint*) const; + + const BlockEntry* GetBlock(const CuePoint*, + const CuePoint::TrackPosition*) const; + + bool LoadCuePoint() const; + long GetCount() const; // loaded only + // long GetTotal() const; //loaded + preloaded + bool DoneParsing() const; + + private: + bool Init() const; + bool PreloadCuePoint(long&, long long) const; + + mutable CuePoint** m_cue_points; + mutable long m_count; + mutable long m_preload_count; + mutable long long m_pos; +}; + +class Cluster { + friend class Segment; + + Cluster(const Cluster&); + Cluster& operator=(const Cluster&); + + public: + Segment* const m_pSegment; + + public: + static Cluster* Create(Segment*, + long index, // index in segment + long long off); // offset relative to segment + // long long element_size); + + Cluster(); // EndOfStream + ~Cluster(); + + bool EOS() const; + + long long GetTimeCode() const; // absolute, but not scaled + long long GetTime() const; // absolute, and scaled (nanosecond units) + long long GetFirstTime() const; // time (ns) of first (earliest) block + long long GetLastTime() const; // time (ns) of last (latest) block + + long GetFirst(const BlockEntry*&) const; + long GetLast(const BlockEntry*&) const; + long GetNext(const BlockEntry* curr, const BlockEntry*& next) const; + + const BlockEntry* GetEntry(const Track*, long long ns = -1) const; + const BlockEntry* GetEntry(const CuePoint&, + const CuePoint::TrackPosition&) const; + // const BlockEntry* GetMaxKey(const VideoTrack*) const; + + // static bool HasBlockEntries(const Segment*, long long); + + static long HasBlockEntries(const Segment*, long long idoff, long long& pos, + long& size); + + long GetEntryCount() const; + + long Load(long long& pos, long& size) const; + + long Parse(long long& pos, long& size) const; + long GetEntry(long index, const mkvparser::BlockEntry*&) const; + + protected: + Cluster(Segment*, long index, long long element_start); + // long long element_size); + + public: + const long long m_element_start; + long long GetPosition() const; // offset relative to segment + + long GetIndex() const; + long long GetElementSize() const; + // long long GetPayloadSize() const; + + // long long Unparsed() const; + + private: + long m_index; + mutable long long m_pos; + // mutable long long m_size; + mutable long long m_element_size; + mutable long long m_timecode; + mutable BlockEntry** m_entries; + mutable long m_entries_size; + mutable long m_entries_count; + + long ParseSimpleBlock(long long, long long&, long&); + long ParseBlockGroup(long long, long long&, long&); + + long CreateBlock(long long id, long long pos, long long size, + long long discard_padding); + long CreateBlockGroup(long long start_offset, long long size, + long long discard_padding); + long CreateSimpleBlock(long long, long long); +}; + +class Segment { + friend class Cues; + friend class Track; + friend class VideoTrack; + + Segment(const Segment&); + Segment& operator=(const Segment&); + + private: + Segment(IMkvReader*, long long elem_start, + // long long elem_size, + long long pos, long long size); + + public: + IMkvReader* const m_pReader; + const long long m_element_start; + // const long long m_element_size; + const long long m_start; // posn of segment payload + const long long m_size; // size of segment payload + Cluster m_eos; // TODO: make private? + + static long long CreateInstance(IMkvReader*, long long, Segment*&); + ~Segment(); + + long Load(); // loads headers and all clusters + + // for incremental loading + // long long Unparsed() const; + bool DoneParsing() const; + long long ParseHeaders(); // stops when first cluster is found + // long FindNextCluster(long long& pos, long& size) const; + long LoadCluster(long long& pos, long& size); // load one cluster + long LoadCluster(); + + long ParseNext(const Cluster* pCurr, const Cluster*& pNext, long long& pos, + long& size); + + const SeekHead* GetSeekHead() const; + const Tracks* GetTracks() const; + const SegmentInfo* GetInfo() const; + const Cues* GetCues() const; + const Chapters* GetChapters() const; + const Tags* GetTags() const; + + long long GetDuration() const; + + unsigned long GetCount() const; + const Cluster* GetFirst() const; + const Cluster* GetLast() const; + const Cluster* GetNext(const Cluster*); + + const Cluster* FindCluster(long long time_nanoseconds) const; + // const BlockEntry* Seek(long long time_nanoseconds, const Track*) const; + + const Cluster* FindOrPreloadCluster(long long pos); + + long ParseCues(long long cues_off, // offset relative to start of segment + long long& parse_pos, long& parse_len); + + private: + long long m_pos; // absolute file posn; what has been consumed so far + Cluster* m_pUnknownSize; + + SeekHead* m_pSeekHead; + SegmentInfo* m_pInfo; + Tracks* m_pTracks; + Cues* m_pCues; + Chapters* m_pChapters; + Tags* m_pTags; + Cluster** m_clusters; + long m_clusterCount; // number of entries for which m_index >= 0 + long m_clusterPreloadCount; // number of entries for which m_index < 0 + long m_clusterSize; // array size + + long DoLoadCluster(long long&, long&); + long DoLoadClusterUnknownSize(long long&, long&); + long DoParseNext(const Cluster*&, long long&, long&); + + bool AppendCluster(Cluster*); + bool PreloadCluster(Cluster*, ptrdiff_t); + + // void ParseSeekHead(long long pos, long long size); + // void ParseSeekEntry(long long pos, long long size); + // void ParseCues(long long); + + const BlockEntry* GetBlock(const CuePoint&, const CuePoint::TrackPosition&); +}; + +} // namespace mkvparser + +inline long mkvparser::Segment::LoadCluster() { + long long pos; + long size; + + return LoadCluster(pos, size); +} + +#endif // MKVPARSER_MKVPARSER_H_ diff --git a/lib/lib_audio/ESP8266Audio/src/opusfile/opusfile.c b/lib/lib_audio/ESP8266Audio/src/opusfile/opusfile.c index 7ffe32f89..a9c44ef46 100644 --- a/lib/lib_audio/ESP8266Audio/src/opusfile/opusfile.c +++ b/lib/lib_audio/ESP8266Audio/src/opusfile/opusfile.c @@ -90,12 +90,12 @@ int op_test(OpusHead *_head, ogg_sync_init(&oy); data=ogg_sync_buffer(&oy,(long)_initial_bytes); if(data!=NULL){ - ogg_stream_state *os = (ogg_stream_state*)malloc(sizeof(ogg_stream_state)); + ogg_stream_state os; ogg_page og; int ret; memcpy(data,_initial_data,_initial_bytes); ogg_sync_wrote(&oy,(long)_initial_bytes); - ogg_stream_init(os,-1); + ogg_stream_init(&os,-1); err=OP_FALSE; do{ ogg_packet op; @@ -104,11 +104,11 @@ int op_test(OpusHead *_head, if(ret<0)continue; /*Stop if we run out of data.*/ if(!ret)break; - ogg_stream_reset_serialno(os,ogg_page_serialno(&og)); - ogg_stream_pagein(os,&og); + ogg_stream_reset_serialno(&os,ogg_page_serialno(&og)); + ogg_stream_pagein(&os,&og); /*Only process the first packet on this page (if it's a BOS packet, it's required to be the only one).*/ - if(ogg_stream_packetout(os,&op)==1){ + if(ogg_stream_packetout(&os,&op)==1){ if(op.b_o_s){ ret=opus_head_parse(_head,op.packet,op.bytes); /*If this didn't look like Opus, keep going.*/ @@ -122,8 +122,7 @@ int op_test(OpusHead *_head, } } while(err==OP_FALSE); - ogg_stream_clear(os); - free(os); + ogg_stream_clear(&os); } else err=OP_EFAULT; ogg_sync_clear(&oy); @@ -836,7 +835,7 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of, ogg_int64_t cur_page_gp; ogg_uint32_t serialno; opus_int32 total_duration; - int *durations = (int*)malloc(255 * sizeof(int)); + int durations[255]; int cur_page_eos; int op_count; int pi; @@ -853,31 +852,26 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of, Otherwise there are no audio data packets in the whole logical stream.*/ if(OP_UNLIKELY(page_offset<0)){ /*Fail if there was a read error.*/ - if(page_offsethead.pre_skip>0) {free(durations); return OP_EBADTIMESTAMP;} + if(_link->head.pre_skip>0)return OP_EBADTIMESTAMP; _link->pcm_file_offset=0; /*Set pcm_end and end_offset so we can skip the call to op_find_final_pcm_offset().*/ _link->pcm_start=_link->pcm_end=0; _link->end_offset=_link->data_offset; - free(durations); return 0; } /*Similarly, if we hit the next link in the chain, we've gone too far.*/ if(OP_UNLIKELY(ogg_page_bos(_og))){ - if(_link->head.pre_skip>0) { - free(durations); - return OP_EBADTIMESTAMP; - } + if(_link->head.pre_skip>0)return OP_EBADTIMESTAMP; /*Set pcm_end and end_offset so we can skip the call to op_find_final_pcm_offset().*/ _link->pcm_file_offset=0; _link->pcm_start=_link->pcm_end=0; _link->end_offset=_link->data_offset; /*Tell the caller we've got a buffered page for them.*/ - free(durations); return 1; } /*Ignore pages from other streams (not strictly necessary, because of the @@ -907,10 +901,7 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of, cur_page_gp=_of->op[op_count-1].granulepos; /*But getting a packet without a valid granule position on the page is not okay.*/ - if(cur_page_gp==-1) { - free(durations); - return OP_EBADTIMESTAMP; - } + if(cur_page_gp==-1)return OP_EBADTIMESTAMP; cur_page_eos=_of->op[op_count-1].e_o_s; if(OP_LIKELY(!cur_page_eos)){ /*The EOS flag wasn't set. @@ -919,7 +910,6 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of, if(OP_UNLIKELY(op_granpos_add(&pcm_start,cur_page_gp,-total_duration)<0)){ /*The starting granule position MUST not be smaller than the amount of audio on the first page with completed packets.*/ - free(durations); return OP_EBADTIMESTAMP; } } @@ -933,7 +923,6 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of, /*However, the end-trimming MUST not ask us to trim more samples than exist after applying the pre-skip.*/ if(OP_UNLIKELY(op_granpos_cmp(cur_page_gp,_link->head.pre_skip)<0)){ - free(durations); return OP_EBADTIMESTAMP; } } @@ -968,7 +957,6 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of, _link->pcm_file_offset=0; _of->prev_packet_gp=_link->pcm_start=pcm_start; _of->prev_page_offset=page_offset; - free(durations); return 0; } @@ -1403,34 +1391,32 @@ static int op_open_seekable2_impl(OggOpusFile *_of){ /*64 seek records should be enough for anybody. Actually, with a bisection search in a 63-bit range down to OP_CHUNK_SIZE granularity, much more than enough.*/ - OpusSeekRecord *sr = (OpusSeekRecord*)malloc(64 * sizeof(OpusSeekRecord)); + OpusSeekRecord sr[64]; opus_int64 data_offset; int ret; /*We can seek, so set out learning all about this file.*/ (*_of->callbacks.seek)(_of->stream,0,SEEK_END); _of->offset=_of->end=(*_of->callbacks.tell)(_of->stream); - if(OP_UNLIKELY(_of->end<0)){free(sr); return OP_EREAD;} + if(OP_UNLIKELY(_of->end<0))return OP_EREAD; data_offset=_of->links[0].data_offset; - if(OP_UNLIKELY(_of->endendend, _of->links[0].serialno,_of->serialnos,_of->nserialnos); - if(OP_UNLIKELY(ret<0)){free(sr); return ret;} + if(OP_UNLIKELY(ret<0))return ret; /*If there's any trailing junk, forget about it.*/ _of->end=sr[0].offset+sr[0].size; - if(OP_UNLIKELY(_of->endendserialnos,&_of->nserialnos,&_of->cserialnos); - free(sr); - return ret; } static int op_open_seekable2(OggOpusFile *_of){ ogg_sync_state oy_start; - ogg_stream_state *os_start = (ogg_stream_state*)malloc(sizeof(ogg_stream_state)); + ogg_stream_state os_start; ogg_packet *op_start; opus_int64 prev_page_offset; opus_int64 start_offset; @@ -1449,9 +1435,9 @@ static int op_open_seekable2(OggOpusFile *_of){ start_op_count=_of->op_count; /*This is a bit too large to put on the stack unconditionally.*/ op_start=(ogg_packet *)_ogg_malloc(sizeof(*op_start)*start_op_count); - if(op_start==NULL){free(os_start); return OP_EFAULT;} + if(op_start==NULL)return OP_EFAULT; *&oy_start=_of->oy; - *os_start=_of->os; + *&os_start=_of->os; prev_page_offset=_of->prev_page_offset; start_offset=_of->offset; memcpy(op_start,_of->op,sizeof(*op_start)*start_op_count); @@ -1463,7 +1449,7 @@ static int op_open_seekable2(OggOpusFile *_of){ ogg_stream_clear(&_of->os); ogg_sync_clear(&_of->oy); *&_of->oy=*&oy_start; - *&_of->os=*os_start; + *&_of->os=*&os_start; _of->offset=start_offset; _of->op_count=start_op_count; memcpy(_of->op,op_start,sizeof(*_of->op)*start_op_count); @@ -1471,10 +1457,9 @@ static int op_open_seekable2(OggOpusFile *_of){ _of->prev_packet_gp=_of->links[0].pcm_start; _of->prev_page_offset=prev_page_offset; _of->cur_discard_count=_of->links[0].head.pre_skip; - if(OP_UNLIKELY(ret<0)){free(os_start); return ret;} + if(OP_UNLIKELY(ret<0))return ret; /*And restore the position indicator.*/ ret=(*_of->callbacks.seek)(_of->stream,op_position(_of),SEEK_SET); - free(os_start); return OP_UNLIKELY(ret<0)?OP_EREAD:0; } @@ -1995,7 +1980,7 @@ static int op_fetch_and_process_page(OggOpusFile *_of, ogg_stream_pagein(&_of->os,&og); if(OP_LIKELY(_of->ready_state>=OP_INITSET)){ opus_int32 total_duration; - int *durations = (int*)malloc(255 * sizeof(int)); + int durations[255]; int op_count; int report_hole; report_hole=0; @@ -2052,7 +2037,7 @@ static int op_fetch_and_process_page(OggOpusFile *_of, Proceed to the next link, rather than risk playing back some samples that shouldn't have been played.*/ _of->op_count=0; - if(report_hole){ free(durations); return OP_HOLE; } + if(report_hole)return OP_HOLE; continue; } /*By default discard 80 ms of data after a seek, unless we seek @@ -2160,9 +2145,9 @@ static int op_fetch_and_process_page(OggOpusFile *_of, _of->prev_page_offset=_page_offset; _of->op_count=op_count=pi; } - if(report_hole) { free(durations); return OP_HOLE; } + if(report_hole)return OP_HOLE; /*If end-trimming didn't trim all the packets, we're done.*/ - if(op_count>0) { free(durations); return 0; } + if(op_count>0)return 0; } } } @@ -3016,7 +3001,7 @@ static const float OP_STEREO_DOWNMIX[OP_NCHANNELS_MAX-2][OP_NCHANNELS_MAX][2]={ #endif #if defined(OP_FIXED_POINT) -#if 0 + /*Matrices for downmixing from the supported channel counts to stereo. The matrices with 5 or more channels are normalized to a total volume of 2.0, since most mixes sound too quiet if normalized to 1.0 (as there is generally @@ -3025,6 +3010,7 @@ static const float OP_STEREO_DOWNMIX[OP_NCHANNELS_MAX-2][OP_NCHANNELS_MAX][2]={ 32-bit number.*/ static const opus_int16 OP_STEREO_DOWNMIX_Q14 [OP_NCHANNELS_MAX-2][OP_NCHANNELS_MAX][2]={ +#if OP_NCHANNELS_MAX>2 /*3.0*/ { {9598,0},{6786,6786},{0,9598} @@ -3051,8 +3037,9 @@ static const opus_int16 OP_STEREO_DOWNMIX_Q14 {6368,0},{4502,4502},{0,6368},{5515,3183},{3183,5515},{5515,3183}, {3183,5515},{4502,4502} } +#endif // OP_NCHANNELS_MAX>2 }; -#endif + int op_read(OggOpusFile *_of,opus_int16 *_pcm,int _buf_size,int *_li){ return op_read_native(_of,_pcm,_buf_size,_li); } @@ -3070,7 +3057,6 @@ static int op_stereo_filter(OggOpusFile *_of,void *_dst,int _dst_sz, for(i=0;i<_nsamples;i++)dst[2*i+0]=dst[2*i+1]=_src[i]; } else{ -#if 0 for(i=0;i<_nsamples;i++){ opus_int32 l; opus_int32 r; @@ -3086,8 +3072,6 @@ static int op_stereo_filter(OggOpusFile *_of,void *_dst,int _dst_sz, dst[2*i+0]=(opus_int16)OP_CLAMP(-32768,l+8192>>14,32767); dst[2*i+1]=(opus_int16)OP_CLAMP(-32768,r+8192>>14,32767); } -#endif - // noop, removed for RAM savings } } return _nsamples; diff --git a/lib/lib_audio/ESP8266Audio/src/opusfile/opusfile.h b/lib/lib_audio/ESP8266Audio/src/opusfile/opusfile.h index 11cc07a16..7a007d24d 100644 --- a/lib/lib_audio/ESP8266Audio/src/opusfile/opusfile.h +++ b/lib/lib_audio/ESP8266Audio/src/opusfile/opusfile.h @@ -729,7 +729,7 @@ struct OpusServerInfo{ /**The software used by the origin server (Server). This is NULL if there was no Server header.*/ char *server; - /**The media type of the entity sent to the recipient (Content-Type). + /**The media type of the entity sent to the recepient (Content-Type). This is NULL if there was no Content-Type header.*/ char *content_type; diff --git a/lib/lib_basic/TasmotaLED/src/TasmotaLED.cpp b/lib/lib_basic/TasmotaLED/src/TasmotaLED.cpp index d323c20ab..1e5c982c7 100644 --- a/lib/lib_basic/TasmotaLED/src/TasmotaLED.cpp +++ b/lib/lib_basic/TasmotaLED/src/TasmotaLED.cpp @@ -24,13 +24,15 @@ #include "TasmotaLED.h" // DRAM_ATTR to force in IRAM because we use this in show loop -static const DRAM_ATTR uint8_t TASMOTALED_CHANNEL_ORDERS[6][3] = { - {1, 0, 2}, // GRB (0) - {2, 0, 1}, // GBR (1) +static const DRAM_ATTR uint8_t TASMOTALED_CHANNEL_ORDERS[8][3] = { + {1, 0, 2}, // Def=GRB (0) + {1, 0, 2}, // GRB (1) {0, 1, 2}, // RGB (2) {0, 2, 1}, // RBG (3) {2, 1, 0}, // BRG (4) - {1, 2, 0} // BGR (5) + {1, 2, 0}, // BGR (5) + {2, 0, 1}, // GBR (6) + {1, 0, 2} // GRB (7) // fallback if erroneous value }; static const TasmotaLED_Timing TasmotaLED_Timings[] = { @@ -61,8 +63,6 @@ enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_D TasmotaLED::TasmotaLED(uint16_t type, uint16_t num_leds) : _type(type), - _pixel_order((type >> 4) & 0x07), - _w_before(type & 0x08), _timing((type >> 8) & 0xFF), _started(false), _dirty(true), @@ -70,19 +70,17 @@ TasmotaLED::TasmotaLED(uint16_t type, uint16_t num_leds) : _pixel_count(num_leds), _buf_work(nullptr), _buf_show(nullptr), - _pixel_matrix(&TASMOTALED_CHANNEL_ORDERS[0]), _pusher(nullptr) { + _adjustSubType(); // compute values for _pixel_order, _w_before, _pixel_matrix if (_timing > (TasmotaLed_TimingEnd >> 8)) { _timing = 0; } switch (_type & 0x0F) { - // case TasmotaLed_1_W: - // _pixel_size = 1; - // break; case TasmotaLed_4_WRGB: _pixel_size = 4; break; + case TasmotaLed_1_Def: case TasmotaLed_3_RGB: default: // fallback _pixel_size = 3; @@ -109,6 +107,35 @@ TasmotaLED::~TasmotaLED() { _buf_show = nullptr; } +// Adjust all internal parameters accouring to sub-type +void TasmotaLED::_adjustSubType(void) { + _pixel_order = (_type >> 4) & 0x07; + _pixel_matrix = &TASMOTALED_CHANNEL_ORDERS[_pixel_order]; + _w_before = _type & 0x08; +} + +void TasmotaLED::SetPixelCount(uint16_t num_leds) { + if (num_leds != _pixel_count) { + _pixel_count = num_leds; + delete _buf_work; + _buf_work = new uint8_t[_pixel_count * _pixel_size]; + memset(_buf_work, 0, _pixel_count * _pixel_size); + delete _buf_show; + _buf_show = new uint8_t[_pixel_count * _pixel_size]; + memset(_buf_show, 0, _pixel_count * _pixel_size); + if (_pusher) { + _pusher->SetPixelCount(_pixel_count); + } + } +} + +void TasmotaLED::SetPixelSubType(uint8_t subtype) { + // subtype is only the 8 lower bits of _type + _type = (_type & 0xFF00) | (subtype & 0xFF); + _adjustSubType(); +} + + // Color is passed as 0xWWRRGGBB and copied as WWRRGGBB in _buf_work void TasmotaLED::ClearTo(uint32_t wrgb, int32_t first, int32_t last) { // adjust first and last to be in range of 0 to _pixel_count-1 diff --git a/lib/lib_basic/TasmotaLED/src/TasmotaLED.h b/lib/lib_basic/TasmotaLED/src/TasmotaLED.h index dd2fb8dc9..6df882361 100644 --- a/lib/lib_basic/TasmotaLED/src/TasmotaLED.h +++ b/lib/lib_basic/TasmotaLED/src/TasmotaLED.h @@ -22,16 +22,17 @@ enum TasmotaLEDTypesEncoding : uint16_t { // bits 0..3 encode for number of bytes per pixel - TasmotaLed_1_W = 0x0, // 1 byte per pixel (not used yet) - TasmotaLed_3_RGB = 0x1, // 3 bytes per pixel - TasmotaLed_4_WRGB = 0x2, // 4 bytes per pixel + TasmotaLed_1_Def = 0x0, // Default value - identical to TasmotaLed_3_RGB + TasmotaLed_3_RGB = 0x1, // 3 bytes per pixel + TasmotaLed_4_WRGB = 0x2, // 4 bytes per pixel // bits 4..6 encode for pixel order - TasmotaLed_GRB = 0b000 << 4, - TasmotaLed_GBR = 0b001 << 4, + TasmotaLed_Def = 0b000 << 4, // Default value - identical to TasmotaLed_GRB + TasmotaLed_GRB = 0b001 << 4, TasmotaLed_RGB = 0b010 << 4, TasmotaLed_RBG = 0b011 << 4, TasmotaLed_BRG = 0b100 << 4, TasmotaLed_BGR = 0b101 << 4, + TasmotaLed_GBR = 0b110 << 4, // bit 7 sets the position for W channel TasmotaLed_xxxW = 0b0 << 7, // W channel after color TasmotaLed_Wxxx = 0b1 << 7, // W channel before color @@ -91,6 +92,10 @@ public: TasmotaLED(uint16_t type, uint16_t num_leds); ~TasmotaLED(); + void SetPixelCount(uint16_t num_leds); + void SetPixelSubType(uint8_t type); // change only Pixel order and pixel size + void _adjustSubType(void); + bool Begin(void); void SetPusher(TasmotaLEDPusher *pusher); // needs to be called before `Begin()`, sets the hardware implementation void Show(void); // pushes the pixels to the LED strip diff --git a/lib/lib_basic/TasmotaLED/src/TasmotaLEDPusher.h b/lib/lib_basic/TasmotaLED/src/TasmotaLEDPusher.h index 89b402997..f25b06cf5 100644 --- a/lib/lib_basic/TasmotaLED/src/TasmotaLEDPusher.h +++ b/lib/lib_basic/TasmotaLED/src/TasmotaLEDPusher.h @@ -93,6 +93,7 @@ public: } virtual bool Push(uint8_t *buf) = 0; virtual bool CanShow(void) = 0; + virtual bool SetPixelCount(uint16_t pixel_count) = 0; static uint32_t ResolveHardware(uint32_t hw); // convert to the appropriate hardware acceleration based on capacities of the SOC static TasmotaLEDPusher * Create(uint32_t hw, int8_t gpio); // create instance for the provided type, or nullptr if failed @@ -118,6 +119,7 @@ public: ~TasmotaLEDPusherRMT(); bool Begin(uint16_t pixel_count, uint16_t pixel_size, const TasmotaLED_Timing * led_timing) override; + bool SetPixelCount(uint16_t pixel_count) override; bool Push(uint8_t *buf) override; bool CanShow(void) override; @@ -152,6 +154,7 @@ public: ~TasmotaLEDPusherSPI(); bool Begin(uint16_t pixel_count, uint16_t pixel_size, const TasmotaLED_Timing * led_timing) override; + bool SetPixelCount(uint16_t pixel_count) override; bool Push(uint8_t *buf) override; bool CanShow(void) override; diff --git a/lib/lib_basic/TasmotaLED/src/TasmotaLEDPusherRMT.cpp b/lib/lib_basic/TasmotaLED/src/TasmotaLEDPusherRMT.cpp index d6ca12197..592efc047 100644 --- a/lib/lib_basic/TasmotaLED/src/TasmotaLEDPusherRMT.cpp +++ b/lib/lib_basic/TasmotaLED/src/TasmotaLEDPusherRMT.cpp @@ -213,6 +213,15 @@ bool TasmotaLEDPusherRMT::Begin(uint16_t pixel_count, uint16_t pixel_size, const return true; } +bool TasmotaLEDPusherRMT::SetPixelCount(uint16_t pixel_count) { + if (!_initialized) { return false; } + if (pixel_count > 0 && _pixel_count != pixel_count) { + _pixel_count = pixel_count; + return true; + } + return true; +} + bool TasmotaLEDPusherRMT::CanShow(void) { if (_channel && _initialized) { return (ESP_OK == rmt_tx_wait_all_done(_channel, 0)); diff --git a/lib/lib_basic/TasmotaLED/src/TasmotaLEDPusherSPI.cpp b/lib/lib_basic/TasmotaLED/src/TasmotaLEDPusherSPI.cpp index 74366ebb8..c2ebb2eb0 100644 --- a/lib/lib_basic/TasmotaLED/src/TasmotaLEDPusherSPI.cpp +++ b/lib/lib_basic/TasmotaLED/src/TasmotaLEDPusherSPI.cpp @@ -104,7 +104,7 @@ TasmotaLEDPusherSPI::TasmotaLEDPusherSPI(int8_t pin) : _pin(pin) { .sclk_io_num = -1, .quadwp_io_num = -1, .quadhd_io_num = -1, - .max_transfer_sz = _pixel_count * _pixel_size * SPI_BYTES_PER_COLOR_BYTE, + .max_transfer_sz = 0, // _pixel_count * _pixel_size * SPI_BYTES_PER_COLOR_BYTE, }; _err = spi_bus_initialize(spi_host, &spi_bus_cfg, _with_dma ? SPI_DMA_CH_AUTO : SPI_DMA_DISABLED); if (_err == ESP_OK) { @@ -176,6 +176,39 @@ err: return false; } +bool TasmotaLEDPusherSPI::SetPixelCount(uint16_t pixel_count) { + if (!_initialized) { return false; } + if (pixel_count > 0 && _pixel_count != pixel_count) { + _pixel_count = pixel_count; + + if (_spi_strip.pixel_buf) { + heap_caps_free(_spi_strip.pixel_buf); + _spi_strip.pixel_buf = nullptr; + } + + _spi_strip.strip_len = _pixel_count; + uint32_t mem_caps = MALLOC_CAP_DEFAULT; + if (_with_dma) { // TODO + // DMA buffer must be placed in internal SRAM + mem_caps |= MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA; + } + _spi_strip.pixel_buf = (uint8_t *)heap_caps_calloc(1, _pixel_count * _pixel_size * SPI_BYTES_PER_COLOR_BYTE, mem_caps); + if (_spi_strip.pixel_buf == nullptr) { + AddLog(LOG_LEVEL_INFO, PSTR("LED: Error no mem for spi strip")); + if (_spi_strip.spi_device) { + spi_bus_remove_device(_spi_strip.spi_device); + } + if (_spi_strip.spi_host) { + spi_bus_free(_spi_strip.spi_host); + } + _initialized = false; + return false; + } + return true; + } + return true; +} + bool TasmotaLEDPusherSPI::CanShow(void) { return _initialized; // TODO } diff --git a/lib/lib_display/UDisplay/uDisplay.cpp b/lib/lib_display/UDisplay/uDisplay.cpp index 96b59e3dd..c998da0ab 100755 --- a/lib/lib_display/UDisplay/uDisplay.cpp +++ b/lib/lib_display/UDisplay/uDisplay.cpp @@ -1225,12 +1225,19 @@ Renderer *uDisplay::Init(void) { _panel_config->de_gpio_num = de; _panel_config->pclk_gpio_num = pclk; + // assume that byte swapping of 16-bit color is done only upon request + // via display.ini and not by callers of pushColor() + // -> swap bytes by swapping GPIO numbers + int8_t *par_db8 = lvgl_param.swap_color ? par_dbl : par_dbh; for (uint32_t cnt = 0; cnt < 8; cnt ++) { - _panel_config->data_gpio_nums[cnt] = par_dbh[cnt]; + _panel_config->data_gpio_nums[cnt] = par_db8[cnt]; } + par_db8 = lvgl_param.swap_color ? par_dbh : par_dbl; for (uint32_t cnt = 0; cnt < 8; cnt ++) { - _panel_config->data_gpio_nums[cnt + 8] = par_dbl[cnt]; + _panel_config->data_gpio_nums[cnt + 8] = par_db8[cnt]; } + lvgl_param.swap_color = 0; + _panel_config->disp_gpio_num = GPIO_NUM_NC; _panel_config->flags.disp_active_low = 0; @@ -1781,9 +1788,6 @@ void uDisplay::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) { if (interface == _UDSP_RGB) { #ifdef USE_ESP32_S3 - if (lvgl_param.swap_color) { - color = color << 8 | color >> 8; - } if (cur_rot > 0) { while (h--) { drawPixel_RGB(x , y , color); @@ -1854,9 +1858,6 @@ void uDisplay::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) { if (interface == _UDSP_RGB) { #ifdef USE_ESP32_S3 - if (lvgl_param.swap_color) { - color = color << 8 | color >> 8; - } if (cur_rot > 0) { while (w--) { drawPixel_RGB(x , y , color); @@ -2228,7 +2229,6 @@ void uDisplay::pushColorsMono(uint16_t *data, uint16_t len, bool rgb16_swap) { static inline void lvgl_color_swap(uint16_t *data, uint16_t len) { for (uint32_t i = 0; i < len; i++) (data[i] = data[i] << 8 | data[i] >> 8); } void uDisplay::pushColors(uint16_t *data, uint16_t len, boolean not_swapped) { - uint16_t color; if (lvgl_param.swap_color) { not_swapped = !not_swapped; @@ -2238,63 +2238,21 @@ void uDisplay::pushColors(uint16_t *data, uint16_t len, boolean not_swapped) { // Isolating _UDSP_RGB to increase code sharing // - // LVGL documentation suggest to call the following: - // lv_draw_sw_rgb565_swap() to invert bytes - // esp_lcd_panel_draw_bitmap() to paste bytes - // but it appears to be faster to include the color swap in the copy loop - // because the CPU is much faster than PSRAM (SPI bus), therefore - // swapping bytes on the fly costs zero performance - // - // not_swapped == false : called from LVGL bytes are swapped - // not_swapped == true : called from displaytext, no byte swap, currently no dma here + // Use ESP-IDF LCD driver to push colors and rely on the following assumptions: + // * bytes swapping is already handled in the driver configuration (see uDisplay::Init()), + // * pushColors() is only called with not_swapped equals true, + // * cache flushing is done by the LCD driver. if (interface == _UDSP_RGB) { #ifdef USE_ESP32_S3 + if (!not_swapped) { + // internal error -> write error message but continue (with possibly wrong colors) + AddLog(LOG_LEVEL_ERROR, PSTR("DSP: Unexpected byte-swapping requested in pushColors()")); + } + // check that bytes count matches the size of area, and remove from inner loop if ((seta_yp2 - seta_yp1) * (seta_xp2 - seta_xp2) > len) { return; } - uint16_t lenc = len; - - if (cur_rot > 0) { - for (uint32_t y = seta_yp1; y < seta_yp2; y++) { - seta_yp1++; - for (uint32_t x = seta_xp1; x < seta_xp2; x++) { - uint16_t color = *data++; - if (!not_swapped) { color = color << 8 | color >> 8; } - drawPixel_RGB(x, y, color); - lenc--; - if (!lenc) return; // failsafe - exist if len (pixel number) is exhausted - } - } - } else { - uint16_t *fb_y = rgb_fb + (int32_t)seta_yp1 * _width; - for (uint32_t y = seta_yp1; y < seta_yp2; y++) { - uint16_t * fb_xy = fb_y + seta_xp1; - // we get the 'not_swapped' test outside of the inner loop - if (not_swapped) { - for (uint32_t x = seta_xp1; x < seta_xp2; x++) { - uint16_t color = *data++; - *fb_xy = color; - fb_xy++; - lenc--; - if (!lenc) break; // failsafe - exist if len (pixel number) is exhausted - } - } else { - for (uint32_t x = seta_xp1; x < seta_xp2; x++) { - uint16_t color = *data++; - color = color << 8 | color >> 8; - *fb_xy = color; - fb_xy++; - lenc--; - if (!lenc) break; // failsafe - exist if len (pixel number) is exhausted - } - } - uint16_t * flush_ptr = rgb_fb + (int32_t)seta_yp1 * _width + seta_xp1; - Cache_WriteBack_Addr((uint32_t)flush_ptr, (seta_xp2 - seta_xp1) * 2); - fb_y += _width; - seta_yp1++; - if (!lenc) break; - } - } + esp_lcd_panel_draw_bitmap(_panel_handle, seta_xp1, seta_yp1, seta_xp2, seta_yp2, (void *)data); #endif return; } @@ -2329,6 +2287,7 @@ void uDisplay::pushColors(uint16_t *data, uint16_t len, boolean not_swapped) { uint8_t *line = (uint8_t*)malloc(len * 3); uint8_t *lp = line; if (line) { + uint16_t color; for (uint32_t cnt = 0; cnt < len; cnt++) { color = *data++; color = (color << 8) | (color >> 8); @@ -2463,9 +2422,6 @@ void uDisplay::drawPixel(int16_t x, int16_t y, uint16_t color) { #ifdef USE_ESP32_S3 if (interface == _UDSP_RGB) { - if (lvgl_param.swap_color) { - color = color << 8 | color >> 8; - } drawPixel_RGB(x, y, color); return; } @@ -2548,6 +2504,15 @@ void uDisplay::setRotation(uint8_t rotation) { break; } +#ifdef USE_ESP32_S3 + if (interface == _UDSP_RGB) { + // utilize the ESP-IDF LCD driver's support for display rotation: + // mirror x axis for rotation 1 and 2, mirror y axis for rotation 2 and 3 + esp_lcd_panel_mirror(_panel_handle, rotation == 1 || rotation == 2, rotation & 2); + // swap x/y for rotation 1 and 3 + esp_lcd_panel_swap_xy(_panel_handle, rotation & 1); + } +#endif // USE_ESP32_S3 } void udisp_bpwr(uint8_t on); diff --git a/lib/lib_div/QuickESPNow/LICENSE.md b/lib/lib_div/QuickESPNow/LICENSE.md new file mode 100644 index 000000000..21cd757e4 --- /dev/null +++ b/lib/lib_div/QuickESPNow/LICENSE.md @@ -0,0 +1,19 @@ +# Copyright (c) 2022 gmag11@github + +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. diff --git a/lib/lib_div/QuickESPNow/README.md b/lib/lib_div/QuickESPNow/README.md new file mode 100644 index 000000000..d5fccb7f4 --- /dev/null +++ b/lib/lib_div/QuickESPNow/README.md @@ -0,0 +1,80 @@ +# Quick ESP-NOW + +[![PlatformIO Registry](https://badges.registry.platformio.org/packages/gmag11/library/QuickEspNow.svg)](https://registry.platformio.org/libraries/gmag11/QuickEspNow) + +## Introduction + +This fork includes a change to the rx_cb signature for compatibility with the 5.x Espressif IDF. + +This is a library for Arduino framework to be used with Espressif ESP8266 and ESP32 series microcontrollers. + +ESP-NOW is a wireless communication protocol that allows two devices to send data to each other without the need for a wireless network. You can read more about it here [https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html) + +## Benefits + +Usage of ESP-NOW may not be straightforward. There are some restrictions that has to be considered, as limit of number of devices, WiFi channel selection, and other factors. + +This library pretends to hide all that restrictions so that it can be used with just a few lines of code. + +Besides, it removes some limitations: + +- No more 20 devices limit. You can use ESP-NOW with **any number of devices**. Library takes control of peer registration and makes it transparent to you. +- Channel selection is not required for WiFi coexistence. +- No need to assign a role to each device. Just use it for peer to peer communication. +- **RSSI** information of every message, so that receiver can estimate how close the sender is. +- Receiver can distiguish between broadcast and unicast messages. +- Tested maximum througput, about 600 kbps continuous with default parameters. +- Encryption is not supported. Usage of ESP-NOW encryption restrict system to 6 devices. You can implement data encryption in a higher layer. +- Asynchronous Sending Mode: The send method now supports a blocking mode, returning a value only after the message send has been confirmed. It returns 0 if the message was sent successfully and a different value if there was an error. This feature ensures reliable message delivery by waiting for confirmation before proceeding withour the user needing to implement a TX callback function. +It is importatnt to know that the best performance is achieved when using asynchronous mode, as it allows the library to send messages in the background while the user code continues to run. The synchronous mode is provided for users who require a blocking send method for ease of use. +- Default Mode Change: For ease of use, the asynchronous mode is now the default configuration. This mode can be set during the `begin` function call, streamlining the setup process for new projects. This change aims to simplify the initial configuration for developers by automatically opting for the more user-friendly synchronous sending mode. If you require best performance, you can still change the mode to asynchronous by calling `begin` function with the proper parameter. + +## Performance + +I include this table to show the performance of the library. It was tested with ESP32 and ESP8266, sending messages as fastest as possible. The test has been repeated with different message lengths and using synchronous and asynchronous modes. + +| Device | broadcast/unicast | sync/async | 250 bytes | 125 bytes | 75 bytes | 35 bytes | 12 bytes | +|--------|-------------------|------------|-----------|-----------|----------|----------|-----------| +| ESP32 | broadcast | async | 640 kbps | 450 kbps | 340 kbps | 190 kbps | 75 kbps | +| ESP32 | broadcast | sync | 615 kbps | 440 kbps | 320 kbps | 180 kbps | 73 kbps | +| ESP8266| broadcast | async | 200 kbps | 100 kbps | 60 kbps | 28 kbps | 9.5 kbps | +| ESP8266| broadcast | sync | 200 kbps | 100 kbps | 60 kbps | 28 kbps | 9.5 kbps | +| ESP32 | unicast | async | 570 kbps | 400 kbps | 285 kbps | 160 kbps | 60 kbps | +| ESP32 | unicast | sync | 550 kbps | 375 kbps | 270 kbps | 150 kbps | 57 kbps | +| ESP8266| unicast | async | 200 kbps | 100 kbps | 60 kbps | 28 kbps | 9.5 kbps | +| ESP8266| unicast | sync | 200 kbps | 100 kbps | 60 kbps | 28 kbps | 9.5 kbps | + +**Note** : In previous versions of the library, esp8266 was able to send messages at 600 kBps, but it was a mistake. The actual performance is 200 kbps. The table has been updated to reflect the correct values. It was due a to a missing check to avoid sending a message before the previous one was confirmed. This check has been added in version 0.8.1. +It seems that this check is not completely mandarory and both ESP8266 and ESP32 are able to send messages correctly even if latest one has not been confirmed. I will investigate what implications this may have and if it is possible to (optionally) remove this check in future versions. + +Please note that these maximum values represent the best-case scenario without any message loss, assuming the microcontroller is not running any other tasks. + +However, it's important to consider that in synchronous mode, where the user code is blocked until the message is sent (which can take from 1 to 20 ms), the actual performance may be significantly lower depending on the rest of the code. + +On the other hand, in asynchronous mode, the `send` function returns in just 22us for both ESP32 and ESP8266, so it is not expected to have a significant impact on the rest of the code. + +Please note that the performance of ESP8266 is lower than ESP32. This may cause problems if an ESP32 is sending messages at a higher rate than the ESP8266 can handle. In such cases, the receiver may lose messages or even crash. If you need to use both devices in the same network, it is recommended to keep the message rate at a safe level for the slowest device. + +## Usage + +To get started with Quick ESP-NOW, simply call the `begin` function and set a receiving callback function if you need to receive data. Then, you can use the `send` function to send data to a specific device or use `ESPNOW_BROADCAST_ADDRESS` to send data to all listening devices on the same channel. + +```C++ +void dataReceived (uint8_t* address, uint8_t* data, uint8_t len, signed int rssi, bool broadcast) { + Serial.printf("Received message: %.*s\n", len, data); +} + +void setup () { + Serial.begin (115200); + WiFi.mode (WIFI_MODE_STA); + WiFi.disconnect (false); + quickEspNow.onDataRcvd (dataReceived); + quickEspNow.begin (1); // If you are not connected to WiFi, channel should be specified +} + +void loop () { + String message = "Hello, world!"; + quickEspNow.send (DEST_ADDR, (uint8_t*)message.c_str (), message.length ()); + delay (1000); +} +``` diff --git a/lib/lib_div/QuickESPNow/Throughput.xlsx b/lib/lib_div/QuickESPNow/Throughput.xlsx new file mode 100644 index 000000000..1ee0095bb Binary files /dev/null and b/lib/lib_div/QuickESPNow/Throughput.xlsx differ diff --git a/lib/lib_div/QuickESPNow/examples/advancedespnow/advancedespnow.cpp b/lib/lib_div/QuickESPNow/examples/advancedespnow/advancedespnow.cpp new file mode 100644 index 000000000..c7b497fae --- /dev/null +++ b/lib/lib_div/QuickESPNow/examples/advancedespnow/advancedespnow.cpp @@ -0,0 +1,78 @@ +#include +#if defined ESP32 +#include +#include +#elif defined ESP8266 +#include +#define WIFI_MODE_STA WIFI_STA +#else +#error "Unsupported platform" +#endif //ESP32 +#include + +static const String msg = "Hello ESP-NOW!"; + +#define USE_BROADCAST 1 // Set this to 1 to use broadcast communication + +#if USE_BROADCAST != 1 +// set the MAC address of the receiver for unicast +static uint8_t receiver[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0x12 }; +#define DEST_ADDR receiver +#else //USE_BROADCAST != 1 +#define DEST_ADDR ESPNOW_BROADCAST_ADDRESS +#endif //USE_BROADCAST != 1 + +bool sent = true; + +const unsigned int SEND_MSG_MSEC = 2000; + +void dataSent (uint8_t* address, uint8_t status) { + sent = true; + Serial.printf ("Message sent to " MACSTR ", status: %d\n", MAC2STR (address), status); +} + +void dataReceived (uint8_t* address, uint8_t* data, uint8_t len, signed int rssi, bool broadcast) { + Serial.print ("Received: "); + Serial.printf ("%.*s\n", len, data); + Serial.printf ("RSSI: %d dBm\n", rssi); + Serial.printf ("From: " MACSTR "\n", MAC2STR (address)); + Serial.printf ("%s\n", broadcast ? "Broadcast" : "Unicast"); +} + +void setup () { + Serial.begin (115200); + WiFi.mode (WIFI_MODE_STA); +#if defined ESP32 + WiFi.disconnect (false, true); +#elif defined ESP8266 + WiFi.disconnect (false); +#endif //ESP32 + + Serial.printf ("Connected to %s in channel %d\n", WiFi.SSID ().c_str (), WiFi.channel ()); + Serial.printf ("IP address: %s\n", WiFi.localIP ().toString ().c_str ()); + Serial.printf ("MAC address: %s\n", WiFi.macAddress ().c_str ()); + quickEspNow.begin (1, 0, false); + quickEspNow.onDataSent (dataSent); + quickEspNow.onDataRcvd (dataReceived); +} + +void loop () { + static time_t lastSend = 0; + static unsigned int counter = 0; + + // Sent flag is needed to wait for the message to be actually sent. Avoids messages dropping, maximizing throughput. + // readyToSendData() is used to avoid sending messages too fast, which can lead to messages dropping. + if (quickEspNow.readyToSendData() && sent && ((millis () - lastSend) > SEND_MSG_MSEC)) { + lastSend = millis (); + String message = String (msg) + " " + String (counter++); + sent = false; + if (!quickEspNow.send (DEST_ADDR, (uint8_t*)message.c_str (), message.length ())) { + Serial.printf (">>>>>>>>>> Message sent\n"); + } else { + Serial.printf (">>>>>>>>>> Message not sent\n"); + sent = true; // In case of error we need to set the flag to true to avoid blocking the loop + } + + } + +} diff --git a/lib/lib_div/QuickESPNow/examples/basicespnow/basicespnow.cpp b/lib/lib_div/QuickESPNow/examples/basicespnow/basicespnow.cpp new file mode 100644 index 000000000..3a1627cdd --- /dev/null +++ b/lib/lib_div/QuickESPNow/examples/basicespnow/basicespnow.cpp @@ -0,0 +1,67 @@ +#include +#if defined ESP32 +#include +#include +#elif defined ESP8266 +#include +#define WIFI_MODE_STA WIFI_STA +#else +#error "Unsupported platform" +#endif //ESP32 +#include + +static const String msg = "Hello ESP-NOW!"; + +#define USE_BROADCAST 1 // Set this to 1 to use broadcast communication + +#if USE_BROADCAST != 1 +// set the MAC address of the receiver for unicast +static uint8_t receiver[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0x12 }; +#define DEST_ADDR receiver +#else //USE_BROADCAST != 1 +#define DEST_ADDR ESPNOW_BROADCAST_ADDRESS +#endif //USE_BROADCAST != 1 + +// Send message every 2 seconds +const unsigned int SEND_MSG_MSEC = 2000; + +void dataReceived (uint8_t* address, uint8_t* data, uint8_t len, signed int rssi, bool broadcast) { + Serial.print ("Received: "); + Serial.printf ("%.*s\n", len, data); + Serial.printf ("RSSI: %d dBm\n", rssi); + Serial.printf ("From: " MACSTR "\n", MAC2STR (address)); + Serial.printf ("%s\n", broadcast ? "Broadcast" : "Unicast"); +} + +void setup () { + Serial.begin (115200); + WiFi.mode (WIFI_MODE_STA); +#if defined ESP32 + WiFi.disconnect (false, true); +#elif defined ESP8266 + WiFi.disconnect (false); +#endif //ESP32 + Serial.printf ("Connected to %s in channel %d\n", WiFi.SSID ().c_str (), WiFi.channel ()); + Serial.printf ("IP address: %s\n", WiFi.localIP ().toString ().c_str ()); + Serial.printf ("MAC address: %s\n", WiFi.macAddress ().c_str ()); + quickEspNow.onDataRcvd (dataReceived); +#ifdef ESP32 + quickEspNow.setWiFiBandwidth (WIFI_IF_STA, WIFI_BW_HT20); // Only needed for ESP32 in case you need coexistence with ESP8266 in the same network +#endif //ESP32 + quickEspNow.begin (1); // If you use no connected WiFi channel needs to be specified +} + +void loop () { + static unsigned int counter = 0; + + String message = String (msg) + " " + String (counter++); + if (!quickEspNow.send (DEST_ADDR, (uint8_t*)message.c_str (), message.length ())) { + Serial.println (">>>>>>>>>> Message sent"); + } else { + Serial.println (">>>>>>>>>> Message not sent"); + } + + delay (SEND_MSG_MSEC); + +} + diff --git a/lib/lib_div/QuickESPNow/examples/wifi_ap_and_espnow/wifi_ap_and_espnow.cpp b/lib/lib_div/QuickESPNow/examples/wifi_ap_and_espnow/wifi_ap_and_espnow.cpp new file mode 100644 index 000000000..501cf2fe0 --- /dev/null +++ b/lib/lib_div/QuickESPNow/examples/wifi_ap_and_espnow/wifi_ap_and_espnow.cpp @@ -0,0 +1,70 @@ +#include +#if defined ESP32 +#include +#include +#elif defined ESP8266 +#include +#define WIFI_MODE_STA WIFI_STA +#define WIFI_MODE_AP WIFI_AP +#else +#error "Unsupported platform" +#endif //ESP32 +#include + +static const String msg = "Hello esp-now from TTGO"; + +#define USE_BROADCAST 1 // Set this to 1 to use broadcast communication + +#if USE_BROADCAST != 1 +// set the MAC address of the receiver for unicast +static uint8_t receiver[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0x12 }; +#define DEST_ADDR receiver +#else //USE_BROADCAST != 1 +#define DEST_ADDR ESPNOW_BROADCAST_ADDRESS +#endif //USE_BROADCAST != 1 + +static const uint8_t CHANNEL = 1; + +void dataReceived (uint8_t* address, uint8_t* data, uint8_t len, signed int rssi, bool broadcast) { + Serial.print ("Received: "); + Serial.printf ("%.*s\n", len, data); + Serial.printf ("RSSI: %d dBm\n", rssi); + Serial.printf ("From: " MACSTR "\n", MAC2STR (address)); + Serial.printf ("%s\n", broadcast ? "Broadcast" : "Unicast"); +} + +void setup () { + Serial.begin (115200); + if (!WiFi.mode (WIFI_MODE_AP)) { + Serial.println ("WiFi mode not supported"); + } + if (!WiFi.softAP ("espnowAP", "1234567890", CHANNEL)) { + Serial.println ("WiFi access point not started"); + } + + Serial.printf ("Started AP %s in channel %d\n", WiFi.softAPSSID ().c_str (), WiFi.channel ()); + Serial.printf ("IP address: %s\n", WiFi.softAPIP ().toString ().c_str ()); + Serial.printf ("MAC address: %s\n", WiFi.softAPmacAddress ().c_str ()); +#ifdef ESP32 + quickEspNow.setWiFiBandwidth (WIFI_IF_AP, WIFI_BW_HT20); // Only needed for ESP32 in case you need coexistence with ESP8266 in the same network +#endif //ESP32 + quickEspNow.onDataRcvd (dataReceived); + quickEspNow.begin (CURRENT_WIFI_CHANNEL, WIFI_IF_AP); // Same channel must be used for both AP and ESP-NOW +} + +void loop () { + static time_t lastSend = 60000; + static unsigned int counter = 0; + + if (millis () - lastSend >= 1000) { + lastSend = millis (); + String message = String (msg) + " " + String (counter++); + if (!quickEspNow.send (DEST_ADDR, (uint8_t*)message.c_str (), message.length ())) { + Serial.printf (">>>>>>>>>> Message sent\n"); + } else { + Serial.printf (">>>>>>>>>> Message not sent\n"); + } + + } + +} \ No newline at end of file diff --git a/lib/lib_div/QuickESPNow/examples/wifi_sta_and_espnow/wifi_sta_and_espnow.cpp b/lib/lib_div/QuickESPNow/examples/wifi_sta_and_espnow/wifi_sta_and_espnow.cpp new file mode 100644 index 000000000..62fbc4c5f --- /dev/null +++ b/lib/lib_div/QuickESPNow/examples/wifi_sta_and_espnow/wifi_sta_and_espnow.cpp @@ -0,0 +1,63 @@ +#include +#if defined ESP32 +#include +#include +#elif defined ESP8266 +#include +#define WIFI_MODE_STA WIFI_STA +#else +#error "Unsupported platform" +#endif //ESP32 +#include + +static const String msg = "Hello esp-now!"; + +#define USE_BROADCAST 1 // Set this to 1 to use broadcast communication + +#if USE_BROADCAST != 1 +// set the MAC address of the receiver for unicast +static uint8_t receiver[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0x12 }; +#define DEST_ADDR receiver +#else //USE_BROADCAST != 1 +#define DEST_ADDR ESPNOW_BROADCAST_ADDRESS +#endif //USE_BROADCAST != 1 + +void dataReceived (uint8_t* address, uint8_t* data, uint8_t len, signed int rssi, bool broadcast) { + Serial.print ("Received: "); + Serial.printf ("%.*s\n", len, data); + Serial.printf ("RSSI: %d dBm\n", rssi); + Serial.printf ("From: " MACSTR "\n", MAC2STR(address)); + Serial.printf ("%s\n", broadcast ? "Broadcast" : "Unicast"); +} + +void setup () { + Serial.begin (115200); + WiFi.mode (WIFI_MODE_STA); + WiFi.begin ("ssid", "pass"); + while (WiFi.status () != WL_CONNECTED) { + delay (500); + Serial.print ("."); + } + Serial.printf ("Connected to %s in channel %d\n", WiFi.SSID ().c_str (), WiFi.channel ()); + Serial.printf ("IP address: %s\n", WiFi.localIP ().toString ().c_str ()); + Serial.printf ("MAC address: %s\n", WiFi.macAddress ().c_str ()); + quickEspNow.onDataRcvd (dataReceived); + quickEspNow.begin (); // Use no parameters to start ESP-NOW on same channel as WiFi, in STA mode and synchronous send mode +} + +void loop() { + static time_t lastSend = 60000; + static unsigned int counter = 0; + + if (millis () - lastSend >= 1000) { + lastSend = millis (); + String message = String (msg) + " " + String (counter++); + if (!quickEspNow.send (DEST_ADDR, (uint8_t*)message.c_str (), message.length ())) { + Serial.printf (">>>>>>>>>> Message sent\n"); + } else { + Serial.printf (">>>>>>>>>> Message not sent\n"); + } + + } + +} \ No newline at end of file diff --git a/lib/lib_div/QuickESPNow/library.json b/lib/lib_div/QuickESPNow/library.json new file mode 100644 index 000000000..1e52b54b5 --- /dev/null +++ b/lib/lib_div/QuickESPNow/library.json @@ -0,0 +1,35 @@ +{ + "name": "QuickEspNow", + "frameworks": "arduino", + "version": "0.8.1", + "keywords": "esp-now, gateway, node, home", + "platforms": ["espressif32", "espressif8266"], + "description": "QuickEspNow is a library for ESP8266/ESP32 that allows you to send data over the ESP-NOW protocol.", + "url": "https://github.com/gmag11/QuickEspNow.git", + "authors": + { + "name": "Germán Martín", + "email": "enigmaiot@gmartin.net" + }, + "repository": + { + "type": "git", + "url": "https://github.com/gmag11/QuickEspNow.git" + }, + "examples": "examples/*/*.ino", + "license": "GPL-3.0-or-later", + "export": + { + "exclude": + [ + "docs/*", + "include/*", + "lib/*" + ] + }, + "dependencies": + { + "gmag11/QuickDebug": "0.7.0" + } +} + diff --git a/lib/lib_div/QuickESPNow/library.properties b/lib/lib_div/QuickESPNow/library.properties new file mode 100644 index 000000000..039148c96 --- /dev/null +++ b/lib/lib_div/QuickESPNow/library.properties @@ -0,0 +1,9 @@ +name=QuickEspNow +version=0.8.1 +author=German Martin +maintainer=German Martin +sentence=EspNow wrapper for ESP32 +paragraph=EspNow wrapper for ESP32 which adds simplicity and addtitional features to EspNow +category=Communication +url=https://github.com/gmag11/QuickEspNow +architectures=esp32,esp8266 diff --git a/lib/lib_div/QuickESPNow/src/Comms_hal.h b/lib/lib_div/QuickESPNow/src/Comms_hal.h new file mode 100644 index 000000000..da3a16002 --- /dev/null +++ b/lib/lib_div/QuickESPNow/src/Comms_hal.h @@ -0,0 +1,108 @@ +/** + * @file Comms_hal.h + * @author German Martin + * @brief Generic communication system abstraction layer + * + * This is the interface that communication definition should implement to be used as layer 1 on EnigmaIoT + */ +#ifndef _COMMS_HAL_h +#define _COMMS_HAL_h + +#if defined(ARDUINO) && ARDUINO >= 100 +#include "Arduino.h" +#else +#include "WProgram.h" +#endif + +//typedef void (*comms_hal_rcvd_data)(uint8_t* address, uint8_t* data, uint8_t len, signed int rssi, bool broadcast); +typedef std::function comms_hal_rcvd_data; +//typedef void (*comms_hal_sent_data)(uint8_t* address, uint8_t status); +typedef std::function comms_hal_sent_data; + +typedef enum { + COMMS_SEND_OK = 0, /**< Data was enqued for sending successfully */ + COMMS_SEND_PARAM_ERROR = -1, /**< Data was not sent due to parameter call error */ + COMMS_SEND_PAYLOAD_LENGTH_ERROR = -2, /**< Data was not sent due to payload too long */ + COMMS_SEND_QUEUE_FULL_ERROR = -3, /**< Data was not sent due to queue full */ + COMMS_SEND_MSG_ENQUEUE_ERROR = -4, /**< Data was not sent due to message queue push error */ + COMMS_SEND_CONFIRM_ERROR = -5, /**< Data was not sent due to confirmation error (only for synchronous send) */ +} comms_send_error_t; + +/** + * @brief Interface for communication subsystem abstraction layer definition + */ +class Comms_halClass { +protected: + //uint8_t gateway[ESPNOW_ADDR_LEN]; ///< @brief Gateway address + uint8_t channel; ///< @brief Comms channel to be used + + comms_hal_rcvd_data dataRcvd = 0; ///< @brief Pointer to a function to be called on every received message + comms_hal_sent_data sentResult = 0; ///< @brief Pointer to a function to be called to notify last sending status + //peerType_t _ownPeerType; ///< @brief Stores peer type, node or gateway + + /** + * @brief Communication subsistem initialization + * @param peerType Role that peer plays into the system, node or gateway. + */ + virtual bool initComms () = 0; + + +public: + Comms_halClass () {} + + /** + * @brief Setup communication environment and establish the connection from node to gateway + * @param gateway Address of gateway. It may be `NULL` in case this is used in the own gateway + * @param channel Establishes a channel for the communication. Its use depends on actual communications subsystem + * @param peerType Role that peer plays into the system, node or gateway. + * @return Returns `true` if the communication subsystem was successfully initialized, `false` otherwise + */ + virtual bool begin (uint8_t channel, uint32_t interface = 0, bool synchronousSend = true) = 0; + + /** + * @brief Terminates communication and closes all connectrions + */ + virtual void stop () = 0; + + /** + * @brief Sends data to the other peer + * @param da Destination address to send the message to + * @param data Data buffer that contain the message to be sent + * @param len Data length in number of bytes + * @return Returns sending status. 0 for success, any other value to indicate an error. + */ + virtual comms_send_error_t send (const uint8_t* da, const uint8_t* data, size_t len) = 0; + + /** + * @brief Attach a callback function to be run on every received message + * @param dataRcvd Pointer to the callback function + */ + virtual void onDataRcvd (comms_hal_rcvd_data dataRcvd) = 0; + + /** + * @brief Attach a callback function to be run after sending a message to receive its status + * @param dataRcvd Pointer to the callback function + */ + virtual void onDataSent (comms_hal_sent_data dataRcvd) = 0; + + /** + * @brief Get address length that a specific communication subsystem uses + * @return Returns number of bytes that is used to represent an address + */ + virtual uint8_t getAddressLength () = 0; + + /** + * @brief Get max message length for a specific communication subsystems + * @return Returns number of bytes of longer supported message + */ + virtual uint8_t getMaxMessageLength () = 0; + + /** + * @brief Enables or disables transmission of queued messages. Used to disable communication during wifi scan + * @param enable `true` to enable transmission, `false` to disable it + */ + virtual void enableTransmit (bool enable) = 0; +}; + +#endif + diff --git a/lib/lib_div/QuickESPNow/src/QuickEspNow.h b/lib/lib_div/QuickESPNow/src/QuickEspNow.h new file mode 100644 index 000000000..678541a36 --- /dev/null +++ b/lib/lib_div/QuickESPNow/src/QuickEspNow.h @@ -0,0 +1,12 @@ +#ifndef _QUICK_ESPNOW_h +#define _QUICK_ESPNOW_h + +#if defined ESP32 +#include "QuickEspNow_esp32.h" +#elif defined ESP8266 +#include "QuickEspNow_esp8266.h" +#else +#error "Unsupported platform" +#endif //ESP32 + +#endif //_QUICK_ESPNOW_h \ No newline at end of file diff --git a/lib/lib_div/QuickESPNow/src/QuickEspNow_esp32.cpp b/lib/lib_div/QuickESPNow/src/QuickEspNow_esp32.cpp new file mode 100644 index 000000000..1c0b19408 --- /dev/null +++ b/lib/lib_div/QuickESPNow/src/QuickEspNow_esp32.cpp @@ -0,0 +1,531 @@ +#include "QuickEspNow.h" + +#ifdef ESP32 + +QuickEspNow quickEspNow; + +constexpr auto PEERLIST_TAG = "PEERLIST"; + + +bool QuickEspNow::begin (uint8_t channel, uint32_t wifi_interface, bool synchronousSend) { + + wifi_second_chan_t ch2 = WIFI_SECOND_CHAN_NONE; + this->synchronousSend = synchronousSend; + + DEBUG_DBG (QESPNOW_TAG, "Channel: %d, Interface: %d", channel, wifi_interface); + // Set the wifi interface + switch (wifi_interface) { + case WIFI_IF_STA: + wifi_if = WIFI_IF_STA; + break; + case WIFI_IF_AP: + wifi_if = WIFI_IF_AP; + break; + default: + DEBUG_ERROR (QESPNOW_TAG, "Unknown wifi interface"); + return false; + break; + } + + // check channel + if (channel != CURRENT_WIFI_CHANNEL && (channel < MIN_WIFI_CHANNEL || channel > MAX_WIFI_CHANNEL)) { + DEBUG_ERROR (QESPNOW_TAG, "Invalid wifi channel %d", channel); + return false; + } + + // use current channel + if (channel == CURRENT_WIFI_CHANNEL) { + uint8_t ch; + esp_wifi_get_channel (&ch, &ch2); + channel = ch; + DEBUG_DBG (QESPNOW_TAG, "Current channel: %d : %d", channel, ch2); + followWiFiChannel = true; + } + setChannel (channel, ch2); + + DEBUG_INFO (QESPNOW_TAG, ARDUHAL_LOG_COLOR (ARDUHAL_LOG_COLOR_RED) "Starting ESP-NOW in in channel %u interface %s", channel, wifi_if == WIFI_IF_STA ? "STA" : "AP"); + + this->channel = channel; + + return initComms (); +} + +void QuickEspNow::stop () { + DEBUG_INFO (QESPNOW_TAG, "-------------> ESP-NOW STOP"); + if (espnowTxTask) { + vTaskDelete (espnowTxTask); + espnowTxTask = nullptr; + } + if (espnowRxTask) { + vTaskDelete (espnowRxTask); + espnowRxTask = nullptr; + } + esp_now_unregister_recv_cb (); + esp_now_unregister_send_cb (); + esp_now_deinit (); + followWiFiChannel = false; +} + +bool QuickEspNow::readyToSendData () { + return uxQueueMessagesWaiting (tx_queue) < queueSize; +} + +bool QuickEspNow::setChannel (uint8_t channel, wifi_second_chan_t ch2) { + + if (followWiFiChannel) { + DEBUG_WARN(QESPNOW_TAG, "Cannot set channel while following WiFi channel"); + return false; + } + + esp_err_t err_ok; + if ((err_ok = esp_wifi_set_promiscuous (true))) { + DEBUG_ERROR (QESPNOW_TAG, "Error setting promiscuous mode: %s", esp_err_to_name (err_ok)); + return false; + } + if ((err_ok = esp_wifi_set_channel (channel, ch2))) { // This is needed even in STA mode. If not done and using IDF > 4.0, the ESP-NOW will not work. + DEBUG_DBG (QESPNOW_TAG, "Error setting wifi channel: %d - %s", err_ok, esp_err_to_name (err_ok)); + return false; + } + if ((err_ok = esp_wifi_set_promiscuous (false))) { + DEBUG_ERROR (QESPNOW_TAG, "Error setting promiscuous mode off: %s", esp_err_to_name (err_ok)); + return false; + } + + this->channel = channel; + + return true; +} + +comms_send_error_t QuickEspNow::send (const uint8_t* dstAddress, const uint8_t* payload, size_t payload_len) { + comms_tx_queue_item_t message; + + if (!dstAddress || !payload || !payload_len) { + DEBUG_WARN (QESPNOW_TAG, "Parameters error"); + return COMMS_SEND_PAYLOAD_LENGTH_ERROR; + } + + if (payload_len > ESP_NOW_MAX_DATA_LEN) { + DEBUG_WARN (QESPNOW_TAG, "Length error. %d", payload_len); + return COMMS_SEND_PAYLOAD_LENGTH_ERROR; + } + + if (uxQueueMessagesWaiting (tx_queue) >= queueSize) { + // comms_tx_queue_item_t tempBuffer; + // xQueueReceive (tx_queue, &tempBuffer, 0); +#ifdef MEAS_TPUT + //txDataDropped += tempBuffer.payload_len; +#endif // MEAS_TPUT + //DEBUG_DBG (QESPNOW_TAG, "Message dropped"); + return COMMS_SEND_QUEUE_FULL_ERROR; + } + memcpy (message.dstAddress, dstAddress, ESP_NOW_ETH_ALEN); + message.payload_len = payload_len; + memcpy (message.payload, payload, payload_len); + + if (xQueueSend (tx_queue, &message, pdMS_TO_TICKS (10))) { +#ifdef MEAS_TPUT + txDataSent += message.payload_len; +#endif // MEAS_TPUT + DEBUG_DBG (QESPNOW_TAG, "--------- %d Comms messages queued. Len: %d", uxQueueMessagesWaiting (tx_queue), payload_len); + DEBUG_VERBOSE (QESPNOW_TAG, "--------- Ready to send is %s", readyToSend ? "true" : "false"); + DEBUG_VERBOSE (QESPNOW_TAG, "--------- SyncronousSend is %s", synchronousSend ? "true" : "false"); + if (synchronousSend) { + waitingForConfirmation = true; + DEBUG_INFO (QESPNOW_TAG, "--------- Waiting for send confirmation"); + while (waitingForConfirmation) { + taskYIELD (); + } + DEBUG_INFO (QESPNOW_TAG, "--------- Confirmation is %s", sentStatus == ESP_NOW_SEND_SUCCESS ? "true" : "false"); + return (sentStatus == ESP_NOW_SEND_SUCCESS) ? COMMS_SEND_OK : COMMS_SEND_CONFIRM_ERROR; + } + return COMMS_SEND_OK; + } else { + DEBUG_WARN (QESPNOW_TAG, "Error queuing Comms message to " MACSTR, MAC2STR (dstAddress)); + return COMMS_SEND_MSG_ENQUEUE_ERROR; + } +} + +void QuickEspNow::onDataRcvd (comms_hal_rcvd_data dataRcvd) { + this->dataRcvd = dataRcvd; +} + +#ifdef MEAS_TPUT +void QuickEspNow::calculateDataTP () { + time_t measTime = (millis () - lastDataTPMeas); + lastDataTPMeas = millis (); + + if (txDataSent > 0) { + txDataTP = txDataSent * 1000 / measTime; + //DEBUG_WARN("Meas time: %d, Data sent: %d, Data TP: %f", measTime, txDataSent, txDataTP); + txDroppedDataRatio = (float)txDataDropped / (float)txDataSent; + //DEBUG_WARN("Data dropped: %d, Drop ratio: %f", txDataDropped, txDroppedDataRatio); + txDataSent = 0; + } else { + txDataTP = 0; + txDroppedDataRatio = 0; + } + if (rxDataReceived > 0) { + rxDataTP = rxDataReceived * 1000 / measTime; + //DEBUG_WARN("Meas time: %d, Data received: %d, Data TP: %f", measTime, rxDataReceived, rxDataTP); + rxDataReceived = 0; + } else { + rxDataTP = 0; + } + txDataDropped = 0; +} + +void QuickEspNow::tp_timer_cb (void* param) { + quickEspNow.calculateDataTP (); + DEBUG_WARN (QESPNOW_TAG, "TxData TP: %.3f kbps, Drop Ratio: %.2f %%, RxDataTP: %.3f kbps", + quickEspNow.txDataTP * 8 / 1000, + quickEspNow.txDroppedDataRatio * 100, + quickEspNow.rxDataTP * 8 / 1000); +} + +#endif // MEAS_TPUT + +void QuickEspNow::onDataSent (comms_hal_sent_data sentResult) { + this->sentResult = sentResult; +} + +int32_t QuickEspNow::sendEspNowMessage (comms_tx_queue_item_t* message) { + int32_t error; + + if (!message) { + DEBUG_WARN (QESPNOW_TAG, "Message is null"); + return -1; + } + if (!(message->payload_len) || (message->payload_len > ESP_NOW_MAX_DATA_LEN)) { + DEBUG_WARN (QESPNOW_TAG, "Message length error"); + return -1; + } + + DEBUG_VERBOSE (QESPNOW_TAG, "ESP-NOW message to " MACSTR, MAC2STR (message->dstAddress)); + + + addPeer (message->dstAddress); + DEBUG_DBG (QESPNOW_TAG, "Peer added " MACSTR, MAC2STR (message->dstAddress)); + readyToSend = false; + DEBUG_VERBOSE (QESPNOW_TAG, "-------------- Ready to send: false"); + + error = esp_now_send (message->dstAddress, message->payload, message->payload_len); + DEBUG_DBG (QESPNOW_TAG, "esp now send result = %s", esp_err_to_name (error)); + if (error != ESP_OK) { + DEBUG_WARN (QESPNOW_TAG, "Error sending message: %s", esp_err_to_name (error)); + } + // if (error == ESP_OK) { + // txDataSent += message->payload_len; + // } + if (error == ESP_ERR_ESPNOW_NO_MEM) { + delay (2); + } + + return error; +} + +void QuickEspNow::espnowTxHandle () { + if (readyToSend) { + //DEBUG_WARN ("Process queue: Elements: %d", tx_queue.size ()); + comms_tx_queue_item_t message; + while (xQueueReceive (tx_queue, &message, pdMS_TO_TICKS (1000))) { + DEBUG_DBG (QESPNOW_TAG, "Comms message got from queue. %d left", uxQueueMessagesWaiting (tx_queue)); + while (!readyToSend && !synchronousSend) { + delay (0); + } + if (!sendEspNowMessage (&message)) { + DEBUG_DBG (QESPNOW_TAG, "Message to " MACSTR " sent. Len: %u", MAC2STR (message.dstAddress), message.payload_len); + } else { + DEBUG_WARN (QESPNOW_TAG, "Error sending message to " MACSTR ". Len: %u", MAC2STR (message.dstAddress), message.payload_len); + } + //message.payload_len = 0; + DEBUG_DBG (QESPNOW_TAG, "Comms message pop. Queue size %d", uxQueueMessagesWaiting (tx_queue)); + } + + } else { + DEBUG_DBG (QESPNOW_TAG, "Not ready to send"); + } +} + +void QuickEspNow::enableTransmit (bool enable) { + DEBUG_DBG (QESPNOW_TAG, "Send esp-now task %s", enable ? "enabled" : "disabled"); + if (enable) { + if (espnowTxTask_cb) { + vTaskResume (espnowTxTask); + vTaskResume (espnowRxTask); + } + } else { + if (espnowTxTask_cb) { + vTaskSuspend (espnowTxTask); + vTaskSuspend (espnowRxTask); + } + } +} + +bool QuickEspNow::addPeer (const uint8_t* peer_addr) { + esp_now_peer_info_t peer; + esp_err_t error = ESP_OK; + + if (peer_list.get_peer_number () >= ESP_NOW_MAX_TOTAL_PEER_NUM) { + DEBUG_VERBOSE (QESPNOW_TAG, "Peer list full. Deleting older"); + if (uint8_t* deleted_mac = peer_list.delete_peer ()) { + esp_now_del_peer (deleted_mac); + } else { + DEBUG_ERROR (QESPNOW_TAG, "Error deleting peer"); + return false; + } + } + + if (peer_list.peer_exists (peer_addr)) { + DEBUG_VERBOSE (QESPNOW_TAG, "Peer already exists"); + ESP_ERROR_CHECK (esp_now_get_peer (peer_addr, &peer)); + + uint8_t currentChannel = peer.channel; + DEBUG_DBG (QESPNOW_TAG, "Peer " MACSTR " is using channel %d", MAC2STR (peer_addr), currentChannel); + if (currentChannel != this->channel) { + DEBUG_DBG (QESPNOW_TAG, "Peer channel has to change from %d to %d", currentChannel, this->channel); + ESP_ERROR_CHECK_WITHOUT_ABORT (esp_now_get_peer (peer_addr, &peer)); + peer.channel = this->channel; + ESP_ERROR_CHECK_WITHOUT_ABORT (esp_now_mod_peer (&peer)); + DEBUG_ERROR (QESPNOW_TAG, "Peer channel changed to %d", this->channel); + } + return true; + } + + memcpy (peer.peer_addr, peer_addr, ESP_NOW_ETH_ALEN); + uint8_t ch; + wifi_second_chan_t secondCh; + esp_wifi_get_channel (&ch, &secondCh); + peer.channel = ch; + peer.ifidx = wifi_if; + peer.encrypt = false; + error = esp_now_add_peer (&peer); + if (!error) { + DEBUG_DBG (QESPNOW_TAG, "Peer added"); + peer_list.add_peer (peer_addr); + } else { + DEBUG_ERROR (QESPNOW_TAG, "Error adding peer: %s", esp_err_to_name (error)); + return false; + } + DEBUG_DBG (QESPNOW_TAG, "Peer " MACSTR " added on channel %u. Result 0x%X %s", MAC2STR (peer_addr), ch, error, esp_err_to_name (error)); + return error == ESP_OK; +} + +bool QuickEspNow::initComms () { + if (esp_now_init ()) { + DEBUG_ERROR (QESPNOW_TAG, "Failed to init ESP-NOW"); +// ESP.restart (); +// delay (1); + return false; + } + + esp_now_register_recv_cb (rx_cb); + esp_now_register_send_cb (reinterpret_cast(tx_cb)); + + int txQueueSize = queueSize; + if (synchronousSend) { + txQueueSize = 1; + } + + tx_queue = xQueueCreate (txQueueSize, sizeof (comms_tx_queue_item_t)); + xTaskCreateUniversal (espnowTxTask_cb, "espnow_loop", 8 * 1024, NULL, 1, &espnowTxTask, CONFIG_ARDUINO_RUNNING_CORE); + + rx_queue = xQueueCreate (queueSize, sizeof (comms_rx_queue_item_t)); + xTaskCreateUniversal (espnowRxTask_cb, "receive_handle", 4 * 1024, NULL, 1, &espnowRxTask, CONFIG_ARDUINO_RUNNING_CORE); + +#ifdef MEAS_TPUT + dataTPTimer = xTimerCreate ("espnow_tp_timer", pdMS_TO_TICKS (MEAS_TP_EVERY_MS), pdTRUE, NULL, tp_timer_cb); + xTimerStart (dataTPTimer, 0); +#endif // MEAS_TPUT + + return true; +} + +void QuickEspNow::espnowTxTask_cb (void* param) { + for (;;) { + quickEspNow.espnowTxHandle (); + } + +} + +void QuickEspNow::espnowRxHandle () { + comms_rx_queue_item_t rxMessage; + + if (xQueueReceive (rx_queue, &rxMessage, portMAX_DELAY)) { + DEBUG_DBG (QESPNOW_TAG, "Comms message got from queue. %d left", uxQueueMessagesWaiting (rx_queue)); + DEBUG_VERBOSE (QESPNOW_TAG, "Received message from " MACSTR " Len: %u", MAC2STR (rxMessage.srcAddress), rxMessage.payload_len); + DEBUG_VERBOSE (QESPNOW_TAG, "Message: %.*s", rxMessage.payload_len, rxMessage.payload); + + if (quickEspNow.dataRcvd) { + bool broadcast = !memcmp (rxMessage.dstAddress, ESPNOW_BROADCAST_ADDRESS, ESP_NOW_ETH_ALEN); + quickEspNow.dataRcvd (rxMessage.srcAddress, rxMessage.payload, rxMessage.payload_len, rxMessage.rssi, broadcast); // rssi should be in dBm but it has added almost 100 dB. Do not know why + } + } else { + DEBUG_DBG (QESPNOW_TAG, "No message in queue"); + } + +} + +void QuickEspNow::espnowRxTask_cb (void* param) { + for (;;) { + quickEspNow.espnowRxHandle (); + } +} + +void QuickEspNow::rx_cb(const esp_now_recv_info_t* esp_now_info, const uint8_t* data, int len) { + espnow_frame_format_t* espnow_data = (espnow_frame_format_t*)(data - sizeof(espnow_frame_format_t)); + wifi_promiscuous_pkt_t* promiscuous_pkt = (wifi_promiscuous_pkt_t*)(data - sizeof(wifi_pkt_rx_ctrl_t) - sizeof(espnow_frame_format_t)); + wifi_pkt_rx_ctrl_t* rx_ctrl = &promiscuous_pkt->rx_ctrl; + const uint8_t* mac_addr = esp_now_info->src_addr; + comms_rx_queue_item_t message; + + DEBUG_DBG(QESPNOW_TAG, "Received message with RSSI %d from " MACSTR " Len: %u", rx_ctrl->rssi, MAC2STR(esp_now_info->src_addr), len); + + memcpy(message.srcAddress, mac_addr, ESP_NOW_ETH_ALEN); + memcpy(message.payload, data, len); + message.payload_len = len; + message.rssi = rx_ctrl->rssi; + memcpy(message.dstAddress, espnow_data->destination_address, ESP_NOW_ETH_ALEN); + + if (uxQueueMessagesWaiting(quickEspNow.rx_queue) >= quickEspNow.queueSize) { + comms_rx_queue_item_t tempBuffer; + xQueueReceive(quickEspNow.rx_queue, &tempBuffer, 0); + DEBUG_DBG(QESPNOW_TAG, "Rx Message dropped"); + } +#ifdef MEAS_TPUT + quickEspNow.rxDataReceived += len; +#endif // MEAS_TPUT + + if (!xQueueSend(quickEspNow.rx_queue, &message, pdMS_TO_TICKS(100))) { + DEBUG_WARN(QESPNOW_TAG, "Error sending message to queue"); + } +} + +void QuickEspNow::tx_cb (uint8_t* mac_addr, uint8_t status) { + quickEspNow.readyToSend = true; + quickEspNow.sentStatus = status; + quickEspNow.waitingForConfirmation = false; + DEBUG_DBG (QESPNOW_TAG, "-------------- Ready to send: true. Status: %d", status); + if (quickEspNow.sentResult) { + quickEspNow.sentResult (mac_addr, status); + } +} + +uint8_t PeerListClass::get_peer_number () { + return peer_list.peer_number; +} + +bool PeerListClass::peer_exists (const uint8_t* mac) { + for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) { + if (memcmp (peer_list.peer[i].mac, mac, ESP_NOW_ETH_ALEN) == 0) { + if (peer_list.peer[i].active) { + peer_list.peer[i].last_msg = millis (); + DEBUG_VERBOSE (PEERLIST_TAG, "Peer " MACSTR " found. Updated last_msg", MAC2STR (mac)); + return true; + } + } + } + return false; +} + +peer_t* PeerListClass::get_peer (const uint8_t* mac) { + for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) { + if (memcmp (peer_list.peer[i].mac, mac, ESP_NOW_ETH_ALEN) == 0) { + if (peer_list.peer[i].active) { + DEBUG_VERBOSE (PEERLIST_TAG, "Peer " MACSTR " found", MAC2STR (mac)); + return &(peer_list.peer[i]); + } + } + } + return NULL; +} + +bool PeerListClass::update_peer_use (const uint8_t* mac) { + peer_t* peer = get_peer (mac); + if (peer) { + peer->last_msg = millis (); + return true; + } + return false; +} + +bool PeerListClass::add_peer (const uint8_t* mac) { + if (int i = peer_exists (mac)) { + DEBUG_VERBOSE (PEERLIST_TAG, "Peer " MACSTR " already exists", MAC2STR (mac)); + return false; + } + if (peer_list.peer_number >= ESP_NOW_MAX_TOTAL_PEER_NUM) { + //DEBUG_VERBOSE (PEERLIST_TAG, "Peer list full. Deleting older"); +#ifndef UNIT_TEST + DEBUG_ERROR (PEERLIST_TAG, "Should never happen"); +#endif + return false; + // delete_peer (); // Delete should happen in higher level + } + + for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) { + if (!peer_list.peer[i].active) { + memcpy (peer_list.peer[i].mac, mac, ESP_NOW_ETH_ALEN); + peer_list.peer[i].active = true; + peer_list.peer[i].last_msg = millis (); + peer_list.peer_number++; + DEBUG_VERBOSE (PEERLIST_TAG, "Peer " MACSTR " added. Total peers = %d", MAC2STR (mac), peer_list.peer_number); + return true; + } + } + + return false; +} + +bool PeerListClass::delete_peer (const uint8_t* mac) { + peer_t* peer = get_peer (mac); + if (peer) { + peer->active = false; + peer_list.peer_number--; + DEBUG_VERBOSE (PEERLIST_TAG, "Peer " MACSTR " deleted. Total peers = %d", MAC2STR (mac), peer_list.peer_number); + return true; + } + return false; +} + +// Delete peer with older message +uint8_t* PeerListClass::delete_peer () { + uint32_t oldest_msg = 0; + int oldest_index = -1; + uint8_t* mac = NULL; + for (int i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) { + if (peer_list.peer[i].active) { + if (peer_list.peer[i].last_msg < oldest_msg || oldest_msg == 0) { + oldest_msg = peer_list.peer[i].last_msg; + oldest_index = i; + DEBUG_VERBOSE (PEERLIST_TAG, "Peer " MACSTR " is %d ms old. Deleting", MAC2STR (peer_list.peer[i].mac), oldest_msg); + } + } + } + if (oldest_index != -1) { + peer_list.peer[oldest_index].active = false; + peer_list.peer_number--; + mac = peer_list.peer[oldest_index].mac; + DEBUG_VERBOSE (PEERLIST_TAG, "Peer " MACSTR " deleted. Last message %d ms ago. Total peers = %d", MAC2STR (mac), millis () - peer_list.peer[oldest_index].last_msg, peer_list.peer_number); + } + return mac; +} + +bool QuickEspNow::setWiFiBandwidth (wifi_interface_t iface, wifi_bandwidth_t bw) { + esp_err_t err_ok; + if ((err_ok = esp_wifi_set_bandwidth (iface, bw))) { + DEBUG_ERROR (QESPNOW_TAG, "Error setting wifi bandwidth: %s", esp_err_to_name (err_ok)); + } + return !err_ok; +} + +#ifdef UNIT_TEST +void PeerListClass::dump_peer_list () { + Serial.printf ("Number of peers %d\n", peer_list.peer_number); + for (int i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) { + if (peer_list.peer[i].active) { + Serial.printf ("Peer " MACSTR " is %d ms old\n", MAC2STR (peer_list.peer[i].mac), millis () - peer_list.peer[i].last_msg); + } + } +} +#endif // UNIT_TEST +#endif // ESP32 diff --git a/lib/lib_div/QuickESPNow/src/QuickEspNow_esp32.h b/lib/lib_div/QuickESPNow/src/QuickEspNow_esp32.h new file mode 100644 index 000000000..8de3c9c5b --- /dev/null +++ b/lib/lib_div/QuickESPNow/src/QuickEspNow_esp32.h @@ -0,0 +1,169 @@ +#ifndef _QUICK_ESPNOW_ESP32_h +#define _QUICK_ESPNOW_ESP32_h +#ifdef ESP32 + +#include "Arduino.h" +#include "Comms_hal.h" + +#include +#include + +#include +#include +#include +#include + +// Disable debug dependency if debug level is 0 +#if CORE_DEBUG_LEVEL > 0 +#include +constexpr auto QESPNOW_TAG = "QESPNOW"; +#else // CORE_DEBUG_LEVEL +#define DEBUG_ERROR(...) +#define DEBUG_INFO(...) +#define DEBUG_VERBOSE(...) +#define DEBUG_WARN(...) +#define DEBUG_DBG(...) +#endif + +//#define MEAS_TPUT + +static uint8_t ESPNOW_BROADCAST_ADDRESS[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; +static const uint8_t MIN_WIFI_CHANNEL = 0; +static const uint8_t MAX_WIFI_CHANNEL = 14; +static const uint8_t CURRENT_WIFI_CHANNEL = 255; +static const size_t ESPNOW_MAX_MESSAGE_LENGTH = 250; ///< @brief Maximum message length +static const uint8_t ESPNOW_ADDR_LEN = 6; ///< @brief Address length +static const uint8_t ESPNOW_QUEUE_SIZE = 3; ///< @brief Queue size + +#ifdef MEAS_TPUT +static const time_t MEAS_TP_EVERY_MS = 10000; ///< @brief Measurement time period +#endif // MEAS_TPUT + +typedef struct { + uint16_t frame_head; + uint16_t duration; + uint8_t destination_address[6]; + uint8_t source_address[6]; + uint8_t broadcast_address[6]; + uint16_t sequence_control; + + uint8_t category_code; + uint8_t organization_identifier[3]; // 0x18fe34 + uint8_t random_values[4]; + struct { + uint8_t element_id; // 0xdd + uint8_t lenght; // + uint8_t organization_identifier[3]; // 0x18fe34 + uint8_t type; // 4 + uint8_t version; + uint8_t body[0]; + } vendor_specific_content; +} __attribute__ ((packed)) espnow_frame_format_t; + +typedef struct { + uint8_t dstAddress[ESPNOW_ADDR_LEN]; /**< Message topic*/ + uint8_t payload[ESPNOW_MAX_MESSAGE_LENGTH]; /**< Message payload*/ + size_t payload_len; /**< Payload length*/ +} comms_tx_queue_item_t; + +typedef struct { + uint8_t srcAddress[ESPNOW_ADDR_LEN]; /**< Source Address */ + uint8_t dstAddress[ESPNOW_ADDR_LEN]; /**< Destination Address */ + uint8_t payload[ESPNOW_MAX_MESSAGE_LENGTH]; /**< Message payload */ + size_t payload_len; /**< Payload length */ + int8_t rssi; /**< RSSI */ +} comms_rx_queue_item_t; + +typedef struct { + uint8_t mac[ESP_NOW_ETH_ALEN]; + time_t last_msg; + bool active; +} peer_t; +typedef struct { + uint8_t peer_number; + peer_t peer[ESP_NOW_MAX_TOTAL_PEER_NUM]; +} peer_list_t; + +class PeerListClass { +protected: + peer_list_t peer_list; + +public: + bool peer_exists (const uint8_t* mac); + peer_t* get_peer (const uint8_t* mac); + bool update_peer_use (const uint8_t* mac); + bool delete_peer (const uint8_t* mac); + uint8_t* delete_peer (); + bool add_peer (const uint8_t* mac); + uint8_t get_peer_number (); +#ifdef UNIT_TEST + void dump_peer_list (); +#endif +}; + +class QuickEspNow : public Comms_halClass { +public: + bool begin (uint8_t channel = CURRENT_WIFI_CHANNEL, uint32_t interface = 0, bool synchronousSend = true) override; + void stop () override; + comms_send_error_t send (const uint8_t* dstAddress, const uint8_t* payload, size_t payload_len) override; + comms_send_error_t sendBcast (const uint8_t* payload, size_t payload_len) { + return send (ESPNOW_BROADCAST_ADDRESS, payload, payload_len); + } + void onDataRcvd (comms_hal_rcvd_data dataRcvd) override; + void onDataSent (comms_hal_sent_data sentResult) override; + uint8_t getAddressLength () override { return ESPNOW_ADDR_LEN; } + uint8_t getMaxMessageLength () override { return ESPNOW_MAX_MESSAGE_LENGTH; } + void enableTransmit (bool enable) override; + bool setChannel (uint8_t channel, wifi_second_chan_t ch2 = WIFI_SECOND_CHAN_NONE); + bool setWiFiBandwidth (wifi_interface_t iface = WIFI_IF_AP, wifi_bandwidth_t bw = WIFI_BW_HT20); + bool readyToSendData (); + +protected: + wifi_interface_t wifi_if; + PeerListClass peer_list; + TaskHandle_t espnowTxTask; + TaskHandle_t espnowRxTask; + +#ifdef MEAS_TPUT + unsigned long txDataSent = 0; + unsigned long rxDataReceived = 0; + unsigned long txDataDropped = 0; + time_t lastDataTPMeas = 0; + TimerHandle_t dataTPTimer; + float txDataTP = 0; + float rxDataTP = 0; + float txDroppedDataRatio = 0; + + static void tp_timer_cb (void* param); + void calculateDataTP (); +#endif // MEAS_TPUT + + bool readyToSend = true; + bool waitingForConfirmation = false; + bool synchronousSend = false; + uint8_t sentStatus; + int queueSize = ESPNOW_QUEUE_SIZE; + + QueueHandle_t tx_queue; + QueueHandle_t rx_queue; + //SemaphoreHandle_t espnow_send_mutex; + //uint8_t channel; + bool followWiFiChannel = false; + + bool initComms (); + bool addPeer (const uint8_t* peer_addr); + static void espnowTxTask_cb (void* param); + int32_t sendEspNowMessage (comms_tx_queue_item_t* message); + void espnowTxHandle (); + + static void espnowRxTask_cb (void* param); + void espnowRxHandle (); + + static void ICACHE_FLASH_ATTR rx_cb(const esp_now_recv_info_t* esp_now_info, const uint8_t* data, int len); + static void ICACHE_FLASH_ATTR tx_cb (uint8_t* mac_addr, uint8_t status); +}; + +extern QuickEspNow quickEspNow; + +#endif // ESP32 +#endif // _QUICK_ESPNOW_ESP32_h diff --git a/lib/lib_div/QuickESPNow/src/QuickEspNow_esp8266.cpp b/lib/lib_div/QuickESPNow/src/QuickEspNow_esp8266.cpp new file mode 100644 index 000000000..c6ba485d2 --- /dev/null +++ b/lib/lib_div/QuickESPNow/src/QuickEspNow_esp8266.cpp @@ -0,0 +1,368 @@ +#include "QuickEspNow.h" + +#ifdef ESP8266 + +typedef struct { + signed rssi : 8; + unsigned rate : 4; + unsigned is_group : 1; + unsigned : 1; + unsigned sig_mode : 2; + unsigned legacy_length : 12; + unsigned damatch0 : 1; + unsigned damatch1 : 1; + unsigned bssidmatch0 : 1; + unsigned bssidmatch1 : 1; + unsigned MCS : 7; + unsigned CWB : 1; + unsigned HT_length : 16; + unsigned Smoothing : 1; + unsigned Not_Sounding : 1; + unsigned : 1; + unsigned Aggregation : 1; + unsigned STBC : 2; + unsigned FEC_CODING : 1; + unsigned SGI : 1; + unsigned rxend_state : 8; + unsigned ampdu_cnt : 8; + unsigned channel : 4; + unsigned : 12; +} wifi_pkt_rx_ctrl_t; + +typedef struct { + wifi_pkt_rx_ctrl_t rx_ctrl; + uint8_t payload[0]; /* ieee80211 packet buff */ +} wifi_promiscuous_pkt_t; + +QuickEspNow quickEspNow; + +bool QuickEspNow::begin (uint8_t channel, uint32_t wifi_interface, bool synchronousSend) { + + this->synchronousSend = synchronousSend; + + DEBUG_DBG (QESPNOW_TAG, "Channel: %d, Interface: %d", channel, wifi_interface); + // Set the wifi interface + switch (wifi_interface) { + case WIFI_IF_STA: + wifi_if = WIFI_IF_STA; + break; + case WIFI_IF_AP: + wifi_if = WIFI_IF_AP; + break; + default: + DEBUG_ERROR (QESPNOW_TAG, "Unknown wifi interface"); + return false; + break; + } + + // check channel + if (channel != CURRENT_WIFI_CHANNEL && (channel < MIN_WIFI_CHANNEL || channel > MAX_WIFI_CHANNEL)) { + DEBUG_ERROR (QESPNOW_TAG, "Invalid wifi channel %d", channel); + return false; + } + + // use current channel + if (channel == CURRENT_WIFI_CHANNEL) { + uint8_t ch; + ch = WiFi.channel (); + DEBUG_DBG (QESPNOW_TAG, "Current channel: %d", ch); + channel = ch; + followWiFiChannel = true; + } else { + setChannel (channel); + } + DEBUG_INFO (QESPNOW_TAG, "Starting ESP-NOW in in channel %u interface %s", channel, wifi_if == WIFI_IF_STA ? "STA" : "AP"); + + this->channel = channel; + + return initComms (); +} + +void QuickEspNow::stop () { + DEBUG_INFO (QESPNOW_TAG, "-------------> ESP-NOW STOP"); + os_timer_disarm (&espnowTxTask); + os_timer_disarm (&espnowRxTask); + esp_now_unregister_recv_cb (); + esp_now_unregister_send_cb (); + esp_now_deinit (); + followWiFiChannel = false; +} + +bool QuickEspNow::readyToSendData () { + return tx_queue.size () < queueSize; +} + +bool QuickEspNow::setChannel (uint8_t channel) { + + if (followWiFiChannel) { + DEBUG_WARN (QESPNOW_TAG, "Cannot set channel while following WiFi channel"); + return false; + } + + if (!wifi_set_channel (channel)) { + DEBUG_ERROR (QESPNOW_TAG, "Error setting wifi channel: %u", channel); + return false; + } + + this->channel = channel; + + return true; +} + +comms_send_error_t QuickEspNow::send (const uint8_t* dstAddress, const uint8_t* payload, size_t payload_len) { + comms_tx_queue_item_t message; + + if (!dstAddress || !payload || !payload_len) { + DEBUG_WARN (QESPNOW_TAG, "Parameters error"); + return COMMS_SEND_PARAM_ERROR; + } + + if (payload_len > ESP_NOW_MAX_DATA_LEN) { + DEBUG_WARN (QESPNOW_TAG, "Length error. %d", payload_len); + return COMMS_SEND_PAYLOAD_LENGTH_ERROR; + } + + if (tx_queue.size () >= ESPNOW_QUEUE_SIZE) { +#ifdef MEAS_TPUT + //comms_tx_queue_item_t* tempBuffer; + //tempBuffer = tx_queue.front (); + //txDataDropped += tempBuffer->payload_len; +#endif // MEAS_TPUT + // tx_queue.pop (); + // DEBUG_DBG (QESPNOW_TAG, "Message dropped"); + return COMMS_SEND_QUEUE_FULL_ERROR; + } + + memcpy (message.dstAddress, dstAddress, ESP_NOW_ETH_ALEN); + message.payload_len = payload_len; + memcpy (message.payload, payload, payload_len); + + if (tx_queue.push (&message)) { +#ifdef MEAS_TPUT + txDataSent += message.payload_len; +#endif // MEAS_TPUT + DEBUG_DBG (QESPNOW_TAG, "--------- %d Comms messages queued. Len: %d", tx_queue.size (), payload_len); + DEBUG_VERBOSE (QESPNOW_TAG, "--------- Ready to send is %s", readyToSend ? "true" : "false"); + if (synchronousSend) { + waitingForConfirmation = true; + DEBUG_INFO (QESPNOW_TAG, "--------- Waiting for send confirmation"); + while (waitingForConfirmation) { +// esp_yield (); + delay(0); + } + DEBUG_INFO (QESPNOW_TAG, "--------- Confirmation is %s", sentStatus == ESP_NOW_SEND_SUCCESS ? "true" : "false"); + return (sentStatus == ESP_NOW_SEND_SUCCESS) ? COMMS_SEND_OK : COMMS_SEND_CONFIRM_ERROR; + } + return COMMS_SEND_OK; + } else { + DEBUG_WARN (QESPNOW_TAG, "Error queuing Comms message to " MACSTR, MAC2STR (dstAddress)); + return COMMS_SEND_MSG_ENQUEUE_ERROR; + } +} + +void QuickEspNow::onDataRcvd (comms_hal_rcvd_data dataRcvd) { + this->dataRcvd = dataRcvd; +} + +#ifdef MEAS_TPUT +void QuickEspNow::calculateDataTP () { + time_t measTime = (millis () - lastDataTPMeas); + lastDataTPMeas = millis (); + + if (txDataSent > 0) { + txDataTP = txDataSent * 1000 / measTime; + //DEBUG_WARN(QESPNOW_TAG, "Meas time: %d, Data sent: %d, Data TP: %f", measTime, txDataSent, txDataTP); + txDroppedDataRatio = (float)txDataDropped / (float)txDataSent; + //DEBUG_WARN(QESPNOW_TAG, "Data dropped: %d, Drop ratio: %f", txDataDropped, txDroppedDataRatio); + txDataSent = 0; + } else { + txDataTP = 0; + txDroppedDataRatio = 0; + } + if (rxDataReceived > 0) { + rxDataTP = rxDataReceived * 1000 / measTime; + //DEBUG_WARN(QESPNOW_TAG, "Meas time: %d, Data received: %d, Data TP: %f", measTime, rxDataReceived, rxDataTP); + rxDataReceived = 0; + } else { + rxDataTP = 0; + } + txDataDropped = 0; +} + +void QuickEspNow::tp_timer_cb (void* param) { + quickEspNow.calculateDataTP (); + DEBUG_WARN (QESPNOW_TAG, "TxData TP: %.3f kbps, Drop Ratio: %.2f %%, RxDataTP: %.3f kbps", + quickEspNow.txDataTP * 8 / 1000, + quickEspNow.txDroppedDataRatio * 100, + quickEspNow.rxDataTP * 8 / 1000); +} +#endif // MEAS_TPUT + +void QuickEspNow::onDataSent (comms_hal_sent_data sentResult) { + this->sentResult = sentResult; +} + +int32_t QuickEspNow::sendEspNowMessage (comms_tx_queue_item_t* message) { + int32_t error; + + if (!message) { + DEBUG_WARN (QESPNOW_TAG, "Message is null"); + return -1; + } + if (!(message->payload_len) || (message->payload_len > ESP_NOW_MAX_DATA_LEN)) { + DEBUG_WARN (QESPNOW_TAG, "Message length error"); + return -1; + } + + DEBUG_VERBOSE (QESPNOW_TAG, "ESP-NOW message to " MACSTR, MAC2STR (message->dstAddress)); + + readyToSend = false; + DEBUG_VERBOSE (QESPNOW_TAG, "-------------- Ready to send: false"); + + error = esp_now_send (message->dstAddress, message->payload, message->payload_len); + DEBUG_DBG (QESPNOW_TAG, "esp now send result = %d", error); + + return error; +} + +void QuickEspNow::espnowTxHandle () { + if (readyToSend) { + //DEBUG_WARN ("Process queue: Elements: %d", tx_queue.size ()); + comms_tx_queue_item_t* message; + while (!tx_queue.empty ()) { + if (!readyToSend) return; + message = tx_queue.front (); + DEBUG_DBG (QESPNOW_TAG, "Comms message got from queue. %d left", tx_queue.size ()); + DEBUG_VERBOSE (QESPNOW_TAG, "Ready to send is %s", readyToSend ? "true" : "false"); + DEBUG_VERBOSE (QESPNOW_TAG, "synchrnousSend is %s", synchronousSend ? "true" : "false"); + if (!sendEspNowMessage (message)) { + DEBUG_DBG (QESPNOW_TAG, "Message to " MACSTR " sent. Len: %u", MAC2STR (message->dstAddress), message->payload_len); + } else { + DEBUG_WARN (QESPNOW_TAG, "Error sending message to " MACSTR ". Len: %u", MAC2STR (message->dstAddress), message->payload_len); + } + message->payload_len = 0; + tx_queue.pop (); + DEBUG_DBG (QESPNOW_TAG, "Comms message pop. Queue size %d", tx_queue.size ()); + } + + } else { + DEBUG_DBG (QESPNOW_TAG, "Not ready to send"); + } +} + +void QuickEspNow::enableTransmit (bool enable) { + DEBUG_DBG (QESPNOW_TAG, "Send esp-now task %s", enable ? "enabled" : "disabled"); + if (enable) { + os_timer_arm (&espnowTxTask, TASK_PERIOD, true); + os_timer_arm (&espnowRxTask, TASK_PERIOD, true); + } else { + os_timer_disarm (&espnowTxTask); + os_timer_disarm (&espnowRxTask); + } +} + +bool QuickEspNow::initComms () { + if (esp_now_init ()) { + DEBUG_ERROR (QESPNOW_TAG, "Failed to init ESP-NOW"); +// ESP.restart (); +// delay (1); + return false; + } + + if (wifi_if == WIFI_IF_STA) { + esp_now_set_self_role (ESP_NOW_ROLE_SLAVE); + } else { + esp_now_set_self_role (ESP_NOW_ROLE_CONTROLLER); + } + + esp_now_register_recv_cb (reinterpret_cast(rx_cb)); + esp_now_register_send_cb (reinterpret_cast(tx_cb)); + + os_timer_setfn (&espnowTxTask, espnowTxTask_cb, NULL); + os_timer_arm (&espnowTxTask, TASK_PERIOD, true); + + os_timer_setfn (&espnowRxTask, espnowRxTask_cb, NULL); + os_timer_arm (&espnowRxTask, TASK_PERIOD, true); + +#ifdef MEAS_TPUT + os_timer_setfn (&dataTPTimer, tp_timer_cb, NULL); + os_timer_arm (&dataTPTimer, MEAS_TP_EVERY_MS, true); +#endif // MEAS_TPUT + + return true; +} + +void QuickEspNow::espnowTxTask_cb (void* param) { + quickEspNow.espnowTxHandle (); +} + +void QuickEspNow::rx_cb (uint8_t* mac_addr, uint8_t* data, uint8_t len) { + espnow_frame_format_t* espnow_data = (espnow_frame_format_t*)(data - sizeof (espnow_frame_format_t)); + wifi_promiscuous_pkt_t* promiscuous_pkt = (wifi_promiscuous_pkt_t*)(data - sizeof (wifi_pkt_rx_ctrl_t) - sizeof (espnow_frame_format_t)); + wifi_pkt_rx_ctrl_t* rx_ctrl = &promiscuous_pkt->rx_ctrl; + + comms_rx_queue_item_t message; + + DEBUG_DBG (QESPNOW_TAG, "Received message with RSSI %d from " MACSTR " Len: %u", rx_ctrl->rssi, MAC2STR (mac_addr), len); + + memcpy (message.srcAddress, mac_addr, ESP_NOW_ETH_ALEN); + memcpy (message.payload, data, len); + message.payload_len = len; + message.rssi = rx_ctrl->rssi - 100; + memcpy (message.dstAddress, espnow_data->destination_address, ESP_NOW_ETH_ALEN); + + if (quickEspNow.rx_queue.size () >= ESPNOW_QUEUE_SIZE) { + quickEspNow.tx_queue.pop (); + DEBUG_DBG (QESPNOW_TAG, "Rx Message dropped"); + } + +#ifdef MEAS_TPUT + quickEspNow.rxDataReceived += len; +#endif // MEAS_TPUT + + if (quickEspNow.rx_queue.push (&message)) { + DEBUG_DBG (QESPNOW_TAG, "Message pushed to queue"); + } else { + DEBUG_WARN (QESPNOW_TAG, "Error queuing message"); + } +} + +void QuickEspNow::espnowRxTask_cb (void* param) { + quickEspNow.espnowRxHandle (); +} + +void QuickEspNow::espnowRxHandle () { + comms_rx_queue_item_t *rxMessage; + + if (!rx_queue.empty ()) { + rxMessage = rx_queue.front (); + DEBUG_DBG (QESPNOW_TAG, "Comms message got from queue. %d left", rx_queue.size ()); + DEBUG_VERBOSE (QESPNOW_TAG, "Received message from " MACSTR " Len: %u", MAC2STR (rxMessage->srcAddress), rxMessage->payload_len); + DEBUG_VERBOSE (QESPNOW_TAG, "Message: %.*s", rxMessage->payload_len, rxMessage->payload); + + + if (quickEspNow.dataRcvd) { + bool broadcast = ! memcmp (rxMessage->dstAddress, ESPNOW_BROADCAST_ADDRESS, ESP_NOW_ETH_ALEN); + // quickEspNow.dataRcvd (mac_addr, data, len, rx_ctrl->rssi - 98); // rssi should be in dBm but it has added almost 100 dB. Do not know why + quickEspNow.dataRcvd (rxMessage->srcAddress, rxMessage->payload, rxMessage->payload_len, rxMessage->rssi, broadcast); // rssi should be in dBm but it has added almost 100 dB. Do not know why + } + + rxMessage->payload_len = 0; + rx_queue.pop (); + DEBUG_DBG (QESPNOW_TAG, "RX Comms message pop. Queue size %d", rx_queue.size ()); + } + +} + +void QuickEspNow::tx_cb (uint8_t* mac_addr, uint8_t status) { + quickEspNow.readyToSend = true; + quickEspNow.sentStatus = status; + DEBUG_DBG (QESPNOW_TAG, "-------------- Tx Confirmed %s", status == ESP_NOW_SEND_SUCCESS ? "true" : "false"); + quickEspNow.waitingForConfirmation = false; + DEBUG_DBG (QESPNOW_TAG, "-------------- Ready to send: true"); + if (quickEspNow.sentResult) { + quickEspNow.sentResult (mac_addr, status); + } +} + +#endif // ESP8266 \ No newline at end of file diff --git a/lib/lib_div/QuickESPNow/src/QuickEspNow_esp8266.h b/lib/lib_div/QuickESPNow/src/QuickEspNow_esp8266.h new file mode 100644 index 000000000..bf648b30c --- /dev/null +++ b/lib/lib_div/QuickESPNow/src/QuickEspNow_esp8266.h @@ -0,0 +1,145 @@ +#ifndef _QUICK_ESPNOW_ESP8266_h +#define _QUICK_ESPNOW_ESP8266_h +#ifdef ESP8266 + +#include "Arduino.h" +#include "Comms_hal.h" + +#include +#include +#include "RingBuffer.h" +// Disable debug dependency if debug level is 0 +#if DEBUG_LEVEL > 0 +#include +constexpr auto QESPNOW_TAG = "QESPNOW"; +#else // DEBUG_LEVEL +#define DEBUG_ERROR(...) +#define DEBUG_INFO(...) +#define DEBUG_VERBOSE(...) +#define DEBUG_WARN(...) +#define DEBUG_DBG(...) +#endif + +//#define MEAS_TPUT + +static const uint8_t ESPNOW_BROADCAST_ADDRESS[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; +static const uint8_t MIN_WIFI_CHANNEL = 0; +static const uint8_t MAX_WIFI_CHANNEL = 14; +static const uint8_t CURRENT_WIFI_CHANNEL = 255; +static const size_t ESPNOW_MAX_MESSAGE_LENGTH = 255; ///< @brief Maximum message length +static const uint8_t ESPNOW_ADDR_LEN = 6; ///< @brief Address length +static const uint8_t ESPNOW_QUEUE_SIZE = 3; ///< @brief Queue size +static const int TASK_PERIOD = 10; ///< @brief Rx and Tx tasks period +#ifdef MEAS_TPUT +static const time_t MEAS_TP_EVERY_MS = 10000; ///< @brief Measurement time period +#endif // MEAS_TPUT + +#define ESP_NOW_ETH_ALEN 6 +#define ESP_NOW_MAX_DATA_LEN 250 +#define WIFI_IF_STA STATION_IF +#define WIFI_IF_AP SOFTAP_IF + +typedef enum { + ESP_NOW_SEND_SUCCESS = 0, /**< Send ESPNOW data successfully */ + ESP_NOW_SEND_FAIL, /**< Send ESPNOW data fail */ +} esp_now_send_status_t; + +typedef struct { + uint16_t frame_head; + uint16_t duration; + uint8_t destination_address[6]; + uint8_t source_address[6]; + uint8_t broadcast_address[6]; + uint16_t sequence_control; + + uint8_t category_code; + uint8_t organization_identifier[3]; // 0x18fe34 + uint8_t random_values[4]; + struct { + uint8_t element_id; // 0xdd + uint8_t lenght; // + uint8_t organization_identifier[3]; // 0x18fe34 + uint8_t type; // 4 + uint8_t version; + uint8_t body[0]; + } vendor_specific_content; +} __attribute__ ((packed)) espnow_frame_format_t; + +typedef struct { + uint8_t dstAddress[ESPNOW_ADDR_LEN]; /**< Message topic*/ + uint8_t payload[ESPNOW_MAX_MESSAGE_LENGTH]; /**< Message payload*/ + size_t payload_len; /**< Payload length*/ +} comms_tx_queue_item_t; + +typedef struct { + uint8_t srcAddress[ESPNOW_ADDR_LEN]; /**< Source Address */ + uint8_t dstAddress[ESPNOW_ADDR_LEN]; /**< Destination Address */ + uint8_t payload[ESPNOW_MAX_MESSAGE_LENGTH]; /**< Message payload */ + size_t payload_len; /**< Payload length */ + int8_t rssi; /**< RSSI */ +} comms_rx_queue_item_t; + +class QuickEspNow : public Comms_halClass { +public: + QuickEspNow () : + tx_queue (ESPNOW_QUEUE_SIZE), rx_queue (ESPNOW_QUEUE_SIZE) {} + bool begin (uint8_t channel = 255, uint32_t interface = 0, bool synchronousSend = true) override; + void stop () override; + comms_send_error_t send (const uint8_t* dstAddress, const uint8_t* payload, size_t payload_len) override; + comms_send_error_t sendBcast (const uint8_t* payload, size_t payload_len) { + return send (ESPNOW_BROADCAST_ADDRESS, payload, payload_len); + } + void onDataRcvd (comms_hal_rcvd_data dataRcvd) override; + void onDataSent (comms_hal_sent_data sentResult) override; + uint8_t getAddressLength () override { return ESPNOW_ADDR_LEN; } + uint8_t getMaxMessageLength () override { return ESPNOW_MAX_MESSAGE_LENGTH; } + void enableTransmit (bool enable) override; + bool setChannel (uint8_t channel); + bool readyToSendData (); + +protected: + uint8_t wifi_if; + ETSTimer espnowTxTask; + ETSTimer espnowRxTask; +#ifdef MEAS_TPUT + ETSTimer dataTPTimer; + unsigned long txDataSent = 0; + unsigned long rxDataReceived = 0; + unsigned long txDataDropped = 0; + time_t lastDataTPMeas = 0; + float txDataTP = 0; + float rxDataTP = 0; + float txDroppedDataRatio = 0; + + static void tp_timer_cb (void* param); + void calculateDataTP (); +#endif // MEAS_TPUT + + bool readyToSend = true; + + bool waitingForConfirmation = false; + bool synchronousSend = false; + uint8_t sentStatus; + int queueSize = ESPNOW_QUEUE_SIZE; + + RingBuffer tx_queue; + RingBuffer rx_queue; + //uint8_t channel; + bool followWiFiChannel = false; + + bool initComms (); + static void espnowTxTask_cb (void* param); + static void espnowRxTask_cb (void* param); + int32_t sendEspNowMessage (comms_tx_queue_item_t* message); + void espnowTxHandle (); + void espnowRxHandle (); + + + static void ICACHE_FLASH_ATTR rx_cb (uint8_t* mac_addr, uint8_t* data, uint8_t len); + static void ICACHE_FLASH_ATTR tx_cb (uint8_t* mac_addr, uint8_t status); +}; + +extern QuickEspNow quickEspNow; + +#endif // ESP8266 +#endif // _QUICK_ESPNOW_ESP8266_h \ No newline at end of file diff --git a/lib/lib_div/QuickESPNow/src/RingBuffer.h b/lib/lib_div/QuickESPNow/src/RingBuffer.h new file mode 100644 index 000000000..03fa36e97 --- /dev/null +++ b/lib/lib_div/QuickESPNow/src/RingBuffer.h @@ -0,0 +1,144 @@ +/** + * @file RingBuffer.h + * @author German Martin + * @brief Library to build a gateway for EnigmaIoT system + */ + +#ifndef _RINGBUFFER_h +#define _RINGBUFFER_h + +#if defined(ARDUINO) && ARDUINO >= 100 +#include "Arduino.h" +#else +#include "WProgram.h" +#endif +// Disable debug dependency if debug level is 0 +#if DEBUG_LEVEL > 0 +#include +static const char* RINGBUFFER_DEBUG_TAG = "RINGBUFFER"; +#else // DEBUG_LEVEL +#define DEBUG_ERROR(...) +#define DEBUG_INFO(...) +#define DEBUG_VERBOSE(...) +#define DEBUG_WARN(...) +#define DEBUG_DBG(...) +#endif + + +/** + * @brief Ring buffer class. Used to implement message buffer + * + */ +template +class RingBuffer { +protected: + int maxSize; ///< @brief Buffer size + int numElements = 0; ///< @brief Number of elements that buffer currently has + int readIndex = 0; ///< @brief Pointer to next item to be read + int writeIndex = 0; ///< @brief Pointer to next position to write onto + Telement* buffer; ///< @brief Actual buffer + +public: + /** + * @brief Creates a ring buffer to hold `Telement` objects + * @param range Buffer depth + */ + RingBuffer (int range) : maxSize (range) { + buffer = new Telement[maxSize]; + } + + /** + * @brief EnigmaIOTRingBuffer destructor + * @param range Free up buffer memory + */ + ~RingBuffer () { + maxSize = 0; + delete[] (buffer); + } + + /** + * @brief Returns actual number of elements that buffer holds + * @return Returns Actual number of elements that buffer holds + */ + int size () { return numElements; } + + /** + * @brief Checks if buffer is full + * @return Returns `true`if buffer is full, `false` otherwise + */ + bool isFull () { return numElements == maxSize; } + + /** + * @brief Checks if buffer is empty + * @return Returns `true`if buffer has no elements stored, `false` otherwise + */ + bool empty () { return (numElements == 0); } + + /** + * @brief Adds a new item to buffer, deleting older element if it is full + * @param item Element to add to buffer + * @return Returns `false` if buffer was full before inserting the new element, `true` otherwise + */ + bool push (Telement* item) { + bool wasFull = isFull (); + DEBUG_DBG (RINGBUFFER_DEBUG_TAG, "Add element. Buffer was %s", wasFull ? "full" : "not full"); + DEBUG_DBG (RINGBUFFER_DEBUG_TAG, "Before -- > ReadIdx: %d. WriteIdx: %d. Size: %d", readIndex, writeIndex, numElements); +#ifdef ESP32 + portMUX_TYPE myMutex = portMUX_INITIALIZER_UNLOCKED; + portENTER_CRITICAL (&myMutex); +#endif + memcpy (&(buffer[writeIndex]), item, sizeof (Telement)); + //Serial.printf ("Copied: %d bytes\n", sizeof (Telement)); + writeIndex++; + if (writeIndex >= maxSize) { + writeIndex %= maxSize; + } + if (wasFull) { // old value is no longer valid + readIndex++; + if (readIndex >= maxSize) { + readIndex %= maxSize; + } + } else { + numElements++; + } +#ifdef ESP32 + portEXIT_CRITICAL (&myMutex); +#endif + DEBUG_DBG (RINGBUFFER_DEBUG_TAG, "After -- > ReadIdx: %d. WriteIdx: %d. Size: %d", readIndex, writeIndex, numElements); + return !wasFull; + } + + /** + * @brief Deletes older item from buffer, if buffer is not empty + * @return Returns `false` if buffer was empty before trying to delete element, `true` otherwise + */ + bool pop () { + bool wasEmpty = empty (); + DEBUG_DBG (RINGBUFFER_DEBUG_TAG, "Remove element. Buffer was %s", wasEmpty ? "empty" : "not empty"); + DEBUG_DBG (RINGBUFFER_DEBUG_TAG, "Before -- > ReadIdx: %d. WriteIdx: %d. Size: %d", readIndex, writeIndex, numElements); + if (!wasEmpty) { + readIndex++; + if (readIndex >= maxSize) { + readIndex %= maxSize; + } + numElements--; + } + DEBUG_DBG (RINGBUFFER_DEBUG_TAG, "After -- > ReadIdx: %d. WriteIdx: %d. Size: %d", readIndex, writeIndex, numElements); + return !wasEmpty; + } + + /** + * @brief Gets a pointer to older item in buffer, if buffer is not empty + * @return Returns pointer to element. If buffer was empty before calling this method it returns `NULL` + */ + Telement* front () { + DEBUG_DBG (RINGBUFFER_DEBUG_TAG, "Read element. ReadIdx: %d. WriteIdx: %d. Size: %d", readIndex, writeIndex, numElements); + if (!empty ()) { + return &(buffer[readIndex]); + } else { + return NULL; + } + } +}; + +#endif // _RINGBUFFER_h \ No newline at end of file diff --git a/lib/lib_div/QuickESPNow/test/README b/lib/lib_div/QuickESPNow/test/README new file mode 100644 index 000000000..b94d0890f --- /dev/null +++ b/lib/lib_div/QuickESPNow/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html diff --git a/lib/lib_div/QuickESPNow/test/test_peer_list/test_peer_list.cpp b/lib/lib_div/QuickESPNow/test/test_peer_list/test_peer_list.cpp new file mode 100644 index 000000000..959988927 --- /dev/null +++ b/lib/lib_div/QuickESPNow/test/test_peer_list/test_peer_list.cpp @@ -0,0 +1,135 @@ +#define UNIT_TEST + +#include +#include + + +PeerListClass PeerList; + +uint8_t macs[ESP_NOW_MAX_TOTAL_PEER_NUM+1][6] = { + {0x00,0x01,0x02,0x03,0x04,0x01}, + {0x00,0x01,0x02,0x03,0x04,0x02}, + {0x00,0x01,0x02,0x03,0x04,0x03}, + {0x00,0x01,0x02,0x03,0x04,0x04}, + {0x00,0x01,0x02,0x03,0x04,0x05}, + {0x00,0x01,0x02,0x03,0x04,0x06}, + {0x00,0x01,0x02,0x03,0x04,0x07}, + {0x00,0x01,0x02,0x03,0x04,0x08}, + {0x00,0x01,0x02,0x03,0x04,0x09}, + {0x00,0x01,0x02,0x03,0x04,0x10}, + {0x00,0x01,0x02,0x03,0x04,0x11}, + {0x00,0x01,0x02,0x03,0x04,0x12}, + {0x00,0x01,0x02,0x03,0x04,0x13}, + {0x00,0x01,0x02,0x03,0x04,0x14}, + {0x00,0x01,0x02,0x03,0x04,0x15}, + {0x00,0x01,0x02,0x03,0x04,0x16}, + {0x00,0x01,0x02,0x03,0x04,0x17}, + {0x00,0x01,0x02,0x03,0x04,0x18}, + {0x00,0x01,0x02,0x03,0x04,0x19}, + {0x00,0x01,0x02,0x03,0x04,0x20}, + {0x00,0x01,0x02,0x03,0x04,0x21} +}; + + +void setUp (void) { + // set stuff up here + Serial.begin (115200); +} + +void tearDown (void) { + // clean stuff up here +} + +void test_add_one_peer () { + uint8_t mac[6] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; + TEST_ASSERT_FALSE (PeerList.peer_exists (mac)); + TEST_ASSERT_TRUE (PeerList.add_peer (mac)); + TEST_ASSERT_TRUE (PeerList.peer_exists (mac)); + TEST_ASSERT_EQUAL (1, PeerList.get_peer_number ()); + TEST_ASSERT_TRUE (PeerList.delete_peer (mac)); + TEST_ASSERT_EQUAL (0, PeerList.get_peer_number ()); +} + +void test_add_existing_peer () { + // Serial.println ("test_add_existing_peer"); + uint8_t mac[6] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; + TEST_ASSERT_FALSE (PeerList.peer_exists (mac)); + TEST_ASSERT_TRUE(PeerList.add_peer(mac)); + TEST_ASSERT_TRUE (PeerList.peer_exists (mac)); + TEST_ASSERT_EQUAL (1, PeerList.get_peer_number ()); + TEST_ASSERT_FALSE (PeerList.add_peer (mac)); + TEST_ASSERT_EQUAL (1, PeerList.get_peer_number ()); + TEST_ASSERT_TRUE (PeerList.delete_peer (mac)); + TEST_ASSERT_EQUAL (0, PeerList.get_peer_number ()); +} + +void test_add_max_peers () { + // Serial.println ("test_add_max_peers"); + for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) { + TEST_ASSERT_FALSE (PeerList.peer_exists (macs[i])); + TEST_ASSERT_TRUE(PeerList.add_peer(macs[i])); + TEST_ASSERT_TRUE (PeerList.peer_exists (macs[i])); + TEST_ASSERT_EQUAL (i + 1, PeerList.get_peer_number ()); + } + // PeerList.dump_peer_list (); + for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) { + TEST_ASSERT_TRUE (PeerList.delete_peer (macs[i])); + TEST_ASSERT_EQUAL (ESP_NOW_MAX_TOTAL_PEER_NUM - i - 1, PeerList.get_peer_number ()); + } + // PeerList.dump_peer_list (); +} + +void test_add_max_peers_plus_1 () { + // Serial.println ("test_add_max_peers_plus_1"); + for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) { + TEST_ASSERT_FALSE (PeerList.peer_exists (macs[i])); + TEST_ASSERT_TRUE (PeerList.add_peer (macs[i])); + TEST_ASSERT_TRUE (PeerList.peer_exists (macs[i])); + TEST_ASSERT_EQUAL (i + 1, PeerList.get_peer_number ()); + } + // PeerList.dump_peer_list (); + TEST_ASSERT_FALSE (PeerList.peer_exists (macs[ESP_NOW_MAX_TOTAL_PEER_NUM])); + TEST_ASSERT_FALSE (PeerList.add_peer (macs[ESP_NOW_MAX_TOTAL_PEER_NUM])); + // PeerList.dump_peer_list (); + TEST_ASSERT_FALSE (PeerList.peer_exists (macs[ESP_NOW_MAX_TOTAL_PEER_NUM])); + TEST_ASSERT_EQUAL (ESP_NOW_MAX_TOTAL_PEER_NUM, PeerList.get_peer_number ()); + + for (uint8_t i = 0; i < ESP_NOW_MAX_TOTAL_PEER_NUM; i++) { + TEST_ASSERT_TRUE (PeerList.delete_peer ()); + TEST_ASSERT_EQUAL (ESP_NOW_MAX_TOTAL_PEER_NUM - i - 1, PeerList.get_peer_number ()); + } + // PeerList.dump_peer_list (); +} + +void process () { + UNITY_BEGIN (); + RUN_TEST (test_add_one_peer); + RUN_TEST (test_add_existing_peer); + RUN_TEST (test_add_max_peers); + RUN_TEST (test_add_max_peers_plus_1); + UNITY_END (); +} + +#ifdef ARDUINO + +#include +void setup () { + // NOTE!!! Wait for >2 secs + // if board doesn't support software reset via Serial.DTR/RTS + delay (2000); + + process (); +} + +void loop () { + delay (1); +} + +#else + +int main (int argc, char** argv) { + process (); + return 0; +} + +#endif \ No newline at end of file diff --git a/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp b/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp index 4259023e5..ce7a28270 100755 --- a/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp +++ b/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp @@ -195,6 +195,7 @@ void WiFiClientSecure_light::_clear() { _recvapp_buf = nullptr; _recvapp_len = 0; _insecure = false; // set to true when calling setPubKeyFingerprint() + _rsa_only = true; // for now we disable ECDSA by default _fingerprint_any = true; // by default accept all fingerprints _fingerprint1 = nullptr; _fingerprint2 = nullptr; @@ -813,8 +814,10 @@ extern "C" { // The tag string doesn't really matter, but it should differ depending on // key type. For ECDSA it's a fixed string. - sha1_update_len(&shactx, "ecdsa-sha2-nistp256", 19); // tag - sha1_update_len(&shactx, eckey.q, eckey.qlen); // exponent + sha1_update_len(&shactx, "ecdsa", 5); // tag + int32_t curve = htonl(eckey.curve); + sha1_update_len(&shactx, &curve, 4); // curve id as int32be + sha1_update_len(&shactx, eckey.q, eckey.qlen); // public point } #endif else { @@ -888,16 +891,27 @@ extern "C" { BR_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, BR_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, }; + static const uint16_t suites_RSA_ONLY[] = { + BR_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + }; #endif // Default initializion for our SSL clients - static void br_ssl_client_base_init(br_ssl_client_context *cc) { + static void br_ssl_client_base_init(br_ssl_client_context *cc, bool _rsa_only) { br_ssl_client_zero(cc); // forbid SSL renegotiation, as we free the Private Key after handshake br_ssl_engine_add_flags(&cc->eng, BR_OPT_NO_RENEGOTIATION); br_ssl_engine_set_versions(&cc->eng, BR_TLS12, BR_TLS12); +#ifdef ESP8266 br_ssl_engine_set_suites(&cc->eng, suites, (sizeof suites) / (sizeof suites[0])); +#else + if (_rsa_only) { + br_ssl_engine_set_suites(&cc->eng, suites_RSA_ONLY, (sizeof suites_RSA_ONLY) / (sizeof suites_RSA_ONLY[0])); + } else { + br_ssl_engine_set_suites(&cc->eng, suites, (sizeof suites) / (sizeof suites[0])); + } +#endif br_ssl_client_set_default_rsapub(cc); br_ssl_engine_set_default_rsavrfy(&cc->eng); @@ -945,7 +959,7 @@ bool WiFiClientSecure_light::_connectSSL(const char* hostName) { _ctx_present = true; _eng = &_sc->eng; // Allocation/deallocation taken care of by the _sc shared_ptr - br_ssl_client_base_init(_sc.get()); + br_ssl_client_base_init(_sc.get(), _rsa_only); if (_alpn_names && _alpn_num > 0) { br_ssl_engine_set_protocol_names(_eng, _alpn_names, _alpn_num); } diff --git a/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.h b/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.h index 792a6d48e..8ba7a33ba 100755 --- a/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.h +++ b/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.h @@ -85,6 +85,10 @@ class WiFiClientSecure_light : public WiFiClient { _fingerprint2 = f2; _fingerprint_any = f_any; _insecure = true; + _rsa_only = true; // if fingerprint, we limit to RSA only + } + void setRSAOnly(bool rsa_only) { + _rsa_only = rsa_only; } const uint8_t * getRecvPubKeyFingerprint(void) { return _recv_fingerprint; @@ -150,6 +154,7 @@ class WiFiClientSecure_light : public WiFiClient { bool _fingerprint_any; // accept all fingerprints bool _insecure; // force fingerprint + bool _rsa_only; // restrict to RSA only key exchange (no ECDSA - enabled to force RSA fingerprints) const uint8_t *_fingerprint1; // fingerprint1 to be checked against const uint8_t *_fingerprint2; // fingerprint2 to be checked against uint8_t _recv_fingerprint[20]; // fingerprint received diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp index 21bdc542e..8149b4bfa 100644 --- a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp +++ b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp @@ -315,6 +315,9 @@ int32_t analogAttach(uint32_t pin, bool output_invert) { // returns ledc chan (ledc_timer_t)timer, // timer_sel 0, // duty 0, // hpoint +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) + (ledc_sleep_mode_t) 2, +#endif { output_invert ? 1u : 0u },// output_invert }; ledc_channel_config(&ledc_channel); @@ -323,15 +326,20 @@ int32_t analogAttach(uint32_t pin, bool output_invert) { // returns ledc chan return chan; } +void analogDetach(uint32_t pin) { + if (pin_to_channel[pin] > 0) { +#if ESP_IDF_VERSION_MAJOR < 5 + ledcDetachPin(pin); +#else + ledcDetach(pin); +#endif + pin_to_channel[pin] = 0; + } +} + void analogDetachAll(void) { for (uint32_t pin = 0; pin < SOC_GPIO_PIN_COUNT; pin++) { - if (pin_to_channel[pin] > 0) { -#if ESP_IDF_VERSION_MAJOR < 5 - ledcDetachPin(pin); -#else - ledcDetach(pin); -#endif - } + analogDetach(pin); } } diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h index 99a4b1b30..079cc7a3b 100644 --- a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h +++ b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h @@ -56,6 +56,11 @@ uint8_t ledcReadResolution(uint8_t chan); // Returns: hardware channel number, or -1 if it failed int32_t analogAttach(uint32_t pin, bool output_invert = false); // returns the ledc channel, or -1 if failed. This is implicitly called by analogWrite if the channel was not already allocated +// +// analogDetach - detach attached GPIO from a hardware PWM +// +void analogDetach(uint32_t pin); + // // analogDetachAll - detach all attached GPIOs from a hardware PWM // diff --git a/lib/libesp32/HttpClientLight/src/HttpClientLight.cpp b/lib/libesp32/HttpClientLight/src/HttpClientLight.cpp index 6c35df254..1430e6a6e 100644 --- a/lib/libesp32/HttpClientLight/src/HttpClientLight.cpp +++ b/lib/libesp32/HttpClientLight/src/HttpClientLight.cpp @@ -89,6 +89,7 @@ public: { BearSSL::WiFiClientSecure_light& wcs = static_cast(client); wcs.setPubKeyFingerprint(_fingerprint_any, _fingerprint_any, true); // allow all fingerprints + wcs.setRSAOnly(false); // although we use fingerprint, we allow ECDSA return true; } diff --git a/lib/libesp32/berry/Makefile b/lib/libesp32/berry/Makefile index 2d33069fb..4442e295c 100755 --- a/lib/libesp32/berry/Makefile +++ b/lib/libesp32/berry/Makefile @@ -21,8 +21,7 @@ ifeq ($(OS), Windows_NT) # Windows PYTHON ?= python # only for windows and need python3 COC := $(PYTHON) $(COC) else - CFLAGS += -DUSE_READLINE_LIB - LIBS += -lreadline -ldl + LIBS += -ldl OS := $(shell uname) ifeq ($(OS), Linux) LFLAGS += -Wl,--export-dynamic diff --git a/lib/libesp32/berry/default/be_modtab.c b/lib/libesp32/berry/default/be_modtab.c index f6a695145..91fbd932e 100644 --- a/lib/libesp32/berry/default/be_modtab.c +++ b/lib/libesp32/berry/default/be_modtab.c @@ -217,6 +217,7 @@ be_extern_native_class(Wire); be_extern_native_class(I2C_Driver); be_extern_native_class(AXP192); be_extern_native_class(AXP202); +be_extern_native_class(AXP2102); be_extern_native_class(OneWire); be_extern_native_class(Leds_ntv); be_extern_native_class(Leds); @@ -279,6 +280,7 @@ BERRY_LOCAL bclass_array be_class_table = { &be_native_class(I2C_Driver), &be_native_class(AXP192), &be_native_class(AXP202), + &be_native_class(AXP2102), #endif // USE_I2C &be_native_class(md5), #ifdef USE_WEBCLIENT diff --git a/lib/libesp32/berry/src/be_byteslib.c b/lib/libesp32/berry/src/be_byteslib.c index 460de413e..1ddd027d5 100644 --- a/lib/libesp32/berry/src/be_byteslib.c +++ b/lib/libesp32/berry/src/be_byteslib.c @@ -18,6 +18,8 @@ #include #include "be_byteslib.h" +static const char * hex = "0123456789ABCDEF"; + /******************************************************************** ** Base64 lib from https://github.com/Densaugeo/base64_arduino ** @@ -715,7 +717,6 @@ buf_impl bytes_check_data(bvm *vm, size_t add_size) { } size_t be_bytes_tohex(char * out, size_t outsz, const uint8_t * in, size_t insz) { - static const char * hex = "0123456789ABCDEF"; const uint8_t * pin = in; char * pout = out; for (; pin < in + insz; pout += 2, pin++) { @@ -1317,7 +1318,7 @@ static int m_copy(bvm *vm) be_return(vm); /* return self */ } -/* accept bytes or int as operand */ +/* accept bytes or int or nil as operand */ static int m_connect(bvm *vm) { int argc = be_top(vm); @@ -1329,8 +1330,6 @@ static int m_connect(bvm *vm) bytes_resize(vm, &attr, attr.len + 1); /* resize */ buf_add1(&attr, be_toint(vm, 2)); m_write_attributes(vm, 1, &attr); /* update instance */ - be_pushvalue(vm, 1); - be_return(vm); /* return self */ } else if (be_isstring(vm, 2)) { const char *str = be_tostring(vm, 2); size_t str_len = strlen(str); @@ -1339,22 +1338,81 @@ static int m_connect(bvm *vm) buf_add_raw(&attr, str, str_len); m_write_attributes(vm, 1, &attr); /* update instance */ } - be_pushvalue(vm, 1); - be_return(vm); /* return self */ } else { buf_impl attr2 = m_read_attributes(vm, 2); check_ptr(vm, &attr2); bytes_resize(vm, &attr, attr.len + attr2.len); /* resize buf1 for total size */ buf_add_buf(&attr, &attr2); m_write_attributes(vm, 1, &attr); /* update instance */ - be_pushvalue(vm, 1); - be_return(vm); /* return self */ } + be_pushvalue(vm, 1); + be_return(vm); /* return self */ } be_raise(vm, "type_error", "operand must be bytes or int or string"); be_return_nil(vm); /* return self */ } +static int m_appendhex(bvm *vm) +{ + int argc = be_top(vm); + buf_impl attr = m_read_attributes(vm, 1); + check_ptr_modifiable(vm, &attr); + if (attr.fixed) { be_raise(vm, BYTES_RESIZE_ERROR, BYTES_RESIZE_MESSAGE); } + if (argc >= 2 && be_isbytes(vm, 2)) { + buf_impl attr2 = m_read_attributes(vm, 2); + check_ptr(vm, &attr2); + bytes_resize(vm, &attr, attr.len + attr2.len * 2); /* resize */ + + for (const uint8_t * pin = attr2.bufptr; pin < attr2.bufptr + attr2.len; pin++) { + buf_add1(&attr, hex[((*pin)>>4) & 0xF]); + buf_add1(&attr, hex[ (*pin) & 0xF]); + } + + m_write_attributes(vm, 1, &attr); /* update instance */ + be_pushvalue(vm, 1); + be_return(vm); /* return self */ + } + be_raise(vm, "type_error", "operand must be bytes"); + be_return_nil(vm); /* return self */ +} + +static int m_appendb64(bvm *vm) +{ + int argc = be_top(vm); + buf_impl attr = m_read_attributes(vm, 1); + check_ptr_modifiable(vm, &attr); + if (attr.fixed) { be_raise(vm, BYTES_RESIZE_ERROR, BYTES_RESIZE_MESSAGE); } + if (argc >= 2 && be_isbytes(vm, 2)) { + buf_impl attr2 = m_read_attributes(vm, 2); + check_ptr(vm, &attr2); + int32_t idx = 0; /* start from index 0 */ + int32_t len = attr2.len; /* entire len */ + if (argc >= 3 && be_isint(vm, 3)) { /* read optional idx and len */ + idx = be_toint(vm, 3); + if (idx < 0) { idx = attr2.len + idx; } /* if negative, count from end */ + if (idx < 0) { idx = 0; } /* guardrails */ + if (idx > attr2.len) { idx = attr2.len; } + if (argc >= 4 && be_isint(vm, 4)) { + len = be_toint(vm, 4); + if (len < 0) { len = 0; } + } + if (idx + len >= attr2.len) { len = attr2.len - idx; } + } + if (len > 0) { /* only if there is something to encode */ + bytes_resize(vm, &attr, attr.len + encode_base64_length(len) + 1); /* resize */ + + size_t converted = encode_base64(attr2.bufptr + idx, len, (unsigned char*)(attr.bufptr + attr.len)); + attr.len += converted; + + m_write_attributes(vm, 1, &attr); /* update instance */ + } + be_pushvalue(vm, 1); + be_return(vm); /* return self */ + } + be_raise(vm, "type_error", "operand must be bytes"); + be_return_nil(vm); /* return self */ +} + static int bytes_equal(bvm *vm, bbool iseq) { bbool ret; @@ -1841,6 +1899,8 @@ void be_load_byteslib(bvm *vm) { "reverse", m_reverse }, { "copy", m_copy }, { "append", m_connect }, + { "appendhex", m_appendhex }, + { "appendb64", m_appendb64 }, { "+", m_merge }, { "..", m_connect }, { "==", m_equal }, @@ -1894,6 +1954,8 @@ class be_class_bytes (scope: global, name: bytes) { reverse, func(m_reverse) copy, func(m_copy) append, func(m_connect) + appendhex, func(m_appendhex) + appendb64, func(m_appendb64) +, func(m_merge) .., func(m_connect) ==, func(m_equal) diff --git a/lib/libesp32/berry/src/be_byteslib.h b/lib/libesp32/berry/src/be_byteslib.h index bcf98d125..09e8a05c5 100644 --- a/lib/libesp32/berry/src/be_byteslib.h +++ b/lib/libesp32/berry/src/be_byteslib.h @@ -19,7 +19,7 @@ #define BYTES_SIZE_SOLIDIFIED -3 /* is size is -3, then the bytes object is solidified and cannot be resized nor modified */ #define BYTES_RESIZE_ERROR "attribute_error" -#define BYTES_RESIZE_MESSAGE "bytes object size if fixed and cannot be resized" +#define BYTES_RESIZE_MESSAGE "bytes object size is fixed and cannot be resized" #define BYTES_READ_ONLY_MESSAGE "bytes object is read only" /* be_raise(vm, BYTES_RESIZE_ERROR, BYTES_RESIZE_MESSAGE); */ diff --git a/lib/libesp32/berry/src/be_code.c b/lib/libesp32/berry/src/be_code.c index 9f7cf1300..7b9483974 100644 --- a/lib/libesp32/berry/src/be_code.c +++ b/lib/libesp32/berry/src/be_code.c @@ -698,7 +698,9 @@ static void setsfxvar(bfuncinfo *finfo, bopcode op, bexpdesc *e1, int src) int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2, bbool keep_reg) { /* free_e2 indicates special case where ETINDEX or ETMEMBER need to be freed if top of registers */ - bbool free_e2 = (e2->type == ETINDEX || e2->type == ETMEMBER) && (e2->v.ss.idx != e1->v.idx) && (e2->v.ss.idx == finfo->freereg - 1); + bbool free_e2 = (e2->type == ETINDEX || e2->type == ETMEMBER) && + (((e2->v.ss.idx != e1->v.idx) && (e2->v.ss.idx == finfo->freereg - 1)) || + ((e2->v.ss.obj != e1->v.idx) && (e2->v.ss.obj == finfo->freereg - 1)) ); int src = exp2reg(finfo, e2, e1->type == ETLOCAL ? e1->v.idx : -1); /* Convert e2 to kreg */ /* If e1 is a local variable, use the register */ @@ -706,7 +708,10 @@ int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2, bbool keep_reg) if (!keep_reg && (e1->type != ETLOCAL || e1->v.idx != src)) { free_expreg(finfo, e2); /* free source (checks only ETREG) */ /* TODO e2 is at top */ } else if (!keep_reg && free_e2) { - be_code_freeregs(finfo, 1); + /* remove only if we know it's not a local variable */ + if (finfo->freereg > (bbyte)be_list_count(finfo->local)) { + be_code_freeregs(finfo, 1); + } } switch (e1->type) { case ETLOCAL: /* It can't be ETREG. */ @@ -716,6 +721,8 @@ int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2, bbool keep_reg) free_expreg(finfo, e2); /* free source (checks only ETREG) */ *e2 = *e1; /* now e2 is e1 ETLOCAL */ } + } else { + *e2 = *e1; /* ETLOCAL wins over ETREG */ } break; case ETGLOBAL: /* store to grobal R(A) -> G(Bx) by global index */ diff --git a/lib/libesp32/berry/src/be_jsonlib.c b/lib/libesp32/berry/src/be_jsonlib.c index 615e8bebc..e6667dc2e 100644 --- a/lib/libesp32/berry/src/be_jsonlib.c +++ b/lib/libesp32/berry/src/be_jsonlib.c @@ -7,6 +7,7 @@ ********************************************************************/ #include "be_object.h" #include "be_mem.h" +#include "be_lexer.h" #include #include @@ -116,38 +117,6 @@ static const char* parser_null(bvm *vm, const char *json) return NULL; } -static char* load_unicode(char *dst, const char *json) -{ - int ucode = 0, i = 4; - while (i--) { - int ch = *json++; - if (ch >= '0' && ch <= '9') { - ucode = (ucode << 4) | (ch - '0'); - } else if (ch >= 'A' && ch <= 'F') { - ucode = (ucode << 4) | (ch - 'A' + 0x0A); - } else if (ch >= 'a' && ch <= 'f') { - ucode = (ucode << 4) | (ch - 'a' + 0x0A); - } else { - return NULL; - } - } - /* convert unicode to utf8 */ - if (ucode < 0x007F) { - /* unicode: 0000 - 007F -> utf8: 0xxxxxxx */ - *dst++ = (char)(ucode & 0x7F); - } else if (ucode < 0x7FF) { - /* unicode: 0080 - 07FF -> utf8: 110xxxxx 10xxxxxx */ - *dst++ = (char)(((ucode >> 6) & 0x1F) | 0xC0); - *dst++ = (char)((ucode & 0x3F) | 0x80); - } else { - /* unicode: 0800 - FFFF -> utf8: 1110xxxx 10xxxxxx 10xxxxxx */ - *dst++ = (char)(((ucode >> 12) & 0x0F) | 0xE0); - *dst++ = (char)(((ucode >> 6) & 0x03F) | 0x80); - *dst++ = (char)((ucode & 0x3F) | 0x80); - } - return dst; -} - static const char* parser_string(bvm *vm, const char *json) { if (*json == '"') { @@ -169,7 +138,7 @@ static const char* parser_string(bvm *vm, const char *json) case 'r': *dst++ = '\r'; break; case 't': *dst++ = '\t'; break; case 'u': { /* load unicode */ - dst = load_unicode(dst, json); + dst = be_load_unicode(dst, json); if (dst == NULL) { be_free(vm, buf, len); return NULL; diff --git a/lib/libesp32/berry/src/be_lexer.c b/lib/libesp32/berry/src/be_lexer.c index 4e41bf8f6..f0b74bab9 100644 --- a/lib/libesp32/berry/src/be_lexer.c +++ b/lib/libesp32/berry/src/be_lexer.c @@ -203,6 +203,38 @@ static int read_oct(blexer *lexer, const char *src) return c; } +char* be_load_unicode(char *dst, const char *src) +{ + int ucode = 0, i = 4; + while (i--) { + int ch = *src++; + if (ch >= '0' && ch <= '9') { + ucode = (ucode << 4) | (ch - '0'); + } else if (ch >= 'A' && ch <= 'F') { + ucode = (ucode << 4) | (ch - 'A' + 0x0A); + } else if (ch >= 'a' && ch <= 'f') { + ucode = (ucode << 4) | (ch - 'a' + 0x0A); + } else { + return NULL; + } + } + /* convert unicode to utf8 */ + if (ucode < 0x007F) { + /* unicode: 0000 - 007F -> utf8: 0xxxxxxx */ + *dst++ = (char)(ucode & 0x7F); + } else if (ucode < 0x7FF) { + /* unicode: 0080 - 07FF -> utf8: 110xxxxx 10xxxxxx */ + *dst++ = (char)(((ucode >> 6) & 0x1F) | 0xC0); + *dst++ = (char)((ucode & 0x3F) | 0x80); + } else { + /* unicode: 0800 - FFFF -> utf8: 1110xxxx 10xxxxxx 10xxxxxx */ + *dst++ = (char)(((ucode >> 12) & 0x0F) | 0xE0); + *dst++ = (char)(((ucode >> 6) & 0x03F) | 0x80); + *dst++ = (char)((ucode & 0x3F) | 0x80); + } + return dst; +} + static void tr_string(blexer *lexer) { char *dst, *src, *end; @@ -215,32 +247,42 @@ static void tr_string(blexer *lexer) be_lexerror(lexer, "unfinished string"); break; case '\\': - switch (*src) { - case 'a': c = '\a'; break; - case 'b': c = '\b'; break; - case 'f': c = '\f'; break; - case 'n': c = '\n'; break; - case 'r': c = '\r'; break; - case 't': c = '\t'; break; - case 'v': c = '\v'; break; - case '\\': c = '\\'; break; - case '\'': c = '\''; break; - case '"': c = '"'; break; - case '?': c = '?'; break; - case 'x': c = read_hex(lexer, ++src); ++src; break; - default: - c = read_oct(lexer, src); - if (c != EOS) { - src += 2; + if (*src != 'u') { + switch (*src) { + case 'a': c = '\a'; break; + case 'b': c = '\b'; break; + case 'f': c = '\f'; break; + case 'n': c = '\n'; break; + case 'r': c = '\r'; break; + case 't': c = '\t'; break; + case 'v': c = '\v'; break; + case '\\': c = '\\'; break; + case '\'': c = '\''; break; + case '"': c = '"'; break; + case '?': c = '?'; break; + case 'x': c = read_hex(lexer, ++src); ++src; break; + default: + c = read_oct(lexer, src); + if (c != EOS) { + src += 2; + } + break; + } + ++src; + *dst++ = (char)c; + } else { + /* unicode encoding, ex "\uF054" is equivalent to "\xEF\x81\x94"*/ + dst = be_load_unicode(dst, src + 1); + src += 5; + if (dst == NULL) { + be_lexerror(lexer, "incorrect '\\u' encoding"); } - break; } - ++src; break; default: + *dst++ = (char)c; break; } - *dst++ = (char)c; } lexer->buf.len = dst - lexbuf(lexer); } diff --git a/lib/libesp32/berry/src/be_lexer.h b/lib/libesp32/berry/src/be_lexer.h index e166a1a64..fdbcc1d4f 100644 --- a/lib/libesp32/berry/src/be_lexer.h +++ b/lib/libesp32/berry/src/be_lexer.h @@ -136,5 +136,6 @@ int be_lexer_scan_next(blexer *lexer); bstring* be_lexer_newstr(blexer *lexer, const char *str); const char *be_token2str(bvm *vm, btoken *token); const char* be_tokentype2str(btokentype type); +char* be_load_unicode(char *dst, const char *src); #endif diff --git a/lib/libesp32/berry/tests/bytes.be b/lib/libesp32/berry/tests/bytes.be index 1f58118e7..0cdc8334b 100644 --- a/lib/libesp32/berry/tests/bytes.be +++ b/lib/libesp32/berry/tests/bytes.be @@ -155,6 +155,11 @@ assert(str(b1) == "bytes('AA')") b1.append('01') assert(str(b1) == "bytes('AA3031')") +#- appendhex -# +assert(bytes().appendhex(bytes("DEADBEEF")) == bytes("4445414442454546")) +assert(bytes("AABBCC").appendhex(bytes("DEADBEEF")) == bytes("AABBCC4445414442454546")) +assert(bytes("AABBCC").appendhex(bytes("")) == bytes("AABBCC")) + #- item -# b = bytes("334455") assert(b[0] == 0x33) @@ -325,3 +330,22 @@ assert(bytes("02")) a = bytes("01020304") assert(a.get(1, 3) == 0x040302) assert(a.get(1, -3) == 0x020304) + +# append base64 +b = bytes("AABBCC") +c = bytes("001122") +assert(bytes().fromstring(bytes("001122").tob64()) == bytes('41424569')) +assert(b.appendb64(c) == bytes("AABBCC41424569")) +assert(b.appendb64(bytes()) == bytes("AABBCC41424569")) + +b = bytes("AABBCC") +assert(bytes().fromstring(bytes("1122").tob64()) == bytes('4553493D')) +assert(b.appendb64(c, 1) == bytes("AABBCC4553493D")) + +b = bytes("AABBCC") +assert(bytes().fromstring(bytes("22").tob64()) == bytes('49673D3D')) +assert(b.appendb64(c, 2) == bytes("AABBCC49673D3D")) + +b = bytes("AABBCC") +assert(bytes().fromstring(bytes("11").tob64()) == bytes('45513D3D')) +assert(b.appendb64(c, 1, 1) == bytes("AABBCC45513D3D")) diff --git a/lib/libesp32/berry/tests/lexer.be b/lib/libesp32/berry/tests/lexer.be index db2945bc7..8470d779c 100644 --- a/lib/libesp32/berry/tests/lexer.be +++ b/lib/libesp32/berry/tests/lexer.be @@ -36,6 +36,27 @@ check(45.1e2, 4510) check(45.e2, 4500) check(45.e+2, 4500) +# unicode encoding from JSON +assert(bytes().fromstring("a").tohex() == "61") +assert(bytes().fromstring("\uF054").tohex() == "EF8194") +assert(bytes().fromstring("\uF054\uF055").tohex() == "EF8194EF8195") +assert(bytes().fromstring("a\uF054b").tohex() == "61EF819462") +# 1 byte +assert(bytes().fromstring("\u0061").tohex() == "61") +# 2 bytes +assert(bytes().fromstring("\u0088").tohex() == "C288") +assert(bytes().fromstring("\u0288").tohex() == "CA88") +# 3 bytes +assert(bytes().fromstring("\u1288").tohex() == "E18A88") + +assert(bytes().fromstring("\uFFFF").tohex() == "EFBFBF") + +# bad unicode encoding +test_source('"\\u"', "incorrect '\\u' encoding") +test_source('"\\u1"', "incorrect '\\u' encoding") +test_source('"\\u22"', "incorrect '\\u' encoding") +test_source('"\\u333"', "incorrect '\\u' encoding") + # Ensure pathologically long numbers don't crash the lexer (or cause an buffer overflow) assert(000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 == 0.0); diff --git a/lib/libesp32/berry/tests/parser.be b/lib/libesp32/berry/tests/parser.be index 2b64b4c50..014ffe0da 100644 --- a/lib/libesp32/berry/tests/parser.be +++ b/lib/libesp32/berry/tests/parser.be @@ -9,3 +9,17 @@ def f() end end assert(f() == 2) + +# Parser error reported in Feb 2025 +def parse_022025() + var s, value + var js = {'a':{'a':1}} + value = js['a']['a'] + + if value != nil + for x:0..1 + return x + end + end +end +assert(parse_022025() == 0) diff --git a/lib/libesp32/berry_animate/src/embedded/animate_2_animate_effects.be b/lib/libesp32/berry_animate/src/embedded/animate_2_animate_effects.be index d2653db67..6132b406a 100644 --- a/lib/libesp32/berry_animate/src/embedded/animate_2_animate_effects.be +++ b/lib/libesp32/berry_animate/src/embedded/animate_2_animate_effects.be @@ -148,6 +148,131 @@ class Animate_pulse : Animate_painter end animate.pulse = global.Animate_pulse +########################################################################################## +# +# class Animate_crenel +# +# Display a color crenel +# +# pos (1) +# | +# v (*4) +# ______ ____ +# | | | +# _________| |_________| +# +# | 2 | 3 | +# +# 1: `pos`, start of the pulse (in pixel) +# 2: `pulse_size`, number of pixels of the pulse +# 3: `low_size`, number of pixel until next pos - full cycle is 3 + 4 +# 4: `nb_pulse`, number of pulses, of `-1` is infinite +# +########################################################################################## + +#@ solidify:Animate_crenel,weak +class Animate_crenel : Animate_painter + var color + var back_color + var pos + var pulse_size + var low_size + var nb_pulse + + def init(color, pulse_size, low_size, nb_pulse) + super(self).init() + + if (color == nil) color = 0xFFFFFF end # white by default + if (pulse_size == nil) pulse_size = 1 end + if (low_size == nil) low_size = 3 end + if (nb_pulse == nil) nb_pulse = -1 end + + self.color = color + self.back_color = 0xFF000000 # default to transparent + if pulse_size < 0 pulse_size = 0 end + self.pulse_size = pulse_size + if low_size < 0 low_size = 0 end + self.low_size = low_size + self.nb_pulse = nb_pulse + self.pos = 0 + end + + ## + ## Setters - to be used as cb for animators + ## + def set_color(color) + self.color = color + end + + def set_back_color(c) + self.back_color = c + end + + def set_pos(pos) + self.pos = pos + end + + def set_pulse_size(pulse_size) + self.pulse_size = pulse_size + end + + def set_nb_pulse(nb_pulse) + self.nb_pulse = nb_pulse + end + + def set_low_size(low_size) + self.low_size = low_size + end + + # return true if buffer was filled successfully + def paint(frame) + var back_color = self.back_color + if (back_color != 0xFF000000) + frame.fill_pixels(back_color) # fill with transparent color + end + var pos = self.pos + var pulse_size = self.pulse_size + var low_size = self.low_size + var color = self.color + var pixel_size = frame.pixel_size + var period = int(pulse_size + low_size) + var nb_pulse = self.nb_pulse + if (period <= 0) period = 1 end # make sure with have a meaningful period so we can iterate on it + + if (nb_pulse == 0) return end # nothing to paint + if (nb_pulse < 0) + # in case of infinite number of crenels, we find the position of the first visible falling range `(pos + pulse_size - 1)` + pos = ((pos + pulse_size - 1) % period) - pulse_size + 1 + else + while (pos < -period) && (nb_pulse != 0) + pos += period + nb_pulse -= 1 + end + end + + while (pos < pixel_size) && (nb_pulse != 0) # we iterate on pos (by `period` ranges) + var i = 0 + if (pos < 0) + i = - pos + end + # invariant: pos + i >= 0 + if type(self.color) == 'int' + while (i < pulse_size) && (pos + i < pixel_size) + frame[pos + i] = color + i += 1 + end + elif type(self.color) == 'instance' + self.color.get_color(tasmota.scale_int(i, 0, pulse_size - 1, 0, 255)) + end + pos += period + nb_pulse -= 1 + end + + return true + end +end +animate.crenel = global.Animate_crenel + # # Unit tests # @@ -183,4 +308,109 @@ pulse.set_slew_size(0) pulse.paint(frame) assert(frame.tohex() == '00000000000000000000000000000000000000000000000000000000000000000000000000000000') +# test for crenel + +frame = animate.frame(10) +assert(frame.tohex() == '00000000000000000000000000000000000000000000000000000000000000000000000000000000') + +var crenel = animate.crenel(0x00FF00, 2, 3, -1) +crenel.paint(frame) +assert(frame.tohex() == '00FF000000FF000000000000000000000000000000FF000000FF0000000000000000000000000000') + +crenel.set_back_color(0x00000000) +crenel.set_pos(1) +crenel.paint(frame) +assert(frame.tohex() == '0000000000FF000000FF000000000000000000000000000000FF000000FF00000000000000000000') + +crenel.set_back_color(0x00000000) +crenel.set_low_size(1) +crenel.paint(frame) +assert(frame.tohex() == '0000000000FF000000FF00000000000000FF000000FF00000000000000FF000000FF000000000000') + +crenel.set_back_color(0x00000000) +crenel.set_pos(0) +crenel.paint(frame) +assert(frame.tohex() == '00FF000000FF00000000000000FF000000FF00000000000000FF000000FF00000000000000FF0000') + +crenel.set_back_color(0x00000000) +crenel.set_nb_pulse(2) +crenel.paint(frame) +assert(frame.tohex() == '00FF000000FF00000000000000FF000000FF00000000000000000000000000000000000000000000') + + +crenel = animate.crenel(0xFFEEDD, 2, 3, 2) +crenel.set_back_color(0x00000000) +crenel.paint(frame) +assert(frame.tohex() == 'DDEEFF00DDEEFF00000000000000000000000000DDEEFF00DDEEFF00000000000000000000000000') + +crenel.set_back_color(0x00000000) +crenel.set_pos(-1) +crenel.paint(frame) +assert(frame.tohex() == 'DDEEFF00000000000000000000000000DDEEFF00DDEEFF0000000000000000000000000000000000') + +crenel.set_back_color(0x00000000) +crenel.set_pos(-2) +crenel.paint(frame) +assert(frame.tohex() == '000000000000000000000000DDEEFF00DDEEFF000000000000000000000000000000000000000000') + +crenel.set_back_color(0x00000000) +crenel.set_pos(-3) +crenel.paint(frame) +assert(frame.tohex() == '0000000000000000DDEEFF00DDEEFF00000000000000000000000000000000000000000000000000') + +crenel.set_back_color(0x00000000) +crenel.set_pos(-4) +crenel.paint(frame) +assert(frame.tohex() == '00000000DDEEFF00DDEEFF0000000000000000000000000000000000000000000000000000000000') + +crenel.set_back_color(0x00000000) +crenel.set_pos(-5) +crenel.paint(frame) +assert(frame.tohex() == 'DDEEFF00DDEEFF000000000000000000000000000000000000000000000000000000000000000000') + +crenel.set_back_color(0x00000000) +crenel.set_pos(-6) +crenel.paint(frame) +assert(frame.tohex() == 'DDEEFF00000000000000000000000000000000000000000000000000000000000000000000000000') + +crenel.set_back_color(0x00000000) +crenel.set_pos(-7) +crenel.paint(frame) +assert(frame.tohex() == '00000000000000000000000000000000000000000000000000000000000000000000000000000000') + +crenel.set_back_color(0x00000000) +crenel.set_pos(-8) +crenel.paint(frame) +assert(frame.tohex() == '00000000000000000000000000000000000000000000000000000000000000000000000000000000') + +crenel.set_back_color(0x00000000) +crenel.set_pos(1) +crenel.paint(frame) +assert(frame.tohex() == '00000000DDEEFF00DDEEFF00000000000000000000000000DDEEFF00DDEEFF000000000000000000') + +crenel.set_back_color(0x00000000) +crenel.set_pos(2) +crenel.paint(frame) +assert(frame.tohex() == '0000000000000000DDEEFF00DDEEFF00000000000000000000000000DDEEFF00DDEEFF0000000000') + +crenel.set_back_color(0x00000000) +crenel.set_pos(3) +crenel.paint(frame) +assert(frame.tohex() == '000000000000000000000000DDEEFF00DDEEFF00000000000000000000000000DDEEFF00DDEEFF00') + +crenel.set_back_color(0x00000000) +crenel.set_pos(4) +crenel.paint(frame) +assert(frame.tohex() == '00000000000000000000000000000000DDEEFF00DDEEFF00000000000000000000000000DDEEFF00') + +crenel.set_back_color(0x00000000) +crenel.set_pos(5) +crenel.paint(frame) +assert(frame.tohex() == '0000000000000000000000000000000000000000DDEEFF00DDEEFF00000000000000000000000000') + +crenel.set_back_color(0x00000000) +crenel.set_pulse_size(10) +crenel.paint(frame) +assert(frame.tohex() == '0000000000000000000000000000000000000000DDEEFF00DDEEFF00DDEEFF00DDEEFF00DDEEFF00') + end diff --git a/lib/libesp32/berry_animate/src/solidify/solidified_animate_2_animate_effects.h b/lib/libesp32/berry_animate/src/solidify/solidified_animate_2_animate_effects.h index 28805c5fc..c5200d9b0 100644 --- a/lib/libesp32/berry_animate/src/solidify/solidified_animate_2_animate_effects.h +++ b/lib/libesp32/berry_animate/src/solidify/solidified_animate_2_animate_effects.h @@ -416,5 +416,370 @@ be_local_class(Animate_pulse, })), be_str_weak(Animate_pulse) ); +// compact class 'Animate_crenel' ktab size: 19, total: 34 (saved 120 bytes) +static const bvalue be_ktab_class_Animate_crenel[19] = { + /* K0 */ be_nested_str_weak(pulse_size), + /* K1 */ be_nested_str_weak(back_color), + /* K2 */ be_const_int(-16777216), + /* K3 */ be_nested_str_weak(fill_pixels), + /* K4 */ be_nested_str_weak(pos), + /* K5 */ be_nested_str_weak(low_size), + /* K6 */ be_nested_str_weak(color), + /* K7 */ be_nested_str_weak(pixel_size), + /* K8 */ be_nested_str_weak(nb_pulse), + /* K9 */ be_const_int(0), + /* K10 */ be_const_int(1), + /* K11 */ be_nested_str_weak(int), + /* K12 */ be_nested_str_weak(instance), + /* K13 */ be_nested_str_weak(get_color), + /* K14 */ be_nested_str_weak(tasmota), + /* K15 */ be_nested_str_weak(scale_int), + /* K16 */ be_nested_str_weak(init), + /* K17 */ be_const_int(16777215), + /* K18 */ be_const_int(3), +}; + + +extern const bclass be_class_Animate_crenel; + +/******************************************************************** +** Solidified function: set_pulse_size +********************************************************************/ +be_local_closure(class_Animate_crenel_set_pulse_size, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Animate_crenel, /* shared constants */ + be_str_weak(set_pulse_size), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: paint +********************************************************************/ +be_local_closure(class_Animate_crenel_paint, /* name */ + be_nested_proto( + 20, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Animate_crenel, /* shared constants */ + be_str_weak(paint), + &be_const_str_solidified, + ( &(const binstruction[83]) { /* code */ + 0x88080101, // 0000 GETMBR R2 R0 K1 + 0x200C0502, // 0001 NE R3 R2 K2 + 0x780E0002, // 0002 JMPF R3 #0006 + 0x8C0C0303, // 0003 GETMET R3 R1 K3 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0x880C0104, // 0006 GETMBR R3 R0 K4 + 0x88100100, // 0007 GETMBR R4 R0 K0 + 0x88140105, // 0008 GETMBR R5 R0 K5 + 0x88180106, // 0009 GETMBR R6 R0 K6 + 0x881C0307, // 000A GETMBR R7 R1 K7 + 0x60200009, // 000B GETGBL R8 G9 + 0x00240805, // 000C ADD R9 R4 R5 + 0x7C200200, // 000D CALL R8 1 + 0x88240108, // 000E GETMBR R9 R0 K8 + 0x18281109, // 000F LE R10 R8 K9 + 0x782A0000, // 0010 JMPF R10 #0012 + 0x5820000A, // 0011 LDCONST R8 K10 + 0x1C281309, // 0012 EQ R10 R9 K9 + 0x782A0000, // 0013 JMPF R10 #0015 + 0x80001400, // 0014 RET 0 + 0x14281309, // 0015 LT R10 R9 K9 + 0x782A0006, // 0016 JMPF R10 #001E + 0x00280604, // 0017 ADD R10 R3 R4 + 0x0428150A, // 0018 SUB R10 R10 K10 + 0x10281408, // 0019 MOD R10 R10 R8 + 0x04281404, // 001A SUB R10 R10 R4 + 0x0028150A, // 001B ADD R10 R10 K10 + 0x5C0C1400, // 001C MOVE R3 R10 + 0x70020007, // 001D JMP #0026 + 0x44281000, // 001E NEG R10 R8 + 0x1428060A, // 001F LT R10 R3 R10 + 0x782A0004, // 0020 JMPF R10 #0026 + 0x20281309, // 0021 NE R10 R9 K9 + 0x782A0002, // 0022 JMPF R10 #0026 + 0x000C0608, // 0023 ADD R3 R3 R8 + 0x0424130A, // 0024 SUB R9 R9 K10 + 0x7001FFF7, // 0025 JMP #001E + 0x14280607, // 0026 LT R10 R3 R7 + 0x782A0028, // 0027 JMPF R10 #0051 + 0x20281309, // 0028 NE R10 R9 K9 + 0x782A0026, // 0029 JMPF R10 #0051 + 0x58280009, // 002A LDCONST R10 K9 + 0x142C0709, // 002B LT R11 R3 K9 + 0x782E0001, // 002C JMPF R11 #002F + 0x442C0600, // 002D NEG R11 R3 + 0x5C281600, // 002E MOVE R10 R11 + 0x602C0004, // 002F GETGBL R11 G4 + 0x88300106, // 0030 GETMBR R12 R0 K6 + 0x7C2C0200, // 0031 CALL R11 1 + 0x1C2C170B, // 0032 EQ R11 R11 K11 + 0x782E0009, // 0033 JMPF R11 #003E + 0x142C1404, // 0034 LT R11 R10 R4 + 0x782E0006, // 0035 JMPF R11 #003D + 0x002C060A, // 0036 ADD R11 R3 R10 + 0x142C1607, // 0037 LT R11 R11 R7 + 0x782E0003, // 0038 JMPF R11 #003D + 0x002C060A, // 0039 ADD R11 R3 R10 + 0x98041606, // 003A SETIDX R1 R11 R6 + 0x0028150A, // 003B ADD R10 R10 K10 + 0x7001FFF6, // 003C JMP #0034 + 0x7002000F, // 003D JMP #004E + 0x602C0004, // 003E GETGBL R11 G4 + 0x88300106, // 003F GETMBR R12 R0 K6 + 0x7C2C0200, // 0040 CALL R11 1 + 0x1C2C170C, // 0041 EQ R11 R11 K12 + 0x782E000A, // 0042 JMPF R11 #004E + 0x882C0106, // 0043 GETMBR R11 R0 K6 + 0x8C2C170D, // 0044 GETMET R11 R11 K13 + 0xB8361C00, // 0045 GETNGBL R13 K14 + 0x8C341B0F, // 0046 GETMET R13 R13 K15 + 0x5C3C1400, // 0047 MOVE R15 R10 + 0x58400009, // 0048 LDCONST R16 K9 + 0x0444090A, // 0049 SUB R17 R4 K10 + 0x58480009, // 004A LDCONST R18 K9 + 0x544E00FE, // 004B LDINT R19 255 + 0x7C340C00, // 004C CALL R13 6 + 0x7C2C0400, // 004D CALL R11 2 + 0x000C0608, // 004E ADD R3 R3 R8 + 0x0424130A, // 004F SUB R9 R9 K10 + 0x7001FFD4, // 0050 JMP #0026 + 0x50280200, // 0051 LDBOOL R10 1 0 + 0x80041400, // 0052 RET 1 R10 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_back_color +********************************************************************/ +be_local_closure(class_Animate_crenel_set_back_color, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Animate_crenel, /* shared constants */ + be_str_weak(set_back_color), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020201, // 0000 SETMBR R0 K1 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pos +********************************************************************/ +be_local_closure(class_Animate_crenel_set_pos, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Animate_crenel, /* shared constants */ + be_str_weak(set_pos), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020801, // 0000 SETMBR R0 K4 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_color +********************************************************************/ +be_local_closure(class_Animate_crenel_set_color, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Animate_crenel, /* shared constants */ + be_str_weak(set_color), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020C01, // 0000 SETMBR R0 K6 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_low_size +********************************************************************/ +be_local_closure(class_Animate_crenel_set_low_size, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Animate_crenel, /* shared constants */ + be_str_weak(set_low_size), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020A01, // 0000 SETMBR R0 K5 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(class_Animate_crenel_init, /* name */ + be_nested_proto( + 7, /* nstack */ + 5, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Animate_crenel, /* shared constants */ + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[34]) { /* code */ + 0x60140003, // 0000 GETGBL R5 G3 + 0x5C180000, // 0001 MOVE R6 R0 + 0x7C140200, // 0002 CALL R5 1 + 0x8C140B10, // 0003 GETMET R5 R5 K16 + 0x7C140200, // 0004 CALL R5 1 + 0x4C140000, // 0005 LDNIL R5 + 0x1C140205, // 0006 EQ R5 R1 R5 + 0x78160000, // 0007 JMPF R5 #0009 + 0x58040011, // 0008 LDCONST R1 K17 + 0x4C140000, // 0009 LDNIL R5 + 0x1C140405, // 000A EQ R5 R2 R5 + 0x78160000, // 000B JMPF R5 #000D + 0x5808000A, // 000C LDCONST R2 K10 + 0x4C140000, // 000D LDNIL R5 + 0x1C140605, // 000E EQ R5 R3 R5 + 0x78160000, // 000F JMPF R5 #0011 + 0x580C0012, // 0010 LDCONST R3 K18 + 0x4C140000, // 0011 LDNIL R5 + 0x1C140805, // 0012 EQ R5 R4 R5 + 0x78160000, // 0013 JMPF R5 #0015 + 0x5411FFFE, // 0014 LDINT R4 -1 + 0x90020C01, // 0015 SETMBR R0 K6 R1 + 0x90020302, // 0016 SETMBR R0 K1 K2 + 0x14140509, // 0017 LT R5 R2 K9 + 0x78160000, // 0018 JMPF R5 #001A + 0x58080009, // 0019 LDCONST R2 K9 + 0x90020002, // 001A SETMBR R0 K0 R2 + 0x14140709, // 001B LT R5 R3 K9 + 0x78160000, // 001C JMPF R5 #001E + 0x580C0009, // 001D LDCONST R3 K9 + 0x90020A03, // 001E SETMBR R0 K5 R3 + 0x90021004, // 001F SETMBR R0 K8 R4 + 0x90020909, // 0020 SETMBR R0 K4 K9 + 0x80000000, // 0021 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_nb_pulse +********************************************************************/ +be_local_closure(class_Animate_crenel_set_nb_pulse, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Animate_crenel, /* shared constants */ + be_str_weak(set_nb_pulse), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90021001, // 0000 SETMBR R0 K8 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Animate_crenel +********************************************************************/ +extern const bclass be_class_Animate_painter; +be_local_class(Animate_crenel, + 6, + &be_class_Animate_painter, + be_nested_map(14, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(low_size, -1), be_const_var(4) }, + { be_const_key_weak(paint, -1), be_const_closure(class_Animate_crenel_paint_closure) }, + { be_const_key_weak(color, -1), be_const_var(0) }, + { be_const_key_weak(set_pulse_size, 11), be_const_closure(class_Animate_crenel_set_pulse_size_closure) }, + { be_const_key_weak(pulse_size, -1), be_const_var(3) }, + { be_const_key_weak(set_back_color, 10), be_const_closure(class_Animate_crenel_set_back_color_closure) }, + { be_const_key_weak(set_pos, -1), be_const_closure(class_Animate_crenel_set_pos_closure) }, + { be_const_key_weak(back_color, -1), be_const_var(1) }, + { be_const_key_weak(set_low_size, 7), be_const_closure(class_Animate_crenel_set_low_size_closure) }, + { be_const_key_weak(pos, -1), be_const_var(2) }, + { be_const_key_weak(init, -1), be_const_closure(class_Animate_crenel_init_closure) }, + { be_const_key_weak(set_color, 1), be_const_closure(class_Animate_crenel_set_color_closure) }, + { be_const_key_weak(set_nb_pulse, -1), be_const_closure(class_Animate_crenel_set_nb_pulse_closure) }, + { be_const_key_weak(nb_pulse, 0), be_const_var(5) }, + })), + be_str_weak(Animate_crenel) +); /********************************************************************/ /* End of solidification */ diff --git a/lib/libesp32/berry_animate/src/solidify/solidified_animate_9_module.h b/lib/libesp32/berry_animate/src/solidify/solidified_animate_9_module.h index 36b654bd8..9a05a9cab 100644 --- a/lib/libesp32/berry_animate/src/solidify/solidified_animate_9_module.h +++ b/lib/libesp32/berry_animate/src/solidify/solidified_animate_9_module.h @@ -379,7 +379,7 @@ be_local_closure(class_Animate_palette_animate, /* name */ &be_ktab_class_Animate_palette, /* shared constants */ be_str_weak(animate), &be_const_str_solidified, - ( &(const binstruction[193]) { /* code */ + ( &(const binstruction[192]) { /* code */ 0x88080104, // 0000 GETMBR R2 R0 K4 0x4C0C0000, // 0001 LDNIL R3 0x1C080403, // 0002 EQ R2 R2 R3 @@ -438,141 +438,140 @@ be_local_closure(class_Animate_palette_animate, /* name */ 0x00280D02, // 0037 ADD R10 R6 K2 0x882C010B, // 0038 GETMBR R11 R0 K11 0x9428160A, // 0039 GETIDX R10 R11 R10 - 0x5C300800, // 003A MOVE R12 R4 - 0x5C340400, // 003B MOVE R13 R2 - 0x5C381200, // 003C MOVE R14 R9 - 0x5C3C1400, // 003D MOVE R15 R10 - 0x54420007, // 003E LDINT R16 8 - 0x3C400E10, // 003F SHR R16 R7 R16 - 0x544600FE, // 0040 LDINT R17 255 - 0x2C402011, // 0041 AND R16 R16 R17 - 0x54460007, // 0042 LDINT R17 8 - 0x3C441011, // 0043 SHR R17 R8 R17 - 0x544A00FE, // 0044 LDINT R18 255 - 0x2C442212, // 0045 AND R17 R17 R18 - 0x7C300A00, // 0046 CALL R12 5 - 0x5C2C1800, // 0047 MOVE R11 R12 - 0x5C300800, // 0048 MOVE R12 R4 - 0x5C340400, // 0049 MOVE R13 R2 - 0x5C381200, // 004A MOVE R14 R9 - 0x5C3C1400, // 004B MOVE R15 R10 - 0x5442000F, // 004C LDINT R16 16 - 0x3C400E10, // 004D SHR R16 R7 R16 - 0x544600FE, // 004E LDINT R17 255 - 0x2C402011, // 004F AND R16 R16 R17 - 0x5446000F, // 0050 LDINT R17 16 - 0x3C441011, // 0051 SHR R17 R8 R17 - 0x544A00FE, // 0052 LDINT R18 255 - 0x2C442212, // 0053 AND R17 R17 R18 - 0x7C300A00, // 0054 CALL R12 5 - 0x5C340800, // 0055 MOVE R13 R4 - 0x5C380400, // 0056 MOVE R14 R2 - 0x5C3C1200, // 0057 MOVE R15 R9 - 0x5C401400, // 0058 MOVE R16 R10 - 0x54460017, // 0059 LDINT R17 24 - 0x3C440E11, // 005A SHR R17 R7 R17 - 0x544A00FE, // 005B LDINT R18 255 - 0x2C442212, // 005C AND R17 R17 R18 - 0x544A0017, // 005D LDINT R18 24 - 0x3C481012, // 005E SHR R18 R8 R18 - 0x544E00FE, // 005F LDINT R19 255 - 0x2C482413, // 0060 AND R18 R18 R19 - 0x7C340A00, // 0061 CALL R13 5 - 0x8838010E, // 0062 GETMBR R14 R0 K14 - 0x8C3C1D0F, // 0063 GETMET R15 R14 K15 - 0x54460007, // 0064 LDINT R17 8 - 0x3C440E11, // 0065 SHR R17 R7 R17 - 0x544A00FE, // 0066 LDINT R18 255 - 0x2C442212, // 0067 AND R17 R17 R18 - 0x544A000F, // 0068 LDINT R18 16 - 0x3C480E12, // 0069 SHR R18 R7 R18 - 0x544E00FE, // 006A LDINT R19 255 - 0x2C482413, // 006B AND R18 R18 R19 - 0x544E0017, // 006C LDINT R19 24 - 0x3C4C0E13, // 006D SHR R19 R7 R19 - 0x545200FE, // 006E LDINT R20 255 - 0x2C4C2614, // 006F AND R19 R19 R20 - 0x7C3C0800, // 0070 CALL R15 4 - 0x883C1D10, // 0071 GETMBR R15 R14 K16 - 0x8C401D0F, // 0072 GETMET R16 R14 K15 - 0x544A0007, // 0073 LDINT R18 8 - 0x3C481012, // 0074 SHR R18 R8 R18 - 0x544E00FE, // 0075 LDINT R19 255 - 0x2C482413, // 0076 AND R18 R18 R19 - 0x544E000F, // 0077 LDINT R19 16 - 0x3C4C1013, // 0078 SHR R19 R8 R19 - 0x545200FE, // 0079 LDINT R20 255 - 0x2C4C2614, // 007A AND R19 R19 R20 - 0x54520017, // 007B LDINT R20 24 - 0x3C501014, // 007C SHR R20 R8 R20 - 0x545600FE, // 007D LDINT R21 255 - 0x2C502815, // 007E AND R20 R20 R21 - 0x7C400800, // 007F CALL R16 4 - 0x88401D10, // 0080 GETMBR R16 R14 K16 - 0x5C440800, // 0081 MOVE R17 R4 - 0x5C480400, // 0082 MOVE R18 R2 - 0x5C4C1200, // 0083 MOVE R19 R9 - 0x5C501400, // 0084 MOVE R20 R10 - 0x5C541E00, // 0085 MOVE R21 R15 - 0x5C582000, // 0086 MOVE R22 R16 - 0x7C440A00, // 0087 CALL R17 5 - 0x8C481D0F, // 0088 GETMET R18 R14 K15 - 0x5C501600, // 0089 MOVE R20 R11 - 0x5C541800, // 008A MOVE R21 R12 - 0x5C581A00, // 008B MOVE R22 R13 - 0x7C480800, // 008C CALL R18 4 - 0x8C481D11, // 008D GETMET R18 R14 K17 - 0x5C502200, // 008E MOVE R20 R17 - 0x7C480400, // 008F CALL R18 2 - 0x882C1D12, // 0090 GETMBR R11 R14 K18 - 0x88301D13, // 0091 GETMBR R12 R14 K19 - 0x88341D14, // 0092 GETMBR R13 R14 K20 - 0x88480110, // 0093 GETMBR R18 R0 K16 - 0x544E0063, // 0094 LDINT R19 100 - 0x204C2413, // 0095 NE R19 R18 R19 - 0x784E001A, // 0096 JMPF R19 #00B2 - 0xB84E0A00, // 0097 GETNGBL R19 K5 - 0x8C4C2708, // 0098 GETMET R19 R19 K8 - 0x5C541600, // 0099 MOVE R21 R11 - 0x58580003, // 009A LDCONST R22 K3 - 0x545E0063, // 009B LDINT R23 100 - 0x58600003, // 009C LDCONST R24 K3 - 0x5C642400, // 009D MOVE R25 R18 - 0x7C4C0C00, // 009E CALL R19 6 - 0x5C2C2600, // 009F MOVE R11 R19 - 0xB84E0A00, // 00A0 GETNGBL R19 K5 - 0x8C4C2708, // 00A1 GETMET R19 R19 K8 - 0x5C541800, // 00A2 MOVE R21 R12 - 0x58580003, // 00A3 LDCONST R22 K3 - 0x545E0063, // 00A4 LDINT R23 100 - 0x58600003, // 00A5 LDCONST R24 K3 - 0x5C642400, // 00A6 MOVE R25 R18 - 0x7C4C0C00, // 00A7 CALL R19 6 - 0x5C302600, // 00A8 MOVE R12 R19 - 0xB84E0A00, // 00A9 GETNGBL R19 K5 - 0x8C4C2708, // 00AA GETMET R19 R19 K8 - 0x5C541A00, // 00AB MOVE R21 R13 - 0x58580003, // 00AC LDCONST R22 K3 - 0x545E0063, // 00AD LDINT R23 100 - 0x58600003, // 00AE LDCONST R24 K3 - 0x5C642400, // 00AF MOVE R25 R18 - 0x7C4C0C00, // 00B0 CALL R19 6 - 0x5C342600, // 00B1 MOVE R13 R19 - 0x544E000F, // 00B2 LDINT R19 16 - 0x384C1613, // 00B3 SHL R19 R11 R19 - 0x54520007, // 00B4 LDINT R20 8 - 0x38501814, // 00B5 SHL R20 R12 R20 - 0x304C2614, // 00B6 OR R19 R19 R20 - 0x304C260D, // 00B7 OR R19 R19 R13 - 0x88500115, // 00B8 GETMBR R20 R0 K21 - 0x88540116, // 00B9 GETMBR R21 R0 K22 - 0x78520004, // 00BA JMPF R20 #00C0 - 0x78560003, // 00BB JMPF R21 #00C0 - 0x5C582A00, // 00BC MOVE R22 R21 - 0x5C5C2800, // 00BD MOVE R23 R20 - 0x5C602600, // 00BE MOVE R24 R19 - 0x7C580400, // 00BF CALL R22 2 - 0x80042600, // 00C0 RET 1 R19 + 0x5C2C0800, // 003A MOVE R11 R4 + 0x5C300400, // 003B MOVE R12 R2 + 0x5C341200, // 003C MOVE R13 R9 + 0x5C381400, // 003D MOVE R14 R10 + 0x543E0007, // 003E LDINT R15 8 + 0x3C3C0E0F, // 003F SHR R15 R7 R15 + 0x544200FE, // 0040 LDINT R16 255 + 0x2C3C1E10, // 0041 AND R15 R15 R16 + 0x54420007, // 0042 LDINT R16 8 + 0x3C401010, // 0043 SHR R16 R8 R16 + 0x544600FE, // 0044 LDINT R17 255 + 0x2C402011, // 0045 AND R16 R16 R17 + 0x7C2C0A00, // 0046 CALL R11 5 + 0x5C300800, // 0047 MOVE R12 R4 + 0x5C340400, // 0048 MOVE R13 R2 + 0x5C381200, // 0049 MOVE R14 R9 + 0x5C3C1400, // 004A MOVE R15 R10 + 0x5442000F, // 004B LDINT R16 16 + 0x3C400E10, // 004C SHR R16 R7 R16 + 0x544600FE, // 004D LDINT R17 255 + 0x2C402011, // 004E AND R16 R16 R17 + 0x5446000F, // 004F LDINT R17 16 + 0x3C441011, // 0050 SHR R17 R8 R17 + 0x544A00FE, // 0051 LDINT R18 255 + 0x2C442212, // 0052 AND R17 R17 R18 + 0x7C300A00, // 0053 CALL R12 5 + 0x5C340800, // 0054 MOVE R13 R4 + 0x5C380400, // 0055 MOVE R14 R2 + 0x5C3C1200, // 0056 MOVE R15 R9 + 0x5C401400, // 0057 MOVE R16 R10 + 0x54460017, // 0058 LDINT R17 24 + 0x3C440E11, // 0059 SHR R17 R7 R17 + 0x544A00FE, // 005A LDINT R18 255 + 0x2C442212, // 005B AND R17 R17 R18 + 0x544A0017, // 005C LDINT R18 24 + 0x3C481012, // 005D SHR R18 R8 R18 + 0x544E00FE, // 005E LDINT R19 255 + 0x2C482413, // 005F AND R18 R18 R19 + 0x7C340A00, // 0060 CALL R13 5 + 0x8838010E, // 0061 GETMBR R14 R0 K14 + 0x8C3C1D0F, // 0062 GETMET R15 R14 K15 + 0x54460007, // 0063 LDINT R17 8 + 0x3C440E11, // 0064 SHR R17 R7 R17 + 0x544A00FE, // 0065 LDINT R18 255 + 0x2C442212, // 0066 AND R17 R17 R18 + 0x544A000F, // 0067 LDINT R18 16 + 0x3C480E12, // 0068 SHR R18 R7 R18 + 0x544E00FE, // 0069 LDINT R19 255 + 0x2C482413, // 006A AND R18 R18 R19 + 0x544E0017, // 006B LDINT R19 24 + 0x3C4C0E13, // 006C SHR R19 R7 R19 + 0x545200FE, // 006D LDINT R20 255 + 0x2C4C2614, // 006E AND R19 R19 R20 + 0x7C3C0800, // 006F CALL R15 4 + 0x883C1D10, // 0070 GETMBR R15 R14 K16 + 0x8C401D0F, // 0071 GETMET R16 R14 K15 + 0x544A0007, // 0072 LDINT R18 8 + 0x3C481012, // 0073 SHR R18 R8 R18 + 0x544E00FE, // 0074 LDINT R19 255 + 0x2C482413, // 0075 AND R18 R18 R19 + 0x544E000F, // 0076 LDINT R19 16 + 0x3C4C1013, // 0077 SHR R19 R8 R19 + 0x545200FE, // 0078 LDINT R20 255 + 0x2C4C2614, // 0079 AND R19 R19 R20 + 0x54520017, // 007A LDINT R20 24 + 0x3C501014, // 007B SHR R20 R8 R20 + 0x545600FE, // 007C LDINT R21 255 + 0x2C502815, // 007D AND R20 R20 R21 + 0x7C400800, // 007E CALL R16 4 + 0x88401D10, // 007F GETMBR R16 R14 K16 + 0x5C440800, // 0080 MOVE R17 R4 + 0x5C480400, // 0081 MOVE R18 R2 + 0x5C4C1200, // 0082 MOVE R19 R9 + 0x5C501400, // 0083 MOVE R20 R10 + 0x5C541E00, // 0084 MOVE R21 R15 + 0x5C582000, // 0085 MOVE R22 R16 + 0x7C440A00, // 0086 CALL R17 5 + 0x8C481D0F, // 0087 GETMET R18 R14 K15 + 0x5C501600, // 0088 MOVE R20 R11 + 0x5C541800, // 0089 MOVE R21 R12 + 0x5C581A00, // 008A MOVE R22 R13 + 0x7C480800, // 008B CALL R18 4 + 0x8C481D11, // 008C GETMET R18 R14 K17 + 0x5C502200, // 008D MOVE R20 R17 + 0x7C480400, // 008E CALL R18 2 + 0x882C1D12, // 008F GETMBR R11 R14 K18 + 0x88301D13, // 0090 GETMBR R12 R14 K19 + 0x88341D14, // 0091 GETMBR R13 R14 K20 + 0x88480110, // 0092 GETMBR R18 R0 K16 + 0x544E0063, // 0093 LDINT R19 100 + 0x204C2413, // 0094 NE R19 R18 R19 + 0x784E001A, // 0095 JMPF R19 #00B1 + 0xB84E0A00, // 0096 GETNGBL R19 K5 + 0x8C4C2708, // 0097 GETMET R19 R19 K8 + 0x5C541600, // 0098 MOVE R21 R11 + 0x58580003, // 0099 LDCONST R22 K3 + 0x545E0063, // 009A LDINT R23 100 + 0x58600003, // 009B LDCONST R24 K3 + 0x5C642400, // 009C MOVE R25 R18 + 0x7C4C0C00, // 009D CALL R19 6 + 0x5C2C2600, // 009E MOVE R11 R19 + 0xB84E0A00, // 009F GETNGBL R19 K5 + 0x8C4C2708, // 00A0 GETMET R19 R19 K8 + 0x5C541800, // 00A1 MOVE R21 R12 + 0x58580003, // 00A2 LDCONST R22 K3 + 0x545E0063, // 00A3 LDINT R23 100 + 0x58600003, // 00A4 LDCONST R24 K3 + 0x5C642400, // 00A5 MOVE R25 R18 + 0x7C4C0C00, // 00A6 CALL R19 6 + 0x5C302600, // 00A7 MOVE R12 R19 + 0xB84E0A00, // 00A8 GETNGBL R19 K5 + 0x8C4C2708, // 00A9 GETMET R19 R19 K8 + 0x5C541A00, // 00AA MOVE R21 R13 + 0x58580003, // 00AB LDCONST R22 K3 + 0x545E0063, // 00AC LDINT R23 100 + 0x58600003, // 00AD LDCONST R24 K3 + 0x5C642400, // 00AE MOVE R25 R18 + 0x7C4C0C00, // 00AF CALL R19 6 + 0x5C342600, // 00B0 MOVE R13 R19 + 0x544E000F, // 00B1 LDINT R19 16 + 0x384C1613, // 00B2 SHL R19 R11 R19 + 0x54520007, // 00B3 LDINT R20 8 + 0x38501814, // 00B4 SHL R20 R12 R20 + 0x304C2614, // 00B5 OR R19 R19 R20 + 0x304C260D, // 00B6 OR R19 R19 R13 + 0x88500115, // 00B7 GETMBR R20 R0 K21 + 0x88540116, // 00B8 GETMBR R21 R0 K22 + 0x78520004, // 00B9 JMPF R20 #00BF + 0x78560003, // 00BA JMPF R21 #00BF + 0x5C582A00, // 00BB MOVE R22 R21 + 0x5C5C2800, // 00BC MOVE R23 R20 + 0x5C602600, // 00BD MOVE R24 R19 + 0x7C580400, // 00BE CALL R22 2 + 0x80042600, // 00BF RET 1 R19 }) ) ); @@ -880,7 +879,7 @@ be_local_closure(class_Animate_palette_set_value, /* name */ &be_ktab_class_Animate_palette, /* shared constants */ be_str_weak(set_value), &be_const_str_solidified, - ( &(const binstruction[96]) { /* code */ + ( &(const binstruction[95]) { /* code */ 0x88080119, // 0000 GETMBR R2 R0 K25 0x4C0C0000, // 0001 LDNIL R3 0x1C080403, // 0002 EQ R2 R2 R3 @@ -922,61 +921,60 @@ be_local_closure(class_Animate_palette_set_value, /* name */ 0x00200902, // 0026 ADD R8 R4 K2 0x8824010B, // 0027 GETMBR R9 R0 K11 0x94201208, // 0028 GETIDX R8 R9 R8 - 0x5C280400, // 0029 MOVE R10 R2 - 0x5C2C0200, // 002A MOVE R11 R1 - 0x5C300E00, // 002B MOVE R12 R7 - 0x5C341000, // 002C MOVE R13 R8 - 0x543A0007, // 002D LDINT R14 8 - 0x3C380A0E, // 002E SHR R14 R5 R14 - 0x543E00FE, // 002F LDINT R15 255 - 0x2C381C0F, // 0030 AND R14 R14 R15 - 0x543E0007, // 0031 LDINT R15 8 - 0x3C3C0C0F, // 0032 SHR R15 R6 R15 - 0x544200FE, // 0033 LDINT R16 255 - 0x2C3C1E10, // 0034 AND R15 R15 R16 - 0x7C280A00, // 0035 CALL R10 5 - 0x5C241400, // 0036 MOVE R9 R10 - 0x5C280400, // 0037 MOVE R10 R2 - 0x5C2C0200, // 0038 MOVE R11 R1 - 0x5C300E00, // 0039 MOVE R12 R7 - 0x5C341000, // 003A MOVE R13 R8 - 0x543A000F, // 003B LDINT R14 16 - 0x3C380A0E, // 003C SHR R14 R5 R14 - 0x543E00FE, // 003D LDINT R15 255 - 0x2C381C0F, // 003E AND R14 R14 R15 - 0x543E000F, // 003F LDINT R15 16 - 0x3C3C0C0F, // 0040 SHR R15 R6 R15 - 0x544200FE, // 0041 LDINT R16 255 - 0x2C3C1E10, // 0042 AND R15 R15 R16 - 0x7C280A00, // 0043 CALL R10 5 - 0x5C2C0400, // 0044 MOVE R11 R2 - 0x5C300200, // 0045 MOVE R12 R1 - 0x5C340E00, // 0046 MOVE R13 R7 - 0x5C381000, // 0047 MOVE R14 R8 - 0x543E0017, // 0048 LDINT R15 24 - 0x3C3C0A0F, // 0049 SHR R15 R5 R15 - 0x544200FE, // 004A LDINT R16 255 - 0x2C3C1E10, // 004B AND R15 R15 R16 - 0x54420017, // 004C LDINT R16 24 - 0x3C400C10, // 004D SHR R16 R6 R16 - 0x544600FE, // 004E LDINT R17 255 - 0x2C402011, // 004F AND R16 R16 R17 - 0x7C2C0A00, // 0050 CALL R11 5 - 0x5432000F, // 0051 LDINT R12 16 - 0x3830120C, // 0052 SHL R12 R9 R12 - 0x54360007, // 0053 LDINT R13 8 - 0x3834140D, // 0054 SHL R13 R10 R13 - 0x3030180D, // 0055 OR R12 R12 R13 - 0x3030180B, // 0056 OR R12 R12 R11 - 0x88340115, // 0057 GETMBR R13 R0 K21 - 0x88380116, // 0058 GETMBR R14 R0 K22 - 0x78360004, // 0059 JMPF R13 #005F - 0x783A0003, // 005A JMPF R14 #005F - 0x5C3C1C00, // 005B MOVE R15 R14 - 0x5C401A00, // 005C MOVE R16 R13 - 0x5C441800, // 005D MOVE R17 R12 - 0x7C3C0400, // 005E CALL R15 2 - 0x80041800, // 005F RET 1 R12 + 0x5C240400, // 0029 MOVE R9 R2 + 0x5C280200, // 002A MOVE R10 R1 + 0x5C2C0E00, // 002B MOVE R11 R7 + 0x5C301000, // 002C MOVE R12 R8 + 0x54360007, // 002D LDINT R13 8 + 0x3C340A0D, // 002E SHR R13 R5 R13 + 0x543A00FE, // 002F LDINT R14 255 + 0x2C341A0E, // 0030 AND R13 R13 R14 + 0x543A0007, // 0031 LDINT R14 8 + 0x3C380C0E, // 0032 SHR R14 R6 R14 + 0x543E00FE, // 0033 LDINT R15 255 + 0x2C381C0F, // 0034 AND R14 R14 R15 + 0x7C240A00, // 0035 CALL R9 5 + 0x5C280400, // 0036 MOVE R10 R2 + 0x5C2C0200, // 0037 MOVE R11 R1 + 0x5C300E00, // 0038 MOVE R12 R7 + 0x5C341000, // 0039 MOVE R13 R8 + 0x543A000F, // 003A LDINT R14 16 + 0x3C380A0E, // 003B SHR R14 R5 R14 + 0x543E00FE, // 003C LDINT R15 255 + 0x2C381C0F, // 003D AND R14 R14 R15 + 0x543E000F, // 003E LDINT R15 16 + 0x3C3C0C0F, // 003F SHR R15 R6 R15 + 0x544200FE, // 0040 LDINT R16 255 + 0x2C3C1E10, // 0041 AND R15 R15 R16 + 0x7C280A00, // 0042 CALL R10 5 + 0x5C2C0400, // 0043 MOVE R11 R2 + 0x5C300200, // 0044 MOVE R12 R1 + 0x5C340E00, // 0045 MOVE R13 R7 + 0x5C381000, // 0046 MOVE R14 R8 + 0x543E0017, // 0047 LDINT R15 24 + 0x3C3C0A0F, // 0048 SHR R15 R5 R15 + 0x544200FE, // 0049 LDINT R16 255 + 0x2C3C1E10, // 004A AND R15 R15 R16 + 0x54420017, // 004B LDINT R16 24 + 0x3C400C10, // 004C SHR R16 R6 R16 + 0x544600FE, // 004D LDINT R17 255 + 0x2C402011, // 004E AND R16 R16 R17 + 0x7C2C0A00, // 004F CALL R11 5 + 0x5432000F, // 0050 LDINT R12 16 + 0x3830120C, // 0051 SHL R12 R9 R12 + 0x54360007, // 0052 LDINT R13 8 + 0x3834140D, // 0053 SHL R13 R10 R13 + 0x3030180D, // 0054 OR R12 R12 R13 + 0x3030180B, // 0055 OR R12 R12 R11 + 0x88340115, // 0056 GETMBR R13 R0 K21 + 0x88380116, // 0057 GETMBR R14 R0 K22 + 0x78360004, // 0058 JMPF R13 #005E + 0x783A0003, // 0059 JMPF R14 #005E + 0x5C3C1C00, // 005A MOVE R15 R14 + 0x5C401A00, // 005B MOVE R16 R13 + 0x5C441800, // 005C MOVE R17 R12 + 0x7C3C0400, // 005D CALL R15 2 + 0x80041800, // 005E RET 1 R12 }) ) ); diff --git a/lib/libesp32/berry_int64/src/be_int64_class.c b/lib/libesp32/berry_int64/src/be_int64_class.c index 91a0a7f2f..356c096df 100644 --- a/lib/libesp32/berry_int64/src/be_int64_class.c +++ b/lib/libesp32/berry_int64/src/be_int64_class.c @@ -194,6 +194,22 @@ int64_t* int64_div(bvm *vm, int64_t *i64, int64_t *j64) { } BE_FUNC_CTYPE_DECLARE(int64_div, "int64", "@.(int64)") +int64_t* int64_shiftleft(bvm *vm, int64_t *i64, int32_t j32) { + int64_t* r64 = (int64_t*)be_malloc(vm, sizeof(int64_t)); + // it's possible that arg j64 is nullptr, since class type does allow NULLPTR to come through. + *r64 = *i64 << j32; + return r64; +} +BE_FUNC_CTYPE_DECLARE(int64_shiftleft, "int64", "@(int64)i") + +int64_t* int64_shiftright(bvm *vm, int64_t *i64, int32_t j32) { + int64_t* r64 = (int64_t*)be_malloc(vm, sizeof(int64_t)); + // it's possible that arg j64 is nullptr, since class type does allow NULLPTR to come through. + *r64 = *i64 >> j32; + return r64; +} +BE_FUNC_CTYPE_DECLARE(int64_shiftright, "int64", "@(int64)i") + bbool int64_equals(int64_t *i64, int64_t *j64) { // it's possible that arg j64 is nullptr, since class type does allow NULLPTR to come through. int64_t j = 0; @@ -349,6 +365,8 @@ class be_class_int64 (scope: global, name: int64) { >=, ctype_func(int64_gte) <, ctype_func(int64_lt) <=, ctype_func(int64_lte) + <<, ctype_func(int64_shiftleft) + >>, ctype_func(int64_shiftright) tobytes, ctype_func(int64_tobytes) frombytes, static_ctype_func(int64_frombytes) diff --git a/lib/libesp32/berry_int64/tests/int64.be b/lib/libesp32/berry_int64/tests/int64.be index 695149445..bcaa12cf4 100644 --- a/lib/libesp32/berry_int64/tests/int64.be +++ b/lib/libesp32/berry_int64/tests/int64.be @@ -134,3 +134,49 @@ assert(int64.toint64(int64(42)).tostring() == "42") # invalid assert(int64.toint64("").tostring() == "0") assert(int64.toint64(nil) == nil) + +# bitshift +assert(str(int64(15) << 0) == "15") +assert(str(int64(15) << 1) == "30") +assert(str(int64(15) << 2) == "60") +assert(str(int64(15) << 20) == "15728640") +assert((int64(15) << 20).tobytes().reverse().tohex() == "0000000000F00000") +assert((int64(15) << 40).tobytes().reverse().tohex() == "00000F0000000000") +assert((int64(15) << 44).tobytes().reverse().tohex() == "0000F00000000000") +assert((int64(15) << 48).tobytes().reverse().tohex() == "000F000000000000") +assert((int64(15) << 52).tobytes().reverse().tohex() == "00F0000000000000") +assert((int64(15) << 56).tobytes().reverse().tohex() == "0F00000000000000") +assert((int64(15) << 60).tobytes().reverse().tohex() == "F000000000000000") +assert((int64(15) << 61).tobytes().reverse().tohex() == "E000000000000000") +assert((int64(15) << 62).tobytes().reverse().tohex() == "C000000000000000") +assert((int64(15) << 63).tobytes().reverse().tohex() == "8000000000000000") +assert((int64(15) << -1).tobytes().reverse().tohex() == "8000000000000000") + +assert(str(int64(-15) << 0) == "-15") +assert(str(int64(-15) << 1) == "-30") +assert(str(int64(-15) << 2) == "-60") +assert(str(int64(-15) << 20) == "-15728640") +assert((int64(-15) << 20).tobytes().reverse().tohex() == "FFFFFFFFFF100000") +assert((int64(-15) << 40).tobytes().reverse().tohex() == "FFFFF10000000000") +assert((int64(-15) << 56).tobytes().reverse().tohex() == "F100000000000000") +assert((int64(-15) << 60).tobytes().reverse().tohex() == "1000000000000000") +assert((int64(-15) << 61).tobytes().reverse().tohex() == "2000000000000000") +assert((int64(-15) << 62).tobytes().reverse().tohex() == "4000000000000000") +assert((int64(-15) << 63).tobytes().reverse().tohex() == "8000000000000000") +assert((int64(-15) << -1).tobytes().reverse().tohex() == "8000000000000000") + +assert(str(int64(15) >> 0) == "15") +assert(str(int64(15) >> 1) == "7") +assert(str(int64(15) >> 2) == "3") +assert(str(int64(15) >> 3) == "1") +assert(str(int64(15) >> 4) == "0") +assert(str(int64(15) >> 5) == "0") +assert(str(int64(15) >> -1) == "0") + +assert(str(int64(-15) >> 0) == "-15") +assert(str(int64(-15) >> 1) == "-8") +assert(str(int64(-15) >> 2) == "-4") +assert(str(int64(-15) >> 3) == "-2") +assert(str(int64(-15) >> 4) == "-1") +assert(str(int64(-15) >> 5) == "-1") +assert(str(int64(-15) >> -1) == "-1") diff --git a/lib/libesp32/berry_mapping/src/be_cb_module.c b/lib/libesp32/berry_mapping/src/be_cb_module.c index f0f2ab2d6..343ac3d34 100644 --- a/lib/libesp32/berry_mapping/src/be_cb_module.c +++ b/lib/libesp32/berry_mapping/src/be_cb_module.c @@ -19,13 +19,13 @@ enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_D /*********************************************************************************************\ * Callback structures * - * We allow 4 parameters, or 3 if method (first arg is `self`) + * We allow 5 parameters, or 4 if method (first arg is `self`) * This could be extended if needed \*********************************************************************************************/ -typedef int (*berry_callback_t)(int v0, int v1, int v2, int v3); -static int call_berry_cb(int num, int v0, int v1, int v2, int v3); +typedef int (*berry_callback_t)(int v0, int v1, int v2, int v3, int v4); +static int call_berry_cb(int num, int v0, int v1, int v2, int v3, int v4); -#define BERRY_CB(n) int berry_cb_##n(int v0, int v1, int v2, int v3) { return call_berry_cb(n, v0, v1, v2, v3); } +#define BERRY_CB(n) int berry_cb_##n(int v0, int v1, int v2, int v3, int v4) { return call_berry_cb(n, v0, v1, v2, v3, v4); } // list the callbacks BERRY_CB(0); BERRY_CB(1); @@ -242,7 +242,7 @@ static int be_cb_get_cb_list(bvm *vm) { * We allow 4 parameters, or 3 if method (first arg is `self`) * This could be extended if needed \*********************************************************************************************/ -static int call_berry_cb(int num, int v0, int v1, int v2, int v3) { +static int call_berry_cb(int num, int v0, int v1, int v2, int v3, int v4) { // call berry cb dispatcher int32_t ret = 0; // retrieve vm and function @@ -259,15 +259,16 @@ static int call_berry_cb(int num, int v0, int v1, int v2, int v3) { be_pushint(vm, v1); be_pushint(vm, v2); be_pushint(vm, v3); + be_pushint(vm, v4); - ret = be_pcall(vm, 4); // 4 arguments + ret = be_pcall(vm, 5); // 4 arguments if (ret != 0) { if (vm->obshook != NULL) (*vm->obshook)(vm, BE_OBS_PCALL_ERROR); be_pop(vm, be_top(vm)); // clear Berry stack return 0; } - ret = be_toint(vm, -5); - be_pop(vm, 5); // remove result + ret = be_toint(vm, -6); + be_pop(vm, 6); // remove result return ret; } diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_2_Sensor_Air_Quality.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_2_Sensor_Air_Quality.be index b110c61a3..75e654395 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_2_Sensor_Air_Quality.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_2_Sensor_Air_Quality.be @@ -68,7 +68,7 @@ class Matter_Plugin_Sensor_Air_Quality : Matter_Plugin_Device # Constructor def init(device, endpoint, config) super(self).init(device, endpoint, config) - self.shadow_air_quality = false + self.shadow_air_quality = 0 device.add_read_sensors_schedule(self.UPDATE_TIME) end @@ -92,7 +92,7 @@ class Matter_Plugin_Sensor_Air_Quality : Matter_Plugin_Device if (val != nil) val = func(val) if (val != nil) && (val != old_val) - self.attribute_updated(cluster, attribute) # CurrentPositionTiltPercent100ths + self.attribute_updated(cluster, attribute) end return val end @@ -114,10 +114,49 @@ class Matter_Plugin_Sensor_Air_Quality : Matter_Plugin_Device self.shadow_tvoc = self._parse_sensor_entry(v, "TVOC", self.shadow_tvoc, number, 0x042E, 0x0000) # NO2 self.shadow_no2 = self._parse_sensor_entry(v, "NO2", self.shadow_no2, number, 0x0413, 0x0000) + # AirQuality + if v.contains("AirQuality") + self.shadow_air_quality = self._parse_sensor_entry(v, "AirQuality", self.shadow_air_quality, number, 0x005B, 0x0000) + else + # try to compute from available values + self.compute_air_quality() + end end super(self).parse_sensors(payload) # parse other shutter values end + ############################################################# + # compute_air_quality + # + # If self.shadow_air_quality is unknown, try to compute from other attributes + def compute_air_quality() + # try to compute from available values + var new_air_quality + if (self.shadow_co2 != nil) + var co2 = self.shadow_co2 + if (co2 <= 750) + new_air_quality = 1 + elif (co2 <= 1000) + new_air_quality = 2 + elif (co2 <= 1250) + new_air_quality = 3 + elif (co2 <= 1500) + new_air_quality = 4 + elif (co2 <= 1750) + new_air_quality = 5 + else + new_air_quality = 6 + end + # any formula based on TVOC? + end + + # do we have a new value for air_quality? + if (new_air_quality != nil) && (new_air_quality != self.shadow_air_quality) + self.shadow_air_quality = new_air_quality + self.attribute_updated(0x005B, 0x0000) + end + end + ############################################################# # read an attribute # @@ -201,12 +240,17 @@ class Matter_Plugin_Sensor_Air_Quality : Matter_Plugin_Device # # Update internal state for virtual devices def update_virtual(payload) - self.shadow_air_quality = self._parse_update_virtual(payload, "AirQuality", number, self.shadow_air_quality, 0x005B, 0x0000) self.shadow_co2 = self._parse_update_virtual(payload, "CO2", self.shadow_co2, number, 0x040D, 0x0000) self.shadow_pm1 = self._parse_update_virtual(payload, "PM1", self.shadow_pm1, number, 0x042C, 0x0000) self.shadow_pm2_5 = self._parse_update_virtual(payload, "PM2.5", self.shadow_pm2_5, number, 0x042A, 0x0000) self.shadow_pm10 = self._parse_update_virtual(payload, "PM10", self.shadow_pm10, number, 0x042D, 0x0000) self.shadow_tvoc = self._parse_update_virtual(payload, "TVOC", self.shadow_tvoc, number, 0x042E, 0x0000) + if payload.contains("AirQuality") + self.shadow_air_quality = self._parse_update_virtual(payload, "AirQuality", number, self.shadow_air_quality, 0x005B, 0x0000) + else + # try to compute from available values + self.compute_air_quality() + end super(self).update_virtual(payload) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_z_Commissioning.be b/lib/libesp32/berry_matter/src/embedded/Matter_z_Commissioning.be index 471581812..8225ff643 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_z_Commissioning.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_z_Commissioning.be @@ -190,7 +190,7 @@ class Matter_Commissioning # Deferred until next tick. def start_operational_discovery_deferred(fabric) # defer to next click - tasmota.set_timer(0, /-> self.start_operational_discovery(fabric)) + tasmota.defer(/-> self.start_operational_discovery(fabric)) end ############################################################# @@ -199,7 +199,7 @@ class Matter_Commissioning # Deferred until next tick. def start_commissioning_complete_deferred(session) # defer to next click - tasmota.set_timer(0, /-> self.start_commissioning_complete(session)) + tasmota.defer(/-> self.start_commissioning_complete(session)) end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_zzz_TLV_test.be b/lib/libesp32/berry_matter/src/embedded/Matter_zzz_TLV_test.be index 7b8eab8a0..3ecc27392 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_zzz_TLV_test.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_zzz_TLV_test.be @@ -24,6 +24,12 @@ import matter def test_TLV(b, s) var m = matter.TLV.parse(b) + var s2 = m.tostring() + if (s2 != s) print(f"{s2=} {s=}") end + var b2 = m.tlv2raw() + if (b2 != b) print(f"{b2=} {b=}") end + var sz = m.encode_len() + if (sz != size(b)) print(f"{sz=} {size(b)=}") end assert(m.tostring() == s) assert(m.tlv2raw() == b) assert(m.encode_len() == size(b)) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning_Context.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning_Context.h index 944e0a787..3a151fa9e 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning_Context.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning_Context.h @@ -891,7 +891,7 @@ be_local_closure(class_Matter_Commisioning_Context_parse_Sigma3, /* name */ &be_ktab_class_Matter_Commisioning_Context, /* shared constants */ be_str_weak(parse_Sigma3), &be_const_str_solidified, - ( &(const binstruction[280]) { /* code */ + ( &(const binstruction[278]) { /* code */ 0xA40A1200, // 0000 IMPORT R2 K9 0x880C031D, // 0001 GETMBR R3 R1 K29 0x54120031, // 0002 LDINT R4 50 @@ -953,225 +953,223 @@ be_local_closure(class_Matter_Commisioning_Context_parse_Sigma3, /* name */ 0x40223E08, // 003A CONNECT R8 K31 R8 0x88240967, // 003B GETMBR R9 R4 K103 0x94201208, // 003C GETIDX R8 R9 R8 - 0x5429FFEF, // 003D LDINT R10 -16 - 0x40281503, // 003E CONNECT R10 R10 K3 - 0x882C0967, // 003F GETMBR R11 R4 K103 - 0x9424160A, // 0040 GETIDX R9 R11 R10 - 0x8C300568, // 0041 GETMET R12 R2 K104 - 0x5C380E00, // 0042 MOVE R14 R7 - 0x603C0015, // 0043 GETGBL R15 G21 - 0x7C3C0000, // 0044 CALL R15 0 - 0x8C3C1F4E, // 0045 GETMET R15 R15 K78 - 0x88440169, // 0046 GETMBR R17 R0 K105 - 0x7C3C0400, // 0047 CALL R15 2 - 0x60400015, // 0048 GETGBL R16 G21 - 0x7C400000, // 0049 CALL R16 0 - 0x6044000C, // 004A GETGBL R17 G12 - 0x5C481000, // 004B MOVE R18 R8 - 0x7C440200, // 004C CALL R17 1 - 0x544A000F, // 004D LDINT R18 16 - 0x7C300C00, // 004E CALL R12 6 - 0x5C281800, // 004F MOVE R10 R12 - 0x8C30156A, // 0050 GETMET R12 R10 K106 - 0x5C381000, // 0051 MOVE R14 R8 - 0x7C300400, // 0052 CALL R12 2 - 0x5C2C1800, // 0053 MOVE R11 R12 - 0x8C30156B, // 0054 GETMET R12 R10 K107 - 0x7C300200, // 0055 CALL R12 1 - 0x20341809, // 0056 NE R13 R12 R9 - 0x78360010, // 0057 JMPF R13 #0069 - 0xB8360A00, // 0058 GETNGBL R13 K5 - 0x5838006C, // 0059 LDCONST R14 K108 - 0x583C0008, // 005A LDCONST R15 K8 - 0x7C340400, // 005B CALL R13 2 - 0xB8360A00, // 005C GETNGBL R13 K5 - 0x58380023, // 005D LDCONST R14 K35 - 0x583C0008, // 005E LDCONST R15 K8 - 0x7C340400, // 005F CALL R13 2 - 0x8C340124, // 0060 GETMET R13 R0 K36 - 0x5C3C0200, // 0061 MOVE R15 R1 - 0x58400025, // 0062 LDCONST R16 K37 - 0x5844001F, // 0063 LDCONST R17 K31 - 0x58480022, // 0064 LDCONST R18 K34 - 0x504C0000, // 0065 LDBOOL R19 0 0 - 0x7C340C00, // 0066 CALL R13 6 - 0x50340000, // 0067 LDBOOL R13 0 0 - 0x80041A00, // 0068 RET 1 R13 - 0xB8364C00, // 0069 GETNGBL R13 K38 - 0x88341B6D, // 006A GETMBR R13 R13 K109 - 0x8C341B28, // 006B GETMET R13 R13 K40 - 0x5C3C1600, // 006C MOVE R15 R11 - 0x7C340400, // 006D CALL R13 2 - 0x8C381B6E, // 006E GETMET R14 R13 K110 - 0x58400025, // 006F LDCONST R16 K37 - 0x7C380400, // 0070 CALL R14 2 - 0x8C3C1B6E, // 0071 GETMET R15 R13 K110 - 0x58440022, // 0072 LDCONST R17 K34 - 0x7C3C0400, // 0073 CALL R15 2 - 0x8C401B6E, // 0074 GETMET R16 R13 K110 - 0x58480008, // 0075 LDCONST R18 K8 - 0x7C400400, // 0076 CALL R16 2 - 0xB8464C00, // 0077 GETNGBL R17 K38 - 0x8844236D, // 0078 GETMBR R17 R17 K109 - 0x8C442328, // 0079 GETMET R17 R17 K40 - 0x5C4C1C00, // 007A MOVE R19 R14 - 0x7C440400, // 007B CALL R17 2 - 0x8C48236E, // 007C GETMET R18 R17 K110 - 0x54520008, // 007D LDINT R20 9 - 0x7C480400, // 007E CALL R18 2 - 0x8C4C236F, // 007F GETMET R19 R17 K111 - 0x54560005, // 0080 LDINT R21 6 - 0x7C4C0400, // 0081 CALL R19 2 - 0x8C50276E, // 0082 GETMET R20 R19 K110 - 0x545A0010, // 0083 LDINT R22 17 - 0x7C500400, // 0084 CALL R20 2 - 0x60540004, // 0085 GETGBL R21 G4 - 0x5C582800, // 0086 MOVE R22 R20 - 0x7C540200, // 0087 CALL R21 1 - 0x1C542B70, // 0088 EQ R21 R21 K112 - 0x78560007, // 0089 JMPF R21 #0092 - 0xB856E400, // 008A GETNGBL R21 K114 - 0x8C542B73, // 008B GETMET R21 R21 K115 - 0x5C5C2800, // 008C MOVE R23 R20 - 0x7C540400, // 008D CALL R21 2 - 0x8C542B74, // 008E GETMET R21 R21 K116 - 0x7C540200, // 008F CALL R21 1 - 0x900EE215, // 0090 SETMBR R3 K113 R21 - 0x70020002, // 0091 JMP #0095 - 0x8C542974, // 0092 GETMET R21 R20 K116 - 0x7C540200, // 0093 CALL R21 1 - 0x900EE215, // 0094 SETMBR R3 K113 R21 - 0xB8564C00, // 0095 GETNGBL R21 K38 - 0x88542B6D, // 0096 GETMBR R21 R21 K109 - 0x8C542B75, // 0097 GETMET R21 R21 K117 - 0x7C540200, // 0098 CALL R21 1 - 0x8C582B76, // 0099 GETMET R22 R21 K118 - 0x58600025, // 009A LDCONST R24 K37 - 0xB8664C00, // 009B GETNGBL R25 K38 - 0x8864336D, // 009C GETMBR R25 R25 K109 - 0x88643377, // 009D GETMBR R25 R25 K119 - 0x5C681C00, // 009E MOVE R26 R14 - 0x7C580800, // 009F CALL R22 4 - 0x8C582B76, // 00A0 GETMET R22 R21 K118 - 0x58600022, // 00A1 LDCONST R24 K34 - 0xB8664C00, // 00A2 GETNGBL R25 K38 - 0x8864336D, // 00A3 GETMBR R25 R25 K109 - 0x88643377, // 00A4 GETMBR R25 R25 K119 - 0x5C681E00, // 00A5 MOVE R26 R15 - 0x7C580800, // 00A6 CALL R22 4 - 0x8C582B76, // 00A7 GETMET R22 R21 K118 - 0x58600008, // 00A8 LDCONST R24 K8 - 0xB8664C00, // 00A9 GETNGBL R25 K38 - 0x8864336D, // 00AA GETMBR R25 R25 K109 - 0x88643377, // 00AB GETMBR R25 R25 K119 - 0x88680778, // 00AC GETMBR R26 R3 K120 - 0x7C580800, // 00AD CALL R22 4 - 0x8C582B76, // 00AE GETMET R22 R21 K118 - 0x54620003, // 00AF LDINT R24 4 - 0xB8664C00, // 00B0 GETNGBL R25 K38 - 0x8864336D, // 00B1 GETMBR R25 R25 K109 - 0x88643377, // 00B2 GETMBR R25 R25 K119 - 0x88680779, // 00B3 GETMBR R26 R3 K121 - 0x7C580800, // 00B4 CALL R22 4 - 0x8C582B3E, // 00B5 GETMET R22 R21 K62 - 0x7C580200, // 00B6 CALL R22 1 - 0x8C5C057A, // 00B7 GETMET R23 R2 K122 - 0x7C5C0200, // 00B8 CALL R23 1 - 0x8C5C2F7B, // 00B9 GETMET R23 R23 K123 - 0x5C642400, // 00BA MOVE R25 R18 - 0x5C682C00, // 00BB MOVE R26 R22 - 0x5C6C2000, // 00BC MOVE R27 R16 - 0x7C5C0800, // 00BD CALL R23 4 - 0x5C602E00, // 00BE MOVE R24 R23 - 0x74620008, // 00BF JMPT R24 #00C9 - 0xB8620A00, // 00C0 GETNGBL R24 K5 - 0x5864007C, // 00C1 LDCONST R25 K124 - 0x58680022, // 00C2 LDCONST R26 K34 - 0x7C600400, // 00C3 CALL R24 2 - 0xB8620A00, // 00C4 GETNGBL R24 K5 - 0x5864007D, // 00C5 LDCONST R25 K125 - 0x58680022, // 00C6 LDCONST R26 K34 - 0x7C600400, // 00C7 CALL R24 2 - 0x70020003, // 00C8 JMP #00CD - 0xB8620A00, // 00C9 GETNGBL R24 K5 - 0x5864007E, // 00CA LDCONST R25 K126 - 0x58680008, // 00CB LDCONST R26 K8 - 0x7C600400, // 00CC CALL R24 2 - 0x8C60054D, // 00CD GETMET R24 R2 K77 - 0x7C600200, // 00CE CALL R24 1 - 0x8C603116, // 00CF GETMET R24 R24 K22 - 0x8868072A, // 00D0 GETMBR R26 R3 K42 - 0x7C600400, // 00D1 CALL R24 2 - 0x8C603116, // 00D2 GETMET R24 R24 K22 - 0x8868073F, // 00D3 GETMBR R26 R3 K63 - 0x7C600400, // 00D4 CALL R24 2 - 0x8C603116, // 00D5 GETMET R24 R24 K22 - 0x8868097F, // 00D6 GETMBR R26 R4 K127 - 0x7C600400, // 00D7 CALL R24 2 - 0x8C603117, // 00D8 GETMET R24 R24 K23 - 0x7C600200, // 00D9 CALL R24 1 - 0x5C143000, // 00DA MOVE R5 R24 + 0x5425FFEF, // 003D LDINT R9 -16 + 0x40241303, // 003E CONNECT R9 R9 K3 + 0x88280967, // 003F GETMBR R10 R4 K103 + 0x94241409, // 0040 GETIDX R9 R10 R9 + 0x8C280568, // 0041 GETMET R10 R2 K104 + 0x5C300E00, // 0042 MOVE R12 R7 + 0x60340015, // 0043 GETGBL R13 G21 + 0x7C340000, // 0044 CALL R13 0 + 0x8C341B4E, // 0045 GETMET R13 R13 K78 + 0x883C0169, // 0046 GETMBR R15 R0 K105 + 0x7C340400, // 0047 CALL R13 2 + 0x60380015, // 0048 GETGBL R14 G21 + 0x7C380000, // 0049 CALL R14 0 + 0x603C000C, // 004A GETGBL R15 G12 + 0x5C401000, // 004B MOVE R16 R8 + 0x7C3C0200, // 004C CALL R15 1 + 0x5442000F, // 004D LDINT R16 16 + 0x7C280C00, // 004E CALL R10 6 + 0x8C2C156A, // 004F GETMET R11 R10 K106 + 0x5C341000, // 0050 MOVE R13 R8 + 0x7C2C0400, // 0051 CALL R11 2 + 0x8C30156B, // 0052 GETMET R12 R10 K107 + 0x7C300200, // 0053 CALL R12 1 + 0x20341809, // 0054 NE R13 R12 R9 + 0x78360010, // 0055 JMPF R13 #0067 + 0xB8360A00, // 0056 GETNGBL R13 K5 + 0x5838006C, // 0057 LDCONST R14 K108 + 0x583C0008, // 0058 LDCONST R15 K8 + 0x7C340400, // 0059 CALL R13 2 + 0xB8360A00, // 005A GETNGBL R13 K5 + 0x58380023, // 005B LDCONST R14 K35 + 0x583C0008, // 005C LDCONST R15 K8 + 0x7C340400, // 005D CALL R13 2 + 0x8C340124, // 005E GETMET R13 R0 K36 + 0x5C3C0200, // 005F MOVE R15 R1 + 0x58400025, // 0060 LDCONST R16 K37 + 0x5844001F, // 0061 LDCONST R17 K31 + 0x58480022, // 0062 LDCONST R18 K34 + 0x504C0000, // 0063 LDBOOL R19 0 0 + 0x7C340C00, // 0064 CALL R13 6 + 0x50340000, // 0065 LDBOOL R13 0 0 + 0x80041A00, // 0066 RET 1 R13 + 0xB8364C00, // 0067 GETNGBL R13 K38 + 0x88341B6D, // 0068 GETMBR R13 R13 K109 + 0x8C341B28, // 0069 GETMET R13 R13 K40 + 0x5C3C1600, // 006A MOVE R15 R11 + 0x7C340400, // 006B CALL R13 2 + 0x8C381B6E, // 006C GETMET R14 R13 K110 + 0x58400025, // 006D LDCONST R16 K37 + 0x7C380400, // 006E CALL R14 2 + 0x8C3C1B6E, // 006F GETMET R15 R13 K110 + 0x58440022, // 0070 LDCONST R17 K34 + 0x7C3C0400, // 0071 CALL R15 2 + 0x8C401B6E, // 0072 GETMET R16 R13 K110 + 0x58480008, // 0073 LDCONST R18 K8 + 0x7C400400, // 0074 CALL R16 2 + 0xB8464C00, // 0075 GETNGBL R17 K38 + 0x8844236D, // 0076 GETMBR R17 R17 K109 + 0x8C442328, // 0077 GETMET R17 R17 K40 + 0x5C4C1C00, // 0078 MOVE R19 R14 + 0x7C440400, // 0079 CALL R17 2 + 0x8C48236E, // 007A GETMET R18 R17 K110 + 0x54520008, // 007B LDINT R20 9 + 0x7C480400, // 007C CALL R18 2 + 0x8C4C236F, // 007D GETMET R19 R17 K111 + 0x54560005, // 007E LDINT R21 6 + 0x7C4C0400, // 007F CALL R19 2 + 0x8C50276E, // 0080 GETMET R20 R19 K110 + 0x545A0010, // 0081 LDINT R22 17 + 0x7C500400, // 0082 CALL R20 2 + 0x60540004, // 0083 GETGBL R21 G4 + 0x5C582800, // 0084 MOVE R22 R20 + 0x7C540200, // 0085 CALL R21 1 + 0x1C542B70, // 0086 EQ R21 R21 K112 + 0x78560007, // 0087 JMPF R21 #0090 + 0xB856E400, // 0088 GETNGBL R21 K114 + 0x8C542B73, // 0089 GETMET R21 R21 K115 + 0x5C5C2800, // 008A MOVE R23 R20 + 0x7C540400, // 008B CALL R21 2 + 0x8C542B74, // 008C GETMET R21 R21 K116 + 0x7C540200, // 008D CALL R21 1 + 0x900EE215, // 008E SETMBR R3 K113 R21 + 0x70020002, // 008F JMP #0093 + 0x8C542974, // 0090 GETMET R21 R20 K116 + 0x7C540200, // 0091 CALL R21 1 + 0x900EE215, // 0092 SETMBR R3 K113 R21 + 0xB8564C00, // 0093 GETNGBL R21 K38 + 0x88542B6D, // 0094 GETMBR R21 R21 K109 + 0x8C542B75, // 0095 GETMET R21 R21 K117 + 0x7C540200, // 0096 CALL R21 1 + 0x8C582B76, // 0097 GETMET R22 R21 K118 + 0x58600025, // 0098 LDCONST R24 K37 + 0xB8664C00, // 0099 GETNGBL R25 K38 + 0x8864336D, // 009A GETMBR R25 R25 K109 + 0x88643377, // 009B GETMBR R25 R25 K119 + 0x5C681C00, // 009C MOVE R26 R14 + 0x7C580800, // 009D CALL R22 4 + 0x8C582B76, // 009E GETMET R22 R21 K118 + 0x58600022, // 009F LDCONST R24 K34 + 0xB8664C00, // 00A0 GETNGBL R25 K38 + 0x8864336D, // 00A1 GETMBR R25 R25 K109 + 0x88643377, // 00A2 GETMBR R25 R25 K119 + 0x5C681E00, // 00A3 MOVE R26 R15 + 0x7C580800, // 00A4 CALL R22 4 + 0x8C582B76, // 00A5 GETMET R22 R21 K118 + 0x58600008, // 00A6 LDCONST R24 K8 + 0xB8664C00, // 00A7 GETNGBL R25 K38 + 0x8864336D, // 00A8 GETMBR R25 R25 K109 + 0x88643377, // 00A9 GETMBR R25 R25 K119 + 0x88680778, // 00AA GETMBR R26 R3 K120 + 0x7C580800, // 00AB CALL R22 4 + 0x8C582B76, // 00AC GETMET R22 R21 K118 + 0x54620003, // 00AD LDINT R24 4 + 0xB8664C00, // 00AE GETNGBL R25 K38 + 0x8864336D, // 00AF GETMBR R25 R25 K109 + 0x88643377, // 00B0 GETMBR R25 R25 K119 + 0x88680779, // 00B1 GETMBR R26 R3 K121 + 0x7C580800, // 00B2 CALL R22 4 + 0x8C582B3E, // 00B3 GETMET R22 R21 K62 + 0x7C580200, // 00B4 CALL R22 1 + 0x8C5C057A, // 00B5 GETMET R23 R2 K122 + 0x7C5C0200, // 00B6 CALL R23 1 + 0x8C5C2F7B, // 00B7 GETMET R23 R23 K123 + 0x5C642400, // 00B8 MOVE R25 R18 + 0x5C682C00, // 00B9 MOVE R26 R22 + 0x5C6C2000, // 00BA MOVE R27 R16 + 0x7C5C0800, // 00BB CALL R23 4 + 0x5C602E00, // 00BC MOVE R24 R23 + 0x74620008, // 00BD JMPT R24 #00C7 + 0xB8620A00, // 00BE GETNGBL R24 K5 + 0x5864007C, // 00BF LDCONST R25 K124 + 0x58680022, // 00C0 LDCONST R26 K34 + 0x7C600400, // 00C1 CALL R24 2 + 0xB8620A00, // 00C2 GETNGBL R24 K5 + 0x5864007D, // 00C3 LDCONST R25 K125 + 0x58680022, // 00C4 LDCONST R26 K34 + 0x7C600400, // 00C5 CALL R24 2 + 0x70020003, // 00C6 JMP #00CB + 0xB8620A00, // 00C7 GETNGBL R24 K5 + 0x5864007E, // 00C8 LDCONST R25 K126 + 0x58680008, // 00C9 LDCONST R26 K8 + 0x7C600400, // 00CA CALL R24 2 + 0x8C60054D, // 00CB GETMET R24 R2 K77 + 0x7C600200, // 00CC CALL R24 1 + 0x8C603116, // 00CD GETMET R24 R24 K22 + 0x8868072A, // 00CE GETMBR R26 R3 K42 + 0x7C600400, // 00CF CALL R24 2 + 0x8C603116, // 00D0 GETMET R24 R24 K22 + 0x8868073F, // 00D1 GETMBR R26 R3 K63 + 0x7C600400, // 00D2 CALL R24 2 + 0x8C603116, // 00D3 GETMET R24 R24 K22 + 0x8868097F, // 00D4 GETMBR R26 R4 K127 + 0x7C600400, // 00D5 CALL R24 2 + 0x8C603117, // 00D6 GETMET R24 R24 K23 + 0x7C600200, // 00D7 CALL R24 1 + 0x5C143000, // 00D8 MOVE R5 R24 + 0x4C600000, // 00D9 LDNIL R24 + 0x900E5418, // 00DA SETMBR R3 K42 R24 0x4C600000, // 00DB LDNIL R24 - 0x900E5418, // 00DC SETMBR R3 K42 R24 - 0x4C600000, // 00DD LDNIL R24 - 0x900E7E18, // 00DE SETMBR R3 K63 R24 - 0x8C600560, // 00DF GETMET R24 R2 K96 - 0x7C600200, // 00E0 CALL R24 1 - 0x8C603161, // 00E1 GETMET R24 R24 K97 - 0x88680766, // 00E2 GETMBR R26 R3 K102 - 0x8C6C0714, // 00E3 GETMET R27 R3 K20 - 0x7C6C0200, // 00E4 CALL R27 1 - 0x006C3605, // 00E5 ADD R27 R27 R5 - 0x60700015, // 00E6 GETGBL R28 G21 - 0x7C700000, // 00E7 CALL R28 0 - 0x8C70394E, // 00E8 GETMET R28 R28 K78 - 0x88780162, // 00E9 GETMBR R30 R0 K98 - 0x7C700400, // 00EA CALL R28 2 - 0x5476002F, // 00EB LDINT R29 48 - 0x7C600A00, // 00EC CALL R24 5 - 0x5466000E, // 00ED LDINT R25 15 - 0x40663E19, // 00EE CONNECT R25 K31 R25 - 0x94643019, // 00EF GETIDX R25 R24 R25 - 0x546A000F, // 00F0 LDINT R26 16 - 0x546E001E, // 00F1 LDINT R27 31 - 0x4068341B, // 00F2 CONNECT R26 R26 R27 - 0x9468301A, // 00F3 GETIDX R26 R24 R26 - 0x546E001F, // 00F4 LDINT R27 32 - 0x5472002E, // 00F5 LDINT R28 47 - 0x406C361C, // 00F6 CONNECT R27 R27 R28 - 0x946C301B, // 00F7 GETIDX R27 R24 R27 - 0xB8721400, // 00F8 GETNGBL R28 K10 - 0x8C70395F, // 00F9 GETMET R28 R28 K95 - 0x7C700200, // 00FA CALL R28 1 - 0x8C740124, // 00FB GETMET R29 R0 K36 - 0x5C7C0200, // 00FC MOVE R31 R1 - 0x5880001F, // 00FD LDCONST R32 K31 - 0x5884001F, // 00FE LDCONST R33 K31 - 0x5888001F, // 00FF LDCONST R34 K31 - 0x508C0200, // 0100 LDBOOL R35 1 0 - 0x7C740C00, // 0101 CALL R29 6 - 0x8C740780, // 0102 GETMET R29 R3 K128 - 0x7C740200, // 0103 CALL R29 1 - 0x8C74071C, // 0104 GETMET R29 R3 K28 - 0x5C7C3200, // 0105 MOVE R31 R25 - 0x5C803400, // 0106 MOVE R32 R26 - 0x5C843600, // 0107 MOVE R33 R27 - 0x5C883800, // 0108 MOVE R34 R28 - 0x7C740A00, // 0109 CALL R29 5 - 0x900F031F, // 010A SETMBR R3 K129 K31 - 0x8C740782, // 010B GETMET R29 R3 K130 - 0x7C740200, // 010C CALL R29 1 - 0x8C740783, // 010D GETMET R29 R3 K131 - 0x507C0200, // 010E LDBOOL R31 1 0 - 0x7C740400, // 010F CALL R29 2 - 0x8C740784, // 0110 GETMET R29 R3 K132 + 0x900E7E18, // 00DC SETMBR R3 K63 R24 + 0x8C600560, // 00DD GETMET R24 R2 K96 + 0x7C600200, // 00DE CALL R24 1 + 0x8C603161, // 00DF GETMET R24 R24 K97 + 0x88680766, // 00E0 GETMBR R26 R3 K102 + 0x8C6C0714, // 00E1 GETMET R27 R3 K20 + 0x7C6C0200, // 00E2 CALL R27 1 + 0x006C3605, // 00E3 ADD R27 R27 R5 + 0x60700015, // 00E4 GETGBL R28 G21 + 0x7C700000, // 00E5 CALL R28 0 + 0x8C70394E, // 00E6 GETMET R28 R28 K78 + 0x88780162, // 00E7 GETMBR R30 R0 K98 + 0x7C700400, // 00E8 CALL R28 2 + 0x5476002F, // 00E9 LDINT R29 48 + 0x7C600A00, // 00EA CALL R24 5 + 0x5466000E, // 00EB LDINT R25 15 + 0x40663E19, // 00EC CONNECT R25 K31 R25 + 0x94643019, // 00ED GETIDX R25 R24 R25 + 0x546A000F, // 00EE LDINT R26 16 + 0x546E001E, // 00EF LDINT R27 31 + 0x4068341B, // 00F0 CONNECT R26 R26 R27 + 0x9468301A, // 00F1 GETIDX R26 R24 R26 + 0x546E001F, // 00F2 LDINT R27 32 + 0x5472002E, // 00F3 LDINT R28 47 + 0x406C361C, // 00F4 CONNECT R27 R27 R28 + 0x946C301B, // 00F5 GETIDX R27 R24 R27 + 0xB8721400, // 00F6 GETNGBL R28 K10 + 0x8C70395F, // 00F7 GETMET R28 R28 K95 + 0x7C700200, // 00F8 CALL R28 1 + 0x8C740124, // 00F9 GETMET R29 R0 K36 + 0x5C7C0200, // 00FA MOVE R31 R1 + 0x5880001F, // 00FB LDCONST R32 K31 + 0x5884001F, // 00FC LDCONST R33 K31 + 0x5888001F, // 00FD LDCONST R34 K31 + 0x508C0200, // 00FE LDBOOL R35 1 0 + 0x7C740C00, // 00FF CALL R29 6 + 0x8C740780, // 0100 GETMET R29 R3 K128 + 0x7C740200, // 0101 CALL R29 1 + 0x8C74071C, // 0102 GETMET R29 R3 K28 + 0x5C7C3200, // 0103 MOVE R31 R25 + 0x5C803400, // 0104 MOVE R32 R26 + 0x5C843600, // 0105 MOVE R33 R27 + 0x5C883800, // 0106 MOVE R34 R28 + 0x7C740A00, // 0107 CALL R29 5 + 0x900F031F, // 0108 SETMBR R3 K129 K31 + 0x8C740782, // 0109 GETMET R29 R3 K130 + 0x7C740200, // 010A CALL R29 1 + 0x8C740783, // 010B GETMET R29 R3 K131 + 0x507C0200, // 010C LDBOOL R31 1 0 + 0x7C740400, // 010D CALL R29 2 + 0x8C740784, // 010E GETMET R29 R3 K132 + 0x7C740200, // 010F CALL R29 1 + 0x8C740785, // 0110 GETMET R29 R3 K133 0x7C740200, // 0111 CALL R29 1 - 0x8C740785, // 0112 GETMET R29 R3 K133 + 0x8C740786, // 0112 GETMET R29 R3 K134 0x7C740200, // 0113 CALL R29 1 - 0x8C740786, // 0114 GETMET R29 R3 K134 - 0x7C740200, // 0115 CALL R29 1 - 0x50740200, // 0116 LDBOOL R29 1 0 - 0x80043A00, // 0117 RET 1 R29 + 0x50740200, // 0114 LDBOOL R29 1 0 + 0x80043A00, // 0115 RET 1 R29 }) ) ); @@ -1306,7 +1304,7 @@ be_local_closure(class_Matter_Commisioning_Context_parse_Sigma1, /* name */ &be_ktab_class_Matter_Commisioning_Context, /* shared constants */ be_str_weak(parse_Sigma1), &be_const_str_solidified, - ( &(const binstruction[497]) { /* code */ + ( &(const binstruction[495]) { /* code */ 0xA40A1200, // 0000 IMPORT R2 K9 0x880C0300, // 0001 GETMBR R3 R1 K0 0x8810031D, // 0002 GETMBR R4 R1 K29 @@ -1374,7 +1372,7 @@ be_local_closure(class_Matter_Commisioning_Context_parse_Sigma1, /* name */ 0x58240008, // 0040 LDCONST R9 K8 0x7C1C0400, // 0041 CALL R7 2 0x50140000, // 0042 LDBOOL R5 0 0 - 0x781600C3, // 0043 JMPF R5 #0108 + 0x781600C1, // 0043 JMPF R5 #0106 0xB81E0A00, // 0044 GETNGBL R7 K5 0x58200097, // 0045 LDCONST R8 K151 0x58240008, // 0046 LDCONST R9 K8 @@ -1404,406 +1402,404 @@ be_local_closure(class_Matter_Commisioning_Context_parse_Sigma1, /* name */ 0x402E3E0B, // 005E CONNECT R11 K31 R11 0x88300993, // 005F GETMBR R12 R4 K147 0x942C180B, // 0060 GETIDX R11 R12 R11 - 0x5435FFEF, // 0061 LDINT R13 -16 - 0x40341B03, // 0062 CONNECT R13 R13 K3 - 0x88380993, // 0063 GETMBR R14 R4 K147 - 0x94301C0D, // 0064 GETIDX R12 R14 R13 - 0x8C3C0568, // 0065 GETMET R15 R2 K104 - 0x5C441200, // 0066 MOVE R17 R9 - 0x5C481400, // 0067 MOVE R18 R10 - 0x604C0015, // 0068 GETGBL R19 G21 - 0x7C4C0000, // 0069 CALL R19 0 - 0x6050000C, // 006A GETGBL R20 G12 - 0x5C541600, // 006B MOVE R21 R11 - 0x7C500200, // 006C CALL R20 1 - 0x5456000F, // 006D LDINT R21 16 - 0x7C3C0C00, // 006E CALL R15 6 - 0x5C341E00, // 006F MOVE R13 R15 - 0x8C3C1B6A, // 0070 GETMET R15 R13 K106 - 0x5C441600, // 0071 MOVE R17 R11 - 0x7C3C0400, // 0072 CALL R15 2 - 0x5C381E00, // 0073 MOVE R14 R15 - 0x8C3C1B6B, // 0074 GETMET R15 R13 K107 - 0x7C3C0200, // 0075 CALL R15 1 - 0x1C40180F, // 0076 EQ R16 R12 R15 - 0x7842008A, // 0077 JMPF R16 #0103 - 0x88400D95, // 0078 GETMBR R16 R6 K149 - 0x900F2A10, // 0079 SETMBR R3 K149 R16 - 0x8840039B, // 007A GETMBR R16 R1 K155 - 0x900F3410, // 007B SETMBR R3 K154 R16 - 0x8C40079C, // 007C GETMET R16 R3 K156 - 0x7C400200, // 007D CALL R16 1 - 0x8840092E, // 007E GETMBR R16 R4 K46 - 0x900E5A10, // 007F SETMBR R3 K45 R16 - 0x8840010D, // 0080 GETMBR R16 R0 K13 - 0x8840210E, // 0081 GETMBR R16 R16 K14 - 0x8C402130, // 0082 GETMET R16 R16 K48 - 0x7C400200, // 0083 CALL R16 1 - 0x900E5E10, // 0084 SETMBR R3 K47 R16 - 0xB8420A00, // 0085 GETNGBL R16 K5 - 0x60440018, // 0086 GETGBL R17 G24 - 0x58480031, // 0087 LDCONST R18 K49 - 0x884C072F, // 0088 GETMBR R19 R3 K47 - 0x88500332, // 0089 GETMBR R20 R1 K50 - 0x88540333, // 008A GETMBR R21 R1 K51 - 0x7C440800, // 008B CALL R17 4 - 0x58480008, // 008C LDCONST R18 K8 - 0x7C400400, // 008D CALL R16 2 - 0x88400D66, // 008E GETMBR R16 R6 K102 - 0x900ECC10, // 008F SETMBR R3 K102 R16 - 0x8C400537, // 0090 GETMET R16 R2 K55 - 0x544A000F, // 0091 LDINT R18 16 - 0x7C400400, // 0092 CALL R16 2 - 0x900F3A10, // 0093 SETMBR R3 K157 R16 - 0x60400015, // 0094 GETGBL R16 G21 - 0x7C400000, // 0095 CALL R16 0 - 0x8C40214E, // 0096 GETMET R16 R16 K78 - 0x5848009E, // 0097 LDCONST R18 K158 - 0x7C400400, // 0098 CALL R16 2 - 0x88440935, // 0099 GETMBR R17 R4 K53 - 0x8848079D, // 009A GETMBR R18 R3 K157 - 0x00442212, // 009B ADD R17 R17 R18 - 0x8C480560, // 009C GETMET R18 R2 K96 - 0x7C480200, // 009D CALL R18 1 - 0x8C482561, // 009E GETMET R18 R18 K97 - 0x88500766, // 009F GETMBR R20 R3 K102 - 0x5C542200, // 00A0 MOVE R21 R17 - 0x5C582000, // 00A1 MOVE R22 R16 - 0x545E000F, // 00A2 LDINT R23 16 - 0x7C480A00, // 00A3 CALL R18 5 - 0x8C4C0568, // 00A4 GETMET R19 R2 K104 - 0x5C542400, // 00A5 MOVE R21 R18 - 0x60580015, // 00A6 GETGBL R22 G21 - 0x7C580000, // 00A7 CALL R22 0 - 0x8C582D4E, // 00A8 GETMET R22 R22 K78 - 0x5860009F, // 00A9 LDCONST R24 K159 - 0x7C580400, // 00AA CALL R22 2 - 0x605C0015, // 00AB GETGBL R23 G21 - 0x7C5C0000, // 00AC CALL R23 0 - 0x5860001F, // 00AD LDCONST R24 K31 - 0x5466000F, // 00AE LDINT R25 16 - 0x7C4C0C00, // 00AF CALL R19 6 - 0x8C50276B, // 00B0 GETMET R20 R19 K107 - 0x7C500200, // 00B1 CALL R20 1 - 0xB8564C00, // 00B2 GETNGBL R21 K38 - 0x8C542BA0, // 00B3 GETMET R21 R21 K160 - 0x7C540200, // 00B4 CALL R21 1 - 0x8858079D, // 00B5 GETMBR R22 R3 K157 - 0x90572416, // 00B6 SETMBR R21 K146 R22 - 0x90574214, // 00B7 SETMBR R21 K161 R20 - 0x8858072F, // 00B8 GETMBR R22 R3 K47 - 0x90574416, // 00B9 SETMBR R21 K162 R22 - 0x88580935, // 00BA GETMBR R22 R4 K53 - 0x885C0D9D, // 00BB GETMBR R23 R6 K157 - 0x00582C17, // 00BC ADD R22 R22 R23 - 0x8C5C0560, // 00BD GETMET R23 R2 K96 - 0x7C5C0200, // 00BE CALL R23 1 - 0x8C5C2F61, // 00BF GETMET R23 R23 K97 - 0x88640766, // 00C0 GETMBR R25 R3 K102 - 0x5C682C00, // 00C1 MOVE R26 R22 - 0x606C0015, // 00C2 GETGBL R27 G21 - 0x7C6C0000, // 00C3 CALL R27 0 - 0x8C6C374E, // 00C4 GETMET R27 R27 K78 - 0x587400A3, // 00C5 LDCONST R29 K163 - 0x7C6C0400, // 00C6 CALL R27 2 - 0x5472002F, // 00C7 LDINT R28 48 - 0x7C5C0A00, // 00C8 CALL R23 5 - 0x5462000E, // 00C9 LDINT R24 15 - 0x40623E18, // 00CA CONNECT R24 K31 R24 - 0x94602E18, // 00CB GETIDX R24 R23 R24 - 0x5466000F, // 00CC LDINT R25 16 - 0x546A001E, // 00CD LDINT R26 31 - 0x4064321A, // 00CE CONNECT R25 R25 R26 - 0x94642E19, // 00CF GETIDX R25 R23 R25 - 0x546A001F, // 00D0 LDINT R26 32 - 0x546E002E, // 00D1 LDINT R27 47 - 0x4068341B, // 00D2 CONNECT R26 R26 R27 - 0x94682E1A, // 00D3 GETIDX R26 R23 R26 - 0xB86E1400, // 00D4 GETNGBL R27 K10 - 0x8C6C375F, // 00D5 GETMET R27 R27 K95 - 0x7C6C0200, // 00D6 CALL R27 1 - 0x8C702B3E, // 00D7 GETMET R28 R21 K62 - 0x7C700200, // 00D8 CALL R28 1 - 0x4C740000, // 00D9 LDNIL R29 - 0x900E541D, // 00DA SETMBR R3 K42 R29 - 0x8C740340, // 00DB GETMET R29 R1 K64 - 0x547E0032, // 00DC LDINT R31 51 - 0x50800200, // 00DD LDBOOL R32 1 0 - 0x7C740600, // 00DE CALL R29 3 - 0x8C783B41, // 00DF GETMET R30 R29 K65 - 0x5C803800, // 00E0 MOVE R32 R28 - 0x7C780400, // 00E1 CALL R30 2 - 0x887C0142, // 00E2 GETMBR R31 R0 K66 - 0x8C7C3F43, // 00E3 GETMET R31 R31 K67 - 0x5C843A00, // 00E4 MOVE R33 R29 - 0x7C7C0400, // 00E5 CALL R31 2 - 0x8C7C0780, // 00E6 GETMET R31 R3 K128 - 0x7C7C0200, // 00E7 CALL R31 1 - 0x8C7C071C, // 00E8 GETMET R31 R3 K28 - 0x5C843000, // 00E9 MOVE R33 R24 - 0x5C883200, // 00EA MOVE R34 R25 - 0x5C8C3400, // 00EB MOVE R35 R26 - 0x5C903600, // 00EC MOVE R36 R27 - 0x7C7C0A00, // 00ED CALL R31 5 - 0x887C0D71, // 00EE GETMBR R31 R6 K113 - 0x900EE21F, // 00EF SETMBR R3 K113 R31 - 0x900F031F, // 00F0 SETMBR R3 K129 K31 - 0x8C7C0782, // 00F1 GETMET R31 R3 K130 - 0x7C7C0200, // 00F2 CALL R31 1 - 0x8C7C0783, // 00F3 GETMET R31 R3 K131 - 0x50840200, // 00F4 LDBOOL R33 1 0 - 0x7C7C0400, // 00F5 CALL R31 2 - 0x8C7C0784, // 00F6 GETMET R31 R3 K132 + 0x5431FFEF, // 0061 LDINT R12 -16 + 0x40301903, // 0062 CONNECT R12 R12 K3 + 0x88340993, // 0063 GETMBR R13 R4 K147 + 0x94301A0C, // 0064 GETIDX R12 R13 R12 + 0x8C340568, // 0065 GETMET R13 R2 K104 + 0x5C3C1200, // 0066 MOVE R15 R9 + 0x5C401400, // 0067 MOVE R16 R10 + 0x60440015, // 0068 GETGBL R17 G21 + 0x7C440000, // 0069 CALL R17 0 + 0x6048000C, // 006A GETGBL R18 G12 + 0x5C4C1600, // 006B MOVE R19 R11 + 0x7C480200, // 006C CALL R18 1 + 0x544E000F, // 006D LDINT R19 16 + 0x7C340C00, // 006E CALL R13 6 + 0x8C381B6A, // 006F GETMET R14 R13 K106 + 0x5C401600, // 0070 MOVE R16 R11 + 0x7C380400, // 0071 CALL R14 2 + 0x8C3C1B6B, // 0072 GETMET R15 R13 K107 + 0x7C3C0200, // 0073 CALL R15 1 + 0x1C40180F, // 0074 EQ R16 R12 R15 + 0x7842008A, // 0075 JMPF R16 #0101 + 0x88400D95, // 0076 GETMBR R16 R6 K149 + 0x900F2A10, // 0077 SETMBR R3 K149 R16 + 0x8840039B, // 0078 GETMBR R16 R1 K155 + 0x900F3410, // 0079 SETMBR R3 K154 R16 + 0x8C40079C, // 007A GETMET R16 R3 K156 + 0x7C400200, // 007B CALL R16 1 + 0x8840092E, // 007C GETMBR R16 R4 K46 + 0x900E5A10, // 007D SETMBR R3 K45 R16 + 0x8840010D, // 007E GETMBR R16 R0 K13 + 0x8840210E, // 007F GETMBR R16 R16 K14 + 0x8C402130, // 0080 GETMET R16 R16 K48 + 0x7C400200, // 0081 CALL R16 1 + 0x900E5E10, // 0082 SETMBR R3 K47 R16 + 0xB8420A00, // 0083 GETNGBL R16 K5 + 0x60440018, // 0084 GETGBL R17 G24 + 0x58480031, // 0085 LDCONST R18 K49 + 0x884C072F, // 0086 GETMBR R19 R3 K47 + 0x88500332, // 0087 GETMBR R20 R1 K50 + 0x88540333, // 0088 GETMBR R21 R1 K51 + 0x7C440800, // 0089 CALL R17 4 + 0x58480008, // 008A LDCONST R18 K8 + 0x7C400400, // 008B CALL R16 2 + 0x88400D66, // 008C GETMBR R16 R6 K102 + 0x900ECC10, // 008D SETMBR R3 K102 R16 + 0x8C400537, // 008E GETMET R16 R2 K55 + 0x544A000F, // 008F LDINT R18 16 + 0x7C400400, // 0090 CALL R16 2 + 0x900F3A10, // 0091 SETMBR R3 K157 R16 + 0x60400015, // 0092 GETGBL R16 G21 + 0x7C400000, // 0093 CALL R16 0 + 0x8C40214E, // 0094 GETMET R16 R16 K78 + 0x5848009E, // 0095 LDCONST R18 K158 + 0x7C400400, // 0096 CALL R16 2 + 0x88440935, // 0097 GETMBR R17 R4 K53 + 0x8848079D, // 0098 GETMBR R18 R3 K157 + 0x00442212, // 0099 ADD R17 R17 R18 + 0x8C480560, // 009A GETMET R18 R2 K96 + 0x7C480200, // 009B CALL R18 1 + 0x8C482561, // 009C GETMET R18 R18 K97 + 0x88500766, // 009D GETMBR R20 R3 K102 + 0x5C542200, // 009E MOVE R21 R17 + 0x5C582000, // 009F MOVE R22 R16 + 0x545E000F, // 00A0 LDINT R23 16 + 0x7C480A00, // 00A1 CALL R18 5 + 0x8C4C0568, // 00A2 GETMET R19 R2 K104 + 0x5C542400, // 00A3 MOVE R21 R18 + 0x60580015, // 00A4 GETGBL R22 G21 + 0x7C580000, // 00A5 CALL R22 0 + 0x8C582D4E, // 00A6 GETMET R22 R22 K78 + 0x5860009F, // 00A7 LDCONST R24 K159 + 0x7C580400, // 00A8 CALL R22 2 + 0x605C0015, // 00A9 GETGBL R23 G21 + 0x7C5C0000, // 00AA CALL R23 0 + 0x5860001F, // 00AB LDCONST R24 K31 + 0x5466000F, // 00AC LDINT R25 16 + 0x7C4C0C00, // 00AD CALL R19 6 + 0x8C50276B, // 00AE GETMET R20 R19 K107 + 0x7C500200, // 00AF CALL R20 1 + 0xB8564C00, // 00B0 GETNGBL R21 K38 + 0x8C542BA0, // 00B1 GETMET R21 R21 K160 + 0x7C540200, // 00B2 CALL R21 1 + 0x8858079D, // 00B3 GETMBR R22 R3 K157 + 0x90572416, // 00B4 SETMBR R21 K146 R22 + 0x90574214, // 00B5 SETMBR R21 K161 R20 + 0x8858072F, // 00B6 GETMBR R22 R3 K47 + 0x90574416, // 00B7 SETMBR R21 K162 R22 + 0x88580935, // 00B8 GETMBR R22 R4 K53 + 0x885C0D9D, // 00B9 GETMBR R23 R6 K157 + 0x00582C17, // 00BA ADD R22 R22 R23 + 0x8C5C0560, // 00BB GETMET R23 R2 K96 + 0x7C5C0200, // 00BC CALL R23 1 + 0x8C5C2F61, // 00BD GETMET R23 R23 K97 + 0x88640766, // 00BE GETMBR R25 R3 K102 + 0x5C682C00, // 00BF MOVE R26 R22 + 0x606C0015, // 00C0 GETGBL R27 G21 + 0x7C6C0000, // 00C1 CALL R27 0 + 0x8C6C374E, // 00C2 GETMET R27 R27 K78 + 0x587400A3, // 00C3 LDCONST R29 K163 + 0x7C6C0400, // 00C4 CALL R27 2 + 0x5472002F, // 00C5 LDINT R28 48 + 0x7C5C0A00, // 00C6 CALL R23 5 + 0x5462000E, // 00C7 LDINT R24 15 + 0x40623E18, // 00C8 CONNECT R24 K31 R24 + 0x94602E18, // 00C9 GETIDX R24 R23 R24 + 0x5466000F, // 00CA LDINT R25 16 + 0x546A001E, // 00CB LDINT R26 31 + 0x4064321A, // 00CC CONNECT R25 R25 R26 + 0x94642E19, // 00CD GETIDX R25 R23 R25 + 0x546A001F, // 00CE LDINT R26 32 + 0x546E002E, // 00CF LDINT R27 47 + 0x4068341B, // 00D0 CONNECT R26 R26 R27 + 0x94682E1A, // 00D1 GETIDX R26 R23 R26 + 0xB86E1400, // 00D2 GETNGBL R27 K10 + 0x8C6C375F, // 00D3 GETMET R27 R27 K95 + 0x7C6C0200, // 00D4 CALL R27 1 + 0x8C702B3E, // 00D5 GETMET R28 R21 K62 + 0x7C700200, // 00D6 CALL R28 1 + 0x4C740000, // 00D7 LDNIL R29 + 0x900E541D, // 00D8 SETMBR R3 K42 R29 + 0x8C740340, // 00D9 GETMET R29 R1 K64 + 0x547E0032, // 00DA LDINT R31 51 + 0x50800200, // 00DB LDBOOL R32 1 0 + 0x7C740600, // 00DC CALL R29 3 + 0x8C783B41, // 00DD GETMET R30 R29 K65 + 0x5C803800, // 00DE MOVE R32 R28 + 0x7C780400, // 00DF CALL R30 2 + 0x887C0142, // 00E0 GETMBR R31 R0 K66 + 0x8C7C3F43, // 00E1 GETMET R31 R31 K67 + 0x5C843A00, // 00E2 MOVE R33 R29 + 0x7C7C0400, // 00E3 CALL R31 2 + 0x8C7C0780, // 00E4 GETMET R31 R3 K128 + 0x7C7C0200, // 00E5 CALL R31 1 + 0x8C7C071C, // 00E6 GETMET R31 R3 K28 + 0x5C843000, // 00E7 MOVE R33 R24 + 0x5C883200, // 00E8 MOVE R34 R25 + 0x5C8C3400, // 00E9 MOVE R35 R26 + 0x5C903600, // 00EA MOVE R36 R27 + 0x7C7C0A00, // 00EB CALL R31 5 + 0x887C0D71, // 00EC GETMBR R31 R6 K113 + 0x900EE21F, // 00ED SETMBR R3 K113 R31 + 0x900F031F, // 00EE SETMBR R3 K129 K31 + 0x8C7C0782, // 00EF GETMET R31 R3 K130 + 0x7C7C0200, // 00F0 CALL R31 1 + 0x8C7C0783, // 00F1 GETMET R31 R3 K131 + 0x50840200, // 00F2 LDBOOL R33 1 0 + 0x7C7C0400, // 00F3 CALL R31 2 + 0x8C7C0784, // 00F4 GETMET R31 R3 K132 + 0x7C7C0200, // 00F5 CALL R31 1 + 0x8C7C0785, // 00F6 GETMET R31 R3 K133 0x7C7C0200, // 00F7 CALL R31 1 - 0x8C7C0785, // 00F8 GETMET R31 R3 K133 + 0x8C7C0786, // 00F8 GETMET R31 R3 K134 0x7C7C0200, // 00F9 CALL R31 1 - 0x8C7C0786, // 00FA GETMET R31 R3 K134 - 0x7C7C0200, // 00FB CALL R31 1 - 0xB87E0A00, // 00FC GETNGBL R31 K5 - 0x588000A4, // 00FD LDCONST R32 K164 - 0x58840008, // 00FE LDCONST R33 K8 - 0x7C7C0400, // 00FF CALL R31 2 - 0x507C0200, // 0100 LDBOOL R31 1 0 - 0x80043E00, // 0101 RET 1 R31 - 0x70020004, // 0102 JMP #0108 - 0xB8420A00, // 0103 GETNGBL R16 K5 - 0x584400A5, // 0104 LDCONST R17 K165 - 0x58480008, // 0105 LDCONST R18 K8 - 0x7C400400, // 0106 CALL R16 2 - 0x50140000, // 0107 LDBOOL R5 0 0 - 0x5C1C0A00, // 0108 MOVE R7 R5 - 0x741E00E4, // 0109 JMPT R7 #01EF - 0x8C1C01A6, // 010A GETMET R7 R0 K166 - 0x882409A7, // 010B GETMBR R9 R4 K167 - 0x88280935, // 010C GETMBR R10 R4 K53 - 0x7C1C0600, // 010D CALL R7 3 - 0x900F2A07, // 010E SETMBR R3 K149 R7 - 0x4C200000, // 010F LDNIL R8 - 0x1C200608, // 0110 EQ R8 R3 R8 - 0x74220003, // 0111 JMPT R8 #0116 - 0x88200795, // 0112 GETMBR R8 R3 K149 - 0x4C240000, // 0113 LDNIL R9 - 0x1C201009, // 0114 EQ R8 R8 R9 - 0x7822000C, // 0115 JMPF R8 #0123 - 0xB8220A00, // 0116 GETNGBL R8 K5 - 0x582400A8, // 0117 LDCONST R9 K168 - 0x58280008, // 0118 LDCONST R10 K8 - 0x7C200400, // 0119 CALL R8 2 - 0x8C200124, // 011A GETMET R8 R0 K36 - 0x5C280200, // 011B MOVE R10 R1 - 0x582C0025, // 011C LDCONST R11 K37 - 0x5830001F, // 011D LDCONST R12 K31 - 0x58340025, // 011E LDCONST R13 K37 - 0x50380000, // 011F LDBOOL R14 0 0 - 0x7C200C00, // 0120 CALL R8 6 - 0x50200000, // 0121 LDBOOL R8 0 0 - 0x80041000, // 0122 RET 1 R8 - 0x8820039B, // 0123 GETMBR R8 R1 K155 - 0x900F3408, // 0124 SETMBR R3 K154 R8 - 0x8C20079C, // 0125 GETMET R8 R3 K156 - 0x7C200200, // 0126 CALL R8 1 - 0x8820092E, // 0127 GETMBR R8 R4 K46 - 0x900E5A08, // 0128 SETMBR R3 K45 R8 - 0x8820010D, // 0129 GETMBR R8 R0 K13 - 0x8820110E, // 012A GETMBR R8 R8 K14 - 0x8C201130, // 012B GETMET R8 R8 K48 - 0x7C200200, // 012C CALL R8 1 - 0x900E5E08, // 012D SETMBR R3 K47 R8 - 0xB8220A00, // 012E GETNGBL R8 K5 - 0x60240018, // 012F GETGBL R9 G24 - 0x58280031, // 0130 LDCONST R10 K49 - 0x882C072F, // 0131 GETMBR R11 R3 K47 - 0x88300332, // 0132 GETMBR R12 R1 K50 - 0x88340333, // 0133 GETMBR R13 R1 K51 - 0x7C240800, // 0134 CALL R9 4 - 0x58280008, // 0135 LDCONST R10 K8 - 0x7C200400, // 0136 CALL R8 2 - 0x8C200537, // 0137 GETMET R8 R2 K55 - 0x542A000F, // 0138 LDINT R10 16 - 0x7C200400, // 0139 CALL R8 2 - 0x900F3A08, // 013A SETMBR R3 K157 R8 - 0x8C200537, // 013B GETMET R8 R2 K55 - 0x542A001F, // 013C LDINT R10 32 - 0x7C200400, // 013D CALL R8 2 - 0x900F5208, // 013E SETMBR R3 K169 R8 - 0x8C20057A, // 013F GETMET R8 R2 K122 - 0x7C200200, // 0140 CALL R8 1 - 0x8C2011AA, // 0141 GETMET R8 R8 K170 - 0x882807A9, // 0142 GETMBR R10 R3 K169 - 0x7C200400, // 0143 CALL R8 2 - 0x900EF208, // 0144 SETMBR R3 K121 R8 - 0x8C200537, // 0145 GETMET R8 R2 K55 - 0x542A001F, // 0146 LDINT R10 32 - 0x7C200400, // 0147 CALL R8 2 - 0x8C24057A, // 0148 GETMET R9 R2 K122 - 0x7C240200, // 0149 CALL R9 1 - 0x8C2413AB, // 014A GETMET R9 R9 K171 - 0x882C07A9, // 014B GETMBR R11 R3 K169 - 0x88300991, // 014C GETMBR R12 R4 K145 - 0x7C240600, // 014D CALL R9 3 - 0x900ECC09, // 014E SETMBR R3 K102 R9 - 0xB8264C00, // 014F GETNGBL R9 K38 - 0x8824136D, // 0150 GETMBR R9 R9 K109 - 0x8C241375, // 0151 GETMET R9 R9 K117 - 0x7C240200, // 0152 CALL R9 1 - 0x8C281376, // 0153 GETMET R10 R9 K118 - 0x58300025, // 0154 LDCONST R12 K37 - 0xB8364C00, // 0155 GETNGBL R13 K38 - 0x88341B6D, // 0156 GETMBR R13 R13 K109 - 0x88341BAC, // 0157 GETMBR R13 R13 K172 - 0x8C380FAD, // 0158 GETMET R14 R7 K173 - 0x7C380200, // 0159 CALL R14 1 - 0x7C280800, // 015A CALL R10 4 - 0x8C281376, // 015B GETMET R10 R9 K118 - 0x58300022, // 015C LDCONST R12 K34 - 0xB8364C00, // 015D GETNGBL R13 K38 - 0x88341B6D, // 015E GETMBR R13 R13 K109 - 0x88341BAC, // 015F GETMBR R13 R13 K172 - 0x8C380FAE, // 0160 GETMET R14 R7 K174 - 0x7C380200, // 0161 CALL R14 1 - 0x7C280800, // 0162 CALL R10 4 - 0x8C281376, // 0163 GETMET R10 R9 K118 - 0x58300008, // 0164 LDCONST R12 K8 - 0xB8364C00, // 0165 GETNGBL R13 K38 - 0x88341B6D, // 0166 GETMBR R13 R13 K109 - 0x88341BAC, // 0167 GETMBR R13 R13 K172 - 0x88380779, // 0168 GETMBR R14 R3 K121 - 0x7C280800, // 0169 CALL R10 4 - 0x8C281376, // 016A GETMET R10 R9 K118 - 0x54320003, // 016B LDINT R12 4 - 0xB8364C00, // 016C GETNGBL R13 K38 - 0x88341B6D, // 016D GETMBR R13 R13 K109 - 0x88341BAC, // 016E GETMBR R13 R13 K172 - 0x88380991, // 016F GETMBR R14 R4 K145 - 0x7C280800, // 0170 CALL R10 4 - 0x8C28057A, // 0171 GETMET R10 R2 K122 - 0x7C280200, // 0172 CALL R10 1 - 0x8C2815AF, // 0173 GETMET R10 R10 K175 - 0x8C300FB0, // 0174 GETMET R12 R7 K176 - 0x7C300200, // 0175 CALL R12 1 - 0x8C34133E, // 0176 GETMET R13 R9 K62 - 0x7C340200, // 0177 CALL R13 1 - 0x7C280600, // 0178 CALL R10 3 - 0xB82E4C00, // 0179 GETNGBL R11 K38 - 0x882C176D, // 017A GETMBR R11 R11 K109 - 0x8C2C1775, // 017B GETMET R11 R11 K117 - 0x7C2C0200, // 017C CALL R11 1 - 0x8C301776, // 017D GETMET R12 R11 K118 - 0x58380025, // 017E LDCONST R14 K37 - 0xB83E4C00, // 017F GETNGBL R15 K38 - 0x883C1F6D, // 0180 GETMBR R15 R15 K109 - 0x883C1FAC, // 0181 GETMBR R15 R15 K172 - 0x8C400FAD, // 0182 GETMET R16 R7 K173 - 0x7C400200, // 0183 CALL R16 1 - 0x7C300800, // 0184 CALL R12 4 - 0x8C301776, // 0185 GETMET R12 R11 K118 - 0x58380022, // 0186 LDCONST R14 K34 - 0xB83E4C00, // 0187 GETNGBL R15 K38 - 0x883C1F6D, // 0188 GETMBR R15 R15 K109 - 0x883C1FAC, // 0189 GETMBR R15 R15 K172 - 0x8C400FAE, // 018A GETMET R16 R7 K174 - 0x7C400200, // 018B CALL R16 1 - 0x7C300800, // 018C CALL R12 4 - 0x8C301776, // 018D GETMET R12 R11 K118 - 0x58380008, // 018E LDCONST R14 K8 - 0xB83E4C00, // 018F GETNGBL R15 K38 - 0x883C1F6D, // 0190 GETMBR R15 R15 K109 - 0x883C1FAC, // 0191 GETMBR R15 R15 K172 - 0x5C401400, // 0192 MOVE R16 R10 - 0x7C300800, // 0193 CALL R12 4 - 0x8C301776, // 0194 GETMET R12 R11 K118 - 0x543A0003, // 0195 LDINT R14 4 - 0xB83E4C00, // 0196 GETNGBL R15 K38 - 0x883C1F6D, // 0197 GETMBR R15 R15 K109 - 0x883C1FAC, // 0198 GETMBR R15 R15 K172 - 0x8840079D, // 0199 GETMBR R16 R3 K157 - 0x7C300800, // 019A CALL R12 4 - 0x883009B1, // 019B GETMBR R12 R4 K177 - 0x900E540C, // 019C SETMBR R3 K42 R12 - 0x8C30054D, // 019D GETMET R12 R2 K77 - 0x7C300200, // 019E CALL R12 1 - 0x8C301916, // 019F GETMET R12 R12 K22 - 0x8838072A, // 01A0 GETMBR R14 R3 K42 - 0x7C300400, // 01A1 CALL R12 2 - 0x8C301917, // 01A2 GETMET R12 R12 K23 - 0x7C300200, // 01A3 CALL R12 1 - 0x60340015, // 01A4 GETGBL R13 G21 - 0x7C340000, // 01A5 CALL R13 0 - 0x8C341B4E, // 01A6 GETMET R13 R13 K78 - 0x883C01B2, // 01A7 GETMBR R15 R0 K178 - 0x7C340400, // 01A8 CALL R13 2 - 0x8C380F14, // 01A9 GETMET R14 R7 K20 - 0x7C380200, // 01AA CALL R14 1 - 0x00381C08, // 01AB ADD R14 R14 R8 - 0x883C0779, // 01AC GETMBR R15 R3 K121 - 0x00381C0F, // 01AD ADD R14 R14 R15 - 0x00381C0C, // 01AE ADD R14 R14 R12 - 0x8C3C0560, // 01AF GETMET R15 R2 K96 - 0x7C3C0200, // 01B0 CALL R15 1 - 0x8C3C1F61, // 01B1 GETMET R15 R15 K97 - 0x88440766, // 01B2 GETMBR R17 R3 K102 - 0x5C481C00, // 01B3 MOVE R18 R14 - 0x5C4C1A00, // 01B4 MOVE R19 R13 - 0x5452000F, // 01B5 LDINT R20 16 - 0x7C3C0A00, // 01B6 CALL R15 5 - 0x8C40173E, // 01B7 GETMET R16 R11 K62 - 0x7C400200, // 01B8 CALL R16 1 - 0x8C440568, // 01B9 GETMET R17 R2 K104 - 0x5C4C1E00, // 01BA MOVE R19 R15 - 0x60500015, // 01BB GETGBL R20 G21 - 0x7C500000, // 01BC CALL R20 0 - 0x8C50294E, // 01BD GETMET R20 R20 K78 - 0x885801B3, // 01BE GETMBR R22 R0 K179 - 0x7C500400, // 01BF CALL R20 2 - 0x60540015, // 01C0 GETGBL R21 G21 - 0x7C540000, // 01C1 CALL R21 0 - 0x6058000C, // 01C2 GETGBL R22 G12 - 0x5C5C2000, // 01C3 MOVE R23 R16 - 0x7C580200, // 01C4 CALL R22 1 - 0x545E000F, // 01C5 LDINT R23 16 - 0x7C440C00, // 01C6 CALL R17 6 - 0x8C4823B4, // 01C7 GETMET R18 R17 K180 - 0x5C502000, // 01C8 MOVE R20 R16 - 0x7C480400, // 01C9 CALL R18 2 - 0x8C4C236B, // 01CA GETMET R19 R17 K107 - 0x7C4C0200, // 01CB CALL R19 1 - 0x00482413, // 01CC ADD R18 R18 R19 - 0xB84E4C00, // 01CD GETNGBL R19 K38 - 0x8C4C27B5, // 01CE GETMET R19 R19 K181 - 0x7C4C0200, // 01CF CALL R19 1 - 0x904E6C08, // 01D0 SETMBR R19 K54 R8 - 0x8850072F, // 01D1 GETMBR R20 R3 K47 - 0x904E7014, // 01D2 SETMBR R19 K56 R20 - 0x88500779, // 01D3 GETMBR R20 R3 K121 - 0x904F6C14, // 01D4 SETMBR R19 K182 R20 - 0x904F6E12, // 01D5 SETMBR R19 K183 R18 - 0x8C50273E, // 01D6 GETMET R20 R19 K62 - 0x7C500200, // 01D7 CALL R20 1 - 0x900E7E14, // 01D8 SETMBR R3 K63 R20 - 0x8C540340, // 01D9 GETMET R21 R1 K64 - 0x545E0030, // 01DA LDINT R23 49 - 0x50600200, // 01DB LDBOOL R24 1 0 - 0x7C540600, // 01DC CALL R21 3 - 0x8C582B41, // 01DD GETMET R22 R21 K65 - 0x5C602800, // 01DE MOVE R24 R20 - 0x7C580400, // 01DF CALL R22 2 - 0xB85E0A00, // 01E0 GETNGBL R23 K5 - 0x60600018, // 01E1 GETGBL R24 G24 - 0x586400B8, // 01E2 LDCONST R25 K184 - 0x8868072F, // 01E3 GETMBR R26 R3 K47 - 0x886C075A, // 01E4 GETMBR R27 R3 K90 - 0x8870075B, // 01E5 GETMBR R28 R3 K91 - 0x7C600800, // 01E6 CALL R24 4 - 0x58640022, // 01E7 LDCONST R25 K34 - 0x7C5C0400, // 01E8 CALL R23 2 - 0x885C0142, // 01E9 GETMBR R23 R0 K66 - 0x8C5C2F43, // 01EA GETMET R23 R23 K67 - 0x5C642A00, // 01EB MOVE R25 R21 - 0x7C5C0400, // 01EC CALL R23 2 - 0x505C0200, // 01ED LDBOOL R23 1 0 - 0x80042E00, // 01EE RET 1 R23 - 0x501C0200, // 01EF LDBOOL R7 1 0 - 0x80040E00, // 01F0 RET 1 R7 + 0xB87E0A00, // 00FA GETNGBL R31 K5 + 0x588000A4, // 00FB LDCONST R32 K164 + 0x58840008, // 00FC LDCONST R33 K8 + 0x7C7C0400, // 00FD CALL R31 2 + 0x507C0200, // 00FE LDBOOL R31 1 0 + 0x80043E00, // 00FF RET 1 R31 + 0x70020004, // 0100 JMP #0106 + 0xB8420A00, // 0101 GETNGBL R16 K5 + 0x584400A5, // 0102 LDCONST R17 K165 + 0x58480008, // 0103 LDCONST R18 K8 + 0x7C400400, // 0104 CALL R16 2 + 0x50140000, // 0105 LDBOOL R5 0 0 + 0x5C1C0A00, // 0106 MOVE R7 R5 + 0x741E00E4, // 0107 JMPT R7 #01ED + 0x8C1C01A6, // 0108 GETMET R7 R0 K166 + 0x882409A7, // 0109 GETMBR R9 R4 K167 + 0x88280935, // 010A GETMBR R10 R4 K53 + 0x7C1C0600, // 010B CALL R7 3 + 0x900F2A07, // 010C SETMBR R3 K149 R7 + 0x4C200000, // 010D LDNIL R8 + 0x1C200608, // 010E EQ R8 R3 R8 + 0x74220003, // 010F JMPT R8 #0114 + 0x88200795, // 0110 GETMBR R8 R3 K149 + 0x4C240000, // 0111 LDNIL R9 + 0x1C201009, // 0112 EQ R8 R8 R9 + 0x7822000C, // 0113 JMPF R8 #0121 + 0xB8220A00, // 0114 GETNGBL R8 K5 + 0x582400A8, // 0115 LDCONST R9 K168 + 0x58280008, // 0116 LDCONST R10 K8 + 0x7C200400, // 0117 CALL R8 2 + 0x8C200124, // 0118 GETMET R8 R0 K36 + 0x5C280200, // 0119 MOVE R10 R1 + 0x582C0025, // 011A LDCONST R11 K37 + 0x5830001F, // 011B LDCONST R12 K31 + 0x58340025, // 011C LDCONST R13 K37 + 0x50380000, // 011D LDBOOL R14 0 0 + 0x7C200C00, // 011E CALL R8 6 + 0x50200000, // 011F LDBOOL R8 0 0 + 0x80041000, // 0120 RET 1 R8 + 0x8820039B, // 0121 GETMBR R8 R1 K155 + 0x900F3408, // 0122 SETMBR R3 K154 R8 + 0x8C20079C, // 0123 GETMET R8 R3 K156 + 0x7C200200, // 0124 CALL R8 1 + 0x8820092E, // 0125 GETMBR R8 R4 K46 + 0x900E5A08, // 0126 SETMBR R3 K45 R8 + 0x8820010D, // 0127 GETMBR R8 R0 K13 + 0x8820110E, // 0128 GETMBR R8 R8 K14 + 0x8C201130, // 0129 GETMET R8 R8 K48 + 0x7C200200, // 012A CALL R8 1 + 0x900E5E08, // 012B SETMBR R3 K47 R8 + 0xB8220A00, // 012C GETNGBL R8 K5 + 0x60240018, // 012D GETGBL R9 G24 + 0x58280031, // 012E LDCONST R10 K49 + 0x882C072F, // 012F GETMBR R11 R3 K47 + 0x88300332, // 0130 GETMBR R12 R1 K50 + 0x88340333, // 0131 GETMBR R13 R1 K51 + 0x7C240800, // 0132 CALL R9 4 + 0x58280008, // 0133 LDCONST R10 K8 + 0x7C200400, // 0134 CALL R8 2 + 0x8C200537, // 0135 GETMET R8 R2 K55 + 0x542A000F, // 0136 LDINT R10 16 + 0x7C200400, // 0137 CALL R8 2 + 0x900F3A08, // 0138 SETMBR R3 K157 R8 + 0x8C200537, // 0139 GETMET R8 R2 K55 + 0x542A001F, // 013A LDINT R10 32 + 0x7C200400, // 013B CALL R8 2 + 0x900F5208, // 013C SETMBR R3 K169 R8 + 0x8C20057A, // 013D GETMET R8 R2 K122 + 0x7C200200, // 013E CALL R8 1 + 0x8C2011AA, // 013F GETMET R8 R8 K170 + 0x882807A9, // 0140 GETMBR R10 R3 K169 + 0x7C200400, // 0141 CALL R8 2 + 0x900EF208, // 0142 SETMBR R3 K121 R8 + 0x8C200537, // 0143 GETMET R8 R2 K55 + 0x542A001F, // 0144 LDINT R10 32 + 0x7C200400, // 0145 CALL R8 2 + 0x8C24057A, // 0146 GETMET R9 R2 K122 + 0x7C240200, // 0147 CALL R9 1 + 0x8C2413AB, // 0148 GETMET R9 R9 K171 + 0x882C07A9, // 0149 GETMBR R11 R3 K169 + 0x88300991, // 014A GETMBR R12 R4 K145 + 0x7C240600, // 014B CALL R9 3 + 0x900ECC09, // 014C SETMBR R3 K102 R9 + 0xB8264C00, // 014D GETNGBL R9 K38 + 0x8824136D, // 014E GETMBR R9 R9 K109 + 0x8C241375, // 014F GETMET R9 R9 K117 + 0x7C240200, // 0150 CALL R9 1 + 0x8C281376, // 0151 GETMET R10 R9 K118 + 0x58300025, // 0152 LDCONST R12 K37 + 0xB8364C00, // 0153 GETNGBL R13 K38 + 0x88341B6D, // 0154 GETMBR R13 R13 K109 + 0x88341BAC, // 0155 GETMBR R13 R13 K172 + 0x8C380FAD, // 0156 GETMET R14 R7 K173 + 0x7C380200, // 0157 CALL R14 1 + 0x7C280800, // 0158 CALL R10 4 + 0x8C281376, // 0159 GETMET R10 R9 K118 + 0x58300022, // 015A LDCONST R12 K34 + 0xB8364C00, // 015B GETNGBL R13 K38 + 0x88341B6D, // 015C GETMBR R13 R13 K109 + 0x88341BAC, // 015D GETMBR R13 R13 K172 + 0x8C380FAE, // 015E GETMET R14 R7 K174 + 0x7C380200, // 015F CALL R14 1 + 0x7C280800, // 0160 CALL R10 4 + 0x8C281376, // 0161 GETMET R10 R9 K118 + 0x58300008, // 0162 LDCONST R12 K8 + 0xB8364C00, // 0163 GETNGBL R13 K38 + 0x88341B6D, // 0164 GETMBR R13 R13 K109 + 0x88341BAC, // 0165 GETMBR R13 R13 K172 + 0x88380779, // 0166 GETMBR R14 R3 K121 + 0x7C280800, // 0167 CALL R10 4 + 0x8C281376, // 0168 GETMET R10 R9 K118 + 0x54320003, // 0169 LDINT R12 4 + 0xB8364C00, // 016A GETNGBL R13 K38 + 0x88341B6D, // 016B GETMBR R13 R13 K109 + 0x88341BAC, // 016C GETMBR R13 R13 K172 + 0x88380991, // 016D GETMBR R14 R4 K145 + 0x7C280800, // 016E CALL R10 4 + 0x8C28057A, // 016F GETMET R10 R2 K122 + 0x7C280200, // 0170 CALL R10 1 + 0x8C2815AF, // 0171 GETMET R10 R10 K175 + 0x8C300FB0, // 0172 GETMET R12 R7 K176 + 0x7C300200, // 0173 CALL R12 1 + 0x8C34133E, // 0174 GETMET R13 R9 K62 + 0x7C340200, // 0175 CALL R13 1 + 0x7C280600, // 0176 CALL R10 3 + 0xB82E4C00, // 0177 GETNGBL R11 K38 + 0x882C176D, // 0178 GETMBR R11 R11 K109 + 0x8C2C1775, // 0179 GETMET R11 R11 K117 + 0x7C2C0200, // 017A CALL R11 1 + 0x8C301776, // 017B GETMET R12 R11 K118 + 0x58380025, // 017C LDCONST R14 K37 + 0xB83E4C00, // 017D GETNGBL R15 K38 + 0x883C1F6D, // 017E GETMBR R15 R15 K109 + 0x883C1FAC, // 017F GETMBR R15 R15 K172 + 0x8C400FAD, // 0180 GETMET R16 R7 K173 + 0x7C400200, // 0181 CALL R16 1 + 0x7C300800, // 0182 CALL R12 4 + 0x8C301776, // 0183 GETMET R12 R11 K118 + 0x58380022, // 0184 LDCONST R14 K34 + 0xB83E4C00, // 0185 GETNGBL R15 K38 + 0x883C1F6D, // 0186 GETMBR R15 R15 K109 + 0x883C1FAC, // 0187 GETMBR R15 R15 K172 + 0x8C400FAE, // 0188 GETMET R16 R7 K174 + 0x7C400200, // 0189 CALL R16 1 + 0x7C300800, // 018A CALL R12 4 + 0x8C301776, // 018B GETMET R12 R11 K118 + 0x58380008, // 018C LDCONST R14 K8 + 0xB83E4C00, // 018D GETNGBL R15 K38 + 0x883C1F6D, // 018E GETMBR R15 R15 K109 + 0x883C1FAC, // 018F GETMBR R15 R15 K172 + 0x5C401400, // 0190 MOVE R16 R10 + 0x7C300800, // 0191 CALL R12 4 + 0x8C301776, // 0192 GETMET R12 R11 K118 + 0x543A0003, // 0193 LDINT R14 4 + 0xB83E4C00, // 0194 GETNGBL R15 K38 + 0x883C1F6D, // 0195 GETMBR R15 R15 K109 + 0x883C1FAC, // 0196 GETMBR R15 R15 K172 + 0x8840079D, // 0197 GETMBR R16 R3 K157 + 0x7C300800, // 0198 CALL R12 4 + 0x883009B1, // 0199 GETMBR R12 R4 K177 + 0x900E540C, // 019A SETMBR R3 K42 R12 + 0x8C30054D, // 019B GETMET R12 R2 K77 + 0x7C300200, // 019C CALL R12 1 + 0x8C301916, // 019D GETMET R12 R12 K22 + 0x8838072A, // 019E GETMBR R14 R3 K42 + 0x7C300400, // 019F CALL R12 2 + 0x8C301917, // 01A0 GETMET R12 R12 K23 + 0x7C300200, // 01A1 CALL R12 1 + 0x60340015, // 01A2 GETGBL R13 G21 + 0x7C340000, // 01A3 CALL R13 0 + 0x8C341B4E, // 01A4 GETMET R13 R13 K78 + 0x883C01B2, // 01A5 GETMBR R15 R0 K178 + 0x7C340400, // 01A6 CALL R13 2 + 0x8C380F14, // 01A7 GETMET R14 R7 K20 + 0x7C380200, // 01A8 CALL R14 1 + 0x00381C08, // 01A9 ADD R14 R14 R8 + 0x883C0779, // 01AA GETMBR R15 R3 K121 + 0x00381C0F, // 01AB ADD R14 R14 R15 + 0x00381C0C, // 01AC ADD R14 R14 R12 + 0x8C3C0560, // 01AD GETMET R15 R2 K96 + 0x7C3C0200, // 01AE CALL R15 1 + 0x8C3C1F61, // 01AF GETMET R15 R15 K97 + 0x88440766, // 01B0 GETMBR R17 R3 K102 + 0x5C481C00, // 01B1 MOVE R18 R14 + 0x5C4C1A00, // 01B2 MOVE R19 R13 + 0x5452000F, // 01B3 LDINT R20 16 + 0x7C3C0A00, // 01B4 CALL R15 5 + 0x8C40173E, // 01B5 GETMET R16 R11 K62 + 0x7C400200, // 01B6 CALL R16 1 + 0x8C440568, // 01B7 GETMET R17 R2 K104 + 0x5C4C1E00, // 01B8 MOVE R19 R15 + 0x60500015, // 01B9 GETGBL R20 G21 + 0x7C500000, // 01BA CALL R20 0 + 0x8C50294E, // 01BB GETMET R20 R20 K78 + 0x885801B3, // 01BC GETMBR R22 R0 K179 + 0x7C500400, // 01BD CALL R20 2 + 0x60540015, // 01BE GETGBL R21 G21 + 0x7C540000, // 01BF CALL R21 0 + 0x6058000C, // 01C0 GETGBL R22 G12 + 0x5C5C2000, // 01C1 MOVE R23 R16 + 0x7C580200, // 01C2 CALL R22 1 + 0x545E000F, // 01C3 LDINT R23 16 + 0x7C440C00, // 01C4 CALL R17 6 + 0x8C4823B4, // 01C5 GETMET R18 R17 K180 + 0x5C502000, // 01C6 MOVE R20 R16 + 0x7C480400, // 01C7 CALL R18 2 + 0x8C4C236B, // 01C8 GETMET R19 R17 K107 + 0x7C4C0200, // 01C9 CALL R19 1 + 0x00482413, // 01CA ADD R18 R18 R19 + 0xB84E4C00, // 01CB GETNGBL R19 K38 + 0x8C4C27B5, // 01CC GETMET R19 R19 K181 + 0x7C4C0200, // 01CD CALL R19 1 + 0x904E6C08, // 01CE SETMBR R19 K54 R8 + 0x8850072F, // 01CF GETMBR R20 R3 K47 + 0x904E7014, // 01D0 SETMBR R19 K56 R20 + 0x88500779, // 01D1 GETMBR R20 R3 K121 + 0x904F6C14, // 01D2 SETMBR R19 K182 R20 + 0x904F6E12, // 01D3 SETMBR R19 K183 R18 + 0x8C50273E, // 01D4 GETMET R20 R19 K62 + 0x7C500200, // 01D5 CALL R20 1 + 0x900E7E14, // 01D6 SETMBR R3 K63 R20 + 0x8C540340, // 01D7 GETMET R21 R1 K64 + 0x545E0030, // 01D8 LDINT R23 49 + 0x50600200, // 01D9 LDBOOL R24 1 0 + 0x7C540600, // 01DA CALL R21 3 + 0x8C582B41, // 01DB GETMET R22 R21 K65 + 0x5C602800, // 01DC MOVE R24 R20 + 0x7C580400, // 01DD CALL R22 2 + 0xB85E0A00, // 01DE GETNGBL R23 K5 + 0x60600018, // 01DF GETGBL R24 G24 + 0x586400B8, // 01E0 LDCONST R25 K184 + 0x8868072F, // 01E1 GETMBR R26 R3 K47 + 0x886C075A, // 01E2 GETMBR R27 R3 K90 + 0x8870075B, // 01E3 GETMBR R28 R3 K91 + 0x7C600800, // 01E4 CALL R24 4 + 0x58640022, // 01E5 LDCONST R25 K34 + 0x7C5C0400, // 01E6 CALL R23 2 + 0x885C0142, // 01E7 GETMBR R23 R0 K66 + 0x8C5C2F43, // 01E8 GETMET R23 R23 K67 + 0x5C642A00, // 01E9 MOVE R25 R21 + 0x7C5C0400, // 01EA CALL R23 2 + 0x505C0200, // 01EB LDBOOL R23 1 0 + 0x80042E00, // 01EC RET 1 R23 + 0x501C0200, // 01ED LDBOOL R7 1 0 + 0x80040E00, // 01EE RET 1 R7 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Data.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Data.h index e4612d228..f6eaf5a6f 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Data.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Data.h @@ -3511,15 +3511,15 @@ be_local_closure(class_Matter_InvokeRequestMessage_solo_from_raw, /* name */ 0x90020605, // 0094 SETMBR R0 K3 R5 0x88140103, // 0095 GETMBR R5 R0 K3 0x88080B0F, // 0096 GETMBR R2 R5 K15 - 0x8C180304, // 0097 GETMET R6 R1 K4 - 0x5C200400, // 0098 MOVE R8 R2 - 0x5425FFFD, // 0099 LDINT R9 -2 - 0x7C180600, // 009A CALL R6 3 - 0x541E1817, // 009B LDINT R7 6168 - 0x20180C07, // 009C NE R6 R6 R7 - 0x781A0001, // 009D JMPF R6 #00A0 - 0x4C180000, // 009E LDNIL R6 - 0x80040C00, // 009F RET 1 R6 + 0x8C140304, // 0097 GETMET R5 R1 K4 + 0x5C1C0400, // 0098 MOVE R7 R2 + 0x5421FFFD, // 0099 LDINT R8 -2 + 0x7C140600, // 009A CALL R5 3 + 0x541A1817, // 009B LDINT R6 6168 + 0x20140A06, // 009C NE R5 R5 R6 + 0x78160001, // 009D JMPF R5 #00A0 + 0x4C140000, // 009E LDNIL R5 + 0x80040A00, // 009F RET 1 R5 0x00080506, // 00A0 ADD R2 R2 K6 0x8C140304, // 00A1 GETMET R5 R1 K4 0x5C1C0400, // 00A2 MOVE R7 R2 diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h index 58559d111..9f2d1b63a 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h @@ -719,7 +719,7 @@ be_local_closure(class_Matter_Frame_decrypt, /* name */ &be_ktab_class_Matter_Frame, /* shared constants */ be_str_weak(decrypt), &be_const_str_solidified, - ( &(const binstruction[115]) { /* code */ + ( &(const binstruction[114]) { /* code */ 0xA4060400, // 0000 IMPORT R1 K2 0x88080100, // 0001 GETMBR R2 R0 K0 0x880C0103, // 0002 GETMBR R3 R0 K3 @@ -728,7 +728,7 @@ be_local_closure(class_Matter_Frame_decrypt, /* name */ 0x8C18053A, // 0005 GETMET R6 R2 K58 0x7C180200, // 0006 CALL R6 1 0x881C011B, // 0007 GETMBR R7 R0 K27 - 0x781E002B, // 0008 JMPF R7 #0035 + 0x781E002A, // 0008 JMPF R7 #0034 0xB81E7000, // 0009 GETNGBL R7 K56 0x5820003B, // 000A LDCONST R8 K59 0x5824001A, // 000B LDCONST R9 K26 @@ -755,86 +755,85 @@ be_local_closure(class_Matter_Frame_decrypt, /* name */ 0x4028140B, // 0020 CONNECT R10 R10 R11 0x882C0103, // 0021 GETMBR R11 R0 K3 0x9428160A, // 0022 GETIDX R10 R11 R10 - 0x8C30033E, // 0023 GETMET R12 R1 K62 - 0x5C380E00, // 0024 MOVE R14 R7 - 0x7C300400, // 0025 CALL R12 2 - 0x8C30193F, // 0026 GETMET R12 R12 K63 - 0x5C381400, // 0027 MOVE R14 R10 - 0x5C3C1200, // 0028 MOVE R15 R9 - 0x5840001A, // 0029 LDCONST R16 K26 - 0x7C300800, // 002A CALL R12 4 - 0x5C2C1800, // 002B MOVE R11 R12 - 0x40322518, // 002C CONNECT R12 K18 K24 - 0x88340103, // 002D GETMBR R13 R0 K3 - 0x94301A0C, // 002E GETIDX R12 R13 R12 - 0x0030180B, // 002F ADD R12 R12 R11 - 0x88340104, // 0030 GETMBR R13 R0 K4 - 0x40341B3D, // 0031 CONNECT R13 R13 K61 - 0x9434140D, // 0032 GETIDX R13 R10 R13 - 0x0030180D, // 0033 ADD R12 R12 R13 - 0x9002060C, // 0034 SETMBR R0 K3 R12 - 0x881C0106, // 0035 GETMBR R7 R0 K6 - 0x881C0F07, // 0036 GETMBR R7 R7 K7 - 0x8C200F08, // 0037 GETMET R8 R7 K8 - 0x7C200200, // 0038 CALL R8 1 - 0x8C200F09, // 0039 GETMET R8 R7 K9 - 0x8828010A, // 003A GETMBR R10 R0 K10 - 0x582C000B, // 003B LDCONST R11 K11 - 0x7C200600, // 003C CALL R8 3 - 0x8C200F09, // 003D GETMET R8 R7 K9 - 0x8828010C, // 003E GETMBR R10 R0 K12 - 0x542E0003, // 003F LDINT R11 4 - 0x7C200600, // 0040 CALL R8 3 - 0x8820011E, // 0041 GETMBR R8 R0 K30 - 0x78220002, // 0042 JMPF R8 #0046 - 0x8820011E, // 0043 GETMBR R8 R0 K30 - 0x40200E08, // 0044 CONNECT R8 R7 R8 - 0x70020006, // 0045 JMP #004D - 0x88200540, // 0046 GETMBR R8 R2 K64 - 0x78220001, // 0047 JMPF R8 #004A - 0x88200540, // 0048 GETMBR R8 R2 K64 - 0x40200E08, // 0049 CONNECT R8 R7 R8 - 0x8C200F0F, // 004A GETMET R8 R7 K15 - 0x542A000C, // 004B LDINT R10 13 - 0x7C200400, // 004C CALL R8 2 - 0x88200310, // 004D GETMBR R8 R1 K16 - 0x8C201141, // 004E GETMET R8 R8 K65 - 0x5C280C00, // 004F MOVE R10 R6 - 0x5C2C0E00, // 0050 MOVE R11 R7 - 0x58300012, // 0051 LDCONST R12 K18 - 0x6034000C, // 0052 GETGBL R13 G12 - 0x5C380E00, // 0053 MOVE R14 R7 - 0x7C340200, // 0054 CALL R13 1 - 0x5C380600, // 0055 MOVE R14 R3 - 0x583C0012, // 0056 LDCONST R15 K18 - 0x5C400800, // 0057 MOVE R16 R4 - 0x5C440600, // 0058 MOVE R17 R3 - 0x5C480800, // 0059 MOVE R18 R4 - 0x604C000C, // 005A GETGBL R19 G12 - 0x5C500600, // 005B MOVE R20 R3 - 0x7C4C0200, // 005C CALL R19 1 - 0x044C2604, // 005D SUB R19 R19 R4 - 0x044C2605, // 005E SUB R19 R19 R5 - 0x5C500600, // 005F MOVE R20 R3 - 0x6054000C, // 0060 GETGBL R21 G12 - 0x5C580600, // 0061 MOVE R22 R3 - 0x7C540200, // 0062 CALL R21 1 - 0x04542A05, // 0063 SUB R21 R21 R5 - 0x5C580A00, // 0064 MOVE R22 R5 - 0x7C201C00, // 0065 CALL R8 14 - 0x78220006, // 0066 JMPF R8 #006E - 0x8C24070F, // 0067 GETMET R9 R3 K15 - 0x602C000C, // 0068 GETGBL R11 G12 - 0x5C300600, // 0069 MOVE R12 R3 - 0x7C2C0200, // 006A CALL R11 1 - 0x042C1605, // 006B SUB R11 R11 R5 - 0x7C240400, // 006C CALL R9 2 - 0x70020003, // 006D JMP #0072 - 0xB8267000, // 006E GETNGBL R9 K56 - 0x58280042, // 006F LDCONST R10 K66 - 0x582C0018, // 0070 LDCONST R11 K24 - 0x7C240400, // 0071 CALL R9 2 - 0x80041000, // 0072 RET 1 R8 + 0x8C2C033E, // 0023 GETMET R11 R1 K62 + 0x5C340E00, // 0024 MOVE R13 R7 + 0x7C2C0400, // 0025 CALL R11 2 + 0x8C2C173F, // 0026 GETMET R11 R11 K63 + 0x5C341400, // 0027 MOVE R13 R10 + 0x5C381200, // 0028 MOVE R14 R9 + 0x583C001A, // 0029 LDCONST R15 K26 + 0x7C2C0800, // 002A CALL R11 4 + 0x40322518, // 002B CONNECT R12 K18 K24 + 0x88340103, // 002C GETMBR R13 R0 K3 + 0x94301A0C, // 002D GETIDX R12 R13 R12 + 0x0030180B, // 002E ADD R12 R12 R11 + 0x88340104, // 002F GETMBR R13 R0 K4 + 0x40341B3D, // 0030 CONNECT R13 R13 K61 + 0x9434140D, // 0031 GETIDX R13 R10 R13 + 0x0030180D, // 0032 ADD R12 R12 R13 + 0x9002060C, // 0033 SETMBR R0 K3 R12 + 0x881C0106, // 0034 GETMBR R7 R0 K6 + 0x881C0F07, // 0035 GETMBR R7 R7 K7 + 0x8C200F08, // 0036 GETMET R8 R7 K8 + 0x7C200200, // 0037 CALL R8 1 + 0x8C200F09, // 0038 GETMET R8 R7 K9 + 0x8828010A, // 0039 GETMBR R10 R0 K10 + 0x582C000B, // 003A LDCONST R11 K11 + 0x7C200600, // 003B CALL R8 3 + 0x8C200F09, // 003C GETMET R8 R7 K9 + 0x8828010C, // 003D GETMBR R10 R0 K12 + 0x542E0003, // 003E LDINT R11 4 + 0x7C200600, // 003F CALL R8 3 + 0x8820011E, // 0040 GETMBR R8 R0 K30 + 0x78220002, // 0041 JMPF R8 #0045 + 0x8820011E, // 0042 GETMBR R8 R0 K30 + 0x40200E08, // 0043 CONNECT R8 R7 R8 + 0x70020006, // 0044 JMP #004C + 0x88200540, // 0045 GETMBR R8 R2 K64 + 0x78220001, // 0046 JMPF R8 #0049 + 0x88200540, // 0047 GETMBR R8 R2 K64 + 0x40200E08, // 0048 CONNECT R8 R7 R8 + 0x8C200F0F, // 0049 GETMET R8 R7 K15 + 0x542A000C, // 004A LDINT R10 13 + 0x7C200400, // 004B CALL R8 2 + 0x88200310, // 004C GETMBR R8 R1 K16 + 0x8C201141, // 004D GETMET R8 R8 K65 + 0x5C280C00, // 004E MOVE R10 R6 + 0x5C2C0E00, // 004F MOVE R11 R7 + 0x58300012, // 0050 LDCONST R12 K18 + 0x6034000C, // 0051 GETGBL R13 G12 + 0x5C380E00, // 0052 MOVE R14 R7 + 0x7C340200, // 0053 CALL R13 1 + 0x5C380600, // 0054 MOVE R14 R3 + 0x583C0012, // 0055 LDCONST R15 K18 + 0x5C400800, // 0056 MOVE R16 R4 + 0x5C440600, // 0057 MOVE R17 R3 + 0x5C480800, // 0058 MOVE R18 R4 + 0x604C000C, // 0059 GETGBL R19 G12 + 0x5C500600, // 005A MOVE R20 R3 + 0x7C4C0200, // 005B CALL R19 1 + 0x044C2604, // 005C SUB R19 R19 R4 + 0x044C2605, // 005D SUB R19 R19 R5 + 0x5C500600, // 005E MOVE R20 R3 + 0x6054000C, // 005F GETGBL R21 G12 + 0x5C580600, // 0060 MOVE R22 R3 + 0x7C540200, // 0061 CALL R21 1 + 0x04542A05, // 0062 SUB R21 R21 R5 + 0x5C580A00, // 0063 MOVE R22 R5 + 0x7C201C00, // 0064 CALL R8 14 + 0x78220006, // 0065 JMPF R8 #006D + 0x8C24070F, // 0066 GETMET R9 R3 K15 + 0x602C000C, // 0067 GETGBL R11 G12 + 0x5C300600, // 0068 MOVE R12 R3 + 0x7C2C0200, // 0069 CALL R11 1 + 0x042C1605, // 006A SUB R11 R11 R5 + 0x7C240400, // 006B CALL R9 2 + 0x70020003, // 006C JMP #0071 + 0xB8267000, // 006D GETNGBL R9 K56 + 0x58280042, // 006E LDCONST R10 K66 + 0x582C0018, // 006F LDCONST R11 K24 + 0x7C240400, // 0070 CALL R9 2 + 0x80041000, // 0071 RET 1 R8 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_2_Sensor_Air_Quality.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_2_Sensor_Air_Quality.h index 8991580dd..8c6b0543c 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_2_Sensor_Air_Quality.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_2_Sensor_Air_Quality.h @@ -3,50 +3,315 @@ * Generated code, don't edit * \********************************************************************/ #include "be_constobj.h" -// compact class 'Matter_Plugin_Sensor_Air_Quality' ktab size: 37, total: 74 (saved 296 bytes) -static const bvalue be_ktab_class_Matter_Plugin_Sensor_Air_Quality[37] = { - /* K0 */ be_nested_str_weak(web_values_prefix), - /* K1 */ be_nested_str_weak(Air), - /* K2 */ be_nested_str_weak(shadow_air_quality), - /* K3 */ be_nested_str_weak(PM1), - /* K4 */ be_nested_str_weak(shadow_pm1), - /* K5 */ be_nested_str_weak(PM2_X2E5), - /* K6 */ be_nested_str_weak(shadow_pm2_5), - /* K7 */ be_nested_str_weak(PM10), - /* K8 */ be_nested_str_weak(shadow_pm10), - /* K9 */ be_nested_str_weak(CO2), - /* K10 */ be_nested_str_weak(shadow_co2), - /* K11 */ be_nested_str_weak(NO2), - /* K12 */ be_nested_str_weak(shadow_no2), - /* K13 */ be_nested_str_weak(TVOC), +// compact class 'Matter_Plugin_Sensor_Air_Quality' ktab size: 42, total: 88 (saved 368 bytes) +static const bvalue be_ktab_class_Matter_Plugin_Sensor_Air_Quality[42] = { + /* K0 */ be_nested_str_weak(parse_configuration), + /* K1 */ be_nested_str_weak(prefix), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(ARG), + /* K4 */ be_nested_str_weak(shadow_co2), + /* K5 */ be_nested_str_weak(_parse_update_virtual), + /* K6 */ be_nested_str_weak(CO2), + /* K7 */ be_const_int(0), + /* K8 */ be_nested_str_weak(shadow_pm1), + /* K9 */ be_nested_str_weak(PM1), + /* K10 */ be_nested_str_weak(shadow_pm2_5), + /* K11 */ be_nested_str_weak(PM2_X2E5), + /* K12 */ be_nested_str_weak(shadow_pm10), + /* K13 */ be_nested_str_weak(PM10), /* K14 */ be_nested_str_weak(shadow_tvoc), - /* K15 */ be_nested_str_weak(find), - /* K16 */ be_nested_str_weak(prefix), - /* K17 */ be_nested_str_weak(_parse_update_virtual), - /* K18 */ be_nested_str_weak(AirQuality), - /* K19 */ be_const_int(0), + /* K15 */ be_nested_str_weak(TVOC), + /* K16 */ be_nested_str_weak(contains), + /* K17 */ be_nested_str_weak(AirQuality), + /* K18 */ be_nested_str_weak(shadow_air_quality), + /* K19 */ be_nested_str_weak(compute_air_quality), /* K20 */ be_nested_str_weak(update_virtual), - /* K21 */ be_nested_str_weak(init), - /* K22 */ be_nested_str_weak(add_read_sensors_schedule), - /* K23 */ be_nested_str_weak(UPDATE_TIME), - /* K24 */ be_nested_str_weak(matter), - /* K25 */ be_nested_str_weak(TLV), - /* K26 */ be_nested_str_weak(cluster), - /* K27 */ be_nested_str_weak(attribute), - /* K28 */ be_nested_str_weak(set_or_nil), - /* K29 */ be_nested_str_weak(U1), - /* K30 */ be_nested_str_weak(read_attribute), - /* K31 */ be_nested_str_weak(parse_configuration), - /* K32 */ be_nested_str_weak(ARG), - /* K33 */ be_nested_str_weak(_parse_sensor_entry), - /* K34 */ be_nested_str_weak(CarbonDioxide), - /* K35 */ be_nested_str_weak(parse_sensors), - /* K36 */ be_nested_str_weak(attribute_updated), + /* K21 */ be_const_int(1), + /* K22 */ be_const_int(2), + /* K23 */ be_const_int(3), + /* K24 */ be_nested_str_weak(attribute_updated), + /* K25 */ be_nested_str_weak(init), + /* K26 */ be_nested_str_weak(add_read_sensors_schedule), + /* K27 */ be_nested_str_weak(UPDATE_TIME), + /* K28 */ be_nested_str_weak(web_values_prefix), + /* K29 */ be_nested_str_weak(Air), + /* K30 */ be_nested_str_weak(NO2), + /* K31 */ be_nested_str_weak(shadow_no2), + /* K32 */ be_nested_str_weak(_parse_sensor_entry), + /* K33 */ be_nested_str_weak(CarbonDioxide), + /* K34 */ be_nested_str_weak(parse_sensors), + /* K35 */ be_nested_str_weak(matter), + /* K36 */ be_nested_str_weak(TLV), + /* K37 */ be_nested_str_weak(cluster), + /* K38 */ be_nested_str_weak(attribute), + /* K39 */ be_nested_str_weak(set_or_nil), + /* K40 */ be_nested_str_weak(U1), + /* K41 */ be_nested_str_weak(read_attribute), }; extern const bclass be_class_Matter_Plugin_Sensor_Air_Quality; +/******************************************************************** +** Solidified function: parse_configuration +********************************************************************/ +be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_parse_configuration, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Matter_Plugin_Sensor_Air_Quality, /* shared constants */ + be_str_weak(parse_configuration), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x60080003, // 0000 GETGBL R2 G3 + 0x5C0C0000, // 0001 MOVE R3 R0 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080500, // 0003 GETMET R2 R2 K0 + 0x5C100200, // 0004 MOVE R4 R1 + 0x7C080400, // 0005 CALL R2 2 + 0x60080008, // 0006 GETGBL R2 G8 + 0x8C0C0302, // 0007 GETMET R3 R1 K2 + 0x88140103, // 0008 GETMBR R5 R0 K3 + 0x7C0C0400, // 0009 CALL R3 2 + 0x7C080200, // 000A CALL R2 1 + 0x90020202, // 000B SETMBR R0 K1 R2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_virtual +********************************************************************/ +be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_update_virtual, /* name */ + be_nested_proto( + 10, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Matter_Plugin_Sensor_Air_Quality, /* shared constants */ + be_str_weak(update_virtual), + &be_const_str_solidified, + ( &(const binstruction[68]) { /* code */ + 0x8C080105, // 0000 GETMET R2 R0 K5 + 0x5C100200, // 0001 MOVE R4 R1 + 0x58140006, // 0002 LDCONST R5 K6 + 0x88180104, // 0003 GETMBR R6 R0 K4 + 0x601C0007, // 0004 GETGBL R7 G7 + 0x5422040C, // 0005 LDINT R8 1037 + 0x58240007, // 0006 LDCONST R9 K7 + 0x7C080E00, // 0007 CALL R2 7 + 0x90020802, // 0008 SETMBR R0 K4 R2 + 0x8C080105, // 0009 GETMET R2 R0 K5 + 0x5C100200, // 000A MOVE R4 R1 + 0x58140009, // 000B LDCONST R5 K9 + 0x88180108, // 000C GETMBR R6 R0 K8 + 0x601C0007, // 000D GETGBL R7 G7 + 0x5422042B, // 000E LDINT R8 1068 + 0x58240007, // 000F LDCONST R9 K7 + 0x7C080E00, // 0010 CALL R2 7 + 0x90021002, // 0011 SETMBR R0 K8 R2 + 0x8C080105, // 0012 GETMET R2 R0 K5 + 0x5C100200, // 0013 MOVE R4 R1 + 0x5814000B, // 0014 LDCONST R5 K11 + 0x8818010A, // 0015 GETMBR R6 R0 K10 + 0x601C0007, // 0016 GETGBL R7 G7 + 0x54220429, // 0017 LDINT R8 1066 + 0x58240007, // 0018 LDCONST R9 K7 + 0x7C080E00, // 0019 CALL R2 7 + 0x90021402, // 001A SETMBR R0 K10 R2 + 0x8C080105, // 001B GETMET R2 R0 K5 + 0x5C100200, // 001C MOVE R4 R1 + 0x5814000D, // 001D LDCONST R5 K13 + 0x8818010C, // 001E GETMBR R6 R0 K12 + 0x601C0007, // 001F GETGBL R7 G7 + 0x5422042C, // 0020 LDINT R8 1069 + 0x58240007, // 0021 LDCONST R9 K7 + 0x7C080E00, // 0022 CALL R2 7 + 0x90021802, // 0023 SETMBR R0 K12 R2 + 0x8C080105, // 0024 GETMET R2 R0 K5 + 0x5C100200, // 0025 MOVE R4 R1 + 0x5814000F, // 0026 LDCONST R5 K15 + 0x8818010E, // 0027 GETMBR R6 R0 K14 + 0x601C0007, // 0028 GETGBL R7 G7 + 0x5422042D, // 0029 LDINT R8 1070 + 0x58240007, // 002A LDCONST R9 K7 + 0x7C080E00, // 002B CALL R2 7 + 0x90021C02, // 002C SETMBR R0 K14 R2 + 0x8C080310, // 002D GETMET R2 R1 K16 + 0x58100011, // 002E LDCONST R4 K17 + 0x7C080400, // 002F CALL R2 2 + 0x780A0009, // 0030 JMPF R2 #003B + 0x8C080105, // 0031 GETMET R2 R0 K5 + 0x5C100200, // 0032 MOVE R4 R1 + 0x58140011, // 0033 LDCONST R5 K17 + 0x60180007, // 0034 GETGBL R6 G7 + 0x881C0112, // 0035 GETMBR R7 R0 K18 + 0x5422005A, // 0036 LDINT R8 91 + 0x58240007, // 0037 LDCONST R9 K7 + 0x7C080E00, // 0038 CALL R2 7 + 0x90022402, // 0039 SETMBR R0 K18 R2 + 0x70020001, // 003A JMP #003D + 0x8C080113, // 003B GETMET R2 R0 K19 + 0x7C080200, // 003C CALL R2 1 + 0x60080003, // 003D GETGBL R2 G3 + 0x5C0C0000, // 003E MOVE R3 R0 + 0x7C080200, // 003F CALL R2 1 + 0x8C080514, // 0040 GETMET R2 R2 K20 + 0x5C100200, // 0041 MOVE R4 R1 + 0x7C080400, // 0042 CALL R2 2 + 0x80000000, // 0043 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_status +********************************************************************/ +be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_parse_status, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Matter_Plugin_Sensor_Air_Quality, /* shared constants */ + be_str_weak(parse_status), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x540E0009, // 0000 LDINT R3 10 + 0x1C0C0403, // 0001 EQ R3 R2 R3 + 0x780E0002, // 0002 JMPF R3 #0006 + 0x8C0C0302, // 0003 GETMET R3 R1 K2 + 0x88140101, // 0004 GETMBR R5 R0 K1 + 0x7C0C0400, // 0005 CALL R3 2 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compute_air_quality +********************************************************************/ +be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_compute_air_quality, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Matter_Plugin_Sensor_Air_Quality, /* shared constants */ + be_str_weak(compute_air_quality), + &be_const_str_solidified, + ( &(const binstruction[44]) { /* code */ + 0x4C040000, // 0000 LDNIL R1 + 0x88080104, // 0001 GETMBR R2 R0 K4 + 0x4C0C0000, // 0002 LDNIL R3 + 0x20080403, // 0003 NE R2 R2 R3 + 0x780A001A, // 0004 JMPF R2 #0020 + 0x88080104, // 0005 GETMBR R2 R0 K4 + 0x540E02ED, // 0006 LDINT R3 750 + 0x180C0403, // 0007 LE R3 R2 R3 + 0x780E0001, // 0008 JMPF R3 #000B + 0x58040015, // 0009 LDCONST R1 K21 + 0x70020014, // 000A JMP #0020 + 0x540E03E7, // 000B LDINT R3 1000 + 0x180C0403, // 000C LE R3 R2 R3 + 0x780E0001, // 000D JMPF R3 #0010 + 0x58040016, // 000E LDCONST R1 K22 + 0x7002000F, // 000F JMP #0020 + 0x540E04E1, // 0010 LDINT R3 1250 + 0x180C0403, // 0011 LE R3 R2 R3 + 0x780E0001, // 0012 JMPF R3 #0015 + 0x58040017, // 0013 LDCONST R1 K23 + 0x7002000A, // 0014 JMP #0020 + 0x540E05DB, // 0015 LDINT R3 1500 + 0x180C0403, // 0016 LE R3 R2 R3 + 0x780E0001, // 0017 JMPF R3 #001A + 0x54060003, // 0018 LDINT R1 4 + 0x70020005, // 0019 JMP #0020 + 0x540E06D5, // 001A LDINT R3 1750 + 0x180C0403, // 001B LE R3 R2 R3 + 0x780E0001, // 001C JMPF R3 #001F + 0x54060004, // 001D LDINT R1 5 + 0x70020000, // 001E JMP #0020 + 0x54060005, // 001F LDINT R1 6 + 0x4C080000, // 0020 LDNIL R2 + 0x20080202, // 0021 NE R2 R1 R2 + 0x780A0007, // 0022 JMPF R2 #002B + 0x88080112, // 0023 GETMBR R2 R0 K18 + 0x20080202, // 0024 NE R2 R1 R2 + 0x780A0004, // 0025 JMPF R2 #002B + 0x90022401, // 0026 SETMBR R0 K18 R1 + 0x8C080118, // 0027 GETMET R2 R0 K24 + 0x5412005A, // 0028 LDINT R4 91 + 0x58140007, // 0029 LDCONST R5 K7 + 0x7C080600, // 002A CALL R2 3 + 0x80000000, // 002B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Matter_Plugin_Sensor_Air_Quality, /* shared constants */ + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x60100003, // 0000 GETGBL R4 G3 + 0x5C140000, // 0001 MOVE R5 R0 + 0x7C100200, // 0002 CALL R4 1 + 0x8C100919, // 0003 GETMET R4 R4 K25 + 0x5C180200, // 0004 MOVE R6 R1 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x5C200600, // 0006 MOVE R8 R3 + 0x7C100800, // 0007 CALL R4 4 + 0x90022507, // 0008 SETMBR R0 K18 K7 + 0x8C10031A, // 0009 GETMET R4 R1 K26 + 0x8818011B, // 000A GETMBR R6 R0 K27 + 0x7C100400, // 000B CALL R4 2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: web_values ********************************************************************/ @@ -97,34 +362,34 @@ be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_web_values, /* name */ &be_const_str_solidified, ( &(const binstruction[32]) { /* code */ 0x84040000, // 0000 CLOSURE R1 P0 - 0x8C080100, // 0001 GETMET R2 R0 K0 + 0x8C08011C, // 0001 GETMET R2 R0 K28 0x7C080200, // 0002 CALL R2 1 0x5C080200, // 0003 MOVE R2 R1 - 0x580C0001, // 0004 LDCONST R3 K1 - 0x88100102, // 0005 GETMBR R4 R0 K2 + 0x580C001D, // 0004 LDCONST R3 K29 + 0x88100112, // 0005 GETMBR R4 R0 K18 0x7C080400, // 0006 CALL R2 2 0x5C080200, // 0007 MOVE R2 R1 - 0x580C0003, // 0008 LDCONST R3 K3 - 0x88100104, // 0009 GETMBR R4 R0 K4 + 0x580C0009, // 0008 LDCONST R3 K9 + 0x88100108, // 0009 GETMBR R4 R0 K8 0x7C080400, // 000A CALL R2 2 0x5C080200, // 000B MOVE R2 R1 - 0x580C0005, // 000C LDCONST R3 K5 - 0x88100106, // 000D GETMBR R4 R0 K6 + 0x580C000B, // 000C LDCONST R3 K11 + 0x8810010A, // 000D GETMBR R4 R0 K10 0x7C080400, // 000E CALL R2 2 0x5C080200, // 000F MOVE R2 R1 - 0x580C0007, // 0010 LDCONST R3 K7 - 0x88100108, // 0011 GETMBR R4 R0 K8 + 0x580C000D, // 0010 LDCONST R3 K13 + 0x8810010C, // 0011 GETMBR R4 R0 K12 0x7C080400, // 0012 CALL R2 2 0x5C080200, // 0013 MOVE R2 R1 - 0x580C0009, // 0014 LDCONST R3 K9 - 0x8810010A, // 0015 GETMBR R4 R0 K10 + 0x580C0006, // 0014 LDCONST R3 K6 + 0x88100104, // 0015 GETMBR R4 R0 K4 0x7C080400, // 0016 CALL R2 2 0x5C080200, // 0017 MOVE R2 R1 - 0x580C000B, // 0018 LDCONST R3 K11 - 0x8810010C, // 0019 GETMBR R4 R0 K12 + 0x580C001E, // 0018 LDCONST R3 K30 + 0x8810011F, // 0019 GETMBR R4 R0 K31 0x7C080400, // 001A CALL R2 2 0x5C080200, // 001B MOVE R2 R1 - 0x580C000D, // 001C LDCONST R3 K13 + 0x580C000F, // 001C LDCONST R3 K15 0x8810010E, // 001D GETMBR R4 R0 K14 0x7C080400, // 001E CALL R2 2 0x80000000, // 001F RET 0 @@ -135,41 +400,11 @@ be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_web_values, /* name */ /******************************************************************** -** Solidified function: parse_status +** Solidified function: parse_sensors ********************************************************************/ -be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_parse_status, /* name */ +be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_parse_sensors, /* name */ be_nested_proto( - 6, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Matter_Plugin_Sensor_Air_Quality, /* shared constants */ - be_str_weak(parse_status), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x540E0009, // 0000 LDINT R3 10 - 0x1C0C0403, // 0001 EQ R3 R2 R3 - 0x780E0002, // 0002 JMPF R3 #0006 - 0x8C0C030F, // 0003 GETMET R3 R1 K15 - 0x88140110, // 0004 GETMBR R5 R0 K16 - 0x7C0C0400, // 0005 CALL R3 2 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_virtual -********************************************************************/ -be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_update_virtual, /* name */ - be_nested_proto( - 10, /* nstack */ + 11, /* nstack */ 2, /* argc */ 10, /* varg */ 0, /* has upvals */ @@ -178,70 +413,92 @@ be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_update_virtual, /* nam NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_Matter_Plugin_Sensor_Air_Quality, /* shared constants */ - be_str_weak(update_virtual), + be_str_weak(parse_sensors), &be_const_str_solidified, - ( &(const binstruction[61]) { /* code */ - 0x8C080111, // 0000 GETMET R2 R0 K17 - 0x5C100200, // 0001 MOVE R4 R1 - 0x58140012, // 0002 LDCONST R5 K18 - 0x60180007, // 0003 GETGBL R6 G7 - 0x881C0102, // 0004 GETMBR R7 R0 K2 - 0x5422005A, // 0005 LDINT R8 91 - 0x58240013, // 0006 LDCONST R9 K19 - 0x7C080E00, // 0007 CALL R2 7 - 0x90020402, // 0008 SETMBR R0 K2 R2 - 0x8C080111, // 0009 GETMET R2 R0 K17 - 0x5C100200, // 000A MOVE R4 R1 - 0x58140009, // 000B LDCONST R5 K9 - 0x8818010A, // 000C GETMBR R6 R0 K10 - 0x601C0007, // 000D GETGBL R7 G7 - 0x5422040C, // 000E LDINT R8 1037 - 0x58240013, // 000F LDCONST R9 K19 - 0x7C080E00, // 0010 CALL R2 7 - 0x90021402, // 0011 SETMBR R0 K10 R2 - 0x8C080111, // 0012 GETMET R2 R0 K17 - 0x5C100200, // 0013 MOVE R4 R1 - 0x58140003, // 0014 LDCONST R5 K3 - 0x88180104, // 0015 GETMBR R6 R0 K4 - 0x601C0007, // 0016 GETGBL R7 G7 - 0x5422042B, // 0017 LDINT R8 1068 - 0x58240013, // 0018 LDCONST R9 K19 - 0x7C080E00, // 0019 CALL R2 7 - 0x90020802, // 001A SETMBR R0 K4 R2 - 0x8C080111, // 001B GETMET R2 R0 K17 - 0x5C100200, // 001C MOVE R4 R1 - 0x58140005, // 001D LDCONST R5 K5 - 0x88180106, // 001E GETMBR R6 R0 K6 - 0x601C0007, // 001F GETGBL R7 G7 - 0x54220429, // 0020 LDINT R8 1066 - 0x58240013, // 0021 LDCONST R9 K19 - 0x7C080E00, // 0022 CALL R2 7 - 0x90020C02, // 0023 SETMBR R0 K6 R2 - 0x8C080111, // 0024 GETMET R2 R0 K17 - 0x5C100200, // 0025 MOVE R4 R1 - 0x58140007, // 0026 LDCONST R5 K7 - 0x88180108, // 0027 GETMBR R6 R0 K8 - 0x601C0007, // 0028 GETGBL R7 G7 - 0x5422042C, // 0029 LDINT R8 1069 - 0x58240013, // 002A LDCONST R9 K19 - 0x7C080E00, // 002B CALL R2 7 - 0x90021002, // 002C SETMBR R0 K8 R2 - 0x8C080111, // 002D GETMET R2 R0 K17 - 0x5C100200, // 002E MOVE R4 R1 - 0x5814000D, // 002F LDCONST R5 K13 - 0x8818010E, // 0030 GETMBR R6 R0 K14 - 0x601C0007, // 0031 GETGBL R7 G7 - 0x5422042D, // 0032 LDINT R8 1070 - 0x58240013, // 0033 LDCONST R9 K19 - 0x7C080E00, // 0034 CALL R2 7 - 0x90021C02, // 0035 SETMBR R0 K14 R2 - 0x60080003, // 0036 GETGBL R2 G3 - 0x5C0C0000, // 0037 MOVE R3 R0 - 0x7C080200, // 0038 CALL R2 1 - 0x8C080514, // 0039 GETMET R2 R2 K20 - 0x5C100200, // 003A MOVE R4 R1 - 0x7C080400, // 003B CALL R2 2 - 0x80000000, // 003C RET 0 + ( &(const binstruction[83]) { /* code */ + 0x8C080302, // 0000 GETMET R2 R1 K2 + 0x88100101, // 0001 GETMBR R4 R0 K1 + 0x7C080400, // 0002 CALL R2 2 + 0x4C0C0000, // 0003 LDNIL R3 + 0x200C0403, // 0004 NE R3 R2 R3 + 0x780E0045, // 0005 JMPF R3 #004C + 0x8C0C0120, // 0006 GETMET R3 R0 K32 + 0x5C140400, // 0007 MOVE R5 R2 + 0x58180021, // 0008 LDCONST R6 K33 + 0x881C0104, // 0009 GETMBR R7 R0 K4 + 0x60200007, // 000A GETGBL R8 G7 + 0x5426040C, // 000B LDINT R9 1037 + 0x58280007, // 000C LDCONST R10 K7 + 0x7C0C0E00, // 000D CALL R3 7 + 0x90020803, // 000E SETMBR R0 K4 R3 + 0x8C0C0120, // 000F GETMET R3 R0 K32 + 0x5C140400, // 0010 MOVE R5 R2 + 0x58180009, // 0011 LDCONST R6 K9 + 0x881C0108, // 0012 GETMBR R7 R0 K8 + 0x60200007, // 0013 GETGBL R8 G7 + 0x5426042B, // 0014 LDINT R9 1068 + 0x58280007, // 0015 LDCONST R10 K7 + 0x7C0C0E00, // 0016 CALL R3 7 + 0x90021003, // 0017 SETMBR R0 K8 R3 + 0x8C0C0120, // 0018 GETMET R3 R0 K32 + 0x5C140400, // 0019 MOVE R5 R2 + 0x5818000B, // 001A LDCONST R6 K11 + 0x881C010A, // 001B GETMBR R7 R0 K10 + 0x60200007, // 001C GETGBL R8 G7 + 0x54260429, // 001D LDINT R9 1066 + 0x58280007, // 001E LDCONST R10 K7 + 0x7C0C0E00, // 001F CALL R3 7 + 0x90021403, // 0020 SETMBR R0 K10 R3 + 0x8C0C0120, // 0021 GETMET R3 R0 K32 + 0x5C140400, // 0022 MOVE R5 R2 + 0x5818000D, // 0023 LDCONST R6 K13 + 0x881C010C, // 0024 GETMBR R7 R0 K12 + 0x60200007, // 0025 GETGBL R8 G7 + 0x5426042C, // 0026 LDINT R9 1069 + 0x58280007, // 0027 LDCONST R10 K7 + 0x7C0C0E00, // 0028 CALL R3 7 + 0x90021803, // 0029 SETMBR R0 K12 R3 + 0x8C0C0120, // 002A GETMET R3 R0 K32 + 0x5C140400, // 002B MOVE R5 R2 + 0x5818000F, // 002C LDCONST R6 K15 + 0x881C010E, // 002D GETMBR R7 R0 K14 + 0x60200007, // 002E GETGBL R8 G7 + 0x5426042D, // 002F LDINT R9 1070 + 0x58280007, // 0030 LDCONST R10 K7 + 0x7C0C0E00, // 0031 CALL R3 7 + 0x90021C03, // 0032 SETMBR R0 K14 R3 + 0x8C0C0120, // 0033 GETMET R3 R0 K32 + 0x5C140400, // 0034 MOVE R5 R2 + 0x5818001E, // 0035 LDCONST R6 K30 + 0x881C011F, // 0036 GETMBR R7 R0 K31 + 0x60200007, // 0037 GETGBL R8 G7 + 0x54260412, // 0038 LDINT R9 1043 + 0x58280007, // 0039 LDCONST R10 K7 + 0x7C0C0E00, // 003A CALL R3 7 + 0x90023E03, // 003B SETMBR R0 K31 R3 + 0x8C0C0510, // 003C GETMET R3 R2 K16 + 0x58140011, // 003D LDCONST R5 K17 + 0x7C0C0400, // 003E CALL R3 2 + 0x780E0009, // 003F JMPF R3 #004A + 0x8C0C0120, // 0040 GETMET R3 R0 K32 + 0x5C140400, // 0041 MOVE R5 R2 + 0x58180011, // 0042 LDCONST R6 K17 + 0x881C0112, // 0043 GETMBR R7 R0 K18 + 0x60200007, // 0044 GETGBL R8 G7 + 0x5426005A, // 0045 LDINT R9 91 + 0x58280007, // 0046 LDCONST R10 K7 + 0x7C0C0E00, // 0047 CALL R3 7 + 0x90022403, // 0048 SETMBR R0 K18 R3 + 0x70020001, // 0049 JMP #004C + 0x8C0C0113, // 004A GETMET R3 R0 K19 + 0x7C0C0200, // 004B CALL R3 1 + 0x600C0003, // 004C GETGBL R3 G3 + 0x5C100000, // 004D MOVE R4 R0 + 0x7C0C0200, // 004E CALL R3 1 + 0x8C0C0722, // 004F GETMET R3 R3 K34 + 0x5C140200, // 0050 MOVE R5 R1 + 0x7C0C0400, // 0051 CALL R3 2 + 0x80000000, // 0052 RET 0 }) ) ); @@ -249,12 +506,12 @@ be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_update_virtual, /* nam /******************************************************************** -** Solidified function: init +** Solidified function: _parse_sensor_entry ********************************************************************/ -be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_init, /* name */ +be_local_closure(class_Matter_Plugin_Sensor_Air_Quality__parse_sensor_entry, /* name */ be_nested_proto( - 9, /* nstack */ - 4, /* argc */ + 12, /* nstack */ + 7, /* argc */ 10, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -262,23 +519,30 @@ be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_init, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_Matter_Plugin_Sensor_Air_Quality, /* shared constants */ - be_str_weak(init), + be_str_weak(_parse_sensor_entry), &be_const_str_solidified, - ( &(const binstruction[14]) { /* code */ - 0x60100003, // 0000 GETGBL R4 G3 - 0x5C140000, // 0001 MOVE R5 R0 - 0x7C100200, // 0002 CALL R4 1 - 0x8C100915, // 0003 GETMET R4 R4 K21 - 0x5C180200, // 0004 MOVE R6 R1 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x5C200600, // 0006 MOVE R8 R3 - 0x7C100800, // 0007 CALL R4 4 - 0x50100000, // 0008 LDBOOL R4 0 0 - 0x90020404, // 0009 SETMBR R0 K2 R4 - 0x8C100316, // 000A GETMET R4 R1 K22 - 0x88180117, // 000B GETMBR R6 R0 K23 - 0x7C100400, // 000C CALL R4 2 - 0x80000000, // 000D RET 0 + ( &(const binstruction[21]) { /* code */ + 0x8C1C0302, // 0000 GETMET R7 R1 K2 + 0x5C240400, // 0001 MOVE R9 R2 + 0x7C1C0400, // 0002 CALL R7 2 + 0x4C200000, // 0003 LDNIL R8 + 0x20200E08, // 0004 NE R8 R7 R8 + 0x7822000D, // 0005 JMPF R8 #0014 + 0x5C200800, // 0006 MOVE R8 R4 + 0x5C240E00, // 0007 MOVE R9 R7 + 0x7C200200, // 0008 CALL R8 1 + 0x5C1C1000, // 0009 MOVE R7 R8 + 0x4C200000, // 000A LDNIL R8 + 0x20200E08, // 000B NE R8 R7 R8 + 0x78220005, // 000C JMPF R8 #0013 + 0x20200E03, // 000D NE R8 R7 R3 + 0x78220003, // 000E JMPF R8 #0013 + 0x8C200118, // 000F GETMET R8 R0 K24 + 0x5C280A00, // 0010 MOVE R10 R5 + 0x5C2C0C00, // 0011 MOVE R11 R6 + 0x7C200600, // 0012 CALL R8 3 + 0x80040E00, // 0013 RET 1 R7 + 0x80040600, // 0014 RET 1 R3 }) ) ); @@ -406,20 +670,20 @@ be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_read_attribute, /* nam be_str_weak(read_attribute), &be_const_str_solidified, ( &(const binstruction[93]) { /* code */ - 0xB8123000, // 0000 GETNGBL R4 K24 - 0x88100919, // 0001 GETMBR R4 R4 K25 - 0x8814051A, // 0002 GETMBR R5 R2 K26 - 0x8818051B, // 0003 GETMBR R6 R2 K27 + 0xB8124600, // 0000 GETNGBL R4 K35 + 0x88100924, // 0001 GETMBR R4 R4 K36 + 0x88140525, // 0002 GETMBR R5 R2 K37 + 0x88180526, // 0003 GETMBR R6 R2 K38 0x4C1C0000, // 0004 LDNIL R7 0x84200000, // 0005 CLOSURE R8 P0 0x5426005A, // 0006 LDINT R9 91 0x1C240A09, // 0007 EQ R9 R5 R9 0x78260008, // 0008 JMPF R9 #0012 - 0x1C240D13, // 0009 EQ R9 R6 K19 + 0x1C240D07, // 0009 EQ R9 R6 K7 0x78260005, // 000A JMPF R9 #0011 - 0x8C24071C, // 000B GETMET R9 R3 K28 - 0x882C091D, // 000C GETMBR R11 R4 K29 - 0x88300102, // 000D GETMBR R12 R0 K2 + 0x8C240727, // 000B GETMET R9 R3 K39 + 0x882C0928, // 000C GETMBR R11 R4 K40 + 0x88300112, // 000D GETMBR R12 R0 K18 0x7C240600, // 000E CALL R9 3 0xA0000000, // 000F CLOSE R0 0x80041200, // 0010 RET 1 R9 @@ -428,7 +692,7 @@ be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_read_attribute, /* nam 0x1C240A09, // 0013 EQ R9 R5 R9 0x78260007, // 0014 JMPF R9 #001D 0x5C241000, // 0015 MOVE R9 R8 - 0x8828010A, // 0016 GETMBR R10 R0 K10 + 0x88280104, // 0016 GETMBR R10 R0 K4 0x7C240200, // 0017 CALL R9 1 0x5C1C1200, // 0018 MOVE R7 R9 0x78260001, // 0019 JMPF R9 #001C @@ -439,7 +703,7 @@ be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_read_attribute, /* nam 0x1C240A09, // 001E EQ R9 R5 R9 0x78260007, // 001F JMPF R9 #0028 0x5C241000, // 0020 MOVE R9 R8 - 0x88280104, // 0021 GETMBR R10 R0 K4 + 0x88280108, // 0021 GETMBR R10 R0 K8 0x7C240200, // 0022 CALL R9 1 0x5C1C1200, // 0023 MOVE R7 R9 0x78260001, // 0024 JMPF R9 #0027 @@ -450,7 +714,7 @@ be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_read_attribute, /* nam 0x1C240A09, // 0029 EQ R9 R5 R9 0x78260007, // 002A JMPF R9 #0033 0x5C241000, // 002B MOVE R9 R8 - 0x88280106, // 002C GETMBR R10 R0 K6 + 0x8828010A, // 002C GETMBR R10 R0 K10 0x7C240200, // 002D CALL R9 1 0x5C1C1200, // 002E MOVE R7 R9 0x78260001, // 002F JMPF R9 #0032 @@ -461,7 +725,7 @@ be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_read_attribute, /* nam 0x1C240A09, // 0034 EQ R9 R5 R9 0x78260007, // 0035 JMPF R9 #003E 0x5C241000, // 0036 MOVE R9 R8 - 0x88280108, // 0037 GETMBR R10 R0 K8 + 0x8828010C, // 0037 GETMBR R10 R0 K12 0x7C240200, // 0038 CALL R9 1 0x5C1C1200, // 0039 MOVE R7 R9 0x78260001, // 003A JMPF R9 #003D @@ -483,7 +747,7 @@ be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_read_attribute, /* nam 0x1C240A09, // 004A EQ R9 R5 R9 0x78260006, // 004B JMPF R9 #0053 0x5C241000, // 004C MOVE R9 R8 - 0x8828010C, // 004D GETMBR R10 R0 K12 + 0x8828011F, // 004D GETMBR R10 R0 K31 0x7C240200, // 004E CALL R9 1 0x5C1C1200, // 004F MOVE R7 R9 0x78260001, // 0050 JMPF R9 #0053 @@ -492,7 +756,7 @@ be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_read_attribute, /* nam 0x60240003, // 0053 GETGBL R9 G3 0x5C280000, // 0054 MOVE R10 R0 0x7C240200, // 0055 CALL R9 1 - 0x8C24131E, // 0056 GETMET R9 R9 K30 + 0x8C241329, // 0056 GETMET R9 R9 K41 0x5C2C0200, // 0057 MOVE R11 R1 0x5C300400, // 0058 MOVE R12 R2 0x5C340600, // 0059 MOVE R13 R3 @@ -505,176 +769,6 @@ be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_read_attribute, /* nam /*******************************************************************/ -/******************************************************************** -** Solidified function: parse_configuration -********************************************************************/ -be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_parse_configuration, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Matter_Plugin_Sensor_Air_Quality, /* shared constants */ - be_str_weak(parse_configuration), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x60080003, // 0000 GETGBL R2 G3 - 0x5C0C0000, // 0001 MOVE R3 R0 - 0x7C080200, // 0002 CALL R2 1 - 0x8C08051F, // 0003 GETMET R2 R2 K31 - 0x5C100200, // 0004 MOVE R4 R1 - 0x7C080400, // 0005 CALL R2 2 - 0x60080008, // 0006 GETGBL R2 G8 - 0x8C0C030F, // 0007 GETMET R3 R1 K15 - 0x88140120, // 0008 GETMBR R5 R0 K32 - 0x7C0C0400, // 0009 CALL R3 2 - 0x7C080200, // 000A CALL R2 1 - 0x90022002, // 000B SETMBR R0 K16 R2 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_sensors -********************************************************************/ -be_local_closure(class_Matter_Plugin_Sensor_Air_Quality_parse_sensors, /* name */ - be_nested_proto( - 11, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Matter_Plugin_Sensor_Air_Quality, /* shared constants */ - be_str_weak(parse_sensors), - &be_const_str_solidified, - ( &(const binstruction[67]) { /* code */ - 0x8C08030F, // 0000 GETMET R2 R1 K15 - 0x88100110, // 0001 GETMBR R4 R0 K16 - 0x7C080400, // 0002 CALL R2 2 - 0x4C0C0000, // 0003 LDNIL R3 - 0x200C0403, // 0004 NE R3 R2 R3 - 0x780E0035, // 0005 JMPF R3 #003C - 0x8C0C0121, // 0006 GETMET R3 R0 K33 - 0x5C140400, // 0007 MOVE R5 R2 - 0x58180022, // 0008 LDCONST R6 K34 - 0x881C010A, // 0009 GETMBR R7 R0 K10 - 0x60200007, // 000A GETGBL R8 G7 - 0x5426040C, // 000B LDINT R9 1037 - 0x58280013, // 000C LDCONST R10 K19 - 0x7C0C0E00, // 000D CALL R3 7 - 0x90021403, // 000E SETMBR R0 K10 R3 - 0x8C0C0121, // 000F GETMET R3 R0 K33 - 0x5C140400, // 0010 MOVE R5 R2 - 0x58180003, // 0011 LDCONST R6 K3 - 0x881C0104, // 0012 GETMBR R7 R0 K4 - 0x60200007, // 0013 GETGBL R8 G7 - 0x5426042B, // 0014 LDINT R9 1068 - 0x58280013, // 0015 LDCONST R10 K19 - 0x7C0C0E00, // 0016 CALL R3 7 - 0x90020803, // 0017 SETMBR R0 K4 R3 - 0x8C0C0121, // 0018 GETMET R3 R0 K33 - 0x5C140400, // 0019 MOVE R5 R2 - 0x58180005, // 001A LDCONST R6 K5 - 0x881C0106, // 001B GETMBR R7 R0 K6 - 0x60200007, // 001C GETGBL R8 G7 - 0x54260429, // 001D LDINT R9 1066 - 0x58280013, // 001E LDCONST R10 K19 - 0x7C0C0E00, // 001F CALL R3 7 - 0x90020C03, // 0020 SETMBR R0 K6 R3 - 0x8C0C0121, // 0021 GETMET R3 R0 K33 - 0x5C140400, // 0022 MOVE R5 R2 - 0x58180007, // 0023 LDCONST R6 K7 - 0x881C0108, // 0024 GETMBR R7 R0 K8 - 0x60200007, // 0025 GETGBL R8 G7 - 0x5426042C, // 0026 LDINT R9 1069 - 0x58280013, // 0027 LDCONST R10 K19 - 0x7C0C0E00, // 0028 CALL R3 7 - 0x90021003, // 0029 SETMBR R0 K8 R3 - 0x8C0C0121, // 002A GETMET R3 R0 K33 - 0x5C140400, // 002B MOVE R5 R2 - 0x5818000D, // 002C LDCONST R6 K13 - 0x881C010E, // 002D GETMBR R7 R0 K14 - 0x60200007, // 002E GETGBL R8 G7 - 0x5426042D, // 002F LDINT R9 1070 - 0x58280013, // 0030 LDCONST R10 K19 - 0x7C0C0E00, // 0031 CALL R3 7 - 0x90021C03, // 0032 SETMBR R0 K14 R3 - 0x8C0C0121, // 0033 GETMET R3 R0 K33 - 0x5C140400, // 0034 MOVE R5 R2 - 0x5818000B, // 0035 LDCONST R6 K11 - 0x881C010C, // 0036 GETMBR R7 R0 K12 - 0x60200007, // 0037 GETGBL R8 G7 - 0x54260412, // 0038 LDINT R9 1043 - 0x58280013, // 0039 LDCONST R10 K19 - 0x7C0C0E00, // 003A CALL R3 7 - 0x90021803, // 003B SETMBR R0 K12 R3 - 0x600C0003, // 003C GETGBL R3 G3 - 0x5C100000, // 003D MOVE R4 R0 - 0x7C0C0200, // 003E CALL R3 1 - 0x8C0C0723, // 003F GETMET R3 R3 K35 - 0x5C140200, // 0040 MOVE R5 R1 - 0x7C0C0400, // 0041 CALL R3 2 - 0x80000000, // 0042 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _parse_sensor_entry -********************************************************************/ -be_local_closure(class_Matter_Plugin_Sensor_Air_Quality__parse_sensor_entry, /* name */ - be_nested_proto( - 12, /* nstack */ - 7, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Matter_Plugin_Sensor_Air_Quality, /* shared constants */ - be_str_weak(_parse_sensor_entry), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x8C1C030F, // 0000 GETMET R7 R1 K15 - 0x5C240400, // 0001 MOVE R9 R2 - 0x7C1C0400, // 0002 CALL R7 2 - 0x4C200000, // 0003 LDNIL R8 - 0x20200E08, // 0004 NE R8 R7 R8 - 0x7822000D, // 0005 JMPF R8 #0014 - 0x5C200800, // 0006 MOVE R8 R4 - 0x5C240E00, // 0007 MOVE R9 R7 - 0x7C200200, // 0008 CALL R8 1 - 0x5C1C1000, // 0009 MOVE R7 R8 - 0x4C200000, // 000A LDNIL R8 - 0x20200E08, // 000B NE R8 R7 R8 - 0x78220005, // 000C JMPF R8 #0013 - 0x20200E03, // 000D NE R8 R7 R3 - 0x78220003, // 000E JMPF R8 #0013 - 0x8C200124, // 000F GETMET R8 R0 K36 - 0x5C280A00, // 0010 MOVE R10 R5 - 0x5C2C0C00, // 0011 MOVE R11 R6 - 0x7C200600, // 0012 CALL R8 3 - 0x80040E00, // 0013 RET 1 R7 - 0x80040600, // 0014 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_Plugin_Sensor_Air_Quality ********************************************************************/ @@ -682,47 +776,19 @@ extern const bclass be_class_Matter_Plugin_Device; be_local_class(Matter_Plugin_Sensor_Air_Quality, 8, &be_class_Matter_Plugin_Device, - be_nested_map(25, + be_nested_map(26, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(JSON_NAME, -1), be_nested_str_weak(AirQuality) }, - { be_const_key_weak(DISPLAY_NAME, -1), be_nested_str_weak(Air_X20Quality) }, - { be_const_key_weak(web_values, 16), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality_web_values_closure) }, - { be_const_key_weak(parse_status, -1), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality_parse_status_closure) }, - { be_const_key_weak(_parse_sensor_entry, -1), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality__parse_sensor_entry_closure) }, - { be_const_key_weak(init, -1), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality_init_closure) }, - { be_const_key_weak(UPDATE_TIME, -1), be_const_int(10000) }, - { be_const_key_weak(shadow_no2, -1), be_const_var(6) }, - { be_const_key_weak(shadow_air_quality, 13), be_const_var(1) }, - { be_const_key_weak(UPDATE_COMMANDS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(7, - ( (struct bvalue*) &(const bvalue[]) { - be_nested_str_weak(AirQuality), - be_nested_str_weak(CO2), - be_nested_str_weak(PM1), - be_nested_str_weak(PM2_X2E5), - be_nested_str_weak(PM10), - be_nested_str_weak(TVOC), - be_nested_str_weak(NO2), - })) ) } )) }, - { be_const_key_weak(prefix, -1), be_const_var(0) }, - { be_const_key_weak(shadow_pm10, -1), be_const_var(4) }, - { be_const_key_weak(read_attribute, -1), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality_read_attribute_closure) }, - { be_const_key_weak(parse_sensors, -1), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality_parse_sensors_closure) }, - { be_const_key_weak(TYPE, 10), be_nested_str_weak(airquality) }, - { be_const_key_weak(update_virtual, 23), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality_update_virtual_closure) }, - { be_const_key_weak(shadow_tvoc, -1), be_const_var(7) }, - { be_const_key_weak(shadow_pm1, -1), be_const_var(2) }, - { be_const_key_weak(ARG, -1), be_nested_str_weak(airquality) }, - { be_const_key_weak(parse_configuration, 18), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality_parse_configuration_closure) }, - { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Device_X20key_X20_X28ex_X3A_X20SCD40_X29) }, - { be_const_key_weak(shadow_co2, 8), be_const_var(5) }, { be_const_key_weak(shadow_pm2_5, -1), be_const_var(3) }, - { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(1, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_int(44, -1), be_const_int(1) }, - })) ) } )) }, - { be_const_key_weak(CLUSTERS, 4), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(prefix, -1), be_const_var(0) }, + { be_const_key_weak(update_virtual, -1), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality_update_virtual_closure) }, + { be_const_key_weak(shadow_no2, 5), be_const_var(6) }, + { be_const_key_weak(read_attribute, 8), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality_read_attribute_closure) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Device_X20key_X20_X28ex_X3A_X20SCD40_X29) }, + { be_const_key_weak(parse_sensors, -1), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality_parse_sensors_closure) }, + { be_const_key_weak(parse_configuration, 23), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality_parse_configuration_closure) }, + { be_const_key_weak(shadow_air_quality, 17), be_const_var(1) }, + { be_const_key_weak(compute_air_quality, -1), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality_compute_air_quality_closure) }, + { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(12, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(1068, -1), be_const_bytes_instance(00000001000200080009FFF8FFF9FFFAFFFBFFFCFFFD) }, @@ -738,6 +804,35 @@ be_local_class(Matter_Plugin_Sensor_Air_Quality, { be_const_key_int(1066, -1), be_const_bytes_instance(00000001000200080009FFF8FFF9FFFAFFFBFFFCFFFD) }, { be_const_key_int(1043, -1), be_const_bytes_instance(00000001000200080009FFF8FFF9FFFAFFFBFFFCFFFD) }, })) ) } )) }, + { be_const_key_weak(UPDATE_COMMANDS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(7, + ( (struct bvalue*) &(const bvalue[]) { + be_nested_str_weak(AirQuality), + be_nested_str_weak(CO2), + be_nested_str_weak(PM1), + be_nested_str_weak(PM2_X2E5), + be_nested_str_weak(PM10), + be_nested_str_weak(TVOC), + be_nested_str_weak(NO2), + })) ) } )) }, + { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + be_const_map( * be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_int(44, -1), be_const_int(1) }, + })) ) } )) }, + { be_const_key_weak(ARG, -1), be_nested_str_weak(airquality) }, + { be_const_key_weak(web_values, -1), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality_web_values_closure) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak(airquality) }, + { be_const_key_weak(DISPLAY_NAME, 22), be_nested_str_weak(Air_X20Quality) }, + { be_const_key_weak(UPDATE_TIME, 21), be_const_int(10000) }, + { be_const_key_weak(shadow_pm10, 6), be_const_var(4) }, + { be_const_key_weak(JSON_NAME, 16), be_nested_str_weak(AirQuality) }, + { be_const_key_weak(shadow_co2, 14), be_const_var(5) }, + { be_const_key_weak(shadow_tvoc, -1), be_const_var(7) }, + { be_const_key_weak(init, -1), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality_init_closure) }, + { be_const_key_weak(parse_status, -1), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality_parse_status_closure) }, + { be_const_key_weak(shadow_pm1, 4), be_const_var(2) }, + { be_const_key_weak(_parse_sensor_entry, 0), be_const_closure(class_Matter_Plugin_Sensor_Air_Quality__parse_sensor_entry_closure) }, })), be_str_weak(Matter_Plugin_Sensor_Air_Quality) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_z_Commissioning.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_z_Commissioning.h index 7c5ea0da7..fe75c6523 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_z_Commissioning.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_z_Commissioning.h @@ -3,7 +3,7 @@ * Generated code, don't edit * \********************************************************************/ #include "be_constobj.h" -// compact class 'Matter_Commissioning' ktab size: 132, total: 274 (saved 1136 bytes) +// compact class 'Matter_Commissioning' ktab size: 132, total: 272 (saved 1120 bytes) static const bvalue be_ktab_class_Matter_Commissioning[132] = { /* K0 */ be_nested_str_weak(device), /* K1 */ be_nested_str_weak(sessions), @@ -70,7 +70,7 @@ static const bvalue be_ktab_class_Matter_Commissioning[132] = { /* K62 */ be_nested_str_weak(up), /* K63 */ be_nested_str_weak(_matter), /* K64 */ be_nested_str_weak(_tcp), - /* K65 */ be_nested_str_weak(set_timer), + /* K65 */ be_nested_str_weak(defer), /* K66 */ be_nested_str_weak(crypto), /* K67 */ be_nested_str_weak(stop_basic_commissioning), /* K68 */ be_nested_str_weak(mdns_announce_op_discovery), @@ -616,7 +616,7 @@ be_local_closure(class_Matter_Commissioning_mdns_remove_op_discovery, /* name ********************************************************************/ be_local_closure(class_Matter_Commissioning_start_operational_discovery_deferred, /* name */ be_nested_proto( - 6, /* nstack */ + 5, /* nstack */ 2, /* argc */ 10, /* varg */ 0, /* has upvals */ @@ -653,14 +653,13 @@ be_local_closure(class_Matter_Commissioning_start_operational_discovery_deferred &be_ktab_class_Matter_Commissioning, /* shared constants */ be_str_weak(start_operational_discovery_deferred), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ + ( &(const binstruction[ 6]) { /* code */ 0xB80A1000, // 0000 GETNGBL R2 K8 0x8C080541, // 0001 GETMET R2 R2 K65 - 0x58100015, // 0002 LDCONST R4 K21 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 + 0x84100000, // 0002 CLOSURE R4 P0 + 0x7C080400, // 0003 CALL R2 2 + 0xA0000000, // 0004 CLOSE R0 + 0x80000000, // 0005 RET 0 }) ) ); @@ -1213,7 +1212,7 @@ be_local_closure(class_Matter_Commissioning_mdns_announce_op_discovery, /* nam ********************************************************************/ be_local_closure(class_Matter_Commissioning_start_commissioning_complete_deferred, /* name */ be_nested_proto( - 6, /* nstack */ + 5, /* nstack */ 2, /* argc */ 10, /* varg */ 0, /* has upvals */ @@ -1250,14 +1249,13 @@ be_local_closure(class_Matter_Commissioning_start_commissioning_complete_deferre &be_ktab_class_Matter_Commissioning, /* shared constants */ be_str_weak(start_commissioning_complete_deferred), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ + ( &(const binstruction[ 6]) { /* code */ 0xB80A1000, // 0000 GETNGBL R2 K8 0x8C080541, // 0001 GETMET R2 R2 K65 - 0x58100015, // 0002 LDCONST R4 K21 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 + 0x84100000, // 0002 CLOSURE R4 P0 + 0x7C080400, // 0003 CALL R2 2 + 0xA0000000, // 0004 CLOSE R0 + 0x80000000, // 0005 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_zz_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_zz_Device.h index 2bf1e8e17..65f3a8f99 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_zz_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_zz_Device.h @@ -2319,13 +2319,13 @@ be_local_closure(class_Matter_Device_register_http_remote, /* name */ 0x78120009, // 000C JMPF R4 #0017 0x88100151, // 000D GETMBR R4 R0 K81 0x940C0801, // 000E GETIDX R3 R4 R1 - 0x8C1407A9, // 000F GETMET R5 R3 K169 - 0x7C140200, // 0010 CALL R5 1 - 0x14140405, // 0011 LT R5 R2 R5 - 0x78160002, // 0012 JMPF R5 #0016 - 0x8C1407AA, // 0013 GETMET R5 R3 K170 - 0x5C1C0400, // 0014 MOVE R7 R2 - 0x7C140400, // 0015 CALL R5 2 + 0x8C1007A9, // 000F GETMET R4 R3 K169 + 0x7C100200, // 0010 CALL R4 1 + 0x14100404, // 0011 LT R4 R2 R4 + 0x78120002, // 0012 JMPF R4 #0016 + 0x8C1007AA, // 0013 GETMET R4 R3 K170 + 0x5C180400, // 0014 MOVE R6 R2 + 0x7C100400, // 0015 CALL R4 2 0x70020011, // 0016 JMP #0029 0xB8122800, // 0017 GETNGBL R4 K20 0x8C1009AB, // 0018 GETMET R4 R4 K171 diff --git a/lib/libesp32/berry_tasmota/solidify_all.be b/lib/libesp32/berry_tasmota/solidify_all.be index 84794af13..18c86be7e 100755 --- a/lib/libesp32/berry_tasmota/solidify_all.be +++ b/lib/libesp32/berry_tasmota/solidify_all.be @@ -13,16 +13,22 @@ import sys sys.path().push('src/embedded') # allow to import from src/embedded # globals that need to exist to make compilation succeed -var globs = "path,ctypes_bytes_dyn,tasmota,ccronexpr,gpio,light,webclient,load,MD5,lv,light_state,udp,I2C_Driver,tcpserver,log," +var globs = "path,ctypes_bytes_dyn,tasmota,ccronexpr,gpio,light,webclient,load,MD5,lv,light_state,udp,tcpserver,log," "lv_clock,lv_clock_icon,lv_signal_arcs,lv_signal_bars,lv_wifi_arcs_icon,lv_wifi_arcs," "lv_wifi_bars_icon,lv_wifi_bars," "_lvgl," "int64" +var glob_classes = "I2C_Driver" + for g:string2.split(globs, ",") global.(g) = nil end +for g:string2.split(glob_classes, ",") + compile(f"class {g} end")() +end + var prefix_dir = "src/embedded/" var prefix_out = "src/solidify/" diff --git a/lib/libesp32/berry_tasmota/src/be_ULP_lib.c b/lib/libesp32/berry_tasmota/src/be_ULP_lib.c index 6e56dffe5..3bd874330 100644 --- a/lib/libesp32/berry_tasmota/src/be_ULP_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_ULP_lib.c @@ -23,8 +23,8 @@ BE_FUNC_CTYPE_DECLARE(be_ULP_get_mem, "i", "i"); extern int32_t be_ULP_gpio_init(int32_t pin, int32_t mode); BE_FUNC_CTYPE_DECLARE(be_ULP_gpio_init, "i", "ii"); -extern void be_ULP_adc_config(struct bvm *vm, int32_t channel, int32_t attenuation, int32_t width); -BE_FUNC_CTYPE_DECLARE(be_ULP_adc_config, "", "@iii"); +extern int32_t be_ULP_adc_config(struct bvm *vm, int32_t channel, int32_t attenuation, int32_t width); +BE_FUNC_CTYPE_DECLARE(be_ULP_adc_config, "i", "@iii"); extern void be_ULP_sleep(int32_t wake_up_s); BE_FUNC_CTYPE_DECLARE(be_ULP_sleep, "", "[i]"); // optional int arg diff --git a/lib/libesp32/berry_tasmota/src/be_i2c_axp192_axp202_lib.c b/lib/libesp32/berry_tasmota/src/be_i2c_axp192_axp202_axp2102_lib.c similarity index 60% rename from lib/libesp32/berry_tasmota/src/be_i2c_axp192_axp202_lib.c rename to lib/libesp32/berry_tasmota/src/be_i2c_axp192_axp202_axp2102_lib.c index f121b1708..11c79171e 100644 --- a/lib/libesp32/berry_tasmota/src/be_i2c_axp192_axp202_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_i2c_axp192_axp202_axp2102_lib.c @@ -1,5 +1,6 @@ /******************************************************************** * Drivers for AXP192 and AXP202 I2C Solidified *******************************************************************/ -#include "solidify/solidified_i2c_axp192.h" -#include "solidify/solidified_i2c_axp202.h" +#include "solidify/solidified_AXP192.h" +#include "solidify/solidified_AXP202.h" +#include "solidify/solidified_AXP2102.h" diff --git a/lib/libesp32/berry_tasmota/src/be_lv_tasmota_lib.c b/lib/libesp32/berry_tasmota/src/be_lv_tasmota_lib.c index 951a6eb24..0a1710dd0 100644 --- a/lib/libesp32/berry_tasmota/src/be_lv_tasmota_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_lv_tasmota_lib.c @@ -16,6 +16,7 @@ extern int lv0_load_robotocondensed_latin1_font(bvm *vm); extern int lv0_load_font_embedded(bvm *vm); extern int lv0_screenshot(bvm *vm); +extern int lv0_set_paint_cb(bvm *vm); extern int lv0_load_freetype_font(bvm *vm); #include "solidify/solidified_lv_tasmota.h" @@ -37,6 +38,7 @@ module lv_tasmota (scope: global, strings: weak) { font_embedded, func(lv0_load_font_embedded) register_button_encoder, func(lv0_register_button_encoder) screenshot, func(lv0_screenshot) + set_paint_cb, func(lv0_set_paint_cb) load_freetype_font, func(lv0_load_freetype_font) } diff --git a/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c b/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c index f2c7a20ea..9ff788a38 100644 --- a/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c @@ -86,6 +86,7 @@ class be_class_tasmota (scope: global, name: Tasmota) { _fl, var // list of active fast-loop object (faster than drivers) _rules, var // list of active rules _timers, var // list of active timers + _defer, var // list of deferred functions to be called at next millisecond _crons, var // list of active crons _ccmd, var // list of active Tasmota commands implemented in Berry _drivers, var // list of active drivers @@ -147,6 +148,8 @@ class be_class_tasmota (scope: global, name: Tasmota) { web_send_decimal, func(l_webSendDecimal) webcolor, static_func(l_webcolor) + int, static_closure(class_Tasmota_int_closure) + get_power, func(l_getpower) set_power, func(l_setpower) get_switch, func(l_getswitch) // deprecated @@ -165,11 +168,14 @@ class be_class_tasmota (scope: global, name: Tasmota) { find_list_i, closure(class_Tasmota_find_list_i_closure) find_op, closure(class_Tasmota_find_op_closure) add_rule, closure(class_Tasmota_add_rule_closure) + add_rule_once, closure(class_Tasmota_add_rule_once_closure) remove_rule, closure(class_Tasmota_remove_rule_closure) try_rule, closure(class_Tasmota_try_rule_closure) exec_rules, closure(class_Tasmota_exec_rules_closure) exec_tele, closure(class_Tasmota_exec_tele_closure) set_timer, closure(class_Tasmota_set_timer_closure) + run_timers, closure(class_Tasmota_run_timers_closure) + defer, closure(class_Tasmota_defer_closure) run_deferred, closure(class_Tasmota_run_deferred_closure) remove_timer, closure(class_Tasmota_remove_timer_closure) add_cmd, closure(class_Tasmota_add_cmd_closure) diff --git a/lib/libesp32/berry_tasmota/src/be_zigbee.c b/lib/libesp32/berry_tasmota/src/be_zigbee.c index 8c5956796..09433c2fb 100644 --- a/lib/libesp32/berry_tasmota/src/be_zigbee.c +++ b/lib/libesp32/berry_tasmota/src/be_zigbee.c @@ -148,4 +148,4 @@ module zigbee (scope: global, strings: weak) { } @const_object_info_end */ -#endif // USE_LIGHT +#endif // USE_ZIGBEE diff --git a/lib/libesp32/berry_tasmota/src/be_zigbee_zcl_attribute_list_ntv.c b/lib/libesp32/berry_tasmota/src/be_zigbee_zcl_attribute_list_ntv.c index d2e42f590..d4d86c111 100644 --- a/lib/libesp32/berry_tasmota/src/be_zigbee_zcl_attribute_list_ntv.c +++ b/lib/libesp32/berry_tasmota/src/be_zigbee_zcl_attribute_list_ntv.c @@ -35,4 +35,4 @@ class be_class_zcl_attribute_list_ntv (scope: global, name: zcl_attribute_list_n } @const_object_info_end */ -#endif // USE_LIGHT +#endif // USE_ZIGBEE diff --git a/lib/libesp32/berry_tasmota/src/embedded/i2c_axp192.be b/lib/libesp32/berry_tasmota/src/embedded/AXP192.be similarity index 97% rename from lib/libesp32/berry_tasmota/src/embedded/i2c_axp192.be rename to lib/libesp32/berry_tasmota/src/embedded/AXP192.be index b9254af1d..5bb26c017 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/i2c_axp192.be +++ b/lib/libesp32/berry_tasmota/src/embedded/AXP192.be @@ -1,11 +1,11 @@ #------------------------------------------------------------- - Generic driver for AXP192 - solidified -------------------------------------------------------------# -class I2C_Driver end # for solidification #@ solidify:AXP192 class AXP192 : I2C_Driver - def init() + def init(addr) + if (addr == nil) addr = 0x34 end # default address is 0x34 super(self, I2C_Driver).init("AXP192", 0x34) end @@ -27,7 +27,7 @@ class AXP192 : I2C_Driver end # Battery Charging Status - def get_battery_chargin_status() + def get_battery_charging_status() return self.wire.read(self.addr, 0x01, 1) end @@ -187,3 +187,4 @@ class AXP192 : I2C_Driver tasmota.response_append(msg) end end +return AXP192 diff --git a/lib/libesp32/berry_tasmota/src/embedded/i2c_axp202.be b/lib/libesp32/berry_tasmota/src/embedded/AXP202.be similarity index 97% rename from lib/libesp32/berry_tasmota/src/embedded/i2c_axp202.be rename to lib/libesp32/berry_tasmota/src/embedded/AXP202.be index e6b6f6d80..a9b5f55a3 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/i2c_axp202.be +++ b/lib/libesp32/berry_tasmota/src/embedded/AXP202.be @@ -1,11 +1,11 @@ #------------------------------------------------------------- - Generic driver for AXP202 - solidified -------------------------------------------------------------# -class I2C_Driver end # for solidification - #@ solidify:AXP202 +#@ solidify:AXP202 class AXP202 : I2C_Driver - def init() + def init(addr) + if (addr == nil) addr = 0x35 end # default address is 0x35 super(self, I2C_Driver).init("AXP202", 0x35) end @@ -22,7 +22,7 @@ class AXP202 : I2C_Driver end # Battery Charging Status - def get_battery_chargin_status() + def get_battery_charging_status() return self.wire.read(self.addr, 0x01, 1) end @@ -189,3 +189,4 @@ class AXP202 : I2C_Driver # # tasmota.response_append(msg) # end end +return AXP202 diff --git a/lib/libesp32/berry_tasmota/src/embedded/AXP2102.be b/lib/libesp32/berry_tasmota/src/embedded/AXP2102.be new file mode 100644 index 000000000..94924d5d0 --- /dev/null +++ b/lib/libesp32/berry_tasmota/src/embedded/AXP2102.be @@ -0,0 +1,169 @@ +#------------------------------------------------------------- + - Generic driver for AXP2102 - solidified + -------------------------------------------------------------# + +# Specs +# DCDC1 : 1.5-3.4V, 2000mA +# DCDC2 : 0.5-1.2V,1.22-1.54V, 2000mA +# DCDC3 : 0.5-1.2V,1.22-1.54V, 1.6-3.4V, 2000mA +# DCDC4 : 0.5-1.2V, 1.22-1.84V, 1500mA +# DCDC5 : 1.2V , 1.4-3.7V, 1000mA +# +# RTCLDO1/2 : 1.8V/2.5V/3V/3.3V, 30mA +# ALDO1~4 : 0.5-3.5V, 100mV/step 300mA + +# LDO index: +# 0=ALDO1 ~ 3=ALDO4 / 4=BLDO1 / 5=BLDO2 + + #@ solidify:AXP2102 +class AXP2102 : I2C_Driver + def init(addr) + if (addr == nil) addr = 0x34 end # default address is 0x34 + super(self).init("AXP2102", addr) + end + + # Return True = Battery Exist + def battery_present() + return bool(self.wire.read(self.addr, 0x00, 1) & 0x08) + end + + # # Battery Charging Status + def get_battery_charging_status() + var val = (self.read8(0x01) >> 5) & 0x03 + # 1:charge / 2:dischage / 0:stanby + return (val == 1) ? 1 : ((val == 2) ? -1 : 0) + end + + def is_charging() + return (self.read8(0x01) & 0x60) == 0x20 + end + + def get_battery_level() + return self.read8(0xA4) + end + + # AXP chip temperature in °C + def get_temp() + return 22 + ((7274 - self.read16(0x3C)) / 20); + end + + def get_bat_power() + return 0 + end + + def get_bat_voltage() + return self.read14(0x34) / 1000.0 + end + def get_bat_current() + return 0 + end + def get_bat_charge_current() + return 0 + end + def get_aps_voltage() + return 0 + end + def get_vbus_good() + return bool(self.wire.read(self.addr, 0x00, 1) & 0x20) + end + def get_vbus_voltage() + if (!self.get_vbus_good()) return 0 end + var vbus = self.read14(0x38) + if (vbus > 16375) return 0 end + return vbus / 1000.0 + end + def get_vbus_current() + return 0 + end + + # set LDO voltage + # 0=ALDO1 ~ 3=ALDO4 / 4=BLDO1 / 5=BLDO2 + # voltage: (mV) 0.5-3.5V in 100mV steps + def set_ldo_voltage(num, voltage) + if (num < 0 || num > 5) return end + var reg_volt = num + 0x92 + voltage -= 500 + # convert voltage to value + var val = (voltage < 0) ? 0 : voltage / 100 + if (val > 0x1E) val = 0x1E end + self.write8(reg_volt, val) + + var reg90bit = 1 << num + if (voltage < 0) + self.write8(0x90, self.read8(0x90) & ~reg90bit) # bit off + else + self.write8(0x90, self.read8(0x90) | reg90bit) # bit on + end + end + + # det DLDO voltage + def set_dldo_voltage(num, voltage) + if (num < 0 || num > 1) return end + var reg_volt = num + 0x99 + voltage -= 500 + # convert voltage to value + var val = (voltage < 0) ? 0 : voltage / (num ? 50 : 100) + if (val > (num ? 0x13 : 0x1C)) val = num ? 0x13 : 0x1C end + self.write8(reg_volt, val) + + var reg = 0x90 + num + var bit = num ? 0x01 : 0x80 + if (voltage < 0) + self.write8(0x90, self.read8(reg) & ~bit) # bit off + else + self.write8(0x90, self.read8(reg) | bit) # bit on + end + end + + # get LDO enable + def get_ldo_enable(num) + var res = false + if (num <= 5) + var reg90bit = 1 << num + res = bool(self.read8(0x90) & reg90bit) + end + return res + end + + def set_battery_charge(enable) + self.write8(0x18, (self.read8(0x18) & 0xFD) | ((enable ? 1 : 0) << 1)) + end + + static var _pre_charge = [0, 25, 50, 75, 100, 125, 150, 175, 200, 255] + def set_pre_charge_current(max_mA) + if (max_mA < 0) max_mA = 0 end + if (max_mA > 200) max_mA = 200 end + var i = 0 + while (self._pre_charge[i] <= max_mA) + i += 1 + end + self.write8(0x61, i) + end + + static var _charge = [ 25, 30, 35, 40, 60, 80, 100, 120, 140, 160, 180, 200, 255] + def set_charge_current(max_mA) + if (max_mA < 0) max_mA = 0 end + if (max_mA > 200) max_mA = 200 end + var i = 0 + while (self._charge[i] <= max_mA) + i += 1 + end + i += 4 + self.write8(0x62, i) + end + + static var _charge_voltage = [410, 420, 435, 440, 460, 655] + def set_charge_voltage(max_mV) + if (max_mV < 0) max_mV = 0 end + if (max_mV > 460) max_mV = 460 end + var i = 0 + while (self._charge_voltage[i] <= max_mV) + i += 1 + end + i += 1 + if (i >= 6) i = 0 end + self.write8(0x64, i) + end + +end +return AXP2102 diff --git a/lib/libesp32/berry_tasmota/src/embedded/leds.be b/lib/libesp32/berry_tasmota/src/embedded/leds.be index 98fbbfd29..3a17e047c 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/leds.be +++ b/lib/libesp32/berry_tasmota/src/embedded/leds.be @@ -8,18 +8,14 @@ # 01 : begin void -> void # 02 : show void -> void # 03 : CanShow void -> bool -# 04 : IsDirty void -> bool -# 05 : Dirty void -> void +# 04 : IsDirty void -> bool (deprecated) +# 05 : Dirty void -> void (deprecated) # 06 : Pixels void -> bytes() (mapped to the buffer) # 07 : PixelSize void -> int # 08 : PixelCount void -> int -# 09 : ClearTo (color:??) -> void -# 10 : SetPixelColor (idx:int, color:??) -> void -# 11 : GetPixelColor (idx:int) -> color:?? -# 20 : RotateLeft (rot:int [, first:int, last:int]) -> void -# 21 : RotateRight (rot:int [, first:int, last:int]) -> void -# 22 : ShiftLeft (rot:int [, first:int, last:int]) -> void -# 23 : ShiftRight (rot:int [, first:int, last:int]) -> void +# 09 : ClearTo (color:0xRRGGBB or 0xWWRRGGBB) -> void +# 10 : SetPixelColor (idx:int, color:0xRRGGBB or 0xWWRRGGBB) -> void +# 11 : GetPixelColor (idx:int) -> color:0xRRGGBB or 0xWWRRGGBB class Leds_ntv end @@ -116,16 +112,17 @@ class Leds : Leds_ntv def can_show() return self.call_native(3) end - def is_dirty() + def is_dirty() ## DEPRECATED return self.call_native(4) end - def dirty() + def dirty() ## DEPRECATED self.call_native(5) end def pixels_buffer(old_buf) var buf = self.call_native(6) # address of buffer in memory - if old_buf == nil - return bytes(buf, self.pixel_size() * self.pixel_count()) + var sz = self.pixel_size() * self.pixel_count() + if (old_buf == nil || size(buf) != sz) + return bytes(buf, sz) else old_buf._change_buffer(buf) return old_buf @@ -215,10 +212,10 @@ class Leds : Leds_ntv def can_show() return self.strip.can_show() end - def is_dirty() + def is_dirty() ## DEPRECATED return self.strip.is_dirty() end - def dirty() + def dirty() ## DEPRECATED self.strip.dirty() end def pixels_buffer() @@ -302,10 +299,10 @@ class Leds : Leds_ntv def can_show() return self.strip.can_show() end - def is_dirty() + def is_dirty() ## DEPRECATED return self.strip.is_dirty() end - def dirty() + def dirty() ## DEPRECATED self.strip.dirty() end def pixels_buffer() @@ -358,6 +355,103 @@ class Leds : Leds_ntv self.strip.set_pixel_color(x * self.w + y + self.offset, col, bri) end end + + def scroll(direction, outshift, inshift) # 0 - up, 1 - left, 2 - down, 3 - right ; outshift mandatory, inshift optional + var buf = self.pix_buffer + var h = self.h + var sz = self.w * 3 # row size in bytes + var pos + if direction%2 == 0 #up/down + if direction == 0 #up + outshift.setbytes(0,(buf[0..sz-1]).reverse(0,nil,3)) + var line = 0 + while line < (h-1) + pos = 0 + var offset_dst = line * sz + var offset_src = ((line+2) * sz) - 3 + while pos < sz + var dst = pos + offset_dst + var src = offset_src - pos + buf[dst] = buf[src] + buf[dst+1] = buf[src+1] + buf[dst+2] = buf[src+2] + pos += 3 + end + line += 1 + end + var lastline = inshift ? inshift : outshift + if h%2 == 1 + lastline.reverse(0,nil,3) + end + buf.setbytes((h-1) * sz, lastline) + else # down + outshift.setbytes(0,(buf[size(buf)-sz..]).reverse(0,nil,3)) + var line = h - 1 + while line > 0 + buf.setbytes(line * sz,(buf[(line-1) * sz..line * sz-1]).reverse(0,nil,3)) + line -= 1 + end + var lastline = inshift ? inshift : outshift + if h%2 == 1 + lastline.reverse(0,nil,3) + end + buf.setbytes(0, lastline) + end + else # left/right + var line = 0 + var step = 3 + if direction == 3 # right + step *= -1 + end + while line < h + pos = line * sz + if step > 0 + var line_end = pos + sz - step + outshift[(line * 3)] = buf[pos] + outshift[(line * 3) + 1] = buf[pos+1] + outshift[(line * 3) + 2] = buf[pos+2] + while pos < line_end + buf[pos] = buf[pos+3] + buf[pos+1] = buf[pos+4] + buf[pos+2] = buf[pos+5] + pos += step + end + if inshift == nil + buf[line_end] = outshift[(line * 3)] + buf[line_end+1] = outshift[(line * 3) + 1] + buf[line_end+2] = outshift[(line * 3) + 2] + else + buf[line_end] = inshift[(line * 3)] + buf[line_end+1] = inshift[(line * 3) + 1] + buf[line_end+2] = inshift[(line * 3) + 2] + end + else + var line_end = pos + pos = pos + sz + step + outshift[(line * 3)] = buf[pos] + outshift[(line * 3) + 1] = buf[pos+1] + outshift[(line * 3) + 2] = buf[pos+2] + while pos > line_end + buf[pos] = buf[pos-3] + buf[pos+1] = buf[pos-2] + buf[pos+2] = buf[pos-1] + pos += step + end + if inshift == nil + buf[line_end] = outshift[(line * 3)] + buf[line_end+1] = outshift[(line * 3) + 1] + buf[line_end+2] = outshift[(line * 3) + 2] + else + buf[line_end] = inshift[(line * 3)] + buf[line_end+1] = inshift[(line * 3) + 1] + buf[line_end+2] = inshift[(line * 3) + 2] + end + end + step *= -1 + line += 1 + end + end + end end return Leds_matrix(self, w, h, offset) diff --git a/lib/libesp32/berry_tasmota/src/embedded/lv_tasmota.be b/lib/libesp32/berry_tasmota/src/embedded/lv_tasmota.be index f98dea1dc..f24f26a78 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/lv_tasmota.be +++ b/lib/libesp32/berry_tasmota/src/embedded/lv_tasmota.be @@ -25,6 +25,7 @@ def init(lv_tasmota) lv.register_button_encoder = lv_tasmota.register_button_encoder lv.screenshot = lv_tasmota.screenshot + lv.set_paint_cb = lv_tasmota.set_paint_cb # add version information lv.version = lv.version_major() diff --git a/lib/libesp32/berry_tasmota/src/embedded/persist.be b/lib/libesp32/berry_tasmota/src/embedded/persist.be index c88417c30..bbbafa12c 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/persist.be +++ b/lib/libesp32/berry_tasmota/src/embedded/persist.be @@ -2,7 +2,7 @@ #- -# #- To solidify: -# #- - # load only persis_module and persist_module.init + # load only persist_module and persist_module.init import solidify solidify.dump(persist_module.init) # copy and paste into `be_persist_lib.c` diff --git a/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be b/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be index 92b186e5c..ef15f2cc3 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be +++ b/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be @@ -2,7 +2,6 @@ #- Do not use it -# class Trigger end # for compilation -class Rule_Matche end # for compilation tasmota = nil #@ solidify:Tasmota @@ -10,6 +9,7 @@ class Tasmota var _fl # list of fast_loop registered closures var _rules var _timers # holds both timers and cron + var _defer # holds functions to be called at next millisecond var _crons var _ccmd var _drivers @@ -91,13 +91,31 @@ class Tasmota end # Rules - def add_rule(pat, f, id) + def add_rule_once(pat, f, id) + self.add_rule(pat, f, id, true) + end + # add_rule(pat, f, id, run_once) + # + # pat: (string) pattern for the rule + # f: (function) the function to be called when the rule fires + # there is a check that the caller doesn't use mistakenly + # a method - in such case a closure needs to be used instead + # id: (opt, any) an optional id so the rule can be removed later + # needs to be unique to avoid collision + # No test for uniqueness is performed + # run_once: (opt, bool or nil) indicates the rule is fired only once + # this parameter is not used directly but instead + # set by 'add_rule_once()' + def add_rule(pat, f, id, run_once) self.check_not_method(f) if self._rules == nil self._rules = [] end if type(f) == 'function' - self._rules.push(Trigger(self.Rule_Matcher.parse(pat), f, id)) + if (id != nil) + self.remove_rule(pat, id) + end + self._rules.push(Trigger(self.Rule_Matcher.parse(pat), f, id, run_once)) else raise 'value_error', 'the second argument is not a function' end @@ -116,6 +134,59 @@ class Tasmota end end + #- + # Below is a unit test for add_rule and add_rule_once + var G1, G2, G3 + def f1() print("F1") G1 = 1 return true end + def f2() print("F2") G2 = 2 return true end + def f3() print("F3") G3 = 3 return true end + + + tasmota.add_rule("A#B", f1, "f1") + tasmota.add_rule_once("A#B", f2, "f2") + + var r + r = tasmota.publish_rule('{"A":{"B":1}}') + + assert(G1 == 1) + assert(G2 == 2) + assert(G3 == nil) + #assert(r == true) + + G1 = nil + G2 = nil + + r = tasmota.publish_rule('{"A":{"B":1}}') + + assert(G1 == 1) + assert(G2 == nil) + assert(G3 == nil) + #assert(r == true) + + tasmota.add_rule("A#B", f3, "f1") + + G1 = nil + + r = tasmota.publish_rule('{"A":{"B":1}}') + + assert(G1 == nil) + assert(G2 == nil) + assert(G3 == 3) + #assert(r == true) + + tasmota.remove_rule("A#B", "f1") + + G3 = nil + + r = tasmota.publish_rule('{"A":{"B":1}}') + + assert(G1 == nil) + assert(G2 == nil) + assert(G3 == nil) + #assert(r == false) + + -# + # Rules trigger if match. return true if match, false if not # # event: native Berry map representing the JSON input @@ -134,27 +205,35 @@ class Tasmota # Run rules, i.e. check each individual rule # Returns true if at least one rule matched, false if none - # `exec_rule` is true, then run the rule, else just record value + # + # ev_json: (string) the payload of the rule, needs to be JSON format + # exec_rule: (bool) 'true' run the rule, 'false' just record value (avoind infinite loops) def exec_rules(ev_json, exec_rule) - var save_cmd_res = self.cmd_res # save initial state (for reentrance) - if self._rules || save_cmd_res != nil # if there is a rule handler, or we record rule results + var save_cmd_res = self.cmd_res # save initial state (for reentrance) + if self._rules || save_cmd_res != nil # if there is a rule handler, or we record rule results import json self.cmd_res = nil # disable sunsequent recording of results - var ret = false + var ret = false # ret records if any rule was fired var ev = json.load(ev_json) # returns nil if invalid JSON if ev == nil - self.log('BRY: ERROR, bad json: '+ev_json, 3) - ev = ev_json # revert to string + self.log('BRY: ERROR, bad json: ' + ev_json, 3) + ev = ev_json # revert to string end # try all rule handlers if exec_rule && self._rules var i = 0 while i < size(self._rules) var tr = self._rules[i] - ret = self.try_rule(ev,tr.trig,tr.f) || ret #- call should be first to avoid evaluation shortcut if ret is already true -# - i += 1 + var rule_fired = self.try_rule(ev, tr.trig, tr.f) + ret = ret || rule_fired # 'or' with result + if rule_fired && (tr.o == true) + # this rule should be run_once(d) so remove it + self._rules.remove(i) + else + i += 1 + end end end @@ -195,13 +274,39 @@ class Tasmota def set_timer(delay,f,id) self.check_not_method(f) if self._timers == nil - self._timers=[] + self._timers = [] end self._timers.push(Trigger(self.millis(delay),f,id)) end - # run every 50ms tick + # special version to push a function that will be called immediately after + def defer(f) + if self._defer == nil + self._defer = [] + end + self._defer.push(f) + tasmota.global.deferred_ready = 1 + end + + # run any immediate function def run_deferred() + if self._defer + var sz = size(self._defer) # make sure to run only those present at first, and not those inserted in between + while sz > 0 + var f = self._defer[0] + self._defer.remove(0) + sz -= 1 + f() + end + if size(self._defer) == 0 + tasmota.global.deferred_ready = 0 + end + end + end + + # run every 50ms tick + def run_timers() + self.run_deferred() # run immediate functions first if self._timers var i=0 while i < self._timers.size() @@ -621,7 +726,7 @@ class Tasmota def event(event_type, cmd, idx, payload, raw) import introspect if event_type=='every_50ms' - self.run_deferred() + self.run_timers() end #- first run deferred events -# if event_type=='every_250ms' @@ -717,6 +822,59 @@ class Tasmota return ret end + # tasmota.int(v, min, max) + # ensures that v is int, and always between min and max + # if min>max returns min + # if v==nil returns min + static def int(v, min, max) + v = int(v) # v is int (not nil) + if (min == nil && max == nil) return v end + min = int(min) + max = int(max) + if (min != nil && max != nil) + if (v == nil) return min end + end + if (v != nil) + if (min != nil && v < min) return min end + if (max != nil && v > max) return max end + end + return v + end + + #- + # Unit tests + + # behave like normal int + assert(tasmota.int(4) == 4) + assert(tasmota.int(nil) == nil) + assert(tasmota.int(-3) == -3) + assert(tasmota.int(4.5) == 4) + assert(tasmota.int(true) == 1) + assert(tasmota.int(false) == 0) + + # normal behavior + assert(tasmota.int(4, 0, 10) == 4) + assert(tasmota.int(0, 0, 10) == 0) + assert(tasmota.int(10, 0, 10) == 10) + assert(tasmota.int(10, 0, 0) == 0) + assert(tasmota.int(10, 10, 10) == 10) + assert(tasmota.int(-4, 0, 10) == 0) + assert(tasmota.int(nil, 0, 10) == 0) + + # missing min or max + assert(tasmota.int(4, nil, 10) == 4) + assert(tasmota.int(14, nil, 10) == 10) + assert(tasmota.int(nil, nil, 10) == nil) + assert(tasmota.int(4, 0, nil) == 4) + assert(tasmota.int(-4, 0, nil) == 0) + assert(tasmota.int(nil, 0, nil) == nil) + + # max < min + assert(tasmota.int(4, 10, 0) == 10) + assert(tasmota.int(nil, 10, 0) == 10) + + -# + # set_light and get_light deprecetaion def get_light(l) print('tasmota.get_light() is deprecated, use light.get()') diff --git a/lib/libesp32/berry_tasmota/src/embedded/trigger_class.be b/lib/libesp32/berry_tasmota/src/embedded/trigger_class.be index ecdd5c111..00c3839f9 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/trigger_class.be +++ b/lib/libesp32/berry_tasmota/src/embedded/trigger_class.be @@ -5,7 +5,7 @@ class Trigger var trig, f, id - var o # optional object + var o # optional object, for Cron it contains the cron object, for rule, 'true' means run-once # trig: trigger of the event, either timestamp (int) or a rule matcher instance # f: function or closure to call @@ -24,6 +24,10 @@ class Trigger str(self.trig), str(self.f), str(self.id)) end + def run_once() + return self.o == true + end + ########################################################################################### # For cron triggers only ########################################################################################### diff --git a/lib/libesp32/berry_tasmota/src/embedded/webserver_async.be b/lib/libesp32/berry_tasmota/src/embedded/webserver_async.be index c14b5dccf..cd819f25c 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/webserver_async.be +++ b/lib/libesp32/berry_tasmota/src/embedded/webserver_async.be @@ -597,30 +597,38 @@ class webserver_async ############################################################# # Helper function to encode integer as int - static def bytes_format_int(b, i, default) - b.clear() - if (i == nil) b .. default return end - var negative = false - # sanity check - if (i < 0) i = -i negative = true end - if (i < 0) return end # special case for MININT - if (i == 0) b.resize(1) b[0] = 0x30 return end # return bytes("30") + static def bytes_append_int(b, i, default) + var sz = size(b) + if (i == 0) # just append '0' + b.resize(sz + 1) + b[sz] = 0x30 + elif (i != nil) # we have a non-zero value + var negative = false + # sanity check + if (i < 0) i = -i negative = true end + if (i < 0) return b end # special case for MININT + + if negative + b.resize(sz + 1) + b[sz] = 0x2D + sz += 1 + end + + var start = sz + while i > 0 + var digit = i % 10 + b.resize(sz + 1) + b[sz] = 0x30 + digit + sz += 1 + i = (i / 10) + end + # reverse order starting where the integer is + b.reverse(start) - b.resize(11) # max size for 32 bits ints '-2147483647' - var len = 0 - while i > 0 - var digit = i % 10 - b[len] = 0x30 + digit - len += 1 - i = (i / 10) + else # i is `nil`, append default + b.append(default) end - if negative - b[len] = 0x2D - len += 1 - end - # reverse order - b.resize(len) - b.reverse() + return b end ############################################################# diff --git a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be index f49ce273c..3cb07eb45 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be +++ b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be @@ -59,8 +59,6 @@ class zb_coord : zb_coord_ntv if zcl_attribute_list_ptr != nullptr attr_list = self.zcl_attribute_list(zcl_attribute_list_ptr) end - - #print(format(">ZIG: cmd=%s data_type=%s data=%s idx=%i", event_type, data_type, str(data), idx)) var i = 0 while i < size(self._handlers) diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_AXP192.h similarity index 96% rename from lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h rename to lib/libesp32/berry_tasmota/src/solidify/solidified_AXP192.h index 003818560..e00408263 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp192.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_AXP192.h @@ -1,4 +1,4 @@ -/* Solidification of i2c_axp192.h */ +/* Solidification of AXP192.h */ /********************************************************************\ * Generated code, don't edit * \********************************************************************/ @@ -551,8 +551,8 @@ be_local_closure(class_AXP192_json_append, /* name */ ********************************************************************/ be_local_closure(class_AXP192_init, /* name */ be_nested_proto( - 5, /* nstack */ - 1, /* argc */ + 6, /* nstack */ + 2, /* argc */ 10, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -562,16 +562,20 @@ be_local_closure(class_AXP192_init, /* name */ &be_ktab_class_AXP192, /* shared constants */ &be_const_str_init, &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x60040003, // 0000 GETGBL R1 G3 - 0x5C080000, // 0001 MOVE R2 R0 - 0xB80E3000, // 0002 GETNGBL R3 K24 - 0x7C040400, // 0003 CALL R1 2 - 0x8C040319, // 0004 GETMET R1 R1 K25 - 0x580C001A, // 0005 LDCONST R3 K26 - 0x54120033, // 0006 LDINT R4 52 - 0x7C040600, // 0007 CALL R1 3 - 0x80000000, // 0008 RET 0 + ( &(const binstruction[13]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0000, // 0002 JMPF R2 #0004 + 0x54060033, // 0003 LDINT R1 52 + 0x60080003, // 0004 GETGBL R2 G3 + 0x5C0C0000, // 0005 MOVE R3 R0 + 0xB8123000, // 0006 GETNGBL R4 K24 + 0x7C080400, // 0007 CALL R2 2 + 0x8C080519, // 0008 GETMET R2 R2 K25 + 0x5810001A, // 0009 LDCONST R4 K26 + 0x54160033, // 000A LDINT R5 52 + 0x7C080600, // 000B CALL R2 3 + 0x80000000, // 000C RET 0 }) ) ); @@ -659,12 +663,12 @@ be_local_closure(class_AXP192_web_sensor, /* name */ /******************************************************************** -** Solidified function: set_chg_current +** Solidified function: get_battery_charging_status ********************************************************************/ -be_local_closure(class_AXP192_set_chg_current, /* name */ +be_local_closure(class_AXP192_get_battery_charging_status, /* name */ be_nested_proto( - 8, /* nstack */ - 2, /* argc */ + 6, /* nstack */ + 1, /* argc */ 10, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -672,21 +676,16 @@ be_local_closure(class_AXP192_set_chg_current, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_AXP192, /* shared constants */ - &be_const_str_set_chg_current, + &be_const_str_get_battery_charging_status, &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x8C08010F, // 0000 GETMET R2 R0 K15 - 0x54120032, // 0001 LDINT R4 51 - 0x8C140110, // 0002 GETMET R5 R0 K16 - 0x541E0032, // 0003 LDINT R7 51 - 0x7C140400, // 0004 CALL R5 2 - 0x541A00EF, // 0005 LDINT R6 240 - 0x2C140A06, // 0006 AND R5 R5 R6 - 0x541A000E, // 0007 LDINT R6 15 - 0x2C180206, // 0008 AND R6 R1 R6 - 0x30140A06, // 0009 OR R5 R5 R6 - 0x7C080600, // 000A CALL R2 3 - 0x80000000, // 000B RET 0 + ( &(const binstruction[ 7]) { /* code */ + 0x8804010A, // 0000 GETMBR R1 R0 K10 + 0x8C04030B, // 0001 GETMET R1 R1 K11 + 0x880C010C, // 0002 GETMBR R3 R0 K12 + 0x58100000, // 0003 LDCONST R4 K0 + 0x58140000, // 0004 LDCONST R5 K0 + 0x7C040800, // 0005 CALL R1 4 + 0x80040200, // 0006 RET 1 R1 }) ) ); @@ -823,12 +822,12 @@ be_local_closure(class_AXP192_power_off, /* name */ /******************************************************************** -** Solidified function: get_battery_chargin_status +** Solidified function: set_chg_current ********************************************************************/ -be_local_closure(class_AXP192_get_battery_chargin_status, /* name */ +be_local_closure(class_AXP192_set_chg_current, /* name */ be_nested_proto( - 6, /* nstack */ - 1, /* argc */ + 8, /* nstack */ + 2, /* argc */ 10, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -836,16 +835,21 @@ be_local_closure(class_AXP192_get_battery_chargin_status, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_AXP192, /* shared constants */ - &be_const_str_get_battery_chargin_status, + &be_const_str_set_chg_current, &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x8804010A, // 0000 GETMBR R1 R0 K10 - 0x8C04030B, // 0001 GETMET R1 R1 K11 - 0x880C010C, // 0002 GETMBR R3 R0 K12 - 0x58100000, // 0003 LDCONST R4 K0 - 0x58140000, // 0004 LDCONST R5 K0 - 0x7C040800, // 0005 CALL R1 4 - 0x80040200, // 0006 RET 1 R1 + ( &(const binstruction[12]) { /* code */ + 0x8C08010F, // 0000 GETMET R2 R0 K15 + 0x54120032, // 0001 LDINT R4 51 + 0x8C140110, // 0002 GETMET R5 R0 K16 + 0x541E0032, // 0003 LDINT R7 51 + 0x7C140400, // 0004 CALL R5 2 + 0x541A00EF, // 0005 LDINT R6 240 + 0x2C140A06, // 0006 AND R5 R5 R6 + 0x541A000E, // 0007 LDINT R6 15 + 0x2C180206, // 0008 AND R6 R1 R6 + 0x30140A06, // 0009 OR R5 R5 R6 + 0x7C080600, // 000A CALL R2 3 + 0x80000000, // 000B RET 0 }) ) ); @@ -891,12 +895,12 @@ be_local_class(AXP192, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key(set_dcdc_enable, -1), be_const_closure(class_AXP192_set_dcdc_enable_closure) }, { be_const_key(get_bat_power, -1), be_const_closure(class_AXP192_get_bat_power_closure) }, - { be_const_key(get_bat_charge_current, 3), be_const_closure(class_AXP192_get_bat_charge_current_closure) }, - { be_const_key(get_battery_chargin_status, -1), be_const_closure(class_AXP192_get_battery_chargin_status_closure) }, + { be_const_key(get_bat_charge_current, -1), be_const_closure(class_AXP192_get_bat_charge_current_closure) }, + { be_const_key(set_chg_current, -1), be_const_closure(class_AXP192_set_chg_current_closure) }, { be_const_key(get_warning_level, -1), be_const_closure(class_AXP192_get_warning_level_closure) }, { be_const_key(power_off, -1), be_const_closure(class_AXP192_power_off_closure) }, { be_const_key(get_vbus_current, 22), be_const_closure(class_AXP192_get_vbus_current_closure) }, - { be_const_key(get_aps_voltage, -1), be_const_closure(class_AXP192_get_aps_voltage_closure) }, + { be_const_key(get_aps_voltage, 17), be_const_closure(class_AXP192_get_aps_voltage_closure) }, { be_const_key(set_exten, -1), be_const_closure(class_AXP192_set_exten_closure) }, { be_const_key(battery_present, -1), be_const_closure(class_AXP192_battery_present_closure) }, { be_const_key(get_vbus_voltage, -1), be_const_closure(class_AXP192_get_vbus_voltage_closure) }, @@ -906,9 +910,9 @@ be_local_class(AXP192, { be_const_key(init, 2), be_const_closure(class_AXP192_init_closure) }, { be_const_key(get_bat_current, -1), be_const_closure(class_AXP192_get_bat_current_closure) }, { be_const_key(web_sensor, -1), be_const_closure(class_AXP192_web_sensor_closure) }, - { be_const_key(set_dc_voltage, -1), be_const_closure(class_AXP192_set_dc_voltage_closure) }, + { be_const_key(get_battery_charging_status, -1), be_const_closure(class_AXP192_get_battery_charging_status_closure) }, { be_const_key(get_temp, -1), be_const_closure(class_AXP192_get_temp_closure) }, - { be_const_key(set_chg_current, 17), be_const_closure(class_AXP192_set_chg_current_closure) }, + { be_const_key(set_dc_voltage, 3), be_const_closure(class_AXP192_set_dc_voltage_closure) }, { be_const_key(get_bat_voltage, 5), be_const_closure(class_AXP192_get_bat_voltage_closure) }, { be_const_key(json_append, -1), be_const_closure(class_AXP192_json_append_closure) }, { be_const_key(get_input_power_status, -1), be_const_closure(class_AXP192_get_input_power_status_closure) }, diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_AXP202.h similarity index 90% rename from lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h rename to lib/libesp32/berry_tasmota/src/solidify/solidified_AXP202.h index c15ccbf69..77e4fb3e5 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_i2c_axp202.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_AXP202.h @@ -1,4 +1,4 @@ -/* Solidification of i2c_axp202.h */ +/* Solidification of AXP202.h */ /********************************************************************\ * Generated code, don't edit * \********************************************************************/ @@ -13,20 +13,20 @@ static const bvalue be_ktab_class_AXP202[24] = { /* K5 */ be_nested_str(read8), /* K6 */ be_nested_str(read12), /* K7 */ be_const_real_hex(0x3EC00000), - /* K8 */ be_const_real_hex(0x3A902DE0), - /* K9 */ be_nested_str(read13), - /* K10 */ be_const_real_hex(0x3F000000), - /* K11 */ be_nested_str(read24), - /* K12 */ be_const_real_hex(0x3A102DE0), - /* K13 */ be_const_real_hex(0x3AB78035), - /* K14 */ be_const_real_hex(0x3ADED28A), - /* K15 */ be_nested_str(write_bit), - /* K16 */ be_nested_str(wire), - /* K17 */ be_nested_str(read), - /* K18 */ be_nested_str(addr), - /* K19 */ be_nested_str(I2C_Driver), - /* K20 */ be_nested_str(init), - /* K21 */ be_nested_str(AXP202), + /* K8 */ be_nested_str(read13), + /* K9 */ be_const_real_hex(0x3F000000), + /* K10 */ be_nested_str(read24), + /* K11 */ be_const_real_hex(0x3A102DE0), + /* K12 */ be_nested_str(wire), + /* K13 */ be_nested_str(read), + /* K14 */ be_nested_str(addr), + /* K15 */ be_const_real_hex(0x3ADED28A), + /* K16 */ be_const_real_hex(0x3AB78035), + /* K17 */ be_nested_str(write_bit), + /* K18 */ be_nested_str(I2C_Driver), + /* K19 */ be_nested_str(init), + /* K20 */ be_nested_str(AXP202), + /* K21 */ be_const_real_hex(0x3A902DE0), /* K22 */ be_const_real_hex(0x3DCCCCCD), /* K23 */ be_const_real_hex(0x4310B333), }; @@ -110,9 +110,9 @@ be_local_closure(class_AXP202_get_vbus_current, /* name */ /******************************************************************** -** Solidified function: get_bat_voltage +** Solidified function: get_bat_charge_current ********************************************************************/ -be_local_closure(class_AXP202_get_bat_voltage, /* name */ +be_local_closure(class_AXP202_get_bat_charge_current, /* name */ be_nested_proto( 4, /* nstack */ 1, /* argc */ @@ -123,13 +123,13 @@ be_local_closure(class_AXP202_get_bat_voltage, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_AXP202, /* shared constants */ - &be_const_str_get_bat_voltage, + &be_const_str_get_bat_charge_current, &be_const_str_solidified, ( &(const binstruction[ 5]) { /* code */ - 0x8C040106, // 0000 GETMET R1 R0 K6 - 0x540E0077, // 0001 LDINT R3 120 + 0x8C040108, // 0000 GETMET R1 R0 K8 + 0x540E0079, // 0001 LDINT R3 122 0x7C040400, // 0002 CALL R1 2 - 0x08040308, // 0003 MUL R1 R1 K8 + 0x08040309, // 0003 MUL R1 R1 K9 0x80040200, // 0004 RET 1 R1 }) ) @@ -154,14 +154,14 @@ be_local_closure(class_AXP202_get_bat_current, /* name */ &be_const_str_get_bat_current, &be_const_str_solidified, ( &(const binstruction[ 9]) { /* code */ - 0x8C040109, // 0000 GETMET R1 R0 K9 + 0x8C040108, // 0000 GETMET R1 R0 K8 0x540E0079, // 0001 LDINT R3 122 0x7C040400, // 0002 CALL R1 2 - 0x8C080109, // 0003 GETMET R2 R0 K9 + 0x8C080108, // 0003 GETMET R2 R0 K8 0x5412007B, // 0004 LDINT R4 124 0x7C080400, // 0005 CALL R2 2 0x04040202, // 0006 SUB R1 R1 R2 - 0x0804030A, // 0007 MUL R1 R1 K10 + 0x08040309, // 0007 MUL R1 R1 K9 0x80040200, // 0008 RET 1 R1 }) ) @@ -186,10 +186,68 @@ be_local_closure(class_AXP202_get_bat_power, /* name */ &be_const_str_get_bat_power, &be_const_str_solidified, ( &(const binstruction[ 5]) { /* code */ - 0x8C04010B, // 0000 GETMET R1 R0 K11 + 0x8C04010A, // 0000 GETMET R1 R0 K10 0x540E006F, // 0001 LDINT R3 112 0x7C040400, // 0002 CALL R1 2 - 0x0804030C, // 0003 MUL R1 R1 K12 + 0x0804030B, // 0003 MUL R1 R1 K11 + 0x80040200, // 0004 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_battery_charging_status +********************************************************************/ +be_local_closure(class_AXP202_get_battery_charging_status, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP202, /* shared constants */ + &be_const_str_get_battery_charging_status, + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x8804010C, // 0000 GETMBR R1 R0 K12 + 0x8C04030D, // 0001 GETMET R1 R1 K13 + 0x880C010E, // 0002 GETMBR R3 R0 K14 + 0x58100001, // 0003 LDCONST R4 K1 + 0x58140001, // 0004 LDCONST R5 K1 + 0x7C040800, // 0005 CALL R1 4 + 0x80040200, // 0006 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_vbus_voltage +********************************************************************/ +be_local_closure(class_AXP202_get_vbus_voltage, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP202, /* shared constants */ + &be_const_str_get_vbus_voltage, + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x8C040106, // 0000 GETMET R1 R0 K6 + 0x540E0059, // 0001 LDINT R3 90 + 0x7C040400, // 0002 CALL R1 2 + 0x0804030F, // 0003 MUL R1 R1 K15 0x80040200, // 0004 RET 1 R1 }) ) @@ -217,7 +275,7 @@ be_local_closure(class_AXP202_get_aps_voltage, /* name */ 0x8C040106, // 0000 GETMET R1 R0 K6 0x540E007D, // 0001 LDINT R3 126 0x7C040400, // 0002 CALL R1 2 - 0x0804030D, // 0003 MUL R1 R1 K13 + 0x08040310, // 0003 MUL R1 R1 K16 0x80040200, // 0004 RET 1 R1 }) ) @@ -225,80 +283,6 @@ be_local_closure(class_AXP202_get_aps_voltage, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: get_vbus_voltage -********************************************************************/ -be_local_closure(class_AXP202_get_vbus_voltage, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_AXP202, /* shared constants */ - &be_const_str_get_vbus_voltage, - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x8C040106, // 0000 GETMET R1 R0 K6 - 0x540E0059, // 0001 LDINT R3 90 - 0x7C040400, // 0002 CALL R1 2 - 0x0804030E, // 0003 MUL R1 R1 K14 - 0x80040200, // 0004 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_ldo_enable -********************************************************************/ -be_local_closure(class_AXP202_set_ldo_enable, /* name */ - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_AXP202, /* shared constants */ - &be_const_str_set_ldo_enable, - &be_const_str_solidified, - ( &(const binstruction[23]) { /* code */ - 0x1C0C0302, // 0000 EQ R3 R1 K2 - 0x780E0004, // 0001 JMPF R3 #0007 - 0x8C0C010F, // 0002 GETMET R3 R0 K15 - 0x54160011, // 0003 LDINT R5 18 - 0x58180002, // 0004 LDCONST R6 K2 - 0x5C1C0400, // 0005 MOVE R7 R2 - 0x7C0C0800, // 0006 CALL R3 4 - 0x1C0C0303, // 0007 EQ R3 R1 K3 - 0x780E0004, // 0008 JMPF R3 #000E - 0x8C0C010F, // 0009 GETMET R3 R0 K15 - 0x54160011, // 000A LDINT R5 18 - 0x541A0005, // 000B LDINT R6 6 - 0x5C1C0400, // 000C MOVE R7 R2 - 0x7C0C0800, // 000D CALL R3 4 - 0x540E0003, // 000E LDINT R3 4 - 0x1C0C0203, // 000F EQ R3 R1 R3 - 0x780E0004, // 0010 JMPF R3 #0016 - 0x8C0C010F, // 0011 GETMET R3 R0 K15 - 0x54160011, // 0012 LDINT R5 18 - 0x58180003, // 0013 LDCONST R6 K3 - 0x5C1C0400, // 0014 MOVE R7 R2 - 0x7C0C0800, // 0015 CALL R3 4 - 0x80000000, // 0016 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: battery_present ********************************************************************/ @@ -316,9 +300,9 @@ be_local_closure(class_AXP202_battery_present, /* name */ &be_const_str_battery_present, &be_const_str_solidified, ( &(const binstruction[15]) { /* code */ - 0x88040110, // 0000 GETMBR R1 R0 K16 - 0x8C040311, // 0001 GETMET R1 R1 K17 - 0x880C0112, // 0002 GETMBR R3 R0 K18 + 0x8804010C, // 0000 GETMBR R1 R0 K12 + 0x8C04030D, // 0001 GETMET R1 R1 K13 + 0x880C010E, // 0002 GETMBR R3 R0 K14 0x58100001, // 0003 LDCONST R4 K1 0x58140001, // 0004 LDCONST R5 K1 0x7C040800, // 0005 CALL R1 4 @@ -395,14 +379,14 @@ be_local_closure(class_AXP202_set_dcdc_enable, /* name */ ( &(const binstruction[15]) { /* code */ 0x1C0C0302, // 0000 EQ R3 R1 K2 0x780E0004, // 0001 JMPF R3 #0007 - 0x8C0C010F, // 0002 GETMET R3 R0 K15 + 0x8C0C0111, // 0002 GETMET R3 R0 K17 0x54160011, // 0003 LDINT R5 18 0x541A0003, // 0004 LDINT R6 4 0x5C1C0400, // 0005 MOVE R7 R2 0x7C0C0800, // 0006 CALL R3 4 0x1C0C0303, // 0007 EQ R3 R1 K3 0x780E0004, // 0008 JMPF R3 #000E - 0x8C0C010F, // 0009 GETMET R3 R0 K15 + 0x8C0C0111, // 0009 GETMET R3 R0 K17 0x54160011, // 000A LDINT R5 18 0x58180001, // 000B LDCONST R6 K1 0x5C1C0400, // 000C MOVE R7 R2 @@ -459,8 +443,8 @@ be_local_closure(class_AXP202_set_chg_led_mode, /* name */ ********************************************************************/ be_local_closure(class_AXP202_init, /* name */ be_nested_proto( - 5, /* nstack */ - 1, /* argc */ + 6, /* nstack */ + 2, /* argc */ 10, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -470,16 +454,20 @@ be_local_closure(class_AXP202_init, /* name */ &be_ktab_class_AXP202, /* shared constants */ &be_const_str_init, &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x60040003, // 0000 GETGBL R1 G3 - 0x5C080000, // 0001 MOVE R2 R0 - 0xB80E2600, // 0002 GETNGBL R3 K19 - 0x7C040400, // 0003 CALL R1 2 - 0x8C040314, // 0004 GETMET R1 R1 K20 - 0x580C0015, // 0005 LDCONST R3 K21 - 0x54120034, // 0006 LDINT R4 53 - 0x7C040600, // 0007 CALL R1 3 - 0x80000000, // 0008 RET 0 + ( &(const binstruction[13]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0000, // 0002 JMPF R2 #0004 + 0x54060034, // 0003 LDINT R1 53 + 0x60080003, // 0004 GETGBL R2 G3 + 0x5C0C0000, // 0005 MOVE R3 R0 + 0xB8122400, // 0006 GETNGBL R4 K18 + 0x7C080400, // 0007 CALL R2 2 + 0x8C080513, // 0008 GETMET R2 R2 K19 + 0x58100014, // 0009 LDCONST R4 K20 + 0x54160034, // 000A LDINT R5 53 + 0x7C080600, // 000B CALL R2 3 + 0x80000000, // 000C RET 0 }) ) ); @@ -503,7 +491,7 @@ be_local_closure(class_AXP202_set_exten, /* name */ &be_const_str_set_exten, &be_const_str_solidified, ( &(const binstruction[ 6]) { /* code */ - 0x8C08010F, // 0000 GETMET R2 R0 K15 + 0x8C080111, // 0000 GETMET R2 R0 K17 0x54120011, // 0001 LDINT R4 18 0x58140000, // 0002 LDCONST R5 K0 0x5C180200, // 0003 MOVE R6 R1 @@ -515,160 +503,6 @@ be_local_closure(class_AXP202_set_exten, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: get_battery_chargin_status -********************************************************************/ -be_local_closure(class_AXP202_get_battery_chargin_status, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_AXP202, /* shared constants */ - &be_const_str_get_battery_chargin_status, - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88040110, // 0000 GETMBR R1 R0 K16 - 0x8C040311, // 0001 GETMET R1 R1 K17 - 0x880C0112, // 0002 GETMBR R3 R0 K18 - 0x58100001, // 0003 LDCONST R4 K1 - 0x58140001, // 0004 LDCONST R5 K1 - 0x7C040800, // 0005 CALL R1 4 - 0x80040200, // 0006 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_dc_voltage -********************************************************************/ -be_local_closure(class_AXP202_set_dc_voltage, /* name */ - be_nested_proto( - 11, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_AXP202, /* shared constants */ - &be_const_str_set_dc_voltage, - &be_const_str_solidified, - ( &(const binstruction[44]) { /* code */ - 0x140C0302, // 0000 LT R3 R1 K2 - 0x740E0001, // 0001 JMPT R3 #0004 - 0x240C0303, // 0002 GT R3 R1 K3 - 0x780E0000, // 0003 JMPF R3 #0005 - 0x80000600, // 0004 RET 0 - 0x4C0C0000, // 0005 LDNIL R3 - 0x541202BB, // 0006 LDINT R4 700 - 0x14100404, // 0007 LT R4 R2 R4 - 0x78120001, // 0008 JMPF R4 #000B - 0x580C0000, // 0009 LDCONST R3 K0 - 0x70020010, // 000A JMP #001C - 0x54120DAB, // 000B LDINT R4 3500 - 0x24100404, // 000C GT R4 R2 R4 - 0x78120001, // 000D JMPF R4 #0010 - 0x540E006F, // 000E LDINT R3 112 - 0x7002000B, // 000F JMP #001C - 0x1C100302, // 0010 EQ R4 R1 K2 - 0x78120004, // 0011 JMPF R4 #0017 - 0x541208E2, // 0012 LDINT R4 2275 - 0x24100404, // 0013 GT R4 R2 R4 - 0x78120001, // 0014 JMPF R4 #0017 - 0x540E003E, // 0015 LDINT R3 63 - 0x70020004, // 0016 JMP #001C - 0x541202BB, // 0017 LDINT R4 700 - 0x04100404, // 0018 SUB R4 R2 R4 - 0x54160018, // 0019 LDINT R5 25 - 0x0C100805, // 001A DIV R4 R4 R5 - 0x5C0C0800, // 001B MOVE R3 R4 - 0x54120022, // 001C LDINT R4 35 - 0x1C140303, // 001D EQ R5 R1 K3 - 0x78160000, // 001E JMPF R5 #0020 - 0x54120026, // 001F LDINT R4 39 - 0x8C140104, // 0020 GETMET R5 R0 K4 - 0x5C1C0800, // 0021 MOVE R7 R4 - 0x8C200105, // 0022 GETMET R8 R0 K5 - 0x5C280800, // 0023 MOVE R10 R4 - 0x7C200400, // 0024 CALL R8 2 - 0x5426007F, // 0025 LDINT R9 128 - 0x2C201009, // 0026 AND R8 R8 R9 - 0x5426007E, // 0027 LDINT R9 127 - 0x2C240609, // 0028 AND R9 R3 R9 - 0x30201009, // 0029 OR R8 R8 R9 - 0x7C140600, // 002A CALL R5 3 - 0x80000000, // 002B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_bat_charge_current -********************************************************************/ -be_local_closure(class_AXP202_get_bat_charge_current, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_AXP202, /* shared constants */ - &be_const_str_get_bat_charge_current, - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x8C040109, // 0000 GETMET R1 R0 K9 - 0x540E0079, // 0001 LDINT R3 122 - 0x7C040400, // 0002 CALL R1 2 - 0x0804030A, // 0003 MUL R1 R1 K10 - 0x80040200, // 0004 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_temp -********************************************************************/ -be_local_closure(class_AXP202_get_temp, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_AXP202, /* shared constants */ - &be_const_str_get_temp, - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x8C040106, // 0000 GETMET R1 R0 K6 - 0x540E005D, // 0001 LDINT R3 94 - 0x7C040400, // 0002 CALL R1 2 - 0x08040316, // 0003 MUL R1 R1 K22 - 0x04040317, // 0004 SUB R1 R1 K23 - 0x80040200, // 0005 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: set_ldo_voltage ********************************************************************/ @@ -751,6 +585,176 @@ be_local_closure(class_AXP202_set_ldo_voltage, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: set_dc_voltage +********************************************************************/ +be_local_closure(class_AXP202_set_dc_voltage, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP202, /* shared constants */ + &be_const_str_set_dc_voltage, + &be_const_str_solidified, + ( &(const binstruction[44]) { /* code */ + 0x140C0302, // 0000 LT R3 R1 K2 + 0x740E0001, // 0001 JMPT R3 #0004 + 0x240C0303, // 0002 GT R3 R1 K3 + 0x780E0000, // 0003 JMPF R3 #0005 + 0x80000600, // 0004 RET 0 + 0x4C0C0000, // 0005 LDNIL R3 + 0x541202BB, // 0006 LDINT R4 700 + 0x14100404, // 0007 LT R4 R2 R4 + 0x78120001, // 0008 JMPF R4 #000B + 0x580C0000, // 0009 LDCONST R3 K0 + 0x70020010, // 000A JMP #001C + 0x54120DAB, // 000B LDINT R4 3500 + 0x24100404, // 000C GT R4 R2 R4 + 0x78120001, // 000D JMPF R4 #0010 + 0x540E006F, // 000E LDINT R3 112 + 0x7002000B, // 000F JMP #001C + 0x1C100302, // 0010 EQ R4 R1 K2 + 0x78120004, // 0011 JMPF R4 #0017 + 0x541208E2, // 0012 LDINT R4 2275 + 0x24100404, // 0013 GT R4 R2 R4 + 0x78120001, // 0014 JMPF R4 #0017 + 0x540E003E, // 0015 LDINT R3 63 + 0x70020004, // 0016 JMP #001C + 0x541202BB, // 0017 LDINT R4 700 + 0x04100404, // 0018 SUB R4 R2 R4 + 0x54160018, // 0019 LDINT R5 25 + 0x0C100805, // 001A DIV R4 R4 R5 + 0x5C0C0800, // 001B MOVE R3 R4 + 0x54120022, // 001C LDINT R4 35 + 0x1C140303, // 001D EQ R5 R1 K3 + 0x78160000, // 001E JMPF R5 #0020 + 0x54120026, // 001F LDINT R4 39 + 0x8C140104, // 0020 GETMET R5 R0 K4 + 0x5C1C0800, // 0021 MOVE R7 R4 + 0x8C200105, // 0022 GETMET R8 R0 K5 + 0x5C280800, // 0023 MOVE R10 R4 + 0x7C200400, // 0024 CALL R8 2 + 0x5426007F, // 0025 LDINT R9 128 + 0x2C201009, // 0026 AND R8 R8 R9 + 0x5426007E, // 0027 LDINT R9 127 + 0x2C240609, // 0028 AND R9 R3 R9 + 0x30201009, // 0029 OR R8 R8 R9 + 0x7C140600, // 002A CALL R5 3 + 0x80000000, // 002B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_bat_voltage +********************************************************************/ +be_local_closure(class_AXP202_get_bat_voltage, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP202, /* shared constants */ + &be_const_str_get_bat_voltage, + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x8C040106, // 0000 GETMET R1 R0 K6 + 0x540E0077, // 0001 LDINT R3 120 + 0x7C040400, // 0002 CALL R1 2 + 0x08040315, // 0003 MUL R1 R1 K21 + 0x80040200, // 0004 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_temp +********************************************************************/ +be_local_closure(class_AXP202_get_temp, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP202, /* shared constants */ + &be_const_str_get_temp, + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x8C040106, // 0000 GETMET R1 R0 K6 + 0x540E005D, // 0001 LDINT R3 94 + 0x7C040400, // 0002 CALL R1 2 + 0x08040316, // 0003 MUL R1 R1 K22 + 0x04040317, // 0004 SUB R1 R1 K23 + 0x80040200, // 0005 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_ldo_enable +********************************************************************/ +be_local_closure(class_AXP202_set_ldo_enable, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP202, /* shared constants */ + &be_const_str_set_ldo_enable, + &be_const_str_solidified, + ( &(const binstruction[23]) { /* code */ + 0x1C0C0302, // 0000 EQ R3 R1 K2 + 0x780E0004, // 0001 JMPF R3 #0007 + 0x8C0C0111, // 0002 GETMET R3 R0 K17 + 0x54160011, // 0003 LDINT R5 18 + 0x58180002, // 0004 LDCONST R6 K2 + 0x5C1C0400, // 0005 MOVE R7 R2 + 0x7C0C0800, // 0006 CALL R3 4 + 0x1C0C0303, // 0007 EQ R3 R1 K3 + 0x780E0004, // 0008 JMPF R3 #000E + 0x8C0C0111, // 0009 GETMET R3 R0 K17 + 0x54160011, // 000A LDINT R5 18 + 0x541A0005, // 000B LDINT R6 6 + 0x5C1C0400, // 000C MOVE R7 R2 + 0x7C0C0800, // 000D CALL R3 4 + 0x540E0003, // 000E LDINT R3 4 + 0x1C0C0203, // 000F EQ R3 R1 R3 + 0x780E0004, // 0010 JMPF R3 #0016 + 0x8C0C0111, // 0011 GETMET R3 R0 K17 + 0x54160011, // 0012 LDINT R5 18 + 0x58180003, // 0013 LDCONST R6 K3 + 0x5C1C0400, // 0014 MOVE R7 R2 + 0x7C0C0800, // 0015 CALL R3 4 + 0x80000000, // 0016 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: set_limiting_off ********************************************************************/ @@ -799,9 +803,9 @@ be_local_closure(class_AXP202_get_input_power_status, /* name */ &be_const_str_get_input_power_status, &be_const_str_solidified, ( &(const binstruction[ 7]) { /* code */ - 0x88040110, // 0000 GETMBR R1 R0 K16 - 0x8C040311, // 0001 GETMET R1 R1 K17 - 0x880C0112, // 0002 GETMBR R3 R0 K18 + 0x8804010C, // 0000 GETMBR R1 R0 K12 + 0x8C04030D, // 0001 GETMET R1 R1 K13 + 0x880C010E, // 0002 GETMBR R3 R0 K14 0x58100000, // 0003 LDCONST R4 K0 0x58140001, // 0004 LDCONST R5 K1 0x7C040800, // 0005 CALL R1 4 @@ -826,20 +830,20 @@ be_local_class(AXP202, { be_const_key(get_aps_voltage, -1), be_const_closure(class_AXP202_get_aps_voltage_closure) }, { be_const_key(get_bat_current, -1), be_const_closure(class_AXP202_get_bat_current_closure) }, { be_const_key(get_bat_power, 2), be_const_closure(class_AXP202_get_bat_power_closure) }, - { be_const_key(init, -1), be_const_closure(class_AXP202_init_closure) }, + { be_const_key(get_battery_charging_status, -1), be_const_closure(class_AXP202_get_battery_charging_status_closure) }, { be_const_key(get_vbus_voltage, -1), be_const_closure(class_AXP202_get_vbus_voltage_closure) }, - { be_const_key(set_ldo_voltage, 14), be_const_closure(class_AXP202_set_ldo_voltage_closure) }, + { be_const_key(set_ldo_voltage, -1), be_const_closure(class_AXP202_set_ldo_voltage_closure) }, { be_const_key(battery_present, -1), be_const_closure(class_AXP202_battery_present_closure) }, { be_const_key(set_chg_current_ma, -1), be_const_closure(class_AXP202_set_chg_current_ma_closure) }, { be_const_key(set_dcdc_enable, -1), be_const_closure(class_AXP202_set_dcdc_enable_closure) }, - { be_const_key(set_chg_led_mode, 7), be_const_closure(class_AXP202_set_chg_led_mode_closure) }, - { be_const_key(set_ldo_enable, 5), be_const_closure(class_AXP202_set_ldo_enable_closure) }, + { be_const_key(set_chg_led_mode, 16), be_const_closure(class_AXP202_set_chg_led_mode_closure) }, + { be_const_key(init, 14), be_const_closure(class_AXP202_init_closure) }, { be_const_key(set_exten, -1), be_const_closure(class_AXP202_set_exten_closure) }, - { be_const_key(get_temp, -1), be_const_closure(class_AXP202_get_temp_closure) }, - { be_const_key(get_bat_voltage, 16), be_const_closure(class_AXP202_get_bat_voltage_closure) }, + { be_const_key(set_ldo_enable, -1), be_const_closure(class_AXP202_set_ldo_enable_closure) }, { be_const_key(get_bat_charge_current, 17), be_const_closure(class_AXP202_get_bat_charge_current_closure) }, - { be_const_key(set_dc_voltage, 18), be_const_closure(class_AXP202_set_dc_voltage_closure) }, - { be_const_key(get_battery_chargin_status, -1), be_const_closure(class_AXP202_get_battery_chargin_status_closure) }, + { be_const_key(get_temp, 7), be_const_closure(class_AXP202_get_temp_closure) }, + { be_const_key(get_bat_voltage, 18), be_const_closure(class_AXP202_get_bat_voltage_closure) }, + { be_const_key(set_dc_voltage, -1), be_const_closure(class_AXP202_set_dc_voltage_closure) }, { be_const_key(set_limiting_off, -1), be_const_closure(class_AXP202_set_limiting_off_closure) }, { be_const_key(get_input_power_status, -1), be_const_closure(class_AXP202_get_input_power_status_closure) }, })), diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_AXP2102.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_AXP2102.h new file mode 100644 index 000000000..834cee80d --- /dev/null +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_AXP2102.h @@ -0,0 +1,878 @@ +/* Solidification of AXP2102.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" +// compact class 'AXP2102' ktab size: 18, total: 58 (saved 320 bytes) +static const bvalue be_ktab_class_AXP2102[18] = { + /* K0 */ be_nested_str(read8), + /* K1 */ be_const_int(1), + /* K2 */ be_nested_str(wire), + /* K3 */ be_nested_str(read), + /* K4 */ be_nested_str(addr), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str(init), + /* K7 */ be_nested_str(AXP2102), + /* K8 */ be_nested_str(write8), + /* K9 */ be_nested_str(read16), + /* K10 */ be_const_int(3), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str(_charge), + /* K13 */ be_nested_str(_pre_charge), + /* K14 */ be_nested_str(read14), + /* K15 */ be_const_real_hex(0x447A0000), + /* K16 */ be_nested_str(_charge_voltage), + /* K17 */ be_nested_str(get_vbus_good), +}; + + +extern const bclass be_class_AXP2102; + +/******************************************************************** +** Solidified function: is_charging +********************************************************************/ +be_local_closure(class_AXP2102_is_charging, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_is_charging, + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x580C0001, // 0001 LDCONST R3 K1 + 0x7C040400, // 0002 CALL R1 2 + 0x540A005F, // 0003 LDINT R2 96 + 0x2C040202, // 0004 AND R1 R1 R2 + 0x540A001F, // 0005 LDINT R2 32 + 0x1C040202, // 0006 EQ R1 R1 R2 + 0x80040200, // 0007 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: battery_present +********************************************************************/ +be_local_closure(class_AXP2102_battery_present, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_battery_present, + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x60040017, // 0000 GETGBL R1 G23 + 0x88080102, // 0001 GETMBR R2 R0 K2 + 0x8C080503, // 0002 GETMET R2 R2 K3 + 0x88100104, // 0003 GETMBR R4 R0 K4 + 0x58140005, // 0004 LDCONST R5 K5 + 0x58180001, // 0005 LDCONST R6 K1 + 0x7C080800, // 0006 CALL R2 4 + 0x540E0007, // 0007 LDINT R3 8 + 0x2C080403, // 0008 AND R2 R2 R3 + 0x7C040200, // 0009 CALL R1 1 + 0x80040200, // 000A RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(class_AXP2102_init, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_init, + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0000, // 0002 JMPF R2 #0004 + 0x54060033, // 0003 LDINT R1 52 + 0x60080003, // 0004 GETGBL R2 G3 + 0x5C0C0000, // 0005 MOVE R3 R0 + 0x7C080200, // 0006 CALL R2 1 + 0x8C080506, // 0007 GETMET R2 R2 K6 + 0x58100007, // 0008 LDCONST R4 K7 + 0x5C140200, // 0009 MOVE R5 R1 + 0x7C080600, // 000A CALL R2 3 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_dldo_voltage +********************************************************************/ +be_local_closure(class_AXP2102_set_dldo_voltage, /* name */ + be_nested_proto( + 13, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_set_dldo_voltage, + &be_const_str_solidified, + ( &(const binstruction[58]) { /* code */ + 0x140C0305, // 0000 LT R3 R1 K5 + 0x740E0001, // 0001 JMPT R3 #0004 + 0x240C0301, // 0002 GT R3 R1 K1 + 0x780E0000, // 0003 JMPF R3 #0005 + 0x80000600, // 0004 RET 0 + 0x540E0098, // 0005 LDINT R3 153 + 0x000C0203, // 0006 ADD R3 R1 R3 + 0x541201F3, // 0007 LDINT R4 500 + 0x04080404, // 0008 SUB R2 R2 R4 + 0x14100505, // 0009 LT R4 R2 K5 + 0x78120001, // 000A JMPF R4 #000D + 0x58100005, // 000B LDCONST R4 K5 + 0x70020004, // 000C JMP #0012 + 0x78060001, // 000D JMPF R1 #0010 + 0x54120031, // 000E LDINT R4 50 + 0x70020000, // 000F JMP #0011 + 0x54120063, // 0010 LDINT R4 100 + 0x0C100404, // 0011 DIV R4 R2 R4 + 0x78060001, // 0012 JMPF R1 #0015 + 0x54160012, // 0013 LDINT R5 19 + 0x70020000, // 0014 JMP #0016 + 0x5416001B, // 0015 LDINT R5 28 + 0x24140805, // 0016 GT R5 R4 R5 + 0x78160004, // 0017 JMPF R5 #001D + 0x78060001, // 0018 JMPF R1 #001B + 0x54160012, // 0019 LDINT R5 19 + 0x70020000, // 001A JMP #001C + 0x5416001B, // 001B LDINT R5 28 + 0x5C100A00, // 001C MOVE R4 R5 + 0x8C140108, // 001D GETMET R5 R0 K8 + 0x5C1C0600, // 001E MOVE R7 R3 + 0x5C200800, // 001F MOVE R8 R4 + 0x7C140600, // 0020 CALL R5 3 + 0x5416008F, // 0021 LDINT R5 144 + 0x00140A01, // 0022 ADD R5 R5 R1 + 0x78060001, // 0023 JMPF R1 #0026 + 0x58180001, // 0024 LDCONST R6 K1 + 0x70020000, // 0025 JMP #0027 + 0x541A007F, // 0026 LDINT R6 128 + 0x141C0505, // 0027 LT R7 R2 K5 + 0x781E0008, // 0028 JMPF R7 #0032 + 0x8C1C0108, // 0029 GETMET R7 R0 K8 + 0x5426008F, // 002A LDINT R9 144 + 0x8C280100, // 002B GETMET R10 R0 K0 + 0x5C300A00, // 002C MOVE R12 R5 + 0x7C280400, // 002D CALL R10 2 + 0x482C0C00, // 002E FLIP R11 R6 + 0x2C28140B, // 002F AND R10 R10 R11 + 0x7C1C0600, // 0030 CALL R7 3 + 0x70020006, // 0031 JMP #0039 + 0x8C1C0108, // 0032 GETMET R7 R0 K8 + 0x5426008F, // 0033 LDINT R9 144 + 0x8C280100, // 0034 GETMET R10 R0 K0 + 0x5C300A00, // 0035 MOVE R12 R5 + 0x7C280400, // 0036 CALL R10 2 + 0x30281406, // 0037 OR R10 R10 R6 + 0x7C1C0600, // 0038 CALL R7 3 + 0x80000000, // 0039 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_temp +********************************************************************/ +be_local_closure(class_AXP2102_get_temp, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_get_temp, + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x54060015, // 0000 LDINT R1 22 + 0x540A1C69, // 0001 LDINT R2 7274 + 0x8C0C0109, // 0002 GETMET R3 R0 K9 + 0x5416003B, // 0003 LDINT R5 60 + 0x7C0C0400, // 0004 CALL R3 2 + 0x04080403, // 0005 SUB R2 R2 R3 + 0x540E0013, // 0006 LDINT R3 20 + 0x0C080403, // 0007 DIV R2 R2 R3 + 0x00040202, // 0008 ADD R1 R1 R2 + 0x80040200, // 0009 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_ldo_enable +********************************************************************/ +be_local_closure(class_AXP2102_get_ldo_enable, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_get_ldo_enable, + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x50080000, // 0000 LDBOOL R2 0 0 + 0x540E0004, // 0001 LDINT R3 5 + 0x180C0203, // 0002 LE R3 R1 R3 + 0x780E0007, // 0003 JMPF R3 #000C + 0x380E0201, // 0004 SHL R3 K1 R1 + 0x60100017, // 0005 GETGBL R4 G23 + 0x8C140100, // 0006 GETMET R5 R0 K0 + 0x541E008F, // 0007 LDINT R7 144 + 0x7C140400, // 0008 CALL R5 2 + 0x2C140A03, // 0009 AND R5 R5 R3 + 0x7C100200, // 000A CALL R4 1 + 0x5C080800, // 000B MOVE R2 R4 + 0x80040400, // 000C RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_battery_charging_status +********************************************************************/ +be_local_closure(class_AXP2102_get_battery_charging_status, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_get_battery_charging_status, + &be_const_str_solidified, + ( &(const binstruction[16]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x580C0001, // 0001 LDCONST R3 K1 + 0x7C040400, // 0002 CALL R1 2 + 0x540A0004, // 0003 LDINT R2 5 + 0x3C040202, // 0004 SHR R1 R1 R2 + 0x2C04030A, // 0005 AND R1 R1 K10 + 0x1C080301, // 0006 EQ R2 R1 K1 + 0x780A0001, // 0007 JMPF R2 #000A + 0x58080001, // 0008 LDCONST R2 K1 + 0x70020004, // 0009 JMP #000F + 0x1C08030B, // 000A EQ R2 R1 K11 + 0x780A0001, // 000B JMPF R2 #000E + 0x5409FFFE, // 000C LDINT R2 -1 + 0x70020000, // 000D JMP #000F + 0x58080005, // 000E LDCONST R2 K5 + 0x80040400, // 000F RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_ldo_voltage +********************************************************************/ +be_local_closure(class_AXP2102_set_ldo_voltage, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_set_ldo_voltage, + &be_const_str_solidified, + ( &(const binstruction[44]) { /* code */ + 0x140C0305, // 0000 LT R3 R1 K5 + 0x740E0002, // 0001 JMPT R3 #0005 + 0x540E0004, // 0002 LDINT R3 5 + 0x240C0203, // 0003 GT R3 R1 R3 + 0x780E0000, // 0004 JMPF R3 #0006 + 0x80000600, // 0005 RET 0 + 0x540E0091, // 0006 LDINT R3 146 + 0x000C0203, // 0007 ADD R3 R1 R3 + 0x541201F3, // 0008 LDINT R4 500 + 0x04080404, // 0009 SUB R2 R2 R4 + 0x14100505, // 000A LT R4 R2 K5 + 0x78120001, // 000B JMPF R4 #000E + 0x58100005, // 000C LDCONST R4 K5 + 0x70020001, // 000D JMP #0010 + 0x54120063, // 000E LDINT R4 100 + 0x0C100404, // 000F DIV R4 R2 R4 + 0x5416001D, // 0010 LDINT R5 30 + 0x24140805, // 0011 GT R5 R4 R5 + 0x78160000, // 0012 JMPF R5 #0014 + 0x5412001D, // 0013 LDINT R4 30 + 0x8C140108, // 0014 GETMET R5 R0 K8 + 0x5C1C0600, // 0015 MOVE R7 R3 + 0x5C200800, // 0016 MOVE R8 R4 + 0x7C140600, // 0017 CALL R5 3 + 0x38160201, // 0018 SHL R5 K1 R1 + 0x14180505, // 0019 LT R6 R2 K5 + 0x781A0008, // 001A JMPF R6 #0024 + 0x8C180108, // 001B GETMET R6 R0 K8 + 0x5422008F, // 001C LDINT R8 144 + 0x8C240100, // 001D GETMET R9 R0 K0 + 0x542E008F, // 001E LDINT R11 144 + 0x7C240400, // 001F CALL R9 2 + 0x48280A00, // 0020 FLIP R10 R5 + 0x2C24120A, // 0021 AND R9 R9 R10 + 0x7C180600, // 0022 CALL R6 3 + 0x70020006, // 0023 JMP #002B + 0x8C180108, // 0024 GETMET R6 R0 K8 + 0x5422008F, // 0025 LDINT R8 144 + 0x8C240100, // 0026 GETMET R9 R0 K0 + 0x542E008F, // 0027 LDINT R11 144 + 0x7C240400, // 0028 CALL R9 2 + 0x30241205, // 0029 OR R9 R9 R5 + 0x7C180600, // 002A CALL R6 3 + 0x80000000, // 002B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_bat_current +********************************************************************/ +be_local_closure(class_AXP2102_get_bat_current, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_get_bat_current, + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80060A00, // 0000 RET 1 K5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_charge_current +********************************************************************/ +be_local_closure(class_AXP2102_set_charge_current, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_set_charge_current, + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x14080305, // 0000 LT R2 R1 K5 + 0x780A0000, // 0001 JMPF R2 #0003 + 0x58040005, // 0002 LDCONST R1 K5 + 0x540A00C7, // 0003 LDINT R2 200 + 0x24080202, // 0004 GT R2 R1 R2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x540600C7, // 0006 LDINT R1 200 + 0x58080005, // 0007 LDCONST R2 K5 + 0x880C010C, // 0008 GETMBR R3 R0 K12 + 0x940C0602, // 0009 GETIDX R3 R3 R2 + 0x180C0601, // 000A LE R3 R3 R1 + 0x780E0001, // 000B JMPF R3 #000E + 0x00080501, // 000C ADD R2 R2 K1 + 0x7001FFF9, // 000D JMP #0008 + 0x540E0003, // 000E LDINT R3 4 + 0x00080403, // 000F ADD R2 R2 R3 + 0x8C0C0108, // 0010 GETMET R3 R0 K8 + 0x54160061, // 0011 LDINT R5 98 + 0x5C180400, // 0012 MOVE R6 R2 + 0x7C0C0600, // 0013 CALL R3 3 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_aps_voltage +********************************************************************/ +be_local_closure(class_AXP2102_get_aps_voltage, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_get_aps_voltage, + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80060A00, // 0000 RET 1 K5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pre_charge_current +********************************************************************/ +be_local_closure(class_AXP2102_set_pre_charge_current, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_set_pre_charge_current, + &be_const_str_solidified, + ( &(const binstruction[19]) { /* code */ + 0x14080305, // 0000 LT R2 R1 K5 + 0x780A0000, // 0001 JMPF R2 #0003 + 0x58040005, // 0002 LDCONST R1 K5 + 0x540A00C7, // 0003 LDINT R2 200 + 0x24080202, // 0004 GT R2 R1 R2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x540600C7, // 0006 LDINT R1 200 + 0x58080005, // 0007 LDCONST R2 K5 + 0x880C010D, // 0008 GETMBR R3 R0 K13 + 0x940C0602, // 0009 GETIDX R3 R3 R2 + 0x180C0601, // 000A LE R3 R3 R1 + 0x780E0001, // 000B JMPF R3 #000E + 0x00080501, // 000C ADD R2 R2 K1 + 0x7001FFF9, // 000D JMP #0008 + 0x8C0C0108, // 000E GETMET R3 R0 K8 + 0x54160060, // 000F LDINT R5 97 + 0x5C180400, // 0010 MOVE R6 R2 + 0x7C0C0600, // 0011 CALL R3 3 + 0x80000000, // 0012 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_bat_power +********************************************************************/ +be_local_closure(class_AXP2102_get_bat_power, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_get_bat_power, + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80060A00, // 0000 RET 1 K5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_battery_charge +********************************************************************/ +be_local_closure(class_AXP2102_set_battery_charge, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_set_battery_charge, + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x8C080108, // 0000 GETMET R2 R0 K8 + 0x54120017, // 0001 LDINT R4 24 + 0x8C140100, // 0002 GETMET R5 R0 K0 + 0x541E0017, // 0003 LDINT R7 24 + 0x7C140400, // 0004 CALL R5 2 + 0x541A00FC, // 0005 LDINT R6 253 + 0x2C140A06, // 0006 AND R5 R5 R6 + 0x78060001, // 0007 JMPF R1 #000A + 0x58180001, // 0008 LDCONST R6 K1 + 0x70020000, // 0009 JMP #000B + 0x58180005, // 000A LDCONST R6 K5 + 0x38180D01, // 000B SHL R6 R6 K1 + 0x30140A06, // 000C OR R5 R5 R6 + 0x7C080600, // 000D CALL R2 3 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_bat_charge_current +********************************************************************/ +be_local_closure(class_AXP2102_get_bat_charge_current, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_get_bat_charge_current, + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80060A00, // 0000 RET 1 K5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_vbus_good +********************************************************************/ +be_local_closure(class_AXP2102_get_vbus_good, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_get_vbus_good, + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x60040017, // 0000 GETGBL R1 G23 + 0x88080102, // 0001 GETMBR R2 R0 K2 + 0x8C080503, // 0002 GETMET R2 R2 K3 + 0x88100104, // 0003 GETMBR R4 R0 K4 + 0x58140005, // 0004 LDCONST R5 K5 + 0x58180001, // 0005 LDCONST R6 K1 + 0x7C080800, // 0006 CALL R2 4 + 0x540E001F, // 0007 LDINT R3 32 + 0x2C080403, // 0008 AND R2 R2 R3 + 0x7C040200, // 0009 CALL R1 1 + 0x80040200, // 000A RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_bat_voltage +********************************************************************/ +be_local_closure(class_AXP2102_get_bat_voltage, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_get_bat_voltage, + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x8C04010E, // 0000 GETMET R1 R0 K14 + 0x540E0033, // 0001 LDINT R3 52 + 0x7C040400, // 0002 CALL R1 2 + 0x0C04030F, // 0003 DIV R1 R1 K15 + 0x80040200, // 0004 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_battery_level +********************************************************************/ +be_local_closure(class_AXP2102_get_battery_level, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_get_battery_level, + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x540E00A3, // 0001 LDINT R3 164 + 0x7C040400, // 0002 CALL R1 2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_charge_voltage +********************************************************************/ +be_local_closure(class_AXP2102_set_charge_voltage, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_set_charge_voltage, + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x14080305, // 0000 LT R2 R1 K5 + 0x780A0000, // 0001 JMPF R2 #0003 + 0x58040005, // 0002 LDCONST R1 K5 + 0x540A01CB, // 0003 LDINT R2 460 + 0x24080202, // 0004 GT R2 R1 R2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x540601CB, // 0006 LDINT R1 460 + 0x58080005, // 0007 LDCONST R2 K5 + 0x880C0110, // 0008 GETMBR R3 R0 K16 + 0x940C0602, // 0009 GETIDX R3 R3 R2 + 0x180C0601, // 000A LE R3 R3 R1 + 0x780E0001, // 000B JMPF R3 #000E + 0x00080501, // 000C ADD R2 R2 K1 + 0x7001FFF9, // 000D JMP #0008 + 0x00080501, // 000E ADD R2 R2 K1 + 0x540E0005, // 000F LDINT R3 6 + 0x280C0403, // 0010 GE R3 R2 R3 + 0x780E0000, // 0011 JMPF R3 #0013 + 0x58080005, // 0012 LDCONST R2 K5 + 0x8C0C0108, // 0013 GETMET R3 R0 K8 + 0x54160063, // 0014 LDINT R5 100 + 0x5C180400, // 0015 MOVE R6 R2 + 0x7C0C0600, // 0016 CALL R3 3 + 0x80000000, // 0017 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_vbus_current +********************************************************************/ +be_local_closure(class_AXP2102_get_vbus_current, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_get_vbus_current, + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80060A00, // 0000 RET 1 K5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_vbus_voltage +********************************************************************/ +be_local_closure(class_AXP2102_get_vbus_voltage, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_AXP2102, /* shared constants */ + &be_const_str_get_vbus_voltage, + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x8C040111, // 0000 GETMET R1 R0 K17 + 0x7C040200, // 0001 CALL R1 1 + 0x74060000, // 0002 JMPT R1 #0004 + 0x80060A00, // 0003 RET 1 K5 + 0x8C04010E, // 0004 GETMET R1 R0 K14 + 0x540E0037, // 0005 LDINT R3 56 + 0x7C040400, // 0006 CALL R1 2 + 0x540A3FF6, // 0007 LDINT R2 16375 + 0x24080202, // 0008 GT R2 R1 R2 + 0x780A0000, // 0009 JMPF R2 #000B + 0x80060A00, // 000A RET 1 K5 + 0x0C08030F, // 000B DIV R2 R1 K15 + 0x80040400, // 000C RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: AXP2102 +********************************************************************/ +extern const bclass be_class_I2C_Driver; +be_local_class(AXP2102, + 0, + &be_class_I2C_Driver, + be_nested_map(24, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key(get_vbus_voltage, -1), be_const_closure(class_AXP2102_get_vbus_voltage_closure) }, + { be_const_key(is_charging, -1), be_const_closure(class_AXP2102_is_charging_closure) }, + { be_const_key(battery_present, -1), be_const_closure(class_AXP2102_battery_present_closure) }, + { be_const_key(init, -1), be_const_closure(class_AXP2102_init_closure) }, + { be_const_key(set_dldo_voltage, -1), be_const_closure(class_AXP2102_set_dldo_voltage_closure) }, + { be_const_key(_charge, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(13, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(25), + be_const_int(30), + be_const_int(35), + be_const_int(40), + be_const_int(60), + be_const_int(80), + be_const_int(100), + be_const_int(120), + be_const_int(140), + be_const_int(160), + be_const_int(180), + be_const_int(200), + be_const_int(255), + })) ) } )) }, + { be_const_key(set_charge_voltage, -1), be_const_closure(class_AXP2102_set_charge_voltage_closure) }, + { be_const_key(get_battery_level, 23), be_const_closure(class_AXP2102_get_battery_level_closure) }, + { be_const_key(set_ldo_voltage, -1), be_const_closure(class_AXP2102_set_ldo_voltage_closure) }, + { be_const_key(get_bat_current, 0), be_const_closure(class_AXP2102_get_bat_current_closure) }, + { be_const_key(set_charge_current, -1), be_const_closure(class_AXP2102_set_charge_current_closure) }, + { be_const_key(_charge_voltage, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(6, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(410), + be_const_int(420), + be_const_int(435), + be_const_int(440), + be_const_int(460), + be_const_int(655), + })) ) } )) }, + { be_const_key(set_pre_charge_current, 16), be_const_closure(class_AXP2102_set_pre_charge_current_closure) }, + { be_const_key(get_bat_power, -1), be_const_closure(class_AXP2102_get_bat_power_closure) }, + { be_const_key(get_temp, 5), be_const_closure(class_AXP2102_get_temp_closure) }, + { be_const_key(get_bat_voltage, 17), be_const_closure(class_AXP2102_get_bat_voltage_closure) }, + { be_const_key(get_vbus_good, -1), be_const_closure(class_AXP2102_get_vbus_good_closure) }, + { be_const_key(get_bat_charge_current, -1), be_const_closure(class_AXP2102_get_bat_charge_current_closure) }, + { be_const_key(set_battery_charge, 15), be_const_closure(class_AXP2102_set_battery_charge_closure) }, + { be_const_key(get_aps_voltage, 11), be_const_closure(class_AXP2102_get_aps_voltage_closure) }, + { be_const_key(_pre_charge, 7), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(10, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(25), + be_const_int(50), + be_const_int(75), + be_const_int(100), + be_const_int(125), + be_const_int(150), + be_const_int(175), + be_const_int(200), + be_const_int(255), + })) ) } )) }, + { be_const_key(get_ldo_enable, 6), be_const_closure(class_AXP2102_get_ldo_enable_closure) }, + { be_const_key(get_vbus_current, -1), be_const_closure(class_AXP2102_get_vbus_current_closure) }, + { be_const_key(get_battery_charging_status, -1), be_const_closure(class_AXP2102_get_battery_charging_status_closure) }, + })), + (bstring*) &be_const_str_AXP2102 +); +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_leds.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_leds.h index 2e476a976..2d94561e7 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_leds.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_leds.h @@ -468,228 +468,45 @@ be_local_class(Leds_segment, })), (bstring*) &be_const_str_Leds_segment ); -// compact class 'Leds_matrix' ktab size: 24, total: 62 (saved 304 bytes) -static const bvalue be_ktab_class_Leds_matrix[24] = { +// compact class 'Leds_matrix' ktab size: 28, total: 72 (saved 352 bytes) +static const bvalue be_ktab_class_Leds_matrix[28] = { /* K0 */ be_nested_str(strip), - /* K1 */ be_nested_str(bri), - /* K2 */ be_nested_str(call_native), - /* K3 */ be_nested_str(to_gamma), - /* K4 */ be_nested_str(offset), - /* K5 */ be_nested_str(w), - /* K6 */ be_nested_str(h), - /* K7 */ be_const_int(0), - /* K8 */ be_nested_str(leds), - /* K9 */ be_nested_str(show), - /* K10 */ be_nested_str(pix_buffer), - /* K11 */ be_nested_str(pixels_buffer), - /* K12 */ be_nested_str(pix_size), - /* K13 */ be_nested_str(alternate), - /* K14 */ be_nested_str(pixel_size), - /* K15 */ be_nested_str(set_pixel_color), - /* K16 */ be_nested_str(dirty), - /* K17 */ be_const_int(1), - /* K18 */ be_nested_str(is_dirty), - /* K19 */ be_nested_str(can_show), - /* K20 */ be_nested_str(setbytes), - /* K21 */ be_nested_str(get_pixel_color), - /* K22 */ be_nested_str(offseta), + /* K1 */ be_nested_str(is_dirty), + /* K2 */ be_nested_str(dirty), + /* K3 */ be_nested_str(bri), + /* K4 */ be_nested_str(alternate), + /* K5 */ be_const_int(1), + /* K6 */ be_nested_str(set_pixel_color), + /* K7 */ be_nested_str(w), + /* K8 */ be_nested_str(h), + /* K9 */ be_nested_str(offset), + /* K10 */ be_nested_str(can_show), + /* K11 */ be_nested_str(pix_size), + /* K12 */ be_nested_str(pix_buffer), + /* K13 */ be_nested_str(setbytes), + /* K14 */ be_const_int(0), + /* K15 */ be_nested_str(leds), + /* K16 */ be_nested_str(show), + /* K17 */ be_nested_str(pixels_buffer), + /* K18 */ be_nested_str(get_pixel_color), + /* K19 */ be_nested_str(offseta), + /* K20 */ be_nested_str(call_native), + /* K21 */ be_nested_str(to_gamma), + /* K22 */ be_nested_str(pixel_size), /* K23 */ be_nested_str(clear_to), + /* K24 */ be_const_int(3), + /* K25 */ be_const_int(2), + /* K26 */ be_nested_str(reverse), + /* K27 */ be_const_int(2147483647), }; extern const bclass be_class_Leds_matrix; /******************************************************************** -** Solidified function: clear_to +** Solidified function: is_dirty ********************************************************************/ -be_local_closure(class_Leds_matrix_clear_to, /* name */ - be_nested_proto( - 10, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Leds_matrix, /* shared constants */ - &be_const_str_clear_to, - &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ - 0x4C0C0000, // 0000 LDNIL R3 - 0x1C0C0403, // 0001 EQ R3 R2 R3 - 0x780E0001, // 0002 JMPF R3 #0005 - 0x880C0100, // 0003 GETMBR R3 R0 K0 - 0x88080701, // 0004 GETMBR R2 R3 K1 - 0x880C0100, // 0005 GETMBR R3 R0 K0 - 0x8C0C0702, // 0006 GETMET R3 R3 K2 - 0x54160008, // 0007 LDINT R5 9 - 0x88180100, // 0008 GETMBR R6 R0 K0 - 0x8C180D03, // 0009 GETMET R6 R6 K3 - 0x5C200200, // 000A MOVE R8 R1 - 0x5C240400, // 000B MOVE R9 R2 - 0x7C180600, // 000C CALL R6 3 - 0x881C0104, // 000D GETMBR R7 R0 K4 - 0x88200105, // 000E GETMBR R8 R0 K5 - 0x88240106, // 000F GETMBR R9 R0 K6 - 0x08201009, // 0010 MUL R8 R8 R9 - 0x7C0C0A00, // 0011 CALL R3 5 - 0x80000000, // 0012 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: show -********************************************************************/ -be_local_closure(class_Leds_matrix_show, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Leds_matrix, /* shared constants */ - &be_const_str_show, - &be_const_str_solidified, - ( &(const binstruction[23]) { /* code */ - 0x60080017, // 0000 GETGBL R2 G23 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x740A0009, // 0003 JMPT R2 #000E - 0x88080104, // 0004 GETMBR R2 R0 K4 - 0x1C080507, // 0005 EQ R2 R2 K7 - 0x780A000E, // 0006 JMPF R2 #0016 - 0x88080105, // 0007 GETMBR R2 R0 K5 - 0x880C0106, // 0008 GETMBR R3 R0 K6 - 0x08080403, // 0009 MUL R2 R2 R3 - 0x880C0100, // 000A GETMBR R3 R0 K0 - 0x880C0708, // 000B GETMBR R3 R3 K8 - 0x1C080403, // 000C EQ R2 R2 R3 - 0x780A0007, // 000D JMPF R2 #0016 - 0x88080100, // 000E GETMBR R2 R0 K0 - 0x8C080509, // 000F GETMET R2 R2 K9 - 0x7C080200, // 0010 CALL R2 1 - 0x88080100, // 0011 GETMBR R2 R0 K0 - 0x8C08050B, // 0012 GETMET R2 R2 K11 - 0x8810010A, // 0013 GETMBR R4 R0 K10 - 0x7C080400, // 0014 CALL R2 2 - 0x90021402, // 0015 SETMBR R0 K10 R2 - 0x80000000, // 0016 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: pixel_size -********************************************************************/ -be_local_closure(class_Leds_matrix_pixel_size, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Leds_matrix, /* shared constants */ - &be_const_str_pixel_size, - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x8804010C, // 0000 GETMBR R1 R0 K12 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(class_Leds_matrix_init, /* name */ - be_nested_proto( - 7, /* nstack */ - 5, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Leds_matrix, /* shared constants */ - &be_const_str_init, - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x90020804, // 0001 SETMBR R0 K4 R4 - 0x90020C03, // 0002 SETMBR R0 K6 R3 - 0x90020A02, // 0003 SETMBR R0 K5 R2 - 0x50140000, // 0004 LDBOOL R5 0 0 - 0x90021A05, // 0005 SETMBR R0 K13 R5 - 0x88140100, // 0006 GETMBR R5 R0 K0 - 0x8C140B0B, // 0007 GETMET R5 R5 K11 - 0x7C140200, // 0008 CALL R5 1 - 0x90021405, // 0009 SETMBR R0 K10 R5 - 0x88140100, // 000A GETMBR R5 R0 K0 - 0x8C140B0E, // 000B GETMET R5 R5 K14 - 0x7C140200, // 000C CALL R5 1 - 0x90021805, // 000D SETMBR R0 K12 R5 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pixel_color -********************************************************************/ -be_local_closure(class_Leds_matrix_set_pixel_color, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Leds_matrix, /* shared constants */ - &be_const_str_set_pixel_color, - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x1C100604, // 0001 EQ R4 R3 R4 - 0x78120001, // 0002 JMPF R4 #0005 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x880C0901, // 0004 GETMBR R3 R4 K1 - 0x88100100, // 0005 GETMBR R4 R0 K0 - 0x8C10090F, // 0006 GETMET R4 R4 K15 - 0x88180104, // 0007 GETMBR R6 R0 K4 - 0x00180206, // 0008 ADD R6 R1 R6 - 0x5C1C0400, // 0009 MOVE R7 R2 - 0x5C200600, // 000A MOVE R8 R3 - 0x7C100800, // 000B CALL R4 4 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: pixels_buffer -********************************************************************/ -be_local_closure(class_Leds_matrix_pixels_buffer, /* name */ +be_local_closure(class_Leds_matrix_is_dirty, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -700,11 +517,11 @@ be_local_closure(class_Leds_matrix_pixels_buffer, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_Leds_matrix, /* shared constants */ - &be_const_str_pixels_buffer, + &be_const_str_is_dirty, &be_const_str_solidified, ( &(const binstruction[ 4]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C04030B, // 0001 GETMET R1 R1 K11 + 0x8C040301, // 0001 GETMET R1 R1 K1 0x7C040200, // 0002 CALL R1 1 0x80040200, // 0003 RET 1 R1 }) @@ -731,7 +548,7 @@ be_local_closure(class_Leds_matrix_dirty, /* name */ &be_const_str_solidified, ( &(const binstruction[ 4]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040310, // 0001 GETMET R1 R1 K16 + 0x8C040302, // 0001 GETMET R1 R1 K2 0x7C040200, // 0002 CALL R1 1 0x80000000, // 0003 RET 0 }) @@ -761,31 +578,31 @@ be_local_closure(class_Leds_matrix_set_matrix_pixel_color, /* name */ 0x1C140805, // 0001 EQ R5 R4 R5 0x78160001, // 0002 JMPF R5 #0005 0x88140100, // 0003 GETMBR R5 R0 K0 - 0x88100B01, // 0004 GETMBR R4 R5 K1 - 0x8814010D, // 0005 GETMBR R5 R0 K13 + 0x88100B03, // 0004 GETMBR R4 R5 K3 + 0x88140104, // 0005 GETMBR R5 R0 K4 0x7816000F, // 0006 JMPF R5 #0017 - 0x2C140511, // 0007 AND R5 R2 K17 + 0x2C140505, // 0007 AND R5 R2 K5 0x7816000D, // 0008 JMPF R5 #0017 0x88140100, // 0009 GETMBR R5 R0 K0 - 0x8C140B0F, // 000A GETMET R5 R5 K15 - 0x881C0105, // 000B GETMBR R7 R0 K5 + 0x8C140B06, // 000A GETMET R5 R5 K6 + 0x881C0107, // 000B GETMBR R7 R0 K7 0x081C0207, // 000C MUL R7 R1 R7 - 0x88200106, // 000D GETMBR R8 R0 K6 + 0x88200108, // 000D GETMBR R8 R0 K8 0x001C0E08, // 000E ADD R7 R7 R8 0x041C0E02, // 000F SUB R7 R7 R2 - 0x041C0F11, // 0010 SUB R7 R7 K17 - 0x88200104, // 0011 GETMBR R8 R0 K4 + 0x041C0F05, // 0010 SUB R7 R7 K5 + 0x88200109, // 0011 GETMBR R8 R0 K9 0x001C0E08, // 0012 ADD R7 R7 R8 0x5C200600, // 0013 MOVE R8 R3 0x5C240800, // 0014 MOVE R9 R4 0x7C140800, // 0015 CALL R5 4 0x70020009, // 0016 JMP #0021 0x88140100, // 0017 GETMBR R5 R0 K0 - 0x8C140B0F, // 0018 GETMET R5 R5 K15 - 0x881C0105, // 0019 GETMBR R7 R0 K5 + 0x8C140B06, // 0018 GETMET R5 R5 K6 + 0x881C0107, // 0019 GETMBR R7 R0 K7 0x081C0207, // 001A MUL R7 R1 R7 0x001C0E02, // 001B ADD R7 R7 R2 - 0x88200104, // 001C GETMBR R8 R0 K4 + 0x88200109, // 001C GETMBR R8 R0 K9 0x001C0E08, // 001D ADD R7 R7 R8 0x5C200600, // 001E MOVE R8 R3 0x5C240800, // 001F MOVE R9 R4 @@ -798,9 +615,9 @@ be_local_closure(class_Leds_matrix_set_matrix_pixel_color, /* name */ /******************************************************************** -** Solidified function: is_dirty +** Solidified function: can_show ********************************************************************/ -be_local_closure(class_Leds_matrix_is_dirty, /* name */ +be_local_closure(class_Leds_matrix_can_show, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -811,11 +628,11 @@ be_local_closure(class_Leds_matrix_is_dirty, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_Leds_matrix, /* shared constants */ - &be_const_str_is_dirty, + &be_const_str_can_show, &be_const_str_solidified, ( &(const binstruction[ 4]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040312, // 0001 GETMET R1 R1 K18 + 0x8C04030A, // 0001 GETMET R1 R1 K10 0x7C040200, // 0002 CALL R1 1 0x80040200, // 0003 RET 1 R1 }) @@ -825,11 +642,51 @@ be_local_closure(class_Leds_matrix_is_dirty, /* name */ /******************************************************************** -** Solidified function: set_alternate +** Solidified function: set_bytes ********************************************************************/ -be_local_closure(class_Leds_matrix_set_alternate, /* name */ +be_local_closure(class_Leds_matrix_set_bytes, /* name */ be_nested_proto( - 2, /* nstack */ + 13, /* nstack */ + 5, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Leds_matrix, /* shared constants */ + &be_const_str_set_bytes, + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0x88140108, // 0000 GETMBR R5 R0 K8 + 0x8818010B, // 0001 GETMBR R6 R0 K11 + 0x08140A06, // 0002 MUL R5 R5 R6 + 0x24180805, // 0003 GT R6 R4 R5 + 0x781A0000, // 0004 JMPF R6 #0006 + 0x5C100A00, // 0005 MOVE R4 R5 + 0x88180109, // 0006 GETMBR R6 R0 K9 + 0x00180C01, // 0007 ADD R6 R6 R1 + 0x08180C05, // 0008 MUL R6 R6 R5 + 0x881C010C, // 0009 GETMBR R7 R0 K12 + 0x8C1C0F0D, // 000A GETMET R7 R7 K13 + 0x5C240C00, // 000B MOVE R9 R6 + 0x5C280400, // 000C MOVE R10 R2 + 0x5C2C0600, // 000D MOVE R11 R3 + 0x5C300800, // 000E MOVE R12 R4 + 0x7C1C0A00, // 000F CALL R7 5 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: show +********************************************************************/ +be_local_closure(class_Leds_matrix_show, /* name */ + be_nested_proto( + 5, /* nstack */ 2, /* argc */ 10, /* varg */ 0, /* has upvals */ @@ -838,11 +695,178 @@ be_local_closure(class_Leds_matrix_set_alternate, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_Leds_matrix, /* shared constants */ - &be_const_str_set_alternate, + &be_const_str_show, + &be_const_str_solidified, + ( &(const binstruction[23]) { /* code */ + 0x60080017, // 0000 GETGBL R2 G23 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x740A0009, // 0003 JMPT R2 #000E + 0x88080109, // 0004 GETMBR R2 R0 K9 + 0x1C08050E, // 0005 EQ R2 R2 K14 + 0x780A000E, // 0006 JMPF R2 #0016 + 0x88080107, // 0007 GETMBR R2 R0 K7 + 0x880C0108, // 0008 GETMBR R3 R0 K8 + 0x08080403, // 0009 MUL R2 R2 R3 + 0x880C0100, // 000A GETMBR R3 R0 K0 + 0x880C070F, // 000B GETMBR R3 R3 K15 + 0x1C080403, // 000C EQ R2 R2 R3 + 0x780A0007, // 000D JMPF R2 #0016 + 0x88080100, // 000E GETMBR R2 R0 K0 + 0x8C080510, // 000F GETMET R2 R2 K16 + 0x7C080200, // 0010 CALL R2 1 + 0x88080100, // 0011 GETMBR R2 R0 K0 + 0x8C080511, // 0012 GETMET R2 R2 K17 + 0x8810010C, // 0013 GETMBR R4 R0 K12 + 0x7C080400, // 0014 CALL R2 2 + 0x90021802, // 0015 SETMBR R0 K12 R2 + 0x80000000, // 0016 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_alternate +********************************************************************/ +be_local_closure(class_Leds_matrix_get_alternate, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Leds_matrix, /* shared constants */ + &be_const_str_get_alternate, &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ - 0x90021A01, // 0000 SETMBR R0 K13 R1 - 0x80000000, // 0001 RET 0 + 0x88040104, // 0000 GETMBR R1 R0 K4 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: pixel_offset +********************************************************************/ +be_local_closure(class_Leds_matrix_pixel_offset, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Leds_matrix, /* shared constants */ + &be_const_str_pixel_offset, + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040109, // 0000 GETMBR R1 R0 K9 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pixel_color +********************************************************************/ +be_local_closure(class_Leds_matrix_get_pixel_color, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Leds_matrix, /* shared constants */ + &be_const_str_get_pixel_color, + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080512, // 0001 GETMET R2 R2 K18 + 0x88100113, // 0002 GETMBR R4 R0 K19 + 0x00100204, // 0003 ADD R4 R1 R4 + 0x7C080400, // 0004 CALL R2 2 + 0x80040400, // 0005 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: pixel_size +********************************************************************/ +be_local_closure(class_Leds_matrix_pixel_size, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Leds_matrix, /* shared constants */ + &be_const_str_pixel_size, + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x8804010B, // 0000 GETMBR R1 R0 K11 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: clear_to +********************************************************************/ +be_local_closure(class_Leds_matrix_clear_to, /* name */ + be_nested_proto( + 10, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Leds_matrix, /* shared constants */ + &be_const_str_clear_to, + &be_const_str_solidified, + ( &(const binstruction[19]) { /* code */ + 0x4C0C0000, // 0000 LDNIL R3 + 0x1C0C0403, // 0001 EQ R3 R2 R3 + 0x780E0001, // 0002 JMPF R3 #0005 + 0x880C0100, // 0003 GETMBR R3 R0 K0 + 0x88080703, // 0004 GETMBR R2 R3 K3 + 0x880C0100, // 0005 GETMBR R3 R0 K0 + 0x8C0C0714, // 0006 GETMET R3 R3 K20 + 0x54160008, // 0007 LDINT R5 9 + 0x88180100, // 0008 GETMBR R6 R0 K0 + 0x8C180D15, // 0009 GETMET R6 R6 K21 + 0x5C200200, // 000A MOVE R8 R1 + 0x5C240400, // 000B MOVE R9 R2 + 0x7C180600, // 000C CALL R6 3 + 0x881C0109, // 000D GETMBR R7 R0 K9 + 0x88200107, // 000E GETMBR R8 R0 K7 + 0x88240108, // 000F GETMBR R9 R0 K8 + 0x08201009, // 0010 MUL R8 R8 R9 + 0x7C0C0A00, // 0011 CALL R3 5 + 0x80000000, // 0012 RET 0 }) ) ); @@ -874,155 +898,11 @@ be_local_closure(class_Leds_matrix_begin, /* name */ /******************************************************************** -** Solidified function: pixel_count +** Solidified function: set_alternate ********************************************************************/ -be_local_closure(class_Leds_matrix_pixel_count, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Leds_matrix, /* shared constants */ - &be_const_str_pixel_count, - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040105, // 0000 GETMBR R1 R0 K5 - 0x88080106, // 0001 GETMBR R2 R0 K6 - 0x08040202, // 0002 MUL R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_alternate -********************************************************************/ -be_local_closure(class_Leds_matrix_get_alternate, /* name */ +be_local_closure(class_Leds_matrix_set_alternate, /* name */ be_nested_proto( 2, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Leds_matrix, /* shared constants */ - &be_const_str_get_alternate, - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x8804010D, // 0000 GETMBR R1 R0 K13 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: pixel_offset -********************************************************************/ -be_local_closure(class_Leds_matrix_pixel_offset, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Leds_matrix, /* shared constants */ - &be_const_str_pixel_offset, - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040104, // 0000 GETMBR R1 R0 K4 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: can_show -********************************************************************/ -be_local_closure(class_Leds_matrix_can_show, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Leds_matrix, /* shared constants */ - &be_const_str_can_show, - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040313, // 0001 GETMET R1 R1 K19 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_bytes -********************************************************************/ -be_local_closure(class_Leds_matrix_set_bytes, /* name */ - be_nested_proto( - 13, /* nstack */ - 5, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Leds_matrix, /* shared constants */ - &be_const_str_set_bytes, - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0x88140106, // 0000 GETMBR R5 R0 K6 - 0x8818010C, // 0001 GETMBR R6 R0 K12 - 0x08140A06, // 0002 MUL R5 R5 R6 - 0x24180805, // 0003 GT R6 R4 R5 - 0x781A0000, // 0004 JMPF R6 #0006 - 0x5C100A00, // 0005 MOVE R4 R5 - 0x88180104, // 0006 GETMBR R6 R0 K4 - 0x00180C01, // 0007 ADD R6 R6 R1 - 0x08180C05, // 0008 MUL R6 R6 R5 - 0x881C010A, // 0009 GETMBR R7 R0 K10 - 0x8C1C0F14, // 000A GETMET R7 R7 K20 - 0x5C240C00, // 000B MOVE R9 R6 - 0x5C280400, // 000C MOVE R10 R2 - 0x5C2C0600, // 000D MOVE R11 R3 - 0x5C300800, // 000E MOVE R12 R4 - 0x7C1C0A00, // 000F CALL R7 5 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_pixel_color -********************************************************************/ -be_local_closure(class_Leds_matrix_get_pixel_color, /* name */ - be_nested_proto( - 5, /* nstack */ 2, /* argc */ 10, /* varg */ 0, /* has upvals */ @@ -1031,15 +911,49 @@ be_local_closure(class_Leds_matrix_get_pixel_color, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_Leds_matrix, /* shared constants */ - &be_const_str_get_pixel_color, + &be_const_str_set_alternate, &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080515, // 0001 GETMET R2 R2 K21 - 0x88100116, // 0002 GETMBR R4 R0 K22 - 0x00100204, // 0003 ADD R4 R1 R4 - 0x7C080400, // 0004 CALL R2 2 - 0x80040400, // 0005 RET 1 R2 + ( &(const binstruction[ 2]) { /* code */ + 0x90020801, // 0000 SETMBR R0 K4 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(class_Leds_matrix_init, /* name */ + be_nested_proto( + 7, /* nstack */ + 5, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Leds_matrix, /* shared constants */ + &be_const_str_init, + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x90021204, // 0001 SETMBR R0 K9 R4 + 0x90021003, // 0002 SETMBR R0 K8 R3 + 0x90020E02, // 0003 SETMBR R0 K7 R2 + 0x50140000, // 0004 LDBOOL R5 0 0 + 0x90020805, // 0005 SETMBR R0 K4 R5 + 0x88140100, // 0006 GETMBR R5 R0 K0 + 0x8C140B11, // 0007 GETMET R5 R5 K17 + 0x7C140200, // 0008 CALL R5 1 + 0x90021805, // 0009 SETMBR R0 K12 R5 + 0x88140100, // 000A GETMBR R5 R0 K0 + 0x8C140B16, // 000B GETMET R5 R5 K22 + 0x7C140200, // 000C CALL R5 1 + 0x90021605, // 000D SETMBR R0 K11 R5 + 0x80000000, // 000E RET 0 }) ) ); @@ -1064,9 +978,9 @@ be_local_closure(class_Leds_matrix_clear, /* name */ &be_const_str_solidified, ( &(const binstruction[ 6]) { /* code */ 0x8C040117, // 0000 GETMET R1 R0 K23 - 0x580C0007, // 0001 LDCONST R3 K7 + 0x580C000E, // 0001 LDCONST R3 K14 0x7C040400, // 0002 CALL R1 2 - 0x8C040109, // 0003 GETMET R1 R0 K9 + 0x8C040110, // 0003 GETMET R1 R0 K16 0x7C040200, // 0004 CALL R1 1 0x80000000, // 0005 RET 0 }) @@ -1075,39 +989,411 @@ be_local_closure(class_Leds_matrix_clear, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: scroll +********************************************************************/ +be_local_closure(class_Leds_matrix_scroll, /* name */ + be_nested_proto( + 17, /* nstack */ + 4, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Leds_matrix, /* shared constants */ + &be_const_str_scroll, + &be_const_str_solidified, + ( &(const binstruction[258]) { /* code */ + 0x8810010C, // 0000 GETMBR R4 R0 K12 + 0x88140108, // 0001 GETMBR R5 R0 K8 + 0x88180107, // 0002 GETMBR R6 R0 K7 + 0x08180D18, // 0003 MUL R6 R6 K24 + 0x4C1C0000, // 0004 LDNIL R7 + 0x10200319, // 0005 MOD R8 R1 K25 + 0x1C20110E, // 0006 EQ R8 R8 K14 + 0x7822006B, // 0007 JMPF R8 #0074 + 0x1C20030E, // 0008 EQ R8 R1 K14 + 0x78220037, // 0009 JMPF R8 #0042 + 0x8C20050D, // 000A GETMET R8 R2 K13 + 0x5828000E, // 000B LDCONST R10 K14 + 0x042C0D05, // 000C SUB R11 R6 K5 + 0x402E1C0B, // 000D CONNECT R11 K14 R11 + 0x942C080B, // 000E GETIDX R11 R4 R11 + 0x8C2C171A, // 000F GETMET R11 R11 K26 + 0x5834000E, // 0010 LDCONST R13 K14 + 0x4C380000, // 0011 LDNIL R14 + 0x583C0018, // 0012 LDCONST R15 K24 + 0x7C2C0800, // 0013 CALL R11 4 + 0x7C200600, // 0014 CALL R8 3 + 0x5820000E, // 0015 LDCONST R8 K14 + 0x04240B05, // 0016 SUB R9 R5 K5 + 0x14241009, // 0017 LT R9 R8 R9 + 0x78260016, // 0018 JMPF R9 #0030 + 0x581C000E, // 0019 LDCONST R7 K14 + 0x08241006, // 001A MUL R9 R8 R6 + 0x00281119, // 001B ADD R10 R8 K25 + 0x08281406, // 001C MUL R10 R10 R6 + 0x04281518, // 001D SUB R10 R10 K24 + 0x142C0E06, // 001E LT R11 R7 R6 + 0x782E000D, // 001F JMPF R11 #002E + 0x002C0E09, // 0020 ADD R11 R7 R9 + 0x04301407, // 0021 SUB R12 R10 R7 + 0x9434080C, // 0022 GETIDX R13 R4 R12 + 0x9810160D, // 0023 SETIDX R4 R11 R13 + 0x00341705, // 0024 ADD R13 R11 K5 + 0x00381905, // 0025 ADD R14 R12 K5 + 0x9438080E, // 0026 GETIDX R14 R4 R14 + 0x98101A0E, // 0027 SETIDX R4 R13 R14 + 0x00341719, // 0028 ADD R13 R11 K25 + 0x00381919, // 0029 ADD R14 R12 K25 + 0x9438080E, // 002A GETIDX R14 R4 R14 + 0x98101A0E, // 002B SETIDX R4 R13 R14 + 0x001C0F18, // 002C ADD R7 R7 K24 + 0x7001FFEF, // 002D JMP #001E + 0x00201105, // 002E ADD R8 R8 K5 + 0x7001FFE5, // 002F JMP #0016 + 0x780E0001, // 0030 JMPF R3 #0033 + 0x5C240600, // 0031 MOVE R9 R3 + 0x70020000, // 0032 JMP #0034 + 0x5C240400, // 0033 MOVE R9 R2 + 0x10280B19, // 0034 MOD R10 R5 K25 + 0x1C281505, // 0035 EQ R10 R10 K5 + 0x782A0004, // 0036 JMPF R10 #003C + 0x8C28131A, // 0037 GETMET R10 R9 K26 + 0x5830000E, // 0038 LDCONST R12 K14 + 0x4C340000, // 0039 LDNIL R13 + 0x58380018, // 003A LDCONST R14 K24 + 0x7C280800, // 003B CALL R10 4 + 0x8C28090D, // 003C GETMET R10 R4 K13 + 0x04300B05, // 003D SUB R12 R5 K5 + 0x08301806, // 003E MUL R12 R12 R6 + 0x5C341200, // 003F MOVE R13 R9 + 0x7C280600, // 0040 CALL R10 3 + 0x70020030, // 0041 JMP #0073 + 0x8C20050D, // 0042 GETMET R8 R2 K13 + 0x5828000E, // 0043 LDCONST R10 K14 + 0x602C000C, // 0044 GETGBL R11 G12 + 0x5C300800, // 0045 MOVE R12 R4 + 0x7C2C0200, // 0046 CALL R11 1 + 0x042C1606, // 0047 SUB R11 R11 R6 + 0x402C171B, // 0048 CONNECT R11 R11 K27 + 0x942C080B, // 0049 GETIDX R11 R4 R11 + 0x8C2C171A, // 004A GETMET R11 R11 K26 + 0x5834000E, // 004B LDCONST R13 K14 + 0x4C380000, // 004C LDNIL R14 + 0x583C0018, // 004D LDCONST R15 K24 + 0x7C2C0800, // 004E CALL R11 4 + 0x7C200600, // 004F CALL R8 3 + 0x04200B05, // 0050 SUB R8 R5 K5 + 0x2424110E, // 0051 GT R9 R8 K14 + 0x7826000F, // 0052 JMPF R9 #0063 + 0x8C24090D, // 0053 GETMET R9 R4 K13 + 0x082C1006, // 0054 MUL R11 R8 R6 + 0x04301105, // 0055 SUB R12 R8 K5 + 0x08301806, // 0056 MUL R12 R12 R6 + 0x08341006, // 0057 MUL R13 R8 R6 + 0x04341B05, // 0058 SUB R13 R13 K5 + 0x4030180D, // 0059 CONNECT R12 R12 R13 + 0x9430080C, // 005A GETIDX R12 R4 R12 + 0x8C30191A, // 005B GETMET R12 R12 K26 + 0x5838000E, // 005C LDCONST R14 K14 + 0x4C3C0000, // 005D LDNIL R15 + 0x58400018, // 005E LDCONST R16 K24 + 0x7C300800, // 005F CALL R12 4 + 0x7C240600, // 0060 CALL R9 3 + 0x04201105, // 0061 SUB R8 R8 K5 + 0x7001FFED, // 0062 JMP #0051 + 0x780E0001, // 0063 JMPF R3 #0066 + 0x5C240600, // 0064 MOVE R9 R3 + 0x70020000, // 0065 JMP #0067 + 0x5C240400, // 0066 MOVE R9 R2 + 0x10280B19, // 0067 MOD R10 R5 K25 + 0x1C281505, // 0068 EQ R10 R10 K5 + 0x782A0004, // 0069 JMPF R10 #006F + 0x8C28131A, // 006A GETMET R10 R9 K26 + 0x5830000E, // 006B LDCONST R12 K14 + 0x4C340000, // 006C LDNIL R13 + 0x58380018, // 006D LDCONST R14 K24 + 0x7C280800, // 006E CALL R10 4 + 0x8C28090D, // 006F GETMET R10 R4 K13 + 0x5830000E, // 0070 LDCONST R12 K14 + 0x5C341200, // 0071 MOVE R13 R9 + 0x7C280600, // 0072 CALL R10 3 + 0x7002008C, // 0073 JMP #0101 + 0x5820000E, // 0074 LDCONST R8 K14 + 0x58240018, // 0075 LDCONST R9 K24 + 0x1C280318, // 0076 EQ R10 R1 K24 + 0x782A0001, // 0077 JMPF R10 #007A + 0x5429FFFE, // 0078 LDINT R10 -1 + 0x0824120A, // 0079 MUL R9 R9 R10 + 0x14281005, // 007A LT R10 R8 R5 + 0x782A0084, // 007B JMPF R10 #0101 + 0x08281006, // 007C MUL R10 R8 R6 + 0x5C1C1400, // 007D MOVE R7 R10 + 0x2428130E, // 007E GT R10 R9 K14 + 0x782A003E, // 007F JMPF R10 #00BF + 0x00280E06, // 0080 ADD R10 R7 R6 + 0x04281409, // 0081 SUB R10 R10 R9 + 0x082C1118, // 0082 MUL R11 R8 K24 + 0x94300807, // 0083 GETIDX R12 R4 R7 + 0x9808160C, // 0084 SETIDX R2 R11 R12 + 0x082C1118, // 0085 MUL R11 R8 K24 + 0x002C1705, // 0086 ADD R11 R11 K5 + 0x00300F05, // 0087 ADD R12 R7 K5 + 0x9430080C, // 0088 GETIDX R12 R4 R12 + 0x9808160C, // 0089 SETIDX R2 R11 R12 + 0x082C1118, // 008A MUL R11 R8 K24 + 0x002C1719, // 008B ADD R11 R11 K25 + 0x00300F19, // 008C ADD R12 R7 K25 + 0x9430080C, // 008D GETIDX R12 R4 R12 + 0x9808160C, // 008E SETIDX R2 R11 R12 + 0x142C0E0A, // 008F LT R11 R7 R10 + 0x782E000E, // 0090 JMPF R11 #00A0 + 0x002C0F18, // 0091 ADD R11 R7 K24 + 0x942C080B, // 0092 GETIDX R11 R4 R11 + 0x98100E0B, // 0093 SETIDX R4 R7 R11 + 0x002C0F05, // 0094 ADD R11 R7 K5 + 0x54320003, // 0095 LDINT R12 4 + 0x00300E0C, // 0096 ADD R12 R7 R12 + 0x9430080C, // 0097 GETIDX R12 R4 R12 + 0x9810160C, // 0098 SETIDX R4 R11 R12 + 0x002C0F19, // 0099 ADD R11 R7 K25 + 0x54320004, // 009A LDINT R12 5 + 0x00300E0C, // 009B ADD R12 R7 R12 + 0x9430080C, // 009C GETIDX R12 R4 R12 + 0x9810160C, // 009D SETIDX R4 R11 R12 + 0x001C0E09, // 009E ADD R7 R7 R9 + 0x7001FFEE, // 009F JMP #008F + 0x4C2C0000, // 00A0 LDNIL R11 + 0x1C2C060B, // 00A1 EQ R11 R3 R11 + 0x782E000D, // 00A2 JMPF R11 #00B1 + 0x082C1118, // 00A3 MUL R11 R8 K24 + 0x942C040B, // 00A4 GETIDX R11 R2 R11 + 0x9810140B, // 00A5 SETIDX R4 R10 R11 + 0x002C1505, // 00A6 ADD R11 R10 K5 + 0x08301118, // 00A7 MUL R12 R8 K24 + 0x00301905, // 00A8 ADD R12 R12 K5 + 0x9430040C, // 00A9 GETIDX R12 R2 R12 + 0x9810160C, // 00AA SETIDX R4 R11 R12 + 0x002C1519, // 00AB ADD R11 R10 K25 + 0x08301118, // 00AC MUL R12 R8 K24 + 0x00301919, // 00AD ADD R12 R12 K25 + 0x9430040C, // 00AE GETIDX R12 R2 R12 + 0x9810160C, // 00AF SETIDX R4 R11 R12 + 0x7002000C, // 00B0 JMP #00BE + 0x082C1118, // 00B1 MUL R11 R8 K24 + 0x942C060B, // 00B2 GETIDX R11 R3 R11 + 0x9810140B, // 00B3 SETIDX R4 R10 R11 + 0x002C1505, // 00B4 ADD R11 R10 K5 + 0x08301118, // 00B5 MUL R12 R8 K24 + 0x00301905, // 00B6 ADD R12 R12 K5 + 0x9430060C, // 00B7 GETIDX R12 R3 R12 + 0x9810160C, // 00B8 SETIDX R4 R11 R12 + 0x002C1519, // 00B9 ADD R11 R10 K25 + 0x08301118, // 00BA MUL R12 R8 K24 + 0x00301919, // 00BB ADD R12 R12 K25 + 0x9430060C, // 00BC GETIDX R12 R3 R12 + 0x9810160C, // 00BD SETIDX R4 R11 R12 + 0x7002003D, // 00BE JMP #00FD + 0x5C280E00, // 00BF MOVE R10 R7 + 0x002C0E06, // 00C0 ADD R11 R7 R6 + 0x002C1609, // 00C1 ADD R11 R11 R9 + 0x5C1C1600, // 00C2 MOVE R7 R11 + 0x082C1118, // 00C3 MUL R11 R8 K24 + 0x94300807, // 00C4 GETIDX R12 R4 R7 + 0x9808160C, // 00C5 SETIDX R2 R11 R12 + 0x082C1118, // 00C6 MUL R11 R8 K24 + 0x002C1705, // 00C7 ADD R11 R11 K5 + 0x00300F05, // 00C8 ADD R12 R7 K5 + 0x9430080C, // 00C9 GETIDX R12 R4 R12 + 0x9808160C, // 00CA SETIDX R2 R11 R12 + 0x082C1118, // 00CB MUL R11 R8 K24 + 0x002C1719, // 00CC ADD R11 R11 K25 + 0x00300F19, // 00CD ADD R12 R7 K25 + 0x9430080C, // 00CE GETIDX R12 R4 R12 + 0x9808160C, // 00CF SETIDX R2 R11 R12 + 0x242C0E0A, // 00D0 GT R11 R7 R10 + 0x782E000C, // 00D1 JMPF R11 #00DF + 0x042C0F18, // 00D2 SUB R11 R7 K24 + 0x942C080B, // 00D3 GETIDX R11 R4 R11 + 0x98100E0B, // 00D4 SETIDX R4 R7 R11 + 0x002C0F05, // 00D5 ADD R11 R7 K5 + 0x04300F19, // 00D6 SUB R12 R7 K25 + 0x9430080C, // 00D7 GETIDX R12 R4 R12 + 0x9810160C, // 00D8 SETIDX R4 R11 R12 + 0x002C0F19, // 00D9 ADD R11 R7 K25 + 0x04300F05, // 00DA SUB R12 R7 K5 + 0x9430080C, // 00DB GETIDX R12 R4 R12 + 0x9810160C, // 00DC SETIDX R4 R11 R12 + 0x001C0E09, // 00DD ADD R7 R7 R9 + 0x7001FFF0, // 00DE JMP #00D0 + 0x4C2C0000, // 00DF LDNIL R11 + 0x1C2C060B, // 00E0 EQ R11 R3 R11 + 0x782E000D, // 00E1 JMPF R11 #00F0 + 0x082C1118, // 00E2 MUL R11 R8 K24 + 0x942C040B, // 00E3 GETIDX R11 R2 R11 + 0x9810140B, // 00E4 SETIDX R4 R10 R11 + 0x002C1505, // 00E5 ADD R11 R10 K5 + 0x08301118, // 00E6 MUL R12 R8 K24 + 0x00301905, // 00E7 ADD R12 R12 K5 + 0x9430040C, // 00E8 GETIDX R12 R2 R12 + 0x9810160C, // 00E9 SETIDX R4 R11 R12 + 0x002C1519, // 00EA ADD R11 R10 K25 + 0x08301118, // 00EB MUL R12 R8 K24 + 0x00301919, // 00EC ADD R12 R12 K25 + 0x9430040C, // 00ED GETIDX R12 R2 R12 + 0x9810160C, // 00EE SETIDX R4 R11 R12 + 0x7002000C, // 00EF JMP #00FD + 0x082C1118, // 00F0 MUL R11 R8 K24 + 0x942C060B, // 00F1 GETIDX R11 R3 R11 + 0x9810140B, // 00F2 SETIDX R4 R10 R11 + 0x002C1505, // 00F3 ADD R11 R10 K5 + 0x08301118, // 00F4 MUL R12 R8 K24 + 0x00301905, // 00F5 ADD R12 R12 K5 + 0x9430060C, // 00F6 GETIDX R12 R3 R12 + 0x9810160C, // 00F7 SETIDX R4 R11 R12 + 0x002C1519, // 00F8 ADD R11 R10 K25 + 0x08301118, // 00F9 MUL R12 R8 K24 + 0x00301919, // 00FA ADD R12 R12 K25 + 0x9430060C, // 00FB GETIDX R12 R3 R12 + 0x9810160C, // 00FC SETIDX R4 R11 R12 + 0x5429FFFE, // 00FD LDINT R10 -1 + 0x0824120A, // 00FE MUL R9 R9 R10 + 0x00201105, // 00FF ADD R8 R8 K5 + 0x7001FF78, // 0100 JMP #007A + 0x80000000, // 0101 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: pixel_count +********************************************************************/ +be_local_closure(class_Leds_matrix_pixel_count, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Leds_matrix, /* shared constants */ + &be_const_str_pixel_count, + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040107, // 0000 GETMBR R1 R0 K7 + 0x88080108, // 0001 GETMBR R2 R0 K8 + 0x08040202, // 0002 MUL R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pixel_color +********************************************************************/ +be_local_closure(class_Leds_matrix_set_pixel_color, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Leds_matrix, /* shared constants */ + &be_const_str_set_pixel_color, + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x1C100604, // 0001 EQ R4 R3 R4 + 0x78120001, // 0002 JMPF R4 #0005 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x880C0903, // 0004 GETMBR R3 R4 K3 + 0x88100100, // 0005 GETMBR R4 R0 K0 + 0x8C100906, // 0006 GETMET R4 R4 K6 + 0x88180109, // 0007 GETMBR R6 R0 K9 + 0x00180206, // 0008 ADD R6 R1 R6 + 0x5C1C0400, // 0009 MOVE R7 R2 + 0x5C200600, // 000A MOVE R8 R3 + 0x7C100800, // 000B CALL R4 4 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: pixels_buffer +********************************************************************/ +be_local_closure(class_Leds_matrix_pixels_buffer, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Leds_matrix, /* shared constants */ + &be_const_str_pixels_buffer, + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040311, // 0001 GETMET R1 R1 K17 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Leds_matrix ********************************************************************/ be_local_class(Leds_matrix, 7, NULL, - be_nested_map(25, + be_nested_map(26, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key(init, -1), be_const_closure(class_Leds_matrix_init_closure) }, + { be_const_key(is_dirty, -1), be_const_closure(class_Leds_matrix_is_dirty_closure) }, + { be_const_key(pixels_buffer, -1), be_const_closure(class_Leds_matrix_pixels_buffer_closure) }, + { be_const_key(set_matrix_pixel_color, 10), be_const_closure(class_Leds_matrix_set_matrix_pixel_color_closure) }, + { be_const_key(can_show, -1), be_const_closure(class_Leds_matrix_can_show_closure) }, + { be_const_key(offset, -1), be_const_var(1) }, + { be_const_key(set_bytes, 15), be_const_closure(class_Leds_matrix_set_bytes_closure) }, { be_const_key(show, -1), be_const_closure(class_Leds_matrix_show_closure) }, { be_const_key(alternate, -1), be_const_var(4) }, - { be_const_key(get_pixel_color, 14), be_const_closure(class_Leds_matrix_get_pixel_color_closure) }, - { be_const_key(is_dirty, -1), be_const_closure(class_Leds_matrix_is_dirty_closure) }, - { be_const_key(clear_to, 0), be_const_closure(class_Leds_matrix_clear_to_closure) }, { be_const_key(set_pixel_color, -1), be_const_closure(class_Leds_matrix_set_pixel_color_closure) }, - { be_const_key(pixels_buffer, -1), be_const_closure(class_Leds_matrix_pixels_buffer_closure) }, - { be_const_key(dirty, -1), be_const_closure(class_Leds_matrix_dirty_closure) }, - { be_const_key(can_show, 21), be_const_closure(class_Leds_matrix_can_show_closure) }, - { be_const_key(pixel_size, 4), be_const_closure(class_Leds_matrix_pixel_size_closure) }, - { be_const_key(w, -1), be_const_var(3) }, - { be_const_key(set_matrix_pixel_color, 9), be_const_closure(class_Leds_matrix_set_matrix_pixel_color_closure) }, - { be_const_key(offset, -1), be_const_var(1) }, - { be_const_key(strip, -1), be_const_var(0) }, - { be_const_key(begin, -1), be_const_closure(class_Leds_matrix_begin_closure) }, - { be_const_key(h, -1), be_const_var(2) }, - { be_const_key(pix_size, -1), be_const_var(6) }, { be_const_key(pixel_count, -1), be_const_closure(class_Leds_matrix_pixel_count_closure) }, - { be_const_key(get_alternate, -1), be_const_closure(class_Leds_matrix_get_alternate_closure) }, - { be_const_key(pixel_offset, -1), be_const_closure(class_Leds_matrix_pixel_offset_closure) }, - { be_const_key(set_alternate, -1), be_const_closure(class_Leds_matrix_set_alternate_closure) }, - { be_const_key(set_bytes, -1), be_const_closure(class_Leds_matrix_set_bytes_closure) }, - { be_const_key(pix_buffer, 3), be_const_var(5) }, + { be_const_key(w, -1), be_const_var(3) }, + { be_const_key(dirty, 24), be_const_closure(class_Leds_matrix_dirty_closure) }, + { be_const_key(get_alternate, 13), be_const_closure(class_Leds_matrix_get_alternate_closure) }, + { be_const_key(get_pixel_color, -1), be_const_closure(class_Leds_matrix_get_pixel_color_closure) }, + { be_const_key(pix_size, -1), be_const_var(6) }, + { be_const_key(strip, -1), be_const_var(0) }, + { be_const_key(clear_to, 21), be_const_closure(class_Leds_matrix_clear_to_closure) }, + { be_const_key(init, -1), be_const_closure(class_Leds_matrix_init_closure) }, + { be_const_key(set_alternate, 8), be_const_closure(class_Leds_matrix_set_alternate_closure) }, + { be_const_key(pix_buffer, 17), be_const_var(5) }, { be_const_key(clear, -1), be_const_closure(class_Leds_matrix_clear_closure) }, + { be_const_key(begin, -1), be_const_closure(class_Leds_matrix_begin_closure) }, + { be_const_key(scroll, -1), be_const_closure(class_Leds_matrix_scroll_closure) }, + { be_const_key(h, 9), be_const_var(2) }, + { be_const_key(pixel_offset, -1), be_const_closure(class_Leds_matrix_pixel_offset_closure) }, + { be_const_key(pixel_size, 1), be_const_closure(class_Leds_matrix_pixel_size_closure) }, })), (bstring*) &be_const_str_Leds_matrix ); @@ -1268,7 +1554,7 @@ be_local_closure(class_Leds_matrix, /* name */ ********************************************************************/ be_local_closure(class_Leds_pixels_buffer, /* name */ be_nested_proto( - 8, /* nstack */ + 7, /* nstack */ 2, /* argc */ 10, /* varg */ 0, /* has upvals */ @@ -1279,28 +1565,34 @@ be_local_closure(class_Leds_pixels_buffer, /* name */ &be_ktab_class_Leds, /* shared constants */ &be_const_str_pixels_buffer, &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ + ( &(const binstruction[27]) { /* code */ 0x8C080109, // 0000 GETMET R2 R0 K9 0x54120005, // 0001 LDINT R4 6 0x7C080400, // 0002 CALL R2 2 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0203, // 0004 EQ R3 R1 R3 - 0x780E0009, // 0005 JMPF R3 #0010 - 0x600C0015, // 0006 GETGBL R3 G21 - 0x5C100400, // 0007 MOVE R4 R2 - 0x8C14010A, // 0008 GETMET R5 R0 K10 - 0x7C140200, // 0009 CALL R5 1 - 0x8C18010B, // 000A GETMET R6 R0 K11 - 0x7C180200, // 000B CALL R6 1 - 0x08140A06, // 000C MUL R5 R5 R6 - 0x7C0C0400, // 000D CALL R3 2 - 0x80040600, // 000E RET 1 R3 - 0x70020003, // 000F JMP #0014 - 0x8C0C030C, // 0010 GETMET R3 R1 K12 + 0x8C0C010A, // 0003 GETMET R3 R0 K10 + 0x7C0C0200, // 0004 CALL R3 1 + 0x8C10010B, // 0005 GETMET R4 R0 K11 + 0x7C100200, // 0006 CALL R4 1 + 0x080C0604, // 0007 MUL R3 R3 R4 + 0x4C100000, // 0008 LDNIL R4 + 0x1C100204, // 0009 EQ R4 R1 R4 + 0x74120004, // 000A JMPT R4 #0010 + 0x6010000C, // 000B GETGBL R4 G12 + 0x5C140400, // 000C MOVE R5 R2 + 0x7C100200, // 000D CALL R4 1 + 0x20100803, // 000E NE R4 R4 R3 + 0x78120005, // 000F JMPF R4 #0016 + 0x60100015, // 0010 GETGBL R4 G21 0x5C140400, // 0011 MOVE R5 R2 - 0x7C0C0400, // 0012 CALL R3 2 - 0x80040200, // 0013 RET 1 R1 - 0x80000000, // 0014 RET 0 + 0x5C180600, // 0012 MOVE R6 R3 + 0x7C100400, // 0013 CALL R4 2 + 0x80040800, // 0014 RET 1 R4 + 0x70020003, // 0015 JMP #001A + 0x8C10030C, // 0016 GETMET R4 R1 K12 + 0x5C180400, // 0017 MOVE R6 R2 + 0x7C100400, // 0018 CALL R4 2 + 0x80040200, // 0019 RET 1 R1 + 0x80000000, // 001A RET 0 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_lv_tasmota.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_lv_tasmota.h index 5d4d0254b..addf5c8cc 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_lv_tasmota.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_lv_tasmota.h @@ -17,7 +17,7 @@ be_local_closure(module_lv_tasmota_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[36]) { /* constants */ + ( &(const bvalue[37]) { /* constants */ /* K0 */ be_nested_str_weak(lv), /* K1 */ be_nested_str_weak(start), /* K2 */ be_nested_str_weak(_constants), @@ -33,31 +33,32 @@ be_local_closure(module_lv_tasmota_init, /* name */ /* K12 */ be_nested_str_weak(load_freetype_font), /* K13 */ be_nested_str_weak(register_button_encoder), /* K14 */ be_nested_str_weak(screenshot), - /* K15 */ be_nested_str_weak(version), - /* K16 */ be_nested_str_weak(version_major), - /* K17 */ be_nested_str_weak(clock), - /* K18 */ be_nested_str_weak(lv_clock), - /* K19 */ be_nested_str_weak(clock_icon), - /* K20 */ be_nested_str_weak(lv_clock_icon), - /* K21 */ be_nested_str_weak(signal_arcs), - /* K22 */ be_nested_str_weak(lv_signal_arcs), - /* K23 */ be_nested_str_weak(signal_bars), - /* K24 */ be_nested_str_weak(lv_signal_bars), - /* K25 */ be_nested_str_weak(wifi_arcs_icon), - /* K26 */ be_nested_str_weak(lv_wifi_arcs_icon), - /* K27 */ be_nested_str_weak(wifi_arcs), - /* K28 */ be_nested_str_weak(lv_wifi_arcs), - /* K29 */ be_nested_str_weak(wifi_bars_icon), - /* K30 */ be_nested_str_weak(lv_wifi_bars_icon), - /* K31 */ be_nested_str_weak(wifi_bars), - /* K32 */ be_nested_str_weak(lv_wifi_bars), - /* K33 */ be_nested_str_weak(tasmota), - /* K34 */ be_nested_str_weak(get_option), - /* K35 */ be_const_int(0), + /* K15 */ be_nested_str_weak(set_paint_cb), + /* K16 */ be_nested_str_weak(version), + /* K17 */ be_nested_str_weak(version_major), + /* K18 */ be_nested_str_weak(clock), + /* K19 */ be_nested_str_weak(lv_clock), + /* K20 */ be_nested_str_weak(clock_icon), + /* K21 */ be_nested_str_weak(lv_clock_icon), + /* K22 */ be_nested_str_weak(signal_arcs), + /* K23 */ be_nested_str_weak(lv_signal_arcs), + /* K24 */ be_nested_str_weak(signal_bars), + /* K25 */ be_nested_str_weak(lv_signal_bars), + /* K26 */ be_nested_str_weak(wifi_arcs_icon), + /* K27 */ be_nested_str_weak(lv_wifi_arcs_icon), + /* K28 */ be_nested_str_weak(wifi_arcs), + /* K29 */ be_nested_str_weak(lv_wifi_arcs), + /* K30 */ be_nested_str_weak(wifi_bars_icon), + /* K31 */ be_nested_str_weak(lv_wifi_bars_icon), + /* K32 */ be_nested_str_weak(wifi_bars), + /* K33 */ be_nested_str_weak(lv_wifi_bars), + /* K34 */ be_nested_str_weak(tasmota), + /* K35 */ be_nested_str_weak(get_option), + /* K36 */ be_const_int(0), }), be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[58]) { /* code */ + ( &(const binstruction[60]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x88080101, // 0001 GETMBR R2 R0 K1 0x90060202, // 0002 SETMBR R1 K1 R2 @@ -87,35 +88,37 @@ be_local_closure(module_lv_tasmota_init, /* name */ 0x90061A02, // 001A SETMBR R1 K13 R2 0x8808010E, // 001B GETMBR R2 R0 K14 0x90061C02, // 001C SETMBR R1 K14 R2 - 0x8C080310, // 001D GETMET R2 R1 K16 - 0x7C080200, // 001E CALL R2 1 - 0x90061E02, // 001F SETMBR R1 K15 R2 - 0xB80A2400, // 0020 GETNGBL R2 K18 - 0x90062202, // 0021 SETMBR R1 K17 R2 - 0xB80A2800, // 0022 GETNGBL R2 K20 - 0x90062602, // 0023 SETMBR R1 K19 R2 - 0xB80A2C00, // 0024 GETNGBL R2 K22 - 0x90062A02, // 0025 SETMBR R1 K21 R2 - 0xB80A3000, // 0026 GETNGBL R2 K24 - 0x90062E02, // 0027 SETMBR R1 K23 R2 - 0xB80A3400, // 0028 GETNGBL R2 K26 - 0x90063202, // 0029 SETMBR R1 K25 R2 - 0xB80A3800, // 002A GETNGBL R2 K28 - 0x90063602, // 002B SETMBR R1 K27 R2 - 0xB80A3C00, // 002C GETNGBL R2 K30 - 0x90063A02, // 002D SETMBR R1 K29 R2 - 0xB80A4000, // 002E GETNGBL R2 K32 - 0x90063E02, // 002F SETMBR R1 K31 R2 + 0x8808010F, // 001D GETMBR R2 R0 K15 + 0x90061E02, // 001E SETMBR R1 K15 R2 + 0x8C080311, // 001F GETMET R2 R1 K17 + 0x7C080200, // 0020 CALL R2 1 + 0x90062002, // 0021 SETMBR R1 K16 R2 + 0xB80A2600, // 0022 GETNGBL R2 K19 + 0x90062402, // 0023 SETMBR R1 K18 R2 + 0xB80A2A00, // 0024 GETNGBL R2 K21 + 0x90062802, // 0025 SETMBR R1 K20 R2 + 0xB80A2E00, // 0026 GETNGBL R2 K23 + 0x90062C02, // 0027 SETMBR R1 K22 R2 + 0xB80A3200, // 0028 GETNGBL R2 K25 + 0x90063002, // 0029 SETMBR R1 K24 R2 + 0xB80A3600, // 002A GETNGBL R2 K27 + 0x90063402, // 002B SETMBR R1 K26 R2 + 0xB80A3A00, // 002C GETNGBL R2 K29 + 0x90063802, // 002D SETMBR R1 K28 R2 + 0xB80A3E00, // 002E GETNGBL R2 K31 + 0x90063C02, // 002F SETMBR R1 K30 R2 0xB80A4200, // 0030 GETNGBL R2 K33 - 0x8C080522, // 0031 GETMET R2 R2 K34 - 0x54120086, // 0032 LDINT R4 135 - 0x7C080400, // 0033 CALL R2 2 - 0x1C080523, // 0034 EQ R2 R2 K35 - 0x780A0001, // 0035 JMPF R2 #0038 - 0x8C080303, // 0036 GETMET R2 R1 K3 - 0x7C080200, // 0037 CALL R2 1 - 0x4C080000, // 0038 LDNIL R2 - 0x80040400, // 0039 RET 1 R2 + 0x90064002, // 0031 SETMBR R1 K32 R2 + 0xB80A4400, // 0032 GETNGBL R2 K34 + 0x8C080523, // 0033 GETMET R2 R2 K35 + 0x54120086, // 0034 LDINT R4 135 + 0x7C080400, // 0035 CALL R2 2 + 0x1C080524, // 0036 EQ R2 R2 K36 + 0x780A0001, // 0037 JMPF R2 #003A + 0x8C080303, // 0038 GETMET R2 R1 K3 + 0x7C080200, // 0039 CALL R2 1 + 0x4C080000, // 003A LDNIL R2 + 0x80040400, // 003B RET 1 R2 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_partition_core.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_partition_core.h index a3fdf5e99..63ab5e4fd 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_partition_core.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_partition_core.h @@ -692,12 +692,12 @@ be_local_closure(class_Partition_parse, /* name */ &be_ktab_class_Partition, /* shared constants */ &be_const_str_parse, &be_const_str_solidified, - ( &(const binstruction[57]) { /* code */ + ( &(const binstruction[56]) { /* code */ 0x60040010, // 0000 GETGBL R1 G16 0x540A005D, // 0001 LDINT R2 94 0x400A1A02, // 0002 CONNECT R2 K13 R2 0x7C040200, // 0003 CALL R1 1 - 0xA802002F, // 0004 EXBLK 0 #0035 + 0xA802002E, // 0004 EXBLK 0 #0034 0x5C080200, // 0005 MOVE R2 R1 0x7C080000, // 0006 CALL R2 0 0x540E001F, // 0007 LDINT R3 32 @@ -709,47 +709,46 @@ be_local_closure(class_Partition_parse, /* name */ 0x400C0604, // 000D CONNECT R3 R3 R4 0x88100106, // 000E GETMBR R4 R0 K6 0x940C0803, // 000F GETIDX R3 R4 R3 - 0x8C14070F, // 0010 GETMET R5 R3 K15 - 0x581C000D, // 0011 LDCONST R7 K13 - 0x58200010, // 0012 LDCONST R8 K16 - 0x7C140600, // 0013 CALL R5 3 - 0x5C100A00, // 0014 MOVE R4 R5 - 0x541650A9, // 0015 LDINT R5 20650 - 0x1C140805, // 0016 EQ R5 R4 R5 - 0x78160008, // 0017 JMPF R5 #0021 - 0xB8162200, // 0018 GETNGBL R5 K17 - 0x8C140B12, // 0019 GETMET R5 R5 K18 - 0x5C1C0600, // 001A MOVE R7 R3 - 0x7C140400, // 001B CALL R5 2 - 0x88180109, // 001C GETMBR R6 R0 K9 - 0x8C180D13, // 001D GETMET R6 R6 K19 - 0x5C200A00, // 001E MOVE R8 R5 - 0x7C180400, // 001F CALL R6 2 - 0x70020010, // 0020 JMP #0032 - 0x5416EBEA, // 0021 LDINT R5 60395 - 0x1C140805, // 0022 EQ R5 R4 R5 - 0x7816000C, // 0023 JMPF R5 #0031 - 0x5416001F, // 0024 LDINT R5 32 - 0x08140405, // 0025 MUL R5 R2 R5 - 0x541A000F, // 0026 LDINT R6 16 - 0x00140A06, // 0027 ADD R5 R5 R6 - 0x541A0020, // 0028 LDINT R6 33 - 0x08180406, // 0029 MUL R6 R2 R6 - 0x04180D0E, // 002A SUB R6 R6 K14 - 0x40140A06, // 002B CONNECT R5 R5 R6 - 0x88180106, // 002C GETMBR R6 R0 K6 - 0x94140C05, // 002D GETIDX R5 R6 R5 - 0x90022805, // 002E SETMBR R0 K20 R5 - 0x70020002, // 002F JMP #0033 + 0x8C10070F, // 0010 GETMET R4 R3 K15 + 0x5818000D, // 0011 LDCONST R6 K13 + 0x581C0010, // 0012 LDCONST R7 K16 + 0x7C100600, // 0013 CALL R4 3 + 0x541650A9, // 0014 LDINT R5 20650 + 0x1C140805, // 0015 EQ R5 R4 R5 + 0x78160008, // 0016 JMPF R5 #0020 + 0xB8162200, // 0017 GETNGBL R5 K17 + 0x8C140B12, // 0018 GETMET R5 R5 K18 + 0x5C1C0600, // 0019 MOVE R7 R3 + 0x7C140400, // 001A CALL R5 2 + 0x88180109, // 001B GETMBR R6 R0 K9 + 0x8C180D13, // 001C GETMET R6 R6 K19 + 0x5C200A00, // 001D MOVE R8 R5 + 0x7C180400, // 001E CALL R6 2 + 0x70020010, // 001F JMP #0031 + 0x5416EBEA, // 0020 LDINT R5 60395 + 0x1C140805, // 0021 EQ R5 R4 R5 + 0x7816000C, // 0022 JMPF R5 #0030 + 0x5416001F, // 0023 LDINT R5 32 + 0x08140405, // 0024 MUL R5 R2 R5 + 0x541A000F, // 0025 LDINT R6 16 + 0x00140A06, // 0026 ADD R5 R5 R6 + 0x541A0020, // 0027 LDINT R6 33 + 0x08180406, // 0028 MUL R6 R2 R6 + 0x04180D0E, // 0029 SUB R6 R6 K14 + 0x40140A06, // 002A CONNECT R5 R5 R6 + 0x88180106, // 002B GETMBR R6 R0 K6 + 0x94140C05, // 002C GETIDX R5 R6 R5 + 0x90022805, // 002D SETMBR R0 K20 R5 + 0x70020002, // 002E JMP #0032 + 0x70020000, // 002F JMP #0031 0x70020000, // 0030 JMP #0032 - 0x70020000, // 0031 JMP #0033 - 0x7001FFD1, // 0032 JMP #0005 - 0xA8040001, // 0033 EXBLK 1 1 - 0x70020002, // 0034 JMP #0038 - 0x58040015, // 0035 LDCONST R1 K21 - 0xAC040200, // 0036 CATCH R1 1 0 - 0xB0080000, // 0037 RAISE 2 R0 R0 - 0x80000000, // 0038 RET 0 + 0x7001FFD2, // 0031 JMP #0005 + 0xA8040001, // 0032 EXBLK 1 1 + 0x70020002, // 0033 JMP #0037 + 0x58040015, // 0034 LDCONST R1 K21 + 0xAC040200, // 0035 CATCH R1 1 0 + 0xB0080000, // 0036 RAISE 2 R0 R0 + 0x80000000, // 0037 RET 0 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h index d81bff087..89485aa48 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h @@ -3,170 +3,178 @@ * Generated code, don't edit * \********************************************************************/ #include "be_constobj.h" -// compact class 'Tasmota' ktab size: 151, total: 285 (saved 1072 bytes) -static const bvalue be_ktab_class_Tasmota[151] = { - /* K0 */ be_nested_str(cmd_res), - /* K1 */ be_nested_str(tasmota), - /* K2 */ be_nested_str(global), - /* K3 */ be_nested_str(maxlog_level), - /* K4 */ be_const_int(2), - /* K5 */ be_const_int(1), - /* K6 */ be_nested_str(_cmd), - /* K7 */ be_nested_str(introspect), - /* K8 */ be_nested_str(function), - /* K9 */ be_nested_str(type_error), - /* K10 */ be_nested_str(BRY_X3A_X20argument_X20must_X20be_X20a_X20function), - /* K11 */ be_nested_str(ismethod), - /* K12 */ be_nested_str(BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27), - /* K13 */ be_nested_str(_drivers), - /* K14 */ be_nested_str(find), - /* K15 */ be_nested_str(pop), - /* K16 */ be_nested_str(every_50ms), - /* K17 */ be_nested_str(run_deferred), - /* K18 */ be_nested_str(every_250ms), - /* K19 */ be_nested_str(run_cron), - /* K20 */ be_nested_str(mqtt_data), - /* K21 */ be_nested_str(cmd), - /* K22 */ be_nested_str(exec_cmd), - /* K23 */ be_nested_str(tele), - /* K24 */ be_nested_str(exec_tele), - /* K25 */ be_nested_str(rule), - /* K26 */ be_nested_str(exec_rules), - /* K27 */ be_nested_str(gc), - /* K28 */ be_const_int(0), - /* K29 */ be_nested_str(get), - /* K30 */ be_nested_str(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), - /* K31 */ be_nested_str(_debug_present), - /* K32 */ be_nested_str(debug), - /* K33 */ be_nested_str(traceback), - /* K34 */ be_nested_str(save_before_restart), - /* K35 */ be_nested_str(persist), - /* K36 */ be_nested_str(save), - /* K37 */ be_nested_str(_ccmd), - /* K38 */ be_nested_str(json), - /* K39 */ be_nested_str(load), - /* K40 */ be_nested_str(find_key_i), - /* K41 */ be_nested_str(resolvecmnd), - /* K42 */ be_nested_str(tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29), - /* K43 */ be_nested_str(light), - /* K44 */ be_nested_str(set), - /* K45 */ be_nested_str(_crons), - /* K46 */ be_nested_str(ccronexpr), - /* K47 */ be_nested_str(now), - /* K48 */ be_nested_str(size), - /* K49 */ be_nested_str(trig), - /* K50 */ be_nested_str(next), - /* K51 */ be_nested_str(time_reached), - /* K52 */ be_nested_str(f), - /* K53 */ be_nested_str(check_not_method), - /* K54 */ be_nested_str(_timers), - /* K55 */ be_nested_str(push), +extern const bclass be_class_Tasmota; +// compact class 'Tasmota' ktab size: 158, total: 304 (saved 1168 bytes) +static const bvalue be_ktab_class_Tasmota[158] = { + /* K0 */ be_nested_str(i2c_enabled), + /* K1 */ be_nested_str(wire1), + /* K2 */ be_nested_str(enabled), + /* K3 */ be_nested_str(detect), + /* K4 */ be_nested_str(wire2), + /* K5 */ be_nested_str(_crons), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str(size), + /* K8 */ be_nested_str(id), + /* K9 */ be_nested_str(trig), + /* K10 */ be_const_int(1), + /* K11 */ be_nested_str(introspect), + /* K12 */ be_nested_str(function), + /* K13 */ be_nested_str(type_error), + /* K14 */ be_nested_str(BRY_X3A_X20argument_X20must_X20be_X20a_X20function), + /* K15 */ be_nested_str(ismethod), + /* K16 */ be_nested_str(BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27), + /* K17 */ be_nested_str(string), + /* K18 */ be_nested_str(toupper), + /* K19 */ be_nested_str(time_dump), + /* K20 */ be_nested_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d), + /* K21 */ be_nested_str(year), + /* K22 */ be_nested_str(month), + /* K23 */ be_nested_str(day), + /* K24 */ be_nested_str(hour), + /* K25 */ be_nested_str(min), + /* K26 */ be_nested_str(sec), + /* K27 */ be_nested_str(match), + /* K28 */ be_nested_str(trigger), + /* K29 */ be_nested_str(_drivers), + /* K30 */ be_nested_str(find), + /* K31 */ be_nested_str(pop), + /* K32 */ be_nested_str(_rules), + /* K33 */ be_nested_str(json), + /* K34 */ be_nested_str(load), + /* K35 */ be_nested_str(log), + /* K36 */ be_nested_str(BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20), + /* K37 */ be_const_int(3), + /* K38 */ be_nested_str(Tele), + /* K39 */ be_nested_str(try_rule), + /* K40 */ be_nested_str(f), + /* K41 */ be_nested_str(ccronexpr), + /* K42 */ be_nested_str(now), + /* K43 */ be_nested_str(next), + /* K44 */ be_nested_str(time_reached), + /* K45 */ be_nested_str(_defer), + /* K46 */ be_nested_str(push), + /* K47 */ be_nested_str(tasmota), + /* K48 */ be_nested_str(global), + /* K49 */ be_nested_str(deferred_ready), + /* K50 */ be_nested_str(scale_uint), + /* K51 */ be_const_int(2), + /* K52 */ be_nested_str(_fl), + /* K53 */ be_nested_str(remove), + /* K54 */ be_nested_str(check_not_method), + /* K55 */ be_nested_str(remove_rule), /* K56 */ be_nested_str(Trigger), - /* K57 */ be_nested_str(millis), - /* K58 */ be_nested_str(instance), + /* K57 */ be_nested_str(Rule_Matcher), + /* K58 */ be_nested_str(parse), /* K59 */ be_nested_str(value_error), - /* K60 */ be_nested_str(instance_X20required), - /* K61 */ be_nested_str(id), - /* K62 */ be_nested_str(ctypes_bytes_dyn), - /* K63 */ be_nested_str(_global_addr), - /* K64 */ be_nested_str(_global_def), - /* K65 */ be_nested_str(_settings_ptr), + /* K60 */ be_nested_str(the_X20second_X20argument_X20is_X20not_X20a_X20function), + /* K61 */ be_nested_str(ctypes_bytes_dyn), + /* K62 */ be_nested_str(_global_addr), + /* K63 */ be_nested_str(_global_def), + /* K64 */ be_nested_str(_settings_ptr), + /* K65 */ be_nested_str(get), /* K66 */ be_nested_str(settings), /* K67 */ be_nested_str(toptr), /* K68 */ be_nested_str(_settings_def), /* K69 */ be_nested_str(wd), /* K70 */ be_nested_str(), - /* K71 */ be_nested_str(contains), - /* K72 */ be_nested_str(add_cmd), - /* K73 */ be_nested_str(UrlFetch), - /* K74 */ be_nested_str(_rules), - /* K75 */ be_nested_str(Rule_Matcher), - /* K76 */ be_nested_str(parse), - /* K77 */ be_nested_str(the_X20second_X20argument_X20is_X20not_X20a_X20function), - /* K78 */ be_nested_str(match), - /* K79 */ be_nested_str(trigger), - /* K80 */ be_nested_str(_find_op), - /* K81 */ be_const_int(2147483647), - /* K82 */ be_nested_str(remove), - /* K83 */ be_nested_str(collect), - /* K84 */ be_nested_str(allocated), - /* K85 */ be_nested_str(string), - /* K86 */ be_nested_str(toupper), - /* K87 */ be_nested_str(_fl), - /* K88 */ be_nested_str(log), - /* K89 */ be_nested_str(BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20), - /* K90 */ be_const_int(3), - /* K91 */ be_nested_str(try_rule), - /* K92 */ be_nested_str(endswith), - /* K93 */ be_nested_str(_X2Ebe), - /* K94 */ be_nested_str(BRY_X3A_X20file_X20_X27_X25s_X27_X20does_X20not_X20have_X20_X27_X2Ebe_X27_X20extension), - /* K95 */ be_nested_str(_X23), - /* K96 */ be_nested_str(BRY_X3A_X20cannot_X20compile_X20file_X20in_X20read_X2Donly_X20archive), - /* K97 */ be_nested_str(file), - /* K98 */ be_nested_str(BRY_X3A_X20empty_X20compiled_X20file), - /* K99 */ be_nested_str(BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29), - /* K100 */ be_nested_str(c), - /* K101 */ be_nested_str(BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29), - /* K102 */ be_nested_str(Tele), - /* K103 */ be_nested_str(i2c_enabled), - /* K104 */ be_nested_str(wire1), - /* K105 */ be_nested_str(enabled), - /* K106 */ be_nested_str(detect), - /* K107 */ be_nested_str(wire2), - /* K108 */ be_nested_str(keys), - /* K109 */ be_nested_str(_X3F), - /* K110 */ be_nested_str(stop_iteration), - /* K111 */ be_nested_str(split), - /* K112 */ be_nested_str(_X2F), - /* K113 */ be_nested_str(index_X2Ehtml), - /* K114 */ be_nested_str(webclient), - /* K115 */ be_nested_str(set_follow_redirects), - /* K116 */ be_nested_str(begin), - /* K117 */ be_nested_str(GET), - /* K118 */ be_nested_str(status_X3A_X20), - /* K119 */ be_nested_str(connection_error), - /* K120 */ be_nested_str(write_file), - /* K121 */ be_nested_str(close), - /* K122 */ be_nested_str(BRY_X3A_X20Fetched_X20), - /* K123 */ be_nested_str(cb), - /* K124 */ be_nested_str(gen_cb), - /* K125 */ be_nested_str(time_dump), - /* K126 */ be_nested_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d), - /* K127 */ be_nested_str(year), - /* K128 */ be_nested_str(month), - /* K129 */ be_nested_str(day), - /* K130 */ be_nested_str(hour), - /* K131 */ be_nested_str(min), - /* K132 */ be_nested_str(sec), - /* K133 */ be_nested_str(argument_X20must_X20be_X20a_X20function), - /* K134 */ be_nested_str(fast_loop_enabled), - /* K135 */ be_nested_str(tasmota_X2Eget_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eget_X28_X29), - /* K136 */ be_nested_str(scale_uint), - /* K137 */ be_nested_str(path), - /* K138 */ be_nested_str(startswith), - /* K139 */ be_nested_str(_X2E), - /* K140 */ be_nested_str(_X2Ebec), - /* K141 */ be_nested_str(BRY_X3A_X20file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20nor_X20_X27_X2Ebec_X27), - /* K142 */ be_nested_str(exists), - /* K143 */ be_nested_str(BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27), - /* K144 */ be_nested_str(BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25s_X29), - /* K145 */ be_nested_str(http), - /* K146 */ be_nested_str(resp_cmnd_str), - /* K147 */ be_nested_str(URL_X20must_X20start_X20with_X20_X27http_X28s_X29_X27), - /* K148 */ be_nested_str(urlfetch), - /* K149 */ be_nested_str(resp_cmnd_failed), - /* K150 */ be_nested_str(resp_cmnd_done), + /* K71 */ be_nested_str(_debug_present), + /* K72 */ be_nested_str(contains), + /* K73 */ be_nested_str(debug), + /* K74 */ be_nested_str(add_cmd), + /* K75 */ be_nested_str(UrlFetch), + /* K76 */ be_nested_str(_timers), + /* K77 */ be_nested_str(millis), + /* K78 */ be_nested_str(split), + /* K79 */ be_nested_str(_X2F), + /* K80 */ be_nested_str(index_X2Ehtml), + /* K81 */ be_nested_str(webclient), + /* K82 */ be_nested_str(set_follow_redirects), + /* K83 */ be_nested_str(begin), + /* K84 */ be_nested_str(GET), + /* K85 */ be_nested_str(status_X3A_X20), + /* K86 */ be_nested_str(connection_error), + /* K87 */ be_nested_str(write_file), + /* K88 */ be_nested_str(close), + /* K89 */ be_nested_str(BRY_X3A_X20Fetched_X20), + /* K90 */ be_nested_str(rule), + /* K91 */ be_nested_str(instance), + /* K92 */ be_nested_str(instance_X20required), + /* K93 */ be_nested_str(cmd_res), + /* K94 */ be_nested_str(o), + /* K95 */ be_const_class(be_class_Tasmota), + /* K96 */ be_nested_str(gc), + /* K97 */ be_nested_str(collect), + /* K98 */ be_nested_str(allocated), + /* K99 */ be_nested_str(add_rule), + /* K100 */ be_nested_str(every_50ms), + /* K101 */ be_nested_str(run_timers), + /* K102 */ be_nested_str(every_250ms), + /* K103 */ be_nested_str(run_cron), + /* K104 */ be_nested_str(mqtt_data), + /* K105 */ be_nested_str(cmd), + /* K106 */ be_nested_str(exec_cmd), + /* K107 */ be_nested_str(tele), + /* K108 */ be_nested_str(exec_tele), + /* K109 */ be_nested_str(exec_rules), + /* K110 */ be_nested_str(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K111 */ be_nested_str(traceback), + /* K112 */ be_nested_str(save_before_restart), + /* K113 */ be_nested_str(persist), + /* K114 */ be_nested_str(save), + /* K115 */ be_nested_str(keys), + /* K116 */ be_nested_str(_X3F), + /* K117 */ be_nested_str(stop_iteration), + /* K118 */ be_nested_str(tasmota_X2Eget_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eget_X28_X29), + /* K119 */ be_nested_str(light), + /* K120 */ be_nested_str(argument_X20must_X20be_X20a_X20function), + /* K121 */ be_nested_str(fast_loop_enabled), + /* K122 */ be_nested_str(maxlog_level), + /* K123 */ be_nested_str(_cmd), + /* K124 */ be_nested_str(run_deferred), + /* K125 */ be_nested_str(_ccmd), + /* K126 */ be_nested_str(find_key_i), + /* K127 */ be_nested_str(resolvecmnd), + /* K128 */ be_nested_str(_find_op), + /* K129 */ be_const_int(2147483647), + /* K130 */ be_nested_str(path), + /* K131 */ be_nested_str(startswith), + /* K132 */ be_nested_str(_X23), + /* K133 */ be_nested_str(_X2E), + /* K134 */ be_nested_str(_X2Ebe), + /* K135 */ be_nested_str(endswith), + /* K136 */ be_nested_str(_X2Ebec), + /* K137 */ be_nested_str(c), + /* K138 */ be_nested_str(BRY_X3A_X20file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20nor_X20_X27_X2Ebec_X27), + /* K139 */ be_nested_str(exists), + /* K140 */ be_nested_str(BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27), + /* K141 */ be_nested_str(BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25s_X29), + /* K142 */ be_nested_str(BRY_X3A_X20file_X20_X27_X25s_X27_X20does_X20not_X20have_X20_X27_X2Ebe_X27_X20extension), + /* K143 */ be_nested_str(BRY_X3A_X20cannot_X20compile_X20file_X20in_X20read_X2Donly_X20archive), + /* K144 */ be_nested_str(file), + /* K145 */ be_nested_str(BRY_X3A_X20empty_X20compiled_X20file), + /* K146 */ be_nested_str(BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29), + /* K147 */ be_nested_str(BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29), + /* K148 */ be_nested_str(tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29), + /* K149 */ be_nested_str(set), + /* K150 */ be_nested_str(cb), + /* K151 */ be_nested_str(gen_cb), + /* K152 */ be_nested_str(http), + /* K153 */ be_nested_str(resp_cmnd_str), + /* K154 */ be_nested_str(URL_X20must_X20start_X20with_X20_X27http_X28s_X29_X27), + /* K155 */ be_nested_str(urlfetch), + /* K156 */ be_nested_str(resp_cmnd_failed), + /* K157 */ be_nested_str(resp_cmnd_done), }; extern const bclass be_class_Tasmota; /******************************************************************** -** Solidified function: cmd +** Solidified function: wire_scan ********************************************************************/ -be_local_closure(class_Tasmota_cmd, /* name */ +be_local_closure(class_Tasmota_wire_scan, /* name */ be_nested_proto( - 8, /* nstack */ + 6, /* nstack */ 3, /* argc */ 10, /* varg */ 0, /* has upvals */ @@ -175,482 +183,42 @@ be_local_closure(class_Tasmota_cmd, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_cmd, + &be_const_str_wire_scan, &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x50100200, // 0001 LDBOOL R4 1 0 - 0x90020004, // 0002 SETMBR R0 K0 R4 - 0xB8120200, // 0003 GETNGBL R4 K1 - 0x88100902, // 0004 GETMBR R4 R4 K2 - 0x88100903, // 0005 GETMBR R4 R4 K3 - 0x780A0004, // 0006 JMPF R2 #000C - 0x28140904, // 0007 GE R5 R4 K4 - 0x78160002, // 0008 JMPF R5 #000C - 0xB8160200, // 0009 GETNGBL R5 K1 - 0x88140B02, // 000A GETMBR R5 R5 K2 - 0x90160705, // 000B SETMBR R5 K3 K5 - 0x8C140106, // 000C GETMET R5 R0 K6 - 0x5C1C0200, // 000D MOVE R7 R1 - 0x7C140400, // 000E CALL R5 2 - 0x4C140000, // 000F LDNIL R5 - 0x88180100, // 0010 GETMBR R6 R0 K0 - 0x501C0200, // 0011 LDBOOL R7 1 0 - 0x20180C07, // 0012 NE R6 R6 R7 - 0x781A0000, // 0013 JMPF R6 #0015 - 0x88140100, // 0014 GETMBR R5 R0 K0 - 0x90020003, // 0015 SETMBR R0 K0 R3 - 0x780A0002, // 0016 JMPF R2 #001A - 0xB81A0200, // 0017 GETNGBL R6 K1 - 0x88180D02, // 0018 GETMBR R6 R6 K2 - 0x901A0604, // 0019 SETMBR R6 K3 R4 - 0x80040A00, // 001A RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: check_not_method -********************************************************************/ -be_local_closure(class_Tasmota_check_not_method, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_check_not_method, - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0xA40A0E00, // 0000 IMPORT R2 K7 - 0x600C0004, // 0001 GETGBL R3 G4 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C0C0200, // 0003 CALL R3 1 - 0x200C0708, // 0004 NE R3 R3 K8 - 0x780E0000, // 0005 JMPF R3 #0007 - 0xB006130A, // 0006 RAISE 1 K9 K10 - 0x8C0C050B, // 0007 GETMET R3 R2 K11 - 0x5C140200, // 0008 MOVE R5 R1 - 0x7C0C0400, // 0009 CALL R3 2 - 0x50100200, // 000A LDBOOL R4 1 0 - 0x1C0C0604, // 000B EQ R3 R3 R4 - 0x780E0000, // 000C JMPF R3 #000E - 0xB006130C, // 000D RAISE 1 K9 K12 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: remove_driver -********************************************************************/ -be_local_closure(class_Tasmota_remove_driver, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_remove_driver, - &be_const_str_solidified, - ( &(const binstruction[14]) { /* code */ - 0x8808010D, // 0000 GETMBR R2 R0 K13 - 0x780A000A, // 0001 JMPF R2 #000D - 0x8808010D, // 0002 GETMBR R2 R0 K13 - 0x8C08050E, // 0003 GETMET R2 R2 K14 - 0x5C100200, // 0004 MOVE R4 R1 - 0x7C080400, // 0005 CALL R2 2 - 0x4C0C0000, // 0006 LDNIL R3 - 0x200C0403, // 0007 NE R3 R2 R3 - 0x780E0003, // 0008 JMPF R3 #000D - 0x880C010D, // 0009 GETMBR R3 R0 K13 - 0x8C0C070F, // 000A GETMET R3 R3 K15 - 0x5C140400, // 000B MOVE R5 R2 - 0x7C0C0400, // 000C CALL R3 2 - 0x80000000, // 000D RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: event -********************************************************************/ -be_local_closure(class_Tasmota_event, /* name */ - be_nested_proto( - 19, /* nstack */ - 6, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_event, - &be_const_str_solidified, - ( &(const binstruction[108]) { /* code */ - 0xA41A0E00, // 0000 IMPORT R6 K7 - 0x1C1C0310, // 0001 EQ R7 R1 K16 - 0x781E0001, // 0002 JMPF R7 #0005 - 0x8C1C0111, // 0003 GETMET R7 R0 K17 - 0x7C1C0200, // 0004 CALL R7 1 - 0x1C1C0312, // 0005 EQ R7 R1 K18 - 0x781E0001, // 0006 JMPF R7 #0009 - 0x8C1C0113, // 0007 GETMET R7 R0 K19 - 0x7C1C0200, // 0008 CALL R7 1 - 0x501C0000, // 0009 LDBOOL R7 0 0 - 0x50200000, // 000A LDBOOL R8 0 0 - 0x1C240314, // 000B EQ R9 R1 K20 - 0x78260000, // 000C JMPF R9 #000E - 0x50200200, // 000D LDBOOL R8 1 0 - 0x1C240315, // 000E EQ R9 R1 K21 - 0x78260006, // 000F JMPF R9 #0017 - 0x8C240116, // 0010 GETMET R9 R0 K22 - 0x5C2C0400, // 0011 MOVE R11 R2 - 0x5C300600, // 0012 MOVE R12 R3 - 0x5C340800, // 0013 MOVE R13 R4 - 0x7C240800, // 0014 CALL R9 4 - 0x80041200, // 0015 RET 1 R9 - 0x7002004E, // 0016 JMP #0066 - 0x1C240317, // 0017 EQ R9 R1 K23 - 0x78260004, // 0018 JMPF R9 #001E - 0x8C240118, // 0019 GETMET R9 R0 K24 - 0x5C2C0800, // 001A MOVE R11 R4 - 0x7C240400, // 001B CALL R9 2 - 0x80041200, // 001C RET 1 R9 - 0x70020047, // 001D JMP #0066 - 0x1C240319, // 001E EQ R9 R1 K25 - 0x78260007, // 001F JMPF R9 #0028 - 0x8C24011A, // 0020 GETMET R9 R0 K26 - 0x5C2C0800, // 0021 MOVE R11 R4 - 0x60300017, // 0022 GETGBL R12 G23 - 0x5C340600, // 0023 MOVE R13 R3 - 0x7C300200, // 0024 CALL R12 1 - 0x7C240600, // 0025 CALL R9 3 - 0x80041200, // 0026 RET 1 R9 - 0x7002003D, // 0027 JMP #0066 - 0x1C24031B, // 0028 EQ R9 R1 K27 - 0x78260003, // 0029 JMPF R9 #002E - 0x8C24011B, // 002A GETMET R9 R0 K27 - 0x7C240200, // 002B CALL R9 1 - 0x80041200, // 002C RET 1 R9 - 0x70020037, // 002D JMP #0066 - 0x8824010D, // 002E GETMBR R9 R0 K13 - 0x78260035, // 002F JMPF R9 #0066 - 0x5824001C, // 0030 LDCONST R9 K28 - 0x6028000C, // 0031 GETGBL R10 G12 - 0x882C010D, // 0032 GETMBR R11 R0 K13 - 0x7C280200, // 0033 CALL R10 1 - 0x1428120A, // 0034 LT R10 R9 R10 - 0x782A002F, // 0035 JMPF R10 #0066 - 0x8828010D, // 0036 GETMBR R10 R0 K13 - 0x94281409, // 0037 GETIDX R10 R10 R9 - 0x8C2C0D1D, // 0038 GETMET R11 R6 K29 - 0x5C341400, // 0039 MOVE R13 R10 - 0x5C380200, // 003A MOVE R14 R1 - 0x7C2C0600, // 003B CALL R11 3 - 0x60300004, // 003C GETGBL R12 G4 - 0x5C341600, // 003D MOVE R13 R11 - 0x7C300200, // 003E CALL R12 1 - 0x1C301908, // 003F EQ R12 R12 K8 - 0x78320022, // 0040 JMPF R12 #0064 - 0xA8020011, // 0041 EXBLK 0 #0054 - 0x5C301600, // 0042 MOVE R12 R11 - 0x5C341400, // 0043 MOVE R13 R10 - 0x5C380400, // 0044 MOVE R14 R2 - 0x5C3C0600, // 0045 MOVE R15 R3 - 0x5C400800, // 0046 MOVE R16 R4 - 0x5C440A00, // 0047 MOVE R17 R5 - 0x7C300A00, // 0048 CALL R12 5 - 0x74320001, // 0049 JMPT R12 #004C - 0x741E0000, // 004A JMPT R7 #004C - 0x501C0001, // 004B LDBOOL R7 0 1 - 0x501C0200, // 004C LDBOOL R7 1 0 - 0x781E0003, // 004D JMPF R7 #0052 - 0x5C301000, // 004E MOVE R12 R8 - 0x74320001, // 004F JMPT R12 #0052 - 0xA8040001, // 0050 EXBLK 1 1 - 0x70020013, // 0051 JMP #0066 - 0xA8040001, // 0052 EXBLK 1 1 - 0x7002000F, // 0053 JMP #0064 - 0xAC300002, // 0054 CATCH R12 0 2 - 0x7002000C, // 0055 JMP #0063 - 0x60380001, // 0056 GETGBL R14 G1 - 0x603C0018, // 0057 GETGBL R15 G24 - 0x5840001E, // 0058 LDCONST R16 K30 - 0x5C441800, // 0059 MOVE R17 R12 - 0x5C481A00, // 005A MOVE R18 R13 - 0x7C3C0600, // 005B CALL R15 3 - 0x7C380200, // 005C CALL R14 1 - 0x8838011F, // 005D GETMBR R14 R0 K31 - 0x783A0002, // 005E JMPF R14 #0062 - 0xA43A4000, // 005F IMPORT R14 K32 - 0x8C3C1D21, // 0060 GETMET R15 R14 K33 - 0x7C3C0200, // 0061 CALL R15 1 - 0x70020000, // 0062 JMP #0064 - 0xB0080000, // 0063 RAISE 2 R0 R0 - 0x00241305, // 0064 ADD R9 R9 K5 - 0x7001FFCA, // 0065 JMP #0031 - 0x1C240322, // 0066 EQ R9 R1 K34 - 0x78260002, // 0067 JMPF R9 #006B - 0xA4264600, // 0068 IMPORT R9 K35 - 0x8C281324, // 0069 GETMET R10 R9 K36 - 0x7C280200, // 006A CALL R10 1 - 0x80040E00, // 006B RET 1 R7 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: exec_cmd -********************************************************************/ -be_local_closure(class_Tasmota_exec_cmd, /* name */ - be_nested_proto( - 12, /* nstack */ - 4, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_exec_cmd, - &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x88100125, // 0000 GETMBR R4 R0 K37 - 0x78120016, // 0001 JMPF R4 #0019 - 0xA4124C00, // 0002 IMPORT R4 K38 - 0x8C140927, // 0003 GETMET R5 R4 K39 - 0x5C1C0600, // 0004 MOVE R7 R3 - 0x7C140400, // 0005 CALL R5 2 - 0x8C180128, // 0006 GETMET R6 R0 K40 - 0x88200125, // 0007 GETMBR R8 R0 K37 - 0x5C240200, // 0008 MOVE R9 R1 - 0x7C180600, // 0009 CALL R6 3 - 0x4C1C0000, // 000A LDNIL R7 - 0x201C0C07, // 000B NE R7 R6 R7 - 0x781E000B, // 000C JMPF R7 #0019 - 0x8C1C0129, // 000D GETMET R7 R0 K41 - 0x5C240C00, // 000E MOVE R9 R6 - 0x7C1C0400, // 000F CALL R7 2 - 0x881C0125, // 0010 GETMBR R7 R0 K37 - 0x941C0E06, // 0011 GETIDX R7 R7 R6 - 0x5C200C00, // 0012 MOVE R8 R6 - 0x5C240400, // 0013 MOVE R9 R2 - 0x5C280600, // 0014 MOVE R10 R3 - 0x5C2C0A00, // 0015 MOVE R11 R5 - 0x7C1C0800, // 0016 CALL R7 4 - 0x501C0200, // 0017 LDBOOL R7 1 0 - 0x80040E00, // 0018 RET 1 R7 - 0x50100000, // 0019 LDBOOL R4 0 0 - 0x80040800, // 001A RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_light -********************************************************************/ -be_local_closure(class_Tasmota_set_light, /* name */ - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_set_light, - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x600C0001, // 0000 GETGBL R3 G1 - 0x5810002A, // 0001 LDCONST R4 K42 - 0x7C0C0200, // 0002 CALL R3 1 - 0xA40E5600, // 0003 IMPORT R3 K43 - 0x4C100000, // 0004 LDNIL R4 - 0x20100404, // 0005 NE R4 R2 R4 - 0x78120005, // 0006 JMPF R4 #000D - 0x8C10072C, // 0007 GETMET R4 R3 K44 - 0x5C180200, // 0008 MOVE R6 R1 - 0x5C1C0400, // 0009 MOVE R7 R2 - 0x7C100600, // 000A CALL R4 3 - 0x80040800, // 000B RET 1 R4 - 0x70020003, // 000C JMP #0011 - 0x8C10072C, // 000D GETMET R4 R3 K44 - 0x5C180200, // 000E MOVE R6 R1 - 0x7C100400, // 000F CALL R4 2 - 0x80040800, // 0010 RET 1 R4 - 0x80000000, // 0011 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: run_cron -********************************************************************/ -be_local_closure(class_Tasmota_run_cron, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_run_cron, - &be_const_str_solidified, - ( &(const binstruction[34]) { /* code */ - 0x8804012D, // 0000 GETMBR R1 R0 K45 - 0x7806001E, // 0001 JMPF R1 #0021 - 0x5804001C, // 0002 LDCONST R1 K28 - 0xB80A5C00, // 0003 GETNGBL R2 K46 - 0x8C08052F, // 0004 GETMET R2 R2 K47 - 0x7C080200, // 0005 CALL R2 1 - 0x880C012D, // 0006 GETMBR R3 R0 K45 - 0x8C0C0730, // 0007 GETMET R3 R3 K48 - 0x7C0C0200, // 0008 CALL R3 1 - 0x140C0203, // 0009 LT R3 R1 R3 - 0x780E0015, // 000A JMPF R3 #0021 - 0x880C012D, // 000B GETMBR R3 R0 K45 - 0x940C0601, // 000C GETIDX R3 R3 R1 - 0x88100731, // 000D GETMBR R4 R3 K49 - 0x1C10091C, // 000E EQ R4 R4 K28 - 0x78120003, // 000F JMPF R4 #0014 - 0x8C100732, // 0010 GETMET R4 R3 K50 - 0x7C100200, // 0011 CALL R4 1 - 0x900E6204, // 0012 SETMBR R3 K49 R4 - 0x7002000A, // 0013 JMP #001F - 0x8C100733, // 0014 GETMET R4 R3 K51 - 0x7C100200, // 0015 CALL R4 1 - 0x78120007, // 0016 JMPF R4 #001F - 0x88100734, // 0017 GETMBR R4 R3 K52 - 0x8C140732, // 0018 GETMET R5 R3 K50 - 0x7C140200, // 0019 CALL R5 1 - 0x900E6205, // 001A SETMBR R3 K49 R5 - 0x5C180800, // 001B MOVE R6 R4 - 0x5C1C0400, // 001C MOVE R7 R2 - 0x5C200A00, // 001D MOVE R8 R5 - 0x7C180400, // 001E CALL R6 2 - 0x00040305, // 001F ADD R1 R1 K5 - 0x7001FFE4, // 0020 JMP #0006 - 0x80000000, // 0021 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_timer -********************************************************************/ -be_local_closure(class_Tasmota_set_timer, /* name */ - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_set_timer, - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x8C100135, // 0000 GETMET R4 R0 K53 - 0x5C180400, // 0001 MOVE R6 R2 - 0x7C100400, // 0002 CALL R4 2 - 0x88100136, // 0003 GETMBR R4 R0 K54 - 0x4C140000, // 0004 LDNIL R5 - 0x1C100805, // 0005 EQ R4 R4 R5 - 0x78120002, // 0006 JMPF R4 #000A - 0x60100012, // 0007 GETGBL R4 G18 - 0x7C100000, // 0008 CALL R4 0 - 0x90026C04, // 0009 SETMBR R0 K54 R4 - 0x88100136, // 000A GETMBR R4 R0 K54 - 0x8C100937, // 000B GETMET R4 R4 K55 - 0xB81A7000, // 000C GETNGBL R6 K56 - 0x8C1C0139, // 000D GETMET R7 R0 K57 - 0x5C240200, // 000E MOVE R9 R1 - 0x7C1C0400, // 000F CALL R7 2 - 0x5C200400, // 0010 MOVE R8 R2 - 0x5C240600, // 0011 MOVE R9 R3 - 0x7C180600, // 0012 CALL R6 3 - 0x7C100400, // 0013 CALL R4 2 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: add_driver -********************************************************************/ -be_local_closure(class_Tasmota_add_driver, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_add_driver, - &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0x60080004, // 0000 GETGBL R2 G4 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x2008053A, // 0003 NE R2 R2 K58 - 0x780A0000, // 0004 JMPF R2 #0006 - 0xB006773C, // 0005 RAISE 1 K59 K60 - 0x8808010D, // 0006 GETMBR R2 R0 K13 - 0x780A000B, // 0007 JMPF R2 #0014 - 0x8808010D, // 0008 GETMBR R2 R0 K13 - 0x8C08050E, // 0009 GETMET R2 R2 K14 - 0x5C100200, // 000A MOVE R4 R1 - 0x7C080400, // 000B CALL R2 2 - 0x4C0C0000, // 000C LDNIL R3 - 0x1C080403, // 000D EQ R2 R2 R3 - 0x780A0003, // 000E JMPF R2 #0013 - 0x8808010D, // 000F GETMBR R2 R0 K13 - 0x8C080537, // 0010 GETMET R2 R2 K55 - 0x5C100200, // 0011 MOVE R4 R1 - 0x7C080400, // 0012 CALL R2 2 - 0x70020003, // 0013 JMP #0018 - 0x60080012, // 0014 GETGBL R2 G18 - 0x7C080000, // 0015 CALL R2 0 - 0x400C0401, // 0016 CONNECT R3 R2 R1 - 0x90021A02, // 0017 SETMBR R0 K13 R2 - 0x80000000, // 0018 RET 0 + ( &(const binstruction[33]) { /* code */ + 0x4C0C0000, // 0000 LDNIL R3 + 0x200C0403, // 0001 NE R3 R2 R3 + 0x780E0005, // 0002 JMPF R3 #0009 + 0x8C0C0100, // 0003 GETMET R3 R0 K0 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0x740E0001, // 0006 JMPT R3 #0009 + 0x4C0C0000, // 0007 LDNIL R3 + 0x80040600, // 0008 RET 1 R3 + 0x880C0101, // 0009 GETMBR R3 R0 K1 + 0x8C0C0702, // 000A GETMET R3 R3 K2 + 0x7C0C0200, // 000B CALL R3 1 + 0x780E0006, // 000C JMPF R3 #0014 + 0x880C0101, // 000D GETMBR R3 R0 K1 + 0x8C0C0703, // 000E GETMET R3 R3 K3 + 0x5C140200, // 000F MOVE R5 R1 + 0x7C0C0400, // 0010 CALL R3 2 + 0x780E0001, // 0011 JMPF R3 #0014 + 0x880C0101, // 0012 GETMBR R3 R0 K1 + 0x80040600, // 0013 RET 1 R3 + 0x880C0104, // 0014 GETMBR R3 R0 K4 + 0x8C0C0702, // 0015 GETMET R3 R3 K2 + 0x7C0C0200, // 0016 CALL R3 1 + 0x780E0006, // 0017 JMPF R3 #001F + 0x880C0104, // 0018 GETMBR R3 R0 K4 + 0x8C0C0703, // 0019 GETMET R3 R3 K3 + 0x5C140200, // 001A MOVE R5 R1 + 0x7C0C0400, // 001B CALL R3 2 + 0x780E0001, // 001C JMPF R3 #001F + 0x880C0104, // 001D GETMBR R3 R0 K4 + 0x80040600, // 001E RET 1 R3 + 0x4C0C0000, // 001F LDNIL R3 + 0x80040600, // 0020 RET 1 R3 }) ) ); @@ -674,21 +242,21 @@ be_local_closure(class_Tasmota_next_cron, /* name */ &be_const_str_next_cron, &be_const_str_solidified, ( &(const binstruction[17]) { /* code */ - 0x8808012D, // 0000 GETMBR R2 R0 K45 + 0x88080105, // 0000 GETMBR R2 R0 K5 0x780A000D, // 0001 JMPF R2 #0010 - 0x580C001C, // 0002 LDCONST R3 K28 - 0x8C100530, // 0003 GETMET R4 R2 K48 + 0x580C0006, // 0002 LDCONST R3 K6 + 0x8C100507, // 0003 GETMET R4 R2 K7 0x7C100200, // 0004 CALL R4 1 0x14100604, // 0005 LT R4 R3 R4 0x78120008, // 0006 JMPF R4 #0010 0x94100403, // 0007 GETIDX R4 R2 R3 - 0x8810093D, // 0008 GETMBR R4 R4 K61 + 0x88100908, // 0008 GETMBR R4 R4 K8 0x1C100801, // 0009 EQ R4 R4 R1 0x78120002, // 000A JMPF R4 #000E 0x94100403, // 000B GETIDX R4 R2 R3 - 0x88100931, // 000C GETMBR R4 R4 K49 + 0x88100909, // 000C GETMBR R4 R4 K9 0x80040800, // 000D RET 1 R4 - 0x000C0705, // 000E ADD R3 R3 K5 + 0x000C070A, // 000E ADD R3 R3 K10 0x7001FFF2, // 000F JMP #0003 0x80000000, // 0010 RET 0 }) @@ -697,6 +265,549 @@ be_local_closure(class_Tasmota_next_cron, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: check_not_method +********************************************************************/ +be_local_closure(class_Tasmota_check_not_method, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_check_not_method, + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0xA40A1600, // 0000 IMPORT R2 K11 + 0x600C0004, // 0001 GETGBL R3 G4 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x200C070C, // 0004 NE R3 R3 K12 + 0x780E0000, // 0005 JMPF R3 #0007 + 0xB0061B0E, // 0006 RAISE 1 K13 K14 + 0x8C0C050F, // 0007 GETMET R3 R2 K15 + 0x5C140200, // 0008 MOVE R5 R1 + 0x7C0C0400, // 0009 CALL R3 2 + 0x50100200, // 000A LDBOOL R4 1 0 + 0x1C0C0604, // 000B EQ R3 R3 R4 + 0x780E0000, // 000C JMPF R3 #000E + 0xB0061B10, // 000D RAISE 1 K13 K16 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: find_list_i +********************************************************************/ +be_local_closure(class_Tasmota_find_list_i, /* name */ + be_nested_proto( + 9, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_find_list_i, + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0xA40E2200, // 0000 IMPORT R3 K17 + 0x58100006, // 0001 LDCONST R4 K6 + 0x8C140712, // 0002 GETMET R5 R3 K18 + 0x5C1C0400, // 0003 MOVE R7 R2 + 0x7C140400, // 0004 CALL R5 2 + 0x6018000C, // 0005 GETGBL R6 G12 + 0x5C1C0200, // 0006 MOVE R7 R1 + 0x7C180200, // 0007 CALL R6 1 + 0x14180806, // 0008 LT R6 R4 R6 + 0x781A0007, // 0009 JMPF R6 #0012 + 0x8C180712, // 000A GETMET R6 R3 K18 + 0x94200204, // 000B GETIDX R8 R1 R4 + 0x7C180400, // 000C CALL R6 2 + 0x1C180C05, // 000D EQ R6 R6 R5 + 0x781A0000, // 000E JMPF R6 #0010 + 0x80040800, // 000F RET 1 R4 + 0x0010090A, // 0010 ADD R4 R4 K10 + 0x7001FFF2, // 0011 JMP #0005 + 0x4C180000, // 0012 LDNIL R6 + 0x80040C00, // 0013 RET 1 R6 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: time_str +********************************************************************/ +be_local_closure(class_Tasmota_time_str, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_time_str, + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x8C080113, // 0000 GETMET R2 R0 K19 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x600C0018, // 0003 GETGBL R3 G24 + 0x58100014, // 0004 LDCONST R4 K20 + 0x94140515, // 0005 GETIDX R5 R2 K21 + 0x94180516, // 0006 GETIDX R6 R2 K22 + 0x941C0517, // 0007 GETIDX R7 R2 K23 + 0x94200518, // 0008 GETIDX R8 R2 K24 + 0x94240519, // 0009 GETIDX R9 R2 K25 + 0x9428051A, // 000A GETIDX R10 R2 K26 + 0x7C0C0E00, // 000B CALL R3 7 + 0x80040600, // 000C RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: try_rule +********************************************************************/ +be_local_closure(class_Tasmota_try_rule, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_try_rule, + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x8C10051B, // 0000 GETMET R4 R2 K27 + 0x5C180200, // 0001 MOVE R6 R1 + 0x7C100400, // 0002 CALL R4 2 + 0x4C140000, // 0003 LDNIL R5 + 0x20140805, // 0004 NE R5 R4 R5 + 0x78160009, // 0005 JMPF R5 #0010 + 0x4C140000, // 0006 LDNIL R5 + 0x20140605, // 0007 NE R5 R3 R5 + 0x78160004, // 0008 JMPF R5 #000E + 0x5C140600, // 0009 MOVE R5 R3 + 0x5C180800, // 000A MOVE R6 R4 + 0x881C051C, // 000B GETMBR R7 R2 K28 + 0x5C200200, // 000C MOVE R8 R1 + 0x7C140600, // 000D CALL R5 3 + 0x50140200, // 000E LDBOOL R5 1 0 + 0x80040A00, // 000F RET 1 R5 + 0x50140000, // 0010 LDBOOL R5 0 0 + 0x80040A00, // 0011 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_driver +********************************************************************/ +be_local_closure(class_Tasmota_remove_driver, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_remove_driver, + &be_const_str_solidified, + ( &(const binstruction[14]) { /* code */ + 0x8808011D, // 0000 GETMBR R2 R0 K29 + 0x780A000A, // 0001 JMPF R2 #000D + 0x8808011D, // 0002 GETMBR R2 R0 K29 + 0x8C08051E, // 0003 GETMET R2 R2 K30 + 0x5C100200, // 0004 MOVE R4 R1 + 0x7C080400, // 0005 CALL R2 2 + 0x4C0C0000, // 0006 LDNIL R3 + 0x200C0403, // 0007 NE R3 R2 R3 + 0x780E0003, // 0008 JMPF R3 #000D + 0x880C011D, // 0009 GETMBR R3 R0 K29 + 0x8C0C071F, // 000A GETMET R3 R3 K31 + 0x5C140400, // 000B MOVE R5 R2 + 0x7C0C0400, // 000C CALL R3 2 + 0x80000000, // 000D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: exec_tele +********************************************************************/ +be_local_closure(class_Tasmota_exec_tele, /* name */ + be_nested_proto( + 12, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_exec_tele, + &be_const_str_solidified, + ( &(const binstruction[41]) { /* code */ + 0x88080120, // 0000 GETMBR R2 R0 K32 + 0x780A0024, // 0001 JMPF R2 #0027 + 0xA40A4200, // 0002 IMPORT R2 K33 + 0x8C0C0522, // 0003 GETMET R3 R2 K34 + 0x5C140200, // 0004 MOVE R5 R1 + 0x7C0C0400, // 0005 CALL R3 2 + 0x50100000, // 0006 LDBOOL R4 0 0 + 0x4C140000, // 0007 LDNIL R5 + 0x1C140605, // 0008 EQ R5 R3 R5 + 0x78160004, // 0009 JMPF R5 #000F + 0x8C140123, // 000A GETMET R5 R0 K35 + 0x001E4801, // 000B ADD R7 K36 R1 + 0x58200025, // 000C LDCONST R8 K37 + 0x7C140600, // 000D CALL R5 3 + 0x5C0C0200, // 000E MOVE R3 R1 + 0x60140013, // 000F GETGBL R5 G19 + 0x7C140000, // 0010 CALL R5 0 + 0x98164C03, // 0011 SETIDX R5 K38 R3 + 0x5C0C0A00, // 0012 MOVE R3 R5 + 0x58140006, // 0013 LDCONST R5 K6 + 0x6018000C, // 0014 GETGBL R6 G12 + 0x881C0120, // 0015 GETMBR R7 R0 K32 + 0x7C180200, // 0016 CALL R6 1 + 0x14180A06, // 0017 LT R6 R5 R6 + 0x781A000C, // 0018 JMPF R6 #0026 + 0x88180120, // 0019 GETMBR R6 R0 K32 + 0x94180C05, // 001A GETIDX R6 R6 R5 + 0x8C1C0127, // 001B GETMET R7 R0 K39 + 0x5C240600, // 001C MOVE R9 R3 + 0x88280D09, // 001D GETMBR R10 R6 K9 + 0x882C0D28, // 001E GETMBR R11 R6 K40 + 0x7C1C0800, // 001F CALL R7 4 + 0x741E0001, // 0020 JMPT R7 #0023 + 0x74120000, // 0021 JMPT R4 #0023 + 0x50100001, // 0022 LDBOOL R4 0 1 + 0x50100200, // 0023 LDBOOL R4 1 0 + 0x00140B0A, // 0024 ADD R5 R5 K10 + 0x7001FFED, // 0025 JMP #0014 + 0x80040800, // 0026 RET 1 R4 + 0x50080000, // 0027 LDBOOL R2 0 0 + 0x80040400, // 0028 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: run_cron +********************************************************************/ +be_local_closure(class_Tasmota_run_cron, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_run_cron, + &be_const_str_solidified, + ( &(const binstruction[34]) { /* code */ + 0x88040105, // 0000 GETMBR R1 R0 K5 + 0x7806001E, // 0001 JMPF R1 #0021 + 0x58040006, // 0002 LDCONST R1 K6 + 0xB80A5200, // 0003 GETNGBL R2 K41 + 0x8C08052A, // 0004 GETMET R2 R2 K42 + 0x7C080200, // 0005 CALL R2 1 + 0x880C0105, // 0006 GETMBR R3 R0 K5 + 0x8C0C0707, // 0007 GETMET R3 R3 K7 + 0x7C0C0200, // 0008 CALL R3 1 + 0x140C0203, // 0009 LT R3 R1 R3 + 0x780E0015, // 000A JMPF R3 #0021 + 0x880C0105, // 000B GETMBR R3 R0 K5 + 0x940C0601, // 000C GETIDX R3 R3 R1 + 0x88100709, // 000D GETMBR R4 R3 K9 + 0x1C100906, // 000E EQ R4 R4 K6 + 0x78120003, // 000F JMPF R4 #0014 + 0x8C10072B, // 0010 GETMET R4 R3 K43 + 0x7C100200, // 0011 CALL R4 1 + 0x900E1204, // 0012 SETMBR R3 K9 R4 + 0x7002000A, // 0013 JMP #001F + 0x8C10072C, // 0014 GETMET R4 R3 K44 + 0x7C100200, // 0015 CALL R4 1 + 0x78120007, // 0016 JMPF R4 #001F + 0x88100728, // 0017 GETMBR R4 R3 K40 + 0x8C14072B, // 0018 GETMET R5 R3 K43 + 0x7C140200, // 0019 CALL R5 1 + 0x900E1205, // 001A SETMBR R3 K9 R5 + 0x5C180800, // 001B MOVE R6 R4 + 0x5C1C0400, // 001C MOVE R7 R2 + 0x5C200A00, // 001D MOVE R8 R5 + 0x7C180400, // 001E CALL R6 2 + 0x0004030A, // 001F ADD R1 R1 K10 + 0x7001FFE4, // 0020 JMP #0006 + 0x80000000, // 0021 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: defer +********************************************************************/ +be_local_closure(class_Tasmota_defer, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_defer, + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x8808012D, // 0000 GETMBR R2 R0 K45 + 0x4C0C0000, // 0001 LDNIL R3 + 0x1C080403, // 0002 EQ R2 R2 R3 + 0x780A0002, // 0003 JMPF R2 #0007 + 0x60080012, // 0004 GETGBL R2 G18 + 0x7C080000, // 0005 CALL R2 0 + 0x90025A02, // 0006 SETMBR R0 K45 R2 + 0x8808012D, // 0007 GETMBR R2 R0 K45 + 0x8C08052E, // 0008 GETMET R2 R2 K46 + 0x5C100200, // 0009 MOVE R4 R1 + 0x7C080400, // 000A CALL R2 2 + 0xB80A5E00, // 000B GETNGBL R2 K47 + 0x88080530, // 000C GETMBR R2 R2 K48 + 0x900A630A, // 000D SETMBR R2 K49 K10 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: hs2rgb +********************************************************************/ +be_local_closure(class_Tasmota_hs2rgb, /* name */ + be_nested_proto( + 17, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_hs2rgb, + &be_const_str_solidified, + ( &(const binstruction[68]) { /* code */ + 0x4C0C0000, // 0000 LDNIL R3 + 0x1C0C0403, // 0001 EQ R3 R2 R3 + 0x780E0000, // 0002 JMPF R3 #0004 + 0x540A00FE, // 0003 LDINT R2 255 + 0x540E00FE, // 0004 LDINT R3 255 + 0x541200FE, // 0005 LDINT R4 255 + 0x541600FE, // 0006 LDINT R5 255 + 0x541A0167, // 0007 LDINT R6 360 + 0x10040206, // 0008 MOD R1 R1 R6 + 0x24180506, // 0009 GT R6 R2 K6 + 0x781A0031, // 000A JMPF R6 #003D + 0x541A003B, // 000B LDINT R6 60 + 0x0C180206, // 000C DIV R6 R1 R6 + 0x541E003B, // 000D LDINT R7 60 + 0x101C0207, // 000E MOD R7 R1 R7 + 0x542200FE, // 000F LDINT R8 255 + 0x04201002, // 0010 SUB R8 R8 R2 + 0xB8265E00, // 0011 GETNGBL R9 K47 + 0x8C241332, // 0012 GETMET R9 R9 K50 + 0x5C2C0E00, // 0013 MOVE R11 R7 + 0x58300006, // 0014 LDCONST R12 K6 + 0x5436003B, // 0015 LDINT R13 60 + 0x543A00FE, // 0016 LDINT R14 255 + 0x5C3C1000, // 0017 MOVE R15 R8 + 0x7C240C00, // 0018 CALL R9 6 + 0xB82A5E00, // 0019 GETNGBL R10 K47 + 0x8C281532, // 001A GETMET R10 R10 K50 + 0x5C300E00, // 001B MOVE R12 R7 + 0x58340006, // 001C LDCONST R13 K6 + 0x543A003B, // 001D LDINT R14 60 + 0x5C3C1000, // 001E MOVE R15 R8 + 0x544200FE, // 001F LDINT R16 255 + 0x7C280C00, // 0020 CALL R10 6 + 0x1C2C0D06, // 0021 EQ R11 R6 K6 + 0x782E0002, // 0022 JMPF R11 #0026 + 0x5C141400, // 0023 MOVE R5 R10 + 0x5C101000, // 0024 MOVE R4 R8 + 0x70020016, // 0025 JMP #003D + 0x1C2C0D0A, // 0026 EQ R11 R6 K10 + 0x782E0002, // 0027 JMPF R11 #002B + 0x5C0C1200, // 0028 MOVE R3 R9 + 0x5C101000, // 0029 MOVE R4 R8 + 0x70020011, // 002A JMP #003D + 0x1C2C0D33, // 002B EQ R11 R6 K51 + 0x782E0002, // 002C JMPF R11 #0030 + 0x5C0C1000, // 002D MOVE R3 R8 + 0x5C101400, // 002E MOVE R4 R10 + 0x7002000C, // 002F JMP #003D + 0x1C2C0D25, // 0030 EQ R11 R6 K37 + 0x782E0002, // 0031 JMPF R11 #0035 + 0x5C0C1000, // 0032 MOVE R3 R8 + 0x5C141200, // 0033 MOVE R5 R9 + 0x70020007, // 0034 JMP #003D + 0x542E0003, // 0035 LDINT R11 4 + 0x1C2C0C0B, // 0036 EQ R11 R6 R11 + 0x782E0002, // 0037 JMPF R11 #003B + 0x5C0C1400, // 0038 MOVE R3 R10 + 0x5C141000, // 0039 MOVE R5 R8 + 0x70020001, // 003A JMP #003D + 0x5C141000, // 003B MOVE R5 R8 + 0x5C101200, // 003C MOVE R4 R9 + 0x541A000F, // 003D LDINT R6 16 + 0x38180606, // 003E SHL R6 R3 R6 + 0x541E0007, // 003F LDINT R7 8 + 0x381C0A07, // 0040 SHL R7 R5 R7 + 0x30180C07, // 0041 OR R6 R6 R7 + 0x30180C04, // 0042 OR R6 R6 R4 + 0x80040C00, // 0043 RET 1 R6 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_fast_loop +********************************************************************/ +be_local_closure(class_Tasmota_remove_fast_loop, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_remove_fast_loop, + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x88080134, // 0000 GETMBR R2 R0 K52 + 0x740A0000, // 0001 JMPT R2 #0003 + 0x80000400, // 0002 RET 0 + 0x88080134, // 0003 GETMBR R2 R0 K52 + 0x8C08051E, // 0004 GETMET R2 R2 K30 + 0x5C100200, // 0005 MOVE R4 R1 + 0x7C080400, // 0006 CALL R2 2 + 0x4C0C0000, // 0007 LDNIL R3 + 0x200C0403, // 0008 NE R3 R2 R3 + 0x780E0003, // 0009 JMPF R3 #000E + 0x880C0134, // 000A GETMBR R3 R0 K52 + 0x8C0C0735, // 000B GETMET R3 R3 K53 + 0x5C140400, // 000C MOVE R5 R2 + 0x7C0C0400, // 000D CALL R3 2 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: add_rule +********************************************************************/ +be_local_closure(class_Tasmota_add_rule, /* name */ + be_nested_proto( + 12, /* nstack */ + 5, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_add_rule, + &be_const_str_solidified, + ( &(const binstruction[37]) { /* code */ + 0x8C140136, // 0000 GETMET R5 R0 K54 + 0x5C1C0400, // 0001 MOVE R7 R2 + 0x7C140400, // 0002 CALL R5 2 + 0x88140120, // 0003 GETMBR R5 R0 K32 + 0x4C180000, // 0004 LDNIL R6 + 0x1C140A06, // 0005 EQ R5 R5 R6 + 0x78160002, // 0006 JMPF R5 #000A + 0x60140012, // 0007 GETGBL R5 G18 + 0x7C140000, // 0008 CALL R5 0 + 0x90024005, // 0009 SETMBR R0 K32 R5 + 0x60140004, // 000A GETGBL R5 G4 + 0x5C180400, // 000B MOVE R6 R2 + 0x7C140200, // 000C CALL R5 1 + 0x1C140B0C, // 000D EQ R5 R5 K12 + 0x78160013, // 000E JMPF R5 #0023 + 0x4C140000, // 000F LDNIL R5 + 0x20140605, // 0010 NE R5 R3 R5 + 0x78160003, // 0011 JMPF R5 #0016 + 0x8C140137, // 0012 GETMET R5 R0 K55 + 0x5C1C0200, // 0013 MOVE R7 R1 + 0x5C200600, // 0014 MOVE R8 R3 + 0x7C140600, // 0015 CALL R5 3 + 0x88140120, // 0016 GETMBR R5 R0 K32 + 0x8C140B2E, // 0017 GETMET R5 R5 K46 + 0xB81E7000, // 0018 GETNGBL R7 K56 + 0x88200139, // 0019 GETMBR R8 R0 K57 + 0x8C20113A, // 001A GETMET R8 R8 K58 + 0x5C280200, // 001B MOVE R10 R1 + 0x7C200400, // 001C CALL R8 2 + 0x5C240400, // 001D MOVE R9 R2 + 0x5C280600, // 001E MOVE R10 R3 + 0x5C2C0800, // 001F MOVE R11 R4 + 0x7C1C0800, // 0020 CALL R7 4 + 0x7C140400, // 0021 CALL R5 2 + 0x70020000, // 0022 JMP #0024 + 0xB006773C, // 0023 RAISE 1 K59 K60 + 0x80000000, // 0024 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -742,22 +853,22 @@ be_local_closure(class_Tasmota_init, /* name */ &be_const_str_init, &be_const_str_solidified, ( &(const binstruction[34]) { /* code */ - 0xB8067C00, // 0000 GETNGBL R1 K62 - 0x8808013F, // 0001 GETMBR R2 R0 K63 - 0x880C0140, // 0002 GETMBR R3 R0 K64 + 0xB8067A00, // 0000 GETNGBL R1 K61 + 0x8808013E, // 0001 GETMBR R2 R0 K62 + 0x880C013F, // 0002 GETMBR R3 R0 K63 0x7C040400, // 0003 CALL R1 2 - 0x90020401, // 0004 SETMBR R0 K2 R1 - 0xA4060E00, // 0005 IMPORT R1 K7 + 0x90026001, // 0004 SETMBR R0 K48 R1 + 0xA4061600, // 0005 IMPORT R1 K11 0x60080015, // 0006 GETGBL R2 G21 - 0x880C0141, // 0007 GETMBR R3 R0 K65 + 0x880C0140, // 0007 GETMBR R3 R0 K64 0x54120003, // 0008 LDINT R4 4 0x7C080400, // 0009 CALL R2 2 - 0x8C08051D, // 000A GETMET R2 R2 K29 - 0x5810001C, // 000B LDCONST R4 K28 + 0x8C080541, // 000A GETMET R2 R2 K65 + 0x58100006, // 000B LDCONST R4 K6 0x54160003, // 000C LDINT R5 4 0x7C080600, // 000D CALL R2 3 0x780A0006, // 000E JMPF R2 #0016 - 0xB80E7C00, // 000F GETNGBL R3 K62 + 0xB80E7A00, // 000F GETNGBL R3 K61 0x8C100343, // 0010 GETMET R4 R1 K67 0x5C180400, // 0011 MOVE R6 R2 0x7C100400, // 0012 CALL R4 2 @@ -765,13 +876,13 @@ be_local_closure(class_Tasmota_init, /* name */ 0x7C0C0400, // 0014 CALL R3 2 0x90028403, // 0015 SETMBR R0 K66 R3 0x90028B46, // 0016 SETMBR R0 K69 K70 - 0xB80E0400, // 0017 GETNGBL R3 K2 - 0x8C0C0747, // 0018 GETMET R3 R3 K71 - 0x58140020, // 0019 LDCONST R5 K32 + 0xB80E6000, // 0017 GETNGBL R3 K48 + 0x8C0C0748, // 0018 GETMET R3 R3 K72 + 0x58140049, // 0019 LDCONST R5 K73 0x7C0C0400, // 001A CALL R3 2 - 0x90023E03, // 001B SETMBR R0 K31 R3 - 0x8C0C0148, // 001C GETMET R3 R0 K72 - 0x58140049, // 001D LDCONST R5 K73 + 0x90028E03, // 001B SETMBR R0 K71 R3 + 0x8C0C014A, // 001C GETMET R3 R0 K74 + 0x5814004B, // 001D LDCONST R5 K75 0x84180000, // 001E CLOSURE R6 P0 0x7C0C0600, // 001F CALL R3 3 0xA0000000, // 0020 CLOSE R0 @@ -783,11 +894,11 @@ be_local_closure(class_Tasmota_init, /* name */ /******************************************************************** -** Solidified function: add_rule +** Solidified function: add_cron ********************************************************************/ -be_local_closure(class_Tasmota_add_rule, /* name */ +be_local_closure(class_Tasmota_add_cron, /* name */ be_nested_proto( - 10, /* nstack */ + 13, /* nstack */ 4, /* argc */ 10, /* varg */ 0, /* has upvals */ @@ -796,591 +907,35 @@ be_local_closure(class_Tasmota_add_rule, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_add_rule, + &be_const_str_add_cron, &be_const_str_solidified, - ( &(const binstruction[29]) { /* code */ - 0x8C100135, // 0000 GETMET R4 R0 K53 + ( &(const binstruction[27]) { /* code */ + 0x8C100136, // 0000 GETMET R4 R0 K54 0x5C180400, // 0001 MOVE R6 R2 0x7C100400, // 0002 CALL R4 2 - 0x8810014A, // 0003 GETMBR R4 R0 K74 + 0x88100105, // 0003 GETMBR R4 R0 K5 0x4C140000, // 0004 LDNIL R5 0x1C100805, // 0005 EQ R4 R4 R5 0x78120002, // 0006 JMPF R4 #000A 0x60100012, // 0007 GETGBL R4 G18 0x7C100000, // 0008 CALL R4 0 - 0x90029404, // 0009 SETMBR R0 K74 R4 - 0x60100004, // 000A GETGBL R4 G4 - 0x5C140400, // 000B MOVE R5 R2 - 0x7C100200, // 000C CALL R4 1 - 0x1C100908, // 000D EQ R4 R4 K8 - 0x7812000B, // 000E JMPF R4 #001B - 0x8810014A, // 000F GETMBR R4 R0 K74 - 0x8C100937, // 0010 GETMET R4 R4 K55 - 0xB81A7000, // 0011 GETNGBL R6 K56 - 0x881C014B, // 0012 GETMBR R7 R0 K75 - 0x8C1C0F4C, // 0013 GETMET R7 R7 K76 - 0x5C240200, // 0014 MOVE R9 R1 - 0x7C1C0400, // 0015 CALL R7 2 - 0x5C200400, // 0016 MOVE R8 R2 - 0x5C240600, // 0017 MOVE R9 R3 - 0x7C180600, // 0018 CALL R6 3 - 0x7C100400, // 0019 CALL R4 2 - 0x70020000, // 001A JMP #001C - 0xB006774D, // 001B RAISE 1 K59 K77 - 0x80000000, // 001C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: try_rule -********************************************************************/ -be_local_closure(class_Tasmota_try_rule, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_try_rule, - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x8C10054E, // 0000 GETMET R4 R2 K78 - 0x5C180200, // 0001 MOVE R6 R1 - 0x7C100400, // 0002 CALL R4 2 - 0x4C140000, // 0003 LDNIL R5 - 0x20140805, // 0004 NE R5 R4 R5 - 0x78160009, // 0005 JMPF R5 #0010 - 0x4C140000, // 0006 LDNIL R5 - 0x20140605, // 0007 NE R5 R3 R5 - 0x78160004, // 0008 JMPF R5 #000E - 0x5C140600, // 0009 MOVE R5 R3 - 0x5C180800, // 000A MOVE R6 R4 - 0x881C054F, // 000B GETMBR R7 R2 K79 - 0x5C200200, // 000C MOVE R8 R1 - 0x7C140600, // 000D CALL R5 3 - 0x50140200, // 000E LDBOOL R5 1 0 - 0x80040A00, // 000F RET 1 R5 - 0x50140000, // 0010 LDBOOL R5 0 0 - 0x80040A00, // 0011 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: find_op -********************************************************************/ -be_local_closure(class_Tasmota_find_op, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_find_op, - &be_const_str_solidified, - ( &(const binstruction[31]) { /* code */ - 0x8C080150, // 0000 GETMET R2 R0 K80 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x280C051C, // 0003 GE R3 R2 K28 - 0x780E0011, // 0004 JMPF R3 #0017 - 0x540E7FFE, // 0005 LDINT R3 32767 - 0x2C0C0403, // 0006 AND R3 R2 R3 - 0x5412000F, // 0007 LDINT R4 16 - 0x3C100404, // 0008 SHR R4 R2 R4 - 0x60140012, // 0009 GETGBL R5 G18 - 0x7C140000, // 000A CALL R5 0 - 0x04180705, // 000B SUB R6 R3 K5 - 0x401A3806, // 000C CONNECT R6 K28 R6 - 0x94180206, // 000D GETIDX R6 R1 R6 - 0x40180A06, // 000E CONNECT R6 R5 R6 - 0x04180905, // 000F SUB R6 R4 K5 - 0x40180606, // 0010 CONNECT R6 R3 R6 - 0x94180206, // 0011 GETIDX R6 R1 R6 - 0x40180A06, // 0012 CONNECT R6 R5 R6 - 0x40180951, // 0013 CONNECT R6 R4 K81 - 0x94180206, // 0014 GETIDX R6 R1 R6 - 0x40180A06, // 0015 CONNECT R6 R5 R6 - 0x80040A00, // 0016 RET 1 R5 - 0x600C0012, // 0017 GETGBL R3 G18 - 0x7C0C0000, // 0018 CALL R3 0 - 0x40100601, // 0019 CONNECT R4 R3 R1 - 0x4C100000, // 001A LDNIL R4 - 0x40100604, // 001B CONNECT R4 R3 R4 - 0x4C100000, // 001C LDNIL R4 - 0x40100604, // 001D CONNECT R4 R3 R4 - 0x80040600, // 001E RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: remove_cmd -********************************************************************/ -be_local_closure(class_Tasmota_remove_cmd, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_remove_cmd, - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88080125, // 0000 GETMBR R2 R0 K37 - 0x780A0003, // 0001 JMPF R2 #0006 - 0x88080125, // 0002 GETMBR R2 R0 K37 - 0x8C080552, // 0003 GETMET R2 R2 K82 - 0x5C100200, // 0004 MOVE R4 R1 - 0x7C080400, // 0005 CALL R2 2 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: gc -********************************************************************/ -be_local_closure(class_Tasmota_gc, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_gc, - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0xA4063600, // 0000 IMPORT R1 K27 - 0x8C080353, // 0001 GETMET R2 R1 K83 - 0x7C080200, // 0002 CALL R2 1 - 0x8C080354, // 0003 GETMET R2 R1 K84 - 0x7C080200, // 0004 CALL R2 1 - 0x80040400, // 0005 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: find_list_i -********************************************************************/ -be_local_closure(class_Tasmota_find_list_i, /* name */ - be_nested_proto( - 9, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_find_list_i, - &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0xA40EAA00, // 0000 IMPORT R3 K85 - 0x5810001C, // 0001 LDCONST R4 K28 - 0x8C140756, // 0002 GETMET R5 R3 K86 - 0x5C1C0400, // 0003 MOVE R7 R2 - 0x7C140400, // 0004 CALL R5 2 - 0x6018000C, // 0005 GETGBL R6 G12 - 0x5C1C0200, // 0006 MOVE R7 R1 - 0x7C180200, // 0007 CALL R6 1 - 0x14180806, // 0008 LT R6 R4 R6 - 0x781A0007, // 0009 JMPF R6 #0012 - 0x8C180756, // 000A GETMET R6 R3 K86 - 0x94200204, // 000B GETIDX R8 R1 R4 - 0x7C180400, // 000C CALL R6 2 - 0x1C180C05, // 000D EQ R6 R6 R5 - 0x781A0000, // 000E JMPF R6 #0010 - 0x80040800, // 000F RET 1 R4 - 0x00100905, // 0010 ADD R4 R4 K5 - 0x7001FFF2, // 0011 JMP #0005 - 0x4C180000, // 0012 LDNIL R6 - 0x80040C00, // 0013 RET 1 R6 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: remove_fast_loop -********************************************************************/ -be_local_closure(class_Tasmota_remove_fast_loop, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_remove_fast_loop, - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88080157, // 0000 GETMBR R2 R0 K87 - 0x740A0000, // 0001 JMPT R2 #0003 - 0x80000400, // 0002 RET 0 - 0x88080157, // 0003 GETMBR R2 R0 K87 - 0x8C08050E, // 0004 GETMET R2 R2 K14 - 0x5C100200, // 0005 MOVE R4 R1 - 0x7C080400, // 0006 CALL R2 2 - 0x4C0C0000, // 0007 LDNIL R3 - 0x200C0403, // 0008 NE R3 R2 R3 - 0x780E0003, // 0009 JMPF R3 #000E - 0x880C0157, // 000A GETMBR R3 R0 K87 - 0x8C0C0752, // 000B GETMET R3 R3 K82 - 0x5C140400, // 000C MOVE R5 R2 - 0x7C0C0400, // 000D CALL R3 2 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: exec_rules -********************************************************************/ -be_local_closure(class_Tasmota_exec_rules, /* name */ - be_nested_proto( - 14, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_exec_rules, - &be_const_str_solidified, - ( &(const binstruction[50]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8810014A, // 0001 GETMBR R4 R0 K74 - 0x74120002, // 0002 JMPT R4 #0006 - 0x4C100000, // 0003 LDNIL R4 - 0x20100604, // 0004 NE R4 R3 R4 - 0x78120029, // 0005 JMPF R4 #0030 - 0xA4124C00, // 0006 IMPORT R4 K38 - 0x4C140000, // 0007 LDNIL R5 - 0x90020005, // 0008 SETMBR R0 K0 R5 - 0x50140000, // 0009 LDBOOL R5 0 0 - 0x8C180927, // 000A GETMET R6 R4 K39 - 0x5C200200, // 000B MOVE R8 R1 - 0x7C180400, // 000C CALL R6 2 - 0x4C1C0000, // 000D LDNIL R7 - 0x1C1C0C07, // 000E EQ R7 R6 R7 - 0x781E0004, // 000F JMPF R7 #0015 - 0x8C1C0158, // 0010 GETMET R7 R0 K88 - 0x0026B201, // 0011 ADD R9 K89 R1 - 0x5828005A, // 0012 LDCONST R10 K90 - 0x7C1C0600, // 0013 CALL R7 3 - 0x5C180200, // 0014 MOVE R6 R1 - 0x780A0014, // 0015 JMPF R2 #002B - 0x881C014A, // 0016 GETMBR R7 R0 K74 - 0x781E0012, // 0017 JMPF R7 #002B - 0x581C001C, // 0018 LDCONST R7 K28 - 0x6020000C, // 0019 GETGBL R8 G12 - 0x8824014A, // 001A GETMBR R9 R0 K74 - 0x7C200200, // 001B CALL R8 1 - 0x14200E08, // 001C LT R8 R7 R8 - 0x7822000C, // 001D JMPF R8 #002B - 0x8820014A, // 001E GETMBR R8 R0 K74 - 0x94201007, // 001F GETIDX R8 R8 R7 - 0x8C24015B, // 0020 GETMET R9 R0 K91 - 0x5C2C0C00, // 0021 MOVE R11 R6 - 0x88301131, // 0022 GETMBR R12 R8 K49 - 0x88341134, // 0023 GETMBR R13 R8 K52 - 0x7C240800, // 0024 CALL R9 4 - 0x74260001, // 0025 JMPT R9 #0028 - 0x74160000, // 0026 JMPT R5 #0028 - 0x50140001, // 0027 LDBOOL R5 0 1 - 0x50140200, // 0028 LDBOOL R5 1 0 - 0x001C0F05, // 0029 ADD R7 R7 K5 - 0x7001FFED, // 002A JMP #0019 - 0x4C1C0000, // 002B LDNIL R7 - 0x201C0607, // 002C NE R7 R3 R7 - 0x781E0000, // 002D JMPF R7 #002F - 0x90020006, // 002E SETMBR R0 K0 R6 - 0x80040A00, // 002F RET 1 R5 - 0x50100000, // 0030 LDBOOL R4 0 0 - 0x80040800, // 0031 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: run_deferred -********************************************************************/ -be_local_closure(class_Tasmota_run_deferred, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_run_deferred, - &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0x88040136, // 0000 GETMBR R1 R0 K54 - 0x78060015, // 0001 JMPF R1 #0018 - 0x5804001C, // 0002 LDCONST R1 K28 - 0x88080136, // 0003 GETMBR R2 R0 K54 - 0x8C080530, // 0004 GETMET R2 R2 K48 - 0x7C080200, // 0005 CALL R2 1 - 0x14080202, // 0006 LT R2 R1 R2 - 0x780A000F, // 0007 JMPF R2 #0018 - 0x88080136, // 0008 GETMBR R2 R0 K54 - 0x94080401, // 0009 GETIDX R2 R2 R1 - 0x8C0C0133, // 000A GETMET R3 R0 K51 - 0x88140531, // 000B GETMBR R5 R2 K49 - 0x7C0C0400, // 000C CALL R3 2 - 0x780E0007, // 000D JMPF R3 #0016 - 0x880C0534, // 000E GETMBR R3 R2 K52 - 0x88100136, // 000F GETMBR R4 R0 K54 - 0x8C100952, // 0010 GETMET R4 R4 K82 - 0x5C180200, // 0011 MOVE R6 R1 - 0x7C100400, // 0012 CALL R4 2 - 0x5C100600, // 0013 MOVE R4 R3 - 0x7C100000, // 0014 CALL R4 0 - 0x70020000, // 0015 JMP #0017 - 0x00040305, // 0016 ADD R1 R1 K5 - 0x7001FFEA, // 0017 JMP #0003 - 0x80000000, // 0018 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: compile -********************************************************************/ -be_local_closure(class_Tasmota_compile, /* name */ - be_nested_proto( - 12, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_compile, - &be_const_str_solidified, - ( &(const binstruction[84]) { /* code */ - 0xA40AAA00, // 0000 IMPORT R2 K85 - 0x8C0C055C, // 0001 GETMET R3 R2 K92 - 0x5C140200, // 0002 MOVE R5 R1 - 0x5818005D, // 0003 LDCONST R6 K93 - 0x7C0C0600, // 0004 CALL R3 3 - 0x740E0007, // 0005 JMPT R3 #000E - 0x600C0001, // 0006 GETGBL R3 G1 - 0x60100018, // 0007 GETGBL R4 G24 - 0x5814005E, // 0008 LDCONST R5 K94 - 0x5C180200, // 0009 MOVE R6 R1 - 0x7C100400, // 000A CALL R4 2 - 0x7C0C0200, // 000B CALL R3 1 - 0x500C0000, // 000C LDBOOL R3 0 0 - 0x80040600, // 000D RET 1 R3 - 0x8C0C050E, // 000E GETMET R3 R2 K14 - 0x5C140200, // 000F MOVE R5 R1 - 0x5818005F, // 0010 LDCONST R6 K95 - 0x7C0C0600, // 0011 CALL R3 3 - 0x240C071C, // 0012 GT R3 R3 K28 - 0x780E0006, // 0013 JMPF R3 #001B - 0x600C0001, // 0014 GETGBL R3 G1 - 0x60100018, // 0015 GETGBL R4 G24 - 0x58140060, // 0016 LDCONST R5 K96 - 0x7C100200, // 0017 CALL R4 1 - 0x7C0C0200, // 0018 CALL R3 1 - 0x500C0000, // 0019 LDBOOL R3 0 0 - 0x80040600, // 001A RET 1 R3 - 0x4C0C0000, // 001B LDNIL R3 - 0xA8020011, // 001C EXBLK 0 #002F - 0x6010000D, // 001D GETGBL R4 G13 - 0x5C140200, // 001E MOVE R5 R1 - 0x58180061, // 001F LDCONST R6 K97 - 0x7C100400, // 0020 CALL R4 2 - 0x5C0C0800, // 0021 MOVE R3 R4 - 0x4C100000, // 0022 LDNIL R4 - 0x1C100604, // 0023 EQ R4 R3 R4 - 0x78120007, // 0024 JMPF R4 #002D - 0x60100001, // 0025 GETGBL R4 G1 - 0x60140018, // 0026 GETGBL R5 G24 - 0x58180062, // 0027 LDCONST R6 K98 - 0x7C140200, // 0028 CALL R5 1 - 0x7C100200, // 0029 CALL R4 1 - 0x50100000, // 002A LDBOOL R4 0 0 - 0xA8040001, // 002B EXBLK 1 1 - 0x80040800, // 002C RET 1 R4 - 0xA8040001, // 002D EXBLK 1 1 - 0x7002000D, // 002E JMP #003D - 0xAC100002, // 002F CATCH R4 0 2 - 0x7002000A, // 0030 JMP #003C - 0x60180001, // 0031 GETGBL R6 G1 - 0x601C0018, // 0032 GETGBL R7 G24 - 0x58200063, // 0033 LDCONST R8 K99 - 0x5C240200, // 0034 MOVE R9 R1 - 0x5C280800, // 0035 MOVE R10 R4 - 0x5C2C0A00, // 0036 MOVE R11 R5 - 0x7C1C0800, // 0037 CALL R7 4 - 0x7C180200, // 0038 CALL R6 1 - 0x50180000, // 0039 LDBOOL R6 0 0 - 0x80040C00, // 003A RET 1 R6 - 0x70020000, // 003B JMP #003D - 0xB0080000, // 003C RAISE 2 R0 R0 - 0x00100364, // 003D ADD R4 R1 K100 - 0xA8020005, // 003E EXBLK 0 #0045 - 0x8C140124, // 003F GETMET R5 R0 K36 - 0x5C1C0800, // 0040 MOVE R7 R4 - 0x5C200600, // 0041 MOVE R8 R3 - 0x7C140600, // 0042 CALL R5 3 - 0xA8040001, // 0043 EXBLK 1 1 - 0x7002000C, // 0044 JMP #0052 - 0xAC140001, // 0045 CATCH R5 0 1 - 0x70020009, // 0046 JMP #0051 - 0x60180001, // 0047 GETGBL R6 G1 - 0x601C0018, // 0048 GETGBL R7 G24 - 0x58200065, // 0049 LDCONST R8 K101 - 0x5C240800, // 004A MOVE R9 R4 - 0x5C280A00, // 004B MOVE R10 R5 - 0x7C1C0600, // 004C CALL R7 3 - 0x7C180200, // 004D CALL R6 1 - 0x50180000, // 004E LDBOOL R6 0 0 - 0x80040C00, // 004F RET 1 R6 - 0x70020000, // 0050 JMP #0052 - 0xB0080000, // 0051 RAISE 2 R0 R0 - 0x50140200, // 0052 LDBOOL R5 1 0 - 0x80040A00, // 0053 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: remove_timer -********************************************************************/ -be_local_closure(class_Tasmota_remove_timer, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_remove_timer, - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x88080136, // 0000 GETMBR R2 R0 K54 - 0x780A000E, // 0001 JMPF R2 #0011 - 0x580C001C, // 0002 LDCONST R3 K28 - 0x8C100530, // 0003 GETMET R4 R2 K48 - 0x7C100200, // 0004 CALL R4 1 - 0x14100604, // 0005 LT R4 R3 R4 - 0x78120009, // 0006 JMPF R4 #0011 - 0x94100403, // 0007 GETIDX R4 R2 R3 - 0x8810093D, // 0008 GETMBR R4 R4 K61 - 0x1C100801, // 0009 EQ R4 R4 R1 - 0x78120003, // 000A JMPF R4 #000F - 0x8C100552, // 000B GETMET R4 R2 K82 - 0x5C180600, // 000C MOVE R6 R3 - 0x7C100400, // 000D CALL R4 2 - 0x70020000, // 000E JMP #0010 - 0x000C0705, // 000F ADD R3 R3 K5 - 0x7001FFF1, // 0010 JMP #0003 - 0x80000000, // 0011 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: remove_rule -********************************************************************/ -be_local_closure(class_Tasmota_remove_rule, /* name */ - be_nested_proto( - 7, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_remove_rule, - &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x880C014A, // 0000 GETMBR R3 R0 K74 - 0x780E0017, // 0001 JMPF R3 #001A - 0x580C001C, // 0002 LDCONST R3 K28 - 0x6010000C, // 0003 GETGBL R4 G12 - 0x8814014A, // 0004 GETMBR R5 R0 K74 - 0x7C100200, // 0005 CALL R4 1 - 0x14100604, // 0006 LT R4 R3 R4 - 0x78120011, // 0007 JMPF R4 #001A - 0x8810014A, // 0008 GETMBR R4 R0 K74 - 0x94100803, // 0009 GETIDX R4 R4 R3 - 0x88100931, // 000A GETMBR R4 R4 K49 - 0x88100919, // 000B GETMBR R4 R4 K25 - 0x1C100801, // 000C EQ R4 R4 R1 - 0x78120009, // 000D JMPF R4 #0018 - 0x8810014A, // 000E GETMBR R4 R0 K74 - 0x94100803, // 000F GETIDX R4 R4 R3 - 0x8810093D, // 0010 GETMBR R4 R4 K61 - 0x1C100802, // 0011 EQ R4 R4 R2 - 0x78120004, // 0012 JMPF R4 #0018 - 0x8810014A, // 0013 GETMBR R4 R0 K74 - 0x8C100952, // 0014 GETMET R4 R4 K82 - 0x5C180600, // 0015 MOVE R6 R3 - 0x7C100400, // 0016 CALL R4 2 - 0x70020000, // 0017 JMP #0019 - 0x000C0705, // 0018 ADD R3 R3 K5 - 0x7001FFE8, // 0019 JMP #0003 + 0x90020A04, // 0009 SETMBR R0 K5 R4 + 0xB8125200, // 000A GETNGBL R4 K41 + 0x60140008, // 000B GETGBL R5 G8 + 0x5C180200, // 000C MOVE R6 R1 + 0x7C140200, // 000D CALL R5 1 + 0x7C100200, // 000E CALL R4 1 + 0x8C14092B, // 000F GETMET R5 R4 K43 + 0x7C140200, // 0010 CALL R5 1 + 0x88180105, // 0011 GETMBR R6 R0 K5 + 0x8C180D2E, // 0012 GETMET R6 R6 K46 + 0xB8227000, // 0013 GETNGBL R8 K56 + 0x5C240A00, // 0014 MOVE R9 R5 + 0x5C280400, // 0015 MOVE R10 R2 + 0x5C2C0600, // 0016 MOVE R11 R3 + 0x5C300800, // 0017 MOVE R12 R4 + 0x7C200800, // 0018 CALL R8 4 + 0x7C180400, // 0019 CALL R6 2 0x80000000, // 001A RET 0 }) ) @@ -1389,175 +944,12 @@ be_local_closure(class_Tasmota_remove_rule, /* name */ /******************************************************************** -** Solidified function: exec_tele +** Solidified function: set_timer ********************************************************************/ -be_local_closure(class_Tasmota_exec_tele, /* name */ - be_nested_proto( - 12, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_exec_tele, - &be_const_str_solidified, - ( &(const binstruction[41]) { /* code */ - 0x8808014A, // 0000 GETMBR R2 R0 K74 - 0x780A0024, // 0001 JMPF R2 #0027 - 0xA40A4C00, // 0002 IMPORT R2 K38 - 0x8C0C0527, // 0003 GETMET R3 R2 K39 - 0x5C140200, // 0004 MOVE R5 R1 - 0x7C0C0400, // 0005 CALL R3 2 - 0x50100000, // 0006 LDBOOL R4 0 0 - 0x4C140000, // 0007 LDNIL R5 - 0x1C140605, // 0008 EQ R5 R3 R5 - 0x78160004, // 0009 JMPF R5 #000F - 0x8C140158, // 000A GETMET R5 R0 K88 - 0x001EB201, // 000B ADD R7 K89 R1 - 0x5820005A, // 000C LDCONST R8 K90 - 0x7C140600, // 000D CALL R5 3 - 0x5C0C0200, // 000E MOVE R3 R1 - 0x60140013, // 000F GETGBL R5 G19 - 0x7C140000, // 0010 CALL R5 0 - 0x9816CC03, // 0011 SETIDX R5 K102 R3 - 0x5C0C0A00, // 0012 MOVE R3 R5 - 0x5814001C, // 0013 LDCONST R5 K28 - 0x6018000C, // 0014 GETGBL R6 G12 - 0x881C014A, // 0015 GETMBR R7 R0 K74 - 0x7C180200, // 0016 CALL R6 1 - 0x14180A06, // 0017 LT R6 R5 R6 - 0x781A000C, // 0018 JMPF R6 #0026 - 0x8818014A, // 0019 GETMBR R6 R0 K74 - 0x94180C05, // 001A GETIDX R6 R6 R5 - 0x8C1C015B, // 001B GETMET R7 R0 K91 - 0x5C240600, // 001C MOVE R9 R3 - 0x88280D31, // 001D GETMBR R10 R6 K49 - 0x882C0D34, // 001E GETMBR R11 R6 K52 - 0x7C1C0800, // 001F CALL R7 4 - 0x741E0001, // 0020 JMPT R7 #0023 - 0x74120000, // 0021 JMPT R4 #0023 - 0x50100001, // 0022 LDBOOL R4 0 1 - 0x50100200, // 0023 LDBOOL R4 1 0 - 0x00140B05, // 0024 ADD R5 R5 K5 - 0x7001FFED, // 0025 JMP #0014 - 0x80040800, // 0026 RET 1 R4 - 0x50080000, // 0027 LDBOOL R2 0 0 - 0x80040400, // 0028 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: add_cmd -********************************************************************/ -be_local_closure(class_Tasmota_add_cmd, /* name */ - be_nested_proto( - 6, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_add_cmd, - &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x8C0C0135, // 0000 GETMET R3 R0 K53 - 0x5C140400, // 0001 MOVE R5 R2 - 0x7C0C0400, // 0002 CALL R3 2 - 0x880C0125, // 0003 GETMBR R3 R0 K37 - 0x4C100000, // 0004 LDNIL R4 - 0x1C0C0604, // 0005 EQ R3 R3 R4 - 0x780E0002, // 0006 JMPF R3 #000A - 0x600C0013, // 0007 GETGBL R3 G19 - 0x7C0C0000, // 0008 CALL R3 0 - 0x90024A03, // 0009 SETMBR R0 K37 R3 - 0x600C0004, // 000A GETGBL R3 G4 - 0x5C100400, // 000B MOVE R4 R2 - 0x7C0C0200, // 000C CALL R3 1 - 0x1C0C0708, // 000D EQ R3 R3 K8 - 0x780E0002, // 000E JMPF R3 #0012 - 0x880C0125, // 000F GETMBR R3 R0 K37 - 0x980C0202, // 0010 SETIDX R3 R1 R2 - 0x70020000, // 0011 JMP #0013 - 0xB006774D, // 0012 RAISE 1 K59 K77 - 0x80000000, // 0013 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: wire_scan -********************************************************************/ -be_local_closure(class_Tasmota_wire_scan, /* name */ - be_nested_proto( - 6, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_wire_scan, - &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ - 0x4C0C0000, // 0000 LDNIL R3 - 0x200C0403, // 0001 NE R3 R2 R3 - 0x780E0005, // 0002 JMPF R3 #0009 - 0x8C0C0167, // 0003 GETMET R3 R0 K103 - 0x5C140400, // 0004 MOVE R5 R2 - 0x7C0C0400, // 0005 CALL R3 2 - 0x740E0001, // 0006 JMPT R3 #0009 - 0x4C0C0000, // 0007 LDNIL R3 - 0x80040600, // 0008 RET 1 R3 - 0x880C0168, // 0009 GETMBR R3 R0 K104 - 0x8C0C0769, // 000A GETMET R3 R3 K105 - 0x7C0C0200, // 000B CALL R3 1 - 0x780E0006, // 000C JMPF R3 #0014 - 0x880C0168, // 000D GETMBR R3 R0 K104 - 0x8C0C076A, // 000E GETMET R3 R3 K106 - 0x5C140200, // 000F MOVE R5 R1 - 0x7C0C0400, // 0010 CALL R3 2 - 0x780E0001, // 0011 JMPF R3 #0014 - 0x880C0168, // 0012 GETMBR R3 R0 K104 - 0x80040600, // 0013 RET 1 R3 - 0x880C016B, // 0014 GETMBR R3 R0 K107 - 0x8C0C0769, // 0015 GETMET R3 R3 K105 - 0x7C0C0200, // 0016 CALL R3 1 - 0x780E0006, // 0017 JMPF R3 #001F - 0x880C016B, // 0018 GETMBR R3 R0 K107 - 0x8C0C076A, // 0019 GETMET R3 R3 K106 - 0x5C140200, // 001A MOVE R5 R1 - 0x7C0C0400, // 001B CALL R3 2 - 0x780E0001, // 001C JMPF R3 #001F - 0x880C016B, // 001D GETMBR R3 R0 K107 - 0x80040600, // 001E RET 1 R3 - 0x4C0C0000, // 001F LDNIL R3 - 0x80040600, // 0020 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: find_key_i -********************************************************************/ -be_local_closure(class_Tasmota_find_key_i, /* name */ +be_local_closure(class_Tasmota_set_timer, /* name */ be_nested_proto( 10, /* nstack */ - 3, /* argc */ + 4, /* argc */ 10, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -1565,39 +957,30 @@ be_local_closure(class_Tasmota_find_key_i, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_find_key_i, + &be_const_str_set_timer, &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0xA40EAA00, // 0000 IMPORT R3 K85 - 0x8C100756, // 0001 GETMET R4 R3 K86 - 0x5C180400, // 0002 MOVE R6 R2 - 0x7C100400, // 0003 CALL R4 2 - 0x6014000F, // 0004 GETGBL R5 G15 - 0x5C180200, // 0005 MOVE R6 R1 - 0x601C0013, // 0006 GETGBL R7 G19 - 0x7C140400, // 0007 CALL R5 2 - 0x78160013, // 0008 JMPF R5 #001D - 0x60140010, // 0009 GETGBL R5 G16 - 0x8C18036C, // 000A GETMET R6 R1 K108 - 0x7C180200, // 000B CALL R6 1 - 0x7C140200, // 000C CALL R5 1 - 0xA802000B, // 000D EXBLK 0 #001A - 0x5C180A00, // 000E MOVE R6 R5 - 0x7C180000, // 000F CALL R6 0 - 0x8C1C0756, // 0010 GETMET R7 R3 K86 - 0x5C240C00, // 0011 MOVE R9 R6 - 0x7C1C0400, // 0012 CALL R7 2 - 0x1C1C0E04, // 0013 EQ R7 R7 R4 - 0x741E0001, // 0014 JMPT R7 #0017 - 0x1C1C056D, // 0015 EQ R7 R2 K109 - 0x781E0001, // 0016 JMPF R7 #0019 - 0xA8040001, // 0017 EXBLK 1 1 - 0x80040C00, // 0018 RET 1 R6 - 0x7001FFF3, // 0019 JMP #000E - 0x5814006E, // 001A LDCONST R5 K110 - 0xAC140200, // 001B CATCH R5 1 0 - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x80000000, // 001D RET 0 + ( &(const binstruction[21]) { /* code */ + 0x8C100136, // 0000 GETMET R4 R0 K54 + 0x5C180400, // 0001 MOVE R6 R2 + 0x7C100400, // 0002 CALL R4 2 + 0x8810014C, // 0003 GETMBR R4 R0 K76 + 0x4C140000, // 0004 LDNIL R5 + 0x1C100805, // 0005 EQ R4 R4 R5 + 0x78120002, // 0006 JMPF R4 #000A + 0x60100012, // 0007 GETGBL R4 G18 + 0x7C100000, // 0008 CALL R4 0 + 0x90029804, // 0009 SETMBR R0 K76 R4 + 0x8810014C, // 000A GETMBR R4 R0 K76 + 0x8C10092E, // 000B GETMET R4 R4 K46 + 0xB81A7000, // 000C GETNGBL R6 K56 + 0x8C1C014D, // 000D GETMET R7 R0 K77 + 0x5C240200, // 000E MOVE R9 R1 + 0x7C1C0400, // 000F CALL R7 2 + 0x5C200400, // 0010 MOVE R8 R2 + 0x5C240600, // 0011 MOVE R9 R3 + 0x7C180600, // 0012 CALL R6 3 + 0x7C100400, // 0013 CALL R4 2 + 0x80000000, // 0014 RET 0 }) ) ); @@ -1624,29 +1007,29 @@ be_local_closure(class_Tasmota_urlfetch, /* name */ 0x4C0C0000, // 0000 LDNIL R3 0x1C0C0403, // 0001 EQ R3 R2 R3 0x780E000D, // 0002 JMPF R3 #0011 - 0xA40EAA00, // 0003 IMPORT R3 K85 - 0x8C10076F, // 0004 GETMET R4 R3 K111 + 0xA40E2200, // 0003 IMPORT R3 K17 + 0x8C10074E, // 0004 GETMET R4 R3 K78 0x5C180200, // 0005 MOVE R6 R1 - 0x581C0070, // 0006 LDCONST R7 K112 + 0x581C004F, // 0006 LDCONST R7 K79 0x7C100600, // 0007 CALL R4 3 - 0x8C10090F, // 0008 GETMET R4 R4 K15 + 0x8C10091F, // 0008 GETMET R4 R4 K31 0x7C100200, // 0009 CALL R4 1 0x5C080800, // 000A MOVE R2 R4 0x6010000C, // 000B GETGBL R4 G12 0x5C140400, // 000C MOVE R5 R2 0x7C100200, // 000D CALL R4 1 - 0x1C10091C, // 000E EQ R4 R4 K28 + 0x1C100906, // 000E EQ R4 R4 K6 0x78120000, // 000F JMPF R4 #0011 - 0x58080071, // 0010 LDCONST R2 K113 - 0xB80EE400, // 0011 GETNGBL R3 K114 + 0x58080050, // 0010 LDCONST R2 K80 + 0xB80EA200, // 0011 GETNGBL R3 K81 0x7C0C0000, // 0012 CALL R3 0 - 0x8C100773, // 0013 GETMET R4 R3 K115 + 0x8C100752, // 0013 GETMET R4 R3 K82 0x50180200, // 0014 LDBOOL R6 1 0 0x7C100400, // 0015 CALL R4 2 - 0x8C100774, // 0016 GETMET R4 R3 K116 + 0x8C100753, // 0016 GETMET R4 R3 K83 0x5C180200, // 0017 MOVE R6 R1 0x7C100400, // 0018 CALL R4 2 - 0x8C100775, // 0019 GETMET R4 R3 K117 + 0x8C100754, // 0019 GETMET R4 R3 K84 0x7C100200, // 001A CALL R4 1 0x541600C7, // 001B LDINT R5 200 0x20140805, // 001C NE R5 R4 R5 @@ -1654,19 +1037,19 @@ be_local_closure(class_Tasmota_urlfetch, /* name */ 0x60140008, // 001E GETGBL R5 G8 0x5C180800, // 001F MOVE R6 R4 0x7C140200, // 0020 CALL R5 1 - 0x0016EC05, // 0021 ADD R5 K118 R5 - 0xB006EE05, // 0022 RAISE 1 K119 R5 - 0x8C140778, // 0023 GETMET R5 R3 K120 + 0x0016AA05, // 0021 ADD R5 K85 R5 + 0xB006AC05, // 0022 RAISE 1 K86 R5 + 0x8C140757, // 0023 GETMET R5 R3 K87 0x5C1C0400, // 0024 MOVE R7 R2 0x7C140400, // 0025 CALL R5 2 - 0x8C180779, // 0026 GETMET R6 R3 K121 + 0x8C180758, // 0026 GETMET R6 R3 K88 0x7C180200, // 0027 CALL R6 1 - 0x8C180158, // 0028 GETMET R6 R0 K88 + 0x8C180123, // 0028 GETMET R6 R0 K35 0x60200008, // 0029 GETGBL R8 G8 0x5C240A00, // 002A MOVE R9 R5 0x7C200200, // 002B CALL R8 1 - 0x0022F408, // 002C ADD R8 K122 R8 - 0x5824005A, // 002D LDCONST R9 K90 + 0x0022B208, // 002C ADD R8 K89 R8 + 0x58240025, // 002D LDCONST R9 K37 0x7C180600, // 002E CALL R6 3 0x80040800, // 002F RET 1 R4 }) @@ -1675,6 +1058,405 @@ be_local_closure(class_Tasmota_urlfetch, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: remove_rule +********************************************************************/ +be_local_closure(class_Tasmota_remove_rule, /* name */ + be_nested_proto( + 7, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_remove_rule, + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0x880C0120, // 0000 GETMBR R3 R0 K32 + 0x780E0017, // 0001 JMPF R3 #001A + 0x580C0006, // 0002 LDCONST R3 K6 + 0x6010000C, // 0003 GETGBL R4 G12 + 0x88140120, // 0004 GETMBR R5 R0 K32 + 0x7C100200, // 0005 CALL R4 1 + 0x14100604, // 0006 LT R4 R3 R4 + 0x78120011, // 0007 JMPF R4 #001A + 0x88100120, // 0008 GETMBR R4 R0 K32 + 0x94100803, // 0009 GETIDX R4 R4 R3 + 0x88100909, // 000A GETMBR R4 R4 K9 + 0x8810095A, // 000B GETMBR R4 R4 K90 + 0x1C100801, // 000C EQ R4 R4 R1 + 0x78120009, // 000D JMPF R4 #0018 + 0x88100120, // 000E GETMBR R4 R0 K32 + 0x94100803, // 000F GETIDX R4 R4 R3 + 0x88100908, // 0010 GETMBR R4 R4 K8 + 0x1C100802, // 0011 EQ R4 R4 R2 + 0x78120004, // 0012 JMPF R4 #0018 + 0x88100120, // 0013 GETMBR R4 R0 K32 + 0x8C100935, // 0014 GETMET R4 R4 K53 + 0x5C180600, // 0015 MOVE R6 R3 + 0x7C100400, // 0016 CALL R4 2 + 0x70020000, // 0017 JMP #0019 + 0x000C070A, // 0018 ADD R3 R3 K10 + 0x7001FFE8, // 0019 JMP #0003 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: add_driver +********************************************************************/ +be_local_closure(class_Tasmota_add_driver, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_add_driver, + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0x60080004, // 0000 GETGBL R2 G4 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x2008055B, // 0003 NE R2 R2 K91 + 0x780A0000, // 0004 JMPF R2 #0006 + 0xB006775C, // 0005 RAISE 1 K59 K92 + 0x8808011D, // 0006 GETMBR R2 R0 K29 + 0x780A000B, // 0007 JMPF R2 #0014 + 0x8808011D, // 0008 GETMBR R2 R0 K29 + 0x8C08051E, // 0009 GETMET R2 R2 K30 + 0x5C100200, // 000A MOVE R4 R1 + 0x7C080400, // 000B CALL R2 2 + 0x4C0C0000, // 000C LDNIL R3 + 0x1C080403, // 000D EQ R2 R2 R3 + 0x780A0003, // 000E JMPF R2 #0013 + 0x8808011D, // 000F GETMBR R2 R0 K29 + 0x8C08052E, // 0010 GETMET R2 R2 K46 + 0x5C100200, // 0011 MOVE R4 R1 + 0x7C080400, // 0012 CALL R2 2 + 0x70020003, // 0013 JMP #0018 + 0x60080012, // 0014 GETGBL R2 G18 + 0x7C080000, // 0015 CALL R2 0 + 0x400C0401, // 0016 CONNECT R3 R2 R1 + 0x90023A02, // 0017 SETMBR R0 K29 R2 + 0x80000000, // 0018 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: exec_rules +********************************************************************/ +be_local_closure(class_Tasmota_exec_rules, /* name */ + be_nested_proto( + 14, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_exec_rules, + &be_const_str_solidified, + ( &(const binstruction[60]) { /* code */ + 0x880C015D, // 0000 GETMBR R3 R0 K93 + 0x88100120, // 0001 GETMBR R4 R0 K32 + 0x74120002, // 0002 JMPT R4 #0006 + 0x4C100000, // 0003 LDNIL R4 + 0x20100604, // 0004 NE R4 R3 R4 + 0x78120033, // 0005 JMPF R4 #003A + 0xA4124200, // 0006 IMPORT R4 K33 + 0x4C140000, // 0007 LDNIL R5 + 0x9002BA05, // 0008 SETMBR R0 K93 R5 + 0x50140000, // 0009 LDBOOL R5 0 0 + 0x8C180922, // 000A GETMET R6 R4 K34 + 0x5C200200, // 000B MOVE R8 R1 + 0x7C180400, // 000C CALL R6 2 + 0x4C1C0000, // 000D LDNIL R7 + 0x1C1C0C07, // 000E EQ R7 R6 R7 + 0x781E0004, // 000F JMPF R7 #0015 + 0x8C1C0123, // 0010 GETMET R7 R0 K35 + 0x00264801, // 0011 ADD R9 K36 R1 + 0x58280025, // 0012 LDCONST R10 K37 + 0x7C1C0600, // 0013 CALL R7 3 + 0x5C180200, // 0014 MOVE R6 R1 + 0x780A001E, // 0015 JMPF R2 #0035 + 0x881C0120, // 0016 GETMBR R7 R0 K32 + 0x781E001C, // 0017 JMPF R7 #0035 + 0x581C0006, // 0018 LDCONST R7 K6 + 0x6020000C, // 0019 GETGBL R8 G12 + 0x88240120, // 001A GETMBR R9 R0 K32 + 0x7C200200, // 001B CALL R8 1 + 0x14200E08, // 001C LT R8 R7 R8 + 0x78220016, // 001D JMPF R8 #0035 + 0x88200120, // 001E GETMBR R8 R0 K32 + 0x94201007, // 001F GETIDX R8 R8 R7 + 0x8C240127, // 0020 GETMET R9 R0 K39 + 0x5C2C0C00, // 0021 MOVE R11 R6 + 0x88301109, // 0022 GETMBR R12 R8 K9 + 0x88341128, // 0023 GETMBR R13 R8 K40 + 0x7C240800, // 0024 CALL R9 4 + 0x74160001, // 0025 JMPT R5 #0028 + 0x74260000, // 0026 JMPT R9 #0028 + 0x50140001, // 0027 LDBOOL R5 0 1 + 0x50140200, // 0028 LDBOOL R5 1 0 + 0x78260008, // 0029 JMPF R9 #0033 + 0x8828115E, // 002A GETMBR R10 R8 K94 + 0x502C0200, // 002B LDBOOL R11 1 0 + 0x1C28140B, // 002C EQ R10 R10 R11 + 0x782A0004, // 002D JMPF R10 #0033 + 0x88280120, // 002E GETMBR R10 R0 K32 + 0x8C281535, // 002F GETMET R10 R10 K53 + 0x5C300E00, // 0030 MOVE R12 R7 + 0x7C280400, // 0031 CALL R10 2 + 0x70020000, // 0032 JMP #0034 + 0x001C0F0A, // 0033 ADD R7 R7 K10 + 0x7001FFE3, // 0034 JMP #0019 + 0x4C1C0000, // 0035 LDNIL R7 + 0x201C0607, // 0036 NE R7 R3 R7 + 0x781E0000, // 0037 JMPF R7 #0039 + 0x9002BA06, // 0038 SETMBR R0 K93 R6 + 0x80040A00, // 0039 RET 1 R5 + 0x50100000, // 003A LDBOOL R4 0 0 + 0x80040800, // 003B RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: int +********************************************************************/ +be_local_closure(class_Tasmota_int, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ + 12, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_int, + &be_const_str_solidified, + ( &(const binstruction[46]) { /* code */ + 0x580C005F, // 0000 LDCONST R3 K95 + 0x60100009, // 0001 GETGBL R4 G9 + 0x5C140000, // 0002 MOVE R5 R0 + 0x7C100200, // 0003 CALL R4 1 + 0x5C000800, // 0004 MOVE R0 R4 + 0x4C100000, // 0005 LDNIL R4 + 0x1C100204, // 0006 EQ R4 R1 R4 + 0x78120003, // 0007 JMPF R4 #000C + 0x4C100000, // 0008 LDNIL R4 + 0x1C100404, // 0009 EQ R4 R2 R4 + 0x78120000, // 000A JMPF R4 #000C + 0x80040000, // 000B RET 1 R0 + 0x60100009, // 000C GETGBL R4 G9 + 0x5C140200, // 000D MOVE R5 R1 + 0x7C100200, // 000E CALL R4 1 + 0x5C040800, // 000F MOVE R1 R4 + 0x60100009, // 0010 GETGBL R4 G9 + 0x5C140400, // 0011 MOVE R5 R2 + 0x7C100200, // 0012 CALL R4 1 + 0x5C080800, // 0013 MOVE R2 R4 + 0x4C100000, // 0014 LDNIL R4 + 0x20100204, // 0015 NE R4 R1 R4 + 0x78120006, // 0016 JMPF R4 #001E + 0x4C100000, // 0017 LDNIL R4 + 0x20100404, // 0018 NE R4 R2 R4 + 0x78120003, // 0019 JMPF R4 #001E + 0x4C100000, // 001A LDNIL R4 + 0x1C100004, // 001B EQ R4 R0 R4 + 0x78120000, // 001C JMPF R4 #001E + 0x80040200, // 001D RET 1 R1 + 0x4C100000, // 001E LDNIL R4 + 0x20100004, // 001F NE R4 R0 R4 + 0x7812000B, // 0020 JMPF R4 #002D + 0x4C100000, // 0021 LDNIL R4 + 0x20100204, // 0022 NE R4 R1 R4 + 0x78120002, // 0023 JMPF R4 #0027 + 0x14100001, // 0024 LT R4 R0 R1 + 0x78120000, // 0025 JMPF R4 #0027 + 0x80040200, // 0026 RET 1 R1 + 0x4C100000, // 0027 LDNIL R4 + 0x20100404, // 0028 NE R4 R2 R4 + 0x78120002, // 0029 JMPF R4 #002D + 0x24100002, // 002A GT R4 R0 R2 + 0x78120000, // 002B JMPF R4 #002D + 0x80040400, // 002C RET 1 R2 + 0x80040000, // 002D RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: gc +********************************************************************/ +be_local_closure(class_Tasmota_gc, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_gc, + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0xA406C000, // 0000 IMPORT R1 K96 + 0x8C080361, // 0001 GETMET R2 R1 K97 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080362, // 0003 GETMET R2 R1 K98 + 0x7C080200, // 0004 CALL R2 1 + 0x80040400, // 0005 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: run_deferred +********************************************************************/ +be_local_closure(class_Tasmota_run_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_run_deferred, + &be_const_str_solidified, + ( &(const binstruction[26]) { /* code */ + 0x8804012D, // 0000 GETMBR R1 R0 K45 + 0x78060016, // 0001 JMPF R1 #0019 + 0x6004000C, // 0002 GETGBL R1 G12 + 0x8808012D, // 0003 GETMBR R2 R0 K45 + 0x7C040200, // 0004 CALL R1 1 + 0x24080306, // 0005 GT R2 R1 K6 + 0x780A0009, // 0006 JMPF R2 #0011 + 0x8808012D, // 0007 GETMBR R2 R0 K45 + 0x94080506, // 0008 GETIDX R2 R2 K6 + 0x880C012D, // 0009 GETMBR R3 R0 K45 + 0x8C0C0735, // 000A GETMET R3 R3 K53 + 0x58140006, // 000B LDCONST R5 K6 + 0x7C0C0400, // 000C CALL R3 2 + 0x0404030A, // 000D SUB R1 R1 K10 + 0x5C0C0400, // 000E MOVE R3 R2 + 0x7C0C0000, // 000F CALL R3 0 + 0x7001FFF3, // 0010 JMP #0005 + 0x6008000C, // 0011 GETGBL R2 G12 + 0x880C012D, // 0012 GETMBR R3 R0 K45 + 0x7C080200, // 0013 CALL R2 1 + 0x1C080506, // 0014 EQ R2 R2 K6 + 0x780A0002, // 0015 JMPF R2 #0019 + 0xB80A5E00, // 0016 GETNGBL R2 K47 + 0x88080530, // 0017 GETMBR R2 R2 K48 + 0x900A6306, // 0018 SETMBR R2 K49 K6 + 0x80000000, // 0019 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: add_rule_once +********************************************************************/ +be_local_closure(class_Tasmota_add_rule_once, /* name */ + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_add_rule_once, + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x8C100163, // 0000 GETMET R4 R0 K99 + 0x5C180200, // 0001 MOVE R6 R1 + 0x5C1C0400, // 0002 MOVE R7 R2 + 0x5C200600, // 0003 MOVE R8 R3 + 0x50240200, // 0004 LDBOOL R9 1 0 + 0x7C100A00, // 0005 CALL R4 5 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_cron +********************************************************************/ +be_local_closure(class_Tasmota_remove_cron, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_remove_cron, + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x88080105, // 0000 GETMBR R2 R0 K5 + 0x780A000E, // 0001 JMPF R2 #0011 + 0x580C0006, // 0002 LDCONST R3 K6 + 0x8C100507, // 0003 GETMET R4 R2 K7 + 0x7C100200, // 0004 CALL R4 1 + 0x14100604, // 0005 LT R4 R3 R4 + 0x78120009, // 0006 JMPF R4 #0011 + 0x94100403, // 0007 GETIDX R4 R2 R3 + 0x88100908, // 0008 GETMBR R4 R4 K8 + 0x1C100801, // 0009 EQ R4 R4 R1 + 0x78120003, // 000A JMPF R4 #000F + 0x8C100535, // 000B GETMET R4 R2 K53 + 0x5C180600, // 000C MOVE R6 R3 + 0x7C100400, // 000D CALL R4 2 + 0x70020000, // 000E JMP #0010 + 0x000C070A, // 000F ADD R3 R3 K10 + 0x7001FFF1, // 0010 JMP #0003 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: fast_loop ********************************************************************/ @@ -1692,11 +1474,11 @@ be_local_closure(class_Tasmota_fast_loop, /* name */ &be_const_str_fast_loop, &be_const_str_solidified, ( &(const binstruction[15]) { /* code */ - 0x88040157, // 0000 GETMBR R1 R0 K87 + 0x88040134, // 0000 GETMBR R1 R0 K52 0x5C080200, // 0001 MOVE R2 R1 0x740A0000, // 0002 JMPT R2 #0004 0x80000400, // 0003 RET 0 - 0x5808001C, // 0004 LDCONST R2 K28 + 0x58080006, // 0004 LDCONST R2 K6 0x600C000C, // 0005 GETGBL R3 G12 0x5C100200, // 0006 MOVE R4 R1 0x7C0C0200, // 0007 CALL R3 1 @@ -1704,7 +1486,7 @@ be_local_closure(class_Tasmota_fast_loop, /* name */ 0x780E0003, // 0009 JMPF R3 #000E 0x940C0202, // 000A GETIDX R3 R1 R2 0x7C0C0000, // 000B CALL R3 0 - 0x00080505, // 000C ADD R2 R2 K5 + 0x0008050A, // 000C ADD R2 R2 K10 0x7001FFF6, // 000D JMP #0005 0x80000000, // 000E RET 0 }) @@ -1714,12 +1496,12 @@ be_local_closure(class_Tasmota_fast_loop, /* name */ /******************************************************************** -** Solidified function: gen_cb +** Solidified function: event ********************************************************************/ -be_local_closure(class_Tasmota_gen_cb, /* name */ +be_local_closure(class_Tasmota_event, /* name */ be_nested_proto( - 6, /* nstack */ - 2, /* argc */ + 19, /* nstack */ + 6, /* argc */ 10, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -1727,14 +1509,117 @@ be_local_closure(class_Tasmota_gen_cb, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_gen_cb, + &be_const_str_event, &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0xA40AF600, // 0000 IMPORT R2 K123 - 0x8C0C057C, // 0001 GETMET R3 R2 K124 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x80040600, // 0004 RET 1 R3 + ( &(const binstruction[108]) { /* code */ + 0xA41A1600, // 0000 IMPORT R6 K11 + 0x1C1C0364, // 0001 EQ R7 R1 K100 + 0x781E0001, // 0002 JMPF R7 #0005 + 0x8C1C0165, // 0003 GETMET R7 R0 K101 + 0x7C1C0200, // 0004 CALL R7 1 + 0x1C1C0366, // 0005 EQ R7 R1 K102 + 0x781E0001, // 0006 JMPF R7 #0009 + 0x8C1C0167, // 0007 GETMET R7 R0 K103 + 0x7C1C0200, // 0008 CALL R7 1 + 0x501C0000, // 0009 LDBOOL R7 0 0 + 0x50200000, // 000A LDBOOL R8 0 0 + 0x1C240368, // 000B EQ R9 R1 K104 + 0x78260000, // 000C JMPF R9 #000E + 0x50200200, // 000D LDBOOL R8 1 0 + 0x1C240369, // 000E EQ R9 R1 K105 + 0x78260006, // 000F JMPF R9 #0017 + 0x8C24016A, // 0010 GETMET R9 R0 K106 + 0x5C2C0400, // 0011 MOVE R11 R2 + 0x5C300600, // 0012 MOVE R12 R3 + 0x5C340800, // 0013 MOVE R13 R4 + 0x7C240800, // 0014 CALL R9 4 + 0x80041200, // 0015 RET 1 R9 + 0x7002004E, // 0016 JMP #0066 + 0x1C24036B, // 0017 EQ R9 R1 K107 + 0x78260004, // 0018 JMPF R9 #001E + 0x8C24016C, // 0019 GETMET R9 R0 K108 + 0x5C2C0800, // 001A MOVE R11 R4 + 0x7C240400, // 001B CALL R9 2 + 0x80041200, // 001C RET 1 R9 + 0x70020047, // 001D JMP #0066 + 0x1C24035A, // 001E EQ R9 R1 K90 + 0x78260007, // 001F JMPF R9 #0028 + 0x8C24016D, // 0020 GETMET R9 R0 K109 + 0x5C2C0800, // 0021 MOVE R11 R4 + 0x60300017, // 0022 GETGBL R12 G23 + 0x5C340600, // 0023 MOVE R13 R3 + 0x7C300200, // 0024 CALL R12 1 + 0x7C240600, // 0025 CALL R9 3 + 0x80041200, // 0026 RET 1 R9 + 0x7002003D, // 0027 JMP #0066 + 0x1C240360, // 0028 EQ R9 R1 K96 + 0x78260003, // 0029 JMPF R9 #002E + 0x8C240160, // 002A GETMET R9 R0 K96 + 0x7C240200, // 002B CALL R9 1 + 0x80041200, // 002C RET 1 R9 + 0x70020037, // 002D JMP #0066 + 0x8824011D, // 002E GETMBR R9 R0 K29 + 0x78260035, // 002F JMPF R9 #0066 + 0x58240006, // 0030 LDCONST R9 K6 + 0x6028000C, // 0031 GETGBL R10 G12 + 0x882C011D, // 0032 GETMBR R11 R0 K29 + 0x7C280200, // 0033 CALL R10 1 + 0x1428120A, // 0034 LT R10 R9 R10 + 0x782A002F, // 0035 JMPF R10 #0066 + 0x8828011D, // 0036 GETMBR R10 R0 K29 + 0x94281409, // 0037 GETIDX R10 R10 R9 + 0x8C2C0D41, // 0038 GETMET R11 R6 K65 + 0x5C341400, // 0039 MOVE R13 R10 + 0x5C380200, // 003A MOVE R14 R1 + 0x7C2C0600, // 003B CALL R11 3 + 0x60300004, // 003C GETGBL R12 G4 + 0x5C341600, // 003D MOVE R13 R11 + 0x7C300200, // 003E CALL R12 1 + 0x1C30190C, // 003F EQ R12 R12 K12 + 0x78320022, // 0040 JMPF R12 #0064 + 0xA8020011, // 0041 EXBLK 0 #0054 + 0x5C301600, // 0042 MOVE R12 R11 + 0x5C341400, // 0043 MOVE R13 R10 + 0x5C380400, // 0044 MOVE R14 R2 + 0x5C3C0600, // 0045 MOVE R15 R3 + 0x5C400800, // 0046 MOVE R16 R4 + 0x5C440A00, // 0047 MOVE R17 R5 + 0x7C300A00, // 0048 CALL R12 5 + 0x74320001, // 0049 JMPT R12 #004C + 0x741E0000, // 004A JMPT R7 #004C + 0x501C0001, // 004B LDBOOL R7 0 1 + 0x501C0200, // 004C LDBOOL R7 1 0 + 0x781E0003, // 004D JMPF R7 #0052 + 0x5C301000, // 004E MOVE R12 R8 + 0x74320001, // 004F JMPT R12 #0052 + 0xA8040001, // 0050 EXBLK 1 1 + 0x70020013, // 0051 JMP #0066 + 0xA8040001, // 0052 EXBLK 1 1 + 0x7002000F, // 0053 JMP #0064 + 0xAC300002, // 0054 CATCH R12 0 2 + 0x7002000C, // 0055 JMP #0063 + 0x60380001, // 0056 GETGBL R14 G1 + 0x603C0018, // 0057 GETGBL R15 G24 + 0x5840006E, // 0058 LDCONST R16 K110 + 0x5C441800, // 0059 MOVE R17 R12 + 0x5C481A00, // 005A MOVE R18 R13 + 0x7C3C0600, // 005B CALL R15 3 + 0x7C380200, // 005C CALL R14 1 + 0x88380147, // 005D GETMBR R14 R0 K71 + 0x783A0002, // 005E JMPF R14 #0062 + 0xA43A9200, // 005F IMPORT R14 K73 + 0x8C3C1D6F, // 0060 GETMET R15 R14 K111 + 0x7C3C0200, // 0061 CALL R15 1 + 0x70020000, // 0062 JMP #0064 + 0xB0080000, // 0063 RAISE 2 R0 R0 + 0x0024130A, // 0064 ADD R9 R9 K10 + 0x7001FFCA, // 0065 JMP #0031 + 0x1C240370, // 0066 EQ R9 R1 K112 + 0x78260002, // 0067 JMPF R9 #006B + 0xA426E200, // 0068 IMPORT R9 K113 + 0x8C281372, // 0069 GETMET R10 R9 K114 + 0x7C280200, // 006A CALL R10 1 + 0x80040E00, // 006B RET 1 R7 }) ) ); @@ -1742,12 +1627,12 @@ be_local_closure(class_Tasmota_gen_cb, /* name */ /******************************************************************** -** Solidified function: time_str +** Solidified function: find_key_i ********************************************************************/ -be_local_closure(class_Tasmota_time_str, /* name */ +be_local_closure(class_Tasmota_find_key_i, /* name */ be_nested_proto( - 11, /* nstack */ - 2, /* argc */ + 10, /* nstack */ + 3, /* argc */ 10, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -1755,68 +1640,39 @@ be_local_closure(class_Tasmota_time_str, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_time_str, + &be_const_str_find_key_i, &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x8C08017D, // 0000 GETMET R2 R0 K125 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x600C0018, // 0003 GETGBL R3 G24 - 0x5810007E, // 0004 LDCONST R4 K126 - 0x9414057F, // 0005 GETIDX R5 R2 K127 - 0x94180580, // 0006 GETIDX R6 R2 K128 - 0x941C0581, // 0007 GETIDX R7 R2 K129 - 0x94200582, // 0008 GETIDX R8 R2 K130 - 0x94240583, // 0009 GETIDX R9 R2 K131 - 0x94280584, // 000A GETIDX R10 R2 K132 - 0x7C0C0E00, // 000B CALL R3 7 - 0x80040600, // 000C RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: add_fast_loop -********************************************************************/ -be_local_closure(class_Tasmota_add_fast_loop, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_add_fast_loop, - &be_const_str_solidified, - ( &(const binstruction[23]) { /* code */ - 0x8C080135, // 0000 GETMET R2 R0 K53 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x88080157, // 0003 GETMBR R2 R0 K87 - 0x4C0C0000, // 0004 LDNIL R3 - 0x1C080403, // 0005 EQ R2 R2 R3 - 0x780A0002, // 0006 JMPF R2 #000A - 0x60080012, // 0007 GETGBL R2 G18 - 0x7C080000, // 0008 CALL R2 0 - 0x9002AE02, // 0009 SETMBR R0 K87 R2 - 0x60080004, // 000A GETGBL R2 G4 - 0x5C0C0200, // 000B MOVE R3 R1 - 0x7C080200, // 000C CALL R2 1 - 0x20080508, // 000D NE R2 R2 K8 - 0x780A0000, // 000E JMPF R2 #0010 - 0xB0067785, // 000F RAISE 1 K59 K133 - 0x88080102, // 0010 GETMBR R2 R0 K2 - 0x900B0D05, // 0011 SETMBR R2 K134 K5 - 0x88080157, // 0012 GETMBR R2 R0 K87 - 0x8C080537, // 0013 GETMET R2 R2 K55 - 0x5C100200, // 0014 MOVE R4 R1 - 0x7C080400, // 0015 CALL R2 2 - 0x80000000, // 0016 RET 0 + ( &(const binstruction[30]) { /* code */ + 0xA40E2200, // 0000 IMPORT R3 K17 + 0x8C100712, // 0001 GETMET R4 R3 K18 + 0x5C180400, // 0002 MOVE R6 R2 + 0x7C100400, // 0003 CALL R4 2 + 0x6014000F, // 0004 GETGBL R5 G15 + 0x5C180200, // 0005 MOVE R6 R1 + 0x601C0013, // 0006 GETGBL R7 G19 + 0x7C140400, // 0007 CALL R5 2 + 0x78160013, // 0008 JMPF R5 #001D + 0x60140010, // 0009 GETGBL R5 G16 + 0x8C180373, // 000A GETMET R6 R1 K115 + 0x7C180200, // 000B CALL R6 1 + 0x7C140200, // 000C CALL R5 1 + 0xA802000B, // 000D EXBLK 0 #001A + 0x5C180A00, // 000E MOVE R6 R5 + 0x7C180000, // 000F CALL R6 0 + 0x8C1C0712, // 0010 GETMET R7 R3 K18 + 0x5C240C00, // 0011 MOVE R9 R6 + 0x7C1C0400, // 0012 CALL R7 2 + 0x1C1C0E04, // 0013 EQ R7 R7 R4 + 0x741E0001, // 0014 JMPT R7 #0017 + 0x1C1C0574, // 0015 EQ R7 R2 K116 + 0x781E0001, // 0016 JMPF R7 #0019 + 0xA8040001, // 0017 EXBLK 1 1 + 0x80040C00, // 0018 RET 1 R6 + 0x7001FFF3, // 0019 JMP #000E + 0x58140075, // 001A LDCONST R5 K117 + 0xAC140200, // 001B CATCH R5 1 0 + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x80000000, // 001D RET 0 }) ) ); @@ -1841,18 +1697,18 @@ be_local_closure(class_Tasmota_get_light, /* name */ &be_const_str_solidified, ( &(const binstruction[16]) { /* code */ 0x60080001, // 0000 GETGBL R2 G1 - 0x580C0087, // 0001 LDCONST R3 K135 + 0x580C0076, // 0001 LDCONST R3 K118 0x7C080200, // 0002 CALL R2 1 - 0xA40A5600, // 0003 IMPORT R2 K43 + 0xA40AEE00, // 0003 IMPORT R2 K119 0x4C0C0000, // 0004 LDNIL R3 0x200C0203, // 0005 NE R3 R1 R3 0x780E0004, // 0006 JMPF R3 #000C - 0x8C0C051D, // 0007 GETMET R3 R2 K29 + 0x8C0C0541, // 0007 GETMET R3 R2 K65 0x5C140200, // 0008 MOVE R5 R1 0x7C0C0400, // 0009 CALL R3 2 0x80040600, // 000A RET 1 R3 0x70020002, // 000B JMP #000F - 0x8C0C051D, // 000C GETMET R3 R2 K29 + 0x8C0C0541, // 000C GETMET R3 R2 K65 0x7C0C0200, // 000D CALL R3 1 0x80040600, // 000E RET 1 R3 0x80000000, // 000F RET 0 @@ -1863,12 +1719,12 @@ be_local_closure(class_Tasmota_get_light, /* name */ /******************************************************************** -** Solidified function: add_cron +** Solidified function: add_fast_loop ********************************************************************/ -be_local_closure(class_Tasmota_add_cron, /* name */ +be_local_closure(class_Tasmota_add_fast_loop, /* name */ be_nested_proto( - 13, /* nstack */ - 4, /* argc */ + 5, /* nstack */ + 2, /* argc */ 10, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -1876,36 +1732,32 @@ be_local_closure(class_Tasmota_add_cron, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_add_cron, + &be_const_str_add_fast_loop, &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x8C100135, // 0000 GETMET R4 R0 K53 - 0x5C180400, // 0001 MOVE R6 R2 - 0x7C100400, // 0002 CALL R4 2 - 0x8810012D, // 0003 GETMBR R4 R0 K45 - 0x4C140000, // 0004 LDNIL R5 - 0x1C100805, // 0005 EQ R4 R4 R5 - 0x78120002, // 0006 JMPF R4 #000A - 0x60100012, // 0007 GETGBL R4 G18 - 0x7C100000, // 0008 CALL R4 0 - 0x90025A04, // 0009 SETMBR R0 K45 R4 - 0xB8125C00, // 000A GETNGBL R4 K46 - 0x60140008, // 000B GETGBL R5 G8 - 0x5C180200, // 000C MOVE R6 R1 - 0x7C140200, // 000D CALL R5 1 - 0x7C100200, // 000E CALL R4 1 - 0x8C140932, // 000F GETMET R5 R4 K50 - 0x7C140200, // 0010 CALL R5 1 - 0x8818012D, // 0011 GETMBR R6 R0 K45 - 0x8C180D37, // 0012 GETMET R6 R6 K55 - 0xB8227000, // 0013 GETNGBL R8 K56 - 0x5C240A00, // 0014 MOVE R9 R5 - 0x5C280400, // 0015 MOVE R10 R2 - 0x5C2C0600, // 0016 MOVE R11 R3 - 0x5C300800, // 0017 MOVE R12 R4 - 0x7C200800, // 0018 CALL R8 4 - 0x7C180400, // 0019 CALL R6 2 - 0x80000000, // 001A RET 0 + ( &(const binstruction[23]) { /* code */ + 0x8C080136, // 0000 GETMET R2 R0 K54 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x88080134, // 0003 GETMBR R2 R0 K52 + 0x4C0C0000, // 0004 LDNIL R3 + 0x1C080403, // 0005 EQ R2 R2 R3 + 0x780A0002, // 0006 JMPF R2 #000A + 0x60080012, // 0007 GETGBL R2 G18 + 0x7C080000, // 0008 CALL R2 0 + 0x90026802, // 0009 SETMBR R0 K52 R2 + 0x60080004, // 000A GETGBL R2 G4 + 0x5C0C0200, // 000B MOVE R3 R1 + 0x7C080200, // 000C CALL R2 1 + 0x2008050C, // 000D NE R2 R2 K12 + 0x780A0000, // 000E JMPF R2 #0010 + 0xB0067778, // 000F RAISE 1 K59 K120 + 0x88080130, // 0010 GETMBR R2 R0 K48 + 0x900AF30A, // 0011 SETMBR R2 K121 K10 + 0x88080134, // 0012 GETMBR R2 R0 K52 + 0x8C08052E, // 0013 GETMET R2 R2 K46 + 0x5C100200, // 0014 MOVE R4 R1 + 0x7C080400, // 0015 CALL R2 2 + 0x80000000, // 0016 RET 0 }) ) ); @@ -1913,11 +1765,11 @@ be_local_closure(class_Tasmota_add_cron, /* name */ /******************************************************************** -** Solidified function: hs2rgb +** Solidified function: cmd ********************************************************************/ -be_local_closure(class_Tasmota_hs2rgb, /* name */ +be_local_closure(class_Tasmota_cmd, /* name */ be_nested_proto( - 17, /* nstack */ + 8, /* nstack */ 3, /* argc */ 10, /* varg */ 0, /* has upvals */ @@ -1926,77 +1778,36 @@ be_local_closure(class_Tasmota_hs2rgb, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_hs2rgb, + &be_const_str_cmd, &be_const_str_solidified, - ( &(const binstruction[68]) { /* code */ - 0x4C0C0000, // 0000 LDNIL R3 - 0x1C0C0403, // 0001 EQ R3 R2 R3 - 0x780E0000, // 0002 JMPF R3 #0004 - 0x540A00FE, // 0003 LDINT R2 255 - 0x540E00FE, // 0004 LDINT R3 255 - 0x541200FE, // 0005 LDINT R4 255 - 0x541600FE, // 0006 LDINT R5 255 - 0x541A0167, // 0007 LDINT R6 360 - 0x10040206, // 0008 MOD R1 R1 R6 - 0x2418051C, // 0009 GT R6 R2 K28 - 0x781A0031, // 000A JMPF R6 #003D - 0x541A003B, // 000B LDINT R6 60 - 0x0C180206, // 000C DIV R6 R1 R6 - 0x541E003B, // 000D LDINT R7 60 - 0x101C0207, // 000E MOD R7 R1 R7 - 0x542200FE, // 000F LDINT R8 255 - 0x04201002, // 0010 SUB R8 R8 R2 - 0xB8260200, // 0011 GETNGBL R9 K1 - 0x8C241388, // 0012 GETMET R9 R9 K136 - 0x5C2C0E00, // 0013 MOVE R11 R7 - 0x5830001C, // 0014 LDCONST R12 K28 - 0x5436003B, // 0015 LDINT R13 60 - 0x543A00FE, // 0016 LDINT R14 255 - 0x5C3C1000, // 0017 MOVE R15 R8 - 0x7C240C00, // 0018 CALL R9 6 - 0xB82A0200, // 0019 GETNGBL R10 K1 - 0x8C281588, // 001A GETMET R10 R10 K136 - 0x5C300E00, // 001B MOVE R12 R7 - 0x5834001C, // 001C LDCONST R13 K28 - 0x543A003B, // 001D LDINT R14 60 - 0x5C3C1000, // 001E MOVE R15 R8 - 0x544200FE, // 001F LDINT R16 255 - 0x7C280C00, // 0020 CALL R10 6 - 0x1C2C0D1C, // 0021 EQ R11 R6 K28 - 0x782E0002, // 0022 JMPF R11 #0026 - 0x5C141400, // 0023 MOVE R5 R10 - 0x5C101000, // 0024 MOVE R4 R8 - 0x70020016, // 0025 JMP #003D - 0x1C2C0D05, // 0026 EQ R11 R6 K5 - 0x782E0002, // 0027 JMPF R11 #002B - 0x5C0C1200, // 0028 MOVE R3 R9 - 0x5C101000, // 0029 MOVE R4 R8 - 0x70020011, // 002A JMP #003D - 0x1C2C0D04, // 002B EQ R11 R6 K4 - 0x782E0002, // 002C JMPF R11 #0030 - 0x5C0C1000, // 002D MOVE R3 R8 - 0x5C101400, // 002E MOVE R4 R10 - 0x7002000C, // 002F JMP #003D - 0x1C2C0D5A, // 0030 EQ R11 R6 K90 - 0x782E0002, // 0031 JMPF R11 #0035 - 0x5C0C1000, // 0032 MOVE R3 R8 - 0x5C141200, // 0033 MOVE R5 R9 - 0x70020007, // 0034 JMP #003D - 0x542E0003, // 0035 LDINT R11 4 - 0x1C2C0C0B, // 0036 EQ R11 R6 R11 - 0x782E0002, // 0037 JMPF R11 #003B - 0x5C0C1400, // 0038 MOVE R3 R10 - 0x5C141000, // 0039 MOVE R5 R8 - 0x70020001, // 003A JMP #003D - 0x5C141000, // 003B MOVE R5 R8 - 0x5C101200, // 003C MOVE R4 R9 - 0x541A000F, // 003D LDINT R6 16 - 0x38180606, // 003E SHL R6 R3 R6 - 0x541E0007, // 003F LDINT R7 8 - 0x381C0A07, // 0040 SHL R7 R5 R7 - 0x30180C07, // 0041 OR R6 R6 R7 - 0x30180C04, // 0042 OR R6 R6 R4 - 0x80040C00, // 0043 RET 1 R6 + ( &(const binstruction[27]) { /* code */ + 0x880C015D, // 0000 GETMBR R3 R0 K93 + 0x50100200, // 0001 LDBOOL R4 1 0 + 0x9002BA04, // 0002 SETMBR R0 K93 R4 + 0xB8125E00, // 0003 GETNGBL R4 K47 + 0x88100930, // 0004 GETMBR R4 R4 K48 + 0x8810097A, // 0005 GETMBR R4 R4 K122 + 0x780A0004, // 0006 JMPF R2 #000C + 0x28140933, // 0007 GE R5 R4 K51 + 0x78160002, // 0008 JMPF R5 #000C + 0xB8165E00, // 0009 GETNGBL R5 K47 + 0x88140B30, // 000A GETMBR R5 R5 K48 + 0x9016F50A, // 000B SETMBR R5 K122 K10 + 0x8C14017B, // 000C GETMET R5 R0 K123 + 0x5C1C0200, // 000D MOVE R7 R1 + 0x7C140400, // 000E CALL R5 2 + 0x4C140000, // 000F LDNIL R5 + 0x8818015D, // 0010 GETMBR R6 R0 K93 + 0x501C0200, // 0011 LDBOOL R7 1 0 + 0x20180C07, // 0012 NE R6 R6 R7 + 0x781A0000, // 0013 JMPF R6 #0015 + 0x8814015D, // 0014 GETMBR R5 R0 K93 + 0x9002BA03, // 0015 SETMBR R0 K93 R3 + 0x780A0002, // 0016 JMPF R2 #001A + 0xB81A5E00, // 0017 GETNGBL R6 K47 + 0x88180D30, // 0018 GETMBR R6 R6 K48 + 0x901AF404, // 0019 SETMBR R6 K122 R4 + 0x80040A00, // 001A RET 1 R5 }) ) ); @@ -2004,9 +1815,152 @@ be_local_closure(class_Tasmota_hs2rgb, /* name */ /******************************************************************** -** Solidified function: remove_cron +** Solidified function: run_timers ********************************************************************/ -be_local_closure(class_Tasmota_remove_cron, /* name */ +be_local_closure(class_Tasmota_run_timers, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_run_timers, + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0x8C04017C, // 0000 GETMET R1 R0 K124 + 0x7C040200, // 0001 CALL R1 1 + 0x8804014C, // 0002 GETMBR R1 R0 K76 + 0x78060015, // 0003 JMPF R1 #001A + 0x58040006, // 0004 LDCONST R1 K6 + 0x8808014C, // 0005 GETMBR R2 R0 K76 + 0x8C080507, // 0006 GETMET R2 R2 K7 + 0x7C080200, // 0007 CALL R2 1 + 0x14080202, // 0008 LT R2 R1 R2 + 0x780A000F, // 0009 JMPF R2 #001A + 0x8808014C, // 000A GETMBR R2 R0 K76 + 0x94080401, // 000B GETIDX R2 R2 R1 + 0x8C0C012C, // 000C GETMET R3 R0 K44 + 0x88140509, // 000D GETMBR R5 R2 K9 + 0x7C0C0400, // 000E CALL R3 2 + 0x780E0007, // 000F JMPF R3 #0018 + 0x880C0528, // 0010 GETMBR R3 R2 K40 + 0x8810014C, // 0011 GETMBR R4 R0 K76 + 0x8C100935, // 0012 GETMET R4 R4 K53 + 0x5C180200, // 0013 MOVE R6 R1 + 0x7C100400, // 0014 CALL R4 2 + 0x5C100600, // 0015 MOVE R4 R3 + 0x7C100000, // 0016 CALL R4 0 + 0x70020000, // 0017 JMP #0019 + 0x0004030A, // 0018 ADD R1 R1 K10 + 0x7001FFEA, // 0019 JMP #0005 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: exec_cmd +********************************************************************/ +be_local_closure(class_Tasmota_exec_cmd, /* name */ + be_nested_proto( + 12, /* nstack */ + 4, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_exec_cmd, + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0x8810017D, // 0000 GETMBR R4 R0 K125 + 0x78120016, // 0001 JMPF R4 #0019 + 0xA4124200, // 0002 IMPORT R4 K33 + 0x8C140922, // 0003 GETMET R5 R4 K34 + 0x5C1C0600, // 0004 MOVE R7 R3 + 0x7C140400, // 0005 CALL R5 2 + 0x8C18017E, // 0006 GETMET R6 R0 K126 + 0x8820017D, // 0007 GETMBR R8 R0 K125 + 0x5C240200, // 0008 MOVE R9 R1 + 0x7C180600, // 0009 CALL R6 3 + 0x4C1C0000, // 000A LDNIL R7 + 0x201C0C07, // 000B NE R7 R6 R7 + 0x781E000B, // 000C JMPF R7 #0019 + 0x8C1C017F, // 000D GETMET R7 R0 K127 + 0x5C240C00, // 000E MOVE R9 R6 + 0x7C1C0400, // 000F CALL R7 2 + 0x881C017D, // 0010 GETMBR R7 R0 K125 + 0x941C0E06, // 0011 GETIDX R7 R7 R6 + 0x5C200C00, // 0012 MOVE R8 R6 + 0x5C240400, // 0013 MOVE R9 R2 + 0x5C280600, // 0014 MOVE R10 R3 + 0x5C2C0A00, // 0015 MOVE R11 R5 + 0x7C1C0800, // 0016 CALL R7 4 + 0x501C0200, // 0017 LDBOOL R7 1 0 + 0x80040E00, // 0018 RET 1 R7 + 0x50100000, // 0019 LDBOOL R4 0 0 + 0x80040800, // 001A RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: add_cmd +********************************************************************/ +be_local_closure(class_Tasmota_add_cmd, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_add_cmd, + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x8C0C0136, // 0000 GETMET R3 R0 K54 + 0x5C140400, // 0001 MOVE R5 R2 + 0x7C0C0400, // 0002 CALL R3 2 + 0x880C017D, // 0003 GETMBR R3 R0 K125 + 0x4C100000, // 0004 LDNIL R4 + 0x1C0C0604, // 0005 EQ R3 R3 R4 + 0x780E0002, // 0006 JMPF R3 #000A + 0x600C0013, // 0007 GETGBL R3 G19 + 0x7C0C0000, // 0008 CALL R3 0 + 0x9002FA03, // 0009 SETMBR R0 K125 R3 + 0x600C0004, // 000A GETGBL R3 G4 + 0x5C100400, // 000B MOVE R4 R2 + 0x7C0C0200, // 000C CALL R3 1 + 0x1C0C070C, // 000D EQ R3 R3 K12 + 0x780E0002, // 000E JMPF R3 #0012 + 0x880C017D, // 000F GETMBR R3 R0 K125 + 0x980C0202, // 0010 SETIDX R3 R1 R2 + 0x70020000, // 0011 JMP #0013 + 0xB006773C, // 0012 RAISE 1 K59 K60 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: find_op +********************************************************************/ +be_local_closure(class_Tasmota_find_op, /* name */ be_nested_proto( 7, /* nstack */ 2, /* argc */ @@ -2017,27 +1971,40 @@ be_local_closure(class_Tasmota_remove_cron, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_Tasmota, /* shared constants */ - &be_const_str_remove_cron, + &be_const_str_find_op, &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x8808012D, // 0000 GETMBR R2 R0 K45 - 0x780A000E, // 0001 JMPF R2 #0011 - 0x580C001C, // 0002 LDCONST R3 K28 - 0x8C100530, // 0003 GETMET R4 R2 K48 - 0x7C100200, // 0004 CALL R4 1 - 0x14100604, // 0005 LT R4 R3 R4 - 0x78120009, // 0006 JMPF R4 #0011 - 0x94100403, // 0007 GETIDX R4 R2 R3 - 0x8810093D, // 0008 GETMBR R4 R4 K61 - 0x1C100801, // 0009 EQ R4 R4 R1 - 0x78120003, // 000A JMPF R4 #000F - 0x8C100552, // 000B GETMET R4 R2 K82 - 0x5C180600, // 000C MOVE R6 R3 - 0x7C100400, // 000D CALL R4 2 - 0x70020000, // 000E JMP #0010 - 0x000C0705, // 000F ADD R3 R3 K5 - 0x7001FFF1, // 0010 JMP #0003 - 0x80000000, // 0011 RET 0 + ( &(const binstruction[31]) { /* code */ + 0x8C080180, // 0000 GETMET R2 R0 K128 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x280C0506, // 0003 GE R3 R2 K6 + 0x780E0011, // 0004 JMPF R3 #0017 + 0x540E7FFE, // 0005 LDINT R3 32767 + 0x2C0C0403, // 0006 AND R3 R2 R3 + 0x5412000F, // 0007 LDINT R4 16 + 0x3C100404, // 0008 SHR R4 R2 R4 + 0x60140012, // 0009 GETGBL R5 G18 + 0x7C140000, // 000A CALL R5 0 + 0x0418070A, // 000B SUB R6 R3 K10 + 0x401A0C06, // 000C CONNECT R6 K6 R6 + 0x94180206, // 000D GETIDX R6 R1 R6 + 0x40180A06, // 000E CONNECT R6 R5 R6 + 0x0418090A, // 000F SUB R6 R4 K10 + 0x40180606, // 0010 CONNECT R6 R3 R6 + 0x94180206, // 0011 GETIDX R6 R1 R6 + 0x40180A06, // 0012 CONNECT R6 R5 R6 + 0x40180981, // 0013 CONNECT R6 R4 K129 + 0x94180206, // 0014 GETIDX R6 R1 R6 + 0x40180A06, // 0015 CONNECT R6 R5 R6 + 0x80040A00, // 0016 RET 1 R5 + 0x600C0012, // 0017 GETGBL R3 G18 + 0x7C0C0000, // 0018 CALL R3 0 + 0x40100601, // 0019 CONNECT R4 R3 R1 + 0x4C100000, // 001A LDNIL R4 + 0x40100604, // 001B CONNECT R4 R3 R4 + 0x4C100000, // 001C LDNIL R4 + 0x40100604, // 001D CONNECT R4 R3 R4 + 0x80040600, // 001E RET 1 R3 }) ) ); @@ -2327,72 +2294,72 @@ be_local_closure(class_Tasmota_load, /* name */ 0x84140003, // 0003 CLOSURE R5 P3 0x84180004, // 0004 CLOSURE R6 P4 0x841C0005, // 0005 CLOSURE R7 P5 - 0xA422AA00, // 0006 IMPORT R8 K85 - 0xA4271200, // 0007 IMPORT R9 K137 + 0xA4222200, // 0006 IMPORT R8 K17 + 0xA4270400, // 0007 IMPORT R9 K130 0x6028000C, // 0008 GETGBL R10 G12 0x5C2C0200, // 0009 MOVE R11 R1 0x7C280200, // 000A CALL R10 1 - 0x1C28151C, // 000B EQ R10 R10 K28 + 0x1C281506, // 000B EQ R10 R10 K6 0x782A0002, // 000C JMPF R10 #0010 0x50280000, // 000D LDBOOL R10 0 0 0xA0000000, // 000E CLOSE R0 0x80041400, // 000F RET 1 R10 - 0x8C28118A, // 0010 GETMET R10 R8 K138 + 0x8C281183, // 0010 GETMET R10 R8 K131 0x5C300200, // 0011 MOVE R12 R1 - 0x58340070, // 0012 LDCONST R13 K112 + 0x5834004F, // 0012 LDCONST R13 K79 0x7C280600, // 0013 CALL R10 3 0x742A0000, // 0014 JMPT R10 #0016 - 0x0006E001, // 0015 ADD R1 K112 R1 - 0x8C28110E, // 0016 GETMET R10 R8 K14 + 0x00069E01, // 0015 ADD R1 K79 R1 + 0x8C28111E, // 0016 GETMET R10 R8 K30 0x5C300200, // 0017 MOVE R12 R1 - 0x5834005F, // 0018 LDCONST R13 K95 + 0x58340084, // 0018 LDCONST R13 K132 0x7C280600, // 0019 CALL R10 3 - 0x242C151C, // 001A GT R11 R10 K28 + 0x242C1506, // 001A GT R11 R10 K6 0x782E0003, // 001B JMPF R11 #0020 - 0x04301505, // 001C SUB R12 R10 K5 - 0x4032380C, // 001D CONNECT R12 K28 R12 + 0x0430150A, // 001C SUB R12 R10 K10 + 0x40320C0C, // 001D CONNECT R12 K6 R12 0x9430020C, // 001E GETIDX R12 R1 R12 0x70020000, // 001F JMP #0021 0x5C300200, // 0020 MOVE R12 R1 0x782E0003, // 0021 JMPF R11 #0026 - 0x00341505, // 0022 ADD R13 R10 K5 - 0x40341B51, // 0023 CONNECT R13 R13 K81 + 0x0034150A, // 0022 ADD R13 R10 K10 + 0x40341B81, // 0023 CONNECT R13 R13 K129 0x9434020D, // 0024 GETIDX R13 R1 R13 0x70020000, // 0025 JMP #0027 0x5C340200, // 0026 MOVE R13 R1 - 0x8C38110E, // 0027 GETMET R14 R8 K14 + 0x8C38111E, // 0027 GETMET R14 R8 K30 0x5C401A00, // 0028 MOVE R16 R13 - 0x5844008B, // 0029 LDCONST R17 K139 + 0x58440085, // 0029 LDCONST R17 K133 0x7C380600, // 002A CALL R14 3 - 0x14381D1C, // 002B LT R14 R14 K28 + 0x14381D06, // 002B LT R14 R14 K6 0x783A0001, // 002C JMPF R14 #002F - 0x0004035D, // 002D ADD R1 R1 K93 - 0x00341B5D, // 002E ADD R13 R13 K93 - 0x8C38115C, // 002F GETMET R14 R8 K92 + 0x00040386, // 002D ADD R1 R1 K134 + 0x00341B86, // 002E ADD R13 R13 K134 + 0x8C381187, // 002F GETMET R14 R8 K135 0x5C401A00, // 0030 MOVE R16 R13 - 0x5844005D, // 0031 LDCONST R17 K93 + 0x58440086, // 0031 LDCONST R17 K134 0x7C380600, // 0032 CALL R14 3 - 0x8C3C115C, // 0033 GETMET R15 R8 K92 + 0x8C3C1187, // 0033 GETMET R15 R8 K135 0x5C441A00, // 0034 MOVE R17 R13 - 0x5848008C, // 0035 LDCONST R18 K140 + 0x58480088, // 0035 LDCONST R18 K136 0x7C3C0600, // 0036 CALL R15 3 0x783E0001, // 0037 JMPF R15 #003A 0x5C400200, // 0038 MOVE R16 R1 0x70020000, // 0039 JMP #003B - 0x00400364, // 003A ADD R16 R1 K100 + 0x00400389, // 003A ADD R16 R1 K137 0x5C441C00, // 003B MOVE R17 R14 0x74460007, // 003C JMPT R17 #0045 0x5C441E00, // 003D MOVE R17 R15 0x74460005, // 003E JMPT R17 #0045 0x60440001, // 003F GETGBL R17 G1 - 0x5848008D, // 0040 LDCONST R18 K141 + 0x5848008A, // 0040 LDCONST R18 K138 0x7C440200, // 0041 CALL R17 1 0x50440000, // 0042 LDBOOL R17 0 0 0xA0000000, // 0043 CLOSE R0 0x80042200, // 0044 RET 1 R17 0x50440000, // 0045 LDBOOL R17 0 0 0x783E0008, // 0046 JMPF R15 #0050 - 0x8C48138E, // 0047 GETMET R18 R9 K142 + 0x8C48138B, // 0047 GETMET R18 R9 K139 0x5C502000, // 0048 MOVE R20 R16 0x7C480400, // 0049 CALL R18 2 0x744A0002, // 004A JMPT R18 #004E @@ -2401,11 +2368,11 @@ be_local_closure(class_Tasmota_load, /* name */ 0x80042400, // 004D RET 1 R18 0x50440200, // 004E LDBOOL R17 1 0 0x70020014, // 004F JMP #0065 - 0x8C48138E, // 0050 GETMET R18 R9 K142 + 0x8C48138B, // 0050 GETMET R18 R9 K139 0x5C500200, // 0051 MOVE R20 R1 0x7C480400, // 0052 CALL R18 2 0x784A0007, // 0053 JMPF R18 #005C - 0x8C48138E, // 0054 GETMET R18 R9 K142 + 0x8C48138B, // 0054 GETMET R18 R9 K139 0x5C502000, // 0055 MOVE R20 R16 0x7C480400, // 0056 CALL R18 2 0x784A0002, // 0057 JMPF R18 #005B @@ -2413,7 +2380,7 @@ be_local_closure(class_Tasmota_load, /* name */ 0x5C4C2000, // 0059 MOVE R19 R16 0x7C480200, // 005A CALL R18 1 0x70020008, // 005B JMP #0065 - 0x8C48138E, // 005C GETMET R18 R9 K142 + 0x8C48138B, // 005C GETMET R18 R9 K139 0x5C502000, // 005D MOVE R20 R16 0x7C480400, // 005E CALL R18 2 0x784A0001, // 005F JMPF R18 #0062 @@ -2423,7 +2390,7 @@ be_local_closure(class_Tasmota_load, /* name */ 0xA0000000, // 0063 CLOSE R0 0x80042400, // 0064 RET 1 R18 0x782E0005, // 0065 JMPF R11 #006C - 0x0048195F, // 0066 ADD R18 R12 K95 + 0x00481984, // 0066 ADD R18 R12 K132 0x90028A12, // 0067 SETMBR R0 K69 R18 0x5C480400, // 0068 MOVE R18 R2 0x884C0145, // 0069 GETMBR R19 R0 K69 @@ -2441,7 +2408,7 @@ be_local_closure(class_Tasmota_load, /* name */ 0x78560007, // 0075 JMPF R21 #007E 0x60540001, // 0076 GETGBL R21 G1 0x60580018, // 0077 GETGBL R22 G24 - 0x585C008F, // 0078 LDCONST R23 K143 + 0x585C008C, // 0078 LDCONST R23 K140 0x5C602000, // 0079 MOVE R24 R16 0x7C580400, // 007A CALL R22 2 0x7C540200, // 007B CALL R21 1 @@ -2452,7 +2419,7 @@ be_local_closure(class_Tasmota_load, /* name */ 0x78560007, // 0080 JMPF R21 #0089 0x60540001, // 0081 GETGBL R21 G1 0x60580018, // 0082 GETGBL R22 G24 - 0x585C0090, // 0083 LDCONST R23 K144 + 0x585C008D, // 0083 LDCONST R23 K141 0x5C602000, // 0084 MOVE R24 R16 0x5C642600, // 0085 MOVE R25 R19 0x7C580600, // 0086 CALL R22 3 @@ -2481,7 +2448,7 @@ be_local_closure(class_Tasmota_load, /* name */ 0x7C4C0200, // 009D CALL R19 1 0x782E0002, // 009E JMPF R11 #00A2 0x5C500600, // 009F MOVE R20 R3 - 0x0054195F, // 00A0 ADD R21 R12 K95 + 0x00541984, // 00A0 ADD R21 R12 K132 0x7C500200, // 00A1 CALL R20 1 0xA0000000, // 00A2 CLOSE R0 0x80042600, // 00A3 RET 1 R19 @@ -2491,6 +2458,182 @@ be_local_closure(class_Tasmota_load, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: compile +********************************************************************/ +be_local_closure(class_Tasmota_compile, /* name */ + be_nested_proto( + 12, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_compile, + &be_const_str_solidified, + ( &(const binstruction[84]) { /* code */ + 0xA40A2200, // 0000 IMPORT R2 K17 + 0x8C0C0587, // 0001 GETMET R3 R2 K135 + 0x5C140200, // 0002 MOVE R5 R1 + 0x58180086, // 0003 LDCONST R6 K134 + 0x7C0C0600, // 0004 CALL R3 3 + 0x740E0007, // 0005 JMPT R3 #000E + 0x600C0001, // 0006 GETGBL R3 G1 + 0x60100018, // 0007 GETGBL R4 G24 + 0x5814008E, // 0008 LDCONST R5 K142 + 0x5C180200, // 0009 MOVE R6 R1 + 0x7C100400, // 000A CALL R4 2 + 0x7C0C0200, // 000B CALL R3 1 + 0x500C0000, // 000C LDBOOL R3 0 0 + 0x80040600, // 000D RET 1 R3 + 0x8C0C051E, // 000E GETMET R3 R2 K30 + 0x5C140200, // 000F MOVE R5 R1 + 0x58180084, // 0010 LDCONST R6 K132 + 0x7C0C0600, // 0011 CALL R3 3 + 0x240C0706, // 0012 GT R3 R3 K6 + 0x780E0006, // 0013 JMPF R3 #001B + 0x600C0001, // 0014 GETGBL R3 G1 + 0x60100018, // 0015 GETGBL R4 G24 + 0x5814008F, // 0016 LDCONST R5 K143 + 0x7C100200, // 0017 CALL R4 1 + 0x7C0C0200, // 0018 CALL R3 1 + 0x500C0000, // 0019 LDBOOL R3 0 0 + 0x80040600, // 001A RET 1 R3 + 0x4C0C0000, // 001B LDNIL R3 + 0xA8020011, // 001C EXBLK 0 #002F + 0x6010000D, // 001D GETGBL R4 G13 + 0x5C140200, // 001E MOVE R5 R1 + 0x58180090, // 001F LDCONST R6 K144 + 0x7C100400, // 0020 CALL R4 2 + 0x5C0C0800, // 0021 MOVE R3 R4 + 0x4C100000, // 0022 LDNIL R4 + 0x1C100604, // 0023 EQ R4 R3 R4 + 0x78120007, // 0024 JMPF R4 #002D + 0x60100001, // 0025 GETGBL R4 G1 + 0x60140018, // 0026 GETGBL R5 G24 + 0x58180091, // 0027 LDCONST R6 K145 + 0x7C140200, // 0028 CALL R5 1 + 0x7C100200, // 0029 CALL R4 1 + 0x50100000, // 002A LDBOOL R4 0 0 + 0xA8040001, // 002B EXBLK 1 1 + 0x80040800, // 002C RET 1 R4 + 0xA8040001, // 002D EXBLK 1 1 + 0x7002000D, // 002E JMP #003D + 0xAC100002, // 002F CATCH R4 0 2 + 0x7002000A, // 0030 JMP #003C + 0x60180001, // 0031 GETGBL R6 G1 + 0x601C0018, // 0032 GETGBL R7 G24 + 0x58200092, // 0033 LDCONST R8 K146 + 0x5C240200, // 0034 MOVE R9 R1 + 0x5C280800, // 0035 MOVE R10 R4 + 0x5C2C0A00, // 0036 MOVE R11 R5 + 0x7C1C0800, // 0037 CALL R7 4 + 0x7C180200, // 0038 CALL R6 1 + 0x50180000, // 0039 LDBOOL R6 0 0 + 0x80040C00, // 003A RET 1 R6 + 0x70020000, // 003B JMP #003D + 0xB0080000, // 003C RAISE 2 R0 R0 + 0x00100389, // 003D ADD R4 R1 K137 + 0xA8020005, // 003E EXBLK 0 #0045 + 0x8C140172, // 003F GETMET R5 R0 K114 + 0x5C1C0800, // 0040 MOVE R7 R4 + 0x5C200600, // 0041 MOVE R8 R3 + 0x7C140600, // 0042 CALL R5 3 + 0xA8040001, // 0043 EXBLK 1 1 + 0x7002000C, // 0044 JMP #0052 + 0xAC140001, // 0045 CATCH R5 0 1 + 0x70020009, // 0046 JMP #0051 + 0x60180001, // 0047 GETGBL R6 G1 + 0x601C0018, // 0048 GETGBL R7 G24 + 0x58200093, // 0049 LDCONST R8 K147 + 0x5C240800, // 004A MOVE R9 R4 + 0x5C280A00, // 004B MOVE R10 R5 + 0x7C1C0600, // 004C CALL R7 3 + 0x7C180200, // 004D CALL R6 1 + 0x50180000, // 004E LDBOOL R6 0 0 + 0x80040C00, // 004F RET 1 R6 + 0x70020000, // 0050 JMP #0052 + 0xB0080000, // 0051 RAISE 2 R0 R0 + 0x50140200, // 0052 LDBOOL R5 1 0 + 0x80040A00, // 0053 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_light +********************************************************************/ +be_local_closure(class_Tasmota_set_light, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_set_light, + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x600C0001, // 0000 GETGBL R3 G1 + 0x58100094, // 0001 LDCONST R4 K148 + 0x7C0C0200, // 0002 CALL R3 1 + 0xA40EEE00, // 0003 IMPORT R3 K119 + 0x4C100000, // 0004 LDNIL R4 + 0x20100404, // 0005 NE R4 R2 R4 + 0x78120005, // 0006 JMPF R4 #000D + 0x8C100795, // 0007 GETMET R4 R3 K149 + 0x5C180200, // 0008 MOVE R6 R1 + 0x5C1C0400, // 0009 MOVE R7 R2 + 0x7C100600, // 000A CALL R4 3 + 0x80040800, // 000B RET 1 R4 + 0x70020003, // 000C JMP #0011 + 0x8C100795, // 000D GETMET R4 R3 K149 + 0x5C180200, // 000E MOVE R6 R1 + 0x7C100400, // 000F CALL R4 2 + 0x80040800, // 0010 RET 1 R4 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: gen_cb +********************************************************************/ +be_local_closure(class_Tasmota_gen_cb, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_gen_cb, + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0xA40B2C00, // 0000 IMPORT R2 K150 + 0x8C0C0597, // 0001 GETMET R3 R2 K151 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x80040600, // 0004 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: urlfetch_cmd ********************************************************************/ @@ -2508,24 +2651,24 @@ be_local_closure(class_Tasmota_urlfetch_cmd, /* name */ &be_const_str_urlfetch_cmd, &be_const_str_solidified, ( &(const binstruction[34]) { /* code */ - 0xA416AA00, // 0000 IMPORT R5 K85 - 0x8C180B0E, // 0001 GETMET R6 R5 K14 + 0xA4162200, // 0000 IMPORT R5 K17 + 0x8C180B1E, // 0001 GETMET R6 R5 K30 0x5C200600, // 0002 MOVE R8 R3 - 0x58240091, // 0003 LDCONST R9 K145 + 0x58240098, // 0003 LDCONST R9 K152 0x7C180600, // 0004 CALL R6 3 - 0x20180D1C, // 0005 NE R6 R6 K28 + 0x20180D06, // 0005 NE R6 R6 K6 0x781A0003, // 0006 JMPF R6 #000B - 0x8C180192, // 0007 GETMET R6 R0 K146 - 0x58200093, // 0008 LDCONST R8 K147 + 0x8C180199, // 0007 GETMET R6 R0 K153 + 0x5820009A, // 0008 LDCONST R8 K154 0x7C180400, // 0009 CALL R6 2 0x80000C00, // 000A RET 0 0xA802000A, // 000B EXBLK 0 #0017 - 0x8C180194, // 000C GETMET R6 R0 K148 + 0x8C18019B, // 000C GETMET R6 R0 K155 0x5C200600, // 000D MOVE R8 R3 0x7C180400, // 000E CALL R6 2 - 0x141C0D1C, // 000F LT R7 R6 K28 + 0x141C0D06, // 000F LT R7 R6 K6 0x781E0003, // 0010 JMPF R7 #0015 - 0x8C1C0195, // 0011 GETMET R7 R0 K149 + 0x8C1C019C, // 0011 GETMET R7 R0 K156 0x7C1C0200, // 0012 CALL R7 1 0xA8040001, // 0013 EXBLK 1 1 0x80000E00, // 0014 RET 0 @@ -2533,13 +2676,13 @@ be_local_closure(class_Tasmota_urlfetch_cmd, /* name */ 0x70020006, // 0016 JMP #001E 0xAC180002, // 0017 CATCH R6 0 2 0x70020003, // 0018 JMP #001D - 0x8C200195, // 0019 GETMET R8 R0 K149 + 0x8C20019C, // 0019 GETMET R8 R0 K156 0x7C200200, // 001A CALL R8 1 0x80001000, // 001B RET 0 0x70020000, // 001C JMP #001E 0xB0080000, // 001D RAISE 2 R0 R0 - 0xB81A0200, // 001E GETNGBL R6 K1 - 0x8C180D96, // 001F GETMET R6 R6 K150 + 0xB81A5E00, // 001E GETNGBL R6 K47 + 0x8C180D9D, // 001F GETMET R6 R6 K157 0x7C180200, // 0020 CALL R6 1 0x80000000, // 0021 RET 0 }) @@ -2548,65 +2691,141 @@ be_local_closure(class_Tasmota_urlfetch_cmd, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: remove_cmd +********************************************************************/ +be_local_closure(class_Tasmota_remove_cmd, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_remove_cmd, + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x8808017D, // 0000 GETMBR R2 R0 K125 + 0x780A0003, // 0001 JMPF R2 #0006 + 0x8808017D, // 0002 GETMBR R2 R0 K125 + 0x8C080535, // 0003 GETMET R2 R2 K53 + 0x5C100200, // 0004 MOVE R4 R1 + 0x7C080400, // 0005 CALL R2 2 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_timer +********************************************************************/ +be_local_closure(class_Tasmota_remove_timer, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Tasmota, /* shared constants */ + &be_const_str_remove_timer, + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x8808014C, // 0000 GETMBR R2 R0 K76 + 0x780A000E, // 0001 JMPF R2 #0011 + 0x580C0006, // 0002 LDCONST R3 K6 + 0x8C100507, // 0003 GETMET R4 R2 K7 + 0x7C100200, // 0004 CALL R4 1 + 0x14100604, // 0005 LT R4 R3 R4 + 0x78120009, // 0006 JMPF R4 #0011 + 0x94100403, // 0007 GETIDX R4 R2 R3 + 0x88100908, // 0008 GETMBR R4 R4 K8 + 0x1C100801, // 0009 EQ R4 R4 R1 + 0x78120003, // 000A JMPF R4 #000F + 0x8C100535, // 000B GETMET R4 R2 K53 + 0x5C180600, // 000C MOVE R6 R3 + 0x7C100400, // 000D CALL R4 2 + 0x70020000, // 000E JMP #0010 + 0x000C070A, // 000F ADD R3 R3 K10 + 0x7001FFF1, // 0010 JMP #0003 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Tasmota ********************************************************************/ be_local_class(Tasmota, - 13, + 14, NULL, - be_nested_map(51, + be_nested_map(56, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key(cmd, -1), be_const_closure(class_Tasmota_cmd_closure) }, - { be_const_key(wd, 47), be_const_var(11) }, - { be_const_key(_crons, 13), be_const_var(3) }, - { be_const_key(urlfetch_cmd, -1), be_const_closure(class_Tasmota_urlfetch_cmd_closure) }, - { be_const_key(load, -1), be_const_closure(class_Tasmota_load_closure) }, - { be_const_key(global, -1), be_const_var(9) }, - { be_const_key(event, -1), be_const_closure(class_Tasmota_event_closure) }, - { be_const_key(exec_cmd, 12), be_const_closure(class_Tasmota_exec_cmd_closure) }, - { be_const_key(remove_cron, -1), be_const_closure(class_Tasmota_remove_cron_closure) }, - { be_const_key(hs2rgb, 21), be_const_closure(class_Tasmota_hs2rgb_closure) }, - { be_const_key(remove_driver, 30), be_const_closure(class_Tasmota_remove_driver_closure) }, - { be_const_key(add_driver, -1), be_const_closure(class_Tasmota_add_driver_closure) }, - { be_const_key(remove_cmd, -1), be_const_closure(class_Tasmota_remove_cmd_closure) }, - { be_const_key(gc, -1), be_const_closure(class_Tasmota_gc_closure) }, - { be_const_key(_fl, 25), be_const_var(0) }, - { be_const_key(init, -1), be_const_closure(class_Tasmota_init_closure) }, - { be_const_key(_drivers, 48), be_const_var(5) }, - { be_const_key(try_rule, -1), be_const_closure(class_Tasmota_try_rule_closure) }, - { be_const_key(get_light, -1), be_const_closure(class_Tasmota_get_light_closure) }, - { be_const_key(cmd_res, -1), be_const_var(8) }, - { be_const_key(exec_rules, -1), be_const_closure(class_Tasmota_exec_rules_closure) }, - { be_const_key(_ccmd, -1), be_const_var(4) }, - { be_const_key(find_list_i, 33), be_const_closure(class_Tasmota_find_list_i_closure) }, - { be_const_key(remove_fast_loop, -1), be_const_closure(class_Tasmota_remove_fast_loop_closure) }, - { be_const_key(check_not_method, 20), be_const_closure(class_Tasmota_check_not_method_closure) }, - { be_const_key(exec_tele, -1), be_const_closure(class_Tasmota_exec_tele_closure) }, - { be_const_key(run_deferred, -1), be_const_closure(class_Tasmota_run_deferred_closure) }, - { be_const_key(compile, -1), be_const_closure(class_Tasmota_compile_closure) }, - { be_const_key(wire2, 42), be_const_var(7) }, - { be_const_key(remove_rule, 34), be_const_closure(class_Tasmota_remove_rule_closure) }, - { be_const_key(set_timer, -1), be_const_closure(class_Tasmota_set_timer_closure) }, - { be_const_key(gen_cb, -1), be_const_closure(class_Tasmota_gen_cb_closure) }, - { be_const_key(wire1, -1), be_const_var(6) }, - { be_const_key(wire_scan, -1), be_const_closure(class_Tasmota_wire_scan_closure) }, - { be_const_key(find_key_i, -1), be_const_closure(class_Tasmota_find_key_i_closure) }, - { be_const_key(urlfetch, -1), be_const_closure(class_Tasmota_urlfetch_closure) }, - { be_const_key(_debug_present, 9), be_const_var(12) }, - { be_const_key(settings, -1), be_const_var(10) }, - { be_const_key(fast_loop, -1), be_const_closure(class_Tasmota_fast_loop_closure) }, - { be_const_key(next_cron, 31), be_const_closure(class_Tasmota_next_cron_closure) }, - { be_const_key(_rules, 8), be_const_var(1) }, - { be_const_key(time_str, -1), be_const_closure(class_Tasmota_time_str_closure) }, + { be_const_key(wire_scan, 29), be_const_closure(class_Tasmota_wire_scan_closure) }, + { be_const_key(next_cron, -1), be_const_closure(class_Tasmota_next_cron_closure) }, { be_const_key(remove_timer, -1), be_const_closure(class_Tasmota_remove_timer_closure) }, - { be_const_key(add_fast_loop, -1), be_const_closure(class_Tasmota_add_fast_loop_closure) }, - { be_const_key(run_cron, 18), be_const_closure(class_Tasmota_run_cron_closure) }, - { be_const_key(add_cron, -1), be_const_closure(class_Tasmota_add_cron_closure) }, - { be_const_key(_timers, -1), be_const_var(2) }, - { be_const_key(find_op, -1), be_const_closure(class_Tasmota_find_op_closure) }, + { be_const_key(find_list_i, -1), be_const_closure(class_Tasmota_find_list_i_closure) }, + { be_const_key(time_str, 40), be_const_closure(class_Tasmota_time_str_closure) }, + { be_const_key(remove_cmd, 41), be_const_closure(class_Tasmota_remove_cmd_closure) }, + { be_const_key(wd, 12), be_const_var(12) }, + { be_const_key(urlfetch_cmd, 52), be_const_closure(class_Tasmota_urlfetch_cmd_closure) }, + { be_const_key(remove_driver, -1), be_const_closure(class_Tasmota_remove_driver_closure) }, + { be_const_key(exec_tele, -1), be_const_closure(class_Tasmota_exec_tele_closure) }, + { be_const_key(run_cron, -1), be_const_closure(class_Tasmota_run_cron_closure) }, + { be_const_key(set_light, -1), be_const_closure(class_Tasmota_set_light_closure) }, + { be_const_key(compile, -1), be_const_closure(class_Tasmota_compile_closure) }, + { be_const_key(hs2rgb, 16), be_const_closure(class_Tasmota_hs2rgb_closure) }, + { be_const_key(exec_rules, -1), be_const_closure(class_Tasmota_exec_rules_closure) }, { be_const_key(add_rule, -1), be_const_closure(class_Tasmota_add_rule_closure) }, - { be_const_key(add_cmd, 4), be_const_closure(class_Tasmota_add_cmd_closure) }, - { be_const_key(set_light, 3), be_const_closure(class_Tasmota_set_light_closure) }, + { be_const_key(_ccmd, -1), be_const_var(5) }, + { be_const_key(_rules, -1), be_const_var(1) }, + { be_const_key(int, -1), be_const_static_closure(class_Tasmota_int_closure) }, + { be_const_key(init, 53), be_const_closure(class_Tasmota_init_closure) }, + { be_const_key(exec_cmd, 46), be_const_closure(class_Tasmota_exec_cmd_closure) }, + { be_const_key(add_cron, 7), be_const_closure(class_Tasmota_add_cron_closure) }, + { be_const_key(_defer, -1), be_const_var(3) }, + { be_const_key(run_timers, -1), be_const_closure(class_Tasmota_run_timers_closure) }, + { be_const_key(remove_rule, -1), be_const_closure(class_Tasmota_remove_rule_closure) }, + { be_const_key(_drivers, -1), be_const_var(6) }, + { be_const_key(urlfetch, 51), be_const_closure(class_Tasmota_urlfetch_closure) }, + { be_const_key(_crons, 50), be_const_var(4) }, + { be_const_key(_timers, 14), be_const_var(2) }, + { be_const_key(settings, -1), be_const_var(11) }, + { be_const_key(global, 18), be_const_var(10) }, + { be_const_key(check_not_method, 20), be_const_closure(class_Tasmota_check_not_method_closure) }, + { be_const_key(run_deferred, 11), be_const_closure(class_Tasmota_run_deferred_closure) }, + { be_const_key(add_rule_once, -1), be_const_closure(class_Tasmota_add_rule_once_closure) }, + { be_const_key(remove_cron, -1), be_const_closure(class_Tasmota_remove_cron_closure) }, + { be_const_key(defer, 10), be_const_closure(class_Tasmota_defer_closure) }, + { be_const_key(event, -1), be_const_closure(class_Tasmota_event_closure) }, + { be_const_key(_debug_present, -1), be_const_var(13) }, + { be_const_key(wire2, -1), be_const_var(8) }, + { be_const_key(remove_fast_loop, 36), be_const_closure(class_Tasmota_remove_fast_loop_closure) }, + { be_const_key(get_light, -1), be_const_closure(class_Tasmota_get_light_closure) }, + { be_const_key(find_key_i, -1), be_const_closure(class_Tasmota_find_key_i_closure) }, + { be_const_key(add_fast_loop, -1), be_const_closure(class_Tasmota_add_fast_loop_closure) }, + { be_const_key(cmd, -1), be_const_closure(class_Tasmota_cmd_closure) }, + { be_const_key(_fl, -1), be_const_var(0) }, + { be_const_key(try_rule, 23), be_const_closure(class_Tasmota_try_rule_closure) }, + { be_const_key(gc, -1), be_const_closure(class_Tasmota_gc_closure) }, + { be_const_key(add_cmd, -1), be_const_closure(class_Tasmota_add_cmd_closure) }, + { be_const_key(find_op, -1), be_const_closure(class_Tasmota_find_op_closure) }, + { be_const_key(load, -1), be_const_closure(class_Tasmota_load_closure) }, + { be_const_key(add_driver, 35), be_const_closure(class_Tasmota_add_driver_closure) }, + { be_const_key(cmd_res, -1), be_const_var(9) }, + { be_const_key(set_timer, -1), be_const_closure(class_Tasmota_set_timer_closure) }, + { be_const_key(wire1, -1), be_const_var(7) }, + { be_const_key(fast_loop, 5), be_const_closure(class_Tasmota_fast_loop_closure) }, + { be_const_key(gen_cb, 2), be_const_closure(class_Tasmota_gen_cb_closure) }, })), (bstring*) &be_const_str_Tasmota ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_trigger_class.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_trigger_class.h index 7a27c3116..d22c641a1 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_trigger_class.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_trigger_class.h @@ -3,21 +3,113 @@ * Generated code, don't edit * \********************************************************************/ #include "be_constobj.h" -// compact class 'Trigger' ktab size: 8, total: 14 (saved 48 bytes) +// compact class 'Trigger' ktab size: 8, total: 15 (saved 56 bytes) static const bvalue be_ktab_class_Trigger[8] = { - /* K0 */ be_nested_str(trig), - /* K1 */ be_nested_str(f), - /* K2 */ be_nested_str(id), - /* K3 */ be_nested_str(o), - /* K4 */ be_nested_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str(time_reached), - /* K7 */ be_nested_str(next), + /* K0 */ be_nested_str(o), + /* K1 */ be_nested_str(next), + /* K2 */ be_nested_str(trig), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str(time_reached), + /* K5 */ be_nested_str(f), + /* K6 */ be_nested_str(id), + /* K7 */ be_nested_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), }; extern const bclass be_class_Trigger; +/******************************************************************** +** Solidified function: run_once +********************************************************************/ +be_local_closure(class_Trigger_run_once, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Trigger, /* shared constants */ + &be_const_str_run_once, + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x50080200, // 0001 LDBOOL R2 1 0 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: next +********************************************************************/ +be_local_closure(class_Trigger_next, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Trigger, /* shared constants */ + &be_const_str_next, + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060003, // 0001 JMPF R1 #0006 + 0x88040100, // 0002 GETMBR R1 R0 K0 + 0x8C040301, // 0003 GETMET R1 R1 K1 + 0x7C040200, // 0004 CALL R1 1 + 0x80040200, // 0005 RET 1 R1 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: time_reached +********************************************************************/ +be_local_closure(class_Trigger_time_reached, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_Trigger, /* shared constants */ + &be_const_str_time_reached, + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060007, // 0001 JMPF R1 #000A + 0x88040102, // 0002 GETMBR R1 R0 K2 + 0x24040303, // 0003 GT R1 R1 K3 + 0x78060004, // 0004 JMPF R1 #000A + 0x88040100, // 0005 GETMBR R1 R0 K0 + 0x8C040304, // 0006 GETMET R1 R1 K4 + 0x880C0102, // 0007 GETMBR R3 R0 K2 + 0x7C040400, // 0008 CALL R1 2 + 0x80040200, // 0009 RET 1 R1 + 0x50040000, // 000A LDBOOL R1 0 0 + 0x80040200, // 000B RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -35,10 +127,10 @@ be_local_closure(class_Trigger_init, /* name */ &be_const_str_init, &be_const_str_solidified, ( &(const binstruction[ 5]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x90020202, // 0001 SETMBR R0 K1 R2 - 0x90020403, // 0002 SETMBR R0 K2 R3 - 0x90020604, // 0003 SETMBR R0 K3 R4 + 0x90020401, // 0000 SETMBR R0 K2 R1 + 0x90020A02, // 0001 SETMBR R0 K5 R2 + 0x90020C03, // 0002 SETMBR R0 K6 R3 + 0x90020004, // 0003 SETMBR R0 K0 R4 0x80000000, // 0004 RET 0 }) ) @@ -64,20 +156,20 @@ be_local_closure(class_Trigger_tostring, /* name */ &be_const_str_solidified, ( &(const binstruction[18]) { /* code */ 0x60040018, // 0000 GETGBL R1 G24 - 0x58080004, // 0001 LDCONST R2 K4 + 0x58080007, // 0001 LDCONST R2 K7 0x600C0008, // 0002 GETGBL R3 G8 0x60100006, // 0003 GETGBL R4 G6 0x5C140000, // 0004 MOVE R5 R0 0x7C100200, // 0005 CALL R4 1 0x7C0C0200, // 0006 CALL R3 1 0x60100008, // 0007 GETGBL R4 G8 - 0x88140100, // 0008 GETMBR R5 R0 K0 + 0x88140102, // 0008 GETMBR R5 R0 K2 0x7C100200, // 0009 CALL R4 1 0x60140008, // 000A GETGBL R5 G8 - 0x88180101, // 000B GETMBR R6 R0 K1 + 0x88180105, // 000B GETMBR R6 R0 K5 0x7C140200, // 000C CALL R5 1 0x60180008, // 000D GETGBL R6 G8 - 0x881C0102, // 000E GETMBR R7 R0 K2 + 0x881C0106, // 000E GETMBR R7 R0 K6 0x7C180200, // 000F CALL R6 1 0x7C040A00, // 0010 CALL R1 5 0x80040200, // 0011 RET 1 R1 @@ -87,87 +179,23 @@ be_local_closure(class_Trigger_tostring, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: time_reached -********************************************************************/ -be_local_closure(class_Trigger_time_reached, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Trigger, /* shared constants */ - &be_const_str_time_reached, - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x88040103, // 0000 GETMBR R1 R0 K3 - 0x78060007, // 0001 JMPF R1 #000A - 0x88040100, // 0002 GETMBR R1 R0 K0 - 0x24040305, // 0003 GT R1 R1 K5 - 0x78060004, // 0004 JMPF R1 #000A - 0x88040103, // 0005 GETMBR R1 R0 K3 - 0x8C040306, // 0006 GETMET R1 R1 K6 - 0x880C0100, // 0007 GETMBR R3 R0 K0 - 0x7C040400, // 0008 CALL R1 2 - 0x80040200, // 0009 RET 1 R1 - 0x50040000, // 000A LDBOOL R1 0 0 - 0x80040200, // 000B RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: next -********************************************************************/ -be_local_closure(class_Trigger_next, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_Trigger, /* shared constants */ - &be_const_str_next, - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88040103, // 0000 GETMBR R1 R0 K3 - 0x78060003, // 0001 JMPF R1 #0006 - 0x88040103, // 0002 GETMBR R1 R0 K3 - 0x8C040307, // 0003 GETMET R1 R1 K7 - 0x7C040200, // 0004 CALL R1 1 - 0x80040200, // 0005 RET 1 R1 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Trigger ********************************************************************/ be_local_class(Trigger, 4, NULL, - be_nested_map(8, + be_nested_map(9, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key(id, 2), be_const_var(2) }, - { be_const_key(f, -1), be_const_var(1) }, - { be_const_key(next, -1), be_const_closure(class_Trigger_next_closure) }, - { be_const_key(trig, 7), be_const_var(0) }, - { be_const_key(time_reached, -1), be_const_closure(class_Trigger_time_reached_closure) }, - { be_const_key(tostring, 4), be_const_closure(class_Trigger_tostring_closure) }, + { be_const_key(run_once, 3), be_const_closure(class_Trigger_run_once_closure) }, { be_const_key(o, -1), be_const_var(3) }, + { be_const_key(next, -1), be_const_closure(class_Trigger_next_closure) }, + { be_const_key(trig, -1), be_const_var(0) }, { be_const_key(init, -1), be_const_closure(class_Trigger_init_closure) }, + { be_const_key(time_reached, -1), be_const_closure(class_Trigger_time_reached_closure) }, + { be_const_key(id, 4), be_const_var(2) }, + { be_const_key(tostring, -1), be_const_closure(class_Trigger_tostring_closure) }, + { be_const_key(f, -1), be_const_var(1) }, })), (bstring*) &be_const_str_Trigger ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_webserver_async.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_webserver_async.h index 9ca5531f9..5f9a8b2c4 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_webserver_async.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_webserver_async.h @@ -1118,8 +1118,8 @@ be_local_class(webserver_async_dispatcher, be_str_weak(webserver_async_dispatcher) ); extern const bclass be_class_webserver_async; -// compact class 'webserver_async' ktab size: 47, total: 71 (saved 192 bytes) -static const bvalue be_ktab_class_webserver_async[47] = { +// compact class 'webserver_async' ktab size: 48, total: 71 (saved 184 bytes) +static const bvalue be_ktab_class_webserver_async[48] = { /* K0 */ be_nested_str_weak(chunked), /* K1 */ be_nested_str_weak(re), /* K2 */ be_nested_str_weak(global), @@ -1160,13 +1160,14 @@ static const bvalue be_ktab_class_webserver_async[47] = { /* K37 */ be_nested_str_weak(add_fast_loop), /* K38 */ be_nested_str_weak(connected), /* K39 */ be_nested_str_weak(remove), - /* K40 */ be_nested_str_weak(webserver_async_dispatcher), - /* K41 */ be_nested_str_weak(dispatch), - /* K42 */ be_nested_str_weak(send), - /* K43 */ be_nested_str_weak(text_X2Fplain), - /* K44 */ be_nested_str_weak(write), - /* K45 */ be_nested_str_weak(Unsupported), - /* K46 */ be_nested_str_weak(content_stop), + /* K40 */ be_nested_str_weak(append), + /* K41 */ be_nested_str_weak(webserver_async_dispatcher), + /* K42 */ be_nested_str_weak(dispatch), + /* K43 */ be_nested_str_weak(send), + /* K44 */ be_nested_str_weak(text_X2Fplain), + /* K45 */ be_nested_str_weak(write), + /* K46 */ be_nested_str_weak(Unsupported), + /* K47 */ be_nested_str_weak(content_stop), }; @@ -1565,11 +1566,11 @@ be_local_closure(class_webserver_async_clean_connections, /* name */ /******************************************************************** -** Solidified function: bytes_format_int +** Solidified function: bytes_append_int ********************************************************************/ -be_local_closure(class_webserver_async_bytes_format_int, /* name */ +be_local_closure(class_webserver_async_bytes_append_int, /* name */ be_nested_proto( - 9, /* nstack */ + 11, /* nstack */ 3, /* argc */ 12, /* varg */ 0, /* has upvals */ @@ -1578,58 +1579,62 @@ be_local_closure(class_webserver_async_bytes_format_int, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_webserver_async, /* shared constants */ - be_str_weak(bytes_format_int), + be_str_weak(bytes_append_int), &be_const_str_solidified, - ( &(const binstruction[49]) { /* code */ + ( &(const binstruction[53]) { /* code */ 0x580C001A, // 0000 LDCONST R3 K26 - 0x8C10011B, // 0001 GETMET R4 R0 K27 - 0x7C100200, // 0002 CALL R4 1 - 0x4C100000, // 0003 LDNIL R4 - 0x1C100204, // 0004 EQ R4 R1 R4 - 0x78120001, // 0005 JMPF R4 #0008 - 0x40100002, // 0006 CONNECT R4 R0 R2 - 0x80000800, // 0007 RET 0 - 0x50100000, // 0008 LDBOOL R4 0 0 - 0x1414031C, // 0009 LT R5 R1 K28 - 0x78160001, // 000A JMPF R5 #000D - 0x44040200, // 000B NEG R1 R1 - 0x50100200, // 000C LDBOOL R4 1 0 - 0x1414031C, // 000D LT R5 R1 K28 - 0x78160000, // 000E JMPF R5 #0010 - 0x80000A00, // 000F RET 0 - 0x1C14031C, // 0010 EQ R5 R1 K28 - 0x78160005, // 0011 JMPF R5 #0018 - 0x8C14011D, // 0012 GETMET R5 R0 K29 - 0x581C001E, // 0013 LDCONST R7 K30 - 0x7C140400, // 0014 CALL R5 2 - 0x5416002F, // 0015 LDINT R5 48 - 0x98023805, // 0016 SETIDX R0 K28 R5 - 0x80000A00, // 0017 RET 0 - 0x8C14011D, // 0018 GETMET R5 R0 K29 - 0x541E000A, // 0019 LDINT R7 11 - 0x7C140400, // 001A CALL R5 2 - 0x5814001C, // 001B LDCONST R5 K28 - 0x2418031C, // 001C GT R6 R1 K28 - 0x781A0008, // 001D JMPF R6 #0027 - 0x541A0009, // 001E LDINT R6 10 - 0x10180206, // 001F MOD R6 R1 R6 - 0x541E002F, // 0020 LDINT R7 48 - 0x001C0E06, // 0021 ADD R7 R7 R6 - 0x98000A07, // 0022 SETIDX R0 R5 R7 - 0x00140B1E, // 0023 ADD R5 R5 K30 - 0x541E0009, // 0024 LDINT R7 10 - 0x0C040207, // 0025 DIV R1 R1 R7 - 0x7001FFF4, // 0026 JMP #001C - 0x78120002, // 0027 JMPF R4 #002B - 0x541A002C, // 0028 LDINT R6 45 - 0x98000A06, // 0029 SETIDX R0 R5 R6 - 0x00140B1E, // 002A ADD R5 R5 K30 - 0x8C18011D, // 002B GETMET R6 R0 K29 - 0x5C200A00, // 002C MOVE R8 R5 - 0x7C180400, // 002D CALL R6 2 - 0x8C18011F, // 002E GETMET R6 R0 K31 - 0x7C180200, // 002F CALL R6 1 - 0x80000000, // 0030 RET 0 + 0x6010000C, // 0001 GETGBL R4 G12 + 0x5C140000, // 0002 MOVE R5 R0 + 0x7C100200, // 0003 CALL R4 1 + 0x1C14031C, // 0004 EQ R5 R1 K28 + 0x78160005, // 0005 JMPF R5 #000C + 0x8C14011D, // 0006 GETMET R5 R0 K29 + 0x001C091E, // 0007 ADD R7 R4 K30 + 0x7C140400, // 0008 CALL R5 2 + 0x5416002F, // 0009 LDINT R5 48 + 0x98000805, // 000A SETIDX R0 R4 R5 + 0x70020027, // 000B JMP #0034 + 0x4C140000, // 000C LDNIL R5 + 0x20140205, // 000D NE R5 R1 R5 + 0x78160021, // 000E JMPF R5 #0031 + 0x50140000, // 000F LDBOOL R5 0 0 + 0x1418031C, // 0010 LT R6 R1 K28 + 0x781A0001, // 0011 JMPF R6 #0014 + 0x44040200, // 0012 NEG R1 R1 + 0x50140200, // 0013 LDBOOL R5 1 0 + 0x1418031C, // 0014 LT R6 R1 K28 + 0x781A0000, // 0015 JMPF R6 #0017 + 0x80040000, // 0016 RET 1 R0 + 0x78160005, // 0017 JMPF R5 #001E + 0x8C18011D, // 0018 GETMET R6 R0 K29 + 0x0020091E, // 0019 ADD R8 R4 K30 + 0x7C180400, // 001A CALL R6 2 + 0x541A002C, // 001B LDINT R6 45 + 0x98000806, // 001C SETIDX R0 R4 R6 + 0x0010091E, // 001D ADD R4 R4 K30 + 0x5C180800, // 001E MOVE R6 R4 + 0x241C031C, // 001F GT R7 R1 K28 + 0x781E000B, // 0020 JMPF R7 #002D + 0x541E0009, // 0021 LDINT R7 10 + 0x101C0207, // 0022 MOD R7 R1 R7 + 0x8C20011D, // 0023 GETMET R8 R0 K29 + 0x0028091E, // 0024 ADD R10 R4 K30 + 0x7C200400, // 0025 CALL R8 2 + 0x5422002F, // 0026 LDINT R8 48 + 0x00201007, // 0027 ADD R8 R8 R7 + 0x98000808, // 0028 SETIDX R0 R4 R8 + 0x0010091E, // 0029 ADD R4 R4 K30 + 0x54220009, // 002A LDINT R8 10 + 0x0C040208, // 002B DIV R1 R1 R8 + 0x7001FFF1, // 002C JMP #001F + 0x8C1C011F, // 002D GETMET R7 R0 K31 + 0x5C240C00, // 002E MOVE R9 R6 + 0x7C1C0400, // 002F CALL R7 2 + 0x70020002, // 0030 JMP #0034 + 0x8C140128, // 0031 GETMET R5 R0 K40 + 0x5C1C0400, // 0032 MOVE R7 R2 + 0x7C140400, // 0033 CALL R5 2 + 0x80040000, // 0034 RET 1 R0 }) ) ); @@ -1653,7 +1658,7 @@ be_local_closure(class_webserver_async_on, /* name */ be_str_weak(on), &be_const_str_solidified, ( &(const binstruction[11]) { /* code */ - 0x8C140128, // 0000 GETMET R5 R0 K40 + 0x8C140129, // 0000 GETMET R5 R0 K41 0x5C1C0200, // 0001 MOVE R7 R1 0x5C200400, // 0002 MOVE R8 R2 0x5C240600, // 0003 MOVE R9 R3 @@ -1695,7 +1700,7 @@ be_local_closure(class_webserver_async_dispatch, /* name */ 0x7816000A, // 0005 JMPF R5 #0011 0x88140120, // 0006 GETMBR R5 R0 K32 0x94140A04, // 0007 GETIDX R5 R5 R4 - 0x8C140B29, // 0008 GETMET R5 R5 K41 + 0x8C140B2A, // 0008 GETMET R5 R5 K42 0x5C1C0200, // 0009 MOVE R7 R1 0x5C200400, // 000A MOVE R8 R2 0x5C240600, // 000B MOVE R9 R3 @@ -1704,14 +1709,14 @@ be_local_closure(class_webserver_async_dispatch, /* name */ 0x80000A00, // 000E RET 0 0x0010091E, // 000F ADD R4 R4 K30 0x7001FFEF, // 0010 JMP #0001 - 0x8C14032A, // 0011 GETMET R5 R1 K42 + 0x8C14032B, // 0011 GETMET R5 R1 K43 0x541E01F3, // 0012 LDINT R7 500 - 0x5820002B, // 0013 LDCONST R8 K43 + 0x5820002C, // 0013 LDCONST R8 K44 0x7C140600, // 0014 CALL R5 3 - 0x8C14032C, // 0015 GETMET R5 R1 K44 - 0x581C002D, // 0016 LDCONST R7 K45 + 0x8C14032D, // 0015 GETMET R5 R1 K45 + 0x581C002E, // 0016 LDCONST R7 K46 0x7C140400, // 0017 CALL R5 2 - 0x8C14032E, // 0018 GETMET R5 R1 K46 + 0x8C14032F, // 0018 GETMET R5 R1 K47 0x7C140200, // 0019 CALL R5 1 0x80000000, // 001A RET 0 }) @@ -1729,17 +1734,17 @@ be_local_class(webserver_async, be_nested_map(21, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(local_port, -1), be_const_var(0) }, - { be_const_key_weak(dispatchers, 18), be_const_var(4) }, + { be_const_key_weak(dispatchers, 11), be_const_var(4) }, { be_const_key_weak(set_chunked, 10), be_const_closure(class_webserver_async_set_chunked_closure) }, { be_const_key_weak(webserver_async_cnx, 20), be_const_class(be_class_webserver_async_cnx) }, { be_const_key_weak(webserver_async_dispatcher, -1), be_const_class(be_class_webserver_async_dispatcher) }, { be_const_key_weak(compile_re, -1), be_const_closure(class_webserver_async_compile_re_closure) }, { be_const_key_weak(dispatch, 7), be_const_closure(class_webserver_async_dispatch_closure) }, - { be_const_key_weak(cors, 11), be_const_var(6) }, + { be_const_key_weak(cors, 16), be_const_var(6) }, { be_const_key_weak(connections, -1), be_const_var(3) }, { be_const_key_weak(set_cors, 1), be_const_closure(class_webserver_async_set_cors_closure) }, { be_const_key_weak(on, -1), be_const_closure(class_webserver_async_on_closure) }, - { be_const_key_weak(bytes_format_int, 16), be_const_static_closure(class_webserver_async_bytes_format_int_closure) }, + { be_const_key_weak(bytes_append_int, 18), be_const_static_closure(class_webserver_async_bytes_append_int_closure) }, { be_const_key_weak(init, -1), be_const_closure(class_webserver_async_init_closure) }, { be_const_key_weak(p1, -1), be_const_var(7) }, { be_const_key_weak(fastloop_cb, -1), be_const_var(2) }, diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_attribute.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_attribute.h index f35bcc17f..841ad2c36 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_attribute.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_attribute.h @@ -775,24 +775,24 @@ be_local_closure(class_zcl_attribute_list_tostring, /* name */ 0x4C0C0000, // 0003 LDNIL R3 0x880C010D, // 0004 GETMBR R3 R0 K13 0x4C100000, // 0005 LDNIL R4 - 0x200C0604, // 0006 NE R3 R3 R4 - 0x780E0005, // 0007 JMPF R3 #000E - 0x8C0C050E, // 0008 GETMET R3 R2 K14 - 0x60140018, // 0009 GETGBL R5 G24 - 0x5818000F, // 000A LDCONST R6 K15 - 0x5C1C0600, // 000B MOVE R7 R3 - 0x7C140400, // 000C CALL R5 2 - 0x7C0C0400, // 000D CALL R3 2 + 0x20100604, // 0006 NE R4 R3 R4 + 0x78120005, // 0007 JMPF R4 #000E + 0x8C10050E, // 0008 GETMET R4 R2 K14 + 0x60180018, // 0009 GETGBL R6 G24 + 0x581C000F, // 000A LDCONST R7 K15 + 0x5C200600, // 000B MOVE R8 R3 + 0x7C180400, // 000C CALL R6 2 + 0x7C100400, // 000D CALL R4 2 0x880C0100, // 000E GETMBR R3 R0 K0 0x4C100000, // 000F LDNIL R4 - 0x200C0604, // 0010 NE R3 R3 R4 - 0x780E0005, // 0011 JMPF R3 #0018 - 0x8C0C050E, // 0012 GETMET R3 R2 K14 - 0x60140018, // 0013 GETGBL R5 G24 - 0x58180010, // 0014 LDCONST R6 K16 - 0x5C1C0600, // 0015 MOVE R7 R3 - 0x7C140400, // 0016 CALL R5 2 - 0x7C0C0400, // 0017 CALL R3 2 + 0x20100604, // 0010 NE R4 R3 R4 + 0x78120005, // 0011 JMPF R4 #0018 + 0x8C10050E, // 0012 GETMET R4 R2 K14 + 0x60180018, // 0013 GETGBL R6 G24 + 0x581C0010, // 0014 LDCONST R7 K16 + 0x5C200600, // 0015 MOVE R8 R3 + 0x7C180400, // 0016 CALL R6 2 + 0x7C100400, // 0017 CALL R4 2 0x58100011, // 0018 LDCONST R4 K17 0x8C140112, // 0019 GETMET R5 R0 K18 0x7C140200, // 001A CALL R5 1 @@ -807,8 +807,8 @@ be_local_closure(class_zcl_attribute_list_tostring, /* name */ 0x7001FFF6, // 0023 JMP #001B 0x880C0102, // 0024 GETMBR R3 R0 K2 0x4C180000, // 0025 LDNIL R6 - 0x200C0606, // 0026 NE R3 R3 R6 - 0x780E0005, // 0027 JMPF R3 #002E + 0x20180606, // 0026 NE R6 R3 R6 + 0x781A0005, // 0027 JMPF R6 #002E 0x8C18050E, // 0028 GETMET R6 R2 K14 0x60200018, // 0029 GETGBL R8 G24 0x58240015, // 002A LDCONST R9 K21 @@ -817,8 +817,8 @@ be_local_closure(class_zcl_attribute_list_tostring, /* name */ 0x7C180400, // 002D CALL R6 2 0x880C0104, // 002E GETMBR R3 R0 K4 0x4C180000, // 002F LDNIL R6 - 0x200C0606, // 0030 NE R3 R3 R6 - 0x780E0005, // 0031 JMPF R3 #0038 + 0x20180606, // 0030 NE R6 R3 R6 + 0x781A0005, // 0031 JMPF R6 #0038 0x8C18050E, // 0032 GETMET R6 R2 K14 0x60200018, // 0033 GETGBL R8 G24 0x58240016, // 0034 LDCONST R9 K22 diff --git a/lib/libesp32_lvgl/LVGL_assets/fonts/roboto/ttf/LICENSE b/lib/libesp32_lvgl/LVGL_assets/fonts/roboto/ttf/LICENSE deleted file mode 100644 index 261eeb9e9..000000000 --- a/lib/libesp32_lvgl/LVGL_assets/fonts/roboto/ttf/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/lib/libesp32_lvgl/LVGL_assets/fonts/roboto/ttf/OFL.txt b/lib/libesp32_lvgl/LVGL_assets/fonts/roboto/ttf/OFL.txt new file mode 100644 index 000000000..a417551aa --- /dev/null +++ b/lib/libesp32_lvgl/LVGL_assets/fonts/roboto/ttf/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2011 The Roboto Project Authors (https://github.com/googlefonts/roboto-classic) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/lib/libesp32_lvgl/LVGL_assets/fonts/roboto/ttf/RobotoCondensed-Regular.ttf b/lib/libesp32_lvgl/LVGL_assets/fonts/roboto/ttf/RobotoCondensed-Regular.ttf index 5ae7043b5..74f029c7c 100644 Binary files a/lib/libesp32_lvgl/LVGL_assets/fonts/roboto/ttf/RobotoCondensed-Regular.ttf and b/lib/libesp32_lvgl/LVGL_assets/fonts/roboto/ttf/RobotoCondensed-Regular.ttf differ diff --git a/lib/libesp32_lvgl/LVGL_assets/gen.sh b/lib/libesp32_lvgl/LVGL_assets/gen.sh index b3dcdef21..319e46bdb 100755 --- a/lib/libesp32_lvgl/LVGL_assets/gen.sh +++ b/lib/libesp32_lvgl/LVGL_assets/gen.sh @@ -26,12 +26,12 @@ # robotocondensed for HASPmota with both OpenHASP and LVGL icons # bpp 2 and strong autohint -~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 12 --no-compress --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_12_latin1.c --format lvgl -~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 14 --no-compress --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_14_latin1.c --format lvgl -~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 16 --no-compress --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_16_latin1.c --format lvgl +~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 12 --no-compress --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_12_latin1.c --format lvgl +~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 14 --no-compress --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_14_latin1.c --format lvgl +~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 16 --no-compress --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_16_latin1.c --format lvgl # bpp 3 and strong autohint -~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 20 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_20_latin1.c --format lvgl -~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 22 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_22_latin1.c --format lvgl -~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 24 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_24_latin1.c --format lvgl -~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 36 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_36_latin1.c --format lvgl -~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 48 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_48_latin1.c --format lvgl +~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 20 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_20_latin1.c --format lvgl +~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 22 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_22_latin1.c --format lvgl +~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 24 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_24_latin1.c --format lvgl +~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 36 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_36_latin1.c --format lvgl +~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --size 48 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_48_latin1.c --format lvgl diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_12_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_12_latin1.c index a335d6fa5..1934ee9d3 100644 --- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_12_latin1.c +++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_12_latin1.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 12 px * Bpp: 2 - * Opts: --no-kerning --bpp 2 --size 12 --no-compress --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_12_latin1.c --format lvgl + * Opts: --no-kerning --bpp 2 --size 12 --no-compress --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_12_latin1.c --format lvgl ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -32,40 +32,40 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0023 "#" */ 0x2, 0x20, 0x15, 0x43, 0xff, 0x42, 0x20, 0xc, - 0xc0, 0xff, 0xc0, 0x88, 0x5, 0x50, 0x15, 0x40, + 0xc0, 0xff, 0xc0, 0x88, 0x6, 0x60, 0x15, 0x40, /* U+0024 "$" */ - 0x3, 0x0, 0xb8, 0x34, 0xa3, 0x3, 0x30, 0x1, - 0xe0, 0x2, 0xd0, 0x7, 0x30, 0x33, 0x8a, 0xb, - 0x80, 0x30, + 0x3, 0x0, 0xc1, 0xf0, 0xea, 0x30, 0xcc, 0x0, + 0xe0, 0xa, 0x50, 0xdc, 0x72, 0xf0, 0xc, 0x0, + 0x0, /* U+0025 "%" */ 0x2d, 0x0, 0x33, 0x10, 0x33, 0x20, 0x2d, 0x80, - 0x0, 0x40, 0x2, 0x7d, 0x1, 0xc7, 0x4, 0xc7, + 0x0, 0x40, 0x2, 0x7d, 0x1, 0xc7, 0x4, 0xc3, 0x0, 0x7d, /* U+0026 "&" */ - 0xb, 0x40, 0x37, 0x0, 0xcc, 0x3, 0xd0, 0xb, - 0x0, 0xa9, 0xc3, 0xe, 0xc, 0x34, 0x1f, 0xb0, + 0xb, 0x40, 0x33, 0x0, 0xdc, 0x3, 0xd0, 0xf, + 0x0, 0xce, 0xc3, 0xe, 0xc, 0x38, 0x1f, 0xb0, /* U+0027 "'" */ 0x33, 0x30, /* U+0028 "(" */ - 0x0, 0x5, 0xc, 0x14, 0x30, 0x30, 0x30, 0x30, + 0x0, 0x5, 0xc, 0x24, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x24, 0x18, 0xc, 0x1, /* U+0029 ")" */ 0x2, 0x43, 0x9, 0x18, 0x30, 0xc3, 0xc, 0x61, - 0x4c, 0x62, 0x0, + 0x4c, 0x22, 0x0, /* U+002A "*" */ 0x3, 0x1, 0x30, 0x2f, 0xe0, 0xb4, 0x18, 0xc0, 0x0, /* U+002B "+" */ - 0xc, 0x3, 0x0, 0xc3, 0xff, 0xc, 0x3, 0x0, - 0xc0, + 0x3, 0x0, 0x30, 0x3, 0x3, 0xfe, 0x7, 0x0, + 0x30, 0x3, 0x0, 0x0, /* U+002C "," */ 0x33, 0x50, @@ -81,20 +81,20 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0xc0, 0x60, 0x20, 0x0, /* U+0030 "0" */ - 0xf, 0x83, 0x4a, 0x30, 0x33, 0x3, 0x30, 0x33, - 0x3, 0x30, 0x33, 0x4a, 0xf, 0x80, + 0xf, 0xc3, 0x4a, 0x30, 0x33, 0x3, 0x30, 0x33, + 0x3, 0x30, 0x32, 0x4a, 0xf, 0x80, /* U+0031 "1" */ 0x7, 0x3b, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, /* U+0032 "2" */ - 0x1f, 0x3, 0x1c, 0x20, 0xc0, 0x18, 0x3, 0x40, - 0x70, 0xc, 0x2, 0x80, 0x3f, 0xc0, + 0x2f, 0x6, 0x1c, 0x50, 0xc0, 0x18, 0x3, 0x0, + 0xa0, 0x1c, 0x3, 0x0, 0xbf, 0xc0, /* U+0033 "3" */ - 0x1f, 0xc, 0x71, 0xc, 0x6, 0xb, 0x0, 0x61, - 0xc, 0xc6, 0x1f, 0x0, + 0x2f, 0x18, 0x74, 0xc, 0x6, 0xf, 0x0, 0x64, + 0xd, 0x86, 0x2f, 0x0, /* U+0034 "4" */ 0x1, 0xc0, 0x3c, 0x6, 0xc0, 0xcc, 0x18, 0xc2, @@ -105,7 +105,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xd, 0x8a, 0x2f, 0x0, /* U+0036 "6" */ - 0x7, 0xc1, 0xc0, 0x30, 0x3, 0xb8, 0x34, 0xa3, + 0x7, 0xc1, 0xc0, 0x30, 0x3, 0xbc, 0x34, 0xa3, 0x3, 0x30, 0x32, 0x8a, 0xf, 0x80, /* U+0037 "7" */ @@ -113,18 +113,18 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc0, 0x60, 0x34, 0x0, /* U+0038 "8" */ - 0x1f, 0xc, 0x73, 0xc, 0xc6, 0x1f, 0xc, 0x63, - 0xc, 0xc7, 0x1f, 0x0, + 0xf, 0xc3, 0x47, 0x30, 0x33, 0x4a, 0x1f, 0xc3, + 0x46, 0x30, 0x33, 0x46, 0x1f, 0xc0, /* U+0039 "9" */ - 0x1f, 0xd, 0xa3, 0xc, 0xc3, 0x35, 0xc7, 0xb0, - 0x18, 0xd, 0xe, 0x0, + 0xf, 0x83, 0x4a, 0x30, 0x33, 0x3, 0x34, 0xb0, + 0xfb, 0x0, 0x60, 0xc, 0xf, 0x40, /* U+003A ":" */ 0x20, 0x0, 0x0, 0x20, /* U+003B ";" */ - 0x20, 0x0, 0x3, 0x35, 0x0, + 0x20, 0x0, 0x3, 0x36, 0x0, /* U+003C "<" */ 0x2, 0x1e, 0xe0, 0xb4, 0x1f, 0x1, @@ -133,33 +133,34 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xff, 0x0, 0x0, 0xff, /* U+003E ">" */ - 0x80, 0x74, 0xb, 0x1e, 0xb0, 0x40, + 0x80, 0x74, 0xb, 0x1e, 0xb4, 0x40, /* U+003F "?" */ - 0x2f, 0x1c, 0x70, 0xc, 0xa, 0x7, 0x3, 0x0, - 0x80, 0x0, 0x8, 0x0, + 0x1f, 0xc, 0x70, 0xc, 0x6, 0x3, 0x2, 0x40, + 0x80, 0x0, 0xc, 0x0, /* U+0040 "@" */ - 0x2, 0xf8, 0x2, 0x81, 0xc1, 0x80, 0x24, 0x91, - 0xe6, 0x30, 0xcd, 0xcc, 0x53, 0x33, 0x20, 0xcc, - 0xc9, 0x76, 0x34, 0xeb, 0x6, 0x0, 0x0, 0xe0, - 0x0, 0xb, 0xe0, + 0x2, 0xf8, 0x2, 0x81, 0xc1, 0x80, 0x24, 0x93, + 0xc6, 0x32, 0x54, 0xcc, 0xc5, 0x33, 0x32, 0xc, + 0xcc, 0x86, 0x32, 0xdf, 0xa, 0x0, 0x0, 0xd0, + 0x0, 0xf, 0xc0, /* U+0041 "A" */ - 0x3, 0x0, 0x1d, 0x0, 0xe8, 0x3, 0x30, 0x18, - 0xd0, 0x92, 0x83, 0xff, 0x1c, 0xc, 0xa0, 0x28, + 0x2, 0xc0, 0x3, 0xd0, 0x3, 0xe0, 0x7, 0x70, + 0xe, 0x30, 0xc, 0x34, 0x1f, 0xf8, 0x24, 0x1c, + 0x30, 0xc, /* U+0042 "B" */ - 0x3f, 0xc3, 0x6, 0x30, 0x33, 0xa, 0x3f, 0xc3, - 0x6, 0x30, 0x33, 0x6, 0x3f, 0xc0, + 0x3f, 0xc3, 0x7, 0x30, 0x33, 0x6, 0x3f, 0xc3, + 0x6, 0x30, 0x33, 0x7, 0x3f, 0xc0, /* U+0043 "C" */ 0xb, 0xc2, 0x86, 0x30, 0x33, 0x0, 0x30, 0x3, - 0x0, 0x30, 0x32, 0x46, 0xb, 0x80, + 0x0, 0x30, 0x32, 0x46, 0xf, 0xc0, /* U+0044 "D" */ - 0x3f, 0x43, 0xd, 0x30, 0x73, 0x3, 0x30, 0x33, - 0x3, 0x30, 0x73, 0xd, 0x3f, 0x40, + 0x3f, 0x83, 0x9, 0x30, 0x73, 0x3, 0x30, 0x33, + 0x3, 0x30, 0x73, 0xd, 0x3f, 0x80, /* U+0045 "E" */ 0x3f, 0xd3, 0x0, 0x30, 0x3, 0x0, 0x3f, 0xc3, @@ -170,8 +171,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x30, 0x3, 0x0, 0x30, 0x0, /* U+0047 "G" */ - 0xf, 0xc2, 0x46, 0x30, 0x13, 0x0, 0x31, 0xf3, - 0x3, 0x30, 0x32, 0x87, 0xb, 0xc0, + 0xf, 0xc2, 0x47, 0x30, 0x13, 0x0, 0x31, 0xf3, + 0x3, 0x30, 0x32, 0x87, 0xb, 0xd0, /* U+0048 "H" */ 0x30, 0xc, 0xc0, 0x33, 0x0, 0xcc, 0x3, 0x3f, @@ -181,8 +182,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x33, 0x33, 0x33, 0x33, 0x30, /* U+004A "J" */ - 0x0, 0x30, 0x3, 0x0, 0x30, 0x3, 0x0, 0x30, - 0x3, 0x20, 0x33, 0x4a, 0xf, 0x80, + 0x0, 0xc0, 0x30, 0xc, 0x3, 0x0, 0xc0, 0x35, + 0xd, 0xc6, 0x2f, 0x0, /* U+004B "K" */ 0x30, 0x70, 0xc3, 0x3, 0x34, 0xd, 0xc0, 0x3f, @@ -194,19 +195,19 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+004D "M" */ 0x34, 0xb, 0x38, 0xf, 0x3c, 0xf, 0x39, 0x1b, - 0x36, 0x27, 0x33, 0x33, 0x32, 0x63, 0x31, 0xd3, + 0x36, 0x37, 0x33, 0x33, 0x33, 0xa3, 0x31, 0xd3, 0x30, 0xc3, /* U+004E "N" */ - 0x30, 0xc, 0xf0, 0x33, 0xd0, 0xcc, 0xc3, 0x32, + 0x30, 0xc, 0xf0, 0x33, 0xd0, 0xcd, 0xc3, 0x32, 0x4c, 0xc3, 0x33, 0xa, 0xcc, 0xf, 0x30, 0x1c, /* U+004F "O" */ - 0xb, 0xe0, 0xa0, 0xd3, 0x1, 0xcc, 0x3, 0x30, + 0xb, 0xe0, 0xa0, 0x93, 0x1, 0xcc, 0x3, 0x30, 0xc, 0xc0, 0x33, 0x1, 0xca, 0x9, 0xb, 0xe0, /* U+0050 "P" */ - 0x3f, 0xc3, 0x6, 0x30, 0x33, 0x6, 0x3f, 0xc3, + 0x3f, 0xc3, 0x6, 0x30, 0x33, 0x7, 0x3f, 0xc3, 0x0, 0x30, 0x3, 0x0, 0x30, 0x0, /* U+0051 "Q" */ @@ -215,23 +216,23 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xb, 0xf0, 0x0, 0x2c, 0x0, 0x0, /* U+0052 "R" */ - 0x3f, 0xc0, 0xc1, 0x83, 0x3, 0xc, 0x28, 0x3f, + 0x3f, 0xc0, 0xc1, 0xc3, 0x3, 0xc, 0x28, 0x3f, 0xc0, 0xc7, 0x3, 0xd, 0xc, 0x18, 0x30, 0x30, /* U+0053 "S" */ - 0xf, 0x83, 0x4a, 0x30, 0x23, 0x80, 0xb, 0x80, - 0xa, 0x20, 0x33, 0x46, 0xf, 0xc0, + 0x1f, 0x83, 0xa, 0x30, 0x23, 0x80, 0xb, 0x80, + 0xa, 0x10, 0x33, 0x7, 0xf, 0xc0, /* U+0054 "T" */ - 0xff, 0xf0, 0xc0, 0xc, 0x0, 0xc0, 0xc, 0x0, - 0xc0, 0xc, 0x0, 0xc0, 0xc, 0x0, + 0x7f, 0xf0, 0xc, 0x0, 0x30, 0x0, 0xc0, 0x3, + 0x0, 0xc, 0x0, 0x30, 0x0, 0xc0, 0x3, 0x0, /* U+0055 "U" */ 0x30, 0x33, 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, - 0x3, 0x30, 0x33, 0x46, 0xf, 0x80, + 0x3, 0x30, 0x33, 0x46, 0x1f, 0xc0, /* U+0056 "V" */ - 0xa0, 0x35, 0xc0, 0xc3, 0x6, 0x9, 0x24, 0x18, + 0xa0, 0x35, 0xc0, 0xc3, 0x7, 0x9, 0x24, 0x18, 0xc0, 0x33, 0x0, 0xe8, 0x2, 0xd0, 0x3, 0x0, /* U+0057 "W" */ @@ -240,7 +241,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x34, 0x34, 0xc, 0xc, 0x0, /* U+0058 "X" */ - 0x70, 0x70, 0xd3, 0x41, 0xcc, 0x3, 0xd0, 0x7, + 0x70, 0x70, 0xd3, 0x41, 0xdc, 0x3, 0xd0, 0x7, 0x0, 0x3d, 0x1, 0xcc, 0xd, 0x24, 0x70, 0x70, /* U+0059 "Y" */ @@ -248,8 +249,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x40, 0xc, 0x0, 0x30, 0x0, 0xc0, 0x3, 0x0, /* U+005A "Z" */ - 0xff, 0xc0, 0x60, 0x30, 0x28, 0xc, 0xa, 0x3, - 0x2, 0x40, 0xff, 0xc0, + 0xff, 0xc0, 0x20, 0x20, 0x14, 0x8, 0x5, 0x2, + 0x2, 0x0, 0xff, 0xc0, /* U+005B "[" */ 0x3c, 0xc3, 0xc, 0x30, 0xc3, 0xc, 0x30, 0xc3, @@ -273,7 +274,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x70, 0x90, /* U+0061 "a" */ - 0x1f, 0x43, 0x5c, 0x0, 0xc1, 0xfc, 0x30, 0xc3, + 0x1f, 0x43, 0x1c, 0x0, 0xc1, 0xfc, 0x30, 0xc3, 0x1c, 0x2e, 0xc0, /* U+0062 "b" */ @@ -281,15 +282,15 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x3, 0x30, 0x33, 0x3, 0x34, 0xa3, 0xbc, /* U+0063 "c" */ - 0xf, 0xc3, 0x46, 0x30, 0x13, 0x0, 0x30, 0x3, - 0x46, 0xf, 0xc0, + 0xf, 0x83, 0x4c, 0x30, 0x43, 0x0, 0x30, 0x3, + 0x4d, 0xf, 0x80, /* U+0064 "d" */ 0x0, 0x30, 0x3, 0x0, 0x30, 0xfb, 0x34, 0x73, 0x3, 0x30, 0x33, 0x3, 0x34, 0x70, 0xfb, /* U+0065 "e" */ - 0xb, 0xc3, 0x46, 0x30, 0x33, 0xff, 0x30, 0x3, + 0xf, 0xc3, 0x46, 0x30, 0x33, 0xff, 0x30, 0x3, 0x41, 0xf, 0xd0, /* U+0066 "f" */ @@ -298,14 +299,14 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0067 "g" */ 0xf, 0xb3, 0x47, 0x30, 0x33, 0x3, 0x30, 0x33, - 0x47, 0xf, 0xb0, 0x3, 0x10, 0xa1, 0xf8, + 0x47, 0xf, 0xb0, 0x3, 0x10, 0x61, 0xfc, /* U+0068 "h" */ - 0x30, 0xc, 0x3, 0x0, 0xed, 0x35, 0xcc, 0x33, + 0x30, 0xc, 0x3, 0x0, 0xed, 0x31, 0xcc, 0x33, 0xc, 0xc3, 0x30, 0xcc, 0x30, /* U+0069 "i" */ - 0x20, 0x33, 0x33, 0x33, 0x30, + 0x30, 0x33, 0x33, 0x33, 0x30, /* U+006A "j" */ 0x8, 0x0, 0xc3, 0xc, 0x30, 0xc3, 0xc, 0x30, @@ -319,11 +320,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x33, 0x33, 0x33, 0x33, 0x33, /* U+006D "m" */ - 0x3b, 0x6d, 0x31, 0xc7, 0x30, 0xc3, 0x30, 0xc3, + 0x3f, 0x7d, 0x31, 0xc7, 0x30, 0xc3, 0x30, 0xc3, 0x30, 0xc3, 0x30, 0xc3, 0x30, 0xc3, /* U+006E "n" */ - 0x3b, 0x4d, 0x73, 0xc, 0xc3, 0x30, 0xcc, 0x33, + 0x3b, 0x4c, 0x73, 0xc, 0xc3, 0x30, 0xcc, 0x33, 0xc, /* U+006F "o" */ @@ -331,133 +332,133 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x4a, 0xf, 0x80, /* U+0070 "p" */ - 0x3b, 0xc3, 0x4a, 0x30, 0x33, 0x3, 0x30, 0x33, - 0x4a, 0x3b, 0xc3, 0x0, 0x30, 0x3, 0x0, + 0x3b, 0xc3, 0xa, 0x30, 0x33, 0x3, 0x30, 0x33, + 0xa, 0x3b, 0xc3, 0x0, 0x30, 0x3, 0x0, /* U+0071 "q" */ 0xf, 0xb3, 0x47, 0x30, 0x33, 0x3, 0x30, 0x33, 0x47, 0xf, 0xb0, 0x3, 0x0, 0x30, 0x3, /* U+0072 "r" */ - 0x0, 0x3e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x3d, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, /* U+0073 "s" */ - 0x1f, 0x4c, 0x73, 0x40, 0x3c, 0x1, 0xcc, 0x31, - 0xf4, + 0x7d, 0xc3, 0xd0, 0x3c, 0x7, 0xc3, 0x7d, /* U+0074 "t" */ 0x4, 0xc, 0x3f, 0xc, 0xc, 0xc, 0xc, 0xc, 0xb, /* U+0075 "u" */ - 0x30, 0xcc, 0x33, 0xc, 0xc3, 0x30, 0xcc, 0x71, - 0xec, + 0x30, 0xcc, 0x33, 0xc, 0xc3, 0x30, 0xcc, 0x72, + 0xfc, /* U+0076 "v" */ 0x91, 0x98, 0x93, 0x30, 0xcc, 0x2a, 0x3, 0x40, 0xc0, /* U+0077 "w" */ - 0x92, 0x49, 0x63, 0x8c, 0x33, 0xcc, 0x36, 0xd8, - 0x2d, 0xb4, 0x1c, 0x74, 0x1c, 0x30, + 0xd1, 0xc3, 0xa2, 0xc6, 0x73, 0xd9, 0x3b, 0x6c, + 0x3e, 0x3c, 0x2d, 0x38, 0x1c, 0x24, /* U+0078 "x" */ 0x72, 0x8c, 0xc1, 0xe0, 0x34, 0x1e, 0xc, 0xc6, 0x18, /* U+0079 "y" */ - 0x30, 0xc3, 0xc, 0x25, 0x81, 0xa4, 0xf, 0x0, - 0xf0, 0xa, 0x0, 0x90, 0xc, 0x3, 0x40, + 0x91, 0x98, 0x93, 0x30, 0xdc, 0x2a, 0x7, 0x40, + 0xc0, 0x30, 0x18, 0x1c, 0x0, /* U+007A "z" */ 0xff, 0x1, 0x80, 0xc0, 0xa0, 0x30, 0x24, 0xf, 0xf0, /* U+007B "{" */ - 0x1, 0x9, 0xc, 0xc, 0xc, 0x18, 0x34, 0x18, - 0xc, 0xc, 0xc, 0x9, 0x1, + 0x1, 0x9, 0xc, 0xc, 0xc, 0x1c, 0x34, 0x1c, + 0xc, 0xc, 0xc, 0xd, 0x2, /* U+007C "|" */ 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, /* U+007D "}" */ - 0x20, 0x28, 0xc, 0xc, 0xc, 0xc, 0x7, 0xc, - 0xc, 0xc, 0xc, 0x28, 0x20, + 0x0, 0x30, 0x18, 0xc, 0xc, 0xc, 0xe, 0xb, + 0xc, 0xc, 0xc, 0xc, 0x28, 0x20, /* U+007E "~" */ - 0x78, 0x58, 0x7c, + 0x2e, 0x24, 0x8b, 0x80, /* U+00A0 " " */ /* U+00A1 "¡" */ - 0x20, 0x33, 0x33, 0x33, 0x30, + 0x30, 0x33, 0x33, 0x33, 0x30, /* U+00A3 "£" */ - 0x1f, 0x4c, 0x73, 0x4, 0xc0, 0xfc, 0xc, 0x3, - 0x1, 0xc0, 0xff, 0xc0, + 0x7, 0xd0, 0xc7, 0xc, 0x10, 0xc0, 0x3f, 0x40, + 0xc0, 0xc, 0x1, 0xc0, 0x3f, 0xf0, /* U+00B0 "°" */ 0x2d, 0x37, 0x2d, /* U+00B1 "±" */ 0xc, 0x3, 0x0, 0xc3, 0xfe, 0xc, 0x3, 0x0, - 0x2, 0xfd, + 0x42, 0xfd, /* U+00B2 "²" */ - 0x78, 0x8c, 0x18, 0x60, 0xfc, + 0x2e, 0x8, 0xc0, 0x60, 0x70, 0x3f, 0x0, /* U+00B3 "³" */ - 0xb9, 0x33, 0x93, 0xb8, + 0xb9, 0x32, 0x93, 0xb8, /* U+00B5 "µ" */ 0x30, 0xcc, 0x33, 0xc, 0xc3, 0x30, 0xcc, 0x73, - 0xec, 0xc0, 0x30, 0xc, 0x0, + 0xfc, 0xc0, 0x30, 0xc, 0x0, /* U+00BF "¿" */ - 0xc, 0x0, 0x0, 0x10, 0x1c, 0xd, 0xa, 0x3, - 0x0, 0xc1, 0x34, 0x87, 0xc0, + 0xc, 0x0, 0x0, 0x50, 0x24, 0xc, 0x9, 0x3, + 0x0, 0xc1, 0x31, 0x87, 0xc0, /* U+00C0 "À" */ - 0x4, 0x0, 0x18, 0x0, 0x0, 0x0, 0xc0, 0x7, - 0x40, 0x3a, 0x0, 0xcc, 0x6, 0x34, 0x24, 0xa0, - 0xff, 0xc7, 0x3, 0x28, 0xa, + 0x5, 0x0, 0x2, 0x80, 0x0, 0x0, 0x2, 0xc0, + 0x3, 0xd0, 0x3, 0xe0, 0x7, 0x70, 0xe, 0x30, + 0xc, 0x34, 0x1f, 0xf8, 0x24, 0x1c, 0x30, 0xc, /* U+00C1 "Á" */ - 0x0, 0x40, 0x9, 0x0, 0x0, 0x0, 0xc0, 0x7, - 0x40, 0x3a, 0x0, 0xcc, 0x6, 0x34, 0x24, 0xa0, - 0xff, 0xc7, 0x3, 0x28, 0xa, + 0x0, 0x10, 0x0, 0xd0, 0x0, 0x0, 0x2, 0xc0, + 0x3, 0xd0, 0x3, 0xe0, 0x7, 0x70, 0xe, 0x30, + 0xc, 0x34, 0x1f, 0xf8, 0x24, 0x1c, 0x30, 0xc, /* U+00C2 "Â" */ - 0x1, 0x0, 0x26, 0x0, 0x0, 0x0, 0xc0, 0x7, - 0x40, 0x3a, 0x0, 0xcc, 0x6, 0x34, 0x24, 0xa0, - 0xff, 0xc7, 0x3, 0x28, 0xa, + 0x0, 0x80, 0x3, 0x50, 0x0, 0x0, 0x2, 0xc0, + 0x3, 0xd0, 0x3, 0xe0, 0x7, 0x70, 0xe, 0x30, + 0xc, 0x34, 0x1f, 0xf8, 0x24, 0x1c, 0x30, 0xc, /* U+00C3 "Ã" */ - 0x0, 0x0, 0x29, 0x40, 0x9c, 0x0, 0x0, 0x3, - 0x40, 0xe, 0x0, 0x6c, 0x3, 0x74, 0xc, 0xa0, - 0x61, 0xc2, 0xff, 0xc, 0x9, 0x70, 0x1c, + 0x0, 0x0, 0x7, 0x10, 0x8, 0xd0, 0x0, 0x0, + 0x2, 0xc0, 0x3, 0xd0, 0x3, 0xe0, 0x7, 0x70, + 0xe, 0x30, 0xc, 0x34, 0x1f, 0xf8, 0x24, 0x1c, + 0x30, 0xc, /* U+00C4 "Ä" */ - 0x8, 0x80, 0x0, 0x0, 0x30, 0x1, 0xd0, 0xe, - 0x80, 0x33, 0x1, 0x8d, 0x9, 0x28, 0x3f, 0xf1, - 0xc0, 0xca, 0x2, 0x80, + 0x6, 0x24, 0x0, 0x0, 0x2, 0xc0, 0x3, 0xd0, + 0x3, 0xe0, 0x7, 0x70, 0xe, 0x30, 0xc, 0x34, + 0x1f, 0xf8, 0x24, 0x1c, 0x30, 0xc, /* U+00C5 "Å" */ - 0x1, 0xd0, 0x3, 0x70, 0x3, 0x70, 0x2, 0xd0, - 0x0, 0xc0, 0x1, 0xc0, 0x3, 0x60, 0x3, 0x30, - 0xa, 0x24, 0xc, 0x18, 0xf, 0xfc, 0x28, 0x9, - 0x30, 0x6, + 0x1, 0xd0, 0x3, 0x30, 0x3, 0x30, 0x2, 0xd0, + 0x1, 0xc0, 0x2, 0xd0, 0x3, 0xe0, 0x7, 0x70, + 0xa, 0x30, 0xc, 0x34, 0x1f, 0xf4, 0x24, 0x18, + 0x30, 0xc, /* U+00C6 "Æ" */ - 0x0, 0x3f, 0xf4, 0x1, 0xf0, 0x0, 0xd, 0xc0, - 0x0, 0x73, 0x0, 0x3, 0x4f, 0xf0, 0x1c, 0x30, - 0x0, 0xff, 0xc0, 0x7, 0x3, 0x0, 0x34, 0xf, - 0xf8, + 0x0, 0x3f, 0xf0, 0x1, 0xf0, 0x0, 0xd, 0xc0, + 0x0, 0x63, 0x0, 0x3, 0x4f, 0xf0, 0x1c, 0x30, + 0x0, 0xff, 0xc0, 0x7, 0x7, 0x0, 0x34, 0xf, + 0xf4, /* U+00C7 "Ç" */ 0xb, 0xc2, 0x86, 0x30, 0x33, 0x0, 0x30, 0x3, - 0x0, 0x30, 0x32, 0x86, 0xb, 0x80, 0x34, 0x0, - 0xc0, 0x34, + 0x0, 0x30, 0x32, 0x46, 0xf, 0xc0, 0x30, 0x1, + 0x40, 0x30, /* U+00C8 "È" */ 0x1c, 0x0, 0x90, 0x0, 0x3, 0xfd, 0x30, 0x3, @@ -470,7 +471,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x3, 0xfd, /* U+00CA "Ê" */ - 0xa, 0x0, 0x94, 0x0, 0x3, 0xfd, 0x30, 0x3, + 0xa, 0x0, 0xa4, 0x0, 0x3, 0xfd, 0x30, 0x3, 0x0, 0x30, 0x3, 0xfc, 0x30, 0x3, 0x0, 0x30, 0x3, 0xfd, @@ -492,40 +493,40 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc, 0xc, 0xc, 0xc, /* U+00CF "Ï" */ - 0x22, 0x0, 0x0, 0xc0, 0x30, 0xc, 0x3, 0x0, + 0x62, 0x40, 0x0, 0xc0, 0x30, 0xc, 0x3, 0x0, 0xc0, 0x30, 0xc, 0x3, 0x0, 0xc0, /* U+00D0 "Ð" */ - 0x3f, 0x43, 0xd, 0x30, 0x73, 0x3, 0xfc, 0x33, - 0x3, 0x30, 0x73, 0xd, 0x3f, 0x40, + 0x3f, 0x83, 0x9, 0x30, 0x73, 0x3, 0xfc, 0x33, + 0x3, 0x30, 0x73, 0xd, 0x3f, 0x80, /* U+00D1 "Ñ" */ - 0x0, 0x0, 0x2c, 0xc0, 0x8d, 0x0, 0x0, 0x30, - 0xc, 0xf0, 0x33, 0xd0, 0xcc, 0xc3, 0x32, 0x4c, + 0x0, 0x0, 0x28, 0xc0, 0x8d, 0x0, 0x0, 0x30, + 0xc, 0xf0, 0x33, 0xd0, 0xcd, 0xc3, 0x32, 0x4c, 0xc3, 0x33, 0xa, 0xcc, 0xf, 0x30, 0x1c, /* U+00D2 "Ò" */ 0xa, 0x0, 0xd, 0x0, 0x0, 0x2, 0xf8, 0x28, - 0x34, 0xc0, 0x73, 0x0, 0xcc, 0x3, 0x30, 0xc, + 0x24, 0xc0, 0x73, 0x0, 0xcc, 0x3, 0x30, 0xc, 0xc0, 0x72, 0x82, 0x42, 0xf8, /* U+00D3 "Ó" */ 0x0, 0xe0, 0x6, 0x0, 0x0, 0x2, 0xf8, 0x28, - 0x34, 0xc0, 0x73, 0x0, 0xcc, 0x3, 0x30, 0xc, + 0x24, 0xc0, 0x73, 0x0, 0xcc, 0x3, 0x30, 0xc, 0xc0, 0x72, 0x82, 0x42, 0xf8, /* U+00D4 "Ô" */ 0x2, 0x80, 0x16, 0x40, 0x0, 0x2, 0xf8, 0x28, - 0x34, 0xc0, 0x73, 0x0, 0xcc, 0x3, 0x30, 0xc, + 0x24, 0xc0, 0x73, 0x0, 0xcc, 0x3, 0x30, 0xc, 0xc0, 0x72, 0x82, 0x42, 0xf8, /* U+00D5 "Õ" */ 0x0, 0x0, 0x2c, 0xc0, 0xcd, 0x0, 0x0, 0xb, - 0xe0, 0xa0, 0xd3, 0x1, 0xcc, 0x3, 0x30, 0xc, + 0xe0, 0xa0, 0x93, 0x1, 0xcc, 0x3, 0x30, 0xc, 0xc0, 0x33, 0x1, 0xca, 0x9, 0xb, 0xe0, /* U+00D6 "Ö" */ - 0x8, 0x90, 0x0, 0x0, 0xbe, 0xa, 0xd, 0x30, + 0xc, 0x90, 0x0, 0x0, 0xbe, 0xa, 0x9, 0x30, 0x1c, 0xc0, 0x33, 0x0, 0xcc, 0x3, 0x30, 0x1c, 0xa0, 0x90, 0xbe, 0x0, @@ -534,29 +535,29 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x28, 0x10, 0x40, /* U+00D8 "Ø" */ - 0x0, 0x8, 0xb, 0xe8, 0x18, 0x34, 0x30, 0x78, - 0x30, 0xdc, 0x31, 0x8c, 0x33, 0xc, 0x3a, 0x18, - 0x1d, 0x34, 0x1f, 0xd0, 0x10, 0x0, + 0x0, 0x8, 0xb, 0xe4, 0x18, 0x34, 0x30, 0x68, + 0x30, 0x8c, 0x31, 0x4c, 0x32, 0xc, 0x39, 0x18, + 0x1c, 0x34, 0x1b, 0xd0, 0x10, 0x0, /* U+00D9 "Ù" */ 0xc, 0x0, 0x60, 0x0, 0x3, 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, 0x3, 0x34, - 0x60, 0xf8, + 0x61, 0xfc, /* U+00DA "Ú" */ 0x1, 0xc0, 0x30, 0x0, 0x3, 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, 0x3, 0x34, - 0x60, 0xf8, + 0x61, 0xfc, /* U+00DB "Û" */ 0x3, 0x0, 0x98, 0x0, 0x3, 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, 0x3, 0x34, - 0x60, 0xf8, + 0x61, 0xfc, /* U+00DC "Ü" */ - 0x18, 0x80, 0x0, 0x30, 0x33, 0x3, 0x30, 0x33, - 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, 0x46, 0xf, - 0x80, + 0x18, 0xc0, 0x0, 0x30, 0x33, 0x3, 0x30, 0x33, + 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, 0x46, 0x1f, + 0xc0, /* U+00DD "Ý" */ 0x0, 0x40, 0x9, 0x0, 0x0, 0x1c, 0xc, 0x34, @@ -576,49 +577,49 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc, 0x1f, 0xc3, 0xc, 0x31, 0xc2, 0xec, /* U+00E1 "á" */ - 0x2, 0x40, 0x20, 0x0, 0x1, 0xf4, 0x35, 0xc0, + 0x2, 0x40, 0x20, 0x0, 0x1, 0xf4, 0x31, 0xc0, 0xc, 0x1f, 0xc3, 0xc, 0x31, 0xc2, 0xec, /* U+00E2 "â" */ - 0xa, 0x0, 0x90, 0x0, 0x1, 0xf4, 0x35, 0xc0, + 0xa, 0x0, 0xa0, 0x0, 0x1, 0xf4, 0x31, 0xc0, 0xc, 0x1f, 0xc3, 0xc, 0x31, 0xc2, 0xec, /* U+00E3 "ã" */ - 0x0, 0x0, 0xcc, 0x12, 0x40, 0x0, 0x1f, 0x43, - 0x5c, 0x0, 0xc1, 0xfc, 0x30, 0xc3, 0x1c, 0x2e, + 0x0, 0x0, 0xc8, 0x23, 0x40, 0x0, 0x1f, 0x43, + 0x1c, 0x0, 0xc1, 0xfc, 0x30, 0xc3, 0x1c, 0x2e, 0xc0, /* U+00E4 "ä" */ - 0x20, 0x80, 0x0, 0x1f, 0x43, 0x5c, 0x0, 0xc1, + 0x20, 0x80, 0x0, 0x1f, 0x43, 0x1c, 0x0, 0xc1, 0xfc, 0x30, 0xc3, 0x1c, 0x2e, 0xc0, /* U+00E5 "å" */ 0xb, 0x40, 0xdc, 0xb, 0x40, 0x0, 0x1f, 0x43, - 0x5c, 0x0, 0xc1, 0xfc, 0x30, 0xc3, 0x1c, 0x2e, + 0x4c, 0x0, 0xc1, 0xfc, 0x34, 0xc3, 0xc, 0x2f, 0xc0, /* U+00E6 "æ" */ - 0x1f, 0x6e, 0xd, 0x78, 0xa0, 0xc, 0xc, 0x7f, - 0xff, 0x30, 0xc0, 0xc, 0x74, 0x12, 0xf2, 0xf4, + 0x1f, 0x7f, 0xd, 0x74, 0xa0, 0xc, 0xc, 0x7f, + 0xff, 0x30, 0xc0, 0xc, 0x78, 0x12, 0xf2, 0xf4, /* U+00E7 "ç" */ - 0xf, 0xc3, 0x46, 0x30, 0x13, 0x0, 0x30, 0x3, - 0x46, 0xf, 0xc0, 0x90, 0x3, 0x0, 0xa0, + 0xf, 0x83, 0x4c, 0x30, 0x43, 0x0, 0x30, 0x3, + 0x4d, 0xf, 0x80, 0x60, 0x2, 0x0, 0x60, /* U+00E8 "è" */ - 0xc, 0x0, 0x70, 0x0, 0x0, 0xbc, 0x34, 0x63, + 0xc, 0x0, 0x70, 0x0, 0x0, 0xfc, 0x34, 0x63, 0x3, 0x3f, 0xf3, 0x0, 0x34, 0x10, 0xfd, /* U+00E9 "é" */ - 0x0, 0xc0, 0x34, 0x0, 0x0, 0xbc, 0x34, 0x63, + 0x0, 0xc0, 0x34, 0x0, 0x0, 0xfc, 0x34, 0x63, 0x3, 0x3f, 0xf3, 0x0, 0x34, 0x10, 0xfd, /* U+00EA "ê" */ - 0x7, 0x0, 0xc8, 0x0, 0x0, 0xbc, 0x34, 0x63, + 0x7, 0x0, 0xc8, 0x0, 0x0, 0xfc, 0x34, 0x63, 0x3, 0x3f, 0xf3, 0x0, 0x34, 0x10, 0xfd, /* U+00EB "ë" */ - 0x21, 0x80, 0x0, 0xb, 0xc3, 0x46, 0x30, 0x33, + 0x31, 0x80, 0x0, 0xf, 0xc3, 0x46, 0x30, 0x33, 0xff, 0x30, 0x3, 0x41, 0xf, 0xd0, /* U+00EC "ì" */ @@ -634,15 +635,15 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc, 0xc, /* U+00EF "ï" */ - 0x62, 0x0, 0x0, 0xc0, 0x30, 0xc, 0x3, 0x0, + 0x63, 0x0, 0x0, 0xc0, 0x30, 0xc, 0x3, 0x0, 0xc0, 0x30, 0xc, 0x0, /* U+00F0 "ð" */ - 0x8, 0x0, 0xbc, 0x7, 0xc0, 0x49, 0xb, 0xf3, - 0x47, 0x30, 0x33, 0x3, 0x34, 0x90, 0xf8, + 0x8, 0x0, 0xbc, 0x7, 0xc0, 0x49, 0xf, 0xb3, + 0x47, 0x30, 0x33, 0x3, 0x34, 0xa0, 0xf8, /* U+00F1 "ñ" */ - 0x0, 0x7, 0x22, 0x30, 0x0, 0x3b, 0x4d, 0x73, + 0x0, 0x7, 0x22, 0x30, 0x0, 0x3b, 0x4c, 0x73, 0xc, 0xc3, 0x30, 0xcc, 0x33, 0xc, /* U+00F2 "ò" */ @@ -663,56 +664,55 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x80, /* U+00F6 "ö" */ - 0x20, 0x80, 0x0, 0xf, 0x83, 0x4a, 0x30, 0x33, + 0x31, 0x80, 0x0, 0xf, 0x83, 0x4a, 0x30, 0x33, 0x3, 0x30, 0x33, 0x4a, 0xf, 0x80, /* U+00F7 "÷" */ 0x8, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x2, 0x0, /* U+00F8 "ø" */ - 0x0, 0x50, 0xbc, 0x24, 0xd3, 0x27, 0x32, 0x33, - 0x53, 0x2c, 0x90, 0xf8, 0x0, 0x0, + 0x0, 0x50, 0xfc, 0x24, 0xe3, 0x27, 0x32, 0x33, + 0x53, 0x2c, 0xa1, 0xf8, 0x10, 0x0, /* U+00F9 "ù" */ 0x18, 0x2, 0x0, 0x0, 0xc3, 0x30, 0xcc, 0x33, - 0xc, 0xc3, 0x31, 0xc7, 0xb0, + 0xc, 0xc3, 0x31, 0xcb, 0xf0, /* U+00FA "ú" */ - 0x3, 0x41, 0x80, 0x0, 0xc3, 0x30, 0xcc, 0x33, - 0xc, 0xc3, 0x31, 0xc7, 0xb0, + 0x3, 0x41, 0x40, 0x0, 0xc3, 0x30, 0xcc, 0x33, + 0xc, 0xc3, 0x31, 0xcb, 0xf0, /* U+00FB "û" */ - 0xa, 0x1, 0x80, 0x0, 0xc3, 0x30, 0xcc, 0x33, - 0xc, 0xc3, 0x31, 0xc7, 0xb0, + 0x9, 0x1, 0x80, 0x0, 0xc3, 0x30, 0xcc, 0x33, + 0xc, 0xc3, 0x31, 0xcb, 0xf0, /* U+00FC "ü" */ - 0x21, 0x80, 0x3, 0xc, 0xc3, 0x30, 0xcc, 0x33, - 0xc, 0xc7, 0x1e, 0xc0, + 0x31, 0x80, 0x3, 0xc, 0xc3, 0x30, 0xcc, 0x33, + 0xc, 0xc7, 0x2f, 0xc0, /* U+00FD "ý" */ - 0x2, 0x80, 0x20, 0x0, 0x3, 0xc, 0x30, 0xc2, - 0x58, 0x1a, 0x40, 0xf0, 0xf, 0x0, 0xa0, 0x9, - 0x0, 0xc0, 0x34, 0x0, + 0x3, 0x2, 0x40, 0x2, 0x46, 0x62, 0x4c, 0xc3, + 0x70, 0xa8, 0x1d, 0x3, 0x0, 0xc0, 0x60, 0x70, + 0x0, /* U+00FE "þ" */ - 0x30, 0x3, 0x0, 0x30, 0x3, 0xb8, 0x34, 0xa3, - 0x3, 0x30, 0x33, 0x3, 0x34, 0xa3, 0xb8, 0x30, + 0x30, 0x3, 0x0, 0x30, 0x3, 0xbc, 0x34, 0xa3, + 0x3, 0x30, 0x33, 0x3, 0x30, 0xa3, 0xbc, 0x30, 0x3, 0x0, 0x30, 0x0, /* U+00FF "ÿ" */ - 0x22, 0x40, 0x0, 0x30, 0xc3, 0xc, 0x25, 0x81, - 0xa4, 0xf, 0x0, 0xf0, 0xa, 0x0, 0x90, 0xc, - 0x3, 0x40, + 0x32, 0x40, 0x9, 0x19, 0x89, 0x33, 0xd, 0xc2, + 0xa0, 0x74, 0xc, 0x3, 0x1, 0x81, 0xc0, /* U+011E "Ğ" */ - 0xc, 0xc0, 0xb4, 0x0, 0x0, 0xfc, 0x28, 0x63, + 0x8, 0xc0, 0xb4, 0x0, 0x0, 0xfc, 0x24, 0x73, 0x1, 0x30, 0x3, 0x1f, 0x30, 0x33, 0x3, 0x28, - 0x30, 0xbc, + 0x70, 0xbd, /* U+011F "ğ" */ 0x24, 0x91, 0x8c, 0xb, 0x40, 0xfb, 0x34, 0x73, 0x3, 0x30, 0x33, 0x3, 0x34, 0x70, 0xfb, 0x0, - 0x31, 0xa, 0x1f, 0x80, + 0x31, 0x6, 0x1f, 0xc0, /* U+0130 "İ" */ 0x30, 0x3, 0xc, 0x30, 0xc3, 0xc, 0x30, 0xc3, @@ -728,44 +728,40 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0153 "œ" */ 0xf, 0x8f, 0x9, 0x2d, 0x63, 0x3, 0xc, 0xc0, - 0xff, 0x30, 0x30, 0x9, 0x2d, 0x0, 0xf8, 0xf4, + 0xff, 0x30, 0x70, 0x9, 0x2d, 0x0, 0xf8, 0xf4, /* U+015E "Ş" */ - 0xf, 0x83, 0x46, 0x30, 0x23, 0x80, 0xb, 0x80, - 0xa, 0x20, 0x33, 0x46, 0xf, 0xc0, 0x34, 0x1, - 0xc0, 0x34, + 0x1f, 0x83, 0xa, 0x30, 0x23, 0x80, 0xb, 0x80, + 0xa, 0x10, 0x33, 0x7, 0xf, 0xc0, 0x30, 0x1, + 0x40, 0x30, /* U+015F "ş" */ - 0x1f, 0x4c, 0x73, 0x40, 0x3c, 0x1, 0xcc, 0x31, - 0xf4, 0x24, 0x3, 0x2, 0x80, + 0x7d, 0xc7, 0xd0, 0x3c, 0x7, 0xc3, 0x7d, 0x18, + 0x8, 0x18, /* U+0160 "Š" */ - 0x9, 0x80, 0x70, 0x0, 0x0, 0xf8, 0x34, 0xa3, - 0x2, 0x38, 0x0, 0xb8, 0x0, 0xa2, 0x3, 0x34, - 0x60, 0xfc, + 0xc, 0x80, 0x70, 0x0, 0x1, 0xfc, 0x30, 0x73, + 0x0, 0x38, 0x0, 0xb8, 0x0, 0xa2, 0x3, 0x30, + 0x70, 0xfc, /* U+0161 "š" */ - 0xa, 0x42, 0x80, 0x0, 0x7d, 0x31, 0xcd, 0x0, - 0xf0, 0x7, 0x31, 0xc7, 0xd0, + 0x25, 0x18, 0x0, 0x7d, 0xc3, 0xd0, 0x3c, 0x7, + 0xc3, 0x7d, /* U+017D "Ž" */ - 0x11, 0x3, 0x40, 0x3, 0xff, 0x1, 0x80, 0xc0, - 0xa0, 0x30, 0x28, 0xc, 0x9, 0x3, 0xff, + 0x11, 0x7, 0x40, 0x3, 0xff, 0x0, 0x80, 0x80, + 0x50, 0x20, 0x14, 0x8, 0x8, 0x3, 0xff, /* U+017E "ž" */ 0x29, 0x6, 0x0, 0x3, 0xfc, 0x6, 0x3, 0x2, 0x80, 0xc0, 0x90, 0x3f, 0xc0, - /* U+1E9E "ẞ" */ - 0x1f, 0x43, 0x4c, 0x31, 0x83, 0x30, 0x33, 0xc3, - 0x6, 0x30, 0x33, 0x6, 0x37, 0xc0, - /* U+2022 "•" */ 0xa3, 0xcb, 0x0, /* U+20AC "€" */ - 0xf, 0x8d, 0x3, 0x3, 0xf8, 0x30, 0x3f, 0x83, - 0x0, 0xd0, 0xf, 0x80, + 0xf, 0x89, 0x3, 0x3, 0xf8, 0x30, 0x3f, 0x83, + 0x0, 0x90, 0xf, 0x80, /* U+E004 "" */ 0x7, 0xd0, 0x3, 0xfc, 0x0, 0xff, 0x0, 0x1f, @@ -1786,365 +1782,364 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 0, .adv_w = 47, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 7, .adv_w = 62, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 7}, {.bitmap_index = 10, .adv_w = 105, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 26, .adv_w = 95, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 44, .adv_w = 122, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 62, .adv_w = 104, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 78, .adv_w = 34, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 7}, - {.bitmap_index = 80, .adv_w = 60, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 94, .adv_w = 61, .box_w = 3, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 105, .adv_w = 83, .box_w = 6, .box_h = 6, .ofs_x = -1, .ofs_y = 3}, - {.bitmap_index = 114, .adv_w = 95, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 123, .adv_w = 38, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 125, .adv_w = 48, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 126, .adv_w = 51, .box_w = 2, .box_h = 1, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 127, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 140, .adv_w = 95, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 154, .adv_w = 95, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 163, .adv_w = 95, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 177, .adv_w = 95, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 189, .adv_w = 95, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 203, .adv_w = 95, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 215, .adv_w = 95, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 229, .adv_w = 95, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 241, .adv_w = 95, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 253, .adv_w = 95, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 265, .adv_w = 45, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 269, .adv_w = 39, .box_w = 2, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 274, .adv_w = 86, .box_w = 4, .box_h = 6, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 280, .adv_w = 92, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 284, .adv_w = 88, .box_w = 4, .box_h = 6, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 290, .adv_w = 81, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 302, .adv_w = 148, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 329, .adv_w = 111, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 345, .adv_w = 105, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 359, .adv_w = 109, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 373, .adv_w = 110, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 387, .adv_w = 95, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 401, .adv_w = 92, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 415, .adv_w = 113, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 429, .adv_w = 119, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 445, .adv_w = 48, .box_w = 2, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 450, .adv_w = 93, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 464, .adv_w = 105, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 480, .adv_w = 91, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 494, .adv_w = 145, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 512, .adv_w = 119, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 528, .adv_w = 115, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 544, .adv_w = 106, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 558, .adv_w = 115, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 580, .adv_w = 102, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 596, .adv_w = 100, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 610, .adv_w = 100, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 624, .adv_w = 108, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 638, .adv_w = 108, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 654, .adv_w = 146, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 675, .adv_w = 106, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 691, .adv_w = 101, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 707, .adv_w = 100, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 719, .adv_w = 48, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 729, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 742, .adv_w = 48, .box_w = 3, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 752, .adv_w = 71, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 759, .adv_w = 78, .box_w = 5, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 761, .adv_w = 59, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 763, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 774, .adv_w = 95, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 789, .adv_w = 89, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 800, .adv_w = 95, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 815, .adv_w = 90, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 826, .adv_w = 61, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 836, .adv_w = 95, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 851, .adv_w = 93, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 864, .adv_w = 44, .box_w = 2, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 869, .adv_w = 43, .box_w = 3, .box_h = 12, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 878, .adv_w = 87, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 893, .adv_w = 44, .box_w = 2, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 898, .adv_w = 145, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 912, .adv_w = 93, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 921, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 932, .adv_w = 95, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 947, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 962, .adv_w = 59, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 970, .adv_w = 88, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 979, .adv_w = 57, .box_w = 4, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 988, .adv_w = 93, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 997, .adv_w = 82, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1006, .adv_w = 125, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1020, .adv_w = 84, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1029, .adv_w = 80, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1044, .adv_w = 84, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1053, .adv_w = 59, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1066, .adv_w = 47, .box_w = 2, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1072, .adv_w = 59, .box_w = 4, .box_h = 13, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 1085, .adv_w = 113, .box_w = 6, .box_h = 2, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 1088, .adv_w = 44, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1088, .adv_w = 45, .box_w = 2, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1093, .adv_w = 98, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1105, .adv_w = 72, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 1108, .adv_w = 90, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1118, .adv_w = 63, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 1123, .adv_w = 63, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 1127, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1140, .adv_w = 81, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1153, .adv_w = 111, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1174, .adv_w = 111, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1195, .adv_w = 111, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1216, .adv_w = 111, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1239, .adv_w = 111, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1259, .adv_w = 111, .box_w = 8, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1285, .adv_w = 156, .box_w = 11, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1310, .adv_w = 109, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1328, .adv_w = 95, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1346, .adv_w = 95, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1364, .adv_w = 95, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1382, .adv_w = 95, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1399, .adv_w = 48, .box_w = 3, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1408, .adv_w = 48, .box_w = 4, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1420, .adv_w = 48, .box_w = 4, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1432, .adv_w = 48, .box_w = 5, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1446, .adv_w = 112, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1460, .adv_w = 119, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1483, .adv_w = 115, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1504, .adv_w = 115, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1525, .adv_w = 115, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1546, .adv_w = 115, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1569, .adv_w = 115, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1589, .adv_w = 90, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 1600, .adv_w = 115, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1622, .adv_w = 108, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1640, .adv_w = 108, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1658, .adv_w = 108, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1676, .adv_w = 108, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1693, .adv_w = 101, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1714, .adv_w = 99, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1728, .adv_w = 100, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1743, .adv_w = 92, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1758, .adv_w = 92, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1773, .adv_w = 92, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1788, .adv_w = 92, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1805, .adv_w = 92, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1819, .adv_w = 92, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1836, .adv_w = 140, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1852, .adv_w = 89, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1867, .adv_w = 90, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1882, .adv_w = 90, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1897, .adv_w = 90, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1912, .adv_w = 90, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1926, .adv_w = 45, .box_w = 4, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1936, .adv_w = 45, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1946, .adv_w = 45, .box_w = 4, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1956, .adv_w = 45, .box_w = 5, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1968, .adv_w = 99, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1983, .adv_w = 93, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1997, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2012, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2027, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2042, .adv_w = 96, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2059, .adv_w = 96, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2073, .adv_w = 96, .box_w = 5, .box_h = 6, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 2081, .adv_w = 96, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2095, .adv_w = 93, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2108, .adv_w = 93, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2121, .adv_w = 93, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2134, .adv_w = 93, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2146, .adv_w = 80, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2166, .adv_w = 98, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2186, .adv_w = 80, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2204, .adv_w = 113, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2222, .adv_w = 95, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2242, .adv_w = 48, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2251, .adv_w = 45, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2255, .adv_w = 159, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2278, .adv_w = 149, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2294, .adv_w = 100, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2312, .adv_w = 88, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2325, .adv_w = 100, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2343, .adv_w = 88, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2356, .adv_w = 100, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2371, .adv_w = 84, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2384, .adv_w = 108, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2398, .adv_w = 65, .box_w = 3, .box_h = 3, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 2401, .adv_w = 95, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2413, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2434, .adv_w = 192, .box_w = 10, .box_h = 6, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 2449, .adv_w = 192, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2482, .adv_w = 192, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2512, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2533, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2554, .adv_w = 192, .box_w = 8, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2572, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2593, .adv_w = 192, .box_w = 6, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2608, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2633, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2656, .adv_w = 192, .box_w = 7, .box_h = 10, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 2674, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2702, .adv_w = 192, .box_w = 10, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2722, .adv_w = 192, .box_w = 7, .box_h = 13, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 2745, .adv_w = 192, .box_w = 10, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 2763, .adv_w = 192, .box_w = 6, .box_h = 5, .ofs_x = 3, .ofs_y = 2}, - {.bitmap_index = 2771, .adv_w = 192, .box_w = 4, .box_h = 7, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 2778, .adv_w = 192, .box_w = 4, .box_h = 7, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 2785, .adv_w = 192, .box_w = 6, .box_h = 5, .ofs_x = 3, .ofs_y = 2}, - {.bitmap_index = 2793, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2818, .adv_w = 192, .box_w = 8, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 2832, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2855, .adv_w = 192, .box_w = 3, .box_h = 9, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 2862, .adv_w = 192, .box_w = 11, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2887, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2915, .adv_w = 192, .box_w = 8, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 2935, .adv_w = 192, .box_w = 7, .box_h = 11, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 2955, .adv_w = 192, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2980, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3003, .adv_w = 192, .box_w = 12, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3027, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3055, .adv_w = 192, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3079, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3104, .adv_w = 192, .box_w = 7, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 3122, .adv_w = 192, .box_w = 8, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 3146, .adv_w = 192, .box_w = 7, .box_h = 1, .ofs_x = 3, .ofs_y = 4}, - {.bitmap_index = 3148, .adv_w = 192, .box_w = 6, .box_h = 7, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 3159, .adv_w = 192, .box_w = 6, .box_h = 8, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 3171, .adv_w = 192, .box_w = 7, .box_h = 7, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 3184, .adv_w = 192, .box_w = 10, .box_h = 8, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 3204, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3229, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3257, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3285, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3313, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3346, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3367, .adv_w = 192, .box_w = 8, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3385, .adv_w = 192, .box_w = 6, .box_h = 6, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 3394, .adv_w = 192, .box_w = 6, .box_h = 6, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 3403, .adv_w = 192, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3427, .adv_w = 192, .box_w = 7, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 3445, .adv_w = 192, .box_w = 6, .box_h = 6, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 3454, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3482, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3509, .adv_w = 192, .box_w = 7, .box_h = 11, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 3529, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3557, .adv_w = 192, .box_w = 9, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 3587, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3610, .adv_w = 192, .box_w = 8, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3628, .adv_w = 192, .box_w = 6, .box_h = 9, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 3642, .adv_w = 192, .box_w = 6, .box_h = 9, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 3656, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3681, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3714, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 3739, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3772, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3799, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3822, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3843, .adv_w = 192, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3871, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3892, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3915, .adv_w = 192, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 3948, .adv_w = 192, .box_w = 11, .box_h = 9, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 3973, .adv_w = 192, .box_w = 6, .box_h = 9, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 3987, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4008, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4031, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4054, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4087, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4112, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4137, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4165, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4188, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4211, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4234, .adv_w = 192, .box_w = 9, .box_h = 8, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 4252, .adv_w = 192, .box_w = 11, .box_h = 9, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 4277, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4300, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4323, .adv_w = 192, .box_w = 6, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 4338, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4361, .adv_w = 192, .box_w = 8, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 4381, .adv_w = 192, .box_w = 8, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 4401, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4429, .adv_w = 192, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 4462, .adv_w = 192, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4490, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4515, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4540, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4563, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4586, .adv_w = 192, .box_w = 10, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4599, .adv_w = 192, .box_w = 10, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 4617, .adv_w = 192, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4645, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4678, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4717, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4744, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4777, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4804, .adv_w = 132, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4825, .adv_w = 192, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4861, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4900, .adv_w = 216, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4939, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4978, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5010, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5035, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5074, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5089, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5112, .adv_w = 216, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5158, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5185, .adv_w = 132, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5215, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 5239, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5275, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5306, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5337, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 5361, .adv_w = 168, .box_w = 12, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 5394, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5414, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5434, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5465, .adv_w = 168, .box_w = 11, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 5474, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5506, .adv_w = 240, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5558, .adv_w = 216, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 5607, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5640, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 5660, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 5680, .adv_w = 240, .box_w = 16, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 5720, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5747, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5790, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 5833, .adv_w = 192, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5861, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5892, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5928, .adv_w = 168, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5956, .adv_w = 168, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5981, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6008, .adv_w = 120, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 6038, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6074, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6110, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6142, .adv_w = 192, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 6188, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6216, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6246, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6279, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6304, .adv_w = 240, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6349, .adv_w = 192, .box_w = 12, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 6370, .adv_w = 192, .box_w = 9, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 6388, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6411, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6432, .adv_w = 240, .box_w = 15, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 6462, .adv_w = 240, .box_w = 15, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 6492, .adv_w = 240, .box_w = 15, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 6522, .adv_w = 240, .box_w = 15, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 6552, .adv_w = 240, .box_w = 15, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 6582, .adv_w = 240, .box_w = 16, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6618, .adv_w = 168, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6648, .adv_w = 192, .box_w = 6, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6663, .adv_w = 192, .box_w = 6, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6678, .adv_w = 192, .box_w = 6, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6693, .adv_w = 192, .box_w = 12, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 6714, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6737, .adv_w = 192, .box_w = 10, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6757, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6793, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 6836, .adv_w = 192, .box_w = 6, .box_h = 13, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 6856, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6890, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6920, .adv_w = 193, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0} + {.bitmap_index = 26, .adv_w = 95, .box_w = 5, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43, .adv_w = 122, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 61, .adv_w = 104, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 77, .adv_w = 34, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 79, .adv_w = 60, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 93, .adv_w = 61, .box_w = 3, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 104, .adv_w = 83, .box_w = 6, .box_h = 6, .ofs_x = -1, .ofs_y = 3}, + {.bitmap_index = 113, .adv_w = 95, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 125, .adv_w = 38, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 127, .adv_w = 48, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 128, .adv_w = 51, .box_w = 2, .box_h = 1, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 129, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 142, .adv_w = 95, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 156, .adv_w = 95, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 165, .adv_w = 95, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 179, .adv_w = 95, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 191, .adv_w = 95, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 205, .adv_w = 95, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 217, .adv_w = 95, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 231, .adv_w = 95, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 243, .adv_w = 95, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 257, .adv_w = 95, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 271, .adv_w = 45, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 275, .adv_w = 39, .box_w = 2, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 280, .adv_w = 86, .box_w = 4, .box_h = 6, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 286, .adv_w = 92, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 290, .adv_w = 88, .box_w = 4, .box_h = 6, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 296, .adv_w = 81, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 308, .adv_w = 148, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 335, .adv_w = 111, .box_w = 8, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 353, .adv_w = 105, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 367, .adv_w = 109, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 381, .adv_w = 110, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 395, .adv_w = 95, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 409, .adv_w = 92, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 423, .adv_w = 113, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 437, .adv_w = 119, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 453, .adv_w = 48, .box_w = 2, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 458, .adv_w = 93, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 470, .adv_w = 105, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 486, .adv_w = 91, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 500, .adv_w = 145, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 518, .adv_w = 119, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 534, .adv_w = 115, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 550, .adv_w = 106, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 564, .adv_w = 115, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 586, .adv_w = 102, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 602, .adv_w = 100, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 616, .adv_w = 100, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 632, .adv_w = 108, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 646, .adv_w = 108, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 662, .adv_w = 146, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 683, .adv_w = 106, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 699, .adv_w = 101, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 715, .adv_w = 100, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 727, .adv_w = 48, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 737, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 750, .adv_w = 48, .box_w = 3, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 760, .adv_w = 71, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 767, .adv_w = 78, .box_w = 5, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 769, .adv_w = 59, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 771, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 782, .adv_w = 95, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 797, .adv_w = 89, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 808, .adv_w = 95, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 823, .adv_w = 90, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 834, .adv_w = 61, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 844, .adv_w = 95, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 859, .adv_w = 93, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 872, .adv_w = 44, .box_w = 2, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 877, .adv_w = 43, .box_w = 3, .box_h = 12, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 886, .adv_w = 87, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 901, .adv_w = 44, .box_w = 2, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 906, .adv_w = 145, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 920, .adv_w = 93, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 929, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 940, .adv_w = 95, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 955, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 970, .adv_w = 59, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 977, .adv_w = 88, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 984, .adv_w = 57, .box_w = 4, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 993, .adv_w = 93, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1002, .adv_w = 82, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1011, .adv_w = 125, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1025, .adv_w = 84, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1034, .adv_w = 80, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1047, .adv_w = 84, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1056, .adv_w = 59, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1069, .adv_w = 47, .box_w = 2, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1075, .adv_w = 59, .box_w = 4, .box_h = 14, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1089, .adv_w = 113, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 1093, .adv_w = 44, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1093, .adv_w = 45, .box_w = 2, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1098, .adv_w = 98, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1112, .adv_w = 72, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 1115, .adv_w = 90, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1125, .adv_w = 63, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 1132, .adv_w = 63, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 1136, .adv_w = 96, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1149, .adv_w = 81, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1162, .adv_w = 111, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1186, .adv_w = 111, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1210, .adv_w = 111, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1234, .adv_w = 111, .box_w = 8, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1260, .adv_w = 111, .box_w = 8, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1282, .adv_w = 111, .box_w = 8, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1308, .adv_w = 156, .box_w = 11, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1333, .adv_w = 109, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1351, .adv_w = 95, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1369, .adv_w = 95, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1387, .adv_w = 95, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1405, .adv_w = 95, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1422, .adv_w = 48, .box_w = 3, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1431, .adv_w = 48, .box_w = 4, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1443, .adv_w = 48, .box_w = 4, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1455, .adv_w = 48, .box_w = 5, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1469, .adv_w = 112, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1483, .adv_w = 119, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1506, .adv_w = 115, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1527, .adv_w = 115, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1548, .adv_w = 115, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1569, .adv_w = 115, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1592, .adv_w = 115, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1612, .adv_w = 90, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 1623, .adv_w = 115, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1645, .adv_w = 108, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1663, .adv_w = 108, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1681, .adv_w = 108, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1699, .adv_w = 108, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1716, .adv_w = 101, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1737, .adv_w = 99, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1751, .adv_w = 100, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1766, .adv_w = 92, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1781, .adv_w = 92, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1796, .adv_w = 92, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1811, .adv_w = 92, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1828, .adv_w = 92, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1842, .adv_w = 92, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1859, .adv_w = 140, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1875, .adv_w = 89, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1890, .adv_w = 90, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1905, .adv_w = 90, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1920, .adv_w = 90, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1935, .adv_w = 90, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1949, .adv_w = 45, .box_w = 4, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1959, .adv_w = 45, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1969, .adv_w = 45, .box_w = 4, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1979, .adv_w = 45, .box_w = 5, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1991, .adv_w = 99, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2006, .adv_w = 93, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2020, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2035, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2050, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2065, .adv_w = 96, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2082, .adv_w = 96, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2096, .adv_w = 96, .box_w = 5, .box_h = 6, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 2104, .adv_w = 96, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2118, .adv_w = 93, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2131, .adv_w = 93, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2144, .adv_w = 93, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2157, .adv_w = 93, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2169, .adv_w = 80, .box_w = 5, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2186, .adv_w = 98, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2206, .adv_w = 80, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2221, .adv_w = 113, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2239, .adv_w = 95, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2259, .adv_w = 48, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2268, .adv_w = 45, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2272, .adv_w = 159, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2295, .adv_w = 149, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2311, .adv_w = 100, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2329, .adv_w = 88, .box_w = 4, .box_h = 10, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2339, .adv_w = 100, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2357, .adv_w = 88, .box_w = 4, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2367, .adv_w = 100, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2382, .adv_w = 84, .box_w = 5, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2395, .adv_w = 65, .box_w = 3, .box_h = 3, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2398, .adv_w = 95, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2410, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2431, .adv_w = 192, .box_w = 10, .box_h = 6, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2446, .adv_w = 192, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2479, .adv_w = 192, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2509, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2530, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2551, .adv_w = 192, .box_w = 8, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2569, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2590, .adv_w = 192, .box_w = 6, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 2605, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2630, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2653, .adv_w = 192, .box_w = 7, .box_h = 10, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 2671, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2699, .adv_w = 192, .box_w = 10, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2719, .adv_w = 192, .box_w = 7, .box_h = 13, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 2742, .adv_w = 192, .box_w = 10, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 2760, .adv_w = 192, .box_w = 6, .box_h = 5, .ofs_x = 3, .ofs_y = 2}, + {.bitmap_index = 2768, .adv_w = 192, .box_w = 4, .box_h = 7, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 2775, .adv_w = 192, .box_w = 4, .box_h = 7, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 2782, .adv_w = 192, .box_w = 6, .box_h = 5, .ofs_x = 3, .ofs_y = 2}, + {.bitmap_index = 2790, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2815, .adv_w = 192, .box_w = 8, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 2829, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2852, .adv_w = 192, .box_w = 3, .box_h = 9, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 2859, .adv_w = 192, .box_w = 11, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2884, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2912, .adv_w = 192, .box_w = 8, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 2932, .adv_w = 192, .box_w = 7, .box_h = 11, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 2952, .adv_w = 192, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2977, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3000, .adv_w = 192, .box_w = 12, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3024, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3052, .adv_w = 192, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3076, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3101, .adv_w = 192, .box_w = 7, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 3119, .adv_w = 192, .box_w = 8, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3143, .adv_w = 192, .box_w = 7, .box_h = 1, .ofs_x = 3, .ofs_y = 4}, + {.bitmap_index = 3145, .adv_w = 192, .box_w = 6, .box_h = 7, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 3156, .adv_w = 192, .box_w = 6, .box_h = 8, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 3168, .adv_w = 192, .box_w = 7, .box_h = 7, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 3181, .adv_w = 192, .box_w = 10, .box_h = 8, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 3201, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3226, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3254, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3282, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3310, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3343, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3364, .adv_w = 192, .box_w = 8, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3382, .adv_w = 192, .box_w = 6, .box_h = 6, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 3391, .adv_w = 192, .box_w = 6, .box_h = 6, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 3400, .adv_w = 192, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3424, .adv_w = 192, .box_w = 7, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 3442, .adv_w = 192, .box_w = 6, .box_h = 6, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 3451, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3479, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3506, .adv_w = 192, .box_w = 7, .box_h = 11, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 3526, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3554, .adv_w = 192, .box_w = 9, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3584, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3607, .adv_w = 192, .box_w = 8, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3625, .adv_w = 192, .box_w = 6, .box_h = 9, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 3639, .adv_w = 192, .box_w = 6, .box_h = 9, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 3653, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3678, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3711, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3736, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3769, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3796, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3819, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3840, .adv_w = 192, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3868, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3889, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3912, .adv_w = 192, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3945, .adv_w = 192, .box_w = 11, .box_h = 9, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 3970, .adv_w = 192, .box_w = 6, .box_h = 9, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 3984, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4005, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4028, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4051, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4084, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4109, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4134, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4162, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4185, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4208, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4231, .adv_w = 192, .box_w = 9, .box_h = 8, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 4249, .adv_w = 192, .box_w = 11, .box_h = 9, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 4274, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4297, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4320, .adv_w = 192, .box_w = 6, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4335, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4358, .adv_w = 192, .box_w = 8, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4378, .adv_w = 192, .box_w = 8, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4398, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4426, .adv_w = 192, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 4459, .adv_w = 192, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4487, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4512, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4537, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4560, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4583, .adv_w = 192, .box_w = 10, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4596, .adv_w = 192, .box_w = 10, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 4614, .adv_w = 192, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4642, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4675, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4714, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4741, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4774, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4801, .adv_w = 132, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4822, .adv_w = 192, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4858, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4897, .adv_w = 216, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4936, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4975, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5007, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5032, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5071, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5086, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5109, .adv_w = 216, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5155, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5182, .adv_w = 132, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5212, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 5236, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5272, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5303, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5334, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 5358, .adv_w = 168, .box_w = 12, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 5391, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5411, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5431, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5462, .adv_w = 168, .box_w = 11, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 5471, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5503, .adv_w = 240, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5555, .adv_w = 216, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5604, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5637, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 5657, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 5677, .adv_w = 240, .box_w = 16, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5717, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5744, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5787, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5830, .adv_w = 192, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5858, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5889, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5925, .adv_w = 168, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5953, .adv_w = 168, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5978, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6005, .adv_w = 120, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6035, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6071, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6107, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6139, .adv_w = 192, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6185, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6213, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6243, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6276, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6301, .adv_w = 240, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6346, .adv_w = 192, .box_w = 12, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 6367, .adv_w = 192, .box_w = 9, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 6385, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6408, .adv_w = 192, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6429, .adv_w = 240, .box_w = 15, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 6459, .adv_w = 240, .box_w = 15, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 6489, .adv_w = 240, .box_w = 15, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 6519, .adv_w = 240, .box_w = 15, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 6549, .adv_w = 240, .box_w = 15, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 6579, .adv_w = 240, .box_w = 16, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6615, .adv_w = 168, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6645, .adv_w = 192, .box_w = 6, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6660, .adv_w = 192, .box_w = 6, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6675, .adv_w = 192, .box_w = 6, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6690, .adv_w = 192, .box_w = 12, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 6711, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6734, .adv_w = 192, .box_w = 10, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6754, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6790, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6833, .adv_w = 192, .box_w = 6, .box_h = 13, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 6853, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6887, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6917, .adv_w = 193, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0} }; /*--------------------- @@ -2157,30 +2152,30 @@ static const uint16_t unicode_list_1[] = { static const uint16_t unicode_list_3[] = { 0x0, 0x1, 0x12, 0x13, 0x34, 0x35, 0x40, 0x41, - 0x42, 0x43, 0x5f, 0x60, 0x1d80, 0x1f04, 0x1f8e, 0xdee6, - 0xdef3, 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, - 0xdf7c, 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, - 0xe023, 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, - 0xe0f2, 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, - 0xe20c, 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, - 0xe31a, 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, - 0xe390, 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, - 0xe447, 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, - 0xe48a, 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, - 0xe583, 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, - 0xe5f9, 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, - 0xe7bf, 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, - 0xe952, 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, - 0xeeea, 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, - 0xeefe, 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, - 0xef2a, 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, - 0xef49, 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, - 0xef5b, 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, - 0xefab, 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, - 0xf03d, 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, - 0xf122, 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, - 0xf184, 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, - 0xf43c, 0xf6a4, 0xf784 + 0x42, 0x43, 0x5f, 0x60, 0x1f04, 0x1f8e, 0xdee6, 0xdef3, + 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, 0xdf7c, + 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, 0xe023, + 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, 0xe0f2, + 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, 0xe20c, + 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, 0xe31a, + 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, 0xe390, + 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, 0xe447, + 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, 0xe48a, + 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, 0xe583, + 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, 0xe5f9, + 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, 0xe7bf, + 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, 0xe952, + 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, 0xeeea, + 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, 0xeefe, + 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, 0xef2a, + 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, 0xef49, + 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, 0xef5b, + 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, 0xefab, + 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, 0xf03d, + 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, 0xf122, + 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, 0xf184, + 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, 0xf43c, + 0xf6a4, 0xf784 }; /*Collect the unicode lists and glyph_id offsets*/ @@ -2200,7 +2195,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = }, { .range_start = 286, .range_length = 63365, .glyph_id_start = 169, - .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 195, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 194, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_14_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_14_latin1.c index 3bc29008d..858a79cd0 100644 --- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_14_latin1.c +++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_14_latin1.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 14 px * Bpp: 2 - * Opts: --no-kerning --bpp 2 --size 14 --no-compress --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_14_latin1.c --format lvgl + * Opts: --no-kerning --bpp 2 --size 14 --no-compress --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_14_latin1.c --format lvgl ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -29,40 +29,38 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, /* U+0022 "\"" */ - 0x33, 0xc, 0xc3, 0x30, + 0x33, 0x33, 0x33, /* U+0023 "#" */ 0xc, 0x60, 0xc6, 0xc, 0x9f, 0xff, 0x28, 0xc2, - 0x4c, 0x31, 0x8f, 0xff, 0x32, 0x46, 0x30, 0x63, + 0x4c, 0x31, 0x8f, 0xff, 0x72, 0x46, 0x30, 0x63, 0x0, /* U+0024 "$" */ - 0x3, 0x0, 0x1c, 0x1, 0xfc, 0xd, 0x28, 0x30, - 0x70, 0xd0, 0x1, 0xd0, 0x1, 0xf0, 0x0, 0xb0, - 0xc0, 0xc3, 0x4b, 0xb, 0xf4, 0x7, 0x40, 0xc, - 0x0, + 0x2, 0x0, 0x30, 0xf, 0x83, 0xee, 0x30, 0xb3, + 0x3, 0x38, 0x0, 0xf4, 0x1, 0xe0, 0x7, 0x30, + 0x33, 0x8b, 0xf, 0xc0, 0x30, 0x2, 0x0, /* U+0025 "%" */ - 0x2d, 0x0, 0xe, 0xc1, 0x3, 0x31, 0x80, 0xdc, - 0x80, 0x2d, 0x50, 0x0, 0x20, 0x0, 0x16, 0xd0, - 0x8, 0xec, 0x5, 0x33, 0x1, 0xd, 0xc0, 0x2, - 0xd0, + 0x2d, 0x0, 0x37, 0x4, 0x33, 0x18, 0x37, 0x20, + 0x2e, 0x50, 0x0, 0x80, 0x1, 0x6d, 0x2, 0x37, + 0x5, 0x33, 0x4, 0x37, 0x0, 0x2d, /* U+0026 "&" */ - 0x7, 0xd0, 0xd, 0xb0, 0xc, 0x70, 0xd, 0xa0, - 0xb, 0xc0, 0xb, 0x40, 0x2d, 0xcc, 0x30, 0xac, - 0x30, 0x38, 0x38, 0x78, 0xb, 0xdd, + 0x7, 0xd0, 0xd, 0x70, 0xc, 0x30, 0xd, 0xa0, + 0xb, 0xc0, 0xf, 0x40, 0x39, 0xcc, 0x30, 0xec, + 0x30, 0x78, 0x38, 0x78, 0xf, 0xdc, /* U+0027 "'" */ 0x30, 0xc3, 0x0, /* U+0028 "(" */ - 0x2, 0xa, 0xc, 0x28, 0x34, 0x30, 0x30, 0x30, + 0x2, 0xa, 0xc, 0x18, 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x24, 0x1c, 0xc, 0x3, 0x0, /* U+0029 ")" */ 0x20, 0x9, 0x0, 0xc0, 0x34, 0xa, 0x1, 0xc0, - 0x70, 0xc, 0x3, 0x1, 0xc0, 0x60, 0x24, 0xc, + 0x30, 0xc, 0x3, 0x1, 0xc0, 0x60, 0x24, 0xc, 0x6, 0x3, 0x0, 0x0, /* U+002A "*" */ @@ -70,11 +68,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc0, 0x92, 0x40, 0x0, 0x0, /* U+002B "+" */ - 0xc, 0x0, 0xc0, 0xc, 0xf, 0xff, 0x1c, 0x0, - 0xc0, 0xc, 0x0, 0xc0, + 0x1, 0x0, 0xc, 0x0, 0x30, 0x0, 0xc0, 0x7f, + 0xf0, 0x1c, 0x0, 0x30, 0x0, 0xc0, 0x2, 0x0, /* U+002C "," */ - 0x31, 0xca, 0x10, + 0x30, 0xca, 0x10, /* U+002D "-" */ 0xfc, 0x0, @@ -84,41 +82,41 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+002F "/" */ 0x1, 0x80, 0x90, 0x30, 0x18, 0x9, 0x3, 0x1, - 0x80, 0x90, 0x30, 0xc, 0x6, 0x1, 0x0, + 0xc0, 0x90, 0x30, 0xc, 0x6, 0x1, 0x0, /* U+0030 "0" */ - 0xf, 0x80, 0xa3, 0x83, 0x7, 0xc, 0xc, 0x30, - 0x30, 0xc0, 0xc3, 0x3, 0xc, 0x1c, 0x30, 0x70, - 0xa3, 0x80, 0xf8, 0x0, + 0xf, 0x82, 0x8e, 0x30, 0x73, 0x3, 0x30, 0x33, + 0x3, 0x30, 0x33, 0x3, 0x30, 0x72, 0x8e, 0xf, + 0x80, /* U+0031 "1" */ 0x7, 0xf, 0xc1, 0x30, 0xc, 0x3, 0x0, 0xc0, 0x30, 0xc, 0x3, 0x0, 0xc0, 0x30, /* U+0032 "2" */ - 0xf, 0xc0, 0xe2, 0x83, 0x7, 0x4, 0x1c, 0x0, - 0xa0, 0x3, 0x0, 0x28, 0x1, 0xc0, 0xd, 0x0, + 0xf, 0xc0, 0xe2, 0x83, 0x7, 0x4, 0xc, 0x0, + 0xa0, 0x3, 0x40, 0x28, 0x1, 0xc0, 0xd, 0x0, 0xe0, 0x3, 0xff, 0xc0, /* U+0033 "3" */ - 0xf, 0x80, 0xe2, 0x83, 0x7, 0x0, 0x1c, 0x0, - 0xa0, 0x2f, 0x0, 0xe, 0x0, 0x1c, 0x30, 0x70, + 0xf, 0xc0, 0xe2, 0x83, 0x3, 0x0, 0xc, 0x0, + 0xa0, 0x2f, 0x0, 0xa, 0x0, 0xc, 0x30, 0x70, 0xe2, 0x80, 0xf8, 0x0, /* U+0034 "4" */ - 0x2, 0xc0, 0x3c, 0xb, 0xc0, 0xdc, 0x28, 0xc3, - 0xc, 0xa0, 0xcf, 0xff, 0x1, 0xc0, 0xc, 0x0, - 0xc0, + 0x0, 0xb0, 0x0, 0xf0, 0x2, 0xb0, 0x3, 0x70, + 0xa, 0x30, 0xc, 0x30, 0x28, 0x30, 0x3f, 0xfc, + 0x0, 0x70, 0x0, 0x30, 0x0, 0x30, /* U+0035 "5" */ - 0x2f, 0xf0, 0x90, 0x3, 0x40, 0xc, 0x0, 0x3f, + 0x2f, 0xf0, 0x90, 0x3, 0x40, 0xd, 0x0, 0x3f, 0x80, 0x93, 0x80, 0x7, 0x0, 0xc, 0x30, 0x70, 0xd3, 0x80, 0xf8, 0x0, /* U+0036 "6" */ - 0x3, 0xc0, 0x34, 0x2, 0x80, 0xc, 0x0, 0x3b, - 0x80, 0xe2, 0x83, 0x3, 0xc, 0xc, 0x30, 0x30, - 0xb2, 0x80, 0xb8, 0x0, + 0x7, 0xc0, 0xd0, 0x28, 0x3, 0x0, 0x3b, 0x83, + 0x8e, 0x30, 0x73, 0x3, 0x30, 0x72, 0x8e, 0xf, + 0x80, /* U+0037 "7" */ 0xff, 0xf0, 0xa, 0x0, 0xd0, 0xc, 0x2, 0x80, @@ -126,23 +124,23 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, /* U+0038 "8" */ - 0xf, 0x80, 0xe2, 0x83, 0x7, 0xc, 0x1c, 0x34, - 0xa0, 0x7f, 0x3, 0x8e, 0xc, 0x1c, 0x30, 0x70, - 0xe2, 0x80, 0xf8, 0x0, + 0xf, 0x83, 0x8a, 0x30, 0x73, 0x7, 0x38, 0xa1, + 0xfc, 0x39, 0xa3, 0x7, 0x30, 0x33, 0x8a, 0xf, + 0xc0, /* U+0039 "9" */ - 0xf, 0x80, 0xa3, 0x43, 0x7, 0xc, 0x1c, 0x30, - 0x30, 0xe2, 0xc1, 0xfb, 0x0, 0x1c, 0x0, 0xa0, - 0x7, 0x0, 0xf0, 0x0, + 0xf, 0x83, 0x8d, 0x30, 0x73, 0x3, 0x30, 0x73, + 0x8b, 0x1f, 0xb0, 0x7, 0x0, 0xa0, 0x1c, 0xf, + 0x0, /* U+003A ":" */ 0x30, 0x0, 0x0, 0x0, 0x0, 0xc, /* U+003B ";" */ - 0x30, 0x0, 0x0, 0x0, 0x43, 0x1c, 0x90, 0x0, + 0x30, 0x0, 0x0, 0x0, 0x43, 0x1c, 0xa0, 0x0, /* U+003C "<" */ - 0x1, 0x43, 0xdb, 0x83, 0x80, 0x2d, 0x1, 0xd0, + 0x1, 0x42, 0xdb, 0x83, 0x80, 0x2d, 0x1, 0xd0, 0x0, /* U+003D "=" */ @@ -153,36 +151,36 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, /* U+003F "?" */ - 0xf, 0x80, 0xe2, 0x82, 0x7, 0x0, 0x1c, 0x0, - 0xa0, 0x7, 0x0, 0x34, 0x0, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x30, 0x0, + 0x2f, 0x1c, 0xb5, 0xc, 0x7, 0x2, 0x81, 0xc0, + 0xd0, 0x30, 0x0, 0x0, 0x0, 0xc0, /* U+0040 "@" */ - 0x1, 0xfd, 0x0, 0x1d, 0x1e, 0x0, 0xc0, 0xc, - 0xa, 0x2e, 0x28, 0x35, 0xcd, 0x70, 0xc9, 0x31, - 0xc3, 0x34, 0xc3, 0xc, 0xc3, 0xc, 0x33, 0x1c, - 0x70, 0xde, 0xb7, 0x43, 0x9d, 0xb8, 0x7, 0x0, - 0x0, 0xf, 0x44, 0x0, 0xb, 0xe0, 0x0, + 0x1, 0xfd, 0x0, 0x74, 0x78, 0xc, 0x0, 0xc2, + 0x87, 0x8a, 0x34, 0xcc, 0x73, 0x28, 0xc7, 0x33, + 0x4c, 0x33, 0x30, 0xc3, 0x33, 0xc, 0x73, 0x35, + 0xc9, 0x35, 0xe7, 0x81, 0xc0, 0x0, 0xf, 0x4, + 0x0, 0x2f, 0x80, /* U+0041 "A" */ - 0x2, 0x80, 0x3, 0xc0, 0x3, 0xd0, 0xa, 0xa0, - 0xd, 0x70, 0xc, 0x30, 0x1c, 0x34, 0x2f, 0xfc, - 0x34, 0x1c, 0x70, 0xd, 0xa0, 0xa, + 0x2, 0xd0, 0x0, 0xf8, 0x0, 0x3f, 0x0, 0x1e, + 0xc0, 0xb, 0x34, 0x3, 0x8f, 0x0, 0xd1, 0xc0, + 0x7f, 0xf4, 0x28, 0xe, 0xd, 0x1, 0xc7, 0x0, + 0x30, /* U+0042 "B" */ - 0x3f, 0xc0, 0xc2, 0x83, 0x7, 0xc, 0x1c, 0x30, - 0xa0, 0xff, 0x3, 0xa, 0xc, 0x1c, 0x30, 0x70, - 0xc2, 0x83, 0xf8, 0x0, + 0x3f, 0xc3, 0xb, 0x30, 0x33, 0x3, 0x30, 0xa3, + 0xfc, 0x34, 0xa3, 0x3, 0x30, 0x33, 0xa, 0x3f, + 0xc0, /* U+0043 "C" */ - 0xb, 0xe0, 0x1c, 0x38, 0x34, 0x1c, 0x30, 0x8, - 0x30, 0x0, 0x30, 0x0, 0x30, 0x0, 0x30, 0x8, - 0x34, 0x1c, 0x1c, 0x38, 0xb, 0xe0, + 0xb, 0xe0, 0x70, 0xe3, 0x41, 0xcc, 0x2, 0x30, + 0x0, 0xc0, 0x3, 0x0, 0xc, 0x2, 0x34, 0x1c, + 0x70, 0xe0, 0xbe, 0x0, /* U+0044 "D" */ - 0x3f, 0xd0, 0x30, 0x70, 0x30, 0x28, 0x30, 0x1c, - 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, 0x30, 0x1c, - 0x30, 0x28, 0x30, 0x70, 0x3f, 0xd0, + 0x3f, 0xd0, 0xc1, 0xc3, 0x2, 0x8c, 0x7, 0x30, + 0xc, 0xc0, 0x33, 0x0, 0xcc, 0x7, 0x30, 0x28, + 0xc1, 0xc3, 0xfd, 0x0, /* U+0045 "E" */ 0x3f, 0xf0, 0xc0, 0x3, 0x0, 0xc, 0x0, 0x30, @@ -195,26 +193,26 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, /* U+0047 "G" */ - 0xb, 0xe0, 0x2c, 0x38, 0x34, 0x1c, 0x30, 0x4, - 0x30, 0x0, 0x30, 0x0, 0x30, 0xfc, 0x30, 0x1c, - 0x34, 0xc, 0x2d, 0x2c, 0xb, 0xf0, + 0xb, 0xe0, 0xb0, 0xe3, 0x41, 0xcc, 0x1, 0x30, + 0x0, 0xc0, 0x3, 0xf, 0xcc, 0x7, 0x34, 0xc, + 0x70, 0xb0, 0xbf, 0x0, /* U+0048 "H" */ - 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, - 0x30, 0xc, 0x3f, 0xfc, 0x30, 0x1c, 0x30, 0xc, - 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, + 0x30, 0xc, 0xc0, 0x33, 0x0, 0xcc, 0x3, 0x30, + 0xc, 0xff, 0xf3, 0x1, 0xcc, 0x3, 0x30, 0xc, + 0xc0, 0x33, 0x0, 0xc0, /* U+0049 "I" */ 0x30, 0xc3, 0xc, 0x30, 0xc3, 0xc, 0x30, 0xc3, 0x0, /* U+004A "J" */ - 0x0, 0x30, 0x0, 0xc0, 0x3, 0x0, 0xc, 0x0, - 0x30, 0x0, 0xc0, 0x3, 0x0, 0xc, 0x30, 0x70, - 0xe3, 0x80, 0xf8, 0x0, + 0x0, 0x30, 0x3, 0x0, 0x30, 0x3, 0x0, 0x30, + 0x3, 0x0, 0x30, 0x3, 0x30, 0x73, 0x8a, 0xf, + 0x80, /* U+004B "K" */ - 0x30, 0x38, 0x30, 0x70, 0x30, 0xd0, 0x33, 0x80, + 0x30, 0x38, 0x30, 0x70, 0x30, 0xd0, 0x32, 0x80, 0x37, 0x0, 0x3f, 0x0, 0x3a, 0x80, 0x30, 0xd0, 0x30, 0xb0, 0x30, 0x34, 0x30, 0x2c, @@ -224,51 +222,51 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf0, /* U+004D "M" */ - 0x38, 0x2, 0xc3, 0xc0, 0x3c, 0x3c, 0x7, 0xc3, - 0x90, 0xac, 0x36, 0xd, 0xc3, 0x30, 0xcc, 0x33, - 0x58, 0xc3, 0x2b, 0x4c, 0x31, 0xf0, 0xc3, 0xf, - 0xc, 0x30, 0xa0, 0xc0, + 0x38, 0x2, 0xcf, 0x0, 0xf3, 0xc0, 0x7c, 0xf4, + 0x2f, 0x36, 0xd, 0xcc, 0xc3, 0x33, 0x31, 0x8c, + 0xca, 0x93, 0x31, 0xf0, 0xcc, 0x3c, 0x33, 0xa, + 0xc, /* U+004E "N" */ - 0x30, 0xc, 0x38, 0xc, 0x3c, 0xc, 0x3a, 0xc, - 0x33, 0xc, 0x32, 0x4c, 0x30, 0xcc, 0x30, 0xec, - 0x30, 0x7c, 0x30, 0x3c, 0x30, 0x1c, + 0x30, 0xc, 0xe0, 0x33, 0xc0, 0xce, 0x83, 0x33, + 0xc, 0xc9, 0x33, 0xc, 0xcc, 0x3b, 0x30, 0x7c, + 0xc0, 0xf3, 0x1, 0xc0, /* U+004F "O" */ - 0xb, 0xd0, 0x2c, 0x74, 0x34, 0x1c, 0x30, 0x1c, - 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, 0x30, 0x1c, - 0x34, 0x1c, 0x2c, 0x74, 0xb, 0xd0, + 0xb, 0xd0, 0xb0, 0xd3, 0x41, 0x8c, 0x3, 0x30, + 0xc, 0xc0, 0x33, 0x0, 0xcc, 0x3, 0x34, 0x1c, + 0xb0, 0xd0, 0xbe, 0x0, /* U+0050 "P" */ - 0x3f, 0xe0, 0x30, 0x34, 0x30, 0x1c, 0x30, 0xc, - 0x30, 0x1c, 0x30, 0x38, 0x3f, 0xe0, 0x30, 0x0, - 0x30, 0x0, 0x30, 0x0, 0x30, 0x0, + 0x3f, 0xe0, 0xc0, 0xe3, 0x1, 0xcc, 0x3, 0x30, + 0x1c, 0xc0, 0xe3, 0xff, 0xc, 0x0, 0x30, 0x0, + 0xc0, 0x3, 0x0, 0x0, /* U+0051 "Q" */ - 0xb, 0xd0, 0x2c, 0x74, 0x34, 0x1c, 0x30, 0x1c, + 0xb, 0xe0, 0x2c, 0x34, 0x34, 0x1c, 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, 0x30, 0x1c, - 0x34, 0x1c, 0x2c, 0x74, 0xb, 0xf0, 0x0, 0x2c, + 0x34, 0x1c, 0x2c, 0x34, 0xb, 0xf0, 0x0, 0x2c, 0x0, 0x4, /* U+0052 "R" */ - 0x3f, 0xe0, 0x30, 0x78, 0x30, 0x1c, 0x30, 0xc, + 0x3f, 0xe0, 0x30, 0x38, 0x30, 0x1c, 0x30, 0xc, 0x30, 0x1c, 0x30, 0x38, 0x3f, 0xf0, 0x30, 0xe0, 0x30, 0x30, 0x30, 0x28, 0x30, 0xc, /* U+0053 "S" */ - 0xb, 0xe0, 0x38, 0x38, 0x30, 0x1c, 0x30, 0x0, - 0x2d, 0x0, 0xb, 0xe0, 0x0, 0x78, 0x0, 0x1c, - 0x30, 0x1c, 0x28, 0x28, 0xb, 0xe0, + 0xb, 0xe0, 0xe0, 0xe3, 0x1, 0xcc, 0x0, 0x2d, + 0x0, 0x2f, 0x80, 0x7, 0x80, 0x7, 0xb0, 0xc, + 0xe0, 0xa0, 0xfe, 0x0, /* U+0054 "T" */ - 0xff, 0xf0, 0x70, 0x3, 0x0, 0x30, 0x3, 0x0, - 0x30, 0x3, 0x0, 0x30, 0x3, 0x0, 0x30, 0x3, - 0x0, + 0xff, 0xf8, 0x1c, 0x0, 0x30, 0x0, 0xc0, 0x3, + 0x0, 0xc, 0x0, 0x30, 0x0, 0xc0, 0x3, 0x0, + 0xc, 0x0, 0x30, 0x0, /* U+0055 "U" */ - 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, - 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, - 0x30, 0x1c, 0x38, 0x38, 0xb, 0xe0, + 0x30, 0xc, 0xc0, 0x33, 0x0, 0xcc, 0x3, 0x30, + 0xc, 0xc0, 0x33, 0x0, 0xcc, 0x3, 0x30, 0x1c, + 0xe0, 0xe0, 0xbe, 0x0, /* U+0056 "V" */ 0xb0, 0xd, 0x70, 0xc, 0x34, 0x1c, 0x28, 0x28, @@ -292,8 +290,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0xc0, 0x0, 0xc0, 0x0, 0xc0, /* U+005A "Z" */ - 0xff, 0xf0, 0xa, 0x0, 0xc0, 0x28, 0x3, 0x0, - 0xa0, 0xc, 0x2, 0x80, 0x30, 0xa, 0x0, 0xff, + 0xff, 0xf0, 0xe, 0x1, 0xc0, 0x38, 0x7, 0x0, + 0xd0, 0x1c, 0x3, 0x40, 0x60, 0xd, 0x0, 0xff, 0xf0, /* U+005B "[" */ @@ -305,8 +303,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x90, 0x1c, 0x3, 0x0, 0xd0, 0x18, 0x1, /* U+005D "]" */ - 0x7c, 0x1c, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, - 0xc, 0xc, 0xc, 0xc, 0xc, 0x7c, 0x0, + 0x3c, 0x1c, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, + 0xc, 0xc, 0xc, 0xc, 0xc, 0x3c, 0x0, /* U+005E "^" */ 0x4, 0x3, 0x41, 0xe0, 0xdc, 0x33, 0x58, 0xa0, @@ -318,40 +316,40 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x34, 0x1c, /* U+0061 "a" */ - 0xf, 0xc0, 0xe2, 0xc0, 0x3, 0x2, 0xfc, 0x38, + 0xf, 0xd0, 0xe2, 0xc0, 0x3, 0x2, 0xfc, 0x38, 0x70, 0xc0, 0xc3, 0x4b, 0x7, 0xdc, /* U+0062 "b" */ - 0x30, 0x0, 0xc0, 0x3, 0x0, 0xe, 0xf0, 0x34, - 0xa0, 0xc1, 0xc3, 0x3, 0xc, 0xc, 0x30, 0x70, - 0xd2, 0x83, 0xbc, 0x0, + 0x30, 0x3, 0x0, 0x30, 0x3, 0xbc, 0x34, 0xa3, + 0x7, 0x30, 0x33, 0x3, 0x30, 0x73, 0x4a, 0x3b, + 0xc0, /* U+0063 "c" */ - 0xf, 0xc0, 0xe2, 0x83, 0x3, 0xc, 0x0, 0x30, - 0x0, 0xc0, 0x83, 0x8b, 0x3, 0xf0, + 0xf, 0xd0, 0xe1, 0xc3, 0x2, 0xc, 0x0, 0x30, + 0x0, 0xc0, 0x83, 0x87, 0x3, 0xf4, /* U+0064 "d" */ - 0x0, 0x30, 0x0, 0xc0, 0x3, 0x3, 0xec, 0x38, - 0xb0, 0xc0, 0xc3, 0x3, 0xc, 0xc, 0x30, 0x30, - 0xe2, 0xc0, 0xfb, 0x0, + 0x0, 0x30, 0x3, 0x0, 0x30, 0xfb, 0x38, 0xb3, + 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, 0x8b, 0xf, + 0xb0, /* U+0065 "e" */ - 0xb, 0xc0, 0xe2, 0x83, 0x3, 0xf, 0xfc, 0x30, - 0x0, 0xc0, 0x3, 0x86, 0x3, 0xf4, + 0xf, 0xc3, 0x8a, 0x30, 0x33, 0xff, 0x30, 0x3, + 0x0, 0x38, 0x60, 0xfd, /* U+0066 "f" */ - 0x1f, 0x34, 0x30, 0xfc, 0x70, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, + 0x7, 0xc3, 0x40, 0xc0, 0xfd, 0x1c, 0x3, 0x0, + 0xc0, 0x30, 0xc, 0x3, 0x0, 0xc0, /* U+0067 "g" */ - 0xf, 0xb0, 0xe2, 0xc3, 0x3, 0xc, 0xc, 0x30, - 0x30, 0xc0, 0xc3, 0x8b, 0x3, 0xec, 0x0, 0x70, - 0x52, 0x81, 0xf8, 0x0, + 0xf, 0xb3, 0x8b, 0x30, 0x33, 0x3, 0x30, 0x33, + 0x3, 0x38, 0xb0, 0xfb, 0x0, 0x31, 0x4a, 0x1f, + 0xc0, /* U+0068 "h" */ - 0x30, 0x0, 0xc0, 0x3, 0x0, 0xd, 0xf0, 0x38, - 0xb0, 0xc0, 0xc3, 0x3, 0xc, 0xc, 0x30, 0x30, - 0xc0, 0xc3, 0x3, 0x0, + 0x30, 0x3, 0x0, 0x30, 0x3, 0x7d, 0x38, 0xb3, + 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, 0x3, 0x30, + 0x30, /* U+0069 "i" */ 0x30, 0x0, 0xc, 0x30, 0xc3, 0xc, 0x30, 0xc3, @@ -359,7 +357,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+006A "j" */ 0xc, 0x0, 0x0, 0xc, 0xc, 0xc, 0xc, 0xc, - 0xc, 0xc, 0xc, 0xc, 0x1c, 0x34, + 0xc, 0xc, 0xc, 0xc, 0x1c, 0x38, /* U+006B "k" */ 0x30, 0x0, 0xc0, 0x3, 0x0, 0xc, 0x34, 0x32, @@ -371,81 +369,81 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, /* U+006D "m" */ - 0x3b, 0xdb, 0xc0, 0xe2, 0xe2, 0xc3, 0x3, 0x3, - 0xc, 0xc, 0xc, 0x30, 0x30, 0x30, 0xc0, 0xc0, - 0xc3, 0x3, 0x3, 0xc, 0xc, 0xc, + 0x3b, 0xdb, 0xd3, 0x8b, 0x8b, 0x30, 0x30, 0x33, + 0x3, 0x3, 0x30, 0x30, 0x33, 0x3, 0x3, 0x30, + 0x30, 0x33, 0x3, 0x3, /* U+006E "n" */ - 0x37, 0xd0, 0xe2, 0xc3, 0x3, 0xc, 0xc, 0x30, - 0x30, 0xc0, 0xc3, 0x3, 0xc, 0xc, + 0x37, 0xd3, 0x8b, 0x30, 0x33, 0x3, 0x30, 0x33, + 0x3, 0x30, 0x33, 0x3, /* U+006F "o" */ - 0xb, 0x80, 0xa3, 0x83, 0x7, 0xc, 0xc, 0x30, - 0x30, 0xc1, 0xc2, 0x8a, 0x3, 0xe0, + 0xb, 0xe0, 0xb0, 0xd3, 0x1, 0xcc, 0x3, 0x30, + 0xc, 0xc0, 0x72, 0xc3, 0x42, 0xf8, /* U+0070 "p" */ - 0x3b, 0xc0, 0xd3, 0x83, 0x7, 0xc, 0xc, 0x30, - 0x30, 0xc1, 0xc3, 0x4e, 0xe, 0xf0, 0x30, 0x0, - 0xc0, 0x3, 0x0, 0x0, + 0x3b, 0xc3, 0x4e, 0x30, 0x73, 0x3, 0x30, 0x33, + 0x7, 0x34, 0xe3, 0xbc, 0x30, 0x3, 0x0, 0x30, + 0x0, /* U+0071 "q" */ - 0xf, 0xb0, 0xe2, 0xc3, 0x3, 0xc, 0xc, 0x30, - 0x30, 0xc0, 0xc3, 0x8b, 0x3, 0xec, 0x0, 0x30, - 0x0, 0xc0, 0x3, 0x0, - - /* U+0072 "r" */ - 0x0, 0x3b, 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, + 0xf, 0xb3, 0x8b, 0x30, 0x33, 0x3, 0x30, 0x33, + 0x3, 0x38, 0xb0, 0xfb, 0x0, 0x30, 0x3, 0x0, 0x30, + /* U+0072 "r" */ + 0x3b, 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + /* U+0073 "s" */ - 0x1f, 0xc0, 0xd2, 0xc3, 0x1, 0xb, 0x80, 0x2, - 0xd0, 0x41, 0xc3, 0x4b, 0x3, 0xf0, + 0x2f, 0xa, 0x2c, 0xa0, 0x43, 0x80, 0xb, 0x44, + 0x1c, 0x61, 0xc2, 0xf4, /* U+0074 "t" */ - 0x30, 0xcf, 0xdc, 0x30, 0xc3, 0xc, 0x34, 0xb0, + 0xc, 0x3, 0x7, 0xf4, 0x70, 0xc, 0x3, 0x0, + 0xc0, 0x30, 0xc, 0x2, 0xd0, /* U+0075 "u" */ - 0x30, 0x30, 0xc0, 0xc3, 0x3, 0xc, 0xc, 0x30, - 0x30, 0xc0, 0xc3, 0x4b, 0x7, 0xec, + 0x30, 0x33, 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, + 0x3, 0x34, 0xb1, 0xfb, /* U+0076 "v" */ 0xa0, 0xa7, 0xc, 0x30, 0xc2, 0x58, 0x1a, 0x40, 0xf0, 0xf, 0x0, 0xa0, /* U+0077 "w" */ - 0xa0, 0xc2, 0x9c, 0x74, 0xd3, 0x2e, 0x30, 0xdd, - 0xcc, 0x2b, 0x36, 0x7, 0x8b, 0x40, 0xd1, 0xd0, - 0x30, 0x30, + 0x30, 0x30, 0x63, 0x47, 0x49, 0x28, 0xb8, 0xd1, + 0xcd, 0xcc, 0xf, 0xcd, 0xc0, 0xfc, 0xb8, 0xf, + 0x87, 0x40, 0xb4, 0x30, /* U+0078 "x" */ 0x70, 0xd3, 0x5c, 0x1f, 0x40, 0xf0, 0xf, 0x1, 0xe4, 0x35, 0xc7, 0xe, /* U+0079 "y" */ - 0x30, 0x73, 0x4a, 0x28, 0xd1, 0xcc, 0xd, 0x80, - 0xf4, 0xb, 0x0, 0x70, 0x6, 0x0, 0xd0, 0x38, + 0xa0, 0xd7, 0xc, 0x31, 0xc3, 0x68, 0x2b, 0x40, + 0xf0, 0xf, 0x0, 0xa0, 0xd, 0x1, 0xc0, 0x74, 0x0, /* U+007A "z" */ - 0xff, 0xc0, 0xe0, 0x70, 0x34, 0x2c, 0xd, 0xa, + 0xff, 0xc0, 0xe0, 0xb0, 0x38, 0x2c, 0xe, 0xb, 0x3, 0xff, /* U+007B "{" */ 0x1, 0x2, 0xc0, 0xc0, 0x30, 0xc, 0x3, 0x1, - 0xc0, 0xd0, 0x28, 0x3, 0x0, 0xc0, 0x30, 0xc, - 0x2, 0x80, 0x20, + 0xc1, 0xd0, 0x2c, 0x3, 0x0, 0xc0, 0x30, 0xc, + 0x3, 0x80, 0x20, /* U+007C "|" */ 0x30, 0xc3, 0xc, 0x30, 0xc3, 0xc, 0x30, 0xc3, 0xc, 0x20, /* U+007D "}" */ - 0x0, 0xd, 0x1, 0xc0, 0x70, 0xc, 0x3, 0x0, - 0xd0, 0x1d, 0xe, 0x3, 0x0, 0xc0, 0x30, 0x1c, - 0xd, 0x1, 0x0, + 0x0, 0xc, 0x2, 0x80, 0x70, 0xc, 0x3, 0x0, + 0xc0, 0x3c, 0xb, 0x3, 0x40, 0xc0, 0x30, 0xc, + 0x7, 0x3, 0x40, 0x40, /* U+007E "~" */ - 0x1d, 0xc, 0x36, 0x5c, 0x30, 0xf4, 0x0, 0x0, + 0x3c, 0x16, 0x6c, 0xdc, 0x2e, 0x0, 0x0, /* U+00A0 " " */ @@ -453,81 +451,81 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x30, 0x3, 0xc, 0x30, 0xc3, 0xc, 0x30, 0xc0, /* U+00A3 "£" */ - 0xb, 0xc0, 0xe2, 0x83, 0x3, 0xc, 0x0, 0x30, - 0x3, 0xfc, 0x7, 0x0, 0xc, 0x0, 0x30, 0x1, - 0xc0, 0xf, 0xff, 0x0, + 0x3, 0xf0, 0x38, 0xf0, 0xc1, 0xc3, 0x0, 0xc, + 0x0, 0xff, 0x1, 0xc0, 0x3, 0x0, 0xc, 0x0, + 0x70, 0x3, 0xff, 0xc0, /* U+00B0 "°" */ - 0x2d, 0xe, 0xc3, 0x70, 0xb8, 0x0, 0x0, + 0x2d, 0x37, 0x37, 0x2e, 0x0, /* U+00B1 "±" */ - 0xc, 0x3, 0x0, 0xc3, 0xff, 0x1c, 0x3, 0x0, - 0xc0, 0x0, 0xff, 0xc0, + 0x3, 0x0, 0xc, 0x0, 0x30, 0xf, 0xfd, 0x7, + 0x0, 0xc, 0x0, 0x30, 0x0, 0x0, 0x3f, 0xf0, /* U+00B2 "²" */ - 0x3e, 0x15, 0xc0, 0x90, 0x90, 0xbf, 0x0, + 0x2f, 0x8, 0x90, 0x30, 0x70, 0x3f, 0x80, /* U+00B3 "³" */ - 0x3e, 0x57, 0x1e, 0x57, 0x7d, + 0x3d, 0x7, 0x1e, 0x43, 0x3d, /* U+00B5 "µ" */ - 0x30, 0x30, 0xc0, 0xc3, 0x3, 0xc, 0xc, 0x30, - 0x30, 0xc0, 0xc3, 0x8b, 0xf, 0xec, 0x30, 0x0, - 0xc0, 0x3, 0x0, 0x0, + 0x30, 0x33, 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, + 0x3, 0x34, 0xb3, 0xfb, 0x30, 0x3, 0x0, 0x30, + 0x0, /* U+00BF "¿" */ - 0x3, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc0, 0xa, - 0x0, 0x70, 0x3, 0x40, 0xc, 0x0, 0x30, 0x20, - 0xe2, 0x80, 0xf8, 0x0, + 0x3, 0x0, 0x0, 0x1, 0x0, 0x30, 0xa, 0x0, + 0xc0, 0x34, 0x3, 0x0, 0x30, 0x63, 0x8e, 0x1f, + 0x80, /* U+00C0 "À" */ - 0x5, 0x0, 0x3, 0x0, 0x1, 0x40, 0x2, 0x80, - 0x3, 0xc0, 0x3, 0xd0, 0xa, 0xa0, 0xd, 0x70, - 0xc, 0x30, 0x1c, 0x34, 0x2f, 0xfc, 0x34, 0x1c, - 0x70, 0xd, 0xa0, 0xa, + 0x5, 0x0, 0x0, 0xd0, 0x0, 0x8, 0x0, 0xb, + 0x40, 0x3, 0xe0, 0x0, 0xfc, 0x0, 0x7b, 0x0, + 0x2c, 0xd0, 0xe, 0x3c, 0x3, 0x47, 0x1, 0xff, + 0xd0, 0xa0, 0x38, 0x34, 0x7, 0x1c, 0x0, 0xc0, /* U+00C1 "Á" */ - 0x0, 0x10, 0x0, 0xd0, 0x0, 0x40, 0x2, 0x80, - 0x3, 0xc0, 0x3, 0xd0, 0xa, 0xa0, 0xd, 0x70, - 0xc, 0x30, 0x1c, 0x34, 0x2f, 0xfc, 0x34, 0x1c, - 0x70, 0xd, 0xa0, 0xa, + 0x0, 0x14, 0x0, 0x2c, 0x0, 0x8, 0x0, 0xb, + 0x40, 0x3, 0xe0, 0x0, 0xfc, 0x0, 0x7b, 0x0, + 0x2c, 0xd0, 0xe, 0x3c, 0x3, 0x47, 0x1, 0xff, + 0xd0, 0xa0, 0x38, 0x34, 0x7, 0x1c, 0x0, 0xc0, /* U+00C2 "Â" */ - 0x0, 0x40, 0x3, 0xc0, 0x4, 0x10, 0x2, 0x80, - 0x3, 0xc0, 0x3, 0xd0, 0xa, 0xa0, 0xd, 0x70, - 0xc, 0x30, 0x1c, 0x34, 0x2f, 0xfc, 0x34, 0x1c, - 0x70, 0xd, 0xa0, 0xa, + 0x0, 0x80, 0x0, 0xec, 0x0, 0x11, 0x0, 0xb, + 0x40, 0x3, 0xe0, 0x0, 0xfc, 0x0, 0x7b, 0x0, + 0x2c, 0xd0, 0xe, 0x3c, 0x3, 0x47, 0x1, 0xff, + 0xd0, 0xa0, 0x38, 0x34, 0x7, 0x1c, 0x0, 0xc0, /* U+00C3 "Ã" */ - 0x0, 0x0, 0xb, 0xf0, 0x0, 0x0, 0x2, 0x80, - 0x3, 0xc0, 0x7, 0xc0, 0xa, 0xa0, 0xd, 0x70, - 0xc, 0x30, 0x1c, 0x34, 0x2f, 0xf8, 0x34, 0x1c, - 0x70, 0xc, 0xa0, 0xe, + 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x0, 0xb, + 0x40, 0x3, 0xe0, 0x0, 0xfc, 0x0, 0x7b, 0x0, + 0x2c, 0xd0, 0xe, 0x3c, 0x3, 0x47, 0x1, 0xff, + 0xd0, 0xa0, 0x38, 0x34, 0x7, 0x1c, 0x0, 0xc0, /* U+00C4 "Ä" */ - 0xc, 0x30, 0x0, 0x0, 0x3, 0x80, 0x3, 0xc0, - 0x6, 0xc0, 0xd, 0x90, 0xc, 0x60, 0x1c, 0x30, - 0x28, 0x34, 0x3f, 0xf8, 0x30, 0x1c, 0x70, 0xc, - 0xa0, 0xd, + 0xc, 0x30, 0x0, 0x0, 0x3, 0xc0, 0x3, 0xd0, + 0x7, 0xe0, 0xb, 0xe0, 0xf, 0x70, 0xe, 0x30, + 0x1c, 0x34, 0x2f, 0xf8, 0x38, 0x2c, 0x30, 0x1c, + 0x70, 0xc, /* U+00C5 "Å" */ - 0x2, 0xd0, 0x0, 0xec, 0x0, 0x2e, 0x0, 0x3, - 0x0, 0x1, 0xc0, 0x0, 0xa4, 0x0, 0x33, 0x0, - 0x18, 0xc0, 0x9, 0x24, 0x3, 0x7, 0x1, 0xff, - 0xc0, 0xa0, 0x24, 0x30, 0x7, 0x1c, 0x0, 0xc0, + 0x2, 0xd0, 0x0, 0xdc, 0x0, 0x2e, 0x0, 0x3, + 0x0, 0x1, 0xd0, 0x0, 0xf8, 0x0, 0x37, 0x0, + 0x1c, 0xd0, 0xa, 0x28, 0x3, 0x47, 0x1, 0xff, + 0xc0, 0xa0, 0x38, 0x34, 0x7, 0x1c, 0x0, 0xc0, /* U+00C6 "Æ" */ - 0x0, 0xf, 0xff, 0x0, 0xb, 0xc0, 0x0, 0x3, - 0xb0, 0x0, 0x2, 0xcc, 0x0, 0x0, 0xd3, 0x0, - 0x0, 0x70, 0xff, 0x40, 0x34, 0x30, 0x0, 0x1f, - 0xfc, 0x0, 0xe, 0x7, 0x0, 0x7, 0x0, 0xc0, - 0x3, 0x80, 0x3f, 0xf0, + 0x0, 0x3f, 0xfc, 0x0, 0xbc, 0x0, 0x0, 0xdc, + 0x0, 0x1, 0xcc, 0x0, 0x3, 0x4c, 0x0, 0x7, + 0xf, 0xf4, 0xe, 0xc, 0x0, 0x1f, 0xfc, 0x0, + 0x38, 0x1c, 0x0, 0x70, 0xc, 0x0, 0xe0, 0xf, + 0xfc, /* U+00C7 "Ç" */ - 0xb, 0xe0, 0x1c, 0x38, 0x34, 0x1c, 0x30, 0x8, - 0x30, 0x0, 0x30, 0x0, 0x30, 0x0, 0x30, 0x8, - 0x34, 0x1c, 0x1c, 0x38, 0xb, 0xe0, 0x2, 0x40, - 0x1, 0xc0, 0x3, 0x80, + 0xb, 0xe0, 0x70, 0xe3, 0x41, 0xcc, 0x2, 0x30, + 0x0, 0xc0, 0x3, 0x0, 0xc, 0x2, 0x34, 0x1c, + 0x70, 0xe0, 0xbe, 0x0, 0x60, 0x0, 0xc0, 0xa, + 0x0, /* U+00C8 "È" */ 0x14, 0x0, 0x34, 0x0, 0x10, 0xf, 0xfc, 0x30, @@ -536,7 +534,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc0, /* U+00C9 "É" */ - 0x0, 0x40, 0xa, 0x0, 0x10, 0xf, 0xfc, 0x30, + 0x0, 0x80, 0xa, 0x0, 0x10, 0xf, 0xfc, 0x30, 0x0, 0xc0, 0x3, 0x0, 0xc, 0x0, 0x3f, 0xe0, 0xc0, 0x3, 0x0, 0xc, 0x0, 0x30, 0x0, 0xff, 0xc0, @@ -550,14 +548,14 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+00CB "Ë" */ 0xc, 0x30, 0x0, 0x3, 0xff, 0x4c, 0x0, 0x30, 0x0, 0xc0, 0x3, 0x0, 0xf, 0xfc, 0x30, 0x0, - 0xc0, 0x3, 0x0, 0xc, 0x0, 0x3f, 0xf8, + 0xc0, 0x3, 0x0, 0xc, 0x0, 0x3f, 0xf4, /* U+00CC "Ì" */ - 0x50, 0x34, 0x4, 0xc, 0xc, 0xc, 0xc, 0xc, + 0x10, 0x34, 0x4, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, /* U+00CD "Í" */ - 0x4, 0x28, 0x10, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x8, 0x28, 0x10, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, /* U+00CE "Î" */ @@ -566,160 +564,158 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x3, 0x0, /* U+00CF "Ï" */ - 0x30, 0x80, 0x0, 0x3, 0x0, 0x30, 0x3, 0x0, - 0x30, 0x3, 0x0, 0x30, 0x3, 0x0, 0x30, 0x3, - 0x0, 0x30, 0x3, 0x0, + 0x30, 0xc0, 0x0, 0x30, 0xc, 0x3, 0x0, 0xc0, + 0x30, 0xc, 0x3, 0x0, 0xc0, 0x30, 0xc, 0x3, + 0x0, /* U+00D0 "Ð" */ - 0x3f, 0xd0, 0x30, 0x70, 0x30, 0x28, 0x30, 0x1c, - 0x30, 0xc, 0xff, 0xc, 0x70, 0xc, 0x30, 0x1c, - 0x30, 0x28, 0x30, 0x70, 0x3f, 0xd0, + 0xf, 0xf4, 0xc, 0x1c, 0xc, 0xa, 0xc, 0x7, + 0xc, 0x3, 0x3f, 0x83, 0x1c, 0x3, 0xc, 0x7, + 0xc, 0xa, 0xc, 0x1c, 0xf, 0xf4, /* U+00D1 "Ñ" */ - 0x0, 0x0, 0xb, 0xe0, 0x0, 0x0, 0x34, 0xc, - 0x3c, 0xc, 0x3d, 0xc, 0x3a, 0xc, 0x37, 0xc, - 0x32, 0x8c, 0x30, 0xcc, 0x30, 0xac, 0x30, 0x7c, - 0x30, 0x3c, 0x30, 0x1c, + 0x0, 0x0, 0x2f, 0x80, 0x0, 0xc, 0x3, 0x38, + 0xc, 0xf0, 0x33, 0xa0, 0xcc, 0xc3, 0x32, 0x4c, + 0xc3, 0x33, 0xe, 0xcc, 0x1f, 0x30, 0x3c, 0xc0, + 0x70, /* U+00D2 "Ò" */ - 0x5, 0x0, 0x3, 0x0, 0x1, 0x0, 0xb, 0xd0, - 0x2c, 0x74, 0x34, 0x1c, 0x30, 0x1c, 0x30, 0xc, - 0x30, 0xc, 0x30, 0xc, 0x30, 0x1c, 0x34, 0x1c, - 0x2c, 0x74, 0xb, 0xd0, + 0x5, 0x0, 0xc, 0x0, 0x10, 0x2, 0xf4, 0x2c, + 0x34, 0xd0, 0x63, 0x0, 0xcc, 0x3, 0x30, 0xc, + 0xc0, 0x33, 0x0, 0xcd, 0x7, 0x2c, 0x34, 0x2f, + 0x80, /* U+00D3 "Ó" */ - 0x0, 0x50, 0x0, 0xc0, 0x1, 0x0, 0xb, 0xd0, - 0x2c, 0x74, 0x34, 0x1c, 0x30, 0x1c, 0x30, 0xc, - 0x30, 0xc, 0x30, 0xc, 0x30, 0x1c, 0x34, 0x1c, - 0x2c, 0x74, 0xb, 0xd0, + 0x0, 0x50, 0x3, 0x0, 0x10, 0x2, 0xf4, 0x2c, + 0x34, 0xd0, 0x63, 0x0, 0xcc, 0x3, 0x30, 0xc, + 0xc0, 0x33, 0x0, 0xcd, 0x7, 0x2c, 0x34, 0x2f, + 0x80, /* U+00D4 "Ô" */ - 0x1, 0x0, 0x3, 0xc0, 0x4, 0x0, 0xb, 0xd0, - 0x2c, 0x74, 0x34, 0x1c, 0x30, 0x1c, 0x30, 0xc, - 0x30, 0xc, 0x30, 0xc, 0x30, 0x1c, 0x34, 0x1c, - 0x2c, 0x74, 0xb, 0xd0, + 0x1, 0x0, 0xf, 0x0, 0x40, 0x2, 0xf4, 0x2c, + 0x34, 0xd0, 0x63, 0x0, 0xcc, 0x3, 0x30, 0xc, + 0xc0, 0x33, 0x0, 0xcd, 0x7, 0x2c, 0x34, 0x2f, + 0x80, /* U+00D5 "Õ" */ - 0x0, 0x0, 0xb, 0xf0, 0x0, 0x0, 0xb, 0xd0, - 0x2d, 0x24, 0x34, 0x8, 0x30, 0x8, 0x30, 0x8, - 0x30, 0x8, 0x30, 0x8, 0x30, 0x8, 0x34, 0x8, - 0x2d, 0x24, 0xb, 0xd0, + 0x0, 0x0, 0x2f, 0x80, 0x0, 0x2, 0xf4, 0x2c, + 0x34, 0xd0, 0x63, 0x0, 0xcc, 0x3, 0x30, 0xc, + 0xc0, 0x33, 0x0, 0xcd, 0x7, 0x2c, 0x34, 0x2f, + 0x80, /* U+00D6 "Ö" */ - 0xc, 0x30, 0x0, 0x0, 0xb, 0xd0, 0x2c, 0x74, - 0x34, 0x1c, 0x30, 0x1c, 0x30, 0xc, 0x30, 0xc, - 0x30, 0xc, 0x30, 0x1c, 0x34, 0x1c, 0x2c, 0x74, - 0xb, 0xd0, + 0xc, 0x30, 0x0, 0x0, 0xbd, 0xb, 0xd, 0x34, + 0x18, 0xc0, 0x33, 0x0, 0xcc, 0x3, 0x30, 0xc, + 0xc0, 0x33, 0x41, 0xcb, 0xd, 0xb, 0xe0, /* U+00D7 "×" */ 0x0, 0x3, 0x6, 0x38, 0xd0, 0xf8, 0xb, 0x42, 0xec, 0x30, 0xa0, 0x0, /* U+00D8 "Ø" */ - 0x7, 0xf7, 0x3, 0x4b, 0x43, 0x42, 0xe0, 0xc0, - 0xec, 0x30, 0x73, 0xc, 0x34, 0xc3, 0x1c, 0x70, - 0xcd, 0x1c, 0x3f, 0xa, 0x7, 0x87, 0x1, 0xbf, + 0x7, 0xf7, 0x3, 0x47, 0x42, 0x80, 0xe0, 0xc0, + 0xac, 0x30, 0x23, 0xc, 0x20, 0xc3, 0x8, 0x30, + 0xc8, 0x1c, 0x2e, 0xa, 0x7, 0x47, 0x1, 0xbf, 0x0, 0x40, 0x0, /* U+00D9 "Ù" */ - 0x4, 0x0, 0x7, 0x0, 0x1, 0x0, 0x30, 0xc, - 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, - 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, 0x30, 0x1c, - 0x38, 0x38, 0xb, 0xe0, + 0x4, 0x0, 0x1c, 0x0, 0x10, 0xc, 0x3, 0x30, + 0xc, 0xc0, 0x33, 0x0, 0xcc, 0x3, 0x30, 0xc, + 0xc0, 0x33, 0x0, 0xcc, 0x7, 0x38, 0x38, 0x2f, + 0x80, /* U+00DA "Ú" */ - 0x0, 0x50, 0x0, 0xc0, 0x1, 0x0, 0x30, 0xc, - 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, - 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, 0x30, 0x1c, - 0x38, 0x38, 0xb, 0xe0, + 0x0, 0x50, 0x3, 0x0, 0x10, 0xc, 0x3, 0x30, + 0xc, 0xc0, 0x33, 0x0, 0xcc, 0x3, 0x30, 0xc, + 0xc0, 0x33, 0x0, 0xcc, 0x7, 0x38, 0x38, 0x2f, + 0x80, /* U+00DB "Û" */ - 0x1, 0x0, 0x7, 0xc0, 0x4, 0x10, 0x30, 0xc, - 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, - 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, 0x30, 0x1c, - 0x38, 0x38, 0xb, 0xe0, + 0x1, 0x0, 0x1f, 0x0, 0x41, 0xc, 0x3, 0x30, + 0xc, 0xc0, 0x33, 0x0, 0xcc, 0x3, 0x30, 0xc, + 0xc0, 0x33, 0x0, 0xcc, 0x7, 0x38, 0x38, 0x2f, + 0x80, /* U+00DC "Ü" */ - 0xc, 0x30, 0x0, 0x0, 0x30, 0xc, 0x30, 0xc, - 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, - 0x30, 0xc, 0x30, 0xc, 0x30, 0x1c, 0x38, 0x38, - 0xb, 0xe0, + 0xc, 0x30, 0x0, 0x3, 0x0, 0xcc, 0x3, 0x30, + 0xc, 0xc0, 0x33, 0x0, 0xcc, 0x3, 0x30, 0xc, + 0xc0, 0x33, 0x1, 0xce, 0xe, 0xb, 0xe0, /* U+00DD "Ý" */ - 0x0, 0x10, 0x0, 0xa0, 0x0, 0x40, 0x38, 0xe, + 0x0, 0x20, 0x0, 0xa0, 0x0, 0x40, 0x38, 0xe, 0x1c, 0xc, 0xd, 0x1c, 0xa, 0x34, 0x3, 0x70, 0x3, 0xe0, 0x1, 0xc0, 0x0, 0xc0, 0x0, 0xc0, 0x0, 0xc0, 0x0, 0xc0, /* U+00DE "Þ" */ - 0x30, 0x0, 0xc0, 0x3, 0x0, 0xf, 0xe0, 0x30, - 0xe0, 0xc1, 0xc3, 0x7, 0xc, 0x28, 0x3f, 0xc0, - 0xc0, 0x3, 0x0, 0x0, + 0x30, 0x3, 0x0, 0x30, 0x3, 0xf8, 0x30, 0xa3, + 0x7, 0x30, 0x33, 0xa, 0x3f, 0xc3, 0x0, 0x30, + 0x0, /* U+00DF "ß" */ - 0x1f, 0x40, 0x36, 0xc0, 0x30, 0xc0, 0x30, 0xc0, - 0x30, 0xc0, 0x30, 0xc0, 0x30, 0xb0, 0x30, 0x38, - 0x30, 0x1c, 0x31, 0x2c, 0x33, 0xf0, + 0x1f, 0x40, 0xd7, 0x3, 0xc, 0xc, 0x30, 0x30, + 0xc0, 0xc3, 0x3, 0xa, 0xc, 0xe, 0x30, 0xc, + 0xc4, 0xb3, 0x3f, 0x40, /* U+00E0 "à" */ - 0xd, 0x0, 0x1c, 0x0, 0x0, 0x3, 0xf0, 0x38, - 0xb0, 0x40, 0xc0, 0xbf, 0xe, 0x1c, 0x30, 0x30, + 0xd, 0x0, 0x1c, 0x0, 0x0, 0x7, 0xf4, 0x34, + 0xb0, 0x0, 0xc0, 0xbf, 0xe, 0x1c, 0x30, 0x30, 0xd2, 0xc1, 0xf7, 0x0, /* U+00E1 "á" */ - 0x0, 0xd0, 0x9, 0x0, 0x0, 0x3, 0xf0, 0x38, + 0x0, 0xd0, 0xa, 0x0, 0x0, 0x3, 0xf4, 0x38, 0xb0, 0x0, 0xc0, 0xbf, 0xe, 0xc, 0x30, 0x30, 0xd2, 0xc1, 0xf7, 0x0, /* U+00E2 "â" */ - 0x3, 0x40, 0x32, 0x0, 0x0, 0x3, 0xf0, 0x38, + 0x3, 0x40, 0x32, 0x0, 0x0, 0x3, 0xf4, 0x38, 0xb0, 0x0, 0xc0, 0xbf, 0xe, 0x1c, 0x30, 0x30, 0xd2, 0xc1, 0xf7, 0x0, /* U+00E3 "ã" */ - 0x0, 0x0, 0x38, 0xc1, 0x5e, 0x0, 0x0, 0xf, - 0xc0, 0xe2, 0xc0, 0x3, 0x2, 0xfc, 0x38, 0x70, + 0x0, 0x0, 0x38, 0xc1, 0x6d, 0x0, 0x0, 0xf, + 0xd0, 0xe2, 0xc0, 0x3, 0x2, 0xfc, 0x38, 0x70, 0xc0, 0xc3, 0x4b, 0x7, 0xdc, /* U+00E4 "ä" */ - 0xc, 0x30, 0x0, 0x0, 0x0, 0x3, 0xf0, 0x38, + 0xc, 0x30, 0x0, 0x0, 0x0, 0x3, 0xf4, 0x38, 0xb0, 0x0, 0xc0, 0xbf, 0xe, 0x1c, 0x30, 0x30, 0xd2, 0xc1, 0xf7, 0x0, /* U+00E5 "å" */ - 0x7, 0x40, 0x3b, 0x0, 0xb8, 0x0, 0x0, 0xf, - 0xc0, 0xe2, 0xc0, 0x3, 0x2, 0xfc, 0x38, 0x70, + 0x7, 0x40, 0x37, 0x0, 0xb8, 0x0, 0x0, 0xf, + 0xd0, 0xe2, 0xc0, 0x3, 0x2, 0xfc, 0x38, 0x70, 0xc0, 0xc3, 0x4b, 0x7, 0xdc, /* U+00E6 "æ" */ - 0x1f, 0xcb, 0x80, 0xe2, 0xe2, 0x80, 0x3, 0x3, - 0x7, 0xff, 0xfc, 0x38, 0x70, 0x0, 0xc0, 0xc0, - 0x3, 0x4b, 0xc2, 0x7, 0xe2, 0xf4, + 0x1f, 0xdb, 0xc3, 0x8b, 0x8a, 0x0, 0x30, 0x31, + 0xff, 0xff, 0x38, 0x70, 0x3, 0x3, 0x0, 0x34, + 0xb8, 0x21, 0xf8, 0xbd, /* U+00E7 "ç" */ - 0xf, 0xc0, 0xe1, 0x83, 0x3, 0xc, 0x0, 0x30, - 0x0, 0xc0, 0x83, 0x87, 0x3, 0xf0, 0x3, 0x40, + 0xf, 0xd0, 0xe1, 0xc3, 0x2, 0xc, 0x0, 0x30, + 0x0, 0xc0, 0x43, 0x87, 0x3, 0xf4, 0x3, 0x40, 0x7, 0x0, 0x34, 0x0, /* U+00E8 "è" */ - 0xc, 0x0, 0x1c, 0x0, 0x0, 0x2, 0xf0, 0x38, - 0xa0, 0xc0, 0xc3, 0xff, 0xc, 0x0, 0x30, 0x0, - 0xe1, 0x80, 0xfd, 0x0, + 0xc, 0x0, 0x70, 0x0, 0x0, 0xfc, 0x38, 0xa3, + 0x3, 0x3f, 0xf3, 0x0, 0x30, 0x3, 0x86, 0xf, + 0xd0, /* U+00E9 "é" */ - 0x1, 0xc0, 0xd, 0x0, 0x0, 0x2, 0xf0, 0x38, - 0xa0, 0xc0, 0xc3, 0xff, 0xc, 0x0, 0x30, 0x0, - 0xe1, 0x80, 0xfd, 0x0, + 0x1, 0xc0, 0x34, 0x0, 0x0, 0xfc, 0x38, 0xa3, + 0x3, 0x3f, 0xf3, 0x0, 0x30, 0x3, 0x86, 0xf, + 0xd0, /* U+00EA "ê" */ - 0x7, 0x0, 0x32, 0x0, 0x0, 0x2, 0xf0, 0x38, - 0xa0, 0xc0, 0xc3, 0xff, 0xc, 0x0, 0x30, 0x0, - 0xe1, 0x80, 0xfd, 0x0, + 0x7, 0x0, 0xc8, 0x0, 0x0, 0xfc, 0x38, 0xa3, + 0x3, 0x3f, 0xf3, 0x0, 0x30, 0x3, 0x86, 0xf, + 0xd0, /* U+00EB "ë" */ - 0xc, 0x30, 0x0, 0x0, 0x0, 0x2, 0xf0, 0x38, - 0xa0, 0xc0, 0xc3, 0xff, 0xc, 0x0, 0x30, 0x0, - 0xe0, 0xc0, 0xbd, 0x0, + 0xc, 0x30, 0x0, 0x0, 0x0, 0xfc, 0x38, 0xa3, + 0x3, 0x3f, 0xf3, 0x0, 0x30, 0x3, 0x82, 0xf, + 0xd0, /* U+00EC "ì" */ 0x70, 0x1c, 0x0, 0xc, 0xc, 0xc, 0xc, 0xc, @@ -734,101 +730,97 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc0, 0x30, 0xc, 0x3, 0x0, 0xc0, /* U+00EF "ï" */ - 0x30, 0xc0, 0x0, 0x0, 0x0, 0x30, 0x3, 0x0, - 0x30, 0x3, 0x0, 0x30, 0x3, 0x0, 0x30, 0x3, - 0x0, + 0x30, 0xc0, 0x0, 0x0, 0xc, 0x3, 0x0, 0xc0, + 0x30, 0xc, 0x3, 0x0, 0xc0, 0x30, /* U+00F0 "ð" */ - 0x0, 0x0, 0x75, 0x40, 0x7c, 0x1, 0xf0, 0x0, - 0xa0, 0x2f, 0xc2, 0x8b, 0xc, 0xc, 0x30, 0x30, - 0xc1, 0xc2, 0x8d, 0x2, 0xe0, + 0x0, 0x1, 0xd5, 0x7, 0xc0, 0x7c, 0x0, 0xa0, + 0xff, 0x28, 0xb3, 0x3, 0x30, 0x33, 0x7, 0x38, + 0xd0, 0xf8, /* U+00F1 "ñ" */ - 0x0, 0x0, 0x75, 0x82, 0x6c, 0x0, 0x0, 0x37, - 0xd0, 0xe2, 0xc3, 0x3, 0xc, 0xc, 0x30, 0x30, - 0xc0, 0xc3, 0x3, 0xc, 0xc, + 0x0, 0x0, 0xd6, 0x26, 0xc0, 0x0, 0x37, 0xd3, + 0x8b, 0x30, 0x33, 0x3, 0x30, 0x33, 0x3, 0x30, + 0x33, 0x3, /* U+00F2 "ò" */ - 0xc, 0x0, 0x18, 0x0, 0x0, 0x2, 0xe0, 0x28, - 0xe0, 0xc1, 0xc3, 0x3, 0xc, 0xc, 0x30, 0x70, - 0xa2, 0x80, 0xf8, 0x0, + 0xe, 0x0, 0xd, 0x0, 0x0, 0x2, 0xf8, 0x2c, + 0x34, 0xc0, 0x73, 0x0, 0xcc, 0x3, 0x30, 0x1c, + 0xb0, 0xd0, 0xbe, 0x0, /* U+00F3 "ó" */ - 0x1, 0xc0, 0xc, 0x0, 0x0, 0x2, 0xe0, 0x28, - 0xe0, 0xc1, 0xc3, 0x3, 0xc, 0xc, 0x30, 0x70, - 0xa2, 0x80, 0xf8, 0x0, + 0x0, 0xe0, 0xa, 0x0, 0x0, 0x2, 0xf8, 0x2c, + 0x34, 0xc0, 0x73, 0x0, 0xcc, 0x3, 0x30, 0x1c, + 0xb0, 0xd0, 0xbe, 0x0, /* U+00F4 "ô" */ - 0x7, 0x0, 0x26, 0x0, 0x0, 0x2, 0xe0, 0x28, - 0xe0, 0xc1, 0xc3, 0x3, 0xc, 0xc, 0x30, 0x70, - 0xa2, 0x80, 0xf8, 0x0, + 0x3, 0x80, 0x26, 0x40, 0x0, 0x2, 0xf8, 0x2c, + 0x34, 0xc0, 0x73, 0x0, 0xcc, 0x3, 0x30, 0x1c, + 0xb0, 0xd0, 0xbe, 0x0, /* U+00F5 "õ" */ - 0x0, 0x0, 0x36, 0x1, 0x6c, 0x0, 0x0, 0xb, - 0x80, 0xa3, 0x83, 0x7, 0xc, 0xc, 0x30, 0x30, - 0xc1, 0xc2, 0x8a, 0x3, 0xe0, + 0x0, 0x0, 0x38, 0xc1, 0x9e, 0x0, 0x0, 0xb, + 0xe0, 0xb0, 0xd3, 0x1, 0xcc, 0x3, 0x30, 0xc, + 0xc0, 0x72, 0xc3, 0x42, 0xf8, /* U+00F6 "ö" */ - 0xc, 0x30, 0x0, 0x0, 0x0, 0x2, 0xe0, 0x28, - 0xe0, 0xc1, 0xc3, 0x3, 0xc, 0xc, 0x30, 0x70, - 0xa2, 0x80, 0xf8, 0x0, + 0xc, 0x30, 0x0, 0x0, 0x0, 0x2, 0xf8, 0x2c, + 0x34, 0xc0, 0x73, 0x0, 0xcc, 0x3, 0x30, 0x1c, + 0xb0, 0xd0, 0xbe, 0x0, /* U+00F7 "÷" */ 0xc, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, /* U+00F8 "ø" */ - 0x0, 0x50, 0x3f, 0x2, 0x8d, 0xc, 0x2c, 0x31, - 0x30, 0xc4, 0xc3, 0x87, 0xa, 0x34, 0xf, 0x80, - 0x50, 0x0, + 0x0, 0x50, 0xfc, 0x29, 0xd3, 0x1b, 0x32, 0x33, + 0x23, 0x39, 0x72, 0xcd, 0xf, 0x81, 0x40, /* U+00F9 "ù" */ - 0x1c, 0x0, 0x1c, 0x0, 0x0, 0xc, 0xc, 0x30, - 0x30, 0xc0, 0xc3, 0x3, 0xc, 0xc, 0x30, 0x30, - 0xd2, 0xc1, 0xfb, 0x0, + 0x1c, 0x0, 0x70, 0x0, 0x3, 0x3, 0x30, 0x33, + 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, 0x4b, 0x1f, + 0xb0, /* U+00FA "ú" */ - 0x1, 0xc0, 0xd, 0x0, 0x0, 0xc, 0xc, 0x30, - 0x30, 0xc0, 0xc3, 0x3, 0xc, 0xc, 0x30, 0x30, - 0xd2, 0xc1, 0xfb, 0x0, + 0x1, 0xc0, 0x34, 0x0, 0x3, 0x3, 0x30, 0x33, + 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, 0x4b, 0x1f, + 0xb0, /* U+00FB "û" */ - 0x7, 0x0, 0x22, 0x0, 0x0, 0xc, 0xc, 0x30, - 0x30, 0xc0, 0xc3, 0x3, 0xc, 0xc, 0x30, 0x30, - 0xd2, 0xc1, 0xfb, 0x0, + 0x7, 0x0, 0x88, 0x0, 0x3, 0x3, 0x30, 0x33, + 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, 0x4b, 0x1f, + 0xb0, /* U+00FC "ü" */ - 0x30, 0xc0, 0x0, 0x0, 0x0, 0xc, 0xc, 0x30, - 0x30, 0xc0, 0xc3, 0x3, 0xc, 0xc, 0x30, 0x30, - 0xd2, 0xc1, 0xfb, 0x0, + 0x30, 0xc0, 0x0, 0x0, 0x3, 0x3, 0x30, 0x33, + 0x3, 0x30, 0x33, 0x3, 0x30, 0x73, 0x4b, 0x1f, + 0x70, /* U+00FD "ý" */ - 0x1, 0xc0, 0x30, 0x0, 0x3, 0x7, 0x34, 0xa2, - 0x8d, 0x1c, 0xc0, 0xd8, 0xf, 0x40, 0xb0, 0x7, - 0x0, 0x60, 0xd, 0x3, 0x80, + 0x2, 0x80, 0x60, 0x0, 0xa, 0xd, 0x70, 0xc3, + 0x1c, 0x36, 0x82, 0xb4, 0xf, 0x0, 0xf0, 0xa, + 0x0, 0xd0, 0x1c, 0x7, 0x40, /* U+00FE "þ" */ - 0x30, 0x0, 0xc0, 0x3, 0x0, 0xe, 0xf0, 0x38, - 0xe0, 0xc1, 0xc3, 0x3, 0xc, 0x1c, 0x30, 0x70, - 0xd3, 0x83, 0xbc, 0xc, 0x0, 0x30, 0x0, 0xc0, - 0x0, + 0x30, 0x3, 0x0, 0x30, 0x3, 0xbc, 0x34, 0xe3, + 0x7, 0x30, 0x33, 0x3, 0x30, 0x73, 0x4e, 0x3b, + 0xc3, 0x0, 0x30, 0x3, 0x0, /* U+00FF "ÿ" */ - 0x30, 0xc0, 0x0, 0x0, 0x5, 0xc, 0x60, 0xc3, - 0x18, 0x32, 0x42, 0x70, 0x1f, 0x0, 0xe0, 0xd, - 0x0, 0xc0, 0x2c, 0x3, 0x40, + 0x30, 0xc0, 0x0, 0x0, 0xa, 0xc, 0x70, 0xc3, + 0x18, 0x36, 0x42, 0xb0, 0x1f, 0x0, 0xe0, 0xd, + 0x0, 0xc0, 0x1c, 0x7, 0x0, /* U+011E "Ğ" */ - 0x4, 0x10, 0xb, 0xd0, 0x0, 0x0, 0xb, 0xe0, - 0x2c, 0x38, 0x34, 0xc, 0x30, 0x4, 0x30, 0x0, - 0x30, 0x0, 0x30, 0xfc, 0x30, 0xc, 0x34, 0xc, - 0x2d, 0x1c, 0xb, 0xf0, + 0x4, 0x10, 0x2f, 0x40, 0x0, 0x2, 0xf8, 0x2c, + 0x28, 0xd0, 0x33, 0x0, 0x4c, 0x0, 0x30, 0x0, + 0xc3, 0xf3, 0x0, 0xcd, 0x3, 0x1d, 0x1c, 0x2f, + 0xc0, /* U+011F "ğ" */ - 0x28, 0xd0, 0x3f, 0x0, 0x0, 0x3, 0xec, 0x38, - 0xb0, 0xc0, 0xc3, 0x3, 0xc, 0xc, 0x30, 0x30, - 0xe2, 0xc0, 0xfb, 0x0, 0x1c, 0x14, 0xa0, 0x7e, - 0x0, + 0x28, 0xd0, 0xfc, 0x0, 0x0, 0xfb, 0x38, 0xb3, + 0x3, 0x30, 0x33, 0x3, 0x30, 0x33, 0x8b, 0xf, + 0xb0, 0x3, 0x14, 0xa1, 0xfc, /* U+0130 "İ" */ 0x30, 0x3, 0xc, 0x30, 0xc3, 0xc, 0x30, 0xc3, @@ -838,58 +830,53 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x30, 0xc3, 0xc, 0x30, 0xc3, 0xc, /* U+0152 "Œ" */ - 0xb, 0xff, 0xf0, 0xb0, 0xc0, 0x3, 0x43, 0x0, + 0xb, 0xff, 0xf0, 0xb1, 0xc0, 0x3, 0x43, 0x0, 0xc, 0xc, 0x0, 0x30, 0x30, 0x0, 0xc0, 0xff, 0x43, 0x3, 0x0, 0xc, 0xc, 0x0, 0x34, 0x30, - 0x0, 0xb0, 0xc0, 0x0, 0xbf, 0xff, 0x0, + 0x0, 0xb1, 0xc0, 0x0, 0xbf, 0xff, 0x0, /* U+0153 "œ" */ - 0xf, 0x8b, 0x80, 0xa3, 0xe2, 0x83, 0x7, 0x7, - 0xc, 0xf, 0xfc, 0x30, 0x30, 0x0, 0xc1, 0xc0, - 0x2, 0x8f, 0x85, 0x3, 0xe2, 0xf4, + 0xf, 0x8b, 0xc2, 0x8f, 0x8a, 0x30, 0x70, 0x33, + 0x7, 0xff, 0x30, 0x70, 0x3, 0x7, 0x0, 0x28, + 0xf8, 0x50, 0xf8, 0xbd, /* U+015E "Ş" */ - 0xb, 0xe0, 0x38, 0x38, 0x30, 0x1c, 0x30, 0x0, - 0x2d, 0x0, 0xb, 0xe0, 0x0, 0x78, 0x0, 0x1c, - 0x30, 0x1c, 0x28, 0x28, 0xb, 0xe0, 0x3, 0x40, - 0x1, 0xc0, 0x3, 0x40, + 0xb, 0xe0, 0xe0, 0xe3, 0x1, 0xcc, 0x0, 0x2d, + 0x0, 0x2f, 0x80, 0x7, 0x80, 0x7, 0xb0, 0xc, + 0xe0, 0xa0, 0xfe, 0x0, 0xb0, 0x0, 0xd0, 0xa, + 0x0, /* U+015F "ş" */ - 0x1f, 0xc0, 0xd2, 0xc3, 0x1, 0xb, 0x80, 0x2, - 0xd0, 0x41, 0xc3, 0x4b, 0x3, 0xf0, 0x3, 0x40, - 0x7, 0x0, 0x34, 0x0, + 0x2f, 0xa, 0x2c, 0xa0, 0x43, 0x80, 0xb, 0x44, + 0x1c, 0x61, 0xc2, 0xf4, 0xa, 0x0, 0x30, 0xa, + 0x0, /* U+0160 "Š" */ - 0x4, 0x10, 0x6, 0xc0, 0x1, 0x0, 0xb, 0xe0, - 0x38, 0x38, 0x30, 0x1c, 0x30, 0x0, 0x2d, 0x0, - 0xb, 0xe0, 0x0, 0x78, 0x0, 0x1c, 0x30, 0x1c, - 0x28, 0x28, 0xb, 0xe0, + 0xc, 0xa0, 0xf, 0x0, 0x0, 0x2, 0xf8, 0x38, + 0x38, 0xc0, 0x73, 0x0, 0xb, 0x40, 0xb, 0xe0, + 0x1, 0xe0, 0x1, 0xec, 0x3, 0x38, 0x28, 0x3f, + 0x80, /* U+0161 "š" */ - 0xc, 0xd0, 0x1d, 0x0, 0x0, 0x7, 0xf0, 0x34, - 0xb0, 0xc0, 0x2, 0xe0, 0x0, 0xb4, 0x20, 0x70, - 0xd2, 0xc0, 0xfc, 0x0, + 0x27, 0x40, 0xd0, 0x0, 0x2, 0xf4, 0xa2, 0xca, + 0x0, 0x38, 0x0, 0xb4, 0x41, 0xc6, 0x1c, 0x2f, + 0x40, /* U+017D "Ž" */ - 0x10, 0x40, 0xf0, 0x1, 0xf, 0xff, 0x0, 0xa0, - 0xc, 0x2, 0x80, 0x30, 0xa, 0x0, 0xc0, 0x28, - 0x3, 0x0, 0xa0, 0xf, 0xff, + 0x11, 0x2, 0xa0, 0x4, 0xf, 0xff, 0x0, 0xe0, + 0x1c, 0x3, 0x80, 0x70, 0xd, 0x1, 0xc0, 0x34, + 0x6, 0x0, 0xd0, 0xf, 0xff, /* U+017E "ž" */ - 0x33, 0x3, 0x40, 0x3, 0xff, 0x3, 0x81, 0xc0, - 0xd0, 0xb0, 0x34, 0x28, 0xf, 0xfc, - - /* U+1E9E "ẞ" */ - 0xf, 0x80, 0x38, 0xb0, 0x30, 0x70, 0x30, 0xd0, - 0x32, 0x80, 0x32, 0xe0, 0x30, 0x38, 0x30, 0x1c, - 0x30, 0x1c, 0x30, 0x28, 0x33, 0xe0, + 0x26, 0x3, 0x0, 0x3, 0xff, 0x3, 0x82, 0xc0, + 0xe0, 0xb0, 0x38, 0x2c, 0xf, 0xfc, /* U+2022 "•" */ 0xb7, 0xfb, 0x40, /* U+20AC "€" */ - 0x2, 0xf0, 0x2c, 0x0, 0xc0, 0x3, 0x0, 0x3f, - 0xc0, 0x70, 0x3, 0xfc, 0x7, 0x0, 0xc, 0x0, + 0x2, 0xf0, 0x2c, 0x0, 0xd0, 0x3, 0x0, 0x3f, + 0xc0, 0x70, 0x3, 0xfc, 0x7, 0x0, 0xd, 0x0, 0x2c, 0x0, 0x2f, 0x0, /* U+E004 "" */ @@ -2135,367 +2122,366 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, {.bitmap_index = 0, .adv_w = 51, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 0, .adv_w = 55, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9, .adv_w = 72, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 13, .adv_w = 123, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 30, .adv_w = 111, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 55, .adv_w = 142, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 80, .adv_w = 122, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 102, .adv_w = 39, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 105, .adv_w = 70, .box_w = 4, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 121, .adv_w = 71, .box_w = 5, .box_h = 16, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 141, .adv_w = 96, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 154, .adv_w = 111, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 166, .adv_w = 44, .box_w = 3, .box_h = 4, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 169, .adv_w = 56, .box_w = 3, .box_h = 2, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 171, .adv_w = 59, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 173, .adv_w = 83, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 188, .adv_w = 111, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 208, .adv_w = 111, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 222, .adv_w = 111, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 242, .adv_w = 111, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 262, .adv_w = 111, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9, .adv_w = 72, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 12, .adv_w = 123, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29, .adv_w = 111, .box_w = 6, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52, .adv_w = 142, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 74, .adv_w = 122, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 96, .adv_w = 39, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 99, .adv_w = 70, .box_w = 4, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 115, .adv_w = 71, .box_w = 5, .box_h = 16, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 135, .adv_w = 96, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 148, .adv_w = 111, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 164, .adv_w = 44, .box_w = 3, .box_h = 4, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 167, .adv_w = 56, .box_w = 3, .box_h = 2, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 169, .adv_w = 59, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 171, .adv_w = 83, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 186, .adv_w = 111, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 203, .adv_w = 111, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 217, .adv_w = 111, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 237, .adv_w = 111, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 257, .adv_w = 111, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 279, .adv_w = 111, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 299, .adv_w = 111, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 319, .adv_w = 111, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 336, .adv_w = 111, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 356, .adv_w = 111, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 376, .adv_w = 52, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 382, .adv_w = 45, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 390, .adv_w = 100, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 399, .adv_w = 107, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 406, .adv_w = 103, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 415, .adv_w = 95, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 435, .adv_w = 172, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 474, .adv_w = 129, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 496, .adv_w = 122, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 516, .adv_w = 127, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 538, .adv_w = 128, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 560, .adv_w = 111, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 580, .adv_w = 108, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 597, .adv_w = 132, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 619, .adv_w = 139, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 641, .adv_w = 56, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 650, .adv_w = 108, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 670, .adv_w = 122, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 692, .adv_w = 107, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 709, .adv_w = 169, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 737, .adv_w = 139, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 759, .adv_w = 135, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 781, .adv_w = 124, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 803, .adv_w = 135, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 829, .adv_w = 119, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 851, .adv_w = 116, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 873, .adv_w = 117, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 890, .adv_w = 126, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 912, .adv_w = 126, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 934, .adv_w = 171, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 965, .adv_w = 123, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 987, .adv_w = 118, .box_w = 8, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1009, .adv_w = 117, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1026, .adv_w = 56, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1041, .adv_w = 83, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1056, .adv_w = 56, .box_w = 4, .box_h = 15, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 1071, .adv_w = 83, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 1079, .adv_w = 91, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1082, .adv_w = 69, .box_w = 4, .box_h = 2, .ofs_x = 0, .ofs_y = 9}, - {.bitmap_index = 1084, .adv_w = 107, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1098, .adv_w = 110, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1118, .adv_w = 103, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1132, .adv_w = 111, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1152, .adv_w = 105, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1166, .adv_w = 71, .box_w = 4, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1177, .adv_w = 110, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1197, .adv_w = 108, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1217, .adv_w = 51, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1226, .adv_w = 50, .box_w = 4, .box_h = 14, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 1240, .adv_w = 101, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1260, .adv_w = 51, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1269, .adv_w = 169, .box_w = 11, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1291, .adv_w = 109, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1305, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1319, .adv_w = 110, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1339, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1359, .adv_w = 68, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1368, .adv_w = 102, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1382, .adv_w = 66, .box_w = 3, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1390, .adv_w = 108, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1404, .adv_w = 96, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1416, .adv_w = 146, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1434, .adv_w = 98, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1446, .adv_w = 93, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1463, .adv_w = 98, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1473, .adv_w = 69, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1492, .adv_w = 55, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1502, .adv_w = 69, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1521, .adv_w = 132, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 1529, .adv_w = 51, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1529, .adv_w = 52, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1537, .adv_w = 115, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1557, .adv_w = 84, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 1564, .adv_w = 105, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1576, .adv_w = 74, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 1583, .adv_w = 74, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 1588, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1608, .adv_w = 95, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1628, .adv_w = 129, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1656, .adv_w = 129, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1684, .adv_w = 129, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1712, .adv_w = 129, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1740, .adv_w = 129, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1766, .adv_w = 129, .box_w = 9, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1798, .adv_w = 182, .box_w = 13, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1834, .adv_w = 127, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1862, .adv_w = 111, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1887, .adv_w = 111, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1912, .adv_w = 111, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1937, .adv_w = 111, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1960, .adv_w = 56, .box_w = 4, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1974, .adv_w = 56, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1988, .adv_w = 56, .box_w = 5, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2006, .adv_w = 56, .box_w = 6, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2026, .adv_w = 131, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2048, .adv_w = 139, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2076, .adv_w = 135, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2104, .adv_w = 135, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2132, .adv_w = 135, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2160, .adv_w = 135, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2188, .adv_w = 135, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2214, .adv_w = 105, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 2226, .adv_w = 135, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2253, .adv_w = 126, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2281, .adv_w = 126, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2309, .adv_w = 126, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2337, .adv_w = 126, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2363, .adv_w = 118, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2391, .adv_w = 115, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2411, .adv_w = 117, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2433, .adv_w = 107, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2453, .adv_w = 107, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2473, .adv_w = 107, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2493, .adv_w = 107, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2514, .adv_w = 107, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2534, .adv_w = 107, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2555, .adv_w = 163, .box_w = 11, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2577, .adv_w = 103, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2597, .adv_w = 105, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2617, .adv_w = 105, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2637, .adv_w = 105, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2657, .adv_w = 105, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2677, .adv_w = 53, .box_w = 4, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2688, .adv_w = 53, .box_w = 4, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2699, .adv_w = 53, .box_w = 5, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2713, .adv_w = 53, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2730, .adv_w = 115, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2751, .adv_w = 109, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2772, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2792, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2812, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2832, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2853, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2873, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 2885, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2903, .adv_w = 108, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2923, .adv_w = 108, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2943, .adv_w = 108, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2963, .adv_w = 108, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2983, .adv_w = 93, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3004, .adv_w = 114, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3029, .adv_w = 93, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3050, .adv_w = 132, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3078, .adv_w = 110, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3103, .adv_w = 56, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3113, .adv_w = 53, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3119, .adv_w = 185, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3150, .adv_w = 174, .box_w = 11, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3172, .adv_w = 116, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3200, .adv_w = 102, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3220, .adv_w = 116, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3248, .adv_w = 102, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3268, .adv_w = 117, .box_w = 6, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3289, .adv_w = 98, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3303, .adv_w = 126, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3325, .adv_w = 76, .box_w = 3, .box_h = 3, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 3328, .adv_w = 111, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3348, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3373, .adv_w = 224, .box_w = 12, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 3400, .adv_w = 224, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 3442, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3484, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3512, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3540, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3568, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3596, .adv_w = 224, .box_w = 8, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 3622, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 3661, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3697, .adv_w = 224, .box_w = 8, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 3721, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3760, .adv_w = 224, .box_w = 12, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3787, .adv_w = 224, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 3822, .adv_w = 224, .box_w = 11, .box_h = 8, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 3844, .adv_w = 224, .box_w = 8, .box_h = 6, .ofs_x = 3, .ofs_y = 2}, - {.bitmap_index = 3856, .adv_w = 224, .box_w = 5, .box_h = 8, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 3866, .adv_w = 224, .box_w = 5, .box_h = 8, .ofs_x = 5, .ofs_y = 1}, - {.bitmap_index = 3876, .adv_w = 224, .box_w = 8, .box_h = 5, .ofs_x = 3, .ofs_y = 3}, - {.bitmap_index = 3886, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3925, .adv_w = 224, .box_w = 10, .box_h = 9, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 3948, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3981, .adv_w = 224, .box_w = 4, .box_h = 10, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 3991, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 4026, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4065, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 4095, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 4128, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4167, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4200, .adv_w = 224, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4232, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4268, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4303, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4339, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 4372, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 4405, .adv_w = 224, .box_w = 10, .box_h = 2, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 4410, .adv_w = 224, .box_w = 8, .box_h = 9, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 4428, .adv_w = 224, .box_w = 8, .box_h = 9, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 4446, .adv_w = 224, .box_w = 10, .box_h = 9, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 4469, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4497, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4533, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4569, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4605, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4641, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4677, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4702, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4727, .adv_w = 224, .box_w = 8, .box_h = 7, .ofs_x = 3, .ofs_y = 2}, - {.bitmap_index = 4741, .adv_w = 224, .box_w = 8, .box_h = 7, .ofs_x = 3, .ofs_y = 2}, - {.bitmap_index = 4755, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4790, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 4823, .adv_w = 224, .box_w = 7, .box_h = 7, .ofs_x = 3, .ofs_y = 2}, - {.bitmap_index = 4836, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4875, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4917, .adv_w = 224, .box_w = 7, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 299, .adv_w = 111, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 316, .adv_w = 111, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 333, .adv_w = 111, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 350, .adv_w = 111, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 367, .adv_w = 52, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 373, .adv_w = 45, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 381, .adv_w = 100, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 390, .adv_w = 107, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 397, .adv_w = 103, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 406, .adv_w = 95, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 420, .adv_w = 172, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 455, .adv_w = 129, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 480, .adv_w = 122, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 497, .adv_w = 127, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 517, .adv_w = 128, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 537, .adv_w = 111, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 557, .adv_w = 108, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 574, .adv_w = 132, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 594, .adv_w = 139, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 614, .adv_w = 56, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 623, .adv_w = 108, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 640, .adv_w = 122, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 662, .adv_w = 107, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 679, .adv_w = 169, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 704, .adv_w = 139, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 724, .adv_w = 135, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 744, .adv_w = 124, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 764, .adv_w = 135, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 790, .adv_w = 119, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 812, .adv_w = 116, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 832, .adv_w = 117, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 852, .adv_w = 126, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 872, .adv_w = 126, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 894, .adv_w = 171, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 925, .adv_w = 123, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 947, .adv_w = 118, .box_w = 8, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 969, .adv_w = 117, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 986, .adv_w = 56, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1001, .adv_w = 83, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1016, .adv_w = 56, .box_w = 4, .box_h = 15, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1031, .adv_w = 83, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 1039, .adv_w = 91, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1042, .adv_w = 69, .box_w = 4, .box_h = 2, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 1044, .adv_w = 107, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1058, .adv_w = 110, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1075, .adv_w = 103, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1089, .adv_w = 111, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1106, .adv_w = 105, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1118, .adv_w = 71, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1132, .adv_w = 110, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1149, .adv_w = 108, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1166, .adv_w = 51, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1175, .adv_w = 50, .box_w = 4, .box_h = 14, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1189, .adv_w = 101, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1209, .adv_w = 51, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1218, .adv_w = 169, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1238, .adv_w = 109, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1250, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1264, .adv_w = 110, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1281, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1298, .adv_w = 68, .box_w = 4, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1306, .adv_w = 102, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1318, .adv_w = 66, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1331, .adv_w = 108, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1343, .adv_w = 96, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1355, .adv_w = 146, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1375, .adv_w = 98, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1387, .adv_w = 93, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1404, .adv_w = 98, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1414, .adv_w = 69, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1433, .adv_w = 55, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1443, .adv_w = 69, .box_w = 5, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1463, .adv_w = 132, .box_w = 7, .box_h = 4, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1470, .adv_w = 51, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1470, .adv_w = 52, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1478, .adv_w = 115, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1498, .adv_w = 84, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 1503, .adv_w = 105, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1519, .adv_w = 74, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 1526, .adv_w = 74, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 1531, .adv_w = 112, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1548, .adv_w = 95, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1565, .adv_w = 129, .box_w = 9, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1597, .adv_w = 129, .box_w = 9, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1629, .adv_w = 129, .box_w = 9, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1661, .adv_w = 129, .box_w = 9, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1693, .adv_w = 129, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1719, .adv_w = 129, .box_w = 9, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1751, .adv_w = 182, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1784, .adv_w = 127, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1809, .adv_w = 111, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1834, .adv_w = 111, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1859, .adv_w = 111, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1884, .adv_w = 111, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1907, .adv_w = 56, .box_w = 4, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1921, .adv_w = 56, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1935, .adv_w = 56, .box_w = 5, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1953, .adv_w = 56, .box_w = 5, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1970, .adv_w = 131, .box_w = 8, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1992, .adv_w = 139, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2017, .adv_w = 135, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2042, .adv_w = 135, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2067, .adv_w = 135, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2092, .adv_w = 135, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2117, .adv_w = 135, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2140, .adv_w = 105, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 2152, .adv_w = 135, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2179, .adv_w = 126, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2204, .adv_w = 126, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2229, .adv_w = 126, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2254, .adv_w = 126, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2277, .adv_w = 118, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2305, .adv_w = 115, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2322, .adv_w = 117, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2342, .adv_w = 107, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2362, .adv_w = 107, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2382, .adv_w = 107, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2402, .adv_w = 107, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2423, .adv_w = 107, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2443, .adv_w = 107, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2464, .adv_w = 163, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2484, .adv_w = 103, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2504, .adv_w = 105, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2521, .adv_w = 105, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2538, .adv_w = 105, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2555, .adv_w = 105, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2572, .adv_w = 53, .box_w = 4, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2583, .adv_w = 53, .box_w = 4, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2594, .adv_w = 53, .box_w = 5, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2608, .adv_w = 53, .box_w = 5, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2622, .adv_w = 115, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2640, .adv_w = 109, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2658, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2678, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2698, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2718, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2739, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2759, .adv_w = 112, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 2771, .adv_w = 112, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2786, .adv_w = 108, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2803, .adv_w = 108, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2820, .adv_w = 108, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2837, .adv_w = 108, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2854, .adv_w = 93, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2875, .adv_w = 114, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2896, .adv_w = 93, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2917, .adv_w = 132, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2942, .adv_w = 110, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2963, .adv_w = 56, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2973, .adv_w = 53, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2979, .adv_w = 185, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3010, .adv_w = 174, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3030, .adv_w = 116, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3055, .adv_w = 102, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3072, .adv_w = 116, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3097, .adv_w = 102, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3114, .adv_w = 117, .box_w = 6, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3135, .adv_w = 98, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3149, .adv_w = 76, .box_w = 3, .box_h = 3, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 3152, .adv_w = 111, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3172, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3197, .adv_w = 224, .box_w = 12, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 3224, .adv_w = 224, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3266, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3308, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3336, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3364, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3392, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3420, .adv_w = 224, .box_w = 8, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 3446, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 3485, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3521, .adv_w = 224, .box_w = 8, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3545, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3584, .adv_w = 224, .box_w = 12, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3611, .adv_w = 224, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 3646, .adv_w = 224, .box_w = 11, .box_h = 8, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 3668, .adv_w = 224, .box_w = 8, .box_h = 6, .ofs_x = 3, .ofs_y = 2}, + {.bitmap_index = 3680, .adv_w = 224, .box_w = 5, .box_h = 8, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 3690, .adv_w = 224, .box_w = 5, .box_h = 8, .ofs_x = 5, .ofs_y = 1}, + {.bitmap_index = 3700, .adv_w = 224, .box_w = 8, .box_h = 5, .ofs_x = 3, .ofs_y = 3}, + {.bitmap_index = 3710, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3749, .adv_w = 224, .box_w = 10, .box_h = 9, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 3772, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3805, .adv_w = 224, .box_w = 4, .box_h = 10, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 3815, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3850, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3889, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3919, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3952, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3991, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4024, .adv_w = 224, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4056, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4092, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4127, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4163, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4196, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4229, .adv_w = 224, .box_w = 10, .box_h = 2, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 4234, .adv_w = 224, .box_w = 8, .box_h = 9, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 4252, .adv_w = 224, .box_w = 8, .box_h = 9, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 4270, .adv_w = 224, .box_w = 10, .box_h = 9, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 4293, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4321, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4357, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4393, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4429, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4465, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4501, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4526, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4551, .adv_w = 224, .box_w = 8, .box_h = 7, .ofs_x = 3, .ofs_y = 2}, + {.bitmap_index = 4565, .adv_w = 224, .box_w = 8, .box_h = 7, .ofs_x = 3, .ofs_y = 2}, + {.bitmap_index = 4579, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4614, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4647, .adv_w = 224, .box_w = 7, .box_h = 7, .ofs_x = 3, .ofs_y = 2}, + {.bitmap_index = 4660, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4699, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4741, .adv_w = 224, .box_w = 7, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 4764, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4803, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 4842, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4875, .adv_w = 224, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4898, .adv_w = 224, .box_w = 7, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4918, .adv_w = 224, .box_w = 8, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, {.bitmap_index = 4940, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4979, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 5018, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5051, .adv_w = 224, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5074, .adv_w = 224, .box_w = 7, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5094, .adv_w = 224, .box_w = 8, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5116, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5155, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5198, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5237, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5280, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5322, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5350, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 5383, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5419, .adv_w = 224, .box_w = 9, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5442, .adv_w = 224, .box_w = 13, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5475, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 5514, .adv_w = 224, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5550, .adv_w = 224, .box_w = 7, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5570, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5603, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5634, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5665, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5711, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5750, .adv_w = 224, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 5785, .adv_w = 224, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5821, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 5854, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5887, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5917, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5945, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5978, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6011, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6044, .adv_w = 224, .box_w = 7, .box_h = 13, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 6067, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6100, .adv_w = 224, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6125, .adv_w = 224, .box_w = 9, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 6152, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6191, .adv_w = 224, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6227, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6266, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6299, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6335, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6363, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6396, .adv_w = 224, .box_w = 12, .box_h = 7, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6417, .adv_w = 224, .box_w = 12, .box_h = 9, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 6444, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6490, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6533, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 6590, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6629, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6675, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6714, .adv_w = 154, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6739, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6788, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6841, .adv_w = 252, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6893, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6946, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6990, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7026, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 7082, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7102, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7133, .adv_w = 252, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7189, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7228, .adv_w = 154, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7266, .adv_w = 196, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 7298, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7347, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7390, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7433, .adv_w = 196, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 7465, .adv_w = 196, .box_w = 14, .box_h = 12, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 7507, .adv_w = 140, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7534, .adv_w = 140, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7561, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7604, .adv_w = 196, .box_w = 13, .box_h = 3, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 7614, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7658, .adv_w = 280, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7721, .adv_w = 252, .box_w = 17, .box_h = 14, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 7781, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7827, .adv_w = 196, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 7851, .adv_w = 196, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 7875, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7925, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7964, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8017, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 8074, .adv_w = 224, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8110, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8153, .adv_w = 196, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8195, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8238, .adv_w = 196, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8274, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8313, .adv_w = 140, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 8348, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8397, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8446, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8490, .adv_w = 224, .box_w = 16, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 8550, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8586, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8628, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8671, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8704, .adv_w = 280, .box_w = 18, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8763, .adv_w = 224, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 8795, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8823, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8853, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8881, .adv_w = 280, .box_w = 18, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 8922, .adv_w = 280, .box_w = 18, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 8963, .adv_w = 280, .box_w = 18, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 9004, .adv_w = 280, .box_w = 18, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 9045, .adv_w = 280, .box_w = 18, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 9086, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9136, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 9175, .adv_w = 224, .box_w = 8, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 9201, .adv_w = 224, .box_w = 8, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 9227, .adv_w = 224, .box_w = 8, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 9253, .adv_w = 224, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 9285, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9315, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9345, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9394, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 9451, .adv_w = 224, .box_w = 8, .box_h = 14, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 9479, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9529, .adv_w = 168, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9568, .adv_w = 225, .box_w = 15, .box_h = 10, .ofs_x = 0, .ofs_y = 0} + {.bitmap_index = 4979, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5022, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5061, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5104, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5146, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5174, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5207, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5243, .adv_w = 224, .box_w = 9, .box_h = 10, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5266, .adv_w = 224, .box_w = 13, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5299, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 5338, .adv_w = 224, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5374, .adv_w = 224, .box_w = 7, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5394, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5427, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5458, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5489, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5535, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5574, .adv_w = 224, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 5609, .adv_w = 224, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5645, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5678, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5711, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5741, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5769, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5802, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5835, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5868, .adv_w = 224, .box_w = 7, .box_h = 13, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 5891, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5924, .adv_w = 224, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5949, .adv_w = 224, .box_w = 9, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 5976, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6015, .adv_w = 224, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6051, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6090, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6123, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6159, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6187, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6220, .adv_w = 224, .box_w = 12, .box_h = 7, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6241, .adv_w = 224, .box_w = 12, .box_h = 9, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 6268, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6314, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6357, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6414, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6453, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6499, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6538, .adv_w = 154, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6563, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6612, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6665, .adv_w = 252, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6717, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6770, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6814, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6850, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 6906, .adv_w = 112, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6926, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6957, .adv_w = 252, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7013, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7052, .adv_w = 154, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7090, .adv_w = 196, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 7122, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7171, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7214, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7257, .adv_w = 196, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 7289, .adv_w = 196, .box_w = 14, .box_h = 12, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 7331, .adv_w = 140, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7358, .adv_w = 140, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7385, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7428, .adv_w = 196, .box_w = 13, .box_h = 3, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 7438, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7482, .adv_w = 280, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7545, .adv_w = 252, .box_w = 17, .box_h = 14, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 7605, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7651, .adv_w = 196, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 7675, .adv_w = 196, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 7699, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7749, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7788, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7841, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 7898, .adv_w = 224, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7934, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7977, .adv_w = 196, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8019, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8062, .adv_w = 196, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8098, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8137, .adv_w = 140, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8172, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8221, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8270, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8314, .adv_w = 224, .box_w = 16, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8374, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8410, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8452, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8495, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8528, .adv_w = 280, .box_w = 18, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8587, .adv_w = 224, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 8619, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8647, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8677, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8705, .adv_w = 280, .box_w = 18, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 8746, .adv_w = 280, .box_w = 18, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 8787, .adv_w = 280, .box_w = 18, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 8828, .adv_w = 280, .box_w = 18, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 8869, .adv_w = 280, .box_w = 18, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 8910, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8960, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 8999, .adv_w = 224, .box_w = 8, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 9025, .adv_w = 224, .box_w = 8, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 9051, .adv_w = 224, .box_w = 8, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 9077, .adv_w = 224, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9109, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9139, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9169, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9218, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 9275, .adv_w = 224, .box_w = 8, .box_h = 14, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 9303, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9353, .adv_w = 168, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9392, .adv_w = 225, .box_w = 15, .box_h = 10, .ofs_x = 0, .ofs_y = 0} }; /*--------------------- @@ -2508,30 +2494,30 @@ static const uint16_t unicode_list_1[] = { static const uint16_t unicode_list_3[] = { 0x0, 0x1, 0x12, 0x13, 0x34, 0x35, 0x40, 0x41, - 0x42, 0x43, 0x5f, 0x60, 0x1d80, 0x1f04, 0x1f8e, 0xdee6, - 0xdef3, 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, - 0xdf7c, 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, - 0xe023, 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, - 0xe0f2, 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, - 0xe20c, 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, - 0xe31a, 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, - 0xe390, 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, - 0xe447, 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, - 0xe48a, 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, - 0xe583, 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, - 0xe5f9, 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, - 0xe7bf, 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, - 0xe952, 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, - 0xeeea, 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, - 0xeefe, 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, - 0xef2a, 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, - 0xef49, 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, - 0xef5b, 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, - 0xefab, 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, - 0xf03d, 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, - 0xf122, 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, - 0xf184, 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, - 0xf43c, 0xf6a4, 0xf784 + 0x42, 0x43, 0x5f, 0x60, 0x1f04, 0x1f8e, 0xdee6, 0xdef3, + 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, 0xdf7c, + 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, 0xe023, + 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, 0xe0f2, + 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, 0xe20c, + 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, 0xe31a, + 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, 0xe390, + 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, 0xe447, + 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, 0xe48a, + 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, 0xe583, + 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, 0xe5f9, + 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, 0xe7bf, + 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, 0xe952, + 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, 0xeeea, + 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, 0xeefe, + 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, 0xef2a, + 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, 0xef49, + 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, 0xef5b, + 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, 0xefab, + 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, 0xf03d, + 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, 0xf122, + 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, 0xf184, + 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, 0xf43c, + 0xf6a4, 0xf784 }; /*Collect the unicode lists and glyph_id offsets*/ @@ -2551,7 +2537,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = }, { .range_start = 286, .range_length = 63365, .glyph_id_start = 169, - .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 195, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 194, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_16_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_16_latin1.c index cefcf661d..de467cfac 100644 --- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_16_latin1.c +++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_16_latin1.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 16 px * Bpp: 2 - * Opts: --no-kerning --bpp 2 --size 16 --no-compress --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_16_latin1.c --format lvgl + * Opts: --no-kerning --bpp 2 --size 16 --no-compress --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_16_latin1.c --format lvgl ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -32,27 +32,27 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x77, 0x1d, 0xc7, 0x71, 0xdc, /* U+0023 "#" */ - 0x6, 0x28, 0x24, 0x90, 0xd3, 0x3f, 0xff, 0x1c, - 0x70, 0x71, 0x82, 0x8a, 0x3f, 0xff, 0x34, 0xd0, + 0x6, 0x28, 0x28, 0x90, 0xd3, 0x7f, 0xff, 0x1c, + 0x70, 0x71, 0xc2, 0x8a, 0x3f, 0xff, 0x34, 0xd0, 0xc3, 0x3, 0x1c, 0x1c, 0x60, /* U+0024 "$" */ - 0x7, 0x0, 0x7, 0x0, 0x2f, 0xe0, 0x38, 0x38, - 0x70, 0x1c, 0x34, 0x4, 0x3d, 0x0, 0xb, 0xd0, - 0x0, 0xb8, 0x0, 0x2c, 0x30, 0x1c, 0x38, 0x2c, - 0x2f, 0xf0, 0x7, 0x40, 0x7, 0x0, + 0x1, 0xc0, 0x1, 0xc0, 0xb, 0xe0, 0x3f, 0xf8, + 0x34, 0x3c, 0x70, 0x1c, 0x34, 0x0, 0x1e, 0x0, + 0x2, 0xe0, 0x0, 0x38, 0x20, 0x1c, 0x34, 0x1c, + 0x3d, 0x78, 0xb, 0xe0, 0x1, 0xc0, 0x0, 0x80, /* U+0025 "%" */ - 0x1f, 0x40, 0x3, 0xac, 0x0, 0x71, 0xcc, 0x3, - 0x6d, 0x80, 0x2f, 0x70, 0x0, 0x6, 0x0, 0x0, + 0x1f, 0x40, 0x3, 0x6c, 0x0, 0x71, 0xcc, 0x3, + 0x5d, 0x80, 0x2f, 0x70, 0x0, 0x6, 0x0, 0x0, 0xdf, 0x40, 0xa, 0xac, 0x2, 0x31, 0xc0, 0x23, 0x1c, 0x0, 0x2a, 0xc0, 0x0, 0xf4, /* U+0026 "&" */ - 0x7, 0xd0, 0x3, 0xac, 0x1, 0xc7, 0x0, 0x36, - 0xc0, 0xb, 0xc0, 0x2, 0xd0, 0x2, 0xdc, 0x70, - 0xd3, 0xac, 0x70, 0x7e, 0xd, 0xf, 0x43, 0xdb, - 0xe0, 0x2f, 0x5d, + 0x7, 0xd0, 0x3, 0xac, 0x1, 0xc7, 0x0, 0x32, + 0xc0, 0xf, 0xd0, 0x2, 0xe0, 0x1, 0xec, 0x0, + 0xd3, 0x9c, 0x70, 0x7f, 0xd, 0xb, 0x83, 0xd7, + 0xe0, 0x2f, 0xad, /* U+0027 "'" */ 0x71, 0xc7, 0x1c, @@ -64,16 +64,17 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0029 ")" */ 0x0, 0x18, 0x3, 0x40, 0x70, 0xd, 0x2, 0x80, - 0xb0, 0x1c, 0x7, 0x1, 0xc0, 0x70, 0x1c, 0xa, + 0x70, 0x1c, 0x7, 0x1, 0xc0, 0x70, 0x1c, 0xb, 0x3, 0x40, 0xc0, 0xa0, 0x30, 0x10, 0x0, /* U+002A "*" */ - 0x7, 0x0, 0x1c, 0xe, 0xb6, 0x9b, 0xf8, 0xf, + 0x7, 0x0, 0x1c, 0xa, 0xb6, 0x9b, 0xf8, 0xf, 0x80, 0xa3, 0x42, 0x5, 0x0, /* U+002B "+" */ - 0x7, 0x0, 0x1c, 0x0, 0x70, 0x1, 0xc0, 0xff, - 0xfc, 0x1d, 0x0, 0x70, 0x1, 0xc0, 0x7, 0x0, + 0x2, 0x0, 0x1c, 0x0, 0x70, 0x1, 0xc0, 0xff, + 0xf9, 0x5d, 0x40, 0x70, 0x1, 0xc0, 0x7, 0x0, + 0x4, 0x0, /* U+002C "," */ 0x1c, 0x1c, 0x2c, 0x34, 0x0, @@ -100,49 +101,49 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0032 "2" */ 0xb, 0xe0, 0x2d, 0x78, 0x34, 0x1c, 0x20, 0x1c, - 0x0, 0x2c, 0x0, 0x34, 0x0, 0xf0, 0x2, 0xc0, + 0x0, 0x2c, 0x0, 0x34, 0x0, 0xb0, 0x2, 0xc0, 0x7, 0x40, 0xe, 0x0, 0x3d, 0x0, 0x7f, 0xfc, /* U+0033 "3" */ 0xb, 0xe0, 0x3d, 0x78, 0x30, 0x1c, 0x0, 0x1c, - 0x0, 0x38, 0x7, 0xf0, 0x0, 0x78, 0x0, 0x1c, + 0x0, 0x78, 0x7, 0xf0, 0x0, 0x78, 0x0, 0x1c, 0x10, 0x1c, 0x34, 0x1c, 0x3d, 0x78, 0xb, 0xe0, /* U+0034 "4" */ - 0x0, 0xb0, 0x3, 0xc0, 0x3f, 0x1, 0xdc, 0xe, - 0x70, 0x71, 0xc3, 0x47, 0x2c, 0x1c, 0xff, 0xfc, - 0x1, 0xd0, 0x7, 0x0, 0x1c, + 0x0, 0xb0, 0x0, 0xf0, 0x2, 0xf0, 0x3, 0x70, + 0xe, 0x70, 0x1c, 0x70, 0x38, 0x70, 0x70, 0x70, + 0xff, 0xfd, 0x0, 0x74, 0x0, 0x70, 0x0, 0x70, /* U+0035 "5" */ - 0xf, 0xfc, 0x1c, 0x0, 0x1c, 0x0, 0x1c, 0x0, - 0x2f, 0xe0, 0x1d, 0x78, 0x0, 0x2c, 0x0, 0x1c, - 0x10, 0x1c, 0x34, 0x2c, 0x1d, 0x74, 0xb, 0xe0, + 0x3f, 0xf1, 0xc0, 0x7, 0x0, 0x1c, 0x0, 0xbf, + 0x81, 0xd7, 0x80, 0xb, 0x0, 0x1c, 0x40, 0x73, + 0x82, 0xc7, 0x5e, 0xb, 0xe0, /* U+0036 "6" */ 0x2, 0xe0, 0xf, 0x40, 0x2c, 0x0, 0x34, 0x0, 0x3b, 0xe0, 0x3d, 0x78, 0x74, 0x2c, 0x70, 0x1c, - 0x30, 0x1c, 0x38, 0x2c, 0x2d, 0x74, 0xb, 0xe0, + 0x30, 0x1c, 0x34, 0x2c, 0x2d, 0x74, 0xb, 0xe0, /* U+0037 "7" */ 0xff, 0xfc, 0x0, 0xf0, 0x3, 0x40, 0x1c, 0x0, - 0xe0, 0x3, 0x0, 0x2c, 0x0, 0xd0, 0x7, 0x0, + 0xe0, 0x3, 0x40, 0x2c, 0x0, 0xd0, 0x7, 0x0, 0x38, 0x0, 0xd0, 0xb, 0x0, /* U+0038 "8" */ - 0xb, 0xe0, 0x3d, 0x78, 0x30, 0x1c, 0x30, 0x1c, - 0x38, 0x38, 0xf, 0xf0, 0x2d, 0x78, 0x34, 0x2c, + 0xb, 0xe0, 0x3d, 0x78, 0x30, 0x1c, 0x70, 0x1c, + 0x3d, 0x7c, 0x1f, 0xf0, 0x3d, 0x78, 0x34, 0x1c, 0x70, 0x1c, 0x34, 0x1c, 0x3d, 0x78, 0xb, 0xe0, /* U+0039 "9" */ - 0xb, 0xd0, 0x2d, 0xb4, 0x34, 0x2c, 0x30, 0x1c, + 0xb, 0xd0, 0x2d, 0x74, 0x34, 0x2c, 0x30, 0x1c, 0x70, 0x1c, 0x34, 0x1c, 0x3c, 0x3c, 0xf, 0xec, - 0x0, 0x1c, 0x0, 0x34, 0x1, 0xf0, 0xf, 0x80, + 0x0, 0x2c, 0x0, 0x34, 0x1, 0xf0, 0xf, 0x80, /* U+003A ":" */ 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, /* U+003B ";" */ - 0x30, 0x0, 0x0, 0x0, 0x1, 0x1c, 0x72, 0xc8, + 0x30, 0x0, 0x0, 0x0, 0x1, 0x1c, 0x72, 0xc9, 0x0, /* U+003C "<" */ @@ -157,39 +158,40 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xd0, 0xe0, 0x0, 0x0, /* U+003F "?" */ - 0xf, 0x80, 0xe7, 0x83, 0x7, 0x0, 0x1c, 0x0, + 0xf, 0xc0, 0xf7, 0xc3, 0x47, 0x0, 0x1c, 0x0, 0xb0, 0x3, 0x40, 0x3c, 0x0, 0xd0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, /* U+0040 "@" */ 0x0, 0xbf, 0x40, 0x3, 0x96, 0xd0, 0xe, 0x0, - 0x70, 0x1c, 0x3e, 0x34, 0x38, 0xb7, 0x6c, 0x34, - 0xc3, 0x5c, 0x31, 0xc3, 0x1c, 0x72, 0xc3, 0x1c, - 0x72, 0x87, 0x1c, 0x36, 0xc7, 0x2c, 0x35, 0xdb, - 0xb4, 0x2c, 0xf2, 0xe0, 0xd, 0x0, 0x0, 0xb, - 0x95, 0x0, 0x1, 0xfe, 0x0, + 0x70, 0x1c, 0x3d, 0x38, 0x38, 0xe7, 0x2c, 0x35, + 0xc3, 0x1c, 0x32, 0x82, 0x1c, 0x72, 0x86, 0x1c, + 0x73, 0x46, 0x1c, 0x33, 0x4a, 0x1c, 0x36, 0x8e, + 0x34, 0x38, 0xf2, 0xe0, 0x1d, 0x0, 0x0, 0xb, + 0x55, 0x0, 0x1, 0xfd, 0x0, /* U+0041 "A" */ - 0x0, 0xd0, 0x0, 0x78, 0x0, 0x3f, 0x0, 0xd, - 0xd0, 0x7, 0x38, 0x2, 0x87, 0x0, 0xd0, 0xc0, - 0x70, 0x38, 0x2f, 0xff, 0xe, 0x1, 0xc3, 0x40, - 0x36, 0xc0, 0xb, + 0x2, 0xd0, 0x0, 0xf8, 0x0, 0x3f, 0x0, 0x1f, + 0xd0, 0xb, 0x78, 0x3, 0xcf, 0x0, 0xd2, 0xc0, + 0x70, 0x74, 0x2f, 0xfe, 0xe, 0x3, 0xc3, 0x40, + 0x71, 0xc0, 0xd, /* U+0042 "B" */ - 0x7f, 0xe0, 0x74, 0x78, 0x70, 0x1c, 0x70, 0x1c, - 0x70, 0x38, 0x7f, 0xf0, 0x74, 0x78, 0x70, 0x1c, + 0x7f, 0xe0, 0x74, 0x7c, 0x70, 0x1c, 0x70, 0x1c, + 0x70, 0x38, 0x7f, 0xf0, 0x75, 0x78, 0x70, 0x1c, 0x70, 0x1c, 0x70, 0x1c, 0x74, 0x78, 0x7f, 0xe0, /* U+0043 "C" */ - 0x7, 0xf4, 0x7, 0x97, 0x43, 0x80, 0xb0, 0xd0, + 0x7, 0xf8, 0x7, 0x97, 0x83, 0x80, 0x70, 0xd0, 0x1c, 0x70, 0x0, 0x1c, 0x0, 0x7, 0x0, 0x1, - 0xc0, 0x0, 0x34, 0x7, 0xe, 0x2, 0xc1, 0xd5, + 0xc0, 0x0, 0x30, 0x7, 0xe, 0x2, 0xc1, 0xd1, 0xd0, 0x1f, 0xd0, /* U+0044 "D" */ - 0x7f, 0xc0, 0x75, 0xb0, 0x70, 0x28, 0x70, 0x1c, - 0x70, 0x1c, 0x70, 0x1c, 0x70, 0x1c, 0x70, 0x1c, - 0x70, 0x1c, 0x70, 0x38, 0x75, 0xb0, 0x7f, 0xc0, + 0x7f, 0xe0, 0x1d, 0x1b, 0x7, 0x0, 0xe1, 0xc0, + 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, 0x71, + 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x3, 0x87, 0x47, + 0xc1, 0xff, 0x80, /* U+0045 "E" */ 0x7f, 0xf9, 0xd0, 0x7, 0x0, 0x1c, 0x0, 0x70, @@ -202,7 +204,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc0, 0x7, 0x0, 0x1c, 0x0, /* U+0047 "G" */ - 0x7, 0xf4, 0x7, 0x57, 0x83, 0x80, 0xb0, 0xc0, + 0x7, 0xf8, 0x7, 0x57, 0x83, 0x80, 0xb0, 0xc0, 0x8, 0x70, 0x0, 0x1c, 0x0, 0x7, 0x7, 0xf1, 0xc0, 0x1c, 0x34, 0x7, 0xe, 0x1, 0xc1, 0xe5, 0xf0, 0x1f, 0xe0, @@ -220,7 +222,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+004A "J" */ 0x0, 0x1c, 0x0, 0x1c, 0x0, 0x1c, 0x0, 0x1c, 0x0, 0x1c, 0x0, 0x1c, 0x0, 0x1c, 0x0, 0x1c, - 0x10, 0x1c, 0x34, 0x1c, 0x3d, 0x78, 0xb, 0xe0, + 0x10, 0x1c, 0x30, 0x1c, 0x3d, 0x78, 0xb, 0xe0, /* U+004B "K" */ 0x70, 0xd, 0x1c, 0xf, 0x7, 0xb, 0x1, 0xc7, @@ -231,13 +233,13 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+004C "L" */ 0x70, 0x1, 0xc0, 0x7, 0x0, 0x1c, 0x0, 0x70, 0x1, 0xc0, 0x7, 0x0, 0x1c, 0x0, 0x70, 0x1, - 0xc0, 0x7, 0x55, 0x1f, 0xfe, + 0xc0, 0x7, 0x40, 0x1f, 0xfe, /* U+004D "M" */ - 0x78, 0x0, 0xf1, 0xf0, 0x3, 0xc7, 0xd0, 0x1f, - 0x1f, 0x80, 0xfc, 0x77, 0x3, 0x71, 0xcc, 0x1d, + 0x7c, 0x0, 0xf1, 0xf0, 0x3, 0xc7, 0xd0, 0x1f, + 0x1f, 0x80, 0xfc, 0x7b, 0x3, 0xb1, 0xcc, 0x1d, 0xc7, 0x34, 0xa7, 0x1c, 0x73, 0x5c, 0x70, 0xdc, - 0x71, 0xc3, 0xe1, 0xc7, 0xb, 0x47, 0x1c, 0x1c, + 0x71, 0xc3, 0xe1, 0xc7, 0xb, 0x47, 0x1c, 0xc, 0x1c, /* U+004E "N" */ @@ -247,21 +249,21 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf1, 0xc0, 0x2c, /* U+004F "O" */ - 0x7, 0xf4, 0x7, 0x9b, 0x43, 0x80, 0xb0, 0xc0, + 0x7, 0xf4, 0x7, 0x5b, 0x43, 0x80, 0xa0, 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, 0x71, - 0xc0, 0x1c, 0x30, 0x7, 0xe, 0x2, 0x81, 0xe6, + 0xc0, 0x1c, 0x30, 0x7, 0xe, 0x2, 0x81, 0xd6, 0xd0, 0x1f, 0xd0, /* U+0050 "P" */ - 0x7f, 0xf4, 0x1d, 0x17, 0x47, 0x0, 0xb1, 0xc0, + 0x7f, 0xf4, 0x1d, 0x7, 0x87, 0x0, 0xb1, 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x3, 0x87, 0xff, 0x81, 0xd0, 0x0, 0x70, 0x0, 0x1c, 0x0, 0x7, 0x0, 0x1, 0xc0, 0x0, /* U+0051 "Q" */ - 0x7, 0xf4, 0x7, 0x9b, 0x43, 0x80, 0xb0, 0xc0, + 0x7, 0xf4, 0x7, 0x5b, 0x43, 0x80, 0xa0, 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, 0x71, - 0xc0, 0x1c, 0x30, 0x7, 0xe, 0x2, 0x81, 0xe6, + 0xc0, 0x1c, 0x30, 0x7, 0xe, 0x2, 0x81, 0xd6, 0xd0, 0x1f, 0xf0, 0x0, 0xf, 0x0, 0x0, 0x80, /* U+0052 "R" */ @@ -270,20 +272,21 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x70, 0x70, 0x70, 0x34, 0x70, 0x2c, 0x70, 0xd, /* U+0053 "S" */ - 0xb, 0xf4, 0xb, 0x5b, 0x43, 0x40, 0xb0, 0xc0, + 0xb, 0xf4, 0xf, 0x57, 0x43, 0x0, 0x70, 0xc0, 0x8, 0x3c, 0x0, 0x3, 0xf4, 0x0, 0x1b, 0xc0, 0x0, 0x3c, 0x20, 0x7, 0xd, 0x1, 0xc2, 0xd5, 0xe0, 0x1f, 0xe0, /* U+0054 "T" */ - 0xff, 0xfc, 0x1d, 0x0, 0x70, 0x1, 0xc0, 0x7, - 0x0, 0x1c, 0x0, 0x70, 0x1, 0xc0, 0x7, 0x0, - 0x1c, 0x0, 0x70, 0x1, 0xc0, + 0x7f, 0xff, 0x0, 0x74, 0x0, 0x1c, 0x0, 0x7, + 0x0, 0x1, 0xc0, 0x0, 0x70, 0x0, 0x1c, 0x0, + 0x7, 0x0, 0x1, 0xc0, 0x0, 0x70, 0x0, 0x1c, + 0x0, 0x7, 0x0, /* U+0055 "U" */ 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, 0x71, 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, 0x71, - 0xc0, 0x1c, 0x70, 0x7, 0xd, 0x2, 0xc3, 0xd5, + 0xc0, 0x1c, 0x70, 0x7, 0xd, 0x1, 0xc3, 0xd5, 0xe0, 0x2f, 0xd0, /* U+0056 "V" */ @@ -300,8 +303,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf0, 0x7, 0x0, 0xe0, /* U+0058 "X" */ - 0x38, 0xb, 0xb, 0x3, 0x40, 0xd2, 0xc0, 0x2c, - 0xd0, 0x3, 0xf0, 0x0, 0xb8, 0x0, 0x2e, 0x0, + 0x38, 0xb, 0xb, 0x3, 0x80, 0xd2, 0xc0, 0x2c, + 0xe0, 0x3, 0xf0, 0x0, 0xb8, 0x0, 0x2e, 0x0, 0xf, 0xc0, 0xb, 0x38, 0x3, 0x4b, 0x2, 0xc0, 0xe0, 0xd0, 0x2c, @@ -312,9 +315,9 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x7, 0x0, /* U+005A "Z" */ - 0xff, 0xfc, 0x0, 0xf0, 0x7, 0x0, 0x38, 0x1, - 0xc0, 0xe, 0x0, 0xb0, 0x3, 0x40, 0x2c, 0x0, - 0xd0, 0xf, 0x0, 0x3f, 0xff, + 0xff, 0xfc, 0x1, 0xf0, 0xb, 0x40, 0x38, 0x2, + 0xc0, 0xe, 0x0, 0xb0, 0x3, 0x80, 0x2c, 0x1, + 0xe0, 0xf, 0x40, 0x3f, 0xff, /* U+005B "[" */ 0x0, 0x7d, 0x74, 0x70, 0x70, 0x70, 0x70, 0x70, @@ -332,7 +335,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xbc, 0x0, /* U+005E "^" */ - 0xa, 0x0, 0xf0, 0x1f, 0x2, 0xa8, 0x31, 0xc7, + 0xa, 0x0, 0xf0, 0x1f, 0x42, 0xa8, 0x35, 0xc7, 0xc, /* U+005F "_" */ @@ -342,42 +345,42 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x20, 0x2c, 0xd, /* U+0061 "a" */ - 0x1f, 0xc0, 0xe6, 0xc0, 0x7, 0x2, 0xfc, 0x3d, - 0x70, 0xc1, 0xc7, 0x7, 0xe, 0x7c, 0x1f, 0x74, + 0xf, 0xd0, 0xe6, 0xc0, 0x7, 0x3, 0xfc, 0x3d, + 0x70, 0xc1, 0xc7, 0x7, 0xe, 0x7c, 0x1f, 0x70, /* U+0062 "b" */ 0x70, 0x0, 0x70, 0x0, 0x70, 0x0, 0x77, 0xe0, - 0x7d, 0x78, 0x70, 0x2c, 0x70, 0x1c, 0x70, 0x1c, - 0x70, 0x1c, 0x70, 0x2c, 0x7d, 0x78, 0x77, 0xe0, + 0x7d, 0x78, 0x70, 0x1c, 0x70, 0x1c, 0x70, 0x1c, + 0x70, 0x1c, 0x70, 0x1c, 0x7d, 0x78, 0x77, 0xe0, /* U+0063 "c" */ - 0xb, 0xe0, 0x2d, 0x78, 0x34, 0x1c, 0x30, 0x0, - 0x70, 0x0, 0x30, 0x0, 0x34, 0x1c, 0x2d, 0x78, + 0xb, 0xe0, 0x2d, 0x78, 0x34, 0x1c, 0x70, 0x0, + 0x70, 0x0, 0x70, 0x0, 0x34, 0x1c, 0x2d, 0x78, 0xb, 0xe0, /* U+0064 "d" */ 0x0, 0x1c, 0x0, 0x1c, 0x0, 0x1c, 0xb, 0xec, 0x3d, 0x7c, 0x34, 0x1c, 0x70, 0x1c, 0x70, 0x1c, - 0x70, 0x1c, 0x34, 0x1c, 0x3d, 0x7c, 0xb, 0xdc, + 0x30, 0x1c, 0x34, 0x1c, 0x3d, 0x7c, 0xb, 0xdc, /* U+0065 "e" */ 0xb, 0xe0, 0x2d, 0x78, 0x34, 0x1c, 0x70, 0x1c, - 0x7f, 0xfc, 0x74, 0x0, 0x34, 0x0, 0x3d, 0x6c, - 0xb, 0xf4, + 0x7f, 0xfc, 0x74, 0x0, 0x34, 0x0, 0x2d, 0x6c, + 0xb, 0xf0, /* U+0066 "f" */ - 0x0, 0x7, 0xd3, 0x80, 0xc0, 0x70, 0x3f, 0xc7, - 0x41, 0xc0, 0x70, 0x1c, 0x7, 0x1, 0xc0, 0x70, - 0x1c, 0x0, + 0x0, 0x1, 0xe0, 0xe0, 0x70, 0x1c, 0x1f, 0xd1, + 0xd0, 0x70, 0x1c, 0x7, 0x1, 0xc0, 0x70, 0x1c, + 0x7, 0x0, /* U+0067 "g" */ - 0xb, 0xdc, 0x3d, 0x7c, 0x34, 0x1c, 0x70, 0x1c, + 0xf, 0xdc, 0x3d, 0x7c, 0x34, 0x1c, 0x70, 0x1c, 0x70, 0x1c, 0x70, 0x1c, 0x34, 0x1c, 0x3d, 0x7c, 0xb, 0xec, 0x0, 0x1c, 0x29, 0x78, 0xb, 0xe0, /* U+0068 "h" */ - 0x70, 0x1, 0xc0, 0x7, 0x0, 0x1d, 0xf4, 0x7d, - 0xf1, 0xc1, 0xc7, 0x7, 0x1c, 0x1c, 0x70, 0x71, + 0x70, 0x1, 0xc0, 0x7, 0x0, 0x1e, 0xf4, 0x79, + 0xb1, 0xc1, 0xc7, 0x7, 0x1c, 0x1c, 0x70, 0x71, 0xc1, 0xc7, 0x7, 0x1c, 0x1c, /* U+0069 "i" */ @@ -386,11 +389,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+006A "j" */ 0xc, 0x0, 0x0, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, - 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x2c, 0x74, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x2c, 0xb4, /* U+006B "k" */ 0x70, 0x1, 0xc0, 0x7, 0x0, 0x1c, 0x2c, 0x71, - 0xd1, 0xce, 0x7, 0xf0, 0x1f, 0xc0, 0x77, 0x81, + 0xd1, 0xce, 0x7, 0xb0, 0x1f, 0xc0, 0x77, 0x81, 0xc7, 0x47, 0xb, 0x1c, 0xd, /* U+006C "l" */ @@ -398,13 +401,13 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x1c, /* U+006D "m" */ - 0x7b, 0xdb, 0xd1, 0xe7, 0xe7, 0xc7, 0x7, 0x7, - 0x1c, 0x1c, 0x1c, 0x70, 0x70, 0x71, 0xc1, 0xc1, - 0xc7, 0x7, 0x7, 0x1c, 0x1c, 0x1c, 0x70, 0x70, - 0x70, + 0x7b, 0xd7, 0xf0, 0x79, 0xfd, 0x7c, 0x70, 0x74, + 0x1c, 0x70, 0x70, 0x1c, 0x70, 0x70, 0x1c, 0x70, + 0x70, 0x1c, 0x70, 0x70, 0x1c, 0x70, 0x70, 0x1c, + 0x70, 0x70, 0x1c, /* U+006E "n" */ - 0x77, 0xd1, 0xf7, 0xc7, 0x7, 0x1c, 0x1c, 0x70, + 0x7b, 0xd1, 0xf6, 0xc7, 0x7, 0x1c, 0x1c, 0x70, 0x71, 0xc1, 0xc7, 0x7, 0x1c, 0x1c, 0x70, 0x70, /* U+006F "o" */ @@ -413,26 +416,26 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xb, 0xe0, /* U+0070 "p" */ - 0x77, 0xe0, 0x79, 0x78, 0x70, 0x2c, 0x70, 0x1c, - 0x70, 0x1c, 0x70, 0x1c, 0x70, 0x2c, 0x7d, 0x78, + 0x77, 0xe0, 0x7d, 0x78, 0x70, 0x2c, 0x70, 0x1c, + 0x70, 0x1c, 0x70, 0x1c, 0x70, 0x2c, 0x79, 0x78, 0x77, 0xe0, 0x70, 0x0, 0x70, 0x0, 0x70, 0x0, /* U+0071 "q" */ - 0xb, 0xdc, 0x3d, 0x7c, 0x34, 0x1c, 0x70, 0x1c, + 0xf, 0xdc, 0x3d, 0x7c, 0x34, 0x1c, 0x70, 0x1c, 0x70, 0x1c, 0x70, 0x1c, 0x34, 0x1c, 0x3d, 0x7c, - 0xb, 0xec, 0x0, 0x1c, 0x0, 0x1c, 0x0, 0x1c, + 0xf, 0xec, 0x0, 0x1c, 0x0, 0x1c, 0x0, 0x1c, /* U+0072 "r" */ - 0x0, 0x1e, 0xc7, 0x91, 0xc0, 0x70, 0x1c, 0x7, - 0x1, 0xc0, 0x70, 0x1c, 0x0, + 0x7b, 0x1f, 0x47, 0x1, 0xc0, 0x70, 0x1c, 0x7, + 0x1, 0xc0, 0x70, 0x0, /* U+0073 "s" */ - 0x1f, 0xc0, 0xe7, 0xc7, 0x6, 0xf, 0x0, 0xb, - 0x80, 0x7, 0xc3, 0x7, 0xe, 0x6c, 0xf, 0xc0, + 0x1f, 0xc0, 0xe7, 0xc7, 0x6, 0xf, 0x0, 0xf, + 0x80, 0x3, 0xc2, 0x7, 0xe, 0x6c, 0xf, 0xc0, /* U+0074 "t" */ - 0x1c, 0x1c, 0xff, 0x1d, 0x1c, 0x1c, 0x1c, 0x1c, - 0x1c, 0xd, 0xb, + 0x1c, 0x7, 0xb, 0xf4, 0x74, 0x1c, 0x7, 0x1, + 0xc0, 0x70, 0x1c, 0x3, 0x40, 0xb0, /* U+0075 "u" */ 0x70, 0x71, 0xc1, 0xc7, 0x7, 0x1c, 0x1c, 0x70, @@ -443,40 +446,41 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc0, 0x37, 0x0, 0xf8, 0x2, 0xd0, 0x3, 0x0, /* U+0077 "w" */ - 0x70, 0x70, 0x77, 0xb, 0xa, 0x34, 0xf4, 0xd3, - 0x8e, 0x8c, 0x29, 0x9d, 0xc1, 0xe4, 0xe8, 0xf, - 0xf, 0x40, 0xf0, 0xb4, 0xa, 0x7, 0x0, + 0xb0, 0x38, 0x29, 0xc0, 0xf0, 0xd3, 0x8b, 0xc3, + 0xf, 0x3b, 0x5c, 0x2d, 0xda, 0xa0, 0x7f, 0x1e, + 0x40, 0xfc, 0x3d, 0x3, 0xe0, 0xf0, 0xb, 0x42, + 0xc0, /* U+0078 "x" */ 0x74, 0x74, 0xa2, 0xc0, 0xdc, 0x2, 0xe0, 0x7, 0x40, 0x3f, 0x1, 0xdd, 0xe, 0x2c, 0x70, 0x34, /* U+0079 "y" */ - 0x70, 0x38, 0xd0, 0xc2, 0x87, 0x7, 0x28, 0xc, - 0xd0, 0x3b, 0x0, 0xbc, 0x0, 0xe0, 0x3, 0x0, - 0x1c, 0x1, 0xe0, 0xf, 0x0, + 0xb0, 0x31, 0xc1, 0xc3, 0x4a, 0xa, 0x34, 0x1c, + 0xc0, 0x3b, 0x0, 0xf8, 0x2, 0xc0, 0x7, 0x0, + 0x28, 0x1, 0xd0, 0x1e, 0x0, /* U+007A "z" */ - 0xff, 0xc0, 0xf0, 0x30, 0x28, 0xc, 0xa, 0x7, - 0x3, 0x80, 0xff, 0xc0, + 0xff, 0xf0, 0x1e, 0x3, 0xc0, 0x78, 0xf, 0x2, + 0xd0, 0x3c, 0xf, 0x40, 0xff, 0xf0, /* U+007B "{" */ 0x0, 0x1, 0xc0, 0xd0, 0x30, 0x1c, 0x7, 0x1, - 0xc0, 0xb0, 0xf0, 0xe, 0x1, 0xc0, 0x70, 0x1c, - 0x3, 0x0, 0xd0, 0x1c, 0x1, 0x0, + 0xc0, 0xb0, 0xf4, 0xf, 0x1, 0xc0, 0x70, 0x1c, + 0x3, 0x0, 0xd0, 0x2c, 0x2, 0x0, /* U+007C "|" */ 0x71, 0xc7, 0x1c, 0x71, 0xc7, 0x1c, 0x71, 0xc7, 0x1c, 0x71, 0xc0, /* U+007D "}" */ - 0x0, 0x1c, 0x2, 0xc0, 0x70, 0x1c, 0x7, 0x1, - 0xc0, 0x34, 0x7, 0x3, 0x80, 0xc0, 0x70, 0x1c, - 0x7, 0x2, 0xc1, 0xd0, 0x0, 0x0, + 0x0, 0x18, 0x3, 0x80, 0x70, 0x1c, 0x7, 0x1, + 0xc0, 0x34, 0xf, 0x42, 0xe0, 0xe0, 0x70, 0x1c, + 0x7, 0x1, 0xc0, 0xb0, 0x74, 0x0, 0x0, /* U+007E "~" */ - 0x0, 0x0, 0x7, 0xc1, 0xc3, 0x9c, 0xb0, 0xc1, - 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0x9, 0xa7, 0x8c, 0xc1, 0xf8, + 0x0, 0x0, /* U+00A0 " " */ @@ -485,89 +489,89 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x1c, /* U+00A3 "£" */ - 0xb, 0xe0, 0x2d, 0x78, 0x34, 0x1c, 0x70, 0x4, - 0x70, 0x0, 0x70, 0x0, 0xff, 0x0, 0x74, 0x0, - 0x70, 0x0, 0x70, 0x0, 0xb0, 0x0, 0xff, 0xfc, + 0x2, 0xf8, 0x2, 0xd7, 0x80, 0xd0, 0x70, 0x70, + 0x4, 0x1c, 0x0, 0x7, 0x0, 0x3, 0xfe, 0x0, + 0x74, 0x0, 0x1c, 0x0, 0x7, 0x0, 0x2, 0xc0, + 0x0, 0xff, 0xfc, /* U+00B0 "°" */ - 0x0, 0x1, 0xf4, 0x36, 0xc3, 0x6c, 0x2f, 0x40, + 0x0, 0x1, 0xf4, 0x36, 0xc3, 0x5c, 0x2f, 0x40, 0x0, /* U+00B1 "±" */ - 0x7, 0x0, 0x70, 0x7, 0xf, 0xff, 0x7, 0x40, - 0x70, 0x7, 0x0, 0x70, 0x0, 0xf, 0xff, + 0x2, 0x0, 0x1c, 0x0, 0x70, 0x1, 0xc0, 0x3f, + 0xf4, 0x1d, 0x0, 0x70, 0x1, 0xc0, 0x2, 0x0, + 0x0, 0x3, 0xff, 0x0, /* U+00B2 "²" */ - 0x7d, 0x36, 0xc4, 0x70, 0x38, 0x28, 0x2c, 0xf, - 0xf0, + 0x7d, 0xc7, 0xb, 0x1c, 0x70, 0xff, /* U+00B3 "³" */ - 0x3d, 0x2a, 0xc0, 0x70, 0xb4, 0xb, 0x2a, 0xc3, - 0xd0, + 0x2f, 0x84, 0x70, 0xb4, 0x7, 0x35, 0xcb, 0xd0, /* U+00B5 "µ" */ 0x70, 0x71, 0xc1, 0xc7, 0x7, 0x1c, 0x1c, 0x70, - 0x71, 0xc1, 0xc7, 0x7, 0x1e, 0x7c, 0x7f, 0xb1, + 0x71, 0xc1, 0xc7, 0x47, 0x1e, 0x7c, 0x7f, 0xb1, 0xc0, 0x7, 0x0, 0x1c, 0x0, /* U+00BF "¿" */ - 0x3, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc0, 0xb, - 0x0, 0x38, 0x2, 0xc0, 0xd, 0x0, 0x70, 0x0, - 0xc1, 0xc3, 0x9e, 0x3, 0xe0, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x7, + 0x0, 0x34, 0x2, 0xc0, 0xd, 0x0, 0x70, 0x0, + 0xc1, 0xc3, 0xdf, 0x7, 0xf0, /* U+00C0 "À" */ - 0x7, 0x40, 0x0, 0xb0, 0x0, 0x4, 0x0, 0x3, - 0x40, 0x1, 0xe0, 0x0, 0xfc, 0x0, 0x37, 0x40, - 0x1c, 0xe0, 0xa, 0x1c, 0x3, 0x43, 0x1, 0xc0, - 0xe0, 0xbf, 0xfc, 0x38, 0x7, 0xd, 0x0, 0xdb, - 0x0, 0x2c, + 0xb, 0x0, 0x0, 0xe0, 0x0, 0x8, 0x0, 0xb, + 0x40, 0x3, 0xe0, 0x0, 0xfc, 0x0, 0x7f, 0x40, + 0x2d, 0xe0, 0xf, 0x3c, 0x3, 0x4b, 0x1, 0xc1, + 0xd0, 0xbf, 0xf8, 0x38, 0xf, 0xd, 0x1, 0xc7, + 0x0, 0x34, /* U+00C1 "Á" */ - 0x0, 0x38, 0x0, 0x2c, 0x0, 0x4, 0x0, 0x3, - 0x40, 0x1, 0xe0, 0x0, 0xfc, 0x0, 0x37, 0x40, - 0x1c, 0xe0, 0xa, 0x1c, 0x3, 0x43, 0x1, 0xc0, - 0xe0, 0xbf, 0xfc, 0x38, 0x7, 0xd, 0x0, 0xdb, - 0x0, 0x2c, + 0x0, 0x34, 0x0, 0x3c, 0x0, 0x8, 0x0, 0xb, + 0x40, 0x3, 0xe0, 0x0, 0xfc, 0x0, 0x7f, 0x40, + 0x2d, 0xe0, 0xf, 0x3c, 0x3, 0x4b, 0x1, 0xc1, + 0xd0, 0xbf, 0xf8, 0x38, 0xf, 0xd, 0x1, 0xc7, + 0x0, 0x34, /* U+00C2 "Â" */ - 0x0, 0xd0, 0x0, 0xcd, 0x0, 0x0, 0x0, 0x3, - 0x40, 0x1, 0xe0, 0x0, 0xfc, 0x0, 0x37, 0x40, - 0x1c, 0xe0, 0xa, 0x1c, 0x3, 0x43, 0x1, 0xc0, - 0xe0, 0xbf, 0xfc, 0x38, 0x7, 0xd, 0x0, 0xdb, - 0x0, 0x2c, + 0x2, 0xe0, 0x1, 0x8c, 0x0, 0x0, 0x0, 0xb, + 0x40, 0x3, 0xe0, 0x0, 0xfc, 0x0, 0x7f, 0x40, + 0x2d, 0xe0, 0xf, 0x3c, 0x3, 0x4b, 0x1, 0xc1, + 0xd0, 0xbf, 0xf8, 0x38, 0xf, 0xd, 0x1, 0xc7, + 0x0, 0x34, /* U+00C3 "Ã" */ - 0x0, 0x0, 0x1, 0xd9, 0x0, 0xdf, 0x0, 0x0, - 0x0, 0x2, 0xc0, 0x0, 0xf4, 0x0, 0x3e, 0x0, - 0x1d, 0xc0, 0xa, 0x30, 0x3, 0x4d, 0x1, 0xc2, - 0xc0, 0xb0, 0x70, 0x3f, 0xfd, 0xd, 0x3, 0x87, - 0x0, 0xb3, 0x80, 0xd, + 0x0, 0x0, 0x1, 0xe2, 0x0, 0x9f, 0x40, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0xf8, 0x0, 0x3f, 0x0, + 0x1f, 0xd0, 0xb, 0x78, 0x3, 0xcf, 0x0, 0xd2, + 0xc0, 0x70, 0x74, 0x2f, 0xfe, 0xe, 0x3, 0xc3, + 0x40, 0x71, 0xc0, 0xd, /* U+00C4 "Ä" */ - 0x0, 0x0, 0x0, 0x30, 0x30, 0x0, 0x0, 0x0, - 0xf, 0x40, 0x0, 0xf8, 0x0, 0x1f, 0xc0, 0x2, - 0xdd, 0x0, 0x38, 0xe0, 0x3, 0x4b, 0x0, 0xb0, - 0x30, 0xe, 0x3, 0x40, 0xff, 0xfc, 0x1d, 0x1, - 0xc2, 0xc0, 0xd, 0x38, 0x0, 0xe0, + 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0xf, + 0x80, 0x3, 0xf0, 0x1, 0xfc, 0x0, 0xbf, 0x40, + 0x3d, 0xe0, 0xe, 0x3c, 0x7, 0x4b, 0x2, 0xc1, + 0xd0, 0xff, 0xf8, 0x38, 0xb, 0x1c, 0x1, 0xce, + 0x0, 0x34, /* U+00C5 "Å" */ - 0x0, 0x0, 0x0, 0xb4, 0x0, 0x3b, 0x0, 0xe, - 0xc0, 0x2, 0xd0, 0x0, 0x20, 0x0, 0x1c, 0x0, - 0xb, 0x40, 0x3, 0x70, 0x1, 0xcc, 0x0, 0xa3, - 0x40, 0x34, 0xb0, 0x1c, 0x1c, 0xb, 0xff, 0x43, - 0x40, 0xb1, 0xc0, 0x1c, 0xe0, 0x3, 0x80, + 0x0, 0x0, 0x0, 0xbd, 0x0, 0x36, 0xc0, 0xd, + 0x70, 0x2, 0xf4, 0x0, 0x38, 0x0, 0x1f, 0x0, + 0xb, 0xc0, 0x3, 0xb4, 0x1, 0xce, 0x0, 0xb2, + 0xc0, 0x34, 0x70, 0xc, 0xd, 0xb, 0xff, 0x83, + 0x80, 0xb0, 0xd0, 0x1c, 0x70, 0x3, 0x40, /* U+00C6 "Æ" */ - 0x0, 0x1f, 0xff, 0x0, 0xf, 0xd0, 0x0, 0x7, - 0xb0, 0x0, 0x3, 0xdc, 0x0, 0x1, 0xd7, 0x0, - 0x0, 0xf1, 0xff, 0x80, 0x74, 0x74, 0x0, 0x3c, - 0x1c, 0x0, 0x1f, 0xff, 0x0, 0xb, 0x1, 0xc0, - 0x3, 0x40, 0x74, 0x2, 0xc0, 0x1f, 0xfe, + 0x0, 0x1f, 0xff, 0x80, 0xf, 0xd0, 0x0, 0x7, + 0x70, 0x0, 0x2, 0x9c, 0x0, 0x0, 0xd7, 0x0, + 0x0, 0xb1, 0xff, 0xc0, 0x34, 0x74, 0x0, 0x2c, + 0x1c, 0x0, 0xf, 0xff, 0x0, 0xb, 0x55, 0xc0, + 0x3, 0x40, 0x74, 0x2, 0xc0, 0x1f, 0xff, /* U+00C7 "Ç" */ - 0x7, 0xf4, 0x7, 0x97, 0x43, 0x80, 0xb0, 0xd0, + 0x7, 0xf8, 0x7, 0x97, 0x83, 0x80, 0x70, 0xd0, 0x1c, 0x70, 0x0, 0x1c, 0x0, 0x7, 0x0, 0x1, - 0xc0, 0x0, 0x34, 0x7, 0xe, 0x2, 0xc1, 0xd5, + 0xc0, 0x0, 0x30, 0x7, 0xe, 0x2, 0xc1, 0xd1, 0xd0, 0x1f, 0xd0, 0x0, 0xd0, 0x0, 0x2c, 0x0, 0x1d, 0x0, @@ -578,7 +582,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x7, 0xff, 0xc0, /* U+00C9 "É" */ - 0x0, 0xe0, 0xa, 0x0, 0x0, 0x1f, 0xfe, 0x74, + 0x0, 0xe0, 0xe, 0x0, 0x0, 0x1f, 0xfe, 0x74, 0x1, 0xc0, 0x7, 0x0, 0x1c, 0x0, 0x7f, 0xf1, 0xd0, 0x7, 0x0, 0x1c, 0x0, 0x70, 0x1, 0xd0, 0x7, 0xff, 0xc0, @@ -616,10 +620,10 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x70, 0x0, /* U+00D0 "Ð" */ - 0x7f, 0xe0, 0x1d, 0x5f, 0x7, 0x0, 0xe1, 0xc0, - 0x1c, 0x70, 0x7, 0x3f, 0xc1, 0xc7, 0x40, 0x71, - 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x3, 0x87, 0x57, - 0xc1, 0xff, 0x80, + 0x1f, 0xf8, 0x1, 0xd1, 0xb0, 0x1c, 0x3, 0x81, + 0xc0, 0x1c, 0x1c, 0x1, 0xc7, 0xfc, 0x1c, 0x1d, + 0x1, 0xc1, 0xc0, 0x1c, 0x1c, 0x1, 0xc1, 0xc0, + 0x38, 0x1d, 0x1f, 0x1, 0xff, 0x80, /* U+00D1 "Ñ" */ 0x0, 0x0, 0x1, 0xd6, 0x0, 0xdf, 0x40, 0x0, @@ -630,38 +634,38 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+00D2 "Ò" */ 0x5, 0x0, 0x0, 0xd0, 0x0, 0x1c, 0x0, 0x0, - 0x0, 0x7, 0xf4, 0x7, 0x9b, 0x43, 0x80, 0xb0, + 0x0, 0x7, 0xf4, 0x7, 0x5b, 0x43, 0x80, 0xa0, 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, 0x71, 0xc0, 0x1c, 0x30, 0x7, 0xe, 0x2, 0x81, - 0xe6, 0xd0, 0x1f, 0xd0, + 0xd6, 0xd0, 0x1f, 0xd0, /* U+00D3 "Ó" */ 0x0, 0x14, 0x0, 0x1c, 0x0, 0xc, 0x0, 0x0, - 0x0, 0x7, 0xf4, 0x7, 0x9b, 0x43, 0x80, 0xb0, + 0x0, 0x7, 0xf4, 0x7, 0x5b, 0x43, 0x80, 0xa0, 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, 0x71, 0xc0, 0x1c, 0x30, 0x7, 0xe, 0x2, 0x81, - 0xe6, 0xd0, 0x1f, 0xd0, + 0xd6, 0xd0, 0x1f, 0xd0, /* U+00D4 "Ô" */ 0x0, 0x40, 0x0, 0xb4, 0x0, 0x33, 0x0, 0x0, - 0x0, 0x7, 0xf4, 0x7, 0x9b, 0x43, 0x80, 0xb0, + 0x0, 0x7, 0xf4, 0x7, 0x5b, 0x43, 0x80, 0xa0, 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, 0x71, 0xc0, 0x1c, 0x30, 0x7, 0xe, 0x2, 0x81, - 0xe6, 0xd0, 0x1f, 0xd0, + 0xd6, 0xd0, 0x1f, 0xd0, /* U+00D5 "Õ" */ 0x0, 0x0, 0x1, 0xe3, 0x0, 0x9b, 0x80, 0x0, - 0x0, 0x7, 0xf4, 0x7, 0x97, 0x43, 0x80, 0x70, + 0x0, 0x7, 0xf4, 0x7, 0x97, 0x43, 0x80, 0x60, 0xc0, 0xc, 0x70, 0x3, 0x1c, 0x0, 0xc7, 0x0, - 0x31, 0xc0, 0xc, 0x30, 0x3, 0xe, 0x1, 0x81, + 0x31, 0xc0, 0xc, 0x30, 0x3, 0xe, 0x0, 0x81, 0xe5, 0xd0, 0x1f, 0xd0, /* U+00D6 "Ö" */ - 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xf4, 0x7, 0x9b, 0x43, 0x80, 0xb0, - 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, - 0x71, 0xc0, 0x1c, 0x30, 0x7, 0xe, 0x2, 0x81, - 0xe6, 0xd0, 0x1f, 0xd0, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xf4, 0x7, 0xd7, 0x43, 0xc0, 0xa0, + 0xf0, 0x1c, 0x78, 0x7, 0x1e, 0x1, 0xc7, 0x80, + 0x71, 0xe0, 0x1c, 0x3c, 0x7, 0xf, 0x2, 0x81, + 0xf5, 0xd0, 0x1f, 0xd0, /* U+00D7 "×" */ 0x0, 0x0, 0xc0, 0x92, 0xc7, 0x3, 0xf4, 0x7, @@ -669,36 +673,36 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+00D8 "Ø" */ 0x7, 0xf7, 0x3, 0x9b, 0x43, 0x80, 0xe0, 0xd0, - 0x7c, 0x30, 0x27, 0x1c, 0x15, 0xc7, 0x8, 0x70, - 0xc5, 0x1c, 0x36, 0xb, 0xf, 0x43, 0x81, 0xd6, + 0xbc, 0x30, 0x37, 0x1c, 0x29, 0xc7, 0xc, 0x70, + 0xc6, 0x1c, 0x37, 0x7, 0xb, 0x83, 0x81, 0xe6, 0xc0, 0x6f, 0xc0, 0x10, 0x0, 0x0, /* U+00D9 "Ù" */ 0xb, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x1, 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, 0x71, 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, - 0x71, 0xc0, 0x1c, 0x34, 0xb, 0xf, 0x57, 0x80, + 0x71, 0xc0, 0x1c, 0x34, 0x7, 0xf, 0x57, 0x80, 0xbf, 0x40, /* U+00DA "Ú" */ - 0x0, 0x78, 0x0, 0x34, 0x0, 0x0, 0x1, 0xc0, + 0x0, 0x38, 0x0, 0x34, 0x0, 0x0, 0x1, 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, 0x71, 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, - 0x71, 0xc0, 0x1c, 0x34, 0xb, 0xf, 0x57, 0x80, + 0x71, 0xc0, 0x1c, 0x34, 0x7, 0xf, 0x57, 0x80, 0xbf, 0x40, /* U+00DB "Û" */ - 0x2, 0xd0, 0x1, 0xcc, 0x0, 0x0, 0x1, 0xc0, + 0x2, 0xd0, 0x1, 0xcd, 0x0, 0x0, 0x1, 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, 0x71, 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, - 0x71, 0xc0, 0x1c, 0x34, 0xb, 0xf, 0x57, 0x80, + 0x71, 0xc0, 0x1c, 0x34, 0x7, 0xf, 0x57, 0x80, 0xbf, 0x40, /* U+00DC "Ü" */ - 0x0, 0x0, 0x3, 0xc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, 0x71, 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x0, - 0x71, 0xc0, 0x1c, 0x70, 0x7, 0xd, 0x2, 0xc3, + 0x71, 0xc0, 0x1c, 0x70, 0x7, 0xd, 0x1, 0xc3, 0xd5, 0xe0, 0x2f, 0xd0, /* U+00DD "Ý" */ @@ -714,74 +718,74 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x7f, 0xf0, 0x74, 0x0, 0x70, 0x0, 0x70, 0x0, /* U+00DF "ß" */ - 0xf, 0xc0, 0x39, 0xf0, 0x30, 0x70, 0x70, 0xb0, - 0x70, 0xd0, 0x70, 0xc0, 0x70, 0xd0, 0x70, 0x74, + 0xf, 0xd0, 0x39, 0xf0, 0x30, 0x70, 0x70, 0x70, + 0x70, 0xd0, 0x71, 0xc0, 0x70, 0xd0, 0x70, 0x74, 0x70, 0x1c, 0x70, 0xc, 0x72, 0x5c, 0x73, 0xf4, /* U+00E0 "à" */ - 0xd, 0x0, 0x1c, 0x0, 0x0, 0x7, 0xf0, 0x39, - 0xb0, 0x1, 0xc0, 0xbf, 0xf, 0x5c, 0x30, 0x71, - 0xc1, 0xc3, 0x9f, 0x7, 0xdd, + 0xd, 0x0, 0x1c, 0x0, 0x0, 0x2, 0xf4, 0x2d, + 0xb0, 0xd1, 0xc0, 0xff, 0xf, 0x5c, 0x30, 0x71, + 0xc1, 0xc3, 0x9f, 0x7, 0xdc, /* U+00E1 "á" */ - 0x0, 0xd0, 0x9, 0x0, 0x0, 0x7, 0xf0, 0x39, + 0x0, 0xd0, 0x9, 0x0, 0x0, 0x3, 0xf4, 0x39, 0xb0, 0x41, 0xc0, 0xbf, 0xf, 0x1c, 0x30, 0x71, - 0xc1, 0xc3, 0x9f, 0x7, 0xdd, + 0xc1, 0xc3, 0x9f, 0x7, 0xdc, /* U+00E2 "â" */ - 0x3, 0x40, 0x33, 0x0, 0x0, 0x7, 0xf0, 0x39, - 0xb0, 0x1, 0xc0, 0xbf, 0xf, 0x5c, 0x30, 0x71, - 0xc1, 0xc3, 0x9f, 0x7, 0xdd, + 0x3, 0x40, 0x32, 0x0, 0x0, 0x3, 0xf4, 0x39, + 0xb0, 0x1, 0xc0, 0xff, 0xf, 0x5c, 0x30, 0x71, + 0xc1, 0xc3, 0x9f, 0x7, 0xdc, /* U+00E3 "ã" */ - 0x0, 0x0, 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x1f, - 0xc0, 0xe6, 0xc0, 0x7, 0x2, 0xfc, 0x3d, 0x70, - 0xc1, 0xc7, 0x7, 0xe, 0x7c, 0x1f, 0x74, + 0x0, 0x0, 0x7f, 0xc0, 0x0, 0x0, 0x0, 0xf, + 0xd0, 0xe6, 0xc0, 0x7, 0x3, 0xfc, 0x3d, 0x70, + 0xc1, 0xc7, 0x7, 0xe, 0x7c, 0x1f, 0x70, /* U+00E4 "ä" */ - 0xc, 0x30, 0x0, 0x0, 0x0, 0x7, 0xf0, 0x39, - 0xb0, 0x1, 0xc0, 0xbf, 0xf, 0x5c, 0x30, 0x71, - 0xc1, 0xc3, 0x9f, 0x7, 0xdd, + 0xc, 0x30, 0x0, 0x0, 0x0, 0x3, 0xf4, 0x39, + 0xb0, 0x1, 0xc0, 0xff, 0xf, 0x5c, 0x30, 0x71, + 0xc1, 0xc3, 0x9f, 0x7, 0xdc, /* U+00E5 "å" */ 0x0, 0x0, 0xf, 0x40, 0xdb, 0x3, 0x5c, 0x7, - 0xe0, 0x0, 0x1, 0xfc, 0xe, 0x6c, 0x0, 0x70, - 0x2f, 0xc3, 0xd7, 0xc, 0x1c, 0x70, 0x70, 0xe7, - 0xc1, 0xf7, 0x40, + 0xe0, 0x0, 0x0, 0xfd, 0xe, 0x6c, 0x0, 0x70, + 0x2f, 0xc3, 0xd7, 0xc, 0x1c, 0x70, 0x70, 0xe6, + 0xc1, 0xfb, 0x0, /* U+00E6 "æ" */ - 0xf, 0xcb, 0xe0, 0x39, 0xfd, 0x74, 0x30, 0x78, - 0x2c, 0x0, 0x70, 0x1c, 0x1f, 0xff, 0xfc, 0x38, + 0xf, 0xcb, 0xe0, 0x3d, 0xfd, 0x78, 0x34, 0x74, + 0x1c, 0x0, 0x74, 0x1c, 0x1f, 0xff, 0xfc, 0x38, 0x74, 0x0, 0x70, 0x74, 0x0, 0x39, 0xfd, 0x58, - 0x1f, 0x87, 0xf4, + 0x1f, 0x8b, 0xf4, /* U+00E7 "ç" */ - 0xb, 0xe0, 0x2d, 0x78, 0x34, 0x1c, 0x30, 0x0, - 0x70, 0x0, 0x30, 0x0, 0x34, 0x1c, 0x2d, 0x78, - 0xb, 0xe0, 0x3, 0x40, 0x2, 0xc0, 0x3, 0x80, + 0xb, 0xe0, 0x2d, 0x78, 0x34, 0x1c, 0x70, 0x0, + 0x70, 0x0, 0x70, 0x0, 0x34, 0x1c, 0x2d, 0x78, + 0xb, 0xe0, 0x2, 0x80, 0x1, 0xc0, 0x3, 0x80, /* U+00E8 "è" */ 0xe, 0x0, 0x3, 0x40, 0x0, 0x0, 0xb, 0xe0, 0x2d, 0x78, 0x34, 0x1c, 0x70, 0x1c, 0x7f, 0xfc, - 0x74, 0x0, 0x34, 0x0, 0x3d, 0x6c, 0xb, 0xf4, + 0x74, 0x0, 0x34, 0x0, 0x2d, 0x6c, 0xb, 0xf0, /* U+00E9 "é" */ 0x0, 0xb0, 0x1, 0xc0, 0x0, 0x0, 0xb, 0xe0, 0x2d, 0x78, 0x34, 0x1c, 0x70, 0x1c, 0x7f, 0xfc, - 0x74, 0x0, 0x34, 0x0, 0x3d, 0x6c, 0xb, 0xf4, + 0x74, 0x0, 0x34, 0x0, 0x2d, 0x6c, 0xb, 0xf0, /* U+00EA "ê" */ 0x3, 0xc0, 0xd, 0x60, 0x0, 0x0, 0xb, 0xe0, 0x2d, 0x78, 0x34, 0x1c, 0x70, 0x1c, 0x7f, 0xfc, - 0x74, 0x0, 0x34, 0x0, 0x3d, 0x6c, 0xb, 0xf4, + 0x74, 0x0, 0x34, 0x0, 0x2d, 0x6c, 0xb, 0xf0, /* U+00EB "ë" */ 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0xb, 0xe0, 0x2d, 0x78, 0x34, 0x1c, 0x70, 0x1c, 0x7f, 0xfc, - 0x74, 0x0, 0x34, 0x0, 0x3d, 0x64, 0xb, 0xe0, + 0x74, 0x0, 0x34, 0x0, 0x3d, 0x68, 0xb, 0xf0, /* U+00EC "ì" */ - 0x2c, 0x1, 0xc0, 0x0, 0x1c, 0x7, 0x1, 0xc0, + 0x1c, 0x1, 0xc0, 0x0, 0x1c, 0x7, 0x1, 0xc0, 0x70, 0x1c, 0x7, 0x1, 0xc0, 0x70, 0x1c, /* U+00ED "í" */ @@ -798,14 +802,14 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x1c, 0x0, 0x70, 0x1, 0xc0, /* U+00F0 "ð" */ - 0x9, 0x0, 0xf, 0xb4, 0x2, 0xe0, 0x7, 0xb0, + 0xd, 0x0, 0xf, 0xb4, 0x2, 0xe0, 0x7, 0xb0, 0x0, 0x38, 0xb, 0xfc, 0x2d, 0x7c, 0x34, 0x1c, - 0x30, 0x1c, 0x30, 0x1c, 0x34, 0x2c, 0x2d, 0x74, + 0x30, 0x1c, 0x70, 0x1c, 0x34, 0x2c, 0x2d, 0x74, 0xb, 0xd0, /* U+00F1 "ñ" */ - 0x0, 0x0, 0x75, 0x82, 0x6d, 0x0, 0x0, 0x77, - 0xd1, 0xf7, 0xc7, 0x7, 0x1c, 0x1c, 0x70, 0x71, + 0x0, 0x0, 0x75, 0x82, 0x6d, 0x0, 0x0, 0x7b, + 0xd1, 0xf6, 0xc7, 0x7, 0x1c, 0x1c, 0x70, 0x71, 0xc1, 0xc7, 0x7, 0x1c, 0x1c, 0x70, 0x70, /* U+00F2 "ò" */ @@ -840,14 +844,14 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x0, /* U+00F8 "ø" */ - 0x0, 0x24, 0xb, 0xf0, 0x2d, 0xb4, 0x34, 0xbc, - 0x30, 0x9c, 0x71, 0x5c, 0x32, 0x1c, 0x3a, 0x2c, - 0x2d, 0x74, 0xf, 0xd0, 0x14, 0x0, + 0x0, 0x24, 0xb, 0xf0, 0x2d, 0xb4, 0x34, 0xac, + 0x30, 0xdc, 0x71, 0x5c, 0x33, 0x1c, 0x3a, 0x2c, + 0x2e, 0x74, 0xf, 0xd0, 0x14, 0x0, /* U+00F9 "ù" */ 0x1c, 0x0, 0x1c, 0x0, 0x0, 0x1c, 0x1c, 0x70, 0x71, 0xc1, 0xc7, 0x7, 0x1c, 0x1c, 0x70, 0x70, - 0xc1, 0xc3, 0x9f, 0x7, 0xec, + 0xc1, 0xc3, 0x8f, 0x7, 0xec, /* U+00FA "ú" */ 0x1, 0xd0, 0xd, 0x0, 0x0, 0x1c, 0x1c, 0x70, @@ -857,41 +861,41 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+00FB "û" */ 0x7, 0x0, 0x22, 0x0, 0x0, 0x1c, 0x1c, 0x70, 0x71, 0xc1, 0xc7, 0x7, 0x1c, 0x1c, 0x70, 0x70, - 0xc1, 0xc3, 0x9f, 0x7, 0xec, + 0xc1, 0xc3, 0x8f, 0x7, 0xec, /* U+00FC "ü" */ - 0x30, 0x30, 0x0, 0x0, 0x0, 0x1c, 0x1c, 0x70, + 0xc, 0x30, 0x0, 0x0, 0x0, 0x1c, 0x1c, 0x70, 0x71, 0xc1, 0xc7, 0x7, 0x1c, 0x1c, 0x70, 0x70, 0xc1, 0xc3, 0x9f, 0x7, 0xec, /* U+00FD "ý" */ - 0x0, 0xe0, 0xa, 0x0, 0x0, 0x1c, 0xe, 0x34, - 0x30, 0xa1, 0xc1, 0xca, 0x3, 0x34, 0xe, 0xc0, - 0x2f, 0x0, 0x38, 0x0, 0xc0, 0x7, 0x0, 0x78, - 0x3, 0xc0, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0x0, 0x2c, 0xc, 0x70, + 0x70, 0xd2, 0x82, 0x8d, 0x7, 0x30, 0xe, 0xc0, + 0x3e, 0x0, 0xb0, 0x1, 0xc0, 0xa, 0x0, 0x74, + 0x7, 0x80, 0x0, /* U+00FE "þ" */ - 0x70, 0x0, 0x70, 0x0, 0x70, 0x0, 0x77, 0xe0, - 0x7d, 0xb4, 0x70, 0x2c, 0x70, 0x1c, 0x70, 0x1c, + 0x70, 0x0, 0x70, 0x0, 0x70, 0x0, 0x7b, 0xe0, + 0x7d, 0x74, 0x70, 0x2c, 0x70, 0x1c, 0x70, 0x1c, 0x70, 0x1c, 0x70, 0x2c, 0x7d, 0x74, 0x7b, 0xe0, 0x70, 0x0, 0x70, 0x0, 0x70, 0x0, /* U+00FF "ÿ" */ - 0xc, 0xc, 0x0, 0x0, 0x0, 0x0, 0x38, 0xd, - 0x3c, 0x1c, 0x1c, 0x28, 0xd, 0x34, 0xe, 0x70, - 0xb, 0xa0, 0x7, 0xd0, 0x3, 0xc0, 0x3, 0xc0, - 0x3, 0x40, 0x1b, 0x0, 0x2d, 0x0, + 0x30, 0x30, 0x0, 0x0, 0x0, 0x38, 0xd, 0xb0, + 0x31, 0xc2, 0x83, 0x4d, 0xf, 0x30, 0x1d, 0x80, + 0x3d, 0x0, 0xf0, 0x2, 0xc0, 0xa, 0x0, 0x70, + 0xb, 0x40, 0x0, /* U+011E "Ğ" */ 0xd, 0x28, 0x1, 0xfc, 0x0, 0x0, 0x0, 0x1f, - 0xd0, 0x1e, 0x5e, 0xe, 0x1, 0xc3, 0x40, 0x21, + 0xe0, 0x1e, 0x5e, 0xe, 0x1, 0xc3, 0x40, 0x21, 0xc0, 0x0, 0x70, 0x0, 0x1c, 0x1f, 0xc7, 0x0, 0x70, 0xd0, 0xc, 0x38, 0x3, 0x7, 0x96, 0xc0, 0x7f, 0x80, /* U+011F "ğ" */ - 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xdc, 0x3d, 0x7c, 0x34, 0x1c, 0x70, 0x1c, + 0x0, 0x0, 0x1f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xdc, 0x3d, 0x7c, 0x34, 0x1c, 0x70, 0x1c, 0x70, 0x1c, 0x70, 0x1c, 0x34, 0x1c, 0x3d, 0x7c, 0xb, 0xec, 0x0, 0x1c, 0x29, 0x78, 0xb, 0xe0, @@ -903,65 +907,60 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x71, 0xc7, 0x1c, 0x71, 0xc7, 0x1c, 0x70, /* U+0152 "Œ" */ - 0x7, 0xff, 0xfe, 0x1e, 0x1d, 0x0, 0x38, 0x1c, + 0x7, 0xff, 0xfe, 0x1d, 0x6d, 0x0, 0x38, 0x1c, 0x0, 0x30, 0x1c, 0x0, 0x70, 0x1c, 0x0, 0x70, 0x1f, 0xfc, 0x70, 0x1d, 0x0, 0x70, 0x1c, 0x0, - 0x30, 0x1c, 0x0, 0x38, 0x1c, 0x0, 0x1e, 0x1d, + 0x30, 0x1c, 0x0, 0x38, 0x1c, 0x0, 0x1d, 0x6d, 0x0, 0x7, 0xff, 0xff, /* U+0153 "œ" */ - 0xb, 0xd2, 0xf8, 0xb, 0x5e, 0xd7, 0x43, 0x42, - 0xe0, 0xb0, 0xc0, 0x70, 0x1c, 0x70, 0x1f, 0xff, + 0xb, 0xd2, 0xf8, 0xb, 0x5f, 0xd7, 0x83, 0x42, + 0xd0, 0x70, 0xc0, 0x70, 0x1c, 0x70, 0x1f, 0xff, 0xc, 0x7, 0x40, 0x3, 0x42, 0xd0, 0x0, 0xb5, - 0xfd, 0x68, 0xb, 0xd2, 0xfd, 0x0, + 0xfd, 0x58, 0xb, 0xd2, 0xfd, 0x0, /* U+015E "Ş" */ - 0xb, 0xf4, 0xb, 0x5b, 0x43, 0x40, 0xb0, 0xc0, + 0xb, 0xf4, 0xf, 0x57, 0x43, 0x0, 0x70, 0xc0, 0x8, 0x3c, 0x0, 0x3, 0xf4, 0x0, 0x1b, 0xc0, 0x0, 0x3c, 0x20, 0x7, 0xd, 0x1, 0xc2, 0xd5, - 0xe0, 0x1f, 0xe0, 0x1, 0xd0, 0x0, 0x2c, 0x0, - 0x1d, 0x0, + 0xe0, 0x1f, 0xe0, 0x0, 0xe0, 0x0, 0x2c, 0x0, + 0x1e, 0x0, /* U+015F "ş" */ - 0x1f, 0xc0, 0xe7, 0xc7, 0x6, 0xf, 0x0, 0xb, - 0x80, 0x7, 0xc3, 0x7, 0xe, 0x6c, 0xf, 0xc0, - 0xd, 0x0, 0x2c, 0x0, 0xe0, + 0x1f, 0xc0, 0xe7, 0xc7, 0x6, 0xf, 0x0, 0xf, + 0x80, 0x3, 0xc2, 0x7, 0xe, 0x6c, 0xf, 0xc0, + 0xd, 0x0, 0x1c, 0x0, 0xd0, /* U+0160 "Š" */ - 0x4, 0x14, 0x0, 0xdc, 0x0, 0x2c, 0x0, 0x0, - 0x0, 0xb, 0xf4, 0xb, 0x5b, 0x43, 0x40, 0xb0, - 0xc0, 0x8, 0x3c, 0x0, 0x3, 0xf4, 0x0, 0x1b, - 0xc0, 0x0, 0x3c, 0x20, 0x7, 0xd, 0x1, 0xc2, - 0xd5, 0xe0, 0x1f, 0xe0, + 0xa, 0x34, 0x0, 0xf8, 0x0, 0x4, 0x0, 0x2f, + 0xd0, 0x3d, 0x6d, 0xc, 0x2, 0xc3, 0x0, 0x70, + 0xf0, 0x0, 0xf, 0xd0, 0x0, 0x6f, 0x0, 0x0, + 0xf0, 0x40, 0x1c, 0x34, 0x7, 0xb, 0x57, 0x80, + 0x7f, 0x80, /* U+0161 "š" */ - 0xc, 0xd0, 0x1d, 0x0, 0x0, 0x7, 0xe0, 0x39, - 0xe1, 0xc1, 0xc3, 0xc0, 0x2, 0xe0, 0x1, 0xf0, - 0x81, 0xc3, 0x9b, 0x3, 0xf0, + 0xc, 0xd0, 0x1d, 0x0, 0x0, 0x7, 0xf0, 0x39, + 0xf1, 0xc1, 0xc3, 0xc0, 0x3, 0xe0, 0x0, 0xf0, + 0x81, 0xc3, 0x9b, 0x7, 0xf0, /* U+017D "Ž" */ - 0xc, 0xd0, 0x1d, 0x0, 0x0, 0x3f, 0xff, 0x0, - 0x3c, 0x1, 0xc0, 0xe, 0x0, 0x70, 0x3, 0x80, - 0x2c, 0x0, 0xd0, 0xb, 0x0, 0x34, 0x3, 0xc0, + 0xc, 0xc0, 0xd, 0x0, 0x0, 0x3f, 0xff, 0x0, + 0x7c, 0x2, 0xd0, 0xe, 0x0, 0xb0, 0x3, 0x80, + 0x2c, 0x0, 0xe0, 0xb, 0x0, 0x78, 0x3, 0xd0, 0xf, 0xff, 0xc0, /* U+017E "ž" */ - 0x33, 0x3, 0x40, 0x3, 0xff, 0x3, 0xc0, 0xc0, - 0xa0, 0x30, 0x28, 0x1c, 0xe, 0x3, 0xff, - - /* U+1E9E "ẞ" */ - 0xb, 0xe0, 0xf, 0x5f, 0x3, 0x43, 0x81, 0xc1, - 0xc0, 0x70, 0xd0, 0x1c, 0x7e, 0x7, 0x1, 0xe1, - 0xc0, 0x1c, 0x70, 0x7, 0x1c, 0x1, 0xc7, 0x15, - 0xe1, 0xcf, 0xd0, + 0x19, 0x80, 0xa0, 0x0, 0xf, 0xff, 0x1, 0xe0, + 0x3c, 0x7, 0x80, 0xf0, 0x2d, 0x3, 0xc0, 0xf4, + 0xf, 0xff, /* U+2022 "•" */ - 0xb7, 0xff, 0xed, + 0xbb, 0xff, 0xee, /* U+20AC "€" */ - 0x7, 0xf0, 0xb5, 0x43, 0x40, 0x1c, 0x0, 0xff, - 0xc1, 0xd0, 0xf, 0xfc, 0x1d, 0x0, 0x30, 0x0, - 0xe0, 0x1, 0xe5, 0x1, 0xfc, + 0x2, 0xf8, 0x2d, 0x50, 0xd0, 0x3, 0x0, 0x7f, + 0xe0, 0x74, 0x7, 0xfe, 0x7, 0x40, 0xc, 0x0, + 0x34, 0x0, 0xb5, 0x40, 0xbe, /* U+E004 "" */ 0x0, 0x10, 0x0, 0xb, 0xf0, 0x0, 0x3f, 0xf0, @@ -2380,365 +2379,364 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 0, .adv_w = 63, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, {.bitmap_index = 9, .adv_w = 82, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 8}, {.bitmap_index = 14, .adv_w = 140, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 35, .adv_w = 126, .box_w = 8, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 65, .adv_w = 162, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 95, .adv_w = 139, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 122, .adv_w = 45, .box_w = 3, .box_h = 4, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 125, .adv_w = 80, .box_w = 5, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 148, .adv_w = 82, .box_w = 5, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 171, .adv_w = 110, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 184, .adv_w = 127, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 200, .adv_w = 50, .box_w = 4, .box_h = 5, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 205, .adv_w = 64, .box_w = 3, .box_h = 3, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 208, .adv_w = 68, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 210, .adv_w = 95, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 230, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 254, .adv_w = 126, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 269, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 293, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 317, .adv_w = 126, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 338, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 362, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 386, .adv_w = 126, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 407, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 431, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 455, .adv_w = 60, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 462, .adv_w = 52, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 471, .adv_w = 114, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 483, .adv_w = 123, .box_w = 5, .box_h = 6, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 491, .adv_w = 118, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 503, .adv_w = 108, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 524, .adv_w = 197, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 569, .adv_w = 148, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 596, .adv_w = 140, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 620, .adv_w = 145, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 647, .adv_w = 146, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 671, .adv_w = 127, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 692, .adv_w = 123, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 713, .adv_w = 151, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 740, .adv_w = 159, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 767, .adv_w = 64, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 776, .adv_w = 124, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 800, .adv_w = 140, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 827, .adv_w = 122, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 848, .adv_w = 193, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 881, .adv_w = 159, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 908, .adv_w = 154, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 935, .adv_w = 142, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 962, .adv_w = 154, .box_w = 9, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 994, .adv_w = 136, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1018, .adv_w = 133, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1045, .adv_w = 133, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1066, .adv_w = 144, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1093, .adv_w = 144, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1120, .adv_w = 195, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1156, .adv_w = 141, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1183, .adv_w = 134, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1210, .adv_w = 134, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1231, .adv_w = 64, .box_w = 4, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1249, .adv_w = 95, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1269, .adv_w = 64, .box_w = 4, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1287, .adv_w = 95, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 1296, .adv_w = 104, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1301, .adv_w = 79, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 10}, - {.bitmap_index = 1304, .adv_w = 123, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1320, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1344, .adv_w = 118, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1362, .adv_w = 127, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1386, .adv_w = 120, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1404, .adv_w = 81, .box_w = 5, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1422, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1446, .adv_w = 124, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1467, .adv_w = 59, .box_w = 3, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1476, .adv_w = 57, .box_w = 4, .box_h = 15, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 1491, .adv_w = 115, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1512, .adv_w = 59, .box_w = 3, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1521, .adv_w = 193, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1546, .adv_w = 124, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1562, .adv_w = 129, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1580, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1604, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1628, .adv_w = 78, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1641, .adv_w = 117, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1657, .adv_w = 76, .box_w = 4, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1668, .adv_w = 124, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1684, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1700, .adv_w = 166, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1723, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1739, .adv_w = 107, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1760, .adv_w = 112, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1772, .adv_w = 79, .box_w = 5, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1794, .adv_w = 63, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1805, .adv_w = 79, .box_w = 5, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1827, .adv_w = 151, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 1839, .adv_w = 59, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1839, .adv_w = 59, .box_w = 3, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1848, .adv_w = 131, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1872, .adv_w = 96, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 7}, - {.bitmap_index = 1881, .adv_w = 120, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1896, .adv_w = 84, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 1905, .adv_w = 84, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 1914, .adv_w = 128, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1935, .adv_w = 108, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1956, .adv_w = 148, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1990, .adv_w = 148, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2024, .adv_w = 148, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2058, .adv_w = 148, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2094, .adv_w = 148, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2132, .adv_w = 148, .box_w = 9, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2171, .adv_w = 208, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2210, .adv_w = 145, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2244, .adv_w = 127, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2271, .adv_w = 127, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2298, .adv_w = 127, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2325, .adv_w = 127, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2352, .adv_w = 64, .box_w = 5, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2371, .adv_w = 64, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2386, .adv_w = 64, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2405, .adv_w = 64, .box_w = 7, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2432, .adv_w = 150, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2459, .adv_w = 159, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2495, .adv_w = 154, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2531, .adv_w = 154, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2567, .adv_w = 154, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2603, .adv_w = 154, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2639, .adv_w = 154, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2675, .adv_w = 121, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 2691, .adv_w = 154, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2721, .adv_w = 144, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2755, .adv_w = 144, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2789, .adv_w = 144, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2823, .adv_w = 144, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2859, .adv_w = 134, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2893, .adv_w = 132, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2917, .adv_w = 134, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2941, .adv_w = 123, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2962, .adv_w = 123, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2983, .adv_w = 123, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3004, .adv_w = 123, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3027, .adv_w = 123, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3048, .adv_w = 123, .box_w = 7, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3075, .adv_w = 187, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3102, .adv_w = 118, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3126, .adv_w = 120, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3150, .adv_w = 120, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3174, .adv_w = 120, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3198, .adv_w = 120, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3222, .adv_w = 60, .box_w = 5, .box_h = 12, .ofs_x = -2, .ofs_y = 0}, - {.bitmap_index = 3237, .adv_w = 60, .box_w = 4, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3249, .adv_w = 60, .box_w = 5, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3264, .adv_w = 60, .box_w = 7, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3285, .adv_w = 132, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3311, .adv_w = 124, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3334, .adv_w = 129, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3358, .adv_w = 129, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3382, .adv_w = 129, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3406, .adv_w = 129, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3432, .adv_w = 129, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3456, .adv_w = 128, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 3474, .adv_w = 128, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3496, .adv_w = 124, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3517, .adv_w = 124, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3538, .adv_w = 124, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3559, .adv_w = 124, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3580, .adv_w = 107, .box_w = 7, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3607, .adv_w = 130, .box_w = 8, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3637, .adv_w = 107, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 3667, .adv_w = 151, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3701, .adv_w = 126, .box_w = 8, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3733, .adv_w = 64, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3745, .adv_w = 60, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3752, .adv_w = 212, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3788, .adv_w = 199, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3818, .adv_w = 133, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3852, .adv_w = 117, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3873, .adv_w = 133, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3909, .adv_w = 117, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3930, .adv_w = 134, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3957, .adv_w = 112, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3972, .adv_w = 144, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3999, .adv_w = 86, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 4002, .adv_w = 126, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4023, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 4054, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 4089, .adv_w = 256, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 4140, .adv_w = 256, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4192, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4225, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4258, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4291, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4324, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 4352, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 4397, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4446, .adv_w = 256, .box_w = 9, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 4478, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4520, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 4556, .adv_w = 256, .box_w = 10, .box_h = 15, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 4594, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 4624, .adv_w = 256, .box_w = 8, .box_h = 6, .ofs_x = 4, .ofs_y = 3}, - {.bitmap_index = 4636, .adv_w = 256, .box_w = 6, .box_h = 8, .ofs_x = 5, .ofs_y = 2}, - {.bitmap_index = 4648, .adv_w = 256, .box_w = 6, .box_h = 8, .ofs_x = 5, .ofs_y = 2}, - {.bitmap_index = 4660, .adv_w = 256, .box_w = 8, .box_h = 6, .ofs_x = 4, .ofs_y = 3}, - {.bitmap_index = 4672, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4721, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 4746, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4788, .adv_w = 256, .box_w = 3, .box_h = 11, .ofs_x = 7, .ofs_y = 1}, - {.bitmap_index = 4797, .adv_w = 256, .box_w = 15, .box_h = 11, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 4839, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4888, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 4921, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 4956, .adv_w = 256, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5001, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5043, .adv_w = 256, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 5083, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5129, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5177, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5223, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 5258, .adv_w = 256, .box_w = 11, .box_h = 15, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 5300, .adv_w = 256, .box_w = 10, .box_h = 2, .ofs_x = 3, .ofs_y = 5}, - {.bitmap_index = 5305, .adv_w = 256, .box_w = 8, .box_h = 10, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 5325, .adv_w = 256, .box_w = 8, .box_h = 10, .ofs_x = 5, .ofs_y = 1}, - {.bitmap_index = 5345, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 5370, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5403, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5452, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5498, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5544, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5590, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5639, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 5672, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 5697, .adv_w = 256, .box_w = 8, .box_h = 8, .ofs_x = 4, .ofs_y = 2}, - {.bitmap_index = 5713, .adv_w = 256, .box_w = 8, .box_h = 8, .ofs_x = 4, .ofs_y = 2}, - {.bitmap_index = 5729, .adv_w = 256, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5774, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 5809, .adv_w = 256, .box_w = 8, .box_h = 8, .ofs_x = 4, .ofs_y = 2}, - {.bitmap_index = 5825, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5874, .adv_w = 256, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5926, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 5954, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 5999, .adv_w = 256, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 6047, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6083, .adv_w = 256, .box_w = 9, .box_h = 12, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6110, .adv_w = 256, .box_w = 8, .box_h = 12, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 6134, .adv_w = 256, .box_w = 8, .box_h = 12, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 6158, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6204, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6257, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6299, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6352, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6400, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6436, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 6475, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6521, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 6554, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 6593, .adv_w = 256, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 6641, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6683, .adv_w = 256, .box_w = 8, .box_h = 12, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 6707, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6749, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6785, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6821, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 6878, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6927, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 6972, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7018, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7060, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7099, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7138, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7171, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7213, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7255, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7301, .adv_w = 256, .box_w = 7, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 7326, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7368, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7401, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 7436, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7485, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7530, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7579, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7621, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7663, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7696, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7738, .adv_w = 256, .box_w = 14, .box_h = 7, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7763, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 7798, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7854, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7907, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7975, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8023, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8079, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8127, .adv_w = 176, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8158, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8222, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8286, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8349, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8413, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8467, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8516, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8580, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8608, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8650, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8722, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8770, .adv_w = 176, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8814, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 8854, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 8917, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8966, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 9015, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 9055, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 9111, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 9146, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 9181, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 9230, .adv_w = 224, .box_w = 14, .box_h = 3, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 9241, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9295, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9375, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 9455, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9519, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 9554, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 9589, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 9659, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9707, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9771, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 9844, .adv_w = 256, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9893, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 9946, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10002, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 10051, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 10100, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10148, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 10196, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10252, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10308, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10362, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 10443, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 10485, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10533, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 10586, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 10625, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 10700, .adv_w = 256, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 10740, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10776, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 10815, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10851, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 10901, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 10951, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 11001, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 11051, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 11101, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 11175, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 11223, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 11251, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 11279, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 11307, .adv_w = 256, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 11347, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11386, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11425, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11481, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 11554, .adv_w = 256, .box_w = 8, .box_h = 16, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 11586, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11646, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11694, .adv_w = 258, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 1} + {.bitmap_index = 35, .adv_w = 126, .box_w = 8, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67, .adv_w = 162, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 97, .adv_w = 139, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 124, .adv_w = 45, .box_w = 3, .box_h = 4, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 127, .adv_w = 80, .box_w = 5, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 150, .adv_w = 82, .box_w = 5, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 173, .adv_w = 110, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 186, .adv_w = 127, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 204, .adv_w = 50, .box_w = 4, .box_h = 5, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 209, .adv_w = 64, .box_w = 3, .box_h = 3, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 212, .adv_w = 68, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 214, .adv_w = 95, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 234, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 258, .adv_w = 126, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 273, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 297, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 321, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 345, .adv_w = 126, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 366, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 390, .adv_w = 126, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 411, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 435, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 459, .adv_w = 60, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 466, .adv_w = 52, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 475, .adv_w = 114, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 487, .adv_w = 123, .box_w = 5, .box_h = 6, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 495, .adv_w = 118, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 507, .adv_w = 108, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 528, .adv_w = 197, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 573, .adv_w = 148, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 600, .adv_w = 140, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 624, .adv_w = 145, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 651, .adv_w = 146, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 678, .adv_w = 127, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 699, .adv_w = 123, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 720, .adv_w = 151, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 747, .adv_w = 159, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 774, .adv_w = 64, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 783, .adv_w = 124, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 807, .adv_w = 140, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 834, .adv_w = 122, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 855, .adv_w = 193, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 888, .adv_w = 159, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 915, .adv_w = 154, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 942, .adv_w = 142, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 969, .adv_w = 154, .box_w = 9, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1001, .adv_w = 136, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1025, .adv_w = 133, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1052, .adv_w = 133, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1079, .adv_w = 144, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1106, .adv_w = 144, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1133, .adv_w = 195, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1169, .adv_w = 141, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1196, .adv_w = 134, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1223, .adv_w = 134, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1244, .adv_w = 64, .box_w = 4, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1262, .adv_w = 95, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1282, .adv_w = 64, .box_w = 4, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1300, .adv_w = 95, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 1309, .adv_w = 104, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1314, .adv_w = 79, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 1317, .adv_w = 123, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1333, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1357, .adv_w = 118, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1375, .adv_w = 127, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1399, .adv_w = 120, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1417, .adv_w = 81, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1435, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1459, .adv_w = 124, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1480, .adv_w = 59, .box_w = 3, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1489, .adv_w = 57, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1504, .adv_w = 115, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1525, .adv_w = 59, .box_w = 3, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1534, .adv_w = 193, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1561, .adv_w = 124, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1577, .adv_w = 129, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1595, .adv_w = 126, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1619, .adv_w = 128, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1643, .adv_w = 78, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1655, .adv_w = 117, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1671, .adv_w = 76, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1685, .adv_w = 124, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1701, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1717, .adv_w = 166, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1742, .adv_w = 112, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1758, .adv_w = 107, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1779, .adv_w = 112, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1793, .adv_w = 79, .box_w = 5, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1815, .adv_w = 63, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1826, .adv_w = 79, .box_w = 5, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1849, .adv_w = 151, .box_w = 8, .box_h = 5, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 1859, .adv_w = 59, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1859, .adv_w = 59, .box_w = 3, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1868, .adv_w = 131, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1895, .adv_w = 96, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 1904, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1924, .adv_w = 84, .box_w = 4, .box_h = 6, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 1930, .adv_w = 84, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 1938, .adv_w = 128, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1959, .adv_w = 108, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1980, .adv_w = 148, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2014, .adv_w = 148, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2048, .adv_w = 148, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2082, .adv_w = 148, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2118, .adv_w = 148, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2152, .adv_w = 148, .box_w = 9, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2191, .adv_w = 208, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2230, .adv_w = 145, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2264, .adv_w = 127, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2291, .adv_w = 127, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2318, .adv_w = 127, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2345, .adv_w = 127, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2372, .adv_w = 64, .box_w = 5, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2391, .adv_w = 64, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2406, .adv_w = 64, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2425, .adv_w = 64, .box_w = 7, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2452, .adv_w = 150, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2482, .adv_w = 159, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2518, .adv_w = 154, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2554, .adv_w = 154, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2590, .adv_w = 154, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2626, .adv_w = 154, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2662, .adv_w = 154, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2698, .adv_w = 121, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 2714, .adv_w = 154, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2744, .adv_w = 144, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2778, .adv_w = 144, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2812, .adv_w = 144, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2846, .adv_w = 144, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2882, .adv_w = 134, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2916, .adv_w = 132, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2940, .adv_w = 134, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2964, .adv_w = 123, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2985, .adv_w = 123, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3006, .adv_w = 123, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3027, .adv_w = 123, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3050, .adv_w = 123, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3071, .adv_w = 123, .box_w = 7, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3098, .adv_w = 187, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3125, .adv_w = 118, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3149, .adv_w = 120, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3173, .adv_w = 120, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3197, .adv_w = 120, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3221, .adv_w = 120, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3245, .adv_w = 60, .box_w = 5, .box_h = 12, .ofs_x = -2, .ofs_y = 0}, + {.bitmap_index = 3260, .adv_w = 60, .box_w = 4, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3272, .adv_w = 60, .box_w = 5, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3287, .adv_w = 60, .box_w = 7, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3308, .adv_w = 132, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3334, .adv_w = 124, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3357, .adv_w = 129, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3381, .adv_w = 129, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3405, .adv_w = 129, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3429, .adv_w = 129, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3455, .adv_w = 129, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3479, .adv_w = 128, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 3497, .adv_w = 128, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3519, .adv_w = 124, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3540, .adv_w = 124, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3561, .adv_w = 124, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3582, .adv_w = 124, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3603, .adv_w = 107, .box_w = 7, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3630, .adv_w = 130, .box_w = 8, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3660, .adv_w = 107, .box_w = 7, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3687, .adv_w = 151, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3721, .adv_w = 126, .box_w = 8, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3753, .adv_w = 64, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3765, .adv_w = 60, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3772, .adv_w = 212, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3808, .adv_w = 199, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3838, .adv_w = 133, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3872, .adv_w = 117, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3893, .adv_w = 133, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3927, .adv_w = 117, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3948, .adv_w = 134, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3975, .adv_w = 112, .box_w = 6, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3993, .adv_w = 86, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 3996, .adv_w = 126, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4017, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 4048, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4083, .adv_w = 256, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 4134, .adv_w = 256, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4186, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4219, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4252, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4285, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4318, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 4346, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 4391, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4440, .adv_w = 256, .box_w = 9, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 4472, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4514, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4550, .adv_w = 256, .box_w = 10, .box_h = 15, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 4588, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 4618, .adv_w = 256, .box_w = 8, .box_h = 6, .ofs_x = 4, .ofs_y = 3}, + {.bitmap_index = 4630, .adv_w = 256, .box_w = 6, .box_h = 8, .ofs_x = 5, .ofs_y = 2}, + {.bitmap_index = 4642, .adv_w = 256, .box_w = 6, .box_h = 8, .ofs_x = 5, .ofs_y = 2}, + {.bitmap_index = 4654, .adv_w = 256, .box_w = 8, .box_h = 6, .ofs_x = 4, .ofs_y = 3}, + {.bitmap_index = 4666, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4715, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 4740, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4782, .adv_w = 256, .box_w = 3, .box_h = 11, .ofs_x = 7, .ofs_y = 1}, + {.bitmap_index = 4791, .adv_w = 256, .box_w = 15, .box_h = 11, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 4833, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4882, .adv_w = 256, .box_w = 10, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 4915, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 4950, .adv_w = 256, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4995, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5037, .adv_w = 256, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 5077, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5123, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5171, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5217, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 5252, .adv_w = 256, .box_w = 11, .box_h = 15, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 5294, .adv_w = 256, .box_w = 10, .box_h = 2, .ofs_x = 3, .ofs_y = 5}, + {.bitmap_index = 5299, .adv_w = 256, .box_w = 8, .box_h = 10, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 5319, .adv_w = 256, .box_w = 8, .box_h = 10, .ofs_x = 5, .ofs_y = 1}, + {.bitmap_index = 5339, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 5364, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5397, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5446, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5492, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5538, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5584, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5633, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 5666, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 5691, .adv_w = 256, .box_w = 8, .box_h = 8, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 5707, .adv_w = 256, .box_w = 8, .box_h = 8, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 5723, .adv_w = 256, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5768, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 5803, .adv_w = 256, .box_w = 8, .box_h = 8, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 5819, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5868, .adv_w = 256, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5920, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 5948, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5993, .adv_w = 256, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 6041, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6077, .adv_w = 256, .box_w = 9, .box_h = 12, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6104, .adv_w = 256, .box_w = 8, .box_h = 12, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 6128, .adv_w = 256, .box_w = 8, .box_h = 12, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 6152, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6198, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6251, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6293, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6346, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6394, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6430, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 6469, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6515, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 6548, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 6587, .adv_w = 256, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 6635, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6677, .adv_w = 256, .box_w = 8, .box_h = 12, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 6701, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6743, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6779, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6815, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 6872, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6921, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 6966, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7012, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7054, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7093, .adv_w = 256, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7132, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7165, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7207, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7249, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7295, .adv_w = 256, .box_w = 7, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 7320, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7362, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7395, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 7430, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7479, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7524, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7573, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7615, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7657, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7690, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7732, .adv_w = 256, .box_w = 14, .box_h = 7, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7757, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 7792, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7848, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7901, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7969, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8017, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8073, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8121, .adv_w = 176, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8152, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8216, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8280, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8343, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8407, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8461, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8510, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8574, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8602, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8644, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8716, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8764, .adv_w = 176, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8808, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 8848, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8911, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8960, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9009, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 9049, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 9105, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9140, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9175, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9224, .adv_w = 224, .box_w = 14, .box_h = 3, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 9235, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9289, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9369, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 9449, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9513, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9548, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9583, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9653, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9701, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9765, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 9838, .adv_w = 256, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9887, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9940, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9996, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10045, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10094, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10142, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 10190, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10246, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10302, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10356, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 10437, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10479, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10527, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10580, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 10619, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10694, .adv_w = 256, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 10734, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10770, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 10809, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10845, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 10895, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 10945, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 10995, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 11045, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 11095, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 11169, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11217, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 11245, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 11273, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 11301, .adv_w = 256, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 11341, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11380, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11419, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11475, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 11548, .adv_w = 256, .box_w = 8, .box_h = 16, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 11580, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11640, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11688, .adv_w = 258, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 1} }; /*--------------------- @@ -2751,30 +2749,30 @@ static const uint16_t unicode_list_1[] = { static const uint16_t unicode_list_3[] = { 0x0, 0x1, 0x12, 0x13, 0x34, 0x35, 0x40, 0x41, - 0x42, 0x43, 0x5f, 0x60, 0x1d80, 0x1f04, 0x1f8e, 0xdee6, - 0xdef3, 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, - 0xdf7c, 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, - 0xe023, 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, - 0xe0f2, 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, - 0xe20c, 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, - 0xe31a, 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, - 0xe390, 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, - 0xe447, 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, - 0xe48a, 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, - 0xe583, 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, - 0xe5f9, 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, - 0xe7bf, 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, - 0xe952, 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, - 0xeeea, 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, - 0xeefe, 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, - 0xef2a, 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, - 0xef49, 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, - 0xef5b, 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, - 0xefab, 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, - 0xf03d, 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, - 0xf122, 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, - 0xf184, 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, - 0xf43c, 0xf6a4, 0xf784 + 0x42, 0x43, 0x5f, 0x60, 0x1f04, 0x1f8e, 0xdee6, 0xdef3, + 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, 0xdf7c, + 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, 0xe023, + 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, 0xe0f2, + 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, 0xe20c, + 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, 0xe31a, + 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, 0xe390, + 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, 0xe447, + 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, 0xe48a, + 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, 0xe583, + 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, 0xe5f9, + 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, 0xe7bf, + 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, 0xe952, + 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, 0xeeea, + 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, 0xeefe, + 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, 0xef2a, + 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, 0xef49, + 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, 0xef5b, + 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, 0xefab, + 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, 0xf03d, + 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, 0xf122, + 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, 0xf184, + 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, 0xf43c, + 0xf6a4, 0xf784 }; /*Collect the unicode lists and glyph_id offsets*/ @@ -2794,7 +2792,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = }, { .range_start = 286, .range_length = 63365, .glyph_id_start = 169, - .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 195, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 194, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_20_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_20_latin1.c index 76a2013a8..2c83d1744 100644 --- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_20_latin1.c +++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_20_latin1.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 20 px * Bpp: 2 - * Opts: --no-kerning --bpp 2 --size 20 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_20_latin1.c --format lvgl + * Opts: --no-kerning --bpp 2 --size 20 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_20_latin1.c --format lvgl ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -25,63 +25,64 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0020 " " */ /* U+0021 "!" */ - 0xf0, 0x7f, 0xf1, 0xbc, 0x1b, 0x80, + 0xe0, 0xff, 0xe3, 0x70, 0x6e, 0x0, /* U+0022 "\"" */ - 0xfc, 0x21, 0xff, 0x62, + 0xe9, 0x87, 0xff, 0x7, 0x10, /* U+0023 "#" */ - 0xa, 0xc1, 0xc1, 0x28, 0x2c, 0x36, 0x22, 0x4, - 0x4c, 0x1e, 0x8f, 0x26, 0xa0, 0x28, 0xd, 0x6, - 0x85, 0x3, 0xff, 0x81, 0x88, 0x94, 0x3b, 0x28, - 0xa1, 0x61, 0x5a, 0x78, 0x7c, 0x28, 0x2c, 0x36, - 0x1f, 0xe4, 0x40, + 0xa, 0xc1, 0xc1, 0x28, 0x2c, 0x36, 0x22, 0x1f, + 0xdf, 0x17, 0x1a, 0x80, 0xa0, 0x34, 0x1a, 0x14, + 0xf, 0xfe, 0x6, 0x22, 0x50, 0xec, 0xa2, 0x85, + 0x85, 0x69, 0xe1, 0xf0, 0xa0, 0xb0, 0xd8, 0x7f, + 0x91, 0x0, /* U+0024 "$" */ - 0xb, 0xc1, 0xff, 0xc1, 0x40, 0x85, 0xc0, 0xa0, - 0x8f, 0x84, 0xc8, 0x11, 0x7, 0x21, 0x90, 0xba, - 0x12, 0x1d, 0x16, 0x84, 0xe9, 0x40, 0xd6, 0x28, - 0x3a, 0x3d, 0x4, 0x84, 0x87, 0x92, 0x4, 0x72, - 0xbc, 0xb1, 0x60, 0xe0, 0xfe, + 0xa, 0xc3, 0xff, 0x83, 0x24, 0x16, 0x81, 0xc8, + 0x14, 0x2, 0xd, 0x51, 0x87, 0x20, 0xc3, 0xb9, + 0x34, 0x3b, 0x2d, 0xd, 0xe6, 0x81, 0xd2, 0xf0, + 0x51, 0xd0, 0x3c, 0x86, 0x41, 0x9d, 0x44, 0xc2, + 0xd8, 0x1d, 0x20, 0xff, 0x0, /* U+0025 "%" */ - 0x2e, 0xf, 0xa5, 0xa0, 0xf2, 0x42, 0x9, 0xf, - 0xe5, 0x7, 0xe9, 0x9, 0x21, 0x18, 0x29, 0x6a, - 0x83, 0xae, 0x14, 0x1f, 0xa8, 0xfa, 0xe, 0x48, - 0x54, 0x15, 0x33, 0x84, 0x25, 0x7, 0xeb, 0xf, - 0xe8, 0x19, 0xc2, 0x1c, 0xc2, 0xa0, + 0x3e, 0xf, 0xa1, 0x20, 0xf2, 0x42, 0x9, 0x9, + 0x10, 0x94, 0x12, 0x20, 0x90, 0x92, 0x11, 0x82, + 0x84, 0xa8, 0x3b, 0xe1, 0x41, 0xfa, 0x8f, 0xa0, + 0xe4, 0x85, 0x41, 0x53, 0x38, 0x42, 0x50, 0x64, + 0x2b, 0xe, 0x42, 0x81, 0x9c, 0x21, 0xcc, 0x2a, /* U+0026 "&" */ - 0x5, 0xe8, 0x39, 0x7a, 0xd, 0x14, 0x10, 0xff, - 0xe3, 0xa1, 0xa2, 0xc8, 0x32, 0x26, 0x1c, 0x81, - 0xf, 0x42, 0xc7, 0x88, 0xe2, 0xc, 0x85, 0x98, - 0x87, 0x90, 0x62, 0x1b, 0x2, 0x47, 0x50, 0x20, - 0x62, 0xda, 0xc0, + 0x5, 0xe8, 0x3a, 0x5d, 0x6, 0x4a, 0x8, 0x7f, + 0xf1, 0xd0, 0xc9, 0x64, 0x1a, 0x13, 0xe, 0x43, + 0xfa, 0x11, 0x3c, 0x67, 0x10, 0x7e, 0x8c, 0x43, + 0x94, 0xc, 0x43, 0x60, 0x48, 0xea, 0x4, 0xc, + 0x5b, 0x14, /* U+0027 "'" */ - 0xf0, 0x7e, + 0xe0, 0xfc, /* U+0028 "(" */ - 0xf, 0xd2, 0x9, 0x40, 0x60, 0x42, 0x6, 0x2, - 0x20, 0xc3, 0x21, 0xff, 0xd1, 0x43, 0x61, 0x91, - 0xd, 0x85, 0x21, 0x24, 0x16, 0xa0, 0xb4, + 0xf, 0xda, 0x8, 0x40, 0xc0, 0x84, 0xc, 0x4, + 0x41, 0x86, 0x43, 0xfc, 0x87, 0xf2, 0x1f, 0x90, + 0xd8, 0x64, 0x43, 0x61, 0x48, 0x49, 0x5, 0xa8, + 0x2d, /* U+0029 ")" */ - 0xe, 0x90, 0xa8, 0x84, 0xc1, 0x42, 0x1a, 0x9, - 0xd, 0x88, 0x13, 0xf, 0xfe, 0x8e, 0x4, 0x41, - 0x86, 0x50, 0x12, 0x5, 0x1, 0x28, 0x1c, 0x10, + 0xe, 0xa0, 0x52, 0x82, 0x60, 0xa1, 0xd, 0x4, + 0x86, 0xc4, 0x9, 0x87, 0xff, 0x47, 0x2, 0x20, + 0xc3, 0x28, 0x9, 0x2, 0x41, 0x10, 0x3c, 0x10, /* U+002A "*" */ - 0xd, 0xe0, 0xff, 0xe1, 0xc1, 0xe4, 0xf, 0x81, - 0xe8, 0x1c, 0x13, 0x61, 0x21, 0x90, 0xd1, 0xac, - 0x19, 0x88, 0xc3, 0x68, 0x38, 0x0, + 0xd, 0xc1, 0xff, 0xc3, 0x83, 0xc8, 0x1f, 0xf, + 0xa0, 0x70, 0x4d, 0x84, 0x86, 0x43, 0x46, 0xb0, + 0x66, 0x23, 0xd, 0xa0, 0xe0, 0x0, /* U+002B "+" */ - 0xb, 0xc1, 0xff, 0xd7, 0xf8, 0x1f, 0x2c, 0x5, - 0xaa, 0x5, 0x41, 0xff, 0xcc, + 0xb, 0x83, 0xff, 0x9f, 0x50, 0xd4, 0xb0, 0x16, + 0xf8, 0x7e, 0xf, 0xfe, 0x7b, 0x84, /* U+002C "," */ - 0x3c, 0x4, 0x24, 0xb4, 0xa0, + 0x38, 0x3c, 0x96, 0x94, 0x0, /* U+002D "-" */ 0xac, 0xb8, @@ -96,31 +97,31 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x80, /* U+0030 "0" */ - 0x5, 0xe8, 0x2d, 0x74, 0x25, 0x4a, 0x21, 0x4, - 0x41, 0xff, 0xd3, 0x43, 0xe4, 0x3f, 0xf9, 0x7c, - 0x20, 0x85, 0x15, 0x28, 0x1a, 0xe8, + 0x7, 0xd0, 0x58, 0xb4, 0x25, 0x4a, 0x31, 0x4, + 0x48, 0x7e, 0x43, 0xff, 0xa6, 0x87, 0xff, 0x9, + 0xf, 0x78, 0x41, 0xa, 0x2a, 0x50, 0x35, 0xd0, /* U+0031 "1" */ - 0xa, 0x85, 0xab, 0x50, 0x1e, 0x4, 0x1f, 0xfe, - 0xa0, + 0xa, 0x85, 0xa6, 0xa0, 0x3c, 0x8, 0x3f, 0xfd, + 0x40, /* U+0032 "2" */ - 0x5, 0xe8, 0x2d, 0x76, 0x45, 0x61, 0x42, 0x4, - 0xd8, 0x3d, 0x21, 0x26, 0x1d, 0x88, 0x65, 0x83, - 0xa2, 0xd, 0x90, 0x68, 0x50, 0x4a, 0x20, 0xd1, - 0x86, 0xc6, 0xb8, 0xb, 0xe0, + 0x5, 0xe8, 0x2d, 0x76, 0x47, 0x51, 0x21, 0x90, + 0x30, 0x7a, 0x43, 0xb0, 0xe8, 0x43, 0x2c, 0x1d, + 0x10, 0x6c, 0x83, 0x42, 0x82, 0x51, 0x6, 0x8c, + 0x36, 0x35, 0xc0, 0x5f, 0x0, /* U+0033 "3" */ - 0x1f, 0x90, 0x42, 0x4c, 0x76, 0x48, 0x7b, 0xc1, - 0xff, 0x20, 0x6c, 0x81, 0xa2, 0x15, 0xac, 0x1a, - 0x20, 0xfb, 0xc1, 0xc8, 0x73, 0x9d, 0x9b, 0x9, - 0x20, + 0x7, 0xd0, 0x58, 0xb6, 0x47, 0x50, 0xa0, 0xc9, + 0xf0, 0x7f, 0xc9, 0x84, 0xa8, 0x41, 0x51, 0x85, + 0x51, 0x86, 0x54, 0x41, 0xc8, 0x3c, 0x1f, 0xf2, + 0x71, 0xd4, 0x2a, 0x16, 0xc0, /* U+0034 "4" */ - 0xe, 0xf0, 0x7a, 0xf, 0xc8, 0x7d, 0x7, 0xe6, - 0xf, 0x42, 0x1e, 0x50, 0x7a, 0x20, 0xf2, 0x83, - 0xd1, 0x7, 0x93, 0xe0, 0x79, 0x78, 0xa, 0xae, - 0x5, 0x3, 0xff, 0x8c, + 0xe, 0x78, 0x3e, 0x83, 0xf2, 0x1f, 0xd2, 0x1f, + 0x24, 0x1f, 0x48, 0x7c, 0x90, 0x7d, 0x21, 0xf4, + 0x41, 0xf2, 0x83, 0xe4, 0x7e, 0x1e, 0x17, 0x80, + 0xed, 0x70, 0xc8, 0x7f, 0xf2, 0x0, /* U+0035 "5" */ 0x3f, 0xc8, 0x4b, 0xc0, 0x6b, 0x5, 0x87, 0xff, @@ -129,35 +130,35 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xe8, 0x89, 0xae, 0xc0, /* U+0036 "6" */ - 0xa, 0xf0, 0x6d, 0x10, 0xb2, 0xe0, 0x24, 0x86, + 0xa, 0xf0, 0x6d, 0x60, 0xb3, 0xa0, 0x12, 0xe, 0xc4, 0x39, 0x2, 0x83, 0xba, 0x70, 0x4f, 0x84, - 0x28, 0x19, 0x7, 0xff, 0x11, 0xf, 0xb2, 0x2, - 0x68, 0xd4, 0x26, 0xbb, 0x0, + 0x28, 0x11, 0x7, 0x21, 0xfe, 0x43, 0xec, 0x41, + 0x1a, 0x54, 0x89, 0xae, 0xc0, /* U+0037 "7" */ 0xff, 0xcb, 0xe0, 0x57, 0x88, 0x39, 0x10, 0xe8, 0x3f, 0x41, 0xd0, 0x87, 0x21, 0xe4, 0x83, 0xb1, - 0xe, 0x50, 0x72, 0x61, 0xd8, 0x87, 0x28, 0x39, - 0x30, 0xc0, + 0xe, 0x43, 0xc9, 0x7, 0x62, 0x1c, 0xa0, 0xe4, + 0xc3, 0x0, /* U+0038 "8" */ 0x7, 0xc8, 0x58, 0x92, 0x45, 0x32, 0x9, 0xf, - 0xfe, 0xe, 0x21, 0x22, 0x53, 0x20, 0x42, 0x20, - 0x67, 0xce, 0x44, 0x8, 0x43, 0x93, 0xf, 0xc8, - 0x64, 0xe3, 0xa8, 0x4c, 0x5b, 0x0, + 0xfe, 0x1a, 0x1d, 0x17, 0x88, 0x3f, 0x90, 0x50, + 0x88, 0xd5, 0x10, 0x72, 0x1f, 0xe4, 0x32, 0x71, + 0xd4, 0x26, 0x2d, 0x80, /* U+0039 "9" */ - 0x5, 0xe8, 0x2d, 0x74, 0x25, 0x42, 0x42, 0x8, + 0x7, 0xd0, 0x58, 0xb4, 0x45, 0x42, 0x22, 0x8, 0x43, 0x93, 0xf, 0xfe, 0x22, 0x20, 0x81, 0x15, 0x21, 0x42, 0xa0, 0x9f, 0x93, 0xe, 0x84, 0x32, - 0xc1, 0x5c, 0x41, 0x25, 0x80, + 0xc1, 0x5c, 0x40, 0x50, 0xe0, /* U+003A ":" */ 0xe0, 0x70, 0x7f, 0xf0, 0x38, 0x0, /* U+003B ";" */ - 0x2c, 0x41, 0xe0, 0xff, 0xe2, 0x28, 0xa0, 0x72, - 0x8d, 0x90, + 0x3c, 0x1b, 0xc1, 0xff, 0xc4, 0x51, 0xc2, 0x19, + 0x26, 0x40, /* U+003C "<" */ 0xe, 0x50, 0x6e, 0xc1, 0x63, 0x3a, 0xb8, 0x8e, @@ -173,129 +174,129 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x87, 0x80, /* U+003F "?" */ - 0x1f, 0x91, 0x84, 0x88, 0xe8, 0x4c, 0x4, 0x12, - 0x1f, 0xc9, 0x86, 0x84, 0x2c, 0xc2, 0x44, 0x36, - 0x41, 0xc8, 0x75, 0x3, 0xff, 0x81, 0x61, 0xfe, + 0x1f, 0x91, 0x84, 0x88, 0xec, 0x98, 0x3a, 0x43, + 0xf9, 0x30, 0xd0, 0x85, 0x98, 0x48, 0x86, 0xc8, + 0x39, 0xe, 0xa0, 0x7f, 0xf0, 0x2c, 0x3f, 0xc0, /* U+0040 "@" */ - 0xd, 0x7d, 0x7, 0xda, 0x2d, 0xa1, 0xb2, 0xe9, - 0xe9, 0x4, 0x48, 0x75, 0x0, 0x88, 0x14, 0x4, - 0x9, 0x3, 0xa6, 0xa, 0x62, 0x67, 0x8, 0x88, - 0x12, 0xf, 0x21, 0x62, 0x12, 0x1e, 0x42, 0xc3, - 0xff, 0x9a, 0x84, 0x87, 0xff, 0x3, 0x90, 0x27, - 0x81, 0xca, 0xca, 0x1, 0xd1, 0xc4, 0x4f, 0x45, - 0xe0, 0xa3, 0xf, 0xf3, 0x1d, 0x5a, 0x1c, 0xeb, - 0xe0, 0x80, + 0xd, 0x7d, 0x21, 0xed, 0x14, 0x50, 0x36, 0x5d, + 0x5a, 0x81, 0x12, 0x1d, 0xc0, 0x44, 0xa, 0x9, + 0x62, 0x5, 0x5a, 0x7c, 0x22, 0xac, 0x25, 0x82, + 0x94, 0x1f, 0xf6, 0x1f, 0x91, 0x10, 0x90, 0xc8, + 0x7f, 0xf1, 0x90, 0xff, 0x26, 0x12, 0xc0, 0x4a, + 0x24, 0xd3, 0x12, 0x1e, 0x68, 0x24, 0x3e, 0x1f, + 0x20, 0x8c, 0x3f, 0xcc, 0x75, 0x68, 0x73, 0x2f, + 0x82, /* U+0041 "A" */ - 0xe, 0xe0, 0xfe, 0x44, 0x3f, 0xa0, 0x21, 0xfc, - 0x98, 0x7c, 0x92, 0x83, 0xec, 0x18, 0x7e, 0x50, - 0x90, 0x72, 0x61, 0x21, 0xd8, 0x81, 0xf, 0x25, - 0x40, 0x43, 0xcb, 0x88, 0x28, 0xfe, 0x43, 0x21, - 0xec, 0x42, 0x43, 0x93, 0x13, 0xf, 0x90, + 0xe, 0xb4, 0x3f, 0x92, 0xf, 0xfe, 0x42, 0x22, + 0x1f, 0x64, 0x61, 0xf2, 0x85, 0x7, 0x93, 0x31, + 0xe, 0xc4, 0x4c, 0x39, 0xe, 0x43, 0x20, 0xa8, + 0x3d, 0x81, 0x60, 0x21, 0x27, 0xf1, 0x6, 0x43, + 0x90, 0xa3, 0xe, 0xc4, 0x44, 0x39, 0x30, /* U+0042 "B" */ - 0xff, 0x21, 0x2c, 0x48, 0x2a, 0xc8, 0x3f, 0xf9, - 0x68, 0x2a, 0xc8, 0xb, 0x8, 0x5f, 0x2a, 0xe, - 0x84, 0x3f, 0xf9, 0x68, 0x2a, 0xc8, 0xb, 0x10, + 0xff, 0x21, 0x2c, 0x48, 0xd5, 0x90, 0x7f, 0xf2, + 0xd1, 0xab, 0x20, 0x2c, 0x20, 0x7e, 0x98, 0x39, + 0x10, 0xff, 0xe5, 0xa3, 0x56, 0x60, 0x58, 0x90, /* U+0043 "C" */ 0x3, 0xf4, 0x15, 0x5, 0xb0, 0x2b, 0xa8, 0xa1, - 0x4, 0x8a, 0xf, 0x21, 0xfa, 0xc3, 0xff, 0xbf, - 0x68, 0x79, 0x22, 0x9, 0x11, 0x55, 0x88, 0xa2, - 0xec, + 0x4, 0x8a, 0xf, 0x21, 0xfa, 0xc4, 0x3f, 0xf9, + 0xc8, 0x7f, 0xf0, 0xad, 0xf, 0x26, 0x41, 0x22, + 0xea, 0xc4, 0x51, 0x76, 0x0, /* U+0044 "D" */ - 0xfe, 0x83, 0x97, 0x61, 0xaa, 0xcc, 0x3e, 0x84, - 0x3c, 0x98, 0x7f, 0xf3, 0x90, 0xfc, 0x87, 0xff, - 0x31, 0x30, 0xf4, 0x20, 0xab, 0x30, 0x97, 0x60, + 0xfe, 0x83, 0x97, 0x61, 0x35, 0x66, 0x1f, 0x42, + 0x1e, 0x4c, 0x3f, 0xfe, 0x9, 0x87, 0xa1, 0x1a, + 0xb3, 0x9, 0x76, 0x0, /* U+0045 "E" */ - 0xff, 0xa0, 0x2f, 0x60, 0xae, 0x43, 0xff, 0xad, - 0xfc, 0x12, 0xf0, 0x55, 0xc1, 0xff, 0xcf, 0xae, - 0x40, 0xbd, 0x80, + 0xff, 0xa0, 0x2f, 0x63, 0x5c, 0x87, 0xff, 0x55, + 0xfe, 0x9, 0x78, 0xd, 0x70, 0x7f, 0xf3, 0x9a, + 0xe4, 0xb, 0xd8, /* U+0046 "F" */ - 0xff, 0xa0, 0x2f, 0x60, 0xae, 0x43, 0xff, 0xad, - 0xfa, 0x9, 0x76, 0x15, 0x64, 0x3f, 0xfb, 0xa0, + 0xff, 0xa0, 0x2f, 0x63, 0x5c, 0x87, 0xff, 0x55, + 0xfd, 0x4, 0xbb, 0x3, 0x59, 0xf, 0xfe, 0xe8, /* U+0047 "G" */ - 0x5, 0xf4, 0x14, 0xbd, 0x8b, 0x56, 0x2c, 0x82, - 0x45, 0x7, 0xa8, 0x1f, 0x28, 0x3f, 0xf8, 0x55, - 0x83, 0x2f, 0x6, 0x7c, 0x1f, 0xf2, 0x1f, 0xb2, - 0xf, 0x2d, 0xd3, 0x12, 0x82, 0x8a, 0x0, + 0x5, 0xf4, 0x16, 0xbd, 0x88, 0xd6, 0x2c, 0x82, + 0x45, 0x7, 0xa8, 0x21, 0xca, 0xf, 0xfe, 0x15, + 0x60, 0xcb, 0xc2, 0x7, 0xc8, 0x7f, 0x90, 0xfd, + 0x90, 0x64, 0x5b, 0xa6, 0x25, 0x5, 0x14, /* U+0048 "H" */ - 0xf0, 0x77, 0x83, 0xff, 0xd9, 0xfc, 0x19, 0x78, - 0x35, 0x70, 0x7f, 0xf8, 0xc0, + 0xe0, 0xeb, 0xf, 0xff, 0x5b, 0xfc, 0x84, 0xbc, + 0x13, 0x5c, 0x87, 0xff, 0x88, /* U+0049 "I" */ - 0xf0, 0x7f, 0xf4, 0x0, + 0xe0, 0xff, 0xe8, 0x0, /* U+004A "J" */ - 0xf, 0x78, 0x3f, 0xff, 0xe1, 0x9f, 0x7, 0x90, - 0xd1, 0xe3, 0xa2, 0x2a, 0x16, 0xc0, + 0xf, 0x70, 0x7f, 0xff, 0xc3, 0xbc, 0x1f, 0xf2, + 0x71, 0xd4, 0x2a, 0x16, 0xc0, /* U+004B "K" */ - 0xf0, 0x6b, 0x83, 0xca, 0x20, 0xf4, 0x61, 0xe8, - 0x83, 0xcb, 0x83, 0xd1, 0x7, 0xa2, 0xf, 0x92, - 0xf, 0xc8, 0x87, 0xb8, 0x83, 0xf4, 0x41, 0xf2, - 0x21, 0xfa, 0x30, 0xf9, 0x42, 0x1f, 0x44, 0x0, + 0xe0, 0xd7, 0x7, 0x94, 0x41, 0xe8, 0xc3, 0xd1, + 0x7, 0x97, 0x7, 0xa2, 0xf, 0x44, 0x1e, 0x51, + 0x7, 0xe4, 0x43, 0xdc, 0x41, 0xc8, 0x22, 0xf, + 0x91, 0xf, 0xd1, 0x87, 0xc8, 0x10, 0xfb, 0x20, /* U+004C "L" */ - 0xf0, 0x7f, 0xff, 0xc3, 0xff, 0xa3, 0x5c, 0x81, - 0x7b, + 0xe0, 0xff, 0xff, 0x87, 0xff, 0x41, 0xae, 0x40, + 0xbd, 0x80, /* U+004D "M" */ - 0xf2, 0x1e, 0x7c, 0x8, 0x3d, 0x7, 0xff, 0x15, - 0xc, 0x87, 0xb0, 0xd8, 0x72, 0x83, 0x28, 0x36, + 0xf4, 0x1e, 0xbc, 0x4, 0x3c, 0x87, 0xff, 0x15, + 0xc, 0x87, 0xb0, 0xd8, 0x65, 0x83, 0x2c, 0x16, 0x20, 0x4c, 0x32, 0x60, 0xc4, 0x39, 0x40, 0x50, - 0x7b, 0x14, 0x61, 0xe4, 0xf0, 0x87, 0xcb, 0x83, - 0xf6, 0xc, 0x3f, 0x20, 0x43, 0xff, 0x88, + 0x7b, 0xd, 0x87, 0x92, 0x44, 0x3f, 0x30, 0x7f, + 0x40, 0x83, 0xf2, 0x4, 0x3f, 0xf8, 0x80, /* U+004E "N" */ - 0xf0, 0x77, 0x80, 0x87, 0xe8, 0x3f, 0x90, 0xf9, - 0x83, 0xec, 0x43, 0xc9, 0x7, 0xd0, 0x87, 0x92, - 0xf, 0xa1, 0xf, 0x26, 0x1f, 0x48, 0x7c, 0x87, - 0xf4, 0x1f, 0x90, 0x0, + 0xf0, 0x75, 0x81, 0xf, 0xd0, 0x7f, 0x21, 0xe4, + 0x83, 0xe8, 0x43, 0xc9, 0x7, 0xd0, 0x87, 0x92, + 0xf, 0xa1, 0xf, 0x26, 0x1f, 0x4a, 0xf, 0x21, + 0xfd, 0x7, 0xe4, 0x0, /* U+004F "O" */ 0x3, 0xf4, 0x85, 0x41, 0x69, 0x2, 0xba, 0x64, - 0x44, 0x1a, 0x14, 0x1e, 0x4c, 0x3f, 0xfa, 0x28, - 0x7f, 0x21, 0xff, 0xc8, 0x43, 0xc9, 0xe2, 0xd, - 0xb, 0xba, 0x64, 0xa, 0xb, 0x68, + 0x44, 0x1a, 0x14, 0x1e, 0x4c, 0x3f, 0xe4, 0x3f, + 0xfa, 0x28, 0x7f, 0xf1, 0x90, 0xf2, 0x71, 0x6, + 0x84, 0x57, 0x4c, 0x81, 0x41, 0x69, 0x0, /* U+0050 "P" */ - 0xff, 0x41, 0x96, 0x18, 0x2a, 0xb5, 0x83, 0xd1, - 0x87, 0xff, 0x31, 0xf, 0xd1, 0x3, 0xf1, 0x4, - 0xaa, 0x68, 0x54, 0x50, 0x7f, 0xf6, 0xc0, + 0xff, 0x41, 0x97, 0xa0, 0x35, 0x96, 0xf, 0x46, + 0x1f, 0xfc, 0xc4, 0x3f, 0x44, 0x3f, 0x88, 0x25, + 0x53, 0x40, 0xd1, 0x41, 0xff, 0xdb, /* U+0051 "Q" */ 0x3, 0xf4, 0x85, 0x41, 0x69, 0x2, 0xba, 0x64, - 0x44, 0x1a, 0x14, 0x1e, 0x4c, 0x3f, 0xfa, 0x28, - 0x7f, 0x21, 0xff, 0xc8, 0x43, 0xc9, 0xe2, 0xd, - 0xb, 0xba, 0x64, 0xa, 0xa, 0xf, 0x3f, 0x89, - 0xf, 0xb3, 0xf, 0xdc, + 0x44, 0x1a, 0x14, 0x1e, 0x4c, 0x3f, 0xe4, 0x3f, + 0xfa, 0x28, 0x7f, 0xf1, 0x90, 0xf2, 0x71, 0x6, + 0x84, 0x57, 0x4c, 0x81, 0x41, 0x41, 0xe7, 0xe8, + 0x90, 0xf3, 0x87, 0xfb, 0x40, /* U+0052 "R" */ - 0xfe, 0x83, 0x97, 0x61, 0xab, 0x10, 0x79, 0x10, - 0xff, 0xe6, 0x22, 0x15, 0x62, 0x9, 0x63, 0xd, - 0xe4, 0x3f, 0x44, 0x1f, 0x90, 0xfa, 0x10, 0xf2, - 0x41, 0xf2, 0x20, + 0xfe, 0x83, 0x97, 0x61, 0x35, 0x64, 0x1f, 0x90, + 0xff, 0xe6, 0x22, 0x6, 0xb1, 0x4, 0xb1, 0x84, + 0xf9, 0xf, 0xd1, 0x7, 0xe4, 0x3e, 0x84, 0x3c, + 0x90, 0x7c, 0x88, /* U+0053 "S" */ 0x5, 0xf4, 0x16, 0xbd, 0x9, 0x59, 0x6c, 0x42, 0x8c, 0x3e, 0xbc, 0x41, 0x96, 0x1e, 0xe, 0xd1, 0xe0, 0xd7, 0xe, 0x1c, 0xe8, 0xb0, 0x68, 0xe8, - 0x1f, 0x22, 0x12, 0x8, 0xae, 0x23, 0x5e, 0xc0, + 0x1f, 0x22, 0x12, 0x71, 0x5c, 0x26, 0xbd, 0x80, /* U+0054 "T" */ - 0xff, 0xe5, 0xc0, 0x5a, 0xb0, 0x2a, 0xf, 0xff, - 0xf8, 0x7f, 0xf5, 0x40, + 0xbf, 0xf5, 0xac, 0x5, 0xb6, 0xa1, 0xa9, 0xf, + 0xff, 0xf8, 0x7f, 0xf8, 0x40, /* U+0055 "U" */ - 0xf0, 0x77, 0x83, 0xff, 0xfe, 0x1f, 0xfc, 0x24, - 0x3f, 0x90, 0xe4, 0xe3, 0xac, 0x26, 0xbd, 0x80, + 0xe0, 0xee, 0xf, 0xff, 0xf8, 0x7f, 0xf1, 0x10, + 0xf9, 0xe, 0x4e, 0x3a, 0xc2, 0x6b, 0xd8, /* U+0056 "V" */ 0x78, 0x39, 0xe4, 0x43, 0xb3, 0xf, 0xc8, 0x88, @@ -315,25 +316,25 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0058 "X" */ 0x3c, 0x1d, 0xe0, 0x24, 0x12, 0x20, 0x84, 0x28, - 0x82, 0x84, 0x44, 0x32, 0x44, 0x41, 0xd1, 0x8, - 0x79, 0x12, 0xf, 0x91, 0xf, 0xc8, 0x87, 0xd0, + 0x82, 0x44, 0x44, 0x34, 0x44, 0x41, 0xc9, 0x8, + 0x7a, 0x12, 0xf, 0x91, 0xf, 0xc8, 0x87, 0xd0, 0x90, 0x79, 0x21, 0xe, 0x88, 0x88, 0x32, 0x22, - 0x21, 0x44, 0x14, 0x40, 0x44, 0x24, 0x40, + 0x21, 0x42, 0x14, 0x40, 0x48, 0x24, 0x40, /* U+0059 "Y" */ 0x3c, 0x1c, 0xf1, 0x10, 0x68, 0x84, 0x43, 0x90, 0x91, 0x4, 0x61, 0x46, 0x4, 0x43, 0x28, 0x48, - 0x3a, 0x1c, 0x43, 0xe9, 0x41, 0xf4, 0x8, 0x3e, - 0x43, 0xff, 0xe2, + 0x3a, 0x18, 0x43, 0xe8, 0x43, 0xe8, 0x10, 0x7c, + 0x87, 0xff, 0x1, 0xf, 0xff, 0x20, /* U+005A "Z" */ - 0xff, 0xc2, 0xf8, 0x2a, 0xec, 0x83, 0xd0, 0x87, - 0x24, 0x1e, 0x84, 0x39, 0x20, 0xf4, 0x21, 0xc9, - 0x7, 0xa1, 0xe, 0x48, 0x3d, 0x8, 0x72, 0x41, - 0xe8, 0xeb, 0xc0, 0x5f, 0x80, + 0xff, 0xe5, 0xf8, 0x6b, 0xc0, 0x83, 0x96, 0xf, + 0x44, 0x1c, 0x88, 0x7a, 0x20, 0xe8, 0x83, 0xc8, + 0x87, 0x44, 0x1e, 0x44, 0x3b, 0x20, 0xe4, 0x8, + 0x74, 0x35, 0xe0, 0x2f, 0xc0, /* U+005B "[" */ - 0xa9, 0x60, 0x61, 0xff, 0xe3, 0x80, 0x80, + 0xa9, 0x61, 0xc3, 0xff, 0xc4, 0xc0, 0x40, /* U+005C "\\" */ 0x74, 0x39, 0x30, 0xf2, 0x83, 0xd8, 0x7c, 0x90, @@ -342,7 +343,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc3, 0xca, 0x0, /* U+005D "]" */ - 0x68, 0xea, 0xa6, 0x1f, 0xff, 0x26, 0x6, 0x80, + 0x68, 0xea, 0xec, 0x3f, 0xfe, 0x4c, 0xd, 0x0, /* U+005E "^" */ 0x9, 0xf, 0x50, 0x34, 0x21, 0x94, 0x21, 0xb3, @@ -355,98 +356,98 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x3c, 0x16, 0x41, 0x4a, /* U+0061 "a" */ - 0x1f, 0xa0, 0x30, 0xb4, 0x47, 0x41, 0x3c, 0x1f, - 0x3f, 0x4, 0xc2, 0x82, 0x8e, 0x81, 0xff, 0xc7, - 0x4a, 0x61, 0x4b, 0x50, 0x0, + 0x1f, 0xa0, 0x50, 0x5a, 0x13, 0xa0, 0x9e, 0x9, + 0x9, 0xf9, 0x3, 0xa, 0xa, 0x3a, 0x21, 0xff, + 0xc3, 0x40, 0x94, 0xc2, 0x96, 0xa0, 0x0, /* U+0062 "b" */ - 0xf0, 0x7f, 0xf5, 0x1f, 0x83, 0x4a, 0x30, 0xba, - 0x22, 0x1d, 0x18, 0x7f, 0xf0, 0xd0, 0xf9, 0xf, - 0xfe, 0xa, 0x60, 0xea, 0x11, 0x94, 0x60, + 0xe0, 0xff, 0xea, 0x3f, 0x4, 0xca, 0x30, 0xba, + 0x84, 0x42, 0x4c, 0x3f, 0xfa, 0xa8, 0x49, 0x83, + 0xa8, 0x46, 0x51, 0x80, /* U+0063 "c" */ - 0x5, 0xf0, 0x5a, 0xc6, 0x45, 0x62, 0x44, 0x8, - 0x7e, 0xe0, 0xff, 0xe5, 0x4a, 0xc, 0xae, 0x3a, - 0x88, 0xd7, 0x60, + 0x5, 0xf0, 0x5a, 0xc6, 0x47, 0x51, 0x21, 0x90, + 0xfd, 0xc2, 0x1f, 0x21, 0xff, 0xc0, 0x94, 0x1c, + 0xf1, 0xd3, 0x23, 0x5d, 0x80, /* U+0064 "d" */ - 0xf, 0x78, 0x3f, 0xf9, 0xaf, 0xc8, 0x50, 0xa8, - 0x11, 0x56, 0x4, 0x43, 0xff, 0xb2, 0x88, 0x74, - 0x55, 0x85, 0xa, 0x80, + 0xf, 0x70, 0x7f, 0xf3, 0x5f, 0x90, 0xa1, 0x50, + 0x23, 0xa6, 0x4, 0x3f, 0xf8, 0x88, 0x7c, 0x87, + 0xff, 0x9, 0xf, 0xa3, 0xa6, 0x14, 0x2a, 0x0, /* U+0065 "e" */ 0x5, 0xe8, 0x2d, 0x76, 0x47, 0x50, 0xa0, 0xc9, - 0x82, 0xb0, 0x65, 0xc2, 0xf, 0xf0, 0x7e, 0x44, - 0x24, 0x8a, 0xe4, 0xd7, 0x48, + 0x82, 0xb0, 0x65, 0xc1, 0x3f, 0xd0, 0x87, 0x91, + 0x9, 0x22, 0xb9, 0x35, 0xd2, /* U+0066 "f" */ - 0x9, 0x41, 0x75, 0x11, 0x70, 0x48, 0x48, 0x6c, - 0x1e, 0x10, 0x28, 0x81, 0x40, 0xff, 0xf2, 0x80, + 0xc, 0xa0, 0x3d, 0x1, 0x1e, 0xf, 0xe4, 0xe, + 0x3c, 0xa0, 0x39, 0xc, 0x87, 0xff, 0x90, /* U+0067 "g" */ - 0x1f, 0x9f, 0x10, 0xa8, 0x11, 0x56, 0x4, 0x43, - 0xff, 0xb2, 0x88, 0x74, 0x55, 0x85, 0xa, 0x84, - 0x7e, 0x42, 0x42, 0x42, 0xba, 0x88, 0x97, 0x60, + 0x1f, 0x9e, 0x21, 0x50, 0x23, 0xa8, 0x8, 0x64, + 0x3f, 0xe4, 0x3e, 0x43, 0xff, 0x84, 0x87, 0xd1, + 0xd3, 0xa, 0x15, 0x4, 0xfc, 0x84, 0x84, 0x85, + 0x75, 0x11, 0x2e, 0xc0, /* U+0068 "h" */ - 0xf0, 0x7f, 0xf4, 0x1f, 0x41, 0x48, 0xc0, 0xec, - 0x43, 0xff, 0xd8, + 0xe0, 0xff, 0xe8, 0x3e, 0x80, 0xc8, 0xc0, 0xec, + 0x44, 0x3f, 0xc8, 0x7f, 0xf7, 0xc0, /* U+0069 "i" */ - 0xea, 0x42, 0xf0, 0x7f, 0xf2, 0x0, + 0xea, 0x42, 0xe0, 0xff, 0xe4, 0x0, /* U+006A "j" */ - 0x7, 0x2, 0x80, 0x43, 0xef, 0x7, 0xff, 0x7d, - 0xc, 0xc6, 0x2c, + 0x7, 0x2, 0x80, 0x43, 0xee, 0xf, 0xff, 0x23, + 0x4, 0xa8, /* U+006B "k" */ - 0xf0, 0x7f, 0xf5, 0x9e, 0xe, 0x88, 0x34, 0x41, - 0x97, 0x6, 0x88, 0x3e, 0x43, 0xa2, 0xe, 0x61, - 0xe, 0x48, 0x3d, 0x10, 0x72, 0x28, + 0xe0, 0xff, 0xeb, 0x3c, 0x1d, 0x10, 0x68, 0x83, + 0x2e, 0x9, 0x88, 0x3e, 0x43, 0xa2, 0xc, 0xa8, + 0x43, 0x92, 0xf, 0x44, 0x1c, 0x88, /* U+006C "l" */ - 0xf0, 0x7f, 0xf4, 0x0, + 0xe0, 0xff, 0xe8, 0x0, /* U+006D "m" */ - 0xe9, 0xe8, 0x7d, 0x4, 0xb0, 0xf2, 0xd8, 0x5d, - 0x82, 0xa4, 0x3f, 0x90, 0xff, 0xe2, 0xa1, 0xff, - 0xff, 0x8, + 0xf5, 0xe8, 0x7e, 0x42, 0x50, 0xf2, 0x89, 0x7, + 0x60, 0xab, 0x31, 0xe, 0x43, 0xfc, 0x87, 0xff, + 0xfc, 0x3f, 0xc0, /* U+006E "n" */ - 0xe7, 0xd0, 0x19, 0x18, 0x1d, 0x88, 0x7f, 0xfb, - 0x0, + 0xe7, 0xd0, 0x19, 0x18, 0x1d, 0x88, 0x87, 0xf9, + 0xf, 0xfe, 0xf8, /* U+006F "o" */ 0x5, 0xe8, 0x2d, 0x76, 0x45, 0x62, 0x44, 0x8, - 0x87, 0xff, 0x51, 0x10, 0x23, 0x15, 0x88, 0xd7, - 0x60, + 0x87, 0xf2, 0x19, 0x2, 0x19, 0xf, 0xe4, 0x40, + 0x8c, 0x56, 0x23, 0x5d, 0x80, /* U+0070 "p" */ - 0xe7, 0xe0, 0x99, 0x46, 0x17, 0x44, 0x43, 0xa3, - 0xf, 0xfe, 0x1a, 0x1f, 0x21, 0xff, 0xc1, 0x8c, - 0x1d, 0x11, 0x4, 0xa3, 0x9, 0xf8, 0x3f, 0xf9, - 0xc0, + 0xe7, 0xe0, 0x99, 0x46, 0x17, 0x44, 0x44, 0x28, + 0xc3, 0xff, 0xaa, 0x85, 0x18, 0x3a, 0x22, 0x32, + 0x8c, 0x27, 0xe0, 0xff, 0xe7, 0x0, /* U+0071 "q" */ - 0x1f, 0x9f, 0x10, 0xa8, 0x11, 0x56, 0x4, 0x43, - 0xff, 0xb2, 0x88, 0x74, 0x55, 0x85, 0xa, 0x82, - 0x7e, 0x43, 0xff, 0x9c, + 0x1f, 0x9e, 0x21, 0x50, 0x22, 0xac, 0x8, 0x87, + 0xff, 0x9, 0xf, 0x90, 0xff, 0xe1, 0x21, 0xf4, + 0x74, 0xc2, 0x85, 0x41, 0x3f, 0x21, 0xff, 0xce, /* U+0072 "r" */ - 0xe, 0xe9, 0xc2, 0xd8, 0x39, 0xf, 0xfe, 0xe0, + 0xe9, 0xa2, 0xc1, 0x72, 0x1e, 0x43, 0xff, 0xaa, /* U+0073 "s" */ - 0x1f, 0x91, 0x84, 0x9c, 0xec, 0x83, 0xbe, 0x34, - 0x27, 0x2d, 0xb, 0x8a, 0x28, 0x71, 0xa0, 0x74, - 0x74, 0x15, 0xa, 0xa0, + 0x1f, 0xa1, 0x84, 0x6c, 0xec, 0x43, 0xbe, 0x34, + 0x27, 0x2e, 0xb, 0x86, 0x50, 0xe3, 0x40, 0xe8, + 0xe8, 0x2a, 0x16, 0x80, /* U+0074 "t" */ - 0x18, 0x29, 0xf, 0xb0, 0x79, 0x2, 0xa0, 0x50, - 0x3f, 0xf9, 0xc8, 0x7b, 0x89, 0x10, + 0x4, 0x86, 0x70, 0xfd, 0x63, 0xda, 0x7, 0x61, + 0x90, 0xff, 0xea, 0xa1, 0xe9, 0x6, 0x20, /* U+0075 "u" */ - 0xf0, 0x5e, 0xf, 0xff, 0x62, 0x76, 0x9, 0x16, - 0x0, + 0xe0, 0xac, 0x3f, 0xfb, 0xe8, 0x48, 0x7e, 0x4e, + 0xc1, 0x22, 0x80, /* U+0076 "v" */ 0x74, 0x2f, 0x9, 0x86, 0x42, 0x40, 0x98, 0x10, @@ -454,11 +455,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xd9, 0x87, 0x91, 0x41, 0xfb, 0xf, 0x22, 0x10, /* U+0077 "w" */ - 0x74, 0xe, 0x81, 0xd4, 0x60, 0xcc, 0x18, 0x87, - 0x22, 0x1e, 0x50, 0x7c, 0xa0, 0x60, 0x48, 0x41, - 0x81, 0x1c, 0x4d, 0x10, 0xda, 0x85, 0x61, 0xe4, - 0xcc, 0x50, 0x64, 0x8, 0x83, 0xd, 0x87, 0xff, - 0x1, 0x10, 0x91, 0x0, + 0xf0, 0x56, 0x15, 0x88, 0x64, 0x40, 0x83, 0x10, + 0xd8, 0x48, 0x98, 0x81, 0xb, 0x9, 0x32, 0x2, + 0x20, 0x40, 0xb0, 0xe1, 0xb2, 0x30, 0x6a, 0x9, + 0x11, 0x14, 0x61, 0xfd, 0x81, 0xc, 0x88, 0x10, + 0xfb, 0x30, 0xfc, /* U+0078 "x" */ 0x3c, 0x17, 0x80, 0x85, 0x10, 0x22, 0x11, 0x9, @@ -467,225 +468,226 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x40, /* U+0079 "y" */ - 0x74, 0x2f, 0x9, 0x86, 0x42, 0x40, 0x98, 0x10, - 0xb1, 0x4, 0x22, 0x1e, 0xc0, 0x86, 0x58, 0x83, - 0x64, 0x1e, 0x40, 0x87, 0x93, 0xf, 0x62, 0x1e, - 0xc3, 0xf2, 0x83, 0xac, 0x83, 0x92, 0xe, + 0xb4, 0x2f, 0x46, 0x4, 0x40, 0x83, 0x21, 0x9, + 0xb, 0x10, 0x20, 0x4d, 0x30, 0x94, 0x4, 0x2c, + 0x83, 0x90, 0x21, 0xf6, 0x1c, 0x88, 0x72, 0x83, + 0xec, 0x35, 0x88, 0x64, 0xc3, 0x0, /* U+007A "z" */ - 0xff, 0x97, 0x81, 0x58, 0x10, 0x4b, 0x82, 0x88, - 0x24, 0x83, 0x42, 0x14, 0x61, 0x2c, 0x1a, 0x5, - 0x60, 0x2f, 0x0, + 0xff, 0x97, 0x81, 0x59, 0x20, 0x91, 0x41, 0x44, + 0x14, 0x21, 0x92, 0xa, 0x20, 0x94, 0x21, 0x43, + 0x58, 0xb, 0xc0, /* U+007B "{" */ - 0xc, 0x86, 0xa0, 0x4a, 0x82, 0x84, 0x3f, 0xf9, - 0x48, 0x7e, 0x72, 0x6, 0x21, 0x4b, 0x5, 0x18, - 0x7f, 0xc8, 0x7f, 0xf1, 0x10, 0xe8, 0x83, 0x48, - 0x67, 0x0, + 0xc, 0x86, 0xa0, 0x4a, 0x82, 0x84, 0x3f, 0xc8, + 0x7f, 0xf2, 0x1c, 0x81, 0x87, 0x48, 0x85, 0x18, + 0x7f, 0xf2, 0xd0, 0xc8, 0x76, 0x41, 0x32, 0x19, + 0xc0, /* U+007C "|" */ - 0xf0, 0x7f, 0xf5, 0x0, + 0xe0, 0xff, 0xea, 0x0, /* U+007D "}" */ - 0xf, 0x3c, 0x12, 0xc1, 0xa2, 0xf, 0xfe, 0x2a, - 0x1f, 0xfc, 0x48, 0xd0, 0x20, 0xc1, 0x14, 0x2, - 0x21, 0xff, 0xc4, 0x43, 0xf9, 0x30, 0xa1, 0x2, - 0xb0, 0x98, 0x30, + 0xf, 0x30, 0x65, 0x61, 0xa1, 0x9, 0x30, 0xff, + 0xe5, 0xa1, 0xe4, 0x28, 0x90, 0x20, 0xc1, 0xc, + 0x4, 0x83, 0x21, 0xff, 0xc9, 0x4c, 0x28, 0x40, + 0x90, 0x4e, 0x84, /* U+007E "~" */ - 0x2f, 0x6, 0xe5, 0xda, 0x1a, 0x28, 0xd3, 0x25, - 0x2, 0x89, 0x0, + 0x2f, 0x21, 0x72, 0xe9, 0xd, 0x14, 0x69, 0x92, + 0x81, 0x28, 0x80, /* U+00A0 " " */ /* U+00A1 "¡" */ - 0xea, 0x42, 0xf0, 0x7f, 0xf1, 0x80, + 0xea, 0x42, 0xe0, 0xff, 0xe3, 0x0, /* U+00A3 "£" */ - 0xa, 0xf2, 0x16, 0xa2, 0x44, 0xa6, 0x46, 0x20, - 0x43, 0xeb, 0x10, 0xff, 0xe1, 0x60, 0xf8, 0x8, - 0x16, 0x4, 0xa, 0x83, 0xff, 0x9d, 0x2, 0xb9, - 0x2, 0xf0, + 0xa, 0xf8, 0x36, 0xb1, 0x81, 0x2b, 0x11, 0x88, + 0x10, 0xfe, 0xe0, 0xff, 0xe3, 0x69, 0xf0, 0x48, + 0x15, 0x5, 0x25, 0x10, 0xff, 0xe0, 0xa1, 0xff, + 0xc4, 0x81, 0x5c, 0xa0, 0x2f, 0x60, /* U+00B0 "°" */ - 0x2, 0x7, 0xb6, 0x9d, 0x4, 0x47, 0xb6, 0x5a, + 0x2, 0x87, 0xa3, 0x4e, 0x82, 0x23, 0xdb, 0x28, + 0x80, /* U+00B1 "±" */ - 0xb, 0xc1, 0xff, 0xcf, 0xa8, 0x15, 0x2c, 0x5, - 0xbe, 0x7, 0xc1, 0xff, 0xcf, 0xf0, 0x55, 0xf0, - 0xbf, 0x0, + 0xd, 0x21, 0xe7, 0xf, 0xfe, 0x33, 0x50, 0xd3, + 0x58, 0xa, 0xbe, 0x1f, 0x7, 0xff, 0x43, 0x82, + 0xaf, 0x85, 0xf8, /* U+00B2 "²" */ - 0x2f, 0x13, 0x19, 0x28, 0x91, 0x40, 0xc8, 0x8c, - 0x97, 0x86, 0x80, + 0x3e, 0x4c, 0x98, 0xb7, 0x2, 0xa, 0x1, 0xe4, + 0x64, 0x48, 0x68, 0x0, /* U+00B3 "³" */ - 0x2f, 0x42, 0xfd, 0x4c, 0x27, 0x84, 0x1a, 0x22, - 0x46, 0xd4, 0x6b, 0xe0, + 0x7e, 0x80, 0xca, 0x1a, 0x28, 0x2d, 0x42, 0x8c, + 0x1c, 0xe0, 0x99, 0x80, /* U+00B5 "µ" */ - 0xf0, 0x5e, 0xf, 0xff, 0x77, 0x61, 0xcb, 0x5, - 0xea, 0x61, 0xff, 0xc9, + 0xe0, 0xac, 0x3f, 0xfb, 0x8, 0x7f, 0xf1, 0x50, + 0xbb, 0xe, 0x58, 0xf, 0xa9, 0x87, 0xff, 0x24, /* U+00BF "¿" */ - 0x5, 0x87, 0x50, 0x3c, 0x87, 0xff, 0x3, 0xc1, - 0xff, 0x24, 0x1a, 0x10, 0x92, 0xd, 0x8, 0x7f, - 0xf1, 0x28, 0x1c, 0xa8, 0xec, 0x98, 0x49, + 0x5, 0x87, 0x50, 0x3c, 0x87, 0x90, 0xea, 0x7, + 0x21, 0xc9, 0x6, 0x84, 0x24, 0x83, 0x42, 0x1f, + 0xfc, 0x4b, 0xe, 0x48, 0xec, 0x98, 0x49, /* U+00C0 "À" */ - 0x9, 0x41, 0xff, 0x50, 0x3f, 0x96, 0xf, 0xf5, - 0x10, 0xff, 0x58, 0x7f, 0x22, 0x1f, 0xd0, 0x10, - 0xfe, 0x4c, 0x3e, 0x49, 0x41, 0xf6, 0xc, 0x3f, - 0x28, 0x48, 0x39, 0x30, 0x90, 0xec, 0x40, 0x87, - 0x92, 0xa0, 0x21, 0xe5, 0xc4, 0x14, 0x7f, 0x21, - 0x90, 0xf6, 0x21, 0x21, 0xc9, 0x89, 0x87, 0xc8, + 0xd, 0x21, 0xfe, 0x64, 0x3f, 0xb2, 0xf, 0xf6, + 0x87, 0xfa, 0x50, 0x7f, 0x24, 0x1f, 0xfc, 0x84, + 0x44, 0x3e, 0xc8, 0xc3, 0xe5, 0xa, 0xf, 0x26, + 0x62, 0x1d, 0x88, 0x98, 0x72, 0x1c, 0x86, 0x41, + 0x50, 0x7b, 0x2, 0xc0, 0x42, 0x4f, 0xe2, 0xc, + 0x87, 0x21, 0x46, 0x1d, 0x88, 0x88, 0x72, 0x60, /* U+00C1 "Á" */ - 0xf, 0xa4, 0x3f, 0xb5, 0x7, 0xe8, 0xc3, 0xfb, - 0xc1, 0xfe, 0xa0, 0x7f, 0x22, 0x1f, 0xd0, 0x10, - 0xfe, 0x4c, 0x3e, 0x49, 0x41, 0xf6, 0xc, 0x3f, - 0x28, 0x48, 0x39, 0x30, 0x90, 0xec, 0x40, 0x87, - 0x92, 0xa0, 0x21, 0xe5, 0xc4, 0x14, 0x7f, 0x21, - 0x90, 0xf6, 0x21, 0x21, 0xc9, 0x89, 0x87, 0xc8, + 0xf, 0x98, 0x3f, 0xd0, 0x7f, 0xb2, 0xf, 0xe7, + 0xf, 0xe9, 0x41, 0xfc, 0x90, 0x7f, 0xf2, 0x11, + 0x10, 0xfb, 0x23, 0xf, 0x94, 0x28, 0x3c, 0x99, + 0x88, 0x76, 0x22, 0x61, 0xc8, 0x72, 0x19, 0x5, + 0x41, 0xec, 0xb, 0x1, 0x9, 0x3f, 0x88, 0x32, + 0x1c, 0x85, 0x18, 0x76, 0x22, 0x21, 0xc9, 0x80, /* U+00C2 "Â" */ - 0xe, 0x43, 0xfc, 0xd8, 0x7f, 0x51, 0x83, 0xe6, - 0x60, 0xfc, 0xae, 0x81, 0xf9, 0x10, 0xfe, 0x80, - 0x87, 0xf2, 0x61, 0xf2, 0x4a, 0xf, 0xb0, 0x61, - 0xf9, 0x42, 0x41, 0xc9, 0x84, 0x87, 0x62, 0x4, - 0x3c, 0x95, 0x1, 0xf, 0x2e, 0x20, 0xa3, 0xf9, - 0xc, 0x87, 0xb1, 0x9, 0xe, 0x4c, 0x4c, 0x3e, - 0x40, + 0xf, 0x41, 0xfe, 0xdc, 0x3f, 0x46, 0x21, 0xf7, + 0x8c, 0x3f, 0x36, 0xa0, 0xfc, 0x90, 0x7f, 0xf2, + 0x11, 0x10, 0xfb, 0x23, 0xf, 0x94, 0x28, 0x3c, + 0x99, 0x88, 0x76, 0x22, 0x61, 0xc8, 0x72, 0x19, + 0x5, 0x41, 0xec, 0xb, 0x1, 0x9, 0x3f, 0x88, + 0x32, 0x1c, 0x85, 0x18, 0x76, 0x22, 0x21, 0xc9, + 0x80, /* U+00C3 "Ã" */ - 0xf, 0xfe, 0x1b, 0xe1, 0xc3, 0xd2, 0xb9, 0xf, - 0x57, 0x83, 0xc9, 0xc8, 0x7e, 0x43, 0xfe, 0xc1, - 0x7, 0xe5, 0x8, 0x7f, 0x70, 0x7e, 0x85, 0x8, - 0x79, 0xd, 0x7, 0xc8, 0x10, 0xf2, 0x60, 0xc4, - 0x36, 0x74, 0xcc, 0x32, 0x2e, 0x10, 0x92, 0xfd, - 0x8, 0x31, 0xc, 0x98, 0x10, 0xfc, 0x88, 0x87, - 0x90, 0x0, + 0xf, 0xfe, 0x25, 0xa6, 0x87, 0x2d, 0x62, 0x1e, + 0xa7, 0x61, 0xe5, 0x58, 0x7f, 0x92, 0xf, 0xfe, + 0x42, 0x22, 0x1f, 0x64, 0x61, 0xf2, 0x85, 0x7, + 0x93, 0x31, 0xe, 0xc4, 0x4c, 0x39, 0xe, 0x43, + 0x20, 0xa8, 0x3d, 0x81, 0x60, 0x21, 0x27, 0xf1, + 0x6, 0x43, 0x90, 0xa3, 0xe, 0xc4, 0x44, 0x39, + 0x30, /* U+00C4 "Ä" */ - 0x9, 0xc, 0x87, 0xa8, 0xa, 0x7, 0xb8, 0x16, - 0x1f, 0xbc, 0x1f, 0xc8, 0x10, 0xfd, 0x83, 0xf, - 0xca, 0x10, 0xf9, 0x34, 0x3f, 0x63, 0x8, 0x79, - 0xd, 0x87, 0xc8, 0x14, 0x1c, 0x90, 0x31, 0xd, - 0x95, 0x66, 0x19, 0x17, 0x8, 0x75, 0xf9, 0xd, - 0x8, 0x6c, 0x40, 0x87, 0x93, 0x9, 0xf, 0x90, + 0x9, 0x40, 0x43, 0xea, 0x2, 0x81, 0xef, 0x3, + 0x83, 0xf5, 0x87, 0xf9, 0x10, 0xfc, 0x82, 0xf, + 0xd8, 0x87, 0xf2, 0x42, 0x1f, 0x91, 0x83, 0xc9, + 0x98, 0x7d, 0x8, 0x88, 0x7f, 0xd8, 0x64, 0x15, + 0x8, 0x6c, 0xb, 0x1, 0x9, 0x3f, 0x8c, 0x8, + 0x87, 0x28, 0x19, 0x87, 0x62, 0x22, 0x1c, 0x98, /* U+00C5 "Å" */ 0xe, 0x50, 0x7f, 0x56, 0xf, 0xcf, 0x90, 0xfe, - 0xa0, 0x7f, 0x4a, 0x83, 0xf2, 0x4, 0x3f, 0xf9, - 0x8, 0x10, 0xfd, 0x26, 0x1f, 0xda, 0x83, 0xe4, - 0x71, 0xf, 0x60, 0x4c, 0x3c, 0xa0, 0x28, 0x39, - 0x30, 0x61, 0xec, 0xe9, 0x90, 0x64, 0x5c, 0x21, - 0xcf, 0xe4, 0x34, 0x41, 0xb1, 0x2, 0x1e, 0x48, - 0x24, 0x3f, 0x80, + 0xa0, 0x7f, 0x4a, 0x83, 0xf2, 0x84, 0x3f, 0x91, + 0xf, 0xc8, 0x20, 0xfd, 0x88, 0x7f, 0x24, 0x21, + 0xf9, 0x18, 0x3c, 0x99, 0x87, 0xd0, 0x88, 0x87, + 0xfd, 0x86, 0x41, 0x50, 0x86, 0xc0, 0xb0, 0x10, + 0x93, 0xf8, 0xc0, 0x88, 0x72, 0x81, 0x98, 0x76, + 0x22, 0x21, 0xc9, 0x80, /* U+00C6 "Æ" */ - 0xf, 0x9f, 0xfc, 0x1f, 0xa0, 0x97, 0x83, 0xe4, - 0x35, 0x70, 0x7d, 0x10, 0x7f, 0xf1, 0x10, 0xff, - 0xe0, 0xc4, 0x1f, 0xfc, 0x24, 0x42, 0xac, 0x87, - 0x44, 0x19, 0x76, 0x1c, 0x88, 0x6f, 0xd0, 0x68, - 0x43, 0xff, 0x84, 0x8f, 0xc1, 0xfe, 0x85, 0xe0, - 0xff, 0x25, 0x70, 0x7f, 0x42, 0x1f, 0x57, 0x22, + 0xf, 0xdf, 0xf8, 0x3f, 0x41, 0x2f, 0x7, 0xe5, + 0x2, 0xb8, 0x3e, 0x88, 0x3f, 0xf8, 0x4a, 0xf, + 0xfe, 0x14, 0x41, 0xff, 0xc2, 0x43, 0xab, 0x21, + 0xd1, 0x6, 0x5d, 0x87, 0x22, 0x1b, 0xf4, 0x1a, + 0x20, 0xff, 0xe1, 0x25, 0xf0, 0x7f, 0xa0, 0xff, + 0xe2, 0x27, 0xf0, 0x7f, 0x42, 0x1f, 0x57, 0x22, 0x41, 0xf2, 0xf6, /* U+00C7 "Ç" */ 0x3, 0xf4, 0x15, 0x5, 0xb0, 0x2b, 0xa8, 0xa1, - 0x4, 0x8a, 0xf, 0x21, 0xfa, 0xc3, 0xff, 0xbf, - 0x68, 0x79, 0x22, 0x9, 0x11, 0x55, 0x88, 0xa2, - 0xec, 0x27, 0x18, 0x3d, 0xb0, 0x7a, 0xf, 0xca, - 0x80, + 0x4, 0x8a, 0xf, 0x21, 0xfa, 0xc4, 0x3f, 0xf9, + 0xc8, 0x7f, 0xf0, 0xad, 0xf, 0x26, 0x41, 0x22, + 0xea, 0xc4, 0x51, 0x76, 0x13, 0x8c, 0x1e, 0xd8, + 0x3d, 0x7, 0xcb, 0x40, /* U+00C8 "È" */ 0x14, 0x1f, 0x50, 0x39, 0x60, 0xf5, 0x10, 0xbe, - 0xa7, 0xa0, 0x2f, 0x60, 0xae, 0x43, 0xff, 0xad, - 0xfc, 0x12, 0xf0, 0x55, 0xc1, 0xff, 0xcf, 0xae, - 0x40, 0xbd, 0x80, + 0xa7, 0xa0, 0x2f, 0x63, 0x5c, 0x87, 0xff, 0x55, + 0xfe, 0x9, 0x78, 0xd, 0x70, 0x7f, 0xf3, 0x9a, + 0xe4, 0xb, 0xd8, /* U+00C9 "É" */ 0xe, 0x90, 0xed, 0x41, 0xa3, 0xe, 0xf0, 0x5f, - 0x5f, 0x40, 0x5e, 0xc1, 0x5c, 0x87, 0xff, 0x5b, - 0xf8, 0x25, 0xe0, 0xab, 0x83, 0xff, 0x9f, 0x5c, - 0x81, 0x7b, + 0x5f, 0x40, 0x5e, 0xc6, 0xb9, 0xf, 0xfe, 0xab, + 0xfc, 0x12, 0xf0, 0x1a, 0xe0, 0xff, 0xe7, 0x35, + 0xc8, 0x17, 0xb0, /* U+00CA "Ê" */ 0x9, 0x41, 0xd5, 0x6, 0x57, 0x61, 0x38, 0xe0, - 0xff, 0xa0, 0x2f, 0x60, 0xae, 0x43, 0xff, 0xad, - 0xfc, 0x12, 0xf0, 0x55, 0xc1, 0xff, 0xcf, 0xae, - 0x40, 0xbd, 0x80, + 0xff, 0xa0, 0x2f, 0x63, 0x5c, 0x87, 0xff, 0x55, + 0xfe, 0x9, 0x78, 0xd, 0x70, 0x7f, 0xf3, 0x9a, + 0xe4, 0xb, 0xd8, /* U+00CB "Ë" */ 0x10, 0x90, 0xa8, 0xa, 0x3, 0x81, 0xc7, 0xfd, - 0x1, 0x7b, 0x5, 0x72, 0x1f, 0xfd, 0x6f, 0xe0, - 0x97, 0x41, 0x56, 0x43, 0xff, 0x9f, 0x5c, 0x81, - 0x7b, + 0x1, 0x7b, 0x1a, 0xe4, 0x3f, 0xfa, 0xaf, 0xe8, + 0x25, 0xd8, 0x1a, 0xc8, 0x7f, 0xf3, 0x9a, 0xe4, + 0xb, 0xd8, /* U+00CC "Ì" */ - 0x18, 0x33, 0x1, 0x94, 0x6, 0xd, 0x40, 0xff, - 0xfd, 0x0, + 0x18, 0x33, 0x1, 0x94, 0x6, 0xd, 0x61, 0xff, + 0xfa, /* U+00CD "Í" */ - 0xa, 0x41, 0xa8, 0x4c, 0x28, 0x2a, 0x7, 0xff, + 0xa, 0x41, 0xa8, 0x8c, 0x1c, 0x15, 0x87, 0xff, 0xf0, /* U+00CE "Î" */ - 0x2, 0x82, 0x68, 0x6, 0xec, 0x71, 0xc2, 0xf0, - 0x7f, 0xff, 0xc3, 0xfe, + 0x2, 0x82, 0x68, 0x6, 0xec, 0x71, 0xc2, 0xe0, + 0xff, 0xff, 0x87, 0xfc, /* U+00CF "Ï" */ - 0x43, 0x34, 0x5, 0x38, 0x16, 0xf, 0x7, 0xff, - 0xfc, 0x3f, 0xe0, + 0x43, 0x34, 0x5, 0x38, 0x16, 0xb, 0xf, 0xff, + 0xf8, 0x7f, 0xc0, /* U+00D0 "Ð" */ - 0x3f, 0xa4, 0x39, 0x74, 0x86, 0xab, 0x20, 0xfd, - 0x90, 0x7f, 0x21, 0xff, 0xc8, 0xc1, 0xe0, 0xe4, - 0xa, 0xe, 0x81, 0x40, 0xff, 0xe6, 0x21, 0xf6, - 0x41, 0x55, 0x90, 0x65, 0xda, 0x0, + 0x7, 0xf4, 0x1f, 0x2e, 0xc3, 0x9a, 0xb3, 0xf, + 0xe8, 0x43, 0xf2, 0x61, 0xff, 0xca, 0xb1, 0xf0, + 0x76, 0x81, 0x83, 0x98, 0x64, 0x3f, 0xf9, 0x89, + 0x87, 0xe8, 0x42, 0x6a, 0xcc, 0x39, 0x76, 0x0, /* U+00D1 "Ñ" */ - 0xf, 0xfa, 0xd3, 0xc, 0xab, 0xe, 0xa7, 0x60, - 0xf2, 0x4, 0xf0, 0x10, 0xfd, 0x7, 0xf2, 0x1f, - 0x30, 0x7d, 0x88, 0x79, 0x20, 0xfa, 0x10, 0xf2, - 0x41, 0xf4, 0x21, 0xe4, 0xc3, 0xe9, 0xf, 0x90, - 0xfe, 0x83, 0xf2, 0x0, + 0xf, 0xfa, 0xd3, 0x40, 0xb5, 0x88, 0x1a, 0x76, + 0xf, 0x20, 0x4b, 0x2, 0x1f, 0xa0, 0xfe, 0x43, + 0xc9, 0x7, 0xd0, 0x87, 0x92, 0xf, 0xa1, 0xf, + 0x24, 0x1f, 0x42, 0x1e, 0x4c, 0x3e, 0x94, 0x1e, + 0x43, 0xfa, 0xf, 0xc8, 0x0, /* U+00D2 "Ò" */ 0x3, 0x7, 0xf3, 0x7, 0xcb, 0x83, 0xea, 0x7, 0xcf, 0x52, 0x15, 0x5, 0xa4, 0xa, 0xe9, 0x91, - 0x10, 0x68, 0x50, 0x79, 0x30, 0xff, 0xe8, 0xa1, - 0xfc, 0x87, 0xff, 0x21, 0xf, 0x27, 0x88, 0x34, - 0x2e, 0xe9, 0x90, 0x28, 0x2d, 0xa0, + 0x10, 0x68, 0x50, 0x79, 0x30, 0xff, 0x90, 0xff, + 0xe8, 0xa1, 0xff, 0xc6, 0x43, 0xc9, 0xc4, 0x1a, + 0x11, 0x5d, 0x32, 0x5, 0x5, 0xa4, /* U+00D3 "Ó" */ 0xf, 0x48, 0x7d, 0xa8, 0x3c, 0x90, 0x7e, 0x90, 0xe7, 0xa9, 0xa, 0x82, 0xd2, 0x5, 0x74, 0xc8, - 0x88, 0x34, 0x28, 0x3c, 0x98, 0x7f, 0xf4, 0x50, - 0xfe, 0x43, 0xff, 0x90, 0x87, 0x93, 0xc4, 0x1a, - 0x17, 0x74, 0xc8, 0x14, 0x16, 0xd0, + 0x88, 0x34, 0x28, 0x3c, 0x98, 0x7f, 0xc8, 0x7f, + 0xf4, 0x50, 0xff, 0xe3, 0x21, 0xe4, 0xe2, 0xd, + 0x8, 0xae, 0x99, 0x2, 0x82, 0xd2, 0x0, /* U+00D4 "Ô" */ 0xc, 0xa0, 0xfa, 0xa4, 0x39, 0x5d, 0x3, 0x9c, 0x70, 0xe7, 0xe9, 0xa, 0x82, 0xd2, 0x5, 0x74, - 0xc8, 0x88, 0x34, 0x28, 0x3c, 0x98, 0x7f, 0xf4, - 0x50, 0xfe, 0x43, 0xff, 0x90, 0x87, 0x93, 0xc4, - 0x1a, 0x17, 0x74, 0xc8, 0x14, 0x16, 0xd0, + 0xc8, 0x88, 0x34, 0x28, 0x3c, 0x98, 0x7f, 0xc8, + 0x7f, 0xf4, 0x50, 0xff, 0xe3, 0x21, 0xe4, 0xe2, + 0xd, 0x8, 0xae, 0x99, 0x2, 0x82, 0xd2, 0x0, /* U+00D5 "Õ" */ - 0x9, 0xa, 0xd, 0xdd, 0xa1, 0xdc, 0x98, 0x6c, - 0x7c, 0x1c, 0xfd, 0x21, 0x50, 0x5a, 0x40, 0xae, - 0x99, 0x11, 0x6, 0x85, 0x7, 0x93, 0xf, 0xfe, - 0x8a, 0x1f, 0xc8, 0x7f, 0xf2, 0x10, 0xf2, 0x78, - 0x83, 0x42, 0xee, 0x99, 0x2, 0x82, 0xda, 0x0, + 0x9, 0xa, 0xd, 0xdd, 0xa1, 0xdc, 0x90, 0x6c, + 0x7c, 0x86, 0x7e, 0x90, 0xa8, 0x2d, 0x20, 0x57, + 0x4c, 0x88, 0x83, 0x42, 0x83, 0xc9, 0x87, 0xfc, + 0x87, 0xff, 0x45, 0xf, 0xfe, 0x32, 0x1e, 0x4e, + 0x20, 0xd0, 0x8a, 0xe9, 0x90, 0x28, 0x2d, 0x20, /* U+00D6 "Ö" */ 0x7, 0x3, 0x83, 0x50, 0x14, 0xc, 0x84, 0x87, 0x3f, 0x48, 0x54, 0x16, 0x90, 0x27, 0x4c, 0x88, - 0x83, 0x42, 0x84, 0x32, 0x61, 0xff, 0xd1, 0x43, - 0xf9, 0xf, 0xfe, 0x42, 0x21, 0x93, 0xc4, 0x1a, - 0x16, 0x3a, 0x64, 0xa, 0xb, 0x68, + 0x83, 0x42, 0x84, 0x32, 0x61, 0xff, 0xf0, 0x44, + 0x32, 0x71, 0x6, 0x84, 0x4e, 0x99, 0x2, 0x82, + 0xd2, 0x0, /* U+00D7 "×" */ 0xf, 0xf5, 0x2, 0x70, 0x94, 0x8, 0x28, 0x9c, @@ -693,310 +695,312 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x6b, 0x3, 0x32, 0x20, 0x50, 0x2d, 0x0, /* U+00D8 "Ø" */ - 0xa, 0xf4, 0x50, 0x75, 0xdb, 0x11, 0xd4, 0x12, - 0x41, 0xe7, 0x10, 0xa4, 0xd0, 0xc9, 0x7, 0xd4, - 0xf, 0x91, 0xf, 0xa8, 0x1f, 0x22, 0x19, 0x5, - 0x0, 0x9e, 0x31, 0x6, 0x28, 0x10, 0x4a, 0x2, - 0x55, 0x90, 0x18, 0x5b, 0xa, 0x7e, 0x82, + 0x3, 0xf4, 0x50, 0x61, 0x6d, 0x88, 0xe9, 0x84, + 0x90, 0x7d, 0x88, 0x52, 0x28, 0x32, 0xa3, 0x10, + 0xa8, 0x1f, 0x22, 0x19, 0x5, 0x3, 0xe4, 0x43, + 0x20, 0xa0, 0x6f, 0x18, 0x82, 0x14, 0x8, 0x24, + 0x24, 0xab, 0x30, 0x30, 0xb6, 0x14, 0xfd, 0x4, /* U+00D9 "Ù" */ - 0x19, 0xf, 0x2a, 0xf, 0xb3, 0xf, 0xb4, 0x37, - 0x81, 0x3, 0xc1, 0xff, 0xff, 0xf, 0xfe, 0x12, - 0x1f, 0xc8, 0x72, 0x71, 0xd6, 0x13, 0x5e, 0xc0, + 0x19, 0xf, 0x2a, 0xf, 0xb2, 0xf, 0xb0, 0xee, + 0x4, 0xe, 0xf, 0xff, 0xf8, 0x7f, 0xf1, 0x10, + 0xf9, 0xe, 0x4e, 0x3a, 0xc2, 0x6b, 0xd8, /* U+00DA "Ú" */ - 0xe, 0x60, 0xf3, 0x7, 0xd3, 0x7, 0xa8, 0x17, - 0x80, 0x83, 0xc1, 0xff, 0xff, 0xf, 0xfe, 0x12, - 0x1f, 0xc8, 0x72, 0x71, 0xd6, 0x13, 0x5e, 0xc0, + 0xe, 0x60, 0xf3, 0x7, 0xd3, 0x7, 0x34, 0xb, + 0x85, 0x3, 0x83, 0xff, 0xfe, 0x1f, 0xfc, 0x44, + 0x3e, 0x43, 0x93, 0x8e, 0xb0, 0x9a, 0xf6, 0x0, /* U+00DB "Û" */ 0xc, 0x87, 0xdd, 0x3, 0xb7, 0x60, 0xdc, 0x70, - 0x3c, 0x1d, 0xe0, 0xff, 0xff, 0x87, 0xff, 0x9, - 0xf, 0xe4, 0x39, 0x38, 0xeb, 0x9, 0xaf, 0x60, + 0x38, 0x3b, 0x83, 0xff, 0xfe, 0x1f, 0xfc, 0x44, + 0x3e, 0x43, 0x93, 0x8e, 0xb0, 0x9a, 0xf6, 0x0, /* U+00DC "Ü" */ - 0x2c, 0x1c, 0x15, 0x1, 0x40, 0xc8, 0x10, 0xbc, - 0x1d, 0xe0, 0xff, 0xff, 0x87, 0xff, 0x9, 0xf, - 0xe4, 0x39, 0x38, 0xeb, 0x9, 0xaf, 0x60, + 0x2c, 0x1c, 0x15, 0x1, 0x40, 0xc8, 0x10, 0xb8, + 0x3b, 0x83, 0xff, 0xfe, 0x1f, 0xfc, 0x44, 0x3e, + 0x43, 0x93, 0x8e, 0xb0, 0x9a, 0xf6, 0x0, /* U+00DD "Ý" */ - 0xf, 0xa4, 0x3f, 0x6a, 0xf, 0x92, 0xf, 0xe9, - 0xd, 0xe0, 0x28, 0x78, 0x88, 0x34, 0x42, 0x21, - 0xc8, 0x48, 0x82, 0x30, 0xa3, 0x2, 0x21, 0x94, - 0x24, 0x1d, 0xe, 0x21, 0xf4, 0xa0, 0xfa, 0x4, - 0x1f, 0x21, 0xff, 0xf1, + 0xf, 0xa4, 0x3f, 0x6a, 0xf, 0x93, 0xf, 0xe8, + 0x3b, 0xc0, 0x50, 0xf1, 0x10, 0x68, 0x84, 0x43, + 0x90, 0x91, 0x4, 0x61, 0x46, 0x4, 0x43, 0x28, + 0x48, 0x3a, 0x18, 0x43, 0xe8, 0x43, 0xe8, 0x10, + 0x7c, 0x87, 0xff, 0x1, 0xf, 0xff, 0x20, /* U+00DE "Þ" */ - 0xf0, 0x7f, 0xf3, 0x25, 0x7, 0x34, 0xe0, 0xbe, - 0x58, 0x3a, 0x20, 0xff, 0xe4, 0xa2, 0xa, 0xc4, - 0x5, 0xd8, 0x5f, 0x41, 0xff, 0xc6, + 0xe0, 0xff, 0xe5, 0xb4, 0x43, 0x95, 0x70, 0x1f, + 0x96, 0xe, 0x88, 0x3f, 0xf9, 0x68, 0xd5, 0x90, + 0x17, 0x60, 0x7e, 0x83, 0xff, 0x8c, /* U+00DF "ß" */ - 0x1f, 0x90, 0x30, 0x92, 0x47, 0x66, 0x1f, 0xfc, - 0x98, 0x83, 0x90, 0xff, 0xe1, 0xa2, 0x1d, 0x10, - 0x7b, 0x20, 0xf4, 0x87, 0xfd, 0xd4, 0x84, 0xba, + 0x1f, 0x90, 0x30, 0x92, 0x47, 0x66, 0x1f, 0xe4, + 0x3f, 0xd1, 0x7, 0x21, 0xff, 0xc3, 0x44, 0x3a, + 0x20, 0xf6, 0x41, 0xe9, 0xf, 0xfb, 0xa9, 0x9, + 0x74, /* U+00E0 "à" */ - 0x3c, 0x1e, 0xcc, 0x3d, 0xa8, 0x3d, 0x21, 0x9f, - 0xa0, 0x30, 0xb4, 0x47, 0x41, 0x3c, 0x1f, 0x3f, - 0x4, 0xc2, 0x82, 0x8e, 0x81, 0xff, 0xc7, 0x4a, - 0x61, 0x4b, 0x50, 0x0, + 0x3c, 0x87, 0x64, 0x1e, 0xd4, 0x1e, 0x90, 0xcf, + 0xd0, 0x18, 0x5a, 0x23, 0xa0, 0x9e, 0x9, 0x9, + 0xf9, 0x3, 0xa, 0xa, 0x3a, 0x21, 0xff, 0xc3, + 0x40, 0x94, 0xc2, 0x96, 0xa0, 0x0, /* U+00E1 "á" */ 0xd, 0x68, 0x65, 0x48, 0x6e, 0x43, 0xa4, 0x33, - 0xf4, 0x6, 0x16, 0x88, 0xe8, 0x27, 0x83, 0xe7, - 0xe0, 0x98, 0xb0, 0xa3, 0x43, 0xff, 0x90, 0x94, - 0xc2, 0x96, 0xa0, 0x0, + 0xf4, 0xa, 0xb, 0x42, 0x74, 0x13, 0xc1, 0xf3, + 0xf0, 0x4c, 0x58, 0x51, 0xa2, 0x1f, 0xfc, 0x34, + 0x9, 0x4c, 0x29, 0x6a, 0x0, /* U+00E2 "â" */ - 0xb, 0x83, 0xb9, 0x41, 0x33, 0xe0, 0x94, 0x8, - 0x27, 0xe8, 0xc, 0x2d, 0x11, 0xd0, 0x4f, 0x7, - 0xcf, 0xc1, 0x30, 0xa0, 0xa3, 0xa0, 0x7f, 0xf1, - 0xd2, 0x98, 0x52, 0xd4, 0x0, + 0xb, 0x83, 0xb5, 0x82, 0x55, 0xe0, 0x98, 0x10, + 0x4f, 0xd0, 0x28, 0x2d, 0x9, 0xd0, 0x4f, 0x4, + 0x84, 0xfc, 0x81, 0x85, 0x5, 0x1d, 0x10, 0xff, + 0xe1, 0xa0, 0x4a, 0x61, 0x4b, 0x50, 0x0, /* U+00E3 "ã" */ - 0xf, 0xe7, 0x8a, 0x2, 0x56, 0xe0, 0xa7, 0x44, - 0x8, 0x14, 0x13, 0xf4, 0x6, 0x16, 0x88, 0xe8, - 0x27, 0x83, 0xe7, 0xe0, 0x98, 0x50, 0x51, 0xd0, - 0x3f, 0xf8, 0xe9, 0x4c, 0x29, 0x6a, 0x0, + 0xf, 0xe7, 0x8a, 0x2, 0x56, 0xe0, 0x6e, 0x88, + 0x20, 0x28, 0x27, 0xe8, 0x14, 0x16, 0x84, 0xe8, + 0x27, 0x82, 0x42, 0x7e, 0x40, 0xc2, 0x82, 0x8e, + 0x88, 0x7f, 0xf0, 0xd0, 0x25, 0x30, 0xa5, 0xa8, + 0x0, /* U+00E4 "ä" */ - 0x38, 0x16, 0xa, 0x2, 0x80, 0x43, 0x21, 0xfe, - 0x7e, 0x80, 0xc2, 0xd1, 0x1d, 0x4, 0xf0, 0x7c, + 0x38, 0x1c, 0xa, 0x2, 0x80, 0x42, 0x43, 0xfe, + 0x7e, 0x41, 0x41, 0x24, 0x4e, 0xcc, 0xf0, 0x7c, 0xfc, 0x13, 0xa, 0xa, 0x3a, 0x7, 0xff, 0x1d, - 0x29, 0x85, 0x2d, 0x40, 0x0, + 0x29, 0x89, 0x2d, 0x20, /* U+00E5 "å" */ 0x3, 0xe4, 0x34, 0xa8, 0x3f, 0xf8, 0x12, 0xa0, - 0xcf, 0x90, 0x9f, 0xa0, 0x30, 0xb4, 0x47, 0x41, - 0x3c, 0x1f, 0x3f, 0x4, 0xc2, 0x82, 0x8a, 0x83, - 0x90, 0xff, 0xe0, 0xa7, 0x61, 0x48, 0xd0, 0x0, + 0xcf, 0x90, 0x9f, 0xa0, 0x50, 0x5a, 0x12, 0xa1, + 0x3c, 0x81, 0x9, 0xf9, 0x3, 0xa, 0xa, 0x3a, + 0x21, 0xff, 0xc3, 0x40, 0x94, 0xc2, 0x97, 0x40, /* U+00E6 "æ" */ - 0x1f, 0x91, 0xf8, 0xc, 0x25, 0xca, 0x32, 0x3b, - 0x3, 0x4c, 0xbc, 0x1d, 0x6, 0x40, 0xa8, 0x15, - 0x82, 0xe8, 0x81, 0x70, 0x32, 0xf0, 0x3f, 0xc0, - 0x43, 0xff, 0x8b, 0x7, 0x25, 0x31, 0x5d, 0x3a, - 0x2e, 0xe8, 0x2d, 0x0, + 0x1f, 0x92, 0xf4, 0x6, 0x12, 0xd7, 0x64, 0x76, + 0x6, 0xa1, 0xe0, 0xe8, 0x9, 0x8b, 0x40, 0xac, + 0x17, 0x44, 0xb, 0x81, 0x97, 0x81, 0xfd, 0x1, + 0x2, 0x1f, 0xfc, 0x4, 0x83, 0x92, 0x98, 0xae, + 0x9b, 0x2e, 0xe8, 0x2e, /* U+00E7 "ç" */ - 0x5, 0xf0, 0x5a, 0xc6, 0x45, 0x62, 0x44, 0x8, - 0x7e, 0xe0, 0xff, 0xe5, 0x4a, 0xc, 0xae, 0x3a, - 0x88, 0xd7, 0x61, 0x43, 0x7, 0x6c, 0x1d, 0x7, - 0xca, 0x80, + 0x5, 0xf0, 0x5a, 0xc6, 0x47, 0x51, 0x21, 0x90, + 0xfd, 0xc2, 0x1f, 0x21, 0xff, 0xc0, 0x94, 0x1c, + 0xf1, 0xd3, 0x23, 0x5d, 0x85, 0xc, 0x1d, 0xb0, + 0x74, 0x1f, 0x2a, 0x0, /* U+00E8 "è" */ 0x2d, 0xe, 0x98, 0x3d, 0x30, 0x7a, 0x81, 0xd7, 0xa0, 0xb5, 0xd9, 0x1d, 0x42, 0x83, 0x26, 0xa, - 0xc1, 0x97, 0x8, 0x3f, 0xc1, 0xf9, 0x10, 0x92, - 0x2b, 0x93, 0x5d, 0x20, + 0xc1, 0x97, 0x4, 0xff, 0x42, 0x1e, 0x44, 0x24, + 0x8a, 0xe4, 0xd7, 0x48, /* U+00E9 "é" */ - 0xc, 0xf0, 0x74, 0xc1, 0xa6, 0xe, 0xa0, 0x75, - 0xe8, 0x2d, 0x76, 0x47, 0x50, 0xa0, 0xc9, 0x82, - 0xb0, 0x65, 0xc2, 0xf, 0xf0, 0x7e, 0x44, 0x24, - 0x8a, 0xe4, 0xd7, 0x48, + 0xd, 0x70, 0x72, 0xa0, 0xd3, 0x7, 0x50, 0x3a, + 0xf4, 0x16, 0xbb, 0x23, 0xa8, 0x50, 0x64, 0xc1, + 0x58, 0x32, 0xe0, 0x9f, 0xe8, 0x43, 0xc8, 0x84, + 0x91, 0x5c, 0x9a, 0xe9, /* U+00EA "ê" */ 0xb, 0xc1, 0xda, 0xa0, 0x95, 0x40, 0xcc, 0x8, 0x35, 0xe8, 0x2d, 0x76, 0x47, 0x50, 0xa0, 0xc9, - 0x82, 0xb0, 0x65, 0xc2, 0xf, 0xf0, 0x7e, 0x44, - 0x24, 0x8a, 0xe4, 0xd7, 0x48, + 0x82, 0xb0, 0x65, 0xc1, 0x3f, 0xd0, 0x87, 0x91, + 0x9, 0x22, 0xb9, 0x35, 0xd2, /* U+00EB "ë" */ 0x38, 0x1c, 0xa, 0x2, 0x80, 0x42, 0x43, 0xff, 0x81, 0x7a, 0xb, 0x5d, 0x91, 0xd4, 0x28, 0x32, - 0x60, 0xac, 0x19, 0x70, 0x83, 0xfc, 0x1f, 0x91, - 0x9, 0x22, 0xae, 0x6, 0xb1, 0x0, + 0x60, 0xac, 0x19, 0x70, 0x4f, 0xf4, 0x21, 0xe4, + 0x39, 0x23, 0xa7, 0x26, 0xb1, 0x20, /* U+00EC "ì" */ - 0x2d, 0x4, 0xc1, 0x4a, 0xa, 0x42, 0xf0, 0x7f, - 0xf9, 0x80, + 0x2d, 0x4, 0xc1, 0x4a, 0xa, 0x42, 0xe0, 0xff, + 0xf3, 0x0, /* U+00ED "í" */ - 0x5, 0xa2, 0xa4, 0xe4, 0x12, 0x17, 0x83, 0xff, - 0xd0, + 0x5, 0xa2, 0xa4, 0xe4, 0x12, 0x17, 0x7, 0xff, + 0xa0, /* U+00EE "î" */ - 0x7, 0x82, 0xd5, 0x2, 0xac, 0x8, 0x10, 0xbc, - 0x1f, 0xff, 0x20, + 0x7, 0x82, 0xd5, 0x2, 0xac, 0x8, 0x10, 0xb8, + 0x3f, 0xfe, 0x40, /* U+00EF "ï" */ - 0xe0, 0x5d, 0x1, 0x44, 0x32, 0x1f, 0xbc, 0x1f, - 0xff, 0x20, + 0xe0, 0x5d, 0x1, 0x44, 0x32, 0x1f, 0xac, 0x3f, + 0xfe, 0x40, /* U+00F0 "ð" */ 0xf, 0xea, 0x7, 0xce, 0xd8, 0x28, 0x4e, 0x12, - 0x1f, 0x6c, 0x41, 0x72, 0xc1, 0x5e, 0x2, 0x6b, - 0x8e, 0x2a, 0xc0, 0x88, 0x7f, 0xf3, 0x90, 0x22, - 0xc, 0xa1, 0x52, 0x81, 0xae, 0x80, + 0x1f, 0x6c, 0x41, 0x72, 0xc1, 0x7c, 0x4, 0xc5, + 0x8e, 0x2a, 0xc0, 0x88, 0x7f, 0xf3, 0x93, 0x44, + 0x18, 0xc5, 0x4a, 0x6, 0xba, 0x0, /* U+00F1 "ñ" */ 0xf, 0xd6, 0x9a, 0x2a, 0xc4, 0xa7, 0x60, 0x40, - 0x83, 0x9f, 0x40, 0x64, 0x60, 0x76, 0x21, 0xff, - 0xec, + 0x83, 0x9f, 0x40, 0x64, 0x60, 0x76, 0x22, 0x1f, + 0xe4, 0x3f, 0xfb, 0xe0, /* U+00F2 "ò" */ 0x2d, 0xe, 0x98, 0x3d, 0x28, 0x3d, 0x21, 0xd7, 0xa0, 0xb5, 0xd9, 0x15, 0x89, 0x10, 0x22, 0x1f, - 0xfd, 0x44, 0x40, 0x8c, 0x56, 0x23, 0x5d, 0x80, + 0xc8, 0x64, 0x8, 0x64, 0x3f, 0x91, 0x2, 0x31, + 0x58, 0x8d, 0x76, 0x0, /* U+00F3 "ó" */ 0xd, 0x68, 0x73, 0x21, 0xa8, 0x87, 0x48, 0x75, 0xe8, 0x2d, 0x76, 0x45, 0x62, 0x44, 0x8, 0x87, - 0xff, 0x51, 0x10, 0x23, 0x15, 0x88, 0xd7, 0x60, + 0xf2, 0x19, 0x2, 0x19, 0xf, 0xe4, 0x40, 0x8c, + 0x56, 0x23, 0x5d, 0x80, /* U+00F4 "ô" */ - 0xb, 0xc1, 0xd2, 0xa0, 0xea, 0x7, 0x40, 0x83, - 0x5e, 0x82, 0xd7, 0x64, 0x56, 0x24, 0x40, 0x88, - 0x7f, 0xf5, 0x11, 0x2, 0x31, 0x58, 0x8d, 0x76, - 0x0, + 0xb, 0xc1, 0xda, 0x41, 0x9b, 0xe, 0x81, 0x6, + 0xbd, 0x5, 0xae, 0xc8, 0xac, 0x48, 0x81, 0x10, + 0xfe, 0x43, 0x20, 0x43, 0x21, 0xfc, 0x88, 0x11, + 0x8a, 0xc4, 0x6b, 0xb0, /* U+00F5 "õ" */ - 0xf, 0xe7, 0x8a, 0x2, 0x56, 0xe0, 0xa7, 0x44, - 0x8, 0x14, 0x1a, 0xf4, 0x16, 0xbb, 0x22, 0xb1, - 0x22, 0x4, 0x43, 0xff, 0xa8, 0x88, 0x11, 0x8a, - 0xc4, 0x6b, 0xb0, + 0xf, 0xe7, 0x8a, 0x2, 0x4d, 0xc1, 0x5c, 0x81, + 0x2, 0x83, 0x5e, 0x82, 0xd7, 0x64, 0x56, 0x24, + 0x40, 0x88, 0x7f, 0x21, 0x90, 0x21, 0x90, 0xfe, + 0x44, 0x8, 0xc5, 0x62, 0x35, 0xd8, /* U+00F6 "ö" */ 0x38, 0x16, 0xa, 0x2, 0x80, 0x43, 0x21, 0xff, 0x5e, 0x82, 0xd7, 0x64, 0x56, 0x24, 0x40, 0x88, - 0x7f, 0xf5, 0x11, 0x2, 0x31, 0x58, 0x8d, 0x76, - 0x0, + 0x7f, 0x21, 0x90, 0x21, 0x90, 0xfe, 0x44, 0x8, + 0xc5, 0x62, 0x35, 0xd8, /* U+00F7 "÷" */ 0xf, 0xfa, 0xc3, 0xff, 0x85, 0x61, 0xff, 0x7f, 0xe5, 0xfd, 0x5f, 0x83, 0xfe, 0xb0, 0xff, 0x80, /* U+00F8 "ø" */ - 0xf, 0x21, 0xf4, 0x15, 0xf2, 0xd, 0x61, 0x12, - 0xa0, 0x30, 0x94, 0x20, 0xca, 0xe, 0x50, 0x7a, - 0x81, 0xca, 0xd, 0x16, 0x24, 0x83, 0xa0, 0x90, - 0xb6, 0xb, 0xe8, 0x0, + 0xf, 0x21, 0xe6, 0xa, 0xf5, 0x1, 0xac, 0x42, + 0x53, 0x3, 0x9, 0x42, 0xe, 0x42, 0x49, 0x10, + 0x23, 0x8, 0x4a, 0xd, 0x16, 0x24, 0x83, 0xa0, + 0x88, 0xb6, 0x7, 0xe8, 0x0, /* U+00F9 "ù" */ - 0x3c, 0x1d, 0x90, 0x76, 0x1f, 0x41, 0x78, 0x2f, - 0x7, 0xff, 0xb1, 0x3b, 0x4, 0x8b, 0x0, + 0x3c, 0x1d, 0x90, 0x76, 0x1f, 0x41, 0x70, 0x56, + 0x1f, 0xfe, 0x34, 0x8, 0x72, 0x4e, 0x9, 0x52, + 0x0, /* U+00FA "ú" */ - 0xd, 0xe0, 0xd1, 0x87, 0x61, 0xd0, 0x5e, 0xb, - 0xc1, 0xff, 0xec, 0x4e, 0xc1, 0x22, 0xc0, + 0xd, 0xe0, 0xd1, 0x87, 0x61, 0xd0, 0x5c, 0x15, + 0x87, 0xff, 0x7d, 0x9, 0xf, 0xc9, 0xd8, 0x24, + 0x50, 0x0, /* U+00FB "û" */ - 0x3, 0xa1, 0x35, 0x21, 0x4e, 0x12, 0x80, 0x9e, - 0xb, 0xc1, 0xff, 0xec, 0x4e, 0xc1, 0x22, 0xc0, + 0x3, 0xa1, 0x35, 0x6, 0x9d, 0x2, 0x80, 0x9c, + 0x15, 0x87, 0xff, 0x8d, 0x2, 0x1c, 0x93, 0x82, + 0x54, 0x80, /* U+00FC "ü" */ - 0xe0, 0xba, 0x82, 0xa2, 0x19, 0xf, 0xde, 0xb, - 0xc1, 0xff, 0xec, 0x4e, 0xc1, 0x22, 0xc0, + 0xe0, 0xba, 0x82, 0xa2, 0x19, 0xf, 0xdc, 0x15, + 0x87, 0xff, 0x7d, 0x9, 0xf, 0xc9, 0xd8, 0x24, + 0x50, 0x0, /* U+00FD "ý" */ - 0xe, 0xf0, 0x7a, 0x30, 0xfb, 0xf, 0xa0, 0xce, - 0x85, 0xe1, 0x30, 0xc8, 0x48, 0x13, 0x2, 0x16, - 0x20, 0x84, 0x43, 0xd8, 0x10, 0xcb, 0x10, 0x6c, - 0x83, 0xc8, 0x10, 0xf2, 0x61, 0xec, 0x43, 0xd8, - 0x7e, 0x50, 0x75, 0x90, 0x72, 0x41, 0xc0, + 0xe, 0xf0, 0x76, 0x61, 0x95, 0x87, 0x30, 0x56, + 0x85, 0xe8, 0xc0, 0x88, 0x10, 0x64, 0x21, 0x21, + 0x62, 0x4, 0x9, 0xa6, 0x12, 0x80, 0x85, 0x90, + 0x72, 0x4, 0x3e, 0xc3, 0x91, 0xe, 0x50, 0x7d, + 0x86, 0xb1, 0xc, 0x98, 0x60, /* U+00FE "þ" */ - 0xf0, 0x7f, 0xf5, 0x2f, 0x41, 0x97, 0x61, 0x74, - 0x43, 0xec, 0x83, 0x90, 0xff, 0xe5, 0xa1, 0xf6, - 0x40, 0xe8, 0x86, 0x5d, 0x85, 0x7a, 0xf, 0xfe, - 0x70, + 0xe0, 0xff, 0xe9, 0xb7, 0xa0, 0xcb, 0xb0, 0xba, + 0x22, 0x21, 0x46, 0x1f, 0xfd, 0x54, 0x28, 0xc1, + 0xd1, 0x10, 0x2e, 0xc0, 0xde, 0x83, 0xff, 0x9c, /* U+00FF "ÿ" */ - 0x7, 0x2, 0xc2, 0xa0, 0x28, 0x12, 0x19, 0xf, - 0xfb, 0xc1, 0x3a, 0x21, 0xb1, 0x31, 0x2, 0x80, - 0x98, 0x58, 0x64, 0x44, 0x24, 0x18, 0x74, 0x2c, - 0x1e, 0x8c, 0x39, 0x2, 0x1d, 0x87, 0xe4, 0x83, - 0xc8, 0x87, 0xb0, 0xf3, 0xb0, 0x7c, 0xa0, 0xc0, + 0x38, 0x16, 0xa, 0x2, 0x80, 0x43, 0x21, 0xfd, + 0x61, 0x3b, 0x86, 0xc5, 0x8, 0x14, 0x14, 0x16, + 0x4, 0x8, 0x83, 0x1c, 0x32, 0x6a, 0xe, 0x4c, + 0x32, 0x4, 0x36, 0x1f, 0x22, 0x1f, 0x61, 0xc8, + 0x86, 0xa2, 0x19, 0x68, 0x30, /* U+011E "Ğ" */ 0x18, 0x29, 0x6, 0xa1, 0x58, 0x22, 0xe2, 0xb, - 0xab, 0xd, 0x5c, 0x14, 0x8b, 0x62, 0xdd, 0x32, - 0xc8, 0x34, 0xa0, 0xf3, 0x7, 0xe4, 0x3f, 0xf8, - 0x55, 0x83, 0x97, 0x7, 0x7a, 0xf, 0xf2, 0x1f, - 0xb3, 0xf, 0x28, 0xeb, 0x25, 0x5, 0xa8, + 0xab, 0xd, 0x5c, 0x16, 0x8b, 0x62, 0x3d, 0x32, + 0xc8, 0x34, 0xa0, 0xf3, 0x8, 0x79, 0xf, 0xfe, + 0x15, 0x60, 0xe5, 0xc2, 0x17, 0xa0, 0xff, 0x21, + 0xfb, 0x30, 0xf2, 0x8e, 0xb2, 0x50, 0x5a, 0x80, /* U+011F "ğ" */ - 0x3c, 0xe, 0x4, 0x78, 0x80, 0xf4, 0xc3, 0x94, - 0x19, 0xf9, 0xf1, 0xa, 0x81, 0x15, 0x60, 0x44, - 0x3f, 0xfb, 0x28, 0x81, 0x4, 0x56, 0xa, 0x15, - 0x8, 0xfc, 0x84, 0x84, 0x85, 0x75, 0x11, 0x2e, - 0xc0, + 0x3c, 0xf, 0x2, 0x3c, 0x40, 0x7a, 0x68, 0x65, + 0x6, 0x7e, 0x78, 0x85, 0x40, 0x8e, 0xa0, 0x21, + 0x90, 0xff, 0x90, 0xf9, 0xf, 0xfe, 0x12, 0x1f, + 0x47, 0x4c, 0x28, 0x54, 0x13, 0xf2, 0x12, 0x12, + 0x15, 0xd4, 0x44, 0xbb, 0x0, /* U+0130 "İ" */ - 0x4a, 0x77, 0x83, 0xff, 0xa0, + 0x4a, 0x77, 0x7, 0xff, 0x40, /* U+0131 "ı" */ - 0xf0, 0x7f, 0xf2, 0x0, + 0xe0, 0xff, 0xe4, 0x0, /* U+0152 "Œ" */ 0x3, 0xff, 0xf1, 0x41, 0x40, 0x5f, 0xa, 0xe8, - 0xa, 0xf8, 0x83, 0xfe, 0x43, 0xff, 0xcb, 0xfc, - 0x1f, 0xcb, 0xc1, 0xfd, 0x5c, 0x1f, 0xfc, 0x34, - 0x3f, 0xf8, 0x31, 0x7, 0xff, 0x1, 0x5d, 0x1, - 0x5e, 0x28, 0x28, 0xb, 0xe0, + 0x95, 0xf1, 0x7, 0xfc, 0x87, 0xff, 0x9, 0xf, + 0xfe, 0x45, 0x70, 0x7f, 0x2f, 0x7, 0xf7, 0xf0, + 0x10, 0xff, 0xe7, 0x21, 0xff, 0xc1, 0x88, 0x3f, + 0xf8, 0xa, 0xe8, 0x95, 0xe2, 0x82, 0x80, 0xbe, /* U+0153 "œ" */ - 0x5, 0xe8, 0xf, 0xa0, 0xb5, 0xdd, 0x16, 0xc4, - 0xac, 0x2a, 0xa1, 0x84, 0x8, 0x30, 0x26, 0x1f, - 0xba, 0x83, 0xfc, 0xb8, 0x43, 0xf7, 0xf8, 0x3f, - 0xf8, 0x50, 0x81, 0x4, 0x1c, 0x95, 0x85, 0x55, - 0xa6, 0xbb, 0xa2, 0xd2, + 0x5, 0xe8, 0x17, 0xa0, 0xb5, 0xdc, 0xbb, 0x12, + 0xb0, 0xaa, 0x86, 0x10, 0x20, 0x80, 0x98, 0x7e, + 0xac, 0x12, 0x1e, 0x5c, 0x12, 0x1e, 0xfe, 0x83, + 0xff, 0x85, 0x8, 0x10, 0x41, 0xc9, 0x58, 0x55, + 0x5a, 0x6b, 0xb9, 0x74, 0x80, /* U+015E "Ş" */ 0x5, 0xf4, 0x16, 0xbd, 0x9, 0x59, 0x6c, 0x42, 0x8c, 0x3e, 0xbc, 0x41, 0x96, 0x1e, 0xe, 0xd1, 0xe0, 0xd7, 0xe, 0x1c, 0xe8, 0xb0, 0x68, 0xe8, - 0x1f, 0x22, 0x12, 0x8, 0xae, 0x23, 0x5e, 0xc2, - 0xb1, 0x83, 0xdb, 0x7, 0xa0, 0xf9, 0x68, 0x0, + 0x1f, 0x22, 0x12, 0x71, 0x5c, 0x26, 0xbd, 0x85, + 0x63, 0x7, 0xb6, 0xf, 0x41, 0xf2, 0xd0, 0x0, /* U+015F "ş" */ - 0x1f, 0x91, 0x84, 0x9c, 0xec, 0x83, 0xbe, 0x34, - 0x27, 0x2d, 0xb, 0x8a, 0x28, 0x71, 0xa0, 0x74, - 0x74, 0x15, 0xa, 0xa0, 0xe2, 0x83, 0x6e, 0x1a, - 0xf, 0x26, 0x0, + 0x1f, 0xa1, 0x84, 0x6c, 0xec, 0x43, 0xbe, 0x34, + 0x26, 0x2e, 0x3, 0xc3, 0x28, 0x71, 0xa0, 0x74, + 0x74, 0x15, 0xb, 0x43, 0x8c, 0x1b, 0x70, 0xd0, + 0x79, 0x20, /* U+0160 "Š" */ - 0x2, 0x5, 0x7, 0x6c, 0x1c, 0xaa, 0x21, 0xd6, - 0x87, 0x5f, 0x41, 0x6b, 0xd0, 0x95, 0x96, 0xc4, - 0x28, 0xc3, 0xeb, 0xc4, 0x19, 0x61, 0xe0, 0xed, - 0x1e, 0xd, 0x70, 0xe1, 0xce, 0x8b, 0x6, 0x8e, - 0x81, 0xf2, 0x21, 0x20, 0x8a, 0xe2, 0x35, 0xec, + 0x6, 0x96, 0x1b, 0xa3, 0x87, 0x2a, 0xf, 0x5a, + 0x1d, 0x7d, 0x5, 0xaf, 0x62, 0x57, 0xe, 0x21, + 0x26, 0x1f, 0x76, 0x41, 0xe4, 0x78, 0x3b, 0x47, + 0x83, 0x5c, 0x38, 0x73, 0xa2, 0xc1, 0xa3, 0xa0, + 0x7c, 0x88, 0x49, 0xc5, 0x70, 0x9a, 0xf6, 0x0, /* U+0161 "š" */ - 0x1c, 0x70, 0x2b, 0xb0, 0xa6, 0xe, 0x90, 0x9f, - 0x91, 0x84, 0xa6, 0x76, 0x21, 0xdf, 0x1a, 0x13, - 0x96, 0x85, 0xc5, 0x14, 0x38, 0xd0, 0x3a, 0x3a, - 0xa, 0x85, 0x50, + 0x1c, 0x70, 0x2b, 0xa0, 0x53, 0x21, 0xa4, 0x27, + 0xe8, 0x61, 0x1b, 0x3b, 0x10, 0xef, 0x8d, 0x9, + 0xcb, 0x82, 0xe1, 0x94, 0x38, 0xd0, 0x3a, 0x3a, + 0xa, 0x85, 0xa0, /* U+017D "Ž" */ - 0x2, 0x5, 0x6, 0xe6, 0x43, 0x4d, 0x3, 0xd4, - 0x42, 0xfa, 0x9f, 0xb, 0xe0, 0xab, 0xb2, 0xf, - 0x42, 0x1c, 0x90, 0x7a, 0x10, 0xe4, 0x83, 0xd0, - 0x87, 0x24, 0x1e, 0x84, 0x39, 0x20, 0xf4, 0x21, - 0xc9, 0x7, 0xa3, 0xaf, 0x1, 0x7e, + 0x2, 0x81, 0x7, 0x46, 0x1c, 0xac, 0x83, 0xa9, + 0x85, 0xfa, 0xfc, 0xbf, 0xd, 0x78, 0x10, 0x72, + 0xc1, 0xe8, 0x83, 0x91, 0xf, 0x44, 0x1d, 0x10, + 0x79, 0x10, 0xe8, 0x83, 0xc8, 0x87, 0x64, 0x1c, + 0x81, 0xe, 0x86, 0xbc, 0x5, 0xf8, /* U+017E "ž" */ - 0x28, 0x58, 0x27, 0x70, 0xbb, 0xe, 0x42, 0xff, - 0x97, 0x81, 0x58, 0x10, 0x4b, 0x82, 0x88, 0x24, - 0x83, 0x42, 0x14, 0x61, 0x2c, 0x1a, 0x5, 0x60, - 0x2f, 0x0, - - /* U+1E9E "ẞ" */ - 0x1f, 0xa0, 0xd0, 0xb6, 0x8, 0xea, 0x21, 0xd, - 0x90, 0x72, 0xa0, 0xf4, 0x21, 0xc8, 0xa0, 0xf9, - 0xb0, 0xcf, 0x91, 0xf, 0x44, 0x1f, 0xfc, 0xe4, - 0x2e, 0x99, 0x6, 0x5b, 0x0, + 0x1c, 0xa0, 0x15, 0xb0, 0x54, 0xc3, 0x90, 0xbf, + 0xe5, 0xe0, 0x56, 0x48, 0x24, 0x50, 0x51, 0x5, + 0x8, 0x64, 0x82, 0x88, 0x25, 0x8, 0x50, 0xd6, + 0x2, 0xf0, /* U+2022 "•" */ 0x7c, 0xc0, 0x83, 0x40, 0x80, /* U+20AC "€" */ - 0x9, 0xf9, 0x5, 0x5, 0x4, 0xae, 0x89, 0x18, - 0x7c, 0x86, 0x92, 0xa0, 0x20, 0x58, 0x18, 0x3e, - 0x6, 0xf, 0x80, 0x81, 0x60, 0x49, 0x50, 0x72, - 0x1d, 0x18, 0x79, 0x5d, 0x10, 0x50, 0x50, + 0xd, 0x7c, 0x1b, 0x5c, 0x12, 0x35, 0x5, 0x90, + 0x79, 0xf, 0xa0, 0x51, 0x2, 0x80, 0xa8, 0xe, + 0x3f, 0x1, 0xc7, 0xe0, 0x28, 0xa, 0x82, 0x81, + 0x44, 0x32, 0x1f, 0xb2, 0xf, 0x23, 0x50, 0x6d, + 0x78, /* U+E004 "" */ 0xe, 0x7d, 0x7, 0xf3, 0x1, 0xc3, 0xf4, 0x1c, @@ -2521,366 +2525,365 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 0, .adv_w = 73, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 0, .adv_w = 79, .box_w = 2, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, {.bitmap_index = 6, .adv_w = 103, .box_w = 4, .box_h = 5, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 10, .adv_w = 175, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11, .adv_w = 175, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, {.bitmap_index = 45, .adv_w = 158, .box_w = 8, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, {.bitmap_index = 82, .adv_w = 203, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 120, .adv_w = 174, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 155, .adv_w = 56, .box_w = 2, .box_h = 5, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 157, .adv_w = 100, .box_w = 5, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 180, .adv_w = 102, .box_w = 5, .box_h = 22, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 204, .adv_w = 138, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 226, .adv_w = 159, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 239, .adv_w = 63, .box_w = 3, .box_h = 6, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 244, .adv_w = 79, .box_w = 4, .box_h = 2, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 246, .adv_w = 84, .box_w = 2, .box_h = 3, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 248, .adv_w = 119, .box_w = 7, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 273, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 295, .adv_w = 158, .box_w = 5, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 304, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 333, .adv_w = 158, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 358, .adv_w = 158, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 386, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 414, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 443, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 469, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 499, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 528, .adv_w = 75, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 534, .adv_w = 65, .box_w = 3, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 544, .adv_w = 143, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 562, .adv_w = 153, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 570, .adv_w = 147, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 588, .adv_w = 135, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 612, .adv_w = 246, .box_w = 13, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 670, .adv_w = 185, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 709, .adv_w = 175, .box_w = 8, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 733, .adv_w = 181, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 758, .adv_w = 183, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 782, .adv_w = 159, .box_w = 8, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 801, .adv_w = 154, .box_w = 8, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 817, .adv_w = 189, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 848, .adv_w = 198, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 861, .adv_w = 80, .box_w = 2, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 865, .adv_w = 155, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 879, .adv_w = 175, .box_w = 10, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 911, .adv_w = 152, .box_w = 8, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 920, .adv_w = 242, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 959, .adv_w = 198, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 987, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1017, .adv_w = 177, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1040, .adv_w = 192, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1076, .adv_w = 170, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1103, .adv_w = 166, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1135, .adv_w = 167, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1147, .adv_w = 180, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1163, .adv_w = 179, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1200, .adv_w = 244, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1251, .adv_w = 176, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1290, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 1317, .adv_w = 167, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1346, .adv_w = 80, .box_w = 3, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1353, .adv_w = 118, .box_w = 8, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1380, .adv_w = 80, .box_w = 4, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1388, .adv_w = 119, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 7}, - {.bitmap_index = 1402, .adv_w = 130, .box_w = 8, .box_h = 2, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1405, .adv_w = 99, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 12}, - {.bitmap_index = 1409, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1430, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1453, .adv_w = 148, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1472, .adv_w = 159, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1492, .adv_w = 150, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1513, .adv_w = 101, .box_w = 6, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1529, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 1553, .adv_w = 155, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1564, .adv_w = 73, .box_w = 2, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1570, .adv_w = 72, .box_w = 4, .box_h = 19, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 1581, .adv_w = 144, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1603, .adv_w = 73, .box_w = 2, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1607, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1625, .adv_w = 155, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1634, .adv_w = 161, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1651, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 1676, .adv_w = 160, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 1696, .adv_w = 98, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1704, .adv_w = 146, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1724, .adv_w = 95, .box_w = 5, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1738, .adv_w = 155, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1747, .adv_w = 137, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1771, .adv_w = 208, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1807, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1832, .adv_w = 133, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 1863, .adv_w = 140, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1882, .adv_w = 98, .box_w = 6, .box_h = 21, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 1908, .adv_w = 78, .box_w = 2, .box_h = 17, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 1912, .adv_w = 98, .box_w = 6, .box_h = 21, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 1939, .adv_w = 189, .box_w = 10, .box_h = 4, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 1950, .adv_w = 73, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1950, .adv_w = 74, .box_w = 2, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1956, .adv_w = 164, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1982, .adv_w = 120, .box_w = 5, .box_h = 6, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 1990, .adv_w = 150, .box_w = 8, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2008, .adv_w = 105, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 6}, - {.bitmap_index = 2019, .adv_w = 105, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 2031, .adv_w = 160, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 2043, .adv_w = 135, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 2066, .adv_w = 185, .box_w = 12, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2114, .adv_w = 185, .box_w = 12, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2162, .adv_w = 185, .box_w = 12, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2211, .adv_w = 185, .box_w = 12, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2261, .adv_w = 185, .box_w = 12, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2309, .adv_w = 185, .box_w = 12, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2360, .adv_w = 260, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2411, .adv_w = 181, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 2444, .adv_w = 159, .box_w = 8, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2471, .adv_w = 159, .box_w = 8, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2497, .adv_w = 159, .box_w = 8, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2524, .adv_w = 159, .box_w = 8, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2549, .adv_w = 80, .box_w = 5, .box_h = 19, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2559, .adv_w = 80, .box_w = 5, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2568, .adv_w = 80, .box_w = 6, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2580, .adv_w = 80, .box_w = 6, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2591, .adv_w = 187, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2621, .adv_w = 198, .box_w = 9, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2657, .adv_w = 192, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2695, .adv_w = 192, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2733, .adv_w = 192, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2772, .adv_w = 192, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2812, .adv_w = 192, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2850, .adv_w = 151, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 2873, .adv_w = 192, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2912, .adv_w = 180, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2936, .adv_w = 180, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 122, .adv_w = 174, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 156, .adv_w = 56, .box_w = 2, .box_h = 5, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 158, .adv_w = 100, .box_w = 5, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 183, .adv_w = 102, .box_w = 5, .box_h = 22, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 207, .adv_w = 138, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 229, .adv_w = 159, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 243, .adv_w = 63, .box_w = 3, .box_h = 6, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 248, .adv_w = 79, .box_w = 4, .box_h = 2, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 250, .adv_w = 84, .box_w = 2, .box_h = 3, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 252, .adv_w = 119, .box_w = 7, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 277, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 301, .adv_w = 158, .box_w = 5, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 310, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 339, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 368, .adv_w = 158, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 398, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 426, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 455, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 481, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 509, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 538, .adv_w = 75, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 544, .adv_w = 65, .box_w = 3, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 554, .adv_w = 143, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 572, .adv_w = 153, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 580, .adv_w = 147, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 598, .adv_w = 135, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 622, .adv_w = 246, .box_w = 13, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 679, .adv_w = 185, .box_w = 12, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 718, .adv_w = 175, .box_w = 8, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 742, .adv_w = 181, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 771, .adv_w = 183, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 791, .adv_w = 159, .box_w = 8, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 810, .adv_w = 154, .box_w = 8, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 826, .adv_w = 189, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 857, .adv_w = 198, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 870, .adv_w = 80, .box_w = 2, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 874, .adv_w = 155, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 887, .adv_w = 175, .box_w = 10, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 919, .adv_w = 152, .box_w = 8, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 929, .adv_w = 242, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 968, .adv_w = 198, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 996, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1027, .adv_w = 177, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1049, .adv_w = 192, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 1086, .adv_w = 170, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1113, .adv_w = 166, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1145, .adv_w = 167, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1158, .adv_w = 180, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1173, .adv_w = 179, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1210, .adv_w = 244, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1261, .adv_w = 176, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1300, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1330, .adv_w = 167, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1359, .adv_w = 80, .box_w = 3, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 1366, .adv_w = 118, .box_w = 8, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1393, .adv_w = 80, .box_w = 4, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1401, .adv_w = 119, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 1415, .adv_w = 130, .box_w = 8, .box_h = 2, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1418, .adv_w = 99, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 1422, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1445, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1465, .adv_w = 148, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1486, .adv_w = 159, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1510, .adv_w = 150, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1531, .adv_w = 101, .box_w = 6, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1546, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1574, .adv_w = 155, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1588, .adv_w = 73, .box_w = 2, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1594, .adv_w = 72, .box_w = 4, .box_h = 19, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 1604, .adv_w = 144, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1626, .adv_w = 73, .box_w = 2, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1630, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1649, .adv_w = 155, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1660, .adv_w = 161, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1681, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1703, .adv_w = 160, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1727, .adv_w = 98, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1735, .adv_w = 146, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1755, .adv_w = 95, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1770, .adv_w = 155, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1781, .adv_w = 137, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1805, .adv_w = 208, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1840, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1865, .adv_w = 133, .box_w = 8, .box_h = 15, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 1895, .adv_w = 140, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1914, .adv_w = 98, .box_w = 6, .box_h = 21, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 1939, .adv_w = 78, .box_w = 2, .box_h = 17, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 1943, .adv_w = 98, .box_w = 6, .box_h = 22, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 1970, .adv_w = 189, .box_w = 10, .box_h = 4, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 1981, .adv_w = 73, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1981, .adv_w = 74, .box_w = 2, .box_h = 14, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 1987, .adv_w = 164, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2017, .adv_w = 120, .box_w = 5, .box_h = 6, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 2026, .adv_w = 150, .box_w = 8, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2045, .adv_w = 105, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 2057, .adv_w = 105, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 2069, .adv_w = 160, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2085, .adv_w = 135, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2108, .adv_w = 185, .box_w = 12, .box_h = 19, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2156, .adv_w = 185, .box_w = 12, .box_h = 19, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2204, .adv_w = 185, .box_w = 12, .box_h = 19, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2253, .adv_w = 185, .box_w = 12, .box_h = 19, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2302, .adv_w = 185, .box_w = 12, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2350, .adv_w = 185, .box_w = 12, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2402, .adv_w = 260, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2453, .adv_w = 181, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2489, .adv_w = 159, .box_w = 8, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2516, .adv_w = 159, .box_w = 8, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2543, .adv_w = 159, .box_w = 8, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2570, .adv_w = 159, .box_w = 8, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2596, .adv_w = 80, .box_w = 5, .box_h = 19, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2605, .adv_w = 80, .box_w = 5, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2614, .adv_w = 80, .box_w = 6, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2626, .adv_w = 80, .box_w = 6, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2637, .adv_w = 187, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2669, .adv_w = 198, .box_w = 9, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2706, .adv_w = 192, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2744, .adv_w = 192, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2783, .adv_w = 192, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2823, .adv_w = 192, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2863, .adv_w = 192, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2897, .adv_w = 151, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 2920, .adv_w = 192, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, {.bitmap_index = 2960, .adv_w = 180, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2984, .adv_w = 180, .box_w = 9, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3007, .adv_w = 168, .box_w = 11, .box_h = 19, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3043, .adv_w = 165, .box_w = 8, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3065, .adv_w = 167, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3089, .adv_w = 153, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3117, .adv_w = 153, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3145, .adv_w = 153, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3174, .adv_w = 153, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3205, .adv_w = 153, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3234, .adv_w = 153, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3266, .adv_w = 233, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3302, .adv_w = 148, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 3328, .adv_w = 150, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3356, .adv_w = 150, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3384, .adv_w = 150, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3413, .adv_w = 150, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3443, .adv_w = 75, .box_w = 5, .box_h = 15, .ofs_x = -2, .ofs_y = 0}, - {.bitmap_index = 3453, .adv_w = 75, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3462, .adv_w = 75, .box_w = 6, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3473, .adv_w = 75, .box_w = 6, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3483, .adv_w = 164, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3513, .adv_w = 155, .box_w = 7, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3530, .adv_w = 161, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3554, .adv_w = 161, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3578, .adv_w = 161, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3603, .adv_w = 161, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3630, .adv_w = 161, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3655, .adv_w = 160, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 3671, .adv_w = 160, .box_w = 8, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3699, .adv_w = 155, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3714, .adv_w = 155, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3729, .adv_w = 155, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3745, .adv_w = 155, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3760, .adv_w = 133, .box_w = 9, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 3799, .adv_w = 163, .box_w = 8, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 3824, .adv_w = 133, .box_w = 9, .box_h = 19, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 3864, .adv_w = 189, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3903, .adv_w = 158, .box_w = 8, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 3936, .adv_w = 80, .box_w = 2, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3941, .adv_w = 75, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3945, .adv_w = 265, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3982, .adv_w = 249, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4018, .adv_w = 166, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 4058, .adv_w = 146, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 4085, .adv_w = 166, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4125, .adv_w = 146, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4152, .adv_w = 167, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4190, .adv_w = 140, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4216, .adv_w = 180, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4245, .adv_w = 108, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 4250, .adv_w = 158, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4281, .adv_w = 320, .box_w = 14, .box_h = 13, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 4319, .adv_w = 320, .box_w = 17, .box_h = 12, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 4359, .adv_w = 320, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 4437, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4500, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 4533, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 4572, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 4609, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 4642, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 4662, .adv_w = 320, .box_w = 15, .box_h = 18, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 4703, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 4747, .adv_w = 320, .box_w = 11, .box_h = 17, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 4790, .adv_w = 320, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4822, .adv_w = 320, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4862, .adv_w = 320, .box_w = 12, .box_h = 19, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 4887, .adv_w = 320, .box_w = 16, .box_h = 12, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 4927, .adv_w = 320, .box_w = 10, .box_h = 7, .ofs_x = 5, .ofs_y = 4}, - {.bitmap_index = 4944, .adv_w = 320, .box_w = 7, .box_h = 11, .ofs_x = 6, .ofs_y = 2}, - {.bitmap_index = 4962, .adv_w = 320, .box_w = 7, .box_h = 11, .ofs_x = 7, .ofs_y = 2}, - {.bitmap_index = 4981, .adv_w = 320, .box_w = 10, .box_h = 7, .ofs_x = 5, .ofs_y = 4}, - {.bitmap_index = 4998, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 5067, .adv_w = 320, .box_w = 12, .box_h = 13, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 5103, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5143, .adv_w = 320, .box_w = 4, .box_h = 15, .ofs_x = 8, .ofs_y = 0}, - {.bitmap_index = 5160, .adv_w = 320, .box_w = 19, .box_h = 13, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 5202, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5260, .adv_w = 320, .box_w = 13, .box_h = 16, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 5308, .adv_w = 320, .box_w = 13, .box_h = 17, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 5343, .adv_w = 320, .box_w = 19, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5406, .adv_w = 320, .box_w = 18, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5452, .adv_w = 320, .box_w = 19, .box_h = 13, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 5495, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5553, .adv_w = 320, .box_w = 20, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 5585, .adv_w = 320, .box_w = 18, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5646, .adv_w = 320, .box_w = 12, .box_h = 17, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 5686, .adv_w = 320, .box_w = 13, .box_h = 18, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 5725, .adv_w = 320, .box_w = 12, .box_h = 2, .ofs_x = 4, .ofs_y = 7}, - {.bitmap_index = 5729, .adv_w = 320, .box_w = 10, .box_h = 12, .ofs_x = 5, .ofs_y = 2}, - {.bitmap_index = 5739, .adv_w = 320, .box_w = 10, .box_h = 13, .ofs_x = 6, .ofs_y = 1}, - {.bitmap_index = 5764, .adv_w = 320, .box_w = 12, .box_h = 12, .ofs_x = 4, .ofs_y = 2}, - {.bitmap_index = 5781, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 5824, .adv_w = 320, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 5889, .adv_w = 320, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 5942, .adv_w = 320, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6004, .adv_w = 320, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6058, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6124, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6170, .adv_w = 320, .box_w = 13, .box_h = 13, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 6204, .adv_w = 320, .box_w = 11, .box_h = 10, .ofs_x = 4, .ofs_y = 2}, - {.bitmap_index = 6225, .adv_w = 320, .box_w = 11, .box_h = 10, .ofs_x = 5, .ofs_y = 2}, - {.bitmap_index = 6246, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6296, .adv_w = 320, .box_w = 12, .box_h = 17, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 6340, .adv_w = 320, .box_w = 10, .box_h = 10, .ofs_x = 5, .ofs_y = 2}, - {.bitmap_index = 6347, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6409, .adv_w = 320, .box_w = 19, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6440, .adv_w = 320, .box_w = 9, .box_h = 17, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 6467, .adv_w = 320, .box_w = 15, .box_h = 18, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6524, .adv_w = 320, .box_w = 15, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 6583, .adv_w = 320, .box_w = 16, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6634, .adv_w = 320, .box_w = 12, .box_h = 15, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 6665, .adv_w = 320, .box_w = 10, .box_h = 15, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 6696, .adv_w = 320, .box_w = 10, .box_h = 15, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 6733, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6791, .adv_w = 320, .box_w = 17, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 6864, .adv_w = 320, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6927, .adv_w = 320, .box_w = 19, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 6997, .adv_w = 320, .box_w = 18, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7057, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7106, .adv_w = 320, .box_w = 16, .box_h = 16, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 7160, .adv_w = 320, .box_w = 18, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7223, .adv_w = 320, .box_w = 13, .box_h = 15, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 7255, .adv_w = 320, .box_w = 17, .box_h = 13, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 7302, .adv_w = 320, .box_w = 16, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 7366, .adv_w = 320, .box_w = 18, .box_h = 15, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 7412, .adv_w = 320, .box_w = 10, .box_h = 15, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 7434, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 7473, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7512, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7550, .adv_w = 320, .box_w = 19, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 7622, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7690, .adv_w = 320, .box_w = 14, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 7737, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7801, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 7855, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7903, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7954, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 7986, .adv_w = 320, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 8038, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8066, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8092, .adv_w = 320, .box_w = 9, .box_h = 17, .ofs_x = 6, .ofs_y = -1}, - {.bitmap_index = 8112, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 8167, .adv_w = 320, .box_w = 13, .box_h = 15, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 8205, .adv_w = 320, .box_w = 12, .box_h = 17, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 8250, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8312, .adv_w = 320, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 8374, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8429, .adv_w = 320, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8478, .adv_w = 320, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8518, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8548, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 8588, .adv_w = 320, .box_w = 17, .box_h = 9, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8619, .adv_w = 320, .box_w = 17, .box_h = 12, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 8653, .adv_w = 320, .box_w = 19, .box_h = 17, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8710, .adv_w = 320, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8758, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 8826, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8893, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8937, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9001, .adv_w = 220, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 9045, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9126, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9198, .adv_w = 360, .box_w = 23, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 9273, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9335, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9395, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 9458, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9540, .adv_w = 160, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9561, .adv_w = 240, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 9610, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9698, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9756, .adv_w = 220, .box_w = 14, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9816, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 9861, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 9931, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 9961, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 9988, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 10031, .adv_w = 280, .box_w = 19, .box_h = 18, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 10092, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 10138, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 10184, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 10218, .adv_w = 280, .box_w = 18, .box_h = 4, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 10232, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10311, .adv_w = 400, .box_w = 26, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 10423, .adv_w = 360, .box_w = 24, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 10516, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10597, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 10640, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 10684, .adv_w = 400, .box_w = 26, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 10754, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10782, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10845, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 10929, .adv_w = 320, .box_w = 18, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10965, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 11039, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11085, .adv_w = 280, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 11135, .adv_w = 280, .box_w = 18, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11174, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11224, .adv_w = 200, .box_w = 14, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 11281, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11334, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11399, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11466, .adv_w = 320, .box_w = 22, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 11544, .adv_w = 320, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 11587, .adv_w = 240, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11617, .adv_w = 320, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11660, .adv_w = 320, .box_w = 17, .box_h = 14, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 11711, .adv_w = 400, .box_w = 25, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 11801, .adv_w = 320, .box_w = 19, .box_h = 12, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 11852, .adv_w = 320, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 11889, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11932, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11960, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 12007, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 12055, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 12101, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 12146, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 12187, .adv_w = 400, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 12265, .adv_w = 280, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 12334, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 12358, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 12390, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 12427, .adv_w = 320, .box_w = 19, .box_h = 13, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 12485, .adv_w = 320, .box_w = 17, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 12529, .adv_w = 320, .box_w = 17, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 12564, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12613, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 12694, .adv_w = 320, .box_w = 10, .box_h = 19, .ofs_x = 5, .ofs_y = -2}, - {.bitmap_index = 12731, .adv_w = 400, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12806, .adv_w = 240, .box_w = 15, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12842, .adv_w = 322, .box_w = 21, .box_h = 13, .ofs_x = 0, .ofs_y = 1} + {.bitmap_index = 2983, .adv_w = 180, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3007, .adv_w = 180, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3031, .adv_w = 180, .box_w = 9, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3054, .adv_w = 168, .box_w = 11, .box_h = 19, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3093, .adv_w = 165, .box_w = 8, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3115, .adv_w = 167, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3140, .adv_w = 153, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3170, .adv_w = 153, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3199, .adv_w = 153, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3230, .adv_w = 153, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3263, .adv_w = 153, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3291, .adv_w = 153, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3323, .adv_w = 233, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3359, .adv_w = 148, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 3387, .adv_w = 150, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3415, .adv_w = 150, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3443, .adv_w = 150, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3472, .adv_w = 150, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3502, .adv_w = 75, .box_w = 5, .box_h = 15, .ofs_x = -2, .ofs_y = 0}, + {.bitmap_index = 3512, .adv_w = 75, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3521, .adv_w = 75, .box_w = 6, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3532, .adv_w = 75, .box_w = 6, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3542, .adv_w = 164, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3572, .adv_w = 155, .box_w = 7, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3592, .adv_w = 161, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3620, .adv_w = 161, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3648, .adv_w = 161, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3676, .adv_w = 161, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3706, .adv_w = 161, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3734, .adv_w = 160, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 3750, .adv_w = 160, .box_w = 8, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3779, .adv_w = 155, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3796, .adv_w = 155, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3814, .adv_w = 155, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3832, .adv_w = 155, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3850, .adv_w = 133, .box_w = 8, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 3887, .adv_w = 163, .box_w = 8, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 3911, .adv_w = 133, .box_w = 8, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 3948, .adv_w = 189, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3988, .adv_w = 158, .box_w = 8, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 4025, .adv_w = 80, .box_w = 2, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4030, .adv_w = 75, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4034, .adv_w = 265, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4074, .adv_w = 249, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4111, .adv_w = 166, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 4151, .adv_w = 146, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 4177, .adv_w = 166, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4217, .adv_w = 146, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4244, .adv_w = 167, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4282, .adv_w = 140, .box_w = 7, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4308, .adv_w = 108, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 4313, .adv_w = 158, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4346, .adv_w = 320, .box_w = 14, .box_h = 13, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 4384, .adv_w = 320, .box_w = 17, .box_h = 12, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 4424, .adv_w = 320, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 4502, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4565, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4598, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 4637, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 4674, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4707, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 4727, .adv_w = 320, .box_w = 15, .box_h = 18, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 4768, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4812, .adv_w = 320, .box_w = 11, .box_h = 17, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 4855, .adv_w = 320, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4887, .adv_w = 320, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4927, .adv_w = 320, .box_w = 12, .box_h = 19, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 4952, .adv_w = 320, .box_w = 16, .box_h = 12, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 4992, .adv_w = 320, .box_w = 10, .box_h = 7, .ofs_x = 5, .ofs_y = 4}, + {.bitmap_index = 5009, .adv_w = 320, .box_w = 7, .box_h = 11, .ofs_x = 6, .ofs_y = 2}, + {.bitmap_index = 5027, .adv_w = 320, .box_w = 7, .box_h = 11, .ofs_x = 7, .ofs_y = 2}, + {.bitmap_index = 5046, .adv_w = 320, .box_w = 10, .box_h = 7, .ofs_x = 5, .ofs_y = 4}, + {.bitmap_index = 5063, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5132, .adv_w = 320, .box_w = 12, .box_h = 13, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 5168, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5208, .adv_w = 320, .box_w = 4, .box_h = 15, .ofs_x = 8, .ofs_y = 0}, + {.bitmap_index = 5225, .adv_w = 320, .box_w = 19, .box_h = 13, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 5267, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5325, .adv_w = 320, .box_w = 13, .box_h = 16, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 5373, .adv_w = 320, .box_w = 13, .box_h = 17, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 5408, .adv_w = 320, .box_w = 19, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5471, .adv_w = 320, .box_w = 18, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5517, .adv_w = 320, .box_w = 19, .box_h = 13, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 5560, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5618, .adv_w = 320, .box_w = 20, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 5650, .adv_w = 320, .box_w = 18, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5711, .adv_w = 320, .box_w = 12, .box_h = 17, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 5751, .adv_w = 320, .box_w = 13, .box_h = 18, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 5790, .adv_w = 320, .box_w = 12, .box_h = 2, .ofs_x = 4, .ofs_y = 7}, + {.bitmap_index = 5794, .adv_w = 320, .box_w = 10, .box_h = 12, .ofs_x = 5, .ofs_y = 2}, + {.bitmap_index = 5804, .adv_w = 320, .box_w = 10, .box_h = 13, .ofs_x = 6, .ofs_y = 1}, + {.bitmap_index = 5829, .adv_w = 320, .box_w = 12, .box_h = 12, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 5846, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 5889, .adv_w = 320, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5954, .adv_w = 320, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6007, .adv_w = 320, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6069, .adv_w = 320, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6123, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6189, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6235, .adv_w = 320, .box_w = 13, .box_h = 13, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 6269, .adv_w = 320, .box_w = 11, .box_h = 10, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 6290, .adv_w = 320, .box_w = 11, .box_h = 10, .ofs_x = 5, .ofs_y = 2}, + {.bitmap_index = 6311, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6361, .adv_w = 320, .box_w = 12, .box_h = 17, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 6405, .adv_w = 320, .box_w = 10, .box_h = 10, .ofs_x = 5, .ofs_y = 2}, + {.bitmap_index = 6412, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6474, .adv_w = 320, .box_w = 19, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6505, .adv_w = 320, .box_w = 9, .box_h = 17, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 6532, .adv_w = 320, .box_w = 15, .box_h = 18, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6589, .adv_w = 320, .box_w = 15, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 6648, .adv_w = 320, .box_w = 16, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6699, .adv_w = 320, .box_w = 12, .box_h = 15, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 6730, .adv_w = 320, .box_w = 10, .box_h = 15, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 6761, .adv_w = 320, .box_w = 10, .box_h = 15, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 6798, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6856, .adv_w = 320, .box_w = 17, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 6929, .adv_w = 320, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6992, .adv_w = 320, .box_w = 19, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 7062, .adv_w = 320, .box_w = 18, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7122, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7171, .adv_w = 320, .box_w = 16, .box_h = 16, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 7225, .adv_w = 320, .box_w = 18, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7288, .adv_w = 320, .box_w = 13, .box_h = 15, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 7320, .adv_w = 320, .box_w = 17, .box_h = 13, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 7367, .adv_w = 320, .box_w = 16, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 7431, .adv_w = 320, .box_w = 18, .box_h = 15, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 7477, .adv_w = 320, .box_w = 10, .box_h = 15, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 7499, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 7538, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7577, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7615, .adv_w = 320, .box_w = 19, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 7687, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7755, .adv_w = 320, .box_w = 14, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 7802, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7866, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 7920, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7968, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8019, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 8051, .adv_w = 320, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 8103, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8131, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8157, .adv_w = 320, .box_w = 9, .box_h = 17, .ofs_x = 6, .ofs_y = -1}, + {.bitmap_index = 8177, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8232, .adv_w = 320, .box_w = 13, .box_h = 15, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8270, .adv_w = 320, .box_w = 12, .box_h = 17, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 8315, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8377, .adv_w = 320, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 8439, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8494, .adv_w = 320, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8543, .adv_w = 320, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8583, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8613, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8653, .adv_w = 320, .box_w = 17, .box_h = 9, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8684, .adv_w = 320, .box_w = 17, .box_h = 12, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 8718, .adv_w = 320, .box_w = 19, .box_h = 17, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8775, .adv_w = 320, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8823, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8891, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8958, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9002, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9066, .adv_w = 220, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9110, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9191, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9263, .adv_w = 360, .box_w = 23, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9338, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9400, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9460, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 9523, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9605, .adv_w = 160, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9626, .adv_w = 240, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9675, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9763, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9821, .adv_w = 220, .box_w = 14, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9881, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 9926, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9996, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10026, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10053, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 10096, .adv_w = 280, .box_w = 19, .box_h = 18, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 10157, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10203, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10249, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10283, .adv_w = 280, .box_w = 18, .box_h = 4, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 10297, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10376, .adv_w = 400, .box_w = 26, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 10488, .adv_w = 360, .box_w = 24, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 10581, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10662, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 10705, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 10749, .adv_w = 400, .box_w = 26, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10819, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10847, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10910, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 10994, .adv_w = 320, .box_w = 18, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11030, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 11104, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11150, .adv_w = 280, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 11200, .adv_w = 280, .box_w = 18, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11239, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11289, .adv_w = 200, .box_w = 14, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 11346, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11399, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11464, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11531, .adv_w = 320, .box_w = 22, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 11609, .adv_w = 320, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11652, .adv_w = 240, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11682, .adv_w = 320, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11725, .adv_w = 320, .box_w = 17, .box_h = 14, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 11776, .adv_w = 400, .box_w = 25, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 11866, .adv_w = 320, .box_w = 19, .box_h = 12, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 11917, .adv_w = 320, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 11954, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11997, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12025, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 12072, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 12120, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 12166, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 12211, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 12252, .adv_w = 400, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12330, .adv_w = 280, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 12399, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 12423, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 12455, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 12492, .adv_w = 320, .box_w = 19, .box_h = 13, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 12550, .adv_w = 320, .box_w = 17, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12594, .adv_w = 320, .box_w = 17, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12629, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12678, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 12759, .adv_w = 320, .box_w = 10, .box_h = 19, .ofs_x = 5, .ofs_y = -2}, + {.bitmap_index = 12796, .adv_w = 400, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12871, .adv_w = 240, .box_w = 15, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12907, .adv_w = 322, .box_w = 21, .box_h = 13, .ofs_x = 0, .ofs_y = 1} }; /*--------------------- @@ -2893,30 +2896,30 @@ static const uint16_t unicode_list_1[] = { static const uint16_t unicode_list_3[] = { 0x0, 0x1, 0x12, 0x13, 0x34, 0x35, 0x40, 0x41, - 0x42, 0x43, 0x5f, 0x60, 0x1d80, 0x1f04, 0x1f8e, 0xdee6, - 0xdef3, 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, - 0xdf7c, 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, - 0xe023, 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, - 0xe0f2, 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, - 0xe20c, 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, - 0xe31a, 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, - 0xe390, 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, - 0xe447, 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, - 0xe48a, 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, - 0xe583, 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, - 0xe5f9, 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, - 0xe7bf, 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, - 0xe952, 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, - 0xeeea, 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, - 0xeefe, 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, - 0xef2a, 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, - 0xef49, 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, - 0xef5b, 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, - 0xefab, 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, - 0xf03d, 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, - 0xf122, 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, - 0xf184, 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, - 0xf43c, 0xf6a4, 0xf784 + 0x42, 0x43, 0x5f, 0x60, 0x1f04, 0x1f8e, 0xdee6, 0xdef3, + 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, 0xdf7c, + 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, 0xe023, + 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, 0xe0f2, + 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, 0xe20c, + 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, 0xe31a, + 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, 0xe390, + 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, 0xe447, + 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, 0xe48a, + 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, 0xe583, + 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, 0xe5f9, + 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, 0xe7bf, + 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, 0xe952, + 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, 0xeeea, + 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, 0xeefe, + 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, 0xef2a, + 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, 0xef49, + 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, 0xef5b, + 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, 0xefab, + 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, 0xf03d, + 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, 0xf122, + 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, 0xf184, + 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, 0xf43c, + 0xf6a4, 0xf784 }; /*Collect the unicode lists and glyph_id offsets*/ @@ -2936,7 +2939,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = }, { .range_start = 286, .range_length = 63365, .glyph_id_start = 169, - .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 195, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 194, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_22_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_22_latin1.c index f0769cb68..16e086e5f 100644 --- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_22_latin1.c +++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_22_latin1.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 22 px * Bpp: 2 - * Opts: --no-kerning --bpp 2 --size 22 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_22_latin1.c --format lvgl + * Opts: --no-kerning --bpp 2 --size 22 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_22_latin1.c --format lvgl ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -31,35 +31,34 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf1, 0xe0, 0xff, 0x90, 0x21, 0xc0, /* U+0023 "#" */ - 0xd, 0xa5, 0x3, 0xc8, 0xe1, 0x90, 0xfe, 0xd0, - 0x90, 0x79, 0x5e, 0x3c, 0x28, 0x8, 0x14, 0x50, - 0xa2, 0xa8, 0x19, 0x10, 0xe4, 0x36, 0x1f, 0xfc, - 0xf, 0x47, 0x8b, 0x14, 0x4, 0xa, 0x28, 0x54, - 0x50, 0x3d, 0xa1, 0xe4, 0x43, 0x90, 0xd8, 0x40, + 0xd, 0xa5, 0x3, 0xc8, 0xe1, 0x90, 0xfe, 0xc3, + 0x20, 0xf2, 0x78, 0xf0, 0xa0, 0x20, 0x51, 0x42, + 0x8a, 0xa0, 0x64, 0x3e, 0x42, 0x70, 0xff, 0xe0, + 0x7a, 0x3c, 0x58, 0xa0, 0x20, 0x51, 0x42, 0xa2, + 0x81, 0xed, 0xf, 0x22, 0x1c, 0x86, 0xc2, /* U+0024 "$" */ - 0xb, 0xc1, 0xff, 0xc3, 0x41, 0x6, 0xe0, 0x3a, - 0x20, 0xf4, 0x4c, 0x60, 0x63, 0xf, 0x22, 0x1f, - 0x51, 0x30, 0xca, 0x81, 0xc1, 0xda, 0x3c, 0x1a, - 0xd1, 0xc3, 0xac, 0x10, 0x7b, 0x1f, 0x7, 0xff, - 0x11, 0x30, 0xb2, 0x80, 0xf8, 0x51, 0xa0, 0x68, - 0x14, 0x9, 0xf, 0xf8, + 0x9, 0x83, 0xd2, 0x1f, 0xfc, 0x18, 0x10, 0x5a, + 0x7, 0x21, 0xf2, 0x49, 0x2, 0x10, 0xff, 0x21, + 0x7a, 0x24, 0x32, 0x8b, 0x42, 0xa0, 0x28, 0x13, + 0xc3, 0x6, 0x71, 0xf0, 0x7f, 0xf0, 0x92, 0x2, + 0x30, 0xfa, 0x23, 0x42, 0xc2, 0x81, 0x87, 0xf8, /* U+0025 "%" */ - 0x2f, 0x41, 0xf4, 0x81, 0x41, 0xe4, 0xf1, 0x2, - 0x43, 0xfc, 0xa0, 0xfe, 0x90, 0x93, 0xc4, 0x30, - 0x52, 0x5, 0x68, 0x75, 0xe9, 0x20, 0xfe, 0xa1, - 0x40, 0xf2, 0x3a, 0xb4, 0x35, 0x45, 0x8, 0x24, - 0x50, 0xa0, 0xeb, 0xf, 0xe5, 0x7, 0xf9, 0x81, - 0x1e, 0x20, 0xf3, 0x1, 0x40, + 0x2f, 0x41, 0xf4, 0x81, 0x83, 0xc9, 0xe1, 0x4, + 0x87, 0xf9, 0x41, 0xfd, 0x21, 0x27, 0x84, 0x60, + 0xa4, 0xd, 0xa1, 0xd7, 0xa4, 0x83, 0xfa, 0x85, + 0x3, 0xc8, 0xea, 0xd0, 0xd5, 0x14, 0x20, 0x91, + 0x42, 0x83, 0xac, 0x3f, 0x94, 0x1f, 0xe6, 0x4, + 0x78, 0x43, 0xca, 0x3, 0x0, /* U+0026 "&" */ - 0x3, 0xf2, 0x1c, 0xc2, 0x48, 0x68, 0xa8, 0x83, - 0xc8, 0x87, 0xff, 0x15, 0x13, 0x20, 0xd1, 0x64, - 0x87, 0x20, 0x90, 0xe5, 0x7, 0xf4, 0x44, 0xf, - 0x19, 0x31, 0x87, 0x91, 0x46, 0x21, 0xe8, 0x28, - 0x48, 0x24, 0x34, 0x3d, 0xa0, 0x81, 0xa2, 0x38, - 0xa0, + 0x3, 0xf2, 0x1c, 0xc2, 0x48, 0x68, 0xec, 0x83, + 0xff, 0x8e, 0x88, 0x64, 0x48, 0x83, 0x45, 0x90, + 0x79, 0x6, 0x87, 0x48, 0x20, 0xe5, 0xb1, 0x47, + 0x88, 0x88, 0x83, 0xf2, 0x8c, 0x43, 0xd0, 0x58, + 0x90, 0x48, 0x12, 0x1e, 0xd0, 0x60, 0xd1, 0x1c, + 0x8, /* U+0027 "'" */ 0xf0, 0x7e, @@ -73,20 +72,21 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0029 ")" */ 0x20, 0xe6, 0xd, 0xa8, 0x33, 0x6, 0x88, 0x39, 0xc, 0x87, 0x62, 0x12, 0x61, 0xc8, 0x7f, 0xf4, - 0x50, 0x90, 0xfb, 0xb, 0x10, 0x94, 0x14, 0x41, - 0x28, 0x28, 0x83, 0x61, 0xa0, 0xc0, + 0x50, 0x90, 0xfb, 0xb, 0x10, 0x94, 0x12, 0x41, + 0x48, 0x51, 0x6, 0xc3, 0x41, 0x80, /* U+002A "*" */ 0xd, 0xe0, 0xff, 0xe6, 0x3e, 0x40, 0xf9, 0x62, - 0x4, 0x28, 0xb4, 0xf, 0x4, 0xb0, 0x87, 0x45, - 0x98, 0x76, 0x8, 0x3b, 0x9, 0xc0, + 0x4, 0x28, 0xb0, 0x9e, 0x9, 0x11, 0xe, 0x8b, + 0x30, 0xec, 0x10, 0x76, 0x13, 0x80, /* U+002B "+" */ - 0xd, 0xe0, 0xff, 0xed, 0xd6, 0x5, 0x4b, 0x80, - 0xb7, 0xe0, 0x7c, 0x1f, 0xfd, 0x80, + 0xd, 0x21, 0xf9, 0x83, 0xff, 0xac, 0xd4, 0xa, + 0x9d, 0x60, 0x2d, 0xdf, 0x3, 0xe8, 0x3f, 0xfb, + 0x80, /* U+002C "," */ - 0x7, 0x83, 0xf9, 0x12, 0x23, 0xc0, + 0x7, 0x83, 0xf9, 0x22, 0x13, 0xc0, /* U+002D "-" */ 0xac, 0xb8, @@ -110,66 +110,66 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xff, 0x40, /* U+0032 "2" */ - 0x5, 0xf2, 0x16, 0x89, 0x2, 0x1e, 0x84, 0x24, - 0x4, 0x43, 0xfd, 0xe0, 0xff, 0xe0, 0x22, 0x1e, - 0x88, 0x3a, 0x10, 0xe5, 0x10, 0x74, 0x61, 0xd9, - 0x7, 0x40, 0x43, 0x93, 0xe, 0xc1, 0x5e, 0x9, - 0x7c, + 0x5, 0xf2, 0x16, 0x89, 0x24, 0x3d, 0xc, 0x48, + 0x8, 0x87, 0xfb, 0xc1, 0xff, 0xc0, 0x44, 0x3d, + 0x10, 0x74, 0x21, 0xca, 0x20, 0xe8, 0xc3, 0xb2, + 0xe, 0x80, 0x87, 0x26, 0x1d, 0x82, 0xbc, 0x12, + 0xf8, /* U+0033 "3" */ - 0x5, 0xe8, 0x2d, 0x15, 0x91, 0x74, 0x24, 0x40, - 0x8d, 0x3, 0xca, 0xf, 0xfb, 0x20, 0x3e, 0x24, - 0x24, 0x10, 0x4d, 0xa4, 0x1d, 0xb, 0x7, 0xa8, - 0x1e, 0x44, 0x8, 0xc5, 0x38, 0x8d, 0x43, 0x80, + 0x5, 0xf2, 0xd, 0x62, 0x22, 0xb1, 0x22, 0x4, + 0x7c, 0x1f, 0xfc, 0x14, 0x25, 0x64, 0xa, 0x88, + 0x2a, 0x88, 0x32, 0xa2, 0xe, 0x45, 0x83, 0xd4, + 0xf, 0x22, 0x4, 0x62, 0xb1, 0x1a, 0xec, /* U+0034 "4" */ 0xe, 0x7c, 0x1f, 0x41, 0xf9, 0xf, 0xe8, 0x3f, 0x24, 0x1f, 0x42, 0x1e, 0x48, 0x3e, 0x84, 0x3c, 0x90, 0x7d, 0x8, 0x7a, 0x20, 0xf9, 0x2f, 0x81, - 0xe5, 0xf0, 0x15, 0x5e, 0x5, 0x3, 0xff, 0x90, + 0xcb, 0xe0, 0x3d, 0x78, 0x12, 0x1f, 0xfc, 0x80, /* U+0035 "5" */ 0x1f, 0xf2, 0x12, 0xf0, 0x32, 0xb9, 0xf, 0xfe, - 0x3a, 0x34, 0x43, 0xa5, 0x50, 0x9, 0xe8, 0x51, - 0x60, 0x63, 0xf, 0x22, 0x1f, 0xe4, 0x3e, 0x68, - 0x12, 0x28, 0x42, 0x8c, 0x8e, 0xc0, 0x8c, 0x23, - 0x80, + 0x3a, 0x34, 0x43, 0xa5, 0x50, 0x9, 0xe8, 0x41, + 0x60, 0x62, 0xf, 0x22, 0x1f, 0xe4, 0x3e, 0x68, + 0x12, 0x28, 0x42, 0xcc, 0x8e, 0xd1, 0x18, 0x47, + 0x0, /* U+0036 "6" */ - 0x9, 0xbc, 0x15, 0x11, 0x4, 0xaf, 0x40, 0x48, - 0x32, 0x41, 0xd8, 0xa9, 0x2, 0x73, 0x61, 0xae, - 0x10, 0x68, 0xac, 0x3d, 0xa1, 0xe4, 0x3f, 0x91, - 0x9, 0x32, 0xa, 0x8a, 0x3b, 0x12, 0x45, 0x60, + 0xa, 0xf0, 0x6d, 0x10, 0xa1, 0xe0, 0x95, 0x6, + 0x8c, 0x3e, 0x54, 0x81, 0x39, 0xb0, 0xde, 0x2, + 0xc, 0x11, 0x87, 0x22, 0x1f, 0xfc, 0x44, 0x43, + 0xb2, 0x4, 0x4a, 0x39, 0x12, 0x45, 0x60, /* U+0037 "7" */ - 0xff, 0xe5, 0xf8, 0x15, 0xec, 0x83, 0xd8, 0x87, + 0xff, 0xe5, 0xf8, 0x15, 0xec, 0x43, 0xd9, 0x7, 0x90, 0xf9, 0x20, 0xf4, 0x21, 0xf2, 0x1e, 0x8c, 0x3c, 0x88, 0x72, 0x21, 0xec, 0x83, 0xc8, 0x7c, 0x88, 0x7a, 0x20, 0xff, 0xe0, 0x80, /* U+0038 "8" */ - 0x5, 0xe8, 0x2d, 0x15, 0x90, 0xf4, 0x24, 0x80, - 0x88, 0x7f, 0xf1, 0x23, 0x4, 0x4c, 0x79, 0x92, - 0xd, 0x10, 0xf9, 0x24, 0x81, 0x8, 0x7f, 0xf1, - 0x11, 0x2, 0x31, 0x4e, 0x23, 0x50, 0xe0, + 0x5, 0xf2, 0xd, 0x62, 0x22, 0xb1, 0x22, 0x4, + 0x43, 0xf2, 0x21, 0xd1, 0x2b, 0x32, 0x28, 0x40, + 0x8a, 0x11, 0x12, 0xa2, 0x44, 0x8, 0x87, 0xff, + 0x11, 0x10, 0x23, 0x15, 0x88, 0xd7, 0x60, /* U+0039 "9" */ 0x5, 0xe8, 0x2d, 0x3, 0x8, 0xf8, 0x54, 0x40, 0x8c, 0x39, 0x10, 0xff, 0xe2, 0x22, 0x1d, 0x90, 0x30, 0x20, 0xf0, 0x6e, 0x6c, 0x33, 0x20, 0x43, - 0xa2, 0xc, 0xa0, 0xd7, 0x18, 0x48, 0xe0, + 0xa3, 0xc, 0xa1, 0x5, 0xc6, 0x12, 0x38, 0x0, /* U+003A ":" */ 0xe1, 0xf0, 0x7f, 0xf0, 0xbc, 0x20, /* U+003B ";" */ - 0x2c, 0x41, 0xe0, 0xff, 0xe3, 0xf8, 0x3f, 0x31, - 0x50, + 0x3c, 0x1b, 0xc1, 0xff, 0xc7, 0xf0, 0x7e, 0x62, + 0xa0, /* U+003C "<" */ 0xf, 0x28, 0x33, 0xd8, 0x5c, 0x31, 0x63, 0xc6, - 0xae, 0xf, 0xfb, 0x57, 0x21, 0x5a, 0xac, 0x35, - 0x82, 0xe, 0xec, + 0xae, 0xf, 0x21, 0xb5, 0x5a, 0x15, 0xa5, 0x86, + 0xb0, 0x41, 0xdd, 0x80, /* U+003D "=" */ 0xff, 0xcb, 0xfa, 0xbf, 0x7, 0xea, 0xfc, 0xbf, @@ -181,45 +181,45 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x27, 0x43, 0x80, /* U+003F "?" */ - 0x5, 0xf0, 0x1d, 0x63, 0x22, 0xb1, 0x1, 0x2, - 0x3e, 0xf, 0xf9, 0x10, 0xe8, 0x83, 0x64, 0x1b, - 0x24, 0x28, 0x90, 0xc8, 0x87, 0x48, 0x79, 0x83, - 0xff, 0x85, 0xe0, 0xf2, 0x1c, + 0x1f, 0xc0, 0x61, 0x46, 0x45, 0x62, 0x2, 0x4, + 0x7c, 0x1f, 0xf2, 0x21, 0xd1, 0x6, 0xc8, 0x36, + 0x48, 0x51, 0x21, 0x91, 0xe, 0x90, 0xf3, 0x7, + 0xff, 0xb, 0xc1, 0xe4, 0x38, /* U+0040 "@" */ 0xe, 0xbf, 0x21, 0xf3, 0xa2, 0x8b, 0xe, 0x62, 0xe9, 0xe3, 0xd, 0x1a, 0x1d, 0x90, 0x22, 0xf, - 0xd2, 0x4, 0x41, 0xf2, 0x4, 0x51, 0x3, 0x12, - 0x40, 0xf8, 0x48, 0xa8, 0x36, 0xa0, 0x91, 0x30, - 0xff, 0x90, 0xf9, 0xc, 0x87, 0x90, 0xfe, 0xc0, - 0x86, 0x43, 0xd8, 0x7d, 0xa1, 0xc8, 0x87, 0x3a, - 0x28, 0x14, 0x4e, 0xd5, 0x99, 0xd, 0x11, 0x50, - 0x88, 0xf9, 0x2f, 0x41, 0x24, 0x1f, 0xfc, 0x8, - 0x60, 0xff, 0xe0, 0x63, 0xd3, 0xc8, 0x7d, 0xc2, - 0x89, 0xc, + 0xda, 0x4, 0x42, 0xf8, 0x32, 0x84, 0x2c, 0x4c, + 0xf, 0x88, 0x11, 0xc8, 0x5a, 0x83, 0x28, 0x3c, + 0x87, 0x24, 0x5, 0x7, 0xec, 0x3f, 0xf9, 0x68, + 0x7f, 0xd8, 0x48, 0x7e, 0x8c, 0x16, 0x89, 0x1c, + 0x8a, 0x87, 0x30, 0x43, 0xe2, 0x31, 0x10, 0x3e, + 0x7, 0xa0, 0x92, 0xf, 0xfe, 0x4, 0x30, 0x7f, + 0xf0, 0x31, 0xf5, 0x3c, 0x1f, 0x70, 0x16, 0xc3, + 0x0, /* U+0041 "A" */ - 0xe, 0xb4, 0x3f, 0xc9, 0x87, 0xf2, 0x4, 0x3f, - 0xb1, 0x10, 0xfc, 0x91, 0x87, 0xf2, 0x4, 0x3e, - 0x8c, 0x43, 0xf2, 0x26, 0x41, 0xf2, 0x4, 0x43, - 0x93, 0x9, 0xf, 0x45, 0xf2, 0x41, 0xe5, 0xe1, - 0x9, 0x2b, 0xc1, 0xd8, 0x87, 0x22, 0x4, 0x3e, - 0x88, 0x44, 0x3f, 0xc0, + 0xe, 0x78, 0x3f, 0xe8, 0x43, 0xff, 0x84, 0x87, + 0xf2, 0x26, 0x1f, 0xd9, 0x8, 0x7f, 0x20, 0x44, + 0x3e, 0x44, 0x8c, 0x3e, 0xc8, 0x24, 0x3e, 0x43, + 0x22, 0x1f, 0x21, 0x44, 0x1d, 0xf, 0xe0, 0xf9, + 0x17, 0x80, 0x87, 0xab, 0xb2, 0x9, 0x10, 0xff, + 0xb2, 0xf, 0x22, 0x4, 0x3f, 0x44, 0x0, /* U+0042 "B" */ - 0xff, 0x41, 0x96, 0x1c, 0x2a, 0xb4, 0x83, 0xd0, - 0x87, 0xff, 0xd, 0x10, 0xf4, 0x60, 0xfc, 0x48, - 0x16, 0x4, 0x15, 0x5c, 0x41, 0xe4, 0x43, 0xff, - 0x99, 0x8, 0x2a, 0xd2, 0x2, 0xc3, 0x80, + 0xff, 0x41, 0x96, 0x1c, 0x2a, 0xb8, 0x83, 0xc8, + 0x87, 0xff, 0x15, 0xf, 0x64, 0xf, 0xc4, 0x12, + 0x1a, 0xa, 0xfa, 0x20, 0xf2, 0x21, 0xff, 0xcc, + 0x84, 0x15, 0x69, 0x1, 0x61, 0xc0, /* U+0043 "C" */ - 0xa, 0xfa, 0x9, 0xd1, 0x1c, 0x11, 0xeb, 0x46, - 0x10, 0xd1, 0x24, 0x1f, 0xfc, 0x3f, 0x7, 0xff, + 0xa, 0xfa, 0x9, 0xd6, 0x1c, 0x11, 0xd3, 0x46, + 0x20, 0xd1, 0x22, 0x1f, 0xfc, 0x3f, 0x7, 0xff, 0xbb, 0xc8, 0x87, 0xd1, 0x6, 0x88, 0x8e, 0x9a, - 0x23, 0xac, 0x38, + 0x23, 0x2c, 0x38, /* U+0044 "D" */ - 0xff, 0x21, 0xcb, 0x16, 0x1a, 0xae, 0x30, 0xf9, + 0xff, 0x41, 0xcb, 0xe, 0x1a, 0xae, 0x30, 0xf9, 0x42, 0x1f, 0x46, 0x1f, 0xc8, 0x7f, 0xfb, 0x51, 0xf, 0xb3, 0xf, 0x28, 0x41, 0x57, 0x18, 0x4b, 0x16, 0x0, @@ -234,11 +234,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xe4, 0xb, 0xd8, 0x3f, 0xa0, 0xff, 0xf2, 0x0, /* U+0047 "G" */ - 0x3, 0x7d, 0x5, 0x45, 0x87, 0x2, 0x74, 0xc1, - 0x42, 0xd, 0x8a, 0x10, 0xe5, 0x7, 0xea, 0x7, - 0xff, 0x37, 0xf8, 0x3a, 0x50, 0x7c, 0xd0, 0x3f, - 0xf8, 0x8, 0x87, 0xd1, 0x21, 0xf4, 0x5d, 0xe2, - 0x1d, 0x11, 0xd0, + 0x3, 0xfa, 0xa, 0x82, 0x87, 0x2, 0x74, 0xd2, + 0x84, 0x1a, 0x14, 0x21, 0xca, 0xf, 0xd4, 0xf, + 0xfe, 0x6f, 0xf0, 0x74, 0xa0, 0xf9, 0xa0, 0x7f, + 0xf0, 0x11, 0xf, 0xa2, 0x43, 0xe8, 0xbb, 0xc4, + 0x3a, 0x23, 0x20, /* U+0048 "H" */ 0xf0, 0x7b, 0xc1, 0xff, 0xf2, 0xff, 0x6, 0x5f, @@ -249,14 +249,14 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+004A "J" */ 0xf, 0x78, 0x3f, 0xff, 0xe1, 0xd4, 0xf, 0x28, - 0x3c, 0x88, 0x21, 0x8b, 0xc9, 0x1a, 0x7, 0x0, + 0x3c, 0x88, 0x21, 0x8a, 0x92, 0x35, 0xd8, /* U+004B "K" */ 0xf0, 0x77, 0x90, 0xfa, 0x14, 0x1e, 0x51, 0x7, 0xd1, 0x7, 0xd0, 0xa0, 0xf2, 0x88, 0x3e, 0x8c, 0x3e, 0xc3, 0xff, 0x83, 0x7, 0xce, 0x21, 0xf4, - 0x46, 0x1f, 0x90, 0x21, 0xfb, 0x20, 0xfe, 0x48, - 0x3f, 0x42, 0x83, 0xf4, 0x40, + 0x46, 0x1f, 0x90, 0x21, 0xfa, 0x20, 0xfc, 0xa2, + 0xf, 0xd0, 0x87, 0xf4, 0x60, /* U+004C "L" */ 0xf0, 0x7f, 0xff, 0xc3, 0xff, 0xb3, 0x5e, 0x2, @@ -264,11 +264,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+004D "M" */ 0xf4, 0x1f, 0x5e, 0x2, 0x1f, 0x21, 0xc8, 0x72, - 0x1e, 0xc3, 0xb0, 0xf2, 0x1c, 0x87, 0x41, 0xf4, - 0x19, 0x20, 0xa1, 0xf, 0x21, 0x21, 0xf2, 0x1c, - 0x87, 0xa1, 0x12, 0xf, 0xd1, 0x7, 0xf2, 0x12, - 0x1f, 0xb2, 0x30, 0xfc, 0x88, 0x87, 0xf2, 0x21, - 0xfe, 0xcc, 0x38, + 0x1e, 0xc3, 0xb0, 0xf2, 0x1c, 0x87, 0x21, 0xf2, + 0x1b, 0x20, 0xa3, 0xc, 0x88, 0x48, 0x87, 0x21, + 0xc8, 0x7b, 0x11, 0x30, 0xf2, 0x46, 0x21, 0xf2, + 0x5, 0x7, 0xec, 0x8c, 0x3f, 0x22, 0x21, 0xfc, + 0x88, 0x7f, 0xb3, 0xe, /* U+004E "N" */ 0xf0, 0x7b, 0xc0, 0x83, 0xf9, 0xf, 0xf4, 0x1f, @@ -277,36 +277,36 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf9, 0x41, 0xfa, 0xf, 0xf2, 0x1f, 0xd0, 0x0, /* U+004F "O" */ - 0x3, 0x7c, 0x84, 0xcb, 0x12, 0x8, 0xe9, 0x91, - 0x10, 0x68, 0x91, 0xc, 0x88, 0x7f, 0xfe, 0x91, - 0xc, 0x8c, 0x41, 0xa2, 0x23, 0xa6, 0x40, 0x61, - 0x44, 0x80, + 0xa, 0xfa, 0xc, 0xe8, 0x8e, 0x82, 0x3d, 0x71, + 0x11, 0x6, 0x50, 0xa1, 0xe, 0x8c, 0x3f, 0xc8, + 0x7f, 0xfd, 0x54, 0x21, 0xd1, 0xc4, 0x19, 0x42, + 0x47, 0xae, 0x20, 0x3a, 0x23, 0xa0, /* U+0050 "P" */ 0xff, 0x90, 0xcb, 0x8a, 0x5, 0x5b, 0x14, 0x1f, - 0x44, 0x1f, 0x21, 0xff, 0xc7, 0x44, 0x3c, 0xc6, - 0xf, 0xd0, 0xa0, 0x2e, 0xb8, 0x2a, 0xc8, 0x7f, - 0xfa, 0x40, + 0x66, 0x1f, 0xc8, 0x7f, 0xf1, 0x51, 0xf, 0x31, + 0x83, 0xf4, 0x28, 0xb, 0xae, 0xa, 0xb2, 0x1f, + 0xfe, 0x90, /* U+0051 "Q" */ - 0xa, 0xfa, 0xe, 0x74, 0x47, 0x42, 0x8b, 0xb8, - 0x81, 0x12, 0x12, 0x84, 0x44, 0x3a, 0x30, 0xff, + 0xa, 0xfa, 0xe, 0x74, 0x47, 0x42, 0x8f, 0x5c, + 0x40, 0x88, 0x32, 0x84, 0x44, 0x3a, 0x30, 0xff, 0x90, 0xff, 0xfd, 0xa2, 0x21, 0xd1, 0x91, 0x21, 0x28, 0x41, 0x17, 0x71, 0x4, 0xe8, 0x87, 0xf5, - 0xf4, 0x48, 0x7e, 0x62, 0xf, 0xe7, 0xc0, + 0xf4, 0x48, 0x7e, 0x63, 0xf, 0xe7, 0x80, /* U+0052 "R" */ 0xff, 0x41, 0xcb, 0xe, 0x1a, 0xad, 0x20, 0xfa, - 0x10, 0xff, 0xe7, 0xa1, 0xf9, 0x88, 0x2f, 0xa1, - 0x41, 0x2c, 0x8, 0x35, 0x41, 0xfe, 0x88, 0x3e, - 0x44, 0x3f, 0x22, 0x1f, 0x44, 0x1f, 0x91, + 0x10, 0xff, 0xe7, 0xa1, 0xfd, 0x10, 0x5f, 0x85, + 0x4, 0xb0, 0x20, 0xd5, 0x7, 0xfa, 0x20, 0xf9, + 0x10, 0xfc, 0x88, 0x7d, 0x10, 0x7e, 0x44, /* U+0053 "S" */ - 0x5, 0xf9, 0xb, 0x45, 0x14, 0x21, 0xe9, 0x8b, + 0x3, 0xf9, 0xb, 0x85, 0x14, 0x21, 0xe9, 0x8b, 0x10, 0x6c, 0xc3, 0xf2, 0x24, 0x1d, 0x50, 0xc8, 0x7b, 0x1b, 0x83, 0xb8, 0xe, 0x86, 0x7c, 0x92, - 0x1e, 0xa1, 0xd0, 0x39, 0x16, 0xf, 0xd1, 0x86, - 0x85, 0x8e, 0x9a, 0x45, 0x16, 0x1c, + 0x1e, 0xa1, 0xd0, 0x39, 0x16, 0xf, 0xd1, 0x6, + 0x85, 0xdd, 0x34, 0x8a, 0xa, 0x1c, /* U+0054 "T" */ 0xff, 0xf2, 0xe0, 0x2e, 0xac, 0xa, 0xc1, 0xff, @@ -314,23 +314,23 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0055 "U" */ 0xf0, 0x7b, 0xc1, 0xff, 0xff, 0xf, 0xff, 0xa, - 0x41, 0xa2, 0x83, 0xd3, 0x44, 0xd1, 0x45, 0x80, + 0x41, 0xa2, 0x83, 0xd3, 0x58, 0xd1, 0x45, 0x0, /* U+0056 "V" */ 0x78, 0x3c, 0xf2, 0x21, 0xec, 0xc2, 0x43, 0x91, - 0x23, 0xf, 0xe4, 0x43, 0x22, 0x1f, 0xd1, 0x4, + 0x23, 0xf, 0xe4, 0x43, 0x42, 0x1f, 0xc9, 0x4, 0x88, 0x7f, 0x66, 0x4, 0x43, 0x22, 0xc, 0xc3, - 0x90, 0x91, 0xe, 0xc4, 0x8, 0x79, 0x24, 0xc3, - 0xfa, 0x10, 0xfa, 0xf, 0xf9, 0x4, 0x1f, 0xf2, - 0x18, + 0x90, 0x91, 0xe, 0xc8, 0x8, 0x79, 0x14, 0x61, + 0xf2, 0x42, 0x1f, 0x61, 0xff, 0x20, 0x83, 0xfe, + 0x43, 0x0, /* U+0057 "W" */ - 0x3c, 0x19, 0xd0, 0xde, 0xf, 0xd9, 0x87, 0xff, - 0x9, 0x10, 0xe4, 0x8, 0x87, 0xf2, 0x60, 0xcc, - 0x8, 0x88, 0x30, 0xc8, 0x6c, 0x8c, 0x32, 0x19, - 0x2, 0x1e, 0x43, 0xfc, 0x8a, 0x9, 0xc, 0x86, - 0xcc, 0x8, 0x7b, 0x14, 0x22, 0x20, 0xc3, 0x27, - 0x83, 0xbc, 0x21, 0xf2, 0x82, 0x58, 0x3f, 0x26, + 0x3c, 0x19, 0xd0, 0xde, 0xf, 0xd9, 0x87, 0xe4, + 0x39, 0x10, 0xe4, 0x32, 0x1f, 0xc9, 0x83, 0x30, + 0x22, 0x20, 0xc3, 0x21, 0xb2, 0x30, 0xc8, 0x64, + 0x8, 0x48, 0x10, 0xff, 0x22, 0x19, 0xc, 0x88, + 0x33, 0x2, 0x1e, 0xc0, 0x88, 0x88, 0x30, 0xc9, + 0xe0, 0xef, 0x8, 0x79, 0x60, 0x96, 0xf, 0xf6, 0x16, 0x1f, 0xc8, 0x10, 0xf2, 0x1e, 0xc3, 0xc8, 0x30, 0xf2, 0x1f, 0xc8, 0x40, @@ -338,21 +338,21 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x3c, 0x87, 0x78, 0x11, 0x6, 0x84, 0x8, 0x10, 0x92, 0xa, 0x20, 0x42, 0x19, 0x2, 0x24, 0x1d, 0x14, 0x10, 0xf2, 0x4, 0x83, 0xe8, 0x10, 0x7f, - 0xd8, 0x7e, 0x80, 0x87, 0xc8, 0xa2, 0xf, 0x45, - 0x4, 0x39, 0xc, 0x90, 0x68, 0x81, 0x8, 0x48, - 0x10, 0x92, 0x4, 0x41, 0xa1, 0x0, + 0xd8, 0x7e, 0x80, 0x87, 0xc8, 0xa2, 0xf, 0x47, + 0x8, 0x72, 0x4, 0x48, 0x34, 0x40, 0x84, 0x24, + 0x8, 0x49, 0x2, 0x20, 0xd0, 0x80, /* U+0059 "Y" */ 0x3c, 0x1e, 0xf0, 0x64, 0x32, 0x20, 0x88, 0x34, - 0x60, 0x43, 0x90, 0x21, 0x44, 0xc, 0x83, 0x22, - 0x4, 0x43, 0x91, 0x44, 0x1e, 0x8e, 0x10, 0xf9, - 0x42, 0x1f, 0xa0, 0x41, 0xff, 0xff, 0x0, + 0x40, 0x43, 0x90, 0xf4, 0x40, 0xc8, 0x32, 0x20, + 0x44, 0x39, 0x14, 0x41, 0xe8, 0xe1, 0xf, 0x94, + 0x21, 0xfa, 0x4, 0x1f, 0xff, 0xf0, /* U+005A "Z" */ - 0xff, 0xe1, 0x7e, 0xa, 0xbc, 0x8, 0x3e, 0x44, - 0x3d, 0x10, 0x7c, 0x88, 0x7a, 0x20, 0xf2, 0xe0, - 0xf4, 0x41, 0xe4, 0x43, 0xe8, 0x83, 0xc8, 0x87, - 0xd1, 0x7, 0x91, 0xf, 0xa0, 0x57, 0xc0, 0x5f, + 0xff, 0xe1, 0x7c, 0x1a, 0xbc, 0x90, 0x7c, 0x88, + 0x7a, 0x20, 0xf9, 0x10, 0xf6, 0x41, 0xe4, 0x8, + 0x7a, 0x30, 0xf2, 0x21, 0xf4, 0x41, 0xe4, 0x43, + 0xe8, 0x83, 0xc8, 0x87, 0xd0, 0xd7, 0xc1, 0x2f, 0xc0, /* U+005B "[" */ @@ -378,115 +378,115 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x3c, 0x85, 0x90, 0x6c, 0x80, /* U+0061 "a" */ - 0x1b, 0xe4, 0xc, 0xb1, 0x24, 0x74, 0xc8, 0xf0, - 0x7f, 0x35, 0x6, 0xa2, 0xc1, 0x49, 0x78, 0x24, - 0xd0, 0xff, 0xe3, 0xa1, 0x47, 0x70, 0x4c, 0x26, - 0x80, + 0x1b, 0xe4, 0xc, 0xb1, 0x24, 0x55, 0x91, 0xe4, + 0x3f, 0x35, 0x6, 0xa2, 0xc1, 0x49, 0xf0, 0x49, + 0x87, 0xff, 0x21, 0xa, 0x3b, 0x82, 0x61, 0x34, + 0x0, /* U+0062 "b" */ - 0xf0, 0x7f, 0xf5, 0x1f, 0x90, 0xa4, 0x10, 0x54, - 0xd2, 0x2, 0x8, 0x43, 0xff, 0xbc, 0x82, 0x10, - 0x53, 0x48, 0x12, 0x8, + 0xf0, 0x7f, 0xf5, 0x1f, 0x90, 0xa5, 0x10, 0x55, + 0x88, 0x8, 0x11, 0xf, 0xfe, 0xf2, 0x8, 0x41, + 0x4d, 0x20, 0x48, 0x20, /* U+0063 "c" */ 0x5, 0xf2, 0xd, 0x12, 0x61, 0xe8, 0x69, 0x1, - 0x10, 0xf7, 0x83, 0xff, 0xa5, 0xe4, 0x80, 0x82, - 0x1e, 0x84, 0x68, 0x92, + 0x10, 0xf7, 0x83, 0xff, 0xa5, 0xe4, 0x40, 0x82, + 0x2b, 0x19, 0xac, 0x40, /* U+0064 "d" */ 0xf, 0x78, 0x3f, 0xf9, 0xdf, 0x21, 0x60, 0x60, - 0x43, 0xd0, 0x9, 0x1, 0xf, 0xfe, 0xf2, 0x40, - 0x41, 0xf, 0x40, 0xb0, 0x30, 0x0, + 0x43, 0xd8, 0x12, 0xf, 0xff, 0xa, 0x41, 0xd0, + 0xf6, 0x16, 0x6, 0x0, /* U+0065 "e" */ - 0x5, 0xf0, 0x5a, 0x26, 0x45, 0xd0, 0x91, 0x2, - 0x21, 0xfe, 0xfc, 0x19, 0x7c, 0xa, 0xf0, 0x7e, - 0x48, 0x29, 0x87, 0xb7, 0x34, 0x4a, 0x0, + 0x5, 0xf2, 0xd, 0x12, 0x11, 0xe8, 0x50, 0x80, + 0x88, 0x7f, 0xbf, 0x6, 0x5f, 0x2, 0xbc, 0x1f, + 0x92, 0x9, 0x50, 0xf7, 0x66, 0x89, 0x40, /* U+0066 "f" */ - 0x3, 0xf0, 0xc2, 0x8c, 0xa8, 0x44, 0x3f, 0x60, - 0xf0, 0x81, 0x44, 0xa, 0x7, 0xff, 0xac, + 0x9, 0xf2, 0x6, 0x10, 0xa3, 0x90, 0xff, 0xe1, + 0x58, 0x3c, 0x68, 0x14, 0x30, 0x28, 0x1f, 0xff, + 0x40, /* U+0067 "g" */ 0x7, 0xcf, 0x8c, 0xc, 0x8, 0x7a, 0x1, 0x20, 0x21, 0xff, 0xde, 0x48, 0x8, 0x21, 0xe8, 0x16, - 0x6, 0xd, 0xf2, 0x1f, 0xf4, 0x12, 0x23, 0xdc, - 0x46, 0xa1, 0xc0, + 0x6, 0xd, 0xf2, 0x1f, 0xf4, 0x12, 0x23, 0xd4, + 0x46, 0xb1, 0x80, /* U+0068 "h" */ - 0xf0, 0x7f, 0xf5, 0x7e, 0x42, 0xc4, 0x90, 0x3d, - 0xc, 0x10, 0x11, 0xf, 0xff, 0xa0, + 0xf0, 0x7f, 0xf5, 0x6f, 0x21, 0x6a, 0x24, 0xf, + 0x43, 0x4, 0x4, 0x43, 0xff, 0xe8, /* U+0069 "i" */ 0xe1, 0xf0, 0x3c, 0x1f, 0xfc, 0xa0, /* U+006A "j" */ 0x7, 0x4, 0x83, 0xc1, 0xef, 0x7, 0xff, 0xb1, - 0xc4, 0xc, + 0xc4, 0x28, /* U+006B "k" */ 0xf0, 0x7f, 0xf6, 0xfc, 0x87, 0x42, 0x83, 0x92, 0xe, 0xcc, 0x3a, 0x20, 0xf2, 0x1f, 0xe8, 0x3d, - 0xc4, 0x1e, 0x44, 0x3e, 0x8c, 0x3c, 0x81, 0xf, + 0xa4, 0x1e, 0x84, 0x3e, 0x8c, 0x3c, 0x81, 0xf, 0x64, 0x0, /* U+006C "l" */ 0xf0, 0x7f, 0xf4, 0x80, /* U+006D "m" */ - 0xf3, 0xf2, 0x3f, 0x21, 0x4a, 0x2a, 0x12, 0x41, - 0x58, 0x6e, 0x86, 0x4, 0x8, 0x10, 0x22, 0x1f, - 0xff, 0xf0, 0xff, 0xec, 0x80, + 0xf3, 0xf2, 0x3f, 0x21, 0x4a, 0x2a, 0x51, 0x20, + 0xac, 0x35, 0x8c, 0x8, 0x10, 0x20, 0x44, 0x3f, + 0xff, 0xe1, 0xff, 0xd9, /* U+006E "n" */ - 0xf1, 0xf2, 0x16, 0x24, 0x81, 0xe8, 0x60, 0x80, + 0xf3, 0xf2, 0x14, 0x24, 0x82, 0xe8, 0x60, 0x40, 0x88, 0x7f, 0xfd, 0x0, /* U+006F "o" */ - 0x5, 0xf2, 0x14, 0x89, 0x41, 0x47, 0x62, 0xa3, - 0xa, 0x20, 0xf2, 0x1f, 0xfd, 0x34, 0x3d, 0x10, - 0x51, 0x20, 0xed, 0x63, 0x44, 0x60, + 0x5, 0xf4, 0x16, 0x88, 0xc2, 0x3d, 0x8a, 0x88, + 0x2c, 0x83, 0xff, 0xc3, 0x10, 0x51, 0x23, 0xda, + 0x26, 0x88, 0xe0, /* U+0070 "p" */ - 0xf3, 0xf2, 0x14, 0x82, 0xa, 0x9a, 0x40, 0x41, - 0x8, 0x7f, 0xf7, 0x90, 0x42, 0xa, 0x69, 0x2, - 0x41, 0x4, 0xfc, 0x87, 0xff, 0x54, + 0xf3, 0xf2, 0x14, 0x82, 0xb, 0xb4, 0x83, 0xa1, + 0xf, 0xff, 0xc, 0x20, 0xed, 0x20, 0x48, 0x20, + 0x9f, 0x90, 0xff, 0xea, 0x80, /* U+0071 "q" */ - 0x7, 0xcf, 0x8c, 0xc, 0x8, 0x7a, 0x1, 0x20, - 0x21, 0xff, 0xde, 0x48, 0x3a, 0x1e, 0xc2, 0xc0, - 0xc1, 0xbe, 0x43, 0xff, 0xac, + 0x7, 0xcf, 0x8c, 0xc, 0x8, 0x7b, 0x2, 0x41, + 0xff, 0xe1, 0x48, 0x3a, 0x1e, 0xc2, 0xc0, 0xc1, + 0xbe, 0x43, 0xff, 0xac, /* U+0072 "r" */ - 0xe, 0xf3, 0xe0, 0x42, 0xb, 0x80, 0x87, 0xff, - 0x78, + 0xf3, 0xe0, 0x4a, 0x5, 0x40, 0x43, 0xff, 0xbc, /* U+0073 "s" */ - 0x1f, 0xc8, 0xc2, 0x89, 0x8e, 0xa2, 0xe, 0x54, - 0x98, 0x53, 0x27, 0x21, 0x5a, 0xa8, 0x1a, 0xc6, - 0xa0, 0xb1, 0x70, 0x74, 0x55, 0x93, 0xa, 0x24, + 0x1f, 0xc8, 0xc2, 0x89, 0x8e, 0xa3, 0xe, 0x56, + 0x90, 0x53, 0x2b, 0xc8, 0x56, 0x96, 0x1a, 0xd2, + 0xa0, 0xa1, 0x60, 0xf4, 0x74, 0xc9, 0xc5, 0x12, /* U+0074 "t" */ - 0x7, 0x83, 0xfe, 0xf0, 0x35, 0x1, 0xa0, 0x20, - 0xff, 0xed, 0xe0, 0x80, + 0x7, 0x83, 0xff, 0x85, 0xe0, 0x72, 0x80, 0xf4, + 0x4, 0x87, 0xff, 0x8b, 0x41, 0x84, /* U+0075 "u" */ - 0xf0, 0x6f, 0x7, 0xff, 0xd9, 0x4, 0x8, 0xa6, - 0x81, 0x84, 0x80, + 0xf0, 0x6f, 0x7, 0xff, 0xd9, 0x2, 0x8, 0xa7, + 0x1, 0x84, 0x80, /* U+0076 "v" */ 0x78, 0x37, 0x22, 0x12, 0x61, 0xec, 0x48, 0x40, 0x84, 0x98, 0x48, 0x64, 0x4c, 0x24, 0x18, 0x85, - 0x8b, 0x6, 0x48, 0xc3, 0x90, 0x21, 0xd8, 0x7e, + 0x8b, 0x6, 0x4c, 0xc3, 0x94, 0x21, 0xd8, 0x7e, 0x44, 0x20, /* U+0077 "w" */ - 0x78, 0x2f, 0x6, 0xe4, 0x3e, 0x40, 0x98, 0x10, - 0x20, 0xc1, 0x88, 0x85, 0x81, 0x2, 0x16, 0x22, - 0x21, 0x90, 0x26, 0x7, 0x14, 0x61, 0x94, 0x69, - 0x81, 0x9, 0x31, 0x3, 0x87, 0x62, 0x12, 0x28, - 0x32, 0x4, 0x18, 0x30, 0xfb, 0x2, 0x4, 0x39, - 0x10, 0xfc, + 0x3c, 0x13, 0xa1, 0x78, 0x3e, 0xcc, 0x32, 0x4, + 0x40, 0x88, 0x13, 0x6, 0x1f, 0xd8, 0x64, 0xc4, + 0x84, 0x24, 0x32, 0x42, 0x62, 0x1c, 0x84, 0x8a, + 0x2, 0x1b, 0x23, 0x32, 0x30, 0xc8, 0x88, 0x88, + 0x87, 0xff, 0x21, 0x10, 0x91, 0xf, 0x66, 0x16, + 0x61, 0x0, /* U+0078 "x" */ 0x3c, 0x13, 0xc0, 0x44, 0x11, 0x2, 0x21, 0x10, @@ -496,33 +496,33 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0079 "y" */ 0x78, 0x27, 0x91, 0xb, 0x30, 0xf2, 0x22, 0x21, - 0xec, 0xc4, 0x40, 0x89, 0x98, 0x48, 0x11, 0xb, - 0x11, 0xc, 0x91, 0x87, 0xe4, 0x39, 0xf, 0xd8, - 0x87, 0xec, 0x3d, 0x88, 0x79, 0x41, 0xde, 0x30, - 0xfa, 0x43, 0x0, + 0xec, 0xc4, 0x40, 0x89, 0x90, 0x79, 0xe, 0x84, + 0x43, 0x24, 0x61, 0xf9, 0xe, 0x43, 0xf6, 0x21, + 0xfb, 0xf, 0x62, 0x1e, 0x50, 0x77, 0x88, 0x3e, + 0x83, 0x80, /* U+007A "z" */ 0xff, 0xcb, 0xc1, 0x57, 0x2, 0xd, 0xa, 0xc, - 0x90, 0x6c, 0x83, 0x22, 0x83, 0x44, 0x1a, 0x20, - 0xca, 0x10, 0xd0, 0x2b, 0x82, 0x5e, + 0x90, 0x6c, 0x83, 0x20, 0x43, 0x46, 0x1a, 0x10, + 0xca, 0x20, 0xd0, 0x2b, 0x82, 0x5e, /* U+007B "{" */ - 0xf, 0xeb, 0x80, 0xb4, 0xc, 0x82, 0x43, 0xff, - 0xa0, 0x88, 0x28, 0x40, 0x44, 0x2d, 0x60, 0xa2, - 0xf, 0xfe, 0xb4, 0x21, 0x24, 0x85, 0xa0, + 0xf, 0xf4, 0x85, 0xa1, 0x44, 0x81, 0x10, 0xff, + 0xe8, 0x21, 0x66, 0xc, 0x50, 0x21, 0x9, 0xc8, + 0x39, 0xf, 0xfe, 0x82, 0x21, 0x44, 0x1b, 0x50, + 0x69, /* U+007C "|" */ 0xf0, 0x7f, 0xf6, 0x0, /* U+007D "}" */ 0xf, 0x5a, 0x14, 0x41, 0xa2, 0x9, 0x10, 0xff, - 0xe8, 0x22, 0x14, 0x50, 0x24, 0x41, 0x2b, 0x2, - 0x41, 0xff, 0xd0, 0x42, 0x8c, 0xa, 0x10, 0x9c, - 0x20, + 0xeb, 0x47, 0x1, 0x42, 0x5, 0x10, 0x23, 0x43, + 0xff, 0xa6, 0x88, 0x51, 0x2, 0x30, 0xac, 0x30, /* U+007E "~" */ - 0x1f, 0x41, 0xa8, 0xc2, 0xb0, 0x28, 0x8e, 0xce, - 0x86, 0xa0, 0xb5, 0x12, + 0x2f, 0x21, 0x51, 0x43, 0x20, 0x54, 0x75, 0xb2, + 0x50, 0x19, 0x14, /* U+00A0 " " */ @@ -530,108 +530,113 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xe1, 0xf0, 0x6f, 0x7, 0xff, 0x20, /* U+00A3 "£" */ - 0xa, 0xf9, 0xb, 0x44, 0x81, 0xf, 0x42, 0x12, - 0x2, 0x21, 0xf7, 0x83, 0xff, 0x8d, 0x2, 0xa0, - 0x90, 0x2c, 0x16, 0xf, 0x83, 0xff, 0xb7, 0x82, - 0xbc, 0x12, 0xf8, + 0xa, 0xf9, 0xb, 0x44, 0x91, 0x1e, 0x84, 0x44, + 0x4, 0x3f, 0xbc, 0x1f, 0xfc, 0x68, 0x15, 0x4, + 0x81, 0x60, 0xb0, 0x7c, 0x1f, 0xfd, 0xbc, 0x15, + 0xe0, 0x97, 0xc0, /* U+00B0 "°" */ 0x5, 0x0, 0xea, 0xd8, 0xe2, 0x9, 0x2, 0x78, 0x64, 0xc, /* U+00B1 "±" */ - 0xb, 0xc1, 0xff, 0xd7, 0xf8, 0x1f, 0x2c, 0x5, - 0xaa, 0x5, 0x41, 0xff, 0xcf, 0xf0, 0x55, 0xf9, - 0x7f, 0x0, + 0xd, 0xe0, 0xff, 0xed, 0xdf, 0x3, 0xf2, 0xc0, + 0x5d, 0x50, 0x2a, 0xf, 0xfe, 0x9f, 0x83, 0x57, + 0xe1, 0x7f, 0x0, /* U+00B2 "²" */ - 0x2f, 0x2, 0x51, 0x89, 0x5, 0xe0, 0xf4, 0x40, - 0x5c, 0x8, 0x81, 0x8d, 0x40, 0x5c, + 0x3e, 0x4, 0x46, 0x2e, 0x7, 0x8, 0x64, 0x82, + 0x84, 0x19, 0x82, 0x17, 0x86, 0xa0, /* U+00B3 "³" */ - 0x2f, 0x44, 0xa1, 0x45, 0x33, 0x91, 0xd, 0xc4, - 0x4, 0xb, 0x59, 0xd5, 0x83, 0x50, 0xc0, + 0x2f, 0x42, 0xfd, 0x51, 0x88, 0x98, 0x38, 0x41, + 0xc2, 0xa1, 0x31, 0xa1, 0xaf, 0x80, /* U+00B5 "µ" */ - 0xf0, 0x6f, 0x7, 0xff, 0xd9, 0x2, 0x1a, 0x9c, - 0x19, 0x44, 0x1a, 0xf3, 0xe0, 0xff, 0xea, 0x0, + 0xf0, 0x6f, 0x7, 0xff, 0xd9, 0x2, 0x1a, 0xb0, + 0x65, 0xa0, 0xd7, 0x9f, 0x7, 0xff, 0x50, /* U+00BF "¿" */ 0xb, 0x83, 0xe4, 0x3d, 0xe0, 0xff, 0xe1, 0x28, - 0x3d, 0x40, 0xe4, 0x43, 0xa3, 0xc, 0x8a, 0xd, - 0x10, 0x68, 0x83, 0x91, 0xf, 0xfe, 0x3f, 0x91, + 0x3d, 0x40, 0xe4, 0x43, 0xa3, 0xd, 0xa, 0xc, + 0x90, 0x68, 0x83, 0x91, 0xf, 0xfe, 0x3f, 0x91, 0x4, 0x31, 0x79, 0x22, 0x9, 0xc0, /* U+00C0 "À" */ - 0xa, 0xf0, 0x7f, 0xa4, 0x43, 0xfd, 0x30, 0x7f, - 0xd6, 0x1f, 0xf5, 0xa1, 0xfe, 0x4c, 0x3f, 0x90, - 0x21, 0xfd, 0x88, 0x87, 0xe4, 0x8c, 0x3f, 0x90, - 0x21, 0xf4, 0x62, 0x1f, 0x91, 0x32, 0xf, 0x90, - 0x22, 0x1c, 0x98, 0x48, 0x7a, 0x2f, 0x92, 0xf, - 0x2f, 0x8, 0x49, 0x5e, 0xe, 0xc4, 0x39, 0x10, - 0x21, 0xf4, 0x42, 0x21, 0xfe, + 0x9, 0xf0, 0x7f, 0xcc, 0x41, 0xff, 0x2e, 0xf, + 0xfa, 0xd0, 0xff, 0x9e, 0xf, 0xfa, 0x10, 0xff, + 0xe1, 0x21, 0xfc, 0x89, 0x87, 0xf6, 0x42, 0x1f, + 0xc8, 0x11, 0xf, 0x91, 0x23, 0xf, 0xb2, 0x9, + 0xf, 0x90, 0xc8, 0x87, 0xc8, 0x51, 0x7, 0x43, + 0xf8, 0x3e, 0x45, 0xe0, 0x21, 0xea, 0xec, 0x82, + 0x44, 0x3f, 0xec, 0x83, 0xc8, 0x81, 0xf, 0xd1, + 0x0, /* U+00C1 "Á" */ - 0xf, 0xbc, 0x87, 0xf4, 0x48, 0x7e, 0x54, 0x87, - 0xf3, 0xa1, 0xfe, 0xb4, 0x3f, 0xc9, 0x87, 0xf2, - 0x4, 0x3f, 0xb1, 0x10, 0xfc, 0x91, 0x87, 0xf2, - 0x4, 0x3e, 0x8c, 0x43, 0xf2, 0x26, 0x41, 0xf2, - 0x4, 0x43, 0x93, 0x9, 0xf, 0x45, 0xf2, 0x41, - 0xe5, 0xe1, 0x9, 0x2b, 0xc1, 0xd8, 0x87, 0x22, - 0x4, 0x3e, 0x88, 0x44, 0x3f, 0xc0, + 0xf, 0xaf, 0x7, 0xf9, 0x6c, 0x3f, 0xd3, 0x7, + 0xfd, 0xc1, 0xff, 0x3c, 0x1f, 0xf4, 0x21, 0xff, + 0xc2, 0x43, 0xf9, 0x13, 0xf, 0xec, 0x84, 0x3f, + 0x90, 0x22, 0x1f, 0x22, 0x46, 0x1f, 0x64, 0x12, + 0x1f, 0x21, 0x91, 0xf, 0x90, 0xa2, 0xe, 0x87, + 0xf0, 0x7c, 0x8b, 0xc0, 0x43, 0xd5, 0xd9, 0x4, + 0x88, 0x7f, 0xd9, 0x7, 0x91, 0x2, 0x1f, 0xa2, + 0x0, /* U+00C2 "Â" */ - 0xe, 0xb4, 0x3f, 0x96, 0x83, 0xfa, 0xa7, 0xf, - 0xda, 0x58, 0x7f, 0x5a, 0x1f, 0xe4, 0xc3, 0xf9, - 0x2, 0x1f, 0xd8, 0x88, 0x7e, 0x48, 0xc3, 0xf9, - 0x2, 0x1f, 0x46, 0x21, 0xf9, 0x13, 0x20, 0xf9, - 0x2, 0x21, 0xc9, 0x84, 0x87, 0xa2, 0xf9, 0x20, - 0xf2, 0xf0, 0x84, 0x95, 0xe0, 0xec, 0x43, 0x91, - 0x2, 0x1f, 0x44, 0x22, 0x1f, 0xe0, + 0xe, 0x78, 0x3f, 0xe9, 0x60, 0xfe, 0xda, 0x90, + 0xfd, 0xc3, 0xa1, 0xfc, 0xf0, 0x7f, 0xd0, 0x87, + 0xff, 0x9, 0xf, 0xe4, 0x4c, 0x3f, 0xb2, 0x10, + 0xfe, 0x40, 0x88, 0x7c, 0x89, 0x18, 0x7d, 0x90, + 0x48, 0x7c, 0x86, 0x44, 0x3e, 0x42, 0x88, 0x3a, + 0x1f, 0xc1, 0xf2, 0x2f, 0x1, 0xf, 0x57, 0x64, + 0x12, 0x21, 0xff, 0x64, 0x1e, 0x44, 0x8, 0x7e, + 0x88, /* U+00C3 "Ã" */ - 0xd, 0x40, 0x48, 0x7a, 0x57, 0x21, 0xf3, 0x6b, - 0x83, 0xda, 0x5c, 0x1f, 0xde, 0xf, 0xfe, 0xc, - 0x1f, 0xc8, 0x10, 0xfe, 0xc4, 0x3f, 0xca, 0xc4, - 0x3e, 0x4d, 0x20, 0xfb, 0x11, 0xf, 0xc8, 0x58, - 0x87, 0x22, 0x4, 0xc3, 0xb2, 0xc, 0x87, 0x27, - 0xe0, 0x21, 0xe5, 0xe3, 0xa, 0x2b, 0xc2, 0x12, - 0x21, 0xc8, 0x87, 0xfb, 0x32, 0x10, 0xf2, 0x20, + 0xc, 0xc8, 0x30, 0xfd, 0x37, 0x83, 0xf4, 0x70, + 0x20, 0xfa, 0xc7, 0xc8, 0x7f, 0x3c, 0x1f, 0xf4, + 0x21, 0xff, 0xc2, 0x43, 0xf9, 0x13, 0xf, 0xec, + 0x84, 0x3f, 0x90, 0x22, 0x1f, 0x22, 0x46, 0x1f, + 0x64, 0x12, 0x1f, 0x21, 0x91, 0xf, 0x90, 0xa2, + 0xe, 0x87, 0xf0, 0x7c, 0x8b, 0xc0, 0x43, 0xd5, + 0xd9, 0x4, 0x88, 0x7f, 0xd9, 0x7, 0x91, 0x2, + 0x1f, 0xa2, 0x0, /* U+00C4 "Ä" */ - 0xf, 0xfe, 0x27, 0x82, 0xf0, 0x7c, 0x86, 0x43, - 0xdc, 0x17, 0x7, 0xef, 0x41, 0xff, 0xc0, 0x43, - 0xfa, 0x9, 0xf, 0xc8, 0x98, 0x7f, 0xa1, 0xf, - 0x91, 0x10, 0xfd, 0x91, 0x88, 0x79, 0x9, 0x30, - 0xe4, 0x42, 0x50, 0x76, 0x41, 0x62, 0x19, 0x3f, - 0x46, 0x1e, 0x5e, 0x10, 0x92, 0xbc, 0x86, 0xc4, - 0x3b, 0x20, 0x21, 0xf2, 0x22, 0x21, 0xfe, + 0xf, 0xfe, 0x2f, 0x82, 0xf0, 0x7e, 0x42, 0x43, + 0xf7, 0x5, 0x61, 0xfd, 0xf0, 0x7f, 0xf3, 0x10, + 0x90, 0xfe, 0xc4, 0x83, 0xf9, 0x20, 0xff, 0x21, + 0x22, 0x1f, 0x62, 0x44, 0x1f, 0x24, 0x1f, 0xfc, + 0x44, 0x43, 0x91, 0xa, 0x20, 0xec, 0x7f, 0x7, + 0xc8, 0xbc, 0x4, 0x3d, 0x5d, 0x90, 0x50, 0x87, + 0xfc, 0x90, 0x79, 0x20, 0xff, 0xa1, 0x0, /* U+00C5 "Å" */ - 0xe, 0xf8, 0x3f, 0xbb, 0xb0, 0xff, 0xe4, 0xf7, - 0x61, 0xfd, 0xf0, 0x7f, 0xae, 0xf, 0xf2, 0x21, - 0xfc, 0x84, 0x87, 0xec, 0x4c, 0x3f, 0x24, 0x21, - 0xf2, 0x22, 0x1f, 0xb3, 0x32, 0xf, 0x22, 0x22, - 0x1f, 0x21, 0x21, 0xe8, 0xc2, 0xc4, 0x32, 0x5f, - 0x44, 0x1e, 0x5e, 0xe, 0x8a, 0xf8, 0x40, 0x88, - 0x72, 0x41, 0xff, 0xc2, 0x44, 0x3e, 0x44, + 0xe, 0xf8, 0x3f, 0xdd, 0xd8, 0x7f, 0xf2, 0xe9, + 0xd8, 0x7f, 0x3f, 0x7, 0xfd, 0x70, 0x7f, 0xc8, + 0x87, 0xf9, 0x9, 0xf, 0xec, 0x4c, 0x3f, 0x92, + 0x10, 0xff, 0xe0, 0x22, 0x1f, 0x22, 0x46, 0x1f, + 0x64, 0x12, 0x1f, 0x21, 0x91, 0xe, 0x44, 0x28, + 0x83, 0xb1, 0xfc, 0x1f, 0x22, 0xf0, 0x10, 0xf5, + 0x76, 0x41, 0x22, 0x1f, 0xf4, 0x41, 0xe4, 0x43, + 0xfe, 0x88, /* U+00C6 "Æ" */ - 0xf, 0xdf, 0xfc, 0x1f, 0xa0, 0x97, 0xc1, 0xf9, - 0xa, 0xbc, 0x1f, 0x44, 0x1f, 0xfc, 0x34, 0x43, - 0xff, 0x85, 0x10, 0x7f, 0xf0, 0xd1, 0xf, 0xfe, - 0x14, 0x21, 0xbf, 0xa0, 0xe4, 0x83, 0x2f, 0x61, - 0xa1, 0xe, 0xae, 0x43, 0x20, 0xa8, 0x3f, 0xe8, - 0xb, 0x83, 0xfe, 0x4f, 0xe0, 0xff, 0x42, 0x1f, - 0xfc, 0x34, 0x83, 0xea, 0xf3, 0x8, 0x7e, 0x5f, - 0x60, + 0xf, 0xcf, 0xff, 0x7, 0xf4, 0x12, 0xf8, 0x3f, + 0x22, 0xa, 0xf0, 0x7e, 0x88, 0x3f, 0xf8, 0x68, + 0x87, 0xff, 0x12, 0x20, 0xff, 0xe1, 0xa1, 0xff, + 0xc6, 0x88, 0x37, 0xf0, 0x79, 0x2, 0x19, 0x78, + 0x3d, 0x10, 0x75, 0x70, 0x72, 0xb, 0xe0, 0xff, + 0xe0, 0x41, 0xff, 0xc5, 0x41, 0xfc, 0x1f, 0xf4, + 0x41, 0xff, 0xc3, 0x40, 0x87, 0xd5, 0xe4, 0x88, + 0x3f, 0x2f, 0xb0, /* U+00C7 "Ç" */ - 0xa, 0xfa, 0x9, 0xd1, 0x1c, 0x11, 0xeb, 0x46, - 0x10, 0xd1, 0x24, 0x1f, 0xfc, 0x3f, 0x7, 0xff, + 0xa, 0xfa, 0x9, 0xd6, 0x1c, 0x11, 0xd3, 0x46, + 0x20, 0xd1, 0x22, 0x1f, 0xfc, 0x3f, 0x7, 0xff, 0xbb, 0xc8, 0x87, 0xd1, 0x6, 0x88, 0x8e, 0x9a, - 0x23, 0xac, 0x38, 0x68, 0x78, 0x3e, 0x60, 0xfb, - 0x10, 0xff, 0xe2, 0xee, 0x10, + 0x23, 0x2c, 0x38, 0x4c, 0x3c, 0x1f, 0x30, 0x7d, + 0x88, 0x7f, 0xf1, 0x77, 0x8, /* U+00C8 "È" */ 0x3c, 0x87, 0xb2, 0xf, 0xb3, 0xf, 0xbc, 0x1b, @@ -674,54 +679,59 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x1f, 0xff, 0xf0, 0xff, 0xea, 0x80, /* U+00D0 "Ð" */ - 0x3f, 0xd0, 0x79, 0x61, 0xc3, 0xaa, 0xe3, 0xf, - 0xca, 0x10, 0xfd, 0x10, 0x7f, 0xf2, 0xb0, 0x7c, - 0x1c, 0x81, 0x60, 0xe8, 0x15, 0x7, 0xff, 0x5e, - 0x20, 0xf9, 0x42, 0x15, 0x5c, 0x61, 0x96, 0x1c, - 0x0, + 0x7, 0xfa, 0xf, 0x96, 0x1c, 0x3d, 0x57, 0x18, + 0x7f, 0x28, 0x43, 0xfa, 0x30, 0xff, 0x90, 0xff, + 0xe0, 0x58, 0x3c, 0x87, 0x68, 0x14, 0x1e, 0x60, + 0x51, 0xf, 0xfe, 0x72, 0x21, 0xfd, 0x98, 0x7e, + 0x50, 0x86, 0xab, 0x8c, 0x39, 0x62, 0xc0, /* U+00D1 "Ñ" */ - 0xa, 0x41, 0x86, 0xdb, 0xc1, 0xee, 0x4, 0x1b, - 0x1f, 0x20, 0xf0, 0x7b, 0xc0, 0x83, 0xf9, 0xf, - 0xf4, 0x1f, 0x94, 0x1f, 0xa2, 0xf, 0xca, 0xf, - 0xd1, 0x7, 0xe5, 0x7, 0xe8, 0x83, 0xf2, 0x83, - 0xf4, 0x41, 0xf9, 0x41, 0xfa, 0xf, 0xf2, 0x1f, - 0xd0, 0x0, + 0xa, 0x41, 0x86, 0xdb, 0xc1, 0xef, 0x2, 0xd, + 0x83, 0xc8, 0x3c, 0x1e, 0xf0, 0x20, 0xfe, 0x43, + 0xfd, 0x7, 0xe5, 0x7, 0xe8, 0x83, 0xf2, 0x83, + 0xf4, 0x41, 0xf9, 0x41, 0xfa, 0x20, 0xfc, 0xa0, + 0xfd, 0x10, 0x7e, 0x50, 0x7e, 0x83, 0xfc, 0x87, + 0xf4, 0x0, /* U+00D2 "Ò" */ - 0x3, 0x7, 0xf3, 0x7, 0xcb, 0x83, 0xe8, 0x83, - 0xf7, 0x83, 0xcd, 0xf2, 0x13, 0x2c, 0x48, 0x23, - 0xa6, 0x44, 0x41, 0xa2, 0x44, 0x32, 0x21, 0xff, - 0xfa, 0x44, 0x32, 0x31, 0x6, 0x88, 0x8e, 0x99, - 0x1, 0x85, 0x12, 0x0, + 0x3, 0x21, 0xfc, 0xc1, 0xf9, 0x88, 0x3f, 0x2e, + 0xf, 0xd6, 0x87, 0xd7, 0xd0, 0x67, 0x44, 0x74, + 0x11, 0xeb, 0x88, 0x88, 0x32, 0x85, 0x8, 0x74, + 0x61, 0xfe, 0x43, 0xff, 0xea, 0xa1, 0xe, 0x8e, + 0x20, 0xca, 0x12, 0x3d, 0x71, 0x1, 0xd1, 0x1d, + 0x0, /* U+00D3 "Ó" */ - 0xf, 0x48, 0x7d, 0x21, 0xf9, 0x60, 0xf4, 0x41, - 0xf5, 0x87, 0x9b, 0xe4, 0x26, 0x58, 0x90, 0x47, - 0x4c, 0x88, 0x83, 0x44, 0x88, 0x64, 0x43, 0xff, - 0xf4, 0x88, 0x64, 0x62, 0xd, 0x11, 0x1d, 0x32, - 0x3, 0xa, 0x24, + 0xf, 0x32, 0x1f, 0xa4, 0x3f, 0x44, 0x87, 0x95, + 0x21, 0xf3, 0xa1, 0xf5, 0xf4, 0x19, 0xd1, 0x1d, + 0x4, 0x7a, 0xe2, 0x22, 0xc, 0xa1, 0x42, 0x1d, + 0x18, 0x7f, 0x90, 0xff, 0xfa, 0xa8, 0x43, 0xa3, + 0x88, 0x32, 0x84, 0x8f, 0x5c, 0x40, 0x74, 0x47, + 0x40, /* U+00D4 "Ô" */ - 0xc, 0xa0, 0xfd, 0x44, 0x3d, 0xb4, 0xf, 0x51, - 0x83, 0xc8, 0x10, 0xe6, 0xf9, 0x9, 0x96, 0x24, - 0x11, 0xd3, 0x22, 0x20, 0xd1, 0x22, 0x19, 0x10, - 0xff, 0xfd, 0x22, 0x19, 0x18, 0x83, 0x44, 0x47, - 0x4c, 0x80, 0xc2, 0x89, 0x0, + 0xe, 0x83, 0xfb, 0x70, 0xfb, 0x32, 0xf, 0x39, + 0x87, 0xd0, 0x50, 0x7a, 0xfa, 0xc, 0xe8, 0x8e, + 0x82, 0x3d, 0x71, 0x11, 0x6, 0x50, 0xa1, 0xe, + 0x8c, 0x3f, 0xc8, 0x7f, 0xfd, 0x54, 0x21, 0xd1, + 0xc4, 0x19, 0x42, 0x47, 0xae, 0x20, 0x3a, 0x23, + 0xa0, /* U+00D5 "Õ" */ - 0xf, 0xfe, 0xf, 0x92, 0xc2, 0xc6, 0xd8, 0x26, - 0x9b, 0x21, 0x48, 0x24, 0x33, 0x7c, 0x84, 0xc8, - 0x92, 0x8, 0xbb, 0xa1, 0x12, 0x12, 0xa4, 0x43, - 0xb4, 0x3f, 0x21, 0xff, 0xef, 0x44, 0x43, 0xb6, - 0x24, 0x25, 0x44, 0x5d, 0xd0, 0xc, 0x4, 0x90, + 0xf, 0xfe, 0x17, 0x92, 0xc3, 0x63, 0x6a, 0xc, + 0xf6, 0xd0, 0x34, 0x14, 0x87, 0xaf, 0xa0, 0xce, + 0x88, 0xe8, 0x23, 0xd7, 0x11, 0x10, 0x65, 0xa, + 0x10, 0xe8, 0xc3, 0xfc, 0x87, 0xff, 0xd5, 0x42, + 0x1d, 0x1c, 0x41, 0x94, 0x24, 0x7a, 0xe2, 0x3, + 0xa2, 0x3a, 0x0, /* U+00D6 "Ö" */ - 0x7, 0x5, 0x61, 0x90, 0x90, 0xde, 0xb, 0xc1, - 0xff, 0xc1, 0x6f, 0x90, 0x99, 0x62, 0x41, 0x1d, - 0x32, 0x22, 0xd, 0x12, 0x21, 0x91, 0xf, 0xff, - 0xd2, 0x21, 0x91, 0x88, 0x34, 0x44, 0x74, 0xc8, - 0xc, 0x28, 0x90, + 0x5, 0x85, 0x61, 0x90, 0xc8, 0x77, 0x82, 0xf0, + 0x7f, 0xf1, 0x2f, 0xa0, 0xce, 0x88, 0xe8, 0x22, + 0xee, 0x22, 0x14, 0x12, 0x85, 0x18, 0x74, 0x60, + 0x43, 0xe4, 0x3f, 0xfd, 0xa8, 0x7c, 0xa3, 0xe, + 0x8e, 0x14, 0x19, 0x12, 0x2e, 0xf1, 0x1, 0xd1, + 0x1d, 0x0, /* U+00D7 "×" */ 0xf, 0xf9, 0xc3, 0x50, 0x19, 0x1, 0x60, 0x42, @@ -730,144 +740,142 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x40, 0xe4, 0x2e, 0x0, /* U+00D8 "Ø" */ - 0xa, 0xfa, 0x2c, 0x2d, 0x11, 0xdc, 0x11, 0x76, - 0x86, 0x5c, 0x1e, 0x4c, 0xc3, 0x20, 0xc4, 0x42, - 0x8c, 0x43, 0xe6, 0xf, 0xe8, 0x43, 0xf9, 0x83, - 0xfa, 0x10, 0xfc, 0xa8, 0x3c, 0x8c, 0x20, 0x44, - 0xc8, 0x82, 0xc8, 0x42, 0x40, 0xb0, 0x50, 0x3b, - 0x88, 0x29, 0x42, 0x38, 0x49, 0x4f, 0xa0, 0xc0, + 0xa, 0xfa, 0x2c, 0x2d, 0x11, 0xd8, 0x19, 0x77, + 0x1, 0x11, 0x41, 0x21, 0xb3, 0xd, 0x2, 0x11, + 0x9, 0x50, 0x7f, 0x4a, 0x10, 0xf2, 0x41, 0xfd, + 0x40, 0xfe, 0x44, 0x3f, 0xa8, 0x1e, 0x46, 0x10, + 0x22, 0x64, 0xc1, 0x64, 0x21, 0x20, 0x58, 0x28, + 0x1d, 0xc4, 0x14, 0xa1, 0x1c, 0x24, 0xa7, 0xd0, + 0x60, /* U+00D9 "Ù" */ - 0x4, 0x87, 0xf5, 0x3, 0xe8, 0x43, 0xf6, 0x61, - 0xfb, 0xc1, 0xbc, 0x1e, 0xf0, 0x7f, 0xff, 0xc3, - 0xff, 0xc2, 0x90, 0x68, 0xa0, 0xf4, 0xd1, 0x34, - 0x51, 0x60, + 0x4, 0x87, 0xe6, 0x81, 0xf6, 0x21, 0xfb, 0x30, + 0xfd, 0xe0, 0xde, 0xf, 0x78, 0x3f, 0xff, 0xe1, + 0xff, 0xe1, 0x48, 0x34, 0x50, 0x7a, 0x6b, 0x1a, + 0x28, 0xa0, /* U+00DA "Ú" */ 0xf, 0x50, 0x3e, 0x90, 0xf9, 0x44, 0x1e, 0x8c, 0x3e, 0xf0, 0x6f, 0x7, 0xbc, 0x1f, 0xff, 0xf0, - 0xff, 0xf0, 0xa4, 0x1a, 0x28, 0x3d, 0x34, 0x4d, - 0x14, 0x58, + 0xff, 0xf0, 0xa4, 0x1a, 0x28, 0x3d, 0x35, 0x8d, + 0x14, 0x50, /* U+00DB "Û" */ 0xc, 0xa0, 0xfa, 0xa4, 0x39, 0x55, 0x7, 0xa5, 0x48, 0x65, 0x1, 0x40, 0xf0, 0x7b, 0xc1, 0xff, 0xff, 0xf, 0xff, 0xa, 0x41, 0xa2, 0x83, 0xd3, - 0x44, 0xd1, 0x45, 0x80, + 0x58, 0xd1, 0x45, 0x0, /* U+00DC "Ü" */ 0x5, 0x82, 0xc3, 0x21, 0x21, 0xde, 0x7, 0x83, 0xff, 0x81, 0xe0, 0xf7, 0x83, 0xff, 0xfe, 0x1f, - 0xfe, 0x14, 0x83, 0x45, 0x7, 0xa6, 0x89, 0xa2, - 0x8b, 0x0, + 0xfd, 0x94, 0x3e, 0x4c, 0x34, 0x50, 0x7a, 0x6b, + 0x1a, 0x28, 0xa0, /* U+00DD "Ý" */ 0xf, 0x3e, 0xf, 0xe8, 0xc3, 0xf4, 0x61, 0xfd, 0x61, 0xef, 0x7, 0xbc, 0x19, 0xc, 0x88, 0x22, - 0xd, 0x18, 0x10, 0xe4, 0x8, 0x51, 0x3, 0x20, - 0xc8, 0x81, 0x10, 0xe4, 0x51, 0x7, 0xa3, 0x84, - 0x3e, 0x50, 0x87, 0xe8, 0x10, 0x7f, 0xff, 0xc0, + 0xd, 0x10, 0x10, 0xe4, 0x3d, 0x10, 0x32, 0xc, + 0x88, 0x11, 0xe, 0x45, 0x10, 0x7a, 0x38, 0x43, + 0xe5, 0x8, 0x7e, 0x81, 0x7, 0xff, 0xfc, /* U+00DE "Þ" */ - 0xf0, 0x7f, 0xf3, 0xeb, 0x7, 0x2e, 0xe0, 0xbe, - 0x85, 0x7, 0x31, 0x87, 0x91, 0xf, 0xfe, 0x1a, - 0x21, 0xcc, 0x60, 0xfa, 0x14, 0x5, 0xdc, 0x15, - 0x60, 0xff, 0xe4, 0x80, + 0xf0, 0x7f, 0xf3, 0xeb, 0x7, 0x2e, 0xe0, 0xbf, + 0xa, 0xf, 0x46, 0x1e, 0x44, 0x3f, 0xf8, 0x68, + 0x87, 0xa3, 0x7, 0xe1, 0x40, 0x5d, 0xc1, 0x56, + 0xf, 0xfe, 0x48, /* U+00DF "ß" */ - 0x1f, 0x90, 0xd0, 0x92, 0x8, 0xa6, 0x40, 0x44, - 0x3f, 0xf8, 0xe8, 0x87, 0xb3, 0xf, 0x22, 0x1f, - 0xfc, 0x34, 0x83, 0xd0, 0xc1, 0xec, 0x50, 0x7b, - 0x20, 0xff, 0xe4, 0xfa, 0xc8, 0x24, 0x49, + 0x1f, 0xa0, 0xd0, 0x8a, 0x4, 0x53, 0x20, 0x22, + 0x1f, 0xfc, 0x74, 0x43, 0xd9, 0x87, 0x91, 0xf, + 0xfe, 0x1a, 0x41, 0xe8, 0x60, 0xf6, 0x28, 0x3d, + 0x90, 0x7f, 0xf2, 0x7d, 0x64, 0x12, 0x22, 0x80, /* U+00E0 "à" */ - 0x2e, 0xf, 0x4b, 0x7, 0xa7, 0xf, 0xa8, 0x1c, - 0xdf, 0x20, 0x65, 0x89, 0x23, 0xa6, 0x47, 0x83, - 0xf9, 0xa8, 0x35, 0x16, 0xa, 0x4b, 0xc1, 0x26, - 0x87, 0xff, 0x1d, 0xa, 0x3b, 0x82, 0x61, 0x34, - 0x0, + 0x2e, 0xf, 0x4a, 0x83, 0xd4, 0xf, 0xcc, 0x1e, + 0xbe, 0x42, 0xd1, 0x24, 0x87, 0xb2, 0x12, 0xf, + 0x79, 0xa8, 0x35, 0x16, 0xa, 0x4f, 0x82, 0x4c, + 0x3f, 0xf9, 0x8, 0x51, 0xdc, 0x13, 0x9, 0xa0, /* U+00E1 "á" */ 0xe, 0xf2, 0x1d, 0x9a, 0x19, 0x58, 0x79, 0x83, - 0xd7, 0xc8, 0x5a, 0xc4, 0x99, 0x58, 0x8a, 0x20, - 0x42, 0x50, 0x7e, 0x7f, 0x4, 0xc3, 0x40, 0xa2, - 0x8a, 0xe, 0x43, 0xfe, 0x42, 0x4e, 0xe0, 0xa8, - 0x26, 0x80, + 0xd7, 0xc8, 0x1d, 0x62, 0x48, 0xab, 0x22, 0x50, + 0x79, 0x83, 0xf3, 0xf8, 0x26, 0x1a, 0x5, 0x1c, + 0xa0, 0xff, 0xe2, 0xa1, 0x27, 0x70, 0x52, 0x26, + 0x80, /* U+00E2 "â" */ - 0xb, 0xc8, 0x74, 0x50, 0x32, 0x6d, 0x2, 0x60, - 0x30, 0x4d, 0xf2, 0x6, 0x58, 0x92, 0x3a, 0x64, - 0x78, 0x3f, 0x9a, 0x83, 0x51, 0x60, 0xa4, 0xbc, - 0x12, 0x68, 0x7f, 0xf1, 0xd0, 0xa3, 0xb8, 0x26, - 0x13, 0x40, - - /* U+00E3 "ã" */ - 0xf, 0xf3, 0xf5, 0xa0, 0x84, 0x58, 0x1e, 0xbd, - 0x7, 0xff, 0x1, 0xbe, 0x40, 0xcb, 0x12, 0x47, - 0x4c, 0x8f, 0x7, 0xf3, 0x50, 0x6a, 0x2c, 0x14, - 0x97, 0x82, 0x4d, 0xf, 0xfe, 0x3a, 0x14, 0x77, - 0x4, 0xc2, 0x68, 0x0, - - /* U+00E4 "ä" */ - 0x38, 0x2b, 0x9, 0x9, 0xb, 0xc1, 0x78, 0x3f, - 0xe6, 0xf9, 0x3, 0x2c, 0x49, 0x1d, 0x32, 0x3c, - 0x1f, 0xcd, 0x41, 0xa8, 0xb0, 0x52, 0x5e, 0x9, - 0x34, 0x3f, 0xf8, 0xe8, 0x51, 0xdc, 0x13, 0x9, + 0xa, 0xd0, 0xe9, 0xa2, 0x1d, 0xb6, 0x1a, 0x3, + 0x4, 0xdf, 0x20, 0x65, 0x89, 0x22, 0xac, 0x8f, + 0x21, 0xf9, 0xa8, 0x35, 0x16, 0xa, 0x4f, 0x82, + 0x4c, 0x3f, 0xf9, 0x8, 0x51, 0xdc, 0x13, 0x9, 0xa0, + /* U+00E3 "ã" */ + 0xf, 0xf3, 0xf5, 0xc0, 0x84, 0x54, 0xf, 0x5e, + 0x83, 0xff, 0x80, 0xdf, 0x20, 0x65, 0x89, 0x22, + 0xac, 0x8f, 0x21, 0xf9, 0xa8, 0x35, 0x16, 0xa, + 0x4f, 0x82, 0x4c, 0x3f, 0xf9, 0x8, 0x51, 0xdc, + 0x13, 0x9, 0xa0, + + /* U+00E4 "ä" */ + 0x38, 0x1c, 0x12, 0x12, 0xf, 0x3, 0xc1, 0xfe, + 0x7e, 0x80, 0xc2, 0x28, 0x8e, 0xc8, 0xf0, 0x7e, + 0x68, 0x1b, 0x94, 0x14, 0x3e, 0x9, 0x20, 0xff, + 0xe2, 0xa1, 0x27, 0x40, 0xa4, 0x64, 0x0, + /* U+00E5 "å" */ - 0xa, 0xe0, 0xeb, 0xe8, 0x32, 0x85, 0x7, 0x22, - 0x1d, 0xdd, 0x87, 0x7c, 0x19, 0xbe, 0x40, 0xcb, - 0x12, 0x45, 0x59, 0x1e, 0x43, 0xf3, 0x50, 0x6a, - 0x2c, 0x14, 0x97, 0x82, 0x4d, 0xf, 0xfe, 0x3a, - 0x14, 0x77, 0x4, 0xc2, 0x68, 0x0, + 0xb, 0xc1, 0xee, 0x98, 0x79, 0x41, 0xf2, 0x83, + 0xdd, 0x30, 0xf7, 0x83, 0x9b, 0xe4, 0xc, 0xb1, + 0x24, 0x55, 0x91, 0xe4, 0x3f, 0x35, 0x6, 0xe5, + 0x82, 0x81, 0xf0, 0x49, 0x87, 0xff, 0x21, 0x9, + 0x3b, 0xd, 0x22, 0xc1, 0x0, /* U+00E6 "æ" */ - 0x5, 0xf0, 0x2f, 0x40, 0x74, 0x4e, 0x45, 0x64, - 0x5d, 0x5, 0x74, 0x28, 0xa0, 0x20, 0xc0, 0x8a, - 0x83, 0xc8, 0x79, 0xfc, 0xf, 0xc0, 0x60, 0x28, - 0xb, 0xe8, 0xba, 0x2, 0xbc, 0x4, 0x39, 0xf, - 0xf2, 0xc, 0x3a, 0x3b, 0x85, 0x77, 0xa5, 0x9, - 0x74, 0x11, 0x80, + 0x5, 0xf2, 0x5e, 0x80, 0xeb, 0x16, 0x8a, 0xcc, + 0xac, 0x7, 0xa1, 0x6a, 0x2, 0x8, 0x8, 0xa8, + 0x3f, 0xf8, 0x2f, 0xe0, 0x7e, 0x3, 0xb, 0x1, + 0x7d, 0x15, 0x81, 0x5e, 0x2, 0x1c, 0x87, 0xf9, + 0x4, 0x19, 0x47, 0x70, 0x9d, 0xf4, 0x88, 0xf2, + 0x23, 0x0, /* U+00E7 "ç" */ 0x5, 0xf2, 0xd, 0x12, 0x61, 0xe8, 0x69, 0x1, - 0x10, 0xf7, 0x83, 0xff, 0xa5, 0xe4, 0x80, 0x82, - 0x1e, 0x84, 0x68, 0x92, 0x8, 0x74, 0x39, 0x83, - 0xb1, 0xf, 0xfe, 0xe, 0xe0, + 0x10, 0xf7, 0x83, 0xff, 0xa5, 0xe4, 0x40, 0x82, + 0x2b, 0x19, 0xac, 0x41, 0x43, 0xa1, 0xcc, 0x1d, + 0x88, 0x7f, 0xf0, 0x77, 0x0, /* U+00E8 "è" */ 0x2e, 0xe, 0x96, 0xe, 0x9c, 0x3d, 0x40, 0xeb, - 0xe0, 0xb4, 0x4c, 0x8b, 0xa1, 0x22, 0x4, 0x43, - 0xfd, 0xf8, 0x32, 0xf8, 0x15, 0xe0, 0xfc, 0x90, - 0x53, 0xf, 0x6e, 0x68, 0x94, + 0xe4, 0x1a, 0x24, 0x23, 0xd0, 0xa1, 0x1, 0x10, + 0xff, 0x7e, 0xc, 0xbe, 0x5, 0x78, 0x3f, 0x24, + 0x12, 0xa1, 0xee, 0xcd, 0x12, 0x80, /* U+00E9 "é" */ - 0xc, 0xf0, 0x74, 0xc1, 0x95, 0x7, 0x30, 0x75, - 0xf0, 0x5a, 0x26, 0x45, 0xd0, 0x91, 0x2, 0x21, - 0xfe, 0xfc, 0x19, 0x7c, 0xa, 0xf0, 0x7e, 0x48, - 0x29, 0x87, 0xb7, 0x34, 0x4a, 0x0, + 0xc, 0xf0, 0x74, 0xc1, 0xa6, 0xe, 0xa0, 0x75, + 0xf2, 0xd, 0x12, 0x11, 0xe8, 0x50, 0x80, 0x88, + 0x7f, 0xbf, 0x6, 0x5f, 0x2, 0xbc, 0x1f, 0x92, + 0x9, 0x50, 0xf7, 0x66, 0x89, 0x40, /* U+00EA "ê" */ 0xb, 0xc1, 0xd2, 0xb0, 0xea, 0x28, 0x28, 0x12, - 0x15, 0xf0, 0x5a, 0x26, 0x45, 0xd0, 0x91, 0x2, - 0x21, 0xfe, 0xfc, 0x19, 0x7c, 0xa, 0xf0, 0x7e, - 0x48, 0x29, 0x87, 0xb7, 0x34, 0x4a, 0x0, + 0x15, 0xf2, 0xd, 0x12, 0x11, 0xe8, 0x50, 0x80, + 0x88, 0x7f, 0xbf, 0x6, 0x5f, 0x2, 0xbc, 0x1f, + 0x92, 0x9, 0x50, 0xf7, 0x66, 0x89, 0x40, /* U+00EB "ë" */ - 0x28, 0x15, 0x81, 0x41, 0x21, 0x78, 0x2f, 0x7, - 0xff, 0x2, 0xf8, 0x36, 0x89, 0x82, 0x2e, 0x84, - 0x22, 0x4, 0x43, 0xff, 0x81, 0xf8, 0x39, 0x7c, - 0x15, 0x78, 0x3f, 0xc9, 0x4, 0xc4, 0x3d, 0xc8, - 0x34, 0x47, 0x0, + 0x38, 0x2b, 0x2, 0x12, 0xf, 0x5, 0xe0, 0xff, + 0x5f, 0x20, 0xd1, 0x21, 0x1e, 0x85, 0x8, 0x8, + 0x87, 0xfb, 0xf0, 0x65, 0xf0, 0x2b, 0xc1, 0xf9, + 0x20, 0xcc, 0x3d, 0x3c, 0x68, 0xb4, /* U+00EC "ì" */ 0x3c, 0x85, 0xb2, 0x14, 0xe1, 0xa8, 0x1b, 0xc1, 0xff, 0xf7, /* U+00ED "í" */ - 0x3, 0xe0, 0xa7, 0x4, 0xc1, 0x50, 0x37, 0x83, - 0xff, 0xf2, + 0x3, 0xe0, 0xa7, 0x5, 0x41, 0x48, 0x6f, 0x7, + 0xff, 0xe4, /* U+00EE "î" */ 0x7, 0x82, 0xd5, 0x8d, 0x65, 0x80, 0xa0, 0x78, @@ -879,45 +887,45 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+00F0 "ð" */ 0x2, 0x1f, 0x53, 0x41, 0x3, 0x5, 0x30, 0x9e, - 0x12, 0xd, 0x4, 0x85, 0x1c, 0x41, 0x58, 0x87, - 0x5e, 0x91, 0x24, 0x58, 0xd4, 0x77, 0xe, 0x41, - 0x20, 0x44, 0x3f, 0xf9, 0x88, 0x84, 0x8e, 0x41, - 0x44, 0xa3, 0xb2, 0x5, 0x4, 0x90, + 0x15, 0x6, 0x80, 0x86, 0x8e, 0x30, 0xac, 0x43, + 0xaf, 0x48, 0x92, 0x2c, 0x6a, 0x3b, 0x87, 0x20, + 0x90, 0x22, 0x1f, 0xfc, 0xc4, 0x42, 0x47, 0x20, + 0xa2, 0x51, 0xd9, 0x2, 0x82, 0x48, /* U+00F1 "ñ" */ - 0xf, 0xeb, 0xd4, 0xc0, 0xbe, 0x7, 0x4f, 0x41, - 0xfd, 0xe3, 0xe4, 0x2c, 0x49, 0x3, 0xd0, 0xc1, - 0x1, 0x10, 0xff, 0xfa, 0x0, + 0xf, 0xeb, 0xd4, 0xc5, 0xf8, 0x7a, 0x7a, 0xf, + 0xef, 0x3f, 0x21, 0x42, 0x48, 0x2e, 0x86, 0x4, + 0x8, 0x87, 0xff, 0xd0, /* U+00F2 "ò" */ 0x1f, 0x7, 0x98, 0x83, 0xcc, 0x1f, 0x98, 0x3d, - 0x7c, 0x85, 0x22, 0x50, 0x51, 0xd8, 0xa8, 0xc2, - 0x88, 0x3c, 0x87, 0xff, 0x4d, 0xf, 0x44, 0x14, - 0x48, 0x3b, 0x58, 0xd1, 0x18, + 0x7d, 0x5, 0xa2, 0x30, 0x8f, 0x62, 0xa2, 0xb, + 0x20, 0xff, 0xf0, 0xc4, 0x14, 0x48, 0xf6, 0x89, + 0xa2, 0x38, /* U+00F3 "ó" */ - 0xe, 0xf2, 0x1d, 0x12, 0x19, 0x34, 0x39, 0x83, - 0xd7, 0xc8, 0x52, 0x25, 0x5, 0x1d, 0x8a, 0x8c, - 0x28, 0x83, 0xc8, 0x7f, 0xf4, 0xd0, 0xf4, 0x41, - 0x44, 0x83, 0xb5, 0x8d, 0x11, 0x80, + 0xe, 0xf2, 0x1d, 0x9a, 0x19, 0x58, 0x79, 0x83, + 0xd7, 0xd0, 0x5a, 0x23, 0x8, 0xf6, 0x2a, 0x20, + 0xb2, 0xf, 0xff, 0xc, 0x41, 0x44, 0x8f, 0x68, + 0x9a, 0x23, 0x80, /* U+00F4 "ô" */ 0xa, 0xd0, 0xe9, 0xa2, 0x1d, 0xb6, 0x1a, 0x3, - 0x6, 0xbe, 0x42, 0x91, 0x28, 0x28, 0xec, 0x54, - 0x61, 0x44, 0x1e, 0x43, 0xff, 0xa6, 0x87, 0xa2, - 0xa, 0x24, 0x1d, 0xac, 0x68, 0x8c, 0x0, + 0x6, 0xbe, 0x82, 0xd1, 0x18, 0x47, 0xb1, 0x51, + 0x5, 0x90, 0x7f, 0xf8, 0x62, 0xa, 0x24, 0x7b, + 0x44, 0xd1, 0x1c, /* U+00F5 "õ" */ 0xf, 0xfb, 0xeb, 0x81, 0x88, 0x90, 0x3d, 0x7c, - 0x1f, 0xfc, 0x1b, 0xe4, 0x29, 0x12, 0x82, 0x8e, - 0xc5, 0x46, 0x14, 0x41, 0xe4, 0x3f, 0xfa, 0x68, - 0x7a, 0x20, 0xa2, 0x41, 0xda, 0xc6, 0x88, 0xc0, + 0x1f, 0xfc, 0x1b, 0xe8, 0x2d, 0x11, 0x84, 0x7b, + 0x15, 0x10, 0x59, 0x7, 0xff, 0x86, 0x20, 0xa2, + 0x47, 0xb4, 0x4d, 0x11, 0xc0, /* U+00F6 "ö" */ - 0x28, 0x17, 0x1, 0x41, 0x90, 0x78, 0x2f, 0x7, - 0xff, 0x2, 0xf9, 0xa, 0x44, 0xa0, 0xa3, 0xb1, - 0x51, 0x85, 0x10, 0x79, 0xf, 0xfe, 0x9a, 0x1e, - 0x88, 0x28, 0x90, 0x76, 0xb1, 0xa2, 0x30, + 0x2c, 0x2e, 0x2, 0x1c, 0x83, 0xc1, 0x78, 0x3f, + 0xf8, 0x17, 0xd0, 0x5a, 0x23, 0x8, 0xf6, 0x2a, + 0x20, 0xb2, 0xf, 0xff, 0xc, 0x41, 0x44, 0x8f, + 0x68, 0x9a, 0x23, 0x80, /* U+00F7 "÷" */ 0xf, 0xfe, 0xf, 0x83, 0xe4, 0x3f, 0x58, 0x7f, @@ -925,68 +933,68 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x5e, 0xf, 0x90, 0xc0, /* U+00F8 "ø" */ - 0xf, 0x90, 0xf9, 0xc2, 0x7e, 0xb0, 0x50, 0x41, - 0x8a, 0x39, 0x13, 0x20, 0x28, 0x91, 0x15, 0x8, - 0x6b, 0xf, 0x22, 0x1e, 0xe0, 0xc8, 0xb0, 0x8e, - 0x48, 0x22, 0x50, 0xd8, 0x83, 0x2, 0x50, 0x14, - 0xf9, 0x0, + 0xf, 0xa0, 0xf9, 0x41, 0x3f, 0x50, 0x14, 0x10, + 0x62, 0x8e, 0x45, 0x64, 0x6, 0x34, 0x49, 0x42, + 0x19, 0xc3, 0xc8, 0x87, 0xa8, 0x19, 0x11, 0x11, + 0xc9, 0x4, 0x6a, 0x1b, 0x14, 0x60, 0x4a, 0x2, + 0x9f, 0x20, /* U+00F9 "ù" */ - 0x3c, 0x87, 0x6c, 0x87, 0x4e, 0x1e, 0xa0, 0x5e, - 0xd, 0xe0, 0xff, 0xfb, 0x20, 0x81, 0x14, 0xd0, - 0x30, 0x90, 0x0, + 0x3c, 0x87, 0x6c, 0x1e, 0x98, 0x3d, 0x40, 0xbc, + 0x1b, 0xc1, 0xff, 0xf9, 0x41, 0x1d, 0x40, 0x61, + 0x50, 0x0, /* U+00FA "ú" */ 0xc, 0xf8, 0x33, 0x38, 0x6e, 0x81, 0xd2, 0x17, - 0x83, 0x78, 0x3f, 0xfe, 0xc8, 0x20, 0x45, 0x34, + 0x83, 0x78, 0x3f, 0xfe, 0xc8, 0x10, 0x45, 0x38, 0xc, 0x24, 0x0, /* U+00FB "û" */ 0xb, 0xc1, 0xda, 0xb0, 0x9a, 0xc8, 0x14, 0x5, - 0x1e, 0xd, 0xe0, 0xff, 0xfb, 0x20, 0x81, 0x14, - 0xd0, 0x30, 0x90, 0x0, + 0x1e, 0xd, 0xe0, 0xff, 0xfc, 0xa0, 0x8e, 0xa0, + 0x30, 0xa8, 0x0, /* U+00FC "ü" */ - 0x28, 0xb, 0x2, 0x80, 0x85, 0xe0, 0x78, 0x3f, - 0xbc, 0x1b, 0xc1, 0xff, 0xf6, 0x41, 0x2, 0x29, - 0xa0, 0x61, 0x20, 0x0, + 0x2c, 0x16, 0x4, 0x24, 0x2f, 0x3, 0xc1, 0xfd, + 0xe0, 0xde, 0xf, 0xff, 0xb2, 0x4, 0x11, 0x4e, + 0x3, 0x9, 0x0, /* U+00FD "ý" */ 0xe, 0xb8, 0x39, 0x68, 0x3b, 0xa0, 0x7a, 0x42, 0x78, 0x27, 0x91, 0xb, 0x30, 0xf2, 0x22, 0x21, - 0xec, 0xc4, 0x40, 0x89, 0x98, 0x48, 0x11, 0xb, - 0x11, 0xc, 0x91, 0x87, 0xe4, 0x39, 0xf, 0xd8, - 0x87, 0xec, 0x3d, 0x88, 0x79, 0x41, 0xde, 0x30, - 0xfa, 0x43, 0x0, + 0xec, 0xc4, 0x40, 0x89, 0x90, 0x79, 0xe, 0x84, + 0x43, 0x24, 0x61, 0xf9, 0xe, 0x43, 0xf6, 0x21, + 0xfb, 0xf, 0x62, 0x1e, 0x50, 0x77, 0x88, 0x3e, + 0x83, 0x80, /* U+00FE "þ" */ 0xf0, 0x7f, 0xf5, 0x1f, 0x83, 0x48, 0x30, 0xa9, - 0xa2, 0x4, 0x19, 0x7, 0x21, 0xff, 0xd3, 0x44, - 0x8, 0x33, 0x5, 0x34, 0x41, 0x20, 0xc2, 0x7e, - 0xf, 0xfe, 0xb0, + 0xa2, 0x4, 0x11, 0x7, 0xff, 0x6d, 0x2, 0x8, + 0xc1, 0x4d, 0x10, 0x48, 0x30, 0x9f, 0x83, 0xff, + 0xac, /* U+00FF "ÿ" */ - 0x7, 0x5, 0xc1, 0x90, 0xc8, 0x5e, 0xb, 0xc1, - 0xff, 0xc0, 0xf0, 0x6b, 0x2, 0x21, 0x21, 0x66, - 0x19, 0x2, 0x20, 0x4c, 0x3e, 0xc4, 0x24, 0x44, - 0x3b, 0x30, 0x21, 0x91, 0x46, 0x1f, 0x42, 0x1c, - 0x81, 0xf, 0x60, 0xc3, 0xc8, 0x10, 0xff, 0xe2, - 0x22, 0x1f, 0x66, 0x1c, 0xe8, 0x87, 0xce, 0x1c, + 0x38, 0x2e, 0x9, 0xc, 0x83, 0xc1, 0x78, 0x3f, + 0xde, 0xd, 0x62, 0x21, 0x20, 0xcc, 0x32, 0x22, + 0x4, 0xc3, 0xd8, 0x81, 0x11, 0xd, 0x98, 0x10, + 0x91, 0x46, 0x1e, 0xc4, 0x32, 0x28, 0x3b, 0x6, + 0x1c, 0x81, 0xf, 0x21, 0xf9, 0x41, 0xe4, 0xc3, + 0x3c, 0x21, 0xf6, 0x1c, /* U+011E "Ğ" */ - 0x3c, 0x17, 0x82, 0x8e, 0xc4, 0x26, 0x12, 0x81, - 0x9f, 0x90, 0xe6, 0xfa, 0xa, 0x8b, 0xe, 0x4, - 0xe9, 0x82, 0x84, 0x1b, 0x14, 0x21, 0xca, 0xf, - 0xd4, 0xf, 0xfe, 0x6f, 0xf0, 0x72, 0xc1, 0xf5, - 0x41, 0xff, 0xc0, 0x44, 0x3e, 0x89, 0xf, 0xa2, - 0xef, 0x10, 0xe8, 0x8e, 0x80, + 0x3c, 0x17, 0x82, 0x8e, 0xc4, 0x26, 0x11, 0x83, + 0x3f, 0x41, 0xcf, 0xe8, 0x2a, 0xa, 0x1c, 0x9, + 0xd3, 0x4a, 0x10, 0x68, 0x50, 0x87, 0x28, 0x3f, + 0x50, 0x3f, 0xf9, 0xbf, 0xc1, 0xcb, 0x7, 0xd5, + 0x7, 0xff, 0x1, 0x10, 0xfa, 0x24, 0x3e, 0x8b, + 0xbc, 0x43, 0xa2, 0x32, /* U+011F "ğ" */ - 0x3c, 0x17, 0x84, 0xec, 0x8a, 0x9, 0x20, 0x7e, - 0x42, 0xf9, 0xb3, 0x3, 0x24, 0x3d, 0x0, 0x90, - 0x10, 0xff, 0xef, 0x24, 0x4, 0x10, 0xfa, 0xb, - 0xa, 0xd, 0xf2, 0x1f, 0xf4, 0x12, 0x23, 0xdc, - 0x46, 0xa1, 0xc0, + 0x3c, 0x17, 0x84, 0xec, 0x89, 0x12, 0x41, 0x7c, + 0x85, 0x7a, 0xf1, 0xa2, 0x81, 0xf, 0x40, 0x24, + 0x4, 0x3f, 0xfb, 0xc9, 0x1, 0x4, 0x3d, 0x2, + 0xd1, 0x41, 0xaf, 0x41, 0xff, 0x41, 0x22, 0x3d, + 0x44, 0x6b, 0x18, /* U+0130 "İ" */ 0x7, 0x87, 0xbc, 0x1f, 0xfd, 0x20, @@ -1003,75 +1011,66 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xd8, /* U+0153 "œ" */ - 0x5, 0xf2, 0x7, 0xd0, 0x52, 0x24, 0xd0, 0xe, - 0x28, 0xec, 0x93, 0xc8, 0xe4, 0x14, 0x8, 0x11, - 0x22, 0x12, 0x4, 0x3f, 0xf8, 0x5f, 0x83, 0xfe, - 0x5f, 0x7, 0xf5, 0x79, 0x10, 0x90, 0xfd, 0x90, - 0x50, 0x20, 0x91, 0x47, 0x62, 0xdd, 0xd0, 0x91, - 0x2b, 0x8, 0xc0, + 0x3, 0xf2, 0xb, 0xd0, 0x54, 0x12, 0xa4, 0x56, + 0x28, 0xec, 0x5b, 0xa1, 0x64, 0x14, 0xc, 0x8, + 0xa1, 0x9, 0x2, 0x1f, 0xfc, 0x2f, 0xc1, 0xff, + 0x2f, 0x83, 0xfa, 0xbc, 0x88, 0x48, 0x10, 0xec, + 0x82, 0x81, 0x4, 0x8a, 0x3b, 0x14, 0x77, 0x42, + 0x82, 0x54, 0x88, 0xc0, /* U+015E "Ş" */ - 0x5, 0xf9, 0xb, 0x45, 0x14, 0x21, 0xe9, 0x8b, + 0x3, 0xf9, 0xb, 0x85, 0x14, 0x21, 0xe9, 0x8b, 0x10, 0x6c, 0xc3, 0xf2, 0x24, 0x1d, 0x50, 0xc8, 0x7b, 0x1b, 0x83, 0xb8, 0xe, 0x86, 0x7c, 0x92, - 0x1e, 0xa1, 0xd0, 0x39, 0x16, 0xf, 0xd1, 0x86, - 0x85, 0x8e, 0x9a, 0x45, 0x16, 0x1c, 0x26, 0x1e, - 0xf, 0x98, 0x3e, 0xc4, 0x3f, 0x90, 0xf3, 0xb0, - 0x40, + 0x1e, 0xa1, 0xd0, 0x39, 0x16, 0xf, 0xd1, 0x6, + 0x85, 0xdd, 0x34, 0x8a, 0xa, 0x1c, 0x27, 0x1e, + 0xf, 0x2b, 0xf, 0xa0, 0xff, 0xe3, 0x3b, 0x84, /* U+015F "ş" */ - 0x1f, 0xc8, 0xc2, 0x89, 0x8e, 0xa2, 0xe, 0x54, - 0x98, 0x53, 0x27, 0x21, 0x5a, 0xa8, 0x1a, 0xc6, - 0xa0, 0xb1, 0x70, 0x74, 0x55, 0x93, 0xa, 0x24, - 0x78, 0x90, 0xf5, 0x3, 0x38, 0x87, 0x22, 0x1a, - 0x8c, 0x0, + 0x1f, 0xc8, 0xc2, 0x9, 0x8e, 0xd3, 0xe, 0x9d, + 0x20, 0xa6, 0x57, 0x90, 0xa8, 0x96, 0x13, 0x69, + 0x50, 0x50, 0xb0, 0x7a, 0x3a, 0x64, 0xe2, 0x89, + 0x6, 0x3a, 0x1c, 0xc1, 0xd8, 0x87, 0xff, 0x7, + 0x70, 0x0, /* U+0160 "Š" */ - 0x2, 0x80, 0xa0, 0xe8, 0x60, 0xe4, 0xe5, 0x7, - 0x60, 0x83, 0xef, 0x7, 0xaf, 0xc8, 0x5a, 0x28, - 0xa1, 0xf, 0x4c, 0x58, 0x83, 0x66, 0x1f, 0x91, - 0x20, 0xea, 0x86, 0x43, 0xd8, 0xdc, 0x1d, 0xc0, - 0x74, 0x33, 0xe4, 0x90, 0xf5, 0xe, 0x81, 0xc8, - 0xb0, 0x7e, 0x8c, 0x34, 0x2c, 0x74, 0xd2, 0x28, - 0xb0, 0xe0, + 0x5, 0x83, 0xc1, 0xa2, 0xcc, 0x3b, 0x4c, 0x3e, + 0xf0, 0x79, 0xfc, 0x85, 0xc2, 0x8a, 0x10, 0xf4, + 0xc5, 0x88, 0x34, 0x61, 0xf2, 0x28, 0x83, 0xbd, + 0xc, 0x87, 0xb1, 0xb8, 0x3b, 0x80, 0xe8, 0x67, + 0xc9, 0x21, 0xea, 0x1d, 0x3, 0x91, 0x60, 0xfd, + 0x10, 0x68, 0x5d, 0xd3, 0x48, 0xa0, 0xa1, 0xc0, /* U+0161 "š" */ 0x1d, 0x3c, 0x6, 0x99, 0x84, 0xce, 0x1c, 0xc1, 0x9f, 0xa0, 0x30, 0x8e, 0x47, 0x69, 0x7, 0x42, - 0x8c, 0x2f, 0x49, 0xc8, 0x56, 0xaa, 0x6, 0xb5, - 0x54, 0x14, 0x2c, 0x1e, 0x8e, 0x99, 0x30, 0xa2, - 0x40, + 0x88, 0x2f, 0x4a, 0xf2, 0x15, 0xa5, 0x86, 0xb4, + 0xa8, 0x28, 0x58, 0x3d, 0x1d, 0x32, 0x61, 0x44, + 0x80, /* U+017D "Ž" */ - 0x7, 0x16, 0x1d, 0xb3, 0x7, 0xa5, 0x83, 0xcf, - 0x6, 0xff, 0xe1, 0x7e, 0xa, 0xbc, 0x8, 0x3e, - 0x44, 0x3d, 0x10, 0x7c, 0x88, 0x7a, 0x20, 0xf2, - 0xe0, 0xf4, 0x41, 0xe4, 0x43, 0xe8, 0x83, 0xc8, - 0x87, 0xd1, 0x7, 0x91, 0xf, 0xa0, 0x57, 0xc0, - 0x5f, 0xc0, + 0x5, 0x96, 0x1d, 0x13, 0x7, 0xb5, 0x83, 0xee, + 0xd, 0xff, 0xc2, 0xf8, 0x35, 0x79, 0x20, 0xf9, + 0x10, 0xf4, 0x41, 0xf2, 0x21, 0xec, 0x83, 0xc8, + 0x10, 0xf4, 0x61, 0xe4, 0x43, 0xe8, 0x83, 0xc8, + 0x87, 0xd1, 0x7, 0x91, 0xf, 0xa1, 0xaf, 0x82, + 0x5f, 0x80, /* U+017E "ž" */ - 0x2c, 0x1c, 0x9, 0xf3, 0x5, 0x58, 0x39, 0x41, + 0x1d, 0x38, 0xd, 0x36, 0x9, 0xa8, 0x39, 0x41, 0x7f, 0xe5, 0xe0, 0xab, 0x81, 0x6, 0x85, 0x6, - 0x48, 0x36, 0x41, 0x91, 0x41, 0xa2, 0xd, 0x10, - 0x65, 0x8, 0x68, 0x15, 0xc1, 0x2f, 0x0, - - /* U+1E9E "ẞ" */ - 0x5, 0xf2, 0x1b, 0x44, 0xa0, 0x21, 0xec, 0x61, - 0x20, 0xe8, 0x3d, 0x10, 0x7c, 0x88, 0x7b, 0x30, - 0xfe, 0xe0, 0xf2, 0x87, 0xe, 0xa6, 0x90, 0x7d, - 0x8, 0x7f, 0xf3, 0xe1, 0xa, 0xed, 0x20, 0xe4, - 0x70, + 0x48, 0x36, 0x41, 0x90, 0x21, 0xa3, 0xd, 0x8, + 0x65, 0x10, 0x68, 0x15, 0xc1, 0x2f, 0x0, /* U+2022 "•" */ 0x7c, 0xc0, 0x83, 0xf4, 0x8, /* U+20AC "€" */ - 0xd, 0x7d, 0x5, 0xa2, 0x82, 0x41, 0xd4, 0x8, - 0xc3, 0xff, 0x83, 0x40, 0x54, 0x5, 0x1, 0x60, - 0x78, 0x1f, 0x2, 0x80, 0xa8, 0xa, 0x2, 0xc0, - 0xf0, 0x3e, 0xf, 0xfe, 0xa, 0x21, 0xec, 0x83, - 0xca, 0x3a, 0x82, 0xa0, 0xa0, + 0xc, 0xfe, 0xa, 0x82, 0xc1, 0x27, 0x50, 0x22, + 0xf, 0x22, 0x19, 0x81, 0x50, 0x34, 0xb, 0x8b, + 0x7, 0xc8, 0xc0, 0xa8, 0x1a, 0x5, 0xc5, 0x83, + 0xe4, 0x3f, 0xf8, 0x8, 0x87, 0xa2, 0xf, 0x93, + 0xa6, 0x15, 0x5, 0x0, /* U+E004 "" */ 0xf, 0x90, 0xff, 0xe0, 0x7a, 0xe0, 0xfe, 0xc3, @@ -2754,365 +2753,364 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 0, .adv_w = 87, .box_w = 2, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, {.bitmap_index = 6, .adv_w = 113, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 11}, {.bitmap_index = 12, .adv_w = 193, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 52, .adv_w = 174, .box_w = 9, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 96, .adv_w = 223, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 141, .adv_w = 191, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 182, .adv_w = 62, .box_w = 2, .box_h = 5, .ofs_x = 1, .ofs_y = 11}, - {.bitmap_index = 184, .adv_w = 111, .box_w = 5, .box_h = 24, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 210, .adv_w = 112, .box_w = 6, .box_h = 24, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 240, .adv_w = 152, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 262, .adv_w = 175, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 276, .adv_w = 69, .box_w = 4, .box_h = 6, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 282, .adv_w = 87, .box_w = 4, .box_h = 2, .ofs_x = 1, .ofs_y = 6}, - {.bitmap_index = 284, .adv_w = 93, .box_w = 2, .box_h = 3, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 286, .adv_w = 131, .box_w = 8, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 316, .adv_w = 174, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 337, .adv_w = 174, .box_w = 6, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 347, .adv_w = 174, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 380, .adv_w = 174, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 412, .adv_w = 174, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 444, .adv_w = 174, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 477, .adv_w = 174, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 509, .adv_w = 174, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 539, .adv_w = 174, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 570, .adv_w = 174, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 601, .adv_w = 82, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 607, .adv_w = 71, .box_w = 3, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 616, .adv_w = 157, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 635, .adv_w = 169, .box_w = 8, .box_h = 6, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 644, .adv_w = 162, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 663, .adv_w = 149, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 692, .adv_w = 271, .box_w = 15, .box_h = 21, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 766, .adv_w = 203, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 51, .adv_w = 174, .box_w = 8, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 91, .adv_w = 223, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 136, .adv_w = 191, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 177, .adv_w = 62, .box_w = 2, .box_h = 5, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 179, .adv_w = 111, .box_w = 5, .box_h = 24, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 205, .adv_w = 112, .box_w = 6, .box_h = 24, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 235, .adv_w = 152, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 257, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 274, .adv_w = 69, .box_w = 4, .box_h = 6, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 280, .adv_w = 87, .box_w = 4, .box_h = 2, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 282, .adv_w = 93, .box_w = 2, .box_h = 3, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 284, .adv_w = 131, .box_w = 8, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 314, .adv_w = 174, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 335, .adv_w = 174, .box_w = 6, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 345, .adv_w = 174, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 378, .adv_w = 174, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 409, .adv_w = 174, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 441, .adv_w = 174, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 474, .adv_w = 174, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 505, .adv_w = 174, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 535, .adv_w = 174, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 566, .adv_w = 174, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 598, .adv_w = 82, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 604, .adv_w = 71, .box_w = 3, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 613, .adv_w = 157, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 633, .adv_w = 169, .box_w = 8, .box_h = 6, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 642, .adv_w = 162, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 661, .adv_w = 149, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 690, .adv_w = 271, .box_w = 15, .box_h = 21, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 763, .adv_w = 203, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 810, .adv_w = 192, .box_w = 9, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 841, .adv_w = 200, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 868, .adv_w = 201, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 894, .adv_w = 175, .box_w = 9, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 914, .adv_w = 169, .box_w = 8, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 930, .adv_w = 208, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 965, .adv_w = 218, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 978, .adv_w = 88, .box_w = 2, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 982, .adv_w = 170, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 998, .adv_w = 192, .box_w = 11, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1035, .adv_w = 167, .box_w = 8, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1044, .adv_w = 266, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1087, .adv_w = 218, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1119, .adv_w = 212, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1145, .adv_w = 195, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1171, .adv_w = 212, .box_w = 12, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1210, .adv_w = 187, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1241, .adv_w = 183, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1279, .adv_w = 183, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1291, .adv_w = 198, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1307, .adv_w = 197, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1348, .adv_w = 268, .box_w = 17, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1409, .adv_w = 194, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1455, .adv_w = 185, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1486, .adv_w = 184, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1519, .adv_w = 88, .box_w = 4, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1527, .adv_w = 130, .box_w = 8, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1556, .adv_w = 88, .box_w = 4, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1564, .adv_w = 131, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 1580, .adv_w = 142, .box_w = 8, .box_h = 2, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1583, .adv_w = 109, .box_w = 6, .box_h = 3, .ofs_x = 0, .ofs_y = 14}, - {.bitmap_index = 1588, .adv_w = 169, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1613, .adv_w = 174, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1633, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1653, .adv_w = 175, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1675, .adv_w = 165, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1698, .adv_w = 111, .box_w = 6, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1713, .adv_w = 174, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 1740, .adv_w = 170, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1754, .adv_w = 81, .box_w = 2, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1760, .adv_w = 79, .box_w = 4, .box_h = 21, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 1770, .adv_w = 159, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1796, .adv_w = 81, .box_w = 2, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1800, .adv_w = 265, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1821, .adv_w = 171, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1833, .adv_w = 177, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1855, .adv_w = 174, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 1877, .adv_w = 176, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 1898, .adv_w = 107, .box_w = 5, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1907, .adv_w = 161, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1931, .adv_w = 104, .box_w = 5, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1943, .adv_w = 170, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1954, .adv_w = 151, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1980, .adv_w = 229, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2022, .adv_w = 155, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2051, .adv_w = 147, .box_w = 9, .box_h = 17, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 2086, .adv_w = 155, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2108, .adv_w = 108, .box_w = 6, .box_h = 22, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 2131, .adv_w = 86, .box_w = 2, .box_h = 19, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 2135, .adv_w = 108, .box_w = 6, .box_h = 22, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 2160, .adv_w = 207, .box_w = 11, .box_h = 4, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 2172, .adv_w = 81, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2172, .adv_w = 82, .box_w = 2, .box_h = 16, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 2178, .adv_w = 180, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2205, .adv_w = 131, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 2215, .adv_w = 166, .box_w = 8, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2233, .adv_w = 116, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 2247, .adv_w = 116, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 2262, .adv_w = 175, .box_w = 8, .box_h = 17, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 2278, .adv_w = 149, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 2308, .adv_w = 203, .box_w = 13, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2361, .adv_w = 203, .box_w = 13, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2415, .adv_w = 203, .box_w = 13, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2469, .adv_w = 203, .box_w = 13, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2525, .adv_w = 203, .box_w = 13, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2580, .adv_w = 203, .box_w = 13, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2635, .adv_w = 286, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2692, .adv_w = 200, .box_w = 10, .box_h = 21, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 2729, .adv_w = 175, .box_w = 9, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2757, .adv_w = 175, .box_w = 9, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2785, .adv_w = 175, .box_w = 9, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2814, .adv_w = 175, .box_w = 9, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2842, .adv_w = 88, .box_w = 6, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2855, .adv_w = 88, .box_w = 6, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2868, .adv_w = 88, .box_w = 6, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2882, .adv_w = 88, .box_w = 7, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 2896, .adv_w = 206, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2929, .adv_w = 218, .box_w = 10, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2971, .adv_w = 212, .box_w = 10, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3007, .adv_w = 212, .box_w = 10, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3042, .adv_w = 212, .box_w = 10, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3079, .adv_w = 212, .box_w = 10, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3119, .adv_w = 212, .box_w = 10, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3154, .adv_w = 166, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 3182, .adv_w = 212, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3230, .adv_w = 198, .box_w = 10, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3256, .adv_w = 198, .box_w = 10, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3282, .adv_w = 198, .box_w = 10, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3310, .adv_w = 198, .box_w = 10, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3336, .adv_w = 185, .box_w = 12, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3376, .adv_w = 181, .box_w = 9, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3404, .adv_w = 184, .box_w = 9, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3435, .adv_w = 169, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3468, .adv_w = 169, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3502, .adv_w = 169, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3536, .adv_w = 169, .box_w = 9, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3572, .adv_w = 169, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3605, .adv_w = 169, .box_w = 9, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3643, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3686, .adv_w = 163, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 3715, .adv_w = 165, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3744, .adv_w = 165, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3774, .adv_w = 165, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3805, .adv_w = 165, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3840, .adv_w = 83, .box_w = 6, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3850, .adv_w = 83, .box_w = 6, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3860, .adv_w = 83, .box_w = 6, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3871, .adv_w = 83, .box_w = 7, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3883, .adv_w = 181, .box_w = 9, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3921, .adv_w = 171, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3942, .adv_w = 177, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3971, .adv_w = 177, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 840, .adv_w = 200, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 867, .adv_w = 201, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 893, .adv_w = 175, .box_w = 9, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 913, .adv_w = 169, .box_w = 8, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 929, .adv_w = 208, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 964, .adv_w = 218, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 977, .adv_w = 88, .box_w = 2, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 981, .adv_w = 170, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 996, .adv_w = 192, .box_w = 11, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1033, .adv_w = 167, .box_w = 8, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1042, .adv_w = 266, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1086, .adv_w = 218, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1118, .adv_w = 212, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1148, .adv_w = 195, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1174, .adv_w = 212, .box_w = 12, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 1213, .adv_w = 187, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1244, .adv_w = 183, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1282, .adv_w = 183, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1294, .adv_w = 198, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1310, .adv_w = 197, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1352, .adv_w = 268, .box_w = 17, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1413, .adv_w = 194, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1459, .adv_w = 185, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1489, .adv_w = 184, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1522, .adv_w = 88, .box_w = 4, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 1530, .adv_w = 130, .box_w = 8, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1559, .adv_w = 88, .box_w = 4, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1567, .adv_w = 131, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 1583, .adv_w = 142, .box_w = 8, .box_h = 2, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1586, .adv_w = 109, .box_w = 6, .box_h = 3, .ofs_x = 0, .ofs_y = 14}, + {.bitmap_index = 1591, .adv_w = 169, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1616, .adv_w = 174, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1636, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1656, .adv_w = 175, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1676, .adv_w = 165, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1699, .adv_w = 111, .box_w = 7, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1716, .adv_w = 174, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1743, .adv_w = 170, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1757, .adv_w = 81, .box_w = 2, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1763, .adv_w = 79, .box_w = 4, .box_h = 21, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 1773, .adv_w = 159, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1799, .adv_w = 81, .box_w = 2, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1803, .adv_w = 265, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1823, .adv_w = 171, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1835, .adv_w = 177, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1854, .adv_w = 174, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1875, .adv_w = 176, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1895, .adv_w = 107, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1903, .adv_w = 161, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1927, .adv_w = 104, .box_w = 6, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1941, .adv_w = 170, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1952, .adv_w = 151, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1978, .adv_w = 229, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2020, .adv_w = 155, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2049, .adv_w = 147, .box_w = 9, .box_h = 17, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 2083, .adv_w = 155, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2105, .adv_w = 108, .box_w = 6, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2130, .adv_w = 86, .box_w = 2, .box_h = 19, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 2134, .adv_w = 108, .box_w = 6, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 2158, .adv_w = 207, .box_w = 10, .box_h = 4, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 2169, .adv_w = 81, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2169, .adv_w = 82, .box_w = 2, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 2175, .adv_w = 180, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2202, .adv_w = 131, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 2212, .adv_w = 166, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2231, .adv_w = 116, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 2245, .adv_w = 116, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 2259, .adv_w = 175, .box_w = 8, .box_h = 17, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 2274, .adv_w = 149, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2304, .adv_w = 203, .box_w = 14, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2361, .adv_w = 203, .box_w = 14, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2418, .adv_w = 203, .box_w = 14, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2475, .adv_w = 203, .box_w = 14, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2534, .adv_w = 203, .box_w = 14, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2589, .adv_w = 203, .box_w = 14, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2647, .adv_w = 286, .box_w = 19, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2706, .adv_w = 200, .box_w = 10, .box_h = 21, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2743, .adv_w = 175, .box_w = 9, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2771, .adv_w = 175, .box_w = 9, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2799, .adv_w = 175, .box_w = 9, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2828, .adv_w = 175, .box_w = 9, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2856, .adv_w = 88, .box_w = 6, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2869, .adv_w = 88, .box_w = 6, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2882, .adv_w = 88, .box_w = 6, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2896, .adv_w = 88, .box_w = 7, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2910, .adv_w = 206, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2949, .adv_w = 218, .box_w = 10, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2991, .adv_w = 212, .box_w = 11, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3032, .adv_w = 212, .box_w = 11, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3073, .adv_w = 212, .box_w = 11, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3114, .adv_w = 212, .box_w = 11, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3157, .adv_w = 212, .box_w = 11, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3199, .adv_w = 166, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 3227, .adv_w = 212, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3276, .adv_w = 198, .box_w = 10, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3302, .adv_w = 198, .box_w = 10, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3328, .adv_w = 198, .box_w = 10, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3356, .adv_w = 198, .box_w = 10, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3383, .adv_w = 185, .box_w = 12, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3422, .adv_w = 181, .box_w = 9, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3449, .adv_w = 184, .box_w = 9, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3481, .adv_w = 169, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3513, .adv_w = 169, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3546, .adv_w = 169, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3579, .adv_w = 169, .box_w = 9, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3614, .adv_w = 169, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3645, .adv_w = 169, .box_w = 9, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3682, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3724, .adv_w = 163, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 3753, .adv_w = 165, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3783, .adv_w = 165, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3813, .adv_w = 165, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3844, .adv_w = 165, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3874, .adv_w = 83, .box_w = 6, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3884, .adv_w = 83, .box_w = 6, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3894, .adv_w = 83, .box_w = 6, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3905, .adv_w = 83, .box_w = 7, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3917, .adv_w = 181, .box_w = 9, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3955, .adv_w = 171, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3975, .adv_w = 177, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, {.bitmap_index = 4001, .adv_w = 177, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4032, .adv_w = 177, .box_w = 9, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4064, .adv_w = 177, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4095, .adv_w = 176, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 4115, .adv_w = 175, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4149, .adv_w = 170, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4168, .adv_w = 170, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4187, .adv_w = 170, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4207, .adv_w = 170, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4227, .adv_w = 147, .box_w = 9, .box_h = 21, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 4270, .adv_w = 179, .box_w = 8, .box_h = 21, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 4297, .adv_w = 147, .box_w = 10, .box_h = 21, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 4345, .adv_w = 208, .box_w = 10, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4390, .adv_w = 174, .box_w = 8, .box_h = 21, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 4425, .adv_w = 88, .box_w = 2, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4431, .adv_w = 83, .box_w = 2, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4435, .adv_w = 291, .box_w = 16, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4476, .adv_w = 274, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4519, .adv_w = 183, .box_w = 10, .box_h = 21, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 4568, .adv_w = 161, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 4602, .adv_w = 183, .box_w = 10, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4652, .adv_w = 161, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4685, .adv_w = 184, .box_w = 10, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4727, .adv_w = 155, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4758, .adv_w = 198, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4791, .adv_w = 119, .box_w = 4, .box_h = 5, .ofs_x = 1, .ofs_y = 6}, - {.bitmap_index = 4796, .adv_w = 174, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4833, .adv_w = 352, .box_w = 15, .box_h = 15, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 4875, .adv_w = 352, .box_w = 20, .box_h = 13, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 4917, .adv_w = 352, .box_w = 17, .box_h = 23, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 5006, .adv_w = 352, .box_w = 22, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5079, .adv_w = 352, .box_w = 16, .box_h = 15, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 5118, .adv_w = 352, .box_w = 16, .box_h = 16, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5167, .adv_w = 352, .box_w = 16, .box_h = 16, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5216, .adv_w = 352, .box_w = 16, .box_h = 16, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5256, .adv_w = 352, .box_w = 11, .box_h = 19, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 5277, .adv_w = 352, .box_w = 17, .box_h = 20, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 5332, .adv_w = 352, .box_w = 20, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5378, .adv_w = 352, .box_w = 13, .box_h = 19, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 5433, .adv_w = 352, .box_w = 17, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5476, .adv_w = 352, .box_w = 17, .box_h = 16, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 5522, .adv_w = 352, .box_w = 13, .box_h = 21, .ofs_x = 5, .ofs_y = -2}, - {.bitmap_index = 5550, .adv_w = 352, .box_w = 17, .box_h = 14, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 5597, .adv_w = 352, .box_w = 12, .box_h = 8, .ofs_x = 5, .ofs_y = 4}, - {.bitmap_index = 5619, .adv_w = 352, .box_w = 8, .box_h = 12, .ofs_x = 7, .ofs_y = 2}, - {.bitmap_index = 5641, .adv_w = 352, .box_w = 8, .box_h = 12, .ofs_x = 7, .ofs_y = 2}, - {.bitmap_index = 5663, .adv_w = 352, .box_w = 12, .box_h = 7, .ofs_x = 5, .ofs_y = 5}, - {.bitmap_index = 5683, .adv_w = 352, .box_w = 18, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 5758, .adv_w = 352, .box_w = 14, .box_h = 14, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 5803, .adv_w = 352, .box_w = 19, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5844, .adv_w = 352, .box_w = 4, .box_h = 15, .ofs_x = 9, .ofs_y = 1}, - {.bitmap_index = 5860, .adv_w = 352, .box_w = 20, .box_h = 15, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 5907, .adv_w = 352, .box_w = 20, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5980, .adv_w = 352, .box_w = 14, .box_h = 18, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 6035, .adv_w = 352, .box_w = 13, .box_h = 19, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 6073, .adv_w = 352, .box_w = 21, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6145, .adv_w = 352, .box_w = 19, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6196, .adv_w = 352, .box_w = 20, .box_h = 14, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 6238, .adv_w = 352, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6301, .adv_w = 352, .box_w = 22, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 6337, .adv_w = 352, .box_w = 20, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6407, .adv_w = 352, .box_w = 13, .box_h = 19, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 6453, .adv_w = 352, .box_w = 15, .box_h = 19, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 6507, .adv_w = 352, .box_w = 13, .box_h = 2, .ofs_x = 5, .ofs_y = 7}, - {.bitmap_index = 6513, .adv_w = 352, .box_w = 12, .box_h = 13, .ofs_x = 5, .ofs_y = 2}, - {.bitmap_index = 6522, .adv_w = 352, .box_w = 11, .box_h = 14, .ofs_x = 7, .ofs_y = 1}, - {.bitmap_index = 6551, .adv_w = 352, .box_w = 13, .box_h = 13, .ofs_x = 5, .ofs_y = 2}, - {.bitmap_index = 6572, .adv_w = 352, .box_w = 15, .box_h = 16, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 6621, .adv_w = 352, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 6690, .adv_w = 352, .box_w = 17, .box_h = 19, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 6746, .adv_w = 352, .box_w = 18, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6816, .adv_w = 352, .box_w = 17, .box_h = 19, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 6874, .adv_w = 352, .box_w = 19, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6948, .adv_w = 352, .box_w = 16, .box_h = 15, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 7001, .adv_w = 352, .box_w = 14, .box_h = 15, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 7040, .adv_w = 352, .box_w = 12, .box_h = 11, .ofs_x = 5, .ofs_y = 3}, - {.bitmap_index = 7066, .adv_w = 352, .box_w = 12, .box_h = 11, .ofs_x = 5, .ofs_y = 3}, - {.bitmap_index = 7091, .adv_w = 352, .box_w = 20, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7147, .adv_w = 352, .box_w = 13, .box_h = 19, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 7196, .adv_w = 352, .box_w = 11, .box_h = 11, .ofs_x = 5, .ofs_y = 3}, - {.bitmap_index = 7203, .adv_w = 352, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7278, .adv_w = 352, .box_w = 20, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7309, .adv_w = 352, .box_w = 10, .box_h = 19, .ofs_x = 6, .ofs_y = -1}, - {.bitmap_index = 7340, .adv_w = 352, .box_w = 17, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 7412, .adv_w = 352, .box_w = 17, .box_h = 21, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 7481, .adv_w = 352, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7534, .adv_w = 352, .box_w = 14, .box_h = 16, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 7574, .adv_w = 352, .box_w = 11, .box_h = 17, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 7611, .adv_w = 352, .box_w = 12, .box_h = 17, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 7658, .adv_w = 352, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7720, .adv_w = 352, .box_w = 19, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 7806, .adv_w = 352, .box_w = 17, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7876, .adv_w = 352, .box_w = 20, .box_h = 20, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 7950, .adv_w = 352, .box_w = 20, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8027, .adv_w = 352, .box_w = 16, .box_h = 17, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 8085, .adv_w = 352, .box_w = 17, .box_h = 18, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 8142, .adv_w = 352, .box_w = 20, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8208, .adv_w = 352, .box_w = 14, .box_h = 17, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 8243, .adv_w = 352, .box_w = 19, .box_h = 15, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 8298, .adv_w = 352, .box_w = 17, .box_h = 21, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 8373, .adv_w = 352, .box_w = 19, .box_h = 16, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 8421, .adv_w = 352, .box_w = 11, .box_h = 17, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 8448, .adv_w = 352, .box_w = 15, .box_h = 18, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 8493, .adv_w = 352, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8540, .adv_w = 352, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8589, .adv_w = 352, .box_w = 20, .box_h = 20, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 8665, .adv_w = 352, .box_w = 18, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8739, .adv_w = 352, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 8800, .adv_w = 352, .box_w = 18, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8876, .adv_w = 352, .box_w = 15, .box_h = 19, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 8938, .adv_w = 352, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8993, .adv_w = 352, .box_w = 19, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9049, .adv_w = 352, .box_w = 16, .box_h = 15, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 9090, .adv_w = 352, .box_w = 19, .box_h = 15, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 9148, .adv_w = 352, .box_w = 20, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9185, .adv_w = 352, .box_w = 20, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9223, .adv_w = 352, .box_w = 10, .box_h = 19, .ofs_x = 6, .ofs_y = -1}, - {.bitmap_index = 9249, .adv_w = 352, .box_w = 15, .box_h = 19, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 9313, .adv_w = 352, .box_w = 14, .box_h = 17, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 9354, .adv_w = 352, .box_w = 14, .box_h = 19, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 9410, .adv_w = 352, .box_w = 18, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 9478, .adv_w = 352, .box_w = 17, .box_h = 21, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 9547, .adv_w = 352, .box_w = 20, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 9608, .adv_w = 352, .box_w = 17, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 9657, .adv_w = 352, .box_w = 17, .box_h = 19, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 9702, .adv_w = 352, .box_w = 15, .box_h = 17, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 9733, .adv_w = 352, .box_w = 15, .box_h = 19, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 9785, .adv_w = 352, .box_w = 18, .box_h = 10, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 9814, .adv_w = 352, .box_w = 18, .box_h = 13, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 9851, .adv_w = 352, .box_w = 21, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 9918, .adv_w = 352, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 9974, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 10050, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10128, .adv_w = 352, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10181, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10254, .adv_w = 242, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10314, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10412, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10503, .adv_w = 396, .box_w = 25, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10589, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10657, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10730, .adv_w = 352, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 10803, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 10898, .adv_w = 176, .box_w = 11, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 10923, .adv_w = 264, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 10976, .adv_w = 396, .box_w = 25, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11080, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11141, .adv_w = 242, .box_w = 15, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11207, .adv_w = 308, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 11264, .adv_w = 308, .box_w = 20, .box_h = 24, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 11338, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11374, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11402, .adv_w = 308, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 11459, .adv_w = 308, .box_w = 21, .box_h = 20, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 11525, .adv_w = 220, .box_w = 12, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 11574, .adv_w = 220, .box_w = 12, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 11622, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11667, .adv_w = 308, .box_w = 20, .box_h = 5, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 11679, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11769, .adv_w = 440, .box_w = 28, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11891, .adv_w = 396, .box_w = 27, .box_h = 22, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 11997, .adv_w = 352, .box_w = 22, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12088, .adv_w = 308, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 12138, .adv_w = 308, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 12186, .adv_w = 440, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 12266, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12300, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12372, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 12462, .adv_w = 352, .box_w = 21, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12510, .adv_w = 308, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 12593, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12643, .adv_w = 308, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 12702, .adv_w = 308, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 12741, .adv_w = 352, .box_w = 22, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12797, .adv_w = 220, .box_w = 15, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 12864, .adv_w = 308, .box_w = 20, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12921, .adv_w = 308, .box_w = 20, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12995, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13069, .adv_w = 352, .box_w = 24, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 13152, .adv_w = 352, .box_w = 17, .box_h = 19, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 13203, .adv_w = 264, .box_w = 17, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 13242, .adv_w = 352, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13278, .adv_w = 352, .box_w = 20, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 13346, .adv_w = 440, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13452, .adv_w = 352, .box_w = 20, .box_h = 13, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 13508, .adv_w = 352, .box_w = 17, .box_h = 15, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 13545, .adv_w = 352, .box_w = 19, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13593, .adv_w = 352, .box_w = 17, .box_h = 16, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 13620, .adv_w = 440, .box_w = 28, .box_h = 14, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 13670, .adv_w = 440, .box_w = 28, .box_h = 14, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 13722, .adv_w = 440, .box_w = 28, .box_h = 14, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 13774, .adv_w = 440, .box_w = 28, .box_h = 14, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 13824, .adv_w = 440, .box_w = 28, .box_h = 14, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 13866, .adv_w = 440, .box_w = 28, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13954, .adv_w = 308, .box_w = 17, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 14038, .adv_w = 352, .box_w = 11, .box_h = 19, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 4028, .adv_w = 177, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4055, .adv_w = 177, .box_w = 9, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4084, .adv_w = 177, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4112, .adv_w = 176, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 4132, .adv_w = 175, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4166, .adv_w = 170, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4184, .adv_w = 170, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4203, .adv_w = 170, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4222, .adv_w = 170, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4241, .adv_w = 147, .box_w = 9, .box_h = 21, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 4283, .adv_w = 179, .box_w = 8, .box_h = 21, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 4308, .adv_w = 147, .box_w = 9, .box_h = 21, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 4352, .adv_w = 208, .box_w = 10, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4396, .adv_w = 174, .box_w = 8, .box_h = 21, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 4431, .adv_w = 88, .box_w = 2, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4437, .adv_w = 83, .box_w = 2, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4441, .adv_w = 291, .box_w = 16, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4482, .adv_w = 274, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4526, .adv_w = 183, .box_w = 10, .box_h = 21, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 4574, .adv_w = 161, .box_w = 8, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 4608, .adv_w = 183, .box_w = 10, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4656, .adv_w = 161, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4689, .adv_w = 184, .box_w = 10, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4731, .adv_w = 155, .box_w = 8, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4762, .adv_w = 119, .box_w = 4, .box_h = 5, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 4767, .adv_w = 174, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4803, .adv_w = 352, .box_w = 15, .box_h = 15, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 4845, .adv_w = 352, .box_w = 20, .box_h = 13, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 4887, .adv_w = 352, .box_w = 17, .box_h = 23, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 4976, .adv_w = 352, .box_w = 22, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5049, .adv_w = 352, .box_w = 16, .box_h = 15, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 5088, .adv_w = 352, .box_w = 16, .box_h = 16, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5137, .adv_w = 352, .box_w = 16, .box_h = 16, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5186, .adv_w = 352, .box_w = 16, .box_h = 16, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5226, .adv_w = 352, .box_w = 11, .box_h = 19, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 5247, .adv_w = 352, .box_w = 17, .box_h = 20, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 5302, .adv_w = 352, .box_w = 20, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5348, .adv_w = 352, .box_w = 13, .box_h = 19, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 5403, .adv_w = 352, .box_w = 17, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5446, .adv_w = 352, .box_w = 17, .box_h = 16, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 5492, .adv_w = 352, .box_w = 13, .box_h = 21, .ofs_x = 5, .ofs_y = -2}, + {.bitmap_index = 5520, .adv_w = 352, .box_w = 17, .box_h = 14, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 5567, .adv_w = 352, .box_w = 12, .box_h = 8, .ofs_x = 5, .ofs_y = 4}, + {.bitmap_index = 5589, .adv_w = 352, .box_w = 8, .box_h = 12, .ofs_x = 7, .ofs_y = 2}, + {.bitmap_index = 5611, .adv_w = 352, .box_w = 8, .box_h = 12, .ofs_x = 7, .ofs_y = 2}, + {.bitmap_index = 5633, .adv_w = 352, .box_w = 12, .box_h = 7, .ofs_x = 5, .ofs_y = 5}, + {.bitmap_index = 5653, .adv_w = 352, .box_w = 18, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5728, .adv_w = 352, .box_w = 14, .box_h = 14, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 5773, .adv_w = 352, .box_w = 19, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5814, .adv_w = 352, .box_w = 4, .box_h = 15, .ofs_x = 9, .ofs_y = 1}, + {.bitmap_index = 5830, .adv_w = 352, .box_w = 20, .box_h = 15, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 5877, .adv_w = 352, .box_w = 20, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5950, .adv_w = 352, .box_w = 14, .box_h = 18, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 6005, .adv_w = 352, .box_w = 13, .box_h = 19, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 6043, .adv_w = 352, .box_w = 21, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6115, .adv_w = 352, .box_w = 19, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6166, .adv_w = 352, .box_w = 20, .box_h = 14, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 6208, .adv_w = 352, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6271, .adv_w = 352, .box_w = 22, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 6307, .adv_w = 352, .box_w = 20, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6377, .adv_w = 352, .box_w = 13, .box_h = 19, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 6423, .adv_w = 352, .box_w = 15, .box_h = 19, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 6477, .adv_w = 352, .box_w = 13, .box_h = 2, .ofs_x = 5, .ofs_y = 7}, + {.bitmap_index = 6483, .adv_w = 352, .box_w = 12, .box_h = 13, .ofs_x = 5, .ofs_y = 2}, + {.bitmap_index = 6492, .adv_w = 352, .box_w = 11, .box_h = 14, .ofs_x = 7, .ofs_y = 1}, + {.bitmap_index = 6521, .adv_w = 352, .box_w = 13, .box_h = 13, .ofs_x = 5, .ofs_y = 2}, + {.bitmap_index = 6542, .adv_w = 352, .box_w = 15, .box_h = 16, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 6591, .adv_w = 352, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 6660, .adv_w = 352, .box_w = 17, .box_h = 19, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 6716, .adv_w = 352, .box_w = 18, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6786, .adv_w = 352, .box_w = 17, .box_h = 19, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 6844, .adv_w = 352, .box_w = 19, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6918, .adv_w = 352, .box_w = 16, .box_h = 15, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 6971, .adv_w = 352, .box_w = 14, .box_h = 15, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 7010, .adv_w = 352, .box_w = 12, .box_h = 11, .ofs_x = 5, .ofs_y = 3}, + {.bitmap_index = 7036, .adv_w = 352, .box_w = 12, .box_h = 11, .ofs_x = 5, .ofs_y = 3}, + {.bitmap_index = 7061, .adv_w = 352, .box_w = 20, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7117, .adv_w = 352, .box_w = 13, .box_h = 19, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 7166, .adv_w = 352, .box_w = 11, .box_h = 11, .ofs_x = 5, .ofs_y = 3}, + {.bitmap_index = 7173, .adv_w = 352, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7248, .adv_w = 352, .box_w = 20, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7279, .adv_w = 352, .box_w = 10, .box_h = 19, .ofs_x = 6, .ofs_y = -1}, + {.bitmap_index = 7310, .adv_w = 352, .box_w = 17, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 7382, .adv_w = 352, .box_w = 17, .box_h = 21, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 7451, .adv_w = 352, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7504, .adv_w = 352, .box_w = 14, .box_h = 16, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 7544, .adv_w = 352, .box_w = 11, .box_h = 17, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 7581, .adv_w = 352, .box_w = 12, .box_h = 17, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 7628, .adv_w = 352, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7690, .adv_w = 352, .box_w = 19, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 7776, .adv_w = 352, .box_w = 17, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7846, .adv_w = 352, .box_w = 20, .box_h = 20, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 7920, .adv_w = 352, .box_w = 20, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7997, .adv_w = 352, .box_w = 16, .box_h = 17, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 8055, .adv_w = 352, .box_w = 17, .box_h = 18, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 8112, .adv_w = 352, .box_w = 20, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8178, .adv_w = 352, .box_w = 14, .box_h = 17, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 8213, .adv_w = 352, .box_w = 19, .box_h = 15, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 8268, .adv_w = 352, .box_w = 17, .box_h = 21, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 8343, .adv_w = 352, .box_w = 19, .box_h = 16, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 8391, .adv_w = 352, .box_w = 11, .box_h = 17, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 8418, .adv_w = 352, .box_w = 15, .box_h = 18, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8463, .adv_w = 352, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8510, .adv_w = 352, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8559, .adv_w = 352, .box_w = 20, .box_h = 20, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 8635, .adv_w = 352, .box_w = 18, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8709, .adv_w = 352, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 8770, .adv_w = 352, .box_w = 18, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8846, .adv_w = 352, .box_w = 15, .box_h = 19, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 8908, .adv_w = 352, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8963, .adv_w = 352, .box_w = 19, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9019, .adv_w = 352, .box_w = 16, .box_h = 15, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 9060, .adv_w = 352, .box_w = 19, .box_h = 15, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 9118, .adv_w = 352, .box_w = 20, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9155, .adv_w = 352, .box_w = 20, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9193, .adv_w = 352, .box_w = 10, .box_h = 19, .ofs_x = 6, .ofs_y = -1}, + {.bitmap_index = 9219, .adv_w = 352, .box_w = 15, .box_h = 19, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 9283, .adv_w = 352, .box_w = 14, .box_h = 17, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 9324, .adv_w = 352, .box_w = 14, .box_h = 19, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 9380, .adv_w = 352, .box_w = 18, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 9448, .adv_w = 352, .box_w = 17, .box_h = 21, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 9517, .adv_w = 352, .box_w = 20, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9578, .adv_w = 352, .box_w = 17, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 9627, .adv_w = 352, .box_w = 17, .box_h = 19, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 9672, .adv_w = 352, .box_w = 15, .box_h = 17, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 9703, .adv_w = 352, .box_w = 15, .box_h = 19, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 9755, .adv_w = 352, .box_w = 18, .box_h = 10, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 9784, .adv_w = 352, .box_w = 18, .box_h = 13, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 9821, .adv_w = 352, .box_w = 21, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9888, .adv_w = 352, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 9944, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 10020, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10098, .adv_w = 352, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10151, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10224, .adv_w = 242, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10284, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10382, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10473, .adv_w = 396, .box_w = 25, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10559, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10627, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10700, .adv_w = 352, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10773, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10868, .adv_w = 176, .box_w = 11, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10893, .adv_w = 264, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10946, .adv_w = 396, .box_w = 25, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11050, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11111, .adv_w = 242, .box_w = 15, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11177, .adv_w = 308, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 11234, .adv_w = 308, .box_w = 20, .box_h = 24, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11308, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11344, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11372, .adv_w = 308, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 11429, .adv_w = 308, .box_w = 21, .box_h = 20, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 11495, .adv_w = 220, .box_w = 12, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11544, .adv_w = 220, .box_w = 12, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11592, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11637, .adv_w = 308, .box_w = 20, .box_h = 5, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 11649, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11739, .adv_w = 440, .box_w = 28, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11861, .adv_w = 396, .box_w = 27, .box_h = 22, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 11967, .adv_w = 352, .box_w = 22, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12058, .adv_w = 308, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 12108, .adv_w = 308, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 12156, .adv_w = 440, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12236, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12270, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12342, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 12432, .adv_w = 352, .box_w = 21, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12480, .adv_w = 308, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12563, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12613, .adv_w = 308, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12672, .adv_w = 308, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12711, .adv_w = 352, .box_w = 22, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12767, .adv_w = 220, .box_w = 15, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 12834, .adv_w = 308, .box_w = 20, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12891, .adv_w = 308, .box_w = 20, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12965, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13039, .adv_w = 352, .box_w = 24, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 13122, .adv_w = 352, .box_w = 17, .box_h = 19, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 13173, .adv_w = 264, .box_w = 17, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13212, .adv_w = 352, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13248, .adv_w = 352, .box_w = 20, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13316, .adv_w = 440, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13422, .adv_w = 352, .box_w = 20, .box_h = 13, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 13478, .adv_w = 352, .box_w = 17, .box_h = 15, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 13515, .adv_w = 352, .box_w = 19, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13563, .adv_w = 352, .box_w = 17, .box_h = 16, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13590, .adv_w = 440, .box_w = 28, .box_h = 14, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 13640, .adv_w = 440, .box_w = 28, .box_h = 14, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 13692, .adv_w = 440, .box_w = 28, .box_h = 14, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 13744, .adv_w = 440, .box_w = 28, .box_h = 14, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 13794, .adv_w = 440, .box_w = 28, .box_h = 14, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 13836, .adv_w = 440, .box_w = 28, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13924, .adv_w = 308, .box_w = 17, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 14008, .adv_w = 352, .box_w = 11, .box_h = 19, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 14035, .adv_w = 352, .box_w = 11, .box_h = 19, .ofs_x = 5, .ofs_y = -1}, {.bitmap_index = 14065, .adv_w = 352, .box_w = 11, .box_h = 19, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 14095, .adv_w = 352, .box_w = 11, .box_h = 19, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 14130, .adv_w = 352, .box_w = 22, .box_h = 14, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 14202, .adv_w = 352, .box_w = 18, .box_h = 14, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 14250, .adv_w = 352, .box_w = 18, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 14292, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 14347, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 14438, .adv_w = 352, .box_w = 12, .box_h = 21, .ofs_x = 5, .ofs_y = -2}, - {.bitmap_index = 14484, .adv_w = 440, .box_w = 28, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14575, .adv_w = 264, .box_w = 17, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 14614, .adv_w = 354, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 1} + {.bitmap_index = 14100, .adv_w = 352, .box_w = 22, .box_h = 14, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 14172, .adv_w = 352, .box_w = 18, .box_h = 14, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 14220, .adv_w = 352, .box_w = 18, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14262, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14317, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 14408, .adv_w = 352, .box_w = 12, .box_h = 21, .ofs_x = 5, .ofs_y = -2}, + {.bitmap_index = 14454, .adv_w = 440, .box_w = 28, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14545, .adv_w = 264, .box_w = 17, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14584, .adv_w = 354, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 1} }; /*--------------------- @@ -3125,30 +3123,30 @@ static const uint16_t unicode_list_1[] = { static const uint16_t unicode_list_3[] = { 0x0, 0x1, 0x12, 0x13, 0x34, 0x35, 0x40, 0x41, - 0x42, 0x43, 0x5f, 0x60, 0x1d80, 0x1f04, 0x1f8e, 0xdee6, - 0xdef3, 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, - 0xdf7c, 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, - 0xe023, 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, - 0xe0f2, 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, - 0xe20c, 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, - 0xe31a, 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, - 0xe390, 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, - 0xe447, 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, - 0xe48a, 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, - 0xe583, 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, - 0xe5f9, 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, - 0xe7bf, 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, - 0xe952, 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, - 0xeeea, 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, - 0xeefe, 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, - 0xef2a, 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, - 0xef49, 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, - 0xef5b, 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, - 0xefab, 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, - 0xf03d, 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, - 0xf122, 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, - 0xf184, 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, - 0xf43c, 0xf6a4, 0xf784 + 0x42, 0x43, 0x5f, 0x60, 0x1f04, 0x1f8e, 0xdee6, 0xdef3, + 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, 0xdf7c, + 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, 0xe023, + 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, 0xe0f2, + 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, 0xe20c, + 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, 0xe31a, + 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, 0xe390, + 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, 0xe447, + 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, 0xe48a, + 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, 0xe583, + 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, 0xe5f9, + 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, 0xe7bf, + 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, 0xe952, + 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, 0xeeea, + 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, 0xeefe, + 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, 0xef2a, + 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, 0xef49, + 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, 0xef5b, + 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, 0xefab, + 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, 0xf03d, + 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, 0xf122, + 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, 0xf184, + 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, 0xf43c, + 0xf6a4, 0xf784 }; /*Collect the unicode lists and glyph_id offsets*/ @@ -3168,7 +3166,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = }, { .range_start = 286, .range_length = 63365, .glyph_id_start = 169, - .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 195, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 194, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_24_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_24_latin1.c index 6857b2b4e..591f2624b 100644 --- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_24_latin1.c +++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_24_latin1.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 24 px * Bpp: 2 - * Opts: --no-kerning --bpp 2 --size 24 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_24_latin1.c --format lvgl + * Opts: --no-kerning --bpp 2 --size 24 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_24_latin1.c --format lvgl ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -35,59 +35,58 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xe0, 0x22, 0x19, 0x13, 0xd, 0xe8, 0xf2, 0x78, 0x50, 0x14, 0x5, 0x14, 0x1a, 0x15, 0x7, 0xff, 0xf, 0x11, 0x7, 0xc5, 0xc7, 0x83, 0xff, 0x81, - 0xe4, 0xf0, 0xf8, 0x25, 0x7, 0xff, 0xb, 0xf, + 0xe4, 0xf0, 0xf8, 0x3f, 0xf8, 0x4a, 0xb, 0xf, 0x62, 0x21, 0xff, 0xc2, /* U+0024 "$" */ - 0xd, 0xe0, 0xff, 0xe2, 0xa0, 0x83, 0xb8, 0xe, - 0x14, 0x3e, 0x2, 0x4, 0x81, 0x10, 0x7c, 0x87, - 0xf9, 0x41, 0xa0, 0xa8, 0x8, 0x60, 0xf2, 0x87, - 0x43, 0xa8, 0xa, 0x7, 0x3a, 0x28, 0x3d, 0x24, - 0x28, 0x34, 0x15, 0x3, 0xfc, 0x84, 0x85, 0x12, - 0x8, 0x45, 0x17, 0x81, 0x2, 0x88, 0x1c, 0x33, - 0x2, 0xf, 0xfe, 0x8, + 0xd, 0xe0, 0xff, 0xe7, 0xe0, 0x83, 0xb0, 0x9c, + 0x28, 0x7c, 0x8, 0x9, 0x2, 0x10, 0xf9, 0xf, + 0xf5, 0x0, 0x90, 0x4a, 0x4, 0x3a, 0x1e, 0xc1, + 0x68, 0x77, 0x2, 0xf, 0x3a, 0x61, 0xf4, 0x17, + 0x83, 0xfc, 0x87, 0xc9, 0x5, 0x89, 0x3, 0xe0, + 0x40, 0xd0, 0x9c, 0x35, 0x82, 0xf, 0xfe, 0x8, /* U+0025 "%" */ 0x2f, 0x41, 0xfc, 0xa0, 0x30, 0x7e, 0x8b, 0x10, 0x94, 0x1c, 0x87, 0xa0, 0xff, 0xe0, 0x42, 0x1c, - 0xa0, 0xce, 0x1a, 0x28, 0x46, 0x87, 0x32, 0xa5, - 0x10, 0x79, 0xa2, 0x50, 0x3f, 0xe8, 0x6f, 0x41, - 0xf3, 0xa8, 0xc, 0x1d, 0x24, 0x58, 0x86, 0x54, - 0x12, 0x1f, 0x50, 0x3f, 0xf8, 0xa, 0xc, 0x87, - 0xd0, 0x51, 0x62, 0x1f, 0x94, 0x6, 0x0, + 0xa0, 0x95, 0x86, 0x8a, 0x11, 0x21, 0xcc, 0xa9, + 0x44, 0x1e, 0x68, 0x94, 0xf, 0xfa, 0x55, 0xe8, + 0x3e, 0x65, 0x1, 0x83, 0xa4, 0x8b, 0x10, 0xca, + 0x82, 0x43, 0xea, 0x7, 0xff, 0x1, 0x41, 0x90, + 0xfa, 0xa, 0x2c, 0x43, 0xf2, 0x80, 0xc0, /* U+0026 "&" */ 0x3, 0xf2, 0x1e, 0x60, 0xa4, 0x3a, 0x2e, 0x20, - 0xf9, 0x10, 0xff, 0xe3, 0xa4, 0x64, 0x1d, 0xe, - 0x28, 0x3d, 0x2, 0x81, 0xf4, 0x1f, 0xec, 0x88, - 0x2f, 0x10, 0xa8, 0xc4, 0x24, 0x84, 0x16, 0x21, - 0xec, 0x51, 0x84, 0x85, 0x4, 0x89, 0x5, 0x87, - 0x40, 0xf9, 0xb, 0x6, 0x84, 0xf8, 0x10, + 0xf9, 0x10, 0xff, 0xe3, 0xa4, 0x42, 0x1d, 0xe, + 0x90, 0x79, 0x3, 0x87, 0xc8, 0x7f, 0xb1, 0x14, + 0xf, 0x10, 0xd0, 0x83, 0x92, 0x14, 0x68, 0x87, + 0xa0, 0x46, 0x12, 0x14, 0x12, 0x24, 0x1f, 0xd0, + 0x3e, 0x82, 0xc1, 0xa1, 0x36, 0x8, /* U+0027 "'" */ 0xf0, 0x7f, 0xf1, 0x0, /* U+0028 "(" */ - 0xf, 0xf6, 0x1b, 0xc, 0x90, 0x50, 0x82, 0x20, - 0x91, 0xc, 0x84, 0x98, 0x58, 0x72, 0x21, 0xff, - 0xd7, 0x42, 0x43, 0xb3, 0x9, 0x10, 0xc8, 0x74, - 0x41, 0x94, 0x1a, 0x30, 0xd8, 0x86, 0xd0, + 0xf, 0xf6, 0x1b, 0xd, 0x10, 0x4b, 0x2, 0x30, + 0x91, 0x2, 0x21, 0x66, 0x1f, 0xc8, 0x87, 0xff, + 0x55, 0x10, 0xfe, 0xcc, 0x24, 0x43, 0x21, 0xd1, + 0x6, 0x50, 0x68, 0xc3, 0x62, 0x1b, 0x40, /* U+0029 ")" */ 0xf, 0xd8, 0x7d, 0x87, 0x64, 0x1c, 0xa0, 0xec, - 0x83, 0x22, 0x1c, 0x88, 0x6c, 0xc3, 0xc8, 0x64, - 0x3f, 0xfc, 0x88, 0x86, 0xcc, 0x32, 0x21, 0xc8, - 0x68, 0x83, 0x28, 0x34, 0x41, 0x9c, 0x3b, 0xe, + 0x83, 0x22, 0x1c, 0x88, 0x6c, 0xc3, 0x22, 0x1f, + 0xfe, 0x94, 0x43, 0x66, 0x19, 0x10, 0xe4, 0x34, + 0x41, 0x94, 0x1a, 0x20, 0xcc, 0x1d, 0xa1, 0x80, /* U+002A "*" */ 0xe, 0xf0, 0x7f, 0xf4, 0xae, 0xc, 0xf0, 0x67, 0x7, 0x8, 0x2e, 0xd, 0x78, 0x32, 0x19, 0xf, - 0x65, 0xc, 0x3a, 0x17, 0x8, 0x69, 0x81, 0x28, + 0x65, 0x8, 0x3a, 0x17, 0xc1, 0xa6, 0x4, 0xa0, 0x0, /* U+002B "+" */ - 0xd, 0xe0, 0xff, 0xf5, 0x7e, 0x7, 0xe0, 0xff, - 0x7e, 0x7, 0xe0, 0xff, 0xee, 0x0, + 0xd, 0xe0, 0xff, 0xf0, 0x7e, 0x7, 0xe0, 0xff, + 0x7e, 0x7, 0xe0, 0xff, 0xf0, 0x28, 0x30, /* U+002C "," */ 0x7, 0x83, 0xff, 0x80, 0x88, 0x33, 0x9, 0x40, @@ -97,7 +96,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xfe, 0xe, /* U+002E "." */ - 0xa0, 0xa1, 0x0, + 0x76, 0x24, 0x80, /* U+002F "/" */ 0xf, 0x78, 0x3f, 0x21, 0xe4, 0xc3, 0xd0, 0x87, @@ -107,71 +106,70 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x83, 0xe5, 0x7, 0x80, /* U+0030 "0" */ - 0x3, 0xf4, 0x1a, 0x81, 0x38, 0x14, 0x7c, 0x4, - 0xc8, 0x28, 0xc4, 0x42, 0x44, 0x3f, 0xff, 0xa8, - 0x7c, 0x98, 0x48, 0x98, 0x85, 0x18, 0xa3, 0xe1, - 0x40, 0xa0, 0x4c, 0x0, + 0x5, 0xf4, 0x1a, 0x42, 0x70, 0x28, 0xf8, 0x9, + 0x90, 0x51, 0x88, 0x84, 0x88, 0x7f, 0xff, 0x50, + 0xf9, 0x30, 0x91, 0x21, 0xa, 0x30, 0x27, 0xc2, + 0x81, 0x21, 0x30, 0x0, /* U+0031 "1" */ 0xc, 0xe1, 0x5c, 0x7, 0x43, 0x65, 0x85, 0x68, 0x7f, 0xff, 0xc3, 0xff, 0x82, /* U+0032 "2" */ - 0x3, 0xf4, 0x1a, 0x81, 0x38, 0x14, 0x7c, 0x8, - 0x88, 0x2c, 0x42, 0x43, 0xef, 0x7, 0xff, 0x9, - 0x10, 0xfa, 0x30, 0xf4, 0x28, 0x39, 0x44, 0x1e, - 0x88, 0x3d, 0x8a, 0xe, 0x81, 0x7, 0x28, 0xc3, - 0x98, 0x83, 0xd0, 0x2f, 0xf0, 0x7f, 0x80, + 0x3, 0xf4, 0x1a, 0x81, 0x38, 0x14, 0x7c, 0x91, + 0x10, 0x50, 0x84, 0x87, 0xde, 0xf, 0xfe, 0x12, + 0x21, 0xf4, 0x61, 0xe8, 0x8, 0x72, 0x8c, 0x3d, + 0x10, 0x7b, 0x14, 0x1d, 0x2, 0xe, 0x51, 0x87, + 0x31, 0x7, 0xa0, 0x5f, 0xe0, 0xff, 0x0, /* U+0033 "3" */ 0x5, 0xf4, 0x16, 0x84, 0xe4, 0xf, 0x92, 0x48, - 0x28, 0x68, 0x87, 0x94, 0x19, 0xf, 0xd1, 0x5, - 0xf0, 0xa0, 0xff, 0xe0, 0x7a, 0x14, 0x1c, 0xc4, - 0x1e, 0x41, 0x40, 0xf9, 0x60, 0x90, 0x24, 0x14, - 0x50, 0x1f, 0x1, 0x34, 0x27, 0x0, + 0x28, 0x5c, 0x1e, 0xa0, 0x7f, 0xf0, 0x61, 0x9, + 0x52, 0x40, 0x68, 0x98, 0x4d, 0x13, 0xc, 0xa9, + 0x20, 0xf4, 0x34, 0xf, 0x94, 0x19, 0x2, 0x61, + 0x43, 0x3, 0xe0, 0x46, 0x84, 0xe0, /* U+0034 "4" */ - 0xe, 0x7c, 0x1f, 0x41, 0xf9, 0xf, 0xe8, 0x3f, - 0x24, 0x1f, 0x42, 0x1e, 0x48, 0x3e, 0x84, 0x3c, - 0x90, 0x7d, 0x8, 0x79, 0x20, 0xfa, 0x2f, 0x81, - 0xe0, 0xff, 0x7f, 0x81, 0xe0, 0xff, 0xe9, 0x0, + 0xf, 0x3e, 0xf, 0xd0, 0x7f, 0x21, 0xfe, 0x83, + 0xfa, 0x20, 0xfc, 0x88, 0x7d, 0x10, 0x7e, 0x58, + 0x3e, 0xc8, 0x3e, 0x44, 0x3f, 0x44, 0x1f, 0x20, + 0xfc, 0xf, 0x83, 0xfd, 0x7f, 0x81, 0xe0, 0xff, + 0xea, 0x80, /* U+0035 "5" */ 0x7, 0xfd, 0x7, 0xfb, 0xe, 0xfe, 0x43, 0xff, - 0x86, 0x87, 0xe4, 0x3f, 0xf8, 0x37, 0xa0, 0xf2, - 0x80, 0xe1, 0x9b, 0xe0, 0x40, 0x64, 0x28, 0x43, - 0xf2, 0x1f, 0xfc, 0x3a, 0x7, 0xf2, 0x83, 0x21, - 0x92, 0xa, 0x20, 0x43, 0xf0, 0x10, 0xb4, 0x27, - 0x0, + 0x86, 0x87, 0xe4, 0x3f, 0xf8, 0xf, 0xd0, 0x7f, + 0x9c, 0x33, 0x7c, 0x8, 0xc, 0x85, 0x8, 0x7e, + 0x43, 0xff, 0x87, 0x40, 0xfe, 0x50, 0x64, 0x32, + 0x41, 0x44, 0x8, 0x7e, 0x2, 0x16, 0x84, 0xe0, /* U+0036 "6" */ 0x9, 0xbc, 0x1d, 0x44, 0x3c, 0xa2, 0xf0, 0x68, - 0xd0, 0xe4, 0x83, 0xec, 0x55, 0x10, 0x93, 0x95, - 0x40, 0xeb, 0x85, 0x4, 0xa1, 0x46, 0x14, 0x14, - 0x21, 0xff, 0xcb, 0x43, 0xe4, 0xc2, 0x44, 0x85, - 0x2, 0x30, 0x45, 0xe1, 0x40, 0x60, 0x98, 0x0, + 0xd0, 0xe4, 0x43, 0xec, 0xda, 0x21, 0x25, 0x15, + 0x40, 0xeb, 0x85, 0x5, 0x23, 0x18, 0x48, 0x48, + 0x87, 0xff, 0x2d, 0xf, 0x93, 0x9, 0x12, 0x14, + 0x8, 0xc1, 0x17, 0x80, 0x81, 0x82, 0x70, 0x0, /* U+0037 "7" */ 0xff, 0xf0, 0x7f, 0xbf, 0xe4, 0x43, 0xe4, 0x83, 0xc8, 0x7f, 0x64, 0x1f, 0x22, 0x1e, 0x44, 0x3e, 0x88, 0x3c, 0x87, 0xf6, 0x41, 0xf2, 0x21, 0xe4, - 0x43, 0xe8, 0xc3, 0xc8, 0x10, 0xf6, 0x21, 0xf2, - 0x41, 0xc0, + 0x43, 0xe8, 0xc3, 0xf9, 0xf, 0x42, 0x1f, 0x24, + 0x1c, /* U+0038 "8" */ - 0x5, 0xf4, 0x1b, 0x42, 0x70, 0x40, 0xf8, 0x10, - 0x90, 0x50, 0x84, 0x84, 0x87, 0x21, 0x21, 0x44, - 0x14, 0x43, 0x1f, 0x12, 0xc, 0x3b, 0x2, 0x8f, - 0x85, 0x11, 0x5, 0x10, 0x48, 0x48, 0x7f, 0xf0, - 0xd0, 0xf9, 0x20, 0xb1, 0x20, 0x7c, 0x8, 0x1a, - 0x13, 0x80, + 0x5, 0xf4, 0x1b, 0x42, 0x70, 0x43, 0xf2, 0x42, + 0x41, 0x42, 0x1f, 0xf2, 0x21, 0x22, 0x45, 0x1a, + 0x10, 0x31, 0x93, 0xb, 0x19, 0x30, 0x23, 0x32, + 0x44, 0x41, 0x42, 0x1f, 0xfc, 0xb4, 0x24, 0x28, + 0x82, 0x84, 0x41, 0xf0, 0x20, 0x68, 0x4e, 0x0, /* U+0039 "9" */ 0x5, 0xf2, 0x1a, 0x42, 0xa0, 0x14, 0x7c, 0x20, 0xc8, 0x24, 0x84, 0x42, 0x84, 0x3f, 0xf9, 0x68, 0x7d, 0x10, 0x58, 0x48, 0x3e, 0xe, 0xd0, 0x38, - 0x75, 0xe8, 0x8, 0x7d, 0x7, 0xf2, 0x41, 0xec, - 0x43, 0x5e, 0x18, 0x32, 0x34, 0x8, + 0x75, 0xe8, 0x3f, 0xc8, 0x87, 0xd1, 0x7, 0xb1, + 0xd, 0x78, 0x60, 0xc8, 0xd0, 0x20, /* U+003A ":" */ 0xb1, 0x2, 0x8a, 0x7, 0xff, 0x1e, 0x82, 0x84, @@ -183,7 +181,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+003C "<" */ 0xf, 0xa0, 0xeb, 0x42, 0x74, 0x47, 0x87, 0xb8, - 0x78, 0x33, 0x6, 0x47, 0x42, 0xb4, 0xb4, 0x2b, + 0x78, 0x33, 0x6, 0x87, 0x42, 0x74, 0xb4, 0x2b, 0x4b, 0xd, 0x40, 0xf9, 0xe0, /* U+003D "=" */ @@ -196,51 +194,51 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x50, 0xe0, 0x5a, 0x1a, 0xd0, 0xd6, 0x87, 0x80, /* U+003F "?" */ - 0x5, 0xf2, 0x16, 0x85, 0x24, 0x3e, 0x48, 0x48, - 0x10, 0x5e, 0xf, 0xfe, 0x4e, 0x21, 0xd0, 0x20, - 0xe4, 0xc3, 0xa1, 0xf, 0x24, 0x1f, 0xfc, 0x3f, + 0x5, 0xf2, 0x16, 0x85, 0x26, 0x3e, 0x48, 0x28, + 0x10, 0x5e, 0xf, 0xfe, 0x4c, 0x21, 0xca, 0x20, + 0xe8, 0xc3, 0xa2, 0xf, 0x22, 0x1f, 0xfc, 0x3f, 0x7, 0xff, 0x12, 0x81, 0xf2, 0x83, 0xf2, 0x18, /* U+0040 "@" */ 0xe, 0x7f, 0x48, 0x7e, 0xe0, 0xcd, 0x3, 0xd8, - 0xff, 0x4c, 0x1b, 0x18, 0x39, 0xd4, 0x8, 0x10, - 0x7e, 0xa0, 0x13, 0x3, 0xf2, 0x4, 0x8, 0x74, - 0x14, 0x81, 0x58, 0x83, 0x2e, 0x30, 0x79, 0x31, - 0x14, 0x66, 0x12, 0x4, 0xcc, 0x3e, 0x43, 0x91, - 0xf, 0xfe, 0x32, 0x21, 0xff, 0xc6, 0x42, 0x43, - 0xfe, 0xd4, 0x1c, 0x90, 0x11, 0x50, 0x32, 0x2d, - 0x45, 0xc9, 0x8, 0xa0, 0x72, 0x6, 0xc, 0x97, - 0x81, 0x7a, 0xa, 0x20, 0xff, 0xe0, 0xa8, 0xd0, - 0xc8, 0x7d, 0x25, 0xfa, 0x43, 0xeb, 0x43, 0x48, - 0x60, + 0xff, 0x4c, 0x1b, 0x18, 0x39, 0xd4, 0x4, 0x10, + 0x7e, 0xa0, 0x23, 0xa, 0xf4, 0x4, 0x50, 0x74, + 0x81, 0x80, 0xf8, 0x40, 0xb7, 0x83, 0x62, 0x60, + 0xc8, 0x3e, 0x40, 0x81, 0xf, 0xc8, 0x7c, 0x86, + 0xc3, 0xf2, 0x61, 0xff, 0xc6, 0x43, 0x21, 0xfe, + 0xc4, 0x1a, 0x4, 0x48, 0x8, 0x81, 0xd3, 0xd, + 0xe4, 0x9d, 0x58, 0x83, 0x3, 0x42, 0x61, 0x2, + 0xf, 0x43, 0xe8, 0x28, 0x83, 0xff, 0x82, 0xa3, + 0x43, 0xff, 0x81, 0x25, 0xfd, 0x7, 0xd6, 0x86, + 0xa0, 0x60, /* U+0041 "A" */ - 0xf, 0x78, 0x3f, 0xe4, 0x8, 0x7f, 0xa0, 0x61, - 0xff, 0xc1, 0x43, 0xf9, 0x14, 0x21, 0xfa, 0x2c, - 0xc3, 0xfe, 0x44, 0x3e, 0x44, 0x32, 0x1e, 0x8c, - 0x11, 0x87, 0xe4, 0x8, 0x87, 0x21, 0xff, 0xc1, - 0xc1, 0xf8, 0x10, 0x64, 0x3f, 0x21, 0x20, 0xff, - 0x7, 0x62, 0x1e, 0x48, 0x9, 0x7, 0xb1, 0x10, - 0xfe, 0x42, + 0xf, 0x5a, 0x1f, 0xf2, 0x41, 0xfe, 0x43, 0xff, + 0x83, 0x84, 0x87, 0xf2, 0x66, 0x1f, 0x91, 0x2, + 0x1f, 0xa3, 0x10, 0xff, 0x93, 0x10, 0xf2, 0x20, + 0x48, 0x3d, 0x18, 0x7f, 0xf0, 0x50, 0x91, 0xd, + 0x3, 0xf2, 0x61, 0x90, 0xfc, 0x87, 0xbf, 0xc1, + 0xd0, 0x87, 0x91, 0x2, 0x61, 0xec, 0x83, 0x21, + 0xe4, 0x20, /* U+0042 "B" */ - 0xff, 0x41, 0xfc, 0xe8, 0x5f, 0x92, 0xf, 0xa0, - 0xff, 0xe8, 0xc2, 0x17, 0xe5, 0x41, 0xf9, 0xd, - 0xfa, 0x30, 0xf9, 0x88, 0x3e, 0x44, 0x3f, 0xf8, - 0xa8, 0x7f, 0x42, 0xf, 0xe0, 0x41, 0xf3, 0x80, + 0xff, 0x48, 0x7e, 0x64, 0x2f, 0xc9, 0x7, 0xd0, + 0x7f, 0xf4, 0x61, 0xb, 0xf2, 0xa0, 0xfc, 0xa0, + 0xbf, 0x44, 0x87, 0x98, 0xc3, 0xe4, 0x43, 0xff, + 0x8a, 0x87, 0xf4, 0x20, 0xfe, 0x4, 0x1f, 0x38, /* U+0043 "C" */ 0xa, 0xfc, 0x86, 0xd0, 0xd4, 0x6, 0x3f, 0x85, 0x81, 0x6, 0x8f, 0x10, 0x72, 0x28, 0x43, 0xca, 0xf, 0xea, 0x7, 0xff, 0xa5, 0x61, 0xf, 0x53, 0x20, 0xe4, 0x50, 0x20, 0xd1, 0x98, 0xfe, 0x14, - 0xd, 0x9, 0xa0, + 0xd, 0xd, 0x40, /* U+0044 "D" */ 0xff, 0x41, 0xfe, 0x70, 0xef, 0xc9, 0x87, 0xe9, 0x10, 0xfd, 0x90, 0x7e, 0x43, 0xff, 0xfe, 0x21, - 0xfe, 0x88, 0x3e, 0x80, 0x85, 0xf9, 0x30, 0xfd, - 0x61, 0x0, + 0xfe, 0x88, 0x3e, 0x80, 0x85, 0xf9, 0x30, 0xfc, + 0xe1, 0x0, /* U+0045 "E" */ 0xff, 0xe0, 0xff, 0xbf, 0xe0, 0xff, 0xed, 0x7f, @@ -252,11 +250,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x83, 0xff, 0x81, 0xfe, 0xf, 0xff, 0x58, /* U+0047 "G" */ - 0xa, 0xfc, 0x84, 0xe8, 0x6a, 0x2, 0x2f, 0xa1, - 0x61, 0x41, 0x31, 0x43, 0xe, 0x43, 0x21, 0xef, - 0x7, 0xff, 0x43, 0xf8, 0x39, 0xf, 0xf3, 0xf0, - 0x7f, 0xf0, 0x51, 0xf, 0xd9, 0x7, 0xe4, 0x10, - 0x68, 0x2c, 0x7f, 0x24, 0xd, 0xc, 0xe8, + 0xa, 0xfc, 0x86, 0x74, 0x35, 0x85, 0x17, 0xe0, + 0x42, 0x28, 0x34, 0x24, 0x61, 0xc8, 0x72, 0x1e, + 0xf0, 0x7f, 0xf4, 0xff, 0x83, 0xff, 0x8f, 0xf0, + 0x7f, 0xf0, 0xd1, 0xf, 0xec, 0x83, 0xf9, 0x4, + 0x1a, 0xd, 0x8f, 0xe4, 0x82, 0xd0, 0xce, 0x80, /* U+0048 "H" */ 0xf0, 0x7d, 0xe0, 0xff, 0xff, 0xff, 0xc1, 0xff, @@ -273,8 +271,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+004B "K" */ 0xf0, 0x73, 0xe4, 0x3f, 0x42, 0x83, 0xe8, 0x10, 0x7c, 0xa3, 0xf, 0xd1, 0x7, 0xec, 0x50, 0x7d, - 0x2, 0xf, 0x94, 0x41, 0xfa, 0x4, 0x1f, 0xc8, - 0x10, 0xf9, 0xa1, 0x7, 0xd0, 0x82, 0xf, 0xec, + 0x2, 0xf, 0x94, 0x41, 0xfa, 0x6, 0x1f, 0xc8, + 0xa0, 0xf9, 0xa1, 0x7, 0xd0, 0x82, 0xf, 0xec, 0x50, 0x7f, 0x24, 0x1f, 0xd0, 0x20, 0xfe, 0x84, 0x3f, 0x90, 0x60, @@ -284,59 +282,58 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+004D "M" */ 0xf8, 0x3f, 0x7c, 0x19, 0xf, 0xfe, 0x16, 0x1e, - 0x43, 0xe4, 0x3d, 0x87, 0xff, 0x9, 0xf, 0x42, - 0x19, 0x20, 0xe4, 0x83, 0x62, 0x1e, 0x43, 0x90, - 0xfd, 0x88, 0x11, 0xf, 0x93, 0x6, 0x41, 0xfc, - 0x81, 0xf, 0xf4, 0x20, 0x43, 0xf9, 0x34, 0xc3, - 0xfe, 0x61, 0xf, 0xf2, 0x4, 0x3f, 0xe8, 0x18, - 0x7f, 0xf0, 0x90, 0xf0, + 0x43, 0xe4, 0x3d, 0x7, 0xff, 0x25, 0x20, 0xc8, + 0x87, 0x42, 0x1b, 0x30, 0xff, 0xe0, 0x22, 0x1e, + 0x44, 0x8, 0x87, 0xd1, 0x83, 0x30, 0xfe, 0x40, + 0x88, 0x7e, 0x44, 0x8, 0x7f, 0x47, 0x18, 0x7f, + 0xca, 0x10, 0xff, 0x20, 0x43, 0xfe, 0x81, 0x87, + 0xff, 0x9, 0xf, 0x0, /* U+004E "N" */ 0xf2, 0x1e, 0xf0, 0x50, 0x7f, 0xf0, 0x10, 0xff, 0xa0, 0xff, 0x22, 0x1f, 0xd1, 0x7, 0xf9, 0x20, - 0xfe, 0x84, 0x3f, 0xd1, 0x7, 0xf2, 0x21, 0xfe, + 0xfe, 0x84, 0x3f, 0xc9, 0x7, 0xf4, 0x21, 0xfe, 0x88, 0x3f, 0x91, 0xf, 0xf4, 0x41, 0xfc, 0x88, 0x7f, 0xa0, 0xff, 0x90, 0xff, 0xe0, 0x41, 0x0, /* U+004F "O" */ 0xa, 0xfa, 0xf, 0x68, 0x4e, 0x85, 0x8f, 0xd1, - 0x1, 0x4, 0x12, 0x88, 0xc8, 0x3b, 0x11, 0x10, - 0xe4, 0x3f, 0xff, 0xe0, 0x43, 0x90, 0xa2, 0xe, - 0xc4, 0x41, 0x4, 0xa2, 0x4, 0x3f, 0x44, 0x13, - 0xa1, 0x3a, 0x0, + 0x1, 0x18, 0x25, 0x11, 0x98, 0x76, 0x22, 0x21, + 0xc8, 0x7f, 0xff, 0xd1, 0xe, 0x42, 0xc8, 0x3b, + 0x11, 0x4, 0x12, 0x88, 0x18, 0xfd, 0x10, 0x6d, + 0x9, 0xd0, 0x0, /* U+0050 "P" */ 0xff, 0xa0, 0xff, 0x38, 0x6f, 0xe0, 0x41, 0xfa, - 0x10, 0xfc, 0x87, 0xff, 0x25, 0xf, 0xf4, 0x21, - 0x7f, 0x2, 0xf, 0xce, 0x1b, 0xfa, 0xf, 0xff, - 0xc8, + 0x10, 0xfc, 0x87, 0xff, 0x53, 0x10, 0xbf, 0x81, + 0x7, 0xe7, 0xd, 0xfd, 0x7, 0xff, 0xe4, /* U+0051 "Q" */ 0xa, 0xfa, 0xf, 0x68, 0x4e, 0x85, 0x8f, 0xd1, - 0x1, 0x4, 0x12, 0x88, 0xc8, 0x3b, 0x11, 0x10, - 0xe4, 0x3f, 0xff, 0xe0, 0x43, 0x90, 0xa2, 0xe, - 0xc4, 0x41, 0x4, 0xa2, 0x4, 0x3f, 0x44, 0x13, - 0xa1, 0xff, 0x5f, 0x45, 0x3, 0xf3, 0x8, 0x7f, - 0x36, 0x0, + 0x1, 0x18, 0x25, 0x11, 0x98, 0x76, 0x22, 0x21, + 0xc8, 0x7f, 0xff, 0xd1, 0xe, 0x42, 0xc8, 0x3b, + 0x11, 0x4, 0x12, 0x88, 0x18, 0xfd, 0x10, 0x6d, + 0xf, 0xfa, 0xfa, 0x28, 0x1f, 0x98, 0x43, 0xf9, + 0xb0, /* U+0052 "R" */ 0xff, 0x90, 0xff, 0x58, 0x6f, 0xe0, 0x41, 0xfa, - 0x10, 0xfc, 0x87, 0xff, 0x25, 0xf, 0xe6, 0x20, - 0xbf, 0x42, 0x83, 0xf3, 0x6, 0xf9, 0x10, 0xfd, - 0x7, 0xfc, 0x90, 0x7e, 0x84, 0x3f, 0x92, 0xf, - 0xd8, 0x87, 0xe4, 0x8, + 0x10, 0xfc, 0x87, 0xff, 0x25, 0xf, 0xf4, 0x41, + 0x7f, 0xa, 0xf, 0xcc, 0x1b, 0xe4, 0x43, 0xf4, + 0x1f, 0xf2, 0x41, 0xfa, 0x10, 0xff, 0xa0, 0xfd, + 0x8, 0x7e, 0x40, 0x80, /* U+0053 "S" */ 0xa, 0xfa, 0xe, 0xd0, 0x9c, 0x28, 0x7e, 0x2, - 0x4, 0x82, 0x88, 0x3f, 0x21, 0xe4, 0x37, 0x80, - 0x90, 0x7e, 0x81, 0xc8, 0x7b, 0x46, 0xc3, 0xd6, - 0x83, 0xf, 0xac, 0x10, 0x7e, 0xc4, 0xf0, 0x7f, - 0xc8, 0x7e, 0x89, 0xa, 0x11, 0x45, 0xf2, 0x40, - 0xa2, 0x13, 0x80, + 0x4, 0x82, 0xc8, 0x3f, 0xf9, 0x1e, 0x2, 0x61, + 0xfa, 0x7, 0x21, 0xed, 0x1b, 0xf, 0x5a, 0xc, + 0x3e, 0xb0, 0x41, 0xfb, 0x13, 0xc1, 0xff, 0x21, + 0xfa, 0x20, 0xd0, 0x8a, 0x3f, 0x24, 0xa, 0x21, + 0x38, 0x0, /* U+0054 "T" */ - 0xff, 0xf8, 0x3f, 0xef, 0xe0, 0x7e, 0xf, 0xff, - 0xf8, 0x7f, 0xff, 0xc3, 0x0, + 0xbf, 0xfd, 0x61, 0xfe, 0xdf, 0xc0, 0xfc, 0x87, + 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xff, 0xc6, /* U+0055 "U" */ 0xf0, 0x7b, 0xc1, 0xff, 0xff, 0xf, 0xff, 0x82, @@ -346,10 +343,10 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0056 "V" */ 0x7c, 0x1f, 0x5e, 0x40, 0x87, 0x91, 0x13, 0xf, 0xd1, 0x88, 0x72, 0x19, 0xf, 0xb1, 0xe, 0x43, - 0x26, 0x14, 0x61, 0xe4, 0x24, 0x42, 0x84, 0x3f, - 0xc9, 0x87, 0x24, 0x19, 0xe, 0x84, 0x44, 0x3f, - 0xd9, 0x87, 0xc8, 0xa1, 0xf, 0xb2, 0xf, 0xf2, - 0x14, 0x1f, 0xc8, 0x10, 0xfe, 0xc3, 0xe0, + 0x26, 0x14, 0x61, 0xe4, 0x24, 0x42, 0x84, 0x3e, + 0x40, 0x98, 0x72, 0x61, 0x90, 0xe8, 0x44, 0x43, + 0xfd, 0x98, 0x7c, 0x8a, 0x10, 0xfb, 0x20, 0xff, + 0x21, 0x41, 0xfc, 0x81, 0xf, 0xec, 0x3e, /* U+0057 "W" */ 0x3c, 0x1d, 0x68, 0x6b, 0x82, 0x43, 0x26, 0x19, @@ -357,10 +354,10 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc8, 0x58, 0x86, 0x43, 0x21, 0xc9, 0x88, 0x64, 0x3f, 0x94, 0x60, 0xcc, 0x24, 0x44, 0xc0, 0x81, 0x10, 0xb3, 0x31, 0x10, 0xff, 0xe0, 0xa1, 0x62, - 0x1f, 0x22, 0x4, 0x9, 0xa2, 0x1f, 0x26, 0x1d, - 0x98, 0x72, 0x62, 0x12, 0x80, 0x87, 0x62, 0x1d, - 0x88, 0x7f, 0xf3, 0x50, 0x21, 0x90, 0x21, 0xfd, - 0x87, 0xd8, 0x40, + 0x1f, 0x22, 0x4, 0x9, 0xa2, 0x1f, 0x26, 0x19, + 0xcc, 0x39, 0x31, 0x9, 0x9, 0xe, 0xc4, 0x3b, + 0x10, 0xff, 0xe6, 0xa0, 0x43, 0x20, 0x43, 0xfb, + 0xf, 0xb0, 0x80, /* U+0058 "X" */ 0x3d, 0x7, 0x3e, 0x4, 0x21, 0xd0, 0x81, 0x4, @@ -379,11 +376,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xfe, 0x0, /* U+005A "Z" */ - 0xff, 0xf0, 0x7f, 0xbf, 0xe0, 0x41, 0xe4, 0x8, - 0x7a, 0x20, 0xf2, 0x4, 0x3d, 0x18, 0x7a, 0x10, - 0xf9, 0x20, 0xf4, 0x21, 0xe5, 0x10, 0x7a, 0x20, - 0xf2, 0x4, 0x3d, 0x10, 0x7a, 0x14, 0x1e, 0x47, - 0xfe, 0xf, 0xf0, + 0xff, 0xf0, 0x7f, 0xf0, 0x3f, 0xe0, 0x41, 0xf2, + 0x4, 0x3e, 0x88, 0x3e, 0x40, 0x87, 0xd1, 0x87, + 0xd0, 0x87, 0xe4, 0x83, 0xe8, 0x43, 0xe5, 0x10, + 0x7d, 0x10, 0x7c, 0x81, 0xf, 0xa2, 0xf, 0xa0, + 0x21, 0xf2, 0xf, 0xfc, 0x1f, 0xf0, /* U+005B "[" */ 0xfc, 0x1e, 0xf0, 0x7f, 0xff, 0xbc, 0x18, @@ -411,28 +408,28 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x18, 0x39, 0xc2, 0x51, 0x5, 0x28, /* U+0061 "a" */ - 0x5, 0xf2, 0x16, 0x85, 0x43, 0x1f, 0x42, 0x2a, - 0x2, 0x15, 0x3, 0xfa, 0xf8, 0x36, 0x87, 0xa0, - 0x7c, 0x12, 0x61, 0xff, 0xc5, 0x41, 0x5, 0x17, - 0x90, 0x98, 0x2d, 0x10, + 0x5, 0xf2, 0x16, 0x85, 0x26, 0x3e, 0x88, 0x54, + 0x4, 0x2a, 0x7, 0xf5, 0xf0, 0x6d, 0xf, 0x40, + 0xf8, 0x24, 0xc3, 0xff, 0x8a, 0x82, 0xa, 0x2f, + 0x21, 0x30, 0x5a, 0x20, /* U+0062 "b" */ - 0xf0, 0x7f, 0xf9, 0xef, 0x41, 0xda, 0x7, 0xe, - 0xf8, 0x10, 0x58, 0x50, 0x87, 0xc8, 0x7f, 0xf9, - 0x50, 0xe8, 0x28, 0x42, 0x7e, 0x4, 0x16, 0x81, - 0xc0, + 0xf0, 0x7f, 0xf9, 0xef, 0x41, 0xda, 0x7, 0xc, + 0xfc, 0x8, 0x28, 0x28, 0x43, 0xe4, 0x3f, 0xfc, + 0xa8, 0x74, 0x14, 0x21, 0x3f, 0x2, 0xb, 0x40, + 0xe0, /* U+0063 "c" */ - 0x3, 0xf4, 0x1a, 0x81, 0x38, 0x14, 0x7c, 0x91, - 0x90, 0x50, 0x88, 0x86, 0x50, 0x7e, 0xa0, 0x7f, - 0xf4, 0xd1, 0xd, 0xe3, 0x20, 0xa1, 0x10, 0x7c, - 0x90, 0x34, 0x27, 0x0, + 0x5, 0xf4, 0x1b, 0x42, 0x70, 0x20, 0xf9, 0x23, + 0x20, 0xa1, 0x11, 0xc, 0xa0, 0xfd, 0x40, 0xff, + 0xe9, 0xa2, 0x1b, 0xc6, 0x41, 0x42, 0x20, 0xf9, + 0x20, 0x68, 0x4e, 0x0, /* U+0064 "d" */ - 0xf, 0xbc, 0x1f, 0xfd, 0xfb, 0xd0, 0x76, 0x81, - 0xc2, 0x41, 0xf2, 0x16, 0x41, 0x41, 0x22, 0x1f, - 0xfe, 0x34, 0x43, 0xec, 0x82, 0x82, 0x41, 0xf2, - 0x1b, 0x40, 0xe1, 0x0, + 0xf, 0xbc, 0x1f, 0xfd, 0xfb, 0xe0, 0xed, 0xb, + 0x9, 0x7, 0xc8, 0x59, 0x5, 0x4, 0x88, 0x7f, + 0xf8, 0xd1, 0xf, 0xb2, 0xa, 0x9, 0x7, 0xc8, + 0x6d, 0xb, 0x8, /* U+0065 "e" */ 0x3, 0xf4, 0x1a, 0x81, 0x38, 0x14, 0x7c, 0x91, @@ -441,50 +438,50 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x41, 0xf8, 0x37, 0x6, 0xa0, /* U+0066 "f" */ - 0x9, 0xf2, 0xa, 0x7, 0x25, 0xa1, 0x90, 0xfe, - 0xf0, 0x3c, 0x1f, 0xbc, 0xf, 0x7, 0xff, 0xec, + 0x9, 0xf8, 0xc, 0x1d, 0xf, 0x83, 0x41, 0xfd, + 0x60, 0xf1, 0x87, 0x9c, 0x1e, 0xf, 0xff, 0xd8, /* U+0067 "g" */ - 0x5, 0xe8, 0xf0, 0x34, 0xe, 0x12, 0xf, 0x90, - 0xa2, 0xa, 0xe, 0x43, 0xff, 0xc6, 0x88, 0x7d, - 0x90, 0x50, 0x48, 0x3e, 0x43, 0x68, 0x1c, 0x3a, - 0xf4, 0x1f, 0xfc, 0x39, 0xa, 0x10, 0x37, 0xc9, - 0x3, 0x42, 0x70, 0x0, + 0x5, 0xf1, 0xe0, 0x68, 0x58, 0x48, 0x3e, 0x42, + 0x88, 0x28, 0x39, 0xf, 0xff, 0x1a, 0x21, 0xf6, + 0x41, 0x41, 0x20, 0xf9, 0xd, 0xa1, 0x61, 0xd7, + 0xc1, 0xff, 0xc3, 0x90, 0xa1, 0x3, 0x7c, 0x90, + 0x34, 0x27, 0x0, /* U+0068 "h" */ - 0xf0, 0x7f, 0xf8, 0xaf, 0x41, 0xb4, 0xa, 0xd, - 0xe8, 0x82, 0xc0, 0x87, 0xff, 0xfc, 0x3f, 0x80, + 0xf0, 0x7f, 0xf8, 0xaf, 0x41, 0xb4, 0xa, 0x9, + 0xf4, 0x41, 0x40, 0x43, 0xff, 0xfe, 0x1f, 0xc0, /* U+0069 "i" */ 0xb1, 0x2, 0x8a, 0x1e, 0xf, 0xfe, 0xc8, /* U+006A "j" */ 0x5, 0x84, 0x86, 0x50, 0x54, 0xb, 0xc1, 0xff, - 0xff, 0x1c, 0x43, 0x40, + 0xff, 0x3c, 0x21, 0x30, /* U+006B "k" */ 0xf0, 0x7f, 0xfa, 0x5f, 0x7, 0xd1, 0x7, 0xa1, - 0x41, 0xca, 0x20, 0xe6, 0x30, 0xf4, 0x21, 0xfc, - 0x87, 0xe4, 0x83, 0xdc, 0x28, 0x3e, 0x88, 0x3e, - 0x41, 0x7, 0xd8, 0x87, 0xe4, 0x80, + 0x41, 0xca, 0x20, 0xf4, 0x61, 0xec, 0x43, 0xf9, + 0xf, 0x94, 0x41, 0xea, 0xa, 0xf, 0xa2, 0xf, + 0x90, 0x41, 0xf6, 0x21, 0xf9, 0x20, /* U+006C "l" */ 0xf0, 0x7f, 0xfa, 0x0, /* U+006D "m" */ - 0xf1, 0x7a, 0x7, 0xd0, 0x6d, 0x3, 0x61, 0x28, - 0x27, 0xc8, 0x9e, 0x88, 0x28, 0x10, 0x20, 0x21, - 0xff, 0x21, 0xff, 0xff, 0xf, 0xff, 0x38, + 0xf3, 0xf4, 0xb, 0xe4, 0x28, 0x26, 0xd0, 0xa4, + 0xf, 0x91, 0x3e, 0x4c, 0x10, 0x20, 0x41, 0x42, + 0x1f, 0x90, 0xff, 0xff, 0x87, 0xff, 0x9c, /* U+006E "n" */ 0xf1, 0x7a, 0xd, 0xa0, 0x50, 0x6f, 0x44, 0x16, 0x4, 0x3f, 0xff, 0xe1, 0xfc, /* U+006F "o" */ - 0x3, 0xf9, 0xa, 0x81, 0xa8, 0x28, 0xbd, 0x9, - 0x8a, 0x2, 0x89, 0x30, 0xd8, 0x81, 0xc, 0x87, - 0xff, 0x51, 0x20, 0xc8, 0xe2, 0x82, 0x89, 0x45, - 0xf0, 0x82, 0x81, 0xa8, 0x0, + 0x3, 0xf9, 0xa, 0x81, 0xa8, 0x4, 0xbd, 0x9, + 0xa, 0x2, 0x89, 0x20, 0xd0, 0x87, 0xff, 0x71, + 0x20, 0xc8, 0xc2, 0x82, 0x88, 0x4b, 0xe1, 0x5, + 0x3, 0x50, /* U+0070 "p" */ 0xf1, 0x7a, 0xe, 0xd0, 0x38, 0x67, 0xe0, 0x41, @@ -493,75 +490,76 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x7, 0xff, 0x7c, /* U+0071 "q" */ - 0x5, 0xf1, 0xe0, 0x68, 0x58, 0x48, 0x3e, 0x42, + 0x5, 0xf3, 0xe0, 0x68, 0x50, 0x48, 0x3e, 0x42, 0x88, 0x28, 0x39, 0xf, 0xff, 0x1a, 0x21, 0xf6, 0x41, 0x41, 0x20, 0xf9, 0xd, 0xa1, 0x61, 0xd7, 0xc1, 0xff, 0xe0, /* U+0072 "r" */ - 0xe, 0xf3, 0xe0, 0x41, 0x9f, 0x2, 0xf, 0xff, - 0x18, + 0xf3, 0xe0, 0x41, 0x9f, 0x2, 0xf, 0xff, 0x18, /* U+0073 "s" */ - 0x5, 0xf4, 0x1b, 0x42, 0x74, 0xc7, 0xe4, 0x82, - 0x82, 0x83, 0xa0, 0xde, 0x21, 0xe0, 0xe7, 0x47, + 0x5, 0xf4, 0x13, 0xa1, 0x3a, 0x43, 0xf2, 0x41, + 0x41, 0x41, 0xd0, 0x6f, 0x18, 0xf0, 0x7b, 0x47, 0x83, 0xae, 0x1d, 0xe, 0x74, 0x8f, 0x6, 0x82, - 0x48, 0x24, 0x28, 0x7e, 0x88, 0x1a, 0x13, 0xa0, + 0x48, 0x24, 0x28, 0x7e, 0x88, 0x1a, 0x13, 0x20, /* U+0074 "t" */ 0x7, 0x83, 0xff, 0x85, 0xe0, 0x78, 0x3d, 0xe0, - 0x78, 0x3f, 0xfd, 0x1e, 0x6, 0x80, + 0x78, 0x3f, 0xfc, 0xc9, 0xe0, 0x41, 0x0, /* U+0075 "u" */ - 0xf0, 0x6f, 0x7, 0xff, 0xfc, 0x3e, 0x48, 0x10, - 0x58, 0xf9, 0x9, 0x82, 0xc2, + 0xf0, 0x77, 0x83, 0xff, 0xfe, 0x12, 0x4, 0x82, + 0x81, 0xf, 0xc1, 0xa0, 0x9c, 0x0, /* U+0076 "v" */ 0x7c, 0x1a, 0xe4, 0x3c, 0x90, 0x88, 0x7d, 0x98, 0x11, 0x2, 0x20, 0xcc, 0x3e, 0x44, 0x24, 0x43, - 0xec, 0xd2, 0xc, 0x8e, 0x21, 0xc8, 0x87, 0xd8, + 0xec, 0xd1, 0xc, 0x8e, 0x41, 0xc8, 0x87, 0xd8, 0x10, 0xf2, 0xc, 0x3f, 0x90, 0x80, /* U+0077 "w" */ 0x78, 0x37, 0x6, 0xf2, 0x21, 0x22, 0x12, 0x21, - 0xec, 0x8, 0x33, 0x11, 0x2, 0xc, 0x8, 0x99, - 0x84, 0x88, 0x79, 0x11, 0x30, 0xe4, 0x3d, 0x8a, - 0x14, 0x61, 0x22, 0x81, 0x1e, 0x10, 0xb2, 0x10, - 0x94, 0x1c, 0x85, 0x1, 0x2, 0x1f, 0xf6, 0xc, - 0x39, 0x10, 0x90, 0x21, 0xd9, 0x87, 0xf0, + 0xe8, 0x3b, 0x31, 0x10, 0xe4, 0x8, 0x99, 0x88, + 0x98, 0x79, 0x13, 0x21, 0x11, 0xf, 0x20, 0x43, + 0x61, 0x22, 0x26, 0x38, 0x85, 0x91, 0x89, 0xa1, + 0xc8, 0x48, 0x48, 0x87, 0xfd, 0x3, 0xe, 0x44, + 0x24, 0x8, 0x76, 0x61, 0xfc, /* U+0078 "x" */ 0x3c, 0x85, 0xe8, 0x88, 0x8, 0x21, 0xd, 0x10, 0x51, 0x4, 0x84, 0x8e, 0x41, 0xd0, 0x48, 0x72, - 0x8, 0x3c, 0x82, 0xf, 0x42, 0x21, 0x91, 0x88, - 0x34, 0x42, 0x40, 0x84, 0x10, 0x81, 0x20, 0x92, + 0x8, 0x3c, 0x82, 0xf, 0x42, 0x21, 0xa1, 0x88, + 0x32, 0x42, 0x40, 0x84, 0x10, 0x81, 0x20, 0x92, /* U+0079 "y" */ - 0x78, 0x37, 0x94, 0x21, 0xe4, 0x24, 0x8, 0x64, - 0xc1, 0x90, 0x31, 0x2, 0x20, 0x43, 0xfc, 0x8a, - 0x10, 0xd9, 0xe3, 0xc, 0x8a, 0x10, 0xff, 0xe1, - 0xa0, 0x43, 0xd0, 0x20, 0xff, 0xe3, 0x21, 0xf2, - 0x61, 0xf4, 0x21, 0xde, 0x20, 0xfc, 0xa0, 0xe0, + 0x7c, 0x1b, 0xca, 0xf, 0xc8, 0x48, 0x10, 0xc9, + 0x83, 0x10, 0x62, 0x4, 0xc0, 0x87, 0x90, 0x91, + 0x42, 0x1b, 0x3c, 0x61, 0x91, 0x42, 0x1f, 0xfc, + 0x34, 0x8, 0x7a, 0x6, 0x1f, 0xc8, 0x7e, 0x43, + 0xe4, 0xc3, 0xe8, 0x43, 0xbc, 0x21, 0xf9, 0x83, + 0x80, /* U+007A "z" */ - 0xff, 0xc1, 0xfb, 0xf8, 0x10, 0x64, 0x8, 0x68, - 0xc3, 0x42, 0x1c, 0x90, 0x68, 0x83, 0x28, 0x43, - 0x44, 0x19, 0x14, 0x1a, 0x1f, 0xe0, 0xfc, + 0xff, 0xe0, 0xfe, 0xfe, 0xa, 0xc, 0x81, 0x41, + 0xa0, 0x41, 0xa0, 0x41, 0xc8, 0xa0, 0xd0, 0x20, + 0xca, 0x20, 0xe8, 0x50, 0x64, 0x10, 0x74, 0xf, + 0xf0, 0x7f, 0x0, /* U+007B "{" */ - 0xe, 0x43, 0x3c, 0x1a, 0x30, 0xa1, 0xc, 0x90, - 0x7f, 0xf6, 0xa1, 0xb, 0x48, 0x3f, 0xda, 0x41, - 0xa1, 0xf, 0xfe, 0xe2, 0x21, 0xa2, 0xe, 0x8c, - 0x33, 0xc0, + 0xc, 0xc1, 0x51, 0x2, 0x8c, 0x19, 0x4, 0x88, + 0x7f, 0xf5, 0x32, 0x6, 0x28, 0x32, 0x17, 0x10, + 0x48, 0x87, 0xff, 0x59, 0x20, 0xa1, 0x41, 0x64, + 0x1b, 0xc0, /* U+007C "|" */ 0xf0, 0x7f, 0xfb, 0x94, 0x0, /* U+007D "}" */ - 0xf, 0x79, 0xb, 0x20, 0xd1, 0x4, 0x88, 0x7f, - 0xf5, 0x92, 0xa, 0x1c, 0x24, 0x32, 0x8c, 0x11, - 0x7, 0x21, 0xff, 0xce, 0x44, 0x28, 0xc1, 0x8a, - 0x5, 0x41, 0x0, + 0xf, 0x50, 0x36, 0xe1, 0x28, 0x82, 0x84, 0x3f, + 0xfa, 0xc8, 0x85, 0x94, 0x2, 0x84, 0xa, 0x20, + 0x44, 0x86, 0x43, 0xff, 0xa9, 0x8, 0x14, 0x40, + 0xdc, 0x2a, 0x6, /* U+007E "~" */ 0x5, 0x10, 0xca, 0x35, 0x48, 0x55, 0xe, 0xc9, @@ -575,30 +573,29 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+00A3 "£" */ 0xd, 0x7c, 0x1d, 0xa1, 0x61, 0x43, 0xe4, 0x80, 0x90, 0x21, 0xf, 0xd4, 0xf, 0xca, 0xf, 0xfe, - 0x47, 0x81, 0xf0, 0x7f, 0xf0, 0x7c, 0xf, 0x83, - 0xff, 0x98, 0x87, 0xf6, 0x21, 0xed, 0x1f, 0xf0, - 0x7f, 0x80, + 0x47, 0x81, 0xf0, 0x7f, 0x21, 0x78, 0x1e, 0x83, + 0xff, 0xac, 0x88, 0x7b, 0x87, 0xfc, 0x1f, 0xe0, /* U+00B0 "°" */ - 0x5, 0xe8, 0x12, 0x6, 0x1b, 0xd2, 0x4, 0x39, - 0xfa, 0x49, 0x3, 0x0, + 0x5, 0xe8, 0x12, 0x6, 0x1f, 0xa4, 0x3f, 0x3f, + 0x49, 0x20, 0x60, /* U+00B1 "±" */ - 0xd, 0xe0, 0xff, 0xed, 0xfe, 0x7, 0xc1, 0xfd, - 0xf8, 0x1f, 0x7, 0xff, 0x73, 0xc1, 0x7f, 0xe0, - 0xff, 0x0, + 0xd, 0xe0, 0xff, 0xf0, 0x5f, 0x3, 0xeb, 0xf, + 0xdb, 0xf0, 0x3e, 0x43, 0xff, 0xac, 0xa0, 0xfd, + 0x40, 0xef, 0xfc, 0x1f, 0xf0, /* U+00B2 "²" */ - 0x2f, 0x44, 0x81, 0x93, 0xc3, 0xe0, 0x90, 0xb2, - 0x6, 0x40, 0xc9, 0x30, 0x74, 0x9, 0x60, + 0x2f, 0x44, 0xba, 0x4a, 0x3, 0xc1, 0xf6, 0x40, + 0xc8, 0x19, 0x24, 0xe, 0x88, 0x16, /* U+00B3 "³" */ - 0x2f, 0x44, 0x81, 0x87, 0xc3, 0x56, 0x40, 0x40, - 0x83, 0x8e, 0x82, 0x13, 0xe1, 0x90, 0x30, + 0x2f, 0x46, 0xba, 0x6a, 0x4, 0x89, 0x83, 0x84, + 0x1c, 0x51, 0x10, 0x35, 0x3, 0x5d, 0x0, /* U+00B5 "µ" */ - 0xf0, 0x6f, 0x7, 0xff, 0xfd, 0xf, 0xd8, 0x20, - 0xe7, 0xc8, 0x72, 0x8, 0x3a, 0xf3, 0xe0, 0xff, + 0xf0, 0x6f, 0x7, 0xff, 0xfd, 0xf, 0xd8, 0x10, + 0xe7, 0xd0, 0x72, 0x8, 0x3a, 0xf3, 0xe0, 0xff, 0xec, 0x80, /* U+00BF "¿" */ @@ -609,89 +606,90 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x1c, 0x0, /* U+00C0 "À" */ - 0x9, 0xf2, 0x1f, 0xe6, 0x20, 0xff, 0x94, 0x41, - 0xff, 0x53, 0xf, 0xfe, 0x2, 0x83, 0xff, 0x81, - 0xe0, 0xff, 0x90, 0x21, 0xfe, 0x81, 0x87, 0xff, - 0x5, 0xf, 0xe4, 0x50, 0x87, 0xe8, 0xb3, 0xf, - 0xf9, 0x10, 0xf9, 0x10, 0xc8, 0x7a, 0x30, 0x46, - 0x1f, 0x90, 0x22, 0x1c, 0x87, 0xff, 0x7, 0x7, - 0xe0, 0x41, 0x90, 0xfc, 0x84, 0x83, 0xfc, 0x1d, - 0x88, 0x79, 0x20, 0x24, 0x1e, 0xc4, 0x43, 0xf9, - 0x8, + 0xd, 0xe8, 0x3f, 0xec, 0x50, 0x7f, 0xd9, 0x7, + 0xff, 0x3, 0x43, 0xff, 0x83, 0x7, 0xff, 0x2, + 0xd0, 0xff, 0x92, 0xf, 0xf2, 0x1f, 0xfc, 0x1c, + 0x24, 0x3f, 0x93, 0x30, 0xfc, 0x88, 0x10, 0xfd, + 0x18, 0x87, 0xfc, 0x98, 0x87, 0x91, 0x2, 0x41, + 0xe8, 0xc3, 0xff, 0x82, 0x84, 0x88, 0x68, 0x1f, + 0x93, 0xc, 0x87, 0xe4, 0x3d, 0xfe, 0xe, 0x84, + 0x3c, 0x88, 0x13, 0xf, 0x64, 0x19, 0xf, 0x21, + 0x0, /* U+00C1 "Á" */ - 0xf, 0x9f, 0x7, 0xfd, 0x10, 0x7f, 0xa2, 0x43, - 0xfd, 0xc8, 0x7f, 0xca, 0xf, 0xfe, 0x7, 0x83, - 0xfe, 0x40, 0x87, 0xfa, 0x6, 0x1f, 0xfc, 0x14, - 0x3f, 0x91, 0x42, 0x1f, 0xa2, 0xcc, 0x3f, 0xe4, - 0x43, 0xe4, 0x43, 0x21, 0xe8, 0xc1, 0x18, 0x7e, - 0x40, 0x88, 0x72, 0x1f, 0xfc, 0x1c, 0x1f, 0x81, - 0x6, 0x43, 0xf2, 0x12, 0xf, 0xf0, 0x76, 0x21, - 0xe4, 0x80, 0x90, 0x7b, 0x11, 0xf, 0xe4, 0x20, + 0xf, 0xde, 0x43, 0xfc, 0x8a, 0xf, 0xf4, 0x41, + 0xfe, 0x56, 0x1f, 0xf3, 0x7, 0xff, 0x2, 0xd0, + 0xff, 0x92, 0xf, 0xf2, 0x1f, 0xfc, 0x1c, 0x24, + 0x3f, 0x93, 0x30, 0xfc, 0x88, 0x10, 0xfd, 0x18, + 0x87, 0xfc, 0x98, 0x87, 0x91, 0x2, 0x41, 0xe8, + 0xc3, 0xff, 0x82, 0x84, 0x88, 0x68, 0x1f, 0x93, + 0xc, 0x87, 0xe4, 0x3d, 0xfe, 0xe, 0x84, 0x3c, + 0x88, 0x13, 0xf, 0x64, 0x19, 0xf, 0x21, 0x0, /* U+00C2 "Â" */ - 0xf, 0x78, 0x3f, 0xe8, 0x10, 0x7f, 0x2a, 0x8a, - 0xf, 0xe9, 0x50, 0x7f, 0x28, 0xa, 0xf, 0xf7, - 0x83, 0xfe, 0x40, 0x87, 0xfa, 0x6, 0x1f, 0xfc, - 0x14, 0x3f, 0x91, 0x42, 0x1f, 0xa2, 0xcc, 0x3f, - 0xe4, 0x43, 0xe4, 0x43, 0x21, 0xe8, 0xc1, 0x18, - 0x7e, 0x40, 0x88, 0x72, 0x1f, 0xfc, 0x1c, 0x1f, - 0x81, 0x6, 0x43, 0xf2, 0x12, 0xf, 0xf0, 0x76, - 0x21, 0xe4, 0x80, 0x90, 0x7b, 0x11, 0xf, 0xe4, - 0x20, + 0xf, 0x5a, 0x1f, 0xe5, 0x10, 0x7f, 0xa7, 0x20, + 0xfc, 0xa8, 0xf0, 0x7e, 0x60, 0x90, 0xff, 0x5a, + 0x1f, 0xf2, 0x41, 0xfe, 0x43, 0xff, 0x83, 0x84, + 0x87, 0xf2, 0x66, 0x1f, 0x91, 0x2, 0x1f, 0xa3, + 0x10, 0xff, 0x93, 0x10, 0xf2, 0x20, 0x48, 0x3d, + 0x18, 0x7f, 0xf0, 0x50, 0x91, 0xd, 0x3, 0xf2, + 0x61, 0x90, 0xfc, 0x87, 0xbf, 0xc1, 0xd0, 0x87, + 0x91, 0x2, 0x61, 0xec, 0x83, 0x21, 0xe4, 0x20, /* U+00C3 "Ã" */ - 0xf, 0xfe, 0x2f, 0x92, 0xc3, 0xd0, 0x2d, 0x41, - 0xf5, 0xca, 0x83, 0xd2, 0x34, 0xf, 0xeb, 0x83, - 0xfc, 0x88, 0x7f, 0xf2, 0xa0, 0xa0, 0xfc, 0x98, - 0x87, 0xff, 0x22, 0x21, 0x10, 0xf2, 0x26, 0x41, - 0xfe, 0x43, 0xe4, 0x42, 0x44, 0x34, 0x61, 0x64, - 0x1e, 0xbe, 0x83, 0x90, 0xfe, 0x41, 0x17, 0xf4, - 0x61, 0x90, 0xe4, 0x44, 0x3f, 0xe7, 0x20, 0xf9, - 0x30, + 0xf, 0xfe, 0x33, 0xe4, 0xd0, 0xfa, 0x5, 0x88, + 0x79, 0x3c, 0x90, 0x7c, 0xe0, 0xb4, 0x3f, 0xd6, + 0x87, 0xfc, 0x90, 0x7f, 0x90, 0xff, 0xe0, 0xe1, + 0x21, 0xfc, 0x99, 0x87, 0xe4, 0x40, 0x87, 0xe8, + 0xc4, 0x3f, 0xe4, 0xc4, 0x3c, 0x88, 0x12, 0xf, + 0x46, 0x1f, 0xfc, 0x14, 0x24, 0x43, 0x40, 0xfc, + 0x98, 0x64, 0x3f, 0x21, 0xef, 0xf0, 0x74, 0x21, + 0xe4, 0x40, 0x98, 0x7b, 0x20, 0xc8, 0x79, 0x8, /* U+00C4 "Ä" */ - 0xb, 0xc1, 0x78, 0x3f, 0xf8, 0xfe, 0xb, 0xc1, - 0xff, 0xc9, 0xf4, 0x1f, 0xfc, 0x4, 0x3f, 0x90, - 0x90, 0xfd, 0x89, 0x87, 0xe4, 0x84, 0x3e, 0x43, - 0xff, 0x81, 0x90, 0x88, 0x79, 0x12, 0x20, 0xff, - 0xe3, 0x22, 0x12, 0x21, 0xa3, 0xb, 0x30, 0xf5, - 0xf4, 0x21, 0x21, 0xfc, 0x83, 0x1f, 0xe4, 0xc0, - 0x90, 0x76, 0x21, 0xfe, 0x42, 0x84, 0x3e, 0x44, + 0xd, 0xe0, 0xbc, 0x1f, 0xfc, 0x9f, 0x5, 0xe0, + 0xff, 0xe5, 0xfa, 0xf, 0xfe, 0xa, 0x1f, 0xe4, + 0x3f, 0xf8, 0x30, 0x48, 0x7f, 0xd9, 0x87, 0xe8, + 0x40, 0x87, 0xe4, 0xc4, 0x43, 0xf9, 0x33, 0xf, + 0x42, 0x4, 0x43, 0xc9, 0x87, 0xff, 0x5, 0x9, + 0x10, 0xd0, 0x3f, 0x26, 0x19, 0xf, 0xc8, 0x7b, + 0xfc, 0x1d, 0x8, 0x79, 0x20, 0x26, 0x1e, 0xc4, + 0x40, 0x87, 0x90, 0x80, /* U+00C5 "Å" */ - 0xe, 0xb8, 0x3f, 0xaf, 0xa0, 0xfc, 0xa1, 0x41, - 0xfc, 0x88, 0x7f, 0x77, 0x61, 0xfd, 0xf0, 0x7f, - 0xae, 0xf, 0xf2, 0x21, 0xfc, 0x84, 0x87, 0xec, - 0x4c, 0x3f, 0x24, 0x21, 0xf2, 0x1f, 0xfc, 0xc, - 0x84, 0x83, 0xc8, 0x90, 0x87, 0x21, 0xff, 0xc0, - 0xc4, 0x24, 0x43, 0x26, 0x16, 0x41, 0xeb, 0xe8, - 0x3a, 0xf, 0xe4, 0x9, 0x7f, 0x44, 0x19, 0xe, - 0x42, 0x43, 0xfe, 0x62, 0xf, 0x93, + 0xf, 0x78, 0x3f, 0xee, 0x98, 0x7f, 0xca, 0xf, + 0xfe, 0x2, 0x83, 0xfe, 0xe9, 0x87, 0xfd, 0xe0, + 0xff, 0xe0, 0x58, 0x7f, 0xf0, 0x11, 0xf, 0xf2, + 0x8, 0x3f, 0xd8, 0x7f, 0xf0, 0x53, 0x10, 0xfc, + 0x88, 0x30, 0xfd, 0x18, 0xa0, 0xff, 0x26, 0x21, + 0xe4, 0x40, 0x98, 0x7a, 0x30, 0xc8, 0x7e, 0x42, + 0x43, 0xd0, 0x3f, 0x24, 0x19, 0xf, 0xc8, 0x7b, + 0xfc, 0x1d, 0x8, 0x79, 0x10, 0x26, 0x1e, 0xcc, + 0x40, 0x87, 0x91, 0x0, /* U+00C6 "Æ" */ 0xf, 0xcf, 0xff, 0x41, 0xfd, 0x7, 0xf6, 0x1f, - 0x90, 0xdf, 0xe4, 0x3f, 0x44, 0x1f, 0xfc, 0x44, - 0x8, 0x7f, 0xf1, 0x22, 0xf, 0xfe, 0x22, 0x4, - 0x3f, 0xf8, 0x90, 0x86, 0xff, 0x7, 0x90, 0x41, - 0xff, 0xc4, 0x84, 0x3b, 0xfc, 0x1c, 0x82, 0xf, - 0xfe, 0x24, 0xf, 0xc1, 0xff, 0xc0, 0x43, 0xff, - 0x8f, 0xf, 0xf0, 0x7f, 0xc8, 0x20, 0xff, 0xe2, - 0x42, 0x1f, 0xbf, 0xe5, 0x2, 0xf, 0xfe, 0x1e, + 0x91, 0x7, 0xf9, 0xf, 0xd1, 0x7, 0xff, 0x11, + 0x10, 0xff, 0xe2, 0xc6, 0x1f, 0xfc, 0x44, 0x8, + 0x7f, 0xf1, 0x22, 0xd, 0xfe, 0xf, 0x40, 0x43, + 0xff, 0x88, 0x90, 0x77, 0xf8, 0x3a, 0x2, 0x1f, + 0xfc, 0x44, 0x1f, 0x83, 0xff, 0x81, 0x7, 0xff, + 0x1d, 0x2f, 0xe0, 0xff, 0xa0, 0x21, 0xff, 0xc4, + 0x48, 0x3f, 0x7f, 0xcc, 0x4, 0x3f, 0xf8, 0x78, /* U+00C7 "Ç" */ 0xa, 0xfc, 0x86, 0xd0, 0xd4, 0x6, 0x3f, 0x85, 0x81, 0x6, 0x8f, 0x10, 0x72, 0x28, 0x43, 0xca, 0xf, 0xea, 0x7, 0xff, 0xa5, 0x61, 0xf, 0x53, 0x20, 0xe4, 0x50, 0x20, 0xd1, 0x98, 0xfe, 0x14, - 0xd, 0x9, 0xa0, 0x6a, 0x14, 0x43, 0xca, 0xa0, - 0x7e, 0x84, 0x3e, 0x71, 0xf, 0xb1, 0x82, + 0xd, 0xd, 0x40, 0xd4, 0x1d, 0xf, 0x2d, 0x87, + 0xe8, 0x3f, 0x9c, 0x3f, 0xb1, 0xc2, /* U+00C8 "È" */ - 0x2e, 0xf, 0x42, 0x83, 0xd9, 0x7, 0xda, 0x1f, - 0xa0, 0xdf, 0xfc, 0x1f, 0xf7, 0xfc, 0x1f, 0xfd, - 0xaf, 0xf0, 0x7f, 0xf0, 0x3f, 0xc1, 0xff, 0xe4, - 0xff, 0x83, 0xf8, + 0x3d, 0x7, 0xb1, 0x41, 0xec, 0x83, 0xed, 0xf, + 0xd0, 0x6f, 0xfe, 0xf, 0xfb, 0xfe, 0xf, 0xfe, + 0xd7, 0xf8, 0x3f, 0xf8, 0x1f, 0xe0, 0xff, 0xf2, + 0x7f, 0xc1, 0xfc, /* U+00C9 "É" */ 0xe, 0xf4, 0x1d, 0xc, 0x1c, 0x90, 0x73, 0x61, @@ -706,18 +704,18 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xff, 0x27, 0xfc, 0x1f, 0xc0, /* U+00CB "Ë" */ - 0x3c, 0x17, 0x7, 0xe4, 0x1e, 0xb, 0xc1, 0xfe, - 0xff, 0xe0, 0xff, 0xbf, 0xe0, 0xff, 0xed, 0x7f, - 0x83, 0xff, 0x81, 0xfe, 0xf, 0xff, 0x27, 0xfc, - 0x1f, 0xc0, + 0x3c, 0x17, 0x83, 0xfe, 0xf0, 0x5e, 0xf, 0xf7, + 0xff, 0x7, 0xfd, 0xff, 0x7, 0xff, 0x6b, 0xfc, + 0x1f, 0xfc, 0xf, 0xf0, 0x7f, 0xf9, 0x3f, 0xe0, + 0xfe, /* U+00CC "Ì" */ 0x3c, 0x85, 0x10, 0x4c, 0x41, 0x36, 0x19, 0x41, 0xbc, 0x1f, 0xff, 0xf0, 0xff, 0xe5, 0x0, /* U+00CD "Í" */ - 0xb, 0xc8, 0x32, 0x44, 0x90, 0xa4, 0x25, 0x6, - 0xf0, 0x7f, 0xff, 0xc3, 0xff, 0x98, + 0x3, 0xe4, 0x11, 0x24, 0x48, 0x39, 0x9, 0x41, + 0xbc, 0x1f, 0xff, 0xf0, 0xff, 0xe6, 0x0, /* U+00CE "Î" */ 0x7, 0x83, 0x40, 0x80, 0xaa, 0x28, 0x12, 0xa0, @@ -729,76 +727,77 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x78, 0x3f, 0xff, 0xe1, 0xff, 0xec, /* U+00D0 "Ð" */ - 0x7, 0xf9, 0xf, 0xfa, 0xc3, 0xdf, 0x93, 0xf, - 0xe8, 0x8, 0x7f, 0x46, 0x1f, 0xc8, 0x87, 0xff, - 0x3, 0xc0, 0xf0, 0x7f, 0xf1, 0xbc, 0xf, 0x7, - 0xff, 0x6d, 0x10, 0xfe, 0x8c, 0x3f, 0x40, 0x43, - 0x7e, 0x4c, 0x3f, 0xac, 0x0, + 0x7, 0xfa, 0xf, 0xfe, 0x3, 0x87, 0xdf, 0x93, + 0xf, 0xf4, 0x88, 0x7f, 0xb2, 0xf, 0xf2, 0x1f, + 0xfc, 0x47, 0x7, 0x90, 0xf6, 0x1d, 0x87, 0xac, + 0x1e, 0x83, 0xff, 0xba, 0x87, 0xff, 0x2, 0x20, + 0xfe, 0x80, 0x87, 0x7e, 0x4c, 0x3f, 0xce, 0x10, /* U+00D1 "Ñ" */ 0xf, 0xfe, 0x1f, 0x92, 0xc3, 0xb0, 0x5a, 0x83, 0xd7, 0x2a, 0xe, 0xd1, 0xa0, 0x6f, 0x21, 0xef, 0x5, 0x7, 0xff, 0x1, 0xf, 0xfa, 0xf, 0xf2, 0x21, 0xfd, 0x10, 0x7f, 0x92, 0xf, 0xe8, 0x43, - 0xfd, 0x10, 0x7f, 0x22, 0x1f, 0xe8, 0x83, 0xf9, + 0xfc, 0x90, 0x7f, 0x42, 0x1f, 0xe8, 0x83, 0xf9, 0x10, 0xff, 0x44, 0x1f, 0xc8, 0x87, 0xfa, 0xf, 0xf9, 0xf, 0xfe, 0x4, 0x10, /* U+00D2 "Ò" */ 0x5, 0xe0, 0xfe, 0x92, 0xf, 0xe8, 0x43, 0xfd, 0xa8, 0x3f, 0xd2, 0x1f, 0xaf, 0xa0, 0xf6, 0x84, - 0xe8, 0x58, 0xfd, 0x10, 0x10, 0x41, 0x28, 0x8c, - 0x83, 0xb1, 0x11, 0xe, 0x43, 0xff, 0xfe, 0x4, - 0x39, 0xa, 0x20, 0xec, 0x44, 0x10, 0x4a, 0x20, - 0x43, 0xf4, 0x41, 0x3a, 0x13, 0xa0, + 0xe8, 0x58, 0xfd, 0x10, 0x11, 0x82, 0x51, 0x19, + 0x87, 0x62, 0x22, 0x1c, 0x87, 0xff, 0xfd, 0x10, + 0xe4, 0x2c, 0x83, 0xb1, 0x10, 0x41, 0x28, 0x81, + 0x8f, 0xd1, 0x6, 0xd0, 0x9d, 0x0, /* U+00D3 "Ó" */ 0xf, 0x5c, 0x1f, 0x94, 0x41, 0xfa, 0x30, 0xfe, 0x70, 0xff, 0x41, 0xfd, 0x7d, 0x7, 0xb4, 0x27, - 0x42, 0xc7, 0xe8, 0x80, 0x82, 0x9, 0x44, 0x64, - 0x1d, 0x88, 0x88, 0x72, 0x1f, 0xff, 0xf0, 0x21, - 0xc8, 0x51, 0x7, 0x62, 0x20, 0x82, 0x51, 0x2, - 0x1f, 0xa2, 0x9, 0xd0, 0x9d, 0x0, + 0x42, 0xc7, 0xe8, 0x80, 0x8c, 0x12, 0x88, 0xcc, + 0x3b, 0x11, 0x10, 0xe4, 0x3f, 0xff, 0xe8, 0x87, + 0x21, 0x64, 0x1d, 0x88, 0x82, 0x9, 0x44, 0xc, + 0x7e, 0x88, 0x36, 0x84, 0xe8, 0x0, /* U+00D4 "Ô" */ 0xc, 0xf0, 0x7e, 0x65, 0x83, 0xe9, 0xa8, 0x3e, 0xe1, 0xc3, 0xff, 0x8f, 0x7d, 0x7, 0xb4, 0x27, - 0x42, 0xc7, 0xe8, 0x80, 0x82, 0x9, 0x44, 0x64, - 0x1d, 0x88, 0x88, 0x72, 0x1f, 0xff, 0xf0, 0x21, - 0xc8, 0x51, 0x7, 0x62, 0x20, 0x82, 0x51, 0x2, - 0x1f, 0xa2, 0x9, 0xd0, 0x9d, 0x0, + 0x42, 0xc7, 0xe8, 0x80, 0x8c, 0x12, 0x88, 0xcc, + 0x3b, 0x11, 0x10, 0xe4, 0x3f, 0xff, 0xe8, 0x87, + 0x21, 0x64, 0x1d, 0x88, 0x82, 0x9, 0x44, 0xc, + 0x7e, 0x88, 0x36, 0x84, 0xe8, 0x0, /* U+00D5 "Õ" */ - 0xa, 0x88, 0xe1, 0xcb, 0x5c, 0x87, 0x4f, 0x2, - 0xe, 0xe1, 0xf0, 0x7f, 0xf1, 0xef, 0xa0, 0xf6, - 0x84, 0xe8, 0x58, 0xfd, 0x10, 0x10, 0x41, 0x28, - 0x8c, 0x83, 0xb1, 0x11, 0xe, 0x43, 0xff, 0xfe, - 0x4, 0x39, 0xa, 0x20, 0xec, 0x44, 0x10, 0x4a, - 0x20, 0x43, 0xf4, 0x41, 0x3a, 0x13, 0xa0, + 0xa, 0xd0, 0x70, 0x65, 0x17, 0x8c, 0x34, 0x70, + 0x14, 0x1b, 0xc3, 0xe8, 0x3f, 0xf8, 0xd7, 0xd0, + 0x7b, 0x42, 0x74, 0x2c, 0x7f, 0x30, 0x10, 0x41, + 0xa2, 0x32, 0xf, 0x28, 0x44, 0x3d, 0x87, 0xfc, + 0x87, 0xff, 0xbd, 0x2, 0x21, 0xec, 0x19, 0x7, + 0x94, 0x20, 0x83, 0x44, 0xc, 0x7f, 0x30, 0x6d, + 0x9, 0xd0, 0x0, /* U+00D6 "Ö" */ 0xf, 0xfe, 0x17, 0x82, 0xf0, 0x7f, 0xf1, 0x7c, 0x17, 0x83, 0xff, 0x8d, 0x7d, 0x7, 0xb4, 0x27, - 0x42, 0xc7, 0xe8, 0x80, 0x82, 0x9, 0x44, 0x64, - 0x1d, 0x88, 0x88, 0x72, 0x1f, 0xff, 0xf0, 0x21, - 0xc8, 0x51, 0x7, 0x62, 0x20, 0x82, 0x51, 0x2, - 0x1f, 0xa2, 0x9, 0xd0, 0x9d, 0x0, + 0x42, 0xc7, 0xe8, 0x80, 0x8c, 0x12, 0x88, 0xcc, + 0x3b, 0x11, 0x10, 0xe4, 0x3f, 0xff, 0xe8, 0x87, + 0x21, 0x64, 0x1d, 0x88, 0x82, 0x9, 0x44, 0xc, + 0x7e, 0x88, 0x36, 0x84, 0xe8, 0x0, /* U+00D7 "×" */ 0xf, 0xf3, 0x87, 0x69, 0x98, 0x51, 0x10, 0x21, 0x46, 0xc, 0x68, 0x61, 0xb1, 0x20, 0xfe, 0x43, 0xa0, 0xb0, 0xd2, 0x60, 0x80, 0xa3, 0x31, 0x8c, - 0x82, 0xc2, 0xa2, 0x1b, 0x80, + 0x82, 0xc2, 0xa2, 0x1a, 0x80, /* U+00D8 "Ø" */ - 0xf, 0xf3, 0x86, 0x7f, 0x24, 0x85, 0x40, 0xd6, - 0x40, 0x93, 0xe8, 0x3c, 0x98, 0x48, 0x72, 0x21, - 0x90, 0xa3, 0x30, 0xd1, 0x8, 0x88, 0x49, 0x21, - 0xfd, 0x8, 0x7f, 0x24, 0x1f, 0xe8, 0x43, 0xfa, - 0x20, 0xfc, 0x88, 0x81, 0x11, 0x38, 0xc2, 0xc2, - 0x85, 0x83, 0x24, 0x4, 0x18, 0x58, 0x85, 0x82, - 0xf8, 0x60, 0xa6, 0xd, 0x40, 0x92, 0x7f, 0x21, - 0x80, + 0xf, 0xf5, 0x86, 0x7f, 0x23, 0x5, 0x40, 0xd6, + 0x20, 0x93, 0xf0, 0x10, 0x93, 0xc, 0x88, 0x21, + 0xe, 0x41, 0x9, 0x86, 0xd8, 0x42, 0x42, 0x49, + 0xf, 0xe9, 0xf, 0xf2, 0x41, 0xfe, 0x90, 0xff, + 0x24, 0x1f, 0x92, 0x81, 0x21, 0x27, 0x8, 0x58, + 0x90, 0xa8, 0x32, 0x40, 0x40, 0x85, 0x88, 0x50, + 0x3f, 0x2, 0xa, 0x20, 0xd6, 0x12, 0xb7, 0xf2, + 0x18, /* U+00D9 "Ù" */ 0x7, 0x90, 0xfd, 0x10, 0x7e, 0x62, 0xf, 0xcd, @@ -807,10 +806,10 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xfc, 0x8, 0x1c, 0x1a, 0xc0, /* U+00DA "Ú" */ - 0xe, 0x7c, 0x1f, 0xa2, 0xf, 0x92, 0x43, 0xf4, - 0x87, 0xe5, 0x7, 0x78, 0x3d, 0xe0, 0xff, 0xff, - 0x87, 0xff, 0xc1, 0xf, 0xd1, 0x6, 0xc4, 0x41, - 0xf8, 0x10, 0x38, 0x35, 0x80, + 0xe, 0x7c, 0x1f, 0xa2, 0xf, 0xa2, 0x43, 0xee, + 0x43, 0xf2, 0x83, 0xbc, 0x1e, 0xf0, 0x7f, 0xff, + 0xc3, 0xff, 0xe0, 0x87, 0xe8, 0x83, 0x62, 0x20, + 0xfc, 0x8, 0x1c, 0x1a, 0xc0, /* U+00DB "Û" */ 0xd, 0xe0, 0xfd, 0x2, 0xf, 0x2a, 0x8a, 0xf, @@ -834,9 +833,9 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+00DE "Þ" */ 0xf0, 0x7f, 0xf4, 0xbe, 0x90, 0xfc, 0xd0, 0x37, - 0xd0, 0xa0, 0xf3, 0x10, 0x7c, 0x87, 0xff, 0x1d, - 0xf, 0xe8, 0x42, 0xfc, 0x8, 0x3e, 0x70, 0xdf, - 0xa0, 0xff, 0xea, 0x80, + 0xd0, 0xa0, 0xf3, 0x10, 0x7c, 0x87, 0xff, 0x47, + 0x10, 0xbf, 0x2, 0xf, 0x9c, 0x37, 0xe8, 0x3f, + 0xfa, 0xa0, /* U+00DF "ß" */ 0x5, 0xf2, 0x1b, 0x42, 0x90, 0x43, 0xe4, 0x80, @@ -846,70 +845,68 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x20, 0x43, 0x9b, 0xd1, 0x6, 0x42, 0x90, /* U+00E0 "à" */ - 0x2e, 0xf, 0x42, 0x83, 0xd9, 0x7, 0xdc, 0x1f, - 0x90, 0xf5, 0xf2, 0x16, 0x85, 0x43, 0x1f, 0x42, - 0x2a, 0x2, 0x15, 0x3, 0xfa, 0xf8, 0x36, 0x87, - 0xa0, 0x7c, 0x12, 0x61, 0xff, 0xc5, 0x41, 0x5, - 0x17, 0x90, 0x98, 0x2d, 0x10, + 0x2f, 0x7, 0xa0, 0x21, 0xec, 0x83, 0xee, 0xf, + 0xc8, 0x7a, 0xf9, 0xb, 0x42, 0x92, 0x7, 0xa2, + 0x12, 0x2, 0x17, 0x90, 0xfd, 0x7c, 0x1b, 0x43, + 0xd0, 0x3e, 0x9, 0x30, 0xff, 0xe2, 0xa0, 0x82, + 0x8b, 0xc8, 0x4c, 0x16, 0x88, /* U+00E1 "á" */ - 0xe, 0xf2, 0x1d, 0xa, 0xc, 0xb4, 0x1e, 0xa0, - 0x79, 0x41, 0xeb, 0xe4, 0x2d, 0xa, 0x86, 0x3e, - 0x84, 0x54, 0x4, 0x2a, 0x7, 0xf5, 0xf0, 0x6d, - 0x14, 0x14, 0x3d, 0x2, 0x48, 0x3f, 0xf8, 0xa8, - 0x20, 0xa2, 0xf2, 0x13, 0x5, 0xa2, - - /* U+00E2 "â" */ - 0xa, 0xd0, 0xe5, 0xa0, 0xea, 0x8c, 0x36, 0x9e, - 0xf, 0xfe, 0xd, 0xf2, 0x16, 0x85, 0x43, 0x1f, - 0x42, 0x2a, 0x2, 0x15, 0x3, 0xfa, 0xf8, 0x36, - 0x87, 0xa0, 0x7c, 0x12, 0x61, 0xff, 0xc5, 0x41, + 0xe, 0xf2, 0x1d, 0xa, 0xe, 0x54, 0x1e, 0xa0, + 0x7c, 0x87, 0xaf, 0x90, 0xb4, 0x29, 0x31, 0xf4, + 0x42, 0xa0, 0x21, 0x50, 0x3f, 0xaf, 0x83, 0x68, + 0xa0, 0xa1, 0xe8, 0x12, 0x41, 0xff, 0xc5, 0x41, 0x5, 0x17, 0x90, 0x98, 0x2d, 0x10, + /* U+00E2 "â" */ + 0xa, 0xd0, 0xe5, 0xa0, 0xe9, 0x8c, 0x37, 0x1e, + 0xf, 0xfe, 0xd, 0xf2, 0x16, 0x85, 0x26, 0x3e, + 0x88, 0x54, 0x4, 0x2a, 0x7, 0xf5, 0xf0, 0x6d, + 0xf, 0x40, 0xf8, 0x24, 0xc3, 0xff, 0x8a, 0x82, + 0xa, 0x2f, 0x21, 0x30, 0x5a, 0x20, + /* U+00E3 "ã" */ - 0xf, 0xfb, 0xc0, 0xe0, 0x40, 0xf1, 0x81, 0xb4, - 0x50, 0x34, 0xb8, 0x3f, 0xf8, 0x37, 0xc8, 0x5a, - 0x15, 0xc, 0x7d, 0x8, 0xa8, 0x8, 0x54, 0xf, - 0xeb, 0xe0, 0xda, 0x1e, 0x81, 0xf0, 0x49, 0x87, - 0xff, 0x15, 0x4, 0x14, 0x5e, 0x42, 0x60, 0xb4, - 0x40, + 0xf, 0xfb, 0xc0, 0xe0, 0x60, 0xf1, 0x84, 0xf0, + 0xa0, 0x70, 0xf0, 0x7f, 0xf0, 0x6f, 0x90, 0xb4, + 0x29, 0x31, 0xf4, 0x42, 0xa0, 0x21, 0x50, 0x3f, + 0xaf, 0x83, 0x68, 0x7a, 0x7, 0xc1, 0x26, 0x1f, + 0xfc, 0x54, 0x10, 0x51, 0x79, 0x9, 0x82, 0xd1, /* U+00E4 "ä" */ 0x3c, 0x17, 0x83, 0xfe, 0xf0, 0x5e, 0xf, 0xfe, - 0x5, 0xf2, 0x16, 0x85, 0x43, 0x1f, 0x42, 0x2a, - 0x2, 0x15, 0x3, 0xfa, 0xf8, 0x36, 0x87, 0xa0, - 0x7c, 0x12, 0x61, 0xff, 0xc5, 0x41, 0x5, 0x17, - 0x90, 0x98, 0x2d, 0x10, + 0x5, 0xf2, 0x16, 0x85, 0x26, 0x3e, 0x88, 0x54, + 0x4, 0x2a, 0x7, 0xf5, 0xf0, 0x6d, 0xf, 0x40, + 0xf8, 0x24, 0xc3, 0xff, 0x8a, 0x82, 0xa, 0x2f, + 0x21, 0x30, 0x5a, 0x20, /* U+00E5 "å" */ 0xb, 0xe0, 0xee, 0xec, 0x3f, 0xf8, 0x3d, 0xd8, - 0x77, 0xc1, 0xff, 0xc2, 0xbe, 0x42, 0xd0, 0xa8, - 0x63, 0xe8, 0x45, 0x40, 0x42, 0xa0, 0x7f, 0x5f, - 0x6, 0xd0, 0xf4, 0xf, 0x82, 0x4c, 0x3f, 0xf8, - 0xa8, 0x20, 0xa2, 0xf2, 0x13, 0x5, 0xa2, + 0x77, 0xc1, 0xff, 0xc2, 0xbe, 0x42, 0xd0, 0xa4, + 0xc7, 0xd1, 0xa, 0x80, 0x85, 0x40, 0xfe, 0xbe, + 0xd, 0xa1, 0xe8, 0x1f, 0x4, 0x98, 0x7f, 0xf1, + 0x50, 0x41, 0x45, 0xe4, 0x26, 0xa, 0x44, /* U+00E6 "æ" */ 0x5, 0xf4, 0x7, 0xe8, 0x2d, 0x9, 0xe8, 0x13, 0x98, 0xfc, 0x89, 0xf0, 0x14, 0x41, 0x40, 0x82, - 0x8e, 0xc3, 0xe4, 0x24, 0x40, 0xdf, 0x3, 0xf8, - 0x2e, 0x43, 0xff, 0x81, 0x2, 0xf8, 0x1f, 0xf2, - 0x48, 0x7f, 0xf0, 0x90, 0xf4, 0x1f, 0xa0, 0xb0, - 0x21, 0xa6, 0x1f, 0x86, 0x3f, 0x3b, 0x4, 0xd1, - 0x90, 0xa8, + 0x8a, 0x61, 0xf2, 0x12, 0x19, 0xbe, 0x7, 0xf0, + 0x5c, 0x87, 0xff, 0x2, 0x7, 0xe0, 0x7f, 0xc9, + 0x87, 0xff, 0x2a, 0xf, 0xd0, 0x58, 0x14, 0x14, + 0xc3, 0xf0, 0xa2, 0xf9, 0xd8, 0x35, 0x60, 0xd4, /* U+00E7 "ç" */ - 0x3, 0xf4, 0x1a, 0x81, 0x38, 0x14, 0x7c, 0x91, - 0x90, 0x50, 0x88, 0x86, 0x50, 0x7e, 0xa0, 0x7f, - 0xf4, 0xd1, 0xd, 0xe3, 0x20, 0xa1, 0x10, 0x7c, - 0x90, 0x34, 0x27, 0xd, 0x41, 0x83, 0xcb, 0x61, - 0xf4, 0x1f, 0x9c, 0x3f, 0x63, 0x84, + 0x5, 0xf4, 0x1b, 0x42, 0x70, 0x20, 0xf9, 0x23, + 0x20, 0xa1, 0x11, 0xc, 0xa0, 0xfd, 0x40, 0xff, + 0xe9, 0xa2, 0x1b, 0xc6, 0x41, 0x42, 0x20, 0xf9, + 0x20, 0x68, 0x4e, 0x1a, 0x83, 0x7, 0x96, 0xc3, + 0xe8, 0x3f, 0x38, 0x7e, 0xc7, 0x8, /* U+00E8 "è" */ - 0x2f, 0x7, 0xd2, 0x41, 0xf4, 0x28, 0x3e, 0xe0, - 0xfe, 0x50, 0x79, 0xfa, 0xd, 0x40, 0x9c, 0xa, - 0x3e, 0x48, 0xc8, 0x28, 0x44, 0x43, 0xfb, 0xf8, - 0x3f, 0xf8, 0x7f, 0xf0, 0x7f, 0xf0, 0x50, 0xfa, - 0x20, 0xdc, 0x20, 0xfc, 0x1b, 0x83, 0x50, + 0x2f, 0x7, 0xd2, 0x41, 0xf4, 0x21, 0xfb, 0x90, + 0xfc, 0xa0, 0xf3, 0xf4, 0x1a, 0x81, 0x38, 0x14, + 0x7c, 0x91, 0x90, 0x50, 0x88, 0x87, 0xf7, 0xf0, + 0x7f, 0xf0, 0xff, 0xe0, 0xff, 0xe0, 0xa1, 0xf4, + 0x41, 0xb8, 0x41, 0xf8, 0x37, 0x6, 0xa0, /* U+00E9 "é" */ 0xe, 0xbc, 0x1e, 0x51, 0x87, 0xa3, 0xf, 0xac, @@ -919,18 +916,18 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x41, 0xb8, 0x41, 0xf8, 0x37, 0x6, 0xa0, /* U+00EA "ê" */ - 0x9, 0xe0, 0xfa, 0x58, 0x3b, 0x26, 0xe, 0xf1, - 0x61, 0xff, 0xc3, 0x7e, 0x83, 0x50, 0x27, 0x2, - 0x8f, 0x92, 0x32, 0xa, 0x11, 0x10, 0xfe, 0xfe, - 0xf, 0xfe, 0x1f, 0xfc, 0x1f, 0xfc, 0x14, 0x3e, - 0x88, 0x37, 0x8, 0x3f, 0x6, 0xe0, 0xd4, 0x0, + 0x9, 0xe0, 0xfa, 0x58, 0x3b, 0x66, 0xe, 0xe2, + 0xc3, 0xff, 0x86, 0xfd, 0x6, 0xa0, 0x4e, 0x5, + 0x1f, 0x24, 0x64, 0x14, 0x22, 0x21, 0xfd, 0xfc, + 0x1f, 0xfc, 0x3f, 0xf8, 0x3f, 0xf8, 0x28, 0x7d, + 0x10, 0x6e, 0x10, 0x7e, 0xd, 0xc1, 0xa8, 0x0, /* U+00EB "ë" */ 0x3c, 0x17, 0x83, 0xff, 0x83, 0xe0, 0xbc, 0x1f, 0xfc, 0x27, 0xe8, 0x35, 0x2, 0x70, 0x28, 0xf9, 0x23, 0x20, 0xa1, 0x11, 0xf, 0xef, 0xe0, 0xff, 0xe1, 0xff, 0xc1, 0xff, 0xc1, 0x43, 0xe8, 0x83, - 0x68, 0x83, 0xf0, 0x6d, 0x9, 0x90, + 0x68, 0x83, 0xf1, 0x83, 0x43, 0x50, /* U+00EC "ì" */ 0x3c, 0x85, 0x90, 0x68, 0xc2, 0x7c, 0x1f, 0xef, @@ -951,52 +948,52 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+00F0 "ð" */ 0x18, 0x3f, 0x6f, 0xe, 0x14, 0x8f, 0x21, 0xac, 0x28, 0x3b, 0x9, 0xc, 0x9c, 0x41, 0x9c, 0x40, - 0x84, 0xd1, 0x46, 0x6, 0x54, 0x88, 0x22, 0xf0, - 0x68, 0x50, 0x30, 0x93, 0xf, 0xe4, 0x3f, 0xf9, - 0xe9, 0x5, 0x9, 0x8, 0x49, 0x1, 0x3e, 0x10, - 0xa8, 0x15, 0x0, + 0x84, 0xdc, 0x98, 0x19, 0x14, 0x20, 0x8b, 0xc8, + 0x50, 0xa0, 0x41, 0x26, 0x1f, 0xc8, 0x7f, 0xf3, + 0xd2, 0xa, 0x12, 0x10, 0x92, 0x2, 0x7c, 0x21, + 0x50, 0x2a, 0x0, /* U+00F1 "ñ" */ - 0xf, 0xf3, 0xc0, 0xd0, 0x43, 0xe1, 0xa, 0xd2, - 0xb, 0x4b, 0x43, 0xfe, 0xf1, 0x7a, 0xd, 0xa0, + 0xf, 0xf3, 0xc0, 0xd0, 0x43, 0xe1, 0xa, 0xd1, + 0xb, 0x4b, 0x83, 0xfe, 0xf1, 0x7a, 0xd, 0xa0, 0x50, 0x6f, 0x44, 0x16, 0x4, 0x3f, 0xff, 0xe1, 0xfc, /* U+00F2 "ò" */ - 0x1f, 0x7, 0xcc, 0x61, 0xf2, 0x88, 0x3e, 0xa6, - 0x1f, 0x94, 0x1e, 0x7f, 0x21, 0x50, 0x35, 0x5, - 0x17, 0xa1, 0x31, 0x40, 0x51, 0x26, 0x1b, 0x10, - 0x21, 0x90, 0xff, 0xea, 0x24, 0x19, 0x1c, 0x50, - 0x51, 0x28, 0xbe, 0x10, 0x50, 0x35, 0x0, + 0x1f, 0x7, 0xca, 0x30, 0xfa, 0x48, 0x3e, 0xa6, + 0x1f, 0x94, 0x1e, 0x7f, 0x21, 0x50, 0x35, 0x0, + 0x97, 0xa1, 0x21, 0x40, 0x51, 0x24, 0x1a, 0x10, + 0xff, 0xee, 0x24, 0x19, 0x18, 0x50, 0x51, 0x9, + 0x7c, 0x20, 0xa0, 0x6a, 0x0, /* U+00F3 "ó" */ - 0xe, 0x7c, 0x1f, 0x44, 0x1e, 0x89, 0xf, 0x72, - 0x1f, 0x28, 0x3c, 0xfe, 0x42, 0xa0, 0x6a, 0xa, - 0x2f, 0x42, 0x62, 0x80, 0xa2, 0x4c, 0x36, 0x20, - 0x43, 0x21, 0xff, 0xd4, 0x48, 0x32, 0x38, 0xa0, - 0xa2, 0x51, 0x7c, 0x20, 0xa0, 0x6a, 0x0, + 0xe, 0x7c, 0x1f, 0x44, 0x1e, 0x89, 0xf, 0x79, + 0xf, 0x90, 0xf9, 0xfc, 0x85, 0x40, 0xd4, 0x2, + 0x5e, 0x84, 0x85, 0x1, 0x44, 0x90, 0x68, 0x43, + 0xff, 0xb8, 0x90, 0x64, 0x61, 0x41, 0x44, 0x25, + 0xf0, 0x82, 0x81, 0xa8, 0x0, /* U+00F4 "ô" */ - 0xd, 0xe0, 0xfb, 0x4, 0x1d, 0x9e, 0x60, 0xde, - 0x7, 0x7, 0xff, 0x9, 0xfc, 0x85, 0x40, 0xd4, - 0x14, 0x5e, 0x84, 0xc5, 0x1, 0x44, 0x98, 0x6c, - 0x40, 0x86, 0x43, 0xff, 0xa8, 0x90, 0x64, 0x71, - 0x41, 0x44, 0xa2, 0xf8, 0x41, 0x40, 0xd4, 0x0, + 0xd, 0xe0, 0xfb, 0x48, 0x3b, 0x2d, 0x41, 0xbc, + 0xd, 0xf, 0xfe, 0x13, 0xf9, 0xa, 0x81, 0xa8, + 0x4, 0xbd, 0x9, 0xa, 0x2, 0x89, 0x20, 0xd0, + 0x87, 0xff, 0x71, 0x20, 0xc8, 0xc2, 0x82, 0x88, + 0x4b, 0xe1, 0x5, 0x3, 0x50, /* U+00F5 "õ" */ 0xf, 0xfe, 0x5, 0xc0, 0xd0, 0x28, 0x7c, 0x20, 0xdf, 0x2, 0xa, 0x80, 0xf2, 0x1f, 0xfc, 0x27, - 0xf2, 0x15, 0x3, 0x50, 0x51, 0x7a, 0x13, 0x14, - 0x5, 0x12, 0x61, 0xb1, 0x2, 0x19, 0xf, 0xfe, - 0xa2, 0x41, 0x91, 0xc5, 0x5, 0x12, 0x8b, 0xe1, - 0x5, 0x3, 0x50, + 0xf2, 0x15, 0x3, 0x50, 0x9, 0x7a, 0x12, 0x14, + 0x5, 0x12, 0x41, 0xa1, 0xf, 0xfe, 0xe2, 0x41, + 0x91, 0x85, 0x5, 0x10, 0x97, 0xc2, 0xa, 0x6, + 0xa0, /* U+00F6 "ö" */ 0x3c, 0x17, 0x83, 0xff, 0x83, 0xe0, 0xbc, 0x1f, - 0xfc, 0x27, 0xf2, 0x15, 0x3, 0x50, 0x51, 0x7a, - 0x13, 0x14, 0x5, 0x12, 0x61, 0xb1, 0x2, 0x19, - 0xf, 0xfe, 0xa2, 0x41, 0x91, 0xc5, 0x5, 0x12, - 0x8b, 0xe1, 0x5, 0x3, 0x50, + 0xfc, 0x27, 0xf2, 0x15, 0x3, 0x50, 0x9, 0x7a, + 0x12, 0x14, 0x5, 0x12, 0x41, 0xa1, 0xf, 0xfe, + 0xe2, 0x41, 0x91, 0x85, 0x5, 0x10, 0x97, 0xc2, + 0xa, 0x6, 0xa0, /* U+00F7 "÷" */ 0xd, 0xc1, 0xfc, 0x87, 0xe5, 0x7, 0xea, 0x7, @@ -1004,68 +1001,68 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf0, 0xa8, 0x1f, 0x94, 0x1f, 0xc8, 0x60, /* U+00F8 "ø" */ - 0xf, 0xc8, 0x7e, 0xb0, 0x9b, 0xd3, 0x81, 0x90, - 0x21, 0xa2, 0xf0, 0x22, 0x14, 0x21, 0x49, 0x82, - 0x61, 0x2, 0x14, 0x87, 0xa0, 0xfe, 0x60, 0xf3, - 0x8, 0x81, 0x35, 0x3, 0x18, 0x48, 0x51, 0x10, - 0x3d, 0x10, 0x10, 0xcc, 0x82, 0x3e, 0x90, 0xbc, - 0x1f, 0x0, + 0xf, 0xc8, 0x7e, 0xb0, 0x9f, 0xce, 0x6, 0xf, + 0xd1, 0x78, 0x11, 0xa, 0x11, 0x24, 0xc1, 0x38, + 0x81, 0xa, 0x43, 0xd2, 0x1f, 0x9c, 0x3c, 0xa1, + 0x10, 0x27, 0x40, 0x63, 0x8, 0x8a, 0x22, 0x7, + 0xa2, 0x2, 0x1d, 0x20, 0x8f, 0xc8, 0x5e, 0xf, + 0x80, /* U+00F9 "ù" */ - 0x3c, 0x87, 0xb2, 0xf, 0xb2, 0xf, 0xb8, 0x3f, - 0xf8, 0x3e, 0xd, 0xe0, 0xff, 0xff, 0x87, 0xc9, - 0x2, 0xb, 0x1f, 0x21, 0x30, 0x58, 0x40, + 0x3d, 0x7, 0xb1, 0x83, 0xd8, 0xa0, 0xf7, 0x90, + 0xff, 0xe0, 0x78, 0x3b, 0xc1, 0xff, 0xff, 0xf, + 0x24, 0x16, 0x8, 0x69, 0x86, 0x85, 0xb0, 0x0, /* U+00FA "ú" */ - 0xc, 0xf8, 0x3d, 0x18, 0x74, 0x41, 0xeb, 0x43, - 0xff, 0x81, 0xe0, 0xde, 0xf, 0xff, 0xf8, 0x7c, - 0x90, 0x20, 0xb1, 0xf2, 0x13, 0x5, 0x84, + 0xe, 0xbc, 0x1c, 0xa3, 0xc, 0xc6, 0x1c, 0xf8, + 0x3f, 0xf8, 0x1e, 0xe, 0xf0, 0x7f, 0xff, 0xc2, + 0x40, 0x90, 0x50, 0x21, 0xf8, 0x34, 0x13, 0x80, /* U+00FB "û" */ - 0xb, 0xc1, 0xe8, 0x10, 0x65, 0x79, 0x41, 0x38, - 0x34, 0x3f, 0xef, 0x6, 0xf0, 0x7f, 0xff, 0xc3, - 0xe4, 0x81, 0x5, 0x8f, 0x90, 0x98, 0x2c, 0x20, + 0xa, 0xe0, 0xe5, 0xe0, 0x9a, 0xe4, 0xe, 0x8e, + 0x87, 0xfb, 0xc1, 0xde, 0xf, 0xff, 0xf8, 0x79, + 0x20, 0xb0, 0x43, 0x4c, 0x34, 0x2d, 0x80, /* U+00FC "ü" */ 0x3c, 0x17, 0x83, 0xfe, 0xf0, 0x5e, 0xf, 0xf7, - 0x83, 0x78, 0x3f, 0xff, 0xe1, 0xf2, 0x40, 0x82, - 0xc7, 0xc8, 0x4c, 0x16, 0x10, + 0x83, 0xbc, 0x1f, 0xff, 0xf0, 0x90, 0x24, 0x14, + 0x8, 0x7e, 0xd, 0x4, 0xe0, /* U+00FD "ý" */ - 0xf, 0x79, 0xf, 0x64, 0x87, 0x44, 0x87, 0xad, - 0xf, 0xfe, 0xb, 0xc1, 0xbc, 0xa1, 0xf, 0x21, - 0x20, 0x43, 0x26, 0xc, 0x81, 0x88, 0x11, 0x2, - 0x1f, 0xe4, 0x50, 0x86, 0xcf, 0x18, 0x64, 0x50, - 0x87, 0xff, 0xd, 0x2, 0x1e, 0x81, 0x7, 0xff, - 0x19, 0xf, 0x93, 0xf, 0xa1, 0xe, 0xf1, 0x7, - 0xe5, 0x7, 0x0, + 0xf, 0x79, 0xf, 0x44, 0x87, 0x2a, 0x43, 0xce, + 0x87, 0xff, 0x5, 0xf0, 0x6f, 0x28, 0x3f, 0x21, + 0x20, 0x43, 0x26, 0xc, 0x41, 0x88, 0x13, 0x2, + 0x1e, 0x42, 0x45, 0x8, 0x6c, 0xf1, 0x86, 0x45, + 0x8, 0x7f, 0xf0, 0xd0, 0x21, 0xe8, 0x18, 0x7f, + 0x21, 0xf9, 0xf, 0x93, 0xf, 0xa1, 0xe, 0xf0, + 0x87, 0xe6, 0xe, /* U+00FE "þ" */ 0xf0, 0x7f, 0xf9, 0x9b, 0xd0, 0x74, 0x81, 0xc3, - 0x3f, 0x1, 0xa, 0x9, 0x30, 0xfa, 0x10, 0xff, - 0xf1, 0xc2, 0x14, 0x12, 0x61, 0x3f, 0x1, 0xa, + 0x3f, 0x1, 0xa, 0xa, 0x30, 0xf9, 0x10, 0xff, + 0xf1, 0xa2, 0x14, 0x14, 0x61, 0x3f, 0x1, 0xa, 0x40, 0xe1, 0x9b, 0xd0, 0x7f, 0xf7, 0xc0, /* U+00FF "ÿ" */ 0x7, 0x82, 0xf0, 0x7f, 0xf0, 0x7c, 0x17, 0x83, 0xff, 0x81, 0xe0, 0xce, 0x88, 0x85, 0x89, 0x98, 0x48, 0x48, 0x86, 0x43, 0xe4, 0xc2, 0x44, 0xc4, - 0x2c, 0xc4, 0x39, 0x14, 0x21, 0xf6, 0x61, 0xc8, - 0x88, 0x76, 0x4, 0x3c, 0x83, 0xf, 0xe4, 0x3f, - 0xf8, 0x88, 0x87, 0xd1, 0x87, 0x38, 0x10, 0xf9, + 0x2c, 0xc4, 0x39, 0x10, 0x21, 0xf4, 0x61, 0xc8, + 0x88, 0x76, 0x4, 0x3c, 0x83, 0xf, 0xe4, 0x3e, + 0x43, 0xf9, 0x41, 0xf4, 0x61, 0xce, 0x88, 0x7e, 0xc3, 0x80, /* U+011E "Ğ" */ - 0x7, 0x82, 0xf0, 0x79, 0x21, 0xd, 0x16, 0x90, - 0x67, 0x47, 0xf, 0xae, 0xf, 0xaf, 0xc8, 0x4e, - 0x86, 0xa0, 0x22, 0xfc, 0x2c, 0x28, 0x34, 0x50, - 0xc3, 0x90, 0xc8, 0x7b, 0xc1, 0xff, 0xd0, 0xfe, - 0xf, 0xfe, 0x2f, 0xc1, 0xff, 0xc1, 0x44, 0x3f, - 0x64, 0x1f, 0x90, 0x41, 0xa0, 0xb1, 0xfc, 0x90, - 0x34, 0x33, 0xa0, + 0x7, 0x82, 0xf0, 0x7c, 0x90, 0x7d, 0x16, 0x98, + 0x73, 0xa3, 0x87, 0xeb, 0x83, 0xf5, 0xf9, 0xc, + 0xe8, 0x6b, 0xa, 0x2f, 0xc0, 0x84, 0x50, 0x68, + 0x48, 0xc3, 0x90, 0xe4, 0x3d, 0xe0, 0xff, 0xe9, + 0xff, 0x7, 0xff, 0x1f, 0xe0, 0xff, 0xe1, 0xa2, + 0x1f, 0xd9, 0x7, 0xf2, 0x8, 0x34, 0x1b, 0x1f, + 0xc9, 0x5, 0xa1, 0x9d, 0x0, /* U+011F "ğ" */ - 0x3c, 0x17, 0x83, 0xa2, 0xe, 0x87, 0x48, 0x27, + 0x3c, 0x17, 0x83, 0x91, 0xe, 0x8b, 0x88, 0x27, 0x47, 0x43, 0xae, 0xf, 0x5e, 0x8f, 0x3, 0x40, 0xe1, 0x20, 0xf9, 0xa, 0x20, 0xa0, 0xe4, 0x3f, 0xfc, 0x68, 0x87, 0xd9, 0x5, 0x4, 0x83, 0xe4, @@ -1088,79 +1085,73 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xff, 0xc0, 0xc0, /* U+0153 "œ" */ - 0x3, 0xf4, 0x13, 0xf4, 0x13, 0x4, 0xea, 0x82, - 0x70, 0x45, 0xe8, 0xa1, 0xf0, 0x18, 0x50, 0x14, - 0x8, 0x28, 0x93, 0xd, 0x81, 0x9, 0xc, 0x86, - 0x41, 0xfc, 0x1f, 0xfd, 0x1f, 0xf8, 0x8, 0x64, - 0x3f, 0x93, 0xd, 0x82, 0xf, 0x42, 0x80, 0xa0, - 0x21, 0xa0, 0x45, 0xe8, 0xa1, 0xf9, 0x43, 0x4, - 0xea, 0x83, 0x48, + 0x3, 0xf9, 0x3, 0xf4, 0x13, 0x6, 0x95, 0x4, + 0xe0, 0x8b, 0xd1, 0x43, 0xe0, 0x30, 0xa0, 0x28, + 0x8, 0x51, 0x26, 0x1b, 0x4, 0x12, 0x19, 0xc, + 0x83, 0xf8, 0x3f, 0xfa, 0x3f, 0xf0, 0x10, 0xc8, + 0x7f, 0x26, 0x1b, 0x4, 0x1e, 0x85, 0x1, 0x40, + 0x43, 0x40, 0x8b, 0xd1, 0x27, 0xe6, 0x18, 0x34, + 0xd0, 0x35, 0x0, /* U+015E "Ş" */ 0xa, 0xfa, 0xe, 0xd0, 0x9c, 0x28, 0x7e, 0x2, - 0x4, 0x82, 0x88, 0x3f, 0x21, 0xe4, 0x37, 0x80, - 0x90, 0x7e, 0x81, 0xc8, 0x7b, 0x46, 0xc3, 0xd6, - 0x83, 0xf, 0xac, 0x10, 0x7e, 0xc4, 0xf0, 0x7f, - 0xc8, 0x7e, 0x89, 0xa, 0x11, 0x45, 0xf2, 0x40, - 0xa2, 0x13, 0x86, 0x68, 0x30, 0x7c, 0xb6, 0x1f, - 0xa0, 0xfe, 0x71, 0xf, 0xe6, 0x8, + 0x4, 0x82, 0xc8, 0x3f, 0xf9, 0x1e, 0x2, 0x61, + 0xfa, 0x7, 0x21, 0xed, 0x1b, 0xf, 0x5a, 0xc, + 0x3e, 0xb0, 0x41, 0xfb, 0x13, 0xc1, 0xff, 0x21, + 0xfa, 0x20, 0xd0, 0x8a, 0x3f, 0x24, 0xa, 0x21, + 0x38, 0x66, 0x83, 0x7, 0xcb, 0x61, 0xfa, 0xf, + 0xe7, 0xf, 0xf9, 0xc2, /* U+015F "ş" */ - 0x5, 0xf4, 0x1b, 0x42, 0x74, 0xc7, 0xe4, 0x82, - 0x82, 0x83, 0xa0, 0xde, 0x21, 0xe0, 0xe7, 0x47, + 0x5, 0xf4, 0x13, 0xa1, 0x3a, 0x43, 0xf2, 0x41, + 0x41, 0x41, 0xd0, 0x6f, 0x18, 0xf0, 0x7b, 0x47, 0x83, 0xae, 0x1d, 0xe, 0x74, 0x8f, 0x6, 0x82, - 0x48, 0x24, 0x28, 0x7e, 0x88, 0x1a, 0x13, 0xa1, - 0x50, 0x60, 0xf2, 0xd8, 0x7d, 0x7, 0xe7, 0xf, - 0xd8, 0xe1, 0x0, + 0x48, 0x24, 0x28, 0x7e, 0x88, 0x1a, 0x13, 0x21, + 0x50, 0x64, 0x39, 0x6c, 0x3e, 0x83, 0xf3, 0x87, + 0xec, 0x70, 0x80, /* U+0160 "Š" */ - 0x3, 0xa5, 0x87, 0x2a, 0x54, 0x1e, 0x89, 0x41, - 0xf7, 0x40, 0xfe, 0x43, 0xf5, 0xf4, 0x1d, 0xa1, - 0x38, 0x50, 0xfc, 0x4, 0x9, 0x5, 0x10, 0x7e, - 0x43, 0xc8, 0x6f, 0x1, 0x20, 0xfd, 0x3, 0x90, - 0xf6, 0x8d, 0x87, 0xad, 0x6, 0x1f, 0x58, 0x20, - 0xfd, 0x89, 0xe0, 0xff, 0x90, 0xfd, 0x12, 0x14, - 0x22, 0x8b, 0xe4, 0x81, 0x44, 0x27, 0x0, + 0x5, 0xa5, 0x87, 0x44, 0x30, 0x7b, 0x35, 0x7, + 0xd1, 0x7, 0xe7, 0xf, 0xd7, 0xd0, 0x76, 0x84, + 0xe1, 0x43, 0xf0, 0x10, 0x24, 0x16, 0x41, 0xff, + 0xc8, 0xf0, 0x13, 0xf, 0xd0, 0x39, 0xf, 0x68, + 0xd8, 0x7a, 0xd0, 0x61, 0xf5, 0x82, 0xf, 0xd8, + 0x9e, 0xf, 0xf9, 0xf, 0xd1, 0x6, 0x84, 0x51, + 0xf9, 0x20, 0x51, 0x9, 0xc0, /* U+0161 "š" */ 0x7, 0x3, 0xc1, 0xa5, 0x66, 0x19, 0x51, 0x87, - 0xa9, 0x87, 0xe4, 0x3e, 0xbe, 0x83, 0x68, 0x4e, - 0xc, 0x7e, 0x4c, 0x28, 0x28, 0x3a, 0xd, 0xe2, - 0x1e, 0xe, 0x74, 0x78, 0x3a, 0xe1, 0xd0, 0xe7, + 0xa9, 0x87, 0xe4, 0x3e, 0xbe, 0x82, 0x74, 0x27, + 0x4, 0x3f, 0x26, 0x14, 0x14, 0x1d, 0x6, 0xf1, + 0x8f, 0x7, 0xb4, 0x78, 0x3a, 0xe1, 0xd0, 0xe7, 0x48, 0xf0, 0x68, 0x24, 0x82, 0x42, 0x87, 0xe8, - 0x81, 0xa1, 0x3a, 0x0, + 0x81, 0xa1, 0x32, 0x0, /* U+017D "Ž" */ - 0x5, 0x83, 0xc1, 0xa2, 0x86, 0x1d, 0xaa, 0xf, - 0xa8, 0x87, 0xca, 0xd, 0xff, 0xe0, 0xff, 0x7f, - 0xc0, 0x83, 0xc8, 0x10, 0xf4, 0x41, 0xe4, 0x8, - 0x7a, 0x30, 0xf4, 0x21, 0xf2, 0x41, 0xe8, 0x43, - 0xca, 0x20, 0xf4, 0x41, 0xe4, 0x8, 0x7a, 0x20, - 0xf4, 0x28, 0x3c, 0x8f, 0xfc, 0x1f, 0xe0, + 0x3, 0x83, 0xc1, 0xc9, 0xa6, 0x1e, 0xca, 0x7, + 0xea, 0x21, 0xf9, 0x41, 0xdf, 0xfe, 0xf, 0xfe, + 0x7, 0xfc, 0x8, 0x3e, 0x40, 0x87, 0xd1, 0x7, + 0xc8, 0x10, 0xfa, 0x30, 0xfa, 0x10, 0xfc, 0x90, + 0x7d, 0x8, 0x7c, 0xa2, 0xf, 0xa2, 0xf, 0x90, + 0x21, 0xf4, 0x41, 0xf4, 0x4, 0x3e, 0x41, 0xff, + 0x83, 0xfe, /* U+017E "ž" */ - 0x2c, 0x1e, 0x4, 0x71, 0x85, 0x8e, 0x1d, 0xe0, - 0xff, 0xbf, 0xf0, 0x7e, 0xfe, 0x4, 0x19, 0x2, - 0x1a, 0x30, 0xd0, 0x87, 0x24, 0x1a, 0x20, 0xca, - 0x10, 0xd1, 0x6, 0x45, 0x6, 0x87, 0xf8, 0x3f, - 0x0, - - /* U+1E9E "ẞ" */ - 0x5, 0xf4, 0x1d, 0xa1, 0x3a, 0x4, 0x1f, 0x44, - 0x99, 0x4, 0x81, 0x11, 0xb, 0x20, 0xfa, 0x14, - 0x1e, 0x51, 0x7, 0xd8, 0x38, 0x3f, 0xce, 0x1d, - 0x7c, 0x8, 0x3f, 0x42, 0x1f, 0x90, 0xff, 0xe4, - 0xa1, 0xfe, 0x88, 0x27, 0xf0, 0xa0, 0xfd, 0x40, + 0x1c, 0x1c, 0x12, 0xb8, 0x83, 0x43, 0x87, 0xbc, + 0x1f, 0xfc, 0x1f, 0xfe, 0xf, 0xef, 0xe0, 0xa0, + 0xc8, 0x14, 0x1a, 0x4, 0x1a, 0x4, 0x1c, 0x8a, + 0xd, 0x2, 0xc, 0xa2, 0xe, 0x85, 0x6, 0x41, + 0x7, 0x40, 0xff, 0x7, 0xf0, /* U+2022 "•" */ 0x3e, 0x30, 0xb0, 0xff, 0x61, 0x60, /* U+20AC "€" */ - 0xc, 0xdf, 0x41, 0x51, 0x9, 0x2, 0x8b, 0xf0, - 0x32, 0x43, 0xc8, 0x87, 0xff, 0xf, 0xc0, 0xfc, - 0x1f, 0xfc, 0xf, 0x3, 0xf0, 0x3c, 0xf, 0xc1, - 0xff, 0xc0, 0xf0, 0x3f, 0x7, 0xff, 0x9, 0x20, - 0xfa, 0x14, 0x1f, 0x45, 0xf8, 0x27, 0x42, 0x40, + 0xe, 0xbe, 0x42, 0x74, 0x3e, 0x8b, 0xe4, 0x10, + 0xa0, 0xf2, 0x61, 0xfc, 0x87, 0x58, 0x3e, 0x83, + 0xff, 0x81, 0x60, 0xfa, 0x5, 0x83, 0xe8, 0x3f, + 0xf8, 0x16, 0xf, 0xa0, 0xf2, 0x1f, 0x26, 0x1f, + 0x42, 0x83, 0xe8, 0xbe, 0x42, 0x74, 0x30, /* U+E004 "" */ 0xf, 0xfe, 0x6d, 0xe8, 0x3f, 0xf8, 0x3a, 0x7, @@ -2952,364 +2943,363 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 8, .adv_w = 123, .box_w = 5, .box_h = 6, .ofs_x = 2, .ofs_y = 12}, {.bitmap_index = 14, .adv_w = 210, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, {.bitmap_index = 58, .adv_w = 190, .box_w = 10, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 110, .adv_w = 243, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 165, .adv_w = 209, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 212, .adv_w = 67, .box_w = 3, .box_h = 6, .ofs_x = 1, .ofs_y = 12}, - {.bitmap_index = 216, .adv_w = 121, .box_w = 6, .box_h = 26, .ofs_x = 2, .ofs_y = -6}, - {.bitmap_index = 247, .adv_w = 122, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 279, .adv_w = 165, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = 7}, - {.bitmap_index = 304, .adv_w = 191, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 318, .adv_w = 76, .box_w = 5, .box_h = 7, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 328, .adv_w = 95, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 6}, - {.bitmap_index = 330, .adv_w = 101, .box_w = 3, .box_h = 3, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 333, .adv_w = 143, .box_w = 9, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 369, .adv_w = 190, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 397, .adv_w = 190, .box_w = 7, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 410, .adv_w = 190, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 449, .adv_w = 190, .box_w = 9, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 487, .adv_w = 190, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 519, .adv_w = 190, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 560, .adv_w = 190, .box_w = 10, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 600, .adv_w = 190, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 634, .adv_w = 190, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 676, .adv_w = 190, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 714, .adv_w = 90, .box_w = 3, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 723, .adv_w = 78, .box_w = 4, .box_h = 17, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 737, .adv_w = 171, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 758, .adv_w = 184, .box_w = 8, .box_h = 7, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 768, .adv_w = 177, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 792, .adv_w = 162, .box_w = 9, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 824, .adv_w = 295, .box_w = 16, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 905, .adv_w = 221, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 955, .adv_w = 210, .box_w = 10, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 987, .adv_w = 218, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1022, .adv_w = 219, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1048, .adv_w = 191, .box_w = 9, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1066, .adv_w = 185, .box_w = 9, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1081, .adv_w = 227, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1120, .adv_w = 238, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1136, .adv_w = 96, .box_w = 3, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1140, .adv_w = 186, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1160, .adv_w = 209, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1203, .adv_w = 183, .box_w = 9, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1212, .adv_w = 290, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1264, .adv_w = 238, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1304, .adv_w = 231, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1339, .adv_w = 213, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1364, .adv_w = 231, .box_w = 12, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1406, .adv_w = 204, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1442, .adv_w = 199, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1485, .adv_w = 200, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1498, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1516, .adv_w = 215, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1563, .adv_w = 293, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1630, .adv_w = 212, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1683, .adv_w = 202, .box_w = 12, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1717, .adv_w = 201, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1752, .adv_w = 96, .box_w = 4, .box_h = 23, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 1759, .adv_w = 142, .box_w = 9, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1794, .adv_w = 96, .box_w = 5, .box_h = 23, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 1804, .adv_w = 143, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 9}, - {.bitmap_index = 1823, .adv_w = 155, .box_w = 9, .box_h = 2, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1826, .adv_w = 119, .box_w = 6, .box_h = 4, .ofs_x = 0, .ofs_y = 15}, - {.bitmap_index = 1832, .adv_w = 184, .box_w = 9, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1860, .adv_w = 189, .box_w = 10, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1885, .adv_w = 177, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1913, .adv_w = 191, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1941, .adv_w = 180, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1970, .adv_w = 122, .box_w = 7, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1986, .adv_w = 189, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 2022, .adv_w = 185, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2038, .adv_w = 88, .box_w = 3, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2045, .adv_w = 86, .box_w = 5, .box_h = 22, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 2057, .adv_w = 173, .box_w = 10, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2087, .adv_w = 88, .box_w = 3, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2091, .adv_w = 289, .box_w = 15, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2114, .adv_w = 186, .box_w = 9, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2127, .adv_w = 193, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2156, .adv_w = 189, .box_w = 10, .box_h = 18, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 2183, .adv_w = 192, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 2210, .adv_w = 117, .box_w = 5, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2219, .adv_w = 175, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2251, .adv_w = 114, .box_w = 6, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2265, .adv_w = 186, .box_w = 9, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2278, .adv_w = 164, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2308, .adv_w = 250, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2355, .adv_w = 169, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2387, .adv_w = 160, .box_w = 10, .box_h = 18, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 2427, .adv_w = 169, .box_w = 8, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2450, .adv_w = 118, .box_w = 7, .box_h = 24, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 2476, .adv_w = 94, .box_w = 3, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 2481, .adv_w = 118, .box_w = 6, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 2508, .adv_w = 226, .box_w = 11, .box_h = 5, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 2523, .adv_w = 88, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2523, .adv_w = 89, .box_w = 3, .box_h = 17, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 2530, .adv_w = 196, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2564, .adv_w = 143, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 11}, - {.bitmap_index = 2576, .adv_w = 181, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2594, .adv_w = 127, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 2609, .adv_w = 127, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 8}, - {.bitmap_index = 2624, .adv_w = 191, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 2642, .adv_w = 162, .box_w = 9, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 2676, .adv_w = 221, .box_w = 14, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2741, .adv_w = 221, .box_w = 14, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2805, .adv_w = 221, .box_w = 14, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2870, .adv_w = 221, .box_w = 13, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2927, .adv_w = 221, .box_w = 13, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2983, .adv_w = 221, .box_w = 13, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3045, .adv_w = 312, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3109, .adv_w = 218, .box_w = 11, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 3156, .adv_w = 191, .box_w = 9, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3183, .adv_w = 191, .box_w = 9, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3211, .adv_w = 191, .box_w = 9, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3240, .adv_w = 191, .box_w = 9, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3266, .adv_w = 96, .box_w = 6, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3281, .adv_w = 96, .box_w = 6, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3295, .adv_w = 96, .box_w = 7, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3312, .adv_w = 96, .box_w = 8, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 3326, .adv_w = 225, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3363, .adv_w = 238, .box_w = 12, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3416, .adv_w = 231, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3462, .adv_w = 231, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3508, .adv_w = 231, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3554, .adv_w = 231, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3601, .adv_w = 231, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3647, .adv_w = 181, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 3676, .adv_w = 231, .box_w = 13, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3733, .adv_w = 216, .box_w = 11, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3762, .adv_w = 216, .box_w = 11, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3791, .adv_w = 216, .box_w = 11, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3822, .adv_w = 216, .box_w = 11, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3852, .adv_w = 202, .box_w = 12, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3898, .adv_w = 198, .box_w = 10, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3926, .adv_w = 200, .box_w = 10, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3965, .adv_w = 184, .box_w = 9, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4002, .adv_w = 184, .box_w = 9, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4040, .adv_w = 184, .box_w = 9, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4078, .adv_w = 184, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4119, .adv_w = 184, .box_w = 9, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4155, .adv_w = 184, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4194, .adv_w = 280, .box_w = 16, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4244, .adv_w = 177, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 4282, .adv_w = 180, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4321, .adv_w = 180, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4360, .adv_w = 180, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4400, .adv_w = 180, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4438, .adv_w = 90, .box_w = 6, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 4449, .adv_w = 90, .box_w = 6, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4460, .adv_w = 90, .box_w = 7, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4475, .adv_w = 90, .box_w = 8, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 4490, .adv_w = 197, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4533, .adv_w = 186, .box_w = 9, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4558, .adv_w = 193, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4597, .adv_w = 193, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4636, .adv_w = 193, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4676, .adv_w = 193, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4719, .adv_w = 193, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4756, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 4779, .adv_w = 191, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 106, .adv_w = 243, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 161, .adv_w = 209, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 207, .adv_w = 67, .box_w = 3, .box_h = 6, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 211, .adv_w = 121, .box_w = 6, .box_h = 26, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 242, .adv_w = 122, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 274, .adv_w = 165, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = 7}, + {.bitmap_index = 299, .adv_w = 191, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 314, .adv_w = 76, .box_w = 5, .box_h = 7, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 324, .adv_w = 95, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 326, .adv_w = 101, .box_w = 3, .box_h = 3, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 329, .adv_w = 143, .box_w = 9, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 365, .adv_w = 190, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 393, .adv_w = 190, .box_w = 7, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 406, .adv_w = 190, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 445, .adv_w = 190, .box_w = 9, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 483, .adv_w = 190, .box_w = 11, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 517, .adv_w = 190, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 557, .adv_w = 190, .box_w = 10, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 597, .adv_w = 190, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 630, .adv_w = 190, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 670, .adv_w = 190, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 708, .adv_w = 90, .box_w = 3, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 717, .adv_w = 78, .box_w = 4, .box_h = 17, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 731, .adv_w = 171, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 752, .adv_w = 184, .box_w = 8, .box_h = 7, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 762, .adv_w = 177, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 786, .adv_w = 162, .box_w = 9, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 818, .adv_w = 295, .box_w = 16, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 900, .adv_w = 221, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 950, .adv_w = 210, .box_w = 10, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 982, .adv_w = 218, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1017, .adv_w = 219, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1043, .adv_w = 191, .box_w = 9, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1061, .adv_w = 185, .box_w = 9, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1076, .adv_w = 227, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1116, .adv_w = 238, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1132, .adv_w = 96, .box_w = 3, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1136, .adv_w = 186, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1156, .adv_w = 209, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1199, .adv_w = 183, .box_w = 9, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1208, .adv_w = 290, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1260, .adv_w = 238, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1300, .adv_w = 231, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1335, .adv_w = 213, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1358, .adv_w = 231, .box_w = 12, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 1399, .adv_w = 204, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1435, .adv_w = 199, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1477, .adv_w = 200, .box_w = 12, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1492, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1510, .adv_w = 215, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1557, .adv_w = 293, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1624, .adv_w = 212, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1677, .adv_w = 202, .box_w = 12, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1711, .adv_w = 201, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1749, .adv_w = 96, .box_w = 4, .box_h = 23, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 1756, .adv_w = 142, .box_w = 9, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1791, .adv_w = 96, .box_w = 5, .box_h = 23, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1801, .adv_w = 143, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 1820, .adv_w = 155, .box_w = 9, .box_h = 2, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1823, .adv_w = 119, .box_w = 6, .box_h = 4, .ofs_x = 0, .ofs_y = 15}, + {.bitmap_index = 1829, .adv_w = 184, .box_w = 9, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1857, .adv_w = 189, .box_w = 10, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1882, .adv_w = 177, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1910, .adv_w = 191, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1937, .adv_w = 180, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1966, .adv_w = 122, .box_w = 7, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1982, .adv_w = 189, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2017, .adv_w = 185, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2033, .adv_w = 88, .box_w = 3, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2040, .adv_w = 86, .box_w = 5, .box_h = 22, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 2052, .adv_w = 173, .box_w = 10, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2082, .adv_w = 88, .box_w = 3, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2086, .adv_w = 289, .box_w = 15, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2109, .adv_w = 186, .box_w = 9, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2122, .adv_w = 193, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2148, .adv_w = 189, .box_w = 10, .box_h = 18, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 2175, .adv_w = 192, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2202, .adv_w = 117, .box_w = 5, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2210, .adv_w = 175, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2242, .adv_w = 114, .box_w = 6, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2257, .adv_w = 186, .box_w = 9, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2271, .adv_w = 164, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2301, .adv_w = 250, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2346, .adv_w = 169, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2378, .adv_w = 160, .box_w = 10, .box_h = 18, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 2419, .adv_w = 169, .box_w = 9, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2446, .adv_w = 118, .box_w = 6, .box_h = 24, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2472, .adv_w = 94, .box_w = 3, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 2477, .adv_w = 118, .box_w = 6, .box_h = 25, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 2504, .adv_w = 226, .box_w = 11, .box_h = 5, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 2519, .adv_w = 88, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2519, .adv_w = 89, .box_w = 3, .box_h = 17, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 2526, .adv_w = 196, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2558, .adv_w = 143, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 2569, .adv_w = 181, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2590, .adv_w = 127, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 2604, .adv_w = 127, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 2619, .adv_w = 191, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 2637, .adv_w = 162, .box_w = 9, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2671, .adv_w = 221, .box_w = 14, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2736, .adv_w = 221, .box_w = 14, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2800, .adv_w = 221, .box_w = 14, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2864, .adv_w = 221, .box_w = 14, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2928, .adv_w = 221, .box_w = 14, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2988, .adv_w = 221, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3056, .adv_w = 312, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3120, .adv_w = 218, .box_w = 11, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 3166, .adv_w = 191, .box_w = 9, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3193, .adv_w = 191, .box_w = 9, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3221, .adv_w = 191, .box_w = 9, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3250, .adv_w = 191, .box_w = 9, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3275, .adv_w = 96, .box_w = 6, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3290, .adv_w = 96, .box_w = 6, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3305, .adv_w = 96, .box_w = 7, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3322, .adv_w = 96, .box_w = 8, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3336, .adv_w = 225, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3376, .adv_w = 238, .box_w = 12, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3429, .adv_w = 231, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3475, .adv_w = 231, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3521, .adv_w = 231, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3567, .adv_w = 231, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3618, .adv_w = 231, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3664, .adv_w = 181, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 3693, .adv_w = 231, .box_w = 13, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3750, .adv_w = 216, .box_w = 11, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3779, .adv_w = 216, .box_w = 11, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3808, .adv_w = 216, .box_w = 11, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3839, .adv_w = 216, .box_w = 11, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3869, .adv_w = 202, .box_w = 12, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3915, .adv_w = 198, .box_w = 10, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3941, .adv_w = 200, .box_w = 10, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3980, .adv_w = 184, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4017, .adv_w = 184, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4055, .adv_w = 184, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4093, .adv_w = 184, .box_w = 9, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4133, .adv_w = 184, .box_w = 9, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4169, .adv_w = 184, .box_w = 9, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4208, .adv_w = 280, .box_w = 16, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4256, .adv_w = 177, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 4294, .adv_w = 180, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4333, .adv_w = 180, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4372, .adv_w = 180, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4412, .adv_w = 180, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4450, .adv_w = 90, .box_w = 6, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4461, .adv_w = 90, .box_w = 6, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4472, .adv_w = 90, .box_w = 7, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4487, .adv_w = 90, .box_w = 8, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4502, .adv_w = 197, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4545, .adv_w = 186, .box_w = 9, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4570, .adv_w = 193, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4607, .adv_w = 193, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4644, .adv_w = 193, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4681, .adv_w = 193, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4722, .adv_w = 193, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4757, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 4780, .adv_w = 191, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = -2}, {.bitmap_index = 4821, .adv_w = 186, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4844, .adv_w = 186, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4867, .adv_w = 186, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4891, .adv_w = 186, .box_w = 9, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4912, .adv_w = 160, .box_w = 10, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 4963, .adv_w = 195, .box_w = 10, .box_h = 23, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 4994, .adv_w = 160, .box_w = 10, .box_h = 22, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 5044, .adv_w = 227, .box_w = 11, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5095, .adv_w = 189, .box_w = 10, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 5142, .adv_w = 96, .box_w = 3, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5149, .adv_w = 90, .box_w = 3, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5153, .adv_w = 317, .box_w = 17, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5204, .adv_w = 299, .box_w = 17, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5255, .adv_w = 199, .box_w = 11, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 5309, .adv_w = 175, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 5352, .adv_w = 199, .box_w = 11, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5407, .adv_w = 175, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5451, .adv_w = 201, .box_w = 10, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5498, .adv_w = 169, .box_w = 8, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5531, .adv_w = 216, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5571, .adv_w = 130, .box_w = 5, .box_h = 5, .ofs_x = 2, .ofs_y = 6}, - {.bitmap_index = 5577, .adv_w = 190, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5617, .adv_w = 384, .box_w = 18, .box_h = 17, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 5666, .adv_w = 384, .box_w = 20, .box_h = 14, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 5709, .adv_w = 384, .box_w = 18, .box_h = 25, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 5803, .adv_w = 384, .box_w = 24, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5884, .adv_w = 384, .box_w = 16, .box_h = 17, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 5925, .adv_w = 384, .box_w = 17, .box_h = 16, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 5980, .adv_w = 384, .box_w = 17, .box_h = 16, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 6035, .adv_w = 384, .box_w = 16, .box_h = 17, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 6081, .adv_w = 384, .box_w = 12, .box_h = 20, .ofs_x = 6, .ofs_y = -1}, - {.bitmap_index = 6104, .adv_w = 384, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 6159, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6205, .adv_w = 384, .box_w = 13, .box_h = 20, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 6263, .adv_w = 384, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6302, .adv_w = 384, .box_w = 18, .box_h = 17, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 6359, .adv_w = 384, .box_w = 14, .box_h = 24, .ofs_x = 5, .ofs_y = -3}, - {.bitmap_index = 6391, .adv_w = 384, .box_w = 18, .box_h = 14, .ofs_x = 3, .ofs_y = 2}, - {.bitmap_index = 6442, .adv_w = 384, .box_w = 12, .box_h = 8, .ofs_x = 6, .ofs_y = 5}, - {.bitmap_index = 6465, .adv_w = 384, .box_w = 8, .box_h = 12, .ofs_x = 8, .ofs_y = 3}, - {.bitmap_index = 6487, .adv_w = 384, .box_w = 8, .box_h = 12, .ofs_x = 8, .ofs_y = 3}, - {.bitmap_index = 6509, .adv_w = 384, .box_w = 12, .box_h = 8, .ofs_x = 6, .ofs_y = 5}, - {.bitmap_index = 6532, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6618, .adv_w = 384, .box_w = 14, .box_h = 14, .ofs_x = 5, .ofs_y = 2}, - {.bitmap_index = 6662, .adv_w = 384, .box_w = 20, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6707, .adv_w = 384, .box_w = 6, .box_h = 18, .ofs_x = 9, .ofs_y = 0}, - {.bitmap_index = 6733, .adv_w = 384, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 6777, .adv_w = 384, .box_w = 21, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6853, .adv_w = 384, .box_w = 16, .box_h = 19, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 6920, .adv_w = 384, .box_w = 14, .box_h = 20, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 6959, .adv_w = 384, .box_w = 22, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7044, .adv_w = 384, .box_w = 20, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7096, .adv_w = 384, .box_w = 24, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 7139, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7207, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7246, .adv_w = 384, .box_w = 20, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7324, .adv_w = 384, .box_w = 14, .box_h = 20, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 7370, .adv_w = 384, .box_w = 16, .box_h = 22, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 7420, .adv_w = 384, .box_w = 14, .box_h = 2, .ofs_x = 5, .ofs_y = 8}, - {.bitmap_index = 7426, .adv_w = 384, .box_w = 12, .box_h = 14, .ofs_x = 6, .ofs_y = 2}, - {.bitmap_index = 7435, .adv_w = 384, .box_w = 11, .box_h = 15, .ofs_x = 8, .ofs_y = 1}, - {.bitmap_index = 7466, .adv_w = 384, .box_w = 14, .box_h = 14, .ofs_x = 5, .ofs_y = 2}, - {.bitmap_index = 7482, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7540, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7617, .adv_w = 384, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7677, .adv_w = 384, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7756, .adv_w = 384, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 7822, .adv_w = 384, .box_w = 21, .box_h = 20, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 7898, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7967, .adv_w = 384, .box_w = 15, .box_h = 16, .ofs_x = 5, .ofs_y = 1}, - {.bitmap_index = 8008, .adv_w = 384, .box_w = 12, .box_h = 12, .ofs_x = 6, .ofs_y = 3}, - {.bitmap_index = 8035, .adv_w = 384, .box_w = 12, .box_h = 12, .ofs_x = 6, .ofs_y = 3}, - {.bitmap_index = 8062, .adv_w = 384, .box_w = 24, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8118, .adv_w = 384, .box_w = 14, .box_h = 20, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 8175, .adv_w = 384, .box_w = 12, .box_h = 12, .ofs_x = 6, .ofs_y = 3}, - {.bitmap_index = 8183, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8255, .adv_w = 384, .box_w = 24, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 8293, .adv_w = 384, .box_w = 12, .box_h = 20, .ofs_x = 6, .ofs_y = -1}, - {.bitmap_index = 8332, .adv_w = 384, .box_w = 18, .box_h = 22, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 8407, .adv_w = 384, .box_w = 18, .box_h = 24, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 8491, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8556, .adv_w = 384, .box_w = 14, .box_h = 18, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 8603, .adv_w = 384, .box_w = 12, .box_h = 18, .ofs_x = 6, .ofs_y = 0}, - {.bitmap_index = 8644, .adv_w = 384, .box_w = 12, .box_h = 18, .ofs_x = 6, .ofs_y = 0}, - {.bitmap_index = 8693, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8754, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 8853, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 8933, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 9012, .adv_w = 384, .box_w = 22, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9094, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 9158, .adv_w = 384, .box_w = 18, .box_h = 19, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 9219, .adv_w = 384, .box_w = 20, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9289, .adv_w = 384, .box_w = 16, .box_h = 18, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 9337, .adv_w = 384, .box_w = 21, .box_h = 17, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 9400, .adv_w = 384, .box_w = 18, .box_h = 24, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 9486, .adv_w = 384, .box_w = 20, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9543, .adv_w = 384, .box_w = 12, .box_h = 18, .ofs_x = 6, .ofs_y = 0}, - {.bitmap_index = 9568, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 9619, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 9666, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 9713, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 9784, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 9866, .adv_w = 384, .box_w = 17, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 9937, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 10020, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 10088, .adv_w = 384, .box_w = 19, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10145, .adv_w = 384, .box_w = 19, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10206, .adv_w = 384, .box_w = 17, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10254, .adv_w = 384, .box_w = 20, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10322, .adv_w = 384, .box_w = 20, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10353, .adv_w = 384, .box_w = 20, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10386, .adv_w = 384, .box_w = 11, .box_h = 20, .ofs_x = 6, .ofs_y = -1}, - {.bitmap_index = 10416, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 10484, .adv_w = 384, .box_w = 16, .box_h = 18, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 10528, .adv_w = 384, .box_w = 15, .box_h = 20, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 10593, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 10671, .adv_w = 384, .box_w = 18, .box_h = 23, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 10749, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 10815, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 10869, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 10914, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10949, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 11012, .adv_w = 384, .box_w = 20, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 11042, .adv_w = 384, .box_w = 20, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, - {.bitmap_index = 11083, .adv_w = 384, .box_w = 24, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 11152, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 11208, .adv_w = 384, .box_w = 24, .box_h = 25, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11291, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11366, .adv_w = 384, .box_w = 24, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11431, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11509, .adv_w = 264, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 11572, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11685, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11785, .adv_w = 432, .box_w = 27, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11881, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 11961, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12036, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 12116, .adv_w = 384, .box_w = 24, .box_h = 26, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 12231, .adv_w = 192, .box_w = 12, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 12262, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 12324, .adv_w = 432, .box_w = 27, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12445, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12513, .adv_w = 264, .box_w = 16, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 12588, .adv_w = 336, .box_w = 15, .box_h = 23, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 12651, .adv_w = 336, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 12735, .adv_w = 336, .box_w = 21, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 12762, .adv_w = 336, .box_w = 21, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12786, .adv_w = 336, .box_w = 15, .box_h = 23, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 12849, .adv_w = 336, .box_w = 23, .box_h = 22, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 12923, .adv_w = 240, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 12982, .adv_w = 240, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 13042, .adv_w = 336, .box_w = 21, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13088, .adv_w = 336, .box_w = 21, .box_h = 5, .ofs_x = 0, .ofs_y = 7}, - {.bitmap_index = 13101, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13205, .adv_w = 480, .box_w = 31, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 13355, .adv_w = 432, .box_w = 29, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 13474, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13576, .adv_w = 336, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 13634, .adv_w = 336, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 13694, .adv_w = 480, .box_w = 31, .box_h = 19, .ofs_x = -1, .ofs_y = -1}, - {.bitmap_index = 13786, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13817, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 13899, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 14005, .adv_w = 384, .box_w = 22, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14047, .adv_w = 336, .box_w = 22, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14146, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 14201, .adv_w = 336, .box_w = 21, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14257, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 14292, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14356, .adv_w = 240, .box_w = 17, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 14431, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 14499, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 14581, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14648, .adv_w = 384, .box_w = 26, .box_h = 26, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 14745, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 14800, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 14843, .adv_w = 384, .box_w = 24, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14880, .adv_w = 384, .box_w = 20, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 14951, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15071, .adv_w = 384, .box_w = 24, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 15140, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 15182, .adv_w = 384, .box_w = 20, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 15225, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 15253, .adv_w = 480, .box_w = 30, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 15300, .adv_w = 480, .box_w = 30, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 15347, .adv_w = 480, .box_w = 30, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 15393, .adv_w = 480, .box_w = 30, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 15438, .adv_w = 480, .box_w = 30, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 15478, .adv_w = 480, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 15578, .adv_w = 336, .box_w = 19, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 15676, .adv_w = 384, .box_w = 12, .box_h = 20, .ofs_x = 6, .ofs_y = -1}, - {.bitmap_index = 15703, .adv_w = 384, .box_w = 12, .box_h = 20, .ofs_x = 6, .ofs_y = -1}, - {.bitmap_index = 15735, .adv_w = 384, .box_w = 12, .box_h = 20, .ofs_x = 6, .ofs_y = -1}, - {.bitmap_index = 15771, .adv_w = 384, .box_w = 24, .box_h = 15, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 15849, .adv_w = 384, .box_w = 20, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 15904, .adv_w = 384, .box_w = 20, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 15949, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 15998, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 16109, .adv_w = 384, .box_w = 12, .box_h = 24, .ofs_x = 6, .ofs_y = -3}, - {.bitmap_index = 16160, .adv_w = 480, .box_w = 30, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 16252, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 16302, .adv_w = 386, .box_w = 24, .box_h = 16, .ofs_x = 0, .ofs_y = 1} + {.bitmap_index = 4845, .adv_w = 186, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4869, .adv_w = 186, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4892, .adv_w = 186, .box_w = 9, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4913, .adv_w = 160, .box_w = 10, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 4964, .adv_w = 195, .box_w = 10, .box_h = 23, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 4995, .adv_w = 160, .box_w = 10, .box_h = 22, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 5045, .adv_w = 227, .box_w = 12, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5098, .adv_w = 189, .box_w = 10, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 5145, .adv_w = 96, .box_w = 3, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5152, .adv_w = 90, .box_w = 3, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5156, .adv_w = 317, .box_w = 17, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5207, .adv_w = 299, .box_w = 17, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5258, .adv_w = 199, .box_w = 11, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 5310, .adv_w = 175, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 5353, .adv_w = 199, .box_w = 11, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5406, .adv_w = 175, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5450, .adv_w = 201, .box_w = 11, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5500, .adv_w = 169, .box_w = 9, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5537, .adv_w = 130, .box_w = 5, .box_h = 5, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 5543, .adv_w = 190, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5582, .adv_w = 384, .box_w = 18, .box_h = 17, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 5631, .adv_w = 384, .box_w = 20, .box_h = 14, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 5674, .adv_w = 384, .box_w = 18, .box_h = 25, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 5768, .adv_w = 384, .box_w = 24, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5849, .adv_w = 384, .box_w = 16, .box_h = 17, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 5890, .adv_w = 384, .box_w = 17, .box_h = 16, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 5945, .adv_w = 384, .box_w = 17, .box_h = 16, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 6000, .adv_w = 384, .box_w = 16, .box_h = 17, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 6046, .adv_w = 384, .box_w = 12, .box_h = 20, .ofs_x = 6, .ofs_y = -1}, + {.bitmap_index = 6069, .adv_w = 384, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 6124, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6170, .adv_w = 384, .box_w = 13, .box_h = 20, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 6228, .adv_w = 384, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6267, .adv_w = 384, .box_w = 18, .box_h = 17, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 6324, .adv_w = 384, .box_w = 14, .box_h = 24, .ofs_x = 5, .ofs_y = -3}, + {.bitmap_index = 6356, .adv_w = 384, .box_w = 18, .box_h = 14, .ofs_x = 3, .ofs_y = 2}, + {.bitmap_index = 6407, .adv_w = 384, .box_w = 12, .box_h = 8, .ofs_x = 6, .ofs_y = 5}, + {.bitmap_index = 6430, .adv_w = 384, .box_w = 8, .box_h = 12, .ofs_x = 8, .ofs_y = 3}, + {.bitmap_index = 6452, .adv_w = 384, .box_w = 8, .box_h = 12, .ofs_x = 8, .ofs_y = 3}, + {.bitmap_index = 6474, .adv_w = 384, .box_w = 12, .box_h = 8, .ofs_x = 6, .ofs_y = 5}, + {.bitmap_index = 6497, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6583, .adv_w = 384, .box_w = 14, .box_h = 14, .ofs_x = 5, .ofs_y = 2}, + {.bitmap_index = 6627, .adv_w = 384, .box_w = 20, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6672, .adv_w = 384, .box_w = 6, .box_h = 18, .ofs_x = 9, .ofs_y = 0}, + {.bitmap_index = 6698, .adv_w = 384, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 6742, .adv_w = 384, .box_w = 21, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6818, .adv_w = 384, .box_w = 16, .box_h = 19, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 6885, .adv_w = 384, .box_w = 14, .box_h = 20, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 6924, .adv_w = 384, .box_w = 22, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7009, .adv_w = 384, .box_w = 20, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7061, .adv_w = 384, .box_w = 24, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 7104, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7172, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7211, .adv_w = 384, .box_w = 20, .box_h = 19, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7289, .adv_w = 384, .box_w = 14, .box_h = 20, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 7335, .adv_w = 384, .box_w = 16, .box_h = 22, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 7385, .adv_w = 384, .box_w = 14, .box_h = 2, .ofs_x = 5, .ofs_y = 8}, + {.bitmap_index = 7391, .adv_w = 384, .box_w = 12, .box_h = 14, .ofs_x = 6, .ofs_y = 2}, + {.bitmap_index = 7400, .adv_w = 384, .box_w = 11, .box_h = 15, .ofs_x = 8, .ofs_y = 1}, + {.bitmap_index = 7431, .adv_w = 384, .box_w = 14, .box_h = 14, .ofs_x = 5, .ofs_y = 2}, + {.bitmap_index = 7447, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7505, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7582, .adv_w = 384, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7642, .adv_w = 384, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7721, .adv_w = 384, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7787, .adv_w = 384, .box_w = 21, .box_h = 20, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7863, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7932, .adv_w = 384, .box_w = 15, .box_h = 16, .ofs_x = 5, .ofs_y = 1}, + {.bitmap_index = 7973, .adv_w = 384, .box_w = 12, .box_h = 12, .ofs_x = 6, .ofs_y = 3}, + {.bitmap_index = 8000, .adv_w = 384, .box_w = 12, .box_h = 12, .ofs_x = 6, .ofs_y = 3}, + {.bitmap_index = 8027, .adv_w = 384, .box_w = 24, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8083, .adv_w = 384, .box_w = 14, .box_h = 20, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 8140, .adv_w = 384, .box_w = 12, .box_h = 12, .ofs_x = 6, .ofs_y = 3}, + {.bitmap_index = 8148, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8220, .adv_w = 384, .box_w = 24, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8258, .adv_w = 384, .box_w = 12, .box_h = 20, .ofs_x = 6, .ofs_y = -1}, + {.bitmap_index = 8297, .adv_w = 384, .box_w = 18, .box_h = 22, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8372, .adv_w = 384, .box_w = 18, .box_h = 24, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 8456, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8521, .adv_w = 384, .box_w = 14, .box_h = 18, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 8568, .adv_w = 384, .box_w = 12, .box_h = 18, .ofs_x = 6, .ofs_y = 0}, + {.bitmap_index = 8609, .adv_w = 384, .box_w = 12, .box_h = 18, .ofs_x = 6, .ofs_y = 0}, + {.bitmap_index = 8658, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8719, .adv_w = 384, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 8818, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8898, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 8977, .adv_w = 384, .box_w = 22, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9059, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9123, .adv_w = 384, .box_w = 18, .box_h = 19, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 9184, .adv_w = 384, .box_w = 20, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9254, .adv_w = 384, .box_w = 16, .box_h = 18, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 9302, .adv_w = 384, .box_w = 21, .box_h = 17, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 9365, .adv_w = 384, .box_w = 18, .box_h = 24, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 9451, .adv_w = 384, .box_w = 20, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9508, .adv_w = 384, .box_w = 12, .box_h = 18, .ofs_x = 6, .ofs_y = 0}, + {.bitmap_index = 9533, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 9584, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9631, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9678, .adv_w = 384, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 9749, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 9831, .adv_w = 384, .box_w = 17, .box_h = 23, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 9902, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 9985, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 10053, .adv_w = 384, .box_w = 19, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10110, .adv_w = 384, .box_w = 19, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10171, .adv_w = 384, .box_w = 17, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10219, .adv_w = 384, .box_w = 20, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10287, .adv_w = 384, .box_w = 20, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10318, .adv_w = 384, .box_w = 20, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10351, .adv_w = 384, .box_w = 11, .box_h = 20, .ofs_x = 6, .ofs_y = -1}, + {.bitmap_index = 10381, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 10449, .adv_w = 384, .box_w = 16, .box_h = 18, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 10493, .adv_w = 384, .box_w = 15, .box_h = 20, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 10558, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10636, .adv_w = 384, .box_w = 18, .box_h = 23, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 10714, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10780, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 10834, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 10879, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10914, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 10977, .adv_w = 384, .box_w = 20, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11007, .adv_w = 384, .box_w = 20, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 11048, .adv_w = 384, .box_w = 24, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 11117, .adv_w = 384, .box_w = 21, .box_h = 22, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11173, .adv_w = 384, .box_w = 24, .box_h = 25, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11256, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11331, .adv_w = 384, .box_w = 24, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11396, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11474, .adv_w = 264, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 11537, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11650, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11750, .adv_w = 432, .box_w = 27, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11846, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11926, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12001, .adv_w = 384, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 12081, .adv_w = 384, .box_w = 24, .box_h = 26, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 12196, .adv_w = 192, .box_w = 12, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12227, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12289, .adv_w = 432, .box_w = 27, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12410, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12478, .adv_w = 264, .box_w = 16, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12553, .adv_w = 336, .box_w = 15, .box_h = 23, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 12616, .adv_w = 336, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 12700, .adv_w = 336, .box_w = 21, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12727, .adv_w = 336, .box_w = 21, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12751, .adv_w = 336, .box_w = 15, .box_h = 23, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 12814, .adv_w = 336, .box_w = 23, .box_h = 22, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 12888, .adv_w = 240, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 12947, .adv_w = 240, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 13007, .adv_w = 336, .box_w = 21, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13053, .adv_w = 336, .box_w = 21, .box_h = 5, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 13066, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13170, .adv_w = 480, .box_w = 31, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 13320, .adv_w = 432, .box_w = 29, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 13439, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13541, .adv_w = 336, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 13599, .adv_w = 336, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 13659, .adv_w = 480, .box_w = 31, .box_h = 19, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 13751, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13782, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13864, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 13970, .adv_w = 384, .box_w = 22, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14012, .adv_w = 336, .box_w = 22, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14111, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14166, .adv_w = 336, .box_w = 21, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14222, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14257, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14321, .adv_w = 240, .box_w = 17, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 14396, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14464, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14546, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14613, .adv_w = 384, .box_w = 26, .box_h = 26, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 14710, .adv_w = 384, .box_w = 18, .box_h = 20, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 14765, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14808, .adv_w = 384, .box_w = 24, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14845, .adv_w = 384, .box_w = 20, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14916, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15036, .adv_w = 384, .box_w = 24, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 15105, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15147, .adv_w = 384, .box_w = 20, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 15190, .adv_w = 384, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15218, .adv_w = 480, .box_w = 30, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15265, .adv_w = 480, .box_w = 30, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15312, .adv_w = 480, .box_w = 30, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15358, .adv_w = 480, .box_w = 30, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15403, .adv_w = 480, .box_w = 30, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15443, .adv_w = 480, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15543, .adv_w = 336, .box_w = 19, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 15641, .adv_w = 384, .box_w = 12, .box_h = 20, .ofs_x = 6, .ofs_y = -1}, + {.bitmap_index = 15668, .adv_w = 384, .box_w = 12, .box_h = 20, .ofs_x = 6, .ofs_y = -1}, + {.bitmap_index = 15700, .adv_w = 384, .box_w = 12, .box_h = 20, .ofs_x = 6, .ofs_y = -1}, + {.bitmap_index = 15736, .adv_w = 384, .box_w = 24, .box_h = 15, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 15814, .adv_w = 384, .box_w = 20, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 15869, .adv_w = 384, .box_w = 20, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 15914, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15963, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 16074, .adv_w = 384, .box_w = 12, .box_h = 24, .ofs_x = 6, .ofs_y = -3}, + {.bitmap_index = 16125, .adv_w = 480, .box_w = 30, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16217, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16267, .adv_w = 386, .box_w = 24, .box_h = 16, .ofs_x = 0, .ofs_y = 1} }; /*--------------------- @@ -3322,30 +3312,30 @@ static const uint16_t unicode_list_1[] = { static const uint16_t unicode_list_3[] = { 0x0, 0x1, 0x12, 0x13, 0x34, 0x35, 0x40, 0x41, - 0x42, 0x43, 0x5f, 0x60, 0x1d80, 0x1f04, 0x1f8e, 0xdee6, - 0xdef3, 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, - 0xdf7c, 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, - 0xe023, 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, - 0xe0f2, 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, - 0xe20c, 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, - 0xe31a, 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, - 0xe390, 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, - 0xe447, 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, - 0xe48a, 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, - 0xe583, 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, - 0xe5f9, 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, - 0xe7bf, 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, - 0xe952, 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, - 0xeeea, 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, - 0xeefe, 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, - 0xef2a, 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, - 0xef49, 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, - 0xef5b, 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, - 0xefab, 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, - 0xf03d, 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, - 0xf122, 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, - 0xf184, 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, - 0xf43c, 0xf6a4, 0xf784 + 0x42, 0x43, 0x5f, 0x60, 0x1f04, 0x1f8e, 0xdee6, 0xdef3, + 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, 0xdf7c, + 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, 0xe023, + 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, 0xe0f2, + 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, 0xe20c, + 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, 0xe31a, + 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, 0xe390, + 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, 0xe447, + 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, 0xe48a, + 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, 0xe583, + 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, 0xe5f9, + 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, 0xe7bf, + 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, 0xe952, + 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, 0xeeea, + 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, 0xeefe, + 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, 0xef2a, + 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, 0xef49, + 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, 0xef5b, + 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, 0xefab, + 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, 0xf03d, + 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, 0xf122, + 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, 0xf184, + 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, 0xf43c, + 0xf6a4, 0xf784 }; /*Collect the unicode lists and glyph_id offsets*/ @@ -3365,7 +3355,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = }, { .range_start = 286, .range_length = 63365, .glyph_id_start = 169, - .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 195, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 194, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_36_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_36_latin1.c index 9accb93d3..b61fb3431 100644 --- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_36_latin1.c +++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_36_latin1.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 36 px * Bpp: 2 - * Opts: --no-kerning --bpp 2 --size 36 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_36_latin1.c --format lvgl + * Opts: --no-kerning --bpp 2 --size 36 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_36_latin1.c --format lvgl ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -33,100 +33,99 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0023 "#" */ 0xf, 0x7a, 0xb, 0xc8, 0x7f, 0x61, 0xc8, 0x7f, - 0x20, 0x43, 0xf9, 0xf, 0xfe, 0x1e, 0x1d, 0x88, - 0x7f, 0x21, 0x21, 0xfc, 0x98, 0x76, 0x17, 0xe0, - 0x5f, 0x2, 0xf0, 0x7f, 0xf1, 0x57, 0x1, 0x60, - 0x96, 0x2a, 0xc1, 0x52, 0x35, 0x6, 0xc4, 0x24, - 0x3f, 0x90, 0xfb, 0xf, 0xec, 0x3f, 0xf8, 0x68, - 0x72, 0x1e, 0x43, 0x90, 0xf7, 0xd0, 0x3e, 0x81, - 0xf0, 0x7f, 0xf1, 0x56, 0x9, 0x60, 0x96, 0x2a, - 0x5, 0x60, 0x56, 0xf, 0xfe, 0x2, 0x1f, 0xc8, - 0x10, 0xfe, 0x43, 0xff, 0x93, 0x88, 0x7d, 0x88, - 0x48, 0x7f, 0x21, 0xf6, 0x1c, + 0x20, 0x43, 0xf9, 0xf, 0xfe, 0x4e, 0x21, 0xf6, + 0x21, 0xff, 0xc1, 0x43, 0x93, 0xb, 0xf0, 0x1f, + 0x81, 0x78, 0x3f, 0xf8, 0xab, 0x80, 0xb8, 0xb, + 0x15, 0x60, 0xa8, 0x2a, 0x83, 0x61, 0xf2, 0x1f, + 0xc8, 0x49, 0x87, 0xc9, 0x87, 0xff, 0x25, 0xf, + 0xe4, 0x8, 0x7b, 0xf0, 0x3e, 0x81, 0xf0, 0x7f, + 0xf1, 0x56, 0x9, 0x60, 0x96, 0x2a, 0x5, 0x60, + 0x56, 0xf, 0xfe, 0x2, 0x1f, 0xc8, 0x10, 0xfe, + 0x43, 0xff, 0x93, 0x88, 0x7d, 0x88, 0x48, 0x7f, + 0x21, 0xf6, 0x1c, /* U+0024 "$" */ - 0xf, 0x78, 0x3f, 0xfd, 0xe, 0xe, 0xf, 0xb8, - 0x33, 0xa1, 0xb0, 0xfd, 0x4, 0x84, 0xfc, 0x16, - 0xc, 0xc, 0x16, 0x12, 0x20, 0xc3, 0x90, 0x61, - 0x90, 0xec, 0x8, 0x7f, 0xf3, 0x10, 0x21, 0xa0, - 0xf7, 0xa1, 0x2, 0x1f, 0xe8, 0x2d, 0xf, 0xe4, - 0x2b, 0x43, 0xe9, 0xd, 0x68, 0x7a, 0x81, 0xd4, - 0xf, 0x3c, 0x19, 0x83, 0xe7, 0x82, 0x43, 0xf9, - 0x82, 0x83, 0xf9, 0x40, 0x5c, 0x1f, 0x61, 0x54, - 0x1f, 0x21, 0xe4, 0x3f, 0xc8, 0x30, 0xf2, 0x16, - 0x4, 0x3d, 0x2, 0x42, 0xd0, 0x38, 0x49, 0x5, - 0x7a, 0xa, 0x3, 0x87, 0xe9, 0xd, 0xc8, 0x1b, - 0x43, 0xcc, 0x9, 0xf, 0xfe, 0xa0, + 0xf, 0x78, 0x3f, 0xfe, 0xce, 0xe, 0x43, 0xdc, + 0x19, 0xa0, 0x6c, 0x3f, 0x30, 0x10, 0x9f, 0x41, + 0x20, 0x80, 0xc0, 0x70, 0x90, 0xd0, 0x72, 0xc, + 0x3f, 0xd8, 0x10, 0xff, 0x21, 0xff, 0xc2, 0xa8, + 0x41, 0x7, 0x96, 0x30, 0x30, 0x7f, 0x28, 0xe, + 0x87, 0xe9, 0xa, 0xe0, 0xfa, 0x81, 0x9d, 0xf, + 0x3e, 0x42, 0x90, 0xfd, 0x61, 0x41, 0xfe, 0xc2, + 0x83, 0xfd, 0x1, 0xf8, 0x3e, 0x43, 0xff, 0x90, + 0x87, 0x90, 0x90, 0x41, 0xec, 0xc, 0x14, 0x1a, + 0x41, 0x88, 0x1f, 0xc8, 0x14, 0x48, 0x7e, 0x60, + 0xad, 0xc, 0xd0, 0x3d, 0x60, 0xe4, 0x3f, 0xfb, + 0x2a, 0xf, 0x0, /* U+0025 "%" */ 0x5, 0xf4, 0x1f, 0xfc, 0x29, 0x9, 0x83, 0xff, 0x80, 0xa0, 0xe5, 0x7, 0xfd, 0x3, 0xe0, 0x41, 0x90, 0xfd, 0x5, 0x7, 0xac, 0x3e, 0x42, 0x43, 0xa1, 0xf, 0xfe, 0x2a, 0x41, 0xf2, 0x12, 0x1a, - 0x10, 0xf2, 0x40, 0x61, 0x2, 0x41, 0xe8, 0x1e, - 0x81, 0x18, 0x87, 0xe8, 0x39, 0x10, 0x41, 0xf9, - 0x96, 0xa1, 0x10, 0x7f, 0x9a, 0x91, 0x2, 0x1f, - 0xfc, 0x48, 0x81, 0x52, 0x1f, 0xe8, 0xa, 0xd6, - 0xa0, 0x7f, 0x24, 0x41, 0xca, 0xf, 0xa0, 0x30, - 0x2f, 0x3, 0xf, 0x93, 0x12, 0x41, 0x8, 0x7a, - 0x10, 0xc8, 0x48, 0x7c, 0xa2, 0xf, 0xfe, 0x24, - 0x21, 0xff, 0xc4, 0x41, 0x7, 0x21, 0xfe, 0x58, - 0x32, 0x41, 0x41, 0xf5, 0x3, 0x60, 0xf9, 0x20, - 0xff, 0x94, 0x1e, 0x43, 0xff, 0x81, 0x40, 0x9c, - 0x0, + 0x10, 0xf2, 0x41, 0x42, 0x4, 0x83, 0xd8, 0x3e, + 0x6, 0x62, 0x1f, 0x30, 0x72, 0xc0, 0x83, 0xf3, + 0x2d, 0x42, 0x20, 0xff, 0x35, 0x22, 0x4, 0x3f, + 0xf8, 0x91, 0x2, 0xa4, 0x3f, 0xd0, 0x15, 0xad, + 0x40, 0xfe, 0x48, 0x83, 0x94, 0x1f, 0x40, 0x60, + 0x5e, 0x4, 0x1f, 0x26, 0x24, 0x82, 0xf, 0xd0, + 0x86, 0x42, 0x43, 0xe5, 0x10, 0x7f, 0xf1, 0x21, + 0xf, 0xfe, 0x22, 0x8, 0x39, 0xf, 0xf2, 0xc1, + 0x92, 0xa, 0xf, 0xa8, 0x1b, 0x7, 0xc9, 0x7, + 0xfc, 0xa0, 0xf2, 0x1f, 0xfc, 0xa, 0x4, 0xe0, /* U+0026 "&" */ 0xe, 0xbe, 0x83, 0xfe, 0x74, 0x27, 0x43, 0xfa, 0xf, 0xa0, 0xfd, 0x5, 0xf0, 0x50, 0x7c, 0x82, - 0xa, 0x2, 0x1f, 0xe4, 0x24, 0x3f, 0xf8, 0xa8, - 0x7f, 0xf0, 0x50, 0xb0, 0x21, 0xf2, 0xc, 0xa, - 0x4, 0x1f, 0x40, 0x55, 0x1, 0x7, 0xf2, 0x9, - 0x4, 0x87, 0xf4, 0x1d, 0xa1, 0xfe, 0x43, 0x41, - 0xff, 0x30, 0x68, 0x3f, 0xcc, 0x4, 0x2c, 0x2f, - 0x82, 0x81, 0x4c, 0x28, 0x3e, 0x82, 0x41, 0x1, - 0x41, 0xe4, 0x10, 0x4a, 0x4, 0x12, 0x1c, 0x86, - 0x82, 0xc1, 0x87, 0xfd, 0x87, 0x21, 0xc8, 0x79, - 0xa, 0x9, 0x4, 0x1e, 0x83, 0xe8, 0x28, 0x33, - 0x85, 0x6, 0x80, 0xfe, 0x83, 0xa0, 0x98, 0x3f, - 0xb0, 0x28, 0x27, 0x43, 0x36, 0x20, 0x80, + 0xa, 0x2, 0x1f, 0xe4, 0x24, 0x3f, 0xfa, 0xf0, + 0x10, 0xf9, 0x4, 0x5, 0x2, 0xf, 0xb0, 0x25, + 0x1, 0x7, 0xe5, 0x3, 0x41, 0x21, 0xfd, 0x7, + 0x68, 0x7f, 0x90, 0xd0, 0x7f, 0xcc, 0x1a, 0xf, + 0xf3, 0x2, 0xa, 0xb, 0xe0, 0xa0, 0x4c, 0x5, + 0x7, 0xd0, 0x14, 0x21, 0x41, 0xf2, 0xc, 0x2c, + 0x29, 0xf, 0xc8, 0x68, 0xc, 0x4, 0x3f, 0xc8, + 0x7a, 0xe, 0x43, 0xb0, 0xc8, 0x48, 0x20, 0xf2, + 0x16, 0x14, 0x14, 0x1a, 0x42, 0x83, 0x20, 0x7f, + 0x21, 0xd0, 0x52, 0x1f, 0x94, 0x5, 0x5, 0x68, + 0x67, 0xa0, 0x50, /* U+0027 "'" */ 0xf0, 0x7f, 0xf3, 0x40, /* U+0028 "(" */ 0xf, 0x90, 0xfb, 0x83, 0xd8, 0x7d, 0x3, 0xe, - 0x44, 0x3b, 0x4, 0x19, 0x2, 0x1d, 0x82, 0xe, - 0x44, 0x3a, 0x6, 0x1c, 0x81, 0xf, 0xfe, 0xa, + 0x48, 0x3b, 0x2, 0x19, 0x4, 0x1d, 0x81, 0xe, + 0x44, 0x39, 0x6, 0x1d, 0x1, 0xf, 0xfe, 0xa, 0x4, 0x3b, 0xf, 0xfb, 0xe, 0x43, 0xfe, 0x43, 0xff, 0xe4, 0x87, 0x21, 0xfb, 0x6, 0x1f, 0xfc, - 0x24, 0x8, 0x7f, 0xf0, 0xe0, 0x21, 0xc8, 0x20, - 0xf2, 0x1f, 0xa0, 0x41, 0xe4, 0x43, 0xd0, 0x20, - 0xf4, 0x28, 0x39, 0x44, 0x1e, 0x90, 0xfd, 0x60, + 0x24, 0x8, 0x79, 0xf, 0xd8, 0x10, 0xe4, 0x10, + 0x79, 0xf, 0xd0, 0x20, 0xf2, 0x21, 0xe8, 0x10, + 0x7a, 0x14, 0x1c, 0xa2, 0xf, 0x48, 0x7e, 0xb0, /* U+0029 ")" */ 0x43, 0xf7, 0x83, 0xfb, 0xf, 0x40, 0x83, 0xd0, 0xa0, 0xe4, 0x10, 0x7a, 0x2, 0x1c, 0x82, 0xf, 0x20, 0x43, 0xb0, 0x61, 0xc8, 0x10, 0xff, 0xe1, 0xa0, 0x43, 0xb0, 0x61, 0xf9, 0xe, 0x43, 0xff, - 0xfe, 0x1c, 0x87, 0xfc, 0x87, 0x60, 0xc3, 0x90, - 0x21, 0xff, 0xc1, 0x40, 0x87, 0x60, 0x83, 0x90, - 0xf9, 0x4, 0x1d, 0x1, 0xc, 0x83, 0xe, 0x88, - 0x3b, 0x14, 0x1c, 0x90, 0x7a, 0xc3, 0xe0, + 0xfe, 0x1c, 0x81, 0xf, 0xfe, 0x16, 0xc, 0x39, + 0x2, 0x1f, 0xfc, 0x14, 0x8, 0x76, 0x8, 0x39, + 0x10, 0xe4, 0x18, 0x74, 0x28, 0x32, 0x8, 0x3a, + 0x20, 0xec, 0x50, 0x72, 0x41, 0xeb, 0xf, 0x80, /* U+002A "*" */ - 0xf, 0xbe, 0xf, 0xff, 0x5a, 0x83, 0xfe, 0x41, - 0xdc, 0x87, 0x37, 0x22, 0x6, 0xc2, 0xe4, 0x19, - 0xc8, 0x7f, 0x98, 0xd, 0xc1, 0xd7, 0xa0, 0xff, - 0xe0, 0x21, 0xfd, 0x1, 0x4, 0x1f, 0xb0, 0x50, - 0xa, 0xf, 0x40, 0x51, 0x82, 0xf, 0x20, 0x82, - 0x41, 0x7, 0x64, 0x1a, 0x18, 0x3d, 0xa1, 0xdc, - 0x10, + 0xf, 0xbe, 0xf, 0xff, 0x7a, 0x83, 0xfe, 0x42, + 0xee, 0x43, 0xd7, 0x40, 0x20, 0x6c, 0x2f, 0x20, + 0x41, 0xc8, 0x7f, 0x98, 0x26, 0xe0, 0xe7, 0xd2, + 0x1f, 0xfc, 0x8, 0x3f, 0xd0, 0x10, 0x61, 0xfd, + 0x82, 0x88, 0x20, 0xfa, 0x9, 0x20, 0x28, 0x3c, + 0x83, 0xa, 0x4, 0x1e, 0xc8, 0x32, 0x8c, 0x3e, + 0xd0, 0xeb, 0xc, /* U+002B "+" */ 0xf, 0x7c, 0x1f, 0xff, 0xf0, 0xff, 0xec, 0x57, - 0x61, 0x57, 0x97, 0x83, 0x2f, 0x83, 0xff, 0x87, - 0xfe, 0xb, 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xe9, - 0x0, + 0x82, 0xeb, 0x97, 0xc1, 0x97, 0x83, 0xff, 0x87, + 0xfe, 0xb, 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xec, + 0x2c, 0x1e, /* U+002C "," */ 0x7, 0xc1, 0xff, 0xce, 0x40, 0x82, 0x4, 0x20, @@ -151,78 +150,79 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xa0, 0xfe, /* U+0030 "0" */ - 0xd, 0x7e, 0x83, 0xed, 0xc, 0xe8, 0x6c, 0x3f, - 0x41, 0x41, 0x7e, 0xb, 0x2, 0xc, 0x36, 0x19, - 0x2, 0x1f, 0xce, 0xc, 0x3d, 0x3, 0x43, 0xff, - 0x80, 0x84, 0x87, 0x90, 0xff, 0xff, 0x87, 0xff, - 0xb5, 0xf, 0x21, 0x20, 0xc3, 0xf9, 0xc0, 0x87, - 0xb0, 0x68, 0x7f, 0x20, 0x44, 0x18, 0x6c, 0x8, - 0x20, 0xbf, 0x5, 0x5, 0x87, 0xec, 0x3b, 0x43, - 0x38, 0x40, + 0xd, 0x7e, 0x83, 0xce, 0x86, 0x74, 0x34, 0x1f, + 0xa0, 0xa0, 0xbf, 0x5, 0x1, 0x6, 0x1b, 0x2, + 0x20, 0x43, 0xc8, 0x1c, 0x18, 0x7b, 0x6, 0x87, + 0xff, 0x1, 0x9, 0xf, 0x21, 0xff, 0xff, 0xf, + 0xff, 0x6a, 0x1e, 0x42, 0x43, 0xff, 0x80, 0xe0, + 0x83, 0xd8, 0x34, 0x3f, 0x90, 0x22, 0xc, 0x36, + 0x4, 0x10, 0x5f, 0x82, 0x82, 0x83, 0xf4, 0x19, + 0xd0, 0xce, 0x80, /* U+0031 "1" */ - 0xf, 0x9c, 0x3d, 0x70, 0x67, 0xc8, 0x67, 0x83, + 0xf, 0xac, 0x3d, 0x68, 0x67, 0xc8, 0x67, 0x83, 0xec, 0x34, 0x1e, 0x7c, 0x86, 0xb8, 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xf, 0xff, 0x18, /* U+0032 "2" */ 0xd, 0x7e, 0x90, 0xf3, 0xa1, 0x9a, 0x6, 0x60, 0xfc, 0xc1, 0x40, 0x7f, 0x20, 0x50, 0x85, 0x6, - 0x82, 0xcc, 0x8, 0x7a, 0x2, 0x20, 0xc3, 0xc8, - 0x7c, 0x87, 0xfd, 0xf0, 0x7c, 0x87, 0xff, 0xb, - 0x2, 0x1f, 0xf2, 0x8, 0x3f, 0xc8, 0x7f, 0xf0, - 0xa0, 0x61, 0xfe, 0x80, 0x87, 0xf9, 0x40, 0x83, - 0xfd, 0x3, 0xf, 0xf6, 0x8, 0x3f, 0xd0, 0x14, - 0x1f, 0xca, 0x4, 0x1f, 0xe8, 0x18, 0x7f, 0xa0, - 0x41, 0xfe, 0x50, 0xa0, 0xff, 0x40, 0x83, 0xfd, - 0x85, 0x5f, 0xe0, 0xe5, 0xff, 0x7, 0xff, 0xc, + 0x82, 0xcc, 0x10, 0x7a, 0x2, 0x20, 0x43, 0xc8, + 0x7f, 0xf1, 0xfe, 0xf, 0xfe, 0x52, 0x4, 0x3f, + 0xe8, 0x10, 0x7f, 0x90, 0xff, 0xe1, 0x40, 0xc3, + 0xfd, 0x1, 0xf, 0xf2, 0x81, 0x7, 0xfa, 0x6, + 0x1f, 0xec, 0x10, 0x7f, 0xa0, 0x28, 0x3f, 0x94, + 0x8, 0x3f, 0xd0, 0x30, 0xff, 0x40, 0x83, 0xfc, + 0xa1, 0x41, 0xfe, 0x86, 0xf, 0xf6, 0x6, 0xbf, + 0xc1, 0xcb, 0xfe, 0xf, 0xfe, 0x18, /* U+0033 "3" */ 0x9, 0xbf, 0x21, 0xea, 0x21, 0xac, 0x34, 0x87, - 0xec, 0x24, 0x17, 0xe0, 0x92, 0x2, 0x83, 0x40, - 0x84, 0x18, 0x72, 0x1f, 0x21, 0xfe, 0xf8, 0x3f, - 0xf9, 0x8, 0x7f, 0xf0, 0x60, 0x41, 0xfd, 0x4, - 0x87, 0x7e, 0x41, 0x87, 0xff, 0x2, 0xf, 0x94, - 0x1a, 0xc3, 0xd4, 0xf8, 0x2c, 0x3f, 0xd8, 0x48, - 0x7f, 0xa0, 0x61, 0xfe, 0x40, 0x87, 0xff, 0xb, - 0xe0, 0xff, 0xe1, 0x21, 0xe4, 0x24, 0x10, 0x7a, - 0x3, 0x5, 0x6, 0x82, 0x84, 0xf, 0xe4, 0x10, - 0x24, 0x3f, 0x48, 0x56, 0x86, 0x74, 0x0, + 0xec, 0x24, 0x17, 0xd0, 0x49, 0x1, 0x41, 0x30, + 0x21, 0x6, 0x1c, 0x87, 0xc8, 0x7f, 0xbe, 0xf, + 0xfe, 0xb4, 0x4, 0x3f, 0xa4, 0x10, 0x75, 0xf2, + 0x8, 0x3c, 0x87, 0x28, 0x3f, 0xf8, 0xe, 0x1e, + 0xfd, 0x5, 0x87, 0xf3, 0x84, 0x87, 0xfa, 0x4, + 0x1f, 0xe4, 0x3f, 0xf8, 0xbf, 0x7, 0xff, 0x9, + 0xf, 0x21, 0x20, 0x83, 0xd0, 0x18, 0x28, 0x34, + 0x14, 0x20, 0x7f, 0x20, 0x81, 0x21, 0xfa, 0x42, + 0xb4, 0x33, 0xa0, /* U+0034 "4" */ - 0xf, 0xeb, 0xe0, 0xff, 0xe0, 0x21, 0xff, 0xc2, - 0x83, 0xff, 0x86, 0x87, 0xff, 0xb, 0xf, 0xfe, - 0x12, 0x4, 0x3f, 0xf8, 0x10, 0x20, 0xff, 0x90, - 0x41, 0xff, 0xc0, 0x80, 0x87, 0xfc, 0x82, 0xf, - 0xfe, 0x4, 0x4, 0x3f, 0xe8, 0x10, 0x7f, 0xf0, - 0x10, 0x21, 0xff, 0x40, 0x83, 0xff, 0x80, 0x81, - 0xf, 0xfb, 0x4, 0x1f, 0xf2, 0x12, 0x1f, 0xf4, - 0x17, 0xf8, 0x2f, 0x83, 0xff, 0xa9, 0xff, 0xe0, - 0xbe, 0xf, 0xff, 0xf8, 0x70, + 0xf, 0xe7, 0xe0, 0xff, 0xe0, 0x41, 0xff, 0xc2, + 0x43, 0xff, 0x87, 0x7, 0xff, 0xa, 0xf, 0xfe, + 0x1a, 0x21, 0xff, 0xc0, 0x81, 0x7, 0xff, 0x1, + 0x10, 0xff, 0xe0, 0x40, 0x83, 0xff, 0x80, 0x88, + 0x7f, 0xf0, 0x20, 0x41, 0xff, 0xc0, 0x44, 0x3f, + 0xf8, 0x10, 0x20, 0xff, 0x94, 0x21, 0xff, 0xc0, + 0x81, 0x7, 0xfc, 0x81, 0xf, 0xfe, 0x4, 0x8, + 0x3f, 0xe4, 0x2f, 0xf0, 0x5f, 0x83, 0xff, 0x87, + 0x87, 0xff, 0xd, 0xff, 0xe0, 0xbe, 0xf, 0xff, + 0xf8, 0x70, /* U+0035 "5" */ 0x7, 0xff, 0xc8, 0x7f, 0xf2, 0x57, 0xf0, 0x7d, 0x5f, 0x90, 0xe4, 0x3f, 0xf9, 0xc8, 0x7f, 0xf1, 0x70, 0xff, 0xb0, 0x9a, 0x90, 0xfe, 0xa2, 0xd6, - 0x87, 0xff, 0xa, 0x42, 0x42, 0xbd, 0x5, 0x5, - 0xce, 0x81, 0x82, 0x42, 0x60, 0xe5, 0x3, 0xf, - 0xfb, 0x2, 0x1f, 0xf2, 0x1f, 0xfd, 0x65, 0x83, - 0xff, 0x83, 0x44, 0x3f, 0xf8, 0x58, 0x7a, 0x2, + 0x87, 0xff, 0xa, 0x42, 0x42, 0xfa, 0xa, 0xb, + 0x9c, 0x26, 0x9, 0x9, 0x83, 0x94, 0xc, 0x3f, + 0xec, 0x8, 0x7f, 0xc8, 0x7f, 0xf5, 0x96, 0xf, + 0xfe, 0x7, 0x44, 0x3f, 0xec, 0x18, 0x7a, 0x2, 0x20, 0x43, 0xc8, 0x30, 0x20, 0xc3, 0x61, 0x20, 0x82, 0xfc, 0x14, 0x1b, 0xf, 0xd2, 0x1d, 0xc1, 0x9d, 0x8, /* U+0036 "6" */ - 0xf, 0x37, 0xc1, 0xf3, 0xc8, 0x7f, 0x30, 0x72, - 0x1c, 0xc0, 0x7e, 0x83, 0xa0, 0x50, 0x3f, 0x20, - 0x50, 0x7f, 0x40, 0x83, 0xff, 0x80, 0x87, 0xf9, - 0x6, 0x35, 0x21, 0xb0, 0xb9, 0x6b, 0xf, 0x41, - 0xf6, 0x4, 0x35, 0xe8, 0x28, 0x3a, 0x40, 0xc0, - 0x43, 0x28, 0x32, 0x14, 0x14, 0x1e, 0x83, 0xff, - 0x88, 0x87, 0xf9, 0xf, 0xfe, 0x42, 0x1e, 0x42, - 0x41, 0x87, 0xfb, 0x2, 0x1e, 0xc0, 0xa0, 0x90, - 0xe4, 0x11, 0x2, 0x42, 0xc0, 0x81, 0xa, 0xf8, - 0x28, 0x2c, 0x3f, 0x41, 0xdc, 0x19, 0xd0, 0x0, + 0xf, 0x37, 0xc1, 0xf3, 0xc8, 0x7f, 0x50, 0x39, + 0xe, 0x50, 0x57, 0xa0, 0xe8, 0xe, 0x87, 0xd0, + 0x18, 0x3f, 0x90, 0x41, 0xff, 0xcb, 0x40, 0x8d, + 0x48, 0x6c, 0x1d, 0x16, 0xb4, 0x8, 0x24, 0x3d, + 0x7, 0xd7, 0xa0, 0xb0, 0xe9, 0x3, 0x7, 0xca, + 0xc, 0x85, 0x5, 0x7, 0xa0, 0x21, 0xfe, 0x43, + 0xff, 0xac, 0x87, 0xf9, 0x6, 0x1e, 0x42, 0xc0, + 0x87, 0xb0, 0x28, 0x24, 0x39, 0x4, 0x20, 0x90, + 0xb0, 0xe8, 0x2b, 0xe0, 0xb0, 0xb0, 0xfd, 0x7, + 0x70, 0x67, 0x40, /* U+0037 "7" */ 0xff, 0xfe, 0x18, 0x7f, 0xf0, 0xd7, 0xfe, 0xd, @@ -237,16 +237,16 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xa, 0xf, 0xc0, /* U+0038 "8" */ - 0xc, 0xfe, 0x83, 0xee, 0xc, 0xe1, 0xd8, 0x7e, - 0xc2, 0x82, 0xfc, 0x14, 0x4, 0x8, 0x64, 0x8, - 0x74, 0x1a, 0xf, 0xff, 0x1a, 0x8, 0x34, 0x4, - 0x10, 0x14, 0x5, 0x2, 0xb, 0x5, 0xe8, 0x18, - 0x74, 0x1e, 0x83, 0xa8, 0x1e, 0xa0, 0x52, 0x3f, - 0x80, 0xc2, 0x81, 0x6, 0xc0, 0x98, 0x20, 0xf4, - 0x9, 0x2, 0x1e, 0x40, 0x87, 0xff, 0x15, 0xf, - 0xfe, 0x42, 0x12, 0x8, 0x3d, 0x1, 0x82, 0x83, - 0x41, 0x42, 0x7, 0xf2, 0x8, 0x14, 0xf, 0xd2, - 0x13, 0xa1, 0x9d, 0x0, + 0xd, 0x7e, 0x83, 0xed, 0xc, 0xe1, 0xd8, 0x7e, + 0xc2, 0x82, 0xfc, 0x14, 0x4, 0x10, 0x68, 0x8, + 0x72, 0x19, 0xf, 0xfe, 0xc2, 0x19, 0xe, 0x41, + 0x6, 0x80, 0x82, 0xb, 0x56, 0x14, 0x16, 0x15, + 0x2, 0xc3, 0x21, 0xff, 0xc0, 0x60, 0x94, 0x16, + 0x82, 0x3, 0xd3, 0x41, 0x8, 0x50, 0x68, 0x26, + 0x4, 0x1e, 0x81, 0x4, 0x87, 0x90, 0xff, 0xeb, + 0x21, 0xe4, 0x24, 0x10, 0x7a, 0x3, 0x5, 0x6, + 0x82, 0x88, 0xf, 0xe4, 0x10, 0x18, 0x3f, 0x48, + 0x4e, 0x86, 0x74, 0x0, /* U+0039 "9" */ 0xd, 0x7e, 0x43, 0xce, 0x86, 0xb0, 0xe8, 0x3f, @@ -254,11 +254,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc0, 0x87, 0x21, 0x28, 0x18, 0x79, 0x6, 0x12, 0x1e, 0xc0, 0x87, 0xf9, 0xf, 0xfe, 0x42, 0x1f, 0xe4, 0x18, 0x79, 0xb, 0x2, 0x1e, 0x82, 0x42, - 0xc2, 0x70, 0xe8, 0x2f, 0xa0, 0xf2, 0x83, 0xe8, - 0x3a, 0x88, 0x56, 0x12, 0x13, 0x7c, 0x86, 0xc3, - 0xfd, 0x87, 0xff, 0x5, 0x2, 0x1f, 0xd0, 0x10, - 0xfe, 0x50, 0x20, 0xfd, 0x40, 0x21, 0xd7, 0xc8, - 0x18, 0x39, 0xe, 0xa0, 0x7f, 0x36, 0x86, + 0xc3, 0x61, 0xd0, 0x5f, 0x83, 0xca, 0xf, 0xa0, + 0xea, 0x21, 0x38, 0x48, 0x4d, 0xf4, 0x1f, 0xfc, + 0x3c, 0x18, 0x7f, 0x90, 0x21, 0xfd, 0x1, 0xf, + 0xe5, 0x2, 0xf, 0xd4, 0x2, 0x1d, 0x7c, 0x81, + 0x83, 0x90, 0xea, 0x7, 0xf3, 0x68, 0x60, /* U+003A ":" */ 0x7c, 0xc0, 0x83, 0x40, 0x9f, 0x21, 0xff, 0xe0, @@ -266,8 +266,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+003B ";" */ 0x3, 0xe4, 0x10, 0x20, 0xfd, 0x2, 0x3, 0xe4, - 0x3f, 0xff, 0x3f, 0x7, 0xff, 0x21, 0x2, 0xc, - 0x18, 0x10, 0x26, 0x8, 0x10, 0xa0, 0x3c, 0x0, + 0x3f, 0xff, 0x3f, 0x7, 0xff, 0x21, 0xe, 0xc1, + 0x1, 0x2, 0x60, 0x41, 0xc, 0x7, 0x80, /* U+003C "<" */ 0xf, 0xfa, 0xf, 0xe7, 0x43, 0xe7, 0x83, 0xf7, @@ -284,7 +284,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+003E ">" */ 0x83, 0xff, 0x80, 0xf0, 0x7f, 0xf0, 0x1d, 0xf, - 0xfe, 0x5, 0xa1, 0xef, 0x21, 0x5a, 0x1e, 0xb4, + 0xfe, 0x5, 0xa1, 0xee, 0x42, 0xb4, 0x39, 0xb4, 0x2a, 0x7, 0xd6, 0x81, 0xe0, 0xfa, 0xd0, 0x30, 0x7e, 0xc3, 0xfc, 0xf0, 0x58, 0x67, 0x82, 0x74, 0xf, 0x4, 0xf0, 0x1e, 0xd, 0x40, 0xd0, 0x6b, @@ -295,73 +295,72 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x9, 0xfd, 0x7, 0xb8, 0x33, 0xa1, 0x61, 0xfa, 0x2, 0x15, 0xf0, 0x51, 0x2, 0x42, 0x80, 0x86, 0x43, 0x21, 0xbe, 0xf, 0xfe, 0x9a, 0x1f, 0xfc, - 0x8, 0x8, 0x7e, 0x82, 0x83, 0xe5, 0x2, 0xf, + 0x8, 0x10, 0x7e, 0x82, 0x43, 0xe5, 0x2, 0xf, 0xd0, 0x14, 0x1f, 0x61, 0x41, 0xf2, 0x16, 0x1f, 0xb0, 0x21, 0xfc, 0x83, 0xf, 0xfe, 0x2, 0x1f, 0xd5, 0x7, 0xf9, 0x60, 0xff, 0xec, 0x3c, 0x1f, 0xe8, 0x43, 0xff, 0x97, 0x8, 0x78, /* U+0040 "@" */ - 0xf, 0xcd, 0xfd, 0x7, 0xff, 0xf, 0x90, 0xe7, - 0xc1, 0xff, 0x38, 0x7f, 0xda, 0x1f, 0x98, 0xf, - 0xfa, 0x41, 0x21, 0xe6, 0x7, 0x7, 0x9a, 0x2, - 0xf, 0x40, 0xc3, 0xfc, 0xe0, 0x83, 0x40, 0xc3, - 0xff, 0x83, 0x8, 0x64, 0x83, 0xcd, 0x10, 0xc8, - 0x10, 0x20, 0x43, 0xb9, 0x56, 0x1a, 0x20, 0x44, - 0x1d, 0x87, 0xb0, 0x90, 0xf2, 0x1a, 0x3, 0xe4, - 0x3c, 0x8a, 0xf, 0x91, 0x81, 0x87, 0xef, 0x8, - 0x64, 0x10, 0x58, 0x7b, 0xd, 0x86, 0x84, 0x3c, - 0x87, 0x94, 0x1f, 0xb0, 0xff, 0x90, 0xc8, 0x48, - 0x10, 0xff, 0xe8, 0x26, 0x1f, 0xfc, 0x1c, 0x3f, - 0xfa, 0xa8, 0x64, 0x32, 0x1f, 0xfc, 0x6c, 0x43, - 0xff, 0x92, 0x9a, 0x61, 0x60, 0x42, 0x80, 0x84, - 0x81, 0xf, 0x20, 0x80, 0xa0, 0x41, 0x41, 0x62, - 0x1f, 0x7a, 0x10, 0x7c, 0xc, 0x43, 0xd0, 0x77, - 0x7, 0xa0, 0xe8, 0x26, 0xb, 0x6, 0x81, 0x90, - 0xa1, 0xc, 0xfc, 0x1a, 0xf4, 0x86, 0x41, 0x7, - 0xff, 0x25, 0x14, 0x1f, 0xfc, 0x88, 0x12, 0x1f, - 0xfc, 0x88, 0x14, 0x43, 0xd2, 0x1f, 0xe6, 0x3, - 0x7f, 0x9c, 0x3f, 0xe7, 0xf, 0xf6, 0x1f, 0xfc, - 0x1e, 0x43, 0xad, 0xf, 0x80, + 0xf, 0xeb, 0xfa, 0x43, 0xff, 0x85, 0x68, 0x73, + 0x61, 0xff, 0x3a, 0x19, 0xe, 0xd0, 0xfc, 0xc0, + 0x7e, 0xbe, 0x41, 0x21, 0xf4, 0xe, 0xf, 0xac, + 0x10, 0x7b, 0x6, 0x1f, 0xf6, 0xc, 0x32, 0xc, + 0x3f, 0xf8, 0x38, 0x10, 0xa2, 0xf, 0x34, 0x43, + 0x93, 0x2, 0x4, 0x3b, 0x95, 0x61, 0xb1, 0x4, + 0x21, 0xd8, 0x7b, 0x9, 0x2, 0x14, 0x1a, 0x3, + 0xe4, 0x3c, 0x81, 0xf, 0x91, 0x81, 0x87, 0xb3, + 0xc2, 0x1a, 0x4, 0x16, 0x1f, 0x90, 0x61, 0x90, + 0xff, 0xe0, 0xa0, 0x43, 0xf2, 0x1e, 0x43, 0xf9, + 0x9, 0x6, 0x19, 0xf, 0xfe, 0x32, 0x1f, 0xfc, + 0x8c, 0x3f, 0xb0, 0xff, 0xf4, 0x22, 0x4, 0x3f, + 0xc8, 0x7d, 0x98, 0x7f, 0x21, 0x61, 0xf2, 0x28, + 0xc2, 0xc1, 0x1, 0x40, 0xc2, 0x84, 0xc4, 0x24, + 0x2f, 0x42, 0x28, 0x92, 0x10, 0xf4, 0x1d, 0xc0, + 0xb4, 0x83, 0x90, 0x98, 0xe, 0x8, 0x27, 0x42, + 0x48, 0x33, 0xe8, 0x27, 0xe8, 0x3a, 0x2, 0x1f, + 0xfc, 0x94, 0x83, 0xff, 0x93, 0x3, 0x43, 0xff, + 0x91, 0x2, 0x81, 0xf5, 0x3, 0xfc, 0xc0, 0x7e, + 0xbe, 0x50, 0x7f, 0xce, 0x1c, 0x86, 0x83, 0xff, + 0x83, 0xc8, 0x75, 0xa1, 0xf0, /* U+0041 "A" */ - 0xf, 0xef, 0x83, 0xff, 0x8a, 0x84, 0x87, 0xff, - 0x12, 0xb, 0xf, 0xfe, 0x42, 0x1f, 0xfc, 0x34, - 0x3f, 0xf9, 0x18, 0x20, 0x41, 0xff, 0xc2, 0x40, - 0x81, 0xf, 0xfe, 0xa, 0x8, 0x43, 0xff, 0x87, - 0x81, 0x30, 0x21, 0xff, 0xc0, 0x43, 0x20, 0x83, - 0xfe, 0x40, 0x87, 0xff, 0x17, 0x6, 0x12, 0x4, - 0x3f, 0xc8, 0x10, 0xa0, 0x61, 0xfc, 0x81, 0xf, - 0x90, 0xfe, 0xc1, 0x87, 0x20, 0x43, 0xf2, 0x4, - 0x3b, 0x6, 0x1f, 0xf7, 0xfa, 0x2, 0x1f, 0x41, - 0xff, 0xc1, 0x43, 0xc8, 0x7f, 0xf0, 0x70, 0xfe, - 0xff, 0xe0, 0x21, 0xd0, 0x10, 0xff, 0xe0, 0x21, - 0x90, 0x61, 0xfc, 0x83, 0xf, 0x90, 0xfe, 0xc0, - 0x84, 0x87, 0xff, 0x5, 0xf, 0x40, 0x83, 0xfe, - 0x41, 0x7, 0x21, 0xff, 0x60, 0x40, + 0xf, 0xef, 0x83, 0xff, 0x88, 0x87, 0xff, 0x1e, + 0x9, 0xf, 0xfe, 0x3e, 0x1f, 0xfc, 0x24, 0x32, + 0x1f, 0xfc, 0x28, 0x10, 0x7f, 0xf1, 0x94, 0x8, + 0x3f, 0xf8, 0x8, 0x30, 0x90, 0xff, 0xe0, 0x40, + 0x44, 0x3f, 0xf8, 0xf8, 0x10, 0xff, 0x20, 0x80, + 0x83, 0xf, 0xf4, 0x4, 0x39, 0xf, 0xfe, 0x2a, + 0x4, 0x3f, 0x20, 0x43, 0x60, 0xc3, 0xf4, 0x8, + 0x32, 0x4, 0x3f, 0xf8, 0xa8, 0x7f, 0x21, 0x7f, + 0x90, 0x21, 0xe8, 0x3f, 0xf8, 0x10, 0x7f, 0xf3, + 0x50, 0x3f, 0xf9, 0x2, 0x1a, 0x6, 0x1f, 0xb0, + 0x61, 0xf2, 0x1f, 0x90, 0x21, 0x21, 0xff, 0xc4, + 0x41, 0x2, 0xf, 0xf2, 0xc, 0x39, 0xf, 0xf6, + 0x4, 0x43, 0xff, 0x84, 0x86, /* U+0042 "B" */ 0xff, 0xe9, 0xf, 0xfe, 0xb, 0x61, 0xf2, 0xc1, - 0xd8, 0x77, 0x57, 0xa0, 0xa0, 0xff, 0x28, 0x8, - 0x7f, 0xd0, 0x7f, 0xf8, 0x10, 0xff, 0xe1, 0x40, - 0x43, 0xfd, 0x5, 0x6, 0xff, 0x20, 0xc3, 0xff, - 0x82, 0x87, 0xcb, 0x82, 0x70, 0xee, 0xb7, 0x90, - 0x61, 0xff, 0x48, 0x10, 0xff, 0xb0, 0x41, 0xff, - 0x21, 0xff, 0xe0, 0x43, 0xff, 0x85, 0x1, 0xf, - 0xf4, 0x14, 0x17, 0x5b, 0xc8, 0x20, 0xe5, 0xc1, - 0xa4, 0x3f, 0xe7, 0x40, + 0xd8, 0x77, 0x57, 0xa0, 0xa0, 0xff, 0x30, 0x10, + 0xff, 0x90, 0xff, 0xf0, 0x21, 0xff, 0xc2, 0x80, + 0x87, 0xfa, 0xa, 0xd, 0xfe, 0x41, 0x87, 0xff, + 0x5, 0xf, 0xfe, 0x13, 0x87, 0x7f, 0xc8, 0x30, + 0xff, 0xa0, 0x90, 0xff, 0xa0, 0x41, 0xff, 0x21, + 0xff, 0xe0, 0x43, 0xff, 0x85, 0x1, 0xf, 0xf4, + 0x14, 0x17, 0x5b, 0xc8, 0x20, 0xe5, 0xc1, 0xa4, + 0x3f, 0xe7, 0x40, /* U+0043 "C" */ 0xe, 0x7f, 0xa0, 0xfc, 0xf0, 0x73, 0xa1, 0xcc, - 0x1f, 0xd2, 0x1a, 0x3, 0xfc, 0x82, 0xa, 0x3, - 0x7, 0x41, 0x20, 0x41, 0x7, 0xd0, 0x21, 0x2, - 0x1f, 0x90, 0xd8, 0x30, 0xff, 0xe0, 0xa1, 0xff, - 0xc0, 0xa8, 0x32, 0x1f, 0xcb, 0x7, 0xff, 0xfc, - 0x3f, 0xfc, 0x88, 0x7f, 0x2c, 0x21, 0xff, 0xc0, - 0xa8, 0xc1, 0x87, 0xff, 0x5, 0x2, 0x1f, 0x90, - 0xe4, 0x10, 0x7d, 0x2, 0x4, 0x6, 0xe, 0x82, - 0x42, 0x80, 0xff, 0x20, 0x83, 0x30, 0x7f, 0x48, - 0x73, 0xa1, 0x9b, 0x42, + 0x19, 0xd, 0x21, 0xa0, 0x3e, 0xbc, 0x82, 0xa, + 0x3, 0x7, 0x41, 0x20, 0x41, 0x7, 0xd0, 0x21, + 0x2, 0x1f, 0x90, 0xd8, 0x30, 0xff, 0xe0, 0xa0, + 0x43, 0xfa, 0xa0, 0xff, 0xe1, 0x2c, 0x1f, 0xff, + 0xf0, 0xff, 0xf7, 0x2c, 0x20, 0x43, 0xfa, 0xa3, + 0x6, 0x1f, 0xfc, 0x14, 0x8, 0x7e, 0x43, 0xf4, + 0x1f, 0x40, 0x81, 0x81, 0x83, 0xa0, 0x90, 0xa0, + 0x3f, 0xc8, 0x20, 0xcc, 0x1f, 0xd2, 0x1c, 0xe8, + 0x75, 0xa1, 0x0, /* U+0044 "D" */ 0xff, 0xd2, 0x1f, 0xfc, 0x26, 0xd0, 0xfc, 0xa0, @@ -369,16 +368,16 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x6, 0x1f, 0xfc, 0x8, 0x3f, 0xf8, 0x88, 0x20, 0xff, 0xe0, 0x60, 0x43, 0xff, 0x80, 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xfc, 0x87, 0xff, 0xf, - 0x2, 0x1f, 0xfc, 0x4, 0x18, 0x7f, 0xd0, 0x48, - 0x7f, 0x3a, 0xc, 0x3b, 0xa7, 0xa0, 0xa0, 0xf9, + 0x2, 0x1f, 0xfc, 0x4, 0x10, 0x7f, 0xd8, 0x7f, + 0xf0, 0x5c, 0x2c, 0x3b, 0xa7, 0xa0, 0xa0, 0xf9, 0x41, 0xd2, 0x1f, 0xf3, 0x68, 0x60, /* U+0045 "E" */ - 0xff, 0xfe, 0xc, 0x1f, 0xfc, 0x65, 0xfe, 0xc2, - 0xeb, 0xf9, 0xf, 0xff, 0xf8, 0x7f, 0xf3, 0xbf, - 0xfa, 0xf, 0xfe, 0x3a, 0xfe, 0xc3, 0x75, 0xf9, - 0xf, 0xff, 0xf8, 0x7f, 0xf7, 0x7a, 0xfe, 0x43, - 0x2f, 0xf6, 0x1f, 0xfc, 0x20, + 0xff, 0xfe, 0x10, 0x7f, 0xf1, 0x97, 0xfc, 0x17, + 0x5f, 0xe0, 0xff, 0xff, 0x87, 0xff, 0x3b, 0xff, + 0xa0, 0xff, 0xe3, 0xaf, 0xec, 0x37, 0x5f, 0x90, + 0xff, 0xff, 0x87, 0xff, 0x77, 0xaf, 0xf0, 0x65, + 0xff, 0x7, 0xff, 0x8, /* U+0046 "F" */ 0xff, 0xfe, 0xc, 0x1f, 0xfc, 0x65, 0xfe, 0xc2, @@ -387,22 +386,22 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3c, /* U+0047 "G" */ - 0xe, 0x6f, 0xd2, 0x1f, 0x3c, 0x86, 0x6d, 0xd, - 0x40, 0xff, 0x48, 0x14, 0x7, 0xfa, 0xa, 0x4, - 0x6, 0xe, 0x70, 0xa4, 0x28, 0x3f, 0x20, 0x70, - 0x21, 0xfd, 0x87, 0xb0, 0xfe, 0x6a, 0x40, 0x87, + 0xe, 0xbf, 0xa4, 0x3e, 0xb4, 0x39, 0xb4, 0x34, + 0x87, 0xfa, 0x40, 0xa0, 0x3f, 0xd0, 0x50, 0x20, + 0x30, 0x73, 0x85, 0x21, 0x41, 0xf9, 0x3, 0x81, + 0xf, 0xec, 0x24, 0x18, 0x7f, 0x35, 0x4, 0x87, 0xf9, 0x60, 0xff, 0xf8, 0x57, 0xe0, 0xfe, 0x5f, 0xc1, 0xff, 0xce, 0xfe, 0xf, 0xfe, 0x5a, 0x1f, - 0xfc, 0x14, 0x3f, 0xf8, 0x98, 0x20, 0xff, 0xe0, - 0xa1, 0xff, 0xc5, 0x41, 0x87, 0xe4, 0x34, 0x16, - 0x87, 0x30, 0x74, 0x15, 0xeb, 0xd0, 0x58, 0x1c, - 0x39, 0xc, 0xe1, 0xdc, 0x87, 0x3c, 0x0, + 0xfc, 0x14, 0x3f, 0xf8, 0x98, 0x30, 0xff, 0xe0, + 0xa0, 0x43, 0xff, 0x84, 0x83, 0xf, 0xc8, 0x68, + 0x2d, 0xe, 0x60, 0xe8, 0x2b, 0xd7, 0xa0, 0xb0, + 0x38, 0x72, 0x19, 0xc3, 0xb9, 0xe, 0x78, 0x0, /* U+0048 "H" */ 0xf8, 0x3f, 0xef, 0x83, 0xff, 0xfe, 0x1f, 0xff, - 0xf0, 0xff, 0xe5, 0xff, 0xfc, 0x1f, 0xfc, 0xc5, - 0xfe, 0xf, 0xba, 0xfe, 0xc3, 0xff, 0xfe, 0x1f, - 0xff, 0xf0, 0xff, 0xee, 0x0, + 0xf0, 0xff, 0xe5, 0xff, 0xfc, 0x1f, 0xfd, 0xcf, + 0xff, 0x83, 0xff, 0xfe, 0x1f, 0xff, 0xf0, 0xff, + 0xee, 0x0, /* U+0049 "I" */ 0xf8, 0x3f, 0xff, 0xe1, 0xff, 0xce, @@ -410,45 +409,44 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+004A "J" */ 0xf, 0xfb, 0xe0, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xff, 0xc1, 0x58, 0x3f, 0xea, - 0x83, 0xe4, 0x3c, 0x87, 0xf9, 0x4, 0x1e, 0x80, - 0xc1, 0x41, 0xa0, 0xa1, 0x3, 0xf9, 0x4, 0x9, - 0xf, 0xd2, 0x15, 0xa1, 0x9d, 0x0, + 0x83, 0xff, 0x84, 0x87, 0x90, 0x90, 0x41, 0xe8, + 0x14, 0xa, 0xd, 0x4, 0x88, 0x1f, 0xc8, 0x20, + 0x48, 0x7e, 0x90, 0xad, 0xc, 0xe8, 0x0, /* U+004B "K" */ - 0xf8, 0x3f, 0xbe, 0x83, 0xff, 0x81, 0x85, 0x7, - 0xfd, 0x5, 0x87, 0xfc, 0xa0, 0x41, 0xff, 0xc0, - 0x80, 0xa0, 0xff, 0xa0, 0xa0, 0xff, 0x94, 0x8, - 0x3f, 0xf8, 0x10, 0x14, 0x1f, 0xf6, 0x14, 0x1f, - 0xf4, 0x16, 0x1f, 0xf2, 0x81, 0x7, 0xfc, 0xc1, - 0x21, 0xff, 0x41, 0x90, 0xff, 0xe2, 0x41, 0xff, - 0xc1, 0x82, 0x83, 0xfe, 0x98, 0x8, 0x7f, 0x94, - 0x21, 0x61, 0xfd, 0x5, 0x4, 0x87, 0xff, 0x1, - 0x40, 0x83, 0xff, 0x83, 0x5, 0x7, 0xff, 0x6, - 0x2, 0x83, 0xff, 0x80, 0x85, 0x7, 0xff, 0x6, - 0x9, 0xf, 0xfe, 0x2, 0x81, 0x7, 0xff, 0x6, - 0xa, 0xf, 0xfe, 0xa, 0x5, 0x0, + 0xf8, 0x3f, 0x3f, 0x41, 0xff, 0xc0, 0x82, 0x83, + 0xfe, 0x82, 0xc3, 0xfe, 0x50, 0x20, 0xff, 0xe0, + 0x40, 0x50, 0x7f, 0xd8, 0x50, 0x7f, 0xc8, 0x50, + 0x7f, 0xf0, 0x20, 0x28, 0x3f, 0xec, 0x28, 0x3f, + 0xe8, 0x2c, 0x3f, 0xe5, 0x2, 0xf, 0xf9, 0x82, + 0x43, 0xfe, 0x83, 0x21, 0xff, 0xc4, 0x83, 0xff, + 0x83, 0x5, 0x7, 0xfd, 0x30, 0x10, 0xff, 0x28, + 0x42, 0xc3, 0xfa, 0xa, 0x9, 0xf, 0xfe, 0x2, + 0x81, 0x7, 0xff, 0x6, 0xa, 0xf, 0xfe, 0xa, + 0x4, 0x3f, 0xf8, 0x30, 0x58, 0x7f, 0xf0, 0x60, + 0x90, 0xff, 0xe0, 0x28, 0x10, 0x7f, 0xf0, 0x60, + 0xa0, 0xff, 0xe0, 0xa0, 0x50, /* U+004C "L" */ 0xf8, 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xf, 0xff, - 0xf8, 0x7f, 0xff, 0xc3, 0xff, 0x95, 0xff, 0xe4, - 0x3f, 0xf8, 0x38, 0x7f, 0xf0, 0x80, + 0xf8, 0x7f, 0xff, 0xc3, 0xff, 0x95, 0xd7, 0xf2, + 0x19, 0x7f, 0xb0, 0xff, 0xe1, 0x0, /* U+004D "M" */ - 0xfc, 0x87, 0xff, 0x1, 0xfc, 0x1b, 0xf, 0xfe, - 0x6, 0x1f, 0x90, 0xff, 0xe0, 0x21, 0xfc, 0x87, - 0xf9, 0xf, 0xf6, 0x1f, 0xec, 0x3f, 0xc8, 0x7f, - 0x90, 0xff, 0x90, 0xff, 0xe3, 0x40, 0xc3, 0xf4, - 0x8, 0x3c, 0x81, 0xf, 0xc8, 0x10, 0xf9, 0xf, - 0xfe, 0x2, 0x1f, 0xb0, 0x41, 0xe4, 0x18, 0x7e, - 0x40, 0x87, 0xa0, 0x21, 0xfc, 0x87, 0xf9, 0xf, - 0xf6, 0x8, 0x32, 0xc, 0x3f, 0xc8, 0x10, 0xd8, - 0x10, 0xff, 0x90, 0xf2, 0x21, 0xff, 0xc0, 0xc0, - 0x81, 0x6, 0x1f, 0xfc, 0x4, 0x10, 0x30, 0x21, - 0xff, 0xc1, 0x43, 0x22, 0x1f, 0xfc, 0x2c, 0xa, - 0x6, 0x1f, 0xfc, 0x24, 0x1e, 0x2, 0x1f, 0xfc, - 0x34, 0x50, 0x87, 0xff, 0x13, 0xd, 0x87, 0xff, - 0x11, 0xc, 0x87, 0xff, 0x15, 0x2, 0x1f, 0xfc, - 0x6c, 0x18, 0x7f, 0x0, + 0xfc, 0x87, 0xff, 0x1, 0xfc, 0x1a, 0xf, 0xfe, + 0x6, 0x1f, 0xfc, 0x94, 0x3f, 0x90, 0xff, 0x21, + 0xfe, 0xc3, 0xfd, 0x87, 0xf9, 0xf, 0xf2, 0x1f, + 0xf2, 0x1f, 0x90, 0xfe, 0x41, 0x87, 0xec, 0x8, + 0x7a, 0x2, 0x1f, 0x90, 0x41, 0xfe, 0x43, 0xc8, + 0x7f, 0xd0, 0x30, 0xf6, 0x8, 0x3f, 0x20, 0x43, + 0xc8, 0x10, 0xff, 0xe0, 0x21, 0xff, 0xc6, 0x81, + 0x86, 0x81, 0x7, 0xf9, 0x2, 0x19, 0x2, 0x1f, + 0xfd, 0x58, 0x10, 0x10, 0x41, 0xff, 0xc0, 0x40, + 0x82, 0x2, 0x1f, 0xfc, 0x14, 0x3f, 0xf9, 0x38, + 0x14, 0x8, 0x3f, 0xf8, 0x48, 0x2c, 0x8, 0x7f, + 0xf0, 0xd0, 0x21, 0xff, 0xc6, 0xc3, 0x41, 0xff, + 0xc4, 0x43, 0x21, 0xff, 0xc5, 0x43, 0xff, 0x93, + 0x82, 0xf, 0xe0, /* U+004E "N" */ 0xf9, 0xf, 0xf7, 0xc1, 0x41, 0xff, 0xc5, 0x43, @@ -465,47 +463,47 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x80, /* U+004F "O" */ - 0xe, 0x6f, 0xd0, 0x7f, 0x3c, 0x86, 0x74, 0x3c, - 0xc1, 0xfd, 0x40, 0xe8, 0xf, 0xf2, 0x5, 0x5, - 0x1, 0x83, 0xa4, 0x10, 0x48, 0x20, 0xfa, 0x9, - 0x10, 0x21, 0xfc, 0x83, 0x30, 0x61, 0xfd, 0x81, - 0x10, 0xff, 0xe0, 0x21, 0xf2, 0x1f, 0xff, 0xf0, - 0xff, 0xfc, 0x21, 0xff, 0xc2, 0x43, 0xff, 0x80, - 0x87, 0xd8, 0x7f, 0x60, 0x48, 0x8, 0x7f, 0x20, - 0xc3, 0xa0, 0xfa, 0x9, 0x6, 0x7, 0xe, 0x90, - 0x41, 0xa0, 0xbf, 0x90, 0x28, 0x33, 0x7, 0xf5, - 0x3, 0xcf, 0x7, 0x3a, 0x18, + 0xe, 0x7f, 0xa0, 0xfe, 0x78, 0x39, 0xe0, 0xf3, + 0x6, 0x43, 0x30, 0x74, 0x7, 0xd7, 0x90, 0x28, + 0x28, 0xc, 0x1d, 0x20, 0x82, 0x41, 0x7, 0xd0, + 0x48, 0x81, 0xf, 0xe4, 0x19, 0x83, 0xf, 0xec, + 0x8, 0x81, 0xf, 0xe4, 0x3f, 0xff, 0xe1, 0xff, + 0xff, 0xf, 0xfe, 0x22, 0x4, 0x3f, 0x90, 0xd8, + 0x30, 0xfe, 0xc0, 0x88, 0x10, 0xfe, 0x41, 0x81, + 0x4, 0x1f, 0x41, 0x20, 0x80, 0xc1, 0xd2, 0x8, + 0x34, 0x7, 0xd7, 0x90, 0x28, 0x33, 0x6, 0x43, + 0x30, 0x79, 0xe0, 0xe7, 0x83, 0x0, /* U+0050 "P" */ - 0xff, 0xf4, 0x87, 0xff, 0x9, 0xb0, 0xf9, 0x70, - 0x76, 0x1d, 0xd6, 0xf8, 0x2c, 0x3f, 0xf8, 0x18, - 0x48, 0x7f, 0xf0, 0x10, 0x61, 0xff, 0xc0, 0xc0, - 0x87, 0xff, 0x1, 0xf, 0xfe, 0x9a, 0x1f, 0xfc, - 0x3c, 0x8, 0x7f, 0xf0, 0x10, 0x61, 0xfe, 0x70, - 0x90, 0xbf, 0xe8, 0x2c, 0x3f, 0xf8, 0x58, 0x79, - 0x7d, 0x78, 0x3d, 0xd7, 0x90, 0xff, 0xff, 0x87, - 0xff, 0xf8, + 0xff, 0xf4, 0x87, 0xff, 0x9, 0xb4, 0x3c, 0xbc, + 0x1a, 0xe, 0xeb, 0xbc, 0x16, 0x1f, 0xfc, 0xc, + 0x24, 0x3f, 0xf8, 0x8, 0x30, 0xff, 0xe0, 0x60, + 0x43, 0xff, 0x80, 0x87, 0xff, 0x4d, 0xf, 0xfe, + 0x1e, 0x4, 0x3f, 0xf8, 0x8, 0x30, 0xff, 0x38, + 0x48, 0x5f, 0xf4, 0x16, 0x1f, 0xfc, 0x2c, 0x3c, + 0xbe, 0xbc, 0x1e, 0xeb, 0xc8, 0x7f, 0xff, 0xc3, + 0xff, 0xfc, /* U+0051 "Q" */ - 0xe, 0x6f, 0xd0, 0x7f, 0x3c, 0x86, 0x78, 0x3c, - 0xc1, 0xfc, 0xc1, 0xd0, 0x1f, 0xe4, 0xa, 0xb, - 0x3, 0x7, 0x48, 0x20, 0xf4, 0x1f, 0x41, 0x22, - 0x4, 0x3f, 0x90, 0x66, 0xc, 0x3f, 0xb0, 0x22, - 0x1f, 0xfc, 0x4, 0x3e, 0x43, 0xff, 0xfe, 0x1f, - 0xff, 0x84, 0x3f, 0xf8, 0x48, 0x7f, 0xf0, 0x10, - 0xfb, 0xf, 0xec, 0x9, 0x1, 0xf, 0xe4, 0x18, - 0x74, 0x1f, 0x41, 0x20, 0xc0, 0xe1, 0xd2, 0x8, - 0x34, 0x17, 0xf2, 0x5, 0x6, 0x60, 0xff, 0x41, - 0xe7, 0x83, 0xf6, 0x1f, 0x9f, 0xe8, 0x2c, 0x3f, - 0xf8, 0x2c, 0x16, 0x1f, 0xfc, 0x16, 0xf, 0xfe, - 0x2b, 0x18, 0x7f, 0xf0, 0xdc, 0x0, + 0xe, 0x7f, 0xa0, 0xfe, 0x78, 0x39, 0xe0, 0xf3, + 0x6, 0x43, 0x30, 0x74, 0x7, 0xd7, 0x90, 0x28, + 0x2c, 0xc, 0x1d, 0x20, 0x83, 0xd0, 0x7d, 0x4, + 0x88, 0x10, 0xfe, 0x41, 0x98, 0x30, 0xfe, 0xc0, + 0x88, 0x10, 0xfe, 0x43, 0xff, 0xfe, 0x1f, 0xff, + 0xf1, 0xf, 0xfe, 0x12, 0x1f, 0xfc, 0x4, 0x36, + 0xc, 0x3f, 0xb0, 0x22, 0x4, 0x3f, 0x90, 0x60, + 0x41, 0x7, 0xd0, 0x48, 0x20, 0x30, 0x74, 0x82, + 0xd, 0x1, 0xf5, 0xe4, 0xa, 0xc, 0xc1, 0x90, + 0xe8, 0x3c, 0xf0, 0x7e, 0xc3, 0xf3, 0xfc, 0x85, + 0x87, 0xff, 0x6, 0x81, 0x61, 0xff, 0xc1, 0x60, + 0xff, 0xe2, 0xb1, 0x87, 0xff, 0xd, 0xc0, /* U+0052 "R" */ - 0xff, 0xf4, 0x1f, 0xfc, 0x37, 0x83, 0xe5, 0x83, - 0x98, 0x3b, 0xab, 0xe4, 0x8, 0x7f, 0xf0, 0x20, + 0xff, 0xf4, 0x1f, 0xfc, 0x37, 0x43, 0xe5, 0xc1, + 0xa4, 0x3b, 0xad, 0xe4, 0x10, 0x7f, 0xf0, 0x20, 0xa0, 0xff, 0xe0, 0x40, 0x43, 0xff, 0x80, 0x87, - 0xff, 0x8e, 0xf, 0xfe, 0x1a, 0x8, 0x3f, 0xec, - 0x24, 0x37, 0x57, 0xc1, 0x41, 0xe5, 0x83, 0xa4, + 0xff, 0x8d, 0xf, 0xfe, 0x1c, 0x8, 0x3f, 0xec, + 0x24, 0x37, 0x5b, 0xc1, 0x41, 0xe5, 0xc1, 0xa4, 0x3f, 0xf8, 0x3a, 0x1e, 0xfe, 0xa, 0xf, 0xfe, 0x2, 0x4, 0x3f, 0xf8, 0x10, 0x48, 0x7f, 0xf0, 0x10, 0x41, 0xff, 0xc0, 0x83, 0xff, 0x8f, 0x7, @@ -515,30 +513,30 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0053 "S" */ 0xe, 0xbf, 0x48, 0x7d, 0x68, 0x66, 0xc3, 0xa4, - 0x3f, 0xb0, 0x94, 0x7, 0xf8, 0x2c, 0x18, 0x18, - 0x3b, 0x9, 0x10, 0x41, 0xf2, 0xc, 0x3f, 0xf8, - 0x18, 0x10, 0xff, 0xe0, 0x2e, 0xc, 0x87, 0xea, - 0x84, 0x12, 0x1f, 0xf4, 0x15, 0x3, 0xfe, 0x82, - 0x79, 0xf, 0xce, 0x19, 0xb4, 0x3f, 0x70, 0x75, - 0xa1, 0xf3, 0xe4, 0x34, 0x87, 0xf5, 0xc1, 0x41, - 0xff, 0x38, 0x50, 0x7f, 0xf0, 0x10, 0x35, 0x7, - 0xf6, 0x12, 0xe0, 0xfc, 0x84, 0x83, 0xf, 0xc8, - 0x58, 0x10, 0xfd, 0x1, 0x41, 0x68, 0x74, 0x14, - 0x61, 0x5f, 0xc8, 0x10, 0xb4, 0x3f, 0xa8, 0x1a, - 0xd0, 0xe7, 0x40, + 0x32, 0x1b, 0x9, 0x40, 0x7d, 0x78, 0x2c, 0x18, + 0x18, 0x3b, 0x9, 0x10, 0x41, 0xf4, 0xc, 0x3f, + 0xf8, 0x8, 0x10, 0xff, 0xe0, 0xac, 0x19, 0xf, + 0xd5, 0x8, 0x24, 0x3f, 0xe8, 0x2a, 0x7, 0xfd, + 0x4, 0xf2, 0x1f, 0x9c, 0x33, 0x70, 0x7e, 0xe0, + 0xe7, 0x43, 0xe7, 0xc8, 0x69, 0xf, 0xeb, 0x82, + 0x83, 0xfe, 0x70, 0xa0, 0xff, 0xe0, 0x40, 0x6a, + 0xf, 0xe4, 0x25, 0x83, 0xff, 0x82, 0x82, 0xf, + 0xc8, 0x58, 0x10, 0xfd, 0x81, 0x41, 0x68, 0x74, + 0x82, 0x30, 0xaf, 0x5e, 0x40, 0x85, 0xa1, 0x90, + 0xcc, 0x1a, 0xd0, 0xe7, 0x80, /* U+0054 "T" */ - 0xff, 0xfe, 0x28, 0x7f, 0xf1, 0x57, 0xc1, 0x97, - 0xea, 0xf6, 0x15, 0x7c, 0x1f, 0xff, 0xf0, 0xff, - 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xff, - 0xfe, + 0xbf, 0xff, 0x88, 0x1f, 0xfc, 0x5d, 0x7c, 0x19, + 0x7e, 0xaf, 0x5, 0xd7, 0x83, 0xff, 0xfe, 0x1f, + 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, + 0xff, 0xc0, /* U+0055 "U" */ 0xf8, 0x3f, 0xdf, 0x7, 0xff, 0xfc, 0x3f, 0xff, - 0xe1, 0xff, 0xff, 0xf, 0xff, 0xfa, 0x12, 0x4, - 0x3f, 0xe7, 0x4, 0x1f, 0xa0, 0x68, 0x58, 0x7b, - 0x9, 0x20, 0xbf, 0xc1, 0x40, 0x60, 0xff, 0x68, - 0x4f, 0x21, 0x9b, 0x8, + 0xe1, 0xff, 0xff, 0xf, 0xff, 0xf8, 0x7c, 0x87, + 0xe4, 0x28, 0x10, 0x7e, 0x81, 0x21, 0x61, 0xec, + 0x24, 0x82, 0xff, 0x5, 0x1, 0x83, 0xfd, 0x21, + 0x3c, 0x86, 0x6d, 0x0, /* U+0056 "V" */ 0x3e, 0x43, 0xfe, 0xf9, 0xd, 0x87, 0xf9, 0x9, @@ -551,7 +549,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x83, 0xf, 0xfe, 0x2, 0x1e, 0x43, 0xf9, 0x6, 0x4, 0x8, 0x7f, 0xa0, 0x20, 0xc1, 0x87, 0xff, 0x11, 0x2, 0x1f, 0xf2, 0x4, 0x3f, 0xf8, 0x98, - 0x34, 0x10, 0x7f, 0xf0, 0x10, 0x30, 0x10, 0xff, + 0x34, 0x8, 0x7f, 0xf0, 0x10, 0x30, 0x20, 0xff, 0xe0, 0xa1, 0xff, 0xc7, 0xc3, 0x21, 0xff, 0xc2, 0x43, 0x61, 0xff, 0xc7, 0x43, 0xff, 0x87, 0x1, 0xf, 0xc0, @@ -564,17 +562,17 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc3, 0x90, 0xd8, 0x72, 0x4, 0x39, 0xf, 0x94, 0x21, 0xff, 0x21, 0xf2, 0xf, 0x7, 0xff, 0x27, 0x2, 0x80, 0x84, 0x81, 0xc, 0x81, 0x9, 0xf, - 0x61, 0x60, 0xc3, 0xec, 0x39, 0xc, 0x84, 0x81, - 0xd, 0x87, 0xec, 0x8, 0x7f, 0xf0, 0x50, 0x20, - 0x40, 0x83, 0xf, 0xfe, 0x3e, 0x1c, 0x81, 0x10, - 0x21, 0xe4, 0x8, 0x88, 0x7b, 0xd, 0x87, 0xff, - 0x7, 0xc, 0x89, 0x81, 0xf, 0x60, 0xd0, 0x21, - 0xb0, 0x90, 0xfe, 0x42, 0xc3, 0xe4, 0x8, 0x7f, - 0xf0, 0x54, 0x1f, 0xec, 0x8, 0x7e, 0x43, 0x21, - 0xf9, 0x6, 0x1f, 0xfc, 0x1c, 0x3c, 0x87, 0xff, - 0x7, 0xc, 0x87, 0xb0, 0xc8, 0x7e, 0x43, 0xfe, - 0x43, 0xff, 0x8a, 0x87, 0xfc, 0x87, 0xff, 0x7, - 0xf, 0xc8, 0x30, 0xe0, + 0x61, 0x60, 0xc3, 0x60, 0xc3, 0x90, 0xc8, 0x48, + 0x10, 0xff, 0xe0, 0xe0, 0x43, 0xff, 0x82, 0x81, + 0x2, 0x4, 0x18, 0x7f, 0xf1, 0xf0, 0xe4, 0x8, + 0x81, 0xf, 0x20, 0x44, 0x43, 0xd8, 0x6c, 0x3f, + 0xf8, 0x38, 0x64, 0x4c, 0x8, 0x7b, 0x6, 0x81, + 0xd, 0x84, 0x87, 0xf2, 0x7, 0xf, 0x90, 0x21, + 0xff, 0xc2, 0x43, 0xfd, 0x81, 0xf, 0xc8, 0x64, + 0x3f, 0x20, 0xc3, 0xff, 0x83, 0x87, 0x90, 0xff, + 0xe0, 0xe1, 0x90, 0xf6, 0x19, 0xf, 0xc8, 0x7f, + 0xc8, 0x7f, 0xf1, 0x50, 0xff, 0x90, 0xff, 0xe0, + 0xe1, 0xf9, 0x6, 0x1c, /* U+0058 "X" */ 0x7e, 0x43, 0xf3, 0xf2, 0x82, 0x83, 0xf4, 0x12, @@ -584,36 +582,36 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x2, 0x1f, 0xb0, 0x94, 0x14, 0x1f, 0xc8, 0x38, 0x8, 0x7f, 0xa0, 0x21, 0x41, 0xff, 0x21, 0x90, 0xff, 0xe0, 0x41, 0xa0, 0xff, 0xe0, 0x21, 0xff, - 0xc5, 0x83, 0x41, 0xff, 0x21, 0xc8, 0x7f, 0xd0, - 0x14, 0xc, 0x3f, 0x90, 0xa8, 0x12, 0x1f, 0xa0, - 0x20, 0x41, 0x7, 0xc8, 0x50, 0x30, 0x90, 0xf4, - 0x4, 0x24, 0x28, 0x39, 0xa, 0xd, 0x4, 0x86, - 0x80, 0x87, 0x21, 0x41, 0x21, 0x41, 0xe8, 0x24, - 0x10, 0x7f, 0x90, 0xa2, 0xa, 0xf, 0xd0, 0x48, + 0xc5, 0x83, 0x41, 0xff, 0x21, 0xca, 0xf, 0xf4, + 0x5, 0x2, 0xf, 0xe4, 0x2a, 0x4, 0x87, 0xe8, + 0x8, 0x10, 0x41, 0xf2, 0x14, 0xc, 0x24, 0x3d, + 0x1, 0x9, 0xa, 0xe, 0x42, 0x83, 0x41, 0x21, + 0xa0, 0x21, 0xc8, 0x50, 0x48, 0x50, 0x7a, 0x9, + 0x4, 0x1f, 0xe4, 0x28, 0x82, 0x83, 0xf4, 0x12, /* U+0059 "Y" */ 0x3e, 0x83, 0xf9, 0xf8, 0x8, 0x10, 0xfe, 0x80, - 0x82, 0x9, 0xf, 0xfb, 0x9, 0x4, 0x1f, 0x41, - 0x21, 0x61, 0xfe, 0x41, 0x6, 0x42, 0x83, 0x90, - 0x90, 0xe8, 0x8, 0x74, 0x4, 0x3c, 0x84, 0x87, - 0xd0, 0x7d, 0x2, 0xa, 0x2, 0x1f, 0x90, 0xf2, - 0x8, 0x3f, 0x90, 0x42, 0x4, 0x3f, 0xd0, 0x12, - 0x6, 0x1f, 0xf2, 0x8, 0x24, 0x3f, 0xe8, 0x8, - 0x20, 0xff, 0xe3, 0x21, 0xff, 0xc1, 0x82, 0x83, - 0xff, 0x84, 0x84, 0x87, 0xff, 0xfc, 0x3f, 0xff, - 0xe1, 0xff, 0xd0, + 0x82, 0x9, 0xf, 0x90, 0xb0, 0x90, 0x41, 0xf6, + 0x12, 0x16, 0x1f, 0xe4, 0x10, 0x64, 0x28, 0x39, + 0x9, 0xe, 0x80, 0x87, 0x40, 0x83, 0xc8, 0x48, + 0x7c, 0x87, 0xd0, 0x20, 0xa0, 0x21, 0xf9, 0xf, + 0x20, 0x83, 0xf9, 0x4, 0x20, 0x43, 0xfd, 0x1, + 0x20, 0x41, 0xff, 0x20, 0x83, 0xff, 0x87, 0x1, + 0x4, 0x1f, 0xfc, 0x64, 0x3f, 0xf8, 0x30, 0x50, + 0x7f, 0xf0, 0x90, 0x90, 0xff, 0xff, 0x87, 0xff, + 0xfc, 0x3f, 0xfa, 0x0, /* U+005A "Z" */ - 0xff, 0xfe, 0x18, 0x7f, 0xf1, 0x57, 0xfe, 0xe, - 0xaf, 0xf8, 0x28, 0x3f, 0xe8, 0x24, 0x3f, 0xe4, - 0x10, 0x7f, 0xd0, 0x14, 0x1f, 0xf2, 0x8, 0x3f, - 0xec, 0x8, 0x7f, 0xc8, 0x50, 0x7f, 0xd0, 0x10, - 0xff, 0x90, 0xa0, 0xff, 0xa0, 0x41, 0xff, 0x41, - 0x21, 0xff, 0x20, 0x83, 0xfe, 0x80, 0xa0, 0xff, - 0x90, 0x41, 0xff, 0x40, 0x43, 0xfe, 0x50, 0x20, - 0xff, 0xa0, 0x21, 0xff, 0x21, 0x41, 0xff, 0x40, - 0x83, 0xfe, 0x42, 0x43, 0xfe, 0x82, 0xaf, 0xfe, - 0x0, 0x65, 0xff, 0xe0, 0x7, 0xff, 0x10, + 0xff, 0xfe, 0x18, 0x7f, 0xf0, 0xd7, 0xfe, 0x9, + 0xaf, 0xf9, 0x4, 0x1f, 0xf2, 0x21, 0xff, 0x60, + 0x83, 0xfc, 0x81, 0xf, 0xfa, 0x4, 0x1f, 0xe4, + 0x10, 0x7f, 0xd0, 0x10, 0xff, 0x40, 0x83, 0xfe, + 0x40, 0x87, 0xfb, 0x6, 0x1f, 0xe4, 0x8, 0x7f, + 0xd0, 0x20, 0xff, 0x20, 0x43, 0xfe, 0x81, 0x7, + 0xfa, 0x4, 0x1f, 0xf2, 0x4, 0x3f, 0xd0, 0x20, + 0xff, 0x28, 0x8, 0x7f, 0xa0, 0x41, 0xfe, 0x40, + 0xa0, 0xff, 0x40, 0x6b, 0xfe, 0xc, 0xbf, 0xf0, + 0x7f, 0xf0, 0xc0, /* U+005B "[" */ 0xaf, 0x2f, 0x83, 0xfb, 0xe0, 0xff, 0xff, 0x87, @@ -650,14 +648,14 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x34, 0x81, 0xd, 0x2, 0x0, /* U+0061 "a" */ - 0x9, 0xbf, 0x41, 0xee, 0x43, 0x3a, 0x16, 0x1f, - 0xd0, 0x20, 0xaf, 0xc1, 0x42, 0x9, 0xd, 0x1, - 0x2a, 0x43, 0x90, 0xcb, 0x7, 0xff, 0xd, 0xad, - 0x87, 0x9e, 0x5c, 0x1e, 0x60, 0xff, 0xe0, 0x41, - 0x5f, 0x83, 0x41, 0x68, 0x7e, 0x41, 0x7, 0xff, - 0x5, 0xf, 0xfe, 0x7a, 0x1d, 0x6, 0x41, 0x6, - 0x90, 0xd0, 0x5f, 0x90, 0xf4, 0x1f, 0x61, 0x23, - 0xa1, 0x38, 0xb0, + 0x9, 0xbf, 0x41, 0xee, 0x43, 0x3a, 0x16, 0x19, + 0xd, 0x2, 0xb, 0xd7, 0x82, 0x84, 0x10, 0x74, + 0x4, 0xa9, 0xe, 0x43, 0x2c, 0x1f, 0xfc, 0x36, + 0xb6, 0x1e, 0x79, 0x70, 0x79, 0x83, 0xff, 0x81, + 0x5, 0x7e, 0xd, 0x5, 0xa1, 0xf9, 0x4, 0x1f, + 0xfc, 0x14, 0x3f, 0xf9, 0xe8, 0x74, 0x19, 0x4, + 0x1a, 0x43, 0x41, 0x7e, 0x43, 0xd0, 0x7d, 0x84, + 0x8e, 0x84, 0xe4, 0xa0, /* U+0062 "b" */ 0xf8, 0x3f, 0xff, 0xe1, 0xff, 0xdb, 0xbe, 0x90, @@ -665,8 +663,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x20, 0x43, 0x30, 0x68, 0x24, 0x28, 0x3c, 0x83, 0xf, 0xf6, 0x4, 0x3f, 0xc8, 0x7f, 0xff, 0xc3, 0xf2, 0x1f, 0xfc, 0x1c, 0x8, 0x50, 0x79, 0x6, - 0x13, 0x6, 0x82, 0x43, 0x3f, 0x90, 0x41, 0xa0, - 0xf9, 0x41, 0x9d, 0x9, 0xa0, 0x0, + 0x13, 0x6, 0x82, 0x43, 0x3f, 0x90, 0x41, 0xb0, + 0xf9, 0x41, 0xda, 0x13, 0x40, 0x0, /* U+0063 "c" */ 0xd, 0x7e, 0x90, 0xe7, 0x43, 0x34, 0x9, 0x83, @@ -678,47 +676,47 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x4e, 0x86, 0x68, 0x0, /* U+0064 "d" */ - 0xf, 0xfb, 0xe0, 0xff, 0xff, 0x87, 0xff, 0x3e, - 0xfa, 0xf, 0x9d, 0x9, 0xd0, 0xcc, 0x1f, 0x41, - 0xa0, 0xbf, 0x41, 0x90, 0xb0, 0xca, 0xb, 0x2, - 0x1e, 0x82, 0x41, 0x87, 0xff, 0x5, 0xf, 0xff, - 0xf8, 0x7e, 0x43, 0xfc, 0x83, 0xf, 0xf6, 0x4, - 0x3d, 0x4, 0x85, 0x86, 0x50, 0x68, 0x2f, 0xd0, - 0x73, 0x7, 0xd0, 0x73, 0xa1, 0x3a, 0x10, + 0xf, 0xfb, 0xe0, 0xff, 0xff, 0x87, 0xff, 0x39, + 0xbe, 0x83, 0xea, 0x21, 0x3a, 0x19, 0x41, 0xf4, + 0x1a, 0xb, 0xf4, 0x19, 0xb, 0xc, 0xa0, 0xb0, + 0x21, 0xe8, 0x24, 0x18, 0x7f, 0xf0, 0x50, 0xff, + 0xff, 0x87, 0xe4, 0x3f, 0xc8, 0x30, 0xff, 0x60, + 0x43, 0xd0, 0x48, 0x50, 0x65, 0x6, 0x80, 0xfe, + 0x83, 0x98, 0x3e, 0xc3, 0x9d, 0x9, 0xc3, 0x0, /* U+0065 "e" */ 0xc, 0xfe, 0x90, 0xf7, 0x6, 0x68, 0x1b, 0xf, - 0xcc, 0xc, 0xf, 0xe8, 0x8, 0x85, 0x6, 0x50, - 0x1c, 0x10, 0x7b, 0x6, 0x81, 0xf, 0x20, 0x43, - 0xff, 0x8b, 0xff, 0x83, 0xff, 0x92, 0xbf, 0xe0, - 0xba, 0xff, 0x7, 0xff, 0x15, 0xf, 0xf2, 0xc, - 0x3f, 0xd8, 0x10, 0xf9, 0x84, 0x2d, 0xc, 0xca, - 0x20, 0xaf, 0xd0, 0x66, 0xf, 0xe9, 0x3, 0xc1, - 0xce, 0x80, + 0xcc, 0xc, 0xf, 0xe8, 0x8, 0x74, 0x19, 0x40, + 0x60, 0x21, 0xec, 0x1a, 0xc, 0x3c, 0x81, 0x9, + 0xf, 0xfe, 0xf, 0xfe, 0xf, 0xfe, 0x4a, 0xff, + 0x82, 0xeb, 0xfc, 0x1f, 0xfc, 0x54, 0x3f, 0xc8, + 0x30, 0xff, 0x60, 0x43, 0xf4, 0x21, 0x61, 0xce, + 0xa2, 0xb, 0xd7, 0xa0, 0xcc, 0x19, 0xd, 0x20, + 0x74, 0x39, 0xd0, /* U+0066 "f" */ - 0xe, 0x7e, 0x43, 0x50, 0x2c, 0x25, 0x6, 0xc2, - 0x80, 0xf9, 0xf, 0x41, 0xff, 0xd5, 0xf8, 0x2f, - 0x83, 0xfe, 0x50, 0x65, 0x8a, 0x61, 0x54, 0x1f, - 0xff, 0xf0, 0xff, 0xff, 0x87, 0xfc, + 0xf, 0x5f, 0x21, 0x9d, 0xb, 0xd, 0x7, 0x61, + 0x41, 0x7c, 0x84, 0x82, 0xf, 0xf2, 0x1f, 0xfc, + 0xeb, 0xc1, 0x7d, 0x7, 0xff, 0x3, 0x50, 0x65, + 0x63, 0x40, 0xba, 0x21, 0xff, 0xff, 0xf, 0xff, + 0xf8, 0x7f, 0xf3, 0xc0, /* U+0067 "g" */ 0x9, 0xbe, 0x81, 0xf0, 0x28, 0x84, 0xe8, 0x65, - 0x7, 0xd0, 0x68, 0x2f, 0xc8, 0x64, 0x2c, 0x34, - 0x85, 0x81, 0xf, 0x41, 0x20, 0xc3, 0xff, 0x82, - 0x87, 0xff, 0xfc, 0x3f, 0x21, 0xfe, 0x41, 0x87, - 0xfb, 0x2, 0x1e, 0x82, 0x42, 0xc3, 0x28, 0x34, - 0x17, 0xe8, 0x39, 0x41, 0xf4, 0x1d, 0x68, 0x4e, - 0x87, 0xd7, 0xd0, 0x7f, 0xf4, 0x50, 0xe8, 0x3e, - 0x80, 0x8a, 0xd0, 0xd0, 0x51, 0x82, 0xfc, 0x81, - 0x4, 0x87, 0xe6, 0xa, 0xd0, 0xcf, 0x0, + 0x7, 0xd0, 0x68, 0x2f, 0xd0, 0x64, 0x2c, 0x32, + 0x82, 0xc0, 0x87, 0xa0, 0x90, 0x61, 0xff, 0xc1, + 0x43, 0xff, 0xfe, 0x1f, 0x90, 0xff, 0x20, 0xc3, + 0xfd, 0x81, 0xf, 0x41, 0x21, 0x41, 0x94, 0x1a, + 0x3, 0xfa, 0xe, 0x50, 0x7d, 0x7, 0x51, 0x9, + 0xd0, 0xf3, 0x7d, 0x7, 0xff, 0x45, 0xe, 0x83, + 0xec, 0x8, 0xad, 0xd, 0x20, 0x8c, 0x17, 0xe4, + 0x8, 0x24, 0x3f, 0x30, 0x56, 0x86, 0x78, 0x0, /* U+0068 "h" */ - 0xf8, 0x3f, 0xff, 0xe1, 0xff, 0xd3, 0xbe, 0x90, - 0xe7, 0x42, 0x64, 0x34, 0x1f, 0x41, 0xcf, 0xd0, - 0x50, 0x68, 0x25, 0x1, 0xa, 0xe, 0xc3, 0xc8, - 0x72, 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, - 0x28, + 0xf8, 0x3f, 0xff, 0xe1, 0xff, 0xd3, 0xbf, 0x21, + 0xce, 0x86, 0x90, 0xd0, 0x7d, 0x7, 0x3f, 0x82, + 0x82, 0x60, 0xd0, 0x10, 0xa0, 0xe4, 0x3f, 0xff, + 0xe1, 0xff, 0xff, 0xf, 0xfe, 0xb8, /* U+0069 "i" */ 0x78, 0x84, 0x3a, 0x11, 0xe0, 0xef, 0x83, 0xff, @@ -732,39 +730,40 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+006B "k" */ 0xf8, 0x3f, 0xff, 0xe1, 0xff, 0xde, 0x7e, 0x43, - 0xfa, 0x2, 0x83, 0xf4, 0x14, 0x1f, 0x94, 0x8, - 0x3f, 0xa0, 0x28, 0x3f, 0x41, 0x41, 0xf9, 0x40, - 0xc3, 0xf3, 0x2, 0xf, 0xe8, 0x24, 0x3f, 0xf8, - 0x28, 0x7f, 0xf0, 0x60, 0xff, 0x41, 0x41, 0xfa, - 0x60, 0x21, 0xf9, 0x14, 0xc, 0x3f, 0xd0, 0x48, - 0x7f, 0x90, 0x41, 0xfe, 0x82, 0x83, 0xfd, 0x1, - 0xf, 0xf2, 0x14, 0x1f, 0xe8, 0xa, + 0xfa, 0x2, 0x83, 0xf4, 0x14, 0x1f, 0x94, 0xc, + 0x3f, 0xa0, 0x41, 0xfd, 0x1, 0x41, 0xf9, 0x40, + 0x83, 0xfa, 0x4, 0x1f, 0xd8, 0x48, 0x7f, 0xf0, + 0x50, 0xff, 0xe0, 0xc1, 0xfe, 0xc2, 0x83, 0xf4, + 0x40, 0x43, 0xf2, 0x28, 0x10, 0x7f, 0xa0, 0x28, + 0x3f, 0xc8, 0x20, 0xff, 0x41, 0x21, 0xfe, 0x81, + 0x7, 0xf9, 0xa, 0xf, 0xf4, 0x4, /* U+006C "l" */ 0xf8, 0x3f, 0xff, 0xe1, 0xff, 0xd6, /* U+006D "m" */ - 0xf8, 0x17, 0xd2, 0x13, 0xf9, 0xf, 0x5a, 0x13, - 0x25, 0x3, 0x50, 0x39, 0xf, 0xa8, 0x87, 0x94, - 0x1d, 0x7d, 0x4, 0x97, 0xc1, 0x61, 0x94, 0x12, - 0x82, 0x50, 0x50, 0x10, 0xd0, 0x76, 0x16, 0x19, - 0xf, 0xfe, 0xa, 0x12, 0x1f, 0xff, 0xf0, 0xff, - 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xf8, + 0xf8, 0x17, 0xd0, 0x67, 0xf2, 0x1e, 0xb4, 0x27, + 0x4e, 0xd, 0x40, 0xe4, 0x3e, 0xa0, 0x7c, 0xa0, + 0xeb, 0xe8, 0x24, 0xbe, 0xb, 0xd, 0x21, 0x28, + 0x25, 0x5, 0x1, 0xc, 0x87, 0x41, 0x41, 0x90, + 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, + 0xff, 0xff, 0xf, 0xfe, 0x70, /* U+006E "n" */ - 0xf8, 0x17, 0xd2, 0x1c, 0xe8, 0x4c, 0x86, 0x83, - 0xe8, 0x39, 0xfa, 0xa, 0xd, 0x4, 0xa0, 0x21, - 0x41, 0xd8, 0x79, 0xe, 0x43, 0xff, 0xfe, 0x1f, - 0xff, 0xf0, 0xff, 0xe5, 0x0, + 0xf8, 0x17, 0xe4, 0x39, 0xd0, 0xd2, 0x1a, 0xf, + 0xa0, 0xe7, 0xf0, 0x50, 0x68, 0x34, 0x4, 0x28, + 0x39, 0xf, 0x21, 0xff, 0xff, 0xf, 0xff, 0xf8, + 0x7f, 0xf4, 0x0, /* U+006F "o" */ 0xc, 0xdf, 0x48, 0x7d, 0xc8, 0x4d, 0x87, 0x61, - 0xfd, 0x85, 0x5, 0x7d, 0x5, 0x1, 0x4, 0x84, - 0xc0, 0x48, 0xa, 0xe, 0x42, 0x90, 0x61, 0xf4, - 0x4, 0x24, 0x3f, 0xf9, 0x48, 0x7f, 0xfd, 0x90, - 0xf9, 0x9, 0x6, 0x1f, 0x60, 0x60, 0x28, 0x3c, - 0x82, 0x10, 0x48, 0x6c, 0x8, 0x20, 0xaf, 0xc1, - 0x41, 0x61, 0xfd, 0x87, 0x72, 0x13, 0x61, 0x0, + 0x90, 0xd8, 0x50, 0x57, 0x70, 0x50, 0x10, 0x48, + 0x4c, 0x4, 0x80, 0xa0, 0xe5, 0x2, 0x41, 0x87, + 0xd8, 0x10, 0x90, 0xf9, 0xf, 0xff, 0xf8, 0x79, + 0xf, 0x90, 0x90, 0x61, 0xf6, 0x6, 0x2, 0x83, + 0xc8, 0x21, 0x4, 0x86, 0xc0, 0x82, 0xa, 0xef, + 0x5, 0x5, 0x86, 0x43, 0x61, 0xdc, 0x84, 0xd8, + 0x40, /* U+0070 "p" */ 0xf8, 0x17, 0xd2, 0x1e, 0x74, 0x26, 0x81, 0xd0, @@ -772,25 +771,25 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x9, 0xf, 0x20, 0xc3, 0xfd, 0x81, 0xf, 0xf2, 0x1f, 0xff, 0xf0, 0xfc, 0x87, 0xff, 0x7, 0x2, 0x12, 0x1e, 0x41, 0x85, 0x21, 0xb0, 0x90, 0xd7, - 0xe0, 0xa0, 0xd0, 0x7c, 0xa0, 0xce, 0x84, 0xd0, - 0x3e, 0xbe, 0x90, 0xff, 0xff, 0x87, 0xff, 0x38, + 0xe0, 0x90, 0xd0, 0x7c, 0xc1, 0x9d, 0x9, 0xa0, + 0x7d, 0x7d, 0x21, 0xff, 0xff, 0xf, 0xfe, 0x70, /* U+0071 "q" */ - 0x9, 0xbe, 0x81, 0xf0, 0x28, 0x84, 0xe8, 0x65, - 0x7, 0xd0, 0x68, 0x2f, 0xd0, 0x64, 0x2c, 0x33, - 0x5, 0x81, 0xf, 0x21, 0x20, 0xc3, 0xff, 0x82, - 0x87, 0xff, 0xfc, 0x3f, 0x21, 0xfe, 0x41, 0x87, - 0xfb, 0x2, 0x1e, 0x42, 0x42, 0xc3, 0x30, 0x68, - 0x2f, 0xd0, 0x72, 0x83, 0xe8, 0x3a, 0xd0, 0x9d, - 0xf, 0xaf, 0xa0, 0xff, 0xff, 0x87, 0xff, 0x40, + 0x9, 0xbe, 0x93, 0xe0, 0x51, 0x9, 0x90, 0xca, + 0xf, 0xa0, 0xd0, 0x5f, 0xa0, 0xc8, 0x58, 0x66, + 0xb, 0x2, 0x1e, 0x42, 0x41, 0x87, 0xff, 0x5, + 0xf, 0xff, 0xf8, 0x7e, 0x43, 0xfc, 0x83, 0xf, + 0xf6, 0x4, 0x3c, 0x84, 0x85, 0x86, 0x60, 0xd0, + 0x5f, 0xa0, 0xe5, 0x7, 0xd0, 0x75, 0x10, 0x9d, + 0xf, 0x37, 0xd0, 0x7f, 0xff, 0xc3, 0xff, 0xa0, /* U+0072 "r" */ - 0xf8, 0x7e, 0xa, 0x81, 0xe4, 0x3f, 0x5f, 0x4, - 0xa0, 0xf4, 0x1f, 0xff, 0xf0, 0xff, 0xee, 0x80, + 0xf8, 0x7e, 0x9, 0x83, 0xd0, 0x10, 0xeb, 0xb0, + 0x94, 0x1e, 0x83, 0xff, 0xfe, 0x1f, 0xfd, 0xd0, /* U+0073 "s" */ 0xd, 0x7e, 0x83, 0x9d, 0xc, 0xe1, 0xa0, 0xfd, - 0x83, 0x3, 0xf4, 0x14, 0x1a, 0x9, 0x80, 0x87, + 0x82, 0x3, 0xf8, 0x28, 0x41, 0x6, 0x80, 0x87, 0xf2, 0x1f, 0x21, 0xdf, 0x8, 0x24, 0x3f, 0x41, 0x5a, 0x1f, 0x61, 0xad, 0xf, 0x70, 0x6b, 0xf, 0x3c, 0x1b, 0xf, 0x9e, 0xa, 0xf, 0xcc, 0x7, @@ -800,14 +799,15 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0074 "t" */ 0xb, 0xe0, 0xff, 0xed, 0xfc, 0x17, 0xc1, 0xfc, - 0xa0, 0xcb, 0x53, 0xa, 0xa0, 0xff, 0xff, 0x87, - 0xff, 0x6d, 0xf, 0xd7, 0x82, 0x83, 0xf3, 0x6, + 0xb0, 0x65, 0x54, 0x17, 0x40, 0xff, 0xff, 0x87, + 0xff, 0x6d, 0xe, 0x41, 0x78, 0x28, 0x3f, 0xb0, + 0xc0, /* U+0075 "u" */ 0xf8, 0x3e, 0xf8, 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xf, 0xfe, 0x52, 0x1f, 0xc8, 0x30, 0xe8, 0x2c, - 0xa, 0xa, 0x42, 0x42, 0xbe, 0x43, 0xa0, 0xf9, - 0xc, 0xe8, 0x4f, 0x4, + 0x8, 0x69, 0x9, 0xb, 0xf2, 0x1d, 0x7, 0xc8, + 0x67, 0x42, 0x78, 0x20, /* U+0076 "v" */ 0x3e, 0xf, 0xbe, 0x43, 0x21, 0xfc, 0x90, 0x30, @@ -821,19 +821,19 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x80, /* U+0077 "w" */ - 0x3e, 0xf, 0x5e, 0xf, 0x5e, 0x43, 0x21, 0xc8, - 0x10, 0xe4, 0x8, 0x87, 0xfd, 0x87, 0xfb, 0x6, - 0x19, 0x9, 0xc, 0x81, 0x2, 0x4, 0x36, 0x1f, - 0xb0, 0x61, 0xfe, 0x43, 0x21, 0xe4, 0x24, 0x8, - 0x72, 0xc, 0x24, 0x3d, 0x83, 0x2, 0x8, 0x8, - 0x72, 0x19, 0x2, 0xc, 0x24, 0x32, 0xc, 0x3f, - 0xc8, 0x98, 0x13, 0xf, 0xc8, 0x7b, 0x10, 0x61, - 0x90, 0xec, 0xa, 0x2, 0x19, 0x10, 0xfc, 0x83, - 0xc1, 0xc8, 0x72, 0x1f, 0xca, 0x10, 0xb0, 0x40, - 0xc3, 0xff, 0x81, 0x84, 0x81, 0x2, 0x1f, 0x21, - 0x90, 0xff, 0xe2, 0xe1, 0xfc, 0x84, 0x87, 0xe4, - 0x24, 0x3b, 0xb, 0xf, 0xfe, 0x6, 0x1c, 0x84, - 0x87, 0xf2, 0x4, 0x3f, 0xf8, 0x40, + 0x7d, 0x7, 0xbc, 0x87, 0xbe, 0x40, 0x87, 0x20, + 0xc3, 0x90, 0x21, 0xfd, 0x81, 0xe, 0xc1, 0x88, + 0x10, 0xc8, 0x48, 0x64, 0x9, 0x83, 0xf, 0xd8, + 0x7f, 0x21, 0xe4, 0x32, 0x12, 0x4, 0x39, 0xb, + 0x2, 0x1f, 0xb0, 0x90, 0xe4, 0x70, 0x20, 0xc0, + 0x85, 0x81, 0xd, 0xa0, 0xc0, 0x87, 0xf6, 0x20, + 0x42, 0x43, 0x21, 0x90, 0xd8, 0x64, 0x24, 0x18, + 0x7c, 0x88, 0x83, 0x2, 0x1f, 0xc8, 0x10, 0x60, + 0x41, 0xe0, 0x21, 0xd8, 0x20, 0x21, 0xca, 0xf, + 0xc8, 0x7f, 0x21, 0x90, 0xff, 0x90, 0xd8, 0x6c, + 0x3e, 0x42, 0xc3, 0x21, 0x90, 0xfb, 0x9, 0xf, + 0xfe, 0x2a, 0x1f, 0xc8, 0x10, 0xff, 0x90, 0xf6, + 0xc, 0x30, /* U+0078 "x" */ 0x2f, 0x83, 0xdf, 0x24, 0x12, 0x1a, 0x9, 0x2, @@ -847,47 +847,48 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xa0, 0x20, 0x80, 0x87, 0x21, 0x40, /* U+0079 "y" */ - 0xfa, 0xf, 0x5e, 0x90, 0x21, 0xe4, 0x1c, 0x1f, - 0xfc, 0x4, 0x32, 0x19, 0xe, 0x41, 0x86, 0xc0, - 0x83, 0x2, 0x19, 0x4, 0x4, 0x3f, 0xf8, 0xa8, - 0x10, 0x21, 0x90, 0x60, 0xc1, 0x86, 0xc0, 0x81, - 0x2, 0x19, 0xf, 0xfe, 0x12, 0x12, 0x4, 0x3d, - 0x81, 0xc1, 0x87, 0x90, 0x68, 0x10, 0xfe, 0x43, - 0xfe, 0x43, 0x21, 0xfb, 0xd, 0x7, 0xe4, 0x3f, - 0xf8, 0x48, 0x10, 0xff, 0x60, 0xc3, 0xfd, 0x81, - 0xf, 0xf2, 0x1f, 0xfc, 0x34, 0x3f, 0xd0, 0x30, - 0xfe, 0x50, 0x10, 0xfb, 0xd0, 0x20, 0xff, 0xe0, - 0x28, 0x3f, 0xea, 0x7, 0xe0, + 0x7e, 0xf, 0xbe, 0x10, 0x90, 0xe4, 0x39, 0x6, + 0x1d, 0x81, 0x6, 0x4, 0x39, 0x6, 0x4, 0x3f, + 0xe4, 0x3c, 0x84, 0x87, 0xc8, 0x30, 0xb0, 0x21, + 0xb0, 0x21, 0x20, 0xc3, 0x21, 0xfc, 0x87, 0x20, + 0x44, 0x8, 0x7b, 0x6, 0x60, 0xc3, 0xc8, 0x10, + 0xc8, 0x7f, 0xc8, 0x7f, 0x90, 0x40, 0x43, 0xf6, + 0x4, 0x18, 0x7e, 0x43, 0x90, 0xfe, 0x43, 0xff, + 0x85, 0x84, 0x87, 0xf9, 0xb, 0xf, 0xfe, 0x12, + 0x1f, 0xfc, 0x14, 0x3f, 0xe4, 0x18, 0x7f, 0xd8, + 0x10, 0xff, 0x90, 0xff, 0xe0, 0xe0, 0x83, 0xf3, + 0xe0, 0x90, 0xff, 0xe0, 0xc1, 0xff, 0xc1, 0xd0, + 0xfc, /* U+007A "z" */ - 0xff, 0xfe, 0x0, 0x7f, 0xf0, 0x97, 0xf0, 0x75, - 0x7e, 0xa, 0xf, 0xd0, 0x48, 0x7e, 0x41, 0x87, - 0xe8, 0x8, 0x7e, 0x50, 0x20, 0xfd, 0x2, 0xf, - 0xc8, 0x48, 0x7e, 0x81, 0x7, 0xe8, 0xa, 0xf, - 0xc8, 0x20, 0xfd, 0x1, 0xf, 0xca, 0x4, 0x1f, - 0xa0, 0x41, 0xf9, 0x9, 0xf, 0xd0, 0x55, 0xfc, - 0x19, 0x7f, 0x83, 0xff, 0x82, + 0xff, 0xfe, 0x4, 0x1f, 0xfc, 0x15, 0xfc, 0x1b, + 0xaf, 0xc8, 0x48, 0x7c, 0xa0, 0x41, 0xfa, 0x2, + 0x83, 0xe4, 0x28, 0x3f, 0x40, 0x83, 0xf4, 0x12, + 0x1f, 0x90, 0x61, 0xfb, 0x2, 0x1f, 0x90, 0xa0, + 0xfd, 0x2, 0xf, 0xd0, 0x14, 0x1f, 0x90, 0x41, + 0xfb, 0x4, 0x1f, 0x90, 0x90, 0xfd, 0x5, 0x5f, + 0xc1, 0x97, 0xf8, 0x3f, 0xf8, 0x20, /* U+007B "{" */ - 0xf, 0xfe, 0x23, 0xc1, 0xea, 0x8, 0x72, 0x81, - 0x87, 0x40, 0xc3, 0x90, 0x21, 0xec, 0x18, 0x79, - 0xf, 0xfe, 0x2, 0x1f, 0xff, 0x54, 0x3f, 0xa0, - 0x41, 0xbc, 0x5, 0x7, 0xe8, 0x3f, 0x90, 0xee, - 0x4, 0x1e, 0x50, 0x20, 0xf4, 0x4, 0x3f, 0xff, - 0xe1, 0xc8, 0x79, 0x6, 0x1e, 0x80, 0x87, 0xc8, - 0x20, 0xf4, 0x7, 0xf, 0x68, 0x87, 0xd7, 0x0, + 0xf, 0x94, 0x1e, 0xec, 0x3b, 0xf, 0xb0, 0x50, + 0x24, 0x24, 0x36, 0x8, 0x39, 0xf, 0xf9, 0xf, + 0xff, 0x72, 0x1f, 0xb0, 0x21, 0x32, 0x8, 0x29, + 0x4, 0x1f, 0x90, 0xc8, 0x58, 0x6b, 0xa, 0xe, + 0x80, 0x87, 0x21, 0xff, 0xf6, 0x43, 0x90, 0xfd, + 0x83, 0xe, 0x40, 0xa0, 0xe8, 0x12, 0x19, 0x81, + 0x7, 0x3b, 0x0, /* U+007C "|" */ 0xf8, 0x3f, 0xff, 0xe1, 0xff, 0xe2, 0x58, /* U+007D "}" */ - 0xf, 0xe7, 0x43, 0xd1, 0x40, 0xec, 0xc, 0x1d, - 0x81, 0xf, 0x20, 0x83, 0xb0, 0x21, 0xc8, 0x7f, - 0xfd, 0x90, 0xe4, 0x18, 0x74, 0x4, 0x3c, 0x83, - 0xc1, 0xa4, 0x3e, 0x50, 0x7d, 0x2, 0xc2, 0x80, - 0xa0, 0xc8, 0x30, 0xfc, 0x87, 0xff, 0xdd, 0x2, - 0x1d, 0x3, 0xd, 0x4, 0x85, 0x20, 0xc3, 0xce, - 0x1d, 0x70, 0x78, + 0x60, 0xfb, 0x74, 0x3b, 0x4, 0x86, 0x70, 0x41, + 0xe4, 0x8, 0x76, 0x8, 0x39, 0xf, 0xff, 0xe2, + 0x4, 0x3b, 0x4, 0x1c, 0xa0, 0x68, 0x69, 0x4, + 0x1c, 0x87, 0xd8, 0x2c, 0x24, 0xa, 0xd, 0x3, + 0xf, 0xc8, 0x7f, 0xfd, 0xd0, 0x21, 0xd0, 0x20, + 0xd0, 0x10, 0xd2, 0x8, 0x3c, 0xe1, 0xd7, 0x7, + 0x80, /* U+007E "~" */ 0x3, 0xf4, 0x1f, 0x54, 0x6, 0x9, 0xc3, 0xcb, @@ -904,242 +905,238 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+00A3 "£" */ 0xf, 0x5f, 0x90, 0xf9, 0xd0, 0xd6, 0x1c, 0xc1, 0xfb, 0xd, 0x1, 0xfa, 0x9, 0x4, 0x14, 0x12, - 0x81, 0x81, 0x4, 0x1d, 0x81, 0xe, 0x43, 0x97, + 0x81, 0x81, 0x4, 0x1d, 0x1, 0xe, 0x43, 0xcb, 0x7, 0xff, 0x2, 0xa0, 0xff, 0xf8, 0x78, 0x2f, 0xe0, 0xff, 0xe4, 0x28, 0x32, 0xe0, 0xea, 0x5, - 0xd6, 0xf, 0xff, 0xf8, 0x79, 0xf, 0xfe, 0x16, - 0x4, 0x3f, 0xd2, 0x6, 0xbf, 0xc8, 0x65, 0xff, - 0x7, 0xff, 0xc, + 0xd6, 0xf, 0xff, 0xf8, 0x7f, 0xf2, 0x60, 0x21, + 0xfe, 0x90, 0x35, 0xfe, 0x43, 0x2f, 0xf8, 0x3f, + 0xf8, 0x60, /* U+00B0 "°" */ - 0xa, 0xa0, 0xce, 0xb6, 0x82, 0xe, 0x98, 0x17, - 0x81, 0xa4, 0x82, 0x10, 0x21, 0x21, 0xa0, 0xa0, - 0x43, 0xf2, 0x4a, 0xe, 0x51, 0x40, 0xa8, 0x0, + 0xa, 0xa0, 0xce, 0xb6, 0x82, 0xe, 0x98, 0x1f, + 0x3, 0x48, 0x28, 0x40, 0x84, 0x86, 0x82, 0x81, + 0xf, 0xc9, 0x28, 0x39, 0x45, 0x2, 0xa0, /* U+00B1 "±" */ - 0xe, 0xf8, 0x3f, 0xff, 0xe1, 0xff, 0xc3, 0xad, - 0x85, 0x5e, 0x5c, 0x19, 0x7c, 0x1f, 0xfc, 0x2f, - 0xe0, 0xbf, 0xc1, 0xff, 0xff, 0xf, 0xfe, 0x87, - 0xc1, 0xff, 0xc9, 0xaf, 0xfe, 0x0, 0x17, 0xff, + 0xf, 0x7c, 0x1f, 0xff, 0xf0, 0xff, 0xe1, 0x3f, + 0xc1, 0x7f, 0x83, 0xff, 0x9f, 0x7f, 0x5, 0xfc, + 0x1f, 0xff, 0xf0, 0xff, 0xe1, 0xac, 0x1f, 0xf5, + 0x41, 0xff, 0xc8, 0xaf, 0xfe, 0x0, 0x17, 0xff, 0x80, 0x1f, 0xfc, 0x30, /* U+00B2 "²" */ - 0x5, 0xf4, 0x16, 0x84, 0xe2, 0x12, 0x15, 0x1, - 0xd8, 0x14, 0x21, 0xeb, 0x83, 0x90, 0xec, 0x10, - 0x68, 0x10, 0x69, 0x14, 0x14, 0x8c, 0x14, 0x8c, - 0x14, 0x85, 0x59, 0x9, 0x78, 0x3f, 0x80, + 0x5, 0xf4, 0x16, 0x84, 0xe4, 0x6, 0x80, 0x90, + 0x4b, 0xb, 0x41, 0xea, 0x21, 0x21, 0xf4, 0x8, + 0x34, 0x8a, 0xa, 0x46, 0xa, 0x46, 0x9, 0x40, + 0x82, 0x60, 0x4b, 0xa0, 0xab, 0x83, 0xf8, /* U+00B3 "³" */ - 0x5, 0xf4, 0x16, 0x84, 0xe6, 0x12, 0x14, 0x17, - 0x60, 0x7e, 0xe, 0x42, 0xa6, 0x8, 0x25, 0x3, - 0xf, 0xd8, 0x6f, 0x20, 0x83, 0xa0, 0x3f, 0x7, - 0x90, 0x76, 0x6, 0x9, 0xa, 0x34, 0x27, 0x0, + 0x5, 0xf4, 0x7, 0x42, 0x72, 0x5, 0x10, 0x2d, + 0x2a, 0x7, 0x44, 0x3b, 0xa, 0x98, 0x10, 0x94, + 0xc, 0x32, 0x81, 0x86, 0xa6, 0x4, 0x3f, 0x7e, + 0xf, 0x20, 0x9c, 0x1c, 0x6, 0x2, 0x8d, 0xa, + 0x80, /* U+00B5 "µ" */ 0xf8, 0x3e, 0xf8, 0x3f, 0xff, 0xe1, 0xff, 0xff, - 0xf, 0xfe, 0x52, 0x1f, 0xfc, 0xc, 0x3a, 0xf, - 0x28, 0x25, 0x7, 0xd7, 0xd0, 0x7f, 0xf0, 0x50, - 0xf4, 0x85, 0x40, 0xf3, 0x7c, 0x9f, 0x7, 0xff, - 0xfc, 0x3f, 0xf8, 0x80, + 0xf, 0xe4, 0x3f, 0xf9, 0xb8, 0x72, 0x1e, 0x50, + 0x4c, 0x1f, 0x5f, 0x41, 0xff, 0xc1, 0x43, 0xd2, + 0x15, 0x3, 0xcd, 0xf2, 0x7c, 0x1f, 0xff, 0xf0, + 0xff, 0xe2, 0x0, /* U+00BF "¿" */ 0xe, 0xb4, 0x3f, 0xc9, 0x7, 0xff, 0x2d, 0x20, 0xff, 0x5a, 0x1f, 0xfe, 0x5f, 0x83, 0xf9, 0xf, - 0xfe, 0x6, 0x1f, 0xfc, 0x4, 0x10, 0x7e, 0x82, - 0x43, 0xe5, 0x2, 0xf, 0xd0, 0x14, 0x1f, 0x41, - 0x41, 0xf9, 0x6, 0x1f, 0xa0, 0x21, 0xfc, 0x83, - 0xf, 0xfe, 0x2, 0x1f, 0xfc, 0x6a, 0x83, 0x21, - 0xcb, 0x8, 0x30, 0xd0, 0x6c, 0xa, 0x2, 0x80, - 0x88, 0x57, 0xa0, 0xa0, 0x61, 0xfb, 0xd, 0xa1, - 0x9c, 0x20, + 0xfe, 0x1a, 0x1f, 0xd0, 0x30, 0xfd, 0x4, 0x87, + 0xca, 0x4, 0x1f, 0xa0, 0x28, 0x3e, 0x82, 0x83, + 0xf2, 0xc, 0x3f, 0x40, 0x43, 0xf9, 0x6, 0x1f, + 0xfc, 0x4, 0x3f, 0xf8, 0xd5, 0x6, 0x43, 0x96, + 0x10, 0x61, 0x90, 0xd8, 0x14, 0x6, 0x4, 0x21, + 0x5e, 0x82, 0x41, 0x87, 0xec, 0x36, 0x86, 0x70, + 0x80, /* U+00C0 "À" */ - 0xe, 0x68, 0x87, 0xff, 0x15, 0x6a, 0x7, 0xff, - 0x16, 0x2, 0x1f, 0xfc, 0x55, 0x2, 0xf, 0xfe, - 0x2c, 0x8a, 0xf, 0xfe, 0x2c, 0x8, 0x3f, 0xf8, - 0xdf, 0x7, 0xff, 0x6f, 0xe0, 0xff, 0xe2, 0xa1, - 0x21, 0xff, 0xc4, 0x82, 0xc3, 0xff, 0x90, 0x87, - 0xff, 0xd, 0xf, 0xfe, 0x46, 0x8, 0x10, 0x7f, - 0xf0, 0x90, 0x20, 0x43, 0xff, 0x82, 0x82, 0x10, - 0xff, 0xe1, 0xe0, 0x4c, 0x8, 0x7f, 0xf0, 0x10, - 0xc8, 0x20, 0xff, 0x90, 0x21, 0xff, 0xc5, 0xc1, - 0x84, 0x81, 0xf, 0xf2, 0x4, 0x28, 0x18, 0x7f, - 0x20, 0x43, 0xe4, 0x3f, 0xb0, 0x61, 0xc8, 0x10, - 0xfc, 0x81, 0xe, 0xc1, 0x87, 0xfd, 0xfe, 0x80, - 0x87, 0xd0, 0x7f, 0xf0, 0x50, 0xf2, 0x1f, 0xfc, - 0x1c, 0x3f, 0xbf, 0xf8, 0x8, 0x74, 0x4, 0x3f, - 0xf8, 0x8, 0x64, 0x18, 0x7f, 0x20, 0xc3, 0xe4, - 0x3f, 0xb0, 0x21, 0x21, 0xff, 0xc1, 0x43, 0xd0, - 0x20, 0xff, 0x90, 0x41, 0xc8, 0x7f, 0xd8, 0x10, + 0xe, 0x68, 0x87, 0xff, 0x15, 0x54, 0xf, 0xfe, + 0x1a, 0x80, 0x87, 0xff, 0x12, 0x41, 0x7, 0xff, + 0x12, 0x44, 0x3f, 0xf8, 0xb0, 0x30, 0xff, 0xe2, + 0xfc, 0x1f, 0xfd, 0x9f, 0x83, 0xff, 0x88, 0x87, + 0xff, 0x1e, 0x9, 0xf, 0xfe, 0x3e, 0x1f, 0xfc, + 0x24, 0x32, 0x1f, 0xfc, 0x28, 0x10, 0x7f, 0xf1, + 0x94, 0x8, 0x3f, 0xf8, 0x8, 0x30, 0x90, 0xff, + 0xe0, 0x40, 0x44, 0x3f, 0xf8, 0xf8, 0x10, 0xff, + 0x20, 0x80, 0x83, 0xf, 0xf4, 0x4, 0x39, 0xf, + 0xfe, 0x2a, 0x4, 0x3f, 0x20, 0x43, 0x60, 0xc3, + 0xf4, 0x8, 0x32, 0x4, 0x3f, 0xf8, 0xa8, 0x7f, + 0x21, 0x7f, 0x90, 0x21, 0xe8, 0x3f, 0xf8, 0x10, + 0x7f, 0xf3, 0x50, 0x3f, 0xf9, 0x2, 0x1a, 0x6, + 0x1f, 0xb0, 0x61, 0xf2, 0x1f, 0x90, 0x21, 0x21, + 0xff, 0xc4, 0x41, 0x2, 0xf, 0xf2, 0xc, 0x39, + 0xf, 0xf6, 0x4, 0x43, 0xff, 0x84, 0x86, /* U+00C1 "Á" */ - 0xf, 0xfe, 0x3, 0x44, 0x3f, 0xf8, 0x94, 0x58, - 0x3f, 0xf8, 0x88, 0x20, 0xff, 0xe2, 0x60, 0x90, - 0xff, 0xe1, 0xa0, 0x50, 0x7f, 0xf1, 0x21, 0x83, - 0xff, 0x8b, 0xe8, 0x3f, 0xfb, 0x7f, 0x7, 0xff, - 0x15, 0x9, 0xf, 0xfe, 0x24, 0x16, 0x1f, 0xfc, - 0x84, 0x3f, 0xf8, 0x68, 0x7f, 0xf2, 0x30, 0x40, - 0x83, 0xff, 0x84, 0x81, 0x2, 0x1f, 0xfc, 0x14, - 0x10, 0x87, 0xff, 0xf, 0x2, 0x60, 0x43, 0xff, - 0x80, 0x86, 0x41, 0x7, 0xfc, 0x81, 0xf, 0xfe, - 0x2e, 0xc, 0x24, 0x8, 0x7f, 0x90, 0x21, 0x40, - 0xc3, 0xf9, 0x2, 0x1f, 0x21, 0xfd, 0x83, 0xe, - 0x40, 0x87, 0xe4, 0x8, 0x76, 0xc, 0x3f, 0xef, - 0xf4, 0x4, 0x3e, 0x83, 0xff, 0x82, 0x87, 0x90, - 0xff, 0xe0, 0xe1, 0xfd, 0xff, 0xc0, 0x43, 0xa0, - 0x21, 0xff, 0xc0, 0x43, 0x20, 0xc3, 0xf9, 0x6, - 0x1f, 0x21, 0xfd, 0x81, 0x9, 0xf, 0xfe, 0xa, - 0x1e, 0x81, 0x7, 0xfc, 0x82, 0xe, 0x43, 0xfe, - 0xc0, 0x80, + 0xf, 0xfe, 0x5, 0x41, 0xff, 0xc4, 0x94, 0x1f, + 0xfc, 0x45, 0x2, 0xf, 0xfe, 0x1c, 0xc, 0x3f, + 0xf8, 0x68, 0x20, 0xff, 0xe2, 0x42, 0x83, 0xff, + 0x89, 0xe8, 0x3f, 0xfb, 0x3f, 0x7, 0xff, 0x11, + 0xf, 0xfe, 0x3c, 0x12, 0x1f, 0xfc, 0x7c, 0x3f, + 0xf8, 0x48, 0x64, 0x3f, 0xf8, 0x50, 0x20, 0xff, + 0xe3, 0x28, 0x10, 0x7f, 0xf0, 0x10, 0x61, 0x21, + 0xff, 0xc0, 0x80, 0x88, 0x7f, 0xf1, 0xf0, 0x21, + 0xfe, 0x41, 0x1, 0x6, 0x1f, 0xe8, 0x8, 0x72, + 0x1f, 0xfc, 0x54, 0x8, 0x7e, 0x40, 0x86, 0xc1, + 0x87, 0xe8, 0x10, 0x64, 0x8, 0x7f, 0xf1, 0x50, + 0xfe, 0x42, 0xff, 0x20, 0x43, 0xd0, 0x7f, 0xf0, + 0x20, 0xff, 0xe6, 0xa0, 0x7f, 0xf2, 0x4, 0x34, + 0xc, 0x3f, 0x60, 0xc3, 0xe4, 0x3f, 0x20, 0x42, + 0x43, 0xff, 0x88, 0x82, 0x4, 0x1f, 0xe4, 0x18, + 0x72, 0x1f, 0xec, 0x8, 0x87, 0xff, 0x9, 0xc, /* U+00C2 "Â" */ - 0xf, 0xe6, 0x43, 0xff, 0x8a, 0xcc, 0x1f, 0xfc, - 0x58, 0x2c, 0x3f, 0xf8, 0x78, 0x30, 0x41, 0xff, - 0xc1, 0x81, 0x98, 0xa0, 0xff, 0xe0, 0x6c, 0x14, - 0x87, 0xff, 0x5, 0x90, 0x99, 0xf, 0xfe, 0xc7, - 0xc1, 0xff, 0xc5, 0x42, 0x43, 0xff, 0x89, 0x5, - 0x87, 0xff, 0x21, 0xf, 0xfe, 0x1a, 0x1f, 0xfc, - 0x8c, 0x10, 0x20, 0xff, 0xe1, 0x20, 0x40, 0x87, - 0xff, 0x5, 0x4, 0x21, 0xff, 0xc3, 0xc0, 0x98, - 0x10, 0xff, 0xe0, 0x21, 0x90, 0x41, 0xff, 0x20, - 0x43, 0xff, 0x8b, 0x83, 0x9, 0x2, 0x1f, 0xe4, - 0x8, 0x50, 0x30, 0xfe, 0x40, 0x87, 0xc8, 0x7f, - 0x60, 0xc3, 0x90, 0x21, 0xf9, 0x2, 0x1d, 0x83, - 0xf, 0xfb, 0xfd, 0x1, 0xf, 0xa0, 0xff, 0xe0, - 0xa1, 0xe4, 0x3f, 0xf8, 0x38, 0x7f, 0x7f, 0xf0, - 0x10, 0xe8, 0x8, 0x7f, 0xf0, 0x10, 0xc8, 0x30, - 0xfe, 0x41, 0x87, 0xc8, 0x7f, 0x60, 0x42, 0x43, - 0xff, 0x82, 0x87, 0xa0, 0x41, 0xff, 0x20, 0x83, - 0x90, 0xff, 0xb0, 0x20, + 0xf, 0xe6, 0xf, 0xfe, 0x34, 0xe1, 0xff, 0xc4, + 0xc2, 0x83, 0xff, 0x85, 0x83, 0x10, 0xff, 0xe0, + 0xc0, 0xc8, 0xc3, 0xff, 0x82, 0xc0, 0x64, 0x3f, + 0xf8, 0x14, 0x42, 0x60, 0xff, 0xeb, 0xfc, 0x1f, + 0xfc, 0x44, 0x3f, 0xf8, 0xf0, 0x48, 0x7f, 0xf1, + 0xf0, 0xff, 0xe1, 0x21, 0x90, 0xff, 0xe1, 0x40, + 0x83, 0xff, 0x8c, 0xa0, 0x41, 0xff, 0xc0, 0x41, + 0x84, 0x87, 0xff, 0x2, 0x2, 0x21, 0xff, 0xc7, + 0xc0, 0x87, 0xf9, 0x4, 0x4, 0x18, 0x7f, 0xa0, + 0x21, 0xc8, 0x7f, 0xf1, 0x50, 0x21, 0xf9, 0x2, + 0x1b, 0x6, 0x1f, 0xa0, 0x41, 0x90, 0x21, 0xff, + 0xc5, 0x43, 0xf9, 0xb, 0xfc, 0x81, 0xf, 0x41, + 0xff, 0xc0, 0x83, 0xff, 0x9a, 0x81, 0xff, 0xc8, + 0x10, 0xd0, 0x30, 0xfd, 0x83, 0xf, 0x90, 0xfc, + 0x81, 0x9, 0xf, 0xfe, 0x22, 0x8, 0x10, 0x7f, + 0x90, 0x61, 0xc8, 0x7f, 0xb0, 0x22, 0x1f, 0xfc, + 0x24, 0x30, /* U+00C3 "Ã" */ - 0xf, 0xfe, 0x12, 0x1f, 0xfc, 0x1f, 0x41, 0xac, - 0x3f, 0xec, 0xe, 0x90, 0x7f, 0xf0, 0x20, 0xeb, - 0x48, 0x3f, 0xc9, 0x78, 0x39, 0xf, 0xf2, 0xc0, - 0xe5, 0x61, 0xff, 0x50, 0x33, 0x40, 0xff, 0xec, - 0xfc, 0x1f, 0xfc, 0x54, 0x24, 0x3f, 0xf8, 0x90, - 0x58, 0x7f, 0xf2, 0x10, 0xff, 0xe1, 0xa1, 0xc8, - 0x7f, 0xf0, 0xa0, 0x40, 0xc3, 0xff, 0x8a, 0x81, - 0xf, 0xfe, 0xa, 0x4, 0x40, 0x87, 0xff, 0x3, - 0x4, 0x60, 0xc3, 0xff, 0x80, 0x86, 0x40, 0x87, - 0xfc, 0x81, 0x9, 0x2, 0x1f, 0xec, 0x18, 0x58, - 0x30, 0xff, 0x20, 0x42, 0x40, 0x87, 0xf2, 0x4, - 0x39, 0x2, 0x1f, 0xb0, 0x61, 0xd8, 0x30, 0xfc, - 0x81, 0xe, 0x40, 0x87, 0xc8, 0x5f, 0xf0, 0x7f, - 0xb0, 0xff, 0xe0, 0xc1, 0xe4, 0x3f, 0xf8, 0x28, - 0x72, 0x17, 0xff, 0x7, 0xec, 0x8, 0x7f, 0x20, - 0x83, 0x20, 0x83, 0xfb, 0x2, 0x1f, 0xfc, 0x54, - 0x3d, 0x1, 0xf, 0xf9, 0x2, 0x4, 0x18, 0x7f, - 0xd8, 0x20, 0xe4, 0x3f, 0xe4, 0x30, + 0xf, 0xfe, 0xa, 0x1f, 0xfc, 0x7, 0xc8, 0x56, + 0x1f, 0xf4, 0x9, 0x20, 0xff, 0xe0, 0x41, 0xad, + 0x10, 0xff, 0x25, 0xc1, 0xa0, 0xff, 0x2c, 0x3a, + 0xb0, 0xff, 0xa8, 0x1a, 0x81, 0xff, 0xd8, 0xf4, + 0x1f, 0xfc, 0x44, 0x8, 0x7f, 0xf1, 0x20, 0x90, + 0xff, 0xe3, 0xe1, 0xff, 0xc2, 0x43, 0x21, 0xff, + 0xc2, 0x81, 0x7, 0xff, 0x19, 0x40, 0x43, 0xff, + 0x80, 0x83, 0xa, 0xf, 0xfe, 0x4, 0x4, 0x43, + 0xff, 0x8f, 0x81, 0xf, 0xf2, 0x8, 0x8, 0x30, + 0xff, 0x40, 0x43, 0x90, 0xff, 0xe2, 0xa0, 0x43, + 0xf2, 0x4, 0x36, 0xc, 0x3f, 0x40, 0x83, 0x20, + 0x43, 0xff, 0x8a, 0x87, 0xf2, 0x17, 0xf9, 0x2, + 0x1e, 0x83, 0xff, 0x81, 0x7, 0xff, 0x35, 0x3, + 0xff, 0x90, 0x21, 0xa0, 0x61, 0xfb, 0x6, 0x1f, + 0x21, 0xf9, 0x2, 0x12, 0x1f, 0xfc, 0x44, 0x10, + 0x20, 0xff, 0x20, 0xc3, 0x90, 0xff, 0x60, 0x44, + 0x3f, 0xf8, 0x48, 0x60, /* U+00C4 "Ä" */ - 0xe, 0x7c, 0x84, 0xf9, 0xf, 0xe8, 0x10, 0x50, - 0x20, 0xff, 0xe8, 0xc0, 0x82, 0x81, 0x7, 0xf3, - 0xe4, 0x27, 0xc8, 0x7f, 0xfa, 0x7d, 0x7, 0xff, - 0x1d, 0xf, 0xfe, 0x24, 0x12, 0x1f, 0xfc, 0x34, - 0x2c, 0x3f, 0xf8, 0xe8, 0x7f, 0xf0, 0x90, 0x40, - 0x43, 0xff, 0x83, 0x1, 0x6, 0x1f, 0xfc, 0x34, - 0x24, 0x3f, 0xf8, 0x8, 0x32, 0xf, 0xfe, 0x14, - 0x4, 0x41, 0x7, 0xff, 0x1d, 0xf, 0xf2, 0x8, - 0x24, 0x3f, 0xf8, 0x18, 0x10, 0xb0, 0x41, 0xfc, - 0x87, 0x90, 0x21, 0xf9, 0x2, 0x1f, 0xfc, 0x4c, - 0x18, 0x72, 0x4, 0x3e, 0x41, 0x7f, 0x20, 0x83, - 0xc8, 0x7f, 0xf1, 0xf0, 0xff, 0xe0, 0xa1, 0xc8, - 0x3f, 0xf4, 0xc, 0x32, 0x1f, 0xf2, 0x4, 0x36, - 0x4, 0x3f, 0xf8, 0x8, 0x48, 0x30, 0xfe, 0x41, - 0x87, 0x90, 0xfe, 0x80, 0x82, 0x2, 0x1f, 0xfc, - 0x24, 0x41, 0x87, 0xfc, 0x83, + 0xc, 0xf9, 0xc, 0xf9, 0xf, 0xd0, 0x20, 0xd0, + 0x20, 0xff, 0xe8, 0x40, 0x83, 0x40, 0x83, 0xf3, + 0xe4, 0x33, 0xe4, 0x3f, 0xfd, 0x17, 0xa0, 0xff, + 0xe2, 0x20, 0x43, 0xff, 0x90, 0x87, 0xff, 0x9, + 0xd, 0x87, 0xff, 0xa, 0xc, 0x87, 0xff, 0x16, + 0xf, 0xfe, 0x1a, 0x5, 0x1, 0xf, 0xfe, 0x4, + 0xc, 0x28, 0x3f, 0xf8, 0x68, 0x87, 0xff, 0x5, + 0xe, 0xc0, 0x87, 0xfb, 0x4, 0x4, 0x18, 0x7f, + 0x90, 0x21, 0xc8, 0x7f, 0x21, 0xf2, 0x4, 0x3f, + 0x60, 0x43, 0x60, 0xc3, 0xf2, 0x8, 0x32, 0x4, + 0x3e, 0x43, 0xf9, 0xf, 0xec, 0x2f, 0xf2, 0x4, + 0x3c, 0x87, 0xff, 0x2, 0xf, 0xfe, 0x6c, 0x7, + 0xff, 0x20, 0x43, 0x20, 0xc3, 0xf6, 0xc, 0x3e, + 0x43, 0xf2, 0x4, 0x28, 0x3f, 0xf8, 0x88, 0x10, + 0x41, 0xfe, 0x41, 0x87, 0x21, 0xfe, 0xc0, 0x88, + 0x7f, 0xf0, 0x90, 0xc0, /* U+00C5 "Å" */ - 0xf, 0xdf, 0x41, 0xff, 0xc2, 0x70, 0x9c, 0x3f, - 0xf8, 0x31, 0x79, 0x20, 0xff, 0xe1, 0x20, 0x84, - 0x3f, 0xf8, 0x48, 0x11, 0xf, 0xfe, 0x4, 0x5e, - 0x88, 0x3f, 0xf8, 0xe, 0x81, 0xc3, 0xff, 0x87, - 0x7a, 0xf, 0xfe, 0xc5, 0xe4, 0x3f, 0xf8, 0x88, - 0x20, 0xff, 0xe1, 0xa1, 0xff, 0xc7, 0xc3, 0x21, - 0xff, 0xc2, 0x43, 0x61, 0xff, 0xc1, 0x40, 0x81, - 0xf, 0xfe, 0xe, 0xd, 0x2, 0x1f, 0xfc, 0x4, - 0xc, 0xc, 0x3f, 0xe4, 0x8, 0x64, 0x3f, 0xec, - 0x18, 0x10, 0x21, 0xfe, 0x40, 0x83, 0x6, 0x1f, - 0xfc, 0x4, 0x24, 0x8, 0x7f, 0x40, 0xc3, 0x20, - 0x43, 0xf2, 0x4, 0x36, 0xc, 0x3f, 0xf8, 0x88, - 0x10, 0xfa, 0x4, 0x1e, 0x40, 0x87, 0x90, 0x5f, - 0xe4, 0x18, 0x7f, 0xf1, 0xd0, 0xe4, 0x3f, 0xf8, - 0xf0, 0x2f, 0xfc, 0x82, 0xf, 0x90, 0xfd, 0x1, - 0x9, 0x2, 0x1f, 0xfc, 0x48, 0x18, 0x7f, 0x90, - 0x41, 0xc8, 0x7f, 0xb0, 0x22, 0x1f, 0xfc, 0x24, - 0x36, 0x4, 0x3f, 0xf8, 0x68, + 0xf, 0xd7, 0xa0, 0xff, 0xe1, 0xe8, 0x1c, 0x3f, + 0xf8, 0x31, 0x7a, 0x20, 0xff, 0xe0, 0x22, 0x4, + 0x43, 0xff, 0x80, 0x88, 0x11, 0xf, 0xfe, 0x4, + 0x5e, 0x88, 0x3f, 0xf8, 0x3a, 0x7, 0xf, 0xfe, + 0x1d, 0xe8, 0x3f, 0xfb, 0xf, 0xa0, 0xff, 0xe2, + 0x60, 0x43, 0xff, 0x88, 0x84, 0x87, 0xff, 0x9, + 0xd, 0x87, 0xff, 0xb, 0xc, 0x87, 0xff, 0x9, + 0x4, 0x1f, 0xfc, 0x34, 0xa, 0x2, 0x1f, 0xfc, + 0xc, 0x18, 0x50, 0x7f, 0xf0, 0x10, 0x22, 0x1f, + 0xfc, 0x14, 0x3b, 0x2, 0x1f, 0xec, 0x10, 0x10, + 0x61, 0xfe, 0x40, 0x87, 0x21, 0xff, 0xc5, 0x43, + 0xfe, 0x80, 0x86, 0xc1, 0x7, 0xe4, 0x10, 0x64, + 0x8, 0x7f, 0xf1, 0x50, 0xfe, 0x82, 0xff, 0x20, + 0x43, 0xc8, 0x7f, 0xf0, 0x30, 0xff, 0xe3, 0xa1, + 0xd0, 0x1f, 0xfc, 0x81, 0xc, 0x83, 0xf, 0xd8, + 0x30, 0xf9, 0xf, 0xc8, 0x10, 0x90, 0xff, 0xe3, + 0xc0, 0x83, 0xfc, 0x82, 0xe, 0x43, 0xfd, 0x81, + 0x10, 0xff, 0xe1, 0x21, 0x80, /* U+00C6 "Æ" */ 0xf, 0xfe, 0xf, 0xff, 0xf0, 0xc3, 0xff, 0x82, 0x87, 0xff, 0x42, 0xf, 0x2f, 0xf0, 0x7f, 0xf0, - 0x10, 0xf7, 0x5f, 0xc1, 0xff, 0xc0, 0x80, 0x87, - 0xff, 0x31, 0xa, 0xf, 0xfe, 0x64, 0x4, 0x3f, - 0xf9, 0x88, 0x50, 0x7f, 0xf3, 0x20, 0xff, 0xe7, - 0xa1, 0x41, 0xff, 0xcc, 0x82, 0x43, 0xff, 0x96, - 0x85, 0x7, 0xbf, 0xf8, 0x3f, 0xa0, 0x90, 0xff, - 0xe5, 0xa1, 0x41, 0xf9, 0x7f, 0x7, 0xe8, 0x24, - 0x3e, 0xeb, 0xf0, 0x7c, 0x84, 0x87, 0xff, 0x32, - 0xa, 0xf, 0xfe, 0x5a, 0x1a, 0xbc, 0x1f, 0xfc, - 0x68, 0x32, 0xf8, 0x3f, 0xf8, 0xa8, 0x7f, 0xf4, - 0x20, 0xbf, 0xf0, 0x7f, 0xf1, 0x10, 0x90, 0xff, - 0xe6, 0x41, 0x41, 0xff, 0xcb, 0x42, 0x43, 0xff, - 0x81, 0xd7, 0xf8, 0x82, 0x83, 0xff, 0x82, 0xbf, - 0xe0, 0xc8, 0x7f, 0xf3, 0x0, + 0x10, 0xf7, 0x5f, 0xc1, 0xff, 0xc0, 0x81, 0x7, + 0xff, 0x31, 0x9, 0xf, 0xfe, 0x64, 0x8, 0x3f, + 0xf9, 0x88, 0x48, 0x7f, 0xf3, 0x20, 0x41, 0xff, + 0xcc, 0x42, 0x43, 0xff, 0x99, 0x1, 0xf, 0xfe, + 0x62, 0x14, 0x1e, 0xff, 0xe0, 0xfe, 0x80, 0x87, + 0xff, 0x31, 0xa, 0xf, 0xcb, 0xf8, 0x3f, 0x60, + 0x43, 0xf7, 0x5f, 0x83, 0xf2, 0x8, 0x3f, 0xf9, + 0x90, 0x7f, 0xf4, 0x10, 0xab, 0xc1, 0xff, 0xc6, + 0x83, 0x2f, 0x83, 0xff, 0x8c, 0x87, 0xff, 0x3e, + 0xb, 0xff, 0x7, 0xff, 0x15, 0x4, 0x1f, 0xfc, + 0xc8, 0x24, 0x3f, 0xf9, 0x88, 0x10, 0xff, 0xe0, + 0x75, 0xfe, 0x20, 0xa0, 0xff, 0xe0, 0xaf, 0xf8, + 0x40, 0x87, 0xff, 0x30, /* U+00C7 "Ç" */ 0xe, 0x7f, 0xa0, 0xfc, 0xf0, 0x73, 0xa1, 0xcc, - 0x1f, 0xd2, 0x1a, 0x3, 0xfc, 0x82, 0xa, 0x3, - 0x7, 0x41, 0x20, 0x41, 0x7, 0xd0, 0x21, 0x2, - 0x1f, 0x90, 0xd8, 0x30, 0xff, 0xe0, 0xa1, 0xff, - 0xc0, 0xa8, 0x32, 0x1f, 0xcb, 0x7, 0xff, 0xfc, - 0x3f, 0xfc, 0x88, 0x7f, 0x2c, 0x21, 0xff, 0xc0, - 0xa8, 0xc1, 0x87, 0xff, 0x5, 0x2, 0x1f, 0x90, - 0xe4, 0x10, 0x7d, 0x2, 0x4, 0x6, 0xe, 0x82, - 0x42, 0x80, 0xff, 0x20, 0x83, 0x30, 0x7f, 0x48, - 0x73, 0xa1, 0x9b, 0x43, 0xf5, 0x82, 0x88, 0x7f, - 0xf0, 0xa4, 0x3f, 0xf8, 0x28, 0x20, 0xff, 0xe0, - 0xd8, 0x7f, 0xf5, 0x60, 0xff, 0xe1, 0xe9, 0x7, - 0xff, 0xe, 0x43, 0xc0, + 0x19, 0xd, 0x21, 0xa0, 0x3e, 0xbc, 0x82, 0xa, + 0x3, 0x7, 0x41, 0x20, 0x41, 0x7, 0xd0, 0x21, + 0x2, 0x1f, 0x90, 0xd8, 0x30, 0xff, 0xe0, 0xa0, + 0x43, 0xfa, 0xa0, 0xff, 0xe1, 0x2c, 0x1f, 0xff, + 0xf0, 0xff, 0xf7, 0x2c, 0x20, 0x43, 0xfa, 0xa3, + 0x6, 0x1f, 0xfc, 0x14, 0x8, 0x7e, 0x43, 0xf4, + 0x1f, 0x40, 0x81, 0x81, 0x83, 0xa0, 0x90, 0xa0, + 0x3f, 0xc8, 0x20, 0xcc, 0x1f, 0xd2, 0x1c, 0xe8, + 0x75, 0xa1, 0xfa, 0xc1, 0x68, 0x7f, 0xf0, 0xa4, + 0x3f, 0xf8, 0x28, 0x20, 0xff, 0xe0, 0xd8, 0x7f, + 0xf5, 0x60, 0xff, 0xe1, 0xe9, 0x7, 0xff, 0x1, + 0x4, 0x87, 0x80, /* U+00C8 "È" */ 0x1a, 0x83, 0xfc, 0xbb, 0xf, 0xf6, 0x14, 0x1f, 0xec, 0xa, 0xf, 0xf6, 0x8, 0x3f, 0xed, 0x41, - 0xff, 0xc0, 0xa0, 0x7f, 0xf2, 0x3f, 0xff, 0x83, - 0x7, 0xff, 0x19, 0x7f, 0xb0, 0xba, 0xfe, 0x43, - 0xff, 0xfe, 0x1f, 0xfc, 0xef, 0xfe, 0x83, 0xff, - 0x8e, 0xbf, 0xb0, 0xdd, 0x7e, 0x43, 0xff, 0xfe, - 0x1f, 0xfd, 0xde, 0xbf, 0x90, 0xcb, 0xfd, 0x87, - 0xff, 0x8, + 0xff, 0xc0, 0xa0, 0x7f, 0xf2, 0x3f, 0xff, 0x84, + 0x1f, 0xfc, 0x65, 0xff, 0x5, 0xd7, 0xf8, 0x3f, + 0xff, 0xe1, 0xff, 0xce, 0xff, 0xe8, 0x3f, 0xf8, + 0xeb, 0xfb, 0xd, 0xd7, 0xe4, 0x3f, 0xff, 0xe1, + 0xff, 0xdd, 0xeb, 0xfc, 0x19, 0x7f, 0xc1, 0xff, + 0xc2, /* U+00C9 "É" */ 0xf, 0xcd, 0x41, 0xfc, 0xca, 0xf, 0xf4, 0x6, 0xf, 0xd0, 0x18, 0x3f, 0x28, 0x60, 0xff, 0x34, - 0xf, 0xf3, 0x21, 0xff, 0xc8, 0xff, 0xfe, 0xc, - 0x1f, 0xfc, 0x65, 0xfe, 0xc2, 0xeb, 0xf9, 0xf, - 0xff, 0xf8, 0x7f, 0xf3, 0xbf, 0xfa, 0xf, 0xfe, - 0x3a, 0xfe, 0xc3, 0x75, 0xf9, 0xf, 0xff, 0xf8, - 0x7f, 0xf7, 0x7a, 0xfe, 0x43, 0x2f, 0xf6, 0x1f, - 0xfc, 0x20, + 0xf, 0xf3, 0x21, 0xff, 0xc8, 0xff, 0xfe, 0x10, + 0x7f, 0xf1, 0x97, 0xfc, 0x17, 0x5f, 0xe0, 0xff, + 0xff, 0x87, 0xff, 0x3b, 0xff, 0xa0, 0xff, 0xe3, + 0xaf, 0xec, 0x37, 0x5f, 0x90, 0xff, 0xff, 0x87, + 0xff, 0x77, 0xaf, 0xf0, 0x65, 0xff, 0x7, 0xff, + 0x8, /* U+00CA "Ê" */ - 0xf, 0x48, 0x7f, 0xdb, 0x21, 0xfd, 0x5, 0x21, - 0xf4, 0x9a, 0x41, 0xe5, 0x11, 0x3, 0xf, 0x32, - 0xd, 0x41, 0xcc, 0x86, 0xa0, 0x7f, 0xf1, 0x7f, - 0xff, 0x83, 0x7, 0xff, 0x19, 0x7f, 0xb0, 0xba, - 0xfe, 0x43, 0xff, 0xfe, 0x1f, 0xfc, 0xef, 0xfe, - 0x83, 0xff, 0x8e, 0xbf, 0xb0, 0xdd, 0x7e, 0x43, - 0xff, 0xfe, 0x1f, 0xfd, 0xde, 0xbf, 0x90, 0xcb, - 0xfd, 0x87, 0xff, 0x8, + 0xf, 0x48, 0x7f, 0xdb, 0x21, 0xfd, 0x85, 0x21, + 0xf4, 0xd, 0x20, 0xf2, 0x88, 0x81, 0x87, 0x99, + 0x6, 0xa0, 0xe6, 0x43, 0x50, 0x3f, 0xf8, 0xbf, + 0xff, 0xc2, 0xf, 0xfe, 0x32, 0xff, 0x82, 0xeb, + 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xe7, 0x7f, 0xf4, + 0x1f, 0xfc, 0x75, 0xfd, 0x86, 0xeb, 0xf2, 0x1f, + 0xff, 0xf0, 0xff, 0xee, 0xf5, 0xfe, 0xc, 0xbf, + 0xe0, 0xff, 0xe1, 0x0, /* U+00CB "Ë" */ 0x1f, 0x21, 0xad, 0xa, 0x4, 0x19, 0x20, 0xff, 0xe2, 0xc0, 0x83, 0x24, 0x13, 0xe4, 0x35, 0xa1, - 0xff, 0xd2, 0xff, 0xfe, 0xc, 0x1f, 0xfc, 0x65, - 0xfe, 0xc2, 0xeb, 0xf9, 0xf, 0xff, 0xf8, 0x7f, - 0xf3, 0xbf, 0xf8, 0x3f, 0xf9, 0xb, 0xf8, 0x3b, - 0xaf, 0xc1, 0xff, 0xff, 0xf, 0xfe, 0xf7, 0x5f, - 0xc8, 0x65, 0xfe, 0xc3, 0xff, 0x84, + 0xff, 0xd2, 0xff, 0xfe, 0x10, 0x7f, 0xf1, 0x97, + 0xfc, 0x17, 0x5f, 0xe0, 0xff, 0xff, 0x87, 0xff, + 0x3b, 0xff, 0x83, 0xff, 0x90, 0xbf, 0x83, 0xba, + 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xef, 0x75, 0xfe, + 0xc, 0xbf, 0xe0, 0xff, 0xe1, 0x0, /* U+00CC "Ì" */ 0x6a, 0xc, 0xba, 0xd, 0x81, 0x41, 0xb0, 0x41, @@ -1148,10 +1145,10 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xe0, /* U+00CD "Í" */ - 0xc, 0xd1, 0xd, 0x45, 0x83, 0x20, 0xc3, 0x60, - 0x83, 0x40, 0x90, 0xdb, 0x21, 0xcc, 0x87, 0xff, - 0xf, 0xe0, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, - 0xff, 0xe1, 0xc0, + 0xc, 0xd1, 0xa, 0x8b, 0x4, 0x83, 0xb, 0x6, + 0x14, 0x8, 0x36, 0xc8, 0x66, 0x43, 0xff, 0x83, + 0xf0, 0x7f, 0xff, 0xc3, 0xff, 0xfe, 0x1f, 0xfe, + 0xa0, /* U+00CE "Î" */ 0x9, 0x90, 0xfa, 0x60, 0xf6, 0x16, 0x1a, 0x6, @@ -1166,22 +1163,21 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xff, 0xf, 0xff, 0x50, /* U+00D0 "Ð" */ - 0xb, 0xff, 0x48, 0x7f, 0xf1, 0x1b, 0xf, 0xf2, - 0xc1, 0xda, 0x1f, 0xaa, 0xf4, 0x14, 0x1f, 0xfc, - 0x17, 0xa, 0xf, 0xfe, 0x16, 0x4, 0x3f, 0xf8, - 0x68, 0x10, 0xff, 0xe1, 0x60, 0xc3, 0xff, 0x8a, - 0x87, 0xff, 0x9, 0xf, 0xfe, 0x4d, 0x30, 0xab, - 0x7, 0xe5, 0x6, 0x5c, 0x1f, 0xfc, 0xef, 0x82, - 0xfc, 0x1f, 0xfe, 0xe4, 0x3f, 0xf9, 0x8, 0x7f, - 0xf0, 0xa0, 0x61, 0xff, 0xc5, 0x43, 0xff, 0x83, - 0x81, 0xf, 0xfe, 0x3, 0x85, 0x7, 0xd5, 0x7a, - 0xa, 0xf, 0xcb, 0x7, 0x68, 0x7f, 0xf0, 0x5b, - 0xc, + 0xb, 0xff, 0x48, 0x7f, 0xf1, 0x5b, 0x43, 0xfe, + 0x50, 0x74, 0x87, 0xf7, 0x4f, 0x90, 0x41, 0xff, + 0xc3, 0x90, 0x61, 0xff, 0xc3, 0x83, 0xff, 0x8e, + 0x82, 0xf, 0xfe, 0x1e, 0x4, 0x3f, 0xf8, 0x68, + 0x7f, 0xf7, 0x9a, 0x5, 0xd4, 0x1f, 0xda, 0x83, + 0x2c, 0x1f, 0xfd, 0xb, 0xc1, 0x7e, 0xf, 0xff, + 0xf8, 0x72, 0x1f, 0xfc, 0x6c, 0x8, 0x7f, 0xf0, + 0xd0, 0x41, 0xff, 0xc2, 0xc3, 0xff, 0x88, 0xe1, + 0x61, 0xfb, 0xa7, 0xa0, 0xa0, 0xff, 0x28, 0x3a, + 0x43, 0xff, 0x84, 0xda, 0x18, /* U+00D1 "Ñ" */ 0xf, 0xfe, 0x2, 0x1f, 0x9f, 0x41, 0xac, 0x3e, - 0x80, 0xe9, 0x7, 0xe8, 0x3a, 0xd2, 0xf, 0x25, - 0xe0, 0xe4, 0x3c, 0xb0, 0x35, 0xb0, 0xfa, 0x81, + 0x80, 0xe9, 0x7, 0xe8, 0x3a, 0xd1, 0xf, 0x25, + 0xe0, 0xe8, 0x3c, 0xb0, 0x35, 0xb0, 0xfa, 0x81, 0xaa, 0xf, 0xfe, 0x57, 0xc8, 0x7f, 0xbe, 0xa, 0xf, 0xfe, 0x2a, 0x1f, 0xfc, 0x48, 0x3f, 0xf8, 0xb0, 0x7f, 0xf1, 0x10, 0xff, 0xe1, 0x20, 0x83, @@ -1192,83 +1188,83 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x28, 0x48, 0x7f, 0xf0, 0x70, 0x41, 0xff, 0xc2, 0x40, 0x87, 0xff, 0x6, 0x4, 0x1f, 0xfc, 0x24, 0x10, 0x7f, 0xf0, 0x60, 0x21, 0xff, 0xc2, 0x43, - 0xff, 0x89, 0x7, 0xff, 0x15, 0xf, 0xfe, 0x24, + 0xff, 0x89, 0x7, 0xff, 0x16, 0xf, 0xfe, 0x22, 0x1f, 0xfc, 0x58, 0x20, /* U+00D2 "Ò" */ - 0x9, 0xf9, 0xf, 0xfe, 0xa, 0x81, 0x7, 0xff, - 0xa, 0xa, 0xf, 0xfe, 0x16, 0x5, 0x7, 0xff, - 0xb, 0x4, 0x1f, 0xfc, 0x39, 0x41, 0xff, 0xc3, - 0x68, 0x1f, 0xfd, 0x36, 0xfd, 0x7, 0xf3, 0xc8, - 0x67, 0x43, 0xcc, 0x1f, 0xd4, 0xe, 0x80, 0xff, - 0x20, 0x50, 0x50, 0x18, 0x3a, 0x41, 0x4, 0x82, - 0xf, 0xa0, 0x91, 0x2, 0x1f, 0xc8, 0x33, 0x6, - 0x1f, 0xd8, 0x11, 0xf, 0xfe, 0x2, 0x1f, 0x21, - 0xff, 0xff, 0xf, 0xff, 0xc2, 0x1f, 0xfc, 0x24, - 0x3f, 0xf8, 0x8, 0x7d, 0x87, 0xf6, 0x4, 0x80, - 0x87, 0xf2, 0xc, 0x3a, 0xf, 0xa0, 0x90, 0x60, - 0x70, 0xe9, 0x4, 0x1a, 0xb, 0xf9, 0x2, 0x83, - 0x30, 0x7f, 0x50, 0x3c, 0xf0, 0x73, 0xa1, 0x80, + 0xa, 0xf9, 0xf, 0xfe, 0xc, 0x82, 0xf, 0xfe, + 0x14, 0x14, 0x1f, 0xfc, 0x2c, 0x8, 0x7f, 0xf0, + 0xf0, 0x61, 0xff, 0xc3, 0x94, 0x1f, 0xfc, 0x36, + 0x81, 0xff, 0xd3, 0x7f, 0xa0, 0xfe, 0x78, 0x39, + 0xe0, 0xf3, 0x6, 0x43, 0x30, 0x74, 0x7, 0xd7, + 0x90, 0x28, 0x28, 0xc, 0x1d, 0x20, 0x82, 0x41, + 0x7, 0xd0, 0x48, 0x81, 0xf, 0xe4, 0x19, 0x83, + 0xf, 0xec, 0x8, 0x81, 0xf, 0xe4, 0x3f, 0xff, + 0xe1, 0xff, 0xff, 0xf, 0xfe, 0x22, 0x4, 0x3f, + 0x90, 0xd8, 0x30, 0xfe, 0xc0, 0x88, 0x10, 0xfe, + 0x41, 0x81, 0x4, 0x1f, 0x41, 0x20, 0x80, 0xc1, + 0xd2, 0x8, 0x34, 0x7, 0xd7, 0x90, 0x28, 0x33, + 0x6, 0x43, 0x30, 0x79, 0xe0, 0xe7, 0x83, 0x0, /* U+00D3 "Ó" */ 0xf, 0xf7, 0xd0, 0x7f, 0xf0, 0x60, 0xa0, 0xff, 0xe0, 0x28, 0x18, 0x7f, 0xf0, 0x60, 0x61, 0xff, 0xc1, 0x81, 0x7, 0xff, 0xb, 0x64, 0x3f, 0xf8, - 0x4c, 0x87, 0xff, 0x4d, 0xbf, 0x41, 0xfc, 0xf2, - 0x19, 0xd0, 0xf3, 0x7, 0xf5, 0x3, 0xa0, 0x3f, - 0xc8, 0x14, 0x14, 0x6, 0xe, 0x90, 0x41, 0x20, - 0x83, 0xe8, 0x24, 0x40, 0x87, 0xf2, 0xc, 0xc1, - 0x87, 0xf6, 0x4, 0x43, 0xff, 0x80, 0x87, 0xc8, - 0x7f, 0xff, 0xc3, 0xff, 0xf0, 0x87, 0xff, 0x9, - 0xf, 0xfe, 0x2, 0x1f, 0x61, 0xfd, 0x81, 0x20, - 0x21, 0xfc, 0x83, 0xe, 0x83, 0xe8, 0x24, 0x18, - 0x1c, 0x3a, 0x41, 0x6, 0x82, 0xfe, 0x40, 0xa0, - 0xcc, 0x1f, 0xd4, 0xf, 0x3c, 0x1c, 0xe8, 0x60, + 0x4c, 0x87, 0xff, 0x4d, 0xfe, 0x83, 0xf9, 0xe0, + 0xe7, 0x83, 0xcc, 0x19, 0xc, 0xc1, 0xd0, 0x1f, + 0x5e, 0x40, 0xa0, 0xa0, 0x30, 0x74, 0x82, 0x9, + 0x4, 0x1f, 0x41, 0x22, 0x4, 0x3f, 0x90, 0x66, + 0xc, 0x3f, 0xb0, 0x22, 0x4, 0x3f, 0x90, 0xff, + 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xf8, 0x88, 0x10, + 0xfe, 0x43, 0x60, 0xc3, 0xfb, 0x2, 0x20, 0x43, + 0xf9, 0x6, 0x4, 0x10, 0x7d, 0x4, 0x82, 0x3, + 0x7, 0x48, 0x20, 0xd0, 0x1f, 0x5e, 0x40, 0xa0, + 0xcc, 0x19, 0xc, 0xc1, 0xe7, 0x83, 0x9e, 0xc, /* U+00D4 "Ô" */ 0xf, 0xaf, 0x7, 0xff, 0x9, 0x40, 0x83, 0xff, - 0x83, 0x10, 0xa0, 0xff, 0xb1, 0x51, 0x7, 0xfa, - 0x4, 0x28, 0xc3, 0xfa, 0xf0, 0x57, 0x83, 0xff, - 0xc4, 0xdf, 0xa0, 0xfe, 0x79, 0xc, 0xe8, 0x79, - 0x83, 0xfa, 0x81, 0xd0, 0x1f, 0xe4, 0xa, 0xa, - 0x3, 0x7, 0x48, 0x20, 0x90, 0x41, 0xf4, 0x12, - 0x20, 0x43, 0xf9, 0x6, 0x60, 0xc3, 0xfb, 0x2, - 0x21, 0xff, 0xc0, 0x43, 0xe4, 0x3f, 0xff, 0xe1, - 0xff, 0xf8, 0x43, 0xff, 0x84, 0x87, 0xff, 0x1, - 0xf, 0xb0, 0xfe, 0xc0, 0x90, 0x10, 0xfe, 0x41, - 0x87, 0x41, 0xf4, 0x12, 0xc, 0xe, 0x1d, 0x20, - 0x83, 0x41, 0x7f, 0x20, 0x50, 0x66, 0xf, 0xea, - 0x7, 0x9e, 0xe, 0x74, 0x30, + 0x80, 0xc4, 0x28, 0x3f, 0xe8, 0x54, 0x41, 0xfe, + 0xc1, 0xa, 0x30, 0xfe, 0xf8, 0x2b, 0xc1, 0xff, + 0xe2, 0x7f, 0xa0, 0xfe, 0x78, 0x39, 0xe0, 0xf3, + 0x6, 0x43, 0x30, 0x74, 0x7, 0xd7, 0x90, 0x28, + 0x28, 0xc, 0x1d, 0x20, 0x82, 0x41, 0x7, 0xd0, + 0x48, 0x81, 0xf, 0xe4, 0x19, 0x83, 0xf, 0xec, + 0x8, 0x81, 0xf, 0xe4, 0x3f, 0xff, 0xe1, 0xff, + 0xff, 0xf, 0xfe, 0x22, 0x4, 0x3f, 0x90, 0xd8, + 0x30, 0xfe, 0xc0, 0x88, 0x10, 0xfe, 0x41, 0x81, + 0x4, 0x1f, 0x41, 0x20, 0x80, 0xc1, 0xd2, 0x8, + 0x34, 0x7, 0xd7, 0x90, 0x28, 0x33, 0x6, 0x43, + 0x30, 0x79, 0xe0, 0xe7, 0x83, 0x0, /* U+00D5 "Õ" */ 0xf, 0xfe, 0x2, 0x1f, 0xcf, 0xc8, 0x1b, 0xf, - 0xd0, 0x57, 0xa1, 0xf, 0xa0, 0xfe, 0x83, 0xe4, - 0xfa, 0xa, 0xf, 0xde, 0x9, 0xf9, 0xf, 0xff, - 0x13, 0x7e, 0x83, 0xf9, 0xe4, 0x33, 0xa1, 0xe6, - 0xf, 0xea, 0x7, 0x40, 0x7f, 0x90, 0x28, 0x28, - 0xc, 0x1d, 0x20, 0x82, 0x41, 0x7, 0xd0, 0x48, - 0x81, 0xf, 0xe4, 0x19, 0x83, 0xf, 0xec, 0x8, - 0x87, 0xff, 0x1, 0xf, 0x90, 0xff, 0xff, 0x87, - 0xff, 0xe1, 0xf, 0xfe, 0x12, 0x1f, 0xfc, 0x4, - 0x3e, 0xc3, 0xfb, 0x2, 0x40, 0x43, 0xf9, 0x6, - 0x1d, 0x7, 0xd0, 0x48, 0x30, 0x38, 0x74, 0x82, - 0xd, 0x5, 0xfc, 0x81, 0x41, 0x98, 0x3f, 0xa8, - 0x1e, 0x78, 0x39, 0xd0, 0xc0, + 0xd0, 0x57, 0xa0, 0xfe, 0x83, 0xfa, 0xf, 0x93, + 0xe8, 0x29, 0xf, 0xbc, 0x13, 0xf2, 0x1f, 0xfe, + 0x27, 0xfa, 0xf, 0xe7, 0x83, 0x9e, 0xf, 0x30, + 0x64, 0x33, 0x7, 0x40, 0x7d, 0x79, 0x2, 0x82, + 0x80, 0xc1, 0xd2, 0x8, 0x24, 0x10, 0x7d, 0x4, + 0x88, 0x10, 0xfe, 0x41, 0x98, 0x30, 0xfe, 0xc0, + 0x88, 0x10, 0xfe, 0x43, 0xff, 0xfe, 0x1f, 0xff, + 0xf0, 0xff, 0xe2, 0x20, 0x43, 0xf9, 0xd, 0x83, + 0xf, 0xec, 0x8, 0x81, 0xf, 0xe4, 0x18, 0x10, + 0x41, 0xf4, 0x12, 0x8, 0xc, 0x1d, 0x20, 0x83, + 0x40, 0x7d, 0x79, 0x2, 0x83, 0x30, 0x64, 0x33, + 0x7, 0x9e, 0xe, 0x78, 0x30, /* U+00D6 "Ö" */ 0x9, 0xf2, 0x13, 0xe4, 0x3e, 0x81, 0x5, 0x2, 0xf, 0xfe, 0x6c, 0x8, 0x28, 0x10, 0x7c, 0xf9, - 0x9, 0xf2, 0x1f, 0xfe, 0x16, 0xfd, 0x7, 0xf3, - 0xc8, 0x67, 0x43, 0xcc, 0x1f, 0xd4, 0xe, 0x80, - 0xff, 0x20, 0x50, 0x50, 0x18, 0x3a, 0x41, 0x4, - 0x82, 0xf, 0xa0, 0x91, 0x2, 0x1f, 0xc8, 0x33, - 0x6, 0x1f, 0xd8, 0x11, 0xf, 0xfe, 0x2, 0x1f, - 0x21, 0xff, 0xff, 0xf, 0xff, 0xc2, 0x1f, 0xfc, - 0x24, 0x3f, 0xf8, 0x8, 0x7d, 0x87, 0xf6, 0x4, - 0x80, 0x87, 0xf2, 0xc, 0x3a, 0xf, 0xa0, 0x90, - 0x60, 0x70, 0xe9, 0x4, 0x1a, 0xb, 0xf9, 0x2, - 0x83, 0x30, 0x7f, 0x50, 0x3c, 0xf0, 0x73, 0xa1, - 0x80, + 0x9, 0xf2, 0x1f, 0xfe, 0x17, 0xfa, 0xf, 0xe7, + 0x83, 0x9e, 0xf, 0x30, 0x64, 0x33, 0x7, 0x40, + 0x7d, 0x79, 0x2, 0x82, 0x80, 0xc1, 0xd2, 0x8, + 0x24, 0x10, 0x7d, 0x4, 0x88, 0x10, 0xfe, 0x41, + 0x98, 0x30, 0xfe, 0xc0, 0x88, 0x10, 0xfe, 0x43, + 0xff, 0xfe, 0x1f, 0xff, 0xf0, 0xff, 0xe2, 0x20, + 0x43, 0xf9, 0xd, 0x83, 0xf, 0xec, 0x8, 0x81, + 0xf, 0xe4, 0x18, 0x10, 0x41, 0xf4, 0x12, 0x8, + 0xc, 0x1d, 0x20, 0x83, 0x40, 0x7d, 0x79, 0x2, + 0x83, 0x30, 0x64, 0x33, 0x7, 0x9e, 0xe, 0x78, + 0x30, /* U+00D7 "×" */ 0xf, 0xfe, 0x2e, 0x87, 0xd6, 0x16, 0x41, 0xe5, @@ -1281,21 +1277,21 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x41, 0x68, 0x7d, 0x60, /* U+00D8 "Ø" */ - 0xf, 0xfe, 0x1f, 0x83, 0xcd, 0xf9, 0x2, 0x21, - 0xd4, 0x43, 0x5b, 0x10, 0x6d, 0xf, 0xd0, 0x86, - 0x82, 0xbf, 0x21, 0x61, 0x28, 0x1a, 0x1a, 0xb, - 0xa, 0x4, 0x1f, 0xe4, 0x3c, 0x87, 0x90, 0xc8, - 0x81, 0xf, 0xa1, 0x6, 0x60, 0xc3, 0xc8, 0xe0, - 0x44, 0x3f, 0xa2, 0x43, 0xe4, 0x3a, 0x10, 0xff, - 0xe1, 0xa4, 0x1f, 0xfc, 0x28, 0x43, 0xff, 0x86, - 0x90, 0x7f, 0xf0, 0xa2, 0xf, 0xfe, 0x1a, 0x21, - 0xff, 0x20, 0x88, 0x3f, 0x90, 0xe4, 0x43, 0x21, - 0xb0, 0x64, 0x41, 0xd8, 0x11, 0x2, 0xc2, 0x1c, - 0x83, 0xe, 0x88, 0x39, 0x9, 0x4, 0x19, 0xe, - 0x80, 0x84, 0x87, 0xf6, 0x14, 0x1a, 0xb, 0xf8, - 0x2c, 0x3a, 0xf, 0xf6, 0x1c, 0x83, 0x90, 0x9b, - 0xf, 0x44, 0x37, 0xd2, 0x1f, 0x32, 0x1f, 0xfc, - 0x20, + 0xf, 0xfe, 0x1f, 0x83, 0xcd, 0xf9, 0x4, 0x21, + 0xdc, 0x86, 0xb5, 0x10, 0x6c, 0x3f, 0xa1, 0xd, + 0x85, 0x7e, 0xd, 0x4, 0x85, 0xa1, 0xb0, 0xa0, + 0xa0, 0x41, 0xfe, 0x43, 0xc8, 0x7a, 0xc, 0x88, + 0x10, 0xf9, 0x10, 0x66, 0xc, 0x3d, 0xe, 0x4, + 0x43, 0xf9, 0x24, 0x3e, 0x43, 0xa1, 0xf, 0xfe, + 0x1a, 0x41, 0xff, 0xc2, 0x84, 0x3f, 0xf8, 0x69, + 0x7, 0xff, 0xa, 0x10, 0xff, 0xe1, 0xa4, 0x1f, + 0xf2, 0x8, 0x43, 0xf9, 0xe, 0x48, 0x32, 0x1b, + 0x6, 0x42, 0x1d, 0x81, 0x10, 0x2c, 0x41, 0xc8, + 0x30, 0xe8, 0x83, 0xf9, 0x4, 0x19, 0xe, 0xc0, + 0x84, 0xa0, 0x90, 0xd8, 0x50, 0x6c, 0x2b, 0xf0, + 0x58, 0x74, 0x1f, 0xec, 0x39, 0x7, 0x21, 0xac, + 0x3d, 0x10, 0xdf, 0x90, 0xf9, 0x90, 0xff, 0xe1, + 0x0, /* U+00D9 "Ù" */ 0x3, 0xf4, 0x1f, 0xf3, 0x1, 0x41, 0xff, 0x28, @@ -1303,53 +1299,53 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x28, 0x3f, 0xf8, 0x1a, 0x83, 0xff, 0x85, 0x44, 0x3f, 0xf9, 0x5f, 0x7, 0xfb, 0xe0, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xff, 0xff, - 0x42, 0x40, 0x87, 0xfc, 0xe0, 0x83, 0xf4, 0xd, - 0xb, 0xf, 0x61, 0x24, 0x17, 0xf8, 0x28, 0xc, - 0x1f, 0xed, 0x9, 0xe4, 0x33, 0x61, 0x0, + 0xf, 0x90, 0xfc, 0x85, 0x2, 0xf, 0xd0, 0x24, + 0x2c, 0x3d, 0x84, 0x90, 0x5f, 0xe0, 0xa0, 0x30, + 0x7f, 0xa4, 0x27, 0x90, 0xcd, 0xa0, /* U+00DA "Ú" */ 0xf, 0xeb, 0xe4, 0x3f, 0xca, 0x4, 0x87, 0xfa, - 0x4, 0x87, 0xfa, 0x2, 0x83, 0xfc, 0xa1, 0x83, + 0x2, 0x83, 0xfd, 0x1, 0x83, 0xfc, 0xa1, 0x83, 0xff, 0x80, 0xd0, 0x3f, 0xf8, 0xc, 0x87, 0xff, 0x2f, 0xe0, 0xff, 0x7c, 0x1f, 0xff, 0xf0, 0xff, - 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe8, 0x48, - 0x10, 0xff, 0x9c, 0x10, 0x7e, 0x81, 0xa1, 0x61, - 0xec, 0x24, 0x82, 0xff, 0x5, 0x1, 0x83, 0xfd, - 0xa1, 0x3c, 0x86, 0x6c, 0x20, + 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xf2, + 0x1f, 0x90, 0xa0, 0x41, 0xfa, 0x4, 0x85, 0x87, + 0xb0, 0x92, 0xb, 0xfc, 0x14, 0x6, 0xf, 0xf4, + 0x84, 0xf2, 0x19, 0xb4, 0x0, /* U+00DB "Û" */ 0xf, 0x3e, 0x43, 0xff, 0x81, 0x2, 0xf, 0xfb, 0x14, 0x61, 0xfd, 0x82, 0x80, 0x83, 0xe8, 0x18, 0x31, 0x41, 0xeb, 0xc1, 0xbc, 0x87, 0xff, 0x5f, 0xe0, 0xff, 0x7c, 0x1f, 0xff, 0xf0, 0xff, 0xff, - 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe8, 0x48, 0x10, - 0xff, 0x9c, 0x10, 0x7e, 0x81, 0xa1, 0x61, 0xec, - 0x24, 0x82, 0xff, 0x5, 0x1, 0x83, 0xfd, 0xa1, - 0x3c, 0x86, 0x6c, 0x20, + 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xf2, 0x1f, + 0x90, 0xa0, 0x41, 0xfa, 0x4, 0x85, 0x87, 0xb0, + 0x92, 0xb, 0xfc, 0x14, 0x6, 0xf, 0xf4, 0x84, + 0xf2, 0x19, 0xb4, 0x0, /* U+00DC "Ü" */ 0x3, 0xe4, 0x33, 0xe4, 0x34, 0x8, 0x34, 0x8, 0x3f, 0xf9, 0x10, 0x20, 0xd0, 0x20, 0xcf, 0x90, 0xcf, 0x90, 0xff, 0xeb, 0x7c, 0x1f, 0xef, 0x83, 0xff, 0xfe, 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, - 0xff, 0xfd, 0x9, 0x2, 0x1f, 0xf3, 0x82, 0xf, - 0xd0, 0x34, 0x2c, 0x3d, 0x84, 0x90, 0x5f, 0xe0, - 0xa0, 0x30, 0x7f, 0xb4, 0x27, 0x90, 0xcd, 0x84, + 0xff, 0xfc, 0x3e, 0x43, 0xf2, 0x14, 0x8, 0x3f, + 0x40, 0x90, 0xb0, 0xf6, 0x12, 0x41, 0x7f, 0x82, + 0x80, 0xc1, 0xfe, 0x90, 0x9e, 0x43, 0x36, 0x80, /* U+00DD "Ý" */ 0xf, 0xf9, 0xa2, 0x1f, 0xfc, 0x26, 0x50, 0x7f, 0xf0, 0xe0, 0x48, 0x7f, 0xf0, 0x60, 0x28, 0x3f, 0xf8, 0x48, 0xc1, 0xff, 0xc2, 0xc1, 0x7, 0xff, 0xf, 0xe0, 0xff, 0xe8, 0x7d, 0x7, 0xf3, 0xf0, - 0x10, 0x21, 0xfd, 0x1, 0x4, 0x12, 0x1f, 0xf6, - 0x12, 0x8, 0x3e, 0x82, 0x42, 0xc3, 0xfc, 0x82, - 0xc, 0x85, 0x7, 0x21, 0x21, 0xd0, 0x10, 0xe8, - 0x8, 0x79, 0x9, 0xf, 0xa0, 0xfa, 0x4, 0x14, - 0x4, 0x3f, 0x21, 0xe4, 0x10, 0x7f, 0x20, 0x84, - 0x8, 0x7f, 0xa0, 0x24, 0xc, 0x3f, 0xe4, 0x10, - 0x48, 0x7f, 0xd0, 0x10, 0x41, 0xff, 0xc6, 0x43, - 0xff, 0x83, 0x5, 0x7, 0xff, 0x9, 0x9, 0xf, - 0xff, 0xf8, 0x7f, 0xff, 0xc3, 0xff, 0xa0, + 0x10, 0x21, 0xfd, 0x1, 0x4, 0x12, 0x1f, 0x21, + 0x61, 0x20, 0x83, 0xec, 0x24, 0x2c, 0x3f, 0xc8, + 0x20, 0xc8, 0x50, 0x72, 0x12, 0x1d, 0x1, 0xe, + 0x81, 0x7, 0x90, 0x90, 0xf9, 0xf, 0xa0, 0x41, + 0x40, 0x43, 0xf2, 0x1e, 0x41, 0x7, 0xf2, 0x8, + 0x40, 0x87, 0xfa, 0x2, 0x40, 0x83, 0xfe, 0x41, + 0x7, 0xff, 0xe, 0x2, 0x8, 0x3f, 0xf8, 0xc8, + 0x7f, 0xf0, 0x60, 0xa0, 0xff, 0xe1, 0x21, 0x21, + 0xff, 0xff, 0xf, 0xff, 0xf8, 0x7f, 0xf4, 0x0, /* U+00DE "Þ" */ 0xf8, 0x3f, 0xff, 0xff, 0xe8, 0x3f, 0xf8, 0x4f, @@ -1361,104 +1357,106 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, /* U+00DF "ß" */ - 0xc, 0xd4, 0x87, 0xe7, 0x96, 0xb0, 0xf3, 0x7, - 0xd8, 0x74, 0x7, 0xd0, 0x48, 0x48, 0x50, 0x14, - 0x8, 0x2c, 0x10, 0x6c, 0x3c, 0x81, 0xc, 0x87, - 0xff, 0x45, 0xf, 0xfe, 0x14, 0x8, 0x3f, 0xc8, - 0x48, 0x7f, 0xa0, 0x21, 0xff, 0xc2, 0x83, 0xff, - 0xc1, 0x7, 0xfd, 0x1, 0x41, 0xfe, 0x42, 0x90, - 0xff, 0x61, 0x41, 0xff, 0x61, 0x61, 0xff, 0x61, - 0x21, 0xff, 0x40, 0x83, 0xfe, 0x43, 0xff, 0xa2, - 0x87, 0xea, 0x6, 0x80, 0x87, 0x2b, 0xf0, 0x50, - 0x7f, 0xf0, 0x60, 0xf6, 0x86, 0x74, + 0xd, 0x59, 0xf, 0xce, 0xba, 0xc3, 0xcc, 0x1f, + 0x61, 0xd0, 0x1f, 0x41, 0x21, 0x21, 0x40, 0x50, + 0x20, 0xb0, 0x41, 0xa0, 0xf2, 0x4, 0x3f, 0xfa, + 0xc8, 0x7f, 0xf0, 0xa0, 0x41, 0xfe, 0x42, 0x43, + 0xfd, 0x81, 0xf, 0xf9, 0x4, 0x1f, 0xfe, 0x8, + 0x3f, 0xe8, 0xa, 0xf, 0xf2, 0x14, 0x87, 0xfb, + 0xa, 0xf, 0xfb, 0xb, 0xf, 0xfb, 0xa, 0xf, + 0xfa, 0x2, 0x1f, 0xf2, 0x1f, 0xfd, 0xaa, 0x6, + 0xc0, 0x87, 0x2b, 0xf0, 0x50, 0x7f, 0xf0, 0x60, + 0xf4, 0x86, 0x74, /* U+00E0 "à" */ - 0x1f, 0xa0, 0xfe, 0x60, 0x28, 0x3f, 0x98, 0x10, - 0x7f, 0x98, 0x18, 0x7f, 0x94, 0x8, 0x3f, 0xd7, - 0xa0, 0xff, 0xec, 0x37, 0xe8, 0x3d, 0xc8, 0x67, - 0x42, 0xc3, 0xfa, 0x4, 0x15, 0xf8, 0x28, 0x41, - 0x21, 0xa0, 0x25, 0x48, 0x72, 0x19, 0x60, 0xff, - 0xe1, 0xb5, 0xb0, 0xf3, 0xcb, 0x83, 0xcc, 0x1f, - 0xfc, 0x8, 0x2b, 0xf0, 0x68, 0x2d, 0xf, 0xc8, - 0x20, 0xff, 0xe0, 0xa1, 0xff, 0xcf, 0x43, 0xa0, - 0xc8, 0x20, 0xd2, 0x1a, 0xb, 0xf2, 0x1e, 0x83, - 0xec, 0x24, 0x74, 0x27, 0x16, 0x0, + 0x1f, 0xa0, 0xfe, 0x60, 0x28, 0x3f, 0x94, 0x8, + 0x3f, 0xd2, 0x8, 0x3f, 0xd0, 0x14, 0x1f, 0xee, + 0x81, 0xff, 0xc0, 0x58, 0x3f, 0xf9, 0x4d, 0xfa, + 0xf, 0x51, 0xc, 0xe8, 0x52, 0x1f, 0xa0, 0x28, + 0x17, 0xe0, 0xa2, 0x4, 0x86, 0x80, 0x86, 0x43, + 0x90, 0xdf, 0x7, 0xff, 0xd, 0xad, 0x87, 0x9e, + 0x5c, 0x1e, 0x60, 0xff, 0xe0, 0x41, 0x5f, 0x83, + 0x41, 0x68, 0x7e, 0x41, 0x7, 0xff, 0x5, 0xf, + 0xfe, 0x7a, 0x1d, 0x6, 0x41, 0x6, 0x90, 0xd0, + 0x5f, 0x90, 0xf4, 0x1f, 0x61, 0x23, 0xa1, 0x39, + 0x28, /* U+00E1 "á" */ 0xf, 0xd7, 0xc8, 0x7e, 0x50, 0x24, 0x3f, 0x40, 0x90, 0xfd, 0x82, 0x43, 0xf4, 0x9, 0xf, 0xeb, 0xc8, 0x7f, 0xf6, 0x1b, 0xf4, 0x1e, 0xe4, 0x33, - 0xa1, 0x61, 0xfd, 0x1, 0xa, 0xfc, 0x14, 0x40, - 0x90, 0xd0, 0x11, 0x70, 0x72, 0x1a, 0xa0, 0xff, - 0xe2, 0xae, 0xf, 0xaf, 0x56, 0xf, 0x68, 0x7f, - 0xd8, 0x57, 0xe0, 0xc8, 0x5a, 0x1f, 0xa0, 0x41, - 0xff, 0xc1, 0x43, 0xff, 0x9e, 0x87, 0x41, 0x90, - 0x41, 0xa4, 0x34, 0x17, 0xe4, 0x3d, 0x7, 0xd8, - 0x48, 0xe8, 0x4e, 0x2c, 0x0, + 0xa1, 0x61, 0x90, 0xd0, 0x10, 0xae, 0xf0, 0x51, + 0x2, 0x43, 0x40, 0x45, 0xc1, 0xc8, 0x6a, 0x83, + 0xff, 0x8a, 0xb8, 0x3e, 0xbd, 0x58, 0x3d, 0xa1, + 0xff, 0x61, 0x5f, 0x83, 0x21, 0x68, 0x7e, 0x81, + 0x7, 0xff, 0x5, 0xf, 0xfe, 0x7a, 0x1d, 0x6, + 0x41, 0x6, 0x90, 0xd0, 0x5f, 0x90, 0xf4, 0x1f, + 0x61, 0x23, 0xa1, 0x39, 0x28, /* U+00E2 "â" */ 0xe, 0x7c, 0x87, 0xfa, 0x4, 0x1f, 0xd8, 0xa3, 0xf, 0xa0, 0x50, 0x10, 0x72, 0x8c, 0x18, 0xa0, 0xcf, 0x83, 0x79, 0xf, 0xfe, 0xab, 0x7e, 0x83, - 0xdc, 0x86, 0x74, 0x2c, 0x3f, 0xa0, 0x41, 0x5f, - 0x82, 0x84, 0x12, 0x1a, 0x2, 0x54, 0x87, 0x21, - 0x96, 0xf, 0xfe, 0x1b, 0x5b, 0xf, 0x3c, 0xb8, - 0x3c, 0xc1, 0xff, 0xc0, 0x82, 0xbf, 0x6, 0x82, - 0xd0, 0xfc, 0x82, 0xf, 0xfe, 0xa, 0x1f, 0xfc, - 0xf4, 0x3a, 0xc, 0x82, 0xd, 0x21, 0xa0, 0xbf, - 0x21, 0xe8, 0x3e, 0xc2, 0x47, 0x42, 0x71, 0x60, + 0xdc, 0x86, 0x74, 0x2c, 0x32, 0x1a, 0x4, 0x17, + 0xaf, 0x5, 0x8, 0x20, 0xe8, 0x9, 0x52, 0x1c, + 0x86, 0x58, 0x3f, 0xf8, 0x6d, 0x6c, 0x3c, 0xf2, + 0xe0, 0xf3, 0x7, 0xff, 0x2, 0xa, 0xfc, 0x1a, + 0xb, 0x43, 0xf2, 0x8, 0x3f, 0xf8, 0x28, 0x7f, + 0xf3, 0xd0, 0xe8, 0x32, 0x8, 0x34, 0x86, 0x82, + 0xfc, 0x87, 0xa0, 0xfb, 0x9, 0x1d, 0x9, 0xc9, + 0x40, /* U+00E3 "ã" */ - 0xf, 0xf2, 0x1e, 0xfa, 0x3, 0x61, 0xb0, 0x9f, - 0x42, 0x14, 0x1f, 0xd0, 0x5b, 0xf9, 0x6c, 0x33, - 0x6, 0xa8, 0x3f, 0xfa, 0xed, 0xfa, 0xf, 0x72, - 0x19, 0xd0, 0xb0, 0xfe, 0x81, 0x5, 0x7e, 0xa, - 0x10, 0x48, 0x68, 0x9, 0x52, 0x1c, 0x86, 0x58, - 0x3f, 0xf8, 0x6d, 0x6c, 0x3c, 0xf2, 0xe0, 0xf3, - 0x7, 0xff, 0x2, 0xa, 0xfc, 0x1a, 0xb, 0x43, - 0xf2, 0x8, 0x3f, 0xf8, 0x28, 0x7f, 0xf3, 0xd0, - 0xe8, 0x32, 0x8, 0x34, 0x86, 0x82, 0xfc, 0x87, - 0xa0, 0xfb, 0x9, 0x1d, 0x9, 0xc5, 0x80, + 0xf, 0xfe, 0x2f, 0xd0, 0x1f, 0x6, 0xc2, 0x7d, + 0x8, 0x50, 0x7f, 0x41, 0x9f, 0xa5, 0xb0, 0xd4, + 0x9, 0xa8, 0x3f, 0xfa, 0xed, 0xfa, 0xf, 0x72, + 0x19, 0xd0, 0xb0, 0xc8, 0x68, 0x10, 0x5e, 0xbc, + 0x14, 0x20, 0x83, 0xa0, 0x25, 0x48, 0x72, 0x19, + 0x60, 0xff, 0xe1, 0xb5, 0xb0, 0xf3, 0xcb, 0x83, + 0xcc, 0x1f, 0xfc, 0x8, 0x2b, 0xf0, 0x68, 0x2d, + 0xf, 0xc8, 0x20, 0xff, 0xe0, 0xa1, 0xff, 0xcf, + 0x43, 0xa0, 0xc8, 0x20, 0xd2, 0x1a, 0xb, 0xf2, + 0x83, 0xa0, 0xfa, 0x9, 0x19, 0xa, 0xc5, 0x80, /* U+00E4 "ä" */ 0x1f, 0x21, 0x9f, 0x20, 0x81, 0x6, 0x81, 0x7, 0xff, 0x12, 0x4, 0x1a, 0x4, 0x7, 0xc8, 0x67, 0xc8, 0x7f, 0xf1, 0x9b, 0xf4, 0x1e, 0xe4, 0x33, - 0xa1, 0x61, 0xfd, 0x2, 0xa, 0xfc, 0x14, 0x20, - 0x90, 0xd0, 0x12, 0xa4, 0x39, 0xc, 0xb0, 0x7f, - 0xf0, 0xda, 0xd8, 0x79, 0xe5, 0xc1, 0xe6, 0xf, - 0xfe, 0x4, 0x15, 0xf8, 0x34, 0x16, 0x87, 0xe4, - 0x10, 0x7f, 0xf0, 0x50, 0xff, 0xe7, 0xa1, 0xd0, - 0x64, 0x10, 0x69, 0xd, 0x5, 0xf9, 0xf, 0x41, - 0xf6, 0x12, 0x3a, 0x13, 0x8b, 0x0, + 0xa1, 0x61, 0x90, 0xd0, 0x20, 0xbd, 0x78, 0x28, + 0x41, 0x7, 0x40, 0x4a, 0x90, 0xe4, 0x32, 0xc1, + 0xff, 0xc3, 0x6b, 0x61, 0xe7, 0x97, 0x7, 0x98, + 0x3f, 0xf8, 0x10, 0x57, 0xe0, 0xd0, 0x5a, 0x1f, + 0x90, 0x41, 0xff, 0xc1, 0x43, 0xff, 0x9e, 0x87, + 0x41, 0x90, 0x41, 0xa4, 0x34, 0x17, 0xe4, 0x3d, + 0x7, 0xd8, 0x48, 0xe8, 0x4e, 0x4a, 0x0, /* U+00E5 "å" */ 0xe, 0xbd, 0x7, 0xf6, 0x81, 0xc3, 0xe8, 0x7c, 0x90, 0x79, 0x20, 0x42, 0x1f, 0xfc, 0x84, 0x81, 0x8, 0x7a, 0x1f, 0x24, 0x1f, 0x68, 0x1c, 0x3f, 0xaf, 0x41, 0xff, 0xca, 0x6f, 0xd0, 0x7b, 0x90, - 0xce, 0x85, 0x87, 0xf4, 0x8, 0x2b, 0xf0, 0x50, - 0x82, 0x43, 0x40, 0x4a, 0x90, 0xe4, 0x32, 0xc1, - 0xff, 0xc3, 0x6b, 0x61, 0xe7, 0x97, 0x7, 0x98, - 0x3f, 0xf8, 0x10, 0x57, 0xe0, 0xd0, 0x5a, 0x1f, - 0x90, 0x41, 0xff, 0xc1, 0x43, 0xff, 0x9e, 0x87, - 0x41, 0x90, 0x41, 0xa4, 0x34, 0x17, 0xe4, 0x3d, - 0x7, 0xd8, 0x48, 0xe8, 0x4e, 0x2c, 0x0, + 0xce, 0x85, 0x86, 0x43, 0x40, 0x82, 0xf5, 0xe0, + 0xa1, 0x4, 0x1d, 0x1, 0x2a, 0x43, 0x90, 0xcb, + 0x7, 0xff, 0xd, 0xad, 0x87, 0x9e, 0x5c, 0x1e, + 0x60, 0xff, 0xe0, 0x41, 0x5f, 0x83, 0x41, 0x68, + 0x7e, 0x41, 0x7, 0xff, 0x5, 0xf, 0xfe, 0x7a, + 0x1d, 0x6, 0x41, 0x6, 0x90, 0xd0, 0x5f, 0x90, + 0xf4, 0x1f, 0x61, 0x23, 0xa1, 0x38, 0xb0, /* U+00E6 "æ" */ - 0x9, 0xbf, 0x21, 0x9f, 0xa4, 0x3d, 0xc8, 0x6b, - 0x7, 0x4, 0xd0, 0x36, 0x1f, 0xd6, 0x1f, 0x30, - 0x20, 0xaf, 0xa0, 0x20, 0x7e, 0x80, 0x81, 0x2, - 0x82, 0x50, 0x68, 0x25, 0x2, 0x10, 0x41, 0xd8, - 0x48, 0x76, 0x4, 0xbc, 0x1e, 0x42, 0xc3, 0x90, - 0xff, 0xe2, 0xa1, 0xff, 0xc1, 0x7f, 0xc1, 0x7f, - 0xc1, 0xee, 0xf, 0xfe, 0x4e, 0x1c, 0xa0, 0xcb, - 0xfe, 0x20, 0xaf, 0x53, 0xa, 0xbf, 0xc2, 0x5, - 0x7, 0xff, 0x2b, 0xf, 0xe4, 0x3f, 0xf8, 0x28, - 0x7f, 0x61, 0xff, 0xc1, 0x43, 0x90, 0x90, 0xf9, - 0x2, 0x8, 0x35, 0x3, 0x61, 0xd4, 0x48, 0x2f, - 0xc8, 0x30, 0xbf, 0x93, 0x4, 0x1f, 0xb3, 0x43, - 0xf4, 0x6, 0x42, 0x6c, 0x2a, 0x21, 0x36, 0x0, + 0x9, 0xbf, 0x21, 0xaf, 0xa4, 0x3d, 0xc8, 0x6b, + 0x6, 0x84, 0xd0, 0x36, 0x1f, 0xde, 0xf, 0x98, + 0x10, 0x57, 0xd0, 0x7b, 0xe8, 0x8, 0x10, 0x48, + 0x4a, 0xd, 0x84, 0xa0, 0x42, 0x4, 0x3a, 0x9, + 0xe, 0x80, 0x97, 0x83, 0xfd, 0x87, 0xff, 0x2d, + 0xf, 0xfe, 0xb, 0xfe, 0xb, 0xfe, 0xf, 0x70, + 0x7f, 0xf2, 0x70, 0xe5, 0x6, 0x5f, 0xf1, 0x5, + 0x7a, 0x98, 0x55, 0xfe, 0x10, 0x28, 0x3f, 0xf9, + 0x50, 0x7f, 0x21, 0xff, 0xcb, 0xc3, 0xff, 0x82, + 0x87, 0x21, 0x21, 0xf2, 0x4, 0x10, 0x6a, 0x6, + 0xd0, 0xd4, 0x48, 0x2f, 0xc8, 0x20, 0xae, 0xf2, + 0x60, 0x83, 0xf4, 0xe1, 0x90, 0xd0, 0x19, 0xd, + 0x68, 0x38, 0x33, 0x60, /* U+00E7 "ç" */ 0xd, 0x7e, 0x90, 0xe7, 0x43, 0x34, 0x9, 0x83, @@ -1468,56 +1466,56 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x87, 0xd5, 0x60, 0x43, 0xd0, 0x14, 0x14, 0x19, 0x40, 0xc8, 0xf, 0xe8, 0xa, 0x18, 0x3f, 0x30, 0x4e, 0x86, 0x68, 0x1e, 0x81, 0x72, 0x1f, 0xe9, - 0xf, 0xf2, 0x8, 0x3f, 0xd6, 0x1f, 0xfc, 0xf8, + 0xf, 0xf4, 0x8, 0x3f, 0xce, 0x1f, 0xfc, 0xf8, 0x3f, 0xf8, 0x1a, 0x41, 0xff, 0xc0, 0x90, 0xe0, /* U+00E8 "è" */ 0x7, 0xe0, 0xff, 0x61, 0x41, 0xfe, 0xc0, 0xa0, 0xff, 0x40, 0x83, 0xfc, 0xc0, 0x83, 0xfc, 0xfa, 0xf, 0xfe, 0xcb, 0xfa, 0x43, 0xdc, 0x19, 0xa0, - 0x6c, 0x3f, 0x30, 0x30, 0x3f, 0xa0, 0x22, 0x14, - 0x19, 0x40, 0x70, 0x41, 0xec, 0x1a, 0x4, 0x3c, - 0x81, 0xf, 0xfe, 0x2f, 0xfe, 0xf, 0xfe, 0x4a, - 0xff, 0x82, 0xeb, 0xfc, 0x1f, 0xfc, 0x54, 0x3f, - 0xc8, 0x30, 0xff, 0x60, 0x43, 0xe6, 0x10, 0xb4, - 0x33, 0x28, 0x82, 0xbf, 0x41, 0x98, 0x3f, 0xa4, - 0xf, 0x7, 0x3a, 0x0, + 0x6c, 0x3f, 0x30, 0x30, 0x3f, 0xa0, 0x21, 0xd0, + 0x65, 0x1, 0x80, 0x87, 0xb0, 0x68, 0x30, 0xf2, + 0x4, 0x24, 0x3f, 0xf8, 0x3f, 0xf8, 0x3f, 0xf9, + 0x2b, 0xfe, 0xb, 0xaf, 0xf0, 0x7f, 0xf1, 0x50, + 0xff, 0x20, 0xc3, 0xfd, 0x81, 0xf, 0xd0, 0x85, + 0x87, 0x3a, 0x88, 0x2f, 0x5e, 0x83, 0x30, 0x64, + 0x34, 0x81, 0xd0, 0xe7, 0x40, /* U+00E9 "é" */ 0xf, 0xd7, 0xc8, 0x7e, 0x50, 0x24, 0x3f, 0x40, 0x90, 0xfd, 0x2, 0x43, 0xf2, 0x89, 0xf, 0xe7, 0xc8, 0x7f, 0xf6, 0x5f, 0xd2, 0x1e, 0xe0, 0xcd, - 0x3, 0x61, 0xf9, 0x81, 0x81, 0xfd, 0x1, 0x10, - 0xa0, 0xca, 0x3, 0x82, 0xf, 0x60, 0xd0, 0x21, - 0xe4, 0x8, 0x7f, 0xf1, 0x7f, 0xf0, 0x7f, 0xf2, - 0x57, 0xfc, 0x17, 0x5f, 0xe0, 0xff, 0xe2, 0xa1, - 0xfe, 0x41, 0x87, 0xfb, 0x2, 0x1f, 0x30, 0x85, - 0xa1, 0x99, 0x44, 0x15, 0xfa, 0xc, 0xc1, 0xfd, - 0x20, 0x78, 0x39, 0xd0, + 0x3, 0x61, 0xf9, 0x81, 0x81, 0xfd, 0x1, 0xe, + 0x83, 0x28, 0xc, 0x4, 0x3d, 0x83, 0x41, 0x87, + 0x90, 0x21, 0x21, 0xff, 0xc1, 0xff, 0xc1, 0xff, + 0xc9, 0x5f, 0xf0, 0x5d, 0x7f, 0x83, 0xff, 0x8a, + 0x87, 0xf9, 0x6, 0x1f, 0xec, 0x8, 0x7e, 0x84, + 0x2c, 0x39, 0xd4, 0x41, 0x7a, 0xf4, 0x19, 0x83, + 0x21, 0xa4, 0xe, 0x87, 0x3a, 0x0, /* U+00EA "ê" */ 0xe, 0x7c, 0x87, 0xfa, 0x4, 0x1f, 0xd8, 0x13, 0xf, 0xa0, 0x70, 0x20, 0xe5, 0x10, 0x31, 0x83, 0x3e, 0x42, 0xf4, 0x1f, 0xfd, 0x67, 0xf4, 0x87, 0xb8, 0x33, 0x40, 0xd8, 0x7e, 0x60, 0x60, 0x7f, - 0x40, 0x44, 0x28, 0x32, 0x80, 0xe0, 0x83, 0xd8, - 0x34, 0x8, 0x79, 0x2, 0x1f, 0xfc, 0x5f, 0xfc, - 0x1f, 0xfc, 0x95, 0xff, 0x5, 0xd7, 0xf8, 0x3f, - 0xf8, 0xa8, 0x7f, 0x90, 0x61, 0xfe, 0xc0, 0x87, - 0xcc, 0x21, 0x68, 0x66, 0x51, 0x5, 0x7e, 0x83, - 0x30, 0x7f, 0x48, 0x1e, 0xe, 0x74, + 0x40, 0x43, 0xa0, 0xca, 0x3, 0x1, 0xf, 0x60, + 0xd0, 0x61, 0xe4, 0x8, 0x48, 0x7f, 0xf0, 0x7f, + 0xf0, 0x7f, 0xf2, 0x57, 0xfc, 0x17, 0x5f, 0xe0, + 0xff, 0xe2, 0xa1, 0xfe, 0x41, 0x87, 0xfb, 0x2, + 0x1f, 0xa1, 0xb, 0xe, 0x75, 0x10, 0x5e, 0xbd, + 0x6, 0x60, 0xc8, 0x69, 0x3, 0xa1, 0xce, 0x80, /* U+00EB "ë" */ 0x1f, 0x21, 0x9f, 0x20, 0x81, 0x6, 0x81, 0x7, 0xff, 0x12, 0x4, 0x1a, 0x4, 0x7, 0xc8, 0x67, 0xc8, 0x7f, 0xf1, 0xdf, 0xd2, 0x1e, 0xe0, 0xcd, - 0x3, 0x61, 0xf9, 0x81, 0x81, 0xfd, 0x1, 0x10, - 0xa0, 0xca, 0x3, 0x82, 0xf, 0x60, 0xd0, 0x21, - 0xe4, 0x8, 0x7f, 0xf1, 0x7f, 0xf0, 0x7f, 0xf2, - 0x57, 0xfc, 0x17, 0x5f, 0xe0, 0xff, 0xe2, 0xa1, - 0xfe, 0x41, 0x87, 0xfb, 0x2, 0x1f, 0x30, 0x85, - 0xa1, 0x99, 0x44, 0x15, 0xfa, 0xc, 0xc1, 0xfd, - 0x20, 0x78, 0x39, 0xd0, + 0x3, 0x61, 0xf9, 0x81, 0x81, 0xfd, 0x1, 0xe, + 0x83, 0x28, 0xc, 0x4, 0x3d, 0x83, 0x41, 0x87, + 0x90, 0x21, 0x21, 0xff, 0xc1, 0xff, 0xc1, 0xff, + 0xc9, 0x5f, 0xf0, 0x5d, 0x7f, 0x83, 0xff, 0x8a, + 0x87, 0xf9, 0x6, 0x1f, 0xec, 0x8, 0x7e, 0x84, + 0x2c, 0x39, 0xd4, 0x41, 0x7a, 0xf4, 0x19, 0x83, + 0x21, 0xa4, 0xe, 0x87, 0x3a, 0x0, /* U+00EC "ì" */ 0x7e, 0x42, 0x50, 0x20, 0xd0, 0x50, 0x6c, 0x8, @@ -1544,85 +1542,84 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+00F0 "ð" */ 0x3, 0x21, 0xff, 0xc0, 0xdb, 0x43, 0x41, 0xc8, - 0x54, 0x6, 0xa0, 0xd2, 0x13, 0xe0, 0xf9, 0xb0, - 0xf6, 0x87, 0xd8, 0x64, 0x3f, 0xa0, 0xc8, 0x7e, - 0xd2, 0xb, 0xf, 0xe9, 0xc2, 0x43, 0xd6, 0x81, - 0x6, 0x1e, 0x43, 0x40, 0x43, 0xd7, 0xd0, 0x64, - 0x36, 0x84, 0xe1, 0x61, 0x61, 0xfe, 0x41, 0x5, - 0x7d, 0x7, 0x90, 0x48, 0x4c, 0x1a, 0x9, 0xe, - 0x43, 0xe8, 0x3f, 0xe4, 0x3f, 0xf8, 0xa8, 0x7f, - 0xf8, 0x10, 0xf2, 0x4, 0x41, 0x7, 0xa0, 0x64, - 0x12, 0x1f, 0x90, 0x20, 0x83, 0x60, 0x42, 0x82, - 0xfc, 0x14, 0x1b, 0xf, 0xd8, 0x7b, 0x83, 0x58, - 0x60, + 0x54, 0x6, 0xa0, 0xda, 0x13, 0xe0, 0xfd, 0x61, + 0xed, 0xf, 0xb0, 0xc8, 0x7f, 0x41, 0x94, 0x1f, + 0x69, 0x20, 0x83, 0xfa, 0x60, 0x90, 0xf5, 0xa0, + 0x41, 0x7, 0x90, 0xd0, 0x7f, 0x5f, 0x41, 0x90, + 0xda, 0x13, 0x85, 0x85, 0x86, 0x43, 0x90, 0x41, + 0x5d, 0xc1, 0xe4, 0x12, 0x13, 0x6, 0x80, 0xa0, + 0xe4, 0x32, 0xc, 0x3f, 0xf8, 0x48, 0x7f, 0xfb, + 0xd0, 0xf2, 0x4, 0x41, 0x7, 0xb0, 0x64, 0x12, + 0x1c, 0x81, 0x2, 0x8, 0x36, 0x4, 0x28, 0x2f, + 0xc1, 0x41, 0xb0, 0xfd, 0x87, 0xb8, 0x35, 0x86, /* U+00F1 "ñ" */ - 0xf, 0xf2, 0x1c, 0xfc, 0x81, 0xb0, 0xd0, 0x57, - 0xa1, 0xa, 0xf, 0xe8, 0x24, 0xfa, 0xa, 0xd, - 0xe0, 0x9f, 0x90, 0xff, 0xe9, 0xfc, 0xb, 0xe9, - 0xf, 0xb4, 0x26, 0x43, 0xb0, 0xfa, 0xf, 0x3f, - 0x41, 0x41, 0x98, 0x25, 0x1, 0xd, 0x7, 0x41, - 0xff, 0xff, 0xf, 0xff, 0xf8, 0x7f, 0xf9, 0x80, + 0xf, 0xf2, 0x19, 0xf9, 0x3, 0x60, 0x60, 0xaf, + 0x42, 0xc, 0x3f, 0xb0, 0x27, 0xd0, 0x52, 0xf, + 0x4, 0xfc, 0x87, 0xff, 0x43, 0xe0, 0x5f, 0x48, + 0x7b, 0x42, 0x64, 0x36, 0x1f, 0x41, 0xcf, 0xe0, + 0xa0, 0x98, 0x34, 0x4, 0x28, 0x39, 0xf, 0xff, + 0xf8, 0x7f, 0xff, 0xc3, 0xff, 0xae, /* U+00F2 "ò" */ - 0x7, 0xe0, 0xff, 0xb0, 0xb0, 0xff, 0xb0, 0x90, - 0xff, 0xb0, 0x41, 0xff, 0xc0, 0xc1, 0x87, 0xff, - 0x3, 0xe0, 0xff, 0xee, 0x37, 0xd2, 0x1f, 0x72, - 0x13, 0x61, 0xd8, 0x7f, 0x61, 0x41, 0x5f, 0x41, - 0x40, 0x41, 0x21, 0x30, 0x12, 0x2, 0x83, 0x90, - 0xa4, 0x18, 0x7d, 0x1, 0x9, 0xf, 0xfe, 0x52, - 0x1f, 0xff, 0x64, 0x3e, 0x42, 0x41, 0x87, 0xd8, - 0x18, 0xa, 0xf, 0x20, 0x84, 0x12, 0x1b, 0x2, - 0x8, 0x2b, 0xf0, 0x50, 0x58, 0x7f, 0x61, 0xdc, - 0x84, 0xd8, 0x40, + 0x7, 0xe0, 0xff, 0xb0, 0xa0, 0xff, 0xb0, 0x28, + 0x3f, 0xec, 0x10, 0x7f, 0xf0, 0x30, 0x61, 0xff, + 0xc0, 0xf8, 0x3f, 0xfb, 0x8d, 0xf4, 0x87, 0xdc, + 0x84, 0xd8, 0x76, 0x19, 0xd, 0x85, 0x5, 0x77, + 0x5, 0x1, 0x4, 0x84, 0xc0, 0x48, 0xa, 0xe, + 0x50, 0x24, 0x18, 0x7d, 0x81, 0x9, 0xf, 0x90, + 0xff, 0xff, 0x87, 0x90, 0xf9, 0x9, 0x6, 0x1f, + 0x60, 0x60, 0x28, 0x3c, 0x82, 0x10, 0x48, 0x6c, + 0x8, 0x20, 0xae, 0xf0, 0x50, 0x58, 0x64, 0x36, + 0x1d, 0xc8, 0x4d, 0x84, /* U+00F3 "ó" */ - 0xf, 0xcf, 0xd0, 0x7f, 0xa0, 0x30, 0x7f, 0x40, - 0x60, 0xfe, 0x50, 0xc1, 0xfe, 0x86, 0xf, 0xfb, + 0xf, 0xcf, 0xd0, 0x7f, 0xa0, 0x30, 0x7f, 0x60, + 0x60, 0xfe, 0x40, 0xc1, 0xfe, 0x86, 0xf, 0xfb, 0xd0, 0x7f, 0xf7, 0x1b, 0xe9, 0xf, 0xb9, 0x9, - 0xb0, 0xec, 0x3f, 0xb0, 0xa0, 0xaf, 0xa0, 0xa0, - 0x20, 0x90, 0x98, 0x9, 0x1, 0x41, 0xc8, 0x52, - 0xc, 0x3e, 0x80, 0x84, 0x87, 0xff, 0x29, 0xf, - 0xff, 0xb2, 0x1f, 0x21, 0x20, 0xc3, 0xec, 0xc, - 0x5, 0x7, 0x90, 0x42, 0x9, 0xd, 0x81, 0x4, - 0x15, 0xf8, 0x28, 0x2c, 0x3f, 0xb0, 0xee, 0x42, - 0x6c, 0x20, + 0xb0, 0xec, 0x32, 0x1b, 0xa, 0xa, 0xee, 0xa, + 0x2, 0x9, 0x9, 0x80, 0x90, 0x14, 0x1c, 0xa0, + 0x48, 0x30, 0xfb, 0x2, 0x12, 0x1f, 0x21, 0xff, + 0xff, 0xf, 0x21, 0xf2, 0x12, 0xc, 0x3e, 0xc0, + 0xc0, 0x50, 0x79, 0x4, 0x20, 0x90, 0xd8, 0x10, + 0x41, 0x5d, 0xe0, 0xa0, 0xb0, 0xc8, 0x6c, 0x3b, + 0x90, 0x9b, 0x8, /* U+00F4 "ô" */ 0xf, 0x7a, 0xf, 0xfb, 0x2, 0x83, 0xfa, 0x4, 0x41, 0xf9, 0x44, 0xa3, 0xf, 0xa1, 0x44, 0x8, 0x3d, 0xe8, 0x2f, 0x41, 0xff, 0xd9, 0x6f, 0xa4, - 0x3e, 0xe4, 0x26, 0xc3, 0xb0, 0xfe, 0xc2, 0x82, - 0xbe, 0x82, 0x80, 0x82, 0x42, 0x60, 0x24, 0x5, - 0x7, 0x21, 0x48, 0x30, 0xfa, 0x2, 0x12, 0x1f, - 0xfc, 0xa4, 0x3f, 0xfe, 0xc8, 0x7c, 0x84, 0x83, - 0xf, 0xb0, 0x30, 0x14, 0x1e, 0x41, 0x8, 0x24, - 0x36, 0x4, 0x10, 0x57, 0xe0, 0xa0, 0xb0, 0xfe, - 0xc3, 0xb9, 0x9, 0xb0, 0x80, + 0x3e, 0xe4, 0x26, 0xc3, 0xb0, 0xc8, 0x6c, 0x28, + 0x2b, 0xb8, 0x28, 0x8, 0x24, 0x26, 0x2, 0x40, + 0x50, 0x72, 0x81, 0x20, 0xc3, 0xec, 0x8, 0x48, + 0x7c, 0x87, 0xff, 0xfc, 0x3c, 0x87, 0xc8, 0x48, + 0x30, 0xfb, 0x3, 0x1, 0x41, 0xe4, 0x10, 0x82, + 0x43, 0x60, 0x41, 0x5, 0x77, 0x82, 0x82, 0xc3, + 0x21, 0xb0, 0xee, 0x42, 0x6c, 0x20, /* U+00F5 "õ" */ - 0xf, 0xf2, 0x1f, 0x5e, 0x80, 0xd8, 0x72, 0x80, - 0xfa, 0x10, 0xe8, 0x3f, 0x41, 0xca, 0xfa, 0x56, - 0x1e, 0xa0, 0x4d, 0x3, 0xff, 0xb6, 0xdf, 0x48, - 0x7d, 0xc8, 0x4d, 0x87, 0x61, 0xfd, 0x85, 0x5, - 0x7d, 0x5, 0x1, 0x4, 0x84, 0xc0, 0x48, 0xa, - 0xe, 0x42, 0x90, 0x61, 0xf4, 0x4, 0x24, 0x3f, - 0xf9, 0x48, 0x7f, 0xfd, 0x90, 0xf9, 0x9, 0x6, - 0x1f, 0x60, 0x60, 0x28, 0x3c, 0x82, 0x10, 0x48, - 0x6c, 0x8, 0x20, 0xaf, 0xc1, 0x41, 0x61, 0xfd, - 0x87, 0x72, 0x13, 0x61, 0x0, + 0xf, 0xf2, 0x1f, 0x5e, 0x91, 0xb0, 0xe5, 0x1, + 0xb8, 0x3e, 0x83, 0xf4, 0x1c, 0xaf, 0xa5, 0x48, + 0x75, 0x2, 0x68, 0x87, 0xff, 0x69, 0xbe, 0x90, + 0xfb, 0x90, 0x9b, 0xe, 0xc3, 0x21, 0xb0, 0xa0, + 0xae, 0xe0, 0xa0, 0x20, 0x90, 0x98, 0x9, 0x1, + 0x41, 0xca, 0x4, 0x83, 0xf, 0xb0, 0x21, 0x21, + 0xf2, 0x1f, 0xff, 0xf0, 0xf2, 0x1f, 0x21, 0x20, + 0xc3, 0xec, 0xc, 0x5, 0x7, 0x90, 0x42, 0x9, + 0xd, 0x81, 0x4, 0x15, 0xde, 0xa, 0xb, 0xc, + 0x86, 0xc3, 0xb9, 0x9, 0xb0, 0x80, /* U+00F6 "ö" */ 0x1f, 0x21, 0x9f, 0x21, 0x40, 0x83, 0x40, 0x83, 0xff, 0x8d, 0x2, 0xd, 0x2, 0x9, 0xf2, 0x19, 0xf2, 0x1f, 0xfc, 0x96, 0xfa, 0x43, 0xee, 0x42, - 0x6c, 0x3b, 0xf, 0xec, 0x28, 0x2b, 0xe8, 0x28, - 0x8, 0x24, 0x26, 0x2, 0x40, 0x50, 0x72, 0x14, - 0x83, 0xf, 0xa0, 0x21, 0x21, 0xff, 0xca, 0x43, - 0xff, 0xec, 0x87, 0xc8, 0x48, 0x30, 0xfb, 0x3, - 0x1, 0x41, 0xe4, 0x10, 0x82, 0x43, 0x60, 0x41, - 0x5, 0x7e, 0xa, 0xb, 0xf, 0xec, 0x3b, 0x90, - 0x9b, 0x8, + 0x6c, 0x3b, 0xc, 0x86, 0xc2, 0x82, 0xbb, 0x82, + 0x80, 0x82, 0x42, 0x60, 0x24, 0x5, 0x7, 0x28, + 0x12, 0xc, 0x3e, 0xc0, 0x84, 0x87, 0xc8, 0x7f, + 0xff, 0xc3, 0xc8, 0x7c, 0x84, 0x83, 0xf, 0xb0, + 0x30, 0x14, 0x1e, 0x41, 0x8, 0x24, 0x36, 0x4, + 0x10, 0x57, 0x78, 0x28, 0x2c, 0x32, 0x1b, 0xe, + 0xe4, 0x26, 0xc2, /* U+00F7 "÷" */ 0xf, 0x5a, 0x1f, 0xfc, 0x4, 0x83, 0xff, 0x9e, @@ -1632,122 +1629,122 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x1f, 0xfc, 0xf4, 0x83, 0xc0, /* U+00F8 "ø" */ - 0xf, 0xfe, 0x4, 0x87, 0xff, 0x2, 0x43, 0xff, - 0x82, 0x88, 0x73, 0x7d, 0x41, 0xe, 0xa2, 0x12, - 0x88, 0x34, 0x87, 0xe8, 0x25, 0x2, 0xf8, 0x25, - 0x2, 0x4, 0x87, 0xd0, 0x84, 0x85, 0x8, 0x4e, - 0x4, 0x32, 0x48, 0x34, 0x18, 0x48, 0x98, 0x10, - 0x90, 0xa3, 0x10, 0xfe, 0x40, 0x87, 0xfd, 0x88, - 0x7f, 0xf0, 0x12, 0xf, 0xe4, 0x44, 0x24, 0x24, - 0x19, 0x18, 0x58, 0x1c, 0xa, 0x2, 0x12, 0xd, - 0xa, 0x20, 0x90, 0x92, 0xc, 0x81, 0x81, 0x1, - 0x41, 0x7d, 0x1, 0x41, 0x41, 0xf9, 0x83, 0x22, - 0x82, 0x68, 0x1d, 0x14, 0xfa, 0x43, 0x90, 0xff, - 0xe0, 0x80, + 0xf, 0xfe, 0x4, 0x87, 0xff, 0x3, 0x50, 0x7f, + 0xf2, 0x1b, 0xea, 0x10, 0x75, 0x10, 0x94, 0x21, + 0xa4, 0x3f, 0x41, 0x28, 0x17, 0xc1, 0x28, 0x10, + 0x24, 0x3e, 0x84, 0x24, 0x28, 0x82, 0x70, 0x21, + 0x91, 0x40, 0xd0, 0x61, 0x22, 0x60, 0x42, 0x42, + 0x88, 0x43, 0xf9, 0x10, 0xff, 0xe0, 0x66, 0x1f, + 0xfc, 0x4, 0x43, 0xf9, 0x22, 0x9, 0x9, 0x6, + 0x22, 0x16, 0x7, 0x2, 0x84, 0x32, 0xd, 0xa, + 0x20, 0x90, 0x92, 0xf, 0x98, 0x10, 0x14, 0x17, + 0xd0, 0x14, 0x14, 0x1f, 0x98, 0x32, 0x28, 0x26, + 0x81, 0xd1, 0x4f, 0xa4, 0x39, 0x10, 0xff, 0x80, /* U+00F9 "ù" */ 0x2f, 0x90, 0xfd, 0x20, 0x83, 0xfa, 0x41, 0x7, 0xf4, 0x5, 0x7, 0xf6, 0x8, 0x3f, 0xdf, 0x7, 0xff, 0x4f, 0xe0, 0xfb, 0xe0, 0xff, 0xff, 0x87, - 0xff, 0xfc, 0x3f, 0xf9, 0x48, 0x7f, 0x20, 0xc3, - 0xa0, 0xb0, 0x28, 0x29, 0x9, 0xa, 0xf9, 0xe, - 0x83, 0xe4, 0x33, 0xa1, 0x3c, 0x10, + 0xff, 0xfc, 0x3f, 0xf9, 0x48, 0x72, 0x12, 0xc, + 0x3b, 0xb, 0x2, 0x82, 0x90, 0x90, 0xaf, 0x90, + 0xe8, 0x3e, 0x43, 0x3a, 0x13, 0xc1, 0x0, /* U+00FA "ú" */ - 0xf, 0x9f, 0xa0, 0xfd, 0x1, 0x83, 0xe8, 0xc, - 0x1f, 0x28, 0x60, 0xfd, 0xc, 0x1f, 0xde, 0x83, - 0xff, 0xa7, 0xf0, 0x7d, 0xf0, 0x7f, 0xff, 0xc3, - 0xff, 0xfe, 0x1f, 0xfc, 0xa4, 0x3f, 0x90, 0x61, - 0xd0, 0x58, 0x14, 0x14, 0x84, 0x85, 0x7c, 0x87, - 0x41, 0xf2, 0x19, 0xd0, 0x9e, 0x8, + 0xf, 0xdf, 0x41, 0xfb, 0x3, 0x7, 0xd0, 0x18, + 0x3e, 0x50, 0xc1, 0xfa, 0x4, 0x1f, 0xdf, 0x7, + 0xff, 0x4f, 0xe0, 0xfb, 0xe0, 0xff, 0xff, 0x87, + 0xff, 0xfc, 0x3f, 0xf9, 0x48, 0x7f, 0x20, 0xc3, + 0xa0, 0xb0, 0x21, 0xa4, 0x24, 0x2f, 0xc8, 0x74, + 0x1f, 0x21, 0x9d, 0x9, 0xe0, 0x80, /* U+00FB "û" */ 0xe, 0xf8, 0x3f, 0xa0, 0xa0, 0xf9, 0x44, 0x28, - 0x3d, 0x13, 0x10, 0x76, 0x28, 0x41, 0x86, 0xf4, - 0x17, 0xc1, 0xff, 0xd0, 0xf8, 0x3e, 0xf8, 0x3f, - 0xff, 0xe1, 0xff, 0xff, 0xf, 0xfe, 0x52, 0x1f, - 0xc8, 0x30, 0xe8, 0x2c, 0xa, 0xa, 0x42, 0x42, - 0xbe, 0x43, 0xa0, 0xf9, 0xc, 0xe8, 0x4f, 0x4, + 0x3d, 0x13, 0x10, 0x76, 0x28, 0x51, 0x86, 0xf4, + 0x15, 0xe0, 0xff, 0xe8, 0x7c, 0x1f, 0x7c, 0x1f, + 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, 0x29, 0xe, + 0x42, 0x41, 0x87, 0x61, 0x60, 0x50, 0x52, 0x12, + 0x15, 0xf2, 0x1d, 0x7, 0xc8, 0x67, 0x42, 0x78, + 0x20, /* U+00FC "ü" */ 0x1f, 0x21, 0x3e, 0x41, 0x2, 0xa, 0x4, 0x1f, 0xfc, 0x38, 0x10, 0x50, 0x20, 0x3e, 0x42, 0x7c, 0x87, 0xff, 0xb, 0xe0, 0xfb, 0xe0, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xf9, 0x48, 0x7f, 0x20, - 0xc3, 0xa0, 0xb0, 0x28, 0x29, 0x9, 0xa, 0xf9, - 0xe, 0x83, 0xe4, 0x33, 0xa1, 0x3c, 0x10, + 0xc3, 0xa0, 0xb0, 0x21, 0xa4, 0x24, 0x2f, 0xc8, + 0x74, 0x1f, 0x41, 0x99, 0x9, 0xd0, 0x80, /* U+00FD "ý" */ - 0xf, 0xcf, 0xc8, 0x7f, 0x40, 0x50, 0x7e, 0x80, - 0xc1, 0xf9, 0x40, 0x83, 0xfa, 0x6, 0x1f, 0xe5, - 0x61, 0xff, 0x50, 0x3f, 0xf9, 0x1f, 0x41, 0xeb, - 0xd2, 0x4, 0x3c, 0x83, 0x83, 0xff, 0x80, 0x86, - 0x43, 0x21, 0xc8, 0x30, 0xd8, 0x10, 0x60, 0x43, - 0x20, 0x80, 0x87, 0xff, 0x15, 0x2, 0x4, 0x32, - 0xc, 0x18, 0x30, 0xd8, 0x10, 0x20, 0x43, 0x21, - 0xff, 0xc2, 0x42, 0x40, 0x87, 0xb0, 0x38, 0x30, - 0xf2, 0xd, 0x2, 0x1f, 0xc8, 0x7f, 0xc8, 0x64, - 0x3f, 0x61, 0xa0, 0xfc, 0x87, 0xff, 0x9, 0x2, - 0x1f, 0xec, 0x18, 0x7f, 0xb0, 0x21, 0xfe, 0x43, - 0xff, 0x86, 0x87, 0xfa, 0x6, 0x1f, 0xca, 0x2, - 0x1f, 0x7a, 0x4, 0x1f, 0xfc, 0x5, 0x7, 0xfd, - 0x40, 0xfc, + 0xf, 0xef, 0xc1, 0xfe, 0x42, 0xc3, 0xfd, 0x3, + 0xf, 0xf4, 0x8, 0x3f, 0xca, 0x14, 0x1f, 0xf3, + 0x40, 0xff, 0x99, 0xf, 0xfe, 0x4b, 0xf0, 0x7d, + 0xf0, 0x84, 0x87, 0x21, 0xc8, 0x30, 0xec, 0x8, + 0x30, 0x21, 0xc8, 0x30, 0x21, 0xff, 0x21, 0xe4, + 0x24, 0x3e, 0x41, 0x85, 0x81, 0xd, 0x81, 0x9, + 0x6, 0x19, 0xf, 0xe4, 0x39, 0x2, 0x20, 0x43, + 0xd8, 0x33, 0x6, 0x1e, 0x40, 0x86, 0x43, 0xfe, + 0x43, 0xfc, 0x82, 0x2, 0x1f, 0xb0, 0x20, 0xc3, + 0xf2, 0x1c, 0x87, 0xf2, 0x1f, 0xfc, 0x2c, 0x24, + 0x3f, 0xc8, 0x58, 0x7f, 0xf0, 0x90, 0xff, 0xe0, + 0xa1, 0xff, 0x20, 0xc3, 0xfe, 0xc0, 0x87, 0xfc, + 0x87, 0xff, 0x7, 0x4, 0x1f, 0x9f, 0x4, 0x87, + 0xff, 0x6, 0xf, 0xfe, 0xe, 0x87, 0xe0, /* U+00FE "þ" */ 0xa8, 0x3f, 0xe5, 0x83, 0xff, 0xfe, 0x1f, 0xfc, - 0xdb, 0xe8, 0x3e, 0xb4, 0x27, 0x43, 0x90, 0xfa, - 0xf, 0x3f, 0x41, 0x41, 0x98, 0x26, 0x2, 0x1a, - 0xe, 0x42, 0x43, 0xfc, 0x83, 0xf, 0xf6, 0x4, - 0x3f, 0xc8, 0x7f, 0xfa, 0xd0, 0xff, 0xe0, 0xe0, - 0x43, 0xfc, 0x83, 0xa, 0xe, 0x42, 0x42, 0x50, - 0x4c, 0x4, 0x3a, 0xfa, 0xa, 0xc, 0x87, 0xd0, - 0x75, 0xa1, 0x3a, 0x1f, 0x5f, 0x41, 0xff, 0xff, - 0xf, 0xfe, 0x78, + 0xdb, 0xe8, 0x3e, 0x74, 0x27, 0x43, 0xa0, 0xfa, + 0xf, 0x5f, 0x41, 0x61, 0x94, 0x13, 0x7, 0xd0, + 0x72, 0x14, 0x1f, 0xe8, 0x3f, 0xf8, 0x88, 0x7f, + 0x90, 0xff, 0xf5, 0xa1, 0xff, 0xc4, 0x43, 0xfd, + 0x3, 0xa, 0xe, 0x42, 0x42, 0x50, 0x4c, 0x4, + 0x3a, 0xfa, 0xa, 0xc, 0x87, 0xd0, 0x75, 0xa1, + 0x3a, 0x1f, 0x5f, 0x41, 0xff, 0xff, 0xf, 0xfe, + 0x78, /* U+00FF "ÿ" */ 0x3, 0xe4, 0x27, 0xc8, 0x50, 0x20, 0xa0, 0x41, 0xff, 0xc5, 0x81, 0x5, 0x2, 0x9, 0xf2, 0x13, 0xe4, 0x3f, 0xf8, 0x6f, 0xc1, 0xef, 0xa4, 0x24, - 0x3f, 0x62, 0x1f, 0xf2, 0x60, 0xc3, 0x21, 0xc8, - 0x10, 0xd8, 0x10, 0xff, 0x20, 0xc2, 0x40, 0x87, - 0x90, 0xb0, 0x60, 0x40, 0x86, 0x40, 0x87, 0x61, - 0xfe, 0xc0, 0x87, 0x40, 0x44, 0x3f, 0x20, 0xc2, - 0x43, 0xf9, 0x40, 0xc3, 0xe4, 0x18, 0x10, 0xfb, - 0x2, 0x1f, 0xe4, 0x32, 0x1f, 0xfc, 0x1c, 0x3f, - 0xa0, 0x90, 0xfe, 0x43, 0xff, 0x88, 0x87, 0xff, - 0x7, 0xf, 0xf2, 0x4, 0x3f, 0xd8, 0x7f, 0xf0, - 0x51, 0xf, 0xf6, 0x8, 0x3e, 0x7c, 0x4, 0x3f, - 0x61, 0xa0, 0xfd, 0x81, 0xc3, 0xf0, + 0x3f, 0x61, 0xfc, 0x84, 0x88, 0x30, 0xff, 0x60, + 0x43, 0x60, 0x40, 0x87, 0xc8, 0x30, 0x90, 0x21, + 0xe4, 0x2c, 0x18, 0x10, 0x21, 0x90, 0x20, 0xc1, + 0x87, 0xf9, 0x2, 0x1c, 0x87, 0xff, 0x6, 0x2, + 0x80, 0x87, 0xf7, 0x81, 0x87, 0xc8, 0x84, 0x87, + 0xd8, 0x10, 0xff, 0x21, 0x90, 0xff, 0xe0, 0xe1, + 0xfc, 0x84, 0x87, 0xf4, 0x1f, 0xfc, 0x44, 0x3f, + 0xc8, 0x30, 0xff, 0x60, 0x43, 0xfc, 0x87, 0xff, + 0x1, 0x2, 0x1f, 0xcc, 0x8, 0x3e, 0xb8, 0x8, + 0x7f, 0xf0, 0x60, 0xfd, 0x81, 0xc3, 0xf0, /* U+011E "Ğ" */ 0x9, 0xa0, 0x6a, 0x21, 0xf4, 0xb0, 0x16, 0x83, - 0xe4, 0x10, 0x20, 0x21, 0xf4, 0x17, 0x82, 0x83, - 0xf4, 0x1e, 0x83, 0xf9, 0xd7, 0x68, 0x7f, 0xd5, - 0x83, 0xff, 0xa2, 0xdf, 0xa4, 0x3e, 0x79, 0xc, - 0xda, 0x1a, 0x81, 0xfe, 0x90, 0x28, 0xf, 0xf4, - 0x14, 0x8, 0xc, 0x1c, 0xc1, 0x48, 0x50, 0x7c, - 0xa0, 0x38, 0x10, 0xfe, 0xc3, 0xd8, 0x7f, 0x35, - 0x20, 0x43, 0xfc, 0xb0, 0x7f, 0xfb, 0xda, 0xfc, - 0x1f, 0xb5, 0xfc, 0x1f, 0xfc, 0xdb, 0xf8, 0x3f, - 0xf9, 0x68, 0x7f, 0xf0, 0x50, 0xff, 0xe2, 0x60, - 0x83, 0xff, 0x82, 0x87, 0xff, 0x15, 0x6, 0x1f, - 0x90, 0xd0, 0x5a, 0x1c, 0xc1, 0xd0, 0x57, 0xaf, - 0x41, 0x60, 0x70, 0xe4, 0x33, 0x87, 0x72, 0x1c, - 0xf0, 0x0, + 0xe4, 0x18, 0x30, 0x21, 0xf4, 0x7, 0xc8, 0x20, + 0xfd, 0x7, 0xa0, 0xfe, 0x75, 0xda, 0x1f, 0xf5, + 0x60, 0xff, 0xe8, 0xdf, 0xd2, 0x1f, 0x5a, 0x1c, + 0xda, 0x1a, 0x43, 0x21, 0xd2, 0x5, 0x1, 0xf5, + 0xe8, 0x28, 0x10, 0x18, 0x39, 0xc2, 0x90, 0xa0, + 0xfc, 0x81, 0xc0, 0x87, 0xf6, 0x12, 0xc, 0x3f, + 0x9a, 0x82, 0x43, 0xfc, 0xb0, 0x7f, 0xfb, 0xdf, + 0xfc, 0x1f, 0xb0, 0xff, 0xea, 0xdf, 0xc1, 0xff, + 0xcb, 0x43, 0xff, 0x82, 0x87, 0xff, 0x13, 0x6, + 0x1f, 0xfc, 0x14, 0x8, 0x7f, 0xf0, 0x90, 0x61, + 0xf9, 0xd, 0x5, 0xa1, 0xcc, 0x1d, 0x5, 0x7a, + 0xf4, 0x16, 0x7, 0xe, 0x43, 0x38, 0x77, 0x21, + 0xcf, 0x0, /* U+011F "ğ" */ 0x3e, 0xe, 0xf8, 0x3d, 0x5, 0x7, 0xa0, 0x3f, 0x20, 0x82, 0x50, 0x7c, 0xa0, 0xd4, 0x42, 0x68, 0x1e, 0x6f, 0xa4, 0x3f, 0xf9, 0x2d, 0xf4, 0xf, - 0x81, 0x44, 0x27, 0x43, 0x28, 0x3e, 0x83, 0x41, - 0x7e, 0x83, 0x21, 0x61, 0x94, 0x16, 0x4, 0x3d, - 0x4, 0x83, 0xf, 0xfe, 0xa, 0x1f, 0xff, 0xf0, - 0xfc, 0x87, 0xf9, 0x6, 0x1f, 0xec, 0x8, 0x7a, - 0x9, 0xb, 0xd, 0x21, 0xa0, 0xbf, 0x21, 0xca, - 0xf, 0xa0, 0xeb, 0x42, 0x74, 0x3e, 0xbe, 0x83, - 0xff, 0xa2, 0x87, 0x41, 0xf4, 0x4, 0xd8, 0x3a, - 0xa, 0x9, 0xfe, 0x41, 0x2, 0xf, 0xe9, 0x3, - 0xc8, 0x67, 0x40, + 0x81, 0x44, 0x27, 0xe, 0x50, 0x7d, 0x86, 0x82, + 0xfd, 0x6, 0x42, 0xc3, 0x28, 0x2c, 0x8, 0x7a, + 0x9, 0x6, 0x1f, 0xfc, 0x14, 0x3f, 0xff, 0xe1, + 0xf9, 0xf, 0xf2, 0xc, 0x3f, 0xd8, 0x10, 0xf4, + 0x12, 0x14, 0x19, 0x41, 0xa0, 0x3f, 0xa0, 0xe5, + 0x7, 0xd0, 0x75, 0x10, 0x9d, 0xf, 0x37, 0xd0, + 0x7f, 0xf4, 0x50, 0xe8, 0x3e, 0x80, 0x9b, 0x7, + 0x41, 0x41, 0x3f, 0xc8, 0x20, 0x41, 0xfc, 0xa0, + 0x3c, 0x86, 0x78, 0x0, /* U+0130 "İ" */ 0x7c, 0xc0, 0x83, 0x40, 0x9f, 0x21, 0xfb, 0xe0, @@ -1759,144 +1756,131 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0152 "Œ" */ 0xe, 0xbf, 0xff, 0x8e, 0x13, 0xa1, 0xff, 0xc9, 0x60, 0xcb, 0x6, 0x5f, 0xf0, 0x20, 0x3e, 0xa8, - 0x2e, 0xbf, 0xc6, 0x6, 0xf, 0xfe, 0x5c, 0x1f, - 0xfc, 0x88, 0x8, 0x7f, 0xf3, 0x30, 0xff, 0xe4, - 0xa0, 0x43, 0xff, 0xe1, 0xd7, 0xe4, 0x3f, 0xf8, - 0x8b, 0xfb, 0xf, 0xfe, 0xe7, 0xff, 0x41, 0xff, - 0xff, 0xc, 0x87, 0xff, 0x25, 0xf, 0xfe, 0x7e, - 0x1f, 0xfc, 0x98, 0x8, 0x7f, 0xf2, 0x90, 0x41, - 0xff, 0xc9, 0x80, 0xc1, 0xff, 0xc9, 0x80, 0xfa, - 0xa0, 0xba, 0xff, 0x1, 0x83, 0x2c, 0x19, 0x7f, - 0xc1, 0x3a, 0x1f, 0xfc, 0x70, + 0x2e, 0xbf, 0xc4, 0x6, 0xf, 0xfe, 0x42, 0x8, + 0x3f, 0xf9, 0x8, 0x10, 0xff, 0xe4, 0xe0, 0xc3, + 0xff, 0x92, 0x81, 0xf, 0xff, 0x87, 0x5f, 0x90, + 0xff, 0xe2, 0x2f, 0xec, 0x3f, 0xfb, 0x9f, 0xfd, + 0x7, 0xff, 0xfc, 0x3f, 0xf9, 0xc8, 0x10, 0xff, + 0xe4, 0xe0, 0xc3, 0xff, 0x92, 0x81, 0xf, 0xfe, + 0x52, 0x8, 0x3f, 0xf9, 0x30, 0x18, 0x3f, 0xf9, + 0x30, 0x1f, 0x54, 0x17, 0x5f, 0xe0, 0x30, 0x65, + 0x83, 0x2f, 0xf8, 0x27, 0x43, 0xff, 0x8e, /* U+0153 "œ" */ - 0xc, 0xfe, 0x43, 0x9b, 0xe8, 0x3e, 0xe0, 0xd6, - 0x15, 0x10, 0x9e, 0xd, 0x87, 0xec, 0x90, 0xf9, - 0x40, 0x82, 0xfc, 0x16, 0x82, 0xf9, 0x4, 0x4, - 0x10, 0x6c, 0x3a, 0x42, 0x82, 0x50, 0x48, 0x72, - 0x19, 0xe, 0x81, 0xe0, 0x21, 0xec, 0x24, 0x3f, - 0x94, 0xc, 0x3c, 0x85, 0x87, 0x90, 0xf2, 0x1f, - 0xeb, 0xfe, 0xf, 0xfe, 0xfa, 0xff, 0x82, 0x43, - 0xfd, 0xd7, 0xf8, 0x3f, 0xf8, 0x48, 0x7f, 0x90, - 0x61, 0xe4, 0x3f, 0xf8, 0x58, 0x10, 0xf6, 0x14, - 0x1f, 0xe4, 0x24, 0x39, 0xc, 0x87, 0xc8, 0x10, - 0x41, 0xb0, 0xe9, 0xc, 0xf0, 0x20, 0xbf, 0x5, - 0xa0, 0xbf, 0x40, 0x41, 0x87, 0xec, 0x90, 0xfc, - 0xa0, 0xb8, 0x35, 0x85, 0x68, 0x67, 0x80, + 0xc, 0xfe, 0x83, 0x9b, 0xe8, 0x3e, 0xe0, 0xce, + 0x15, 0x10, 0x9d, 0xd, 0x87, 0xec, 0x90, 0xfa, + 0x41, 0x5, 0xf8, 0x2d, 0x5, 0xf2, 0x8, 0x8, + 0x30, 0xd8, 0x74, 0x85, 0x4, 0xa0, 0xfe, 0x43, + 0x21, 0xd0, 0x3c, 0x8, 0x3d, 0x84, 0x87, 0x90, + 0x28, 0x3f, 0x90, 0xb0, 0xff, 0xe0, 0xa1, 0xfe, + 0xbf, 0xe0, 0xff, 0xef, 0xaf, 0xf8, 0x3f, 0xf8, + 0x5d, 0x7f, 0x82, 0x43, 0xfc, 0x87, 0xf9, 0xf, + 0xe4, 0x2c, 0x3f, 0xd8, 0x20, 0xf6, 0x12, 0x1f, + 0xe4, 0x3f, 0x90, 0xc8, 0x7c, 0x81, 0x6, 0x1b, + 0xe, 0x90, 0xcf, 0x2, 0xb, 0xf0, 0x58, 0x57, + 0xe8, 0x8, 0x30, 0xfd, 0x9a, 0x1f, 0x94, 0x17, + 0x6, 0x70, 0xa8, 0x86, 0x78, /* U+015E "Ş" */ 0xe, 0xbf, 0x48, 0x7d, 0x68, 0x66, 0xc3, 0xa4, - 0x3f, 0xb0, 0x94, 0x7, 0xf8, 0x2c, 0x18, 0x18, - 0x3b, 0x9, 0x10, 0x41, 0xf2, 0xc, 0x3f, 0xf8, - 0x18, 0x10, 0xff, 0xe0, 0x2e, 0xc, 0x87, 0xea, - 0x84, 0x12, 0x1f, 0xf4, 0x15, 0x3, 0xfe, 0x82, - 0x79, 0xf, 0xce, 0x19, 0xb4, 0x3f, 0x70, 0x75, - 0xa1, 0xf3, 0xe4, 0x34, 0x87, 0xf5, 0xc1, 0x41, - 0xff, 0x38, 0x50, 0x7f, 0xf0, 0x10, 0x35, 0x7, - 0xf6, 0x12, 0xe0, 0xfc, 0x84, 0x83, 0xf, 0xc8, - 0x58, 0x10, 0xfd, 0x1, 0x41, 0x68, 0x74, 0x14, - 0x61, 0x5f, 0xc8, 0x10, 0xb4, 0x3f, 0xa8, 0x1a, - 0xd0, 0xe7, 0x43, 0xeb, 0x5, 0xc1, 0xff, 0xc1, - 0x90, 0xff, 0xe0, 0x40, 0x83, 0xff, 0x80, 0xe1, - 0xff, 0xd3, 0x83, 0xff, 0x85, 0xa4, 0x1f, 0xfc, - 0x29, 0xe, + 0x32, 0x1b, 0x9, 0x40, 0x7d, 0x78, 0x2c, 0x18, + 0x18, 0x3b, 0x9, 0x10, 0x41, 0xf4, 0xc, 0x3f, + 0xf8, 0x8, 0x10, 0xff, 0xe0, 0xac, 0x19, 0xf, + 0xd5, 0x8, 0x24, 0x3f, 0xe8, 0x2a, 0x7, 0xfd, + 0x4, 0xf2, 0x1f, 0x9c, 0x33, 0x70, 0x7e, 0xe0, + 0xe7, 0x43, 0xe7, 0xc8, 0x69, 0xf, 0xeb, 0x82, + 0x83, 0xfe, 0x70, 0xa0, 0xff, 0xe0, 0x40, 0x6a, + 0xf, 0xe4, 0x25, 0x83, 0xff, 0x82, 0x82, 0xf, + 0xc8, 0x58, 0x10, 0xfd, 0x81, 0x41, 0x68, 0x74, + 0x82, 0x30, 0xaf, 0x5e, 0x40, 0x85, 0xa1, 0x90, + 0xcc, 0x1a, 0xd0, 0xe7, 0x83, 0xeb, 0x5, 0xc1, + 0xff, 0xc1, 0x90, 0xff, 0xe0, 0x40, 0x83, 0xff, + 0x80, 0xe1, 0xff, 0xd3, 0x83, 0xff, 0x85, 0xa4, + 0x1f, 0xfc, 0x29, 0xe, /* U+015F "ş" */ 0xd, 0x7e, 0x83, 0x9d, 0xc, 0xe1, 0xa0, 0xfd, - 0x83, 0x3, 0xf4, 0x14, 0x1a, 0x9, 0x80, 0x87, + 0x82, 0x3, 0xf8, 0x28, 0x41, 0x6, 0x80, 0x87, 0xf2, 0x1f, 0x21, 0xdf, 0x8, 0x24, 0x3f, 0x41, 0x5a, 0x1f, 0x61, 0xad, 0xf, 0x70, 0x6b, 0xf, 0x3c, 0x1b, 0xf, 0x9e, 0xa, 0xf, 0xcc, 0x7, - 0xe0, 0xf2, 0x1e, 0x43, 0x90, 0xa0, 0x48, 0x68, - 0xa, 0xa, 0xfc, 0x14, 0x61, 0xfd, 0x5, 0xc8, - 0x67, 0x43, 0x36, 0xa, 0x7, 0xfd, 0x21, 0xfc, - 0x82, 0xf, 0xeb, 0xf, 0xfe, 0x6c, 0x1f, 0xf6, - 0x90, 0x7f, 0xd2, 0x10, + 0xe0, 0xf2, 0x1e, 0x43, 0xfa, 0x4, 0x86, 0xc0, + 0xa0, 0xae, 0xf0, 0x51, 0x86, 0x43, 0x41, 0x72, + 0x19, 0xd0, 0xcd, 0x82, 0x81, 0xff, 0x48, 0x7f, + 0x20, 0x83, 0xfa, 0xc3, 0xff, 0x9b, 0x7, 0xfd, + 0xa4, 0x1f, 0xf4, 0x84, /* U+0160 "Š" */ - 0x9, 0xf2, 0x17, 0xc1, 0xe5, 0x10, 0x20, 0x61, - 0xf4, 0x9, 0x44, 0x1f, 0xd8, 0xc2, 0x83, 0xfd, - 0x5, 0x7, 0xfc, 0xce, 0x1f, 0xfc, 0x16, 0xf, - 0xfe, 0x85, 0xfa, 0x43, 0xeb, 0x43, 0x36, 0x1d, - 0x21, 0xfd, 0x84, 0xa0, 0x3f, 0xc1, 0x60, 0xc0, - 0xc1, 0xd8, 0x48, 0x82, 0xf, 0x90, 0x61, 0xff, - 0xc0, 0xc0, 0x87, 0xff, 0x1, 0x70, 0x64, 0x3f, - 0x54, 0x20, 0x90, 0xff, 0xa0, 0xa8, 0x1f, 0xf4, - 0x13, 0xc8, 0x7e, 0x70, 0xcd, 0xa1, 0xfb, 0x83, - 0xad, 0xf, 0x9f, 0x21, 0xa4, 0x3f, 0xae, 0xa, - 0xf, 0xf9, 0xc2, 0x83, 0xff, 0x80, 0x81, 0xa8, - 0x3f, 0xb0, 0x97, 0x7, 0xe4, 0x24, 0x18, 0x7e, - 0x42, 0xc0, 0x87, 0xe8, 0xa, 0xb, 0x43, 0xa0, - 0xa3, 0xa, 0xfe, 0x40, 0x85, 0xa1, 0xfd, 0x40, - 0xd6, 0x87, 0x3a, 0x0, + 0x9, 0xf2, 0x17, 0xc1, 0xe4, 0x10, 0x10, 0x41, + 0xf6, 0x8, 0x85, 0x7, 0xe8, 0x70, 0x41, 0xfc, + 0x86, 0x83, 0xfe, 0xc0, 0xa0, 0xff, 0xe0, 0x7a, + 0xf, 0xfe, 0x7d, 0xfc, 0x87, 0xd6, 0x87, 0x5a, + 0x1a, 0x43, 0x21, 0xa4, 0xa, 0x3, 0xeb, 0xc8, + 0x20, 0x60, 0x60, 0xe8, 0x28, 0x41, 0x7, 0xd0, + 0x10, 0xff, 0xe0, 0x21, 0xff, 0xc4, 0xf8, 0x32, + 0x1f, 0xfc, 0x4, 0x12, 0x1f, 0xf4, 0x15, 0x3, + 0xfe, 0x82, 0x79, 0xf, 0xce, 0x19, 0xb8, 0x3f, + 0x70, 0x73, 0xa1, 0xf3, 0xe4, 0x34, 0x87, 0xf5, + 0xc1, 0x41, 0xff, 0x38, 0x50, 0x7f, 0xf0, 0x20, + 0x3f, 0x7, 0xf2, 0x1e, 0x43, 0xff, 0x80, 0x83, + 0xf, 0xc8, 0x58, 0x10, 0xfd, 0x81, 0x60, 0x68, + 0x74, 0x82, 0x20, 0xaf, 0x5e, 0x40, 0x85, 0xa1, + 0x90, 0xcc, 0x1a, 0xd0, 0xe7, 0x80, /* U+0161 "š" */ - 0xb, 0xd0, 0x5e, 0x83, 0x42, 0xc, 0x10, 0x65, - 0x1a, 0xc, 0x3d, 0x2, 0x20, 0xfd, 0x81, 0x41, + 0xb, 0xd0, 0x5e, 0x83, 0x42, 0x8, 0x10, 0x65, + 0x1a, 0x8c, 0x3d, 0x2, 0x20, 0xfd, 0x81, 0x41, 0xfd, 0xd0, 0x3f, 0xe4, 0x3f, 0xf9, 0x57, 0xe8, - 0x39, 0xd0, 0xce, 0x1a, 0xf, 0xd8, 0x30, 0x3f, - 0x82, 0x83, 0x41, 0x90, 0x21, 0xfd, 0x7, 0xc8, - 0x77, 0xc2, 0x9, 0xf, 0xd0, 0x56, 0x87, 0xd8, - 0x6b, 0x43, 0xdc, 0x1a, 0xc3, 0xcf, 0x6, 0xc3, - 0xe7, 0x82, 0x83, 0xf3, 0x1, 0xf8, 0x3c, 0x87, - 0x90, 0xe4, 0x28, 0x12, 0x1a, 0x2, 0x82, 0xbf, - 0x5, 0x18, 0x7f, 0x41, 0x72, 0x19, 0xd0, + 0x39, 0xd0, 0xce, 0x1a, 0xf, 0xd8, 0x20, 0x3f, + 0x82, 0x84, 0x10, 0x68, 0x8, 0x7f, 0x21, 0xf2, + 0x1d, 0xf0, 0x82, 0x43, 0xf4, 0x15, 0xa1, 0xf6, + 0x1a, 0xd0, 0xf7, 0x6, 0xb0, 0xf3, 0xc1, 0xb0, + 0xf9, 0xe0, 0xa0, 0xfc, 0xc0, 0x7e, 0xf, 0x21, + 0xe4, 0x39, 0xa, 0x4, 0x86, 0x80, 0xa0, 0xaf, + 0xc1, 0x46, 0x1f, 0xd0, 0x5c, 0x86, 0x74, /* U+017D "Ž" */ - 0x9, 0x90, 0xd4, 0xf, 0xcc, 0x83, 0x43, 0xf3, - 0x11, 0x2, 0xf, 0xca, 0x34, 0xc3, 0xfd, 0x5, - 0x7, 0xff, 0x3, 0x64, 0x3f, 0xf8, 0x32, 0x1f, - 0xfc, 0xbf, 0xff, 0xe1, 0x87, 0xff, 0x15, 0x7f, - 0xe0, 0xea, 0xff, 0x82, 0x83, 0xfe, 0x82, 0x43, - 0xfe, 0x41, 0x7, 0xfd, 0x1, 0x41, 0xff, 0x20, - 0x83, 0xfe, 0xc0, 0x87, 0xfc, 0x85, 0x7, 0xfd, - 0x1, 0xf, 0xf9, 0xa, 0xf, 0xfa, 0x4, 0x1f, - 0xf4, 0x12, 0x1f, 0xf2, 0x8, 0x3f, 0xe8, 0xa, - 0xf, 0xf9, 0x4, 0x1f, 0xf4, 0x4, 0x3f, 0xe5, - 0x2, 0xf, 0xfa, 0x2, 0x1f, 0xf2, 0x14, 0x1f, - 0xf4, 0x8, 0x3f, 0xe4, 0x24, 0x3f, 0xe8, 0x2a, - 0xff, 0xe0, 0x6, 0x5f, 0xfe, 0x0, 0x7f, 0xf1, - 0x0, + 0x9, 0x90, 0xd4, 0x43, 0xcc, 0x83, 0x58, 0x39, + 0x88, 0x41, 0x87, 0xca, 0x38, 0x83, 0xfa, 0x9, + 0x41, 0xfe, 0xda, 0x7, 0xff, 0x2, 0x43, 0xff, + 0x93, 0xff, 0xfc, 0x30, 0xff, 0xe1, 0xaf, 0xfc, + 0x13, 0x5f, 0xf2, 0x8, 0x3f, 0xe4, 0x43, 0xfe, + 0xc1, 0x7, 0xf9, 0x2, 0x1f, 0xf4, 0x8, 0x3f, + 0xc8, 0x20, 0xff, 0xa0, 0x21, 0xfe, 0x81, 0x7, + 0xfc, 0x81, 0xf, 0xf6, 0xc, 0x3f, 0xc8, 0x10, + 0xff, 0xa0, 0x41, 0xfe, 0x40, 0x87, 0xfd, 0x2, + 0xf, 0xf4, 0x8, 0x3f, 0xe4, 0x8, 0x7f, 0xa0, + 0x41, 0xfe, 0x50, 0x10, 0xff, 0x40, 0x83, 0xfc, + 0x81, 0x41, 0xfe, 0x80, 0xd7, 0xfc, 0x19, 0x7f, + 0xe0, 0xff, 0xe1, 0x80, /* U+017E "ž" */ - 0x7, 0x90, 0xbc, 0x86, 0x48, 0x18, 0x10, 0xd0, - 0x24, 0x18, 0x7b, 0x18, 0x83, 0xf2, 0x5, 0x7, - 0xea, 0xc1, 0xfe, 0x50, 0x7f, 0xf1, 0xff, 0xff, - 0x80, 0x1f, 0xfc, 0x25, 0xfc, 0x1d, 0x5f, 0x82, - 0x83, 0xf4, 0x12, 0x1f, 0x90, 0x61, 0xfa, 0x2, - 0x1f, 0x94, 0x8, 0x3f, 0x40, 0x83, 0xf2, 0x12, - 0x1f, 0xa0, 0x41, 0xfa, 0x2, 0x83, 0xf2, 0x8, - 0x3f, 0x40, 0x43, 0xf2, 0x81, 0x7, 0xe8, 0x10, - 0x7e, 0x42, 0x43, 0xf4, 0x15, 0x7f, 0x6, 0x5f, - 0xe0, 0xff, 0xe0, 0x80, - - /* U+1E9E "ẞ" */ - 0x9, 0xbf, 0x41, 0xfd, 0x44, 0x33, 0xa1, 0xe5, - 0x7, 0xea, 0x7, 0x40, 0x7f, 0x20, 0x60, 0x90, - 0xa0, 0xd2, 0x1e, 0xc0, 0x87, 0x28, 0x10, 0x48, - 0x30, 0xe8, 0x18, 0x7c, 0x86, 0x81, 0x7, 0xff, - 0x1, 0x42, 0x83, 0xff, 0x81, 0x2, 0xf, 0xfe, - 0x4, 0x14, 0x87, 0xff, 0xd, 0xb4, 0x3f, 0xf8, - 0x92, 0x1f, 0xaf, 0xa0, 0xa0, 0xff, 0xe0, 0x38, - 0x50, 0x7f, 0xf0, 0x60, 0x21, 0xff, 0xc1, 0x43, - 0xff, 0xee, 0x87, 0xff, 0x12, 0x2, 0x1e, 0x50, - 0x68, 0x28, 0x3d, 0xdf, 0x90, 0x41, 0xf2, 0x1f, - 0x48, 0x7c, 0x87, 0x3a, 0x10, + 0x1f, 0x21, 0x7c, 0x12, 0x88, 0x10, 0x30, 0xd0, + 0x25, 0x10, 0x7b, 0x18, 0x50, 0x7d, 0x5, 0x7, + 0xe6, 0x70, 0xff, 0x30, 0x7f, 0xf1, 0xff, 0xff, + 0x81, 0x7, 0xff, 0x5, 0x7f, 0x6, 0xeb, 0xf2, + 0x12, 0x1f, 0x28, 0x10, 0x7e, 0x80, 0xa0, 0xf9, + 0xa, 0xf, 0xd0, 0x20, 0xfd, 0x4, 0x87, 0xe4, + 0x18, 0x7e, 0xc0, 0x87, 0xe4, 0x28, 0x3f, 0x40, + 0x83, 0xf4, 0x5, 0x7, 0xe4, 0x10, 0x7e, 0xc1, + 0x7, 0xe4, 0x24, 0x3f, 0x41, 0x57, 0xf0, 0x65, + 0xfe, 0xf, 0xfe, 0x8, /* U+2022 "•" */ 0x1f, 0x91, 0x82, 0x98, 0x3a, 0xf, 0xfe, 0x4c, 0x1d, 0x30, 0x52, /* U+20AC "€" */ - 0xf, 0x9f, 0xe4, 0x39, 0xe0, 0xe8, 0x33, 0x7, - 0xc8, 0x68, 0x2f, 0xe8, 0x28, 0x2c, 0x3f, 0x90, - 0x41, 0xff, 0xc1, 0x43, 0xff, 0x93, 0x4c, 0x2a, - 0xe0, 0x94, 0x19, 0x78, 0x3f, 0xf8, 0xbf, 0x5, - 0xfc, 0x1f, 0xfc, 0x5a, 0x61, 0x57, 0x4, 0xa0, - 0xcb, 0xc1, 0xff, 0xc5, 0xf8, 0x2f, 0xe0, 0xff, - 0xec, 0xa1, 0xfe, 0x41, 0x87, 0xfa, 0x2, 0x83, - 0xfc, 0x82, 0x43, 0xfa, 0xa, 0xfd, 0x7, 0x61, - 0xf2, 0x1e, 0xe4, 0x34, + 0xf, 0x9b, 0xf4, 0x1f, 0x51, 0xc, 0xa0, 0xed, + 0xf, 0x90, 0xc8, 0x57, 0xf0, 0x74, 0x9, 0xf, + 0xe4, 0x24, 0x3f, 0xd8, 0x10, 0xff, 0x90, 0x61, + 0xf9, 0xa0, 0x55, 0xc8, 0x5a, 0x83, 0x2e, 0xc3, + 0xff, 0x8d, 0x78, 0x2f, 0xe8, 0x3f, 0xf8, 0xcd, + 0x2, 0xeb, 0x21, 0x6a, 0xc, 0xbb, 0xf, 0xfe, + 0x35, 0xe0, 0xbf, 0xa0, 0xff, 0xe6, 0x21, 0xff, + 0x20, 0xc3, 0xfe, 0xc0, 0x87, 0xfc, 0x84, 0x87, + 0xfd, 0x2, 0x43, 0xfc, 0xa0, 0x5f, 0xc1, 0xe9, + 0xf, 0x90, 0xf5, 0x10, 0xca, /* U+E004 "" */ 0xf, 0xf3, 0xf9, 0xf, 0xfe, 0x3f, 0x6, 0xb0, @@ -4813,365 +4797,364 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 0, .adv_w = 142, .box_w = 4, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, {.bitmap_index = 10, .adv_w = 185, .box_w = 7, .box_h = 9, .ofs_x = 2, .ofs_y = 19}, {.bitmap_index = 18, .adv_w = 316, .box_w = 16, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 103, .adv_w = 284, .box_w = 14, .box_h = 35, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 197, .adv_w = 365, .box_w = 20, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 310, .adv_w = 313, .box_w = 18, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 413, .adv_w = 101, .box_w = 3, .box_h = 9, .ofs_x = 2, .ofs_y = 19}, - {.bitmap_index = 417, .adv_w = 181, .box_w = 9, .box_h = 39, .ofs_x = 2, .ofs_y = -9}, - {.bitmap_index = 481, .adv_w = 184, .box_w = 9, .box_h = 39, .ofs_x = 1, .ofs_y = -9}, - {.bitmap_index = 544, .adv_w = 248, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = 10}, - {.bitmap_index = 593, .adv_w = 286, .box_w = 15, .box_h = 19, .ofs_x = 2, .ofs_y = 3}, - {.bitmap_index = 618, .adv_w = 113, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 631, .adv_w = 143, .box_w = 7, .box_h = 3, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 635, .adv_w = 152, .box_w = 4, .box_h = 4, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 640, .adv_w = 214, .box_w = 13, .box_h = 29, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 714, .adv_w = 284, .box_w = 14, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 772, .adv_w = 284, .box_w = 10, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 794, .adv_w = 284, .box_w = 15, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 874, .adv_w = 284, .box_w = 14, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 953, .adv_w = 284, .box_w = 16, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1022, .adv_w = 284, .box_w = 15, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1096, .adv_w = 284, .box_w = 14, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1176, .adv_w = 284, .box_w = 15, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1251, .adv_w = 284, .box_w = 14, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1327, .adv_w = 284, .box_w = 14, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1406, .adv_w = 134, .box_w = 4, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1419, .adv_w = 117, .box_w = 6, .box_h = 26, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 1443, .adv_w = 257, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 1486, .adv_w = 276, .box_w = 12, .box_h = 10, .ofs_x = 3, .ofs_y = 7}, - {.bitmap_index = 1507, .adv_w = 265, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 3}, - {.bitmap_index = 1556, .adv_w = 243, .box_w = 13, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1618, .adv_w = 443, .box_w = 24, .box_h = 34, .ofs_x = 2, .ofs_y = -8}, - {.bitmap_index = 1783, .adv_w = 332, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1893, .adv_w = 314, .box_w = 15, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 1961, .adv_w = 327, .box_w = 17, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2037, .adv_w = 329, .box_w = 16, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2099, .adv_w = 286, .box_w = 14, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2136, .adv_w = 277, .box_w = 14, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2166, .adv_w = 340, .box_w = 17, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2245, .adv_w = 357, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2274, .adv_w = 144, .box_w = 4, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2280, .adv_w = 278, .box_w = 14, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2318, .adv_w = 314, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2412, .adv_w = 274, .box_w = 14, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2434, .adv_w = 435, .box_w = 22, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2550, .adv_w = 357, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2639, .adv_w = 346, .box_w = 18, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2716, .adv_w = 319, .box_w = 16, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2774, .adv_w = 346, .box_w = 18, .box_h = 31, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 2868, .adv_w = 306, .box_w = 16, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2951, .adv_w = 299, .box_w = 16, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3042, .adv_w = 300, .box_w = 17, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3067, .adv_w = 323, .box_w = 16, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3103, .adv_w = 323, .box_w = 20, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3209, .adv_w = 439, .box_w = 26, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3349, .adv_w = 318, .box_w = 18, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3453, .adv_w = 302, .box_w = 19, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3528, .adv_w = 301, .box_w = 16, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3607, .adv_w = 144, .box_w = 6, .box_h = 36, .ofs_x = 2, .ofs_y = -6}, - {.bitmap_index = 3623, .adv_w = 213, .box_w = 13, .box_h = 29, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3695, .adv_w = 144, .box_w = 7, .box_h = 36, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 3713, .adv_w = 214, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 13}, - {.bitmap_index = 3749, .adv_w = 233, .box_w = 14, .box_h = 3, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 3757, .adv_w = 178, .box_w = 8, .box_h = 6, .ofs_x = 1, .ofs_y = 23}, - {.bitmap_index = 3770, .adv_w = 276, .box_w = 14, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3829, .adv_w = 284, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3883, .adv_w = 266, .box_w = 14, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3935, .adv_w = 286, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3990, .adv_w = 270, .box_w = 14, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4048, .adv_w = 182, .box_w = 10, .box_h = 28, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4078, .adv_w = 284, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = -8}, - {.bitmap_index = 4149, .adv_w = 278, .box_w = 13, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4182, .adv_w = 132, .box_w = 4, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4192, .adv_w = 129, .box_w = 7, .box_h = 34, .ofs_x = -1, .ofs_y = -8}, - {.bitmap_index = 4217, .adv_w = 260, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4279, .adv_w = 132, .box_w = 4, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 4285, .adv_w = 434, .box_w = 23, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4333, .adv_w = 279, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4362, .adv_w = 289, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4418, .adv_w = 284, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = -8}, - {.bitmap_index = 4474, .adv_w = 288, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = -8}, - {.bitmap_index = 4530, .adv_w = 176, .box_w = 8, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4546, .adv_w = 263, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4604, .adv_w = 170, .box_w = 9, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4628, .adv_w = 278, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4656, .adv_w = 246, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4721, .adv_w = 374, .box_w = 23, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4823, .adv_w = 253, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4893, .adv_w = 240, .box_w = 14, .box_h = 28, .ofs_x = 1, .ofs_y = -8}, - {.bitmap_index = 4978, .adv_w = 253, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5031, .adv_w = 177, .box_w = 10, .box_h = 37, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 5087, .adv_w = 141, .box_w = 4, .box_h = 32, .ofs_x = 3, .ofs_y = -6}, - {.bitmap_index = 5094, .adv_w = 177, .box_w = 9, .box_h = 37, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 5145, .adv_w = 339, .box_w = 18, .box_h = 7, .ofs_x = 2, .ofs_y = 7}, - {.bitmap_index = 5176, .adv_w = 132, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5176, .adv_w = 134, .box_w = 4, .box_h = 27, .ofs_x = 2, .ofs_y = -7}, - {.bitmap_index = 5187, .adv_w = 294, .box_w = 15, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5246, .adv_w = 215, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 17}, - {.bitmap_index = 5270, .adv_w = 271, .box_w = 14, .box_h = 23, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5306, .adv_w = 190, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 12}, - {.bitmap_index = 5337, .adv_w = 190, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 12}, - {.bitmap_index = 5369, .adv_w = 287, .box_w = 13, .box_h = 28, .ofs_x = 3, .ofs_y = -8}, - {.bitmap_index = 5405, .adv_w = 243, .box_w = 13, .box_h = 27, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 5471, .adv_w = 332, .box_w = 21, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5607, .adv_w = 332, .box_w = 21, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5745, .adv_w = 332, .box_w = 21, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5885, .adv_w = 332, .box_w = 21, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6027, .adv_w = 332, .box_w = 20, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6152, .adv_w = 332, .box_w = 20, .box_h = 35, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6293, .adv_w = 468, .box_w = 29, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 6410, .adv_w = 327, .box_w = 17, .box_h = 34, .ofs_x = 2, .ofs_y = -8}, - {.bitmap_index = 6510, .adv_w = 286, .box_w = 14, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6568, .adv_w = 286, .box_w = 14, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6626, .adv_w = 286, .box_w = 14, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6686, .adv_w = 286, .box_w = 14, .box_h = 33, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6740, .adv_w = 144, .box_w = 8, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 6765, .adv_w = 144, .box_w = 9, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6792, .adv_w = 144, .box_w = 10, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6823, .adv_w = 144, .box_w = 11, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 6851, .adv_w = 337, .box_w = 18, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6932, .adv_w = 357, .box_w = 17, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7048, .adv_w = 346, .box_w = 18, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7152, .adv_w = 346, .box_w = 18, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7256, .adv_w = 346, .box_w = 18, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7357, .adv_w = 346, .box_w = 18, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7458, .adv_w = 346, .box_w = 18, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7555, .adv_w = 271, .box_w = 15, .box_h = 18, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 7615, .adv_w = 346, .box_w = 18, .box_h = 29, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 7728, .adv_w = 323, .box_w = 16, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7791, .adv_w = 323, .box_w = 16, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7852, .adv_w = 323, .box_w = 16, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7912, .adv_w = 323, .box_w = 16, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7968, .adv_w = 302, .box_w = 19, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8071, .adv_w = 297, .box_w = 15, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 8120, .adv_w = 301, .box_w = 15, .box_h = 29, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8198, .adv_w = 276, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8276, .adv_w = 276, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8353, .adv_w = 276, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8433, .adv_w = 276, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8512, .adv_w = 276, .box_w = 14, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8590, .adv_w = 276, .box_w = 14, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8677, .adv_w = 420, .box_w = 24, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8781, .adv_w = 266, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = -8}, - {.bitmap_index = 8853, .adv_w = 270, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8929, .adv_w = 270, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9005, .adv_w = 270, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9083, .adv_w = 270, .box_w = 14, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9159, .adv_w = 136, .box_w = 8, .box_h = 28, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 9182, .adv_w = 136, .box_w = 9, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9208, .adv_w = 136, .box_w = 10, .box_h = 28, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9235, .adv_w = 136, .box_w = 11, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 9260, .adv_w = 296, .box_w = 15, .box_h = 29, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9349, .adv_w = 279, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9397, .adv_w = 289, .box_w = 15, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9472, .adv_w = 289, .box_w = 15, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9546, .adv_w = 289, .box_w = 15, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9623, .adv_w = 289, .box_w = 15, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9700, .adv_w = 289, .box_w = 15, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9774, .adv_w = 288, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 9811, .adv_w = 287, .box_w = 15, .box_h = 25, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 9901, .adv_w = 278, .box_w = 13, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9947, .adv_w = 278, .box_w = 13, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9993, .adv_w = 278, .box_w = 13, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10041, .adv_w = 278, .box_w = 13, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10088, .adv_w = 240, .box_w = 14, .box_h = 36, .ofs_x = 1, .ofs_y = -8}, - {.bitmap_index = 10194, .adv_w = 293, .box_w = 14, .box_h = 36, .ofs_x = 2, .ofs_y = -8}, - {.bitmap_index = 10261, .adv_w = 240, .box_w = 14, .box_h = 34, .ofs_x = 0, .ofs_y = -8}, - {.bitmap_index = 10363, .adv_w = 340, .box_w = 17, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10469, .adv_w = 284, .box_w = 14, .box_h = 35, .ofs_x = 2, .ofs_y = -8}, - {.bitmap_index = 10560, .adv_w = 144, .box_w = 4, .box_h = 33, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10573, .adv_w = 136, .box_w = 4, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10577, .adv_w = 476, .box_w = 25, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10662, .adv_w = 448, .box_w = 25, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 10765, .adv_w = 299, .box_w = 16, .box_h = 34, .ofs_x = 1, .ofs_y = -8}, - {.bitmap_index = 10879, .adv_w = 263, .box_w = 13, .box_h = 28, .ofs_x = 2, .ofs_y = -8}, - {.bitmap_index = 10955, .adv_w = 299, .box_w = 16, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11071, .adv_w = 263, .box_w = 13, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11150, .adv_w = 301, .box_w = 16, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11255, .adv_w = 253, .box_w = 13, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11331, .adv_w = 324, .box_w = 17, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11416, .adv_w = 194, .box_w = 7, .box_h = 8, .ofs_x = 2, .ofs_y = 10}, - {.bitmap_index = 11427, .adv_w = 284, .box_w = 14, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 11495, .adv_w = 576, .box_w = 26, .box_h = 25, .ofs_x = 5, .ofs_y = 1}, - {.bitmap_index = 11578, .adv_w = 576, .box_w = 30, .box_h = 20, .ofs_x = 3, .ofs_y = 8}, - {.bitmap_index = 11646, .adv_w = 576, .box_w = 28, .box_h = 38, .ofs_x = 4, .ofs_y = -5}, - {.bitmap_index = 11833, .adv_w = 576, .box_w = 34, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 11978, .adv_w = 576, .box_w = 25, .box_h = 25, .ofs_x = 6, .ofs_y = 1}, - {.bitmap_index = 12065, .adv_w = 576, .box_w = 25, .box_h = 25, .ofs_x = 6, .ofs_y = 1}, - {.bitmap_index = 12165, .adv_w = 576, .box_w = 25, .box_h = 25, .ofs_x = 5, .ofs_y = 1}, - {.bitmap_index = 12264, .adv_w = 576, .box_w = 25, .box_h = 25, .ofs_x = 6, .ofs_y = 1}, - {.bitmap_index = 12349, .adv_w = 576, .box_w = 18, .box_h = 30, .ofs_x = 9, .ofs_y = -1}, - {.bitmap_index = 12388, .adv_w = 576, .box_w = 27, .box_h = 32, .ofs_x = 4, .ofs_y = -4}, - {.bitmap_index = 12486, .adv_w = 576, .box_w = 30, .box_h = 29, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 12564, .adv_w = 576, .box_w = 20, .box_h = 30, .ofs_x = 8, .ofs_y = -1}, - {.bitmap_index = 12677, .adv_w = 576, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 12746, .adv_w = 576, .box_w = 28, .box_h = 24, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 12847, .adv_w = 576, .box_w = 21, .box_h = 35, .ofs_x = 8, .ofs_y = -4}, - {.bitmap_index = 12897, .adv_w = 576, .box_w = 27, .box_h = 21, .ofs_x = 5, .ofs_y = 3}, - {.bitmap_index = 12988, .adv_w = 576, .box_w = 18, .box_h = 12, .ofs_x = 9, .ofs_y = 7}, - {.bitmap_index = 13036, .adv_w = 576, .box_w = 12, .box_h = 19, .ofs_x = 12, .ofs_y = 4}, - {.bitmap_index = 13084, .adv_w = 576, .box_w = 12, .box_h = 19, .ofs_x = 12, .ofs_y = 4}, - {.bitmap_index = 13133, .adv_w = 576, .box_w = 18, .box_h = 12, .ofs_x = 9, .ofs_y = 8}, - {.bitmap_index = 13178, .adv_w = 576, .box_w = 31, .box_h = 30, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 13360, .adv_w = 576, .box_w = 22, .box_h = 21, .ofs_x = 7, .ofs_y = 3}, - {.bitmap_index = 13457, .adv_w = 576, .box_w = 30, .box_h = 27, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 13528, .adv_w = 576, .box_w = 8, .box_h = 25, .ofs_x = 14, .ofs_y = 1}, - {.bitmap_index = 13573, .adv_w = 576, .box_w = 33, .box_h = 25, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 13652, .adv_w = 576, .box_w = 30, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 13812, .adv_w = 576, .box_w = 22, .box_h = 28, .ofs_x = 7, .ofs_y = -1}, - {.bitmap_index = 13930, .adv_w = 576, .box_w = 21, .box_h = 31, .ofs_x = 8, .ofs_y = -2}, - {.bitmap_index = 13996, .adv_w = 576, .box_w = 32, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 14168, .adv_w = 576, .box_w = 30, .box_h = 26, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 14261, .adv_w = 576, .box_w = 34, .box_h = 23, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 14337, .adv_w = 576, .box_w = 30, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 14472, .adv_w = 576, .box_w = 36, .box_h = 25, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 14531, .adv_w = 576, .box_w = 30, .box_h = 29, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 14690, .adv_w = 576, .box_w = 21, .box_h = 29, .ofs_x = 8, .ofs_y = -1}, - {.bitmap_index = 14773, .adv_w = 576, .box_w = 24, .box_h = 33, .ofs_x = 6, .ofs_y = -2}, - {.bitmap_index = 14870, .adv_w = 576, .box_w = 21, .box_h = 3, .ofs_x = 8, .ofs_y = 12}, - {.bitmap_index = 14876, .adv_w = 576, .box_w = 18, .box_h = 21, .ofs_x = 9, .ofs_y = 3}, - {.bitmap_index = 14893, .adv_w = 576, .box_w = 17, .box_h = 22, .ofs_x = 12, .ofs_y = 2}, - {.bitmap_index = 14964, .adv_w = 576, .box_w = 21, .box_h = 21, .ofs_x = 8, .ofs_y = 3}, - {.bitmap_index = 14993, .adv_w = 576, .box_w = 27, .box_h = 26, .ofs_x = 5, .ofs_y = 1}, - {.bitmap_index = 15112, .adv_w = 576, .box_w = 30, .box_h = 30, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 15251, .adv_w = 576, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 15341, .adv_w = 576, .box_w = 29, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 15499, .adv_w = 576, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 15597, .adv_w = 576, .box_w = 31, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 15748, .adv_w = 576, .box_w = 26, .box_h = 25, .ofs_x = 5, .ofs_y = 1}, - {.bitmap_index = 15884, .adv_w = 576, .box_w = 23, .box_h = 23, .ofs_x = 7, .ofs_y = 2}, - {.bitmap_index = 15961, .adv_w = 576, .box_w = 18, .box_h = 18, .ofs_x = 9, .ofs_y = 4}, - {.bitmap_index = 16016, .adv_w = 576, .box_w = 18, .box_h = 18, .ofs_x = 9, .ofs_y = 4}, - {.bitmap_index = 16071, .adv_w = 576, .box_w = 34, .box_h = 25, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 16170, .adv_w = 576, .box_w = 21, .box_h = 30, .ofs_x = 8, .ofs_y = -1}, - {.bitmap_index = 16275, .adv_w = 576, .box_w = 18, .box_h = 18, .ofs_x = 9, .ofs_y = 4}, - {.bitmap_index = 16290, .adv_w = 576, .box_w = 30, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 16413, .adv_w = 576, .box_w = 34, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 16469, .adv_w = 576, .box_w = 17, .box_h = 30, .ofs_x = 10, .ofs_y = -1}, - {.bitmap_index = 16535, .adv_w = 576, .box_w = 28, .box_h = 32, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 16683, .adv_w = 576, .box_w = 27, .box_h = 35, .ofs_x = 4, .ofs_y = -4}, - {.bitmap_index = 16837, .adv_w = 576, .box_w = 28, .box_h = 27, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 16962, .adv_w = 576, .box_w = 21, .box_h = 25, .ofs_x = 7, .ofs_y = 1}, - {.bitmap_index = 17037, .adv_w = 576, .box_w = 18, .box_h = 26, .ofs_x = 9, .ofs_y = 1}, - {.bitmap_index = 17120, .adv_w = 576, .box_w = 18, .box_h = 26, .ofs_x = 9, .ofs_y = 1}, - {.bitmap_index = 17221, .adv_w = 576, .box_w = 30, .box_h = 30, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 17333, .adv_w = 576, .box_w = 30, .box_h = 34, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 17532, .adv_w = 576, .box_w = 27, .box_h = 31, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 17686, .adv_w = 576, .box_w = 34, .box_h = 33, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 17858, .adv_w = 576, .box_w = 34, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 18007, .adv_w = 576, .box_w = 26, .box_h = 27, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 18125, .adv_w = 576, .box_w = 27, .box_h = 28, .ofs_x = 6, .ofs_y = -1}, - {.bitmap_index = 18246, .adv_w = 576, .box_w = 31, .box_h = 29, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 18386, .adv_w = 576, .box_w = 24, .box_h = 26, .ofs_x = 7, .ofs_y = 0}, - {.bitmap_index = 18471, .adv_w = 576, .box_w = 31, .box_h = 25, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 18583, .adv_w = 576, .box_w = 28, .box_h = 35, .ofs_x = 4, .ofs_y = -4}, - {.bitmap_index = 18742, .adv_w = 576, .box_w = 31, .box_h = 26, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 18839, .adv_w = 576, .box_w = 18, .box_h = 27, .ofs_x = 9, .ofs_y = 0}, - {.bitmap_index = 18890, .adv_w = 576, .box_w = 26, .box_h = 29, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 18978, .adv_w = 576, .box_w = 28, .box_h = 27, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 19070, .adv_w = 576, .box_w = 28, .box_h = 27, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 19163, .adv_w = 576, .box_w = 34, .box_h = 34, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 19328, .adv_w = 576, .box_w = 30, .box_h = 30, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 19509, .adv_w = 576, .box_w = 25, .box_h = 33, .ofs_x = 4, .ofs_y = -4}, - {.bitmap_index = 19637, .adv_w = 576, .box_w = 29, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 19784, .adv_w = 576, .box_w = 26, .box_h = 30, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 19916, .adv_w = 576, .box_w = 30, .box_h = 27, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 20029, .adv_w = 576, .box_w = 29, .box_h = 25, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 20129, .adv_w = 576, .box_w = 25, .box_h = 25, .ofs_x = 6, .ofs_y = 1}, - {.bitmap_index = 20210, .adv_w = 576, .box_w = 31, .box_h = 25, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 20332, .adv_w = 576, .box_w = 30, .box_h = 27, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 20392, .adv_w = 576, .box_w = 30, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 20454, .adv_w = 576, .box_w = 16, .box_h = 30, .ofs_x = 10, .ofs_y = -1}, - {.bitmap_index = 20507, .adv_w = 576, .box_w = 26, .box_h = 30, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 20644, .adv_w = 576, .box_w = 24, .box_h = 27, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 20737, .adv_w = 576, .box_w = 22, .box_h = 30, .ofs_x = 8, .ofs_y = -1}, - {.bitmap_index = 20854, .adv_w = 576, .box_w = 30, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 21001, .adv_w = 576, .box_w = 28, .box_h = 35, .ofs_x = 4, .ofs_y = -4}, - {.bitmap_index = 21142, .adv_w = 576, .box_w = 30, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 21256, .adv_w = 576, .box_w = 28, .box_h = 30, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 21356, .adv_w = 576, .box_w = 28, .box_h = 30, .ofs_x = 4, .ofs_y = -1}, - {.bitmap_index = 21441, .adv_w = 576, .box_w = 26, .box_h = 28, .ofs_x = 5, .ofs_y = 0}, - {.bitmap_index = 21511, .adv_w = 576, .box_w = 26, .box_h = 30, .ofs_x = 5, .ofs_y = -1}, - {.bitmap_index = 21599, .adv_w = 576, .box_w = 30, .box_h = 16, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 21653, .adv_w = 576, .box_w = 30, .box_h = 21, .ofs_x = 3, .ofs_y = 3}, - {.bitmap_index = 21715, .adv_w = 576, .box_w = 34, .box_h = 30, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 21840, .adv_w = 576, .box_w = 32, .box_h = 33, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 21947, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 22084, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 22208, .adv_w = 576, .box_w = 36, .box_h = 31, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22317, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 22470, .adv_w = 396, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 22595, .adv_w = 576, .box_w = 36, .box_h = 36, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 22801, .adv_w = 576, .box_w = 35, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 22971, .adv_w = 648, .box_w = 41, .box_h = 32, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 23151, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 23300, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 23439, .adv_w = 576, .box_w = 30, .box_h = 30, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 23580, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 23796, .adv_w = 288, .box_w = 18, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 23857, .adv_w = 432, .box_w = 27, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 23959, .adv_w = 648, .box_w = 41, .box_h = 35, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 24197, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 24314, .adv_w = 396, .box_w = 25, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 24465, .adv_w = 504, .box_w = 24, .box_h = 33, .ofs_x = 4, .ofs_y = -3}, - {.bitmap_index = 24565, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 24689, .adv_w = 504, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24766, .adv_w = 504, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 24824, .adv_w = 504, .box_w = 23, .box_h = 33, .ofs_x = 4, .ofs_y = -3}, - {.bitmap_index = 24923, .adv_w = 504, .box_w = 34, .box_h = 32, .ofs_x = -1, .ofs_y = -2}, - {.bitmap_index = 25042, .adv_w = 360, .box_w = 20, .box_h = 31, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 25165, .adv_w = 360, .box_w = 20, .box_h = 31, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 25287, .adv_w = 504, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 25360, .adv_w = 504, .box_w = 32, .box_h = 7, .ofs_x = 0, .ofs_y = 10}, - {.bitmap_index = 25384, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 25590, .adv_w = 720, .box_w = 46, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 25868, .adv_w = 648, .box_w = 42, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 26083, .adv_w = 576, .box_w = 36, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 26279, .adv_w = 504, .box_w = 31, .box_h = 19, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 26387, .adv_w = 504, .box_w = 31, .box_h = 19, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 26497, .adv_w = 720, .box_w = 46, .box_h = 28, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 26659, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 26726, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 26872, .adv_w = 576, .box_w = 37, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 27053, .adv_w = 576, .box_w = 32, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 27134, .adv_w = 504, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27332, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 27423, .adv_w = 504, .box_w = 31, .box_h = 32, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 27525, .adv_w = 504, .box_w = 32, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 27585, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 27706, .adv_w = 360, .box_w = 24, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 27835, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 27944, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 28077, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 28210, .adv_w = 576, .box_w = 38, .box_h = 38, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 28367, .adv_w = 576, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 28477, .adv_w = 432, .box_w = 27, .box_h = 36, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 28546, .adv_w = 576, .box_w = 34, .box_h = 32, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 28614, .adv_w = 576, .box_w = 30, .box_h = 25, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 28731, .adv_w = 720, .box_w = 45, .box_h = 33, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 28940, .adv_w = 576, .box_w = 34, .box_h = 21, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 29063, .adv_w = 576, .box_w = 27, .box_h = 25, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 29114, .adv_w = 576, .box_w = 30, .box_h = 25, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 29190, .adv_w = 576, .box_w = 27, .box_h = 25, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 29232, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 29311, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 29391, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 29470, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 29548, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 29621, .adv_w = 720, .box_w = 46, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 29787, .adv_w = 504, .box_w = 27, .box_h = 36, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 29979, .adv_w = 576, .box_w = 18, .box_h = 30, .ofs_x = 9, .ofs_y = -1}, - {.bitmap_index = 30025, .adv_w = 576, .box_w = 18, .box_h = 30, .ofs_x = 9, .ofs_y = -1}, - {.bitmap_index = 30077, .adv_w = 576, .box_w = 18, .box_h = 30, .ofs_x = 9, .ofs_y = -1}, - {.bitmap_index = 30137, .adv_w = 576, .box_w = 34, .box_h = 22, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 30289, .adv_w = 576, .box_w = 30, .box_h = 23, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 30376, .adv_w = 576, .box_w = 30, .box_h = 23, .ofs_x = 3, .ofs_y = 1}, - {.bitmap_index = 30449, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 30553, .adv_w = 576, .box_w = 37, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 30743, .adv_w = 576, .box_w = 18, .box_h = 35, .ofs_x = 9, .ofs_y = -4}, - {.bitmap_index = 30854, .adv_w = 720, .box_w = 45, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 31046, .adv_w = 432, .box_w = 27, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 31128, .adv_w = 579, .box_w = 36, .box_h = 23, .ofs_x = 0, .ofs_y = 2} + {.bitmap_index = 101, .adv_w = 284, .box_w = 14, .box_h = 35, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 192, .adv_w = 365, .box_w = 20, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 304, .adv_w = 313, .box_w = 18, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 403, .adv_w = 101, .box_w = 3, .box_h = 9, .ofs_x = 2, .ofs_y = 19}, + {.bitmap_index = 407, .adv_w = 181, .box_w = 9, .box_h = 39, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 471, .adv_w = 184, .box_w = 9, .box_h = 39, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 535, .adv_w = 248, .box_w = 17, .box_h = 16, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 586, .adv_w = 286, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 612, .adv_w = 113, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 625, .adv_w = 143, .box_w = 7, .box_h = 3, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 629, .adv_w = 152, .box_w = 4, .box_h = 4, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 634, .adv_w = 214, .box_w = 13, .box_h = 29, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 708, .adv_w = 284, .box_w = 14, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 767, .adv_w = 284, .box_w = 10, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 789, .adv_w = 284, .box_w = 15, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 867, .adv_w = 284, .box_w = 14, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 942, .adv_w = 284, .box_w = 16, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1016, .adv_w = 284, .box_w = 15, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1090, .adv_w = 284, .box_w = 14, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1165, .adv_w = 284, .box_w = 15, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1240, .adv_w = 284, .box_w = 14, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1316, .adv_w = 284, .box_w = 14, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1395, .adv_w = 134, .box_w = 4, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1408, .adv_w = 117, .box_w = 6, .box_h = 26, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 1431, .adv_w = 257, .box_w = 12, .box_h = 17, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 1474, .adv_w = 276, .box_w = 12, .box_h = 10, .ofs_x = 3, .ofs_y = 7}, + {.bitmap_index = 1495, .adv_w = 265, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 3}, + {.bitmap_index = 1544, .adv_w = 243, .box_w = 13, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1606, .adv_w = 443, .box_w = 24, .box_h = 34, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 1771, .adv_w = 332, .box_w = 20, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1872, .adv_w = 314, .box_w = 15, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 1939, .adv_w = 327, .box_w = 17, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2014, .adv_w = 329, .box_w = 16, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 2076, .adv_w = 286, .box_w = 14, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 2112, .adv_w = 277, .box_w = 14, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 2142, .adv_w = 340, .box_w = 17, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2222, .adv_w = 357, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 2248, .adv_w = 144, .box_w = 4, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 2254, .adv_w = 278, .box_w = 14, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2293, .adv_w = 314, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 2386, .adv_w = 274, .box_w = 14, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 2408, .adv_w = 435, .box_w = 22, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 2515, .adv_w = 357, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 2604, .adv_w = 346, .box_w = 18, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2682, .adv_w = 319, .box_w = 16, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 2740, .adv_w = 346, .box_w = 18, .box_h = 31, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 2835, .adv_w = 306, .box_w = 16, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 2918, .adv_w = 299, .box_w = 16, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3011, .adv_w = 300, .box_w = 17, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3037, .adv_w = 323, .box_w = 16, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3073, .adv_w = 323, .box_w = 20, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3179, .adv_w = 439, .box_w = 26, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3319, .adv_w = 318, .box_w = 18, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3423, .adv_w = 302, .box_w = 19, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3499, .adv_w = 301, .box_w = 15, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3574, .adv_w = 144, .box_w = 6, .box_h = 36, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 3590, .adv_w = 213, .box_w = 13, .box_h = 29, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3662, .adv_w = 144, .box_w = 7, .box_h = 36, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 3680, .adv_w = 214, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 13}, + {.bitmap_index = 3716, .adv_w = 233, .box_w = 14, .box_h = 3, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3724, .adv_w = 178, .box_w = 8, .box_h = 6, .ofs_x = 1, .ofs_y = 23}, + {.bitmap_index = 3737, .adv_w = 276, .box_w = 14, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3797, .adv_w = 284, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3851, .adv_w = 266, .box_w = 14, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3903, .adv_w = 286, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3959, .adv_w = 270, .box_w = 14, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4018, .adv_w = 182, .box_w = 11, .box_h = 28, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4054, .adv_w = 284, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 4126, .adv_w = 278, .box_w = 13, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4156, .adv_w = 132, .box_w = 4, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4166, .adv_w = 129, .box_w = 7, .box_h = 34, .ofs_x = -1, .ofs_y = -8}, + {.bitmap_index = 4191, .adv_w = 260, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4253, .adv_w = 132, .box_w = 4, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4259, .adv_w = 434, .box_w = 23, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4304, .adv_w = 279, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4331, .adv_w = 289, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4388, .adv_w = 284, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 4444, .adv_w = 288, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 4500, .adv_w = 176, .box_w = 8, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4516, .adv_w = 263, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4574, .adv_w = 170, .box_w = 9, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4599, .adv_w = 278, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4627, .adv_w = 246, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4692, .adv_w = 374, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4790, .adv_w = 253, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4860, .adv_w = 240, .box_w = 15, .box_h = 28, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 4949, .adv_w = 253, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5003, .adv_w = 177, .box_w = 9, .box_h = 36, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 5054, .adv_w = 141, .box_w = 4, .box_h = 32, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 5061, .adv_w = 177, .box_w = 9, .box_h = 36, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 5110, .adv_w = 339, .box_w = 18, .box_h = 7, .ofs_x = 2, .ofs_y = 7}, + {.bitmap_index = 5141, .adv_w = 132, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5141, .adv_w = 134, .box_w = 4, .box_h = 27, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 5152, .adv_w = 294, .box_w = 15, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5210, .adv_w = 215, .box_w = 9, .box_h = 10, .ofs_x = 2, .ofs_y = 17}, + {.bitmap_index = 5233, .adv_w = 271, .box_w = 14, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5269, .adv_w = 190, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 5300, .adv_w = 190, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 5333, .adv_w = 287, .box_w = 13, .box_h = 28, .ofs_x = 3, .ofs_y = -8}, + {.bitmap_index = 5368, .adv_w = 243, .box_w = 13, .box_h = 27, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 5433, .adv_w = 332, .box_w = 20, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5560, .adv_w = 332, .box_w = 20, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5688, .adv_w = 332, .box_w = 20, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5818, .adv_w = 332, .box_w = 20, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5950, .adv_w = 332, .box_w = 20, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6074, .adv_w = 332, .box_w = 20, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6215, .adv_w = 468, .box_w = 29, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6331, .adv_w = 327, .box_w = 17, .box_h = 34, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 6430, .adv_w = 286, .box_w = 14, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6487, .adv_w = 286, .box_w = 14, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6544, .adv_w = 286, .box_w = 14, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6604, .adv_w = 286, .box_w = 14, .box_h = 33, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6658, .adv_w = 144, .box_w = 8, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6683, .adv_w = 144, .box_w = 8, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6708, .adv_w = 144, .box_w = 10, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6739, .adv_w = 144, .box_w = 11, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6767, .adv_w = 337, .box_w = 19, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6844, .adv_w = 357, .box_w = 17, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6960, .adv_w = 346, .box_w = 18, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7064, .adv_w = 346, .box_w = 18, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7168, .adv_w = 346, .box_w = 18, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7270, .adv_w = 346, .box_w = 18, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7371, .adv_w = 346, .box_w = 18, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7468, .adv_w = 271, .box_w = 15, .box_h = 18, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 7528, .adv_w = 346, .box_w = 18, .box_h = 29, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 7641, .adv_w = 323, .box_w = 16, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7703, .adv_w = 323, .box_w = 16, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7764, .adv_w = 323, .box_w = 16, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7824, .adv_w = 323, .box_w = 16, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7880, .adv_w = 302, .box_w = 19, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7984, .adv_w = 297, .box_w = 15, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8033, .adv_w = 301, .box_w = 15, .box_h = 29, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8108, .adv_w = 276, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8189, .adv_w = 276, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8266, .adv_w = 276, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8347, .adv_w = 276, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8427, .adv_w = 276, .box_w = 14, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8506, .adv_w = 276, .box_w = 14, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8593, .adv_w = 420, .box_w = 24, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8693, .adv_w = 266, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 8765, .adv_w = 270, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8842, .adv_w = 270, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8920, .adv_w = 270, .box_w = 14, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9000, .adv_w = 270, .box_w = 14, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9078, .adv_w = 136, .box_w = 8, .box_h = 28, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9101, .adv_w = 136, .box_w = 9, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9127, .adv_w = 136, .box_w = 10, .box_h = 28, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9154, .adv_w = 136, .box_w = 11, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9179, .adv_w = 296, .box_w = 15, .box_h = 29, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9267, .adv_w = 279, .box_w = 13, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9313, .adv_w = 289, .box_w = 15, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9389, .adv_w = 289, .box_w = 15, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9464, .adv_w = 289, .box_w = 15, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9542, .adv_w = 289, .box_w = 15, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9620, .adv_w = 289, .box_w = 15, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9695, .adv_w = 288, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 9732, .adv_w = 287, .box_w = 15, .box_h = 25, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 9820, .adv_w = 278, .box_w = 13, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9867, .adv_w = 278, .box_w = 13, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9913, .adv_w = 278, .box_w = 13, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9962, .adv_w = 278, .box_w = 13, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10009, .adv_w = 240, .box_w = 15, .box_h = 36, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 10120, .adv_w = 293, .box_w = 14, .box_h = 36, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 10185, .adv_w = 240, .box_w = 14, .box_h = 34, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 10288, .adv_w = 340, .box_w = 17, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10394, .adv_w = 284, .box_w = 14, .box_h = 35, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 10486, .adv_w = 144, .box_w = 4, .box_h = 33, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10499, .adv_w = 136, .box_w = 4, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10503, .adv_w = 476, .box_w = 25, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10590, .adv_w = 448, .box_w = 25, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10691, .adv_w = 299, .box_w = 16, .box_h = 34, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 10807, .adv_w = 263, .box_w = 13, .box_h = 28, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 10883, .adv_w = 299, .box_w = 16, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11001, .adv_w = 263, .box_w = 13, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11080, .adv_w = 301, .box_w = 15, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11180, .adv_w = 253, .box_w = 13, .box_h = 28, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11256, .adv_w = 194, .box_w = 7, .box_h = 8, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 11267, .adv_w = 284, .box_w = 15, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11344, .adv_w = 576, .box_w = 26, .box_h = 25, .ofs_x = 5, .ofs_y = 1}, + {.bitmap_index = 11427, .adv_w = 576, .box_w = 30, .box_h = 20, .ofs_x = 3, .ofs_y = 8}, + {.bitmap_index = 11495, .adv_w = 576, .box_w = 28, .box_h = 38, .ofs_x = 4, .ofs_y = -5}, + {.bitmap_index = 11682, .adv_w = 576, .box_w = 34, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11827, .adv_w = 576, .box_w = 25, .box_h = 25, .ofs_x = 6, .ofs_y = 1}, + {.bitmap_index = 11914, .adv_w = 576, .box_w = 25, .box_h = 25, .ofs_x = 6, .ofs_y = 1}, + {.bitmap_index = 12014, .adv_w = 576, .box_w = 25, .box_h = 25, .ofs_x = 5, .ofs_y = 1}, + {.bitmap_index = 12113, .adv_w = 576, .box_w = 25, .box_h = 25, .ofs_x = 6, .ofs_y = 1}, + {.bitmap_index = 12198, .adv_w = 576, .box_w = 18, .box_h = 30, .ofs_x = 9, .ofs_y = -1}, + {.bitmap_index = 12237, .adv_w = 576, .box_w = 27, .box_h = 32, .ofs_x = 4, .ofs_y = -4}, + {.bitmap_index = 12335, .adv_w = 576, .box_w = 30, .box_h = 29, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 12413, .adv_w = 576, .box_w = 20, .box_h = 30, .ofs_x = 8, .ofs_y = -1}, + {.bitmap_index = 12526, .adv_w = 576, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12595, .adv_w = 576, .box_w = 28, .box_h = 24, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12696, .adv_w = 576, .box_w = 21, .box_h = 35, .ofs_x = 8, .ofs_y = -4}, + {.bitmap_index = 12746, .adv_w = 576, .box_w = 27, .box_h = 21, .ofs_x = 5, .ofs_y = 3}, + {.bitmap_index = 12837, .adv_w = 576, .box_w = 18, .box_h = 12, .ofs_x = 9, .ofs_y = 7}, + {.bitmap_index = 12885, .adv_w = 576, .box_w = 12, .box_h = 19, .ofs_x = 12, .ofs_y = 4}, + {.bitmap_index = 12933, .adv_w = 576, .box_w = 12, .box_h = 19, .ofs_x = 12, .ofs_y = 4}, + {.bitmap_index = 12982, .adv_w = 576, .box_w = 18, .box_h = 12, .ofs_x = 9, .ofs_y = 8}, + {.bitmap_index = 13027, .adv_w = 576, .box_w = 31, .box_h = 30, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 13209, .adv_w = 576, .box_w = 22, .box_h = 21, .ofs_x = 7, .ofs_y = 3}, + {.bitmap_index = 13306, .adv_w = 576, .box_w = 30, .box_h = 27, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13377, .adv_w = 576, .box_w = 8, .box_h = 25, .ofs_x = 14, .ofs_y = 1}, + {.bitmap_index = 13422, .adv_w = 576, .box_w = 33, .box_h = 25, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 13501, .adv_w = 576, .box_w = 30, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 13661, .adv_w = 576, .box_w = 22, .box_h = 28, .ofs_x = 7, .ofs_y = -1}, + {.bitmap_index = 13779, .adv_w = 576, .box_w = 21, .box_h = 31, .ofs_x = 8, .ofs_y = -2}, + {.bitmap_index = 13845, .adv_w = 576, .box_w = 32, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14017, .adv_w = 576, .box_w = 30, .box_h = 26, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 14110, .adv_w = 576, .box_w = 34, .box_h = 23, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 14186, .adv_w = 576, .box_w = 30, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 14321, .adv_w = 576, .box_w = 36, .box_h = 25, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 14380, .adv_w = 576, .box_w = 30, .box_h = 29, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 14539, .adv_w = 576, .box_w = 21, .box_h = 29, .ofs_x = 8, .ofs_y = -1}, + {.bitmap_index = 14622, .adv_w = 576, .box_w = 24, .box_h = 33, .ofs_x = 6, .ofs_y = -2}, + {.bitmap_index = 14719, .adv_w = 576, .box_w = 21, .box_h = 3, .ofs_x = 8, .ofs_y = 12}, + {.bitmap_index = 14725, .adv_w = 576, .box_w = 18, .box_h = 21, .ofs_x = 9, .ofs_y = 3}, + {.bitmap_index = 14742, .adv_w = 576, .box_w = 17, .box_h = 22, .ofs_x = 12, .ofs_y = 2}, + {.bitmap_index = 14813, .adv_w = 576, .box_w = 21, .box_h = 21, .ofs_x = 8, .ofs_y = 3}, + {.bitmap_index = 14842, .adv_w = 576, .box_w = 27, .box_h = 26, .ofs_x = 5, .ofs_y = 1}, + {.bitmap_index = 14961, .adv_w = 576, .box_w = 30, .box_h = 30, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 15100, .adv_w = 576, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 15190, .adv_w = 576, .box_w = 29, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 15348, .adv_w = 576, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 15446, .adv_w = 576, .box_w = 31, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 15597, .adv_w = 576, .box_w = 26, .box_h = 25, .ofs_x = 5, .ofs_y = 1}, + {.bitmap_index = 15733, .adv_w = 576, .box_w = 23, .box_h = 23, .ofs_x = 7, .ofs_y = 2}, + {.bitmap_index = 15810, .adv_w = 576, .box_w = 18, .box_h = 18, .ofs_x = 9, .ofs_y = 4}, + {.bitmap_index = 15865, .adv_w = 576, .box_w = 18, .box_h = 18, .ofs_x = 9, .ofs_y = 4}, + {.bitmap_index = 15920, .adv_w = 576, .box_w = 34, .box_h = 25, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 16019, .adv_w = 576, .box_w = 21, .box_h = 30, .ofs_x = 8, .ofs_y = -1}, + {.bitmap_index = 16124, .adv_w = 576, .box_w = 18, .box_h = 18, .ofs_x = 9, .ofs_y = 4}, + {.bitmap_index = 16139, .adv_w = 576, .box_w = 30, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 16262, .adv_w = 576, .box_w = 34, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 16318, .adv_w = 576, .box_w = 17, .box_h = 30, .ofs_x = 10, .ofs_y = -1}, + {.bitmap_index = 16384, .adv_w = 576, .box_w = 28, .box_h = 32, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 16532, .adv_w = 576, .box_w = 27, .box_h = 35, .ofs_x = 4, .ofs_y = -4}, + {.bitmap_index = 16686, .adv_w = 576, .box_w = 28, .box_h = 27, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 16811, .adv_w = 576, .box_w = 21, .box_h = 25, .ofs_x = 7, .ofs_y = 1}, + {.bitmap_index = 16886, .adv_w = 576, .box_w = 18, .box_h = 26, .ofs_x = 9, .ofs_y = 1}, + {.bitmap_index = 16969, .adv_w = 576, .box_w = 18, .box_h = 26, .ofs_x = 9, .ofs_y = 1}, + {.bitmap_index = 17070, .adv_w = 576, .box_w = 30, .box_h = 30, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 17182, .adv_w = 576, .box_w = 30, .box_h = 34, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 17381, .adv_w = 576, .box_w = 27, .box_h = 31, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 17535, .adv_w = 576, .box_w = 34, .box_h = 33, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 17707, .adv_w = 576, .box_w = 34, .box_h = 27, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17856, .adv_w = 576, .box_w = 26, .box_h = 27, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 17974, .adv_w = 576, .box_w = 27, .box_h = 28, .ofs_x = 6, .ofs_y = -1}, + {.bitmap_index = 18095, .adv_w = 576, .box_w = 31, .box_h = 29, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 18235, .adv_w = 576, .box_w = 24, .box_h = 26, .ofs_x = 7, .ofs_y = 0}, + {.bitmap_index = 18320, .adv_w = 576, .box_w = 31, .box_h = 25, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 18432, .adv_w = 576, .box_w = 28, .box_h = 35, .ofs_x = 4, .ofs_y = -4}, + {.bitmap_index = 18591, .adv_w = 576, .box_w = 31, .box_h = 26, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 18688, .adv_w = 576, .box_w = 18, .box_h = 27, .ofs_x = 9, .ofs_y = 0}, + {.bitmap_index = 18739, .adv_w = 576, .box_w = 26, .box_h = 29, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 18827, .adv_w = 576, .box_w = 28, .box_h = 27, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 18919, .adv_w = 576, .box_w = 28, .box_h = 27, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 19012, .adv_w = 576, .box_w = 34, .box_h = 34, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 19177, .adv_w = 576, .box_w = 30, .box_h = 30, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 19358, .adv_w = 576, .box_w = 25, .box_h = 33, .ofs_x = 4, .ofs_y = -4}, + {.bitmap_index = 19486, .adv_w = 576, .box_w = 29, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 19633, .adv_w = 576, .box_w = 26, .box_h = 30, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 19765, .adv_w = 576, .box_w = 30, .box_h = 27, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 19878, .adv_w = 576, .box_w = 29, .box_h = 25, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 19978, .adv_w = 576, .box_w = 25, .box_h = 25, .ofs_x = 6, .ofs_y = 1}, + {.bitmap_index = 20059, .adv_w = 576, .box_w = 31, .box_h = 25, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 20181, .adv_w = 576, .box_w = 30, .box_h = 27, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 20241, .adv_w = 576, .box_w = 30, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 20303, .adv_w = 576, .box_w = 16, .box_h = 30, .ofs_x = 10, .ofs_y = -1}, + {.bitmap_index = 20356, .adv_w = 576, .box_w = 26, .box_h = 30, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 20493, .adv_w = 576, .box_w = 24, .box_h = 27, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 20586, .adv_w = 576, .box_w = 22, .box_h = 30, .ofs_x = 8, .ofs_y = -1}, + {.bitmap_index = 20703, .adv_w = 576, .box_w = 30, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 20850, .adv_w = 576, .box_w = 28, .box_h = 35, .ofs_x = 4, .ofs_y = -4}, + {.bitmap_index = 20991, .adv_w = 576, .box_w = 30, .box_h = 31, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 21105, .adv_w = 576, .box_w = 28, .box_h = 30, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 21205, .adv_w = 576, .box_w = 28, .box_h = 30, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 21290, .adv_w = 576, .box_w = 26, .box_h = 28, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 21360, .adv_w = 576, .box_w = 26, .box_h = 30, .ofs_x = 5, .ofs_y = -1}, + {.bitmap_index = 21448, .adv_w = 576, .box_w = 30, .box_h = 16, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 21502, .adv_w = 576, .box_w = 30, .box_h = 21, .ofs_x = 3, .ofs_y = 3}, + {.bitmap_index = 21564, .adv_w = 576, .box_w = 34, .box_h = 30, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 21689, .adv_w = 576, .box_w = 32, .box_h = 33, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 21796, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 21933, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 22057, .adv_w = 576, .box_w = 36, .box_h = 31, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22166, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 22319, .adv_w = 396, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 22444, .adv_w = 576, .box_w = 36, .box_h = 36, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 22650, .adv_w = 576, .box_w = 35, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 22820, .adv_w = 648, .box_w = 41, .box_h = 32, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23000, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 23149, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23288, .adv_w = 576, .box_w = 30, .box_h = 30, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 23429, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 23645, .adv_w = 288, .box_w = 18, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 23706, .adv_w = 432, .box_w = 27, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 23808, .adv_w = 648, .box_w = 41, .box_h = 35, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 24046, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24163, .adv_w = 396, .box_w = 25, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 24314, .adv_w = 504, .box_w = 24, .box_h = 33, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 24414, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 24538, .adv_w = 504, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24615, .adv_w = 504, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24673, .adv_w = 504, .box_w = 23, .box_h = 33, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 24772, .adv_w = 504, .box_w = 34, .box_h = 32, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 24891, .adv_w = 360, .box_w = 20, .box_h = 31, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25014, .adv_w = 360, .box_w = 20, .box_h = 31, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25136, .adv_w = 504, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25209, .adv_w = 504, .box_w = 32, .box_h = 7, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 25233, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25439, .adv_w = 720, .box_w = 46, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 25717, .adv_w = 648, .box_w = 42, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 25932, .adv_w = 576, .box_w = 36, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 26128, .adv_w = 504, .box_w = 31, .box_h = 19, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 26236, .adv_w = 504, .box_w = 31, .box_h = 19, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 26346, .adv_w = 720, .box_w = 46, .box_h = 28, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 26508, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26575, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 26721, .adv_w = 576, .box_w = 37, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 26902, .adv_w = 576, .box_w = 32, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 26983, .adv_w = 504, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27181, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 27272, .adv_w = 504, .box_w = 31, .box_h = 32, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27374, .adv_w = 504, .box_w = 32, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 27434, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27555, .adv_w = 360, .box_w = 24, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27684, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 27793, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 27926, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28059, .adv_w = 576, .box_w = 38, .box_h = 38, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 28216, .adv_w = 576, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 28326, .adv_w = 432, .box_w = 27, .box_h = 36, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 28395, .adv_w = 576, .box_w = 34, .box_h = 32, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 28463, .adv_w = 576, .box_w = 30, .box_h = 25, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 28580, .adv_w = 720, .box_w = 45, .box_h = 33, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28789, .adv_w = 576, .box_w = 34, .box_h = 21, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 28912, .adv_w = 576, .box_w = 27, .box_h = 25, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 28963, .adv_w = 576, .box_w = 30, .box_h = 25, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 29039, .adv_w = 576, .box_w = 27, .box_h = 25, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 29081, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 29160, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 29240, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 29319, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 29397, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 29470, .adv_w = 720, .box_w = 46, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29636, .adv_w = 504, .box_w = 27, .box_h = 36, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 29828, .adv_w = 576, .box_w = 18, .box_h = 30, .ofs_x = 9, .ofs_y = -1}, + {.bitmap_index = 29874, .adv_w = 576, .box_w = 18, .box_h = 30, .ofs_x = 9, .ofs_y = -1}, + {.bitmap_index = 29926, .adv_w = 576, .box_w = 18, .box_h = 30, .ofs_x = 9, .ofs_y = -1}, + {.bitmap_index = 29986, .adv_w = 576, .box_w = 34, .box_h = 22, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 30138, .adv_w = 576, .box_w = 30, .box_h = 23, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 30225, .adv_w = 576, .box_w = 30, .box_h = 23, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 30298, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 30402, .adv_w = 576, .box_w = 37, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 30592, .adv_w = 576, .box_w = 18, .box_h = 35, .ofs_x = 9, .ofs_y = -4}, + {.bitmap_index = 30703, .adv_w = 720, .box_w = 45, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30895, .adv_w = 432, .box_w = 27, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 30977, .adv_w = 579, .box_w = 36, .box_h = 23, .ofs_x = 0, .ofs_y = 2} }; /*--------------------- @@ -5184,30 +5167,30 @@ static const uint16_t unicode_list_1[] = { static const uint16_t unicode_list_3[] = { 0x0, 0x1, 0x12, 0x13, 0x34, 0x35, 0x40, 0x41, - 0x42, 0x43, 0x5f, 0x60, 0x1d80, 0x1f04, 0x1f8e, 0xdee6, - 0xdef3, 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, - 0xdf7c, 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, - 0xe023, 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, - 0xe0f2, 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, - 0xe20c, 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, - 0xe31a, 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, - 0xe390, 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, - 0xe447, 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, - 0xe48a, 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, - 0xe583, 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, - 0xe5f9, 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, - 0xe7bf, 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, - 0xe952, 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, - 0xeeea, 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, - 0xeefe, 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, - 0xef2a, 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, - 0xef49, 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, - 0xef5b, 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, - 0xefab, 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, - 0xf03d, 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, - 0xf122, 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, - 0xf184, 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, - 0xf43c, 0xf6a4, 0xf784 + 0x42, 0x43, 0x5f, 0x60, 0x1f04, 0x1f8e, 0xdee6, 0xdef3, + 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, 0xdf7c, + 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, 0xe023, + 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, 0xe0f2, + 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, 0xe20c, + 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, 0xe31a, + 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, 0xe390, + 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, 0xe447, + 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, 0xe48a, + 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, 0xe583, + 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, 0xe5f9, + 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, 0xe7bf, + 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, 0xe952, + 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, 0xeeea, + 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, 0xeefe, + 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, 0xef2a, + 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, 0xef49, + 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, 0xef5b, + 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, 0xefab, + 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, 0xf03d, + 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, 0xf122, + 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, 0xf184, + 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, 0xf43c, + 0xf6a4, 0xf784 }; /*Collect the unicode lists and glyph_id offsets*/ @@ -5227,7 +5210,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = }, { .range_start = 286, .range_length = 63365, .glyph_id_start = 169, - .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 195, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 194, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_48_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_48_latin1.c index 567eda679..8ee70bee3 100644 --- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_48_latin1.c +++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_48_latin1.c @@ -1,7 +1,7 @@ /******************************************************************************* * Size: 48 px * Bpp: 2 - * Opts: --no-kerning --bpp 2 --size 48 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x1E9E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_48_latin1.c --format lvgl + * Opts: --no-kerning --bpp 2 --size 48 --font fonts/roboto/ttf/RobotoCondensed-Regular.ttf --autohint-strong -r 0x20-0x7E,0xA0,0xA1,0xA3,0xB0,0xB1,0xB2,0xB3,0xB5,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x011E-0x011F,0x0130,0x0131,0x0152-0x0153,0x015E-0x015F,0x0160-0x0161,0x017D-0x017E,0x2022,0x20AC --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/roboto-latin1/robotocondensed_regular_48_latin1.c --format lvgl ******************************************************************************/ #ifdef LV_LVGL_H_INCLUDE_SIMPLE @@ -26,7 +26,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0021 "!" */ 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xf1, 0x7e, 0xf, - 0xfe, 0x2f, 0x93, 0x4, 0x1f, 0xf6, 0x8, + 0xfe, 0x23, 0xe4, 0x81, 0x7, 0xfd, 0x2, 0x0, /* U+0022 "\"" */ 0xf8, 0x2f, 0x83, 0xff, 0xd8, 0x87, 0x21, 0xff, @@ -37,118 +37,119 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x21, 0xff, 0xc4, 0x43, 0xe4, 0x3f, 0xd8, 0x7d, 0x87, 0xff, 0x5, 0x6, 0x19, 0x6, 0x1f, 0xfc, 0x14, 0x3e, 0x43, 0xff, 0xa6, 0x87, 0xc8, 0x7e, - 0xaf, 0x5, 0x5c, 0x15, 0x40, 0x5e, 0xc, 0xb8, - 0x32, 0xc1, 0xff, 0xe2, 0xfe, 0xb, 0xf8, 0x2f, - 0xc1, 0xe4, 0x3e, 0x43, 0xff, 0x88, 0x87, 0xc8, - 0x7f, 0xb0, 0xfb, 0xf, 0xfe, 0xa, 0xc, 0x32, - 0xc, 0x3f, 0xf8, 0x28, 0x7c, 0x87, 0xff, 0x4d, - 0xf, 0x90, 0xfd, 0xfd, 0x5, 0xfa, 0xb, 0xf0, - 0x7f, 0xf8, 0x57, 0x82, 0x5e, 0x9, 0x78, 0xae, - 0xa, 0xb8, 0x2a, 0xe0, 0xff, 0xe0, 0xa1, 0xff, - 0xc1, 0x40, 0x87, 0xc8, 0x7f, 0xb0, 0xfb, 0xf, - 0xfe, 0x26, 0x19, 0x6, 0x1f, 0xe4, 0x8, 0x7c, - 0x87, 0xff, 0x6d, 0xf, 0xfe, 0xa, 0x4, 0x3e, - 0x43, 0xe0, + 0xae, 0xc2, 0xad, 0x85, 0x50, 0x17, 0xc1, 0x2f, + 0x4, 0xb0, 0x7f, 0xf8, 0xbf, 0x82, 0xfe, 0xb, + 0xf0, 0x79, 0xf, 0x90, 0xff, 0xe2, 0x21, 0xf2, + 0x1f, 0xec, 0x3e, 0xc3, 0xff, 0x82, 0x83, 0xc, + 0x83, 0xf, 0xfe, 0xa, 0x1f, 0x21, 0xff, 0xd3, + 0x43, 0xe4, 0x3f, 0x7f, 0x41, 0x7e, 0x82, 0xfc, + 0x1f, 0xfe, 0x15, 0xe0, 0x97, 0x82, 0x5e, 0x2b, + 0x82, 0xae, 0xa, 0xb8, 0x39, 0xf, 0x90, 0xff, + 0xe2, 0x21, 0xf2, 0x1f, 0xec, 0x3e, 0xc3, 0xff, + 0x82, 0x83, 0xc, 0x83, 0xf, 0xfe, 0xa, 0x1f, + 0x21, 0xff, 0xd3, 0x43, 0xe4, 0x3f, 0xf8, 0x88, + 0x7c, 0x87, 0xc0, /* U+0024 "$" */ - 0xf, 0xdf, 0x7, 0xff, 0xfc, 0x3f, 0xf8, 0x6c, - 0x14, 0x87, 0xf9, 0xe4, 0x26, 0xc3, 0xf3, 0x7, - 0xf6, 0x87, 0x30, 0x7f, 0xd0, 0x74, 0x1a, 0xf9, - 0xd, 0x4, 0x86, 0x90, 0xa4, 0x24, 0x2c, 0x32, - 0x1d, 0x6, 0x80, 0x85, 0x7, 0xc8, 0x48, 0x7f, - 0xf0, 0xb0, 0xff, 0x21, 0xf2, 0x1f, 0xe4, 0x3f, - 0xf9, 0xf5, 0x80, 0x85, 0x7, 0xe5, 0xc0, 0xc3, - 0x41, 0xff, 0xc1, 0x43, 0x30, 0x7f, 0xf0, 0x60, - 0xce, 0x87, 0xfc, 0xa0, 0xeb, 0x83, 0xfd, 0x21, - 0xe7, 0x43, 0xfa, 0x81, 0xf5, 0x87, 0xf3, 0xc1, - 0xf6, 0x1f, 0xe7, 0x83, 0xd0, 0x7f, 0xcf, 0x6, - 0x50, 0x7f, 0xf0, 0x18, 0x36, 0x1f, 0xfc, 0x15, - 0x4, 0x87, 0xff, 0xb, 0xe, 0xfc, 0x1f, 0xc8, - 0x7f, 0x21, 0xff, 0xd5, 0x42, 0xc3, 0xf2, 0x1d, - 0x84, 0x87, 0xec, 0x39, 0xd, 0x7, 0x94, 0x14, - 0x4, 0x27, 0x42, 0xa0, 0x64, 0x10, 0x75, 0xf2, - 0x1a, 0xd, 0xa1, 0xff, 0x48, 0x75, 0x3, 0xfa, - 0x43, 0xe7, 0x90, 0xaf, 0x21, 0xfe, 0x60, 0x90, - 0xff, 0xfa, 0x0, + 0xf, 0xd5, 0x7, 0xff, 0x11, 0x60, 0xff, 0xff, + 0x87, 0xff, 0x5a, 0xc2, 0xe0, 0xff, 0x5a, 0x1c, + 0xf0, 0x7d, 0x21, 0xfc, 0xc1, 0xd2, 0x1f, 0xf2, + 0x83, 0x21, 0xbf, 0x41, 0xa0, 0x90, 0xd8, 0x66, + 0xc, 0x82, 0x9, 0xf, 0x28, 0x2c, 0x3d, 0x87, + 0xd8, 0x48, 0x79, 0xf, 0x90, 0xff, 0xe8, 0xa1, + 0xf9, 0x70, 0x10, 0xb0, 0xfd, 0x58, 0x18, 0x4a, + 0xf, 0xfe, 0xa, 0x1a, 0x43, 0xff, 0x83, 0x6, + 0xa0, 0x7f, 0xf0, 0x14, 0x19, 0xf2, 0x1f, 0xe9, + 0xf, 0x5a, 0x1f, 0xd6, 0x1f, 0x50, 0x3f, 0xdc, + 0x87, 0x38, 0x7f, 0x9b, 0x43, 0xa0, 0xff, 0xe0, + 0x50, 0x32, 0x83, 0xff, 0x80, 0xe1, 0xb0, 0xff, + 0xe1, 0x21, 0x22, 0xe0, 0xfe, 0x83, 0xab, 0x7, + 0xff, 0x1d, 0xf, 0xfe, 0xaa, 0x14, 0x1f, 0x90, + 0xec, 0x32, 0x1f, 0x41, 0x22, 0x1a, 0x43, 0x38, + 0x68, 0x18, 0x6b, 0xf4, 0x19, 0xd, 0x7, 0xff, + 0x6, 0xc, 0xc1, 0xfe, 0x70, 0xf3, 0xc8, 0x75, + 0xc1, 0xfc, 0xd8, 0x5a, 0x1f, 0xff, 0xb5, 0x83, + 0xf0, /* U+0025 "%" */ 0x9, 0xfc, 0x87, 0xff, 0x1f, 0x83, 0x58, 0x7f, 0xf1, 0x70, 0xfd, 0x87, 0xff, 0xd, 0xa, 0xf4, - 0x12, 0x1f, 0xfc, 0x2c, 0xa, 0x2, 0x81, 0x87, - 0xac, 0x3c, 0x82, 0xd, 0x1, 0xf, 0x26, 0x1f, - 0xfc, 0xa8, 0x10, 0x7f, 0xf2, 0x54, 0x4, 0x3f, - 0xf9, 0x30, 0x20, 0xff, 0xe4, 0xa0, 0x50, 0x79, - 0x4, 0x1a, 0x2, 0x14, 0x8, 0x3e, 0xc0, 0xa0, - 0x28, 0x18, 0x20, 0x21, 0xf9, 0x40, 0xbd, 0x1, - 0x40, 0x41, 0x7, 0xf4, 0x87, 0x98, 0x10, 0x10, - 0xff, 0xa8, 0x81, 0xa0, 0x48, 0x20, 0xff, 0xe0, - 0x37, 0xa4, 0x2c, 0x10, 0x7f, 0xf2, 0x50, 0x90, - 0xff, 0xe4, 0xc0, 0x83, 0xff, 0x92, 0x81, 0x40, - 0x7f, 0x21, 0xff, 0xc1, 0x81, 0x3, 0x83, 0x58, - 0x7f, 0xd0, 0x10, 0x41, 0xfa, 0xf, 0xf2, 0x8, - 0x8, 0x2f, 0x40, 0x43, 0xfa, 0x2, 0x8, 0xa, - 0x2, 0x81, 0x7, 0xe4, 0x10, 0x10, 0x41, 0xa0, - 0x21, 0xf6, 0x8, 0x3f, 0xf9, 0x28, 0x48, 0x7f, - 0xf2, 0x60, 0x41, 0xff, 0xc9, 0x42, 0x43, 0xff, - 0x93, 0x3, 0xf, 0xfe, 0x62, 0x1e, 0x41, 0x6, - 0x80, 0x87, 0x6c, 0x1e, 0x80, 0xa0, 0x28, 0x10, - 0x7a, 0xf, 0xc8, 0x2f, 0x40, 0x43, 0xff, 0x89, - 0x7, 0xe8, 0x3f, 0xf8, 0xbc, 0x1a, 0xc0, + 0x12, 0x1f, 0xfc, 0x2c, 0x12, 0x6, 0x6, 0x1e, + 0xb0, 0xf2, 0x4, 0x32, 0x4, 0x3c, 0x98, 0x7f, + 0xf2, 0xb0, 0x41, 0xff, 0xc9, 0x42, 0x43, 0xff, + 0x93, 0x2, 0xf, 0xfe, 0x4a, 0x5, 0x7, 0x90, + 0x41, 0xa0, 0x21, 0x40, 0x83, 0xec, 0xa, 0x2, + 0x81, 0x82, 0x2, 0x1f, 0x94, 0xb, 0xd0, 0x14, + 0x4, 0x10, 0x7f, 0x48, 0x79, 0x81, 0x1, 0xf, + 0xfa, 0x88, 0x1a, 0x4, 0x82, 0xf, 0xfe, 0x3, + 0x7a, 0x42, 0xc1, 0x7, 0xff, 0x25, 0x9, 0xf, + 0xfe, 0x4c, 0x8, 0x3f, 0xf9, 0x28, 0x14, 0x7, + 0xf2, 0x1f, 0xfc, 0x18, 0x10, 0x38, 0x35, 0x87, + 0xfd, 0x1, 0x4, 0x1f, 0xa0, 0xff, 0x20, 0x85, + 0x2, 0xf4, 0x4, 0x3f, 0xa0, 0x20, 0xc0, 0xa0, + 0x28, 0x10, 0x7e, 0x41, 0x1, 0x4, 0x1a, 0x2, + 0x1f, 0x60, 0x83, 0xff, 0x92, 0x84, 0x87, 0xff, + 0x26, 0x4, 0x1f, 0xfc, 0x94, 0x24, 0x3f, 0xf9, + 0x30, 0x30, 0xff, 0xe6, 0x21, 0xe4, 0x10, 0x68, + 0x8, 0x76, 0xc1, 0xec, 0xa, 0x2, 0x81, 0x7, + 0xa0, 0xf9, 0x40, 0xbd, 0x1, 0xf, 0xfe, 0x24, + 0x1f, 0xa0, 0xff, 0xe2, 0xf0, 0x6b, 0x0, /* U+0026 "&" */ 0xf, 0x37, 0xe8, 0x3f, 0xf8, 0x6f, 0x21, 0x9d, 0xf, 0xfe, 0x3, 0x7, 0xf4, 0x87, 0xfd, 0x6, - 0x58, 0x34, 0x1f, 0xe4, 0x35, 0x70, 0x68, 0x3f, - 0xb0, 0x94, 0x12, 0x82, 0x43, 0xf9, 0xb, 0xe, - 0xc3, 0xff, 0xeb, 0x87, 0x41, 0x21, 0xfd, 0x4, - 0x86, 0x83, 0x41, 0xfc, 0x86, 0x41, 0x21, 0x41, - 0xff, 0x21, 0x4e, 0x84, 0xa0, 0xff, 0xa0, 0xd0, - 0x6a, 0x7, 0xff, 0x7, 0xf, 0xa4, 0x3f, 0xf8, - 0x68, 0x76, 0x87, 0xff, 0xe, 0x43, 0xff, 0x93, - 0x21, 0xec, 0x3f, 0xf8, 0x52, 0x14, 0x1a, 0xe, - 0xfc, 0x12, 0x82, 0xd4, 0x12, 0x83, 0xfe, 0x82, - 0x81, 0x6, 0x83, 0xfd, 0x6, 0x42, 0xc3, 0x60, - 0x43, 0xc8, 0x48, 0x74, 0x1a, 0x30, 0x90, 0xf6, - 0x1c, 0xa0, 0x96, 0xb, 0xf, 0x21, 0xe8, 0x34, - 0x19, 0xf, 0x21, 0xf4, 0x1f, 0x21, 0xff, 0xc3, - 0x50, 0x7a, 0x9, 0xa, 0xf, 0xd0, 0x72, 0x1b, - 0xc, 0x87, 0xff, 0x5, 0xc, 0x86, 0x90, 0xe7, - 0xf, 0x61, 0xb0, 0xd7, 0x57, 0x7, 0xe8, 0x34, - 0x1c, 0xb0, 0x74, 0x19, 0xc, 0xe1, 0xfe, 0x76, - 0xd, 0x87, 0x72, 0x1c, 0xf0, 0x14, 0x1a, + 0x58, 0x34, 0x1f, 0xe4, 0x35, 0x6c, 0x34, 0x1f, + 0xd8, 0x4a, 0xc, 0x84, 0x87, 0xf2, 0x16, 0x1d, + 0x7, 0xff, 0x15, 0xf, 0xfe, 0x8a, 0x1f, 0xfc, + 0x54, 0x3b, 0x9, 0xf, 0xe4, 0x28, 0x32, 0x82, + 0x83, 0xfa, 0xc, 0x81, 0x82, 0x43, 0xff, 0x87, + 0xc, 0x13, 0x7, 0xfd, 0x86, 0xe0, 0x98, 0x3f, + 0xf8, 0x30, 0x7c, 0xc1, 0xff, 0xc2, 0x43, 0xd4, + 0xf, 0xfe, 0x1a, 0x1e, 0x43, 0xff, 0x86, 0xc1, + 0xe8, 0x3f, 0xf8, 0x4c, 0x1f, 0x28, 0x3b, 0xf0, + 0x4c, 0x13, 0x86, 0x83, 0xff, 0x81, 0x4, 0xc6, + 0x1b, 0xf, 0xf2, 0x1a, 0xa, 0xd, 0x1, 0xf, + 0x61, 0x21, 0x94, 0x12, 0x8c, 0x24, 0x8, 0x58, + 0x74, 0x1a, 0x10, 0xb0, 0xf2, 0x1e, 0xc3, 0x61, + 0x90, 0xff, 0xe1, 0x21, 0xff, 0xc3, 0x43, 0xe8, + 0x3e, 0x82, 0x42, 0x83, 0xf6, 0x1e, 0x42, 0xc3, + 0x21, 0xff, 0xc6, 0x43, 0x48, 0x73, 0x87, 0xa0, + 0xd8, 0x6b, 0xab, 0x83, 0xe5, 0x6, 0x83, 0x96, + 0xe, 0x43, 0x41, 0x9c, 0x3f, 0xea, 0x83, 0x61, + 0xde, 0x43, 0x9b, 0x45, 0x6, 0x80, /* U+0027 "'" */ 0xf8, 0x3f, 0xfa, 0x40, /* U+0028 "(" */ - 0xf, 0xe4, 0x3f, 0xa8, 0x87, 0xca, 0x30, 0xf3, + 0xf, 0xe4, 0x3f, 0xa8, 0x87, 0xd2, 0x61, 0xe5, 0x3, 0xf, 0x40, 0x50, 0x74, 0x14, 0x1c, 0xa0, - 0x41, 0xe8, 0x24, 0x39, 0xa, 0xf, 0x41, 0x21, - 0xc8, 0x50, 0x7b, 0x9, 0xf, 0x21, 0xfc, 0x85, - 0x7, 0xb0, 0x90, 0xf2, 0x1f, 0xfc, 0x84, 0x24, - 0x3d, 0x87, 0xff, 0xb, 0xf, 0x21, 0xff, 0xe3, - 0x43, 0xff, 0xa8, 0x87, 0xff, 0x41, 0xf, 0xfe, - 0x16, 0x1e, 0xc3, 0xfc, 0x84, 0x87, 0xff, 0x46, - 0x9, 0xf, 0x21, 0x61, 0xfe, 0x43, 0xe8, 0x24, - 0x3c, 0x85, 0x87, 0xc8, 0x10, 0xfa, 0xa, 0xf, - 0x90, 0x21, 0xf4, 0x14, 0x1f, 0x40, 0x50, 0x79, - 0x40, 0x83, 0xe9, 0x4, 0x1f, 0x40, 0xc3, 0xf6, - 0xa0, 0xfe, 0x80, + 0x61, 0xe8, 0x8, 0x79, 0xa, 0xf, 0x41, 0xfc, + 0x85, 0x7, 0xb0, 0x90, 0xf2, 0x1f, 0xc8, 0x50, + 0x7b, 0x9, 0xf, 0x21, 0xff, 0xc8, 0x42, 0x43, + 0xd8, 0x7f, 0xf0, 0xb0, 0xf2, 0x1f, 0xfc, 0xd4, + 0x3f, 0xfe, 0xa8, 0x7f, 0xf1, 0x50, 0xff, 0xe1, + 0x61, 0xec, 0x3f, 0xc8, 0x48, 0x7f, 0xf1, 0x90, + 0xff, 0x61, 0x21, 0xe4, 0x2c, 0x3f, 0xc8, 0x7d, + 0x4, 0x87, 0x90, 0xb0, 0xf9, 0x2, 0x1f, 0x41, + 0x41, 0xf2, 0x4, 0x3e, 0x82, 0x83, 0xe8, 0x8, + 0x7c, 0xa0, 0x61, 0xf4, 0x14, 0x1f, 0x60, 0xc3, + 0xf6, 0x21, 0xfd, 0x80, /* U+0029 ")" */ 0x10, 0xff, 0xa8, 0x1f, 0xd0, 0xc1, 0xfa, 0x2, 0x83, 0xf4, 0x8, 0x3f, 0x28, 0x18, 0x7e, 0x82, - 0x83, 0xf2, 0x4, 0x3f, 0x41, 0x41, 0xf9, 0x2, + 0x43, 0xf2, 0x8, 0x3f, 0x41, 0x41, 0xf9, 0x2, 0x1f, 0xb0, 0x90, 0xf9, 0xa, 0xf, 0xc8, 0x7f, 0xd8, 0x50, 0x7c, 0x84, 0x87, 0xff, 0x21, 0x9, 0xf, 0xfb, 0xf, 0xb0, 0xff, 0xe1, 0xa1, 0xf2, - 0x1f, 0xff, 0xf0, 0xff, 0xf0, 0x21, 0xff, 0xcf, - 0x43, 0xec, 0x2c, 0x3e, 0x42, 0x43, 0xff, 0x94, - 0x87, 0xc8, 0x58, 0x7d, 0x4, 0x87, 0xf9, 0xf, - 0xa0, 0xa0, 0xf9, 0xf, 0xf2, 0x14, 0x1f, 0x40, - 0x50, 0x79, 0xa, 0xf, 0xa0, 0x41, 0xf6, 0x5, - 0x7, 0xa0, 0xa0, 0xfb, 0x6, 0x1f, 0x93, 0xf, - 0xf6, 0x1f, 0xe0, + 0x1f, 0xff, 0xf0, 0xff, 0xf6, 0x21, 0x21, 0xff, + 0xc7, 0xc2, 0xc3, 0xe4, 0x24, 0x3f, 0xf9, 0x48, + 0x7d, 0x5, 0x87, 0xc8, 0x48, 0x7f, 0x90, 0xf9, + 0xa, 0xf, 0xa0, 0x21, 0xf2, 0x14, 0x1f, 0x40, + 0x43, 0xe4, 0x28, 0x3e, 0x81, 0x7, 0xd8, 0x14, + 0x1e, 0x82, 0x83, 0xec, 0x18, 0x7e, 0x4c, 0x3f, + 0xd8, 0x7f, 0x80, /* U+002A "*" */ 0xf, 0xef, 0x83, 0xff, 0xfe, 0x1f, 0xfc, 0x34, @@ -169,9 +170,9 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x7f, 0xff, 0xc3, 0xff, 0xfe, 0x1f, 0xfe, 0x60, /* U+002C "," */ - 0xb, 0xf0, 0x7f, 0xf7, 0xd0, 0x90, 0xb0, 0xb0, - 0x90, 0x90, 0x41, 0x41, 0x20, 0x50, 0x5a, 0xa0, - 0xea, 0x6, + 0xb, 0xf0, 0x7f, 0xf7, 0xd0, 0x90, 0xa0, 0xb0, + 0xf9, 0x6, 0x14, 0x1e, 0x50, 0x5a, 0xa0, 0xea, + 0x6, /* U+002D "-" */ 0xaf, 0xf2, 0xff, 0x83, 0xff, 0x90, @@ -188,8 +189,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xfc, 0x44, 0x8, 0x7f, 0xf0, 0x10, 0xa0, 0xff, 0xe0, 0x61, 0xff, 0xc4, 0x40, 0x87, 0xff, 0x13, 0xf, 0xfe, 0x4, 0x12, 0x1f, 0xfc, 0x4, 0x8, - 0x7f, 0xf1, 0x30, 0xff, 0xe0, 0x41, 0x21, 0xff, - 0xc0, 0x40, 0x87, 0xff, 0x13, 0xf, 0xfe, 0x2, + 0x7f, 0xf1, 0x30, 0xff, 0xe0, 0x21, 0x21, 0xff, + 0xc0, 0x80, 0x87, 0xff, 0x13, 0xf, 0xfe, 0x2, 0x12, 0x1f, 0xfc, 0x8, 0x8, 0x7f, 0xf1, 0x30, 0xff, 0xe0, 0x21, 0x21, 0xff, 0xc0, 0xc3, 0xff, 0x88, 0x82, 0xf, 0xfe, 0x2, 0x12, 0x1f, 0xfc, @@ -199,19 +200,19 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x88, 0x10, 0xff, 0xe0, 0xad, 0x7, 0xff, 0x0, /* U+0030 "0" */ - 0xf, 0x5f, 0xa4, 0x3f, 0xd6, 0x86, 0x6c, 0x3f, - 0x68, 0x7f, 0x61, 0xe8, 0x39, 0x41, 0xd8, 0x65, - 0x4, 0xf4, 0xe0, 0xd0, 0x50, 0x4c, 0x19, 0x41, - 0x21, 0xf4, 0x1e, 0x83, 0x22, 0x1f, 0xfc, 0x4, - 0x2c, 0xc2, 0x43, 0xf6, 0x12, 0x1d, 0x87, 0xff, - 0x9, 0xf, 0xfe, 0x2, 0x1f, 0xfd, 0x4, 0x3f, - 0xff, 0xe1, 0xff, 0xff, 0xf, 0xfe, 0xda, 0x1f, - 0xfd, 0x54, 0x3f, 0xf8, 0x8, 0x7f, 0x61, 0xff, - 0xc0, 0x4c, 0x24, 0x3f, 0x61, 0xc8, 0x64, 0x3e, - 0x42, 0xc3, 0xd0, 0x7a, 0xc, 0x82, 0xd, 0x6, - 0x50, 0x50, 0x4a, 0x9, 0xe9, 0xc1, 0x90, 0xd0, - 0x72, 0x83, 0xb0, 0xf6, 0x87, 0xf6, 0x1f, 0xad, - 0xc, 0xd8, 0x70, + 0xe, 0x6f, 0xd2, 0x1f, 0xee, 0x43, 0x36, 0x1f, + 0xb0, 0xff, 0x61, 0xe8, 0x39, 0x41, 0xd8, 0x65, + 0x4, 0xf4, 0xe0, 0xc8, 0x58, 0x4c, 0x19, 0x41, + 0x41, 0x21, 0x41, 0xe8, 0x3c, 0x87, 0xff, 0x1, + 0x9, 0x30, 0x90, 0xfd, 0x85, 0x87, 0x61, 0xff, + 0xc0, 0x44, 0x3f, 0xf8, 0x8, 0x7f, 0x21, 0xff, + 0xff, 0xf, 0xff, 0xf8, 0x7f, 0xff, 0xc0, 0x87, + 0xff, 0x9, 0xf, 0xfe, 0x2, 0x1f, 0xd8, 0x7f, + 0xf0, 0x13, 0x9, 0xf, 0xd8, 0x58, 0x87, 0xff, + 0x1, 0x9, 0x2, 0x14, 0x1e, 0x83, 0xe8, 0x26, + 0xc, 0xa0, 0xa0, 0xc8, 0x4f, 0x4e, 0xc, 0x86, + 0x83, 0x94, 0x1d, 0x87, 0xb4, 0x3f, 0xb0, 0xfd, + 0x44, 0x33, 0x61, 0xc0, /* U+0031 "1" */ 0xf, 0xeb, 0xf, 0xd6, 0x87, 0x9f, 0x21, 0xe7, @@ -220,89 +221,90 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, 0xf8, /* U+0032 "2" */ - 0xe, 0x6f, 0xe8, 0x3f, 0xea, 0x21, 0xcf, 0x7, - 0xed, 0xf, 0xe7, 0xf, 0x61, 0xcb, 0x7, 0x41, - 0xa0, 0xd7, 0x56, 0x19, 0xc, 0x85, 0x21, 0xd8, - 0x68, 0x8, 0x64, 0x3e, 0x42, 0x41, 0x84, 0x87, - 0xe8, 0x3c, 0x85, 0x87, 0xff, 0x5e, 0xb2, 0x1f, - 0xfc, 0x35, 0xc1, 0xff, 0xd1, 0x82, 0x43, 0xff, - 0x86, 0x85, 0x87, 0xff, 0x9, 0xc, 0x87, 0xff, - 0xa, 0xa, 0xf, 0xfe, 0x14, 0x19, 0xf, 0xfe, - 0x12, 0x16, 0x1f, 0xfc, 0x2c, 0x24, 0x3f, 0xf8, - 0x50, 0x68, 0x3f, 0xf8, 0x2a, 0xb, 0xf, 0xfe, - 0x14, 0x14, 0x1f, 0xfc, 0x2c, 0x25, 0x7, 0xff, - 0x6, 0xd, 0x7, 0xff, 0x5, 0x41, 0x61, 0xff, - 0xc2, 0x82, 0x83, 0xff, 0x85, 0x84, 0xa0, 0xff, - 0xe0, 0xc1, 0xa0, 0xff, 0xe0, 0xa8, 0x2c, 0x3f, - 0xf8, 0x50, 0x50, 0x7f, 0xf0, 0xa0, 0xdd, 0x7f, - 0xf0, 0x44, 0x32, 0xff, 0xf0, 0x83, 0xff, 0xb8, + 0xe, 0x6f, 0xe8, 0x3f, 0xee, 0x43, 0x9e, 0xf, + 0xd8, 0x7f, 0x9c, 0x3d, 0x87, 0x2c, 0x1d, 0x6, + 0x83, 0x5d, 0x58, 0x64, 0x32, 0x14, 0x87, 0x61, + 0xa0, 0x21, 0x90, 0xf9, 0x9, 0x6, 0x12, 0x1f, + 0xa0, 0xf2, 0x16, 0x1f, 0xfc, 0x74, 0x3f, 0xf8, + 0x75, 0x83, 0xff, 0x88, 0xb8, 0x3f, 0xfa, 0x28, + 0x48, 0x7f, 0xf0, 0xe0, 0xa0, 0xff, 0xe1, 0x21, + 0xff, 0xc7, 0x82, 0x83, 0xff, 0x85, 0x6, 0x43, + 0xff, 0x84, 0x85, 0x87, 0xff, 0xb, 0x9, 0xf, + 0xfe, 0x14, 0x1a, 0xf, 0xfe, 0xa, 0x82, 0xc3, + 0xff, 0x85, 0x5, 0x7, 0xff, 0xb, 0x9, 0x41, + 0xff, 0xc1, 0x83, 0x41, 0xff, 0xc1, 0x50, 0x58, + 0x7f, 0xf0, 0xa0, 0xa0, 0xff, 0xe1, 0x61, 0x48, + 0x7f, 0xf0, 0x60, 0x94, 0x1f, 0xfc, 0x15, 0x5, + 0x7, 0xff, 0xa, 0xb, 0xf, 0xfe, 0x14, 0x1a, + 0xbf, 0xf8, 0x42, 0x19, 0x7f, 0xf8, 0x41, 0xff, + 0xdc, /* U+0033 "3" */ - 0xe, 0x6f, 0xd2, 0x1f, 0xcf, 0x21, 0x9b, 0x43, - 0xcc, 0x1f, 0xea, 0x6, 0x60, 0xe5, 0x83, 0x30, - 0x50, 0x6f, 0x55, 0x86, 0x40, 0x86, 0xc3, 0xd8, - 0x68, 0xc2, 0x43, 0xf2, 0x12, 0x21, 0x61, 0xfb, - 0xe, 0x5e, 0xf, 0xc8, 0x75, 0x60, 0xfe, 0x43, - 0xff, 0xb3, 0x5, 0x7, 0xff, 0x6, 0xc, 0x87, - 0xfc, 0xc8, 0x50, 0x7c, 0xfe, 0x90, 0xa4, 0x3f, - 0xf8, 0x9a, 0x1f, 0xfc, 0x5c, 0x3f, 0x97, 0x83, - 0xb4, 0x3f, 0x56, 0xe0, 0xd0, 0x7f, 0xf0, 0x5c, - 0x32, 0x1f, 0xfc, 0x24, 0x2c, 0x3f, 0xf8, 0x58, - 0x48, 0x7f, 0xf0, 0x90, 0xff, 0xe6, 0x56, 0xf, - 0xfe, 0x1a, 0xf0, 0x7f, 0xf3, 0xd0, 0xe4, 0x28, - 0x3f, 0x61, 0x26, 0x19, 0xf, 0x90, 0xb1, 0xd, - 0x21, 0xd8, 0x64, 0x18, 0x6b, 0xa7, 0x83, 0x41, - 0xa0, 0xe5, 0x7, 0x48, 0x67, 0xf, 0xf4, 0x87, - 0xdc, 0x86, 0x6d, 0xc, + 0xe, 0x6f, 0xe4, 0x3f, 0x3c, 0x87, 0x5a, 0x1c, + 0xc1, 0xfe, 0xa0, 0x4c, 0x1c, 0xb0, 0x65, 0x2, + 0xd, 0xea, 0xb0, 0xd0, 0x86, 0xc3, 0xd8, 0x67, + 0x9, 0xf, 0xc8, 0x5a, 0x16, 0x1f, 0xb0, 0x90, + 0xc8, 0x7e, 0x43, 0x7e, 0xf, 0xfe, 0x7a, 0x1f, + 0xfc, 0x5c, 0x24, 0x3f, 0xf8, 0x28, 0x50, 0x7f, + 0xce, 0x12, 0x1f, 0x56, 0xe0, 0x98, 0x3c, 0xbc, + 0x19, 0x83, 0xff, 0x89, 0x87, 0xff, 0x16, 0x81, + 0xf3, 0xfa, 0xc, 0xa0, 0xff, 0x9d, 0xa, 0xf, + 0xfe, 0xc, 0x19, 0xf, 0xfe, 0xa, 0x16, 0x1f, + 0xfc, 0x1c, 0x24, 0x3f, 0xf8, 0x28, 0x65, 0xc1, + 0xff, 0xc2, 0xac, 0x1f, 0xfc, 0x64, 0x3f, 0x21, + 0x90, 0xb0, 0xfd, 0x84, 0xe1, 0x21, 0xf9, 0xa, + 0x43, 0x61, 0xec, 0x3d, 0x6, 0xf5, 0x3c, 0x1b, + 0x3, 0x7, 0x28, 0x3a, 0xc, 0xc1, 0xfe, 0xd0, + 0xe7, 0x90, 0xcd, 0x86, /* U+0034 "4" */ 0xf, 0xfe, 0x5, 0xf8, 0x3f, 0xf8, 0x88, 0x7f, - 0xf1, 0xf0, 0xff, 0xe3, 0xa1, 0xff, 0xc8, 0x83, - 0xff, 0x8e, 0x87, 0xff, 0x22, 0xf, 0xfe, 0x3a, - 0x14, 0x1f, 0xfc, 0x48, 0xa, 0xf, 0xfe, 0x1c, - 0x14, 0x1f, 0xfc, 0x44, 0x8, 0x7f, 0xf1, 0x20, - 0xa0, 0xff, 0xe2, 0x20, 0x43, 0xff, 0x89, 0x5, - 0x7, 0xff, 0x11, 0x2, 0x1f, 0xfc, 0x48, 0x28, - 0x3f, 0xf8, 0x6a, 0x2, 0x1f, 0xfc, 0x48, 0x28, - 0x3f, 0xf8, 0x68, 0x48, 0x7f, 0xf1, 0x20, 0xa0, + 0xf1, 0xe0, 0xff, 0xe4, 0x21, 0xff, 0xc7, 0x83, + 0xff, 0x90, 0x87, 0xff, 0x1f, 0xf, 0xfe, 0x3a, + 0x14, 0x1f, 0xfc, 0x48, 0x24, 0x3f, 0xf8, 0x68, + 0x50, 0x7f, 0xf1, 0x20, 0x90, 0xff, 0xe1, 0xc1, + 0x41, 0xff, 0xc4, 0x42, 0x43, 0xff, 0x87, 0x5, + 0x7, 0xff, 0x11, 0x9, 0xf, 0xfe, 0x1c, 0x16, + 0x1f, 0xfc, 0x44, 0x8, 0x7f, 0xf1, 0x30, 0xa0, 0xff, 0xe1, 0xa1, 0x21, 0xff, 0xc4, 0x82, 0x83, - 0xff, 0x86, 0x86, 0xaf, 0xc1, 0xab, 0x83, 0x2f, - 0xe0, 0xcb, 0x83, 0xff, 0xbd, 0xff, 0xfc, 0x10, - 0xdf, 0x83, 0xff, 0xfe, 0x1f, 0xff, 0xc0, + 0xff, 0x86, 0x84, 0x87, 0xff, 0x12, 0xa, 0xf, + 0xfe, 0x1a, 0x1a, 0xbf, 0x6, 0xae, 0xc, 0xbf, + 0x83, 0x2e, 0xf, 0xfe, 0xf7, 0xff, 0xf0, 0x43, + 0x7e, 0xf, 0xff, 0xf8, 0x7f, 0xff, 0x0, /* U+0035 "5" */ - 0xa, 0xff, 0xfe, 0x12, 0x19, 0xf, 0xfe, 0xfa, - 0xff, 0xf0, 0x3, 0xf5, 0x7f, 0xc1, 0xf9, 0xf, - 0xfe, 0xba, 0x1f, 0xfc, 0xbc, 0x3f, 0xf8, 0x78, - 0x7f, 0xf2, 0xd0, 0xff, 0xe4, 0xaa, 0x50, 0x7f, - 0x21, 0x5d, 0x1a, 0x70, 0x7f, 0xc8, 0x7c, 0xe1, - 0xff, 0xc8, 0xc3, 0xfd, 0x7d, 0x7, 0x41, 0xa4, - 0x1a, 0x13, 0x86, 0x43, 0x37, 0x83, 0xe8, 0x32, - 0x1f, 0xfc, 0x24, 0x36, 0x1f, 0xfc, 0x38, 0x24, - 0x3f, 0xf8, 0x68, 0x7f, 0xfd, 0x97, 0x7, 0xff, - 0x12, 0xb0, 0x7f, 0x21, 0xff, 0xc7, 0xc3, 0xc8, - 0x50, 0x7e, 0x42, 0x41, 0x84, 0x87, 0xd0, 0x68, - 0x8, 0x6c, 0x39, 0x41, 0x21, 0xb0, 0xdd, 0x5c, - 0x1a, 0xe, 0x83, 0x2c, 0x1d, 0x7, 0x9c, 0x3f, - 0xda, 0x1f, 0xb9, 0xc, 0xd8, 0x70, + 0xa, 0xff, 0xfe, 0x10, 0x72, 0x1f, 0xfd, 0xf5, + 0xff, 0x83, 0xfa, 0xbf, 0xe0, 0xfc, 0x87, 0xff, + 0x5d, 0xf, 0xfe, 0x5e, 0x1f, 0xfc, 0x3c, 0x3f, + 0xf9, 0x68, 0x7f, 0xf2, 0x55, 0x44, 0x3f, 0x90, + 0xae, 0x8a, 0xb8, 0x3f, 0xe4, 0x3e, 0x70, 0xff, + 0xe4, 0x61, 0xfe, 0xbe, 0x83, 0x90, 0xd2, 0xd, + 0x9, 0xc3, 0x41, 0x9b, 0xc1, 0xf6, 0x19, 0xf, + 0xfe, 0x1a, 0x16, 0x1f, 0xfc, 0x3c, 0x24, 0x3f, + 0xf8, 0x68, 0x7f, 0xfd, 0x97, 0x7, 0xff, 0x12, + 0xb0, 0x7f, 0x21, 0xff, 0xc7, 0xc3, 0xc8, 0x50, + 0x7e, 0x42, 0x41, 0x84, 0x87, 0xd0, 0x68, 0x8, + 0x6c, 0x39, 0x41, 0x21, 0xb0, 0xde, 0xa7, 0x6, + 0x83, 0xa0, 0xe5, 0x7, 0x41, 0xe6, 0xf, 0xf6, + 0x87, 0xcf, 0x21, 0x9b, 0xe, /* U+0036 "6" */ - 0xf, 0xe6, 0xf8, 0x3f, 0xf8, 0x1e, 0x90, 0xff, - 0xe0, 0xd8, 0x7f, 0xf1, 0x24, 0x3c, 0xa0, 0xfd, - 0x21, 0xaf, 0x50, 0x3f, 0x21, 0x5a, 0x1f, 0xf4, - 0x14, 0x87, 0xff, 0x5, 0x9, 0xf, 0xfe, 0xc, - 0x14, 0x1f, 0xfc, 0x24, 0x24, 0x3f, 0xf8, 0xa8, - 0x7f, 0xf0, 0x90, 0xb0, 0x5f, 0xa0, 0xf6, 0x19, - 0xd0, 0xce, 0x87, 0xee, 0xf, 0xd2, 0x1f, 0x21, - 0x28, 0x3a, 0x9, 0xe, 0x7a, 0x78, 0x34, 0x1f, - 0x30, 0x74, 0x12, 0x1f, 0x41, 0xe4, 0x32, 0x1c, - 0x87, 0xe8, 0x2c, 0x3a, 0xf, 0xc8, 0x48, 0x7f, - 0xf7, 0xd0, 0xff, 0xea, 0xa1, 0x61, 0xff, 0xc2, - 0xc3, 0xff, 0x8c, 0x84, 0x87, 0xe4, 0x24, 0x3d, - 0x7, 0xd0, 0x58, 0x10, 0x90, 0xf2, 0x19, 0x4, - 0x1b, 0xc, 0xc1, 0x21, 0xa0, 0xdd, 0x38, 0x34, - 0x19, 0x41, 0x94, 0x1d, 0x87, 0xa8, 0x1f, 0xd8, - 0x7e, 0x74, 0x33, 0x61, 0xc0, + 0xf, 0xea, 0x7c, 0x1f, 0xf3, 0xe5, 0x7, 0xff, + 0x6, 0x81, 0xff, 0xc4, 0x90, 0xe5, 0x83, 0xf4, + 0x86, 0xba, 0x83, 0xf2, 0x13, 0xa1, 0xff, 0x61, + 0x30, 0x7f, 0xf1, 0x60, 0xff, 0xe0, 0xc1, 0x21, + 0xff, 0xc2, 0x42, 0x83, 0xff, 0xa8, 0x84, 0x82, + 0xfd, 0x7, 0xb0, 0xb7, 0x43, 0x3a, 0x1f, 0xa8, + 0x1f, 0xa4, 0x24, 0x3e, 0x50, 0x74, 0x1f, 0xcf, + 0x4e, 0xd, 0x7, 0xcc, 0x19, 0x82, 0x43, 0xe8, + 0x3c, 0x86, 0x83, 0xa0, 0xfc, 0x84, 0x87, 0x21, + 0xfb, 0xf, 0xfe, 0x32, 0x1f, 0xfe, 0x34, 0x3f, + 0xf8, 0x48, 0x7f, 0xf2, 0xb0, 0xfc, 0x87, 0x61, + 0x21, 0xfb, 0x9, 0x10, 0xc8, 0x7c, 0x85, 0x81, + 0xa, 0xf, 0x21, 0x90, 0x41, 0xb0, 0xcc, 0x12, + 0x1a, 0xd, 0xd3, 0x83, 0x41, 0x94, 0x19, 0x41, + 0xd8, 0x7a, 0x81, 0xfd, 0x87, 0xe7, 0x43, 0x36, + 0x1c, /* U+0037 "7" */ 0xff, 0xfe, 0x40, 0x7f, 0xf7, 0x17, 0xff, 0x86, @@ -323,39 +325,39 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0038 "8" */ 0xf, 0x5f, 0xd0, 0x7f, 0xad, 0xe, 0x78, 0x3e, - 0xd0, 0xfe, 0x60, 0xec, 0x39, 0x60, 0xcc, 0x12, - 0x19, 0xea, 0xc3, 0x21, 0x61, 0xa0, 0xec, 0x34, - 0x4, 0x28, 0x3e, 0x42, 0x43, 0xc8, 0x7d, 0x87, - 0xff, 0x19, 0xf, 0xfe, 0x32, 0x1f, 0xfd, 0x18, - 0x3e, 0x82, 0x81, 0x4, 0x87, 0x90, 0xc8, 0x14, - 0x16, 0x85, 0x40, 0xa0, 0xd2, 0x15, 0xf2, 0x14, - 0x87, 0x48, 0x7f, 0x68, 0x79, 0x41, 0xfd, 0x7, - 0x98, 0x32, 0x83, 0x38, 0x66, 0xa, 0xe9, 0xc1, - 0xa0, 0xa0, 0xa4, 0x33, 0x4, 0x81, 0xc, 0x87, - 0x94, 0x14, 0x61, 0x21, 0xfb, 0x9, 0x10, 0xb0, - 0xfc, 0x87, 0xf2, 0x1f, 0xfd, 0x94, 0x3f, 0xf9, - 0xe8, 0x72, 0x14, 0x1f, 0xb0, 0xec, 0x32, 0x1f, - 0x21, 0x42, 0x1a, 0x43, 0xb0, 0xc8, 0x30, 0xd7, - 0x4f, 0x6, 0x83, 0x41, 0xca, 0xe, 0x50, 0x67, - 0xf, 0xf5, 0x3, 0xee, 0x43, 0x36, 0x86, + 0xd0, 0xfe, 0x60, 0xe8, 0x39, 0x60, 0xcc, 0x12, + 0x82, 0x7a, 0xb0, 0xc8, 0x58, 0x68, 0x3b, 0xd, + 0x1, 0xa, 0xf, 0x90, 0x90, 0xf2, 0x1f, 0x61, + 0xff, 0xc6, 0x43, 0xff, 0xb2, 0x87, 0x90, 0x90, + 0xfb, 0x9, 0x6, 0x14, 0x1f, 0x21, 0x40, 0x50, + 0x58, 0x67, 0x9, 0xd, 0x6, 0xfd, 0x4, 0xc1, + 0xda, 0x1f, 0xd4, 0xf, 0x28, 0x3f, 0xf8, 0x8c, + 0x19, 0x41, 0xa8, 0x19, 0x82, 0xba, 0x70, 0x4a, + 0xa, 0xa, 0x43, 0x30, 0x50, 0x10, 0xc8, 0x79, + 0xc, 0x98, 0x48, 0x7e, 0x82, 0x84, 0x2c, 0x3f, + 0x21, 0xfc, 0x87, 0xff, 0xb1, 0xf, 0xc8, 0x72, + 0x16, 0x1f, 0xb0, 0xec, 0x25, 0x7, 0xc8, 0x50, + 0x86, 0x90, 0xec, 0x32, 0xc, 0x35, 0xd3, 0xc1, + 0xa0, 0xd0, 0x72, 0x83, 0x94, 0x19, 0x83, 0xfd, + 0x40, 0xf3, 0xc8, 0x66, 0xd0, 0xc0, /* U+0039 "9" */ 0xe, 0x6f, 0xd2, 0x1f, 0xee, 0x43, 0x34, 0xf, 0xd8, 0x7f, 0x38, 0x7b, 0xe, 0x50, 0x74, 0x19, - 0xc, 0xf4, 0xc3, 0x28, 0x28, 0x26, 0xd, 0x86, - 0xc3, 0xe8, 0x3d, 0x4, 0x82, 0x9, 0xf, 0x90, - 0xc8, 0x76, 0x1f, 0x90, 0xb1, 0xf, 0xfe, 0x6, - 0x12, 0x1c, 0x87, 0xe4, 0x3f, 0xfa, 0x8, 0x7f, - 0xf5, 0x50, 0xb0, 0xff, 0xe1, 0x61, 0x21, 0xf9, - 0xe, 0x43, 0x21, 0xf4, 0x1f, 0xe8, 0x3d, 0x87, - 0xd0, 0x6d, 0x3, 0x87, 0xe5, 0x6, 0xbd, 0x7, - 0xfa, 0xf, 0xf6, 0x1f, 0xb4, 0x3c, 0xe1, 0xfe, - 0xb9, 0x57, 0x8, 0x48, 0x7c, 0xd1, 0xf, 0xb0, - 0xff, 0xe1, 0x61, 0x21, 0xff, 0xc2, 0x43, 0xff, - 0x8b, 0x4, 0x87, 0xff, 0x9, 0xa, 0xf, 0xfe, - 0xe, 0x12, 0x1f, 0xfc, 0xb, 0xd, 0x7, 0xcd, - 0x3c, 0x86, 0xc3, 0xf4, 0xa0, 0xf6, 0x1f, 0xfc, - 0x47, 0xf, 0xfe, 0x13, 0x70, 0x7c, + 0xd, 0x74, 0xd0, 0x90, 0xd0, 0x4a, 0xd, 0x6, + 0x80, 0x86, 0x83, 0xd0, 0x48, 0x30, 0x90, 0xf9, + 0xc, 0x88, 0x58, 0x7e, 0x42, 0xc3, 0xff, 0x85, + 0x84, 0x87, 0x21, 0xf9, 0xf, 0xff, 0x1a, 0x1f, + 0xfc, 0x24, 0x2c, 0x3f, 0xf8, 0xc8, 0x7e, 0x43, + 0xa0, 0xc8, 0x7d, 0x7, 0xfa, 0xf, 0x61, 0xf4, + 0x1b, 0x40, 0xe1, 0xf9, 0xe, 0xbd, 0x7, 0xfb, + 0xf, 0xf6, 0x1f, 0xb4, 0x3c, 0xe1, 0xfe, 0xb9, + 0x57, 0x8, 0x48, 0x7c, 0xd1, 0xf, 0xb0, 0xff, + 0xe1, 0x41, 0x21, 0xff, 0xd4, 0x82, 0x43, 0xff, + 0x82, 0xa0, 0xa0, 0xff, 0xe0, 0x30, 0x48, 0x7f, + 0xf0, 0x28, 0x1a, 0xf, 0x9a, 0x79, 0xd, 0x87, + 0xe9, 0x41, 0xec, 0x3f, 0xf8, 0x96, 0x1f, 0xfc, + 0x26, 0xd0, 0xf8, /* U+003A ":" */ 0x3e, 0x30, 0xb0, 0xff, 0x61, 0x67, 0xc1, 0xff, @@ -365,7 +367,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xb, 0xe0, 0xb0, 0xb0, 0xff, 0xe2, 0x61, 0x61, 0x7c, 0x1f, 0xff, 0xf0, 0xff, 0xe7, 0xd6, 0x9, 0x70, 0x7f, 0xf2, 0xd0, 0xff, 0x20, 0x82, 0xc3, - 0xc9, 0x85, 0x8, 0x64, 0x50, 0x30, 0xaf, 0x4, + 0xc9, 0x5, 0xa, 0x9, 0x14, 0xc, 0x2b, 0xc1, + 0x0, /* U+003C "<" */ 0xf, 0xfe, 0x1c, 0x1f, 0xfc, 0x1b, 0x43, 0xfe, @@ -375,7 +378,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x83, 0xfe, 0x78, 0x3f, 0xf8, 0x2c, 0x1f, 0xe4, 0x33, 0xc1, 0xfa, 0x81, 0xcf, 0x7, 0xcf, 0x7, 0x3c, 0x1f, 0x3a, 0x1c, 0xf0, 0x7d, 0x68, 0x73, - 0xa1, 0xf5, 0xa1, 0xd0, 0x7f, 0x50, 0x3f, 0xf8, + 0xc1, 0xf5, 0xa1, 0xc8, 0x7f, 0x50, 0x3f, 0xf8, 0x6f, 0x7, 0xff, 0xd, 0xd0, 0xff, 0xe1, 0xd8, /* U+003D "=" */ @@ -389,100 +392,98 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x1d, 0x68, 0x7c, 0xda, 0x1d, 0x68, 0x7e, 0xb4, 0x3a, 0xd0, 0xfd, 0x68, 0x75, 0xa1, 0xfa, 0xd0, 0xe8, 0x3f, 0xd6, 0x87, 0xff, 0xe, 0x43, 0xff, - 0x80, 0xda, 0x19, 0xf, 0x3c, 0x86, 0x78, 0x33, + 0x80, 0xf9, 0xc, 0x87, 0x9e, 0xe, 0x78, 0x33, 0xc1, 0xea, 0x6, 0x78, 0x3d, 0x68, 0x4f, 0x7, 0xad, 0xe, 0x83, 0xd6, 0x87, 0xff, 0x2, 0xd0, 0xff, 0xe0, 0x3a, 0x1f, 0xfc, 0x7, 0x83, 0xff, 0x83, 0xc1, 0xff, 0xc3, /* U+003F "?" */ - 0xe, 0xbf, 0x48, 0x7e, 0xb4, 0x33, 0x61, 0xed, - 0xf, 0xed, 0xa, 0xe, 0x50, 0x74, 0x5, 0x4, - 0xf4, 0xe0, 0xc9, 0x86, 0x83, 0x28, 0x28, 0x42, - 0x83, 0xd8, 0x7f, 0x21, 0xe4, 0x3b, 0xf0, 0x7f, - 0xfb, 0xa0, 0xff, 0xe2, 0x21, 0x41, 0xff, 0x41, - 0x90, 0xff, 0x28, 0x28, 0x3f, 0xe8, 0x25, 0x7, - 0xfb, 0xd, 0x7, 0xfa, 0xd, 0x7, 0xfc, 0x84, - 0xa0, 0xff, 0x41, 0xa0, 0xff, 0x90, 0x90, 0xff, - 0xe2, 0x61, 0xff, 0xc4, 0x43, 0xff, 0xa3, 0xf8, - 0x3f, 0xff, 0xe1, 0xe7, 0xc1, 0xff, 0xc2, 0x81, - 0x87, 0xff, 0x8e, 0x6, 0x1f, 0x0, + 0xc, 0xdf, 0xa4, 0x3f, 0x51, 0xc, 0xd8, 0x7b, + 0x43, 0xfb, 0xd, 0x7, 0x28, 0x3b, 0x2, 0x82, + 0x7a, 0x70, 0x64, 0xc3, 0x41, 0x94, 0x14, 0x21, + 0x41, 0xec, 0x3f, 0x90, 0xf2, 0x1d, 0xf8, 0x3f, + 0xfd, 0xd0, 0x7f, 0xf1, 0x10, 0xa0, 0xff, 0xa0, + 0xc8, 0x7f, 0x94, 0x14, 0x1f, 0xf4, 0x19, 0xf, + 0xf6, 0x1b, 0xf, 0xf4, 0x1a, 0xf, 0xf9, 0x9, + 0x41, 0xfe, 0x83, 0x41, 0xff, 0x21, 0x41, 0xff, + 0xc4, 0x43, 0xff, 0xc5, 0xf8, 0x3f, 0xff, 0xe1, + 0xe7, 0xc8, 0x7f, 0xf0, 0x60, 0x41, 0xff, 0xe3, + 0x81, 0x7, 0xc0, /* U+0040 "@" */ 0xf, 0xfe, 0x3, 0x7f, 0x50, 0x3f, 0xf9, 0x37, 0x21, 0xca, 0xf2, 0x1f, 0xfc, 0x47, 0x43, 0xff, 0x81, 0x40, 0xff, 0xe1, 0x50, 0x39, 0x78, 0x39, - 0xc3, 0xff, 0x81, 0x21, 0x3e, 0xae, 0xf2, 0x1b, - 0xf, 0xf4, 0x81, 0xe0, 0xfe, 0xb4, 0x28, 0x3f, - 0x28, 0xc, 0x1f, 0xfc, 0x1a, 0x1, 0x41, 0xf4, - 0x6, 0xf, 0xfe, 0x1a, 0x81, 0x7, 0xa0, 0xa0, - 0xff, 0xe2, 0xc1, 0x21, 0xc8, 0x30, 0xff, 0xe3, - 0xc0, 0x83, 0x40, 0x43, 0xfa, 0xfa, 0x43, 0x90, - 0x90, 0x90, 0x41, 0xfb, 0x42, 0x68, 0x1d, 0x3, - 0x2, 0x4, 0x3f, 0x61, 0xf3, 0x6, 0x40, 0x82, - 0x6, 0x1f, 0x61, 0x94, 0x12, 0x1f, 0xfc, 0x14, - 0x3d, 0x5, 0x74, 0xc3, 0xf2, 0x5, 0x7, 0xf9, - 0x4, 0x87, 0xff, 0x3, 0x6, 0x12, 0x1e, 0x82, - 0x43, 0x21, 0xf9, 0xb, 0x6, 0x1e, 0x41, 0x7, - 0xe4, 0x3f, 0x28, 0x8, 0x7f, 0x21, 0xff, 0xcf, - 0x40, 0x87, 0xb0, 0xff, 0xe4, 0xe1, 0xff, 0xc0, - 0xc3, 0xff, 0x8c, 0x83, 0xf, 0xfe, 0x9a, 0x1e, - 0x43, 0xff, 0xac, 0x87, 0xff, 0xf1, 0xf, 0xfe, - 0x2, 0x1f, 0xfc, 0x34, 0x1a, 0x4, 0x3f, 0xf8, - 0x50, 0x7f, 0x60, 0x42, 0xc3, 0xf4, 0x1c, 0x87, - 0xf2, 0x16, 0x1f, 0x90, 0x90, 0xb0, 0xc8, 0x68, - 0x10, 0x81, 0xe, 0xc2, 0xab, 0x2, 0x8, 0x29, - 0x2, 0x1f, 0xe4, 0x32, 0x81, 0x40, 0xbe, 0x41, - 0x84, 0x82, 0xe, 0xc3, 0xca, 0x20, 0xfa, 0xd, - 0x81, 0xf, 0x68, 0x54, 0x3, 0x6, 0x74, 0x32, - 0x12, 0x1e, 0xbe, 0x43, 0x3f, 0xa0, 0xf9, 0x4, - 0x1f, 0xfd, 0x8, 0x28, 0x3f, 0xfa, 0x8, 0x14, - 0x1f, 0xfc, 0xf8, 0x29, 0xf, 0xfe, 0x7c, 0x15, - 0x3, 0xfe, 0x43, 0xff, 0x84, 0xc1, 0x3c, 0x87, - 0x37, 0x40, 0xff, 0xe1, 0x30, 0x66, 0xfe, 0x90, - 0x21, 0xff, 0xc3, 0x74, 0x3f, 0xf8, 0x30, 0x7f, - 0xf1, 0x6d, 0xf, 0xe7, 0x43, 0xff, 0x8f, 0x7a, - 0xbb, 0xd0, 0x7f, 0xc0, + 0xc3, 0xff, 0x81, 0x21, 0x3e, 0xae, 0xf4, 0x1b, + 0xf, 0xf4, 0x85, 0xc1, 0xfc, 0xe8, 0x58, 0x7e, + 0x50, 0x1c, 0x3f, 0xf8, 0x34, 0x9, 0xf, 0xa0, + 0x30, 0x7f, 0xf0, 0xd4, 0x8, 0x3d, 0x5, 0x7, + 0xff, 0x16, 0xa, 0xe, 0x41, 0x7, 0xff, 0x1f, + 0x2, 0x1a, 0x2, 0x83, 0xe7, 0xf4, 0x1f, 0x20, + 0x42, 0x41, 0x7, 0xd4, 0xc, 0xe8, 0x76, 0xc, + 0x8, 0x7f, 0xa4, 0x3e, 0x90, 0xc8, 0x10, 0x60, + 0x83, 0xca, 0x9, 0x60, 0xb0, 0xff, 0x20, 0x43, + 0xd0, 0x5d, 0x48, 0x7e, 0x40, 0x87, 0xfa, 0xb, + 0xf, 0xfe, 0xe, 0x12, 0x4, 0x3c, 0x81, 0xe, + 0x41, 0x87, 0xef, 0x3, 0xe, 0x42, 0x83, 0xff, + 0x84, 0x84, 0x87, 0xec, 0x3f, 0xf9, 0xa8, 0x72, + 0x4, 0x3f, 0x90, 0xfc, 0x87, 0xff, 0x3, 0xf, + 0xfe, 0x7a, 0x12, 0x1f, 0xfd, 0x94, 0x3f, 0xf9, + 0x38, 0x7f, 0xfa, 0x90, 0xff, 0xe3, 0x60, 0x43, + 0xc8, 0x30, 0xff, 0xe8, 0x60, 0x50, 0x10, 0xff, + 0xe1, 0x21, 0xfc, 0x87, 0xfd, 0x84, 0x86, 0x82, + 0x43, 0x90, 0x26, 0xc, 0x32, 0x14, 0x12, 0x83, + 0xfa, 0x4, 0x19, 0xf, 0xee, 0xa1, 0xa, 0xb, + 0x2, 0x4, 0x3f, 0x41, 0x94, 0x9, 0x3, 0xf0, + 0x50, 0x79, 0xc, 0xa0, 0xf6, 0x41, 0xfb, 0xc, + 0x83, 0xe, 0xa0, 0x4e, 0x16, 0x86, 0xb0, 0xe8, + 0x8, 0x79, 0xfa, 0xe, 0xbf, 0x21, 0xfe, 0x83, + 0xff, 0xa1, 0x1, 0x41, 0xff, 0xcf, 0x42, 0x83, + 0xff, 0xa1, 0x85, 0xa1, 0xff, 0xcf, 0x82, 0xa0, + 0x7f, 0xd0, 0x7f, 0xf0, 0x94, 0x13, 0xc8, 0x65, + 0x5a, 0x1f, 0xfc, 0x39, 0xc, 0xdf, 0xa8, 0x81, + 0xf, 0xfe, 0x1d, 0x3, 0xff, 0x84, 0x87, 0xff, + 0x11, 0xe4, 0x3f, 0xac, 0x3f, 0xf8, 0xed, 0xd7, + 0xbc, 0x87, 0xfc, /* U+0041 "A" */ - 0xf, 0xfb, 0xf0, 0x7f, 0xf2, 0x50, 0xff, 0xe6, - 0xc1, 0xa0, 0xff, 0xe6, 0xa1, 0xff, 0xc7, 0x43, - 0xff, 0x9b, 0x7, 0x90, 0xff, 0xe4, 0xa1, 0x41, - 0xff, 0xc5, 0x42, 0xd0, 0xff, 0xe4, 0x61, 0x38, - 0x48, 0x7f, 0xf1, 0x10, 0xc8, 0x50, 0x7f, 0xf0, - 0xd0, 0x90, 0xff, 0xe4, 0xe1, 0x40, 0x82, 0x43, - 0xff, 0x84, 0x87, 0x90, 0xb0, 0xff, 0xe0, 0xa1, - 0x21, 0xf2, 0x1f, 0xfc, 0x1c, 0x2c, 0x32, 0x12, - 0x1f, 0xfc, 0x4, 0x24, 0x36, 0x16, 0x1f, 0xf2, - 0x12, 0x1c, 0x84, 0x87, 0xfd, 0x85, 0x87, 0x90, - 0x90, 0xff, 0x21, 0x21, 0xec, 0x2c, 0x3f, 0x90, - 0xff, 0x90, 0x90, 0xfe, 0xc2, 0x83, 0xff, 0x80, - 0x87, 0xe4, 0x2e, 0xbf, 0x6, 0xc3, 0xe4, 0x32, - 0xff, 0x6, 0x43, 0xec, 0x3f, 0xf8, 0xc8, 0x79, - 0xf, 0xfe, 0x36, 0x1f, 0xef, 0xff, 0xe0, 0x4, - 0x87, 0x41, 0x21, 0xff, 0xc4, 0x43, 0x21, 0x61, - 0xff, 0xc0, 0x42, 0xc3, 0xf2, 0x1f, 0xfc, 0xc, - 0x24, 0x28, 0x3f, 0xf8, 0xa8, 0x7c, 0x85, 0x7, - 0xff, 0x9, 0xa, 0xf, 0x21, 0xff, 0xc2, 0xc2, - 0x48, 0x3f, 0xf8, 0xe8, 0x72, 0x12, 0x1f, 0xfc, - 0x88, + 0xf, 0xfb, 0xf0, 0x7f, 0xf2, 0x50, 0xc8, 0x7f, + 0xf2, 0x30, 0xd8, 0x7f, 0xf2, 0x10, 0xc8, 0x7f, + 0xf3, 0x90, 0xff, 0xe3, 0x41, 0xec, 0x3f, 0xf8, + 0xc8, 0x79, 0xf, 0xfe, 0x4a, 0x83, 0xff, 0x91, + 0x5, 0xe0, 0xa0, 0xff, 0xe2, 0x21, 0x28, 0x24, + 0x3f, 0xf8, 0xe8, 0x10, 0xff, 0xe3, 0x41, 0x60, + 0xc2, 0x43, 0xff, 0x84, 0x84, 0x81, 0xa, 0xf, + 0xfe, 0xda, 0x12, 0x19, 0x9, 0xf, 0xfe, 0x4, + 0x14, 0x1b, 0xb, 0xf, 0xfe, 0x4a, 0x12, 0x1f, + 0xf2, 0x12, 0x1e, 0x42, 0x43, 0xfd, 0x5, 0x87, + 0xb0, 0xb0, 0xff, 0xe1, 0x21, 0xe4, 0x24, 0x3f, + 0x90, 0x90, 0xff, 0xe4, 0xc1, 0x35, 0xf8, 0x34, + 0x1f, 0xfc, 0x15, 0xfc, 0x19, 0xf, 0x90, 0xff, + 0xe6, 0xe1, 0xff, 0xc6, 0x43, 0xc8, 0x5f, 0xff, + 0x41, 0x41, 0xc8, 0x7f, 0xf0, 0xd0, 0xfe, 0xc2, + 0x43, 0xff, 0x88, 0x86, 0x42, 0xc3, 0xff, 0x80, + 0x85, 0x84, 0x86, 0x43, 0xff, 0x81, 0x84, 0x85, + 0x84, 0x87, 0xff, 0x5, 0xc, 0x81, 0xb, 0xf, + 0xfe, 0x12, 0x16, 0x21, 0x90, 0xff, 0xe1, 0x61, + 0x26, 0x12, 0x1f, 0xfc, 0x34, 0x32, /* U+0042 "B" */ - 0xff, 0xfe, 0x4, 0x87, 0xff, 0x19, 0xb8, 0x3f, - 0xf8, 0xee, 0x1f, 0x2f, 0xc1, 0xe8, 0x3d, 0x5f, - 0x78, 0x32, 0x1f, 0xfc, 0x3c, 0x34, 0x1f, 0xfc, - 0x34, 0x24, 0x3f, 0xf8, 0x78, 0x7f, 0xf1, 0xd0, - 0xff, 0xe3, 0xa1, 0xff, 0xdb, 0xc2, 0x43, 0xff, - 0x84, 0xa0, 0xa0, 0xff, 0xe0, 0xb0, 0x48, 0x7a, - 0xbe, 0xe0, 0x98, 0x3c, 0xbf, 0x6, 0xa0, 0x7f, - 0xf1, 0xb0, 0xff, 0xe3, 0xba, 0x1e, 0xff, 0xd2, - 0x14, 0x87, 0xff, 0x5, 0x90, 0xa0, 0xff, 0xe1, - 0xc1, 0x90, 0xff, 0xe1, 0xa1, 0x61, 0xff, 0xc3, - 0xc2, 0x43, 0xff, 0x86, 0x87, 0xff, 0x6d, 0xf, - 0xfe, 0x3e, 0x1f, 0xfc, 0x74, 0x24, 0x3f, 0xf8, - 0x48, 0x6c, 0x3f, 0xf8, 0x34, 0xc, 0x86, 0xaf, - 0xda, 0x1b, 0xe, 0x5f, 0xc1, 0xd0, 0x7f, 0xf1, - 0xb4, 0x3f, 0xf8, 0x6d, 0x86, + 0xff, 0xfe, 0x5, 0x3, 0xff, 0x8c, 0xae, 0xf, + 0xfe, 0x3b, 0x87, 0xcb, 0xf0, 0x7a, 0xf, 0x57, + 0xde, 0x42, 0x43, 0xff, 0x87, 0x6, 0x83, 0xff, + 0x87, 0x4, 0x87, 0xff, 0x5d, 0xf, 0xfe, 0xda, + 0x1f, 0xfc, 0x7c, 0x24, 0x3f, 0xf8, 0x68, 0x50, + 0x7f, 0xf0, 0x5c, 0x24, 0x3d, 0x5f, 0x70, 0x4c, + 0x1e, 0x5f, 0x83, 0x50, 0x3f, 0xf8, 0xd8, 0x7f, + 0xf1, 0xdd, 0xf, 0x7f, 0xe9, 0xa, 0x43, 0xff, + 0x82, 0xc8, 0x50, 0x7f, 0xf0, 0xe0, 0xc8, 0x7f, + 0xf0, 0xd0, 0xb0, 0xff, 0xe1, 0xe1, 0x21, 0xff, + 0xc3, 0x43, 0xff, 0xb6, 0x87, 0xff, 0x6e, 0x9, + 0xf, 0xfe, 0x12, 0x1b, 0xf, 0xfe, 0xb, 0x6, + 0x43, 0x57, 0xee, 0xd, 0x87, 0x2f, 0xe0, 0xe8, + 0x3f, 0xf8, 0xda, 0x1f, 0xfc, 0x36, 0xc3, 0x0, /* U+0043 "C" */ 0xf, 0x9b, 0xfa, 0x43, 0xfe, 0x79, 0xe, 0x6e, @@ -490,40 +491,40 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x7b, 0xc, 0xa0, 0xde, 0xab, 0xc8, 0x64, 0x28, 0x27, 0xf, 0xa4, 0x28, 0x10, 0x68, 0x3f, 0xa0, 0xc8, 0x85, 0x7, 0xfc, 0x85, 0xa1, 0x90, 0xff, - 0xb0, 0x9c, 0x24, 0x3f, 0xfa, 0xc8, 0x64, 0x2c, - 0x3f, 0xf8, 0x3f, 0x83, 0xff, 0x9c, 0x87, 0xff, - 0xfc, 0x3f, 0xff, 0xe1, 0xff, 0xcd, 0x43, 0xff, - 0xb6, 0x85, 0x87, 0xff, 0x7, 0xf0, 0x7f, 0xf1, - 0x50, 0xd8, 0x48, 0x7f, 0xf1, 0x50, 0xc8, 0x7f, - 0xd8, 0x48, 0x85, 0x7, 0xfc, 0x85, 0x90, 0x68, - 0x3f, 0xa0, 0xc8, 0x20, 0x98, 0x3e, 0x90, 0xa0, - 0x94, 0x13, 0xea, 0xbc, 0x84, 0xa0, 0xd2, 0x1c, - 0xb0, 0x73, 0x7, 0xa8, 0x1f, 0xf5, 0x3, 0xf3, - 0xc8, 0x73, 0x68, 0x60, + 0xb0, 0x9c, 0x24, 0x3f, 0xf8, 0x8, 0x7e, 0xc3, + 0xff, 0x8a, 0x87, 0xff, 0x17, 0xf0, 0x64, 0x3f, + 0xff, 0xe1, 0xff, 0xff, 0xf, 0xff, 0xca, 0x1f, + 0xfc, 0x54, 0x3f, 0xf8, 0xbf, 0x83, 0x61, 0xff, + 0xc5, 0xc2, 0x43, 0xff, 0x80, 0x86, 0x43, 0x21, + 0xff, 0x61, 0x22, 0x14, 0x1f, 0xf2, 0x16, 0x41, + 0xa0, 0xfe, 0x83, 0x20, 0x42, 0x60, 0xfa, 0x42, + 0x82, 0x90, 0x9f, 0x55, 0xe4, 0x25, 0x6, 0x90, + 0xe5, 0x83, 0x98, 0x3d, 0x40, 0xff, 0xa8, 0x1f, + 0x9e, 0x43, 0x9b, 0x43, 0x0, /* U+0044 "D" */ 0xff, 0xfa, 0x43, 0xff, 0x8e, 0xdc, 0x1f, 0xfc, 0x87, 0x43, 0xf2, 0xf8, 0x3d, 0x21, 0xf5, 0x7b, - 0xd0, 0x68, 0x3f, 0xf8, 0x6e, 0x1b, 0xf, 0xfe, - 0x26, 0x19, 0xf, 0xfe, 0x24, 0x14, 0x1f, 0xfc, - 0x44, 0x3f, 0xf9, 0x28, 0x48, 0x7f, 0xf2, 0x30, - 0xff, 0xe2, 0x61, 0x21, 0xff, 0xd9, 0x43, 0xff, - 0xfe, 0x1f, 0xff, 0xf0, 0xff, 0xe2, 0xa1, 0xff, - 0xdd, 0xc2, 0x43, 0xff, 0x91, 0x87, 0xff, 0x11, - 0x9, 0xf, 0xfe, 0x1c, 0x1f, 0xfc, 0x84, 0x28, - 0x3f, 0xf8, 0x78, 0x64, 0x3f, 0xf8, 0x36, 0x1b, - 0xf, 0x57, 0xbc, 0x86, 0x83, 0xe5, 0xf0, 0x7a, - 0x43, 0xff, 0x8a, 0xe8, 0x7f, 0xf0, 0xdb, 0x83, - 0xc0, + 0xd0, 0x69, 0xf, 0xfe, 0x13, 0x86, 0x83, 0xff, + 0x89, 0x86, 0x43, 0xff, 0x89, 0x5, 0x7, 0xff, + 0x11, 0xc, 0x87, 0xff, 0x11, 0xb, 0xf, 0xfe, + 0x26, 0x1f, 0xfc, 0xc4, 0x3f, 0xf8, 0x88, 0x7f, + 0xff, 0xc3, 0xff, 0xfe, 0x1f, 0xfe, 0xf4, 0x3f, + 0xf9, 0x88, 0x7f, 0xf1, 0x30, 0xff, 0xe4, 0x21, + 0x61, 0xff, 0xc3, 0x43, 0x21, 0xff, 0xc3, 0x82, + 0x83, 0xff, 0x87, 0x86, 0x43, 0xff, 0x83, 0x61, + 0xa0, 0xf5, 0x7b, 0xc8, 0x69, 0xf, 0x2f, 0x83, + 0xd2, 0x1f, 0xfc, 0x57, 0x43, 0xff, 0x86, 0xdc, + 0x1e, /* U+0045 "E" */ - 0xff, 0xfe, 0x30, 0x7f, 0xf7, 0x17, 0xff, 0x84, - 0x1a, 0xbf, 0xf8, 0x41, 0xff, 0xff, 0xf, 0xff, - 0xf8, 0x7f, 0xf1, 0x2b, 0xff, 0x80, 0x87, 0x2f, - 0xff, 0x3, 0xf, 0xfe, 0xef, 0xff, 0xf0, 0x20, - 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xfd, 0x35, - 0xff, 0xc2, 0xc, 0xbf, 0xfc, 0x20, 0xff, 0xec, - 0x0, + 0xff, 0xfe, 0x34, 0x1f, 0xfd, 0xe5, 0xff, 0xe1, + 0x61, 0xab, 0xff, 0x84, 0x87, 0xff, 0xfc, 0x3f, + 0xff, 0xe1, 0xff, 0xcd, 0xaf, 0xfe, 0x2, 0x1e, + 0x5f, 0xfe, 0x6, 0x1f, 0xfe, 0xf, 0xff, 0xe0, + 0x41, 0xff, 0xff, 0xf, 0xff, 0xf8, 0x7f, 0xfd, + 0x6b, 0xff, 0x84, 0x86, 0x5f, 0xfe, 0x16, 0x1f, + 0xfd, 0xa0, /* U+0046 "F" */ 0xff, 0xfe, 0x30, 0x7f, 0xf7, 0x17, 0xff, 0x84, @@ -534,21 +535,21 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xfa, 0x20, /* U+0047 "G" */ - 0xf, 0x9b, 0xfa, 0x43, 0xff, 0x81, 0x72, 0x1c, - 0xdc, 0x1f, 0xda, 0x1f, 0xf3, 0xa1, 0xec, 0x3c, - 0xb0, 0x7a, 0xe, 0xc3, 0x3e, 0xab, 0xc8, 0x6c, - 0x24, 0x35, 0x3, 0xe9, 0xc, 0x82, 0x9, 0x41, - 0xfd, 0x6, 0xc3, 0xd0, 0x7f, 0xc8, 0x48, 0x87, - 0xff, 0x12, 0xe, 0xc2, 0x43, 0xff, 0x8c, 0x85, - 0x87, 0xff, 0x7, 0xf0, 0x7f, 0xf9, 0xd0, 0xff, - 0xff, 0x95, 0xfe, 0xf, 0xfe, 0x2, 0xff, 0xc1, - 0xff, 0xee, 0x7f, 0xc1, 0xfc, 0x87, 0xff, 0x87, - 0xf, 0xfe, 0x32, 0x1f, 0xfc, 0xac, 0x24, 0x3f, - 0xf8, 0xc8, 0x64, 0x3f, 0xf8, 0xc8, 0x50, 0x7f, - 0xf1, 0xa0, 0xd8, 0x7f, 0x90, 0xfa, 0xd, 0xa1, - 0xf5, 0x3, 0xe5, 0x6, 0xba, 0xde, 0x43, 0x61, - 0xa4, 0x39, 0x70, 0x7b, 0xf, 0x50, 0x3f, 0xf8, - 0xe, 0x1f, 0x9f, 0x21, 0xe6, 0xe0, 0xc0, + 0xf, 0x9b, 0xfa, 0x43, 0xfe, 0xb9, 0xe, 0x6e, + 0xf, 0xda, 0x1f, 0xf3, 0x87, 0xb0, 0xe5, 0xc1, + 0xec, 0x36, 0x19, 0xeb, 0x78, 0x3a, 0x2, 0x1a, + 0x81, 0xf6, 0x84, 0x82, 0x9, 0x41, 0xfd, 0x6, + 0x83, 0xa0, 0xff, 0x90, 0x94, 0x1f, 0xfc, 0x4c, + 0x36, 0x12, 0x1f, 0xfc, 0x4, 0x32, 0x16, 0x1f, + 0xfc, 0x1f, 0xc1, 0xff, 0xce, 0x43, 0xff, 0xfe, + 0x1f, 0xfc, 0x76, 0xbf, 0xc1, 0xff, 0xc0, 0x5f, + 0xf0, 0x7f, 0xfa, 0xdf, 0xf0, 0x7f, 0xf4, 0x90, + 0xff, 0xed, 0xa1, 0x61, 0xff, 0xc5, 0xc2, 0x43, + 0xff, 0x8a, 0x86, 0x43, 0xff, 0x8a, 0x85, 0x7, + 0xff, 0x16, 0xd, 0x87, 0xfa, 0xf, 0x21, 0xb4, + 0x3e, 0x90, 0xf4, 0x86, 0xba, 0xde, 0x43, 0x61, + 0x48, 0x72, 0xe0, 0xf6, 0x1d, 0x40, 0xff, 0xe0, + 0x58, 0x7c, 0xf2, 0x1e, 0x6d, 0x8, /* U+0048 "H" */ 0xfc, 0x1f, 0xfc, 0x2f, 0xc1, 0xff, 0xff, 0xf, @@ -565,32 +566,32 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+004A "J" */ 0xf, 0xfe, 0x17, 0xe0, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xf, 0xff, - 0xf8, 0x7f, 0xfc, 0xeb, 0x7, 0xff, 0xd, 0x78, - 0x3f, 0xf9, 0xe8, 0x72, 0x16, 0x1f, 0xb0, 0x93, - 0x9, 0x41, 0xf2, 0x16, 0x21, 0xa4, 0x33, 0x86, - 0x41, 0x6, 0xba, 0x70, 0x68, 0x26, 0xe, 0x50, - 0x74, 0x86, 0x60, 0xff, 0x48, 0x79, 0xe4, 0x33, - 0x68, 0x60, + 0xf8, 0x7f, 0xfc, 0xeb, 0x7, 0xff, 0xd, 0x70, + 0x7f, 0xf1, 0xd0, 0xfc, 0x87, 0x21, 0x61, 0xfb, + 0x9, 0x30, 0x90, 0xf9, 0x41, 0x62, 0x1b, 0x43, + 0x30, 0x64, 0x10, 0x6b, 0xa7, 0x6, 0x82, 0x50, + 0x72, 0x83, 0xa4, 0x35, 0x3, 0xfd, 0x21, 0xe7, + 0x90, 0xcd, 0xa1, 0x80, /* U+004B "K" */ 0xfc, 0x1f, 0xfc, 0xf, 0xe0, 0xff, 0xe2, 0xe1, - 0xa0, 0xff, 0xe2, 0x41, 0x94, 0x1f, 0xfc, 0x35, - 0x6, 0x83, 0xff, 0x89, 0x6, 0xc3, 0xff, 0x89, - 0x86, 0x83, 0xff, 0x89, 0x6, 0x50, 0x7f, 0xf1, - 0x10, 0xd0, 0x7f, 0xf1, 0x30, 0xd8, 0x7f, 0xf1, - 0x20, 0xd0, 0x7f, 0xf1, 0x14, 0x12, 0x83, 0xff, - 0x89, 0x6, 0x83, 0xff, 0x89, 0x86, 0xc3, 0xff, - 0x89, 0x6, 0x83, 0xff, 0x88, 0xa0, 0x94, 0x1f, - 0xfc, 0x36, 0xf, 0xfe, 0x4c, 0x1c, 0x87, 0xff, - 0x2f, 0xf, 0xfe, 0x32, 0x19, 0xf, 0xfe, 0x23, - 0x21, 0x41, 0xff, 0xc3, 0x62, 0xd, 0x7, 0xff, - 0xa, 0x9, 0x9, 0x41, 0xff, 0xc0, 0x83, 0x41, - 0xa0, 0xff, 0xe0, 0x21, 0xd0, 0x68, 0x3f, 0xf8, - 0xaa, 0x9, 0xf, 0xfe, 0x34, 0x1b, 0xf, 0xfe, - 0x34, 0x19, 0xf, 0xfe, 0x2a, 0x1a, 0xf, 0xfe, - 0x34, 0x1a, 0xf, 0xfe, 0x2a, 0x82, 0x50, 0x7f, - 0xf1, 0x60, 0xd0, 0x7f, 0xf1, 0xa0, 0xd0, 0x7f, - 0xf1, 0x50, 0xca, 0xf, 0xfe, 0x2e, 0x1a, 0x0, + 0xb0, 0xff, 0xe2, 0x41, 0xa0, 0xff, 0xe2, 0x28, + 0x25, 0x7, 0xff, 0x12, 0xd, 0x7, 0xff, 0x13, + 0xd, 0x7, 0xff, 0x12, 0xc, 0xa0, 0xff, 0xe1, + 0xa8, 0x34, 0x1f, 0xfc, 0x48, 0x36, 0x1f, 0xfc, + 0x48, 0x34, 0x1f, 0xfc, 0x45, 0x4, 0xa0, 0xff, + 0xe2, 0x41, 0xa0, 0xff, 0xe2, 0x61, 0xb0, 0xff, + 0xe2, 0x41, 0xa0, 0xff, 0xe2, 0x28, 0x25, 0x7, + 0xff, 0xd, 0x83, 0xff, 0x93, 0x7, 0x21, 0xff, + 0xcb, 0xc3, 0xff, 0x8c, 0x86, 0x43, 0xff, 0x88, + 0xc1, 0xa0, 0xff, 0xe1, 0xb1, 0x86, 0x83, 0xff, + 0x85, 0x4, 0x84, 0xa0, 0xff, 0xe0, 0x61, 0xa0, + 0xd0, 0x7f, 0xf1, 0xa0, 0xd0, 0x7f, 0xf1, 0x54, + 0x12, 0x1f, 0xfc, 0x68, 0x36, 0x1f, 0xfc, 0x64, + 0x32, 0x1f, 0xfc, 0x58, 0x34, 0x1f, 0xfc, 0x68, + 0x34, 0x1f, 0xfc, 0x55, 0x4, 0xa0, 0xff, 0xe2, + 0xc1, 0xa0, 0xff, 0xe3, 0x21, 0xa0, 0xff, 0xe2, + 0xc1, 0x90, 0xff, 0xe3, 0x41, 0xb0, /* U+004C "L" */ 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, @@ -601,69 +602,69 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+004D "M" */ 0xff, 0x7, 0xff, 0x17, 0xfc, 0x1f, 0xfd, 0x74, 0x3f, 0xf8, 0x68, 0x7f, 0xf0, 0x20, 0xff, 0xe1, - 0xe1, 0xff, 0xd0, 0x43, 0xff, 0x82, 0x87, 0xff, - 0x5, 0xf, 0xfe, 0x16, 0x1f, 0xfc, 0x1c, 0x3f, - 0xf8, 0x48, 0x7f, 0xf0, 0x50, 0xff, 0x90, 0x90, - 0xff, 0x90, 0x90, 0xfd, 0x85, 0x87, 0xfd, 0x85, - 0x87, 0xe4, 0x24, 0x3f, 0xe4, 0x24, 0x3f, 0xa0, - 0x90, 0xff, 0xe0, 0xa1, 0xfe, 0x42, 0xc3, 0xfa, - 0xa, 0xf, 0xfe, 0x12, 0x1f, 0xc8, 0x7f, 0xf0, - 0xd0, 0xff, 0xe1, 0xa1, 0xff, 0xc0, 0x82, 0x83, - 0xe8, 0x28, 0x3f, 0xf8, 0x88, 0x7c, 0x87, 0xff, - 0x15, 0xf, 0xfe, 0xa, 0x1f, 0xfc, 0x28, 0x28, - 0x39, 0xa, 0xf, 0xfe, 0x32, 0x1d, 0x7, 0xff, - 0x1d, 0xf, 0xf9, 0xf, 0xfe, 0x24, 0x12, 0x12, - 0x14, 0x1f, 0xfc, 0x88, 0x2c, 0x3f, 0xf9, 0x28, - 0x79, 0x2, 0x1f, 0xfc, 0x68, 0x24, 0x42, 0xc3, - 0xff, 0x95, 0x98, 0x48, 0x7f, 0xf1, 0xd0, 0x22, - 0x4, 0x3f, 0xf9, 0x18, 0x50, 0x58, 0x7f, 0xf2, - 0x10, 0x90, 0x90, 0xff, 0xe4, 0xa1, 0xc8, 0x7f, - 0xf2, 0xb0, 0xec, 0x3f, 0xf9, 0x48, 0x72, 0x1f, - 0xfc, 0xb4, 0x24, 0x3f, 0xf9, 0x98, 0x58, 0x7f, - 0xf0, 0x0, + 0xc1, 0xff, 0xde, 0x43, 0xff, 0x82, 0x87, 0xff, + 0xa, 0xf, 0xfe, 0xe, 0x1f, 0xfd, 0x4, 0x3f, + 0xf8, 0x68, 0x7f, 0xc8, 0x7f, 0xf0, 0x10, 0xb0, + 0xff, 0xb0, 0x90, 0xfd, 0x4, 0x87, 0xfc, 0x85, + 0x7, 0xf2, 0x12, 0x1f, 0xc8, 0x48, 0x7f, 0xb0, + 0xb0, 0xfe, 0xc2, 0xc3, 0xfc, 0x84, 0x87, 0xf2, + 0x12, 0x1f, 0xf2, 0x12, 0x1f, 0x21, 0x21, 0xff, + 0xc0, 0xc2, 0xc3, 0xec, 0x2c, 0x3f, 0xf8, 0x8, + 0x48, 0x7c, 0x84, 0x87, 0xff, 0x5, 0x9, 0xf, + 0xe4, 0x3f, 0xf8, 0x58, 0x58, 0x74, 0x16, 0x1f, + 0xfc, 0x24, 0x24, 0x39, 0x9, 0xf, 0xfe, 0x1a, + 0x1f, 0xf2, 0x1f, 0xfc, 0x4c, 0x28, 0x24, 0x2c, + 0x3f, 0xf8, 0x88, 0x48, 0x50, 0x48, 0x7f, 0xf1, + 0x50, 0xfe, 0x43, 0xff, 0x8d, 0x85, 0x8, 0x58, + 0x7f, 0xf1, 0x90, 0x92, 0x9, 0xf, 0xfe, 0x3a, + 0x1f, 0x21, 0xff, 0xc8, 0xc2, 0xc2, 0xc3, 0xff, + 0x90, 0x87, 0xc8, 0x7f, 0xf2, 0x50, 0xe4, 0x3f, + 0xf9, 0x58, 0x76, 0x1f, 0xfc, 0xa4, 0x39, 0xf, + 0xfe, 0x5a, 0x12, 0x1f, 0xfc, 0xcc, 0x2c, 0x3f, + 0xf8, 0x0, /* U+004E "N" */ 0xfc, 0x87, 0xff, 0x7, 0xf0, 0x74, 0x1f, 0xfc, - 0xb8, 0x3f, 0xf9, 0x48, 0x7f, 0xf2, 0xe0, 0xff, + 0xb4, 0x3f, 0xf9, 0x50, 0x7f, 0xf2, 0xe0, 0xff, 0xe5, 0x21, 0xff, 0xcb, 0x83, 0xff, 0x94, 0x87, 0xff, 0x1d, 0xa, 0xf, 0xfe, 0x34, 0x12, 0x1f, 0xfc, 0x78, 0x28, 0x3f, 0xf8, 0xc8, 0x48, 0x7f, - 0xf1, 0xe0, 0xb0, 0xff, 0xe3, 0x21, 0x90, 0xff, - 0xe3, 0x41, 0x41, 0xff, 0xc6, 0x43, 0x21, 0xff, - 0xc6, 0xc2, 0x83, 0xff, 0x8e, 0x84, 0x87, 0xff, - 0x1a, 0xa, 0xf, 0xfe, 0x3a, 0x12, 0x1f, 0xfc, - 0x68, 0x28, 0x3f, 0xf8, 0xe8, 0x48, 0x7f, 0xf1, - 0xa0, 0xa0, 0xff, 0xe3, 0xa1, 0x41, 0xff, 0xc6, - 0x82, 0x43, 0xff, 0x8e, 0x85, 0x7, 0xff, 0x1a, - 0x9, 0xf, 0xfe, 0x3c, 0x1f, 0xfc, 0xa4, 0x3f, - 0xf9, 0x70, 0x7f, 0xf2, 0x90, 0xff, 0xe5, 0xc1, - 0xff, 0xca, 0x43, 0xff, 0x97, 0x7, 0x0, + 0xf1, 0xe0, 0xa0, 0xff, 0xe3, 0x21, 0x28, 0x3f, + 0xf8, 0xd0, 0x50, 0x7f, 0xf1, 0x90, 0xc8, 0x7f, + 0xf1, 0xa0, 0xa0, 0xff, 0xe3, 0x28, 0x24, 0x3f, + 0xf8, 0xd0, 0x50, 0x7f, 0xf1, 0xd0, 0x90, 0xff, + 0xe3, 0x41, 0x41, 0xff, 0xc7, 0x42, 0x43, 0xff, + 0x8d, 0x5, 0x7, 0xff, 0x1d, 0xa, 0xf, 0xfe, + 0x34, 0x12, 0x1f, 0xfc, 0x74, 0x28, 0x3f, 0xf8, + 0xd0, 0x48, 0x7f, 0xf1, 0xe0, 0xff, 0xe5, 0x21, + 0xff, 0xcb, 0x83, 0xff, 0x94, 0x87, 0xff, 0x2e, + 0xf, 0xfe, 0x52, 0x1f, 0xfc, 0xb8, 0x38, /* U+004F "O" */ 0xf, 0x9b, 0xfa, 0x43, 0xff, 0x80, 0xf2, 0x1c, - 0xda, 0x1f, 0xd4, 0xf, 0xfa, 0x81, 0xf4, 0x87, - 0x2c, 0x1c, 0xe1, 0xca, 0xd, 0xea, 0xbc, 0x86, - 0x83, 0x41, 0x38, 0x7d, 0x21, 0x21, 0x41, 0xa0, - 0xfe, 0x83, 0x40, 0x42, 0x83, 0xfe, 0x82, 0x44, - 0x32, 0x1f, 0xf2, 0x19, 0xc2, 0x43, 0xff, 0x82, - 0x85, 0x86, 0xc3, 0xff, 0x83, 0x84, 0xa0, 0xff, - 0xf2, 0xa1, 0xff, 0xc1, 0x43, 0xff, 0xfe, 0x1f, - 0xff, 0xf0, 0xff, 0xe3, 0xa1, 0xff, 0xc1, 0x43, - 0xff, 0xca, 0xa0, 0xb0, 0xff, 0xe0, 0xe1, 0xb0, - 0x90, 0xff, 0xe0, 0xa1, 0x68, 0x64, 0x3f, 0xe4, - 0x32, 0x21, 0x41, 0xff, 0x41, 0x20, 0x83, 0x41, - 0xfd, 0x6, 0x82, 0x42, 0x70, 0xfa, 0x42, 0x43, - 0x41, 0xde, 0xab, 0xc8, 0x68, 0x3b, 0x43, 0x96, - 0xe, 0x70, 0xfa, 0x81, 0xff, 0x50, 0x3f, 0x9e, - 0x43, 0x9b, 0x43, 0x80, + 0xda, 0x1f, 0xd4, 0xf, 0xfa, 0xc3, 0xe9, 0xe, + 0x58, 0x3d, 0x87, 0x48, 0x4f, 0xaa, 0xf2, 0x1a, + 0xc, 0x84, 0xc1, 0xf4, 0x84, 0x85, 0x6, 0x83, + 0xfa, 0xd, 0x1, 0xa, 0xf, 0xfb, 0x9, 0x10, + 0xc8, 0x7f, 0xf1, 0x1c, 0x24, 0x3f, 0xf8, 0x28, + 0x58, 0x6c, 0x3f, 0xf8, 0x38, 0x64, 0x3f, 0xf9, + 0x28, 0x64, 0x3f, 0xf8, 0x28, 0x7f, 0xff, 0xc3, + 0xff, 0xfe, 0x1f, 0xff, 0x54, 0x3f, 0xf8, 0x28, + 0x64, 0x3f, 0xf9, 0xd8, 0x7f, 0xf0, 0x70, 0x9c, + 0x24, 0x3f, 0xf8, 0x28, 0x5a, 0x19, 0xf, 0xfe, + 0x22, 0x21, 0x41, 0xff, 0x41, 0x20, 0x83, 0x41, + 0xfc, 0xa0, 0xa0, 0x90, 0x98, 0x3e, 0xa0, 0x48, + 0x69, 0x9, 0xf5, 0x5e, 0x43, 0x41, 0xd2, 0x1c, + 0xb0, 0x7b, 0xf, 0xa8, 0x1f, 0xf5, 0x87, 0xf3, + 0xc8, 0x73, 0x68, 0x70, /* U+0050 "P" */ 0xff, 0xfe, 0xc, 0x87, 0xff, 0x1d, 0xb8, 0x3f, 0xf9, 0xe, 0x1f, 0x2f, 0xe0, 0xf6, 0x1e, 0xaf, 0xde, 0x43, 0x41, 0xff, 0xc3, 0x90, 0x90, 0xff, 0xe2, 0x41, 0x90, 0xff, 0xe2, 0x21, 0x61, 0xff, - 0xc4, 0xc2, 0x43, 0xff, 0xb2, 0x87, 0xff, 0x21, - 0xf, 0xfe, 0xee, 0x12, 0x1f, 0xfc, 0x44, 0x2c, + 0xc4, 0xc2, 0x43, 0xff, 0x88, 0x87, 0xff, 0xc9, + 0xf, 0xfe, 0x46, 0x12, 0x1f, 0xfc, 0x44, 0x2c, 0x3f, 0xf8, 0x78, 0x64, 0x3f, 0xf8, 0x2e, 0x1a, 0xe, 0xff, 0xe8, 0x32, 0x83, 0xff, 0x8c, 0xc1, 0xff, 0xc5, 0x68, 0x1f, 0x2f, 0xea, 0x72, 0x1f, @@ -672,62 +673,62 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0051 "Q" */ 0xf, 0x9b, 0xfa, 0x43, 0xff, 0x82, 0xf2, 0x1c, - 0xda, 0x1f, 0xea, 0x7, 0xfd, 0x40, 0xfd, 0x21, - 0xcb, 0x7, 0x38, 0x79, 0x41, 0xbd, 0x57, 0x90, - 0xd0, 0x74, 0x13, 0x87, 0xd2, 0x12, 0x1a, 0xd, - 0x7, 0xf4, 0x1a, 0x9, 0xa, 0xf, 0xfa, 0x9, - 0x2, 0x19, 0xf, 0xf9, 0xc, 0x98, 0x48, 0x7f, - 0xf0, 0x50, 0xb0, 0xec, 0x3f, 0xf8, 0x38, 0x48, - 0x87, 0xff, 0x9d, 0xf, 0xfe, 0xa, 0x1f, 0xff, - 0xf0, 0xff, 0xff, 0x87, 0xff, 0x3d, 0xf, 0xfe, - 0xa, 0x1f, 0xfe, 0x94, 0x2c, 0x3f, 0xf8, 0x38, - 0x49, 0x84, 0x87, 0xff, 0x5, 0xb, 0x10, 0xc8, - 0x7f, 0xc8, 0x64, 0x8, 0x50, 0x7f, 0xd0, 0x48, - 0x50, 0x68, 0x3f, 0xa0, 0xd8, 0x64, 0x27, 0xf, - 0xa4, 0x25, 0x6, 0x83, 0xbd, 0x57, 0x90, 0xd0, - 0x7b, 0x43, 0x96, 0xf, 0x61, 0xfa, 0x81, 0xff, - 0xcb, 0x79, 0xf, 0xf6, 0x1f, 0xf3, 0x7f, 0x90, - 0xda, 0x1f, 0xfc, 0x59, 0xd, 0x21, 0xff, 0xc5, - 0x90, 0xd2, 0x1f, 0xfc, 0x5a, 0x4, 0xa0, 0xff, - 0xe3, 0x31, 0x40, 0xff, 0xe4, 0x3a, 0x0, + 0xda, 0x1f, 0xea, 0x7, 0xfd, 0x61, 0xfa, 0x43, + 0x96, 0xf, 0x61, 0xe9, 0x9, 0xf5, 0x5e, 0x43, + 0x41, 0xc8, 0x4c, 0x1f, 0x48, 0x48, 0x68, 0x34, + 0x1f, 0xd0, 0x68, 0x24, 0x28, 0x3f, 0xec, 0x24, + 0x8, 0x64, 0x3f, 0xf8, 0x89, 0x84, 0x87, 0xff, + 0x5, 0xb, 0xe, 0xc3, 0xff, 0x83, 0x87, 0x21, + 0xff, 0xc9, 0x43, 0x90, 0xff, 0xe0, 0xa1, 0xff, + 0xff, 0xf, 0xff, 0xf8, 0x7f, 0xff, 0xd0, 0xff, + 0xe0, 0xa1, 0xc8, 0x7f, 0xf3, 0xf0, 0xff, 0xe0, + 0xe1, 0x26, 0x12, 0x1f, 0xfc, 0x14, 0x2c, 0x43, + 0x21, 0xff, 0xc4, 0x40, 0x85, 0x7, 0xfd, 0x4, + 0x85, 0x6, 0x83, 0xfa, 0x42, 0x83, 0x21, 0x30, + 0x7d, 0x21, 0x21, 0xd2, 0x13, 0xea, 0xbc, 0x86, + 0x83, 0xd2, 0x1c, 0xb0, 0x7b, 0xf, 0xd4, 0xf, + 0xfe, 0x5b, 0xc8, 0x7f, 0xb0, 0xff, 0x9b, 0xfc, + 0x86, 0xd0, 0xff, 0xe2, 0xc8, 0x69, 0xf, 0xfe, + 0x2c, 0x86, 0x83, 0xff, 0x8d, 0x40, 0xa0, 0xff, + 0xe3, 0xb1, 0x21, 0xff, 0xc8, 0x74, 0x0, /* U+0052 "R" */ - 0xff, 0xfe, 0x5, 0x3, 0xff, 0x90, 0xaf, 0x7, - 0xff, 0x2b, 0x43, 0xf2, 0xfc, 0x1e, 0x83, 0xf5, - 0x7d, 0xe4, 0x36, 0x1f, 0xfc, 0x49, 0xc, 0x87, - 0xff, 0x12, 0xd, 0x87, 0xff, 0x15, 0x9, 0xf, - 0xfe, 0x2e, 0x1f, 0xfc, 0x94, 0x3f, 0xfb, 0xe8, - 0x7f, 0xf2, 0x70, 0xff, 0xe4, 0xa1, 0x21, 0xff, - 0xc4, 0x83, 0x41, 0xff, 0xc3, 0x90, 0x90, 0xfa, - 0xbe, 0xf2, 0x1a, 0xf, 0x97, 0xe0, 0xf6, 0x1f, - 0xfc, 0x77, 0xf, 0xfe, 0x44, 0x1f, 0xef, 0xf4, - 0x19, 0xf, 0xfe, 0x22, 0x1a, 0xf, 0xfe, 0x2c, - 0x1f, 0xfc, 0x94, 0x34, 0x1f, 0xfc, 0x54, 0x24, - 0x3f, 0xf8, 0xb0, 0x68, 0x3f, 0xf8, 0xa8, 0x48, - 0x7f, 0xf1, 0x60, 0xc8, 0x7f, 0xf1, 0x50, 0xa0, - 0xff, 0xe2, 0xe1, 0x90, 0xff, 0xe2, 0x21, 0xb0, - 0xff, 0xe2, 0xc1, 0x21, 0xff, 0xc5, 0x43, 0x41, - 0xff, 0xc5, 0x82, 0x40, + 0xff, 0xfe, 0xc, 0x1f, 0xfc, 0x97, 0xc1, 0xff, + 0xca, 0xd0, 0xfc, 0xbf, 0x83, 0xa0, 0xfd, 0x5f, + 0xb4, 0x36, 0x1f, 0xfc, 0x4a, 0x7, 0xff, 0x25, + 0xd, 0x7, 0xff, 0x16, 0x9, 0xf, 0xfe, 0xda, + 0x1f, 0xfd, 0xf4, 0x3f, 0xf9, 0x38, 0x7f, 0xf2, + 0x50, 0x90, 0xff, 0xe2, 0x41, 0xa0, 0xff, 0xe1, + 0xc8, 0x48, 0x7d, 0x5f, 0x79, 0xd, 0x7, 0xcb, + 0xf0, 0x7b, 0xf, 0xfe, 0x3b, 0x87, 0xff, 0x22, + 0xf, 0xf7, 0xfa, 0xc, 0x87, 0xff, 0x11, 0xd, + 0x7, 0xff, 0x16, 0xf, 0xfe, 0x4a, 0x1a, 0xf, + 0xfe, 0x2a, 0x12, 0x1f, 0xfc, 0x58, 0x34, 0x1f, + 0xfc, 0x54, 0x24, 0x3f, 0xf8, 0xb0, 0x64, 0x3f, + 0xf8, 0xa8, 0x50, 0x7f, 0xf1, 0x60, 0xc8, 0x7f, + 0xf2, 0x70, 0xff, 0xe2, 0xc1, 0x21, 0xff, 0xc5, + 0x43, 0x41, 0xff, 0xc5, 0x82, 0x40, /* U+0053 "S" */ - 0xf, 0xaf, 0xe9, 0xf, 0xfa, 0xd0, 0xe6, 0xe0, - 0xf9, 0xd0, 0xff, 0x30, 0x7a, 0xe, 0x58, 0x39, - 0x83, 0x61, 0xae, 0xaf, 0x21, 0x28, 0x8, 0x69, - 0xf, 0x48, 0x50, 0x30, 0x94, 0x1f, 0xa0, 0xc8, - 0x85, 0x87, 0xf9, 0xb, 0xe, 0x43, 0xfd, 0x84, - 0x87, 0x21, 0xfe, 0x43, 0xff, 0x93, 0xf8, 0x42, - 0x83, 0xff, 0x89, 0x86, 0xc3, 0xff, 0x86, 0x87, - 0x68, 0x7f, 0xf0, 0xb0, 0xeb, 0x43, 0xff, 0x83, - 0x87, 0xae, 0x43, 0xfe, 0xd0, 0xf3, 0x68, 0x7f, - 0xad, 0xf, 0xac, 0x3f, 0xeb, 0x83, 0xed, 0xf, - 0xf9, 0xf2, 0x1d, 0x21, 0xff, 0xc1, 0xb4, 0x34, - 0x1f, 0xfc, 0x39, 0xc, 0x87, 0xff, 0xe, 0xd, - 0x87, 0xff, 0x12, 0x9, 0xfc, 0x1f, 0xfc, 0x94, - 0x3f, 0xe4, 0x32, 0x16, 0x1f, 0xf2, 0x1b, 0x9, - 0xf, 0xfb, 0x9, 0x41, 0xb0, 0xfe, 0x50, 0x59, - 0x6, 0xd0, 0xf3, 0x6, 0x45, 0x6, 0xba, 0xdc, - 0x1a, 0xa, 0x81, 0xcb, 0x83, 0xa4, 0x33, 0xa1, - 0xff, 0x68, 0x7d, 0x72, 0x1c, 0xf8, 0x30, + 0xf, 0xaf, 0xe9, 0xf, 0xfa, 0xd0, 0xe6, 0xd0, + 0xf9, 0xd0, 0xff, 0x50, 0x3d, 0x7, 0x2e, 0xc, + 0xc1, 0xb0, 0xd7, 0x5b, 0x42, 0x50, 0x10, 0xda, + 0x1e, 0x90, 0xa0, 0x61, 0x21, 0xfd, 0x6, 0x44, + 0x2c, 0x3f, 0xc8, 0x58, 0x72, 0x1f, 0xec, 0x24, + 0x3f, 0xf8, 0x88, 0x7f, 0x21, 0xff, 0x7e, 0x10, + 0xa0, 0xff, 0xe2, 0x61, 0xb0, 0xff, 0xe1, 0xa1, + 0xda, 0x1f, 0xfc, 0x2c, 0x3a, 0xd0, 0xff, 0xe0, + 0xe1, 0xeb, 0x90, 0xff, 0xb4, 0x3c, 0xda, 0x1f, + 0xeb, 0x43, 0xeb, 0xf, 0xfa, 0xe0, 0xfb, 0x43, + 0xfe, 0x7c, 0x87, 0x48, 0x7f, 0xf0, 0x6d, 0xd, + 0x7, 0xff, 0xe, 0x81, 0x90, 0xff, 0xe1, 0xa8, + 0x2c, 0x3f, 0xf8, 0x98, 0x4f, 0xe0, 0xff, 0xe0, + 0x21, 0xf9, 0xf, 0xfe, 0x22, 0x16, 0x1f, 0xf2, + 0x1b, 0x9, 0xf, 0xfb, 0x9, 0x41, 0xa0, 0xff, + 0x21, 0x64, 0x13, 0xa1, 0xe7, 0xc, 0x8a, 0xd, + 0x75, 0xb8, 0x34, 0x15, 0x3, 0x97, 0x7, 0x48, + 0x67, 0xf, 0xfe, 0x6, 0x87, 0xde, 0x43, 0xcf, + 0x83, 0x0, /* U+0054 "T" */ 0xff, 0xfe, 0x50, 0x7f, 0xf8, 0x17, 0xf8, 0x32, @@ -739,12 +740,12 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0055 "U" */ 0xfc, 0x1f, 0xfc, 0x1f, 0xc1, 0xff, 0xff, 0xf, 0xff, 0xf8, 0x7f, 0xff, 0xc3, 0xff, 0xfe, 0x1f, - 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, 0x65, 0xf, - 0xf9, 0xf, 0xfe, 0x6a, 0x16, 0x1f, 0xf6, 0x13, - 0x84, 0x87, 0xfc, 0x85, 0xa1, 0x90, 0xfe, 0x43, - 0x22, 0x15, 0x3, 0xea, 0x4, 0x82, 0xc, 0xfa, - 0xaf, 0x21, 0xa0, 0xb0, 0xf2, 0xc1, 0xec, 0x3b, - 0x43, 0xfe, 0xb0, 0xfa, 0xe4, 0x39, 0xb4, 0x30, + 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, 0xb9, 0xf, + 0xf9, 0xf, 0xfe, 0x62, 0x82, 0x83, 0xfe, 0x82, + 0xe0, 0xc8, 0x7f, 0x21, 0x91, 0xa, 0x81, 0xf5, + 0x2, 0x41, 0x6, 0x7d, 0x57, 0x90, 0xd0, 0x58, + 0x79, 0x60, 0xf6, 0x1d, 0xa1, 0xff, 0x38, 0x7d, + 0x72, 0x1c, 0xdc, 0x18, /* U+0056 "V" */ 0xfe, 0xf, 0xfe, 0x1f, 0xf2, 0x1f, 0xfc, 0xba, @@ -757,8 +758,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc8, 0x58, 0x79, 0xf, 0xfe, 0x2, 0x19, 0xf, 0xfa, 0xf, 0xb0, 0x90, 0xfd, 0x4, 0x87, 0xc8, 0x58, 0x7e, 0x43, 0xff, 0x86, 0x87, 0xff, 0x5, - 0xe, 0x43, 0xff, 0x84, 0x85, 0x87, 0x61, 0x41, - 0xfe, 0x82, 0x43, 0x90, 0x90, 0xff, 0xe3, 0xa1, + 0xe, 0x43, 0xff, 0x84, 0x85, 0x87, 0x61, 0x21, + 0xfe, 0x82, 0x43, 0x90, 0xa0, 0xff, 0xe3, 0xa1, 0xff, 0xc4, 0x42, 0x42, 0xc2, 0x43, 0xff, 0x81, 0x85, 0x4, 0x85, 0x87, 0xff, 0x1, 0xf, 0xf9, 0xf, 0xfe, 0xa, 0x12, 0x21, 0x21, 0xff, 0xc2, @@ -788,14 +789,14 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc3, 0xf2, 0x1f, 0xd8, 0x7e, 0x43, 0xc8, 0x10, 0xec, 0x8, 0x30, 0x90, 0xff, 0xe0, 0x21, 0xd8, 0x72, 0x1c, 0x87, 0xff, 0x19, 0x9, 0xf, 0xe4, - 0x3f, 0xf8, 0x68, 0x6c, 0x3f, 0xf8, 0x38, 0x64, - 0x3f, 0xd8, 0x4a, 0x2, 0x1f, 0x20, 0x50, 0x58, - 0x7f, 0x90, 0xb0, 0xb0, 0xfb, 0xf, 0x90, 0xff, - 0xe1, 0x21, 0x21, 0xf2, 0x14, 0x1f, 0xfe, 0x64, - 0x39, 0xf, 0xe4, 0x39, 0xf, 0xfe, 0x6, 0x1d, - 0x87, 0xf6, 0x1d, 0x87, 0xff, 0x1, 0xe, 0x43, - 0xf9, 0xe, 0x43, 0xff, 0xd0, 0x87, 0xfc, 0x87, - 0xff, 0x19, 0xb, 0xf, 0xfb, 0x9, 0xf, 0x80, + 0x3f, 0xf8, 0x68, 0x4e, 0x1f, 0xfc, 0x1c, 0x32, + 0x1f, 0xec, 0x32, 0x4, 0x3e, 0x40, 0xa0, 0xb0, + 0xff, 0x21, 0x61, 0x61, 0xf6, 0x1f, 0x21, 0xff, + 0xc2, 0x42, 0x43, 0xe4, 0x28, 0x3f, 0xfc, 0xc8, + 0x72, 0x1f, 0xc8, 0x72, 0x1f, 0xfc, 0xc, 0x3b, + 0xf, 0xec, 0x3b, 0xf, 0xfe, 0x2, 0x1c, 0x87, + 0xf2, 0x1c, 0x87, 0xff, 0xa1, 0xf, 0xf9, 0xf, + 0xfe, 0x32, 0x16, 0x1f, 0xf6, 0x12, 0x1f, 0x0, /* U+0058 "X" */ 0x3f, 0x83, 0xff, 0x81, 0x7e, 0x48, 0x34, 0x1f, @@ -809,51 +810,51 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf, 0xfe, 0xc, 0x19, 0x9, 0xf, 0xfe, 0x1a, 0x1f, 0x41, 0xff, 0xc3, 0x83, 0xc8, 0x7f, 0xf1, 0x60, 0xe8, 0x3f, 0xf8, 0xb8, 0x7f, 0xf2, 0xd0, - 0xe8, 0x3f, 0xf8, 0x90, 0x79, 0xf, 0xfe, 0x22, - 0x1f, 0x61, 0xff, 0xc2, 0x83, 0x41, 0x90, 0xff, - 0xe0, 0x28, 0x29, 0xd, 0x7, 0xff, 0x2, 0xc, - 0x90, 0x64, 0x3f, 0xc8, 0x68, 0x8, 0x68, 0x3f, - 0xd0, 0x64, 0x28, 0x32, 0x1f, 0x90, 0xd0, 0x64, - 0x34, 0x1f, 0xa0, 0xc8, 0x74, 0x19, 0xf, 0x21, - 0xa0, 0xf2, 0x1a, 0xf, 0x41, 0x90, 0xfa, 0xd, - 0x6, 0x83, 0x41, 0xf9, 0xc, 0x86, 0x43, 0x21, - 0xfd, 0x6, 0x81, 0x6, 0x83, 0xfc, 0x86, 0x40, - 0x86, 0x43, 0xfe, 0x83, 0x40, + 0xe8, 0x3f, 0xf8, 0x90, 0x79, 0x41, 0xff, 0xc3, + 0x43, 0xe8, 0x3f, 0xf8, 0x58, 0x68, 0x32, 0x1f, + 0xfc, 0x4, 0x34, 0x86, 0x83, 0xff, 0x81, 0x6, + 0x48, 0x32, 0x1f, 0xe4, 0x34, 0x4, 0x34, 0x1f, + 0xe8, 0x32, 0x14, 0x19, 0xf, 0xc8, 0x68, 0x32, + 0x1a, 0xf, 0xd0, 0x64, 0x3a, 0xc, 0x87, 0x90, + 0xd0, 0x79, 0xd, 0x7, 0xa0, 0xc8, 0x7d, 0x6, + 0x83, 0x41, 0xa0, 0xfc, 0x86, 0x43, 0x21, 0x90, + 0xfe, 0x83, 0x40, 0x83, 0x41, 0xfe, 0x43, 0x20, + 0x43, 0x21, 0xff, 0x41, 0xa0, /* U+0059 "Y" */ 0x7f, 0x21, 0xff, 0xc1, 0xfd, 0x21, 0xa0, 0xff, - 0xe0, 0x41, 0xa1, 0xf, 0xfe, 0x22, 0x1e, 0x83, - 0x41, 0xfe, 0x43, 0x41, 0x21, 0x21, 0xfe, 0x83, - 0x21, 0x41, 0x90, 0xff, 0xe0, 0xc1, 0xc8, 0x50, - 0x7e, 0x83, 0x21, 0xd8, 0x7f, 0xf0, 0x10, 0xa0, - 0xf2, 0x1a, 0xf, 0x21, 0x90, 0xfa, 0x9, 0xf, - 0x41, 0x21, 0xf9, 0xc, 0x87, 0xf4, 0x1f, 0xd0, - 0x50, 0x68, 0x24, 0x3f, 0xc8, 0x64, 0x24, 0x28, - 0x3f, 0xe4, 0x2c, 0x8, 0x7f, 0xf1, 0x20, 0x90, - 0x41, 0x41, 0xff, 0xc1, 0x42, 0x50, 0x64, 0x3f, - 0xf8, 0x30, 0x56, 0x14, 0x1f, 0xfc, 0x34, 0x24, - 0x24, 0x3f, 0xf8, 0x78, 0x7a, 0xf, 0xfe, 0x22, - 0x1e, 0x43, 0xff, 0x8b, 0x6, 0x43, 0xff, 0x8c, - 0x86, 0x83, 0xff, 0xfe, 0x1f, 0xff, 0xf0, 0xff, - 0xff, 0x87, 0xff, 0xf0, + 0xe0, 0x41, 0xa1, 0xf, 0xfe, 0x22, 0x12, 0x8, + 0x34, 0x1f, 0xe4, 0x36, 0x12, 0x12, 0x1f, 0xe8, + 0x32, 0x14, 0x19, 0xf, 0xfe, 0xc, 0x1c, 0x85, + 0x7, 0xe8, 0x32, 0x1d, 0x87, 0xff, 0x1, 0xa, + 0xf, 0x21, 0xa0, 0xf2, 0x19, 0xf, 0xa0, 0x90, + 0xf4, 0x12, 0x1f, 0x90, 0xc8, 0x64, 0x34, 0x1f, + 0xd0, 0x50, 0x6c, 0x24, 0x3f, 0xc8, 0x7e, 0x42, + 0x83, 0xfe, 0x42, 0x80, 0x84, 0x87, 0xff, 0x2, + 0x9, 0x4, 0x16, 0x1f, 0xfc, 0x14, 0x25, 0x6, + 0x43, 0xff, 0x83, 0x5, 0x61, 0x41, 0xff, 0xc3, + 0x42, 0x42, 0x43, 0xff, 0x87, 0x87, 0xa0, 0xff, + 0xe2, 0x21, 0xe4, 0x3f, 0xf8, 0xb0, 0x64, 0x3f, + 0xf8, 0xc8, 0x68, 0x3f, 0xff, 0xe1, 0xff, 0xff, + 0xf, 0xff, 0xf8, 0x7f, 0xff, 0x0, /* U+005A "Z" */ - 0xff, 0xfe, 0x40, 0x7f, 0xf7, 0xd7, 0xff, 0x86, - 0x1e, 0xaf, 0xfe, 0x16, 0x1b, 0xf, 0xfe, 0x1c, + 0xff, 0xfe, 0x44, 0x1f, 0xfd, 0xe5, 0xff, 0xe2, + 0x6, 0xeb, 0xff, 0x86, 0x19, 0x41, 0xff, 0xc3, + 0x42, 0x83, 0xff, 0x87, 0x4, 0x87, 0xff, 0xd, + 0x41, 0x41, 0xff, 0xc3, 0x82, 0x83, 0xff, 0x86, + 0x86, 0x43, 0xff, 0x87, 0x5, 0x7, 0xff, 0xe, + 0xc, 0x87, 0xff, 0xd, 0xb, 0xf, 0xfe, 0x1e, 0x12, 0x1f, 0xfc, 0x34, 0x34, 0x1f, 0xfc, 0x38, 0x24, 0x3f, 0xf8, 0x70, 0x68, 0x3f, 0xf8, 0x68, - 0x50, 0x7f, 0xf0, 0xe0, 0xc8, 0x7f, 0xf0, 0xd0, - 0xa0, 0xff, 0xe1, 0xe1, 0x28, 0x3f, 0xf8, 0x48, - 0x68, 0x3f, 0xf8, 0x70, 0x48, 0x7f, 0xf0, 0xd0, - 0xd0, 0x7f, 0xf0, 0xe0, 0xa0, 0xff, 0xe1, 0xc1, - 0x90, 0xff, 0xe1, 0xa1, 0x41, 0xff, 0xc3, 0x83, - 0x21, 0xff, 0xc2, 0x50, 0x58, 0x7f, 0xf0, 0xe0, - 0x90, 0xff, 0xe1, 0xa1, 0xa0, 0xff, 0xe1, 0xc1, - 0x41, 0xff, 0xc3, 0x83, 0x21, 0xff, 0xc3, 0x42, - 0x83, 0xff, 0x87, 0x6, 0x43, 0xff, 0x86, 0x85, - 0x87, 0xff, 0xe, 0x9, 0xf, 0xfe, 0x1a, 0x82, - 0x83, 0xff, 0x87, 0x6, 0xaf, 0xfe, 0x20, 0x72, - 0xff, 0xf1, 0x3, 0xff, 0xbc, + 0x50, 0x7f, 0xf0, 0xf0, 0xc8, 0x7f, 0xf0, 0x90, + 0xd8, 0x7f, 0xf0, 0xe0, 0x90, 0xff, 0xe1, 0xc1, + 0xa0, 0xff, 0xe1, 0xa1, 0x21, 0xff, 0xc3, 0x83, + 0x41, 0xff, 0xc2, 0x50, 0x50, 0x7f, 0xf0, 0xe0, + 0xc8, 0x7f, 0xf0, 0xa0, 0xd0, 0x7f, 0xf0, 0xd0, + 0x94, 0x1f, 0xfc, 0x28, 0x34, 0x1f, 0xfc, 0x25, + 0x4, 0x87, 0xff, 0xe, 0xe, 0xaf, 0xfe, 0x18, + 0x72, 0xff, 0xf1, 0x3, 0xff, 0xbc, /* U+005B "[" */ 0xaf, 0xcb, 0xf8, 0x3f, 0xf9, 0x1f, 0x83, 0xff, @@ -869,14 +870,14 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x94, 0x12, 0x1f, 0xfc, 0x4, 0x2c, 0x3f, 0xf8, 0x88, 0x7f, 0xf0, 0x50, 0x90, 0xff, 0xe0, 0x41, 0x61, 0xff, 0xc4, 0x43, 0xff, 0x82, 0x84, 0x87, - 0xff, 0x3, 0xb, 0xf, 0xfe, 0x2, 0x12, 0x1f, - 0xfc, 0x14, 0x24, 0x3f, 0xf8, 0x18, 0x58, 0x7f, - 0xf0, 0x10, 0x90, 0xff, 0xe0, 0xa1, 0x21, 0xff, - 0xc0, 0xc2, 0xc3, 0xff, 0x80, 0x84, 0x87, 0xff, - 0x5, 0xf, 0xfe, 0x26, 0x14, 0x1f, 0xfc, 0x4, - 0x24, 0x3f, 0xf8, 0x28, 0x7f, 0xf1, 0x30, 0x90, - 0xff, 0xe0, 0x21, 0x41, 0xff, 0xd2, 0x82, 0x43, - 0xff, 0x80, 0x85, 0x7, 0xff, 0x6, 0x54, 0x0, + 0xff, 0x2, 0xb, 0xf, 0xfe, 0x22, 0x1f, 0xfc, + 0x14, 0x24, 0x3f, 0xf8, 0x18, 0x58, 0x7f, 0xf0, + 0x10, 0x90, 0xff, 0xe0, 0xa1, 0x21, 0xff, 0xc0, + 0xc2, 0xc3, 0xff, 0x80, 0x84, 0x87, 0xff, 0x5, + 0xf, 0xfe, 0x26, 0x14, 0x1f, 0xfc, 0x4, 0x24, + 0x3f, 0xf8, 0x28, 0x7f, 0xf1, 0x30, 0x90, 0xff, + 0xe0, 0x21, 0x41, 0xff, 0xd2, 0x82, 0x43, 0xff, + 0x80, 0x85, 0x7, 0xff, 0x6, 0x54, 0x0, /* U+005D "]" */ 0x6b, 0xe3, 0x5f, 0x83, 0xff, 0x8f, 0x7c, 0x1f, @@ -888,8 +889,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf, 0x5e, 0x43, 0xff, 0x80, 0x82, 0xf, 0xf9, 0xf, 0xfe, 0x1e, 0x1a, 0xf, 0xf2, 0x19, 0xf, 0xe4, 0x3f, 0xf8, 0x78, 0x10, 0xa0, 0xfc, 0x83, - 0x40, 0x87, 0xc8, 0x4c, 0x1f, 0xe8, 0x8, 0x74, - 0x1f, 0xd8, 0x10, 0x21, 0xc8, 0x48, 0x30, 0x90, + 0x40, 0x87, 0xc8, 0x4e, 0x1f, 0xe8, 0x32, 0x14, + 0x1f, 0xd0, 0x10, 0x21, 0xc8, 0x48, 0x30, 0x90, 0xd0, 0x79, 0xb, 0xf, 0x90, 0xc8, 0x10, 0xa0, 0xa0, 0xd8, 0x48, 0x10, 0xfc, 0x85, 0x87, 0x21, 0xfc, 0x80, @@ -898,30 +899,29 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xaf, 0xfe, 0x32, 0xff, 0xf1, 0x83, 0xff, 0xb0, /* U+0060 "`" */ - 0x7f, 0x83, 0x98, 0x34, 0x1c, 0xc1, 0x21, 0xe5, - 0x5, 0x87, 0xa4, 0x24, 0x3d, 0x5, 0x7, 0xd8, - 0x58, + 0x3f, 0x83, 0xd0, 0x68, 0x39, 0x41, 0x21, 0xe9, + 0xb, 0xf, 0x48, 0x48, 0x7a, 0xa, 0xf, 0xb0, + 0xb0, /* U+0061 "a" */ - 0xe, 0x6f, 0xd2, 0x1f, 0xdc, 0x86, 0x6d, 0xf, - 0x61, 0xfe, 0xa0, 0x6c, 0x39, 0x41, 0xc8, 0x50, - 0x6b, 0xa7, 0x6, 0x80, 0x85, 0x21, 0x94, 0x12, - 0x1e, 0x43, 0xd8, 0x7b, 0xf0, 0x7c, 0x87, 0xff, - 0x89, 0xbf, 0xc1, 0xf9, 0xe4, 0x3f, 0xf8, 0x34, - 0xf, 0xfe, 0x1a, 0x83, 0xcb, 0x83, 0xd0, 0x67, - 0xd5, 0x83, 0x90, 0xd4, 0xf, 0xfa, 0x9, 0x41, - 0xff, 0xc4, 0xc3, 0xff, 0x8a, 0x87, 0xff, 0x15, - 0xf, 0x90, 0xfe, 0xc3, 0xe8, 0x39, 0x9, 0x41, - 0xd8, 0x7a, 0xd, 0x74, 0xf0, 0x7e, 0x43, 0x94, - 0x14, 0x19, 0x28, 0x1f, 0xa4, 0x36, 0x7, 0x43, - 0x3a, 0x4b, 0x60, + 0xe, 0x6f, 0xe8, 0x3f, 0xa8, 0x87, 0x3a, 0x1e, + 0xd0, 0xfe, 0x90, 0xd8, 0x72, 0x83, 0xa0, 0x90, + 0xd7, 0x4f, 0x6, 0x81, 0x5, 0x21, 0xc8, 0x48, + 0x79, 0xf, 0x61, 0xef, 0xc1, 0xf2, 0x1f, 0xfe, + 0x26, 0xff, 0x7, 0xe7, 0x90, 0xff, 0xe0, 0xd0, + 0x3f, 0xf8, 0x6a, 0xf, 0x2e, 0xf, 0x41, 0xaf, + 0x56, 0xe, 0x43, 0x68, 0x7f, 0xd0, 0x48, 0x7f, + 0xf1, 0x60, 0xff, 0xef, 0xa1, 0xfc, 0x87, 0xd0, + 0x72, 0x14, 0x1e, 0xc3, 0xd0, 0x6e, 0xaf, 0x7, + 0xe8, 0x32, 0xc1, 0x41, 0x91, 0x83, 0xf4, 0x86, + 0xc0, 0xe8, 0x67, 0x49, 0x6c, /* U+0062 "b" */ 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, 0x7e, 0xfd, 0x21, 0xfe, 0x74, 0x33, 0x40, 0xfd, - 0x40, 0xfc, 0xe1, 0xf2, 0x12, 0x83, 0xd0, 0x7e, - 0xf5, 0x3c, 0x19, 0xf, 0xb0, 0xf6, 0x19, 0xe, - 0x83, 0xff, 0x81, 0x87, 0x21, 0xfa, 0x9, 0xf, + 0x40, 0xfc, 0xc1, 0xf2, 0x12, 0x83, 0x94, 0x1f, + 0xbd, 0x4f, 0x6, 0x83, 0xec, 0x3d, 0x86, 0x43, + 0xa0, 0xfc, 0x85, 0x87, 0x21, 0xfb, 0x9, 0xf, 0xfe, 0x12, 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, 0x6d, 0xf, 0xe4, 0x3f, 0x61, 0x21, 0xd0, 0x7e, 0x42, 0xc3, 0xd8, 0x7b, 0xc, 0x87, 0xde, @@ -929,102 +929,103 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc1, 0xf9, 0x83, 0xf3, 0xa1, 0x9e, 0xc, /* U+0063 "c" */ - 0xf, 0x5f, 0xd0, 0x7f, 0xad, 0xe, 0x78, 0x3e, - 0xd0, 0xfe, 0x70, 0xec, 0x39, 0x60, 0xe8, 0x28, - 0x35, 0xd5, 0xa1, 0x28, 0x8, 0x52, 0x1d, 0x6, - 0xc4, 0x32, 0x1f, 0x41, 0x26, 0x12, 0x1f, 0x90, - 0xe4, 0x2c, 0x3f, 0xfa, 0x1f, 0x83, 0x90, 0xff, - 0xff, 0x87, 0xff, 0x69, 0xf, 0xfe, 0x82, 0xe1, - 0xb, 0xf, 0xea, 0xc6, 0x12, 0x1f, 0x90, 0xe4, - 0x32, 0x1f, 0x61, 0x20, 0x42, 0x90, 0xe9, 0xb, - 0x4, 0x1a, 0xea, 0xd0, 0x94, 0x16, 0x1c, 0xb0, - 0x74, 0x1d, 0x87, 0xf9, 0xc3, 0xee, 0x43, 0x9e, - 0xc, + 0xf, 0x5f, 0xd0, 0x7f, 0xbc, 0x87, 0x3c, 0x1f, + 0x61, 0xfe, 0x70, 0xec, 0x39, 0x60, 0xe8, 0x28, + 0x35, 0xd5, 0xa1, 0x21, 0x21, 0x48, 0x74, 0x1a, + 0x10, 0xc8, 0x7d, 0x4, 0x98, 0x48, 0x7e, 0x43, + 0x90, 0xb0, 0xff, 0xe8, 0x7e, 0xe, 0x43, 0xff, + 0xfe, 0x1f, 0xfd, 0xa4, 0x3f, 0xfa, 0xb, 0x84, + 0x2c, 0x3f, 0xab, 0x18, 0x48, 0x7e, 0x43, 0x90, + 0xc8, 0x7d, 0x84, 0x81, 0xa, 0x43, 0xa4, 0x28, + 0x10, 0x6b, 0xab, 0x42, 0x43, 0x61, 0xcb, 0x6, + 0x60, 0xec, 0x3f, 0xcc, 0x1f, 0x72, 0x1c, 0xf0, + 0x60, /* U+0064 "d" */ 0xf, 0xfe, 0x17, 0xe0, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xf9, 0xef, 0xe9, 0xf, 0xf3, 0xc1, - 0x9a, 0x7, 0xe6, 0xf, 0xcc, 0x1f, 0x41, 0xcb, - 0x1, 0xf, 0x41, 0xae, 0xad, 0xf, 0x90, 0x94, - 0x1d, 0x21, 0xc8, 0x68, 0x3e, 0x83, 0xb0, 0x90, - 0xff, 0xe1, 0x21, 0x61, 0xff, 0xec, 0x43, 0xff, - 0xfe, 0x87, 0xff, 0xa1, 0xb, 0xf, 0xfe, 0x16, - 0x12, 0x1f, 0xfc, 0x24, 0x34, 0x1f, 0x41, 0xe4, - 0x25, 0x7, 0x48, 0x7a, 0xd, 0x75, 0x68, 0x7e, - 0x83, 0x96, 0xf, 0xf3, 0x7, 0xe7, 0x43, 0xe7, - 0x83, 0x34, 0xf, 0x0, + 0x9b, 0xf, 0xcc, 0x1f, 0xd8, 0x7d, 0x7, 0x2c, + 0x1f, 0xd0, 0x6b, 0xab, 0x43, 0xe4, 0x25, 0x7, + 0x48, 0x72, 0x1a, 0xf, 0xa0, 0xec, 0x24, 0x3f, + 0xf8, 0x48, 0x58, 0x7f, 0xf6, 0x50, 0xff, 0xff, + 0x87, 0xff, 0x69, 0xf, 0xfe, 0xaa, 0x16, 0x1f, + 0xfc, 0x2c, 0x24, 0x3f, 0xf8, 0x48, 0x64, 0x3e, + 0x83, 0xc8, 0x52, 0x1d, 0x21, 0xe8, 0x35, 0xd5, + 0xa1, 0xfa, 0xe, 0x58, 0x8, 0x7c, 0xc1, 0xf9, + 0x90, 0xf9, 0xe0, 0xcd, 0x3, 0xc0, /* U+0065 "e" */ - 0xf, 0x3f, 0xd0, 0x7f, 0xae, 0xe, 0x78, 0x3e, - 0xd0, 0xfe, 0x60, 0xe8, 0x39, 0x60, 0xca, 0x9, - 0x41, 0x5d, 0x5a, 0x14, 0x14, 0x14, 0x87, 0x41, - 0x91, 0xc, 0x87, 0xc8, 0x59, 0x85, 0x7, 0xe8, - 0x24, 0x3f, 0xf9, 0x8, 0x48, 0x7f, 0xf1, 0xab, - 0xfc, 0x1f, 0xcb, 0xfe, 0xf, 0xff, 0x1f, 0xff, - 0xf0, 0x83, 0xff, 0x98, 0x87, 0xff, 0x55, 0xb, - 0xf, 0xfe, 0x16, 0x12, 0x1f, 0xfc, 0x24, 0x34, - 0x1f, 0xdc, 0x12, 0x13, 0x7, 0x9c, 0x50, 0x20, - 0xcf, 0xaa, 0xe0, 0xb0, 0xb0, 0xf2, 0xc1, 0x98, - 0x36, 0x87, 0xfa, 0x81, 0xeb, 0x43, 0x9b, 0x42, + 0xf, 0x5f, 0xd0, 0x7f, 0xad, 0xe, 0x78, 0x3e, + 0xd0, 0xfe, 0x60, 0xec, 0x39, 0x60, 0xca, 0x9, + 0xd, 0x75, 0x68, 0x50, 0x50, 0x52, 0x1d, 0x6, + 0x44, 0x32, 0x1f, 0x41, 0x66, 0x12, 0x1f, 0x90, + 0x90, 0xec, 0x3f, 0xf8, 0x48, 0x7f, 0xf2, 0xba, + 0xfe, 0xf, 0xe5, 0xff, 0x7, 0xff, 0x8f, 0xff, + 0xf8, 0x41, 0xff, 0xdf, 0x43, 0xff, 0x84, 0x85, + 0x87, 0xff, 0xb, 0x9, 0xf, 0xfe, 0x12, 0x1a, + 0xf, 0xee, 0x9, 0x9, 0x83, 0xce, 0x28, 0x10, + 0x67, 0xad, 0xc1, 0x61, 0x61, 0xcb, 0x83, 0x30, + 0x6c, 0x3f, 0xea, 0x7, 0xbc, 0x87, 0x36, 0x84, /* U+0066 "f" */ - 0xf, 0xca, 0x94, 0x1e, 0xba, 0x34, 0xe, 0xd0, - 0xff, 0x61, 0xff, 0x21, 0xdf, 0x82, 0xc3, 0x61, - 0xf2, 0x14, 0x1f, 0xfc, 0xd4, 0x3f, 0xfa, 0x7f, - 0x6, 0xfe, 0xf, 0xfe, 0x7a, 0xc1, 0x97, 0x8a, - 0x83, 0x57, 0x7, 0xff, 0xfc, 0x3f, 0xff, 0xe1, - 0xff, 0xff, 0xf, 0xff, 0x28, + 0xf, 0xe6, 0x88, 0x7e, 0xb9, 0x54, 0xf, 0x68, + 0x7f, 0xd0, 0x7f, 0xf0, 0x50, 0xdf, 0x41, 0xa0, + 0xd8, 0x7e, 0x42, 0x83, 0xff, 0x82, 0x87, 0xff, + 0x8e, 0xf8, 0x37, 0xe8, 0x3f, 0xfa, 0x3a, 0xc1, + 0x97, 0x63, 0x50, 0x6a, 0xc8, 0x7f, 0xff, 0xc3, + 0xff, 0xfe, 0x1f, 0xff, 0xf0, 0xff, 0xfd, 0x0, /* U+0067 "g" */ - 0xe, 0x7f, 0x48, 0x2f, 0x83, 0x3c, 0x19, 0xa0, + 0xe, 0xbf, 0x48, 0x2f, 0x83, 0x3a, 0x19, 0xa0, 0x7e, 0x60, 0xfc, 0xc8, 0x7a, 0xe, 0x58, 0x8, - 0x7a, 0xd, 0x75, 0x68, 0x7c, 0x84, 0xa0, 0xe8, - 0x3c, 0x86, 0x83, 0xec, 0x3b, 0x9, 0xf, 0xfe, + 0x7a, 0xd, 0x75, 0x68, 0x7c, 0x85, 0x21, 0xd2, + 0x1c, 0x86, 0x43, 0xe8, 0x3b, 0x9, 0xf, 0xfe, 0x12, 0x16, 0x1f, 0xfd, 0x94, 0x3f, 0xff, 0xe1, - 0xff, 0xc7, 0x43, 0xff, 0xd0, 0x85, 0x87, 0xff, - 0xb, 0x9, 0xf, 0xfe, 0x12, 0x1a, 0xf, 0xb0, - 0xf2, 0x12, 0x83, 0xa0, 0xfa, 0xd, 0x75, 0x68, + 0xff, 0xda, 0x43, 0xff, 0xaa, 0x85, 0x87, 0xff, + 0xb, 0x9, 0xf, 0xfe, 0x12, 0x19, 0xf, 0xa0, + 0xf2, 0x14, 0x87, 0x48, 0x7a, 0xd, 0x75, 0x68, 0x7e, 0x83, 0x96, 0x2, 0x1f, 0x30, 0x7e, 0x60, - 0xfc, 0xf0, 0x66, 0x81, 0xff, 0x3f, 0xa4, 0x3f, - 0xfd, 0xc8, 0x7e, 0x83, 0xfa, 0x9, 0xa, 0x60, - 0xfa, 0xd, 0x84, 0x8f, 0x4, 0xc8, 0x64, 0x8, - 0x67, 0xe9, 0xd, 0x84, 0xc1, 0xff, 0xc0, 0xc3, - 0x9e, 0xf, 0xce, 0x1f, 0x9f, 0x56, 0xf4, 0x1c, + 0xfc, 0xe8, 0x66, 0x81, 0xff, 0x5f, 0xa4, 0x3f, + 0xfd, 0xc8, 0x7e, 0x83, 0xfb, 0x9, 0xa, 0x60, + 0xf9, 0x41, 0x61, 0x23, 0xc1, 0x34, 0xc, 0x81, + 0xc, 0xfd, 0x21, 0xb0, 0x98, 0x3f, 0xf8, 0x18, + 0x73, 0xc1, 0xf9, 0xc3, 0xf3, 0xea, 0xde, 0x83, + 0x80, /* U+0068 "h" */ 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, - 0x2d, 0xfd, 0x7, 0xf3, 0xc1, 0x9d, 0xf, 0x50, - 0x3f, 0x48, 0x72, 0x12, 0x83, 0xa0, 0xfa, 0xe9, - 0xa1, 0x90, 0xe9, 0xd, 0x6, 0xc3, 0x28, 0x3d, - 0x4, 0x86, 0x83, 0xff, 0x98, 0x87, 0xff, 0xfc, - 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xf, 0xff, 0xc0, + 0x2e, 0xfd, 0x7, 0xf3, 0xa1, 0x9e, 0xf, 0x50, + 0x3f, 0x28, 0x39, 0x9, 0x41, 0xd0, 0x7d, 0x74, + 0xe0, 0xc8, 0x74, 0x86, 0x43, 0x61, 0x94, 0x1e, + 0x82, 0x43, 0x41, 0xff, 0xcc, 0x43, 0xff, 0xfe, + 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, 0xe0, /* U+0069 "i" */ - 0x3c, 0x98, 0x20, 0xff, 0xa0, 0x43, 0xe4, 0x3f, + 0x7c, 0x90, 0x20, 0xff, 0xa0, 0x43, 0xe4, 0x3f, 0xef, 0xc1, 0xff, 0xff, 0xf, 0xff, 0x38, /* U+006A "j" */ - 0xe, 0xf8, 0x3b, 0xb, 0xf, 0xfe, 0x56, 0x16, - 0x1d, 0xf0, 0x7f, 0xf3, 0x3f, 0x7, 0xff, 0xfc, - 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xf, 0xfe, 0xe2, - 0x1f, 0xb0, 0xf9, 0x41, 0x37, 0xa0, 0xd0, 0x7c, - 0x87, 0xcc, 0x57, 0x70, 0x0, + 0xc, 0xf9, 0xe, 0x81, 0x7, 0xff, 0x2e, 0x4, + 0x1c, 0xf9, 0xf, 0xfe, 0x5f, 0xe0, 0xff, 0xff, + 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xff, 0xe5, + 0x43, 0xf4, 0x1d, 0x78, 0x34, 0x1f, 0x90, 0xfb, + 0x5, 0x76, 0x10, /* U+006B "k" */ 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, 0x8d, 0xfd, 0x7, 0xff, 0x6, 0xd, 0x7, 0xff, 0x2, 0xd, 0x87, 0xff, 0x1, 0x41, 0x41, 0xff, 0xc1, 0x82, 0x50, 0x7f, 0xf0, 0x30, 0xd0, 0x7f, - 0xf0, 0x20, 0xd8, 0x7f, 0xf0, 0x50, 0xa0, 0xff, + 0xf0, 0x10, 0xd8, 0x7f, 0xf0, 0x60, 0xa0, 0xff, 0xe0, 0xe1, 0x28, 0x3f, 0xf8, 0x10, 0x68, 0x3f, - 0xf8, 0x12, 0x14, 0x1f, 0xfc, 0x14, 0x3f, 0xf9, - 0x70, 0x7f, 0xf1, 0xe0, 0xff, 0xe1, 0x41, 0x21, - 0xff, 0xc1, 0xd0, 0xd8, 0x7f, 0xd0, 0x30, 0xc8, - 0x7f, 0x90, 0x90, 0xa0, 0xff, 0xe1, 0x41, 0xa0, - 0xff, 0xe1, 0x41, 0x21, 0xff, 0xc2, 0x43, 0x61, - 0xff, 0xc2, 0x83, 0x21, 0xff, 0xc1, 0x50, 0x50, - 0x7f, 0xf0, 0xa0, 0xd0, 0x7f, 0xf0, 0x90, 0x90, - 0xff, 0xe1, 0x41, 0xb0, + 0xf8, 0xa, 0xb, 0xf, 0xfe, 0xc, 0x19, 0xf, + 0xfe, 0x34, 0x1f, 0xfc, 0x78, 0x3f, 0xf8, 0x50, + 0x48, 0x7f, 0xf0, 0x74, 0x34, 0x1f, 0xf4, 0xc, + 0x25, 0x7, 0xf9, 0x9, 0xa, 0xf, 0xfe, 0x14, + 0x1a, 0xf, 0xfe, 0x12, 0x12, 0x1f, 0xfc, 0x28, + 0x34, 0x1f, 0xfc, 0x28, 0x25, 0x7, 0xff, 0x5, + 0xd, 0x7, 0xff, 0xb, 0xd, 0x7, 0xff, 0x9, + 0x9, 0xf, 0xfe, 0x14, 0x1a, 0x0, /* U+006C "l" */ 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, @@ -1043,125 +1044,124 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, /* U+006E "n" */ - 0xfc, 0x13, 0xfa, 0xf, 0xe7, 0x83, 0x3a, 0x1e, - 0xa0, 0x7e, 0x90, 0xe4, 0x25, 0x7, 0x41, 0xf5, - 0xd3, 0x43, 0x21, 0xd2, 0x1a, 0xd, 0x86, 0x50, - 0x7a, 0x9, 0xd, 0x7, 0xff, 0x31, 0xf, 0xff, - 0xf8, 0x7f, 0xff, 0xc3, 0xff, 0xfe, 0x1f, 0xff, - 0x80, + 0xfc, 0x13, 0xfa, 0xf, 0xe7, 0x83, 0x3c, 0x1e, + 0xa0, 0x7e, 0x50, 0x72, 0x12, 0x83, 0xa0, 0xfa, + 0xe9, 0xc1, 0x90, 0xe9, 0xc, 0x86, 0xc3, 0x28, + 0x3d, 0x4, 0x86, 0x83, 0xe4, 0x3f, 0xff, 0xe1, + 0xff, 0xff, 0xf, 0xff, 0xf8, 0x7f, 0xff, 0xc3, + 0xfc, /* U+006F "o" */ 0xf, 0x37, 0xe9, 0xf, 0xf3, 0xc8, 0x66, 0xd0, 0xfa, 0x81, 0xfe, 0xa0, 0x74, 0x87, 0x28, 0x39, - 0x41, 0x90, 0xde, 0xa7, 0x6, 0x82, 0xc3, 0x61, - 0xce, 0x1a, 0xf, 0x41, 0xfa, 0x9, 0x10, 0xc8, - 0x7e, 0x43, 0x38, 0x48, 0x7f, 0x90, 0xb4, 0x2c, - 0x3f, 0xd8, 0x48, 0x7f, 0xf3, 0x10, 0xff, 0x21, - 0xff, 0xf8, 0x43, 0xff, 0xa4, 0x86, 0x42, 0xc3, - 0xff, 0x84, 0xe1, 0x21, 0xfe, 0xc2, 0xd0, 0xc8, - 0x7f, 0x21, 0x21, 0xd0, 0x7e, 0x83, 0xd0, 0x6d, - 0xe, 0x90, 0xa0, 0x28, 0x35, 0xd5, 0xa1, 0x28, - 0x29, 0xe, 0x58, 0x33, 0x7, 0x50, 0x3f, 0xd4, - 0xf, 0x9e, 0x43, 0x36, 0x86, + 0x83, 0x21, 0xbd, 0x4f, 0x6, 0x42, 0x83, 0x61, + 0xec, 0x34, 0x4, 0x28, 0x3f, 0x41, 0x22, 0x19, + 0xf, 0xc8, 0x67, 0x9, 0xf, 0xf2, 0x16, 0x85, + 0x87, 0xfb, 0x9, 0xc, 0x87, 0xf9, 0xf, 0xff, + 0xf8, 0x7f, 0xf5, 0x50, 0xff, 0x21, 0x90, 0xb0, + 0xff, 0xe1, 0x38, 0x48, 0x7f, 0xb0, 0xb4, 0x32, + 0x1f, 0xc8, 0x48, 0x74, 0x1f, 0xa0, 0xf6, 0x1b, + 0xf, 0x48, 0x58, 0x48, 0x6f, 0x55, 0xa1, 0x21, + 0xa4, 0x39, 0x60, 0xcc, 0x1d, 0x40, 0xff, 0x50, + 0x3e, 0x79, 0xc, 0xda, 0x18, /* U+0070 "p" */ - 0xfc, 0x15, 0xfa, 0x43, 0xfc, 0xe8, 0x66, 0x81, - 0xf9, 0x83, 0xf3, 0x87, 0xd0, 0x16, 0xf, 0x41, - 0xfb, 0xab, 0x83, 0x21, 0xf6, 0x1c, 0xc1, 0x90, - 0xe8, 0x3e, 0x43, 0x61, 0xc8, 0x7e, 0x42, 0x43, - 0xff, 0x85, 0x87, 0xff, 0x19, 0xf, 0xff, 0xf8, - 0x7f, 0xff, 0xc4, 0x3f, 0xfa, 0x8, 0x7e, 0x82, - 0x43, 0xa0, 0xf9, 0xd, 0x87, 0xb0, 0xe6, 0xc, - 0x87, 0xdd, 0x5c, 0x1a, 0xf, 0x20, 0x58, 0x39, - 0x41, 0xea, 0x7, 0xe6, 0xf, 0xce, 0x86, 0x78, - 0x3f, 0xeb, 0xf4, 0x1f, 0xff, 0xf0, 0xff, 0xff, - 0x87, 0xff, 0x3c, + 0xfc, 0x15, 0xfa, 0x43, 0xfd, 0x68, 0x66, 0x81, + 0xfa, 0x43, 0xf3, 0x7, 0xc8, 0x16, 0xe, 0x50, + 0x7c, 0xf5, 0x70, 0x68, 0x3e, 0x83, 0x98, 0x32, + 0x1d, 0x7, 0xc8, 0x6c, 0x39, 0xf, 0xd0, 0x48, + 0x7f, 0xf5, 0x50, 0xff, 0xff, 0x87, 0xff, 0xfc, + 0x43, 0xff, 0xb3, 0x4, 0x87, 0x41, 0xf2, 0x1b, + 0xe, 0x60, 0xe6, 0xc, 0x87, 0x9e, 0xae, 0xd, + 0x7, 0x90, 0x2c, 0x1c, 0xa0, 0xf4, 0x87, 0xe6, + 0xf, 0xd6, 0x86, 0x78, 0x3f, 0xeb, 0xf4, 0x1f, + 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, 0x3c, /* U+0071 "q" */ - 0xe, 0x7f, 0x48, 0x2f, 0x83, 0x3c, 0x19, 0xb0, - 0xfc, 0xc1, 0xfd, 0xa1, 0xe8, 0x39, 0x60, 0xfe, - 0x83, 0x3d, 0x5a, 0x1f, 0x21, 0x30, 0x74, 0x87, - 0x21, 0xa0, 0xfa, 0xe, 0xc2, 0x43, 0xff, 0x84, - 0x85, 0x87, 0xff, 0x65, 0xf, 0xff, 0xf8, 0x7f, - 0xf1, 0xd0, 0xff, 0xf4, 0x21, 0x61, 0xff, 0xc2, - 0xc2, 0x43, 0xff, 0x84, 0x86, 0x83, 0xe8, 0x3c, - 0x84, 0xc1, 0xd2, 0x1e, 0x83, 0x3d, 0x5a, 0x1f, - 0xa0, 0xe5, 0x83, 0xfc, 0xc1, 0xf9, 0xc3, 0xf3, - 0xc1, 0x9a, 0x7, 0xfc, 0xfe, 0x90, 0xff, 0xff, - 0x87, 0xff, 0xfc, 0x3f, 0xfa, 0x0, + 0xe, 0xbf, 0x90, 0x5f, 0x6, 0x74, 0x3a, 0xc3, + 0xf3, 0x7, 0xf6, 0x87, 0xa0, 0xe5, 0x83, 0xfa, + 0xc, 0xf5, 0x68, 0x7c, 0x84, 0xc1, 0xd2, 0x1c, + 0x86, 0x83, 0xe8, 0x3b, 0x9, 0xf, 0xfe, 0x12, + 0x16, 0x1f, 0xfd, 0x94, 0x3f, 0xff, 0xe1, 0xff, + 0xda, 0x43, 0xff, 0xaa, 0x85, 0x87, 0xff, 0xb, + 0x9, 0xf, 0xfe, 0x12, 0x1a, 0xf, 0xa0, 0xf2, + 0x13, 0x7, 0x48, 0x7a, 0xc, 0xf5, 0x68, 0x7e, + 0x83, 0x96, 0xf, 0xf3, 0x7, 0xe7, 0xf, 0xce, + 0x86, 0x68, 0x1f, 0xf5, 0xfa, 0x43, 0xff, 0xfe, + 0x1f, 0xff, 0xf0, 0xff, 0xe8, 0x0, /* U+0072 "r" */ - 0xfc, 0x7, 0xe8, 0x3a, 0x81, 0xfb, 0x43, 0xff, - 0x94, 0xfd, 0x7, 0x50, 0x3f, 0x28, 0x3f, 0xb0, - 0xff, 0x21, 0xff, 0xff, 0xf, 0xff, 0xf8, 0x7f, - 0xf7, 0xc0, + 0xfc, 0x7, 0xe4, 0x3a, 0x81, 0x61, 0xa4, 0x3f, + 0x90, 0xff, 0xe0, 0x3f, 0x41, 0xd4, 0xf, 0xca, + 0xf, 0xec, 0x3f, 0xc8, 0x7f, 0xff, 0xc3, 0xff, + 0xfe, 0x1f, 0xfd, 0xf0, /* U+0073 "s" */ 0xe, 0x6f, 0xd2, 0x1f, 0x9e, 0x43, 0x36, 0x1e, 0x60, 0xff, 0x68, 0x68, 0x32, 0xc1, 0xd0, 0x50, 0x6e, 0xae, 0xd, 0x1, 0xa, 0xe, 0x50, 0x48, 0x79, 0xf, 0x41, 0xff, 0xc6, 0x5c, 0x1e, 0x43, - 0xea, 0xc1, 0xe9, 0xf, 0xfe, 0x4, 0x1a, 0xd0, - 0xff, 0x30, 0x75, 0xa1, 0xfc, 0xe1, 0xeb, 0x83, - 0xfb, 0x83, 0xce, 0x87, 0xe7, 0x90, 0xea, 0x7, - 0xf3, 0x68, 0x65, 0x7, 0xfd, 0x40, 0xd0, 0x7f, - 0xf0, 0x18, 0x3b, 0xf0, 0x7e, 0x43, 0xf9, 0xf, - 0xfe, 0xa, 0x14, 0x1f, 0x21, 0xd0, 0x68, 0x3d, - 0x4, 0x81, 0x9, 0xf5, 0x3c, 0x1a, 0x4, 0x87, - 0x28, 0x3a, 0xd, 0x21, 0xfe, 0x90, 0xeb, 0x43, - 0x9b, 0x42, + 0xea, 0xc0, 0x42, 0x90, 0xff, 0xe0, 0x41, 0xad, + 0xf, 0xfa, 0xe, 0xb8, 0x3f, 0x9c, 0x3c, 0xf0, + 0x7f, 0x70, 0x79, 0xd0, 0xfc, 0xf2, 0x1d, 0x21, + 0xfc, 0xda, 0x1a, 0x43, 0xfe, 0xa0, 0x68, 0x3f, + 0xf8, 0xc, 0x1d, 0xf8, 0x3f, 0x21, 0xfc, 0x87, + 0xff, 0x5, 0xa, 0xf, 0x90, 0xe8, 0x34, 0x1e, + 0x82, 0x40, 0x84, 0xf5, 0x78, 0x34, 0x9, 0xc, + 0xb0, 0x74, 0x1a, 0x43, 0xfd, 0x21, 0xd6, 0x87, + 0x36, 0x84, /* U+0074 "t" */ 0xd, 0xf8, 0x3f, 0xfe, 0x9f, 0x83, 0x7e, 0xf, 0xfe, 0x62, 0xe0, 0xcb, 0xab, 0x6, 0xac, 0x1f, - 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, 0x99, 0xf, - 0xfa, 0xb0, 0x68, 0x32, 0xc1, 0x94, 0x1f, 0xf5, - 0x3, 0x20, + 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, 0x9a, 0xf, + 0x90, 0x9a, 0x83, 0x41, 0x96, 0xe, 0x83, 0xfe, + 0x60, 0xc8, /* U+0075 "u" */ 0xfc, 0x1f, 0xdf, 0x83, 0xff, 0xfe, 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xe4, - 0x3f, 0xf9, 0xa8, 0x72, 0x14, 0x1f, 0x41, 0xd8, - 0x68, 0x3b, 0xf, 0x21, 0x9e, 0x9e, 0xf, 0xd0, - 0x72, 0x83, 0xfc, 0xc1, 0xfd, 0x87, 0xce, 0x86, - 0x6c, 0x3c, + 0x3f, 0xfa, 0x68, 0x50, 0x7d, 0x87, 0x61, 0xa0, + 0xec, 0x3c, 0x86, 0x7a, 0x78, 0x3f, 0x41, 0xca, + 0xf, 0xf3, 0x7, 0xf6, 0x1f, 0x3a, 0x19, 0xb0, + 0xf0, /* U+0076 "v" */ - 0xfc, 0x87, 0xf7, 0xe2, 0xb, 0xf, 0xfe, 0x12, - 0x12, 0x1f, 0x90, 0x90, 0xff, 0xe1, 0x61, 0x60, - 0x42, 0x43, 0xe4, 0x24, 0x18, 0x58, 0x7f, 0xf0, - 0x90, 0x90, 0xf2, 0x14, 0x19, 0xf, 0xec, 0x24, - 0x36, 0x12, 0x1c, 0x87, 0xe4, 0x2c, 0x3f, 0x21, - 0xfc, 0x86, 0x42, 0xc3, 0xc8, 0x7d, 0x84, 0x87, - 0xb0, 0xa0, 0x90, 0x21, 0xf2, 0x12, 0x1e, 0xc3, - 0xf2, 0x1c, 0x84, 0x87, 0xec, 0x24, 0xc3, 0xff, - 0x80, 0x85, 0x88, 0x10, 0xff, 0xe0, 0xa1, 0xb0, - 0xff, 0x41, 0x41, 0x21, 0xfe, 0x42, 0x40, 0x87, - 0xff, 0x1b, 0xf, 0xfe, 0x2, 0x1c, 0x87, 0xff, - 0x3, 0xf, 0xfe, 0x32, 0x19, 0xf, 0xfe, 0x12, - 0x14, 0x1f, 0xfc, 0x2c, 0x3f, 0xe0, + 0xfc, 0x87, 0xf7, 0xe2, 0xb, 0xf, 0xc8, 0x72, + 0x12, 0x1f, 0xb0, 0x90, 0xff, 0xe3, 0x60, 0x42, + 0x43, 0xe4, 0x24, 0x18, 0x58, 0x7f, 0xf0, 0x90, + 0x90, 0xf2, 0x14, 0x19, 0xf, 0xec, 0x24, 0x36, + 0x12, 0x1c, 0x87, 0xe4, 0x2c, 0x3f, 0x21, 0xfc, + 0x86, 0x42, 0xc3, 0xc8, 0x48, 0x58, 0x48, 0x7b, + 0xb, 0x9, 0x2, 0x1f, 0x21, 0x21, 0xec, 0x3f, + 0x21, 0xc8, 0x48, 0x7e, 0xc2, 0x4c, 0x3f, 0xf8, + 0x8, 0x58, 0x81, 0xf, 0xfe, 0xa, 0x1b, 0xf, + 0xf4, 0x14, 0x12, 0x1f, 0xe4, 0x24, 0x8, 0x7f, + 0xf1, 0xb0, 0xff, 0xe0, 0x21, 0xc8, 0x7f, 0xf0, + 0x30, 0xff, 0xe3, 0x21, 0x90, 0xff, 0xe1, 0x21, + 0x41, 0xff, 0xc2, 0xc3, 0xfe, /* U+0077 "w" */ - 0xbe, 0x43, 0xf7, 0xc8, 0x7e, 0xfe, 0xb, 0xf, - 0x90, 0xb0, 0xf9, 0x9, 0x41, 0x21, 0xf6, 0x12, - 0x1f, 0x61, 0x61, 0xff, 0xc0, 0x43, 0xfe, 0x42, - 0x43, 0x90, 0xe4, 0x39, 0xf, 0xfe, 0x2, 0x1f, - 0xd8, 0x76, 0x1c, 0x84, 0x83, 0xb, 0xe, 0x43, - 0x90, 0xfe, 0xc0, 0x84, 0x87, 0xff, 0x17, 0x9, - 0xf, 0xf9, 0xa, 0x9, 0xc, 0x87, 0xc8, 0x48, - 0x58, 0x48, 0x58, 0x7c, 0x86, 0xc2, 0xc2, 0x40, - 0x88, 0x10, 0x90, 0xb0, 0xc8, 0x48, 0x7b, 0x30, - 0xf6, 0x12, 0x1f, 0xf2, 0x12, 0x21, 0x21, 0xff, - 0xc0, 0x43, 0xb0, 0xfe, 0xc0, 0x81, 0xf, 0x61, - 0x22, 0x4, 0x24, 0x8, 0x7f, 0xf0, 0x10, 0xb0, - 0xd8, 0x58, 0x64, 0x2c, 0x3f, 0xca, 0x9, 0x9, - 0x9, 0xc2, 0x43, 0xe4, 0x28, 0x3f, 0xe9, 0xf, - 0xfb, 0xf, 0x21, 0xc8, 0x79, 0xf, 0xc8, 0x7b, - 0xe, 0xc3, 0xd8, 0x7f, 0xf0, 0xd0, 0xe4, 0x3c, - 0x87, 0xf2, 0x1f, 0xfc, 0x4, 0x3f, 0xf8, 0x78, - 0x64, 0x3e, 0xc3, 0x21, 0xfe, 0x43, 0x61, 0xf2, - 0x1b, 0xf, 0xfe, 0x1a, 0x1f, 0xfc, 0x4, 0x3f, - 0xf9, 0x88, 0x7f, 0x0, + 0x3f, 0x7, 0xe7, 0xe0, 0xfc, 0xfd, 0x8, 0x48, + 0x7d, 0x84, 0x87, 0xd8, 0x59, 0x85, 0x87, 0xc8, + 0x58, 0x7c, 0x84, 0x88, 0x48, 0x7f, 0xc8, 0x7f, + 0xf3, 0x10, 0xff, 0xe1, 0xa1, 0x21, 0x21, 0xd8, + 0x72, 0x1c, 0x85, 0x85, 0x85, 0x87, 0x21, 0xd8, + 0x76, 0x12, 0x1f, 0xfc, 0x4, 0x3c, 0x87, 0x21, + 0xf2, 0x12, 0x1b, 0xa, 0xf, 0xf9, 0xf, 0xfe, + 0xa, 0x12, 0x12, 0x12, 0x1f, 0xc8, 0x48, 0x79, + 0xd, 0x7, 0xd8, 0x76, 0x16, 0x4, 0x2c, 0x43, + 0xd8, 0x48, 0x72, 0x12, 0xc, 0x24, 0xc2, 0x40, + 0x87, 0xff, 0x11, 0x2, 0x4, 0x2c, 0x39, 0xf, + 0x90, 0x90, 0xd8, 0x79, 0x10, 0xb0, 0xfb, 0xc, + 0x84, 0x84, 0x86, 0xc2, 0x43, 0xe4, 0x2f, 0x7, + 0xd8, 0x48, 0x7f, 0xf1, 0x14, 0x4, 0x32, 0x16, + 0x81, 0xf, 0xe4, 0x3d, 0x87, 0x20, 0x42, 0xc3, + 0xfb, 0xf, 0x21, 0xd8, 0x79, 0xf, 0xe4, 0x3f, + 0xf8, 0x8, 0x7f, 0xf2, 0x90, 0xff, 0xe0, 0x21, + 0xff, 0x21, 0xb0, 0xf9, 0xd, 0x87, 0xfd, 0x86, + 0x43, 0xec, 0x32, 0x1f, 0xf2, 0x1f, 0xfc, 0x4, + 0x3f, 0xf9, 0x8, 0x7f, 0xf0, 0x10, 0xf0, /* U+0078 "x" */ 0x7f, 0x21, 0xf3, 0xf9, 0x41, 0xa0, 0xfa, 0xc, @@ -1176,231 +1176,231 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x1f, 0x28, 0x24, 0x42, 0x50, 0x7a, 0x9, 0x9, 0xa, 0xe, 0x43, 0x41, 0x41, 0x90, 0xd0, 0x48, 0x72, 0x14, 0x12, 0x1a, 0xe, 0x83, 0x20, 0x82, - 0x43, 0xe4, 0x28, 0x43, 0x61, 0xf4, 0x19, + 0x43, 0xe4, 0x28, 0x43, 0x61, 0xf4, 0x1a, /* U+0079 "y" */ - 0x3f, 0x21, 0xfa, 0xfc, 0x1d, 0x87, 0xe4, 0x24, - 0x42, 0x43, 0xff, 0x81, 0x98, 0x7f, 0xc8, 0x64, - 0x43, 0x21, 0xec, 0x24, 0x24, 0x2c, 0x3c, 0x85, - 0x85, 0x84, 0x87, 0xf9, 0x9, 0xf, 0xfe, 0x5a, - 0x19, 0x9, 0xe, 0x42, 0xc3, 0x61, 0x61, 0xd8, - 0x48, 0x64, 0x24, 0x39, 0xf, 0xfe, 0x3a, 0x12, - 0x4, 0x28, 0x3e, 0xc2, 0xc1, 0x84, 0x87, 0xc8, - 0x48, 0x10, 0xff, 0xe4, 0xa1, 0xfc, 0x84, 0xa0, - 0xb0, 0xfe, 0x82, 0xf0, 0x48, 0x7f, 0xf0, 0x54, - 0x1f, 0xfc, 0x24, 0x3c, 0x87, 0xfd, 0x87, 0xa0, - 0xff, 0x90, 0xff, 0xe6, 0x21, 0xff, 0xc1, 0x43, - 0x61, 0xff, 0xc1, 0x83, 0x21, 0xff, 0xd8, 0x43, - 0xff, 0x8d, 0x87, 0xff, 0xa, 0x9, 0xf, 0xfe, - 0x12, 0x4, 0x3f, 0xf8, 0xd8, 0x7f, 0xf0, 0xb0, - 0x90, 0xff, 0xe0, 0x38, 0x48, 0x7f, 0xde, 0x83, - 0x41, 0xff, 0xc5, 0x83, 0xff, 0x8b, 0x21, 0xff, - 0xc0, 0xad, 0xa1, 0xff, 0x0, + 0x3f, 0x21, 0xf9, 0xfc, 0x4, 0x2c, 0x3f, 0x61, + 0x20, 0xc2, 0x43, 0xf2, 0x16, 0x4, 0x3f, 0xf8, + 0x88, 0x7c, 0x87, 0x90, 0xfc, 0x85, 0x87, 0xb0, + 0x90, 0xd8, 0x48, 0x79, 0xb, 0xc, 0x87, 0xff, + 0x9, 0xe, 0x42, 0x43, 0x21, 0x21, 0xec, 0x2c, + 0x36, 0x16, 0x1e, 0x42, 0x43, 0x21, 0x21, 0xff, + 0xcf, 0x42, 0x40, 0x84, 0x87, 0xec, 0x2c, 0x18, + 0x58, 0x7e, 0x42, 0x40, 0x84, 0x87, 0xf2, 0x1f, + 0x90, 0xff, 0x61, 0x28, 0x2c, 0x3f, 0xc8, 0x5e, + 0x9, 0xf, 0xfe, 0x12, 0x83, 0xff, 0x86, 0x87, + 0x90, 0xff, 0xe0, 0x41, 0xec, 0x3f, 0xf8, 0xe8, + 0x7f, 0xf0, 0x50, 0xff, 0xe3, 0xe1, 0x90, 0xff, + 0xe1, 0x21, 0xa0, 0xff, 0xed, 0x21, 0xff, 0xc7, + 0xc3, 0xff, 0x86, 0x84, 0x87, 0xff, 0xe, 0xf, + 0xfe, 0x32, 0x12, 0x1f, 0xfc, 0x38, 0x28, 0x3f, + 0xe5, 0x58, 0x48, 0x7f, 0xf0, 0x28, 0x86, 0x83, + 0xff, 0x8d, 0x7, 0xff, 0x1a, 0x43, 0xff, 0x83, + 0xd5, 0xa1, 0xff, 0xc0, /* U+007A "z" */ - 0xff, 0xfe, 0x20, 0x7f, 0xf5, 0xd7, 0xfe, 0xc, - 0x95, 0xfe, 0xc3, 0x41, 0xff, 0x41, 0x21, 0xff, - 0x21, 0xa0, 0xff, 0xa0, 0xa0, 0xff, 0xa0, 0xc8, - 0x7f, 0xc8, 0x58, 0x7f, 0xd8, 0x48, 0x7f, 0xc8, - 0x68, 0x3f, 0xe8, 0x28, 0x3f, 0xe8, 0x32, 0x1f, - 0xf2, 0x14, 0x1f, 0xf4, 0x12, 0x83, 0xfc, 0xa0, - 0xa0, 0xff, 0xa0, 0xa0, 0xff, 0x90, 0xc8, 0x7f, - 0xd0, 0x50, 0x7f, 0xd0, 0x4a, 0xf, 0xf9, 0xa, - 0xf, 0xfb, 0xd, 0x5f, 0xfc, 0x0, 0xe5, 0xff, + 0xff, 0xfe, 0x24, 0x1f, 0xfd, 0x65, 0xff, 0xe0, + 0x6, 0xeb, 0xfe, 0xc, 0xa0, 0xff, 0x90, 0xa0, + 0xff, 0xb0, 0x90, 0xff, 0x90, 0xd0, 0x7f, 0xd0, + 0x50, 0x7f, 0xd0, 0x64, 0x3f, 0xca, 0xb, 0xf, + 0xfa, 0x9, 0xf, 0xfa, 0xd, 0x7, 0xfc, 0x85, + 0x7, 0xfd, 0x86, 0x43, 0xfc, 0x86, 0xc3, 0xfe, + 0x82, 0x43, 0xfe, 0x83, 0x41, 0xfe, 0x50, 0x50, + 0x7f, 0xd0, 0x64, 0x3f, 0xd0, 0x6c, 0x3f, 0xe4, + 0x24, 0x3f, 0xec, 0x3a, 0xbf, 0xe0, 0xe5, 0xff, 0xe0, 0x7, 0xff, 0x58, /* U+007B "{" */ - 0xf, 0xe6, 0x43, 0xfa, 0x8e, 0x1f, 0xb4, 0x8, - 0x7d, 0x84, 0xe1, 0xe8, 0x26, 0xf, 0x90, 0xa0, - 0xf9, 0xf, 0xfe, 0x6, 0x12, 0x1f, 0x90, 0xb0, - 0xff, 0xe6, 0xa1, 0xff, 0xff, 0xf, 0xfe, 0x5a, - 0x1f, 0xfc, 0xc, 0x24, 0x3e, 0x50, 0x50, 0x75, - 0xc1, 0x21, 0xe4, 0x33, 0x7, 0xfd, 0x7, 0xff, - 0x3, 0xf, 0xb8, 0x36, 0x1f, 0x38, 0x64, 0x3f, - 0x41, 0x61, 0xf9, 0x9, 0xf, 0xff, 0xf8, 0x7f, - 0xf4, 0x50, 0xff, 0xe4, 0xa1, 0xff, 0xc0, 0xc2, - 0xc3, 0xf2, 0x12, 0x1f, 0xfc, 0x14, 0x3f, 0x61, - 0x41, 0xfd, 0x5, 0xc1, 0xf3, 0x4, 0x87, 0xe7, - 0x48, 0x3f, 0xd6, 0x80, + 0xf, 0xfe, 0x4b, 0xa1, 0xfb, 0x8c, 0x3c, 0xe1, + 0xfe, 0x82, 0xa0, 0x74, 0x12, 0x83, 0xc8, 0x50, + 0x79, 0x9, 0xf, 0xb0, 0xb0, 0xf9, 0xf, 0xfe, + 0x1a, 0x1f, 0xff, 0xf0, 0xff, 0xe7, 0xa1, 0xff, + 0x41, 0x41, 0xe8, 0x32, 0x1a, 0xd0, 0xa0, 0xe4, + 0x34, 0x87, 0xff, 0x15, 0xd, 0x21, 0xd7, 0x5, + 0x7, 0xca, 0xa, 0xf, 0xb0, 0x90, 0xf9, 0xf, + 0xff, 0xf8, 0x7f, 0xf6, 0x50, 0xf9, 0xf, 0xfb, + 0xb, 0xf, 0x90, 0x90, 0xfc, 0x85, 0x7, 0xd0, + 0x4c, 0x1f, 0x61, 0x38, 0x7d, 0xa0, 0x43, 0xf5, + 0x1c, /* U+007C "|" */ 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, 0x97, 0x0, /* U+007D "}" */ - 0x34, 0x3f, 0x92, 0xc3, 0xf6, 0x16, 0x87, 0xa8, - 0x14, 0x1f, 0x28, 0x2c, 0x3e, 0x83, 0xff, 0x80, - 0x85, 0x7, 0xd8, 0x48, 0x7c, 0x87, 0xff, 0xfc, - 0x3f, 0xfb, 0x28, 0x7c, 0x85, 0x87, 0xd8, 0x48, - 0x7c, 0x86, 0x83, 0xe8, 0x27, 0x83, 0x98, 0x32, - 0x1e, 0x50, 0x7f, 0xb4, 0x3f, 0xa0, 0xd6, 0x1c, - 0x85, 0xa1, 0xd0, 0x48, 0x7c, 0x85, 0x87, 0xff, - 0x2d, 0xf, 0xff, 0xf8, 0x7f, 0xf0, 0xd0, 0xff, - 0xb0, 0x90, 0xf9, 0xb, 0xf, 0xf9, 0xf, 0x61, - 0x41, 0xce, 0x12, 0x83, 0xb0, 0x98, 0x3d, 0x82, - 0x81, 0xf3, 0xe4, 0x3f, 0x0, + 0xf, 0xfe, 0xf, 0x7, 0xf4, 0x3a, 0x1f, 0xf4, + 0x87, 0xa8, 0x14, 0x1f, 0x30, 0x58, 0x7c, 0x86, + 0x43, 0xe4, 0x2c, 0x3e, 0xc2, 0x43, 0xe4, 0x3f, + 0xff, 0xe1, 0xff, 0xd9, 0x43, 0xe4, 0x2c, 0x3e, + 0xc2, 0x43, 0xe4, 0x34, 0x1f, 0x61, 0x3c, 0x1e, + 0x83, 0x21, 0xe4, 0x3f, 0xec, 0x3f, 0xd8, 0x4f, + 0x83, 0x21, 0xa0, 0xf6, 0x12, 0x1f, 0x21, 0x61, + 0xff, 0x21, 0xff, 0xff, 0xf, 0xfe, 0x7a, 0x1f, + 0xf6, 0x12, 0x1f, 0x21, 0x61, 0xe4, 0x32, 0x1c, + 0xc1, 0x61, 0xd4, 0xa, 0xf, 0xf4, 0x87, 0xa1, + 0xd0, 0xfd, 0xc1, 0xfc, /* U+007E "~" */ - 0xd, 0x7d, 0x7, 0xf9, 0x60, 0x3a, 0x13, 0xa1, - 0xfa, 0xa0, 0x41, 0xf5, 0x3, 0xc8, 0x6c, 0x32, - 0x82, 0x60, 0xec, 0xa, 0xd, 0xd3, 0x9, 0x82, - 0x50, 0x3c, 0x14, 0x1b, 0x9, 0xea, 0x9, 0x41, - 0x21, 0xd8, 0x65, 0x5, 0x87, 0xff, 0x3, 0xf, - 0xa0, 0x75, 0x7, 0xee, 0x9, 0xd0, 0x0, + 0xd, 0x7d, 0x7, 0xf9, 0x60, 0x3a, 0x13, 0xc1, + 0xfa, 0xa0, 0x41, 0xf3, 0x7, 0xfd, 0x86, 0x50, + 0x4c, 0x1d, 0x1, 0x41, 0xba, 0x61, 0x30, 0x4a, + 0x7, 0x82, 0x43, 0x61, 0x3d, 0x41, 0x28, 0x2c, + 0x3b, 0xc, 0xa0, 0xb0, 0xe4, 0x3d, 0x87, 0xd0, + 0x2b, 0x7, 0xed, 0x9, 0xd0, 0x0, /* U+00A0 " " */ /* U+00A1 "¡" */ - 0x3e, 0x30, 0xb0, 0xff, 0x61, 0x67, 0xc1, 0xff, - 0xca, 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xf0, 0x80, + 0x7c, 0x90, 0x20, 0xff, 0xa0, 0x43, 0xe4, 0x3f, + 0xf9, 0x3f, 0x83, 0xff, 0xfe, 0x1f, 0xfe, 0x20, /* U+00A3 "£" */ - 0xf, 0xcd, 0xfa, 0xf, 0xfe, 0x3, 0xc8, 0x67, - 0x83, 0xfa, 0x81, 0xfc, 0xe1, 0xf2, 0x83, 0x2c, - 0x1d, 0x7, 0xa0, 0xdd, 0x58, 0x64, 0x39, 0xd, - 0x87, 0x61, 0xa0, 0xd0, 0x48, 0x7c, 0x84, 0x87, - 0xe8, 0x3e, 0xc3, 0xff, 0x90, 0xbc, 0x1f, 0xfc, - 0x5a, 0xc1, 0xff, 0xff, 0xf, 0xfe, 0x9d, 0x41, - 0xab, 0xc1, 0xf9, 0x60, 0xcb, 0xe0, 0xff, 0xf3, - 0x7c, 0x1b, 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xff, - 0x87, 0xc8, 0x7f, 0xf7, 0x60, 0xa0, 0xff, 0xe1, - 0x50, 0x37, 0x5f, 0xfc, 0x25, 0x6, 0x5f, 0xfe, - 0x18, 0x7f, 0xf7, 0x80, + 0xf, 0xcd, 0xfa, 0x43, 0xff, 0x81, 0xc8, 0x66, + 0x81, 0xfc, 0xe1, 0xfc, 0xe1, 0xfa, 0xc, 0xb0, + 0x74, 0x1e, 0x83, 0x75, 0x68, 0x48, 0x79, 0xa, + 0xe, 0x83, 0x41, 0xa0, 0xc8, 0x7a, 0x9, 0xc, + 0x85, 0x7, 0xc8, 0x7f, 0xf2, 0x57, 0x7, 0xe4, + 0x3f, 0x56, 0xf, 0xff, 0xf8, 0x7f, 0xf4, 0xea, + 0xd, 0x5e, 0xf, 0xcb, 0x6, 0x5f, 0x83, 0xff, + 0xcb, 0xf0, 0x6f, 0xf2, 0x1f, 0xff, 0xf0, 0xff, + 0xff, 0x87, 0xff, 0x3d, 0x9, 0xf, 0xfe, 0x24, + 0x16, 0x1f, 0xfc, 0x2a, 0x6, 0xeb, 0xff, 0x84, + 0xa0, 0xcb, 0xff, 0xc3, 0xf, 0xfe, 0xf0, /* U+00B0 "°" */ 0xc, 0xd1, 0xf, 0x3c, 0xab, 0x42, 0x60, 0xf4, 0x82, 0xf, 0xd1, 0x5, 0x7a, 0xa, 0x41, 0x20, 0x60, 0x21, 0x21, 0x90, 0xff, 0xe3, 0x41, 0xa0, 0x30, 0x1e, 0x9a, 0xd, 0xc, 0xa0, 0x94, 0x61, - 0xf3, 0x5, 0xc1, 0xa8, 0x0, + 0xfa, 0xb, 0x83, 0x58, 0x0, /* U+00B1 "±" */ - 0xf, 0xbf, 0x7, 0xff, 0xfc, 0x3f, 0xff, 0xe1, - 0xff, 0xc7, 0xff, 0x83, 0x7f, 0xc1, 0xff, 0xd8, - 0x5f, 0x83, 0x2f, 0xd5, 0xf0, 0x6a, 0xf8, 0x3f, - 0xff, 0xe1, 0xff, 0xff, 0x3f, 0x7, 0xff, 0x82, - 0xbf, 0xf8, 0x80, 0x5f, 0xfe, 0x20, 0x7f, 0xf6, - 0x40, + 0xf, 0xdf, 0x83, 0xff, 0xfe, 0x1f, 0xff, 0xf0, + 0xff, 0xe8, 0x5f, 0xf0, 0x6f, 0xf4, 0x1f, 0xfd, + 0xad, 0x7e, 0xc, 0xbe, 0xda, 0xf8, 0x35, 0x79, + 0xf, 0xff, 0xf8, 0x7f, 0xff, 0xc3, 0xfd, 0x58, + 0x3f, 0xf8, 0x6b, 0x83, 0xff, 0x9f, 0x5f, 0xfc, + 0x40, 0x97, 0xff, 0x88, 0x1f, 0xfd, 0xc0, /* U+00B2 "²" */ - 0x9, 0xfd, 0x7, 0x70, 0x67, 0x41, 0x87, 0xe8, - 0x43, 0x30, 0x6b, 0xa, 0x8e, 0x12, 0x82, 0x43, - 0xea, 0xc1, 0xf9, 0x70, 0x48, 0x48, 0x7d, 0x5, - 0x7, 0xa0, 0x90, 0xf4, 0x81, 0x83, 0xa4, 0x28, - 0x3a, 0x42, 0xc3, 0x94, 0x16, 0x1c, 0xc1, 0x61, - 0xcc, 0x12, 0xfd, 0x6, 0x6b, 0xc1, 0xff, 0xcc, + 0x9, 0xfd, 0x7, 0x70, 0x67, 0x41, 0x87, 0xe9, + 0x82, 0x7d, 0x5, 0xa1, 0x40, 0x50, 0x10, 0x90, + 0xfd, 0xf4, 0x1f, 0xfc, 0x35, 0x1, 0xf, 0xa0, + 0xa0, 0xf6, 0x16, 0x1e, 0xc2, 0x83, 0xd8, 0x52, + 0x1d, 0x85, 0x21, 0xd8, 0x52, 0x1d, 0x85, 0x21, + 0xd8, 0x6b, 0xfc, 0x1f, 0xfc, 0xc0, /* U+00B3 "³" */ - 0xa, 0xfd, 0x6, 0x74, 0x33, 0xa0, 0x83, 0xf4, - 0x41, 0xa8, 0x1a, 0x42, 0xd5, 0x6, 0xac, 0x12, - 0x12, 0xf0, 0x7c, 0x87, 0xd0, 0x50, 0x6f, 0x90, - 0x41, 0xfe, 0x90, 0xff, 0x58, 0x77, 0xd0, 0x50, - 0x7c, 0x84, 0xd6, 0xf, 0xcb, 0x83, 0xf2, 0x16, - 0xac, 0x26, 0xd, 0x40, 0xd1, 0x7, 0xe8, 0xe, - 0x86, 0x74, + 0x3, 0x7e, 0x83, 0x51, 0xc, 0xe0, 0x50, 0x7e, + 0xc8, 0x2b, 0xc8, 0x48, 0x52, 0x8, 0x37, 0xc8, + 0x7f, 0xf0, 0xe0, 0x90, 0xdf, 0x20, 0x83, 0x21, + 0xca, 0xc, 0x87, 0x38, 0x77, 0xd0, 0x50, 0x7c, + 0xa0, 0x2e, 0xf, 0xea, 0xc1, 0xf9, 0x2, 0x80, + 0xa0, 0x30, 0x57, 0xa0, 0xa2, 0xf, 0xd0, 0x1d, + 0xc, 0xe8, /* U+00B5 "µ" */ 0xfc, 0x1f, 0xdf, 0x83, 0xff, 0xfe, 0x1f, 0xff, - 0xf0, 0xff, 0xff, 0x87, 0xff, 0x59, 0xf, 0xff, - 0x36, 0x1f, 0x21, 0xf9, 0xf, 0xa0, 0xfe, 0xc3, - 0xb0, 0xff, 0xba, 0xb0, 0xff, 0xe0, 0xac, 0x1f, - 0xfc, 0x7c, 0x3f, 0x70, 0x67, 0xf, 0xf3, 0xfa, - 0x7, 0xe0, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x20, + 0xf0, 0xff, 0xff, 0x87, 0xff, 0x15, 0xf, 0xff, + 0xbe, 0x1f, 0x21, 0xf9, 0xf, 0xa0, 0xfe, 0x83, + 0xa0, 0xff, 0x3d, 0x5a, 0x1f, 0xfc, 0x5, 0x83, + 0xff, 0x8f, 0x87, 0xee, 0xc, 0xe1, 0xfe, 0x7f, + 0x40, 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x84, /* U+00BF "¿" */ - 0xf, 0xbc, 0x87, 0xff, 0x7, 0x4, 0x1f, 0xfe, - 0x3c, 0x10, 0x7f, 0xf0, 0xbc, 0x87, 0xff, 0xfc, - 0x3d, 0xf8, 0x3f, 0xfa, 0x28, 0x7f, 0xf5, 0x60, - 0x90, 0xff, 0x90, 0xd0, 0x7f, 0xd0, 0x48, 0x7f, - 0xd8, 0x68, 0x3f, 0xc8, 0x68, 0x3f, 0xe8, 0x25, - 0x7, 0xfa, 0xd, 0x7, 0xfc, 0x85, 0x7, 0xfc, - 0x86, 0x43, 0xfe, 0xc2, 0x43, 0xff, 0x80, 0x85, - 0x87, 0xff, 0x55, 0xf, 0x97, 0x7, 0x21, 0xf5, - 0x60, 0xff, 0xe0, 0x21, 0xc8, 0x50, 0x7b, 0xe, - 0x83, 0x41, 0xa4, 0x28, 0x8, 0x4f, 0x4d, 0xc, - 0x82, 0xe, 0x50, 0x76, 0x1b, 0xf, 0xf6, 0x1e, - 0xe4, 0x33, 0x61, 0x80, + 0xf, 0x3e, 0x43, 0xff, 0x83, 0x2, 0xf, 0xff, + 0x1c, 0x8, 0x3f, 0xf8, 0x2f, 0x90, 0xff, 0xff, + 0x87, 0xbf, 0x7, 0xff, 0x89, 0xf, 0xfe, 0x24, + 0x12, 0x1f, 0xf2, 0x1a, 0xf, 0xfa, 0x9, 0xf, + 0xfb, 0xd, 0x7, 0xf9, 0xd, 0x7, 0xfd, 0x4, + 0xa0, 0xff, 0x41, 0xa0, 0xff, 0x90, 0xa0, 0xff, + 0x90, 0xc8, 0x7f, 0xd8, 0x48, 0x7f, 0xf0, 0x10, + 0xb0, 0xff, 0xe2, 0x21, 0xff, 0xcc, 0x5c, 0x1c, + 0x87, 0xd5, 0x83, 0xff, 0x80, 0x87, 0x21, 0x41, + 0xec, 0x3a, 0xd, 0x6, 0x90, 0xa0, 0x21, 0x3d, + 0x34, 0x32, 0x8, 0x39, 0x41, 0xd8, 0x6c, 0x3f, + 0xd8, 0x7b, 0x90, 0xcd, 0x86, /* U+00C0 "À" */ - 0xf, 0x35, 0x21, 0xff, 0xc9, 0xd6, 0xa0, 0x7f, - 0xf2, 0x24, 0x24, 0x3f, 0xf9, 0x30, 0x6c, 0x3f, - 0xf9, 0x38, 0x64, 0x3f, 0xf9, 0x38, 0x50, 0x7f, - 0xf2, 0xb0, 0xa0, 0xff, 0xe5, 0x4a, 0xf, 0xfe, - 0x5b, 0x50, 0x7f, 0xf9, 0x3f, 0x7, 0xff, 0x25, - 0xf, 0xfe, 0x6c, 0x1a, 0xf, 0xfe, 0x6a, 0x1f, - 0xfc, 0x74, 0x3f, 0xf9, 0xb0, 0x79, 0xf, 0xfe, - 0x4a, 0x14, 0x1f, 0xfc, 0x54, 0x2d, 0xf, 0xfe, - 0x46, 0x13, 0x84, 0x87, 0xff, 0x11, 0xc, 0x85, - 0x7, 0xff, 0xd, 0x9, 0xf, 0xfe, 0x4e, 0x14, - 0x8, 0x24, 0x3f, 0xf8, 0x48, 0x79, 0xb, 0xf, - 0xfe, 0xa, 0x12, 0x1f, 0x21, 0xff, 0xc1, 0xc2, - 0xc3, 0x21, 0x21, 0xff, 0xc0, 0x42, 0x43, 0x61, - 0x61, 0xff, 0x21, 0x21, 0xc8, 0x48, 0x7f, 0xd8, - 0x58, 0x79, 0x9, 0xf, 0xf2, 0x12, 0x1e, 0xc2, - 0xc3, 0xf9, 0xf, 0xf9, 0x9, 0xf, 0xec, 0x28, - 0x3f, 0xf8, 0x8, 0x7e, 0x42, 0xeb, 0xf0, 0x6c, - 0x3e, 0x43, 0x2f, 0xf0, 0x64, 0x3e, 0xc3, 0xff, - 0x8c, 0x87, 0x90, 0xff, 0xe3, 0x61, 0xfe, 0xff, - 0xfe, 0x0, 0x48, 0x74, 0x12, 0x1f, 0xfc, 0x44, - 0x32, 0x16, 0x1f, 0xfc, 0x4, 0x2c, 0x3f, 0x21, - 0xff, 0xc0, 0xc2, 0x42, 0x83, 0xff, 0x8a, 0x87, - 0xc8, 0x50, 0x7f, 0xf0, 0x90, 0xa0, 0xf2, 0x1f, - 0xfc, 0x2c, 0x24, 0x83, 0xff, 0x8e, 0x87, 0x21, - 0x21, 0xff, 0xc8, 0x80, + 0xf, 0x35, 0x83, 0xff, 0x94, 0xba, 0xf, 0xfe, + 0x43, 0x4, 0xa0, 0xff, 0xe4, 0x28, 0x28, 0x3f, + 0xf9, 0x32, 0x14, 0x1f, 0xfc, 0x98, 0x24, 0x3f, + 0xf9, 0x58, 0x58, 0x7f, 0xf2, 0xb5, 0x83, 0xff, + 0x97, 0x50, 0x7f, 0xf9, 0x3f, 0x7, 0xff, 0x25, + 0xc, 0x87, 0xff, 0x23, 0xd, 0x87, 0xff, 0x21, + 0xc, 0x87, 0xff, 0x39, 0xf, 0xfe, 0x34, 0x1e, + 0xc3, 0xff, 0x8c, 0x87, 0x90, 0xff, 0xe4, 0xa8, + 0x3f, 0xf9, 0x10, 0x5e, 0xa, 0xf, 0xfe, 0x22, + 0x12, 0x82, 0x43, 0xff, 0x8e, 0x81, 0xf, 0xfe, + 0x34, 0x16, 0xc, 0x24, 0x3f, 0xf8, 0x48, 0x48, + 0x10, 0xa0, 0xff, 0xed, 0xa1, 0x21, 0x90, 0x90, + 0xff, 0xe0, 0x41, 0x41, 0xb0, 0xb0, 0xff, 0xe4, + 0xa1, 0x21, 0xff, 0x21, 0x21, 0xe4, 0x24, 0x3f, + 0xd0, 0x58, 0x7b, 0xb, 0xf, 0xfe, 0x12, 0x1e, + 0x42, 0x43, 0xf9, 0x9, 0xf, 0xfe, 0x4c, 0x13, + 0x5f, 0x83, 0x41, 0xff, 0xc1, 0x5f, 0xc1, 0x90, + 0xf9, 0xf, 0xfe, 0x6e, 0x1f, 0xfc, 0x64, 0x3c, + 0x85, 0xff, 0xf4, 0x14, 0x1c, 0x87, 0xff, 0xd, + 0xf, 0xec, 0x24, 0x3f, 0xf8, 0x88, 0x64, 0x2c, + 0x3f, 0xf8, 0x8, 0x58, 0x48, 0x64, 0x3f, 0xf8, + 0x18, 0x48, 0x58, 0x48, 0x7f, 0xf0, 0x50, 0xc8, + 0x10, 0xb0, 0xff, 0xe1, 0x21, 0x62, 0x19, 0xf, + 0xfe, 0x16, 0x12, 0x61, 0x21, 0xff, 0xc3, 0x43, + 0x20, /* U+00C1 "Á" */ - 0xf, 0xfe, 0x1b, 0x52, 0x1f, 0xfc, 0x8a, 0x2c, - 0x1f, 0xfc, 0x94, 0x25, 0x7, 0xff, 0x1f, 0x9, - 0x83, 0xff, 0x8f, 0x4, 0xc1, 0xff, 0xc8, 0x42, - 0x83, 0xff, 0x91, 0x85, 0x87, 0xff, 0x25, 0x6c, - 0x3f, 0xf9, 0x55, 0x7, 0xff, 0x97, 0xf0, 0x7f, - 0xf2, 0x50, 0xff, 0xe6, 0xc1, 0xa0, 0xff, 0xe6, - 0xa1, 0xff, 0xc7, 0x43, 0xff, 0x9b, 0x7, 0x90, - 0xff, 0xe4, 0xa1, 0x41, 0xff, 0xc5, 0x42, 0xd0, - 0xff, 0xe4, 0x61, 0x38, 0x48, 0x7f, 0xf1, 0x10, - 0xc8, 0x50, 0x7f, 0xf0, 0xd0, 0x90, 0xff, 0xe4, - 0xe1, 0x40, 0x82, 0x43, 0xff, 0x84, 0x87, 0x90, - 0xb0, 0xff, 0xe0, 0xa1, 0x21, 0xf2, 0x1f, 0xfc, - 0x1c, 0x2c, 0x32, 0x12, 0x1f, 0xfc, 0x4, 0x24, - 0x36, 0x16, 0x1f, 0xf2, 0x12, 0x1c, 0x84, 0x87, - 0xfd, 0x85, 0x87, 0x90, 0x90, 0xff, 0x21, 0x21, - 0xec, 0x2c, 0x3f, 0x90, 0xff, 0x90, 0x90, 0xfe, - 0xc2, 0x83, 0xff, 0x80, 0x87, 0xe4, 0x2e, 0xbf, - 0x6, 0xc3, 0xe4, 0x32, 0xff, 0x6, 0x43, 0xec, - 0x3f, 0xf8, 0xc8, 0x79, 0xf, 0xfe, 0x36, 0x1f, - 0xef, 0xff, 0xe0, 0x4, 0x87, 0x41, 0x21, 0xff, - 0xc4, 0x43, 0x21, 0x61, 0xff, 0xc0, 0x42, 0xc3, - 0xf2, 0x1f, 0xfc, 0xc, 0x24, 0x28, 0x3f, 0xf8, - 0xa8, 0x7c, 0x85, 0x7, 0xff, 0x9, 0xa, 0xf, - 0x21, 0xff, 0xc2, 0xc2, 0x48, 0x3f, 0xf8, 0xe8, - 0x72, 0x12, 0x1f, 0xfc, 0x88, + 0xf, 0xfe, 0x1b, 0x52, 0x1f, 0xfc, 0x86, 0x58, + 0x3f, 0xf9, 0x30, 0x52, 0x1f, 0xfc, 0x78, 0x25, + 0x7, 0xff, 0x1d, 0x40, 0x60, 0xff, 0xe4, 0x41, + 0x41, 0xff, 0xc8, 0x82, 0xc3, 0xff, 0x93, 0xab, + 0xf, 0xfe, 0x53, 0x40, 0xff, 0xf2, 0xfe, 0xf, + 0xfe, 0x4a, 0x19, 0xf, 0xfe, 0x46, 0x1b, 0xf, + 0xfe, 0x42, 0x19, 0xf, 0xfe, 0x72, 0x1f, 0xfc, + 0x68, 0x3d, 0x87, 0xff, 0x19, 0xf, 0x21, 0xff, + 0xc9, 0x50, 0x7f, 0xf2, 0x20, 0xbc, 0x14, 0x1f, + 0xfc, 0x44, 0x25, 0x4, 0x87, 0xff, 0x1d, 0x2, + 0x1f, 0xfc, 0x68, 0x2c, 0x18, 0x48, 0x7f, 0xf0, + 0x90, 0x90, 0x21, 0x41, 0xff, 0xdb, 0x42, 0x43, + 0x21, 0x21, 0xff, 0xc0, 0x82, 0x83, 0x61, 0x61, + 0xff, 0xc9, 0x42, 0x43, 0xfe, 0x42, 0x43, 0xc8, + 0x48, 0x7f, 0xa0, 0xb0, 0xf6, 0x16, 0x1f, 0xfc, + 0x24, 0x3c, 0x84, 0x87, 0xf2, 0x12, 0x1f, 0xfc, + 0x98, 0x26, 0xbf, 0x6, 0x83, 0xff, 0x82, 0xbf, + 0x83, 0x21, 0xf2, 0x1f, 0xfc, 0xdc, 0x3f, 0xf8, + 0xc8, 0x79, 0xb, 0xff, 0xe8, 0x28, 0x39, 0xf, + 0xfe, 0x1a, 0x1f, 0xd8, 0x48, 0x7f, 0xf1, 0x10, + 0xc8, 0x58, 0x7f, 0xf0, 0x10, 0xb0, 0x90, 0xc8, + 0x7f, 0xf0, 0x30, 0x90, 0xb0, 0x90, 0xff, 0xe0, + 0xa1, 0x90, 0x21, 0x61, 0xff, 0xc2, 0x42, 0xc4, + 0x32, 0x1f, 0xfc, 0x2c, 0x24, 0xc2, 0x43, 0xff, + 0x86, 0x86, 0x40, /* U+00C2 "Â" */ - 0xf, 0xf9, 0xa0, 0x7f, 0xf2, 0xe5, 0x61, 0xff, - 0xc9, 0xc3, 0x41, 0xff, 0xc7, 0x80, 0x81, 0x41, - 0xff, 0xc5, 0x50, 0x2c, 0x10, 0x7f, 0xf1, 0x60, - 0x60, 0x81, 0x87, 0xff, 0xf, 0x2, 0x12, 0x81, - 0x7, 0xff, 0xb, 0xe8, 0x35, 0xe8, 0x3f, 0xff, - 0x5f, 0x83, 0xff, 0x92, 0x87, 0xff, 0x36, 0xd, - 0x7, 0xff, 0x35, 0xf, 0xfe, 0x3a, 0x1f, 0xfc, - 0xd8, 0x3c, 0x87, 0xff, 0x25, 0xa, 0xf, 0xfe, - 0x2a, 0x16, 0x87, 0xff, 0x23, 0x9, 0xc2, 0x43, - 0xff, 0x88, 0x86, 0x42, 0x83, 0xff, 0x86, 0x84, - 0x87, 0xff, 0x27, 0xa, 0x4, 0x12, 0x1f, 0xfc, - 0x24, 0x3c, 0x85, 0x87, 0xff, 0x5, 0x9, 0xf, - 0x90, 0xff, 0xe0, 0xe1, 0x61, 0x90, 0x90, 0xff, - 0xe0, 0x21, 0x21, 0xb0, 0xb0, 0xff, 0x90, 0x90, - 0xe4, 0x24, 0x3f, 0xec, 0x2c, 0x3c, 0x84, 0x87, - 0xf9, 0x9, 0xf, 0x61, 0x61, 0xfc, 0x87, 0xfc, - 0x84, 0x87, 0xf6, 0x14, 0x1f, 0xfc, 0x4, 0x3f, - 0x21, 0x75, 0xf8, 0x36, 0x1f, 0x21, 0x97, 0xf8, - 0x32, 0x1f, 0x61, 0xff, 0xc6, 0x43, 0xc8, 0x7f, - 0xf1, 0xb0, 0xff, 0x7f, 0xff, 0x0, 0x24, 0x3a, - 0x9, 0xf, 0xfe, 0x22, 0x19, 0xb, 0xf, 0xfe, - 0x2, 0x16, 0x1f, 0x90, 0xff, 0xe0, 0x61, 0x21, - 0x41, 0xff, 0xc5, 0x43, 0xe4, 0x28, 0x3f, 0xf8, - 0x48, 0x50, 0x79, 0xf, 0xfe, 0x16, 0x12, 0x41, - 0xff, 0xc7, 0x43, 0x90, 0x90, 0xff, 0xe4, 0x40, + 0xf, 0xfe, 0x5, 0x10, 0xff, 0xe5, 0x6a, 0x83, + 0xff, 0x93, 0x6, 0xc3, 0xff, 0x8e, 0xa0, 0x20, + 0x43, 0xff, 0x8a, 0xc0, 0xe0, 0x41, 0xff, 0xc5, + 0x81, 0x3, 0x6, 0x1f, 0xfc, 0x3c, 0xa, 0x9, + 0x4, 0x1f, 0xfc, 0x2f, 0xa0, 0xd7, 0xa0, 0xff, + 0xfd, 0x7e, 0xf, 0xfe, 0x4a, 0x19, 0xf, 0xfe, + 0x46, 0x1b, 0xf, 0xfe, 0x42, 0x19, 0xf, 0xfe, + 0x72, 0x1f, 0xfc, 0x68, 0x3d, 0x87, 0xff, 0x19, + 0xf, 0x21, 0xff, 0xc9, 0x50, 0x7f, 0xf2, 0x20, + 0xbc, 0x14, 0x1f, 0xfc, 0x44, 0x25, 0x4, 0x87, + 0xff, 0x1d, 0x2, 0x1f, 0xfc, 0x68, 0x2c, 0x18, + 0x48, 0x7f, 0xf0, 0x90, 0x90, 0x21, 0x41, 0xff, + 0xdb, 0x42, 0x43, 0x21, 0x21, 0xff, 0xc0, 0x82, + 0x83, 0x61, 0x61, 0xff, 0xc9, 0x42, 0x43, 0xfe, + 0x42, 0x43, 0xc8, 0x48, 0x7f, 0xa0, 0xb0, 0xf6, + 0x16, 0x1f, 0xfc, 0x24, 0x3c, 0x84, 0x87, 0xf2, + 0x12, 0x1f, 0xfc, 0x98, 0x26, 0xbf, 0x6, 0x83, + 0xff, 0x82, 0xbf, 0x83, 0x21, 0xf2, 0x1f, 0xfc, + 0xdc, 0x3f, 0xf8, 0xc8, 0x79, 0xb, 0xff, 0xe8, + 0x28, 0x39, 0xf, 0xfe, 0x1a, 0x1f, 0xd8, 0x48, + 0x7f, 0xf1, 0x10, 0xc8, 0x58, 0x7f, 0xf0, 0x10, + 0xb0, 0x90, 0xc8, 0x7f, 0xf0, 0x30, 0x90, 0xb0, + 0x90, 0xff, 0xe0, 0xa1, 0x90, 0x21, 0x61, 0xff, + 0xc2, 0x42, 0xc4, 0x32, 0x1f, 0xfc, 0x2c, 0x24, + 0xc2, 0x43, 0xff, 0x86, 0x86, 0x40, /* U+00C3 "Ã" */ 0xf, 0xfe, 0x2a, 0x83, 0xff, 0x86, 0xfa, 0xe, @@ -1409,104 +1409,104 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x80, 0xa0, 0xa0, 0xff, 0xe0, 0x20, 0xac, 0x1c, 0x87, 0xff, 0x11, 0x3, 0x85, 0x40, 0xff, 0xe0, 0xd4, 0x1d, 0xf2, 0x1f, 0xfc, 0x25, 0x83, 0xff, - 0xd5, 0xf8, 0x3f, 0xf9, 0x28, 0x7f, 0xf3, 0x70, - 0xd0, 0x7f, 0xf2, 0x10, 0xc8, 0x7f, 0xf1, 0xd0, - 0xff, 0xe6, 0xe1, 0xe4, 0x3f, 0xf8, 0xc8, 0x7a, - 0xf, 0xfe, 0x4a, 0x83, 0xff, 0x91, 0x5, 0x61, - 0x21, 0xff, 0xc4, 0x43, 0x21, 0x41, 0xff, 0xc7, - 0x43, 0xff, 0x93, 0x5, 0x82, 0x9, 0xf, 0xfe, - 0x12, 0x12, 0x4, 0x2c, 0x3f, 0xf9, 0xa8, 0x7f, - 0xf0, 0x60, 0xa0, 0xc8, 0x48, 0x7f, 0xf0, 0x10, - 0x90, 0xd8, 0x58, 0x7f, 0xf2, 0x50, 0x90, 0xff, - 0x90, 0x90, 0xff, 0x21, 0xfe, 0x82, 0xc3, 0xd0, - 0x58, 0x7f, 0xf0, 0x90, 0xf2, 0x12, 0x1f, 0xc8, - 0x7f, 0xf1, 0x10, 0xfd, 0x6, 0xaf, 0xc1, 0xb0, - 0xff, 0xe0, 0xaf, 0xe0, 0xc8, 0x7c, 0x87, 0xff, - 0x19, 0xf, 0x61, 0xff, 0xc6, 0xc3, 0xc8, 0x5f, - 0xff, 0x41, 0x21, 0xc8, 0x7f, 0xf0, 0xd0, 0xc8, - 0x6c, 0x24, 0x3f, 0xf8, 0x8, 0x58, 0x64, 0x2c, - 0x3f, 0xf8, 0x18, 0x48, 0x48, 0x64, 0x3f, 0xf8, - 0x8, 0x7d, 0x84, 0x87, 0xff, 0x1a, 0x2, 0x16, - 0x1f, 0xfc, 0x28, 0x24, 0x43, 0x21, 0xff, 0xc2, - 0x43, 0xb0, 0x90, 0xff, 0xe4, 0x40, + 0xd5, 0xf8, 0x3f, 0xf9, 0xc8, 0x7f, 0xf2, 0x20, + 0xd8, 0x7f, 0xf2, 0x10, 0xc8, 0x7f, 0xf8, 0x60, + 0xf4, 0x1f, 0xfc, 0x64, 0x3c, 0x87, 0xff, 0x25, + 0x41, 0xff, 0xc8, 0x82, 0xf0, 0x48, 0x7f, 0xf1, + 0x10, 0x94, 0x14, 0x1f, 0xfc, 0x74, 0x8, 0x7f, + 0xf1, 0x90, 0xb0, 0x61, 0x21, 0xff, 0xc2, 0x82, + 0x40, 0x85, 0x87, 0xff, 0x35, 0xf, 0xfe, 0xa, + 0x12, 0x19, 0x9, 0xf, 0xfe, 0x4, 0x14, 0x1b, + 0xb, 0xf, 0xfe, 0x4a, 0x12, 0x1f, 0xf2, 0x12, + 0x1e, 0x42, 0x43, 0xfd, 0x5, 0x87, 0xb0, 0xb0, + 0xff, 0xe1, 0x21, 0xe4, 0x24, 0x3f, 0x90, 0x90, + 0xff, 0xe4, 0xc1, 0x35, 0xf8, 0x34, 0x1f, 0xfc, + 0x15, 0xfc, 0x19, 0xf, 0x90, 0xff, 0xe6, 0xe1, + 0xff, 0xc6, 0x43, 0xc8, 0x5f, 0xff, 0x41, 0x41, + 0xc8, 0x7f, 0xf0, 0xd0, 0xfe, 0xc2, 0x43, 0xff, + 0x88, 0x86, 0x42, 0xc3, 0xff, 0x80, 0x85, 0x84, + 0x86, 0x43, 0xff, 0x81, 0x84, 0x85, 0x84, 0x87, + 0xff, 0x5, 0xc, 0x81, 0xb, 0xf, 0xfe, 0x12, + 0x16, 0x21, 0x90, 0xff, 0xe1, 0x61, 0x26, 0x12, + 0x1f, 0xfc, 0x34, 0x32, /* U+00C4 "Ä" */ - 0xf, 0xbe, 0xf, 0xbe, 0xf, 0xfe, 0xe, 0x16, - 0x1d, 0x85, 0x87, 0xff, 0xdb, 0xb, 0xe, 0xc2, - 0xc3, 0xff, 0x83, 0xf0, 0x7d, 0xf0, 0x7f, 0xff, - 0x2f, 0x90, 0xff, 0xe5, 0x21, 0x61, 0xff, 0xc9, - 0x43, 0x21, 0xff, 0xc9, 0xc3, 0x90, 0xff, 0xe4, - 0x21, 0xd8, 0x7f, 0xf1, 0xd0, 0xf2, 0x1f, 0xfc, - 0x7c, 0x24, 0x24, 0x3f, 0xf8, 0xc8, 0x50, 0x58, - 0x7f, 0xf2, 0x50, 0xc8, 0x7f, 0xf1, 0x60, 0xb1, - 0x9, 0xf, 0xfe, 0x22, 0x12, 0x61, 0x61, 0xff, - 0xc7, 0x40, 0x84, 0x87, 0xff, 0xd, 0xb, 0x9, - 0xf, 0xfe, 0x34, 0x12, 0x16, 0x14, 0x1f, 0xfc, - 0xa4, 0x24, 0x3f, 0xf8, 0x28, 0x48, 0x7f, 0xf2, - 0xa0, 0xa0, 0xe4, 0x24, 0x3f, 0xf9, 0x50, 0x50, - 0x7f, 0xc8, 0x48, 0x7f, 0xf2, 0xb0, 0xb0, 0xf9, - 0x9, 0xf, 0xf2, 0x12, 0x1f, 0x61, 0x41, 0xfc, - 0x86, 0xaf, 0xd8, 0x7f, 0xf0, 0x70, 0xcb, 0xfc, - 0x19, 0xf, 0xc8, 0x7f, 0xf1, 0x70, 0xf9, 0xf, - 0xfe, 0x32, 0x1f, 0x61, 0x3f, 0xff, 0x6, 0x43, - 0xc8, 0x50, 0x7f, 0xc8, 0x58, 0x72, 0x1f, 0xfc, - 0x48, 0x24, 0x3b, 0x9, 0xf, 0xfe, 0x2a, 0x19, - 0xb, 0xf, 0xfe, 0xa, 0x16, 0x1f, 0x90, 0xff, - 0xe0, 0xe1, 0x21, 0x41, 0xff, 0xc6, 0x43, 0x20, - 0x42, 0x83, 0xff, 0x8f, 0x87, 0x90, 0xff, 0xe1, - 0xc1, 0x20, + 0xf, 0xbe, 0xf, 0xbe, 0xf, 0xfe, 0x6, 0x16, + 0x1d, 0x85, 0x87, 0xff, 0xcf, 0xb, 0xe, 0xc2, + 0xc3, 0xff, 0x81, 0xf0, 0x7d, 0xf0, 0x7f, 0xfe, + 0x7f, 0x21, 0xff, 0xcd, 0xc3, 0xff, 0x90, 0x86, + 0x43, 0xff, 0x91, 0x7, 0xff, 0x4d, 0xf, 0xfe, + 0x32, 0x1e, 0x83, 0xff, 0x8d, 0x7, 0xff, 0x41, + 0x41, 0x21, 0xff, 0xc4, 0x42, 0xf0, 0x58, 0x7f, + 0xf1, 0x30, 0x94, 0x12, 0x1f, 0xfc, 0x44, 0x8, + 0x10, 0x90, 0xff, 0xe1, 0x21, 0x60, 0xc2, 0xc3, + 0xff, 0x85, 0x84, 0x81, 0x9, 0xf, 0xfe, 0x12, + 0x1f, 0xfc, 0xc4, 0x24, 0x32, 0x14, 0x1f, 0xfc, + 0xc, 0x28, 0x36, 0x12, 0x1f, 0xfc, 0x4, 0x3f, + 0x21, 0xff, 0xc3, 0x42, 0x43, 0xc8, 0x48, 0x7f, + 0xb0, 0xb0, 0xf6, 0x16, 0x1f, 0xe4, 0x24, 0x3c, + 0x84, 0x87, 0xf2, 0x12, 0x1f, 0xfc, 0x4, 0x3f, + 0x61, 0x35, 0xf8, 0x36, 0x1f, 0x90, 0xcb, 0xf8, + 0x32, 0x1f, 0x21, 0xff, 0xcd, 0xc3, 0xff, 0x8d, + 0x7, 0x90, 0xbf, 0xfe, 0x82, 0x43, 0x90, 0xff, + 0xe1, 0xa1, 0xfd, 0x84, 0x87, 0xff, 0x11, 0xc, + 0x85, 0x87, 0xff, 0x1, 0xb, 0x9, 0xc, 0x87, + 0xff, 0x3, 0x9, 0xb, 0x9, 0xf, 0xfe, 0xa, + 0x19, 0x2, 0x16, 0x1f, 0xfc, 0x24, 0x2c, 0x43, + 0x21, 0xff, 0xc2, 0xc2, 0x4c, 0x24, 0x3f, 0xf8, + 0x68, 0x64, /* U+00C5 "Å" */ 0xf, 0xf3, 0xf9, 0xf, 0xfe, 0x3d, 0x3, 0x50, 0x3f, 0xf8, 0xaa, 0x1f, 0x22, 0x83, 0xff, 0x89, - 0xc, 0x9, 0x30, 0xff, 0xe3, 0x61, 0xb1, 0xf, - 0xfe, 0x32, 0x19, 0xf, 0xfe, 0x44, 0x1a, 0xf, - 0xfe, 0x34, 0x30, 0x24, 0x83, 0xff, 0x88, 0xa1, - 0xf2, 0x28, 0x3f, 0xf8, 0xb4, 0xd, 0x40, 0xff, - 0xe3, 0xbf, 0x90, 0xff, 0xf1, 0xfe, 0xf, 0xfe, - 0x4a, 0x19, 0xf, 0xfe, 0x44, 0x1b, 0xf, 0xfe, - 0x6a, 0x1f, 0xfc, 0x74, 0x3c, 0x87, 0xff, 0x1a, - 0xf, 0x61, 0xff, 0xcd, 0x43, 0xff, 0x8a, 0x85, - 0x21, 0x21, 0xff, 0xc4, 0xc2, 0x70, 0xb0, 0xff, - 0xe2, 0x21, 0x90, 0x90, 0xff, 0xe1, 0xa1, 0x20, - 0x43, 0xff, 0x8d, 0x85, 0x83, 0xa, 0xf, 0xfe, - 0x12, 0x12, 0x4, 0x24, 0x3f, 0xf8, 0x28, 0x48, - 0x7f, 0xf2, 0x70, 0xb0, 0xc8, 0x48, 0x7f, 0xf0, - 0x10, 0x90, 0xd0, 0x50, 0x7f, 0xc8, 0x7f, 0xf3, - 0x70, 0xa0, 0xf2, 0x12, 0x1f, 0xe4, 0x24, 0x3d, - 0x85, 0x7, 0xff, 0x25, 0xf, 0xfe, 0xc, 0x12, - 0x1f, 0x90, 0x90, 0xfc, 0x86, 0xaf, 0xc8, 0x58, - 0x7f, 0xf0, 0x17, 0xf8, 0x32, 0x1f, 0x41, 0xff, - 0xc6, 0x43, 0xc8, 0x7f, 0xf1, 0xb0, 0xff, 0x7f, - 0xff, 0x0, 0x24, 0x39, 0xf, 0xfe, 0x42, 0x1a, - 0xa, 0xf, 0xfe, 0x2, 0x16, 0x1f, 0x90, 0xff, - 0xe0, 0x61, 0x21, 0x21, 0xff, 0xc5, 0x43, 0x20, - 0x82, 0x43, 0xff, 0x84, 0x85, 0x87, 0xb0, 0xff, - 0xe1, 0x61, 0x22, 0x19, 0xf, 0xfe, 0x12, 0x19, - 0xc2, 0x43, 0xff, 0x91, 0x80, + 0xc, 0x9, 0x20, 0xff, 0xe3, 0x41, 0xa0, 0xff, + 0xf1, 0x41, 0xa0, 0xff, 0xe3, 0x43, 0x2, 0x48, + 0x3f, 0xf8, 0x8a, 0x1f, 0x22, 0x83, 0xff, 0x8b, + 0x40, 0xd4, 0xf, 0xfe, 0x3b, 0xf9, 0xf, 0xff, + 0x1f, 0xe0, 0xff, 0xe4, 0xa1, 0x90, 0xff, 0xe4, + 0x61, 0xb0, 0xff, 0xe4, 0x21, 0x90, 0xff, 0xe3, + 0xa1, 0xe4, 0x3f, 0xf8, 0xd8, 0x7b, 0xf, 0xfe, + 0x32, 0x1e, 0x43, 0xff, 0x8a, 0x84, 0xa0, 0xff, + 0xe4, 0x61, 0x78, 0x28, 0x3f, 0xf8, 0x88, 0x4a, + 0x9, 0xf, 0xfe, 0x1a, 0x12, 0x4, 0x3f, 0xf8, + 0xd8, 0x58, 0x30, 0x90, 0xff, 0xe1, 0x21, 0x20, + 0x42, 0x83, 0xff, 0x82, 0x87, 0xff, 0x37, 0x9, + 0xc, 0x84, 0x87, 0xff, 0x1, 0xa, 0xd, 0x85, + 0x87, 0xff, 0x25, 0x9, 0xf, 0xfa, 0x9, 0xf, + 0x21, 0x21, 0xfe, 0x42, 0xc3, 0xd8, 0x58, 0x7f, + 0xf0, 0x90, 0xf2, 0x12, 0x1f, 0xc8, 0x48, 0x7f, + 0xf2, 0x60, 0x9a, 0xfc, 0x1a, 0xf, 0xfe, 0xa, + 0xfe, 0xc, 0x87, 0xc8, 0x7f, 0xf3, 0x60, 0xff, + 0xe3, 0x21, 0xfe, 0xff, 0xfa, 0xa, 0xe, 0x43, + 0xff, 0x86, 0x87, 0xf6, 0x12, 0x1f, 0xfc, 0x44, + 0x32, 0x16, 0x1f, 0xfc, 0x4, 0x2c, 0x24, 0x32, + 0x1f, 0xfc, 0xc, 0x24, 0x2c, 0x24, 0x3f, 0xf8, + 0x28, 0x64, 0x8, 0x58, 0x7f, 0xf0, 0x90, 0xb1, + 0xc, 0x87, 0xff, 0xb, 0x9, 0x30, 0x90, 0xff, + 0xe1, 0xa1, 0x90, /* U+00C6 "Æ" */ - 0xf, 0xfe, 0x37, 0xff, 0xf1, 0xe0, 0xff, 0xe3, - 0x61, 0xff, 0xd9, 0x43, 0xff, 0xb5, 0x7, 0xcb, - 0xff, 0xc1, 0xc3, 0xff, 0x88, 0x87, 0xea, 0xff, - 0xe0, 0xa1, 0xff, 0xc4, 0x82, 0x43, 0xff, 0xaa, - 0x86, 0x83, 0xff, 0xab, 0x4, 0x87, 0xff, 0x55, - 0xd, 0x7, 0xff, 0x56, 0x9, 0xf, 0xfe, 0xaa, - 0x1a, 0xf, 0xfe, 0xac, 0x12, 0x1f, 0xfd, 0x54, - 0x36, 0x1f, 0xfd, 0x58, 0x32, 0x1f, 0xfd, 0x44, - 0x34, 0x1f, 0xab, 0xff, 0x80, 0x1f, 0xfc, 0x18, - 0x32, 0x1f, 0x97, 0xff, 0x80, 0x1f, 0xfc, 0x4, - 0x34, 0x1f, 0xfd, 0x58, 0x32, 0x1f, 0xfd, 0x44, - 0x34, 0x1f, 0xf7, 0xff, 0xc1, 0xff, 0x41, 0x90, - 0xff, 0xea, 0x21, 0xa0, 0xff, 0xea, 0xc1, 0x90, - 0xff, 0xea, 0x21, 0xdf, 0xf8, 0x3f, 0xf9, 0xb0, - 0x7f, 0xf6, 0x50, 0xff, 0xed, 0x41, 0x97, 0xfe, - 0xf, 0xfe, 0x54, 0x1b, 0xaf, 0xf8, 0x3f, 0xf9, - 0x48, 0x7f, 0xf6, 0x60, 0xd0, 0x7f, 0xf5, 0x50, - 0xc8, 0x7f, 0xf5, 0x20, 0xd0, 0x7f, 0xf1, 0x6b, - 0xff, 0x82, 0x81, 0xc, 0x87, 0xff, 0x15, 0x7f, - 0xf8, 0x39, 0x6, 0x83, 0xff, 0xaa, 0x86, 0x43, - 0xff, 0xa8, + 0xf, 0xfe, 0x2f, 0xff, 0xf2, 0x3, 0xff, 0x8a, + 0x87, 0xff, 0x66, 0xf, 0xfe, 0xc2, 0x1f, 0x2f, + 0xff, 0x8, 0x3f, 0xf8, 0x90, 0x7d, 0x5f, 0xfc, + 0x20, 0xff, 0xe1, 0xa1, 0xf9, 0xf, 0xfe, 0x84, + 0x14, 0x1f, 0xfd, 0x44, 0x32, 0x83, 0xff, 0xa7, + 0x5, 0x7, 0xff, 0x51, 0xc, 0x87, 0xff, 0x52, + 0xa, 0xf, 0xfe, 0xa2, 0x19, 0xf, 0xfe, 0xa4, + 0x14, 0x1f, 0xfd, 0x44, 0x32, 0x1f, 0x61, 0xff, + 0xcc, 0x82, 0x43, 0x61, 0x35, 0xff, 0x7, 0xff, + 0x1, 0xd, 0x7, 0xf2, 0xff, 0xc1, 0xff, 0xc0, + 0x82, 0x43, 0xff, 0xa8, 0x86, 0x83, 0xff, 0xa9, + 0x4, 0x87, 0xf9, 0xff, 0xf8, 0x3f, 0xd0, 0x68, + 0x3f, 0xfa, 0x88, 0x48, 0x7f, 0xf5, 0x20, 0xd0, + 0x7c, 0x84, 0x87, 0xff, 0x21, 0xd, 0xff, 0xc1, + 0xff, 0xcb, 0x83, 0xff, 0xb2, 0x87, 0xff, 0x62, + 0xc, 0xbf, 0xf0, 0x7f, 0xf2, 0x90, 0xd5, 0xff, + 0x7, 0xff, 0x26, 0xd, 0x7, 0xff, 0x51, 0xc, + 0x87, 0xff, 0x4e, 0xd, 0x7, 0xff, 0x51, 0xc, + 0x87, 0xff, 0x12, 0xbf, 0xf8, 0x44, 0x1a, 0xf, + 0xfe, 0x2a, 0xff, 0xf0, 0x84, 0x32, 0x1f, 0xfd, + 0x38, 0x34, 0x1f, 0xfd, 0x40, /* U+00C7 "Ç" */ 0xf, 0x9b, 0xfa, 0x43, 0xfe, 0x79, 0xe, 0x6e, @@ -1514,70 +1514,71 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x7b, 0xc, 0xa0, 0xde, 0xab, 0xc8, 0x64, 0x28, 0x27, 0xf, 0xa4, 0x28, 0x10, 0x68, 0x3f, 0xa0, 0xc8, 0x85, 0x7, 0xfc, 0x85, 0xa1, 0x90, 0xff, - 0xb0, 0x9c, 0x24, 0x3f, 0xfa, 0xc8, 0x64, 0x2c, - 0x3f, 0xf8, 0x3f, 0x83, 0xff, 0x9c, 0x87, 0xff, - 0xfc, 0x3f, 0xff, 0xe1, 0xff, 0xcd, 0x43, 0xff, - 0xb6, 0x85, 0x87, 0xff, 0x7, 0xf0, 0x7f, 0xf1, - 0x50, 0xd8, 0x48, 0x7f, 0xf1, 0x50, 0xc8, 0x7f, - 0xd8, 0x48, 0x85, 0x7, 0xfc, 0x85, 0x90, 0x68, - 0x3f, 0xa0, 0xc8, 0x20, 0x98, 0x3e, 0x90, 0xa0, - 0x94, 0x13, 0xea, 0xbc, 0x84, 0xa0, 0xd2, 0x1c, - 0xb0, 0x73, 0x7, 0xa8, 0x1f, 0xf5, 0x3, 0xf3, - 0xc8, 0x73, 0x68, 0x7f, 0xcc, 0x82, 0xe4, 0x3f, - 0xf8, 0x68, 0x24, 0x3f, 0xf9, 0x32, 0x1f, 0xfc, - 0x4e, 0xa, 0xf, 0xfe, 0x2b, 0x87, 0xff, 0x7d, - 0xf, 0xfe, 0x3b, 0x40, 0x21, 0xff, 0xc4, 0x90, - 0xa0, 0xff, 0xe3, 0xb8, 0x7f, 0xf1, 0x69, 0xc1, - 0xfc, + 0xb0, 0x9c, 0x24, 0x3f, 0xf8, 0x8, 0x7e, 0xc3, + 0xff, 0x8a, 0x87, 0xff, 0x17, 0xf0, 0x64, 0x3f, + 0xff, 0xe1, 0xff, 0xff, 0xf, 0xff, 0xca, 0x1f, + 0xfc, 0x54, 0x3f, 0xf8, 0xbf, 0x83, 0x61, 0xff, + 0xc5, 0xc2, 0x43, 0xff, 0x80, 0x86, 0x43, 0x21, + 0xff, 0x61, 0x22, 0x14, 0x1f, 0xf2, 0x16, 0x41, + 0xa0, 0xfe, 0x83, 0x20, 0x42, 0x60, 0xfa, 0x42, + 0x82, 0x90, 0x9f, 0x55, 0xe4, 0x25, 0x6, 0x90, + 0xe5, 0x83, 0x98, 0x3d, 0x40, 0xff, 0xa8, 0x1f, + 0x9e, 0x43, 0x9b, 0x43, 0xfe, 0x64, 0x17, 0x21, + 0xff, 0xc3, 0x41, 0x21, 0xff, 0xc9, 0x90, 0xff, + 0xe2, 0x70, 0x50, 0x7f, 0xf1, 0x5c, 0x3f, 0xfb, + 0xe8, 0x7f, 0xf1, 0xda, 0x1, 0xf, 0xfe, 0x24, + 0x85, 0x7, 0xff, 0x23, 0xf, 0xfe, 0x2d, 0x3c, + 0x1f, 0xc0, /* U+00C8 "È" */ - 0x7, 0xf0, 0x7f, 0xf0, 0x70, 0xd8, 0x7f, 0xf0, - 0x70, 0xd0, 0x7f, 0xf0, 0x60, 0x90, 0xff, 0xe0, - 0xb0, 0x58, 0x7f, 0xf0, 0x54, 0x12, 0x1f, 0xfc, - 0x19, 0x4, 0x1f, 0xfc, 0x2b, 0xe0, 0xff, 0xef, - 0xff, 0xff, 0x18, 0x3f, 0xfb, 0x8b, 0xff, 0xc2, - 0xd, 0x5f, 0xfc, 0x20, 0xff, 0xff, 0x87, 0xff, - 0xfc, 0x3f, 0xf8, 0x95, 0xff, 0xc0, 0x43, 0x97, - 0xff, 0x81, 0x87, 0xff, 0x77, 0xff, 0xf8, 0x10, - 0x7f, 0xff, 0xc3, 0xff, 0xfe, 0x1f, 0xfe, 0x9a, - 0xff, 0xe1, 0x6, 0x5f, 0xfe, 0x10, 0x7f, 0xf6, - 0x0, + 0x7, 0xf0, 0x7f, 0xf0, 0xb0, 0xd8, 0x7f, 0xf0, + 0xa0, 0xc8, 0x7f, 0xf0, 0x58, 0x28, 0x3f, 0xf8, + 0x4a, 0xb, 0xf, 0xfe, 0x14, 0x84, 0x87, 0xff, + 0xa, 0xa, 0xf, 0xfe, 0x1f, 0xe0, 0xff, 0xf1, + 0x7f, 0xff, 0x1a, 0xf, 0xfe, 0xf2, 0xff, 0xf0, + 0xb0, 0xd5, 0xff, 0xc2, 0x43, 0xff, 0xfe, 0x1f, + 0xff, 0xf0, 0xff, 0xe6, 0xd7, 0xff, 0x1, 0xf, + 0x2f, 0xff, 0x3, 0xf, 0xff, 0x7, 0xff, 0xf0, + 0x20, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xfe, + 0xb5, 0xff, 0xc2, 0x43, 0x2f, 0xff, 0xb, 0xf, + 0xfe, 0xd0, /* U+00C9 "É" */ - 0xf, 0xfb, 0xf8, 0x3f, 0xf8, 0x18, 0x6c, 0x3f, - 0xe4, 0x36, 0x1f, 0xfc, 0x8, 0x28, 0x3f, 0xf8, - 0x18, 0x52, 0x1f, 0xf2, 0x14, 0x87, 0xff, 0x2, - 0x2, 0x83, 0xff, 0x83, 0xf4, 0x1f, 0xfd, 0xff, - 0xff, 0xe3, 0x7, 0xff, 0x71, 0x7f, 0xf8, 0x41, - 0xab, 0xff, 0x84, 0x1f, 0xff, 0xf0, 0xff, 0xff, - 0x87, 0xff, 0x12, 0xbf, 0xf8, 0x8, 0x72, 0xff, - 0xf0, 0x30, 0xff, 0xee, 0xff, 0xff, 0x2, 0xf, - 0xff, 0xf8, 0x7f, 0xff, 0xc3, 0xff, 0xd3, 0x5f, - 0xfc, 0x20, 0xcb, 0xff, 0xc2, 0xf, 0xfe, 0xc0, + 0xf, 0xfb, 0xf8, 0x3f, 0xf8, 0x38, 0x6c, 0x3f, + 0xf8, 0x10, 0x6c, 0x3f, 0xf8, 0x28, 0x50, 0x7f, + 0xf0, 0x70, 0xa4, 0x3f, 0xf8, 0x10, 0x52, 0x1f, + 0xfc, 0x14, 0xa, 0xf, 0xfe, 0x17, 0xd0, 0x7f, + 0xf8, 0xbf, 0xff, 0x8d, 0x7, 0xff, 0x79, 0x7f, + 0xf8, 0x58, 0x6a, 0xff, 0xe1, 0x21, 0xff, 0xff, + 0xf, 0xff, 0xf8, 0x7f, 0xf3, 0x6b, 0xff, 0x80, + 0x87, 0x97, 0xff, 0x81, 0x87, 0xff, 0x83, 0xff, + 0xf8, 0x10, 0x7f, 0xff, 0xc3, 0xff, 0xfe, 0x1f, + 0xff, 0x5a, 0xff, 0xe1, 0x21, 0x97, 0xff, 0x85, + 0x87, 0xff, 0x68, /* U+00CA "Ê" */ - 0xf, 0xaf, 0x41, 0xff, 0xc1, 0x50, 0x14, 0x1f, - 0xf3, 0x6, 0x83, 0xfe, 0x81, 0x40, 0x61, 0xfd, - 0x81, 0x70, 0x20, 0xfa, 0xa, 0x4, 0x5, 0x7, - 0xca, 0xc3, 0x6a, 0xf, 0xaa, 0xf, 0x51, 0xf, - 0xfe, 0xdf, 0xff, 0xf1, 0x83, 0xff, 0xb8, 0xbf, - 0xfc, 0x20, 0xd5, 0xff, 0xc2, 0xf, 0xff, 0xf8, - 0x7f, 0xff, 0xc3, 0xff, 0x89, 0x5f, 0xfc, 0x4, - 0x39, 0x7f, 0xf8, 0x18, 0x7f, 0xf7, 0x7f, 0xff, - 0x81, 0x7, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xff, - 0xe9, 0xaf, 0xfe, 0x10, 0x65, 0xff, 0xe1, 0x7, - 0xff, 0x60, + 0xf, 0xaf, 0x41, 0xff, 0xc2, 0x90, 0x28, 0x3f, + 0xf8, 0xa, 0xd, 0x7, 0xff, 0x2, 0x5, 0x1, + 0x87, 0xfb, 0x2, 0xe0, 0x41, 0xfa, 0xa, 0x4, + 0x5, 0x7, 0xe5, 0x61, 0xb5, 0x7, 0xea, 0x83, + 0xd4, 0x43, 0xff, 0xbd, 0xff, 0xfc, 0x68, 0x3f, + 0xfb, 0xcb, 0xff, 0xc2, 0xc3, 0x57, 0xff, 0x9, + 0xf, 0xff, 0xf8, 0x7f, 0xff, 0xc3, 0xff, 0x9b, + 0x5f, 0xfc, 0x4, 0x3c, 0xbf, 0xfc, 0xc, 0x3f, + 0xfc, 0x1f, 0xff, 0xc0, 0x83, 0xff, 0xfe, 0x1f, + 0xff, 0xf0, 0xff, 0xfa, 0xd7, 0xff, 0x9, 0xc, + 0xbf, 0xfc, 0x2c, 0x3f, 0xfb, 0x40, /* U+00CB "Ë" */ - 0x7, 0xc1, 0xfb, 0xe0, 0xb0, 0xb0, 0xf6, 0x16, - 0x1f, 0xfd, 0xac, 0x2c, 0x3d, 0x85, 0x85, 0xf0, - 0x7e, 0xf8, 0x3f, 0xfb, 0x5f, 0xff, 0xc6, 0xf, - 0xfe, 0xe2, 0xff, 0xf0, 0x83, 0x57, 0xff, 0x8, - 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xf, 0xfe, 0x25, - 0x7f, 0xf0, 0x10, 0xe5, 0xff, 0xe0, 0x61, 0xff, - 0xdd, 0xff, 0xfe, 0x4, 0x1f, 0xff, 0xf0, 0xff, - 0xff, 0x87, 0xff, 0xa6, 0xbf, 0xf8, 0x41, 0x97, - 0xff, 0x84, 0x1f, 0xfd, 0x80, + 0x7, 0xc1, 0xfb, 0xe0, 0xd8, 0x58, 0x7b, 0xb, + 0xf, 0xfe, 0xee, 0x16, 0x1e, 0xc2, 0xc3, 0x7c, + 0x1f, 0xbe, 0xf, 0xfe, 0xef, 0xff, 0xf1, 0xa0, + 0xff, 0xef, 0x2f, 0xff, 0xb, 0xd, 0x5f, 0xfc, + 0x24, 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xf, 0xfe, + 0x6d, 0x7f, 0xf0, 0x10, 0xf2, 0xff, 0xf0, 0x30, + 0xff, 0xf0, 0x7f, 0xff, 0x2, 0xf, 0xff, 0xf8, + 0x7f, 0xff, 0xc3, 0xff, 0xeb, 0x5f, 0xfc, 0x24, + 0x32, 0xff, 0xf0, 0xb0, 0xff, 0xed, 0x0, /* U+00CC "Ì" */ 0x2f, 0xc8, 0x74, 0x1a, 0xf, 0x61, 0xa0, 0xf6, @@ -1609,20 +1610,21 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf0, 0xff, 0xff, 0x87, 0xff, 0x98, /* U+00D0 "Ð" */ - 0xb, 0xff, 0xe9, 0xf, 0xfe, 0x53, 0x70, 0x7f, - 0xf2, 0xdd, 0xf, 0xf9, 0x7c, 0x1e, 0x90, 0xff, - 0x57, 0xbd, 0x6, 0x83, 0xff, 0x8c, 0xe1, 0xb0, - 0xff, 0xe3, 0xe1, 0x90, 0xff, 0xe3, 0xc1, 0x41, - 0xff, 0xc7, 0x43, 0xff, 0x98, 0x84, 0x87, 0xff, - 0x2f, 0xf, 0xfe, 0x3e, 0x12, 0x1f, 0xfd, 0xf4, - 0x3f, 0xfa, 0x1f, 0x6, 0xff, 0x7, 0xff, 0xbd, - 0x60, 0xcb, 0xe0, 0xff, 0xaa, 0xd, 0x5e, 0xf, - 0xff, 0x52, 0x1f, 0xfe, 0x3c, 0x24, 0x3f, 0xf8, - 0xe8, 0x58, 0x7f, 0xf2, 0xd0, 0xff, 0xe3, 0x41, - 0xff, 0xcb, 0x42, 0x83, 0xff, 0x8d, 0x86, 0x43, - 0xff, 0x89, 0x61, 0xb0, 0xfe, 0xaf, 0x79, 0xd, - 0x7, 0xf9, 0x7c, 0x1e, 0x90, 0xff, 0xe4, 0x3a, - 0x1f, 0xfc, 0x66, 0xe0, 0xf0, + 0xd, 0xff, 0xf4, 0x87, 0xff, 0x2d, 0xb8, 0x3f, + 0xf9, 0x8e, 0x87, 0xff, 0x1, 0x7c, 0x1e, 0x90, + 0xff, 0xab, 0xde, 0x83, 0x48, 0x7f, 0xf1, 0x9c, + 0x34, 0x1f, 0xfc, 0x8c, 0x32, 0x1f, 0xfc, 0x88, + 0x28, 0x3f, 0xf9, 0x8, 0x64, 0x3f, 0xf9, 0x8, + 0x58, 0x7f, 0xf2, 0x30, 0xff, 0xe8, 0x21, 0xff, + 0xc8, 0x43, 0xff, 0xd5, 0x7c, 0x1b, 0xfa, 0xf, + 0xff, 0x8e, 0xb0, 0x65, 0xec, 0x3f, 0xe6, 0xa0, + 0xd5, 0xc8, 0x7f, 0xff, 0xc3, 0xc8, 0x7f, 0xf4, + 0x10, 0xff, 0xe4, 0x61, 0xff, 0xcc, 0x42, 0xc3, + 0xff, 0x8e, 0x86, 0x43, 0xff, 0x8f, 0x5, 0x7, + 0xff, 0x1f, 0xc, 0x87, 0xff, 0x16, 0xc3, 0x41, + 0xfe, 0xaf, 0x79, 0xd, 0x21, 0xfe, 0x5f, 0x7, + 0xa4, 0x3f, 0xf9, 0x2e, 0x87, 0xff, 0x1d, 0xb8, + 0x3c, /* U+00D1 "Ñ" */ 0xf, 0xfe, 0x1a, 0x83, 0xff, 0x80, 0xfa, 0xe, @@ -1631,43 +1633,43 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x41, 0xfc, 0x82, 0xb0, 0x72, 0x1f, 0xfc, 0x14, 0xe, 0x15, 0x3, 0xfd, 0x50, 0x77, 0xc8, 0x7f, 0xcb, 0x7, 0xff, 0x6f, 0xf2, 0x1f, 0xfc, 0x1f, - 0xc1, 0xd0, 0x7f, 0xf2, 0xe0, 0xff, 0xe5, 0x21, + 0xc1, 0xd0, 0x7f, 0xf2, 0xd0, 0xff, 0xe5, 0x41, 0xff, 0xcb, 0x83, 0xff, 0x94, 0x87, 0xff, 0x2e, 0xf, 0xfe, 0x52, 0x1f, 0xfc, 0x74, 0x28, 0x3f, 0xf8, 0xd0, 0x48, 0x7f, 0xf1, 0xe0, 0xa0, 0xff, - 0xe3, 0x21, 0x21, 0xff, 0xc7, 0x82, 0xc3, 0xff, - 0x8c, 0x86, 0x43, 0xff, 0x8d, 0x5, 0x7, 0xff, - 0x19, 0xc, 0x87, 0xff, 0x1b, 0xa, 0xf, 0xfe, - 0x3a, 0x12, 0x1f, 0xfc, 0x68, 0x28, 0x3f, 0xf8, - 0xe8, 0x48, 0x7f, 0xf1, 0xa0, 0xa0, 0xff, 0xe3, - 0xa1, 0x21, 0xff, 0xc6, 0x82, 0x83, 0xff, 0x8e, - 0x85, 0x7, 0xff, 0x1a, 0x9, 0xf, 0xfe, 0x3a, - 0x14, 0x1f, 0xfc, 0x68, 0x24, 0x3f, 0xf8, 0xf0, - 0x7f, 0xf2, 0x90, 0xff, 0xe5, 0xc1, 0xff, 0xca, - 0x43, 0xff, 0x97, 0x7, 0xff, 0x29, 0xf, 0xfe, - 0x5c, 0x1c, + 0xe3, 0x21, 0x21, 0xff, 0xc7, 0x82, 0x83, 0xff, + 0x8c, 0x84, 0xa0, 0xff, 0xe3, 0x41, 0x41, 0xff, + 0xc6, 0x43, 0x21, 0xff, 0xc6, 0x82, 0x83, 0xff, + 0x8c, 0xa0, 0x90, 0xff, 0xe3, 0x41, 0x41, 0xff, + 0xc7, 0x42, 0x43, 0xff, 0x8d, 0x5, 0x7, 0xff, + 0x1d, 0x9, 0xf, 0xfe, 0x34, 0x14, 0x1f, 0xfc, + 0x74, 0x28, 0x3f, 0xf8, 0xd0, 0x48, 0x7f, 0xf1, + 0xd0, 0xa0, 0xff, 0xe3, 0x41, 0x21, 0xff, 0xc7, + 0x83, 0xff, 0x94, 0x87, 0xff, 0x2e, 0xf, 0xfe, + 0x52, 0x1f, 0xfc, 0xb8, 0x3f, 0xf9, 0x48, 0x7f, + 0xf2, 0xe0, 0xe0, /* U+00D2 "Ò" */ 0xc, 0xff, 0x7, 0xff, 0x15, 0x41, 0x90, 0xff, - 0xe2, 0xc8, 0x50, 0x7f, 0xf1, 0xa4, 0x2c, 0x3f, - 0xf8, 0xd0, 0x64, 0x3f, 0xf8, 0xd8, 0x50, 0x7f, - 0xf1, 0xf0, 0xa0, 0xff, 0xe3, 0xfd, 0x7, 0xff, - 0xc9, 0xbf, 0xa4, 0x3f, 0xf8, 0xf, 0x21, 0xcd, - 0xa1, 0xfd, 0x40, 0xff, 0xa8, 0x1f, 0x48, 0x72, - 0xc1, 0xce, 0x1c, 0xa0, 0xde, 0xab, 0xc8, 0x68, - 0x34, 0x13, 0x87, 0xd2, 0x12, 0x14, 0x1a, 0xf, - 0xe8, 0x34, 0x4, 0x28, 0x3f, 0xe8, 0x24, 0x43, - 0x21, 0xff, 0x21, 0x9c, 0x24, 0x3f, 0xf8, 0x28, - 0x58, 0x6c, 0x3f, 0xf8, 0x38, 0x4a, 0xf, 0xff, - 0x2a, 0x1f, 0xfc, 0x14, 0x3f, 0xff, 0xe1, 0xff, - 0xff, 0xf, 0xfe, 0x3a, 0x1f, 0xfc, 0x14, 0x3f, - 0xfc, 0xaa, 0xb, 0xf, 0xfe, 0xe, 0x1b, 0x9, - 0xf, 0xfe, 0xa, 0x16, 0x86, 0x43, 0xfe, 0x43, - 0x22, 0x14, 0x1f, 0xf4, 0x12, 0x8, 0x34, 0x1f, - 0xd0, 0x68, 0x24, 0x27, 0xf, 0xa4, 0x24, 0x34, - 0x1d, 0xea, 0xbc, 0x86, 0x83, 0xb4, 0x39, 0x60, - 0xe7, 0xf, 0xa8, 0x1f, 0xf5, 0x3, 0xf9, 0xe4, - 0x39, 0xb4, 0x38, + 0xe2, 0xc8, 0x50, 0x7f, 0xf1, 0xa0, 0xd8, 0x7f, + 0xf1, 0xb0, 0xc8, 0x7f, 0xf1, 0xb0, 0xa0, 0xff, + 0xe3, 0xe1, 0x41, 0xff, 0xc7, 0xfa, 0xf, 0xff, + 0x93, 0x7f, 0x48, 0x7f, 0xf0, 0x1e, 0x43, 0x9b, + 0x43, 0xfa, 0x81, 0xff, 0x58, 0x7d, 0x21, 0xcb, + 0x7, 0xb0, 0xe9, 0x9, 0xf5, 0x5e, 0x43, 0x41, + 0x90, 0x98, 0x3e, 0x90, 0x90, 0xa0, 0xd0, 0x7f, + 0x41, 0xa0, 0x21, 0x41, 0xff, 0x61, 0x22, 0x19, + 0xf, 0xfe, 0x23, 0x84, 0x87, 0xff, 0x5, 0xb, + 0xd, 0x87, 0xff, 0x7, 0xc, 0x87, 0xff, 0x25, + 0xc, 0x87, 0xff, 0x5, 0xf, 0xff, 0xf8, 0x7f, + 0xff, 0xc3, 0xff, 0xea, 0x87, 0xff, 0x5, 0xc, + 0x87, 0xff, 0x3b, 0xf, 0xfe, 0xe, 0x13, 0x84, + 0x87, 0xff, 0x5, 0xb, 0x43, 0x21, 0xff, 0xc4, + 0x44, 0x28, 0x3f, 0xe8, 0x24, 0x10, 0x68, 0x3f, + 0x94, 0x14, 0x12, 0x13, 0x7, 0xd4, 0x9, 0xd, + 0x21, 0x3e, 0xab, 0xc8, 0x68, 0x3a, 0x43, 0x96, + 0xf, 0x61, 0xf5, 0x3, 0xfe, 0xb0, 0xfe, 0x79, + 0xe, 0x6d, 0xe, /* U+00D3 "Ó" */ 0xf, 0xfe, 0xd, 0xfa, 0xf, 0xfe, 0x2a, 0x13, @@ -1675,21 +1677,21 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x87, 0xff, 0x15, 0xb, 0xf, 0xfe, 0x2e, 0x16, 0x1f, 0xfc, 0x58, 0x2c, 0x3f, 0xf8, 0xd7, 0xc1, 0xff, 0xf3, 0x6f, 0xe9, 0xf, 0xfe, 0x3, 0xc8, - 0x73, 0x68, 0x7f, 0x50, 0x3f, 0xea, 0x7, 0xd2, - 0x1c, 0xb0, 0x73, 0x87, 0x28, 0x37, 0xaa, 0xf2, - 0x1a, 0xd, 0x4, 0xe1, 0xf4, 0x84, 0x85, 0x6, - 0x83, 0xfa, 0xd, 0x1, 0xa, 0xf, 0xfa, 0x9, - 0x10, 0xc8, 0x7f, 0xc8, 0x67, 0x9, 0xf, 0xfe, - 0xa, 0x16, 0x1b, 0xf, 0xfe, 0xe, 0x12, 0x83, - 0xff, 0xca, 0x87, 0xff, 0x5, 0xf, 0xff, 0xf8, - 0x7f, 0xff, 0xc3, 0xff, 0x8e, 0x87, 0xff, 0x5, - 0xf, 0xff, 0x2a, 0x82, 0xc3, 0xff, 0x83, 0x86, - 0xc2, 0x43, 0xff, 0x82, 0x85, 0xa1, 0x90, 0xff, - 0x90, 0xc8, 0x85, 0x7, 0xfd, 0x4, 0x82, 0xd, - 0x7, 0xf4, 0x1a, 0x9, 0x9, 0xc3, 0xe9, 0x9, - 0xd, 0x7, 0x7a, 0xaf, 0x21, 0xa0, 0xed, 0xe, - 0x58, 0x39, 0xc3, 0xea, 0x7, 0xfd, 0x40, 0xfe, - 0x79, 0xe, 0x6d, 0xe, + 0x73, 0x68, 0x7f, 0x50, 0x3f, 0xeb, 0xf, 0xa4, + 0x39, 0x60, 0xf6, 0x1d, 0x21, 0x3e, 0xab, 0xc8, + 0x68, 0x32, 0x13, 0x7, 0xd2, 0x12, 0x14, 0x1a, + 0xf, 0xe8, 0x34, 0x4, 0x28, 0x3f, 0xec, 0x24, + 0x43, 0x21, 0xff, 0xc4, 0x70, 0x90, 0xff, 0xe0, + 0xa1, 0x61, 0xb0, 0xff, 0xe0, 0xe1, 0x90, 0xff, + 0xe4, 0xa1, 0x90, 0xff, 0xe0, 0xa1, 0xff, 0xff, + 0xf, 0xff, 0xf8, 0x7f, 0xfd, 0x50, 0xff, 0xe0, + 0xa1, 0x90, 0xff, 0xe7, 0x61, 0xff, 0xc1, 0xc2, + 0x70, 0x90, 0xff, 0xe0, 0xa1, 0x68, 0x64, 0x3f, + 0xf8, 0x88, 0x85, 0x7, 0xfd, 0x4, 0x82, 0xd, + 0x7, 0xf2, 0x82, 0x82, 0x42, 0x60, 0xfa, 0x81, + 0x21, 0xa4, 0x27, 0xd5, 0x79, 0xd, 0x7, 0x48, + 0x72, 0xc1, 0xec, 0x3e, 0xa0, 0x7f, 0xd6, 0x1f, + 0xcf, 0x21, 0xcd, 0xa1, 0xc0, /* U+00D4 "Ô" */ 0xf, 0xf7, 0xc1, 0xff, 0xc7, 0xc2, 0xc3, 0xff, @@ -1698,65 +1700,65 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x2, 0xa, 0x4, 0x1f, 0xf2, 0xd2, 0x13, 0x2c, 0x1f, 0xe6, 0x88, 0x73, 0x44, 0x3f, 0xfd, 0xcd, 0xfd, 0x21, 0xff, 0xc0, 0x79, 0xe, 0x6d, 0xf, - 0xea, 0x7, 0xfd, 0x40, 0xfa, 0x43, 0x96, 0xe, - 0x70, 0xe5, 0x6, 0xf5, 0x5e, 0x43, 0x41, 0xa0, - 0x9c, 0x3e, 0x90, 0x90, 0xa0, 0xd0, 0x7f, 0x41, - 0xa0, 0x21, 0x41, 0xff, 0x41, 0x22, 0x19, 0xf, - 0xf9, 0xc, 0xe1, 0x21, 0xff, 0xc1, 0x42, 0xc3, - 0x61, 0xff, 0xc1, 0xc2, 0x50, 0x7f, 0xf9, 0x50, - 0xff, 0xe0, 0xa1, 0xff, 0xff, 0xf, 0xff, 0xf8, - 0x7f, 0xf1, 0xd0, 0xff, 0xe0, 0xa1, 0xff, 0xe5, - 0x50, 0x58, 0x7f, 0xf0, 0x70, 0xd8, 0x48, 0x7f, - 0xf0, 0x50, 0xb4, 0x32, 0x1f, 0xf2, 0x19, 0x10, - 0xa0, 0xff, 0xa0, 0x90, 0x41, 0xa0, 0xfe, 0x83, - 0x41, 0x21, 0x38, 0x7d, 0x21, 0x21, 0xa0, 0xef, - 0x55, 0xe4, 0x34, 0x1d, 0xa1, 0xcb, 0x7, 0x38, - 0x7d, 0x40, 0xff, 0xa8, 0x1f, 0xcf, 0x21, 0xcd, - 0xa1, 0xc0, + 0xea, 0x7, 0xfd, 0x61, 0xf4, 0x87, 0x2c, 0x1e, + 0xc3, 0xa4, 0x27, 0xd5, 0x79, 0xd, 0x6, 0x42, + 0x60, 0xfa, 0x42, 0x42, 0x83, 0x41, 0xfd, 0x6, + 0x80, 0x85, 0x7, 0xfd, 0x84, 0x88, 0x64, 0x3f, + 0xf8, 0x8e, 0x12, 0x1f, 0xfc, 0x14, 0x2c, 0x36, + 0x1f, 0xfc, 0x1c, 0x32, 0x1f, 0xfc, 0x94, 0x32, + 0x1f, 0xfc, 0x14, 0x3f, 0xff, 0xe1, 0xff, 0xff, + 0xf, 0xff, 0xaa, 0x1f, 0xfc, 0x14, 0x32, 0x1f, + 0xfc, 0xec, 0x3f, 0xf8, 0x38, 0x4e, 0x12, 0x1f, + 0xfc, 0x14, 0x2d, 0xc, 0x87, 0xff, 0x11, 0x10, + 0xa0, 0xff, 0xa0, 0x90, 0x41, 0xa0, 0xfe, 0x50, + 0x50, 0x48, 0x4c, 0x1f, 0x50, 0x24, 0x34, 0x84, + 0xfa, 0xaf, 0x21, 0xa0, 0xe9, 0xe, 0x58, 0x3d, + 0x87, 0xd4, 0xf, 0xfa, 0xc3, 0xf9, 0xe4, 0x39, + 0xb4, 0x38, /* U+00D5 "Õ" */ 0xf, 0x99, 0xf, 0x7a, 0xf, 0xf7, 0x36, 0x19, 0x2, 0x1f, 0xd0, 0x76, 0x82, 0x2, 0x1f, 0xc8, - 0x7a, 0xf0, 0x58, 0x7e, 0x42, 0xf4, 0x1e, 0x50, - 0x7e, 0xc1, 0x1, 0x83, 0xa0, 0xfe, 0x40, 0x84, - 0xf3, 0x61, 0xfe, 0xf8, 0x3c, 0xc8, 0x7f, 0xfc, - 0x1b, 0xfa, 0x43, 0xff, 0x80, 0xf2, 0x1c, 0xda, - 0x1f, 0xd4, 0xf, 0xfa, 0x81, 0xf4, 0x87, 0x2c, - 0x1c, 0xe1, 0xca, 0xd, 0xea, 0xbc, 0x86, 0x83, - 0x41, 0x38, 0x7d, 0x21, 0x21, 0x41, 0xa0, 0xfe, - 0x83, 0x40, 0x42, 0x83, 0xfe, 0xc2, 0x44, 0x32, - 0x1f, 0xfc, 0x47, 0x9, 0xf, 0xfe, 0xa, 0x16, - 0x1b, 0xf, 0xfe, 0xe, 0x12, 0x83, 0xff, 0xb8, - 0x87, 0xe4, 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xf, - 0xfe, 0xaa, 0x1f, 0xfd, 0x84, 0x3f, 0x61, 0xff, - 0xc5, 0x50, 0x7f, 0xf1, 0x70, 0xd8, 0x48, 0x7f, - 0xf0, 0x50, 0xb4, 0x32, 0x1f, 0xfc, 0x44, 0x42, - 0x83, 0xfe, 0x82, 0x41, 0x6, 0x83, 0xfa, 0x42, - 0x82, 0x42, 0x70, 0xfa, 0x42, 0x43, 0x41, 0xde, - 0xab, 0xc8, 0x68, 0x3b, 0x43, 0x96, 0xe, 0x70, - 0xfa, 0x81, 0xff, 0x50, 0x3f, 0x9e, 0x43, 0x9b, - 0x43, 0x80, + 0x7a, 0xf0, 0x58, 0x7e, 0x82, 0xf2, 0x1f, 0x21, + 0xff, 0x40, 0xa0, 0x76, 0x1f, 0xc8, 0x10, 0x9e, + 0x6c, 0x3f, 0xdf, 0x7, 0x99, 0xf, 0xff, 0x83, + 0x7f, 0x48, 0x7f, 0xf0, 0x1e, 0x43, 0x9b, 0x43, + 0xfa, 0x81, 0xff, 0x58, 0x7d, 0x21, 0xcb, 0x7, + 0xb0, 0xe9, 0x9, 0xf5, 0x5e, 0x43, 0x41, 0x90, + 0x98, 0x3e, 0x90, 0x90, 0xa0, 0xd0, 0x7f, 0x41, + 0xa0, 0x21, 0x41, 0xff, 0x61, 0x22, 0x19, 0xf, + 0xfe, 0x23, 0x84, 0x87, 0xff, 0x5, 0xb, 0xd, + 0x87, 0xff, 0x7, 0xc, 0x87, 0xff, 0x25, 0xc, + 0x87, 0xff, 0x5, 0xf, 0xff, 0xf8, 0x7f, 0xff, + 0xc3, 0xff, 0xea, 0x87, 0xff, 0x5, 0xc, 0x87, + 0xff, 0x3b, 0xf, 0xfe, 0xe, 0x13, 0x84, 0x87, + 0xff, 0x5, 0xb, 0x43, 0x21, 0xff, 0xc4, 0x44, + 0x28, 0x3f, 0xe8, 0x24, 0x10, 0x68, 0x3f, 0x94, + 0x14, 0x12, 0x13, 0x7, 0xd4, 0x9, 0xd, 0x21, + 0x3e, 0xab, 0xc8, 0x68, 0x3a, 0x43, 0x96, 0xf, + 0x61, 0xf5, 0x3, 0xfe, 0xb0, 0xfe, 0x79, 0xe, + 0x6d, 0xe, /* U+00D6 "Ö" */ 0xe, 0xf8, 0x3e, 0xf8, 0x3f, 0xb0, 0xb0, 0xec, 0x2c, 0x3f, 0xfd, 0x58, 0x58, 0x76, 0x16, 0x1f, 0xdf, 0x7, 0xdf, 0x7, 0xff, 0xfc, 0x3c, 0xdf, 0xd2, 0x1f, 0xfc, 0x7, 0x90, 0xe6, 0xd0, 0xfe, - 0xa0, 0x7f, 0xd4, 0xf, 0xa4, 0x39, 0x60, 0xe7, - 0xe, 0x50, 0x6f, 0x55, 0xe4, 0x34, 0x1a, 0x9, - 0xc3, 0xe9, 0x9, 0xa, 0xd, 0x7, 0xf4, 0x1a, - 0x2, 0x14, 0x1f, 0xf4, 0x12, 0x21, 0x90, 0xff, - 0x90, 0xce, 0x12, 0x1f, 0xfc, 0x14, 0x2c, 0x36, - 0x1f, 0xfc, 0x1c, 0x25, 0x7, 0xff, 0x95, 0xf, - 0xfe, 0xa, 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, - 0xff, 0x1d, 0xf, 0xfe, 0xa, 0x1f, 0xfe, 0x55, - 0x5, 0x87, 0xff, 0x7, 0xd, 0x84, 0x87, 0xff, - 0x5, 0xb, 0x43, 0x21, 0xff, 0x21, 0x91, 0xa, - 0xf, 0xfa, 0x9, 0x4, 0x1a, 0xf, 0xe8, 0x34, - 0x12, 0x13, 0x87, 0xd2, 0x12, 0x1a, 0xe, 0xf5, - 0x5e, 0x43, 0x41, 0xda, 0x1c, 0xb0, 0x73, 0x87, - 0xd4, 0xf, 0xfa, 0x81, 0xfc, 0xf2, 0x1c, 0xda, - 0x1c, + 0xa0, 0x7f, 0xd6, 0x1f, 0x48, 0x72, 0xc1, 0xec, + 0x3a, 0x42, 0x7d, 0x57, 0x90, 0xd0, 0x64, 0x26, + 0xf, 0xa4, 0x24, 0x28, 0x34, 0x1f, 0xd0, 0x68, + 0x8, 0x50, 0x7f, 0xd8, 0x48, 0x86, 0x43, 0xff, + 0x88, 0xe1, 0x21, 0xff, 0xc1, 0x42, 0xc3, 0x61, + 0xff, 0xc1, 0xc3, 0x21, 0xff, 0xc9, 0x43, 0x21, + 0xff, 0xc1, 0x43, 0xff, 0xfe, 0x1f, 0xff, 0xf0, + 0xff, 0xfa, 0xa1, 0xff, 0xc1, 0x43, 0x21, 0xff, + 0xce, 0xc3, 0xff, 0x83, 0x84, 0xe1, 0x21, 0xff, + 0xc1, 0x42, 0xd0, 0xc8, 0x7f, 0xf1, 0x11, 0xa, + 0xf, 0xfa, 0x9, 0x4, 0x1a, 0xf, 0xe5, 0x5, + 0x4, 0x84, 0xc1, 0xf5, 0x2, 0x43, 0x48, 0x4f, + 0xaa, 0xf2, 0x1a, 0xe, 0x90, 0xe5, 0x83, 0xd8, + 0x7d, 0x40, 0xff, 0xac, 0x3f, 0x9e, 0x43, 0x9b, + 0x43, 0x80, /* U+00D7 "×" */ 0xf, 0xfe, 0x4f, 0x7, 0xf9, 0xd0, 0xb1, 0x41, @@ -1774,59 +1776,57 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+00D8 "Ø" */ 0xf, 0xfe, 0x45, 0xe4, 0x3f, 0xf9, 0x8, 0x10, - 0xfd, 0x7f, 0x48, 0x48, 0x10, 0xfa, 0xd0, 0xe6, - 0xd2, 0x4, 0x1e, 0xd0, 0xff, 0x50, 0x8, 0x7b, - 0xe, 0x58, 0x39, 0x4, 0x1d, 0x86, 0xba, 0xb8, - 0x39, 0xe, 0x43, 0x68, 0x73, 0x86, 0x43, 0xa0, - 0xa0, 0xfe, 0x83, 0x21, 0x41, 0x90, 0xfe, 0x83, - 0x41, 0x21, 0x41, 0xfd, 0x7, 0xff, 0x5, 0xf, - 0xe4, 0x3c, 0x88, 0x48, 0x7f, 0x40, 0x90, 0xb3, - 0xf, 0xfe, 0xa, 0x7, 0x9, 0x10, 0xb0, 0xfd, - 0x2, 0x10, 0xff, 0xe3, 0x20, 0x43, 0xfe, 0x43, - 0xe8, 0x10, 0x7f, 0xf1, 0xd4, 0x4, 0x3f, 0xf8, - 0xf0, 0x20, 0xff, 0xe3, 0xa1, 0x21, 0xff, 0xc7, - 0x81, 0x87, 0xff, 0x9, 0xc, 0x81, 0xf, 0xfe, - 0x44, 0x8, 0x3f, 0xf8, 0xe8, 0x10, 0xff, 0xe0, - 0x21, 0x61, 0x40, 0x83, 0xc8, 0x76, 0x12, 0x8, - 0x8, 0x7d, 0x84, 0x88, 0x79, 0x4, 0x1f, 0x21, - 0x61, 0xe6, 0x4, 0x1f, 0xfc, 0x4, 0x8, 0x52, - 0x4, 0x3e, 0x82, 0x42, 0x83, 0xd0, 0x7e, 0x42, - 0xc3, 0x21, 0xc8, 0x7d, 0x86, 0x43, 0x41, 0xc8, - 0x73, 0x86, 0xc3, 0xd0, 0x6b, 0xab, 0x83, 0x41, - 0xf4, 0x1e, 0x58, 0x3a, 0x43, 0xc8, 0x14, 0x1f, - 0xed, 0xf, 0xa0, 0x53, 0x43, 0x9b, 0xf, 0xd0, - 0x10, 0xaf, 0xe9, 0xf, 0xed, 0xa0, 0x7f, 0xf1, - 0xc0, + 0xfd, 0x7f, 0x48, 0x50, 0x20, 0xfa, 0xd0, 0xe6, + 0xc0, 0x8a, 0xf, 0x68, 0x7f, 0xbc, 0x8, 0x3d, + 0x87, 0x2c, 0x1f, 0x21, 0xec, 0x35, 0xd5, 0xc1, + 0xd8, 0x74, 0x1b, 0x43, 0x9c, 0x34, 0x1c, 0x85, + 0x7, 0xff, 0x9, 0xa, 0xc, 0x87, 0xe4, 0x3b, + 0x9, 0xa, 0xf, 0xe8, 0x39, 0xf, 0x90, 0xfc, + 0x81, 0xc, 0x88, 0x48, 0x7f, 0x40, 0x90, 0xb3, + 0xf, 0xfe, 0x2, 0x8, 0xc2, 0x44, 0x2c, 0x3f, + 0x40, 0x44, 0x3f, 0xf8, 0xb0, 0x20, 0xff, 0xe0, + 0x21, 0xf2, 0x4, 0x3f, 0xf8, 0xf0, 0x20, 0xff, + 0xe4, 0x20, 0x43, 0xff, 0x8f, 0x2, 0xf, 0xfe, + 0x42, 0x4, 0x3f, 0xf8, 0xf0, 0x20, 0xff, 0xe1, + 0xa1, 0x90, 0x21, 0xff, 0xc7, 0x81, 0x7, 0xff, + 0x1, 0xb, 0x2, 0x85, 0x7, 0x90, 0xec, 0x3d, + 0x2, 0xf, 0xb0, 0x91, 0x9, 0x10, 0x21, 0xf9, + 0xb, 0xf, 0x30, 0x20, 0xff, 0xe0, 0x20, 0x42, + 0x80, 0x87, 0xe8, 0x24, 0x28, 0x3d, 0x7, 0xe4, + 0x2c, 0x32, 0x19, 0xf, 0xd8, 0x64, 0x34, 0x19, + 0x41, 0xce, 0x1b, 0xf, 0x21, 0xae, 0xae, 0xd, + 0x7, 0xc8, 0x79, 0x60, 0xe9, 0xf, 0x40, 0x50, + 0x7f, 0xb4, 0x3e, 0x41, 0x4d, 0xe, 0x6c, 0x3f, + 0x40, 0x82, 0xbf, 0xa4, 0x3f, 0xb6, 0x43, 0xff, + 0x8e, /* U+00D9 "Ù" */ - 0x9, 0xfd, 0x7, 0xff, 0xd, 0x41, 0x28, 0x3f, - 0xf8, 0x72, 0x14, 0x1f, 0xfc, 0x48, 0x34, 0x1f, - 0xfc, 0x4c, 0x25, 0x7, 0xff, 0x13, 0xa, 0xf, - 0xfe, 0x2c, 0x14, 0x1f, 0xfc, 0x47, 0xe8, 0x3f, - 0xfc, 0xdf, 0x83, 0xff, 0x83, 0xf8, 0x3f, 0xff, - 0xe1, 0xff, 0xff, 0xf, 0xff, 0xf8, 0x7f, 0xff, - 0xc3, 0xff, 0xfe, 0x1f, 0xff, 0xf0, 0xff, 0xec, - 0xa1, 0xff, 0x21, 0xff, 0xcd, 0x42, 0xc3, 0xfe, - 0xc2, 0x70, 0x90, 0xff, 0x90, 0xb4, 0x32, 0x1f, - 0xc8, 0x64, 0x42, 0xa0, 0x7d, 0x40, 0x90, 0x41, - 0x9f, 0x55, 0xe4, 0x34, 0x16, 0x1e, 0x58, 0x3d, - 0x87, 0x68, 0x7f, 0xd6, 0x1f, 0x5c, 0x87, 0x36, - 0x86, + 0xa, 0xfd, 0x7, 0xff, 0xe, 0x42, 0x50, 0x7f, + 0xf0, 0xe4, 0x28, 0x3f, 0xf8, 0x90, 0x68, 0x3f, + 0xf8, 0x98, 0x4a, 0xf, 0xfe, 0x26, 0x14, 0x1f, + 0xfc, 0x58, 0x28, 0x3f, 0xf8, 0x8f, 0xd0, 0x7f, + 0xf9, 0xbf, 0x7, 0xff, 0x7, 0xf0, 0x7f, 0xff, + 0xc3, 0xff, 0xfe, 0x1f, 0xff, 0xf0, 0xff, 0xff, + 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xff, 0xee, + 0x43, 0xfe, 0x43, 0xff, 0x98, 0xa0, 0xa0, 0xff, + 0xa0, 0xb8, 0x32, 0x1f, 0xc8, 0x64, 0x42, 0xa0, + 0x7d, 0x40, 0x90, 0x41, 0x9f, 0x55, 0xe4, 0x34, + 0x16, 0x1e, 0x58, 0x3d, 0x87, 0x68, 0x7f, 0xce, + 0x1f, 0x5c, 0x87, 0x37, 0x6, /* U+00DA "Ú" */ - 0xf, 0xfe, 0x5, 0xf9, 0xf, 0xfe, 0x12, 0x82, - 0x50, 0x7f, 0xf0, 0xa0, 0x98, 0x3f, 0xf8, 0x50, - 0x4c, 0x1f, 0xfc, 0x25, 0x5, 0x7, 0xff, 0xe, - 0xb, 0xf, 0xfe, 0x1c, 0x16, 0x1f, 0xfc, 0x4b, - 0xe0, 0xff, 0xf3, 0xfe, 0xf, 0xfe, 0xf, 0xe0, - 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, + 0xf, 0xfe, 0x5, 0xfa, 0xf, 0xfe, 0x12, 0x82, + 0x60, 0xff, 0xe1, 0x41, 0x30, 0x7f, 0xf0, 0xa0, + 0x98, 0x3f, 0xf8, 0x4a, 0xa, 0xf, 0xfe, 0x1c, + 0x16, 0x1f, 0xfc, 0x38, 0x2c, 0x3f, 0xf8, 0x97, + 0xc1, 0xff, 0xe7, 0xfc, 0x1f, 0xfc, 0x1f, 0xc1, 0xff, 0xff, 0xf, 0xff, 0xf8, 0x7f, 0xff, 0xc3, - 0xff, 0xb2, 0x87, 0xfc, 0x87, 0xff, 0x35, 0xb, - 0xf, 0xfb, 0x9, 0xc2, 0x43, 0xfe, 0x42, 0xd0, - 0xc8, 0x7f, 0x21, 0x91, 0xa, 0x81, 0xf5, 0x2, - 0x41, 0x6, 0x7d, 0x57, 0x90, 0xd0, 0x58, 0x79, - 0x60, 0xf6, 0x1d, 0xa1, 0xff, 0x58, 0x7d, 0x72, - 0x1c, 0xda, 0x18, + 0xff, 0xfe, 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, + 0xff, 0xb9, 0xf, 0xf9, 0xf, 0xfe, 0x62, 0x82, + 0x83, 0xfe, 0x82, 0xe0, 0xc8, 0x7f, 0x21, 0x91, + 0xa, 0x81, 0xf5, 0x2, 0x41, 0x6, 0x7d, 0x57, + 0x90, 0xd0, 0x58, 0x79, 0x60, 0xf6, 0x1d, 0xa1, + 0xff, 0x38, 0x7d, 0x72, 0x1c, 0xdc, 0x18, /* U+00DB "Û" */ 0xf, 0xef, 0x83, 0xff, 0x8b, 0x85, 0x87, 0xff, @@ -1836,12 +1836,12 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xe, 0x68, 0x87, 0xff, 0x8b, 0xf0, 0x7f, 0xf0, 0x7f, 0x7, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xf, 0xff, 0xf8, 0x7f, 0xff, 0xc3, 0xff, - 0xfe, 0x1f, 0xfd, 0x94, 0x3f, 0xe4, 0x3f, 0xf9, - 0xa8, 0x58, 0x7f, 0xd8, 0x4e, 0x12, 0x1f, 0xf2, - 0x16, 0x86, 0x43, 0xf9, 0xc, 0x88, 0x54, 0xf, - 0xa8, 0x12, 0x8, 0x33, 0xea, 0xbc, 0x86, 0x82, - 0xc3, 0xcb, 0x7, 0xb0, 0xed, 0xf, 0xfa, 0xc3, - 0xeb, 0x90, 0xe6, 0xd0, 0xc0, + 0xfe, 0x1f, 0xfe, 0xe4, 0x3f, 0xe4, 0x3f, 0xf9, + 0x8a, 0xa, 0xf, 0xfa, 0xb, 0x83, 0x21, 0xfc, + 0x86, 0x44, 0x2a, 0x7, 0xd4, 0x9, 0x4, 0x19, + 0xf5, 0x5e, 0x43, 0x41, 0x61, 0xe5, 0x83, 0xd8, + 0x76, 0x87, 0xfc, 0xe1, 0xf5, 0xc8, 0x73, 0x70, + 0x60, /* U+00DC "Ü" */ 0xd, 0xf0, 0x7d, 0xf0, 0x7d, 0x85, 0x87, 0x61, @@ -1849,304 +1849,298 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xe0, 0xfb, 0xe0, 0xff, 0xfb, 0xfe, 0xf, 0xfe, 0xf, 0xe0, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xf, 0xff, 0xf8, 0x7f, - 0xff, 0xc3, 0xff, 0xb2, 0x87, 0xfc, 0x87, 0xff, - 0x35, 0xb, 0xf, 0xfb, 0x9, 0xc2, 0x43, 0xfe, - 0x42, 0xd0, 0xc8, 0x7f, 0x21, 0x91, 0xa, 0x81, - 0xf5, 0x2, 0x41, 0x6, 0x7d, 0x57, 0x90, 0xd0, - 0x58, 0x79, 0x60, 0xf6, 0x1d, 0xa1, 0xff, 0x58, - 0x7d, 0x72, 0x1c, 0xda, 0x18, + 0xff, 0xc3, 0xff, 0xdc, 0x87, 0xfc, 0x87, 0xff, + 0x31, 0x41, 0x41, 0xff, 0x41, 0x70, 0x64, 0x3f, + 0x90, 0xc8, 0x85, 0x40, 0xfa, 0x81, 0x20, 0x83, + 0x3e, 0xab, 0xc8, 0x68, 0x2c, 0x3c, 0xb0, 0x7b, + 0xe, 0xd0, 0xff, 0x9c, 0x3e, 0xb9, 0xe, 0x6e, + 0xc, /* U+00DD "Ý" */ 0xf, 0xfe, 0x13, 0x58, 0x3f, 0xf8, 0xcc, 0xb0, 0x7f, 0xf1, 0xe0, 0x98, 0x3f, 0xf8, 0xb0, 0x68, 0x3f, 0xf8, 0xc8, 0x58, 0x7f, 0xf1, 0xb0, 0xb0, - 0xff, 0xe3, 0x21, 0x61, 0xff, 0xc8, 0x54, 0x1f, - 0xfc, 0x86, 0x88, 0x7f, 0xf5, 0x9f, 0xc8, 0x7f, - 0xf0, 0x7f, 0x48, 0x68, 0x3f, 0xf8, 0x10, 0x68, - 0x43, 0xff, 0x88, 0x87, 0xa0, 0xd0, 0x7f, 0x90, - 0xd0, 0x48, 0x48, 0x7f, 0xa0, 0xc8, 0x50, 0x64, - 0x3f, 0xf8, 0x30, 0x72, 0x14, 0x1f, 0xa0, 0xc8, - 0x76, 0x1f, 0xfc, 0x4, 0x28, 0x3c, 0x86, 0x83, - 0xc8, 0x64, 0x3e, 0x82, 0x43, 0xd0, 0x48, 0x7e, - 0x43, 0x21, 0xfd, 0x7, 0xf4, 0x14, 0x1a, 0x9, - 0xf, 0xf2, 0x19, 0x9, 0xa, 0xf, 0xf9, 0xb, - 0x2, 0x1f, 0xfc, 0x48, 0x24, 0x10, 0x50, 0x7f, - 0xf0, 0x50, 0x94, 0x19, 0xf, 0xfe, 0xc, 0x15, - 0x85, 0x7, 0xff, 0xd, 0x9, 0x9, 0xf, 0xfe, - 0x1e, 0x1e, 0x83, 0xff, 0x88, 0x87, 0x90, 0xff, - 0xe2, 0xc1, 0x90, 0xff, 0xe3, 0x21, 0xa0, 0xff, - 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xff, - 0xfc, + 0xff, 0xe3, 0x21, 0x61, 0xff, 0xc8, 0x56, 0x1f, + 0xfc, 0x86, 0x81, 0xff, 0xd7, 0x7f, 0x21, 0xff, + 0xc1, 0xfd, 0x21, 0xa0, 0xff, 0xe0, 0x41, 0xa1, + 0xf, 0xfe, 0x22, 0x12, 0x8, 0x34, 0x1f, 0xe4, + 0x36, 0x12, 0x12, 0x1f, 0xe8, 0x32, 0x14, 0x19, + 0xf, 0xfe, 0xc, 0x1c, 0x85, 0x7, 0xe8, 0x32, + 0x1d, 0x87, 0xff, 0x1, 0xa, 0xf, 0x21, 0xa0, + 0xf2, 0x19, 0xf, 0xa0, 0x90, 0xf4, 0x12, 0x1f, + 0x90, 0xc8, 0x64, 0x34, 0x1f, 0xd0, 0x50, 0x6c, + 0x24, 0x3f, 0xc8, 0x7e, 0x42, 0x83, 0xfe, 0x42, + 0x80, 0x84, 0x87, 0xff, 0x2, 0x9, 0x4, 0x16, + 0x1f, 0xfc, 0x14, 0x25, 0x6, 0x43, 0xff, 0x83, + 0x5, 0x61, 0x41, 0xff, 0xc3, 0x42, 0x42, 0x43, + 0xff, 0x87, 0x87, 0xa0, 0xff, 0xe2, 0x21, 0xe4, + 0x3f, 0xf8, 0xb0, 0x64, 0x3f, 0xf8, 0xc8, 0x68, + 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xf, 0xff, 0xf8, + 0x7f, 0xff, 0x0, /* U+00DE "Þ" */ - 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xed, 0xd7, 0x94, - 0x1f, 0xf2, 0xfa, 0x9e, 0x43, 0xff, 0x8d, 0x40, - 0xff, 0xe3, 0x30, 0x7b, 0xfe, 0x83, 0x28, 0x3f, - 0xf8, 0xe, 0x1a, 0xf, 0xfe, 0x16, 0x19, 0xf, - 0xfe, 0x36, 0x1f, 0xfc, 0x28, 0x24, 0x3f, 0xfa, - 0xa8, 0x7f, 0xf1, 0x90, 0xff, 0xec, 0xc1, 0x21, - 0xff, 0xc6, 0xc3, 0xff, 0x83, 0x86, 0x43, 0xfe, - 0x70, 0xd0, 0x77, 0xfd, 0x6, 0x50, 0x7f, 0xf1, - 0x18, 0x3f, 0xf8, 0x94, 0xf, 0x97, 0xd4, 0xf2, - 0x1f, 0xab, 0xca, 0xf, 0xff, 0xf8, 0x7f, 0xf8, - 0x80, + 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xed, 0xd7, 0xc8, + 0x7f, 0xcb, 0xf5, 0xe4, 0x3f, 0xf8, 0xd4, 0xf, + 0xfe, 0x33, 0x7, 0xbf, 0xe8, 0x32, 0x83, 0xff, + 0x80, 0xe1, 0xa0, 0xff, 0xe1, 0x61, 0x90, 0xff, + 0xe1, 0x21, 0x61, 0xff, 0xc2, 0xc2, 0x43, 0xff, + 0x84, 0x87, 0xff, 0xb1, 0xf, 0xfe, 0x36, 0x12, + 0x1f, 0xfc, 0x24, 0x2c, 0x3f, 0xf8, 0x38, 0x64, + 0x3f, 0xe7, 0xd, 0x7, 0x7f, 0xd0, 0x65, 0x7, + 0xff, 0x11, 0x83, 0xff, 0x89, 0x40, 0xf9, 0x7e, + 0xbc, 0x87, 0xea, 0xf9, 0xf, 0xff, 0xf8, 0x7f, + 0xf8, 0x80, /* U+00DF "ß" */ 0xe, 0xbf, 0x48, 0x7f, 0xce, 0x86, 0x6d, 0xf, 0xd4, 0xf, 0xe9, 0xf, 0x28, 0x32, 0x83, 0xa0, - 0xf4, 0x1b, 0xa6, 0x86, 0x43, 0x21, 0xb0, 0xd0, - 0x6c, 0x36, 0x12, 0x1e, 0x82, 0x43, 0x21, 0x61, - 0xff, 0xce, 0x43, 0xff, 0x80, 0x87, 0x90, 0xff, - 0xe3, 0xe1, 0x21, 0xff, 0xc3, 0x42, 0xc3, 0xff, - 0x84, 0x86, 0x43, 0xff, 0x85, 0x5, 0x7, 0xff, - 0x9, 0xc, 0x87, 0xff, 0xa, 0xa, 0xf, 0xfe, - 0xda, 0x1f, 0xfc, 0x74, 0x3f, 0xf8, 0x68, 0x50, - 0x7f, 0xf0, 0xf0, 0xd0, 0x7f, 0xf0, 0x94, 0x13, - 0x7, 0xff, 0xa, 0xc, 0xc1, 0xff, 0xc2, 0xc3, - 0x30, 0x7f, 0xf0, 0xb0, 0xca, 0xf, 0xfe, 0x16, - 0x1a, 0xf, 0xfe, 0x1e, 0x1a, 0xf, 0xfe, 0x1c, - 0x12, 0x1f, 0xfc, 0x34, 0x3f, 0xfd, 0xf0, 0x48, - 0x7d, 0xc1, 0xe4, 0x2c, 0x3f, 0x3e, 0xa7, 0x83, - 0x21, 0xe4, 0x32, 0x83, 0xa0, 0xff, 0xe3, 0x48, - 0x7c, 0xf2, 0x19, 0xb4, 0x0, + 0xf4, 0x1b, 0xa7, 0x6, 0x43, 0xfb, 0xc, 0xa0, + 0xb0, 0xd0, 0x48, 0x7b, 0x9, 0xc, 0x85, 0x87, + 0x90, 0xff, 0xea, 0x21, 0xe4, 0x3f, 0xf8, 0xf8, + 0x48, 0x7f, 0xf0, 0xd0, 0xb0, 0xff, 0xe1, 0x21, + 0x90, 0xff, 0xe1, 0x41, 0x41, 0xff, 0xc2, 0x43, + 0x21, 0xff, 0xc2, 0x82, 0x83, 0xff, 0x8e, 0x87, + 0xff, 0x6d, 0xf, 0xfe, 0x1a, 0x14, 0x1f, 0xfc, + 0x3c, 0x34, 0x1f, 0xfc, 0x25, 0x4, 0xc1, 0xff, + 0xc2, 0x83, 0x30, 0x7f, 0xf0, 0xb0, 0xcc, 0x1f, + 0xfc, 0x2c, 0x32, 0x83, 0xff, 0x85, 0x86, 0x83, + 0xff, 0x87, 0x86, 0x83, 0xff, 0x87, 0x4, 0x87, + 0xff, 0xd, 0xf, 0xff, 0x7a, 0x1f, 0xf7, 0x7, + 0xa0, 0xa0, 0xfc, 0xfa, 0x9e, 0xc, 0x87, 0x90, + 0xca, 0xe, 0x83, 0xff, 0x8d, 0x21, 0xf3, 0xc8, + 0x75, 0xa0, /* U+00E0 "à" */ - 0x3, 0x59, 0xf, 0xfe, 0x2, 0xf4, 0x1f, 0xfc, - 0x1c, 0x36, 0x1f, 0xfc, 0x1c, 0x32, 0x1f, 0xfc, - 0x1c, 0x28, 0x3f, 0xf8, 0x58, 0x50, 0x7f, 0xf0, - 0xa0, 0x28, 0x3f, 0xf8, 0x2f, 0xc8, 0x7f, 0xfd, - 0x5b, 0xf4, 0x87, 0xf7, 0x21, 0x9b, 0x43, 0xd8, - 0x7f, 0xa8, 0x1b, 0xe, 0x50, 0x72, 0x14, 0x1a, - 0xe9, 0xc1, 0xa0, 0x21, 0x48, 0x65, 0x4, 0x87, - 0x90, 0xf6, 0x1e, 0xfc, 0x1f, 0x21, 0xff, 0xe2, - 0x6f, 0xf0, 0x7e, 0x79, 0xf, 0xfe, 0xd, 0x3, - 0xff, 0x86, 0xa0, 0xf2, 0xe0, 0xf4, 0x19, 0xf5, - 0x60, 0xe4, 0x35, 0x3, 0xfe, 0x82, 0x50, 0x7f, - 0xf1, 0x30, 0xff, 0xe2, 0xa1, 0xff, 0xc5, 0x43, - 0xe4, 0x3f, 0xb0, 0xfa, 0xe, 0x42, 0x50, 0x76, - 0x1e, 0x83, 0x5d, 0x3c, 0x1f, 0x90, 0xe5, 0x5, - 0x6, 0x4a, 0x7, 0xe9, 0xd, 0x81, 0xd0, 0xce, - 0x92, 0xd8, + 0x3, 0xfc, 0x1f, 0xfc, 0x5, 0x6, 0x43, 0xff, + 0x81, 0x6, 0x83, 0xff, 0x83, 0x86, 0x43, 0xff, + 0x83, 0x85, 0x7, 0xff, 0xa, 0xa, 0xf, 0xfe, + 0xa, 0x80, 0x87, 0xff, 0xa, 0xb2, 0x1f, 0xfc, + 0x25, 0xc1, 0xff, 0xe3, 0x6f, 0xe8, 0x3f, 0xb9, + 0xe, 0x74, 0x3d, 0x87, 0xfa, 0x43, 0x61, 0xca, + 0xe, 0x82, 0x83, 0x5d, 0x3c, 0x1a, 0x2, 0x14, + 0x87, 0x21, 0x21, 0xe4, 0x3d, 0x87, 0xbf, 0x7, + 0xc8, 0x7f, 0xf8, 0x9b, 0xfc, 0x1f, 0x9e, 0x43, + 0xff, 0x83, 0x40, 0xff, 0xe1, 0xa8, 0x3c, 0xb8, + 0x3d, 0x6, 0xbd, 0x58, 0x39, 0xd, 0xa1, 0xff, + 0x41, 0x21, 0xff, 0xc5, 0x83, 0xff, 0xbe, 0x87, + 0xf2, 0x1f, 0x41, 0xc8, 0x50, 0x7b, 0xf, 0x41, + 0xba, 0xbc, 0x1f, 0xa0, 0xcb, 0x5, 0x6, 0x46, + 0xf, 0xd2, 0x1b, 0x3, 0xa1, 0x9d, 0x25, 0xb0, /* U+00E1 "á" */ 0xf, 0xf9, 0xac, 0x1f, 0xfc, 0x19, 0x60, 0xff, 0xe0, 0xe1, 0x30, 0x7f, 0xd0, 0x4c, 0x1f, 0xfc, 0x4, 0x28, 0x3f, 0xf8, 0x18, 0x58, 0x7f, 0xf0, 0x20, 0xb0, 0xff, 0xe0, 0xdf, 0x7, 0xff, 0xd9, - 0xbf, 0x48, 0x7f, 0x72, 0x19, 0xb4, 0x3d, 0x87, - 0xfa, 0x81, 0xb0, 0xe5, 0x7, 0x21, 0x41, 0xae, - 0x9c, 0x1a, 0x2, 0x14, 0x86, 0x50, 0x48, 0x79, - 0xf, 0x61, 0xef, 0xc1, 0xf2, 0x1f, 0xfe, 0x26, - 0xff, 0x7, 0xe7, 0x90, 0xff, 0xe0, 0xd0, 0x3f, - 0xf8, 0x6a, 0xf, 0x2e, 0xf, 0x41, 0x9f, 0x56, - 0xe, 0x43, 0x50, 0x3f, 0xe8, 0x25, 0x7, 0xff, - 0x13, 0xf, 0xfe, 0x2a, 0x1f, 0xfc, 0x54, 0x3e, - 0x43, 0xfb, 0xf, 0xa0, 0xe4, 0x25, 0x7, 0x61, - 0xe8, 0x35, 0xd3, 0xc1, 0xf9, 0xe, 0x50, 0x50, - 0x64, 0xa0, 0x7e, 0x90, 0xd8, 0x1d, 0xc, 0xe9, - 0x2d, 0x80, + 0xbf, 0xa0, 0xfe, 0xa2, 0x1c, 0xe8, 0x7b, 0x43, + 0xfa, 0x43, 0x61, 0xca, 0xe, 0x82, 0x43, 0x5d, + 0x3c, 0x1a, 0x4, 0x14, 0x87, 0x21, 0x21, 0xe4, + 0x3d, 0x87, 0xbf, 0x7, 0xc8, 0x7f, 0xf8, 0x9b, + 0xfc, 0x1f, 0x9e, 0x43, 0xff, 0x83, 0x40, 0xff, + 0xe1, 0xa8, 0x3c, 0xb8, 0x3d, 0x6, 0xbd, 0x58, + 0x39, 0xd, 0xa1, 0xff, 0x41, 0x21, 0xff, 0xc5, + 0x83, 0xff, 0xbe, 0x87, 0xf2, 0x1f, 0x41, 0xc8, + 0x50, 0x7b, 0xf, 0x41, 0xba, 0xbc, 0x1f, 0xa0, + 0xcb, 0x5, 0x6, 0x46, 0xf, 0xd2, 0x1b, 0x3, + 0xa1, 0x9d, 0x25, 0xb0, /* U+00E2 "â" */ 0xf, 0xcc, 0x87, 0xff, 0xa, 0x8c, 0x87, 0xff, 0x1, 0x41, 0x41, 0xff, 0xc0, 0x80, 0x83, 0xf, - 0xf6, 0xa, 0x20, 0x83, 0xf4, 0x12, 0x40, 0x50, - 0x7a, 0x41, 0x85, 0x2, 0xf, 0x5f, 0x6, 0x7e, - 0xf, 0xff, 0x93, 0x7e, 0x90, 0xfe, 0xe4, 0x33, - 0x68, 0x7b, 0xf, 0xf5, 0x3, 0x61, 0xca, 0xe, - 0x42, 0x83, 0x5d, 0x38, 0x34, 0x4, 0x29, 0xc, - 0xa0, 0x90, 0xf2, 0x1e, 0xc3, 0xdf, 0x83, 0xe4, - 0x3f, 0xfc, 0x4d, 0xfe, 0xf, 0xcf, 0x21, 0xff, - 0xc1, 0xa0, 0x7f, 0xf0, 0xd4, 0x1e, 0x5c, 0x1e, - 0x83, 0x3e, 0xac, 0x1c, 0x86, 0xa0, 0x7f, 0xd0, - 0x4a, 0xf, 0xfe, 0x26, 0x1f, 0xfc, 0x54, 0x3f, - 0xf8, 0xa8, 0x7c, 0x87, 0xf6, 0x1f, 0x41, 0xc8, - 0x4a, 0xe, 0xc3, 0xd0, 0x6b, 0xa7, 0x83, 0xf2, - 0x1c, 0xa0, 0xa0, 0xc9, 0x40, 0xfd, 0x21, 0xb0, - 0x3a, 0x19, 0xd2, 0x5b, + 0xf6, 0x6, 0x41, 0x7, 0xe8, 0x28, 0x80, 0xa0, + 0xf4, 0x83, 0xa, 0x4, 0x1e, 0xbe, 0xc, 0xfc, + 0x1f, 0xff, 0x26, 0xfe, 0x83, 0xfa, 0x88, 0x73, + 0xa1, 0xed, 0xf, 0xe9, 0xd, 0x87, 0x28, 0x3a, + 0x9, 0xd, 0x74, 0xf0, 0x68, 0x10, 0x52, 0x1c, + 0x84, 0x87, 0x90, 0xf6, 0x1e, 0xfc, 0x1f, 0x21, + 0xff, 0xe2, 0x6f, 0xf0, 0x7e, 0x79, 0xf, 0xfe, + 0xd, 0x3, 0xff, 0x86, 0xa0, 0xf2, 0xe0, 0xf4, + 0x1a, 0xf5, 0x60, 0xe4, 0x36, 0x87, 0xfd, 0x4, + 0x87, 0xff, 0x16, 0xf, 0xfe, 0xfa, 0x1f, 0xc8, + 0x7d, 0x7, 0x21, 0x41, 0xec, 0x3d, 0x6, 0xea, + 0xf0, 0x7e, 0x83, 0x2c, 0x14, 0x19, 0x18, 0x3f, + 0x48, 0x6c, 0xe, 0x86, 0x74, 0x96, 0xc0, /* U+00E3 "ã" */ - 0xf, 0xfe, 0xa, 0x83, 0xe7, 0xe0, 0xea, 0x61, - 0xcc, 0x16, 0x12, 0x1f, 0xa0, 0xee, 0xa0, 0x21, - 0x90, 0x94, 0x5, 0x5, 0x6, 0xc1, 0x56, 0x1c, - 0x87, 0x20, 0x42, 0xd0, 0x50, 0x3a, 0xa0, 0xeb, - 0xc8, 0x79, 0x60, 0xff, 0xf5, 0x37, 0xe9, 0xf, - 0xee, 0x43, 0x36, 0x87, 0xb0, 0xff, 0x50, 0x36, - 0x1c, 0xa0, 0xe4, 0x28, 0x35, 0xd3, 0x83, 0x40, - 0x42, 0x90, 0xca, 0x9, 0xf, 0x21, 0xec, 0x3d, - 0xf8, 0x3e, 0x43, 0xff, 0xc4, 0xdf, 0xe0, 0xfc, - 0xf2, 0x1f, 0xfc, 0x1a, 0x7, 0xff, 0xd, 0x41, - 0xe5, 0xc1, 0xe8, 0x33, 0xea, 0xc1, 0xc8, 0x6a, - 0x7, 0xfd, 0x4, 0xa0, 0xff, 0xe2, 0x61, 0xff, - 0xc5, 0x43, 0xff, 0x8a, 0x87, 0xc8, 0x7f, 0x61, - 0xf4, 0x1c, 0x84, 0xa0, 0xec, 0x3d, 0x6, 0xba, - 0x78, 0x3f, 0x21, 0xca, 0xa, 0xc, 0x92, 0x1f, - 0xa4, 0x36, 0xb, 0x43, 0x3a, 0x4b, 0x60, + 0xf, 0xfe, 0xa, 0x83, 0xe7, 0xd0, 0x75, 0x30, + 0xe6, 0x3, 0xa0, 0x43, 0xf4, 0x1d, 0x58, 0x8, + 0x64, 0x25, 0x1, 0x41, 0x41, 0xb0, 0x56, 0xe, + 0x43, 0x90, 0x20, 0x74, 0xc, 0x1d, 0x50, 0x75, + 0xe8, 0x3c, 0xb0, 0x7f, 0xfa, 0x9b, 0xfa, 0xf, + 0xea, 0x21, 0xce, 0x87, 0xb4, 0x3f, 0xa4, 0x36, + 0x1c, 0xa0, 0xe8, 0x24, 0x35, 0xd3, 0xc1, 0xa0, + 0x41, 0x48, 0x72, 0x12, 0x1e, 0x43, 0xd8, 0x7b, + 0xf0, 0x7c, 0x87, 0xff, 0x89, 0xbf, 0xc1, 0xf9, + 0xe4, 0x3f, 0xf8, 0x34, 0xf, 0xfe, 0x1a, 0x83, + 0x97, 0x83, 0xd0, 0x6b, 0xae, 0xe, 0x83, 0x68, + 0x7f, 0xc8, 0x48, 0x7f, 0xf1, 0x60, 0xff, 0xef, + 0xa1, 0xfc, 0x87, 0xd0, 0x72, 0x14, 0x1e, 0xc3, + 0xd0, 0x6e, 0xaf, 0x7, 0xe4, 0x32, 0xc1, 0x61, + 0x92, 0x43, 0xf6, 0x1d, 0x82, 0xd0, 0xce, 0x9, + 0x6c, /* U+00E4 "ä" */ 0xb, 0xe0, 0xfb, 0xe0, 0xd8, 0x58, 0x76, 0x16, 0x1f, 0xfd, 0xbc, 0x2c, 0x3b, 0xb, 0xd, 0xf0, - 0x7d, 0xf0, 0x7f, 0xf7, 0xdb, 0xf4, 0x87, 0xf7, - 0x21, 0x9b, 0x43, 0xd8, 0x7f, 0xa8, 0x1b, 0xe, - 0x50, 0x72, 0x14, 0x1a, 0xe9, 0xc1, 0xa0, 0x21, - 0x48, 0x65, 0x4, 0x87, 0x90, 0xf6, 0x1e, 0xfc, - 0x1f, 0x21, 0xff, 0xe2, 0x6f, 0xf0, 0x7e, 0x79, - 0xf, 0xfe, 0xd, 0x3, 0xff, 0x86, 0xa0, 0xf2, - 0xe0, 0xf4, 0x19, 0xf5, 0x60, 0xe4, 0x35, 0x3, - 0xfe, 0x82, 0x50, 0x7f, 0xf1, 0x30, 0xff, 0xe2, - 0xa1, 0xff, 0xc5, 0x43, 0xe4, 0x3f, 0xb0, 0xfa, - 0xe, 0x42, 0x50, 0x76, 0x1e, 0x83, 0x5d, 0x3c, - 0x1f, 0x90, 0xe5, 0x5, 0x6, 0x4a, 0x7, 0xe9, - 0xd, 0x81, 0xd0, 0xce, 0x92, 0xd8, + 0x7d, 0xf0, 0x7f, 0xf7, 0xdb, 0xfa, 0xf, 0xea, + 0x21, 0xce, 0x87, 0xb4, 0x3f, 0xa4, 0x36, 0x1c, + 0xa0, 0xe8, 0x24, 0x35, 0xd3, 0xc1, 0xa0, 0x41, + 0x48, 0x72, 0x12, 0x1e, 0x43, 0xd8, 0x7b, 0xf0, + 0x7c, 0x87, 0xff, 0x89, 0xbf, 0xc1, 0xf9, 0xe4, + 0x3f, 0xf8, 0x34, 0xf, 0xfe, 0x1a, 0x83, 0xcb, + 0x83, 0xd0, 0x6b, 0xd5, 0x83, 0x90, 0xda, 0x1f, + 0xf4, 0x12, 0x1f, 0xfc, 0x58, 0x3f, 0xfb, 0xe8, + 0x7f, 0x21, 0xf4, 0x1c, 0x85, 0x7, 0xb0, 0xf4, + 0x1b, 0xab, 0xc1, 0xfa, 0xc, 0xb0, 0x50, 0x64, + 0x60, 0xfd, 0x21, 0xb0, 0x3a, 0x19, 0xd2, 0x5b, /* U+00E5 "å" */ 0xf, 0xaf, 0x90, 0xff, 0x9d, 0xa, 0x81, 0xfe, - 0x87, 0xc8, 0xa0, 0xfd, 0xc, 0x9, 0x20, 0xfc, - 0x98, 0x68, 0x3f, 0xf8, 0x8, 0x7f, 0xf0, 0xd2, - 0xc, 0x87, 0xfa, 0x18, 0x14, 0x10, 0xfe, 0x87, - 0xc8, 0xc1, 0xfc, 0xc8, 0x54, 0xf, 0xf9, 0xbe, - 0x43, 0xff, 0xc6, 0xdf, 0xa4, 0x3f, 0xb9, 0xc, - 0xda, 0x1e, 0xc3, 0xfd, 0x40, 0xd8, 0x72, 0x83, - 0x90, 0xa0, 0xd7, 0x4e, 0xd, 0x1, 0xa, 0x43, - 0x28, 0x24, 0x3c, 0x87, 0xb0, 0xf7, 0xe0, 0xf9, - 0xf, 0xff, 0x13, 0x7f, 0x83, 0xf3, 0xc8, 0x7f, - 0xf0, 0x68, 0x1f, 0xfc, 0x35, 0x7, 0x97, 0x7, - 0xa0, 0xcf, 0xab, 0x7, 0x21, 0xa8, 0x1f, 0xf4, - 0x12, 0x83, 0xff, 0x89, 0x87, 0xff, 0x15, 0xf, - 0xfe, 0x2a, 0x1f, 0x21, 0xfd, 0x87, 0xd0, 0x72, - 0x12, 0x83, 0xb0, 0xf4, 0x1a, 0xe9, 0xe0, 0xfc, - 0x87, 0x28, 0x28, 0x32, 0x48, 0x7e, 0x90, 0xd8, - 0x2d, 0xc, 0xe9, 0x2d, 0x80, + 0x87, 0xc8, 0xa0, 0xfd, 0xc, 0xa, 0x10, 0x7e, + 0x48, 0x32, 0x1f, 0xfd, 0x4, 0x83, 0x21, 0xfe, + 0x86, 0x3, 0x8, 0x7f, 0x43, 0xe8, 0x10, 0x7f, + 0x32, 0x15, 0x87, 0xfc, 0xdf, 0x21, 0xff, 0xe3, + 0x6f, 0xe8, 0x3f, 0xa8, 0x87, 0x3a, 0x1e, 0xd0, + 0xfe, 0x90, 0xd8, 0x72, 0x83, 0xa0, 0x90, 0xd7, + 0x4f, 0x6, 0x81, 0x5, 0x21, 0xc8, 0x48, 0x79, + 0xf, 0x61, 0xef, 0xc1, 0xf2, 0x1f, 0xfe, 0x26, + 0xff, 0x7, 0xe7, 0x90, 0xff, 0xe0, 0xd0, 0x3f, + 0xf8, 0x6a, 0xf, 0x2e, 0xf, 0x41, 0xaf, 0x56, + 0xe, 0x43, 0x68, 0x7f, 0xd0, 0x48, 0x7f, 0xf1, + 0x60, 0xff, 0xef, 0xa1, 0xfc, 0x87, 0xd0, 0x72, + 0x14, 0x1e, 0xc3, 0xd0, 0x6e, 0xaf, 0x7, 0xe4, + 0x32, 0xc1, 0x41, 0x92, 0x43, 0xf4, 0x86, 0xc1, + 0x68, 0x67, 0x49, 0x6c, /* U+00E6 "æ" */ - 0xe, 0x6f, 0xd2, 0x1e, 0x6f, 0xc8, 0x7f, 0xb9, - 0xc, 0xd8, 0x6e, 0x43, 0x5a, 0x1e, 0x70, 0xff, - 0x63, 0x87, 0xf4, 0x87, 0x41, 0xca, 0xe, 0xe0, - 0xcb, 0x6, 0x83, 0x41, 0x9e, 0x9c, 0x1f, 0x3d, - 0x58, 0x6c, 0x24, 0x26, 0xc, 0xa0, 0xf4, 0x1d, - 0x87, 0xfd, 0x7, 0xb0, 0xe8, 0x3e, 0x42, 0x81, - 0x45, 0x7, 0xc8, 0x72, 0x1f, 0x61, 0x20, 0x55, - 0x3, 0xff, 0x80, 0x87, 0xe4, 0x3f, 0xf9, 0x58, - 0x7f, 0xf2, 0x15, 0x5c, 0x1b, 0xaf, 0xe0, 0xfc, - 0xfa, 0x8b, 0xc1, 0x97, 0xfc, 0x1f, 0x50, 0x3f, - 0xfa, 0x32, 0x1f, 0xfd, 0x24, 0x33, 0xfe, 0xd, - 0xff, 0xfc, 0x22, 0xd, 0x40, 0xff, 0x21, 0xff, - 0xc2, 0x42, 0x50, 0x7f, 0xf4, 0xb0, 0xff, 0xe0, - 0x61, 0xff, 0xc6, 0x43, 0xff, 0x80, 0x87, 0xff, - 0x19, 0xf, 0xfe, 0xa, 0x1f, 0xfc, 0x5c, 0x3e, - 0xc3, 0xa0, 0xfe, 0x60, 0x21, 0x28, 0x33, 0x87, - 0xda, 0x1e, 0xa2, 0x8, 0x35, 0xd3, 0x83, 0x41, - 0xae, 0xaf, 0x20, 0x81, 0x7, 0x28, 0x3b, 0x70, - 0xe5, 0x83, 0xb0, 0x28, 0x3f, 0x9c, 0x2d, 0xf, - 0xf6, 0x85, 0x68, 0x73, 0xc1, 0xd4, 0x43, 0x9b, - 0x8, + 0xe, 0x6f, 0xd2, 0x1e, 0x7f, 0x48, 0x7f, 0xb9, + 0xc, 0xda, 0x7, 0x83, 0x36, 0x87, 0x9c, 0x3f, + 0xd0, 0xc1, 0xfd, 0x21, 0xd0, 0x72, 0x83, 0xb8, + 0x32, 0xc1, 0xa0, 0xd0, 0x67, 0xa7, 0x7, 0xee, + 0xac, 0x36, 0x12, 0x13, 0x6, 0x50, 0x7b, 0xe, + 0xc3, 0xfe, 0x83, 0xd8, 0x74, 0x1f, 0x21, 0x40, + 0xa2, 0x83, 0xe4, 0x39, 0xf, 0xa0, 0x90, 0x2a, + 0x81, 0xff, 0xc0, 0x43, 0xff, 0xa7, 0x87, 0xff, + 0x21, 0x55, 0xc1, 0xba, 0xfe, 0xf, 0xcf, 0xa8, + 0xbc, 0x19, 0x7f, 0xc1, 0xf5, 0x3, 0xff, 0xa3, + 0x21, 0xff, 0xd2, 0x43, 0x3f, 0xe0, 0xd7, 0xff, + 0xf0, 0x48, 0x35, 0x3, 0xff, 0x9a, 0x84, 0xa0, + 0xff, 0xe9, 0x61, 0xff, 0xc0, 0xc3, 0xff, 0x8c, + 0x87, 0xff, 0x1, 0xf, 0xfe, 0x32, 0x1f, 0xfc, + 0x14, 0x3f, 0xf8, 0xb8, 0x7d, 0x7, 0x41, 0xfc, + 0xc0, 0x42, 0x50, 0x67, 0x43, 0xda, 0x1e, 0xa2, + 0x8, 0x35, 0xd3, 0x83, 0x21, 0xae, 0xaf, 0x20, + 0x81, 0x7, 0x28, 0x3b, 0xa0, 0x72, 0xc1, 0xd8, + 0x14, 0x1f, 0xce, 0x6, 0xf, 0xfb, 0x42, 0xb4, + 0x39, 0xe0, 0xcf, 0x21, 0xcf, 0x82, /* U+00E7 "ç" */ - 0xf, 0x5f, 0xd0, 0x7f, 0xad, 0xe, 0x78, 0x3e, - 0xd0, 0xfe, 0x70, 0xec, 0x39, 0x60, 0xe8, 0x28, - 0x35, 0xd5, 0xa1, 0x28, 0x8, 0x52, 0x1d, 0x6, - 0xc4, 0x32, 0x1f, 0x41, 0x26, 0x12, 0x1f, 0x90, - 0xe4, 0x2c, 0x3f, 0xfa, 0x1f, 0x83, 0x90, 0xff, - 0xff, 0x87, 0xff, 0x69, 0xf, 0xfe, 0x82, 0xe1, - 0xb, 0xf, 0xea, 0xc6, 0x12, 0x1f, 0x90, 0xe4, - 0x32, 0x1f, 0x61, 0x20, 0x42, 0x90, 0xe9, 0xb, - 0x4, 0x1a, 0xea, 0xd0, 0x94, 0x16, 0x1c, 0xb0, - 0x74, 0x1d, 0x87, 0xf9, 0xc3, 0xee, 0x43, 0x9e, - 0xf, 0xe6, 0x41, 0x70, 0x7f, 0xf0, 0x50, 0x48, - 0x7f, 0xf1, 0xa4, 0x3f, 0xf8, 0x3c, 0x14, 0x1f, - 0xfc, 0x27, 0xf, 0xfe, 0xca, 0x1f, 0xfc, 0x46, - 0x80, 0x43, 0xff, 0x83, 0x21, 0x41, 0xff, 0xc4, - 0x70, 0xff, 0xe1, 0x53, 0x83, 0xf0, + 0xf, 0x5f, 0xd0, 0x7f, 0xbc, 0x87, 0x3c, 0x1f, + 0x61, 0xfe, 0x70, 0xec, 0x39, 0x60, 0xe8, 0x28, + 0x35, 0xd5, 0xa1, 0x21, 0x21, 0x48, 0x74, 0x1a, + 0x10, 0xc8, 0x7d, 0x4, 0x98, 0x48, 0x7e, 0x43, + 0x90, 0xb0, 0xff, 0xe8, 0x7e, 0xe, 0x43, 0xff, + 0xfe, 0x1f, 0xfd, 0xa4, 0x3f, 0xfa, 0xb, 0x84, + 0x2c, 0x3f, 0xab, 0x18, 0x48, 0x7e, 0x43, 0x90, + 0xc8, 0x7d, 0x84, 0x81, 0xa, 0x43, 0xa4, 0x28, + 0x10, 0x6b, 0xab, 0x42, 0x43, 0x61, 0xcb, 0x6, + 0x60, 0xec, 0x3f, 0xcc, 0x1f, 0x72, 0x1c, 0xf0, + 0x7f, 0x32, 0xb, 0x83, 0xff, 0x82, 0x82, 0x43, + 0xff, 0x8d, 0x21, 0xff, 0xc1, 0xe0, 0xa0, 0xff, + 0xe1, 0x38, 0x7f, 0xf6, 0x50, 0xff, 0xe2, 0x34, + 0x2, 0x1f, 0xfc, 0x19, 0xa, 0xf, 0xfe, 0x23, + 0x87, 0xff, 0xa, 0x9c, 0x1f, 0x80, /* U+00E8 "è" */ 0x3, 0x58, 0x3f, 0xf8, 0x4b, 0xd8, 0x7f, 0xf0, 0xb0, 0xd0, 0x7f, 0xf0, 0xa0, 0x94, 0x1f, 0xfc, 0x16, 0xa, 0xf, 0xfe, 0x13, 0x5, 0x7, 0xff, 0x9, 0x80, 0xa0, 0xff, 0xe1, 0x3f, 0x21, 0xff, - 0xfa, 0x7f, 0xa0, 0xff, 0x5c, 0x1c, 0xf0, 0x7d, - 0xa1, 0xfc, 0xc1, 0xd0, 0x72, 0xc1, 0x94, 0x12, - 0x82, 0xba, 0xb4, 0x28, 0x28, 0x29, 0xe, 0x83, - 0x22, 0x19, 0xf, 0x90, 0xb3, 0xa, 0xf, 0xd0, - 0x48, 0x7f, 0xf2, 0x10, 0x90, 0xff, 0xe3, 0x57, - 0xf8, 0x3f, 0x97, 0xfc, 0x1f, 0xfe, 0x3f, 0xff, - 0xe1, 0x7, 0xff, 0x31, 0xf, 0xfe, 0xaa, 0x16, - 0x1f, 0xfc, 0x2c, 0x24, 0x3f, 0xf8, 0x48, 0x68, - 0x3f, 0xb8, 0x24, 0x26, 0xf, 0x38, 0xa0, 0x41, - 0x9f, 0x55, 0xc1, 0x61, 0x61, 0xe5, 0x83, 0x30, - 0x6d, 0xf, 0xf5, 0x3, 0xd6, 0x87, 0x36, 0x84, + 0xfa, 0xbf, 0xa0, 0xff, 0x5a, 0x1c, 0xf0, 0x7d, + 0xa1, 0xfc, 0xc1, 0xd8, 0x72, 0xc1, 0x94, 0x12, + 0x1a, 0xea, 0xd0, 0xa0, 0xa0, 0xa4, 0x3a, 0xc, + 0x88, 0x64, 0x3e, 0x82, 0xcc, 0x24, 0x3f, 0x21, + 0x21, 0xd8, 0x7f, 0xf0, 0x90, 0xff, 0xe5, 0x75, + 0xfc, 0x1f, 0xcb, 0xfe, 0xf, 0xff, 0x1f, 0xff, + 0xf0, 0x83, 0xff, 0xbe, 0x87, 0xff, 0x9, 0xb, + 0xf, 0xfe, 0x16, 0x12, 0x1f, 0xfc, 0x24, 0x34, + 0x1f, 0xdc, 0x12, 0x13, 0x7, 0x9c, 0x50, 0x20, + 0xcf, 0x5b, 0x82, 0xc2, 0xc3, 0x97, 0x6, 0x60, + 0xd8, 0x7f, 0xd4, 0xf, 0x79, 0xe, 0x6d, 0x8, /* U+00E9 "é" */ 0xf, 0xf9, 0xac, 0x1f, 0xfc, 0x16, 0x58, 0x3f, 0xf8, 0x50, 0x4c, 0x1f, 0xfc, 0x8, 0x26, 0xf, - 0xfe, 0x2, 0x80, 0xc1, 0xff, 0xc1, 0x82, 0x83, - 0xff, 0x83, 0x85, 0x87, 0xff, 0xb, 0xf0, 0x7f, - 0xfe, 0xdf, 0xe8, 0x3f, 0xd7, 0x7, 0x3c, 0x1f, - 0x68, 0x7f, 0x30, 0x74, 0x1c, 0xb0, 0x65, 0x4, - 0xa0, 0xae, 0xad, 0xa, 0xa, 0xa, 0x43, 0xa0, - 0xc8, 0x86, 0x43, 0xe4, 0x2c, 0xc2, 0x83, 0xf4, - 0x12, 0x1f, 0xfc, 0x84, 0x24, 0x3f, 0xf8, 0xd5, - 0xfe, 0xf, 0xe5, 0xff, 0x7, 0xff, 0x8f, 0xff, - 0xf8, 0x41, 0xff, 0xcc, 0x43, 0xff, 0xaa, 0x85, - 0x87, 0xff, 0xb, 0x9, 0xf, 0xfe, 0x12, 0x1a, - 0xf, 0xee, 0x9, 0x9, 0x83, 0xce, 0x28, 0x10, - 0x67, 0xd5, 0x70, 0x58, 0x58, 0x79, 0x60, 0xcc, - 0x1b, 0x43, 0xfd, 0x40, 0xf5, 0xa1, 0xcd, 0xa1, + 0xfe, 0x2, 0x80, 0xc1, 0xff, 0xc1, 0x80, 0xc1, + 0xff, 0xc1, 0xc2, 0x83, 0xff, 0x85, 0xf8, 0x3f, + 0xff, 0x77, 0xf4, 0x1f, 0xeb, 0x43, 0x9e, 0xf, + 0xb4, 0x3f, 0x98, 0x3b, 0xe, 0x58, 0x32, 0x82, + 0x43, 0x5d, 0x5a, 0x14, 0x14, 0x14, 0x87, 0x41, + 0x91, 0xc, 0x87, 0xd0, 0x59, 0x84, 0x87, 0xe4, + 0x24, 0x3b, 0xf, 0xfe, 0x12, 0x1f, 0xfc, 0xae, + 0xbf, 0x83, 0xf9, 0x7f, 0xc1, 0xff, 0xe3, 0xff, + 0xfe, 0x10, 0x7f, 0xf7, 0xd0, 0xff, 0xe1, 0x21, + 0x61, 0xff, 0xc2, 0xc2, 0x43, 0xff, 0x84, 0x86, + 0x83, 0xfb, 0x82, 0x42, 0x60, 0xf3, 0x8a, 0x4, + 0x19, 0xeb, 0x70, 0x58, 0x58, 0x72, 0xe0, 0xcc, + 0x1b, 0xf, 0xfa, 0x81, 0xef, 0x21, 0xcd, 0xa1, 0x0, /* U+00EA "ê" */ - 0xf, 0xcc, 0x87, 0xff, 0xe, 0x8c, 0x87, 0xff, - 0x6, 0x42, 0x83, 0xff, 0x80, 0xa0, 0x20, 0x83, - 0xfe, 0x81, 0x40, 0x28, 0x3f, 0xb0, 0x28, 0xc1, - 0x21, 0xf4, 0x14, 0x14, 0x8, 0x3e, 0xbe, 0xc, - 0xfc, 0x1f, 0xff, 0x77, 0xfa, 0xf, 0xf5, 0xc1, - 0xcf, 0x7, 0xda, 0x1f, 0xcc, 0x1d, 0x7, 0x2c, - 0x19, 0x41, 0x28, 0x2b, 0xab, 0x42, 0x82, 0x82, - 0x90, 0xe8, 0x32, 0x21, 0x90, 0xf9, 0xb, 0x30, - 0xa0, 0xfd, 0x4, 0x87, 0xff, 0x21, 0x9, 0xf, - 0xfe, 0x35, 0x7f, 0x83, 0xf9, 0x7f, 0xc1, 0xff, - 0xe3, 0xff, 0xfe, 0x10, 0x7f, 0xf3, 0x10, 0xff, - 0xea, 0xa1, 0x61, 0xff, 0xc2, 0xc2, 0x43, 0xff, - 0x84, 0x86, 0x83, 0xfb, 0x82, 0x42, 0x60, 0xf3, - 0x8a, 0x4, 0x19, 0xf5, 0x5c, 0x16, 0x16, 0x1e, - 0x58, 0x33, 0x6, 0xd0, 0xff, 0x50, 0x3d, 0x68, - 0x73, 0x68, 0x40, + 0xf, 0xd4, 0x43, 0xff, 0x87, 0xaa, 0xf, 0xfe, + 0x14, 0x1b, 0xf, 0xfe, 0x2, 0x80, 0x82, 0xf, + 0xfa, 0x5, 0x0, 0xa0, 0xfe, 0xc0, 0xa3, 0x4, + 0x1f, 0xa0, 0xa0, 0xa0, 0x61, 0xf5, 0xf0, 0x67, + 0xe0, 0xff, 0xfb, 0xdf, 0xd0, 0x7f, 0xad, 0xe, + 0x78, 0x3e, 0xd0, 0xfe, 0x60, 0xec, 0x39, 0x60, + 0xca, 0x9, 0xd, 0x75, 0x68, 0x50, 0x50, 0x52, + 0x1d, 0x6, 0x44, 0x32, 0x1f, 0x41, 0x66, 0x12, + 0x1f, 0x90, 0x90, 0xec, 0x3f, 0xf8, 0x48, 0x7f, + 0xf2, 0xba, 0xfe, 0xf, 0xe5, 0xff, 0x7, 0xff, + 0x8f, 0xff, 0xf8, 0x41, 0xff, 0xdf, 0x43, 0xff, + 0x84, 0x85, 0x87, 0xff, 0xb, 0x9, 0xf, 0xfe, + 0x12, 0x1a, 0xf, 0xee, 0x9, 0x9, 0x83, 0xce, + 0x28, 0x10, 0x67, 0xad, 0xc1, 0x61, 0x61, 0xcb, + 0x83, 0x30, 0x6c, 0x3f, 0xea, 0x7, 0xbc, 0x87, + 0x36, 0x84, /* U+00EB "ë" */ 0xb, 0xe0, 0xfb, 0xe0, 0xec, 0x2c, 0x3b, 0xb, 0xf, 0xfe, 0xf6, 0x16, 0x1d, 0x85, 0x87, 0x7c, - 0x1f, 0x7c, 0x1f, 0xfe, 0x37, 0xfa, 0xf, 0xf5, - 0xc1, 0xcf, 0x7, 0xda, 0x1f, 0xcc, 0x1d, 0x7, - 0x2c, 0x19, 0x41, 0x28, 0x2b, 0xab, 0x42, 0x82, - 0x82, 0x90, 0xe8, 0x32, 0x21, 0x90, 0xf9, 0xb, - 0x30, 0xa0, 0xfd, 0x4, 0x87, 0xff, 0x21, 0x9, - 0xf, 0xfe, 0x35, 0x7f, 0x83, 0xf9, 0x7f, 0xc1, - 0xff, 0xe3, 0xff, 0xfe, 0x10, 0x7f, 0xf3, 0x10, - 0xff, 0xea, 0xa1, 0x61, 0xff, 0xc2, 0xc2, 0x43, - 0xff, 0x84, 0x86, 0x83, 0xfb, 0x82, 0x42, 0x60, - 0xf3, 0x8c, 0x8, 0x33, 0xea, 0xb8, 0x24, 0x2c, - 0x3c, 0xb0, 0x76, 0x1b, 0x43, 0xfc, 0xe1, 0xeb, - 0x43, 0xcf, 0x4, + 0x1f, 0x7c, 0x1f, 0xfe, 0x3b, 0xfa, 0xf, 0xf5, + 0xa1, 0xcf, 0x7, 0xda, 0x1f, 0xcc, 0x1d, 0x87, + 0x2c, 0x19, 0x41, 0x21, 0xae, 0xad, 0xa, 0xa, + 0xa, 0x43, 0xa0, 0xc8, 0x86, 0x43, 0xe8, 0x2c, + 0xc2, 0x43, 0xf2, 0x12, 0x1d, 0x87, 0xff, 0x9, + 0xf, 0xfe, 0x57, 0x5f, 0xc1, 0xfc, 0xbf, 0xe0, + 0xff, 0xf1, 0xff, 0xff, 0x8, 0x3f, 0xfb, 0xe8, + 0x7f, 0xf0, 0x90, 0xb0, 0xff, 0xe1, 0x61, 0x21, + 0xff, 0xc2, 0x43, 0x41, 0xfd, 0xc1, 0x21, 0x30, + 0x79, 0xc5, 0x2, 0xc, 0xf5, 0xb8, 0x2c, 0x2c, + 0x39, 0x70, 0x74, 0x1b, 0x43, 0xfc, 0xe1, 0xeb, + 0x43, 0x9b, 0x82, /* U+00EC "ì" */ 0x2f, 0xc8, 0x74, 0x85, 0x7, 0xa0, 0xd8, 0x7b, - 0xd, 0x7, 0xb0, 0x94, 0x1e, 0xc2, 0x83, 0xed, - 0x60, 0xfd, 0x50, 0x7f, 0xf4, 0x7f, 0x7, 0xff, - 0xfc, 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xf, 0xff, - 0x38, + 0xd, 0x7, 0xb0, 0x90, 0xfb, 0xb, 0xf, 0xb5, + 0x83, 0xf5, 0x41, 0xff, 0xd1, 0xfc, 0x1f, 0xff, + 0xf0, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xfc, + 0xe0, /* U+00ED "í" */ 0xe, 0xfe, 0xe, 0x83, 0x61, 0x94, 0x16, 0x1d, - 0x5, 0x87, 0x61, 0x41, 0xd0, 0x52, 0x1d, 0xaa, - 0x43, 0xcd, 0x10, 0xff, 0xe8, 0xfe, 0xf, 0xff, - 0xf8, 0x7f, 0xff, 0xc3, 0xff, 0xfe, 0x1f, 0xfe, - 0xc0, + 0x5, 0x87, 0x61, 0x61, 0xd0, 0x50, 0x7b, 0x54, + 0x87, 0x9a, 0x21, 0xff, 0xd1, 0xfc, 0x1f, 0xff, + 0xf0, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xfd, + 0x80, /* U+00EE "î" */ 0xc, 0xfc, 0x1f, 0x98, 0x28, 0x3e, 0x83, 0x28, 0x3b, 0x3, 0x82, 0xd, 0x5, 0x10, 0x30, 0x28, - 0x18, 0x14, 0x8, 0xa, 0x83, 0x51, 0xc6, 0x88, - 0x73, 0x21, 0xff, 0xd3, 0xfc, 0x1f, 0xff, 0xf0, - 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, - 0xff, 0xd2, + 0x18, 0x14, 0x8, 0xa, 0x83, 0x4a, 0x3, 0x44, + 0x3a, 0xa0, 0xff, 0xe9, 0xfe, 0xf, 0xff, 0xf8, + 0x7f, 0xff, 0xc3, 0xff, 0xfe, 0x1f, 0xff, 0xf0, + 0xff, 0xe9, 0x0, /* U+00EF "ï" */ 0x3e, 0xf, 0xbe, 0x30, 0xb0, 0xec, 0x2c, 0x3f, @@ -2160,124 +2154,123 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x85, 0x61, 0xce, 0x1c, 0x87, 0xb4, 0x14, 0x30, 0xcc, 0x1e, 0xa9, 0x2, 0x1c, 0xf0, 0x72, 0x81, 0x40, 0xf9, 0xe0, 0xf4, 0x87, 0xf9, 0x41, 0xff, - 0xc5, 0xd0, 0xe8, 0x3f, 0xd8, 0x48, 0x68, 0x3f, - 0x61, 0x54, 0x12, 0x83, 0xe8, 0x1a, 0x21, 0xa0, - 0xf9, 0xb0, 0xd0, 0x7f, 0xf0, 0x10, 0xe4, 0x34, - 0x1f, 0x9a, 0x20, 0x82, 0x43, 0xd7, 0x2a, 0xe4, - 0x3f, 0x3a, 0x1e, 0x70, 0xc8, 0x50, 0x7f, 0xf0, - 0xb0, 0x61, 0x9f, 0xc8, 0x7d, 0x6, 0xa0, 0x6a, - 0x6, 0x44, 0x25, 0x7, 0x94, 0x19, 0xd, 0x7, - 0xe8, 0x36, 0x12, 0x1f, 0xfc, 0x24, 0x2c, 0x3f, - 0xfd, 0x88, 0x7f, 0x21, 0xf9, 0xf, 0xfe, 0x86, - 0x12, 0x82, 0xc3, 0xf9, 0xb, 0xc1, 0x21, 0xff, - 0xc1, 0x50, 0x64, 0x3e, 0x83, 0xc8, 0x50, 0x7c, - 0x85, 0x2, 0xd, 0x87, 0x61, 0x90, 0xa0, 0xdd, - 0x58, 0x6c, 0x32, 0x83, 0x2c, 0x1a, 0xf, 0x50, - 0x3f, 0xb4, 0x3e, 0x78, 0x33, 0x61, 0xc0, + 0xc5, 0xd0, 0xe8, 0x3f, 0x9c, 0x24, 0x34, 0x1f, + 0xa0, 0xaa, 0x9, 0x41, 0xf4, 0xd, 0x10, 0xd0, + 0x7c, 0xd8, 0x68, 0x3f, 0xf8, 0x8, 0x72, 0x1a, + 0xf, 0xcd, 0x10, 0x41, 0x21, 0xeb, 0x95, 0x72, + 0x1f, 0x9d, 0xf, 0x38, 0x64, 0xc, 0x1f, 0xfc, + 0x2c, 0x10, 0x67, 0xf2, 0x1f, 0x41, 0xa8, 0x1a, + 0x81, 0x91, 0x9, 0x41, 0xe5, 0x6, 0x43, 0x41, + 0xfa, 0xd, 0x84, 0x87, 0xff, 0x9, 0xb, 0xf, + 0xfe, 0xca, 0x1f, 0xfe, 0x34, 0x3f, 0x21, 0xff, + 0xc1, 0x50, 0x58, 0x7f, 0x61, 0x78, 0x24, 0x3f, + 0x90, 0x94, 0x19, 0xf, 0x90, 0xf2, 0x14, 0x1f, + 0x41, 0x40, 0x83, 0x61, 0xd8, 0x64, 0x28, 0x37, + 0x56, 0x1b, 0xc, 0xa0, 0xcb, 0x6, 0x83, 0xd4, + 0xf, 0xe9, 0xf, 0x9e, 0xc, 0xda, 0x18, /* U+00F1 "ñ" */ 0xf, 0xfe, 0xa, 0x83, 0xef, 0x90, 0xea, 0x61, - 0x9c, 0x29, 0x9, 0x2, 0x1a, 0xe, 0x90, 0x41, - 0xe4, 0x25, 0x2, 0xf0, 0x50, 0x58, 0x1a, 0x61, - 0xe4, 0x32, 0x8, 0x2c, 0x33, 0x6, 0x43, 0xee, - 0xb0, 0x75, 0xe0, 0xf2, 0xc1, 0xff, 0xdd, 0xfc, - 0x13, 0xfa, 0xf, 0xf3, 0xc1, 0x9e, 0xf, 0x98, - 0x3f, 0x30, 0x7a, 0x9, 0x41, 0xc8, 0x7e, 0xba, - 0x70, 0x68, 0x3d, 0x21, 0x94, 0x12, 0x1c, 0xa0, - 0xf6, 0x1f, 0xd0, 0x7c, 0x87, 0xff, 0xfc, 0x3f, - 0xff, 0xe1, 0xff, 0xff, 0xf, 0xff, 0xf8, 0x7f, - 0xf4, 0x40, + 0x9c, 0x29, 0x9, 0x2, 0x1a, 0xe, 0xa0, 0x20, + 0xf2, 0x12, 0x80, 0xf8, 0x28, 0x2c, 0xd, 0x30, + 0xf2, 0x19, 0x4, 0x16, 0x1d, 0x6, 0x43, 0xee, + 0x6c, 0x3a, 0xf0, 0x79, 0x90, 0xff, 0xee, 0xfe, + 0xa, 0xfd, 0x21, 0xfc, 0xe8, 0x66, 0x81, 0xf5, + 0x3, 0xf3, 0x7, 0x90, 0x94, 0x1c, 0x87, 0xeb, + 0xa7, 0x6, 0x43, 0xd2, 0x19, 0x41, 0x41, 0xca, + 0xf, 0x61, 0xfd, 0x7, 0xc8, 0x7f, 0xff, 0xc3, + 0xff, 0xfe, 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, + 0xff, 0x44, /* U+00F2 "ò" */ - 0xa, 0xb2, 0x1f, 0xfc, 0x45, 0xa4, 0x3f, 0xf8, - 0x50, 0x68, 0x3f, 0xf8, 0x78, 0x6c, 0x3f, 0xf8, - 0x78, 0x68, 0x3f, 0xf8, 0x78, 0x4a, 0xf, 0xfe, - 0x1e, 0x14, 0x1f, 0xfc, 0x4f, 0xc1, 0xff, 0xfe, + 0x3, 0x59, 0xf, 0xfe, 0x12, 0xf4, 0x87, 0xff, + 0xb, 0xd, 0x7, 0xff, 0xf, 0xd, 0x87, 0xff, + 0xf, 0xc, 0x87, 0xff, 0xf, 0xa, 0xf, 0xfe, + 0x26, 0x16, 0x1f, 0xfc, 0x4f, 0xc1, 0xff, 0xfe, 0x6f, 0xd2, 0x1f, 0xe7, 0x90, 0xcd, 0xa1, 0xf5, - 0x3, 0xfd, 0x40, 0xe9, 0xe, 0x50, 0x72, 0x83, - 0x21, 0xbd, 0x4e, 0xd, 0x5, 0x86, 0xc3, 0x9c, - 0x34, 0x1e, 0x83, 0xf4, 0x12, 0x21, 0x90, 0xfc, - 0x86, 0x70, 0x90, 0xff, 0x21, 0x68, 0x58, 0x7f, - 0xb0, 0x90, 0xff, 0xe6, 0x21, 0xfe, 0x43, 0xff, - 0xf0, 0x87, 0xff, 0x49, 0xc, 0x85, 0x87, 0xff, - 0x9, 0xc2, 0x43, 0xfd, 0x85, 0xa1, 0x90, 0xfe, - 0x42, 0x43, 0xa0, 0xfd, 0x7, 0xa0, 0xda, 0x1d, - 0x21, 0x40, 0x50, 0x6b, 0xab, 0x42, 0x50, 0x52, - 0x1c, 0xb0, 0x66, 0xe, 0xa0, 0x7f, 0xa8, 0x1f, - 0x3c, 0x86, 0x6d, 0xc, + 0x3, 0xfd, 0x40, 0xe9, 0xe, 0x50, 0x73, 0x6, + 0x43, 0x7a, 0x9e, 0xc, 0x85, 0x6, 0xc3, 0xd8, + 0x68, 0x8, 0x50, 0x7e, 0x82, 0x44, 0x32, 0x1f, + 0x90, 0xce, 0x12, 0x1f, 0xe4, 0x2d, 0xb, 0xf, + 0xf6, 0x12, 0x19, 0xf, 0xf2, 0x1f, 0xff, 0xf0, + 0xff, 0xea, 0xa1, 0xfe, 0x43, 0x21, 0x61, 0xff, + 0xc2, 0x70, 0x90, 0xff, 0x61, 0x68, 0x64, 0x3f, + 0x90, 0x90, 0xe8, 0x3f, 0x41, 0xec, 0x36, 0x1e, + 0x90, 0xb0, 0x90, 0xde, 0xab, 0x42, 0x43, 0x48, + 0x72, 0xc1, 0x98, 0x3a, 0x81, 0xfe, 0xa0, 0x7c, + 0xf2, 0x19, 0xb4, 0x30, /* U+00F3 "ó" */ - 0xf, 0xfe, 0x3, 0x52, 0x1f, 0xfc, 0x2a, 0x2c, - 0x1f, 0xfc, 0x25, 0x5, 0x21, 0xff, 0xc1, 0x82, - 0x90, 0xff, 0xe0, 0xe1, 0x48, 0x7f, 0xf0, 0x60, - 0xa4, 0x3f, 0xf8, 0x2a, 0x4, 0x87, 0xff, 0x9, - 0xf9, 0xf, 0xff, 0xf3, 0x7e, 0x90, 0xff, 0x3c, - 0x86, 0x6d, 0xf, 0xa8, 0x1f, 0xea, 0x7, 0x48, - 0x72, 0x83, 0x94, 0x19, 0xd, 0xea, 0x70, 0x68, - 0x2c, 0x36, 0x1c, 0xe1, 0xa0, 0xf4, 0x1f, 0xa0, + 0xf, 0xfe, 0x5, 0x64, 0x3f, 0xf8, 0x52, 0xe0, + 0xff, 0xe1, 0x28, 0x29, 0xf, 0xfe, 0xc, 0x14, + 0x87, 0xff, 0x7, 0xa, 0x43, 0xff, 0x83, 0x5, + 0x21, 0xff, 0xc1, 0x50, 0x24, 0x3f, 0xf8, 0x4f, + 0xc8, 0x7f, 0xff, 0x9b, 0xf4, 0x87, 0xf9, 0xe4, + 0x33, 0x68, 0x7d, 0x40, 0xff, 0x50, 0x3a, 0x43, + 0x94, 0x1c, 0xc1, 0x90, 0xde, 0xa7, 0x83, 0x21, + 0x41, 0xb0, 0xf6, 0x1a, 0x2, 0x14, 0x1f, 0xa0, 0x91, 0xc, 0x87, 0xe4, 0x33, 0x84, 0x87, 0xf9, - 0xb, 0x42, 0xc3, 0xfd, 0x84, 0x87, 0xff, 0x31, - 0xf, 0xf2, 0x1f, 0xff, 0x84, 0x3f, 0xfa, 0x48, - 0x64, 0x2c, 0x3f, 0xf8, 0x4e, 0x12, 0x1f, 0xec, - 0x2d, 0xc, 0x87, 0xf2, 0x12, 0x1d, 0x7, 0xe8, - 0x3d, 0x6, 0xd0, 0xe9, 0xa, 0x2, 0x83, 0x5d, - 0x5a, 0x12, 0x82, 0x90, 0xe5, 0x83, 0x30, 0x75, - 0x3, 0xfd, 0x40, 0xf9, 0xe4, 0x33, 0x68, 0x60, + 0xb, 0x42, 0xc3, 0xfd, 0x84, 0x86, 0x43, 0xfc, + 0x87, 0xff, 0xfc, 0x3f, 0xfa, 0xa8, 0x7f, 0x90, + 0xc8, 0x58, 0x7f, 0xf0, 0x9c, 0x24, 0x3f, 0xd8, + 0x5a, 0x19, 0xf, 0xe4, 0x24, 0x3a, 0xf, 0xd0, + 0x7b, 0xd, 0x87, 0xa4, 0x2c, 0x24, 0x37, 0xaa, + 0xd0, 0x90, 0xd2, 0x1c, 0xb0, 0x66, 0xe, 0xa0, + 0x7f, 0xa8, 0x1f, 0x3c, 0x86, 0x6d, 0xc, /* U+00F4 "ô" */ 0xf, 0xcd, 0x3, 0xff, 0x88, 0xca, 0xc3, 0xff, 0x87, 0x6, 0x83, 0xff, 0x83, 0x81, 0x2, 0x83, - 0xfe, 0x82, 0xb0, 0x41, 0xfe, 0x90, 0x60, 0x81, - 0x87, 0xe5, 0x2, 0x9, 0x40, 0x83, 0xe7, 0xe4, - 0x35, 0xe8, 0x3f, 0xff, 0x4d, 0xfa, 0x43, 0xfc, + 0xfe, 0x80, 0xd0, 0x10, 0x7f, 0xa4, 0x10, 0xc0, + 0xc3, 0xf2, 0x81, 0x84, 0xa0, 0x41, 0xf3, 0xf0, + 0x75, 0xe8, 0x3f, 0xff, 0x4d, 0xfa, 0x43, 0xfc, 0xf2, 0x19, 0xb4, 0x3e, 0xa0, 0x7f, 0xa8, 0x1d, - 0x21, 0xca, 0xe, 0x50, 0x64, 0x37, 0xa9, 0xc1, - 0xa0, 0xb0, 0xd8, 0x73, 0x86, 0x83, 0xd0, 0x7e, - 0x82, 0x44, 0x32, 0x1f, 0x90, 0xce, 0x12, 0x1f, - 0xe4, 0x2d, 0xb, 0xf, 0xf6, 0x12, 0x1f, 0xfc, - 0xc4, 0x3f, 0xc8, 0x7f, 0xfe, 0x10, 0xff, 0xe9, - 0x21, 0x90, 0xb0, 0xff, 0xe1, 0x38, 0x48, 0x7f, - 0xb0, 0xb4, 0x32, 0x1f, 0xc8, 0x48, 0x74, 0x1f, - 0xa0, 0xf4, 0x1b, 0x43, 0xa4, 0x28, 0xa, 0xd, - 0x75, 0x68, 0x4a, 0xa, 0x43, 0x96, 0xc, 0xc1, - 0xd4, 0xf, 0xf5, 0x3, 0xe7, 0x90, 0xcd, 0xa1, - 0x80, + 0x21, 0xca, 0xe, 0x60, 0xc8, 0x6f, 0x53, 0xc1, + 0x90, 0xa0, 0xd8, 0x7b, 0xd, 0x1, 0xa, 0xf, + 0xd0, 0x48, 0x86, 0x43, 0xf2, 0x19, 0xc2, 0x43, + 0xfc, 0x85, 0xa1, 0x61, 0xfe, 0xc2, 0x43, 0x21, + 0xfe, 0x43, 0xff, 0xfe, 0x1f, 0xfd, 0x54, 0x3f, + 0xc8, 0x64, 0x2c, 0x3f, 0xf8, 0x4e, 0x12, 0x1f, + 0xec, 0x2d, 0xc, 0x87, 0xf2, 0x12, 0x1d, 0x7, + 0xe8, 0x3d, 0x86, 0xc3, 0xd2, 0x16, 0x12, 0x1b, + 0xd5, 0x68, 0x48, 0x69, 0xe, 0x58, 0x33, 0x7, + 0x50, 0x3f, 0xd4, 0xf, 0x9e, 0x43, 0x36, 0x86, /* U+00F5 "õ" */ 0xf, 0xfe, 0x12, 0x83, 0xf3, 0xf2, 0x1d, 0x4c, 0x3c, 0xc1, 0x50, 0x28, 0x8, 0x7a, 0xe, 0x7a, 0x20, 0xc3, 0x90, 0x94, 0x12, 0x82, 0x43, 0xb0, - 0x34, 0xc3, 0xd0, 0x79, 0x4, 0x16, 0x85, 0x21, - 0xea, 0x83, 0xaf, 0x90, 0xf9, 0x60, 0xff, 0xf8, - 0xb7, 0xe9, 0xf, 0xf3, 0xc8, 0x66, 0xd0, 0xfa, - 0x81, 0xfe, 0xa0, 0x74, 0x87, 0x28, 0x39, 0x41, - 0x90, 0xde, 0xa7, 0x6, 0x82, 0xc3, 0x61, 0xce, - 0x1a, 0xf, 0x41, 0xfa, 0x9, 0x10, 0xc8, 0x7e, - 0x43, 0x38, 0x48, 0x7f, 0x90, 0xb4, 0x2c, 0x3f, - 0xd8, 0x48, 0x7f, 0xf3, 0x10, 0xff, 0x21, 0xff, - 0xf8, 0x43, 0xff, 0xa4, 0x86, 0x42, 0xc3, 0xff, - 0x84, 0xe1, 0x21, 0xfe, 0xc2, 0xd0, 0xc8, 0x7f, - 0x21, 0x21, 0xd0, 0x7e, 0x83, 0xd0, 0x6d, 0xe, - 0x90, 0xa0, 0x28, 0x35, 0xd5, 0xa1, 0x28, 0x29, - 0xe, 0x58, 0x33, 0x7, 0x50, 0x3f, 0xd4, 0xf, - 0x9e, 0x43, 0x36, 0x86, + 0x55, 0x87, 0xa0, 0xf2, 0x4, 0x2d, 0xa, 0x43, + 0xd5, 0x7, 0x5f, 0x21, 0xf2, 0xc1, 0xff, 0xf1, + 0x6f, 0xd2, 0x1f, 0xe7, 0x90, 0xcd, 0xa1, 0xf5, + 0x3, 0xfd, 0x40, 0xe9, 0xe, 0x50, 0x73, 0x6, + 0x43, 0x7a, 0x9e, 0xc, 0x85, 0x6, 0xc3, 0xd8, + 0x68, 0x8, 0x50, 0x7e, 0x82, 0x44, 0x32, 0x1f, + 0x90, 0xce, 0x12, 0x1f, 0xe4, 0x2d, 0xb, 0xf, + 0xf6, 0x12, 0x19, 0xf, 0xf2, 0x1f, 0xff, 0xf0, + 0xff, 0xea, 0xa1, 0xfe, 0x43, 0x21, 0x61, 0xff, + 0xc2, 0x70, 0x90, 0xff, 0x61, 0x68, 0x64, 0x3f, + 0x90, 0x90, 0xe8, 0x3f, 0x41, 0xec, 0x36, 0x1e, + 0x90, 0xb0, 0x90, 0xde, 0xab, 0x42, 0x43, 0x48, + 0x72, 0xc1, 0x98, 0x3a, 0x81, 0xfe, 0xa0, 0x7c, + 0xf2, 0x19, 0xb4, 0x30, /* U+00F6 "ö" */ 0xb, 0xe0, 0xfb, 0xe0, 0xf6, 0x16, 0x1d, 0x85, 0x87, 0xff, 0x87, 0xb, 0xe, 0xc2, 0xc3, 0xdf, 0x7, 0xdf, 0x7, 0xff, 0x99, 0xbf, 0x48, 0x7f, 0x9e, 0x43, 0x36, 0x87, 0xd4, 0xf, 0xf5, 0x3, - 0xa4, 0x39, 0x41, 0xca, 0xc, 0x86, 0xf5, 0x38, - 0x34, 0x16, 0x1b, 0xe, 0x70, 0xd0, 0x7a, 0xf, - 0xd0, 0x48, 0x86, 0x43, 0xf2, 0x19, 0xc2, 0x43, - 0xfc, 0x85, 0xa1, 0x61, 0xfe, 0xc2, 0x43, 0xff, - 0x98, 0x87, 0xf9, 0xf, 0xff, 0xc2, 0x1f, 0xfd, - 0x24, 0x32, 0x16, 0x1f, 0xfc, 0x27, 0x9, 0xf, - 0xf6, 0x16, 0x86, 0x43, 0xf9, 0x9, 0xe, 0x83, - 0xf4, 0x1e, 0x83, 0x68, 0x74, 0x85, 0x1, 0x41, - 0xae, 0xad, 0x9, 0x41, 0x48, 0x72, 0xc1, 0x98, - 0x3a, 0x81, 0xfe, 0xa0, 0x7c, 0xf2, 0x19, 0xb4, - 0x30, + 0xa4, 0x39, 0x41, 0xcc, 0x19, 0xd, 0xea, 0x78, + 0x32, 0x14, 0x1b, 0xf, 0x61, 0xa0, 0x21, 0x41, + 0xfa, 0x9, 0x10, 0xc8, 0x7e, 0x43, 0x38, 0x48, + 0x7f, 0x90, 0xb4, 0x2c, 0x3f, 0xd8, 0x48, 0x64, + 0x3f, 0xc8, 0x7f, 0xff, 0xc3, 0xff, 0xaa, 0x87, + 0xf9, 0xc, 0x85, 0x87, 0xff, 0x9, 0xc2, 0x43, + 0xfd, 0x85, 0xa1, 0x90, 0xfe, 0x42, 0x43, 0xa0, + 0xfd, 0x7, 0xb0, 0xd8, 0x7a, 0x42, 0xc2, 0x43, + 0x7a, 0xad, 0x9, 0xd, 0x21, 0xcb, 0x6, 0x60, + 0xea, 0x7, 0xfa, 0x81, 0xf3, 0xc8, 0x66, 0xd0, + 0xc0, /* U+00F7 "÷" */ 0xf, 0xdf, 0x7, 0xff, 0x13, 0xb, 0xf, 0xff, @@ -2288,22 +2281,22 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x87, 0xe0, /* U+00F8 "ø" */ - 0xf, 0xfe, 0x13, 0xe0, 0xff, 0xe2, 0xc1, 0xff, - 0xc9, 0x83, 0xf9, 0xfd, 0x30, 0x10, 0xf9, 0xe0, - 0xcc, 0x88, 0x7c, 0xc1, 0xff, 0xc5, 0x60, 0xe5, - 0x6, 0x50, 0x74, 0x1b, 0xd4, 0xc3, 0x41, 0xa0, - 0xd8, 0x64, 0x3a, 0x9, 0xa, 0xe, 0xc3, 0x90, - 0x21, 0x90, 0xe4, 0xc3, 0x26, 0x1f, 0xd0, 0x48, - 0x58, 0x72, 0x1c, 0x91, 0x84, 0x88, 0x58, 0x64, - 0x8, 0x87, 0xff, 0xa, 0x10, 0xff, 0xe0, 0x21, - 0xe8, 0x3f, 0xf8, 0x90, 0x87, 0xff, 0x5, 0x9, - 0x30, 0xff, 0xe2, 0x20, 0x43, 0xff, 0x89, 0x10, - 0x64, 0x39, 0xb, 0x10, 0x21, 0xb0, 0x93, 0x9, - 0x31, 0xe, 0x42, 0xc4, 0x34, 0x90, 0x64, 0x32, - 0x4, 0x24, 0x3e, 0x82, 0x42, 0x83, 0xa0, 0xd0, - 0x68, 0x34, 0x1a, 0xb6, 0x84, 0x87, 0x30, 0x65, - 0x83, 0x30, 0x79, 0xf, 0xf5, 0x3, 0xe8, 0x12, - 0x19, 0xd0, 0xfc, 0x8a, 0xbf, 0x41, 0xfd, 0x2, + 0xf, 0xfe, 0x15, 0xe0, 0xff, 0xe2, 0xa2, 0x1f, + 0xfc, 0x44, 0x18, 0x7f, 0x3f, 0xd6, 0x4, 0x3e, + 0x78, 0x39, 0x42, 0x1f, 0x30, 0x7f, 0xf1, 0x58, + 0x32, 0xc1, 0x94, 0x1d, 0x6, 0xeb, 0x6, 0x83, + 0x41, 0xb0, 0xd8, 0x74, 0x12, 0x14, 0x1c, 0x88, + 0x48, 0x10, 0xc8, 0x68, 0x10, 0x64, 0xc2, 0x43, + 0x91, 0x10, 0xb0, 0xec, 0x32, 0xc, 0xc2, 0x44, + 0x3f, 0x60, 0x44, 0x3f, 0x90, 0xc8, 0x87, 0xff, + 0x12, 0x4, 0x1f, 0xfc, 0x44, 0x43, 0xff, 0x88, + 0x83, 0xf, 0xfe, 0xa, 0xc, 0x8, 0x7f, 0x21, + 0xe4, 0x43, 0x21, 0xfd, 0x90, 0x20, 0xfc, 0x98, + 0x48, 0x88, 0x74, 0x16, 0x21, 0xa0, 0x61, 0xfc, + 0x81, 0x9, 0x2, 0x1b, 0x9, 0xa, 0xe, 0x43, + 0x41, 0xa0, 0xd0, 0x66, 0xad, 0xa, 0xe, 0x60, + 0xcb, 0x6, 0x50, 0x7f, 0xf1, 0x68, 0x1f, 0x40, + 0x83, 0x9d, 0xf, 0xf4, 0xff, 0x41, 0xfd, 0x1, 0xf, 0xfe, 0x26, 0xc1, 0xff, 0xc3, /* U+00F9 "ù" */ @@ -2313,22 +2306,21 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xb0, 0xa0, 0xff, 0xe1, 0x7d, 0x7, 0xff, 0xc7, 0xf0, 0x7f, 0x7e, 0xf, 0xff, 0xf8, 0x7f, 0xff, 0xc3, 0xff, 0xfe, 0x1f, 0xff, 0xf0, 0xff, 0x90, - 0xff, 0xe6, 0xa1, 0xc8, 0x50, 0x7d, 0x7, 0x61, - 0xa0, 0xec, 0x3c, 0x86, 0x7a, 0x78, 0x3f, 0x41, - 0xca, 0xf, 0xf3, 0x7, 0xf6, 0x1f, 0x3a, 0x19, - 0xb0, 0xf0, + 0xff, 0xe9, 0xa1, 0x41, 0xf6, 0x1d, 0x86, 0x83, + 0xb0, 0xf2, 0x19, 0xe9, 0xe0, 0xfd, 0x7, 0x28, + 0x3f, 0xcc, 0x1f, 0xd8, 0x7c, 0xe8, 0x66, 0xc3, + 0xc0, /* U+00FA "ú" */ 0xf, 0xfa, 0xb2, 0x1f, 0xfc, 0xd, 0x78, 0x3f, 0xe8, 0x36, 0x1f, 0xf2, 0x82, 0xc3, 0xff, 0x81, - 0x5, 0x87, 0xff, 0x2, 0xb, 0xf, 0xfe, 0x2, - 0x81, 0x87, 0xff, 0x5, 0xf8, 0x3f, 0xfe, 0x5f, - 0x83, 0xfb, 0xf0, 0x7f, 0xff, 0xc3, 0xff, 0xfe, - 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, 0xfc, 0x87, - 0xff, 0x35, 0xe, 0x42, 0x83, 0xe8, 0x3b, 0xd, - 0x7, 0x61, 0xe4, 0x33, 0xd3, 0xc1, 0xfa, 0xe, - 0x50, 0x7f, 0x98, 0x3f, 0xb0, 0xf9, 0xd0, 0xcd, - 0x87, 0x80, + 0x5, 0x87, 0xff, 0x3, 0xb, 0xf, 0xfe, 0x2, + 0x16, 0x1f, 0xfc, 0x17, 0xe0, 0xff, 0xf9, 0x7e, + 0xf, 0xef, 0xc1, 0xff, 0xff, 0xf, 0xff, 0xf8, + 0x7f, 0xff, 0xc3, 0xff, 0xfe, 0x1f, 0xf2, 0x1f, + 0xfd, 0x34, 0x28, 0x3e, 0xc3, 0xb0, 0xd0, 0x76, + 0x1e, 0x43, 0x3d, 0x3c, 0x1f, 0xa0, 0xe5, 0x7, + 0xf9, 0x83, 0xfb, 0xf, 0x9d, 0xc, 0xd8, 0x78, /* U+00FB "û" */ 0xf, 0x99, 0xf, 0xfe, 0x13, 0x34, 0xf, 0xfe, @@ -2337,123 +2329,122 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x40, 0xc2, 0x80, 0xa0, 0xe7, 0xe0, 0xef, 0x90, 0xff, 0xf6, 0xfe, 0xf, 0xef, 0xc1, 0xff, 0xff, 0xf, 0xff, 0xf8, 0x7f, 0xff, 0xc3, 0xff, 0xfe, - 0x1f, 0xf2, 0x1f, 0xfc, 0xd4, 0x39, 0xa, 0xf, - 0xa0, 0xec, 0x34, 0x1d, 0x87, 0x90, 0xcf, 0x4f, - 0x7, 0xe8, 0x39, 0x41, 0xfe, 0x60, 0xfe, 0xc3, - 0xe7, 0x43, 0x36, 0x1e, + 0x1f, 0xf2, 0x1f, 0xfd, 0x34, 0x28, 0x3e, 0xc3, + 0xb0, 0xd0, 0x76, 0x1e, 0x43, 0x3d, 0x3c, 0x1f, + 0xa0, 0xe5, 0x7, 0xf9, 0x83, 0xfb, 0xf, 0x9d, + 0xc, 0xd8, 0x78, /* U+00FC "ü" */ 0x7, 0xc1, 0xf7, 0xc1, 0xb0, 0xb0, 0xec, 0x2c, 0x3f, 0xfb, 0x78, 0x58, 0x76, 0x16, 0x1b, 0xe0, 0xfb, 0xe0, 0xff, 0xed, 0xfe, 0xf, 0xef, 0xc1, 0xff, 0xff, 0xf, 0xff, 0xf8, 0x7f, 0xff, 0xc3, - 0xff, 0xfe, 0x1f, 0xf2, 0x1f, 0xfc, 0xd4, 0x39, - 0xa, 0xf, 0xa0, 0xec, 0x34, 0x1d, 0x87, 0x90, - 0xcf, 0x4f, 0x7, 0xe8, 0x39, 0x41, 0xfe, 0x60, - 0xfe, 0xc3, 0xe7, 0x43, 0x36, 0x1e, + 0xff, 0xfe, 0x1f, 0xf2, 0x1f, 0xfd, 0x34, 0x28, + 0x3e, 0xc3, 0xb0, 0xd0, 0x76, 0x1e, 0x43, 0x3d, + 0x3c, 0x1f, 0xa0, 0xe5, 0x7, 0xf9, 0x83, 0xf3, + 0x87, 0xce, 0x86, 0x68, 0x1e, /* U+00FD "ý" */ - 0xf, 0xfe, 0x7, 0xf2, 0x1f, 0xfc, 0x4, 0x34, - 0x87, 0xff, 0x2, 0xa, 0x43, 0xff, 0x81, 0x84, - 0xa0, 0xff, 0xe0, 0x21, 0x30, 0x7f, 0xf0, 0x60, - 0xa0, 0xff, 0xe0, 0xc1, 0x61, 0xff, 0xc2, 0xbe, - 0xf, 0xff, 0x17, 0xe4, 0x3f, 0x5f, 0x83, 0xb0, - 0xfc, 0x84, 0x88, 0x48, 0x7f, 0xf0, 0x33, 0xf, - 0xf9, 0xc, 0x88, 0x64, 0x3d, 0x84, 0x84, 0x85, - 0x87, 0x90, 0xb0, 0xb0, 0x90, 0xff, 0x21, 0x21, - 0xff, 0xcb, 0x43, 0x21, 0x21, 0xc8, 0x58, 0x6c, - 0x2c, 0x3b, 0x9, 0xc, 0x84, 0x87, 0x21, 0xff, - 0xc7, 0x42, 0x40, 0x85, 0x7, 0xd8, 0x58, 0x30, - 0x90, 0xf9, 0x9, 0x2, 0x1f, 0xfc, 0x94, 0x3f, - 0x90, 0x94, 0x16, 0x1f, 0xd0, 0x5e, 0x9, 0xf, - 0xfe, 0xa, 0x83, 0xff, 0x84, 0x87, 0x90, 0xff, - 0xb0, 0xf4, 0x1f, 0xf2, 0x1f, 0xfc, 0xc4, 0x3f, - 0xf8, 0x28, 0x6c, 0x3f, 0xf8, 0x30, 0x64, 0x3f, - 0xfb, 0x8, 0x7f, 0xf1, 0xb0, 0xff, 0xe1, 0x41, - 0x21, 0xff, 0xc2, 0x40, 0x87, 0xff, 0x1b, 0xf, - 0xfe, 0x16, 0x12, 0x1f, 0xfc, 0x7, 0x9, 0xf, - 0xfb, 0xd0, 0x68, 0x3f, 0xf8, 0xb0, 0x7f, 0xf1, - 0x64, 0x3f, 0xf8, 0x15, 0xb4, 0x3f, 0xe0, + 0xf, 0xfe, 0x5, 0xf9, 0xf, 0xfe, 0xa, 0x82, + 0x90, 0xff, 0xe0, 0xc1, 0x28, 0x3f, 0xf8, 0x30, + 0x4c, 0x1f, 0xfc, 0x15, 0x1, 0x83, 0xff, 0x85, + 0x5, 0x7, 0xff, 0xa, 0xb, 0xf, 0xfe, 0x1d, + 0xf0, 0x7f, 0xf9, 0x7f, 0x21, 0xf9, 0xfc, 0x4, + 0x2c, 0x3f, 0x61, 0x20, 0xc2, 0x43, 0xf2, 0x16, + 0x4, 0x3f, 0xf8, 0x88, 0x7c, 0x87, 0x90, 0xfc, + 0x85, 0x87, 0xb0, 0x90, 0xd8, 0x48, 0x79, 0xb, + 0xc, 0x87, 0xff, 0x9, 0xe, 0x42, 0x43, 0x21, + 0x21, 0xec, 0x2c, 0x36, 0x16, 0x1e, 0x42, 0x43, + 0x21, 0x21, 0xff, 0xcf, 0x42, 0x40, 0x84, 0x87, + 0xec, 0x2c, 0x18, 0x58, 0x7e, 0x42, 0x40, 0x84, + 0x87, 0xf2, 0x1f, 0x90, 0xff, 0x61, 0x28, 0x2c, + 0x3f, 0xc8, 0x5e, 0x9, 0xf, 0xfe, 0x12, 0x83, + 0xff, 0x86, 0x87, 0x90, 0xff, 0xe0, 0x41, 0xec, + 0x3f, 0xf8, 0xe8, 0x7f, 0xf0, 0x50, 0xff, 0xe3, + 0xe1, 0x90, 0xff, 0xe1, 0x21, 0xa0, 0xff, 0xed, + 0x21, 0xff, 0xc7, 0xc3, 0xff, 0x86, 0x84, 0x87, + 0xff, 0xe, 0xf, 0xfe, 0x32, 0x12, 0x1f, 0xfc, + 0x38, 0x28, 0x3f, 0xe5, 0x58, 0x48, 0x7f, 0xf0, + 0x28, 0x86, 0x83, 0xff, 0x8d, 0x7, 0xff, 0x1a, + 0x43, 0xff, 0x83, 0xd5, 0xa1, 0xff, 0xc0, /* U+00FE "þ" */ 0xfc, 0x1f, 0xff, 0xf0, 0xff, 0xff, 0x87, 0xff, - 0x7e, 0xfd, 0x7, 0xfd, 0x68, 0x67, 0x43, 0xf6, - 0x87, 0xe9, 0xf, 0xf2, 0xc1, 0xd0, 0x7f, 0x75, - 0x68, 0x68, 0x3e, 0xc3, 0xa0, 0xc8, 0x7a, 0xf, - 0xb0, 0xc8, 0x72, 0x1f, 0xfc, 0xc, 0x3f, 0xf8, - 0x48, 0x48, 0x7f, 0xf0, 0xb0, 0xff, 0xe3, 0x21, - 0xff, 0xff, 0xf, 0xfe, 0xd2, 0x1f, 0xfc, 0x6c, - 0x3f, 0xf8, 0xc8, 0x48, 0x72, 0x1f, 0xfc, 0xc, - 0x3a, 0xf, 0xb0, 0xc8, 0x7b, 0xe, 0x83, 0x41, - 0xfb, 0xab, 0x43, 0x21, 0xfc, 0xb0, 0x76, 0x1f, - 0x68, 0x7e, 0x83, 0xfa, 0xd0, 0xce, 0x87, 0xfd, - 0x7e, 0x83, 0xff, 0xfe, 0x1f, 0xff, 0xf0, 0xff, - 0xe7, 0x80, + 0x79, 0xbf, 0x41, 0xff, 0x51, 0xc, 0xe8, 0x7e, + 0xd0, 0xfd, 0x21, 0xfe, 0x58, 0x3a, 0xf, 0xee, + 0xad, 0xd, 0x7, 0xd8, 0x74, 0x19, 0xf, 0x41, + 0xf6, 0x19, 0xe, 0x43, 0xff, 0x81, 0x87, 0xff, + 0xa, 0x9, 0xf, 0xfe, 0xaa, 0x1f, 0xff, 0xf0, + 0xff, 0xed, 0x21, 0xff, 0xd9, 0x82, 0x43, 0x90, + 0xff, 0xe0, 0x61, 0xd0, 0x7d, 0x86, 0x43, 0xd8, + 0x74, 0x1a, 0xf, 0xdd, 0x5a, 0x19, 0xf, 0xe5, + 0x83, 0xb0, 0xfb, 0x43, 0xf6, 0x1f, 0xd4, 0x43, + 0x58, 0x7f, 0xcd, 0xf9, 0xf, 0xff, 0xf8, 0x7f, + 0xff, 0xc3, 0xff, 0x9e, /* U+00FF "ÿ" */ 0xd, 0xf0, 0x7d, 0xf0, 0x76, 0x16, 0x1d, 0x85, 0x87, 0xff, 0x7b, 0xb, 0xe, 0xc2, 0xc3, 0xbe, 0xf, 0xbe, 0xf, 0xfe, 0xef, 0xe8, 0x3f, 0x3f, - 0x83, 0x90, 0xfd, 0x84, 0x88, 0x7f, 0xf0, 0x10, - 0xa3, 0xf, 0xfe, 0x32, 0x19, 0xf, 0x21, 0x21, - 0x21, 0x61, 0xec, 0x2c, 0x2c, 0x24, 0x3c, 0x84, - 0x84, 0x87, 0xff, 0x2d, 0xc, 0x84, 0x87, 0x21, - 0x61, 0xb0, 0xb0, 0xe8, 0x24, 0x32, 0x12, 0x1f, - 0xfc, 0x54, 0x3e, 0x42, 0x40, 0x85, 0x87, 0xd8, - 0x58, 0x30, 0x90, 0xf9, 0x9, 0x2, 0x1f, 0xfc, - 0x94, 0x3f, 0xa0, 0x94, 0x16, 0x1f, 0xc8, 0x5e, - 0x9, 0xf, 0xfe, 0xa, 0x83, 0xff, 0x84, 0x87, - 0x90, 0xff, 0xb0, 0xf4, 0x1f, 0xf2, 0x1f, 0xfc, - 0x74, 0x32, 0x1f, 0xfc, 0x1c, 0x36, 0x1f, 0xfc, - 0x14, 0x32, 0x1f, 0xfd, 0x84, 0x3f, 0xf8, 0xd8, - 0x7f, 0xf0, 0x90, 0x90, 0xff, 0xe1, 0x40, 0x43, - 0xff, 0x8d, 0x87, 0xff, 0xa, 0x9, 0xf, 0xfe, - 0x3, 0xa0, 0x43, 0xfe, 0xf4, 0x1a, 0xf, 0xfe, - 0x2c, 0x1f, 0xfc, 0x59, 0xf, 0xfe, 0x5, 0x6d, - 0xf, 0xf8, + 0x84, 0x24, 0x3f, 0x61, 0x26, 0x1f, 0xfc, 0x4, + 0x2c, 0x43, 0x21, 0xff, 0x21, 0xec, 0x3c, 0x84, + 0x85, 0x4, 0x87, 0xb0, 0xb0, 0x90, 0xff, 0x21, + 0x21, 0xf9, 0xf, 0xfe, 0x12, 0x16, 0x19, 0x9, + 0xe, 0xc2, 0x43, 0x61, 0x61, 0xc8, 0x7e, 0x42, + 0x43, 0xfc, 0x87, 0xff, 0xa, 0xb, 0x2, 0x14, + 0x1f, 0x21, 0xec, 0x24, 0x3f, 0xe4, 0x8, 0x7f, + 0xf0, 0x10, 0xfc, 0x87, 0xf6, 0x12, 0x82, 0xc3, + 0xf9, 0xb, 0xc1, 0x21, 0xff, 0xc1, 0x50, 0x7f, + 0xf0, 0x90, 0xf2, 0x1f, 0xf4, 0x1e, 0xc3, 0xff, + 0x8c, 0x87, 0xff, 0x1, 0xc, 0x87, 0xff, 0x7, + 0xd, 0x87, 0xff, 0x5, 0xc, 0x87, 0xff, 0x61, + 0xf, 0xfe, 0x36, 0x1f, 0xfc, 0x24, 0x24, 0x3f, + 0xf8, 0x50, 0x7f, 0xf2, 0x50, 0xff, 0xe1, 0x61, + 0x41, 0xfe, 0x55, 0x84, 0x87, 0xfd, 0x44, 0x34, + 0x1f, 0xfc, 0x58, 0x3f, 0xf8, 0xb2, 0x1f, 0xfc, + 0xe, 0xad, 0xf, 0xf8, /* U+011E "Ğ" */ - 0xb, 0xf0, 0x7d, 0xf8, 0x3f, 0xfa, 0x68, 0x50, - 0x74, 0x12, 0x1f, 0xa0, 0x98, 0x29, 0xa, 0xf, - 0xe8, 0x27, 0xe4, 0x28, 0x3f, 0xcc, 0x1f, 0xd2, - 0x1f, 0xf3, 0xc8, 0x4d, 0xa1, 0xff, 0xc2, 0x6f, - 0xa4, 0x3f, 0xfe, 0x4d, 0xfd, 0x21, 0xff, 0xc0, - 0xb9, 0xe, 0x6e, 0xf, 0xed, 0xf, 0xf9, 0xd0, - 0xf6, 0x1e, 0x58, 0x3d, 0x7, 0x61, 0x9f, 0x55, - 0xe4, 0x36, 0x12, 0x1a, 0x81, 0xf4, 0x86, 0x41, - 0x4, 0xa0, 0xfe, 0x83, 0x61, 0xe8, 0x3f, 0xe8, - 0x24, 0x43, 0xff, 0x88, 0x87, 0x61, 0x21, 0xff, - 0xc6, 0x42, 0xc3, 0xff, 0x83, 0xf8, 0x3f, 0xfc, - 0xe8, 0x7f, 0xff, 0xda, 0xff, 0x7, 0xff, 0x3, - 0x5f, 0xf0, 0x7f, 0xfb, 0xaf, 0xf0, 0x7f, 0x21, - 0xff, 0xe1, 0xc3, 0xff, 0x8c, 0x87, 0xff, 0x2b, - 0x9, 0xf, 0xfe, 0x32, 0x19, 0xf, 0xfe, 0x32, - 0x14, 0x1f, 0xfc, 0x68, 0x36, 0x1f, 0xe4, 0x3e, - 0x83, 0x68, 0x7d, 0x40, 0xf9, 0x41, 0xae, 0xb7, - 0x90, 0xd8, 0x69, 0xe, 0x5c, 0x1e, 0xc3, 0xd4, - 0xf, 0xfe, 0x3, 0x87, 0xe7, 0xc8, 0x79, 0xb8, - 0x30, + 0xb, 0xf0, 0x7d, 0xf8, 0x3f, 0xfa, 0x28, 0x50, + 0x74, 0x12, 0x1f, 0x41, 0x30, 0x52, 0x14, 0x1f, + 0xa0, 0x9f, 0x90, 0xa0, 0xfe, 0x60, 0xfe, 0x90, + 0xff, 0x3c, 0x84, 0xda, 0x1f, 0xfc, 0x16, 0xfa, + 0x43, 0xff, 0xde, 0xdf, 0xd2, 0x1f, 0xf5, 0xc8, + 0x73, 0x70, 0x7e, 0xd0, 0xff, 0x9c, 0x3d, 0x87, + 0x96, 0xf, 0x61, 0xb0, 0xcf, 0xaa, 0xf2, 0x1a, + 0x2, 0x1a, 0x81, 0xf4, 0x84, 0x82, 0x9, 0x41, + 0xfd, 0x6, 0x83, 0xa0, 0xff, 0xa0, 0x94, 0x1f, + 0xfc, 0x44, 0x36, 0x12, 0x1f, 0xfc, 0x54, 0x2c, + 0x3f, 0xf8, 0x3f, 0x83, 0xff, 0x9c, 0x87, 0xff, + 0xfc, 0x3f, 0xf8, 0xed, 0x7f, 0x83, 0xfe, 0xd7, + 0xfc, 0x1f, 0xfe, 0xbb, 0xfc, 0x1f, 0xfd, 0x24, + 0x3f, 0xfb, 0x68, 0x58, 0x7f, 0xf1, 0x70, 0x90, + 0xff, 0xe2, 0xa1, 0x90, 0xff, 0xe2, 0xa1, 0x41, + 0xff, 0xc5, 0x83, 0x61, 0xfe, 0x43, 0xc8, 0x6d, + 0xf, 0xa8, 0x1e, 0x90, 0xd7, 0x5b, 0xc8, 0x6c, + 0x29, 0xe, 0x5c, 0x1e, 0xc3, 0xa8, 0x1f, 0xfc, + 0xb, 0xf, 0x9e, 0x43, 0xcd, 0xa1, 0x0, /* U+011F "ğ" */ 0x7, 0xe0, 0xf7, 0xe0, 0xff, 0xe6, 0x21, 0x21, 0x90, 0x90, 0xec, 0x2c, 0x36, 0x16, 0x1c, 0x84, - 0xc0, 0x90, 0x90, 0xf6, 0x13, 0xe4, 0x2c, 0x3f, - 0x41, 0xfa, 0xf, 0xe7, 0x90, 0x36, 0x87, 0xfc, - 0xde, 0x90, 0xff, 0xe9, 0xbf, 0xa4, 0x17, 0xc1, - 0x9e, 0xc, 0xd0, 0x3f, 0x30, 0x7e, 0x64, 0x3d, - 0x7, 0x2c, 0x4, 0x3d, 0x6, 0xba, 0xb4, 0x3e, - 0x42, 0x50, 0x74, 0x1e, 0x43, 0x41, 0xf6, 0x1d, - 0x84, 0x87, 0xff, 0x9, 0xb, 0xf, 0xfe, 0xca, - 0x1f, 0xff, 0xf0, 0xff, 0xe3, 0xa1, 0xff, 0xe8, - 0x42, 0xc3, 0xff, 0x85, 0x84, 0x87, 0xff, 0x9, - 0xd, 0x7, 0xd8, 0x79, 0x9, 0x41, 0xd0, 0x7d, - 0x6, 0xba, 0xb4, 0x3f, 0x41, 0xcb, 0x1, 0xf, - 0x98, 0x3f, 0x30, 0x7e, 0x78, 0x33, 0x40, 0xff, - 0x9f, 0xd2, 0x1f, 0xfe, 0xe4, 0x3f, 0x41, 0xfd, - 0x4, 0x85, 0x30, 0x7d, 0x6, 0xc2, 0x47, 0x82, - 0x64, 0x32, 0x4, 0x33, 0xf4, 0x86, 0xc2, 0x60, - 0xff, 0xe0, 0x61, 0xcf, 0x7, 0xe7, 0xf, 0xcf, - 0xab, 0x7a, 0xe, + 0xc0, 0x50, 0x48, 0x7b, 0x9, 0xf4, 0x16, 0x1f, + 0xa0, 0xfd, 0x7, 0xf3, 0xc8, 0x1b, 0x43, 0xfe, + 0x6f, 0x48, 0x7f, 0xf4, 0xef, 0xd2, 0xb, 0xe0, + 0xce, 0x86, 0x68, 0x1f, 0x98, 0x3f, 0x32, 0x1e, + 0x83, 0x96, 0x2, 0x1e, 0x83, 0x5d, 0x5a, 0x1f, + 0x21, 0x48, 0x74, 0x87, 0x21, 0x90, 0xfa, 0xe, + 0xc2, 0x43, 0xff, 0x84, 0x85, 0x87, 0xff, 0x65, + 0xf, 0xff, 0xf8, 0x7f, 0xf6, 0x90, 0xff, 0xea, + 0xa1, 0x61, 0xff, 0xc2, 0xc2, 0x43, 0xff, 0x84, + 0x86, 0x43, 0xe8, 0x3c, 0x85, 0x21, 0xd2, 0x1e, + 0x83, 0x5d, 0x5a, 0x1f, 0xa0, 0xe5, 0x80, 0x87, + 0xcc, 0x1f, 0x98, 0x3f, 0x3c, 0x19, 0xa0, 0x7f, + 0xcf, 0xe9, 0xf, 0xff, 0x72, 0x1f, 0xa0, 0xfe, + 0xc2, 0x42, 0x98, 0x3e, 0x50, 0x58, 0x48, 0xf0, + 0x4d, 0x3, 0x20, 0x43, 0x3f, 0x48, 0x6c, 0x26, + 0xf, 0xfe, 0x6, 0x1c, 0xf0, 0x7e, 0x70, 0xfc, + 0xfa, 0xb7, 0xa0, 0xe0, /* U+0130 "İ" */ 0x3e, 0x30, 0xb0, 0xff, 0x61, 0x67, 0xc1, 0xff, @@ -2465,113 +2456,113 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+0152 "Œ" */ 0xf, 0x9b, 0xff, 0xf9, 0x90, 0x73, 0xc8, 0x7f, - 0xf4, 0x68, 0x1f, 0xfd, 0x39, 0xe, 0x5e, 0xc, - 0xbf, 0xfc, 0x2c, 0xa, 0x9, 0xf5, 0x70, 0x6a, - 0xff, 0xe1, 0x20, 0x82, 0x60, 0xff, 0xe7, 0xc1, - 0xa0, 0xff, 0xe8, 0x21, 0x41, 0xff, 0xd0, 0x43, - 0x21, 0xff, 0xd0, 0xc2, 0x43, 0xff, 0xa2, 0x85, - 0x87, 0xff, 0xfc, 0x3f, 0xf9, 0xc8, 0x7f, 0xf9, - 0x3f, 0xff, 0x81, 0x7, 0xff, 0xfc, 0x3f, 0xf8, - 0x4b, 0xff, 0xc0, 0xc3, 0xff, 0x93, 0x5f, 0xfc, - 0x4, 0x3f, 0xff, 0xc8, 0x7f, 0xff, 0xc3, 0xff, - 0x94, 0x85, 0x87, 0xff, 0x47, 0x9, 0xf, 0xfe, - 0x8a, 0x19, 0xf, 0xfe, 0x8a, 0x14, 0x1f, 0xfd, - 0x18, 0x34, 0x1f, 0xfd, 0x18, 0x26, 0xf, 0xfe, - 0x82, 0x82, 0x7d, 0x5c, 0x1a, 0xbf, 0xf8, 0x48, - 0x52, 0x1c, 0xbc, 0x19, 0x7f, 0xf8, 0x58, 0x6a, - 0x7, 0xff, 0x55, 0xe4, 0x3f, 0xf9, 0xa0, + 0xf4, 0x68, 0x1f, 0xfd, 0x39, 0xc, 0xbe, 0xc, + 0xbf, 0xfc, 0x2c, 0xa, 0x9, 0xeb, 0xc1, 0xab, + 0xff, 0x84, 0x82, 0x9, 0x83, 0xff, 0x9f, 0x6, + 0x83, 0xff, 0xa0, 0x85, 0x87, 0xff, 0x41, 0xf, + 0xfe, 0xae, 0x12, 0x1f, 0xfd, 0x14, 0x2c, 0x3f, + 0xfe, 0xe8, 0x7f, 0xff, 0xc3, 0xef, 0xff, 0xe0, + 0x41, 0xff, 0xff, 0xf, 0xfe, 0x12, 0xff, 0xf0, + 0x30, 0xff, 0xe4, 0xd7, 0xff, 0x1, 0xf, 0xff, + 0xf8, 0x7f, 0xf5, 0x50, 0xff, 0xf9, 0xa1, 0x61, + 0xff, 0xd1, 0xc2, 0x43, 0xff, 0xa2, 0x86, 0x43, + 0xff, 0xa2, 0x85, 0x7, 0xff, 0x46, 0xd, 0x7, + 0xff, 0x46, 0x9, 0x83, 0xff, 0xa0, 0xa0, 0x9f, + 0x57, 0x6, 0xaf, 0xfe, 0x12, 0x14, 0x87, 0x2f, + 0x6, 0x5f, 0xfe, 0x16, 0x1a, 0x81, 0xff, 0xd5, + 0x79, 0xf, 0xfe, 0x68, /* U+0153 "œ" */ - 0xf, 0x3f, 0xc8, 0x7e, 0x7f, 0x90, 0xff, 0x3c, - 0x1d, 0x68, 0x77, 0x7, 0x5a, 0x1f, 0x50, 0x3f, - 0xa4, 0xe, 0x1f, 0xd4, 0xe, 0x50, 0x65, 0x83, - 0x49, 0x6, 0x58, 0x32, 0x83, 0x41, 0xba, 0xb4, - 0x2b, 0xd, 0xd5, 0x86, 0x82, 0x83, 0x61, 0xd0, - 0x7e, 0xc3, 0xb0, 0xc8, 0x10, 0xa0, 0xfb, 0xf, - 0x41, 0xf2, 0x16, 0x21, 0x90, 0xff, 0xe1, 0x21, - 0xf4, 0x12, 0x61, 0x21, 0xfc, 0x86, 0x43, 0xff, - 0xa1, 0x86, 0xc3, 0xff, 0x84, 0x85, 0x87, 0xf2, - 0x1a, 0xff, 0xe0, 0xff, 0xef, 0xa1, 0xff, 0xe4, - 0x5f, 0xfe, 0x10, 0x72, 0x1f, 0xfc, 0x2a, 0xff, - 0xe1, 0x7, 0xff, 0x21, 0xf, 0xfe, 0x12, 0x1f, - 0xfc, 0x14, 0x3f, 0xf9, 0x78, 0x7f, 0x61, 0xb0, - 0xff, 0xe1, 0x61, 0x21, 0xfc, 0x86, 0x43, 0xff, - 0x84, 0x86, 0x43, 0xff, 0x84, 0x87, 0xff, 0x9, - 0xa, 0xf, 0xb0, 0xf4, 0x1f, 0xd2, 0x14, 0x1b, - 0xe, 0x83, 0xf6, 0x1e, 0x76, 0xd, 0x6, 0xea, - 0xd0, 0xac, 0x37, 0xaa, 0xe0, 0x90, 0x94, 0x19, - 0x60, 0xd2, 0x41, 0xcb, 0x7, 0x21, 0xa8, 0x1f, - 0xd2, 0x7, 0xf, 0xf3, 0x87, 0x9e, 0xe, 0xb4, - 0x3b, 0x90, 0xe7, 0x82, + 0xf, 0x3f, 0xd0, 0x7e, 0x7f, 0x90, 0xff, 0x3c, + 0x1c, 0xe8, 0x77, 0x7, 0x5a, 0x1f, 0x50, 0x3f, + 0xa8, 0x7, 0xf, 0xea, 0x7, 0x28, 0x32, 0xc1, + 0x98, 0x83, 0x2c, 0x19, 0x41, 0xa0, 0xdd, 0x5a, + 0x13, 0x86, 0xea, 0xc3, 0x41, 0x41, 0xb0, 0xe8, + 0x3f, 0x61, 0xd8, 0x64, 0x8, 0x50, 0x7d, 0x87, + 0xa0, 0xf9, 0xb, 0x10, 0xc8, 0x7f, 0xf0, 0x90, + 0xfa, 0x9, 0x30, 0x90, 0xfe, 0x83, 0x21, 0xff, + 0xc6, 0xc3, 0xff, 0x85, 0x87, 0xff, 0x9, 0xf, + 0xfe, 0xa, 0x1a, 0xff, 0xe0, 0xfe, 0x43, 0xff, + 0xfe, 0x1f, 0x2f, 0xff, 0x8, 0x3f, 0xf9, 0x1d, + 0x7f, 0xf0, 0x43, 0x90, 0xff, 0xe8, 0xa1, 0xff, + 0xc1, 0x43, 0xff, 0x97, 0x87, 0xff, 0xb, 0xf, + 0xfe, 0x16, 0x12, 0x1f, 0xd0, 0x64, 0x3f, 0xf8, + 0x48, 0x64, 0x3f, 0xf8, 0x48, 0x7f, 0xf0, 0x90, + 0xa0, 0xfb, 0xf, 0x41, 0xfd, 0x21, 0x41, 0xb0, + 0xe8, 0x3f, 0x61, 0xe7, 0x60, 0xd0, 0x6e, 0xad, + 0x9, 0x83, 0x7a, 0xae, 0x9, 0x9, 0x41, 0x96, + 0xc, 0xcc, 0x1c, 0xb0, 0x72, 0x1a, 0x81, 0xfd, + 0x40, 0x30, 0x7f, 0x9c, 0x3c, 0xf0, 0x73, 0xa1, + 0x9e, 0x43, 0x9e, 0x8, /* U+015E "Ş" */ - 0xf, 0xaf, 0xe9, 0xf, 0xfa, 0xd0, 0xe6, 0xe0, - 0xf9, 0xd0, 0xff, 0x30, 0x7a, 0xe, 0x58, 0x39, - 0x83, 0x61, 0xae, 0xaf, 0x21, 0x28, 0x8, 0x69, - 0xf, 0x48, 0x50, 0x30, 0x94, 0x1f, 0xa0, 0xc8, - 0x85, 0x87, 0xf9, 0xb, 0xe, 0x43, 0xfd, 0x84, - 0x87, 0x21, 0xfe, 0x43, 0xff, 0x93, 0xf8, 0x42, - 0x83, 0xff, 0x89, 0x86, 0xc3, 0xff, 0x86, 0x87, - 0x68, 0x7f, 0xf0, 0xb0, 0xeb, 0x43, 0xff, 0x83, - 0x87, 0xae, 0x43, 0xfe, 0xd0, 0xf3, 0x68, 0x7f, - 0xad, 0xf, 0xac, 0x3f, 0xeb, 0x83, 0xed, 0xf, - 0xf9, 0xf2, 0x1d, 0x21, 0xff, 0xc1, 0xb4, 0x34, - 0x1f, 0xfc, 0x39, 0xc, 0x87, 0xff, 0xe, 0xd, - 0x87, 0xff, 0x12, 0x9, 0xfc, 0x1f, 0xfc, 0x94, - 0x3f, 0xe4, 0x32, 0x16, 0x1f, 0xf2, 0x1b, 0x9, - 0xf, 0xfb, 0x9, 0x41, 0xb0, 0xfe, 0x50, 0x59, - 0x6, 0xd0, 0xf3, 0x6, 0x45, 0x6, 0xba, 0xdc, - 0x1a, 0xa, 0x81, 0xcb, 0x83, 0xa4, 0x33, 0xa1, - 0xff, 0x68, 0x7d, 0x72, 0x1c, 0xf8, 0x3f, 0xe6, - 0x41, 0x70, 0x7f, 0xf0, 0xd0, 0x48, 0x7f, 0xf2, - 0x24, 0x3f, 0xf8, 0x7e, 0xa, 0xf, 0xfe, 0x2e, - 0x1f, 0xfd, 0xd4, 0x3f, 0xf8, 0xcd, 0x0, 0x87, - 0xff, 0xe, 0x42, 0x83, 0xff, 0x8c, 0xe1, 0xff, - 0xc4, 0xa7, 0x7, 0xe0, + 0xf, 0xaf, 0xe9, 0xf, 0xfa, 0xd0, 0xe6, 0xd0, + 0xf9, 0xd0, 0xff, 0x50, 0x3d, 0x7, 0x2e, 0xc, + 0xc1, 0xb0, 0xd7, 0x5b, 0x42, 0x50, 0x10, 0xda, + 0x1e, 0x90, 0xa0, 0x61, 0x21, 0xfd, 0x6, 0x44, + 0x2c, 0x3f, 0xc8, 0x58, 0x72, 0x1f, 0xec, 0x24, + 0x3f, 0xf8, 0x88, 0x7f, 0x21, 0xff, 0x7e, 0x10, + 0xa0, 0xff, 0xe2, 0x61, 0xb0, 0xff, 0xe1, 0xa1, + 0xda, 0x1f, 0xfc, 0x2c, 0x3a, 0xd0, 0xff, 0xe0, + 0xe1, 0xeb, 0x90, 0xff, 0xb4, 0x3c, 0xda, 0x1f, + 0xeb, 0x43, 0xeb, 0xf, 0xfa, 0xe0, 0xfb, 0x43, + 0xfe, 0x7c, 0x87, 0x48, 0x7f, 0xf0, 0x6d, 0xd, + 0x7, 0xff, 0xe, 0x81, 0x90, 0xff, 0xe1, 0xa8, + 0x2c, 0x3f, 0xf8, 0x98, 0x4f, 0xe0, 0xff, 0xe0, + 0x21, 0xf9, 0xf, 0xfe, 0x22, 0x16, 0x1f, 0xf2, + 0x1b, 0x9, 0xf, 0xfb, 0x9, 0x41, 0xa0, 0xff, + 0x21, 0x64, 0x13, 0xa1, 0xe7, 0xc, 0x8a, 0xd, + 0x75, 0xb8, 0x34, 0x15, 0x3, 0x97, 0x7, 0x48, + 0x67, 0xf, 0xfe, 0x6, 0x87, 0xde, 0x43, 0xcf, + 0x83, 0xfe, 0xb4, 0x17, 0x7, 0xff, 0xd, 0x5, + 0x3, 0xff, 0x90, 0xa0, 0xff, 0xe1, 0xf9, 0x4, + 0x1f, 0xfc, 0x58, 0x3f, 0xfb, 0xa8, 0x7f, 0xf1, + 0x9a, 0x1, 0xf, 0xfe, 0x1c, 0x85, 0x7, 0xff, + 0x19, 0xc3, 0xff, 0x89, 0x4e, 0xf, 0xc0, /* U+015F "ş" */ 0xe, 0x6f, 0xd2, 0x1f, 0x9e, 0x43, 0x36, 0x1e, 0x60, 0xff, 0x68, 0x68, 0x32, 0xc1, 0xd0, 0x50, 0x6e, 0xae, 0xd, 0x1, 0xa, 0xe, 0x50, 0x48, 0x79, 0xf, 0x41, 0xff, 0xc6, 0x5c, 0x1e, 0x43, - 0xea, 0xc1, 0xe9, 0xf, 0xfe, 0x4, 0x1a, 0xd0, - 0xff, 0x30, 0x75, 0xa1, 0xfc, 0xe1, 0xeb, 0x83, - 0xfb, 0x83, 0xce, 0x87, 0xe7, 0x90, 0xea, 0x7, - 0xf3, 0x68, 0x65, 0x7, 0xfd, 0x40, 0xd0, 0x7f, - 0xf0, 0x18, 0x3b, 0xf0, 0x7e, 0x43, 0xf9, 0xf, - 0xfe, 0xa, 0x14, 0x1f, 0x21, 0xd0, 0x68, 0x3d, - 0x4, 0x81, 0x9, 0xf5, 0x3c, 0x1a, 0x4, 0x87, - 0x28, 0x3a, 0xd, 0x21, 0xfe, 0x90, 0xeb, 0x43, - 0xd6, 0x87, 0xeb, 0xc1, 0x48, 0x7f, 0xf1, 0x24, - 0x3f, 0xf8, 0xb2, 0x1f, 0xfc, 0xe, 0xa, 0xf, - 0xfe, 0xb, 0x87, 0xff, 0x5d, 0xf, 0xfe, 0x1b, - 0x40, 0x21, 0xff, 0xc0, 0x90, 0xa0, 0xff, 0xe1, - 0xb8, 0x7f, 0xf0, 0x69, 0xc1, 0xe0, + 0xea, 0xc0, 0x42, 0x90, 0xff, 0xe0, 0x41, 0xad, + 0xf, 0xfa, 0xe, 0xb8, 0x3f, 0x9c, 0x3c, 0xf0, + 0x7f, 0x70, 0x79, 0xd0, 0xfc, 0xf0, 0x7a, 0x43, + 0xf9, 0xf0, 0x74, 0x87, 0xfd, 0xc1, 0xa0, 0xff, + 0xe0, 0x30, 0x77, 0xe0, 0xfc, 0x87, 0xf2, 0x1f, + 0xfc, 0x14, 0x2c, 0x3e, 0x43, 0xa0, 0x98, 0x3d, + 0x4, 0x81, 0x9, 0xeb, 0x61, 0xa0, 0x41, 0xcb, + 0x83, 0x41, 0xb4, 0x3f, 0xd2, 0x1d, 0x68, 0x7a, + 0xd0, 0xfd, 0x78, 0x29, 0xf, 0xfe, 0x24, 0x87, + 0xff, 0x16, 0x43, 0xff, 0x81, 0xc1, 0x41, 0xff, + 0xc1, 0x70, 0xff, 0xeb, 0xa1, 0xff, 0xc3, 0x68, + 0x4, 0x3f, 0xf8, 0x12, 0x14, 0x1f, 0xfc, 0x37, + 0xf, 0xfe, 0xd, 0x38, 0x3c, /* U+0160 "Š" */ - 0xc, 0xfc, 0x1d, 0xf8, 0x3f, 0x28, 0x18, 0x50, - 0x58, 0x7f, 0x48, 0x21, 0x40, 0x83, 0xfe, 0x80, - 0xd0, 0x12, 0x1f, 0xfc, 0xc, 0x8, 0x14, 0x1f, - 0xfc, 0x28, 0x34, 0x1f, 0xfc, 0x36, 0x6c, 0x3f, - 0xf8, 0xac, 0x87, 0xff, 0xba, 0xfe, 0x90, 0xff, - 0xad, 0xe, 0x6e, 0xf, 0x9d, 0xf, 0xf3, 0x7, - 0xa0, 0xe5, 0x83, 0x98, 0x36, 0x1a, 0xea, 0xf2, - 0x12, 0x80, 0x86, 0x90, 0xf4, 0x85, 0x3, 0x9, - 0x41, 0xfa, 0xc, 0x88, 0x58, 0x7f, 0x90, 0xb0, - 0xe4, 0x3f, 0xd8, 0x48, 0x72, 0x1f, 0xe4, 0x3f, - 0xf9, 0x3f, 0x84, 0x28, 0x3f, 0xf8, 0x98, 0x6c, - 0x3f, 0xf8, 0x68, 0x76, 0x87, 0xff, 0xb, 0xe, - 0xb4, 0x3f, 0xf8, 0x38, 0x7a, 0xe4, 0x3f, 0xed, - 0xf, 0x36, 0x87, 0xfa, 0xd0, 0xfa, 0xc3, 0xfe, - 0xb8, 0x3e, 0xd0, 0xff, 0x9f, 0x21, 0xd2, 0x1f, - 0xfc, 0x1b, 0x43, 0x41, 0xff, 0xc3, 0x90, 0xc8, - 0x7f, 0xf0, 0xe0, 0xd8, 0x7f, 0xf1, 0x20, 0x9f, - 0xc1, 0xff, 0xc9, 0x43, 0xfe, 0x43, 0x21, 0x61, - 0xff, 0x21, 0xb0, 0x90, 0xff, 0xb0, 0x94, 0x1b, - 0xf, 0xe5, 0x5, 0x90, 0x6d, 0xf, 0x30, 0x64, - 0x50, 0x6b, 0xad, 0xc1, 0xa0, 0xa8, 0x1c, 0xb8, - 0x3a, 0x43, 0x3a, 0x1f, 0xf6, 0x87, 0xd7, 0x21, - 0xcf, 0x83, 0x0, + 0xc, 0xfc, 0x1d, 0x7c, 0x1f, 0x94, 0xc, 0x25, + 0x2, 0xf, 0xe8, 0x24, 0x10, 0x14, 0x1f, 0xe8, + 0x11, 0x5, 0x7, 0xfc, 0xa0, 0x68, 0x30, 0xff, + 0xe0, 0xc1, 0xd0, 0x7f, 0xf0, 0xe0, 0xc8, 0x7f, + 0xf0, 0xd9, 0x58, 0x7f, 0xf1, 0x5a, 0x7, 0xff, + 0x66, 0xfe, 0x90, 0xff, 0xad, 0xe, 0x6e, 0xf, + 0x9d, 0xf, 0xf3, 0x87, 0xa0, 0xe5, 0xc1, 0xd8, + 0x6c, 0x35, 0xd6, 0xe0, 0xd0, 0x10, 0xda, 0x1e, + 0x60, 0x94, 0x61, 0x21, 0xfc, 0xa0, 0xb1, 0xb, + 0xf, 0xf6, 0x12, 0x1c, 0x87, 0xf9, 0xf, 0xfe, + 0x4f, 0xe0, 0xe4, 0x3f, 0xf8, 0x88, 0x50, 0x7f, + 0xf1, 0x30, 0xd8, 0x7f, 0xf0, 0xd0, 0xed, 0xf, + 0xfe, 0x16, 0x1d, 0x68, 0x7f, 0xf0, 0x70, 0xf5, + 0xc8, 0x7f, 0xda, 0x1e, 0x6d, 0xf, 0xf5, 0xa1, + 0xf5, 0x87, 0xfd, 0x70, 0x7d, 0xa1, 0xff, 0x3e, + 0x43, 0xa4, 0x3f, 0xf8, 0x36, 0x86, 0x83, 0xff, + 0x87, 0x40, 0xc8, 0x7f, 0xf0, 0xd4, 0x16, 0xb8, + 0x3f, 0xf8, 0x18, 0x4d, 0x60, 0xff, 0xe0, 0x21, + 0xf9, 0xf, 0xfe, 0x22, 0x16, 0x1f, 0xf2, 0x1b, + 0x9, 0xf, 0xfb, 0x9, 0x41, 0xb0, 0xff, 0x21, + 0x64, 0x1b, 0x43, 0xce, 0x19, 0x18, 0x35, 0xd6, + 0xe0, 0xd0, 0x4c, 0x1c, 0xb8, 0x3a, 0x43, 0x3a, + 0x1f, 0xf6, 0x87, 0xd6, 0x87, 0x9f, 0x6, /* U+0161 "š" */ 0xa, 0xf8, 0x3b, 0xe8, 0x3a, 0xa, 0xb, 0xa, @@ -2582,73 +2573,54 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x73, 0x7, 0xfa, 0x43, 0x41, 0x96, 0xe, 0x82, 0x83, 0x75, 0x70, 0x68, 0x8, 0x50, 0x73, 0x4, 0x87, 0x90, 0xf2, 0x1f, 0xfc, 0x6f, 0xc1, 0xe4, - 0x3f, 0xf8, 0xb2, 0x1f, 0xfc, 0x8, 0x35, 0xa1, - 0xfe, 0x60, 0xeb, 0x43, 0xf9, 0xc3, 0xd7, 0x7, - 0xf7, 0x7, 0x9d, 0xf, 0xcf, 0x21, 0xd4, 0xf, - 0xe6, 0xd0, 0xca, 0xf, 0xfa, 0x81, 0xa0, 0xff, - 0xe0, 0x30, 0x77, 0xe4, 0x3e, 0x43, 0xff, 0x96, - 0x85, 0x7, 0xc8, 0x74, 0x1a, 0xf, 0x41, 0x20, - 0x42, 0x7d, 0x4f, 0x6, 0x81, 0x21, 0xca, 0xe, - 0x83, 0x48, 0x7f, 0xa4, 0x3a, 0xe0, 0xe6, 0xd0, - 0x80, + 0x3f, 0xf8, 0x28, 0x52, 0x1f, 0xfc, 0x8, 0x35, + 0xa1, 0xff, 0x41, 0xd7, 0x7, 0xf3, 0x87, 0x9e, + 0xf, 0xee, 0xf, 0x3a, 0x1f, 0x9e, 0x43, 0xa4, + 0x3f, 0x9b, 0x43, 0x48, 0x7f, 0xd4, 0xd, 0x7, + 0xff, 0x1, 0x83, 0xbf, 0x7, 0xe4, 0x3f, 0x90, + 0xff, 0xe0, 0xa1, 0x41, 0xf2, 0x1d, 0x6, 0x83, + 0xd0, 0x48, 0x10, 0x9e, 0xaf, 0x6, 0x81, 0x21, + 0x96, 0xe, 0x83, 0x48, 0x7f, 0xa4, 0x3a, 0xd0, + 0xe6, 0xd0, 0x80, /* U+017D "Ž" */ - 0xc, 0xd1, 0xe, 0xa8, 0x3f, 0x96, 0x83, 0x4b, - 0x7, 0xfa, 0x6, 0x5, 0x3, 0xf, 0xf2, 0x81, - 0x10, 0x20, 0xff, 0xe0, 0x40, 0x70, 0x48, 0x7f, - 0xf0, 0x70, 0xca, 0xf, 0xfe, 0x1c, 0x14, 0x1f, - 0xfc, 0x47, 0xe0, 0xff, 0xf3, 0xff, 0xff, 0x20, - 0x3f, 0xfb, 0xeb, 0xff, 0xc3, 0xf, 0x57, 0xff, - 0xb, 0xd, 0x87, 0xff, 0xe, 0x9, 0xf, 0xfe, - 0x1a, 0x1a, 0xf, 0xfe, 0x1c, 0x12, 0x1f, 0xfc, - 0x38, 0x34, 0x1f, 0xfc, 0x34, 0x28, 0x3f, 0xf8, - 0x70, 0x64, 0x3f, 0xf8, 0x68, 0x50, 0x7f, 0xf0, - 0xf0, 0x94, 0x1f, 0xfc, 0x24, 0x34, 0x1f, 0xfc, - 0x38, 0x24, 0x3f, 0xf8, 0x68, 0x68, 0x3f, 0xf8, - 0x70, 0x50, 0x7f, 0xf0, 0xe0, 0xc8, 0x7f, 0xf0, - 0xd0, 0xa0, 0xff, 0xe1, 0xc1, 0x90, 0xff, 0xe1, - 0x28, 0x2c, 0x3f, 0xf8, 0x70, 0x48, 0x7f, 0xf0, - 0xd0, 0xd0, 0x7f, 0xf0, 0xe0, 0xa0, 0xff, 0xe1, - 0xc1, 0x90, 0xff, 0xe1, 0xa1, 0x41, 0xff, 0xc3, - 0x83, 0x21, 0xff, 0xc3, 0x42, 0xc3, 0xff, 0x87, - 0x4, 0x87, 0xff, 0xd, 0x41, 0x41, 0xff, 0xc3, - 0x83, 0x57, 0xff, 0x10, 0x39, 0x7f, 0xf8, 0x81, - 0xff, 0xde, + 0xe, 0xa8, 0x3d, 0x50, 0x7f, 0x95, 0x86, 0xd4, + 0x1f, 0xe8, 0x28, 0x10, 0x50, 0x7f, 0xb0, 0x2e, + 0x6, 0x1f, 0xfc, 0x8, 0x14, 0x6, 0x1f, 0xfc, + 0x15, 0x6, 0x83, 0xff, 0x87, 0x20, 0x50, 0x7f, + 0xf1, 0x2f, 0x41, 0xff, 0xe6, 0xff, 0xfe, 0x44, + 0x1f, 0xfd, 0xe5, 0xff, 0xe2, 0x6, 0xeb, 0xff, + 0x86, 0x19, 0x41, 0xff, 0xc3, 0x42, 0x83, 0xff, + 0x87, 0x4, 0x87, 0xff, 0xd, 0x41, 0x41, 0xff, + 0xc3, 0x82, 0x83, 0xff, 0x86, 0x86, 0x43, 0xff, + 0x87, 0x5, 0x7, 0xff, 0xe, 0xc, 0x87, 0xff, + 0xd, 0xb, 0xf, 0xfe, 0x1e, 0x12, 0x1f, 0xfc, + 0x34, 0x34, 0x1f, 0xfc, 0x38, 0x24, 0x3f, 0xf8, + 0x70, 0x68, 0x3f, 0xf8, 0x68, 0x50, 0x7f, 0xf0, + 0xf0, 0xc8, 0x7f, 0xf0, 0x90, 0xd8, 0x7f, 0xf0, + 0xe0, 0x90, 0xff, 0xe1, 0xc1, 0xa0, 0xff, 0xe1, + 0xa1, 0x21, 0xff, 0xc3, 0x83, 0x41, 0xff, 0xc2, + 0x50, 0x50, 0x7f, 0xf0, 0xe0, 0xc8, 0x7f, 0xf0, + 0xa0, 0xd0, 0x7f, 0xf0, 0xd0, 0x94, 0x1f, 0xfc, + 0x28, 0x34, 0x1f, 0xfc, 0x25, 0x4, 0x87, 0xff, + 0xe, 0xe, 0xaf, 0xfe, 0x18, 0x72, 0xff, 0xf1, + 0x3, 0xff, 0xbc, /* U+017E "ž" */ - 0x5, 0xe8, 0x35, 0xf0, 0x74, 0x5, 0x4, 0x82, - 0xf, 0x60, 0x81, 0x82, 0x43, 0xe8, 0x1c, 0x5, - 0x7, 0xe5, 0x1, 0x4, 0x1f, 0xe8, 0x36, 0x1f, - 0xfc, 0xd, 0x58, 0x7f, 0xf0, 0xa8, 0x1f, 0xfd, - 0xef, 0xff, 0xe2, 0x7, 0xff, 0x5d, 0x7f, 0xe0, - 0xc9, 0x5f, 0xec, 0x34, 0x1f, 0xf4, 0x12, 0x1f, - 0xf2, 0x1a, 0xf, 0xfa, 0xa, 0xf, 0xfa, 0xc, - 0x87, 0xfc, 0x85, 0x87, 0xfd, 0x84, 0x87, 0xfc, - 0x86, 0x83, 0xfe, 0x82, 0x83, 0xfe, 0x83, 0x21, - 0xff, 0x21, 0x41, 0xff, 0x41, 0x28, 0x3f, 0xca, - 0xa, 0xf, 0xfa, 0xa, 0xf, 0xf9, 0xc, 0x87, - 0xfd, 0x5, 0x7, 0xfd, 0x4, 0xa0, 0xff, 0x90, - 0xa0, 0xff, 0xb0, 0xd5, 0xff, 0xc0, 0xe, 0x5f, - 0xfe, 0x0, 0x7f, 0xf5, 0x80, - - /* U+1E9E "ẞ" */ - 0xe, 0x6f, 0xe8, 0x3f, 0xf8, 0x3c, 0x87, 0x3c, - 0x1f, 0xce, 0x1f, 0xe7, 0x43, 0xe8, 0x39, 0x60, - 0xea, 0x7, 0x41, 0xae, 0xae, 0xc, 0xc1, 0x90, - 0xa4, 0x39, 0xc3, 0x21, 0x21, 0x90, 0xf9, 0xd, - 0x85, 0x84, 0x87, 0xe8, 0x28, 0x32, 0x16, 0x1f, - 0x41, 0x28, 0x3f, 0xf8, 0x72, 0x14, 0x1f, 0xfc, - 0x35, 0x5, 0x87, 0xf9, 0xe, 0x82, 0x83, 0xff, - 0x89, 0x84, 0xa0, 0xff, 0xe1, 0xa1, 0xc8, 0x7f, - 0xf2, 0x1b, 0xc8, 0x7f, 0xf2, 0x6c, 0x3f, 0xf9, - 0x58, 0x7f, 0x9f, 0xe4, 0x3a, 0xf, 0xfe, 0x1d, - 0x86, 0x43, 0xff, 0x8b, 0x86, 0x43, 0xff, 0x93, - 0x87, 0xff, 0x16, 0x9, 0xf, 0xfe, 0xda, 0x1f, - 0xfd, 0xf4, 0x3f, 0xf9, 0x38, 0x48, 0x7f, 0xf1, - 0x50, 0xb0, 0xff, 0xe2, 0x41, 0x90, 0xf9, 0x41, - 0xe9, 0x9, 0xf, 0xd4, 0xeb, 0x68, 0x68, 0x3f, - 0xe5, 0xc1, 0xd8, 0x7e, 0x43, 0xfc, 0xe1, 0xfc, - 0xc8, 0x73, 0x70, 0x60, + 0xb, 0xe4, 0x37, 0xe0, 0xe8, 0x10, 0x50, 0x58, + 0x72, 0x81, 0xa, 0x6, 0x1f, 0x40, 0x68, 0x8, + 0x3f, 0xb0, 0x20, 0x50, 0x7f, 0xa0, 0x98, 0x3f, + 0xe6, 0x68, 0x1f, 0xfc, 0x16, 0x43, 0xff, 0xbb, + 0xff, 0xfc, 0x48, 0x3f, 0xfa, 0xcb, 0xff, 0xc0, + 0xd, 0xd7, 0xfc, 0x19, 0x41, 0xff, 0x21, 0x41, + 0xff, 0x61, 0x21, 0xff, 0x21, 0xa0, 0xff, 0xa0, + 0xa0, 0xff, 0xa0, 0xc8, 0x7f, 0x94, 0x16, 0x1f, + 0xf4, 0x12, 0x1f, 0xf4, 0x1a, 0xf, 0xf9, 0xa, + 0xf, 0xfb, 0xc, 0x87, 0xf9, 0xd, 0x87, 0xfd, + 0x4, 0x87, 0xfd, 0x6, 0x83, 0xfc, 0xa0, 0xa0, + 0xff, 0xa0, 0xc8, 0x7f, 0xa0, 0xd8, 0x7f, 0xc8, + 0x48, 0x7f, 0xd8, 0x75, 0x7f, 0xc1, 0xcb, 0xff, + 0xc0, 0xf, 0xfe, 0xb0, /* U+2022 "•" */ 0x3, 0xf9, 0xb, 0x83, 0x59, 0x7, 0xe9, 0xf, @@ -2656,19 +2628,20 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x35, 0x80, /* U+20AC "€" */ - 0xf, 0xf3, 0x7f, 0x48, 0x7e, 0xb9, 0xe, 0x70, - 0xfb, 0x43, 0xff, 0x89, 0x87, 0x96, 0x6, 0x1d, - 0x6, 0x7d, 0x57, 0x90, 0xe4, 0x26, 0xf, 0xfe, - 0x2, 0x1a, 0xf, 0xfe, 0xe, 0x12, 0x1f, 0xfc, - 0x24, 0x2c, 0x3f, 0xf8, 0xc8, 0x7f, 0xf4, 0x6b, - 0x6, 0xaf, 0x83, 0x2e, 0xc, 0xbf, 0x7, 0xff, - 0x7b, 0xf0, 0x6f, 0xf8, 0x3f, 0xfb, 0xdf, 0x83, - 0x7f, 0xc1, 0xff, 0xde, 0xfc, 0x1b, 0xfe, 0xf, - 0xff, 0x32, 0x1f, 0xfc, 0x24, 0x2c, 0x3f, 0xf8, - 0xc8, 0x7f, 0xf0, 0xa0, 0xc8, 0x7f, 0xf0, 0x90, - 0xa0, 0xff, 0xe1, 0x41, 0xb4, 0x3f, 0xf8, 0x30, - 0x6b, 0xab, 0xc8, 0x79, 0x83, 0x96, 0x6, 0x1f, - 0x30, 0x7f, 0xf1, 0x9e, 0x43, 0x9c, + 0xf, 0xfa, 0xfe, 0x90, 0xff, 0x79, 0xe, 0x60, + 0xfc, 0xe1, 0xff, 0xc6, 0x83, 0x97, 0x7, 0xf6, + 0x1a, 0xeb, 0x78, 0x3c, 0x86, 0x90, 0xff, 0xe0, + 0xc1, 0x28, 0x3f, 0xf8, 0xd0, 0x7f, 0xf0, 0xa0, + 0x90, 0xff, 0xe3, 0xe1, 0xff, 0xc3, 0x43, 0xff, + 0x86, 0xd4, 0x1b, 0xaf, 0x21, 0xb5, 0x83, 0x2f, + 0xd8, 0x7f, 0xf8, 0x2f, 0x83, 0x7f, 0xd0, 0x7f, + 0xf8, 0x2f, 0x83, 0x7f, 0xd0, 0x7f, 0xf3, 0x30, + 0xff, 0xe1, 0x61, 0x9f, 0x83, 0x7f, 0xc8, 0x7f, + 0xf5, 0x10, 0xff, 0xe1, 0xa1, 0xff, 0xcb, 0xc3, + 0xff, 0x87, 0x4, 0x87, 0xff, 0x22, 0xf, 0xfe, + 0x1c, 0x12, 0x83, 0xff, 0x84, 0x86, 0x90, 0xff, + 0xe1, 0x61, 0xae, 0xb7, 0x83, 0xf4, 0x1c, 0xb8, + 0x3f, 0xce, 0x1f, 0xfc, 0x8f, 0x21, 0xca, 0x0, /* U+E004 "" */ 0xf, 0xff, 0x25, 0xfa, 0xf, 0xfe, 0x75, 0xa1, @@ -6662,367 +6635,366 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, {.bitmap_index = 0, .adv_w = 176, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 0, .adv_w = 189, .box_w = 5, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 15, .adv_w = 246, .box_w = 9, .box_h = 12, .ofs_x = 3, .ofs_y = 25}, - {.bitmap_index = 27, .adv_w = 421, .box_w = 22, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 149, .adv_w = 379, .box_w = 19, .box_h = 45, .ofs_x = 3, .ofs_y = -5}, + {.bitmap_index = 16, .adv_w = 246, .box_w = 9, .box_h = 12, .ofs_x = 3, .ofs_y = 25}, + {.bitmap_index = 28, .adv_w = 421, .box_w = 22, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 151, .adv_w = 379, .box_w = 19, .box_h = 46, .ofs_x = 3, .ofs_y = -5}, {.bitmap_index = 296, .adv_w = 486, .box_w = 26, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, {.bitmap_index = 471, .adv_w = 418, .box_w = 24, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 630, .adv_w = 134, .box_w = 3, .box_h = 11, .ofs_x = 2, .ofs_y = 25}, - {.bitmap_index = 634, .adv_w = 241, .box_w = 11, .box_h = 51, .ofs_x = 3, .ofs_y = -12}, - {.bitmap_index = 733, .adv_w = 245, .box_w = 12, .box_h = 51, .ofs_x = 1, .ofs_y = -12}, - {.bitmap_index = 832, .adv_w = 331, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = 14}, - {.bitmap_index = 906, .adv_w = 382, .box_w = 20, .box_h = 25, .ofs_x = 2, .ofs_y = 3}, - {.bitmap_index = 938, .adv_w = 151, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = -8}, - {.bitmap_index = 956, .adv_w = 191, .box_w = 10, .box_h = 4, .ofs_x = 1, .ofs_y = 13}, - {.bitmap_index = 962, .adv_w = 203, .box_w = 5, .box_h = 5, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 968, .adv_w = 285, .box_w = 17, .box_h = 38, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 1104, .adv_w = 379, .box_w = 19, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 1203, .adv_w = 379, .box_w = 12, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 1235, .adv_w = 379, .box_w = 20, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1363, .adv_w = 379, .box_w = 19, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1487, .adv_w = 379, .box_w = 21, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1590, .adv_w = 379, .box_w = 20, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 1700, .adv_w = 379, .box_w = 19, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 1825, .adv_w = 379, .box_w = 20, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1944, .adv_w = 379, .box_w = 19, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 2071, .adv_w = 379, .box_w = 19, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 637, .adv_w = 134, .box_w = 3, .box_h = 11, .ofs_x = 2, .ofs_y = 25}, + {.bitmap_index = 641, .adv_w = 241, .box_w = 11, .box_h = 51, .ofs_x = 3, .ofs_y = -12}, + {.bitmap_index = 741, .adv_w = 245, .box_w = 12, .box_h = 51, .ofs_x = 1, .ofs_y = -12}, + {.bitmap_index = 840, .adv_w = 331, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = 14}, + {.bitmap_index = 914, .adv_w = 382, .box_w = 20, .box_h = 25, .ofs_x = 2, .ofs_y = 3}, + {.bitmap_index = 946, .adv_w = 151, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 963, .adv_w = 191, .box_w = 10, .box_h = 4, .ofs_x = 1, .ofs_y = 13}, + {.bitmap_index = 969, .adv_w = 203, .box_w = 5, .box_h = 5, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 975, .adv_w = 285, .box_w = 17, .box_h = 38, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 1111, .adv_w = 379, .box_w = 19, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 1211, .adv_w = 379, .box_w = 12, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 1243, .adv_w = 379, .box_w = 20, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1372, .adv_w = 379, .box_w = 18, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1496, .adv_w = 379, .box_w = 21, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1599, .adv_w = 379, .box_w = 20, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 1708, .adv_w = 379, .box_w = 19, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 1829, .adv_w = 379, .box_w = 20, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1948, .adv_w = 379, .box_w = 19, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 2074, .adv_w = 379, .box_w = 19, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, {.bitmap_index = 2197, .adv_w = 179, .box_w = 5, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, {.bitmap_index = 2212, .adv_w = 156, .box_w = 7, .box_h = 33, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 2244, .adv_w = 342, .box_w = 16, .box_h = 22, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 2316, .adv_w = 368, .box_w = 16, .box_h = 14, .ofs_x = 3, .ofs_y = 9}, - {.bitmap_index = 2338, .adv_w = 354, .box_w = 17, .box_h = 22, .ofs_x = 3, .ofs_y = 4}, - {.bitmap_index = 2414, .adv_w = 324, .box_w = 17, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2500, .adv_w = 591, .box_w = 32, .box_h = 45, .ofs_x = 3, .ofs_y = -11}, - {.bitmap_index = 2768, .adv_w = 443, .box_w = 26, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2929, .adv_w = 419, .box_w = 20, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 3046, .adv_w = 435, .box_w = 22, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 3162, .adv_w = 438, .box_w = 21, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 3259, .adv_w = 382, .box_w = 18, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 3308, .adv_w = 369, .box_w = 18, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 3350, .adv_w = 454, .box_w = 23, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 3469, .adv_w = 476, .box_w = 23, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 3510, .adv_w = 192, .box_w = 5, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 3519, .adv_w = 371, .box_w = 19, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3577, .adv_w = 419, .box_w = 23, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 3721, .adv_w = 365, .box_w = 18, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 3753, .adv_w = 580, .box_w = 29, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 3923, .adv_w = 476, .box_w = 23, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 4042, .adv_w = 462, .box_w = 23, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 4166, .adv_w = 426, .box_w = 21, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 4251, .adv_w = 462, .box_w = 24, .box_h = 40, .ofs_x = 3, .ofs_y = -6}, - {.bitmap_index = 4402, .adv_w = 408, .box_w = 22, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 4526, .adv_w = 398, .box_w = 21, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4669, .adv_w = 400, .box_w = 22, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4706, .adv_w = 431, .box_w = 21, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 4770, .adv_w = 431, .box_w = 25, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4926, .adv_w = 585, .box_w = 35, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5142, .adv_w = 423, .box_w = 24, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5307, .adv_w = 403, .box_w = 24, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5423, .adv_w = 402, .box_w = 21, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5548, .adv_w = 192, .box_w = 8, .box_h = 47, .ofs_x = 3, .ofs_y = -7}, - {.bitmap_index = 5572, .adv_w = 284, .box_w = 17, .box_h = 38, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 5700, .adv_w = 192, .box_w = 9, .box_h = 47, .ofs_x = 0, .ofs_y = -7}, - {.bitmap_index = 5726, .adv_w = 285, .box_w = 16, .box_h = 17, .ofs_x = 1, .ofs_y = 17}, - {.bitmap_index = 5784, .adv_w = 311, .box_w = 18, .box_h = 4, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 5792, .adv_w = 237, .box_w = 11, .box_h = 7, .ofs_x = 1, .ofs_y = 29}, - {.bitmap_index = 5809, .adv_w = 368, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5900, .adv_w = 379, .box_w = 19, .box_h = 36, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 5979, .adv_w = 355, .box_w = 19, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6060, .adv_w = 381, .box_w = 19, .box_h = 36, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6144, .adv_w = 360, .box_w = 19, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6232, .adv_w = 243, .box_w = 13, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6277, .adv_w = 379, .box_w = 19, .box_h = 37, .ofs_x = 2, .ofs_y = -11}, - {.bitmap_index = 6389, .adv_w = 371, .box_w = 17, .box_h = 36, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6437, .adv_w = 176, .box_w = 5, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6452, .adv_w = 172, .box_w = 9, .box_h = 45, .ofs_x = -1, .ofs_y = -11}, - {.bitmap_index = 6489, .adv_w = 346, .box_w = 19, .box_h = 36, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6597, .adv_w = 176, .box_w = 5, .box_h = 36, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6606, .adv_w = 578, .box_w = 30, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6679, .adv_w = 372, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 6720, .adv_w = 386, .box_w = 20, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6813, .adv_w = 379, .box_w = 19, .box_h = 36, .ofs_x = 3, .ofs_y = -10}, - {.bitmap_index = 6896, .adv_w = 384, .box_w = 19, .box_h = 36, .ofs_x = 2, .ofs_y = -10}, - {.bitmap_index = 6982, .adv_w = 234, .box_w = 11, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7008, .adv_w = 350, .box_w = 18, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7106, .adv_w = 227, .box_w = 12, .box_h = 32, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7140, .adv_w = 371, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 7182, .adv_w = 329, .box_w = 19, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7284, .adv_w = 499, .box_w = 29, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7440, .adv_w = 337, .box_w = 19, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7543, .adv_w = 320, .box_w = 19, .box_h = 37, .ofs_x = 0, .ofs_y = -11}, - {.bitmap_index = 7676, .adv_w = 337, .box_w = 17, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 7752, .adv_w = 236, .box_w = 13, .box_h = 47, .ofs_x = 2, .ofs_y = -9}, - {.bitmap_index = 7844, .adv_w = 188, .box_w = 4, .box_h = 41, .ofs_x = 4, .ofs_y = -7}, - {.bitmap_index = 7853, .adv_w = 236, .box_w = 12, .box_h = 47, .ofs_x = 1, .ofs_y = -9}, - {.bitmap_index = 7938, .adv_w = 453, .box_w = 22, .box_h = 9, .ofs_x = 3, .ofs_y = 10}, - {.bitmap_index = 7985, .adv_w = 176, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7985, .adv_w = 178, .box_w = 5, .box_h = 35, .ofs_x = 3, .ofs_y = -9}, - {.bitmap_index = 8001, .adv_w = 393, .box_w = 21, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8085, .adv_w = 287, .box_w = 12, .box_h = 13, .ofs_x = 3, .ofs_y = 23}, - {.bitmap_index = 8122, .adv_w = 361, .box_w = 18, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 8163, .adv_w = 253, .box_w = 12, .box_h = 19, .ofs_x = 2, .ofs_y = 15}, - {.bitmap_index = 8211, .adv_w = 253, .box_w = 12, .box_h = 19, .ofs_x = 2, .ofs_y = 15}, - {.bitmap_index = 8261, .adv_w = 383, .box_w = 17, .box_h = 36, .ofs_x = 3, .ofs_y = -10}, - {.bitmap_index = 8309, .adv_w = 324, .box_w = 17, .box_h = 35, .ofs_x = 2, .ofs_y = -9}, - {.bitmap_index = 8401, .adv_w = 443, .box_w = 26, .box_h = 44, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8597, .adv_w = 443, .box_w = 26, .box_h = 44, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8794, .adv_w = 443, .box_w = 26, .box_h = 44, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8994, .adv_w = 443, .box_w = 26, .box_h = 44, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9200, .adv_w = 443, .box_w = 27, .box_h = 42, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9386, .adv_w = 443, .box_w = 26, .box_h = 46, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9599, .adv_w = 624, .box_w = 39, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 9761, .adv_w = 435, .box_w = 22, .box_h = 45, .ofs_x = 3, .ofs_y = -11}, - {.bitmap_index = 9914, .adv_w = 382, .box_w = 18, .box_h = 44, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 9995, .adv_w = 382, .box_w = 18, .box_h = 44, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 10075, .adv_w = 382, .box_w = 18, .box_h = 44, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 10157, .adv_w = 382, .box_w = 18, .box_h = 42, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 10226, .adv_w = 192, .box_w = 11, .box_h = 44, .ofs_x = -2, .ofs_y = 0}, - {.bitmap_index = 10262, .adv_w = 192, .box_w = 11, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10298, .adv_w = 192, .box_w = 13, .box_h = 44, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10344, .adv_w = 192, .box_w = 15, .box_h = 42, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 10382, .adv_w = 450, .box_w = 24, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10491, .adv_w = 476, .box_w = 23, .box_h = 44, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 10653, .adv_w = 462, .box_w = 23, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10808, .adv_w = 462, .box_w = 23, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 10964, .adv_w = 462, .box_w = 23, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 11126, .adv_w = 462, .box_w = 23, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 11288, .adv_w = 462, .box_w = 23, .box_h = 43, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 11433, .adv_w = 362, .box_w = 19, .box_h = 23, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 11526, .adv_w = 462, .box_w = 24, .box_h = 38, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 11711, .adv_w = 431, .box_w = 21, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 11808, .adv_w = 431, .box_w = 21, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 11907, .adv_w = 431, .box_w = 21, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 12008, .adv_w = 431, .box_w = 21, .box_h = 43, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 12093, .adv_w = 403, .box_w = 24, .box_h = 44, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12246, .adv_w = 396, .box_w = 19, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 12327, .adv_w = 401, .box_w = 20, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 12460, .adv_w = 368, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 12582, .adv_w = 368, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 12704, .adv_w = 368, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 12828, .adv_w = 368, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 12955, .adv_w = 368, .box_w = 18, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 13065, .adv_w = 368, .box_w = 18, .box_h = 39, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 13198, .adv_w = 560, .box_w = 32, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13359, .adv_w = 355, .box_w = 19, .box_h = 37, .ofs_x = 2, .ofs_y = -11}, - {.bitmap_index = 13477, .adv_w = 360, .box_w = 19, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13597, .adv_w = 360, .box_w = 19, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13718, .adv_w = 360, .box_w = 19, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13841, .adv_w = 360, .box_w = 19, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 13948, .adv_w = 181, .box_w = 11, .box_h = 36, .ofs_x = -3, .ofs_y = 0}, - {.bitmap_index = 13981, .adv_w = 181, .box_w = 11, .box_h = 36, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 14014, .adv_w = 181, .box_w = 13, .box_h = 36, .ofs_x = -1, .ofs_y = 0}, - {.bitmap_index = 14056, .adv_w = 181, .box_w = 15, .box_h = 34, .ofs_x = -2, .ofs_y = 0}, - {.bitmap_index = 14090, .adv_w = 395, .box_w = 19, .box_h = 38, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 14233, .adv_w = 372, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 14315, .adv_w = 386, .box_w = 20, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 14439, .adv_w = 386, .box_w = 20, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 14567, .adv_w = 386, .box_w = 20, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 14696, .adv_w = 386, .box_w = 20, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 14828, .adv_w = 386, .box_w = 20, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 14941, .adv_w = 384, .box_w = 20, .box_h = 24, .ofs_x = 2, .ofs_y = 4}, - {.bitmap_index = 14983, .adv_w = 383, .box_w = 20, .box_h = 32, .ofs_x = 2, .ofs_y = -3}, - {.bitmap_index = 15117, .adv_w = 371, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 15191, .adv_w = 371, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 15265, .adv_w = 371, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 15341, .adv_w = 371, .box_w = 18, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 15403, .adv_w = 320, .box_w = 19, .box_h = 47, .ofs_x = 0, .ofs_y = -11}, - {.bitmap_index = 15570, .adv_w = 390, .box_w = 19, .box_h = 46, .ofs_x = 3, .ofs_y = -10}, - {.bitmap_index = 15668, .adv_w = 320, .box_w = 19, .box_h = 45, .ofs_x = 0, .ofs_y = -11}, - {.bitmap_index = 15822, .adv_w = 454, .box_w = 23, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 15975, .adv_w = 379, .box_w = 19, .box_h = 47, .ofs_x = 2, .ofs_y = -11}, - {.bitmap_index = 16122, .adv_w = 192, .box_w = 5, .box_h = 42, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 16140, .adv_w = 181, .box_w = 5, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 16147, .adv_w = 635, .box_w = 34, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 16274, .adv_w = 597, .box_w = 34, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 16438, .adv_w = 398, .box_w = 21, .box_h = 45, .ofs_x = 2, .ofs_y = -11}, - {.bitmap_index = 16618, .adv_w = 350, .box_w = 18, .box_h = 37, .ofs_x = 2, .ofs_y = -11}, - {.bitmap_index = 16752, .adv_w = 398, .box_w = 21, .box_h = 44, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 16931, .adv_w = 350, .box_w = 18, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 17060, .adv_w = 402, .box_w = 21, .box_h = 44, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 17222, .adv_w = 337, .box_w = 17, .box_h = 36, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 17331, .adv_w = 432, .box_w = 22, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 17463, .adv_w = 259, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 13}, - {.bitmap_index = 17481, .adv_w = 379, .box_w = 19, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 17583, .adv_w = 768, .box_w = 34, .box_h = 33, .ofs_x = 7, .ofs_y = 2}, - {.bitmap_index = 17709, .adv_w = 768, .box_w = 40, .box_h = 28, .ofs_x = 4, .ofs_y = 10}, - {.bitmap_index = 17803, .adv_w = 768, .box_w = 36, .box_h = 49, .ofs_x = 6, .ofs_y = -6}, - {.bitmap_index = 18068, .adv_w = 768, .box_w = 46, .box_h = 38, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 18269, .adv_w = 768, .box_w = 32, .box_h = 33, .ofs_x = 8, .ofs_y = 2}, - {.bitmap_index = 18394, .adv_w = 768, .box_w = 33, .box_h = 32, .ofs_x = 8, .ofs_y = 2}, - {.bitmap_index = 18522, .adv_w = 768, .box_w = 33, .box_h = 32, .ofs_x = 7, .ofs_y = 2}, - {.bitmap_index = 18650, .adv_w = 768, .box_w = 32, .box_h = 33, .ofs_x = 8, .ofs_y = 1}, - {.bitmap_index = 18775, .adv_w = 768, .box_w = 24, .box_h = 40, .ofs_x = 12, .ofs_y = -2}, - {.bitmap_index = 18835, .adv_w = 768, .box_w = 36, .box_h = 43, .ofs_x = 6, .ofs_y = -5}, - {.bitmap_index = 18975, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 19086, .adv_w = 768, .box_w = 26, .box_h = 40, .ofs_x = 10, .ofs_y = -2}, - {.bitmap_index = 19273, .adv_w = 768, .box_w = 36, .box_h = 41, .ofs_x = 6, .ofs_y = 0}, - {.bitmap_index = 19359, .adv_w = 768, .box_w = 36, .box_h = 33, .ofs_x = 6, .ofs_y = -1}, - {.bitmap_index = 19496, .adv_w = 768, .box_w = 28, .box_h = 46, .ofs_x = 10, .ofs_y = -5}, - {.bitmap_index = 19572, .adv_w = 768, .box_w = 35, .box_h = 27, .ofs_x = 7, .ofs_y = 4}, - {.bitmap_index = 19710, .adv_w = 768, .box_w = 24, .box_h = 15, .ofs_x = 12, .ofs_y = 10}, - {.bitmap_index = 19783, .adv_w = 768, .box_w = 15, .box_h = 24, .ofs_x = 16, .ofs_y = 6}, - {.bitmap_index = 19854, .adv_w = 768, .box_w = 15, .box_h = 24, .ofs_x = 17, .ofs_y = 6}, - {.bitmap_index = 19925, .adv_w = 768, .box_w = 24, .box_h = 15, .ofs_x = 12, .ofs_y = 11}, - {.bitmap_index = 19997, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 20257, .adv_w = 768, .box_w = 28, .box_h = 28, .ofs_x = 10, .ofs_y = 4}, - {.bitmap_index = 20412, .adv_w = 768, .box_w = 40, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 20515, .adv_w = 768, .box_w = 10, .box_h = 34, .ofs_x = 19, .ofs_y = 1}, - {.bitmap_index = 20582, .adv_w = 768, .box_w = 45, .box_h = 33, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 20679, .adv_w = 768, .box_w = 41, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 20911, .adv_w = 768, .box_w = 30, .box_h = 37, .ofs_x = 9, .ofs_y = -1}, - {.bitmap_index = 21095, .adv_w = 768, .box_w = 28, .box_h = 40, .ofs_x = 10, .ofs_y = -2}, - {.bitmap_index = 21181, .adv_w = 768, .box_w = 43, .box_h = 36, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 21441, .adv_w = 768, .box_w = 40, .box_h = 35, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 21569, .adv_w = 768, .box_w = 46, .box_h = 30, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 21670, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 21869, .adv_w = 768, .box_w = 48, .box_h = 34, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 21961, .adv_w = 768, .box_w = 40, .box_h = 38, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 22200, .adv_w = 768, .box_w = 28, .box_h = 40, .ofs_x = 10, .ofs_y = -2}, - {.bitmap_index = 22324, .adv_w = 768, .box_w = 32, .box_h = 43, .ofs_x = 8, .ofs_y = -2}, - {.bitmap_index = 22461, .adv_w = 768, .box_w = 28, .box_h = 4, .ofs_x = 10, .ofs_y = 16}, - {.bitmap_index = 22468, .adv_w = 768, .box_w = 24, .box_h = 28, .ofs_x = 12, .ofs_y = 4}, - {.bitmap_index = 22496, .adv_w = 768, .box_w = 22, .box_h = 29, .ofs_x = 16, .ofs_y = 3}, - {.bitmap_index = 22590, .adv_w = 768, .box_w = 28, .box_h = 28, .ofs_x = 10, .ofs_y = 4}, - {.bitmap_index = 22635, .adv_w = 768, .box_w = 34, .box_h = 35, .ofs_x = 7, .ofs_y = 1}, - {.bitmap_index = 22819, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 23037, .adv_w = 768, .box_w = 37, .box_h = 40, .ofs_x = 5, .ofs_y = -2}, - {.bitmap_index = 23158, .adv_w = 768, .box_w = 38, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 23378, .adv_w = 768, .box_w = 37, .box_h = 40, .ofs_x = 5, .ofs_y = -2}, - {.bitmap_index = 23510, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 23724, .adv_w = 768, .box_w = 34, .box_h = 34, .ofs_x = 7, .ofs_y = 1}, - {.bitmap_index = 23933, .adv_w = 768, .box_w = 29, .box_h = 30, .ofs_x = 10, .ofs_y = 3}, - {.bitmap_index = 24029, .adv_w = 768, .box_w = 24, .box_h = 24, .ofs_x = 12, .ofs_y = 6}, - {.bitmap_index = 24104, .adv_w = 768, .box_w = 24, .box_h = 24, .ofs_x = 12, .ofs_y = 6}, - {.bitmap_index = 24179, .adv_w = 768, .box_w = 46, .box_h = 33, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 24315, .adv_w = 768, .box_w = 28, .box_h = 40, .ofs_x = 10, .ofs_y = -2}, - {.bitmap_index = 24477, .adv_w = 768, .box_w = 24, .box_h = 24, .ofs_x = 12, .ofs_y = 6}, - {.bitmap_index = 24501, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 24675, .adv_w = 768, .box_w = 46, .box_h = 37, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 24769, .adv_w = 768, .box_w = 22, .box_h = 40, .ofs_x = 13, .ofs_y = -2}, - {.bitmap_index = 24872, .adv_w = 768, .box_w = 36, .box_h = 43, .ofs_x = 6, .ofs_y = -2}, - {.bitmap_index = 25090, .adv_w = 768, .box_w = 36, .box_h = 46, .ofs_x = 6, .ofs_y = -5}, - {.bitmap_index = 25324, .adv_w = 768, .box_w = 36, .box_h = 36, .ofs_x = 6, .ofs_y = 0}, - {.bitmap_index = 25517, .adv_w = 768, .box_w = 27, .box_h = 34, .ofs_x = 10, .ofs_y = 1}, - {.bitmap_index = 25626, .adv_w = 768, .box_w = 24, .box_h = 35, .ofs_x = 12, .ofs_y = 1}, - {.bitmap_index = 25756, .adv_w = 768, .box_w = 24, .box_h = 35, .ofs_x = 12, .ofs_y = 1}, - {.bitmap_index = 25921, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 26070, .adv_w = 768, .box_w = 40, .box_h = 44, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 26386, .adv_w = 768, .box_w = 36, .box_h = 40, .ofs_x = 6, .ofs_y = -2}, - {.bitmap_index = 26614, .adv_w = 768, .box_w = 44, .box_h = 44, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 26856, .adv_w = 768, .box_w = 44, .box_h = 36, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 27075, .adv_w = 768, .box_w = 34, .box_h = 36, .ofs_x = 7, .ofs_y = 0}, - {.bitmap_index = 27260, .adv_w = 768, .box_w = 36, .box_h = 38, .ofs_x = 8, .ofs_y = -2}, - {.bitmap_index = 27454, .adv_w = 768, .box_w = 40, .box_h = 38, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 27657, .adv_w = 768, .box_w = 31, .box_h = 35, .ofs_x = 10, .ofs_y = -1}, - {.bitmap_index = 27770, .adv_w = 768, .box_w = 41, .box_h = 33, .ofs_x = 3, .ofs_y = 2}, - {.bitmap_index = 27940, .adv_w = 768, .box_w = 36, .box_h = 46, .ofs_x = 6, .ofs_y = -5}, - {.bitmap_index = 28154, .adv_w = 768, .box_w = 40, .box_h = 35, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 28303, .adv_w = 768, .box_w = 24, .box_h = 36, .ofs_x = 12, .ofs_y = 0}, - {.bitmap_index = 28379, .adv_w = 768, .box_w = 34, .box_h = 40, .ofs_x = 7, .ofs_y = -2}, - {.bitmap_index = 28497, .adv_w = 768, .box_w = 36, .box_h = 36, .ofs_x = 6, .ofs_y = 0}, - {.bitmap_index = 28632, .adv_w = 768, .box_w = 36, .box_h = 36, .ofs_x = 6, .ofs_y = 0}, - {.bitmap_index = 28767, .adv_w = 768, .box_w = 44, .box_h = 45, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 28983, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 29269, .adv_w = 768, .box_w = 33, .box_h = 44, .ofs_x = 5, .ofs_y = -5}, - {.bitmap_index = 29456, .adv_w = 768, .box_w = 38, .box_h = 40, .ofs_x = 5, .ofs_y = -2}, - {.bitmap_index = 29686, .adv_w = 768, .box_w = 34, .box_h = 40, .ofs_x = 7, .ofs_y = -2}, - {.bitmap_index = 29888, .adv_w = 768, .box_w = 38, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 30041, .adv_w = 768, .box_w = 38, .box_h = 34, .ofs_x = 6, .ofs_y = 1}, - {.bitmap_index = 30199, .adv_w = 768, .box_w = 34, .box_h = 34, .ofs_x = 7, .ofs_y = 1}, - {.bitmap_index = 30319, .adv_w = 768, .box_w = 40, .box_h = 34, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 30497, .adv_w = 768, .box_w = 40, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 30578, .adv_w = 768, .box_w = 40, .box_h = 37, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 30662, .adv_w = 768, .box_w = 21, .box_h = 40, .ofs_x = 13, .ofs_y = -2}, - {.bitmap_index = 30743, .adv_w = 768, .box_w = 34, .box_h = 40, .ofs_x = 7, .ofs_y = -2}, - {.bitmap_index = 30947, .adv_w = 768, .box_w = 31, .box_h = 36, .ofs_x = 7, .ofs_y = -2}, - {.bitmap_index = 31071, .adv_w = 768, .box_w = 29, .box_h = 40, .ofs_x = 10, .ofs_y = -2}, - {.bitmap_index = 31248, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 31454, .adv_w = 768, .box_w = 36, .box_h = 45, .ofs_x = 6, .ofs_y = -4}, - {.bitmap_index = 31658, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 31817, .adv_w = 768, .box_w = 36, .box_h = 40, .ofs_x = 6, .ofs_y = -2}, - {.bitmap_index = 31959, .adv_w = 768, .box_w = 36, .box_h = 40, .ofs_x = 6, .ofs_y = -2}, - {.bitmap_index = 32069, .adv_w = 768, .box_w = 34, .box_h = 36, .ofs_x = 7, .ofs_y = 0}, - {.bitmap_index = 32147, .adv_w = 768, .box_w = 34, .box_h = 40, .ofs_x = 7, .ofs_y = -2}, - {.bitmap_index = 32279, .adv_w = 768, .box_w = 40, .box_h = 20, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 32350, .adv_w = 768, .box_w = 40, .box_h = 28, .ofs_x = 4, .ofs_y = 4}, - {.bitmap_index = 32430, .adv_w = 768, .box_w = 46, .box_h = 40, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 32605, .adv_w = 768, .box_w = 42, .box_h = 43, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 32755, .adv_w = 768, .box_w = 48, .box_h = 49, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 32949, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 33087, .adv_w = 768, .box_w = 48, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 33220, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 33459, .adv_w = 528, .box_w = 33, .box_h = 33, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 33662, .adv_w = 768, .box_w = 47, .box_h = 47, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 33963, .adv_w = 768, .box_w = 46, .box_h = 48, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 34222, .adv_w = 864, .box_w = 54, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 34490, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 34697, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 34893, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 35102, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 35417, .adv_w = 384, .box_w = 24, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 35502, .adv_w = 576, .box_w = 36, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 35637, .adv_w = 864, .box_w = 54, .box_h = 46, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 35965, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 36130, .adv_w = 528, .box_w = 33, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 36360, .adv_w = 672, .box_w = 30, .box_h = 44, .ofs_x = 6, .ofs_y = -4}, - {.bitmap_index = 36493, .adv_w = 672, .box_w = 42, .box_h = 50, .ofs_x = 0, .ofs_y = -7}, - {.bitmap_index = 36662, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 36772, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 36850, .adv_w = 672, .box_w = 30, .box_h = 44, .ofs_x = 6, .ofs_y = -4}, - {.bitmap_index = 36983, .adv_w = 672, .box_w = 44, .box_h = 42, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 37155, .adv_w = 480, .box_w = 26, .box_h = 41, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 37358, .adv_w = 480, .box_w = 26, .box_h = 41, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 37561, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 37676, .adv_w = 672, .box_w = 42, .box_h = 9, .ofs_x = 0, .ofs_y = 13}, - {.bitmap_index = 37701, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 38025, .adv_w = 960, .box_w = 60, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 38453, .adv_w = 864, .box_w = 56, .box_h = 48, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 38748, .adv_w = 768, .box_w = 48, .box_h = 44, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 39048, .adv_w = 672, .box_w = 41, .box_h = 26, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 39216, .adv_w = 672, .box_w = 41, .box_h = 26, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 39386, .adv_w = 960, .box_w = 60, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 39619, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 39710, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 39916, .adv_w = 768, .box_w = 49, .box_h = 49, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 40179, .adv_w = 768, .box_w = 43, .box_h = 38, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 40299, .adv_w = 672, .box_w = 43, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 40606, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 40724, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 40856, .adv_w = 672, .box_w = 42, .box_h = 37, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 40938, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 41115, .adv_w = 480, .box_w = 32, .box_h = 48, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 41300, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 41442, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 41630, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 41756, .adv_w = 768, .box_w = 50, .box_h = 50, .ofs_x = -1, .ofs_y = -7}, - {.bitmap_index = 41974, .adv_w = 768, .box_w = 36, .box_h = 40, .ofs_x = 6, .ofs_y = -2}, - {.bitmap_index = 42126, .adv_w = 576, .box_w = 36, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 42220, .adv_w = 768, .box_w = 46, .box_h = 42, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 42319, .adv_w = 768, .box_w = 40, .box_h = 34, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 42492, .adv_w = 960, .box_w = 60, .box_h = 44, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 42802, .adv_w = 768, .box_w = 46, .box_h = 28, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 42981, .adv_w = 768, .box_w = 36, .box_h = 34, .ofs_x = 6, .ofs_y = 1}, - {.bitmap_index = 43060, .adv_w = 768, .box_w = 40, .box_h = 34, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 43141, .adv_w = 768, .box_w = 36, .box_h = 34, .ofs_x = 6, .ofs_y = 1}, - {.bitmap_index = 43205, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 43299, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 43393, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 43487, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 43582, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 43671, .adv_w = 960, .box_w = 61, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 43913, .adv_w = 672, .box_w = 36, .box_h = 48, .ofs_x = 3, .ofs_y = -6}, - {.bitmap_index = 44216, .adv_w = 768, .box_w = 24, .box_h = 40, .ofs_x = 12, .ofs_y = -2}, - {.bitmap_index = 44284, .adv_w = 768, .box_w = 24, .box_h = 40, .ofs_x = 12, .ofs_y = -2}, - {.bitmap_index = 44358, .adv_w = 768, .box_w = 24, .box_h = 40, .ofs_x = 12, .ofs_y = -2}, - {.bitmap_index = 44437, .adv_w = 768, .box_w = 46, .box_h = 29, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 44672, .adv_w = 768, .box_w = 40, .box_h = 31, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 44773, .adv_w = 768, .box_w = 40, .box_h = 31, .ofs_x = 4, .ofs_y = 1}, - {.bitmap_index = 44865, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 45000, .adv_w = 768, .box_w = 49, .box_h = 49, .ofs_x = -1, .ofs_y = -7}, - {.bitmap_index = 45283, .adv_w = 768, .box_w = 24, .box_h = 46, .ofs_x = 12, .ofs_y = -5}, - {.bitmap_index = 45432, .adv_w = 960, .box_w = 60, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 45707, .adv_w = 576, .box_w = 36, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 45822, .adv_w = 773, .box_w = 48, .box_h = 31, .ofs_x = 0, .ofs_y = 3} + {.bitmap_index = 2245, .adv_w = 342, .box_w = 16, .box_h = 22, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 2317, .adv_w = 368, .box_w = 16, .box_h = 14, .ofs_x = 3, .ofs_y = 9}, + {.bitmap_index = 2339, .adv_w = 354, .box_w = 17, .box_h = 22, .ofs_x = 3, .ofs_y = 4}, + {.bitmap_index = 2415, .adv_w = 324, .box_w = 17, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2498, .adv_w = 591, .box_w = 32, .box_h = 45, .ofs_x = 3, .ofs_y = -11}, + {.bitmap_index = 2765, .adv_w = 443, .box_w = 26, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2923, .adv_w = 419, .box_w = 20, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 3035, .adv_w = 435, .box_w = 22, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 3152, .adv_w = 438, .box_w = 21, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 3249, .adv_w = 382, .box_w = 19, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 3299, .adv_w = 369, .box_w = 18, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 3341, .adv_w = 454, .box_w = 22, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 3459, .adv_w = 476, .box_w = 23, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 3500, .adv_w = 192, .box_w = 5, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 3509, .adv_w = 371, .box_w = 19, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3569, .adv_w = 419, .box_w = 23, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 3711, .adv_w = 365, .box_w = 18, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 3743, .adv_w = 580, .box_w = 29, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 3913, .adv_w = 476, .box_w = 23, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 4032, .adv_w = 462, .box_w = 23, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4156, .adv_w = 426, .box_w = 21, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 4241, .adv_w = 462, .box_w = 24, .box_h = 40, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 4392, .adv_w = 408, .box_w = 22, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 4510, .adv_w = 398, .box_w = 21, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4656, .adv_w = 400, .box_w = 22, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4693, .adv_w = 431, .box_w = 21, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4753, .adv_w = 431, .box_w = 25, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4909, .adv_w = 585, .box_w = 35, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5125, .adv_w = 423, .box_w = 24, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5290, .adv_w = 403, .box_w = 24, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5408, .adv_w = 402, .box_w = 21, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5534, .adv_w = 192, .box_w = 8, .box_h = 47, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 5558, .adv_w = 284, .box_w = 17, .box_h = 38, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5685, .adv_w = 192, .box_w = 9, .box_h = 47, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 5711, .adv_w = 285, .box_w = 16, .box_h = 17, .ofs_x = 1, .ofs_y = 17}, + {.bitmap_index = 5769, .adv_w = 311, .box_w = 18, .box_h = 4, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5777, .adv_w = 237, .box_w = 11, .box_h = 7, .ofs_x = 1, .ofs_y = 29}, + {.bitmap_index = 5794, .adv_w = 368, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5879, .adv_w = 379, .box_w = 19, .box_h = 36, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5958, .adv_w = 355, .box_w = 19, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6039, .adv_w = 381, .box_w = 19, .box_h = 36, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6125, .adv_w = 360, .box_w = 19, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6213, .adv_w = 243, .box_w = 14, .box_h = 37, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6261, .adv_w = 379, .box_w = 19, .box_h = 37, .ofs_x = 2, .ofs_y = -11}, + {.bitmap_index = 6374, .adv_w = 371, .box_w = 17, .box_h = 36, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6422, .adv_w = 176, .box_w = 5, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6437, .adv_w = 172, .box_w = 9, .box_h = 45, .ofs_x = -1, .ofs_y = -11}, + {.bitmap_index = 6472, .adv_w = 346, .box_w = 19, .box_h = 36, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6582, .adv_w = 176, .box_w = 5, .box_h = 36, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6591, .adv_w = 578, .box_w = 30, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6664, .adv_w = 372, .box_w = 17, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6705, .adv_w = 386, .box_w = 20, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6798, .adv_w = 379, .box_w = 19, .box_h = 36, .ofs_x = 3, .ofs_y = -10}, + {.bitmap_index = 6877, .adv_w = 384, .box_w = 19, .box_h = 36, .ofs_x = 2, .ofs_y = -10}, + {.bitmap_index = 6963, .adv_w = 234, .box_w = 11, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6991, .adv_w = 350, .box_w = 18, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7089, .adv_w = 227, .box_w = 12, .box_h = 32, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7123, .adv_w = 371, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7164, .adv_w = 329, .box_w = 19, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7265, .adv_w = 499, .box_w = 30, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7424, .adv_w = 337, .box_w = 19, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7527, .adv_w = 320, .box_w = 20, .box_h = 37, .ofs_x = 0, .ofs_y = -11}, + {.bitmap_index = 7667, .adv_w = 337, .box_w = 17, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7743, .adv_w = 236, .box_w = 12, .box_h = 47, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 7824, .adv_w = 188, .box_w = 4, .box_h = 41, .ofs_x = 4, .ofs_y = -7}, + {.bitmap_index = 7833, .adv_w = 236, .box_w = 12, .box_h = 48, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 7917, .adv_w = 453, .box_w = 22, .box_h = 9, .ofs_x = 3, .ofs_y = 10}, + {.bitmap_index = 7963, .adv_w = 176, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7963, .adv_w = 178, .box_w = 5, .box_h = 35, .ofs_x = 3, .ofs_y = -9}, + {.bitmap_index = 7979, .adv_w = 393, .box_w = 21, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8066, .adv_w = 287, .box_w = 12, .box_h = 13, .ofs_x = 3, .ofs_y = 23}, + {.bitmap_index = 8103, .adv_w = 361, .box_w = 19, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8150, .adv_w = 253, .box_w = 12, .box_h = 18, .ofs_x = 2, .ofs_y = 16}, + {.bitmap_index = 8196, .adv_w = 253, .box_w = 12, .box_h = 18, .ofs_x = 2, .ofs_y = 16}, + {.bitmap_index = 8246, .adv_w = 383, .box_w = 17, .box_h = 36, .ofs_x = 3, .ofs_y = -10}, + {.bitmap_index = 8294, .adv_w = 324, .box_w = 17, .box_h = 35, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 8387, .adv_w = 443, .box_w = 26, .box_h = 44, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8580, .adv_w = 443, .box_w = 26, .box_h = 44, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8775, .adv_w = 443, .box_w = 26, .box_h = 44, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8973, .adv_w = 443, .box_w = 26, .box_h = 44, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9177, .adv_w = 443, .box_w = 26, .box_h = 42, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9363, .adv_w = 443, .box_w = 26, .box_h = 46, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9574, .adv_w = 624, .box_w = 38, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9739, .adv_w = 435, .box_w = 22, .box_h = 45, .ofs_x = 3, .ofs_y = -11}, + {.bitmap_index = 9893, .adv_w = 382, .box_w = 19, .box_h = 44, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 9975, .adv_w = 382, .box_w = 19, .box_h = 44, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10058, .adv_w = 382, .box_w = 19, .box_h = 44, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10144, .adv_w = 382, .box_w = 19, .box_h = 42, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10215, .adv_w = 192, .box_w = 11, .box_h = 44, .ofs_x = -2, .ofs_y = 0}, + {.bitmap_index = 10251, .adv_w = 192, .box_w = 11, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10287, .adv_w = 192, .box_w = 13, .box_h = 44, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10333, .adv_w = 192, .box_w = 15, .box_h = 42, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 10371, .adv_w = 450, .box_w = 25, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10484, .adv_w = 476, .box_w = 23, .box_h = 44, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10647, .adv_w = 462, .box_w = 23, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10802, .adv_w = 462, .box_w = 23, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10959, .adv_w = 462, .box_w = 23, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 11121, .adv_w = 462, .box_w = 23, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 11283, .adv_w = 462, .box_w = 23, .box_h = 43, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 11429, .adv_w = 362, .box_w = 19, .box_h = 23, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 11522, .adv_w = 462, .box_w = 24, .box_h = 38, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 11707, .adv_w = 431, .box_w = 21, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 11800, .adv_w = 431, .box_w = 21, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 11895, .adv_w = 431, .box_w = 21, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 11992, .adv_w = 431, .box_w = 21, .box_h = 43, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 12073, .adv_w = 403, .box_w = 24, .box_h = 44, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12228, .adv_w = 396, .box_w = 19, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12310, .adv_w = 401, .box_w = 20, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 12440, .adv_w = 368, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 12560, .adv_w = 368, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 12676, .adv_w = 368, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 12795, .adv_w = 368, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 12916, .adv_w = 368, .box_w = 18, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13020, .adv_w = 368, .box_w = 18, .box_h = 39, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13144, .adv_w = 560, .box_w = 32, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13302, .adv_w = 355, .box_w = 19, .box_h = 37, .ofs_x = 2, .ofs_y = -11}, + {.bitmap_index = 13420, .adv_w = 360, .box_w = 19, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13540, .adv_w = 360, .box_w = 19, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13661, .adv_w = 360, .box_w = 19, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13783, .adv_w = 360, .box_w = 19, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13890, .adv_w = 181, .box_w = 11, .box_h = 36, .ofs_x = -3, .ofs_y = 0}, + {.bitmap_index = 13923, .adv_w = 181, .box_w = 11, .box_h = 36, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13956, .adv_w = 181, .box_w = 13, .box_h = 36, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 13999, .adv_w = 181, .box_w = 15, .box_h = 34, .ofs_x = -2, .ofs_y = 0}, + {.bitmap_index = 14033, .adv_w = 395, .box_w = 19, .box_h = 38, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 14176, .adv_w = 372, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 14258, .adv_w = 386, .box_w = 20, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14382, .adv_w = 386, .box_w = 20, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14509, .adv_w = 386, .box_w = 20, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14637, .adv_w = 386, .box_w = 20, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14769, .adv_w = 386, .box_w = 20, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14882, .adv_w = 384, .box_w = 20, .box_h = 24, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 14924, .adv_w = 383, .box_w = 20, .box_h = 32, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 15058, .adv_w = 371, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15131, .adv_w = 371, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15203, .adv_w = 371, .box_w = 18, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15278, .adv_w = 371, .box_w = 18, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15339, .adv_w = 320, .box_w = 20, .box_h = 47, .ofs_x = 0, .ofs_y = -11}, + {.bitmap_index = 15514, .adv_w = 390, .box_w = 19, .box_h = 46, .ofs_x = 3, .ofs_y = -10}, + {.bitmap_index = 15606, .adv_w = 320, .box_w = 19, .box_h = 45, .ofs_x = 0, .ofs_y = -11}, + {.bitmap_index = 15762, .adv_w = 454, .box_w = 22, .box_h = 44, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15913, .adv_w = 379, .box_w = 19, .box_h = 47, .ofs_x = 2, .ofs_y = -11}, + {.bitmap_index = 16061, .adv_w = 192, .box_w = 5, .box_h = 42, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16079, .adv_w = 181, .box_w = 5, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16086, .adv_w = 635, .box_w = 34, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16210, .adv_w = 597, .box_w = 34, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 16374, .adv_w = 398, .box_w = 21, .box_h = 45, .ofs_x = 2, .ofs_y = -11}, + {.bitmap_index = 16557, .adv_w = 350, .box_w = 18, .box_h = 37, .ofs_x = 2, .ofs_y = -11}, + {.bitmap_index = 16690, .adv_w = 398, .box_w = 21, .box_h = 44, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 16873, .adv_w = 350, .box_w = 18, .box_h = 37, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 17004, .adv_w = 402, .box_w = 21, .box_h = 44, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 17167, .adv_w = 337, .box_w = 17, .box_h = 36, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 17275, .adv_w = 259, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = 13}, + {.bitmap_index = 17293, .adv_w = 379, .box_w = 20, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 17405, .adv_w = 768, .box_w = 34, .box_h = 33, .ofs_x = 7, .ofs_y = 2}, + {.bitmap_index = 17531, .adv_w = 768, .box_w = 40, .box_h = 28, .ofs_x = 4, .ofs_y = 10}, + {.bitmap_index = 17625, .adv_w = 768, .box_w = 36, .box_h = 49, .ofs_x = 6, .ofs_y = -6}, + {.bitmap_index = 17890, .adv_w = 768, .box_w = 46, .box_h = 38, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 18091, .adv_w = 768, .box_w = 32, .box_h = 33, .ofs_x = 8, .ofs_y = 2}, + {.bitmap_index = 18216, .adv_w = 768, .box_w = 33, .box_h = 32, .ofs_x = 8, .ofs_y = 2}, + {.bitmap_index = 18344, .adv_w = 768, .box_w = 33, .box_h = 32, .ofs_x = 7, .ofs_y = 2}, + {.bitmap_index = 18472, .adv_w = 768, .box_w = 32, .box_h = 33, .ofs_x = 8, .ofs_y = 1}, + {.bitmap_index = 18597, .adv_w = 768, .box_w = 24, .box_h = 40, .ofs_x = 12, .ofs_y = -2}, + {.bitmap_index = 18657, .adv_w = 768, .box_w = 36, .box_h = 43, .ofs_x = 6, .ofs_y = -5}, + {.bitmap_index = 18797, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 18908, .adv_w = 768, .box_w = 26, .box_h = 40, .ofs_x = 10, .ofs_y = -2}, + {.bitmap_index = 19095, .adv_w = 768, .box_w = 36, .box_h = 41, .ofs_x = 6, .ofs_y = 0}, + {.bitmap_index = 19181, .adv_w = 768, .box_w = 36, .box_h = 33, .ofs_x = 6, .ofs_y = -1}, + {.bitmap_index = 19318, .adv_w = 768, .box_w = 28, .box_h = 46, .ofs_x = 10, .ofs_y = -5}, + {.bitmap_index = 19394, .adv_w = 768, .box_w = 35, .box_h = 27, .ofs_x = 7, .ofs_y = 4}, + {.bitmap_index = 19532, .adv_w = 768, .box_w = 24, .box_h = 15, .ofs_x = 12, .ofs_y = 10}, + {.bitmap_index = 19605, .adv_w = 768, .box_w = 15, .box_h = 24, .ofs_x = 16, .ofs_y = 6}, + {.bitmap_index = 19676, .adv_w = 768, .box_w = 15, .box_h = 24, .ofs_x = 17, .ofs_y = 6}, + {.bitmap_index = 19747, .adv_w = 768, .box_w = 24, .box_h = 15, .ofs_x = 12, .ofs_y = 11}, + {.bitmap_index = 19819, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 20079, .adv_w = 768, .box_w = 28, .box_h = 28, .ofs_x = 10, .ofs_y = 4}, + {.bitmap_index = 20234, .adv_w = 768, .box_w = 40, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 20337, .adv_w = 768, .box_w = 10, .box_h = 34, .ofs_x = 19, .ofs_y = 1}, + {.bitmap_index = 20404, .adv_w = 768, .box_w = 45, .box_h = 33, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 20501, .adv_w = 768, .box_w = 41, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 20733, .adv_w = 768, .box_w = 30, .box_h = 37, .ofs_x = 9, .ofs_y = -1}, + {.bitmap_index = 20917, .adv_w = 768, .box_w = 28, .box_h = 40, .ofs_x = 10, .ofs_y = -2}, + {.bitmap_index = 21003, .adv_w = 768, .box_w = 43, .box_h = 36, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21263, .adv_w = 768, .box_w = 40, .box_h = 35, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 21391, .adv_w = 768, .box_w = 46, .box_h = 30, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 21492, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 21691, .adv_w = 768, .box_w = 48, .box_h = 34, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21783, .adv_w = 768, .box_w = 40, .box_h = 38, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 22022, .adv_w = 768, .box_w = 28, .box_h = 40, .ofs_x = 10, .ofs_y = -2}, + {.bitmap_index = 22146, .adv_w = 768, .box_w = 32, .box_h = 43, .ofs_x = 8, .ofs_y = -2}, + {.bitmap_index = 22283, .adv_w = 768, .box_w = 28, .box_h = 4, .ofs_x = 10, .ofs_y = 16}, + {.bitmap_index = 22290, .adv_w = 768, .box_w = 24, .box_h = 28, .ofs_x = 12, .ofs_y = 4}, + {.bitmap_index = 22318, .adv_w = 768, .box_w = 22, .box_h = 29, .ofs_x = 16, .ofs_y = 3}, + {.bitmap_index = 22412, .adv_w = 768, .box_w = 28, .box_h = 28, .ofs_x = 10, .ofs_y = 4}, + {.bitmap_index = 22457, .adv_w = 768, .box_w = 34, .box_h = 35, .ofs_x = 7, .ofs_y = 1}, + {.bitmap_index = 22641, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 22859, .adv_w = 768, .box_w = 37, .box_h = 40, .ofs_x = 5, .ofs_y = -2}, + {.bitmap_index = 22980, .adv_w = 768, .box_w = 38, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 23200, .adv_w = 768, .box_w = 37, .box_h = 40, .ofs_x = 5, .ofs_y = -2}, + {.bitmap_index = 23332, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 23546, .adv_w = 768, .box_w = 34, .box_h = 34, .ofs_x = 7, .ofs_y = 1}, + {.bitmap_index = 23755, .adv_w = 768, .box_w = 29, .box_h = 30, .ofs_x = 10, .ofs_y = 3}, + {.bitmap_index = 23851, .adv_w = 768, .box_w = 24, .box_h = 24, .ofs_x = 12, .ofs_y = 6}, + {.bitmap_index = 23926, .adv_w = 768, .box_w = 24, .box_h = 24, .ofs_x = 12, .ofs_y = 6}, + {.bitmap_index = 24001, .adv_w = 768, .box_w = 46, .box_h = 33, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 24137, .adv_w = 768, .box_w = 28, .box_h = 40, .ofs_x = 10, .ofs_y = -2}, + {.bitmap_index = 24299, .adv_w = 768, .box_w = 24, .box_h = 24, .ofs_x = 12, .ofs_y = 6}, + {.bitmap_index = 24323, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 24497, .adv_w = 768, .box_w = 46, .box_h = 37, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 24591, .adv_w = 768, .box_w = 22, .box_h = 40, .ofs_x = 13, .ofs_y = -2}, + {.bitmap_index = 24694, .adv_w = 768, .box_w = 36, .box_h = 43, .ofs_x = 6, .ofs_y = -2}, + {.bitmap_index = 24912, .adv_w = 768, .box_w = 36, .box_h = 46, .ofs_x = 6, .ofs_y = -5}, + {.bitmap_index = 25146, .adv_w = 768, .box_w = 36, .box_h = 36, .ofs_x = 6, .ofs_y = 0}, + {.bitmap_index = 25339, .adv_w = 768, .box_w = 27, .box_h = 34, .ofs_x = 10, .ofs_y = 1}, + {.bitmap_index = 25448, .adv_w = 768, .box_w = 24, .box_h = 35, .ofs_x = 12, .ofs_y = 1}, + {.bitmap_index = 25578, .adv_w = 768, .box_w = 24, .box_h = 35, .ofs_x = 12, .ofs_y = 1}, + {.bitmap_index = 25743, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 25892, .adv_w = 768, .box_w = 40, .box_h = 44, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 26208, .adv_w = 768, .box_w = 36, .box_h = 40, .ofs_x = 6, .ofs_y = -2}, + {.bitmap_index = 26436, .adv_w = 768, .box_w = 44, .box_h = 44, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 26678, .adv_w = 768, .box_w = 44, .box_h = 36, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 26897, .adv_w = 768, .box_w = 34, .box_h = 36, .ofs_x = 7, .ofs_y = 0}, + {.bitmap_index = 27082, .adv_w = 768, .box_w = 36, .box_h = 38, .ofs_x = 8, .ofs_y = -2}, + {.bitmap_index = 27276, .adv_w = 768, .box_w = 40, .box_h = 38, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 27479, .adv_w = 768, .box_w = 31, .box_h = 35, .ofs_x = 10, .ofs_y = -1}, + {.bitmap_index = 27592, .adv_w = 768, .box_w = 41, .box_h = 33, .ofs_x = 3, .ofs_y = 2}, + {.bitmap_index = 27762, .adv_w = 768, .box_w = 36, .box_h = 46, .ofs_x = 6, .ofs_y = -5}, + {.bitmap_index = 27976, .adv_w = 768, .box_w = 40, .box_h = 35, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 28125, .adv_w = 768, .box_w = 24, .box_h = 36, .ofs_x = 12, .ofs_y = 0}, + {.bitmap_index = 28201, .adv_w = 768, .box_w = 34, .box_h = 40, .ofs_x = 7, .ofs_y = -2}, + {.bitmap_index = 28319, .adv_w = 768, .box_w = 36, .box_h = 36, .ofs_x = 6, .ofs_y = 0}, + {.bitmap_index = 28454, .adv_w = 768, .box_w = 36, .box_h = 36, .ofs_x = 6, .ofs_y = 0}, + {.bitmap_index = 28589, .adv_w = 768, .box_w = 44, .box_h = 45, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 28805, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 29091, .adv_w = 768, .box_w = 33, .box_h = 44, .ofs_x = 5, .ofs_y = -5}, + {.bitmap_index = 29278, .adv_w = 768, .box_w = 38, .box_h = 40, .ofs_x = 5, .ofs_y = -2}, + {.bitmap_index = 29508, .adv_w = 768, .box_w = 34, .box_h = 40, .ofs_x = 7, .ofs_y = -2}, + {.bitmap_index = 29710, .adv_w = 768, .box_w = 38, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 29863, .adv_w = 768, .box_w = 38, .box_h = 34, .ofs_x = 6, .ofs_y = 1}, + {.bitmap_index = 30021, .adv_w = 768, .box_w = 34, .box_h = 34, .ofs_x = 7, .ofs_y = 1}, + {.bitmap_index = 30141, .adv_w = 768, .box_w = 40, .box_h = 34, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 30319, .adv_w = 768, .box_w = 40, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 30400, .adv_w = 768, .box_w = 40, .box_h = 37, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 30484, .adv_w = 768, .box_w = 21, .box_h = 40, .ofs_x = 13, .ofs_y = -2}, + {.bitmap_index = 30565, .adv_w = 768, .box_w = 34, .box_h = 40, .ofs_x = 7, .ofs_y = -2}, + {.bitmap_index = 30769, .adv_w = 768, .box_w = 31, .box_h = 36, .ofs_x = 7, .ofs_y = -2}, + {.bitmap_index = 30893, .adv_w = 768, .box_w = 29, .box_h = 40, .ofs_x = 10, .ofs_y = -2}, + {.bitmap_index = 31070, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 31276, .adv_w = 768, .box_w = 36, .box_h = 45, .ofs_x = 6, .ofs_y = -4}, + {.bitmap_index = 31480, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 31639, .adv_w = 768, .box_w = 36, .box_h = 40, .ofs_x = 6, .ofs_y = -2}, + {.bitmap_index = 31781, .adv_w = 768, .box_w = 36, .box_h = 40, .ofs_x = 6, .ofs_y = -2}, + {.bitmap_index = 31891, .adv_w = 768, .box_w = 34, .box_h = 36, .ofs_x = 7, .ofs_y = 0}, + {.bitmap_index = 31969, .adv_w = 768, .box_w = 34, .box_h = 40, .ofs_x = 7, .ofs_y = -2}, + {.bitmap_index = 32101, .adv_w = 768, .box_w = 40, .box_h = 20, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 32172, .adv_w = 768, .box_w = 40, .box_h = 28, .ofs_x = 4, .ofs_y = 4}, + {.bitmap_index = 32252, .adv_w = 768, .box_w = 46, .box_h = 40, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32427, .adv_w = 768, .box_w = 42, .box_h = 43, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 32577, .adv_w = 768, .box_w = 48, .box_h = 49, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 32771, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 32909, .adv_w = 768, .box_w = 48, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 33042, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 33281, .adv_w = 528, .box_w = 33, .box_h = 33, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 33484, .adv_w = 768, .box_w = 47, .box_h = 47, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 33785, .adv_w = 768, .box_w = 46, .box_h = 48, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 34044, .adv_w = 864, .box_w = 54, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 34312, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 34519, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 34715, .adv_w = 768, .box_w = 40, .box_h = 40, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 34924, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 35239, .adv_w = 384, .box_w = 24, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 35324, .adv_w = 576, .box_w = 36, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 35459, .adv_w = 864, .box_w = 54, .box_h = 46, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 35787, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 35952, .adv_w = 528, .box_w = 33, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 36182, .adv_w = 672, .box_w = 30, .box_h = 44, .ofs_x = 6, .ofs_y = -4}, + {.bitmap_index = 36315, .adv_w = 672, .box_w = 42, .box_h = 50, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 36484, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 36594, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 36672, .adv_w = 672, .box_w = 30, .box_h = 44, .ofs_x = 6, .ofs_y = -4}, + {.bitmap_index = 36805, .adv_w = 672, .box_w = 44, .box_h = 42, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 36977, .adv_w = 480, .box_w = 26, .box_h = 41, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 37180, .adv_w = 480, .box_w = 26, .box_h = 41, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 37383, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 37498, .adv_w = 672, .box_w = 42, .box_h = 9, .ofs_x = 0, .ofs_y = 13}, + {.bitmap_index = 37523, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 37847, .adv_w = 960, .box_w = 60, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 38275, .adv_w = 864, .box_w = 56, .box_h = 48, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 38570, .adv_w = 768, .box_w = 48, .box_h = 44, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 38870, .adv_w = 672, .box_w = 41, .box_h = 26, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 39038, .adv_w = 672, .box_w = 41, .box_h = 26, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 39208, .adv_w = 960, .box_w = 60, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 39441, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 39532, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 39738, .adv_w = 768, .box_w = 49, .box_h = 49, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 40001, .adv_w = 768, .box_w = 43, .box_h = 38, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 40121, .adv_w = 672, .box_w = 43, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 40428, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 40546, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 40678, .adv_w = 672, .box_w = 42, .box_h = 37, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 40760, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 40937, .adv_w = 480, .box_w = 32, .box_h = 48, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 41122, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 41264, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 41452, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 41578, .adv_w = 768, .box_w = 50, .box_h = 50, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 41796, .adv_w = 768, .box_w = 36, .box_h = 40, .ofs_x = 6, .ofs_y = -2}, + {.bitmap_index = 41948, .adv_w = 576, .box_w = 36, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 42042, .adv_w = 768, .box_w = 46, .box_h = 42, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 42141, .adv_w = 768, .box_w = 40, .box_h = 34, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 42314, .adv_w = 960, .box_w = 60, .box_h = 44, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 42624, .adv_w = 768, .box_w = 46, .box_h = 28, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 42803, .adv_w = 768, .box_w = 36, .box_h = 34, .ofs_x = 6, .ofs_y = 1}, + {.bitmap_index = 42882, .adv_w = 768, .box_w = 40, .box_h = 34, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 42963, .adv_w = 768, .box_w = 36, .box_h = 34, .ofs_x = 6, .ofs_y = 1}, + {.bitmap_index = 43027, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 43121, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 43215, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 43309, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 43404, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 43493, .adv_w = 960, .box_w = 61, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 43735, .adv_w = 672, .box_w = 36, .box_h = 48, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 44038, .adv_w = 768, .box_w = 24, .box_h = 40, .ofs_x = 12, .ofs_y = -2}, + {.bitmap_index = 44106, .adv_w = 768, .box_w = 24, .box_h = 40, .ofs_x = 12, .ofs_y = -2}, + {.bitmap_index = 44180, .adv_w = 768, .box_w = 24, .box_h = 40, .ofs_x = 12, .ofs_y = -2}, + {.bitmap_index = 44259, .adv_w = 768, .box_w = 46, .box_h = 29, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 44494, .adv_w = 768, .box_w = 40, .box_h = 31, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 44595, .adv_w = 768, .box_w = 40, .box_h = 31, .ofs_x = 4, .ofs_y = 1}, + {.bitmap_index = 44687, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 44822, .adv_w = 768, .box_w = 49, .box_h = 49, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 45105, .adv_w = 768, .box_w = 24, .box_h = 46, .ofs_x = 12, .ofs_y = -5}, + {.bitmap_index = 45254, .adv_w = 960, .box_w = 60, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 45529, .adv_w = 576, .box_w = 36, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 45644, .adv_w = 773, .box_w = 48, .box_h = 31, .ofs_x = 0, .ofs_y = 3} }; /*--------------------- @@ -7035,30 +7007,30 @@ static const uint16_t unicode_list_1[] = { static const uint16_t unicode_list_3[] = { 0x0, 0x1, 0x12, 0x13, 0x34, 0x35, 0x40, 0x41, - 0x42, 0x43, 0x5f, 0x60, 0x1d80, 0x1f04, 0x1f8e, 0xdee6, - 0xdef3, 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, - 0xdf7c, 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, - 0xe023, 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, - 0xe0f2, 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, - 0xe20c, 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, - 0xe31a, 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, - 0xe390, 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, - 0xe447, 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, - 0xe48a, 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, - 0xe583, 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, - 0xe5f9, 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, - 0xe7bf, 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, - 0xe952, 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, - 0xeeea, 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, - 0xeefe, 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, - 0xef2a, 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, - 0xef49, 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, - 0xef5b, 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, - 0xefab, 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, - 0xf03d, 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, - 0xf122, 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, - 0xf184, 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, - 0xf43c, 0xf6a4, 0xf784 + 0x42, 0x43, 0x5f, 0x60, 0x1f04, 0x1f8e, 0xdee6, 0xdef3, + 0xdefd, 0xdf08, 0xdf27, 0xdf2f, 0xdf36, 0xdf3f, 0xdf70, 0xdf7c, + 0xdf8e, 0xdf91, 0xdfcf, 0xdfed, 0xdffe, 0xe00e, 0xe022, 0xe023, + 0xe024, 0xe025, 0xe032, 0xe038, 0xe058, 0xe0bb, 0xe0dc, 0xe0f2, + 0xe11a, 0xe171, 0xe1bc, 0xe1be, 0xe1c5, 0xe1ed, 0xe204, 0xe20c, + 0xe217, 0xe220, 0xe256, 0xe2c6, 0xe2ec, 0xe2f7, 0xe307, 0xe31a, + 0xe338, 0xe339, 0xe33a, 0xe375, 0xe37f, 0xe380, 0xe38f, 0xe390, + 0xe39b, 0xe3a5, 0xe3bd, 0xe3c0, 0xe3e4, 0xe3f1, 0xe3fd, 0xe447, + 0xe460, 0xe462, 0xe46e, 0xe470, 0xe471, 0xe476, 0xe47b, 0xe48a, + 0xe48b, 0xe4d3, 0xe4dc, 0xe4e8, 0xe4ee, 0xe52c, 0xe56c, 0xe583, + 0xe587, 0xe597, 0xe5a2, 0xe5a5, 0xe5ca, 0xe5ef, 0xe5f0, 0xe5f9, + 0xe60c, 0xe63c, 0xe641, 0xe64b, 0xe690, 0xe6fd, 0xe6fe, 0xe7bf, + 0xe7f9, 0xe7fe, 0xe841, 0xe84d, 0xe87f, 0xe882, 0xe88d, 0xe952, + 0xe95c, 0xe98e, 0xe9b9, 0xeb7b, 0xee41, 0xeea8, 0xeee3, 0xeeea, + 0xeeed, 0xeeee, 0xeeef, 0xeef3, 0xeef5, 0xeef7, 0xeefb, 0xeefe, + 0xef02, 0xef03, 0xef08, 0xef09, 0xef0a, 0xef20, 0xef25, 0xef2a, + 0xef2d, 0xef2e, 0xef2f, 0xef33, 0xef34, 0xef35, 0xef36, 0xef49, + 0xef4a, 0xef50, 0xef52, 0xef53, 0xef56, 0xef59, 0xef5a, 0xef5b, + 0xef5d, 0xef75, 0xef77, 0xef91, 0xefa6, 0xefa7, 0xefa9, 0xefab, + 0xefc2, 0xefc9, 0xefcc, 0xefd5, 0xeffe, 0xf006, 0xf036, 0xf03d, + 0xf0bd, 0xf0c3, 0xf0cd, 0xf0d5, 0xf0fe, 0xf0ff, 0xf100, 0xf122, + 0xf123, 0xf124, 0xf125, 0xf126, 0xf169, 0xf175, 0xf183, 0xf184, + 0xf185, 0xf19c, 0xf1b5, 0xf1b6, 0xf1cf, 0xf1e6, 0xf2ed, 0xf43c, + 0xf6a4, 0xf784 }; /*Collect the unicode lists and glyph_id offsets*/ @@ -7078,7 +7050,7 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = }, { .range_start = 286, .range_length = 63365, .glyph_id_start = 169, - .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 195, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .unicode_list = unicode_list_3, .glyph_id_ofs_list = NULL, .list_length = 194, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; diff --git a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c index a21b4b3e6..21e572462 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c +++ b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c @@ -286,8 +286,14 @@ const be_const_member_t lv0_constants[] = { { "CHART_UPDATE_MODE_CIRCULAR", be_cconst_int(LV_CHART_UPDATE_MODE_CIRCULAR) }, { "CHART_UPDATE_MODE_SHIFT", be_cconst_int(LV_CHART_UPDATE_MODE_SHIFT) }, { "COLOR_AQUA", be_cconst_int(0x00FFFF) }, + { "COLOR_AZURE", be_cconst_int(0xF0FFFF) }, + { "COLOR_BEIGE", be_cconst_int(0xF5F5DC) }, + { "COLOR_BISQUE", be_cconst_int(0xFFE4C4) }, { "COLOR_BLACK", be_cconst_int(0x000000) }, { "COLOR_BLUE", be_cconst_int(0x0000FF) }, + { "COLOR_BLUSH", be_cconst_int(0xB00000) }, + { "COLOR_BROWN", be_cconst_int(0xA52A2A) }, + { "COLOR_CORAL", be_cconst_int(0xFF7F50) }, { "COLOR_CYAN", be_cconst_int(0x00FFFF) }, { "COLOR_DEPTH", be_cconst_int(LV_COLOR_DEPTH) }, { "COLOR_FORMAT_A1", be_cconst_int(LV_COLOR_FORMAT_A1) }, @@ -321,18 +327,36 @@ const be_const_member_t lv0_constants[] = { { "COLOR_FORMAT_YUV_END", be_cconst_int(LV_COLOR_FORMAT_YUV_END) }, { "COLOR_FORMAT_YUV_START", be_cconst_int(LV_COLOR_FORMAT_YUV_START) }, { "COLOR_FORMAT_YUY2", be_cconst_int(LV_COLOR_FORMAT_YUY2) }, + { "COLOR_FUCHSIA", be_cconst_int(0xFF00FF) }, + { "COLOR_GOLD", be_cconst_int(0xFFD700) }, { "COLOR_GRAY", be_cconst_int(0x808080) }, { "COLOR_GREEN", be_cconst_int(0x008000) }, + { "COLOR_GREY", be_cconst_int(0x808080) }, + { "COLOR_INDIGO", be_cconst_int(0x4B0082) }, + { "COLOR_IVORY", be_cconst_int(0xFFFFF0) }, + { "COLOR_KHAKI", be_cconst_int(0xF0E68C) }, { "COLOR_LIME", be_cconst_int(0x00FF00) }, + { "COLOR_LINEN", be_cconst_int(0xFAF0E6) }, { "COLOR_MAGENTA", be_cconst_int(0xFF00FF) }, { "COLOR_MAROON", be_cconst_int(0x800000) }, { "COLOR_NAVY", be_cconst_int(0x000080) }, { "COLOR_OLIVE", be_cconst_int(0x808000) }, - { "COLOR_ORANGE", be_cconst_int(0xFF7F00) }, + { "COLOR_ORANGE", be_cconst_int(0xFFA500) }, + { "COLOR_ORCHID", be_cconst_int(0xDA70D6) }, + { "COLOR_PERU", be_cconst_int(0xCD853F) }, + { "COLOR_PINK", be_cconst_int(0xFFC0CB) }, + { "COLOR_PLUM", be_cconst_int(0xDDA0DD) }, { "COLOR_PURPLE", be_cconst_int(0x800080) }, { "COLOR_RED", be_cconst_int(0xFF0000) }, + { "COLOR_SALMON", be_cconst_int(0xFA8072) }, + { "COLOR_SIENNA", be_cconst_int(0xA0522D) }, { "COLOR_SILVER", be_cconst_int(0xC0C0C0) }, + { "COLOR_SNOW", be_cconst_int(0xFFFAFA) }, + { "COLOR_TAN", be_cconst_int(0xD2B48C) }, { "COLOR_TEAL", be_cconst_int(0x008080) }, + { "COLOR_TOMATO", be_cconst_int(0xFF6347) }, + { "COLOR_VIOLET", be_cconst_int(0xEE82EE) }, + { "COLOR_WHEAT", be_cconst_int(0xF5DEB3) }, { "COLOR_WHITE", be_cconst_int(0xFFFFFF) }, { "COLOR_YELLOW", be_cconst_int(0xFFFF00) }, { "COORD_MAX", be_cconst_int(LV_COORD_MAX) }, diff --git a/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_enum.h b/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_enum.h index b2d70de4f..90b6f4062 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_enum.h +++ b/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_enum.h @@ -23,6 +23,7 @@ LV_LAYOUT_FLEX=>be_LV_LAYOUT_FLEX COLOR_WHITE=0xFFFFFF COLOR_SILVER=0xC0C0C0 COLOR_GRAY=0x808080 +COLOR_GREY=0x808080 // OpenHASP COLOR_BLACK=0x000000 COLOR_RED=0xFF0000 COLOR_MAROON=0x800000 @@ -36,8 +37,33 @@ COLOR_TEAL=0x008080 COLOR_BLUE=0x0000FF COLOR_NAVY=0x000080 COLOR_MAGENTA=0xFF00FF -COLOR_ORANGE=0xFF7F00 +COLOR_FUCHSIA=0xFF00FF // OpenHASP +COLOR_ORANGE=0xFFA500 // OpenHASP COLOR_PURPLE=0x800080 +// Below are OpenHASP additions +COLOR_PERU=0xCD853F +COLOR_SIENNA=0xA0522D +COLOR_BROWN=0xA52A2A +COLOR_SNOW=0xFFFAFA +COLOR_IVORY=0xFFFFF0 +COLOR_LINEN=0xFAF0E6 +COLOR_BEIGE=0xF5F5DC +COLOR_AZURE=0xF0FFFF +COLOR_SILVER=0xC0C0C0 +COLOR_PINK=0xFFC0CB +COLOR_PLUM=0xDDA0DD +COLOR_ORCHID=0xDA70D6 +COLOR_VIOLET=0xEE82EE +COLOR_INDIGO=0x4B0082 +COLOR_BLUSH=0xB00000 +COLOR_TOMATO=0xFF6347 +COLOR_SALMON=0xFA8072 +COLOR_CORAL=0xFF7F50 +COLOR_GOLD=0xFFD700 +COLOR_KHAKI=0xF0E68C +COLOR_BISQUE=0xFFE4C4 +COLOR_WHEAT=0xF5DEB3 +COLOR_TAN=0xD2B48C // Freetype FT_FONT_STYLE_NORMAL=FT_FONT_STYLE_NORMAL diff --git a/lib/libesp32_lvgl/lv_binding_berry/tools/preprocessor.py b/lib/libesp32_lvgl/lv_binding_berry/tools/preprocessor.py index cdc5543a9..48b39fa2b 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/tools/preprocessor.py +++ b/lib/libesp32_lvgl/lv_binding_berry/tools/preprocessor.py @@ -242,6 +242,7 @@ LV_LAYOUT_FLEX=>be_LV_LAYOUT_FLEX COLOR_WHITE=0xFFFFFF COLOR_SILVER=0xC0C0C0 COLOR_GRAY=0x808080 +COLOR_GREY=0x808080 // OpenHASP COLOR_BLACK=0x000000 COLOR_RED=0xFF0000 COLOR_MAROON=0x800000 @@ -255,8 +256,33 @@ COLOR_TEAL=0x008080 COLOR_BLUE=0x0000FF COLOR_NAVY=0x000080 COLOR_MAGENTA=0xFF00FF -COLOR_ORANGE=0xFF7F00 +COLOR_FUCHSIA=0xFF00FF // OpenHASP +COLOR_ORANGE=0xFFA500 // OpenHASP COLOR_PURPLE=0x800080 +// Below are OpenHASP additions +COLOR_PERU=0xCD853F +COLOR_SIENNA=0xA0522D +COLOR_BROWN=0xA52A2A +COLOR_SNOW=0xFFFAFA +COLOR_IVORY=0xFFFFF0 +COLOR_LINEN=0xFAF0E6 +COLOR_BEIGE=0xF5F5DC +COLOR_AZURE=0xF0FFFF +COLOR_SILVER=0xC0C0C0 +COLOR_PINK=0xFFC0CB +COLOR_PLUM=0xDDA0DD +COLOR_ORCHID=0xDA70D6 +COLOR_VIOLET=0xEE82EE +COLOR_INDIGO=0x4B0082 +COLOR_BLUSH=0xB00000 +COLOR_TOMATO=0xFF6347 +COLOR_SALMON=0xFA8072 +COLOR_CORAL=0xFF7F50 +COLOR_GOLD=0xFFD700 +COLOR_KHAKI=0xF0E68C +COLOR_BISQUE=0xFFE4C4 +COLOR_WHEAT=0xF5DEB3 +COLOR_TAN=0xD2B48C // Freetype FT_FONT_STYLE_NORMAL=FT_FONT_STYLE_NORMAL diff --git a/lib/libesp32_lvgl/lv_haspmota/solidify_all.be b/lib/libesp32_lvgl/lv_haspmota/solidify_all.be index 160d47188..879212d86 100755 --- a/lib/libesp32_lvgl/lv_haspmota/solidify_all.be +++ b/lib/libesp32_lvgl/lv_haspmota/solidify_all.be @@ -12,7 +12,7 @@ import sys sys.path().push('src/embedded') # allow to import from src/embedded # globals that need to exist to make compilation succeed -var globs = "path,ctypes_bytes_dyn,tasmota,ccronexpr,gpio,light,webclient,load,MD5,lv,light_state,udp,tcpclientasync," +var globs = "path,ctypes_bytes_dyn,tasmota,ccronexpr,gpio,light,webclient,load,MD5,lv,light_state,udp,tcpclientasync,log," "lv_clock,lv_clock_icon,lv_signal_arcs,lv_signal_bars,lv_wifi_arcs_icon,lv_wifi_arcs," "lv_wifi_bars_icon,lv_wifi_bars," "_lvgl," diff --git a/lib/libesp32_lvgl/lv_haspmota/src/be_lv_haspmota.c b/lib/libesp32_lvgl/lv_haspmota/src/be_lv_haspmota.c index b40ffde68..d758bbd57 100644 --- a/lib/libesp32_lvgl/lv_haspmota/src/be_lv_haspmota.c +++ b/lib/libesp32_lvgl/lv_haspmota/src/be_lv_haspmota.c @@ -28,6 +28,7 @@ extern const bclass be_class_lv_qrcode; extern const bclass be_class_lv_chart; extern const bclass be_class_lv_spangroup; extern const bclass be_class_lv_span; +extern const bclass be_class_lv_tabview; extern const bclass be_class_lv_button; extern const bclass be_class_lv_image; extern const bclass be_class_lv_buttonmatrix; diff --git a/lib/libesp32_lvgl/lv_haspmota/src/embedded/lv_0_module.be b/lib/libesp32_lvgl/lv_haspmota/src/embedded/lv_0_module.be index b76a44d1a..6dc17387a 100644 --- a/lib/libesp32_lvgl/lv_haspmota/src/embedded/lv_0_module.be +++ b/lib/libesp32_lvgl/lv_haspmota/src/embedded/lv_0_module.be @@ -16,7 +16,7 @@ var classes = [ # ported from LVGL 8 "colorwheel", # new internal names - "button", "image", "buttonmatrix", "msgbox" + "button", "image", "buttonmatrix", "msgbox", "tabview" ] for cl: classes diff --git a/lib/libesp32_lvgl/lv_haspmota/src/embedded/lv_haspmota.be b/lib/libesp32_lvgl/lv_haspmota/src/embedded/lv_haspmota.be index 9d65d6fb6..b8a77a7cc 100644 --- a/lib/libesp32_lvgl/lv_haspmota/src/embedded/lv_haspmota.be +++ b/lib/libesp32_lvgl/lv_haspmota/src/embedded/lv_haspmota.be @@ -86,6 +86,8 @@ class lvh_root var _parent_lvh # parent HASPmota object if 'parentid' was set, or 'nil' var _meta # free form metadata + var _tag # free-form JSON tag + #==================================================================== # Rule engine to map value and text to rules # hence enabling auto-updates ob objects @@ -208,8 +210,22 @@ class lvh_root try font = lv.font_embedded("robotocondensed", t) except .. + import path + # try TTF file "roboto.ttf" or "RobotoCondensed-Regular.ttf" try - font = lv.font_embedded("montserrat", t) + var ttf_name = "roboto.ttf" + if !path.exists(ttf_name) + ttf_name = "RobotoCondensed-Regular.ttf" + if !path.exists(ttf_name) + ttf_name = nil + end + end + if ttf_name != nil + font = lv.load_freetype_font(ttf_name, t, 0) + else + print("HSP: 'roboto.ttf' file missing for size:", t) + return nil + end except .. print("HSP: Unsupported font:", t) return nil @@ -299,6 +315,16 @@ class lvh_root return self._lv_obj end + #==================================================================== + # set_tag: create a free-form JSON tag + #==================================================================== + def set_tag(t) + self._tag = t + end + def get_tag() + return self._tag + end + #==================================================================== # set_text: create a `lv_label` sub object to the current object # (default case, may be overriden by object that directly take text) @@ -634,7 +660,7 @@ class lvh_obj : lvh_root var code = event.get_code() # materialize to a local variable, otherwise the value can change (and don't capture event object) if self.action != "" && code == lv.EVENT_CLICKED # if clicked and action is declared, do the page change event - tasmota.set_timer(0, /-> hm.do_action(self, code)) + tasmota.defer(/-> hm.do_action(self, code)) end var event_hasp = self._event_map.find(code) @@ -644,21 +670,39 @@ class lvh_obj : lvh_root var tas_event_more = "" # complementary data if code == lv.EVENT_VALUE_CHANGED import introspect - var val = introspect.get(self, true) # does not raise an exception if not found + var val = introspect.get(self, "val") # does not raise an exception if not found if (val != nil && type(val) != 'module') tas_event_more = f',"val":{json.dump(val)}' end - var text = introspect.get(self, true) # does not raise an exception if not found + var text = introspect.get(self, "text") # does not raise an exception if not found if (text != nil && type(text) != 'module') tas_event_more += f',"text":{json.dump(text)}' end end - var tas_event = format('{"hasp":{"p%ib%i":{"event":"%s"%s}}}', self._page._page_id, self.id, event_hasp, tas_event_more) + # add tag if present + if (self._tag != nil) + tas_event_more += f',"tag":{json.dump(self._tag)}' + end + # add sub-index if any + var sub_index = self.get_sub_id() + var sub_index_str = (sub_index != nil) ? "_" + str(sub_index) : "" + + var tas_event = format('{"hasp":{"p%ib%i%s":{"event":"%s"%s}}}', self._page._page_id, self.id, sub_index_str, event_hasp, tas_event_more) # print("val=",val) - tasmota.set_timer(0, /-> tasmota.publish_rule(tas_event)) + tasmota.defer(def () + tasmota.publish_rule(tas_event) + tasmota.log(f"HSP: publish {tas_event}", 4) + end) end end + #==================================================================== + # `get_sub_id` get any sub_index (only for buttonmatrix currently) + #==================================================================== + def get_sub_id() + return nil + end + #==================================================================== # `_delete` special attribute used to delete the object #==================================================================== @@ -1429,12 +1473,12 @@ class lvh_spinner : lvh_arc # obj: (opt) LVGL object if it already exists and was created prior to init() # parent_lvh: HASPmota parent object defined by `parentid` #==================================================================== - def init(parent, page, jline) + def init(parent, page, jline, lv_instance, parent_obj) var angle = jline.find("angle", 60) var speed = jline.find("speed", 1000) self._lv_obj = lv.spinner(parent) self._lv_obj.set_anim_params(speed, angle) - super(self).init(parent, page, jline, self._lv_obj) + super(self).init(parent, page, jline, self._lv_obj, parent_obj) end def set_angle(t) end @@ -1702,7 +1746,7 @@ class lvh_dropdown_list : lvh_obj if isinstance(self._parent_lvh, self._page._hm.lvh_dropdown) self._lv_obj = lv.list(self._parent_lvh._lv_obj.get_list()._p) else - print("HSP: '_dropdown_list' should have a parent of type 'dropdown'") + print("HSP: 'dropdown_list' should have a parent of type 'dropdown'") end super(self).post_init() end @@ -2023,6 +2067,8 @@ class lvh_span : lvh_root # print(">>> GOOD") self._lv_obj = self._parent_lvh._lv_obj.new_span() self._style = self._lv_obj.get_style() + else + print("HSP: 'span' should have a parent of type 'spangroup'") end # super(self).post_init() # call super - not needed for lvh_root end @@ -2127,6 +2173,182 @@ class lvh_span : lvh_root end +#==================================================================== +# tabview +#==================================================================== +#@ solidify:lvh_tabview,weak +class lvh_tabview : lvh_obj + static var _lv_class = lv.tabview + var _tab_list # list of tabs + + # label do not need a sub-label + def post_init() + self._tab_list = [] + super(self).post_init() # call super -- not needed + end + + #==================================================================== + # direction for buttons + #==================================================================== + static var _direction = [ + lv.DIR_NONE, # 0 = none + lv.DIR_TOP, # 1 = top + lv.DIR_BOTTOM, # 2 = bottom + lv.DIR_LEFT, # 3 = left + lv.DIR_RIGHT, # 4 = right + ] + def set_btn_pos(v) + v = int(v) + if (v == nil) || (v < 0) || (v >= size(self._direction)) + v = 0 + end + var direction = self._direction[v] + self._lv_obj.set_tab_bar_position(direction) + end + + #==================================================================== + # management of `_tab_list` list + #==================================================================== + # add lvh_tab instance as they are created + def push_tab(t) + self._tab_list.push(t) + end + # returns the index of the tab instance, or `nil` if not found + def find_tab(t) + return self._tab_list.find(t) + end + + #==================================================================== + # count read-only attribute, returns number of tabs + #==================================================================== + def get_count() + return self._lv_obj.get_tab_count() + end + def get_val() + return self._lv_obj.get_tab_active() + end + # change current tab + # v: value of new tab + # stop: (opt) if true, don't defer again to avoid infinite loop + def set_val(v, stop) + var v_max = self.get_count() + if (v_max == 0) + # probably not constructed yet + if (!stop) + tasmota.defer(def () self.set_val(v, true #-stop propagation-#) end) + end + else + if (v == nil) v = 0 end + if (v < 0) v = 0 end + if (v >= v_max) v = v_max - 1 end + + self._lv_obj.set_active(v, lv.ANIM_OFF) + end + end + def get_text() + var val = self.get_val() + if (val >= 0) && (val < self.get_count()) + return self._tab_list[val].get_text() + else + return nil + end + end +end + +#==================================================================== +# tab +#==================================================================== +#@ solidify:lvh_tab.lvh_btn_tab,weak +#@ solidify:lvh_tab,weak +class lvh_tab : lvh_obj + static var _lv_class = nil + # label do not need a sub-label + var _text # text label of the tab + var _btn # btn lvh object + + static class lvh_btn_tab : lvh_obj + static var _lv_class = lv.button + #==================================================================== + # specific post-init wihtout events + #==================================================================== + def post_init() + self._lv_obj.set_style_radius(0, 0) # set default radius to `0` for rectangle tabs + # self.register_event_cb() + end + end + + #==================================================================== + # init + # + # parent: LVGL parent object (used to create a sub-object) + # page: HASPmota page object + # jline: JSONL definition of the object from HASPmota template (used in sub-classes) + # obj: (opt) LVGL object if it already exists and was created prior to init() + # parent_lvh: HASPmota parent object defined by `parentid` + #==================================================================== + def init(parent, page, jline, lv_instance, parent_obj) + self.set_text(jline.find("text")) # anticipate reading 'text' for creation + super(self).init(parent, page, jline, lv_instance, parent_obj) + end + + def post_init() + self._lv_obj = nil # default to nil object, whatever it was initialized with + # check if it is the parent is a spangroup + if isinstance(self._parent_lvh, self._page._hm.lvh_tabview) + if (self._text != nil) + self._lv_obj = self._parent_lvh._lv_obj.add_tab(self._text) + + # get the last button object of the tab bar and create an instance of simplified btn + var tab_bar = self._parent_lvh._lv_obj.get_tab_bar() + var btn_class = lv.obj_class(lv.button._class) + var btn_count = tab_bar.get_child_count_by_type(btn_class) + var btn_obj = tab_bar.get_child_by_type(btn_count - 1, btn_class) # get last button + self._btn = self.lvh_btn_tab(nil, self._page, {}, btn_obj, self) # instanciate a local lvh object + + # add to parent list + self._parent_lvh.push_tab(self) + else + print("HSP: 'tab' requires 'text' attribute") + end + else + print("HSP: 'tab' should have a parent of type 'tabview'") + end + # super(self).post_init() # call super - not needed for lvh_root + end + + #==================================================================== + def set_text(t) + self._text = str(t) + end + def get_text() + return self._text + end + + #- ------------------------------------------------------------# + # `setmember` virtual setter + # + # If the key starts with `bar_` + # send to the corresponding object + #- ------------------------------------------------------------# + def setmember(k, v) + import string + if string.startswith(k, 'tab_') + self._btn.setmember(k[4..], v) + else + super(self).setmember(k, v) + end + end + def member(k) + import string + if string.startswith(k, 'tab_') + return self._btn.member(k[4..]) + else + return super(self).member(k) + end + end + +end + ################################################################################# # Special case for lv.chart # Adapted to getting values one after the other @@ -2227,6 +2449,18 @@ class lvh_btnmatrix : lvh_obj def get_options() return self._options end + def get_val() + return nil # no 'value' for btnmatrix + end + + #==================================================================== + # `get_sub_id` get any sub_index (only for buttonmatrix currently) + #==================================================================== + def get_sub_id() + var btn_idx = self._lv_obj.get_selected_button() + return (btn_idx != lv.BUTTONMATRIX_BUTTON_NONE) ? btn_idx : nil + end + end #==================================================================== @@ -2513,9 +2747,9 @@ class lvh_page # send page events var event_str_in = format('{"hasp":{"p%i":"out"}}', self._hm.lvh_page_cur_idx) - tasmota.set_timer(0, /-> tasmota.publish_rule(event_str_in)) + tasmota.defer(/-> tasmota.publish_rule(event_str_in)) var event_str_out = format('{"hasp":{"p%i":"in"}}', self._page_id) - tasmota.set_timer(0, /-> tasmota.publish_rule(event_str_out)) + tasmota.defer(/-> tasmota.publish_rule(event_str_out)) # change current page self._hm.lvh_page_cur_idx = self._page_id @@ -2588,6 +2822,8 @@ class HASPmota static lvh_scale_line = lvh_scale_line static lvh_spangroup = lvh_spangroup static lvh_span = lvh_span + static lvh_tabview = lvh_tabview + static lvh_tab = lvh_tab static lvh_qrcode = lvh_qrcode # special cases static lvh_chart = lvh_chart @@ -2655,7 +2891,8 @@ class HASPmota ################################################################################# static def sort(l) # insertion sort - for i:1..size(l)-1 + var i = 0 + while i < size(l) var k = l[i] var j = i while (j > 0) && (l[j-1] > k) @@ -2663,6 +2900,7 @@ class HASPmota j -= 1 end l[j] = k + i += 1 end return l end diff --git a/lib/libesp32_lvgl/lv_haspmota/src/solidify/solidified_lv_haspmota.h b/lib/libesp32_lvgl/lv_haspmota/src/solidify/solidified_lv_haspmota.h index be6f8f134..01dea9fb7 100644 --- a/lib/libesp32_lvgl/lv_haspmota/src/solidify/solidified_lv_haspmota.h +++ b/lib/libesp32_lvgl/lv_haspmota/src/solidify/solidified_lv_haspmota.h @@ -4,562 +4,83 @@ \********************************************************************/ #include "be_constobj.h" extern const bclass be_class_lvh_root; -// compact class 'lvh_root' ktab size: 65, total: 98 (saved 264 bytes) -static const bvalue be_ktab_class_lvh_root[65] = { - /* K0 */ be_nested_str_weak(_val_rule_formula), +// compact class 'lvh_root' ktab size: 70, total: 104 (saved 272 bytes) +static const bvalue be_ktab_class_lvh_root[70] = { + /* K0 */ be_nested_str_weak(remove_val_rule), /* K1 */ be_nested_str_weak(_val_rule), - /* K2 */ be_nested_str_weak(_page), - /* K3 */ be_nested_str_weak(_parent_lvh), - /* K4 */ be_nested_str_weak(_lv_class), - /* K5 */ be_nested_str_weak(_lv_obj), - /* K6 */ be_nested_str_weak(post_init), - /* K7 */ be_nested_str_weak(int), - /* K8 */ be_nested_str_weak(lv), - /* K9 */ be_nested_str_weak(font_embedded), - /* K10 */ be_nested_str_weak(robotocondensed), - /* K11 */ be_nested_str_weak(montserrat), - /* K12 */ be_nested_str_weak(HSP_X3A_X20Unsupported_X20font_X3A), - /* K13 */ be_nested_str_weak(string), - /* K14 */ be_nested_str_weak(split), - /* K15 */ be_nested_str_weak(_X3A), - /* K16 */ be_const_int(1), - /* K17 */ be_nested_str_weak(_X2D), - /* K18 */ be_const_int(0), - /* K19 */ be_const_int(2), - /* K20 */ be_nested_str_weak(concat), - /* K21 */ be_nested_str_weak(endswith), - /* K22 */ be_nested_str_weak(_X2Ettf), - /* K23 */ be_nested_str_weak(load_freetype_font), - /* K24 */ be_nested_str_weak(load_font), - /* K25 */ be_nested_str_weak(_delete), - /* K26 */ be_nested_str_weak(_text_rule_formula), - /* K27 */ be_nested_str_weak(return_X20_X2F_X20val_X20_X2D_X3E_X20_X28), - /* K28 */ be_nested_str_weak(_X29), - /* K29 */ be_nested_str_weak(_text_rule_function), - /* K30 */ be_nested_str_weak(HSP_X3A_X20failed_X20to_X20compile_X20_X27_X25s_X27_X20_X2D_X20_X25s_X20_X28_X25s_X29), - /* K31 */ be_nested_str_weak(_meta), - /* K32 */ be_nested_str_weak(_text_rule_format), - /* K33 */ be_nested_str_weak(_text_rule), - /* K34 */ be_nested_str_weak(remove_val_rule), - /* K35 */ be_nested_str_weak(tasmota), - /* K36 */ be_nested_str_weak(add_rule), - /* K37 */ be_nested_str_weak(remove_obj), - /* K38 */ be_nested_str_weak(id), - /* K39 */ be_nested_str_weak(get_text), - /* K40 */ be_const_class(be_class_lvh_root), - /* K41 */ be_nested_str_weak(_X23), - /* K42 */ be_nested_str_weak(color), - /* K43 */ be_nested_str_weak(introspect), - /* K44 */ be_nested_str_weak(COLOR_), - /* K45 */ be_nested_str_weak(toupper), - /* K46 */ be_nested_str_weak(get), - /* K47 */ be_nested_str_weak(_val_rule_function), - /* K48 */ be_nested_str_weak(_val), - /* K49 */ be_nested_str_weak(set_val), - /* K50 */ be_nested_str_weak(resize), - /* K51 */ be_nested_str_weak(_digit2part), - /* K52 */ be_nested_str_weak(_digit2state), - /* K53 */ be_nested_str_weak(invalid_X20style_X20suffix_X20_X2502i), - /* K54 */ be_nested_str_weak(value_error), - /* K55 */ be_nested_str_weak(remove_rule), - /* K56 */ be_nested_str_weak(HSP_X3A_X20failed_X20to_X20run_X20self_X2E_val_rule_function_X20_X2D_X20_X25s_X20_X28_X25s_X29), - /* K57 */ be_nested_str_weak(val), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(add_rule), + /* K4 */ be_nested_str_weak(_val_rule_formula), + /* K5 */ be_nested_str_weak(return_X20_X2F_X20val_X20_X2D_X3E_X20_X28), + /* K6 */ be_nested_str_weak(_X29), + /* K7 */ be_nested_str_weak(_val_rule_function), + /* K8 */ be_nested_str_weak(HSP_X3A_X20failed_X20to_X20compile_X20_X27_X25s_X27_X20_X2D_X20_X25s_X20_X28_X25s_X29), + /* K9 */ be_const_class(be_class_lvh_root), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_weak(_X23), + /* K12 */ be_nested_str_weak(lv), + /* K13 */ be_nested_str_weak(color), + /* K14 */ be_nested_str_weak(string), + /* K15 */ be_nested_str_weak(introspect), + /* K16 */ be_nested_str_weak(COLOR_), + /* K17 */ be_nested_str_weak(toupper), + /* K18 */ be_nested_str_weak(get), + /* K19 */ be_nested_str_weak(_page), + /* K20 */ be_nested_str_weak(remove_obj), + /* K21 */ be_nested_str_weak(id), + /* K22 */ be_nested_str_weak(int), + /* K23 */ be_nested_str_weak(font_embedded), + /* K24 */ be_nested_str_weak(robotocondensed), + /* K25 */ be_nested_str_weak(path), + /* K26 */ be_nested_str_weak(roboto_X2Ettf), + /* K27 */ be_nested_str_weak(exists), + /* K28 */ be_nested_str_weak(RobotoCondensed_X2DRegular_X2Ettf), + /* K29 */ be_nested_str_weak(load_freetype_font), + /* K30 */ be_nested_str_weak(HSP_X3A_X20_X27roboto_X2Ettf_X27_X20file_X20missing_X20for_X20size_X3A), + /* K31 */ be_nested_str_weak(HSP_X3A_X20Unsupported_X20font_X3A), + /* K32 */ be_nested_str_weak(split), + /* K33 */ be_nested_str_weak(_X3A), + /* K34 */ be_const_int(1), + /* K35 */ be_nested_str_weak(_X2D), + /* K36 */ be_const_int(2), + /* K37 */ be_nested_str_weak(concat), + /* K38 */ be_nested_str_weak(endswith), + /* K39 */ be_nested_str_weak(_X2Ettf), + /* K40 */ be_nested_str_weak(load_font), + /* K41 */ be_nested_str_weak(_text_rule_formula), + /* K42 */ be_nested_str_weak(HSP_X3A_X20failed_X20to_X20run_X20self_X2E_val_rule_function_X20_X2D_X20_X25s_X20_X28_X25s_X29), + /* K43 */ be_nested_str_weak(val), + /* K44 */ be_nested_str_weak(resize), + /* K45 */ be_nested_str_weak(_text_rule), + /* K46 */ be_nested_str_weak(remove_rule), + /* K47 */ be_nested_str_weak(_tag), + /* K48 */ be_nested_str_weak(_text_rule_format), + /* K49 */ be_nested_str_weak(set_text), + /* K50 */ be_nested_str_weak(_val), + /* K51 */ be_nested_str_weak(set_val), + /* K52 */ be_nested_str_weak(_parent_lvh), + /* K53 */ be_nested_str_weak(_lv_class), + /* K54 */ be_nested_str_weak(_lv_obj), + /* K55 */ be_nested_str_weak(post_init), + /* K56 */ be_nested_str_weak(_meta), + /* K57 */ be_nested_str_weak(_text_rule_function), /* K58 */ be_nested_str_weak(HSP_X3A_X20failed_X20to_X20run_X20self_X2E_text_rule_function_X20_X2D_X20_X25s_X20_X28_X25s_X29), /* K59 */ be_nested_str_weak(), /* K60 */ be_nested_str_weak(text), /* K61 */ be_nested_str_weak(remove_text_rule), - /* K62 */ be_nested_str_weak(type_error), - /* K63 */ be_nested_str_weak(you_X20cannot_X20assign_X20to_X20_X27delete_X27), - /* K64 */ be_nested_str_weak(set_text), + /* K62 */ be_nested_str_weak(_digit2part), + /* K63 */ be_nested_str_weak(_digit2state), + /* K64 */ be_nested_str_weak(invalid_X20style_X20suffix_X20_X2502i), + /* K65 */ be_nested_str_weak(value_error), + /* K66 */ be_nested_str_weak(get_text), + /* K67 */ be_nested_str_weak(_delete), + /* K68 */ be_nested_str_weak(type_error), + /* K69 */ be_nested_str_weak(you_X20cannot_X20assign_X20to_X20_X27delete_X27), }; extern const bclass be_class_lvh_root; -/******************************************************************** -** Solidified function: get_val_rule_formula -********************************************************************/ -be_local_closure(class_lvh_root_get_val_rule_formula, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(get_val_rule_formula), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_val_rule -********************************************************************/ -be_local_closure(class_lvh_root_get_val_rule, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(get_val_rule), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(class_lvh_root_init, /* name */ - be_nested_proto( - 9, /* nstack */ - 6, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0x90020402, // 0000 SETMBR R0 K2 R2 - 0x90020605, // 0001 SETMBR R0 K3 R5 - 0x4C180000, // 0002 LDNIL R6 - 0x1C180806, // 0003 EQ R6 R4 R6 - 0x781A0007, // 0004 JMPF R6 #000D - 0x88180104, // 0005 GETMBR R6 R0 K4 - 0x781A0005, // 0006 JMPF R6 #000D - 0x88180104, // 0007 GETMBR R6 R0 K4 - 0x5C1C0C00, // 0008 MOVE R7 R6 - 0x5C200200, // 0009 MOVE R8 R1 - 0x7C1C0200, // 000A CALL R7 1 - 0x90020A07, // 000B SETMBR R0 K5 R7 - 0x70020000, // 000C JMP #000E - 0x90020A04, // 000D SETMBR R0 K5 R4 - 0x8C180106, // 000E GETMET R6 R0 K6 - 0x7C180200, // 000F CALL R6 1 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_font -********************************************************************/ -be_local_closure(class_lvh_root_parse_font, /* name */ - be_nested_proto( - 15, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(parse_font), - &be_const_str_solidified, - ( &(const binstruction[148]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x600C0004, // 0001 GETGBL R3 G4 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C0C0200, // 0003 CALL R3 1 - 0x1C0C0707, // 0004 EQ R3 R3 K7 - 0x780E0020, // 0005 JMPF R3 #0027 - 0xA8020007, // 0006 EXBLK 0 #000F - 0xB80E1000, // 0007 GETNGBL R3 K8 - 0x8C0C0709, // 0008 GETMET R3 R3 K9 - 0x5814000A, // 0009 LDCONST R5 K10 - 0x5C180200, // 000A MOVE R6 R1 - 0x7C0C0600, // 000B CALL R3 3 - 0x5C080600, // 000C MOVE R2 R3 - 0xA8040001, // 000D EXBLK 1 1 - 0x70020016, // 000E JMP #0026 - 0xAC0C0000, // 000F CATCH R3 0 0 - 0x70020013, // 0010 JMP #0025 - 0xA8020007, // 0011 EXBLK 0 #001A - 0xB80E1000, // 0012 GETNGBL R3 K8 - 0x8C0C0709, // 0013 GETMET R3 R3 K9 - 0x5814000B, // 0014 LDCONST R5 K11 - 0x5C180200, // 0015 MOVE R6 R1 - 0x7C0C0600, // 0016 CALL R3 3 - 0x5C080600, // 0017 MOVE R2 R3 - 0xA8040001, // 0018 EXBLK 1 1 - 0x70020009, // 0019 JMP #0024 - 0xAC0C0000, // 001A CATCH R3 0 0 - 0x70020006, // 001B JMP #0023 - 0x600C0001, // 001C GETGBL R3 G1 - 0x5810000C, // 001D LDCONST R4 K12 - 0x5C140200, // 001E MOVE R5 R1 - 0x7C0C0400, // 001F CALL R3 2 - 0x4C0C0000, // 0020 LDNIL R3 - 0x80040600, // 0021 RET 1 R3 - 0x70020000, // 0022 JMP #0024 - 0xB0080000, // 0023 RAISE 2 R0 R0 - 0x70020000, // 0024 JMP #0026 - 0xB0080000, // 0025 RAISE 2 R0 R0 - 0x70020062, // 0026 JMP #008A - 0x600C0004, // 0027 GETGBL R3 G4 - 0x5C100200, // 0028 MOVE R4 R1 - 0x7C0C0200, // 0029 CALL R3 1 - 0x1C0C070D, // 002A EQ R3 R3 K13 - 0x780E005D, // 002B JMPF R3 #008A - 0xA40E1A00, // 002C IMPORT R3 K13 - 0x8C10070E, // 002D GETMET R4 R3 K14 - 0x5C180200, // 002E MOVE R6 R1 - 0x581C000F, // 002F LDCONST R7 K15 - 0x58200010, // 0030 LDCONST R8 K16 - 0x7C100800, // 0031 CALL R4 4 - 0x8C14070E, // 0032 GETMET R5 R3 K14 - 0x5C1C0200, // 0033 MOVE R7 R1 - 0x58200011, // 0034 LDCONST R8 K17 - 0x7C140600, // 0035 CALL R5 3 - 0x5C180200, // 0036 MOVE R6 R1 - 0x581C0012, // 0037 LDCONST R7 K18 - 0x50200000, // 0038 LDBOOL R8 0 0 - 0x6024000C, // 0039 GETGBL R9 G12 - 0x5C280800, // 003A MOVE R10 R4 - 0x7C240200, // 003B CALL R9 1 - 0x24241310, // 003C GT R9 R9 K16 - 0x78260003, // 003D JMPF R9 #0042 - 0x6024000C, // 003E GETGBL R9 G12 - 0x94280912, // 003F GETIDX R10 R4 K18 - 0x7C240200, // 0040 CALL R9 1 - 0x74260000, // 0041 JMPT R9 #0043 - 0x50240001, // 0042 LDBOOL R9 0 1 - 0x50240200, // 0043 LDBOOL R9 1 0 - 0x6028000C, // 0044 GETGBL R10 G12 - 0x5C2C0A00, // 0045 MOVE R11 R5 - 0x7C280200, // 0046 CALL R10 1 - 0x28281513, // 0047 GE R10 R10 K19 - 0x782A000B, // 0048 JMPF R10 #0055 - 0x60280009, // 0049 GETGBL R10 G9 - 0x542DFFFE, // 004A LDINT R11 -1 - 0x942C0A0B, // 004B GETIDX R11 R5 R11 - 0x7C280200, // 004C CALL R10 1 - 0x5C1C1400, // 004D MOVE R7 R10 - 0x5429FFFD, // 004E LDINT R10 -2 - 0x402A240A, // 004F CONNECT R10 K18 R10 - 0x94280A0A, // 0050 GETIDX R10 R5 R10 - 0x8C281514, // 0051 GETMET R10 R10 K20 - 0x58300011, // 0052 LDCONST R12 K17 - 0x7C280400, // 0053 CALL R10 2 - 0x5C181400, // 0054 MOVE R6 R10 - 0x8C280715, // 0055 GETMET R10 R3 K21 - 0x5C300C00, // 0056 MOVE R12 R6 - 0x58340016, // 0057 LDCONST R13 K22 - 0x50380200, // 0058 LDBOOL R14 1 0 - 0x7C280800, // 0059 CALL R10 4 - 0x782A0006, // 005A JMPF R10 #0062 - 0x8C28070E, // 005B GETMET R10 R3 K14 - 0x5C300C00, // 005C MOVE R12 R6 - 0x5834000F, // 005D LDCONST R13 K15 - 0x7C280600, // 005E CALL R10 3 - 0x542DFFFE, // 005F LDINT R11 -1 - 0x9418140B, // 0060 GETIDX R6 R10 R11 - 0x50200200, // 0061 LDBOOL R8 1 0 - 0x78220007, // 0062 JMPF R8 #006B - 0xB82A1000, // 0063 GETNGBL R10 K8 - 0x8C281517, // 0064 GETMET R10 R10 K23 - 0x5C300C00, // 0065 MOVE R12 R6 - 0x5C340E00, // 0066 MOVE R13 R7 - 0x58380012, // 0067 LDCONST R14 K18 - 0x7C280800, // 0068 CALL R10 4 - 0x5C081400, // 0069 MOVE R2 R10 - 0x7002001E, // 006A JMP #008A - 0x78260005, // 006B JMPF R9 #0072 - 0xB82A1000, // 006C GETNGBL R10 K8 - 0x8C281518, // 006D GETMET R10 R10 K24 - 0x5C300200, // 006E MOVE R12 R1 - 0x7C280400, // 006F CALL R10 2 - 0x5C081400, // 0070 MOVE R2 R10 - 0x70020017, // 0071 JMP #008A - 0x24280F12, // 0072 GT R10 R7 K18 - 0x782A0015, // 0073 JMPF R10 #008A - 0x6028000C, // 0074 GETGBL R10 G12 - 0x5C2C0C00, // 0075 MOVE R11 R6 - 0x7C280200, // 0076 CALL R10 1 - 0x24281512, // 0077 GT R10 R10 K18 - 0x782A0010, // 0078 JMPF R10 #008A - 0xA8020007, // 0079 EXBLK 0 #0082 - 0xB82A1000, // 007A GETNGBL R10 K8 - 0x8C281509, // 007B GETMET R10 R10 K9 - 0x5C300C00, // 007C MOVE R12 R6 - 0x5C340E00, // 007D MOVE R13 R7 - 0x7C280600, // 007E CALL R10 3 - 0x5C081400, // 007F MOVE R2 R10 - 0xA8040001, // 0080 EXBLK 1 1 - 0x70020007, // 0081 JMP #008A - 0xAC280000, // 0082 CATCH R10 0 0 - 0x70020004, // 0083 JMP #0089 - 0x60280001, // 0084 GETGBL R10 G1 - 0x582C000C, // 0085 LDCONST R11 K12 - 0x5C300200, // 0086 MOVE R12 R1 - 0x7C280400, // 0087 CALL R10 2 - 0x70020000, // 0088 JMP #008A - 0xB0080000, // 0089 RAISE 2 R0 R0 - 0x4C0C0000, // 008A LDNIL R3 - 0x200C0403, // 008B NE R3 R2 R3 - 0x780E0001, // 008C JMPF R3 #008F - 0x80040400, // 008D RET 1 R2 - 0x70020003, // 008E JMP #0093 - 0x600C0001, // 008F GETGBL R3 G1 - 0x5810000C, // 0090 LDCONST R4 K12 - 0x5C140200, // 0091 MOVE R5 R1 - 0x7C0C0400, // 0092 CALL R3 2 - 0x80000000, // 0093 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_delete -********************************************************************/ -be_local_closure(class_lvh_root_get_delete, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 0, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ), - }), - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(get_delete), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C040119, // 0000 GETMET R1 R0 K25 - 0x7C040200, // 0001 CALL R1 1 - 0x84040000, // 0002 CLOSURE R1 P0 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_text_rule_formula -********************************************************************/ -be_local_closure(class_lvh_root_set_text_rule_formula, /* name */ - be_nested_proto( - 11, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(set_text_rule_formula), - &be_const_str_solidified, - ( &(const binstruction[29]) { /* code */ - 0x60080008, // 0000 GETGBL R2 G8 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x90023402, // 0003 SETMBR R0 K26 R2 - 0x8808011A, // 0004 GETMBR R2 R0 K26 - 0x000A3602, // 0005 ADD R2 K27 R2 - 0x0008051C, // 0006 ADD R2 R2 K28 - 0xA8020007, // 0007 EXBLK 0 #0010 - 0x600C000D, // 0008 GETGBL R3 G13 - 0x5C100400, // 0009 MOVE R4 R2 - 0x7C0C0200, // 000A CALL R3 1 - 0x5C100600, // 000B MOVE R4 R3 - 0x7C100000, // 000C CALL R4 0 - 0x90023A04, // 000D SETMBR R0 K29 R4 - 0xA8040001, // 000E EXBLK 1 1 - 0x7002000B, // 000F JMP #001C - 0xAC0C0002, // 0010 CATCH R3 0 2 - 0x70020008, // 0011 JMP #001B - 0x60140001, // 0012 GETGBL R5 G1 - 0x60180018, // 0013 GETGBL R6 G24 - 0x581C001E, // 0014 LDCONST R7 K30 - 0x5C200400, // 0015 MOVE R8 R2 - 0x5C240600, // 0016 MOVE R9 R3 - 0x5C280800, // 0017 MOVE R10 R4 - 0x7C180800, // 0018 CALL R6 4 - 0x7C140200, // 0019 CALL R5 1 - 0x70020000, // 001A JMP #001C - 0xB0080000, // 001B RAISE 2 R0 R0 - 0x80000000, // 001C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_meta -********************************************************************/ -be_local_closure(class_lvh_root_set_meta, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(set_meta), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x90023E01, // 0000 SETMBR R0 K31 R1 - 0x80000000, // 0001 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_text_rule_format -********************************************************************/ -be_local_closure(class_lvh_root_set_text_rule_format, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(set_text_rule_format), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x60080008, // 0000 GETGBL R2 G8 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x90024002, // 0003 SETMBR R0 K32 R2 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_text_rule -********************************************************************/ -be_local_closure(class_lvh_root_get_text_rule, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(get_text_rule), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040121, // 0000 GETMBR R1 R0 K33 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_text_rule_formula -********************************************************************/ -be_local_closure(class_lvh_root_get_text_rule_formula, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(get_text_rule_formula), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x8804011A, // 0000 GETMBR R1 R0 K26 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_text -********************************************************************/ -be_local_closure(class_lvh_root_set_text, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(set_text), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: set_val_rule ********************************************************************/ @@ -602,14 +123,14 @@ be_local_closure(class_lvh_root_set_val_rule, /* name */ be_str_weak(set_val_rule), &be_const_str_solidified, ( &(const binstruction[14]) { /* code */ - 0x8C080122, // 0000 GETMET R2 R0 K34 + 0x8C080100, // 0000 GETMET R2 R0 K0 0x7C080200, // 0001 CALL R2 1 0x60080008, // 0002 GETGBL R2 G8 0x5C0C0200, // 0003 MOVE R3 R1 0x7C080200, // 0004 CALL R2 1 0x90020202, // 0005 SETMBR R0 K1 R2 - 0xB80A4600, // 0006 GETNGBL R2 K35 - 0x8C080524, // 0007 GETMET R2 R2 K36 + 0xB80A0400, // 0006 GETNGBL R2 K2 + 0x8C080503, // 0007 GETMET R2 R2 K3 0x88100101, // 0008 GETMBR R4 R0 K1 0x84140000, // 0009 CLOSURE R5 P0 0x5C180000, // 000A MOVE R6 R0 @@ -623,12 +144,12 @@ be_local_closure(class_lvh_root_set_val_rule, /* name */ /******************************************************************** -** Solidified function: _delete +** Solidified function: set_val_rule_formula ********************************************************************/ -be_local_closure(class_lvh_root__delete, /* name */ +be_local_closure(class_lvh_root_set_val_rule_formula, /* name */ be_nested_proto( - 4, /* nstack */ - 1, /* argc */ + 11, /* nstack */ + 2, /* argc */ 10, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -636,40 +157,38 @@ be_local_closure(class_lvh_root__delete, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(_delete), + be_str_weak(set_val_rule_formula), &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88040102, // 0000 GETMBR R1 R0 K2 - 0x8C040325, // 0001 GETMET R1 R1 K37 - 0x880C0126, // 0002 GETMBR R3 R0 K38 - 0x7C040400, // 0003 CALL R1 2 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_value_str -********************************************************************/ -be_local_closure(class_lvh_root_get_value_str, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(get_value_str), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040127, // 0000 GETMET R1 R0 K39 - 0x7C040200, // 0001 CALL R1 1 - 0x80040200, // 0002 RET 1 R1 + ( &(const binstruction[29]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x90020802, // 0003 SETMBR R0 K4 R2 + 0x88080104, // 0004 GETMBR R2 R0 K4 + 0x000A0A02, // 0005 ADD R2 K5 R2 + 0x00080506, // 0006 ADD R2 R2 K6 + 0xA8020007, // 0007 EXBLK 0 #0010 + 0x600C000D, // 0008 GETGBL R3 G13 + 0x5C100400, // 0009 MOVE R4 R2 + 0x7C0C0200, // 000A CALL R3 1 + 0x5C100600, // 000B MOVE R4 R3 + 0x7C100000, // 000C CALL R4 0 + 0x90020E04, // 000D SETMBR R0 K7 R4 + 0xA8040001, // 000E EXBLK 1 1 + 0x7002000B, // 000F JMP #001C + 0xAC0C0002, // 0010 CATCH R3 0 2 + 0x70020008, // 0011 JMP #001B + 0x60140001, // 0012 GETGBL R5 G1 + 0x60180018, // 0013 GETGBL R6 G24 + 0x581C0008, // 0014 LDCONST R7 K8 + 0x5C200400, // 0015 MOVE R8 R2 + 0x5C240600, // 0016 MOVE R9 R3 + 0x5C280800, // 0017 MOVE R10 R4 + 0x7C180800, // 0018 CALL R6 4 + 0x7C140200, // 0019 CALL R5 1 + 0x70020000, // 001A JMP #001C + 0xB0080000, // 001B RAISE 2 R0 R0 + 0x80000000, // 001C RET 0 }) ) ); @@ -791,44 +310,44 @@ be_local_closure(class_lvh_root_parse_color, /* name */ be_str_weak(parse_color), &be_const_str_solidified, ( &(const binstruction[40]) { /* code */ - 0x58040028, // 0000 LDCONST R1 K40 + 0x58040009, // 0000 LDCONST R1 K9 0x84080000, // 0001 CLOSURE R2 P0 0x600C0008, // 0002 GETGBL R3 G8 0x5C100000, // 0003 MOVE R4 R0 0x7C0C0200, // 0004 CALL R3 1 0x5C000600, // 0005 MOVE R0 R3 - 0x940C0112, // 0006 GETIDX R3 R0 K18 - 0x1C0C0729, // 0007 EQ R3 R3 K41 + 0x940C010A, // 0006 GETIDX R3 R0 K10 + 0x1C0C070B, // 0007 EQ R3 R3 K11 0x780E0007, // 0008 JMPF R3 #0011 - 0xB80E1000, // 0009 GETNGBL R3 K8 - 0x8C0C072A, // 000A GETMET R3 R3 K42 + 0xB80E1800, // 0009 GETNGBL R3 K12 + 0x8C0C070D, // 000A GETMET R3 R3 K13 0x5C140400, // 000B MOVE R5 R2 0x5C180000, // 000C MOVE R6 R0 0x7C140200, // 000D CALL R5 1 0x7C0C0400, // 000E CALL R3 2 0x80040600, // 000F RET 1 R3 0x70020011, // 0010 JMP #0023 - 0xA40E1A00, // 0011 IMPORT R3 K13 - 0xA4125600, // 0012 IMPORT R4 K43 - 0x8C14072D, // 0013 GETMET R5 R3 K45 + 0xA40E1C00, // 0011 IMPORT R3 K14 + 0xA4121E00, // 0012 IMPORT R4 K15 + 0x8C140711, // 0013 GETMET R5 R3 K17 0x5C1C0000, // 0014 MOVE R7 R0 0x7C140400, // 0015 CALL R5 2 - 0x00165805, // 0016 ADD R5 K44 R5 - 0x8C18092E, // 0017 GETMET R6 R4 K46 - 0xB8221000, // 0018 GETNGBL R8 K8 + 0x00162005, // 0016 ADD R5 K16 R5 + 0x8C180912, // 0017 GETMET R6 R4 K18 + 0xB8221800, // 0018 GETNGBL R8 K12 0x5C240A00, // 0019 MOVE R9 R5 0x7C180600, // 001A CALL R6 3 0x4C1C0000, // 001B LDNIL R7 0x201C0C07, // 001C NE R7 R6 R7 0x781E0004, // 001D JMPF R7 #0023 - 0xB81E1000, // 001E GETNGBL R7 K8 - 0x8C1C0F2A, // 001F GETMET R7 R7 K42 + 0xB81E1800, // 001E GETNGBL R7 K12 + 0x8C1C0F0D, // 001F GETMET R7 R7 K13 0x5C240C00, // 0020 MOVE R9 R6 0x7C1C0400, // 0021 CALL R7 2 0x80040E00, // 0022 RET 1 R7 - 0xB80E1000, // 0023 GETNGBL R3 K8 - 0x8C0C072A, // 0024 GETMET R3 R3 K42 - 0x58140012, // 0025 LDCONST R5 K18 + 0xB80E1800, // 0023 GETNGBL R3 K12 + 0x8C0C070D, // 0024 GETMET R3 R3 K13 + 0x5814000A, // 0025 LDCONST R5 K10 0x7C0C0400, // 0026 CALL R3 2 0x80040600, // 0027 RET 1 R3 }) @@ -838,61 +357,9 @@ be_local_closure(class_lvh_root_parse_color, /* name */ /******************************************************************** -** Solidified function: set_val_rule_formula +** Solidified function: _delete ********************************************************************/ -be_local_closure(class_lvh_root_set_val_rule_formula, /* name */ - be_nested_proto( - 11, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(set_val_rule_formula), - &be_const_str_solidified, - ( &(const binstruction[29]) { /* code */ - 0x60080008, // 0000 GETGBL R2 G8 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x90020002, // 0003 SETMBR R0 K0 R2 - 0x88080100, // 0004 GETMBR R2 R0 K0 - 0x000A3602, // 0005 ADD R2 K27 R2 - 0x0008051C, // 0006 ADD R2 R2 K28 - 0xA8020007, // 0007 EXBLK 0 #0010 - 0x600C000D, // 0008 GETGBL R3 G13 - 0x5C100400, // 0009 MOVE R4 R2 - 0x7C0C0200, // 000A CALL R3 1 - 0x5C100600, // 000B MOVE R4 R3 - 0x7C100000, // 000C CALL R4 0 - 0x90025E04, // 000D SETMBR R0 K47 R4 - 0xA8040001, // 000E EXBLK 1 1 - 0x7002000B, // 000F JMP #001C - 0xAC0C0002, // 0010 CATCH R3 0 2 - 0x70020008, // 0011 JMP #001B - 0x60140001, // 0012 GETGBL R5 G1 - 0x60180018, // 0013 GETGBL R6 G24 - 0x581C001E, // 0014 LDCONST R7 K30 - 0x5C200400, // 0015 MOVE R8 R2 - 0x5C240600, // 0016 MOVE R9 R3 - 0x5C280800, // 0017 MOVE R10 R4 - 0x7C180800, // 0018 CALL R6 4 - 0x7C140200, // 0019 CALL R5 1 - 0x70020000, // 001A JMP #001C - 0xB0080000, // 001B RAISE 2 R0 R0 - 0x80000000, // 001C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: post_config -********************************************************************/ -be_local_closure(class_lvh_root_post_config, /* name */ +be_local_closure(class_lvh_root__delete, /* name */ be_nested_proto( 4, /* nstack */ 1, /* argc */ @@ -903,17 +370,14 @@ be_local_closure(class_lvh_root_post_config, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(post_config), + be_str_weak(_delete), &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040130, // 0000 GETMBR R1 R0 K48 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060002, // 0003 JMPF R1 #0007 - 0x8C040131, // 0004 GETMET R1 R0 K49 - 0x880C0130, // 0005 GETMBR R3 R0 K48 - 0x7C040400, // 0006 CALL R1 2 - 0x80000000, // 0007 RET 0 + ( &(const binstruction[ 5]) { /* code */ + 0x88040113, // 0000 GETMBR R1 R0 K19 + 0x8C040314, // 0001 GETMET R1 R1 K20 + 0x880C0115, // 0002 GETMBR R3 R0 K21 + 0x7C040400, // 0003 CALL R1 2 + 0x80000000, // 0004 RET 0 }) ) ); @@ -921,46 +385,303 @@ be_local_closure(class_lvh_root_post_config, /* name */ /******************************************************************** -** Solidified function: remove_trailing_zeroes +** Solidified function: parse_font ********************************************************************/ -be_local_closure(class_lvh_root_remove_trailing_zeroes, /* name */ +be_local_closure(class_lvh_root_parse_font, /* name */ be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 12, /* varg */ + 15, /* nstack */ + 2, /* argc */ + 10, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(remove_trailing_zeroes), + be_str_weak(parse_font), &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x58040028, // 0000 LDCONST R1 K40 - 0x6008000C, // 0001 GETGBL R2 G12 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C080200, // 0003 CALL R2 1 - 0x580C0012, // 0004 LDCONST R3 K18 - 0x14100602, // 0005 LT R4 R3 R2 - 0x78120007, // 0006 JMPF R4 #000F - 0x5411FFFE, // 0007 LDINT R4 -1 - 0x04100803, // 0008 SUB R4 R4 R3 - 0x94100004, // 0009 GETIDX R4 R0 R4 - 0x20100912, // 000A NE R4 R4 K18 - 0x78120000, // 000B JMPF R4 #000D - 0x70020001, // 000C JMP #000F - 0x000C0710, // 000D ADD R3 R3 K16 - 0x7001FFF5, // 000E JMP #0005 - 0x24100712, // 000F GT R4 R3 K18 - 0x78120005, // 0010 JMPF R4 #0017 - 0x8C100132, // 0011 GETMET R4 R0 K50 - 0x6018000C, // 0012 GETGBL R6 G12 - 0x5C1C0000, // 0013 MOVE R7 R0 - 0x7C180200, // 0014 CALL R6 1 - 0x04180C03, // 0015 SUB R6 R6 R3 - 0x7C100400, // 0016 CALL R4 2 - 0x80040000, // 0017 RET 1 R0 + ( &(const binstruction[172]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x600C0004, // 0001 GETGBL R3 G4 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x1C0C0716, // 0004 EQ R3 R3 K22 + 0x780E0038, // 0005 JMPF R3 #003F + 0xA8020007, // 0006 EXBLK 0 #000F + 0xB80E1800, // 0007 GETNGBL R3 K12 + 0x8C0C0717, // 0008 GETMET R3 R3 K23 + 0x58140018, // 0009 LDCONST R5 K24 + 0x5C180200, // 000A MOVE R6 R1 + 0x7C0C0600, // 000B CALL R3 3 + 0x5C080600, // 000C MOVE R2 R3 + 0xA8040001, // 000D EXBLK 1 1 + 0x7002002E, // 000E JMP #003E + 0xAC0C0000, // 000F CATCH R3 0 0 + 0x7002002B, // 0010 JMP #003D + 0xA40E3200, // 0011 IMPORT R3 K25 + 0xA802001E, // 0012 EXBLK 0 #0032 + 0x5810001A, // 0013 LDCONST R4 K26 + 0x8C14071B, // 0014 GETMET R5 R3 K27 + 0x5C1C0800, // 0015 MOVE R7 R4 + 0x7C140400, // 0016 CALL R5 2 + 0x74160005, // 0017 JMPT R5 #001E + 0x5810001C, // 0018 LDCONST R4 K28 + 0x8C14071B, // 0019 GETMET R5 R3 K27 + 0x5C1C0800, // 001A MOVE R7 R4 + 0x7C140400, // 001B CALL R5 2 + 0x74160000, // 001C JMPT R5 #001E + 0x4C100000, // 001D LDNIL R4 + 0x4C140000, // 001E LDNIL R5 + 0x20140805, // 001F NE R5 R4 R5 + 0x78160007, // 0020 JMPF R5 #0029 + 0xB8161800, // 0021 GETNGBL R5 K12 + 0x8C140B1D, // 0022 GETMET R5 R5 K29 + 0x5C1C0800, // 0023 MOVE R7 R4 + 0x5C200200, // 0024 MOVE R8 R1 + 0x5824000A, // 0025 LDCONST R9 K10 + 0x7C140800, // 0026 CALL R5 4 + 0x5C080A00, // 0027 MOVE R2 R5 + 0x70020006, // 0028 JMP #0030 + 0x60140001, // 0029 GETGBL R5 G1 + 0x5818001E, // 002A LDCONST R6 K30 + 0x5C1C0200, // 002B MOVE R7 R1 + 0x7C140400, // 002C CALL R5 2 + 0x4C140000, // 002D LDNIL R5 + 0xA8040001, // 002E EXBLK 1 1 + 0x80040A00, // 002F RET 1 R5 + 0xA8040001, // 0030 EXBLK 1 1 + 0x70020009, // 0031 JMP #003C + 0xAC100000, // 0032 CATCH R4 0 0 + 0x70020006, // 0033 JMP #003B + 0x60100001, // 0034 GETGBL R4 G1 + 0x5814001F, // 0035 LDCONST R5 K31 + 0x5C180200, // 0036 MOVE R6 R1 + 0x7C100400, // 0037 CALL R4 2 + 0x4C100000, // 0038 LDNIL R4 + 0x80040800, // 0039 RET 1 R4 + 0x70020000, // 003A JMP #003C + 0xB0080000, // 003B RAISE 2 R0 R0 + 0x70020000, // 003C JMP #003E + 0xB0080000, // 003D RAISE 2 R0 R0 + 0x70020062, // 003E JMP #00A2 + 0x600C0004, // 003F GETGBL R3 G4 + 0x5C100200, // 0040 MOVE R4 R1 + 0x7C0C0200, // 0041 CALL R3 1 + 0x1C0C070E, // 0042 EQ R3 R3 K14 + 0x780E005D, // 0043 JMPF R3 #00A2 + 0xA40E1C00, // 0044 IMPORT R3 K14 + 0x8C100720, // 0045 GETMET R4 R3 K32 + 0x5C180200, // 0046 MOVE R6 R1 + 0x581C0021, // 0047 LDCONST R7 K33 + 0x58200022, // 0048 LDCONST R8 K34 + 0x7C100800, // 0049 CALL R4 4 + 0x8C140720, // 004A GETMET R5 R3 K32 + 0x5C1C0200, // 004B MOVE R7 R1 + 0x58200023, // 004C LDCONST R8 K35 + 0x7C140600, // 004D CALL R5 3 + 0x5C180200, // 004E MOVE R6 R1 + 0x581C000A, // 004F LDCONST R7 K10 + 0x50200000, // 0050 LDBOOL R8 0 0 + 0x6024000C, // 0051 GETGBL R9 G12 + 0x5C280800, // 0052 MOVE R10 R4 + 0x7C240200, // 0053 CALL R9 1 + 0x24241322, // 0054 GT R9 R9 K34 + 0x78260003, // 0055 JMPF R9 #005A + 0x6024000C, // 0056 GETGBL R9 G12 + 0x9428090A, // 0057 GETIDX R10 R4 K10 + 0x7C240200, // 0058 CALL R9 1 + 0x74260000, // 0059 JMPT R9 #005B + 0x50240001, // 005A LDBOOL R9 0 1 + 0x50240200, // 005B LDBOOL R9 1 0 + 0x6028000C, // 005C GETGBL R10 G12 + 0x5C2C0A00, // 005D MOVE R11 R5 + 0x7C280200, // 005E CALL R10 1 + 0x28281524, // 005F GE R10 R10 K36 + 0x782A000B, // 0060 JMPF R10 #006D + 0x60280009, // 0061 GETGBL R10 G9 + 0x542DFFFE, // 0062 LDINT R11 -1 + 0x942C0A0B, // 0063 GETIDX R11 R5 R11 + 0x7C280200, // 0064 CALL R10 1 + 0x5C1C1400, // 0065 MOVE R7 R10 + 0x5429FFFD, // 0066 LDINT R10 -2 + 0x402A140A, // 0067 CONNECT R10 K10 R10 + 0x94280A0A, // 0068 GETIDX R10 R5 R10 + 0x8C281525, // 0069 GETMET R10 R10 K37 + 0x58300023, // 006A LDCONST R12 K35 + 0x7C280400, // 006B CALL R10 2 + 0x5C181400, // 006C MOVE R6 R10 + 0x8C280726, // 006D GETMET R10 R3 K38 + 0x5C300C00, // 006E MOVE R12 R6 + 0x58340027, // 006F LDCONST R13 K39 + 0x50380200, // 0070 LDBOOL R14 1 0 + 0x7C280800, // 0071 CALL R10 4 + 0x782A0006, // 0072 JMPF R10 #007A + 0x8C280720, // 0073 GETMET R10 R3 K32 + 0x5C300C00, // 0074 MOVE R12 R6 + 0x58340021, // 0075 LDCONST R13 K33 + 0x7C280600, // 0076 CALL R10 3 + 0x542DFFFE, // 0077 LDINT R11 -1 + 0x9418140B, // 0078 GETIDX R6 R10 R11 + 0x50200200, // 0079 LDBOOL R8 1 0 + 0x78220007, // 007A JMPF R8 #0083 + 0xB82A1800, // 007B GETNGBL R10 K12 + 0x8C28151D, // 007C GETMET R10 R10 K29 + 0x5C300C00, // 007D MOVE R12 R6 + 0x5C340E00, // 007E MOVE R13 R7 + 0x5838000A, // 007F LDCONST R14 K10 + 0x7C280800, // 0080 CALL R10 4 + 0x5C081400, // 0081 MOVE R2 R10 + 0x7002001E, // 0082 JMP #00A2 + 0x78260005, // 0083 JMPF R9 #008A + 0xB82A1800, // 0084 GETNGBL R10 K12 + 0x8C281528, // 0085 GETMET R10 R10 K40 + 0x5C300200, // 0086 MOVE R12 R1 + 0x7C280400, // 0087 CALL R10 2 + 0x5C081400, // 0088 MOVE R2 R10 + 0x70020017, // 0089 JMP #00A2 + 0x24280F0A, // 008A GT R10 R7 K10 + 0x782A0015, // 008B JMPF R10 #00A2 + 0x6028000C, // 008C GETGBL R10 G12 + 0x5C2C0C00, // 008D MOVE R11 R6 + 0x7C280200, // 008E CALL R10 1 + 0x2428150A, // 008F GT R10 R10 K10 + 0x782A0010, // 0090 JMPF R10 #00A2 + 0xA8020007, // 0091 EXBLK 0 #009A + 0xB82A1800, // 0092 GETNGBL R10 K12 + 0x8C281517, // 0093 GETMET R10 R10 K23 + 0x5C300C00, // 0094 MOVE R12 R6 + 0x5C340E00, // 0095 MOVE R13 R7 + 0x7C280600, // 0096 CALL R10 3 + 0x5C081400, // 0097 MOVE R2 R10 + 0xA8040001, // 0098 EXBLK 1 1 + 0x70020007, // 0099 JMP #00A2 + 0xAC280000, // 009A CATCH R10 0 0 + 0x70020004, // 009B JMP #00A1 + 0x60280001, // 009C GETGBL R10 G1 + 0x582C001F, // 009D LDCONST R11 K31 + 0x5C300200, // 009E MOVE R12 R1 + 0x7C280400, // 009F CALL R10 2 + 0x70020000, // 00A0 JMP #00A2 + 0xB0080000, // 00A1 RAISE 2 R0 R0 + 0x4C0C0000, // 00A2 LDNIL R3 + 0x200C0403, // 00A3 NE R3 R2 R3 + 0x780E0001, // 00A4 JMPF R3 #00A7 + 0x80040400, // 00A5 RET 1 R2 + 0x70020003, // 00A6 JMP #00AB + 0x600C0001, // 00A7 GETGBL R3 G1 + 0x5810001F, // 00A8 LDCONST R4 K31 + 0x5C140200, // 00A9 MOVE R5 R1 + 0x7C0C0400, // 00AA CALL R3 2 + 0x80000000, // 00AB RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_val_rule +********************************************************************/ +be_local_closure(class_lvh_root_get_val_rule, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(get_val_rule), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text_rule_formula +********************************************************************/ +be_local_closure(class_lvh_root_get_text_rule_formula, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(get_text_rule_formula), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040129, // 0000 GETMBR R1 R0 K41 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: val_rule_matched +********************************************************************/ +be_local_closure(class_lvh_root_val_rule_matched, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(val_rule_matched), + &be_const_str_solidified, + ( &(const binstruction[36]) { /* code */ + 0x6008000A, // 0000 GETGBL R2 G10 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0403, // 0004 EQ R3 R2 R3 + 0x780E0001, // 0005 JMPF R3 #0008 + 0x500C0000, // 0006 LDBOOL R3 0 0 + 0x80040600, // 0007 RET 1 R3 + 0x880C0107, // 0008 GETMBR R3 R0 K7 + 0x4C100000, // 0009 LDNIL R4 + 0x20100604, // 000A NE R4 R3 R4 + 0x78120011, // 000B JMPF R4 #001E + 0xA8020005, // 000C EXBLK 0 #0013 + 0x5C100600, // 000D MOVE R4 R3 + 0x5C140400, // 000E MOVE R5 R2 + 0x7C100200, // 000F CALL R4 1 + 0x5C080800, // 0010 MOVE R2 R4 + 0xA8040001, // 0011 EXBLK 1 1 + 0x7002000A, // 0012 JMP #001E + 0xAC100002, // 0013 CATCH R4 0 2 + 0x70020007, // 0014 JMP #001D + 0x60180001, // 0015 GETGBL R6 G1 + 0x601C0018, // 0016 GETGBL R7 G24 + 0x5820002A, // 0017 LDCONST R8 K42 + 0x5C240800, // 0018 MOVE R9 R4 + 0x5C280A00, // 0019 MOVE R10 R5 + 0x7C1C0600, // 001A CALL R7 3 + 0x7C180200, // 001B CALL R6 1 + 0x70020000, // 001C JMP #001E + 0xB0080000, // 001D RAISE 2 R0 R0 + 0x60100009, // 001E GETGBL R4 G9 + 0x5C140400, // 001F MOVE R5 R2 + 0x7C100200, // 0020 CALL R4 1 + 0x90025604, // 0021 SETMBR R0 K43 R4 + 0x50100000, // 0022 LDBOOL R4 0 0 + 0x80040800, // 0023 RET 1 R4 }) ) ); @@ -993,91 +714,46 @@ be_local_closure(class_lvh_root_get_text, /* name */ /******************************************************************** -** Solidified function: get_obj +** Solidified function: remove_trailing_zeroes ********************************************************************/ -be_local_closure(class_lvh_root_get_obj, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(get_obj), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040105, // 0000 GETMBR R1 R0 K5 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: digits_to_style -********************************************************************/ -be_local_closure(class_lvh_root_digits_to_style, /* name */ +be_local_closure(class_lvh_root_remove_trailing_zeroes, /* name */ be_nested_proto( 8, /* nstack */ - 2, /* argc */ - 10, /* varg */ + 1, /* argc */ + 12, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(digits_to_style), + be_str_weak(remove_trailing_zeroes), &be_const_str_solidified, - ( &(const binstruction[44]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x1C080202, // 0001 EQ R2 R1 R2 - 0x780A0000, // 0002 JMPF R2 #0004 - 0x80062400, // 0003 RET 1 K18 - 0x540A0009, // 0004 LDINT R2 10 - 0x0C080202, // 0005 DIV R2 R1 R2 - 0x540E0009, // 0006 LDINT R3 10 - 0x10080403, // 0007 MOD R2 R2 R3 - 0x540E0009, // 0008 LDINT R3 10 - 0x100C0203, // 0009 MOD R3 R1 R3 - 0x58100012, // 000A LDCONST R4 K18 - 0x28140512, // 000B GE R5 R2 K18 - 0x78160008, // 000C JMPF R5 #0016 - 0x6014000C, // 000D GETGBL R5 G12 - 0x88180133, // 000E GETMBR R6 R0 K51 - 0x7C140200, // 000F CALL R5 1 - 0x14140405, // 0010 LT R5 R2 R5 - 0x78160003, // 0011 JMPF R5 #0016 - 0x88140133, // 0012 GETMBR R5 R0 K51 - 0x94140A02, // 0013 GETIDX R5 R5 R2 - 0x30100805, // 0014 OR R4 R4 R5 - 0x70020000, // 0015 JMP #0017 - 0x4C100000, // 0016 LDNIL R4 - 0x28140712, // 0017 GE R5 R3 K18 - 0x78160008, // 0018 JMPF R5 #0022 - 0x6014000C, // 0019 GETGBL R5 G12 - 0x88180134, // 001A GETMBR R6 R0 K52 - 0x7C140200, // 001B CALL R5 1 - 0x14140605, // 001C LT R5 R3 R5 - 0x78160003, // 001D JMPF R5 #0022 - 0x88140134, // 001E GETMBR R5 R0 K52 - 0x94140A03, // 001F GETIDX R5 R5 R3 - 0x30100805, // 0020 OR R4 R4 R5 - 0x70020000, // 0021 JMP #0023 - 0x4C100000, // 0022 LDNIL R4 - 0x4C140000, // 0023 LDNIL R5 - 0x1C140805, // 0024 EQ R5 R4 R5 - 0x78160004, // 0025 JMPF R5 #002B - 0x60140018, // 0026 GETGBL R5 G24 - 0x58180035, // 0027 LDCONST R6 K53 - 0x5C1C0200, // 0028 MOVE R7 R1 - 0x7C140400, // 0029 CALL R5 2 - 0xB0066C05, // 002A RAISE 1 K54 R5 - 0x80040800, // 002B RET 1 R4 + ( &(const binstruction[24]) { /* code */ + 0x58040009, // 0000 LDCONST R1 K9 + 0x6008000C, // 0001 GETGBL R2 G12 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C080200, // 0003 CALL R2 1 + 0x580C000A, // 0004 LDCONST R3 K10 + 0x14100602, // 0005 LT R4 R3 R2 + 0x78120007, // 0006 JMPF R4 #000F + 0x5411FFFE, // 0007 LDINT R4 -1 + 0x04100803, // 0008 SUB R4 R4 R3 + 0x94100004, // 0009 GETIDX R4 R0 R4 + 0x2010090A, // 000A NE R4 R4 K10 + 0x78120000, // 000B JMPF R4 #000D + 0x70020001, // 000C JMP #000F + 0x000C0722, // 000D ADD R3 R3 K34 + 0x7001FFF5, // 000E JMP #0005 + 0x2410070A, // 000F GT R4 R3 K10 + 0x78120005, // 0010 JMPF R4 #0017 + 0x8C10012C, // 0011 GETMET R4 R0 K44 + 0x6018000C, // 0012 GETGBL R6 G12 + 0x5C1C0000, // 0013 MOVE R7 R0 + 0x7C180200, // 0014 CALL R6 1 + 0x04180C03, // 0015 SUB R6 R6 R3 + 0x7C100400, // 0016 CALL R4 2 + 0x80040000, // 0017 RET 1 R0 }) ) ); @@ -1085,9 +761,9 @@ be_local_closure(class_lvh_root_digits_to_style, /* name */ /******************************************************************** -** Solidified function: remove_val_rule +** Solidified function: remove_text_rule ********************************************************************/ -be_local_closure(class_lvh_root_remove_val_rule, /* name */ +be_local_closure(class_lvh_root_remove_text_rule, /* name */ be_nested_proto( 5, /* nstack */ 1, /* argc */ @@ -1098,16 +774,16 @@ be_local_closure(class_lvh_root_remove_val_rule, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(remove_val_rule), + be_str_weak(remove_text_rule), &be_const_str_solidified, ( &(const binstruction[10]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x8804012D, // 0000 GETMBR R1 R0 K45 0x4C080000, // 0001 LDNIL R2 0x20040202, // 0002 NE R1 R1 R2 0x78060004, // 0003 JMPF R1 #0009 - 0xB8064600, // 0004 GETNGBL R1 K35 - 0x8C040337, // 0005 GETMET R1 R1 K55 - 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0xB8060400, // 0004 GETNGBL R1 K2 + 0x8C04032E, // 0005 GETMET R1 R1 K46 + 0x880C012D, // 0006 GETMBR R3 R0 K45 0x5C100000, // 0007 MOVE R4 R0 0x7C040600, // 0008 CALL R1 3 0x80000000, // 0009 RET 0 @@ -1118,11 +794,11 @@ be_local_closure(class_lvh_root_remove_val_rule, /* name */ /******************************************************************** -** Solidified function: val_rule_matched +** Solidified function: set_tag ********************************************************************/ -be_local_closure(class_lvh_root_val_rule_matched, /* name */ +be_local_closure(class_lvh_root_set_tag, /* name */ be_nested_proto( - 11, /* nstack */ + 2, /* nstack */ 2, /* argc */ 10, /* varg */ 0, /* has upvals */ @@ -1131,45 +807,212 @@ be_local_closure(class_lvh_root_val_rule_matched, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(val_rule_matched), + be_str_weak(set_tag), &be_const_str_solidified, - ( &(const binstruction[36]) { /* code */ - 0x6008000A, // 0000 GETGBL R2 G10 + ( &(const binstruction[ 2]) { /* code */ + 0x90025E01, // 0000 SETMBR R0 K47 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text_rule_format +********************************************************************/ +be_local_closure(class_lvh_root_set_text_rule_format, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(set_text_rule_format), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 0x5C0C0200, // 0001 MOVE R3 R1 0x7C080200, // 0002 CALL R2 1 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0403, // 0004 EQ R3 R2 R3 - 0x780E0001, // 0005 JMPF R3 #0008 - 0x500C0000, // 0006 LDBOOL R3 0 0 - 0x80040600, // 0007 RET 1 R3 - 0x880C012F, // 0008 GETMBR R3 R0 K47 - 0x4C100000, // 0009 LDNIL R4 - 0x20100604, // 000A NE R4 R3 R4 - 0x78120011, // 000B JMPF R4 #001E - 0xA8020005, // 000C EXBLK 0 #0013 - 0x5C100600, // 000D MOVE R4 R3 - 0x5C140400, // 000E MOVE R5 R2 - 0x7C100200, // 000F CALL R4 1 - 0x5C080800, // 0010 MOVE R2 R4 - 0xA8040001, // 0011 EXBLK 1 1 - 0x7002000A, // 0012 JMP #001E - 0xAC100002, // 0013 CATCH R4 0 2 - 0x70020007, // 0014 JMP #001D - 0x60180001, // 0015 GETGBL R6 G1 - 0x601C0018, // 0016 GETGBL R7 G24 - 0x58200038, // 0017 LDCONST R8 K56 - 0x5C240800, // 0018 MOVE R9 R4 - 0x5C280A00, // 0019 MOVE R10 R5 - 0x7C1C0600, // 001A CALL R7 3 - 0x7C180200, // 001B CALL R6 1 - 0x70020000, // 001C JMP #001E - 0xB0080000, // 001D RAISE 2 R0 R0 - 0x60100009, // 001E GETGBL R4 G9 - 0x5C140400, // 001F MOVE R5 R2 - 0x7C100200, // 0020 CALL R4 1 - 0x90027204, // 0021 SETMBR R0 K57 R4 - 0x50100000, // 0022 LDBOOL R4 0 0 - 0x80040800, // 0023 RET 1 R4 + 0x90026002, // 0003 SETMBR R0 K48 R2 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text_rule +********************************************************************/ +be_local_closure(class_lvh_root_get_text_rule, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(get_text_rule), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x8804012D, // 0000 GETMBR R1 R0 K45 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_value_str +********************************************************************/ +be_local_closure(class_lvh_root_set_value_str, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(set_value_str), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C080131, // 0000 GETMET R2 R0 K49 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: post_config +********************************************************************/ +be_local_closure(class_lvh_root_post_config, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(post_config), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040132, // 0000 GETMBR R1 R0 K50 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060002, // 0003 JMPF R1 #0007 + 0x8C040133, // 0004 GETMET R1 R0 K51 + 0x880C0132, // 0005 GETMBR R3 R0 K50 + 0x7C040400, // 0006 CALL R1 2 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(class_lvh_root_init, /* name */ + be_nested_proto( + 9, /* nstack */ + 6, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0x90022602, // 0000 SETMBR R0 K19 R2 + 0x90026805, // 0001 SETMBR R0 K52 R5 + 0x4C180000, // 0002 LDNIL R6 + 0x1C180806, // 0003 EQ R6 R4 R6 + 0x781A0007, // 0004 JMPF R6 #000D + 0x88180135, // 0005 GETMBR R6 R0 K53 + 0x781A0005, // 0006 JMPF R6 #000D + 0x88180135, // 0007 GETMBR R6 R0 K53 + 0x5C1C0C00, // 0008 MOVE R7 R6 + 0x5C200200, // 0009 MOVE R8 R1 + 0x7C1C0200, // 000A CALL R7 1 + 0x90026C07, // 000B SETMBR R0 K54 R7 + 0x70020000, // 000C JMP #000E + 0x90026C04, // 000D SETMBR R0 K54 R4 + 0x8C180137, // 000E GETMET R6 R0 K55 + 0x7C180200, // 000F CALL R6 1 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_tag +********************************************************************/ +be_local_closure(class_lvh_root_get_tag, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(get_tag), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x8804012F, // 0000 GETMBR R1 R0 K47 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_meta +********************************************************************/ +be_local_closure(class_lvh_root_set_meta, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(set_meta), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90027001, // 0000 SETMBR R0 K56 R1 + 0x80000000, // 0001 RET 0 }) ) ); @@ -1196,13 +1039,13 @@ be_local_closure(class_lvh_root_text_rule_matched, /* name */ 0x60080004, // 0000 GETGBL R2 G4 0x5C0C0200, // 0001 MOVE R3 R1 0x7C080200, // 0002 CALL R2 1 - 0x1C080507, // 0003 EQ R2 R2 K7 + 0x1C080516, // 0003 EQ R2 R2 K22 0x780A0003, // 0004 JMPF R2 #0009 0x6008000A, // 0005 GETGBL R2 G10 0x5C0C0200, // 0006 MOVE R3 R1 0x7C080200, // 0007 CALL R2 1 0x5C040400, // 0008 MOVE R1 R2 - 0x8808011D, // 0009 GETMBR R2 R0 K29 + 0x88080139, // 0009 GETMBR R2 R0 K57 0x4C0C0000, // 000A LDNIL R3 0x200C0403, // 000B NE R3 R2 R3 0x780E0011, // 000C JMPF R3 #001F @@ -1224,11 +1067,11 @@ be_local_closure(class_lvh_root_text_rule_matched, /* name */ 0x7C140200, // 001C CALL R5 1 0x70020000, // 001D JMP #001F 0xB0080000, // 001E RAISE 2 R0 R0 - 0x880C0120, // 001F GETMBR R3 R0 K32 + 0x880C0130, // 001F GETMBR R3 R0 K48 0x60100004, // 0020 GETGBL R4 G4 0x5C140600, // 0021 MOVE R5 R3 0x7C100200, // 0022 CALL R4 1 - 0x1C10090D, // 0023 EQ R4 R4 K13 + 0x1C10090E, // 0023 EQ R4 R4 K14 0x78120005, // 0024 JMPF R4 #002B 0x60100018, // 0025 GETGBL R4 G24 0x5C140600, // 0026 MOVE R5 R3 @@ -1246,37 +1089,6 @@ be_local_closure(class_lvh_root_text_rule_matched, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: is_color_attribute -********************************************************************/ -be_local_closure(class_lvh_root_is_color_attribute, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(is_color_attribute), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0xA40A1A00, // 0000 IMPORT R2 K13 - 0x8C0C0515, // 0001 GETMET R3 R2 K21 - 0x60140008, // 0002 GETGBL R5 G8 - 0x5C180200, // 0003 MOVE R6 R1 - 0x7C140200, // 0004 CALL R5 1 - 0x5818002A, // 0005 LDCONST R6 K42 - 0x7C0C0600, // 0006 CALL R3 3 - 0x80040600, // 0007 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: get_meta ********************************************************************/ @@ -1294,7 +1106,7 @@ be_local_closure(class_lvh_root_get_meta, /* name */ be_str_weak(get_meta), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ - 0x8804011F, // 0000 GETMBR R1 R0 K31 + 0x88040138, // 0000 GETMBR R1 R0 K56 0x80040200, // 0001 RET 1 R1 }) ) @@ -1302,6 +1114,82 @@ be_local_closure(class_lvh_root_get_meta, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: set_text_rule_formula +********************************************************************/ +be_local_closure(class_lvh_root_set_text_rule_formula, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(set_text_rule_formula), + &be_const_str_solidified, + ( &(const binstruction[29]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x90025202, // 0003 SETMBR R0 K41 R2 + 0x88080129, // 0004 GETMBR R2 R0 K41 + 0x000A0A02, // 0005 ADD R2 K5 R2 + 0x00080506, // 0006 ADD R2 R2 K6 + 0xA8020007, // 0007 EXBLK 0 #0010 + 0x600C000D, // 0008 GETGBL R3 G13 + 0x5C100400, // 0009 MOVE R4 R2 + 0x7C0C0200, // 000A CALL R3 1 + 0x5C100600, // 000B MOVE R4 R3 + 0x7C100000, // 000C CALL R4 0 + 0x90027204, // 000D SETMBR R0 K57 R4 + 0xA8040001, // 000E EXBLK 1 1 + 0x7002000B, // 000F JMP #001C + 0xAC0C0002, // 0010 CATCH R3 0 2 + 0x70020008, // 0011 JMP #001B + 0x60140001, // 0012 GETGBL R5 G1 + 0x60180018, // 0013 GETGBL R6 G24 + 0x581C0008, // 0014 LDCONST R7 K8 + 0x5C200400, // 0015 MOVE R8 R2 + 0x5C240600, // 0016 MOVE R9 R3 + 0x5C280800, // 0017 MOVE R10 R4 + 0x7C180800, // 0018 CALL R6 4 + 0x7C140200, // 0019 CALL R5 1 + 0x70020000, // 001A JMP #001C + 0xB0080000, // 001B RAISE 2 R0 R0 + 0x80000000, // 001C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text +********************************************************************/ +be_local_closure(class_lvh_root_set_text, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(set_text), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: set_text_rule ********************************************************************/ @@ -1349,10 +1237,10 @@ be_local_closure(class_lvh_root_set_text_rule, /* name */ 0x60080008, // 0002 GETGBL R2 G8 0x5C0C0200, // 0003 MOVE R3 R1 0x7C080200, // 0004 CALL R2 1 - 0x90024202, // 0005 SETMBR R0 K33 R2 - 0xB80A4600, // 0006 GETNGBL R2 K35 - 0x8C080524, // 0007 GETMET R2 R2 K36 - 0x88100121, // 0008 GETMBR R4 R0 K33 + 0x90025A02, // 0005 SETMBR R0 K45 R2 + 0xB80A0400, // 0006 GETNGBL R2 K2 + 0x8C080503, // 0007 GETMET R2 R2 K3 + 0x8810012D, // 0008 GETMBR R4 R0 K45 0x84140000, // 0009 CLOSURE R5 P0 0x5C180000, // 000A MOVE R6 R0 0x7C080800, // 000B CALL R2 4 @@ -1365,9 +1253,9 @@ be_local_closure(class_lvh_root_set_text_rule, /* name */ /******************************************************************** -** Solidified function: remove_text_rule +** Solidified function: remove_val_rule ********************************************************************/ -be_local_closure(class_lvh_root_remove_text_rule, /* name */ +be_local_closure(class_lvh_root_remove_val_rule, /* name */ be_nested_proto( 5, /* nstack */ 1, /* argc */ @@ -1378,16 +1266,16 @@ be_local_closure(class_lvh_root_remove_text_rule, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(remove_text_rule), + be_str_weak(remove_val_rule), &be_const_str_solidified, ( &(const binstruction[10]) { /* code */ - 0x88040121, // 0000 GETMBR R1 R0 K33 + 0x88040101, // 0000 GETMBR R1 R0 K1 0x4C080000, // 0001 LDNIL R2 0x20040202, // 0002 NE R1 R1 R2 0x78060004, // 0003 JMPF R1 #0009 - 0xB8064600, // 0004 GETNGBL R1 K35 - 0x8C040337, // 0005 GETMET R1 R1 K55 - 0x880C0121, // 0006 GETMBR R3 R0 K33 + 0xB8060400, // 0004 GETNGBL R1 K2 + 0x8C04032E, // 0005 GETMET R1 R1 K46 + 0x880C0101, // 0006 GETMBR R3 R0 K1 0x5C100000, // 0007 MOVE R4 R0 0x7C040600, // 0008 CALL R1 3 0x80000000, // 0009 RET 0 @@ -1397,58 +1285,6 @@ be_local_closure(class_lvh_root_remove_text_rule, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: set_delete -********************************************************************/ -be_local_closure(class_lvh_root_set_delete, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(set_delete), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0xB0067D3F, // 0000 RAISE 1 K62 K63 - 0x80000000, // 0001 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_value_str -********************************************************************/ -be_local_closure(class_lvh_root_set_value_str, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_root, /* shared constants */ - be_str_weak(set_value_str), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C080140, // 0000 GETMET R2 R0 K64 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: get_text_rule_format ********************************************************************/ @@ -1466,7 +1302,7 @@ be_local_closure(class_lvh_root_get_text_rule_format, /* name */ be_str_weak(get_text_rule_format), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ - 0x88040120, // 0000 GETMBR R1 R0 K32 + 0x88040130, // 0000 GETMBR R1 R0 K48 0x80040200, // 0001 RET 1 R1 }) ) @@ -1474,16 +1310,278 @@ be_local_closure(class_lvh_root_get_text_rule_format, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: get_obj +********************************************************************/ +be_local_closure(class_lvh_root_get_obj, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(get_obj), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040136, // 0000 GETMBR R1 R0 K54 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_color_attribute +********************************************************************/ +be_local_closure(class_lvh_root_is_color_attribute, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(is_color_attribute), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0xA40A1C00, // 0000 IMPORT R2 K14 + 0x8C0C0526, // 0001 GETMET R3 R2 K38 + 0x60140008, // 0002 GETGBL R5 G8 + 0x5C180200, // 0003 MOVE R6 R1 + 0x7C140200, // 0004 CALL R5 1 + 0x5818000D, // 0005 LDCONST R6 K13 + 0x7C0C0600, // 0006 CALL R3 3 + 0x80040600, // 0007 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: digits_to_style +********************************************************************/ +be_local_closure(class_lvh_root_digits_to_style, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(digits_to_style), + &be_const_str_solidified, + ( &(const binstruction[44]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0000, // 0002 JMPF R2 #0004 + 0x80061400, // 0003 RET 1 K10 + 0x540A0009, // 0004 LDINT R2 10 + 0x0C080202, // 0005 DIV R2 R1 R2 + 0x540E0009, // 0006 LDINT R3 10 + 0x10080403, // 0007 MOD R2 R2 R3 + 0x540E0009, // 0008 LDINT R3 10 + 0x100C0203, // 0009 MOD R3 R1 R3 + 0x5810000A, // 000A LDCONST R4 K10 + 0x2814050A, // 000B GE R5 R2 K10 + 0x78160008, // 000C JMPF R5 #0016 + 0x6014000C, // 000D GETGBL R5 G12 + 0x8818013E, // 000E GETMBR R6 R0 K62 + 0x7C140200, // 000F CALL R5 1 + 0x14140405, // 0010 LT R5 R2 R5 + 0x78160003, // 0011 JMPF R5 #0016 + 0x8814013E, // 0012 GETMBR R5 R0 K62 + 0x94140A02, // 0013 GETIDX R5 R5 R2 + 0x30100805, // 0014 OR R4 R4 R5 + 0x70020000, // 0015 JMP #0017 + 0x4C100000, // 0016 LDNIL R4 + 0x2814070A, // 0017 GE R5 R3 K10 + 0x78160008, // 0018 JMPF R5 #0022 + 0x6014000C, // 0019 GETGBL R5 G12 + 0x8818013F, // 001A GETMBR R6 R0 K63 + 0x7C140200, // 001B CALL R5 1 + 0x14140605, // 001C LT R5 R3 R5 + 0x78160003, // 001D JMPF R5 #0022 + 0x8814013F, // 001E GETMBR R5 R0 K63 + 0x94140A03, // 001F GETIDX R5 R5 R3 + 0x30100805, // 0020 OR R4 R4 R5 + 0x70020000, // 0021 JMP #0023 + 0x4C100000, // 0022 LDNIL R4 + 0x4C140000, // 0023 LDNIL R5 + 0x1C140805, // 0024 EQ R5 R4 R5 + 0x78160004, // 0025 JMPF R5 #002B + 0x60140018, // 0026 GETGBL R5 G24 + 0x58180040, // 0027 LDCONST R6 K64 + 0x5C1C0200, // 0028 MOVE R7 R1 + 0x7C140400, // 0029 CALL R5 2 + 0xB0068205, // 002A RAISE 1 K65 R5 + 0x80040800, // 002B RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_value_str +********************************************************************/ +be_local_closure(class_lvh_root_get_value_str, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(get_value_str), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040142, // 0000 GETMET R1 R0 K66 + 0x7C040200, // 0001 CALL R1 1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_val_rule_formula +********************************************************************/ +be_local_closure(class_lvh_root_get_val_rule_formula, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(get_val_rule_formula), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040104, // 0000 GETMBR R1 R0 K4 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_delete +********************************************************************/ +be_local_closure(class_lvh_root_get_delete, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 0, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ), + }), + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(get_delete), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C040143, // 0000 GETMET R1 R0 K67 + 0x7C040200, // 0001 CALL R1 1 + 0x84040000, // 0002 CLOSURE R1 P0 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_delete +********************************************************************/ +be_local_closure(class_lvh_root_set_delete, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_root, /* shared constants */ + be_str_weak(set_delete), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0xB0068945, // 0000 RAISE 1 K68 K69 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: lvh_root ********************************************************************/ be_local_class(lvh_root, - 13, + 14, NULL, - be_nested_map(50, + be_nested_map(53, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(_text_rule, -1), be_const_var(9) }, - { be_const_key_weak(_meta, -1), be_const_var(4) }, + { be_const_key_weak(_tag, -1), be_const_var(5) }, + { be_const_key_weak(_text_rule_formula, 33), be_const_var(11) }, + { be_const_key_weak(set_val_rule_formula, -1), be_const_closure(class_lvh_root_set_val_rule_formula_closure) }, + { be_const_key_weak(set_val_rule, 0), be_const_closure(class_lvh_root_set_val_rule_closure) }, + { be_const_key_weak(parse_color, -1), be_const_static_closure(class_lvh_root_parse_color_closure) }, + { be_const_key_weak(_delete, -1), be_const_closure(class_lvh_root__delete_closure) }, + { be_const_key_weak(_lv_class, -1), be_const_nil() }, + { be_const_key_weak(get_val_rule, -1), be_const_closure(class_lvh_root_get_val_rule_closure) }, + { be_const_key_weak(get_delete, 24), be_const_closure(class_lvh_root_get_delete_closure) }, + { be_const_key_weak(_val_rule_formula, -1), be_const_var(8) }, + { be_const_key_weak(_val_rule_function, 28), be_const_var(9) }, + { be_const_key_weak(get_text_rule_formula, -1), be_const_closure(class_lvh_root_get_text_rule_formula_closure) }, + { be_const_key_weak(val_rule_matched, -1), be_const_closure(class_lvh_root_val_rule_matched_closure) }, + { be_const_key_weak(_text_rule_function, 48), be_const_var(12) }, + { be_const_key_weak(get_text, -1), be_const_closure(class_lvh_root_get_text_closure) }, + { be_const_key_weak(post_config, -1), be_const_closure(class_lvh_root_post_config_closure) }, + { be_const_key_weak(id, -1), be_const_var(0) }, + { be_const_key_weak(remove_trailing_zeroes, 27), be_const_static_closure(class_lvh_root_remove_trailing_zeroes_closure) }, + { be_const_key_weak(_val_rule, 37), be_const_var(7) }, + { be_const_key_weak(set_text_rule_format, -1), be_const_closure(class_lvh_root_set_text_rule_format_closure) }, + { be_const_key_weak(get_text_rule, -1), be_const_closure(class_lvh_root_get_text_rule_closure) }, { be_const_key_weak(_attr_ignore, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(9, ( (struct bvalue*) &(const bvalue[]) { @@ -1497,21 +1595,25 @@ be_local_class(lvh_root, be_nested_str_weak(back), be_nested_str_weak(berry_run), })) ) } )) }, - { be_const_key_weak(get_val_rule_formula, 31), be_const_closure(class_lvh_root_get_val_rule_formula_closure) }, - { be_const_key_weak(get_val_rule, 45), be_const_closure(class_lvh_root_get_val_rule_closure) }, - { be_const_key_weak(init, 47), be_const_closure(class_lvh_root_init_closure) }, - { be_const_key_weak(parse_font, 40), be_const_closure(class_lvh_root_parse_font_closure) }, - { be_const_key_weak(get_delete, 49), be_const_closure(class_lvh_root_get_delete_closure) }, - { be_const_key_weak(_parent_lvh, -1), be_const_var(3) }, - { be_const_key_weak(set_meta, -1), be_const_closure(class_lvh_root_set_meta_closure) }, - { be_const_key_weak(set_text_rule_format, -1), be_const_closure(class_lvh_root_set_text_rule_format_closure) }, - { be_const_key_weak(get_text_rule_format, 32), be_const_closure(class_lvh_root_get_text_rule_format_closure) }, - { be_const_key_weak(set_value_str, 13), be_const_closure(class_lvh_root_set_value_str_closure) }, - { be_const_key_weak(_val_rule_formula, 37), be_const_var(7) }, - { be_const_key_weak(set_val_rule, 30), be_const_closure(class_lvh_root_set_val_rule_closure) }, - { be_const_key_weak(set_delete, 28), be_const_closure(class_lvh_root_set_delete_closure) }, + { be_const_key_weak(set_value_str, -1), be_const_closure(class_lvh_root_set_value_str_closure) }, + { be_const_key_weak(_text_rule_format, -1), be_const_var(13) }, + { be_const_key_weak(get_val_rule_formula, -1), be_const_closure(class_lvh_root_get_val_rule_formula_closure) }, { be_const_key_weak(_lv_obj, -1), be_const_var(1) }, - { be_const_key_weak(get_text_rule_formula, 20), be_const_closure(class_lvh_root_get_text_rule_formula_closure) }, + { be_const_key_weak(digits_to_style, -1), be_const_closure(class_lvh_root_digits_to_style_closure) }, + { be_const_key_weak(remove_text_rule, -1), be_const_closure(class_lvh_root_remove_text_rule_closure) }, + { be_const_key_weak(_digit2state, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(6, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(1), + be_const_int(32), + be_const_int(33), + be_const_int(128), + be_const_int(160), + })) ) } )) }, + { be_const_key_weak(set_tag, 25), be_const_closure(class_lvh_root_set_tag_closure) }, + { be_const_key_weak(_EVENTS, -1), be_const_bytes_instance() }, + { be_const_key_weak(text_rule_matched, -1), be_const_closure(class_lvh_root_text_rule_matched_closure) }, { be_const_key_weak(_attr_map, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(6, ( (struct bmapnode*) &(const bmapnode[]) { @@ -1522,17 +1624,6 @@ be_local_class(lvh_root, { be_const_key_weak(end_angle, -1), be_nested_str_weak(bg_end_angle) }, { be_const_key_weak(end_angle1, 0), be_nested_str_weak(end_angle) }, })) ) } )) }, - { be_const_key_weak(get_value_str, 12), be_const_closure(class_lvh_root_get_value_str_closure) }, - { be_const_key_weak(_lv_class, 46), be_const_nil() }, - { be_const_key_weak(_val_rule_function, -1), be_const_var(8) }, - { be_const_key_weak(parse_color, -1), be_const_static_closure(class_lvh_root_parse_color_closure) }, - { be_const_key_weak(set_val_rule_formula, -1), be_const_closure(class_lvh_root_set_val_rule_formula_closure) }, - { be_const_key_weak(_text_rule_function, -1), be_const_var(11) }, - { be_const_key_weak(set_text_rule, -1), be_const_closure(class_lvh_root_set_text_rule_closure) }, - { be_const_key_weak(_val_rule, -1), be_const_var(6) }, - { be_const_key_weak(_delete, 15), be_const_closure(class_lvh_root__delete_closure) }, - { be_const_key_weak(_val, 43), be_const_var(5) }, - { be_const_key_weak(_text_rule_formula, 41), be_const_var(10) }, { be_const_key_weak(_digit2part, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(10, ( (struct bvalue*) &(const bvalue[]) { @@ -1547,1120 +1638,177 @@ be_local_class(lvh_root, be_const_int(65536), be_const_int(524288), })) ) } )) }, - { be_const_key_weak(get_obj, -1), be_const_closure(class_lvh_root_get_obj_closure) }, - { be_const_key_weak(_digit2state, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(6, - ( (struct bvalue*) &(const bvalue[]) { - be_const_int(0), - be_const_int(1), - be_const_int(32), - be_const_int(33), - be_const_int(128), - be_const_int(160), - })) ) } )) }, - { be_const_key_weak(digits_to_style, 8), be_const_closure(class_lvh_root_digits_to_style_closure) }, - { be_const_key_weak(remove_val_rule, 35), be_const_closure(class_lvh_root_remove_val_rule_closure) }, - { be_const_key_weak(text_rule_matched, -1), be_const_closure(class_lvh_root_text_rule_matched_closure) }, - { be_const_key_weak(_text_rule_format, -1), be_const_var(12) }, - { be_const_key_weak(_EVENTS, -1), be_const_bytes_instance() }, - { be_const_key_weak(is_color_attribute, -1), be_const_closure(class_lvh_root_is_color_attribute_closure) }, - { be_const_key_weak(get_meta, 24), be_const_closure(class_lvh_root_get_meta_closure) }, - { be_const_key_weak(id, 36), be_const_var(0) }, - { be_const_key_weak(get_text, -1), be_const_closure(class_lvh_root_get_text_closure) }, - { be_const_key_weak(val_rule_matched, 25), be_const_closure(class_lvh_root_val_rule_matched_closure) }, - { be_const_key_weak(remove_trailing_zeroes, -1), be_const_static_closure(class_lvh_root_remove_trailing_zeroes_closure) }, - { be_const_key_weak(remove_text_rule, -1), be_const_closure(class_lvh_root_remove_text_rule_closure) }, - { be_const_key_weak(post_config, -1), be_const_closure(class_lvh_root_post_config_closure) }, - { be_const_key_weak(_page, -1), be_const_var(2) }, + { be_const_key_weak(set_text_rule, 47), be_const_closure(class_lvh_root_set_text_rule_closure) }, + { be_const_key_weak(set_meta, 18), be_const_closure(class_lvh_root_set_meta_closure) }, + { be_const_key_weak(_parent_lvh, -1), be_const_var(3) }, + { be_const_key_weak(_val, 32), be_const_var(6) }, { be_const_key_weak(set_text, -1), be_const_closure(class_lvh_root_set_text_closure) }, - { be_const_key_weak(get_text_rule, 11), be_const_closure(class_lvh_root_get_text_rule_closure) }, - { be_const_key_weak(set_text_rule_formula, -1), be_const_closure(class_lvh_root_set_text_rule_formula_closure) }, + { be_const_key_weak(set_text_rule_formula, 36), be_const_closure(class_lvh_root_set_text_rule_formula_closure) }, + { be_const_key_weak(parse_font, 34), be_const_closure(class_lvh_root_parse_font_closure) }, + { be_const_key_weak(remove_val_rule, -1), be_const_closure(class_lvh_root_remove_val_rule_closure) }, + { be_const_key_weak(get_text_rule_format, -1), be_const_closure(class_lvh_root_get_text_rule_format_closure) }, + { be_const_key_weak(get_obj, -1), be_const_closure(class_lvh_root_get_obj_closure) }, + { be_const_key_weak(is_color_attribute, -1), be_const_closure(class_lvh_root_is_color_attribute_closure) }, + { be_const_key_weak(get_tag, 26), be_const_closure(class_lvh_root_get_tag_closure) }, + { be_const_key_weak(get_value_str, -1), be_const_closure(class_lvh_root_get_value_str_closure) }, + { be_const_key_weak(_text_rule, -1), be_const_var(10) }, + { be_const_key_weak(init, 15), be_const_closure(class_lvh_root_init_closure) }, + { be_const_key_weak(_meta, -1), be_const_var(4) }, + { be_const_key_weak(get_meta, 8), be_const_closure(class_lvh_root_get_meta_closure) }, + { be_const_key_weak(_page, 6), be_const_var(2) }, + { be_const_key_weak(set_delete, -1), be_const_closure(class_lvh_root_set_delete_closure) }, })), be_str_weak(lvh_root) ); -// compact class 'lvh_obj' ktab size: 136, total: 283 (saved 1176 bytes) -static const bvalue be_ktab_class_lvh_obj[136] = { - /* K0 */ be_nested_str_weak(_action), - /* K1 */ be_nested_str_weak(_lv_label), - /* K2 */ be_nested_str_weak(get_text), - /* K3 */ be_nested_str_weak(_lv_obj), - /* K4 */ be_nested_str_weak(has_flag), +// compact class 'lvh_obj' ktab size: 142, total: 288 (saved 1168 bytes) +static const bvalue be_ktab_class_lvh_obj[142] = { + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(_lv_obj), + /* K2 */ be_nested_str_weak(set_style_line_width), + /* K3 */ be_nested_str_weak(_lv_part2_selector), + /* K4 */ be_nested_str_weak(get_style_pad_right), /* K5 */ be_nested_str_weak(lv), - /* K6 */ be_nested_str_weak(OBJ_FLAG_FLEX_IN_NEW_TRACK), - /* K7 */ be_nested_str_weak(_lv_part2_selector), - /* K8 */ be_nested_str_weak(set_style_pad_all), - /* K9 */ be_nested_str_weak(STATE_DEFAULT), - /* K10 */ be_nested_str_weak(OBJ_FLAG_HIDDEN), - /* K11 */ be_nested_str_weak(has_state), - /* K12 */ be_nested_str_weak(STATE_DISABLED), - /* K13 */ be_nested_str_weak(set_style_line_width), - /* K14 */ be_nested_str_weak(introspect), - /* K15 */ be_nested_str_weak(contains), - /* K16 */ be_nested_str_weak(set_text), - /* K17 */ be_nested_str_weak(label), - /* K18 */ be_nested_str_weak(get_obj), - /* K19 */ be_nested_str_weak(set_align), - /* K20 */ be_nested_str_weak(ALIGN_CENTER), - /* K21 */ be_nested_str_weak(_page), - /* K22 */ be_nested_str_weak(_hm), - /* K23 */ be_nested_str_weak(_EVENTS), - /* K24 */ be_const_int(0), - /* K25 */ be_nested_str_weak(register_event), - /* K26 */ be_const_int(1), - /* K27 */ be_nested_str_weak(get_style_pad_right), - /* K28 */ be_nested_str_weak(set_style_text_color), - /* K29 */ be_nested_str_weak(parse_color), - /* K30 */ be_nested_str_weak(register_event_cb), - /* K31 */ be_nested_str_weak(remove_val_rule), - /* K32 */ be_nested_str_weak(remove_text_rule), - /* K33 */ be_nested_str_weak(del), - /* K34 */ be_nested_str_weak(_delete), - /* K35 */ be_nested_str_weak(get_text_font), - /* K36 */ be_nested_str_weak(get_style_radius), - /* K37 */ be_nested_str_weak(set_text_color), - /* K38 */ be_nested_str_weak(get_style_text_color), - /* K39 */ be_nested_str_weak(get_x), - /* K40 */ be_nested_str_weak(get_long_mode), - /* K41 */ be_nested_str_weak(_val), - /* K42 */ be_nested_str_weak(set_value), - /* K43 */ be_nested_str_weak(set_enabled), - /* K44 */ be_nested_str_weak(string), - /* K45 */ be_nested_str_weak(startswith), - /* K46 */ be_nested_str_weak(set_), - /* K47 */ be_nested_str_weak(get_), - /* K48 */ be_const_int(3), - /* K49 */ be_nested_str_weak(byte), - /* K50 */ be_const_int(2147483647), - /* K51 */ be_nested_str_weak(digits_to_style), - /* K52 */ be_nested_str_weak(_attr_ignore), - /* K53 */ be_nested_str_weak(find), - /* K54 */ be_nested_str_weak(get), - /* K55 */ be_nested_str_weak(function), - /* K56 */ be_nested_str_weak(_attr_map), - /* K57 */ be_nested_str_weak(get_style_), - /* K58 */ be_nested_str_weak(undefined), - /* K59 */ be_nested_str_weak(set_style_pad_top), - /* K60 */ be_nested_str_weak(clear_state), - /* K61 */ be_nested_str_weak(add_state), - /* K62 */ be_nested_str_weak(check_label), - /* K63 */ be_nested_str_weak(set_x), - /* K64 */ be_nested_str_weak(init), - /* K65 */ be_nested_str_weak(STATE_CHECKED), - /* K66 */ be_nested_str_weak(parse_font), - /* K67 */ be_nested_str_weak(set_style_text_font), - /* K68 */ be_nested_str_weak(get_enabled), - /* K69 */ be_nested_str_weak(set_style_pad_right), - /* K70 */ be_nested_str_weak(), - /* K71 */ be_nested_str_weak(real), - /* K72 */ be_nested_str_weak(math), - /* K73 */ be_nested_str_weak(round), - /* K74 */ be_nested_str_weak(endswith), - /* K75 */ be_nested_str_weak(_X25), - /* K76 */ be_nested_str_weak(pct), - /* K77 */ be_nested_str_weak(is_color_attribute), - /* K78 */ be_nested_str_weak(set_style_), - /* K79 */ be_nested_str_weak(HSP_X3A_X20unknown_X20attribute_X3A), - /* K80 */ be_nested_str_weak(set_text_font), - /* K81 */ be_nested_str_weak(toupper), - /* K82 */ be_nested_str_weak(TRUE), - /* K83 */ be_nested_str_weak(FALSE), - /* K84 */ be_nested_str_weak(OBJ_FLAG_CLICKABLE), - /* K85 */ be_nested_str_weak(get_style_text_align), - /* K86 */ be_nested_str_weak(TEXT_ALIGN_LEFT), - /* K87 */ be_nested_str_weak(left), - /* K88 */ be_nested_str_weak(TEXT_ALIGN_CENTER), - /* K89 */ be_nested_str_weak(center), - /* K90 */ be_nested_str_weak(TEXT_ALIGN_RIGHT), - /* K91 */ be_nested_str_weak(right), - /* K92 */ be_nested_str_weak(get_style_pad_top), - /* K93 */ be_nested_str_weak(set_style_radius), - /* K94 */ be_nested_str_weak(get_code), - /* K95 */ be_nested_str_weak(action), - /* K96 */ be_nested_str_weak(EVENT_CLICKED), - /* K97 */ be_nested_str_weak(tasmota), - /* K98 */ be_nested_str_weak(set_timer), - /* K99 */ be_nested_str_weak(_event_map), - /* K100 */ be_nested_str_weak(json), - /* K101 */ be_nested_str_weak(EVENT_VALUE_CHANGED), - /* K102 */ be_nested_str_weak(module), - /* K103 */ be_nested_str_weak(_X2C_X22val_X22_X3A_X25s), - /* K104 */ be_nested_str_weak(dump), - /* K105 */ be_nested_str_weak(_X2C_X22text_X22_X3A_X25s), - /* K106 */ be_nested_str_weak(_X7B_X22hasp_X22_X3A_X7B_X22p_X25ib_X25i_X22_X3A_X7B_X22event_X22_X3A_X22_X25s_X22_X25s_X7D_X7D_X7D), - /* K107 */ be_nested_str_weak(_page_id), - /* K108 */ be_nested_str_weak(id), - /* K109 */ be_nested_str_weak(get_style_pad_bottom), - /* K110 */ be_nested_str_weak(get_y), - /* K111 */ be_nested_str_weak(set_style_pad_bottom), - /* K112 */ be_nested_str_weak(add_flag), - /* K113 */ be_nested_str_weak(clear_flag), - /* K114 */ be_nested_str_weak(get_style_pad_left), - /* K115 */ be_nested_str_weak(set_y), - /* K116 */ be_nested_str_weak(get_value_color), - /* K117 */ be_nested_str_weak(get_value), - /* K118 */ be_nested_str_weak(expand), - /* K119 */ be_nested_str_weak(set_width), - /* K120 */ be_nested_str_weak(SIZE_CONTENT), - /* K121 */ be_nested_str_weak(break), - /* K122 */ be_nested_str_weak(LABEL_LONG_WRAP), - /* K123 */ be_nested_str_weak(dots), - /* K124 */ be_nested_str_weak(LABEL_LONG_DOT), - /* K125 */ be_nested_str_weak(scroll), - /* K126 */ be_nested_str_weak(LABEL_LONG_SCROLL), - /* K127 */ be_nested_str_weak(loop), - /* K128 */ be_nested_str_weak(LABEL_LONG_SCROLL_CIRCULAR), - /* K129 */ be_nested_str_weak(crop), - /* K130 */ be_nested_str_weak(LABEL_LONG_CLIP), - /* K131 */ be_nested_str_weak(set_long_mode), - /* K132 */ be_const_int(2), - /* K133 */ be_nested_str_weak(set_style_text_align), - /* K134 */ be_nested_str_weak(get_style_line_width), - /* K135 */ be_nested_str_weak(set_style_pad_left), + /* K6 */ be_nested_str_weak(STATE_DEFAULT), + /* K7 */ be_nested_str_weak(set_style_text_color), + /* K8 */ be_nested_str_weak(parse_color), + /* K9 */ be_nested_str_weak(remove_val_rule), + /* K10 */ be_nested_str_weak(remove_text_rule), + /* K11 */ be_nested_str_weak(_lv_label), + /* K12 */ be_nested_str_weak(del), + /* K13 */ be_nested_str_weak(_delete), + /* K14 */ be_nested_str_weak(_page), + /* K15 */ be_nested_str_weak(_hm), + /* K16 */ be_nested_str_weak(_EVENTS), + /* K17 */ be_const_int(0), + /* K18 */ be_nested_str_weak(register_event), + /* K19 */ be_const_int(1), + /* K20 */ be_nested_str_weak(get_style_pad_bottom), + /* K21 */ be_nested_str_weak(has_state), + /* K22 */ be_nested_str_weak(STATE_DISABLED), + /* K23 */ be_nested_str_weak(check_label), + /* K24 */ be_nested_str_weak(set_text), + /* K25 */ be_nested_str_weak(get_style_pad_top), + /* K26 */ be_nested_str_weak(string), + /* K27 */ be_nested_str_weak(introspect), + /* K28 */ be_nested_str_weak(startswith), + /* K29 */ be_nested_str_weak(set_), + /* K30 */ be_nested_str_weak(get_), + /* K31 */ be_const_int(3), + /* K32 */ be_nested_str_weak(byte), + /* K33 */ be_const_int(2147483647), + /* K34 */ be_nested_str_weak(digits_to_style), + /* K35 */ be_nested_str_weak(_attr_ignore), + /* K36 */ be_nested_str_weak(find), + /* K37 */ be_nested_str_weak(get), + /* K38 */ be_nested_str_weak(function), + /* K39 */ be_nested_str_weak(_attr_map), + /* K40 */ be_nested_str_weak(get_style_), + /* K41 */ be_nested_str_weak(undefined), + /* K42 */ be_nested_str_weak(set_style_pad_left), + /* K43 */ be_nested_str_weak(contains), + /* K44 */ be_nested_str_weak(label), + /* K45 */ be_nested_str_weak(get_obj), + /* K46 */ be_nested_str_weak(set_align), + /* K47 */ be_nested_str_weak(ALIGN_CENTER), + /* K48 */ be_nested_str_weak(get_style_text_color), + /* K49 */ be_nested_str_weak(register_event_cb), + /* K50 */ be_nested_str_weak(clear_state), + /* K51 */ be_nested_str_weak(add_state), + /* K52 */ be_nested_str_weak(real), + /* K53 */ be_nested_str_weak(math), + /* K54 */ be_nested_str_weak(round), + /* K55 */ be_nested_str_weak(endswith), + /* K56 */ be_nested_str_weak(_X25), + /* K57 */ be_nested_str_weak(pct), + /* K58 */ be_nested_str_weak(is_color_attribute), + /* K59 */ be_nested_str_weak(set_style_), + /* K60 */ be_nested_str_weak(HSP_X3A_X20unknown_X20attribute_X3A), + /* K61 */ be_nested_str_weak(toupper), + /* K62 */ be_nested_str_weak(TRUE), + /* K63 */ be_nested_str_weak(FALSE), + /* K64 */ be_nested_str_weak(STATE_CHECKED), + /* K65 */ be_nested_str_weak(set_style_pad_all), + /* K66 */ be_nested_str_weak(get_x), + /* K67 */ be_nested_str_weak(set_x), + /* K68 */ be_nested_str_weak(_action), + /* K69 */ be_nested_str_weak(), + /* K70 */ be_nested_str_weak(has_flag), + /* K71 */ be_nested_str_weak(OBJ_FLAG_FLEX_IN_NEW_TRACK), + /* K72 */ be_nested_str_weak(add_flag), + /* K73 */ be_nested_str_weak(clear_flag), + /* K74 */ be_nested_str_weak(expand), + /* K75 */ be_nested_str_weak(set_width), + /* K76 */ be_nested_str_weak(SIZE_CONTENT), + /* K77 */ be_nested_str_weak(break), + /* K78 */ be_nested_str_weak(LABEL_LONG_WRAP), + /* K79 */ be_nested_str_weak(dots), + /* K80 */ be_nested_str_weak(LABEL_LONG_DOT), + /* K81 */ be_nested_str_weak(scroll), + /* K82 */ be_nested_str_weak(LABEL_LONG_SCROLL), + /* K83 */ be_nested_str_weak(loop), + /* K84 */ be_nested_str_weak(LABEL_LONG_SCROLL_CIRCULAR), + /* K85 */ be_nested_str_weak(crop), + /* K86 */ be_nested_str_weak(LABEL_LONG_CLIP), + /* K87 */ be_nested_str_weak(set_long_mode), + /* K88 */ be_nested_str_weak(set_style_pad_bottom), + /* K89 */ be_nested_str_weak(_val), + /* K90 */ be_nested_str_weak(set_value), + /* K91 */ be_nested_str_weak(OBJ_FLAG_HIDDEN), + /* K92 */ be_nested_str_weak(get_enabled), + /* K93 */ be_nested_str_weak(get_text), + /* K94 */ be_nested_str_weak(get_value_color), + /* K95 */ be_nested_str_weak(get_long_mode), + /* K96 */ be_nested_str_weak(OBJ_FLAG_CLICKABLE), + /* K97 */ be_nested_str_weak(get_value), + /* K98 */ be_nested_str_weak(parse_font), + /* K99 */ be_nested_str_weak(set_style_text_font), + /* K100 */ be_nested_str_weak(get_style_radius), + /* K101 */ be_nested_str_weak(set_style_pad_top), + /* K102 */ be_nested_str_weak(set_text_font), + /* K103 */ be_nested_str_weak(set_enabled), + /* K104 */ be_nested_str_weak(set_style_pad_right), + /* K105 */ be_nested_str_weak(set_text_color), + /* K106 */ be_nested_str_weak(get_code), + /* K107 */ be_nested_str_weak(action), + /* K108 */ be_nested_str_weak(EVENT_CLICKED), + /* K109 */ be_nested_str_weak(tasmota), + /* K110 */ be_nested_str_weak(defer), + /* K111 */ be_nested_str_weak(_event_map), + /* K112 */ be_nested_str_weak(json), + /* K113 */ be_nested_str_weak(EVENT_VALUE_CHANGED), + /* K114 */ be_nested_str_weak(val), + /* K115 */ be_nested_str_weak(module), + /* K116 */ be_nested_str_weak(_X2C_X22val_X22_X3A_X25s), + /* K117 */ be_nested_str_weak(dump), + /* K118 */ be_nested_str_weak(text), + /* K119 */ be_nested_str_weak(_X2C_X22text_X22_X3A_X25s), + /* K120 */ be_nested_str_weak(_tag), + /* K121 */ be_nested_str_weak(_X2C_X22tag_X22_X3A_X25s), + /* K122 */ be_nested_str_weak(get_sub_id), + /* K123 */ be_nested_str_weak(_), + /* K124 */ be_nested_str_weak(_X7B_X22hasp_X22_X3A_X7B_X22p_X25ib_X25i_X25s_X22_X3A_X7B_X22event_X22_X3A_X22_X25s_X22_X25s_X7D_X7D_X7D), + /* K125 */ be_nested_str_weak(_page_id), + /* K126 */ be_nested_str_weak(id), + /* K127 */ be_nested_str_weak(get_style_line_width), + /* K128 */ be_nested_str_weak(set_style_radius), + /* K129 */ be_nested_str_weak(get_style_text_align), + /* K130 */ be_nested_str_weak(TEXT_ALIGN_LEFT), + /* K131 */ be_nested_str_weak(left), + /* K132 */ be_nested_str_weak(TEXT_ALIGN_CENTER), + /* K133 */ be_nested_str_weak(center), + /* K134 */ be_nested_str_weak(TEXT_ALIGN_RIGHT), + /* K135 */ be_nested_str_weak(right), + /* K136 */ be_nested_str_weak(get_style_pad_left), + /* K137 */ be_nested_str_weak(get_text_font), + /* K138 */ be_nested_str_weak(get_y), + /* K139 */ be_nested_str_weak(set_y), + /* K140 */ be_const_int(2), + /* K141 */ be_nested_str_weak(set_style_text_align), }; extern const bclass be_class_lvh_obj; -/******************************************************************** -** Solidified function: set_action -********************************************************************/ -be_local_closure(class_lvh_obj_set_action, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_action), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x60080008, // 0000 GETGBL R2 G8 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x90020002, // 0003 SETMBR R0 K0 R2 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_text -********************************************************************/ -be_local_closure(class_lvh_obj_get_text, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_text), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x4C080000, // 0001 LDNIL R2 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x78060001, // 0003 JMPF R1 #0006 - 0x4C040000, // 0004 LDNIL R1 - 0x80040200, // 0005 RET 1 R1 - 0x88040101, // 0006 GETMBR R1 R0 K1 - 0x8C040302, // 0007 GETMET R1 R1 K2 - 0x7C040200, // 0008 CALL R1 1 - 0x80040200, // 0009 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_flex_in_new_track -********************************************************************/ -be_local_closure(class_lvh_obj_get_flex_in_new_track, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_flex_in_new_track), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88040103, // 0000 GETMBR R1 R0 K3 - 0x8C040304, // 0001 GETMET R1 R1 K4 - 0xB80E0A00, // 0002 GETNGBL R3 K5 - 0x880C0706, // 0003 GETMBR R3 R3 K6 - 0x7C040400, // 0004 CALL R1 2 - 0x80040200, // 0005 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pad_all2 -********************************************************************/ -be_local_closure(class_lvh_obj_set_pad_all2, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_pad_all2), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88080107, // 0000 GETMBR R2 R0 K7 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0009, // 0003 JMPF R2 #000E - 0x88080103, // 0004 GETMBR R2 R0 K3 - 0x8C080508, // 0005 GETMET R2 R2 K8 - 0x60100009, // 0006 GETGBL R4 G9 - 0x5C140200, // 0007 MOVE R5 R1 - 0x7C100200, // 0008 CALL R4 1 - 0x88140107, // 0009 GETMBR R5 R0 K7 - 0xB81A0A00, // 000A GETNGBL R6 K5 - 0x88180D09, // 000B GETMBR R6 R6 K9 - 0x30140A06, // 000C OR R5 R5 R6 - 0x7C080600, // 000D CALL R2 3 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_hidden -********************************************************************/ -be_local_closure(class_lvh_obj_get_hidden, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_hidden), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88040103, // 0000 GETMBR R1 R0 K3 - 0x8C040304, // 0001 GETMET R1 R1 K4 - 0xB80E0A00, // 0002 GETNGBL R3 K5 - 0x880C070A, // 0003 GETMBR R3 R3 K10 - 0x7C040400, // 0004 CALL R1 2 - 0x80040200, // 0005 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_enabled -********************************************************************/ -be_local_closure(class_lvh_obj_get_enabled, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_enabled), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88040103, // 0000 GETMBR R1 R0 K3 - 0x8C04030B, // 0001 GETMET R1 R1 K11 - 0xB80E0A00, // 0002 GETNGBL R3 K5 - 0x880C070C, // 0003 GETMBR R3 R3 K12 - 0x7C040400, // 0004 CALL R1 2 - 0x78060000, // 0005 JMPF R1 #0007 - 0x50040001, // 0006 LDBOOL R1 0 1 - 0x50040200, // 0007 LDBOOL R1 1 0 - 0x80040200, // 0008 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_line_width -********************************************************************/ -be_local_closure(class_lvh_obj_set_line_width, /* name */ - be_nested_proto( - 7, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_line_width), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x880C0103, // 0000 GETMBR R3 R0 K3 - 0x8C0C070D, // 0001 GETMET R3 R3 K13 - 0x60140009, // 0002 GETGBL R5 G9 - 0x5C180200, // 0003 MOVE R6 R1 - 0x7C140200, // 0004 CALL R5 1 - 0x5C180400, // 0005 MOVE R6 R2 - 0x7C0C0600, // 0006 CALL R3 3 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: check_label -********************************************************************/ -be_local_closure(class_lvh_obj_check_label, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(check_label), - &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x4C080000, // 0001 LDNIL R2 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x78060013, // 0003 JMPF R1 #0018 - 0xA4061C00, // 0004 IMPORT R1 K14 - 0x8C08030F, // 0005 GETMET R2 R1 K15 - 0x88100103, // 0006 GETMBR R4 R0 K3 - 0x58140010, // 0007 LDCONST R5 K16 - 0x7C080600, // 0008 CALL R2 3 - 0x780A0002, // 0009 JMPF R2 #000D - 0x88080103, // 000A GETMBR R2 R0 K3 - 0x90020202, // 000B SETMBR R0 K1 R2 - 0x7002000A, // 000C JMP #0018 - 0xB80A0A00, // 000D GETNGBL R2 K5 - 0x8C080511, // 000E GETMET R2 R2 K17 - 0x8C100112, // 000F GETMET R4 R0 K18 - 0x7C100200, // 0010 CALL R4 1 - 0x7C080400, // 0011 CALL R2 2 - 0x90020202, // 0012 SETMBR R0 K1 R2 - 0x88080101, // 0013 GETMBR R2 R0 K1 - 0x8C080513, // 0014 GETMET R2 R2 K19 - 0xB8120A00, // 0015 GETNGBL R4 K5 - 0x88100914, // 0016 GETMBR R4 R4 K20 - 0x7C080400, // 0017 CALL R2 2 - 0x80000000, // 0018 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_event_cb -********************************************************************/ -be_local_closure(class_lvh_obj_register_event_cb, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(register_event_cb), - &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ - 0x88040115, // 0000 GETMBR R1 R0 K21 - 0x88040316, // 0001 GETMBR R1 R1 K22 - 0x88080117, // 0002 GETMBR R2 R0 K23 - 0x580C0018, // 0003 LDCONST R3 K24 - 0x6010000C, // 0004 GETGBL R4 G12 - 0x5C140400, // 0005 MOVE R5 R2 - 0x7C100200, // 0006 CALL R4 1 - 0x14100604, // 0007 LT R4 R3 R4 - 0x78120005, // 0008 JMPF R4 #000F - 0x8C100319, // 0009 GETMET R4 R1 K25 - 0x5C180000, // 000A MOVE R6 R0 - 0x941C0403, // 000B GETIDX R7 R2 R3 - 0x7C100600, // 000C CALL R4 3 - 0x000C071A, // 000D ADD R3 R3 K26 - 0x7001FFF4, // 000E JMP #0004 - 0x80000000, // 000F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_pad_right -********************************************************************/ -be_local_closure(class_lvh_obj_get_pad_right, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_pad_right), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x88040107, // 0000 GETMBR R1 R0 K7 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060007, // 0003 JMPF R1 #000C - 0x88040103, // 0004 GETMBR R1 R0 K3 - 0x8C04031B, // 0005 GETMET R1 R1 K27 - 0x880C0107, // 0006 GETMBR R3 R0 K7 - 0xB8120A00, // 0007 GETNGBL R4 K5 - 0x88100909, // 0008 GETMBR R4 R4 K9 - 0x300C0604, // 0009 OR R3 R3 R4 - 0x7C040400, // 000A CALL R1 2 - 0x80040200, // 000B RET 1 R1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_text_color -********************************************************************/ -be_local_closure(class_lvh_obj_set_text_color, /* name */ - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_text_color), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x880C0103, // 0000 GETMBR R3 R0 K3 - 0x8C0C071C, // 0001 GETMET R3 R3 K28 - 0x8C14011D, // 0002 GETMET R5 R0 K29 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x7C140400, // 0004 CALL R5 2 - 0x5C180400, // 0005 MOVE R6 R2 - 0x7C0C0600, // 0006 CALL R3 3 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: post_init -********************************************************************/ -be_local_closure(class_lvh_obj_post_init, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(post_init), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C04011E, // 0000 GETMET R1 R0 K30 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _delete -********************************************************************/ -be_local_closure(class_lvh_obj__delete, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(_delete), - &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x8C04011F, // 0000 GETMET R1 R0 K31 - 0x7C040200, // 0001 CALL R1 1 - 0x8C040120, // 0002 GETMET R1 R0 K32 - 0x7C040200, // 0003 CALL R1 1 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x78060004, // 0005 JMPF R1 #000B - 0x88040101, // 0006 GETMBR R1 R0 K1 - 0x8C040321, // 0007 GETMET R1 R1 K33 - 0x7C040200, // 0008 CALL R1 1 - 0x4C040000, // 0009 LDNIL R1 - 0x90020201, // 000A SETMBR R0 K1 R1 - 0x88040103, // 000B GETMBR R1 R0 K3 - 0x78060004, // 000C JMPF R1 #0012 - 0x88040103, // 000D GETMBR R1 R0 K3 - 0x8C040321, // 000E GETMET R1 R1 K33 - 0x7C040200, // 000F CALL R1 1 - 0x4C040000, // 0010 LDNIL R1 - 0x90020601, // 0011 SETMBR R0 K3 R1 - 0x60040003, // 0012 GETGBL R1 G3 - 0x5C080000, // 0013 MOVE R2 R0 - 0x7C040200, // 0014 CALL R1 1 - 0x8C040322, // 0015 GETMET R1 R1 K34 - 0x7C040200, // 0016 CALL R1 1 - 0x80000000, // 0017 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_value_font -********************************************************************/ -be_local_closure(class_lvh_obj_get_value_font, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_value_font), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040123, // 0000 GETMET R1 R0 K35 - 0x7C040200, // 0001 CALL R1 1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_radius2 -********************************************************************/ -be_local_closure(class_lvh_obj_get_radius2, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_radius2), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x88040107, // 0000 GETMBR R1 R0 K7 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060007, // 0003 JMPF R1 #000C - 0x88040103, // 0004 GETMBR R1 R0 K3 - 0x8C040324, // 0005 GETMET R1 R1 K36 - 0x880C0107, // 0006 GETMBR R3 R0 K7 - 0xB8120A00, // 0007 GETNGBL R4 K5 - 0x88100909, // 0008 GETMBR R4 R4 K9 - 0x300C0604, // 0009 OR R3 R3 R4 - 0x7C040400, // 000A CALL R1 2 - 0x80040200, // 000B RET 1 R1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_value_color -********************************************************************/ -be_local_closure(class_lvh_obj_set_value_color, /* name */ - be_nested_proto( - 7, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_value_color), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x8C0C0125, // 0000 GETMET R3 R0 K37 - 0x5C140200, // 0001 MOVE R5 R1 - 0x5C180400, // 0002 MOVE R6 R2 - 0x7C0C0600, // 0003 CALL R3 3 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_text_color -********************************************************************/ -be_local_closure(class_lvh_obj_get_text_color, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_text_color), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080103, // 0000 GETMBR R2 R0 K3 - 0x8C080526, // 0001 GETMET R2 R2 K38 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_value_ofs_x -********************************************************************/ -be_local_closure(class_lvh_obj_get_value_ofs_x, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_value_ofs_x), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x8C040327, // 0001 GETMET R1 R1 K39 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_label_mode -********************************************************************/ -be_local_closure(class_lvh_obj_get_label_mode, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_label_mode), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060003, // 0003 JMPF R1 #0008 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C040328, // 0005 GETMET R1 R1 K40 - 0x7C040200, // 0006 CALL R1 1 - 0x80040200, // 0007 RET 1 R1 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_val -********************************************************************/ -be_local_closure(class_lvh_obj_set_val, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_val), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0xA40A1C00, // 0000 IMPORT R2 K14 - 0x90025201, // 0001 SETMBR R0 K41 R1 - 0x8C0C050F, // 0002 GETMET R3 R2 K15 - 0x88140103, // 0003 GETMBR R5 R0 K3 - 0x5818002A, // 0004 LDCONST R6 K42 - 0x7C0C0600, // 0005 CALL R3 3 - 0x780E0003, // 0006 JMPF R3 #000B - 0x880C0103, // 0007 GETMBR R3 R0 K3 - 0x8C0C072A, // 0008 GETMET R3 R3 K42 - 0x5C140200, // 0009 MOVE R5 R1 - 0x7C0C0400, // 000A CALL R3 2 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_click -********************************************************************/ -be_local_closure(class_lvh_obj_set_click, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_click), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C08012B, // 0000 GETMET R2 R0 K43 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: member -********************************************************************/ -be_local_closure(class_lvh_obj_member, /* name */ - be_nested_proto( - 11, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(member), - &be_const_str_solidified, - ( &(const binstruction[125]) { /* code */ - 0xA40A5800, // 0000 IMPORT R2 K44 - 0xA40E1C00, // 0001 IMPORT R3 K14 - 0x8C10052D, // 0002 GETMET R4 R2 K45 - 0x5C180200, // 0003 MOVE R6 R1 - 0x581C002E, // 0004 LDCONST R7 K46 - 0x7C100600, // 0005 CALL R4 3 - 0x74120004, // 0006 JMPT R4 #000C - 0x8C10052D, // 0007 GETMET R4 R2 K45 - 0x5C180200, // 0008 MOVE R6 R1 - 0x581C002F, // 0009 LDCONST R7 K47 - 0x7C100600, // 000A CALL R4 3 - 0x78120000, // 000B JMPF R4 #000D - 0x80000800, // 000C RET 0 - 0x4C100000, // 000D LDNIL R4 - 0x6014000C, // 000E GETGBL R5 G12 - 0x5C180200, // 000F MOVE R6 R1 - 0x7C140200, // 0010 CALL R5 1 - 0x28140B30, // 0011 GE R5 R5 K48 - 0x7816001F, // 0012 JMPF R5 #0033 - 0x8C140531, // 0013 GETMET R5 R2 K49 - 0x541DFFFE, // 0014 LDINT R7 -1 - 0x941C0207, // 0015 GETIDX R7 R1 R7 - 0x7C140400, // 0016 CALL R5 2 - 0x8C180531, // 0017 GETMET R6 R2 K49 - 0x5421FFFD, // 0018 LDINT R8 -2 - 0x94200208, // 0019 GETIDX R8 R1 R8 - 0x7C180400, // 001A CALL R6 2 - 0x541E002F, // 001B LDINT R7 48 - 0x281C0A07, // 001C GE R7 R5 R7 - 0x781E0014, // 001D JMPF R7 #0033 - 0x541E0038, // 001E LDINT R7 57 - 0x181C0A07, // 001F LE R7 R5 R7 - 0x781E0011, // 0020 JMPF R7 #0033 - 0x541E002F, // 0021 LDINT R7 48 - 0x281C0C07, // 0022 GE R7 R6 R7 - 0x781E000E, // 0023 JMPF R7 #0033 - 0x541E0038, // 0024 LDINT R7 57 - 0x181C0C07, // 0025 LE R7 R6 R7 - 0x781E000B, // 0026 JMPF R7 #0033 - 0x601C0009, // 0027 GETGBL R7 G9 - 0x5421FFFD, // 0028 LDINT R8 -2 - 0x40201132, // 0029 CONNECT R8 R8 K50 - 0x94200208, // 002A GETIDX R8 R1 R8 - 0x7C1C0200, // 002B CALL R7 1 - 0x5421FFFC, // 002C LDINT R8 -3 - 0x40223008, // 002D CONNECT R8 K24 R8 - 0x94040208, // 002E GETIDX R1 R1 R8 - 0x8C200133, // 002F GETMET R8 R0 K51 - 0x5C280E00, // 0030 MOVE R10 R7 - 0x7C200400, // 0031 CALL R8 2 - 0x5C101000, // 0032 MOVE R4 R8 - 0x88140134, // 0033 GETMBR R5 R0 K52 - 0x8C140B35, // 0034 GETMET R5 R5 K53 - 0x5C1C0200, // 0035 MOVE R7 R1 - 0x7C140400, // 0036 CALL R5 2 - 0x4C180000, // 0037 LDNIL R6 - 0x20140A06, // 0038 NE R5 R5 R6 - 0x78160000, // 0039 JMPF R5 #003B - 0x80000A00, // 003A RET 0 - 0x8C140736, // 003B GETMET R5 R3 K54 - 0x5C1C0000, // 003C MOVE R7 R0 - 0x00225E01, // 003D ADD R8 K47 R1 - 0x7C140600, // 003E CALL R5 3 - 0x60180004, // 003F GETGBL R6 G4 - 0x5C1C0A00, // 0040 MOVE R7 R5 - 0x7C180200, // 0041 CALL R6 1 - 0x1C180D37, // 0042 EQ R6 R6 K55 - 0x781A0009, // 0043 JMPF R6 #004E - 0x5C180A00, // 0044 MOVE R6 R5 - 0x5C1C0000, // 0045 MOVE R7 R0 - 0x4C200000, // 0046 LDNIL R8 - 0x20200808, // 0047 NE R8 R4 R8 - 0x78220001, // 0048 JMPF R8 #004B - 0x5C200800, // 0049 MOVE R8 R4 - 0x70020000, // 004A JMP #004C - 0x58200018, // 004B LDCONST R8 K24 - 0x7C180400, // 004C CALL R6 2 - 0x80040C00, // 004D RET 1 R6 - 0x88180138, // 004E GETMBR R6 R0 K56 - 0x8C180D35, // 004F GETMET R6 R6 K53 - 0x5C200200, // 0050 MOVE R8 R1 - 0x5C240200, // 0051 MOVE R9 R1 - 0x7C180600, // 0052 CALL R6 3 - 0x5C040C00, // 0053 MOVE R1 R6 - 0x4C180000, // 0054 LDNIL R6 - 0x1C180806, // 0055 EQ R6 R4 R6 - 0x781A000D, // 0056 JMPF R6 #0065 - 0x8C180736, // 0057 GETMET R6 R3 K54 - 0x88200103, // 0058 GETMBR R8 R0 K3 - 0x00265E01, // 0059 ADD R9 K47 R1 - 0x7C180600, // 005A CALL R6 3 - 0x5C140C00, // 005B MOVE R5 R6 - 0x60180004, // 005C GETGBL R6 G4 - 0x5C1C0A00, // 005D MOVE R7 R5 - 0x7C180200, // 005E CALL R6 1 - 0x1C180D37, // 005F EQ R6 R6 K55 - 0x781A0003, // 0060 JMPF R6 #0065 - 0x5C180A00, // 0061 MOVE R6 R5 - 0x881C0103, // 0062 GETMBR R7 R0 K3 - 0x7C180200, // 0063 CALL R6 1 - 0x80040C00, // 0064 RET 1 R6 - 0x8C180736, // 0065 GETMET R6 R3 K54 - 0x88200103, // 0066 GETMBR R8 R0 K3 - 0x00267201, // 0067 ADD R9 K57 R1 - 0x7C180600, // 0068 CALL R6 3 - 0x5C140C00, // 0069 MOVE R5 R6 - 0x60180004, // 006A GETGBL R6 G4 - 0x5C1C0A00, // 006B MOVE R7 R5 - 0x7C180200, // 006C CALL R6 1 - 0x1C180D37, // 006D EQ R6 R6 K55 - 0x781A0009, // 006E JMPF R6 #0079 - 0x5C180A00, // 006F MOVE R6 R5 - 0x881C0103, // 0070 GETMBR R7 R0 K3 - 0x4C200000, // 0071 LDNIL R8 - 0x20200808, // 0072 NE R8 R4 R8 - 0x78220001, // 0073 JMPF R8 #0076 - 0x5C200800, // 0074 MOVE R8 R4 - 0x70020000, // 0075 JMP #0077 - 0x58200018, // 0076 LDCONST R8 K24 - 0x7C180400, // 0077 CALL R6 2 - 0x80040C00, // 0078 RET 1 R6 - 0x6018000B, // 0079 GETGBL R6 G11 - 0x581C003A, // 007A LDCONST R7 K58 - 0x7C180200, // 007B CALL R6 1 - 0x80040C00, // 007C RET 1 R6 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pad_top2 -********************************************************************/ -be_local_closure(class_lvh_obj_set_pad_top2, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_pad_top2), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88080107, // 0000 GETMBR R2 R0 K7 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0009, // 0003 JMPF R2 #000E - 0x88080103, // 0004 GETMBR R2 R0 K3 - 0x8C08053B, // 0005 GETMET R2 R2 K59 - 0x60100009, // 0006 GETGBL R4 G9 - 0x5C140200, // 0007 MOVE R5 R1 - 0x7C100200, // 0008 CALL R4 1 - 0x88140107, // 0009 GETMBR R5 R0 K7 - 0xB81A0A00, // 000A GETNGBL R6 K5 - 0x88180D09, // 000B GETMBR R6 R6 K9 - 0x30140A06, // 000C OR R5 R5 R6 - 0x7C080600, // 000D CALL R2 3 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_enabled -********************************************************************/ -be_local_closure(class_lvh_obj_set_enabled, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_enabled), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x78060005, // 0000 JMPF R1 #0007 - 0x88080103, // 0001 GETMBR R2 R0 K3 - 0x8C08053C, // 0002 GETMET R2 R2 K60 - 0xB8120A00, // 0003 GETNGBL R4 K5 - 0x8810090C, // 0004 GETMBR R4 R4 K12 - 0x7C080400, // 0005 CALL R2 2 - 0x70020004, // 0006 JMP #000C - 0x88080103, // 0007 GETMBR R2 R0 K3 - 0x8C08053D, // 0008 GETMET R2 R2 K61 - 0xB8120A00, // 0009 GETNGBL R4 K5 - 0x8810090C, // 000A GETMBR R4 R4 K12 - 0x7C080400, // 000B CALL R2 2 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_value_ofs_x -********************************************************************/ -be_local_closure(class_lvh_obj_set_value_ofs_x, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_value_ofs_x), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x8C08013E, // 0000 GETMET R2 R0 K62 - 0x7C080200, // 0001 CALL R2 1 - 0x88080101, // 0002 GETMBR R2 R0 K1 - 0x8C08053F, // 0003 GETMET R2 R2 K63 - 0x60100009, // 0004 GETGBL R4 G9 - 0x5C140200, // 0005 MOVE R5 R1 - 0x7C100200, // 0006 CALL R4 1 - 0x7C080400, // 0007 CALL R2 2 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -2681,7 +1829,7 @@ be_local_closure(class_lvh_obj_init, /* name */ 0x60180003, // 0000 GETGBL R6 G3 0x5C1C0000, // 0001 MOVE R7 R0 0x7C180200, // 0002 CALL R6 1 - 0x8C180D40, // 0003 GETMET R6 R6 K64 + 0x8C180D00, // 0003 GETMET R6 R6 K0 0x5C200200, // 0004 MOVE R8 R1 0x5C240400, // 0005 MOVE R9 R2 0x5C280600, // 0006 MOVE R10 R3 @@ -2695,377 +1843,6 @@ be_local_closure(class_lvh_obj_init, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: get_toggle -********************************************************************/ -be_local_closure(class_lvh_obj_get_toggle, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_toggle), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88040103, // 0000 GETMBR R1 R0 K3 - 0x8C04030B, // 0001 GETMET R1 R1 K11 - 0xB80E0A00, // 0002 GETNGBL R3 K5 - 0x880C0741, // 0003 GETMBR R3 R3 K65 - 0x7C040400, // 0004 CALL R1 2 - 0x80040200, // 0005 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_text_font -********************************************************************/ -be_local_closure(class_lvh_obj_set_text_font, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_text_font), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x8C080142, // 0000 GETMET R2 R0 K66 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x4C0C0000, // 0003 LDNIL R3 - 0x200C0403, // 0004 NE R3 R2 R3 - 0x780E0004, // 0005 JMPF R3 #000B - 0x880C0103, // 0006 GETMBR R3 R0 K3 - 0x8C0C0743, // 0007 GETMET R3 R3 K67 - 0x5C140400, // 0008 MOVE R5 R2 - 0x58180018, // 0009 LDCONST R6 K24 - 0x7C0C0600, // 000A CALL R3 3 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_click -********************************************************************/ -be_local_closure(class_lvh_obj_get_click, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_click), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040144, // 0000 GETMET R1 R0 K68 - 0x7C040200, // 0001 CALL R1 1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pad_right2 -********************************************************************/ -be_local_closure(class_lvh_obj_set_pad_right2, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_pad_right2), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88080107, // 0000 GETMBR R2 R0 K7 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0009, // 0003 JMPF R2 #000E - 0x88080103, // 0004 GETMBR R2 R0 K3 - 0x8C080545, // 0005 GETMET R2 R2 K69 - 0x60100009, // 0006 GETGBL R4 G9 - 0x5C140200, // 0007 MOVE R5 R1 - 0x7C100200, // 0008 CALL R4 1 - 0x88140107, // 0009 GETMBR R5 R0 K7 - 0xB81A0A00, // 000A GETNGBL R6 K5 - 0x88180D09, // 000B GETMBR R6 R6 K9 - 0x30140A06, // 000C OR R5 R5 R6 - 0x7C080600, // 000D CALL R2 3 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_action -********************************************************************/ -be_local_closure(class_lvh_obj_get_action, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_action), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060001, // 0001 JMPF R1 #0004 - 0x5C080200, // 0002 MOVE R2 R1 - 0x70020000, // 0003 JMP #0005 - 0x58080046, // 0004 LDCONST R2 K70 - 0x80040400, // 0005 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: setmember -********************************************************************/ -be_local_closure(class_lvh_obj_setmember, /* name */ - be_nested_proto( - 12, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(setmember), - &be_const_str_solidified, - ( &(const binstruction[164]) { /* code */ - 0xA40E5800, // 0000 IMPORT R3 K44 - 0xA4121C00, // 0001 IMPORT R4 K14 - 0x8C14072D, // 0002 GETMET R5 R3 K45 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5820002E, // 0004 LDCONST R8 K46 - 0x7C140600, // 0005 CALL R5 3 - 0x74160004, // 0006 JMPT R5 #000C - 0x8C14072D, // 0007 GETMET R5 R3 K45 - 0x5C1C0200, // 0008 MOVE R7 R1 - 0x5820002F, // 0009 LDCONST R8 K47 - 0x7C140600, // 000A CALL R5 3 - 0x78160000, // 000B JMPF R5 #000D - 0x80000A00, // 000C RET 0 - 0x60140004, // 000D GETGBL R5 G4 - 0x5C180400, // 000E MOVE R6 R2 - 0x7C140200, // 000F CALL R5 1 - 0x1C140B47, // 0010 EQ R5 R5 K71 - 0x78160006, // 0011 JMPF R5 #0019 - 0xA4169000, // 0012 IMPORT R5 K72 - 0x60180009, // 0013 GETGBL R6 G9 - 0x8C1C0B49, // 0014 GETMET R7 R5 K73 - 0x5C240400, // 0015 MOVE R9 R2 - 0x7C1C0400, // 0016 CALL R7 2 - 0x7C180200, // 0017 CALL R6 1 - 0x5C080C00, // 0018 MOVE R2 R6 - 0x8C14074A, // 0019 GETMET R5 R3 K74 - 0x5C1C0200, // 001A MOVE R7 R1 - 0x5820004B, // 001B LDCONST R8 K75 - 0x7C140600, // 001C CALL R5 3 - 0x78160009, // 001D JMPF R5 #0028 - 0x5415FFFD, // 001E LDINT R5 -2 - 0x40163005, // 001F CONNECT R5 K24 R5 - 0x94040205, // 0020 GETIDX R1 R1 R5 - 0xB8160A00, // 0021 GETNGBL R5 K5 - 0x8C140B4C, // 0022 GETMET R5 R5 K76 - 0x601C0009, // 0023 GETGBL R7 G9 - 0x5C200400, // 0024 MOVE R8 R2 - 0x7C1C0200, // 0025 CALL R7 1 - 0x7C140400, // 0026 CALL R5 2 - 0x5C080A00, // 0027 MOVE R2 R5 - 0x4C140000, // 0028 LDNIL R5 - 0x6018000C, // 0029 GETGBL R6 G12 - 0x5C1C0200, // 002A MOVE R7 R1 - 0x7C180200, // 002B CALL R6 1 - 0x28180D30, // 002C GE R6 R6 K48 - 0x781A001F, // 002D JMPF R6 #004E - 0x8C180731, // 002E GETMET R6 R3 K49 - 0x5421FFFE, // 002F LDINT R8 -1 - 0x94200208, // 0030 GETIDX R8 R1 R8 - 0x7C180400, // 0031 CALL R6 2 - 0x8C1C0731, // 0032 GETMET R7 R3 K49 - 0x5425FFFD, // 0033 LDINT R9 -2 - 0x94240209, // 0034 GETIDX R9 R1 R9 - 0x7C1C0400, // 0035 CALL R7 2 - 0x5422002F, // 0036 LDINT R8 48 - 0x28200C08, // 0037 GE R8 R6 R8 - 0x78220014, // 0038 JMPF R8 #004E - 0x54220038, // 0039 LDINT R8 57 - 0x18200C08, // 003A LE R8 R6 R8 - 0x78220011, // 003B JMPF R8 #004E - 0x5422002F, // 003C LDINT R8 48 - 0x28200E08, // 003D GE R8 R7 R8 - 0x7822000E, // 003E JMPF R8 #004E - 0x54220038, // 003F LDINT R8 57 - 0x18200E08, // 0040 LE R8 R7 R8 - 0x7822000B, // 0041 JMPF R8 #004E - 0x60200009, // 0042 GETGBL R8 G9 - 0x5425FFFD, // 0043 LDINT R9 -2 - 0x40241332, // 0044 CONNECT R9 R9 K50 - 0x94240209, // 0045 GETIDX R9 R1 R9 - 0x7C200200, // 0046 CALL R8 1 - 0x5425FFFC, // 0047 LDINT R9 -3 - 0x40263009, // 0048 CONNECT R9 K24 R9 - 0x94040209, // 0049 GETIDX R1 R1 R9 - 0x8C240133, // 004A GETMET R9 R0 K51 - 0x5C2C1000, // 004B MOVE R11 R8 - 0x7C240400, // 004C CALL R9 2 - 0x5C141200, // 004D MOVE R5 R9 - 0x88180134, // 004E GETMBR R6 R0 K52 - 0x8C180D35, // 004F GETMET R6 R6 K53 - 0x5C200200, // 0050 MOVE R8 R1 - 0x7C180400, // 0051 CALL R6 2 - 0x4C1C0000, // 0052 LDNIL R7 - 0x20180C07, // 0053 NE R6 R6 R7 - 0x781A0000, // 0054 JMPF R6 #0056 - 0x80000C00, // 0055 RET 0 - 0x8C180936, // 0056 GETMET R6 R4 K54 - 0x5C200000, // 0057 MOVE R8 R0 - 0x00265C01, // 0058 ADD R9 K46 R1 - 0x7C180600, // 0059 CALL R6 3 - 0x601C0004, // 005A GETGBL R7 G4 - 0x5C200C00, // 005B MOVE R8 R6 - 0x7C1C0200, // 005C CALL R7 1 - 0x1C1C0F37, // 005D EQ R7 R7 K55 - 0x781E000A, // 005E JMPF R7 #006A - 0x5C1C0C00, // 005F MOVE R7 R6 - 0x5C200000, // 0060 MOVE R8 R0 - 0x5C240400, // 0061 MOVE R9 R2 - 0x4C280000, // 0062 LDNIL R10 - 0x20280A0A, // 0063 NE R10 R5 R10 - 0x782A0001, // 0064 JMPF R10 #0067 - 0x5C280A00, // 0065 MOVE R10 R5 - 0x70020000, // 0066 JMP #0068 - 0x58280018, // 0067 LDCONST R10 K24 - 0x7C1C0600, // 0068 CALL R7 3 - 0x80000E00, // 0069 RET 0 - 0x881C0138, // 006A GETMBR R7 R0 K56 - 0x8C1C0F35, // 006B GETMET R7 R7 K53 - 0x5C240200, // 006C MOVE R9 R1 - 0x5C280200, // 006D MOVE R10 R1 - 0x7C1C0600, // 006E CALL R7 3 - 0x5C040E00, // 006F MOVE R1 R7 - 0x8C1C014D, // 0070 GETMET R7 R0 K77 - 0x5C240200, // 0071 MOVE R9 R1 - 0x7C1C0400, // 0072 CALL R7 2 - 0x781E0003, // 0073 JMPF R7 #0078 - 0x8C1C011D, // 0074 GETMET R7 R0 K29 - 0x5C240400, // 0075 MOVE R9 R2 - 0x7C1C0400, // 0076 CALL R7 2 - 0x5C080E00, // 0077 MOVE R2 R7 - 0x4C1C0000, // 0078 LDNIL R7 - 0x1C1C0A07, // 0079 EQ R7 R5 R7 - 0x781E000E, // 007A JMPF R7 #008A - 0x8C1C0936, // 007B GETMET R7 R4 K54 - 0x88240103, // 007C GETMBR R9 R0 K3 - 0x002A5C01, // 007D ADD R10 K46 R1 - 0x7C1C0600, // 007E CALL R7 3 - 0x5C180E00, // 007F MOVE R6 R7 - 0x601C0004, // 0080 GETGBL R7 G4 - 0x5C200C00, // 0081 MOVE R8 R6 - 0x7C1C0200, // 0082 CALL R7 1 - 0x1C1C0F37, // 0083 EQ R7 R7 K55 - 0x781E0004, // 0084 JMPF R7 #008A - 0x5C1C0C00, // 0085 MOVE R7 R6 - 0x88200103, // 0086 GETMBR R8 R0 K3 - 0x5C240400, // 0087 MOVE R9 R2 - 0x7C1C0400, // 0088 CALL R7 2 - 0x80040E00, // 0089 RET 1 R7 - 0x8C1C0936, // 008A GETMET R7 R4 K54 - 0x88240103, // 008B GETMBR R9 R0 K3 - 0x002A9C01, // 008C ADD R10 K78 R1 - 0x7C1C0600, // 008D CALL R7 3 - 0x5C180E00, // 008E MOVE R6 R7 - 0x601C0004, // 008F GETGBL R7 G4 - 0x5C200C00, // 0090 MOVE R8 R6 - 0x7C1C0200, // 0091 CALL R7 1 - 0x1C1C0F37, // 0092 EQ R7 R7 K55 - 0x781E000A, // 0093 JMPF R7 #009F - 0x5C1C0C00, // 0094 MOVE R7 R6 - 0x88200103, // 0095 GETMBR R8 R0 K3 - 0x5C240400, // 0096 MOVE R9 R2 - 0x4C280000, // 0097 LDNIL R10 - 0x20280A0A, // 0098 NE R10 R5 R10 - 0x782A0001, // 0099 JMPF R10 #009C - 0x5C280A00, // 009A MOVE R10 R5 - 0x70020000, // 009B JMP #009D - 0x58280018, // 009C LDCONST R10 K24 - 0x7C1C0600, // 009D CALL R7 3 - 0x80040E00, // 009E RET 1 R7 - 0x601C0001, // 009F GETGBL R7 G1 - 0x5820004F, // 00A0 LDCONST R8 K79 - 0x5C240200, // 00A1 MOVE R9 R1 - 0x7C1C0400, // 00A2 CALL R7 2 - 0x80000000, // 00A3 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_value_font -********************************************************************/ -be_local_closure(class_lvh_obj_set_value_font, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_value_font), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C080150, // 0000 GETMET R2 R0 K80 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: get_text_font ********************************************************************/ @@ -3091,12 +1868,12 @@ be_local_closure(class_lvh_obj_get_text_font, /* name */ /******************************************************************** -** Solidified function: set_toggle +** Solidified function: get_pad_all ********************************************************************/ -be_local_closure(class_lvh_obj_set_toggle, /* name */ +be_local_closure(class_lvh_obj_get_pad_all, /* name */ be_nested_proto( - 7, /* nstack */ - 2, /* argc */ + 1, /* nstack */ + 1, /* argc */ 10, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -3104,41 +1881,10 @@ be_local_closure(class_lvh_obj_set_toggle, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_toggle), + be_str_weak(get_pad_all), &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0xA40A5800, // 0000 IMPORT R2 K44 - 0x600C0004, // 0001 GETGBL R3 G4 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C0C0200, // 0003 CALL R3 1 - 0x1C0C072C, // 0004 EQ R3 R3 K44 - 0x780E000C, // 0005 JMPF R3 #0013 - 0x8C0C0551, // 0006 GETMET R3 R2 K81 - 0x60140008, // 0007 GETGBL R5 G8 - 0x5C180200, // 0008 MOVE R6 R1 - 0x7C140200, // 0009 CALL R5 1 - 0x7C0C0400, // 000A CALL R3 2 - 0x5C040600, // 000B MOVE R1 R3 - 0x1C0C0352, // 000C EQ R3 R1 K82 - 0x780E0001, // 000D JMPF R3 #0010 - 0x50040200, // 000E LDBOOL R1 1 0 - 0x70020002, // 000F JMP #0013 - 0x1C0C0353, // 0010 EQ R3 R1 K83 - 0x780E0000, // 0011 JMPF R3 #0013 - 0x50040000, // 0012 LDBOOL R1 0 0 - 0x78060005, // 0013 JMPF R1 #001A - 0x880C0103, // 0014 GETMBR R3 R0 K3 - 0x8C0C073D, // 0015 GETMET R3 R3 K61 - 0xB8160A00, // 0016 GETNGBL R5 K5 - 0x88140B41, // 0017 GETMBR R5 R5 K65 - 0x7C0C0400, // 0018 CALL R3 2 - 0x70020004, // 0019 JMP #001F - 0x880C0103, // 001A GETMBR R3 R0 K3 - 0x8C0C073C, // 001B GETMET R3 R3 K60 - 0xB8160A00, // 001C GETNGBL R5 K5 - 0x88140B41, // 001D GETMBR R5 R5 K65 - 0x7C0C0400, // 001E CALL R3 2 - 0x80000000, // 001F RET 0 + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 }) ) ); @@ -3146,9 +1892,229 @@ be_local_closure(class_lvh_obj_set_toggle, /* name */ /******************************************************************** -** Solidified function: get_adjustable +** Solidified function: set_line_width ********************************************************************/ -be_local_closure(class_lvh_obj_get_adjustable, /* name */ +be_local_closure(class_lvh_obj_set_line_width, /* name */ + be_nested_proto( + 7, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_line_width), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x880C0101, // 0000 GETMBR R3 R0 K1 + 0x8C0C0702, // 0001 GETMET R3 R3 K2 + 0x60140009, // 0002 GETGBL R5 G9 + 0x5C180200, // 0003 MOVE R6 R1 + 0x7C140200, // 0004 CALL R5 1 + 0x5C180400, // 0005 MOVE R6 R2 + 0x7C0C0600, // 0006 CALL R3 3 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pad_right +********************************************************************/ +be_local_closure(class_lvh_obj_get_pad_right, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_pad_right), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x88040103, // 0000 GETMBR R1 R0 K3 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060007, // 0003 JMPF R1 #000C + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C040304, // 0005 GETMET R1 R1 K4 + 0x880C0103, // 0006 GETMBR R3 R0 K3 + 0xB8120A00, // 0007 GETNGBL R4 K5 + 0x88100906, // 0008 GETMBR R4 R4 K6 + 0x300C0604, // 0009 OR R3 R3 R4 + 0x7C040400, // 000A CALL R1 2 + 0x80040200, // 000B RET 1 R1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text_color +********************************************************************/ +be_local_closure(class_lvh_obj_set_text_color, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_text_color), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x880C0101, // 0000 GETMBR R3 R0 K1 + 0x8C0C0707, // 0001 GETMET R3 R3 K7 + 0x8C140108, // 0002 GETMET R5 R0 K8 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x7C140400, // 0004 CALL R5 2 + 0x5C180400, // 0005 MOVE R6 R2 + 0x7C0C0600, // 0006 CALL R3 3 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _delete +********************************************************************/ +be_local_closure(class_lvh_obj__delete, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(_delete), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x8C040109, // 0000 GETMET R1 R0 K9 + 0x7C040200, // 0001 CALL R1 1 + 0x8C04010A, // 0002 GETMET R1 R0 K10 + 0x7C040200, // 0003 CALL R1 1 + 0x8804010B, // 0004 GETMBR R1 R0 K11 + 0x78060004, // 0005 JMPF R1 #000B + 0x8804010B, // 0006 GETMBR R1 R0 K11 + 0x8C04030C, // 0007 GETMET R1 R1 K12 + 0x7C040200, // 0008 CALL R1 1 + 0x4C040000, // 0009 LDNIL R1 + 0x90021601, // 000A SETMBR R0 K11 R1 + 0x88040101, // 000B GETMBR R1 R0 K1 + 0x78060004, // 000C JMPF R1 #0012 + 0x88040101, // 000D GETMBR R1 R0 K1 + 0x8C04030C, // 000E GETMET R1 R1 K12 + 0x7C040200, // 000F CALL R1 1 + 0x4C040000, // 0010 LDNIL R1 + 0x90020201, // 0011 SETMBR R0 K1 R1 + 0x60040003, // 0012 GETGBL R1 G3 + 0x5C080000, // 0013 MOVE R2 R0 + 0x7C040200, // 0014 CALL R1 1 + 0x8C04030D, // 0015 GETMET R1 R1 K13 + 0x7C040200, // 0016 CALL R1 1 + 0x80000000, // 0017 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_event_cb +********************************************************************/ +be_local_closure(class_lvh_obj_register_event_cb, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(register_event_cb), + &be_const_str_solidified, + ( &(const binstruction[16]) { /* code */ + 0x8804010E, // 0000 GETMBR R1 R0 K14 + 0x8804030F, // 0001 GETMBR R1 R1 K15 + 0x88080110, // 0002 GETMBR R2 R0 K16 + 0x580C0011, // 0003 LDCONST R3 K17 + 0x6010000C, // 0004 GETGBL R4 G12 + 0x5C140400, // 0005 MOVE R5 R2 + 0x7C100200, // 0006 CALL R4 1 + 0x14100604, // 0007 LT R4 R3 R4 + 0x78120005, // 0008 JMPF R4 #000F + 0x8C100312, // 0009 GETMET R4 R1 K18 + 0x5C180000, // 000A MOVE R6 R0 + 0x941C0403, // 000B GETIDX R7 R2 R3 + 0x7C100600, // 000C CALL R4 3 + 0x000C0713, // 000D ADD R3 R3 K19 + 0x7001FFF4, // 000E JMP #0004 + 0x80000000, // 000F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pad_bottom +********************************************************************/ +be_local_closure(class_lvh_obj_get_pad_bottom, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_pad_bottom), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x88040103, // 0000 GETMBR R1 R0 K3 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060007, // 0003 JMPF R1 #000C + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C040314, // 0005 GETMET R1 R1 K20 + 0x880C0103, // 0006 GETMBR R3 R0 K3 + 0xB8120A00, // 0007 GETNGBL R4 K5 + 0x88100906, // 0008 GETMBR R4 R4 K6 + 0x300C0604, // 0009 OR R3 R3 R4 + 0x7C040400, // 000A CALL R1 2 + 0x80040200, // 000B RET 1 R1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_enabled +********************************************************************/ +be_local_closure(class_lvh_obj_get_enabled, /* name */ be_nested_proto( 4, /* nstack */ 1, /* argc */ @@ -3159,15 +2125,18 @@ be_local_closure(class_lvh_obj_get_adjustable, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_adjustable), + be_str_weak(get_enabled), &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88040103, // 0000 GETMBR R1 R0 K3 - 0x8C040304, // 0001 GETMET R1 R1 K4 + ( &(const binstruction[ 9]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x8C040315, // 0001 GETMET R1 R1 K21 0xB80E0A00, // 0002 GETNGBL R3 K5 - 0x880C0754, // 0003 GETMBR R3 R3 K84 + 0x880C0716, // 0003 GETMBR R3 R3 K22 0x7C040400, // 0004 CALL R1 2 - 0x80040200, // 0005 RET 1 R1 + 0x78060000, // 0005 JMPF R1 #0007 + 0x50040001, // 0006 LDBOOL R1 0 1 + 0x50040200, // 0007 LDBOOL R1 1 0 + 0x80040200, // 0008 RET 1 R1 }) ) ); @@ -3175,11 +2144,11 @@ be_local_closure(class_lvh_obj_get_adjustable, /* name */ /******************************************************************** -** Solidified function: get_align +** Solidified function: set_text ********************************************************************/ -be_local_closure(class_lvh_obj_get_align, /* name */ +be_local_closure(class_lvh_obj_set_text, /* name */ be_nested_proto( - 5, /* nstack */ + 6, /* nstack */ 2, /* argc */ 10, /* varg */ 0, /* has upvals */ @@ -3188,42 +2157,18 @@ be_local_closure(class_lvh_obj_get_align, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_align), + be_str_weak(set_text), &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ - 0x1C080318, // 0000 EQ R2 R1 K24 - 0x780A0000, // 0001 JMPF R2 #0003 - 0x58040018, // 0002 LDCONST R1 K24 - 0x88080101, // 0003 GETMBR R2 R0 K1 - 0x4C0C0000, // 0004 LDNIL R3 - 0x1C080403, // 0005 EQ R2 R2 R3 - 0x780A0001, // 0006 JMPF R2 #0009 - 0x4C080000, // 0007 LDNIL R2 - 0x80040400, // 0008 RET 1 R2 - 0x88080101, // 0009 GETMBR R2 R0 K1 - 0x8C080555, // 000A GETMET R2 R2 K85 - 0x5C100200, // 000B MOVE R4 R1 - 0x7C080400, // 000C CALL R2 2 - 0xB80E0A00, // 000D GETNGBL R3 K5 - 0x880C0756, // 000E GETMBR R3 R3 K86 - 0x1C0C0403, // 000F EQ R3 R2 R3 - 0x780E0001, // 0010 JMPF R3 #0013 - 0x8006AE00, // 0011 RET 1 K87 - 0x7002000C, // 0012 JMP #0020 - 0xB80E0A00, // 0013 GETNGBL R3 K5 - 0x880C0758, // 0014 GETMBR R3 R3 K88 - 0x1C0C0403, // 0015 EQ R3 R2 R3 - 0x780E0001, // 0016 JMPF R3 #0019 - 0x8006B200, // 0017 RET 1 K89 - 0x70020006, // 0018 JMP #0020 - 0xB80E0A00, // 0019 GETNGBL R3 K5 - 0x880C075A, // 001A GETMBR R3 R3 K90 - 0x1C0C0403, // 001B EQ R3 R2 R3 - 0x780E0001, // 001C JMPF R3 #001F - 0x8006B600, // 001D RET 1 K91 - 0x70020000, // 001E JMP #0020 - 0x80040400, // 001F RET 1 R2 - 0x80000000, // 0020 RET 0 + ( &(const binstruction[ 9]) { /* code */ + 0x8C080117, // 0000 GETMET R2 R0 K23 + 0x7C080200, // 0001 CALL R2 1 + 0x8808010B, // 0002 GETMBR R2 R0 K11 + 0x8C080518, // 0003 GETMET R2 R2 K24 + 0x60100008, // 0004 GETGBL R4 G8 + 0x5C140200, // 0005 MOVE R5 R1 + 0x7C100200, // 0006 CALL R4 1 + 0x7C080400, // 0007 CALL R2 2 + 0x80000000, // 0008 RET 0 }) ) ); @@ -3247,15 +2192,15 @@ be_local_closure(class_lvh_obj_get_pad_top, /* name */ be_str_weak(get_pad_top), &be_const_str_solidified, ( &(const binstruction[13]) { /* code */ - 0x88040107, // 0000 GETMBR R1 R0 K7 + 0x88040103, // 0000 GETMBR R1 R0 K3 0x4C080000, // 0001 LDNIL R2 0x20040202, // 0002 NE R1 R1 R2 0x78060007, // 0003 JMPF R1 #000C - 0x88040103, // 0004 GETMBR R1 R0 K3 - 0x8C04035C, // 0005 GETMET R1 R1 K92 - 0x880C0107, // 0006 GETMBR R3 R0 K7 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C040319, // 0005 GETMET R1 R1 K25 + 0x880C0103, // 0006 GETMBR R3 R0 K3 0xB8120A00, // 0007 GETNGBL R4 K5 - 0x88100909, // 0008 GETMBR R4 R4 K9 + 0x88100906, // 0008 GETMBR R4 R4 K6 0x300C0604, // 0009 OR R3 R3 R4 0x7C040400, // 000A CALL R1 2 0x80040200, // 000B RET 1 R1 @@ -3267,9 +2212,157 @@ be_local_closure(class_lvh_obj_get_pad_top, /* name */ /******************************************************************** -** Solidified function: set_radius2 +** Solidified function: member ********************************************************************/ -be_local_closure(class_lvh_obj_set_radius2, /* name */ +be_local_closure(class_lvh_obj_member, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(member), + &be_const_str_solidified, + ( &(const binstruction[125]) { /* code */ + 0xA40A3400, // 0000 IMPORT R2 K26 + 0xA40E3600, // 0001 IMPORT R3 K27 + 0x8C10051C, // 0002 GETMET R4 R2 K28 + 0x5C180200, // 0003 MOVE R6 R1 + 0x581C001D, // 0004 LDCONST R7 K29 + 0x7C100600, // 0005 CALL R4 3 + 0x74120004, // 0006 JMPT R4 #000C + 0x8C10051C, // 0007 GETMET R4 R2 K28 + 0x5C180200, // 0008 MOVE R6 R1 + 0x581C001E, // 0009 LDCONST R7 K30 + 0x7C100600, // 000A CALL R4 3 + 0x78120000, // 000B JMPF R4 #000D + 0x80000800, // 000C RET 0 + 0x4C100000, // 000D LDNIL R4 + 0x6014000C, // 000E GETGBL R5 G12 + 0x5C180200, // 000F MOVE R6 R1 + 0x7C140200, // 0010 CALL R5 1 + 0x28140B1F, // 0011 GE R5 R5 K31 + 0x7816001F, // 0012 JMPF R5 #0033 + 0x8C140520, // 0013 GETMET R5 R2 K32 + 0x541DFFFE, // 0014 LDINT R7 -1 + 0x941C0207, // 0015 GETIDX R7 R1 R7 + 0x7C140400, // 0016 CALL R5 2 + 0x8C180520, // 0017 GETMET R6 R2 K32 + 0x5421FFFD, // 0018 LDINT R8 -2 + 0x94200208, // 0019 GETIDX R8 R1 R8 + 0x7C180400, // 001A CALL R6 2 + 0x541E002F, // 001B LDINT R7 48 + 0x281C0A07, // 001C GE R7 R5 R7 + 0x781E0014, // 001D JMPF R7 #0033 + 0x541E0038, // 001E LDINT R7 57 + 0x181C0A07, // 001F LE R7 R5 R7 + 0x781E0011, // 0020 JMPF R7 #0033 + 0x541E002F, // 0021 LDINT R7 48 + 0x281C0C07, // 0022 GE R7 R6 R7 + 0x781E000E, // 0023 JMPF R7 #0033 + 0x541E0038, // 0024 LDINT R7 57 + 0x181C0C07, // 0025 LE R7 R6 R7 + 0x781E000B, // 0026 JMPF R7 #0033 + 0x601C0009, // 0027 GETGBL R7 G9 + 0x5421FFFD, // 0028 LDINT R8 -2 + 0x40201121, // 0029 CONNECT R8 R8 K33 + 0x94200208, // 002A GETIDX R8 R1 R8 + 0x7C1C0200, // 002B CALL R7 1 + 0x5421FFFC, // 002C LDINT R8 -3 + 0x40222208, // 002D CONNECT R8 K17 R8 + 0x94040208, // 002E GETIDX R1 R1 R8 + 0x8C200122, // 002F GETMET R8 R0 K34 + 0x5C280E00, // 0030 MOVE R10 R7 + 0x7C200400, // 0031 CALL R8 2 + 0x5C101000, // 0032 MOVE R4 R8 + 0x88140123, // 0033 GETMBR R5 R0 K35 + 0x8C140B24, // 0034 GETMET R5 R5 K36 + 0x5C1C0200, // 0035 MOVE R7 R1 + 0x7C140400, // 0036 CALL R5 2 + 0x4C180000, // 0037 LDNIL R6 + 0x20140A06, // 0038 NE R5 R5 R6 + 0x78160000, // 0039 JMPF R5 #003B + 0x80000A00, // 003A RET 0 + 0x8C140725, // 003B GETMET R5 R3 K37 + 0x5C1C0000, // 003C MOVE R7 R0 + 0x00223C01, // 003D ADD R8 K30 R1 + 0x7C140600, // 003E CALL R5 3 + 0x60180004, // 003F GETGBL R6 G4 + 0x5C1C0A00, // 0040 MOVE R7 R5 + 0x7C180200, // 0041 CALL R6 1 + 0x1C180D26, // 0042 EQ R6 R6 K38 + 0x781A0009, // 0043 JMPF R6 #004E + 0x5C180A00, // 0044 MOVE R6 R5 + 0x5C1C0000, // 0045 MOVE R7 R0 + 0x4C200000, // 0046 LDNIL R8 + 0x20200808, // 0047 NE R8 R4 R8 + 0x78220001, // 0048 JMPF R8 #004B + 0x5C200800, // 0049 MOVE R8 R4 + 0x70020000, // 004A JMP #004C + 0x58200011, // 004B LDCONST R8 K17 + 0x7C180400, // 004C CALL R6 2 + 0x80040C00, // 004D RET 1 R6 + 0x88180127, // 004E GETMBR R6 R0 K39 + 0x8C180D24, // 004F GETMET R6 R6 K36 + 0x5C200200, // 0050 MOVE R8 R1 + 0x5C240200, // 0051 MOVE R9 R1 + 0x7C180600, // 0052 CALL R6 3 + 0x5C040C00, // 0053 MOVE R1 R6 + 0x4C180000, // 0054 LDNIL R6 + 0x1C180806, // 0055 EQ R6 R4 R6 + 0x781A000D, // 0056 JMPF R6 #0065 + 0x8C180725, // 0057 GETMET R6 R3 K37 + 0x88200101, // 0058 GETMBR R8 R0 K1 + 0x00263C01, // 0059 ADD R9 K30 R1 + 0x7C180600, // 005A CALL R6 3 + 0x5C140C00, // 005B MOVE R5 R6 + 0x60180004, // 005C GETGBL R6 G4 + 0x5C1C0A00, // 005D MOVE R7 R5 + 0x7C180200, // 005E CALL R6 1 + 0x1C180D26, // 005F EQ R6 R6 K38 + 0x781A0003, // 0060 JMPF R6 #0065 + 0x5C180A00, // 0061 MOVE R6 R5 + 0x881C0101, // 0062 GETMBR R7 R0 K1 + 0x7C180200, // 0063 CALL R6 1 + 0x80040C00, // 0064 RET 1 R6 + 0x8C180725, // 0065 GETMET R6 R3 K37 + 0x88200101, // 0066 GETMBR R8 R0 K1 + 0x00265001, // 0067 ADD R9 K40 R1 + 0x7C180600, // 0068 CALL R6 3 + 0x5C140C00, // 0069 MOVE R5 R6 + 0x60180004, // 006A GETGBL R6 G4 + 0x5C1C0A00, // 006B MOVE R7 R5 + 0x7C180200, // 006C CALL R6 1 + 0x1C180D26, // 006D EQ R6 R6 K38 + 0x781A0009, // 006E JMPF R6 #0079 + 0x5C180A00, // 006F MOVE R6 R5 + 0x881C0101, // 0070 GETMBR R7 R0 K1 + 0x4C200000, // 0071 LDNIL R8 + 0x20200808, // 0072 NE R8 R4 R8 + 0x78220001, // 0073 JMPF R8 #0076 + 0x5C200800, // 0074 MOVE R8 R4 + 0x70020000, // 0075 JMP #0077 + 0x58200011, // 0076 LDCONST R8 K17 + 0x7C180400, // 0077 CALL R6 2 + 0x80040C00, // 0078 RET 1 R6 + 0x6018000B, // 0079 GETGBL R6 G11 + 0x581C0029, // 007A LDCONST R7 K41 + 0x7C180200, // 007B CALL R6 1 + 0x80040C00, // 007C RET 1 R6 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pad_left2 +********************************************************************/ +be_local_closure(class_lvh_obj_set_pad_left2, /* name */ be_nested_proto( 7, /* nstack */ 2, /* argc */ @@ -3280,21 +2373,21 @@ be_local_closure(class_lvh_obj_set_radius2, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_radius2), + be_str_weak(set_pad_left2), &be_const_str_solidified, ( &(const binstruction[15]) { /* code */ - 0x88080107, // 0000 GETMBR R2 R0 K7 + 0x88080103, // 0000 GETMBR R2 R0 K3 0x4C0C0000, // 0001 LDNIL R3 0x20080403, // 0002 NE R2 R2 R3 0x780A0009, // 0003 JMPF R2 #000E - 0x88080103, // 0004 GETMBR R2 R0 K3 - 0x8C08055D, // 0005 GETMET R2 R2 K93 + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C08052A, // 0005 GETMET R2 R2 K42 0x60100009, // 0006 GETGBL R4 G9 0x5C140200, // 0007 MOVE R5 R1 0x7C100200, // 0008 CALL R4 1 - 0x88140107, // 0009 GETMBR R5 R0 K7 + 0x88140103, // 0009 GETMBR R5 R0 K3 0xB81A0A00, // 000A GETNGBL R6 K5 - 0x88180D09, // 000B GETMBR R6 R6 K9 + 0x88180D06, // 000B GETMBR R6 R6 K6 0x30140A06, // 000C OR R5 R5 R6 0x7C080600, // 000D CALL R2 3 0x80000000, // 000E RET 0 @@ -3304,12 +2397,1242 @@ be_local_closure(class_lvh_obj_set_radius2, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: check_label +********************************************************************/ +be_local_closure(class_lvh_obj_check_label, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(check_label), + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0x8804010B, // 0000 GETMBR R1 R0 K11 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x78060013, // 0003 JMPF R1 #0018 + 0xA4063600, // 0004 IMPORT R1 K27 + 0x8C08032B, // 0005 GETMET R2 R1 K43 + 0x88100101, // 0006 GETMBR R4 R0 K1 + 0x58140018, // 0007 LDCONST R5 K24 + 0x7C080600, // 0008 CALL R2 3 + 0x780A0002, // 0009 JMPF R2 #000D + 0x88080101, // 000A GETMBR R2 R0 K1 + 0x90021602, // 000B SETMBR R0 K11 R2 + 0x7002000A, // 000C JMP #0018 + 0xB80A0A00, // 000D GETNGBL R2 K5 + 0x8C08052C, // 000E GETMET R2 R2 K44 + 0x8C10012D, // 000F GETMET R4 R0 K45 + 0x7C100200, // 0010 CALL R4 1 + 0x7C080400, // 0011 CALL R2 2 + 0x90021602, // 0012 SETMBR R0 K11 R2 + 0x8808010B, // 0013 GETMBR R2 R0 K11 + 0x8C08052E, // 0014 GETMET R2 R2 K46 + 0xB8120A00, // 0015 GETNGBL R4 K5 + 0x8810092F, // 0016 GETMBR R4 R4 K47 + 0x7C080400, // 0017 CALL R2 2 + 0x80000000, // 0018 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text_color +********************************************************************/ +be_local_closure(class_lvh_obj_get_text_color, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_text_color), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080101, // 0000 GETMBR R2 R0 K1 + 0x8C080530, // 0001 GETMET R2 R2 K48 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: post_init +********************************************************************/ +be_local_closure(class_lvh_obj_post_init, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(post_init), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040131, // 0000 GETMET R1 R0 K49 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_enabled +********************************************************************/ +be_local_closure(class_lvh_obj_set_enabled, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_enabled), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x78060005, // 0000 JMPF R1 #0007 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x8C080532, // 0002 GETMET R2 R2 K50 + 0xB8120A00, // 0003 GETNGBL R4 K5 + 0x88100916, // 0004 GETMBR R4 R4 K22 + 0x7C080400, // 0005 CALL R2 2 + 0x70020004, // 0006 JMP #000C + 0x88080101, // 0007 GETMBR R2 R0 K1 + 0x8C080533, // 0008 GETMET R2 R2 K51 + 0xB8120A00, // 0009 GETNGBL R4 K5 + 0x88100916, // 000A GETMBR R4 R4 K22 + 0x7C080400, // 000B CALL R2 2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: setmember +********************************************************************/ +be_local_closure(class_lvh_obj_setmember, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(setmember), + &be_const_str_solidified, + ( &(const binstruction[164]) { /* code */ + 0xA40E3400, // 0000 IMPORT R3 K26 + 0xA4123600, // 0001 IMPORT R4 K27 + 0x8C14071C, // 0002 GETMET R5 R3 K28 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5820001D, // 0004 LDCONST R8 K29 + 0x7C140600, // 0005 CALL R5 3 + 0x74160004, // 0006 JMPT R5 #000C + 0x8C14071C, // 0007 GETMET R5 R3 K28 + 0x5C1C0200, // 0008 MOVE R7 R1 + 0x5820001E, // 0009 LDCONST R8 K30 + 0x7C140600, // 000A CALL R5 3 + 0x78160000, // 000B JMPF R5 #000D + 0x80000A00, // 000C RET 0 + 0x60140004, // 000D GETGBL R5 G4 + 0x5C180400, // 000E MOVE R6 R2 + 0x7C140200, // 000F CALL R5 1 + 0x1C140B34, // 0010 EQ R5 R5 K52 + 0x78160006, // 0011 JMPF R5 #0019 + 0xA4166A00, // 0012 IMPORT R5 K53 + 0x60180009, // 0013 GETGBL R6 G9 + 0x8C1C0B36, // 0014 GETMET R7 R5 K54 + 0x5C240400, // 0015 MOVE R9 R2 + 0x7C1C0400, // 0016 CALL R7 2 + 0x7C180200, // 0017 CALL R6 1 + 0x5C080C00, // 0018 MOVE R2 R6 + 0x8C140737, // 0019 GETMET R5 R3 K55 + 0x5C1C0200, // 001A MOVE R7 R1 + 0x58200038, // 001B LDCONST R8 K56 + 0x7C140600, // 001C CALL R5 3 + 0x78160009, // 001D JMPF R5 #0028 + 0x5415FFFD, // 001E LDINT R5 -2 + 0x40162205, // 001F CONNECT R5 K17 R5 + 0x94040205, // 0020 GETIDX R1 R1 R5 + 0xB8160A00, // 0021 GETNGBL R5 K5 + 0x8C140B39, // 0022 GETMET R5 R5 K57 + 0x601C0009, // 0023 GETGBL R7 G9 + 0x5C200400, // 0024 MOVE R8 R2 + 0x7C1C0200, // 0025 CALL R7 1 + 0x7C140400, // 0026 CALL R5 2 + 0x5C080A00, // 0027 MOVE R2 R5 + 0x4C140000, // 0028 LDNIL R5 + 0x6018000C, // 0029 GETGBL R6 G12 + 0x5C1C0200, // 002A MOVE R7 R1 + 0x7C180200, // 002B CALL R6 1 + 0x28180D1F, // 002C GE R6 R6 K31 + 0x781A001F, // 002D JMPF R6 #004E + 0x8C180720, // 002E GETMET R6 R3 K32 + 0x5421FFFE, // 002F LDINT R8 -1 + 0x94200208, // 0030 GETIDX R8 R1 R8 + 0x7C180400, // 0031 CALL R6 2 + 0x8C1C0720, // 0032 GETMET R7 R3 K32 + 0x5425FFFD, // 0033 LDINT R9 -2 + 0x94240209, // 0034 GETIDX R9 R1 R9 + 0x7C1C0400, // 0035 CALL R7 2 + 0x5422002F, // 0036 LDINT R8 48 + 0x28200C08, // 0037 GE R8 R6 R8 + 0x78220014, // 0038 JMPF R8 #004E + 0x54220038, // 0039 LDINT R8 57 + 0x18200C08, // 003A LE R8 R6 R8 + 0x78220011, // 003B JMPF R8 #004E + 0x5422002F, // 003C LDINT R8 48 + 0x28200E08, // 003D GE R8 R7 R8 + 0x7822000E, // 003E JMPF R8 #004E + 0x54220038, // 003F LDINT R8 57 + 0x18200E08, // 0040 LE R8 R7 R8 + 0x7822000B, // 0041 JMPF R8 #004E + 0x60200009, // 0042 GETGBL R8 G9 + 0x5425FFFD, // 0043 LDINT R9 -2 + 0x40241321, // 0044 CONNECT R9 R9 K33 + 0x94240209, // 0045 GETIDX R9 R1 R9 + 0x7C200200, // 0046 CALL R8 1 + 0x5425FFFC, // 0047 LDINT R9 -3 + 0x40262209, // 0048 CONNECT R9 K17 R9 + 0x94040209, // 0049 GETIDX R1 R1 R9 + 0x8C240122, // 004A GETMET R9 R0 K34 + 0x5C2C1000, // 004B MOVE R11 R8 + 0x7C240400, // 004C CALL R9 2 + 0x5C141200, // 004D MOVE R5 R9 + 0x88180123, // 004E GETMBR R6 R0 K35 + 0x8C180D24, // 004F GETMET R6 R6 K36 + 0x5C200200, // 0050 MOVE R8 R1 + 0x7C180400, // 0051 CALL R6 2 + 0x4C1C0000, // 0052 LDNIL R7 + 0x20180C07, // 0053 NE R6 R6 R7 + 0x781A0000, // 0054 JMPF R6 #0056 + 0x80000C00, // 0055 RET 0 + 0x8C180925, // 0056 GETMET R6 R4 K37 + 0x5C200000, // 0057 MOVE R8 R0 + 0x00263A01, // 0058 ADD R9 K29 R1 + 0x7C180600, // 0059 CALL R6 3 + 0x601C0004, // 005A GETGBL R7 G4 + 0x5C200C00, // 005B MOVE R8 R6 + 0x7C1C0200, // 005C CALL R7 1 + 0x1C1C0F26, // 005D EQ R7 R7 K38 + 0x781E000A, // 005E JMPF R7 #006A + 0x5C1C0C00, // 005F MOVE R7 R6 + 0x5C200000, // 0060 MOVE R8 R0 + 0x5C240400, // 0061 MOVE R9 R2 + 0x4C280000, // 0062 LDNIL R10 + 0x20280A0A, // 0063 NE R10 R5 R10 + 0x782A0001, // 0064 JMPF R10 #0067 + 0x5C280A00, // 0065 MOVE R10 R5 + 0x70020000, // 0066 JMP #0068 + 0x58280011, // 0067 LDCONST R10 K17 + 0x7C1C0600, // 0068 CALL R7 3 + 0x80000E00, // 0069 RET 0 + 0x881C0127, // 006A GETMBR R7 R0 K39 + 0x8C1C0F24, // 006B GETMET R7 R7 K36 + 0x5C240200, // 006C MOVE R9 R1 + 0x5C280200, // 006D MOVE R10 R1 + 0x7C1C0600, // 006E CALL R7 3 + 0x5C040E00, // 006F MOVE R1 R7 + 0x8C1C013A, // 0070 GETMET R7 R0 K58 + 0x5C240200, // 0071 MOVE R9 R1 + 0x7C1C0400, // 0072 CALL R7 2 + 0x781E0003, // 0073 JMPF R7 #0078 + 0x8C1C0108, // 0074 GETMET R7 R0 K8 + 0x5C240400, // 0075 MOVE R9 R2 + 0x7C1C0400, // 0076 CALL R7 2 + 0x5C080E00, // 0077 MOVE R2 R7 + 0x4C1C0000, // 0078 LDNIL R7 + 0x1C1C0A07, // 0079 EQ R7 R5 R7 + 0x781E000E, // 007A JMPF R7 #008A + 0x8C1C0925, // 007B GETMET R7 R4 K37 + 0x88240101, // 007C GETMBR R9 R0 K1 + 0x002A3A01, // 007D ADD R10 K29 R1 + 0x7C1C0600, // 007E CALL R7 3 + 0x5C180E00, // 007F MOVE R6 R7 + 0x601C0004, // 0080 GETGBL R7 G4 + 0x5C200C00, // 0081 MOVE R8 R6 + 0x7C1C0200, // 0082 CALL R7 1 + 0x1C1C0F26, // 0083 EQ R7 R7 K38 + 0x781E0004, // 0084 JMPF R7 #008A + 0x5C1C0C00, // 0085 MOVE R7 R6 + 0x88200101, // 0086 GETMBR R8 R0 K1 + 0x5C240400, // 0087 MOVE R9 R2 + 0x7C1C0400, // 0088 CALL R7 2 + 0x80040E00, // 0089 RET 1 R7 + 0x8C1C0925, // 008A GETMET R7 R4 K37 + 0x88240101, // 008B GETMBR R9 R0 K1 + 0x002A7601, // 008C ADD R10 K59 R1 + 0x7C1C0600, // 008D CALL R7 3 + 0x5C180E00, // 008E MOVE R6 R7 + 0x601C0004, // 008F GETGBL R7 G4 + 0x5C200C00, // 0090 MOVE R8 R6 + 0x7C1C0200, // 0091 CALL R7 1 + 0x1C1C0F26, // 0092 EQ R7 R7 K38 + 0x781E000A, // 0093 JMPF R7 #009F + 0x5C1C0C00, // 0094 MOVE R7 R6 + 0x88200101, // 0095 GETMBR R8 R0 K1 + 0x5C240400, // 0096 MOVE R9 R2 + 0x4C280000, // 0097 LDNIL R10 + 0x20280A0A, // 0098 NE R10 R5 R10 + 0x782A0001, // 0099 JMPF R10 #009C + 0x5C280A00, // 009A MOVE R10 R5 + 0x70020000, // 009B JMP #009D + 0x58280011, // 009C LDCONST R10 K17 + 0x7C1C0600, // 009D CALL R7 3 + 0x80040E00, // 009E RET 1 R7 + 0x601C0001, // 009F GETGBL R7 G1 + 0x5820003C, // 00A0 LDCONST R8 K60 + 0x5C240200, // 00A1 MOVE R9 R1 + 0x7C1C0400, // 00A2 CALL R7 2 + 0x80000000, // 00A3 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_toggle +********************************************************************/ +be_local_closure(class_lvh_obj_set_toggle, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_toggle), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0xA40A3400, // 0000 IMPORT R2 K26 + 0x600C0004, // 0001 GETGBL R3 G4 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x1C0C071A, // 0004 EQ R3 R3 K26 + 0x780E000C, // 0005 JMPF R3 #0013 + 0x8C0C053D, // 0006 GETMET R3 R2 K61 + 0x60140008, // 0007 GETGBL R5 G8 + 0x5C180200, // 0008 MOVE R6 R1 + 0x7C140200, // 0009 CALL R5 1 + 0x7C0C0400, // 000A CALL R3 2 + 0x5C040600, // 000B MOVE R1 R3 + 0x1C0C033E, // 000C EQ R3 R1 K62 + 0x780E0001, // 000D JMPF R3 #0010 + 0x50040200, // 000E LDBOOL R1 1 0 + 0x70020002, // 000F JMP #0013 + 0x1C0C033F, // 0010 EQ R3 R1 K63 + 0x780E0000, // 0011 JMPF R3 #0013 + 0x50040000, // 0012 LDBOOL R1 0 0 + 0x78060005, // 0013 JMPF R1 #001A + 0x880C0101, // 0014 GETMBR R3 R0 K1 + 0x8C0C0733, // 0015 GETMET R3 R3 K51 + 0xB8160A00, // 0016 GETNGBL R5 K5 + 0x88140B40, // 0017 GETMBR R5 R5 K64 + 0x7C0C0400, // 0018 CALL R3 2 + 0x70020004, // 0019 JMP #001F + 0x880C0101, // 001A GETMBR R3 R0 K1 + 0x8C0C0732, // 001B GETMET R3 R3 K50 + 0xB8160A00, // 001C GETNGBL R5 K5 + 0x88140B40, // 001D GETMBR R5 R5 K64 + 0x7C0C0400, // 001E CALL R3 2 + 0x80000000, // 001F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pad_all2 +********************************************************************/ +be_local_closure(class_lvh_obj_set_pad_all2, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_pad_all2), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x88080103, // 0000 GETMBR R2 R0 K3 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0009, // 0003 JMPF R2 #000E + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C080541, // 0005 GETMET R2 R2 K65 + 0x60100009, // 0006 GETGBL R4 G9 + 0x5C140200, // 0007 MOVE R5 R1 + 0x7C100200, // 0008 CALL R4 1 + 0x88140103, // 0009 GETMBR R5 R0 K3 + 0xB81A0A00, // 000A GETNGBL R6 K5 + 0x88180D06, // 000B GETMBR R6 R6 K6 + 0x30140A06, // 000C OR R5 R5 R6 + 0x7C080600, // 000D CALL R2 3 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_value_ofs_x +********************************************************************/ +be_local_closure(class_lvh_obj_get_value_ofs_x, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_value_ofs_x), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8804010B, // 0000 GETMBR R1 R0 K11 + 0x8C040342, // 0001 GETMET R1 R1 K66 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_value_ofs_x +********************************************************************/ +be_local_closure(class_lvh_obj_set_value_ofs_x, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_value_ofs_x), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x8C080117, // 0000 GETMET R2 R0 K23 + 0x7C080200, // 0001 CALL R2 1 + 0x8808010B, // 0002 GETMBR R2 R0 K11 + 0x8C080543, // 0003 GETMET R2 R2 K67 + 0x60100009, // 0004 GETGBL R4 G9 + 0x5C140200, // 0005 MOVE R5 R1 + 0x7C100200, // 0006 CALL R4 1 + 0x7C080400, // 0007 CALL R2 2 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_action +********************************************************************/ +be_local_closure(class_lvh_obj_set_action, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_action), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x90028802, // 0003 SETMBR R0 K68 R2 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_action +********************************************************************/ +be_local_closure(class_lvh_obj_get_action, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_action), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040144, // 0000 GETMBR R1 R0 K68 + 0x78060001, // 0001 JMPF R1 #0004 + 0x5C080200, // 0002 MOVE R2 R1 + 0x70020000, // 0003 JMP #0005 + 0x58080045, // 0004 LDCONST R2 K69 + 0x80040400, // 0005 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_flex_in_new_track +********************************************************************/ +be_local_closure(class_lvh_obj_get_flex_in_new_track, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_flex_in_new_track), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x8C040346, // 0001 GETMET R1 R1 K70 + 0xB80E0A00, // 0002 GETNGBL R3 K5 + 0x880C0747, // 0003 GETMBR R3 R3 K71 + 0x7C040400, // 0004 CALL R1 2 + 0x80040200, // 0005 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_flex_in_new_track +********************************************************************/ +be_local_closure(class_lvh_obj_set_flex_in_new_track, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_flex_in_new_track), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x78060005, // 0000 JMPF R1 #0007 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x8C080548, // 0002 GETMET R2 R2 K72 + 0xB8120A00, // 0003 GETNGBL R4 K5 + 0x88100947, // 0004 GETMBR R4 R4 K71 + 0x7C080400, // 0005 CALL R2 2 + 0x70020004, // 0006 JMP #000C + 0x88080101, // 0007 GETMBR R2 R0 K1 + 0x8C080549, // 0008 GETMET R2 R2 K73 + 0xB8120A00, // 0009 GETNGBL R4 K5 + 0x88100947, // 000A GETMBR R4 R4 K71 + 0x7C080400, // 000B CALL R2 2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_label_mode +********************************************************************/ +be_local_closure(class_lvh_obj_set_label_mode, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_label_mode), + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C0C034A, // 0001 EQ R3 R1 K74 + 0x780E0005, // 0002 JMPF R3 #0009 + 0x880C0101, // 0003 GETMBR R3 R0 K1 + 0x8C0C074B, // 0004 GETMET R3 R3 K75 + 0xB8160A00, // 0005 GETNGBL R5 K5 + 0x88140B4C, // 0006 GETMBR R5 R5 K76 + 0x7C0C0400, // 0007 CALL R3 2 + 0x70020017, // 0008 JMP #0021 + 0x1C0C034D, // 0009 EQ R3 R1 K77 + 0x780E0002, // 000A JMPF R3 #000E + 0xB80E0A00, // 000B GETNGBL R3 K5 + 0x8808074E, // 000C GETMBR R2 R3 K78 + 0x70020012, // 000D JMP #0021 + 0x1C0C034F, // 000E EQ R3 R1 K79 + 0x780E0002, // 000F JMPF R3 #0013 + 0xB80E0A00, // 0010 GETNGBL R3 K5 + 0x88080750, // 0011 GETMBR R2 R3 K80 + 0x7002000D, // 0012 JMP #0021 + 0x1C0C0351, // 0013 EQ R3 R1 K81 + 0x780E0002, // 0014 JMPF R3 #0018 + 0xB80E0A00, // 0015 GETNGBL R3 K5 + 0x88080752, // 0016 GETMBR R2 R3 K82 + 0x70020008, // 0017 JMP #0021 + 0x1C0C0353, // 0018 EQ R3 R1 K83 + 0x780E0002, // 0019 JMPF R3 #001D + 0xB80E0A00, // 001A GETNGBL R3 K5 + 0x88080754, // 001B GETMBR R2 R3 K84 + 0x70020003, // 001C JMP #0021 + 0x1C0C0355, // 001D EQ R3 R1 K85 + 0x780E0001, // 001E JMPF R3 #0021 + 0xB80E0A00, // 001F GETNGBL R3 K5 + 0x88080756, // 0020 GETMBR R2 R3 K86 + 0x4C0C0000, // 0021 LDNIL R3 + 0x200C0403, // 0022 NE R3 R2 R3 + 0x780E0005, // 0023 JMPF R3 #002A + 0x8C0C0117, // 0024 GETMET R3 R0 K23 + 0x7C0C0200, // 0025 CALL R3 1 + 0x880C010B, // 0026 GETMBR R3 R0 K11 + 0x8C0C0757, // 0027 GETMET R3 R3 K87 + 0x5C140400, // 0028 MOVE R5 R2 + 0x7C0C0400, // 0029 CALL R3 2 + 0x80000000, // 002A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_sub_id +********************************************************************/ +be_local_closure(class_lvh_obj_get_sub_id, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_sub_id), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C040000, // 0000 LDNIL R1 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pad_bottom2 +********************************************************************/ +be_local_closure(class_lvh_obj_set_pad_bottom2, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_pad_bottom2), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x88080103, // 0000 GETMBR R2 R0 K3 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0009, // 0003 JMPF R2 #000E + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C080558, // 0005 GETMET R2 R2 K88 + 0x60100009, // 0006 GETGBL R4 G9 + 0x5C140200, // 0007 MOVE R5 R1 + 0x7C100200, // 0008 CALL R4 1 + 0x88140103, // 0009 GETMBR R5 R0 K3 + 0xB81A0A00, // 000A GETNGBL R6 K5 + 0x88180D06, // 000B GETMBR R6 R6 K6 + 0x30140A06, // 000C OR R5 R5 R6 + 0x7C080600, // 000D CALL R2 3 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_val +********************************************************************/ +be_local_closure(class_lvh_obj_set_val, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_val), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0xA40A3600, // 0000 IMPORT R2 K27 + 0x9002B201, // 0001 SETMBR R0 K89 R1 + 0x8C0C052B, // 0002 GETMET R3 R2 K43 + 0x88140101, // 0003 GETMBR R5 R0 K1 + 0x5818005A, // 0004 LDCONST R6 K90 + 0x7C0C0600, // 0005 CALL R3 3 + 0x780E0003, // 0006 JMPF R3 #000B + 0x880C0101, // 0007 GETMBR R3 R0 K1 + 0x8C0C075A, // 0008 GETMET R3 R3 K90 + 0x5C140200, // 0009 MOVE R5 R1 + 0x7C0C0400, // 000A CALL R3 2 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_hidden +********************************************************************/ +be_local_closure(class_lvh_obj_get_hidden, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_hidden), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x8C040346, // 0001 GETMET R1 R1 K70 + 0xB80E0A00, // 0002 GETNGBL R3 K5 + 0x880C075B, // 0003 GETMBR R3 R3 K91 + 0x7C040400, // 0004 CALL R1 2 + 0x80040200, // 0005 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_click +********************************************************************/ +be_local_closure(class_lvh_obj_get_click, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_click), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C04015C, // 0000 GETMET R1 R0 K92 + 0x7C040200, // 0001 CALL R1 1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text +********************************************************************/ +be_local_closure(class_lvh_obj_get_text, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_text), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x8804010B, // 0000 GETMBR R1 R0 K11 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x78060001, // 0003 JMPF R1 #0006 + 0x4C040000, // 0004 LDNIL R1 + 0x80040200, // 0005 RET 1 R1 + 0x8804010B, // 0006 GETMBR R1 R0 K11 + 0x8C04035D, // 0007 GETMET R1 R1 K93 + 0x7C040200, // 0008 CALL R1 1 + 0x80040200, // 0009 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_value_color +********************************************************************/ +be_local_closure(class_lvh_obj_get_value_color, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_value_color), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C04015E, // 0000 GETMET R1 R0 K94 + 0x7C040200, // 0001 CALL R1 1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_label_mode +********************************************************************/ +be_local_closure(class_lvh_obj_get_label_mode, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_label_mode), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x8804010B, // 0000 GETMBR R1 R0 K11 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060003, // 0003 JMPF R1 #0008 + 0x8804010B, // 0004 GETMBR R1 R0 K11 + 0x8C04035F, // 0005 GETMET R1 R1 K95 + 0x7C040200, // 0006 CALL R1 1 + 0x80040200, // 0007 RET 1 R1 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_adjustable +********************************************************************/ +be_local_closure(class_lvh_obj_set_adjustable, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_adjustable), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x78060005, // 0000 JMPF R1 #0007 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x8C080548, // 0002 GETMET R2 R2 K72 + 0xB8120A00, // 0003 GETNGBL R4 K5 + 0x88100960, // 0004 GETMBR R4 R4 K96 + 0x7C080400, // 0005 CALL R2 2 + 0x70020004, // 0006 JMP #000C + 0x88080101, // 0007 GETMBR R2 R0 K1 + 0x8C080549, // 0008 GETMET R2 R2 K73 + 0xB8120A00, // 0009 GETNGBL R4 K5 + 0x88100960, // 000A GETMBR R4 R4 K96 + 0x7C080400, // 000B CALL R2 2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_val +********************************************************************/ +be_local_closure(class_lvh_obj_get_val, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_val), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x8C040361, // 0001 GETMET R1 R1 K97 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text_font +********************************************************************/ +be_local_closure(class_lvh_obj_set_text_font, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_text_font), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x8C080162, // 0000 GETMET R2 R0 K98 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x4C0C0000, // 0003 LDNIL R3 + 0x200C0403, // 0004 NE R3 R2 R3 + 0x780E0004, // 0005 JMPF R3 #000B + 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0x8C0C0763, // 0007 GETMET R3 R3 K99 + 0x5C140400, // 0008 MOVE R5 R2 + 0x58180011, // 0009 LDCONST R6 K17 + 0x7C0C0600, // 000A CALL R3 3 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_radius2 +********************************************************************/ +be_local_closure(class_lvh_obj_get_radius2, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_radius2), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x88040103, // 0000 GETMBR R1 R0 K3 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060007, // 0003 JMPF R1 #000C + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C040364, // 0005 GETMET R1 R1 K100 + 0x880C0103, // 0006 GETMBR R3 R0 K3 + 0xB8120A00, // 0007 GETNGBL R4 K5 + 0x88100906, // 0008 GETMBR R4 R4 K6 + 0x300C0604, // 0009 OR R3 R3 R4 + 0x7C040400, // 000A CALL R1 2 + 0x80040200, // 000B RET 1 R1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pad_top2 +********************************************************************/ +be_local_closure(class_lvh_obj_set_pad_top2, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_pad_top2), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x88080103, // 0000 GETMBR R2 R0 K3 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0009, // 0003 JMPF R2 #000E + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C080565, // 0005 GETMET R2 R2 K101 + 0x60100009, // 0006 GETGBL R4 G9 + 0x5C140200, // 0007 MOVE R5 R1 + 0x7C100200, // 0008 CALL R4 1 + 0x88140103, // 0009 GETMBR R5 R0 K3 + 0xB81A0A00, // 000A GETNGBL R6 K5 + 0x88180D06, // 000B GETMBR R6 R6 K6 + 0x30140A06, // 000C OR R5 R5 R6 + 0x7C080600, // 000D CALL R2 3 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_value_font +********************************************************************/ +be_local_closure(class_lvh_obj_set_value_font, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_value_font), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C080166, // 0000 GETMET R2 R0 K102 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_click +********************************************************************/ +be_local_closure(class_lvh_obj_set_click, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_click), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C080167, // 0000 GETMET R2 R0 K103 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pad_right2 +********************************************************************/ +be_local_closure(class_lvh_obj_set_pad_right2, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_pad_right2), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x88080103, // 0000 GETMBR R2 R0 K3 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0009, // 0003 JMPF R2 #000E + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C080568, // 0005 GETMET R2 R2 K104 + 0x60100009, // 0006 GETGBL R4 G9 + 0x5C140200, // 0007 MOVE R5 R1 + 0x7C100200, // 0008 CALL R4 1 + 0x88140103, // 0009 GETMBR R5 R0 K3 + 0xB81A0A00, // 000A GETNGBL R6 K5 + 0x88180D06, // 000B GETMBR R6 R6 K6 + 0x30140A06, // 000C OR R5 R5 R6 + 0x7C080600, // 000D CALL R2 3 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_value_color +********************************************************************/ +be_local_closure(class_lvh_obj_set_value_color, /* name */ + be_nested_proto( + 7, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_value_color), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x8C0C0169, // 0000 GETMET R3 R0 K105 + 0x5C140200, // 0001 MOVE R5 R1 + 0x5C180400, // 0002 MOVE R6 R2 + 0x7C0C0600, // 0003 CALL R3 3 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_adjustable +********************************************************************/ +be_local_closure(class_lvh_obj_get_adjustable, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_adjustable), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x8C040346, // 0001 GETMET R1 R1 K70 + 0xB80E0A00, // 0002 GETNGBL R3 K5 + 0x880C0760, // 0003 GETMBR R3 R3 K96 + 0x7C040400, // 0004 CALL R1 2 + 0x80040200, // 0005 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: event_cb ********************************************************************/ be_local_closure(class_lvh_obj_event_cb, /* name */ be_nested_proto( - 15, /* nstack */ + 16, /* nstack */ 2, /* argc */ 10, /* varg */ 0, /* has upvals */ @@ -3344,28 +3667,38 @@ be_local_closure(class_lvh_obj_event_cb, /* name */ }) ), be_nested_proto( - 3, /* nstack */ + 5, /* nstack */ 0, /* argc */ 0, /* varg */ 1, /* has upvals */ ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 7), + be_local_const_upval(1, 9), }), 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ + ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(tasmota), /* K1 */ be_nested_str_weak(publish_rule), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(HSP_X3A_X20publish_X20_X25s), }), - be_str_weak(_X3Clambda_X3E), + be_str_weak(_anonymous_), &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ + ( &(const binstruction[13]) { /* code */ 0xB8020000, // 0000 GETNGBL R0 K0 0x8C000101, // 0001 GETMET R0 R0 K1 0x68080000, // 0002 GETUPV R2 U0 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 + 0xB8020000, // 0004 GETNGBL R0 K0 + 0x8C000102, // 0005 GETMET R0 R0 K2 + 0x60080018, // 0006 GETGBL R2 G24 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x68100000, // 0008 GETUPV R4 U0 + 0x7C080400, // 0009 CALL R2 2 + 0x540E0003, // 000A LDINT R3 4 + 0x7C000600, // 000B CALL R0 3 + 0x80000000, // 000C RET 0 }) ), }), @@ -3373,91 +3706,112 @@ be_local_closure(class_lvh_obj_event_cb, /* name */ &be_ktab_class_lvh_obj, /* shared constants */ be_str_weak(event_cb), &be_const_str_solidified, - ( &(const binstruction[84]) { /* code */ - 0x88080115, // 0000 GETMBR R2 R0 K21 - 0x88080516, // 0001 GETMBR R2 R2 K22 - 0x8C0C035E, // 0002 GETMET R3 R1 K94 + ( &(const binstruction[105]) { /* code */ + 0x8808010E, // 0000 GETMBR R2 R0 K14 + 0x8808050F, // 0001 GETMBR R2 R2 K15 + 0x8C0C036A, // 0002 GETMET R3 R1 K106 0x7C0C0200, // 0003 CALL R3 1 - 0x8810015F, // 0004 GETMBR R4 R0 K95 - 0x20100946, // 0005 NE R4 R4 K70 - 0x78120008, // 0006 JMPF R4 #0010 + 0x8810016B, // 0004 GETMBR R4 R0 K107 + 0x20100945, // 0005 NE R4 R4 K69 + 0x78120007, // 0006 JMPF R4 #000F 0xB8120A00, // 0007 GETNGBL R4 K5 - 0x88100960, // 0008 GETMBR R4 R4 K96 + 0x8810096C, // 0008 GETMBR R4 R4 K108 0x1C100604, // 0009 EQ R4 R3 R4 - 0x78120004, // 000A JMPF R4 #0010 - 0xB812C200, // 000B GETNGBL R4 K97 - 0x8C100962, // 000C GETMET R4 R4 K98 - 0x58180018, // 000D LDCONST R6 K24 - 0x841C0000, // 000E CLOSURE R7 P0 - 0x7C100600, // 000F CALL R4 3 - 0x88100163, // 0010 GETMBR R4 R0 K99 - 0x8C100935, // 0011 GETMET R4 R4 K53 - 0x5C180600, // 0012 MOVE R6 R3 - 0x7C100400, // 0013 CALL R4 2 - 0x4C140000, // 0014 LDNIL R5 - 0x20140805, // 0015 NE R5 R4 R5 - 0x7816003A, // 0016 JMPF R5 #0052 - 0xA416C800, // 0017 IMPORT R5 K100 - 0x58180046, // 0018 LDCONST R6 K70 - 0xB81E0A00, // 0019 GETNGBL R7 K5 - 0x881C0F65, // 001A GETMBR R7 R7 K101 - 0x1C1C0607, // 001B EQ R7 R3 R7 - 0x781E0026, // 001C JMPF R7 #0044 - 0xA41E1C00, // 001D IMPORT R7 K14 - 0x8C200F36, // 001E GETMET R8 R7 K54 - 0x5C280000, // 001F MOVE R10 R0 - 0x502C0200, // 0020 LDBOOL R11 1 0 - 0x7C200600, // 0021 CALL R8 3 - 0x4C240000, // 0022 LDNIL R9 - 0x20241009, // 0023 NE R9 R8 R9 - 0x7826000B, // 0024 JMPF R9 #0031 - 0x60240004, // 0025 GETGBL R9 G4 - 0x5C281000, // 0026 MOVE R10 R8 - 0x7C240200, // 0027 CALL R9 1 - 0x20241366, // 0028 NE R9 R9 K102 - 0x78260006, // 0029 JMPF R9 #0031 - 0x60240018, // 002A GETGBL R9 G24 - 0x58280067, // 002B LDCONST R10 K103 - 0x8C2C0B68, // 002C GETMET R11 R5 K104 - 0x5C341000, // 002D MOVE R13 R8 - 0x7C2C0400, // 002E CALL R11 2 - 0x7C240400, // 002F CALL R9 2 - 0x5C181200, // 0030 MOVE R6 R9 - 0x8C240F36, // 0031 GETMET R9 R7 K54 - 0x5C2C0000, // 0032 MOVE R11 R0 - 0x50300200, // 0033 LDBOOL R12 1 0 - 0x7C240600, // 0034 CALL R9 3 - 0x4C280000, // 0035 LDNIL R10 - 0x2028120A, // 0036 NE R10 R9 R10 - 0x782A000B, // 0037 JMPF R10 #0044 - 0x60280004, // 0038 GETGBL R10 G4 - 0x5C2C1200, // 0039 MOVE R11 R9 - 0x7C280200, // 003A CALL R10 1 - 0x20281566, // 003B NE R10 R10 K102 - 0x782A0006, // 003C JMPF R10 #0044 - 0x60280018, // 003D GETGBL R10 G24 - 0x582C0069, // 003E LDCONST R11 K105 - 0x8C300B68, // 003F GETMET R12 R5 K104 - 0x5C381200, // 0040 MOVE R14 R9 - 0x7C300400, // 0041 CALL R12 2 - 0x7C280400, // 0042 CALL R10 2 - 0x00180C0A, // 0043 ADD R6 R6 R10 - 0x601C0018, // 0044 GETGBL R7 G24 - 0x5820006A, // 0045 LDCONST R8 K106 - 0x88240115, // 0046 GETMBR R9 R0 K21 - 0x8824136B, // 0047 GETMBR R9 R9 K107 - 0x8828016C, // 0048 GETMBR R10 R0 K108 - 0x5C2C0800, // 0049 MOVE R11 R4 - 0x5C300C00, // 004A MOVE R12 R6 - 0x7C1C0A00, // 004B CALL R7 5 - 0xB822C200, // 004C GETNGBL R8 K97 - 0x8C201162, // 004D GETMET R8 R8 K98 - 0x58280018, // 004E LDCONST R10 K24 - 0x842C0001, // 004F CLOSURE R11 P1 - 0x7C200600, // 0050 CALL R8 3 - 0xA0140000, // 0051 CLOSE R5 - 0xA0000000, // 0052 CLOSE R0 - 0x80000000, // 0053 RET 0 + 0x78120003, // 000A JMPF R4 #000F + 0xB812DA00, // 000B GETNGBL R4 K109 + 0x8C10096E, // 000C GETMET R4 R4 K110 + 0x84180000, // 000D CLOSURE R6 P0 + 0x7C100400, // 000E CALL R4 2 + 0x8810016F, // 000F GETMBR R4 R0 K111 + 0x8C100924, // 0010 GETMET R4 R4 K36 + 0x5C180600, // 0011 MOVE R6 R3 + 0x7C100400, // 0012 CALL R4 2 + 0x4C140000, // 0013 LDNIL R5 + 0x20140805, // 0014 NE R5 R4 R5 + 0x78160050, // 0015 JMPF R5 #0067 + 0xA416E000, // 0016 IMPORT R5 K112 + 0x58180045, // 0017 LDCONST R6 K69 + 0xB81E0A00, // 0018 GETNGBL R7 K5 + 0x881C0F71, // 0019 GETMBR R7 R7 K113 + 0x1C1C0607, // 001A EQ R7 R3 R7 + 0x781E0026, // 001B JMPF R7 #0043 + 0xA41E3600, // 001C IMPORT R7 K27 + 0x8C200F25, // 001D GETMET R8 R7 K37 + 0x5C280000, // 001E MOVE R10 R0 + 0x582C0072, // 001F LDCONST R11 K114 + 0x7C200600, // 0020 CALL R8 3 + 0x4C240000, // 0021 LDNIL R9 + 0x20241009, // 0022 NE R9 R8 R9 + 0x7826000B, // 0023 JMPF R9 #0030 + 0x60240004, // 0024 GETGBL R9 G4 + 0x5C281000, // 0025 MOVE R10 R8 + 0x7C240200, // 0026 CALL R9 1 + 0x20241373, // 0027 NE R9 R9 K115 + 0x78260006, // 0028 JMPF R9 #0030 + 0x60240018, // 0029 GETGBL R9 G24 + 0x58280074, // 002A LDCONST R10 K116 + 0x8C2C0B75, // 002B GETMET R11 R5 K117 + 0x5C341000, // 002C MOVE R13 R8 + 0x7C2C0400, // 002D CALL R11 2 + 0x7C240400, // 002E CALL R9 2 + 0x5C181200, // 002F MOVE R6 R9 + 0x8C240F25, // 0030 GETMET R9 R7 K37 + 0x5C2C0000, // 0031 MOVE R11 R0 + 0x58300076, // 0032 LDCONST R12 K118 + 0x7C240600, // 0033 CALL R9 3 + 0x4C280000, // 0034 LDNIL R10 + 0x2028120A, // 0035 NE R10 R9 R10 + 0x782A000B, // 0036 JMPF R10 #0043 + 0x60280004, // 0037 GETGBL R10 G4 + 0x5C2C1200, // 0038 MOVE R11 R9 + 0x7C280200, // 0039 CALL R10 1 + 0x20281573, // 003A NE R10 R10 K115 + 0x782A0006, // 003B JMPF R10 #0043 + 0x60280018, // 003C GETGBL R10 G24 + 0x582C0077, // 003D LDCONST R11 K119 + 0x8C300B75, // 003E GETMET R12 R5 K117 + 0x5C381200, // 003F MOVE R14 R9 + 0x7C300400, // 0040 CALL R12 2 + 0x7C280400, // 0041 CALL R10 2 + 0x00180C0A, // 0042 ADD R6 R6 R10 + 0x881C0178, // 0043 GETMBR R7 R0 K120 + 0x4C200000, // 0044 LDNIL R8 + 0x201C0E08, // 0045 NE R7 R7 R8 + 0x781E0006, // 0046 JMPF R7 #004E + 0x601C0018, // 0047 GETGBL R7 G24 + 0x58200079, // 0048 LDCONST R8 K121 + 0x8C240B75, // 0049 GETMET R9 R5 K117 + 0x882C0178, // 004A GETMBR R11 R0 K120 + 0x7C240400, // 004B CALL R9 2 + 0x7C1C0400, // 004C CALL R7 2 + 0x00180C07, // 004D ADD R6 R6 R7 + 0x8C1C017A, // 004E GETMET R7 R0 K122 + 0x7C1C0200, // 004F CALL R7 1 + 0x4C200000, // 0050 LDNIL R8 + 0x20200E08, // 0051 NE R8 R7 R8 + 0x78220004, // 0052 JMPF R8 #0058 + 0x60200008, // 0053 GETGBL R8 G8 + 0x5C240E00, // 0054 MOVE R9 R7 + 0x7C200200, // 0055 CALL R8 1 + 0x0022F608, // 0056 ADD R8 K123 R8 + 0x70020000, // 0057 JMP #0059 + 0x58200045, // 0058 LDCONST R8 K69 + 0x60240018, // 0059 GETGBL R9 G24 + 0x5828007C, // 005A LDCONST R10 K124 + 0x882C010E, // 005B GETMBR R11 R0 K14 + 0x882C177D, // 005C GETMBR R11 R11 K125 + 0x8830017E, // 005D GETMBR R12 R0 K126 + 0x5C341000, // 005E MOVE R13 R8 + 0x5C380800, // 005F MOVE R14 R4 + 0x5C3C0C00, // 0060 MOVE R15 R6 + 0x7C240C00, // 0061 CALL R9 6 + 0xB82ADA00, // 0062 GETNGBL R10 K109 + 0x8C28156E, // 0063 GETMET R10 R10 K110 + 0x84300001, // 0064 CLOSURE R12 P1 + 0x7C280400, // 0065 CALL R10 2 + 0xA0140000, // 0066 CLOSE R5 + 0xA0000000, // 0067 CLOSE R0 + 0x80000000, // 0068 RET 0 }) ) ); @@ -3465,36 +3819,12 @@ be_local_closure(class_lvh_obj_event_cb, /* name */ /******************************************************************** -** Solidified function: get_pad_all +** Solidified function: get_line_width ********************************************************************/ -be_local_closure(class_lvh_obj_get_pad_all, /* name */ - be_nested_proto( - 1, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_pad_all), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_pad_bottom -********************************************************************/ -be_local_closure(class_lvh_obj_get_pad_bottom, /* name */ +be_local_closure(class_lvh_obj_get_line_width, /* name */ be_nested_proto( 5, /* nstack */ - 1, /* argc */ + 2, /* argc */ 10, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -3502,22 +3832,14 @@ be_local_closure(class_lvh_obj_get_pad_bottom, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_pad_bottom), + be_str_weak(get_line_width), &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x88040107, // 0000 GETMBR R1 R0 K7 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060007, // 0003 JMPF R1 #000C - 0x88040103, // 0004 GETMBR R1 R0 K3 - 0x8C04036D, // 0005 GETMET R1 R1 K109 - 0x880C0107, // 0006 GETMBR R3 R0 K7 - 0xB8120A00, // 0007 GETNGBL R4 K5 - 0x88100909, // 0008 GETMBR R4 R4 K9 - 0x300C0604, // 0009 OR R3 R3 R4 - 0x7C040400, // 000A CALL R1 2 - 0x80040200, // 000B RET 1 R1 - 0x80000000, // 000C RET 0 + ( &(const binstruction[ 5]) { /* code */ + 0x88080101, // 0000 GETMBR R2 R0 K1 + 0x8C08057F, // 0001 GETMET R2 R2 K127 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 }) ) ); @@ -3525,36 +3847,9 @@ be_local_closure(class_lvh_obj_get_pad_bottom, /* name */ /******************************************************************** -** Solidified function: get_value_ofs_y +** Solidified function: set_radius2 ********************************************************************/ -be_local_closure(class_lvh_obj_get_value_ofs_y, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_value_ofs_y), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x8C04036E, // 0001 GETMET R1 R1 K110 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pad_bottom2 -********************************************************************/ -be_local_closure(class_lvh_obj_set_pad_bottom2, /* name */ +be_local_closure(class_lvh_obj_set_radius2, /* name */ be_nested_proto( 7, /* nstack */ 2, /* argc */ @@ -3565,21 +3860,21 @@ be_local_closure(class_lvh_obj_set_pad_bottom2, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_pad_bottom2), + be_str_weak(set_radius2), &be_const_str_solidified, ( &(const binstruction[15]) { /* code */ - 0x88080107, // 0000 GETMBR R2 R0 K7 + 0x88080103, // 0000 GETMBR R2 R0 K3 0x4C0C0000, // 0001 LDNIL R3 0x20080403, // 0002 NE R2 R2 R3 0x780A0009, // 0003 JMPF R2 #000E - 0x88080103, // 0004 GETMBR R2 R0 K3 - 0x8C08056F, // 0005 GETMET R2 R2 K111 + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C080580, // 0005 GETMET R2 R2 K128 0x60100009, // 0006 GETGBL R4 G9 0x5C140200, // 0007 MOVE R5 R1 0x7C100200, // 0008 CALL R4 1 - 0x88140107, // 0009 GETMBR R5 R0 K7 + 0x88140103, // 0009 GETMBR R5 R0 K3 0xB81A0A00, // 000A GETNGBL R6 K5 - 0x88180D09, // 000B GETMBR R6 R6 K9 + 0x88180D06, // 000B GETMBR R6 R6 K6 0x30140A06, // 000C OR R5 R5 R6 0x7C080600, // 000D CALL R2 3 0x80000000, // 000E RET 0 @@ -3589,297 +3884,6 @@ be_local_closure(class_lvh_obj_set_pad_bottom2, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: set_flex_in_new_track -********************************************************************/ -be_local_closure(class_lvh_obj_set_flex_in_new_track, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_flex_in_new_track), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x78060005, // 0000 JMPF R1 #0007 - 0x88080103, // 0001 GETMBR R2 R0 K3 - 0x8C080570, // 0002 GETMET R2 R2 K112 - 0xB8120A00, // 0003 GETNGBL R4 K5 - 0x88100906, // 0004 GETMBR R4 R4 K6 - 0x7C080400, // 0005 CALL R2 2 - 0x70020004, // 0006 JMP #000C - 0x88080103, // 0007 GETMBR R2 R0 K3 - 0x8C080571, // 0008 GETMET R2 R2 K113 - 0xB8120A00, // 0009 GETNGBL R4 K5 - 0x88100906, // 000A GETMBR R4 R4 K6 - 0x7C080400, // 000B CALL R2 2 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_pad_left -********************************************************************/ -be_local_closure(class_lvh_obj_get_pad_left, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_pad_left), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x88040107, // 0000 GETMBR R1 R0 K7 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060007, // 0003 JMPF R1 #000C - 0x88040103, // 0004 GETMBR R1 R0 K3 - 0x8C040372, // 0005 GETMET R1 R1 K114 - 0x880C0107, // 0006 GETMBR R3 R0 K7 - 0xB8120A00, // 0007 GETNGBL R4 K5 - 0x88100909, // 0008 GETMBR R4 R4 K9 - 0x300C0604, // 0009 OR R3 R3 R4 - 0x7C040400, // 000A CALL R1 2 - 0x80040200, // 000B RET 1 R1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_adjustable -********************************************************************/ -be_local_closure(class_lvh_obj_set_adjustable, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_adjustable), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x78060005, // 0000 JMPF R1 #0007 - 0x88080103, // 0001 GETMBR R2 R0 K3 - 0x8C080570, // 0002 GETMET R2 R2 K112 - 0xB8120A00, // 0003 GETNGBL R4 K5 - 0x88100954, // 0004 GETMBR R4 R4 K84 - 0x7C080400, // 0005 CALL R2 2 - 0x70020004, // 0006 JMP #000C - 0x88080103, // 0007 GETMBR R2 R0 K3 - 0x8C080571, // 0008 GETMET R2 R2 K113 - 0xB8120A00, // 0009 GETNGBL R4 K5 - 0x88100954, // 000A GETMBR R4 R4 K84 - 0x7C080400, // 000B CALL R2 2 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_text -********************************************************************/ -be_local_closure(class_lvh_obj_set_text, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_text), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x8C08013E, // 0000 GETMET R2 R0 K62 - 0x7C080200, // 0001 CALL R2 1 - 0x88080101, // 0002 GETMBR R2 R0 K1 - 0x8C080510, // 0003 GETMET R2 R2 K16 - 0x60100008, // 0004 GETGBL R4 G8 - 0x5C140200, // 0005 MOVE R5 R1 - 0x7C100200, // 0006 CALL R4 1 - 0x7C080400, // 0007 CALL R2 2 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_value_ofs_y -********************************************************************/ -be_local_closure(class_lvh_obj_set_value_ofs_y, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_value_ofs_y), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x8C08013E, // 0000 GETMET R2 R0 K62 - 0x7C080200, // 0001 CALL R2 1 - 0x88080101, // 0002 GETMBR R2 R0 K1 - 0x8C080573, // 0003 GETMET R2 R2 K115 - 0x60100009, // 0004 GETGBL R4 G9 - 0x5C140200, // 0005 MOVE R5 R1 - 0x7C100200, // 0006 CALL R4 1 - 0x7C080400, // 0007 CALL R2 2 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_value_color -********************************************************************/ -be_local_closure(class_lvh_obj_get_value_color, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_value_color), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040174, // 0000 GETMET R1 R0 K116 - 0x7C040200, // 0001 CALL R1 1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_val -********************************************************************/ -be_local_closure(class_lvh_obj_get_val, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_val), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040103, // 0000 GETMBR R1 R0 K3 - 0x8C040375, // 0001 GETMET R1 R1 K117 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_label_mode -********************************************************************/ -be_local_closure(class_lvh_obj_set_label_mode, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_label_mode), - &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x1C0C0376, // 0001 EQ R3 R1 K118 - 0x780E0005, // 0002 JMPF R3 #0009 - 0x880C0103, // 0003 GETMBR R3 R0 K3 - 0x8C0C0777, // 0004 GETMET R3 R3 K119 - 0xB8160A00, // 0005 GETNGBL R5 K5 - 0x88140B78, // 0006 GETMBR R5 R5 K120 - 0x7C0C0400, // 0007 CALL R3 2 - 0x70020017, // 0008 JMP #0021 - 0x1C0C0379, // 0009 EQ R3 R1 K121 - 0x780E0002, // 000A JMPF R3 #000E - 0xB80E0A00, // 000B GETNGBL R3 K5 - 0x8808077A, // 000C GETMBR R2 R3 K122 - 0x70020012, // 000D JMP #0021 - 0x1C0C037B, // 000E EQ R3 R1 K123 - 0x780E0002, // 000F JMPF R3 #0013 - 0xB80E0A00, // 0010 GETNGBL R3 K5 - 0x8808077C, // 0011 GETMBR R2 R3 K124 - 0x7002000D, // 0012 JMP #0021 - 0x1C0C037D, // 0013 EQ R3 R1 K125 - 0x780E0002, // 0014 JMPF R3 #0018 - 0xB80E0A00, // 0015 GETNGBL R3 K5 - 0x8808077E, // 0016 GETMBR R2 R3 K126 - 0x70020008, // 0017 JMP #0021 - 0x1C0C037F, // 0018 EQ R3 R1 K127 - 0x780E0002, // 0019 JMPF R3 #001D - 0xB80E0A00, // 001A GETNGBL R3 K5 - 0x88080780, // 001B GETMBR R2 R3 K128 - 0x70020003, // 001C JMP #0021 - 0x1C0C0381, // 001D EQ R3 R1 K129 - 0x780E0001, // 001E JMPF R3 #0021 - 0xB80E0A00, // 001F GETNGBL R3 K5 - 0x88080782, // 0020 GETMBR R2 R3 K130 - 0x4C0C0000, // 0021 LDNIL R3 - 0x200C0403, // 0022 NE R3 R2 R3 - 0x780E0005, // 0023 JMPF R3 #002A - 0x8C0C013E, // 0024 GETMET R3 R0 K62 - 0x7C0C0200, // 0025 CALL R3 1 - 0x880C0101, // 0026 GETMBR R3 R0 K1 - 0x8C0C0783, // 0027 GETMET R3 R3 K131 - 0x5C140400, // 0028 MOVE R5 R2 - 0x7C0C0400, // 0029 CALL R3 2 - 0x80000000, // 002A RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: set_hidden ********************************************************************/ @@ -3898,16 +3902,16 @@ be_local_closure(class_lvh_obj_set_hidden, /* name */ &be_const_str_solidified, ( &(const binstruction[13]) { /* code */ 0x78060005, // 0000 JMPF R1 #0007 - 0x88080103, // 0001 GETMBR R2 R0 K3 - 0x8C080570, // 0002 GETMET R2 R2 K112 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x8C080548, // 0002 GETMET R2 R2 K72 0xB8120A00, // 0003 GETNGBL R4 K5 - 0x8810090A, // 0004 GETMBR R4 R4 K10 + 0x8810095B, // 0004 GETMBR R4 R4 K91 0x7C080400, // 0005 CALL R2 2 0x70020004, // 0006 JMP #000C - 0x88080103, // 0007 GETMBR R2 R0 K3 - 0x8C080571, // 0008 GETMET R2 R2 K113 + 0x88080101, // 0007 GETMBR R2 R0 K1 + 0x8C080549, // 0008 GETMET R2 R2 K73 0xB8120A00, // 0009 GETNGBL R4 K5 - 0x8810090A, // 000A GETMBR R4 R4 K10 + 0x8810095B, // 000A GETMBR R4 R4 K91 0x7C080400, // 000B CALL R2 2 0x80000000, // 000C RET 0 }) @@ -3916,6 +3920,212 @@ be_local_closure(class_lvh_obj_set_hidden, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: get_align +********************************************************************/ +be_local_closure(class_lvh_obj_get_align, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_align), + &be_const_str_solidified, + ( &(const binstruction[33]) { /* code */ + 0x1C080311, // 0000 EQ R2 R1 K17 + 0x780A0000, // 0001 JMPF R2 #0003 + 0x58040011, // 0002 LDCONST R1 K17 + 0x8808010B, // 0003 GETMBR R2 R0 K11 + 0x4C0C0000, // 0004 LDNIL R3 + 0x1C080403, // 0005 EQ R2 R2 R3 + 0x780A0001, // 0006 JMPF R2 #0009 + 0x4C080000, // 0007 LDNIL R2 + 0x80040400, // 0008 RET 1 R2 + 0x8808010B, // 0009 GETMBR R2 R0 K11 + 0x8C080581, // 000A GETMET R2 R2 K129 + 0x5C100200, // 000B MOVE R4 R1 + 0x7C080400, // 000C CALL R2 2 + 0xB80E0A00, // 000D GETNGBL R3 K5 + 0x880C0782, // 000E GETMBR R3 R3 K130 + 0x1C0C0403, // 000F EQ R3 R2 R3 + 0x780E0001, // 0010 JMPF R3 #0013 + 0x80070600, // 0011 RET 1 K131 + 0x7002000C, // 0012 JMP #0020 + 0xB80E0A00, // 0013 GETNGBL R3 K5 + 0x880C0784, // 0014 GETMBR R3 R3 K132 + 0x1C0C0403, // 0015 EQ R3 R2 R3 + 0x780E0001, // 0016 JMPF R3 #0019 + 0x80070A00, // 0017 RET 1 K133 + 0x70020006, // 0018 JMP #0020 + 0xB80E0A00, // 0019 GETNGBL R3 K5 + 0x880C0786, // 001A GETMBR R3 R3 K134 + 0x1C0C0403, // 001B EQ R3 R2 R3 + 0x780E0001, // 001C JMPF R3 #001F + 0x80070E00, // 001D RET 1 K135 + 0x70020000, // 001E JMP #0020 + 0x80040400, // 001F RET 1 R2 + 0x80000000, // 0020 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pad_left +********************************************************************/ +be_local_closure(class_lvh_obj_get_pad_left, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_pad_left), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x88040103, // 0000 GETMBR R1 R0 K3 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060007, // 0003 JMPF R1 #000C + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C040388, // 0005 GETMET R1 R1 K136 + 0x880C0103, // 0006 GETMBR R3 R0 K3 + 0xB8120A00, // 0007 GETNGBL R4 K5 + 0x88100906, // 0008 GETMBR R4 R4 K6 + 0x300C0604, // 0009 OR R3 R3 R4 + 0x7C040400, // 000A CALL R1 2 + 0x80040200, // 000B RET 1 R1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_toggle +********************************************************************/ +be_local_closure(class_lvh_obj_get_toggle, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_toggle), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x8C040315, // 0001 GETMET R1 R1 K21 + 0xB80E0A00, // 0002 GETNGBL R3 K5 + 0x880C0740, // 0003 GETMBR R3 R3 K64 + 0x7C040400, // 0004 CALL R1 2 + 0x80040200, // 0005 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_value_font +********************************************************************/ +be_local_closure(class_lvh_obj_get_value_font, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_value_font), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040189, // 0000 GETMET R1 R0 K137 + 0x7C040200, // 0001 CALL R1 1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_value_ofs_y +********************************************************************/ +be_local_closure(class_lvh_obj_get_value_ofs_y, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(get_value_ofs_y), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8804010B, // 0000 GETMBR R1 R0 K11 + 0x8C04038A, // 0001 GETMET R1 R1 K138 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_value_ofs_y +********************************************************************/ +be_local_closure(class_lvh_obj_set_value_ofs_y, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_obj, /* shared constants */ + be_str_weak(set_value_ofs_y), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x8C080117, // 0000 GETMET R2 R0 K23 + 0x7C080200, // 0001 CALL R2 1 + 0x8808010B, // 0002 GETMBR R2 R0 K11 + 0x8C08058B, // 0003 GETMET R2 R2 K139 + 0x60100009, // 0004 GETGBL R4 G9 + 0x5C140200, // 0005 MOVE R5 R1 + 0x7C100200, // 0006 CALL R4 1 + 0x7C080400, // 0007 CALL R2 2 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: set_align ********************************************************************/ @@ -3934,33 +4144,33 @@ be_local_closure(class_lvh_obj_set_align, /* name */ &be_const_str_solidified, ( &(const binstruction[32]) { /* code */ 0x4C0C0000, // 0000 LDNIL R3 - 0x1C100518, // 0001 EQ R4 R2 K24 + 0x1C100511, // 0001 EQ R4 R2 K17 0x78120000, // 0002 JMPF R4 #0004 - 0x58080018, // 0003 LDCONST R2 K24 - 0x8C10013E, // 0004 GETMET R4 R0 K62 + 0x58080011, // 0003 LDCONST R2 K17 + 0x8C100117, // 0004 GETMET R4 R0 K23 0x7C100200, // 0005 CALL R4 1 - 0x1C100318, // 0006 EQ R4 R1 K24 + 0x1C100311, // 0006 EQ R4 R1 K17 0x74120001, // 0007 JMPT R4 #000A - 0x1C100357, // 0008 EQ R4 R1 K87 + 0x1C100383, // 0008 EQ R4 R1 K131 0x78120002, // 0009 JMPF R4 #000D 0xB8120A00, // 000A GETNGBL R4 K5 - 0x880C0956, // 000B GETMBR R3 R4 K86 + 0x880C0982, // 000B GETMBR R3 R4 K130 0x7002000C, // 000C JMP #001A - 0x1C10031A, // 000D EQ R4 R1 K26 + 0x1C100313, // 000D EQ R4 R1 K19 0x74120001, // 000E JMPT R4 #0011 - 0x1C100359, // 000F EQ R4 R1 K89 + 0x1C100385, // 000F EQ R4 R1 K133 0x78120002, // 0010 JMPF R4 #0014 0xB8120A00, // 0011 GETNGBL R4 K5 - 0x880C0958, // 0012 GETMBR R3 R4 K88 + 0x880C0984, // 0012 GETMBR R3 R4 K132 0x70020005, // 0013 JMP #001A - 0x1C100384, // 0014 EQ R4 R1 K132 + 0x1C10038C, // 0014 EQ R4 R1 K140 0x74120001, // 0015 JMPT R4 #0018 - 0x1C10035B, // 0016 EQ R4 R1 K91 + 0x1C100387, // 0016 EQ R4 R1 K135 0x78120001, // 0017 JMPF R4 #001A 0xB8120A00, // 0018 GETNGBL R4 K5 - 0x880C095A, // 0019 GETMBR R3 R4 K90 - 0x88100101, // 001A GETMBR R4 R0 K1 - 0x8C100985, // 001B GETMET R4 R4 K133 + 0x880C0986, // 0019 GETMBR R3 R4 K134 + 0x8810010B, // 001A GETMBR R4 R0 K11 + 0x8C10098D, // 001B GETMET R4 R4 K141 0x5C180600, // 001C MOVE R6 R3 0x5C1C0400, // 001D MOVE R7 R2 0x7C100600, // 001E CALL R4 3 @@ -3971,72 +4181,6 @@ be_local_closure(class_lvh_obj_set_align, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: get_line_width -********************************************************************/ -be_local_closure(class_lvh_obj_get_line_width, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(get_line_width), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080103, // 0000 GETMBR R2 R0 K3 - 0x8C080586, // 0001 GETMET R2 R2 K134 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pad_left2 -********************************************************************/ -be_local_closure(class_lvh_obj_set_pad_left2, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_lvh_obj, /* shared constants */ - be_str_weak(set_pad_left2), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88080107, // 0000 GETMBR R2 R0 K7 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0009, // 0003 JMPF R2 #000E - 0x88080103, // 0004 GETMBR R2 R0 K3 - 0x8C080587, // 0005 GETMET R2 R2 K135 - 0x60100009, // 0006 GETGBL R4 G9 - 0x5C140200, // 0007 MOVE R5 R1 - 0x7C100200, // 0008 CALL R4 1 - 0x88140107, // 0009 GETMBR R5 R0 K7 - 0xB81A0A00, // 000A GETNGBL R6 K5 - 0x88180D09, // 000B GETMBR R6 R6 K9 - 0x30140A06, // 000C OR R5 R5 R6 - 0x7C080600, // 000D CALL R2 3 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: lvh_obj ********************************************************************/ @@ -4044,50 +4188,16 @@ extern const bclass be_class_lvh_root; be_local_class(lvh_obj, 2, &be_class_lvh_root, - be_nested_map(62, + be_nested_map(63, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(set_action, -1), be_const_closure(class_lvh_obj_set_action_closure) }, - { be_const_key_weak(get_text, -1), be_const_closure(class_lvh_obj_get_text_closure) }, - { be_const_key_weak(get_flex_in_new_track, -1), be_const_closure(class_lvh_obj_get_flex_in_new_track_closure) }, - { be_const_key_weak(set_pad_all2, 18), be_const_closure(class_lvh_obj_set_pad_all2_closure) }, - { be_const_key_weak(get_hidden, -1), be_const_closure(class_lvh_obj_get_hidden_closure) }, - { be_const_key_weak(get_enabled, 42), be_const_closure(class_lvh_obj_get_enabled_closure) }, - { be_const_key_weak(set_pad_left2, -1), be_const_closure(class_lvh_obj_set_pad_left2_closure) }, - { be_const_key_weak(get_line_width, -1), be_const_closure(class_lvh_obj_get_line_width_closure) }, - { be_const_key_weak(check_label, -1), be_const_closure(class_lvh_obj_check_label_closure) }, - { be_const_key_weak(register_event_cb, -1), be_const_closure(class_lvh_obj_register_event_cb_closure) }, - { be_const_key_weak(_lv_label, -1), be_const_var(0) }, - { be_const_key_weak(set_pad_top2, 10), be_const_closure(class_lvh_obj_set_pad_top2_closure) }, - { be_const_key_weak(post_init, -1), be_const_closure(class_lvh_obj_post_init_closure) }, { be_const_key_weak(_delete, -1), be_const_closure(class_lvh_obj__delete_closure) }, - { be_const_key_weak(_lv_part2_selector, -1), be_const_nil() }, - { be_const_key_weak(get_value_font, 45), be_const_closure(class_lvh_obj_get_value_font_closure) }, - { be_const_key_weak(get_radius2, -1), be_const_closure(class_lvh_obj_get_radius2_closure) }, - { be_const_key_weak(set_label_mode, 56), be_const_closure(class_lvh_obj_set_label_mode_closure) }, - { be_const_key_weak(get_val, 60), be_const_closure(class_lvh_obj_get_val_closure) }, - { be_const_key_weak(set_value_color, 31), be_const_closure(class_lvh_obj_set_value_color_closure) }, - { be_const_key_weak(get_value_color, 55), be_const_closure(class_lvh_obj_get_value_color_closure) }, - { be_const_key_weak(get_value_ofs_x, -1), be_const_closure(class_lvh_obj_get_value_ofs_x_closure) }, - { be_const_key_weak(get_label_mode, -1), be_const_closure(class_lvh_obj_get_label_mode_closure) }, - { be_const_key_weak(set_val, -1), be_const_closure(class_lvh_obj_set_val_closure) }, - { be_const_key_weak(set_click, -1), be_const_closure(class_lvh_obj_set_click_closure) }, - { be_const_key_weak(member, 20), be_const_closure(class_lvh_obj_member_closure) }, - { be_const_key_weak(_action, -1), be_const_var(1) }, - { be_const_key_weak(set_enabled, -1), be_const_closure(class_lvh_obj_set_enabled_closure) }, - { be_const_key_weak(setmember, -1), be_const_closure(class_lvh_obj_setmember_closure) }, - { be_const_key_weak(init, -1), be_const_closure(class_lvh_obj_init_closure) }, - { be_const_key_weak(get_pad_right, 17), be_const_closure(class_lvh_obj_get_pad_right_closure) }, - { be_const_key_weak(set_adjustable, 11), be_const_closure(class_lvh_obj_set_adjustable_closure) }, - { be_const_key_weak(get_pad_left, -1), be_const_closure(class_lvh_obj_get_pad_left_closure) }, - { be_const_key_weak(set_flex_in_new_track, 26), be_const_closure(class_lvh_obj_set_flex_in_new_track_closure) }, - { be_const_key_weak(set_pad_right2, -1), be_const_closure(class_lvh_obj_set_pad_right2_closure) }, - { be_const_key_weak(set_pad_bottom2, 52), be_const_closure(class_lvh_obj_set_pad_bottom2_closure) }, - { be_const_key_weak(get_action, 38), be_const_closure(class_lvh_obj_get_action_closure) }, - { be_const_key_weak(set_text_font, 28), be_const_closure(class_lvh_obj_set_text_font_closure) }, - { be_const_key_weak(get_value_ofs_y, -1), be_const_closure(class_lvh_obj_get_value_ofs_y_closure) }, - { be_const_key_weak(_lv_class, 35), be_const_class(be_class_lv_obj) }, - { be_const_key_weak(set_toggle, -1), be_const_closure(class_lvh_obj_set_toggle_closure) }, - { be_const_key_weak(_event_map, 49), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(get_action, -1), be_const_closure(class_lvh_obj_get_action_closure) }, + { be_const_key_weak(get_text_font, -1), be_const_closure(class_lvh_obj_get_text_font_closure) }, + { be_const_key_weak(get_pad_all, -1), be_const_closure(class_lvh_obj_get_pad_all_closure) }, + { be_const_key_weak(set_pad_bottom2, -1), be_const_closure(class_lvh_obj_set_pad_bottom2_closure) }, + { be_const_key_weak(get_value_font, -1), be_const_closure(class_lvh_obj_get_value_font_closure) }, + { be_const_key_weak(get_hidden, -1), be_const_closure(class_lvh_obj_get_hidden_closure) }, + { be_const_key_weak(_event_map, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(7, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(7, -1), be_nested_str_weak(up) }, @@ -4098,26 +4208,61 @@ be_local_class(lvh_obj, { be_const_key_int(5, -1), be_nested_str_weak(long) }, { be_const_key_int(6, -1), be_nested_str_weak(hold) }, })) ) } )) }, - { be_const_key_weak(set_text_color, -1), be_const_closure(class_lvh_obj_set_text_color_closure) }, - { be_const_key_weak(set_value_font, 47), be_const_closure(class_lvh_obj_set_value_font_closure) }, - { be_const_key_weak(set_radius2, -1), be_const_closure(class_lvh_obj_set_radius2_closure) }, - { be_const_key_weak(get_pad_all, 46), be_const_closure(class_lvh_obj_get_pad_all_closure) }, - { be_const_key_weak(event_cb, -1), be_const_closure(class_lvh_obj_event_cb_closure) }, - { be_const_key_weak(get_pad_top, 48), be_const_closure(class_lvh_obj_get_pad_top_closure) }, - { be_const_key_weak(get_align, -1), be_const_closure(class_lvh_obj_get_align_closure) }, - { be_const_key_weak(get_adjustable, -1), be_const_closure(class_lvh_obj_get_adjustable_closure) }, - { be_const_key_weak(get_click, 33), be_const_closure(class_lvh_obj_get_click_closure) }, - { be_const_key_weak(set_line_width, 32), be_const_closure(class_lvh_obj_set_line_width_closure) }, - { be_const_key_weak(get_text_font, 57), be_const_closure(class_lvh_obj_get_text_font_closure) }, - { be_const_key_weak(set_text, 7), be_const_closure(class_lvh_obj_set_text_closure) }, - { be_const_key_weak(set_value_ofs_y, -1), be_const_closure(class_lvh_obj_set_value_ofs_y_closure) }, - { be_const_key_weak(_EVENTS, -1), be_const_bytes_instance(010703080520) }, - { be_const_key_weak(get_toggle, -1), be_const_closure(class_lvh_obj_get_toggle_closure) }, + { be_const_key_weak(register_event_cb, -1), be_const_closure(class_lvh_obj_register_event_cb_closure) }, + { be_const_key_weak(get_pad_left, 11), be_const_closure(class_lvh_obj_get_pad_left_closure) }, + { be_const_key_weak(get_align, 12), be_const_closure(class_lvh_obj_get_align_closure) }, + { be_const_key_weak(get_value_color, -1), be_const_closure(class_lvh_obj_get_value_color_closure) }, + { be_const_key_weak(get_label_mode, -1), be_const_closure(class_lvh_obj_get_label_mode_closure) }, + { be_const_key_weak(member, -1), be_const_closure(class_lvh_obj_member_closure) }, + { be_const_key_weak(set_pad_left2, -1), be_const_closure(class_lvh_obj_set_pad_left2_closure) }, + { be_const_key_weak(check_label, -1), be_const_closure(class_lvh_obj_check_label_closure) }, + { be_const_key_weak(set_adjustable, 0), be_const_closure(class_lvh_obj_set_adjustable_closure) }, + { be_const_key_weak(post_init, -1), be_const_closure(class_lvh_obj_post_init_closure) }, + { be_const_key_weak(set_enabled, 35), be_const_closure(class_lvh_obj_set_enabled_closure) }, + { be_const_key_weak(setmember, -1), be_const_closure(class_lvh_obj_setmember_closure) }, + { be_const_key_weak(set_toggle, -1), be_const_closure(class_lvh_obj_set_toggle_closure) }, + { be_const_key_weak(_lv_part2_selector, -1), be_const_nil() }, + { be_const_key_weak(set_pad_all2, 6), be_const_closure(class_lvh_obj_set_pad_all2_closure) }, + { be_const_key_weak(get_value_ofs_x, -1), be_const_closure(class_lvh_obj_get_value_ofs_x_closure) }, { be_const_key_weak(set_value_ofs_x, -1), be_const_closure(class_lvh_obj_set_value_ofs_x_closure) }, + { be_const_key_weak(set_action, -1), be_const_closure(class_lvh_obj_set_action_closure) }, + { be_const_key_weak(set_text, 1), be_const_closure(class_lvh_obj_set_text_closure) }, + { be_const_key_weak(get_flex_in_new_track, -1), be_const_closure(class_lvh_obj_get_flex_in_new_track_closure) }, + { be_const_key_weak(set_flex_in_new_track, -1), be_const_closure(class_lvh_obj_set_flex_in_new_track_closure) }, + { be_const_key_weak(_action, 56), be_const_var(1) }, + { be_const_key_weak(set_label_mode, 5), be_const_closure(class_lvh_obj_set_label_mode_closure) }, + { be_const_key_weak(get_sub_id, -1), be_const_closure(class_lvh_obj_get_sub_id_closure) }, + { be_const_key_weak(get_pad_top, 4), be_const_closure(class_lvh_obj_get_pad_top_closure) }, + { be_const_key_weak(init, 59), be_const_closure(class_lvh_obj_init_closure) }, + { be_const_key_weak(get_val, -1), be_const_closure(class_lvh_obj_get_val_closure) }, + { be_const_key_weak(event_cb, -1), be_const_closure(class_lvh_obj_event_cb_closure) }, + { be_const_key_weak(get_text, -1), be_const_closure(class_lvh_obj_get_text_closure) }, + { be_const_key_weak(_lv_label, -1), be_const_var(0) }, + { be_const_key_weak(get_pad_right, 9), be_const_closure(class_lvh_obj_get_pad_right_closure) }, + { be_const_key_weak(set_value_font, -1), be_const_closure(class_lvh_obj_set_value_font_closure) }, + { be_const_key_weak(_EVENTS, 16), be_const_bytes_instance(010703080520) }, + { be_const_key_weak(get_pad_bottom, 50), be_const_closure(class_lvh_obj_get_pad_bottom_closure) }, + { be_const_key_weak(set_text_font, -1), be_const_closure(class_lvh_obj_set_text_font_closure) }, + { be_const_key_weak(set_pad_right2, -1), be_const_closure(class_lvh_obj_set_pad_right2_closure) }, + { be_const_key_weak(set_pad_top2, -1), be_const_closure(class_lvh_obj_set_pad_top2_closure) }, + { be_const_key_weak(set_line_width, 39), be_const_closure(class_lvh_obj_set_line_width_closure) }, + { be_const_key_weak(set_click, -1), be_const_closure(class_lvh_obj_set_click_closure) }, + { be_const_key_weak(get_text_color, 43), be_const_closure(class_lvh_obj_get_text_color_closure) }, + { be_const_key_weak(set_value_color, -1), be_const_closure(class_lvh_obj_set_value_color_closure) }, + { be_const_key_weak(get_adjustable, -1), be_const_closure(class_lvh_obj_get_adjustable_closure) }, + { be_const_key_weak(get_radius2, 34), be_const_closure(class_lvh_obj_get_radius2_closure) }, + { be_const_key_weak(get_line_width, -1), be_const_closure(class_lvh_obj_get_line_width_closure) }, + { be_const_key_weak(_lv_class, -1), be_const_class(be_class_lv_obj) }, + { be_const_key_weak(set_radius2, -1), be_const_closure(class_lvh_obj_set_radius2_closure) }, { be_const_key_weak(set_hidden, -1), be_const_closure(class_lvh_obj_set_hidden_closure) }, + { be_const_key_weak(set_text_color, 10), be_const_closure(class_lvh_obj_set_text_color_closure) }, + { be_const_key_weak(get_click, -1), be_const_closure(class_lvh_obj_get_click_closure) }, + { be_const_key_weak(get_enabled, 7), be_const_closure(class_lvh_obj_get_enabled_closure) }, + { be_const_key_weak(get_toggle, -1), be_const_closure(class_lvh_obj_get_toggle_closure) }, + { be_const_key_weak(set_val, -1), be_const_closure(class_lvh_obj_set_val_closure) }, + { be_const_key_weak(get_value_ofs_y, -1), be_const_closure(class_lvh_obj_get_value_ofs_y_closure) }, + { be_const_key_weak(set_value_ofs_y, -1), be_const_closure(class_lvh_obj_set_value_ofs_y_closure) }, { be_const_key_weak(set_align, -1), be_const_closure(class_lvh_obj_set_align_closure) }, - { be_const_key_weak(get_text_color, -1), be_const_closure(class_lvh_obj_get_text_color_closure) }, - { be_const_key_weak(get_pad_bottom, 6), be_const_closure(class_lvh_obj_get_pad_bottom_closure) }, })), be_str_weak(lvh_obj) ); @@ -5664,8 +5809,8 @@ be_local_closure(class_lvh_spinner_set_angle, /* name */ ********************************************************************/ be_local_closure(class_lvh_spinner_init, /* name */ be_nested_proto( - 12, /* nstack */ - 4, /* argc */ + 15, /* nstack */ + 6, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -5684,35 +5829,36 @@ be_local_closure(class_lvh_spinner_init, /* name */ }), be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x8C100700, // 0000 GETMET R4 R3 K0 - 0x58180001, // 0001 LDCONST R6 K1 - 0x541E003B, // 0002 LDINT R7 60 - 0x7C100600, // 0003 CALL R4 3 - 0x8C140700, // 0004 GETMET R5 R3 K0 - 0x581C0002, // 0005 LDCONST R7 K2 - 0x542203E7, // 0006 LDINT R8 1000 - 0x7C140600, // 0007 CALL R5 3 - 0xB81A0800, // 0008 GETNGBL R6 K4 - 0x8C180D05, // 0009 GETMET R6 R6 K5 - 0x5C200200, // 000A MOVE R8 R1 - 0x7C180400, // 000B CALL R6 2 - 0x90020606, // 000C SETMBR R0 K3 R6 - 0x88180103, // 000D GETMBR R6 R0 K3 - 0x8C180D06, // 000E GETMET R6 R6 K6 - 0x5C200A00, // 000F MOVE R8 R5 - 0x5C240800, // 0010 MOVE R9 R4 - 0x7C180600, // 0011 CALL R6 3 - 0x60180003, // 0012 GETGBL R6 G3 - 0x5C1C0000, // 0013 MOVE R7 R0 - 0x7C180200, // 0014 CALL R6 1 - 0x8C180D07, // 0015 GETMET R6 R6 K7 - 0x5C200200, // 0016 MOVE R8 R1 - 0x5C240400, // 0017 MOVE R9 R2 - 0x5C280600, // 0018 MOVE R10 R3 - 0x882C0103, // 0019 GETMBR R11 R0 K3 - 0x7C180A00, // 001A CALL R6 5 - 0x80000000, // 001B RET 0 + ( &(const binstruction[29]) { /* code */ + 0x8C180700, // 0000 GETMET R6 R3 K0 + 0x58200001, // 0001 LDCONST R8 K1 + 0x5426003B, // 0002 LDINT R9 60 + 0x7C180600, // 0003 CALL R6 3 + 0x8C1C0700, // 0004 GETMET R7 R3 K0 + 0x58240002, // 0005 LDCONST R9 K2 + 0x542A03E7, // 0006 LDINT R10 1000 + 0x7C1C0600, // 0007 CALL R7 3 + 0xB8220800, // 0008 GETNGBL R8 K4 + 0x8C201105, // 0009 GETMET R8 R8 K5 + 0x5C280200, // 000A MOVE R10 R1 + 0x7C200400, // 000B CALL R8 2 + 0x90020608, // 000C SETMBR R0 K3 R8 + 0x88200103, // 000D GETMBR R8 R0 K3 + 0x8C201106, // 000E GETMET R8 R8 K6 + 0x5C280E00, // 000F MOVE R10 R7 + 0x5C2C0C00, // 0010 MOVE R11 R6 + 0x7C200600, // 0011 CALL R8 3 + 0x60200003, // 0012 GETGBL R8 G3 + 0x5C240000, // 0013 MOVE R9 R0 + 0x7C200200, // 0014 CALL R8 1 + 0x8C201107, // 0015 GETMET R8 R8 K7 + 0x5C280200, // 0016 MOVE R10 R1 + 0x5C2C0400, // 0017 MOVE R11 R2 + 0x5C300600, // 0018 MOVE R12 R3 + 0x88340103, // 0019 GETMBR R13 R0 K3 + 0x5C380A00, // 001A MOVE R14 R5 + 0x7C200C00, // 001B CALL R8 6 + 0x80000000, // 001C RET 0 }) ) ); @@ -7480,7 +7626,7 @@ be_local_closure(class_lvh_dropdown_list_post_init, /* name */ /* K6 */ be_nested_str_weak(list), /* K7 */ be_nested_str_weak(get_list), /* K8 */ be_nested_str_weak(_p), - /* K9 */ be_nested_str_weak(HSP_X3A_X20_X27_dropdown_list_X27_X20should_X20have_X20a_X20parent_X20of_X20type_X20_X27dropdown_X27), + /* K9 */ be_nested_str_weak(HSP_X3A_X20_X27dropdown_list_X27_X20should_X20have_X20a_X20parent_X20of_X20type_X20_X27dropdown_X27), /* K10 */ be_nested_str_weak(post_init), }), be_str_weak(post_init), @@ -8903,8 +9049,8 @@ be_local_class(lvh_spangroup, })), be_str_weak(lvh_spangroup) ); -// compact class 'lvh_span' ktab size: 30, total: 36 (saved 48 bytes) -static const bvalue be_ktab_class_lvh_span[30] = { +// compact class 'lvh_span' ktab size: 31, total: 37 (saved 48 bytes) +static const bvalue be_ktab_class_lvh_span[31] = { /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(introspect), /* K2 */ be_nested_str_weak(startswith), @@ -8932,9 +9078,10 @@ static const bvalue be_ktab_class_lvh_span[30] = { /* K24 */ be_nested_str_weak(lvh_spangroup), /* K25 */ be_nested_str_weak(new_span), /* K26 */ be_nested_str_weak(get_style), - /* K27 */ be_nested_str_weak(parse_font), - /* K28 */ be_nested_str_weak(set_text_font), - /* K29 */ be_nested_str_weak(set_text), + /* K27 */ be_nested_str_weak(HSP_X3A_X20_X27span_X27_X20should_X20have_X20a_X20parent_X20of_X20type_X20_X27spangroup_X27), + /* K28 */ be_nested_str_weak(parse_font), + /* K29 */ be_nested_str_weak(set_text_font), + /* K30 */ be_nested_str_weak(set_text), }; @@ -9071,7 +9218,7 @@ be_local_closure(class_lvh_span_post_init, /* name */ &be_ktab_class_lvh_span, /* shared constants */ be_str_weak(post_init), &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ + ( &(const binstruction[23]) { /* code */ 0x4C040000, // 0000 LDNIL R1 0x90022A01, // 0001 SETMBR R0 K21 R1 0x6004000F, // 0002 GETGBL R1 G15 @@ -9080,7 +9227,7 @@ be_local_closure(class_lvh_span_post_init, /* name */ 0x880C0717, // 0005 GETMBR R3 R3 K23 0x880C0718, // 0006 GETMBR R3 R3 K24 0x7C040400, // 0007 CALL R1 2 - 0x78060008, // 0008 JMPF R1 #0012 + 0x78060009, // 0008 JMPF R1 #0013 0x88040111, // 0009 GETMBR R1 R0 K17 0x88040315, // 000A GETMBR R1 R1 K21 0x8C040319, // 000B GETMET R1 R1 K25 @@ -9090,7 +9237,11 @@ be_local_closure(class_lvh_span_post_init, /* name */ 0x8C04031A, // 000F GETMET R1 R1 K26 0x7C040200, // 0010 CALL R1 1 0x90021C01, // 0011 SETMBR R0 K14 R1 - 0x80000000, // 0012 RET 0 + 0x70020002, // 0012 JMP #0016 + 0x60040001, // 0013 GETGBL R1 G1 + 0x5808001B, // 0014 LDCONST R2 K27 + 0x7C040200, // 0015 CALL R1 1 + 0x80000000, // 0016 RET 0 }) ) ); @@ -9114,14 +9265,14 @@ be_local_closure(class_lvh_span_set_text_font, /* name */ be_str_weak(set_text_font), &be_const_str_solidified, ( &(const binstruction[14]) { /* code */ - 0x8C08011B, // 0000 GETMET R2 R0 K27 + 0x8C08011C, // 0000 GETMET R2 R0 K28 0x5C100200, // 0001 MOVE R4 R1 0x7C080400, // 0002 CALL R2 2 0x4C0C0000, // 0003 LDNIL R3 0x200C0403, // 0004 NE R3 R2 R3 0x780E0006, // 0005 JMPF R3 #000D 0x880C010E, // 0006 GETMBR R3 R0 K14 - 0x8C0C071C, // 0007 GETMET R3 R3 K28 + 0x8C0C071D, // 0007 GETMET R3 R3 K29 0x5C140400, // 0008 MOVE R5 R2 0x7C0C0400, // 0009 CALL R3 2 0x880C0111, // 000A GETMBR R3 R0 K17 @@ -9152,7 +9303,7 @@ be_local_closure(class_lvh_span_set_text, /* name */ &be_const_str_solidified, ( &(const binstruction[ 7]) { /* code */ 0x88080115, // 0000 GETMBR R2 R0 K21 - 0x8C08051D, // 0001 GETMET R2 R2 K29 + 0x8C08051E, // 0001 GETMET R2 R2 K30 0x60100008, // 0002 GETGBL R4 G8 0x5C140200, // 0003 MOVE R5 R1 0x7C100200, // 0004 CALL R4 1 @@ -9182,6 +9333,742 @@ be_local_class(lvh_span, })), be_str_weak(lvh_span) ); +// compact class 'lvh_tabview' ktab size: 19, total: 28 (saved 72 bytes) +static const bvalue be_ktab_class_lvh_tabview[19] = { + /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(get_tab_active), + /* K2 */ be_nested_str_weak(_tab_list), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(post_init), + /* K5 */ be_nested_str_weak(get_val), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(get_count), + /* K8 */ be_nested_str_weak(get_text), + /* K9 */ be_nested_str_weak(get_tab_count), + /* K10 */ be_nested_str_weak(push), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(defer), + /* K13 */ be_const_int(1), + /* K14 */ be_nested_str_weak(set_active), + /* K15 */ be_nested_str_weak(lv), + /* K16 */ be_nested_str_weak(ANIM_OFF), + /* K17 */ be_nested_str_weak(_direction), + /* K18 */ be_nested_str_weak(set_tab_bar_position), +}; + + +extern const bclass be_class_lvh_tabview; + +/******************************************************************** +** Solidified function: get_val +********************************************************************/ +be_local_closure(class_lvh_tabview_get_val, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_tabview, /* shared constants */ + be_str_weak(get_val), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: find_tab +********************************************************************/ +be_local_closure(class_lvh_tabview_find_tab, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_tabview, /* shared constants */ + be_str_weak(find_tab), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080102, // 0000 GETMBR R2 R0 K2 + 0x8C080503, // 0001 GETMET R2 R2 K3 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: post_init +********************************************************************/ +be_local_closure(class_lvh_tabview_post_init, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_tabview, /* shared constants */ + be_str_weak(post_init), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x60040012, // 0000 GETGBL R1 G18 + 0x7C040000, // 0001 CALL R1 0 + 0x90020401, // 0002 SETMBR R0 K2 R1 + 0x60040003, // 0003 GETGBL R1 G3 + 0x5C080000, // 0004 MOVE R2 R0 + 0x7C040200, // 0005 CALL R1 1 + 0x8C040304, // 0006 GETMET R1 R1 K4 + 0x7C040200, // 0007 CALL R1 1 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text +********************************************************************/ +be_local_closure(class_lvh_tabview_get_text, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_tabview, /* shared constants */ + be_str_weak(get_text), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0x8C040105, // 0000 GETMET R1 R0 K5 + 0x7C040200, // 0001 CALL R1 1 + 0x28080306, // 0002 GE R2 R1 K6 + 0x780A0009, // 0003 JMPF R2 #000E + 0x8C080107, // 0004 GETMET R2 R0 K7 + 0x7C080200, // 0005 CALL R2 1 + 0x14080202, // 0006 LT R2 R1 R2 + 0x780A0005, // 0007 JMPF R2 #000E + 0x88080102, // 0008 GETMBR R2 R0 K2 + 0x94080401, // 0009 GETIDX R2 R2 R1 + 0x8C080508, // 000A GETMET R2 R2 K8 + 0x7C080200, // 000B CALL R2 1 + 0x80040400, // 000C RET 1 R2 + 0x70020001, // 000D JMP #0010 + 0x4C080000, // 000E LDNIL R2 + 0x80040400, // 000F RET 1 R2 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_count +********************************************************************/ +be_local_closure(class_lvh_tabview_get_count, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_tabview, /* shared constants */ + be_str_weak(get_count), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040309, // 0001 GETMET R1 R1 K9 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: push_tab +********************************************************************/ +be_local_closure(class_lvh_tabview_push_tab, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_tabview, /* shared constants */ + be_str_weak(push_tab), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080102, // 0000 GETMBR R2 R0 K2 + 0x8C08050A, // 0001 GETMET R2 R2 K10 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_val +********************************************************************/ +be_local_closure(class_lvh_tabview_set_val, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(set_val), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x500C0200, // 0003 LDBOOL R3 1 0 + 0x7C000600, // 0004 CALL R0 3 + 0x80000000, // 0005 RET 0 + }) + ), + }), + 1, /* has constants */ + &be_ktab_class_lvh_tabview, /* shared constants */ + be_str_weak(set_val), + &be_const_str_solidified, + ( &(const binstruction[30]) { /* code */ + 0x8C0C0107, // 0000 GETMET R3 R0 K7 + 0x7C0C0200, // 0001 CALL R3 1 + 0x1C100706, // 0002 EQ R4 R3 K6 + 0x78120006, // 0003 JMPF R4 #000B + 0x5C100400, // 0004 MOVE R4 R2 + 0x74120003, // 0005 JMPT R4 #000A + 0xB8121600, // 0006 GETNGBL R4 K11 + 0x8C10090C, // 0007 GETMET R4 R4 K12 + 0x84180000, // 0008 CLOSURE R6 P0 + 0x7C100400, // 0009 CALL R4 2 + 0x70020010, // 000A JMP #001C + 0x4C100000, // 000B LDNIL R4 + 0x1C100204, // 000C EQ R4 R1 R4 + 0x78120000, // 000D JMPF R4 #000F + 0x58040006, // 000E LDCONST R1 K6 + 0x14100306, // 000F LT R4 R1 K6 + 0x78120000, // 0010 JMPF R4 #0012 + 0x58040006, // 0011 LDCONST R1 K6 + 0x28100203, // 0012 GE R4 R1 R3 + 0x78120001, // 0013 JMPF R4 #0016 + 0x0410070D, // 0014 SUB R4 R3 K13 + 0x5C040800, // 0015 MOVE R1 R4 + 0x88100100, // 0016 GETMBR R4 R0 K0 + 0x8C10090E, // 0017 GETMET R4 R4 K14 + 0x5C180200, // 0018 MOVE R6 R1 + 0xB81E1E00, // 0019 GETNGBL R7 K15 + 0x881C0F10, // 001A GETMBR R7 R7 K16 + 0x7C100600, // 001B CALL R4 3 + 0xA0000000, // 001C CLOSE R0 + 0x80000000, // 001D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_btn_pos +********************************************************************/ +be_local_closure(class_lvh_tabview_set_btn_pos, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_tabview, /* shared constants */ + be_str_weak(set_btn_pos), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x5C040400, // 0003 MOVE R1 R2 + 0x4C080000, // 0004 LDNIL R2 + 0x1C080202, // 0005 EQ R2 R1 R2 + 0x740A0006, // 0006 JMPT R2 #000E + 0x14080306, // 0007 LT R2 R1 K6 + 0x740A0004, // 0008 JMPT R2 #000E + 0x6008000C, // 0009 GETGBL R2 G12 + 0x880C0111, // 000A GETMBR R3 R0 K17 + 0x7C080200, // 000B CALL R2 1 + 0x28080202, // 000C GE R2 R1 R2 + 0x780A0000, // 000D JMPF R2 #000F + 0x58040006, // 000E LDCONST R1 K6 + 0x88080111, // 000F GETMBR R2 R0 K17 + 0x94080401, // 0010 GETIDX R2 R2 R1 + 0x880C0100, // 0011 GETMBR R3 R0 K0 + 0x8C0C0712, // 0012 GETMET R3 R3 K18 + 0x5C140400, // 0013 MOVE R5 R2 + 0x7C0C0400, // 0014 CALL R3 2 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: lvh_tabview +********************************************************************/ +extern const bclass be_class_lvh_obj; +be_local_class(lvh_tabview, + 1, + &be_class_lvh_obj, + be_nested_map(11, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(_lv_class, -1), be_const_class(be_class_lv_tabview) }, + { be_const_key_weak(set_btn_pos, 2), be_const_closure(class_lvh_tabview_set_btn_pos_closure) }, + { be_const_key_weak(set_val, -1), be_const_closure(class_lvh_tabview_set_val_closure) }, + { be_const_key_weak(_tab_list, -1), be_const_var(0) }, + { be_const_key_weak(find_tab, 9), be_const_closure(class_lvh_tabview_find_tab_closure) }, + { be_const_key_weak(get_count, -1), be_const_closure(class_lvh_tabview_get_count_closure) }, + { be_const_key_weak(get_val, 5), be_const_closure(class_lvh_tabview_get_val_closure) }, + { be_const_key_weak(push_tab, -1), be_const_closure(class_lvh_tabview_push_tab_closure) }, + { be_const_key_weak(get_text, 1), be_const_closure(class_lvh_tabview_get_text_closure) }, + { be_const_key_weak(post_init, 0), be_const_closure(class_lvh_tabview_post_init_closure) }, + { be_const_key_weak(_direction, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(5, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(0), + be_const_int(4), + be_const_int(8), + be_const_int(1), + be_const_int(2), + })) ) } )) }, + })), + be_str_weak(lvh_tabview) +); + +extern const bclass be_class_lvh_btn_tab; + +/******************************************************************** +** Solidified function: post_init +********************************************************************/ +be_local_closure(class_lvh_btn_tab_post_init, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(set_style_radius), + /* K2 */ be_const_int(0), + }), + be_str_weak(post_init), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x58100002, // 0003 LDCONST R4 K2 + 0x7C040600, // 0004 CALL R1 3 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: lvh_btn_tab +********************************************************************/ +extern const bclass be_class_lvh_obj; +be_local_class(lvh_btn_tab, + 0, + &be_class_lvh_obj, + be_nested_map(2, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(post_init, -1), be_const_closure(class_lvh_btn_tab_post_init_closure) }, + { be_const_key_weak(_lv_class, -1), be_const_class(be_class_lv_button) }, + })), + be_str_weak(lvh_btn_tab) +); +// compact class 'lvh_tab' ktab size: 30, total: 38 (saved 64 bytes) +static const bvalue be_ktab_class_lvh_tab[30] = { + /* K0 */ be_nested_str_weak(_lv_obj), + /* K1 */ be_nested_str_weak(_parent_lvh), + /* K2 */ be_nested_str_weak(_page), + /* K3 */ be_nested_str_weak(_hm), + /* K4 */ be_nested_str_weak(lvh_tabview), + /* K5 */ be_nested_str_weak(_text), + /* K6 */ be_nested_str_weak(add_tab), + /* K7 */ be_nested_str_weak(get_tab_bar), + /* K8 */ be_nested_str_weak(lv), + /* K9 */ be_nested_str_weak(obj_class), + /* K10 */ be_nested_str_weak(button), + /* K11 */ be_nested_str_weak(_class), + /* K12 */ be_nested_str_weak(get_child_count_by_type), + /* K13 */ be_nested_str_weak(get_child_by_type), + /* K14 */ be_const_int(1), + /* K15 */ be_nested_str_weak(_btn), + /* K16 */ be_nested_str_weak(lvh_btn_tab), + /* K17 */ be_nested_str_weak(push_tab), + /* K18 */ be_nested_str_weak(HSP_X3A_X20_X27tab_X27_X20requires_X20_X27text_X27_X20attribute), + /* K19 */ be_nested_str_weak(HSP_X3A_X20_X27tab_X27_X20should_X20have_X20a_X20parent_X20of_X20type_X20_X27tabview_X27), + /* K20 */ be_nested_str_weak(string), + /* K21 */ be_nested_str_weak(startswith), + /* K22 */ be_nested_str_weak(tab_), + /* K23 */ be_nested_str_weak(setmember), + /* K24 */ be_const_int(2147483647), + /* K25 */ be_nested_str_weak(member), + /* K26 */ be_nested_str_weak(set_text), + /* K27 */ be_nested_str_weak(find), + /* K28 */ be_nested_str_weak(text), + /* K29 */ be_nested_str_weak(init), +}; + + +extern const bclass be_class_lvh_tab; + +/******************************************************************** +** Solidified function: post_init +********************************************************************/ +be_local_closure(class_lvh_tab_post_init, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_tab, /* shared constants */ + be_str_weak(post_init), + &be_const_str_solidified, + ( &(const binstruction[58]) { /* code */ + 0x4C040000, // 0000 LDNIL R1 + 0x90020001, // 0001 SETMBR R0 K0 R1 + 0x6004000F, // 0002 GETGBL R1 G15 + 0x88080101, // 0003 GETMBR R2 R0 K1 + 0x880C0102, // 0004 GETMBR R3 R0 K2 + 0x880C0703, // 0005 GETMBR R3 R3 K3 + 0x880C0704, // 0006 GETMBR R3 R3 K4 + 0x7C040400, // 0007 CALL R1 2 + 0x7806002C, // 0008 JMPF R1 #0036 + 0x88040105, // 0009 GETMBR R1 R0 K5 + 0x4C080000, // 000A LDNIL R2 + 0x20040202, // 000B NE R1 R1 R2 + 0x78060024, // 000C JMPF R1 #0032 + 0x88040101, // 000D GETMBR R1 R0 K1 + 0x88040300, // 000E GETMBR R1 R1 K0 + 0x8C040306, // 000F GETMET R1 R1 K6 + 0x880C0105, // 0010 GETMBR R3 R0 K5 + 0x7C040400, // 0011 CALL R1 2 + 0x90020001, // 0012 SETMBR R0 K0 R1 + 0x88040101, // 0013 GETMBR R1 R0 K1 + 0x88040300, // 0014 GETMBR R1 R1 K0 + 0x8C040307, // 0015 GETMET R1 R1 K7 + 0x7C040200, // 0016 CALL R1 1 + 0xB80A1000, // 0017 GETNGBL R2 K8 + 0x8C080509, // 0018 GETMET R2 R2 K9 + 0xB8121000, // 0019 GETNGBL R4 K8 + 0x8810090A, // 001A GETMBR R4 R4 K10 + 0x8810090B, // 001B GETMBR R4 R4 K11 + 0x7C080400, // 001C CALL R2 2 + 0x8C0C030C, // 001D GETMET R3 R1 K12 + 0x5C140400, // 001E MOVE R5 R2 + 0x7C0C0400, // 001F CALL R3 2 + 0x8C10030D, // 0020 GETMET R4 R1 K13 + 0x0418070E, // 0021 SUB R6 R3 K14 + 0x5C1C0400, // 0022 MOVE R7 R2 + 0x7C100600, // 0023 CALL R4 3 + 0x8C140110, // 0024 GETMET R5 R0 K16 + 0x4C1C0000, // 0025 LDNIL R7 + 0x88200102, // 0026 GETMBR R8 R0 K2 + 0x60240013, // 0027 GETGBL R9 G19 + 0x7C240000, // 0028 CALL R9 0 + 0x5C280800, // 0029 MOVE R10 R4 + 0x5C2C0000, // 002A MOVE R11 R0 + 0x7C140C00, // 002B CALL R5 6 + 0x90021E05, // 002C SETMBR R0 K15 R5 + 0x88140101, // 002D GETMBR R5 R0 K1 + 0x8C140B11, // 002E GETMET R5 R5 K17 + 0x5C1C0000, // 002F MOVE R7 R0 + 0x7C140400, // 0030 CALL R5 2 + 0x70020002, // 0031 JMP #0035 + 0x60040001, // 0032 GETGBL R1 G1 + 0x58080012, // 0033 LDCONST R2 K18 + 0x7C040200, // 0034 CALL R1 1 + 0x70020002, // 0035 JMP #0039 + 0x60040001, // 0036 GETGBL R1 G1 + 0x58080013, // 0037 LDCONST R2 K19 + 0x7C040200, // 0038 CALL R1 1 + 0x80000000, // 0039 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: setmember +********************************************************************/ +be_local_closure(class_lvh_tab_setmember, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_tab, /* shared constants */ + be_str_weak(setmember), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0xA40E2800, // 0000 IMPORT R3 K20 + 0x8C100715, // 0001 GETMET R4 R3 K21 + 0x5C180200, // 0002 MOVE R6 R1 + 0x581C0016, // 0003 LDCONST R7 K22 + 0x7C100600, // 0004 CALL R4 3 + 0x78120007, // 0005 JMPF R4 #000E + 0x8810010F, // 0006 GETMBR R4 R0 K15 + 0x8C100917, // 0007 GETMET R4 R4 K23 + 0x541A0003, // 0008 LDINT R6 4 + 0x40180D18, // 0009 CONNECT R6 R6 K24 + 0x94180206, // 000A GETIDX R6 R1 R6 + 0x5C1C0400, // 000B MOVE R7 R2 + 0x7C100600, // 000C CALL R4 3 + 0x70020006, // 000D JMP #0015 + 0x60100003, // 000E GETGBL R4 G3 + 0x5C140000, // 000F MOVE R5 R0 + 0x7C100200, // 0010 CALL R4 1 + 0x8C100917, // 0011 GETMET R4 R4 K23 + 0x5C180200, // 0012 MOVE R6 R1 + 0x5C1C0400, // 0013 MOVE R7 R2 + 0x7C100600, // 0014 CALL R4 3 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: member +********************************************************************/ +be_local_closure(class_lvh_tab_member, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_tab, /* shared constants */ + be_str_weak(member), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0xA40A2800, // 0000 IMPORT R2 K20 + 0x8C0C0515, // 0001 GETMET R3 R2 K21 + 0x5C140200, // 0002 MOVE R5 R1 + 0x58180016, // 0003 LDCONST R6 K22 + 0x7C0C0600, // 0004 CALL R3 3 + 0x780E0007, // 0005 JMPF R3 #000E + 0x880C010F, // 0006 GETMBR R3 R0 K15 + 0x8C0C0719, // 0007 GETMET R3 R3 K25 + 0x54160003, // 0008 LDINT R5 4 + 0x40140B18, // 0009 CONNECT R5 R5 K24 + 0x94140205, // 000A GETIDX R5 R1 R5 + 0x7C0C0400, // 000B CALL R3 2 + 0x80040600, // 000C RET 1 R3 + 0x70020006, // 000D JMP #0015 + 0x600C0003, // 000E GETGBL R3 G3 + 0x5C100000, // 000F MOVE R4 R0 + 0x7C0C0200, // 0010 CALL R3 1 + 0x8C0C0719, // 0011 GETMET R3 R3 K25 + 0x5C140200, // 0012 MOVE R5 R1 + 0x7C0C0400, // 0013 CALL R3 2 + 0x80040600, // 0014 RET 1 R3 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(class_lvh_tab_init, /* name */ + be_nested_proto( + 13, /* nstack */ + 6, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_tab, /* shared constants */ + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[16]) { /* code */ + 0x8C18011A, // 0000 GETMET R6 R0 K26 + 0x8C20071B, // 0001 GETMET R8 R3 K27 + 0x5828001C, // 0002 LDCONST R10 K28 + 0x7C200400, // 0003 CALL R8 2 + 0x7C180400, // 0004 CALL R6 2 + 0x60180003, // 0005 GETGBL R6 G3 + 0x5C1C0000, // 0006 MOVE R7 R0 + 0x7C180200, // 0007 CALL R6 1 + 0x8C180D1D, // 0008 GETMET R6 R6 K29 + 0x5C200200, // 0009 MOVE R8 R1 + 0x5C240400, // 000A MOVE R9 R2 + 0x5C280600, // 000B MOVE R10 R3 + 0x5C2C0800, // 000C MOVE R11 R4 + 0x5C300A00, // 000D MOVE R12 R5 + 0x7C180C00, // 000E CALL R6 6 + 0x80000000, // 000F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text +********************************************************************/ +be_local_closure(class_lvh_tab_set_text, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_tab, /* shared constants */ + be_str_weak(set_text), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x90020A02, // 0003 SETMBR R0 K5 R2 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text +********************************************************************/ +be_local_closure(class_lvh_tab_get_text, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_tab, /* shared constants */ + be_str_weak(get_text), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040105, // 0000 GETMBR R1 R0 K5 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: lvh_tab +********************************************************************/ +extern const bclass be_class_lvh_obj; +be_local_class(lvh_tab, + 2, + &be_class_lvh_obj, + be_nested_map(10, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(post_init, 3), be_const_closure(class_lvh_tab_post_init_closure) }, + { be_const_key_weak(setmember, 2), be_const_closure(class_lvh_tab_setmember_closure) }, + { be_const_key_weak(member, -1), be_const_closure(class_lvh_tab_member_closure) }, + { be_const_key_weak(lvh_btn_tab, -1), be_const_class(be_class_lvh_btn_tab) }, + { be_const_key_weak(_text, 8), be_const_var(0) }, + { be_const_key_weak(init, 4), be_const_closure(class_lvh_tab_init_closure) }, + { be_const_key_weak(_btn, -1), be_const_var(1) }, + { be_const_key_weak(_lv_class, -1), be_const_nil() }, + { be_const_key_weak(set_text, -1), be_const_closure(class_lvh_tab_set_text_closure) }, + { be_const_key_weak(get_text, -1), be_const_closure(class_lvh_tab_get_text_closure) }, + })), + be_str_weak(lvh_tab) +); // compact class 'lvh_chart' ktab size: 25, total: 56 (saved 248 bytes) static const bvalue be_ktab_class_lvh_chart[25] = { /* K0 */ be_nested_str_weak(_y_min), @@ -9650,23 +10537,84 @@ be_local_class(lvh_chart, })), be_str_weak(lvh_chart) ); -// compact class 'lvh_btnmatrix' ktab size: 10, total: 11 (saved 8 bytes) -static const bvalue be_ktab_class_lvh_btnmatrix[10] = { - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(push), - /* K2 */ be_nested_str_weak(), - /* K3 */ be_nested_str_weak(_options), - /* K4 */ be_nested_str_weak(_options_arr), - /* K5 */ be_nested_str_weak(lv), - /* K6 */ be_nested_str_weak(str_arr), - /* K7 */ be_nested_str_weak(_lv_obj), - /* K8 */ be_nested_str_weak(set_map), - /* K9 */ be_nested_str_weak(HTP_X3A_X20_X27btnmatrix_X27_X20needs_X20_X27options_X27_X20to_X20be_X20a_X20list_X20of_X20strings), +// compact class 'lvh_btnmatrix' ktab size: 12, total: 15 (saved 24 bytes) +static const bvalue be_ktab_class_lvh_btnmatrix[12] = { + /* K0 */ be_nested_str_weak(_options), + /* K1 */ be_nested_str_weak(_lv_obj), + /* K2 */ be_nested_str_weak(get_selected_button), + /* K3 */ be_nested_str_weak(lv), + /* K4 */ be_nested_str_weak(BUTTONMATRIX_BUTTON_NONE), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(push), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_nested_str_weak(_options_arr), + /* K9 */ be_nested_str_weak(str_arr), + /* K10 */ be_nested_str_weak(set_map), + /* K11 */ be_nested_str_weak(HTP_X3A_X20_X27btnmatrix_X27_X20needs_X20_X27options_X27_X20to_X20be_X20a_X20list_X20of_X20strings), }; extern const bclass be_class_lvh_btnmatrix; +/******************************************************************** +** Solidified function: get_options +********************************************************************/ +be_local_closure(class_lvh_btnmatrix_get_options, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_btnmatrix, /* shared constants */ + be_str_weak(get_options), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_sub_id +********************************************************************/ +be_local_closure(class_lvh_btnmatrix_get_sub_id, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_lvh_btnmatrix, /* shared constants */ + be_str_weak(get_sub_id), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x8C040302, // 0001 GETMET R1 R1 K2 + 0x7C040200, // 0002 CALL R1 1 + 0xB80A0600, // 0003 GETNGBL R2 K3 + 0x88080504, // 0004 GETMBR R2 R2 K4 + 0x20080202, // 0005 NE R2 R1 R2 + 0x780A0001, // 0006 JMPF R2 #0009 + 0x5C080200, // 0007 MOVE R2 R1 + 0x70020000, // 0008 JMP #000A + 0x4C080000, // 0009 LDNIL R2 + 0x80040400, // 000A RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: set_options ********************************************************************/ @@ -9692,30 +10640,30 @@ be_local_closure(class_lvh_btnmatrix_set_options, /* name */ 0x6008000C, // 0005 GETGBL R2 G12 0x5C0C0200, // 0006 MOVE R3 R1 0x7C080200, // 0007 CALL R2 1 - 0x24080500, // 0008 GT R2 R2 K0 + 0x24080505, // 0008 GT R2 R2 K5 0x780A0013, // 0009 JMPF R2 #001E 0x6008000C, // 000A GETGBL R2 G12 0x540DFFFE, // 000B LDINT R3 -1 0x940C0203, // 000C GETIDX R3 R1 R3 0x7C080200, // 000D CALL R2 1 - 0x24080500, // 000E GT R2 R2 K0 + 0x24080505, // 000E GT R2 R2 K5 0x780A0002, // 000F JMPF R2 #0013 - 0x8C080301, // 0010 GETMET R2 R1 K1 - 0x58100002, // 0011 LDCONST R4 K2 + 0x8C080306, // 0010 GETMET R2 R1 K6 + 0x58100007, // 0011 LDCONST R4 K7 0x7C080400, // 0012 CALL R2 2 - 0x90020601, // 0013 SETMBR R0 K3 R1 - 0xB80A0A00, // 0014 GETNGBL R2 K5 - 0x8C080506, // 0015 GETMET R2 R2 K6 + 0x90020001, // 0013 SETMBR R0 K0 R1 + 0xB80A0600, // 0014 GETNGBL R2 K3 + 0x8C080509, // 0015 GETMET R2 R2 K9 0x5C100200, // 0016 MOVE R4 R1 0x7C080400, // 0017 CALL R2 2 - 0x90020802, // 0018 SETMBR R0 K4 R2 - 0x88080107, // 0019 GETMBR R2 R0 K7 - 0x8C080508, // 001A GETMET R2 R2 K8 - 0x88100104, // 001B GETMBR R4 R0 K4 + 0x90021002, // 0018 SETMBR R0 K8 R2 + 0x88080101, // 0019 GETMBR R2 R0 K1 + 0x8C08050A, // 001A GETMET R2 R2 K10 + 0x88100108, // 001B GETMBR R4 R0 K8 0x7C080400, // 001C CALL R2 2 0x70020002, // 001D JMP #0021 0x60080001, // 001E GETGBL R2 G1 - 0x580C0009, // 001F LDCONST R3 K9 + 0x580C000B, // 001F LDCONST R3 K11 0x7C080200, // 0020 CALL R2 1 0x80000000, // 0021 RET 0 }) @@ -9725,9 +10673,9 @@ be_local_closure(class_lvh_btnmatrix_set_options, /* name */ /******************************************************************** -** Solidified function: get_options +** Solidified function: get_val ********************************************************************/ -be_local_closure(class_lvh_btnmatrix_get_options, /* name */ +be_local_closure(class_lvh_btnmatrix_get_val, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -9738,10 +10686,10 @@ be_local_closure(class_lvh_btnmatrix_get_options, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_lvh_btnmatrix, /* shared constants */ - be_str_weak(get_options), + be_str_weak(get_val), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ - 0x88040103, // 0000 GETMBR R1 R0 K3 + 0x4C040000, // 0000 LDNIL R1 0x80040200, // 0001 RET 1 R1 }) ) @@ -9756,13 +10704,15 @@ extern const bclass be_class_lvh_obj; be_local_class(lvh_btnmatrix, 2, &be_class_lvh_obj, - be_nested_map(5, + be_nested_map(7, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(_options, 1), be_const_var(0) }, - { be_const_key_weak(set_options, -1), be_const_closure(class_lvh_btnmatrix_set_options_closure) }, - { be_const_key_weak(_lv_class, -1), be_const_class(be_class_lv_buttonmatrix) }, - { be_const_key_weak(_options_arr, -1), be_const_var(1) }, + { be_const_key_weak(_options, 2), be_const_var(0) }, { be_const_key_weak(get_options, -1), be_const_closure(class_lvh_btnmatrix_get_options_closure) }, + { be_const_key_weak(set_options, 1), be_const_closure(class_lvh_btnmatrix_set_options_closure) }, + { be_const_key_weak(_lv_class, 5), be_const_class(be_class_lv_buttonmatrix) }, + { be_const_key_weak(_options_arr, -1), be_const_var(1) }, + { be_const_key_weak(get_sub_id, -1), be_const_closure(class_lvh_btnmatrix_get_sub_id_closure) }, + { be_const_key_weak(get_val, -1), be_const_closure(class_lvh_btnmatrix_get_val_closure) }, })), be_str_weak(lvh_btnmatrix) ); @@ -10266,7 +11216,7 @@ static const bvalue be_ktab_class_lvh_page[47] = { /* K37 */ be_nested_str_weak(_X7B_X22hasp_X22_X3A_X7B_X22p_X25i_X22_X3A_X22out_X22_X7D_X7D), /* K38 */ be_nested_str_weak(lvh_page_cur_idx), /* K39 */ be_nested_str_weak(tasmota), - /* K40 */ be_nested_str_weak(set_timer), + /* K40 */ be_nested_str_weak(defer), /* K41 */ be_nested_str_weak(_X7B_X22hasp_X22_X3A_X7B_X22p_X25i_X22_X3A_X22in_X22_X7D_X7D), /* K42 */ be_nested_str_weak(screen_load), /* K43 */ be_nested_str_weak(show_anim), @@ -10762,7 +11712,7 @@ be_local_closure(class_lvh_page_show, /* name */ &be_ktab_class_lvh_page, /* shared constants */ be_str_weak(show), &be_const_str_solidified, - ( &(const binstruction[73]) { /* code */ + ( &(const binstruction[71]) { /* code */ 0x880C0111, // 0000 GETMBR R3 R0 K17 0x4C100000, // 0001 LDNIL R4 0x1C0C0604, // 0002 EQ R3 R3 R4 @@ -10798,44 +11748,42 @@ be_local_closure(class_lvh_page_show, /* name */ 0x7C0C0400, // 0020 CALL R3 2 0xB8124E00, // 0021 GETNGBL R4 K39 0x8C100928, // 0022 GETMET R4 R4 K40 - 0x5818000D, // 0023 LDCONST R6 K13 - 0x841C0000, // 0024 CLOSURE R7 P0 - 0x7C100600, // 0025 CALL R4 3 - 0x60100018, // 0026 GETGBL R4 G24 - 0x58140029, // 0027 LDCONST R5 K41 - 0x88180119, // 0028 GETMBR R6 R0 K25 - 0x7C100400, // 0029 CALL R4 2 - 0xB8164E00, // 002A GETNGBL R5 K39 - 0x8C140B28, // 002B GETMET R5 R5 K40 - 0x581C000D, // 002C LDCONST R7 K13 - 0x84200001, // 002D CLOSURE R8 P1 - 0x7C140600, // 002E CALL R5 3 - 0x88140118, // 002F GETMBR R5 R0 K24 - 0x88180119, // 0030 GETMBR R6 R0 K25 - 0x90164C06, // 0031 SETMBR R5 K38 R6 - 0x1C14030D, // 0032 EQ R5 R1 K13 - 0x78160004, // 0033 JMPF R5 #0039 - 0xB8163400, // 0034 GETNGBL R5 K26 - 0x8C140B2A, // 0035 GETMET R5 R5 K42 - 0x881C0111, // 0036 GETMBR R7 R0 K17 - 0x7C140400, // 0037 CALL R5 2 - 0x7002000D, // 0038 JMP #0047 - 0x8814012B, // 0039 GETMBR R5 R0 K43 - 0x8C140B12, // 003A GETMET R5 R5 K18 - 0x5C1C0200, // 003B MOVE R7 R1 - 0xB8223400, // 003C GETNGBL R8 K26 - 0x8820112C, // 003D GETMBR R8 R8 K44 - 0x7C140600, // 003E CALL R5 3 - 0xB81A3400, // 003F GETNGBL R6 K26 - 0x8C180D2D, // 0040 GETMET R6 R6 K45 - 0x88200111, // 0041 GETMBR R8 R0 K17 - 0x5C240A00, // 0042 MOVE R9 R5 - 0x5C280400, // 0043 MOVE R10 R2 - 0x582C000D, // 0044 LDCONST R11 K13 - 0x50300000, // 0045 LDBOOL R12 0 0 - 0x7C180C00, // 0046 CALL R6 6 - 0xA0000000, // 0047 CLOSE R0 - 0x80000000, // 0048 RET 0 + 0x84180000, // 0023 CLOSURE R6 P0 + 0x7C100400, // 0024 CALL R4 2 + 0x60100018, // 0025 GETGBL R4 G24 + 0x58140029, // 0026 LDCONST R5 K41 + 0x88180119, // 0027 GETMBR R6 R0 K25 + 0x7C100400, // 0028 CALL R4 2 + 0xB8164E00, // 0029 GETNGBL R5 K39 + 0x8C140B28, // 002A GETMET R5 R5 K40 + 0x841C0001, // 002B CLOSURE R7 P1 + 0x7C140400, // 002C CALL R5 2 + 0x88140118, // 002D GETMBR R5 R0 K24 + 0x88180119, // 002E GETMBR R6 R0 K25 + 0x90164C06, // 002F SETMBR R5 K38 R6 + 0x1C14030D, // 0030 EQ R5 R1 K13 + 0x78160004, // 0031 JMPF R5 #0037 + 0xB8163400, // 0032 GETNGBL R5 K26 + 0x8C140B2A, // 0033 GETMET R5 R5 K42 + 0x881C0111, // 0034 GETMBR R7 R0 K17 + 0x7C140400, // 0035 CALL R5 2 + 0x7002000D, // 0036 JMP #0045 + 0x8814012B, // 0037 GETMBR R5 R0 K43 + 0x8C140B12, // 0038 GETMET R5 R5 K18 + 0x5C1C0200, // 0039 MOVE R7 R1 + 0xB8223400, // 003A GETNGBL R8 K26 + 0x8820112C, // 003B GETMBR R8 R8 K44 + 0x7C140600, // 003C CALL R5 3 + 0xB81A3400, // 003D GETNGBL R6 K26 + 0x8C180D2D, // 003E GETMET R6 R6 K45 + 0x88200111, // 003F GETMBR R8 R0 K17 + 0x5C240A00, // 0040 MOVE R9 R5 + 0x5C280400, // 0041 MOVE R10 R2 + 0x582C000D, // 0042 LDCONST R11 K13 + 0x50300000, // 0043 LDBOOL R12 0 0 + 0x7C180C00, // 0044 CALL R6 6 + 0xA0000000, // 0045 CLOSE R0 + 0x80000000, // 0046 RET 0 }) ) ); @@ -10937,137 +11885,399 @@ be_local_class(lvh_page, be_str_weak(lvh_page) ); extern const bclass be_class_HASPmota; -// compact class 'HASPmota' ktab size: 124, total: 197 (saved 584 bytes) +// compact class 'HASPmota' ktab size: 124, total: 196 (saved 576 bytes) static const bvalue be_ktab_class_HASPmota[124] = { - /* K0 */ be_nested_str_weak(get_page_cur), - /* K1 */ be_nested_str_weak(pages_list_sorted), - /* K2 */ be_nested_str_weak(lvh_page_cur_idx), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str_weak(prev), - /* K5 */ be_nested_str_weak(next), - /* K6 */ be_nested_str_weak(back), - /* K7 */ be_const_int(0), - /* K8 */ be_nested_str_weak(delete), - /* K9 */ be_nested_str_weak(id), - /* K10 */ be_nested_str_weak(re_page_target), - /* K11 */ be_nested_str_weak(match), - /* K12 */ be_nested_str_weak(lvh_pages), - /* K13 */ be_nested_str_weak(show), - /* K14 */ be_nested_str_weak(cb), - /* K15 */ be_nested_str_weak(introspect), - /* K16 */ be_nested_str_weak(event_cb), - /* K17 */ be_nested_str_weak(gen_cb), - /* K18 */ be_nested_str_weak(_lv_obj), - /* K19 */ be_nested_str_weak(add_event_cb), - /* K20 */ be_nested_str_weak(toptr), - /* K21 */ be_nested_str_weak(string), - /* K22 */ be_nested_str_weak(json), - /* K23 */ be_nested_str_weak(r), - /* K24 */ be_nested_str_weak(read), - /* K25 */ be_nested_str_weak(close), - /* K26 */ be_nested_str_weak(split), - /* K27 */ be_nested_str_weak(_X0A), - /* K28 */ be_nested_str_weak(load), - /* K29 */ be_nested_str_weak(instance), - /* K30 */ be_nested_str_weak(tasmota), - /* K31 */ be_nested_str_weak(loglevel), - /* K32 */ be_nested_str_weak(log), - /* K33 */ be_nested_str_weak(HSP_X3A_X20parsing_X20line_X20_X27_X25s_X27), - /* K34 */ be_nested_str_weak(parse_page), - /* K35 */ be_nested_str_weak(value_error), - /* K36 */ be_nested_str_weak(no_X20page_X20_X27id_X27_X20defined), - /* K37 */ be_nested_str_weak(parse_obj), - /* K38 */ be_nested_str_weak(lvh_page_cur_idx_parsing), - /* K39 */ be_nested_str_weak(tr), - /* K40 */ be_nested_str_weak(_X20_X09), - /* K41 */ be_nested_str_weak(), - /* K42 */ be_nested_str_weak(HSP_X3A_X20invalid_X20JSON_X20line_X20_X27_X25s_X27), - /* K43 */ be_const_int(2), - /* K44 */ be_nested_str_weak(remove), - /* K45 */ be_nested_str_weak(no_X20page_X20object_X20defined), - /* K46 */ be_nested_str_weak(event), - /* K47 */ be_nested_str_weak(_p), - /* K48 */ be_nested_str_weak(lv), - /* K49 */ be_nested_str_weak(lv_event), - /* K50 */ be_nested_str_weak(get_user_data), - /* K51 */ be_nested_str_weak(fromptr), - /* K52 */ be_const_class(be_class_HASPmota), - /* K53 */ be_nested_str_weak(get), - /* K54 */ be_nested_str_weak(version), - /* K55 */ be_nested_str_weak(int), - /* K56 */ be_nested_str_weak(fix_lv_version), - /* K57 */ be_nested_str_weak(re), - /* K58 */ be_nested_str_weak(compile), - /* K59 */ be_nested_str_weak(p_X5Cd_X2B), - /* K60 */ be_nested_str_weak(keys), - /* K61 */ be_nested_str_weak(push), - /* K62 */ be_nested_str_weak(stop_iteration), - /* K63 */ be_nested_str_weak(sort), - /* K64 */ be_nested_str_weak(find), - /* K65 */ be_nested_str_weak(page_show), - /* K66 */ be_nested_str_weak(contains), - /* K67 */ be_nested_str_weak(global), - /* K68 */ be_nested_str_weak(p_X25s), - /* K69 */ be_nested_str_weak(EVENT_CLICKED), - /* K70 */ be_nested_str_weak(_action), - /* K71 */ be_nested_str_weak(has), - /* K72 */ be_nested_str_weak(page), - /* K73 */ be_nested_str_weak(lvh_page), - /* K74 */ be_nested_str_weak(get_page_cur_parsing), - /* K75 */ be_nested_str_weak(path), - /* K76 */ be_nested_str_weak(def_templ_name), - /* K77 */ be_nested_str_weak(exists), - /* K78 */ be_nested_str_weak(file_X20_X27), - /* K79 */ be_nested_str_weak(_X27_X20not_X20found), - /* K80 */ be_nested_str_weak(io_erorr), - /* K81 */ be_nested_str_weak(start), - /* K82 */ be_nested_str_weak(dark), - /* K83 */ be_nested_str_weak(hres), - /* K84 */ be_nested_str_weak(get_hor_res), - /* K85 */ be_nested_str_weak(vres), - /* K86 */ be_nested_str_weak(get_ver_res), - /* K87 */ be_nested_str_weak(scr), - /* K88 */ be_nested_str_weak(scr_act), - /* K89 */ be_nested_str_weak(r16), - /* K90 */ be_nested_str_weak(font_embedded), - /* K91 */ be_nested_str_weak(robotocondensed), - /* K92 */ be_nested_str_weak(montserrat), - /* K93 */ be_nested_str_weak(theme_haspmota_init), - /* K94 */ be_nested_str_weak(color), - /* K95 */ be_const_int(16711935), - /* K96 */ be_const_int(3158064), - /* K97 */ be_nested_str_weak(get_disp), - /* K98 */ be_nested_str_weak(set_theme), - /* K99 */ be_nested_str_weak(set_style_bg_color), - /* K100 */ be_const_int(16777215), - /* K101 */ be_nested_str_weak(theme_apply), - /* K102 */ be_nested_str_weak(layer_top), - /* K103 */ be_nested_str_weak(set_style_bg_opa), - /* K104 */ be_nested_str_weak(_load), - /* K105 */ be_nested_str_weak(obj), - /* K106 */ be_nested_str_weak(HSP_X3A_X20invalid_X20_X27id_X27_X3A_X20_X25s_X20for_X20_X27obj_X27_X3A_X20_X25s), - /* K107 */ be_nested_str_weak(get_obj), - /* K108 */ be_nested_str_weak(parentid), - /* K109 */ be_nested_str_weak(get_scr), - /* K110 */ be_nested_str_weak(lvh_), - /* K111 */ be_nested_str_weak(class), - /* K112 */ be_nested_str_weak(lvh_obj), - /* K113 */ be_nested_str_weak(module), - /* K114 */ be_nested_str_weak(HSP_X3A_X20Cannot_X20find_X20object_X20of_X20type_X20_X25s), - /* K115 */ be_nested_str_weak(add_obj), - /* K116 */ be_nested_str_weak(HSP_X3A_X20cannot_X20specify_X20_X27obj_X27_X3A_X27_X25s_X27_X20for_X20_X27id_X27_X3A0), - /* K117 */ be_nested_str_weak(post_config), - /* K118 */ be_nested_str_weak(berry_run), - /* K119 */ be_nested_str_weak(nil), - /* K120 */ be_nested_str_weak(HSP_X3A_X20unable_X20to_X20compile_X20berry_X20code_X20_X22_X25s_X22_X20_X2D_X20_X27_X25s_X27_X20_X2D_X20_X25s), - /* K121 */ be_nested_str_weak(function), - /* K122 */ be_nested_str_weak(HSP_X3A_X20unable_X20to_X20run_X20berry_X20code_X20_X22_X25s_X22_X20_X2D_X20_X27_X25s_X27_X20_X2D_X20_X25s), - /* K123 */ be_nested_str_weak(unable_X20to_X20parse_X20JSON_X20line), + /* K0 */ be_nested_str_weak(global), + /* K1 */ be_nested_str_weak(introspect), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(id), + /* K4 */ be_nested_str_weak(obj), + /* K5 */ be_nested_str_weak(get_page_cur_parsing), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(HSP_X3A_X20invalid_X20_X27id_X27_X3A_X20_X25s_X20for_X20_X27obj_X27_X3A_X20_X25s), + /* K8 */ be_nested_str_weak(get_obj), + /* K9 */ be_nested_str_weak(parentid), + /* K10 */ be_nested_str_weak(_lv_obj), + /* K11 */ be_nested_str_weak(get_scr), + /* K12 */ be_nested_str_weak(get), + /* K13 */ be_nested_str_weak(lvh_), + /* K14 */ be_nested_str_weak(class), + /* K15 */ be_nested_str_weak(lvh_obj), + /* K16 */ be_nested_str_weak(module), + /* K17 */ be_nested_str_weak(HSP_X3A_X20Cannot_X20find_X20object_X20of_X20type_X20_X25s), + /* K18 */ be_nested_str_weak(add_obj), + /* K19 */ be_nested_str_weak(HSP_X3A_X20cannot_X20specify_X20_X27obj_X27_X3A_X27_X25s_X27_X20for_X20_X27id_X27_X3A0), + /* K20 */ be_nested_str_weak(keys), + /* K21 */ be_nested_str_weak(stop_iteration), + /* K22 */ be_nested_str_weak(post_config), + /* K23 */ be_nested_str_weak(berry_run), + /* K24 */ be_nested_str_weak(nil), + /* K25 */ be_nested_str_weak(HSP_X3A_X20unable_X20to_X20compile_X20berry_X20code_X20_X22_X25s_X22_X20_X2D_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K26 */ be_nested_str_weak(function), + /* K27 */ be_nested_str_weak(HSP_X3A_X20unable_X20to_X20run_X20berry_X20code_X20_X22_X25s_X22_X20_X2D_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K28 */ be_nested_str_weak(get_page_cur), + /* K29 */ be_nested_str_weak(pages_list_sorted), + /* K30 */ be_nested_str_weak(lvh_page_cur_idx), + /* K31 */ be_const_int(1), + /* K32 */ be_nested_str_weak(prev), + /* K33 */ be_nested_str_weak(next), + /* K34 */ be_nested_str_weak(back), + /* K35 */ be_nested_str_weak(delete), + /* K36 */ be_nested_str_weak(re_page_target), + /* K37 */ be_nested_str_weak(match), + /* K38 */ be_nested_str_weak(lvh_pages), + /* K39 */ be_nested_str_weak(show), + /* K40 */ be_nested_str_weak(page_show), + /* K41 */ be_nested_str_weak(lvh_page_cur_idx_parsing), + /* K42 */ be_nested_str_weak(contains), + /* K43 */ be_nested_str_weak(remove), + /* K44 */ be_nested_str_weak(p_X25s), + /* K45 */ be_nested_str_weak(string), + /* K46 */ be_nested_str_weak(json), + /* K47 */ be_nested_str_weak(r), + /* K48 */ be_nested_str_weak(read), + /* K49 */ be_nested_str_weak(close), + /* K50 */ be_nested_str_weak(split), + /* K51 */ be_nested_str_weak(_X0A), + /* K52 */ be_nested_str_weak(load), + /* K53 */ be_nested_str_weak(instance), + /* K54 */ be_nested_str_weak(tasmota), + /* K55 */ be_nested_str_weak(loglevel), + /* K56 */ be_nested_str_weak(log), + /* K57 */ be_nested_str_weak(HSP_X3A_X20parsing_X20line_X20_X27_X25s_X27), + /* K58 */ be_nested_str_weak(parse_page), + /* K59 */ be_nested_str_weak(value_error), + /* K60 */ be_nested_str_weak(no_X20page_X20_X27id_X27_X20defined), + /* K61 */ be_nested_str_weak(parse_obj), + /* K62 */ be_nested_str_weak(tr), + /* K63 */ be_nested_str_weak(_X20_X09), + /* K64 */ be_nested_str_weak(), + /* K65 */ be_nested_str_weak(HSP_X3A_X20invalid_X20JSON_X20line_X20_X27_X25s_X27), + /* K66 */ be_const_int(2), + /* K67 */ be_nested_str_weak(no_X20page_X20object_X20defined), + /* K68 */ be_nested_str_weak(fix_lv_version), + /* K69 */ be_nested_str_weak(re), + /* K70 */ be_nested_str_weak(compile), + /* K71 */ be_nested_str_weak(p_X5Cd_X2B), + /* K72 */ be_nested_str_weak(has), + /* K73 */ be_nested_str_weak(page), + /* K74 */ be_nested_str_weak(int), + /* K75 */ be_nested_str_weak(lvh_page), + /* K76 */ be_nested_str_weak(unable_X20to_X20parse_X20JSON_X20line), + /* K77 */ be_nested_str_weak(path), + /* K78 */ be_nested_str_weak(def_templ_name), + /* K79 */ be_nested_str_weak(exists), + /* K80 */ be_nested_str_weak(file_X20_X27), + /* K81 */ be_nested_str_weak(_X27_X20not_X20found), + /* K82 */ be_nested_str_weak(io_erorr), + /* K83 */ be_nested_str_weak(lv), + /* K84 */ be_nested_str_weak(start), + /* K85 */ be_nested_str_weak(dark), + /* K86 */ be_nested_str_weak(hres), + /* K87 */ be_nested_str_weak(get_hor_res), + /* K88 */ be_nested_str_weak(vres), + /* K89 */ be_nested_str_weak(get_ver_res), + /* K90 */ be_nested_str_weak(scr), + /* K91 */ be_nested_str_weak(scr_act), + /* K92 */ be_nested_str_weak(r16), + /* K93 */ be_nested_str_weak(font_embedded), + /* K94 */ be_nested_str_weak(robotocondensed), + /* K95 */ be_nested_str_weak(montserrat), + /* K96 */ be_nested_str_weak(theme_haspmota_init), + /* K97 */ be_nested_str_weak(color), + /* K98 */ be_const_int(16711935), + /* K99 */ be_const_int(3158064), + /* K100 */ be_nested_str_weak(get_disp), + /* K101 */ be_nested_str_weak(set_theme), + /* K102 */ be_nested_str_weak(set_style_bg_color), + /* K103 */ be_const_int(16777215), + /* K104 */ be_nested_str_weak(theme_apply), + /* K105 */ be_nested_str_weak(layer_top), + /* K106 */ be_nested_str_weak(set_style_bg_opa), + /* K107 */ be_nested_str_weak(_load), + /* K108 */ be_const_class(be_class_HASPmota), + /* K109 */ be_nested_str_weak(EVENT_CLICKED), + /* K110 */ be_nested_str_weak(_action), + /* K111 */ be_nested_str_weak(toptr), + /* K112 */ be_nested_str_weak(event), + /* K113 */ be_nested_str_weak(_p), + /* K114 */ be_nested_str_weak(lv_event), + /* K115 */ be_nested_str_weak(get_user_data), + /* K116 */ be_nested_str_weak(fromptr), + /* K117 */ be_nested_str_weak(event_cb), + /* K118 */ be_nested_str_weak(cb), + /* K119 */ be_nested_str_weak(gen_cb), + /* K120 */ be_nested_str_weak(add_event_cb), + /* K121 */ be_nested_str_weak(version), + /* K122 */ be_nested_str_weak(push), + /* K123 */ be_nested_str_weak(sort), }; extern const bclass be_class_HASPmota; +/******************************************************************** +** Solidified function: parse_obj +********************************************************************/ +be_local_closure(class_HASPmota_parse_obj, /* name */ + be_nested_proto( + 20, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_HASPmota, /* shared constants */ + be_str_weak(parse_obj), + &be_const_str_solidified, + ( &(const binstruction[239]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x60140009, // 0002 GETGBL R5 G9 + 0x8C180302, // 0003 GETMET R6 R1 K2 + 0x58200003, // 0004 LDCONST R8 K3 + 0x7C180400, // 0005 CALL R6 2 + 0x7C140200, // 0006 CALL R5 1 + 0x8C180302, // 0007 GETMET R6 R1 K2 + 0x58200004, // 0008 LDCONST R8 K4 + 0x7C180400, // 0009 CALL R6 2 + 0x4C1C0000, // 000A LDNIL R7 + 0x201C0C07, // 000B NE R7 R6 R7 + 0x781E0003, // 000C JMPF R7 #0011 + 0x601C0008, // 000D GETGBL R7 G8 + 0x5C200C00, // 000E MOVE R8 R6 + 0x7C1C0200, // 000F CALL R7 1 + 0x70020000, // 0010 JMP #0012 + 0x4C1C0000, // 0011 LDNIL R7 + 0x5C180E00, // 0012 MOVE R6 R7 + 0x8C1C0105, // 0013 GETMET R7 R0 K5 + 0x7C1C0200, // 0014 CALL R7 1 + 0x4C200000, // 0015 LDNIL R8 + 0x20200A08, // 0016 NE R8 R5 R8 + 0x78220011, // 0017 JMPF R8 #002A + 0x14200B06, // 0018 LT R8 R5 K6 + 0x74220002, // 0019 JMPT R8 #001D + 0x542200FD, // 001A LDINT R8 254 + 0x24200A08, // 001B GT R8 R5 R8 + 0x7822000C, // 001C JMPF R8 #002A + 0x20200B06, // 001D NE R8 R5 K6 + 0x74220002, // 001E JMPT R8 #0022 + 0x4C200000, // 001F LDNIL R8 + 0x1C200C08, // 0020 EQ R8 R6 R8 + 0x78220007, // 0021 JMPF R8 #002A + 0x60200001, // 0022 GETGBL R8 G1 + 0x60240018, // 0023 GETGBL R9 G24 + 0x58280007, // 0024 LDCONST R10 K7 + 0x5C2C0A00, // 0025 MOVE R11 R5 + 0x5C300C00, // 0026 MOVE R12 R6 + 0x7C240600, // 0027 CALL R9 3 + 0x7C200200, // 0028 CALL R8 1 + 0x80001000, // 0029 RET 0 + 0x8C200F08, // 002A GETMET R8 R7 K8 + 0x5C280A00, // 002B MOVE R10 R5 + 0x7C200400, // 002C CALL R8 2 + 0x4C240000, // 002D LDNIL R9 + 0x20240C09, // 002E NE R9 R6 R9 + 0x7826005F, // 002F JMPF R9 #0090 + 0x4C240000, // 0030 LDNIL R9 + 0x20240A09, // 0031 NE R9 R5 R9 + 0x7826005C, // 0032 JMPF R9 #0090 + 0x4C240000, // 0033 LDNIL R9 + 0x1C241009, // 0034 EQ R9 R8 R9 + 0x78260059, // 0035 JMPF R9 #0090 + 0x60240009, // 0036 GETGBL R9 G9 + 0x8C280302, // 0037 GETMET R10 R1 K2 + 0x58300009, // 0038 LDCONST R12 K9 + 0x7C280400, // 0039 CALL R10 2 + 0x7C240200, // 003A CALL R9 1 + 0x4C280000, // 003B LDNIL R10 + 0x4C2C0000, // 003C LDNIL R11 + 0x4C300000, // 003D LDNIL R12 + 0x2030120C, // 003E NE R12 R9 R12 + 0x78320007, // 003F JMPF R12 #0048 + 0x8C300F08, // 0040 GETMET R12 R7 K8 + 0x5C381200, // 0041 MOVE R14 R9 + 0x7C300400, // 0042 CALL R12 2 + 0x5C281800, // 0043 MOVE R10 R12 + 0x4C300000, // 0044 LDNIL R12 + 0x2030140C, // 0045 NE R12 R10 R12 + 0x78320000, // 0046 JMPF R12 #0048 + 0x882C150A, // 0047 GETMBR R11 R10 K10 + 0x4C300000, // 0048 LDNIL R12 + 0x1C30160C, // 0049 EQ R12 R11 R12 + 0x78320002, // 004A JMPF R12 #004E + 0x8C300F0B, // 004B GETMET R12 R7 K11 + 0x7C300200, // 004C CALL R12 1 + 0x5C2C1800, // 004D MOVE R11 R12 + 0x8C30090C, // 004E GETMET R12 R4 K12 + 0x5C380000, // 004F MOVE R14 R0 + 0x003E1A06, // 0050 ADD R15 K13 R6 + 0x7C300600, // 0051 CALL R12 3 + 0x4C340000, // 0052 LDNIL R13 + 0x4C380000, // 0053 LDNIL R14 + 0x1C38180E, // 0054 EQ R14 R12 R14 + 0x783A0010, // 0055 JMPF R14 #0067 + 0x8C38090C, // 0056 GETMET R14 R4 K12 + 0x5C400600, // 0057 MOVE R16 R3 + 0x5C440C00, // 0058 MOVE R17 R6 + 0x7C380600, // 0059 CALL R14 3 + 0x4C3C0000, // 005A LDNIL R15 + 0x203C1C0F, // 005B NE R15 R14 R15 + 0x783E0009, // 005C JMPF R15 #0067 + 0x603C0004, // 005D GETGBL R15 G4 + 0x5C401C00, // 005E MOVE R16 R14 + 0x7C3C0200, // 005F CALL R15 1 + 0x1C3C1F0E, // 0060 EQ R15 R15 K14 + 0x783E0004, // 0061 JMPF R15 #0067 + 0x5C3C1C00, // 0062 MOVE R15 R14 + 0x5C401600, // 0063 MOVE R16 R11 + 0x7C3C0200, // 0064 CALL R15 1 + 0x5C341E00, // 0065 MOVE R13 R15 + 0x8830010F, // 0066 GETMBR R12 R0 K15 + 0x4C380000, // 0067 LDNIL R14 + 0x1C38180E, // 0068 EQ R14 R12 R14 + 0x783A000F, // 0069 JMPF R14 #007A + 0x8C380910, // 006A GETMET R14 R4 K16 + 0x5C400C00, // 006B MOVE R16 R6 + 0x7C380400, // 006C CALL R14 2 + 0x4C3C0000, // 006D LDNIL R15 + 0x203C1C0F, // 006E NE R15 R14 R15 + 0x783E0009, // 006F JMPF R15 #007A + 0x603C0004, // 0070 GETGBL R15 G4 + 0x5C401C00, // 0071 MOVE R16 R14 + 0x7C3C0200, // 0072 CALL R15 1 + 0x1C3C1F0E, // 0073 EQ R15 R15 K14 + 0x783E0004, // 0074 JMPF R15 #007A + 0x5C3C1C00, // 0075 MOVE R15 R14 + 0x5C401600, // 0076 MOVE R16 R11 + 0x7C3C0200, // 0077 CALL R15 1 + 0x5C341E00, // 0078 MOVE R13 R15 + 0x8830010F, // 0079 GETMBR R12 R0 K15 + 0x4C380000, // 007A LDNIL R14 + 0x1C38180E, // 007B EQ R14 R12 R14 + 0x783A0006, // 007C JMPF R14 #0084 + 0x60380001, // 007D GETGBL R14 G1 + 0x603C0018, // 007E GETGBL R15 G24 + 0x58400011, // 007F LDCONST R16 K17 + 0x5C440C00, // 0080 MOVE R17 R6 + 0x7C3C0400, // 0081 CALL R15 2 + 0x7C380200, // 0082 CALL R14 1 + 0x80001C00, // 0083 RET 0 + 0x5C381800, // 0084 MOVE R14 R12 + 0x5C3C1600, // 0085 MOVE R15 R11 + 0x5C400400, // 0086 MOVE R16 R2 + 0x5C440200, // 0087 MOVE R17 R1 + 0x5C481A00, // 0088 MOVE R18 R13 + 0x5C4C1400, // 0089 MOVE R19 R10 + 0x7C380A00, // 008A CALL R14 5 + 0x5C201C00, // 008B MOVE R8 R14 + 0x8C380F12, // 008C GETMET R14 R7 K18 + 0x5C400A00, // 008D MOVE R16 R5 + 0x5C441000, // 008E MOVE R17 R8 + 0x7C380600, // 008F CALL R14 3 + 0x1C240B06, // 0090 EQ R9 R5 K6 + 0x7826000F, // 0091 JMPF R9 #00A2 + 0x4C240000, // 0092 LDNIL R9 + 0x20240C09, // 0093 NE R9 R6 R9 + 0x78260006, // 0094 JMPF R9 #009C + 0x60240001, // 0095 GETGBL R9 G1 + 0x60280018, // 0096 GETGBL R10 G24 + 0x582C0013, // 0097 LDCONST R11 K19 + 0x5C300C00, // 0098 MOVE R12 R6 + 0x7C280400, // 0099 CALL R10 2 + 0x7C240200, // 009A CALL R9 1 + 0x80001200, // 009B RET 0 + 0x8C240105, // 009C GETMET R9 R0 K5 + 0x7C240200, // 009D CALL R9 1 + 0x8C241308, // 009E GETMET R9 R9 K8 + 0x582C0006, // 009F LDCONST R11 K6 + 0x7C240400, // 00A0 CALL R9 2 + 0x5C201200, // 00A1 MOVE R8 R9 + 0x4C240000, // 00A2 LDNIL R9 + 0x20241009, // 00A3 NE R9 R8 R9 + 0x7826000C, // 00A4 JMPF R9 #00B2 + 0x60240010, // 00A5 GETGBL R9 G16 + 0x8C280314, // 00A6 GETMET R10 R1 K20 + 0x7C280200, // 00A7 CALL R10 1 + 0x7C240200, // 00A8 CALL R9 1 + 0xA8020004, // 00A9 EXBLK 0 #00AF + 0x5C281200, // 00AA MOVE R10 R9 + 0x7C280000, // 00AB CALL R10 0 + 0x942C020A, // 00AC GETIDX R11 R1 R10 + 0x9020140B, // 00AD SETMBR R8 R10 R11 + 0x7001FFFA, // 00AE JMP #00AA + 0x58240015, // 00AF LDCONST R9 K21 + 0xAC240200, // 00B0 CATCH R9 1 0 + 0xB0080000, // 00B1 RAISE 2 R0 R0 + 0x4C240000, // 00B2 LDNIL R9 + 0x20241009, // 00B3 NE R9 R8 R9 + 0x78260001, // 00B4 JMPF R9 #00B7 + 0x8C241116, // 00B5 GETMET R9 R8 K22 + 0x7C240200, // 00B6 CALL R9 1 + 0x4C240000, // 00B7 LDNIL R9 + 0x60280008, // 00B8 GETGBL R10 G8 + 0x8C2C0302, // 00B9 GETMET R11 R1 K2 + 0x58340017, // 00BA LDCONST R13 K23 + 0x7C2C0400, // 00BB CALL R11 2 + 0x7C280200, // 00BC CALL R10 1 + 0x202C1518, // 00BD NE R11 R10 K24 + 0x782E0012, // 00BE JMPF R11 #00D2 + 0xA8020005, // 00BF EXBLK 0 #00C6 + 0x602C000D, // 00C0 GETGBL R11 G13 + 0x5C301400, // 00C1 MOVE R12 R10 + 0x7C2C0200, // 00C2 CALL R11 1 + 0x5C241600, // 00C3 MOVE R9 R11 + 0xA8040001, // 00C4 EXBLK 1 1 + 0x7002000B, // 00C5 JMP #00D2 + 0xAC2C0002, // 00C6 CATCH R11 0 2 + 0x70020008, // 00C7 JMP #00D1 + 0x60340001, // 00C8 GETGBL R13 G1 + 0x60380018, // 00C9 GETGBL R14 G24 + 0x583C0019, // 00CA LDCONST R15 K25 + 0x5C401400, // 00CB MOVE R16 R10 + 0x5C441600, // 00CC MOVE R17 R11 + 0x5C481800, // 00CD MOVE R18 R12 + 0x7C380800, // 00CE CALL R14 4 + 0x7C340200, // 00CF CALL R13 1 + 0x70020000, // 00D0 JMP #00D2 + 0xB0080000, // 00D1 RAISE 2 R0 R0 + 0x4C2C0000, // 00D2 LDNIL R11 + 0x202C120B, // 00D3 NE R11 R9 R11 + 0x782E0018, // 00D4 JMPF R11 #00EE + 0xA802000B, // 00D5 EXBLK 0 #00E2 + 0x5C2C1200, // 00D6 MOVE R11 R9 + 0x7C2C0000, // 00D7 CALL R11 0 + 0x60300004, // 00D8 GETGBL R12 G4 + 0x5C341600, // 00D9 MOVE R13 R11 + 0x7C300200, // 00DA CALL R12 1 + 0x1C30191A, // 00DB EQ R12 R12 K26 + 0x78320002, // 00DC JMPF R12 #00E0 + 0x5C301600, // 00DD MOVE R12 R11 + 0x5C341000, // 00DE MOVE R13 R8 + 0x7C300200, // 00DF CALL R12 1 + 0xA8040001, // 00E0 EXBLK 1 1 + 0x7002000B, // 00E1 JMP #00EE + 0xAC2C0002, // 00E2 CATCH R11 0 2 + 0x70020008, // 00E3 JMP #00ED + 0x60340001, // 00E4 GETGBL R13 G1 + 0x60380018, // 00E5 GETGBL R14 G24 + 0x583C001B, // 00E6 LDCONST R15 K27 + 0x5C401400, // 00E7 MOVE R16 R10 + 0x5C441600, // 00E8 MOVE R17 R11 + 0x5C481800, // 00E9 MOVE R18 R12 + 0x7C380800, // 00EA CALL R14 4 + 0x7C340200, // 00EB CALL R13 1 + 0x70020000, // 00EC JMP #00EE + 0xB0080000, // 00ED RAISE 2 R0 R0 + 0x80000000, // 00EE RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: page_show ********************************************************************/ @@ -11118,23 +12328,23 @@ be_local_closure(class_HASPmota_page_show, /* name */ ( &(const binstruction[108]) { /* code */ 0x84100000, // 0000 CLOSURE R4 P0 0x4C140000, // 0001 LDNIL R5 - 0x8C180100, // 0002 GETMET R6 R0 K0 + 0x8C18011C, // 0002 GETMET R6 R0 K28 0x7C180200, // 0003 CALL R6 1 - 0x8C1C0101, // 0004 GETMET R7 R0 K1 - 0x88240102, // 0005 GETMBR R9 R0 K2 + 0x8C1C011D, // 0004 GETMET R7 R0 K29 + 0x8824011E, // 0005 GETMBR R9 R0 K30 0x7C1C0400, // 0006 CALL R7 2 0x6020000C, // 0007 GETGBL R8 G12 0x5C240E00, // 0008 MOVE R9 R7 0x7C200200, // 0009 CALL R8 1 - 0x18201103, // 000A LE R8 R8 K3 + 0x1820111F, // 000A LE R8 R8 K31 0x78220001, // 000B JMPF R8 #000E 0x4C200000, // 000C LDNIL R8 0x80041000, // 000D RET 1 R8 - 0x1C200304, // 000E EQ R8 R1 K4 + 0x1C200320, // 000E EQ R8 R1 K32 0x78220009, // 000F JMPF R8 #001A 0x5C200800, // 0010 MOVE R8 R4 0x60240009, // 0011 GETGBL R9 G9 - 0x88280D04, // 0012 GETMBR R10 R6 K4 + 0x88280D20, // 0012 GETMBR R10 R6 K32 0x7C240200, // 0013 CALL R9 1 0x5429FFFE, // 0014 LDINT R10 -1 0x94280E0A, // 0015 GETIDX R10 R7 R10 @@ -11142,66 +12352,66 @@ be_local_closure(class_HASPmota_page_show, /* name */ 0x7C200600, // 0017 CALL R8 3 0x5C141000, // 0018 MOVE R5 R8 0x70020041, // 0019 JMP #005C - 0x1C200305, // 001A EQ R8 R1 K5 + 0x1C200321, // 001A EQ R8 R1 K33 0x78220008, // 001B JMPF R8 #0025 0x5C200800, // 001C MOVE R8 R4 0x60240009, // 001D GETGBL R9 G9 - 0x88280D05, // 001E GETMBR R10 R6 K5 + 0x88280D21, // 001E GETMBR R10 R6 K33 0x7C240200, // 001F CALL R9 1 - 0x94280F03, // 0020 GETIDX R10 R7 K3 + 0x94280F1F, // 0020 GETIDX R10 R7 K31 0x5C2C0E00, // 0021 MOVE R11 R7 0x7C200600, // 0022 CALL R8 3 0x5C141000, // 0023 MOVE R5 R8 0x70020036, // 0024 JMP #005C - 0x1C200306, // 0025 EQ R8 R1 K6 + 0x1C200322, // 0025 EQ R8 R1 K34 0x7822000B, // 0026 JMPF R8 #0033 0x5C200800, // 0027 MOVE R8 R4 0x60240009, // 0028 GETGBL R9 G9 - 0x88280D06, // 0029 GETMBR R10 R6 K6 + 0x88280D22, // 0029 GETMBR R10 R6 K34 0x7C240200, // 002A CALL R9 1 - 0x8C280101, // 002B GETMET R10 R0 K1 + 0x8C28011D, // 002B GETMET R10 R0 K29 0x4C300000, // 002C LDNIL R12 0x7C280400, // 002D CALL R10 2 - 0x94281507, // 002E GETIDX R10 R10 K7 + 0x94281506, // 002E GETIDX R10 R10 K6 0x5C2C0E00, // 002F MOVE R11 R7 0x7C200600, // 0030 CALL R8 3 0x5C141000, // 0031 MOVE R5 R8 0x70020028, // 0032 JMP #005C - 0x1C200308, // 0033 EQ R8 R1 K8 + 0x1C200323, // 0033 EQ R8 R1 K35 0x78220017, // 0034 JMPF R8 #004D 0x5C200800, // 0035 MOVE R8 R4 0x60240009, // 0036 GETGBL R9 G9 - 0x88280D06, // 0037 GETMBR R10 R6 K6 + 0x88280D22, // 0037 GETMBR R10 R6 K34 0x7C240200, // 0038 CALL R9 1 - 0x8C280101, // 0039 GETMET R10 R0 K1 + 0x8C28011D, // 0039 GETMET R10 R0 K29 0x4C300000, // 003A LDNIL R12 0x7C280400, // 003B CALL R10 2 - 0x94281507, // 003C GETIDX R10 R10 K7 + 0x94281506, // 003C GETIDX R10 R10 K6 0x5C2C0E00, // 003D MOVE R11 R7 0x7C200600, // 003E CALL R8 3 0x5C141000, // 003F MOVE R5 R8 - 0x8C200D09, // 0040 GETMET R8 R6 K9 + 0x8C200D03, // 0040 GETMET R8 R6 K3 0x7C200200, // 0041 CALL R8 1 0x1C200A08, // 0042 EQ R8 R5 R8 0x78220007, // 0043 JMPF R8 #004C 0x5C200800, // 0044 MOVE R8 R4 0x60240009, // 0045 GETGBL R9 G9 - 0x88280D05, // 0046 GETMBR R10 R6 K5 + 0x88280D21, // 0046 GETMBR R10 R6 K33 0x7C240200, // 0047 CALL R9 1 - 0x94280F03, // 0048 GETIDX R10 R7 K3 + 0x94280F1F, // 0048 GETIDX R10 R7 K31 0x5C2C0E00, // 0049 MOVE R11 R7 0x7C200600, // 004A CALL R8 3 0x5C141000, // 004B MOVE R5 R8 0x7002000E, // 004C JMP #005C - 0x8820010A, // 004D GETMBR R8 R0 K10 - 0x8C20110B, // 004E GETMET R8 R8 K11 + 0x88200124, // 004D GETMBR R8 R0 K36 + 0x8C201125, // 004E GETMET R8 R8 K37 0x5C280200, // 004F MOVE R10 R1 0x7C200400, // 0050 CALL R8 2 0x78220009, // 0051 JMPF R8 #005C 0x5C200800, // 0052 MOVE R8 R4 0x60240009, // 0053 GETGBL R9 G9 0x5429FFFE, // 0054 LDINT R10 -1 - 0x402A060A, // 0055 CONNECT R10 K3 R10 + 0x402A3E0A, // 0055 CONNECT R10 K31 R10 0x9428020A, // 0056 GETIDX R10 R1 R10 0x7C240200, // 0057 CALL R9 1 0x4C280000, // 0058 LDNIL R10 @@ -11211,14 +12421,14 @@ be_local_closure(class_HASPmota_page_show, /* name */ 0x4C200000, // 005C LDNIL R8 0x20200A08, // 005D NE R8 R5 R8 0x7822000B, // 005E JMPF R8 #006B - 0x24200B07, // 005F GT R8 R5 K7 + 0x24200B06, // 005F GT R8 R5 K6 0x78220009, // 0060 JMPF R8 #006B - 0x8820010C, // 0061 GETMBR R8 R0 K12 + 0x88200126, // 0061 GETMBR R8 R0 K38 0x94201005, // 0062 GETIDX R8 R8 R5 0x4C240000, // 0063 LDNIL R9 0x20241009, // 0064 NE R9 R8 R9 0x78260003, // 0065 JMPF R9 #006A - 0x8C24110D, // 0066 GETMET R9 R8 K13 + 0x8C241127, // 0066 GETMET R9 R8 K39 0x5C2C0400, // 0067 MOVE R11 R2 0x5C300600, // 0068 MOVE R12 R3 0x7C240600, // 0069 CALL R9 3 @@ -11230,6 +12440,663 @@ be_local_closure(class_HASPmota_page_show, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: _remove_page +********************************************************************/ +be_local_closure(class_HASPmota__remove_page, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_HASPmota, /* shared constants */ + be_str_weak(_remove_page), + &be_const_str_solidified, + ( &(const binstruction[37]) { /* code */ + 0x8C08011C, // 0000 GETMET R2 R0 K28 + 0x7C080200, // 0001 CALL R2 1 + 0x8C080503, // 0002 GETMET R2 R2 K3 + 0x7C080200, // 0003 CALL R2 1 + 0x1C0C0202, // 0004 EQ R3 R1 R2 + 0x780E0008, // 0005 JMPF R3 #000F + 0x8C0C0128, // 0006 GETMET R3 R0 K40 + 0x58140023, // 0007 LDCONST R5 K35 + 0x58180006, // 0008 LDCONST R6 K6 + 0x581C0006, // 0009 LDCONST R7 K6 + 0x7C0C0800, // 000A CALL R3 4 + 0x4C100000, // 000B LDNIL R4 + 0x1C100604, // 000C EQ R4 R3 R4 + 0x78120000, // 000D JMPF R4 #000F + 0x80000800, // 000E RET 0 + 0x880C0129, // 000F GETMBR R3 R0 K41 + 0x1C0C0601, // 0010 EQ R3 R3 R1 + 0x780E0001, // 0011 JMPF R3 #0014 + 0x880C011E, // 0012 GETMBR R3 R0 K30 + 0x90025203, // 0013 SETMBR R0 K41 R3 + 0x880C0126, // 0014 GETMBR R3 R0 K38 + 0x8C0C072A, // 0015 GETMET R3 R3 K42 + 0x5C140200, // 0016 MOVE R5 R1 + 0x7C0C0400, // 0017 CALL R3 2 + 0x780E0003, // 0018 JMPF R3 #001D + 0x880C0126, // 0019 GETMBR R3 R0 K38 + 0x8C0C072B, // 001A GETMET R3 R3 K43 + 0x5C140200, // 001B MOVE R5 R1 + 0x7C0C0400, // 001C CALL R3 2 + 0x600C0018, // 001D GETGBL R3 G24 + 0x5810002C, // 001E LDCONST R4 K44 + 0x5C140200, // 001F MOVE R5 R1 + 0x7C0C0400, // 0020 CALL R3 2 + 0xB8120000, // 0021 GETNGBL R4 K0 + 0x4C140000, // 0022 LDNIL R5 + 0x90100605, // 0023 SETMBR R4 R3 R5 + 0x80000000, // 0024 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_page_cur_parsing +********************************************************************/ +be_local_closure(class_HASPmota_get_page_cur_parsing, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_HASPmota, /* shared constants */ + be_str_weak(get_page_cur_parsing), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040126, // 0000 GETMBR R1 R0 K38 + 0x88080129, // 0001 GETMBR R2 R0 K41 + 0x94040202, // 0002 GETIDX R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _load +********************************************************************/ +be_local_closure(class_HASPmota__load, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_HASPmota, /* shared constants */ + be_str_weak(_load), + &be_const_str_solidified, + ( &(const binstruction[99]) { /* code */ + 0xA40A5A00, // 0000 IMPORT R2 K45 + 0xA40E5C00, // 0001 IMPORT R3 K46 + 0x60100011, // 0002 GETGBL R4 G17 + 0x5C140200, // 0003 MOVE R5 R1 + 0x5818002F, // 0004 LDCONST R6 K47 + 0x7C100400, // 0005 CALL R4 2 + 0x8C140930, // 0006 GETMET R5 R4 K48 + 0x7C140200, // 0007 CALL R5 1 + 0x8C180931, // 0008 GETMET R6 R4 K49 + 0x7C180200, // 0009 CALL R6 1 + 0x8C180532, // 000A GETMET R6 R2 K50 + 0x5C200A00, // 000B MOVE R8 R5 + 0x58240033, // 000C LDCONST R9 K51 + 0x7C180600, // 000D CALL R6 3 + 0x4C100000, // 000E LDNIL R4 + 0x4C140000, // 000F LDNIL R5 + 0x601C000C, // 0010 GETGBL R7 G12 + 0x5C200C00, // 0011 MOVE R8 R6 + 0x7C1C0200, // 0012 CALL R7 1 + 0x241C0F06, // 0013 GT R7 R7 K6 + 0x781E0039, // 0014 JMPF R7 #004F + 0x8C1C0734, // 0015 GETMET R7 R3 K52 + 0x94240D06, // 0016 GETIDX R9 R6 K6 + 0x7C1C0400, // 0017 CALL R7 2 + 0x60200004, // 0018 GETGBL R8 G4 + 0x5C240E00, // 0019 MOVE R9 R7 + 0x7C200200, // 001A CALL R8 1 + 0x1C201135, // 001B EQ R8 R8 K53 + 0x7822001B, // 001C JMPF R8 #0039 + 0xB8226C00, // 001D GETNGBL R8 K54 + 0x8C201137, // 001E GETMET R8 R8 K55 + 0x542A0003, // 001F LDINT R10 4 + 0x7C200400, // 0020 CALL R8 2 + 0x78220007, // 0021 JMPF R8 #002A + 0xB8226C00, // 0022 GETNGBL R8 K54 + 0x8C201138, // 0023 GETMET R8 R8 K56 + 0x60280018, // 0024 GETGBL R10 G24 + 0x582C0039, // 0025 LDCONST R11 K57 + 0x94300D06, // 0026 GETIDX R12 R6 K6 + 0x7C280400, // 0027 CALL R10 2 + 0x542E0003, // 0028 LDINT R11 4 + 0x7C200600, // 0029 CALL R8 3 + 0x8C20013A, // 002A GETMET R8 R0 K58 + 0x5C280E00, // 002B MOVE R10 R7 + 0x7C200400, // 002C CALL R8 2 + 0x88200126, // 002D GETMBR R8 R0 K38 + 0x4C240000, // 002E LDNIL R9 + 0x1C201009, // 002F EQ R8 R8 R9 + 0x78220000, // 0030 JMPF R8 #0032 + 0xB006773C, // 0031 RAISE 1 K59 K60 + 0x8C20013D, // 0032 GETMET R8 R0 K61 + 0x5C280E00, // 0033 MOVE R10 R7 + 0x882C0126, // 0034 GETMBR R11 R0 K38 + 0x88300129, // 0035 GETMBR R12 R0 K41 + 0x942C160C, // 0036 GETIDX R11 R11 R12 + 0x7C200600, // 0037 CALL R8 3 + 0x70020010, // 0038 JMP #004A + 0x6020000C, // 0039 GETGBL R8 G12 + 0x8C24053E, // 003A GETMET R9 R2 K62 + 0x942C0D06, // 003B GETIDX R11 R6 K6 + 0x5830003F, // 003C LDCONST R12 K63 + 0x58340040, // 003D LDCONST R13 K64 + 0x7C240800, // 003E CALL R9 4 + 0x7C200200, // 003F CALL R8 1 + 0x24201106, // 0040 GT R8 R8 K6 + 0x78220007, // 0041 JMPF R8 #004A + 0xB8226C00, // 0042 GETNGBL R8 K54 + 0x8C201138, // 0043 GETMET R8 R8 K56 + 0x60280018, // 0044 GETGBL R10 G24 + 0x582C0041, // 0045 LDCONST R11 K65 + 0x94300D06, // 0046 GETIDX R12 R6 K6 + 0x7C280400, // 0047 CALL R10 2 + 0x582C0042, // 0048 LDCONST R11 K66 + 0x7C200600, // 0049 CALL R8 3 + 0x4C1C0000, // 004A LDNIL R7 + 0x8C200D2B, // 004B GETMET R8 R6 K43 + 0x58280006, // 004C LDCONST R10 K6 + 0x7C200400, // 004D CALL R8 2 + 0x7001FFC0, // 004E JMP #0010 + 0x4C180000, // 004F LDNIL R6 + 0x8C1C011D, // 0050 GETMET R7 R0 K29 + 0x4C240000, // 0051 LDNIL R9 + 0x7C1C0400, // 0052 CALL R7 2 + 0x6020000C, // 0053 GETGBL R8 G12 + 0x5C240E00, // 0054 MOVE R9 R7 + 0x7C200200, // 0055 CALL R8 1 + 0x1C201106, // 0056 EQ R8 R8 K6 + 0x78220000, // 0057 JMPF R8 #0059 + 0xB0067743, // 0058 RAISE 1 K59 K67 + 0x94200F06, // 0059 GETIDX R8 R7 K6 + 0x90023C08, // 005A SETMBR R0 K30 R8 + 0x88200126, // 005B GETMBR R8 R0 K38 + 0x8824011E, // 005C GETMBR R9 R0 K30 + 0x94201009, // 005D GETIDX R8 R8 R9 + 0x8C201127, // 005E GETMET R8 R8 K39 + 0x58280006, // 005F LDCONST R10 K6 + 0x582C0006, // 0060 LDCONST R11 K6 + 0x7C200600, // 0061 CALL R8 3 + 0x80000000, // 0062 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(class_HASPmota_init, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_HASPmota, /* shared constants */ + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x8C040144, // 0000 GETMET R1 R0 K68 + 0x7C040200, // 0001 CALL R1 1 + 0xA4068A00, // 0002 IMPORT R1 K69 + 0x8C080346, // 0003 GETMET R2 R1 K70 + 0x58100047, // 0004 LDCONST R4 K71 + 0x7C080400, // 0005 CALL R2 2 + 0x90024802, // 0006 SETMBR R0 K36 R2 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_page +********************************************************************/ +be_local_closure(class_HASPmota_parse_page, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_HASPmota, /* shared constants */ + be_str_weak(parse_page), + &be_const_str_solidified, + ( &(const binstruction[59]) { /* code */ + 0x8C080348, // 0000 GETMET R2 R1 K72 + 0x58100049, // 0001 LDCONST R4 K73 + 0x7C080400, // 0002 CALL R2 2 + 0x780A0035, // 0003 JMPF R2 #003A + 0x60080004, // 0004 GETGBL R2 G4 + 0x940C0349, // 0005 GETIDX R3 R1 K73 + 0x7C080200, // 0006 CALL R2 1 + 0x1C08054A, // 0007 EQ R2 R2 K74 + 0x780A0030, // 0008 JMPF R2 #003A + 0x60080009, // 0009 GETGBL R2 G9 + 0x940C0349, // 000A GETIDX R3 R1 K73 + 0x7C080200, // 000B CALL R2 1 + 0x90025202, // 000C SETMBR R0 K41 R2 + 0x880C011E, // 000D GETMBR R3 R0 K30 + 0x4C100000, // 000E LDNIL R4 + 0x1C0C0604, // 000F EQ R3 R3 R4 + 0x780E0000, // 0010 JMPF R3 #0012 + 0x90023C02, // 0011 SETMBR R0 K30 R2 + 0x880C0126, // 0012 GETMBR R3 R0 K38 + 0x8C0C072A, // 0013 GETMET R3 R3 K42 + 0x5C140400, // 0014 MOVE R5 R2 + 0x7C0C0400, // 0015 CALL R3 2 + 0x740E0006, // 0016 JMPT R3 #001E + 0x880C014B, // 0017 GETMBR R3 R0 K75 + 0x88100126, // 0018 GETMBR R4 R0 K38 + 0x5C140600, // 0019 MOVE R5 R3 + 0x5C180400, // 001A MOVE R6 R2 + 0x5C1C0000, // 001B MOVE R7 R0 + 0x7C140400, // 001C CALL R5 2 + 0x98100405, // 001D SETIDX R4 R2 R5 + 0x8C0C0302, // 001E GETMET R3 R1 K2 + 0x58140003, // 001F LDCONST R5 K3 + 0x7C0C0400, // 0020 CALL R3 2 + 0x1C0C0706, // 0021 EQ R3 R3 K6 + 0x780E0016, // 0022 JMPF R3 #003A + 0x8C0C0105, // 0023 GETMET R3 R0 K5 + 0x7C0C0200, // 0024 CALL R3 1 + 0x60100009, // 0025 GETGBL R4 G9 + 0x8C140302, // 0026 GETMET R5 R1 K2 + 0x581C0020, // 0027 LDCONST R7 K32 + 0x4C200000, // 0028 LDNIL R8 + 0x7C140600, // 0029 CALL R5 3 + 0x7C100200, // 002A CALL R4 1 + 0x900E4004, // 002B SETMBR R3 K32 R4 + 0x60100009, // 002C GETGBL R4 G9 + 0x8C140302, // 002D GETMET R5 R1 K2 + 0x581C0021, // 002E LDCONST R7 K33 + 0x4C200000, // 002F LDNIL R8 + 0x7C140600, // 0030 CALL R5 3 + 0x7C100200, // 0031 CALL R4 1 + 0x900E4204, // 0032 SETMBR R3 K33 R4 + 0x60100009, // 0033 GETGBL R4 G9 + 0x8C140302, // 0034 GETMET R5 R1 K2 + 0x581C0022, // 0035 LDCONST R7 K34 + 0x4C200000, // 0036 LDNIL R8 + 0x7C140600, // 0037 CALL R5 3 + 0x7C100200, // 0038 CALL R4 1 + 0x900E4404, // 0039 SETMBR R3 K34 R4 + 0x80000000, // 003A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse +********************************************************************/ +be_local_closure(class_HASPmota_parse, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_HASPmota, /* shared constants */ + be_str_weak(parse), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0xA40A5C00, // 0000 IMPORT R2 K46 + 0x8C0C0534, // 0001 GETMET R3 R2 K52 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x60100004, // 0004 GETGBL R4 G4 + 0x5C140600, // 0005 MOVE R5 R3 + 0x7C100200, // 0006 CALL R4 1 + 0x1C100935, // 0007 EQ R4 R4 K53 + 0x78120009, // 0008 JMPF R4 #0013 + 0x8C10013A, // 0009 GETMET R4 R0 K58 + 0x5C180600, // 000A MOVE R6 R3 + 0x7C100400, // 000B CALL R4 2 + 0x8C10013D, // 000C GETMET R4 R0 K61 + 0x5C180600, // 000D MOVE R6 R3 + 0x881C0126, // 000E GETMBR R7 R0 K38 + 0x8820011E, // 000F GETMBR R8 R0 K30 + 0x941C0E08, // 0010 GETIDX R7 R7 R8 + 0x7C100600, // 0011 CALL R4 3 + 0x70020000, // 0012 JMP #0014 + 0xB006774C, // 0013 RAISE 1 K59 K76 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start +********************************************************************/ +be_local_closure(class_HASPmota_start, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_HASPmota, /* shared constants */ + be_str_weak(start), + &be_const_str_solidified, + ( &(const binstruction[105]) { /* code */ + 0xA40E9A00, // 0000 IMPORT R3 K77 + 0x4C100000, // 0001 LDNIL R4 + 0x1C100404, // 0002 EQ R4 R2 R4 + 0x78120000, // 0003 JMPF R4 #0005 + 0x8808014E, // 0004 GETMBR R2 R0 K78 + 0x8C10074F, // 0005 GETMET R4 R3 K79 + 0x5C180400, // 0006 MOVE R6 R2 + 0x7C100400, // 0007 CALL R4 2 + 0x74120002, // 0008 JMPT R4 #000C + 0x0012A002, // 0009 ADD R4 K80 R2 + 0x00100951, // 000A ADD R4 R4 K81 + 0xB006A404, // 000B RAISE 1 K82 R4 + 0xB812A600, // 000C GETNGBL R4 K83 + 0x8C100954, // 000D GETMET R4 R4 K84 + 0x7C100200, // 000E CALL R4 1 + 0x60100017, // 000F GETGBL R4 G23 + 0x5C140200, // 0010 MOVE R5 R1 + 0x7C100200, // 0011 CALL R4 1 + 0x9002AA04, // 0012 SETMBR R0 K85 R4 + 0xB812A600, // 0013 GETNGBL R4 K83 + 0x8C100957, // 0014 GETMET R4 R4 K87 + 0x7C100200, // 0015 CALL R4 1 + 0x9002AC04, // 0016 SETMBR R0 K86 R4 + 0xB812A600, // 0017 GETNGBL R4 K83 + 0x8C100959, // 0018 GETMET R4 R4 K89 + 0x7C100200, // 0019 CALL R4 1 + 0x9002B004, // 001A SETMBR R0 K88 R4 + 0xB812A600, // 001B GETNGBL R4 K83 + 0x8C10095B, // 001C GETMET R4 R4 K91 + 0x7C100200, // 001D CALL R4 1 + 0x9002B404, // 001E SETMBR R0 K90 R4 + 0xA8020007, // 001F EXBLK 0 #0028 + 0xB812A600, // 0020 GETNGBL R4 K83 + 0x8C10095D, // 0021 GETMET R4 R4 K93 + 0x5818005E, // 0022 LDCONST R6 K94 + 0x541E000F, // 0023 LDINT R7 16 + 0x7C100600, // 0024 CALL R4 3 + 0x9002B804, // 0025 SETMBR R0 K92 R4 + 0xA8040001, // 0026 EXBLK 1 1 + 0x70020009, // 0027 JMP #0032 + 0xAC100000, // 0028 CATCH R4 0 0 + 0x70020006, // 0029 JMP #0031 + 0xB812A600, // 002A GETNGBL R4 K83 + 0x8C10095D, // 002B GETMET R4 R4 K93 + 0x5818005F, // 002C LDCONST R6 K95 + 0x541E000D, // 002D LDINT R7 14 + 0x7C100600, // 002E CALL R4 3 + 0x9002B804, // 002F SETMBR R0 K92 R4 + 0x70020000, // 0030 JMP #0032 + 0xB0080000, // 0031 RAISE 2 R0 R0 + 0xB812A600, // 0032 GETNGBL R4 K83 + 0x8C100960, // 0033 GETMET R4 R4 K96 + 0x58180006, // 0034 LDCONST R6 K6 + 0xB81EA600, // 0035 GETNGBL R7 K83 + 0x8C1C0F61, // 0036 GETMET R7 R7 K97 + 0x58240062, // 0037 LDCONST R9 K98 + 0x7C1C0400, // 0038 CALL R7 2 + 0xB822A600, // 0039 GETNGBL R8 K83 + 0x8C201161, // 003A GETMET R8 R8 K97 + 0x58280063, // 003B LDCONST R10 K99 + 0x7C200400, // 003C CALL R8 2 + 0x88240155, // 003D GETMBR R9 R0 K85 + 0x8828015C, // 003E GETMBR R10 R0 K92 + 0x7C100C00, // 003F CALL R4 6 + 0x8814015A, // 0040 GETMBR R5 R0 K90 + 0x8C140B64, // 0041 GETMET R5 R5 K100 + 0x7C140200, // 0042 CALL R5 1 + 0x8C140B65, // 0043 GETMET R5 R5 K101 + 0x5C1C0800, // 0044 MOVE R7 R4 + 0x7C140400, // 0045 CALL R5 2 + 0x8814015A, // 0046 GETMBR R5 R0 K90 + 0x8C140B66, // 0047 GETMET R5 R5 K102 + 0x881C0155, // 0048 GETMBR R7 R0 K85 + 0x781E0004, // 0049 JMPF R7 #004F + 0xB81EA600, // 004A GETNGBL R7 K83 + 0x8C1C0F61, // 004B GETMET R7 R7 K97 + 0x58240006, // 004C LDCONST R9 K6 + 0x7C1C0400, // 004D CALL R7 2 + 0x70020003, // 004E JMP #0053 + 0xB81EA600, // 004F GETNGBL R7 K83 + 0x8C1C0F61, // 0050 GETMET R7 R7 K97 + 0x58240067, // 0051 LDCONST R9 K103 + 0x7C1C0400, // 0052 CALL R7 2 + 0x58200006, // 0053 LDCONST R8 K6 + 0x7C140600, // 0054 CALL R5 3 + 0xB816A600, // 0055 GETNGBL R5 K83 + 0x8C140B68, // 0056 GETMET R5 R5 K104 + 0xB81EA600, // 0057 GETNGBL R7 K83 + 0x8C1C0F69, // 0058 GETMET R7 R7 K105 + 0x7C1C0200, // 0059 CALL R7 1 + 0x7C140400, // 005A CALL R5 2 + 0xB816A600, // 005B GETNGBL R5 K83 + 0x8C140B69, // 005C GETMET R5 R5 K105 + 0x7C140200, // 005D CALL R5 1 + 0x8C140B6A, // 005E GETMET R5 R5 K106 + 0x581C0006, // 005F LDCONST R7 K6 + 0x58200006, // 0060 LDCONST R8 K6 + 0x7C140600, // 0061 CALL R5 3 + 0x60140013, // 0062 GETGBL R5 G19 + 0x7C140000, // 0063 CALL R5 0 + 0x90024C05, // 0064 SETMBR R0 K38 R5 + 0x8C14016B, // 0065 GETMET R5 R0 K107 + 0x5C1C0400, // 0066 MOVE R7 R2 + 0x7C140400, // 0067 CALL R5 2 + 0x80000000, // 0068 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pages +********************************************************************/ +be_local_closure(class_HASPmota_get_pages, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_HASPmota, /* shared constants */ + be_str_weak(get_pages), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C04011D, // 0000 GETMET R1 R0 K29 + 0x4C0C0000, // 0001 LDNIL R3 + 0x7C040400, // 0002 CALL R1 2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: sort +********************************************************************/ +be_local_closure(class_HASPmota_sort, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 12, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_HASPmota, /* shared constants */ + be_str_weak(sort), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x5804006C, // 0000 LDCONST R1 K108 + 0x58080006, // 0001 LDCONST R2 K6 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x5C100000, // 0003 MOVE R4 R0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x140C0403, // 0005 LT R3 R2 R3 + 0x780E000F, // 0006 JMPF R3 #0017 + 0x940C0002, // 0007 GETIDX R3 R0 R2 + 0x5C100400, // 0008 MOVE R4 R2 + 0x24140906, // 0009 GT R5 R4 K6 + 0x78160008, // 000A JMPF R5 #0014 + 0x0414091F, // 000B SUB R5 R4 K31 + 0x94140005, // 000C GETIDX R5 R0 R5 + 0x24140A03, // 000D GT R5 R5 R3 + 0x78160004, // 000E JMPF R5 #0014 + 0x0414091F, // 000F SUB R5 R4 K31 + 0x94140005, // 0010 GETIDX R5 R0 R5 + 0x98000805, // 0011 SETIDX R0 R4 R5 + 0x0410091F, // 0012 SUB R4 R4 K31 + 0x7001FFF4, // 0013 JMP #0009 + 0x98000803, // 0014 SETIDX R0 R4 R3 + 0x0008051F, // 0015 ADD R2 R2 K31 + 0x7001FFEA, // 0016 JMP #0002 + 0x80040000, // 0017 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: do_action +********************************************************************/ +be_local_closure(class_HASPmota_do_action, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_HASPmota, /* shared constants */ + be_str_weak(do_action), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0xB80EA600, // 0000 GETNGBL R3 K83 + 0x880C076D, // 0001 GETMBR R3 R3 K109 + 0x200C0403, // 0002 NE R3 R2 R3 + 0x780E0000, // 0003 JMPF R3 #0005 + 0x80000600, // 0004 RET 0 + 0x8C0C0128, // 0005 GETMET R3 R0 K40 + 0x8814036E, // 0006 GETMBR R5 R1 K110 + 0x7C0C0400, // 0007 CALL R3 2 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_dispatch +********************************************************************/ +be_local_closure(class_HASPmota_event_dispatch, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 10, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + &be_ktab_class_HASPmota, /* shared constants */ + be_str_weak(event_dispatch), + &be_const_str_solidified, + ( &(const binstruction[34]) { /* code */ + 0xA40A0200, // 0000 IMPORT R2 K1 + 0x8C0C056F, // 0001 GETMET R3 R2 K111 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x88100170, // 0004 GETMBR R4 R0 K112 + 0x78120002, // 0005 JMPF R4 #0009 + 0x88100170, // 0006 GETMBR R4 R0 K112 + 0x9012E203, // 0007 SETMBR R4 K113 R3 + 0x70020004, // 0008 JMP #000E + 0xB812A600, // 0009 GETNGBL R4 K83 + 0x8C100972, // 000A GETMET R4 R4 K114 + 0x5C180600, // 000B MOVE R6 R3 + 0x7C100400, // 000C CALL R4 2 + 0x9002E004, // 000D SETMBR R0 K112 R4 + 0x88100170, // 000E GETMBR R4 R0 K112 + 0x8C100973, // 000F GETMET R4 R4 K115 + 0x7C100200, // 0010 CALL R4 1 + 0x60140009, // 0011 GETGBL R5 G9 + 0x5C180800, // 0012 MOVE R6 R4 + 0x7C140200, // 0013 CALL R5 1 + 0x20140B06, // 0014 NE R5 R5 K6 + 0x7816000A, // 0015 JMPF R5 #0021 + 0x8C140574, // 0016 GETMET R5 R2 K116 + 0x5C1C0800, // 0017 MOVE R7 R4 + 0x7C140400, // 0018 CALL R5 2 + 0x60180004, // 0019 GETGBL R6 G4 + 0x5C1C0A00, // 001A MOVE R7 R5 + 0x7C180200, // 001B CALL R6 1 + 0x1C180D35, // 001C EQ R6 R6 K53 + 0x781A0002, // 001D JMPF R6 #0021 + 0x8C180B75, // 001E GETMET R6 R5 K117 + 0x88200170, // 001F GETMBR R8 R0 K112 + 0x7C180400, // 0020 CALL R6 2 + 0x80000000, // 0021 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: register_event ********************************************************************/ @@ -11272,21 +13139,21 @@ be_local_closure(class_HASPmota_register_event, /* name */ be_str_weak(register_event), &be_const_str_solidified, ( &(const binstruction[20]) { /* code */ - 0xA40E1C00, // 0000 IMPORT R3 K14 - 0xA4121E00, // 0001 IMPORT R4 K15 - 0x88140110, // 0002 GETMBR R5 R0 K16 + 0xA40EEC00, // 0000 IMPORT R3 K118 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x88140175, // 0002 GETMBR R5 R0 K117 0x4C180000, // 0003 LDNIL R6 0x1C140A06, // 0004 EQ R5 R5 R6 0x78160003, // 0005 JMPF R5 #000A - 0x8C140711, // 0006 GETMET R5 R3 K17 + 0x8C140777, // 0006 GETMET R5 R3 K119 0x841C0000, // 0007 CLOSURE R7 P0 0x7C140400, // 0008 CALL R5 2 - 0x90022005, // 0009 SETMBR R0 K16 R5 - 0x88140312, // 000A GETMBR R5 R1 K18 - 0x8C180B13, // 000B GETMET R6 R5 K19 - 0x88200110, // 000C GETMBR R8 R0 K16 + 0x9002EA05, // 0009 SETMBR R0 K117 R5 + 0x8814030A, // 000A GETMBR R5 R1 K10 + 0x8C180B78, // 000B GETMET R6 R5 K120 + 0x88200175, // 000C GETMBR R8 R0 K117 0x5C240400, // 000D MOVE R9 R2 - 0x8C280914, // 000E GETMET R10 R4 K20 + 0x8C28096F, // 000E GETMET R10 R4 K111 0x5C300200, // 000F MOVE R12 R1 0x7C280400, // 0010 CALL R10 2 0x7C180800, // 0011 CALL R6 4 @@ -11298,185 +13165,6 @@ be_local_closure(class_HASPmota_register_event, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: _load -********************************************************************/ -be_local_closure(class_HASPmota__load, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_HASPmota, /* shared constants */ - be_str_weak(_load), - &be_const_str_solidified, - ( &(const binstruction[99]) { /* code */ - 0xA40A2A00, // 0000 IMPORT R2 K21 - 0xA40E2C00, // 0001 IMPORT R3 K22 - 0x60100011, // 0002 GETGBL R4 G17 - 0x5C140200, // 0003 MOVE R5 R1 - 0x58180017, // 0004 LDCONST R6 K23 - 0x7C100400, // 0005 CALL R4 2 - 0x8C140918, // 0006 GETMET R5 R4 K24 - 0x7C140200, // 0007 CALL R5 1 - 0x8C180919, // 0008 GETMET R6 R4 K25 - 0x7C180200, // 0009 CALL R6 1 - 0x8C18051A, // 000A GETMET R6 R2 K26 - 0x5C200A00, // 000B MOVE R8 R5 - 0x5824001B, // 000C LDCONST R9 K27 - 0x7C180600, // 000D CALL R6 3 - 0x4C100000, // 000E LDNIL R4 - 0x4C140000, // 000F LDNIL R5 - 0x601C000C, // 0010 GETGBL R7 G12 - 0x5C200C00, // 0011 MOVE R8 R6 - 0x7C1C0200, // 0012 CALL R7 1 - 0x241C0F07, // 0013 GT R7 R7 K7 - 0x781E0039, // 0014 JMPF R7 #004F - 0x8C1C071C, // 0015 GETMET R7 R3 K28 - 0x94240D07, // 0016 GETIDX R9 R6 K7 - 0x7C1C0400, // 0017 CALL R7 2 - 0x60200004, // 0018 GETGBL R8 G4 - 0x5C240E00, // 0019 MOVE R9 R7 - 0x7C200200, // 001A CALL R8 1 - 0x1C20111D, // 001B EQ R8 R8 K29 - 0x7822001B, // 001C JMPF R8 #0039 - 0xB8223C00, // 001D GETNGBL R8 K30 - 0x8C20111F, // 001E GETMET R8 R8 K31 - 0x542A0003, // 001F LDINT R10 4 - 0x7C200400, // 0020 CALL R8 2 - 0x78220007, // 0021 JMPF R8 #002A - 0xB8223C00, // 0022 GETNGBL R8 K30 - 0x8C201120, // 0023 GETMET R8 R8 K32 - 0x60280018, // 0024 GETGBL R10 G24 - 0x582C0021, // 0025 LDCONST R11 K33 - 0x94300D07, // 0026 GETIDX R12 R6 K7 - 0x7C280400, // 0027 CALL R10 2 - 0x542E0003, // 0028 LDINT R11 4 - 0x7C200600, // 0029 CALL R8 3 - 0x8C200122, // 002A GETMET R8 R0 K34 - 0x5C280E00, // 002B MOVE R10 R7 - 0x7C200400, // 002C CALL R8 2 - 0x8820010C, // 002D GETMBR R8 R0 K12 - 0x4C240000, // 002E LDNIL R9 - 0x1C201009, // 002F EQ R8 R8 R9 - 0x78220000, // 0030 JMPF R8 #0032 - 0xB0064724, // 0031 RAISE 1 K35 K36 - 0x8C200125, // 0032 GETMET R8 R0 K37 - 0x5C280E00, // 0033 MOVE R10 R7 - 0x882C010C, // 0034 GETMBR R11 R0 K12 - 0x88300126, // 0035 GETMBR R12 R0 K38 - 0x942C160C, // 0036 GETIDX R11 R11 R12 - 0x7C200600, // 0037 CALL R8 3 - 0x70020010, // 0038 JMP #004A - 0x6020000C, // 0039 GETGBL R8 G12 - 0x8C240527, // 003A GETMET R9 R2 K39 - 0x942C0D07, // 003B GETIDX R11 R6 K7 - 0x58300028, // 003C LDCONST R12 K40 - 0x58340029, // 003D LDCONST R13 K41 - 0x7C240800, // 003E CALL R9 4 - 0x7C200200, // 003F CALL R8 1 - 0x24201107, // 0040 GT R8 R8 K7 - 0x78220007, // 0041 JMPF R8 #004A - 0xB8223C00, // 0042 GETNGBL R8 K30 - 0x8C201120, // 0043 GETMET R8 R8 K32 - 0x60280018, // 0044 GETGBL R10 G24 - 0x582C002A, // 0045 LDCONST R11 K42 - 0x94300D07, // 0046 GETIDX R12 R6 K7 - 0x7C280400, // 0047 CALL R10 2 - 0x582C002B, // 0048 LDCONST R11 K43 - 0x7C200600, // 0049 CALL R8 3 - 0x4C1C0000, // 004A LDNIL R7 - 0x8C200D2C, // 004B GETMET R8 R6 K44 - 0x58280007, // 004C LDCONST R10 K7 - 0x7C200400, // 004D CALL R8 2 - 0x7001FFC0, // 004E JMP #0010 - 0x4C180000, // 004F LDNIL R6 - 0x8C1C0101, // 0050 GETMET R7 R0 K1 - 0x4C240000, // 0051 LDNIL R9 - 0x7C1C0400, // 0052 CALL R7 2 - 0x6020000C, // 0053 GETGBL R8 G12 - 0x5C240E00, // 0054 MOVE R9 R7 - 0x7C200200, // 0055 CALL R8 1 - 0x1C201107, // 0056 EQ R8 R8 K7 - 0x78220000, // 0057 JMPF R8 #0059 - 0xB006472D, // 0058 RAISE 1 K35 K45 - 0x94200F07, // 0059 GETIDX R8 R7 K7 - 0x90020408, // 005A SETMBR R0 K2 R8 - 0x8820010C, // 005B GETMBR R8 R0 K12 - 0x88240102, // 005C GETMBR R9 R0 K2 - 0x94201009, // 005D GETIDX R8 R8 R9 - 0x8C20110D, // 005E GETMET R8 R8 K13 - 0x58280007, // 005F LDCONST R10 K7 - 0x582C0007, // 0060 LDCONST R11 K7 - 0x7C200600, // 0061 CALL R8 3 - 0x80000000, // 0062 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: event_dispatch -********************************************************************/ -be_local_closure(class_HASPmota_event_dispatch, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_HASPmota, /* shared constants */ - be_str_weak(event_dispatch), - &be_const_str_solidified, - ( &(const binstruction[34]) { /* code */ - 0xA40A1E00, // 0000 IMPORT R2 K15 - 0x8C0C0514, // 0001 GETMET R3 R2 K20 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x8810012E, // 0004 GETMBR R4 R0 K46 - 0x78120002, // 0005 JMPF R4 #0009 - 0x8810012E, // 0006 GETMBR R4 R0 K46 - 0x90125E03, // 0007 SETMBR R4 K47 R3 - 0x70020004, // 0008 JMP #000E - 0xB8126000, // 0009 GETNGBL R4 K48 - 0x8C100931, // 000A GETMET R4 R4 K49 - 0x5C180600, // 000B MOVE R6 R3 - 0x7C100400, // 000C CALL R4 2 - 0x90025C04, // 000D SETMBR R0 K46 R4 - 0x8810012E, // 000E GETMBR R4 R0 K46 - 0x8C100932, // 000F GETMET R4 R4 K50 - 0x7C100200, // 0010 CALL R4 1 - 0x60140009, // 0011 GETGBL R5 G9 - 0x5C180800, // 0012 MOVE R6 R4 - 0x7C140200, // 0013 CALL R5 1 - 0x20140B07, // 0014 NE R5 R5 K7 - 0x7816000A, // 0015 JMPF R5 #0021 - 0x8C140533, // 0016 GETMET R5 R2 K51 - 0x5C1C0800, // 0017 MOVE R7 R4 - 0x7C140400, // 0018 CALL R5 2 - 0x60180004, // 0019 GETGBL R6 G4 - 0x5C1C0A00, // 001A MOVE R7 R5 - 0x7C180200, // 001B CALL R6 1 - 0x1C180D1D, // 001C EQ R6 R6 K29 - 0x781A0002, // 001D JMPF R6 #0021 - 0x8C180B10, // 001E GETMET R6 R5 K16 - 0x8820012E, // 001F GETMBR R8 R0 K46 - 0x7C180400, // 0020 CALL R6 2 - 0x80000000, // 0021 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: fix_lv_version ********************************************************************/ @@ -11494,20 +13182,20 @@ be_local_closure(class_HASPmota_fix_lv_version, /* name */ be_str_weak(fix_lv_version), &be_const_str_solidified, ( &(const binstruction[15]) { /* code */ - 0x58000034, // 0000 LDCONST R0 K52 - 0xA4061E00, // 0001 IMPORT R1 K15 - 0x8C080335, // 0002 GETMET R2 R1 K53 - 0xB8126000, // 0003 GETNGBL R4 K48 - 0x58140036, // 0004 LDCONST R5 K54 + 0x5800006C, // 0000 LDCONST R0 K108 + 0xA4060200, // 0001 IMPORT R1 K1 + 0x8C08030C, // 0002 GETMET R2 R1 K12 + 0xB812A600, // 0003 GETNGBL R4 K83 + 0x58140079, // 0004 LDCONST R5 K121 0x7C080600, // 0005 CALL R2 3 0x600C0004, // 0006 GETGBL R3 G4 0x5C100400, // 0007 MOVE R4 R2 0x7C0C0200, // 0008 CALL R3 1 - 0x200C0737, // 0009 NE R3 R3 K55 + 0x200C074A, // 0009 NE R3 R3 K74 0x780E0002, // 000A JMPF R3 #000E - 0xB80E6000, // 000B GETNGBL R3 K48 + 0xB80EA600, // 000B GETNGBL R3 K83 0x54120007, // 000C LDINT R4 8 - 0x900E6C04, // 000D SETMBR R3 K54 R4 + 0x900EF204, // 000D SETMBR R3 K121 R4 0x80000000, // 000E RET 0 }) ) @@ -11516,9 +13204,9 @@ be_local_closure(class_HASPmota_fix_lv_version, /* name */ /******************************************************************** -** Solidified function: get_page_cur_parsing +** Solidified function: get_page_cur ********************************************************************/ -be_local_closure(class_HASPmota_get_page_cur_parsing, /* name */ +be_local_closure(class_HASPmota_get_page_cur, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -11529,11 +13217,11 @@ be_local_closure(class_HASPmota_get_page_cur_parsing, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_HASPmota, /* shared constants */ - be_str_weak(get_page_cur_parsing), + be_str_weak(get_page_cur), &be_const_str_solidified, ( &(const binstruction[ 4]) { /* code */ - 0x8804010C, // 0000 GETMBR R1 R0 K12 - 0x88080126, // 0001 GETMBR R2 R0 K38 + 0x88040126, // 0000 GETMBR R1 R0 K38 + 0x8808011E, // 0001 GETMBR R2 R0 K30 0x94040202, // 0002 GETIDX R1 R1 R2 0x80040200, // 0003 RET 1 R1 }) @@ -11543,12 +13231,12 @@ be_local_closure(class_HASPmota_get_page_cur_parsing, /* name */ /******************************************************************** -** Solidified function: init +** Solidified function: page_dir_to ********************************************************************/ -be_local_closure(class_HASPmota_init, /* name */ +be_local_closure(class_HASPmota_page_dir_to, /* name */ be_nested_proto( - 5, /* nstack */ - 1, /* argc */ + 7, /* nstack */ + 2, /* argc */ 10, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -11556,17 +13244,41 @@ be_local_closure(class_HASPmota_init, /* name */ NULL, /* no sub protos */ 1, /* has constants */ &be_ktab_class_HASPmota, /* shared constants */ - be_str_weak(init), + be_str_weak(page_dir_to), &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x8C040138, // 0000 GETMET R1 R0 K56 - 0x7C040200, // 0001 CALL R1 1 - 0xA4067200, // 0002 IMPORT R1 K57 - 0x8C08033A, // 0003 GETMET R2 R1 K58 - 0x5810003B, // 0004 LDCONST R4 K59 - 0x7C080400, // 0005 CALL R2 2 - 0x90021402, // 0006 SETMBR R0 K10 R2 - 0x80000000, // 0007 RET 0 + ( &(const binstruction[32]) { /* code */ + 0x8C08011D, // 0000 GETMET R2 R0 K29 + 0x58100006, // 0001 LDCONST R4 K6 + 0x7C080400, // 0002 CALL R2 2 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0403, // 0004 EQ R3 R2 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80060C00, // 0006 RET 1 K6 + 0x600C000C, // 0007 GETGBL R3 G12 + 0x5C100400, // 0008 MOVE R4 R2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x1810071F, // 000A LE R4 R3 K31 + 0x78120000, // 000B JMPF R4 #000D + 0x80060C00, // 000C RET 1 K6 + 0x1C100742, // 000D EQ R4 R3 K66 + 0x78120000, // 000E JMPF R4 #0010 + 0x80063E00, // 000F RET 1 K31 + 0x8C100502, // 0010 GETMET R4 R2 K2 + 0x5C180200, // 0011 MOVE R6 R1 + 0x7C100400, // 0012 CALL R4 2 + 0x4C140000, // 0013 LDNIL R5 + 0x1C140805, // 0014 EQ R5 R4 R5 + 0x78160000, // 0015 JMPF R5 #0017 + 0x80060C00, // 0016 RET 1 K6 + 0x0014071F, // 0017 ADD R5 R3 K31 + 0x0C140B42, // 0018 DIV R5 R5 K66 + 0x18140805, // 0019 LE R5 R4 R5 + 0x78160001, // 001A JMPF R5 #001D + 0x80063E00, // 001B RET 1 K31 + 0x70020001, // 001C JMP #001F + 0x5415FFFE, // 001D LDINT R5 -1 + 0x80040A00, // 001E RET 1 R5 + 0x80000000, // 001F RET 0 }) ) ); @@ -11592,27 +13304,27 @@ be_local_closure(class_HASPmota_pages_list_sorted, /* name */ ( &(const binstruction[47]) { /* code */ 0x60080012, // 0000 GETGBL R2 G18 0x7C080000, // 0001 CALL R2 0 - 0x1C0C0307, // 0002 EQ R3 R1 K7 + 0x1C0C0306, // 0002 EQ R3 R1 K6 0x780E0000, // 0003 JMPF R3 #0005 - 0x88040102, // 0004 GETMBR R1 R0 K2 + 0x8804011E, // 0004 GETMBR R1 R0 K30 0x600C0010, // 0005 GETGBL R3 G16 - 0x8810010C, // 0006 GETMBR R4 R0 K12 - 0x8C10093C, // 0007 GETMET R4 R4 K60 + 0x88100126, // 0006 GETMBR R4 R0 K38 + 0x8C100914, // 0007 GETMET R4 R4 K20 0x7C100200, // 0008 CALL R4 1 0x7C0C0200, // 0009 CALL R3 1 0xA8020007, // 000A EXBLK 0 #0013 0x5C100600, // 000B MOVE R4 R3 0x7C100000, // 000C CALL R4 0 - 0x20140907, // 000D NE R5 R4 K7 + 0x20140906, // 000D NE R5 R4 K6 0x78160002, // 000E JMPF R5 #0012 - 0x8C14053D, // 000F GETMET R5 R2 K61 + 0x8C14057A, // 000F GETMET R5 R2 K122 0x5C1C0800, // 0010 MOVE R7 R4 0x7C140400, // 0011 CALL R5 2 0x7001FFF7, // 0012 JMP #000B - 0x580C003E, // 0013 LDCONST R3 K62 + 0x580C0015, // 0013 LDCONST R3 K21 0xAC0C0200, // 0014 CATCH R3 1 0 0xB0080000, // 0015 RAISE 2 R0 R0 - 0x8C0C013F, // 0016 GETMET R3 R0 K63 + 0x8C0C017B, // 0016 GETMET R3 R0 K123 0x5C140400, // 0017 MOVE R5 R2 0x7C0C0400, // 0018 CALL R3 2 0x5C080600, // 0019 MOVE R2 R3 @@ -11624,7 +13336,7 @@ be_local_closure(class_HASPmota_pages_list_sorted, /* name */ 0x5C100400, // 001F MOVE R4 R2 0x7C0C0200, // 0020 CALL R3 1 0x00080402, // 0021 ADD R2 R2 R2 - 0x8C100540, // 0022 GETMET R4 R2 K64 + 0x8C100502, // 0022 GETMET R4 R2 K2 0x5C180200, // 0023 MOVE R6 R1 0x7C100400, // 0024 CALL R4 2 0x4C140000, // 0025 LDNIL R5 @@ -11633,7 +13345,7 @@ be_local_closure(class_HASPmota_pages_list_sorted, /* name */ 0x4C140000, // 0028 LDNIL R5 0x80040A00, // 0029 RET 1 R5 0x00140803, // 002A ADD R5 R4 R3 - 0x04140B03, // 002B SUB R5 R5 K3 + 0x04140B1F, // 002B SUB R5 R5 K31 0x40140805, // 002C CONNECT R5 R4 R5 0x94080405, // 002D GETIDX R2 R2 R5 0x80040400, // 002E RET 1 R2 @@ -11643,844 +13355,76 @@ be_local_closure(class_HASPmota_pages_list_sorted, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: sort -********************************************************************/ -be_local_closure(class_HASPmota_sort, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 12, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_HASPmota, /* shared constants */ - be_str_weak(sort), - &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0x58040034, // 0000 LDCONST R1 K52 - 0x60080010, // 0001 GETGBL R2 G16 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x5C100000, // 0003 MOVE R4 R0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x040C0703, // 0005 SUB R3 R3 K3 - 0x400E0603, // 0006 CONNECT R3 K3 R3 - 0x7C080200, // 0007 CALL R2 1 - 0xA8020010, // 0008 EXBLK 0 #001A - 0x5C0C0400, // 0009 MOVE R3 R2 - 0x7C0C0000, // 000A CALL R3 0 - 0x94100003, // 000B GETIDX R4 R0 R3 - 0x5C140600, // 000C MOVE R5 R3 - 0x24180B07, // 000D GT R6 R5 K7 - 0x781A0008, // 000E JMPF R6 #0018 - 0x04180B03, // 000F SUB R6 R5 K3 - 0x94180006, // 0010 GETIDX R6 R0 R6 - 0x24180C04, // 0011 GT R6 R6 R4 - 0x781A0004, // 0012 JMPF R6 #0018 - 0x04180B03, // 0013 SUB R6 R5 K3 - 0x94180006, // 0014 GETIDX R6 R0 R6 - 0x98000A06, // 0015 SETIDX R0 R5 R6 - 0x04140B03, // 0016 SUB R5 R5 K3 - 0x7001FFF4, // 0017 JMP #000D - 0x98000A04, // 0018 SETIDX R0 R5 R4 - 0x7001FFEE, // 0019 JMP #0009 - 0x5808003E, // 001A LDCONST R2 K62 - 0xAC080200, // 001B CATCH R2 1 0 - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x80040000, // 001D RET 1 R0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _remove_page -********************************************************************/ -be_local_closure(class_HASPmota__remove_page, /* name */ - be_nested_proto( - 8, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_HASPmota, /* shared constants */ - be_str_weak(_remove_page), - &be_const_str_solidified, - ( &(const binstruction[37]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x7C080200, // 0001 CALL R2 1 - 0x8C080509, // 0002 GETMET R2 R2 K9 - 0x7C080200, // 0003 CALL R2 1 - 0x1C0C0202, // 0004 EQ R3 R1 R2 - 0x780E0008, // 0005 JMPF R3 #000F - 0x8C0C0141, // 0006 GETMET R3 R0 K65 - 0x58140008, // 0007 LDCONST R5 K8 - 0x58180007, // 0008 LDCONST R6 K7 - 0x581C0007, // 0009 LDCONST R7 K7 - 0x7C0C0800, // 000A CALL R3 4 - 0x4C100000, // 000B LDNIL R4 - 0x1C100604, // 000C EQ R4 R3 R4 - 0x78120000, // 000D JMPF R4 #000F - 0x80000800, // 000E RET 0 - 0x880C0126, // 000F GETMBR R3 R0 K38 - 0x1C0C0601, // 0010 EQ R3 R3 R1 - 0x780E0001, // 0011 JMPF R3 #0014 - 0x880C0102, // 0012 GETMBR R3 R0 K2 - 0x90024C03, // 0013 SETMBR R0 K38 R3 - 0x880C010C, // 0014 GETMBR R3 R0 K12 - 0x8C0C0742, // 0015 GETMET R3 R3 K66 - 0x5C140200, // 0016 MOVE R5 R1 - 0x7C0C0400, // 0017 CALL R3 2 - 0x780E0003, // 0018 JMPF R3 #001D - 0x880C010C, // 0019 GETMBR R3 R0 K12 - 0x8C0C072C, // 001A GETMET R3 R3 K44 - 0x5C140200, // 001B MOVE R5 R1 - 0x7C0C0400, // 001C CALL R3 2 - 0x600C0018, // 001D GETGBL R3 G24 - 0x58100044, // 001E LDCONST R4 K68 - 0x5C140200, // 001F MOVE R5 R1 - 0x7C0C0400, // 0020 CALL R3 2 - 0xB8128600, // 0021 GETNGBL R4 K67 - 0x4C140000, // 0022 LDNIL R5 - 0x90100605, // 0023 SETMBR R4 R3 R5 - 0x80000000, // 0024 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: do_action -********************************************************************/ -be_local_closure(class_HASPmota_do_action, /* name */ - be_nested_proto( - 6, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_HASPmota, /* shared constants */ - be_str_weak(do_action), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0xB80E6000, // 0000 GETNGBL R3 K48 - 0x880C0745, // 0001 GETMBR R3 R3 K69 - 0x200C0403, // 0002 NE R3 R2 R3 - 0x780E0000, // 0003 JMPF R3 #0005 - 0x80000600, // 0004 RET 0 - 0x8C0C0141, // 0005 GETMET R3 R0 K65 - 0x88140346, // 0006 GETMBR R5 R1 K70 - 0x7C0C0400, // 0007 CALL R3 2 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_page -********************************************************************/ -be_local_closure(class_HASPmota_parse_page, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_HASPmota, /* shared constants */ - be_str_weak(parse_page), - &be_const_str_solidified, - ( &(const binstruction[59]) { /* code */ - 0x8C080347, // 0000 GETMET R2 R1 K71 - 0x58100048, // 0001 LDCONST R4 K72 - 0x7C080400, // 0002 CALL R2 2 - 0x780A0035, // 0003 JMPF R2 #003A - 0x60080004, // 0004 GETGBL R2 G4 - 0x940C0348, // 0005 GETIDX R3 R1 K72 - 0x7C080200, // 0006 CALL R2 1 - 0x1C080537, // 0007 EQ R2 R2 K55 - 0x780A0030, // 0008 JMPF R2 #003A - 0x60080009, // 0009 GETGBL R2 G9 - 0x940C0348, // 000A GETIDX R3 R1 K72 - 0x7C080200, // 000B CALL R2 1 - 0x90024C02, // 000C SETMBR R0 K38 R2 - 0x880C0102, // 000D GETMBR R3 R0 K2 - 0x4C100000, // 000E LDNIL R4 - 0x1C0C0604, // 000F EQ R3 R3 R4 - 0x780E0000, // 0010 JMPF R3 #0012 - 0x90020402, // 0011 SETMBR R0 K2 R2 - 0x880C010C, // 0012 GETMBR R3 R0 K12 - 0x8C0C0742, // 0013 GETMET R3 R3 K66 - 0x5C140400, // 0014 MOVE R5 R2 - 0x7C0C0400, // 0015 CALL R3 2 - 0x740E0006, // 0016 JMPT R3 #001E - 0x880C0149, // 0017 GETMBR R3 R0 K73 - 0x8810010C, // 0018 GETMBR R4 R0 K12 - 0x5C140600, // 0019 MOVE R5 R3 - 0x5C180400, // 001A MOVE R6 R2 - 0x5C1C0000, // 001B MOVE R7 R0 - 0x7C140400, // 001C CALL R5 2 - 0x98100405, // 001D SETIDX R4 R2 R5 - 0x8C0C0340, // 001E GETMET R3 R1 K64 - 0x58140009, // 001F LDCONST R5 K9 - 0x7C0C0400, // 0020 CALL R3 2 - 0x1C0C0707, // 0021 EQ R3 R3 K7 - 0x780E0016, // 0022 JMPF R3 #003A - 0x8C0C014A, // 0023 GETMET R3 R0 K74 - 0x7C0C0200, // 0024 CALL R3 1 - 0x60100009, // 0025 GETGBL R4 G9 - 0x8C140340, // 0026 GETMET R5 R1 K64 - 0x581C0004, // 0027 LDCONST R7 K4 - 0x4C200000, // 0028 LDNIL R8 - 0x7C140600, // 0029 CALL R5 3 - 0x7C100200, // 002A CALL R4 1 - 0x900E0804, // 002B SETMBR R3 K4 R4 - 0x60100009, // 002C GETGBL R4 G9 - 0x8C140340, // 002D GETMET R5 R1 K64 - 0x581C0005, // 002E LDCONST R7 K5 - 0x4C200000, // 002F LDNIL R8 - 0x7C140600, // 0030 CALL R5 3 - 0x7C100200, // 0031 CALL R4 1 - 0x900E0A04, // 0032 SETMBR R3 K5 R4 - 0x60100009, // 0033 GETGBL R4 G9 - 0x8C140340, // 0034 GETMET R5 R1 K64 - 0x581C0006, // 0035 LDCONST R7 K6 - 0x4C200000, // 0036 LDNIL R8 - 0x7C140600, // 0037 CALL R5 3 - 0x7C100200, // 0038 CALL R4 1 - 0x900E0C04, // 0039 SETMBR R3 K6 R4 - 0x80000000, // 003A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: page_dir_to -********************************************************************/ -be_local_closure(class_HASPmota_page_dir_to, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_HASPmota, /* shared constants */ - be_str_weak(page_dir_to), - &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0x8C080101, // 0000 GETMET R2 R0 K1 - 0x58100007, // 0001 LDCONST R4 K7 - 0x7C080400, // 0002 CALL R2 2 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0403, // 0004 EQ R3 R2 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80060E00, // 0006 RET 1 K7 - 0x600C000C, // 0007 GETGBL R3 G12 - 0x5C100400, // 0008 MOVE R4 R2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x18100703, // 000A LE R4 R3 K3 - 0x78120000, // 000B JMPF R4 #000D - 0x80060E00, // 000C RET 1 K7 - 0x1C10072B, // 000D EQ R4 R3 K43 - 0x78120000, // 000E JMPF R4 #0010 - 0x80060600, // 000F RET 1 K3 - 0x8C100540, // 0010 GETMET R4 R2 K64 - 0x5C180200, // 0011 MOVE R6 R1 - 0x7C100400, // 0012 CALL R4 2 - 0x4C140000, // 0013 LDNIL R5 - 0x1C140805, // 0014 EQ R5 R4 R5 - 0x78160000, // 0015 JMPF R5 #0017 - 0x80060E00, // 0016 RET 1 K7 - 0x00140703, // 0017 ADD R5 R3 K3 - 0x0C140B2B, // 0018 DIV R5 R5 K43 - 0x18140805, // 0019 LE R5 R4 R5 - 0x78160001, // 001A JMPF R5 #001D - 0x80060600, // 001B RET 1 K3 - 0x70020001, // 001C JMP #001F - 0x5415FFFE, // 001D LDINT R5 -1 - 0x80040A00, // 001E RET 1 R5 - 0x80000000, // 001F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start -********************************************************************/ -be_local_closure(class_HASPmota_start, /* name */ - be_nested_proto( - 11, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_HASPmota, /* shared constants */ - be_str_weak(start), - &be_const_str_solidified, - ( &(const binstruction[105]) { /* code */ - 0xA40E9600, // 0000 IMPORT R3 K75 - 0x4C100000, // 0001 LDNIL R4 - 0x1C100404, // 0002 EQ R4 R2 R4 - 0x78120000, // 0003 JMPF R4 #0005 - 0x8808014C, // 0004 GETMBR R2 R0 K76 - 0x8C10074D, // 0005 GETMET R4 R3 K77 - 0x5C180400, // 0006 MOVE R6 R2 - 0x7C100400, // 0007 CALL R4 2 - 0x74120002, // 0008 JMPT R4 #000C - 0x00129C02, // 0009 ADD R4 K78 R2 - 0x0010094F, // 000A ADD R4 R4 K79 - 0xB006A004, // 000B RAISE 1 K80 R4 - 0xB8126000, // 000C GETNGBL R4 K48 - 0x8C100951, // 000D GETMET R4 R4 K81 - 0x7C100200, // 000E CALL R4 1 - 0x60100017, // 000F GETGBL R4 G23 - 0x5C140200, // 0010 MOVE R5 R1 - 0x7C100200, // 0011 CALL R4 1 - 0x9002A404, // 0012 SETMBR R0 K82 R4 - 0xB8126000, // 0013 GETNGBL R4 K48 - 0x8C100954, // 0014 GETMET R4 R4 K84 - 0x7C100200, // 0015 CALL R4 1 - 0x9002A604, // 0016 SETMBR R0 K83 R4 - 0xB8126000, // 0017 GETNGBL R4 K48 - 0x8C100956, // 0018 GETMET R4 R4 K86 - 0x7C100200, // 0019 CALL R4 1 - 0x9002AA04, // 001A SETMBR R0 K85 R4 - 0xB8126000, // 001B GETNGBL R4 K48 - 0x8C100958, // 001C GETMET R4 R4 K88 - 0x7C100200, // 001D CALL R4 1 - 0x9002AE04, // 001E SETMBR R0 K87 R4 - 0xA8020007, // 001F EXBLK 0 #0028 - 0xB8126000, // 0020 GETNGBL R4 K48 - 0x8C10095A, // 0021 GETMET R4 R4 K90 - 0x5818005B, // 0022 LDCONST R6 K91 - 0x541E000F, // 0023 LDINT R7 16 - 0x7C100600, // 0024 CALL R4 3 - 0x9002B204, // 0025 SETMBR R0 K89 R4 - 0xA8040001, // 0026 EXBLK 1 1 - 0x70020009, // 0027 JMP #0032 - 0xAC100000, // 0028 CATCH R4 0 0 - 0x70020006, // 0029 JMP #0031 - 0xB8126000, // 002A GETNGBL R4 K48 - 0x8C10095A, // 002B GETMET R4 R4 K90 - 0x5818005C, // 002C LDCONST R6 K92 - 0x541E000D, // 002D LDINT R7 14 - 0x7C100600, // 002E CALL R4 3 - 0x9002B204, // 002F SETMBR R0 K89 R4 - 0x70020000, // 0030 JMP #0032 - 0xB0080000, // 0031 RAISE 2 R0 R0 - 0xB8126000, // 0032 GETNGBL R4 K48 - 0x8C10095D, // 0033 GETMET R4 R4 K93 - 0x58180007, // 0034 LDCONST R6 K7 - 0xB81E6000, // 0035 GETNGBL R7 K48 - 0x8C1C0F5E, // 0036 GETMET R7 R7 K94 - 0x5824005F, // 0037 LDCONST R9 K95 - 0x7C1C0400, // 0038 CALL R7 2 - 0xB8226000, // 0039 GETNGBL R8 K48 - 0x8C20115E, // 003A GETMET R8 R8 K94 - 0x58280060, // 003B LDCONST R10 K96 - 0x7C200400, // 003C CALL R8 2 - 0x88240152, // 003D GETMBR R9 R0 K82 - 0x88280159, // 003E GETMBR R10 R0 K89 - 0x7C100C00, // 003F CALL R4 6 - 0x88140157, // 0040 GETMBR R5 R0 K87 - 0x8C140B61, // 0041 GETMET R5 R5 K97 - 0x7C140200, // 0042 CALL R5 1 - 0x8C140B62, // 0043 GETMET R5 R5 K98 - 0x5C1C0800, // 0044 MOVE R7 R4 - 0x7C140400, // 0045 CALL R5 2 - 0x88140157, // 0046 GETMBR R5 R0 K87 - 0x8C140B63, // 0047 GETMET R5 R5 K99 - 0x881C0152, // 0048 GETMBR R7 R0 K82 - 0x781E0004, // 0049 JMPF R7 #004F - 0xB81E6000, // 004A GETNGBL R7 K48 - 0x8C1C0F5E, // 004B GETMET R7 R7 K94 - 0x58240007, // 004C LDCONST R9 K7 - 0x7C1C0400, // 004D CALL R7 2 - 0x70020003, // 004E JMP #0053 - 0xB81E6000, // 004F GETNGBL R7 K48 - 0x8C1C0F5E, // 0050 GETMET R7 R7 K94 - 0x58240064, // 0051 LDCONST R9 K100 - 0x7C1C0400, // 0052 CALL R7 2 - 0x58200007, // 0053 LDCONST R8 K7 - 0x7C140600, // 0054 CALL R5 3 - 0xB8166000, // 0055 GETNGBL R5 K48 - 0x8C140B65, // 0056 GETMET R5 R5 K101 - 0xB81E6000, // 0057 GETNGBL R7 K48 - 0x8C1C0F66, // 0058 GETMET R7 R7 K102 - 0x7C1C0200, // 0059 CALL R7 1 - 0x7C140400, // 005A CALL R5 2 - 0xB8166000, // 005B GETNGBL R5 K48 - 0x8C140B66, // 005C GETMET R5 R5 K102 - 0x7C140200, // 005D CALL R5 1 - 0x8C140B67, // 005E GETMET R5 R5 K103 - 0x581C0007, // 005F LDCONST R7 K7 - 0x58200007, // 0060 LDCONST R8 K7 - 0x7C140600, // 0061 CALL R5 3 - 0x60140013, // 0062 GETGBL R5 G19 - 0x7C140000, // 0063 CALL R5 0 - 0x90021805, // 0064 SETMBR R0 K12 R5 - 0x8C140168, // 0065 GETMET R5 R0 K104 - 0x5C1C0400, // 0066 MOVE R7 R2 - 0x7C140400, // 0067 CALL R5 2 - 0x80000000, // 0068 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_obj -********************************************************************/ -be_local_closure(class_HASPmota_parse_obj, /* name */ - be_nested_proto( - 20, /* nstack */ - 3, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_HASPmota, /* shared constants */ - be_str_weak(parse_obj), - &be_const_str_solidified, - ( &(const binstruction[239]) { /* code */ - 0xA40E8600, // 0000 IMPORT R3 K67 - 0xA4121E00, // 0001 IMPORT R4 K15 - 0x60140009, // 0002 GETGBL R5 G9 - 0x8C180340, // 0003 GETMET R6 R1 K64 - 0x58200009, // 0004 LDCONST R8 K9 - 0x7C180400, // 0005 CALL R6 2 - 0x7C140200, // 0006 CALL R5 1 - 0x8C180340, // 0007 GETMET R6 R1 K64 - 0x58200069, // 0008 LDCONST R8 K105 - 0x7C180400, // 0009 CALL R6 2 - 0x4C1C0000, // 000A LDNIL R7 - 0x201C0C07, // 000B NE R7 R6 R7 - 0x781E0003, // 000C JMPF R7 #0011 - 0x601C0008, // 000D GETGBL R7 G8 - 0x5C200C00, // 000E MOVE R8 R6 - 0x7C1C0200, // 000F CALL R7 1 - 0x70020000, // 0010 JMP #0012 - 0x4C1C0000, // 0011 LDNIL R7 - 0x5C180E00, // 0012 MOVE R6 R7 - 0x8C1C014A, // 0013 GETMET R7 R0 K74 - 0x7C1C0200, // 0014 CALL R7 1 - 0x4C200000, // 0015 LDNIL R8 - 0x20200A08, // 0016 NE R8 R5 R8 - 0x78220011, // 0017 JMPF R8 #002A - 0x14200B07, // 0018 LT R8 R5 K7 - 0x74220002, // 0019 JMPT R8 #001D - 0x542200FD, // 001A LDINT R8 254 - 0x24200A08, // 001B GT R8 R5 R8 - 0x7822000C, // 001C JMPF R8 #002A - 0x20200B07, // 001D NE R8 R5 K7 - 0x74220002, // 001E JMPT R8 #0022 - 0x4C200000, // 001F LDNIL R8 - 0x1C200C08, // 0020 EQ R8 R6 R8 - 0x78220007, // 0021 JMPF R8 #002A - 0x60200001, // 0022 GETGBL R8 G1 - 0x60240018, // 0023 GETGBL R9 G24 - 0x5828006A, // 0024 LDCONST R10 K106 - 0x5C2C0A00, // 0025 MOVE R11 R5 - 0x5C300C00, // 0026 MOVE R12 R6 - 0x7C240600, // 0027 CALL R9 3 - 0x7C200200, // 0028 CALL R8 1 - 0x80001000, // 0029 RET 0 - 0x8C200F6B, // 002A GETMET R8 R7 K107 - 0x5C280A00, // 002B MOVE R10 R5 - 0x7C200400, // 002C CALL R8 2 - 0x4C240000, // 002D LDNIL R9 - 0x20240C09, // 002E NE R9 R6 R9 - 0x7826005F, // 002F JMPF R9 #0090 - 0x4C240000, // 0030 LDNIL R9 - 0x20240A09, // 0031 NE R9 R5 R9 - 0x7826005C, // 0032 JMPF R9 #0090 - 0x4C240000, // 0033 LDNIL R9 - 0x1C241009, // 0034 EQ R9 R8 R9 - 0x78260059, // 0035 JMPF R9 #0090 - 0x60240009, // 0036 GETGBL R9 G9 - 0x8C280340, // 0037 GETMET R10 R1 K64 - 0x5830006C, // 0038 LDCONST R12 K108 - 0x7C280400, // 0039 CALL R10 2 - 0x7C240200, // 003A CALL R9 1 - 0x4C280000, // 003B LDNIL R10 - 0x4C2C0000, // 003C LDNIL R11 - 0x4C300000, // 003D LDNIL R12 - 0x2030120C, // 003E NE R12 R9 R12 - 0x78320007, // 003F JMPF R12 #0048 - 0x8C300F6B, // 0040 GETMET R12 R7 K107 - 0x5C381200, // 0041 MOVE R14 R9 - 0x7C300400, // 0042 CALL R12 2 - 0x5C281800, // 0043 MOVE R10 R12 - 0x4C300000, // 0044 LDNIL R12 - 0x2030140C, // 0045 NE R12 R10 R12 - 0x78320000, // 0046 JMPF R12 #0048 - 0x882C1512, // 0047 GETMBR R11 R10 K18 - 0x4C300000, // 0048 LDNIL R12 - 0x1C30160C, // 0049 EQ R12 R11 R12 - 0x78320002, // 004A JMPF R12 #004E - 0x8C300F6D, // 004B GETMET R12 R7 K109 - 0x7C300200, // 004C CALL R12 1 - 0x5C2C1800, // 004D MOVE R11 R12 - 0x8C300935, // 004E GETMET R12 R4 K53 - 0x5C380000, // 004F MOVE R14 R0 - 0x003EDC06, // 0050 ADD R15 K110 R6 - 0x7C300600, // 0051 CALL R12 3 - 0x4C340000, // 0052 LDNIL R13 - 0x4C380000, // 0053 LDNIL R14 - 0x1C38180E, // 0054 EQ R14 R12 R14 - 0x783A0010, // 0055 JMPF R14 #0067 - 0x8C380935, // 0056 GETMET R14 R4 K53 - 0x5C400600, // 0057 MOVE R16 R3 - 0x5C440C00, // 0058 MOVE R17 R6 - 0x7C380600, // 0059 CALL R14 3 - 0x4C3C0000, // 005A LDNIL R15 - 0x203C1C0F, // 005B NE R15 R14 R15 - 0x783E0009, // 005C JMPF R15 #0067 - 0x603C0004, // 005D GETGBL R15 G4 - 0x5C401C00, // 005E MOVE R16 R14 - 0x7C3C0200, // 005F CALL R15 1 - 0x1C3C1F6F, // 0060 EQ R15 R15 K111 - 0x783E0004, // 0061 JMPF R15 #0067 - 0x5C3C1C00, // 0062 MOVE R15 R14 - 0x5C401600, // 0063 MOVE R16 R11 - 0x7C3C0200, // 0064 CALL R15 1 - 0x5C341E00, // 0065 MOVE R13 R15 - 0x88300170, // 0066 GETMBR R12 R0 K112 - 0x4C380000, // 0067 LDNIL R14 - 0x1C38180E, // 0068 EQ R14 R12 R14 - 0x783A000F, // 0069 JMPF R14 #007A - 0x8C380971, // 006A GETMET R14 R4 K113 - 0x5C400C00, // 006B MOVE R16 R6 - 0x7C380400, // 006C CALL R14 2 - 0x4C3C0000, // 006D LDNIL R15 - 0x203C1C0F, // 006E NE R15 R14 R15 - 0x783E0009, // 006F JMPF R15 #007A - 0x603C0004, // 0070 GETGBL R15 G4 - 0x5C401C00, // 0071 MOVE R16 R14 - 0x7C3C0200, // 0072 CALL R15 1 - 0x1C3C1F6F, // 0073 EQ R15 R15 K111 - 0x783E0004, // 0074 JMPF R15 #007A - 0x5C3C1C00, // 0075 MOVE R15 R14 - 0x5C401600, // 0076 MOVE R16 R11 - 0x7C3C0200, // 0077 CALL R15 1 - 0x5C341E00, // 0078 MOVE R13 R15 - 0x88300170, // 0079 GETMBR R12 R0 K112 - 0x4C380000, // 007A LDNIL R14 - 0x1C38180E, // 007B EQ R14 R12 R14 - 0x783A0006, // 007C JMPF R14 #0084 - 0x60380001, // 007D GETGBL R14 G1 - 0x603C0018, // 007E GETGBL R15 G24 - 0x58400072, // 007F LDCONST R16 K114 - 0x5C440C00, // 0080 MOVE R17 R6 - 0x7C3C0400, // 0081 CALL R15 2 - 0x7C380200, // 0082 CALL R14 1 - 0x80001C00, // 0083 RET 0 - 0x5C381800, // 0084 MOVE R14 R12 - 0x5C3C1600, // 0085 MOVE R15 R11 - 0x5C400400, // 0086 MOVE R16 R2 - 0x5C440200, // 0087 MOVE R17 R1 - 0x5C481A00, // 0088 MOVE R18 R13 - 0x5C4C1400, // 0089 MOVE R19 R10 - 0x7C380A00, // 008A CALL R14 5 - 0x5C201C00, // 008B MOVE R8 R14 - 0x8C380F73, // 008C GETMET R14 R7 K115 - 0x5C400A00, // 008D MOVE R16 R5 - 0x5C441000, // 008E MOVE R17 R8 - 0x7C380600, // 008F CALL R14 3 - 0x1C240B07, // 0090 EQ R9 R5 K7 - 0x7826000F, // 0091 JMPF R9 #00A2 - 0x4C240000, // 0092 LDNIL R9 - 0x20240C09, // 0093 NE R9 R6 R9 - 0x78260006, // 0094 JMPF R9 #009C - 0x60240001, // 0095 GETGBL R9 G1 - 0x60280018, // 0096 GETGBL R10 G24 - 0x582C0074, // 0097 LDCONST R11 K116 - 0x5C300C00, // 0098 MOVE R12 R6 - 0x7C280400, // 0099 CALL R10 2 - 0x7C240200, // 009A CALL R9 1 - 0x80001200, // 009B RET 0 - 0x8C24014A, // 009C GETMET R9 R0 K74 - 0x7C240200, // 009D CALL R9 1 - 0x8C24136B, // 009E GETMET R9 R9 K107 - 0x582C0007, // 009F LDCONST R11 K7 - 0x7C240400, // 00A0 CALL R9 2 - 0x5C201200, // 00A1 MOVE R8 R9 - 0x4C240000, // 00A2 LDNIL R9 - 0x20241009, // 00A3 NE R9 R8 R9 - 0x7826000C, // 00A4 JMPF R9 #00B2 - 0x60240010, // 00A5 GETGBL R9 G16 - 0x8C28033C, // 00A6 GETMET R10 R1 K60 - 0x7C280200, // 00A7 CALL R10 1 - 0x7C240200, // 00A8 CALL R9 1 - 0xA8020004, // 00A9 EXBLK 0 #00AF - 0x5C281200, // 00AA MOVE R10 R9 - 0x7C280000, // 00AB CALL R10 0 - 0x942C020A, // 00AC GETIDX R11 R1 R10 - 0x9020140B, // 00AD SETMBR R8 R10 R11 - 0x7001FFFA, // 00AE JMP #00AA - 0x5824003E, // 00AF LDCONST R9 K62 - 0xAC240200, // 00B0 CATCH R9 1 0 - 0xB0080000, // 00B1 RAISE 2 R0 R0 - 0x4C240000, // 00B2 LDNIL R9 - 0x20241009, // 00B3 NE R9 R8 R9 - 0x78260001, // 00B4 JMPF R9 #00B7 - 0x8C241175, // 00B5 GETMET R9 R8 K117 - 0x7C240200, // 00B6 CALL R9 1 - 0x4C240000, // 00B7 LDNIL R9 - 0x60280008, // 00B8 GETGBL R10 G8 - 0x8C2C0340, // 00B9 GETMET R11 R1 K64 - 0x58340076, // 00BA LDCONST R13 K118 - 0x7C2C0400, // 00BB CALL R11 2 - 0x7C280200, // 00BC CALL R10 1 - 0x202C1577, // 00BD NE R11 R10 K119 - 0x782E0012, // 00BE JMPF R11 #00D2 - 0xA8020005, // 00BF EXBLK 0 #00C6 - 0x602C000D, // 00C0 GETGBL R11 G13 - 0x5C301400, // 00C1 MOVE R12 R10 - 0x7C2C0200, // 00C2 CALL R11 1 - 0x5C241600, // 00C3 MOVE R9 R11 - 0xA8040001, // 00C4 EXBLK 1 1 - 0x7002000B, // 00C5 JMP #00D2 - 0xAC2C0002, // 00C6 CATCH R11 0 2 - 0x70020008, // 00C7 JMP #00D1 - 0x60340001, // 00C8 GETGBL R13 G1 - 0x60380018, // 00C9 GETGBL R14 G24 - 0x583C0078, // 00CA LDCONST R15 K120 - 0x5C401400, // 00CB MOVE R16 R10 - 0x5C441600, // 00CC MOVE R17 R11 - 0x5C481800, // 00CD MOVE R18 R12 - 0x7C380800, // 00CE CALL R14 4 - 0x7C340200, // 00CF CALL R13 1 - 0x70020000, // 00D0 JMP #00D2 - 0xB0080000, // 00D1 RAISE 2 R0 R0 - 0x4C2C0000, // 00D2 LDNIL R11 - 0x202C120B, // 00D3 NE R11 R9 R11 - 0x782E0018, // 00D4 JMPF R11 #00EE - 0xA802000B, // 00D5 EXBLK 0 #00E2 - 0x5C2C1200, // 00D6 MOVE R11 R9 - 0x7C2C0000, // 00D7 CALL R11 0 - 0x60300004, // 00D8 GETGBL R12 G4 - 0x5C341600, // 00D9 MOVE R13 R11 - 0x7C300200, // 00DA CALL R12 1 - 0x1C301979, // 00DB EQ R12 R12 K121 - 0x78320002, // 00DC JMPF R12 #00E0 - 0x5C301600, // 00DD MOVE R12 R11 - 0x5C341000, // 00DE MOVE R13 R8 - 0x7C300200, // 00DF CALL R12 1 - 0xA8040001, // 00E0 EXBLK 1 1 - 0x7002000B, // 00E1 JMP #00EE - 0xAC2C0002, // 00E2 CATCH R11 0 2 - 0x70020008, // 00E3 JMP #00ED - 0x60340001, // 00E4 GETGBL R13 G1 - 0x60380018, // 00E5 GETGBL R14 G24 - 0x583C007A, // 00E6 LDCONST R15 K122 - 0x5C401400, // 00E7 MOVE R16 R10 - 0x5C441600, // 00E8 MOVE R17 R11 - 0x5C481800, // 00E9 MOVE R18 R12 - 0x7C380800, // 00EA CALL R14 4 - 0x7C340200, // 00EB CALL R13 1 - 0x70020000, // 00EC JMP #00EE - 0xB0080000, // 00ED RAISE 2 R0 R0 - 0x80000000, // 00EE RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse -********************************************************************/ -be_local_closure(class_HASPmota_parse, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_HASPmota, /* shared constants */ - be_str_weak(parse), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0xA40A2C00, // 0000 IMPORT R2 K22 - 0x8C0C051C, // 0001 GETMET R3 R2 K28 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x60100004, // 0004 GETGBL R4 G4 - 0x5C140600, // 0005 MOVE R5 R3 - 0x7C100200, // 0006 CALL R4 1 - 0x1C10091D, // 0007 EQ R4 R4 K29 - 0x78120009, // 0008 JMPF R4 #0013 - 0x8C100122, // 0009 GETMET R4 R0 K34 - 0x5C180600, // 000A MOVE R6 R3 - 0x7C100400, // 000B CALL R4 2 - 0x8C100125, // 000C GETMET R4 R0 K37 - 0x5C180600, // 000D MOVE R6 R3 - 0x881C010C, // 000E GETMBR R7 R0 K12 - 0x88200102, // 000F GETMBR R8 R0 K2 - 0x941C0E08, // 0010 GETIDX R7 R7 R8 - 0x7C100600, // 0011 CALL R4 3 - 0x70020000, // 0012 JMP #0014 - 0xB006477B, // 0013 RAISE 1 K35 K123 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_pages -********************************************************************/ -be_local_closure(class_HASPmota_get_pages, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_HASPmota, /* shared constants */ - be_str_weak(get_pages), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C040101, // 0000 GETMET R1 R0 K1 - 0x4C0C0000, // 0001 LDNIL R3 - 0x7C040400, // 0002 CALL R1 2 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_page_cur -********************************************************************/ -be_local_closure(class_HASPmota_get_page_cur, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 10, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - &be_ktab_class_HASPmota, /* shared constants */ - be_str_weak(get_page_cur), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8804010C, // 0000 GETMBR R1 R0 K12 - 0x88080102, // 0001 GETMBR R2 R0 K2 - 0x94040202, // 0002 GETIDX R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: HASPmota ********************************************************************/ be_local_class(HASPmota, 11, NULL, - be_nested_map(60, + be_nested_map(62, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(lvh_spangroup, -1), be_const_class(be_class_lvh_spangroup) }, - { be_const_key_weak(lvh_switch, -1), be_const_class(be_class_lvh_switch) }, - { be_const_key_weak(lvh_scr, -1), be_const_class(be_class_lvh_scr) }, - { be_const_key_weak(register_event, 55), be_const_closure(class_HASPmota_register_event_closure) }, + { be_const_key_weak(parse_obj, 13), be_const_closure(class_HASPmota_parse_obj_closure) }, + { be_const_key_weak(lvh_pages, -1), be_const_var(5) }, + { be_const_key_weak(lvh_dropdown_list, 1), be_const_class(be_class_lvh_dropdown_list) }, + { be_const_key_weak(lvh_tab, 17), be_const_class(be_class_lvh_tab) }, { be_const_key_weak(lvh_line, -1), be_const_class(be_class_lvh_line) }, - { be_const_key_weak(dark, 0), be_const_var(0) }, - { be_const_key_weak(_load, -1), be_const_closure(class_HASPmota__load_closure) }, - { be_const_key_weak(lvh_cpicker, -1), be_const_class(be_class_lvh_cpicker) }, - { be_const_key_weak(lvh_page_cur_idx, -1), be_const_var(6) }, - { be_const_key_weak(lvh_page, 54), be_const_class(be_class_lvh_page) }, - { be_const_key_weak(event_dispatch, -1), be_const_closure(class_HASPmota_event_dispatch_closure) }, - { be_const_key_weak(scr, 28), be_const_var(3) }, - { be_const_key_weak(fix_lv_version, 22), be_const_static_closure(class_HASPmota_fix_lv_version_closure) }, - { be_const_key_weak(get_page_cur_parsing, -1), be_const_closure(class_HASPmota_get_page_cur_parsing_closure) }, - { be_const_key_weak(lvh_btn, -1), be_const_class(be_class_lvh_btn) }, - { be_const_key_weak(init, -1), be_const_closure(class_HASPmota_init_closure) }, + { be_const_key_weak(lvh_bar, -1), be_const_class(be_class_lvh_bar) }, { be_const_key_weak(lvh_scale_section, -1), be_const_class(be_class_lvh_scale_section) }, - { be_const_key_weak(lvh_msgbox, -1), be_const_class(be_class_lvh_msgbox) }, - { be_const_key_weak(get_page_cur, -1), be_const_closure(class_HASPmota_get_page_cur_closure) }, - { be_const_key_weak(get_pages, -1), be_const_closure(class_HASPmota_get_pages_closure) }, - { be_const_key_weak(lvh_chart, -1), be_const_class(be_class_lvh_chart) }, - { be_const_key_weak(sort, -1), be_const_static_closure(class_HASPmota_sort_closure) }, - { be_const_key_weak(lvh_fixed, 17), be_const_class(be_class_lvh_fixed) }, - { be_const_key_weak(r16, -1), be_const_var(4) }, - { be_const_key_weak(lvh_scale, 19), be_const_class(be_class_lvh_scale) }, - { be_const_key_weak(parse_obj, -1), be_const_closure(class_HASPmota_parse_obj_closure) }, - { be_const_key_weak(def_templ_name, -1), be_nested_str_weak(pages_X2Ejsonl) }, - { be_const_key_weak(lvh_dropdown, 53), be_const_class(be_class_lvh_dropdown) }, - { be_const_key_weak(start, -1), be_const_closure(class_HASPmota_start_closure) }, - { be_const_key_weak(lvh_obj, -1), be_const_class(be_class_lvh_obj) }, - { be_const_key_weak(lvh_root, 41), be_const_class(be_class_lvh_root) }, - { be_const_key_weak(lvh_arc, -1), be_const_class(be_class_lvh_arc) }, - { be_const_key_weak(lvh_bar, 44), be_const_class(be_class_lvh_bar) }, - { be_const_key_weak(lvh_img, -1), be_const_class(be_class_lvh_img) }, - { be_const_key_weak(_remove_page, -1), be_const_closure(class_HASPmota__remove_page_closure) }, - { be_const_key_weak(lvh_btnmatrix, 48), be_const_class(be_class_lvh_btnmatrix) }, - { be_const_key_weak(pages_list_sorted, 45), be_const_closure(class_HASPmota_pages_list_sorted_closure) }, - { be_const_key_weak(lvh_led, -1), be_const_class(be_class_lvh_led) }, - { be_const_key_weak(parse_page, 18), be_const_closure(class_HASPmota_parse_page_closure) }, - { be_const_key_weak(lvh_spinner, 32), be_const_class(be_class_lvh_spinner) }, - { be_const_key_weak(lvh_span, 23), be_const_class(be_class_lvh_span) }, - { be_const_key_weak(re_page_target, 40), be_const_var(8) }, - { be_const_key_weak(page_dir_to, 20), be_const_closure(class_HASPmota_page_dir_to_closure) }, - { be_const_key_weak(lvh_scale_line, 37), be_const_class(be_class_lvh_scale_line) }, - { be_const_key_weak(event, -1), be_const_var(9) }, - { be_const_key_weak(lvh_qrcode, 47), be_const_class(be_class_lvh_qrcode) }, - { be_const_key_weak(lvh_pages, 31), be_const_var(5) }, - { be_const_key_weak(lvh_dropdown_list, 34), be_const_class(be_class_lvh_dropdown_list) }, - { be_const_key_weak(do_action, 29), be_const_closure(class_HASPmota_do_action_closure) }, - { be_const_key_weak(vres, 26), be_const_var(2) }, - { be_const_key_weak(lvh_roller, 25), be_const_class(be_class_lvh_roller) }, - { be_const_key_weak(lvh_slider, -1), be_const_class(be_class_lvh_slider) }, - { be_const_key_weak(parse, -1), be_const_closure(class_HASPmota_parse_closure) }, - { be_const_key_weak(hres, -1), be_const_var(1) }, + { be_const_key_weak(page_dir_to, -1), be_const_closure(class_HASPmota_page_dir_to_closure) }, + { be_const_key_weak(lvh_scr, -1), be_const_class(be_class_lvh_scr) }, { be_const_key_weak(lvh_flex, -1), be_const_class(be_class_lvh_flex) }, + { be_const_key_weak(lvh_spangroup, -1), be_const_class(be_class_lvh_spangroup) }, + { be_const_key_weak(lvh_obj, -1), be_const_class(be_class_lvh_obj) }, + { be_const_key_weak(lvh_chart, 47), be_const_class(be_class_lvh_chart) }, + { be_const_key_weak(get_page_cur, -1), be_const_closure(class_HASPmota_get_page_cur_closure) }, + { be_const_key_weak(_remove_page, -1), be_const_closure(class_HASPmota__remove_page_closure) }, + { be_const_key_weak(event_cb, -1), be_const_var(10) }, + { be_const_key_weak(page_show, 51), be_const_closure(class_HASPmota_page_show_closure) }, + { be_const_key_weak(lvh_cpicker, -1), be_const_class(be_class_lvh_cpicker) }, + { be_const_key_weak(fix_lv_version, -1), be_const_static_closure(class_HASPmota_fix_lv_version_closure) }, + { be_const_key_weak(register_event, -1), be_const_closure(class_HASPmota_register_event_closure) }, + { be_const_key_weak(lvh_fixed, -1), be_const_class(be_class_lvh_fixed) }, + { be_const_key_weak(lvh_scale_line, -1), be_const_class(be_class_lvh_scale_line) }, + { be_const_key_weak(lvh_dropdown, -1), be_const_class(be_class_lvh_dropdown) }, { be_const_key_weak(lvh_page_cur_idx_parsing, -1), be_const_var(7) }, + { be_const_key_weak(lvh_roller, 56), be_const_class(be_class_lvh_roller) }, + { be_const_key_weak(event_dispatch, -1), be_const_closure(class_HASPmota_event_dispatch_closure) }, + { be_const_key_weak(dark, 43), be_const_var(0) }, { be_const_key_weak(lvh_label, -1), be_const_class(be_class_lvh_label) }, - { be_const_key_weak(event_cb, 7), be_const_var(10) }, - { be_const_key_weak(page_show, 1), be_const_closure(class_HASPmota_page_show_closure) }, - { be_const_key_weak(lvh_checkbox, -1), be_const_class(be_class_lvh_checkbox) }, + { be_const_key_weak(r16, -1), be_const_var(4) }, + { be_const_key_weak(init, -1), be_const_closure(class_HASPmota_init_closure) }, + { be_const_key_weak(parse_page, -1), be_const_closure(class_HASPmota_parse_page_closure) }, + { be_const_key_weak(event, -1), be_const_var(9) }, + { be_const_key_weak(lvh_span, 44), be_const_class(be_class_lvh_span) }, + { be_const_key_weak(get_page_cur_parsing, 39), be_const_closure(class_HASPmota_get_page_cur_parsing_closure) }, + { be_const_key_weak(lvh_arc, -1), be_const_class(be_class_lvh_arc) }, + { be_const_key_weak(start, -1), be_const_closure(class_HASPmota_start_closure) }, + { be_const_key_weak(get_pages, -1), be_const_closure(class_HASPmota_get_pages_closure) }, + { be_const_key_weak(sort, -1), be_const_static_closure(class_HASPmota_sort_closure) }, + { be_const_key_weak(lvh_page_cur_idx, -1), be_const_var(6) }, + { be_const_key_weak(hres, 48), be_const_var(1) }, + { be_const_key_weak(lvh_root, 32), be_const_class(be_class_lvh_root) }, + { be_const_key_weak(vres, -1), be_const_var(2) }, + { be_const_key_weak(lvh_led, 22), be_const_class(be_class_lvh_led) }, + { be_const_key_weak(scr, -1), be_const_var(3) }, + { be_const_key_weak(re_page_target, -1), be_const_var(8) }, + { be_const_key_weak(lvh_btnmatrix, 42), be_const_class(be_class_lvh_btnmatrix) }, + { be_const_key_weak(lvh_scale, 27), be_const_class(be_class_lvh_scale) }, + { be_const_key_weak(lvh_msgbox, -1), be_const_class(be_class_lvh_msgbox) }, + { be_const_key_weak(lvh_img, 23), be_const_class(be_class_lvh_img) }, + { be_const_key_weak(lvh_checkbox, 26), be_const_class(be_class_lvh_checkbox) }, + { be_const_key_weak(lvh_switch, 25), be_const_class(be_class_lvh_switch) }, + { be_const_key_weak(parse, 4), be_const_closure(class_HASPmota_parse_closure) }, + { be_const_key_weak(lvh_btn, -1), be_const_class(be_class_lvh_btn) }, + { be_const_key_weak(do_action, 19), be_const_closure(class_HASPmota_do_action_closure) }, + { be_const_key_weak(lvh_tabview, 18), be_const_class(be_class_lvh_tabview) }, + { be_const_key_weak(lvh_slider, -1), be_const_class(be_class_lvh_slider) }, + { be_const_key_weak(_load, -1), be_const_closure(class_HASPmota__load_closure) }, + { be_const_key_weak(def_templ_name, 10), be_nested_str_weak(pages_X2Ejsonl) }, + { be_const_key_weak(lvh_qrcode, 7), be_const_class(be_class_lvh_qrcode) }, + { be_const_key_weak(lvh_spinner, 5), be_const_class(be_class_lvh_spinner) }, + { be_const_key_weak(pages_list_sorted, -1), be_const_closure(class_HASPmota_pages_list_sorted_closure) }, + { be_const_key_weak(lvh_page, -1), be_const_class(be_class_lvh_page) }, })), be_str_weak(HASPmota) ); diff --git a/pio-tools/compress-html.py b/pio-tools/compress-html.py new file mode 100644 index 000000000..bdfed1568 --- /dev/null +++ b/pio-tools/compress-html.py @@ -0,0 +1,15 @@ +Import("env") + +import sys +from pathlib import Path + +base_dir = env['PROJECT_DIR'] +unishox_dir = Path(base_dir, 'tools', 'unishox') +sys.path.append(str(unishox_dir.resolve())) +sys.dont_write_bytecode = True + +compress_dir = __import__('compress-html-uncompressed').compress_dir + +path_uncompressed = Path(base_dir, 'tasmota', 'html_uncompressed') +path_compressed = Path(base_dir, 'tasmota', 'html_compressed') +compress_dir(path_uncompressed, path_compressed) diff --git a/pio-tools/gzip-firmware.py b/pio-tools/gzip-firmware.py index 38876e63e..8de4f1c0f 100644 --- a/pio-tools/gzip-firmware.py +++ b/pio-tools/gzip-firmware.py @@ -31,10 +31,10 @@ if not tasmotapiolib.is_env_set(tasmotapiolib.DISABLE_MAP_GZ, env): env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [map_gzip]) if tasmotapiolib.is_env_set(tasmotapiolib.ENABLE_ESP32_GZ, env) or env["PIOPLATFORM"] != "espressif32": - try: - from zopfli.gzip import compress - except: - from gzip import compress + import time + + gzip_level = int(env['ENV'].get('GZIP_LEVEL', 10)) + def bin_gzip(source, target, env): # create string with location and file names based on variant bin_file = tasmotapiolib.get_final_bin_path(env) @@ -47,8 +47,10 @@ if tasmotapiolib.is_env_set(tasmotapiolib.ENABLE_ESP32_GZ, env) or env["PIOPLATF # write gzip firmware file with open(bin_file, "rb") as fp: with open(gzip_file, "wb") as f: - zopfli_gz = compress(fp.read()) - f.write(zopfli_gz) + time_start = time.time() + gz = tasmotapiolib.compress(fp.read(), gzip_level) + time_delta = time.time() - time_start + f.write(gz) ORG_FIRMWARE_SIZE = bin_file.stat().st_size GZ_FIRMWARE_SIZE = gzip_file.stat().st_size @@ -59,10 +61,11 @@ if tasmotapiolib.is_env_set(tasmotapiolib.ENABLE_ESP32_GZ, env) or env["PIOPLATF ) ) else: - print(Fore.GREEN + "Compression reduced firmware size to {:.0f}% (was {} bytes, now {} bytes)".format( + print(Fore.GREEN + "Compression reduced firmware size to {:.0f}% (was {} bytes, now {} bytes, took {:.3f} seconds)".format( (GZ_FIRMWARE_SIZE / ORG_FIRMWARE_SIZE) * 100, ORG_FIRMWARE_SIZE, GZ_FIRMWARE_SIZE, + time_delta, ) ) diff --git a/pio-tools/obj-dump.py b/pio-tools/obj-dump.py index a15a2e33b..ec94083af 100644 --- a/pio-tools/obj-dump.py +++ b/pio-tools/obj-dump.py @@ -18,5 +18,7 @@ def obj_dump_after_elf(source, target, env): env.Execute("xtensa-esp32s3-elf-objdump "+ "-D -C " + str(target[0]) + " > "+ "$BUILD_DIR/${PROGNAME}.asm") if mcu == "esp32c3": env.Execute("riscv32-esp-elf-objdump "+ "-D -C " + str(target[0]) + " > "+ "$BUILD_DIR/${PROGNAME}.asm") + if mcu == "esp32c6": + env.Execute("riscv32-esp-elf-objdump "+ "-D -C " + str(target[0]) + " > "+ "$BUILD_DIR/${PROGNAME}.asm") env.AddPostAction("$BUILD_DIR/${PROGNAME}.elf", [obj_dump_after_elf]) diff --git a/pio-tools/tasmotapiolib.py b/pio-tools/tasmotapiolib.py index 3105739c1..c63dc83c0 100644 --- a/pio-tools/tasmotapiolib.py +++ b/pio-tools/tasmotapiolib.py @@ -21,6 +21,7 @@ map_dir = /tmp/map_files/ Values in .ini files override environment variables """ +import zlib import pathlib import os @@ -42,7 +43,6 @@ MAP_DIR = "map_dir" # This is the default output directory OUTPUT_DIR = pathlib.Path("build_output") - def get_variant(env) -> str: """Get the current build variant.""" return env["PIOENV"] @@ -125,3 +125,75 @@ def is_env_set(name: str, env): val = val.strip() return val == "1" return False + +def _compress_with_gzip(data, level=9): + import zlib + if level < 0: level = 0 + elif level > 9: level = 9 + # gzip header without timestamp + zobj = zlib.compressobj(level=level, wbits=16 + zlib.MAX_WBITS) + return zobj.compress(data) + zobj.flush() + +try: + import zopfli + + # two python modules call themselves `zopfli`, which one is this? + if hasattr(zopfli, 'ZopfliCompressor'): + # we seem to have zopflipy + from zopfli import ZopfliCompressor, ZOPFLI_FORMAT_GZIP + def _compress_with_zopfli(data, iterations=15, maxsplit=15, **kw): + zobj = ZopfliCompressor( + ZOPFLI_FORMAT_GZIP, + iterations=iterations, + block_splitting_max=maxsplit, + **kw, + ) + return zobj.compress(data) + zobj.flush() + + else: + # we seem to have pyzopfli + import zopfli.gzip + def _compress_with_zopfli(data, iterations=15, maxsplit=15, **kw): + return zopfli.gzip.compress( + data, + numiterations=iterations, + blocksplittingmax=maxsplit, + **kw, + ) + + # values based on limited manual testing + def _level_to_params(level): + if level == 10: return (15, 15) + elif level == 11: return (15, 20) + elif level == 12: return (15, 25) + elif level == 13: return (15, 30) + elif level == 14: return (15, 35) + elif level == 15: return (33, 40) + elif level == 16: return (67, 45) + elif level == 17: return (100, 50) + elif level == 18: return (500, 100) + elif level >= 19: return (2500, 250) + else: + raise ValueError(f'Invalid level: {repr(level)}') + + def compress(data, level=None, *, iterations=None, maxsplit=None, **kw): + if level is not None and (iterations is not None or maxsplit is not None): + raise ValueError("The `level` argument can't be used with `iterations` and/or `maxsplit`!") + + # set parameters based on level or to defaults + if iterations is None and maxsplit is None: + if level is None: level = 10 + elif level < 10: return _compress_with_gzip(data, level) + iterations, maxsplit = _level_to_params(level) + + if maxsplit is not None: + kw['maxsplit'] = maxsplit + + if iterations is not None: + kw['iterations'] = iterations + + return _compress_with_zopfli(data, **kw) + +except ModuleNotFoundError: + def compress(data, level=9, **kw): + return _compress_with_gzip(data, level) diff --git a/platformio.ini b/platformio.ini index 1d1c9c0bf..8fe862e4b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -73,6 +73,7 @@ build_flags = extra_scripts = pre:pio-tools/pre_source_dir.py pre:pio-tools/set_partition_table.py pre:pio-tools/override_copy.py + pre:pio-tools/compress-html.py post:pio-tools/strip-flags.py [esp_defaults] @@ -120,7 +121,8 @@ build_flags = ${esp_defaults.build_flags} -DMIMETYPE_MINIMAL ; uncomment the following to enable TLS with 4096 RSA certificates ;-DUSE_4K_RSA -lib_ignore = +lib_ignore = ESP8266Audio + ESP8266SAM ESP8266LLMNR ESP8266NetBIOS ESP8266SSDP diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 0c3b4c955..61a606b99 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -81,7 +81,7 @@ lib_ignore = ${esp32_defaults.lib_ignore} ccronexpr [core32] -platform = https://github.com/tasmota/platform-espressif32/releases/download/2024.12.30/platform-espressif32.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/2025.02.30/platform-espressif32.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} diff --git a/platformio_tasmota_env.ini b/platformio_tasmota_env.ini index f14720194..287a475fa 100644 --- a/platformio_tasmota_env.ini +++ b/platformio_tasmota_env.ini @@ -14,7 +14,7 @@ lib_ldf_mode = ${common.lib_ldf_mode} lib_compat_mode = ${common.lib_compat_mode} lib_extra_dirs = ${common.lib_extra_dirs} lib_ignore = ${esp82xx_defaults.lib_ignore} -; Add files to Filesystem for all env (global). Remove no files entry and add add a line with the file to include +; Add files to Filesystem for all env (global). Remove no files entry and add a line with the file to include custom_files_upload = no_files [env:tasmota] @@ -109,6 +109,9 @@ build_flags = ${env.build_flags} -DMY_LANGUAGE=it_IT -DOTA_URL='"htt [env:tasmota-KO] build_flags = ${env.build_flags} -DMY_LANGUAGE=ko_KO -DOTA_URL='"http://ota.tasmota.com/tasmota/release/tasmota-KO.bin.gz"' +[env:tasmota-LT] +build_flags = ${env.build_flags} -DMY_LANGUAGE=lt_LT -DOTA_URL='"http://ota.tasmota.com/tasmota/release/tasmota-LT.bin.gz"' + [env:tasmota-NL] build_flags = ${env.build_flags} -DMY_LANGUAGE=nl_NL -DOTA_URL='"http://ota.tasmota.com/tasmota/release/tasmota-NL.bin.gz"' diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 5b6baa383..7bfff4185 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -20,7 +20,7 @@ lib_extra_dirs = ${common.lib_extra_dirs} lib/libesp32 lib/libesp32_lvgl lib_ignore = ${esp32_defaults.lib_ignore} -; Add files to Filesystem for all env (global). Remove no files entry and add add a line with the file to include +; Add files to Filesystem for all env (global). Remove no files entry and add a line with the file to include ; Example for adding the Partition Manager ; custom_files_upload = ; tasmota/berry/modules/Partition_Manager.tapp @@ -345,6 +345,10 @@ build_flags = ${env:tasmota32_base.build_flags} -DMY_LANGUAGE=it_IT extends = env:tasmota32_base build_flags = ${env:tasmota32_base.build_flags} -DMY_LANGUAGE=ko_KO -DFIRMWARE_TASMOTA32 -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32-KO.bin"' +[env:tasmota32-LT] +extends = env:tasmota32_base +build_flags = ${env:tasmota32_base.build_flags} -DMY_LANGUAGE=lt_LT -DFIRMWARE_TASMOTA32 -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32-LT.bin"' + [env:tasmota32-NL] extends = env:tasmota32_base build_flags = ${env:tasmota32_base.build_flags} -DMY_LANGUAGE=nl_NL -DFIRMWARE_TASMOTA32 -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32-NL.bin"' diff --git a/sdkconfig.defaults b/sdkconfig.defaults index 2a7504384..cdecdb7b7 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -38,6 +38,7 @@ CONFIG_ESP_IPC_TASK_STACK_SIZE=1024 CONFIG_ESP_MAIN_TASK_STACK_SIZE=4096 CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2048 CONFIG_ESP_TASK_WDT_PANIC=y +# CONFIG_ESP_SYSTEM_HW_STACK_GUARD is not set CONFIG_ESP_TIMER_TASK_STACK_SIZE=4096 CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE=y @@ -210,6 +211,7 @@ CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=4096 # CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER is not set # CONFIG_USE_WAKENET is not set # CONFIG_USE_MULTINET is not set +# CONFIG_MBEDTLS_FS_IO is not set # CONFIG_VFS_SUPPORT_SELECT is not set # CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT is not set # CONFIG_VFS_SUPPORT_TERMIOS is not set diff --git a/tasmota/berry/drivers/AXP2102_M5CoreS3.be b/tasmota/berry/drivers/AXP2102_M5CoreS3.be new file mode 100644 index 000000000..df2304191 --- /dev/null +++ b/tasmota/berry/drivers/AXP2102_M5CoreS3.be @@ -0,0 +1,62 @@ +#------------------------------------------------------------- + - Specialized driver for AXP2102 of M5CoreS3 + -------------------------------------------------------------# +class AXP2102_M5CoreS3 : AXP2102 + def init() + super(self).init() + + if self.wire + # From https://github.com/m5stack/M5Unified/blob/b8cfec7fed046242da7f7b8024a4e92004a51ff7/src/utility/Power_Class.cpp#L62 + # Axp2101.begin(); + # static constexpr std::uint8_t reg_data_array[] = + # { 0x90, 0xBF // LDOS ON/OFF control 0 + # , 0x92, 18 -5 // ALDO1 set to 1.8v // for AW88298 + # , 0x93, 33 -5 // ALDO2 set to 3.3v // for ES7210 + # , 0x94, 33 -5 // ALDO3 set to 3.3v // for camera + # , 0x95, 33 -5 // ALDO3 set to 3.3v // for TF card slot + # , 0x27, 0x00 // PowerKey Hold=1sec / PowerOff=4sec + # , 0x69, 0x11 // CHGLED setting + # , 0x10, 0x30 // PMU common config + # , 0x30, 0x0F // ADC enabled (for voltage measurement) + # }; + self.write8(0x90, 0xBF) # LDOS ON/OFF control 0 + self.write8(0x92, 18 -5) # ALDO1 set to 1.8v // for AW88298 + self.write8(0x93, 33 -5) # ALDO2 set to 3.3v // for ES7210 + self.write8(0x94, 33 -5) # ALDO3 set to 3.3v // for camera + self.write8(0x95, 33 -5) # ALDO4 set to 3.3v // for TF card slot + self.write8(0x27, 0x00) # PowerKey Hold=1sec / PowerOff=4sec + self.write8(0x69, 0x11) # CHGLED setting + self.write8(0x10, 0x30) # PMU common config + self.write8(0x30, 0x0F) # ADC enabled (for voltage measurement) + tasmota.add_driver(self) + end + end + + # set LCD backlight voltage on DLDO1 + def set_lcd_voltage(voltage) + if (voltage < 2500) voltage = 2500 end + if (voltage > 3300) voltage = 3300 end + self.set_dldo_voltage(0, voltage) # 0=DLD01 + end + + # Speaker enable + def set_speaker_enable(state) + self.set_ldo_voltage(2, state ? 3300 : 0) # 2 = ALDO3 + end + + # Dimmer in percentage + def set_displaydimmer(x) + var v = tasmota.scale_uint(x, 0, 100, 2500, 3300) + self.set_lcd_voltage(v) + end + + # respond to display events + def display(cmd, idx, payload, raw) + if cmd == "dim" || cmd == "power" + self.set_displaydimmer(idx) + end + end + +end + +return AXP2102_M5CoreS3() diff --git a/tasmota/berry/drivers/M5_8encoder.be b/tasmota/berry/drivers/M5_8encoder.be new file mode 100644 index 000000000..35c454d6c --- /dev/null +++ b/tasmota/berry/drivers/M5_8encoder.be @@ -0,0 +1,178 @@ +###################################################################### +# Driver for M5Stack 8encoder +# +# How to use: +# - copy file to file-system +# - add `import M5_8encoder` in `autoexec.be` +# +# This device is composed of 8 rotary encoders (numbered 0..7) +# each rotary encoder has a button embedded that can be pressed +# and an RGB Led right above it. +# A main switch (on/off) is also available at the far right +# +# The device is very sensitive to I2C read request format +# otherwise it blocks the entire I2C bus +# (I haven't found a way to free the bus without powering off the device) +# +# Read patterns; +# - 0x00-0x1F: 4 bytes max +# - 0x20-0x3F: 4 bytes max +# - 0x50-0x57: 1 byte max +# - 0x60 : 1 bytes max +# - 0x70-0x8A: 3 bytes max +# - 0xFE : 1 byte max +# +# Write patterns: +# - 0x00-0x1F: multiple of 4 bytes +# - 0x40-0x47: 1..8 bytes (sending more than 8 might trigger a buffer overflow) +# - 0x70-0x8A: multiple of 3 bytes +# - 0xFF : 1 byte +# +# https://docs.m5stack.com/en/unit/8Encoder +###################################################################### + +class M5_8encoder : I2C_Driver + var switch + var rotaries, colors, buttons + + def init(addr) + if (addr == nil) addr = 0x41 end + super(self, I2C_Driver).init("M5_8encoder", addr) + + self.switch = 0 + self.rotaries = [0, 0, 0, 0, 0, 0, 0, 0] + self.colors = [0, 0, 0, 0, 0, 0, 0, 0] + self.buttons = [0, 0, 0, 0, 0, 0, 0, 0] + + if self.wire + tasmota.add_driver(self) + end + end + + # read counter for (0..7) + def get_rotary_counter(num) + return self.wire.read(self.addr, 0x00 + num * 4, -4) + end + + # Read the current increment for rotary (0..7) + def get_rotary_increment(num) + return self.wire.read(self.addr, 0x20 + num * 4, -4) + end + + # reset the counter num (0..7) + def rotary_counter_reset(num) + self.wire.write(self.addr, 0x40 + num, 1, 1) + end + + # update all rotary values + def update_all() + var i = 0 + while i < 8 + # rotaries + var v = self.get_rotary_increment(i) / 2 # divide by 2, because they always increment by 2 + v += self.rotaries[i] + if (v < 0) v = 0 end + if (v > 15) v = 15 end + self.rotaries[i] = v + # buttons + self.buttons[i] = self.get_rotary_pressed(i) + # colors + self.colors[i] = self.get_led_color(i) + i += 1 + end + self.get_switch() + end + + # Read status of the far-right switch + def get_switch() + self.switch = self.wire.read(self.addr, 0x60, 1) ? 1 : 0 + return self.switch + end + + # Get 1 if button is pressed, 0 if not + def get_rotary_pressed(num) + return self.wire.read(self.addr, 0x50 + num, 1) ? 1 : 0 + end + + # Read firmware version + def get_firmware() + return self.wire.read(self.addr, 0xFE, 1) + end + + # Read I2C address from the register. We don't implement writing here as it is too dangerous + def get_i2c_address() + return self.wire.read(self.addr, 0xFF, 1) + end + + def get_led_color(num) + return self.wire.read(self.addr, 0x70 + 3 * num, 3) + end + + def set_led_color(num, color) + self.colors[num] = color + self.wire.write(self.addr, 0x70 + 3 * num, color, 3) + end + + def set_led_color_bytes(b) + self.wire.write_bytes(self.addr, 0x70, b) + end + + def get_led_color_all() + var b = bytes() + for i: 0..7 + b = b + self.wire.read_bytes(self.addr, 0x70 + 3 * i, 3) + end + return b + end + + # clear all 8 leds at once + def clear_led_all() + var b = bytes() + b.resize(24) + self.wire.write_bytes(self.addr, 0x70, b) + end + + def button_html(i) + return f'' + end + + # update every 50ms + def every_50ms() + self.update_all() + end + + #- display sensor value in the web UI -# + def web_sensor() + if !self.wire return nil end #- exit if not initialized -# + var msg = format('' + "{s}M5Stack 8encoder{m}Switch %s{e}" + '' + "" + "{m}%s{m}%s{m}%s{m}%s{m}%s{m}%s{m}%s{m}%s{e}" + "{m}%2i{m}%2i{m}%2i{m}%2i{m}%2i{m}%2i{m}%2i{m}%2i{e}" + "{m}CH1{m}CH2{m}CH3{m}CH4{m}CH5{m}CH6{m}CH7{m}CH8{e}" + '' + '' + '
' + , + self.get_switch() ? "On" : "Off", + self.button_html(0), self.button_html(1), self.button_html(2), self.button_html(3), self.button_html(4), self.button_html(5), self.button_html(6), self.button_html(7), + self.rotaries[0], self.rotaries[1], self.rotaries[2], self.rotaries[3], self.rotaries[4], self.rotaries[5], self.rotaries[6], self.rotaries[7] + ) + tasmota.web_send(msg) + end + + #- add sensor value to teleperiod -# + def json_append() + if !self.wire return nil end #- exit if not initialized -# + var msg = format(',"M5_8encoder":{"Switch":%i,"Rotaries":[%i,%i,%i,%i,%i,%i,%i,%i]}', + self.get_switch(), + self.rotaries[0], self.rotaries[1], self.rotaries[2], self.rotaries[3], self.rotaries[4], self.rotaries[5], self.rotaries[6], self.rotaries[7] + ) + tasmota.response_append(msg) + end +end + +return M5_8encoder() diff --git a/tasmota/berry/drivers/PN532.be b/tasmota/berry/drivers/PN532.be new file mode 100644 index 000000000..ebd12c9da --- /dev/null +++ b/tasmota/berry/drivers/PN532.be @@ -0,0 +1,430 @@ +#------------------------------------------------------------- + - Driver for PN532 RFID chip connected in Serial mode + -------------------------------------------------------------# + +#@ solidify:PN532 +class PN532 + var ser # serial object + var cmd # last cmd sent or received + var timer_clear_uid # time to clear UID + + var uid # last UID read + var atqa # + + static var _TIMER_CLEAR_UID = 4000 # time to clear UID, default 5 seconds + static var _TIMER_ID = "pn532_timer" # unique id for the timer + static var _NOUID = bytes("00000000") + static var _WAKEUP = bytes("5555000000") + static var _GETFIRMWAREVERSION = bytes("02") # PN532_COMMAND_GETFIRMWAREVERSION + static var _ACK = bytes("0000FF00FF00") # Ack message + static var _PRE = bytes("0000FF") # PN532_PREAMBLE + PN532_STARTCODE1 + PN532_STARTCODE2 + static var _EMPTY = bytes("") + static var _CONFIG_RETRIESF = bytes("3205020100") # minimum retries + static var _SAMCONFIG = bytes("14011400") + static var _KEY_MIFARE = bytes("FFFFFFFFFFFF") # default encryption key for MIFARE + static var _SUCCESS = bytes("00") + static var _INRELEASE = bytes("5201") # + static var _AUTH = bytes("400160") # auth prefix + static var _READ = bytes("400130") + + ###################################################################### + # init(tx, rx) + # + # Initialize PN532 driver, with tx/rx GPIOs + def init(tx, rx) + if (tx == nil || rx == nil) + raise "value_error", "tx/rx cannot be nil" + end + self.uid = self._NOUID + self.timer_clear_uid = self._TIMER_CLEAR_UID + + # import gpio + # gpio.pin_mode(tx, gpio.OUTPUT) + # gpio.pin_mode(rx, gpio.INPUT) + + self.ser = serial(rx, tx, 115200) + log(f"NFC: PN532 Rx {rx} Tx {tx}", 3) + + self.start() + + if self.ser + tasmota.add_driver(self) + end + end + + def start() + try + # read firmware version + var b = self.command(self._GETFIRMWAREVERSION, 100) + log(f"NFC: GetFirmwareVersion '{b.tohex()}'", 3) + # bytes('32010607') + log(f"NFC: PN532 NFC Reader detected v{b[1]}.{b[2]}", 2) + + # PN532_setPassiveActivationRetries(0xFF) + b = self.command(self._CONFIG_RETRIESF, 100) + # log(f"NFC: setPassiveActivationRetries '{b.tohex()}'", 3) + + # PN532_SAMConfig() + self.command(self._SAMCONFIG, 100) + # log(f"NFC: SAMConfig '{b.tohex()}'", 3) + + except "pn532" as _, m + log(f"NFC: error '{m}' more='{self.ser.read().tohex()}'", 2) + self.stop() + end + end + + def stop() + tasmota.remove_driver(self) + self.ser.close() + self.ser = nil + end + + ###################################################################### + # command(payload : bytes [, no_response : bool, timeout_ms = 50]) + # + # Send a command as a bytes buffer (first byte is command) + # Timeout in millisecond, defaut is 50 ms + # + # Returns a bytes() object as the response + # to the command (checks internally for Ack) or + # raise an exception of class 'pn532' if something went wrong + def command(payload, timeout_ms) + if !self.ser return nil end + if (payload == nil) payload = self._EMPTY end + if (timeout_ms == nil) timeout_ms = 50 end + if tasmota.loglevel(4) + log(f"NFC: sending command '{payload.tohex()}'", 4) + end + var ser = self.ser + var b + self.cmd = nil # reset cmd + + b = bytes() + b.append(self._PRE) + var length = size(payload) + 1 # length of data field: TFI + DATA + b.add(length) + b.add(~length + 1) # checksum of length + b.add(0xD4) # PN532_HOSTTOPN532 + var sum = 0xD4 + if (size(payload) > 0) # write payload + self.cmd = payload[0] + b.append(payload) + var idx = 0 + while idx < size(payload) + sum += payload[idx] + idx += 1 + end + end + b.add(~sum + 1) # checksum of TFI + DATA + b.add(0x00) # PN532_POSTAMBLE + if tasmota.loglevel(4) + log(f"NFC: sending raw '{b.tohex()}'", 4) + end + self._wakeup() # wakeup + ser.flush() # clear the serial buffer just in case + ser.write(b) + + ######## + # check for Ack + var until_ms = tasmota.millis(10) # Ack max timeout is 10ms for 115200 + b = self._read(size(self._ACK), until_ms) + if (b != self._ACK) + log(f"NFC: Invalid ACK '{b.tohex()}'", 3) + raise "pn532", "invalid_ack" + end + if tasmota.loglevel(4) + log(f"NFC: ACK received", 4) + end + + ######## + # read response + var ret = self._read_response(self.cmd, timeout_ms) + if tasmota.loglevel(4) + log(f"NFC: received response '{ret.tohex()}' cmd 0x{self.cmd:02X}", 4) + end + return ret + end + + def _read_response(cmd_excpected, timeout_ms) + var until_ms = tasmota.millis(timeout_ms != nil ? timeout_ms : 50) + var b + + b = self._read(3, until_ms) + # log(f"NFC: recv pre '{b.tohex()}'", 4) + if (b != self._PRE) + log(f"NFC: invalid prefix '{b.tohex()}' expected '{self._PRE.tohex()}'") + raise 'pn532', 'invalid_pre' + end + + # Get length of data to be received + b = self._read(2, until_ms) + # log(f"NFC: recv len '{b.tohex()}'", 4) + if ((b[0] + b[1]) & 0xFF) != 0 + log(f"NFC: invalid length '{b.tohex()}'") + raise 'pn532', 'invalid_len' + end + + var len = b[0] - 2 + + # Get cmd + b = self._read(2, until_ms) + # log(f"NFC: recv cmd '{b.tohex()}'", 4) + var cmd = b[1] + if (b[0] != 0xD5 #-PN532_PN532TOHOST-#) || (cmd_excpected != nil && self.cmd + 1 != cmd) + log(f"NFC: invalid command '{b.tohex()}'") + raise 'pn532', 'invalid_cmd' + else + self.cmd = cmd + end + + var ret + if (len > 0) + ret = self._read(len, until_ms) + # log(f"NFC: recv ret '{ret.tohex()}'", 4) + else + ret = bytes() + end + + # read checksum and end + b = self._read(2, until_ms) + # log(f"NFC: recv post '{b.tohex()}'", 4) + if (b[1] != 0) + log(f"NFC: invalid frame '{b.tohex()}'") + raise 'pn532', 'invalid_frame' + end + + return ret + end + + ###################################################################### + # _read(len : int [, until_ms = now + 15]) + # + # Internal function: read exactly `len` bytes or raise an exception if timeout + # Retuns `bytes()` buffer + # + # if `timeout_ms` is `0`, do a non-blocking read and return `nil` if response not available + # if `len` is `0`, get whatever is in the buffer (no limit) and return `nil` if empty + # + # Note: if `len > 0 && timeout_ms > 0` then it returns either `bytes()` or raises an exception + # does not return `nil` in such case + def _read(len, until_ms) + if (until_ms == nil) until_ms = tasmota.millis(15) end + + if (len <= 0) + return self.ser.read() + else + while !tasmota.time_reached(until_ms) + if self.ser.available() >= len + return self.ser.read(len) + end + end + raise "pn532", "timeout" + end + end + + ###################################################################### + # wakeup + # + # Send a serial sequence to wake up the PN532 + def _wakeup() + self.ser.write(self._WAKEUP) # send the wake up seuence + self.ser.flush() # remove any left-overs in buffers + end + + ###################################################################### + # set_timer_clear_uid(ms) + # + # Change the default value of the timer to clear UID, minimum is 1s + def set_timer_clear_uid(ms) + ms = tasmota.int(ms, 1000, nil) # ensure the value is int and within boundaries + self.timer_clear_uid = ms + end + + ###################################################################### + # read_passive_target_id(card_baud_rate) + # + # card_baud_rate: + # 0 = MIFARE_ISO14443A + def read_passive_target_id(card_baud_rate) + if !self.ser return nil end + if (card_baud_rate == nil) card_baud_rate = 0 #-MIFARE-# end + + # first release whatever is on-going + self.release_card() # we don't care if there's an error + + var cmd = bytes("4A01") + cmd.add(card_baud_rate) + try + var b = self.command(cmd, 25) # aggressive 25ms timeout since we don't want to stop Tasmota for too long - response is normally recevied in 15ms + log(f"NFC: ReadPassiveTargetID '{b.tohex()}'", 4) + + if (b[0] > 0) && (b[1] == 1) + # b0 Tags Found + # b1 Tag Number (only one used in this example) + # b2..3 SENS_RES + # b4 SEL_RES + # b5 NFCID Length + # b6..NFCIDLen NFCID + + # we got a card + self.atqa = b.get(2, -2) # read 16 bits, at position 2, Big Endian + var uid_len = b[5] + if (uid_len > 0) + self.uid = b[6 .. uid_len + 5] + if (tasmota.loglevel(3)) + log(f"NFC: detected MIFARE UID '{self.uid.tohex()}'", 4) + end + else + self.uid = self._NOUID + end + return true + end + except 'pn532' + end + return false + end + + ###################################################################### + # release_card() + # + # close connection to a card. Can be called if no connection is available + def release_card() + if !self.ser return nil end + self.command(self._INRELEASE) + # we don't really care about the result + # result is bytes('00') if successful or bytes('27') if no connection is ongoing + end + + + ###################################################################### + # authenticate_card(card_baud_rate) + # + # authenticate to card: + # sector: sector number (0..63 for 1K, 0..255 for 4K) + # auth_B: 'false' = auth_A, 'true' = auth_B + # key: encryption key or bytes("FFFFFFFFFFFF") if 'nil' + # + # return 'true' if succesful + def authenticate_card(sector, auth_B, key) + if !self.ser return nil end + if (key == nil) key = self._KEY_MIFARE end + auth_B = bool(auth_B) # force boolean + var payload = self._AUTH.copy() + if (auth_B) payload[-1] += 1 end # increment last byte if auth_B + payload.add(sector) + payload.append(key) + payload.append(self.uid) + + var ret = self.command(payload) + return ret == self._SUCCESS + end + + ###################################################################### + # reset_uid() + # + # Reset the card UID, so we generate a NEW_CARD event + def reset_uid() + self.uid = self._NOUID + end + + ###################################################################### + # read_card(sector) + # + # read a sector of 16 bytes (0..63 for 1K, 0..255 for 4K) + # + # return bytes(16) or nil + def read_card(sector) + if !self.ser return nil end + var payload = self._READ.copy() + payload.add(sector) + + return self.command(payload) + end + + ###################################################################### + # card_detected() + # + # Called whenever a card is detected on recurrent polling + def card_detected() + # override in your subclass + end + + ###################################################################### + # new_card_detected() + # + # Called whenever a new card is detected on recurrent polling (i.e. different UID) + def new_card_detected() + # override in your subclass + end + + ###################################################################### + # publish_card_detected(new : bool) + # + # Handle the event of a card detected + def publish_card_detected(new_card) + # we detected a card + if new_card + log(f"NFC: New card detected with UID {self.uid.tohex()}", 3) + self.new_card_detected() + var event_card = format('{"PN532":{"NEW_CARD":{"UID":"%s"}}}', self.uid.tohex()) + tasmota.publish_rule(event_card) + else + self.card_detected() + end + # reset timer + # remove any previous timer + tasmota.remove_timer(self._TIMER_ID) + tasmota.set_timer(self.timer_clear_uid, def () self.reset_uid() end, self._TIMER_ID) + end + + ###################################################################### + # every_250ms() + # + # Probe card 4 times per second + def every_250ms() + if !self.ser return nil end + var old_uid = self.uid + if self.read_passive_target_id(0) + self.publish_card_detected(old_uid != self.uid) + end + end + + ###################################################################### + # web_sensor() + # + # Display UID on main page + def web_sensor() + if !self.ser return nil end + var msg = format("{s}PN532 UID{m}%s{e}", self.uid.tohex()) + tasmota.web_send(msg) + end + +end + +return PN532 + +#- +# Example + +import PN532 + +class CardReader : PN532 + def init(tx, rx) + super(self).init(tx, rx) + end + + def new_card_detected() + # authenticate to sector 4, auth_A, default key + if self.authenticate_card(4, false, nil) + var ret = self.read_card(4) + if (ret != nil) + # do your stuff + print(f"NEW CARD with content {ret[12..15].tohex()}") + end + end + end +end + +pn532 = CardReader(22, 23) +-# \ No newline at end of file diff --git a/tasmota/berry/examples/heatfan.be b/tasmota/berry/examples/heatfan.be new file mode 100644 index 000000000..b0b23bda4 --- /dev/null +++ b/tasmota/berry/examples/heatfan.be @@ -0,0 +1,317 @@ +#- +heatfan.be - HeatFan support for Tasmota + +SPDX-FileCopyrightText: 2025 Theo Arends + +SPDX-License-Identifier: GPL-3.0-only +-# + +#-------------------------------------------------------------- +Version v1.2.8 + +ESP32-C2 based HeatFan WiFi Controller using Tasmota and Berry local CH Fan control +https://heatfan.eu/product/wifi-controller/ + +Template {"NAME":"HeatFan","GPIO":[4864,229,228,4737,4738,224,0,225,32,448,226,0,0,0,0,0,0,0,227,0,0],"FLAG":0,"BASE":1} +Module 0 # Enable above template +SO15 0 # Disable light and enable PWM control +GroupTopic2 heatfans # Allow MQTT group topic control using buttons "Send Mode" and "Next Mode" + +Relay1 to Relay6 control Leds for Modes 1 to 6 (interlocked) + +GPIO00 = ADC1 range (temperature input from comparator) +GPIO01 = Relay6 (blue) +GPIO02 = Relay5 (red) +GPIO03 = ADC2 temperature (ADC_CH_TEMP) +GPIO04 = ADC3 temperature (ADC_CH_TMCU) +GPIO05 = Relay1 (red) +GPIO06 = gpio.digital_write (GPIO_FANS_EN) +GPIO07 = Relay2 (red) +GPIO08 = Button1 +GPIO09 = PWM_i1 (20kHz fan control) +GPIO10 = Relay3 (red) +GPIO18 = Relay4 (red) +--------------------------------------------------------------# + +import persist +import string +import gpio +import webserver + +class heatfan_cls + + #------------------------------------------------------------ + User specific parameters + Send temperature and speed to Home Automation + ------------------------------------------------------------# + static domoticz = { + # hostname, temperature, speed + "heatfan1":[3149, 3150], # Domoticz Idx for temperature (3149) and speed (custom sensor) (3150) + "heatfan2":[3151, 3152], + "heatfan3":[3153, 3154] + } + + def SendToHa() + if self.domoticz.contains(self.hostname) + tasmota.cmd(f"_DzSend1 {self.domoticz[self.hostname][0]},{self.temp_ext}") + tasmota.cmd(f"_DzSend1 {self.domoticz[self.hostname][1]},{self.speed}") + else + tasmota.log(f"HFN: Domoticz on '{self.hostname}' not configured", 3) + end + end + + #------------------------------------------------------------ + Mode specific parameters + ------------------------------------------------------------# + static modes = { + # start_temp, max_temp, start_speed, max_speed, led_pin + 1: [25, 100, 1, 5, 5], # Speed starts at 1 from 25°C and caps at 5 from 100°C + 2: [25, 100, 1, 7, 7], # Speed starts at 1 from 25°C and caps at 7 from 100°C + 3: [25, 70, 1, 8, 10], # Speed starts at 1 from 25°C and caps at 8 from 70°C + 4: [25, 55, 1, 9, 18], # Speed starts at 1 from 25°C and caps at 9 from 55°C + 5: [25, 40, 1, 10, 2], # Speed starts at 1 from 25°C and caps at 10 from 40°C + 6: [10, 100, 10, 10, 1] # Speed starts at 10 from 10°C and caps at 10 from 100°C + } + + #-----------------------------------------------------------# + + static power_states = [ 0, 1, 10 ] # Relay power Off, On, Duty 10 + + # bool + var teleperiod + # int + var mode, mode_persist, mode_states, speed, pwm_fan_change + # float + var temp_ext, last_temp_ext, dz_temp_ext + # string + var version, hostname + + #-----------------------------------------------------------# + + def persist_load() + self.mode = 0 # Default restart mode (Off) + if persist.has("hf_mode") + self.mode = persist.find("hf_mode") + end + self.mode_persist = self.mode + end + + def persist_update() + if self.mode_persist != self.mode + persist.setmember("hf_mode", self.mode) + persist.save(true) + self.mode_persist = self.mode + end + end + + #-----------------------------------------------------------# + + def init() + self.version = "1.2.8" + self.persist_load() + self.teleperiod = 0 + self.mode_states = 6 # Number of modes (needs var as static doesn't work) + self.speed = 0 + self.temp_ext = 0 + self.last_temp_ext = 0 + self.dz_temp_ext = 0 + self.pwm_fan_change = -1 + self.hostname = tasmota.cmd('Hostname')['Hostname'] + + tasmota.log(f"HFN: HeatFan {self.version} started on {self.hostname}", 2) + + if global.heatfan_driver + global.heatfan_driver.stop() # Let previous instance bail out cleanly + end + tasmota.add_driver(global.heatfan_driver := self) + tasmota.add_rule("Analog#Range1", / value -> self.rule_range(value)) + end + + def stop() + tasmota.remove_driver(self) + tasmota.remove_rule("Analog#Range1") + end + + #-----------------------------------------------------------# + + def set_pin(pin, state) + if 2 == state + gpio.set_pwm(pin, self.power_states[state]) # Enable PWM and set low duty + else + gpio.pin_mode(pin, gpio.OUTPUT) # Disable PWM and set to Output + gpio.digital_write(pin, self.power_states[state]) # Off / On + end + end + + def set_power_handler(cmd, idx) + var ps = tasmota.get_power() + self.mode = 0 + for i:1..self.mode_states # Power1 to Power6 + self.set_pin(self.modes[i][4], 0) # Turn all leds Off + if ps[i -1] == true + self.mode = i + end + end + if self.mode + self.set_pin(self.modes[self.mode][4], 2) # Turn active mode led On + end + self.persist_update() + end + + def any_key(cmd, idx) + # idx = device_save << 24 | key << 16 | state << 8 | device + var state = (idx >> 8) & 0xff + if state == 10 # SINGLE + # Rotate power from off,1,2,3,4,5,6,off... + if self.mode == self.mode_states + tasmota.set_power(self.mode_states -1, false) # power offset from 0 + else + tasmota.set_power(self.mode, true) # power offset from 0 + end + end + end + + #------------------------------------------------------------ + Update fan speed based on temperature + Called almost every second by GetNextSensor() or at Teleperiod time + ------------------------------------------------------------# + def rule_range(value) + self.temp_ext = value + + if self.mode > 0 + var start_temp = self.modes[self.mode][0] + var max_temp = self.modes[self.mode][1] + var start_speed = self.modes[self.mode][2] + var max_speed = self.modes[self.mode][3] + + var speed = max_speed + var speeds = max_speed - start_speed # speeds = 0 .. 9 + if speeds > 0 + var temp_range = max_temp - start_temp # temp_range = 0 .. 99 + if temp_range > 0 + var temp_step = temp_range / speeds + speed = int((self.temp_ext - start_temp + temp_step) / temp_step) # 0 .. 10 + if speed < 0 speed = 0 end + if speed < self.speed + var speed_dn = int((self.temp_ext - start_temp + temp_step + 0.6) / temp_step) # 0 .. 10 + if speed_dn > speed + speed = speed_dn + end + end + if speed > max_speed speed = max_speed end + end + end + self.speed = speed + else + self.speed = 0 + end + + var pwm_fan = 0 + if self.speed > 0 + pwm_fan = 24 + (self.speed * 6) # 30% .. 84% + end + +# tasmota.log(f"HFN: Range1 {self.temp_ext}, Mode {self.mode}, Speeds {speeds}, Step {temp_step}, Speed {self.speed}, PwmFan {pwm_fan}", 3) + + if pwm_fan != self.pwm_fan_change + if pwm_fan > 0 + var duty = (1023 * pwm_fan) / 100 + gpio.set_pwm(9, duty) # Set fan speed + self.set_pin(6, 1) # GPIO_FANS_EN + else + self.set_pin(6, 0) # GPIO_FANS_EN + end + self.pwm_fan_change = pwm_fan + end + + if self.teleperiod == 1 # Needs to be executed here as tasmota.cmd destroys Response + self.SendToHa() + self.teleperiod = 0 + end + + end + + #------------------------------------------------------------ + Add sensor value to teleperiod + Called almost every second by GetNextSensor() or at Teleperiod time + ------------------------------------------------------------# + def json_append() + var msg = string.format(",\"HeatFan\":{\"Mode\":%i,\"Speed\":%i,\"Temperature\":%.2f}", + self.mode, self.speed, self.temp_ext) + tasmota.response_append(msg) + + if tasmota.global.tele_period == 0 + self.teleperiod = 1; + end + + end + + #------------------------------------------------------------ + Display sensor value in the web UI and react to button + Called every WebRefresh time + ------------------------------------------------------------# + def web_sensor() + var max_speed = 0 + if self.mode > 0 + max_speed = self.modes[self.mode][3] + end + var msg = string.format("{s}Radiator Temperature{m}%.2f °C{e}".. + "{s}Fan Speed{m}%i / %i{e}", + self.temp_ext, + self.speed, max_speed) + tasmota.web_send_decimal(msg) + + if webserver.has_arg("m_grp_send") + # Send current mode to group topic + if 0 == self.mode + tasmota.cmd("Publish cmnd/heatfans/Power0 0") + else + tasmota.cmd(f"Publish cmnd/heatfans/Power{self.mode} 1") + end + elif webserver.has_arg("m_grp_next") + # Rotate group topic mode from off,1,2,3,4,5,6,off... + if self.mode == self.mode_states + tasmota.cmd(f"Publish cmnd/heatfans/Power{self.mode_states} 0") + else + tasmota.cmd(f"Publish cmnd/heatfans/Power{self.mode +1} 1") + end + end + end + + def web_add_main_button() + webserver.content_send("") + webserver.content_send("") + webserver.content_send("") + webserver.content_send("
") + webserver.content_send(f"
HeatFan {self.version}
") + end + +end + +heatfan = heatfan_cls() + +tasmota.cmd("Interlock 1,2,3,4,5,6") # Interlock modes 1 to 6 +tasmota.cmd("Interlock 1") # Enable interlock +var mode = heatfan.mode # Save persitent mode +tasmota.set_power(0, true) # Set mode 1 to reset interlock on restart +# any_key() support cycling power from off,1,2,3,4,5,6,off... +tasmota.cmd("SO1 1") # (Button) Control button single press (1) +tasmota.cmd("SO13 1") # (Button) Support only single press (1) +tasmota.cmd("SO73 1") # (Button) Detach buttons from relays (1) +tasmota.cmd("SO146 1") # (ESP32) Show ESP32 internal temperature sensor +tasmota.cmd("SO161 1") # (GUI) Disable display of state text (1) +tasmota.cmd("PwmRange 1023") # Fan PWM duty cycle +tasmota.cmd("PwmFrequency 20000") # Fan PWM frequency to 20kHz +tasmota.cmd("webtime 11,19") # Enable GUI time HH:MM:SS +tasmota.cmd("websensor2 0") # Disable display of ADC information in GUI +tasmota.cmd("webrefresh 1000") # Update GUI every second +tasmota.cmd("Tempres 2") # ADC2/3 temperature resolution +tasmota.cmd("Freqres 2") # ADC1 Range resolution +tasmota.cmd("Teleperiod 60") # Update HA every minute +tasmota.cmd("AdcGpio0 400,1710,60,20") # ADC1 range + +if 0 == mode + tasmota.set_power(0, false) # Set mode 0 +else + tasmota.set_power(mode -1, true) # Set stored mode +end diff --git a/tasmota/berry/gpio_viewer/debug_panel.be b/tasmota/berry/gpio_viewer/debug_panel.be index 507dbb9c9..5594e98f1 100644 --- a/tasmota/berry/gpio_viewer/debug_panel.be +++ b/tasmota/berry/gpio_viewer/debug_panel.be @@ -21,7 +21,7 @@ class debug_panel var port var web var sampling_interval - var p1, p2 + var p1 static var SAMPLING = 100 static var HTML_HEAD1 = @@ -69,12 +69,12 @@ class debug_panel "" def init(port) + if (port == nil) port = 8887 end self.port = port self.web = webserver_async(port) self.sampling_interval = self.SAMPLING self.p1 = bytes(100) - self.p2 = bytes(100) self.web.set_chunked(true) self.web.set_cors(true) @@ -136,7 +136,6 @@ class debug_panel end var payload1 = self.app.p1 - var payload2 = self.app.p2 var server = self.cnx.server if cnx.buf_out_empty() # if out buffer is not empty, do not send any new information @@ -144,11 +143,9 @@ class debug_panel # send free heap payload1.clear() payload1 .. "id:" - server.bytes_format_int(payload2, tasmota.millis()) - payload1 .. payload2 + server.bytes_append_int(payload1, tasmota.millis()) payload1 .. "\r\nevent:free_heap\r\ndata:" - server.bytes_format_int(payload2, tasmota.memory('heap_free'), '---') - payload1 .. payload2 + server.bytes_append_int(payload1, tasmota.memory('heap_free'), '---') payload1 .. " KB\r\n\r\n" # payload = f"id:{tasmota.millis()}\r\n" # "event:free_heap\r\n" @@ -158,11 +155,9 @@ class debug_panel # send wifi rssi payload1.clear() payload1 .. "id:" - server.bytes_format_int(payload2, tasmota.millis()) - payload1 .. payload2 + server.bytes_append_int(payload1, tasmota.millis()) payload1 .. "\r\nevent:wifi_rssi\r\ndata:" - server.bytes_format_int(payload2, tasmota.wifi('quality'), '--') - payload1 .. payload2 + server.bytes_append_int(payload1, tasmota.wifi('quality'), '--') payload1 .. "%\r\n\r\n" # payload = f"id:{tasmota.millis()}\r\n" @@ -219,7 +214,7 @@ end return debug_panel # if tasmota -# global.debug_panel = Debug_panel(8887) +# global.debug_panel = debug_panel(8887) # end # return global.debug_panel diff --git a/tasmota/berry/haspmota/roboto.ttf b/tasmota/berry/haspmota/roboto.ttf new file mode 100644 index 000000000..74f029c7c Binary files /dev/null and b/tasmota/berry/haspmota/roboto.ttf differ diff --git a/tasmota/berry/include/be_gpio_defines.h b/tasmota/berry/include/be_gpio_defines.h index 9b9880872..fc868e6d5 100644 --- a/tasmota/berry/include/be_gpio_defines.h +++ b/tasmota/berry/include/be_gpio_defines.h @@ -50,6 +50,8 @@ const be_const_member_t lv_gpio_constants[] = { { "BS814_DAT", (int32_t) GPIO_BS814_DAT }, { "BUZZER", (int32_t) GPIO_BUZZER }, { "BUZZER_INV", (int32_t) GPIO_BUZZER_INV }, + { "C8_CO2_5K_TX", (int32_t) GPIO_C8_CO2_5K_TX }, + { "C8_CO2_5K_RX", (int32_t) GPIO_C8_CO2_5K_RX }, { "CC1101_GDO0", (int32_t) GPIO_CC1101_GDO0 }, { "CC1101_GDO2", (int32_t) GPIO_CC1101_GDO2 }, { "CHANGE", CHANGE }, diff --git a/tasmota/berry/leds_panel/leds_panel.be b/tasmota/berry/leds_panel/leds_panel.be new file mode 100644 index 000000000..81bf5ed03 --- /dev/null +++ b/tasmota/berry/leds_panel/leds_panel.be @@ -0,0 +1,963 @@ +# +# leds_panel.be - implements a real-time mirroring of the WS2812 leds on the main page +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# make sure we use `webserver_async` if it's already solidified +if !global.contains("webserver_async") || type(global.webserver_async) != 'class' + class webserver_async + ############################################################# + # class webserver_async_cnx + # + # This instance represents an active connection between + # the server and a client (TCP connection) + ############################################################# + static class webserver_async_cnx + var server # link to server object + var cnx # holds the tcpclientasync instance + var close_after_send # if true, close after we finished sending the out_buffer + var fastloop_cb # cb for fastloop + var buf_in # incoming buffer + var buf_in_offset + var buf_out + var phase # parsing phase: 0/ status line, 1/ headers, 2/ payload + # request + var req_verb # verb for request (we support only GET) + var req_uri # URI for request + var req_version # HTTP version for request + var header_host # 'Host' header - useful for redirections + # response + var resp_headers # (string) aggregate headers + var chunked # if true enable chunked encoding (default true) + # conversion + static var CODE_TO_STRING = { + # 100: "Continue", + 200: "OK", + # 204: "No Content", + 301: "Moved Permanently", + # 400: "Bad Request", + # 401: "Unauthorized", + # 403: "Payment Required", # not sure it's useful in Tasmota context + 404: "Not Found", + 500: "Internal Server Error", + # 501: "Not Implemented" + } + + ############################################################# + # init + # + # Called when a new connection is received from a client + # Arg: + # - server : main instance of `webserver_async` server + # - cnx : instance of `tcpclientasync` + # + # By default: + # version is HTTP/1.1 + # response is chunked-encoded + def init(server, cnx) + self.server = server + self.cnx = cnx + self.buf_in = '' + self.buf_in_offset = 0 + self.buf_out = bytes() + self.phase = 0 # 0 = status line + # util + self.close_after_send = false + # response + self.resp_headers = '' + self.chunked = true + # register cb + self.fastloop_cb = def () self.loop() end # the closure needs to be kept, to allow removal of fast_loop later + tasmota.add_fast_loop(self.fastloop_cb) + end + + ############################################################# + # set_chunked: sets whether the response is chunked encoded + # true by default + # + def set_chunked(chunked) + self.chunked = bool(chunked) + end + + ############################################################# + # connected: returns `true` if the connection is still open + # + def connected() + return self.cnx ? self.cnx.connected() : false + end + + ############################################################# + # buf_out_empty: returns `true` if out buffer is empty, + # i.e. all content was sent to client + # + def buf_out_empty() + return size(self.buf_out) == 0 + end + + ############################################################# + # _write: (internal method) write bytes + # + # Arg: + # v must be bytes() + # + def _write(v) + var sz_v = size(v) + if (sz_v == 0) return end # do nothing if empty content + + var buf_out = self.buf_out # keep a copy of reference in local variable (avoids multiple dereferencing) + var buf_out_sz = size(buf_out) + buf_out.resize(buf_out_sz + sz_v) + buf_out.setbytes(buf_out_sz, v) + + self._send() # try sending `self.buf_out` now + end + + ############################################################# + # close: close the connection to client + # + # Can be called multiple times + # Does nothing if connection is already closed + # + def close() + # log(f"WEB: closing cnx", 3) + if (self.cnx != nil) self.cnx.close() end + self.cnx = nil + end + + ############################################################# + # loop: called by fastloop every 5 ms + # + def loop() + if self.cnx == nil # if connection is closed, this instance is marked for deletion + tasmota.remove_fast_loop(self.fastloop_cb) # remove from fast_loop + self.fastloop_cb = nil # fastloop_cb can be garbage collected + return + end + + self._send() # try sending any pending output data + + var cnx = self.cnx # keep copy + if (cnx == nil) return end # it's possible that it was closed after _send() + + # any new incoming data received? + if cnx.available() > 0 + var buf_in_new = cnx.read() # read bytes() object + if (!self.buf_in) # use the same instance if none present + self.buf_in = buf_in_new + else # or append to current incoming buffer + self.buf_in += buf_in_new + end + end + + # parse incoming data if any + if (self.buf_in) + self.parse() + end + end + + ############################################################# + # _send: (internal method) try sending pendin data out + # + # the content is in `self.buf_out` + # + def _send() + # any data waiting to go out? + var cnx = self.cnx + if (cnx == nil) return end # abort if connection is closed + + var buf_out = self.buf_out # keep reference in local variable + if size(buf_out) > 0 + if cnx.listening() # is the client ready to receive? + var sent = cnx.write(buf_out) # send the buffer, `sent` contains the number of bytes actually sent + if sent > 0 # did we succeed in sending anything? + # we did sent something + if sent >= size(buf_out) # the entire buffer was sent, clear it + # all sent + self.buf_out.clear() + else # buffer was sent partially, remove what was sent from `out_buf` + # remove the first bytes already sent + self.buf_out.setbytes(0, buf_out, sent) # copy to index 0 (start of buffer), content from the same buffer starting at offset 'sent' + self.buf_out.resize(size(buf_out) - sent) # shrink buffer + end + end + end + else + # empty buffer, do the cleaning + # self.buf_out.clear() # TODO not needed? + # self.buf_in_offset = 0 # TODO really useful? + + if self.close_after_send # close connection if we have sent everything + self.close() + end + end + end + + ############################################################# + # parse incoming + # + # pre: self.buf_in is not empty + # post: self.buf_in has made progress (smaller or '') + def parse() + # log(f"WEB: incoming {bytes().fromstring(self.buf_in).tohex()}", 3) + if self.phase == 0 + self.parse_http_req_line() + elif self.phase == 1 + self.parse_http_headers() + elif self.phase == 2 + self.parse_http_payload() + end + end + + ############################################################# + # parse incoming request + # + # pre: self.buf_in is not empty + # post: self.buf_in has made progress (smaller or '') + def parse_http_req_line() + var m = global._re_http_srv.match2(self.buf_in, self.buf_in_offset) + # Ex: "GET / HTTP/1.1\r\n" + if m + var offset = m[0] + self.req_verb = m[1] # GET/POST... + self.req_uri = m[2] # / + self.req_version = m[3] # "1.0" or "1.1" + self.phase = 1 # proceed to parsing headers + self.buf_in = self.buf_in[offset .. ] # remove what we parsed + if tasmota.loglevel(4) + log(f"WEB: HTTP verb: {self.req_verb} URI: '{self.req_uri}' Version:{self.req_version}", 4) + end + self.parse_http_headers() + elif size(self.buf_in) > 100 # if no match and we still have 100 bytes, then it fails + log("WEB: error invalid request", 4) + self.close() + self.buf_in = '' + end + end + + ############################################################# + # parse incoming headers + def parse_http_headers() + while true + # print("parse_http_headers", "self.buf_in_offset=", self.buf_in_offset) + var m = global._re_http_srv_header.match2(self.buf_in, self.buf_in_offset) + # print("m=", m) + # Ex: [32, 'Content-Type', 'application/json'] + if m + self.event_http_header(m[1], m[2]) + self.buf_in_offset += m[0] + else # no more headers + var m2 = global._re_http_srv_body.match2(self.buf_in, self.buf_in_offset) + if m2 + # end of headers + # we keep \r\n which is used by pattern + self.buf_in = self.buf_in[self.buf_in_offset + m2[0] .. ] # truncate + self.buf_in_offset = 0 + + # self.event_http_headers_end() # no more headers + self.phase = 2 + self.parse_http_payload() # continue to parsing payload + end + if size(self.buf_in) > 1024 # we don't accept a single header larger than 1KB + log("WEB: error header is bigger than 1KB", 4) + self.close() + self.buf_in = '' + end + return + end + end + + end + + ############################################################# + # event_http_header: method called for each header received + # + # Default implementation only stores "Host" header + # and ignores all other headers + # + # Args: + # header_key: string + # header_value: string + # + def event_http_header(header_key, header_value) + # log(f"WEB: header key '{header_key}' = '{header_value}'") + + if (header_key == "Host") + self.header_host = header_value + end + end + + ############################################################# + # event_http_headers_end: called afte all headers are received + # + # By default does nothing + # + # def event_http_headers_end() + # end + + ############################################################# + # parse incoming payload (if any) + # + # Calls the server's dispatcher with 'verb' and 'uri' + # + # Payload is in `self.buf_in` + # + def parse_http_payload() + # log(f"WEB: parsing payload '{bytes().fromstring(self.buf_in).tohex()}'") + # dispatch request before parsing payload + self.server.dispatch(self, self.req_uri, self.req_verb) + end + + + ############################################################# + # Responses + ############################################################# + # send_header: add header to the response + # + # Args: + # name: key of header + # value: value of header + # first: if 'true' prepend, or append if 'false' + def send_header(name, value, first) + if first + self.resp_headers = f"{name}: {value}\r\n{self.resp_headers}" + else + self.resp_headers = f"{self.resp_headers}{name}: {value}\r\n" + end + end + + ############################################################# + # send: send response to client + # + # Args + # code: (int) http code (ex: 200) + # content_type: (string, opt) MIME type, "text/html" if not specified + # content: (bytes or string, opt) first content to send to client (you can send more later) + # + def send(code, content_type, content) + var response = f"HTTP/1.1 {code} {self.CODE_TO_STRING.find(code, 'UNKNOWN')}\r\n" + self.send_header("Content-Type", content_type ? content_type : "text/html", true) + + self.send_header("Accept-Ranges", "none") + # chunked encoding? + if self.chunked + self.send_header("Transfer-Encoding", "chunked") + end + # cors? + if self.server.cors + self.send_header("Access-Control-Allow-Origin", "*") + self.send_header("Access-Control-Allow-Methods", "*") + self.send_header("Access-Control-Allow-Headers", "*") + end + # others + self.send_header("Connection", "close") + + response += self.resp_headers + response += "\r\n" + self.resp_headers = nil + + # send status-line and headers + self.write_raw(response) + + # send first part of content + if (content) self.write(content) end + end + + ############################################################# + # write: writes a bytes or string piece of content + # + # If chunked encoding is enabled, it is sent as a separate chunk + # + # If content is empty, it can be sent as an empty chunk + # which is an indicator of end-of-content + # + def write(v) + if type(v) == 'string' # if string, convert to bytes + v = bytes().fromstring(v) + end + + # use chunk encoding + if self.chunked + var p1 = self.server.p1 + p1.clear() + p1.append(f"{size(v):X}\r\n") + p1.append(v) + p1.append("\r\n") + + # log(f"WEB: sending chunk '{p1.tohex()}'") + self._write(p1) + else + self._write(v) + end + end + + ############################################################# + # write_raw: low-level write of string or bytes (without chunk encoding) + # + # If content is empty, nothing is sent + # + def write_raw(v) + if (size(v) == 0) return end + + if type(v) == 'string' # if string, convert to bytes + v = bytes().fromstring(v) + end + + self._write(v) + end + + ############################################################# + # content_stop: signal that the response is finished + # + def content_stop() + self.write('') # send 'end-of-content' for chunked encoding + self.close_after_send = true # close connection when everything was sent to client + end + end + + ####################################################################### + # class webserver_async_dispatcher + # + # Pre-register callbacks triggered when a certain URL is accessed + # + # You can register either a pure function or a method and an instance + # + # Pure function: + # webserver_async_dispatcher(uri_prefix, nil, func, verb) + # will call: + # func(cnx, uri, verb) + # + # Instance and method: + # webserver_async_dispatcher(uri_prefix, instance, method, verb) + # will call: + # insatnce.method(cnx, uri, verb) + # + # Args in: + # uri_prefix: prefix string for matchin URI, must start with '/' + # cb_obj: 'nil' for pure function or instance from which we call a method + # cb_mth: pure function or method to call + # verb: verb to match, only supported: 'GET' or 'nil' for any + # + # Args of callback: + # cnx: instance of 'webserver_async_cnx' for the current connection + # uri: full uri of request + # verb: verb received (currently only GET is supported) + ####################################################################### + static class webserver_async_dispatcher + var uri_prefix # prefix string, must start with '/' + var verb # verb to match, or nil for ANY + var cb_obj # callback object (sent as first argument if not 'nil') + var cb_mth # callback function + + def init(uri_prefix, cb_obj, cb_mth, verb) + self.uri_prefix = uri_prefix + self.cb_obj = cb_obj + self.cb_mth = cb_mth + self.verb = verb + end + + # return true if matched + def dispatch(cnx, uri, verb) + import string + if string.find(uri, self.uri_prefix) == 0 + var match = false + if (self.verb == nil) || (self.verb == verb) + # method is valid + var cb_obj = self.cb_obj + if (cb_obj != nil) + self.cb_mth(self.cb_obj, cnx, uri, verb) + else + self.cb_mth(cnx, uri, verb) + end + return true + end + end + return false + end + end + + ############################################################# + # class webserver_async + # + # This is the main class to call + ############################################################# + var local_port # listening port, 80 is already used by Tasmota + var server # instance of `tcpserver` + var fastloop_cb # closure used by fastloop + # var timeout # default timeout for tcp connection + var connections # list of active connections + # var auth # web authentication string (Basic Auth) or `nil`, in format `user:password` as bade64 + # var cmd # GET url command + var dispatchers + # copied in each connection + var chunked # if true enable chunked encoding (default true) + var cors # if true send CORS headers (default false) + # + var p1 # temporary object bytes() to avoid reallocation + + # static var TIMEOUT = 1000 # default timeout: 1000ms + # static var HTTP_REQ = "^(\\w+) (\\S+) HTTP\\/(\\d\\.\\d)\r\n" + # static var HTTP_HEADER_REGEX = "([A-Za-z0-9-]+): (.*?)\r\n" # extract a header with its 2 parts + # static var HTTP_BODY_REGEX = "\r\n" # end of headers + + ############################################################# + # init + def init(port, timeout) + # if (timeout == nil) timeout = self.TIMEOUT end + # if (timeout == nil) timeout = 1000 end + self.connections = [] + self.dispatchers = [] + self.server = tcpserver(port) # throws an exception if port is not available + self.chunked = true + self.cors = false + self.p1 = bytes(100) # reserve 100 bytes by default + # TODO what about max_clients ? + self.compile_re() + # register cb + tasmota.add_driver(self) + self.fastloop_cb = def () self.loop() end + tasmota.add_fast_loop(self.fastloop_cb) + end + + ############################################################# + # compile once for all the regex + def compile_re() + import re + if !global.contains("_re_http_srv") + # global._re_http_srv = re.compile(self.HTTP_REQ) + # global._re_http_srv_header = re.compile(self.HTTP_HEADER_REGEX) + # global._re_http_srv_body = re.compile(self.HTTP_BODY_REGEX) + global._re_http_srv = re.compile("^(\\w+) (\\S+) HTTP\\/(\\d\\.\\d)\r\n") + global._re_http_srv_header = re.compile("([A-Za-z0-9-]+): (.*?)\r\n") + global._re_http_srv_body = re.compile("\r\n") + end + end + + ############################################################# + # enable or disable chunked mode (enabled by default) + def set_chunked(chunked) + self.chunked = bool(chunked) + end + + ############################################################# + # enable or disable CORS mode (enabled by default) + def set_cors(cors) + self.cors = bool(cors) + end + + ############################################################# + # Helper function to encode integer as hex (uppercase) + static def bytes_format_hex(b, i, default) + b.clear() + if (i == nil) b .. default return end + # sanity check + if (i < 0) i = -i end + if (i < 0) return end # special case for MININT + if (i == 0) b.resize(1) b[0] = 0x30 return end # return bytes("30") + + b.resize(8) + var len = 0 + while i > 0 + var digit = i & 0x0F + if (digit < 10) + b[len] = 0x30 + digit + else + b[len] = 0x37 + digit # 0x37 = 0x41 ('A') - 10 + end + len += 1 + i = (i >> 4) + end + # reverse order + b.resize(len) + b.reverse() + end + + ############################################################# + # Helper function to encode integer as int + static def bytes_append_int(b, i, default) + var sz = size(b) + if (i == 0) # just append '0' + b.resize(sz + 1) + b[sz] = 0x30 + elif (i != nil) # we have a non-zero value + var negative = false + # sanity check + if (i < 0) i = -i negative = true end + if (i < 0) return b end # special case for MININT + + if negative + b.resize(sz + 1) + b[sz] = 0x2D + sz += 1 + end + + var start = sz + while i > 0 + var digit = i % 10 + b.resize(sz + 1) + b[sz] = 0x30 + digit + sz += 1 + i = (i / 10) + end + # reverse order starting where the integer is + b.reverse(start) + + else # i is `nil`, append default + b.append(default) + end + return b + end + + ############################################################# + # closing web server + def close() + tasmota.remove_driver(self) + tasmota.remove_fast_loop(self.fastloop_cb) + self.fastloop_cb = nil + self.server.close() + + # close all active connections + for cnx: self.connections + cnx.close() + end + self.connections = nil # and free memory + end + + ############################################################# + # clean connections + # + # Remove any connections that is closed or in error + def clean_connections() + var idx = 0 + while idx < size(self.connections) + var cnx = self.connections[idx] + # remove if not connected + if !cnx.connected() + # log("WEB: does not appear to be connected") + cnx.close() + self.connections.remove(idx) + else + idx += 1 + end + end + end + + ############################################################# + # called by fastloop + def loop() + self.clean_connections() + # check if any incoming connection + while self.server.hasclient() + # retrieve new client + var cnx = self.webserver_async_cnx(self, self.server.acceptasync()) + cnx.set_chunked(self.chunked) + self.connections.push(cnx) + end + end + + ############################################################# + # add to dispatcher + def on(prefix, obj, mth, verb) + var dispatcher = self.webserver_async_dispatcher(prefix, obj, mth, verb) + self.dispatchers.push(dispatcher) + end + + ############################################################# + # add to dispatcher + def dispatch(cnx, uri, verb) + var idx = 0 + while idx < size(self.dispatchers) + if (self.dispatchers[idx].dispatch(cnx, uri, verb)) + return + end + idx += 1 + end + # fallback unsupported request + cnx.send(500, "text/plain") + cnx.write("Unsupported") + cnx.content_stop() + end + + end + + # assign the class to a global + global.webserver_async = webserver_async +end + +class leds_panel + var port + var web + var sampling_interval + var p1, p_leds + var strip # strip object + var h, w, cell_size, cell_space + + static var SAMPLING = 100 + static var PORT = 8886 # default port 8886 + static var HTML_HEAD1 = + "" + static var HTML_URL_F = + "" + static var HTML_HEAD2 = + '' + '' + '' + '' + static var HTML_CONTENT = + '' + '' + '' + '' + '
' + '' + '
' + static var HTML_END = + '' + '' + + def init(port) + import gpio + if !gpio.pin_used(gpio.WS2812, 0) + log("LED: no leds configured, can't start leds_panel", 3) + return + end + if (port == nil) port = self.PORT end + self.port = port + self.web = global.webserver_async(port) + self.sampling_interval = self.SAMPLING + + self.strip = Leds() + self.p1 = bytes(100) + self.p_leds = self.strip.pixels_buffer() + + self.web.set_chunked(true) + self.web.set_cors(true) + self.web.on("/leds_feed", self, self.send_info_feed) # feed with leds values + self.web.on("/leds", self, self.send_info_page) # display leds page + + tasmota.add_driver(self) + end + + def close() + tasmota.remove_driver(self) + self.web.close() + end + + def update() + self.p_leds = self.strip.pixels_buffer(self.p_leds) # update buffer + self.h = tasmota.settings.light_pixels_height_1 + 1 + self.w = self.strip.pixel_count() / (tasmota.settings.light_pixels_height_1 + 1) + self.cell_size = tasmota.int(330 / self.w, 4, 25) + self.cell_space = (self.cell_size <= 6) ? 1 : 2 + end + + def send_info_page(cnx, uri, verb) + import string + + self.update() + var host = cnx.header_host + var host_split = string.split(host, ':') # need to make it stronger + var ip = host_split[0] + var port = 80 + if size(host_split) > 1 + port = int(host_split[1]) + end + + cnx.send(200, "text/html") + cnx.write(self.HTML_HEAD1) + cnx.write(format(self.HTML_URL_F, ip, port)) + cnx.write(self.HTML_HEAD2) + cnx.write(self.HTML_CONTENT) + cnx.write(self.HTML_END) + + cnx.content_stop() + end + + static class feeder + var app # overarching app (debug_panel) + var cnx # connection object + + def init(app, cnx) + self.app = app + self.cnx = cnx + tasmota.add_driver(self) + end + + def close() + tasmota.remove_driver(self) + end + + def every_100ms() + self.send_feed() + end + + def send_feed() + var cnx = self.cnx + if !cnx.connected() + self.close() + return + end + + var server = self.cnx.server + if cnx.buf_out_empty() + # if out buffer is not empty, do not send any new information + var app = self.app + app.update() + var payload1 = app.p1 + var p_leds = app.p_leds + + payload1.clear() + payload1 .. "id:" + server.bytes_append_int(payload1, tasmota.millis()) + payload1 .. "\r\nevent:leds\r\ndata:" + + payload1 .. '{"w":' + server.bytes_append_int(payload1, app.w) + payload1 .. ',"h":' + server.bytes_append_int(payload1, app.h) + payload1 .. ',"clsz":' + server.bytes_append_int(payload1, app.cell_size) + payload1 .. ',"clsp":' + server.bytes_append_int(payload1, app.cell_space) + payload1 .. ',"rev":' + server.bytes_append_int(payload1, tasmota.settings.light_pixels_reverse) + payload1 .. ',"alt":' + server.bytes_append_int(payload1, tasmota.settings.light_pixels_alternate) + payload1 .. ',"hex":"' + payload1.appendhex(p_leds) + payload1 .. '"}\r\n\r\n' + cnx.write(payload1) + end + end + + end + + def send_info_feed(cnx, uri, verb) + cnx.set_chunked(false) # no chunking since we use EventSource + cnx.send(200, "text/event-stream") + # + var feed = feeder(self, cnx) + feed.send_feed() # send first values immediately + end + + def web_add_main_button() + self.send_iframe_code() + end + + def send_iframe_code() + import webserver + self.update() + var ip = tasmota.wifi().find('ip') + if (ip == nil) + ip = tasmota.eth().find('ip') + end + if (ip != nil) + var height = self.h * self.cell_size + 10 + webserver.content_send( + f'' + '' + '
 Leds mirroring ' + '' + '
' + '' + '' + '
' + ) + end + end + +end + +return leds_panel() diff --git a/tasmota/berry/leds_panel/leds_panel.bec b/tasmota/berry/leds_panel/leds_panel.bec new file mode 100644 index 000000000..bc03ef151 Binary files /dev/null and b/tasmota/berry/leds_panel/leds_panel.bec differ diff --git a/tasmota/berry/modules/Antiburn.tapp b/tasmota/berry/modules/Antiburn.tapp index 19e043e5c..18885399c 100644 Binary files a/tasmota/berry/modules/Antiburn.tapp and b/tasmota/berry/modules/Antiburn.tapp differ diff --git a/tasmota/berry/modules/Partition_Wizard.tapp b/tasmota/berry/modules/Partition_Wizard.tapp index 278ba857c..0628cb2c1 100644 Binary files a/tasmota/berry/modules/Partition_Wizard.tapp and b/tasmota/berry/modules/Partition_Wizard.tapp differ diff --git a/tasmota/berry/modules/Partition_Wizard/partition_wizard.be b/tasmota/berry/modules/Partition_Wizard/partition_wizard.be index e9555286b..3d50f4e51 100644 --- a/tasmota/berry/modules/Partition_Wizard/partition_wizard.be +++ b/tasmota/berry/modules/Partition_Wizard/partition_wizard.be @@ -266,7 +266,7 @@ class Partition_wizard_UI if max_fs_start_k > 0 && fs_max_size_k > 64 webserver.content_send("
 Resize FS 

") - webserver.content_send("

You can expand of shrink the file system.
Its content will be lost.

") + webserver.content_send("

You can expand or shrink the file system.
Its content will be lost.

") webserver.content_send("
") diff --git a/tasmota/berry/modules/Partition_Wizard/partition_wizard.bec b/tasmota/berry/modules/Partition_Wizard/partition_wizard.bec index 1a77a823c..f56631040 100644 Binary files a/tasmota/berry/modules/Partition_Wizard/partition_wizard.bec and b/tasmota/berry/modules/Partition_Wizard/partition_wizard.bec differ diff --git a/tasmota/berry/modules/antiburn/autoexec.be b/tasmota/berry/modules/antiburn/autoexec.be index 5f2c15c75..d63f876c6 100644 --- a/tasmota/berry/modules/antiburn/autoexec.be +++ b/tasmota/berry/modules/antiburn/autoexec.be @@ -1,5 +1,6 @@ # Register the command 'Antiburn' # Module loaded in memory only when the command is first used +# rm Antiburn.tapp; zip Antiburn.tapp -j -0 antiburn/* var wd = tasmota.wd diff --git a/tasmota/berry/twai_examples/calenta.be b/tasmota/berry/twai_examples/calenta.be new file mode 100644 index 000000000..98db3f23a --- /dev/null +++ b/tasmota/berry/twai_examples/calenta.be @@ -0,0 +1,192 @@ +# +# class `twai` +# +# When loaded by `preinit.be` it wil: +# - configure TWAI/CAN driver speed and mode when enabled by GPIOs `TWAI Tx` and `TWAI Rx` +# - decode known Remeha Calenta Ace boiler codes +# - send every second changed values to Domoticz Idx +# - provide JSON message at teleperiod time +# - update GUI +# + +class twai_cls + var active, first_teleperiod, pressure_next # (bool, bool, bool) + var ch_active, dz_ch_active # (bool, bool) + var dhw_active, dz_dhw_active # (bool, bool) + var pump_active, dz_pump_active # (bool, bool) + var twai_speed, twai_mode # (int, int) + var am012_status, dz_am012_status # (int, int) + var am014_substatus, dz_am014_substatus # (int, int) + var am024_power # (int) + var pressure, dz_pressure # (float, float) + var flow_temp, dz_flow_temp # (float, float) + var setpoint_temp, dz_setpoint_temp # (float, float) + + def init() + self.twai_speed = 7 # 0 = 25K, 1 = 50K, 2 = 100K, 3 = 125K, 4 = 250K, 5 = 500K, 6 = 800K, 7 = 1Mbits + self.twai_mode = 2 # 0 = TWAI_MODE_NORMAL, 1 = TWAI_MODE_NO_ACK, 2 = TWAI_MODE_LISTEN_ONLY + self.active = 0 + self.first_teleperiod = 0 + self.am012_status = 0 + self.dz_am012_status = 0 + self.am014_substatus = 0 + self.dz_am014_substatus = 0 + self.am024_power = 0 + self.pressure_next = 0 + self.pressure = 0 + self.dz_pressure = 0 + self.setpoint_temp = 0 + self.dz_setpoint_temp = 0 + self.flow_temp = 0 + self.dz_flow_temp = 0 + self.ch_active = 0 + self.dz_ch_active = 0 + self.dhw_active = 0 + self.dz_dhw_active = 0 + self.pump_active = 0 + self.dz_pump_active = 0 + end + + #---------------------------------------------------------------------------------------------- + Allow TWAI driver configuration on restart (if this file is installed by preinit.be) + ----------------------------------------------------------------------------------------------# + def config(bus) +# if bus != 1 return nil end # Exit if not my bus + return self.twai_mode << 3 | self.twai_speed # Initial configure TWAI driver + end + + #---------------------------------------------------------------------------------------------- + Decodes Remeha Calenta Ace CAN-bus messages + ----------------------------------------------------------------------------------------------# + def decode(param, ident, data1, data2) + var bus = param & 0xF # Bus number (1..3) +# if bus != 1 return nil end # Exit if not my bus + var len = param >> 4 & 0xF # Number of data bytes (0..8) + var extended = ident >> 31 & 0x1 # Extended identifier flag (0..1) + if extended == 1 return nil end # Remeha uses 11-bit Standard Frame Format + var id = ident & 0x1fffffff + if id == 0x076 # Incremental counter from 0 to 255 + # 13:27:59.485 TWA: Bus1 param 00000011, ident 00000076, data1 00000029, data2 00000000 +# tasmota.log(f"RMH: 0x{id:03x} Count {data1}", 3) +# elif id == 0x080 # Heartbeat every second + # 13:28:00.115 TWA: Bus1 param 00000001, ident 00000080, data1 00000000, data2 00000000 + elif id == 0x100 # Date and Time + # 13:28:05.977 TWA: Bus1 param 00000061, ident 00000100, data1 02E3D288, data2 00003A82 + var epoch = 441763200 + (data2 * 24 * 60 * 60) + (data1 / 1000) +# tasmota.log(f"RMH: 0x{id:03x} Time {tasmota.time_str(epoch)}", 3) + elif id == 0x1C1 # Many different data1/2 + if data1 & 0x00ffffff == 0x503f41 # Next time it's pressure + # 13:28:01.981 TWA: Bus1 param 00000081, ident 000001C1, data1 00503F41, data2 00000028 + self.pressure_next = 1 + elif self.pressure_next == 1 + # 13:28:01.983 TWA: Bus1 param 00000081, ident 000001C1, data1 21012300, data2 16EE1909 + self.pressure = (data2 & 0xff00)/2560.0 # This must be pressure + self.pressure_next = 0 + end + elif id == 0x382 + # 13:28:00.140 TWA: Bus1 param 00000081, ident 00000382, data1 0716BC64, data2 00FFFFFF + self.am024_power = data1 & 0xff # Relative power + self.setpoint_temp = (data1 & 0xffff00)/25600.0 # Setpoint +# tasmota.log(f"RMH: 0x{id:03x} Busy {self.am024_power}%, Setpoint {self.setpoint_temp}", 3) + elif id == 0x282 + # 13:28:00.141 TWA: Bus1 param 00000051, ident 00000282, data1 1B16EE01, data2 00000000 + self.flow_temp = (data1 & 0xffff00)/25600.0 +# tasmota.log(f"RMH: 0x{id:03x} DHW temp {self.flow_temp}", 3) + elif id == 0x481 # Status information + # 13:28:00.561 TWA: Bus1 param 00000071, ident 00000481, data1 FFFF1E03, data2 002101FF + self.am012_status = data1 & 0xff + self.am014_substatus = (data1 >> 8) &0xff + self.dhw_active = (data2 >> 20) &1 + self.ch_active = (data2 >> 21) &1 + self.pump_active = (data2 >> 16) &1 +# elif id == 0x7E5 # Heartbeat every 2 seconds + # 13:27:57.515 TWA: Bus1 param 00000081, ident 000007E5, data1 00000B51, data2 00008000 + else + return + end + self.active = 1 # At least one valid decode + end + + #---------------------------------------------------------------------------------------------- + Send changed values to Domoticz every second + + As many datagrams can occur sending at teleperiod time takes too long + Also only send if changed to reduce TWAI wait time + ----------------------------------------------------------------------------------------------# + def every_second() + if !self.first_teleperiod return nil end # Exit if there is no MQTT connection + + if self.dz_pressure != self.pressure # Pressure + self.dzsend(1, 523, self.pressure) + end + self.dz_pressure = self.pressure + + if self.dz_setpoint_temp != self.setpoint_temp # Setpoint temp + self.dzsend(1, 525, self.setpoint_temp) + end + self.dz_setpoint_temp = self.setpoint_temp + + if self.dz_flow_temp != self.flow_temp # Flow temp + self.dzsend(1, 526, self.flow_temp) + end + self.dz_flow_temp = self.flow_temp + + if self.dz_am012_status != self.am012_status # Status + self.dzsend(1, 536, self.am012_status) + end + self.dz_am012_status = self.am012_status + + if self.dz_am014_substatus != self.am014_substatus # Substatus + self.dzsend(1, 537, self.am014_substatus) + end + self.dz_am014_substatus = self.am014_substatus + + if self.dz_dhw_active != self.dhw_active # Domestic Hot Water active + self.dzsend(3, 552, self.dhw_active) + end + self.dz_dhw_active = self.dhw_active + + if self.dz_ch_active != self.ch_active # Central Heating active + self.dzsend(3, 553, self.ch_active) + end + self.dz_ch_active = self.ch_active + end + + def dzsend(option, domoticz_idx, value) + tasmota.cmd('_DzSend' .. option .. ' ' .. domoticz_idx .. ',' .. value) +# tasmota.cmd('Fake' .. option .. ' ' .. domoticz_idx .. ',' .. value) + end + + #---------------------------------------------------------------------------------------------- + Add sensor value to teleperiod + ----------------------------------------------------------------------------------------------# + def json_append() + if !self.active return nil end # Exit if never decoded something + import string + var msg = string.format(",\"Calenta\":{\"AM012\":%i,\"AM014\":%i,\"Pressure\":%.1f,\"Setpoint\":%.1f,\"Flow\":%.1f}", + self.am012_status, self.am014_substatus, self.pressure, self.setpoint_temp, self.flow_temp) + tasmota.response_append(msg) + self.first_teleperiod = 1 + end + + #---------------------------------------------------------------------------------------------- + Display sensor value in the web UI + ----------------------------------------------------------------------------------------------# + def web_sensor() + if !self.active return nil end # Exit if never decoded something + import string + var msg = string.format("{s}CH / DHW Active{m}%i / %i{e}".. + "{s}AM012 / AM014 State{m}%i / %i{e}".. + "{s}AM024 Relative Power{m}%i %%{e}".. + "{s}Pressure{m}%.1f{e}".. + "{s}Setpoint Temperature{m}%.1f{e}".. + "{s}Flow Temperature{m}%.1f{e}", + self.ch_active, self.dhw_active, + self.am012_status, self.am014_substatus, + self.am024_power, self.pressure, self.setpoint_temp, self.flow_temp) + tasmota.web_send_decimal(msg) + end +end + +twai = twai_cls() +tasmota.add_driver(twai) \ No newline at end of file diff --git a/tasmota/displaydesc/ST7789_172x320_Waveshare_esp32c6_lcd_1_47.ini b/tasmota/displaydesc/ST7789_172x320_Waveshare_esp32c6_lcd_1_47.ini new file mode 100644 index 000000000..70f8610ad --- /dev/null +++ b/tasmota/displaydesc/ST7789_172x320_Waveshare_esp32c6_lcd_1_47.ini @@ -0,0 +1,21 @@ +:H,ST7789,172,320,16,SPI,1,*,*,*,*,*,*,*,40 +:S,2,1,3,0,80,30 +:B,80,0 +:I +01,A0 +11,A0 +3A,81,55 +36,81,00 +21,80 +13,80 +29,A0 +:o,28 +:O,29 +:A,2A,2B,2C +:R,36 +:0,C0,22,00,00 +:1,A0,00,22,01 +:2,00,22,00,02 +:3,60,00,22,03 +:i,21,20 +# diff --git a/tasmota/displaydesc/st7789_ideaspark_170x320_diplay.ini b/tasmota/displaydesc/st7789_ideaspark_170x320_diplay.ini new file mode 100644 index 000000000..d14fb5abd --- /dev/null +++ b/tasmota/displaydesc/st7789_ideaspark_170x320_diplay.ini @@ -0,0 +1,20 @@ +:H,ST7789,170,320,16,SPI,1,15,18,23,2,32,4,*,80 +:S,2,1,3,0,80,30 +:I +01,A0 +11,A0 +3A,81,55 +36,81,00 +21,80 +13,80 +29,A0 +:o,28 +:O,29 +:A,2A,2B,2C +:R,36 +:0,C0,23,00,00 +:1,A0,00,23,01 +:2,00,23,00,02 +:3,60,00,23,03 +:i,21,20 +# diff --git a/tasmota/html_compressed/HTTP_GV_PAGE.h b/tasmota/html_compressed/HTTP_GV_PAGE.h index eb6da793d..4aaba697c 100644 --- a/tasmota/html_compressed/HTTP_GV_PAGE.h +++ b/tasmota/html_compressed/HTTP_GV_PAGE.h @@ -1,5 +1,6 @@ ///////////////////////////////////////////////////////////////////// // compressed by tools/unishox/compress-html-uncompressed.py +// input sha256: f5150873f8737621b7fd8bab0e471d73c893429c79c045a1b20c26c5fee1d3fa ///////////////////////////////////////////////////////////////////// const size_t HTTP_GV_PAGE_SIZE = 463; diff --git a/tasmota/html_compressed/HTTP_HEADER1_ES6.h b/tasmota/html_compressed/HTTP_HEADER1_ES6.h index b92414770..2530349c4 100644 --- a/tasmota/html_compressed/HTTP_HEADER1_ES6.h +++ b/tasmota/html_compressed/HTTP_HEADER1_ES6.h @@ -1,5 +1,6 @@ ///////////////////////////////////////////////////////////////////// // compressed by tools/unishox/compress-html-uncompressed.py +// input sha256: 3417a3f0d32f6537d82e4638a9cd462098b9da4f641160355e0c8d9334aed1d4 ///////////////////////////////////////////////////////////////////// const size_t HTTP_HEADER1_SIZE = 683; diff --git a/tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT.h b/tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT.h index 41ed93443..0597b9e4d 100644 --- a/tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT.h +++ b/tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT.h @@ -1,5 +1,6 @@ ///////////////////////////////////////////////////////////////////// // compressed by tools/unishox/compress-html-uncompressed.py +// input sha256: e0fcb684eb9f29a5fd0f678262046d9d05d055466b1752a58a35da2648ecd0e7 ///////////////////////////////////////////////////////////////////// const size_t HTTP_HEAD_LAST_SCRIPT_SIZE = 355; diff --git a/tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT32.h b/tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT32.h index 3c1303950..a23c18ca4 100644 --- a/tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT32.h +++ b/tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT32.h @@ -1,5 +1,6 @@ ///////////////////////////////////////////////////////////////////// // compressed by tools/unishox/compress-html-uncompressed.py +// input sha256: 996873eafc91c9d084e3f68b60d32a37a27e91dd1acd0863fc1096119d8de6a2 ///////////////////////////////////////////////////////////////////// const size_t HTTP_HEAD_LAST_SCRIPT32_SIZE = 1013; diff --git a/tasmota/html_compressed/HTTP_HEAD_STYLE1.h b/tasmota/html_compressed/HTTP_HEAD_STYLE1.h index 52440cd82..fe20e27db 100644 --- a/tasmota/html_compressed/HTTP_HEAD_STYLE1.h +++ b/tasmota/html_compressed/HTTP_HEAD_STYLE1.h @@ -1,5 +1,6 @@ ///////////////////////////////////////////////////////////////////// // compressed by tools/unishox/compress-html-uncompressed.py +// input sha256: 8c22c19284fa41f8eb66b1f50cb94cc3fe14369f900031e791107fe56d583c2f ///////////////////////////////////////////////////////////////////// const size_t HTTP_HEAD_STYLE1_SIZE = 591; diff --git a/tasmota/html_compressed/HTTP_HEAD_STYLE2.h b/tasmota/html_compressed/HTTP_HEAD_STYLE2.h index 0103a484f..37e52fedb 100644 --- a/tasmota/html_compressed/HTTP_HEAD_STYLE2.h +++ b/tasmota/html_compressed/HTTP_HEAD_STYLE2.h @@ -1,5 +1,6 @@ ///////////////////////////////////////////////////////////////////// // compressed by tools/unishox/compress-html-uncompressed.py +// input sha256: cff4350b756f01fb7866cbbffa2d169d4fe9eaca6ba45634f368ca1d714cd582 ///////////////////////////////////////////////////////////////////// const size_t HTTP_HEAD_STYLE2_SIZE = 496; diff --git a/tasmota/html_compressed/HTTP_HEAD_STYLE_ZIGBEE.h b/tasmota/html_compressed/HTTP_HEAD_STYLE_ZIGBEE.h index 29269d0d0..f98dade27 100644 --- a/tasmota/html_compressed/HTTP_HEAD_STYLE_ZIGBEE.h +++ b/tasmota/html_compressed/HTTP_HEAD_STYLE_ZIGBEE.h @@ -1,5 +1,6 @@ ///////////////////////////////////////////////////////////////////// // compressed by tools/unishox/compress-html-uncompressed.py +// input sha256: ee7e68972559c2ad3df6a6594445bfdfeb14a0a37dec2389ec20a197c26c9311 ///////////////////////////////////////////////////////////////////// const size_t HTTP_HEAD_STYLE_ZIGBEE_SIZE = 363; diff --git a/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h b/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h index 792f58f84..071388f55 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h @@ -1,5 +1,6 @@ ///////////////////////////////////////////////////////////////////// // compressed by tools/unishox/compress-html-uncompressed.py +// input sha256: 960fbc2354bc4029cbc93953e54edc74024a46ca58902af175f5ecf8839eb0a8 ///////////////////////////////////////////////////////////////////// const size_t HTTP_SCRIPT_CONSOL_SIZE = 985; diff --git a/tasmota/html_compressed/HTTP_SCRIPT_MODULE_TEMPLATE.h b/tasmota/html_compressed/HTTP_SCRIPT_MODULE_TEMPLATE.h index 99c40b1ac..afe052fde 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_MODULE_TEMPLATE.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_MODULE_TEMPLATE.h @@ -1,5 +1,6 @@ ///////////////////////////////////////////////////////////////////// // compressed by tools/unishox/compress-html-uncompressed.py +// input sha256: 92e33b521e56657da8f50887c7e1431219de0a8f19048247211f3b6d4c9b68ba ///////////////////////////////////////////////////////////////////// const size_t HTTP_SCRIPT_MODULE_TEMPLATE_SIZE = 589; diff --git a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h index abf07e30d..56005b282 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h @@ -1,5 +1,6 @@ ///////////////////////////////////////////////////////////////////// // compressed by tools/unishox/compress-html-uncompressed.py +// input sha256: 6e369f0e06cba0656d3c7187ac833b999a54f84edfd9385b4cf44ba8643e01d8 ///////////////////////////////////////////////////////////////////// const size_t HTTP_SCRIPT_ROOT_SIZE = 499; diff --git a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_PART2.h b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_PART2.h index 17af45427..2fcb4c7d5 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_PART2.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_PART2.h @@ -1,5 +1,6 @@ ///////////////////////////////////////////////////////////////////// // compressed by tools/unishox/compress-html-uncompressed.py +// input sha256: c85b76468eb793a235944c16a2d986bce127bd4fc1b0690499b3b5b88ab4f70f ///////////////////////////////////////////////////////////////////// const size_t HTTP_SCRIPT_ROOT_PART2_SIZE = 222; diff --git a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_SSE_NO_WEB_DISPLAY.h b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_SSE_NO_WEB_DISPLAY.h index 0cb9e3616..2cd66bfcc 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_SSE_NO_WEB_DISPLAY.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_SSE_NO_WEB_DISPLAY.h @@ -1,5 +1,6 @@ ///////////////////////////////////////////////////////////////////// // compressed by tools/unishox/compress-html-uncompressed.py +// input sha256: b42b87eb23e656d5ae799709721147c847ae381f0d1f0cb9f86bd55e9509bf51 ///////////////////////////////////////////////////////////////////// const size_t HTTP_SCRIPT_ROOT_SIZE = 434; diff --git a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h index dd84f501d..eb0471941 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h @@ -1,5 +1,6 @@ ///////////////////////////////////////////////////////////////////// // compressed by tools/unishox/compress-html-uncompressed.py +// input sha256: c137f990d750da7e1e51a6ec80baad5445853da492c12c4dad87c95724c50441 ///////////////////////////////////////////////////////////////////// const size_t HTTP_SCRIPT_ROOT_SIZE = 872; diff --git a/tasmota/html_compressed/HTTP_SCRIPT_TEMPLATE.h b/tasmota/html_compressed/HTTP_SCRIPT_TEMPLATE.h index 35da2d8bd..8bf7b1f64 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_TEMPLATE.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_TEMPLATE.h @@ -1,5 +1,6 @@ ///////////////////////////////////////////////////////////////////// // compressed by tools/unishox/compress-html-uncompressed.py +// input sha256: 464453a8f35b349965adc050d3e4f968239a974f171cfa64efc665bafe3ba3f4 ///////////////////////////////////////////////////////////////////// const size_t HTTP_SCRIPT_TEMPLATE_SIZE = 288; diff --git a/tasmota/include/i18n.h b/tasmota/include/i18n.h index bfff6c971..bc1d8a058 100644 --- a/tasmota/include/i18n.h +++ b/tasmota/include/i18n.h @@ -131,6 +131,7 @@ #define D_JSON_MODEL "Model" #define D_JSON_MOISTURE "Moisture" #define D_JSON_MQTT_COUNT "MqttCount" +#define D_JSON_MQTT_TLS "MqttTLS" #define D_JSON_NULL "null" #define D_JSON_NO "No" #define D_JSON_NOISE "Noise" @@ -215,6 +216,7 @@ #define D_JSON_UV_INDEX_TEXT "UvIndexText" #define D_JSON_UV_LEVEL "UvLevel" #define D_JSON_UV_POWER "UvPower" +#define D_JSON_VALID "Valid" #define D_JSON_VCC "Vcc" #define D_JSON_VERSION "Version" #define D_JSON_VOLTAGE "Voltage" @@ -331,6 +333,7 @@ #define D_CMND_OTAURL "OtaUrl" #define D_CMND_SERIALLOG "SerialLog" #define D_CMND_SYSLOG "SysLog" +#define D_CMND_FILELOG "FileLog" #define D_CMND_LOGHOST "LogHost" #define D_CMND_LOGPORT "LogPort" #define D_CMND_IPADDRESS "IPAddress" @@ -530,6 +533,7 @@ #define D_CMND_PALETTE "Palette" #define D_CMND_PIXELS "Pixels" #define D_CMND_STEPPIXELS "StepPixels" +#define D_CMND_PIXELTYPE "PixelType" #define D_CMND_ARTNET "ArtNet" #define D_CMND_ARTNET_CONFIG "ArtNetConfig" #define D_SO_ARTNET_AUTORUN "ArtNetAutorun" @@ -884,6 +888,7 @@ #define D_LOG_LVGL "LVG: " // LVGL graphics engine #define D_LOG_THERMOSTAT "THE: " // Thermostat driver #define D_LOG_SENSOR "SNS: " // Sensor driver +#define D_LOG_SENSEAIR "SNA: " // Senseair driver /********************************************************************************************/ diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index e4d714325..a9fa66f0a 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -802,6 +802,7 @@ #define USE_KNX // Enable KNX IP Protocol Support (+23k code, +3k3 mem) #endif #define USE_DALI // Add support for DALI gateway (+5k code) +#define USE_ESP32_TWAI // Add support for TWAI/CAN interface (+7k code) #endif // FIRMWARE_TASMOTA32 diff --git a/tasmota/include/tasmota_template.h b/tasmota/include/tasmota_template.h index 0a0ce7e71..6e49061b6 100644 --- a/tasmota/include/tasmota_template.h +++ b/tasmota/include/tasmota_template.h @@ -228,6 +228,8 @@ enum UserSelectablePins { GPIO_LD2410S_TX, GPIO_LD2410S_RX, // HLK-LD2410S GPIO_I2C_SER_TX, GPIO_I2C_SER_RX, // I2C via Serial using SC18IM704 protocol (xdrv74) GPIO_TM1640CLK, GPIO_TM1640DIN, // TM1640 (16 x seven-segment LED controler) + GPIO_TWAI_TX, GPIO_TWAI_RX, GPIO_TWAI_BO, GPIO_TWAI_CLK, // ESP32 TWAI serial interface + GPIO_C8_CO2_5K_TX, GPIO_C8_CO2_5K_RX, // C8-CO2-5K CO2 Sensor GPIO_SENSOR_END }; // Error as warning to rethink GPIO usage with max 2045 @@ -503,6 +505,8 @@ const char kSensorNames[] PROGMEM = D_SENSOR_LD2410S_TX "|" D_SENSOR_LD2410S_RX "|" D_SENSOR_I2C_SER_TX "|" D_SENSOR_I2C_SER_RX "|" D_SENSOR_TM1640_CLK "|" D_SENSOR_TM1640_DIN "|" + D_SENSOR_TWAI_TX "|" D_SENSOR_TWAI_RX "|" D_SENSOR_TWAI_BO "|" D_SENSOR_TWAI_CLK "|" + D_SENSOR_C8_CO2_5K_TX "|" D_SENSOR_C8_CO2_5K_RX ; const char kSensorNamesFixed[] PROGMEM = @@ -530,6 +534,8 @@ const char kSensorNamesFixed[] PROGMEM = #define MAX_BL0906_RX 6 // Model number of phases, 2 (EM2), 6 (EM6) #define MAX_BL0942_RX 8 // Baudrates 1/5 (4800), 2/6 (9600), 3/7 (19200), 4/8 (38400), Support Positive values only 1..4, Support also negative values 5..8 #define MAX_CSE7761 2 // Model 1/2 (DUALR3), 2/2 (POWCT) +#define MAX_TWAI SOC_TWAI_CONTROLLER_NUM +#define MAX_GPS_RX 3 // Baudrates 1 (9600), 2 (19200), 3 (38400) const uint16_t kGpioNiceList[] PROGMEM = { GPIO_NONE, // Not used @@ -1088,7 +1094,7 @@ const uint16_t kGpioNiceList[] PROGMEM = { #endif #ifdef USE_GPS AGPIO(GPIO_GPS_TX), // GPS serial interface - AGPIO(GPIO_GPS_RX), // GPS serial interface + AGPIO(GPIO_GPS_RX) + AGMAX(MAX_GPS_RX), // GPS serial interface #endif #ifdef USE_HM10 AGPIO(GPIO_HM10_TX), // HM10 serial interface @@ -1137,6 +1143,22 @@ const uint16_t kGpioNiceList[] PROGMEM = { #ifdef USE_WOOLIIS AGPIO(GPIO_WOOLIIS_RX), // Wooliis Battery capacity monitor Serial interface #endif +#ifdef USE_C8_CO2_5K + AGPIO(GPIO_C8_CO2_5K_TX), // SC8-CO2-5K Serial interface + AGPIO(GPIO_C8_CO2_5K_RX), // SC8-CO2-5K Serial interface +#endif + + +#ifdef ESP32 +#ifdef USE_ESP32_TWAI +#if SOC_TWAI_SUPPORTED + AGPIO(GPIO_TWAI_TX) + AGMAX(MAX_TWAI), // ESP32 TWAI serial interface + AGPIO(GPIO_TWAI_RX) + AGMAX(MAX_TWAI), + AGPIO(GPIO_TWAI_BO) + AGMAX(MAX_TWAI), + AGPIO(GPIO_TWAI_CLK) + AGMAX(MAX_TWAI), +#endif +#endif +#endif /*-------------------------------------------------------------------------------------------*\ * Other sensors diff --git a/tasmota/include/tasmota_types.h b/tasmota/include/tasmota_types.h index c0cb9959b..d553242ad 100644 --- a/tasmota/include/tasmota_types.h +++ b/tasmota/include/tasmota_types.h @@ -24,38 +24,38 @@ typedef union { // Restricted by MISRA-C Rule 18.4 but so useful... uint32_t data; // Allow bit manipulation using SetOption struct { // SetOption0 .. SetOption31 - uint32_t save_state : 1; // bit 0 - SetOption0 - (Settings) Save power state (1) and use after restart - uint32_t button_restrict : 1; // bit 1 - SetOption1 - (Button) Control button single press (1) or multipress (0) + uint32_t save_state : 1; // bit 0 - SetOption0 - SAVE_STATE - (Settings) Save power state (1) and use after restart + uint32_t button_restrict : 1; // bit 1 - SetOption1 - KEY_DISABLE_MULTIPRESS - (Button) Control button single press (1) or multipress (0) uint32_t mqtt_add_global_info : 1; // bit 2 - SetOption2 - (MQTT) Add global temperature/humidity/pressure info to JSON sensor message - uint32_t mqtt_enabled : 1; // bit 3 - SetOption3 - (MQTT) Enable (1) - uint32_t mqtt_response : 1; // bit 4 - SetOption4 - (MQTT) Switch between RESULT (0) or COMMAND (1) - uint32_t mqtt_power_retain : 1; // bit 5 - CMND_POWERRETAIN - uint32_t mqtt_button_retain : 1; // bit 6 - CMND_BUTTONRETAIN - uint32_t mqtt_switch_retain : 1; // bit 7 - CMND_SWITCHRETAIN - uint32_t temperature_conversion : 1; // bit 8 - SetOption8 - (Temperature) Switch between Celsius (0) or Fahrenheit (1) + uint32_t mqtt_enabled : 1; // bit 3 - SetOption3 - MQTT_USE - (MQTT) Enable (1) + uint32_t mqtt_response : 1; // bit 4 - SetOption4 - MQTT_RESULT_COMMAND - (MQTT) Switch between RESULT (0) or COMMAND (1) + uint32_t mqtt_power_retain : 1; // bit 5 - CMND_POWERRETAIN - MQTT_POWER_RETAIN + uint32_t mqtt_button_retain : 1; // bit 6 - CMND_BUTTONRETAIN - MQTT_BUTTON_RETAIN + uint32_t mqtt_switch_retain : 1; // bit 7 - CMND_SWITCHRETAIN - MQTT_SWITCH_RETAIN + uint32_t temperature_conversion : 1; // bit 8 - SetOption8 - TEMP_CONVERSION - (Temperature) Switch between Celsius (0) or Fahrenheit (1) uint32_t mqtt_sensor_retain : 1; // bit 9 - CMND_SENSORRETAIN - uint32_t mqtt_offline : 1; // bit 10 - SetOption10 - (MQTT) Control LWT message format, Offline (1) or none (0) - uint32_t button_swap : 1; // bit 11 (v5.1.6) - SetOption11 - (Button) Swap (1) button single and double press functionality - uint32_t stop_flash_rotate : 1; // bit 12 (v5.2.0) - SetOption12 - (Settings) Switch between dynamic (0) or fixed (1) slot flash save location - uint32_t button_single : 1; // bit 13 (v5.4.0) - SetOption13 - (Button) Support only single press (1) to speed up button press recognition - uint32_t interlock : 1; // bit 14 (v5.6.0) - CMND_INTERLOCK - Enable (1) /disable (0) interlock - uint32_t pwm_control : 1; // bit 15 (v5.8.1) - SetOption15 - (Light) Switch between commands PWM (0) or COLOR/DIMMER/CT/CHANNEL (1) - uint32_t ws_clock_reverse : 1; // bit 16 (v5.8.1) - SetOption16 - (WS2812) Switch between clockwise (0) or counter-clockwise (1) - uint32_t decimal_text : 1; // bit 17 (v5.8.1) - SetOption17 - (Light) Switch between decimal (1) or hexadecimal (0) output - uint32_t light_signal : 1; // bit 18 (v5.10.0c) - SetOption18 - (Light) Pair light signal (1) with CO2 sensor - uint32_t hass_discovery : 1; // bit 19 (v5.11.1a) - SetOption19 - (HAss) Control automatic discovery (1) (See SetOption59) - uint32_t not_power_linked : 1; // bit 20 (v5.11.1f) - SetOption20 - (Light) Control power in relation to Dimmer/Color/Ct changes (1) - uint32_t no_power_on_check : 1; // bit 21 (v5.11.1i) - SetOption21 - (Energy) Show voltage even if powered off (1) + uint32_t mqtt_offline : 1; // bit 10 - SetOption10 - MQTT_LWT_MESSAGE - (MQTT) Control LWT message format, Offline (1) or none (0) + uint32_t button_swap : 1; // bit 11 (v5.1.6) - SetOption11 - KEY_SWAP_DOUBLE_PRESS - (Button) Swap (1) button single and double press functionality + uint32_t stop_flash_rotate : 1; // bit 12 (v5.2.0) - SetOption12 - APP_FLASH_CYCLE - (Settings) Switch between dynamic (0) or fixed (1) slot flash save location + uint32_t button_single : 1; // bit 13 (v5.4.0) - SetOption13 - KEY_ONLY_SINGLE_PRESS - (Button) Support only single press (1) to speed up button press recognition + uint32_t interlock : 1; // bit 14 (v5.6.0) - CMND_INTERLOCK - APP_INTERLOCK_MODE - Enable (1) /disable (0) interlock + uint32_t pwm_control : 1; // bit 15 (v5.8.1) - SetOption15 - LIGHT_MODE - (Light) Switch between commands PWM (0) or COLOR/DIMMER/CT/CHANNEL (1) + uint32_t ws_clock_reverse : 1; // bit 16 (v5.8.1) - SetOption16 - LIGHT_CLOCK_DIRECTION - (WS2812) Switch between clockwise (0) or counter-clockwise (1) + uint32_t decimal_text : 1; // bit 17 (v5.8.1) - SetOption17 - LIGHT_COLOR_RADIX - (Light) Switch between decimal (1) or hexadecimal (0) output + uint32_t light_signal : 1; // bit 18 (v5.10.0c) - SetOption18 - LIGHT_PAIRS_CO2 - (Light) Pair light signal (1) with CO2 sensor + uint32_t hass_discovery : 1; // bit 19 (v5.11.1a) - SetOption19 - HOME_ASSISTANT_DISCOVERY_ENABLE - (HAss) Control automatic discovery (1) (See SetOption59) + uint32_t not_power_linked : 1; // bit 20 (v5.11.1f) - SetOption20 - LIGHT_POWER_CONTROL - (Light) Control power in relation to Dimmer/Color/Ct changes (1) + uint32_t no_power_on_check : 1; // bit 21 (v5.11.1i) - SetOption21 - ENERGY_VOLTAGE_ALWAYS - (Energy) Show voltage even if powered off (1) uint32_t mqtt_serial : 1; // bit 22 (v5.12.0f) - CMND_SERIALSEND and CMND_SERIALLOG uint32_t mqtt_serial_raw : 1; // bit 23 (v6.1.1c) - CMND_SERIALSEND3 - uint32_t pressure_conversion : 1; // bit 24 (v6.3.0.2) - SetOption24 - (Pressure) switch between hPa (0)or mmHg (1) unit - uint32_t knx_enabled : 1; // bit 25 (v5.12.0l) - CMND_KNX_ENABLED - uint32_t device_index_enable : 1; // bit 26 (v5.13.1a) - SetOption26 - (MQTT, HAss) Switch between POWER (0) or POWER1 (1) - uint32_t knx_enable_enhancement : 1; // bit 27 (v5.14.0a) - CMND_KNX_ENHANCED + uint32_t pressure_conversion : 1; // bit 24 (v6.3.0.2) - SetOption24 - PRESSURE_CONVERSION - (Pressure) switch between hPa (0)or mmHg (1) unit + uint32_t knx_enabled : 1; // bit 25 (v5.12.0l) - CMND_KNX_ENABLED - KNX_ENABLED + uint32_t device_index_enable : 1; // bit 26 (v5.13.1a) - SetOption26 - MQTT_POWER_FORMAT - (MQTT, HAss) Switch between POWER (0) or POWER1 (1) + uint32_t knx_enable_enhancement : 1; // bit 27 (v5.14.0a) - CMND_KNX_ENHANCED - KNX_ENHANCED uint32_t rf_receive_decimal : 1; // bit 28 (v6.0.0a) - SetOption28 - (RF) Receive data format hexadecimal (0) or decimal (1) - uint32_t ir_receive_decimal : 1; // bit 29 (v6.0.0a) - SetOption29 - (IR) Receive data format hexadecimal (0) or decimal (1) - uint32_t hass_light : 1; // bit 30 (v6.0.0b) - SetOption30 - (HAss) enforce autodiscovery as light (1) - uint32_t global_state : 1; // bit 31 (v6.1.0) - SetOption31 - (Wifi, MQTT) Control link led blinking (1) + uint32_t ir_receive_decimal : 1; // bit 29 (v6.0.0a) - SetOption29 - IR_DATA_RADIX - (IR) Receive data format hexadecimal (0) or decimal (1) + uint32_t hass_light : 1; // bit 30 (v6.0.0b) - SetOption30 - HASS_AS_LIGHT - (HAss) enforce autodiscovery as light (1) + uint32_t global_state : 1; // bit 31 (v6.1.0) - SetOption31 - APP_ENABLE_LEDLINK - (Wifi, MQTT) Control link led blinking (1) }; } SOBitfield; @@ -63,39 +63,39 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu typedef union { // Restricted by MISRA-C Rule 18.4 but so useful... uint32_t data; // Allow bit manipulation using SetOption struct { // SetOption50 .. SetOption81 - uint32_t timers_enable : 1; // bit 0 (v6.1.1b) - CMND_TIMERS + uint32_t timers_enable : 1; // bit 0 (v6.1.1b) - CMND_TIMERS - TIMERS_ENABLED uint32_t user_esp8285_enable : 1; // bit 1 (v6.1.1.14) - SetOption51 - (GPIO) Enable ESP8285 user GPIO's (1) - uint32_t time_append_timezone : 1; // bit 2 (v6.2.1.2) - SetOption52 - (Time) Append timezone to JSON time (1) - uint32_t gui_hostname_ip : 1; // bit 3 (v6.2.1.20) - SetOption53 - (GUI) Show hostname and IP address in GUI main menu (1) - uint32_t tuya_apply_o20 : 1; // bit 4 (v6.3.0.4) - SetOption54 - (Tuya) Apply SetOption20 settings to Tuya device (1) - uint32_t mdns_enabled : 1; // bit 5 (v6.4.1.4) - SetOption55 - (mDNS) Service on (1) or off (0) - uint32_t use_wifi_scan : 1; // bit 6 (v6.3.0.10) - SetOption56 - (Wifi) Scan network at restart for configured AP's (1) or used stored AP (0) - uint32_t use_wifi_rescan : 1; // bit 7 (v6.3.0.10) - SetOption57 - (Wifi) Scan network every 44 minutes for configured AP's (1) - uint32_t receive_raw : 1; // bit 8 (v6.3.0.11) - SetOption58 - (IR) Add IR Raw data to JSON message (1) - uint32_t hass_tele_on_power : 1; // bit 9 (v6.3.0.13) - SetOption59 - (MQTT) Send tele/%topic%/STATE in addition to stat/%topic%/RESULT (1) - uint32_t sleep_normal : 1; // bit 10 (v6.3.0.15) - SetOption60 - (Sleep) Enable normal sleep (1) instead of dynamic sleep (0) - uint32_t button_switch_force_local : 1;// bit 11 (v6.3.0.16) - SetOption61 - (Button, Switch) Force local operation (1) when button/switch topic is set - uint32_t no_hold_retain : 1; // bit 12 (v6.4.1.19) - SetOption62 - (MQTT) Don't use retain flag on HOLD messages (1) - uint32_t no_power_feedback : 1; // bit 13 (v6.5.0.9) - SetOption63 - (Power) Don't scan relay power state at restart (1) - uint32_t use_underscore : 1; // bit 14 (v6.5.0.12) - SetOption64 - (JSON) Enable "_" (1) instead of "-" (0) as sensor index separator - uint32_t fast_power_cycle_disable : 1; // bit 15 (v6.6.0.20) - SetOption65 - (QPC) Disable (1) fast power cycle detection for device reset - uint32_t tuya_serial_mqtt_publish : 1; // bit 16 (v6.6.0.21) - SetOption66 - (Tuya) Enable (1) TuyaMcuReceived messages over Mqtt - uint32_t buzzer_enable : 1; // bit 17 (v6.6.0.1) - SetOption67 - (Buzzer) Enable (1) buzzer when available - uint32_t pwm_multi_channels : 1; // bit 18 (v6.6.0.3) - SetOption68 - (Light) Enable multi-channels PWM (1) instead of Color PWM (0) + uint32_t time_append_timezone : 1; // bit 2 (v6.2.1.2) - SetOption52 - MQTT_APPEND_TIMEZONE - (Time) Append timezone to JSON time (1) + uint32_t gui_hostname_ip : 1; // bit 3 (v6.2.1.20) - SetOption53 - GUI_SHOW_HOSTNAME - (GUI) Show hostname and IP address in GUI main menu (1) + uint32_t tuya_apply_o20 : 1; // bit 4 (v6.3.0.4) - SetOption54 - TUYA_SETOPTION_20 - (Tuya) Apply SetOption20 settings to Tuya device (1) + uint32_t mdns_enabled : 1; // bit 5 (v6.4.1.4) - SetOption55 - MDNS_ENABLED - (mDNS) Service on (1) or off (0) + uint32_t use_wifi_scan : 1; // bit 6 (v6.3.0.10) - SetOption56 - WIFI_SCAN_AT_RESTART - (Wifi) Scan network at restart for configured AP's (1) or used stored AP (0) + uint32_t use_wifi_rescan : 1; // bit 7 (v6.3.0.10) - SetOption57 - WIFI_SCAN_REGULARLY - (Wifi) Scan network every 44 minutes for configured AP's (1) + uint32_t receive_raw : 1; // bit 8 (v6.3.0.11) - SetOption58 - IR_ADD_RAW_DATA - (IR) Add IR Raw data to JSON message (1) + uint32_t hass_tele_on_power : 1; // bit 9 (v6.3.0.13) - SetOption59 - TELE_ON_POWER - (MQTT) Send tele/%topic%/STATE in addition to stat/%topic%/RESULT (1) + uint32_t sleep_normal : 1; // bit 10 (v6.3.0.15) - SetOption60 - APP_NORMAL_SLEEP - (Sleep) Enable normal sleep (1) instead of dynamic sleep (0) + uint32_t button_switch_force_local : 1;// bit 11 (v6.3.0.16) - SetOption61 - MQTT_BUTTON_SWITCH_FORCE_LOCAL - (Button, Switch) Force local operation (1) when button/switch topic is set + uint32_t no_hold_retain : 1; // bit 12 (v6.4.1.19) - SetOption62 - MQTT_NO_HOLD_RETAIN - (MQTT) Don't use retain flag on HOLD messages (1) + uint32_t no_power_feedback : 1; // bit 13 (v6.5.0.9) - SetOption63 - APP_NO_RELAY_SCAN - (Power) Don't scan relay power state at restart (1) + uint32_t use_underscore : 1; // bit 14 (v6.5.0.12) - SetOption64 - MQTT_INDEX_SEPARATOR - (JSON) Enable "_" (1) instead of "-" (0) as sensor index separator + uint32_t fast_power_cycle_disable : 1; // bit 15 (v6.6.0.20) - SetOption65 - APP_DISABLE_POWERCYCLE - (QPC) Disable (1) fast power cycle detection for device reset + uint32_t tuya_serial_mqtt_publish : 1; // bit 16 (v6.6.0.21) - SetOption66 - MQTT_TUYA_RECEIVED - (Tuya) Enable (1) TuyaMcuReceived messages over Mqtt + uint32_t buzzer_enable : 1; // bit 17 (v6.6.0.1) - SetOption67 - BUZZER_ENABLE - (Buzzer) Enable (1) buzzer when available + uint32_t pwm_multi_channels : 1; // bit 18 (v6.6.0.3) - SetOption68 - LIGHT_CHANNEL_MODE - (Light) Enable multi-channels PWM (1) instead of Color PWM (0) // uint32_t ex_tuya_dimmer_min_limit : 1; // bit 19 (v6.6.0.5) - SetOption69 - (not used) Limits Tuya dimmers to minimum of 10% (25) when enabled uint32_t sb_receive_invert : 1; // bit 19 (v14.2.0.3) - SetOption69 - (Serial) Invert Serial receive on SerialBridge (1) uint32_t energy_weekend : 1; // bit 20 (v6.6.0.8) - CMND_TARIFF - uint32_t dds2382_model : 1; // bit 21 (v6.6.0.14) - SetOption71 - (DDS2382) Select different Modbus registers (1) for Active Energy (#6531) - uint32_t hardware_energy_total : 1; // bit 22 (v6.6.0.15) - SetOption72 - (Energy) Enable (1) hardware energy total counter as reference (#6561) - uint32_t mqtt_buttons : 1; // bit 23 (v8.2.0.3) - SetOption73 - (Button) Detach buttons from relays (1) and enable MQTT action state for multipress - uint32_t ds18x20_internal_pullup : 1; // bit 24 (v7.0.0.1) - SetOption74 - (DS18x20) Enable internal pullup (1) for single DS18x20 sensor - uint32_t grouptopic_mode : 1; // bit 25 (v7.0.0.1) - SetOption75 - (MQTT) GroupTopic replaces %topic% (0) or fixed topic cmnd/grouptopic (1) - uint32_t bootcount_update : 1; // bit 26 (v7.0.0.4) - SetOption76 - (Deepsleep) Enable incrementing bootcount (1) when deepsleep is enabled - uint32_t slider_dimmer_stay_on : 1; // bit 27 (v7.0.0.6) - SetOption77 - (Light) Do not power off (1) if slider moved to far left + uint32_t dds2382_model : 1; // bit 21 (v6.6.0.14) - SetOption71 - ENERGY_DDS2382_MODE - (DDS2382) Select different Modbus registers (1) for Active Energy (#6531) + uint32_t hardware_energy_total : 1; // bit 22 (v6.6.0.15) - SetOption72 - ENERGY_HARDWARE_TOTALS - (Energy) Enable (1) hardware energy total counter as reference (#6561) + uint32_t mqtt_buttons : 1; // bit 23 (v8.2.0.3) - SetOption73 - MQTT_BUTTONS - (Button) Detach buttons from relays (1) and enable MQTT action state for multipress + uint32_t ds18x20_internal_pullup : 1; // bit 24 (v7.0.0.1) - SetOption74 - DS18X20_PULL_UP - (DS18x20) Enable internal pullup (1) for single DS18x20 sensor + uint32_t grouptopic_mode : 1; // bit 25 (v7.0.0.1) - SetOption75 - MQTT_GROUPTOPIC_FORMAT - (MQTT) GroupTopic replaces %topic% (0) or fixed topic cmnd/grouptopic (1) + uint32_t bootcount_update : 1; // bit 26 (v7.0.0.4) - SetOption76 - DEEPSLEEP_BOOTCOUNT - (Deepsleep) Enable incrementing bootcount (1) when deepsleep is enabled + uint32_t slider_dimmer_stay_on : 1; // bit 27 (v7.0.0.6) - SetOption77 - LIGHT_SLIDER_POWER - (Light) Do not power off (1) if slider moved to far left uint32_t ex_compatibility_check : 1; // bit 28 (v7.1.2.6) - SetOption78 - (not used) Disable OTA compatibility check - uint32_t counter_reset_on_tele : 1; // bit 29 (v8.1.0.1) - SetOption79 - (Counter) Enable resetting of counters (1) after telemetry was sent - uint32_t shutter_mode : 1; // bit 30 (v6.6.0.14) - SetOption80 - (Shutter) Enable shutter support (1) - uint32_t pcf8574_ports_inverted : 1; // bit 31 (v6.6.0.14) - SetOption81 - (PCF8574) Invert all ports on PCF8574 devices (1) + uint32_t counter_reset_on_tele : 1; // bit 29 (v8.1.0.1) - SetOption79 - COUNTER_RESET - (Counter) Enable resetting of counters (1) after telemetry was sent + uint32_t shutter_mode : 1; // bit 30 (v6.6.0.14) - SetOption80 - SHUTTER_SUPPORT - (Shutter) Enable shutter support (1) + uint32_t pcf8574_ports_inverted : 1; // bit 31 (v6.6.0.14) - SetOption81 - PCF8574_INVERT_PORTS - (PCF8574) Invert all ports on PCF8574 devices (1) }; } SOBitfield3; @@ -103,37 +103,37 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu typedef union { // Restricted by MISRA-C Rule 18.4 but so useful... uint32_t data; // Allow bit manipulation using SetOption struct { // SetOption82 .. SetOption113 - uint32_t alexa_ct_range : 1; // bit 0 (v8.1.0.2) - SetOption82 - (Alexa) Reduced CT range for Alexa (1) - uint32_t zigbee_use_names : 1; // bit 1 (v8.1.0.4) - SetOption83 - (Zigbee) Use FriendlyNames (1) instead of ShortAddresses (0) when possible + uint32_t alexa_ct_range : 1; // bit 0 (v8.1.0.2) - SetOption82 - LIGHT_ALEXA_CT_RANGE - (Alexa) Reduced CT range for Alexa (1) + uint32_t zigbee_use_names : 1; // bit 1 (v8.1.0.4) - SetOption83 - ZIGBEE_FRIENDLY_NAMES - (Zigbee) Use FriendlyNames (1) instead of ShortAddresses (0) when possible uint32_t awsiot_shadow : 1; // bit 2 (v8.1.0.5) - SetOption84 - (AWS IoT) publish MQTT state to a device shadow (1) uint32_t device_groups_enabled : 1; // bit 3 (v8.1.0.9) - SetOption85 - (DevGroups) Enable Device Groups (1) uint32_t led_timeout : 1; // bit 4 (v8.1.0.9) - SetOption86 - (PWM Dimmer) Turn brightness LED's off (1) 5 seconds after last change uint32_t powered_off_led : 1; // bit 5 (v8.1.0.9) - SetOption87 - (PWM Dimmer) Turn red LED on (1) when powered off uint32_t multiple_device_groups : 1; // bit 6 (v8.1.0.9) - SetOption88 - (DevGroups) Enable relays in separate device groups/PWM Dimmer Buttons control remote devices (1) - uint32_t zigbee_distinct_topics : 1; // bit 7 (v8.1.0.10) - SetOption89 - (MQTT, Zigbee) Distinct MQTT topics per device for Zigbee (1) (#7835) - uint32_t only_json_message : 1; // bit 8 (v8.2.0.3) - SetOption90 - (MQTT) Disable non-json MQTT response (1) + uint32_t zigbee_distinct_topics : 1; // bit 7 (v8.1.0.10) - SetOption89 - ZIGBEE_DISTINCT_TOPICS - (MQTT, Zigbee) Distinct MQTT topics per device for Zigbee (1) (#7835) + uint32_t only_json_message : 1; // bit 8 (v8.2.0.3) - SetOption90 - MQTT_ONLY_JSON_OUTPUT - (MQTT) Disable non-json MQTT response (1) uint32_t fade_at_startup : 1; // bit 9 (v8.2.0.3) - SetOption91 - (Light) Enable light fading at start/power on (1) - uint32_t pwm_ct_mode : 1; // bit 10 (v8.2.0.4) - SetOption92 - (Light) Set PWM Mode from regular PWM (0) to ColorTemp (1) control (Xiaomi Philips ...) + uint32_t pwm_ct_mode : 1; // bit 10 (v8.2.0.4) - SetOption92 - LIGHT_PWM_CT_MODE - (Light) Set PWM Mode from regular PWM (0) to ColorTemp (1) control (Xiaomi Philips ...) uint32_t compress_rules_cpu : 1; // bit 11 (v8.2.0.6) - SetOption93 - (Compress) Keep uncompressed rules in memory to avoid CPU load of uncompressing at each tick (1) uint32_t max6675 : 1; // bit 12 (v8.3.1.2) - SetOption94 - (MAXxxx) Implement simpler MAX6675 protocol (1) instead of MAX31855 (0) - uint32_t network_wifi : 1; // bit 13 (v8.3.1.3) - CMND_WIFI - uint32_t network_ethernet : 1; // bit 14 (v8.3.1.3) - CMND_ETHERNET + uint32_t network_wifi : 1; // bit 13 (v8.3.1.3) - CMND_WIFI - 1 + uint32_t network_ethernet : 1; // bit 14 (v8.3.1.3) - CMND_ETHERNET - 1 uint32_t tuyamcu_baudrate : 1; // bit 15 (v8.3.1.6) - SetOption97 - (Tuya) Set Baud rate for TuyaMCU serial communication to 9600 (0) or 115200 (1) uint32_t rotary_uses_rules : 1; // bit 16 (v8.3.1.6) - SetOption98 - (Rotary) Use rules (1) instead of light control (0) uint32_t zerocross_dimmer : 1; // bit 17 (v8.3.1.4) - SetOption99 - (PWM Dimmer) Enable zerocross dimmer (1) - uint32_t remove_zbreceived : 1; // bit 18 (v8.3.1.7) - SetOption100 - (Zigbee) Remove ZbReceived form JSON message (1) - uint32_t zb_index_ep : 1; // bit 19 (v8.3.1.7) - SetOption101 - (Zigbee) Add the source endpoint as suffix to attributes, ex `Power3` (1) instead of `Power` (0) if sent from endpoint 3 + uint32_t remove_zbreceived : 1; // bit 18 (v8.3.1.7) - SetOption100 - ZIGBEE_RMV_ZBRECEIVED - (Zigbee) Remove ZbReceived form JSON message (1) + uint32_t zb_index_ep : 1; // bit 19 (v8.3.1.7) - SetOption101 - ZIGBEE_INDEX_EP - (Zigbee) Add the source endpoint as suffix to attributes, ex `Power3` (1) instead of `Power` (0) if sent from endpoint 3 uint32_t obsolete1 : 1; // bit 20 (v9.3.1.3) - SetOption102 - teleinfo_baudrate Obsolete Teleinfo config has now a dedicated bit field - uint32_t mqtt_tls : 1; // bit 21 (v8.4.0.1) - SetOption103 - (MQTT TLS) Enable TLS mode (1) (requires TLS version) - uint32_t mqtt_no_retain : 1; // bit 22 (v8.4.0.1) - SetOption104 - (MQTT) No Retain (1) - disable all MQTT retained messages, some brokers don't support it: AWS IoT, Losant - uint32_t white_blend_mode : 1; // bit 23 (v8.4.0.1) - SetOption105 - (Light) White Blend Mode (1) - used to be `RGBWWTable` last value `0`, now deprecated in favor of this option - uint32_t virtual_ct : 1; // bit 24 (v8.4.0.1) - SetOption106 - (Light) Virtual CT (1) - Creates a virtual White ColorTemp for RGBW lights - uint32_t virtual_ct_cw : 1; // bit 25 (v8.4.0.1) - SetOption107 - (Light) Virtual CT Channel (1) - signals whether the hardware white is cold CW (true) or warm WW (false) + uint32_t mqtt_tls : 1; // bit 21 (v8.4.0.1) - SetOption103 - MQTT_TLS_ENABLED - (MQTT TLS) Enable TLS mode (1) (requires TLS version) + uint32_t mqtt_no_retain : 1; // bit 22 (v8.4.0.1) - SetOption104 - MQTT_NO_RETAIN - (MQTT) No Retain (1) - disable all MQTT retained messages, some brokers don't support it: AWS IoT, Losant + uint32_t white_blend_mode : 1; // bit 23 (v8.4.0.1) - SetOption105 - LIGHT_WHITE_BLEND_MODE - (Light) White Blend Mode (1) - used to be `RGBWWTable` last value `0`, now deprecated in favor of this option + uint32_t virtual_ct : 1; // bit 24 (v8.4.0.1) - SetOption106 - LIGHT_VIRTUAL_CT - (Light) Virtual CT (1) - Creates a virtual White ColorTemp for RGBW lights + uint32_t virtual_ct_cw : 1; // bit 25 (v8.4.0.1) - SetOption107 - LIGHT_VIRTUAL_CT_CW - (Light) Virtual CT Channel (1) - signals whether the hardware white is cold CW (true) or warm WW (false) uint32_t obsolete2 : 1; // bit 26 (v9.3.1.3) - SetOption108 - teleinfo_rawdata Obsolete Teleinfo config has now a dedicated bit field - uint32_t alexa_gen_1 : 1; // bit 27 (v8.4.0.3) - SetOption109 - (Alexa) Gen1 mode (1) - if you only have Echo Dot 2nd gen devices + uint32_t alexa_gen_1 : 1; // bit 27 (v8.4.0.3) - SetOption109 - EMULATION_HUE_1ST_GEN - (Alexa) Gen1 mode (1) - if you only have Echo Dot 2nd gen devices uint32_t zb_disable_autobind : 1; // bit 28 (v8.5.0.1) - SetOption110 - (Zigbee) Disable auto-config (1) when pairing new devices uint32_t buzzer_freq_mode : 1; // bit 29 (v8.5.0.1) - SetOption111 - (Buzzer) Use frequency output (1) for buzzer pin instead of on/off signal (0) - uint32_t zb_topic_fname : 1; // bit 30 (v8.5.0.1) - SetOption112 - (Zigbee) Use friendly name in zigbee topic (1) (use with SetOption89) + uint32_t zb_topic_fname : 1; // bit 30 (v8.5.0.1) - SetOption112 - ZIGBEE_TOPIC_FNAME - (Zigbee) Use friendly name in zigbee topic (1) (use with SetOption89) uint32_t rotary_poweron_dimlow : 1; // bit 31 (v9.0.0.2) - SetOption113 - (Rotary) Set dimmer low on rotary dial after power off (1) }; } SOBitfield4; @@ -142,38 +142,38 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu typedef union { // Restricted by MISRA-C Rule 18.4 but so useful... uint32_t data; // Allow bit manipulation using SetOption struct { // SetOption114 .. SetOption145 - uint32_t mqtt_switches : 1; // bit 0 (v9.0.0.3) - SetOption114 - (Switch) Detach Switches from relays and enable MQTT action state for all the SwitchModes (1) - uint32_t mi32_enable : 1; // bit 1 (v9.1.0.1) - SetOption115 - (ESP32 BLE) Enable ESP32 MI32 BLE (1) + uint32_t mqtt_switches : 1; // bit 0 (v9.0.0.3) - SetOption114 - MQTT_SWITCHES - (Switch) Detach Switches from relays and enable MQTT action state for all the SwitchModes (1) + uint32_t mi32_enable : 1; // bit 1 (v9.1.0.1) - SetOption115 - BLE_ESP32_ENABLE - (ESP32 BLE) Enable ESP32 MI32 BLE (1) uint32_t zb_disable_autoquery : 1; // bit 2 (v9.1.0.1) - SetOption116 - (Zigbee) Disable auto-query of zigbee lights and devices (1) uint32_t fade_fixed_duration : 1; // bit 3 (v9.1.0.2) - SetOption117 - (Light) run fading at fixed duration instead of fixed slew rate uint32_t zb_received_as_subtopic : 1; // bit 4 (v9.2.0.3) - SetOption118 - (Zigbee) Move ZbReceived from JSON message and into the subtopic replacing "SENSOR" default uint32_t zb_omit_json_addr : 1; // bit 5 (v9.2.0.3) - SetOption119 - (Zigbee) Remove the device addr from json payload, can be used with zb_topic_fname where the addr is already known from the topic uint32_t zb_topic_endpoint : 1; // bit 6 (v9.2.0.4) - SetOption120 - (Zigbee) Append endpoint number to topic if device dependent (use with SetOption89) - uint32_t mqtt_state_retain : 1; // bit 7 (v9.3.0.1) - CMND_STATERETAIN - uint32_t mqtt_info_retain : 1; // bit 8 (v9.3.0.1) - CMND_INFORETAIN + uint32_t mqtt_state_retain : 1; // bit 7 (v9.3.0.1) - CMND_STATERETAIN - MQTT_STATE_RETAIN + uint32_t mqtt_info_retain : 1; // bit 8 (v9.3.0.1) - CMND_INFORETAIN - MQTT_INFO_RETAIN uint32_t wiegand_hex_output : 1; // bit 9 (v9.3.1.1) - SetOption123 - (Wiegand) switch tag number output to hex format (1) uint32_t wiegand_keypad_to_tag : 1; // bit 10 (v9.3.1.1) - SetOption124 - (Wiegand) send key pad stroke as single char (0) or one tag (ending char #) (1) uint32_t zigbee_hide_bridge_topic : 1; // bit 11 (v9.3.1.1) - SetOption125 - (Zigbee) Hide bridge topic from zigbee topic (use with SetOption89) (1) uint32_t ds18x20_mean : 1; // bit 12 (v9.3.1.2) - SetOption126 - (DS18x20) Enable arithmetic mean over teleperiod for JSON temperature (1) - uint32_t wifi_no_sleep : 1; // bit 13 (v9.5.0.2) - SetOption127 - (Wifi) Keep wifi in no-sleep mode, prevents some occasional unresponsiveness - uint32_t disable_referer_chk : 1; // bit 14 (v9.5.0.5) - SetOption128 - (Web) Allow access without referer check + uint32_t wifi_no_sleep : 1; // bit 13 (v9.5.0.2) - SetOption127 - WIFI_NO_SLEEP - (Wifi) Keep wifi in no-sleep mode, prevents some occasional unresponsiveness + uint32_t disable_referer_chk : 1; // bit 14 (v9.5.0.5) - SetOption128 - DISABLE_REFERER_CHK - (Web) Allow access without referer check uint32_t energy_phase : 1; // bit 15 (v9.5.0.9) - SetOption129 - (Energy) Show phase information uint32_t show_heap_with_timestamp : 1; // bit 16 (v9.5.0.9) - SetOption130 - (Debug) Show heap with logging timestamp - uint32_t tuya_allow_dimmer_0 : 1; // bit 17 (v10.0.0.3) - SetOption131 - (Tuya) Allow save dimmer = 0 receved by MCU - uint32_t tls_use_fingerprint : 1; // bit 18 (v10.0.0.4) - SetOption132 - (TLS) Use fingerprint validation instead of CA based - uint32_t shift595_invert_outputs : 1; // bit 19 (v10.0.0.4) - SetOption133 - (Shift595) Invert outputs of 74x595 shift registers + uint32_t tuya_allow_dimmer_0 : 1; // bit 17 (v10.0.0.3) - SetOption131 - TUYA_ALLOW_DIMMER_0 - (Tuya) Allow save dimmer = 0 receved by MCU + uint32_t tls_use_fingerprint : 1; // bit 18 (v10.0.0.4) - SetOption132 - MQTT_TLS_FINGERPRINT - (TLS) Use fingerprint validation instead of CA based + uint32_t shift595_invert_outputs : 1; // bit 19 (v10.0.0.4) - SetOption133 - SHIFT595_INVERT_OUTPUTS - (Shift595) Invert outputs of 74x595 shift registers uint32_t pwm_force_same_phase : 1; // bit 20 (v10.1.0.6) - SetOption134 - (PWM) force PWM lights to start at same phase, default is to spread phases to minimze overlap (also needed for H-bridge) uint32_t display_no_splash : 1; // bit 21 (v11.0.0.2) - SetOption135 - (Display & LVGL) force disabling default splash screen uint32_t tuyasns_no_immediate : 1; // bit 22 (v11.0.0.4) - SetOption136 - (TuyaSNS) When ON disable publish single SNS value on Tuya Receive (keep Teleperiod) - uint32_t tuya_exclude_from_mqtt : 1; // bit 23 (v11.0.0.5) - SetOption137 - (Tuya) When Set, avoid the (MQTT-) publish of defined Tuya CMDs (see xdrv_16_tuyamcu.ino) if SetOption66 is active + uint32_t tuya_exclude_from_mqtt : 1; // bit 23 (v11.0.0.5) - SetOption137 - TUYA_SETOPTION_137 - (Tuya) When Set, avoid the (MQTT-) publish of defined Tuya CMDs (see xdrv_16_tuyamcu.ino) if SetOption66 is active uint32_t gui_table_align : 1; // bit 24 (v11.0.0.7) - SetOption138 - (GUI) Align (energy) table values left (0) or right (1) uint32_t mm_vs_inch : 1; // bit 25 (v11.1.0.1) - SetOption139 - (Pressure) Switch between mmHg (0) or inHg (1) when SO24 1 - uint32_t mqtt_persistent : 1; // bit 26 (v11.1.0.1) - SetOption140 - (MQTT) MQTT clean session (0 = default) or persistent session (1) - uint32_t gui_module_name : 1; // bit 27 (v11.1.0.3) - SetOption141 - (GUI) Disable display of GUI module name (1) + uint32_t mqtt_persistent : 1; // bit 26 (v11.1.0.1) - SetOption140 - MQTT_CLEAN_SESSION - (MQTT) MQTT clean session (0 = default) or persistent session (1) + uint32_t gui_module_name : 1; // bit 27 (v11.1.0.3) - SetOption141 - GUI_NOSHOW_MODULE - (GUI) Disable display of GUI module name (1) uint32_t wait_for_wifi_result : 1; // bit 28 (v11.1.0.4) - SetOption142 - (Wifi) Wait 1 second for wifi connection solving some FRITZ!Box modem issues (1) uint32_t zigbee_no_batt_autoprobe : 1; // bit 29 (v12.0.2.4) - SetOption143 - (Zigbee) Disable Battery auto-probe and using auto-binding uint32_t zigbee_include_time : 1; // bit 30 (v12.0.2.4) - SetOption144 - (Zigbee) Include time in `ZbReceived` messages like other sensors - uint32_t mqtt_status_retain : 1; // bit 31 (v12.1.0.1) - CMND_STATUSRETAIN + uint32_t mqtt_status_retain : 1; // bit 31 (v12.1.0.1) - CMND_STATUSRETAIN - MQTT_STATUS_RETAIN }; } SOBitfield5; @@ -181,24 +181,24 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t data; // Allow bit manipulation using SetOption struct { // SetOption146 .. SetOption177 uint32_t use_esp32_temperature : 1; // bit 0 (v12.1.1.1) - SetOption146 - (ESP32) Show ESP32 internal temperature sensor - uint32_t mqtt_disable_publish : 1; // bit 1 (v12.1.1.2) - SetOption147 - (MQTT) Disable publish SSerialReceived/IRReceived MQTT messages, you must use event trigger rules instead. + uint32_t mqtt_disable_publish : 1; // bit 1 (v12.1.1.2) - SetOption147 - MQTT_DISABLE_SSERIALRECEIVED - (MQTT) Disable publish SSerialReceived/IRReceived MQTT messages, you must use event trigger rules instead. uint32_t artnet_autorun : 1; // bit 2 (v12.2.0.4) - SetOption148 - (Light) start DMX ArtNet at boot, listen to UDP port as soon as network is up uint32_t dns_ipv6_priority : 1; // bit 3 (v12.2.0.6) - SetOption149 - (Wifi) prefer IPv6 DNS resolution to IPv4 address when available. Requires `#define USE_IPV6` uint32_t no_voltage_common : 1; // bit 4 (v12.3.1.5) - SetOption150 - (Energy) Force no voltage/frequency common - uint32_t matter_enabled : 1; // bit 5 (v12.3.1.5) - SetOption151 - (Matter) Enable Matter protocol over Wifi + uint32_t matter_enabled : 1; // bit 5 (v12.3.1.5) - SetOption151 - MATTER_ENABLED - (Matter) Enable Matter protocol over Wifi uint32_t bistable_single_pin : 1; // bit 6 (v12.5.0.1) - SetOption152 - (Power) Switch between two (0) or one (1) pin bistable relay control uint32_t berry_no_autoexec : 1; // bit 7 (v12.5.0.3) - SetOption153 - (Berry) Disable autoexec.be on restart (1) uint32_t berry_light_scheme : 1; // bit 8 (v12.5.0.3) - SetOption154 - (Berry) Handle berry led using RMT0 as additional WS2812 scheme uint32_t zcfallingedge : 1; // bit 9 (v13.0.0.1) - SetOption155 - (ZCDimmer) Enable rare falling Edge dimmer instead of leading edge uint32_t sen5x_passive_mode : 1; // bit 10 (v13.1.0.1) - SetOption156 - (Sen5x) Run in passive mode when there is another I2C master (e.g. Ikea Vindstyrka), i.e. do not set up Sen5x sensor, higher polling interval uint32_t neopool_outputsensitive : 1; // bit 11 (v13.2.0.1) - SetOption157 - (NeoPool) Output sensitive data (1) - uint32_t mqtt_disable_modbus : 1; // bit 12 (v13.3.0.5) - SetOption158 - (MQTT) Disable publish ModbusReceived MQTT messages (1), you must use event trigger rules instead + uint32_t mqtt_disable_modbus : 1; // bit 12 (v13.3.0.5) - SetOption158 - MQTT_DISABLE_MODBUSRECEIVED - (MQTT) Disable publish ModbusReceived MQTT messages (1), you must use event trigger rules instead uint32_t counter_both_edges : 1; // bit 13 (v13.3.0.5) - SetOption159 - (Counter) Enable counting on both rising and falling edge (1) uint32_t ld2410_use_pin : 1; // bit 14 (v14.3.0.2) - SetOption160 - (LD2410) Disable generate moving event by sensor report - use LD2410 out pin for events (1) - uint32_t gui_no_state_text : 1; // bit 15 (v14.3.0.7) - SetOption161 - (GUI) Disable display of state text (1) + uint32_t gui_no_state_text : 1; // bit 15 (v14.3.0.7) - SetOption161 - GUI_NOSHOW_STATETEXT - (GUI) Disable display of state text (1) uint32_t no_export_energy_today : 1; // bit 16 (v14.3.0.7) - SetOption162 - (Energy) Do not add export energy to energy today (1) - uint32_t spare17 : 1; // bit 17 - uint32_t spare18 : 1; // bit 18 + uint32_t gui_device_name : 1; // bit 17 (v14.4.1.1) - SetOption163 - GUI_NOSHOW_DEVICENAME - (GUI) Disable display of GUI device name (1) + uint32_t wizmote_enabled : 1; // bit 18 (v14.4.1.4) - SetOption164 - (WizMote) Enable WiZ Smart Remote support (1) uint32_t spare19 : 1; // bit 19 uint32_t spare20 : 1; // bit 20 uint32_t spare21 : 1; // bit 21 @@ -222,18 +222,18 @@ typedef union { uint32_t spare00 : 1; uint32_t speed_conversion : 3; // (v8.1.0.10) - Tx2x sensor uint32_t time_format : 2; // (v6.6.0.9) - CMND_TIME - uint32_t calc_resolution : 3; + uint32_t calc_resolution : 3; // CALC_RESOLUTION uint32_t weight_resolution : 2; uint32_t frequency_resolution : 2; uint32_t axis_resolution : 2; - uint32_t current_resolution : 2; + uint32_t current_resolution : 2; // 2 uint32_t voltage_resolution : 2; uint32_t wattage_resolution : 2; - uint32_t emulation : 2; - uint32_t energy_resolution : 3; - uint32_t pressure_resolution : 2; - uint32_t humidity_resolution : 2; - uint32_t temperature_resolution : 2; + uint32_t emulation : 2; // EMULATION + uint32_t energy_resolution : 3; // ENERGY_RESOLUTION + uint32_t pressure_resolution : 2; // PRESSURE_RESOLUTION + uint32_t humidity_resolution : 2; // HUMIDITY_RESOLUTION + uint32_t temperature_resolution : 2; // TEMP_RESOLUTION }; } SysMBitfield1; @@ -241,15 +241,10 @@ typedef union { typedef union { uint32_t data; // Allow bit manipulation struct { - uint32_t spare00 : 1; // bit 0 - uint32_t spare01 : 1; // bit 1 - uint32_t spare02 : 1; // bit 2 - uint32_t spare03 : 1; // bit 3 - uint32_t spare04 : 1; // bit 4 - uint32_t spare05 : 1; // bit 5 - uint32_t spare06 : 1; // bit 6 - uint32_t spare07 : 1; // bit 7 - uint32_t spare08 : 1; // bit 8 + uint32_t log_file_idx : 4; // bit 0.3 (v14.4.1.2) - FileLog log rotate index + uint32_t light_pixels_order : 3; // bit 4.6 (v14.4.1.3) - LED light order /GRB/RGB/RBG/BRG/BGR/GBR, high bit indicates W before (for RGBW) + uint32_t light_pixels_rgbw : 1; // bit 7 (v14.4.1.3) - LED true is 4 channels RGBW, false is 3 channels RGB + uint32_t light_pixels_w_first : 1; // bit 8 (v14.4.1.3) - LED true if W channel comes first, default is W uint32_t spare09 : 1; // bit 9 uint32_t spare10 : 1; // bit 10 uint32_t spare11 : 1; // bit 11 @@ -264,7 +259,7 @@ typedef union { uint32_t FTP_Mode : 2; // bit 24/25 uint32_t tariff_forced : 2; // bit 26/27 (v12.4.0.2) - Energy forced tariff : 0=tariff change on time, 1|2=tariff forced uint32_t sunrise_dawn_angle : 2; // bit 28/29 (v12.1.1.4) - - uint32_t temperature_set_res : 2; // bit 30/31 (v9.3.1.4) - (Tuya) + uint32_t temperature_set_res : 2; // bit 30/31 (v9.3.1.4) - TUYA_TEMP_SET_RES - (Tuya) }; } SysMBitfield2; @@ -665,7 +660,8 @@ typedef struct { // ---------------------------------------- #endif // ESP32S3 - uint16_t light_pixels; // 496 + uint16_t light_pixels : 15; // 496 + uint16_t light_pixels_reverse : 1; // 496 uint8_t light_color[LST_MAX]; // 498 LST_MAX = 5 uint8_t light_correction; // 49D uint8_t light_dimmer; // 49E @@ -695,9 +691,7 @@ typedef struct { uint16_t influxdb_period; // 538 520 uint16_t rf_duplicate_time; // 53A 522 uint8_t global_sensor_index[3]; // 53C 4C5 - - uint8_t free_53F[1]; // 53F - + uint8_t filelog_level; // 53F uint16_t tcp_baudrate; // 540 uint16_t button_debounce; // 542 uint32_t ipv4_address[5]; // 544 @@ -786,8 +780,10 @@ typedef struct { uint8_t web_color2[2][3]; // EA0 Needs to be on integer / 3 distance from web_color uint16_t zcdimmerset[5]; // EA6 - uint8_t free_eb0[22]; // EB0 22 bytes + uint8_t free_eb0[20]; // EB0 20 bytes + uint16_t light_pixels_height_1 : 15;// EC4 Pixels height minus 1, default 0 (0 means 1 line) + uint16_t light_pixels_alternate : 1;// EC4 Indicates alternate lines in Pixels Matrix uint8_t shift595_device_count; // EC6 uint8_t sta_config; // EC7 uint8_t sta_active; // EC8 diff --git a/tasmota/include/tasmota_version.h b/tasmota/include/tasmota_version.h index 4c0eac0dd..94b5bd598 100644 --- a/tasmota/include/tasmota_version.h +++ b/tasmota/include/tasmota_version.h @@ -22,6 +22,6 @@ #define TASMOTA_SHA_SHORT // Filled by Github sed -const uint32_t TASMOTA_VERSION = 0x0E040100; // 14.4.1.0 +const uint32_t TASMOTA_VERSION = 0x0E050000; // 14.5.0.0 #endif // _TASMOTA_VERSION_H_ diff --git a/tasmota/include/xsns_62_esp32_mi.h b/tasmota/include/xsns_62_esp32_mi.h index 27b4ad231..4b8f6ea87 100644 --- a/tasmota/include/xsns_62_esp32_mi.h +++ b/tasmota/include/xsns_62_esp32_mi.h @@ -235,7 +235,7 @@ struct { uint32_t handleEveryDevice:1; } option; #ifdef USE_MI_EXT_GUI - uint32_t widgetSlot; + uint32_t widgetSlot = 0; #ifdef USE_ENERGY_SENSOR uint8_t energy_history[24]; #endif //USE_ENERGY_SENSOR diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index e0a26ee7a..98a31b0e3 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Wagwoord geverifieer" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fout" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index f0b317798..51b4f4ac3 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "А" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Грешка" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Дебитомер" #define D_FLOWRATEMETER_AMOUNT_TODAY "Количество днес" diff --git a/tasmota/language/ca_AD.h b/tasmota/language/ca_AD.h index abcb53f07..6e9f6f999 100644 --- a/tasmota/language/ca_AD.h +++ b/tasmota/language/ca_AD.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Mot de pas verificat" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Cabal" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index d776d1111..ddfdbbf6e 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 4c43ec325..c1ea4dd30 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Übereinstimmung" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fehler" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Durchflussmesser" #define D_FLOWRATEMETER_AMOUNT_TODAY "Menge heute" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 4a75cae60..5eeecb716 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 19312fd4e..43fc302aa 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -700,13 +700,13 @@ #define D_SENSOR_DS18X20 "DS18x20" #define D_SENSOR_I2C_SCL "I2C SCL" #define D_SENSOR_I2C_SDA "I2C SDA" -#define D_SENSOR_I2C_SER_TX "I2C Ser TX" -#define D_SENSOR_I2C_SER_RX "I2C Ser RX" +#define D_SENSOR_I2C_SER_TX "I2C Ser Tx" +#define D_SENSOR_I2C_SER_RX "I2C Ser Rx" #define D_SENSOR_I2S_MCLK "I2S MCLK" #define D_SENSOR_I2S_BCLK "I2S BCLK" -#define D_SENSOR_I2S_WS_IN "I2S BCLK IN" +#define D_SENSOR_I2S_WS_IN "I2S BCLK In" #define D_SENSOR_I2S_WS "I2S WS" -#define D_SENSOR_I2S_BCLK_IN "I2S WS IN" +#define D_SENSOR_I2S_BCLK_IN "I2S WS In" #define D_SENSOR_I2S_DIN "I2S DIN" #define D_SENSOR_I2S_DOUT "I2S DOUT" #define D_SENSOR_I2S_DAC "I2S DAC" @@ -749,7 +749,7 @@ #define D_SENSOR_SDIO_D1 "SDIO D1" #define D_SENSOR_SDIO_D2 "SDIO D2" #define D_SENSOR_SDIO_D3 "SDIO D3" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" @@ -761,8 +761,8 @@ #define D_SENSOR_MBR_TX "ModBr Tx" #define D_SENSOR_MBR_RX "ModBr Rx" #define D_SENSOR_MBR_TX_ENA "ModBr Tx Ena" -#define D_SENSOR_SR04_TRIG "SR04 Tri/TX" -#define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SR04_TRIG "SR04 Tri/Tx" +#define D_SENSOR_SR04_ECHO "SR04 Ech/Rx" #define D_SENSOR_NRG_MBS_TX "NrgMbs Tx" #define D_SENSOR_NRG_MBS_RX "NrgMbs Rx" #define D_SENSOR_NRG_MBS_TX_ENA "NrgMbs Tx Ena" @@ -778,8 +778,8 @@ #define D_SENSOR_WE517_RX "WE517 Rx" #define D_SENSOR_LD2410_TX "LD2410 Tx" #define D_SENSOR_LD2410_RX "LD2410 Rx" -#define D_SENSOR_LD2410S_TX "LD2410S Tx" -#define D_SENSOR_LD2410S_RX "LD2410S Rx" +#define D_SENSOR_LD2410S_TX "LD2410S Tx" +#define D_SENSOR_LD2410S_RX "LD2410S Rx" #define D_GPIO_TM1621_CS "TM1621 CS" #define D_GPIO_TM1621_WR "TM1621 WR" #define D_GPIO_TM1621_RD "TM1621 RD" @@ -791,9 +791,9 @@ #define D_SENSOR_TM1638_STB "TM1638 STB" #define D_SENSOR_TM1640_CLK "TM1640 CLK" #define D_SENSOR_TM1640_DIN "TM1640 DIN" -#define D_SENSOR_MAX7219_DIN "MAX7219 DIN" +#define D_SENSOR_MAX7219_DIN "MAX7219 DIN" #define D_SENSOR_MAX7219_CS "MAX7219 CS" -#define D_SENSOR_MAX7219_CLK "MAX7219 CLK" +#define D_SENSOR_MAX7219_CLK "MAX7219 CLK" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -870,9 +870,9 @@ #define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" #define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" #define D_SENSOR_SOLAXX1_RTS "SolaxX1 RTS" -#define D_SENSOR_IBEACON_TX "iBeacon TX" -#define D_SENSOR_IBEACON_RX "iBeacon RX" -#define D_SENSOR_RDM6300_RX "RDM6300 RX" +#define D_SENSOR_IBEACON_TX "iBeacon Tx" +#define D_SENSOR_IBEACON_RX "iBeacon Rx" +#define D_SENSOR_RDM6300_RX "RDM6300 Rx" #define D_SENSOR_CC1101_CS "CC1101 CS" #define D_SENSOR_A4988_DIR "A4988 DIR" #define D_SENSOR_A4988_STP "A4988 STP" @@ -894,17 +894,17 @@ #define D_SENSOR_SM2335_DAT "SM2335 Dat" #define D_SENSOR_BP1658CJ_CLK "BP1658CJ Clk" #define D_SENSOR_BP1658CJ_DAT "BP1658CJ Dat" -#define D_SENSOR_BP5758D_CLK "BP5758D Clk" -#define D_SENSOR_BP5758D_DAT "BP5758D Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" -#define D_SENSOR_CLIENT_TX "Client TX" -#define D_SENSOR_CLIENT_RX "Client RX" -#define D_SENSOR_CLIENT_RESET "Client RST" -#define D_SENSOR_GPS_RX "GPS RX" -#define D_SENSOR_GPS_TX "GPS TX" -#define D_SENSOR_HM10_RX "HM10 RX" -#define D_SENSOR_HM10_TX "HM10 TX" +#define D_SENSOR_CLIENT_TX "Client Tx" +#define D_SENSOR_CLIENT_RX "Client Rx" +#define D_SENSOR_CLIENT_RESET "Client Rst" +#define D_SENSOR_GPS_RX "GPS Rx" +#define D_SENSOR_GPS_TX "GPS Tx" +#define D_SENSOR_HM10_RX "HM10 Rx" +#define D_SENSOR_HM10_TX "HM10 Tx" #define D_SENSOR_LE01MR_RX "LE-01MR Rx" #define D_SENSOR_LE01MR_TX "LE-01MR Tx" #define D_SENSOR_BL0940_RX "BL0940 Rx" @@ -947,8 +947,8 @@ #define D_SENSOR_TCP_TXD "TCP Tx" #define D_SENSOR_TCP_TXD_EN "TCP Tx En" #define D_SENSOR_TCP_RXD "TCP Rx" -#define D_SENSOR_IEM3000_TX "iEM3000 TX" -#define D_SENSOR_IEM3000_RX "iEM3000 RX" +#define D_SENSOR_IEM3000_TX "iEM3000 Tx" +#define D_SENSOR_IEM3000_RX "iEM3000 Rx" #define D_SENSOR_MIEL_HVAC_TX "MiEl HVAC Tx" #define D_SENSOR_MIEL_HVAC_RX "MiEl HVAC Rx" #define D_SENSOR_PROJECTOR_CTRL_TX "DLP Tx" @@ -978,8 +978,8 @@ #define D_SENSOR_NEOPOOL_TX "NeoPool Tx" #define D_SENSOR_NEOPOOL_RX "NeoPool Rx" #define D_SENSOR_VL53LXX_XSHUT "VL53LXX XSHUT" -#define D_SENSOR_TFMINIPLUS_TX "TFmini+ TX" -#define D_SENSOR_TFMINIPLUS_RX "TFmini+ RX" +#define D_SENSOR_TFMINIPLUS_TX "TFmini+ Tx" +#define D_SENSOR_TFMINIPLUS_RX "TFmini+ Rx" #define D_SENSOR_ZEROCROSS "ZC Pulse" #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" @@ -1004,19 +1004,25 @@ #define D_GPIO_DINGTIAN_PL "Dingtian PL" #define D_GPIO_DINGTIAN_OE "Dingtian OE" #define D_GPIO_DINGTIAN_RCK "Dingtian RCK" -#define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_TX "CM110x Tx" +#define D_SENSOR_CM11_RX "CM110x Rx" #define D_SENSOR_FLOWRATEMETER "Flowrate" #define D_SENSOR_ME007_TRIG "ME007 Tri" #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" -#define D_SENSOR_LOX_O2_RX "LoxO2 RX" +#define D_SENSOR_LOX_O2_RX "LoxO2 Rx" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 3d4ad847e..4c243c834 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Clave Correcta" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index e87a1193c..b89b5476d 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units @@ -1213,6 +1219,13 @@ #define D_FP_PASSVERIFY "Mot-de-passe vérifié" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Erreur" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Débit" #define D_FLOWRATEMETER_AMOUNT_TODAY "Quantité aujourd'hui" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index e00a178c2..b3df21bbb 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 1179797b6..06923f13c 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 64b10fb22..69962aad5 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -1011,15 +1011,25 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1215,6 +1225,13 @@ #define D_FP_PASSVERIFY "Jelszó ellenőrizve" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Hiba" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 00254ca7a..849b43f37 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.4.0.1 - Last update 07.12.2024 + * Updated until v9.4.0.1 - Last update 31.01.2025 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -761,8 +761,8 @@ #define D_SENSOR_MBR_TX "ModBr - TX" #define D_SENSOR_MBR_RX "ModBr - RX" #define D_SENSOR_MBR_TX_ENA "ModBr - TX ON" -#define D_SENSOR_SR04_TRIG "SR04 Tri - TX" -#define D_SENSOR_SR04_ECHO "SR04 Ech - RX" +#define D_SENSOR_SR04_TRIG "SR04 - Tri/TX" +#define D_SENSOR_SR04_ECHO "SR04 - Ech/RX" #define D_SENSOR_NRG_MBS_TX "NrgMbs - TX" #define D_SENSOR_NRG_MBS_RX "NrgMbs - RX" #define D_SENSOR_NRG_MBS_TX_ENA "NrgMbs - TX ON" @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 - RX" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr - TX" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr - RX" +#define D_SENSOR_TWAI_TX "TWAI - TX" +#define D_SENSOR_TWAI_RX "TWAI - RX" +#define D_SENSOR_TWAI_BO "TWAI - BusOff" +#define D_SENSOR_TWAI_CLK "TWAI - ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX - TX" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 - RX" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 - RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis - RX" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K - RX" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K - TX" // Units #define D_UNIT_AMPERE "A" @@ -1189,28 +1195,35 @@ #define D_FP_ENROLL_ACTIVE "Attivo" #define D_FP_ENROLL_INACTIVE "Non attivo" // Indexed by Adafruit_Fingerprint.h defines -#define D_FP_PACKETRECIEVEERR "Errore comunicazione" // 0x01 Error when receiving data package -#define D_FP_NOFINGER "" // 0x02 No finger on the sensor -#define D_FP_IMAGEFAIL "Errore immagine" // 0x03 Failed to enroll the finger -#define D_FP_IMAGEMESS "Immmagine troppo danneggiata" // 0x06 Failed to generate character file due to overly disorderly fingerprint image -#define D_FP_FEATUREFAIL "Impronta troppo piccola" // 0x07 Failed to generate character file due to the lack of character point or small fingerprint image -#define D_FP_NOMATCH "Nessuna corrispondenza" // 0x08 Finger doesn't match -#define D_FP_NOTFOUND "Corrispondenza non trovata" // 0x09 Failed to find matching finger -#define D_FP_ENROLLMISMATCH "L'impronta non corrisponde" // 0x0A Failed to combine the character files -#define D_FP_BADLOCATION "Locazione errata" // 0x0B Addressed PageID is beyond the finger library -#define D_FP_DBRANGEFAIL "Errore intervallo DB" // 0x0C Error when reading template from library or invalid template -#define D_FP_UPLOADFEATUREFAIL "Errore funzione upload" // 0x0D Error when uploading template -#define D_FP_PACKETRESPONSEFAIL "Errore risposta pacchetto" // 0x0E Module failed to receive the following data packages -#define D_FP_UPLOADFAIL "Errore upload" // 0x0F Error when uploading image -#define D_FP_DELETEFAIL "Errore eliminazione" // 0x10 Failed to delete the template -#define D_FP_DBCLEARFAIL "Errore azzeramento DB" // 0x11 Failed to clear finger library -#define D_FP_PASSFAIL "Errore password" // 0x13 Find whether the fingerprint passed or failed -#define D_FP_INVALIDIMAGE "Immagine non valida" // 0x15 Failed to generate image because of lac of valid primary image -#define D_FP_FLASHERR "Errore scrittura flash" // 0x18 Error when writing flash -#define D_FP_INVALIDREG "Numero non valido" // 0x1A Invalid register number -#define D_FP_ADDRCODE "Codice indirizzo" // 0x20 Address code -#define D_FP_PASSVERIFY "Password verificata" // 0x21 Verify the fingerprint passed -#define D_FP_UNKNOWNERROR "Errore" // Any other error +#define D_FP_PACKETRECIEVEERR "Errore comunicazione" // 0x01 Error when receiving data package +#define D_FP_NOFINGER "" // 0x02 No finger on the sensor +#define D_FP_IMAGEFAIL "Errore immagine" // 0x03 Failed to enroll the finger +#define D_FP_IMAGEMESS "Immmagine troppo danneggiata" // 0x06 Failed to generate character file due to overly disorderly fingerprint image +#define D_FP_FEATUREFAIL "Impronta troppo piccola" // 0x07 Failed to generate character file due to the lack of character point or small fingerprint image +#define D_FP_NOMATCH "Nessuna corrispondenza" // 0x08 Finger doesn't match +#define D_FP_NOTFOUND "Corrispondenza non trovata" // 0x09 Failed to find matching finger +#define D_FP_ENROLLMISMATCH "L'impronta non corrisponde" // 0x0A Failed to combine the character files +#define D_FP_BADLOCATION "Locazione errata" // 0x0B Addressed PageID is beyond the finger library +#define D_FP_DBRANGEFAIL "Errore intervallo DB" // 0x0C Error when reading template from library or invalid template +#define D_FP_UPLOADFEATUREFAIL "Errore funzione upload" // 0x0D Error when uploading template +#define D_FP_PACKETRESPONSEFAIL "Errore risposta pacchetto" // 0x0E Module failed to receive the following data packages +#define D_FP_UPLOADFAIL "Errore upload" // 0x0F Error when uploading image +#define D_FP_DELETEFAIL "Errore eliminazione" // 0x10 Failed to delete the template +#define D_FP_DBCLEARFAIL "Errore azzeramento DB" // 0x11 Failed to clear finger library +#define D_FP_PASSFAIL "Errore password" // 0x13 Find whether the fingerprint passed or failed +#define D_FP_INVALIDIMAGE "Immagine non valida" // 0x15 Failed to generate image because of lac of valid primary image +#define D_FP_FLASHERR "Errore scrittura flash" // 0x18 Error when writing flash +#define D_FP_INVALIDREG "Numero non valido" // 0x1A Invalid register number +#define D_FP_ADDRCODE "Codice indirizzo" // 0x20 Address code +#define D_FP_PASSVERIFY "Password verificata" // 0x21 Verify the fingerprint passed +#define D_FP_UNKNOWNERROR "Errore" // Any other error + +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valido" +#define D_HRG_ACTIVE "Attivo" +#define D_HRG_EVENT "Evento" +#define D_HRG_TOTAL "Totale" +#define D_HRG_FLOWRATE "Portata" // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Portata" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 314f246bc..96daa238c 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/lt_LT.h b/tasmota/language/lt_LT.h new file mode 100644 index 000000000..776b5c140 --- /dev/null +++ b/tasmota/language/lt_LT.h @@ -0,0 +1,1317 @@ +/* + lt-LT.h - localization for Lithuanian - Lithuanian for Tasmota + + Copyright (C) 2021 Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _LANGUAGE_LT_LT_H_ +#define _LANGUAGE_LT_LT_H_ + +/*************************** ATTENTION *******************************\ + * + * Due to memory constraints only UTF-8 is supported. + * To save code space keep text as short as possible. + * Time and Date provided by SDK can not be localized (yet). + * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. + * Use online command Prefix to translate cmnd, stat and tele. + * + * Updated until v14.4.1 - Last update 09.02.2024 +\*********************************************************************/ + +//#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) + +#define LANGUAGE_LCID 1063 +// HTML (ISO 639-1) Language Code +#define D_HTML_LANGUAGE "lt" + +// "2017-03-07T11:08:02" - ISO8601:2004 +#define D_YEAR_MONTH_SEPARATOR "-" +#define D_MONTH_DAY_SEPARATOR "-" +#define D_DATE_TIME_SEPARATOR "T" +#define D_HOUR_MINUTE_SEPARATOR ":" +#define D_MINUTE_SECOND_SEPARATOR ":" + +#define D_DAY3LIST "SekPirAntTreKetPenŠeŠe" +#define D_MONTH3LIST "SauVasKovBalGegBirLieRugRgsSpaLapGru" + +// Non JSON decimal separator +#define D_DECIMAL_SEPARATOR "." + +// Common +#define D_ABSOLUTE_HUMIDITY "Absoliuti drėgmė" +#define D_ADMIN "Administratoriaus" +#define D_AIR_QUALITY "Oro kokybė" +#define D_AP "AP" // Access Point +#define D_AS "kaip" +#define D_AT "prie" +#define D_AUTO "AUTOMATINĖ" +#define D_BATTERY "Baterija" +#define D_BATT "Baterija" // Short for Battery +#define D_BATTERY_CHARGE "Įkrova" // Battery charge in % +#define D_BLINK "Mirksėti" +#define D_BLINKOFF "Mirksėjimas išjungtas" +#define D_BOOT_COUNT "Pakrovimų skaičius" +#define D_BRIGHTLIGHT "Šviesus" +#define D_BSSID "BSSId" +#define D_BUTTON "Mygtukas" +#define D_BY "autorius" +#define D_BYTES "Bytes" +#define D_CELSIUS "Celsijus" +#define D_CHANNEL "Kanalas" +#define D_CO2 "Anglies dioksidas" +#define D_CODE "kodas" // Button code +#define D_COLDLIGHT "Šalta" +#define D_COMMAND "Komanda" +#define D_CONNECTED "Prisijungta" +#define D_CORS_DOMAIN "CORS Domenas" +#define D_COLOR "Spalva" +#define D_COUNT "Skaičius" +#define D_COUNTER "Skaitiklis" +#define D_CT_POWER "CT Galia" +#define D_CURRENT "Srovė" // As in Voltage and Current +#define D_CURRENT_NEUTRAL "Neutralios linijos srovė" +#define D_DATA "Duomenys" +#define D_DARKLIGHT "Tamsu" +#define D_DEBUG "Derinimas" +#define D_DEWPOINT "Rasos taškas" +#define D_DISABLED "Išjungta" +#define D_DISTANCE "Atstumas" +#define D_DNS_SERVER "DNS Serveris" +#define D_DO "Ištirpęs deguonis" +#define D_DONE "Atlikta" +#define D_DST_TIME "DST" +#define D_EC "EC" +#define D_ECO2 "eCO₂" +#define D_EMULATION "Emuliacija" +#define D_ENABLED "Įjungta" +#define D_ERASE "Ištrinti" +#define D_ERROR "Klaida" +#define D_FAHRENHEIT "Fahrenheit" +#define D_FAILED "Nepavyko" +#define D_FALLBACK "Atsarginis režimas" +#define D_FALLBACK_TOPIC "Atsarginė tema" +#define D_FALSE "Išjungta" +#define D_FILE "Failas" +#define D_FILE_SYSTEM_SIZE "Failų sistemos dydis" +#define D_FLOW_RATE "Srauto greitis" +#define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" +#define D_FRAME_RATE "Kadrų dažnis" +#define D_FREE_MEMORY "Laisva atmintis" +#define D_PSR_MAX_MEMORY "PS-RAM atmintis" +#define D_PSR_FREE_MEMORY "Laisva PS-RAM atmintis" +#define D_FREQUENCY "Dažnis" +#define D_GAS "Dujos" +#define D_GATEWAY "Tinklo vartai" +#define D_GROUP "Grupė" +#define D_HOST "Serveris" +#define D_HALL_EFFECT "Holo efektas" +#define D_HEATINDEX "Karščio indeksas" +#define D_HOSTNAME "Mazgo pavadinimas" +#define D_HUMIDITY "Drėgmė" +#define D_ILLUMINANCE "Apšvietimas" +#define D_IMMEDIATE "nedelsiant" // Mygtuko veikimas nedelsiant +#define D_INDEX "Indeksas" +#define D_INFO "Informacija" +#define D_INFRARED "Infraraudonieji spinduliai" +#define D_INITIALIZED "Inicializuota" +#define D_IP_ADDRESS "IP adresas" +#define D_LIGHT "Šviesa" +#define D_LWT "LWT" // Palikti taip pat, nes susiję su MQTT Last Will and Testament +#define D_LQI "LQI" // Zigbee ryšio kokybės indeksas +#define D_MODULE "Modulis" +#define D_MOISTURE "Drėgmės lygis" +#define D_MQTT "MQTT" +#define D_MULTI_PRESS "kelių paspaudimų funkcija" +#define D_NOISE "Triukšmas" +#define D_NONE "Nėra" +#define D_NOX "NOx" +#define D_O2 "Deguonis" +#define D_OFF "Išjungta" +#define D_OFFLINE "Neprisijungęs" +#define D_OK "Gerai" +#define D_ON "Įjungta" +#define D_ONLINE "Prisijungęs" +#define D_ORP "ORP" +#define D_PASSWORD "Slaptažodis" +#define D_PH "pH" +#define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition +#define D_PORT "Prievadas" +#define D_POWER_FACTOR "Galios koeficientas" +#define D_POWERUSAGE "Energijos suvartojimas" +#define D_POWERUSAGE_ACTIVE "Aktyvioji galia" +#define D_POWERUSAGE_ACTIVE_TOTAL "Bendra aktyvioji galia" +#define D_POWERUSAGE_APPARENT "Tikroji galia" +#define D_POWERUSAGE_REACTIVE "Reaktyvioji galia" +#define D_PRESSURE "Slėgis" +#define D_PRESSUREATSEALEVEL "Slėgis jūros lygyje" +#define D_PROGRAM_FLASH_SIZE "Programos Flash dydis" +#define D_PROGRAM_SIZE "Programos dydis" +#define D_PROJECT "Projektas" +#define D_RAIN "Lietus" +#define D_RANGE "Diapazonas" +#define D_RECEIVED "Gauta" +#define D_RESTART "Paleisti iš naujo" +#define D_RESTARTING "Paleidžiama iš naujo" +#define D_RESTART_REASON "Perkrovimo priežastis" +#define D_RETAINED "išlaikyta" +#define D_RULE "Taisyklė" +#define D_SAVE "Išsaugoti" +#define D_SENSOR "Jutiklis" +#define D_SSID "SSId" +#define D_START "Pradėti" +#define D_STD_TIME "Standartinis laikas" +#define D_STOP "Stabdyti" +#define D_SUBNET_MASK "Potinklio kaukė" +#define D_SUBSCRIBE_TO "Prenumeruoti" +#define D_UNSUBSCRIBE_FROM "Atsisakyti prenumeratos" +#define D_SUCCESSFUL "Sėkmingai" +#define D_SUNRISE "Saulėtekis" +#define D_SUNSET "Saulėlydis" +#define D_TEMPERATURE "Temperatūra" +#define D_TO "į" +#define D_TOGGLE "Perjungti" +#define D_TOPIC "Topic" +#define D_TOTAL_USAGE "Bendras naudojimas" +#define D_TRANSMIT "Siųsti" +#define D_TRUE "Įjungta" +#define D_TVOC "TVOC" +#define D_TWILIGHT_ASTRONOMICAL "Astronominis" +#define D_TWILIGHT_CIVIL "Pilietinis" +#define D_TWILIGHT_NAUTICAL "Jūrinis" +#define D_UPLOAD "Įkelti" +#define D_UPTIME "Veikimo laikas" +#define D_USED "naudota" +#define D_USER "Naudotojas" +#define D_UTC_TIME "UTC" +#define D_UV_INDEX "UV Indeksas" +#define D_UV_INDEX_1 "Žemas" +#define D_UV_INDEX_2 "Vidutinis" +#define D_UV_INDEX_3 "Aukštas" +#define D_UV_INDEX_4 "Pavojingas" +#define D_UV_INDEX_5 "BurnL1/2" +#define D_UV_INDEX_6 "BurnL3" +#define D_UV_INDEX_7 "Už ribų" // Out of Range +#define D_UV_LEVEL "UV Lygis" +#define D_UV_POWER "UV Galia" +#define D_VERSION "Versija" +#define D_VOC "VOC" +#define D_VOLTAGE "Įtampa" +#define D_VOLUME "Tūris" +#define D_WEIGHT "Svoris" +#define D_WARMLIGHT "Šilta" +#define D_WEB_SERVER "Web serveris" +#define D_SOC "Įkrovos būsena" +#define D_SOH "State of Health" +#define D_WATER_DEPTH "Vandens gylis" + +// tasmota.ino +#define D_WARNING_MINIMAL_VERSION "ĮSPĖJIMAS: Ši versija nepalaiko nuolatinių nustatymų" +#define D_LEVEL_10 "lygis 1-0" +#define D_LEVEL_01 "lygis 0-1" +#define D_SERIAL_LOGGING_DISABLED "Serijinis logging išjungtas" +#define D_SYSLOG_LOGGING_REENABLED "„Syslog“ logging vėl įjungtas" + +#define D_SET_BAUDRATE_TO "Nustatyti duomenų perdavimo spartą į" +#define D_RECEIVED_TOPIC "Gauta topic" +#define D_DATA_SIZE "Duomenų dydis" +#define D_ANALOG_INPUT "Analoginis" + +// support.ino +#define D_OSWATCH "osWatch" +#define D_BLOCKED_LOOP "Blocked Loop" +#define D_WPS_FAILED_WITH_STATUS "WPSconfig NEPAVYKO, būsena" +#define D_ACTIVE_FOR_3_MINUTES "aktyvus 3 minutes" +#define D_FAILED_TO_START "nepavyko paleisti" +#define D_PATCH_ISSUE_2186 "Pataisyta problema 2186" +#define D_CONNECTING_TO_AP "Jungiamasi prie prieigos taško (AP)" +#define D_IN_MODE "režime" +#define D_CONNECT_FAILED_NO_IP_ADDRESS "Prisijungimas nepavyko – negautas IP adresas" +#define D_CONNECT_FAILED_AP_NOT_REACHED "Prisijungimas nepavyko – nepavyko pasiekti AP" +#define D_CONNECT_FAILED_WRONG_PASSWORD "Prisijungimas nepavyko – neteisingas slaptažodis" +#define D_CONNECT_FAILED_AP_TIMEOUT "Prisijungimas nepavyko – AP atsako laikas baigėsi" +#define D_ATTEMPTING_CONNECTION "Bandoma prisijungti..." +#define D_CHECKING_CONNECTION "Tikrinamas ryšys..." +#define D_QUERY_DONE "Užklausa baigta. Rasti MQTT serveriai" +#define D_MQTT_SERVICE_FOUND "MQTT serveris rastas adresu" +#define D_FOUND_AT "rastas adresu" +#define D_SYSLOG_HOST_NOT_FOUND "Syslog serveris nerastas" + +// settings.ino +#define D_SAVED_TO_FLASH_AT "Išsaugota į Flash at" +#define D_LOADED_FROM_FLASH_AT "Įkelta iš Flash at" +#define D_USE_DEFAULTS "Naudoti numatytuosius nustatymus" +#define D_ERASED_SECTOR "Ištrintas sektorius" + +// xdrv_02_webserver.ino +#define D_NOSCRIPT "Norėdami naudoti Tasmota, įjunkite JavaScript" +#define D_SAFEBOOT "SAUGUS PALEIDIMAS" +#define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMALI programinė įranga
prašome atnaujinti" +#define D_WEBSERVER_ACTIVE_ON "Web serveris aktyvus" +#define D_WITH_IP_ADDRESS "su IP adresu" +#define D_WEBSERVER_STOPPED "Web serveris sustabdytas" +#define D_FILE_NOT_FOUND "Failas nerastas" +#define D_REDIRECTED "Peradresuota į Captive Portal" +#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wifimanager nustatė prieigos tašką ir išsaugojo stotį" +#define D_WIFIMANAGER_SET_ACCESSPOINT "Wifimanager nustatė prieigos tašką" +#define D_TRYING_TO_CONNECT "Bandoma prijungti įrenginį prie tinklo" + +#define D_RESTART_IN "Perkrauti per" +#define D_SECONDS "sekundes" +#define D_DEVICE_WILL_RESTART "Įrenginys bus perkrautas per kelias sekundes" +#define D_BUTTON_TOGGLE "Perjungti" +#define D_CONFIGURATION "Konfigūracija" +#define D_INFORMATION "Informacija" +#define D_FIRMWARE_UPGRADE "Programinės įrangos atnaujinimas" +#define D_MANAGEMENT "Įrankiai" +#define D_GPIO_VIEWER "GPIO Peržiūra" +#define D_CONSOLE "Konsolė" +#define D_CONFIRM_RESTART "Patvirtinkite perkrovimą" + +#define D_CONFIGURE_MODULE "Modulis" +#define D_CONFIGURE_WIFI "WiFi" +#define D_CONFIGURE_MQTT "MQTT" +#define D_CONFIGURE_DOMOTICZ "Domoticz" +#define D_CONFIGURE_LOGGING "Logging" +#define D_CONFIGURE_OTHER "Kiti" +#define D_CONFIRM_RESET_CONFIGURATION "Patvirtinkite konfigūracijos atstatymą" +#define D_RESET_CONFIGURATION "Atstatyti" +#define D_BACKUP_CONFIGURATION "Atsarginė kopija" +#define D_RESTORE_CONFIGURATION "Atkurti" +#define D_START_RESTORE "Pradėti atkūrimą" +#define D_MAIN_MENU "Pagrindinis meniu" + +#define D_MODULE_PARAMETERS "Modulio parametrai" +#define D_MODULE_TYPE "Modulio tipas" +#define D_PULLUP_ENABLE "Be mygtuko/perjungėjo pull-up" +#define D_ADC "ADC" +#define D_GPIO "GPIO" +#define D_SERIAL_IN "Serijinė įvestis" +#define D_SERIAL_OUT "Serijinė išvestis" + +#define D_WIFI_PARAMETERS "WiFi parametrai" +#define D_SCAN_FOR_WIFI_NETWORKS "Ieškoti WiFi tinklų" +#define D_SCAN_DONE "Paieška baigta" +#define D_NO_NETWORKS_FOUND "Tinklų nerasta" +#define D_REFRESH_TO_SCAN_AGAIN "Perkraukite, kad vėl atliktumėte paiešką" +#define D_DUPLICATE_ACCESSPOINT "Prieigos taško duplikatas" +#define D_SKIPPING_LOW_QUALITY "Praleidžiama dėl prastos kokybės" +#define D_MODE "Režimas" +#define D_RSSI "RSSI" +#define D_WEP "WEP" +#define D_WPA_PSK "WPA PSK" +#define D_WPA2_PSK "WPA2 PSK" +#define D_AP1_SSID "WiFi tinklas" +#define D_AP1_SSID_HELP "Įveskite arba pasirinkite savo WiFi tinklą" +#define D_AP2_SSID "WiFi tinklas 2" +#define D_AP2_SSID_HELP "Įveskite savo alternatyvų WiFi tinklą" +#define D_AP_PASSWORD "WiFi slaptažodis" +#define D_AP_PASSWORD_HELP "Įveskite savo WiFi slaptažodį" +#define D_SELECT_YOUR_WIFI_NETWORK "Pasirinkite savo WiFi tinklą" +#define D_SHOW_MORE_WIFI_NETWORKS "Ieškoti visų WiFi tinklų" +#define D_SHOW_MORE_OPTIONS "Daugiau parinkčių" +#define D_CHECK_CREDENTIALS "Prašome patikrinti savo prisijungimo duomenis" +#define D_SUCCESSFUL_WIFI_CONNECTION "Sėkmingas WiFi prisijungimas" +#define D_NOW_YOU_CAN_CLOSE_THIS_WINDOW "Dabar galite uždaryti šį langą" +#define D_REDIRECTING_TO_NEW_IP "Peradresuojama į naują įrenginio IP adresą" + +#define D_MQTT_PARAMETERS "MQTT parametrai" +#define D_CLIENT "Klientas" +#define D_FULL_TOPIC "Full Topic" + +#define D_LOGGING_PARAMETERS "Logging parametrai" +#define D_SERIAL_LOG_LEVEL "Serijinio log lygis" +#define D_MQTT_LOG_LEVEL "MQTT log lygis" +#define D_WEB_LOG_LEVEL "Web log lygis" +#define D_SYS_LOG_LEVEL "Syslog lygis" +#define D_MORE_DEBUG "More debug" +#define D_SYSLOG_HOST "Syslog hostas" +#define D_SYSLOG_PORT "Syslog prievadas" +#define D_TELEMETRY_PERIOD "Telemetrijos periodas" + +#define D_OTHER_PARAMETERS "Kiti parametrai" +#define D_TEMPLATE "Šablonas" +#define D_ACTIVATE "Aktyvuoti" +#define D_DEVICE_NAME "Įrenginio pavadinimas" +#define D_WEB_ADMIN_PASSWORD "Web administratoriaus slaptažodis" +#define D_MQTT_ENABLE "Įjungti MQTT" +#define D_MQTT_TLS_ENABLE "MQTT TLS" +#define D_HTTP_API "HTTP API" +#define D_HTTP_API_ENABLE "Įjungti HTTP API" +#define D_FRIENDLY_NAME "Sutrumpintas pavadinimas" +#define D_BELKIN_WEMO "Belkin WeMo" +#define D_HUE_BRIDGE "Hue Bridge" +#define D_SINGLE_DEVICE "vieno įrenginio" +#define D_MULTI_DEVICE "kelių įrenginių" + +#define D_CONFIGURE_TEMPLATE "Šablonas" +#define D_TEMPLATE_PARAMETERS "Šablono parametrai" +#define D_TEMPLATE_NAME "Pavadinimas" +#define D_BASE_TYPE "Pagal" +#define D_TEMPLATE_FLAGS "Parinktys" + +#define D_SAVE_CONFIGURATION "Išsaugoti konfigūraciją" +#define D_CONFIGURATION_SAVED "Konfigūracija išsaugota" +#define D_CONFIGURATION_RESET "Konfigūracija atstatyta" + +#define D_PROGRAM_VERSION "Programos versija" +#define D_BUILD_DATE_AND_TIME "Kompiliavimo data ir laikas" +#define D_CORE_AND_SDK_VERSION "Core/SDK versija" +#define D_FLASH_WRITE_COUNT "Flash įrašų skaičius" +#define D_MAC_ADDRESS "MAC adresas" +#define D_MQTT_HOST "MQTT serveris" +#define D_MQTT_PORT "MQTT prievadas" +#define D_MQTT_CLIENT "MQTT klientas" +#define D_MQTT_USER "MQTT vartotojas" +#define D_MQTT_TOPIC "MQTT topic" +#define D_MQTT_GROUP_TOPIC "MQTT group topic" +#define D_MQTT_FULL_TOPIC "MQTT full topic" +#define D_MQTT_NO_RETAIN "MQTT No Retain" +#define D_MDNS_DISCOVERY "mDNS Discovery" +#define D_MDNS_ADVERTISE "mDNS Advertise" +#define D_ESP_CHIP_ID "ESP Chip ID" +#define D_FLASH_CHIP_ID "Flash Chip Id" +#define D_FLASH_CHIP_SIZE "Flash dydis" +#define D_FREE_PROGRAM_SPACE "Laisva programos vieta" + +#define D_UPGRADE_BY_WEBSERVER "Naudoti web serverį" +#define D_OTA_URL "OTA URL" +#define D_START_UPGRADE "Pradėti atnaujinimą" +#define D_UPGRADE_BY_FILE_UPLOAD "Naudoti failų įkėlimą" +#define D_UPLOAD_FACTORY "Perjungimas į saugią safeboot partition" +#define D_UPLOAD_STARTED "Įkėlimas pradėtas" +#define D_UPGRADE_STARTED "Atnaujinimas pradėtas" +#define D_UPLOAD_DONE "Įkėlimas baigtas" +#define D_UPLOAD_TRANSFER "Įkėlimo perdavimas" +#define D_TRANSFER_STARTED "Perdavimas pradėtas" +#define D_UPLOAD_ERR_1 "Nepasirinktas failas" +#define D_UPLOAD_ERR_2 "Nepakanka vietos" +#define D_UPLOAD_ERR_3 "Netinkamas failo parašas" +#define D_UPLOAD_ERR_4 "Programos flash dydis yra didesnis nei tikrasis flash dydis" +#define D_UPLOAD_ERR_5 "Įkėlimo buferio neatitikimas" +#define D_UPLOAD_ERR_6 "Įkėlimas nepavyko. Įjunkite 3 lygio logging" +#define D_UPLOAD_ERR_7 "Įkėlimas nutrauktas" +#define D_UPLOAD_ERR_8 "Netinkamas failas" +#define D_UPLOAD_ERR_9 "Failas per didelis" +#define D_UPLOAD_ERR_10 "Nepavyko inicijuoti RF mikroschemos" +#define D_UPLOAD_ERR_11 "Nepavyko ištrinti RF mikroschemos" +#define D_UPLOAD_ERR_12 "Nepavyko rašyti į RF mikroschemą" +#define D_UPLOAD_ERR_13 "Nepavyko dekoduoti RF programinės įrangos" +#define D_UPLOAD_ERR_14 "Nesuderinama" +#define D_UPLOAD_ERROR_CODE "Įkėlimo klaidos kodas" + +#define D_ENTER_COMMAND "Įveskite komandą" +#define D_ENABLE_WEBLOG_FOR_RESPONSE "Įjunkite weblog 2, jei tikimasi atsakymo" +#define D_NEED_USER_AND_PASSWORD "Reikalingas user=&password=" + +// xdrv_01_mqtt.ino +#define D_FINGERPRINT "Tikrinamas TLS pirštų atspaudas..." +#define D_TLS_CONNECT_FAILED_TO "TLS prisijungimas nepavyko" +#define D_RETRY_IN "Pakartojimas po" +#define D_VERIFIED "Patvirtinta naudojant pirštų atspaudą" +#define D_INSECURE "Nesaugus prisijungimas dėl netinkamo pirštų atspaudo" +#define D_CONNECT_FAILED_TO "Nepavyko prisijungti prie" + +// xplg_wemohue.ino +#define D_MULTICAST_DISABLED "Multicast išjungtas" +#define D_MULTICAST_REJOINED "Multicast prisijungė" +#define D_MULTICAST_JOIN_FAILED "Nepavyko prisijungti prie multicast" +#define D_FAILED_TO_SEND_RESPONSE "Nepavyko išsiųsti atsakymo" + +#define D_WEMO "WeMo" +#define D_WEMO_BASIC_EVENT "WeMo basic įvykis" +#define D_WEMO_EVENT_SERVICE "WeMo įvykių paslauga" +#define D_WEMO_META_SERVICE "WeMo meta paslauga" +#define D_WEMO_SETUP "WeMo konfiguracija" +#define D_RESPONSE_SENT "Atsakymas išsiųstas" + +#define D_HUE "Hue" +#define D_HUE_BRIDGE_SETUP "Hue sąranka" +#define D_HUE_API_NOT_IMPLEMENTED "Hue API neįntegruota" +#define D_HUE_API "Hue API" +#define D_HUE_POST_ARGS "Hue POST argumentai" +#define D_3_RESPONSE_PACKETS_SENT "Išsiųsti 3 atsakymo paketai" + +// xdrv_07_domoticz.ino +#define D_DOMOTICZ_PARAMETERS "Domoticz parametrai" +#define D_DOMOTICZ_IDX "Idx" +#define D_DOMOTICZ_KEY_IDX "Rakto idx" +#define D_DOMOTICZ_SWITCH_IDX "Jungiklio idx" +#define D_DOMOTICZ_SENSOR_IDX "Jutiklio idx" + #define D_DOMOTICZ_TEMP "Temperatūra" + #define D_DOMOTICZ_TEMP_HUM "Temperatūra, Drėgmė" + #define D_DOMOTICZ_TEMP_HUM_BARO "Temperatūra, Drėgmė, Slėgis" + #define D_DOMOTICZ_POWER_ENERGY "Galia, Energija" + #define D_DOMOTICZ_ILLUMINANCE "Apšvietimas" + #define D_DOMOTICZ_COUNT "Skaičius/PM1" + #define D_DOMOTICZ_VOLTAGE "Įtampa/PM2.5" + #define D_DOMOTICZ_CURRENT "Srovė/PM10" + #define D_DOMOTICZ_AIRQUALITY "Oro kokybė" + #define D_DOMOTICZ_P1_SMART_METER "P1 išmanusis skaitiklis" +#define D_DOMOTICZ_UPDATE_TIMER "Atnaujinimo laikmatis" + +// xdrv_09_timers.ino +#define D_CONFIGURE_TIMER "Laikmatis" +#define D_TIMER_PARAMETERS "Laikmačio parametrai" +#define D_TIMER_ENABLE "Įjungti laikmačius" +#define D_TIMER_ARM "Įjungti" +#define D_TIMER_TIME "Laikas" +#define D_TIMER_DAYS "Dienos" +#define D_TIMER_REPEAT "Kartoti" +#define D_TIMER_OUTPUT "Išvestis" +#define D_TIMER_ACTION "Veiksmas" + +// xdrv_10_knx.ino +#define D_CONFIGURE_KNX "KNX" +#define D_KNX_PARAMETERS "KNX parametrai" +#define D_KNX_GENERAL_CONFIG "Bendrieji nustatymai" +#define D_KNX_PHYSICAL_ADDRESS "Fizinis adresas" +#define D_KNX_PHYSICAL_ADDRESS_NOTE "( Turi būti unikalus KNX tinkle )" +#define D_KNX_ENABLE "Įjungti KNX" +#define D_KNX_GROUP_ADDRESS_TO_WRITE "Duomenys siuntimui į grupinius adresus" +#define D_ADD "Pridėti" +#define D_DELETE "Ištrinti" +#define D_REPLY "Atsakyti" +#define D_KNX_GROUP_ADDRESS_TO_READ "Grupiniai adresai, iš kurių gaunami duomenys" +#define D_RECEIVED_FROM "Gauta iš" +#define D_KNX_COMMAND_WRITE "Rašyti" +#define D_KNX_COMMAND_READ "Skaityti" +#define D_KNX_COMMAND_OTHER "Kita" +#define D_SENT_TO "Išsiųsta į" +#define D_KNX_WARNING "Grupinis adresas ( 0 / 0 / 0 ) yra rezervuotas ir negali būti naudojamas." +#define D_KNX_ENHANCEMENT "Komunikacijos patobulinimas" +#define D_KNX_TX_SLOT "KNX TX" +#define D_KNX_RX_SLOT "KNX RX" +#define D_KNX_TX_SCENE "KNX SCENE TX" +#define D_KNX_RX_SCENE "KNX SCENE RX" + +// xdrv_23_zigbee +#define D_ZIGBEE_PERMITJOIN_ACTIVE "Įrenginiai, kuriems leidžiama prisijungti" +#define D_ZIGBEE_MAPPING_TITLE "Tasmota Zigbee sujungimas" +#define D_ZIGBEE_NOT_STARTED "Zigbee neįjungtas" +#define D_ZIGBEE_MAPPING_IN_PROGRESS_SEC "Sujungimas vyksta (%d s. liko)" +#define D_ZIGBEE_MAPPING_NOT_PRESENT "Neprijungta" +#define D_ZIGBEE_MAP_REFRESH "Atnaujinti Zigbee žemėlapį" +#define D_ZIGBEE_MAP "Zigbee žemėlapis" +#define D_ZIGBEE_PERMITJOIN "Leisti Zigbee prisijungimą" +#define D_ZIGBEE_GENERATE_KEY "Generuojamas atsitiktinis Zigbee tinklo raktas" +#define D_ZIGBEE_UNKNOWN_DEVICE "Nežinomas įrenginys" +#define D_ZIGBEE_UNKNOWN_ATTRIBUTE "Nežinomas atributas" +#define D_ZIGBEE_UNKNOWN_ENDPOINT "Nežinomas prieigos taškas" +#define D_ZIGBEE_INVALID_PARAM "Neteisingas parametras" +#define D_ZIGBEE_MISSING_PARAM "Trūksta parametrų" +#define D_ZIGBEE_UNKNWON_ATTRIBUTE "Nežinomas atributo pavadinimas (ignoruojama): %s" +#define D_ZIGBEE_TOO_MANY_CLUSTERS "Ne daugiau kaip vienas klasterio ID komandai" +#define D_ZIGBEE_CONFLICTING_ENDPOINTS "Prieštaraujantys galiniai taškai"----- +#define D_ZIGBEE_WRONG_DELIMITER "Neteisingas skyriklis naštai"----- +#define D_ZIGBEE_UNRECOGNIZED_COMMAND "Neatpažinta Zigbee komanda: %s" +#define D_ZIGBEE_TOO_MANY_COMMANDS "Leidžiama tik 1 komanda (%d)" +#define D_ZIGBEE_NO_ATTRIBUTE "Sąraše nėra atributo" +#define D_ZIGBEE_UNSUPPORTED_ATTRIBUTE_TYPE "Nepalaikomas atributo tipas" +#define D_ZIGBEE_JSON_REQUIRED "Konfigūracijai reikia JSON objektų" +#define D_ZIGBEE_RESET_1_OR_2 "1 arba 2 norint atstatyti" +#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM rastas adresu" +#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Atsitiktinai keičiami Zigbee parametrai, patikrinkite su 'ZbConfig'" + +// xdrv_89_dali.ino +#define D_SENSOR_DALI_RX "Dali RX" +#define D_SENSOR_DALI_TX "Dali TX" +#define D_CONFIGURE_DALI "DALI" + +// xdrv_03_energy.ino +#define D_ENERGY_TODAY "Energija šiandien" +#define D_ENERGY_YESTERDAY "Energija vakar" +#define D_ENERGY_TOTAL "Bendra energija" + +// xsns_100_ina3221.ino +#define D_UNIT_CHARGE "Ah" +#define D_CHARGE "Įkrova" +#define D_ENERGY "Energija" + +// xdrv_27_shutter.ino +#define D_OPEN "Atidaryti" +#define D_CLOSE "Uždaryti" +#define D_DOMOTICZ_SHUTTER "Žaliuzės" + +// xdrv_28_pcf8574.ino +#define D_CONFIGURE_PCF8574 "PCF8574" +#define D_PCF8574_PARAMETERS "PCF8574 parametrai" +#define D_INVERT_PORTS "Invertuoti prievadus" +#define D_DEVICE "Įrenginys" +#define D_DEVICE_INPUT "Įvestis" +#define D_DEVICE_OUTPUT "Išvestis" + +// xdrv_39_thermostat.ino, xdrv_85_esp32_ble_eq3_trv.ino +#define D_THERMOSTAT "Termostatas" +#define D_THERMOSTAT_SET_POINT "Nustatyta temperatūra" +#define D_THERMOSTAT_SENSOR "Dabartinė temperatūra" +#define D_THERMOSTAT_GRADIENT "Temperatūros pokytis" +#define D_THERMOSTAT_DUTY_CYCLE "Darbo ciklas" +#define D_THERMOSTAT_VALVE_POSITION "Vožtuvo padėtis" +#define D_THERMOSTAT_CYCLE_TIME "Ciklo laikas" +#define D_THERMOSTAT_PI_AUTOTUNE "PI automatinis derinimas" +#define D_THERMOSTAT_CONTROL_METHOD "Valdymo metodas" +#define D_THERMOSTAT_RAMP_UP "Palaipsninis didinimas" +#define D_THERMOSTAT_PI "PI" +#define D_THERMOSTAT_AUTOTUNE "Automatinis derinimas" +#define D_THERMOSTAT_RAMP_UP_HYBRID "Palaipsninis didinimas (hibridinis)" +#define D_THERMOSTAT_PI_HYBRID "PI (hibridinis)" +#define D_THERMOSTAT_AUTOTUNE_HYBRID "Automatinis derinimas (hibridinis)" + +// xdrv_79_esp32_ble.ino +#define D_CONFIGURE_BLE "BLE" +#define D_BLE_PARAMETERS "Bluetooth nustatymai" +#define D_BLE_ENABLE "Įjungti Bluetooth" +#define D_BLE_ACTIVESCAN "Įjungti aktyvų skenavimą(*)" +#define D_BLE_DEVICES "Aptikti įrenginiai" +#define D_BLE_REMARK "įrašai, pažymėti (*), nėra saugomi konfigūracijoje" + +// xsns_05_ds18b20.ino +#define D_SENSOR_BUSY "Jutiklis užimtas" +#define D_SENSOR_CRC_ERROR "Jutiklio CRC klaida" +#define D_SENSORS_FOUND "Rasti jutikliai" + +// xsns_06_dht.ino +#define D_TIMEOUT_WAITING_FOR "Laiko limitas laukiant" +#define D_START_SIGNAL_LOW "pradinis signalas žemas" +#define D_START_SIGNAL_HIGH "pradinis signalas aukštas" +#define D_PULSE "pulsas" +#define D_CHECKSUM_FAILURE "Kontrolinės sumos klaida" + +// xsns_07_sht1x.ino +#define D_SENSOR_DID_NOT_ACK_COMMAND "Jutiklis neatsakė į komandą" +#define D_SHT1X_FOUND "SHT1X surastas" + +// xsns_18_pms5003.ino +#define D_STANDARD_CONCENTRATION "CF-1 KD" // Standartinė dalelių koncentracija CF-1 (Kietosios dalelės) +#define D_ENVIRONMENTAL_CONCENTRATION "PM" // Aplinkos kietosios dalelės +#define D_PARTICALS_BEYOND "Dalelės" + +// xsns_27_apds9960.ino +#define D_GESTURE "Gestas" +#define D_COLOR_RED "Raudona" +#define D_COLOR_GREEN "Žalia" +#define D_COLOR_BLUE "Mėlyna" +#define D_CCT "CCT" +#define D_PROXIMITY "Artumo jutiklis" + +// xsns_32_mpu6050.ino +#define D_AX_AXIS "Pagreit. X ašis" +#define D_AY_AXIS "Pagreit. Y ašis" +#define D_AZ_AXIS "Pagreit. Z ašis" +#define D_GX_AXIS "Grskp. X ašis" +#define D_GY_AXIS "Grskp. Y ašis" +#define D_GZ_AXIS "Grskp. Z ašis" + +// xsns_33_QMC5883L.ino +#define D_MX "Indukcija X ašies" +#define D_MY "Indukcija Y ašies" +#define D_MZ "Indukcija Z ašies" +#define D_MAGNETICFLD "Magnetinė indukcija" + +// xsns_34_hx711.ino +#define D_HX_CAL_REMOVE "Nuimkite svorį" +#define D_HX_CAL_REFERENCE "Įveskite nurodytą svorį" +#define D_HX_CAL_DONE "Sukalibruota" +#define D_HX_CAL_FAIL "Kalibracija nepavyko" +#define D_RESET_HX711 "Perkrauti svarstyklę" +#define D_CONFIGURE_HX711 "Svarstyklės nustatymai" +#define D_HX711_PARAMETERS "Svarstyklių parametrai" +#define D_ITEM_WEIGHT "Prekės svoris" +#define D_REFERENCE_WEIGHT "Nurodytas svoris" +#define D_CALIBRATE "Kalibruoti" +#define D_CALIBRATION "Kalibracija" + +//xsns_35_tx20.ino +#define D_TX20_WIND_DIRECTION "Vėjo kryptis" +#define D_TX20_WIND_SPEED "Vėjo greitis" +#define D_TX20_WIND_SPEED_MIN "Minimalus vėjo greitis" +#define D_TX20_WIND_SPEED_MAX "Maksimalus vėjo greitis" +#define D_TX20_NORTH "Š" +#define D_TX20_EAST "R" +#define D_TX20_SOUTH "P" +#define D_TX20_WEST "V" + +// xsns_53_sml.ino +#define D_TPWRIN "Visas-Įėjimas" +#define D_TPWRIN0 "Visas-Įėjimas T0" +#define D_TPWRIN1 "Visas-Įėjimas T1" +#define D_TPWROUT "Visas-Išėjimas" +#define D_TPWRCURR "Srovė-Įėjimas/Išėjimas" +#define D_TPWRCURR1 "Srovė-Įėjimas p1" +#define D_TPWRCURR2 "Srovė-Įėjimas p2" +#define D_TPWRCURR3 "Srovė-Įėjimas p3" +#define D_Strom_L1 "Srovė L1" +#define D_Strom_L2 "Srovė L2" +#define D_Strom_L3 "Srovė L3" +#define D_Spannung_L1 "Įtampa L1" +#define D_Spannung_L2 "Įtampa L2" +#define D_Spannung_L3 "Įtampa L3" +#define D_METERNR "Skaitiklio numeris" +#define D_METERSID "Paslaugos ID" +#define D_GasIN "Skaitiklis" // Dujų vartojimas +#define D_H2oIN "Skaitiklis" // Vandens vartojimas +#define D_StL1L2L3 "Srovė L1+L2+L3" +#define D_SpL1L2L3 "Įtampa L1+L2+L3/3" + +// xsns_86_tfminiplus.ino +#define D_SIGNALSTRENGTH "Signalo stiprumas" +#define D_CHIPTEMPERATURE "Lusto Temperature" + +// xsns_60_GPS +#define D_LATITUDE "Platuma" +#define D_LONGITUDE "Ilguma" +#define D_HORIZONTAL_ACCURACY "Horizontalus tikslumas" +#define D_ALTITUDE "Aukštuma" +#define D_VERTICAL_ACCURACY "Vertikalus tikslumas" +#define D_SPEED "Greitis" +#define D_SPEED_ACCURACY "Greičio tikslumas" +#define D_HEADING "Kryptis" +#define D_HEADING_ACCURACY "Krypties tikslumas" +#define D_SAT_FIX "Palydovo nustatymas" + #define D_SAT_FIX_NO_FIX "Nėra" + #define D_SAT_FIX_DEAD_RECK "Dead reckoning" + #define D_SAT_FIX_2D "2D" + #define D_SAT_FIX_3D "3D" + #define D_SAT_FIX_GPS_DEAD "GPS ir mirštanti navigacija" + #define D_SAT_FIX_TIME "Tik laiko nustatymas" + +// tasmota_template.h - keep them as short as possible to be able to fit them in GUI drop down box +#define D_SENSOR_NONE "Nepasirinkta" +#define D_SENSOR_USER "Naudotojas" +#define D_SENSOR_OPTION "Pasirinkimas" +#define D_SENSOR_DHT11 "DHT11" +#define D_SENSOR_AM2301 "AM2301" +#define D_SENSOR_SI7021 "SI7021" +#define D_SENSOR_MS01 "MS01" +#define D_SENSOR_DS18X20 "DS18x20" +#define D_SENSOR_I2C_SCL "I2C SCL" +#define D_SENSOR_I2C_SDA "I2C SDA" +#define D_SENSOR_I2C_SER_TX "I2C Ser Tx" +#define D_SENSOR_I2C_SER_RX "I2C Ser Rx" +#define D_SENSOR_I2S_MCLK "I2S MCLK" +#define D_SENSOR_I2S_BCLK "I2S BCLK" +#define D_SENSOR_I2S_WS_IN "I2S BCLK In" +#define D_SENSOR_I2S_WS "I2S WS" +#define D_SENSOR_I2S_BCLK_IN "I2S WS In" +#define D_SENSOR_I2S_DIN "I2S DIN" +#define D_SENSOR_I2S_DOUT "I2S DOUT" +#define D_SENSOR_I2S_DAC "I2S DAC" +#define D_SENSOR_HDMI_CEC "HDMI CEC" +#define D_SENSOR_WS2812 "WS2812" +#define D_SENSOR_DFR562 "MP3 Player" +#define D_SENSOR_DFR562_BUSY "MP3 Busy" +#define D_SENSOR_IRSEND "IRsend" +#define D_SENSOR_SWITCH "Switch" // Suffix "1" +#define D_SENSOR_BUTTON "Button" // Suffix "1" +#define D_SENSOR_RELAY "Relay" // Suffix "1i" +#define D_SENSOR_LED "Led" // Suffix "1i" +#define D_SENSOR_LED_LINK "LedLink" // Suffix "i" +#define D_SENSOR_PWM "PWM" // Suffix "1" +#define D_SENSOR_COUNTER "Counter" // Suffix "1" +#define D_SENSOR_INTERRUPT "Interrupt" +#define D_SENSOR_INPUT "Input" +#define D_SENSOR_IRRECV "IRrecv" +#define D_SENSOR_MHZ_RX "MHZ Rx" +#define D_SENSOR_MHZ_TX "MHZ Tx" +#define D_SENSOR_HC8_RX "HC8 Rx" +#define D_SENSOR_PZEM004_RX "PZEM004 Rx" +#define D_SENSOR_PZEM016_RX "PZEM016 Rx" +#define D_SENSOR_PZEM017_RX "PZEM017 Rx" +#define D_SENSOR_PZEM0XX_TX "PZEM0XX Tx" +#define D_SENSOR_SAIR_RX "SAir Rx" +#define D_SENSOR_SAIR_TX "SAir Tx" +#define D_SENSOR_SPI_CS "SPI CS" +#define D_SENSOR_SPI_DC "SPI DC" +#define D_SENSOR_SPI_MISO "SPI MISO" +#define D_SENSOR_SPI_MOSI "SPI MOSI" +#define D_SENSOR_SPI_CLK "SPI CLK" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_GPIO_TS_SPI_CS "TS SPI CS" +#define D_GPIO_TS_RST "TS RST" +#define D_GPIO_TS_IRQ "TS IRQ" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_PMS5003_TX "PMS5003 Tx" +#define D_SENSOR_PMS5003_RX "PMS5003 Rx" +#define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" +#define D_SENSOR_SDS0X1_TX "SDS0X1 Tx" +#define D_SENSOR_HPMA_RX "HPMA Rx" +#define D_SENSOR_HPMA_TX "HPMA Tx" +#define D_SENSOR_SBR_RX "SerBr Rx" +#define D_SENSOR_SBR_TX "SerBr Tx" +#define D_SENSOR_MBR_TX "ModBr Tx" +#define D_SENSOR_MBR_RX "ModBr Rx" +#define D_SENSOR_MBR_TX_ENA "ModBr Tx Ena" +#define D_SENSOR_SR04_TRIG "SR04 Tri/Tx" +#define D_SENSOR_SR04_ECHO "SR04 Ech/Rx" +#define D_SENSOR_NRG_MBS_TX "NrgMbs Tx" +#define D_SENSOR_NRG_MBS_RX "NrgMbs Rx" +#define D_SENSOR_NRG_MBS_TX_ENA "NrgMbs Tx Ena" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" +#define D_SENSOR_SDM120_TX "SDMx20 Tx" +#define D_SENSOR_SDM120_RX "SDMx20 Rx" +#define D_SENSOR_SDM230_TX "SDM230 Tx" +#define D_SENSOR_SDM230_RX "SDM230 Rx" +#define D_SENSOR_SDM630_TX "SDM630 Tx" +#define D_SENSOR_SDM630_RX "SDM630 Rx" +#define D_SENSOR_WE517_TX "WE517 Tx" +#define D_SENSOR_WE517_RX "WE517 Rx" +#define D_SENSOR_LD2410_TX "LD2410 Tx" +#define D_SENSOR_LD2410_RX "LD2410 Rx" +#define D_SENSOR_LD2410S_TX "LD2410S Tx" +#define D_SENSOR_LD2410S_RX "LD2410S Rx" +#define D_GPIO_TM1621_CS "TM1621 CS" +#define D_GPIO_TM1621_WR "TM1621 WR" +#define D_GPIO_TM1621_RD "TM1621 RD" +#define D_GPIO_TM1621_DAT "TM1621 DAT" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" +#define D_SENSOR_TM1638_CLK "TM1638 CLK" +#define D_SENSOR_TM1638_DIO "TM1638 DIO" +#define D_SENSOR_TM1638_STB "TM1638 STB" +#define D_SENSOR_TM1640_CLK "TM1640 CLK" +#define D_SENSOR_TM1640_DIN "TM1640 DIN" +#define D_SENSOR_MAX7219_DIN "MAX7219 DIN" +#define D_SENSOR_MAX7219_CS "MAX7219 CS" +#define D_SENSOR_MAX7219_CLK "MAX7219 CLK" +#define D_SENSOR_HX711_SCK "HX711 SCK" +#define D_SENSOR_HX711_DAT "HX711 DAT" +#define D_SENSOR_FTC532 "FTC532" +#define D_SENSOR_BS814_CLK "BS814 CLK" +#define D_SENSOR_BS814_DAT "BS814 DAT" +#define D_SENSOR_TX2X_TX "TX2x" +#define D_SENSOR_RFSEND "RFSend" +#define D_SENSOR_RFRECV "RFrecv" +#define D_SENSOR_TUYA_TX "Tuya Tx" +#define D_SENSOR_TUYA_RX "Tuya Rx" +#define D_SENSOR_MGC3130_XFER "MGC3130 Xfr" +#define D_SENSOR_MGC3130_RESET "MGC3130 Rst" +#define D_SENSOR_SSPI_MISO "SSPI MISO" +#define D_SENSOR_SSPI_MOSI "SSPI MOSI" +#define D_SENSOR_SSPI_SCLK "SSPI SCLK" +#define D_SENSOR_SSPI_CS "SSPI CS" +#define D_SENSOR_SSPI_DC "SSPI DC" +#define D_SENSOR_RF_SENSOR "RF Sensor" +#define D_SENSOR_AZ_RX "AZ Rx" +#define D_SENSOR_AZ_TX "AZ Tx" +#define D_SENSOR_MAX31855_CS "MX31855 CS" +#define D_SENSOR_MAX31855_CLK "MX31855 CLK" +#define D_SENSOR_MAX31855_DO "MX31855 DO" +#define D_SENSOR_MAX31865_CS "MX31865 CS" +#define D_GPIO_RN2XX3_TX "RN2XX3 Tx" +#define D_GPIO_RN2XX3_RX "RN2XX3 Rx" +#define D_GPIO_RN2XX3_RST "RN2XX3 Rst" +#define D_GPIO_ASR650X_TX "ASR650x Tx" +#define D_GPIO_ASR650X_RX "ASR650x Rx" +#define D_GPIO_LORA_CS "LoRa CS" +#define D_GPIO_LORA_RST "LoRa Rst" +#define D_GPIO_LORA_BUSY "LoRa Busy" +#define D_GPIO_LORA_DI "LoRa DIO" // Suffix "0" .. "5" +#define D_SENSOR_NRG_SEL "HLWBL SEL" // Suffix "i" +#define D_SENSOR_NRG_CF1 "HLWBL CF1" +#define D_SENSOR_HLW_CF "HLW8012 CF" +#define D_SENSOR_HJL_CF "BL0937 CF" +#define D_SENSOR_MCP39F5_TX "MCP39F5 Tx" +#define D_SENSOR_MCP39F5_RX "MCP39F5 Rx" +#define D_SENSOR_MCP39F5_RST "MCP39F5 Rst" +#define D_SENSOR_CSE7761_TX "CSE7761 Tx" +#define D_SENSOR_CSE7761_RX "CSE7761 Rx" +#define D_SENSOR_CSE7766_TX "CSE7766 Tx" +#define D_SENSOR_CSE7766_RX "CSE7766 Rx" +#define D_SENSOR_BL0906_RX "BL0906 Rx" +#define D_SENSOR_BL0939_RX "BL0939 Rx" +#define D_SENSOR_BL0942_RX "BL0942 Rx" +#define D_SENSOR_HM330X_SET "HM330X SET" +#define D_SENSOR_PN532_TX "PN532 Tx" +#define D_SENSOR_PN532_RX "PN532 Rx" +#define D_SENSOR_SM16716_CLK "SM16716 CLK" +#define D_SENSOR_SM16716_DAT "SM16716 DAT" +#define D_SENSOR_SM16716_POWER "SM16716 PWR" +#define D_SENSOR_P9813_CLK "P9813 Clk" +#define D_SENSOR_P9813_DAT "P9813 Dat" +#define D_SENSOR_MY92X1_DI "MY92x1 DI" +#define D_SENSOR_MY92X1_DCKI "MY92x1 DCKI" +#define D_SENSOR_ARIRFRCV "ALux IrRcv" +#define D_SENSOR_ARIRFSEL "ALux IrSel" +#define D_SENSOR_TXD "Serial Tx" +#define D_SENSOR_RXD "Serial Rx" +#define D_SENSOR_ROTARY "Rotary" // Suffix "1A" +#define D_SENSOR_HRE_CLOCK "HRE Clock" +#define D_SENSOR_HRE_DATA "HRE Data" +#define D_SENSOR_ADE7880_IRQ "ADE7880 IRQ" +#define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ" +#define D_SENSOR_ADE7953_RST "ADE7953 RST" +#define D_SENSOR_ADE7953_CS "ADE7953 CS" +#define D_SENSOR_BUZZER "Buzzer" +#define D_SENSOR_DISP_RESET "Display Rst" +#define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" +#define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" +#define D_SENSOR_ZIGBEE_RST "Zigbee Rst" +#define D_SENSOR_SOLAXX1_TX "SolaxX1 Tx" +#define D_SENSOR_SOLAXX1_RX "SolaxX1 Rx" +#define D_SENSOR_SOLAXX1_RTS "SolaxX1 RTS" +#define D_SENSOR_IBEACON_TX "iBeacon Tx" +#define D_SENSOR_IBEACON_RX "iBeacon Rx" +#define D_SENSOR_RDM6300_RX "RDM6300 Rx" +#define D_SENSOR_CC1101_CS "CC1101 CS" +#define D_SENSOR_A4988_DIR "A4988 DIR" +#define D_SENSOR_A4988_STP "A4988 STP" +#define D_SENSOR_A4988_ENA "A4988 ENA" +#define D_SENSOR_A4988_MS1 "A4988 MS1" +#define D_SENSOR_OUTPUT_HI "Output Hi" +#define D_SENSOR_OUTPUT_LO "Output Lo" +#define D_SENSOR_AS608_TX "AS608 Tx" +#define D_SENSOR_AS608_RX "AS608 Rx" +#define D_SENSOR_GM861_TX "GM861 Tx" +#define D_SENSOR_GM861_RX "GM861 Rx" +#define D_SENSOR_DDS2382_TX "DDS238-2 Tx" +#define D_SENSOR_DDS2382_RX "DDS238-2 Rx" +#define D_SENSOR_DDSU666_TX "DDSU666 Tx" +#define D_SENSOR_DDSU666_RX "DDSU666 Rx" +#define D_SENSOR_SM2135_CLK "SM2135 Clk" +#define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_SM2335_CLK "SM2335 Clk" +#define D_SENSOR_SM2335_DAT "SM2335 Dat" +#define D_SENSOR_BP1658CJ_CLK "BP1658CJ Clk" +#define D_SENSOR_BP1658CJ_DAT "BP1658CJ Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" +#define D_SENSOR_DEEPSLEEP "DeepSleep" +#define D_SENSOR_EXS_ENABLE "EXS Enable" +#define D_SENSOR_CLIENT_TX "Client Tx" +#define D_SENSOR_CLIENT_RX "Client Rx" +#define D_SENSOR_CLIENT_RESET "Client Rst" +#define D_SENSOR_GPS_RX "GPS Rx" +#define D_SENSOR_GPS_TX "GPS Tx" +#define D_SENSOR_HM10_RX "HM10 Rx" +#define D_SENSOR_HM10_TX "HM10 Tx" +#define D_SENSOR_LE01MR_RX "LE-01MR Rx" +#define D_SENSOR_LE01MR_TX "LE-01MR Tx" +#define D_SENSOR_BL0940_RX "BL0940 Rx" +#define D_SENSOR_CC1101_GDO0 "CC1101 GDO0" +#define D_SENSOR_CC1101_GDO2 "CC1101 GDO2" +#define D_SENSOR_HRXL_RX "HRXL Rx" +#define D_SENSOR_DYP_RX "DYP Rx" +#define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" +#define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Spd" +#define D_SENSOR_TELEINFO_RX "TInfo Rx" +#define D_SENSOR_TELEINFO_ENABLE "TInfo EN" +#define D_SENSOR_LMT01_PULSE "LMT01 Pulse" +#define D_SENSOR_ADC_INPUT "ADC Input" +#define D_SENSOR_ADC_TEMP "ADC Temp" +#define D_SENSOR_ADC_LIGHT "ADC Light" +#define D_SENSOR_ADC_BUTTON "ADC Button" +#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_CT_POWER "ADC CT Power" +#define D_SENSOR_ADC_JOYSTICK "ADC Joystick" +#define D_SENSOR_ADC_PH "ADC pH" +#define D_SENSOR_ADC_MQ "ADC MQ" +#define D_SENSOR_ADC_VOLTAGE "ADC Voltage" +#define D_SENSOR_ADC_CURRENT "ADC Current" +#define D_GPIO_WEBCAM_PWDN "CAM_PWDN" +#define D_GPIO_WEBCAM_RESET "CAM_RESET" +#define D_GPIO_WEBCAM_XCLK "CAM_XCLK" +#define D_GPIO_WEBCAM_SIOD "CAM_SIOD" +#define D_GPIO_WEBCAM_SIOC "CAM_SIOC" +#define D_GPIO_WEBCAM_DATA "CAM_DATA" +#define D_GPIO_WEBCAM_VSYNC "CAM_VSYNC" +#define D_GPIO_WEBCAM_HREF "CAM_HREF" +#define D_GPIO_WEBCAM_PCLK "CAM_PCLK" +#define D_GPIO_WEBCAM_PSCLK "CAM_PSCLK" +#define D_GPIO_WEBCAM_HSD "CAM_HSD" +#define D_GPIO_WEBCAM_PSRCS "CAM_PSRCS" +#define D_SENSOR_ETH_PHY_POWER "ETH POWER" +#define D_SENSOR_ETH_PHY_MDC "ETH MDC" +#define D_SENSOR_ETH_PHY_MDIO "ETH MDIO" +#define D_SENSOR_TCP_TXD "TCP Tx" +#define D_SENSOR_TCP_TXD_EN "TCP Tx En" +#define D_SENSOR_TCP_RXD "TCP Rx" +#define D_SENSOR_IEM3000_TX "iEM3000 Tx" +#define D_SENSOR_IEM3000_RX "iEM3000 Rx" +#define D_SENSOR_MIEL_HVAC_TX "MiEl HVAC Tx" +#define D_SENSOR_MIEL_HVAC_RX "MiEl HVAC Rx" +#define D_SENSOR_PROJECTOR_CTRL_TX "DLP Tx" +#define D_SENSOR_PROJECTOR_CTRL_RX "DLP Rx" +#define D_SENSOR_SHELLY_DIMMER_BOOT0 "SHD Boot 0" +#define D_SENSOR_SHELLY_DIMMER_RST_INV "SHD Reset" +#define D_SENSOR_RC522_RST "RC522 Rst" +#define D_SENSOR_RC522_CS "RC522 CS" +#define D_SENSOR_NRF24_CS "NRF24 CS" +#define D_SENSOR_NRF24_DC "NRF24 DC" +#define D_SENSOR_XPT2046_CS "XPT2046 CS" +#define D_SENSOR_ILI9341_CS "ILI9341 CS" +#define D_SENSOR_ILI9341_DC "ILI9341 DC" +#define D_SENSOR_ILI9488_CS "ILI9488 CS" +#define D_SENSOR_EPAPER29_CS "EPaper29 CS" +#define D_SENSOR_EPAPER42_CS "EPaper42 CS" +#define D_SENSOR_SSD1351_CS "SSD1351 CS" +#define D_SENSOR_SSD1351_DC "SSD1351 DC" +#define D_SENSOR_RA8876_CS "RA8876 CS" +#define D_SENSOR_ST7789_CS "ST7789 CS" +#define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" +#define D_SENSOR_WIEGAND_D0 "Wiegand D0" +#define D_SENSOR_WIEGAND_D1 "Wiegand D1" +#define D_SENSOR_NEOPOOL_TX "NeoPool Tx" +#define D_SENSOR_NEOPOOL_RX "NeoPool Rx" +#define D_SENSOR_VL53LXX_XSHUT "VL53LXX XSHUT" +#define D_SENSOR_TFMINIPLUS_TX "TFmini+ Tx" +#define D_SENSOR_TFMINIPLUS_RX "TFmini+ Rx" +#define D_SENSOR_ZEROCROSS "ZC Pulse" +#define D_SENSOR_HALLEFFECT "HallEffect" +#define D_SENSOR_EPD_DATA "EPD Data" +#define D_SENSOR_PCF8574_INT "PCF8574 Int" +#define D_SENSOR_MCP23XXX_INT "MCP23xxx Int" +#define D_SENSOR_MCP23SXX_CS "MCP23Sxx CS" +#define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" +#define D_SENSOR_BL6523_TX "BL6523 Tx" +#define D_SENSOR_BL6523_RX "BL6523 Rx" +#define D_SENSOR_HEARTBEAT "Heartbeat" +#define D_SENSOR_RESET "Reset" +#define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" +#define D_GPIO_SHIFT595_RCLK "74x595 RCLK" +#define D_GPIO_SHIFT595_OE "74x595 OE" +#define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_OE "Dingtian OE" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" +#define D_SENSOR_CM11_TX "CM110x Tx" +#define D_SENSOR_CM11_RX "CM110x Rx" +#define D_SENSOR_FLOWRATEMETER "Flowrate" +#define D_SENSOR_ME007_TRIG "ME007 Tri" +#define D_SENSOR_ME007_RX "ME007 Rx" +#define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" +#define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" +#define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" +#define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" +#define D_SENSOR_BIOPDU_BIT "BioPDU Bit" +#define D_SENSOR_LOX_O2_RX "LoxO2 Rx" +#define D_GPIO_MAGIC_SWITCH "MagicSwitch" +#define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" + +// Units +#define D_UNIT_AMPERE "A" +#define D_UNIT_CELSIUS "C" +#define D_UNIT_CENTIMETER "cm" +#define D_UNIT_DEGREE "°" +#define D_UNIT_FAHRENHEIT "F" +#define D_UNIT_FPS "FPS" +#define D_UNIT_HERTZ "Hz" +#define D_UNIT_HOUR "h" +#define D_UNIT_GALLONS "gal" +#define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_GRAM_PER_CUBIC_METER "g/m³" +#define D_UNIT_INCH_MERCURY "inHg" +#define D_UNIT_INCREMENTS "inc" +#define D_UNIT_KELVIN "K" +#define D_UNIT_KILOMETER "km" +#define D_UNIT_KILOGRAM "kg" +#define D_UNIT_KILOMETER_PER_HOUR "km/h" // or "km/h" +#define D_UNIT_KILOOHM "kΩ" +#define D_UNIT_KILOWATTHOUR "kWh" +#define D_UNIT_LITERS "L" +#define D_UNIT_LITERS_PER_MIN "L/m" +#define D_UNIT_LUX "lx" +#define D_UNIT_METER "m" +#define D_UNIT_MICROGRAM_PER_CUBIC_METER "µg/m³" +#define D_UNIT_MICROMETER "µm" +#define D_UNIT_MICROSECOND "µs" +#define D_UNIT_MICROSIEMENS_PER_CM "µS/cm" +#define D_UNIT_MICROTESLA "µT" +#define D_UNIT_MILLIAMPERE "mA" +#define D_UNIT_MILLILITERS "ml" +#define D_UNIT_MILLIMETER "mm" +#define D_UNIT_MILLIMETER_MERCURY "mmHg" +#define D_UNIT_MILLISECOND "ms" +#define D_UNIT_MILLIVOLT "mV" +#define D_UNIT_MINUTE "Min" +#define D_UNIT_PARTS_PER_BILLION "ppb" +#define D_UNIT_PARTS_PER_DECILITER "ppd" +#define D_UNIT_PARTS_PER_MILLION "ppm" +#define D_UNIT_MILIGRAMS_PER_LITER "mg/L" +#define D_UNIT_PERCENT "%%" +#define D_UNIT_PRESSURE "hPa" +#define D_UNIT_SECOND "sek" +#define D_UNIT_SECTORS "sektoriai" +#define D_UNIT_VA "VA" +#define D_UNIT_VAR "var" +#define D_UNIT_VOLT "V" +#define D_UNIT_WATT "W" +#define D_UNIT_WATTHOUR "Wh" +#define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" + +#define D_NEW_ADDRESS "Adresas nustatomas į" +#define D_OUT_OF_RANGE "Už ribų" +#define D_SENSOR_DETECTED "aptiktas" + +// SDM220, SDM120, SDM72, LE01MR, SDM230 +#define D_EXPORT_POWER "Eksporto galia" +#define D_IMPORT_POWER "Importo galia" +#define D_PHASE_ANGLE "Fazės kampas" +#define D_IMPORT_ACTIVE "Importo aktyvioji galia" +#define D_EXPORT_ACTIVE "Eksporto aktyvioji galia" +#define D_IMPORT_REACTIVE "Importo reaktinė galia" +#define D_EXPORT_REACTIVE "Eksporto reaktinė galia" +#define D_TOTAL_REACTIVE "Bendra reaktinė galia" +#define D_UNIT_KWARH "kvarh" +#define D_UNIT_ANGLE "Laipsniai" +#define D_TOTAL_ACTIVE "Bendra aktyvioji galia" +#define D_RESETTABLE_TOTAL_ACTIVE "Bendra aktyvioji galia (RST)" + +//SOLAXX1 +#define D_PV1_VOLTAGE "PV1 Įtampa" +#define D_PV1_CURRENT "PV1 Srovė" +#define D_PV1_POWER "PV1 Galia" +#define D_PV2_VOLTAGE "PV2 Įtampa" +#define D_PV2_CURRENT "PV2 Srovė" +#define D_PV2_POWER "PV2 Galia" +#define D_SOLAR_POWER "Saulės energija" +#define D_INVERTER_POWER "Keitiklio galia" +#define D_STATUS "Būsena" +#define D_SOLAX_MODE_0 "Laukiama" +#define D_SOLAX_MODE_1 "Tikrinama" +#define D_SOLAX_MODE_2 "Veikia" +#define D_SOLAX_MODE_3 "Klaida" +#define D_SOLAX_MODE_4 "Pastovi klaida" +#define D_SOLAX_MODE_5 "Programinės įrangos atnaujinimas" +#define D_SOLAX_MODE_6 "Savarankiškas testas" +#define D_SOLAX_ERROR_0 "Be klaidų" +#define D_SOLAX_ERROR_1 "Tinklo praradimo klaida" +#define D_SOLAX_ERROR_2 "Tinklo įtampos klaida" +#define D_SOLAX_ERROR_3 "Tinklo dažnio klaida" +#define D_SOLAX_ERROR_4 "PV Įtampa per aukšta" +#define D_SOLAX_ERROR_5 "PV Izoliacijos klaida" +#define D_SOLAX_ERROR_6 "Per aukšta temperatūra" +#define D_SOLAX_ERROR_7 "Ventiliatoriaus klaida" +#define D_SOLAX_ERROR_8 "Kitų įrenginių klaida" + +//xdrv_10_scripter.ino +#define D_CONFIGURE_SCRIPT "Koreguoti skriptą" +#define D_SCRIPT "koreguoti skriptą" +#define D_SDCARD_UPLOAD "failų įkelimas" +#define D_UFSDIR "ufs direktorija" +#define D_UPL_DONE "Baigta" +#define D_SCRIPT_CHARS_LEFT "liko simbolių" +#define D_SCRIPT_CHARS_NO_MORE "daugiau jokių simbolių" +#define D_SCRIPT_DOWNLOAD "Atsisiųsti" +#define D_SCRIPT_ENABLE "Skriptas įjungtas" +#define D_SCRIPT_UPLOAD "Įkelti" +#define D_SCRIPT_UPLOAD_FILES "Įkelti failus" + +//xdrv_50_filesystem.ino +#define D_MANAGE_FILE_SYSTEM "Valdyti failų sistemą" +#define D_FS_SIZE "Dydis" +#define D_FS_FREE "Laisva" +#define D_NEW_FILE "naujasfailas.txt" +#define D_CREATE_NEW_FILE "Sukurti ir koreguoti naują failą" +#define D_EDIT_FILE "Koreguoti failą" +#define D_CONFIRM_FILE_DEL "Patvirtinti failo ištrinimą" +#define D_SHOW_HIDDEN_FILES "Parodyti paslėptus failus" + +//xsns_67_as3935.ino +#define D_AS3935_GAIN "gain:" +#define D_AS3935_ENERGY "energy:" +#define D_AS3935_DISTANCE "distance:" +#define D_AS3935_DISTURBER "disturber:" +#define D_AS3935_VRMS "µVrms:" +#define D_AS3935_APRX "aprx.:" +#define D_AS3935_AWAY "away" +#define D_AS3935_LIGHT "lightning" +#define D_AS3935_OUT "lightning out of range" +#define D_AS3935_NOT "distance not determined" +#define D_AS3935_ABOVE "lightning overhead" +#define D_AS3935_NOISE "noise detected" +#define D_AS3935_DISTDET "disturber detected" +#define D_AS3935_INTNOEV "Interrupt with no Event!" +#define D_AS3935_FLICKER "IRQ Pin flicker!" +#define D_AS3935_POWEROFF "Powerd Off" +#define D_AS3935_NOMESS "listening..." +#define D_AS3935_ON "On" +#define D_AS3935_OFF "Off" +#define D_AS3935_INDOORS "Indoors" +#define D_AS3935_OUTDOORS "Outdoors" +#define D_AS3935_CAL_FAIL "calibration failed" +#define D_AS3935_CAL_OK "calibration set to:" + +//xsns_68_opentherm.ino +#define D_SENSOR_BOILER_OT_RX "OpenTherm RX" +#define D_SENSOR_BOILER_OT_TX "OpenTherm TX" + +// xnrg_15_teleinfo Denky (Teleinfo) +#define D_CONTRACT "Sutartis" +#define D_POWER_LOAD "Galios apkrova" +#define D_CURRENT_TARIFF "Dabartinis tarifas" +#define D_TARIFF "Tarifas" +#define D_OVERLOAD "Perkrova" +#define D_MAX_POWER "Maksimali galia" +#define D_MAX_CURRENT "Maksimali srovė" + +// xsns_79_as608.ino +#define D_FP_ENROLL_PLACEFINGER "Pridėkite pirštą" +#define D_FP_ENROLL_REMOVEFINGER "Patraukite pirštą" +#define D_FP_ENROLL_PLACESAMEFINGER "Ir vėl pridėkite tą patį pirštą" +#define D_FP_ENROLL_RETRY "Klaida, bandykite dar kartą" +#define D_FP_ENROLL_RESTART "Paleisti iš naujo" +#define D_FP_ENROLL_ERROR "Klaida" +#define D_FP_ENROLL_RESET "Atstatyti" +#define D_FP_ENROLL_ACTIVE "Aktyvus" +#define D_FP_ENROLL_INACTIVE "Neaktyvus" +// Indexed by Adafruit_Fingerprint.h defines +#define D_FP_PACKETRECIEVEERR "Komunikacijos klaida" // 0x01 Error when receiving data package +#define D_FP_NOFINGER "" // 0x02 No finger on the sensor +#define D_FP_IMAGEFAIL "Atvaizdavimo klaida" // 0x03 Failed to enroll the finger +#define D_FP_IMAGEMESS "Antspaudas per daug iškreiptas" // 0x06 Failed to generate character file due to overly disorderly fingerprint image +#define D_FP_FEATUREFAIL "Piršto antspaudas per mažas" // 0x07 Failed to generate character file due to the lack of character point or small fingerprint image +#define D_FP_NOMATCH "Nesutampa" // 0x08 Finger doesn't match +#define D_FP_NOTFOUND "Atitikmens nerasta" // 0x09 Failed to find matching finger +#define D_FP_ENROLLMISMATCH "Pirštų antspaudai nesutampa" // 0x0A Failed to combine the character files +#define D_FP_BADLOCATION "Neteisinga vieta" // 0x0B Addressed PageID is beyond the finger library +#define D_FP_DBRANGEFAIL "DB diapazono klaida" // 0x0C Error when reading template from library or invalid template +#define D_FP_UPLOADFEATUREFAIL "Įkėlimo funkcijos klaida" // 0x0D Error when uploading template +#define D_FP_PACKETRESPONSEFAIL "Paketo atsako klaida" // 0x0E Module failed to receive the following data packages +#define D_FP_UPLOADFAIL "Įkėlimo klaida" // 0x0F Error when uploading image +#define D_FP_DELETEFAIL "Naikinimo klaida" // 0x10 Failed to delete the template +#define D_FP_DBCLEARFAIL "DB išvalymo klaida" // 0x11 Failed to clear finger library +#define D_FP_PASSFAIL "Slaptažodžio klaida" // 0x13 Find whether the fingerprint passed or failed +#define D_FP_INVALIDIMAGE "Neleistinas antspaudas" // 0x15 Failed to generate image because of lac of valid primary image +#define D_FP_FLASHERR "Flash rašymo klaida" // 0x18 Error when writing flash +#define D_FP_INVALIDREG "Neteisingas numeris" // 0x1A Invalid register number +#define D_FP_ADDRCODE "Adreso kodas" // 0x20 Address code +#define D_FP_PASSVERIFY "Slaptažodis patvirtintas" // 0x21 Verify the fingerprint passed +#define D_FP_UNKNOWNERROR "Klaida" // Any other error + +// xsns_90_hrg15.ino +#define D_HRG_VALID "Galiojantis" +#define D_HRG_ACTIVE "Aktyvus" +#define D_HRG_EVENT "Įvykis" +#define D_HRG_TOTAL "Viso" +#define D_HRG_FLOWRATE "Tėkmės greitis" + +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Tėkmės greitis" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Kiekis šiandien" +#define D_FLOWRATEMETER_DURATION_TODAY "Trukmė šiandien" + +// xsns_83_neopool.ino +#define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names +#define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" +#define D_NEOPOOL_MACH_AQUASCENIC "Aquascenic" +#define D_NEOPOOL_MACH_OXILIFE "Oxilife" +#define D_NEOPOOL_MACH_BIONET "Bionet" +#define D_NEOPOOL_MACH_HIDRONISER "Hidroniser" +#define D_NEOPOOL_MACH_UVSCENIC "UVScenic" +#define D_NEOPOOL_MACH_STATION "Station" +#define D_NEOPOOL_MACH_BRILIX "Brilix" +#define D_NEOPOOL_MACH_GENERIC "Generic" +#define D_NEOPOOL_MACH_BAYROL "Bayrol" +#define D_NEOPOOL_MACH_HAY "Hay" +#define D_NEOPOOL_FILTRATION_MANUAL "Rankinis" // Filtration modes +#define D_NEOPOOL_FILTRATION_AUTO "Automatinis" +#define D_NEOPOOL_FILTRATION_HEATING "Šildymas" +#define D_NEOPOOL_FILTRATION_SMART "Išmanus" +#define D_NEOPOOL_FILTRATION_INTELLIGENT "Protingas" +#define D_NEOPOOL_FILTRATION_BACKWASH "Atgalinis valymas" +#define D_NEOPOOL_FILTRATION_NONE "" // Filtration speed level +#define D_NEOPOOL_FILTRATION_SLOW "lėtas" +#define D_NEOPOOL_FILTRATION_MEDIUM "vidutinis" +#define D_NEOPOOL_FILTRATION_FAST "greitas" +#define D_NEOPOOL_TYPE "Tipas" // Sensor & relais names +#define D_NEOPOOL_REDOX "Redox" +#define D_NEOPOOL_CHLORINE "Chloras" +#define D_NEOPOOL_CONDUCTIVITY "Laidumas" +#define D_NEOPOOL_IONIZATION "Ionization" +#define D_NEOPOOL_HYDROLYSIS "Hidrolizė" +#define D_NEOPOOL_RELAY "Relė" +#define D_NEOPOOL_RELAY_FILTRATION "Filtravimas" // Relay assignment +#define D_NEOPOOL_RELAY_LIGHT "Šviesa" +#define D_NEOPOOL_RELAY_PH_ACID "Rūgšties siurblys" +#define D_NEOPOOL_RELAY_PH_BASE "Bazės siurblys" +#define D_NEOPOOL_RELAY_RX "Redox lygis" +#define D_NEOPOOL_RELAY_CL "Chloro siurblys" +#define D_NEOPOOL_RELAY_CD "Laidumas" +#define D_NEOPOOL_RELAY_HEATING "Šildymas" +#define D_NEOPOOL_RELAY_UV "UV" +#define D_NEOPOOL_RELAY_VALVE "Vožtuvas" +#define D_NEOPOOL_RELAY_AUX "Aux" +#define D_NEOPOOL_TIME "Laikas" +#define D_NEOPOOL_FILT_MODE "Filtravimo režimas" +#define D_NEOPOOL_CELL_RUNTIME "Cell runtime" +#define D_NEOPOOL_POLARIZATION "Pol" // Sensor status +#define D_NEOPOOL_PR_OFF "PrIšjungta" +#define D_NEOPOOL_SETPOINT_OK "Gerai" +#define D_NEOPOOL_COVER "Uždangalas" +#define D_NEOPOOL_SHOCK "Stiprintuvas" +#define D_NEOPOOL_STATUS_ON "Įjungta" +#define D_NEOPOOL_STATUS_OFF "Išjungta" +#define D_NEOPOOL_STATUS_WAIT "LAUKIA" +#define D_NEOPOOL_STATUS_TANK "BAKAS" +#define D_NEOPOOL_STATUS_FLOW "Srautas" +#define D_NEOPOOL_LOW "Mažas" +#define D_NEOPOOL_FLOW1 "FL1" +#define D_NEOPOOL_FLOW2 "FL2" +#define D_NEOPOOL_PH_HIGH "per didelis" // ph Alarms +#define D_NEOPOOL_PH_LOW "per mažas" +#define D_NEOPOOL_PUMP_TIME_EXCEEDED "siurblio veikimo laikas viršytas" + +// xsns_106_gdk101.ino +#define D_AVG_RAD_DOSE "Vidutinė radiacijos dozė" +#define D_UNIT_US_H "µSv/h" + +// ixrv92_pipsolar.ino +#define D_SENSOR_PIPSOLAR_TX "Pipsolar TX" +#define D_SENSOR_PIPSOLAR_RX "Pipsolar RX" + +// xsns_102_ld2410.ino +#define D_MOVING_DISTANCE "Besikeičiantis atstumas" +#define D_STATIC_DISTANCE "Statinis atstumas" +#define D_DETECT_DISTANCE "Detect Distance" +#define D_MOVING_ENERGY_T "Judantis objektas" +#define D_STATIC_ENERGY_T "Statinis objektas" +#define D_LD2410_PIN_STATE "Išvesties kontakto būsena" +#define D_LD2410_LIGHT "Šviesos sensorius" + +// xsns_115_wooliis.ino +#define D_IMPORT "Importuoti" +#define D_EXPORT "Eksportuoti" +#define D_CHARGING "Kraunasi" +#define D_CAPACITY "Talpa" + +#endif // _LANGUAGE_LT_LT_H_ diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 9a27938c9..d7b9bc0f0 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Wachtwoord herkend" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fout" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index c1c9650ad..b0e87e711 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Zweryfikowano poprawnie" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Błąd" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Przepływ" #define D_FLOWRATEMETER_AMOUNT_TODAY "Wartość dzisiaj" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index a940abfd6..8fdb5522a 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Senha verificada" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Erro" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index fe4a4714d..456a63ba3 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Palavra-passe verificada" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Erro" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Quantidade Hoje" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index 3408016a9..9a8d8847e 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index ef655916d..43cfba06a 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -1012,12 +1012,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "А" @@ -1213,6 +1219,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index a906456cb..57998b8d9 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 0d160b4f2..338447aea 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index 320c058cf..60ca0cbb0 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 7d6471957..3ec1df400 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "А" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 42c68305d..97297a248 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index cd5692717..065864175 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "A" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 29125d6ea..4bda42c0f 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -1011,12 +1011,18 @@ #define D_SENSOR_ME007_RX "ME007 Rx" #define D_SENSOR_TUYAMCUBR_TX "TuyaMCUBr Tx" #define D_SENSOR_TUYAMCUBR_RX "TuyaMCUBr Rx" +#define D_SENSOR_TWAI_TX "TWAI Tx" +#define D_SENSOR_TWAI_RX "TWAI Rx" +#define D_SENSOR_TWAI_BO "TWAI BusOff" +#define D_SENSOR_TWAI_CLK "TWAI ClkOut" #define D_SENSOR_BIOPDU_PZEM0XX_TX "BioPDU PZEM0XX Tx" #define D_SENSOR_BIOPDU_PZEM016_RX "BioPDU PZEM016 Rx" #define D_SENSOR_BIOPDU_BIT "BioPDU Bit" #define D_SENSOR_LOX_O2_RX "LoxO2 RX" #define D_GPIO_MAGIC_SWITCH "MagicSwitch" #define D_SENSOR_WOOLIIS_RX "Wooliis Rx" +#define D_SENSOR_C8_CO2_5K_RX "C8-CO2-5K Rx" +#define D_SENSOR_C8_CO2_5K_TX "C8-CO2-5K Tx" // Units #define D_UNIT_AMPERE "安培" @@ -1212,6 +1218,13 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_90_hrg15.ino +#define D_HRG_VALID "Valid" +#define D_HRG_ACTIVE "Active" +#define D_HRG_EVENT "Event" +#define D_HRG_TOTAL "Total" +#define D_HRG_FLOWRATE "Flow Rate" + // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" #define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 12a1ec8f9..2b7855972 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -172,6 +172,7 @@ #define MQTT_BUTTON_SWITCH_FORCE_LOCAL false // [SetOption61] Force local operation when button/switch topic is set (false = off, true = on) #define MQTT_INDEX_SEPARATOR false // [SetOption64] Enable "_" instead of "-" as sensor index separator #define MQTT_TUYA_RECEIVED false // [SetOption66] Enable TuyaMcuReceived messages over Mqtt +#define MQTT_ONLY_JSON_OUTPUT false // [SetOption90] Disable non-json messages #define MQTT_TLS_ENABLED false // [SetOption103] Enable TLS mode (requires TLS version) #define MQTT_TLS_FINGERPRINT false // [SetOption132] Force TLS fingerprint validation instead of CA (requires TLS version) @@ -185,7 +186,10 @@ #define CORS_DOMAIN "" // [Cors] CORS Domain for preflight requests // -- HTTP Options -------------------------------- +#define GUI_NOSHOW_MODULE false // [SetOption141] Do not show module name in GUI main menu +#define GUI_NOSHOW_DEVICENAME false // [SetOption163] Do not show device name in GUI main menu #define GUI_SHOW_HOSTNAME false // [SetOption53] Show hostname and IP address in GUI main menu +#define GUI_NOSHOW_STATETEXT false // [SetOption161] Do not show power state text in GUI // -- HTTP GUI Colors ----------------------------- // HTML hex color codes. Only 3 and 6 digit hex string values are supported!! See https://www.w3schools.com/colors/colors_hex.asp @@ -385,6 +389,7 @@ //#define MY_LANGUAGE hu_HU // Hungarian in Hungary //#define MY_LANGUAGE it_IT // Italian in Italy //#define MY_LANGUAGE ko_KO // Korean in Korea +//#define MY_LANGUAGE lt_LT // Lithuanian in Lithuania //#define MY_LANGUAGE nl_NL // Dutch in the Nederland //#define MY_LANGUAGE pl_PL // Polish in Poland //#define MY_LANGUAGE pt_BR // Portuguese in Brazil @@ -412,8 +417,10 @@ // -- ESP-NOW ------------------------------------- //#define USE_TASMESH // Enable Tasmota Mesh using ESP-NOW (+11k code) -//#define USE_TASMESH_HEARTBEAT // If enabled, the broker will detect when nodes come online and offline and send Birth and LWT messages over MQTT correspondingly -//#define TASMESH_OFFLINE_DELAY 3 // Maximum number of seconds since the last heartbeat before the broker considers a node to be offline +// #define USE_TASMESH_HEARTBEAT // If enabled, the broker will detect when nodes come online and offline and send Birth and LWT messages over MQTT correspondingly +// #define TASMESH_OFFLINE_DELAY 3 // Maximum number of seconds since the last heartbeat before the broker considers a node to be offline +//#define USE_WIZMOTE // [SetOption164 1] Add support for WiZ Smart Remote (uses ESP-NOW) (+4k2 code) +// #define WIZMOTE_CHANNEL 1 // WiZ Smart Remote ESP-NOW channel if WiFi is disabled // -- OTA ----------------------------------------- //#define USE_ARDUINO_OTA // Add optional support for Arduino OTA with ESP8266 (+13k code) @@ -529,6 +536,7 @@ #define ROTARY_V1 // Add support for Rotary Encoder as used in MI Desk Lamp (+0k8 code) #define ROTARY_MAX_STEPS 10 // Rotary step boundary #define USE_SONOFF_RF // Add support for Sonoff Rf Bridge (+3k2 code) +// #define FIX_JSON_HEXADECIMAL // Add "0x" as prefix to hexadecimal value (disabled for legacy) #define USE_RF_FLASH // Add support for flashing the EFM8BB1 chip on the Sonoff RF Bridge. C2CK must be connected to GPIO4, C2D to GPIO5 on the PCB (+2k7 code) #define USE_SONOFF_SC // Add support for Sonoff Sc (+1k1 code) #define USE_TUYA_MCU // Add support for Tuya Serial MCU @@ -562,7 +570,7 @@ // #define MAGICSWITCH_MASKING_WINDOW_LEN 5 // Overridable masking window (in number of 50ms loops) // -- Optional light modules ---------------------- -#define USE_LIGHT // Add support for light control +#define USE_LIGHT // Add support for light control #define USE_MY92X1 // Add support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas #define USE_SM16716 // Add support for SM16716 RGB LED controller (+0k7 code) #define USE_SM2135 // Add support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) @@ -738,8 +746,8 @@ // // Both settings together allow to limit searching for INA3221 to only a subset of addresses // #define INA3221_CALC_CHARGE_AH // calculate charge in Ah // #define INA3221_CALC_ENERGY_WH // calculate energy in Wh -// #define INA3221_SUPPLY_SIDE 0x7777 // the driver adds the measured Shunt Voltage to the Bus Voltage - // for the cannel with a negativ shunt (shunt <0) thus showing the values of the supply side (IN+) +// #define INA3221_SUPPLY_SIDE 0x7777 // the driver adds the measured Shunt Voltage to the Bus Voltage + // for the cannel with a negativ shunt (shunt <0) thus showing the values of the supply side (IN+) // additionaly the bits set (bit 0,1,2) enable the scanning of the voltage in the according channel // #define USE_PMSA003I // [I2cDriver78] Enable PMSA003I Air Quality Sensor (I2C address 0x12) (+1k8 code) // #define USE_GDK101 // [I2cDriver79] Enable GDK101 sensor (I2C addresses 0x18 - 0x1B) (+1k2 code) @@ -765,6 +773,7 @@ // #define USE_BM8563 // [I2cDriver59] Enable BM8563 RTC - used by M5Stack - support both I2C buses on ESP32 (I2C address 0x51) (+2.5k code) // #define USE_PCF85363 // [I2cDriver66] Enable PCF85363 RTC - used by Shelly 3EM (I2C address 0x51) (+0k7 code) // #define USE_RX8010 // [I2cDriver90] Enable RX8010 RTC - used by IOTTIMER - support both I2C buses on ESP32 (I2C address 0x32) (+0k7 code) +// #define USE_PCF85063 // [I2cDriver92] Enable PCF85063 RTC support (I2C address 0x51) // #define USE_DISPLAY // Add I2C/TM1637/MAX7219 Display Support (+2k code) #define USE_DISPLAY_MODES1TO5 // Enable display mode 1 to 5 in addition to mode 0 @@ -890,7 +899,8 @@ //#define USE_VINDRIKTNING // Add support for IKEA VINDRIKTNING particle concentration sensor (+0k6 code) // #define VINDRIKTNING_SHOW_PM1 // Display undocumented/supposed PM1.0 values // #define VINDRIKTNING_SHOW_PM10 // Display undocumented/supposed PM10 values -//#define USE_LD2410 // Add support for HLK-LD2410 24GHz smart wave motion sensor (+2k8 code) +//#define USE_LD2410 // Add support for HLK-LD2410 24GHz smart wave motion sensor (+3k7 code, 88 RAM) +//#define USE_LD2410S // Add support for HLK-LD2410S Ultra Low-power 24GHz smart wave motion sensor (+4k7 code, 144 RAM) //#define USE_LOX_O2 // Add support for LuminOx LOX O2 Sensor (+0k8 code) //#define USE_GM861 // Add support for GM861 1D and 2D Bar Code Reader (+1k3 code) // #define GM861_DECODE_AIM // Decode AIM-id (+0k3 code) @@ -1194,6 +1204,8 @@ // Note that only one cipher is enabled: ECDHE_RSA_WITH_AES_128_GCM_SHA256 which is very commonly used and highly secure #define USE_BERRY_WEBCLIENT_USERAGENT "TasmotaClient" // default user-agent used, can be changed with `wc.set_useragent()` #define USE_BERRY_WEBCLIENT_TIMEOUT 2000 // Default timeout in milliseconds + #define USE_BERRY_LEDS_PANEL // Add button to dynamically load the Leds Panel from a bec file online + #define USE_BERRY_LEDS_PANEL_URL "http://ota.tasmota.com/tapp/leds_panel.bec" //#define USE_BERRY_PARTITION_WIZARD // Add a button to dynamically load the Partion Wizard from a bec file online (+1.3KB Flash) #define USE_BERRY_PARTITION_WIZARD_URL "http://ota.tasmota.com/tapp/partition_wizard.bec" //#define USE_BERRY_GPIOVIEWER // Add a button to dynamocally load the GPIO Viewer from a bec file online @@ -1271,7 +1283,7 @@ #define BE_LV_WIDGET_SPINNER #define BE_LV_WIDGET_SPANGROUP #define BE_LV_WIDGET_SPAN - // #define BE_LV_WIDGET_TABVIEW + #define BE_LV_WIDGET_TABVIEW // #define BE_LV_WIDGET_TILEVIEW // -- Matter protocol --------------------------------- @@ -1403,6 +1415,8 @@ #define USE_SHINE #define MP3_MIC_STREAM #define USE_I2S_AUDIO_BERRY + #define USE_I2S_AAC + #define USE_I2S_OPUS #endif // USE_I2S_ALL #endif // _MY_USER_CONFIG_H_ diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 94b611e1a..0f6410701 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -314,8 +314,9 @@ struct TasmotaGlobal_t { bool pwm_present; // Any PWM channel configured with SetOption15 0 bool i2c_enabled[2]; // I2C configured for all possible buses (1 or 2) #ifdef ESP32 + bool camera_initialized; // For esp32-webcam, to be used in discovery bool ota_factory; // Select safeboot binary -#endif +#endif // ESP32 bool ntp_force_sync; // Force NTP sync bool skip_light_fade; // Temporarily skip light fading bool restart_halt; // Do not restart but stay in wait loop @@ -382,6 +383,7 @@ struct TasmotaGlobal_t { #endif // PIO_FRAMEWORK_ARDUINO_MMU_CACHE16_IRAM48_SECHEAP_SHARED #ifdef USE_BERRY + bool berry_deferred_ready = false; // is there an deferred Berry function to be called at next millisecond bool berry_fast_loop_enabled = false; // is Berry fast loop enabled, i.e. control is passed at each loop iteration #endif // USE_BERRY } TasmotaGlobal = { 0 }; @@ -409,6 +411,7 @@ void setup(void) { #endif // DISABLE_ESP32_BROWNOUT #ifndef FIRMWARE_SAFEBOOT +#ifndef DISABLE_PSRAMCHECK #ifndef CORE32SOLO1 // restore GPIO5/18 or 16/17 if no PSRAM is found which may be used by Ethernet among others if (!FoundPSRAM()) { @@ -422,6 +425,7 @@ void setup(void) { } } #endif // CORE32SOLO1 +#endif // DISABLE_PSRAMCHECK #endif // FIRMWARE_SAFEBOOT #endif // CONFIG_IDF_TARGET_ESP32 #endif // ESP32 diff --git a/tasmota/tasmota_support/settings.ino b/tasmota/tasmota_support/settings.ino index 8d5008efd..ff1666bf3 100644 --- a/tasmota/tasmota_support/settings.ino +++ b/tasmota/tasmota_support/settings.ino @@ -1105,7 +1105,10 @@ void SettingsDefaultSet2(void) { flag2.emulation |= EMULATION; flag4.alexa_gen_1 |= EMULATION_HUE_1ST_GEN; #endif // FIRMWARE_MINIMAL + flag5.gui_module_name |= GUI_NOSHOW_MODULE; + flag6.gui_device_name |= GUI_NOSHOW_DEVICENAME; flag3.gui_hostname_ip |= GUI_SHOW_HOSTNAME; + flag6.gui_no_state_text |= GUI_NOSHOW_STATETEXT; flag3.mdns_enabled |= MDNS_ENABLED; Settings->webserver = WEB_SERVER; Settings->weblog_level = WEB_LOG_LEVEL; @@ -1156,6 +1159,7 @@ void SettingsDefaultSet2(void) { flag3.no_hold_retain |= MQTT_NO_HOLD_RETAIN; flag3.use_underscore |= MQTT_INDEX_SEPARATOR; flag3.grouptopic_mode |= MQTT_GROUPTOPIC_FORMAT; + flag4.only_json_message |= MQTT_ONLY_JSON_OUTPUT; SettingsUpdateText(SET_MQTT_HOST, MQTT_HOST); Settings->mqtt_port = MQTT_PORT; SettingsUpdateText(SET_MQTT_CLIENT, PSTR(MQTT_CLIENT_ID)); @@ -1244,7 +1248,6 @@ void SettingsDefaultSet2(void) { // RF Bridge #ifndef FIRMWARE_MINIMAL // not needed in minimal/safeboot because of disabled feature and Settings are not saved anyways - flag.rf_receive_decimal |= RF_DATA_RADIX; // for (uint32_t i = 0; i < 17; i++) { Settings->rf_code[i][0] = 0; } memcpy_P(Settings->rf_code[0], kDefaultRfCode, 9); #endif // FIRMWARE_MINIMAL @@ -1855,7 +1858,6 @@ void SettingsDelta(void) { char scolor[10]; WebHexCode(COL_BUTTON_OFF, GetTextIndexed(scolor, sizeof(scolor), COL_BUTTON_OFF, kWebColors)); } - if (Settings->version < 0x0E030007) { // 14.3.0.7 // move up uint8_t knx_CB_registered from 4A8 to 533 memmove_P((uint8_t*)&Settings->knx_CB_registered, (uint8_t*)&Settings->switchmode, 1); diff --git a/tasmota/tasmota_support/support.ino b/tasmota/tasmota_support/support.ino index 4caa4bdf4..659bf8b4d 100755 --- a/tasmota/tasmota_support/support.ino +++ b/tasmota/tasmota_support/support.ino @@ -2649,6 +2649,10 @@ void AddLogData(uint32_t loglevel, const char* log_data, const char* log_data_pa uint32_t highest_loglevel = Settings->weblog_level; if (Settings->mqttlog_level > highest_loglevel) { highest_loglevel = Settings->mqttlog_level; } +#ifdef USE_UFILESYS + uint32_t filelog_level = Settings->filelog_level % 10; + if (filelog_level > highest_loglevel) { highest_loglevel = filelog_level; } +#endif // USE_UFILESYS if (TasmotaGlobal.syslog_level > highest_loglevel) { highest_loglevel = TasmotaGlobal.syslog_level; } if (TasmotaGlobal.templog_level > highest_loglevel) { highest_loglevel = TasmotaGlobal.templog_level; } if (TasmotaGlobal.uptime < 3) { highest_loglevel = LOG_LEVEL_DEBUG_MORE; } // Log all before setup correct log level @@ -2697,6 +2701,9 @@ uint32_t HighestLogLevel() { uint32_t highest_loglevel = TasmotaGlobal.seriallog_level; if (Settings->weblog_level > highest_loglevel) { highest_loglevel = Settings->weblog_level; } if (Settings->mqttlog_level > highest_loglevel) { highest_loglevel = Settings->mqttlog_level; } +#ifdef USE_UFILESYS + if (Settings->filelog_level > highest_loglevel) { highest_loglevel = Settings->filelog_level; } +#endif // USE_UFILESYS if (TasmotaGlobal.syslog_level > highest_loglevel) { highest_loglevel = TasmotaGlobal.syslog_level; } if (TasmotaGlobal.templog_level > highest_loglevel) { highest_loglevel = TasmotaGlobal.templog_level; } if (TasmotaGlobal.uptime < 3) { highest_loglevel = LOG_LEVEL_DEBUG_MORE; } // Log all before setup correct log level diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index 727da3273..cf6ba7c7b 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -29,6 +29,9 @@ const char kTasmotaCommands[] PROGMEM = "|" // No prefix D_CMND_VOLTAGE_RESOLUTION "|" D_CMND_FREQUENCY_RESOLUTION "|" D_CMND_CURRENT_RESOLUTION "|" D_CMND_ENERGY_RESOLUTION "|" D_CMND_WEIGHT_RESOLUTION "|" D_CMND_MODULE "|" D_CMND_MODULES "|" D_CMND_GPIO "|" D_CMND_GPIOREAD "|" D_CMND_GPIOS "|" D_CMND_TEMPLATE "|" D_CMND_PWM "|" D_CMND_PWMFREQUENCY "|" D_CMND_PWMRANGE "|" D_CMND_BUTTONDEBOUNCE "|" D_CMND_SWITCHDEBOUNCE "|" D_CMND_SYSLOG "|" D_CMND_LOGHOST "|" D_CMND_LOGPORT "|" +#ifdef USE_UFILESYS + D_CMND_FILELOG "|" +#endif // USE_UFILESYS D_CMND_SERIALBUFFER "|" D_CMND_SERIALSEND "|" D_CMND_BAUDRATE "|" D_CMND_SERIALCONFIG "|" D_CMND_SERIALDELIMITER "|" D_CMND_IPADDRESS "|" D_CMND_NTPSERVER "|" D_CMND_AP "|" D_CMND_SSID "|" D_CMND_PASSWORD "|" D_CMND_HOSTNAME "|" D_CMND_WIFICONFIG "|" D_CMND_WIFI "|" D_CMND_DNSTIMEOUT "|" D_CMND_DEVICENAME "|" D_CMND_FN "|" D_CMND_FRIENDLYNAME "|" D_CMND_SWITCHMODE "|" D_CMND_INTERLOCK "|" D_CMND_TELEPERIOD "|" D_CMND_RESET "|" D_CMND_TIME "|" D_CMND_TIMEZONE "|" D_CMND_TIMESTD "|" @@ -69,6 +72,9 @@ void (* const TasmotaCommand[])(void) PROGMEM = { &CmndVoltageResolution, &CmndFrequencyResolution, &CmndCurrentResolution, &CmndEnergyResolution, &CmndWeightResolution, &CmndModule, &CmndModules, &CmndGpio, &CmndGpioRead, &CmndGpios, &CmndTemplate, &CmndPwm, &CmndPwmfrequency, &CmndPwmrange, &CmndButtonDebounce, &CmndSwitchDebounce, &CmndSyslog, &CmndLoghost, &CmndLogport, +#ifdef USE_UFILESYS + &CmndFilelog, +#endif // USE_UFILESYS &CmndSerialBuffer, &CmndSerialSend, &CmndBaudrate, &CmndSerialConfig, &CmndSerialDelimiter, &CmndIpAddress, &CmndNtpServer, &CmndAp, &CmndSsid, &CmndPassword, &CmndHostname, &CmndWifiConfig, &CmndWifi, &CmndDnsTimeout, &CmndDevicename, &CmndFriendlyname, &CmndFriendlyname, &CmndSwitchMode, &CmndInterlock, &CmndTeleperiod, &CmndReset, &CmndTime, &CmndTimezone, &CmndTimeStd, @@ -922,11 +928,19 @@ void CmndStatus(void) } if ((0 == payload) || (3 == payload)) { - Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS3_LOGGING "\":{\"" D_CMND_SERIALLOG "\":%d,\"" D_CMND_WEBLOG "\":%d,\"" D_CMND_MQTTLOG "\":%d,\"" D_CMND_SYSLOG "\":%d,\"" - D_CMND_LOGHOST "\":\"%s\",\"" D_CMND_LOGPORT "\":%d,\"" D_CMND_SSID "\":[\"%s\",\"%s\"],\"" D_CMND_TELEPERIOD "\":%d,\"" + Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS3_LOGGING "\":{\"" D_CMND_SERIALLOG "\":%d,\"" D_CMND_WEBLOG "\":%d,\"" D_CMND_MQTTLOG "\":%d,\"" +#ifdef USE_UFILESYS + D_CMND_FILELOG "\":%d,\"" +#endif // USE_UFILESYS + D_CMND_SYSLOG "\":%d,\"" D_CMND_LOGHOST "\":\"%s\",\"" D_CMND_LOGPORT "\":%d,\"" + D_CMND_SSID "\":[\"%s\",\"%s\"],\"" D_CMND_TELEPERIOD "\":%d,\"" D_JSON_RESOLUTION "\":\"%08X\",\"" D_CMND_SETOPTION "\":[\"%08X\",\"%s\",\"%08X\",\"%08X\",\"%08X\",\"%08X\"]}}"), - Settings->seriallog_level, Settings->weblog_level, Settings->mqttlog_level, Settings->syslog_level, - SettingsText(SET_SYSLOG_HOST), Settings->syslog_port, EscapeJSONString(SettingsText(SET_STASSID1)).c_str(), EscapeJSONString(SettingsText(SET_STASSID2)).c_str(), Settings->tele_period, + Settings->seriallog_level, Settings->weblog_level, Settings->mqttlog_level, +#ifdef USE_UFILESYS + Settings->filelog_level, +#endif // USE_UFILESYS + Settings->syslog_level, SettingsText(SET_SYSLOG_HOST), Settings->syslog_port, + EscapeJSONString(SettingsText(SET_STASSID1)).c_str(), EscapeJSONString(SettingsText(SET_STASSID2)).c_str(), Settings->tele_period, Settings->flag2.data, Settings->flag.data, ToHex_P((unsigned char*)Settings->param, PARAM8_SIZE, stemp2, sizeof(stemp2)), Settings->flag3.data, Settings->flag4.data, Settings->flag5.data, Settings->flag6.data); CmndStatusResponse(3); @@ -1019,10 +1033,14 @@ void CmndStatus(void) } if (((0 == payload) || (6 == payload)) && Settings->flag.mqtt_enabled) { // SetOption3 - Enable MQTT + uint32_t mqtt_tls = 0; +#ifdef USE_MQTT_TLS + mqtt_tls = MqttTLSEnabled() ? 1 : 0; +#endif // USE_MQTT_TLS Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS6_MQTT "\":{\"" D_CMND_MQTTHOST "\":\"%s\",\"" D_CMND_MQTTPORT "\":%d,\"" D_CMND_MQTTCLIENT D_JSON_MASK "\":\"%s\",\"" - D_CMND_MQTTCLIENT "\":\"%s\",\"" D_CMND_MQTTUSER "\":\"%s\",\"" D_JSON_MQTT_COUNT "\":%d,\"MAX_PACKET_SIZE\":%d,\"KEEPALIVE\":%d,\"SOCKET_TIMEOUT\":%d}}"), + D_CMND_MQTTCLIENT "\":\"%s\",\"" D_CMND_MQTTUSER "\":\"%s\",\"" D_JSON_MQTT_COUNT "\":%d,\"" D_JSON_MQTT_TLS "\":%d,\"MAX_PACKET_SIZE\":%d,\"KEEPALIVE\":%d,\"SOCKET_TIMEOUT\":%d}}"), SettingsText(SET_MQTT_HOST), Settings->mqtt_port, EscapeJSONString(SettingsText(SET_MQTT_CLIENT)).c_str(), - TasmotaGlobal.mqtt_client, EscapeJSONString(SettingsText(SET_MQTT_USER)).c_str(), MqttConnectCount(), MQTT_MAX_PACKET_SIZE, Settings->mqtt_keepalive, Settings->mqtt_socket_timeout); + TasmotaGlobal.mqtt_client, EscapeJSONString(SettingsText(SET_MQTT_USER)).c_str(), MqttConnectCount(), mqtt_tls, MQTT_MAX_PACKET_SIZE, Settings->mqtt_keepalive, Settings->mqtt_socket_timeout); CmndStatusResponse(6); } @@ -2147,6 +2165,29 @@ void CmndLogport(void) ResponseCmndNumber(Settings->syslog_port); } +#ifdef USE_UFILESYS +void CmndFilelog(void) { + // Filelog 0 - Disable file logging + // Filelog 1..4 - Enable rotating file logging + // Filelog 10 - Remove log files and disable file logging + // Filelog 11..14 - Remove log files and enable file logging until filesystem is full or max rotates + if (XdrvMailbox.payload >= LOG_LEVEL_NONE) { + uint32_t filelog_level = XdrvMailbox.payload % 10; + uint32_t filelog_option = XdrvMailbox.payload / 10; + if (1 == filelog_option) { // Enable file logging until filesystem is full + FileLoggingDelete(); // Remove all log files + if (LOG_LEVEL_NONE == filelog_level) { // Remove log files and disable logging + filelog_option = 0; + } + } + if ((filelog_level >= LOG_LEVEL_NONE) && (filelog_level <= LOG_LEVEL_DEBUG_MORE)) { + Settings->filelog_level = (filelog_option * 10) + filelog_level; + } + } + ResponseCmndNumber(Settings->filelog_level); +} +#endif // USE_UFILESYS + void CmndIpAddress(void) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 5)) { @@ -2709,6 +2750,8 @@ void CmndWifi(void) { { Settings->flag4.network_wifi = XdrvMailbox.payload; if (Settings->flag4.network_wifi) { +// TasmotaGlobal.wifi_state_flag = WIFI_RESTART; +// WifiConnect(); #ifdef ESP32 WifiConnect(); #else // ESP8266 @@ -2909,4 +2952,4 @@ void CmndTouchThres(void) { } #endif // ESP32 SOC_TOUCH_VERSION_1 or SOC_TOUCH_VERSION_2 -#endif // ESP32 \ No newline at end of file +#endif // ESP32 diff --git a/tasmota/tasmota_support/support_features.ino b/tasmota/tasmota_support/support_features.ino index 2d8104524..f08d13dea 100644 --- a/tasmota/tasmota_support/support_features.ino +++ b/tasmota/tasmota_support/support_features.ino @@ -931,10 +931,18 @@ constexpr uint32_t feature[] = { #if defined(USE_I2C) && defined(USE_RTC_CHIPS) && defined(USE_RX8010) 0x00000200 | // xdrv_56_rtc_chips.ino #endif -// 0x00000400 | // -// 0x00000800 | // -// 0x00001000 | // -// 0x00002000 | // +#if defined(USE_I2C) && defined(USE_RTC_CHIPS) && defined(USE_PCF85063) + 0x00000400 | // xdrv_56_rtc_chips.ino +#endif +#ifdef USE_ESP32_TWAI + 0x00000800 | // xdrv_91_esp32_twai.ino +#endif +#ifdef USE_C8_CO2_5K + 0x00001000 | // xsns_117_c8_co2_5k.ino +#endif +#ifdef USE_WIZMOTE + 0x00002000 | // xdrv_77_wizmote.ino +#endif // 0x00004000 | // // 0x00008000 | // // 0x00010000 | // diff --git a/tasmota/tasmota_support/support_tasmota.ino b/tasmota/tasmota_support/support_tasmota.ino index d8cceedc4..b42f79a8f 100644 --- a/tasmota/tasmota_support/support_tasmota.ino +++ b/tasmota/tasmota_support/support_tasmota.ino @@ -1176,6 +1176,9 @@ void PerformEverySecond(void) #ifdef SYSLOG_UPDATE_SECOND SyslogAsync(false); #endif // SYSLOG_UPDATE_SECOND +#ifdef USE_UFILESYS + FileLoggingAsync(false); +#endif // USE_UFILESYS ResetGlobalValues(); @@ -1346,6 +1349,9 @@ void Every250mSeconds(void) // Check if log refresh needed in case of fast buffer fill MqttPublishLoggingAsync(true); SyslogAsync(true); +#ifdef USE_UFILESYS + FileLoggingAsync(true); +#endif // USE_UFILESYS /*-------------------------------------------------------------------------------------------*\ * Every second at 0.25 second interval diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index 1e4dfbf52..1e743efb5 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -433,7 +433,7 @@ const char HTTP_COUNTER[] PROGMEM = "
"; const char HTTP_END[] PROGMEM = - "" + "" "" "" ""; @@ -985,11 +985,12 @@ void WSContentSendStyle_P(const char* formatP, ...) { WebColor(COL_TEXT_WARNING), #endif WebColor(COL_TITLE), - (Web.initial_config) ? "" : (Settings->flag5.gui_module_name) ? "" : ModuleName().c_str(), SettingsTextEscaped(SET_DEVICENAME).c_str()); + (Web.initial_config) ? "" : (Settings->flag5.gui_module_name) ? "" : ModuleName().c_str(), // SetOption141 - (GUI) Disable display of GUI module name (1) + (Settings->flag6.gui_device_name) ? "" : SettingsTextEscaped(SET_DEVICENAME).c_str()); // SetOption163 - (GUI) Disable display of GUI device name (1) // SetOption53 - Show hostname and IP address in GUI main menu #if (RESTART_AFTER_INITIAL_WIFI_CONFIG) - if (Settings->flag3.gui_hostname_ip) { // SetOption53 - (GUI) Show hostname and IP address in GUI main menu + if (Settings->flag3.gui_hostname_ip) { // SetOption53 - (GUI) Show hostname and IP address in GUI main menu #else if ( Settings->flag3.gui_hostname_ip || ( (WiFi.getMode() == WIFI_AP_STA) && (!Web.initial_config) ) ) { #endif diff --git a/tasmota/tasmota_xdrv_driver/xdrv_02_9_mqtt.ino b/tasmota/tasmota_xdrv_driver/xdrv_02_9_mqtt.ino index 3d2d998e8..97ec2a6ee 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_02_9_mqtt.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_02_9_mqtt.ino @@ -978,6 +978,10 @@ uint16_t MqttConnectCount(void) { return Mqtt.connect_count; } +bool MqttTLSEnabled(void) { + return Mqtt.mqtt_tls; +} + void MqttDisconnected(int state) { /* // Possible values for state - PubSubClient.h diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino index 638b5bb6d..203c927b4 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino @@ -1803,6 +1803,10 @@ void LightAnimate(void) sleep_previous = TasmotaGlobal.sleep; // save previous value of sleep TasmotaGlobal.sleep = PWM_MAX_SLEEP; // set a maximum value (in milliseconds) to sleep to ensure that animations are smooth } + if (Settings->save_data) { + // Postpone save_data during animation + TasmotaGlobal.save_data_counter = 2; + } } else { if (sleep_previous > 0) { TasmotaGlobal.sleep = sleep_previous; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_06_snfbridge.ino b/tasmota/tasmota_xdrv_driver/xdrv_06_snfbridge.ino index 8bbaeef56..48ed367e9 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_06_snfbridge.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_06_snfbridge.ino @@ -242,7 +242,11 @@ void SonoffBridgeReceived(void) if (Settings->flag.rf_receive_decimal) { // SetOption28 - RF receive data format snprintf_P(stemp, sizeof(stemp), PSTR("%u"), received_id); } else { +#ifdef FIX_JSON_HEXADECIMAL + snprintf_P(stemp, sizeof(stemp), PSTR("\"0x%06X\""), received_id); +#else snprintf_P(stemp, sizeof(stemp), PSTR("\"%06X\""), received_id); +#endif // FIX_JSON_HEXADECIMAL } ResponseTime_P(PSTR(",\"" D_JSON_RFRECEIVED "\":{\"" D_JSON_SYNC "\":%d,\"" D_JSON_LOW "\":%d,\"" D_JSON_HIGH "\":%d,\"" D_JSON_DATA "\":%s,\"" D_CMND_PREFIX_RF D_CMND_RFKEY "\":%s}}"), sync_time, low_time, high_time, stemp, rfkey); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_121_gpioviewer.ino b/tasmota/tasmota_xdrv_driver/xdrv_121_gpioviewer.ino index b1ef15f3c..6a6bba922 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_121_gpioviewer.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_121_gpioviewer.ino @@ -30,6 +30,18 @@ * GvUrl 1 - Select default url (GV_BASE_URL) * GvUrl https://thelastoutpostworkshop.github.io/microcontroller_devkit/gpio_viewer_1_5/ * + * Note 20250126 + * - GVRelease 1.6.1 (No code change) + * + * Note 20250116 + * - GVRelease 1.6.0 (No code change) + * + * Note 20250109 + * - GVRelease 1.5.9 (No code change) + * + * Note 20241221 + * - GVRelease 1.5.8 (No code change) + * * Note 20240821 * - GVRelease 1.5.6 * - Add ADC pin function information @@ -74,7 +86,7 @@ #define GV_KEEP_ALIVE 1000 // milliseconds - If no activity after this do a heap size event anyway -const char *GVRelease = "1.5.6"; +const char *GVRelease = "1.6.1"; /*********************************************************************************************/ diff --git a/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino b/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino index 07da9257c..9fa2be99d 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino @@ -69,6 +69,7 @@ void TasDiscoverMessage(void) { "\"mac\":\"%s\"," // Full MAC as Device id "\"md\":\"%s\"," // Module or Template Name "\"ty\":%d,\"if\":%d," // Flag for TuyaMCU and Ifan devices + "\"cam\":%d," // Flag for ESP32-cam "\"ofln\":\"" MQTT_LWT_OFFLINE "\"," // Payload Offline "\"onln\":\"" MQTT_LWT_ONLINE "\"," // Payload Online "\"state\":[\"%s\",\"%s\",\"%s\",\"%s\"]," // State text for "OFF","ON","TOGGLE","HOLD" @@ -81,6 +82,11 @@ void TasDiscoverMessage(void) { NetworkUniqueId().c_str(), ModuleName().c_str(), TuyaMod, iFanMod, +#ifdef ESP32 + TasmotaGlobal.camera_initialized, +#else + false, +#endif GetStateText(0), GetStateText(1), GetStateText(2), GetStateText(3), TasmotaGlobal.version, TasmotaGlobal.mqtt_topic, diff --git a/tasmota/tasmota_xdrv_driver/xdrv_17_rcswitch.ino b/tasmota/tasmota_xdrv_driver/xdrv_17_rcswitch.ino index 65e30acae..008bfb5b1 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_17_rcswitch.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_17_rcswitch.ino @@ -51,22 +51,22 @@ uint32_t rf_lasttime = 0; void RfReceiveCheck(void) { if (mySwitch.available()) { - unsigned long data = mySwitch.getReceivedValue(); + uint64_t data = mySwitch.getReceivedValue(); unsigned int bits = mySwitch.getReceivedBitlength(); int protocol = mySwitch.getReceivedProtocol(); int delay = mySwitch.getReceivedDelay(); - AddLog(LOG_LEVEL_DEBUG, PSTR("RFR: Data 0x%lX (%u), Bits %d, Protocol %d, Delay %d"), data, data, bits, protocol, delay); + AddLog(LOG_LEVEL_DEBUG, PSTR("RFR: Data 0x%_X (%_U), Bits %d, Protocol %d, Delay %d"), &data, &data, bits, protocol, delay); uint32_t now = millis(); if ((now - rf_lasttime > Settings->rf_duplicate_time) && (data > 0)) { rf_lasttime = now; - char stemp[16]; + char stemp[24]; if (Settings->flag.rf_receive_decimal) { // SetOption28 - RF receive data format (0 = hexadecimal, 1 = decimal) - snprintf_P(stemp, sizeof(stemp), PSTR("%u"), (uint32_t)data); + ext_snprintf_P(stemp, sizeof(stemp), PSTR("%_U"), &data); } else { - snprintf_P(stemp, sizeof(stemp), PSTR("\"0x%lX\""), (uint32_t)data); + ext_snprintf_P(stemp, sizeof(stemp), PSTR("\"0x%_X\""), &data); } ResponseTime_P(PSTR(",\"" D_JSON_RFRECEIVED "\":{\"" D_JSON_RF_DATA "\":%s,\"" D_JSON_RF_BITS "\":%d,\"" D_JSON_RF_PROTOCOL "\":%d,\"" D_JSON_RF_PULSE "\":%d}}"), stemp, bits, protocol, delay); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino index a26d1a6b1..6f21581a6 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino @@ -2383,7 +2383,7 @@ bool Xdrv27(uint32_t function) } break; case FUNC_JSON_APPEND: - if (!ShutterGlobal.sensor_data_reported || TasmotaGlobal.tele_period == 0) { + if (!ShutterGlobal.sensor_data_reported || TasmotaGlobal.tele_period != 2) { ShutterGlobal.sensor_data_reported = true; for (uint8_t i = 0; i < TasmotaGlobal.shutters_present; i++) { ResponseAppend_P(","); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino index 282924839..69153ab54 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino @@ -1974,7 +1974,7 @@ bool Xdrv27(uint32_t function) } break; case FUNC_JSON_APPEND: - if (!sensor_data_reported || TasmotaGlobal.tele_period == 0) { + if (!sensor_data_reported || TasmotaGlobal.tele_period != 2) { sensor_data_reported = true; for (uint8_t i = 0; i < TasmotaGlobal.shutters_present; i++) { uint8_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_0_config_idf51.ino b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_0_config_idf51.ino index ec39ba43a..7624d0191 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_0_config_idf51.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_0_config_idf51.ino @@ -52,6 +52,19 @@ enum : int8_t { I2S_SLOT_PHILIPS = 2, // Philips }; +// I2S decoder type +enum : uint32_t { + AAC_DECODER = 0, + MP3_DECODER = 1, + OPUS_DECODER = 2, +}; + +// I2S encoder type +enum : uint8_t { + MP3_ENCODER = 1, + OPUS_ENCODER = 2, +}; + #define I2S_SLOTS 2 #define AUDIO_SETTINGS_VERSION 2 diff --git a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_3_lib_idf51.ino b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_3_lib_idf51.ino index f77bbdfb8..098a4c4f9 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_3_lib_idf51.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_3_lib_idf51.ino @@ -877,5 +877,36 @@ int16_t TasmotaI2S::lowpassFilter(int16_t pcm_in) { return pcm_out; } +#include "AudioFileSource.h" +class AudioFileSourceLoopBuffer : public AudioFileSource +{ + public: + AudioFileSourceLoopBuffer(void *inBuff, uint32_t buffSizeBytes, uint32_t restartOffset = 0){ + readPtr = 0; + buffer = reinterpret_cast(inBuff); + buffSize = buffSizeBytes; + restart = restartOffset; + } + virtual ~AudioFileSourceLoopBuffer() override {}; + + virtual uint32_t read(void *data, uint32_t len) override { + uint32_t _availableBytes = len > (buffSize - readPtr) ? buffSize - readPtr : len; + memcpy(reinterpret_cast(data), buffer + readPtr, _availableBytes); + readPtr += len; + if(readPtr >= buffSize) {readPtr = restart;} + return _availableBytes; + } + virtual bool seek(int32_t pos, int dir) override {return false;} + virtual bool close() override {return true;} + virtual bool isOpen() override {return true;} + virtual uint32_t getSize() override {return buffSize;} + virtual uint32_t getPos() override {return readPtr;} + private: + uint32_t buffSize; + uint8_t *buffer; + uint32_t readPtr; + uint32_t restart; +}; + #endif // USE_I2S_AUDIO #endif // defined(ESP32) && ESP_IDF_VERSION_MAJOR >= 5 diff --git a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio_idf51.ino b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio_idf51.ino index cd8dccd85..65ffad8b6 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio_idf51.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio_idf51.ino @@ -30,7 +30,12 @@ #include "AudioGeneratorTalkie.h" #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" +#ifdef USE_I2S_AAC #include "AudioGeneratorAAC.h" +#endif // USE_I2S_AAC +#ifdef USE_I2S_OPUS +#include "AudioGeneratorOpus.h" +#endif // USE_I2S_OPUS #include @@ -54,9 +59,9 @@ extern FS *ufsp; extern FS *ffsp; -const int preallocateBufferSize = 16*1024; -const int preallocateCodecSize = 29192; // MP3 codec max mem needed -//const int preallocateCodecSize = 85332; // AAC+SBR codec max mem needed +constexpr int preallocateBufferSize = 16*1024; +constexpr int preallocateCodecSize = 29192; // MP3 codec max mem needed +constexpr int preallocateCodecSizeAAC = 85332; // AAC+SBR codec max mem needed void sayTime(int hour, int minutes); void Cmndwav2mp3(void); @@ -73,32 +78,35 @@ void CmndI2SMP3Stream(void); struct AUDIO_I2S_MP3_t { #ifdef USE_I2S_MP3 - AudioGeneratorMP3 *mp3 = nullptr; - AudioFileSourceFS *file = nullptr; - AudioFileSourceID3 *id3 = nullptr; + AudioGenerator *decoder = nullptr; + AudioFileSource *file = nullptr; + AudioFileSource *id3 = nullptr; + AudioFileSource *buff = NULL; - void *mp3ram = NULL; + void *preallocateBuffer = NULL; + void *preallocateCodec = NULL; #endif // USE_I2S_MP3 #if defined(USE_I2S_MP3) || defined(USE_I2S_WEBRADIO) || defined(USE_SHINE) || defined(MP3_MIC_STREAM) - AudioGeneratorMP3 *decoder = NULL; TaskHandle_t mp3_task_handle; TaskHandle_t mic_task_handle; #endif // defined(USE_I2S_MP3) || defined(USE_I2S_WEBRADIO) char mic_path[32]; - uint8_t mic_stop; int8_t mic_error; + bool mic_stop = false; bool use_stream = false; bool task_running = false; bool task_has_ended = false; + bool task_loop_mode = false; -// SHINE +// RECORD/STREAM/ENCODING uint32_t recdur; - uint8_t stream_active; - uint8_t stream_enable; + uint8_t encoder_type; + bool stream_active; + bool stream_enable; WiFiClient client; - ESP8266WebServer *MP3Server; + ESP8266WebServer *StreamServer; // I2S_BRIDGE BRIDGE_MODE bridge_mode; @@ -120,7 +128,7 @@ struct AUDIO_I2S_MP3_t { const char kI2SAudio_Commands[] PROGMEM = "I2S|" "Gain|Rec|Stop|Config" #ifdef USE_I2S_MP3 - "|Play" + "|Play|Loop" #endif #ifdef USE_I2S_DEBUG "|Mic" // debug only @@ -149,6 +157,7 @@ void (* const I2SAudio_Command[])(void) PROGMEM = { &CmndI2SGain, &CmndI2SMicRec, &CmndI2SStop, &CmndI2SConfig, #ifdef USE_I2S_MP3 &CmndI2SPlay, + &CmndI2SLoop, #endif #ifdef USE_I2S_DEBUG &CmndI2SMic, @@ -336,182 +345,6 @@ void CmndI2SConfig(void) { cfg->rx.dma_desc_num ); } -/*********************************************************************************************\ - * microphone related functions -\*********************************************************************************************/ - -// micro to mp3 file or stream -void I2sMicTask(void *arg){ - int8_t error = 0; - uint8_t *ucp; - int written; - shine_config_t config; - shine_t s = nullptr; - uint16_t samples_per_pass; - File mp3_out = (File)nullptr; - int16_t *buffer = nullptr; - uint16_t bytesize; - uint16_t bwritten; - uint32_t ctime; - uint32_t gain = audio_i2s.Settings->rx.gain; - uint32_t timeForOneRead; - - if (!audio_i2s_mp3.use_stream) { - mp3_out = ufsp->open(audio_i2s_mp3.mic_path, "w"); - if (!mp3_out) { - error = 1; - goto exit; - } - } else { - if (!audio_i2s_mp3.stream_active) { - error = 2; - audio_i2s_mp3.use_stream = 0; - goto exit; - } - audio_i2s_mp3.client.flush(); - audio_i2s_mp3.client.setTimeout(3); - audio_i2s_mp3.client.print("HTTP/1.1 200 OK\r\n" - "Content-Type: audio/mpeg;\r\n\r\n"); - - // Webserver->send(200, "application/octet-stream", ""); - //"Content-Type: audio/mp3;\r\n\r\n"); - } - - shine_set_config_mpeg_defaults(&config.mpeg); - - if (audio_i2s.Settings->rx.channels == 1) { - config.mpeg.mode = MONO; - } else { - config.mpeg.mode = STEREO; - } - // config.mpeg.bitr = 128; - this is default anyway, but maybe we want to make it a variable in the future - config.wave.samplerate = audio_i2s.Settings->rx.sample_rate; - config.wave.channels = (channels)(audio_i2s.Settings->rx.channels); - - if (shine_check_config(config.wave.samplerate, config.mpeg.bitr) < 0) { - error = 3; - goto exit; - } - - s = shine_initialise(&config); - if (!s) { - error = 4; - goto exit; - } - - samples_per_pass = shine_samples_per_pass(s); - bytesize = samples_per_pass * 2 * (audio_i2s.Settings->rx.channels); - - buffer = (int16_t*)malloc(bytesize); - if (!buffer) { - error = 5; - goto exit; - } - - ctime = TasmotaGlobal.uptime; - timeForOneRead = 1000 / ((audio_i2s.Settings->rx.sample_rate / (samples_per_pass * audio_i2s.Settings->rx.channels ))); - timeForOneRead -= 1; // be very in time - - AddLog(LOG_LEVEL_DEBUG, PSTR("I2S: samples %u, bytesize %u, time: %u"),samples_per_pass, bytesize, timeForOneRead); - - while (!audio_i2s_mp3.mic_stop) { - TickType_t xLastWakeTime = xTaskGetTickCount(); - size_t bytes_read; - - // bytes_read = audio_i2s.in->readMic((uint8_t*)buffer, bytesize, true /*dc_block*/, false /*apply_gain*/, true /*lowpass*/, nullptr /*peak_ptr*/); - i2s_channel_read(audio_i2s.in->getRxHandle(), (void*)buffer, bytesize, &bytes_read, pdMS_TO_TICKS(3)); - - if(bytes_read < bytesize) AddLog(LOG_LEVEL_DEBUG, PSTR("!! %u, %u"), bytes_read, bytesize); - - if (gain > 1) { - // set gain the "old way" - int16_t _gain = gain / 16; - for (uint32_t cnt = 0; cnt < bytes_read / 2; cnt++) { - buffer[cnt] *= _gain; - } - } - ucp = shine_encode_buffer_interleaved(s, buffer, &written); - - if (!audio_i2s_mp3.use_stream) { - bwritten = mp3_out.write(ucp, written); - if (bwritten != written) { - break; - } - } else { - audio_i2s_mp3.client.write((const char*)ucp, written); - - if (!audio_i2s_mp3.client.connected()) { - break; - } - } - audio_i2s_mp3.recdur = TasmotaGlobal.uptime - ctime; - - vTaskDelayUntil( &xLastWakeTime, pdMS_TO_TICKS(timeForOneRead)); - } - - ucp = shine_flush(s, &written); - - if (!audio_i2s_mp3.use_stream) { - mp3_out.write(ucp, written); - } else { - audio_i2s_mp3.client.write((const char*)ucp, written); - } - - -exit: - if (s) { - shine_close(s); - } - if (mp3_out) { - mp3_out.close(); - AddLog(LOG_LEVEL_INFO, PSTR("I2S: MP3 file closed")); - } - if (buffer) { - free(buffer); - } - - if (audio_i2s_mp3.use_stream) { - audio_i2s_mp3.client.stop(); - } - - audio_i2s.in->stopRx(); - audio_i2s_mp3.mic_stop = 0; - audio_i2s_mp3.mic_error = error; - AddLog(LOG_LEVEL_INFO, PSTR("I2S: mp3task result code: %d"), error); - audio_i2s_mp3.mic_task_handle = 0; - audio_i2s_mp3.recdur = 0; - audio_i2s_mp3.stream_active = 0; - vTaskDelete(NULL); - -} - -int32_t I2sRecordShine(char *path) { - esp_err_t err = ESP_OK; - - switch(audio_i2s.Settings->rx.sample_rate){ - case 32000: case 48000: case 44100: - break; // supported - default: - AddLog(LOG_LEVEL_INFO, PSTR("I2S: unsupported sample rate for MP3 encoding: %d"), audio_i2s.Settings->rx.sample_rate); - return -1; - } - AddLog(LOG_LEVEL_INFO, PSTR("I2S: accepted sample rate for MP3 encoding: %d"), audio_i2s.Settings->rx.sample_rate); - -#ifdef USE_I2S_MP3 - if (audio_i2s_mp3.decoder || audio_i2s_mp3.mp3) return 0; -#endif - - strlcpy(audio_i2s_mp3.mic_path, path, sizeof(audio_i2s_mp3.mic_path)); - audio_i2s_mp3.mic_stop = 0; - uint32_t stack = 8000; - audio_i2s_mp3.use_stream = !strcmp(audio_i2s_mp3.mic_path, "stream.mp3"); - - audio_i2s.in->startRx(); - - err = xTaskCreatePinnedToCore(I2sMicTask, "MIC", stack, NULL, 3, &audio_i2s_mp3.mic_task_handle, 1); - - return err; -} /*********************************************************************************************\ * Driver Settings load and save using filesystem @@ -522,6 +355,7 @@ enum { I2S_ERR_OUTPUT_NOT_CONFIGURED, I2S_ERR_INPUT_NOT_CONFIGURED, I2S_ERR_DECODER_IN_USE, + I2S_ERR_DECODER_FAILED_TO_INIT, I2S_ERR_FILE_NOT_FOUND, I2S_ERR_TX_FAILED, }; @@ -769,11 +603,11 @@ void I2sInit(void) { // audio_i2s.out->stopTx(); // } #ifdef USE_I2S_MP3 - audio_i2s_mp3.mp3ram = nullptr; + audio_i2s_mp3.preallocateCodec = nullptr; if (audio_i2s.Settings->sys.mp3_preallocate == 1){ // if (UsePSRAM()) { AddLog(LOG_LEVEL_DEBUG,PSTR("I2S: will allocate buffer for mp3 encoder")); - audio_i2s_mp3.mp3ram = special_malloc(preallocateCodecSize); + audio_i2s_mp3.preallocateCodec = special_malloc(preallocateCodecSize); } #endif // USE_I2S_MP3 AddLog(LOG_LEVEL_DEBUG, "I2S: I2sInit done"); @@ -791,7 +625,7 @@ void I2sInit(void) { // Returns `I2S_OK` if ok to send to output or error code int32_t I2SPrepareTx(void) { I2sStopPlaying(); - + AddLog(LOG_LEVEL_DEBUG, "I2S: I2SPrepareTx out=%p", audio_i2s.out); if (!audio_i2s.out) { return I2S_ERR_OUTPUT_NOT_CONFIGURED; } @@ -824,14 +658,15 @@ int32_t I2SPrepareRx(void) { #if defined(USE_I2S_MP3) || defined(USE_I2S_WEBRADIO) void I2sMp3Task(void *arg) { audio_i2s_mp3.task_running = true; - while (audio_i2s_mp3.mp3->isRunning() && audio_i2s_mp3.task_running) { - if (!audio_i2s_mp3.mp3->loop()) { - audio_i2s_mp3.task_running = false; + while (audio_i2s_mp3.decoder->isRunning() && audio_i2s_mp3.task_running) { + if (!audio_i2s_mp3.decoder->loop()) { + audio_i2s_mp3.task_running = false; } vTaskDelay(pdMS_TO_TICKS(1)); } audio_i2s.out->flush(); - audio_i2s_mp3.mp3->stop(); + audio_i2s_mp3.decoder->stop(); + audio_i2s_mp3.task_loop_mode = false; mp3_delete(); audio_i2s_mp3.mp3_task_handle = nullptr; audio_i2s_mp3.task_has_ended = true; @@ -875,7 +710,7 @@ void I2sStopPlaying() { while(audio_i2s_mp3.task_has_ended == false){ delay(10); } - while(audio_i2s_mp3.mp3){ + while(audio_i2s_mp3.decoder){ delay(10); } } @@ -888,13 +723,47 @@ void I2sStopPlaying() { } #ifdef USE_I2S_MP3 -// Play_mp3 - Play a MP3 file from filesystem + +bool I2SinitDecoder(uint32_t decoder_type){ + switch(decoder_type){ + case MP3_DECODER: + if (audio_i2s_mp3.preallocateCodec) { + audio_i2s_mp3.decoder = dynamic_cast(new AudioGeneratorMP3(audio_i2s_mp3.preallocateCodec, preallocateCodecSize)); + } else { + audio_i2s_mp3.decoder = dynamic_cast(new AudioGeneratorMP3()); + } + break; +#ifdef USE_I2S_AAC + case AAC_DECODER: + audio_i2s_mp3.preallocateCodec = special_realloc(audio_i2s_mp3.preallocateCodec, preallocateCodecSizeAAC); + if(audio_i2s_mp3.preallocateCodec == nullptr){ + AddLog(LOG_LEVEL_ERROR, "I2S: could not alloc heap for AAC"); + return false; + } + audio_i2s_mp3.decoder = dynamic_cast(new AudioGeneratorAAC(audio_i2s_mp3.preallocateCodec, preallocateCodecSizeAAC)); + break; +#endif //USE_I2S_AAC +#ifdef USE_I2S_OPUS + case OPUS_DECODER: + free(audio_i2s_mp3.preallocateCodec); + audio_i2s_mp3.preallocateCodec = nullptr; + audio_i2s_mp3.decoder = dynamic_cast(new AudioGeneratorOpus()); + break; +#endif //USE_I2S_OPUS + } + if(audio_i2s_mp3.decoder == nullptr){ + return false; + } + return true; +} + +// Play a audio file from filesystem // // Returns I2S_error_t -int32_t I2SPlayMp3(const char *path) { +int32_t I2SPlayFile(const char *path, uint32_t decoder_type) { int32_t i2s_err = I2SPrepareTx(); if ((i2s_err) != I2S_OK) { return i2s_err; } - if (audio_i2s_mp3.mp3) return I2S_ERR_DECODER_IN_USE; + if (audio_i2s_mp3.decoder != nullptr) return I2S_ERR_DECODER_IN_USE; // check if the filename starts with '/', if not add it char fname[64]; @@ -907,34 +776,42 @@ int32_t I2SPlayMp3(const char *path) { I2SAudioPower(true); - audio_i2s_mp3.file = new AudioFileSourceFS(*ufsp, fname); + if (audio_i2s_mp3.task_loop_mode == true){ + File _loopFile = ufsp->open(fname); + size_t _fsize = _loopFile.size(); + audio_i2s_mp3.preallocateBuffer = special_realloc(audio_i2s_mp3.preallocateBuffer,_fsize); + size_t _received = _loopFile.read(reinterpret_cast(audio_i2s_mp3.preallocateBuffer),_fsize); + _loopFile.close(); + audio_i2s_mp3.file = new AudioFileSourceLoopBuffer (audio_i2s_mp3.preallocateBuffer, _fsize); // use the id3 var to make the code shorter down the line + } else { + audio_i2s_mp3.file = new AudioFileSourceFS(*ufsp, fname); + } audio_i2s_mp3.id3 = new AudioFileSourceID3(audio_i2s_mp3.file); - if (audio_i2s_mp3.mp3ram) { - audio_i2s_mp3.mp3 = new AudioGeneratorMP3(audio_i2s_mp3.mp3ram, preallocateCodecSize); + if(I2SinitDecoder(decoder_type)){ + audio_i2s_mp3.decoder->begin(audio_i2s_mp3.id3, audio_i2s.out); } else { - audio_i2s_mp3.mp3 = new AudioGeneratorMP3(); + return I2S_ERR_DECODER_FAILED_TO_INIT; + } + + size_t play_tasksize = 8000; // suitable for ACC and MP3 + if(decoder_type == 2){ // opus needs a ton of stack + play_tasksize = 26000; } - audio_i2s_mp3.mp3->begin(audio_i2s_mp3.id3, audio_i2s.out); // Always use a task - xTaskCreatePinnedToCore(I2sMp3Task, "MP3", 8192, NULL, 3, &audio_i2s_mp3.mp3_task_handle, 1); + xTaskCreatePinnedToCore(I2sMp3Task, "PLAYFILE", play_tasksize, NULL, 3, &audio_i2s_mp3.mp3_task_handle, 1); return I2S_OK; } void mp3_delete(void) { + delete audio_i2s_mp3.buff; delete audio_i2s_mp3.file; delete audio_i2s_mp3.id3; - delete audio_i2s_mp3.mp3; - audio_i2s_mp3.mp3 = nullptr; + delete audio_i2s_mp3.decoder; + audio_i2s_mp3.decoder = nullptr; - // if (audio_i2s_mp3.decoder) { - // audio_i2s_mp3.decoder->stop(); - // delete audio_i2s_mp3.decoder; - // audio_i2s_mp3.decoder = nullptr; - // AddLog(LOG_LEVEL_DEBUG, "I2S: audio_i2s_mp3.decoder = nullptr"); - // } } #endif // USE_I2S_MP3 @@ -981,9 +858,14 @@ void CmndI2SStop(void) { } #ifdef USE_I2S_MP3 +void CmndI2SLoop(void) { + audio_i2s_mp3.task_loop_mode = 1; + CmndI2SPlay(); +} + void CmndI2SPlay(void) { if (XdrvMailbox.data_len > 0) { - int32_t err = I2SPlayMp3(XdrvMailbox.data); + int32_t err = I2SPlayFile(XdrvMailbox.data, XdrvMailbox.index); // display return message switch (err) { case I2S_OK: @@ -995,6 +877,9 @@ void CmndI2SPlay(void) { case I2S_ERR_DECODER_IN_USE: ResponseCmndChar("Decoder already in use"); break; + case I2S_ERR_DECODER_FAILED_TO_INIT: + ResponseCmndChar("Decoder failed to init"); + break; case I2S_ERR_FILE_NOT_FOUND: ResponseCmndChar("File not found"); break; @@ -1054,42 +939,31 @@ void CmndI2SMicRec(void) { ResponseCmndChar("I2S Mic not configured"); return; } - if (audio_i2s_mp3.mp3ram == nullptr){ - AddLog(LOG_LEVEL_DEBUG,PSTR("I2S: try late buffer allocation for mp3 encoder")); - audio_i2s_mp3.mp3ram = special_malloc(preallocateCodecSize); - } - if (audio_i2s_mp3.mp3ram != nullptr) { - if (XdrvMailbox.data_len > 0) { - if (!strncmp(XdrvMailbox.data, "-?", 2)) { - Response_P("{\"I2SREC-duration\":%d}", audio_i2s_mp3.recdur); - } else { - int err = I2sRecordShine(XdrvMailbox.data); - if(err == pdPASS){ - ResponseCmndChar(XdrvMailbox.data); - } else { - ResponseCmndChar_P(PSTR("Did not launch recording task")); - } - } + + if (XdrvMailbox.data_len > 0) { + if (!strncmp(XdrvMailbox.data, "-?", 2)) { + Response_P("{\"I2SREC-duration\":%d}", audio_i2s_mp3.recdur); } else { - if (audio_i2s_mp3.mic_task_handle) { - // stop task - audio_i2s_mp3.mic_stop = 1; - while (audio_i2s_mp3.mic_stop) { - delay(1); - } - ResponseCmndChar_P(PSTR("Stopped")); - } - else { - ResponseCmndChar_P(PSTR("No running recording")); + audio_i2s_mp3.use_stream = false; + int err = I2sRecord(XdrvMailbox.data, XdrvMailbox.index); + // int err = I2sRecordShine(XdrvMailbox.data); + if(err == pdPASS){ + ResponseCmndChar(XdrvMailbox.data); + } else { + ResponseCmndChar_P(PSTR("Did not launch recording task")); } } - } - else{ - if (audio_i2s.in){ - ResponseCmndChar_P(PSTR("need PSRAM for MP3 recording")); + } else { + if (audio_i2s_mp3.mic_task_handle) { + // stop task + audio_i2s_mp3.mic_stop = 1; + while (audio_i2s_mp3.mic_stop) { + delay(1); + } + ResponseCmndChar_P(PSTR("Stopped")); } - else{ - ResponseCmndChar_P(PSTR("no mic configured")); + else { + ResponseCmndChar_P(PSTR("No running recording")); } } } @@ -1098,7 +972,7 @@ void CmndI2SMicRec(void) { * Interface \*********************************************************************************************/ -void I2sMp3Loop(void); +void I2sStreamLoop(void); void I2sMp3Init(uint32_t on); void MP3ShowStream(void); @@ -1117,17 +991,12 @@ bool Xdrv42(uint32_t function) { break; case FUNC_LOOP: #if defined(USE_SHINE) && defined(MP3_MIC_STREAM) - I2sMp3Loop(); + I2sStreamLoop(); #endif #if defined(I2S_BRIDGE) i2s_bridge_loop(); #endif break; - case FUNC_WEB_ADD_HANDLER: -#if defined(USE_SHINE) && defined(MP3_MIC_STREAM) - // audio_i2s.Settings->tx.stream_enable = 1; - // I2sMp3Init(1); -#endif #if defined(I2S_BRIDGE) I2SBridgeInit(); #endif diff --git a/tasmota/tasmota_xdrv_driver/xdrv_42_1_i2s_mp3mic_idf51.ino b/tasmota/tasmota_xdrv_driver/xdrv_42_1_i2s_mp3mic_idf51.ino index 3a9e82f63..503360d1d 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_42_1_i2s_mp3mic_idf51.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_42_1_i2s_mp3mic_idf51.ino @@ -1,5 +1,5 @@ /* - xdrv_42_i2s_audio.ino - Audio dac support for Tasmota + xdrv_42_i2s_mp3mic.ino - Audio dac support for Tasmota Copyright (C) 2021 Gerhard Mutz and Theo Arends @@ -21,219 +21,397 @@ #if defined(ESP32) && ESP_IDF_VERSION_MAJOR >= 5 #ifdef USE_I2S_AUDIO -// uint32_t SpeakerMic(uint8_t spkr) { -// esp_err_t err = ESP_OK; +class AudioEncoder +{ + public: + AudioEncoder() { + inBuffer = nullptr; + outFrame = nullptr; + samplesPerPass = 0; + byteSize = 0; + }; + virtual ~AudioEncoder() {}; + virtual uint32_t begin(uint32_t samplingRate, uint32_t inputChannels) { return 0; }; + virtual int encode(size_t samples) { return 0; }; + virtual size_t stop() { return 0; }; + virtual void setCB(void *cb){}; -// // audio_i2s.mode = spkr; -// return err; -// } + public: + int16_t *inBuffer; + uint8_t *outFrame; + uint32_t samplesPerPass; + uint32_t byteSize; + File *file; + WiFiClient *client; +}; -// #ifdef USE_SHINE +#ifdef MP3_MIC_STREAM +class AudioEncoderShineMP3 : public AudioEncoder +{ + public: + AudioEncoderShineMP3(File *rec_file, WiFiClient *wifi) { + file = rec_file; + client = wifi; + }; + virtual ~AudioEncoderShineMP3() { + if (s) {shine_close(s);} + if(inBuffer){free(inBuffer); } + if(file) {file->close();} + if(client) {client->stop();} + }; + virtual uint32_t begin(uint32_t samplingRate, uint32_t inputChannels) { + shine_set_config_mpeg_defaults(&config.mpeg); + if (inputChannels == 1) { + config.mpeg.mode = MONO; + } else { + config.mpeg.mode = STEREO; + } + config.wave.samplerate = samplingRate; + config.wave.channels = (channels)inputChannels; + if (shine_check_config(config.wave.samplerate, config.mpeg.bitr) < 0) {return 3;} + s = shine_initialise(&config); + if (!s) {return 4; } -// #include -// #include + samplesPerPass = shine_samples_per_pass(s); + byteSize = samplesPerPass * 2 * inputChannels; -// // micro to mp3 file or stream -// void mic_task(void *arg){ -// int8_t error = 0; -// uint8_t *ucp; -// int written; -// shine_config_t config; -// shine_t s = nullptr; -// uint16_t samples_per_pass; -// File mp3_out = (File)nullptr; -// int16_t *buffer = nullptr; -// uint16_t bytesize; -// uint16_t bwritten; -// uint32_t ctime; + inBuffer = (int16_t*)malloc(byteSize); // byteSize = samplesPerPass * sizeof(int16_t) + if (!inBuffer) {return 5; } + return 0; + }; -// if (!audio_i2s_mp3.use_stream) { -// mp3_out = ufsp->open(audio_i2s_mp3.mic_path, "w"); -// if (!mp3_out) { -// error = 1; -// goto exit; -// } -// } else { -// if (!audio_i2s_mp3.stream_active) { -// error = 2; -// audio_i2s_mp3.use_stream = 0; -// goto exit; -// } -// audio_i2s_mp3.client.flush(); -// audio_i2s_mp3.client.setTimeout(3); -// audio_i2s_mp3.client.print("HTTP/1.1 200 OK\r\n" -// "Content-Type: audio/mpeg;\r\n\r\n"); + virtual size_t stop() { + int written; + outFrame = shine_flush(s, &written); + return written; + } -// // Webserver->send(200, "application/octet-stream", ""); -// //"Content-Type: audio/mp3;\r\n\r\n"); -// } + virtual int encode(size_t samples) { + int written; + outFrame = shine_encode_buffer_interleaved(s, inBuffer, &written); + return write(written); + }; -// shine_set_config_mpeg_defaults(&config.mpeg); + protected: + int write(int len){ + size_t written = 0; + if(file != nullptr){ + written = file->write(outFrame,len); + } else if (client != nullptr){ + if (client->connected()) { + written = client->write(outFrame, len); + } + } + return (written != (size_t)len); + } + shine_config_t config; + shine_t s; +}; +#endif //MP3_MIC_STREAM -// if (audio_i2s.Settings->rx.channels == 1) { -// config.mpeg.mode = MONO; -// } else { -// config.mpeg.mode = STEREO; -// } -// config.mpeg.bitr = 128; -// config.wave.samplerate = audio_i2s.Settings->rx.sample_rate; -// config.wave.channels = (channels)audio_i2s.Settings->rx.channels; +#ifdef USE_I2S_OPUS -// if (shine_check_config(config.wave.samplerate, config.mpeg.bitr) < 0) { -// error = 3; -// goto exit; -// } +#include "libwebm/mkvmuxer/mkvwriter.h" +class AudioEncoderOpusWebm; +typedef int (AudioEncoderOpusWebm::*packet_cb)(void *userdata, const void *buffer, size_t length); +class AudioEncoderOpusWebm : public AudioEncoder +{ + public: + AudioEncoderOpusWebm(File *rec_file, WiFiClient *wifi) { + file = rec_file; + client = wifi; + }; -// s = shine_initialise(&config); -// if (!s) { -// error = 4; -// goto exit; -// } + virtual ~AudioEncoderOpusWebm() { + if(inBuffer){ free(inBuffer); } + if(outFrame){ free(outFrame); } + opus_encoder_destroy(encoder); + if(file) {file->close();} + if(client) {client->stop();} + if(wifiBuffer){ free(wifiBuffer); } + delete muxer; + }; -// samples_per_pass = shine_samples_per_pass(s); -// bytesize = samples_per_pass * 2 * audio_i2s.Settings->rx.channels; + virtual uint32_t begin(uint32_t samplingRate, uint32_t inputChannels) { + int error; + encoder = opus_encoder_create(samplingRate, inputChannels, samplingRate > 16000 ? OPUS_APPLICATION_AUDIO : OPUS_APPLICATION_VOIP, &error); + if (error != 0) { return error; } + opus_encoder_ctl(encoder, OPUS_SET_COMPLEXITY(complexity)); + int _preskip; + opus_encoder_ctl(encoder, OPUS_GET_LOOKAHEAD((opus_int32*)&_preskip)); + opusHeader.samplingRate = samplingRate; + opusHeader.inputChannels = inputChannels; + opusHeader.preSkip = _preskip; -// buffer = (int16_t*)malloc(bytesize); -// if (!buffer) { -// error = 5; -// goto exit; -// } + constexpr uint32_t frameDuration = 20; //ms + samplesPerPass = samplingRate/(1000/frameDuration); + byteSize = samplesPerPass * 2 * inputChannels; + inBuffer = (int16_t*)malloc(byteSize); + if (!inBuffer) {return 5; } + outFrame = (uint8_t*)malloc(maxBytes); + if (!outFrame) {return 5; } + if(client){ + wifiBuffer = (uint8_t*)malloc(wifiBufferSize); + if (!wifiBuffer) {return 5; } + } -// ctime = TasmotaGlobal.uptime; + if(file){ + muxer = new mkvmuxer::MkvWriter(file); + } else if (client){ + muxer = new mkvmuxer::MkvWriter(this, &AudioEncoderOpusWebm::packet_cb); + } + timeCode = 0; + if (!muxer) {return 6; } + if (!muxerSegment.Init(muxer)) {return 7; } + mkvmuxer::SegmentInfo* info = muxerSegment.GetSegmentInfo(); + if (info == nullptr) {return 8;} + info->set_writing_app("Tasmota"); + // Add an audio track. + trackNumber = muxerSegment.AddAudioTrack(samplingRate, inputChannels, 0); + if (trackNumber == 0) {return 9; } + mkvmuxer::AudioTrack* audio = static_cast(muxerSegment.GetTrackByNumber(trackNumber)); + if (audio == nullptr) {return 10;} + audio->set_codec_id(mkvmuxer::Tracks::kOpusCodecId); + audio->set_bit_depth(16); + audio->set_codec_delay(_preskip * 1000000 / samplingRate); // Delay built into the code during decoding in nanoseconds. + audio->set_seek_pre_roll(80000000); // Amount of audio to discard after a seek - https://wiki.xiph.org/MatroskaOpus + if (!audio->SetCodecPrivate( (const uint8_t*)&opusHeader, sizeof(opusHeader))) {return 11;} + return 0; + } -// while (!audio_i2s_mp3.mic_stop) { -// uint32_t bytes_read; -// bytes_read = audio_i2s.in->readMic((uint8_t*)buffer, bytesize, true /*dc_block*/, false /*apply_gain*/, true /*lowpass*/, nullptr /*peak_ptr*/); -// // i2s_read(audio_i2s.mic_port, (char *)buffer, bytesize, &bytes_read, (100 / portTICK_PERIOD_MS)); + virtual int encode(size_t samples) { + opus_int32 len = opus_encode(encoder, inBuffer, samplesPerPass, outFrame, maxBytes); + if (len < 0) { return -1; } + if (len > 2) // ignore packets shorter than or equal to 2 bytes. + { + if(!muxerSegment.AddFrame(outFrame, len, trackNumber, timeCode, true)){ + return -1; + } + } + timeCode += 20000 * 1000; // 20 ms in nanoseconds + return 0; + } -// if (audio_i2s.Settings->rx.gain > 1) { -// // set gain -// for (uint32_t cnt = 0; cnt < bytes_read / 2; cnt++) { -// buffer[cnt] *= audio_i2s.Settings->rx.gain; -// } -// } -// ucp = shine_encode_buffer_interleaved(s, buffer, &written); + virtual size_t stop() { + bool success = muxerSegment.Finalize(); + muxer->Close(); + return success; + } -// if (!audio_i2s.Settings->tx.stream_enable) { -// bwritten = mp3_out.write(ucp, written); -// if (bwritten != written) { -// break; -// } -// } else { -// audio_i2s_mp3.client.write((const char*)ucp, written); + protected: + OpusEncoder *encoder; + const uint32_t maxBytes = 1296; + const uint32_t complexity = 1; // 1-10 - low to high quality + mkvmuxer::MkvWriter *muxer; + mkvmuxer::Segment muxerSegment; -// if (!audio_i2s_mp3.client.connected()) { -// break; -// } -// } -// audio_i2s_mp3.recdur = TasmotaGlobal.uptime - ctime; -// } + uint64_t trackNumber = 0; + uint64_t timeCode = 0; -// ucp = shine_flush(s, &written); + struct __attribute__((packed)) { + char signatureHead[8] = {'O', 'p', 'u', 's', 'H', 'e', 'a', 'd'}; + uint8_t version = 1; + uint8_t inputChannels = 1; + uint16_t preSkip = 3840; + uint32_t samplingRate = 0; + int16_t outputGain = 0; + uint8_t channelMappingFamily = 0; + } opusHeader; -// if (!audio_i2s_mp3.use_stream) { -// mp3_out.write(ucp, written); -// } else { -// audio_i2s_mp3.client.write((const char*)ucp, written); -// } + static constexpr size_t wifiBufferSize = CONFIG_LWIP_TCP_MSS; // should be <= TCP Maximum Segment Size + uint8_t *wifiBuffer; + size_t wifiPtr = 0; + static int packet_cb(void *userdata, const void *buffer, size_t length){ + AudioEncoderOpusWebm *_enc = (AudioEncoderOpusWebm *)userdata; + int result = length; + if(_enc->wifiPtr + length > wifiBufferSize){ + size_t written; + if (_enc->client->connected()) { + written = _enc->client->write(_enc->wifiBuffer, _enc->wifiPtr); + } + result = written == _enc->wifiPtr ? length : -1; //TODO - maybe tolerate some send errors + // AddLog(LOG_LEVEL_DEBUG, PSTR(">> %u, %u, %u"),written, _enc->wifiPtr, result); + _enc->wifiPtr = 0; + } + memcpy(_enc->wifiBuffer + _enc->wifiPtr,(uint8_t*)buffer,length); + _enc->wifiPtr += length; + return result; + } +}; +#endif // USE_I2S_OPUS -// exit: -// if (s) { -// shine_close(s); -// } -// if (mp3_out) { -// mp3_out.close(); -// } -// if (buffer) { -// free(buffer); -// } +// micro to mp3/webm - file or stream +void I2sMicTask(void *arg){ + int8_t error = 0; + int written; -// if (audio_i2s_mp3.use_stream) { -// audio_i2s_mp3.client.stop(); -// } + AudioEncoder *mic_enc; + File rec_file; + File *rec_file_ptr = nullptr; -// SpeakerMic(I2S_AUDIO_MODE_SPK); -// audio_i2s_mp3.mic_stop = 0; -// audio_i2s_mp3.mic_error = error; -// AddLog(LOG_LEVEL_INFO, PSTR("mp3task result code: %d"), error); -// audio_i2s_mp3.mic_task_handle = 0; -// audio_i2s_mp3.recdur = 0; -// audio_i2s_mp3.stream_active = 0; -// vTaskDelete(NULL); + uint16_t bwritten; + uint32_t ctime; + uint32_t gain = audio_i2s.Settings->rx.gain; + uint32_t timeForOneRead; + uint32_t __enctime; + TickType_t xLastWakeTime; -// } + if (!audio_i2s_mp3.use_stream) { + rec_file = ufsp->open(audio_i2s_mp3.mic_path, "w"); + if (!rec_file) { + error = 1; + goto exit; + } else { + rec_file_ptr = &rec_file; + } + } else { + if (!audio_i2s_mp3.stream_active) { + error = 2; + goto exit; + } + } -// int32_t i2s_record_shine(char *path) { -// esp_err_t err = ESP_OK; + if(audio_i2s_mp3.encoder_type == MP3_ENCODER){ +#ifdef MP3_MIC_STREAM + mic_enc = new AudioEncoderShineMP3(rec_file_ptr, &audio_i2s_mp3.client); +#endif // MP3_MIC_STREAM + } else { +#ifdef USE_I2S_OPUS + mic_enc = new AudioEncoderOpusWebm(rec_file_ptr, &audio_i2s_mp3.client); +#endif // USE_I2S_OPUS + } -// if (audio_i2s.in) { -// if (audio_i2s_mp3.decoder || audio_i2s_mp3.mp3) return 0; -// } + if (audio_i2s_mp3.use_stream) { + audio_i2s_mp3.client.flush(); + audio_i2s_mp3.client.setTimeout(3); + if(audio_i2s_mp3.encoder_type == MP3_ENCODER){ + audio_i2s_mp3.client.print("HTTP/1.1 200 OK\r\n" + "Content-Type: audio/mpeg;\r\n\r\n"); + } else if (audio_i2s_mp3.encoder_type == OPUS_ENCODER){ + audio_i2s_mp3.client.print("HTTP/1.1 200 OK\r\n" + "Content-Type: audio/webm; codecs=opus\r\n\r\n"); + } + } -// err = SpeakerMic(I2S_AUDIO_MODE_MIC); -// if (err) { -// if (audio_i2s.in) { -// SpeakerMic(I2S_AUDIO_MODE_SPK); -// } -// AddLog(LOG_LEVEL_INFO, PSTR("mic init error: %d"), err); -// return err; -// } + error = mic_enc->begin(audio_i2s.Settings->rx.sample_rate, audio_i2s.Settings->rx.channels); + if(error != 0){ + goto exit; + } -// strlcpy(audio_i2s_mp3.mic_path, path, sizeof(audio_i2s_mp3.mic_path)); + ctime = TasmotaGlobal.uptime; + timeForOneRead = 1000 / ((audio_i2s.Settings->rx.sample_rate / (mic_enc->samplesPerPass * audio_i2s.Settings->rx.channels ))); + // timeForOneRead -= 1; // be very in time + AddLog(LOG_LEVEL_DEBUG, PSTR("I2S: samples %u, bytesize %u, time: %u"),mic_enc->samplesPerPass, mic_enc->byteSize, timeForOneRead); + xLastWakeTime = xTaskGetTickCount(); -// audio_i2s_mp3.mic_stop = 0; + while (!audio_i2s_mp3.mic_stop) { + size_t bytes_read; + // bytes_read = audio_i2s.in->readMic((uint8_t*)mic_enc->inBuffer, mic_enc->byteSize, true /*dc_block*/, false /*apply_gain*/, true /*lowpass*/, nullptr /*peak_ptr*/); + i2s_channel_read(audio_i2s.in->getRxHandle(), (void*)mic_enc->inBuffer, mic_enc->byteSize, &bytes_read, pdMS_TO_TICKS(1)); -// uint32_t stack = 4096; + if (gain > 1) { + // set gain the "old way" + int16_t _gain = gain / 16; + for (uint32_t cnt = 0; cnt < bytes_read / 2; cnt++) { + mic_enc->inBuffer[cnt] *= _gain; + } + } -// audio_i2s_mp3.use_stream = !strcmp(audio_i2s_mp3.mic_path, "stream.mp3"); + __enctime = millis(); + if(bytes_read != 0){ + written = mic_enc->encode(bytes_read >> 1); //transmit samples, written is an error code + } + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("_mic: %u , %i, %i"), millis() - __enctime, written, bytes_read); + if(written < 0){ + break; + } -// if (audio_i2s_mp3.use_stream) { -// stack = 8000; -// } + if (audio_i2s_mp3.use_stream) { + if (!audio_i2s_mp3.client.connected()) { + break; + } + } -// err = xTaskCreatePinnedToCore(mic_task, "MIC", stack, NULL, 3, &audio_i2s_mp3.mic_task_handle, 1); + audio_i2s_mp3.recdur = TasmotaGlobal.uptime - ctime; + vTaskDelayUntil( &xLastWakeTime, pdMS_TO_TICKS(timeForOneRead)); + } -// return err; -// } + written = mic_enc->stop(); -// void Cmd_MicRec(void) { + if (!audio_i2s_mp3.use_stream) { + rec_file.write(mic_enc->outFrame, written); + } else { + audio_i2s_mp3.client.write((const char*)mic_enc->outFrame, written); + } -// if (XdrvMailbox.data_len > 0) { -// if (!strncmp(XdrvMailbox.data, "-?", 2)) { -// Response_P("{\"I2SREC-duration\":%d}", audio_i2s_mp3.recdur); -// } else { -// i2s_record_shine(XdrvMailbox.data); -// ResponseCmndChar(XdrvMailbox.data); -// } -// } else { -// if (audio_i2s_mp3.mic_task_handle) { -// // stop task -// audio_i2s_mp3.mic_stop = 1; -// while (audio_i2s_mp3.mic_stop) { -// delay(1); -// } -// ResponseCmndChar_P(PSTR("Stopped")); -// } -// } +exit: + delete mic_enc; + audio_i2s_mp3.use_stream = false; + audio_i2s.in->stopRx(); + audio_i2s_mp3.mic_stop = 0; + audio_i2s_mp3.mic_error = error; + AddLog(LOG_LEVEL_INFO, PSTR("I2S: record task result code: %d, min bytes stack free: %u"), error, (uint32_t)uxTaskGetStackHighWaterMark(NULL)*4); + audio_i2s_mp3.mic_task_handle = 0; + audio_i2s_mp3.recdur = 0; + audio_i2s_mp3.stream_active = false; + vTaskDelete(NULL); +} -// } -// #endif // USE_SHINE +int32_t I2sRecord(char *path, uint32_t encoder_type) { + esp_err_t err = ESP_OK; + uint32_t stack = 8000; + #ifdef USE_I2S_MP3 + if (audio_i2s_mp3.decoder) return 0; + #endif -// // mic gain in factor not percent -// void Cmd_MicGain(void) { -// if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 256)) { -// if (audio_i2s.in) { -// audio_i2s.in->setRxGain(XdrvMailbox.payload); -// } -// if (audio_i2s.Settings) { -// audio_i2s.Settings->rx.gain = XdrvMailbox.payload * 16; -// } -// I2SSettingsSave(AUDIO_CONFIG_FILENAME); -// } -// ResponseCmndNumber(audio_i2s.Settings->rx.gain / 16); -// } + switch(encoder_type){ +#ifdef MP3_MIC_STREAM + case MP3_ENCODER: + switch(audio_i2s.Settings->rx.sample_rate){ + case 32000: case 48000: case 44100: + break; // supported + default: + AddLog(LOG_LEVEL_ERROR, PSTR("I2S: unsupported sample rate for MP3 encoding: %d Hz"), audio_i2s.Settings->rx.sample_rate); + return -1; + } + AddLog(LOG_LEVEL_DEBUG, PSTR("I2S: start MP3 encoding: %d Hz"), audio_i2s.Settings->rx.sample_rate); + break; +#endif // MP3_MIC_STREAM +#ifdef USE_I2S_OPUS + case OPUS_ENCODER: + switch(audio_i2s.Settings->rx.sample_rate){ + case 48000: case 24000: case 16000: case 12000: case 8000: + stack = audio_i2s.Settings->rx.sample_rate/2 + 30000; //not the exact value, but okay'ish + break; + default: + AddLog(LOG_LEVEL_ERROR, PSTR("I2S: unsupported sample rate for OPUS encoding: %d Hz"), audio_i2s.Settings->rx.sample_rate); + return -1; + } + AddLog(LOG_LEVEL_DEBUG, PSTR("I2S: start OPUS encoding: %d Hz"), audio_i2s.Settings->rx.sample_rate); + break; +#endif // USE_I2S_OPUS + default: + AddLog(LOG_LEVEL_ERROR, PSTR("I2S: unsupported encoder")); + } + audio_i2s_mp3.encoder_type = encoder_type; + + if (audio_i2s_mp3.preallocateCodec != nullptr){ + AddLog(LOG_LEVEL_DEBUG,PSTR("I2S: free codec buffer")); + free(audio_i2s_mp3.preallocateCodec); + audio_i2s_mp3.preallocateCodec = nullptr; + } + + if(!audio_i2s_mp3.use_stream){ + strlcpy(audio_i2s_mp3.mic_path, path, sizeof(audio_i2s_mp3.mic_path)); + } + audio_i2s_mp3.mic_stop = 0; + + audio_i2s.in->startRx(); + err = xTaskCreatePinnedToCore(I2sMicTask, "MIC", stack, NULL, 3, &audio_i2s_mp3.mic_task_handle, 1); + return err; +} #endif // USE_I2S_AUDIO #endif // defined(ESP32) && ESP_IDF_VERSION_MAJOR >= 5 diff --git a/tasmota/tasmota_xdrv_driver/xdrv_42_2_i2s_mp3stream_idf51.ino b/tasmota/tasmota_xdrv_driver/xdrv_42_2_i2s_mp3stream_idf51.ino index aca46360b..e2be765b1 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_42_2_i2s_mp3stream_idf51.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_42_2_i2s_mp3stream_idf51.ino @@ -25,42 +25,57 @@ #endif -void Stream_mp3(void) { +void I2SMP3StreamInit(){ + audio_i2s_mp3.encoder_type = MP3_ENCODER; + I2SstreamInit (); +} + +void I2SOpusStreamInit(){ + audio_i2s_mp3.encoder_type = OPUS_ENCODER; + I2SstreamInit (); +} + +void I2SstreamInit (void) { if (audio_i2s_mp3.stream_active) { - AddLog(LOG_LEVEL_INFO, PSTR("I2S: can not handle client - other MP3 task active")); + AddLog(LOG_LEVEL_INFO, PSTR("I2S: can not handle client - other stream task active")); return; } - AddLog(LOG_LEVEL_INFO, PSTR("I2S: Handle mp3server")); - audio_i2s_mp3.stream_active = 1; - audio_i2s_mp3.client = audio_i2s_mp3.MP3Server->client(); + audio_i2s_mp3.stream_active = true; + audio_i2s_mp3.client = audio_i2s_mp3.StreamServer->client(); AddLog(LOG_LEVEL_INFO, PSTR("I2S: Create client")); - // i2s_record_shine((char*)"stream.mp3"); - I2sRecordShine((char*)"stream.mp3"); -} -void I2sMp3Loop(void) { - if (audio_i2s_mp3.MP3Server) { - audio_i2s_mp3.MP3Server->handleClient(); + audio_i2s_mp3.use_stream = true; + if(I2sRecord((char*)"", audio_i2s_mp3.encoder_type) != pdTRUE){ + AddLog(LOG_LEVEL_INFO, PSTR("I2S: Stop client")); + audio_i2s_mp3.stream_active = false; + audio_i2s_mp3.client.stop(); } } -void I2sMp3Init(uint32_t on) { +void I2sStreamLoop(void) { + if (audio_i2s_mp3.StreamServer) { + audio_i2s_mp3.StreamServer->handleClient(); + } +} + +void I2sServerInit(uint32_t on) { if (on) { - if (!audio_i2s_mp3.MP3Server) { - audio_i2s_mp3.MP3Server = new ESP8266WebServer(MP3_STREAM_PORT); - audio_i2s_mp3.MP3Server->on(PSTR("/stream.mp3"), Stream_mp3); - audio_i2s_mp3.MP3Server->on(PSTR("/stream.m3a"), Stream_mp3); - audio_i2s_mp3.MP3Server->begin(); - AddLog(LOG_LEVEL_INFO, PSTR("MP3: server created on port: %d "), MP3_STREAM_PORT); + if (!audio_i2s_mp3.StreamServer) { + audio_i2s_mp3.StreamServer = new ESP8266WebServer(MP3_STREAM_PORT); + audio_i2s_mp3.StreamServer->on(PSTR("/stream.mp3"), I2SMP3StreamInit); + audio_i2s_mp3.StreamServer->on(PSTR("/stream.m3a"), I2SMP3StreamInit); + audio_i2s_mp3.StreamServer->on(PSTR("/stream.webm"), I2SOpusStreamInit); + audio_i2s_mp3.StreamServer->begin(); + AddLog(LOG_LEVEL_INFO, PSTR("I2S: server created on port: %d "), MP3_STREAM_PORT); } } else { - if (audio_i2s_mp3.MP3Server) { - audio_i2s_mp3.MP3Server->stop(); - delete audio_i2s_mp3.MP3Server; - audio_i2s_mp3.MP3Server = nullptr; + if (audio_i2s_mp3.StreamServer) { + audio_i2s_mp3.StreamServer->stop(); + delete audio_i2s_mp3.StreamServer; + audio_i2s_mp3.StreamServer = nullptr; audio_i2s_mp3.mic_stop = 1; - audio_i2s_mp3.stream_active = 0; - AddLog(LOG_LEVEL_INFO, PSTR("MP3: server deleted")); + audio_i2s_mp3.stream_active = false; + AddLog(LOG_LEVEL_INFO, PSTR("I2S: server deleted")); } } } @@ -70,7 +85,7 @@ void CmndI2SMP3Stream(void) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { audio_i2s_mp3.stream_enable = XdrvMailbox.payload; } - I2sMp3Init(audio_i2s_mp3.stream_enable); + I2sServerInit(audio_i2s_mp3.stream_enable); ResponseCmndNumber(audio_i2s_mp3.stream_enable); } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_42_7_i2s_webradio_idf51.ino b/tasmota/tasmota_xdrv_driver/xdrv_42_7_i2s_webradio_idf51.ino index c88c14514..7f8133c07 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_42_7_i2s_webradio_idf51.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_42_7_i2s_webradio_idf51.ino @@ -21,12 +21,8 @@ #if defined(USE_I2S_AUDIO) && defined(USE_I2S_WEBRADIO) struct AUDIO_I2S_WEBRADIO_t { - // Webradio AudioFileSourceICYStream *ifile = NULL; - AudioFileSourceBuffer *buff = NULL; char wr_title[64]; - void *preallocateBuffer = NULL; - void *preallocateCodec = NULL; } Audio_webradio; void I2sMDCallback(void *cbData, const char *type, bool isUnicode, const char *str) { @@ -46,60 +42,74 @@ void I2SWrStatusCB(void *cbData, int code, const char *str){ AddLog(LOG_LEVEL_INFO, "I2S: status: %s",str); } -void Webradio(const char *url) { - // allocate buffers if not already done - if (Audio_webradio.preallocateBuffer == NULL) { - Audio_webradio.preallocateBuffer = special_malloc(preallocateBufferSize); +bool I2SWebradio(const char *url, uint32_t decoder_type) { + + size_t wr_tasksize = 8000; // suitable for ACC and MP3 + if(decoder_type == 2){ // opus needs a ton of stack + wr_tasksize = 26000; } - if (Audio_webradio.preallocateCodec == NULL) { - Audio_webradio.preallocateCodec = special_malloc(preallocateCodecSize); + + // allocate buffers if not already done + if (audio_i2s_mp3.preallocateBuffer == NULL) { + audio_i2s_mp3.preallocateBuffer = special_malloc(preallocateBufferSize); + } + if (audio_i2s_mp3.preallocateCodec == NULL) { + audio_i2s_mp3.preallocateCodec = special_malloc(preallocateCodecSize); } // check if we have buffers - if (Audio_webradio.preallocateBuffer == NULL || Audio_webradio.preallocateCodec == NULL) { + if (audio_i2s_mp3.preallocateBuffer == NULL || audio_i2s_mp3.preallocateCodec == NULL) { AddLog(LOG_LEVEL_INFO, "I2S: cannot allocate buffers"); - if (Audio_webradio.preallocateBuffer != NULL) { - free(Audio_webradio.preallocateBuffer); - Audio_webradio.preallocateBuffer = NULL; + if (audio_i2s_mp3.preallocateBuffer != NULL) { + free(audio_i2s_mp3.preallocateBuffer); + audio_i2s_mp3.preallocateBuffer = NULL; } - if (Audio_webradio.preallocateCodec != NULL) { - free(Audio_webradio.preallocateCodec); - Audio_webradio.preallocateCodec = NULL; + if (audio_i2s_mp3.preallocateCodec != NULL) { + free(audio_i2s_mp3.preallocateCodec); + audio_i2s_mp3.preallocateCodec = NULL; } - return; + return false; } Audio_webradio.ifile = new AudioFileSourceICYStream(); Audio_webradio.ifile->RegisterMetadataCB(I2sMDCallback, NULL); Audio_webradio.ifile->RegisterStatusCB(I2SWrStatusCB, NULL); if(!Audio_webradio.ifile->open(url)){ - I2sWebRadioStopPlaying(); - return; + goto i2swr_fail; } AddLog(LOG_LEVEL_INFO, "I2S: did connect to %s",url); I2SAudioPower(true); - Audio_webradio.buff = new AudioFileSourceBuffer(Audio_webradio.ifile, Audio_webradio.preallocateBuffer, preallocateBufferSize); - if(Audio_webradio.buff == nullptr){ - return; + audio_i2s_mp3.buff = new AudioFileSourceBuffer(Audio_webradio.ifile, audio_i2s_mp3.preallocateBuffer, preallocateBufferSize); + if(audio_i2s_mp3.buff == nullptr){ + goto i2swr_fail; } - Audio_webradio.buff->RegisterStatusCB(I2sStatusCallback, NULL); - audio_i2s_mp3.decoder = new AudioGeneratorMP3(Audio_webradio.preallocateCodec, preallocateCodecSize); - if(audio_i2s_mp3.decoder == nullptr){ - return; - } - audio_i2s_mp3.decoder->RegisterStatusCB(I2sStatusCallback, NULL); - audio_i2s_mp3.decoder->begin(Audio_webradio.buff, audio_i2s.out); - if (!audio_i2s_mp3.decoder->isRunning()) { - I2sStopPlaying(); + audio_i2s_mp3.buff->RegisterStatusCB(I2sStatusCallback, NULL); + + if(I2SinitDecoder(decoder_type) == false){ + AddLog(LOG_LEVEL_DEBUG, "I2S: decoder init failed"); + goto i2swr_fail; } - AddLog(LOG_LEVEL_DEBUG,PSTR("I2S: will launch webradio task")); - xTaskCreatePinnedToCore(I2sMp3WrTask, "MP3-WR", 8192, NULL, 3, &audio_i2s_mp3.mp3_task_handle, 1); + audio_i2s_mp3.decoder->RegisterStatusCB(I2sStatusCallback, NULL); + if(audio_i2s_mp3.decoder->begin(audio_i2s_mp3.buff, audio_i2s.out)){ + AddLog(LOG_LEVEL_DEBUG, "I2S: decoder started"); + } else { + goto i2swr_fail; + } + + AddLog(LOG_LEVEL_DEBUG,PSTR("I2S: will launch webradio task with decoder type %u"), decoder_type); + xTaskCreatePinnedToCore(I2sMp3WrTask, "MP3-WR", wr_tasksize, NULL, 3, &audio_i2s_mp3.mp3_task_handle, 1); + return true; + +i2swr_fail: + I2sStopPlaying(); + I2sWebRadioStopPlaying(); + return false; } #ifdef USE_WEBSERVER const char HTTP_WEBRADIO[] PROGMEM = - "{s}" "I2S_WR-Title" "{m}%s{e}"; + "{s}" "Webradio:" "{m}%s{e}"; void I2sWrShow(bool json) { if (audio_i2s_mp3.decoder) { @@ -116,8 +126,11 @@ void CmndI2SWebRadio(void) { if (I2SPrepareTx() != I2S_OK) return; if (XdrvMailbox.data_len > 0) { - Webradio(XdrvMailbox.data); - ResponseCmndChar(XdrvMailbox.data); + if(I2SWebradio(XdrvMailbox.data, XdrvMailbox.index)){ + ResponseCmndChar(XdrvMailbox.data); + } else { + ResponseCmndFailed(); + } } else { ResponseCmndChar_P(PSTR("Stopped")); } @@ -130,10 +143,10 @@ void I2sWebRadioStopPlaying() { delete audio_i2s_mp3.decoder; audio_i2s_mp3.decoder = nullptr; } - if (Audio_webradio.buff) { - Audio_webradio.buff->close(); - delete Audio_webradio.buff; - Audio_webradio.buff = NULL; + if (audio_i2s_mp3.buff) { + audio_i2s_mp3.buff->close(); + delete audio_i2s_mp3.buff; + audio_i2s_mp3.buff = NULL; } if (Audio_webradio.ifile) { Audio_webradio.ifile->close(); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino b/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino index 84203d405..6b482e7c4 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino @@ -494,6 +494,117 @@ bool TfsRenameFile(const char *fname1, const char *fname2) { return true; } +/*********************************************************************************************\ + * Log file + * + * Enable with command `FileLog 1..4` or `FileLog 11..14` + * Rotate max 16 x FILE_LOG_SIZE kB log files /log01 -> /log02 ... /log16 -> /log01 ... + * Filesystem needs to be larger than 10k (FILE_LOG_FREE) +\*********************************************************************************************/ + +#ifndef FILE_LOG_SIZE +#define FILE_LOG_SIZE 100 // Log file size in kBytes (100kB is based on minimal filesystem of 320kB) +#endif +#define FILE_LOG_FREE 10 // Minimum free filesystem space in kBytes + +#define FILE_LOG_COUNT 16 // Number of log files (max 16 as four bits are reserved for index) +#define FILE_LOG_NAME "/log%02d" // Log file name + +void FileLoggingAsync(bool refresh) { + static uint32_t index = 1; // Rotating log buffer entry pointer + + uint32_t filelog_level = Settings->filelog_level % 10; + if (!ffs_type || !filelog_level) { return; } // No filesystem or [FileLog] disabled + if (refresh && !NeedLogRefresh(filelog_level, index)) { return; } // No log buffer changes + uint32_t filelog_option = Settings->filelog_level / 10; + + char fname[14]; + File file; + uint32_t log_file_idx = Settings->mbflag2.log_file_idx; // 0..15 + for (uint32_t retry = 0; retry <= 1; retry++) { + snprintf_P(fname, sizeof(fname), PSTR(FILE_LOG_NAME), log_file_idx +1); // /log01 + file = ffsp->open(fname, "a"); // Append to existing log file + if (!file) { + file = ffsp->open(fname, "w"); // Make new log file + if (!file) { + Settings->filelog_level = 0; // [FileLog] disable + AddLog(LOG_LEVEL_INFO, PSTR("FLG: Logging disabled. Save failed")); + return; // Failed to make file + } + } + + bool fs_full = (UfsFree() < FILE_LOG_FREE); + if (!fs_full && (file.size() < (FILE_LOG_SIZE * 1000))) { break; } + + file.close(); + + if (1 == retry) { + Settings->filelog_level = 0; // [FileLog] disable + AddLog(LOG_LEVEL_INFO, PSTR("FLG: Logging disabled. No free space")); + return; + } + + // Rotate log file(s) as size is over FILE_LOG_SIZE or free space is less than FILE_LOG_FREE + uint32_t last_log_file_idx = log_file_idx; // 0..15 + log_file_idx++; + + if ((1 == filelog_option) && + (fs_full || (log_file_idx == FILE_LOG_COUNT))) { // Rotate until free space is less than FILE_LOG_FREE + Settings->filelog_level = 0; // [FileLog] disable + AddLog(LOG_LEVEL_INFO, PSTR("FLG: Logging disabled. Max rotates")); + return; + } + + if (log_file_idx >= FILE_LOG_COUNT) { log_file_idx = 0; } // Rotate max 16 log files + snprintf_P(fname, sizeof(fname), PSTR(FILE_LOG_NAME), log_file_idx +1); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("FLG: Rotate file %s"), fname +1); // Skip leading slash + Settings->mbflag2.log_file_idx = log_file_idx; // Save for restart or power on + + if (0 == filelog_option) { // Remove oldest log file(s) + // Remove log file(s) taking into account non-sequential file names and different file sizes + uint32_t idx = log_file_idx; // Next log file index + do { // Need free space around FILE_LOG_SIZE so find oldest log file(s) and remove it + snprintf_P(fname, sizeof(fname), PSTR(FILE_LOG_NAME), idx +1); + if (ffsp->remove(fname)) { // Remove oldest (non-)sequential log file(s) + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("FLG: Delete file %s"), fname +1); // Skip leading slash + } + idx++; + if (idx >= FILE_LOG_COUNT) { idx = 0; } + } while ((UfsFree() < FILE_LOG_FREE) && (idx != last_log_file_idx)); + } + } + +#ifdef USE_WEBCAM + WcInterrupt(0); // Stop stream if active to fix TG1WDT_SYS_RESET +#endif + char* line; + size_t len; + while (GetLog(filelog_level, &index, &line, &len)) { + // This will timeout on ESP32-webcam + // But now solved with WcInterrupt(0) in support_esp.ino + file.write((uint8_t*)line, len -1); // Write up to LOG_BUFFER_SIZE log data + snprintf_P(fname, sizeof(fname), PSTR("\r\n")); + file.write((uint8_t*)fname, 2); + } +#ifdef USE_WEBCAM + WcInterrupt(1); +#endif + + file.close(); +} + +void FileLoggingDelete(void) { + if (!ffs_type) { return; } // No filesystem + + char fname[14]; + for (uint32_t idx = 0; idx < FILE_LOG_COUNT; idx++) { + snprintf_P(fname, sizeof(fname), PSTR(FILE_LOG_NAME), idx +1); + ffsp->remove(fname); // Remove all log file(s) + } + Settings->mbflag2.log_file_idx = 0; + AddLog(LOG_LEVEL_INFO, PSTR("FLG: Log files deleted")); +} + /*********************************************************************************************\ * File command execute support \*********************************************************************************************/ @@ -1739,7 +1850,6 @@ void Switch_FTP(void) { * Interface \*********************************************************************************************/ - bool Xdrv50(uint32_t function) { bool result = false; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_0_berry_struct.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_0_berry_struct.ino index 86098f79f..ad1fd1f8f 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_0_berry_struct.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_0_berry_struct.ino @@ -93,6 +93,9 @@ public: int32_t timeout = 0; // Berry heartbeat timeout, preventing code to run for too long. `0` means not enabled bool rules_busy = false; // are we already processing rules, avoid infinite loop bool web_add_handler_done = false; // did we already sent `web_add_handler` event +#ifdef USE_BERRY_LEDS_PANEL + bool leds_panel_loaded = false; // did we already load Parition_Wizard +#endif // USE_BERRY_LEDS_PANEL #ifdef USE_BERRY_PARTITION_WIZARD bool partition_wizard_loaded = false; // did we already load Parition_Wizard #endif // USE_BERRY_PARTITION_WIZARD @@ -124,6 +127,16 @@ struct BeBECCode_t { }; const BeBECCode_t BECCode[] = { +#ifdef USE_BERRY_LEDS_PANEL + { + "Leds Panel", + "leds_panel", + USE_BERRY_LEDS_PANEL_URL, + "/?", + &berry.leds_panel_loaded + }, +#endif // USE_BERRY_LEDS_PANEL + #ifdef USE_BERRY_PARTITION_WIZARD { "Partition Wizard", diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_gpio.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_gpio.ino index 97eb571e4..6b0172497 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_gpio.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_gpio.ino @@ -54,6 +54,7 @@ extern "C" { if (pin >= 0) { if (mode > 0) { // standard ESP mode + analogDetach(pin); pinMode(pin, mode); } else { // synthetic mode diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino index 555f4c44d..43c944621 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino @@ -59,18 +59,14 @@ extern "C" { // # 01 : begin void -> void // # 02 : show void -> void // # 03 : CanShow void -> bool - // # 04 : IsDirty void -> bool - // # 05 : Dirty void -> void + // # 04 : IsDirty void -> bool (deprecated) + // # 05 : Dirty void -> void (deprecated) // # 06 : Pixels void -> bytes() (mapped to the buffer) // # 07 : PixelSize void -> int // # 08 : PixelCount void -> int - // # 09 : ClearTo (color:??) -> void - // # 10 : SetPixelColor (idx:int, color:??) -> void - // # 11 : GetPixelColor (idx:int) -> color:?? - // # 20 : RotateLeft (rot:int [, first:int, last:int]) -> void - // # 21 : RotateRight (rot:int [, first:int, last:int]) -> void - // # 22 : ShiftLeft (rot:int [, first:int, last:int]) -> void - // # 23 : ShiftRight (rot:int [, first:int, last:int]) -> void + // # 09 : ClearTo (color:0xRRGGBB or 0xWWRRGGBB) -> void + // # 10 : SetPixelColor (idx:int, color:0xRRGGBB or 0xWWRRGGBB) -> void + // # 11 : GetPixelColor (idx:int) -> color:0xRRGGBB or 0xWWRRGGBB void * be_get_tasmotaled(bvm *vm) { be_getmember(vm, 1, "_p"); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_lvgl.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_lvgl.ino index e6838a48e..200004e1b 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_lvgl.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_lvgl.ino @@ -50,6 +50,8 @@ extern bool lvgl_started(void); extern void lvgl_set_screenshot_file(File * file); extern void lvgl_reset_screenshot_file(void); File * lvgl_get_screenshot_file(void); +extern void lv_set_paint_cb(void* cb); +extern void* lv_get_paint_cb(void); /******************************************************************** * Structures used by LVGL_Berry @@ -658,6 +660,19 @@ extern "C" { be_pushstring(vm, fname); be_return(vm); } + + /*********************************************************************************************\ + * Screenshot in raw format + \********************************************************************************************/ + int lv0_set_paint_cb(bvm *vm); + int lv0_set_paint_cb(bvm *vm) { + int32_t argc = be_top(vm); // Get the number of arguments + if (argc >= 1 && be_iscomptr(vm, 1)) { + lv_set_paint_cb(be_tocomptr(vm, 1)); + } + be_pushcomptr(vm, lv_get_paint_cb()); + be_return(vm); + } } #else // USE_LVGL diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_serial.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_serial.ino index e0efe5ae0..7b0809217 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_serial.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_serial.ino @@ -143,10 +143,18 @@ extern "C" { int32_t b_serial_read(struct bvm *vm) { be_getmember(vm, 1, ".p"); TasmotaSerial * ser = (TasmotaSerial *) be_tocomptr(vm, -1); + int32_t max_lex = -1; // -1 means unlimited + int32_t argc = be_top(vm); // Get the number of arguments + if (argc >= 2 && be_isint(vm, 2)) { + max_lex = be_toint(vm, 2); + } if (ser) { int32_t len = ser->available(); if (len < 0) { len = 0; } if (len > 0) { + if (max_lex >= 0 && len > max_lex) { + len = max_lex; + } // read bytes on stack char * rx_buf = new char[len]; len = ser->read(rx_buf, len); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota_global.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota_global.ino index 3b5a0f95e..28d26720a 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota_global.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota_global.ino @@ -33,10 +33,11 @@ extern "C" { extern const be_ctypes_structure_t be_tasmota_global_struct = { sizeof(TasmotaGlobal), /* size in bytes */ - 10, /* number of elements */ + 12, /* number of elements */ nullptr, - (const be_ctypes_structure_item_t[10]) { + (const be_ctypes_structure_item_t[12]) { // Warning: fields below need to be in alphabetical order + { "deferred_ready", offsetof(TasmotaGlobal_t, berry_deferred_ready), 0, 0, ctypes_u8, 0 }, { "devices_present", offsetof(TasmotaGlobal_t, devices_present), 0, 0, ctypes_u8, 0 }, { "energy_driver", offsetof(TasmotaGlobal_t, energy_driver), 0, 0, ctypes_u8, 0 }, { "fast_loop_enabled", offsetof(TasmotaGlobal_t, berry_fast_loop_enabled), 0, 0, ctypes_u8, 0 }, @@ -46,20 +47,29 @@ extern "C" { { "seriallog_level", offsetof(TasmotaGlobal_t, seriallog_level), 0, 0, ctypes_u8, 0 }, { "sleep", offsetof(TasmotaGlobal_t, sleep), 0, 0, ctypes_u8, 0 }, { "syslog_level", offsetof(TasmotaGlobal_t, syslog_level), 0, 0, ctypes_u8, 0 }, + { "tele_period", offsetof(TasmotaGlobal_t, tele_period), 0, 0, ctypes_u16, 0 }, { "templog_level", offsetof(TasmotaGlobal_t, templog_level), 0, 0, ctypes_u8, 0 }, }}; extern const be_ctypes_structure_t be_tasmota_settings_struct = { sizeof(TSettings), /* size in bytes */ - 6, /* number of elements */ + 14, /* number of elements */ nullptr, - (const be_ctypes_structure_item_t[6]) { + (const be_ctypes_structure_item_t[14]) { // Warning: fields below need to be in alphabetical order { "bootcount", offsetof(TSettings, bootcount), 0, 0, ctypes_u16, 0 }, + { "light_pixels", 0x496, 0, 15, ctypes_bf, 0 }, + { "light_pixels_alternate", 0xEC5, 7, 1, ctypes_bf, 0 }, + { "light_pixels_height_1", 0xEC4, 0, 15, ctypes_bf, 0 }, + { "light_pixels_order", 0xFD8, 4, 3, ctypes_bf, 0 }, + { "light_pixels_reverse", 0x497, 7, 1, ctypes_bf, 0 }, + { "light_pixels_rgbw", 0xFD8, 7, 1, ctypes_bf, 0 }, + { "light_pixels_w_first", 0xFD9, 0, 1, ctypes_bf, 0 }, { "mqttlog_level", offsetof(TSettings, mqttlog_level), 0, 0, ctypes_u8, 0 }, { "seriallog_level", offsetof(TSettings, seriallog_level), 0, 0, ctypes_u8, 0 }, { "sleep", offsetof(TSettings, sleep), 0, 0, ctypes_u8, 0 }, { "syslog_level", offsetof(TSettings, syslog_level), 0, 0, ctypes_u8, 0 }, + { "tele_period", offsetof(TSettings, tele_period), 0, 0, ctypes_u16, 0 }, { "weblog_level", offsetof(TSettings, weblog_level), 0, 0, ctypes_u8, 0 }, }}; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_ulp.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_ulp.ino index 5c17dc13c..5a55daec4 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_ulp.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_ulp.ino @@ -21,35 +21,20 @@ #ifdef USE_BERRY_ULP #include -// #if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_ULP_COPROC_TYPE_LP_CORE) #if defined(CONFIG_ULP_COPROC_ENABLED) #if defined(CONFIG_IDF_TARGET_ESP32) #include "esp32/ulp.h" #endif // esp32 -// #if ESP_IDF_VERSION_MAJOR < 5 -// #if defined(CONFIG_IDF_TARGET_ESP32S2) -// #include "esp32s2/ulp.h" -// #include "esp32s2/ulp_riscv.h" -// #include "esp32s2/ulp_riscv_adc.h" -// #endif // s2 -// #if defined(CONFIG_IDF_TARGET_ESP32S3) -// #include "esp32s3/ulp.h" -// #include "esp32s3/ulp_riscv.h" -// #include "esp32s3/ulp_riscv_adc.h" -// #endif //s3 -// #endif // ESP_IDF_VERSION_MAJOR < 5 + #include "driver/rtc_io.h" #include "driver/gpio.h" -// #if ESP_IDF_VERSION_MAJOR >= 5 - #include "esp_adc/adc_oneshot.h" - #include "ulp_adc.h" - #if defined(CONFIG_ULP_COPROC_TYPE_RISCV) // S2 or S3 - #include "ulp_riscv.h" - #endif // defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) -// #else -// #include "driver/adc.h" -// #endif // ESP_IDF_VERSION_MAJOR >= 5 + +#include "ulp_adc.h" +#if defined(CONFIG_ULP_COPROC_TYPE_RISCV) // S2 or S3 + #include "ulp_riscv.h" +#endif // defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) + #ifdef CONFIG_ULP_COPROC_TYPE_LP_CORE #include "ulp_lp_core.h" ulp_lp_core_cfg_t be_ulp_lp_core_cfg; @@ -109,10 +94,10 @@ extern "C" { } } - // `ULP.adc_config(channel:int, attenuation:int, width:int) -> nil` + // `ULP.adc_config(channel:int, attenuation:int, width:int) -> error:int` // // enums: channel 0-7, attenuation 0-3, width 0-3 - void be_ULP_adc_config(struct bvm *vm, int32_t channel, int32_t attenuation, int32_t width) { + int32_t be_ULP_adc_config(struct bvm *vm, int32_t channel, int32_t attenuation, int32_t width) { #if defined(CONFIG_IDF_TARGET_ESP32) ulp_adc_cfg_t cfg = { .adc_n = ADC_UNIT_1, @@ -141,9 +126,7 @@ extern "C" { be_raisef(vm, "ulp_adc_config_error", "ULP: not supported before ESP-IDF 5.4"); esp_err_t err = ESP_FAIL; #endif - if (err != ESP_OK) { - be_raisef(vm, "ulp_adc_config_error", "ULP: invalid code err=%i", err); - } + return err; } /** diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino index c5bad3c9e..63c69cdcc 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino @@ -176,6 +176,26 @@ int32_t callBerryEventDispatcher(const char *type, const char *cmd, int32_t idx, return ret; } +// simple wrapper to call `tasmota.()` +static void callBerryTasmotaFunc(const char * method_name) { + bvm *vm = berry.vm; + if (be_getglobal(vm, "tasmota")) { + if (be_getmethod(vm, -1, method_name)) { + be_pushvalue(vm, -2); // add instance as first arg + BrTimeoutStart(); + int32_t ret = be_pcall(vm, 1); + if (ret != 0) { + be_error_pop_all(berry.vm); // clear Berry stack + } + BrTimeoutReset(); + be_pop(vm, 1); + } + be_pop(vm, 1); // remove method + } + be_pop(vm, 1); // remove instance object + be_pop(vm, be_top(vm)); // clean +} + // Simplified version of event loop. Just call `tasmota.fast_loop()` // `every_5ms` is a flag to wait at least 5ms between calss to `tasmota.fast_loop()` void callBerryFastLoop(bool every_5ms) { @@ -191,21 +211,13 @@ void callBerryFastLoop(bool every_5ms) { fast_loop_last_call = now; // TODO - can we make this dereferencing once for all? - if (be_getglobal(vm, "tasmota")) { - if (be_getmethod(vm, -1, "fast_loop")) { - be_pushvalue(vm, -2); // add instance as first arg - BrTimeoutStart(); - int32_t ret = be_pcall(vm, 1); - if (ret != 0) { - be_error_pop_all(berry.vm); // clear Berry stack - } - BrTimeoutReset(); - be_pop(vm, 1); - } - be_pop(vm, 1); // remove method - } - be_pop(vm, 1); // remove instance object - be_pop(vm, be_top(vm)); // clean + callBerryTasmotaFunc("fast_loop"); +} + +// call `tasmota.run_immediate()` +void callBerryRunDeferred(void) { + if (nullptr == berry.vm) { return; } + callBerryTasmotaFunc("run_deferred"); } /*********************************************************************************************\ @@ -384,6 +396,12 @@ void BerryInit(void) { AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_BERRY "Berry initialized, RAM used %u bytes"), callBerryGC()); berry_init_ok = true; + // reinit some specific information +#ifdef USE_BERRY_LEDS_PANEL + // if no WS2812 configured, hide "Leds Panel" download button + berry.leds_panel_loaded = !PinUsed(GPIO_WS2812); +#endif // USE_BERRY_LEDS_PANEL + // we generate a synthetic event `autoexec` callBerryEventDispatcher(PSTR("preinit"), nullptr, 0, nullptr); @@ -882,6 +900,9 @@ bool Xdrv52(uint32_t function) switch (function) { case FUNC_SLEEP_LOOP: + if (TasmotaGlobal.berry_deferred_ready) { // there are immediate functions registered, call them first + callBerryRunDeferred(); // call `tasmota.run_immediate()` + } if (TasmotaGlobal.berry_fast_loop_enabled) { // call only if enabled at global level callBerryFastLoop(true); // call `tasmota.fast_loop()` optimized for minimal performance impact } @@ -908,6 +929,9 @@ bool Xdrv52(uint32_t function) } #endif // USE_WEBSERVER } + if (TasmotaGlobal.berry_deferred_ready) { // there are immediate functions registered, call them first + callBerryRunDeferred(); // call `tasmota.run_immediate()` + } if (TasmotaGlobal.berry_fast_loop_enabled) { // call only if enabled at global level callBerryFastLoop(false); // call `tasmota.fast_loop()` optimized for minimal performance impact } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_54_lvgl.ino b/tasmota/tasmota_xdrv_driver/xdrv_54_lvgl.ino index ad7029310..bd2aa1295 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_54_lvgl.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_54_lvgl.ino @@ -31,6 +31,9 @@ #include "freertos/task.h" #include "freertos/semphr.h" +// callback type when a screen paint is done +typedef void (*lv_paint_cb_t)(int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint8_t *pixels); + struct LVGL_Glue { lv_display_t *lv_display = nullptr; lv_indev_t *lv_indev = nullptr; @@ -38,6 +41,7 @@ struct LVGL_Glue { void *lv_pixel_buf2 = nullptr; Ticker tick; File * screenshot = nullptr; + lv_paint_cb_t paint_cb = nullptr; }; LVGL_Glue * lvgl_glue; @@ -100,6 +104,20 @@ void lv_flush_callback(lv_display_t *disp, const lv_area_t *area, uint8_t *color chrono_time > 0 ? pixels_len / chrono_time : -1); } } + // if there is a display callback, call it + if (lvgl_glue->paint_cb != nullptr) { + lvgl_glue->paint_cb(area->x1, area->y1, area->x2, area->y2, color_p); + } +} + +void lv_set_paint_cb(void* cb); +void lv_set_paint_cb(void* cb) { + lvgl_glue->paint_cb = (lv_paint_cb_t) cb; +} + +void * lv_get_paint_cb(void); +void * lv_get_paint_cb(void) { + return (void*) lvgl_glue->paint_cb; } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_56_rtc_chips.ino b/tasmota/tasmota_xdrv_driver/xdrv_56_rtc_chips.ino index 079c48230..d3927c5a8 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_56_rtc_chips.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_56_rtc_chips.ino @@ -87,29 +87,28 @@ struct { \*-------------------------------------------------------------------------------------------*/ uint32_t DS3231ReadTime(void) { TIME_T tm; - tm.second = Bcd2Dec(I2cRead8(RtcChip.address, DS3231_SECONDS)); - tm.minute = Bcd2Dec(I2cRead8(RtcChip.address, DS3231_MINUTES)); - tm.hour = Bcd2Dec(I2cRead8(RtcChip.address, DS3231_HOURS) & ~_BV(DS3231_HR1224)); // Assumes 24hr clock - tm.day_of_week = I2cRead8(RtcChip.address, DS3231_DAY); - tm.day_of_month = Bcd2Dec(I2cRead8(RtcChip.address, DS3231_DATE)); - tm.month = Bcd2Dec(I2cRead8(RtcChip.address, DS3231_MONTH) & ~_BV(DS3231_CENTURY)); // Don't use the Century bit + tm.second = Bcd2Dec(I2cRead8(RtcChip.address, DS3231_SECONDS, RtcChip.bus)); + tm.minute = Bcd2Dec(I2cRead8(RtcChip.address, DS3231_MINUTES, RtcChip.bus)); + tm.hour = Bcd2Dec(I2cRead8(RtcChip.address, DS3231_HOURS, RtcChip.bus) & ~_BV(DS3231_HR1224)); // 24h mode + tm.day_of_week = I2cRead8(RtcChip.address, DS3231_DAY, RtcChip.bus); + tm.day_of_month = Bcd2Dec(I2cRead8(RtcChip.address, DS3231_DATE, RtcChip.bus)); + tm.month = Bcd2Dec(I2cRead8(RtcChip.address, DS3231_MONTH, RtcChip.bus) & ~_BV(DS3231_CENTURY)); // Don't use the Century bit // MakeTime requires tm.year as number of years since 1970, // However DS3231 is supposed to hold the true year but before this PR it was written tm.year directly // Assuming we read ... means ... // 00..21 = 1970..1990 written before PR (to support a RTC written with 1970) => don't apply correction // 22..51 = 2022..2051 written after PR => apply +30 years correction // 52..99 = 2022..2069 written before PR => don't apply correction - uint8_t year = Bcd2Dec(I2cRead8(RtcChip.address, DS3231_YEAR)); - tm.year = ((year <= 21) || (year >= 52)) ? (year) : (year+30); + uint8_t year = Bcd2Dec(I2cRead8(RtcChip.address, DS3231_YEAR, RtcChip.bus)); + tm.year = ((year <= 21) || (year >= 52)) ? year : (year + 30); return MakeTime(tm); } - /*-------------------------------------------------------------------------------------------*\ * Read temperature from DS3231 internal sensor, return as float \*-------------------------------------------------------------------------------------------*/ #ifdef DS3231_ENABLE_TEMP float DS3231ReadTemp(void) { - int16_t temp_reg = I2cReadS16(RtcChip.address, DS3231_TEMP_MSB) >> 6; + int16_t temp_reg = I2cReadS16(RtcChip.address, DS3231_TEMP_MSB, RtcChip.bus) >> 6; float temp = temp_reg * 0.25; //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("RTC: DS3231 temp_reg=%d"), temp_reg); return temp; @@ -151,16 +150,15 @@ void D3231ShowSensor(bool json) { void DS3231SetTime(uint32_t epoch_time) { TIME_T tm; BreakTime(epoch_time, tm); - I2cWrite8(RtcChip.address, DS3231_SECONDS, Dec2Bcd(tm.second)); - I2cWrite8(RtcChip.address, DS3231_MINUTES, Dec2Bcd(tm.minute)); - I2cWrite8(RtcChip.address, DS3231_HOURS, Dec2Bcd(tm.hour)); - I2cWrite8(RtcChip.address, DS3231_DAY, tm.day_of_week); - I2cWrite8(RtcChip.address, DS3231_DATE, Dec2Bcd(tm.day_of_month)); - I2cWrite8(RtcChip.address, DS3231_MONTH, Dec2Bcd(tm.month)); - // BreakTime returns tm.year as number of years since 1970, while DS3231 expect the true year. Adusting to avoir leap year error + I2cWrite8(RtcChip.address, DS3231_SECONDS, Dec2Bcd(tm.second), RtcChip.bus); + I2cWrite8(RtcChip.address, DS3231_MINUTES, Dec2Bcd(tm.minute), RtcChip.bus); + I2cWrite8(RtcChip.address, DS3231_HOURS, Dec2Bcd(tm.hour), RtcChip.bus); + I2cWrite8(RtcChip.address, DS3231_DAY, tm.day_of_week, RtcChip.bus); + I2cWrite8(RtcChip.address, DS3231_DATE, Dec2Bcd(tm.day_of_month), RtcChip.bus); + I2cWrite8(RtcChip.address, DS3231_MONTH, Dec2Bcd(tm.month), RtcChip.bus); uint8_t true_year = (tm.year < 30) ? (tm.year + 70) : (tm.year - 30); - I2cWrite8(RtcChip.address, DS3231_YEAR, Dec2Bcd(true_year)); - I2cWrite8(RtcChip.address, DS3231_STATUS, I2cRead8(RtcChip.address, DS3231_STATUS) & ~_BV(DS3231_OSF)); // Clear the Oscillator Stop Flag + I2cWrite8(RtcChip.address, DS3231_YEAR, Dec2Bcd(true_year), RtcChip.bus); + I2cWrite8(RtcChip.address, DS3231_STATUS, I2cRead8(RtcChip.address, DS3231_STATUS, RtcChip.bus) & ~_BV(DS3231_OSF), RtcChip.bus); } /*-------------------------------------------------------------------------------------------*\ @@ -169,8 +167,11 @@ void DS3231SetTime(uint32_t epoch_time) { void DS3231Detected(void) { if (!RtcChip.detected && I2cEnabled(XI2C_26)) { RtcChip.address = DS3231_ADDRESS; - if (I2cSetDevice(RtcChip.address)) { - if (I2cValidRead(RtcChip.address, DS3231_STATUS, 1)) { + for (RtcChip.bus = 0; RtcChip.bus < 2; RtcChip.bus++) { + if (!I2cSetDevice(RtcChip.address, RtcChip.bus)) { + continue; + } + if (I2cValidRead(RtcChip.address, DS3231_STATUS, 1, RtcChip.bus)) { RtcChip.detected = 1; strcpy_P(RtcChip.name, PSTR("DS3231")); RtcChip.ReadTime = &DS3231ReadTime; @@ -179,12 +180,119 @@ void DS3231Detected(void) { RtcChip.ShowSensor = &D3231ShowSensor; #endif RtcChip.mem_size = -1; + break; } } } } #endif // USE_DS3231 + + +/*********************************************************************************************\ + * PCF85063 support + * + * I2C Address: 0x51 +\*********************************************************************************************/ +#ifdef USE_PCF85063 + +#define XI2C_92 92 // Unique ID for I2C device search + +#define PCF85063_ADDRESS 0x51 // PCF85063 I2C Address + + +#define PCF85063_REG_CTRL1 0x00 +#define PCF85063_REG_CTRL2 0x01 +#define PCF85063_REG_OFFSET 0x02 +#define PCF85063_REG_SECONDS 0x04 +#define PCF85063_REG_MINUTES 0x05 +#define PCF85063_REG_HOURS 0x06 +#define PCF85063_REG_DAYS 0x07 +#define PCF85063_REG_WEEKDAYS 0x08 +#define PCF85063_REG_MONTHS 0x09 +#define PCF85063_REG_YEARS 0x0A + + +uint32_t Pcf85063ReadTime(void) { + Wire.beginTransmission(RtcChip.address); + Wire.write(PCF85063_REG_SECONDS); + Wire.endTransmission(false); // false -> repeated start + Wire.requestFrom((uint8_t)RtcChip.address, (uint8_t)7); + + uint8_t sec = Wire.read(); // 0x04 + uint8_t min = Wire.read(); // 0x05 + uint8_t hour = Wire.read(); // 0x06 + uint8_t day = Wire.read(); // 0x07 + uint8_t wday = Wire.read(); // 0x08 + uint8_t month = Wire.read(); // 0x09 + uint8_t year = Wire.read(); // 0x0A + + TIME_T tm; + tm.second = Bcd2Dec(sec & 0x7F); + tm.minute = Bcd2Dec(min & 0x7F); + tm.hour = Bcd2Dec(hour & 0x3F); + tm.day_of_month = Bcd2Dec(day & 0x3F); + tm.day_of_week = wday & 0x07; + tm.month = Bcd2Dec(month & 0x1F) -1; + uint8_t y = Bcd2Dec(year); + tm.year = (y + 30); + return MakeTime(tm); +} + + +void Pcf85063SetTime(uint32_t epoch_time) { + TIME_T tm; + BreakTime(epoch_time, tm); + + + uint8_t year = (tm.year -30); + if (year > 99) { year = 99; } + + uint8_t bcd_sec = Dec2Bcd(tm.second); + uint8_t bcd_min = Dec2Bcd(tm.minute); + uint8_t bcd_hour = Dec2Bcd(tm.hour); + uint8_t bcd_day = Dec2Bcd(tm.day_of_month); + uint8_t bcd_wday = tm.day_of_week & 0x07; + uint8_t bcd_month = Dec2Bcd(tm.month +1); + uint8_t bcd_year = Dec2Bcd(year); + + Wire.beginTransmission(RtcChip.address); + Wire.write(PCF85063_REG_SECONDS); + Wire.write(bcd_sec); + Wire.write(bcd_min); + Wire.write(bcd_hour); + Wire.write(bcd_day); + Wire.write(bcd_wday); + Wire.write(bcd_month); + Wire.write(bcd_year); + Wire.endTransmission(); +} + +/*-------------------------------------------------------------------------------------------*\ + * Detection +\*-------------------------------------------------------------------------------------------*/ +void Pcf85063Detected(void) { + if (!RtcChip.detected && I2cEnabled(XI2C_92)) { + RtcChip.address = PCF85063_ADDRESS; + // Vyskúšame, či vieme prečítať nejaký register + if (I2cSetDevice(RtcChip.address)) { + // Skúsime napr. prečítať PCF85063_REG_CTRL1 + if (I2cValidRead(RtcChip.address, PCF85063_REG_CTRL1, 1)) { + RtcChip.detected = 1; + strcpy_P(RtcChip.name, PSTR("PCF85063")); + RtcChip.ReadTime = &Pcf85063ReadTime; + RtcChip.SetTime = &Pcf85063SetTime; + RtcChip.mem_size = -1; // Nemá extra user RAM, ak by si nepotreboval + + // Ak by si chcel implementovať MemRead/MemWrite, doplň RtcChip.MemRead a RtcChip.MemWrite + } + } + } +} +#endif // USE_PCF85063 + + + /*********************************************************************************************\ * BM8563 - Real Time Clock * @@ -500,6 +608,9 @@ void RtcChipDetect(void) { #ifdef USE_RX8010 Rx8010Detected(); #endif // USE_RX8010 +#ifdef USE_PCF85063 + Pcf85063Detected(); +#endif // USE_PCF85063 if (!RtcChip.detected) { return; } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_57_9_tasmesh.ino b/tasmota/tasmota_xdrv_driver/xdrv_57_9_tasmesh.ino index e3b111229..c7c230a48 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_57_9_tasmesh.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_57_9_tasmesh.ino @@ -422,6 +422,7 @@ void MESHstartNode(int32_t _channel, uint8_t _role){ //we need a running broker void MESHstartBroker(void) { // Must be called after WiFi is initialized!! Rule - on system#boot do meshbroker endon #ifdef ESP32 WiFi.mode(WIFI_AP_STA); + WiFi.AP.begin(); AddLog(LOG_LEVEL_INFO, PSTR("MSH: Broker MAC %s"), WiFi.softAPmacAddress().c_str()); WiFi.softAPmacAddress(MESH.broker); //set MESH.broker to the needed MAC uint32_t _channel = WiFi.channel(); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino b/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino index 298fe5cc6..fa02ff840 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_59_influxdb.ino @@ -51,8 +51,9 @@ #define XDRV_59 59 +#ifndef INFLUXDB_INITIAL #define INFLUXDB_INITIAL 7 // Initial number of seconds after wifi connect keeping in mind sensor initialization - +#endif #ifndef INFLUXDB_STATE #define INFLUXDB_STATE 0 // [Ifx] Influxdb initially Off (0) or On (1) #endif diff --git a/tasmota/tasmota_xdrv_driver/xdrv_73_6_lorawan_decode.ino b/tasmota/tasmota_xdrv_driver/xdrv_73_6_lorawan_decode.ino index 90436a04b..2f087a9f2 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_73_6_lorawan_decode.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_73_6_lorawan_decode.ino @@ -88,7 +88,8 @@ void LoraWanDecode(struct LoraNodeData_t* node_data) { uint8_t FPort; */ if (bitRead(Lora->settings.flags, TAS_LORA_FLAG_DECODE_ENABLED)) { // LoraOption3 1 - if (0x00161600 == Lora->settings.end_node[node_data->node].DevEUIh) { // MerryIoT + uint32_t manufacturer = Lora->settings.end_node[node_data->node].DevEUIh >> 8; + if (0x001616 == manufacturer) { // MerryIoT if (120 == node_data->FPort) { // MerryIoT door/window Sensor (DW10) if (9 == node_data->payload_len) { // MerryIoT Sensor state // 1 2 3 4 5 6 7 8 9 @@ -122,7 +123,7 @@ void LoraWanDecode(struct LoraNodeData_t* node_data) { } } - else if (0xA840410E == Lora->settings.end_node[node_data->node].DevEUIh) { // Dragino + else if (0xA84041 == manufacturer) { // Dragino if (10 == node_data->FPort) { // Dragino LDS02 // 8CD2 01 000010 000000 00 - Door Open, 3.282V // 0CD2 01 000011 000000 00 - Door Closed diff --git a/tasmota/tasmota_xdrv_driver/xdrv_73_8_lorawan_bridge.ino b/tasmota/tasmota_xdrv_driver/xdrv_73_8_lorawan_bridge.ino index 583612af6..37712062a 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_73_8_lorawan_bridge.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_73_8_lorawan_bridge.ino @@ -505,7 +505,7 @@ bool LoraWanInput(uint8_t* data, uint32_t packet_size) { node_data.FPort = FPort; LoraWanDecode(&node_data); - if (0xA840410E == Lora->settings.end_node[node].DevEUIh) { // Dragino + if (0xA84041 == Lora->settings.end_node[node].DevEUIh >> 8) { // Dragino // Dragino v1.7 fails to set DR with ADR so set it using serial interface: // Password 123456 // AT+CHS=868100000 diff --git a/tasmota/tasmota_xdrv_driver/xdrv_77_wizmote.ino b/tasmota/tasmota_xdrv_driver/xdrv_77_wizmote.ino new file mode 100644 index 000000000..13194e7ae --- /dev/null +++ b/tasmota/tasmota_xdrv_driver/xdrv_77_wizmote.ino @@ -0,0 +1,232 @@ +/* + xdrv_77_wizmote.ino - WiZ Smart Remote decoder support for Tasmota + + SPDX-FileCopyrightText: 2025 Theo Arends + + SPDX-License-Identifier: GPL-3.0-only +*/ + +#ifdef USE_WIZMOTE +/*********************************************************************************************\ + * WiZ WiFi ESP-NOW Smart Remote decoder + * + * Example rule + * on wizmote#action do var1 %value% endon - Store current button + * on wizmote#id=12318994 do event action=%var1% endon - Test for correct Id and execute event + * on event#action=on do power 1 endon - On button ON do power 1 + * on event#action=off do power 0 endon - On button OFF do power 0 + * on event#action=bd do dimmer - endon - On button Brihtness - do dimmer - (10% decrease) + * on event#action=bu do dimmer + endon - On button Brightness + do dimmer + (10% increase) + * on event#action=bn do dimmer 20 endon - On button Moon do dimmer 20 +\*********************************************************************************************/ + +#define XDRV_77 77 + +#ifndef WIZMOTE_CHANNEL +#define WIZMOTE_CHANNEL 1 // WiZ Smart Remote ESP-NOW channel if WiFi is disabled +#endif + +#include + +struct WizMote { + uint32_t last_seq; + uint32_t id; + int rssi; + uint8_t index; + uint8_t battery_level; + uint8_t active; +} WizMote; + +/*********************************************************************************************\ + * WiZ Smart Remote +\*********************************************************************************************/ + +#define WIZMOTE_BUTTON_ON 1 +#define WIZMOTE_BUTTON_OFF 2 +#define WIZMOTE_BUTTON_NIGHT 3 +#define WIZMOTE_BUTTON_BRIGHT_DOWN 8 +#define WIZMOTE_BUTTON_BRIGHT_UP 9 +#define WIZMOTE_BUTTON_ONE 16 +#define WIZMOTE_BUTTON_TWO 17 +#define WIZMOTE_BUTTON_THREE 18 +#define WIZMOTE_BUTTON_FOUR 19 +#define WIZSMART_BUTTON_ON 100 +#define WIZSMART_BUTTON_OFF 101 +#define WIZSMART_BUTTON_BRIGHT_UP 102 +#define WIZSMART_BUTTON_BRIGHT_DOWN 103 + +// 01 2 3 4 5 6 7 8 9 +const char kWMButtons[] PROGMEM = "|OFF|ON|BN|B1|B2|B3|B4|BU|BD"; +const uint8_t sWMButtons[] PROGMEM = { + WIZMOTE_BUTTON_ON, WIZMOTE_BUTTON_OFF, WIZMOTE_BUTTON_NIGHT, + WIZMOTE_BUTTON_ONE, WIZMOTE_BUTTON_TWO, WIZMOTE_BUTTON_THREE, WIZMOTE_BUTTON_FOUR, + WIZMOTE_BUTTON_BRIGHT_DOWN, WIZMOTE_BUTTON_BRIGHT_UP, + WIZSMART_BUTTON_ON, WIZSMART_BUTTON_OFF, + WIZSMART_BUTTON_BRIGHT_DOWN, WIZSMART_BUTTON_BRIGHT_UP +}; +const uint8_t dWMButtons[] PROGMEM = { + 2, 1, 3, + 4, 5, 6, 7, + 9, 8, + 2, 1, + 9, 8 +}; + +typedef struct WizMotePacket { + union { + uint8_t program; // 0x91 for ON button, 0x81 for all others + struct { + uint8_t : 4; + uint8_t pairing : 1; + uint8_t : 3; + }; + }; + uint32_t sequence; // Incremental sequence number 32 bit unsigned integer LE + uint8_t data_type1; // Data type: button (32) + uint8_t button; // Identifies which button is being pressed + uint8_t data_type2; // Data type: batteryLevel (1) + uint8_t battery_level; // WiZMote batteryLevel out of 0 .. 100 + uint8_t mac[4]; // CCM MAC (Message Authentication Code) +} __attribute__((packed)) WizMotePacket_t; + +void WizMoteHandleRemoteData(uint8_t *mac, uint8_t *incoming_data, size_t len, signed int rssi) { + // WiZ mac = 44:4F:8E:00:00:00 to 44:4F:8E:FF:FF:FF + + WizMotePacket_t *incoming = reinterpret_cast(incoming_data); + + if (len != sizeof(WizMotePacket_t)) { + AddLog(LOG_LEVEL_DEBUG, PSTR("WIZ: ERROR Rcvd unknown message of length %d"), len); + return; + } + + if (incoming->sequence == WizMote.last_seq) { + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("WIZ: WARNING Rcvd same sequence %d"), incoming->sequence); + return; + } + + WizMote.index = 0; + for (uint32_t i = 0; i < 13; i++) { + if (incoming->button == pgm_read_byte(sWMButtons + i)) { + WizMote.index = pgm_read_byte(dWMButtons + i); + break; + } + } + if (0 == WizMote.index) { + AddLog(LOG_LEVEL_DEBUG, PSTR("WIZ: ERROR Rcvd invalid button code %d"), incoming->button); + return; + } + WizMote.id = mac[5] | (mac[4] << 8) | (mac[3] << 16); // WiZ mac block range + WizMote.rssi = rssi; + WizMote.battery_level = incoming->battery_level; + WizMote.last_seq = incoming->sequence; +} + +void WizMoteResponse(void) { + // This needs to be executed here as it will panic if placed within the above Callback + char text[5]; + Response_P(PSTR("{\"WiZMote\":{\"Id\":%d,\"Action\":\"%s\",\"RSSI\":%d,\"Battery\":%d}}"), + WizMote.id, GetTextIndexed(text, sizeof(text), WizMote.index, kWMButtons), WizMote.rssi, WizMote.battery_level); + if (Settings->flag6.mqtt_disable_publish ) { // SetOption147 - If it is activated, Tasmota will not publish MQTT message, but it will proccess event trigger rules + XdrvRulesProcess(0); + } else { + MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR("WIZMOTE")); + } + WizMote.index = 0; +} + +/*********************************************************************************************\ + * ESP-NOW +\*********************************************************************************************/ + +void EspNowDataReceived(uint8_t* mac, uint8_t* data, uint8_t len, signed int rssi, bool broadcast) { + char _destMAC[18]; + ToHex_P(mac, 6, _destMAC, 18, ':'); + + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("NOW: Rcvd %*_H, RSSI %d, MAC %s, %s"), + len, data, rssi, _destMAC, broadcast ? "Broadcast" : "Unicast"); + + if (data[0] == 0x91 || data[0] == 0x81 || data[0] == 0x80) { + WizMoteHandleRemoteData(mac, data, len, rssi); + } +} + +void EspNowInit(void) { + if (0 == Settings->flag4.network_wifi) { // WiFi Off .. + if (!TasmotaGlobal.global_state.wifi_down) { return; } // .. and processed by WifiDisable() + if (1 == WizMote.active) { + WizMote.active--; // Add a second delay + return; + } + if (WizMote.active != 2) { + +// AddLog(LOG_LEVEL_DEBUG, PSTR("NOW: Status %d, SSID '%s', Ch %d, IP %s, MAC %s"), +// WiFi.status(), WiFi.SSID().c_str(), WiFi.channel(), WiFi.localIP().toString().c_str(), WiFi.macAddress().c_str()); + + WiFi.mode(WIFI_STA); +#ifdef ESP32 + WiFi.disconnect(false, true); +#else + WiFi.disconnect(false); +#endif // ESP32 + +// AddLog(LOG_LEVEL_DEBUG, PSTR("NOW: Status %d, SSID '%s', Ch %d, IP %s, MAC %s"), +// WiFi.status(), WiFi.SSID().c_str(), WiFi.channel(), WiFi.localIP().toString().c_str(), WiFi.macAddress().c_str()); + + quickEspNow.stop(); + if (quickEspNow.begin(WIZMOTE_CHANNEL)) { // Specify channel if no connected WiFi + quickEspNow.onDataRcvd(EspNowDataReceived); + Settings->flag.global_state = 1; // SetOption31 - (Wifi, MQTT) Control link led blinking (1) + AddLog(LOG_LEVEL_INFO, PSTR("NOW: Started on channel " STR(WIZMOTE_CHANNEL))); + WizMote.active = 2; + } + } + } else { // WiFi On + if (TasmotaGlobal.global_state.wifi_down) { + WizMote.active = 0; + } + else if (WizMote.active != 1) { + quickEspNow.stop(); + if (quickEspNow.begin()) { + quickEspNow.onDataRcvd(EspNowDataReceived); + AddLog(LOG_LEVEL_INFO, PSTR("NOW: Started")); + WizMote.active = 1; + } + } + } +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xdrv77(uint32_t function) { + if (!Settings->flag6.wizmote_enabled) { // SetOption164 - (WizMote) Enable WiZ Smart Remote support (1) + if (WizMote.active) { + quickEspNow.stop(); + AddLog(LOG_LEVEL_INFO, PSTR("NOW: Stopped")); + WizMote.active = 0; + } + return false; + } + + bool result = false; + + if (FUNC_EVERY_SECOND == function) { + EspNowInit(); + } + else if (WizMote.active) { + switch (function) { + case FUNC_LOOP: + if (WizMote.index > 0) { + WizMoteResponse(); + } + break; + case FUNC_ACTIVE: + result = true; + break; + } + } + return result; +} + +#endif // USE_WIZMOTE diff --git a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino index 37df5bd3f..f43c3e055 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam.ino @@ -159,7 +159,7 @@ struct { uint16_t width; uint16_t height; uint8_t stream_active; - #ifndef USE_WEBCAM_SETUP_ONLY +#ifndef USE_WEBCAM_SETUP_ONLY WiFiClient client; ESP8266WebServer *CamServer; struct PICSTORE picstore[MAX_PICSTORE]; @@ -169,9 +169,9 @@ struct { CRtspSession *rtsp_session; WiFiClient rtsp_client; uint8_t rtsp_start; -#endif // ENABLE_RTSPSERVER OV2640 cam; uint32_t rtsp_lastframe_time; +#endif // ENABLE_RTSPSERVER #endif // USE_WEBCAM_SETUP_ONLY } Wc; @@ -488,7 +488,7 @@ uint32_t WcSetup(int32_t fsiz) { camera_sensor_info_t *info = esp_camera_sensor_get_info(&wc_s->id); AddLog(LOG_LEVEL_INFO, PSTR("CAM: %s Initialized"), info->name); - + TasmotaGlobal.camera_initialized = true; Wc.up = 1; if (psram) { Wc.up = 2; } @@ -1503,6 +1503,18 @@ void WcUpdateStats(void) { WcStats.camcnt = 0; } +void WcSensorStats(void) { + if (!Wc.up) { return; } + + ResponseAppend_P(PSTR(",\"CAMERA\":{" + "\"" D_WEBCAM_STATS_FPS "\":%d," + "\"" D_WEBCAM_STATS_CAMFAIL "\":%d," + "\"" D_WEBCAM_STATS_JPEGFAIL "\":%d," + "\"" D_WEBCAM_STATS_CLIENTFAIL "\":%d}"), + WcStats.camfps, WcStats.camfail, + WcStats.jpegfail, WcStats.clientfail); +} + const char HTTP_WEBCAM_FPS[] PROGMEM = "{s}%s " D_FRAME_RATE "{m}%d " D_UNIT_FPS "{e}"; void WcStatsShow(void) { @@ -1532,6 +1544,8 @@ bool Xdrv81(uint32_t function) { break; case FUNC_EVERY_SECOND: WcUpdateStats(); + case FUNC_JSON_APPEND: + WcSensorStats(); case FUNC_WEB_SENSOR: WcStatsShow(); break; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam_task.ino b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam_task.ino index 0b682e6eb..1a019d7c4 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam_task.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam_task.ino @@ -1151,6 +1151,7 @@ uint32_t WcSetup(int32_t fsiz) { camera_sensor_info_t *info = esp_camera_sensor_get_info(&wc_s->id); AddLog(LOG_LEVEL_INFO, PSTR("CAM: %s Initialized"), info->name); + TasmotaGlobal.camera_initialized = true; Wc.up = 1; if (Wc.psram) { Wc.up = 2; } @@ -2950,6 +2951,18 @@ void WcUpdateStats(void) { Wc.loopcounter = 0; } +void WcSensorStats(void) { + if (!Wc.up) { return; } + + ResponseAppend_P(PSTR(",\"CAMERA\":{" + "\"" D_WEBCAM_STATS_FPS "\":%d," + "\"" D_WEBCAM_STATS_CAMFAIL "\":%d," + "\"" D_WEBCAM_STATS_JPEGFAIL "\":%d," + "\"" D_WEBCAM_STATS_CLIENTFAIL "\":%d}"), + WcStats.camfps, WcStats.camfail, + WcStats.jpegfail, WcStats.clientfail); +} + #ifndef D_WEBCAM_STATE #define D_WEBCAM_STATE "State" #define D_WEBCAM_POWEREDOFF "PowerOff" @@ -2994,6 +3007,9 @@ bool Xdrv99(uint32_t function) { case FUNC_EVERY_SECOND: WcUpdateStats(); break; + case FUNC_JSON_APPEND: + WcSensorStats(); + break; case FUNC_WEB_SENSOR: WcStatsShow(); break; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_86_esp32_sonoff_spm.ino b/tasmota/tasmota_xdrv_driver/xdrv_86_esp32_sonoff_spm.ino index 592856851..e0854db2b 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_86_esp32_sonoff_spm.ino @@ -67,6 +67,8 @@ * SspmOverload 10,0,0,0,235.2 - Enable overload detection after 10 seconds for MaxVoltage * SspmScan - Rescan ARM modbus taking around 20 seconds * SspmReset 1 - Reset ARM and restart ESP + * SspmPowerOnState2 0|1|2 - Set relay2 power on state (0 = Off, 1 = On, 2 = Saved) - Needs both main and 4relay at v1.2.0 + * (4relay modules below v1.2.0 will be controlled by command PowerOnState) * * Todo: * Gui for Overload Protection entry (is handled by ARM processor). @@ -252,6 +254,8 @@ typedef struct { float energy_today[SSPM_MAX_MODULES][4]; // 12345 kWh float energy_total[SSPM_MAX_MODULES][4]; // 12345 kWh total energy since last 6 month!!! + uint32_t relay_versions[SSPM_MAX_MODULES]; + float min_power; float max_power; float min_voltage; @@ -1032,9 +1036,9 @@ void SSPMAddModule(void) { Sspm->map_change = true; } - uint32_t relay_version = SspmBuffer[36] << 16 | SspmBuffer[37] << 8 | SspmBuffer[38]; // 0x00010000 or 0x00010200 - if (relay_version < Sspm->relay_version) { - Sspm->relay_version = relay_version; // Lowest version will be supported + Sspm->relay_versions[mapped] = SspmBuffer[36] << 16 | SspmBuffer[37] << 8 | SspmBuffer[38]; // 0x00010000 or 0x00010200 + if (Sspm->relay_versions[mapped] < Sspm->relay_version) { + Sspm->relay_version = Sspm->relay_versions[mapped]; // Lowest version will be supported } mapped++; AddLog(LOG_LEVEL_INFO, PSTR("SPM: 4Relay %d (mapped to %d) type %d version %d.%d.%d found with id %12_H"), @@ -1043,7 +1047,7 @@ void SSPMAddModule(void) { Sspm->module_max++; if (Settings->save_data) { - TasmotaGlobal.save_data_counter = Settings->save_data +2; // Postpone flash write until all modules are scanned + TasmotaGlobal.save_data_counter = Settings->save_data +2; // Postpone flash write until all modules are scanned } } } @@ -2104,11 +2108,19 @@ void SSPMEvery100ms(void) { if (!Sspm->Settings.simulate_count) { #endif // SSPM_SIMULATE if (Sspm->relay_version < SSPM_VERSION_1_2_0) { - // Set relay power on state based on Tasmota global setting + // Set relay power on state based on Tasmota global setting (only needed for 4Relay v1.0.0 modules) if (Sspm->power_on_state) { - TasmotaGlobal.power = Sspm->power_on_state; - Sspm->power_on_state = 0; // Reset power on state solving re-scan - SetPowerOnState(); // Set power on state now that all relays have been detected + for (uint32_t module = 0; module < Sspm->module_max; module++) { + if (Sspm->relay_versions[module] < SSPM_VERSION_1_2_0) { + uint32_t mask = 1 << (module *4); + for (uint32_t relay = 0; relay < 4; relay++) { + uint32_t bit = (module *4) +relay; + bitWrite(TasmotaGlobal.power, bit, bitRead(Sspm->power_on_state, bit)); + } + } + } + Sspm->power_on_state = 0; // Reset power on state solving re-scan + SetDevicePower(TasmotaGlobal.power, SRC_RESTART); // Set power on state now that all relays have been detected } } #ifdef SSPM_SIMULATE @@ -2662,6 +2674,7 @@ void CmndSSPMSend(void) { void CmndSSPMPowerOnState(void) { // SspmPowerOnState2 0|1|2 - Set relay2 power on state (0 = Off, 1 = On, 2 = Saved) // Needs both main and 4relay at v1.2.0 + // 4relay modules below v1.2.0 will be controlled by command PowerOnState in state SPM_SCAN_COMPLETE) if (Sspm->main_version > SSPM_VERSION_1_0_0) { uint32_t max_index = Sspm->module_max *4; if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= max_index)) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_91_esp32_twai.ino b/tasmota/tasmota_xdrv_driver/xdrv_91_esp32_twai.ino new file mode 100644 index 000000000..57ad13870 --- /dev/null +++ b/tasmota/tasmota_xdrv_driver/xdrv_91_esp32_twai.ino @@ -0,0 +1,445 @@ +/* + xdrv_91_esp32_twai.ino - ESP32 TWAI support for Tasmota + + SPDX-FileCopyrightText: 2025 Theo Arends + + SPDX-License-Identifier: GPL-3.0-only +*/ + +#ifdef ESP32 +#ifdef USE_ESP32_TWAI +#if SOC_TWAI_SUPPORTED +/*********************************************************************************************\ + * ESP32 Two-Wire Automotive Interface (TWAI) or Controller Area Network (CAN) busses. + * - Supports all TWAI busses provided by different ESP32 architectures. + * - Needs external tranceiver like M5Unit Mini CAN (not isolated!) or M5Unit CANBus (isolated). + * + * The TWAI controller is not compatible with ISO11898-1 FD Format frames, and will interpret + * such frames as errors. CAN bus message format is 32-bit identifier and up to 8 bytes of data + * + * Due to the CAN-bus nature of many received datagrams you'll needs a berry driver with + * class "twai" and functions "config" and "decode". + * - See example below. + * - When executed by `preinit.be` it allows to configure the TWAI driver mode and speed + * + * For more information see https://tasmota.github.io/docs/TWAI/ + * + * Supported command: + * TwaiSend[] [[[[[[[[],],],],],],],] + * TwaiSend[] {"ID":,["DATA":[[[[[[[],],],],],],],]]} + * - An with bit 31 set (0x80000000) is a 29-bit identifier + * - All is optional + * + * Examples: + * TwaiSend1 0x481,0x03,0x1E,0xFF,0xFF,0xFF,0x01,0x21 + * TwaiSend1 {"ID":0x481,"DATA":[0x03,0x1E,0xFF,0xFF,0xFF,0x01,0x21]} + * TwaiSend2 {"ID":0x80000481,"DATA":[0x03,0x1E,0xFF,0xFF,0xFF,0x01,0x21]} +\*********************************************************************************************/ + +#define XDRV_91 91 + +#define TWAI_POLLING_RATE_MS 100 + +#include "driver/twai.h" + +enum TwaiSpeeds { TWAI_SPEED_25KBITS = 0, + TWAI_SPEED_50KBITS, + TWAI_SPEED_100KBITS, + TWAI_SPEED_125KBITS, + TWAI_SPEED_250KBITS, + TWAI_SPEED_500KBITS, + TWAI_SPEED_800KBITS, + TWAI_SPEED_1MBITS, + TWAI_SPEED_MAX }; + +const char kTwaiSpeeds[] PROGMEM = "25K|50K|100K|125K|250K|500K|800K|1M"; +const char kTwaiModes[] PROGMEM = "Normal|No Ack|Listen Only"; + +struct TWAIs { + twai_handle_t bus; + twai_mode_t mode; + uint8_t rx_queue_len; + uint8_t speed; + bool installed; +} Twai[MAX_TWAI]; + +bool Twai_supported; + +#ifdef USE_BERRY +/*********************************************************************************************\ + * Berry example code +\*********************************************************************************************/ + +/* +file twai_minimal.be contents: + +class twai_cls + var twai_speed, twai_mode, twai_rx_queue_len # (int, int, int) + + def init() + self.twai_speed = 4 # 0 = 25K, 1 = 50K, 2 = 100K, 3 = 125K, 4 = 250K, 5 = 500K, 6 = 800K, 7 = 1Mbits + self.twai_mode = 2 # 0 = TWAI_MODE_NORMAL, 1 = TWAI_MODE_NO_ACK, 2 = TWAI_MODE_LISTEN_ONLY + self.twai_rx_queue_len = 8 # 1 .. 64 + + if global.twai_driver + global.twai_driver.stop() # Let previous instance bail out cleanly + end + tasmota.add_driver(global.twai_driver := self) + end + + def stop() + tasmota.remove_driver(self) + end + + #---------------------------------------------------------------------------------------------- + Allow TWAI driver configuration on restart (if this file is installed by preinit.be) + ----------------------------------------------------------------------------------------------# + def config(bus) # This function name (config) is called by the TWAI driver! + return (self.twai_rx_queue_len -1) << 5 | self.twai_mode << 3 | self.twai_speed # Initial configure TWAI driver + end + + #---------------------------------------------------------------------------------------------- + This example decodes nothing but allows for the driver to show message logging in log level 4 + ----------------------------------------------------------------------------------------------# + def decode(param, ident, data1, data2) # This function name (decode) is called by the TWAI driver! + var bus = param & 0xF # Bus number (1..3) + var len = param >> 4 & 0xF # Number of data bytes (0..8) + var extended = ident >> 31 & 0x1 # Extended identifier flag (0..1) + var id = ident & 0x1fffffff + + end +end + +twai = twai_cls() # This class name (twai) is used by the TWAI driver! + +// ******************************************************************************************* + +file preinit.be contents: + +load('twai_minimal.be') +*/ + +/*********************************************************************************************\ + * Berry interface +\*********************************************************************************************/ + +bool TWAIBerryDecode(uint32_t bus, uint32_t identifier, uint32_t data_length_code, uint8_t *data) { + bvm *vm = berry.vm; + if (nullptr == vm) { return false; } + bool handled = false; + if (be_getglobal(vm, "twai")) { // Look for class + if (be_getmember(vm, 1, "decode")) { // and function + be_pushvalue(vm, -2); + + uint32_t param = bus +1 | data_length_code << 4; + uint32_t ident = identifier; + uint32_t data1 = data[3] << 24 | data[2] << 16 | data[1] << 8 | data[0]; + uint32_t data2 = data[7] << 24 | data[6] << 16 | data[5] << 8 | data[4]; + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TWA: Bus%d pm %02X, id %08X, d1 %08X, d2 %08X"), bus +1, param, ident, data1, data2); + + be_pushint(vm, param); // Bus 1, 2 or 3 | data_length + be_pushint(vm, ident); + be_pushint(vm, data1); + be_pushint(vm, data2); + int32_t ret = be_pcall(vm, 5); // Number of arguments, self, bus, ident. data1, data2 + if (ret != 0) { + be_error_pop_all(vm); // Clear Berry stack + } + handled = true; + } + } + be_pop(vm, be_top(vm)); // Clean + return handled; +} + +/*********************************************************************************************/ + +bool TWAIBerryConfig(uint32_t bus) { + bvm *vm = berry.vm; + if (nullptr == vm) { return false; } + bool handled = false; + if (be_getglobal(vm, "twai")) { // Look for class + if (be_getmember(vm, 1, "config")) { // and function + be_pushvalue(vm, -2); + be_pushint(vm, bus +1); // Bus 1, 2 or 3 + int32_t ret = be_pcall(vm, 2); // Number of arguments, self, bus + if (ret != 0) { + be_error_pop_all(vm); // Clear Berry stack + } + be_pop(vm, 2); + if (be_isint(vm, -1)) { + uint32_t config = be_toint(vm, -1); + // 3322222222221111111111 + // 10987654321098765432109876543210 + // xxxxxxxxxxxxxxxxxxxxxxxxxxxxx111 = speed 0..7 + // xxxxxxxxxxxxxxxxxxxxxxxxxxx11xxx = mode 0..2 + // xxxxxxxxxxxxxxxxxxxxx111111xxxxx = rx_queue_len 0..63 + Twai[bus].speed = config & 0x7; // User input check 0..7 + uint32_t mode = config >> 3 & 0x3; + if (mode > 2) { mode = 2; } // User input check 0..2 + Twai[bus].mode = (twai_mode_t)mode; + uint32_t rx_queue_len = config >> 5 & 0x3f; + rx_queue_len++; // Rx queue len 1..64 + if (rx_queue_len < 8) { rx_queue_len = 8; } // User input check 8..64 + Twai[bus].rx_queue_len = rx_queue_len; + handled = true; + } + } + } + be_pop(vm, be_top(vm)); // Clean + return handled; +} + +#endif // USE_BERRY + +/*********************************************************************************************\ + * TWAI low level +\*********************************************************************************************/ + +bool TWAIStart(int tx, int rx, uint32_t bus = 0); +bool TWAIStart(int tx, int rx, uint32_t bus) { + twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)tx, (gpio_num_t)rx, Twai[bus].mode); + g_config.controller_id = bus; + g_config.rx_queue_len = Twai[bus].rx_queue_len; + + twai_timing_config_t t_config; + switch (Twai[bus].speed) { + case 0: + t_config = TWAI_TIMING_CONFIG_25KBITS(); + break; + case 1: + t_config = TWAI_TIMING_CONFIG_50KBITS(); + break; + case 2: + t_config = TWAI_TIMING_CONFIG_100KBITS(); + break; + case 3: + t_config = TWAI_TIMING_CONFIG_125KBITS(); + break; + case 4: + t_config = TWAI_TIMING_CONFIG_250KBITS(); + break; + case 5: + t_config = TWAI_TIMING_CONFIG_500KBITS(); + break; + case 6: + t_config = TWAI_TIMING_CONFIG_800KBITS(); + break; + case 7: + t_config = TWAI_TIMING_CONFIG_1MBITS(); + break; + default: + t_config = TWAI_TIMING_CONFIG_125KBITS(); + break; + } + + twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL(); + + if (twai_driver_install_v2(&g_config, &t_config, &f_config, &Twai[bus].bus) != ESP_OK) { + AddLog(LOG_LEVEL_DEBUG, PSTR("TWA: Bus%d Not installed"), bus +1); + return false; + } + if (twai_start_v2(Twai[bus].bus) != ESP_OK) { + AddLog(LOG_LEVEL_DEBUG, PSTR("TWA: Bus%d Not started"), bus +1); + return false; + } + // Reconfigure alerts to detect frame receive, Bus-Off error and RX queue full states + uint32_t alerts_to_enable = TWAI_ALERT_RX_DATA | TWAI_ALERT_RX_QUEUE_FULL | TWAI_ALERT_TX_IDLE | TWAI_ALERT_TX_SUCCESS | TWAI_ALERT_TX_FAILED | TWAI_ALERT_ERR_PASS | TWAI_ALERT_BUS_ERROR; + if (twai_reconfigure_alerts_v2(Twai[bus].bus, alerts_to_enable, NULL) != ESP_OK) { + AddLog(LOG_LEVEL_DEBUG, PSTR("TWA: Bus%d Failed to reconfigure CAN alerts"), bus +1); + return false; + } + + char smode[16]; + GetTextIndexed(smode, sizeof(smode), Twai[bus].mode, kTwaiModes); + char sspeed[16]; + GetTextIndexed(sspeed, sizeof(sspeed), Twai[bus].speed, kTwaiSpeeds); + AddLog(LOG_LEVEL_DEBUG, PSTR("TWA: Bus%d using GPIO%02d(Tx) and GPIO%02d(Rx) started in %s Mode and %sbit/s"), + bus +1, tx, rx, smode, sspeed); + + Twai[bus].installed = true; + return true; +} + +/*********************************************************************************************/ + +void TWAIStop(uint32_t bus) { + if (Twai[bus].installed) { + twai_stop_v2(Twai[bus].bus); + twai_driver_uninstall_v2(Twai[bus].bus); + Twai[bus].installed = false; + AddLog(LOG_LEVEL_DEBUG, PSTR("TWA: Bus%d stopped"), bus +1); + } +} + +/*********************************************************************************************/ + +uint32_t TWAICheckAlerts(uint32_t bus) { + uint32_t alerts_triggered; + twai_read_alerts_v2(Twai[bus].bus, &alerts_triggered, pdMS_TO_TICKS(TWAI_POLLING_RATE_MS)); + twai_status_info_t twaistatus; + twai_get_status_info_v2(Twai[bus].bus, &twaistatus); + + // Handle alerts + if (alerts_triggered & TWAI_ALERT_ERR_PASS) { + AddLog(LOG_LEVEL_DEBUG, PSTR("TWA: Bus%d Alert - Controller has become error passive"), bus +1); + } + if (alerts_triggered & TWAI_ALERT_BUS_ERROR) { + AddLog(LOG_LEVEL_DEBUG, PSTR("TWA: Bus%d Alert - A Bit, Stuff, CRC, Form or ACK error has occurred on the bus. Errors %d"), bus +1, twaistatus.bus_error_count); + } + if (alerts_triggered & TWAI_ALERT_RX_QUEUE_FULL) { + AddLog(LOG_LEVEL_DEBUG, PSTR("TWA: Bus%d Alert - RX queue is full causing a received frame to be lost. Buffered %d, Missed %d, Overrun %d"), + bus +1, twaistatus.msgs_to_rx, twaistatus.rx_missed_count, twaistatus.rx_overrun_count); + } + if (alerts_triggered & TWAI_ALERT_TX_FAILED) { + AddLog(LOG_LEVEL_DEBUG, PSTR("TWA: Bus%d Alert - Transmission failed. Buffered %d, Error %d, Failed %d"), + bus +1, twaistatus.msgs_to_tx, twaistatus.tx_error_counter, twaistatus.tx_failed_count); + } +// if (alerts_triggered & TWAI_ALERT_TX_SUCCESS) { +// AddLog(LOG_LEVEL_DEBUG, PSTR("TWA: Bus%d Transmission successful. Buffered %d"), bus +1, twaistatus.msgs_to_tx); +// } + + return alerts_triggered; +} + +/*********************************************************************************************/ + +void TWAIRead(uint32_t bus) { + uint32_t alerts_triggered = TWAICheckAlerts(bus); + // Check if message is received + if (alerts_triggered & TWAI_ALERT_RX_DATA) { + // One or more messages received. Handle all. + twai_message_t message; + while (twai_receive_v2(Twai[bus].bus, &message, 0) == ESP_OK) { + uint32_t identifier = message.identifier | message.extd << 31; // Add extended 29-bit flag +#ifdef USE_BERRY + if (TWAIBerryDecode(bus, identifier, message.data_length_code, message.data)) { continue; } +#endif // USE_BERRY + // Show log if no berry found (Messages come too fast for supporting MQTT at this time) + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TWA: Bus%d Id %08X, Rcvd '%*_H'"), + bus +1, identifier, message.data_length_code, message.data); + } + } +} + +/*********************************************************************************************\ + * Initialization +\*********************************************************************************************/ + +void TWAIInit(void) { + Twai_supported = false; + for (uint32_t bus = 0; bus < MAX_TWAI; bus++) { + if (PinUsed(GPIO_TWAI_TX, bus) && PinUsed(GPIO_TWAI_RX, bus)) { + Twai[bus].speed = TWAI_SPEED_100KBITS; + Twai[bus].mode = TWAI_MODE_NORMAL; // 0 = TWAI_MODE_NORMAL, 1 = TWAI_MODE_NO_ACK, 2 = TWAI_MODE_LISTEN_ONLY + Twai[bus].rx_queue_len = 8; +#ifdef USE_BERRY + TWAIBerryConfig(bus); +#endif // USE_BERRY + if (TWAIStart(Pin(GPIO_TWAI_TX, bus), Pin(GPIO_TWAI_RX, bus), bus)) { + Twai_supported = true; + } + } + } +} + +/*********************************************************************************************\ + * Commands +\*********************************************************************************************/ + +const char kTwaiCommands[] PROGMEM = "TWAI|" // Prefix + "Send"; + +void (* const TwaiCommand[])(void) PROGMEM = { + &CmndTWAISend }; + +void CmndTWAISend(void) { + // TwaiSend [[[[[[[[],],],],],],],] + // TwaiSend {"ID":,"DATA":[[[[[[[[],],],],],],],]]} + // An identifier with bit 32 set (0x80000000) is a 29-bit identifier + // TwaiSend1 0x481,0x03,0x1E,0xFF,0xFF,0xFF,0x01,0x21 + // TwaiSend1 {"ID":0x481,"DATA":[0x03,0x1E,0xFF,0xFF,0xFF,0x01,0x21]} + // TwaiSend2 {"ID":0x80000481,"DATA":[0x03,0x1E,0xFF,0xFF,0xFF,0x01,0x21]} + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_TWAI) && (XdrvMailbox.data_len > 0)) { + uint32_t bus = XdrvMailbox.index -1; + if (!Twai[bus].installed) { return; } + + uint32_t data[9] = { 0 }; // Accomodate identifier and 8 data bytes + uint32_t data_count = 0; + if (XdrvMailbox.data[0] == ('{')) { + // parse JSON + JsonParser parser(XdrvMailbox.data); + JsonParserObject root = parser.getRootObject(); + if (!root) { return; } // No valid JSON + + JsonParserToken val = root[PSTR("ID")]; + if (!val) { return; } // We need at least an identifier + + data[0] = val.getUInt(); + data_count = 1; + JsonParserArray arr = root[PSTR("DATA")]; + for (auto value : arr) { // All data is optional + data[data_count] = value.getUInt(); + data_count++; + if (9 == data_count) { + break; + } + } + } else { + // parse comma separated values + data_count = ParseParameters(9, data); + } + + twai_message_t message; + message.extd = (data[0] & 0x80000000) ? 1 : 0; // Standard (0) vs extended (1) format + message.rtr = 0, // Data (0) vs RTR (1) frame + message.ss = 0, // Whether the message is single shot (1) (i.e., does not repeat on error) + message.self = 0, // Whether the message is a self reception request (1) (loopback) + message.dlc_non_comp = 0, // DLC is less than 8 (0) + message.identifier = data[0] & 0x1FFFFFFF; // Message ID (11-bits or 29-bits) + message.data_length_code = data_count -1; // Payload length (0..8) + for (uint8_t i = 0; i < message.data_length_code; i++) { + message.data[i] = data[i +1]; // Payload + } + + twai_clear_receive_queue_v2(Twai[bus].bus); + //Queue message for transmission + if (twai_transmit_v2(Twai[bus].bus, &message, pdMS_TO_TICKS(TWAI_POLLING_RATE_MS)) == ESP_OK) { + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TWA: Bus%d Message queued for transmission"), bus +1); + } else { + AddLog(LOG_LEVEL_DEBUG, PSTR("TWA: Bus%d Alert - Failed to queue message for transmission"), bus +1); + } + ResponseCmndDone(); + } +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xdrv91(uint32_t function) { + bool result = false; + + if (FUNC_INIT == function) { + TWAIInit(); + } + else if (Twai_supported) { + switch (function) { + case FUNC_LOOP: + for (uint32_t bus = 0; bus < MAX_TWAI; bus++) { + if (Twai[bus].installed) { + TWAIRead(bus); + } + } + break; + case FUNC_COMMAND: + result = DecodeCommand(kTwaiCommands, TwaiCommand); + break; + } + } + return result; +} + +#endif // SOC_TWAI_SUPPORTED +#endif // USE_ESP32_TWAI +#endif // ESP32 \ No newline at end of file diff --git a/tasmota/tasmota_xdsp_display/xdsp_02_ssd1306.ino b/tasmota/tasmota_xdsp_display/xdsp_02_ssd1306.ino deleted file mode 100644 index c22a20d02..000000000 --- a/tasmota/tasmota_xdsp_display/xdsp_02_ssd1306.ino +++ /dev/null @@ -1,21 +0,0 @@ -/* - xdsp_02_ssd1306.ino - Display Oled SSD1306 support for Tasmota - - Copyright (C) 2021 Theo Arends and Adafruit - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -// REMOVED -// DEPRECATED - USE UNIVERSAL DISPLAY INSTEAD, https://tasmota.github.io/docs/Universal-Display-Driver/#migrating-to-udisplay diff --git a/tasmota/tasmota_xdsp_display/xdsp_04_ili9341.ino b/tasmota/tasmota_xdsp_display/xdsp_04_ili9341.ino deleted file mode 100644 index 4fbf36541..000000000 --- a/tasmota/tasmota_xdsp_display/xdsp_04_ili9341.ino +++ /dev/null @@ -1,21 +0,0 @@ -/* - xdsp_04_ILI9341.ino - Display ILI9341/2 support for Tasmota - - Copyright (C) 2021 Gerhard Mutz and Theo Arends - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -// REMOVED -// DEPRECATED - USE UNIVERSAL DISPLAY INSTEAD, https://tasmota.github.io/docs/Universal-Display-Driver/#migrating-to-udisplay diff --git a/tasmota/tasmota_xdsp_display/xdsp_07_sh1106.ino b/tasmota/tasmota_xdsp_display/xdsp_07_sh1106.ino deleted file mode 100644 index 68992a5ab..000000000 --- a/tasmota/tasmota_xdsp_display/xdsp_07_sh1106.ino +++ /dev/null @@ -1,21 +0,0 @@ -/* - xdsp_07_SH1106.ino - Display Oled SH1106 support for Tasmota - - Copyright (C) 2021 Theo Arends and Adafruit - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -// REMOVED -// DEPRECATED - USE UNIVERSAL DISPLAY INSTEAD, https://tasmota.github.io/docs/Universal-Display-Driver/#migrating-to-udisplay diff --git a/tasmota/tasmota_xdsp_display/xdsp_09_SSD1351.ino b/tasmota/tasmota_xdsp_display/xdsp_09_SSD1351.ino deleted file mode 100644 index 24ea1d13d..000000000 --- a/tasmota/tasmota_xdsp_display/xdsp_09_SSD1351.ino +++ /dev/null @@ -1,21 +0,0 @@ -/* - xdsp_09_SSD1351.ino - Display SSD1351 support for Tasmota - - Copyright (C) 2021 Gerhard Mutz and Theo Arends - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -// REMOVED -// DEPRECATED - USE UNIVERSAL DISPLAY INSTEAD, https://tasmota.github.io/docs/Universal-Display-Driver/#migrating-to-udisplay diff --git a/tasmota/tasmota_xdsp_display/xdsp_12_ST7789.ino b/tasmota/tasmota_xdsp_display/xdsp_12_ST7789.ino deleted file mode 100644 index c00c336c1..000000000 --- a/tasmota/tasmota_xdsp_display/xdsp_12_ST7789.ino +++ /dev/null @@ -1,21 +0,0 @@ -/* - xdsp_12_ST7789.ino - Display ST7789 support for Tasmota - - Copyright (C) 2021 Gerhard Mutz and Theo Arends - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -// REMOVED -// DEPRECATED - USE UNIVERSAL DISPLAY INSTEAD, https://tasmota.github.io/docs/Universal-Display-Driver/#migrating-to-udisplay diff --git a/tasmota/tasmota_xdsp_display/xdsp_13_tm1640.ino b/tasmota/tasmota_xdsp_display/xdsp_13_tm1640.ino index a4f0318e2..3a600bf49 100644 --- a/tasmota/tasmota_xdsp_display/xdsp_13_tm1640.ino +++ b/tasmota/tasmota_xdsp_display/xdsp_13_tm1640.ino @@ -99,6 +99,7 @@ enum tm1640_display_options_types { typedef struct Tm1640_t { int8_t clock_pin; int8_t data_pin; + uint8_t brightness; bool show_clock; bool clock_24; bool clock_seconds; @@ -177,12 +178,20 @@ void TM1640SetBrightness(uint8_t level) { // 6 | 5 | 12/16 // 7 | 6 | 13/16 // 8 | 7 | 14/16 - uint8_t cmd = TM1640_CMD_DISPLAY | (level > 0 ? 0x8 : 0) | ((level - 1) % 8); + if (level) { + Tm1640->brightness = (level -1) & 7; + } + uint8_t cmd = TM1640_CMD_DISPLAY | (level > 0 ? 0x8 : 0) | Tm1640->brightness; TM1640Start(); TM1640Send (cmd); TM1640Stop(); } +void TM1640SetPower(int8_t state) { + uint8_t level = (1 == state) ? Tm1640->brightness +1 : 0; + TM1640SetBrightness(level); +} + /*********************************************************************************************\ * Init function \*********************************************************************************************/ @@ -313,26 +322,9 @@ void IoTTimerDim(void) } -void IoTTimerDisplayOn (void) -{ - IoTTimerDim(); -} - - -void IoTTimerDisplayOff (void) -{ - TM1640SetBrightness (0); -} - - void IoTTimerDisplayOnOff(void) { - if (disp_power) { - IoTTimerDisplayOn(); - } - else { - IoTTimerDisplayOff(); - } + TM1640SetPower(disp_power); } diff --git a/tasmota/tasmota_xdsp_display/xdsp_14_SSD1331.ino b/tasmota/tasmota_xdsp_display/xdsp_14_SSD1331.ino deleted file mode 100644 index 2f6f88ced..000000000 --- a/tasmota/tasmota_xdsp_display/xdsp_14_SSD1331.ino +++ /dev/null @@ -1,21 +0,0 @@ -/* - xdsp_14_SSD1331.ino - Display SSD1331 support for Tasmota - - Copyright (C) 2021 Jeroen Vermeulen, Gerhard Mutz and Theo Arends - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -// REMOVED -// DEPRECATED - USE UNIVERSAL DISPLAY INSTEAD, https://tasmota.github.io/docs/Universal-Display-Driver/#migrating-to-udisplay diff --git a/tasmota/tasmota_xlgt_light/xlgt_01_ws2812_esp32.ino b/tasmota/tasmota_xlgt_light/xlgt_01_ws2812_esp32.ino index e3ad5aa54..c75e43ea4 100644 --- a/tasmota/tasmota_xlgt_light/xlgt_01_ws2812_esp32.ino +++ b/tasmota/tasmota_xlgt_light/xlgt_01_ws2812_esp32.ino @@ -44,10 +44,10 @@ const uint8_t WS2812_SCHEMES = 10; // Number of WS2812 schemes const char kWs2812Commands[] PROGMEM = "|" // No prefix - D_CMND_LED "|" D_CMND_PIXELS "|" D_CMND_ROTATION "|" D_CMND_WIDTH "|" D_CMND_STEPPIXELS ; + D_CMND_LED "|" D_CMND_PIXELS "|" D_CMND_ROTATION "|" D_CMND_WIDTH "|" D_CMND_STEPPIXELS "|" D_CMND_PIXELTYPE ; void (* const Ws2812Command[])(void) PROGMEM = { - &CmndLed, &CmndPixels, &CmndRotation, &CmndWidth, &CmndStepPixels }; + &CmndLed, &CmndPixels, &CmndRotation, &CmndWidth, &CmndStepPixels, &CmndPixelType }; #include @@ -610,6 +610,17 @@ void Ws2812ShowScheme(void) } } +// convert the Settings to a Led type compatible with TasmotaLED +uint16_t Ws2812SettingsToLedType(void) { + uint16_t led_type = kTasLed_Type; // default value from compile options + if (Settings->mbflag2.light_pixels_order != 0) { + led_type = (led_type & 0xFF00) | (Settings->mbflag2.light_pixels_order << 4) + | (Settings->mbflag2.light_pixels_w_first ? TasmotaLed_Wxxx : 0) + | (Settings->mbflag2.light_pixels_rgbw ? TasmotaLed_4_WRGB : TasmotaLed_3_RGB); + } + return led_type; +} + bool Ws2812InitStrip(void) { if (strip != nullptr) { @@ -623,7 +634,8 @@ bool Ws2812InitStrip(void) AddLog(LOG_LEVEL_ERROR, "LED: No hardware supported"); return false; } - strip = new TasmotaLED(kTasLed_Type, Settings->light_pixels); + uint16_t led_type = Ws2812SettingsToLedType(); + strip = new TasmotaLED(led_type, Settings->light_pixels); strip->SetPusher(pusher); strip->Begin(); @@ -633,6 +645,31 @@ bool Ws2812InitStrip(void) return false; } +bool Ws2812ChangePixelCount(void) +{ + if (strip == nullptr) { + return true; + } + strip->SetPixelCount(Settings->light_pixels); + Ws2812Clear(); + return true; +} + +bool Ws2812ChangePixelType(bool clear) +{ + if (strip == nullptr) { + return true; + } + uint16_t led_type = Ws2812SettingsToLedType(); + strip->SetPixelSubType(led_type & 0xFF); // just submit the lower part + if (clear) { + Ws2812Clear(); + } else { + Ws2812LibStripShow(); + } + return true; +} + void Ws2812ModuleSelected(void) { if (Ws2812InitStrip()) { @@ -682,6 +719,14 @@ bool Ws2812CanShow(void) { return false; } +void Ws2812CanShowWait(void) { + if (strip) { + while (!strip->CanShow()) { + yield(); + } + } +} + bool Ws2812IsDirty(void) { if (strip) { return strip->IsDirty(); } return false; @@ -773,19 +818,53 @@ void CmndLed(void) void CmndPixels(void) { - if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= WS2812_MAX_LEDS)) { -/* - Settings->light_pixels = XdrvMailbox.payload; - Settings->light_rotation = 0; - Ws2812ReinitStrip(); -- does not work with latest NeoPixelBus driver - Light.update = true; -*/ - Ws2812Clear(); // Clear all known pixels - Settings->light_pixels = XdrvMailbox.payload; - Settings->light_rotation = 0; - TasmotaGlobal.restart_flag = 2; // reboot instead + uint32_t parm[4] = { Settings->light_pixels, 0 /* reverse = 0 */, + 0 /* height = 1 (minus 1) */, 0 /* alternate = 0 */ }; + if (ParseParameters(4, parm) > 0) { + if ((parm[0] > 0) && (parm[0] <= WS2812_MAX_LEDS)) { + Ws2812Clear(); // Clear all known pixels + Ws2812CanShowWait(); + Settings->light_pixels = parm[0]; + Settings->light_pixels_reverse = parm[1]; + Settings->light_pixels_height_1 = (parm[2] > 0) ? parm[2] - 1 : 0; + Settings->light_pixels_alternate = parm[3]; + Ws2812ChangePixelCount(); + Light.update = true; + } } - ResponseCmndNumber(Settings->light_pixels); + Response_P(PSTR("{\"Pixels\":%i,\"PixelsReverse\":%i,\"PixelsHeight\":%i,\"PixelsAlternate\":%i}"), + Settings->light_pixels, Settings->light_pixels_reverse, Settings->light_pixels_height_1 + 1, Settings->light_pixels_alternate); +} + +void CmndPixelType(void) +{ + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 32)) { + // Value is: + // 0 = use compile-time option (default value) + // 1..6 = Pixel Order: 1=GRB 2=RGB 3=RBG 4=BRG 5=BGR 6=GBR + // Modifiers: + // +8 = 4 channels RGBW strip - default is 3 channels RGB + // +16 = W channel is sent first - default W channel is sent last + uint32_t pixels_order = XdrvMailbox.payload & 0x07; + uint32_t pixels_w_first = (XdrvMailbox.payload & 0x08) ? 1 : 0; + uint32_t pixels_rgbw = (XdrvMailbox.payload & 0x10) ? 1 : 0; + // changing number of channels requires a reboot + bool reboot = pixels_rgbw != Settings->mbflag2.light_pixels_rgbw; + if (reboot) { + TasmotaGlobal.restart_flag = 2; // force restart if number of channels changed + } + + Settings->mbflag2.light_pixels_order = pixels_order; + Settings->mbflag2.light_pixels_w_first = pixels_w_first; + Settings->mbflag2.light_pixels_rgbw = (XdrvMailbox.payload & 0x10) ? 1 : 0; + Ws2812ChangePixelType(reboot); + } + uint32_t pixel_type = 0; + if (Settings->mbflag2.light_pixels_order != 0) { + pixel_type = Settings->mbflag2.light_pixels_order | (Settings->mbflag2.light_pixels_w_first ? 0x08 : 0) + | (Settings->mbflag2.light_pixels_rgbw ? 0x10 : 0); + } + ResponseCmndNumber(pixel_type); } void CmndStepPixels(void) diff --git a/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino b/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino index bcd9c358f..89a2cfe1d 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino @@ -214,7 +214,6 @@ struct { struct { float *mq_samples; - float temperature; float current; float energy; int param[4]; @@ -581,6 +580,35 @@ void AdcEvery250ms(void) { } } +float AdcGetTemperature(uint32_t channel) { + int adc = AdcRead(Adc[channel].pin, 2); + int param0 = Adc[channel].param[0]; + int param1 = Adc[channel].param[1]; + int param2 = Adc[channel].param[2]; + int param3 = Adc[channel].param[3]; + // Steinhart-Hart equation for thermistor as temperature sensor: + // float Rt = (adc * Adc[channel].param[0] * MAX_ADC_V) / (ANALOG_RANGE * ANALOG_V33 - (float)adc * MAX_ADC_V); + // MAX_ADC_V in ESP8266 is 1 + // MAX_ADC_V in ESP32 is 3.3 + float Rt; +#ifdef ESP8266 + if (param3) { // Alternate mode + Rt = (float)param0 * (ANALOG_RANGE * ANALOG_V33 - (float)adc) / (float)adc; + } else { + Rt = (float)param0 * (float)adc / (ANALOG_RANGE * ANALOG_V33 - (float)adc); + } +#else + if (param3) { // Alternate mode + Rt = (float)param0 * (ANALOG_RANGE - (float)adc) / (float)adc; + } else { + Rt = (float)param0 * (float)adc / (ANALOG_RANGE - (float)adc); + } +#endif + float BC = (float)param2; // Shelly param3 = 3350 (ANALOG_NTC_B_COEFFICIENT) + float T = BC / (BC / ANALOG_T0 + TaylorLog(Rt / (float)param1)); // Shelly param2 = 10000 (ANALOG_NTC_RESISTANCE) + return ConvertTemp(TO_CELSIUS(T)); +} + uint8_t AdcGetButton(uint32_t pin) { for (uint32_t channel = 0; channel < Adcs.present; channel++) { if (Adc[channel].pin == pin) { @@ -676,8 +704,18 @@ float AdcGetRange(uint32_t channel) { // formula for calibration: value, fromLow, fromHigh, toLow, toHigh // Example: 514, 632, 236, 0, 100 // int( (( - ) / ( - ) ) * ( - ) ) + ) +/* + uint32_t factor = Adc[channel].param[0] / 100000; // AdcGpio0 201100,1520,38,26 = factor 2 + if ((0 == factor) || (factor > 6)) { factor = 5; } + int adc = AdcRead(Adc[channel].pin, factor); + int param0 = Adc[channel].param[0] % 100000; // Param0 = 1100 + float adcrange = ( ((float)Adc[channel].param[1] - (float)adc) / ( ((float)Adc[channel].param[1] - (float)param0)) * ((float)Adc[channel].param[2] - (float)Adc[channel].param[3]) + (float)Adc[channel].param[3] ); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("DBG: ADC%d, Factor %d, AdcRead %d, Range %4_f"), channel +1, factor, adc, &adcrange); +*/ int adc = AdcRead(Adc[channel].pin, 5); float adcrange = ( ((float)Adc[channel].param[1] - (float)adc) / ( ((float)Adc[channel].param[1] - (float)Adc[channel].param[0])) * ((float)Adc[channel].param[2] - (float)Adc[channel].param[3]) + (float)Adc[channel].param[3] ); +// AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("DBG: ADC%d, AdcRead %d, Range %4_f"), channel +1, adc, &adcrange); + return adcrange; } @@ -725,42 +763,15 @@ void AdcGetCurrentPower(uint32_t channel, uint32_t factor) { void AdcEverySecond(void) { for (uint32_t channel = 0; channel < Adcs.present; channel++) { - uint32_t type_index = Adc[channel].index; uint32_t adc_type = Adc[channel].type; - int param0 = Adc[channel].param[0]; - int param1 = Adc[channel].param[1]; - int param2 = Adc[channel].param[2]; - int param3 = Adc[channel].param[3]; - if (GPIO_ADC_TEMP == adc_type) { - int adc = AdcRead(Adc[channel].pin, 2); - // Steinhart-Hart equation for thermistor as temperature sensor: - // float Rt = (adc * Adc[channel].param[0] * MAX_ADC_V) / (ANALOG_RANGE * ANALOG_V33 - (float)adc * MAX_ADC_V); - // MAX_ADC_V in ESP8266 is 1 - // MAX_ADC_V in ESP32 is 3.3 - float Rt; -#ifdef ESP8266 - if (param3) { // Alternate mode - Rt = (float)param0 * (ANALOG_RANGE * ANALOG_V33 - (float)adc) / (float)adc; - } else { - Rt = (float)param0 * (float)adc / (ANALOG_RANGE * ANALOG_V33 - (float)adc); - } -#else - if (param3) { // Alternate mode - Rt = (float)param0 * (ANALOG_RANGE - (float)adc) / (float)adc; - } else { - Rt = (float)param0 * (float)adc / (ANALOG_RANGE - (float)adc); - } -#endif - float BC = (float)param2; // Shelly param3 = 3350 (ANALOG_NTC_B_COEFFICIENT) - float T = BC / (BC / ANALOG_T0 + TaylorLog(Rt / (float)param1)); // Shelly param2 = 10000 (ANALOG_NTC_RESISTANCE) - Adc[channel].temperature = ConvertTemp(TO_CELSIUS(T)); - } - else if (GPIO_ADC_CT_POWER == adc_type) { - AdcGetCurrentPower(channel, 5); - } - else if (GPIO_ADC_MQ == adc_type) { - AddSampleMq(channel); - AdcGetMq(channel); + switch (adc_type) { + case GPIO_ADC_CT_POWER: + AdcGetCurrentPower(channel, 5); + break; + case GPIO_ADC_MQ: + AddSampleMq(channel); + AdcGetMq(channel); + break; } } } @@ -815,23 +826,25 @@ void AdcShow(bool json) { break; } case GPIO_ADC_TEMP: { + float temperature = AdcGetTemperature(channel); if (json) { AdcShowContinuation(&jsonflg); - ResponseAppend_P(PSTR("\"" D_JSON_TEMPERATURE "%s\":%*_f"), adc_channel, Settings->flag2.temperature_resolution, &Adc[channel].temperature); + ResponseAppend_P(PSTR("\"" D_JSON_TEMPERATURE "%s\":%*_f"), adc_channel, Settings->flag2.temperature_resolution, &temperature); if ((0 == TasmotaGlobal.tele_period) && (!domo_flag[ADC_TEMP])) { #ifdef USE_DOMOTICZ - DomoticzFloatSensor(DZ_TEMP, Adc[channel].temperature); + DomoticzFloatSensor(DZ_TEMP, temperature); domo_flag[ADC_TEMP] = true; #endif // USE_DOMOTICZ #ifdef USE_KNX - KnxSensor(KNX_TEMPERATURE, Adc[channel].temperature); + KnxSensor(KNX_TEMPERATURE, temperature); #endif // USE_KNX } #ifdef USE_WEBSERVER } else { - WSContentSend_Temp(adc_name, Adc[channel].temperature); + WSContentSend_Temp(adc_name, temperature); #endif // USE_WEBSERVER } + break; } case GPIO_ADC_LIGHT: { @@ -1055,8 +1068,8 @@ void CmndAdcParam(void) { if ((GPIO_ADC_INPUT == adc_type) || (GPIO_ADC_TEMP == adc_type) || (GPIO_ADC_RANGE == adc_type)) { - Adc[channel].param[2] = abs(strtol(ArgV(argument, 4), nullptr, 10)); // param3 = abs(int) - Adc[channel].param[3] = abs(strtol(ArgV(argument, 5), nullptr, 10)); // param4 = abs(int) + Adc[channel].param[2] = strtol(ArgV(argument, 4), nullptr, 10); // param3 = int + Adc[channel].param[3] = strtol(ArgV(argument, 5), nullptr, 10); // param4 = int } else { Adc[channel].param[2] = (int)(CharToFloat(ArgV(argument, 4)) * 10000); // param3 = float if (ArgC() > 4) { @@ -1068,7 +1081,7 @@ void CmndAdcParam(void) { if (GPIO_ADC_PH == adc_type) { float phLow = CharToFloat(ArgV(argument, 2)); Adc[channel].param[0] = phLow * ANALOG_PH_DECIMAL_MULTIPLIER; // param1 = float -// Adc[channel].param[1] = strtol(ArgV(argument, 3), nullptr, 10); // param2 = int +// Adc[channel].param[1] = strtol(ArgV(argument, 3), nullptr, 10); // param2 = int float phHigh = CharToFloat(ArgV(argument, 4)); Adc[channel].param[2] = phHigh * ANALOG_PH_DECIMAL_MULTIPLIER; // param3 = float Adc[channel].param[3] = strtol(ArgV(argument, 5), nullptr, 10); // param4 = int @@ -1084,9 +1097,9 @@ void CmndAdcParam(void) { } } if (GPIO_ADC_MQ == adc_type) { - float a = CharToFloat(ArgV(argument, 3)); // param2 = float - float b = CharToFloat(ArgV(argument, 4)); // param3 = float - float ratioMQCleanAir = CharToFloat(ArgV(argument, 5)); // param4 = float + float a = CharToFloat(ArgV(argument, 3)); // param2 = float + float b = CharToFloat(ArgV(argument, 4)); // param3 = float + float ratioMQCleanAir = CharToFloat(ArgV(argument, 5)); // param4 = float if ((0 == a) && (0 == b) && (0 == ratioMQCleanAir)) { if (2 == Adc[channel].param[0]) { // param1 = int a = 574.25; @@ -1115,7 +1128,7 @@ void CmndAdcParam(void) { // AddLog(LOG_LEVEL_INFO, PSTR("ADC: MQ reset mq%d, a = %2_f, b = %2_f, ratioMQCleanAir = %2_f"), Adc[channel].param[0], &a, &b, &ratioMQCleanAir); } - } else { // Set default values based on current adc type + } else { // Set default values based on current adc type // AdcParam 1 AdcInitParams(channel); } @@ -1124,7 +1137,7 @@ void CmndAdcParam(void) { // AdcParam / AdcGpio AdcGetSettings(channel); - Response_P(PSTR("{\"%s"), XdrvMailbox.command); // {"AdcParam or {"AdcGpio + Response_P(PSTR("{\"%s"), XdrvMailbox.command); // {"AdcParam or {"AdcGpio if (strstr_P(XdrvMailbox.command, PSTR(D_CMND_ADCGPIO))) { #ifdef ESP8266 ResponseAppend_P(PSTR("\":[")); @@ -1139,18 +1152,18 @@ void CmndAdcParam(void) { (GPIO_ADC_TEMP == adc_type) || (GPIO_ADC_RANGE == adc_type) || (GPIO_ADC_MQ == adc_type)) { - ResponseAppend_P(PSTR(",%d,%d"), Adc[channel].param[2], Adc[channel].param[3]); // param3 = int, param4 = int + ResponseAppend_P(PSTR(",%d,%d"), Adc[channel].param[2], Adc[channel].param[3]); // param3 = int, param4 = int } else { float param = (float)Adc[channel].param[2] / 10000; - ResponseAppend_P(PSTR(",%*_f"), Decimals(Adc[channel].param[2]), ¶m); // param3 = float + ResponseAppend_P(PSTR(",%*_f"), Decimals(Adc[channel].param[2]), ¶m); // param3 = float if ((GPIO_ADC_CT_POWER == adc_type) || (GPIO_ADC_VOLTAGE == adc_type) || (GPIO_ADC_CURRENT == adc_type)) { param = (float)Adc[channel].param[3] / 10000; - ResponseAppend_P(PSTR(",%*_f"), Decimals(Adc[channel].param[3]), ¶m); // param4 = float + ResponseAppend_P(PSTR(",%*_f"), Decimals(Adc[channel].param[3]), ¶m); // param4 = float } else { - ResponseAppend_P(PSTR(",%d"), Adc[channel].param[3]); // param4 = int + ResponseAppend_P(PSTR(",%d"), Adc[channel].param[3]); // param4 = int } } ResponseAppend_P(PSTR("]}")); diff --git a/tasmota/tasmota_xsns_sensor/xsns_117_c8_co2_5k.ino b/tasmota/tasmota_xsns_sensor/xsns_117_c8_co2_5k.ino new file mode 100644 index 000000000..eb8cd6c97 --- /dev/null +++ b/tasmota/tasmota_xsns_sensor/xsns_117_c8_co2_5k.ino @@ -0,0 +1,153 @@ +/* + xsns_117_c8_co2_5k.ino - SC8-CO2-5K CO2 sensor support for Tasmota + + Copyright (C) 2025 Jeroen Vermeulen + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifdef USE_C8_CO2_5K +/*********************************************************************************************\ + * SC8-CO2-5K - CO2 sensor + * + * Inspired by: + * https://community.openenergymonitor.org/uploads/short-url/tDiJ3EWtv7OlcHZnNgX3dFv8Cpv.pdf + * https://spezifisch.codeberg.page/posts/2022-08-23/co2-sensor-reverse-engineering/ + * https://github.com/Jaron0211/C8_master + \********************************************************************************************/ + +#define XSNS_117 117 + +#include + +#ifndef CO2_LOW +#define CO2_LOW 800 // Below this CO2 value show green light +#endif +#ifndef CO2_HIGH +#define CO2_HIGH 1200 // Above this CO2 value show red light +#endif + +#define C8CO2_READ_TIMEOUT 400 +const char c8cp2_type[] = "C8-CO2-5K"; + +static uint8_t c8co2_buffer[16] = {0}; +TasmotaSerial *c8co2_serial = nullptr; +uint16_t c8co2_ppm = 0; + +void C8CO2_Init() +{ + if (PinUsed(GPIO_C8_CO2_5K_RX)) + { + int txPin = PinUsed(GPIO_C8_CO2_5K_TX) ? Pin(GPIO_C8_CO2_5K_TX) : -1; + c8co2_serial = new TasmotaSerial(Pin(GPIO_C8_CO2_5K_RX), txPin, 1); + if (c8co2_serial->begin(9600)) + { + if (c8co2_serial->hardwareSerial()) + ClaimSerial(); +#ifdef ESP32 + AddLog(LOG_LEVEL_DEBUG, PSTR("C8-CO2-5K: Serial UART%d"), c8co2_serial->getUart()); +#endif + } + AddLog(LOG_LEVEL_DEBUG, PSTR("C8-CO2-5K: Sensor serial ready")); + } +} + +void C8CO2_EverySecond() +{ + unsigned long start = millis(); + while ((millis() - start) < C8CO2_READ_TIMEOUT && c8co2_serial->available() > 0) + { + c8co2_buffer[0] = c8co2_buffer[1]; + c8co2_buffer[1] = c8co2_serial->read(); + + if (c8co2_buffer[0] != 0x42 || c8co2_buffer[1] != 0x4D) // Check for header bytes + continue; + + if (c8co2_serial->readBytes(&c8co2_buffer[2], 14) != 14) + { + AddLog(LOG_LEVEL_INFO, PSTR("C8-CO2-5K: ERROR Incomplete data received")); + return; + } + + uint8_t sum = 0; + for (int i = 0; i < 15; i++) + { + sum += c8co2_buffer[i]; + } + if (sum != c8co2_buffer[15]) + { + AddLog(LOG_LEVEL_INFO, PSTR("C8-CO2-5K: ERROR Checksum mismatch")); + return; + } + + c8co2_ppm = (c8co2_buffer[6] << 8) | c8co2_buffer[7]; + AddLog(LOG_LEVEL_DEBUG, PSTR("C8-CO2-5K Sensor: %d ppm"), c8co2_ppm); +#ifdef USE_LIGHT + LightSetSignal(CO2_LOW, CO2_HIGH, c8co2_ppm); +#endif // USE_LIGHT + return; + } +} + +void C8CO2_Show(bool json) +{ + if (json) + { + ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_CO2 "\":%d}"), c8cp2_type, c8co2_ppm); +#ifdef USE_DOMOTICZ + if (0 == TasmotaGlobal.tele_period) + { + DomoticzSensor(DZ_AIRQUALITY, c8co2_ppm); + } +#endif // USE_DOMOTICZ +#ifdef USE_WEBSERVER + } + else + { + WSContentSend_PD(HTTP_SNS_CO2, c8cp2_type, c8co2_ppm); +#endif // USE_WEBSERVER + } +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns117(uint32_t function) +{ + if (FUNC_INIT == function) + { + C8CO2_Init(); + } + else if (c8co2_serial) + { + switch (function) + { + case FUNC_EVERY_SECOND: + C8CO2_EverySecond(); + break; + case FUNC_JSON_APPEND: + C8CO2_Show(1); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + C8CO2_Show(0); + break; +#endif // USE_WEBSERVER + } + } + return false; +} + +#endif // USE_C8_CO2_5K diff --git a/tasmota/tasmota_xsns_sensor/xsns_17_senseair.ino b/tasmota/tasmota_xsns_sensor/xsns_17_senseair.ino index a2a20196c..804c4d929 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_17_senseair.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_17_senseair.ino @@ -19,18 +19,48 @@ #ifdef USE_SENSEAIR /*********************************************************************************************\ - * SenseAir K30, K70 and S8 - CO2 sensor + * SenseAir K30, K70, S8 and S88 - CO2 sensor * * Adapted from EspEasy plugin P052 by Mikael Trieb (mikael__AT__triebconsulting.se) * * Hardware Serial will be selected if GPIO1 = [SAir Rx] and GPIO3 = [SAir Tx] \*********************************************************************************************/ +/*********************************************************************************************\ + * aSENSE tSENSE K30 S8 S88 + * IR1 MeterStatus MeterStatus MeterStatus MeterStatus MeterStatus + * IR4 Space CO2 Space CO2 Space CO2 Space CO2 Space CO2 + * IR5 Space Temp Space Temp - - Space Temp + * IR6 - RH - - - + * IR25 - - - - ETC Low + * IR27 - - - Type Id Low Type Id Low + * +\*********************************************************************************************/ + #define XSNS_17 17 #define SENSEAIR_MODBUS_SPEED 9600 -#define SENSEAIR_DEVICE_ADDRESS 0xFE // Any address -#define SENSEAIR_READ_REGISTER 0x04 // Command Read +#define SENSEAIR_BROADCAST_ADDRESS 0xFE + +#define COMMAND_READ_INPUT_REGISTER 0x04 + +#define IR_METER_STATUS 0 +#define IR_SPACE_CO2 3 +#define IR_SPACE_TEMP 4 // Not valid for S8 sensors +#define IR_SPACE_HUMIDITY 5 // Only valid for Kx0 sensors +#define IR_TEMP_ADJUSTMENT 10 +#define IR_SENSOR_ETC_LOW 24 +#define IR_SENSOR_ETC_HIGH 25 +#define IR_SENSOR_TYPE_ID_LOW 26 +#define IR_SENSOR_TYPE_ID_HIGH 27 +#define IR_RELAY_STATE 28 + +#define SENSOR_TYPE_INIT 0 +#define SENSOR_TYPE_UNKNOWN 1 +#define SENSOR_TYPE_NONE 2 +#define SENSOR_TYPE_KX0 3 +#define SENSOR_TYPE_S8 4 +#define SENSOR_TYPE_S88 5 #ifndef CO2_LOW #define CO2_LOW 800 // Below this CO2 value show green light @@ -42,117 +72,172 @@ #include TasmotaModbus *SenseairModbus; -const char kSenseairTypes[] PROGMEM = "Kx0|S8"; +const char kSenseairTypes[] PROGMEM = "Kx0|S8|S88"; -uint8_t senseair_type = 1; -char senseair_types[7]; +uint8_t senseair_type = SENSOR_TYPE_INIT; +char senseair_types[4]; uint16_t senseair_co2 = 0; float senseair_temperature = 0; float senseair_humidity = 0; -//uint8_t senseair_state = 0; +const uint8_t input_registers[] = { + IR_SENSOR_ETC_LOW, + IR_SENSOR_TYPE_ID_LOW, + IR_METER_STATUS, + IR_SPACE_CO2, + IR_SPACE_TEMP, + IR_SPACE_HUMIDITY, +}; -const uint8_t start_addresses[] { 0x1A, 0x00, 0x03, 0x04, 0x05, 0x1C, 0x0A }; +#define INPUT_REGISTERS_LOOP_START 2 +#define INPUT_REGISTERS_LOOP_END_KX0 (sizeof input_registers / sizeof *input_registers) +#define INPUT_REGISTERS_LOOP_END_S88 (INPUT_REGISTERS_LOOP_END_KX0 - 1) +#define INPUT_REGISTERS_LOOP_END_S8 (INPUT_REGISTERS_LOOP_END_KX0 - 2) uint8_t senseair_read_state = 0; uint8_t senseair_send_retry = 0; -void Senseair250ms(void) // Every 250 mSec +void Senseair250ms(void) { -// senseair_state++; -// if (6 == senseair_state) { // Every 300 mSec -// senseair_state = 0; + if (senseair_type == SENSOR_TYPE_INIT || senseair_type == SENSOR_TYPE_NONE) { + return; + } + bool data_ready = SenseairModbus->ReceiveReady(); + + if (data_ready) { uint16_t value = 0; - bool data_ready = SenseairModbus->ReceiveReady(); - if (data_ready) { - uint8_t error = SenseairModbus->Receive16BitRegister(&value); - if (error) { - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "SenseAir read register %02X gave response error %d"), (uint16_t)start_addresses[senseair_read_state], error); - } else { - switch(senseair_read_state) { - case 0: // 0x1A (26) READ_TYPE_LOW - S8: fe 04 02 01 77 ec 92 - senseair_type = 2; - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "SenseAir type id low %04X"), value); - break; - case 1: // 0x00 (0) READ_ERRORLOG - fe 04 02 00 00 ad 24 - if (value) { - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "SenseAir error %04X"), value); + // Read register. + uint8_t error = SenseairModbus->Receive16BitRegister(&value); + + if (senseair_type == SENSOR_TYPE_UNKNOWN) { + // Try to determine sensor model. + switch (input_registers[senseair_read_state]) { + case IR_SENSOR_ETC_LOW: + if (error == 0) { + senseair_type = SENSOR_TYPE_S88; } break; - case 2: // 0x03 (3) READ_CO2 - fe 04 02 06 2c af 59 - senseair_co2 = value; -#ifdef USE_LIGHT - LightSetSignal(CO2_LOW, CO2_HIGH, senseair_co2); -#endif // USE_LIGHT - break; - case 3: // 0x04 (4) READ_TEMPERATURE - S8: fe 84 02 f2 f1 - Illegal Data Address - senseair_temperature = ConvertTemp((float)value / 100); - break; - case 4: // 0x05 (5) READ_HUMIDITY - S8: fe 84 02 f2 f1 - Illegal Data Address - senseair_humidity = ConvertHumidity((float)value / 100); - break; - case 5: // 0x1C (28) READ_RELAY_STATE - S8: fe 04 02 01 54 ad 4b - firmware version - { - bool relay_state = value >> 8 & 1; - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "SenseAir relay state %d"), relay_state); - break; + case IR_SENSOR_TYPE_ID_LOW: + switch (error) { + case 0: + senseair_type = SENSOR_TYPE_S8; + break; + case 2: // Illegal Data Address + senseair_type = SENSOR_TYPE_KX0; + break; } - case 6: // 0x0A (10) READ_TEMP_ADJUSTMENT - S8: fe 84 02 f2 f1 - Illegal Data Address - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "SenseAir temp adjustment %d"), value); - break; - } - - senseair_read_state++; - if (2 == senseair_type) { // S8 - if (3 == senseair_read_state) { - senseair_read_state = 1; - } - } else { // K30, K70 - if (sizeof(start_addresses) == senseair_read_state) { - senseair_read_state = 1; - } - } + break; + } + if (senseair_type != SENSOR_TYPE_UNKNOWN) { + GetTextIndexed(senseair_types, sizeof(senseair_types), senseair_type - SENSOR_TYPE_KX0, kSenseairTypes); + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_SENSEAIR "%s detected"), senseair_types); } } - if (0 == senseair_send_retry || data_ready) { - senseair_send_retry = 5; - SenseairModbus->Send(SENSEAIR_DEVICE_ADDRESS, SENSEAIR_READ_REGISTER, (uint16_t)start_addresses[senseair_read_state], 1); + if (error) { + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_SENSEAIR "Reg %d error %d"), input_registers[senseair_read_state], error); } else { - senseair_send_retry--; + // Process register contents. + switch(input_registers[senseair_read_state]) { + case IR_METER_STATUS: + switch (senseair_type) { + case SENSOR_TYPE_S8: value &= 0x7f; break; + case SENSOR_TYPE_S88: value &= 0xff; break; + } + if (value) { + // Out of range or Warm Up is expected after power on + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_SENSEAIR "Meter status 0x%04X"), value); + } + break; + case IR_SPACE_CO2: + senseair_co2 = value; +#ifdef USE_LIGHT + LightSetSignal(CO2_LOW, CO2_HIGH, senseair_co2); +#endif // USE_LIGHT + break; + case IR_SPACE_TEMP: + senseair_temperature = ConvertTemp((float)value / 100); + break; + case IR_SPACE_HUMIDITY: + senseair_humidity = ConvertHumidity((float)value / 100); + break; + } } -// } + // Find the next register to be read. + senseair_read_state++; + uint8_t input_registers_loop_end; + switch (senseair_type) { + case SENSOR_TYPE_KX0: + input_registers_loop_end = INPUT_REGISTERS_LOOP_END_KX0; + break; + case SENSOR_TYPE_S8: + input_registers_loop_end = INPUT_REGISTERS_LOOP_END_S8; + break; + case SENSOR_TYPE_S88: + input_registers_loop_end = INPUT_REGISTERS_LOOP_END_S88; + break; + } + if (senseair_read_state == input_registers_loop_end) { + if (senseair_type == SENSOR_TYPE_UNKNOWN) { + senseair_read_state = 0; + } else { + senseair_read_state = INPUT_REGISTERS_LOOP_START; + } + } + } + + if (0 == senseair_send_retry || data_ready) { + // Send the command (again). + senseair_send_retry = 5; + SenseairModbus->Send(SENSEAIR_BROADCAST_ADDRESS, COMMAND_READ_INPUT_REGISTER, input_registers[senseair_read_state], 1); + } else { + senseair_send_retry--; + } } /*********************************************************************************************/ void SenseairInit(void) { - senseair_type = 0; + if (senseair_type != SENSOR_TYPE_INIT) { + return; + } + + senseair_type = SENSOR_TYPE_NONE; if (PinUsed(GPIO_SAIR_RX) && PinUsed(GPIO_SAIR_TX)) { SenseairModbus = new TasmotaModbus(Pin(GPIO_SAIR_RX), Pin(GPIO_SAIR_TX)); uint8_t result = SenseairModbus->Begin(SENSEAIR_MODBUS_SPEED); if (result) { - if (2 == result) { ClaimSerial(); } - senseair_type = 1; + if (result == 2) { + // We have hardware serial, so claim it + ClaimSerial(); + } + senseair_type = SENSOR_TYPE_UNKNOWN; } } } -void SenseairShow(bool json) +void SenseairShow(uint32_t function) { - GetTextIndexed(senseair_types, sizeof(senseair_types), senseair_type -1, kSenseairTypes); + if (senseair_type < SENSOR_TYPE_KX0) { + return; + } - if (json) { + if (function == FUNC_JSON_APPEND) { ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_CO2 "\":%d"), senseair_types, senseair_co2); - if (senseair_type != 2) { - ResponseAppend_P(PSTR(",")); - ResponseAppendTHD(senseair_temperature, senseair_humidity); - } + switch (senseair_type) { + case SENSOR_TYPE_S88: + ResponseAppend_P(PSTR(",\"" D_JSON_TEMPERATURE "\":%1_f"), &senseair_temperature); + break; + case SENSOR_TYPE_KX0: + ResponseAppend_P(PSTR(",")); + ResponseAppendTHD(senseair_temperature, senseair_humidity); + break; + } ResponseJsonEnd(); #ifdef USE_DOMOTICZ if (0 == TasmotaGlobal.tele_period) { @@ -162,8 +247,13 @@ void SenseairShow(bool json) #ifdef USE_WEBSERVER } else { WSContentSend_PD(HTTP_SNS_CO2, senseair_types, senseair_co2); - if (senseair_type != 2) { - WSContentSend_THD(senseair_types, senseair_temperature, senseair_humidity); + switch (senseair_type) { + case SENSOR_TYPE_S88: + WSContentSend_Temp(senseair_types, senseair_temperature); + break; + case SENSOR_TYPE_KX0: + WSContentSend_THD(senseair_types, senseair_temperature, senseair_humidity); + break; } #endif // USE_WEBSERVER } @@ -175,27 +265,21 @@ void SenseairShow(bool json) bool Xsns17(uint32_t function) { - bool result = false; - - if (senseair_type) { - switch (function) { - case FUNC_INIT: - SenseairInit(); - break; - case FUNC_EVERY_250_MSECOND: - Senseair250ms(); - break; - case FUNC_JSON_APPEND: - SenseairShow(1); - break; + switch (function) { + case FUNC_INIT: + SenseairInit(); + break; + case FUNC_EVERY_250_MSECOND: + Senseair250ms(); + break; + case FUNC_JSON_APPEND: #ifdef USE_WEBSERVER - case FUNC_WEB_SENSOR: - SenseairShow(0); - break; + case FUNC_WEB_SENSOR: #endif // USE_WEBSERVER - } + SenseairShow(function); + break; } - return result; + return false; } #endif // USE_SENSEAIR diff --git a/tasmota/tasmota_xsns_sensor/xsns_48_chirp.ino b/tasmota/tasmota_xsns_sensor/xsns_48_chirp.ino index 0436e338a..3e41d0da2 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_48_chirp.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_48_chirp.ino @@ -240,6 +240,8 @@ bool ChirpScan() delay(2); chirp_sensor[chirp_found_sensors].version = ChirpReadVersion(address); if (chirp_sensor[chirp_found_sensors].version > 0) { + // try to confirm by reading the address + if (address != I2cRead8(address, CHIRP_GET_ADDRESS)) { continue; } I2cSetActiveFound(address, "CHIRP"); if (chirp_found_sensorsbegin(9600)) { - DEBUG_SENSOR_LOG(PSTR("UBX: started serial")); - if (UBXSerial->hardwareSerial()) { - ClaimSerial(); - DEBUG_SENSOR_LOG(PSTR("UBX: claim HW")); - } + if (!(PinUsed(GPIO_GPS_RX, GPIO_ANY) && PinUsed(GPIO_GPS_TX))) { return; } + + uint32_t option = GetPin(Pin(GPIO_GPS_RX, GPIO_ANY)) - AGPIO(GPIO_GPS_RX); // 0 .. 2 + uint32_t baudrate = 9600 << option; // Support 1 (9600), 2 (19200), 3 (38400) + UBXSerial = new TasmotaSerial(Pin(GPIO_GPS_RX, GPIO_ANY), Pin(GPIO_GPS_TX), 1, 0, UBX_SERIAL_BUFFER_SIZE); // 64 byte buffer is NOT enough + if (!UBXSerial->begin(baudrate)) { return; } + + if (UBXSerial->hardwareSerial()) { + ClaimSerial(); + } #ifdef ESP32 - AddLog(LOG_LEVEL_DEBUG, PSTR("UBX: Serial UART%d"), UBXSerial->getUart()); + AddLog(LOG_LEVEL_DEBUG, PSTR("UBX: Serial UART%d"), UBXSerial->getUart()); #endif - } - } - else { - return; - } UBXinitCFG(); // turn off NMEA, only use "our" UBX-messages UBX.mode.init = 1; @@ -536,8 +532,8 @@ void UBXsendRecord(uint8_t *buf) char stime[32]; UBX_t::entry_t *entry = (UBX_t::entry_t*)buf; snprintf_P(stime, sizeof(stime), GetDT(entry->time).c_str()); - char lat[12]; - char lon[12]; + char lat[FLOATSZ]; + char lon[FLOATSZ]; dtostrfd((double)entry->lat/10000000.0f,7,lat); dtostrfd((double)entry->lon/10000000.0f,7,lon); snprintf_P(record, sizeof(record),PSTR("\n\t\n\n"),lat ,lon, stime); @@ -879,9 +875,9 @@ const char kGPSFix[] PROGMEM = D_SAT_FIX_NO_FIX "|" D_SAT_FIX_DEAD_RECK "|" D_SA void UBXShow(bool json) { char fix[32]; GetTextIndexed(fix, sizeof(fix), UBX.state.gpsFix, kGPSFix); - char lat[12]; + char lat[FLOATSZ]; dtostrfd((double)UBX.rec_buffer.values.lat / 10000000.0f, 7, lat); // degrees - char lon[12]; + char lon[FLOATSZ]; dtostrfd((double)UBX.rec_buffer.values.lon / 10000000.0f, 7, lon); // degrees float hAcc = (float)UBX.state.last_vAcc / 1000.0f; // mm -> meters float alt = (float)UBX.state.last_alt / 1000.0f; // mm -> meters diff --git a/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino b/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino index 6d2bb789f..6abd6b470 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino @@ -2624,7 +2624,6 @@ void MI32sendWidget(uint32_t slot){ } void MI32InitGUI(void){ - MI32.widgetSlot=0; WSContentStart_P("m32"); WSContentSend_P(HTTP_MI32_SCRIPT_1); WSContentSendStyle(); @@ -2938,6 +2937,20 @@ int ExtStopBLE(){ bool Xsns62(uint32_t function) { + +#ifdef USE_WEBSERVER +#ifdef USE_MI_EXT_GUI + switch (function) { + case FUNC_WEB_ADD_MAIN_BUTTON: + WSContentSend_P(HTTP_BTN_MENU_MI32); + break; + case FUNC_WEB_ADD_HANDLER: + WebServer_on(PSTR("/m32"), MI32HandleWebGUI); + break; + } + #endif //USE_MI_EXT_GUI +#endif //USE_WEBSERVER + if (!Settings->flag5.mi32_enable) { return false; } // SetOption115 - Enable ESP32 MI32 BLE bool result = false; @@ -2977,14 +2990,6 @@ bool Xsns62(uint32_t function) case FUNC_WEB_SENSOR: MI32Show(0); break; -#ifdef USE_MI_EXT_GUI - case FUNC_WEB_ADD_MAIN_BUTTON: - if (Settings->flag5.mi32_enable) WSContentSend_P(HTTP_BTN_MENU_MI32); - break; - case FUNC_WEB_ADD_HANDLER: - WebServer_on(PSTR("/m32"), MI32HandleWebGUI); - break; -#endif //USE_MI_EXT_GUI #endif // USE_WEBSERVER } return result; diff --git a/tasmota/tasmota_xsns_sensor/xsns_90_hrg15.ino b/tasmota/tasmota_xsns_sensor/xsns_90_hrg15.ino index 1126b21bb..736f043e3 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_90_hrg15.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_90_hrg15.ino @@ -24,8 +24,8 @@ * https://rainsensors.com/rg-9-15-protocol/ * * Rule for Domoticz Rain sensor index 418: - * on tele-rg-15#flowrate do var1 %value% endon - * on tele-rg-15#event do backlog var2 %value%; mult1 100; event sendrain endon + * on tele-rg15#flowrate do var1 %value% endon + * on tele-rg15#event do backlog var2 %value%; mult1 100; event sendrain endon * on event#sendrain do dzsend1 418,%var1%;%var2% endon \*********************************************************************************************/ @@ -36,16 +36,18 @@ #define RG15_READ_TIMEOUT 500 #define RG15_EVENT_TIMEOUT 60 #define RG15_BUFFER_SIZE 150 +#define RG15_RCV_TIMEOUT 70 // Receiver timeout in seconds #include #ifdef USE_WEBSERVER const char HTTP_RG15[] PROGMEM = // {s} = , {m} = , {e} = - "{s}" RG15_NAME " " D_JSON_ACTIVE "{m}%2_f " D_UNIT_MILLIMETER "{e}" - "{s}" RG15_NAME " " D_JSON_EVENT "{m}%2_f " D_UNIT_MILLIMETER "{e}" - "{s}" RG15_NAME " " D_JSON_TOTAL "{m}%2_f " D_UNIT_MILLIMETER "{e}" - "{s}" RG15_NAME " " D_JSON_FLOWRATE "{m}%2_f " D_UNIT_MILLIMETER "/" D_UNIT_HOUR "{e}"; + "{s}" RG15_NAME " " D_HRG_VALID "{m}%d{e}" + "{s}" RG15_NAME " " D_HRG_ACTIVE "{m}%2_f " D_UNIT_MILLIMETER "{e}" + "{s}" RG15_NAME " " D_HRG_EVENT "{m}%2_f " D_UNIT_MILLIMETER "{e}" + "{s}" RG15_NAME " " D_HRG_TOTAL "{m}%2_f " D_UNIT_MILLIMETER "{e}" + "{s}" RG15_NAME " " D_HRG_FLOWRATE "{m}%2_f " D_UNIT_MILLIMETER "/" D_UNIT_HOUR "{e}"; #endif // USE_WEBSERVER TasmotaSerial *HydreonSerial = nullptr; @@ -55,8 +57,10 @@ struct RG15 { float event = NAN; float total = NAN; float rate = NAN; + uint32_t data_received = 0; uint16_t time = RG15_EVENT_TIMEOUT; uint8_t init_step; + bool sensor_valid = false; } Rg15; /*********************************************************************************************/ @@ -163,11 +167,19 @@ void Rg15Init(void) { AddLog(LOG_LEVEL_DEBUG, PSTR("HRG: Serial UART%d"), HydreonSerial->getUart()); #endif Rg15.init_step = 5; // Perform RG-15 init + Rg15.data_received = TasmotaGlobal.uptime; } } } } +void Rg15SensorValidChanged(bool new_status) { + AddLog(LOG_LEVEL_DEBUG, PSTR("HRG: Valid changed %d"), new_status); + Rg15.sensor_valid = new_status; + + // todo trigger teleperiod or publish status +} + void Rg15Poll(void) { bool publish = false; @@ -187,10 +199,20 @@ void Rg15Poll(void) { Rg15ReadLine(rg15_buffer); if (Rg15Process(rg15_buffer)) { // Do NOT use "publish = Rg15Process(rg15_buffer)" publish = true; + Rg15.data_received = TasmotaGlobal.uptime; + if (!Rg15.sensor_valid) { + Rg15SensorValidChanged(true); // Reset timeout + } } } } + if ((TasmotaGlobal.uptime - Rg15.data_received) > RG15_RCV_TIMEOUT) { + if (Rg15.sensor_valid) { + Rg15SensorValidChanged(false); // Timeout + } + } + if (publish && !TasmotaGlobal.global_state.mqtt_down) { MqttPublishSensor(); } @@ -214,17 +236,17 @@ void Rg15Poll(void) { void Rg15Show(bool json) { if (json) { // if the parsing wasn't completely successful then skip the update - if( !isnan(Rg15.acc) && !isnan(Rg15.event) && !isnan(Rg15.total) && !isnan(Rg15.rate) ) { + if (Rg15.sensor_valid && !isnan(Rg15.acc) && !isnan(Rg15.event) && !isnan(Rg15.total) && !isnan(Rg15.rate)) { ResponseAppend_P(PSTR(",\"" RG15_NAME "\":{")); - ResponseAppend_P(PSTR("\"%s\":%2_f,"), D_JSON_ACTIVE, &Rg15.acc); - ResponseAppend_P(PSTR("\"%s\":%2_f,"), D_JSON_EVENT, &Rg15.event); - ResponseAppend_P(PSTR("\"%s\":%2_f,"), D_JSON_TOTAL, &Rg15.total); - ResponseAppend_P(PSTR("\"%s\":%2_f"), D_JSON_FLOWRATE, &Rg15.rate); + ResponseAppend_P(PSTR("\"" D_JSON_ACTIVE "\":%2_f,"), &Rg15.acc); + ResponseAppend_P(PSTR("\"" D_JSON_EVENT "\":%2_f,"), &Rg15.event); + ResponseAppend_P(PSTR("\"" D_JSON_TOTAL "\":%2_f,"), &Rg15.total); + ResponseAppend_P(PSTR("\"" D_JSON_FLOWRATE "\":%2_f"), &Rg15.rate); ResponseAppend_P(PSTR("}")); } #ifdef USE_WEBSERVER } else { - WSContentSend_PD(HTTP_RG15, &Rg15.acc, &Rg15.event, &Rg15.total, &Rg15.rate); + WSContentSend_PD(HTTP_RG15, Rg15.sensor_valid, &Rg15.acc, &Rg15.event, &Rg15.total, &Rg15.rate); #endif // USE_WEBSERVER } } @@ -264,7 +286,8 @@ bool Xsns90(uint32_t function) { else if (HydreonSerial) { switch (function) { case FUNC_EVERY_SECOND: - if((TasmotaGlobal.uptime % 60) == 0) { // every minute + if ((TasmotaGlobal.uptime % 60) == 0) { // every minute + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("HRG: Valid %d"), Rg15.sensor_valid); ExecuteCommand("Sensor90 R", SRC_SENSOR); } Rg15Poll(); @@ -287,4 +310,4 @@ bool Xsns90(uint32_t function) { return result; } -#endif // USE_HRG15 \ No newline at end of file +#endif // USE_HRG15 diff --git a/tools/decode-status.py b/tools/decode-status.py index d8d9076af..fc1e750be 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -218,7 +218,9 @@ a_setoption = [[ "(LD2410) Disable generate moving event by sensor report - use LD2410 out pin for events (1)", "(GUI) Disable display of state text (1)", "(Energy) Do not add export energy to energy today (1)", - "","","", + "(GUI) Disable display of GUI device name (1)", + "(WizMote) Enable WiZ Smart Remote support (1)", + "", "","","","", "","","","", "","","","" @@ -308,8 +310,8 @@ a_features = [[ ],[ "USE_MAGIC_SWITCH","USE_PIPSOLAR","USE_GPIO_VIEWER","USE_AMSX915", "USE_SPI_LORA","USE_SPL06_007","USE_QMP6988","USE_WOOLIIS", - "USE_HX711_M5SCALES","USE_RX8010","","", - "","","","", + "USE_HX711_M5SCALES","USE_RX8010","USE_PCF85063","USE_ESP32_TWAI", + "USE_C8_CO2_5K","","","", "","","","", "","","","", "","","","", @@ -341,7 +343,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v14.3.0.7 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v14.4.1.4 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj)) diff --git a/tools/lv_gpio/lv_gpio_enum.h b/tools/lv_gpio/lv_gpio_enum.h index ad7df0fb7..f8a74084b 100644 --- a/tools/lv_gpio/lv_gpio_enum.h +++ b/tools/lv_gpio/lv_gpio_enum.h @@ -367,4 +367,7 @@ RN2XX3_RST = GPIO_RN2XX3_RST WOOLIIS_RX = GPIO_WOOLIIS_RX +C8_CO2_5K_TX = GPIO_C8_CO2_5K_TX +C8_CO2_5K_RX = GPIO_C8_CO2_5K_RX + SENSOR_END = GPIO_SENSOR_END diff --git a/tools/unishox/compress-html-uncompressed.py b/tools/unishox/compress-html-uncompressed.py index 5a58528fe..c950a5b22 100644 --- a/tools/unishox/compress-html-uncompressed.py +++ b/tools/unishox/compress-html-uncompressed.py @@ -20,9 +20,13 @@ ############################################################### import unishox -from os import listdir -from os import path +from sys import argv from datetime import datetime +from pathlib import Path +from hashlib import sha256 + +self_dir = Path(__file__).absolute().parent +base_dir = self_dir.parent.parent def extract_c_string(s: str) -> str: state = 0 @@ -48,18 +52,24 @@ def extract_c_string(s: str) -> str: out += c return out -path_compressed = path.join('..','..','tasmota','html_compressed') -path_uncompressed = path.join('..','..','tasmota','html_uncompressed') +def compress_html(source, target, argv=None, verbose=False): + if argv is None: argv = [] -files = listdir(path_uncompressed) + with open(source, "r") as f: + text = f.read() -totalIn = 0 -totalSaved = 0 + src_sha, old_sha = sha256(text.encode()).hexdigest(), None -for file in files: - f = open(path_uncompressed + path.sep + file, "r") - text = f.read() - f.close() + if not ('--force' in argv): + with open(target, "r") as f: + for line in f: + prefix = line[:17] + if prefix == '// input sha256: ': + old_sha = line[17:17+64] + break + + if src_sha == old_sha: + return (0, 0) #text = Tk().clipboard_get() # print(text) @@ -109,8 +119,9 @@ for file in files: # print(text[lastel+1:pos:]) lastel = pos - print("####### Parsing input from " + path_uncompressed + path.sep + file) - print(" Const char name: "+const_name) + if verbose: + print("####### Parsing input from " + str(source.relative_to(base_dir))) + print(" Const char name: "+const_name) #print('####### Cleaned input:') #print(input) @@ -128,20 +139,27 @@ for file in files: UNISHOX = unishox.Unishox() out_len = UNISHOX.compress(in_bytes, len(in_bytes), out_bytes, len(out_bytes)) - print(" ####### Compression result:") - print(" Compressed from {i} to {o}, -{p:.1f}%".format(i=in_len, o=out_len, p=(100-(float(out_len)/float(in_len)*100)))) + if verbose: + print(" ####### Compression result:") + reduction = 100-(float(out_len)/float(in_len)*100) + print(f" Compressed from {in_len} to {out_len}, -{reduction:.1f}%") out_bytes = out_bytes[:out_len] # truncate to right size #PROGMEM is growing in steps 0,8,24,40,56,... bytes of data resulting in size of 0,16,32,48,64,... bytes for in_real in range(8,in_len+16,16): if in_real>=in_len: - print(" Old real PROGMEM-size:"+str(in_real+8)+"(unused bytes:"+str(in_real-in_len)+")") + if verbose: + print(f" Old real PROGMEM-size:{in_real+8}(unused bytes:{in_real-in_len})") break for out_real in range(8,out_len+16,16): if out_real>=out_len: - print(" New real PROGMEM-size:"+str(out_real+8)+"(unused bytes:"+str(out_real-out_len)+")") + if verbose: + print(f" New real PROGMEM-size:{out_real+8}(unused bytes:{out_real-out_len})") break - print(" the optimal case would be raw bytes + 8, real difference: "+str(in_real - out_real)+ "bytes") + + if verbose: + print(f" the optimal case would be raw bytes + 8, real difference: {in_real - out_real}bytes") + # https://www.geeksforgeeks.org/break-list-chunks-size-n-python/ def chunked(my_list, n): return [my_list[i * n:(i + 1) * n] for i in range((len(my_list) + n - 1) // n )] @@ -150,27 +168,49 @@ for file in files: chunks = chunked(out_bytes, 20) lines_raw = [ "\"\\x" + "\\x".join( [ '{:02X}'.format(b) for b in chunk ] ) + "\"" for chunk in chunks ] - line_complete = "const char " + const_name + "_COMPRESSED" +"[] PROGMEM = " + ("\n" + " "*29).join(lines_raw) + ";" - lines = "\nconst size_t " + const_name +"_SIZE = {size};\n{lines}\n\n".format(size=in_len, lines=line_complete) + line_complete = f"const char {const_name}_COMPRESSED[] PROGMEM = " + ("\n" + " "*29).join(lines_raw) + ";" + lines = f"\nconst size_t {const_name}_SIZE = {in_len};\n{line_complete}\n\n" #print('####### Final output:') #print(lines) - definition = "#define " + const_name + " Decompress(" + const_name + "_COMPRESSED" + "," + const_name +"_SIZE" + ").c_str()" + definition = f"#define {const_name} Decompress({const_name}_COMPRESSED,{const_name}_SIZE).c_str()" #print(definition) now = datetime.now() # current date and time percent = int((float(out_real)/float(in_real))*100.0) saving = in_real - out_real - totalIn = totalIn + in_real - totalSaved = totalSaved + saving - comment = "/////////////////////////////////////////////////////////////////////\n" - comment = comment + "// compressed by tools/unishox/compress-html-uncompressed.py\n" - comment = comment + "/////////////////////////////////////////////////////////////////////\n" + #totalIn = totalIn + in_real + #totalSaved = totalSaved + saving + comment = "/////////////////////////////////////////////////////////////////////\n" + comment += "// compressed by tools/unishox/compress-html-uncompressed.py\n" + comment += f"// input sha256: {src_sha}\n" + comment += "/////////////////////////////////////////////////////////////////////\n" - f = open(path_compressed + path.sep + file, "w") - f.write(comment + lines + definition) - f.close() - print("####### Wrote output to " + path_compressed + path.sep + file) + with open(target, "w") as f: + f.write(comment + lines + definition) -print("If all files are in use, total saving was "+str(totalSaved)+" out of "+str(totalIn)) + return (in_real, saving) + + if verbose: + print("####### Wrote output to " + str(target.relative_to(base_dir))) + +def compress_dir(source_dir, target_dir, argv=None, verbose=False): + totalIn, totalSaved = 0, 0 + + for source in source_dir.iterdir(): + target = Path(target_dir, source.stem + ".h") + bytesIn, bytesSaved = compress_html(source, target, argv, verbose) + totalIn += bytesIn + totalSaved += bytesSaved + + return (totalIn, totalSaved) + +if __name__ == '__main__': + path_uncompressed = Path(base_dir, 'tasmota', 'html_uncompressed') + path_compressed = Path(base_dir, 'tasmota', 'html_compressed') + + totalIn, totalSaved = compress_dir(path_uncompressed, path_compressed, argv, True) + + if totalSaved > 0: + print(f"If all files are in use, total saving was {totalSaved} out of {totalIn}")