diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index 60ff103..4c42e68 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-24.04
env:
MPY_DIR: ./micropython
- MICROPYTHON_BIN: ./micropython/ports/unix/build-standard/micropython
+ MICROPYTHON_BIN: ./micropython/ports/unix/build-nomodules/micropython
steps:
- uses: actions/checkout@v4
with:
@@ -24,19 +24,28 @@ jobs:
with:
repository: jonnor/micropython
path: micropython
- ref: emlearn-micropython-v1.24-1
+ ref: v1.25.0
- name: Install Python dependencies
run: pip install -r requirements.txt
- name: Setup MicroPython X86
working-directory: micropython
- run: source tools/ci.sh && ci_unix_32bit_setup && ci_unix_standard_build
- - name: Run test and build module x64
+ run: |
+ source tools/ci.sh && ci_unix_32bit_setup && ci_unix_standard_build
+ mv ./ports/unix/build-standard/ ./ports/unix/build-nomodules/
+ - name: Build custom firmware with user modules, and tests. Unix/x64
+ run: make check_unix V=1
+ - name: Build .mpy modules and run tests Unix/x64
run: make check ARCH=x64 V=1
- name: Setup MicroPython ARM
working-directory: micropython
run: source tools/ci.sh && ci_rp2_setup
+ - name: Setup MicroPython RP2 port
+ working-directory: micropython/ports/rp2
+ run: make submodules
+ - name: Build custom firmware with extmod, RP2
+ run: make rp2 V=1
- name: Build module armv6m
- run: make dist ARCH=armv6m V=1
+ run: echo make dist ARCH=armv6m V=1
- name: Build module armv7m
run: make dist ARCH=armv7m V=1
- name: Build module armv7emsp
@@ -44,18 +53,22 @@ jobs:
- name: Setup MicroPython ESP32
working-directory: micropython
run: source tools/ci.sh && ci_esp32_idf_setup
+ - name: Build custom firmware with extmod, RP2
+ run: |
+ source micropython/esp-idf/export.sh && pip install -r requirements.txt
+ make extmod PORT=esp32 BOARD=ESP32_GENERIC_S3
+ make extmod PORT=esp32 BOARD=ESP32_GENERIC
- name: Build module xtensawin
run: source micropython/esp-idf/export.sh && pip install -r requirements.txt && make dist ARCH=xtensawin V=1
- name: Archive dist artifacts
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: dist
- path: |
- dist
+ path: dist
- name: Prepare release
run: make release
- name: Archive release artifacts
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: release
path: emlearn-micropython-*.zip
@@ -68,3 +81,37 @@ jobs:
publish_dir: ./dist
keep_files: true
destination_dir: builds/${{ github.ref_name }}
+
+ docs:
+
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ python-version: ['3.10']
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: true
+ - name: Set up Python ${{ matrix.python-version }}
+ uses: actions/setup-python@v5
+ with:
+ python-version: ${{ matrix.python-version }}
+
+ - name: Install OS dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -yqq libsndfile1 libsndfile1-dev doxygen
+ - name: Install Python dependencies
+ run: |
+ python -m pip install -U 'pip<20'
+ pip install flake8 pytest
+ if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
+ if [ -f requirements.dev.txt ]; then pip install -r requirements.dev.txt; fi
+ - name: Build documentation using Sphinx
+ working-directory: ./docs
+ env:
+ PYTHONPATH: ../:../build/lib.linux-x86_64-cpython-310
+ READTHEDOCS: 'True'
+ run: |
+ make html
diff --git a/.gitignore b/.gitignore
index 50f3249..5ca0c96 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@ venv/
.ipynb_checkpoints/
__pycache__/
+.mpy_ld_cache/
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
new file mode 100644
index 0000000..faf87db
--- /dev/null
+++ b/.readthedocs.yaml
@@ -0,0 +1,20 @@
+# Read the Docs configuration file
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+
+# Required
+version: 2
+
+# Set the OS, Python version, and other tools you might need
+build:
+ os: ubuntu-24.04
+ tools:
+ python: "3.12"
+
+python:
+ install:
+ - requirements: requirements.dev.txt
+
+sphinx:
+ # Path to your Sphinx configuration file.
+ configuration: docs/conf.py
+
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..d0ab090
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,9 @@
+## The MIT License
+
+Copyright 2024-2025 Jon Nordby et. al
+
+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/Makefile b/Makefile
index 0a4606d..0b6ff72 100644
--- a/Makefile
+++ b/Makefile
@@ -4,11 +4,29 @@ MPY_ABI_VERSION ?= 6.3
MPY_DIR ?= ../micropython
MICROPYTHON_BIN ?= micropython
+# extmod settings
+PORT=unix
+BOARD=ESP32_GENERIC_S3
+
VERSION := $(shell git describe --tags --always)
MPY_DIR_ABS = $(abspath $(MPY_DIR))
+C_MODULES_SRC_PATH = $(abspath ./src)
+
+ifeq ($(PORT),unix)
+ MANIFEST_PATH=$(abspath ./src/manifest_unix.py)
+else
+ MANIFEST_PATH=$(abspath ./src/manifest.py)
+endif
+
+
MODULES_PATH = ./dist/$(ARCH)_$(MPY_ABI_VERSION)
+PORT_DIR = ./dist/ports/$(PORT)
+PORT_BUILD_DIR=$(MPY_DIR)/ports/$(PORT)/build-$(BOARD)
+PORT_DIST_DIR=./dist/ports/$(PORT)/$(BOARD)
+
+UNIX_MICROPYTHON = ./dist/ports/unix/micropython
$(MODULES_PATH)/emlearn_trees.mpy:
make -C src/emlearn_trees/ ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) V=1 clean dist
@@ -22,8 +40,11 @@ $(MODULES_PATH)/emlearn_iir.mpy:
$(MODULES_PATH)/emlearn_fft.mpy:
make -C src/emlearn_fft/ ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) V=1 clean dist
-$(MODULES_PATH)/emlearn_cnn.mpy:
- make -C src/tinymaix_cnn/ ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) V=1 clean dist
+$(MODULES_PATH)/emlearn_cnn_int8.mpy:
+ make -C src/tinymaix_cnn/ ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) V=1 CONFIG=int8 clean dist
+
+$(MODULES_PATH)/emlearn_cnn_fp32.mpy:
+ make -C src/tinymaix_cnn/ ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) V=1 CONFIG=fp32 clean dist
$(MODULES_PATH)/emlearn_kmeans.mpy:
make -C src/emlearn_kmeans/ ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) V=1 clean dist
@@ -46,7 +67,7 @@ emlearn_iir.results: $(MODULES_PATH)/emlearn_iir.mpy
emlearn_fft.results: $(MODULES_PATH)/emlearn_fft.mpy
MICROPYPATH=$(MODULES_PATH) $(MICROPYTHON_BIN) tests/test_fft.py
-emlearn_cnn.results: $(MODULES_PATH)/emlearn_cnn.mpy
+emlearn_cnn.results: $(MODULES_PATH)/emlearn_cnn_int8.mpy $(MODULES_PATH)/emlearn_cnn_fp32.mpy
MICROPYPATH=$(MODULES_PATH) $(MICROPYTHON_BIN) tests/test_cnn.py
emlearn_kmeans.results: $(MODULES_PATH)/emlearn_kmeans.mpy
@@ -58,7 +79,36 @@ emlearn_iir_q15.results: $(MODULES_PATH)/emlearn_iir_q15.mpy
emlearn_arrayutils.results: $(MODULES_PATH)/emlearn_arrayutils.mpy
MICROPYPATH=$(MODULES_PATH) $(MICROPYTHON_BIN) tests/test_arrayutils.py
-.PHONY: clean
+$(PORT_DIR):
+ mkdir -p $@
+
+$(UNIX_MICROPYTHON): $(PORT_DIR)
+ make -C $(MPY_DIR)/ports/unix V=1 USER_C_MODULES=$(C_MODULES_SRC_PATH) FROZEN_MANIFEST=$(MANIFEST_PATH) CFLAGS_EXTRA='-Wno-unused-function -Wno-unused-function' -j4
+ cp $(MPY_DIR)/ports/unix/build-standard/micropython $@
+
+unix: $(UNIX_MICROPYTHON)
+
+check_unix: $(UNIX_MICROPYTHON)
+ $(UNIX_MICROPYTHON) tests/test_trees.py
+ $(UNIX_MICROPYTHON) tests/test_iir.py
+ $(UNIX_MICROPYTHON) tests/test_fft.py
+ $(UNIX_MICROPYTHON) tests/test_arrayutils.py
+ echo SKIP $(UNIX_MICROPYTHON) tests/test_cnn.py
+
+rp2: $(PORT_DIR)
+ make -C $(MPY_DIR)/ports/rp2 V=1 USER_C_MODULES=$(C_MODULES_SRC_PATH)/micropython.cmake FROZEN_MANIFEST=$(MANIFEST_PATH) CFLAGS_EXTRA='-Wno-unused-function -Wno-unused-function' -j4
+ mkdir -p ./dist/ports/rp2/RPI_PICO
+ cp -r $(MPY_DIR)/ports/rp2/build-RPI_PICO/firmware* ./dist/ports/rp2/RPI_PICO/
+
+
+extmod:
+ make -C $(MPY_DIR)/ports/esp32 V=1 BOARD=$(BOARD) USER_C_MODULES=$(C_MODULES_SRC_PATH)/micropython.cmake FROZEN_MANIFEST=$(MANIFEST_PATH) CFLAGS_EXTRA='-Wno-unused-function -Wno-unused-function' -j4
+ mkdir -p $(PORT_DIST_DIR)
+ cp -r $(PORT_BUILD_DIR)/firmware* $(PORT_DIST_DIR)
+ cp -r $(PORT_BUILD_DIR)/micropython* $(PORT_DIST_DIR)
+
+
+.PHONY: clean unix
clean:
make -C src/emlearn_trees/ ARCH=$(ARCH) MPY_DIR=$(MPY_DIR_ABS) V=1 clean
@@ -76,6 +126,6 @@ release:
check: emlearn_trees.results emlearn_neighbors.results emlearn_iir.results emlearn_iir_q15.results emlearn_fft.results emlearn_kmeans.results emlearn_arrayutils.results emlearn_cnn.results
-dist: $(MODULES_PATH)/emlearn_trees.mpy $(MODULES_PATH)/emlearn_neighbors.mpy $(MODULES_PATH)/emlearn_iir.mpy $(MODULES_PATH)/emlearn_iir_q15.mpy $(MODULES_PATH)/emlearn_fft.mpy $(MODULES_PATH)/emlearn_kmeans.mpy $(MODULES_PATH)/emlearn_arrayutils.mpy $(MODULES_PATH)/emlearn_cnn.mpy
+dist: $(MODULES_PATH)/emlearn_trees.mpy $(MODULES_PATH)/emlearn_neighbors.mpy $(MODULES_PATH)/emlearn_iir.mpy $(MODULES_PATH)/emlearn_iir_q15.mpy $(MODULES_PATH)/emlearn_fft.mpy $(MODULES_PATH)/emlearn_kmeans.mpy $(MODULES_PATH)/emlearn_arrayutils.mpy $(MODULES_PATH)/emlearn_cnn_int8.mpy $(MODULES_PATH)/emlearn_cnn_fp32.mpy
diff --git a/README.md b/README.md
index 0395aa3..0237bd2 100644
--- a/README.md
+++ b/README.md
@@ -2,29 +2,33 @@
# emlearn-micropython
-[Micropython](https://micropython.org) integration for the [emlearn](https://emlearn.org) Machine Learning library for microcontrollers.
-
-It enables MicroPython applications to run efficient Machine Learning models on microcontroller,
-without having to touch any C code.
-
-> scikit-learn for Microcontrollers
+Machine Learning and Digital Signal Processing for [MicroPython](https://micropython.org).
+Provides convenient and efficient MicroPython modules, and enables MicroPython application developers
+to run efficient Machine Learning models on microcontroller, without having to touch any C code.
This is a [TinyML](https://www.tinyml.org/) library,
particularly well suited for low-compexity and low-power classification tasks.
It can be combined with feature preprocessing, including neural networks to address more complex tasks.
+Builds on [emlearn](https://emlearn.org), a C99 library for Machine Learning on microcontrollers and embedded system.
+
+> scikit-learn for Microcontrollers
+
## Status
**Minimally useful**
-- Tested *working* on `x64` (Unix port) and `xtensawin` (ESP32).
-- Currently *broken* on ARM `armv6m` (Cortex M0 / RP2040). [Issue](https://github.com/emlearn/emlearn-micropython/issues/19)
+- Initial set of Machine Learning and Digital Signal Processing modules available, including example projects.
+- Supports most MicroPython ports using runtime installable native modules
+- Primarily tested on `x64` (Unix port) and `xtensawin` (ESP32/ESP32-S3/etc).
+- Some devices only supported using external, notably armv6m/Cortex-M0/RP2040
+- Not yet supported: [RISC-V/ESP32-C3/ESP32-C6](https://github.com/emlearn/emlearn-micropython/issues/35)
## Features
- Classification with [RandomForest](https://en.wikipedia.org/wiki/Random_forest)/DecisionTree models
- Classification and on-device learning with [K-Nearest Neighbors (KNN)](https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm)
- Classification with Convolutional Neural Network (CNN), using [TinyMaix](https://github.com/sipeed/TinyMaix/) library.
-- Fast Fourier Transform (FFT) for feature preprocessing, or general DSP
+- [Fast Fourier Transform (FFT)](https://en.wikipedia.org/wiki/Fast_Fourier_transform) for feature preprocessing, or general DSP
- Infinite Impulse Response (IIR) filters for feature preprocessing, or general DSP
- Clustering using K-means
- Scaling and data type transformations for `array`, using `emlearn_arrayutils`.
@@ -33,7 +37,7 @@ It can be combined with feature preprocessing, including neural networks to addr
- Operates on standard `array.array` data structures
- Models can be loaded at runtime from a file in disk/flash
- Highly efficient. Inference times down to 100 microseconds, RAM usage <2 kB, FLASH usage <2 kB
-- Pre-built binaries available for most architectures.
+- Pre-built native modules available for most common architectures `xtensawin`.
## Examples
@@ -42,107 +46,38 @@ It can be combined with feature preprocessing, including neural networks to addr
- [har_trees](./examples/har_trees/). Accelerometer-based Human Activity Recognition, using Random Forest
- [soundlevel_iir](./examples/soundlevel_iir/). Sound Level Meter, using Infinite Impulse Response (IIR) filters.
-## Prerequisites
-
-Minimally you will need
-
-- Python 3.10+ on host
-- MicroPython 1.24+ running onto your device
-
-#### Download repository
-
-Download the repository with examples etc
-```
-git clone https://github.com/emlearn/emlearn-micropython
-```
-
-## Usage
-
-Start with the instructions in [XOR example](./examples/xor_trees/).
+## Documentation
+Complete usage [documentation on ReadTheDocs](https://emlearn-micropython.readthedocs.io/en/latest/user_guide.html).
-## Supported versions
-At any given point in time, emlearn-micropython only provides pre-built binaries for one MicroPython version.
-In general we strongly encourage people to use the latest version.
-There are no long-term-support or bugfix versions, at this point.
-If you build from source, the current version of emlearn-micropython might also work on a couple of MicroPython versions around the time, but this is not guaranteed.
-
-| MicroPython | emlearn-micropython |
-|------------------| ------------------ |
-| 1.24.x | master |
-| 1.24.x | 0.7.0 |
-| 1.23.x | 0.6.0 |
-
-#### Find architecture and .mpy version
-
-The correct .mpy files to use depend on the CPU architecture of your microcontroller,
-as well as the MicroPython version.
-
-| MicroPython version | .mpy version |
-|---------------------| ------------- |
-| 1.23.x | 6.3 |
-| 1.24.x | 6.3 |
-
-
-Identify which CPU architecture your device uses.
-You need to specify `ARCH` to install the correct module version.
-
-| ARCH | Description | Examples |
-|---------------|-----------------------------------|---------------------- |
-| x64 | x86 64 bit | PC |
-| x86 | x86 32 bit | |
-| armv6m | ARM Thumb (1) | Cortex-M0 |
-| armv7m | ARM Thumb 2 | Cortex-M3 |
-| armv7emsp | ARM Thumb 2, single float | Cortex-M4F, Cortex-M7 |
-| armv7emdp | ARM Thumb 2, double floats | Cortex-M7 |
-| xtensa | non-windowed | ESP8266 |
-| xtensawin | windowed with window size 8 | ESP32 |
-
-Information is also available in the official documentation:
-[MicroPython: .mpy files](https://docs.micropython.org/en/latest/reference/mpyfiles.html#versioning-and-compatibility-of-mpy-files)
-
-
-## More learning resources
-
-emlearn-micropython and emlearn has been covered in the following presentations.
-
-- Microcontrollers + Machine Learning in 1-2-3 (PyData Global 2024).
-[Slides etc](https://github.com/jonnor/embeddedml/tree/master/presentations/PyDataGlobal2024)
-- Sensor data processing on microcontrollers with MicroPython and emlearn (PyConZA 2024).
-[Slides etc](https://github.com/jonnor/embeddedml/tree/master/presentations/PyConZA2024)
-- 6 years of open source TinyML with emlearn - a scikit-learn for microcontrollers (TinyML EMEA 2024)
-[YouTube video](https://www.youtube.com/watch?v=oG7PjPMA3Is) |
-[Slides etc](https://github.com/jonnor/embeddedml/tree/master/presentations/TinymlEMEA2024)
-- emlearn - Machine Learning for Tiny Embedded Systems (Embedded Online Conference 2024).
-[Youtube video](https://www.youtube.com/watch?v=qamVWmcBdmI) |
-[Slides etc](https://github.com/jonnor/embeddedml/tree/master/presentations/EmbeddedOnlineConference2024)
-- Machine Learning on microcontrollers using MicroPython and emlearn (PyCon DE & PyData Berlin 2024).
-[Slides etc](https://github.com/jonnor/embeddedml/tree/master/presentations/PyDataBerlin2024) |
-[YouTube video](https://www.youtube.com/watch?v=_MGm8sctqjg&t=1311s&pp=ygUSZW1sZWFybiBtaWNyb3B5dGhv).
-
-Here is an overview of resources for [TinyML in general](https://tinyml.seas.harvard.edu/courses/).
+## Citations
-## Benchmarks
+If you use `emlearn-micropython` in an academic work, please reference it using:
-#### UCI handwriting digits
+```tex
+@misc{emlearn_micropython,
+ author = {Jon Nordby},
+ title = {{emlearn-micropython: Efficient Machine Learning engine for MicroPython}},
+ month = aug,
+ year = 2023,
+ doi = {10.5281/zenodo.8212731},
+ url = {https://doi.org/10.5281/zenodo.8212731}
+}
+```
-UCI ML hand-written digits datasets dataset from
-[sklearn.datasets.load_digits](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_digits.html).
-8x8 image, 64 features. Values are 4-bit integers (16 levels). 10 classes.
-Running with a very simple RandomForest, 7 trees.
-Reaches approx 86% accuracy.
-Tested on Raspberry PI Pico, with RP2040 microcontroller (ARM Cortex M0 @ 133 MHz).
-
+## Developing
-NOTE: over half of the time for emlearn case,
-is spent on converting the Python lists of integers into a float array.
-Removing that bottleneck would speed up things considerably.
+For those that wish to hack on emlearn-micropython itself.
+#### Download the code
-## Developing locally
+Clone the repository using git
+```
+git clone https://github.com/emlearn/emlearn-micropython
+```
#### Prerequisites
These come in addition to the prequisites described above.
@@ -153,13 +88,13 @@ See [MicroPython: Building native modules](https://docs.micropython.org/en/lates
We assume that micropython is installed in the same place as this repository.
If using another location, adjust `MPY_DIR` accordingly.
-You should be using MicroPython 1.24 (or newer).
+You should be using MicroPython 1.25 (or newer).
#### Build
Build the .mpy native module
```
-make dist ARCH=armv6m MPY_DIR=../micropython
+make dist ARCH=xtensawin MPY_DIR=../micropython
```
Install it on device
@@ -174,18 +109,4 @@ To build and run tests on host
make check
```
-## Citations
-
-If you use `emlearn-micropython` in an academic work, please reference it using:
-
-```tex
-@misc{emlearn_micropython,
- author = {Jon Nordby},
- title = {{emlearn-micropython: Efficient Machine Learning engine for MicroPython}},
- month = aug,
- year = 2023,
- doi = {10.5281/zenodo.8212731},
- url = {https://doi.org/10.5281/zenodo.8212731}
-}
-```
diff --git a/brand/README.md b/brand/README.md
new file mode 100644
index 0000000..a985a1a
--- /dev/null
+++ b/brand/README.md
@@ -0,0 +1,9 @@
+
+# emlearn-micropython brand guidelines
+
+The emlearn-micropython brand is derived from that of the parent project, emlearn.
+See the [emlearn brand guidelines](https://github.com/emlearn/emlearn/blob/master/brand/README.md).
+
+#### Wide logo with wordmark
+
+Download: [SVG](./emlearn-micropython-logo-wordmark-wide.svg), [PNG](./emlearn-micropython-logo-wordmark-wide.png)
diff --git a/brand/emlearn-micropython-logo-wordmark-wide-600px.png b/brand/emlearn-micropython-logo-wordmark-wide-600px.png
new file mode 100644
index 0000000..7482218
Binary files /dev/null and b/brand/emlearn-micropython-logo-wordmark-wide-600px.png differ
diff --git a/brand/emlearn-micropython-logo-wordmark-wide.png b/brand/emlearn-micropython-logo-wordmark-wide.png
new file mode 100644
index 0000000..71af563
Binary files /dev/null and b/brand/emlearn-micropython-logo-wordmark-wide.png differ
diff --git a/brand/emlearn-micropython-logo-wordmark-wide.svg b/brand/emlearn-micropython-logo-wordmark-wide.svg
new file mode 100644
index 0000000..6dd6de1
--- /dev/null
+++ b/brand/emlearn-micropython-logo-wordmark-wide.svg
@@ -0,0 +1,217 @@
+
+
+
+
diff --git a/dependencies/TinyMaix b/dependencies/TinyMaix
index 09ae9b7..7bcb087 160000
--- a/dependencies/TinyMaix
+++ b/dependencies/TinyMaix
@@ -1 +1 @@
-Subproject commit 09ae9b70ecb1eb3afff8b669db46a49a1b1605ef
+Subproject commit 7bcb087b6a8ff69fa3e2ac89e67df5b35aa86df9
diff --git a/doc/TODO.md b/doc/TODO.md
index d32258a..b0471d8 100644
--- a/doc/TODO.md
+++ b/doc/TODO.md
@@ -11,11 +11,14 @@
# Milestones
-- Can run example in browser
-- Can run on-device training example
-- First demo video published
-- First test by other users
+- First demo video published. DONE, toothbrush
+- First test by other users. DONE, Cornell university
+- Complete example for full flow. Data collect, train, deploy. DONE, HAR
- First course held
+- Can run on-device training example
+- Can run inference example in browser
+- Can do data collection, training in browser, deploy to device
+
# TODO
@@ -42,8 +45,11 @@ sequence. On-device training demo
- Add a couple of different sized models to benchmark?
- Add another application/dataset for benchmark
-In-browser demo
+#### In-browser demo
-- Test MicroPython build for WASM/browser
+- Test MicroPython build for WASM/browser.
+Requires user/external C module build support.
+https://github.com/emlearn/emlearn-micropython/issues/18
- Test getting audio input into MicroPython Webassembly
- Test getting IMU data (ie on phone), in browser
+- Test running scikit-learn and/or Keras training in browser. With Pyiodine
diff --git a/doc/micropython-documentation.md b/doc/micropython-documentation.md
new file mode 100644
index 0000000..4a19043
--- /dev/null
+++ b/doc/micropython-documentation.md
@@ -0,0 +1,35 @@
+
+## Background
+At the moment the MicroPython documentation is mostly missing a *user-guide*.
+The existing documentation is mostly a *reference* (to ports/internals/tools).
+A user in this context is an application/firmware developer:
+Someone who wants to develop programs for a particular usecase,
+and less interested in MicroPython internals etc.
+
+Here are some things I would like to see, that helps people in more quickly learning how to build with MicroPython.
+
+## User guide
+
+- Getting started. zero to hero, simplified flow (mentioned earlier).
+- Structuring programs
+Project layout. Program flow, asyncio/blocking/nonblocking/interrupts.
+- Development tools.
+mpremote/commandline-based. IDEs and IDE extensions/plugins.
+- Debugging MicroPython programs.
+Tools, techniques. logging
+- Selecting hardware
+Limited scope: different capabilities of ports
+- Using external libraries
+Where to find. micropython-lib. Awesome MicroPython. How to install.
+- Developing libraries
+Project layout. Publishing.
+- Automated testing
+Host-based. On-device. Simulation with qemu. Hardware-in-the-loop
+- Type checking.
+stubs
+- Continious integration/deployment
+Building and publishing applications using CI
+
+
+## More learning resources
+Pointers to other places to learn about developing with MicroPython.
diff --git a/doc/micropython-tinyml-status.md b/doc/micropython-tinyml-status.md
index 06e5d42..a8d32af 100644
--- a/doc/micropython-tinyml-status.md
+++ b/doc/micropython-tinyml-status.md
@@ -14,13 +14,37 @@ and that it has many of the key properties needed to be highly suitable for this
## Native modules
-FIXED. Completely broken on at least one port, due to module functions being garbage collected.
+**FIXED.** Was completely broken on at least one port, due to module functions being garbage collected.
https://github.com/micropython/micropython/issues/6769
-Using floating point / math operations is difficult / very tedious.
+**FIXED.** Using floating point / math operations is difficult / was very tedious.
Need to manually resolve all symbols.
https://github.com/micropython/micropython/issues/5629
+Supporting both natmod and extmod builds requires duplicating class and module definitions,
+because they are slightly different.
+Maybe an "unified API" could be introduced using some C macros?
+
+Supporting both natmod and extmod builds requires 3 build systems setup.
+natmod requires a `Makefile` which includes `dynruntime.mk`,
+whereas extmod requires `micropython.mk` for Makefile-based ports,
+and also `micropython.cmake` for cmake-based ports.
+
+Native modules with relocations does not work on armv6m/RP2040.
+
+Native modules with relocations do not work on RISC-V/ESP32-C3/ESP32-C6.
+
+Native modules does not work on Webassembly target.
+
+To install native modules with
+
+Question. Does native modules work on Zephyr port?
+
+Question. Can native modules be distributed in a ROMFS?
+
+Native modules do not support Execute-in-Place, consuming RAM for all the code.
+Questiion. Can this be solved using ROMFS?
+
## Efficient data processing
#### Using specialized code emitters
@@ -58,6 +82,8 @@ Would want to initialize empty / with unspecified values, or initialized filled
Inefficient copies of `array.array`.
+Missing efficient sorting function for `array.array`.
+
## Data formats
#### Binary encoding into strings
@@ -85,6 +111,9 @@ Ideally would be compatible with that.
!No mip-installable library for JPEG files.
+[cnadler86/micropython-camera-API](https://github.com/cnadler86/micropython-camera-API?tab=readme-ov-file#convert-image-to-another-format)
+has support for JPEG decode/encode, as a function in the camera module (ESP32 only).
+
!No mip installable library for PNG files.
OpenMV [omv.image](https://docs.openmv.io/library/omv.image.html) module supports loading/saving JPEG/PNG.
@@ -149,6 +178,12 @@ https://github.com/micropython/micropython/pull/8318
Missing! Support for Bluetooth Audio.
Useful for collecting raw data by sending to a phone or computer.
+#### USB
+Good support for USB device on many targets.
+USB devices can be created dynamically at runtime, without needing to rebuild firmware.
+
+USB host not supported on any target.
+
#### LoRa
Unknown/not investigated.
diff --git a/doc/native-modules-future.md b/doc/native-modules-future.md
new file mode 100644
index 0000000..90e154a
--- /dev/null
+++ b/doc/native-modules-future.md
@@ -0,0 +1,95 @@
+
+# Dynamic native modules are the future
+
+WIP on a post for MicroPython Discussion forum,
+advocating for dynamic native modules - their potential and how they can be further improved.
+
+Dynamic modules are .mpy files with native code that can be installed at runtime.
+This enables to "mip install" modules that extend the
+
+For computationally intensive uses C modules are very useful,
+because they can be 10-100x faster than Python (even when using native and Viper emitters).
+This includes things like data processing, signal processing, machine learning, compression, cryptography, and much more.
+
+The facilities for dynamic native modules for several years already,
+but it has not seen that much usage or testing.
+However in MicroPython 1.24 (October 2024) critical issues where fixed,
+and now in MicroPython 1.25 (April 2025) there is support for linking symbols,
+which means that it is getting ready for wider usage.
+
+## What are dynamic native modules
+
+natmod, https://docs.micropython.org/en/latest/develop/natmod.html
+extmod, https://docs.micropython.org/en/latest/develop/cmodules.html
+
+## Advantages of native modules
+
+User benefits, user-experience
+Library developer benefits
+Hardware manufacturer benefits
+
+Enables having C module extensions without requiring custom builds
+
+## Drawbacks of native modules
+
+RAM usage.
+Code dupliation.
+
+## What to use native modules for (and not)
+
+
+
+## Painpoints with native modules
+
+TODO: import from other notes
+
+These are all things which can be improved, and it is up to us all to help out.
+I believe that this can significantly improve the MicroPython ecosystem.
+
+## Building
+
+TODO: file issues around these things, at least the most obvious/clear ones
+
+Ideas
+
+- Support for natmod in micropython-lib. Automatically built in CI and published.
+- Build and publish the natmods that are part of MicroPython. btree, deflate
+- mpremote. Resolve correct architecture for native .mpy files
+- awesome-micropython. Include standard marker for native modules?
+- mpbuild. Support for natmod building.
+https://github.com/mattytrentini/mpbuild/issues/76
+- docs. Document better how to support both extmod and natmod with same codebase
+
+
+## Call to Action
+
+Library developers.
+Consider supporting native modules for your C-based library modules.
+Try to develop new modules as natmod-first, with extmod as the backup
+(for ports without natmod or uses where ).
+
+MicroPython contributors.
+Help out to improve
+
+## Examples of native modules in use
+
+Libraries
+
+- [BrianPugh/tamp](https://github.com/BrianPugh/tamp) - a low-memory, DEFLATE-inspired lossless compression library.
+- emlearn-micropython - Efficient and convenient Machine Learning engine
+- **Your library here!!**
+
+Tools
+
+- ViperIDE.
+- **Your tools here!**
+
+
+# Thanks to
+
+vhymassky
+agatti
+damien
+BrianPugh
+
+
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 0000000..88d5b65
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,7 @@
+_build
+_static
+_templates
+auto_examples/
+
+doxygen/xml
+doxygen/html
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 0000000..298ea9e
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,19 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = sphinx-build
+SOURCEDIR = .
+BUILDDIR = _build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
\ No newline at end of file
diff --git a/docs/api_reference.rst b/docs/api_reference.rst
new file mode 100644
index 0000000..cc3640d
--- /dev/null
+++ b/docs/api_reference.rst
@@ -0,0 +1,66 @@
+
+.. Places parent toc into the sidebar
+:parenttoc: True
+
+.. title:: API: contents
+
+.. _api_reference:
+
+====================
+API reference
+====================
+
+
+.. toctree::
+ :numbered:
+ :maxdepth: 2
+ :titlesonly:
+
+
+.. _emlearn_trees:
+emlearn_trees - Decision tree ensembles
+----------------------------------------------------
+
+.. automodule:: emlearn_trees
+ :members:
+
+
+.. _emlearn_cnn:
+emlearn_cnn - Convolutional Neural Networks
+----------------------------------------------------------
+
+.. automodule:: emlearn_cnn
+ :members:
+
+
+.. _emlearn_neighbors:
+emlearn_neighbors - K Nearest Neighbors (KNN)
+---------------------------------------------------------
+
+.. automodule:: emlearn_neighbors
+ :members:
+
+
+.. _emlearn_fft:
+emlearn_fft - Fast Fourier Transform
+---------------------------------------------------------
+
+.. automodule:: emlearn_fft
+ :members:
+
+
+.. _emlearn_iir:
+emlearn_iir - Infinite Impulse Reponse filters
+---------------------------------------------------------
+
+.. automodule:: emlearn_iir
+ :members:
+
+
+.. _emlearn_arrayutils:
+emlearn_arrayutils - Efficient utilities for array.array
+---------------------------------------------------------
+
+.. automodule:: emlearn_arrayutils
+ :members:
+
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 0000000..e64d7fc
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,221 @@
+# -*- coding: utf-8 -*-
+#
+# Configuration file for the Sphinx documentation builder.
+#
+# This file does only contain a selection of the most common options. For a
+# full list see the documentation:
+# http://www.sphinx-doc.org/en/master/config
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+
+import os
+import sys
+import subprocess
+
+# Adjust path so we can find the .py files with API documentation
+sys.path.insert(0, os.path.abspath('../stubs'))
+
+# -- Project information -----------------------------------------------------
+
+project = 'emlearn-micropython'
+copyright = '2014-2025, Jon Nordby'
+author = 'Jon Nordby'
+
+# The short X.Y version
+version = ''
+# The full version, including alpha/beta/rc tags
+release = ''
+
+
+# -- General configuration ---------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#
+# needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ 'sphinx.ext.mathjax',
+ 'sphinx.ext.viewcode',
+ 'sphinx.ext.autodoc',
+ 'sphinx_autodoc_typehints',
+ 'sphinx.ext.doctest',
+ 'sphinx.ext.coverage',
+ 'sphinx.ext.autosectionlabel',
+ #'sphinx_gallery.gen_gallery',
+ 'myst_parser',
+ "sphinx.ext.intersphinx",
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+source_suffix = {
+ '.rst': 'restructuredtext',
+ '.md': 'markdown',
+}
+
+# The master toctree document.
+master_doc = 'index'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = 'en'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = None
+
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+#
+html_theme = "sphinx_rtd_theme"
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+#
+html_theme_options = {
+ "collapse_navigation": False,
+ 'navigation_depth': 3,
+ 'logo_only': True,
+}
+
+html_js_files = [
+ #'js/custom.js'
+]
+
+html_css_files = [
+ 'css/emlearn.css',
+]
+
+html_logo = '../brand/emlearn-micropython-logo-wordmark-wide-600px.png'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['static']
+
+# Custom sidebar templates, must be a dictionary that maps document names
+# to template names.
+#
+# The default sidebars (for documents that don't match any pattern) are
+# defined by theme itself. Builtin themes are using these templates by
+# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
+# 'searchbox.html']``.
+#
+# html_sidebars = {}
+
+
+# -- Options for HTMLHelp output ---------------------------------------------
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'emlearn_micropython_doc'
+
+
+# -- Options for LaTeX output ------------------------------------------------
+
+latex_elements = {
+ # The paper size ('letterpaper' or 'a4paper').
+ #
+ # 'papersize': 'letterpaper',
+
+ # The font size ('10pt', '11pt' or '12pt').
+ #
+ # 'pointsize': '10pt',
+
+ # Additional stuff for the LaTeX preamble.
+ #
+ # 'preamble': '',
+
+ # Latex figure (float) alignment
+ #
+ # 'figure_align': 'htbp',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+# author, documentclass [howto, manual, or own class]).
+latex_documents = [
+ (master_doc, 'emlearn-micropython.tex', 'emlearn-micropython Documentation',
+ 'Jon Nordby', 'manual'),
+]
+
+
+# -- Options for manual page output ------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ (master_doc, 'emlearn-micropython', 'emlearn-micropython Documentation',
+ [author], 1)
+]
+
+
+# -- Options for Texinfo output ----------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+# dir menu entry, description, category)
+texinfo_documents = [
+ (master_doc, 'emlearn-micropython', 'emlearn-micropython Documentation',
+ author, 'emlearn-micropython', 'One line description of project.',
+ 'Miscellaneous'),
+]
+
+
+# -- Options for Epub output -------------------------------------------------
+
+# Bibliographic Dublin Core info.
+epub_title = project
+
+# The unique identifier of the text. This can be a ISBN number
+# or the project homepage.
+#
+# epub_identifier = ''
+
+# A unique identification for the text.
+#
+# epub_uid = ''
+
+# A list of files that should not be packed into the epub file.
+epub_exclude_files = ['search.html']
+
+
+# -- Extension configuration -------------------------------------------------
+
+# -- Intersphinx
+intersphinx_mapping = {
+ "emlearn": ("https://emlearn.readthedocs.io/en/latest/", None),
+}
+
+# Sphinx defaults to automatically resolve *unresolved* labels using all your Intersphinx mappings.
+# This behavior has unintended side-effects, namely that documentations local references can
+# suddenly resolve to an external location. See also:
+# https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html#confval-intersphinx_disabled_reftypes
+intersphinx_disabled_reftypes = ["*"]
+
+# -- autodoc typehints
+always_document_param_types = True
+typehints_fully_qualified = True
+always_use_bars_union = True
+
+
diff --git a/docs/examples.rst b/docs/examples.rst
new file mode 100644
index 0000000..7da2c2c
--- /dev/null
+++ b/docs/examples.rst
@@ -0,0 +1,34 @@
+
+
+=========
+Examples
+=========
+
+.. _./examples/soundlevel_iir/:
+Soundlevel using IIR filters (soundlevel_iir)
+===============================================
+
+`Example on Github `_.
+
+
+.. _./examples/har_trees/:
+Human Activity Detection using classification trees (har_trees)
+==============================================================================================
+
+`Example on Github `_.
+
+
+.. _./examples/mnist_cnn/:
+Digits recognition using Convolutional Neural Networks (mnist_cnn)
+========================================================================
+
+`Example on Github `_.
+
+
+
+.. _./examples/xor_trees/:
+XOR classification using trees (xor_trees)
+========================================================================
+
+`Example on Github `_.
+
diff --git a/docs/external_modules.rst b/docs/external_modules.rst
new file mode 100644
index 0000000..dd5ba07
--- /dev/null
+++ b/docs/external_modules.rst
@@ -0,0 +1,80 @@
+
+.. Places parent toc into the sidebar
+:parenttoc: True
+
+.. _external_modules:
+
+===============================
+External modules
+===============================
+
+An alternative, much simpler, installation method is as :ref:`native_modules` (recommended).
+
+This method is more complicated, as it requires building MicroPython from scratch.
+Therefore it is only recommended for 1) platforms which do not support native modules,
+and 2) advanced users.
+
+Supported versions
+===========================
+
+For general information about supported MicroPython versions, see :ref:`support`.
+In principle, external modules should work on any hardware/port of MicroPython.
+
+
+Prerequisites
+===========================
+
+External modules are included into the build process of MicroPython itself.
+That means that you must have a MicroPython build environment set up,
+including neccesary build toolchains et.c.
+This process is specific for each MicroPython port.
+Refer to the relevant port/X/README.md in the `micropython git repository `_ for the setup.
+
+Always make sure that you can succesfully build and run the vanilla firmware
+(no external modules), before you add in emlearn-micropython.
+
+You need a git checkout of emlearn-micropython.
+For example as a git submodule in your project.
+
+::
+ git clone https://github.com/emlearn/emlearn-micropython.git
+
+
+Include external modules in build
+===================================
+
+emlearn-micropython contains both C modules, as well as Python modules.
+Therefore it is neccesary to use both the options *USER_C_MODULES* and *FROZEN_MANIFEST*.
+
+For details on this process, see official MicroPython documentation on
+`building with external modules `_.
+
+
+Example build
+----------------
+
+For platforms that use a cmake-based build system.
+
+::
+ make USER_C_MODULES=./emlearn-micropython/src/micropython.cmake \
+ FROZEN_MANIFEST=./emlearn-micropython/src/manifest.py \
+ CFLAGS_EXTRA='-Wno-unused-function -Wno-unused-function'
+
+
+For platforms that use a Makefile-based build.
+
+::
+
+ make USER_C_MODULES=./emlearn-micropython/src/ \
+ FROZEN_MANIFEST=./emlearn-micropython/src/manifest.py \
+ CFLAGS_EXTRA='-Wno-unused-function -Wno-unused-function'
+
+
+Combining multiple modules
+---------------------------
+
+If you want to add more C modules and/or frozen manifest,
+you will need to create your own `manifest.py` and `micropython.cmake` files.
+Use the ones in emlearn-micropython as a starting point.
+
+
diff --git a/docs/getting_started_device.rst b/docs/getting_started_device.rst
new file mode 100644
index 0000000..9fbe469
--- /dev/null
+++ b/docs/getting_started_device.rst
@@ -0,0 +1,120 @@
+
+.. Places parent toc into the sidebar
+
+:parenttoc: True
+
+.. _getting_started_device:
+
+==================================================
+Getting started on device (ESP32/RP2/STM32/etc)
+==================================================
+
+.. currentmodule:: emlearn-micropython
+
+emlearn-micropython runs on most hardware platforms that MicroPython does.
+
+
+Prerequisites
+===========================
+
+Ensure that you have **Python** and **emlearn** setup as per the :doc:`getting_started_host`.
+
+Ensure that you have MicroPython flashed onto your device.
+Check the `Download section `_ for MicroPython.
+
+Install mpremote
+===========================
+
+``mpremote`` is used to run scripts and copy files to/from a hardware device running MicroPython.
+
+.. code-block:: console
+
+ pip install mpremote
+
+
+Install emlearn-micropython modules
+====================================
+
+emlearn-micropython is distributed as a set of MicroPython native modules.
+These are .npy file with native code, that can be installed at runtime using **mip**.
+This example uses the ``emlearn_trees`` module, so that is what we will install.
+
+For ESP32 use the ``xtensawin`` architecture.
+
+.. code-block:: console
+
+ mpremote mip install https://emlearn.github.io/emlearn-micropython/builds/master/xtensawin_6.3/emlearn_trees.mpy
+
+For ARM Cortex M4F/M33/M7 etc use the ``armv7emsp`` architecture.
+
+.. code-block:: console
+
+ mpremote mip install https://emlearn.github.io/emlearn-micropython/builds/master/armv7emsp_6.3/emlearn_trees.mpy
+
+For more details about architectures for native modules, see `MicroPython mpyfiles documentation `_
+
+
+Create model in Python
+===========================
+
+We will train a simple model to learn the XOR function.
+The same steps will be used for model of any complexity.
+Copy and save this as file ``xor_train.py``.
+
+.. literalinclude:: helloworld_xor/xor_train.py
+ :language: python
+ :emphasize-lines: 3-4,26,30
+ :linenos:
+
+Run the script
+
+.. code-block:: console
+
+ python xor_train.py
+
+It will generate a file ``xor_model.csv`` containing the C code for our model.
+
+
+Use in MicroPython code
+========================
+
+To run our model we use a simple MicroPython program.
+
+Copy and save this as file ``xor_run.py``.
+
+.. literalinclude:: helloworld_xor/xor_run.py
+ :language: python
+ :emphasize-lines: 3,10,23
+ :linenos:
+
+
+Try it out
+========================
+
+In our training data input values above ``2**14`` is considered "true".
+So for the XOR function, if **one and only one** of the values is above this limit, should get class **1** as output - else class **0**.
+
+Run the program on device using ``mpremote run``:
+
+.. code-block:: console
+
+ mpremote run xor_host.py
+
+
+The output should be something like:
+
+.. code-block:: console
+
+ [0, 0] -> [1.0, 0.0] : False
+ [32767, 32767] -> [0.666, 0.333] : False
+ [0, 32767] -> [0.0, 1.0] : True
+ [32767, 0] -> [0.0, 1.0] : True
+
+Next
+========
+
+Now you have the emlearn-micropython on running hardware.
+For information on practical usecases, see :doc:`examples`.
+Otherwise check out :doc:`api_reference`.
+
+
diff --git a/docs/getting_started_host.rst b/docs/getting_started_host.rst
new file mode 100644
index 0000000..43b62cf
--- /dev/null
+++ b/docs/getting_started_host.rst
@@ -0,0 +1,130 @@
+
+.. Places parent toc into the sidebar
+
+:parenttoc: True
+
+.. _getting_started_host:
+
+=========================
+Getting started on PC (Linux/MacOS/Windows)
+=========================
+
+.. currentmodule:: emlearn-micropython
+
+emlearn-micropython runs on most platforms that MicroPython does.
+This includes common desktop platforms such as Linux, Mac OS, Windows, et.c.
+Since you need such a host platform to develop the Python machine-learning,
+it is convenient also to do the first tests of the model on the host.
+
+
+Prerequisites
+===========================
+
+You need to have installed **Python** (version 3.10+),
+and a **C99 compiler** for your platform (GCC/Clang/MSVC).
+
+On Windows, the **Windows Subsystem for Linux (WSL)** is recommended.
+
+Install scikit-learn
+===========================
+
+In this example, **scikit-learn** is used to train the models.
+
+.. code-block:: console
+
+ pip install scikit-learn
+
+Install emlearn
+===========================
+
+The **emlearn** Python package will be used to convert the scikit-learn models
+to something that can be loaded with emlearn-micropython.
+
+.. code-block:: console
+
+ pip install emlearn
+
+
+Install MicroPython Unix port
+==================================
+
+We need to have the ``micropython`` interpreter installed.
+
+Install the Unix port of MicroPython by following the `unix port documentation `_
+
+
+Install emlearn-micropython modules
+====================================
+
+emlearn-micropython is distributed as a set of MicroPython native modules.
+These are .npy file with native code, that can be installed at runtime using **mip**.
+This example uses the ``emlearn_trees`` module, so that is what we will install.
+
+.. code-block:: console
+
+ micropython -m mip install https://emlearn.github.io/emlearn-micropython/builds/master/x64_6.3/emlearn_trees.mpy
+
+Create model in Python
+===========================
+
+We will train a simple model to learn the XOR function.
+The same steps will be used for model of any complexity.
+Copy and save this as file ``xor_train.py``.
+
+.. literalinclude:: helloworld_xor/xor_train.py
+ :language: python
+ :emphasize-lines: 3-4,26,30
+ :linenos:
+
+Run the script
+
+.. code-block:: console
+
+ python xor_train.py
+
+It will generate a file ``xor_model.csv`` containing the C code for our model.
+
+
+Use in MicroPython code
+========================
+
+To run our model we use a simple MicroPython program.
+
+Copy and save this as file ``xor_run.py``.
+
+.. literalinclude:: helloworld_xor/xor_run.py
+ :language: python
+ :emphasize-lines: 3,10,23
+ :linenos:
+
+
+Try it out
+========================
+
+In our training data input values above ``2**14`` is considered "true".
+So for the XOR function, if **one and only one** of the values is above this limit, should get class **1** as output - else class **0**.
+
+Run the program using `micropython`:
+
+.. code-block:: console
+
+ micropython xor_host.py
+
+
+The output should be something like:
+
+.. code-block:: console
+
+ [0, 0] -> [1.0, 0.0] : False
+ [32767, 32767] -> [0.666, 0.333] : False
+ [0, 32767] -> [0.0, 1.0] : True
+ [32767, 0] -> [0.0, 1.0] : True
+
+
+Next
+========
+
+Now you have the emlearn-micropython running on your PC.
+You may be interested in trying it out on a hardware device.
+See for example :doc:`getting_started_device`.
+
diff --git a/docs/helloworld_xor/.gitignore b/docs/helloworld_xor/.gitignore
new file mode 100644
index 0000000..5327144
--- /dev/null
+++ b/docs/helloworld_xor/.gitignore
@@ -0,0 +1,3 @@
+xor_browser.js
+xor_browser.wasm
+xor_model.h
diff --git a/docs/helloworld_xor/xor_run.py b/docs/helloworld_xor/xor_run.py
new file mode 100644
index 0000000..e916ad5
--- /dev/null
+++ b/docs/helloworld_xor/xor_run.py
@@ -0,0 +1,26 @@
+# device/micropython code
+
+import emlearn_trees
+import array
+
+model = emlearn_trees.new(5, 30, 2)
+
+# Load a CSV file with the model
+with open('xor_model.csv', 'r') as f:
+ emlearn_trees.load_model(model, f)
+
+# run it
+max_val = (2**15-1) # 1.0 as int16
+examples = [
+ array.array('h', [0, 0]),
+ array.array('h', [max_val, max_val]),
+ array.array('h', [0, max_val]),
+ array.array('h', [max_val, 0]),
+]
+
+out = array.array('f', range(model.outputs()))
+for ex in examples:
+ model.predict(ex, out)
+ result = out[1] > 0.5
+ print(list(ex), '->', list(out), ':', result)
+
diff --git a/docs/helloworld_xor/xor_train.py b/docs/helloworld_xor/xor_train.py
new file mode 100644
index 0000000..a9fff47
--- /dev/null
+++ b/docs/helloworld_xor/xor_train.py
@@ -0,0 +1,31 @@
+# python/host code
+
+import emlearn
+from emlearn.preprocessing import Quantizer
+import numpy
+from sklearn.ensemble import RandomForestClassifier
+from sklearn.metrics import get_scorer
+
+# Generate simple dataset
+def make_xor(lower=0.0, upper=1.0, threshold=0.5, samples=100, seed=42):
+ rng = numpy.random.RandomState(seed)
+ X = rng.uniform(lower, upper, size=(samples, 2))
+ y = numpy.logical_xor(X[:, 0] > threshold, X[:, 1] > threshold)
+ X = Quantizer(max_value=1.0).fit_transform(X) # convert to int16
+ return X, y
+
+X, y = make_xor()
+
+# Train a model
+estimator = RandomForestClassifier(n_estimators=3, max_depth=3, max_features=2, random_state=1)
+estimator.fit(X, y)
+score = get_scorer('f1')(estimator, X, y)
+assert score > 0.90, score # verify that we learned the function
+
+# Convert model using emlearn
+cmodel = emlearn.convert(estimator, method='inline')
+
+# Save as loadable .csv file
+path = 'xor_model.csv'
+cmodel.save(file=path, name='xor', format='csv')
+print('Wrote model to', path)
diff --git a/docs/images/emlearn-logo-wordmark-wide-600px.png b/docs/images/emlearn-logo-wordmark-wide-600px.png
new file mode 100644
index 0000000..ef65069
Binary files /dev/null and b/docs/images/emlearn-logo-wordmark-wide-600px.png differ
diff --git a/docs/images/event_detection_labels_windows.png b/docs/images/event_detection_labels_windows.png
new file mode 100644
index 0000000..334d941
Binary files /dev/null and b/docs/images/event_detection_labels_windows.png differ
diff --git a/docs/index.rst b/docs/index.rst
new file mode 100644
index 0000000..2347786
--- /dev/null
+++ b/docs/index.rst
@@ -0,0 +1,23 @@
+.. emlearn-micropython documentation master file
+
+Welcome to emlearn-micropython's documentation!
+===================================
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Contents
+
+ source/README.md
+ user_guide
+ examples
+ api_reference
+ more
+ source/LICENSE.md
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/docs/more.rst b/docs/more.rst
new file mode 100644
index 0000000..461cd92
--- /dev/null
+++ b/docs/more.rst
@@ -0,0 +1,75 @@
+
+.. Places parent toc into the sidebar
+:parenttoc: True
+
+.. _more:
+
+=========================
+More
+=========================
+
+emlearn documentation
+===========================
+
+Many general topics relevant to emlearn-micropython are covered in the emlearn documentation.
+This includes:
+
+- :doc:`emlearn:feature_extraction`
+- :doc:`emlearn:classification`
+- :doc:`emlearn:regression`
+- :doc:`emlearn:anomaly_detection`
+- :doc:`emlearn:model_optimization`
+- :doc:`emlearn:tree_based_models`
+
+Presentations
+====================
+
+emlearn-micropython has been covered in the following presentations.
+
+
+Microcontrollers + Machine Learning in 1-2-3
+------------------------------------------------------------------
+
+Presented at PyData Global 2024, by Jon Nordby
+
+`Video recording (YouTube) `_.
+
+`Slides and notes `_.
+
+
+MicroPython - Python for microcontrollers and embedded linux
+-------------------------------------------------------------------------
+
+Presented at FOSDEM 2025, by Jon Nordby.
+Has a section on emlearn-micropython.
+
+`Video recording (YouTube) `_.
+
+`Slides and notes `_.
+
+
+Sensor data processing on microcontrollers with MicroPython and emlearn
+-------------------------------------------------------------------------
+
+Presented at PyConZA 2024, by Jon Nordby.
+
+Video recording: coming...
+
+`Slides and notes `_.
+
+
+Machine Learning on microcontrollers using MicroPython and emlearn
+------------------------------------------------------------------
+
+Presented at PyCon DE & PyData Berlin 2024, by Jon Nordby.
+
+`Video recording (YouTube) `_.
+
+`Slides and notes `_.
+
+
+Other resources
+====================
+Here is an overview of resources for `TinyML in general `_.
+
+
diff --git a/docs/native_modules.rst b/docs/native_modules.rst
new file mode 100644
index 0000000..0d23af2
--- /dev/null
+++ b/docs/native_modules.rst
@@ -0,0 +1,109 @@
+
+.. Places parent toc into the sidebar
+:parenttoc: True
+
+.. _native_modules:
+
+=========================
+Native modules
+=========================
+
+This is the recommended installation method on the majority of hardware platform,
+especially when getting started.
+An alternative, more complicated, installation method is documented in :ref:`external_modules`.
+
+
+Supported versions
+===========================
+
+The correct .mpy files to use depends on the CPU architecture of your microcontroller, as well as the MicroPython version.
+Information is also available in the official documentation: `MicroPython: .mpy files `_.
+
+The following are **supported** as native modules at this time:
+``x64``, ``armv7m``, ``armv7emsp``, ``xtensawin``.
+
+The following are **not supported**: ``rv32imc``, ``armv6m``, ``xtensa``, ``x86``.
+For these you will instead need to use :ref:`external_modules`.
+
+We hope to support ``arm6vm`` and ``rv32imc`` better in the future.
+There are no plans to support ``xtensa`` (ESP8266) or ``x86`` as native modules,
+as these are very old platforms.
+
+
+Find .mpy ABI version
+-------------------------
+
+The following is an overview of .mpy ABI version for MicroPython releases.
+
++---------------------+---------------+
+| MicroPython version | .mpy version |
++=====================+===============+
+| 1.25.x | 6.3 |
++---------------------+---------------+
+| 1.24.x | 6.3 |
++---------------------+---------------+
+| 1.23.x | 6.3 |
++---------------------+---------------+
+
+
+Find .mpy architecture
+-------------------------
+
+Identify which CPU architecture your device uses.
+You need to specify `ARCH` to install the correct module version.
+
++--------------+------------------------------------+------------------------+
+| ARCH | Description | Examples |
++==============+====================================+========================+
+| x64 | x86 64 bit | PC |
++--------------+------------------------------------+------------------------+
+| x86 | x86 32 bit | |
++--------------+------------------------------------+------------------------+
+| armv6m | ARM Thumb (1) | Cortex-M0 |
++--------------+------------------------------------+------------------------+
+| armv7m | ARM Thumb 2 | Cortex-M3 |
++--------------+------------------------------------+------------------------+
+| armv7emsp | ARM Thumb 2, single float | Cortex-M4F, Cortex-M7 |
++--------------+------------------------------------+------------------------+
+| armv7emdp | ARM Thumb 2, double floats | Cortex-M7 |
++--------------+------------------------------------+------------------------+
+| xtensa | non-windowed | ESP8266 |
++--------------+------------------------------------+------------------------+
+| xtensawin | windowed with window size 8 | ESP32, ESP32-S3 |
++--------------+------------------------------------+------------------------+
+| rv32imc | RISC-V | ESP32-C3, ESP32-C6 |
++--------------+------------------------------------+------------------------+
+
+
+
+Prebuilt native modules
+===========================
+
+All the modules in emlearn-micropython for supported architectures are available pre-built.
+You can `browse them on Github `_.
+And they are available over HTTPS.
+The directory structure is as follows:
+
+::
+
+ https://emlearn.github.io/emlearn-micropython/builds/$VERSION/$ARCH_$ABI/$MODULE.mpy
+
+ where:
+ VERSION=master|0.8.0
+ MODULE=emlearn_trees
+ ARCH=xtensawin
+ ABI=6.3
+
+
+Installing using mip
+===========================
+
+Native modules can be installed using the `mip package manager `_.
+
+
+For example, to install ``emlearn_trees`` for MicroPython 1.25 (ABI 6.3) on ESP32 (xtensawin), use:
+
+::
+
+ mpremote mip install https://emlearn.github.io/emlearn-micropython/builds/master/xtensawin_6.3/emlearn_trees.mpy
+
diff --git a/docs/notes.md b/docs/notes.md
new file mode 100644
index 0000000..24a9b1c
--- /dev/null
+++ b/docs/notes.md
@@ -0,0 +1,16 @@
+
+
+## TODO
+
+- Getting started for device
+- Getting started for host
+
+Computer vision section.
+Write a bit around Convolutional Neural Networks?
+Ideally would have hints about object detection also?
+
+## Later
+
+- How emlearn-micropython is implemented?
+Link to MicroPython native module documentation
+Link to array module
diff --git a/docs/source/LICENSE.md b/docs/source/LICENSE.md
new file mode 120000
index 0000000..f0608a6
--- /dev/null
+++ b/docs/source/LICENSE.md
@@ -0,0 +1 @@
+../../LICENSE.md
\ No newline at end of file
diff --git a/docs/source/README.md b/docs/source/README.md
new file mode 120000
index 0000000..fe84005
--- /dev/null
+++ b/docs/source/README.md
@@ -0,0 +1 @@
+../../README.md
\ No newline at end of file
diff --git a/docs/static/css/emlearn.css b/docs/static/css/emlearn.css
new file mode 100644
index 0000000..bb7694e
--- /dev/null
+++ b/docs/static/css/emlearn.css
@@ -0,0 +1,5 @@
+
+.wy-side-nav-search {
+ /* Make background light / near white, so that logo has good contrast */
+ background-color: #e4fdff;
+}
diff --git a/docs/static/js/custom.js b/docs/static/js/custom.js
new file mode 100644
index 0000000..1c411c0
--- /dev/null
+++ b/docs/static/js/custom.js
@@ -0,0 +1,43 @@
+
+window.addEventListener('load', (_event) => {
+ var menu = document.querySelector(".wy-menu ul li:first-child")
+ recurse(menu)
+});
+
+/**
+ * Given a Node, it recursively goes through every child and checks if the child is expandable, it
+ * expands it unless it is already expanded.
+ *
+ * @param {Node} node
+ */
+function recurse(node) {
+ if (is_expandable(node) && !is_expanded(node)) {
+ node.classList.add("current")
+ }
+
+ // By default, children are not arrays, so we need to convert them
+ children = Array.prototype.slice.call(node.children)
+
+ children.forEach(recurse)
+}
+
+/**
+ * Returns whether or not the given node is an expandable list.
+ *
+ * @param {Node} node
+ * @returns {boolean} true if the node is a toctree that can be expanded, false otherwise.
+ */
+function is_expandable(node) {
+ return node.className.includes("toctree-l")
+}
+
+/**
+ * Returns whether or not the given expandable node is already expanded.
+ * Nodes are considered expandaded if they are 'current'ly selected, so we take advantage of this.
+ *
+ * @param {Node} node
+ * @returns {boolean} true if the node is already expanded, false otherwise.
+ */
+function is_expanded(node) {
+ return node.classList.contains("current")
+}
diff --git a/docs/support.rst b/docs/support.rst
new file mode 100644
index 0000000..e9b8c9c
--- /dev/null
+++ b/docs/support.rst
@@ -0,0 +1,37 @@
+
+.. Places parent toc into the sidebar
+:parenttoc: True
+
+.. _support:
+
+===============================
+Supported versions
+===============================
+
+
+Supported MicroPython versions
+==============================
+
+At any given point in time, emlearn-micropython only supports one MicroPython version.
+In general we strongly encourage people to use the latest version.
+There are no long-term-support or bugfix versions of emlearn-micropython, at this point.
+
+================== ======================
+MicroPython emlearn-micropython
+================== ======================
+1.25.x master
+1.25.x 0.8.x
+1.24.x 0.7.0
+1.23.x 0.6.0
+================== ======================
+
+If you build emlearn-micropython from source,
+it might also work on a couple of MicroPython versions around the time of the commit, but this is not guaranteed.
+
+
+Supported hardware
+===========================
+
+Due to limitations in MicroPython support for C modules,
+the hardware support is a bit different for :ref:`native_modules` (recommended)
+versus :ref:`external_modules` (advanced).
diff --git a/docs/user_guide.rst b/docs/user_guide.rst
new file mode 100644
index 0000000..6681c6d
--- /dev/null
+++ b/docs/user_guide.rst
@@ -0,0 +1,22 @@
+.. Places parent toc into the sidebar
+
+:parenttoc: True
+
+.. title:: User guide: contents
+
+.. _user_guide:
+
+==========
+User Guide
+==========
+
+.. toctree::
+ :numbered:
+ :maxdepth: 3
+
+ getting_started_host.rst
+ getting_started_device.rst
+ support.rst
+ native_modules.rst
+ external_modules.rst
+
diff --git a/examples/har_trees/README.md b/examples/har_trees/README.md
index 2b79a5d..40b9caa 100644
--- a/examples/har_trees/README.md
+++ b/examples/har_trees/README.md
@@ -189,7 +189,7 @@ mpremote run har_record.py
Alternatively: Copy the program to device.
This way it will run even if there is no USB device connected.
```
-mpremote cp har_record.py main.py
+mpremote cp har_record.py :main.py
mpremote reset
```
diff --git a/examples/har_trees/har_run.py b/examples/har_trees/har_run.py
index efdaa70..ec476f8 100644
--- a/examples/har_trees/har_run.py
+++ b/examples/har_trees/har_run.py
@@ -65,7 +65,7 @@ def main():
model = emlearn_trees.new(10, 1000, 10)
dataset = 'har_uci'
- dataset = 'har_exercise_1'
+ #dataset = 'har_exercise_1'
model_path = f'{dataset}_trees.csv'
diff --git a/examples/mnist_cnn/README.md b/examples/mnist_cnn/README.md
index 5e94450..14e93c1 100644
--- a/examples/mnist_cnn/README.md
+++ b/examples/mnist_cnn/README.md
@@ -30,7 +30,7 @@ python mnist_train.py
## Running on host
```console
-micropython -m mip install https://emlearn.github.io/emlearn-micropython/builds/master/x64_6.3/emlearn_cnn.mpy
+micropython -m mip install https://emlearn.github.io/emlearn-micropython/builds/master/x64_6.3/emlearn_cnn_int8.mpy
micropython mnist_cnn_run.py
```
@@ -50,11 +50,11 @@ Flash your device with a standard MicroPython firmware,
from the MicroPython.org downloads page.
```console
-mpremote mip install https://emlearn.github.io/emlearn-micropython/builds/master/xtensawin_6.3/emlearn_cnn.mpy
+mpremote mip install https://emlearn.github.io/emlearn-micropython/builds/master/xtensawin_6.3/emlearn_cnn_int8.mpy
```
```console
-mpremote cp mnist_cnn.tmdl :
+mpremote cp mnist_cnn_int8.tmdl :
mpremote cp -r test_data/ :
mpremote run mnist_cnn_run.py
```
diff --git a/examples/mnist_cnn/mnist_cnn.h b/examples/mnist_cnn/mnist_cnn.h
deleted file mode 100644
index 08205c0..0000000
--- a/examples/mnist_cnn/mnist_cnn.h
+++ /dev/null
@@ -1,254 +0,0 @@
-#ifndef __MODEL_FILE__H
-#define __MODEL_FILE__H
-
-#include
-#define MDL_BUF_LEN (2136)
-#define LBUF_LEN (2232)
-const uint8_t mdl_data[3912]={\
- 0x4d, 0x41, 0x49, 0x58, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x58, 0x08, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
- 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00,
- 0x03, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x08, 0x00,
- 0x81, 0x80, 0x80, 0x3b, 0x80, 0xff, 0xff, 0xff, 0xed, 0xea, 0x86, 0x3c, 0x80, 0xff, 0xff, 0xff,
- 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00,
- 0x4f, 0x03, 0x43, 0x3c, 0xff, 0xaf, 0x2d, 0x3c, 0xbd, 0x82, 0x41, 0x3c, 0x07, 0x2c, 0x4a, 0x3c,
- 0x1a, 0x13, 0x7e, 0x3c, 0x19, 0xe0, 0xb0, 0x3c, 0x80, 0x3f, 0x7d, 0x3c, 0xf9, 0xa8, 0xbc, 0x3b,
- 0x96, 0x3c, 0x36, 0x81, 0x30, 0x43, 0xcb, 0x4d, 0x33, 0x62, 0xb1, 0x81, 0x68, 0x5c, 0x8b, 0x33,
- 0x66, 0xf7, 0x1b, 0xb5, 0x96, 0x14, 0x89, 0x57, 0xa4, 0x81, 0x34, 0xb4, 0x3f, 0x59, 0xfb, 0xdf,
- 0x56, 0xbc, 0x81, 0x20, 0x81, 0xab, 0xba, 0x06, 0x0f, 0xfb, 0x18, 0x3f, 0x3a, 0x81, 0x17, 0x07,
- 0xed, 0xb3, 0xfb, 0x08, 0x0b, 0xc1, 0xb2, 0x81, 0xcf, 0x4d, 0x30, 0xbd, 0x56, 0x43, 0x00, 0xe7,
- 0x32, 0x65, 0x4b, 0xfb, 0x7f, 0x5a, 0x2d, 0x7c, 0x1c, 0x1e, 0x00, 0x00, 0xe3, 0x28, 0x00, 0x00,
- 0x35, 0xa2, 0xff, 0xff, 0x76, 0xf1, 0xff, 0xff, 0x21, 0xda, 0xff, 0xff, 0x42, 0xbb, 0xff, 0xff,
- 0x41, 0xe7, 0xff, 0xff, 0x86, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00,
- 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x08, 0x00,
- 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0c, 0x00, 0xed, 0xea, 0x86, 0x3c, 0x80, 0xff, 0xff, 0xff,
- 0x3d, 0x08, 0x7e, 0x3c, 0x80, 0xff, 0xff, 0xff, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
- 0x80, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x3c, 0x8e, 0x77, 0x3b, 0x94, 0x22, 0x2c, 0x3b,
- 0x11, 0x30, 0xa8, 0x3b, 0xc1, 0x4a, 0x37, 0x3b, 0x53, 0x1b, 0x20, 0x3b, 0xd0, 0x77, 0x37, 0x3b,
- 0x44, 0xfa, 0x20, 0x3b, 0xef, 0x62, 0xf8, 0x3a, 0xa6, 0xf0, 0x5a, 0x3b, 0xc5, 0xf1, 0x82, 0x3b,
- 0xc1, 0x4a, 0x4c, 0x3b, 0xcf, 0x27, 0xa3, 0x3b, 0x38, 0x31, 0x0c, 0x1a, 0xb5, 0xd0, 0x15, 0xbf,
- 0xea, 0x54, 0x0d, 0xcf, 0x00, 0xa3, 0x9e, 0xc4, 0xac, 0xec, 0x27, 0x0c, 0x0b, 0xd9, 0x18, 0x12,
- 0x29, 0xeb, 0x2a, 0xff, 0x04, 0xe9, 0x06, 0x11, 0x05, 0x29, 0xdf, 0xdc, 0x02, 0x11, 0xf1, 0xd2,
- 0x7f, 0x60, 0x3e, 0x3c, 0x3b, 0x35, 0xb4, 0xb8, 0x69, 0x23, 0xe2, 0x2f, 0xb8, 0xc0, 0xc4, 0xd0,
- 0x0f, 0xeb, 0xb1, 0x35, 0x0d, 0x0a, 0xf1, 0x11, 0x35, 0x2c, 0x03, 0x00, 0xdd, 0x95, 0xc3, 0x37,
- 0x2e, 0x34, 0xf5, 0x27, 0x2b, 0xd2, 0xc8, 0x95, 0x90, 0x4c, 0x24, 0x22, 0x40, 0x29, 0xfe, 0xd8,
- 0xed, 0xe1, 0x27, 0xea, 0x07, 0xf7, 0xc0, 0x94, 0x1e, 0xcf, 0xc3, 0x1e, 0x26, 0x3a, 0xe4, 0xe8,
- 0x0a, 0x17, 0xeb, 0x06, 0xc5, 0xaf, 0x02, 0xb2, 0xf6, 0xf7, 0x96, 0x38, 0xd9, 0xda, 0x21, 0x0c,
- 0xcd, 0xe7, 0xba, 0x17, 0x7f, 0x33, 0xfc, 0x03, 0xef, 0xf6, 0xdd, 0x0c, 0x88, 0xe3, 0x1a, 0x08,
- 0xf8, 0xd2, 0x5a, 0x70, 0x1d, 0xfd, 0x02, 0xf0, 0xc7, 0xa8, 0xfd, 0xe5, 0xb3, 0xd0, 0x0a, 0xf7,
- 0xf2, 0x97, 0xd1, 0xe2, 0xea, 0x01, 0x11, 0x17, 0xf9, 0xfb, 0xd0, 0x81, 0xee, 0xfe, 0x9b, 0xae,
- 0xef, 0xd8, 0xcf, 0x17, 0x45, 0x14, 0x0e, 0x2d, 0x10, 0x0f, 0x1d, 0x15, 0x5b, 0x37, 0x14, 0x22,
- 0x23, 0x05, 0xf0, 0xe4, 0xef, 0x75, 0x52, 0x23, 0x17, 0x2d, 0x4d, 0xe5, 0x0a, 0x19, 0x19, 0x33,
- 0x15, 0x07, 0x25, 0x09, 0x0f, 0x41, 0x28, 0xe1, 0xf4, 0xce, 0xd2, 0x1d, 0x1f, 0xdb, 0xf8, 0x25,
- 0x40, 0x14, 0x2a, 0x4e, 0x2a, 0x1a, 0x15, 0x17, 0xe8, 0xad, 0xeb, 0xdb, 0xf3, 0x07, 0x11, 0xfd,
- 0xd7, 0xf9, 0x1d, 0x03, 0x06, 0x1a, 0x47, 0x59, 0xe3, 0x27, 0x16, 0x20, 0x3e, 0x09, 0x10, 0x01,
- 0xb6, 0xf5, 0xc8, 0xf9, 0x73, 0x1d, 0xfd, 0x19, 0xe2, 0xf8, 0x3c, 0xee, 0x0f, 0x7d, 0x1a, 0xe6,
- 0x52, 0xd3, 0xda, 0x14, 0x0c, 0x45, 0xaf, 0xef, 0xd7, 0xce, 0x01, 0xa3, 0xc8, 0xd5, 0x96, 0xa2,
- 0xdf, 0xcc, 0x02, 0x08, 0x9d, 0x40, 0x51, 0x81, 0xfb, 0xe1, 0xb3, 0xf1, 0xc9, 0xad, 0x0c, 0xdb,
- 0xe3, 0xb6, 0x0c, 0xb0, 0xce, 0xda, 0xac, 0xe0, 0xb1, 0xdd, 0x2e, 0x1f, 0x60, 0x0d, 0x23, 0x3c,
- 0x07, 0x1e, 0x41, 0x10, 0xdb, 0xd5, 0x0b, 0xff, 0xa5, 0xf6, 0xac, 0x9d, 0x54, 0x10, 0x2d, 0x30,
- 0x0d, 0x2a, 0x37, 0x11, 0xf2, 0x7b, 0x2d, 0x30, 0x5f, 0x3d, 0xd7, 0x59, 0xfd, 0x25, 0x9c, 0xf7,
- 0xac, 0x8f, 0xdc, 0xbf, 0xd5, 0xf3, 0xd7, 0xe6, 0xd3, 0xe0, 0xf3, 0x7f, 0x4b, 0xd7, 0x45, 0xec,
- 0xf3, 0xe5, 0xe6, 0xfb, 0xf4, 0x03, 0x12, 0xea, 0x20, 0x57, 0x1e, 0xd9, 0x0f, 0x02, 0xda, 0x0d,
- 0xe9, 0xf2, 0xaf, 0xb6, 0x98, 0x28, 0x69, 0x58, 0x0d, 0x44, 0x7f, 0xf7, 0x10, 0x00, 0x18, 0xd4,
- 0xf5, 0x37, 0x2e, 0xfd, 0xff, 0x0e, 0x24, 0x0b, 0xe1, 0xcb, 0x16, 0xde, 0x91, 0xbb, 0xb0, 0x8a,
- 0x14, 0x2b, 0xe4, 0x07, 0xfd, 0x04, 0x04, 0xe8, 0x1f, 0xf6, 0xc0, 0xb5, 0xf0, 0xe1, 0xe8, 0x45,
- 0x3a, 0x0b, 0x1f, 0xf8, 0xe3, 0xda, 0xfa, 0xc0, 0x29, 0x47, 0x21, 0x0c, 0x4f, 0x3d, 0x11, 0x5d,
- 0x52, 0x55, 0x35, 0x43, 0x0f, 0x0d, 0xfe, 0x15, 0x5b, 0x23, 0xf5, 0x24, 0x43, 0x05, 0x45, 0x19,
- 0xe4, 0x22, 0x01, 0x12, 0x35, 0x30, 0x28, 0x47, 0x68, 0x29, 0x10, 0x1b, 0x9e, 0xb2, 0xc1, 0xc4,
- 0x8a, 0x82, 0xd8, 0x88, 0x90, 0xeb, 0x01, 0xf2, 0x39, 0x2e, 0xf1, 0x38, 0x10, 0x81, 0xdd, 0x14,
- 0x04, 0xfb, 0xdf, 0xf6, 0x0b, 0xf8, 0xf5, 0x11, 0xa4, 0x12, 0xac, 0xe9, 0xdf, 0xaa, 0x44, 0x41,
- 0xf9, 0x27, 0x00, 0xdd, 0xc5, 0xfd, 0x1f, 0xdc, 0x38, 0x72, 0x40, 0xf9, 0x42, 0x05, 0xd5, 0x25,
- 0xef, 0x08, 0xca, 0xa0, 0xb5, 0xe3, 0x94, 0xca, 0xad, 0x81, 0xed, 0xfd, 0x0d, 0x5b, 0x36, 0x3d,
- 0x45, 0x2c, 0x01, 0x15, 0xa7, 0x8e, 0xc6, 0xc7, 0xa2, 0xfa, 0xac, 0xf3, 0xde, 0xcf, 0xba, 0xc4,
- 0x4b, 0x2d, 0x0a, 0xfc, 0xec, 0xa0, 0xf8, 0x1f, 0x60, 0x2c, 0x60, 0x6b, 0x3e, 0x2b, 0xf4, 0x34,
- 0x1f, 0x65, 0xe2, 0xd7, 0x5f, 0x0e, 0xd6, 0x05, 0x0a, 0xff, 0xbd, 0x13, 0xf4, 0xd8, 0x31, 0x37,
- 0x27, 0xb2, 0x1c, 0x45, 0xf6, 0x14, 0x03, 0xec, 0x3b, 0x22, 0x60, 0x48, 0xf3, 0x24, 0xe8, 0xc6,
- 0x26, 0x10, 0x0c, 0xe3, 0xb5, 0x08, 0x1a, 0xf5, 0xeb, 0x20, 0x1a, 0x01, 0x46, 0xf9, 0x21, 0xf7,
- 0xa0, 0xe4, 0xb9, 0xd8, 0xe5, 0x71, 0x12, 0x5f, 0x7f, 0x3c, 0x46, 0x2d, 0x13, 0xf8, 0xb6, 0xff,
- 0x27, 0xbb, 0x07, 0x26, 0xd7, 0x05, 0xfa, 0xaa, 0xce, 0xc5, 0xd6, 0xee, 0x0d, 0x16, 0xf9, 0x20,
- 0x09, 0x47, 0x01, 0x10, 0x21, 0xda, 0x0c, 0x2b, 0x12, 0x1d, 0x3a, 0x22, 0x16, 0x2a, 0x1a, 0x0a,
- 0x14, 0x21, 0xf9, 0x64, 0x32, 0x25, 0x7f, 0x3b, 0x3a, 0x49, 0x1b, 0xfc, 0xb3, 0xc1, 0x07, 0x9c,
- 0xff, 0xfb, 0xe9, 0xf4, 0xdb, 0xfa, 0x4a, 0xb1, 0xba, 0xd9, 0xde, 0xc6, 0xc2, 0xe3, 0x4d, 0x04,
- 0xc8, 0x29, 0xf9, 0xa5, 0xe4, 0x23, 0x0b, 0xc4, 0xc1, 0x0a, 0xaf, 0x99, 0xee, 0xbc, 0xd7, 0x48,
- 0x0a, 0xbf, 0x0d, 0xf3, 0xdd, 0x1e, 0xf2, 0xba, 0xcf, 0xf6, 0x55, 0xff, 0x13, 0x2b, 0x1b, 0x23,
- 0xf8, 0x35, 0x64, 0x70, 0xf2, 0x19, 0x2a, 0x13, 0x05, 0x0c, 0x81, 0x03, 0x6e, 0xe8, 0x2d, 0x5f,
- 0x01, 0x15, 0xf2, 0x34, 0x5b, 0x34, 0x03, 0xfd, 0xfc, 0x02, 0xa9, 0xd3, 0xbb, 0x9e, 0xb8, 0x1d,
- 0xd3, 0xb6, 0x26, 0x16, 0xf2, 0x3c, 0x58, 0x5a, 0x1e, 0xf4, 0xbe, 0x98, 0x9d, 0xa0, 0x55, 0x66,
- 0x1d, 0x56, 0x0a, 0xe2, 0xfa, 0xb0, 0xba, 0xee, 0x03, 0xeb, 0x41, 0xf7, 0xf4, 0x42, 0x08, 0x1c,
- 0x0f, 0xea, 0xf4, 0xf6, 0x14, 0x17, 0xef, 0x08, 0x36, 0xea, 0xe2, 0xff, 0x08, 0xe8, 0x06, 0xf0,
- 0xfd, 0x08, 0x0a, 0xfc, 0x42, 0xde, 0x42, 0x42, 0x09, 0x2f, 0x3a, 0xf6, 0xfa, 0xda, 0x05, 0x04,
- 0x01, 0xf3, 0xf8, 0x1a, 0x2f, 0x2f, 0x30, 0x37, 0xe6, 0xf0, 0x25, 0x03, 0xe1, 0x49, 0x44, 0x28,
- 0xfc, 0xcf, 0xce, 0xf0, 0x98, 0x81, 0x04, 0xfc, 0xdd, 0xef, 0x20, 0xf5, 0x0a, 0xf6, 0xcf, 0xf1,
- 0xda, 0x0d, 0xf4, 0x04, 0x17, 0xfe, 0x11, 0xff, 0xc2, 0xc0, 0xff, 0xff, 0x8d, 0x56, 0xff, 0xff,
- 0x3e, 0x1a, 0x00, 0x00, 0x10, 0xdb, 0xff, 0xff, 0x0f, 0xf4, 0xfe, 0xff, 0xc6, 0x89, 0xff, 0xff,
- 0x22, 0xe9, 0x00, 0x00, 0x15, 0x34, 0x00, 0x00, 0xda, 0x4d, 0x00, 0x00, 0x15, 0x93, 0xff, 0xff,
- 0x54, 0xde, 0x00, 0x00, 0x79, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x08, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0c, 0x00,
- 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x12, 0x00, 0x3d, 0x08, 0x7e, 0x3c, 0x80, 0xff, 0xff, 0xff,
- 0x77, 0x36, 0x2b, 0x3d, 0x80, 0xff, 0xff, 0xff, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
- 0x98, 0x00, 0x00, 0x00, 0x30, 0x08, 0x00, 0x00, 0x82, 0x18, 0x7f, 0x3c, 0x20, 0x98, 0x31, 0x3c,
- 0x60, 0x7d, 0x25, 0x3c, 0xb5, 0x9a, 0x0a, 0x3c, 0x41, 0xf4, 0x5b, 0x3c, 0x64, 0xaa, 0x09, 0x3c,
- 0xc9, 0xee, 0x14, 0x3c, 0xfd, 0x49, 0x1f, 0x3c, 0xf0, 0xb7, 0xf4, 0x3b, 0x49, 0x12, 0x15, 0x3c,
- 0xe2, 0x4e, 0x06, 0x3c, 0xa8, 0x85, 0x2b, 0x3c, 0x8c, 0xe0, 0x0b, 0x3c, 0x5d, 0x6b, 0x37, 0x3c,
- 0x23, 0xc5, 0x19, 0x3c, 0x5d, 0xc7, 0x21, 0x3c, 0x5b, 0x3b, 0x2e, 0x3c, 0xff, 0x23, 0x43, 0x3c,
- 0xf0, 0xf8, 0xf0, 0xdb, 0xed, 0xf0, 0xcd, 0xd1, 0x0e, 0xe5, 0xe5, 0x09, 0x09, 0xdc, 0xe5, 0x24,
- 0xf4, 0x07, 0x0a, 0x1c, 0x23, 0xc4, 0xfc, 0x13, 0xd5, 0xa1, 0xf4, 0xee, 0xdd, 0x04, 0x2b, 0xda,
- 0xd2, 0xba, 0xe0, 0x00, 0x05, 0xda, 0xb5, 0x47, 0x7f, 0x0b, 0xd8, 0xd2, 0xcd, 0x00, 0xf3, 0x00,
- 0x02, 0xe2, 0xf4, 0x00, 0xd9, 0xde, 0xfc, 0x00, 0x42, 0xe7, 0xf4, 0xe2, 0xf3, 0x0d, 0x18, 0x0e,
- 0x07, 0x03, 0x06, 0x17, 0xdf, 0x2c, 0x1a, 0x03, 0x02, 0x0c, 0x13, 0xf0, 0xca, 0xb8, 0xf9, 0x00,
- 0x2f, 0xf1, 0xfa, 0x00, 0x97, 0xf3, 0x04, 0xcf, 0xe5, 0xf3, 0xdf, 0x33, 0x18, 0xfa, 0xdf, 0xc7,
- 0xe0, 0xd7, 0xe5, 0x06, 0xe3, 0xd8, 0x1e, 0x2d, 0x10, 0xf4, 0x13, 0x0d, 0x0c, 0x0d, 0x0b, 0x0a,
- 0x3e, 0x22, 0x24, 0x11, 0x09, 0x12, 0xcf, 0x1f, 0x17, 0xfd, 0xfe, 0xec, 0x1f, 0xf3, 0x70, 0x29,
- 0x0b, 0x35, 0xf4, 0xe5, 0xe9, 0xc8, 0xc8, 0x04, 0xef, 0x1d, 0x02, 0x35, 0x79, 0xfa, 0x38, 0x47,
- 0x1b, 0x23, 0xe7, 0xbb, 0x9a, 0x93, 0xe4, 0x4d, 0xdd, 0x27, 0x3e, 0xcb, 0x11, 0xef, 0xfe, 0xfd,
- 0x3a, 0x0a, 0xf5, 0x05, 0x0f, 0xfc, 0xdf, 0xcf, 0xee, 0x19, 0xea, 0x93, 0xed, 0xde, 0xca, 0xe8,
- 0x2f, 0xd0, 0xf1, 0xfe, 0xa8, 0x40, 0x20, 0xc6, 0xd8, 0x0b, 0xdc, 0xe5, 0xed, 0xca, 0x1d, 0x3a,
- 0x00, 0xf1, 0xcd, 0x0f, 0xe4, 0xde, 0x6e, 0x7f, 0x1b, 0x08, 0x6c, 0x29, 0xde, 0xf5, 0xd7, 0xf9,
- 0xf7, 0xf6, 0xd3, 0xe8, 0x11, 0xcf, 0xdc, 0x14, 0x28, 0x61, 0x03, 0x22, 0x4d, 0x11, 0x05, 0x28,
- 0x4d, 0xb7, 0x93, 0xf6, 0x81, 0xbf, 0xd0, 0xb6, 0xeb, 0x18, 0x60, 0x54, 0xf8, 0x54, 0x1b, 0xe5,
- 0x14, 0xe2, 0xd6, 0x17, 0xf4, 0xea, 0x0d, 0x25, 0x15, 0xcd, 0xe1, 0xf6, 0x03, 0x9d, 0x97, 0x2b,
- 0xf5, 0xfc, 0x05, 0xf7, 0xcb, 0xee, 0x21, 0x08, 0xd6, 0xbe, 0xae, 0xec, 0xc1, 0xde, 0xf7, 0xcb,
- 0x29, 0xe3, 0xbb, 0x15, 0xef, 0xda, 0x92, 0xb2, 0x0a, 0xf9, 0xe0, 0x21, 0x1b, 0xee, 0x04, 0xd2,
- 0xda, 0xda, 0x0d, 0xd7, 0x99, 0xc4, 0x11, 0xf3, 0x1d, 0x10, 0x1b, 0x62, 0xbd, 0x36, 0x33, 0x0d,
- 0xec, 0xed, 0xf3, 0x0c, 0x2f, 0x0c, 0x53, 0x59, 0xe6, 0x29, 0x28, 0xd8, 0xd1, 0xfe, 0xd6, 0xad,
- 0xcd, 0x14, 0xc5, 0xef, 0xfb, 0xd3, 0xcf, 0xbc, 0xf1, 0xdb, 0xe5, 0x00, 0x00, 0xc9, 0x39, 0xef,
- 0x24, 0x0e, 0x13, 0xed, 0x20, 0x05, 0xb1, 0x81, 0xff, 0xcc, 0xa7, 0xac, 0x01, 0xe2, 0x06, 0xc1,
- 0x0a, 0x16, 0x1c, 0x6b, 0x7e, 0xe8, 0xff, 0x05, 0xb1, 0xf5, 0x5c, 0xf8, 0xc6, 0xd4, 0xab, 0x15,
- 0x01, 0xc7, 0xf6, 0xbb, 0xc4, 0xe3, 0xdd, 0xf5, 0x0d, 0xf8, 0xe7, 0xde, 0xde, 0x17, 0x44, 0x2c,
- 0xfd, 0x28, 0xe9, 0xb0, 0xd2, 0x29, 0x07, 0xd8, 0xca, 0xe9, 0xfc, 0xdd, 0xf3, 0x33, 0x46, 0xfd,
- 0x7e, 0x28, 0x29, 0x0c, 0xdf, 0x40, 0x3e, 0x10, 0x5b, 0x19, 0x2a, 0xfe, 0xb5, 0xc4, 0x0f, 0xe0,
- 0xeb, 0x29, 0x3a, 0x45, 0x20, 0xfc, 0x0f, 0x47, 0x41, 0x49, 0x30, 0x2e, 0x0b, 0xfe, 0xe5, 0x18,
- 0x08, 0x06, 0x03, 0xec, 0xd6, 0x04, 0xeb, 0x04, 0xf5, 0xfd, 0x02, 0x2f, 0x32, 0x04, 0x0b, 0x14,
- 0xf2, 0xe7, 0xfe, 0x31, 0x2c, 0xf3, 0xef, 0xd5, 0x0b, 0x1f, 0xe1, 0x1b, 0xdb, 0xf9, 0x12, 0x05,
- 0x33, 0xbc, 0xd7, 0x31, 0x38, 0x07, 0xfd, 0xed, 0xcf, 0xd0, 0xa8, 0x11, 0x35, 0xe1, 0x12, 0x05,
- 0xd8, 0xf4, 0xe9, 0x0c, 0x19, 0x1a, 0xea, 0x19, 0x52, 0x11, 0x38, 0x2c, 0xe1, 0x1f, 0xec, 0xed,
- 0x35, 0x2e, 0xac, 0xe9, 0x12, 0xeb, 0xf1, 0x11, 0x0f, 0x6b, 0x75, 0x25, 0x7f, 0x61, 0xcd, 0x02,
- 0x2d, 0xe6, 0x1f, 0x0f, 0xda, 0x1e, 0x03, 0xd3, 0xe8, 0xf6, 0x23, 0xdc, 0xd5, 0x39, 0x06, 0xe4,
- 0x48, 0x1e, 0xe9, 0x06, 0xfd, 0xf8, 0xec, 0x0a, 0x2e, 0x0c, 0xff, 0x29, 0xd4, 0xd7, 0xd0, 0x2a,
- 0xfd, 0xb5, 0x01, 0xdc, 0xf0, 0x4f, 0x37, 0xec, 0x3a, 0x17, 0xf4, 0x05, 0xd7, 0xc1, 0xbe, 0xc3,
- 0xc6, 0xda, 0x4f, 0xc2, 0xcc, 0x51, 0x27, 0x43, 0xfb, 0xf1, 0x1e, 0xb1, 0x8f, 0xa3, 0xef, 0x04,
- 0xf4, 0xe6, 0xea, 0x08, 0xfa, 0xa6, 0x0d, 0x0f, 0x47, 0x8a, 0xe2, 0x7f, 0xdf, 0x0e, 0x28, 0xfe,
- 0xf2, 0xf5, 0x5d, 0xf3, 0xc3, 0x16, 0xf9, 0x20, 0xc9, 0xc8, 0xe6, 0x51, 0x1a, 0x9d, 0xf5, 0x6a,
- 0x04, 0x05, 0xf6, 0x08, 0x18, 0x2a, 0x89, 0x69, 0x52, 0x7e, 0x1b, 0x10, 0x15, 0x3b, 0xd0, 0x86,
- 0xb6, 0xae, 0xbe, 0xd6, 0x09, 0x5a, 0x5e, 0xcf, 0x84, 0x3c, 0xfe, 0xb9, 0x64, 0x40, 0x02, 0xd2,
- 0x21, 0x68, 0xed, 0xd9, 0x0a, 0xea, 0xd8, 0x92, 0x96, 0xa7, 0xed, 0x05, 0xd9, 0x1e, 0x23, 0x01,
- 0xf6, 0x57, 0xfa, 0xff, 0x04, 0x03, 0x28, 0xcb, 0xae, 0xb1, 0xb6, 0xf3, 0xb5, 0x38, 0xef, 0xcd,
- 0xce, 0xfc, 0x02, 0x31, 0xf0, 0xe5, 0xea, 0x9a, 0xba, 0x34, 0x20, 0xf2, 0xca, 0x1c, 0xd0, 0xeb,
- 0x34, 0x11, 0x07, 0xfe, 0x43, 0xac, 0x81, 0x06, 0xfa, 0xe6, 0x1f, 0x39, 0x2d, 0x35, 0x05, 0x52,
- 0x13, 0x20, 0xd9, 0xd8, 0xfc, 0x0f, 0x10, 0x2d, 0x05, 0x0c, 0x6d, 0x1a, 0xf8, 0xcb, 0xf6, 0xf1,
- 0x2e, 0x37, 0xd9, 0xf4, 0x3d, 0xeb, 0xf5, 0xfd, 0x02, 0xe9, 0xe9, 0xb7, 0x93, 0x08, 0xde, 0x1d,
- 0x21, 0x1a, 0xe2, 0xe1, 0xf6, 0x31, 0x12, 0x04, 0xfd, 0xed, 0xee, 0x15, 0x2c, 0xd8, 0xd5, 0x0f,
- 0x42, 0x17, 0x42, 0x1f, 0xf3, 0xff, 0x0c, 0x30, 0xda, 0xfd, 0x45, 0x14, 0x0d, 0xdb, 0x03, 0xbb,
- 0x18, 0x1a, 0xfd, 0x07, 0x3f, 0x47, 0x39, 0x3a, 0x38, 0x0a, 0xd7, 0xf5, 0x33, 0xdf, 0xf3, 0xee,
- 0x30, 0xfa, 0xef, 0x34, 0x35, 0x29, 0x17, 0xfc, 0x37, 0xdd, 0xfa, 0x04, 0xce, 0x56, 0x49, 0x01,
- 0x7f, 0x78, 0x2f, 0x14, 0x2b, 0x2a, 0x01, 0x26, 0x2b, 0x3b, 0x01, 0x39, 0x11, 0x14, 0x06, 0x54,
- 0x16, 0xbb, 0xd7, 0x38, 0xd4, 0xf8, 0xd9, 0xdf, 0xef, 0xd0, 0x11, 0x13, 0xc7, 0xf8, 0x01, 0xf9,
- 0xf3, 0x13, 0x1c, 0xe5, 0xe5, 0xe9, 0x37, 0x2b, 0x01, 0x53, 0x55, 0x32, 0x07, 0xf9, 0xf1, 0x14,
- 0x38, 0x04, 0xfc, 0x02, 0xe3, 0xfc, 0xf5, 0xf2, 0x04, 0x40, 0x0a, 0x13, 0x32, 0xee, 0xf1, 0x1d,
- 0xa9, 0xfd, 0xf7, 0xc9, 0xe9, 0x03, 0xd2, 0xc4, 0xed, 0xf2, 0xeb, 0x47, 0xe6, 0x47, 0xee, 0x10,
- 0xcf, 0xa5, 0x34, 0xf1, 0xf0, 0xea, 0xe9, 0xc6, 0xaa, 0x28, 0x9f, 0xff, 0x0a, 0xf3, 0xf1, 0xca,
- 0xdd, 0x32, 0xe1, 0x35, 0xb3, 0x0f, 0xe5, 0xff, 0x46, 0x38, 0x1a, 0x46, 0x00, 0x3b, 0xb9, 0xd8,
- 0xdc, 0x04, 0xff, 0x01, 0x26, 0x25, 0xe9, 0xaf, 0x28, 0x0a, 0xc5, 0xf5, 0x3e, 0x41, 0x2d, 0x46,
- 0x2c, 0x67, 0x05, 0xda, 0x30, 0x14, 0x0f, 0x03, 0x05, 0x0f, 0x06, 0x1b, 0xe1, 0x8b, 0xdf, 0xa3,
- 0xf7, 0xb9, 0xda, 0x0b, 0x30, 0x06, 0x3f, 0xf8, 0x6e, 0x7f, 0xfe, 0x1a, 0x2f, 0x18, 0xb0, 0xd2,
- 0xa8, 0xc7, 0xc1, 0xe7, 0xdd, 0x06, 0x0c, 0x51, 0x2f, 0x2f, 0x2e, 0x08, 0xf3, 0x03, 0xc6, 0xc6,
- 0xb6, 0xa3, 0x9c, 0xdc, 0x9e, 0xf2, 0x18, 0x11, 0x03, 0xf1, 0xb7, 0x31, 0xdc, 0xd4, 0x34, 0x96,
- 0xab, 0xba, 0x9a, 0xde, 0xe4, 0xd0, 0xc7, 0x06, 0x40, 0xfe, 0x44, 0x29, 0xe1, 0x0a, 0xde, 0xce,
- 0xeb, 0xbc, 0xe3, 0xc4, 0x00, 0xd1, 0xcd, 0x1d, 0xfe, 0x0b, 0x92, 0x02, 0xca, 0xe7, 0x0b, 0xc6,
- 0xbe, 0xcb, 0xe6, 0x01, 0xde, 0x44, 0xf3, 0x0f, 0xfe, 0xf6, 0x02, 0x0c, 0xf9, 0x10, 0xe7, 0x19,
- 0x0f, 0xd8, 0x3f, 0x18, 0x81, 0x42, 0x0f, 0x07, 0x0f, 0xf5, 0xfb, 0xea, 0xf7, 0x98, 0x22, 0xfb,
- 0x32, 0xe0, 0xa4, 0x13, 0xcc, 0xff, 0x33, 0x0c, 0xd4, 0x47, 0xf0, 0xe5, 0xf0, 0x23, 0xe5, 0xda,
- 0x1d, 0x40, 0xd0, 0x2c, 0xe5, 0x1e, 0x02, 0xfe, 0xb7, 0xf0, 0x1f, 0x1c, 0x1c, 0xfc, 0x1f, 0x2c,
- 0x38, 0x47, 0x13, 0x2e, 0xe0, 0xc2, 0x37, 0x29, 0x1c, 0x1b, 0x81, 0xf5, 0x13, 0xca, 0x0b, 0x46,
- 0x58, 0x24, 0x3a, 0xfd, 0x6b, 0xc9, 0xbc, 0x1d, 0x23, 0x08, 0x17, 0x48, 0x20, 0x5b, 0x56, 0xe7,
- 0xc4, 0xf0, 0xdf, 0xe3, 0x1d, 0x1d, 0x50, 0x20, 0x51, 0xff, 0xf4, 0x44, 0x4d, 0x1a, 0x0b, 0x30,
- 0x2d, 0x38, 0x46, 0x10, 0xcf, 0x01, 0x09, 0x15, 0x3d, 0x56, 0x28, 0xdb, 0xe8, 0xd9, 0xb7, 0xad,
- 0x1a, 0xed, 0xce, 0xcf, 0xf3, 0x2b, 0x5a, 0x0b, 0xe6, 0x36, 0xc2, 0x9b, 0x51, 0x1e, 0x3e, 0xce,
- 0xf5, 0x52, 0xd1, 0xca, 0xe7, 0xd0, 0xf0, 0xf4, 0x0c, 0xed, 0x21, 0x09, 0xdf, 0x91, 0xdb, 0xef,
- 0x09, 0xf7, 0x14, 0x48, 0xd6, 0xe4, 0x2f, 0x05, 0xd8, 0x06, 0xbc, 0x81, 0xbf, 0x2a, 0xc7, 0xd8,
- 0x07, 0xe9, 0x36, 0xe9, 0xcb, 0x08, 0x31, 0x0e, 0x01, 0x3e, 0x17, 0xd8, 0x16, 0xf3, 0xd3, 0xef,
- 0xf8, 0x37, 0xdd, 0xdb, 0x49, 0x09, 0xe2, 0xe6, 0x02, 0xff, 0xeb, 0xd1, 0x0d, 0x90, 0xe7, 0x42,
- 0x2d, 0xf4, 0xc1, 0xb7, 0x04, 0x05, 0x3f, 0x2e, 0x3a, 0x1d, 0xd9, 0x4a, 0x06, 0xff, 0xf9, 0xe4,
- 0x0b, 0x41, 0x35, 0x37, 0x0a, 0x1b, 0x11, 0xca, 0xcb, 0xed, 0xfc, 0xe4, 0xcb, 0x24, 0xed, 0xcb,
- 0x30, 0x02, 0xd3, 0x36, 0x2b, 0xe9, 0xee, 0x19, 0xb0, 0xf9, 0xaa, 0x17, 0x61, 0x0e, 0x25, 0x2f,
- 0x2c, 0xf0, 0x13, 0xf7, 0x1f, 0xc8, 0xee, 0xf2, 0xd4, 0xb5, 0xde, 0x47, 0x43, 0x2b, 0x32, 0x03,
- 0x39, 0xee, 0x44, 0x01, 0xd8, 0xb5, 0xf2, 0x23, 0x2b, 0xfc, 0x09, 0xb8, 0x1f, 0x3a, 0x2e, 0x38,
- 0x0d, 0x36, 0x07, 0xe4, 0x30, 0x0b, 0xf3, 0x06, 0xab, 0x14, 0x45, 0xd3, 0xfb, 0x10, 0x4d, 0x26,
- 0xc8, 0xff, 0xbb, 0xb9, 0x01, 0xe0, 0x2f, 0xd6, 0x37, 0xf9, 0x23, 0x13, 0x7f, 0xf6, 0xc3, 0xc7,
- 0x00, 0x43, 0x5c, 0xd8, 0x02, 0x2a, 0x02, 0x2f, 0xf8, 0x0f, 0xf5, 0xf9, 0x2a, 0xe8, 0xa6, 0xe1,
- 0xfc, 0xeb, 0xd8, 0xde, 0xf4, 0xdd, 0x23, 0x17, 0x06, 0x2d, 0x0f, 0xf2, 0x07, 0x44, 0xfb, 0xe0,
- 0xc5, 0x33, 0x4a, 0x21, 0x22, 0xcc, 0xea, 0x2d, 0xa9, 0xbd, 0x2a, 0x50, 0x19, 0x19, 0xc6, 0xe2,
- 0x41, 0xbd, 0x9b, 0xd3, 0x14, 0x3c, 0x27, 0x40, 0x09, 0xb6, 0xf2, 0x93, 0x2d, 0x1e, 0x02, 0x1b,
- 0x0b, 0xce, 0x3b, 0x0d, 0x01, 0xc5, 0x02, 0x3f, 0xa1, 0xc9, 0xf4, 0x92, 0xd6, 0xe3, 0x48, 0x1c,
- 0xfa, 0x41, 0xff, 0x0e, 0x12, 0xd7, 0xef, 0xf0, 0xe7, 0xc4, 0x08, 0xf3, 0x99, 0x2b, 0x04, 0xe4,
- 0xce, 0x2f, 0xd2, 0xd5, 0xe3, 0xbb, 0xfd, 0xf2, 0x02, 0x18, 0x23, 0x55, 0xee, 0xe5, 0xdb, 0xee,
- 0xd6, 0xc9, 0x1e, 0xea, 0xa6, 0xec, 0xe5, 0xf3, 0x0d, 0xf9, 0xd5, 0x04, 0x2a, 0xf9, 0xc7, 0x04,
- 0xf6, 0x00, 0xd7, 0xec, 0xe8, 0xcf, 0xb2, 0xe5, 0x81, 0x04, 0x31, 0xfe, 0xe8, 0xda, 0xba, 0xb6,
- 0x69, 0xd4, 0xdd, 0x46, 0x50, 0x2e, 0x23, 0x06, 0xed, 0x09, 0x07, 0x3e, 0x03, 0x1e, 0xfe, 0xea,
- 0xb9, 0xfd, 0xf7, 0xd5, 0xd6, 0xf9, 0xe3, 0x22, 0xa4, 0xd9, 0xf9, 0xe6, 0xc2, 0x18, 0x3f, 0x1f,
- 0x06, 0x11, 0xea, 0xc5, 0x05, 0xdc, 0x08, 0x2f, 0x17, 0x3f, 0x81, 0x8a, 0xac, 0xd7, 0xdb, 0xeb,
- 0x22, 0x1f, 0xdd, 0xee, 0xff, 0xf1, 0xbd, 0xe6, 0xd1, 0x46, 0x13, 0xf4, 0x8a, 0x2f, 0x0c, 0xa7,
- 0xfb, 0xb1, 0x57, 0xf7, 0xdc, 0xc4, 0xcd, 0x00, 0xd6, 0xdd, 0x15, 0x1b, 0x22, 0x03, 0x0d, 0x1a,
- 0xfb, 0xfe, 0x4c, 0x25, 0x1a, 0xc0, 0xfa, 0xa7, 0xbc, 0x89, 0x5b, 0x05, 0xfb, 0x1f, 0x0c, 0x03,
- 0x0f, 0xce, 0xc3, 0xb3, 0x19, 0x11, 0x07, 0x0d, 0xf6, 0x27, 0xfb, 0x08, 0x97, 0xff, 0x18, 0xc1,
- 0x21, 0x14, 0x0d, 0xdc, 0x14, 0x96, 0xcc, 0x38, 0xca, 0xd5, 0xf4, 0x13, 0x1b, 0xec, 0xc2, 0x13,
- 0xf7, 0xb5, 0xf9, 0x0b, 0x1b, 0xbf, 0xea, 0xe6, 0xe6, 0x3c, 0xc2, 0xf8, 0x5d, 0x2d, 0x0f, 0xe2,
- 0x3f, 0xd0, 0xf1, 0xfb, 0xf6, 0x15, 0xbc, 0xe2, 0x35, 0xc5, 0x2a, 0x44, 0xc3, 0xfe, 0xff, 0xf9,
- 0x07, 0xa9, 0x0a, 0xe7, 0xd2, 0xf1, 0xed, 0xdf, 0xef, 0x22, 0xf2, 0x4d, 0x43, 0xda, 0xad, 0x81,
- 0xb8, 0xcd, 0x3a, 0x28, 0x05, 0xb0, 0x14, 0xda, 0xd2, 0xe8, 0x33, 0xdf, 0xfa, 0xfa, 0x2a, 0x40,
- 0x0c, 0xd6, 0xce, 0xec, 0xff, 0x38, 0x1d, 0x54, 0x0b, 0x05, 0x05, 0xdb, 0x2d, 0xd5, 0x94, 0xf9,
- 0xc4, 0xc9, 0x15, 0x26, 0x38, 0x5e, 0x0d, 0xa0, 0x08, 0xde, 0xe4, 0x15, 0x05, 0x17, 0xd1, 0x8b,
- 0xd5, 0xf0, 0xfe, 0xfa, 0x2c, 0x0f, 0x24, 0x39, 0x29, 0xf8, 0x1d, 0xc4, 0xc0, 0xdd, 0xcc, 0xd4,
- 0xf0, 0xf8, 0x1a, 0xd2, 0xed, 0xf3, 0xbb, 0xb7, 0xae, 0x16, 0xbd, 0xc1, 0xed, 0x11, 0x36, 0x2e,
- 0x0c, 0x2d, 0xe0, 0xfd, 0xd9, 0x0b, 0x15, 0xf4, 0xb6, 0xc6, 0xca, 0xdf, 0x09, 0x46, 0xeb, 0x58,
- 0x35, 0xd0, 0xf1, 0xdb, 0x13, 0xe8, 0xe0, 0xe4, 0xf6, 0x15, 0xde, 0x40, 0xab, 0x19, 0x0f, 0x17,
- 0x08, 0xf4, 0x15, 0xcf, 0x2e, 0x44, 0xff, 0x04, 0x43, 0xed, 0x05, 0xca, 0x2c, 0x37, 0x1b, 0xd2,
- 0x11, 0x0d, 0xd8, 0xde, 0xd6, 0x0d, 0xc9, 0x19, 0xbe, 0xec, 0xe4, 0xce, 0xcb, 0x14, 0x03, 0xc3,
- 0xde, 0xef, 0x2a, 0x1e, 0x62, 0xf2, 0xd5, 0x3b, 0xda, 0x81, 0x32, 0x13, 0x42, 0xfb, 0xf3, 0xfb,
- 0x08, 0xf5, 0xeb, 0x0a, 0x12, 0xdc, 0xf4, 0xf2, 0x02, 0x24, 0x55, 0x38, 0x13, 0x3d, 0x0c, 0x17,
- 0xec, 0x0b, 0x7f, 0x1c, 0xe4, 0xcb, 0x5a, 0x24, 0xfd, 0x17, 0x1e, 0x04, 0x05, 0x0b, 0xf3, 0xde,
- 0xc2, 0xfd, 0xdf, 0xff, 0x67, 0x27, 0xcd, 0xcc, 0xe2, 0xc2, 0xd3, 0xb5, 0x30, 0x2a, 0x20, 0x36,
- 0xfa, 0x05, 0x37, 0xf2, 0x8b, 0xe3, 0x00, 0x11, 0xf7, 0x07, 0xb7, 0x97, 0x25, 0xf4, 0x08, 0x63,
- 0xdd, 0xbc, 0xd0, 0xde, 0x1d, 0xf4, 0xdb, 0xfc, 0xdd, 0xe3, 0xed, 0x09, 0xed, 0x13, 0x05, 0xf7,
- 0x1e, 0xe6, 0xeb, 0x05, 0xfd, 0xca, 0xfa, 0xf3, 0x12, 0xd2, 0xea, 0x10, 0x00, 0xe3, 0x1d, 0x47,
- 0xa1, 0x46, 0x23, 0xda, 0x33, 0x24, 0xb8, 0x18, 0xf8, 0xaf, 0x06, 0x15, 0x1b, 0x1f, 0x22, 0xa2,
- 0xc8, 0xd7, 0x0b, 0xfa, 0xe9, 0x04, 0xf8, 0x18, 0x9a, 0x6d, 0xfe, 0xff, 0x9c, 0x2e, 0x00, 0x00,
- 0xa5, 0x70, 0xfe, 0xff, 0xe6, 0x0f, 0x00, 0x00, 0x15, 0x39, 0x01, 0x00, 0x21, 0x5f, 0xff, 0xff,
- 0x49, 0x7e, 0xff, 0xff, 0x53, 0x77, 0x02, 0x00, 0x17, 0xb3, 0xff, 0xff, 0xaf, 0x86, 0xfd, 0xff,
- 0x7b, 0xbf, 0x01, 0x00, 0x1c, 0xcf, 0xff, 0xff, 0x6c, 0x79, 0x00, 0x00, 0xc5, 0x59, 0xfe, 0xff,
- 0xe7, 0xea, 0xfd, 0xff, 0xce, 0xd9, 0xfe, 0xff, 0x1e, 0x62, 0xff, 0xff, 0x51, 0x70, 0xff, 0xff,
- 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x12, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x12, 0x00,
- 0x77, 0x36, 0x2b, 0x3d, 0x80, 0xff, 0xff, 0xff, 0xe3, 0xde, 0xae, 0x3c, 0x80, 0xff, 0xff, 0xff,
- 0x02, 0x00, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x08, 0x00, 0x00,
- 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0a, 0x00,
- 0xe3, 0xde, 0xae, 0x3c, 0x80, 0xff, 0xff, 0xff, 0xfa, 0x8f, 0xcf, 0x3d, 0x21, 0x00, 0x00, 0x00,
- 0x40, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x81, 0x22, 0x59, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x27, 0xbd, 0x3a, 0x4d, 0x9b, 0xa4, 0x9d,
- 0x02, 0xee, 0x2f, 0xe4, 0xc7, 0xef, 0xc2, 0x3b, 0x3b, 0xb3, 0xb8, 0xc1, 0xe9, 0x3d, 0x37, 0xd1,
- 0xd8, 0x52, 0x30, 0x28, 0x02, 0xbc, 0xd2, 0xd1, 0xb0, 0xb1, 0xb9, 0x34, 0x3f, 0x48, 0x4e, 0xc6,
- 0xe8, 0xc1, 0xd1, 0x3d, 0xab, 0xe2, 0xb0, 0x10, 0x41, 0xf9, 0xbf, 0xbe, 0x42, 0xd4, 0xc1, 0x2b,
- 0x50, 0xef, 0xbe, 0x1c, 0xab, 0xcc, 0xb4, 0xf4, 0x06, 0xa9, 0xb2, 0x56, 0xf5, 0x26, 0x9f, 0x3b,
- 0xcf, 0x3a, 0xc3, 0x38, 0x39, 0xfd, 0x47, 0xb1, 0xde, 0x0f, 0xd8, 0x43, 0xd4, 0xb6, 0x3b, 0x81,
- 0xfc, 0x16, 0xe8, 0xbd, 0xb5, 0xdb, 0x0e, 0x5b, 0x11, 0xeb, 0x97, 0xba, 0x3a, 0xeb, 0x31, 0x2b,
- 0xeb, 0x54, 0xa5, 0xc2, 0xeb, 0xb9, 0x9c, 0x52, 0xb0, 0x09, 0xce, 0x20, 0xb8, 0x43, 0xc0, 0xd4,
- 0x5c, 0xa9, 0x2a, 0x1f, 0x0c, 0x90, 0x8f, 0x25, 0xe3, 0xa5, 0xcc, 0xbd, 0xfc, 0x2b, 0x38, 0xbe,
- 0x3c, 0x41, 0xf2, 0x67, 0xe0, 0x99, 0x26, 0xe2, 0x45, 0xc8, 0x0b, 0xc6, 0xf5, 0x2c, 0x21, 0xb2,
- 0x4f, 0x51, 0x9d, 0x14, 0xcf, 0x37, 0xaa, 0xf4, 0xdd, 0xa0, 0x39, 0xa5, 0xcc, 0xb7, 0x9a, 0xdd,
- 0x53, 0xfc, 0x2a, 0xae, 0x15, 0x40, 0xb1, 0xf5, 0x45, 0x1a, 0xba, 0x32, 0x00, 0x00, 0x00, 0x00,
- 0xd9, 0x88, 0xff, 0xff, 0x40, 0x6e, 0xff, 0xff, 0x6d, 0xb5, 0xff, 0xff, 0xef, 0x68, 0xff, 0xff,
- 0x20, 0xc5, 0xff, 0xff, 0x14, 0x89, 0xff, 0xff, 0x12, 0x5b, 0xff, 0xff, 0x12, 0x9c, 0xff, 0xff,
- 0x3b, 0xa3, 0xff, 0xff, 0x05, 0xa3, 0xff, 0xff, 0x03, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00,
- 0x48, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0a, 0x00,
- 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0a, 0x00, 0xfa, 0x8f, 0xcf, 0x3d, 0x21, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x80, 0x3b, 0x80, 0xff, 0xff, 0xff,
};
-
-#endif
diff --git a/examples/mnist_cnn/mnist_cnn.h5 b/examples/mnist_cnn/mnist_cnn.h5
deleted file mode 100644
index 9aee050..0000000
Binary files a/examples/mnist_cnn/mnist_cnn.h5 and /dev/null differ
diff --git a/examples/mnist_cnn/mnist_cnn.tflite b/examples/mnist_cnn/mnist_cnn.tflite
deleted file mode 100644
index cbbc70e..0000000
Binary files a/examples/mnist_cnn/mnist_cnn.tflite and /dev/null differ
diff --git a/examples/mnist_cnn/mnist_cnn.tmdl b/examples/mnist_cnn/mnist_cnn.tmdl
deleted file mode 100644
index 8a50b43..0000000
Binary files a/examples/mnist_cnn/mnist_cnn.tmdl and /dev/null differ
diff --git a/examples/mnist_cnn/mnist_cnn_fp32.h b/examples/mnist_cnn/mnist_cnn_fp32.h
new file mode 100644
index 0000000..2469834
--- /dev/null
+++ b/examples/mnist_cnn/mnist_cnn_fp32.h
@@ -0,0 +1,816 @@
+#ifndef __MODEL_FILE__H
+#define __MODEL_FILE__H
+
+#include
+#define MDL_BUF_LEN (8544)
+#define LBUF_LEN (7992)
+const uint8_t mdl_data[12896]={\
+ 0x4d, 0x41, 0x49, 0x58, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x60, 0x21, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00,
+ 0x03, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x08, 0x00,
+ 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00,
+ 0x03, 0xef, 0x88, 0x3d, 0xdf, 0xc6, 0xa5, 0x3e, 0xe4, 0x0a, 0x8d, 0x3e, 0xaa, 0xb1, 0xf3, 0x3e,
+ 0x54, 0x5f, 0xe0, 0x3e, 0x84, 0x49, 0x98, 0x3e, 0x89, 0x3c, 0x95, 0x3e, 0x91, 0xb7, 0xd6, 0x3e,
+ 0xff, 0xab, 0x94, 0x3e, 0xb9, 0x1e, 0x57, 0x3e, 0xc1, 0xc9, 0x69, 0x3f, 0x7b, 0xf1, 0x9c, 0x3f,
+ 0xf6, 0x11, 0x1c, 0xbe, 0xe3, 0xa2, 0xb7, 0x3e, 0x3c, 0x50, 0xe5, 0x3d, 0xfa, 0x6a, 0x05, 0x3f,
+ 0xb0, 0x0c, 0x55, 0x3d, 0x32, 0xf8, 0x71, 0xbf, 0x23, 0x1b, 0xa4, 0x3e, 0x10, 0x9f, 0x5e, 0x3f,
+ 0x0a, 0xf5, 0x43, 0x3f, 0xd6, 0x74, 0xa1, 0xbe, 0x6b, 0xbd, 0xd3, 0x3e, 0x16, 0x3a, 0x3d, 0x3f,
+ 0xf4, 0x58, 0xd8, 0xbf, 0x25, 0x07, 0x9c, 0xbf, 0x02, 0x6d, 0x11, 0xc0, 0xa3, 0xb2, 0x38, 0x3f,
+ 0x5a, 0xe3, 0x95, 0xbf, 0xbc, 0x5d, 0x0f, 0xc0, 0xb9, 0x8d, 0x8f, 0x3e, 0xa1, 0xe9, 0x0f, 0x3e,
+ 0x2b, 0x70, 0x34, 0x3f, 0x8e, 0xf2, 0x2a, 0xbf, 0xfe, 0xb4, 0x81, 0x3f, 0x0b, 0x5a, 0xb0, 0x3f,
+ 0xdf, 0x52, 0x1a, 0xbc, 0x6e, 0xf8, 0xfd, 0xbf, 0x68, 0x73, 0x6c, 0xbf, 0x3b, 0x0a, 0x9f, 0xbf,
+ 0x07, 0x55, 0x62, 0x3e, 0x92, 0xfd, 0x2a, 0x3f, 0x06, 0x2c, 0xd4, 0xbf, 0xa8, 0x71, 0xe5, 0x3a,
+ 0x5f, 0x19, 0x7f, 0x3f, 0x11, 0x9b, 0x2a, 0xbe, 0x0e, 0xee, 0x36, 0xbf, 0x4b, 0x31, 0x9c, 0xbf,
+ 0x45, 0x86, 0x16, 0x3f, 0x5b, 0x20, 0x06, 0xbe, 0xce, 0x54, 0x1e, 0xbf, 0xd6, 0x86, 0x15, 0xbf,
+ 0x0d, 0xd3, 0x57, 0xbf, 0x40, 0x50, 0xd7, 0xbf, 0xc0, 0xcb, 0x99, 0xbf, 0x47, 0x3d, 0x5c, 0x3f,
+ 0x57, 0xa1, 0xdf, 0x3e, 0x71, 0xd1, 0x67, 0xbf, 0x0a, 0x98, 0xf3, 0xbf, 0x63, 0xfd, 0x0c, 0xc0,
+ 0x69, 0xa9, 0x6b, 0x3e, 0x9a, 0xf0, 0x10, 0x3e, 0x42, 0x1f, 0x32, 0xbe, 0xcc, 0x6c, 0x39, 0x3f,
+ 0x4a, 0xe4, 0x1d, 0xbe, 0x95, 0xa2, 0xe2, 0x3e, 0x55, 0xd1, 0x10, 0x3f, 0x70, 0x19, 0xc7, 0x3e,
+ 0xf2, 0x0e, 0x1f, 0x3f, 0x89, 0xf5, 0x42, 0x3d, 0x6f, 0x9f, 0x54, 0xbd, 0xb3, 0xce, 0x90, 0x3e,
+ 0xd2, 0x86, 0xa9, 0xbe, 0x03, 0xf3, 0x51, 0xbe, 0xcc, 0xc9, 0xfb, 0x3e, 0xa0, 0x87, 0x34, 0x3d,
+ 0x46, 0x35, 0x23, 0x3f, 0x4b, 0xe7, 0x52, 0x3f, 0xc1, 0x25, 0x88, 0x3f, 0x81, 0x4b, 0xaf, 0xbe,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0c, 0x00,
+ 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0xd0, 0x0d, 0x00, 0x00,
+ 0x89, 0xf3, 0x53, 0xbc, 0x39, 0xc4, 0xb3, 0x3d, 0xf5, 0x5c, 0x32, 0x3e, 0x4d, 0x6e, 0x28, 0x3d,
+ 0x76, 0xa7, 0x85, 0xbb, 0x78, 0xa2, 0x18, 0xbe, 0xba, 0xac, 0xbb, 0xbd, 0xe5, 0x51, 0x3c, 0xbc,
+ 0x62, 0x72, 0x4d, 0xbd, 0x2c, 0x82, 0x16, 0x3e, 0x7b, 0xc5, 0x3c, 0x3e, 0x69, 0x72, 0x70, 0xbe,
+ 0x5a, 0x26, 0x7c, 0x3e, 0x18, 0xc8, 0xa8, 0x3d, 0x87, 0xc9, 0x6d, 0xbc, 0x31, 0x14, 0x2c, 0x3e,
+ 0x99, 0xf2, 0x67, 0x3e, 0xed, 0x14, 0x37, 0x3c, 0x30, 0xc1, 0x00, 0xbf, 0x28, 0x56, 0xbf, 0xbd,
+ 0x9b, 0x60, 0xda, 0xbd, 0x9e, 0xe9, 0xc7, 0x3d, 0xcd, 0x5f, 0x35, 0xbe, 0xb1, 0x3c, 0x51, 0xbd,
+ 0x63, 0xd0, 0x78, 0x3e, 0x6a, 0xc7, 0x11, 0xbe, 0xde, 0x43, 0xce, 0x3d, 0x0d, 0x57, 0x3f, 0xbe,
+ 0xc1, 0x32, 0x5b, 0xbc, 0x32, 0x83, 0x06, 0xbe, 0x09, 0x79, 0xde, 0xbd, 0x71, 0xd2, 0xc8, 0x3d,
+ 0x39, 0xfb, 0xbd, 0xbd, 0x5d, 0xe8, 0x13, 0x3e, 0xd2, 0x57, 0xd9, 0xbc, 0x1e, 0x70, 0x2f, 0xbe,
+ 0x01, 0x10, 0x27, 0x3f, 0x49, 0x19, 0xcd, 0xbd, 0xad, 0xea, 0xde, 0x3c, 0x03, 0x04, 0xb1, 0x3e,
+ 0xaf, 0xb9, 0xc9, 0x3d, 0xd6, 0x0f, 0xbe, 0x3c, 0x47, 0x27, 0xad, 0x3d, 0x6f, 0xf5, 0xbf, 0x3e,
+ 0x34, 0x09, 0x40, 0x3e, 0xad, 0x6b, 0xe6, 0x3e, 0x82, 0x98, 0x9c, 0x3e, 0xae, 0xbc, 0xda, 0x3e,
+ 0x48, 0x52, 0x17, 0x3f, 0x81, 0xb7, 0x3a, 0x3c, 0xe4, 0xb2, 0x82, 0x3e, 0xec, 0x9e, 0xaa, 0x3d,
+ 0xc0, 0x07, 0x3f, 0x3c, 0xa2, 0x5e, 0x97, 0x3e, 0xb6, 0x19, 0x50, 0x3f, 0x40, 0x70, 0x10, 0x3e,
+ 0xff, 0x0a, 0x93, 0x3e, 0xb3, 0x46, 0x7c, 0x3e, 0xf7, 0x62, 0xe8, 0x3e, 0x03, 0x79, 0x97, 0x3d,
+ 0x4b, 0x76, 0xd9, 0x3e, 0xb1, 0x49, 0x8c, 0x3e, 0x9a, 0x45, 0x2d, 0x3e, 0xe1, 0x27, 0xd2, 0xbd,
+ 0xb2, 0xf7, 0x17, 0xbe, 0xd9, 0x34, 0xdf, 0x3c, 0xaf, 0xa0, 0xd9, 0x3c, 0x98, 0x33, 0xb1, 0x3d,
+ 0x37, 0xc7, 0x04, 0x3e, 0x99, 0x95, 0x94, 0x3d, 0x5b, 0x88, 0x5e, 0xbd, 0xb5, 0x95, 0x63, 0xbc,
+ 0xd9, 0x3f, 0xe2, 0xbd, 0xfe, 0xa0, 0x61, 0x3d, 0xd5, 0xd0, 0xb8, 0x3d, 0x09, 0x8e, 0x04, 0xbe,
+ 0x8a, 0x85, 0xc1, 0x3d, 0xb4, 0x1c, 0xb5, 0xbd, 0xad, 0x64, 0x89, 0xbe, 0x86, 0xb7, 0x75, 0xbe,
+ 0xb6, 0x7e, 0xa5, 0xbc, 0xf3, 0x4c, 0xf2, 0xbd, 0xcf, 0xd8, 0x68, 0x3e, 0xfe, 0xf0, 0xf6, 0x3d,
+ 0xcb, 0x4c, 0x00, 0x3e, 0x9c, 0xa1, 0xe5, 0xbc, 0xb6, 0x13, 0x61, 0x3b, 0xf3, 0xd4, 0x05, 0x3e,
+ 0x92, 0xc4, 0x0e, 0xbd, 0xfd, 0xcb, 0xf2, 0xbd, 0x31, 0x60, 0x6e, 0x3d, 0xa0, 0x14, 0xcd, 0xbd,
+ 0xec, 0xa2, 0x42, 0x3d, 0xb2, 0x8a, 0xf8, 0xbd, 0x9d, 0xbc, 0x3f, 0xbe, 0x3e, 0xd2, 0x76, 0x3c,
+ 0xdb, 0xe9, 0x90, 0xbe, 0x55, 0xb5, 0xa2, 0xbd, 0x09, 0x76, 0x48, 0x3d, 0x09, 0x54, 0xa6, 0x3d,
+ 0xc5, 0xa8, 0x42, 0x3e, 0x76, 0x8b, 0xd9, 0x3d, 0x3a, 0xc3, 0xed, 0xbc, 0x75, 0x4f, 0xb5, 0x3b,
+ 0x08, 0xdc, 0xff, 0x3c, 0xef, 0xb8, 0xa8, 0xbe, 0x43, 0x96, 0xb1, 0xbe, 0xd1, 0xcd, 0x90, 0xbd,
+ 0xce, 0x15, 0x8f, 0xbe, 0xf5, 0x44, 0x1b, 0xbf, 0x34, 0x49, 0xad, 0xbe, 0x20, 0xe3, 0x09, 0xbd,
+ 0xf1, 0xde, 0xe8, 0xbc, 0xc7, 0xb5, 0x2d, 0xbd, 0x4f, 0xf8, 0x8f, 0x3e, 0xf2, 0x20, 0xbb, 0x39,
+ 0x51, 0xcf, 0x39, 0xbe, 0x7e, 0xf9, 0xbf, 0xbe, 0xd6, 0xb3, 0x35, 0xbe, 0xa4, 0xeb, 0x69, 0xbe,
+ 0x25, 0x96, 0x72, 0xbe, 0x50, 0x4d, 0x95, 0x3c, 0xd9, 0xfa, 0x17, 0xbd, 0x95, 0xd9, 0xcb, 0x3e,
+ 0x81, 0x53, 0x8c, 0x3e, 0x56, 0x13, 0x04, 0x3e, 0x55, 0x66, 0x9e, 0x3d, 0x5d, 0x42, 0xe3, 0xbd,
+ 0xf1, 0x77, 0x61, 0x3c, 0x5d, 0x55, 0x74, 0x3d, 0xdf, 0x61, 0x69, 0x3e, 0xf6, 0x04, 0xc8, 0x3d,
+ 0x1c, 0x98, 0x42, 0xbe, 0xb4, 0xc8, 0xd2, 0xbd, 0x48, 0x85, 0x56, 0x3e, 0x53, 0x0b, 0xbc, 0x3d,
+ 0x00, 0x76, 0x6f, 0xbd, 0xe2, 0xb2, 0xb2, 0x3d, 0xbb, 0x20, 0x49, 0x3d, 0xb9, 0x16, 0xd3, 0x3b,
+ 0xf3, 0x5a, 0xa4, 0x3e, 0xdc, 0x9a, 0x50, 0xbe, 0xc1, 0x97, 0x98, 0xbd, 0x5c, 0x28, 0x5c, 0x3d,
+ 0x84, 0xf8, 0x5f, 0xbd, 0x6c, 0xd2, 0x33, 0xbc, 0x5e, 0x95, 0x8e, 0xbd, 0xde, 0xc3, 0x8f, 0xbd,
+ 0x31, 0x2e, 0x1e, 0x3d, 0x62, 0xef, 0xc5, 0x3c, 0x9b, 0xe1, 0x04, 0x3d, 0xe2, 0xad, 0x03, 0xbe,
+ 0xa2, 0x80, 0x0f, 0x3e, 0x1b, 0xe4, 0xb7, 0xba, 0xc7, 0x03, 0x2d, 0x3c, 0xd8, 0xa1, 0xa1, 0xbc,
+ 0xcf, 0x4a, 0x12, 0xbd, 0x17, 0xcb, 0xe9, 0xbd, 0x60, 0xb8, 0xff, 0x3a, 0x08, 0xe9, 0x10, 0xbe,
+ 0x03, 0x9a, 0x73, 0xbd, 0xc3, 0xad, 0x86, 0xbd, 0x48, 0x69, 0x50, 0xbd, 0xfb, 0x73, 0xb3, 0x3c,
+ 0xae, 0xb2, 0xa9, 0xbd, 0x88, 0x3b, 0x84, 0xbe, 0xf9, 0x2b, 0xa3, 0xbc, 0x27, 0x45, 0x2c, 0x3e,
+ 0x0c, 0xfb, 0xfd, 0xbd, 0xca, 0x8a, 0x2b, 0xbe, 0x6b, 0xc7, 0xbb, 0x3c, 0x72, 0x3d, 0x1c, 0x3e,
+ 0x32, 0xbd, 0xa0, 0x3d, 0x0a, 0x7b, 0x5b, 0x3e, 0xc7, 0x0e, 0x72, 0x3d, 0x10, 0x26, 0x35, 0x3e,
+ 0x86, 0x11, 0xf5, 0x3d, 0xd6, 0x89, 0x1b, 0xbd, 0xfd, 0x98, 0xed, 0x3d, 0xcc, 0x47, 0x26, 0x3a,
+ 0x94, 0xfa, 0xa1, 0xbe, 0x0b, 0xa8, 0x89, 0xbe, 0x23, 0xa2, 0x75, 0xbe, 0xcd, 0x61, 0x77, 0xbe,
+ 0x28, 0x07, 0xee, 0xbe, 0x70, 0x67, 0xba, 0xbe, 0x2d, 0x46, 0x16, 0xbe, 0x01, 0xe3, 0xbb, 0xbe,
+ 0xf1, 0x66, 0x4a, 0xbe, 0x9c, 0x1e, 0xe4, 0xbd, 0x44, 0x5b, 0x90, 0xbe, 0xfd, 0xe6, 0xab, 0x3c,
+ 0xc7, 0x8c, 0x6b, 0x3e, 0x2e, 0x00, 0x53, 0xbd, 0xa6, 0x97, 0x89, 0xbe, 0x4f, 0xfa, 0x6d, 0xbe,
+ 0x61, 0x73, 0xe5, 0xbe, 0x89, 0x54, 0x03, 0xbf, 0x59, 0xeb, 0x75, 0xbe, 0xdc, 0x6e, 0x75, 0xbe,
+ 0xb8, 0x6c, 0x2f, 0x3e, 0xf3, 0x1b, 0x1e, 0xbe, 0x33, 0x9a, 0x35, 0xbe, 0xbe, 0x25, 0x77, 0x3c,
+ 0xd8, 0xac, 0x32, 0xbe, 0x0d, 0x76, 0xcd, 0xbd, 0x9f, 0x81, 0xc0, 0xbb, 0x23, 0xb4, 0x45, 0xbd,
+ 0x7b, 0x6c, 0x6f, 0x3d, 0xfe, 0x25, 0x12, 0xbe, 0x8b, 0x94, 0x6a, 0xbe, 0x68, 0x86, 0x8f, 0xbc,
+ 0x89, 0x12, 0x8d, 0xbd, 0x7b, 0xb8, 0x7d, 0xbc, 0xf3, 0x68, 0x1c, 0x3c, 0x73, 0xfc, 0x70, 0x3c,
+ 0x9f, 0x42, 0xe3, 0x3c, 0x63, 0xff, 0x94, 0x3d, 0xde, 0x34, 0xcb, 0x3d, 0xf6, 0x46, 0x58, 0x3d,
+ 0xa2, 0x22, 0xfe, 0x3d, 0xf1, 0x1e, 0x0f, 0xbd, 0xa8, 0xae, 0x92, 0x3d, 0x23, 0x5f, 0x51, 0xbc,
+ 0x5d, 0x27, 0xcb, 0xbd, 0xd6, 0xf2, 0x02, 0x3e, 0xb3, 0xdf, 0x46, 0x3d, 0x31, 0x85, 0x81, 0x3d,
+ 0x44, 0x04, 0x59, 0x3d, 0xd5, 0xbd, 0x12, 0x3e, 0xdb, 0x1a, 0x97, 0x3d, 0xd2, 0xcc, 0xa7, 0x3d,
+ 0x6d, 0xe5, 0x29, 0x3e, 0x6c, 0x5a, 0x9f, 0x3d, 0x49, 0x98, 0x45, 0xbd, 0x6d, 0xa5, 0x13, 0x3d,
+ 0x02, 0x96, 0x25, 0xbc, 0x6f, 0x8e, 0xa2, 0xbd, 0x36, 0x48, 0x0e, 0x3d, 0xea, 0xd8, 0x79, 0xbd,
+ 0x30, 0x6c, 0xc4, 0xbd, 0xa5, 0x08, 0x55, 0x3d, 0x71, 0x1b, 0xac, 0x3d, 0x9a, 0x81, 0x17, 0xbd,
+ 0x31, 0x88, 0xe7, 0xbd, 0xc4, 0x5b, 0xd5, 0xbc, 0x8a, 0x51, 0x97, 0xbd, 0xae, 0x67, 0x1b, 0xbe,
+ 0xd9, 0xb5, 0xa2, 0xbd, 0xf1, 0x12, 0x55, 0x3d, 0xb2, 0x4a, 0xb0, 0xbc, 0x8b, 0x1e, 0x52, 0xbd,
+ 0x07, 0x5d, 0x0b, 0xbe, 0xc4, 0xf5, 0x2e, 0xbd, 0x92, 0x85, 0x0a, 0xbd, 0xbf, 0xf6, 0xe1, 0x3b,
+ 0x9f, 0x4e, 0x97, 0x3d, 0xa8, 0x61, 0x26, 0x3d, 0x0c, 0x8d, 0xf3, 0xbb, 0x10, 0x8f, 0xfe, 0xbd,
+ 0x7b, 0xf1, 0x26, 0xbe, 0xdf, 0x75, 0xf2, 0xbc, 0xa5, 0x48, 0x28, 0x3d, 0xd7, 0x13, 0x22, 0xbe,
+ 0xe8, 0x85, 0x20, 0x3d, 0x39, 0xfe, 0xea, 0x3d, 0x59, 0x5a, 0x6f, 0x3d, 0xfd, 0x1f, 0x4b, 0xbe,
+ 0x3d, 0x32, 0x11, 0xbd, 0xa7, 0x5c, 0x81, 0xbd, 0xf6, 0x7e, 0xb3, 0xbd, 0x0e, 0xd1, 0x15, 0x3c,
+ 0xd8, 0xd1, 0x01, 0xbd, 0x71, 0x5e, 0xd5, 0xbd, 0x97, 0xca, 0x4b, 0xbd, 0xfd, 0x23, 0xbb, 0xbd,
+ 0xf8, 0xb4, 0x51, 0xbe, 0x58, 0x8d, 0xe9, 0xbc, 0xb4, 0x11, 0xbf, 0xbd, 0x5c, 0x9e, 0x1f, 0x3d,
+ 0x1a, 0xbf, 0x95, 0xbc, 0x00, 0xb2, 0x55, 0x3d, 0x2e, 0x55, 0xde, 0xbc, 0x67, 0xbc, 0xb1, 0xbb,
+ 0x67, 0xf4, 0x80, 0x3c, 0x30, 0xbb, 0x1c, 0x3d, 0xe2, 0x26, 0x03, 0x3e, 0x65, 0x94, 0xbf, 0xbd,
+ 0x68, 0x90, 0x00, 0xbe, 0xae, 0xc0, 0x31, 0xbe, 0x88, 0xad, 0x57, 0x3a, 0x2f, 0xec, 0xb4, 0x3d,
+ 0xb4, 0x9e, 0xc0, 0x3d, 0x0d, 0x11, 0x29, 0xbc, 0x52, 0x97, 0x68, 0x3d, 0x2d, 0xbe, 0x40, 0x3d,
+ 0x89, 0xbf, 0x5f, 0xbe, 0x4c, 0xea, 0x71, 0xbd, 0xe1, 0x1c, 0x6b, 0xbd, 0x59, 0xea, 0xe1, 0xbd,
+ 0xfe, 0x2f, 0x03, 0x3e, 0x71, 0x27, 0xc5, 0x3b, 0x7b, 0xc0, 0x18, 0xbe, 0x4d, 0x6b, 0xa0, 0x3c,
+ 0x91, 0x6c, 0xba, 0x3c, 0xe4, 0xe4, 0xe2, 0x3c, 0x2f, 0x2b, 0x82, 0xbd, 0xd8, 0xf3, 0xe6, 0x3d,
+ 0x9b, 0xa5, 0x2c, 0x3e, 0x11, 0x5c, 0xe0, 0xbd, 0xc6, 0x5c, 0x29, 0x3c, 0x36, 0xa6, 0x64, 0x3d,
+ 0x16, 0xea, 0x6f, 0xb9, 0x4c, 0x57, 0xe1, 0x3c, 0x71, 0x7e, 0x0d, 0xbd, 0xde, 0x7a, 0x07, 0xbd,
+ 0x04, 0x11, 0x47, 0xbd, 0x13, 0x04, 0x9c, 0x3c, 0xb2, 0xe9, 0x6f, 0x3d, 0x4f, 0x96, 0x56, 0x3d,
+ 0x70, 0x4b, 0x19, 0x3e, 0x8d, 0xb6, 0x83, 0x3d, 0x14, 0xf6, 0x05, 0x3e, 0x63, 0x61, 0x48, 0x3e,
+ 0xad, 0xee, 0x82, 0xbd, 0x44, 0x8b, 0x3d, 0x3e, 0xf3, 0xb0, 0x13, 0x3e, 0x82, 0x87, 0x33, 0xbe,
+ 0xc3, 0x1d, 0x87, 0xbd, 0xf8, 0x6f, 0x76, 0xbe, 0x12, 0xc3, 0xac, 0xbd, 0xe2, 0x4b, 0x96, 0xbe,
+ 0x7a, 0x42, 0xcb, 0xbe, 0x6a, 0xd9, 0x33, 0x3d, 0x53, 0x60, 0x24, 0x3e, 0xb9, 0x7f, 0x33, 0x3e,
+ 0x0c, 0x38, 0x1d, 0xbd, 0x3e, 0x87, 0x93, 0x3d, 0xf6, 0x64, 0xa0, 0x3d, 0x56, 0xa1, 0xae, 0xbe,
+ 0x7f, 0x2d, 0xac, 0xbe, 0x4a, 0xfd, 0x98, 0xbe, 0xd5, 0x28, 0x7c, 0x3d, 0x59, 0x7c, 0x49, 0x3e,
+ 0xd9, 0xed, 0x84, 0x3e, 0xfd, 0x9e, 0x00, 0xbe, 0x96, 0xee, 0x35, 0x3e, 0x8b, 0x5b, 0x5a, 0x3d,
+ 0x71, 0x5d, 0x50, 0x3d, 0xaf, 0x34, 0x84, 0x3c, 0x11, 0xc3, 0x63, 0x3d, 0xea, 0x29, 0xca, 0x3c,
+ 0x04, 0x30, 0xcb, 0x3d, 0x05, 0x59, 0x31, 0xbd, 0x78, 0x2c, 0xb8, 0x3d, 0x2f, 0x95, 0x6a, 0x3d,
+ 0xf1, 0xf6, 0x55, 0xbe, 0xf3, 0x15, 0xd1, 0x3d, 0x9b, 0xd7, 0xb3, 0x3d, 0x42, 0xf6, 0x85, 0x3d,
+ 0xd8, 0x21, 0x40, 0xbe, 0x55, 0x0d, 0x70, 0x3c, 0xaf, 0x10, 0xc0, 0x3b, 0x6a, 0xad, 0x0a, 0x3e,
+ 0x87, 0x51, 0x3f, 0x3d, 0xad, 0x65, 0x3e, 0xbe, 0x61, 0x7e, 0x86, 0x3d, 0xf7, 0x77, 0x58, 0xbc,
+ 0xfe, 0x60, 0xd0, 0xbd, 0x94, 0xe0, 0x68, 0xbe, 0x5d, 0xaf, 0x00, 0xbf, 0xaf, 0x36, 0x3a, 0xbe,
+ 0x77, 0xa5, 0x1b, 0x3d, 0xbc, 0x37, 0xe5, 0xbd, 0x26, 0x68, 0xc2, 0xbd, 0xcc, 0xb6, 0x54, 0xbe,
+ 0x21, 0xac, 0x16, 0xbe, 0x33, 0x8e, 0x84, 0x3c, 0x98, 0xa1, 0x53, 0x3e, 0xb2, 0xd9, 0xdd, 0x3e,
+ 0x2e, 0xd5, 0x8e, 0x3e, 0x88, 0x80, 0xbb, 0xbd, 0x63, 0x15, 0x88, 0x3e, 0x6e, 0x3d, 0x88, 0x3e,
+ 0xa8, 0x82, 0x1c, 0x3e, 0x9c, 0x42, 0x04, 0x3e, 0xcc, 0x11, 0x1f, 0x3e, 0x4b, 0xdd, 0x27, 0x3e,
+ 0x78, 0x6b, 0xb0, 0x3e, 0x03, 0x12, 0x2a, 0x3e, 0x49, 0x94, 0x88, 0xbc, 0x61, 0x28, 0x64, 0x3e,
+ 0xce, 0xa4, 0xbf, 0x3d, 0x79, 0x61, 0x9f, 0xbd, 0x48, 0xdd, 0x04, 0x3d, 0xa0, 0xf3, 0x80, 0x3d,
+ 0xcc, 0x56, 0x3e, 0x3e, 0x95, 0xd2, 0xe0, 0xbd, 0xef, 0xe0, 0x36, 0xbd, 0xb2, 0x56, 0x40, 0xbe,
+ 0x8f, 0x64, 0x9d, 0xbe, 0xd0, 0xdc, 0x8d, 0xbe, 0x76, 0xfc, 0xf0, 0x3c, 0x28, 0xf1, 0x28, 0xbe,
+ 0xfd, 0xd8, 0x6e, 0xbd, 0x28, 0x16, 0x77, 0x3e, 0x2f, 0xf1, 0x27, 0xbd, 0xf0, 0x03, 0x84, 0xbd,
+ 0x94, 0x2e, 0x7d, 0xbe, 0x59, 0x5a, 0xed, 0xbd, 0x89, 0xcd, 0x84, 0xbe, 0xd4, 0x43, 0x34, 0x3e,
+ 0x51, 0x2e, 0x0f, 0xbe, 0xdf, 0xf6, 0x09, 0xbe, 0x66, 0xb9, 0xe7, 0x3e, 0x9a, 0x21, 0x98, 0x3e,
+ 0x2e, 0x2f, 0x8e, 0x3e, 0x41, 0xd5, 0xfe, 0xbd, 0x60, 0xdd, 0x38, 0x3e, 0x3d, 0xd1, 0x87, 0x3e,
+ 0xe8, 0xae, 0xfa, 0x3b, 0x75, 0x37, 0xec, 0xbb, 0x84, 0x50, 0x7e, 0x3d, 0xef, 0x8a, 0xba, 0xbe,
+ 0x32, 0xd9, 0x0e, 0xbe, 0xe0, 0xcd, 0x73, 0x3d, 0xaf, 0x3f, 0x50, 0x3e, 0xb5, 0x64, 0x6d, 0x3e,
+ 0xe2, 0x22, 0x98, 0x3e, 0x00, 0xa6, 0x2c, 0xbc, 0xaf, 0x6e, 0xd6, 0xbc, 0x43, 0xad, 0xb3, 0x3d,
+ 0x08, 0x79, 0x3b, 0xbe, 0x28, 0x3f, 0x07, 0xbd, 0x98, 0x0c, 0xe0, 0xbc, 0x03, 0x13, 0x94, 0xbe,
+ 0xc5, 0x9a, 0xb0, 0xbd, 0x26, 0x5f, 0x3d, 0xbc, 0x34, 0x4a, 0x08, 0x3e, 0x21, 0xd2, 0xe4, 0xbd,
+ 0x45, 0x64, 0x1c, 0xbe, 0x7a, 0x0c, 0x5d, 0xbe, 0x33, 0x80, 0x52, 0xbc, 0xd7, 0xef, 0x08, 0x3e,
+ 0xa1, 0x76, 0x44, 0x3c, 0x25, 0xc1, 0x9c, 0x3d, 0xa5, 0x16, 0x01, 0x3e, 0x16, 0x36, 0xac, 0x3d,
+ 0x65, 0x66, 0xaf, 0xbd, 0x73, 0x14, 0x07, 0xbd, 0x0e, 0x05, 0x1e, 0xbe, 0x2e, 0xf7, 0x28, 0x3e,
+ 0x95, 0x3a, 0x54, 0x3e, 0x5d, 0x2d, 0x82, 0x3e, 0x54, 0x78, 0x34, 0x3e, 0xad, 0x1b, 0x65, 0x3e,
+ 0x7d, 0x4f, 0xd5, 0x3d, 0x54, 0xa6, 0xc6, 0x3e, 0xf0, 0x1c, 0xa6, 0x3e, 0x00, 0xf8, 0x9e, 0xbe,
+ 0x1c, 0xfb, 0x32, 0xbe, 0x4b, 0x99, 0x11, 0xbd, 0xef, 0x7a, 0x7d, 0xbe, 0x5a, 0xcb, 0x2d, 0xbd,
+ 0x89, 0x18, 0x12, 0xbd, 0xd3, 0xb6, 0x5c, 0x3e, 0x08, 0x37, 0x8e, 0x3e, 0x67, 0xca, 0xa5, 0x3d,
+ 0xa7, 0xd4, 0x2e, 0x3d, 0x75, 0x09, 0x8c, 0xbd, 0x0e, 0xe7, 0x9e, 0xbd, 0xbe, 0x99, 0x1d, 0xbd,
+ 0x4e, 0xc4, 0x92, 0xbd, 0x59, 0x8d, 0x06, 0x3e, 0x4e, 0xdf, 0x33, 0xbe, 0x95, 0xad, 0x17, 0x3e,
+ 0x14, 0xfc, 0x9f, 0x3e, 0x49, 0x86, 0x92, 0x3d, 0xfe, 0x15, 0x8f, 0xbe, 0x2d, 0x18, 0x2e, 0xbf,
+ 0x0f, 0xb8, 0xaa, 0x3e, 0x0e, 0x36, 0x56, 0xbe, 0xc0, 0x42, 0x77, 0xbe, 0x76, 0x1b, 0xd2, 0xbe,
+ 0x5a, 0x97, 0xbd, 0xbe, 0x7c, 0xc6, 0x96, 0x3e, 0x3a, 0x4b, 0xf0, 0xbd, 0xc2, 0xf9, 0x24, 0xbe,
+ 0xcb, 0x84, 0x95, 0xbe, 0x7e, 0xcf, 0xaf, 0x3e, 0x63, 0x5f, 0xda, 0x3e, 0xc1, 0x6f, 0x8b, 0x3d,
+ 0xaf, 0xe0, 0x96, 0x3e, 0x7e, 0x9e, 0xa5, 0x3e, 0x64, 0xfe, 0x9b, 0x3e, 0xa3, 0x2b, 0xc4, 0xbc,
+ 0x13, 0x70, 0x01, 0x3e, 0xda, 0xf6, 0x90, 0x3d, 0xfe, 0x8d, 0x9d, 0xbe, 0x84, 0x32, 0x0e, 0x3d,
+ 0x4a, 0x78, 0x21, 0x3e, 0xee, 0x92, 0xd8, 0xbd, 0x2d, 0x36, 0x18, 0x3e, 0x51, 0x1c, 0xd9, 0xbc,
+ 0x1c, 0x6e, 0xcd, 0xbd, 0x1b, 0xcb, 0x05, 0xbe, 0xd6, 0xde, 0xdf, 0xbd, 0x0f, 0xd4, 0x01, 0xbd,
+ 0x69, 0x55, 0x21, 0x3e, 0x96, 0x13, 0x34, 0xbd, 0x5d, 0x6a, 0x0d, 0x3e, 0xc7, 0x31, 0x3c, 0x3e,
+ 0xbc, 0xac, 0x46, 0x3b, 0x85, 0xe4, 0x19, 0xbe, 0x7e, 0x05, 0xf7, 0xbd, 0xb7, 0xcd, 0x35, 0xbe,
+ 0x67, 0xbf, 0x0a, 0xbe, 0x65, 0x91, 0x4e, 0x3e, 0xf5, 0x10, 0x02, 0x3e, 0x37, 0xb2, 0x17, 0x3e,
+ 0x80, 0x7f, 0xba, 0xb9, 0xfc, 0x2f, 0x2d, 0xbd, 0x8e, 0xd2, 0xb5, 0x3e, 0xd6, 0x7b, 0x8c, 0x3e,
+ 0x55, 0x55, 0x75, 0x3e, 0x37, 0xdb, 0x7d, 0x3d, 0xb5, 0xaf, 0x50, 0xbd, 0x9f, 0x54, 0x85, 0x3e,
+ 0x8a, 0xf4, 0x36, 0xbe, 0x09, 0x7a, 0xe6, 0xbb, 0x2f, 0x5b, 0xb3, 0x3d, 0xda, 0xa8, 0xb6, 0xbd,
+ 0xcd, 0xac, 0xfc, 0xbd, 0x3b, 0x32, 0x78, 0x3c, 0x92, 0x2c, 0x75, 0xba, 0x45, 0x20, 0x46, 0x3e,
+ 0x9d, 0xc4, 0x82, 0x3e, 0xd2, 0x89, 0xbd, 0xbb, 0x04, 0x33, 0x1d, 0x3e, 0xaf, 0xd5, 0x1e, 0x3e,
+ 0xa0, 0x69, 0xbc, 0xbd, 0x1e, 0x36, 0x0d, 0xbd, 0x60, 0x3a, 0x08, 0xbe, 0xda, 0x0e, 0xc6, 0x3e,
+ 0x08, 0x04, 0xa3, 0x3e, 0x10, 0xd8, 0x4d, 0xbd, 0xc2, 0x5f, 0x12, 0xba, 0xaa, 0x95, 0x8c, 0xbb,
+ 0xec, 0xa0, 0xe1, 0xbd, 0x57, 0x44, 0xcd, 0x3d, 0x2d, 0x4e, 0x08, 0x3e, 0xce, 0x0a, 0x37, 0x3e,
+ 0x2d, 0x29, 0x61, 0x3e, 0xc3, 0x46, 0x0a, 0xbd, 0x99, 0x4e, 0x6a, 0xbe, 0xb5, 0x0f, 0x16, 0xbe,
+ 0x74, 0x80, 0x33, 0xbe, 0x4b, 0xff, 0x80, 0xbe, 0x20, 0xb1, 0x08, 0x3e, 0x2f, 0xc5, 0x0b, 0x3d,
+ 0xed, 0x99, 0x98, 0x3e, 0x46, 0xcd, 0xed, 0x3d, 0x23, 0x63, 0x92, 0x3d, 0x1c, 0xa3, 0x97, 0x3d,
+ 0x37, 0xad, 0xaf, 0x3d, 0x46, 0xe7, 0x31, 0x3c, 0x54, 0xef, 0x3b, 0x3d, 0x08, 0xcc, 0xff, 0xbc,
+ 0x17, 0x66, 0x66, 0xbe, 0xb3, 0x37, 0xf1, 0xbd, 0x7f, 0xf0, 0x3c, 0xbe, 0xbf, 0x7a, 0xa0, 0xbd,
+ 0x1b, 0x2b, 0x89, 0x3e, 0x11, 0x97, 0x0a, 0x3d, 0x6d, 0xdb, 0x43, 0xbd, 0xfe, 0x22, 0x97, 0x3c,
+ 0xdd, 0x1a, 0xf9, 0xbd, 0x1f, 0xd9, 0x0b, 0xbe, 0xf9, 0x93, 0x41, 0xbd, 0x72, 0x41, 0x90, 0xbe,
+ 0x18, 0xd2, 0xa8, 0xbe, 0x4d, 0xce, 0xdd, 0xbd, 0x74, 0xdc, 0x33, 0xbd, 0x40, 0xd4, 0xdf, 0xbd,
+ 0x2a, 0x1e, 0xf4, 0x3d, 0x01, 0xb7, 0x19, 0xbe, 0x82, 0x35, 0x28, 0x3b, 0x5a, 0xa7, 0xdc, 0xbd,
+ 0x9b, 0xd4, 0xf7, 0xbd, 0x5b, 0x04, 0xb7, 0xbc, 0x6f, 0x5a, 0x55, 0xbe, 0xbd, 0xdd, 0xaf, 0xbd,
+ 0xc5, 0x33, 0x6d, 0xbe, 0xd3, 0x8e, 0x01, 0xbd, 0xe2, 0x06, 0xa4, 0x3e, 0xff, 0x89, 0xd5, 0x3d,
+ 0xcb, 0xfb, 0x01, 0xbe, 0xf6, 0x89, 0x07, 0x3f, 0x39, 0xbd, 0xc6, 0x3e, 0x7d, 0x78, 0x6e, 0x3d,
+ 0x20, 0x4b, 0xdd, 0xbd, 0xd2, 0xab, 0x0e, 0xbe, 0xdd, 0xd6, 0x2a, 0xbd, 0xbc, 0x4e, 0xae, 0xbb,
+ 0x51, 0x83, 0xdb, 0xbd, 0x58, 0x12, 0x80, 0xbe, 0xac, 0xed, 0x41, 0x3e, 0xb8, 0x69, 0x1a, 0x3e,
+ 0x0b, 0x43, 0x5e, 0xbe, 0x8e, 0x45, 0xac, 0xbd, 0x70, 0xb8, 0x01, 0xbe, 0x0b, 0xdc, 0x47, 0xbd,
+ 0x3e, 0xaf, 0x22, 0xbd, 0xc4, 0x8c, 0xa7, 0x3d, 0xb2, 0x25, 0xf2, 0x3d, 0xb2, 0x23, 0xb5, 0xbc,
+ 0xd9, 0xd3, 0x0b, 0xbe, 0x75, 0xe0, 0xb5, 0x3d, 0xd8, 0x03, 0xb7, 0x3d, 0xd7, 0x0d, 0x75, 0xbd,
+ 0x8b, 0x14, 0xef, 0xbd, 0x0a, 0x3d, 0x9d, 0xbd, 0xb6, 0x00, 0x6e, 0x3d, 0x8b, 0xa0, 0x82, 0xbc,
+ 0x2c, 0x03, 0x76, 0xbd, 0x33, 0xa5, 0x8f, 0xbc, 0xfa, 0x56, 0x78, 0x3e, 0x59, 0x3a, 0x17, 0xbe,
+ 0x09, 0xc5, 0x49, 0xbd, 0xfd, 0x1f, 0x90, 0x3c, 0x55, 0xb1, 0x66, 0x3e, 0x85, 0xe5, 0x00, 0x3e,
+ 0xc7, 0xc0, 0x67, 0xbe, 0x0d, 0x7d, 0x8f, 0x3e, 0x8d, 0xda, 0x4a, 0x3e, 0xca, 0x11, 0x7a, 0x3e,
+ 0xdd, 0xeb, 0x4d, 0xbe, 0x25, 0x19, 0x67, 0xbd, 0x0e, 0x3d, 0x4e, 0x3e, 0x1b, 0x02, 0xbc, 0x3d,
+ 0x1a, 0x56, 0x4a, 0x3e, 0x7c, 0x28, 0x3f, 0xbe, 0x10, 0xcc, 0x9a, 0xbd, 0xdc, 0xce, 0xe9, 0x3c,
+ 0xcd, 0xde, 0x5e, 0xbe, 0xa5, 0x35, 0x52, 0x3e, 0xf5, 0x23, 0x5e, 0x3e, 0x27, 0x3a, 0x09, 0x3e,
+ 0xcb, 0x4d, 0x37, 0xbe, 0x54, 0x06, 0x44, 0x3c, 0x9e, 0xf3, 0xb0, 0xbd, 0x0a, 0xe3, 0xd0, 0xbb,
+ 0xb6, 0xf4, 0xb6, 0xbd, 0xc2, 0x20, 0x99, 0x3e, 0x81, 0xe5, 0x8d, 0xbd, 0x5c, 0x59, 0x53, 0xbc,
+ 0xd5, 0x66, 0x5a, 0x3d, 0xa3, 0xcf, 0xc8, 0x3b, 0x04, 0xa5, 0x1f, 0xbe, 0x68, 0xd2, 0x06, 0xbe,
+ 0x34, 0xc8, 0x17, 0xbe, 0x52, 0xaa, 0x2c, 0x3e, 0x8a, 0x0a, 0xa6, 0xbc, 0x78, 0x2f, 0x3d, 0x3e,
+ 0xc0, 0xa4, 0x47, 0x3e, 0xc5, 0x6f, 0x3b, 0xbd, 0xa2, 0xf7, 0xc9, 0x3d, 0x0a, 0x24, 0x78, 0x3e,
+ 0x4a, 0x29, 0xf3, 0xbb, 0x08, 0x79, 0xb3, 0x3e, 0x49, 0x96, 0x88, 0x3d, 0x60, 0xd5, 0x41, 0xbe,
+ 0xaf, 0xf7, 0x0c, 0x3e, 0x09, 0xe0, 0x4c, 0xbd, 0xbf, 0x64, 0x5f, 0xbd, 0x8f, 0xdc, 0xc1, 0x3d,
+ 0x11, 0x50, 0xcb, 0x3c, 0xf4, 0x1f, 0xb9, 0xbd, 0xc0, 0xdb, 0xf6, 0x3c, 0x44, 0xc8, 0x12, 0x3e,
+ 0x5d, 0xc4, 0x0b, 0xbb, 0xd0, 0x56, 0x8a, 0x3d, 0xd6, 0x7a, 0xd3, 0x3d, 0x75, 0x7a, 0x89, 0xbd,
+ 0xc6, 0x9f, 0x4b, 0xbe, 0x7b, 0x1b, 0xab, 0xbe, 0xd3, 0x3b, 0xac, 0xbe, 0x41, 0x40, 0x80, 0xbd,
+ 0xdb, 0x57, 0x6e, 0xbe, 0xfc, 0xa5, 0xd6, 0xbd, 0xb9, 0x97, 0x31, 0x3e, 0x63, 0x42, 0x5f, 0x3d,
+ 0xd4, 0xa2, 0x27, 0x3e, 0x54, 0xde, 0x16, 0xbe, 0x3d, 0x59, 0xf8, 0xbd, 0x26, 0x14, 0xd6, 0x3c,
+ 0x94, 0xc0, 0x46, 0xbe, 0x74, 0x5e, 0xdc, 0xbc, 0xe6, 0x19, 0x84, 0x3d, 0xff, 0xd2, 0x23, 0xbe,
+ 0x3e, 0x5e, 0x0d, 0xbe, 0x0e, 0x63, 0xb2, 0xbe, 0x1e, 0xfa, 0x1e, 0x3c, 0xfb, 0x8d, 0x04, 0x3e,
+ 0x8f, 0xd0, 0x8d, 0xbd, 0xb7, 0xc1, 0x26, 0x3d, 0x88, 0x0e, 0x08, 0x3e, 0x09, 0xa5, 0xec, 0x3a,
+ 0x94, 0x94, 0xbf, 0x3d, 0x8b, 0x8a, 0x6a, 0xbe, 0x48, 0x67, 0xae, 0xbe, 0xfc, 0xfd, 0xd5, 0x3d,
+ 0xa4, 0x2a, 0x05, 0x3e, 0x0a, 0xa4, 0x60, 0x3d, 0x24, 0x52, 0xa1, 0xbd, 0xb6, 0xb2, 0x98, 0x3d,
+ 0x0b, 0xe2, 0x05, 0x3e, 0xc5, 0xfb, 0xa4, 0xbd, 0xa9, 0x73, 0x24, 0xbd, 0x9e, 0xea, 0xff, 0x3d,
+ 0xa3, 0x61, 0x9a, 0xbc, 0x71, 0x87, 0x9c, 0x3d, 0xbe, 0xfa, 0x8c, 0x3d, 0xd9, 0xa6, 0x82, 0xbc,
+ 0x6e, 0xf2, 0x04, 0x3e, 0x0b, 0x9e, 0xc6, 0x3d, 0x5c, 0x15, 0x5d, 0xbd, 0xfc, 0x97, 0x21, 0x3e,
+ 0x11, 0x8f, 0xf8, 0xbb, 0x4f, 0x1f, 0x9f, 0xbd, 0x15, 0xa7, 0x01, 0xbd, 0xcd, 0x92, 0xa9, 0xbd,
+ 0xb0, 0xa8, 0x5d, 0x3d, 0x85, 0x5d, 0x88, 0x3d, 0xd6, 0x9c, 0x13, 0x3c, 0x2f, 0x46, 0x0d, 0xbe,
+ 0x33, 0x38, 0x5a, 0x3c, 0x12, 0xd4, 0x2b, 0x3d, 0x59, 0xf7, 0x06, 0xbe, 0x61, 0x35, 0xcd, 0xbe,
+ 0x27, 0xbd, 0x39, 0xbe, 0x20, 0x6c, 0x36, 0xbd, 0xb3, 0x2f, 0x2d, 0xbe, 0x35, 0x46, 0xcb, 0x3d,
+ 0x20, 0xb5, 0xd6, 0xbd, 0xd0, 0x3d, 0x13, 0xbe, 0x23, 0x49, 0x59, 0xbd, 0x3f, 0x20, 0x79, 0xbc,
+ 0x3b, 0x0c, 0x4f, 0x3d, 0xf0, 0xca, 0x95, 0x3d, 0xe3, 0x38, 0x5e, 0xbe, 0x21, 0xa9, 0xe1, 0xbd,
+ 0xb5, 0xbf, 0xa9, 0x3d, 0xdf, 0x8c, 0x43, 0xbe, 0x3a, 0x65, 0xe3, 0xbb, 0xcb, 0x38, 0xb7, 0x3d,
+ 0x0a, 0x7e, 0xc8, 0x3d, 0x44, 0x38, 0x6b, 0xbd, 0x4e, 0x5e, 0x04, 0x3d, 0x6b, 0x17, 0xb0, 0x3d,
+ 0xe4, 0x55, 0x6d, 0xbd, 0x61, 0x2d, 0x66, 0xbd, 0x10, 0xa9, 0x39, 0xbc, 0xc6, 0xa2, 0x0d, 0xbd,
+ 0x6f, 0xeb, 0x45, 0xbd, 0x59, 0xf3, 0x24, 0x3e, 0x71, 0x4f, 0x76, 0xbb, 0x06, 0xaa, 0xd4, 0x3d,
+ 0x7d, 0xe4, 0x0b, 0x3e, 0x46, 0x6c, 0xdc, 0xbd, 0x40, 0x0f, 0xf9, 0x3d, 0xe4, 0x84, 0xad, 0x3e,
+ 0x62, 0x60, 0x29, 0xbc, 0xa6, 0x19, 0x85, 0xbe, 0xc9, 0xda, 0x4b, 0x3e, 0xd3, 0xfb, 0x6a, 0xbc,
+ 0x30, 0x48, 0xaa, 0x3d, 0x22, 0x90, 0x19, 0xbe, 0x67, 0x11, 0xce, 0xbe, 0x50, 0x84, 0x33, 0x3e,
+ 0xb3, 0x88, 0xbf, 0xbd, 0x58, 0xe1, 0x53, 0xbe, 0x84, 0xc7, 0x29, 0xbd, 0x4e, 0x43, 0x26, 0xbe,
+ 0xa5, 0xef, 0x41, 0x3e, 0xed, 0x21, 0x8f, 0xbd, 0xef, 0xbf, 0x3f, 0xbe, 0xbb, 0xff, 0xf7, 0x3d,
+ 0x91, 0x97, 0x6e, 0x3d, 0x6a, 0xc0, 0x99, 0xbe, 0xe3, 0x44, 0x35, 0x3d, 0x8b, 0x53, 0xe3, 0x3c,
+ 0x9e, 0x86, 0xc8, 0xbc, 0x41, 0x57, 0x82, 0xbe, 0x83, 0x60, 0x19, 0xbe, 0xdd, 0xde, 0xa7, 0x3d,
+ 0xd2, 0x0b, 0xa9, 0x3d, 0x5f, 0x37, 0xca, 0x3d, 0xd1, 0x05, 0x81, 0xbc, 0x37, 0xa8, 0x06, 0x3e,
+ 0x65, 0xc8, 0x21, 0xbe, 0x4f, 0x81, 0x9e, 0x3c, 0x7f, 0x78, 0x1c, 0x3e, 0xd8, 0xc1, 0x6b, 0x3e,
+ 0x8a, 0xf7, 0x8d, 0x3c, 0x78, 0xb8, 0x0a, 0xbc, 0x4e, 0x3a, 0x06, 0xbd, 0x62, 0x80, 0x67, 0xbe,
+ 0x0d, 0xe0, 0x90, 0xbe, 0x4a, 0xcf, 0x2f, 0x3d, 0xa0, 0x4c, 0xf9, 0xbb, 0xa1, 0x4a, 0x07, 0x3c,
+ 0xcf, 0x23, 0x11, 0xbb, 0x26, 0x5f, 0x1e, 0x3e, 0x6a, 0x5f, 0xa2, 0x3e, 0x4b, 0x2f, 0x92, 0x3e,
+ 0x9e, 0xad, 0x98, 0x3e, 0xef, 0xf4, 0xb8, 0x3e, 0xe3, 0x38, 0x83, 0x3e, 0xe0, 0x36, 0xc9, 0xbd,
+ 0xb3, 0x9e, 0x9f, 0x3d, 0x33, 0x03, 0xad, 0x3c, 0x13, 0xdc, 0x95, 0x3d, 0x81, 0x9a, 0x0b, 0x3e,
+ 0x8f, 0xaa, 0x0d, 0x3d, 0x08, 0x6b, 0x38, 0xbd, 0xba, 0x6b, 0xb7, 0x3d, 0x80, 0xa3, 0x04, 0x3e,
+ 0x14, 0x4c, 0xe8, 0x3d, 0x58, 0x91, 0x7f, 0x3d, 0xdd, 0xc8, 0x75, 0xbd, 0xf7, 0x28, 0x35, 0xbe,
+ 0xf6, 0xd5, 0xb9, 0xbe, 0x4a, 0x38, 0x8c, 0xbd, 0x98, 0x45, 0xd3, 0xbd, 0xf3, 0xac, 0x19, 0xbf,
+ 0xb5, 0x04, 0xbf, 0xbe, 0xb0, 0xe0, 0x77, 0xbe, 0x01, 0x97, 0x7b, 0xbe, 0x25, 0x99, 0xcb, 0xbe,
+ 0xb2, 0x3e, 0x53, 0xbe, 0x86, 0x96, 0x2e, 0x3c, 0xac, 0xe1, 0x3e, 0xbd, 0x93, 0x34, 0x14, 0x3c,
+ 0xdf, 0x03, 0x59, 0xbe, 0xa7, 0x79, 0xef, 0xbd, 0x4a, 0x08, 0xa4, 0xbe, 0xa7, 0xaa, 0x26, 0xbe,
+ 0x8b, 0xa3, 0xb2, 0xbe, 0xf9, 0x9a, 0x84, 0xbe, 0x80, 0xb6, 0x19, 0x3e, 0xc7, 0x67, 0x5b, 0x3e,
+ 0x2e, 0xdf, 0x96, 0x3e, 0x92, 0x34, 0xb6, 0x3e, 0x97, 0xdc, 0x36, 0x3e, 0x4a, 0xe6, 0xbd, 0xbd,
+ 0xdb, 0x1c, 0xa0, 0x3c, 0xa0, 0x0e, 0x22, 0xbd, 0xbd, 0x25, 0x15, 0x3e, 0x6a, 0xb6, 0xbf, 0xbb,
+ 0x99, 0x2a, 0xa8, 0xbc, 0xa6, 0xb7, 0xc7, 0x3e, 0xb3, 0x4d, 0x11, 0x3d, 0x87, 0x61, 0x91, 0x3e,
+ 0x61, 0x2b, 0x85, 0xc0, 0xa0, 0xb9, 0x56, 0x3f, 0x46, 0xf1, 0x49, 0x40, 0xd3, 0x7e, 0x35, 0x3f,
+ 0x63, 0xbb, 0x2a, 0x3e, 0xba, 0x47, 0x67, 0xbf, 0xe7, 0x9b, 0x19, 0xbf, 0x30, 0xaf, 0x90, 0xbf,
+ 0xb1, 0x3d, 0x34, 0xbd, 0x59, 0x3e, 0xf4, 0x3e, 0x76, 0xf4, 0x16, 0x3f, 0x72, 0xff, 0x10, 0x3e,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00,
+ 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x12, 0x00,
+ 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0xb0, 0x1e, 0x00, 0x00,
+ 0x8d, 0x9e, 0x59, 0x3f, 0x92, 0x2c, 0xab, 0x3e, 0x8a, 0x03, 0x51, 0xbf, 0x14, 0xce, 0x2c, 0x3f,
+ 0x46, 0xe3, 0x3f, 0x3d, 0xd8, 0x55, 0xa3, 0xbe, 0x7d, 0xc6, 0x93, 0xbe, 0xe2, 0xfc, 0xa8, 0xbf,
+ 0x4e, 0xa2, 0x0e, 0x3e, 0x23, 0x15, 0xab, 0xbe, 0xc5, 0xb5, 0x11, 0xbe, 0xf1, 0x8b, 0xb7, 0xbd,
+ 0x0d, 0xf8, 0x0c, 0xbd, 0xbf, 0x7b, 0xdf, 0x3d, 0xb2, 0x17, 0x86, 0xbe, 0x9b, 0xb9, 0xc8, 0x3b,
+ 0x9f, 0x5e, 0x8f, 0xbf, 0xe2, 0xec, 0x77, 0xbf, 0x23, 0xc0, 0x0f, 0x3f, 0x9f, 0x52, 0x0d, 0x3f,
+ 0x6b, 0xbe, 0x81, 0xbe, 0x9b, 0x16, 0x73, 0x3e, 0x6e, 0x7d, 0x58, 0x3f, 0x0c, 0xf3, 0xe7, 0x3e,
+ 0xb7, 0xea, 0x69, 0x3e, 0x89, 0x8a, 0x28, 0x3e, 0x9b, 0x66, 0x48, 0xbe, 0x85, 0xc8, 0xd7, 0xbe,
+ 0xae, 0x9e, 0xd8, 0xbd, 0x66, 0xf9, 0x9c, 0xbd, 0x78, 0xd2, 0x54, 0xbe, 0x5e, 0xbc, 0x19, 0x3e,
+ 0x8f, 0x05, 0x97, 0xbe, 0x8d, 0x9a, 0x22, 0xbe, 0x6d, 0xdf, 0x97, 0xbe, 0xfe, 0xb9, 0x85, 0xbe,
+ 0x09, 0x32, 0x9e, 0x3d, 0x99, 0xf7, 0x7b, 0xbe, 0x5a, 0x82, 0xd8, 0xbe, 0xbf, 0x81, 0x16, 0xbf,
+ 0x66, 0xf7, 0x1c, 0x3e, 0x2f, 0xdc, 0x0f, 0x3f, 0x36, 0x5d, 0xa1, 0xbe, 0xa2, 0x35, 0xb6, 0xbe,
+ 0xa6, 0x7d, 0x1b, 0xbf, 0xab, 0x93, 0x34, 0xbf, 0xed, 0xd0, 0x04, 0xbf, 0xae, 0xc9, 0x4c, 0x3e,
+ 0x07, 0xe3, 0xf5, 0xbc, 0x98, 0x14, 0xb4, 0xbd, 0x51, 0x30, 0x98, 0xbe, 0x06, 0x14, 0xa9, 0x3e,
+ 0x34, 0xd5, 0xae, 0x3e, 0xfc, 0x53, 0x3b, 0xbf, 0x10, 0xa2, 0x64, 0x3e, 0xde, 0xb6, 0x85, 0xbe,
+ 0x71, 0xb5, 0x6b, 0xbe, 0xbc, 0x9c, 0xf3, 0x3e, 0x70, 0x97, 0x93, 0x3f, 0x9b, 0xcf, 0x8e, 0x3e,
+ 0x47, 0xad, 0x24, 0x3e, 0x00, 0xc6, 0xdb, 0x3e, 0xa0, 0x93, 0x11, 0x3e, 0xd9, 0x04, 0x6a, 0xbf,
+ 0x47, 0x0d, 0xe5, 0xbe, 0x7b, 0xe4, 0xd6, 0x37, 0xed, 0x27, 0xee, 0x3e, 0xf5, 0x2d, 0x37, 0xbe,
+ 0x0d, 0x6a, 0x4f, 0xbf, 0x59, 0xca, 0x56, 0x3e, 0x46, 0xff, 0xd5, 0x3e, 0x8c, 0x2f, 0x66, 0xbe,
+ 0x27, 0xc3, 0xe3, 0xbe, 0x29, 0xa7, 0xa6, 0x3e, 0x85, 0xb7, 0x0e, 0xbf, 0x6d, 0xb6, 0xdb, 0x3e,
+ 0x14, 0xde, 0xb7, 0x3e, 0x7d, 0xfb, 0x26, 0x3f, 0x93, 0x4e, 0x25, 0xbf, 0x6d, 0x48, 0x4f, 0xbf,
+ 0x51, 0x75, 0x94, 0xbe, 0xbc, 0xcf, 0x28, 0x3f, 0x48, 0x6d, 0x5f, 0x3e, 0xea, 0xa8, 0x21, 0xbf,
+ 0xd3, 0x6a, 0x27, 0x3e, 0x8c, 0x7f, 0xc7, 0xbe, 0x11, 0x2b, 0x6d, 0xbc, 0x2a, 0xba, 0xc0, 0xbd,
+ 0x96, 0x7c, 0xd1, 0x3e, 0x21, 0x71, 0xa0, 0xbd, 0xf7, 0x7d, 0xb4, 0x3e, 0x05, 0x95, 0x4b, 0xbf,
+ 0x1f, 0xbe, 0x1c, 0xbe, 0xb8, 0x6e, 0x60, 0x3e, 0x91, 0x5b, 0x32, 0xbe, 0x58, 0xa3, 0x0b, 0x3f,
+ 0x46, 0x9d, 0xa7, 0xbe, 0xea, 0x81, 0x6a, 0xbd, 0x70, 0xd2, 0x4d, 0xbe, 0xa9, 0x16, 0x7f, 0xbe,
+ 0x3c, 0x8c, 0x5c, 0x3f, 0xa3, 0xcd, 0xb5, 0x3f, 0x1e, 0x6c, 0x2a, 0x3f, 0xa6, 0x22, 0xf6, 0x3e,
+ 0xeb, 0x88, 0x0c, 0x3f, 0x70, 0x8d, 0xf2, 0x3d, 0x96, 0x96, 0x8b, 0xbe, 0x22, 0x34, 0x12, 0xbf,
+ 0x75, 0x7b, 0x83, 0xbf, 0xf4, 0xaa, 0x12, 0xbe, 0xf2, 0xa6, 0xca, 0x3e, 0xed, 0x6d, 0xc2, 0x3f,
+ 0xf2, 0x7c, 0x51, 0x3f, 0x1d, 0x34, 0xd4, 0xbe, 0xe7, 0x3d, 0x34, 0x3f, 0x53, 0x4a, 0xb9, 0x3e,
+ 0xbc, 0x0f, 0x83, 0xbd, 0x07, 0x24, 0x5e, 0xbf, 0xd5, 0x81, 0xb6, 0xbe, 0x00, 0xac, 0x40, 0xbc,
+ 0xf7, 0x5f, 0x7f, 0x3d, 0xe9, 0x1f, 0x40, 0x3f, 0x1f, 0x37, 0x64, 0xbb, 0x26, 0x40, 0x4c, 0x3f,
+ 0xd7, 0x3f, 0x06, 0x3e, 0x6a, 0xb0, 0x2b, 0xbf, 0xc1, 0x68, 0x80, 0xbd, 0x95, 0xb1, 0x11, 0x3f,
+ 0xaa, 0x53, 0x15, 0x3f, 0xfb, 0x0c, 0x98, 0x3f, 0x89, 0x4c, 0x96, 0x3f, 0xdf, 0xea, 0x8b, 0xbe,
+ 0x66, 0xe7, 0x22, 0x3f, 0x13, 0x41, 0x24, 0x3f, 0x15, 0x39, 0x81, 0x3e, 0xd5, 0x3d, 0x94, 0xbf,
+ 0xc9, 0xbe, 0x53, 0xbf, 0x94, 0x02, 0x9e, 0x3e, 0x23, 0xde, 0x14, 0xbf, 0xcf, 0x31, 0xf4, 0xbe,
+ 0x03, 0x33, 0x27, 0xbe, 0xa0, 0x28, 0xd2, 0xbe, 0x6b, 0x57, 0xab, 0xbe, 0xd7, 0x31, 0x43, 0x3e,
+ 0x01, 0x47, 0xc5, 0xbe, 0xf9, 0xfe, 0x71, 0xbe, 0xfa, 0xea, 0xaa, 0xbe, 0x6e, 0x1b, 0x80, 0x3e,
+ 0xc2, 0xf5, 0x62, 0xbe, 0x8b, 0x5a, 0xa4, 0xbe, 0xc7, 0x5e, 0xa8, 0x3c, 0x2f, 0xe2, 0x1e, 0xbf,
+ 0x46, 0x5e, 0x1d, 0xbf, 0xca, 0x1a, 0x08, 0xbf, 0x88, 0x72, 0x23, 0xbf, 0xe5, 0xaa, 0xb7, 0x3e,
+ 0x65, 0x81, 0x2f, 0xbf, 0x6d, 0xb0, 0x64, 0x3e, 0xa7, 0x7d, 0x4e, 0xbe, 0x6c, 0xa4, 0x04, 0x3d,
+ 0x43, 0x3b, 0xd8, 0x3d, 0xa2, 0xf6, 0xcd, 0xbe, 0xb0, 0xd3, 0xa8, 0xbf, 0x60, 0x72, 0x71, 0xbf,
+ 0x95, 0x20, 0xd8, 0x3e, 0xa2, 0x7e, 0xdd, 0x3b, 0x84, 0x30, 0x44, 0xbf, 0x73, 0x82, 0x26, 0xbd,
+ 0xe2, 0xcf, 0xa4, 0x3e, 0x31, 0xd0, 0x8b, 0x3e, 0x48, 0x39, 0x93, 0xbe, 0x1e, 0xca, 0x3c, 0xbf,
+ 0x8f, 0xb6, 0xc0, 0xbe, 0x34, 0xac, 0xc5, 0x3d, 0x8f, 0x46, 0x1a, 0xbf, 0xc2, 0x32, 0x4a, 0xbf,
+ 0xc2, 0x56, 0x57, 0x3e, 0x4b, 0xfe, 0xc7, 0xbe, 0x4b, 0x8e, 0x97, 0xbe, 0x85, 0xb1, 0x6f, 0x3d,
+ 0x82, 0x3e, 0x8e, 0xbf, 0xe2, 0x80, 0xb2, 0xbf, 0x21, 0xc2, 0x12, 0x3e, 0xe8, 0xf7, 0x01, 0xbe,
+ 0x6d, 0xc8, 0xa6, 0xbf, 0x02, 0xc2, 0xb6, 0xbe, 0x01, 0x9b, 0x2b, 0xbf, 0x80, 0x82, 0xd8, 0xbe,
+ 0x48, 0x0b, 0x11, 0xbe, 0xdb, 0x8c, 0xee, 0xbf, 0xbd, 0x0b, 0xe0, 0xbb, 0x0d, 0xec, 0x3b, 0x3e,
+ 0x31, 0x7d, 0x0e, 0xbf, 0xf0, 0x8e, 0xa5, 0xbc, 0x21, 0x33, 0xa0, 0x3e, 0xc2, 0x3c, 0xb4, 0x3e,
+ 0x85, 0x79, 0x27, 0x3d, 0x79, 0xdc, 0x84, 0x3e, 0x0c, 0xad, 0x04, 0xbf, 0xae, 0x37, 0x7c, 0xbe,
+ 0x82, 0x90, 0x99, 0xbe, 0x39, 0x68, 0xee, 0x3e, 0xcf, 0x9d, 0xb0, 0x3b, 0x0e, 0x8c, 0xba, 0xbe,
+ 0x2a, 0xa4, 0x2a, 0xbd, 0x61, 0x4f, 0xb9, 0xbd, 0x9d, 0xc7, 0x39, 0x3e, 0xad, 0xd8, 0x03, 0xbf,
+ 0x5e, 0xc4, 0x75, 0x3f, 0xe8, 0x6f, 0xf0, 0x3e, 0x42, 0x94, 0x1d, 0x3f, 0xdf, 0xbc, 0x1f, 0x3d,
+ 0x8e, 0x39, 0x16, 0x3b, 0x57, 0xbf, 0x94, 0x3e, 0x51, 0x74, 0x15, 0x3e, 0x34, 0xfb, 0xdc, 0x3e,
+ 0xa1, 0x4e, 0x9b, 0xbd, 0xbb, 0xe2, 0x80, 0xbe, 0x5a, 0x96, 0x1c, 0x3f, 0xd6, 0x63, 0x46, 0xbf,
+ 0x2f, 0xdc, 0x93, 0xbe, 0x32, 0x03, 0xea, 0x3e, 0xcf, 0xb7, 0x14, 0xbf, 0x88, 0x71, 0xe8, 0x3e,
+ 0xb3, 0x34, 0xec, 0xbe, 0x93, 0x4d, 0xa2, 0xbe, 0x23, 0xb8, 0x78, 0xbc, 0x66, 0x54, 0x0a, 0xbe,
+ 0x0c, 0xd8, 0xf6, 0xbd, 0xc6, 0xb2, 0x81, 0x3d, 0xe6, 0x8e, 0x2e, 0xbe, 0xc9, 0x43, 0xad, 0xbd,
+ 0x93, 0x93, 0x14, 0x3f, 0x38, 0x84, 0xdf, 0x3e, 0x3a, 0xa5, 0xd5, 0xbe, 0x3f, 0x0e, 0xb3, 0xbe,
+ 0x51, 0x9c, 0x13, 0xbe, 0x86, 0x48, 0x49, 0xbf, 0xd8, 0xc6, 0x2b, 0xbf, 0x4f, 0x17, 0xc6, 0xbe,
+ 0x72, 0xa3, 0x7d, 0xbe, 0x17, 0x10, 0x24, 0xbe, 0x5d, 0x5f, 0x88, 0x3e, 0x68, 0xfa, 0x9c, 0x3e,
+ 0x63, 0xf0, 0x2d, 0xbe, 0x4c, 0x96, 0xd0, 0x3d, 0xb3, 0x7c, 0x38, 0xbe, 0x17, 0x48, 0xc7, 0xbd,
+ 0x4b, 0x69, 0x28, 0xbe, 0x25, 0xa4, 0x63, 0x3f, 0xb1, 0x48, 0x20, 0x3f, 0x0d, 0xa6, 0x11, 0x3f,
+ 0xca, 0x9c, 0xe5, 0xbe, 0xfb, 0xca, 0x31, 0xbe, 0xbd, 0xc2, 0xef, 0xbe, 0x9a, 0xa0, 0x08, 0x3f,
+ 0x46, 0x2f, 0xbb, 0x3e, 0x37, 0x07, 0x4e, 0xbe, 0xa9, 0x58, 0x81, 0x3e, 0xef, 0x98, 0xa7, 0x3e,
+ 0x2d, 0x56, 0x8b, 0x3e, 0x1c, 0x97, 0x0a, 0x3e, 0x1e, 0x5c, 0x03, 0x3d, 0xae, 0x90, 0x02, 0xbf,
+ 0x7e, 0xa2, 0xf1, 0xbe, 0xfc, 0x68, 0x4c, 0xbf, 0x11, 0xca, 0x1f, 0xbf, 0x6a, 0x57, 0xba, 0xbe,
+ 0xbd, 0xcc, 0xbe, 0xbe, 0x85, 0x33, 0x33, 0xbc, 0xb1, 0x92, 0xd8, 0x3e, 0x1e, 0x2b, 0xe0, 0x3d,
+ 0x4d, 0x0a, 0x93, 0x3e, 0x4f, 0xdd, 0x60, 0xbe, 0xed, 0xd2, 0xac, 0xbc, 0xe4, 0xc7, 0x3b, 0xbf,
+ 0x67, 0x1d, 0x0d, 0xbf, 0x86, 0x85, 0x34, 0xbe, 0x83, 0xe9, 0x16, 0xbf, 0xa0, 0x6d, 0x5b, 0xbe,
+ 0xb2, 0x6c, 0xea, 0xbd, 0xf5, 0x51, 0xa1, 0x3e, 0xf3, 0x1f, 0xae, 0xbc, 0x69, 0xee, 0x02, 0xbf,
+ 0xed, 0x58, 0xbb, 0xbe, 0xaa, 0x37, 0x84, 0x3e, 0xab, 0xd0, 0xc8, 0x3e, 0xdb, 0x48, 0x3a, 0x3e,
+ 0xab, 0xae, 0xb2, 0xbe, 0x5e, 0xb8, 0x19, 0xbf, 0x13, 0x49, 0xfc, 0xbd, 0xec, 0xc9, 0x0e, 0x3f,
+ 0xb4, 0xfc, 0xd6, 0xbe, 0x1c, 0x9b, 0xa1, 0x3e, 0x5f, 0x3f, 0xa8, 0xbb, 0x7f, 0xa8, 0xf1, 0x3e,
+ 0xfa, 0x38, 0xf8, 0x3d, 0x24, 0x8b, 0xcb, 0xbd, 0x24, 0xf4, 0x33, 0xbf, 0xd4, 0x7b, 0xbf, 0xbe,
+ 0xbf, 0xae, 0xf8, 0xbd, 0x94, 0x9e, 0xc3, 0xbe, 0x76, 0xd8, 0xce, 0xbe, 0x5b, 0x66, 0x59, 0xbe,
+ 0x07, 0x9a, 0x39, 0xbe, 0x42, 0x18, 0xd4, 0xbd, 0xbf, 0x2d, 0x41, 0x3e, 0x85, 0xc4, 0x80, 0xbe,
+ 0x09, 0xfd, 0x99, 0xbe, 0x42, 0x19, 0xb3, 0x3d, 0x6c, 0x75, 0xb5, 0x3e, 0x4e, 0xfb, 0x8a, 0x3e,
+ 0x12, 0x39, 0xac, 0x3d, 0x34, 0x24, 0xbd, 0x3e, 0xdc, 0xae, 0x6f, 0x3f, 0x63, 0x9a, 0xef, 0x3d,
+ 0xd5, 0xc8, 0x1c, 0xbf, 0x27, 0x5b, 0x4f, 0xbe, 0xa9, 0xb5, 0x10, 0xbe, 0x6c, 0x75, 0x60, 0xbe,
+ 0xf6, 0xe7, 0xc2, 0xbd, 0x31, 0x73, 0x1c, 0xbe, 0xac, 0x0c, 0x77, 0x3e, 0xbc, 0x18, 0x1d, 0x3f,
+ 0xa7, 0x02, 0xae, 0x3e, 0xd1, 0x74, 0x47, 0xbf, 0x54, 0xa4, 0xb7, 0xbe, 0xfb, 0x30, 0x97, 0x3e,
+ 0x4e, 0x4c, 0x32, 0xbe, 0x24, 0x5c, 0x80, 0x3e, 0xc9, 0xd1, 0x21, 0x3d, 0xec, 0xf7, 0x01, 0x3f,
+ 0x28, 0xbb, 0xbf, 0x3e, 0x42, 0x39, 0xe5, 0x3e, 0xa5, 0xd9, 0x95, 0x3c, 0x3b, 0xb3, 0x72, 0x3e,
+ 0xe2, 0xdb, 0x9e, 0xbd, 0xb3, 0x64, 0x24, 0xbf, 0x6e, 0x91, 0x13, 0xbf, 0x28, 0x21, 0x9b, 0x3d,
+ 0xae, 0x40, 0x2c, 0xbf, 0xfb, 0x56, 0x91, 0x3d, 0x83, 0x9b, 0xdd, 0x3e, 0xcf, 0xe9, 0x26, 0x3e,
+ 0x83, 0xab, 0x94, 0xbe, 0x91, 0xcd, 0xfe, 0x3c, 0x06, 0xda, 0x24, 0xbf, 0x60, 0xb5, 0x82, 0xbe,
+ 0x23, 0x81, 0xa6, 0x3d, 0x7f, 0x6a, 0x00, 0xbf, 0x19, 0xed, 0x2d, 0xbf, 0x07, 0x51, 0x38, 0x3f,
+ 0x62, 0x3b, 0xbc, 0x3e, 0x66, 0x82, 0x65, 0x3f, 0x40, 0x34, 0xbc, 0x3e, 0xa6, 0xeb, 0x02, 0xbc,
+ 0x86, 0xd4, 0xb3, 0xbe, 0xfe, 0x1a, 0xbf, 0x3e, 0x84, 0x48, 0xab, 0x3d, 0x40, 0xf2, 0x84, 0xbe,
+ 0x3a, 0x8a, 0x4e, 0x3e, 0x72, 0xdd, 0x24, 0x3f, 0x75, 0xc2, 0x05, 0xbf, 0x5d, 0x08, 0xb9, 0xbe,
+ 0xc7, 0x68, 0xc5, 0x3e, 0x63, 0xb6, 0xca, 0xbe, 0x25, 0xe3, 0x2c, 0xbf, 0x55, 0xdc, 0xf2, 0xbc,
+ 0xae, 0x5a, 0xe9, 0x3e, 0x5a, 0x06, 0xf8, 0xbe, 0x48, 0x03, 0x0f, 0x3f, 0x90, 0x1f, 0xa7, 0x3f,
+ 0x65, 0xa7, 0x73, 0xbe, 0x5d, 0x49, 0xa7, 0x3e, 0x45, 0x94, 0x1a, 0x3f, 0x8a, 0x54, 0xf2, 0x3e,
+ 0x4f, 0x0f, 0x62, 0x3e, 0x71, 0x99, 0x1c, 0x3e, 0x8b, 0x5b, 0x1f, 0xbe, 0x5f, 0x13, 0xbf, 0x3e,
+ 0xf1, 0x0d, 0x0b, 0x3f, 0x92, 0x2d, 0xb7, 0xbe, 0xfd, 0xdd, 0x47, 0xbe, 0x2b, 0xe7, 0x9a, 0xbf,
+ 0x57, 0x4a, 0xfa, 0xbe, 0x36, 0x15, 0x76, 0x3e, 0xe3, 0x5c, 0x37, 0xbf, 0x7b, 0xaf, 0x3b, 0xbf,
+ 0xf8, 0x2f, 0x72, 0xbe, 0x33, 0xab, 0x5e, 0x3f, 0xbd, 0x2c, 0x25, 0xbf, 0xaa, 0x34, 0x67, 0x3e,
+ 0x88, 0x55, 0xb7, 0xbe, 0xdb, 0x3a, 0xab, 0x3e, 0xa6, 0x5a, 0x3d, 0x3f, 0x7d, 0xa3, 0x75, 0xbe,
+ 0x31, 0x9f, 0xa5, 0xbb, 0xe3, 0x6f, 0xfc, 0xbe, 0xf2, 0xb8, 0x80, 0x3f, 0xe6, 0xe8, 0x70, 0x3b,
+ 0x6f, 0x8c, 0xd2, 0x3d, 0x75, 0x91, 0x62, 0x3f, 0x28, 0x4f, 0x14, 0x3f, 0x35, 0x58, 0x93, 0x3f,
+ 0x5b, 0x55, 0x6f, 0x3e, 0x57, 0xe1, 0x6c, 0xbd, 0x62, 0x1c, 0x5c, 0x3e, 0x86, 0x81, 0xaf, 0xbe,
+ 0xb0, 0xe7, 0xe4, 0xbe, 0x17, 0xfd, 0xb5, 0x3e, 0x81, 0x89, 0x56, 0xbe, 0xf5, 0x17, 0xc3, 0xbd,
+ 0x3f, 0xc6, 0x5a, 0x3e, 0x57, 0x30, 0x2d, 0x3f, 0x77, 0xc1, 0x9e, 0xbd, 0x48, 0xaa, 0x67, 0x3e,
+ 0xa2, 0x93, 0x86, 0xbd, 0x56, 0xbf, 0xd9, 0x3d, 0x93, 0x47, 0x16, 0xbe, 0xf4, 0xa7, 0x1f, 0x3e,
+ 0x82, 0x7f, 0xb7, 0x3e, 0x59, 0x0a, 0xcb, 0xbd, 0xcf, 0x05, 0x65, 0xbe, 0x37, 0x45, 0x38, 0xbf,
+ 0x4d, 0x5f, 0xc0, 0x3e, 0x85, 0xa9, 0x88, 0xbe, 0xf4, 0x77, 0xa7, 0xbe, 0x86, 0xe3, 0x7d, 0x3e,
+ 0x93, 0x58, 0xc4, 0xbe, 0x80, 0x8a, 0x5e, 0x3e, 0x30, 0x34, 0xdc, 0x3b, 0xdc, 0x21, 0xef, 0xbe,
+ 0xde, 0x26, 0x35, 0xbf, 0x1a, 0x9a, 0xd7, 0x3e, 0x19, 0x8a, 0x22, 0x3c, 0xcf, 0xb2, 0x8f, 0xbe,
+ 0x02, 0xe0, 0xce, 0xbe, 0x7f, 0x7f, 0x6c, 0xbf, 0x73, 0x9b, 0xb4, 0x3e, 0x1d, 0xe0, 0xc1, 0x3e,
+ 0x7b, 0xc5, 0x61, 0x3e, 0x2d, 0xa5, 0x8d, 0x3d, 0x47, 0x77, 0xbd, 0xbe, 0x59, 0x8c, 0x8e, 0xbe,
+ 0x50, 0x65, 0x0b, 0x3e, 0x54, 0x3e, 0xd4, 0x3e, 0x6c, 0x5d, 0xbc, 0x3d, 0x0a, 0x50, 0xc0, 0x3e,
+ 0x99, 0x2e, 0x71, 0x3f, 0xb7, 0x09, 0x72, 0xbe, 0x79, 0x8b, 0xf5, 0xbe, 0x9e, 0xc7, 0xea, 0x3e,
+ 0xa6, 0x1d, 0xbb, 0x3d, 0x16, 0xca, 0xb4, 0xbd, 0xd8, 0x2c, 0x95, 0xbe, 0x15, 0x77, 0x23, 0xbe,
+ 0x9f, 0x1d, 0x2f, 0xbf, 0xeb, 0xe6, 0x2c, 0xbf, 0xff, 0xcc, 0x80, 0xbe, 0xc7, 0x94, 0x81, 0x3e,
+ 0x95, 0xde, 0x41, 0xbe, 0x08, 0x5c, 0x9a, 0xbe, 0xd0, 0x8f, 0x08, 0xbf, 0x54, 0x9d, 0x16, 0x3f,
+ 0x85, 0xeb, 0xe9, 0x3e, 0xe8, 0x45, 0x08, 0xbf, 0x60, 0x91, 0x9f, 0x3d, 0x07, 0x3a, 0x8d, 0xbc,
+ 0x50, 0x45, 0x95, 0x3e, 0x8e, 0xae, 0x97, 0xbc, 0x78, 0x04, 0x4e, 0x3d, 0xf4, 0x13, 0x4c, 0x3f,
+ 0xc0, 0x33, 0x1a, 0xbf, 0xa8, 0x5c, 0x11, 0xbe, 0x47, 0xf2, 0xf4, 0xbd, 0x3b, 0xfb, 0xd1, 0xbe,
+ 0xef, 0x12, 0x6d, 0xbe, 0xcb, 0x5f, 0x93, 0x3e, 0x99, 0x23, 0xcb, 0xbb, 0x17, 0xb8, 0xf4, 0xbe,
+ 0x8a, 0x1a, 0x1d, 0x3e, 0x82, 0x34, 0xd2, 0x3e, 0x4b, 0xb2, 0x80, 0x3e, 0x88, 0x47, 0x70, 0xbd,
+ 0x4d, 0xb6, 0x0e, 0x3f, 0x4c, 0x2c, 0x99, 0x3e, 0x74, 0x60, 0xc0, 0x3e, 0x8e, 0x32, 0xf3, 0xbb,
+ 0x2a, 0xb7, 0xf7, 0xbc, 0xdc, 0x62, 0x0d, 0x3f, 0x73, 0x34, 0xe9, 0x3e, 0x76, 0x04, 0xc5, 0xbb,
+ 0x90, 0x63, 0xfb, 0x3e, 0xec, 0x6a, 0xd9, 0xbe, 0x56, 0x56, 0x1f, 0xbf, 0x1c, 0x32, 0x84, 0x3e,
+ 0x83, 0x25, 0xba, 0xbe, 0x41, 0x56, 0xdd, 0xbe, 0x49, 0xae, 0x4d, 0xbd, 0xeb, 0xcd, 0xe8, 0x3c,
+ 0x1d, 0xcb, 0x12, 0x3f, 0xda, 0xa1, 0xa1, 0x3e, 0x39, 0xcc, 0xc1, 0x3e, 0x2e, 0xa6, 0x06, 0x3f,
+ 0xe0, 0x25, 0x7f, 0x3b, 0x76, 0x62, 0x8d, 0xbe, 0x29, 0x51, 0x12, 0xbf, 0xf2, 0xa3, 0xaf, 0x3e,
+ 0x6c, 0x41, 0x77, 0xbe, 0xd8, 0x95, 0xf7, 0xbd, 0xc0, 0x86, 0x17, 0xbf, 0x14, 0xc0, 0xc1, 0xbe,
+ 0x35, 0xfa, 0x1b, 0x3f, 0xf1, 0x90, 0x79, 0xbd, 0x07, 0xfd, 0x52, 0x3d, 0x5b, 0x39, 0xc6, 0xbe,
+ 0xb1, 0x61, 0xc3, 0x3e, 0x9e, 0x5b, 0x23, 0x3f, 0x64, 0x6c, 0xe0, 0x3e, 0xd4, 0x7d, 0x25, 0x3f,
+ 0x82, 0x49, 0xd1, 0x3d, 0xe8, 0xba, 0x1b, 0xbe, 0x3c, 0x06, 0xe4, 0x3e, 0x65, 0x3c, 0xaa, 0xbe,
+ 0x6a, 0x88, 0xf1, 0x3e, 0xc3, 0x28, 0xc8, 0x3c, 0xd8, 0xc8, 0x53, 0xbd, 0xa1, 0x55, 0xc9, 0x3d,
+ 0xec, 0xaf, 0xeb, 0xbe, 0x54, 0x81, 0x70, 0x3e, 0x9d, 0xd1, 0x73, 0xbe, 0x3b, 0x15, 0xfe, 0x3e,
+ 0x1e, 0x51, 0x96, 0xbc, 0x43, 0x71, 0x36, 0x3e, 0xda, 0x66, 0x6b, 0x3e, 0x04, 0x2d, 0x86, 0xbe,
+ 0x23, 0xda, 0x85, 0xbd, 0xbd, 0x08, 0xd8, 0xbc, 0x4b, 0x17, 0x67, 0xbf, 0x68, 0x64, 0x30, 0xbf,
+ 0x08, 0x56, 0xc1, 0x3e, 0xc4, 0x18, 0x2e, 0xbe, 0xca, 0x3e, 0x9b, 0xbe, 0xcb, 0xb1, 0x5b, 0xbe,
+ 0xff, 0xf9, 0xac, 0xbe, 0x6a, 0x09, 0xe7, 0xbe, 0xb6, 0xaf, 0x23, 0x3f, 0xf1, 0x5d, 0xb1, 0x3e,
+ 0x2c, 0x1e, 0x61, 0xbe, 0x88, 0x1f, 0x32, 0xbe, 0xa9, 0x40, 0x27, 0xbb, 0xb5, 0x7d, 0x3c, 0xbe,
+ 0xcc, 0x09, 0x29, 0xbe, 0x9a, 0xee, 0x6b, 0x3e, 0xeb, 0xbb, 0x37, 0x3e, 0x2c, 0x11, 0x59, 0x39,
+ 0x09, 0x31, 0x76, 0x3e, 0xc2, 0x5a, 0xe3, 0x3e, 0xdd, 0x79, 0xaf, 0xbe, 0x55, 0x4d, 0x2c, 0xbe,
+ 0x0e, 0x0f, 0x11, 0xbe, 0xc3, 0x89, 0x0b, 0x3e, 0x84, 0x59, 0x6e, 0x3e, 0x8f, 0x7e, 0x27, 0x3d,
+ 0xf8, 0x38, 0x11, 0x3f, 0x6c, 0x00, 0xe3, 0x3e, 0x7b, 0x4a, 0x2f, 0xbe, 0xe3, 0x9f, 0xac, 0xbe,
+ 0x52, 0xec, 0x82, 0xbf, 0xb8, 0x8c, 0x06, 0xbf, 0x52, 0xcd, 0x8a, 0x3e, 0x9a, 0x16, 0x5b, 0xbe,
+ 0xbf, 0x4f, 0x24, 0x3e, 0xb2, 0xf0, 0x3e, 0x3e, 0x0d, 0x4b, 0xd0, 0xbd, 0x66, 0xed, 0x38, 0x3e,
+ 0x1c, 0x5b, 0xc7, 0xbe, 0x68, 0xbd, 0x87, 0x3d, 0xbb, 0xf6, 0x13, 0x3f, 0xb2, 0xd7, 0xd3, 0xbe,
+ 0x04, 0xdc, 0x55, 0x3e, 0xd0, 0x31, 0x1a, 0xbd, 0xed, 0xba, 0x3f, 0x3e, 0x70, 0xc6, 0x07, 0x3f,
+ 0x9a, 0x2d, 0x67, 0x3e, 0x46, 0xf0, 0x16, 0xbf, 0x14, 0xf8, 0xc1, 0x3e, 0x6b, 0xa1, 0xfe, 0x3e,
+ 0x1f, 0x4b, 0xd7, 0xbd, 0xcc, 0x84, 0x8f, 0xbe, 0x8b, 0x46, 0xf5, 0xbc, 0xb7, 0xa4, 0x2d, 0xbf,
+ 0x78, 0xaf, 0x7a, 0xbe, 0x65, 0xe5, 0x79, 0xbc, 0x63, 0x9a, 0xc7, 0x3d, 0x49, 0x46, 0xb9, 0xbe,
+ 0xc4, 0xc8, 0xb2, 0x3e, 0x93, 0xec, 0x5e, 0xbe, 0x12, 0x6a, 0x7f, 0xbf, 0xc5, 0x15, 0x68, 0xbf,
+ 0x25, 0xdf, 0xe5, 0xbd, 0xea, 0x69, 0x9a, 0xbd, 0xdf, 0x5a, 0x9f, 0x3e, 0xf1, 0xba, 0x85, 0x3d,
+ 0xfe, 0x8e, 0xa9, 0xbc, 0x21, 0x6a, 0x31, 0x3e, 0xa8, 0xf1, 0x09, 0xbf, 0x87, 0x1a, 0x93, 0xbe,
+ 0xc4, 0x7d, 0xc7, 0x3e, 0xad, 0x37, 0xfb, 0xbd, 0x05, 0x9d, 0xb2, 0xbe, 0x87, 0x67, 0xf3, 0xbd,
+ 0x61, 0xba, 0x84, 0xbe, 0xbd, 0x6f, 0x9d, 0xbf, 0xc3, 0x9e, 0xce, 0xbe, 0xaa, 0xc0, 0x33, 0x3d,
+ 0xef, 0xa9, 0x31, 0xbe, 0xb4, 0xff, 0xef, 0xbe, 0x26, 0x68, 0xfb, 0xbe, 0xe1, 0x47, 0x15, 0x3f,
+ 0x51, 0x97, 0x1c, 0x3f, 0x52, 0xe2, 0x90, 0xbe, 0xf5, 0x7a, 0x16, 0xbf, 0x8a, 0x78, 0x10, 0x3e,
+ 0x6d, 0xe5, 0x13, 0xbf, 0xa9, 0xe6, 0x03, 0xbe, 0x2a, 0x74, 0x05, 0xbf, 0x96, 0xa2, 0x04, 0xbf,
+ 0x70, 0x8f, 0xc9, 0xbe, 0x1e, 0x76, 0x19, 0xbf, 0x23, 0xec, 0xd8, 0xbd, 0xa8, 0x76, 0x45, 0x3e,
+ 0xc9, 0xeb, 0x12, 0x3f, 0x52, 0xb5, 0x0c, 0x3f, 0x54, 0x32, 0x77, 0xbd, 0xaf, 0x9f, 0x96, 0xbc,
+ 0x0d, 0x57, 0x2b, 0xbb, 0xa0, 0xe5, 0xe3, 0x3b, 0x2f, 0xd3, 0x72, 0x3e, 0x67, 0xd4, 0xba, 0xbd,
+ 0x93, 0x42, 0xb5, 0xbd, 0x16, 0xc9, 0xdd, 0xbe, 0xbc, 0xf8, 0x22, 0x3e, 0x9d, 0xaf, 0x09, 0x3f,
+ 0xe5, 0x94, 0x19, 0x3f, 0xf1, 0x69, 0x13, 0x3f, 0x22, 0x3d, 0x40, 0x3f, 0x0a, 0x41, 0x2b, 0x3f,
+ 0xba, 0x19, 0x75, 0x39, 0xe2, 0x69, 0x76, 0xbf, 0xe6, 0x09, 0x00, 0xbf, 0x5d, 0x61, 0x19, 0x3e,
+ 0xe9, 0xba, 0xbf, 0x3d, 0x14, 0xc1, 0x21, 0x3f, 0x51, 0xf4, 0xd2, 0xbe, 0xd6, 0xb8, 0x03, 0x3e,
+ 0xb3, 0x45, 0x88, 0xbe, 0x01, 0xd6, 0x42, 0x3e, 0x06, 0x3c, 0x81, 0x3e, 0x61, 0xc4, 0x56, 0x3d,
+ 0xd9, 0x81, 0xa9, 0xbe, 0xa4, 0xad, 0x02, 0x3e, 0x39, 0x5f, 0xbc, 0xbd, 0xba, 0x44, 0xc3, 0xbe,
+ 0x16, 0xa4, 0xcb, 0xbd, 0x04, 0x17, 0xa4, 0xbc, 0xba, 0x3c, 0x96, 0xbe, 0x28, 0xb3, 0x41, 0xbe,
+ 0x3e, 0x4b, 0x1f, 0x3e, 0x4a, 0x29, 0x56, 0xbe, 0x2d, 0x25, 0xf7, 0x3e, 0x5f, 0xeb, 0x06, 0x3f,
+ 0xfc, 0x3d, 0xa3, 0xbe, 0xe6, 0x03, 0x84, 0xbe, 0xaf, 0x0d, 0x1c, 0x3f, 0xde, 0x1d, 0xb6, 0x3d,
+ 0xf9, 0x1b, 0x30, 0x3d, 0xb8, 0x35, 0x22, 0xbf, 0x79, 0xcf, 0xb7, 0x3b, 0x0c, 0xba, 0xb1, 0xbb,
+ 0x53, 0xd9, 0x8a, 0xbe, 0x8b, 0x4f, 0xba, 0xbe, 0xe5, 0xc2, 0x78, 0xbe, 0xca, 0xff, 0xfa, 0x3c,
+ 0xfe, 0x4a, 0xf5, 0x3d, 0x58, 0x50, 0x39, 0x3f, 0xe4, 0x9b, 0x64, 0xbd, 0x18, 0x66, 0xbb, 0xbe,
+ 0x4c, 0x32, 0x09, 0x3e, 0x38, 0x66, 0x33, 0xbd, 0x00, 0x84, 0xc0, 0x3c, 0x06, 0x93, 0xf7, 0xbe,
+ 0xb0, 0x4d, 0x33, 0xbf, 0xd8, 0x22, 0xc2, 0x3f, 0x48, 0xd6, 0xcd, 0x3e, 0x01, 0xc9, 0x7d, 0x3d,
+ 0x88, 0x0c, 0x8d, 0x3e, 0x02, 0xca, 0xab, 0x3d, 0xe9, 0x32, 0xa0, 0xbe, 0xff, 0xa2, 0x5b, 0xbe,
+ 0xdc, 0x74, 0x42, 0xbc, 0x0b, 0xdb, 0xd9, 0x3c, 0x87, 0xc3, 0x91, 0x3d, 0xeb, 0xaf, 0x55, 0x3f,
+ 0xb1, 0xd7, 0xee, 0x3e, 0xd2, 0xb1, 0x4c, 0x3e, 0x53, 0x23, 0x92, 0x3e, 0xaf, 0x0a, 0x2c, 0x3e,
+ 0x59, 0x77, 0xdd, 0x3d, 0xb8, 0x8e, 0x82, 0xbc, 0x70, 0xe8, 0x99, 0xbc, 0x2d, 0x66, 0x50, 0x3f,
+ 0xd9, 0x5b, 0xc7, 0x3e, 0xae, 0x7a, 0xd0, 0xbe, 0xc6, 0x2e, 0x27, 0x3f, 0x19, 0x66, 0x4b, 0x3f,
+ 0x11, 0x1d, 0x56, 0xbe, 0x0d, 0xd9, 0x96, 0x3e, 0xfc, 0x70, 0xb1, 0xbc, 0xa2, 0x97, 0x21, 0x3e,
+ 0xaf, 0x6a, 0xab, 0x3d, 0x25, 0xe4, 0xf7, 0x3e, 0xb1, 0x2f, 0x1f, 0x3f, 0xcf, 0xb4, 0xda, 0xbd,
+ 0xaf, 0x44, 0x63, 0x3e, 0x4f, 0x96, 0x35, 0xbe, 0x89, 0xac, 0x29, 0xbe, 0x78, 0xb8, 0xc1, 0xbe,
+ 0x36, 0x87, 0x7f, 0xbf, 0x22, 0x58, 0x22, 0x3f, 0xe1, 0xdb, 0x1c, 0x3f, 0x35, 0x58, 0xf5, 0x3e,
+ 0xae, 0x12, 0x12, 0x3f, 0x34, 0x91, 0x5f, 0x3d, 0xbb, 0x34, 0xfe, 0x3e, 0x28, 0x03, 0x9c, 0xbe,
+ 0x81, 0xa8, 0x97, 0xbe, 0x6a, 0x09, 0x29, 0xbe, 0xbc, 0x2c, 0x1a, 0xbe, 0xa9, 0x90, 0x0b, 0x3d,
+ 0xec, 0xf5, 0x1d, 0xbf, 0x84, 0x80, 0xa2, 0xbe, 0x04, 0x3d, 0x10, 0x3d, 0x8b, 0xc3, 0x80, 0x3b,
+ 0x1b, 0xc3, 0xad, 0x3e, 0x09, 0x5b, 0x83, 0xbe, 0xae, 0x87, 0x85, 0xbe, 0xc2, 0x7c, 0x50, 0xbf,
+ 0xc9, 0x6d, 0xdd, 0xbe, 0xec, 0x53, 0x9f, 0xbe, 0x20, 0xc4, 0xfd, 0x3d, 0x08, 0x74, 0xcc, 0xbd,
+ 0x71, 0xfa, 0x21, 0x3c, 0x86, 0x61, 0x61, 0xbe, 0x12, 0x14, 0x6d, 0x3e, 0xe3, 0x98, 0x1b, 0x3e,
+ 0xf2, 0xce, 0x2d, 0x3f, 0x55, 0x00, 0x14, 0xbe, 0xb4, 0x1e, 0xc3, 0xbf, 0x3a, 0x4e, 0x56, 0x3e,
+ 0x30, 0x76, 0x44, 0xbe, 0x27, 0x7a, 0x9e, 0x3d, 0xa1, 0x37, 0x9a, 0xbe, 0xa7, 0x29, 0xad, 0xbf,
+ 0x03, 0x1d, 0xe1, 0x3e, 0xc7, 0x41, 0x90, 0x3e, 0x6d, 0x13, 0x68, 0xbd, 0x8d, 0x41, 0xc9, 0x3e,
+ 0x31, 0x7c, 0xe5, 0x3c, 0x35, 0x8c, 0xee, 0xbe, 0x63, 0xca, 0x41, 0xbd, 0xed, 0x8c, 0x2b, 0xbf,
+ 0x17, 0x2d, 0x14, 0xbf, 0x9f, 0xed, 0x34, 0xbf, 0x64, 0x85, 0xc7, 0x3e, 0x44, 0x25, 0x1a, 0x3e,
+ 0x5a, 0xaf, 0x57, 0x3d, 0x83, 0xbd, 0x28, 0x3e, 0x5a, 0xc0, 0x2c, 0x3f, 0x90, 0x92, 0xb4, 0x3e,
+ 0xe7, 0x71, 0x0f, 0x3f, 0x5e, 0xf6, 0x04, 0xbc, 0x6b, 0x47, 0x34, 0x3e, 0xa5, 0x13, 0x91, 0xbd,
+ 0x9b, 0x46, 0xce, 0xbd, 0xd9, 0xee, 0x9d, 0x3d, 0x27, 0x43, 0xa4, 0x3e, 0xe4, 0x3b, 0xd0, 0xbd,
+ 0x45, 0x2d, 0x7d, 0x3e, 0xb6, 0x85, 0x92, 0xbe, 0x24, 0x88, 0x4c, 0xbd, 0x6c, 0x85, 0x52, 0xbe,
+ 0x21, 0xe7, 0x70, 0x3e, 0xdc, 0xcc, 0x0c, 0x3f, 0x12, 0xda, 0x7e, 0x3d, 0x7a, 0x0c, 0xb3, 0xbe,
+ 0x90, 0xb5, 0x68, 0x3e, 0xda, 0x68, 0xcd, 0x3c, 0xa7, 0xeb, 0xf3, 0xbe, 0x71, 0xa1, 0xd9, 0xbb,
+ 0x5a, 0xd4, 0x03, 0x3e, 0x48, 0x5c, 0xd4, 0xbc, 0x74, 0x8d, 0x32, 0x3e, 0x22, 0x76, 0xab, 0x3d,
+ 0xf3, 0xd4, 0x16, 0x3b, 0xd6, 0x91, 0x15, 0x3f, 0x41, 0x14, 0x38, 0x3f, 0x36, 0x99, 0x8c, 0x3d,
+ 0x02, 0x8e, 0x90, 0xbd, 0x25, 0x30, 0x85, 0xbe, 0xc0, 0xb2, 0x18, 0x3d, 0xdb, 0x7a, 0x98, 0xbe,
+ 0xe8, 0x5e, 0x17, 0x3f, 0x02, 0x29, 0x17, 0x3e, 0xb1, 0x80, 0x08, 0x3f, 0xd8, 0x43, 0x5b, 0x3f,
+ 0x02, 0x19, 0x13, 0xbe, 0x94, 0xdf, 0x0e, 0x3d, 0xf7, 0x12, 0x76, 0xbd, 0x58, 0xe8, 0x91, 0x3e,
+ 0xb9, 0xbe, 0x48, 0xbd, 0xd1, 0x74, 0x98, 0xbe, 0x2a, 0x12, 0x4c, 0x3f, 0xab, 0xc1, 0x51, 0x3e,
+ 0x55, 0x88, 0x88, 0xbd, 0x18, 0xfc, 0x86, 0x3e, 0x5a, 0xa2, 0x9a, 0x3e, 0x99, 0x7b, 0x28, 0x3e,
+ 0xa9, 0xc1, 0x81, 0x3e, 0xef, 0xd3, 0x52, 0x3f, 0xa5, 0xf9, 0x71, 0x3e, 0x7b, 0x6b, 0xd0, 0x3e,
+ 0x05, 0xa0, 0xde, 0x3e, 0x93, 0x96, 0x03, 0x3f, 0xf2, 0x2b, 0x5e, 0xbe, 0x37, 0x71, 0xe1, 0xbd,
+ 0x5d, 0xf5, 0x08, 0x3f, 0xe8, 0x39, 0x42, 0xbe, 0x24, 0xe8, 0x1c, 0x3e, 0x40, 0x15, 0xbe, 0xbe,
+ 0xc1, 0x8f, 0xac, 0x3d, 0xf0, 0xe8, 0x79, 0x3e, 0x4e, 0x2c, 0x1d, 0xbe, 0xdb, 0x53, 0x96, 0xbd,
+ 0xd0, 0x4c, 0xce, 0x3d, 0x42, 0x9b, 0xff, 0xbd, 0x59, 0xa1, 0xee, 0xbb, 0x59, 0xca, 0xa4, 0xbe,
+ 0xf0, 0xb7, 0x3c, 0x3e, 0x8e, 0x06, 0x80, 0x3e, 0xf4, 0xa7, 0x18, 0xbf, 0x84, 0xd4, 0x94, 0xbc,
+ 0xbe, 0xf8, 0x2f, 0xbe, 0x81, 0x77, 0x71, 0x3e, 0x28, 0xfc, 0xcb, 0x3d, 0x14, 0x03, 0xf8, 0xbd,
+ 0x08, 0x4d, 0x8a, 0x3e, 0xaa, 0xf2, 0xde, 0x3e, 0xa1, 0xfe, 0x55, 0x3e, 0x31, 0xd7, 0xcb, 0xbd,
+ 0x3d, 0x0a, 0x47, 0xbe, 0x04, 0x3c, 0x88, 0xbe, 0x3e, 0xfb, 0x85, 0x3e, 0xf8, 0x54, 0x10, 0xbe,
+ 0xc9, 0x54, 0x21, 0x3f, 0xaa, 0x10, 0x06, 0x3f, 0xa5, 0xe7, 0x0c, 0x3f, 0x03, 0x6d, 0x04, 0xbf,
+ 0xea, 0xb2, 0x1e, 0xbe, 0xec, 0x9d, 0x09, 0xbe, 0x48, 0xeb, 0xaf, 0xbf, 0xf0, 0x2a, 0x08, 0x3e,
+ 0x72, 0x78, 0x1b, 0x3e, 0x37, 0x43, 0x09, 0xbf, 0x7c, 0x91, 0xcb, 0x3e, 0x2f, 0x1d, 0x48, 0xbe,
+ 0x6a, 0x71, 0x10, 0xbe, 0xc6, 0xbe, 0xfc, 0xbe, 0x72, 0x81, 0xd7, 0xbe, 0xc1, 0xed, 0x11, 0x3f,
+ 0xff, 0x85, 0x1a, 0xbe, 0x5b, 0x4a, 0x66, 0x3e, 0xe6, 0x5a, 0xf2, 0x3c, 0xce, 0xc2, 0xed, 0xbe,
+ 0x34, 0x7b, 0x34, 0xbe, 0x12, 0xc6, 0xd5, 0xbd, 0xa6, 0x35, 0xb2, 0xbd, 0x7d, 0xa5, 0xda, 0x3e,
+ 0x42, 0x09, 0x24, 0xbe, 0xa4, 0x59, 0xbd, 0x3e, 0x2a, 0x23, 0xc1, 0x3e, 0xcd, 0x02, 0xe5, 0xbe,
+ 0x9d, 0xc4, 0x07, 0x3f, 0x4d, 0x27, 0xbf, 0xbe, 0x5e, 0xcd, 0x07, 0xbf, 0x71, 0x2a, 0x81, 0xbd,
+ 0xa5, 0xaa, 0x95, 0xbd, 0x7b, 0xac, 0xad, 0x3e, 0x73, 0x7a, 0xc4, 0x3e, 0xca, 0x34, 0xff, 0x3e,
+ 0x25, 0x7d, 0xc3, 0xbe, 0x9b, 0xd4, 0xf0, 0xbe, 0xd4, 0x24, 0x2d, 0x3d, 0xc0, 0xc6, 0xda, 0x3e,
+ 0xb4, 0xaa, 0xe6, 0xbe, 0x95, 0xb6, 0x76, 0xbc, 0xd3, 0x65, 0x2e, 0x3f, 0x99, 0x80, 0x49, 0x3f,
+ 0x10, 0x25, 0xdf, 0xbd, 0x16, 0x07, 0x86, 0x3f, 0xa1, 0xe9, 0xf7, 0xbe, 0x34, 0xdf, 0xd5, 0xbe,
+ 0xb6, 0x1f, 0xac, 0xbe, 0xb3, 0xce, 0x84, 0xbf, 0x6b, 0x0f, 0x6e, 0xbf, 0x88, 0xe8, 0x1c, 0x3e,
+ 0x76, 0x40, 0xaf, 0xbe, 0xa8, 0xa4, 0xf9, 0xbe, 0x9d, 0xa7, 0x8e, 0x3e, 0x69, 0x89, 0x80, 0x3e,
+ 0x23, 0xdd, 0x02, 0xbf, 0xbd, 0x52, 0x49, 0xbe, 0x44, 0x9e, 0x87, 0x3e, 0x14, 0xbe, 0x82, 0x3e,
+ 0x08, 0x85, 0xaa, 0xbc, 0x0f, 0x3a, 0x80, 0x3e, 0xf2, 0x80, 0x90, 0xbe, 0x90, 0xd8, 0xf9, 0x3c,
+ 0x0a, 0x9f, 0x29, 0xbf, 0x25, 0xa6, 0x00, 0xbe, 0xed, 0xb1, 0x79, 0xbf, 0x19, 0x06, 0x73, 0xbf,
+ 0xbd, 0x08, 0x5f, 0xbf, 0x75, 0xa0, 0xbe, 0x3e, 0xb0, 0xe9, 0x8a, 0x3e, 0xc2, 0xd7, 0xec, 0xbc,
+ 0xbc, 0xac, 0xcc, 0x3e, 0x03, 0xd5, 0x3d, 0x3f, 0x9c, 0x67, 0xaf, 0x3e, 0x4f, 0x1a, 0xf4, 0xbe,
+ 0x64, 0x75, 0x84, 0xbd, 0xc9, 0x24, 0xae, 0xbf, 0x5c, 0x7f, 0xf5, 0xbe, 0xb7, 0x9c, 0xdb, 0xbd,
+ 0x03, 0xf1, 0x1b, 0xbf, 0x72, 0xca, 0xc4, 0x3e, 0xe0, 0xf0, 0x30, 0xbf, 0x1a, 0x5a, 0x82, 0x3c,
+ 0xdb, 0xd0, 0x04, 0x3f, 0xf4, 0x83, 0xa7, 0xbe, 0x37, 0x11, 0xb4, 0xbd, 0xb0, 0xb5, 0x04, 0xbe,
+ 0xaf, 0x49, 0x67, 0xbe, 0x7d, 0x27, 0x07, 0xbf, 0x47, 0xcd, 0xf7, 0xbe, 0x43, 0xa0, 0x85, 0x3c,
+ 0xba, 0xc7, 0x1c, 0xbf, 0x12, 0x52, 0xc8, 0x3e, 0xfe, 0xdf, 0x02, 0x3e, 0x63, 0xf6, 0x17, 0x3f,
+ 0xf2, 0xa6, 0x80, 0x3a, 0x40, 0x97, 0x16, 0x3e, 0x93, 0xa2, 0xaa, 0xbe, 0xa1, 0x20, 0x4e, 0xbe,
+ 0x74, 0x1a, 0xe7, 0x3e, 0x77, 0x87, 0x5f, 0x3f, 0x63, 0x2e, 0xa0, 0xbe, 0xff, 0x57, 0xe5, 0x3e,
+ 0xd5, 0xf3, 0x79, 0x3e, 0x15, 0xac, 0x10, 0xbe, 0xc4, 0x54, 0x50, 0x3d, 0x5e, 0xb8, 0xda, 0xbe,
+ 0xda, 0xb9, 0x94, 0x3e, 0xe1, 0x89, 0x69, 0xbe, 0xaf, 0xca, 0x63, 0xbf, 0x2f, 0x7b, 0x58, 0x3f,
+ 0xae, 0x2c, 0x2d, 0x3f, 0x9f, 0xc4, 0xaf, 0x3e, 0xba, 0x2c, 0x88, 0x3e, 0x41, 0x02, 0xe2, 0x3e,
+ 0x96, 0xb6, 0xcf, 0x3e, 0x8b, 0x13, 0xd3, 0x3d, 0xfa, 0x37, 0x93, 0xbe, 0x4c, 0x20, 0x1b, 0xbb,
+ 0x40, 0xd4, 0x91, 0x3e, 0x5d, 0x18, 0xe2, 0x3d, 0x8e, 0xe1, 0xcd, 0x3d, 0xe7, 0xc2, 0xfd, 0x3e,
+ 0x43, 0x69, 0x62, 0xbf, 0x71, 0x4d, 0x56, 0xbe, 0x87, 0x75, 0x03, 0x3f, 0x13, 0x67, 0xc1, 0x3e,
+ 0x4c, 0x16, 0x2b, 0x3e, 0x21, 0x05, 0x84, 0x3e, 0x5c, 0x88, 0x06, 0xbe, 0x77, 0x6d, 0x88, 0x3d,
+ 0xa4, 0x1d, 0x2b, 0xbe, 0x5a, 0x07, 0xcb, 0x3e, 0x23, 0x57, 0x10, 0x3f, 0x93, 0xd0, 0xcb, 0xbe,
+ 0x2b, 0xbf, 0xf0, 0x3e, 0x3a, 0x3d, 0x2f, 0xbf, 0x03, 0x14, 0xb7, 0x3e, 0x4f, 0x12, 0x07, 0x3f,
+ 0x15, 0x34, 0x0e, 0xbf, 0xa0, 0xad, 0xaf, 0x3d, 0x61, 0x70, 0x95, 0x3e, 0xc3, 0xbf, 0xfa, 0x3c,
+ 0x5f, 0xd8, 0xcc, 0xbd, 0xe4, 0xb8, 0x30, 0x3e, 0x1b, 0xc5, 0xfe, 0xbe, 0xea, 0x3a, 0xee, 0xbd,
+ 0x2c, 0xcb, 0x62, 0xbe, 0xa5, 0xab, 0x63, 0xbe, 0xd4, 0xa4, 0x41, 0xbe, 0x75, 0x6f, 0x87, 0xbd,
+ 0x76, 0x5a, 0x85, 0x3e, 0x1c, 0xac, 0x98, 0x3e, 0x91, 0x77, 0x1f, 0xbe, 0x6c, 0x25, 0x9e, 0xbe,
+ 0x4b, 0x52, 0x54, 0xbe, 0x28, 0x7c, 0x17, 0x3e, 0x62, 0xfb, 0x8f, 0xbe, 0x0c, 0xa5, 0x55, 0xbe,
+ 0x4a, 0x76, 0xcb, 0xbe, 0xbf, 0xe5, 0xb3, 0x3e, 0xc7, 0xdf, 0x5b, 0x3c, 0x73, 0xc8, 0x9e, 0xbe,
+ 0x83, 0x1d, 0xb5, 0xbe, 0x4f, 0x12, 0xa9, 0xbd, 0x01, 0xec, 0x59, 0xbf, 0x5b, 0xad, 0x47, 0xbf,
+ 0x14, 0xf3, 0x81, 0xbf, 0x02, 0x67, 0xbd, 0xbe, 0xaa, 0x93, 0x03, 0x3c, 0xe6, 0xea, 0x32, 0xbf,
+ 0x68, 0x27, 0xd8, 0xbe, 0x0a, 0xe5, 0xf0, 0xbb, 0x0f, 0x3e, 0x66, 0xbd, 0x68, 0x48, 0x35, 0x3f,
+ 0xca, 0x85, 0x92, 0x3d, 0x01, 0x53, 0x18, 0x3d, 0x12, 0x96, 0x37, 0xbf, 0xfc, 0xbf, 0xb6, 0xbe,
+ 0x64, 0xf8, 0x9c, 0x3b, 0x45, 0x4d, 0x3f, 0x3d, 0xcc, 0x2b, 0xd3, 0x3a, 0xb8, 0x90, 0xd8, 0x3d,
+ 0xa5, 0xcc, 0xa4, 0xbe, 0x8b, 0x4b, 0x13, 0xbf, 0xaa, 0x5f, 0x13, 0x3d, 0x3c, 0x9a, 0xc9, 0xbe,
+ 0x8b, 0xe2, 0x04, 0x3e, 0xb1, 0xf3, 0x64, 0xbd, 0x87, 0x72, 0x19, 0x3e, 0xbd, 0x9e, 0x6b, 0x3f,
+ 0x8b, 0xc1, 0x43, 0x3f, 0xd8, 0x0d, 0x41, 0xbe, 0x05, 0x17, 0xd9, 0x3c, 0x7a, 0x68, 0x8e, 0xbf,
+ 0xeb, 0x49, 0xb4, 0x3a, 0xbd, 0xa2, 0x9f, 0x3d, 0x9b, 0xa3, 0xff, 0x3e, 0x98, 0x54, 0xe7, 0x3d,
+ 0x38, 0xc9, 0x3a, 0xbe, 0xa0, 0xd6, 0x97, 0xbe, 0x7f, 0xd4, 0x00, 0xbf, 0xc3, 0xe1, 0xad, 0xbe,
+ 0xe7, 0xff, 0x0b, 0x3d, 0x68, 0xd3, 0xa3, 0x3e, 0x13, 0x4c, 0x79, 0xbe, 0xe0, 0xc6, 0xfd, 0x3e,
+ 0x2c, 0x43, 0x0c, 0xbf, 0xc2, 0x8a, 0xe6, 0xbd, 0xaf, 0x42, 0xe8, 0xbe, 0x8d, 0xcf, 0x0a, 0x3f,
+ 0x86, 0x08, 0xe9, 0xbd, 0x49, 0x94, 0x72, 0x3d, 0xc1, 0xfd, 0xd0, 0x3e, 0x40, 0x8b, 0x32, 0xbd,
+ 0x7c, 0xb8, 0xa4, 0x3e, 0xc5, 0xfe, 0xe9, 0x3e, 0xf6, 0x2f, 0x0b, 0xbf, 0x88, 0x00, 0xe0, 0xbe,
+ 0xcd, 0xa3, 0x25, 0x3f, 0x27, 0xc0, 0x9d, 0xbf, 0x01, 0xaf, 0x86, 0xbf, 0x0b, 0x3a, 0xbc, 0xbe,
+ 0x58, 0xaa, 0x60, 0x3e, 0xcb, 0x83, 0x0b, 0xbf, 0x5e, 0x75, 0x69, 0x3f, 0xa5, 0xda, 0xb2, 0x3e,
+ 0x4c, 0xb5, 0x72, 0xbd, 0xaa, 0x4f, 0x2a, 0x3e, 0x4b, 0xce, 0xb0, 0x3e, 0x19, 0xf5, 0x45, 0x3e,
+ 0xe3, 0xba, 0xba, 0xbc, 0x30, 0x95, 0x1a, 0xbe, 0x9d, 0x2f, 0xdd, 0x3e, 0x36, 0x25, 0x9f, 0xbe,
+ 0x1b, 0xdc, 0xbc, 0xbd, 0xe1, 0x4a, 0x81, 0xbc, 0x53, 0xb1, 0xbb, 0xbd, 0x11, 0x2a, 0xe5, 0xbd,
+ 0xc0, 0xec, 0x1a, 0x3c, 0xa9, 0x64, 0xa9, 0x3e, 0xc8, 0xa9, 0xc0, 0x3c, 0x7e, 0xbf, 0x60, 0x3f,
+ 0x7e, 0x47, 0x13, 0xbf, 0x87, 0x2c, 0x6b, 0xbe, 0x6c, 0xab, 0x02, 0x3f, 0xce, 0xc1, 0x08, 0xbf,
+ 0x17, 0x53, 0x64, 0xbd, 0x51, 0xfa, 0xcd, 0x3e, 0x0a, 0x33, 0x90, 0x3e, 0x84, 0x98, 0xd4, 0xbe,
+ 0x30, 0x8c, 0xad, 0xbd, 0x70, 0x04, 0xac, 0x3e, 0xce, 0x33, 0x3c, 0x3d, 0xb8, 0xdd, 0xc1, 0x3e,
+ 0x4a, 0x84, 0xfa, 0x3e, 0x5a, 0x31, 0x08, 0xbd, 0x88, 0xf1, 0x33, 0x3f, 0x7a, 0xd8, 0xa3, 0xbb,
+ 0x91, 0x4f, 0xc1, 0xbd, 0xfe, 0xdb, 0x5e, 0xbf, 0x80, 0xf1, 0x39, 0x3d, 0x70, 0x6d, 0x5f, 0x3e,
+ 0x78, 0xd3, 0xef, 0xbe, 0x27, 0x9c, 0x16, 0xbd, 0xf8, 0x8e, 0x81, 0xbe, 0x6f, 0x38, 0x18, 0xbe,
+ 0x69, 0x48, 0x0a, 0xbf, 0xa3, 0x3c, 0x06, 0x3e, 0x62, 0x28, 0xb5, 0xbe, 0x6a, 0x55, 0xfb, 0xbe,
+ 0x77, 0x85, 0x2d, 0x3e, 0x8a, 0x02, 0x9c, 0xbd, 0x29, 0xaa, 0x6b, 0xbd, 0x1b, 0xe9, 0xc6, 0xbb,
+ 0x74, 0xf6, 0x93, 0xbe, 0xf4, 0x93, 0x08, 0x3e, 0xc7, 0x51, 0x0e, 0x3e, 0xaa, 0x3d, 0x47, 0xbf,
+ 0x7b, 0x1e, 0xa2, 0x3e, 0x0f, 0x43, 0xee, 0x3e, 0x24, 0x8b, 0x95, 0xbf, 0xe8, 0xd4, 0xf1, 0xbc,
+ 0x3c, 0x52, 0xdc, 0x3e, 0x4a, 0x25, 0xa5, 0xbe, 0xe7, 0xc1, 0x83, 0xbe, 0x7d, 0x48, 0x1b, 0xbf,
+ 0x1c, 0xc5, 0x03, 0xbf, 0xf7, 0xb7, 0xf3, 0x3e, 0xdf, 0x99, 0xa6, 0x3e, 0x1b, 0x45, 0x20, 0xbf,
+ 0x26, 0x1f, 0xae, 0x3e, 0x7b, 0x91, 0x1f, 0xbe, 0x36, 0x44, 0xe5, 0xbe, 0xcf, 0x9e, 0xd1, 0xbe,
+ 0xf2, 0x62, 0x1c, 0x3e, 0x07, 0xe7, 0x21, 0xbf, 0x95, 0x41, 0x54, 0xbf, 0x61, 0xfb, 0x1b, 0xbf,
+ 0xa1, 0x9e, 0x15, 0xbf, 0xe0, 0x7d, 0x01, 0xbf, 0x07, 0x77, 0xbe, 0xbe, 0x80, 0x63, 0x76, 0xbe,
+ 0x87, 0x2b, 0x8a, 0xbe, 0xd9, 0xc0, 0x45, 0xbe, 0xf0, 0x51, 0x06, 0x3e, 0x6d, 0xbc, 0xe9, 0x3d,
+ 0xcb, 0xab, 0xeb, 0x3e, 0x82, 0xf8, 0xcd, 0x3d, 0x63, 0x1e, 0x5d, 0xbe, 0x62, 0xe8, 0x91, 0xbe,
+ 0x25, 0xfd, 0xaf, 0x3e, 0x59, 0x5a, 0xad, 0xbd, 0x6c, 0x19, 0x3f, 0xbe, 0xab, 0xc6, 0x25, 0x3e,
+ 0x09, 0xc4, 0x14, 0x3f, 0x0a, 0x9d, 0x30, 0x3f, 0x61, 0x87, 0xcf, 0xbc, 0x59, 0x7e, 0x0e, 0x3f,
+ 0x15, 0xd5, 0x90, 0x3f, 0xec, 0xf2, 0x94, 0xbe, 0x37, 0xa3, 0x97, 0x3e, 0x9d, 0xaa, 0x69, 0x3d,
+ 0x83, 0x1c, 0x37, 0xbf, 0x9f, 0x0f, 0xc2, 0xbd, 0xf3, 0xe5, 0x0c, 0xbe, 0x9c, 0x5b, 0xe1, 0xbe,
+ 0xec, 0x9b, 0xc4, 0x3e, 0xd3, 0xf3, 0xe2, 0xbe, 0x2a, 0x8e, 0x4a, 0xbd, 0x19, 0x73, 0xa5, 0xbe,
+ 0x93, 0xce, 0xe1, 0xbe, 0xe1, 0xd2, 0x7f, 0x3e, 0x28, 0x37, 0x03, 0x3f, 0xad, 0xce, 0xcd, 0x3e,
+ 0x6e, 0xaf, 0xd5, 0xbd, 0x92, 0x05, 0x45, 0xbf, 0x13, 0x9b, 0x89, 0xbe, 0x0c, 0x5b, 0xd7, 0x3c,
+ 0x73, 0x22, 0x83, 0xbe, 0xb1, 0xf7, 0x69, 0xbe, 0x1f, 0x03, 0x42, 0xbe, 0x40, 0x30, 0x51, 0x3d,
+ 0x99, 0x1d, 0xa4, 0xbd, 0x67, 0x25, 0xad, 0xbe, 0xb5, 0x9e, 0x21, 0xbe, 0xe9, 0x1c, 0x1a, 0xbe,
+ 0x89, 0x41, 0xb3, 0xbe, 0xd6, 0xf2, 0x17, 0xbf, 0xe1, 0x1a, 0x93, 0xbe, 0x63, 0x54, 0x2f, 0x3f,
+ 0xe9, 0x92, 0x77, 0x3f, 0x7b, 0x29, 0x18, 0x3f, 0x89, 0x8f, 0x8d, 0xbd, 0xe8, 0x0b, 0x38, 0xbd,
+ 0xdd, 0x0f, 0xd0, 0x3e, 0x17, 0x4d, 0x07, 0xbe, 0x4c, 0xcf, 0xdb, 0x3d, 0x4a, 0x9b, 0xfe, 0x3d,
+ 0x14, 0xce, 0xf4, 0xbe, 0xf5, 0xf5, 0x7e, 0xbd, 0x02, 0xc5, 0x46, 0x3c, 0x69, 0x5d, 0x4e, 0xbe,
+ 0x5c, 0x93, 0x42, 0xbe, 0xcf, 0xac, 0xdb, 0xbe, 0x85, 0x66, 0xea, 0x3e, 0xe5, 0x9a, 0x21, 0xbe,
+ 0x8d, 0x97, 0xf3, 0xbe, 0x6a, 0xff, 0xb3, 0x3e, 0x2c, 0x93, 0xda, 0xbd, 0xe3, 0x5c, 0xb0, 0x3c,
+ 0x6f, 0xf6, 0xad, 0xbd, 0x4d, 0x4b, 0x76, 0x3e, 0xe2, 0xaa, 0x43, 0x3f, 0x2a, 0xd5, 0x58, 0x3e,
+ 0x15, 0xff, 0x52, 0x3f, 0xec, 0x17, 0x93, 0x3e, 0x5e, 0x43, 0x99, 0xbe, 0xe8, 0x24, 0x13, 0x3d,
+ 0xcc, 0x62, 0xfc, 0x3e, 0xba, 0xe3, 0x4f, 0x3e, 0xee, 0x49, 0xce, 0x3e, 0xc7, 0x72, 0xff, 0x3e,
+ 0x77, 0x96, 0x09, 0x3f, 0x77, 0x3d, 0x8b, 0x3e, 0x06, 0x12, 0xae, 0x3e, 0xb3, 0xba, 0x54, 0x3e,
+ 0x6c, 0x9f, 0x72, 0xbc, 0x80, 0xf9, 0x42, 0xbe, 0x42, 0x89, 0xd4, 0x3c, 0xda, 0x46, 0x99, 0xbe,
+ 0x72, 0x28, 0x14, 0x3d, 0xfd, 0x0b, 0x74, 0xbc, 0x58, 0x7a, 0x50, 0x3d, 0x68, 0xfd, 0xb5, 0x3d,
+ 0x25, 0x9d, 0x94, 0xbc, 0xc9, 0x69, 0x5f, 0x3c, 0x11, 0x83, 0x2e, 0xbe, 0x4f, 0x40, 0xc8, 0x3d,
+ 0xa6, 0x23, 0xaf, 0x3b, 0x2a, 0x6b, 0xaf, 0xbd, 0x71, 0x4c, 0x19, 0x3f, 0xff, 0x6c, 0x90, 0x3e,
+ 0x76, 0x80, 0x73, 0x3e, 0x1a, 0x46, 0x33, 0xbe, 0xab, 0x84, 0x55, 0x3e, 0xb0, 0x69, 0x14, 0x3f,
+ 0xcb, 0x3a, 0xcc, 0xbe, 0x5c, 0xba, 0x01, 0xbd, 0x1c, 0xaf, 0x63, 0xbe, 0x83, 0x53, 0x86, 0x3e,
+ 0xa0, 0xef, 0x96, 0x3e, 0x45, 0x28, 0x54, 0x3e, 0xd5, 0x83, 0x8a, 0x3e, 0x0b, 0x20, 0xbf, 0xbd,
+ 0x6f, 0x44, 0x92, 0xbe, 0x7b, 0x74, 0xb6, 0xbd, 0x5e, 0x13, 0x34, 0x3e, 0xcb, 0xe2, 0x64, 0x3e,
+ 0x3a, 0x4a, 0x70, 0xbe, 0xa0, 0x94, 0xf0, 0xbe, 0x1f, 0x62, 0x93, 0xbf, 0x2f, 0x84, 0x86, 0xbe,
+ 0x35, 0x45, 0x1f, 0xbe, 0x55, 0x53, 0xb6, 0x3c, 0x93, 0x86, 0xeb, 0xbe, 0x38, 0xb5, 0x71, 0xbf,
+ 0xb1, 0xbd, 0x2c, 0xbf, 0x68, 0x5d, 0x5c, 0x3e, 0x9e, 0x74, 0x77, 0xbe, 0xcb, 0x5f, 0x15, 0xbf,
+ 0xca, 0xb5, 0xbd, 0xbe, 0xbd, 0x26, 0xde, 0xbf, 0x60, 0x9e, 0x16, 0xbf, 0x52, 0xeb, 0xbb, 0xbb,
+ 0xb0, 0xeb, 0xc7, 0xbe, 0xc3, 0xfb, 0x0d, 0x3f, 0x0b, 0xac, 0xe9, 0x3e, 0xf4, 0xa8, 0x69, 0x3d,
+ 0x4c, 0xe8, 0x2a, 0xbf, 0xd1, 0xfc, 0xcd, 0xbd, 0x54, 0x76, 0x39, 0xbe, 0xf3, 0x50, 0xd0, 0xbe,
+ 0x05, 0xbc, 0xce, 0xbd, 0xa0, 0x8b, 0x01, 0xbf, 0x14, 0x26, 0x1d, 0xbf, 0x78, 0x88, 0x4e, 0xbf,
+ 0x7d, 0x50, 0xd0, 0xbe, 0xaf, 0x58, 0x68, 0x3d, 0x77, 0x5f, 0x5c, 0xbf, 0xf2, 0xa9, 0x2a, 0xbe,
+ 0xb3, 0xc0, 0x2c, 0xbd, 0x17, 0xf4, 0x96, 0x3e, 0x83, 0xda, 0x1f, 0xbc, 0xec, 0x75, 0x64, 0x3e,
+ 0x62, 0xbf, 0x19, 0x3e, 0x91, 0xd9, 0x77, 0x3f, 0x5c, 0xf0, 0x77, 0x3e, 0x37, 0x55, 0xaa, 0xbe,
+ 0x28, 0xb1, 0x24, 0x3e, 0xa3, 0x66, 0x9c, 0x3d, 0xde, 0x95, 0x85, 0x3e, 0xb9, 0xc5, 0x6e, 0xbf,
+ 0xc2, 0xb1, 0x76, 0xbe, 0xbf, 0x37, 0x85, 0xbe, 0x94, 0x01, 0xab, 0x3d, 0x0e, 0x35, 0xc0, 0x3d,
+ 0xd6, 0xaf, 0xde, 0x3b, 0x77, 0x4d, 0x23, 0xbe, 0xb8, 0xb4, 0x5e, 0xbf, 0x0b, 0xd6, 0x27, 0xbf,
+ 0x5a, 0x4a, 0x79, 0x3d, 0x4d, 0xb7, 0x46, 0xbf, 0xd3, 0x1b, 0x4f, 0xbf, 0x7c, 0x6f, 0x50, 0xbe,
+ 0x1d, 0xbe, 0x6c, 0xbe, 0xb0, 0x34, 0x85, 0x3f, 0x5e, 0x54, 0x39, 0x3f, 0x51, 0x23, 0x17, 0xbf,
+ 0x9c, 0xa7, 0x16, 0x3f, 0xa5, 0x33, 0x21, 0x3d, 0xf2, 0xe3, 0xfd, 0xbc, 0x4c, 0x30, 0xac, 0x3d,
+ 0x6e, 0xa5, 0x40, 0xbf, 0x8b, 0x16, 0x05, 0xbf, 0x9f, 0x98, 0x89, 0x3f, 0x84, 0xf6, 0x59, 0x3f,
+ 0x00, 0x19, 0xed, 0xbe, 0xc5, 0xb9, 0xf9, 0x3e, 0x3b, 0x5d, 0xff, 0x3d, 0xf7, 0x98, 0xa6, 0x3d,
+ 0xb7, 0xb3, 0x01, 0x3e, 0x30, 0x66, 0xfb, 0xbe, 0xce, 0x99, 0x46, 0x3e, 0x38, 0x42, 0xff, 0x3e,
+ 0xbe, 0xf8, 0x57, 0x3f, 0x67, 0x59, 0x2d, 0x3e, 0x48, 0x75, 0x81, 0x3f, 0xb2, 0x8d, 0x21, 0x3e,
+ 0x43, 0x27, 0xe7, 0x3c, 0x7a, 0x4c, 0x23, 0x3f, 0x0c, 0xdd, 0x8f, 0x3d, 0x13, 0x26, 0x04, 0x3f,
+ 0xae, 0xd4, 0x40, 0xbe, 0xa6, 0x69, 0x9f, 0xbe, 0x60, 0x04, 0x91, 0xbf, 0xbc, 0x2a, 0xbb, 0x3e,
+ 0xed, 0x4a, 0xc1, 0xbe, 0x69, 0x4e, 0x15, 0xbe, 0xff, 0x78, 0x9b, 0x3e, 0x70, 0x20, 0x9b, 0xbe,
+ 0xd2, 0x67, 0xe7, 0xbe, 0x11, 0x23, 0x71, 0x3f, 0x80, 0xb6, 0xbc, 0x3e, 0xed, 0x5c, 0xd1, 0x3d,
+ 0x54, 0x4a, 0xe2, 0x3e, 0xa0, 0x38, 0xe4, 0x3e, 0xee, 0xd1, 0x0c, 0xbe, 0x74, 0x66, 0x48, 0xbe,
+ 0x45, 0x53, 0x14, 0xbe, 0x3e, 0x1d, 0x08, 0xbf, 0xf9, 0x87, 0x23, 0xbf, 0x20, 0xf2, 0x24, 0xbe,
+ 0xb4, 0x58, 0x50, 0xbf, 0x7c, 0x93, 0xc7, 0xbe, 0x3e, 0x4a, 0xa7, 0xbe, 0xf9, 0xc4, 0x7e, 0x3e,
+ 0x51, 0xa1, 0x97, 0x3d, 0xde, 0xea, 0x28, 0xbf, 0xab, 0xce, 0x17, 0x3e, 0xf6, 0x97, 0x69, 0xbf,
+ 0xc3, 0xcf, 0x71, 0xbe, 0x80, 0x09, 0x6c, 0xbf, 0x73, 0x93, 0xac, 0xbe, 0x42, 0x72, 0xdd, 0x3e,
+ 0xc4, 0x7c, 0xa6, 0xbe, 0xe4, 0xa9, 0xaa, 0x3e, 0x44, 0x58, 0xdc, 0x3e, 0x07, 0x1c, 0x44, 0x3f,
+ 0xbc, 0xb1, 0x33, 0xbf, 0x60, 0xdd, 0x22, 0x3f, 0xce, 0x26, 0x83, 0x3f, 0x35, 0x95, 0x38, 0x3d,
+ 0xcd, 0xb2, 0x9e, 0x3e, 0x78, 0xd2, 0x75, 0x3e, 0x0b, 0xfa, 0xf7, 0xbe, 0x55, 0x33, 0x56, 0xbf,
+ 0x3e, 0x42, 0x9d, 0xbf, 0x10, 0xa8, 0x98, 0x3d, 0x1f, 0x97, 0x3a, 0x3f, 0xf3, 0xa7, 0x79, 0xbd,
+ 0x17, 0xd7, 0xc2, 0x3d, 0xcf, 0xbb, 0xe5, 0x3d, 0xcb, 0x3a, 0xbe, 0xbe, 0xdc, 0x3d, 0x0b, 0x3e,
+ 0x49, 0x36, 0xdc, 0x3e, 0xdc, 0x81, 0x68, 0x3e, 0xac, 0x9a, 0x3a, 0x3e, 0x36, 0xb0, 0x20, 0x3f,
+ 0x23, 0xf4, 0x3e, 0x3f, 0x50, 0x3e, 0xf9, 0xbd, 0xf3, 0x58, 0x83, 0x3e, 0x89, 0x29, 0x83, 0xbe,
+ 0x57, 0xe5, 0x2b, 0xbe, 0x77, 0x31, 0x8e, 0xbe, 0xc9, 0xf6, 0x35, 0x3e, 0x4c, 0xb2, 0x19, 0x3f,
+ 0x92, 0x80, 0xb0, 0x3e, 0xc8, 0x4d, 0x1b, 0x3f, 0x2d, 0xd3, 0x48, 0x3d, 0xa6, 0x9f, 0x15, 0x3c,
+ 0xe9, 0xd5, 0x8b, 0x3e, 0x88, 0xe3, 0x7b, 0xbc, 0x36, 0x29, 0x13, 0xbf, 0x6c, 0xa9, 0x55, 0xbe,
+ 0x97, 0xb6, 0x0f, 0xbf, 0x4d, 0x48, 0x0f, 0xbf, 0xd8, 0xab, 0xb2, 0x3e, 0x8a, 0x38, 0x65, 0x3d,
+ 0x5b, 0x28, 0x88, 0xbe, 0xcb, 0xbf, 0x94, 0xbe, 0x7e, 0xa6, 0x6e, 0x3f, 0xb2, 0x82, 0xc7, 0xbd,
+ 0xdc, 0x41, 0x06, 0xbf, 0x0c, 0x50, 0x68, 0xbd, 0xf9, 0xd4, 0xb1, 0xbd, 0xd6, 0x25, 0xf1, 0xbd,
+ 0x16, 0x12, 0xbd, 0x3e, 0x49, 0x4a, 0x0e, 0x3f, 0xb6, 0x5e, 0xf6, 0x3e, 0xf0, 0x43, 0x91, 0xbe,
+ 0x9d, 0x32, 0x00, 0x3f, 0xd7, 0x83, 0x6e, 0x3c, 0xce, 0xfe, 0xc2, 0xbe, 0x86, 0x05, 0xb5, 0x3e,
+ 0xb4, 0x95, 0xc4, 0x3e, 0xda, 0xb4, 0xb3, 0xbe, 0x73, 0xe3, 0xae, 0x3c, 0xa9, 0x1e, 0x86, 0x3d,
+ 0x94, 0x7e, 0x1e, 0xbf, 0x1d, 0x9f, 0x5a, 0xbf, 0xe8, 0x05, 0x3f, 0xbe, 0xfd, 0x58, 0xbf, 0x3e,
+ 0x01, 0x8c, 0x83, 0x3f, 0x17, 0xa1, 0x66, 0xbe, 0x87, 0xc6, 0xf7, 0x3e, 0xc9, 0xa8, 0x06, 0x3f,
+ 0xea, 0x27, 0xce, 0xbd, 0x0c, 0x08, 0xf2, 0xbd, 0xb6, 0x55, 0x7b, 0x3d, 0x20, 0x10, 0x8b, 0xbe,
+ 0xb6, 0x6b, 0x9c, 0x3e, 0xd3, 0xb7, 0x9e, 0x3e, 0x22, 0xf3, 0x8e, 0xbe, 0x2c, 0x39, 0x1e, 0x3c,
+ 0x6a, 0x2a, 0xa6, 0x3b, 0x6e, 0x2f, 0x8d, 0xbd, 0x90, 0xc6, 0x8b, 0xbe, 0xdb, 0x99, 0x48, 0xbf,
+ 0x93, 0xbc, 0xfd, 0xbe, 0xd0, 0x28, 0x06, 0x3e, 0x84, 0xb3, 0x36, 0x3f, 0xfd, 0xc8, 0x23, 0x3f,
+ 0xdd, 0x33, 0x05, 0xbf, 0x15, 0xaa, 0xa1, 0x3e, 0x09, 0xe0, 0xa9, 0x3e, 0x7d, 0x52, 0xfe, 0xbd,
+ 0x2e, 0xa3, 0xd1, 0xbd, 0x71, 0x9d, 0xbd, 0xba, 0x42, 0x6b, 0xa4, 0x3e, 0xbc, 0xb1, 0x64, 0x3b,
+ 0x67, 0x3b, 0x5c, 0xbd, 0x4f, 0x33, 0x10, 0x3e, 0x06, 0xf5, 0xdc, 0xbe, 0x88, 0xec, 0x75, 0xbe,
+ 0x0f, 0xf1, 0xa0, 0x3e, 0x3f, 0x21, 0xcc, 0x3c, 0xe7, 0xd8, 0x5a, 0x3e, 0x15, 0x4c, 0xd6, 0x3e,
+ 0xa6, 0x79, 0xe5, 0xbe, 0x38, 0x44, 0x93, 0xbf, 0x0d, 0xd9, 0x1e, 0x3e, 0xd9, 0xe5, 0x67, 0xbf,
+ 0xb8, 0x1f, 0x07, 0xbf, 0x27, 0xca, 0xc5, 0xbd, 0xa7, 0x20, 0xa5, 0xbe, 0xa4, 0x0d, 0xdd, 0xbe,
+ 0x4a, 0x31, 0x07, 0x3e, 0xb9, 0x3b, 0x52, 0x3d, 0x16, 0x1b, 0x5d, 0xbf, 0x8b, 0x09, 0x2b, 0xbe,
+ 0x59, 0xad, 0x3c, 0xbf, 0x8f, 0xaf, 0xdf, 0x3e, 0xa1, 0xa1, 0x31, 0x3f, 0xd1, 0xc2, 0xf3, 0x3e,
+ 0x39, 0xa7, 0x91, 0x3f, 0x86, 0xdd, 0x7f, 0x3e, 0x1f, 0xd0, 0x2e, 0xbf, 0x2f, 0xfd, 0xc4, 0xbd,
+ 0x93, 0x56, 0x8b, 0xbd, 0x71, 0xd1, 0xec, 0xbd, 0xd4, 0xc3, 0x8c, 0xbe, 0x81, 0x43, 0x9f, 0xbe,
+ 0x1b, 0xe2, 0x14, 0x3f, 0x55, 0x4d, 0x7f, 0x3e, 0x54, 0x3e, 0x34, 0x3f, 0xef, 0x1c, 0xa1, 0x3e,
+ 0x6c, 0xb1, 0xba, 0xbe, 0xef, 0xeb, 0x26, 0x3e, 0x77, 0x78, 0xdb, 0xbe, 0x46, 0x40, 0x7b, 0xbe,
+ 0x8b, 0x1e, 0x05, 0x3e, 0x2f, 0x40, 0x2e, 0xbe, 0x15, 0xcd, 0xac, 0x3d, 0x03, 0x07, 0x0b, 0xbe,
+ 0x51, 0xe0, 0x97, 0x3e, 0x88, 0x52, 0xbb, 0x3e, 0xac, 0x36, 0x21, 0xbe, 0xa7, 0x32, 0x40, 0x3d,
+ 0xdb, 0xb1, 0x62, 0x3e, 0x47, 0x86, 0x37, 0x3e, 0x48, 0xce, 0x0b, 0x3c, 0x9d, 0x9f, 0x13, 0x3c,
+ 0x22, 0x74, 0xe2, 0xbe, 0x38, 0x44, 0x0c, 0xbe, 0x5e, 0xda, 0x80, 0x3e, 0x84, 0x03, 0xb2, 0xbd,
+ 0x4a, 0xa2, 0x75, 0xbd, 0x22, 0xe6, 0x1c, 0x3e, 0x1d, 0x43, 0x01, 0x3d, 0xde, 0x69, 0x70, 0x3e,
+ 0xaf, 0x9f, 0xbe, 0x3e, 0x0c, 0x81, 0x8f, 0x3e, 0x4f, 0x47, 0x41, 0x3e, 0x65, 0xe5, 0x2e, 0xbf,
+ 0xec, 0xd9, 0x15, 0x3f, 0x22, 0xb9, 0xac, 0x3e, 0x74, 0xcc, 0x30, 0xbd, 0x61, 0x31, 0x56, 0xbe,
+ 0xc8, 0x22, 0x62, 0x3e, 0x84, 0xe9, 0x35, 0x3f, 0x18, 0x3a, 0x59, 0x3f, 0x2a, 0xbb, 0x65, 0x3e,
+ 0xb8, 0xe9, 0x8e, 0xbd, 0xf8, 0x95, 0x95, 0xbd, 0xc7, 0x52, 0x93, 0x3f, 0xfd, 0xd4, 0xc2, 0xbd,
+ 0xe9, 0x92, 0x63, 0xbe, 0xee, 0x41, 0x4a, 0x3d, 0xf1, 0x2e, 0x02, 0x3f, 0xe0, 0xc5, 0x0d, 0xbe,
+ 0x77, 0x69, 0x19, 0xbf, 0x33, 0x32, 0xb6, 0xbe, 0x17, 0x15, 0xb2, 0x3e, 0x23, 0xb1, 0xd6, 0x3e,
+ 0x33, 0xf8, 0x3b, 0x3f, 0x71, 0x9a, 0xa9, 0x3d, 0x75, 0xa5, 0x0a, 0x3f, 0x34, 0x01, 0x6f, 0x3e,
+ 0x3b, 0x5f, 0x52, 0x3f, 0x45, 0xbd, 0xf1, 0x3d, 0x53, 0x2d, 0xdb, 0xbc, 0xc8, 0xdc, 0x1a, 0x3d,
+ 0xa0, 0xf8, 0x70, 0x3f, 0x1d, 0xe5, 0x29, 0x3f, 0x2b, 0x8d, 0xe6, 0xbe, 0x42, 0x77, 0x03, 0x3f,
+ 0xe4, 0xd1, 0x91, 0x3f, 0x87, 0x4b, 0xa1, 0x3e, 0x28, 0xe9, 0x59, 0x3e, 0x9b, 0x6e, 0x46, 0xbf,
+ 0xf7, 0xbc, 0xe8, 0x3e, 0x01, 0x69, 0x3e, 0x3e, 0xb5, 0x77, 0xc1, 0xbe, 0x3f, 0xf2, 0x61, 0x3e,
+ 0x79, 0xe4, 0x1c, 0x3e, 0x4a, 0x56, 0xae, 0xbe, 0xe9, 0x76, 0x74, 0xbf, 0x81, 0xd6, 0xdc, 0xbd,
+ 0x7d, 0x51, 0x7e, 0x3f, 0x2e, 0x4c, 0xd0, 0x3e, 0xc1, 0xff, 0x80, 0xbe, 0xf5, 0x0e, 0xfe, 0xbe,
+ 0xba, 0xca, 0x49, 0x3e, 0x34, 0x03, 0x64, 0x3d, 0x44, 0xfc, 0x9a, 0x3c, 0x89, 0xd9, 0x75, 0x3d,
+ 0xe2, 0xc7, 0x36, 0xbf, 0xad, 0xaf, 0xf6, 0xbe, 0x24, 0xc4, 0x07, 0x3e, 0xfe, 0xc5, 0x6c, 0xbe,
+ 0x93, 0x82, 0x3b, 0xbe, 0xcf, 0x6f, 0x19, 0x3e, 0x34, 0x40, 0x92, 0x3e, 0x95, 0x8b, 0x93, 0x3e,
+ 0x9f, 0x29, 0x38, 0xbe, 0x30, 0x48, 0x0d, 0xbf, 0x78, 0x80, 0x22, 0xbe, 0x3a, 0xa7, 0x54, 0x3f,
+ 0xac, 0x06, 0xf2, 0xbe, 0x68, 0x7a, 0xac, 0xbd, 0xbc, 0x6e, 0xa7, 0xbe, 0xbe, 0x94, 0x3f, 0x3e,
+ 0x04, 0xdb, 0x29, 0x3f, 0xb9, 0xd1, 0x72, 0x3e, 0xaf, 0xe3, 0x44, 0xbf, 0x2c, 0x9b, 0xc2, 0xbe,
+ 0x27, 0x6c, 0xf3, 0x3e, 0x7b, 0x8d, 0x0e, 0x3e, 0x15, 0xc8, 0x3b, 0x3e, 0xcb, 0xde, 0x2d, 0x3f,
+ 0xd1, 0xde, 0x82, 0x3e, 0xaf, 0xf1, 0x46, 0xbe, 0xfd, 0xab, 0x34, 0xbe, 0x73, 0x48, 0x8c, 0x3c,
+ 0x96, 0x54, 0xfc, 0xbe, 0xb6, 0xb7, 0x9e, 0xbe, 0x86, 0x5a, 0x1b, 0xbf, 0x0a, 0xa1, 0xc4, 0xbe,
+ 0x18, 0xa4, 0x89, 0xbf, 0x1b, 0xdf, 0x50, 0xbf, 0xd0, 0xd7, 0x8e, 0xbe, 0x8a, 0x51, 0x38, 0xbe,
+ 0x1d, 0xc4, 0xb3, 0xbd, 0xac, 0xb4, 0xda, 0xbe, 0xab, 0x76, 0x30, 0x3e, 0xc9, 0x3a, 0x84, 0x3f,
+ 0x9b, 0x5d, 0x1d, 0x3e, 0xa8, 0x90, 0xa0, 0xbe, 0x0a, 0x46, 0x68, 0xbe, 0x32, 0x54, 0x1e, 0x3f,
+ 0xd2, 0x9a, 0xf9, 0xbe, 0xf3, 0x39, 0x99, 0xbd, 0x54, 0x2b, 0x4e, 0xbe, 0xe5, 0x68, 0x0b, 0x3f,
+ 0x3b, 0x93, 0x37, 0x3e, 0x43, 0x3c, 0xd0, 0xbe, 0xa5, 0x49, 0xdb, 0xbd, 0xc0, 0x14, 0x1a, 0xbf,
+ 0xeb, 0x7d, 0x9c, 0xbe, 0x53, 0x72, 0x13, 0x3f, 0xbc, 0x48, 0x25, 0xbf, 0xe4, 0x91, 0x67, 0xbf,
+ 0x22, 0x3b, 0x31, 0xbe, 0x74, 0x11, 0xec, 0x3d, 0x65, 0x66, 0xff, 0xbe, 0xcc, 0x94, 0x49, 0x3f,
+ 0x58, 0x2c, 0xd0, 0x3e, 0x42, 0xce, 0xf7, 0x3d, 0xd5, 0xeb, 0x86, 0x3e, 0x45, 0xaa, 0x04, 0x3f,
+ 0xb9, 0x06, 0xb6, 0xbf, 0xd1, 0x46, 0xdb, 0x3e, 0xa4, 0x9b, 0x32, 0x3f, 0xfa, 0xe9, 0x04, 0x3f,
+ 0xa5, 0xef, 0x4b, 0x3f, 0x0f, 0x03, 0x88, 0x3f, 0xc0, 0x33, 0x36, 0xbe, 0x93, 0x74, 0xa0, 0x3c,
+ 0xc9, 0x07, 0x16, 0x3f, 0x77, 0x6b, 0x48, 0xbe, 0x2a, 0x59, 0xa8, 0x3c, 0x38, 0x79, 0x3c, 0x3c,
+ 0x2d, 0x18, 0x09, 0xbf, 0x46, 0xfc, 0x18, 0x3f, 0xa8, 0x9a, 0x61, 0x3f, 0x07, 0xeb, 0xb8, 0x3e,
+ 0xaa, 0xd8, 0x46, 0xbf, 0xa9, 0x40, 0x57, 0xbc, 0x09, 0x86, 0x32, 0xbe, 0x4d, 0x27, 0xee, 0xbc,
+ 0x95, 0xd1, 0x67, 0xbf, 0xea, 0xb2, 0x25, 0x3e, 0xd9, 0xc3, 0x28, 0x3f, 0x1c, 0xe1, 0xd8, 0x3d,
+ 0xc1, 0x57, 0xf8, 0x3d, 0x4c, 0x1e, 0xbd, 0x3e, 0xc4, 0xb9, 0xc5, 0xbe, 0x45, 0x0d, 0x82, 0xbd,
+ 0x4c, 0x4e, 0x15, 0x3e, 0xc6, 0x99, 0x46, 0xbc, 0x64, 0x03, 0x0e, 0x3e, 0x9e, 0x43, 0x60, 0x3e,
+ 0xf2, 0xa1, 0xb9, 0x3d, 0xc0, 0x6a, 0xb9, 0xbc, 0x9e, 0x09, 0x82, 0x3c, 0x4f, 0xc5, 0x5f, 0x3d,
+ 0x72, 0xde, 0x3e, 0x3e, 0xe2, 0x80, 0x38, 0x3f, 0x5a, 0xa8, 0x15, 0x3f, 0xd3, 0x0a, 0x0b, 0xbc,
+ 0xc0, 0xe1, 0xc8, 0xbe, 0x4d, 0x83, 0xc8, 0xbe, 0x7c, 0x76, 0x4d, 0xbe, 0xaa, 0x26, 0x28, 0x3e,
+ 0xe2, 0x14, 0x7b, 0xbe, 0xba, 0x13, 0x30, 0xbf, 0xcb, 0x92, 0x12, 0x3f, 0x43, 0x7c, 0xb1, 0xbe,
+ 0x48, 0x18, 0x02, 0xbf, 0xab, 0xe4, 0x01, 0x3f, 0xc9, 0x7f, 0xee, 0x3d, 0xab, 0xbc, 0x1d, 0xbf,
+ 0xce, 0xe8, 0x5f, 0x3f, 0x85, 0x3a, 0x6d, 0xbd, 0x3b, 0x02, 0x06, 0xbf, 0xff, 0x79, 0x8f, 0xbf,
+ 0x8b, 0xf0, 0x81, 0x3e, 0x44, 0x2c, 0x33, 0xbf, 0xb4, 0x03, 0x43, 0xbf, 0xbb, 0xee, 0x33, 0xbe,
+ 0x74, 0x83, 0xa2, 0x3b, 0x68, 0x8a, 0x62, 0xbe, 0xd6, 0xce, 0x7d, 0xbe, 0xf4, 0x42, 0x23, 0xbf,
+ 0x51, 0xf9, 0xe0, 0x3c, 0x9b, 0x2d, 0x8f, 0x3e, 0x93, 0xd2, 0x31, 0x3f, 0x37, 0xbc, 0x41, 0x3d,
+ 0xaf, 0x6f, 0x75, 0x3f, 0xe3, 0xea, 0x9d, 0x3e, 0x5d, 0xa1, 0xc3, 0x3e, 0xd9, 0x13, 0x05, 0x3f,
+ 0xe5, 0x3c, 0x91, 0x3e, 0x3f, 0x02, 0x7d, 0xbd, 0x3a, 0x37, 0xab, 0x3e, 0x2b, 0x7d, 0x50, 0x3e,
+ 0x35, 0xea, 0x57, 0xbe, 0xbc, 0x76, 0x8d, 0xbc, 0x5f, 0x13, 0x3f, 0x3c, 0xed, 0x4d, 0xdb, 0x3e,
+ 0xb1, 0xa1, 0x46, 0xbf, 0x7d, 0x83, 0xcd, 0xbe, 0x81, 0x43, 0x88, 0xbd, 0x5d, 0x19, 0xee, 0xbd,
+ 0xab, 0x2d, 0x35, 0x3e, 0x9f, 0x87, 0x21, 0x3e, 0x91, 0x42, 0x77, 0xbe, 0x53, 0x74, 0x04, 0x3e,
+ 0x69, 0x80, 0xdd, 0x3e, 0xfe, 0x0e, 0xe9, 0xbe, 0x38, 0xce, 0x49, 0x3d, 0x54, 0x09, 0x46, 0x3e,
+ 0xc8, 0xdc, 0xe8, 0x3d, 0xcd, 0xeb, 0x4c, 0x3e, 0xb1, 0xf8, 0xd9, 0x3d, 0x2d, 0xc1, 0x7f, 0xbe,
+ 0x93, 0xc4, 0x07, 0xbe, 0x8d, 0x1d, 0x07, 0x3f, 0x1b, 0xd5, 0x1d, 0x3f, 0xe6, 0x9b, 0x4d, 0xbf,
+ 0x43, 0xb1, 0x9b, 0xbe, 0x2f, 0x2f, 0xa0, 0xbe, 0xb5, 0x1f, 0xb0, 0xbd, 0xad, 0xa9, 0xcb, 0xbd,
+ 0x12, 0x2c, 0xc0, 0xbe, 0x01, 0xab, 0x44, 0x3e, 0x59, 0x6e, 0x48, 0x3f, 0xba, 0x17, 0x66, 0x3f,
+ 0x61, 0x12, 0x82, 0x3e, 0xf5, 0x7f, 0xe0, 0xbd, 0xbf, 0xe8, 0xbf, 0xbe, 0x7b, 0x8f, 0x10, 0xbf,
+ 0xc9, 0x2e, 0x18, 0xbf, 0x3b, 0x08, 0x8e, 0xbe, 0x41, 0xa0, 0xa0, 0xbe, 0x3c, 0xdf, 0x43, 0x3e,
+ 0xc0, 0x7f, 0x47, 0xbf, 0x04, 0xcc, 0x88, 0xbf, 0x85, 0xbf, 0xa7, 0xbe, 0x29, 0x65, 0x2a, 0xbf,
+ 0x9c, 0xa4, 0x3c, 0x3d, 0xaa, 0x61, 0x28, 0xbe, 0x5e, 0x8d, 0x4e, 0xbf, 0x03, 0xad, 0x88, 0xbc,
+ 0x64, 0xb5, 0xdb, 0x3e, 0x8e, 0xcf, 0x25, 0x3f, 0x62, 0x36, 0x1e, 0xbf, 0x01, 0x2e, 0x2e, 0xbd,
+ 0x25, 0x4a, 0xc0, 0x3e, 0x4f, 0x2a, 0xb8, 0xbe, 0xd4, 0x1c, 0x73, 0xbf, 0x1d, 0xfb, 0x06, 0xbf,
+ 0x6d, 0xd4, 0xfd, 0xbe, 0x2e, 0xed, 0x6b, 0x3f, 0x07, 0x31, 0x4c, 0xbe, 0x94, 0x31, 0xfd, 0xbe,
+ 0xef, 0x8b, 0x35, 0x3e, 0x85, 0x8c, 0x5b, 0xbe, 0xb4, 0xbd, 0x94, 0xbe, 0x8f, 0x3a, 0x07, 0x3d,
+ 0x60, 0xa0, 0x04, 0xbf, 0x77, 0x7b, 0x33, 0xbf, 0x79, 0x98, 0xe0, 0xbd, 0x9d, 0x1f, 0xa7, 0xbe,
+ 0x5c, 0x12, 0x29, 0x3f, 0x23, 0xb9, 0x0c, 0xbd, 0x83, 0x38, 0x91, 0xbd, 0x76, 0x1b, 0x91, 0x3d,
+ 0x87, 0x31, 0xe2, 0xbd, 0xe8, 0x12, 0xd4, 0x3e, 0x06, 0x53, 0x70, 0xbd, 0x83, 0x87, 0xff, 0x3e,
+ 0x18, 0xf3, 0x50, 0xbf, 0x38, 0xdc, 0xa2, 0xbe, 0x22, 0xde, 0x5e, 0xbd, 0x4c, 0x46, 0x1f, 0x3d,
+ 0x8d, 0x2d, 0x7d, 0x3f, 0x14, 0xcd, 0xa5, 0xbe, 0x38, 0xf8, 0x46, 0xbd, 0x15, 0xfb, 0x55, 0x3e,
+ 0x1b, 0xb7, 0x82, 0x3e, 0x80, 0x33, 0xf9, 0x3e, 0x00, 0x1d, 0xe3, 0xbe, 0x27, 0xc0, 0x65, 0x3e,
+ 0xec, 0x62, 0x3f, 0xbd, 0xff, 0xb9, 0xf4, 0xbe, 0x61, 0xdf, 0x24, 0x3f, 0x9f, 0xba, 0x2c, 0x3e,
+ 0xb2, 0x3e, 0xfa, 0x3c, 0x5b, 0x58, 0x09, 0x3f, 0x10, 0x07, 0x84, 0x3e, 0x6e, 0xba, 0x4e, 0x3e,
+ 0x75, 0xa9, 0xaa, 0x3e, 0x05, 0x31, 0x01, 0x3e, 0xb4, 0xd4, 0xc0, 0x3e, 0x64, 0x5e, 0xb9, 0x3d,
+ 0x88, 0xdd, 0x10, 0xbd, 0x87, 0x15, 0xad, 0x3c, 0x12, 0xa5, 0x28, 0x3f, 0x7a, 0x9a, 0xc4, 0x3e,
+ 0x99, 0x65, 0x70, 0x3e, 0xe5, 0xfe, 0x15, 0x3f, 0xe1, 0xb0, 0x85, 0x3e, 0x5c, 0x90, 0x0c, 0x3d,
+ 0xec, 0x93, 0xbd, 0xba, 0x99, 0x23, 0x06, 0x3f, 0xbf, 0xa5, 0xb4, 0xbe, 0x23, 0x88, 0xc3, 0xbe,
+ 0xa7, 0x23, 0x28, 0xbe, 0xf4, 0x5c, 0xcf, 0x3d, 0xa4, 0x9b, 0x84, 0xbe, 0xd2, 0xc8, 0xd1, 0x3e,
+ 0xe5, 0xbb, 0x71, 0x3d, 0x22, 0x92, 0x87, 0xbe, 0xed, 0x3a, 0x02, 0xbf, 0x8b, 0xdd, 0xf8, 0x3b,
+ 0xc3, 0xc2, 0x40, 0x3f, 0x44, 0x73, 0x68, 0x3e, 0x63, 0xb5, 0x23, 0xbf, 0x0a, 0xd4, 0x80, 0x3e,
+ 0x06, 0x1e, 0x7f, 0xbe, 0xe2, 0x91, 0x21, 0xbe, 0x78, 0xe3, 0x00, 0x3d, 0x5b, 0x1b, 0x75, 0xbe,
+ 0x8a, 0x29, 0xcf, 0xbe, 0x2d, 0xc8, 0x05, 0x3f, 0xba, 0x2b, 0x65, 0xbe, 0x08, 0x11, 0x7f, 0xbe,
+ 0x5a, 0x62, 0x02, 0x3f, 0xef, 0x11, 0x85, 0xbe, 0x26, 0xa8, 0xe4, 0xbd, 0xd6, 0x3b, 0x0c, 0xbf,
+ 0x01, 0x33, 0xc2, 0x3c, 0xc5, 0xbc, 0x04, 0x3f, 0x34, 0x42, 0x75, 0x3f, 0x0c, 0xef, 0x80, 0x3e,
+ 0x0d, 0x5a, 0x0b, 0xbd, 0x3f, 0x84, 0xe1, 0xbe, 0x60, 0x31, 0x10, 0xbf, 0x6e, 0xb6, 0xee, 0xbe,
+ 0xcf, 0xe3, 0x98, 0xbe, 0x25, 0x5a, 0xe5, 0xbd, 0xe1, 0x03, 0x27, 0xbf, 0x3a, 0x8b, 0x55, 0xbe,
+ 0x01, 0xbc, 0x70, 0xbe, 0x49, 0x23, 0xc7, 0xbd, 0xc2, 0x3e, 0x05, 0x3e, 0x26, 0x26, 0xc0, 0x3e,
+ 0x7f, 0x1c, 0x01, 0x3e, 0x73, 0x78, 0x01, 0xbf, 0xa1, 0xe2, 0x14, 0xbe, 0x2e, 0xc3, 0xa8, 0xbd,
+ 0xe6, 0xd5, 0xe5, 0x3d, 0x0e, 0x8c, 0x12, 0xbe, 0x66, 0x1e, 0x93, 0xbf, 0xc1, 0xe5, 0xa2, 0xbe,
+ 0x46, 0x81, 0x79, 0xbe, 0xa6, 0x04, 0x8d, 0x3b, 0x9f, 0xc7, 0xe4, 0xbe, 0x29, 0xda, 0x13, 0xbe,
+ 0x70, 0x65, 0x9e, 0xbf, 0xfc, 0x39, 0xb7, 0x3e, 0x98, 0xc2, 0xc9, 0x3e, 0x1d, 0xf9, 0xed, 0x3e,
+ 0x5d, 0x40, 0x14, 0x3f, 0x19, 0x9b, 0xb9, 0x3d, 0x67, 0x4a, 0xf9, 0x3e, 0x6f, 0x01, 0xc9, 0xbe,
+ 0x2c, 0x2f, 0x25, 0xbf, 0x84, 0xf0, 0x8a, 0xbe, 0x0c, 0xb1, 0xc2, 0xbc, 0xcb, 0x7c, 0x68, 0xbe,
+ 0x99, 0xdf, 0x5d, 0xbf, 0xc0, 0xeb, 0x4c, 0xbe, 0xfe, 0x2d, 0xd0, 0xbe, 0x66, 0x44, 0xdb, 0xbe,
+ 0x36, 0x5d, 0x0a, 0x3f, 0x95, 0x85, 0x81, 0x3e, 0x63, 0x22, 0xe4, 0xbe, 0x30, 0x48, 0xd5, 0xbe,
+ 0x6a, 0x7e, 0xa0, 0xbd, 0x54, 0x57, 0xd5, 0x3c, 0x86, 0x44, 0xd4, 0xbe, 0xf6, 0xfd, 0xf0, 0x3e,
+ 0x8c, 0x93, 0xf1, 0x3d, 0x38, 0x50, 0x73, 0xbe, 0x93, 0x20, 0xdd, 0xbe, 0xfe, 0x7e, 0xe9, 0xbe,
+ 0x72, 0xf2, 0xb2, 0x3f, 0xf8, 0x3a, 0x93, 0x40, 0xf9, 0x29, 0x83, 0x40, 0x58, 0x99, 0x85, 0x3e,
+ 0xd2, 0x0d, 0xce, 0x3f, 0x8e, 0xf0, 0x09, 0x40, 0x2e, 0xa0, 0x4f, 0xbf, 0xe8, 0xb4, 0x31, 0xc0,
+ 0xfc, 0x33, 0x33, 0x40, 0xeb, 0x4f, 0xd9, 0x3f, 0x31, 0xe2, 0x6b, 0x40, 0xff, 0x7e, 0x25, 0x40,
+ 0xb4, 0xd0, 0x45, 0x40, 0x53, 0x6e, 0x67, 0x3f, 0xb5, 0x69, 0x62, 0xc0, 0xd1, 0x00, 0x07, 0x40,
+ 0xfc, 0x97, 0x4a, 0x40, 0xd0, 0x80, 0x0a, 0x40, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
+ 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x12, 0x00,
+ 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x38, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x38, 0x21, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x12, 0x00,
+ 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
+ 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0xc5, 0x8f, 0xbf, 0xf2, 0xc5, 0xa7, 0xbe,
+ 0x7b, 0xa2, 0x46, 0x3f, 0xee, 0x66, 0x6d, 0xbf, 0x24, 0x72, 0xd2, 0xbf, 0xbc, 0xb4, 0x44, 0xbe,
+ 0x4c, 0x4f, 0x86, 0x3f, 0x93, 0x26, 0x20, 0xbf, 0x84, 0xc2, 0x00, 0x3f, 0x16, 0x44, 0x84, 0xbe,
+ 0x71, 0x01, 0x81, 0x3f, 0xfe, 0x55, 0x82, 0x3f, 0x46, 0x8d, 0xfc, 0xbe, 0x7d, 0x0b, 0x83, 0x3f,
+ 0x22, 0x2f, 0x5c, 0xbf, 0x06, 0x1e, 0xb9, 0xbf, 0x92, 0xe0, 0x97, 0x3d, 0x4e, 0x18, 0x1f, 0xbf,
+ 0x46, 0xa1, 0x68, 0xbf, 0xb5, 0xae, 0x95, 0xbf, 0x2f, 0x45, 0x53, 0x3f, 0xb9, 0x98, 0x4f, 0x3f,
+ 0x34, 0x52, 0x59, 0xbf, 0x52, 0x70, 0x9f, 0xbf, 0x42, 0x3f, 0x18, 0xbf, 0x7f, 0x92, 0x8f, 0xbf,
+ 0x00, 0xdb, 0x45, 0x3f, 0x71, 0x4d, 0x88, 0x3f, 0xf5, 0xe6, 0xd9, 0xbe, 0x59, 0xd1, 0x62, 0x3f,
+ 0xd8, 0x62, 0x4a, 0xbf, 0x36, 0xd2, 0x9e, 0xbf, 0x36, 0x8a, 0x05, 0x3e, 0x8e, 0x54, 0x3c, 0x3f,
+ 0x21, 0x6d, 0x5e, 0xbf, 0x30, 0x4b, 0x20, 0xbe, 0xfe, 0x76, 0x9f, 0xbf, 0xac, 0x01, 0x8e, 0xbf,
+ 0xfe, 0x1c, 0x02, 0x3f, 0x5e, 0x1b, 0x13, 0xbf, 0xfd, 0xfb, 0x44, 0xbf, 0x75, 0xf0, 0x1a, 0x3f,
+ 0xb9, 0xb6, 0x8f, 0x3f, 0xc0, 0x14, 0x5c, 0x3e, 0xd2, 0xdc, 0x5a, 0xbf, 0x52, 0x87, 0x88, 0x3e,
+ 0xdc, 0x1f, 0x64, 0xbf, 0x59, 0xfb, 0x2b, 0xbf, 0xc9, 0x15, 0x89, 0x3f, 0x69, 0xd3, 0x39, 0xbf,
+ 0xa8, 0x56, 0x62, 0x3f, 0xd0, 0x9c, 0x89, 0x3e, 0xf8, 0xd8, 0x61, 0x3f, 0x0c, 0x4b, 0xba, 0xbe,
+ 0xbb, 0xcf, 0x6f, 0x3f, 0xc8, 0xad, 0x84, 0xbe, 0x29, 0x92, 0xde, 0xbf, 0x42, 0x6f, 0x8d, 0xbe,
+ 0x59, 0xa2, 0xa8, 0xbe, 0x49, 0xf6, 0x8d, 0xbf, 0xff, 0xa3, 0x32, 0x3f, 0xe7, 0x63, 0x26, 0x3f,
+ 0x67, 0xb0, 0xd5, 0x3e, 0x6a, 0x20, 0x8b, 0xbf, 0x65, 0xba, 0x98, 0xbf, 0xbd, 0x80, 0x59, 0x3f,
+ 0x8c, 0x40, 0x8a, 0x3f, 0xd1, 0xbb, 0x18, 0xbf, 0xd7, 0xd5, 0x02, 0xbe, 0x68, 0x22, 0x6b, 0x3f,
+ 0xa1, 0xd4, 0xb1, 0xbf, 0xa9, 0x14, 0x16, 0xbf, 0xf5, 0x86, 0x2f, 0x3d, 0xcd, 0xf3, 0x5b, 0xbc,
+ 0x90, 0x33, 0x5f, 0x3f, 0xe6, 0xe7, 0x97, 0xbf, 0xf9, 0x5f, 0x8c, 0x3f, 0xfe, 0x03, 0x8d, 0x3d,
+ 0x3c, 0x80, 0xa0, 0xbf, 0x63, 0x67, 0xb6, 0xbf, 0x62, 0x3a, 0xa0, 0x3f, 0xc6, 0x6b, 0x4b, 0xbf,
+ 0x7f, 0x5d, 0x71, 0x3e, 0x70, 0x17, 0xb3, 0xbf, 0x15, 0xba, 0x7b, 0xbf, 0x95, 0x2f, 0x90, 0xbe,
+ 0x65, 0x6e, 0x16, 0xbf, 0x3c, 0x18, 0x64, 0x3f, 0x87, 0x5b, 0x6a, 0x3f, 0xbb, 0x17, 0x83, 0xbe,
+ 0x7e, 0x75, 0x87, 0x3f, 0x72, 0x04, 0x09, 0xbf, 0x1d, 0x52, 0x18, 0xbf, 0xb1, 0x52, 0x82, 0x3f,
+ 0x5c, 0x71, 0x28, 0xbf, 0x2f, 0x2d, 0x01, 0x3f, 0x3c, 0x79, 0x28, 0xbf, 0xdb, 0xf1, 0x8d, 0x3f,
+ 0xac, 0x67, 0x74, 0xbf, 0xca, 0x63, 0x30, 0xbf, 0xd9, 0x66, 0x73, 0x3f, 0xc6, 0x08, 0xae, 0x3e,
+ 0xae, 0xa1, 0xb1, 0xbf, 0xce, 0xb4, 0x33, 0xbf, 0x1f, 0x59, 0xde, 0x3e, 0xb6, 0x63, 0xa0, 0x3c,
+ 0x22, 0x0e, 0x1b, 0xbe, 0x8c, 0xb9, 0xab, 0xbf, 0xaf, 0xdf, 0x84, 0xbf, 0x40, 0x4d, 0x87, 0x3f,
+ 0x84, 0xa4, 0x55, 0x3f, 0xd2, 0xe6, 0x2f, 0x3f, 0x7e, 0x36, 0xa1, 0xbf, 0x41, 0x85, 0xa7, 0x3f,
+ 0xda, 0xf2, 0xbc, 0xbf, 0x08, 0xda, 0x50, 0xbf, 0x45, 0x86, 0x12, 0xbf, 0x5d, 0xa2, 0x31, 0xbe,
+ 0xd4, 0x5d, 0x51, 0x3f, 0x60, 0x49, 0x8a, 0xbf, 0x29, 0xf4, 0x2f, 0x3f, 0xef, 0x42, 0x06, 0xbf,
+ 0x9b, 0xf1, 0x87, 0xbf, 0xf6, 0x33, 0xe0, 0xbd, 0xfb, 0x3d, 0x89, 0xbf, 0xb4, 0x00, 0xa7, 0xbf,
+ 0x8f, 0xfa, 0x18, 0xbf, 0x56, 0x2c, 0xa2, 0xbf, 0x0b, 0x61, 0x82, 0xbb, 0xe7, 0x32, 0x70, 0x3f,
+ 0xee, 0x8e, 0x4b, 0x3f, 0xd4, 0xbf, 0xc3, 0xbf, 0x41, 0xa8, 0x04, 0x3e, 0x5c, 0x25, 0x33, 0xbf,
+ 0x94, 0xa8, 0x5d, 0xbf, 0xc4, 0x14, 0x4f, 0xbf, 0x15, 0xa7, 0x65, 0xbf, 0x44, 0x40, 0x42, 0x3f,
+ 0xcd, 0x62, 0xe1, 0xbe, 0x17, 0xf3, 0x42, 0x3f, 0xc6, 0x39, 0x23, 0x3f, 0xbf, 0x84, 0x00, 0xbf,
+ 0xcb, 0x66, 0x5c, 0x3f, 0xd0, 0x22, 0x39, 0x3f, 0x17, 0xdc, 0x50, 0x3f, 0xbb, 0xe6, 0xae, 0x3e,
+ 0x7f, 0x18, 0x62, 0xbf, 0xab, 0xd3, 0xdb, 0x3e, 0xe1, 0x94, 0x71, 0xbf, 0xc9, 0x49, 0x55, 0xbe,
+ 0x03, 0x6e, 0x08, 0x3f, 0xd6, 0x2f, 0x86, 0xbd, 0x00, 0x02, 0x4a, 0xbe, 0x58, 0x8f, 0x76, 0x3f,
+ 0x1b, 0x44, 0x9a, 0x3e, 0x55, 0x4d, 0x7f, 0xbf, 0x2e, 0x7b, 0x8e, 0x3d, 0xb1, 0xb9, 0x66, 0xbe,
+ 0xdc, 0xf2, 0x8f, 0xbf, 0xcc, 0xa7, 0xa6, 0xbf, 0xab, 0x7d, 0x61, 0xbe, 0xe2, 0x5f, 0xa2, 0x3f,
+ 0x1b, 0xed, 0xef, 0x3e, 0x54, 0x6d, 0x8d, 0x3f, 0x4c, 0xa0, 0x84, 0xbf, 0xc1, 0x4a, 0x82, 0xbf,
+ 0xad, 0x7e, 0x49, 0x3f, 0x57, 0x90, 0x64, 0xbe, 0x7f, 0x6a, 0x46, 0xbf, 0xde, 0x5b, 0x8d, 0x3e,
+ 0x4a, 0x2b, 0x88, 0xbf, 0x0c, 0xcd, 0xf1, 0x3d, 0x1c, 0xb7, 0x8d, 0xbf, 0xb2, 0x91, 0xe6, 0x3c,
+ 0x4b, 0xeb, 0x8a, 0xbf, 0x42, 0xfa, 0x9c, 0x3f, 0x3b, 0x17, 0x9b, 0xbe, 0x57, 0x00, 0x3c, 0x3f,
+ 0xc3, 0x66, 0xd0, 0xbe, 0xb6, 0xda, 0x9e, 0xbe, 0x55, 0xd5, 0xb6, 0x3d, 0x0f, 0x1f, 0xec, 0x3c,
+ 0x29, 0x87, 0x9f, 0xbd, 0xa8, 0x0b, 0x1f, 0xbc, 0x56, 0xe0, 0x8d, 0x3b, 0xf9, 0x5e, 0x74, 0x3c,
+ 0x50, 0x4a, 0x99, 0x3a, 0xa3, 0xdd, 0x9d, 0xbe, 0x69, 0xd0, 0x3e, 0x3d, 0x8a, 0x13, 0x8f, 0x3e,
+ 0x03, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x38, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0a, 0x00,
+ 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00,
+
};
+
+#endif
diff --git a/examples/mnist_cnn/mnist_cnn_fp32.tflite b/examples/mnist_cnn/mnist_cnn_fp32.tflite
new file mode 100644
index 0000000..c79fd9c
Binary files /dev/null and b/examples/mnist_cnn/mnist_cnn_fp32.tflite differ
diff --git a/examples/mnist_cnn/mnist_cnn_fp32.tmdl b/examples/mnist_cnn/mnist_cnn_fp32.tmdl
new file mode 100644
index 0000000..f449d02
Binary files /dev/null and b/examples/mnist_cnn/mnist_cnn_fp32.tmdl differ
diff --git a/examples/mnist_cnn/mnist_cnn_int8.h b/examples/mnist_cnn/mnist_cnn_int8.h
new file mode 100644
index 0000000..5f46419
--- /dev/null
+++ b/examples/mnist_cnn/mnist_cnn_int8.h
@@ -0,0 +1,254 @@
+#ifndef __MODEL_FILE__H
+#define __MODEL_FILE__H
+
+#include
+#define MDL_BUF_LEN (2136)
+#define LBUF_LEN (2232)
+const uint8_t mdl_data[3912]={\
+ 0x4d, 0x41, 0x49, 0x58, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x58, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00,
+ 0x03, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x08, 0x00,
+ 0x81, 0x80, 0x80, 0x3b, 0x80, 0xff, 0xff, 0xff, 0x07, 0xeb, 0x5b, 0x3c, 0x80, 0xff, 0xff, 0xff,
+ 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00,
+ 0xe4, 0x9c, 0x75, 0x3b, 0xd7, 0x2d, 0x1e, 0x3c, 0x26, 0x92, 0x92, 0x3c, 0xb9, 0x7e, 0x90, 0x3c,
+ 0x5f, 0xf8, 0x7f, 0x3c, 0x45, 0x02, 0x59, 0x3c, 0x96, 0x19, 0x8e, 0x3c, 0x91, 0xe2, 0xba, 0x3b,
+ 0x12, 0x56, 0x4a, 0x7f, 0x75, 0x4f, 0x4e, 0x70, 0x4d, 0x16, 0x5f, 0x7f, 0xf0, 0x25, 0x0c, 0x36,
+ 0x05, 0x9e, 0x12, 0x31, 0x2b, 0xee, 0x17, 0x29, 0xa2, 0xbc, 0x81, 0x29, 0xbe, 0x81, 0x10, 0x08,
+ 0x28, 0xda, 0x39, 0x4e, 0xff, 0x81, 0xc5, 0xb0, 0x0e, 0x2b, 0x96, 0x00, 0x40, 0xf3, 0xca, 0xa4,
+ 0x2c, 0xf6, 0xd1, 0xd4, 0xc0, 0x81, 0xbb, 0x32, 0x19, 0xcc, 0x92, 0x81, 0x0d, 0x08, 0xf6, 0x7f,
+ 0xe5, 0x4e, 0x63, 0x44, 0x6d, 0x08, 0xf7, 0x32, 0xff, 0x27, 0x01, 0x00, 0xd9, 0x61, 0x00, 0x00,
+ 0xe1, 0xd8, 0xff, 0xff, 0xfd, 0x06, 0x00, 0x00, 0xa6, 0xaa, 0xff, 0xff, 0x75, 0x72, 0xff, 0xff,
+ 0x14, 0xb5, 0xff, 0xff, 0xb4, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00,
+ 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x08, 0x00,
+ 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x07, 0xeb, 0x5b, 0x3c, 0x80, 0xff, 0xff, 0xff,
+ 0x8b, 0x82, 0x84, 0x3c, 0x80, 0xff, 0xff, 0xff, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x30, 0xbd, 0xd1, 0x3b, 0xf1, 0x7d, 0x9c, 0x3b,
+ 0x44, 0x5d, 0x84, 0x3b, 0xaf, 0x5b, 0xd3, 0x3a, 0x32, 0xdc, 0x4c, 0x3b, 0xc3, 0xb2, 0x81, 0x3b,
+ 0x1b, 0x77, 0xaf, 0x3b, 0x16, 0x9e, 0x47, 0x3b, 0x2c, 0x9b, 0x88, 0x3b, 0xce, 0xe2, 0x34, 0x3b,
+ 0xc9, 0xb0, 0x4f, 0x3b, 0xb8, 0xe2, 0x9a, 0x3b, 0xfe, 0x0e, 0x1b, 0x06, 0xff, 0xe9, 0xf2, 0xfe,
+ 0xf8, 0x17, 0x1d, 0xdb, 0x26, 0x0d, 0xfe, 0x1a, 0x23, 0x02, 0xb1, 0xf1, 0xef, 0x0f, 0xe4, 0xf8,
+ 0x26, 0xea, 0x10, 0xe3, 0xfe, 0xeb, 0xef, 0x0f, 0xf2, 0x17, 0xfc, 0xe5, 0x66, 0xf0, 0x04, 0x36,
+ 0x0f, 0x04, 0x0d, 0x3b, 0x1d, 0x46, 0x30, 0x43, 0x5c, 0x02, 0x28, 0x0d, 0x02, 0x2e, 0x7f, 0x16,
+ 0x2d, 0x26, 0x47, 0x0c, 0x42, 0x2b, 0x1a, 0xf0, 0xe9, 0x04, 0x04, 0x0e, 0x14, 0x0b, 0xf8, 0xfe,
+ 0xe9, 0x0c, 0x13, 0xe5, 0x14, 0xed, 0xc8, 0xce, 0xfc, 0xe7, 0x30, 0x19, 0x1a, 0xfa, 0x01, 0x1b,
+ 0xf9, 0xe7, 0x0c, 0xeb, 0x0a, 0xe7, 0xd9, 0x03, 0xc5, 0xef, 0x0a, 0x11, 0x28, 0x16, 0xfa, 0x01,
+ 0x07, 0xbb, 0xb7, 0xf1, 0xc5, 0x81, 0xb9, 0xf9, 0xfa, 0xf7, 0x3b, 0x00, 0xda, 0xb1, 0xdb, 0xd0,
+ 0xce, 0x04, 0xf8, 0x53, 0x39, 0x1b, 0x10, 0xe9, 0x03, 0x0c, 0x30, 0x14, 0xd8, 0xea, 0x2c, 0x13,
+ 0xf4, 0x12, 0x0a, 0x01, 0x43, 0xd5, 0xf0, 0x0b, 0xf2, 0xfd, 0xef, 0xef, 0x0a, 0x06, 0x08, 0xe0,
+ 0x23, 0x00, 0x03, 0xfb, 0xf7, 0xe4, 0x00, 0xdd, 0xf1, 0xf0, 0xf3, 0x05, 0xeb, 0xc0, 0xfb, 0x2a,
+ 0xe1, 0xd7, 0x06, 0x26, 0x13, 0x35, 0x0f, 0x2c, 0x1e, 0xf7, 0x1d, 0x00, 0xb2, 0xbd, 0xc5, 0xc4,
+ 0x8d, 0xa6, 0xdc, 0xa5, 0xcf, 0xe4, 0xba, 0x05, 0x39, 0xf3, 0xbd, 0xc6, 0x91, 0x81, 0xc5, 0xc5,
+ 0x2a, 0xda, 0xd4, 0x04, 0xd5, 0xe7, 0xff, 0xf4, 0x0e, 0xdd, 0xc7, 0xfc, 0xef, 0xfc, 0x02, 0x04,
+ 0x11, 0x2d, 0x3e, 0x21, 0x4d, 0xea, 0x2c, 0xf8, 0xc2, 0x4f, 0x1e, 0x27, 0x21, 0x59, 0x2e, 0x33,
+ 0x67, 0x30, 0xe2, 0x16, 0xfa, 0xcf, 0x16, 0xda, 0xc5, 0x20, 0x34, 0xe9, 0xba, 0xf0, 0xd2, 0xa2,
+ 0xcf, 0x20, 0xf3, 0xe0, 0xac, 0xe6, 0xeb, 0x04, 0x2e, 0x19, 0xfb, 0xb3, 0x9b, 0xee, 0x19, 0x9e,
+ 0x18, 0x47, 0x24, 0x85, 0xea, 0xd9, 0xca, 0x06, 0xec, 0xbf, 0xe1, 0xc7, 0x81, 0xee, 0xc6, 0x18,
+ 0xf5, 0x20, 0xef, 0xfd, 0x0a, 0x18, 0x4f, 0xc6, 0xd8, 0xc8, 0x00, 0x1c, 0x1e, 0xfd, 0x12, 0x0f,
+ 0xba, 0xed, 0xee, 0xdd, 0x29, 0x02, 0xd0, 0x06, 0x07, 0x09, 0xec, 0x24, 0x36, 0xdd, 0x03, 0x12,
+ 0x00, 0x09, 0xf5, 0xf5, 0xf0, 0x06, 0x13, 0x11, 0x30, 0x15, 0x2a, 0x3f, 0xec, 0x3b, 0x2e, 0xc8,
+ 0xeb, 0xb3, 0xe5, 0xa2, 0x81, 0x0e, 0x33, 0x38, 0xf4, 0x17, 0x19, 0x93, 0x94, 0xa0, 0x14, 0x3f,
+ 0x53, 0xd8, 0x39, 0x11, 0x10, 0x05, 0x12, 0x08, 0x20, 0xf2, 0x1d, 0x12, 0xbd, 0x21, 0x1c, 0x15,
+ 0xd1, 0x04, 0x01, 0x22, 0x0c, 0xd1, 0x11, 0xfd, 0xe6, 0xc7, 0x81, 0xd2, 0x0a, 0xe4, 0xe8, 0xcc,
+ 0xdb, 0x04, 0x34, 0x6d, 0x46, 0xe9, 0x43, 0x43, 0x27, 0x21, 0x27, 0x29, 0x57, 0x2a, 0xfc, 0x38,
+ 0x18, 0xec, 0x08, 0x10, 0x2f, 0xe4, 0xf5, 0xd1, 0xb2, 0xba, 0x07, 0xd6, 0xf1, 0x3d, 0xf6, 0xf0,
+ 0xc2, 0xe3, 0xbe, 0x2c, 0xdd, 0xde, 0x72, 0x4b, 0x46, 0xe1, 0x2e, 0x43, 0x02, 0xfe, 0x10, 0xa4,
+ 0xdd, 0x0f, 0x33, 0x3b, 0x4b, 0xfd, 0xf9, 0x16, 0xde, 0xfa, 0xfb, 0xca, 0xf0, 0xfe, 0x19, 0xeb,
+ 0xe3, 0xd8, 0xfe, 0x19, 0x02, 0x0e, 0x18, 0x10, 0xf0, 0xfa, 0xe3, 0x1f, 0x27, 0x2f, 0x21, 0x2a,
+ 0x13, 0x48, 0x3d, 0xc6, 0xdf, 0xf9, 0xd2, 0xf8, 0xf9, 0x28, 0x34, 0x0f, 0x08, 0xf3, 0xf2, 0xf9,
+ 0xf3, 0x19, 0xdf, 0x1c, 0x3a, 0x0d, 0xcc, 0x81, 0x3e, 0xd9, 0xd3, 0xb3, 0xbb, 0x37, 0xea, 0xe2,
+ 0xc9, 0x40, 0x50, 0x0d, 0x37, 0x3c, 0x39, 0xfc, 0x18, 0x0d, 0xc7, 0x06, 0x1d, 0xec, 0x1c, 0xfb,
+ 0xdf, 0xd5, 0xdc, 0xf6, 0x34, 0xf2, 0x2d, 0x3c, 0x01, 0xcf, 0xd8, 0xc6, 0xd4, 0x42, 0x2a, 0x31,
+ 0x00, 0xf2, 0x75, 0x5a, 0x4f, 0x14, 0xef, 0x55, 0xc5, 0xfe, 0x1d, 0xe3, 0xd7, 0x05, 0x00, 0x40,
+ 0x54, 0xfe, 0x32, 0x33, 0xe2, 0xf5, 0xd4, 0x7f, 0x69, 0xf0, 0x00, 0xff, 0xdc, 0x21, 0x2c, 0x3b,
+ 0x48, 0xf5, 0xb5, 0xd0, 0xc6, 0xad, 0x2c, 0x0b, 0x62, 0x26, 0x17, 0x18, 0x1c, 0x04, 0x0f, 0xf6,
+ 0xb6, 0xd9, 0xc3, 0xe6, 0x58, 0x0b, 0xf0, 0x06, 0xe3, 0xdf, 0xf5, 0xbc, 0xb1, 0xe6, 0xf5, 0xe6,
+ 0x1d, 0xdc, 0x01, 0xe6, 0xe3, 0xfb, 0xce, 0xeb, 0xc8, 0xf8, 0x4d, 0x19, 0xe2, 0x7f, 0x5d, 0x0e,
+ 0xe6, 0xdf, 0xf6, 0xff, 0xe6, 0xc4, 0x2d, 0x24, 0xcc, 0xec, 0xe2, 0xf4, 0xf6, 0x14, 0x1c, 0xfb,
+ 0xdf, 0x15, 0x15, 0xf2, 0xe4, 0xee, 0x0e, 0xfc, 0xf2, 0xfc, 0x3a, 0xdd, 0xf4, 0x04, 0x36, 0x1e,
+ 0xca, 0x43, 0x30, 0x3b, 0xd0, 0xf2, 0x30, 0x16, 0x2f, 0xd3, 0xee, 0x07, 0xcc, 0x31, 0x34, 0x20,
+ 0xbf, 0x04, 0xe1, 0xfe, 0xe0, 0x6c, 0xe7, 0xfb, 0x13, 0x02, 0xc8, 0xd0, 0xca, 0x3d, 0xf9, 0x43,
+ 0x47, 0xef, 0x24, 0x58, 0xfd, 0x7f, 0x18, 0xbb, 0x32, 0xee, 0xec, 0x22, 0x09, 0xdf, 0x0b, 0x34,
+ 0xff, 0x18, 0x25, 0xe8, 0xb8, 0x87, 0x86, 0xe9, 0xac, 0xda, 0x3f, 0x14, 0x3b, 0xcb, 0xd4, 0x09,
+ 0xba, 0xf6, 0x17, 0xc6, 0xce, 0x82, 0x04, 0x2f, 0xe7, 0x0f, 0x30, 0x01, 0x22, 0xad, 0x85, 0x26,
+ 0x2f, 0x14, 0xe3, 0x1b, 0x2f, 0xe3, 0xf1, 0x2d, 0xfa, 0x18, 0x16, 0xfb, 0x29, 0x1f, 0xef, 0x32,
+ 0xfe, 0xe7, 0xf6, 0xe6, 0x11, 0x15, 0x03, 0xd4, 0x04, 0x0d, 0xd6, 0x82, 0xc7, 0xf2, 0xcb, 0x1f,
+ 0xdf, 0xd3, 0xef, 0xfb, 0x10, 0x17, 0xbc, 0xdd, 0x1a, 0xc4, 0xfe, 0x1c, 0x1f, 0xee, 0x0a, 0x1b,
+ 0xee, 0xee, 0xfc, 0xf5, 0xf1, 0x33, 0xff, 0x21, 0x2b, 0xde, 0x26, 0x6b, 0xfd, 0xae, 0x3f, 0xfb,
+ 0x1a, 0xd1, 0x81, 0x37, 0xe2, 0xbf, 0xf3, 0xcd, 0x3c, 0xea, 0xc5, 0x26, 0x12, 0xa1, 0x0e, 0x09,
+ 0xfb, 0xca, 0xe0, 0x11, 0x11, 0x15, 0xfd, 0x1c, 0xdf, 0x04, 0x20, 0x31, 0x04, 0xfe, 0xf9, 0xd0,
+ 0xc4, 0x09, 0xfe, 0x02, 0x00, 0x21, 0x43, 0x3c, 0x3f, 0x4c, 0x36, 0xeb, 0x10, 0x04, 0x0f, 0x1d,
+ 0x07, 0xf6, 0x13, 0x1b, 0x18, 0x0d, 0xf3, 0xdb, 0xb3, 0xf2, 0xea, 0x81, 0xb1, 0xcd, 0xcc, 0xac,
+ 0xd4, 0x02, 0xf6, 0x02, 0xd3, 0xe7, 0xbc, 0xde, 0xb6, 0xc9, 0x20, 0x2d, 0x3e, 0x4b, 0x26, 0xec,
+ 0x04, 0xf8, 0x1f, 0xff, 0xfc, 0x53, 0x08, 0x3c, 0xca, 0x4d, 0x01, 0x00, 0x1d, 0x4c, 0xff, 0xff,
+ 0xd3, 0x1c, 0xfe, 0xff, 0xf3, 0xbd, 0xff, 0xff, 0x86, 0xfd, 0xff, 0xff, 0x13, 0x6c, 0x00, 0x00,
+ 0x64, 0x22, 0x00, 0x00, 0x81, 0xec, 0x00, 0x00, 0xee, 0xcd, 0xff, 0xff, 0x4c, 0x95, 0xff, 0xff,
+ 0xa6, 0x5b, 0xff, 0xff, 0x38, 0xdc, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x78, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0c, 0x00,
+ 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x12, 0x00, 0x8b, 0x82, 0x84, 0x3c, 0x80, 0xff, 0xff, 0xff,
+ 0x78, 0x24, 0x2f, 0x3d, 0x80, 0xff, 0xff, 0xff, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
+ 0x98, 0x00, 0x00, 0x00, 0x30, 0x08, 0x00, 0x00, 0x1b, 0x3c, 0x37, 0x3c, 0xb6, 0x6d, 0x70, 0x3c,
+ 0x00, 0x92, 0xf1, 0x3b, 0x71, 0x70, 0x28, 0x3c, 0xc3, 0x14, 0xf3, 0x3b, 0x17, 0xad, 0x1e, 0x3c,
+ 0x2c, 0xaa, 0x43, 0x3c, 0x04, 0xa8, 0x44, 0x3c, 0xe4, 0x4d, 0x31, 0x3c, 0x89, 0x87, 0x0f, 0x3c,
+ 0x23, 0xfe, 0x1e, 0x3c, 0x35, 0x8b, 0x14, 0x3c, 0x8a, 0xe6, 0x5f, 0x3c, 0x3c, 0x7f, 0x1e, 0x3c,
+ 0xbe, 0x7b, 0x14, 0x3c, 0xa4, 0x75, 0x37, 0x3c, 0x35, 0x9b, 0x10, 0x3c, 0xb9, 0xa4, 0x1f, 0x3c,
+ 0x4c, 0x1e, 0xb7, 0x3c, 0x04, 0xe3, 0xe6, 0x8a, 0x0c, 0xe2, 0xf3, 0xf8, 0xfd, 0x0a, 0xe9, 0x01,
+ 0x9c, 0xa9, 0x32, 0x31, 0xe9, 0x15, 0x4c, 0x29, 0x14, 0x0f, 0xef, 0xda, 0xf7, 0xf9, 0xed, 0x0d,
+ 0xe6, 0xf2, 0xe5, 0xe9, 0x07, 0xea, 0xda, 0xcb, 0x0e, 0x32, 0xe4, 0xe0, 0xca, 0xc1, 0xd2, 0x12,
+ 0xfd, 0xf8, 0xe5, 0x1e, 0x1f, 0xbf, 0x14, 0xe9, 0xeb, 0x2b, 0x67, 0x19, 0x0e, 0x26, 0x0d, 0xae,
+ 0xd8, 0x00, 0x2a, 0xf0, 0xb8, 0x13, 0x25, 0xec, 0xd8, 0x1d, 0xce, 0x26, 0x20, 0x3a, 0xc6, 0xb8,
+ 0xe6, 0x3b, 0x14, 0xc8, 0x0f, 0xdd, 0xff, 0xf8, 0x25, 0xf9, 0x20, 0xb9, 0xf2, 0x14, 0xf0, 0x31,
+ 0xe3, 0xfb, 0xee, 0xea, 0x4d, 0x7f, 0x3c, 0x2b, 0x31, 0x0b, 0xe8, 0xcd, 0xba, 0xf6, 0x1b, 0x68,
+ 0x38, 0xe4, 0x30, 0x19, 0xfc, 0xc5, 0xe8, 0xff, 0x04, 0x33, 0x00, 0x36, 0x09, 0xd2, 0xfc, 0x27,
+ 0x28, 0x51, 0x50, 0xed, 0x2b, 0x2c, 0x11, 0xb1, 0xc8, 0x15, 0xd8, 0xdf, 0xf5, 0xe4, 0xe9, 0x0d,
+ 0xe6, 0xf0, 0xe9, 0x11, 0xf1, 0xea, 0x01, 0xd6, 0xd6, 0xdc, 0xd4, 0x18, 0xd1, 0x0f, 0xf2, 0x02,
+ 0x07, 0xe5, 0xa6, 0xc0, 0x1d, 0x00, 0xcc, 0xfd, 0x16, 0x13, 0xec, 0xce, 0xe6, 0x07, 0xd7, 0xca,
+ 0x0e, 0xe5, 0xec, 0x04, 0xb4, 0xa1, 0x0a, 0xf7, 0xa7, 0xe8, 0xd2, 0xe3, 0xf6, 0x81, 0x00, 0x0d,
+ 0xda, 0xff, 0x15, 0x18, 0x03, 0x12, 0xdd, 0xef, 0xec, 0x20, 0x00, 0xe7, 0xfd, 0xfa, 0x0c, 0xdd,
+ 0x41, 0x20, 0x2a, 0x03, 0x00, 0x14, 0x0a, 0x1d, 0xf6, 0xde, 0x53, 0x97, 0xd9, 0x3e, 0xb1, 0x3e,
+ 0xc1, 0xd5, 0xfe, 0xee, 0xf0, 0x09, 0xe9, 0xf5, 0x4f, 0x3b, 0xc7, 0xd1, 0xec, 0x95, 0xa5, 0xcc,
+ 0xde, 0xea, 0x24, 0x2a, 0xe9, 0x0e, 0xe8, 0xf3, 0xea, 0x79, 0x55, 0x4d, 0xc3, 0xe8, 0xc0, 0x48,
+ 0x32, 0xe5, 0x22, 0x2c, 0x25, 0x12, 0x04, 0xbb, 0xc0, 0x94, 0xab, 0xcf, 0xcd, 0xff, 0x39, 0x0f,
+ 0x27, 0xe2, 0xfd, 0x9d, 0xb5, 0xe8, 0xb0, 0xe3, 0xf0, 0x2b, 0xfd, 0xbb, 0xce, 0x23, 0x35, 0x19,
+ 0xd1, 0xaf, 0xef, 0x4c, 0xc7, 0x2b, 0xff, 0x40, 0x10, 0xf3, 0xa1, 0xcd, 0xf0, 0xcc, 0xc9, 0xe3,
+ 0xe7, 0xf2, 0x1a, 0xde, 0xd7, 0x0c, 0x30, 0x25, 0x0b, 0x32, 0x7f, 0x10, 0xad, 0xe5, 0xed, 0xe2,
+ 0xf3, 0xeb, 0x21, 0x53, 0x21, 0xb4, 0xdd, 0x1d, 0xef, 0x18, 0x04, 0x31, 0x24, 0x2c, 0x02, 0x17,
+ 0xf8, 0xc2, 0xc8, 0x07, 0xbf, 0x07, 0x2a, 0x10, 0xe4, 0x03, 0xc1, 0xe7, 0x08, 0xcf, 0xbe, 0x46,
+ 0x24, 0x57, 0x24, 0xff, 0xde, 0x24, 0x08, 0xe7, 0x14, 0x3f, 0xcd, 0xdd, 0x26, 0xd9, 0xbe, 0xfd,
+ 0x2c, 0xd1, 0x36, 0x7f, 0xe9, 0x20, 0x3b, 0x2e, 0x15, 0x0f, 0xf1, 0x24, 0x35, 0xdd, 0xed, 0x8a,
+ 0xd0, 0x17, 0xba, 0xb9, 0xe9, 0x55, 0xc1, 0x16, 0xdd, 0x21, 0x48, 0xe9, 0x00, 0xd0, 0x62, 0x00,
+ 0x0a, 0x56, 0x38, 0x70, 0x17, 0xfa, 0x15, 0xdf, 0xd5, 0x23, 0xec, 0xf7, 0x15, 0x42, 0xf8, 0x16,
+ 0xfa, 0x0a, 0xf2, 0x0f, 0x23, 0xf6, 0xea, 0xba, 0x25, 0xe6, 0xe0, 0x18, 0xdb, 0x15, 0x01, 0xd3,
+ 0xa1, 0x39, 0x01, 0xda, 0xca, 0x83, 0x30, 0x33, 0x1e, 0x09, 0xce, 0xda, 0x12, 0x38, 0x0c, 0x33,
+ 0x7f, 0xe0, 0xbf, 0x3e, 0x0c, 0xf4, 0xd9, 0xea, 0xa4, 0xa5, 0xde, 0x22, 0xe6, 0xd7, 0xb8, 0x4f,
+ 0x3e, 0xb8, 0x0b, 0xfe, 0x27, 0xfe, 0x07, 0x6b, 0xaf, 0xed, 0xf0, 0xc9, 0xe1, 0x27, 0xff, 0xc0,
+ 0x15, 0x37, 0x22, 0xf8, 0x4b, 0x28, 0x33, 0xff, 0xfc, 0x4a, 0x3d, 0xff, 0x42, 0xc7, 0xac, 0x23,
+ 0xcf, 0xc6, 0xf9, 0x04, 0x4d, 0x2b, 0x33, 0x47, 0x01, 0xdb, 0xb3, 0x2e, 0xdf, 0xf0, 0xb0, 0xcd,
+ 0x52, 0xf8, 0x07, 0xcc, 0x33, 0x56, 0x3b, 0x57, 0x0e, 0xeb, 0x3c, 0xd3, 0x40, 0x03, 0xf9, 0x0d,
+ 0xc2, 0x20, 0xe0, 0x43, 0xfe, 0x18, 0x1f, 0xdd, 0xf7, 0xfc, 0x86, 0xa3, 0x27, 0xee, 0xe1, 0xea,
+ 0xdd, 0xd1, 0x42, 0x24, 0xe9, 0xee, 0x00, 0xed, 0xef, 0x18, 0x13, 0x00, 0x19, 0x2e, 0xdd, 0xef,
+ 0xf1, 0x0e, 0x18, 0x04, 0x3b, 0x2e, 0xee, 0xdd, 0x96, 0xca, 0x1c, 0xea, 0x11, 0x13, 0xf5, 0x13,
+ 0xd8, 0x07, 0x3c, 0xd5, 0x16, 0xfc, 0x13, 0x37, 0x17, 0xc3, 0x27, 0x33, 0xf5, 0xe3, 0xfd, 0xba,
+ 0xe7, 0xfe, 0x0a, 0xdb, 0x24, 0xea, 0x99, 0xa2, 0xf4, 0xf8, 0x20, 0x07, 0xfe, 0x12, 0xc8, 0xe2,
+ 0x28, 0xf3, 0xdc, 0xf4, 0xe5, 0x81, 0xd6, 0x05, 0xee, 0xd0, 0xcd, 0x3c, 0x3f, 0xe3, 0xc3, 0x0f,
+ 0xc4, 0xf3, 0xca, 0xcb, 0xd7, 0xc2, 0xf5, 0x14, 0x3b, 0x39, 0xfa, 0xfe, 0x00, 0x01, 0x18, 0xf7,
+ 0xf7, 0xd3, 0x10, 0x38, 0x3e, 0x3b, 0x4e, 0x45, 0x00, 0xaf, 0xd6, 0x0d, 0x08, 0x35, 0xdd, 0x0b,
+ 0xea, 0x10, 0x15, 0x04, 0xe4, 0x0b, 0xf8, 0xe0, 0xf8, 0xfe, 0xe7, 0xf0, 0x0d, 0xee, 0x28, 0x2c,
+ 0xe5, 0xea, 0x33, 0x07, 0x04, 0xcb, 0x00, 0x00, 0xe9, 0xe2, 0xec, 0x03, 0x0a, 0x3d, 0xfb, 0xe1,
+ 0x0b, 0xfc, 0x02, 0xd8, 0xc5, 0x7f, 0x22, 0x05, 0x17, 0x07, 0xe6, 0xee, 0xff, 0x02, 0x06, 0x46,
+ 0x27, 0x11, 0x18, 0x0e, 0x09, 0xff, 0xfe, 0x44, 0x21, 0xde, 0x37, 0x43, 0xee, 0x19, 0xfe, 0x0d,
+ 0x07, 0x29, 0x34, 0xf7, 0x13, 0xf1, 0xf2, 0xe0, 0xac, 0x35, 0x33, 0x28, 0x30, 0x05, 0x2a, 0xe6,
+ 0xe7, 0xf2, 0xf3, 0x03, 0xcc, 0xe5, 0x03, 0x00, 0x1c, 0xeb, 0xea, 0xbc, 0xdc, 0xe6, 0x0a, 0xf8,
+ 0x01, 0xee, 0x13, 0x0d, 0x39, 0xf4, 0x81, 0x11, 0xf0, 0x06, 0xe7, 0x8f, 0x25, 0x17, 0xfb, 0x21,
+ 0x02, 0xd9, 0xfc, 0xc8, 0xd0, 0xc5, 0x20, 0x0d, 0x04, 0x0e, 0x38, 0x1d, 0x2f, 0xff, 0x0f, 0xfa,
+ 0xf8, 0x06, 0x1b, 0xf8, 0x15, 0xe8, 0xfc, 0xef, 0x14, 0x2e, 0x05, 0xe3, 0x13, 0x02, 0xd8, 0xff,
+ 0x0b, 0xfe, 0x0f, 0x07, 0x00, 0x31, 0x3c, 0x06, 0xfa, 0xea, 0x03, 0xe7, 0x31, 0x0c, 0x2c, 0x47,
+ 0xf4, 0x03, 0xfb, 0x18, 0xfc, 0xe7, 0x42, 0x11, 0xfa, 0x16, 0x19, 0x0e, 0x15, 0x45, 0x14, 0x22,
+ 0x24, 0x2b, 0xee, 0xf7, 0x2d, 0xf0, 0x0d, 0xe1, 0x07, 0x14, 0xf3, 0xfa, 0x08, 0xf6, 0xff, 0xe5,
+ 0x0f, 0x15, 0xce, 0xfe, 0xf2, 0x14, 0x08, 0xf6, 0x17, 0x24, 0x11, 0xf8, 0xf0, 0xea, 0x16, 0xf4,
+ 0x3a, 0x30, 0x33, 0xd0, 0xf2, 0xf4, 0x81, 0x0c, 0x0e, 0xce, 0x25, 0xee, 0xf3, 0xd2, 0xd9, 0x35,
+ 0xf2, 0x15, 0x03, 0xd5, 0xf0, 0xf6, 0xf8, 0x27, 0xf1, 0x22, 0x23, 0xd7, 0x31, 0xde, 0xcf, 0xfa,
+ 0xf9, 0x1f, 0x23, 0x2e, 0xdd, 0xd5, 0x04, 0x27, 0xd6, 0xff, 0x3f, 0x49, 0xf6, 0x61, 0xd3, 0xd9,
+ 0xe1, 0xa0, 0xaa, 0x0e, 0xe0, 0xd3, 0x1a, 0x17, 0xd1, 0xee, 0x18, 0x18, 0xfe, 0x17, 0xe6, 0x03,
+ 0xc3, 0xf4, 0xa6, 0xa8, 0xaf, 0x22, 0x19, 0xfd, 0x25, 0x45, 0x20, 0xd4, 0xfa, 0x82, 0xd4, 0xf6,
+ 0xc8, 0x24, 0xc0, 0x01, 0x30, 0xe2, 0xf8, 0xf4, 0xeb, 0xcf, 0xd3, 0x02, 0xc7, 0x24, 0x0c, 0x37,
+ 0x00, 0x0e, 0xe1, 0xed, 0x2a, 0x51, 0xe3, 0x29, 0x17, 0xf3, 0x05, 0xd9, 0x21, 0xe6, 0x9a, 0x61,
+ 0x4d, 0x27, 0x1e, 0x32, 0x2e, 0x0c, 0xdf, 0x00, 0x21, 0x0d, 0x0b, 0x39, 0x9b, 0xe8, 0x3b, 0x2b,
+ 0x13, 0x1d, 0xf1, 0x08, 0xed, 0x2d, 0x40, 0xd3, 0x36, 0xb2, 0x29, 0x3c, 0xc1, 0x0a, 0x21, 0x03,
+ 0xf5, 0x14, 0xc7, 0xf3, 0xe7, 0xe7, 0xea, 0xf8, 0x1e, 0x22, 0xee, 0xdd, 0xe8, 0x11, 0xe0, 0xe8,
+ 0xd3, 0x28, 0x02, 0xdd, 0xd8, 0xf7, 0x9f, 0xa7, 0x8c, 0xd6, 0x01, 0xb0, 0xd0, 0xff, 0xfa, 0x51,
+ 0x08, 0x04, 0xae, 0xd7, 0x01, 0x05, 0x00, 0x0c, 0xdb, 0xbe, 0x04, 0xd3, 0x0f, 0xfa, 0x11, 0x69,
+ 0x57, 0xea, 0x03, 0x81, 0x00, 0x09, 0x39, 0x0d, 0xeb, 0xde, 0xc7, 0xd9, 0x04, 0x25, 0xe4, 0x39,
+ 0xc1, 0xf3, 0xcc, 0x3e, 0xf3, 0x07, 0x2f, 0xfb, 0x21, 0x2f, 0xc8, 0xd3, 0x43, 0x81, 0x94, 0xda,
+ 0x17, 0xc8, 0x5e, 0x24, 0xfa, 0x11, 0x24, 0x14, 0xfe, 0xf0, 0x2d, 0xe0, 0xf6, 0xfe, 0xf7, 0xf4,
+ 0x01, 0x22, 0x02, 0x5a, 0xc5, 0xe8, 0x35, 0xc9, 0xfa, 0x29, 0x1d, 0xd5, 0xf7, 0x23, 0x05, 0x27,
+ 0x32, 0xfd, 0x48, 0xff, 0xf6, 0xa6, 0x05, 0x16, 0xd0, 0xfc, 0xe6, 0xf1, 0xc8, 0x0e, 0xdc, 0xcd,
+ 0x11, 0xf8, 0xfa, 0xff, 0xe2, 0x0e, 0x0e, 0xb0, 0x21, 0x30, 0x88, 0xfd, 0x2c, 0xdf, 0xe5, 0xc1,
+ 0xcb, 0x31, 0x22, 0xbf, 0x23, 0xf0, 0xd2, 0xd6, 0x10, 0xbf, 0xab, 0xc1, 0xc4, 0xcc, 0xda, 0xe7,
+ 0xe4, 0xec, 0x0e, 0x0c, 0x2f, 0x0a, 0xea, 0xe3, 0x23, 0xf7, 0xed, 0x11, 0x3c, 0x47, 0xfd, 0x39,
+ 0x75, 0xe2, 0x1f, 0x06, 0xb1, 0xf6, 0xf1, 0xcf, 0x2a, 0xcf, 0xfb, 0xdc, 0xcf, 0x1c, 0x39, 0x2c,
+ 0xf4, 0xab, 0xe2, 0x03, 0xe4, 0xe7, 0xeb, 0x06, 0xf7, 0xdb, 0xef, 0xef, 0xd9, 0xbf, 0xe0, 0x4c,
+ 0x6b, 0x42, 0xf8, 0xfb, 0x2d, 0xf1, 0x0c, 0x0e, 0xcb, 0xf9, 0x01, 0xea, 0xeb, 0xd1, 0x32, 0xef,
+ 0xcc, 0x27, 0xf4, 0x02, 0xf7, 0x1b, 0x54, 0x17, 0x5b, 0x20, 0xdf, 0x04, 0x36, 0x16, 0x2c, 0x37,
+ 0x3b, 0x1e, 0x25, 0x17, 0xfe, 0xeb, 0x03, 0xdf, 0x04, 0xfe, 0x06, 0x0a, 0xfe, 0x02, 0xed, 0x0b,
+ 0x01, 0xf7, 0x42, 0x1f, 0x1a, 0xed, 0x17, 0x40, 0xd4, 0xfd, 0xe7, 0x1d, 0x21, 0x17, 0x1e, 0xf6,
+ 0xe0, 0xf6, 0x13, 0x19, 0xe6, 0xcc, 0x81, 0xe3, 0xef, 0x02, 0xcd, 0x98, 0xb6, 0x18, 0xe5, 0xc0,
+ 0xe5, 0x81, 0xd5, 0x00, 0xe3, 0x29, 0x21, 0x04, 0xcf, 0xf9, 0xf3, 0xe2, 0xf9, 0xdb, 0xd3, 0xc5,
+ 0xe2, 0x04, 0xc1, 0xf4, 0xfd, 0x16, 0xff, 0x10, 0x0b, 0x47, 0x12, 0xe8, 0x0c, 0x06, 0x13, 0xbc,
+ 0xee, 0xed, 0x06, 0x07, 0x00, 0xf4, 0xc0, 0xd0, 0x04, 0xc7, 0xc5, 0xf1, 0xef, 0x4c, 0x35, 0xd5,
+ 0x2b, 0x03, 0xfe, 0x06, 0xc9, 0xda, 0x4f, 0x3e, 0xde, 0x24, 0x09, 0x06, 0x09, 0xdc, 0x0e, 0x24,
+ 0x3e, 0x0c, 0x4a, 0x0c, 0x02, 0x2f, 0x05, 0x26, 0xf2, 0xe9, 0xad, 0x1b, 0xe4, 0xf5, 0x16, 0xea,
+ 0xdf, 0x45, 0x1b, 0x07, 0x20, 0x21, 0xf6, 0xf2, 0xf5, 0xd9, 0xd1, 0xf4, 0xc4, 0xe3, 0xe8, 0x12,
+ 0x05, 0xd0, 0x0b, 0xbd, 0xef, 0xbd, 0xe7, 0x20, 0xe8, 0x18, 0x1f, 0x38, 0xb7, 0x42, 0x6a, 0x05,
+ 0x20, 0x19, 0xce, 0xaa, 0x81, 0x08, 0x4b, 0xfa, 0x0a, 0x0c, 0xda, 0x0e, 0x2c, 0x17, 0x13, 0x41,
+ 0x4d, 0xf3, 0x1b, 0xe6, 0xef, 0xe3, 0x12, 0x3e, 0x24, 0x3f, 0x05, 0x01, 0x1c, 0xfe, 0xc5, 0xea,
+ 0xc6, 0xc6, 0x24, 0x06, 0xe5, 0xe2, 0x60, 0xf6, 0xca, 0xfa, 0xf7, 0xf4, 0x26, 0x39, 0x32, 0xe3,
+ 0x34, 0x02, 0xd9, 0x25, 0x28, 0xdc, 0x02, 0x07, 0xc0, 0xa8, 0xed, 0x27, 0x6a, 0xe9, 0x32, 0x36,
+ 0xf6, 0xf4, 0x06, 0xe4, 0x20, 0x20, 0xe3, 0x01, 0x01, 0xf9, 0xe4, 0xaf, 0xcd, 0x0e, 0x4a, 0x42,
+ 0xca, 0x21, 0x22, 0xf3, 0xf5, 0x00, 0x21, 0x00, 0xfa, 0x0f, 0xd3, 0xe7, 0x20, 0x03, 0x16, 0x2b,
+ 0xd2, 0x89, 0x10, 0xa2, 0xc9, 0xf6, 0xdf, 0xd3, 0x0f, 0x06, 0xa1, 0xee, 0xaf, 0x30, 0x4d, 0x35,
+ 0x7e, 0x1c, 0xb5, 0xf5, 0xf8, 0xf3, 0xe2, 0xde, 0x40, 0x1c, 0x4e, 0x23, 0xd8, 0x12, 0xd1, 0xe5,
+ 0x0e, 0xed, 0x09, 0xf1, 0x21, 0x28, 0xef, 0x05, 0x18, 0x14, 0x01, 0x01, 0xcf, 0xf1, 0x1c, 0xf6,
+ 0xf9, 0x11, 0x03, 0x1a, 0x29, 0x1f, 0x15, 0xb5, 0x41, 0x25, 0xfb, 0xe9, 0x18, 0x4e, 0x5e, 0x19,
+ 0xf8, 0xf8, 0x7f, 0xf6, 0xe7, 0x05, 0x38, 0xf1, 0xbe, 0xd9, 0x26, 0x2e, 0x51, 0x09, 0x3c, 0x1a,
+ 0x5b, 0x0d, 0xfd, 0x04, 0x68, 0x49, 0xce, 0x39, 0x7e, 0x23, 0x17, 0xaa, 0x32, 0x15, 0xd6, 0x18,
+ 0x11, 0xda, 0x97, 0xf4, 0x6e, 0x2d, 0xe4, 0xc9, 0x16, 0x06, 0x02, 0x07, 0xb1, 0xcb, 0x0f, 0xe6,
+ 0xec, 0x11, 0x20, 0x20, 0xf0, 0xcf, 0xf2, 0x4a, 0xd6, 0xf8, 0xe3, 0x11, 0x3b, 0x15, 0xbb, 0xde,
+ 0x2a, 0x0c, 0x10, 0x3d, 0x17, 0xef, 0xf0, 0x02, 0xd4, 0xe4, 0xca, 0xde, 0xa0, 0xb7, 0xe7, 0xf0,
+ 0xf8, 0xda, 0x0f, 0x5c, 0x0e, 0xe4, 0xec, 0x37, 0xd4, 0xf9, 0xee, 0x31, 0x10, 0xdc, 0xf6, 0xca,
+ 0xe5, 0x33, 0xc6, 0xaf, 0xf1, 0x0a, 0xd3, 0x46, 0x24, 0x0b, 0x18, 0x2e, 0x81, 0x26, 0x3e, 0x2e,
+ 0x47, 0x5f, 0xf0, 0x02, 0x34, 0xef, 0x02, 0x01, 0xd0, 0x35, 0x4f, 0x20, 0xbb, 0xff, 0xf0, 0xfd,
+ 0xaf, 0x0e, 0x3b, 0x09, 0x0b, 0x21, 0xde, 0xfa, 0x0d, 0xff, 0x0c, 0x14, 0x08, 0xfe, 0x01, 0x05,
+ 0x11, 0x40, 0x34, 0xff, 0xdd, 0xdd, 0xee, 0x0f, 0xea, 0xc3, 0x33, 0xe1, 0xd3, 0x2d, 0x0a, 0xc9,
+ 0x63, 0xf9, 0xc5, 0x81, 0x1d, 0xb1, 0xaa, 0xec, 0x01, 0xe7, 0xe4, 0xb8, 0x03, 0x20, 0x4f, 0x05,
+ 0x6d, 0x23, 0x2b, 0x3b, 0x20, 0xf9, 0x26, 0x17, 0xe8, 0xfe, 0x01, 0x31, 0xa8, 0xd3, 0xf8, 0xf3,
+ 0x14, 0x12, 0xe5, 0x0f, 0x31, 0xcc, 0x06, 0x16, 0x0d, 0x17, 0x0c, 0xe4, 0xf1, 0x3c, 0x46, 0xa5,
+ 0xde, 0xdd, 0xf6, 0xf5, 0xd5, 0x16, 0x59, 0x66, 0x1d, 0xf4, 0xd6, 0xc0, 0xbd, 0xe1, 0xdc, 0x16,
+ 0xa8, 0x87, 0xdb, 0xb5, 0x05, 0xed, 0xa5, 0xfe, 0x31, 0x49, 0xba, 0xfb, 0x2b, 0xd7, 0x94, 0xc4,
+ 0xc8, 0x68, 0xe9, 0xc8, 0x14, 0xe8, 0xdf, 0x04, 0xc5, 0xb1, 0xf4, 0xdb, 0x4b, 0xfc, 0xf8, 0x08,
+ 0xf3, 0x2f, 0xf9, 0x39, 0xa4, 0xdc, 0xfa, 0x04, 0x70, 0xdb, 0xfa, 0x18, 0x1a, 0x32, 0xd2, 0x17,
+ 0xfb, 0xcf, 0x42, 0x11, 0x03, 0x37, 0x1a, 0x15, 0x22, 0x0d, 0x27, 0x09, 0xfc, 0x02, 0x44, 0x27,
+ 0x18, 0x3c, 0x1b, 0x04, 0x00, 0x36, 0xdc, 0xd9, 0xef, 0x0a, 0xe5, 0x2a, 0x06, 0xe5, 0xcc, 0x01,
+ 0x4d, 0x17, 0xbe, 0x1a, 0xe6, 0xf0, 0x03, 0xe7, 0xd6, 0x36, 0xe9, 0xe6, 0x34, 0xe5, 0xf5, 0xc8,
+ 0x02, 0x35, 0x62, 0x1a, 0xfd, 0xd3, 0xc6, 0xd0, 0xe1, 0xf5, 0xbd, 0xeb, 0xe8, 0xf6, 0x0d, 0x27,
+ 0x0d, 0xcc, 0xf1, 0xf8, 0x0c, 0xf1, 0x8a, 0xdf, 0xe7, 0x00, 0xd2, 0xf1, 0x81, 0x25, 0x28, 0x30,
+ 0x3b, 0x09, 0x32, 0xd8, 0xbe, 0xe4, 0xfe, 0xe9, 0xa7, 0xeb, 0xd6, 0xd4, 0x37, 0x1a, 0xd2, 0xd5,
+ 0xf8, 0x03, 0xd5, 0x30, 0x0c, 0xe8, 0xd4, 0xd1, 0xb0, 0x8c, 0xff, 0xff, 0xb7, 0xca, 0xfe, 0xff,
+ 0x45, 0xa6, 0xfe, 0xff, 0xa1, 0xa2, 0x00, 0x00, 0xe8, 0x58, 0x00, 0x00, 0xbe, 0x47, 0xff, 0xff,
+ 0x1a, 0x5a, 0x00, 0x00, 0xa3, 0xbe, 0x00, 0x00, 0x7c, 0xed, 0xfe, 0xff, 0xcd, 0x5f, 0xff, 0xff,
+ 0x38, 0x5f, 0xff, 0xff, 0x61, 0xdf, 0xff, 0xff, 0x1f, 0x25, 0xff, 0xff, 0x91, 0x29, 0x00, 0x00,
+ 0x3b, 0xca, 0x01, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x1d, 0xdb, 0xfe, 0xff, 0x23, 0x6b, 0xff, 0xff,
+ 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x12, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x12, 0x00,
+ 0x78, 0x24, 0x2f, 0x3d, 0x80, 0xff, 0xff, 0xff, 0x16, 0x74, 0x8c, 0x3c, 0x80, 0xff, 0xff, 0xff,
+ 0x02, 0x00, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x08, 0x00, 0x00,
+ 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0a, 0x00,
+ 0x16, 0x74, 0x8c, 0x3c, 0x80, 0xff, 0xff, 0xff, 0x6e, 0x60, 0x03, 0x3e, 0x22, 0x00, 0x00, 0x00,
+ 0x40, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xcf, 0x52, 0x60, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0xe8, 0x39, 0xbc, 0x88, 0xf2, 0x4d, 0xd2,
+ 0x25, 0xed, 0x4a, 0x4a, 0xdc, 0x4b, 0xc1, 0x96, 0x05, 0xd3, 0xbe, 0xab, 0x3c, 0x3b, 0xc2, 0xa5,
+ 0xd5, 0xae, 0x38, 0x4e, 0xe1, 0x41, 0xc6, 0xa5, 0x0a, 0x36, 0xc1, 0xf5, 0xa5, 0xaf, 0x25, 0xd6,
+ 0xc8, 0x2c, 0x52, 0x10, 0xc2, 0x13, 0xbf, 0xcf, 0x4e, 0xcb, 0x41, 0x14, 0x40, 0xe5, 0x44, 0xed,
+ 0x81, 0xec, 0xe8, 0xaf, 0x33, 0x2f, 0x1e, 0xb1, 0xa9, 0x3e, 0x4f, 0xd4, 0xf7, 0x43, 0x9b, 0xd5,
+ 0x03, 0xff, 0x40, 0xa9, 0x50, 0x05, 0xa4, 0x98, 0x5b, 0xc6, 0x11, 0x9a, 0xb8, 0xeb, 0xd5, 0x41,
+ 0x43, 0xed, 0x4d, 0xd9, 0xd5, 0x4a, 0xd0, 0x25, 0xd0, 0x51, 0xba, 0xce, 0x45, 0x19, 0x9b, 0xcd,
+ 0x20, 0x01, 0xf5, 0x9e, 0xb4, 0x4d, 0x3d, 0x32, 0xa4, 0x60, 0x94, 0xc4, 0xd6, 0xf3, 0x3c, 0xb1,
+ 0x32, 0xda, 0xb2, 0xf8, 0xb2, 0xa1, 0xd4, 0xa3, 0x00, 0x45, 0x3a, 0x90, 0x09, 0xcd, 0xc1, 0xc5,
+ 0xbe, 0x37, 0xe0, 0x38, 0x2f, 0xdb, 0x3f, 0x35, 0x3c, 0x19, 0xbf, 0x1f, 0xbb, 0xf1, 0x27, 0xfb,
+ 0xf2, 0x46, 0x16, 0xb7, 0x05, 0xf0, 0xae, 0xa1, 0xf0, 0x5d, 0x22, 0x51, 0xb4, 0xb6, 0x39, 0xf0,
+ 0xc7, 0x14, 0xb2, 0x09, 0xaf, 0x02, 0xb1, 0x5a, 0xea, 0x36, 0xe2, 0xe9, 0x00, 0x00, 0x00, 0x00,
+ 0x7c, 0x91, 0xff, 0xff, 0xfb, 0x69, 0xff, 0xff, 0x34, 0xcc, 0xff, 0xff, 0xd7, 0x8c, 0xff, 0xff,
+ 0x92, 0x98, 0xff, 0xff, 0xc0, 0xae, 0xff, 0xff, 0x85, 0x45, 0xff, 0xff, 0x5f, 0xb1, 0xff, 0xff,
+ 0x46, 0xcc, 0xff, 0xff, 0x26, 0xa6, 0xff, 0xff, 0x03, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00,
+ 0x48, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0a, 0x00,
+ 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x6e, 0x60, 0x03, 0x3e, 0x22, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x3b, 0x80, 0xff, 0xff, 0xff,
};
+
+#endif
diff --git a/examples/mnist_cnn/mnist_cnn_int8.tflite b/examples/mnist_cnn/mnist_cnn_int8.tflite
new file mode 100644
index 0000000..d7131de
Binary files /dev/null and b/examples/mnist_cnn/mnist_cnn_int8.tflite differ
diff --git a/examples/mnist_cnn/mnist_cnn_int8.tmdl b/examples/mnist_cnn/mnist_cnn_int8.tmdl
new file mode 100644
index 0000000..46d4f77
Binary files /dev/null and b/examples/mnist_cnn/mnist_cnn_int8.tmdl differ
diff --git a/examples/mnist_cnn/mnist_cnn_run.py b/examples/mnist_cnn/mnist_cnn_run.py
index 92700e5..1340970 100644
--- a/examples/mnist_cnn/mnist_cnn_run.py
+++ b/examples/mnist_cnn/mnist_cnn_run.py
@@ -4,9 +4,9 @@
import time
import gc
-import emlearn_cnn
+import emlearn_cnn_int8
-MODEL = 'mnist_cnn.tmdl'
+MODEL = 'mnist_cnn_int8.tmdl'
TEST_DATA_DIR = 'test_data'
def argmax(arr):
diff --git a/examples/mnist_cnn/mnist_train.py b/examples/mnist_cnn/mnist_train.py
index c1a7b74..ef96cfc 100644
--- a/examples/mnist_cnn/mnist_train.py
+++ b/examples/mnist_cnn/mnist_train.py
@@ -86,6 +86,7 @@ def generate_test_files(out_dir, x, y, samples_per_class=5):
def generate_tinymaix_model(h5_file,
+ out_file : str,
input_shape : tuple[int],
output_shape : tuple[int],
tools_dir,
@@ -99,7 +100,7 @@ def generate_tinymaix_model(h5_file,
# Convert .h5 to .tflite file
assert h5_file.endswith('.h5'), 'Keras model HDF5 file must end with .h5'
- tflite_file = h5_file.replace('.h5', '.tflite')
+ tflite_file = out_file + '.tflite'
args = [
python_bin,
@@ -157,26 +158,26 @@ def main():
tinymaix_tools_dir = '../../dependencies/TinyMaix/tools'
assert os.path.exists(tinymaix_tools_dir), tinymaix_tools_dir
- quantize_data = None # disables quantization
- quantize_data = os.path.join(tinymaix_tools_dir, 'quant_img_mnist/')
- if quantize_data is not None:
- assert os.path.exists(quantize_data)
- precision = 'int8' if quantize_data else 'fp32'
-
# Run training
train_mnist(h5_file)
- #data = x_test[1]
-
# Export the model using TinyMaix
- out = generate_tinymaix_model(h5_file,
- input_shape=(28,28,1),
- output_shape=(1,),
- tools_dir=tinymaix_tools_dir,
- precision=precision,
- quantize_data=quantize_data,
- )
- print('Wrote model to', out)
+ # both with quantization and without
+ for config in ('int8', 'fp32'):
+ if config == 'int8':
+ quantize_data = os.path.join(tinymaix_tools_dir, 'quant_img_mnist/')
+ else:
+ quantize_data = None # disables quantization
+
+ out = generate_tinymaix_model(h5_file,
+ out_file=h5_file.replace('.h5', '')+f'_{config}',
+ input_shape=(28,28,1),
+ output_shape=(1,),
+ tools_dir=tinymaix_tools_dir,
+ precision=config,
+ quantize_data=quantize_data,
+ )
+ print('Wrote model to', out)
if __name__ == '__main__':
main()
diff --git a/examples/mnist_cnn/package.json b/examples/mnist_cnn/package.json
index 54e7dba..2b42079 100644
--- a/examples/mnist_cnn/package.json
+++ b/examples/mnist_cnn/package.json
@@ -7,7 +7,8 @@
"readme": "github:emlearn/emlearn-micropython/blob/master/examples/mnist_cnn/README.md",
"keywords": "machinelearning,cnn,convolutionalneuralnetwork,classification,mnist,digits",
"urls": [
- ["fs:mnist_cnn.tmdl", "mnist_cnn.tmdl"],
+ ["fs:mnist_cnn_int8.tmdl", "mnist_cnn_int8.tmdl"],
+ ["fs:mnist_cnn_fp32.tmdl", "mnist_cnn_fp32.tmdl"],
["fs:data/mnist_example_0.bin", "data/mnist_example_0.bin"],
["fs:data/mnist_example_1.bin", "data/mnist_example_1.bin"],
["fs:data/mnist_example_2.bin", "data/mnist_example_2.bin"],
diff --git a/examples/xor_trees/xor_run.py b/examples/xor_trees/xor_run.py
index 5d220cf..c9e630f 100644
--- a/examples/xor_trees/xor_run.py
+++ b/examples/xor_trees/xor_run.py
@@ -3,6 +3,16 @@
import emlearn_trees
import array
+def argmax(arr):
+ idx_max = 0
+ value_max = arr[0]
+ for i in range(1, len(arr)):
+ if arr[i] > value_max:
+ value_max = arr[i]
+ idx_max = i
+
+ return idx_max
+
model = emlearn_trees.new(5, 30, 2)
# Load a CSV file with the model
@@ -18,7 +28,9 @@
array.array('h', [max_val, 0]),
]
-for ex in examples:
- result = model.predict(ex)
+out = array.array('f', range(model.outputs()))
+for ex in examples:
+ model.predict(ex, out)
+ result = argmax(out)
print(ex, result)
diff --git a/requirements.dev.txt b/requirements.dev.txt
new file mode 100644
index 0000000..d33d003
--- /dev/null
+++ b/requirements.dev.txt
@@ -0,0 +1,6 @@
+sphinx>=4.0.0
+recommonmark>=0.6.0
+sphinx_rtd_theme>=0.5.2
+sphinx-gallery>=0.10.1
+sphinx-autodoc-typehints>=3.0.1
+myst_parser>=4.0.0
diff --git a/requirements.txt b/requirements.txt
index 5d13c4b..3a89384 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,4 @@
-emlearn>=0.21.0
+emlearn>=0.21.2
scikit-learn>=1.0.0
ar>=1.0.0
pyelftools>=0.31
diff --git a/src/emlearn_arrayutils/Makefile b/src/emlearn_arrayutils/Makefile
index f125341..4df8c14 100644
--- a/src/emlearn_arrayutils/Makefile
+++ b/src/emlearn_arrayutils/Makefile
@@ -9,39 +9,15 @@ MPY_ABI_VERSION := 6.3
DIST_DIR := ../../dist/$(ARCH)_$(MPY_ABI_VERSION)
+# enable linking of libm etc
+LINK_RUNTIME=1
+
# Name of module
MOD = emlearn_arrayutils
# Source files (.c or .py)
SRC = modarrayutils.c
-# Stuff to make soft-float work
-# If symbols are undefined, use tools/find_symbols.py to locate object files to add
-SOFTFP_O :=
-SOFTFP_ENABLE := 0
-
-ARM_SOFTFP_O := _arm_cmpsf2.o lesf2.o divsf3.o _thumb1_case_uqi.o _arm_fixsfsi.o floatsisf.o fixsfsi.o eqsf2.o gesf2.o addsf3.o mulsf3.o subsf3.o _clzsi2.o _udivsi3.o
-ARM_SOFTFP_O += _arm_muldivsf3.o _arm_addsubsf3.o
-
-ifeq ($(ARCH), xtensawin)
- SOFTFP_O += _divsf3.o _ashrdi3.o
- SOFTFP_ENABLE=1
-endif
-
-ifeq ($(ARCH), armv6m)
- SOFTFP_O += $(ARM_SOFTFP_O)
- SOFTFP_ENABLE=1
-endif
-ifeq ($(ARCH), armv7m)
- SOFTFP_O += $(ARM_SOFTFP_O)
- SOFTFP_ENABLE=1
-endif
-
-ifeq ($(SOFTFP_ENABLE), 1)
- SRC_O += $(SOFTFP_O)
- #CLEAN_EXTRA += $(SOFTFP_O)
-endif
-
# Releases
DIST_FILE = $(DIST_DIR)/$(MOD).mpy
$(DIST_DIR):
@@ -53,17 +29,6 @@ $(DIST_FILE): $(MOD).mpy $(DIST_DIR)
# Include to get the rules for compiling and linking the module
include $(MPY_DIR)/py/dynruntime.mk
-# CROSS is defined by the included
-LIBGCC_FILENAME = $(shell $(CROSS)gcc $(CFLAGS) -print-libgcc-file-name)
-$(info $(LIBGCC_FILENAME))
-
CFLAGS += -I$(CMSIS_DSP_DIR)/Include
-_arm_cmpsf2.o:
- $(CROSS)ar -x $(LIBGCC_FILENAME) $(SOFTFP_O)
-
-_divsf3.o:
- $(CROSS)ar -x $(LIBGCC_FILENAME) $(SOFTFP_O)
-
-
dist: $(DIST_FILE)
diff --git a/src/emlearn_arrayutils/micropython.cmake b/src/emlearn_arrayutils/micropython.cmake
new file mode 100644
index 0000000..8d76791
--- /dev/null
+++ b/src/emlearn_arrayutils/micropython.cmake
@@ -0,0 +1,17 @@
+add_library(usermod_emlearn_arrayutils INTERFACE)
+
+execute_process(
+ COMMAND python3 -c "import emlearn; print(emlearn.includedir)"
+ OUTPUT_VARIABLE EMLEARN_DIR
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+target_sources(usermod_emlearn_arrayutils INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/modarrayutils.c
+)
+
+target_include_directories(usermod_emlearn_arrayutils INTERFACE
+ ${EMLEARN_DIR}
+)
+
+target_link_libraries(usermod INTERFACE usermod_emlearn_arrayutils)
diff --git a/src/emlearn_arrayutils/micropython.mk b/src/emlearn_arrayutils/micropython.mk
new file mode 100644
index 0000000..03746a2
--- /dev/null
+++ b/src/emlearn_arrayutils/micropython.mk
@@ -0,0 +1,9 @@
+MOD_DIR := $(USERMOD_DIR)
+
+# Add all C files to SRC_USERMOD.
+SRC_USERMOD_C += $(MOD_DIR)/modarrayutils.c
+
+EMLEARN_DIR := $(shell python3 -c "import emlearn; print(emlearn.includedir)")
+
+# We can add our module folder to include paths if needed
+# CFLAGS_USERMOD += -I$(EMLEARN_DIR)
diff --git a/src/emlearn_arrayutils/modarrayutils.c b/src/emlearn_arrayutils/modarrayutils.c
index f6f2861..b472ffa 100644
--- a/src/emlearn_arrayutils/modarrayutils.c
+++ b/src/emlearn_arrayutils/modarrayutils.c
@@ -1,8 +1,13 @@
// Include the header file to get access to the MicroPython API
+#ifdef MICROPY_ENABLE_DYNRUNTIME
#include "py/dynruntime.h"
+#else
+#include "py/runtime.h"
+#endif
#include
+#ifdef MICROPY_ENABLE_DYNRUNTIME
// memset is used by some standard C constructs
#if !defined(__linux__)
void *memcpy(void *dst, const void *src, size_t n) {
@@ -11,25 +16,8 @@ void *memcpy(void *dst, const void *src, size_t n) {
void *memset(void *s, int c, size_t n) {
return mp_fun_table.memset_(s, c, n);
}
-
-void NORETURN abort() {
- while (1) {
- ;
- }
-}
-
-int
-__aeabi_idiv0(int return_value) {
- return return_value;
-}
-
-long long
-__aeabi_ldiv0(long long return_value) {
- return return_value;
-}
-
#endif
-
+#endif
#define MAP_LINEAR(x, in_min, in_max, out_min, out_max) do { \
@@ -115,7 +103,7 @@ arrayutils_linear_map(size_t n_args, const mp_obj_t *args) {
const float *in = in_bufinfo.buf;
int16_t *out = out_bufinfo.buf;
for (int i=0; i
@@ -7,6 +11,7 @@
#define DEBUG (0)
+#ifdef MICROPY_ENABLE_DYNRUNTIME
// memset is used by some standard C constructs
#if !defined(__linux__)
void *memcpy(void *dst, const void *src, size_t n) {
@@ -15,19 +20,8 @@ void *memcpy(void *dst, const void *src, size_t n) {
void *memset(void *s, int c, size_t n) {
return mp_fun_table.memset_(s, c, n);
}
-
-void NORETURN abort() {
- while (1) {
- ;
- }
-}
#endif
-
-int
-__aeabi_idiv0(int return_value) {
- return return_value;
-}
-
+#endif
// Copy of eml_fft.h, without eml_fft_fill
// - contains sin/cos that trips up mpy_ld.py (even if the function is not used)
@@ -83,9 +77,12 @@ fft_forward(float *table_sin, float *table_cos, float real[], float imag[], size
}
-
// MicroPython type for EmlFFT
-mp_obj_full_type_t mp_fft_type;
+#if MICROPY_ENABLE_DYNRUNTIME
+mp_obj_full_type_t fft_type;
+#else
+static const mp_obj_type_t fft_type;
+#endif
typedef struct _mp_obj_fft_t {
mp_obj_base_t base;
@@ -239,6 +236,8 @@ static mp_obj_t fft_run(mp_obj_t self_obj, mp_obj_t real_obj, mp_obj_t imag_obj)
static MP_DEFINE_CONST_FUN_OBJ_3(fft_run_obj, fft_run);
+
+#ifdef MICROPY_ENABLE_DYNRUNTIME
mp_map_elem_t mod_locals_dit_table[3];
static MP_DEFINE_CONST_DICT(mod_locals_dit, mod_locals_dit_table);
@@ -251,21 +250,54 @@ mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *a
mp_printf(&mp_plat_print, "fft-mpy-init\n");
#endif
- mp_fft_type.base.type = (void*)&mp_type_type;
- mp_fft_type.flags = MP_TYPE_FLAG_NONE;
- mp_fft_type.name = MP_QSTR_FFT;
- MP_OBJ_TYPE_SET_SLOT(&mp_fft_type, make_new, fft_new, 0);
+ fft_type.base.type = (void*)&mp_type_type;
+ fft_type.flags = MP_TYPE_FLAG_NONE;
+ fft_type.name = MP_QSTR_FFT;
+ MP_OBJ_TYPE_SET_SLOT(&fft_type, make_new, fft_new, 0);
// methods
mod_locals_dit_table[0] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_run), MP_OBJ_FROM_PTR(&fft_run_obj) };
mod_locals_dit_table[1] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR___del__), MP_OBJ_FROM_PTR(&fft_del_obj) };
mod_locals_dit_table[2] = (mp_map_elem_t){ MP_OBJ_NEW_QSTR(MP_QSTR_fill), MP_OBJ_FROM_PTR(&fft_fill_obj) };
- MP_OBJ_TYPE_SET_SLOT(&mp_fft_type, locals_dict, (void*)&mod_locals_dit, 3);
+ MP_OBJ_TYPE_SET_SLOT(&fft_type, locals_dict, (void*)&mod_locals_dit, 3);
// Make the Factorial type available on the module.
- mp_store_global(MP_QSTR_FFT, MP_OBJ_FROM_PTR(&mp_fft_type));
+ mp_store_global(MP_QSTR_FFT, MP_OBJ_FROM_PTR(&fft_type));
// This must be last, it restores the globals dict
MP_DYNRUNTIME_INIT_EXIT
}
+#else // extmod
+
+// Define a class
+static const mp_rom_map_elem_t emlearn_fft_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_run), MP_ROM_PTR(&fft_run_obj) },
+ { MP_ROM_QSTR(MP_QSTR_fill), MP_ROM_PTR(&fft_fill_obj) },
+ { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&fft_del_obj) }
+};
+static MP_DEFINE_CONST_DICT(emlearn_fft_locals_dict, emlearn_fft_locals_dict_table);
+
+
+static MP_DEFINE_CONST_OBJ_TYPE(
+ fft_type,
+ MP_QSTR_emlfft,
+ MP_TYPE_FLAG_NONE,
+ make_new, fft_new,
+ locals_dict, &emlearn_fft_locals_dict
+);
+
+// Define module object.
+static const mp_rom_map_elem_t emlearn_fft_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_FFT), MP_ROM_PTR(&fft_type) }
+};
+static MP_DEFINE_CONST_DICT(emlearn_fft_globals, emlearn_fft_globals_table);
+
+const mp_obj_module_t emlearn_fft_cmodule = {
+ .base = { &mp_type_module },
+ .globals = (mp_obj_dict_t *)&emlearn_fft_globals,
+};
+
+MP_REGISTER_MODULE(MP_QSTR_emlearn_fft_c, emlearn_fft_cmodule);
+#endif
+
diff --git a/src/emlearn_fft/micropython.cmake b/src/emlearn_fft/micropython.cmake
new file mode 100644
index 0000000..404c559
--- /dev/null
+++ b/src/emlearn_fft/micropython.cmake
@@ -0,0 +1,17 @@
+add_library(usermod_emlearn_fft INTERFACE)
+
+execute_process(
+ COMMAND python3 -c "import emlearn; print(emlearn.includedir)"
+ OUTPUT_VARIABLE EMLEARN_DIR
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+target_sources(usermod_emlearn_fft INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/fft.c
+)
+
+target_include_directories(usermod_emlearn_fft INTERFACE
+ ${EMLEARN_DIR}
+)
+
+target_link_libraries(usermod INTERFACE usermod_emlearn_fft)
diff --git a/src/emlearn_fft/micropython.mk b/src/emlearn_fft/micropython.mk
new file mode 100644
index 0000000..c1bfd9a
--- /dev/null
+++ b/src/emlearn_fft/micropython.mk
@@ -0,0 +1,9 @@
+MOD_DIR := $(USERMOD_DIR)
+
+# Add all C files to SRC_USERMOD.
+SRC_USERMOD_C += $(MOD_DIR)/fft.c
+
+EMLEARN_DIR := $(shell python3 -c "import emlearn; print(emlearn.includedir)")
+
+# We can add our module folder to include paths if needed
+CFLAGS_USERMOD += -I$(EMLEARN_DIR)
diff --git a/src/emlearn_iir/Makefile b/src/emlearn_iir/Makefile
index 96b57a6..5160c7d 100644
--- a/src/emlearn_iir/Makefile
+++ b/src/emlearn_iir/Makefile
@@ -10,6 +10,8 @@ MPY_ABI_VERSION := 6.3
# Location of emlearn library
EMLEARN_DIR := $(shell python3 -c "import emlearn; print(emlearn.includedir)")
+# enable linking of libm etc
+LINK_RUNTIME=1
DIST_DIR := ../../dist/$(ARCH)_$(MPY_ABI_VERSION)
@@ -19,23 +21,6 @@ MOD = emlearn_iir
# Source files (.c or .py)
SRC = iir_filter.c
-# Stuff to make soft-float work
-# If symbols are undefined, use tools/find_symbols.py to locate object files to add
-SOFTFP_O := _arm_cmpsf2.o lesf2.o _arm_fixsfsi.o fixsfsi.o eqsf2.o gesf2.o addsf3.o mulsf3.o subsf3.o _clzsi2.o divdf3.o
-SOFTFP_O += _dvmd_tls.o _aeabi_uldivmod.o _aeabi_ldivmod.o _divsi3.o _udivsi3.o _modsi3.o _umodsi3.o _thumb1_case_uhi.o _udivmoddi4.o bpabi.o _clzdi2.o _ashldi3.o _lshrdi3.o _muldi3.o _divdi3.o _arm_muldivsf3.o _arm_addsubsf3.o
-SOFTFP_ENABLE := 0
-ifeq ($(ARCH), armv6m)
- SOFTFP_ENABLE=1
-endif
-ifeq ($(ARCH), armv7m)
- SOFTFP_ENABLE=1
-endif
-
-ifeq ($(SOFTFP_ENABLE), 1)
- SRC_O += $(SOFTFP_O)
- #CLEAN_EXTRA += $(SOFTFP_O)
-endif
-
# Releases
DIST_FILE = $(DIST_DIR)/$(MOD).mpy
$(DIST_DIR):
@@ -47,13 +32,6 @@ $(DIST_FILE): $(MOD).mpy $(DIST_DIR)
# Include to get the rules for compiling and linking the module
include $(MPY_DIR)/py/dynruntime.mk
-# CROSS is defined by the included
-LIBGCC_FILENAME = $(shell $(CROSS)gcc $(CFLAGS) -print-libgcc-file-name)
-$(info $(LIBGCC_FILENAME))
-
-_arm_cmpsf2.o:
- $(CROSS)ar -x $(LIBGCC_FILENAME) $(SOFTFP_O)
-
-CFLAGS += -I$(EMLEARN_DIR)
+CFLAGS += -I$(EMLEARN_DIR) -Wno-unused-function
dist: $(DIST_FILE)
diff --git a/src/emlearn_iir/iir_filter.c b/src/emlearn_iir/iir_filter.c
index 7946675..bf67f00 100644
--- a/src/emlearn_iir/iir_filter.c
+++ b/src/emlearn_iir/iir_filter.c
@@ -1,10 +1,15 @@
// Include the header file to get access to the MicroPython API
+#ifdef MICROPY_ENABLE_DYNRUNTIME
#include "py/dynruntime.h"
+#else
+#include "py/runtime.h"
+#endif
#include
#include
+#ifdef MICROPY_ENABLE_DYNRUNTIME
// memset is used by some standard C constructs
#if !defined(__linux__)
void *memcpy(void *dst, const void *src, size_t n) {
@@ -19,19 +24,8 @@ void NORETURN abort() {
;
}
}
-
-int
-__aeabi_idiv0(int return_value) {
- return return_value;
-}
-
-long long
-__aeabi_ldiv0(long long return_value) {
- return return_value;
-}
-
#endif
-
+#endif
// MicroPython type for EmlIIR
@@ -40,7 +34,11 @@ typedef struct _mp_obj_iir_filter_t {
EmlIIR filter;
} mp_obj_iir_filter_t;
+#if MICROPY_ENABLE_DYNRUNTIME
mp_obj_full_type_t iir_filter_type;
+#else
+static const mp_obj_type_t iir_filter_type;
+#endif
// Create a new instance
static mp_obj_t iir_filter_new(mp_obj_t array_obj) {
@@ -66,17 +64,17 @@ static mp_obj_t iir_filter_new(mp_obj_t array_obj) {
self->n_stages = n_values / 6;
self->states_length = self->n_stages * 4;
- self->states = (float *)m_malloc(sizeof(float)*self->states_length);
+ self->states = m_new(float, self->states_length);
self->coefficients_length = n_values;
- self->coefficients = (float *)m_malloc(sizeof(float)*self->coefficients_length);
+ self->coefficients = m_new(float, self->coefficients_length);
memcpy((float *)self->coefficients, values, sizeof(float)*self->coefficients_length);
const EmlError err = eml_iir_check(*self);
if (err != EmlOk) {
- m_free(self->states);
- m_free((float *)self->coefficients);
+ m_del(float, self->states, self->states_length);
+ m_del(float, (float *)self->coefficients, self->coefficients_length);
mp_raise_ValueError(MP_ERROR_TEXT("EmlError"));
}
@@ -91,9 +89,8 @@ static mp_obj_t iir_filter_del(mp_obj_t self_obj) {
EmlIIR *self = &o->filter;
// free allocated data
- m_free(self->states);
- m_free((float *)self->coefficients);
-
+ m_del(float, self->states, self->states_length);
+ m_del(float, (float *)self->coefficients, self->coefficients_length);
return mp_const_none;
}
@@ -125,6 +122,7 @@ static mp_obj_t iir_filter_run(mp_obj_t self_obj, mp_obj_t array_obj) {
static MP_DEFINE_CONST_FUN_OBJ_2(iir_filter_run_obj, iir_filter_run);
+#ifdef MICROPY_ENABLE_DYNRUNTIME
mp_map_elem_t iir_locals_dict_table[2];
static MP_DEFINE_CONST_DICT(iir_locals_dict, iir_locals_dict_table);
@@ -147,4 +145,35 @@ mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *a
// This must be last, it restores the globals dict
MP_DYNRUNTIME_INIT_EXIT
}
+#else
+
+
+// Define a class
+static const mp_rom_map_elem_t emlearn_iir_filter_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_run), MP_ROM_PTR(&iir_filter_run_obj) },
+ { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&iir_filter_del_obj) }
+};
+static MP_DEFINE_CONST_DICT(emlearn_iir_filter_locals_dict, emlearn_iir_filter_locals_dict_table);
+
+static MP_DEFINE_CONST_OBJ_TYPE(
+ iir_filter_type,
+ MP_QSTR_emliir,
+ MP_TYPE_FLAG_NONE,
+ locals_dict, &emlearn_iir_filter_locals_dict
+);
+
+// Define module object.
+static const mp_rom_map_elem_t emlearn_iir_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_new), MP_ROM_PTR(&iir_filter_new_obj) },
+};
+static MP_DEFINE_CONST_DICT(emlearn_iir_globals, emlearn_iir_globals_table);
+const mp_obj_module_t emlearn_iir_cmodule = {
+ .base = { &mp_type_module },
+ .globals = (mp_obj_dict_t *)&emlearn_iir_globals,
+};
+
+MP_REGISTER_MODULE(MP_QSTR_emlearn_iir, emlearn_iir_cmodule);
+
+
+#endif
diff --git a/src/emlearn_iir/micropython.cmake b/src/emlearn_iir/micropython.cmake
new file mode 100644
index 0000000..9b49e71
--- /dev/null
+++ b/src/emlearn_iir/micropython.cmake
@@ -0,0 +1,17 @@
+add_library(usermod_emlearn_iir INTERFACE)
+
+execute_process(
+ COMMAND python3 -c "import emlearn; print(emlearn.includedir)"
+ OUTPUT_VARIABLE EMLEARN_DIR
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+target_sources(usermod_emlearn_iir INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/iir_filter.c
+)
+
+target_include_directories(usermod_emlearn_iir INTERFACE
+ ${EMLEARN_DIR}
+)
+
+target_link_libraries(usermod INTERFACE usermod_emlearn_iir)
diff --git a/src/emlearn_iir/micropython.mk b/src/emlearn_iir/micropython.mk
new file mode 100644
index 0000000..40d8ad6
--- /dev/null
+++ b/src/emlearn_iir/micropython.mk
@@ -0,0 +1,9 @@
+MOD_DIR := $(USERMOD_DIR)
+
+# Add all C files to SRC_USERMOD.
+SRC_USERMOD_C += $(MOD_DIR)/iir_filter.c
+
+EMLEARN_DIR := $(shell python3 -c "import emlearn; print(emlearn.includedir)")
+
+# We can add our module folder to include paths if needed
+CFLAGS_USERMOD += -I$(EMLEARN_DIR)
diff --git a/src/emlearn_iir_q15/Makefile b/src/emlearn_iir_q15/Makefile
index d4dd712..e5f0faf 100644
--- a/src/emlearn_iir_q15/Makefile
+++ b/src/emlearn_iir_q15/Makefile
@@ -22,33 +22,8 @@ SRC += \
${CMSIS_DSP_DIR}/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c \
${CMSIS_DSP_DIR}/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c
-# Stuff to make soft-float work
-# If symbols are undefined, use tools/find_symbols.py to locate object files to add
-
-SOFTFP_O :=
-SOFTFP_ENABLE := 0
-
-ARM_SOFTFP_O := _arm_cmpsf2.o lesf2.o _arm_fixsfsi.o fixsfsi.o eqsf2.o gesf2.o addsf3.o mulsf3.o subsf3.o _clzsi2.o divdf3.o
-ARM_SOFTFP_O += _dvmd_tls.o _aeabi_uldivmod.o _aeabi_ldivmod.o _divsi3.o _udivsi3.o _modsi3.o _umodsi3.o _thumb1_case_uhi.o _udivmoddi4.o bpabi.o _clzdi2.o _ashldi3.o _lshrdi3.o _muldi3.o _divdi3.o _arm_muldivsf3.o _arm_addsubsf3.o _ashrdi3.o
-
-ifeq ($(ARCH), xtensawin)
- SOFTFP_O += _divsf3.o _ashrdi3.o
- SOFTFP_ENABLE=1
-endif
-
-ifeq ($(ARCH), armv6m)
- SOFTFP_O += $(ARM_SOFTFP_O)
- SOFTFP_ENABLE=1
-endif
-ifeq ($(ARCH), armv7m)
- SOFTFP_O += $(ARM_SOFTFP_O)
- SOFTFP_ENABLE=1
-endif
-
-ifeq ($(SOFTFP_ENABLE), 1)
- SRC_O += $(SOFTFP_O)
- #CLEAN_EXTRA += $(SOFTFP_O)
-endif
+# enable linking of libm etc
+LINK_RUNTIME=1
# Releases
DIST_FILE = $(DIST_DIR)/$(MOD).mpy
@@ -66,12 +41,7 @@ LIBGCC_FILENAME = $(shell $(CROSS)gcc $(CFLAGS) -print-libgcc-file-name)
$(info $(LIBGCC_FILENAME))
CFLAGS += -I$(CMSIS_DSP_DIR)/Include
-
-_arm_cmpsf2.o:
- $(CROSS)ar -x $(LIBGCC_FILENAME) $(SOFTFP_O)
-
-_divsf3.o:
- $(CROSS)ar -x $(LIBGCC_FILENAME) $(SOFTFP_O)
+CFLAGS += -Wno-unused-function
$(CMSIS_DSP_DIR)/iir_q15.patched:
cd $(CMSIS_DSP_DIR) && git apply -v ../df1_q15_disable_dsp.patch
diff --git a/src/emlearn_iir_q15/iir_filter.c b/src/emlearn_iir_q15/iir_filter.c
index a83c88d..a918029 100644
--- a/src/emlearn_iir_q15/iir_filter.c
+++ b/src/emlearn_iir_q15/iir_filter.c
@@ -13,23 +13,6 @@ void *memcpy(void *dst, const void *src, size_t n) {
void *memset(void *s, int c, size_t n) {
return mp_fun_table.memset_(s, c, n);
}
-
-void NORETURN abort() {
- while (1) {
- ;
- }
-}
-
-int
-__aeabi_idiv0(int return_value) {
- return return_value;
-}
-
-long long
-__aeabi_ldiv0(long long return_value) {
- return return_value;
-}
-
#endif
diff --git a/src/emlearn_kmeans/Makefile b/src/emlearn_kmeans/Makefile
index d50e56a..64775fa 100644
--- a/src/emlearn_kmeans/Makefile
+++ b/src/emlearn_kmeans/Makefile
@@ -15,22 +15,8 @@ MOD = emlearn_kmeans
# Source files (.c or .py)
SRC = kmeans.c kmeans.py
-# Stuff to make soft-float work
-# If symbols are undefined, use tools/find_symbols.py to locate object files to add
-SOFTFP_O := _divsi3.o
-
-SOFTFP_ENABLE := 0
-ifeq ($(ARCH), armv6m)
- SOFTFP_ENABLE=1
-endif
-ifeq ($(ARCH), armv7m)
- SOFTFP_ENABLE=1
-endif
-
-ifeq ($(SOFTFP_ENABLE), 1)
- SRC_O += $(SOFTFP_O)
- #CLEAN_EXTRA += $(SOFTFP_O)
-endif
+# enable linking of libm etc
+LINK_RUNTIME=1
# Releases
DIST_FILE = $(DIST_DIR)/$(MOD).mpy
@@ -47,7 +33,4 @@ include $(MPY_DIR)/py/dynruntime.mk
LIBGCC_FILENAME = $(shell $(CROSS)gcc $(CFLAGS) -print-libgcc-file-name)
$(info $(LIBGCC_FILENAME))
-_divsi3.o:
- $(CROSS)ar -x $(LIBGCC_FILENAME) $(SOFTFP_O)
-
dist: $(DIST_FILE)
diff --git a/src/emlearn_kmeans/kmeans.c b/src/emlearn_kmeans/kmeans.c
index ab0fe62..72f6415 100644
--- a/src/emlearn_kmeans/kmeans.c
+++ b/src/emlearn_kmeans/kmeans.c
@@ -14,10 +14,6 @@
#define debug_printf(...) //(0)
#endif
-int
-__aeabi_idiv0(int return_value) {
- return return_value;
-}
// Find which vector in @vectors that @v is closes to
uint16_t
diff --git a/src/emlearn_neighbors/Makefile b/src/emlearn_neighbors/Makefile
index cd12854..cadd861 100644
--- a/src/emlearn_neighbors/Makefile
+++ b/src/emlearn_neighbors/Makefile
@@ -10,6 +10,9 @@ MPY_ABI_VERSION := 6.3
# Location of emlearn library
EMLEARN_DIR := $(shell python3 -c "import emlearn; print(emlearn.includedir)")
+# enable linking of libm etc
+LINK_RUNTIME=1
+
DIST_DIR := ../../dist/$(ARCH)_$(MPY_ABI_VERSION)
# Name of module
@@ -22,9 +25,6 @@ SRC = neighbors.c
# Include to get the rules for compiling and linking the module
include $(MPY_DIR)/py/dynruntime.mk
-# for qsort
-SRC_O += $(LIBC_O)
-
# Releases
DIST_FILE = $(DIST_DIR)/$(MOD).mpy
$(DIST_DIR):
@@ -33,6 +33,6 @@ $(DIST_DIR):
$(DIST_FILE): $(MOD).mpy $(DIST_DIR)
cp $< $@
-CFLAGS += -I$(EMLEARN_DIR)
+CFLAGS += -I$(EMLEARN_DIR) -Wno-unused-function
dist: $(DIST_FILE)
diff --git a/src/emlearn_trees/Makefile b/src/emlearn_trees/Makefile
index d6111c2..cb30c04 100644
--- a/src/emlearn_trees/Makefile
+++ b/src/emlearn_trees/Makefile
@@ -10,36 +10,16 @@ MPY_ABI_VERSION := 6.3
# Location of emlearn library
EMLEARN_DIR := $(shell python3 -c "import emlearn; print(emlearn.includedir)")
+# enable linking of libm etc
+LINK_RUNTIME=1
DIST_DIR := ../../dist/$(ARCH)_$(MPY_ABI_VERSION)
# Name of module
-# NOTE: cannot contain _ - functions do not register on the module then?
MOD = emlearn_trees
# Source files (.c or .py)
-SRC = trees.c trees.py
-
-# Stuff to make soft-float work
-# If symbols are undefined, use tools/find_symbols.py to locate object files to add
-SOFTFP_O := _arm_cmpsf2.o lesf2.o _arm_fixsfsi.o fixsfsi.o eqsf2.o gesf2.o _arm_addsubsf3.o _arm_muldivsf3.o addsf3.o _clzsi2.o _udivsi3.o floatsisf.o divsf3.o _thumb1_case_uqi.o
-XTENSA_SOFTFP_O := _divsf3.o
-SOFTFP_ENABLE := 0
-ifeq ($(ARCH), armv6m)
- SOFTFP_ENABLE=1
-endif
-ifeq ($(ARCH), armv7m)
- SOFTFP_ENABLE=1
-endif
-ifeq ($(ARCH), xtensawin)
- SRC_O += $(XTENSA_SOFTFP_O)
- CLEAN_EXTRA += $(XTENSA_SOFTFP_O)
-endif
-
-ifeq ($(SOFTFP_ENABLE), 1)
- SRC_O += $(SOFTFP_O)
- CLEAN_EXTRA += $(SOFTFP_O)
-endif
+SRC = trees.c emlearn_trees.py
# Releases
DIST_FILE = $(DIST_DIR)/$(MOD).mpy
@@ -52,16 +32,6 @@ $(DIST_FILE): $(MOD).mpy $(DIST_DIR)
# Include to get the rules for compiling and linking the module
include $(MPY_DIR)/py/dynruntime.mk
-# CROSS is defined by the included
-LIBGCC_FILENAME = $(shell $(CROSS)gcc $(CFLAGS) -print-libgcc-file-name)
-$(info $(LIBGCC_FILENAME))
-
-_arm_cmpsf2.o:
- $(CROSS)ar -x $(LIBGCC_FILENAME) $(SOFTFP_O)
-
-_divsf3.o:
- $(CROSS)ar -x $(LIBGCC_FILENAME) $(XTENSA_SOFTFP_O)
-
-CFLAGS += -I$(EMLEARN_DIR)
+CFLAGS += -I$(EMLEARN_DIR) -Wno-unused-function
dist: $(DIST_FILE)
diff --git a/src/emlearn_trees/trees.py b/src/emlearn_trees/emlearn_trees.py
similarity index 76%
rename from src/emlearn_trees/trees.py
rename to src/emlearn_trees/emlearn_trees.py
index a46b2b3..f652ec4 100644
--- a/src/emlearn_trees/trees.py
+++ b/src/emlearn_trees/emlearn_trees.py
@@ -1,4 +1,11 @@
+# When used as external C module, the .py is the top-level import,
+# and we need to merge the native module symbols at import time
+# When used as dynamic native modules (.mpy), .py and native code is merged at build time
+try:
+ from emlearn_trees_c import *
+except ImportError as e:
+ pass
def load_model(builder, f):
diff --git a/src/emlearn_trees/micropython.cmake b/src/emlearn_trees/micropython.cmake
new file mode 100644
index 0000000..6ad928a
--- /dev/null
+++ b/src/emlearn_trees/micropython.cmake
@@ -0,0 +1,17 @@
+add_library(usermod_emlearn_trees INTERFACE)
+
+execute_process(
+ COMMAND python3 -c "import emlearn; print(emlearn.includedir)"
+ OUTPUT_VARIABLE EMLEARN_DIR
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+target_sources(usermod_emlearn_trees INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/trees.c
+)
+
+target_include_directories(usermod_emlearn_trees INTERFACE
+ ${EMLEARN_DIR}
+)
+
+target_link_libraries(usermod INTERFACE usermod_emlearn_trees)
diff --git a/src/emlearn_trees/micropython.mk b/src/emlearn_trees/micropython.mk
new file mode 100644
index 0000000..066419a
--- /dev/null
+++ b/src/emlearn_trees/micropython.mk
@@ -0,0 +1,9 @@
+MOD_DIR := $(USERMOD_DIR)
+
+# Add all C files to SRC_USERMOD.
+SRC_USERMOD_C += $(MOD_DIR)/trees.c
+
+EMLEARN_DIR := $(shell python3 -c "import emlearn; print(emlearn.includedir)")
+
+# We can add our module folder to include paths if needed
+CFLAGS_USERMOD += -I$(EMLEARN_DIR)
diff --git a/src/emlearn_trees/trees.c b/src/emlearn_trees/trees.c
index 3404f60..6e13a30 100644
--- a/src/emlearn_trees/trees.c
+++ b/src/emlearn_trees/trees.c
@@ -1,5 +1,10 @@
// Include the header file to get access to the MicroPython API
+
+#ifdef MICROPY_ENABLE_DYNRUNTIME
#include "py/dynruntime.h"
+#else
+#include "py/runtime.h"
+#endif
#define EML_TREES_REGRESSION_ENABLE 0
#include
@@ -8,6 +13,7 @@
#define EMLEARN_MICROPYTHON_DEBUG 0
+#ifdef MICROPY_ENABLE_DYNRUNTIME
// memset is used by some standard C constructs
#if !defined(__linux__)
void *memcpy(void *dst, const void *src, size_t n) {
@@ -17,13 +23,7 @@ void *memset(void *s, int c, size_t n) {
return mp_fun_table.memset_(s, c, n);
}
#endif
-
-// Softfloat
-int
-__aeabi_idiv0(int return_value) {
- return return_value;
-}
-
+#endif
// For building up an EmlTrees structure
typedef struct _EmlTreesBuilder {
@@ -39,7 +39,11 @@ typedef struct _mp_obj_trees_builder_t {
EmlTreesBuilder builder;
} mp_obj_trees_builder_t;
+#if MICROPY_ENABLE_DYNRUNTIME
mp_obj_full_type_t trees_builder_type;
+#else
+static const mp_obj_type_t trees_builder_type;
+#endif
// Create a new tree builder
static mp_obj_t builder_new(mp_obj_t trees_obj, mp_obj_t nodes_obj, mp_obj_t leaves_obj) {
@@ -64,9 +68,9 @@ static mp_obj_t builder_new(mp_obj_t trees_obj, mp_obj_t nodes_obj, mp_obj_t lea
self->max_leaves = max_leaves;
// create storage for trees
- EmlTreesNode *nodes = (EmlTreesNode *)m_malloc(sizeof(EmlTreesNode)*max_nodes);
- int32_t *roots = (int32_t *)m_malloc(sizeof(int32_t)*max_trees);
- uint8_t *leaves = (uint8_t *)m_malloc(sizeof(uint8_t)*max_leaves);
+ EmlTreesNode *nodes = m_new(EmlTreesNode, self->max_nodes);
+ int32_t *roots = m_new(int32_t, self->max_trees);
+ uint8_t *leaves = m_new(uint8_t, self->max_leaves);
#if EMLEARN_MICROPYTHON_DEBUG
mp_printf(&mp_plat_print, "emltrees nodes=%p roots=%p builder=%p\n", nodes, roots, self);
@@ -97,9 +101,9 @@ static mp_obj_t builder_del(mp_obj_t trees_obj) {
EmlTreesBuilder *self = &o->builder;
// free allocated data
- m_free(self->trees.nodes);
- m_free(self->trees.tree_roots);
- m_free(self->trees.leaves);
+ m_del(EmlTreesNode, self->trees.nodes, self->max_nodes);
+ m_del(int32_t, self->trees.tree_roots, self->max_nodes);
+ m_del(uint8_t, self->trees.leaves, self->max_leaves);
#if EMLEARN_MICROPYTHON_DEBUG
mp_printf(&mp_plat_print, "emltrees del \n");
@@ -267,6 +271,7 @@ static mp_obj_t builder_predict(mp_obj_t self_obj, mp_obj_t features_obj, mp_obj
static MP_DEFINE_CONST_FUN_OBJ_3(builder_predict_obj, builder_predict);
+#ifdef MICROPY_ENABLE_DYNRUNTIME
mp_map_elem_t trees_locals_dict_table[7];
static MP_DEFINE_CONST_DICT(trees_locals_dict, trees_locals_dict_table);
@@ -295,3 +300,41 @@ mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *a
MP_DYNRUNTIME_INIT_EXIT
}
+#else
+
+
+// Define the tree builder class
+static const mp_rom_map_elem_t emlearn_trees_builder_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_predict), MP_ROM_PTR(&builder_predict_obj) },
+ { MP_ROM_QSTR(MP_QSTR_addnode), MP_ROM_PTR(&builder_addnode_obj) },
+ { MP_ROM_QSTR(MP_QSTR_addroot), MP_ROM_PTR(&builder_addroot_obj) },
+ { MP_ROM_QSTR(MP_QSTR_addleaf), MP_ROM_PTR(&builder_addleaf_obj) },
+ { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&builder_del_obj) },
+ { MP_ROM_QSTR(MP_QSTR_setdata), MP_ROM_PTR(&builder_setdata_obj) },
+ { MP_ROM_QSTR(MP_QSTR_outputs), MP_ROM_PTR(&builder_get_outputs_obj) },
+};
+static MP_DEFINE_CONST_DICT(emlearn_trees_builder_locals_dict, emlearn_trees_builder_locals_dict_table);
+
+static MP_DEFINE_CONST_OBJ_TYPE(
+ trees_builder_type,
+ MP_QSTR_emltrees,
+ MP_TYPE_FLAG_NONE,
+ locals_dict, &emlearn_trees_builder_locals_dict
+);
+
+// Define module object.
+static const mp_rom_map_elem_t emlearn_trees_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_new), MP_ROM_PTR(&builder_new_obj) },
+};
+static MP_DEFINE_CONST_DICT(emlearn_trees_globals, emlearn_trees_globals_table);
+
+const mp_obj_module_t emlearn_trees_cmodule = {
+ .base = { &mp_type_module },
+ .globals = (mp_obj_dict_t *)&emlearn_trees_globals,
+};
+
+// External module name is XXX_c to allow .py file to be the entrypoint
+MP_REGISTER_MODULE(MP_QSTR_emlearn_trees_c, emlearn_trees_cmodule);
+
+#endif
+
diff --git a/src/manifest.py b/src/manifest.py
new file mode 100644
index 0000000..85621ff
--- /dev/null
+++ b/src/manifest.py
@@ -0,0 +1,8 @@
+
+# Manifest is used to include .py files for external C module build
+# NOTE: this is a different mechanism than
+# Ref https://docs.micropython.org/en/latest/reference/manifest.html
+module("emlearn_trees.py", base_path='./emlearn_trees')
+module("emlearn_fft.py", base_path='./emlearn_fft')
+
+include("$(PORT_DIR)/boards/manifest.py")
diff --git a/src/manifest_unix.py b/src/manifest_unix.py
new file mode 100644
index 0000000..2a52a37
--- /dev/null
+++ b/src/manifest_unix.py
@@ -0,0 +1,8 @@
+
+# Manifest is used to include .py files for external C module build
+# NOTE: this is a different mechanism than
+# Ref https://docs.micropython.org/en/latest/reference/manifest.html
+module("emlearn_trees.py", base_path='./emlearn_trees')
+module("emlearn_fft.py", base_path='./emlearn_fft')
+
+#include("$(PORT_DIR)/boards/manifest.py")
diff --git a/src/micropython.cmake b/src/micropython.cmake
new file mode 100644
index 0000000..4a72323
--- /dev/null
+++ b/src/micropython.cmake
@@ -0,0 +1,6 @@
+
+include(${CMAKE_CURRENT_LIST_DIR}/emlearn_trees/micropython.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/emlearn_fft/micropython.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/emlearn_iir/micropython.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/emlearn_arrayutils/micropython.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/tinymaix_cnn/micropython.cmake)
diff --git a/src/tinymaix_cnn/Makefile b/src/tinymaix_cnn/Makefile
index d8fd5d2..3129668 100644
--- a/src/tinymaix_cnn/Makefile
+++ b/src/tinymaix_cnn/Makefile
@@ -4,48 +4,28 @@ MPY_DIR = ../../micropython
# Architecture to build for (x86, x64, armv6m, armv7m, xtensa, xtensawin)
ARCH = x64
+CONFIG := int8
+
# The ABI version for .mpy files
MPY_ABI_VERSION := 6.3
# Location of deps
TINYMAIX_DIR := ../../dependencies/TinyMaix
+CONFIG_DIR := ./$(CONFIG)
DIST_DIR := ../../dist/$(ARCH)_$(MPY_ABI_VERSION)
+# enable linking of libm etc
+LINK_RUNTIME=1
+
# Name of module
MOD = emlearn_cnn
# Source files (.c or .py)
SRC = mod_cnn.c
-# Stuff to make soft-float work
-# If symbols are undefined, use tools/find_symbols.py to locate object files to add
-SOFTFP_O :=
-SOFTFP_ENABLE := 0
-ifeq ($(ARCH), armv6m)
- SOFTFP_ENABLE=1
- SOFTFP_O += _divsi3.o mulsf3.o subsf3.o subdf3.o _arm_cmpsf2.o lesf2.o _arm_fixsfsi.o _fixunssfsi.o fixsfsi.o extendsfdf2.o eqsf2.o gesf2.o _arm_addsubsf3.o _arm_muldivsf3.o addsf3.o _clzsi2.o _udivsi3.o floatsisf.o divsf3.o truncdfsf2.o _thumb1_case_uqi.o
-endif
-ifeq ($(ARCH), armv7m)
- SOFTFP_ENABLE=1
- SOFTFP_O += _arm_addsubsf3.o _arm_muldivsf3.o _arm_fixsfsi.o _arm_cmpsf2.o _arm_fixunssfsi.o _arm_addsubdf3.o _arm_truncdfsf2.o
-endif
-ifeq ($(ARCH), armv7emsp)
- SOFTFP_ENABLE=1
- SOFTFP_O += _arm_addsubdf3.o _arm_truncdfsf2.o
-endif
-ifeq ($(ARCH), xtensawin)
- SOFTFP_ENABLE=1
- SOFTFP_O += _truncdfsf2.o _addsubdf3.o _extendsfdf2.o _divsf3.o
-endif
-
-ifeq ($(SOFTFP_ENABLE), 1)
- SRC_O += $(SOFTFP_O)
- #CLEAN_EXTRA += $(SOFTFP_O)
-endif
-
# Releases
-DIST_FILE = $(DIST_DIR)/$(MOD).mpy
+DIST_FILE = $(DIST_DIR)/$(MOD)_$(CONFIG).mpy
$(DIST_DIR):
mkdir -p $@
@@ -55,19 +35,6 @@ $(DIST_FILE): $(MOD).mpy $(DIST_DIR)
# Include to get the rules for compiling and linking the module
include $(MPY_DIR)/py/dynruntime.mk
-# CROSS is defined by the included
-LIBGCC_FILENAME = $(shell $(CROSS)gcc $(CFLAGS) -print-libgcc-file-name)
-$(info $(LIBGCC_FILENAME))
-
-_arm_cmpsf2.o:
- $(CROSS)ar -x $(LIBGCC_FILENAME) $(SOFTFP_O)
-
-_addsubdf3.o:
- $(CROSS)ar -x $(LIBGCC_FILENAME) $(SOFTFP_O)
-
-_arm_addsubdf3.o:
- $(CROSS)ar -x $(LIBGCC_FILENAME) $(SOFTFP_O)
-
-CFLAGS += -I$(TINYMAIX_DIR)/include -I$(TINYMAIX_DIR)/src -Wno-error=unused-variable -Wno-error=multichar
+CFLAGS += -I$(CONFIG_DIR) -I$(TINYMAIX_DIR)/include -I$(TINYMAIX_DIR)/src -Wno-error=unused-variable -Wno-error=multichar -Wdouble-promotion
dist: $(DIST_FILE)
diff --git a/src/tinymaix_cnn/fp32/tm_port.h b/src/tinymaix_cnn/fp32/tm_port.h
new file mode 100644
index 0000000..4ef6777
--- /dev/null
+++ b/src/tinymaix_cnn/fp32/tm_port.h
@@ -0,0 +1,97 @@
+/*
+Configuration file for TinyMaix
+
+Copyright 2022 Sipeed Technology Co., Ltd. All Rights Reserved.
+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.
+==============================================================================*/
+
+#ifndef __TM_PORT_H
+#define __TM_PORT_H
+
+#define TM_ARCH_CPU (0) //default, pure cpu compute
+#define TM_ARCH_ARM_SIMD (1) //ARM Cortex M4/M7, etc.
+#define TM_ARCH_ARM_NEON (2) //ARM Cortex A7, etc.
+#define TM_ARCH_ARM_MVEI (3) //ARMv8.1: M55, etc.
+#define TM_ARCH_RV32P (4) //T-head E907, etc.
+#define TM_ARCH_RV64V (5) //T-head C906,C910, etc.
+#define TM_ARCH_CSKYV2 (6) //cskyv2 with dsp core
+#define TM_ARCH_X86_SSE2 (7) //x86 sse2
+
+#define TM_OPT0 (0) //default, least code and buf
+#define TM_OPT1 (1) //opt for speed, need more code and buf
+#define TM_OPT2 (2) //TODO
+
+/******************************* PORT CONFIG ************************************/
+#define TM_ARCH TM_ARCH_CPU
+#define TM_OPT_LEVEL TM_OPT0
+#define TM_MDL_TYPE TM_MDL_FP32
+#define TM_FASTSCALE (0) //enable if your chip don't have FPU, may speed up 1/3, but decrease accuracy
+#define TM_LOCAL_MATH (1) //use local math func (like exp()) to avoid libm
+#define TM_ENABLE_STAT (1) //enable mdl stat functions
+#define TM_MAX_CSIZE (1000) //max channel num //used if INT8 mdl //cost TM_MAX_CSIZE*4 Byte
+#define TM_MAX_KSIZE (5*5) //max kernel_size //cost TM_MAX_KSIZE*4 Byte
+#define TM_MAX_KCSIZE (3*3*256) //max kernel_size*channels //cost TM_MAX_KSIZE*sizeof(mtype_t) Byte
+
+#define TM_INLINE __attribute__((always_inline)) static inline
+#define TM_WEAK __attribute__((weak))
+
+// Disable "static" (non-const) globals, since they are not supported by MicroPython mpy_ld.py
+#define TM_STATIC
+
+// Use MicroPython for dynamic allocation
+#define tm_malloc(x) m_malloc(x)
+#define tm_free(x) mod_cnn_free(x)
+
+// FIXME: set theese to use MicroPython primitives
+
+#define TM_PRINTF(...) //printf(__VA_ARGS__);
+#define TM_DBG(...) TM_PRINTF("###L%d: ",__LINE__);TM_PRINTF(__VA_ARGS__);
+#define TM_DBGL() //Serial.println(__LINE__);
+
+
+// FIXME: enable profiling
+#define TM_GET_US() (0)
+#define TM_DBGT_INIT() ;
+#define TM_DBGT_START() ;
+#define TM_DBGT(x) ;
+
+/******************************* DBG PERFORMANCE CONFIG ************************************/
+//need clock tick to make accurate statistics
+#define TM_EN_PERF 0
+
+#if TM_EN_PERF
+ #define TM_GET_TICK(x) __ASM volatile("csrr %0, mcycle" : "=r"(x)); //edit your self
+
+ #define TM_TICK_PERUS (380) //sysconf(_SC_CLK_TCK)/1000000)
+ #define TM_PERF_REG(x) uint64_t x=0;
+ #define TM_PERF_EXTREG(x) extern uint64_t x;
+ #define TM_PERF_INIT(x) uint64_t _##x##_t0, _##x##_t1;
+ #define TM_PERF_START(x) TM_GET_TICK(_##x##_t0);
+ #define TM_PERF_ADD(x) {TM_GET_TICK(_##x##_t1);(x)+=(_##x##_t1-_##x##_t0);TM_GET_TICK(_##x##_t0);};
+ #define TM_PERF_PRINT(x) TM_PRINTF("PERF "#x": %ld us\r\n", (x)/TM_TICK_PERUS)
+#else
+ #define TM_GET_TICK(x)
+ #define TM_TICK_PERUS
+ #define TM_PERF_REG(x)
+ #define TM_PERF_EXTREG(x)
+ #define TM_PERF_INIT(x)
+ #define TM_PERF_START(x)
+ #define TM_PERF_ADD(x)
+ #define TM_PERF_PRINT(x)
+#endif
+
+
+/******************************* OPS CONFIG ************************************/
+
+
+
+
+#endif
diff --git a/src/tinymaix_cnn/tm_port.h b/src/tinymaix_cnn/int8/tm_port.h
similarity index 99%
rename from src/tinymaix_cnn/tm_port.h
rename to src/tinymaix_cnn/int8/tm_port.h
index f908f61..ec5cf44 100644
--- a/src/tinymaix_cnn/tm_port.h
+++ b/src/tinymaix_cnn/int8/tm_port.h
@@ -48,7 +48,7 @@ limitations under the License.
// Use MicroPython for dynamic allocation
#define tm_malloc(x) m_malloc(x)
-#define tm_free(x) m_free(x)
+#define tm_free(x) mod_cnn_free(x)
// FIXME: set theese to use MicroPython primitives
diff --git a/src/tinymaix_cnn/micropython.cmake b/src/tinymaix_cnn/micropython.cmake
new file mode 100644
index 0000000..9b80e78
--- /dev/null
+++ b/src/tinymaix_cnn/micropython.cmake
@@ -0,0 +1,22 @@
+add_library(usermod_cnn INTERFACE)
+
+execute_process(
+ COMMAND python3 -c "import emlearn; print(emlearn.includedir)"
+ OUTPUT_VARIABLE EMLEARN_DIR
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+target_sources(usermod_cnn INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/mod_cnn.c
+)
+
+target_include_directories(usermod_cnn INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/int8
+ ${CMAKE_CURRENT_LIST_DIR}/../../dependencies/TinyMaix/include
+ ${CMAKE_CURRENT_LIST_DIR}/../../dependencies/TinyMaix/src
+)
+
+target_compile_options(usermod_cnn INTERFACE
+ -Wno-error=unused-variable -Wno-error=multichar -Wdouble-promotion
+)
+target_link_libraries(usermod INTERFACE usermod_cnn)
diff --git a/src/tinymaix_cnn/mod_cnn.c b/src/tinymaix_cnn/mod_cnn.c
index b6312fd..adee99f 100644
--- a/src/tinymaix_cnn/mod_cnn.c
+++ b/src/tinymaix_cnn/mod_cnn.c
@@ -1,5 +1,12 @@
// Include the header file to get access to the MicroPython API
+#ifdef MICROPY_ENABLE_DYNRUNTIME
#include "py/dynruntime.h"
+#else
+#include "py/runtime.h"
+#endif
+
+
+void mod_cnn_free(void *ptr);
// TinyMaix config
#include "./tm_port.h"
@@ -13,9 +20,10 @@
#include
-#define DEBUG (1)
+#define DEBUG (0)
+#ifdef MICROPY_ENABLE_DYNRUNTIME
// memset is used by some standard C constructs
#if !defined(__linux__)
void *memcpy(void *dst, const void *src, size_t n) {
@@ -24,17 +32,7 @@ void *memcpy(void *dst, const void *src, size_t n) {
void *memset(void *s, int c, size_t n) {
return mp_fun_table.memset_(s, c, n);
}
-
-int
-__aeabi_idiv0(int return_value) {
- return return_value;
-}
-
-void NORETURN abort() {
- while (1) {
- ;
- }
-}
+#endif
#endif
// get model output shapes
@@ -76,11 +74,27 @@ typedef struct _mp_obj_mod_cnn_t {
tm_mdl_t model;
tm_mat_t input;
uint8_t *model_buffer;
+ size_t model_buffer_length;
uint8_t *data_buffer;
+ size_t data_buffer_length;
uint16_t out_dims[4];
} mp_obj_mod_cnn_t;
+#if MICROPY_ENABLE_DYNRUNTIME
mp_obj_full_type_t mod_cnn_type;
+#else
+static const mp_obj_type_t mod_cnn_type;
+#endif
+
+
+void mod_cnn_free(void *ptr)
+{
+#if MICROPY_ENABLE_DYNRUNTIME
+ return m_free(ptr);
+#else
+ return m_del(void *, ptr, 0); // XXX: not sure if safe
+#endif
+}
// TODO: add function for getting the shape of expected input. As a tuple
@@ -106,12 +120,14 @@ static mp_obj_t mod_cnn_new(mp_obj_t model_data_obj) {
tm_mdl_t *model = &o->model;
// Copy the model data
- o->model_buffer = m_malloc(model_data_length);
+ o->model_buffer_length = model_data_length;
+ o->model_buffer = m_new(uint8_t, o->model_buffer_length);
memcpy(o->model_buffer, model_data_buffer, model_data_length);
// Allocate temporary buffer
// TODO: this can possibly be smaller? Might want to use TinyMaix internal alloc
- o->data_buffer = m_malloc(model_data_length);
+ o->data_buffer_length = model_data_length;
+ o->data_buffer = m_new(uint8_t, o->data_buffer_length);
// loading model
// will set the dimensions of the input matrix
@@ -150,8 +166,8 @@ static mp_obj_t mod_cnn_del(mp_obj_t self_obj) {
mp_obj_mod_cnn_t *o = MP_OBJ_TO_PTR(self_obj);
tm_mdl_t *model = &o->model;
- m_free(o->model_buffer);
- m_free(o->data_buffer);
+ m_del(uint8_t, o->model_buffer, o->model_buffer_length);
+ m_del(uint8_t, o->data_buffer, o->data_buffer_length);
tm_unload(model);
return mp_const_none;
@@ -256,6 +272,7 @@ static mp_obj_t mod_cnn_output_dimensions(mp_obj_t self_obj) {
static MP_DEFINE_CONST_FUN_OBJ_1(mod_cnn_output_dimensions_obj, mod_cnn_output_dimensions);
+#ifdef MICROPY_ENABLE_DYNRUNTIME // natmod
mp_map_elem_t mod_locals_dict_table[3];
static MP_DEFINE_CONST_DICT(mod_locals_dict, mod_locals_dict_table);
@@ -279,4 +296,37 @@ mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *a
// This must be last, it restores the globals dict
MP_DYNRUNTIME_INIT_EXIT
}
+#else // extmod
+
+// Define a class
+static const mp_rom_map_elem_t mod_cnn_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_run), MP_ROM_PTR(&mod_cnn_run_obj) },
+ { MP_ROM_QSTR(MP_QSTR_output_dimensions), MP_ROM_PTR(&mod_cnn_del_obj) },
+ { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mod_cnn_output_dimensions_obj) }
+};
+static MP_DEFINE_CONST_DICT(mod_cnn_locals_dict, mod_cnn_locals_dict_table);
+
+
+static MP_DEFINE_CONST_OBJ_TYPE(
+ mod_cnn_type,
+ MP_QSTR_tinymaix_cnn,
+ MP_TYPE_FLAG_NONE,
+ locals_dict, &mod_cnn_locals_dict
+);
+
+// Define module object.
+static const mp_rom_map_elem_t mod_cnn_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_new), MP_ROM_PTR(&mod_cnn_new_obj) }
+};
+static MP_DEFINE_CONST_DICT(mod_cnn_globals, mod_cnn_globals_table);
+
+const mp_obj_module_t mod_cnn_cmodule = {
+ .base = { &mp_type_module },
+ .globals = (mp_obj_dict_t *)&mod_cnn_globals,
+};
+
+// FIXME: unhardcode config part of module name
+MP_REGISTER_MODULE(MP_QSTR_emlearn_cnn_int8, mod_cnn_cmodule);
+#endif
+
diff --git a/stubs/emlearn_arrayutils.py b/stubs/emlearn_arrayutils.py
new file mode 100644
index 0000000..4e78692
--- /dev/null
+++ b/stubs/emlearn_arrayutils.py
@@ -0,0 +1,37 @@
+
+# Stub file (PEP 484) with API definitions and documentation for native module
+# Is called .py because Sphinx autodoc currently does not support .pyi files
+
+"""
+Array utility functions
+
+Some simple operations on arrays, implemented in C for efficiency.
+"""
+
+import array
+import typing
+
+def linear_map(inputs : array.array, outputs: array.array,
+ in_min : float, in_max : float,
+ out_min : float, out_max : float
+ ):
+ """
+ Compute an element-wise linear mapping/scaling.
+
+ The range (in_min, in_max) will be mapped to (out_min, out_max).
+ The function supports in and out being different data widths (array typecodes).
+
+ The following pairs are supported:
+ - float (f) to int16 (h)
+ - int16 (h) to float (f)
+
+ :param inputs: The input data
+ :param outputs: Where output is placed
+ :param in_min:
+ :param in_max:
+ :param out_min:
+ :param out_max:
+ """
+ pass
+
+
diff --git a/stubs/emlearn_cnn.py b/stubs/emlearn_cnn.py
new file mode 100644
index 0000000..fe39c2c
--- /dev/null
+++ b/stubs/emlearn_cnn.py
@@ -0,0 +1,46 @@
+# Stub file (PEP 484) with API definitions and documentation for native module
+# Is called .py because Sphinx autodoc currently does not support .pyi files
+
+"""
+Convolutional Neural Network module.
+
+Implemented using TinyMaix (https://github.com/sipeed/TinyMaix/).
+
+Note that multiple variants of this module is provided.
+So the import should either be **emlearn_cnn_fp32** (for 32 bit floating point),
+or **emlearn_cnn_int8** (for 8 bit integers, quantized model).
+
+"""
+
+import array
+
+class Model():
+ """A Convolutional Neural Network
+
+ Note: May not be constructed directly. Instead use the new() function.
+ """
+ def run(self, inputs : array.array, outputs: array.array):
+ """
+ Run inference using the model
+
+ :param inputs: the input data
+ :param outputs: where to put model outputs
+ """
+ pass
+
+ def output_dimensions(self) -> tuple[int]:
+ """
+ Get the output dimensions/size of the model
+
+ Useful to know how large an array to pass to run()
+ """
+ pass
+
+def new(model_data : array.array) -> Model:
+ """
+ Construct a new Convolutional Neural Network
+
+ :param model_data: The model definition (.TMDL file, as bytes).
+ """
+ pass
+
diff --git a/stubs/emlearn_fft.py b/stubs/emlearn_fft.py
new file mode 100644
index 0000000..4c07762
--- /dev/null
+++ b/stubs/emlearn_fft.py
@@ -0,0 +1,56 @@
+
+# Stub file (PEP 484) with API definitions and documentation for native module
+# Is called .py because Sphinx autodoc currently does not support .pyi files
+
+"""
+Fast Fourier Transform (FFT)
+
+Implemented using *eml_fft* from the emlearn C library (https://github.com/emlearn/emlearn).
+"""
+
+import array
+import typing
+
+
+class FFT():
+ """Fast Fourier Transform (FFT)
+ """
+ def __init__(self, length : int):
+ pass
+
+ def run(self, real : array.array, imag : array.array):
+ """
+ Perform the FFT transformation
+
+ Note: operates in-place, will modify both arrays.
+
+ To perform a real-only (RFFT), let imag be all zeroes.
+
+ :param real: the real part of data. Typecode 'f' (float)
+ :param imag: the imaginary part of data. Typecode 'f' (float)
+ """
+ pass
+
+ def fill(self, sin : array.array, cos : array.array):
+ """
+ Set up FFT coefficients
+
+ Note: Do not use this directly. Instead use the module-level fill() function.
+
+ :param sin: Precomputed coefficients
+ :param cos: Precomputed coefficients
+ """
+ pass
+
+def fill(fft : FFT, n : int):
+ """
+ Set up FFT coefficients
+
+ NB: Must be called before attempting to use FFT.run()
+
+ :param fft: FFT instance
+ :param n: Length of the FFT transform
+ """
+ pass
+
+
diff --git a/stubs/emlearn_iir.py b/stubs/emlearn_iir.py
new file mode 100644
index 0000000..ebe8843
--- /dev/null
+++ b/stubs/emlearn_iir.py
@@ -0,0 +1,47 @@
+
+# Stub file (PEP 484) with API definitions and documentation for native module
+# Is called .py because Sphinx autodoc currently does not support .pyi files
+
+"""
+Infinite Impulse Response (IIR) filters
+
+Uses a cascade of second-order filter sections (SOS).
+The conventions are designed to match that of scipy-signal (https://docs.scipy.org/doc/scipy/reference/signal.html),
+so one can use design tools such as scipy.signal.iirfilter or scipy.signal.iirdesign
+to create the IIR filter coefficients.
+
+Implemented using *eml_iir* from the emlearn C library (https://github.com/emlearn/emlearn).
+"""
+
+import array
+import typing
+
+
+class IIR():
+ """Infinite Impulse Response filter
+ """
+ def run(self, values : array.array):
+ """
+ Perform the filter
+
+ Note: operates in-place, will modify the input array data.
+
+ :param values: the data to filter. Typecode 'f' (float)
+ """
+ pass
+
+
+def new(coefficients : array.array) -> IIR:
+ """
+ Create IIR filter
+
+ There must be 6 coefficients per second-order stage.
+ The format of each stage is on form Transposed Direct Form II: (b0, b1, b2, 1.0, -a1, -a2).
+ Multiple stages are formed by concatenating the coefficients of each stage.
+ This is the same used by scipy.signal.sosfilt.
+
+ :param coefficients: IIR filter coefficients
+ """
+ pass
+
+
diff --git a/stubs/emlearn_neighbors.py b/stubs/emlearn_neighbors.py
new file mode 100644
index 0000000..b817858
--- /dev/null
+++ b/stubs/emlearn_neighbors.py
@@ -0,0 +1,67 @@
+
+# Stub file (PEP 484) with API definitions and documentation for native module
+# Is called .py because Sphinx autodoc currently does not support .pyi files
+
+"""
+K-nearest neighbors
+
+Implemented using *eml_neighbors* from the emlearn C library (https://github.com/emlearn/emlearn).
+"""
+
+import array
+import typing
+
+
+class Model():
+ """A nearest-neighbors model
+ """
+ def predict(self, inputs : array.array) -> int:
+ """
+ Run inference using the model
+
+ :param inputs: the input data. Typecode 'h' (int16)
+ :return: the resulting label/class
+ """
+ pass
+
+ def additem(self, values : array.array, label : int):
+ """
+ Add an item into the model
+
+ :param values: the data/features of this item. Typecode 'h' (int16)
+ :param label: the label/class to associate with this item
+ """
+ pass
+
+ def getitem(self, item : int, outputs : array.array):
+ """
+ Access data of an item stored in the model
+
+ :param item: Index of item
+ :param outputs: Where to copy the data from the item. Typecode 'h' (int16)
+ """
+ pass
+
+ def getresult(self, idx : int) -> tuple[int, int, int]:
+ """
+ Get details on the comparisons between predict() data and items stored in model
+
+ :param item: Index of the comparison to retrieve. Smaller number are the nearest neighbors.
+ :return: Tuple with (item-index, distance-to-item, label-of-item)
+ """
+ pass
+
+def new(max_items : int, features : int, k_neighbors : int) -> Model:
+ """
+ Construct an empty neighbors model
+
+ The model is created with a specified maximum capacity.
+ Memory usage will be determined by this capacity.
+
+ :param max_items: Maximum number of items in the dataset
+ :param features: Number of features in a data item
+ :param k_neighbors: Number of neighbors to consider
+ """
+ pass
+
+
diff --git a/stubs/emlearn_trees.py b/stubs/emlearn_trees.py
new file mode 100644
index 0000000..a914277
--- /dev/null
+++ b/stubs/emlearn_trees.py
@@ -0,0 +1,101 @@
+# Stub file (PEP 484) with API definitions and documentation for native module
+# Is called .py because Sphinx autodoc currently does not support .pyi files
+
+"""
+Tree-based models (Random Forest et.c.)
+
+Implemented using *eml_trees* from the emlearn C library (https://github.com/emlearn/emlearn).
+"""
+
+import array
+import typing
+
+class Model():
+ """A tree-based ensemble model
+
+ Note: Normally not constructed directly. Instead use
+ """
+ def predict(self, inputs : array.array, outputs: array.array):
+ """
+ Run inference using the model
+
+ :param inputs: the input data. Typecode 'h' (int16)
+ :param outputs: where to put model outputs. Typecode 'f' (float)
+ """
+ pass
+
+ def outputs(self) -> int:
+ """
+ Get the output dimensions/size of the model
+
+ Useful to know how large an array to pass to predict()
+ """
+ pass
+
+ def setdata(self, features : int, classes : int):
+ """
+ Set data about the model
+
+ Note: Usually not used directly. Instead use load_model().
+
+ :param features: Number of input features
+ :param classes: Number of classes
+ """
+ pass
+
+ def addroot(self, root):
+ """
+ Add a tree root
+
+ Note: Usually not used directly. Instead use load_model().
+
+ :param root: Offset into nodes for the initial decision node of a tree
+ """
+ pass
+
+ def addnode(self, left : int, right : int, feature : int, value : int):
+ """
+ Add a decision node
+
+ Note: Usually not used directly. Instead use load_model().
+
+ :param left: Left child (node or leaf)
+ :param right: Right child (node or leaf)
+ :param feature: Feature index
+ :param value: Threshold to compute feature to
+ """
+ pass
+
+ def addleaf(self, value : int):
+ """
+ Add a leaf node
+
+ Note: Usually not used directly. Instead use load_model().
+
+ :param value:
+ """
+ pass
+
+def new(max_trees : int, max_nodes : int, max_leaves : int) -> Model:
+ """
+ Construct an empty tree-based model
+
+ The model is created with a specified maximum capacity.
+ Memory usage will be determined by this capacity.
+
+ :param max_trees: Maximum number of trees in ensemble
+ :param max_nodes: Maximum number of decision nodes (across all trees)
+ :param max_leaves: Maximum number of leaves (across all trees)
+ """
+ pass
+
+def load_model(trees : Model, file : typing.BinaryIO):
+
+ """
+ Load model definition from a file
+
+ The model must be constructed with sufficient capacity (trees, nodes, leaves).
+ Otherwise will raise exception.
+ """
+ pass
+
diff --git a/tests/test_cnn.py b/tests/test_cnn.py
index b1b3aa0..190ed5e 100644
--- a/tests/test_cnn.py
+++ b/tests/test_cnn.py
@@ -1,16 +1,18 @@
import array
-import emlearn_cnn
+import emlearn_cnn_int8
+import emlearn_cnn_fp32
-MNIST_MODEL = 'examples/mnist_cnn/mnist_cnn.tmdl'
+MNIST_MODEL_INT8 = 'examples/mnist_cnn/mnist_cnn_int8.tmdl'
+MNIST_MODEL_FP32 = 'examples/mnist_cnn/mnist_cnn_fp32.tmdl'
MNIST_DATA_DIR = 'examples/mnist_cnn/data/'
def test_cnn_create():
model = None
- with open(MNIST_MODEL, 'rb') as f:
+ with open(MNIST_MODEL_FP32, 'rb') as f:
model_data = array.array('B', f.read())
- model = emlearn_cnn.new(model_data)
+ model = emlearn_cnn_fp32.new(model_data)
out_shape = model.output_dimensions()
assert out_shape == (10,), (out_shape)
@@ -48,12 +50,12 @@ def argmax(arr):
return idx_max
-def test_cnn_mnist():
+def check_cnn_mnist(cnn_module, model_path):
model = None
- with open(MNIST_MODEL, 'rb') as f:
+ with open(model_path, 'rb') as f:
model_data = array.array('B', f.read())
- model = emlearn_cnn.new(model_data)
+ model = cnn_module.new(model_data)
probabilities = array.array('f', (-1 for _ in range(10)))
@@ -75,6 +77,14 @@ def test_cnn_mnist():
assert correct >= 9, correct
+def test_cnn_mnist_int8():
+ check_cnn_mnist(emlearn_cnn_int8, MNIST_MODEL_INT8)
+
+
+def test_cnn_mnist_fp32():
+ check_cnn_mnist(emlearn_cnn_fp32, MNIST_MODEL_FP32)
+
test_cnn_create()
-test_cnn_mnist()
+test_cnn_mnist_int8()
+test_cnn_mnist_fp32()