0630版本sdk更新
authorp15692025051 <846603105@qq.com>
Mon, 3 Jul 2023 09:06:34 +0000 (17:06 +0800)
committerp15692025051 <846603105@qq.com>
Mon, 3 Jul 2023 09:06:34 +0000 (17:06 +0800)
218 files changed:
2.sdk/Helios_SDK/components/GH301x/gh3011_example_port.c
2.sdk/Helios_SDK/components/audio/helios_audio_amr.c
2.sdk/Helios_SDK/components/audio/helios_audio_montage.c
2.sdk/Helios_SDK/components/audio/helios_audio_mp3.c
2.sdk/Helios_SDK/components/audio/helios_audio_py.c
2.sdk/Helios_SDK/components/poc/poc.c
2.sdk/Helios_SDK/components/poc/poc.h
2.sdk/Helios_SDK/components/poc/qs/inc/poc_interface.h
2.sdk/Helios_SDK/components/poc/qs/src/poc_qs_adaper.c
2.sdk/Helios_SDK/components/poc/slpoc/lib/broad.lib
2.sdk/Helios_SDK/components/poc/ydwl/inc/poc_ydwl_api.h
2.sdk/Helios_SDK/components/poc/ydwl/src/poc_ydwl_api.c
2.sdk/Helios_SDK/driver/lcd/qpy_lcd.c
2.sdk/Helios_SDK/main.py
2.sdk/Helios_SDK/peripheral/helios_flash.h
2.sdk/Helios_SDK/services/microPython/extmod/vfs.c
2.sdk/Helios_SDK/services/microPython/extmod/vfs_lfsx.c
2.sdk/Helios_SDK/services/microPython/extmod/vfs_lfsx_file.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/.pre-commit-config.yaml [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/README_pt_BR.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/_static/js/custom.js [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/bindings/cpp.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/bindings/index.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/bindings/micropython.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/os/freertos.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/os/index.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/os/nuttx.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/os/rt-thread.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/os/zephyr.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/arduino.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/cmake.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/espressif.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/index.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/nxp.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/pc-simulator.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/stm32.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/tasmota-berry.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/others/fragment.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/others/ime_pinyin.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/others/imgfont.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/others/msg.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/arm-2d.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/dma2d.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/index.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/pxp-vglite.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/sdl.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/sw.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/porting/timer-handler.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/cmsis-pack/LVGL.lvgl.8.3.7.pack [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/cmsis-pack/LVGL.pidx [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/rt-thread/squareline/README.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/rt-thread/squareline/SConscript [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/rt-thread/squareline/lv_ui_entry.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/rt-thread/squareline/ui/lvgl/lvgl.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/assets/emoji/F600.png [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/assets/emoji/img_emoji_F617.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/libs/freetype/Lato-Regular.ttf [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/lv_examples.mk [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/fragment/index.rst [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/fragment/lv_example_fragment.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/fragment/lv_example_fragment_1.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/fragment/lv_example_fragment_2.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/ime/index.rst [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/ime/lv_example_ime_pinyin.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/ime/lv_example_ime_pinyin_1.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/ime/lv_example_ime_pinyin_2.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/imgfont/index.rst [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/imgfont/lv_example_imgfont.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/imgfont/lv_example_imgfont_1.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/msg/index.rst [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/msg/lv_example_msg.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/msg/lv_example_msg_1.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/msg/lv_example_msg_2.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/msg/lv_example_msg_3.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/styles/lv_example_style_15.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/widgets/label/lv_example_label_5.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/widgets/label/lv_example_label_5.py [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/lv_conf_template.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/core/lv_obj.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/arm2d/lv_draw_arm2d.mk [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/arm2d/lv_gpu_arm2d.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/arm2d/lv_gpu_arm2d.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_layer.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_layer.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_transform.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_transform.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/lv_draw_nxp.mk [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_vglite_buf.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_vglite_buf.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_vglite_utils.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_vglite_utils.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/renesas/lv_draw_renesas.mk [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/renesas/lv_gpu_d2_draw_label.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sdl/lv_draw_sdl_layer.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sdl/lv_draw_sdl_layer.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_layer.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_transform.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/lv_extra.mk [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/fragment/README.md [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/fragment/lv_fragment.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/fragment/lv_fragment.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/fragment/lv_fragment_manager.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/ime/lv_ime_pinyin.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/ime/lv_ime_pinyin.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/imgfont/lv_imgfont.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/imgfont/lv_imgfont.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/msg/lv_msg.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/msg/lv_msg.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/misc/lv_timer.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/makefile/Makefile [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/makefile/test.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/ref_imgs/table_1.png [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_fs.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_line.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_mem.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_slider.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_table.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_textarea.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_files/readtest.txt [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/aLiYun.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/cellLocator.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_audio.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_queue.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/callbackdeal.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/callbackdeal.h
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/gccollect.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/locator.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/locator.h
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_extint.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_hw_spi.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_iic.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_key.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_keypad.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_pin.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_timer.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_uart.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/misc_power.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/misc_pwm.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modGsensor_SC7A20.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modHsensor_GH3018.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modaudio.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modcelllocator_qpy.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/moddatacall.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modexample.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modextgpio_aw9523.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modnet.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modpoc.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modsim.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modsocket.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modutime.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modwifilocator.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/mpconfigport.h
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/mpthreadport.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/quecpython.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/sensor_handmic_key.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/umqtt.py
2.sdk/Helios_SDK/services/microPython/py/gc.c
2.sdk/Helios_SDK/services/microPython/py/malloc.c
2.sdk/Helios_SDK/services/microPython/py/modthread.c
2.sdk/Helios_SDK/services/microPython/py/objmodule.c
2.sdk/Helios_SDK/services/microPython/py/runtime.c
2.sdk/Helios_SDK/services/microPython/py/scheduler.c
2.sdk/Helios_SDK/system/debug/helios_debug.h
2.sdk/Helios_SDK/system/fs/helios_python_fs.c
2.sdk/Helios_SDK/system/fs/helios_python_fs.txt [new file with mode: 0644]
2.sdk/Helios_SDK/system/hal/helios_audio.h
2.sdk/Helios_SDK/system/hal/helios_pin.h
2.sdk/Helios_SDK/system/hal/helios_uart.h
2.sdk/Helios_SDK/system/network/helios_nw.h
2.sdk/Helios_SDK/system/platform/platform.json
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/EventMesh.py
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/Makefile
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/alarm.py
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appAlipay.py
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appFactoryMode.py
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appWechat.py
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/lcd.py
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/main.py
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/mgr.py
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/protocol.py
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui.py
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui_WatchFaceScreen.py
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui_health.py
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui_main_menu.py
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui_setting.py
2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/mpconfigboard.h
2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/DBG.7z
2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip
2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/libHeliosAPI.lib
2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/ql_common_api.lib
2.sdk/project/K5/usr/main.py

index 2432105..1111214 100644 (file)
@@ -213,28 +213,28 @@ void gsensor_drv_get_fifo_data(ST_GS_DATA_TYPE gsensor_buffer[], uint16_t *gsens
        if(buffer_len > gsensor_max_len)
                buffer_len = gsensor_max_len;
        *gsensor_buffer_index = buffer_len;
-       // if(buffer_len)
-       // {
-       //      if(buffer_len < 25)
-       //      {
-       //         for(i = buffer_len; i < 25; i++)
-       //         {
-       //           gsensor_buffer[i].sXAxisVal = gsensor_buffer[buffer_len - 1].sXAxisVal;
-       //           gsensor_buffer[i].sYAxisVal = gsensor_buffer[buffer_len - 1].sYAxisVal;
-       //           gsensor_buffer[i].sZAxisVal = gsensor_buffer[buffer_len - 1].sZAxisVal;
-       //         }
-       //      }
-       //     else if(buffer_len > 25)
-       //     {
-       //        for(i = 25; i < buffer_len; i++)
-       //         {
-       //           gsensor_buffer[i].sXAxisVal = 0;
-       //           gsensor_buffer[i].sYAxisVal = 0;
-       //           gsensor_buffer[i].sZAxisVal = 0;
-       //         }
-       //      }
-       // }
-       // else
+       if(buffer_len)
+       {
+               if(buffer_len < 25)
+               {
+                  for(i = buffer_len; i < 25; i++)
+                  {
+                    gsensor_buffer[i].sXAxisVal = gsensor_buffer[buffer_len - 1].sXAxisVal;
+                    gsensor_buffer[i].sYAxisVal = gsensor_buffer[buffer_len - 1].sYAxisVal;
+                    gsensor_buffer[i].sZAxisVal = gsensor_buffer[buffer_len - 1].sZAxisVal;
+                  }
+               }
+           else if(buffer_len > 25)
+           {
+              for(i = 25; i < buffer_len; i++)
+                  {
+                    gsensor_buffer[i].sXAxisVal = 0;
+                    gsensor_buffer[i].sYAxisVal = 0;
+                    gsensor_buffer[i].sZAxisVal = 0;
+                  }
+               }
+       }
+       else
        {
        for(i = 0; i < 100; i++)
           {
@@ -272,7 +272,6 @@ void hal_gh30x_int_handler(void)
        //GH301x_LOG("hal_gh30x_int_handler !!!!!\r\n\r\n");
        //GH301x_LOG("hal_gh30x_int_handler :gpio[%d] int lvl:[%d]\r\n\r\n", HELIOS_GPIO2, Helios_GPIO_GetLevel(HELIOS_GPIO2));
     gh30x_int_msg_handler();
-       
 }
 
 /// gh30x int pin init, should config as rise edge trigger
index 19b6d9e..4691ea7 100644 (file)
@@ -99,7 +99,7 @@ static int amr_vm_deinit(void)
 }
 
 
-#if defined(PLAT_ASR_1803s)    || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC)
+#if defined(PLAT_ASR_1803s)    || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(PLAT_Unisoc_8850)
 static void __pcm_play_cb(void *handle, int event){
        AUDLOGE("__pcm_play_cb event[%d]\n",event);
 
@@ -151,7 +151,7 @@ static void amr_dec_task(void *arg)
                g_arm_stream_cxt.pcm_whdl = Helios_Aud_PWM_Open(CONFIG_AUDIO_PWM_PIN, 1, 8000, QL_PCM_WRITE_FLAG | QL_PCM_BLOCK_FLAG);
 #else
                g_arm_stream_cxt.pcm_whdl = Helios_PCM_Open(1, 8000, QL_PCM_WRITE_FLAG | QL_PCM_BLOCK_FLAG);
-#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1606) || defined(BOARD_EC600MCN_LF_SLPOC)
+#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(PLAT_Unisoc_8850)
                Helios_PCM_Play_Cb(g_arm_stream_cxt.pcm_whdl, __pcm_play_cb);
 #endif
 
@@ -171,7 +171,7 @@ static void amr_dec_task(void *arg)
                {
                        if (aud_play_cb)
                        {
-#if !defined(PLAT_ASR_1803s) && !defined(PLAT_ASR_1606) || defined(BOARD_EC600MCN_LF_SLPOC)
+#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC) && !defined(PLAT_Unisoc_8850)
                                aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_START);
 #endif
                        }
@@ -268,9 +268,15 @@ static void amr_dec_task(void *arg)
 #ifdef CONFIG_AUDIO_PWM
                Helios_Aud_PWM_Close(g_arm_stream_cxt.pcm_whdl);
 #else
-               Helios_PCM_Close(g_arm_stream_cxt.pcm_whdl);
+#if defined(PLAT_Unisoc_8850)
+               void Helios_aud_data_done(void);
+               Helios_aud_data_done();
 #endif
+#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC) && !defined(PLAT_Unisoc_8850)
+               Helios_PCM_Close(g_arm_stream_cxt.pcm_whdl);
                g_arm_stream_cxt.pcm_whdl = NULL;
+#endif
+#endif
                quec_wm_reset(&g_arm_stream_cxt.wm);
                g_arm_stream_cxt.is_playing = false;
                if (g_arm_stream_cxt.is_write_wait)
@@ -281,7 +287,7 @@ static void amr_dec_task(void *arg)
                {
                        if (aud_play_cb)
                        {
-#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC)
+#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC) && !defined(PLAT_Unisoc_8850)
                                aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_FINISHED);
 #endif
                        }
@@ -334,7 +340,11 @@ static int arm_dec_task_init()
        Helios_ThreadAttr attr = {0};
        attr.name = "amr_dec_task";
        attr.stack_size = 1024 * 6;
+#if defined(PLAT_EIGEN)
+       attr.priority = 90;
+#else
        attr.priority = 75;
+#endif
        attr.entry = amr_dec_task;
 
        g_arm_stream_cxt.task_ref = Helios_Thread_Create(&attr);
@@ -508,7 +518,6 @@ int helios_amr_file_start(char *file_name, cb_on_player aud_cb)
        unsigned int event = 0;
        
        QuecOSStatus quecstatus;
-
        memset(tmp, 0, sizeof(tmp));
 
        if (g_amr_file_cxt.is_playing)
index cfe2fb2..99f3094 100644 (file)
@@ -658,7 +658,11 @@ int Helios_Audio_MontageFilePlayStart(char *montage_name, char *file_name, Helio
     {
         attr.name = "audio_montage_play";
         attr.stack_size = 1024*2;
-        attr.priority = 74;
+#if defined(PLAT_EIGEN)
+       attr.priority = 90;
+#else
+       attr.priority = 74;
+#endif
         attr.entry = Helios_Montage_play_task;
 
         montage_play_task_id = Helios_Thread_Create(&attr);
index 54aa782..9cf345c 100644 (file)
@@ -86,7 +86,7 @@ static const int kBitrateV3[] = {
 
 
 
-#if defined(PLAT_ASR_1803s)    || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC)
+#if defined(PLAT_ASR_1803s)    || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(PLAT_Unisoc_8850)
 static void __pcm_play_cb(void *handle, int event){
        AUDLOGE("__pcm_play_cb event[%d]\n",event);
        
@@ -665,7 +665,7 @@ int Helios_play_stream_start(unsigned int rate, unsigned int ch, unsigned short
                mp3_pcm_whdl = Helios_Aud_PWM_Open(CONFIG_AUDIO_PWM_PIN, 1, rate, HELIOS_PCM_WRITE_FLAG | HELIOS_PCM_BLOCK_FLAG);
 #else
                mp3_pcm_whdl = Helios_PCM_Open(ch, rate, HELIOS_PCM_WRITE_FLAG | HELIOS_PCM_BLOCK_FLAG);
-#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC)
+#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(PLAT_Unisoc_8850)
                Helios_PCM_Play_Cb(mp3_pcm_whdl, __pcm_play_cb);
 #endif
 #endif
@@ -733,7 +733,7 @@ int Helios_mp3_dec(void)
 
        if (aud_play_cb)
        {
-#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC)
+#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC) && !defined(PLAT_Unisoc_8850)
                aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_START);
 #endif
        }
@@ -854,10 +854,14 @@ int Helios_mp3_dec(void)
                Helios_Aud_PWM_Close(mp3_pcm_whdl);
                mp3_pcm_whdl = NULL;
 #else
-#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC)
+#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC) && !defined(PLAT_Unisoc_8850)
                Helios_PCM_Close(mp3_pcm_whdl);
                mp3_pcm_whdl = NULL;
 #endif
+#if defined(PLAT_Unisoc_8850)
+               void Helios_aud_data_done(void);
+               Helios_aud_data_done();
+#endif
 #endif
                __jump_cnt = -1;
        }
@@ -868,7 +872,7 @@ int Helios_mp3_dec(void)
 
                if (aud_play_cb)
                {
-#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC)
+#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT) && !defined(BOARD_EC600MCN_LF_SLPOC) && !defined(PLAT_Unisoc_8850)
                        aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_FINISHED);
 #endif
                }
@@ -939,7 +943,12 @@ void Helios_mp3_stream_dec_task_init(void)
 {
        static int inited = 0;
        size_t mp3_stackSize = 1024 * 8;
+#if defined(PLAT_EIGEN)
+       int mp3_thread_priority = 95;
+#else
        int mp3_thread_priority = 75;
+#endif
+
 
        if (!inited)
        {
@@ -1290,7 +1299,7 @@ int Helios_mp3_file_start(char *file_name, cb_on_player aud_cb)
        {
                aud_play_cb = aud_cb;
        }
-#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC)
+#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(PLAT_Unisoc_8850)
        Helios_aud_stop_play_flag = 0;
 #endif
 
@@ -1361,6 +1370,8 @@ int Helios_mp3_file_start(char *file_name, cb_on_player aud_cb)
                    break;
                }
                Helios_Aud_fseek(fd, frame_length - 4, SEEK_CUR); // è·³è¿\87帧æ\95°æ\8d?
+               Helios_Aud_fseek(fd, frame_length - 4, SEEK_CUR); // è·³è¿\87帧æ\95°æ\9d?
+               Helios_Aud_fseek(fd, frame_length - 4, SEEK_CUR); // è·³è¿\87帧æ\95°ï¿??
                frame_count++;
            }
                AUDLOGD("jump size[%d],pos[%d],offset[%d]\n",pos + offset, pos, offset);
@@ -1383,7 +1394,7 @@ int Helios_mp3_file_start(char *file_name, cb_on_player aud_cb)
        while (1)
        {
                // memset(mp3_buf, 0, read_size);
-#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC)
+#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(PLAT_Unisoc_8850)
                if(Helios_aud_stop_play_flag){
                        break;
                }
@@ -1429,7 +1440,7 @@ int Helios_mp3_file_stop()
                AUDLOGE("error, mp3 is not playing\n");
                return -1;
        }
-#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT)        && !defined(BOARD_EC600MCN_LF_SLPOC)
+#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC600MCN_CC_EXT)        && !defined(BOARD_EC600MCN_LF_SLPOC) && !defined(PLAT_Unisoc_8850)
        Helios_aud_stop_play_flag = 1;
 #endif
 
@@ -1440,7 +1451,7 @@ int Helios_mp3_file_stop()
                Helios_msleep(15);
                count++;
        }
-#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC)
+#if defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(PLAT_Unisoc_8850)
        Helios_mp3_Clear_Cache();
 #endif
        AUDLOGD("mp3Stop finish");
index cdfb845..d2795e6 100644 (file)
@@ -716,7 +716,11 @@ static int helios_audio_play_morefiles(char *files, cb_on_player cb){
        if (strncmp(files, "mp3files=", 9) == 0)
        {
                is_play = 1;
+       #if CONFIG_AUDIO_MP3
                return helios_audio_mp3_play_morefiles(files, cb);
+       #else
+               return PLAY_MOREFILES_ERR_SINGLEFILE;
+       #endif
        }
        else if (strncmp(files, "amrfiles=", 9) == 0)
        {
@@ -810,7 +814,11 @@ static void __Helios_audio_file_play_task_init(void)
  {
         static int inited = 0;
         size_t audio_stackSize = 1024*2;
+#if defined(PLAT_EIGEN)
+        int audio_thread_priority = 95;
+#else
         int audio_thread_priority = 74;
+#endif
         
  
         if (!inited)
@@ -842,6 +850,7 @@ static void __Helios_audio_file_play_task_init(void)
  int Helios_Audio_FilePlayStart(char *file_name, Helios_AudPlayerType type, helios_cb_on_player usr_cb)
  {
         (void)type;
+        AUDLOGE("file[%s] release\n", file_name);
         play_user_cb = usr_cb;
         //ql_audio_play_init(helios_audio_play_callback);
        
@@ -935,7 +944,9 @@ void Helios_file_jump_frame(Helios_AudStreamFormat format, uint32_t cnt) {
        {
        case HELIOS_AUDIO_FORMAT_MP3:
                AUDLOGD("set mp3 jump frame[%d]\n", cnt);
+       #if CONFIG_AUDIO_MP3
                Helios_mp3_file_jump_frame(cnt);
+       #endif
                break;
        
        default:
index 33f3883..10c7bef 100644 (file)
@@ -187,6 +187,7 @@ static const poc_ops_t poc_ops = {
     .close_gps                  = py_qs_poc_close_gps,
     .upload_gps_data            = py_qs_poc_upload_gps_data,
     .get_gps_set_value          = py_qs_poc_get_gps_set_value,
+    .set_gps_value          = py_qs_poc_set_gps_value,
     .play_tts_request_location_permission    = py_qs_poc_play_tts_request_location_permission,
     .is_in_gps_information_ui   = py_qs_poc_is_in_gps_information_ui,
     .start_scan_wifi            = py_qs_poc_start_scan_wifi,
@@ -194,6 +195,8 @@ static const poc_ops_t poc_ops = {
     .upload_wifi_data           = py_qs_poc_upload_wifi_data,
     .send_heart_package         = py_qs_poc_send_heart_package,
     .set_tone_enable                   = py_qs_poc_pttTone_Switch,
+    .play_tone                                 = py_qs_poc_pttTone_play,
+    .set_tone_codecGain                        = py_qs_poc_pttTone_CodecGain,
     .set_dev_location_type      = py_qs_poc_set_dev_location_type,
 };
 
@@ -266,6 +269,8 @@ static const poc_ops_t poc_ops = {
     .record_get_state = py_ydwl_poc_record_get_state,
     .tts_init = py_ydwl_tts_init,
     .tts_play = py_ydwl_tts_play,
+    .set_vol = py_ydwl_set_volume,
+    .get_map_png = py_ydwl_poc_send_map_request,
 };
 
 #else 
index d224bd2..7c6a660 100644 (file)
@@ -97,6 +97,7 @@ typedef struct {
     int (*monitor_group)(poc_gid_t gid);
     int (*monitor_group_cancel)(poc_gid_t gid);
     int (*get_memberlist)(poc_gid_t gid, member_t** dst);
+    int (*get_map_png)(double lat, double lng, int w, int h);
 #endif
 
 #if defined(CONFIG_POC_ZZD) 
@@ -126,6 +127,8 @@ typedef struct {
 
 #if defined(CONFIG_POC_QS)
        int (*set_tone_enable)(int flags);
+    void (*play_tone)(void);
+       int (*set_tone_codecGain)(float dB);
 #endif
 
 
@@ -213,6 +216,7 @@ typedef struct {
     void (*close_gps)(void);
     void (*upload_gps_data)(double longitude,double latitude,double accuracy);
     int  (*get_gps_set_value)(void);
+    void (*set_gps_value)(int value);
     void (*play_tts_request_location_permission)(void);
     int  (*is_in_gps_information_ui)(void);
     void (*start_scan_wifi)(void);
@@ -237,8 +241,8 @@ typedef enum
 
 typedef enum
 {
-    TYPE_KEYPAD,
-       TYPE_GPIO,    
+       TYPE_GPIO = 1,
+    TYPE_KEYPAD,   
 }PTT_KEY_TYPE_T;
 
 typedef struct
@@ -249,15 +253,27 @@ typedef struct
 typedef struct
 {
        unsigned char gpio_num;
-       PTT_KEY_LEVEL_T level_press;
+       PTT_KEY_LEVEL_T level_press;//0:LOW 1:HIGH
 }PTT_GPIO_T;
 
-typedef struct
+
+typedef union 
 {
-    PTT_POC_SPEAK_MODE speak_deal_mode;
-       PTT_KEY_TYPE_T key_type;
        PTT_KEYPAD_T keypad_key_info;
        PTT_GPIO_T gpio_key_info;
+}KEY_INFO_E;
+
+
+typedef struct
+{    
+       PTT_POC_SPEAK_MODE speak_deal_mode;
+       unsigned char pressed;
+       struct
+       {    
+               PTT_KEY_TYPE_T key_type;
+               KEY_INFO_E key_info;
+       }key_cfg[5];
 }PTT_CFG_T;
+
 #endif 
 #endif
index 1eaedcd..84bf9bd 100644 (file)
@@ -97,7 +97,7 @@ typedef enum __LOCATION_TYPE_E{
 typedef struct QS_group_t
 {
        qs_uid_t                gid;            //群组ID
-       char            name[QS_NAME_LEN];              //群组�?
+       char            name[QS_NAME_LEN];              //群组�??
        QS_GROUP_TYPE   type;           //群组类型
        int                     index;
 } qs_group_t;
@@ -105,8 +105,8 @@ typedef struct QS_group_t
 typedef struct _qs_member_t {
        qs_uid_t uid;
        char name[QS_NAME_LEN];
-       int state; //1在线�?2,离线�?3在线在组
-       unsigned int prior;             ///< 优先�?
+       int state; //1在线�??2,离线�??3在线在组
+       unsigned int prior;             ///< 优先�??
        int index;
 }qs_member_t;
 
@@ -122,124 +122,124 @@ typedef void(*audio_cb)(int state,int uid,char *name,int flag);
 
 //mobileCountryCode : MCC  (Mobile Country Code): 国家代码,中国大陆的国家代码是 460
 extern volatile short mAppMobileCountryCode ;
-//mobileNetworkCode: MNC (Mobile Network Code): 运营商代码,00,02,07 �? 中国移动 , 01,06 �? 中国联�?
+//mobileNetworkCode: MNC (Mobile Network Code): 运营商代码,00,02,07 �?? 中国移动 , 01,06 �?? 中国联�?
 extern volatile char  mAppMobileNetworkCode;
 
-// locationAreaCode;// 4个字节,当前网络是中国移动或中国联通时:LAC (Location Area Code): 小区�?
+// locationAreaCode;// 4个字节,当前网络是中国移动或中国联通时:LAC (Location Area Code): 小区�??
 extern volatile int mLocationAreaCode;
 //cellTowerId;//4个字节,当前网络是中国移动或中国联通时:Cid(Cell Tower ID):基站Id
 extern volatile int mCellTowerId;
 
 typedef struct _WifiInformation {
     char            mac[6];//MAC(Medium/Media Access Control)地址,采用十六进制数表示,共六个字节(48位)
-    unsigned char   rssi;//wifi 信号强度,dBm的绝对值(范围0-255�?
+    unsigned char   rssi;//wifi 信号强度,dBm的绝对值(范围0-255�??
 }WifiInformation;
 
 //协议栈库的初始化
 void POC_Init(void);
 
-// 主线程,需要在里面挂起,不然程序会直接执行完成退�?
+// 主线程,需要在里面挂起,不然程序会直接执行完成退�??
 void POC_TaskRun(void);
 //获取后台协议栈的库文件的版本号,格式是vx.xx.xx,例如v1.0.1
-//char* pProtocolVersion : 传入传出参数,获取协议栈库版本号的指�?
-//int protocolVersionByteLength : 传入参数,获取协议栈库版本号的指针所指向的内存块的字节长�?
+//char* pProtocolVersion : 传入传出参数,获取协议栈库版本号的指�??
+//int protocolVersionByteLength : 传入参数,获取协议栈库版本号的指针所指向的内存块的字节长�??
 void POC_getProtocolVersion(char* pProtocolVersion,int protocolVersionByteLength);
-//     功能:设置登录的账号和密�?
-//               account 账号,以''\0“为结束符的字符�?
-//               password  密码,以''\0“为结束符的字符�?
+//     功能:设置登录的账号和密�??
+//               account 账号,以''\0“为结束符的字符�??
+//               password  密码,以''\0“为结束符的字符�??
 void POC_SetAccountAndPassword(const char* account, const char* password);
 //调用POC_SetAccountAndPassword,设置账号和密码后,才调用POC_Login进行登录操作
 void POC_Login(void);
 
 //将指定groupId的群组设置为当前群组
 void POC_setToCurrentGroup(unsigned int groupId);
-//终端主动发起单呼,建立临时群�?
+//终端主动发起单呼,建立临时群�??
 //unsigned int* memberUserId :  被叫方的用户id,从群组成员列表或者好友列表中获取用户id
-//int num �? 数组aUserId为单�? num为单呼人数,固定�?1�?
+//int num �?? 数组aUserId为单�?? num为单呼人数,固定�??1�??
 void POC_startSingleCall(unsigned int* memberUserId, int num,callmember_cb cb);
-//终端主动退出单呼,退出临时群�?
-//unsigned int isNeedSendExitReq :是否需要向服务器后台发送退出请求指令,一般情况下需要向服务器后台发送退出请求指�?
+//终端主动退出单呼,退出临时群�??
+//unsigned int isNeedSendExitReq :是否需要向服务器后台发送退出请求指令,一般情况下需要向服务器后台发送退出请求指�??
 void POC_endSingleCall(unsigned int isNeedSendExitReq);
 
 //用户按下ptt键后,开始发起呼叫,如果当前没有主动建立成功单呼,或者也没有被动建立成功单呼,那么当前就在群组呼叫状态,
-//进行的是群组呼叫,否则无论是主动建立成功单呼或被动建立成功单呼,当前就是进行的单�?
+//进行的是群组呼叫,否则无论是主动建立成功单呼或被动建立成功单呼,当前就是进行的单�??
 void POC_StartPTT(void);
 
 //ptt键弹起后,开始结束呼叫,如果当前没有主动建立成功单呼,或者也没有被动建立成功单呼,那么当前就在群组呼叫状态,
-//进行的是结束群组呼叫,否则无论是主动建立成功单呼或被动建立成功单呼,当前就是进行的结束单�?
+//进行的是结束群组呼叫,否则无论是主动建立成功单呼或被动建立成功单呼,当前就是进行的结束单�??
 void POC_EndPTT(void);
 //获取群组列表中群组的个数
 int POC_getGroupListCount(void);
 
-//获取单个群组的数�?
-//获取群组下标为groupIndex的群组信息,groupIndex�?0开始计数,小于POC_GroupCount群组总个�?
+//获取单个群组的数�??
+//获取群组下标为groupIndex的群组信息,groupIndex�??0开始计数,小于POC_GroupCount群组总个�??
 //unsigned int* pGroupId :群组的id,这个是从服务器后台获取的id数据 
-//int* pIsInTempGroup :当前是否正在进行临时群组,也就是当前在单呼状态,值为0:没有在进行临时群组;值为�?0:正在进行临时群�?,可能是主动建立成功单呼或者被动建立成功单�?
+//int* pIsInTempGroup :当前是否正在进行临时群组,也就是当前在单呼状态,值为0:没有在进行临时群组;值为�??0:正在进行临时群�??,可能是主动建立成功单呼或者被动建立成功单�??
 //unsigned char* pUtf8NameBuffer : 获取返回的utf8编码的群组名称的buffer
-//int utf8NameBufferByteLength : 获取返回的utf8编码的群组名称的buffer的字节长�?
+//int utf8NameBufferByteLength : 获取返回的utf8编码的群组名称的buffer的字节长�??
 void POC_getSingleGroupData(int groupIndex, unsigned int* pGroupId, int* pIsInTempGroup,unsigned char* pUtf8NameBuffer,int utf8NameBufferByteLength);
-//获取群组下标为groupIndex的群组成员总数,groupIndex�?0开始计数,小于POC_GroupCount群组总个�?
-//int groupIndex :groupIndex�?0开始计数,小于POC_GroupCount群组总个�?
+//获取群组下标为groupIndex的群组成员总数,groupIndex�??0开始计数,小于POC_GroupCount群组总个�??
+//int groupIndex :groupIndex�??0开始计数,小于POC_GroupCount群组总个�??
 //返回值:群组下标为groupIndex的群组成员总数
 int POC_getGroupMemberListCount(int groupIndex);
 
 //获取好友成员总数
 int POC_getFriendMemberListCount(void);
 
-//获取当前临时群组成员的数据,目前只支�?1个成员单呼,如果POC_getIsInTempGroup返回0,说明当前没有进行临时群组,没有主动建立成功单呼�?
-//也没有被动建立成功临时群�?,这个时候,本接口不会返回数据,只有POC_getIsInTempGroup返回�?0,才会返回数�?
+//获取当前临时群组成员的数据,目前只支�??1个成员单呼,如果POC_getIsInTempGroup返回0,说明当前没有进行临时群组,没有主动建立成功单呼�??
+//也没有被动建立成功临时群�??,这个时候,本接口不会返回数据,只有POC_getIsInTempGroup返回�??0,才会返回数�??
 //unsigned int* pMemberUserId :返回的成员id,这个是从服务器后台获取的id数据 
-//char* pMemberStatus:成员状态:1离线�?  3在此群组中(在线)�?
-//unsigned char* pUtf8MemberNameBuffer �? 获取返回的utf8编码的成员名称的buffer
-//int memberNameBufferByteLength : 获取返回的utf8编码的成员名称的buffer的字节长�?
+//char* pMemberStatus:成员状态:1离线�??  3在此群组中(在线)�?
+//unsigned char* pUtf8MemberNameBuffer �?? 获取返回的utf8编码的成员名称的buffer
+//int memberNameBufferByteLength : 获取返回的utf8编码的成员名称的buffer的字节长�??
 void POC_getSingleCallMemberData(unsigned int* pMemberUserId, char* pMemberStatus, unsigned char* pUtf8MemberNameBuffer,int utf8MemberNameBufferByteLength);
 
-//获取群组成员下标为groupMemberIndex的群组成员的数据,groupMemberIndex�?0开始计数,小于POC_GroupMemberListCount群组成员总个数,
-//int groupMemberIndex : 群组成员下标,groupMemberIndex�?0开始计数,小于POC_GroupMemberListCount群组成员总个�?
+//获取群组成员下标为groupMemberIndex的群组成员的数据,groupMemberIndex�??0开始计数,小于POC_GroupMemberListCount群组成员总个数,
+//int groupMemberIndex : 群组成员下标,groupMemberIndex�??0开始计数,小于POC_GroupMemberListCount群组成员总个�??
 //unsigned int* pMemberUserId :返回的成员id,这个是从服务器后台获取的id数据 
-//char* pMemberStatus:成员状态:1离线�?3在此群组中(在线)�?
-//unsigned char* pUtf8MemberNameBuffer �? 获取返回的utf8编码的成员名称的buffer
-//int utf8MemberNameBufferByteLength : 获取返回的utf8编码的成员名称的buffer的字节长�?
+//char* pMemberStatus:成员状态:1离线�??3在此群组中(在线)�?
+//unsigned char* pUtf8MemberNameBuffer �?? 获取返回的utf8编码的成员名称的buffer
+//int utf8MemberNameBufferByteLength : 获取返回的utf8编码的成员名称的buffer的字节长�??
 void POC_getSingleGroupMemberData(int groupMemberIndex, unsigned int* pMemberUserId, char* pMemberStatus, unsigned char* pUtf8MemberNameBuffer,int utf8MemberNameBufferByteLength);
-//获取好友成员下标为groupMemberIndex的好友成员的数据,groupMemberIndex�?0开始计数,小于POC_FriendMemberListCount好友成员总个数,
-//int groupMemberIndex : 好友成员下标,groupMemberIndex�?0开始计数,小于POC_FriendMemberListCount好友成员总个�?
+//获取好友成员下标为groupMemberIndex的好友成员的数据,groupMemberIndex�??0开始计数,小于POC_FriendMemberListCount好友成员总个数,
+//int groupMemberIndex : 好友成员下标,groupMemberIndex�??0开始计数,小于POC_FriendMemberListCount好友成员总个�??
 //unsigned int* pMemberUserId :返回的成员id,这个是从服务器后台获取的id数据 
-//char* pMemberStatus:成员状态:1离线�?  3在此群组中(在线)�?
-//unsigned char* pUtf8MemberNameBuffer �? 获取返回的utf8编码的成员名称的buffer
-//int utf8MemberNameBufferByteLength : 获取返回的utf8编码的成员名称的buffer的字节长�?
+//char* pMemberStatus:成员状态:1离线�??  3在此群组中(在线)�?
+//unsigned char* pUtf8MemberNameBuffer �?? 获取返回的utf8编码的成员名称的buffer
+//int utf8MemberNameBufferByteLength : 获取返回的utf8编码的成员名称的buffer的字节长�??
 void POC_getSingleFriendMemberData(int groupMemberIndex, unsigned int* pMemberUserId, char* pMemberStatus, unsigned char* pUtf8MemberNameBuffer,int utf8MemberNameBufferByteLength);
 
-//设置定位纬度和经度数�?
+//设置定位纬度和经度数�??
 //float latitude : 纬度, float longitude : 经度
 void POC_SetLatitudeAndLongitude(float latitude, float longitude);
 
 //获取GPS上传时间
 //返回值:返回秒数,如果返回0xFF,表示关闭GPS
 int POC_GetGpsIntervalTime(void);
-//     功能:平台返回一个或多个wifi ap信息,如果没有使用到wifi,请忽略这个接�?
-//     参数:unsigned char nWifi : wifi ap的个数,终端可以搜索到多个wifi ap,最多返�?8个,如果�?0,表示没有搜到wifi ap
+//     功能:平台返回一个或多个wifi ap信息,如果没有使用到wifi,请忽略这个接�??
+//     参数:unsigned char nWifi : wifi ap的个数,终端可以搜索到多个wifi ap,最多返�??8个,如果�??0,表示没有搜到wifi ap
 //     参数: WifiInformation **wifiInformations : 返回的wifi ap数组,如果为NULL,表示没有搜到wifi ap
 //    typedef struct _WifiInformation {
 //        char            mac[6];//MAC(Medium/Media Access Control)地址,采用十六进制数表示,共六个字节(48位)
-//        unsigned char   rssi;//wifi 信号强度,dBm的绝对值(范围0-255�?
+//        unsigned char   rssi;//wifi 信号强度,dBm的绝对值(范围0-255�??
 //    }WifiInformation;
 void POC_SetWifiInformation(unsigned char nWifiAp,WifiInformation **wifiInformations);
 //     功能:wifi上传时间间隔
 //     返回值:返回秒数
 int POC_GetWifiInformationInterval(void);
-//    功能:上传中国电信基站定位信�?
+//    功能:上传中国电信基站定位信�??
 //    参数:short mobileCountryCode : MCC  (Mobile Country Code): 国家代码,中国大陆的国家代码是 460
-//    参数:char mobileNetworkCode: MNC (Mobile Network Code): 运营商代�?,03,05 �? 中国电信
+//    参数:char mobileNetworkCode: MNC (Mobile Network Code): 运营商代�??,03,05 �?? 中国电信
 //    参数:short systemId : 当前网络是中国电信时,表示SID (System ID):系统标识号
-//    参数:    unsigned char   rssi;//LBS信号强度,dBm的绝对值(范围0-255�?
+//    参数:    unsigned char   rssi;//LBS信号强度,dBm的绝对值(范围0-255�??
 //    参数:    signed long int netWorkId;// 4个字节,当前网络是中国电信时:NID (Network ID):网络标识号
-//    参数:    signed long int baseStationId;// 4个字节,当前网络是中国电信时:BID(Base Station ID): 基站�?
+//    参数:    signed long int baseStationId;// 4个字节,当前网络是中国电信时:BID(Base Station ID): 基站�??
 void POC_SetChinaTelecom_BaseStationInformation(short mobileCountryCode,char mobileNetworkCode,short systemId, unsigned char  rssi,signed long int netWorkId,signed long int baseStationId);
-//    功能:上传中国移动或中国联通基站定位信�?
+//    功能:上传中国移动或中国联通基站定位信�??
 //    参数:short mobileCountryCode : MCC  (Mobile Country Code): 国家代码,中国大陆的国家代码是 460
-//    参数:char mobileNetworkCode: MNC (Mobile Network Code): 运营商代码,00,02,07 �? 中国移动 , 01,06 �? 中国联�?
-//    参数:    unsigned char   rssi;//LBS信号强度,dBm的绝对值(范围0-255�?
-//    参数:    signed long int locationAreaCode;// 4个字节,当前网络是中国移动或中国联通时:LAC (Location Area Code): 小区�?
+//    参数:char mobileNetworkCode: MNC (Mobile Network Code): 运营商代码,00,02,07 �?? 中国移动 , 01,06 �?? 中国联�?
+//    参数:    unsigned char   rssi;//LBS信号强度,dBm的绝对值(范围0-255�??
+//    参数:    signed long int locationAreaCode;// 4个字节,当前网络是中国移动或中国联通时:LAC (Location Area Code): 小区�??
 //    参数:    signed long int cellTowerId;//4个字节,当前网络是中国移动或中国联通时:Cid(Cell Tower ID):基站Id
 void POC_SetChinaMobileOrUnicom_BaseStationInformation(short mobileCountryCode,char mobileNetworkCode, unsigned char  rssi,signed long int locationAreaCode,signed long int cellTowerId);
 
@@ -250,7 +250,7 @@ unsigned int POC_GetActiveGroupId(void);
 const unsigned char* POC_GetActiveGroupName(void);
 
 int POC_getDeviceUserId(void);
-//获取本机账号昵称,以utf8编码的字符串,这块内存是由协议栈来维护,调用者不需释放这块内存,这个是从服务器后台获取的数�? 
+//获取本机账号昵称,以utf8编码的字符串,这块内存是由协议栈来维护,调用者不需释放这块内存,这个是从服务器后台获取的数�?? 
 const unsigned char* POC_GetAccountNickName(void);
 
 //获取当前登录状�?
@@ -260,8 +260,8 @@ const unsigned char* POC_GetAccountNickName(void);
 int POC_GetCurrentState(void);
 
 
-//     功能:日志开�? 日志文件�? /data/ptt_log.txt
-//     参数�?0表示关闭日志
+//     功能:日志开�?? 日志文件�?? /data/ptt_log.txt
+//     参数�??0表示关闭日志
 //               1表示打开日志
 //void POC_SetWriteLog(int type){
        //Log("type=%d", type);
@@ -274,11 +274,11 @@ int POC_GetCurrentState(void);
 void POC_SetNetworkType(int type);
 
 //    功能:获取对讲机是否可以使用好友功能
-//    返回值:1: 可以正常使用好友功能�?0: 不能使用好友功能
-//    备注: 好友功能禁止,用户进入好友列表,语音提醒“无法进入好友列表,网页请先勾选好友”,并且不进入好友列�?
+//    返回值:1: 可以正常使用好友功能�??0: 不能使用好友功能
+//    备注: 好友功能禁止,用户进入好友列表,语音提醒“无法进入好友列表,网页请先勾选好友”,并且不进入好友列�??
 int POC_getIsFriendEnable(void);
 
-//     获取登录的账号名�?,以utf8编码的字符串�?
+//     获取登录的账号名�??,以utf8编码的字符串�??
 //  unsigned char* account,用户传入的内存,获取登录的账号名称,以utf8编码的字符串
 //  unsigned int maxByteAccountName,account内存的字节长度,返回的内容不超过这个内存字节长度
 //     返回值:0成功 -1失败
@@ -290,7 +290,7 @@ int POC_GetLoginAccount(unsigned char* account, unsigned int maxByteAccountName)
 //在线:STATE_ONLINE 2  
 void POC_SetCurrentState(int state);
 
-//获取临时群组对方名称,也就是单呼时对方的名称,最大长�?20 * 2字节,以utf8编码的字符串,这块内存是由协议栈来维护,调用者不需释放这块内存,这个是从服务器后台获取的数�? 
+//获取临时群组对方名称,也就是单呼时对方的名称,最大长�??20 * 2字节,以utf8编码的字符串,这块内存是由协议栈来维护,调用者不需释放这块内存,这个是从服务器后台获取的数�?? 
 unsigned char* POC_GetSingleCallOtherSideName(void);
 
 //当前是否正在播放来话语音数据
@@ -299,112 +299,112 @@ unsigned int POC_GetIsPlayingAudio(void);
 //当前是否正在录音
 unsigned int POC_GetIsRecordingAudio(void);
 
-//获取对讲机是否有单呼功能,这个是从服务器后台获取的数�?
+//获取对讲机是否有单呼功能,这个是从服务器后台获取的数�??
 int POC_getIsSingleCallEnable(void);
-//获取是否已从服务器后台获取日期时间,并且已经将获取到的日期时间,设置为系统日期时�?
+//获取是否已从服务器后台获取日期时间,并且已经将获取到的日期时间,设置为系统日期时�??
 //返回值非0 :已从服务器后台获取日期时间,并且已经将获取到的日期时间,设置为系统日期时间
-//返回�?0:没有从服务器后台获取到日期时间,并且也没有将获取到的日期时间,设置为系统日期时�?
+//返回�??0:没有从服务器后台获取到日期时间,并且也没有将获取到的日期时间,设置为系统日期时�??
 int POC_getIsSetSystemTimeFromServer(void);
-//获取对讲机是否有定位功能,这个是从服务器后台获取的数�?
+//获取对讲机是否有定位功能,这个是从服务器后台获取的数�??
 int POC_getIsGpsEnable(void);
 //获取本机的通话等级,是否比正在接收语音的用户的通话等级高,
-//返回值非0 :本机的通话等级比正在接收语音的用户的通话等级�?
-//返回�?0:本机的通话等级,小于或者等于正在接收语音的用户的通话等级
+//返回值非0 :本机的通话等级比正在接收语音的用户的通话等级�??
+//返回�??0:本机的通话等级,小于或者等于正在接收语音的用户的通话等级
 int POC_getIsVoicePriorityHigh(void);
 //清除协议栈库中保存在本地的登录账号和密码
 void POC_cleanSavedAccountAndPassword(void);
 //获取当前是否是账号或密码错误
-//返回值非0 :当前是账号或密码错�?
-//返回�?0:当前没有账号或密码错误
+//返回值非0 :当前是账号或密码错�??
+//返回�??0:当前没有账号或密码错误
 int POC_getLoginFailAccountOrPassword(void);
 //获取当前是否是设备已暂停
 //返回值非0 :当前设备已暂停
-//返回�?0:当前没有设备已暂停
+//返回�??0:当前没有设备已暂停
 int POC_getIsDevicePaused(void);
 
-//获取当前是否正在从服务器后台接收语音数据�?
+//获取当前是否正在从服务器后台接收语音数据�??
 //返回值非0 :当前正在从服务器后台接收语音数据包
-//返回�?0:当前没有从服务器后台接收语音数据包
+//返回�??0:当前没有从服务器后台接收语音数据包
 unsigned char POC_GetIsReceivingAudioFrame(void);
-//发起从服务器后台获取群组列表数据的请�?
+//发起从服务器后台获取群组列表数据的请�??
 void POC_refreshGroupList(void);
 
-//发起从服务器后台获取当前群组成员数据的请�?
+//发起从服务器后台获取当前群组成员数据的请�??
 void POC_refreshGroupMemberList(void);
-//发起从服务器后台获取当前好友成员数据的请�?
+//发起从服务器后台获取当前好友成员数据的请�??
 void POC_refreshFriendMemberList(void);
-//获取协议栈库中保存的ptt是否按下的状态数�?
+//获取协议栈库中保存的ptt是否按下的状态数�??
 //返回值非0 :协议栈库中保存的ptt已经按下
-//返回�?0:协议栈库中保存的ptt没有按下
+//返回�??0:协议栈库中保存的ptt没有按下
 int POC_getIsPttPressed(void);
-//设置协议栈库中保存的ptt是否按下的状态数�?
-//int isPressed :�?0 :设置协议栈库中保存的ptt已经按下
+//设置协议栈库中保存的ptt是否按下的状态数�??
+//int isPressed :�??0 :设置协议栈库中保存的ptt已经按下
 //0:设置协议栈库中保存的ptt没有按下
 void POC_setIsPttPressed(int isPressed);
 //获取当前是否正在提示''未设置账号和密码''
-//返回值非0 :当前正在提�?''未设置账号和密码''
-//返回�?0:当前没有正在提�?''未设置账号和密码''
+//返回值非0 :当前正在提�??''未设置账号和密码''
+//返回�??0:当前没有正在提�??''未设置账号和密码''
 int POC_getIsNoUserNameOrPassword(void);
 //获取当前是否正在提示''账号或密码不正确''
-//返回值非0 :当前正在提�?''账号或密码不正确''
-//返回�?0:当前没有正在提�?''账号或密码不正确''
+//返回值非0 :当前正在提�??''账号或密码不正确''
+//返回�??0:当前没有正在提�??''账号或密码不正确''
 int POC_getIsLoginUserNameOrPasswordWrong(void);
 
 //boolean POC_getWriteLogToFileState(void){
 //     return log2FileEnable;
 //}
-//根据groupMemberId获取这个成员的名称,以utf8编码的字符串,这个是从服务器后台获取的数�? 
-//unsigned int groupMemberId �? 是群组成员的id,或者是好友成员的id,这个是从POC_getTempGroupMemberData,POC_getSingleGroupMemberData,POC_getSingleFriendMemberData,其中之一获取到MemberUserId
+//根据groupMemberId获取这个成员的名称,以utf8编码的字符串,这个是从服务器后台获取的数�?? 
+//unsigned int groupMemberId �?? 是群组成员的id,或者是好友成员的id,这个是从POC_getTempGroupMemberData,POC_getSingleGroupMemberData,POC_getSingleFriendMemberData,其中之一获取到MemberUserId
 //char* pUserNameUft8:获取返回的utf8编码的成员名称的buffer
-//int userNameUtf8ByteLength :获取返回的utf8编码的成员名称的buffer的字节长�?
+//int userNameUtf8ByteLength :获取返回的utf8编码的成员名称的buffer的字节长�??
 void POC_updateTailkerWithUserId(unsigned int groupMemberId,char* pUserNameUtf8,int userNameUtf8ByteLength);
-//获取当前是否正在临时群组,是否正在单�?
-//返回值非0 :当前正在临时群组,也就是正在单�?
-//返回�?0:当前没有正在临时群组,也就是没有正在单�?
+//获取当前是否正在临时群组,是否正在单�??
+//返回值非0 :当前正在临时群组,也就是正在单�??
+//返回�??0:当前没有正在临时群组,也就是没有正在单�??
 int POC_getIsInSingleCall(void);
-//设置协议栈库中的终端序列�?
+//设置协议栈库中的终端序列�??
 //char *pSource : 传入的系统序列号
 //int pSourceByteLength :传入的系统序列号的字节长度
 void POC_setSystemSerialNumber(char *pSource,int pSourceByteLength);
 //设置协议栈库中的IMEI
 //char *pSource : 传入的系统IMEI
-//int pSourceByteLength :传入的系统IMEI的字节长�?
+//int pSourceByteLength :传入的系统IMEI的字节长�??
 void POC_setSystemSystemIMEI(char *pSource,int pSourceByteLength);
 //设置协议栈库中的IMSI
 //char *pSource : 传入的系统IMSI
-//int pSourceByteLength :传入的系统IMSI的字节长�?
+//int pSourceByteLength :传入的系统IMSI的字节长�??
 void POC_setSystemSystemImsi(char *pSource,int pSourceByteLength);
 //设置协议栈库中的Iccid
 //char *pSource : 传入的系统Iccid
-//int pSourceByteLength :传入的系统Iccid的字节长�?
+//int pSourceByteLength :传入的系统Iccid的字节长�??
 void POC_setSystemSystemIccid(char *pSource,int pSourceByteLength);
 //获取socket的端口号
 unsigned short POC_getSocketIpPort(void);
 //获取socket的ip地址
 //char* pResult : 获取返回的ip地址的buffer
-//int resultByteLength:获取返回的ip地址的buffer的字节长�?
+//int resultByteLength:获取返回的ip地址的buffer的字节长�??
 void POC_getSocketIp(char* pResult,int resultByteLength);
 //获取协议栈库中的保存接收到socket数据的buffer,这块内存是由协议栈来维护,调用者不需释放这块内存
 unsigned char* POC_getReceiveSocketDataBufferPointer(void);
-//获取协议栈库中的保存接收到socket数据的buffer的字节长�?,这块内存是由协议栈来维护,调用者不需释放这块内存
+//获取协议栈库中的保存接收到socket数据的buffer的字节长�??,这块内存是由协议栈来维护,调用者不需释放这块内存
 unsigned int POC_getReceiveSocketDataBufferByteLength(void);
-//获取是否有其他终端,以本机的账号和密码登录到服务器后�?
+//获取是否有其他终端,以本机的账号和密码登录到服务器后�??
 //返回值非0 :已经有其他终端,以本机的账号和密码登录到服务器后台
-//返回�?0:没有其他终端,以本机的账号和密码登录到服务器后�?
+//返回�??0:没有其他终端,以本机的账号和密码登录到服务器后�??
 int POC_getIsOtherDeviceLoginWithSameAccount(void);
 //发送录音语音数据包
 void POC_SendMListData(char* pAmrData,int amrDataLength);
 //一次性发送心跳包
 void POC_SendHeartPackageWithoutTimer(void);
-//协议栈库处理收到的socket数据�?
+//协议栈库处理收到的socket数据�??
 void POC_handleSocketPackage(int wParam, int dwParam);
-//停止获取登录ip和端口的定时�?
+//停止获取登录ip和端口的定时�??
 void POC_stopGetIpAndPortProcessTimer(void);
-//开始发送登录请�?
+//开始发送登录请�??
 void POC_startSetUpUdpConnect(void);
 //在恢复出厂值过程中,删掉协议栈的产生的文件
 void POC_clearProtocolDataForFactory(void);
-//向服务器后台发送退出登录请�?
+//向服务器后台发送退出登录请�??
 void POC_sendLogOutRequest(void);
 //设置登录成功后是否播放登录成功的tts,此接口只是修改内部变量,没有保存到nv
 void POC_setLoginSuccessTts(unsigned char b);
@@ -412,12 +412,12 @@ void POC_setLoginSuccessTts(unsigned char b);
 int POC_getIsInGetIpAndPortProcess(void);
 //屏幕由灭屏状态,用户任意键后,屏幕变换为点亮状�?
 void POC_onScreenFromClosedToOpened(void);
-//终端是被叫单呼,并且已经建立单呼成功后,协议栈库会回调这个接口,终端在回调中,去更新主叫单呼的名�?
-//unsigned char *otherSideName : 临时群组对方名称,也就是单呼时对方的名称,最大长�?20 * 2字节,以utf8编码的字符串,这块内存是由协议栈来维护,调用者不需释放这块内存,这个是从服务器后台获取的数�? 
+//终端是被叫单呼,并且已经建立单呼成功后,协议栈库会回调这个接口,终端在回调中,去更新主叫单呼的名�??
+//unsigned char *otherSideName : 临时群组对方名称,也就是单呼时对方的名称,最大长�??20 * 2字节,以utf8编码的字符串,这块内存是由协议栈来维护,调用者不需释放这块内存,这个是从服务器后台获取的数�?? 
 void Device_AfterInactiveSingleCall(unsigned char *otherSideName);
-//打印版本的编译时间,ota升级时,会使用编译时间这个数�?
+//打印版本的编译时间,ota升级时,会使用编译时间这个数�??
 void POC_printfOTABuildTime(void);
-//根据输入的日期时间,获取时间�?
+//根据输入的日期时间,获取时间�??
 unsigned int POC_getUTCSeconds(        unsigned int nYear,unsigned int nMonth ,unsigned int nDay,unsigned int nHour,unsigned int nMin,unsigned int nSec);
 
 void POC_register_join_group_cb(join_group_cb callback_cb );
@@ -440,6 +440,7 @@ void Device_open_gps(void);
 void Device_close_gps(void);
 void Device_upload_gps_data(double longitude,double latitude,double accuracy);
 int Device_getGpsSettingValue(void);
+void Device_changeGpsSetting(int value);
 void Device_PlayTts_request_location_permission(void);
 int Device_isInGpsInformationUI(void);
 void Device_updateNetworkMccMncLacCIdInformation(
@@ -453,7 +454,8 @@ void Device_uploadWifiData(char* pLocationWifiMac32bytesArray,int locationWifiMa
 void Device_restartHeartTimerAndSendHeartPackage(void);
 
 void Device_PTTtone_switch(int onoff);
-
+void Device_PTTtone_play(void);
+int Device_PTTtone_CodecGain(float dB);
    
 void Device_quec_set_location_support_type(LOCATION_TYPE location_type,int is_enable);
 void py_qs_poc_init(init_cb cb);
@@ -498,6 +500,7 @@ void  py_qs_poc_open_gps(void);
 void  py_qs_poc_close_gps(void);
 void  py_qs_poc_upload_gps_data(double longitude,double latitude,double accuracy);
 int   py_qs_poc_get_gps_set_value(void);
+void  py_qs_poc_set_gps_value(int value);
 void  py_qs_poc_play_tts_request_location_permission(void);
 int   py_qs_poc_is_in_gps_information_ui(void);
 void  py_qs_poc_start_scan_wifi(void);
@@ -505,6 +508,7 @@ void  py_qs_poc_update_network_mcc_mnc_lac_cid_infomation(int *pMobileCountryCod
 void  py_qs_poc_upload_wifi_data(char* pLocationWifiMac32bytesArray,int locationWifiMac32bytesArrayBytesLength,        int* pLocationWifiRssiArray,int locationWifiRssiArrayBytesLength,int locationWifiMacCount);
 void  py_qs_poc_send_heart_package(void);
 void  py_qs_poc_pttTone_Switch(int onoff);
-
+void  py_qs_poc_pttTone_play(void);
+int  py_qs_poc_pttTone_CodecGain(float dB);
 void  py_qs_poc_set_dev_location_type(LOCATION_TYPE location_type,int is_enable);
 #endif
index 6ac8fd1..ea3686e 100644 (file)
@@ -421,6 +421,9 @@ void  py_qs_poc_upload_gps_data(double longitude,double latitude,double accuracy
 int  py_qs_poc_get_gps_set_value(void){
     return Device_getGpsSettingValue();
 }
+void py_qs_poc_set_gps_value(int value){
+    Device_changeGpsSetting(value);
+}
 void  py_qs_poc_play_tts_request_location_permission(void){
     return Device_PlayTts_request_location_permission();
 }
@@ -447,6 +450,16 @@ void  py_qs_poc_pttTone_Switch(int onoff)
 {
     return Device_PTTtone_switch(onoff);
 }
+void  py_qs_poc_pttTone_play(void)
+{
+    Device_PTTtone_play();
+}
+
+int  py_qs_poc_pttTone_CodecGain(float dB)
+{
+    return Device_PTTtone_CodecGain(dB);
+}
+
 void  py_qs_poc_set_dev_location_type(LOCATION_TYPE location_type,int is_enable){
     return Device_quec_set_location_support_type(location_type,is_enable);
 }
index b612032..0faa55e 100644 (file)
Binary files a/2.sdk/Helios_SDK/components/poc/slpoc/lib/broad.lib and b/2.sdk/Helios_SDK/components/poc/slpoc/lib/broad.lib differ
index 525de5f..362256e 100644 (file)
@@ -230,5 +230,7 @@ int py_ydwl_poc_record_stop_play(void);
 record_state_e py_ydwl_poc_record_get_state(void);
 void py_ydwl_tts_init(ydwl_tts_cb_type usr_cb);
 void py_ydwl_tts_play(const char* string, unsigned int len);
+int py_ydwl_set_volume(int type, int vol);
+int py_ydwl_poc_send_map_request(double lat, double lng, int w, int h);
 
 #endif // __POC_YDWL_API_H__
index 19aeed0..b18e05e 100644 (file)
@@ -81,7 +81,7 @@ unsigned char ucRecordSel;
 
 Helios_MsgQ_t ydwl_msg_queue_t = 0;
 Helios_Sem_t ydwl_weather_sem = 0;
-Helios_Sem_t ydwl_record_sem = 0;
+Helios_MsgQ_t ydwl_map_queue = 0;
 
 #define AT_BUF_SIZE                            512
 #define POC_AT_NET_PORT                        10086
@@ -381,16 +381,16 @@ static void group_list_handler(char *data, int len, int flag)
         //group id trans
         memcpy(group_id_char, data+17, 8);
         ydwl_group[group_index].gid = (ydwl_gid_t)hex2dec(group_id_char);
-        ydwl_poc_debug("add num.%d group id :%s,%d\n", group_index, group_id_char, ydwl_group[group_index].gid);
+        //ydwl_poc_debug("add num.%d group id :%s,%d\n", group_index, group_id_char, ydwl_group[group_index].gid);
 
         //group name trans
-        group_name_char = malloc(len-29);
+        group_name_char = malloc(len);
         if (group_name_char == NULL) {
             printf("group_name_char malloc failed.");
             return;
         }
-        memset(group_name_char, 0, len-29);
-        memcpy(group_name_char, data+29, len-29);
+        memset(group_name_char, 0, len);
+        memcpy(group_name_char, data+29, len-30);
 
         unsigned char *group_name_hex = NULL;
         group_name_hex = malloc(strlen(group_name_char)/2);
@@ -402,8 +402,8 @@ static void group_list_handler(char *data, int len, int flag)
 
         unsigned short *hex = group_name_hex;
 
-        unicode2utf8((unsigned char *)hex, strlen(group_name_char)/2, ydwl_group[group_index].name, YDWL_NAME_LEN);
-        ydwl_poc_debug("add num.%d group name :%s,decode name is %s\n", group_index, group_name_char, ydwl_group[group_index].name);
+        int ret = unicode2utf8((unsigned char *)hex, strlen(group_name_char)/2, ydwl_group[group_index].name, YDWL_NAME_LEN);
+        ydwl_poc_debug("ret:%d, len:%d, add num.%d group name :%s,decode name is %s\n", ret, strlen(group_name_char), group_index, group_name_char, ydwl_group[group_index].name);
 
         ydwl_group[group_index].index = group_index;
 
@@ -836,6 +836,16 @@ static int ydwl_poc_cmd_notify(char *data, int len, ENUM_MSG_TYPE type)
        else if(strncmp(data, "+POC:9600", 9) == 0)
        {
                
+       }
+    else if(strncmp(data, "+POC:9700", 9) == 0) // receive map png
+       {
+               uint8_t msg = 1;
+        Helios_MsgQ_Put(ydwl_map_queue, (void *)&msg, sizeof(uint8_t), HELIOS_WAIT_FOREVER);
+       }
+    else if(strncmp(data, "+POC:9701", 9) == 0) // receive map png fail
+       {
+               uint8_t msg = 0;
+        Helios_MsgQ_Put(ydwl_map_queue, (void *)&msg, sizeof(uint8_t), HELIOS_WAIT_FOREVER);
        }
     else if (strncmp(data, "+POC:720000", 11) == 0) //record state
     {
@@ -1203,15 +1213,6 @@ int py_ydwl_poc_record_onoff(boolean enable) {
     return ret;
 }
 
-// This interface is no longer used
-// int py_ydwl_poc_record_clear(void) {
-//     int ret = 0;
-//     char *cmd = "AT+POC=67000000\r\n";
-//     ydwl_poc_debug("cmd: %s,cmd len is %d\n",cmd,strlen(cmd));
-//     ret = ydwl_poc_cmd_write(cmd, strlen(cmd));
-//     return ret;
-// }
-
 static int record_folder_handle(void)
 {
     QDIR *pSdRoot = NULL;
@@ -1447,14 +1448,6 @@ int py_ydwl_poc_record_stop_play(void) {
     return ret;
 }
 
-// This interface is no longer used
-// int py_ydwl_poc_record_save_flash(void) {
-//     int ret = 0;
-//     char *cmd = "AT+POC=66000000\r\n";
-//     ydwl_poc_debug("cmd: %s,cmd len is %d\n",cmd,strlen(cmd));
-//     ret = ydwl_poc_cmd_write(cmd, strlen(cmd));
-//     return ret;
-// }
 
 record_state_e py_ydwl_poc_record_get_state(void) {
     return record_state;
@@ -1477,6 +1470,38 @@ void py_ydwl_poc_register_notify_spker_cb(notify_spker_cb cb) {
     notify_spker_callback = cb;
 }
 
+int py_ydwl_poc_send_map_request(double lat, double lng, int w, int h) {
+    int i, j;
+       char cCmd[128] = {0};
+    char cTmpDat[64] = {0};
+    memset(cCmd, 0, sizeof(cCmd));
+    sprintf(cTmpDat, "%lf,%lf,%d,%d",lat,lng,w,h);
+    strcat(cCmd, "AT+POC=160000");
+    j = strlen(cCmd);
+    i = 0;
+    while (cTmpDat[i])
+    {
+        cCmd[j++] = char_to_ascii(cTmpDat[i]>>4);
+        cCmd[j++] = char_to_ascii(cTmpDat[i]&0x0f);
+        i++;
+    }
+    cCmd[j++] = '\r';
+    cCmd[j++] = '\n';
+    
+    ydwl_poc_debug("cmd: %s,cmd len is %d\n", cCmd, strlen(cCmd));
+    ydwl_poc_cmd_write(cCmd, strlen(cCmd));
+    uint8_t msg = 0;
+    int ret = -1;
+    if(Helios_MsgQ_Get(ydwl_map_queue, &msg, sizeof(uint8_t), 10000) == 0) {
+        if (msg == 1) {
+            ret = 0;
+        }
+    }
+    
+    ydwl_poc_debug("get map ret: %d", ret);
+    return ret;
+}
+
 int ydwl_poc_cmd_write(char *pCmd, long Leng)
 {
        ydwl_poc_debug("---->Mcu Send At:%s \r\n", pCmd);
@@ -1573,6 +1598,7 @@ int mcu_at_recv_thread_create(void)
 
 void py_ydwl_poc_init(init_cb cb)
 {
+    static int retry_cnt = 50;
     init_callback = cb;
     if(ydwl_poc_is_init == 1)
     {
@@ -1604,12 +1630,12 @@ void py_ydwl_poc_init(init_cb cb)
                }
        }
        
-       if (ydwl_record_sem == 0) 
+       if (ydwl_map_queue == 0) 
        {
-               ydwl_record_sem = Helios_Semaphore_Create(1, 0);
-               if (!ydwl_record_sem)
+               ydwl_map_queue = Helios_MsgQ_Create(10, sizeof(unsigned char));
+               if (!ydwl_map_queue)
         {
-            ydwl_poc_debug("create record sem error.");
+            ydwl_poc_debug("create map queue error.");
                }
        }
 
@@ -1620,9 +1646,10 @@ void py_ydwl_poc_init(init_cb cb)
        {
                ydwl_poc_cmd_write((char*)"CONNECT", strlen("CONNECT"));
         Helios_msleep(200);
-       }while(!ucMcuReady);
+        retry_cnt--;
+       }while(!ucMcuReady && retry_cnt>0);
        
-    if(ret != 0)
+    if(ret != 0 || (ucMcuReady == 0))
     {
         ydwl_poc_debug("ydwl init error");
     }
@@ -1642,4 +1669,18 @@ void py_ydwl_tts_play(const char* string, unsigned int len) {
     Helios_ydwl_tts_play(string, len);
 }
 
-
+int py_ydwl_set_volume(int type, int vol) {
+    int ret;
+    if (vol > 11) {
+        ydwl_poc_debug("invalid value, volume should be array between [0,11]");
+        return -1;
+    }
+    if (vol >= 9) {
+        ret = Helios_TTS_SetVolume(9);
+    }
+    else {
+        ret = Helios_TTS_SetVolume(vol);
+    }
+    ret = Helios_Audio_SetVolume(2, vol);
+    return ret;
+}
index 3f81864..bd03792 100644 (file)
@@ -16,6 +16,8 @@
 Helios_Mutex_t spi_lcd_write_mutex = 0;
 static uint16_t *lcd_write_buff = NULL;
 
+static uint8_t fstn_invalid_type = 1;
+
 #define QPY_LCD_LOG(msg, ...) custom_log("QPYlcd", msg, ##__VA_ARGS__)
 
 #define XSTART_H 0xf0
@@ -236,6 +238,10 @@ static int QPY_LCDInvalidDataHand(char *inavlid_data, size_t length)
         else
         {
             lcd_invaild_recv[invaid_cur_temp].value = invalid_data_temp[i++];
+            if (HELIOS_LCD_TYPE_FSTN == QPY_LCDStruct.type && lcd_invaild_recv[invaid_cur_temp].value == 0xB4)
+            {
+                fstn_invalid_type = 2;
+            }
         }
         invaid_cur_temp++;
     }
@@ -641,8 +647,24 @@ static int QPY_SPILCD_Write_Data_Fstn(void *buf, size_t len)
     // }
     // Helios_Mutex_Lock(spi_lcd_write_mutex, HELIOS_WAIT_FOREVER);
     uint8_t reg1[] = {0x40};
-    uint8_t reg2[] = {0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7};
-    uint8_t reg3[] = {0x10,0x00};
+    uint8_t reg2[8] = {0};
+    uint8_t reg3[2] = {0};
+
+    if (fstn_invalid_type == 1) 
+    {
+        uint8_t reg2_tmp[] = {0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7};
+        uint8_t reg3_tmp[] = {0x10, 0x00};
+        memcpy(reg2, reg2_tmp, sizeof(reg2_tmp));
+        memcpy(reg3, reg3_tmp, sizeof(reg3_tmp));
+    }
+    //ka'er customer fstn
+    else 
+    {
+        uint8_t reg2_tmp[] = {0xB4, 0xB5, 0xB6, 0xB7, 0xB0, 0xB1, 0xB2, 0xB3};
+        uint8_t reg3_tmp[] = {0x10, 0x01};
+        memcpy(reg2, reg2_tmp, sizeof(reg2_tmp));
+        memcpy(reg3, reg3_tmp, sizeof(reg3_tmp));
+    }
     uint8_t reg4[] = {0xAF};
 
     uint8_t i;
index 4f70a8b..29669d0 100644 (file)
@@ -25,7 +25,7 @@ argv = sys.argv
 argc = len(argv)
 error_occurred = False
 
-build_log_dir = 'output/log'
+build_log_dir = 'opt/log'
 build_log_file = 'build.log'
 platform_json = 'system/platform/platform.json'
 
index e2fd751..cbac65a 100644 (file)
@@ -40,6 +40,7 @@ int Helios_Flash_Read(uint32_t addr, void *buffer, size_t size);
 int Helios_Flash_Erase(uint32_t addr, size_t size);
 #if defined(PLAT_ASR_1606)
 int Helios_External_Flash_Read(int port, uint32_t addr, void *buffer, size_t size);
+void *Helios_lfs_mutexlock_get(char *patition_name);
 #endif
 
 #if defined(BOARD_EC600MCN_CC_EXT)
index ceeb6c4..cd9d782 100644 (file)
@@ -112,6 +112,7 @@ mp_vfs_mount_t *mp_vfs_lookup_path(const char *path, const char **path_out) {
     *path_out = path;
     return MP_STATE_VM(vfs_cur);
 }
+#include "debug.h"
 #if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
 void get_vfs_path(const char* base_path, char* dsc_path) {
     char *p_out = NULL;
@@ -141,6 +142,7 @@ void get_vfs_path(const char* base_path, char* dsc_path) {
             {
                 sprintf(dsc_path, "%s%s", letter, p_out);
             }else {
+                assert(0);
                 mp_vfs_log("letter is NULL\n");
                 return;
             }
index ff4db35..2750bf8 100644 (file)
@@ -132,7 +132,14 @@ STATIC void MP_VFS_LFSx(init_config)(MP_OBJ_VFS_LFSx * self, mp_obj_t bdev, size
     config->erase = MP_VFS_LFSx(dev_erase);
     config->sync = MP_VFS_LFSx(dev_sync);
 #if MICROPY_QPY_MODULE_VFS_THREADSAFE
+#if defined (QUECTEL_PY_LFS1)
+    QUEC_QPY_LFS_LOG("lfs get mutex with %s\r\n", self->partition_name);
+    self->vfs_lfs_mutex = (Helios_Mutex_t)Helios_lfs_mutexlock_get(self->partition_name);
+#else
+    QUEC_QPY_LFS_LOG("lfs creat mutex\r\n");
     self->vfs_lfs_mutex = Helios_Mutex_Create();//Mark.Zhu@20230405 add for vfs_lfs threadsafe
+#endif    
+    QUEC_QPY_LFS_LOG("vfs lfs thread safe mutex %x\r\n", self->vfs_lfs_mutex);
 #endif
 
 #if defined (QUECTEL_PY_LFS1) || defined (QUECTEL_PY_LFS2)
@@ -144,10 +151,10 @@ STATIC void MP_VFS_LFSx(init_config)(MP_OBJ_VFS_LFSx * self, mp_obj_t bdev, size
     self->lfs = (LFSx_API(t) *)(FlashPartiCtx->lfs_kernel);//forrest.liu@20220309 add for ASR1601 platform pythonSDK use same lfs handle as kernel
     if (self->lfs == NULL)
     {
-        QUEC_QPY_LFS_LOG("No lfs handle in kernal with %s", self->partition_name);
+        QUEC_QPY_LFS_LOG("No lfs handle in kernal with %s\r\n", self->partition_name);
         mp_raise_OSError(19);
     }
-       QUEC_QPY_LFS_LOG("init_config...lfs_kernel = 0x%x", self->lfs);
+       QUEC_QPY_LFS_LOG("init_config...lfs_kernel = 0x%x\r\n", self->lfs);
 #endif
     uint32_t FlashPartiAddr = FlashPartiCtx->addr;
     size_t FlashPartiSize = FlashPartiCtx->size;
@@ -286,10 +293,12 @@ STATIC mp_obj_t MP_VFS_LFSx(make_new)(const mp_obj_type_t * type, size_t n_args,
                        QUEC_QPY_LFS_LOG("format fail! ret = %d", ret);
 
 #if MICROPY_QPY_MODULE_VFS_THREADSAFE//Mark.Zhu@20230405 add for vfs_lfs threadsafe
+#if !defined (QUECTEL_PY_LFS1)
             if(self->vfs_lfs_mutex)
             {
                 Helios_Mutex_Delete(self->vfs_lfs_mutex);
             }
+#endif            
 #endif           
                        mp_raise_OSError(-ret);
                }
@@ -300,10 +309,12 @@ STATIC mp_obj_t MP_VFS_LFSx(make_new)(const mp_obj_type_t * type, size_t n_args,
                QUEC_QPY_LFS_LOG("mount again fail! ret = %d", ret);
 
 #if MICROPY_QPY_MODULE_VFS_THREADSAFE//Mark.Zhu@20230405 add for vfs_lfs threadsafe
+#if !defined (QUECTEL_PY_LFS1)
         if(self->vfs_lfs_mutex)
         {
             Helios_Mutex_Delete(self->vfs_lfs_mutex);
         }
+#endif        
 #endif              
         mp_raise_OSError(-ret);
     }
@@ -381,10 +392,12 @@ STATIC mp_obj_t MP_VFS_LFSx(mkfs)(size_t n_args, const mp_obj_t *pos_args, mp_ma
     int ret = LFSx_API(format)(self.lfs, &self.config);
     if (ret < 0) {
 #if MICROPY_QPY_MODULE_VFS_THREADSAFE//Mark.Zhu@20230405 add for vfs_lfs threadsafe
+#if !defined (QUECTEL_PY_LFS1)
         if(self->vfs_lfs_mutex)
         {
             Helios_Mutex_Delete(self->vfs_lfs_mutex);
         }
+#endif        
 #endif          
         mp_raise_OSError(-ret);
     }
@@ -446,9 +459,9 @@ STATIC mp_obj_t mp_vfs_deinit(mp_obj_t self_in)
        MP_VFS_LFSx(ilistdir_it_t) * self = MP_OBJ_TO_PTR(self_in);
        if ((self->vfs != NULL) && (self->vfs->lfs != NULL))
        {
-        HELIOS_VFS_LFS_MUTEX_LOCK(self->vfs);
+        //HELIOS_VFS_LFS_MUTEX_LOCK(self->vfs);  //Start ===> Deleted by freddy.li because function __del__ can not release mutex of GIL
        LFSx_API(dir_close)(self->vfs->lfs, &self->dir);
-        HELIOS_VFS_LFS_MUTEX_UNLOCK(self->vfs);
+        //HELIOS_VFS_LFS_MUTEX_UNLOCK(self->vfs); // End
        }
     //MOD_VFS_LOG("--------mp_vfs_deinit----------2");   
        return mp_obj_new_int(0);
@@ -768,11 +781,13 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(MP_VFS_LFSx(umount_obj), MP_VFS_LFSx(umount));
 #if MICROPY_QPY_MODULE_VFS_THREADSAFE
 STATIC mp_obj_t MP_VFS_LFSx(delete)(mp_obj_t self_in) {
     MP_OBJ_VFS_LFSx *self = MP_OBJ_TO_PTR(self_in);
+#if !defined (QUECTEL_PY_LFS1)
     if(self->vfs_lfs_mutex)
     {
         Helios_Mutex_Delete(self->vfs_lfs_mutex);
         QUEC_QPY_LFS_LOG("vfs lfs mutex delete");
     }
+#endif
     return mp_const_none;
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(MP_VFS_LFSx(delete_obj), MP_VFS_LFSx(delete));
index 1f5bbe4..c158119 100644 (file)
@@ -248,6 +248,22 @@ STATIC mp_uint_t MP_VFS_LFSx(file_ioctl)(mp_obj_t self_in, mp_uint_t request, ui
     }
 }
 
+STATIC mp_obj_t MP_VFS_LFSx(file___del__)(mp_obj_t self_in) {
+    MP_OBJ_VFS_LFSx_FILE *self = MP_OBJ_TO_PTR(self_in);
+    
+    if (self->vfs == NULL) {
+        return mp_const_none;
+    }
+
+    int res = LFSx_API(file_close)(self->vfs->lfs, &self->file);
+    self->vfs = NULL; // indicate a closed file
+    if (res < 0) {
+        mp_raise_OSError(-res);
+    }
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(MP_VFS_LFSx(file___del___obj), MP_VFS_LFSx(file___del__));
+
 STATIC mp_obj_t MP_VFS_LFSx(file_make_new)(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
     enum { ARG_file, ARG_mode};
     static const mp_arg_t allowed_args[] = {
@@ -289,7 +305,7 @@ STATIC const mp_rom_map_elem_t MP_VFS_LFSx(file_locals_dict_table)[] = {
     { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_stream_close_obj) },
     { MP_ROM_QSTR(MP_QSTR_seek), MP_ROM_PTR(&mp_stream_seek_obj) },
     { MP_ROM_QSTR(MP_QSTR_tell), MP_ROM_PTR(&mp_stream_tell_obj) },
-    { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mp_stream_close_obj) },
+    { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&MP_VFS_LFSx(file___del___obj)) },
     { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&mp_identity_obj) },
     { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&MP_VFS_LFSx(file___exit___obj)) },
 };
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/.pre-commit-config.yaml b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/.pre-commit-config.yaml
new file mode 100644 (file)
index 0000000..9d8088a
--- /dev/null
@@ -0,0 +1,30 @@
+# See https://pre-commit.com for more information
+# See https://pre-commit.com/hooks.html for more hooks
+repos:
+-   repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v3.2.0
+    hooks:
+    -   id: trailing-whitespace
+
+-   repo: local
+    hooks:
+    # Run astyle over the staged files with c and h extension found in the directories
+    # listed in the files regex pattern. Ignoring the files in the exclude pattern.
+    - id: format-source
+      name: Formatting source files
+      entry: astyle --options=scripts/code-format.cfg --ignore-exclude-errors
+      stages: [ commit ]
+      language: system
+      pass_filenames: true
+      verbose: true
+      files: |
+        (?x)^(
+            src/ |
+            tests/src/test_cases/
+        )
+      exclude: |
+        (?x)^(
+            src/extra/libs/ |
+            src/lv_conf_internal.h
+        )
+      types_or: ["c", "header"]
\ No newline at end of file
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/README_pt_BR.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/README_pt_BR.md
new file mode 100644 (file)
index 0000000..f62f0a0
--- /dev/null
@@ -0,0 +1,206 @@
+<h1 align="center"> LVGL - Biblioteca gráfica leve e versátil</h1>
+<p align="center">
+    <img src="https://lvgl.io/assets/images/lvgl_widgets_demo.gif">
+</p>
+<p align="center">
+    O LVGL fornece tudo o que você precisa para criar uma GUI incorporada com elementos gráficos fáceis de usar, belos efeitos visuais e um baixo consumo de memória.
+</p>
+<h4 align="center">
+    <a href="https://lvgl.io">Site</a> &middot;
+    <a href="https://docs.lvgl.io/">Documentação</a> &middot;
+    <a href="https://forum.lvgl.io">Fórum</a> &middot;
+    <a href="https://lvgl.io/services">Serviços</a> &middot;
+    <a href="https://docs.lvgl.io/master/examples.html">Exemplos interativos</a>
+</h4>
+
+[English](./README.md) | [中文](./README_zh.md) | **Português do Brasil**
+
+---
+
+### Tabela de conteúdo
+
+- [Visão Geral](#visão-geral)
+- [Iniciando](#iniciando)
+- [Exemplos](#exemplos)
+- [Serviços](#serviços)
+- [Contribuindo](#contribuindo)
+
+## Visão Geral
+
+### Recursos
+* Poderosos [widgets](https://docs.lvgl.io/master/widgets/index.html): botões, gráficos, listas, controles deslizantes (sliders), imagens, etc.
+* Mecanismo gráfico avançado: animações, anti-aliasing, opacidade, rolagem suave, modos de mesclagem (blending modes), etc.
+* Suporte à [vários dispositivos de entrada](https://docs.lvgl.io/master/overview/indev.html): tela sensível ao toque, mouse, teclado, codificador, botões, etc.
+* Suporte à [vários monitores](https://docs.lvgl.io/master/overview/display.html)
+* Pode ser usado com qualquer microcontrolador e display, independente do hardware
+* Escalável para operar com pouca memória (64 kB Flash, 16 kB RAM)
+* Suporte multilíngue com manipulação UTF-8, suporte ao alfabeto bidirecional, árabe e CJK (Chinês, Japonês e Coreano)
+* Elementos gráficos totalmente personalizáveis por meio de [CSS](https://docs.lvgl.io/master/overview/style.html)
+* Layouts poderosos inspirados em CSS: [Flexbox](https://docs.lvgl.io/master/layouts/flex.html) e [Grid](https://docs.lvgl.io/master/layouts/grid.html)
+* SO, memória externa e GPU são suportados, mas não obrigatórios. (suporte integrado para STM32 DMA2D, SWM341 DMA2D e NXP PXP e VGLite)
+* Renderização suave mesmo com um [buffer de quadro único](https://docs.lvgl.io/master/porting/display.html) (single frame buffer)
+* Escrito em C e compatível com C++
+* Uso do LittlevGL com Micropython simplificado com [LVGL API in Micropython](https://blog.lvgl.io/2019-02-20/micropython-bindings)
+* [Simulador](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html) para desenvolver no PC sem hardware embutido
+* Mais de 100 [exemplos simples](https://github.com/lvgl/lvgl/tree/master/examples)
+* [Documentação](http://docs.lvgl.io/) e referências de API online e em PDF
+
+### Requerimentos
+Basicamente, todo controlador moderno (que é capaz de acionar um display) é adequado para executar LVGL. Os requisitos mínimos são:
+
+<table>
+  <tr>
+    <td>
+        <strong>Nome</strong>
+    </td>
+    <td>
+        <strong>Minímo</strong>
+    </td>
+    <td>
+        <strong>Recomendado</strong>
+    </td>
+  </tr>
+  <tr>
+    <td>
+        <strong>Arquitetura</strong>
+    </td>
+    <td colspan="2">Microcontrolador ou processador de 16, 32 ou 64 bits</td>
+  </tr>
+  <tr>
+    <td>
+        <strong>Clock</strong>
+    </td>
+    <td>&gt; 16 MHz</td>
+    <td>&gt; 48 MHz</td>
+  </tr>
+  <tr>
+    <td>
+        <strong>Flash/ROM</strong>
+    </td>
+    <td>&gt; 64 kB</td>
+    <td>&gt; 180 kB</td>
+  </tr>
+
+  <tr>
+    <td>
+        <strong>RAM estática</strong>
+    </td>
+    <td>&gt; 16 kB</td>
+    <td>&gt; 48 kB</td>
+  </tr>
+
+  <tr>
+    <td>
+        <strong>Draw buffer</strong>
+    </td>
+    <td>&gt; 1 &times; <em>hor. res.</em> pixels</td>
+    <td>&gt; tamanho da tela de 1/10</td>
+  </tr>
+
+  <tr>
+    <td>
+        <strong>Compilador</strong>
+    </td>
+    <td colspan="2">Padrão C99 ou mais recente</td>
+  </tr>
+</table>
+
+*Observe que o uso de memória pode variar dependendo da arquitetura, do compilador e das opções de compilação.*
+
+### Plataformas suportadas
+O LVGL é completamente independente de plataforma e pode ser usado com qualquer MCU que atenda aos requisitos.
+Apenas para citar algumas plataformas:
+
+- NXP: Kinetis, LPC, iMX, iMX RT
+- STM32F1, STM32F3, STM32F4, STM32F7, STM32L4, STM32L5, STM32H7
+- Microchip dsPIC33, PIC24, PIC32MX, PIC32MZ
+- [Linux frame buffer](https://blog.lvgl.io/2018-01-03/linux_fb) (/dev/fb)
+- [Raspberry Pi](http://www.vk3erw.com/index.php/16-software/63-raspberry-pi-official-7-touchscreen-and-littlevgl)
+- [Espressif ESP32](https://github.com/lvgl/lv_port_esp32)
+- [Infineon Aurix](https://github.com/lvgl/lv_port_aurix)
+- Nordic NRF52 Bluetooth modules
+- Quectel modems
+- [SYNWIT SWM341](https://www.synwit.cn/)
+
+LVGL também está disponível para:
+- [Arduino library](https://docs.lvgl.io/master/get-started/platforms/arduino.html)
+- [PlatformIO package](https://registry.platformio.org/libraries/lvgl/lvgl)
+- [Zephyr library](https://docs.zephyrproject.org/latest/reference/kconfig/CONFIG_LVGL.html)
+- [ESP32 component](https://docs.lvgl.io/master/get-started/platforms/espressif.html)
+- [NXP MCUXpresso component](https://www.nxp.com/design/software/embedded-software/lvgl-open-source-graphics-library:LITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY)
+- [NuttX library](https://docs.lvgl.io/master/get-started/os/nuttx.html)
+- [RT-Thread RTOS](https://docs.lvgl.io/master/get-started/os/rt-thread.html)
+
+## Iniciando
+Esta lista mostra a maneira recomendada de aprender sobre a biblioteca:
+
+1. Confira as [demos on-line](https://lvgl.io/demos) para ver o LVGL em ação (3 minutos)
+2. Leia a [introdução](https://docs.lvgl.io/master/intro/index.html) da documentação (5 minutos)
+3. Familiarize-se com o básico da [Visão geral rápida](https://docs.lvgl.io/master/get-started/quick-overview.html) (15 minutos)
+4. Configure um [simulador](https://docs.lvgl.io/master/get-started/platforms/pc-simulator.html) (10 minutos)
+5. Experimente alguns [Exemplos](https://github.com/lvgl/lvgl/tree/master/examples)
+6. Placa para porta LVGL. Veja o guia [porting](https://docs.lvgl.io/master/porting/index.html) ou verifique o pronto para usar [Projects](https://github.com/lvgl?q=lv_port_)
+7. Leia a [visão geral](https://docs.lvgl.io/master/overview/index.html) para entender melhor a biblioteca (2-3 horas)
+8. Verifique a documentação dos [widgets](https://docs.lvgl.io/master/widgets/index.html) para ver seus recursos e como utilizá-los
+9. Se você tiver dúvidas, acesse o [fórum](http://forum.lvgl.io/)
+10. Leia o guia de [contribuição](https://docs.lvgl.io/master/CONTRIBUTING.html) para ver como você pode ajudar a melhorar o LVGL (15 minutos)
+
+## Exemplos
+Para mais exemplos, veja a pasta [examples](https://github.com/lvgl/lvgl/tree/master/examples).
+
+![Exemplo de botão LVGL com rótulo (label)](https://github.com/lvgl/lvgl/raw/master/docs/misc/btn_example.png)
+
+### C
+
+```c
+lv_obj_t * button = lv_btn_create(lv_scr_act());                             /* Adiciona um botão à tela atual */
+lv_obj_set_pos(button, 10, 10);                                              /* Define uma posição ao botão na tela */
+lv_obj_set_size(button, 100, 50);                                            /* Define o tamanho */
+lv_obj_add_event_cb(button, button_event_callback, LV_EVENT_CLICKED, NULL);  /* Atribui um retorno de chamada (callback) */
+
+lv_obj_t * label = lv_label_create(button);                                  /* Adiciona um rótulo (label) */
+lv_label_set_text(label, "Clique aqui");                                     /* Define o texto do rótulo (label) */
+lv_obj_center(label);                                                        /* Alinha o texto ao centro */
+...
+
+void button_event_callback(lv_event_t * e)
+{
+  printf("Clicado\n");
+}
+```
+
+### Micropython
+Saiba mais em [Micropython](https://docs.lvgl.io/master/get-started/bindings/micropython.html)
+
+```python
+def button_event_callback(event):
+  print("Clicado")
+
+# Cria um botão e um rótulo (label)
+button = lv.btn(lv.scr_act())
+button.set_pos(10, 10)
+button.set_size(100, 50)
+button.add_event_cb(button_event_callback, lv.EVENT.CLICKED, None)
+
+label = lv.label(button)
+label.set_text("Cliquq aqui")
+label.center()
+```
+
+## Serviços
+O LVGL Kft foi estabelecido para fornecer uma base sólida para a biblioteca LVGL. Oferecemos vários tipos de serviços
+para ajudá-lo no desenvolvimento da interface do usuário:
+
+- Design gráfico
+- Implementação de IU
+- Consultoria/Suporte
+
+Para mais informações, consulte [LVGL Serviços](https://lvgl.io/services). Sinta-se à vontade para entrar em contato
+conosco se tiver alguma dúvida.
+
+## Contribuindo
+O LVGL é um projeto aberto e sua contribuição é muito bem-vinda. Há muitas maneiras de contribuir, desde simplesmente
+falando sobre seu projeto, escrevendo exemplos, melhorando a documentação, corrigindo bugs até hospedar seu próprio
+projeto sob a organização LVGL.
+
+Para obter uma descrição detalhada das oportunidades de contribuição, visite a seção de [contribuição](https://docs.lvgl.io/master/CONTRIBUTING.html) da documentação.
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c
new file mode 100644 (file)
index 0000000..7d93948
--- /dev/null
@@ -0,0 +1,224 @@
+#include "../../../lvgl.h"
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+
+#ifndef LV_ATTRIBUTE_IMG_IMG_BENCHMARK_COGWHEEL_RGB565A8
+#define LV_ATTRIBUTE_IMG_IMG_BENCHMARK_COGWHEEL_RGB565A8
+#endif
+
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_IMG_BENCHMARK_COGWHEEL_RGB565A8 uint8_t img_benchmark_cogwheel_rgb565a8_map[] = {
+  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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x94, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xb2, 0x63, 0x33, 0x74, 0x5a, 0xc6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 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, 0x9e, 0xf7, 0x74, 0x7c, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xb2, 0x63, 0xd2, 0x6b, 0x74, 0x84, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9e, 0xf7, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1d, 0xdf, 0x33, 0x7c, 0xd2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xd2, 0x63, 0x13, 0x74, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x39, 0xbe, 0x36, 0x9d, 0xdc, 0xde, 0xff, 0xff, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x1d, 0xdf, 0xf6, 0x8c, 0x34, 0x74, 0x57, 0x9d, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xd6, 0x54, 0x7c, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0xd2, 0x6b, 0x13, 0x74, 0xdc, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf9, 0xb5, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x12, 0x74, 0xf5, 0x94, 0x1c, 0xdf, 0xff, 0xff, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1a, 0xbe, 0xd6, 0x8c, 0x95, 0x84, 0x74, 0x7c, 0x34, 0x74, 0x54, 0x7c, 0xb8, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd9, 0xb5, 0x54, 0x7c, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0xd2, 0x6b, 0x12, 0x74, 0xb4, 0x8c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xef, 0x74, 0x84, 0x90, 0x5b, 0x90, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0x12, 0x74, 0x94, 0x84, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb9, 0xad, 0x75, 0x7c, 0x34, 0x74, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x33, 0x74, 0x95, 0x84, 0x7d, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x94, 0x33, 0x74, 0xf3, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0xf2, 0x6b, 0xf2, 0x73, 0x32, 0x7c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x36, 0x9d, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x5b, 0x50, 0x5b, 0x90, 0x63, 0x5d, 0xe7, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xf7, 0xd6, 0x8c, 0x34, 0x74, 0x55, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x34, 0x74, 0x54, 0x7c, 0xb8, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x95, 0x84, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0x12, 0x7c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xf7, 0x33, 0x74, 0x91, 0x5b, 0xd1, 0x6b, 0xd1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x39, 0xc6, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0xff, 0xff, 0x17, 0x95, 0x54, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x74, 0x54, 0x7c, 0xfc, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x74, 0x84, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xd2, 0x6b, 0xf2, 0x73, 0x5a, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb8, 0xad, 0xf2, 0x6b, 0xb1, 0x63, 0xd1, 0x6b, 0xd1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0xd1, 0x6b, 0x15, 0x9d, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x57, 0x9d, 0x75, 0x7c, 0x55, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x13, 0x74, 0x37, 0x9d, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0xde, 0x98, 0xa5, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0x53, 0x84, 0x3a, 0xc6, 0xff, 0xff, 0x00, 0x00, 0xbb, 0xd6, 0x12, 0x74, 0xb1, 0x63, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0xd1, 0x6b, 0xf5, 0x9c, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0xff, 0xff, 0x57, 0x9d, 0x74, 0x7c, 0x54, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x74, 0x7c, 0x57, 0x9d, 0x7b, 0xc6, 0x5a, 0xce, 0x1a, 0xbe, 0x78, 0xa5, 0xb5, 0x84, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0x54, 0x7c, 0x36, 0x9d, 0xf8, 0xb5, 0x94, 0x84, 0xb1, 0x63, 0xb1, 0x63, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0xd1, 0x73, 0x36, 0xa5, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0xff, 0xff, 0x3a, 0xbe, 0x95, 0x84, 0x54, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x34, 0x7c, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x63, 0xf2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0xd1, 0x73, 0xbb, 0xde, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x17, 0x95, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x34, 0x7c, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0x12, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb0, 0x63, 0xd0, 0x73, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xef, 0xf5, 0x94, 0x1c, 0xdf, 0xff, 0xff, 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, 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, 0xff, 0xff, 0x3d, 0xe7, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xbe, 0x95, 0x84, 0x54, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x74, 0x54, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0x12, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xd0, 0x73, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xf7, 0x57, 0xa5, 0x12, 0x74, 0xb1, 0x63, 0xf1, 0x6b, 0x56, 0x9d, 0xff, 0xff, 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, 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, 0xff, 0xff, 0xb9, 0xad, 0x17, 0x95, 0x38, 0x9d, 0x3d, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x37, 0x9d, 0x75, 0x7c, 0x54, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x74, 0x34, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0x12, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0xd1, 0x6b, 0x56, 0xa5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x94, 0xd1, 0x6b, 0x4f, 0x5b, 0x70, 0x5b, 0x0f, 0x53, 0xb0, 0x63, 0xf5, 0x94, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x58, 0x9d, 0xd6, 0x8c, 0x75, 0x7c, 0x96, 0x84, 0xd6, 0x8c, 0xbc, 0xce, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x98, 0xa5, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x33, 0x74, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x73, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x12, 0x74, 0x36, 0x9d, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xef, 0x73, 0x7c, 0x90, 0x63, 0x4f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x2f, 0x53, 0x90, 0x63, 0xb4, 0x8c, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0xa5, 0xd6, 0x8c, 0x96, 0x84, 0xb6, 0x84, 0x96, 0x84, 0x76, 0x84, 0xb6, 0x84, 0xb9, 0xad, 0xbf, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xb5, 0xd6, 0x8c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x84, 0x75, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x74, 0x34, 0x74, 0x33, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x73, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0xb1, 0x63, 0xf2, 0x73, 0x39, 0xbe, 0xfc, 0xde, 0x12, 0x74, 0x90, 0x63, 0x4f, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x2e, 0x53, 0x90, 0x63, 0x36, 0x9d, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb9, 0xad, 0xd7, 0x8c, 0x96, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0x96, 0x84, 0x96, 0x84, 0xb6, 0x84, 0x78, 0xa5, 0x5e, 0xef, 0xff, 0xff, 0xf9, 0xb5, 0xd6, 0x8c, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x13, 0x74, 0xf2, 0x6b, 0xb1, 0x63, 0x70, 0x5b, 0x6f, 0x5b, 0x4f, 0x53, 0x6f, 0x5b, 0xf2, 0x6b, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xb1, 0x63, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb0, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x32, 0x74, 0x12, 0x74, 0x70, 0x5b, 0x4f, 0x5b, 0x70, 0x5b, 0x90, 0x5b, 0x90, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x53, 0x7c, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x37, 0x9d, 0x96, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0x96, 0x84, 0x96, 0x84, 0x75, 0x84, 0x95, 0x84, 0xb6, 0x84, 0x95, 0x84, 0x95, 0x84, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x75, 0x84, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x54, 0x7c, 0x33, 0x74, 0xf2, 0x6b, 0xd1, 0x6b, 0x90, 0x63, 0x6f, 0x5b, 0x2e, 0x53, 0x0d, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0x2e, 0x53, 0xd2, 0x6b, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0x90, 0x63, 0x0e, 0x53, 0xed, 0x4a, 0x0d, 0x4b, 0x0e, 0x4b, 0x2e, 0x53, 0x4f, 0x5b, 0x6f, 0x5b, 0x90, 0x63, 0x91, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x5b, 0x90, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0x6f, 0x5b, 0x94, 0x8c, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x37, 0x9d, 0x96, 0x84, 0x96, 0x84, 0xb6, 0x84, 0x96, 0x84, 0x96, 0x84, 0x96, 0x84, 0x96, 0x84, 0x96, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x54, 0x7c, 0x34, 0x7c, 0xf2, 0x6b, 0xb1, 0x63, 0x4f, 0x53, 0x0d, 0x53, 0x0d, 0x4b, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0d, 0x4b, 0x2f, 0x53, 0xd2, 0x6b, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0x90, 0x63, 0x2e, 0x53, 0x0d, 0x4b, 0x0d, 0x4b, 0x0d, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x4f, 0x53, 0x90, 0x5b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x5b, 0x90, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x70, 0x63, 0x70, 0x5b, 0x90, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x2f, 0x53, 0xb0, 0x6b, 0x35, 0xa5, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0xc6, 0xb6, 0x84, 0x75, 0x84, 0x96, 0x84, 0x96, 0x84, 0x96, 0x84, 0x96, 0x84, 0x96, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x75, 0x84, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x54, 0x7c, 0xf2, 0x6b, 0x90, 0x5b, 0x2f, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x0d, 0x4b, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x2f, 0x53, 0xd2, 0x6b, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0x91, 0x63, 0x2e, 0x53, 0xed, 0x4a, 0x0d, 0x4b, 0x0d, 0x4b, 0x0d, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x4f, 0x53, 0x4f, 0x5b, 0x70, 0x5b, 0x91, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0xd1, 0x7b, 0x1c, 0xe7, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1a, 0xbe, 0x75, 0x84, 0x96, 0x84, 0xb6, 0x84, 0x96, 0x84, 0x96, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x75, 0x7c, 0x13, 0x74, 0xb1, 0x63, 0x4f, 0x5b, 0x0e, 0x53, 0x0d, 0x4b, 0x0d, 0x4b, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0xee, 0x4a, 0xed, 0x4a, 0x0e, 0x53, 0x4f, 0x63, 0x90, 0x6b, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xd2, 0x6b, 0x4f, 0x5b, 0xcc, 0x52, 0x0d, 0x53, 0x6f, 0x5b, 0x4e, 0x5b, 0xed, 0x4a, 0xcd, 0x42, 0xed, 0x4a, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x4f, 0x5b, 0x6f, 0x5b, 0x90, 0x63, 0x90, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0x8f, 0x6b, 0xd4, 0x9c, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xb5, 0x96, 0x84, 0x75, 0x7c, 0xb6, 0x84, 0x96, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x54, 0x7c, 0xf2, 0x6b, 0x70, 0x5b, 0x0e, 0x53, 0xed, 0x4a, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x0e, 0x53, 0x2e, 0x5b, 0x90, 0x6b, 0x52, 0x84, 0x15, 0x9d, 0xbb, 0xde, 0x39, 0xc6, 0x54, 0x84, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xb1, 0x6b, 0x2e, 0x5b, 0x4e, 0x6b, 0x56, 0xad, 0xdb, 0xde, 0xdb, 0xd6, 0xf8, 0xbd, 0x73, 0x84, 0xd1, 0x6b, 0x2e, 0x53, 0xee, 0x4a, 0x0e, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x2e, 0x5b, 0xd0, 0x7b, 0x3d, 0xef, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xf7, 0xf7, 0x94, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x54, 0x7c, 0xb1, 0x63, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0x2e, 0x53, 0x4f, 0x63, 0xd0, 0x73, 0x52, 0x8c, 0x7a, 0xd6, 0x9e, 0xf7, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x94, 0x13, 0x74, 0xf3, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xb1, 0x63, 0x90, 0x6b, 0x35, 0xa5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7a, 0xce, 0x73, 0x84, 0xb0, 0x6b, 0x6f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x6f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x0e, 0x53, 0x6f, 0x6b, 0x55, 0xad, 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, 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, 0x5e, 0xe7, 0xf7, 0x94, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x96, 0x84, 0x95, 0x84, 0x34, 0x74, 0x90, 0x63, 0x2e, 0x53, 0x0d, 0x4b, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0x2e, 0x63, 0xf1, 0x7b, 0xf8, 0xbd, 0x9e, 0xf7, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x9d, 0x33, 0x74, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xb1, 0x6b, 0xd1, 0x73, 0x3e, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xef, 0x5d, 0xef, 0xb7, 0xad, 0xd1, 0x6b, 0x4f, 0x5b, 0x4f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x2f, 0x5b, 0xf1, 0x7b, 0x7e, 0xf7, 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, 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, 0xff, 0xff, 0x17, 0x95, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x96, 0x84, 0x95, 0x84, 0x33, 0x74, 0x90, 0x63, 0x0e, 0x53, 0x0d, 0x4b, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0xed, 0x52, 0x2e, 0x5b, 0xd0, 0x73, 0xb7, 0xb5, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x33, 0x74, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xd1, 0x6b, 0xf1, 0x73, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xe7, 0x97, 0xad, 0xf1, 0x73, 0x2f, 0x53, 0x4f, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0x12, 0x74, 0x9e, 0xf7, 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, 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, 0xff, 0xff, 0xd9, 0xb5, 0xb6, 0x84, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x33, 0x74, 0x90, 0x5b, 0x0e, 0x53, 0x0e, 0x4b, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0x6f, 0x63, 0x31, 0x8c, 0x18, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x33, 0x74, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xd1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0xb5, 0x32, 0x74, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0xb0, 0x63, 0x15, 0x9d, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xd6, 0x8c, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x33, 0x74, 0x90, 0x5b, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x8f, 0x73, 0x35, 0xad, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x33, 0x74, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xd1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xef, 0x94, 0x84, 0x90, 0x63, 0x90, 0x63, 0xb0, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0x90, 0x63, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbb, 0xce, 0xf5, 0x94, 0x73, 0x84, 0x32, 0x7c, 0xdc, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x57, 0x9d, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x54, 0x74, 0x90, 0x63, 0x0e, 0x53, 0x0e, 0x4b, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0d, 0x53, 0xf0, 0x7b, 0xf8, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf3, 0x6b, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xd1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 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, 0xff, 0xff, 0x56, 0x9d, 0xf2, 0x73, 0x90, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0x4f, 0x5b, 0x94, 0x84, 0x77, 0xad, 0x97, 0xad, 0x56, 0x9d, 0xd4, 0x8c, 0x12, 0x74, 0x90, 0x63, 0x2e, 0x53, 0x0e, 0x53, 0x12, 0x74, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0xef, 0xf6, 0x94, 0x17, 0x95, 0x9b, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xd9, 0xad, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x54, 0x7c, 0xb1, 0x63, 0x0e, 0x53, 0x0d, 0x4b, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0x0e, 0x5b, 0xf1, 0x83, 0xf8, 0xc5, 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, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf2, 0x6b, 0x13, 0x74, 0x12, 0x74, 0xf2, 0x6b, 0xd1, 0x6b, 0xf2, 0x7b, 0xff, 0xff, 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, 0x77, 0xa5, 0x12, 0x74, 0xb1, 0x63, 0xd1, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0x90, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0xb0, 0x63, 0xb0, 0x6b, 0x6f, 0x5b, 0x2e, 0x53, 0x0e, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x93, 0x84, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xf7, 0xd6, 0x8c, 0x54, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0xb5, 0x84, 0x17, 0x95, 0xd9, 0xb5, 0x98, 0xa5, 0xd6, 0x8c, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x75, 0x84, 0x75, 0x7c, 0x95, 0x84, 0x75, 0x7c, 0xd1, 0x63, 0x0e, 0x53, 0x0d, 0x4b, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0d, 0x53, 0x11, 0x84, 0x19, 0xce, 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, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf2, 0x6b, 0x12, 0x6c, 0x12, 0x6c, 0xf2, 0x6b, 0xd1, 0x6b, 0x12, 0x7c, 0xff, 0xff, 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, 0x57, 0xa5, 0x12, 0x74, 0xd1, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xb1, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x4f, 0x53, 0xee, 0x4a, 0xd1, 0x6b, 0x7d, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0xd6, 0x95, 0x84, 0x34, 0x74, 0x75, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0xb6, 0x84, 0xb5, 0x84, 0x75, 0x7c, 0x75, 0x84, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x75, 0x7c, 0xf2, 0x6b, 0x4f, 0x53, 0x0d, 0x4b, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xf0, 0x7b, 0x39, 0xce, 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, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xd1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 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, 0x77, 0xa5, 0xf2, 0x73, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x0e, 0x4b, 0x4f, 0x5b, 0x97, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xf7, 0xb5, 0x8c, 0x54, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x55, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x34, 0x74, 0x70, 0x5b, 0x0d, 0x4b, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x8f, 0x73, 0xf8, 0xc5, 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, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xb1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 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, 0xff, 0xff, 0xd5, 0x8c, 0xd2, 0x6b, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0xd1, 0x6b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xf1, 0x73, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xef, 0x54, 0x7c, 0x54, 0x7c, 0x74, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x54, 0x7c, 0xb1, 0x63, 0x2e, 0x53, 0x0d, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xed, 0x52, 0x6f, 0x6b, 0x55, 0xad, 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, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xb1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 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, 0x1d, 0xdf, 0x94, 0x84, 0xf2, 0x6b, 0xf3, 0x6b, 0x33, 0x74, 0xf2, 0x73, 0xb1, 0x63, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x4f, 0x5b, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5a, 0xc6, 0x34, 0x74, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x75, 0x7c, 0x13, 0x74, 0x4f, 0x53, 0x0d, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x63, 0x72, 0x94, 0xff, 0xff, 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, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xb1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 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, 0x00, 0x00, 0x7a, 0xce, 0x33, 0x74, 0xf3, 0x6b, 0x33, 0x74, 0x33, 0x74, 0xf2, 0x6b, 0x90, 0x63, 0x4f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0x2e, 0x53, 0x52, 0x84, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5a, 0xc6, 0x54, 0x7c, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x74, 0x7c, 0x75, 0x7c, 0x54, 0x7c, 0xb1, 0x63, 0x0e, 0x53, 0x0e, 0x4b, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x11, 0x84, 0xfc, 0xe6, 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, 0xff, 0xff, 0x16, 0x95, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xb1, 0x6b, 0xf1, 0x7b, 0xff, 0xff, 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, 0x00, 0x00, 0xff, 0xff, 0x16, 0x95, 0x33, 0x74, 0x13, 0x74, 0x34, 0x74, 0x33, 0x74, 0xb1, 0x63, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x0e, 0x53, 0x2e, 0x5b, 0x11, 0x84, 0x7a, 0xce, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x98, 0xad, 0x54, 0x7c, 0x13, 0x74, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x74, 0x7c, 0x75, 0x7c, 0xf2, 0x6b, 0x4f, 0x5b, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x4f, 0x6b, 0x18, 0xc6, 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, 0x00, 0x00, 0x1d, 0xe7, 0x95, 0x84, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xb1, 0x6b, 0xf2, 0x73, 0x5a, 0xc6, 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, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xe6, 0x74, 0x84, 0xf3, 0x6b, 0x54, 0x7c, 0x54, 0x7c, 0xf2, 0x6b, 0x90, 0x63, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x0e, 0x53, 0x4f, 0x63, 0x93, 0x94, 0xfc, 0xde, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbc, 0xd6, 0x37, 0x9d, 0x75, 0x84, 0x33, 0x74, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0xb1, 0x63, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x5b, 0x11, 0x84, 0xff, 0xff, 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, 0x9e, 0xf7, 0x7a, 0xce, 0xf6, 0x94, 0x13, 0x74, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd2, 0x6b, 0x74, 0x84, 0x3a, 0xc6, 0xff, 0xff, 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, 0xff, 0xff, 0x98, 0xa5, 0x33, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x34, 0x74, 0xb1, 0x63, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2e, 0x53, 0xed, 0x52, 0x8f, 0x73, 0xf4, 0xa4, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd9, 0xb5, 0x95, 0x84, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x13, 0x74, 0x90, 0x63, 0x0e, 0x53, 0x2e, 0x53, 0x2f, 0x53, 0x0e, 0x53, 0x8f, 0x6b, 0x59, 0xce, 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, 0x9b, 0xce, 0x94, 0x84, 0x53, 0x7c, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0x33, 0x74, 0xb4, 0x8c, 0xfc, 0xd6, 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, 0x3e, 0xe7, 0xb5, 0x8c, 0x34, 0x74, 0x54, 0x7c, 0x75, 0x7c, 0xf2, 0x6b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0xed, 0x52, 0x2e, 0x6b, 0x15, 0xad, 0xff, 0xff, 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, 0xff, 0xff, 0xbf, 0xff, 0xb9, 0xb5, 0x95, 0x84, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0xd1, 0x6b, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x5b, 0x11, 0x84, 0x7f, 0xff, 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, 0x7d, 0xe7, 0x77, 0xa5, 0x33, 0x74, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0x91, 0x63, 0xb1, 0x63, 0x12, 0x74, 0x98, 0xad, 0x5e, 0xef, 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, 0xff, 0xff, 0xf9, 0xb5, 0x34, 0x74, 0x54, 0x7c, 0x95, 0x84, 0x33, 0x74, 0x90, 0x63, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x0e, 0x5b, 0x52, 0x8c, 0xff, 0xff, 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, 0xbc, 0xce, 0x95, 0x84, 0x34, 0x74, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x34, 0x74, 0x90, 0x63, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x4e, 0x63, 0x35, 0xad, 0xff, 0xff, 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, 0x3e, 0xef, 0xd5, 0x8c, 0xd2, 0x6b, 0x91, 0x63, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd1, 0x63, 0x70, 0x5b, 0xb1, 0x63, 0xb4, 0x8c, 0x7d, 0xef, 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, 0x1d, 0xdf, 0x74, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x54, 0x7c, 0xd2, 0x6b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x5b, 0x4f, 0x53, 0x4f, 0x5b, 0xd8, 0xbd, 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, 0x3a, 0xbe, 0x54, 0x7c, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x74, 0x54, 0x7c, 0x13, 0x74, 0x6f, 0x5b, 0x0e, 0x4b, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xd0, 0x7b, 0x1c, 0xe7, 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, 0xff, 0xff, 0xf6, 0x8c, 0xb1, 0x63, 0x70, 0x5b, 0xd1, 0x6b, 0x12, 0x74, 0x12, 0x74, 0xd2, 0x6b, 0xd2, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb0, 0x63, 0x6f, 0x5b, 0x4f, 0x5b, 0x90, 0x63, 0xf5, 0x94, 0xff, 0xff, 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, 0x3e, 0xef, 0xd6, 0x8c, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x13, 0x74, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x53, 0x2e, 0x53, 0xf4, 0x94, 0xff, 0xff, 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, 0x19, 0xbe, 0x13, 0x74, 0x54, 0x7c, 0x34, 0x74, 0x34, 0x74, 0x54, 0x74, 0x33, 0x74, 0xf2, 0x6b, 0x4f, 0x5b, 0x0e, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x0e, 0x5b, 0xd4, 0x9c, 0xff, 0xff, 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, 0xff, 0xff, 0x98, 0xad, 0xf2, 0x6b, 0x4f, 0x53, 0x6f, 0x5b, 0xb4, 0x8c, 0x36, 0x9d, 0x74, 0x84, 0xd2, 0x6b, 0x91, 0x63, 0x90, 0x63, 0x90, 0x63, 0xb0, 0x63, 0xb1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xf1, 0x73, 0xf1, 0x73, 0xf1, 0x73, 0x6f, 0x5b, 0x4f, 0x5b, 0xd1, 0x6b, 0x3a, 0xc6, 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, 0x7b, 0xc6, 0xb6, 0x84, 0x95, 0x84, 0xb6, 0x84, 0x54, 0x7c, 0x6f, 0x5b, 0x2e, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0xee, 0x4a, 0x32, 0x7c, 0x5d, 0xef, 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, 0xff, 0xff, 0x98, 0xad, 0xf3, 0x6b, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x34, 0x74, 0x33, 0x74, 0xd1, 0x63, 0x4f, 0x5b, 0x2e, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x4e, 0x63, 0x9b, 0xde, 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, 0xbb, 0xce, 0x54, 0x7c, 0xb2, 0x63, 0x70, 0x5b, 0x31, 0x74, 0xff, 0xff, 0x00, 0x00, 0x9e, 0xf7, 0x74, 0x84, 0x32, 0x7c, 0x93, 0x84, 0xf4, 0x94, 0xd4, 0x94, 0x15, 0x9d, 0x56, 0x9d, 0xd5, 0x8c, 0x13, 0x74, 0x33, 0x7c, 0x15, 0x9d, 0xff, 0xff, 0xff, 0xff, 0x74, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x32, 0x74, 0x1c, 0xdf, 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, 0x7d, 0xe7, 0xd6, 0x8c, 0x75, 0x7c, 0xd6, 0x8c, 0x75, 0x7c, 0x90, 0x63, 0x2f, 0x5b, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x5b, 0x0e, 0x4b, 0xb0, 0x6b, 0x5a, 0xce, 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, 0xff, 0xff, 0xf6, 0x94, 0xf2, 0x6b, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x34, 0x74, 0x13, 0x74, 0x90, 0x63, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xb0, 0x73, 0x1c, 0xe7, 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, 0x3d, 0xdf, 0x94, 0x84, 0xf2, 0x6b, 0xf2, 0x6b, 0x91, 0x63, 0x93, 0x84, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xf7, 0x39, 0xc6, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x19, 0xbe, 0xdc, 0xde, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xd5, 0x94, 0x91, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x15, 0x95, 0xff, 0xff, 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, 0x7d, 0xe7, 0xf7, 0x94, 0x76, 0x7c, 0xd7, 0x8c, 0x95, 0x84, 0xf2, 0x6b, 0x4f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x5b, 0x2e, 0x53, 0x4f, 0x5b, 0x73, 0x84, 0xdb, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xd6, 0xb5, 0x8c, 0xf3, 0x6b, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x34, 0x74, 0x13, 0x74, 0x70, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x5b, 0x11, 0x7c, 0x7e, 0xf7, 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, 0x7a, 0xc6, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x73, 0xd2, 0x6b, 0x53, 0x7c, 0x5a, 0xc6, 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, 0xb5, 0x33, 0x7c, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0xf1, 0x6b, 0x7b, 0xce, 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, 0x7f, 0xef, 0x17, 0x95, 0x75, 0x7c, 0xd7, 0x8c, 0x96, 0x84, 0x13, 0x74, 0x70, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x6f, 0x5b, 0x6f, 0x63, 0x32, 0x7c, 0x7d, 0xef, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xbf, 0xef, 0xfc, 0xde, 0xb8, 0xad, 0xb5, 0x84, 0x33, 0x74, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x34, 0x74, 0x13, 0x74, 0x90, 0x63, 0x6f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x63, 0x32, 0x84, 0x9b, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0x98, 0xa5, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x73, 0xf2, 0x6b, 0xd1, 0x6b, 0x32, 0x74, 0x5f, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x53, 0x7c, 0x91, 0x63, 0x90, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x70, 0x5b, 0xf5, 0x94, 0x9e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xd6, 0x95, 0x84, 0x34, 0x74, 0x75, 0x7c, 0x54, 0x7c, 0xf2, 0x6b, 0x70, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x0e, 0x4b, 0x0d, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0x4e, 0x5b, 0xf1, 0x6b, 0xff, 0xff,
+  0x00, 0x00, 0x5e, 0xef, 0x57, 0x9d, 0x16, 0x95, 0xd5, 0x8c, 0x74, 0x84, 0x54, 0x7c, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0x12, 0x7c, 0xb5, 0x8c, 0xf9, 0xb5, 0x9b, 0xce, 0x3a, 0xc6, 0x3a, 0xbe, 0x3a, 0xbe, 0x19, 0xbe, 0x39, 0xbe, 0x19, 0xbe, 0x19, 0xbe, 0x19, 0xbe, 0x5a, 0xc6, 0xb8, 0xad, 0xd5, 0x8c, 0x33, 0x7c, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf3, 0x73, 0x70, 0x5b, 0x90, 0x63, 0x39, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xf7, 0x12, 0x74, 0x70, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x70, 0x5b, 0xd1, 0x6b, 0x73, 0x84, 0xf5, 0x94, 0xf5, 0x94, 0xd5, 0x94, 0xd5, 0x8c, 0xd5, 0x8c, 0xd4, 0x8c, 0xd4, 0x8c, 0xd4, 0x8c, 0xd4, 0x8c, 0xd4, 0x8c, 0xd4, 0x8c, 0xd4, 0x8c, 0xd5, 0x94, 0x73, 0x84, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0xcd, 0x4a, 0x0e, 0x53, 0xff, 0xff,
+  0xff, 0xff, 0x13, 0x74, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf3, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0x70, 0x5b, 0x90, 0x63, 0x3c, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x95, 0x84, 0xd1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xcd, 0x42, 0x4e, 0x53, 0xfc, 0xe6,
+  0x1c, 0xdf, 0x13, 0x74, 0xd2, 0x63, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x6c, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0x70, 0x5b, 0xb0, 0x6b, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x17, 0x95, 0xf2, 0x6b, 0x90, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xcd, 0x42, 0x2e, 0x53, 0x97, 0xad,
+  0xfc, 0xde, 0x33, 0x74, 0xd2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x73, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0x70, 0x5b, 0xd1, 0x73, 0x7e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x78, 0xa5, 0x13, 0x74, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0x0e, 0x53, 0x52, 0x84,
+  0x5e, 0xef, 0x33, 0x74, 0xd2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x12, 0x74, 0x12, 0x74, 0xf2, 0x73, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0x90, 0x63, 0xd1, 0x73, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x38, 0x9d, 0xf2, 0x73, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xcd, 0x42, 0x0d, 0x4b, 0x32, 0x84,
+  0x5d, 0xef, 0x13, 0x74, 0xd2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x63, 0xd2, 0x63, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0x90, 0x63, 0xf1, 0x73, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd6, 0x8c, 0xd2, 0x6b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x2f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0xed, 0x4a, 0xcd, 0x4a, 0x4e, 0x5b, 0xb7, 0xb5,
+  0x9e, 0xef, 0xf2, 0x73, 0xb1, 0x63, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf3, 0x73, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0x13, 0x6c, 0xf2, 0x6b, 0xf2, 0x6b, 0x12, 0x74, 0x12, 0x74, 0x12, 0x74, 0x12, 0x74, 0xf2, 0x73, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0x91, 0x63, 0x12, 0x74, 0x3d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x74, 0x7c, 0x91, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x70, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x5b, 0x8f, 0x6b, 0x52, 0x84, 0xff, 0xff,
+  0xff, 0xff, 0x74, 0x7c, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x73, 0xf2, 0x73, 0xf2, 0x73, 0x12, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xb0, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x4f, 0x63, 0xb1, 0x73, 0x73, 0x8c, 0xf8, 0xb5, 0xbb, 0xd6, 0xbb, 0xd6, 0xbb, 0xd6, 0x9b, 0xce, 0x9b, 0xce, 0xbb, 0xd6, 0x9b, 0xce, 0x9b, 0xce, 0xdc, 0xd6, 0xf9, 0xbd, 0xb5, 0x8c, 0x12, 0x74, 0xd1, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0x91, 0x63, 0x12, 0x74, 0x7a, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0xd6, 0x12, 0x74, 0x50, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x5b, 0x4f, 0x5b, 0x4f, 0x63, 0xb0, 0x73, 0x32, 0x84, 0xb4, 0x94, 0x97, 0xad, 0xf8, 0xb5, 0xd8, 0xb5, 0xd8, 0xb5, 0xd8, 0xb5, 0xd8, 0xb5, 0xd8, 0xb5, 0xd8, 0xb5, 0xb7, 0xb5, 0x15, 0x9d, 0x32, 0x7c, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x70, 0x5b, 0x6f, 0x5b, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xcd, 0x4a, 0xed, 0x5a, 0xaf, 0x73, 0x73, 0x8c, 0x18, 0xbe, 0x5d, 0xef, 0x7d, 0xef, 0xff, 0xff, 0x00, 0x00,
+  0x00, 0x00, 0xbe, 0xf7, 0xd8, 0xb5, 0xd5, 0x8c, 0x94, 0x8c, 0x94, 0x84, 0x74, 0x84, 0x53, 0x7c, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x73, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x73, 0x13, 0x74, 0xd1, 0x6b, 0x4f, 0x5b, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0xed, 0x52, 0x6f, 0x6b, 0x76, 0xb5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0xad, 0xb1, 0x63, 0xd1, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xb1, 0x63, 0x32, 0x7c, 0xfc, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x33, 0x7c, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x5b, 0x6f, 0x63, 0xf0, 0x83, 0x9a, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, 0xce, 0x12, 0x74, 0x91, 0x63, 0xd1, 0x6b, 0xb1, 0x63, 0x90, 0x63, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xac, 0x52, 0xd0, 0x83, 0x7a, 0xd6, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xf9, 0xbd, 0x74, 0x84, 0x12, 0x74, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0x12, 0x74, 0xd2, 0x6b, 0x4f, 0x5b, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0x73, 0x8c, 0x9e, 0xff, 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, 0x9b, 0xce, 0x12, 0x74, 0xb1, 0x63, 0xd2, 0x6b, 0xb1, 0x63, 0xd1, 0x73, 0xf4, 0x9c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xde, 0x12, 0x74, 0x4f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x11, 0x7c, 0x9a, 0xd6, 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, 0x5d, 0xef, 0x53, 0x7c, 0xb1, 0x63, 0xf2, 0x6b, 0xd1, 0x6b, 0x90, 0x63, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xed, 0x52, 0x6e, 0x6b, 0x18, 0xce, 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, 0xff, 0xff, 0xdb, 0xd6, 0x74, 0x7c, 0xb1, 0x63, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0x70, 0x5b, 0x2e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x0d, 0x4b, 0x72, 0x8c, 0x9e, 0xf7, 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, 0x3d, 0xe7, 0xb4, 0x8c, 0xb1, 0x63, 0xb1, 0x63, 0x70, 0x5b, 0x12, 0x74, 0x7e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x3a, 0xc6, 0xf6, 0x94, 0xdc, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xf7, 0xd9, 0xb5, 0x5e, 0xef, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb4, 0x8c, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0xd1, 0x73, 0x5a, 0xce, 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, 0x1d, 0xe7, 0x33, 0x74, 0xb1, 0x63, 0xf2, 0x6b, 0xd1, 0x6b, 0x70, 0x5b, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0xed, 0x52, 0x11, 0x84, 0xfc, 0xee, 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, 0xff, 0xff, 0x57, 0xa5, 0xb1, 0x63, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0x90, 0x63, 0x2e, 0x53, 0x0d, 0x4b, 0xed, 0x4a, 0x0d, 0x4b, 0xf1, 0x73, 0x1c, 0xe7, 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, 0xdc, 0xd6, 0x33, 0x74, 0x91, 0x63, 0x70, 0x5b, 0x12, 0x74, 0xbb, 0xd6, 0xff, 0xff, 0x3d, 0xe7, 0x33, 0x7c, 0xf2, 0x6b, 0x74, 0x84, 0x36, 0x9d, 0x37, 0x9d, 0x57, 0x9d, 0x77, 0xa5, 0xb5, 0x8c, 0x13, 0x74, 0x53, 0x7c, 0x1c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x94, 0xd2, 0x6b, 0x2f, 0x53, 0xd1, 0x6b, 0x39, 0xc6, 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, 0x5a, 0xc6, 0x13, 0x74, 0xd2, 0x6b, 0xf2, 0x73, 0xd1, 0x6b, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0x0d, 0x53, 0x93, 0x94, 0xbe, 0xf7, 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, 0xf9, 0xbd, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xb1, 0x63, 0x2f, 0x53, 0x0d, 0x4b, 0x0d, 0x4b, 0x0d, 0x4b, 0x8f, 0x63, 0xfc, 0xe6, 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, 0xff, 0xff, 0x19, 0xbe, 0xb1, 0x63, 0x70, 0x5b, 0xd1, 0x6b, 0x74, 0x84, 0xd5, 0x8c, 0x33, 0x7c, 0x70, 0x5b, 0x90, 0x5b, 0xb1, 0x63, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xb1, 0x63, 0x50, 0x5b, 0x4f, 0x5b, 0x12, 0x74, 0xf5, 0x94, 0xf6, 0x94, 0x74, 0x84, 0xb1, 0x63, 0x70, 0x5b, 0x97, 0xad, 0xff, 0xff, 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, 0x5e, 0xef, 0xd5, 0x8c, 0xf2, 0x6b, 0xf2, 0x6b, 0xf3, 0x73, 0xb1, 0x63, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xed, 0x4a, 0x4f, 0x63, 0xf8, 0xc5, 0xff, 0xff, 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, 0x19, 0xbe, 0x13, 0x74, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd1, 0x6b, 0x4f, 0x53, 0x0d, 0x4b, 0x0e, 0x4b, 0x0d, 0x4b, 0x2e, 0x53, 0xdb, 0xd6, 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, 0xff, 0xff, 0x97, 0xa5, 0xb1, 0x63, 0xb1, 0x63, 0xd2, 0x6b, 0xd2, 0x6b, 0xb1, 0x63, 0x90, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x5b, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0xd1, 0x6b, 0xd2, 0x6b, 0xb1, 0x63, 0xb1, 0x6b, 0xb7, 0xad, 0xff, 0xff, 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, 0x3d, 0xdf, 0x33, 0x74, 0xf2, 0x6b, 0x13, 0x74, 0xf2, 0x6b, 0xb1, 0x63, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xed, 0x4a, 0xb0, 0x6b, 0xfb, 0xde, 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, 0x3d, 0xe7, 0xb5, 0x8c, 0xb1, 0x63, 0xd1, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0x6f, 0x5b, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0x35, 0x9d, 0xff, 0xff, 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, 0xff, 0xff, 0x16, 0x9d, 0xd1, 0x6b, 0x70, 0x5b, 0x90, 0x63, 0xb0, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb0, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0xb0, 0x63, 0x16, 0x9d, 0xff, 0xff, 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, 0x9b, 0xce, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0x90, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0x6f, 0x5b, 0x97, 0xad, 0xff, 0xff, 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, 0x7e, 0xef, 0xb4, 0x84, 0xb1, 0x63, 0xd1, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0x90, 0x63, 0x2e, 0x53, 0x0e, 0x4b, 0x0d, 0x4b, 0xcd, 0x4a, 0xf1, 0x73, 0x1c, 0xe7, 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, 0xdf, 0xf7, 0xd8, 0xb5, 0x32, 0x74, 0x90, 0x63, 0x2f, 0x53, 0x70, 0x5b, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x50, 0x5b, 0x90, 0x63, 0x97, 0xad, 0xdf, 0xff, 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, 0xff, 0xff, 0x16, 0x95, 0xf3, 0x6b, 0x13, 0x74, 0x33, 0x74, 0xd1, 0x6b, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xd0, 0x6b, 0x76, 0xa5, 0x3f, 0xe7, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7e, 0xef, 0x36, 0x9d, 0xf2, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0xb1, 0x63, 0x4f, 0x5b, 0x0d, 0x4b, 0x0d, 0x4b, 0xed, 0x4a, 0x2e, 0x53, 0xd4, 0x94, 0xff, 0xff, 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, 0x1d, 0xe7, 0x36, 0x9d, 0x33, 0x7c, 0xf2, 0x73, 0xb1, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0xf1, 0x73, 0x59, 0xc6, 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, 0x9b, 0xd6, 0x74, 0x7c, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0xb1, 0x63, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0d, 0x4b, 0xed, 0x4a, 0x8f, 0x63, 0x76, 0xa5, 0x7d, 0xef, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x77, 0xa5, 0x53, 0x7c, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0x70, 0x5b, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0xed, 0x4a, 0xf1, 0x73, 0xbe, 0xf7, 0x00, 0x00, 0xff, 0xff, 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, 0xff, 0xff, 0x5d, 0xe7, 0xf9, 0xb5, 0xd1, 0x6b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x63, 0xf1, 0x7b, 0x5a, 0xce, 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, 0xff, 0xff, 0xf6, 0x94, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0xf2, 0x6b, 0x70, 0x5b, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0d, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0x4f, 0x5b, 0xf1, 0x6b, 0x5f, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7a, 0xc6, 0x94, 0x84, 0xf2, 0x6b, 0x90, 0x5b, 0xb1, 0x63, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd1, 0x6b, 0xd2, 0x6b, 0x91, 0x63, 0x4f, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0x6f, 0x5b, 0xf8, 0xb5, 0xff, 0xff, 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, 0x00, 0x00, 0xff, 0xff, 0x73, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x4f, 0x5b, 0x2e, 0x5b, 0xaf, 0x73, 0x7a, 0xd6, 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, 0x00, 0x00, 0x1a, 0xbe, 0x74, 0x7c, 0x13, 0x74, 0x54, 0x7c, 0x33, 0x74, 0xb1, 0x63, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xcd, 0x42, 0xcd, 0x42, 0xb7, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x77, 0xad, 0xf2, 0x6b, 0x70, 0x5b, 0xb1, 0x63, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xd1, 0x6b, 0xb1, 0x63, 0x70, 0x5b, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x11, 0x74, 0xbe, 0xf7, 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, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xb4, 0x8c, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x5b, 0x2f, 0x5b, 0x4f, 0x6b, 0xf5, 0xa4, 0xff, 0xff, 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, 0xff, 0xff, 0xb5, 0x84, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x13, 0x74, 0x70, 0x5b, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0xed, 0x4a, 0xed, 0x4a, 0xb3, 0x8c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x7e, 0xf7, 0xf2, 0x6b, 0x90, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xb0, 0x63, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x2f, 0x53, 0x77, 0xad, 0xff, 0xff, 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, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xb4, 0x8c, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x5b, 0x90, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x90, 0x6b, 0x3d, 0xef, 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, 0x00, 0x00, 0x19, 0xbe, 0x54, 0x7c, 0x34, 0x74, 0x74, 0x7c, 0x34, 0x7c, 0xd1, 0x6b, 0x4f, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0xed, 0x4a, 0x0e, 0x53, 0x15, 0x9d, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0x33, 0x7c, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x5b, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xb0, 0x63, 0x97, 0xad, 0xff, 0xff, 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, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x94, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0xb0, 0x6b, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 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, 0x9b, 0xce, 0x95, 0x84, 0x54, 0x7c, 0x74, 0x7c, 0x75, 0x7c, 0x13, 0x74, 0x6f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0d, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x4e, 0x5b, 0x39, 0xc6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x19, 0xbe, 0xd1, 0x6b, 0x70, 0x5b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x6f, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x0e, 0x53, 0x11, 0x74, 0x19, 0xbe, 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, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x94, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0xb0, 0x73, 0x9e, 0xf7, 0x00, 0x00, 0xff, 0xff, 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, 0xfd, 0xe6, 0xf6, 0x94, 0x34, 0x74, 0x75, 0x7c, 0x95, 0x84, 0x54, 0x7c, 0xb1, 0x63, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0xcd, 0x42, 0xcd, 0x42, 0xed, 0x42, 0xed, 0x4a, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0xb0, 0x73, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xef, 0x12, 0x74, 0x70, 0x5b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x91, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x12, 0x74, 0xff, 0xff, 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, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x94, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0xb0, 0x73, 0x9e, 0xf7, 0x00, 0x00, 0xff, 0xff, 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, 0xff, 0xff, 0xf6, 0x94, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x75, 0x7c, 0xf2, 0x6b, 0x4f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0d, 0x4b, 0xed, 0x52, 0x4e, 0x5b, 0xb0, 0x63, 0xd0, 0x6b, 0x8f, 0x5b, 0x2e, 0x53, 0xed, 0x4a, 0xcd, 0x4a, 0x4f, 0x5b, 0x93, 0x94, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xbe, 0xf7, 0x94, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x5b, 0x90, 0x5b, 0x90, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x91, 0x63, 0x90, 0x63, 0x90, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x5b, 0xf5, 0x94, 0xff, 0xff, 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, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x94, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0xb0, 0x6b, 0x9e, 0xf7, 0x00, 0x00, 0xff, 0xff, 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, 0xff, 0xff, 0x78, 0xa5, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x33, 0x74, 0x90, 0x5b, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xcd, 0x4a, 0xed, 0x5a, 0x31, 0x84, 0x5a, 0xce, 0xfc, 0xde, 0xf4, 0x94, 0xd0, 0x6b, 0x4f, 0x5b, 0x4e, 0x5b, 0x31, 0x7c, 0x7d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xef, 0x12, 0x74, 0x70, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xf1, 0x73, 0x32, 0x84, 0x93, 0x8c, 0x12, 0x74, 0x90, 0x63, 0x90, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0xb1, 0x63, 0xb0, 0x63, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x90, 0x63, 0xd5, 0x94, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x94, 0x84, 0x90, 0x63, 0x6f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0xb0, 0x6b, 0x9e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0x58, 0x9d, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x54, 0x7c, 0x90, 0x63, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x2e, 0x5b, 0x72, 0x94, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xe7, 0xd5, 0x94, 0x16, 0x9d, 0x56, 0xa5, 0x56, 0xa5, 0xd8, 0xbd, 0x9e, 0xf7, 0xff, 0xff, 0x19, 0xc6, 0x73, 0x84, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0xb0, 0x63, 0xd4, 0x8c, 0x7e, 0xf7, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x94, 0x84, 0x90, 0x63, 0x6f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0xb0, 0x6b, 0x9e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x58, 0xa5, 0x96, 0x84, 0x96, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0x54, 0x7c, 0xb1, 0x63, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x52, 0xf0, 0x7b, 0xdb, 0xde, 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, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xef, 0x12, 0x74, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x32, 0x7c, 0x19, 0xbe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x94, 0x84, 0x90, 0x5b, 0x4f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0xb0, 0x6b, 0x9e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0xd6, 0xf7, 0x94, 0x75, 0x7c, 0xb6, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0x75, 0x7c, 0xd1, 0x6b, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x4e, 0x6b, 0x96, 0xb5, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x77, 0xa5, 0xd1, 0x6b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x12, 0x74, 0x97, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xf7, 0x93, 0x84, 0x70, 0x5b, 0x4f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0xb0, 0x6b, 0x9e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd9, 0xad, 0xd6, 0x8c, 0x96, 0x84, 0xb6, 0x84, 0xd6, 0x8c, 0xb6, 0x84, 0x75, 0x7c, 0xd1, 0x6b, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0xed, 0x4a, 0xed, 0x5a, 0xf0, 0x83, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x15, 0x95, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0xb1, 0x63, 0xb0, 0x63, 0x70, 0x5b, 0xf2, 0x6b, 0x36, 0x9d, 0x1d, 0xdf, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xbf, 0xf7, 0x93, 0x84, 0x70, 0x5b, 0x4f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0xb0, 0x6b, 0xbe, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xde, 0x57, 0x9d, 0x96, 0x84, 0x75, 0x7c, 0x96, 0x84, 0xd7, 0x8c, 0xd7, 0x8c, 0x75, 0x7c, 0xb1, 0x63, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xcd, 0x4a, 0x4e, 0x63, 0xd8, 0xbd, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xb7, 0xad, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xf2, 0x6b, 0x57, 0xa5, 0x3d, 0xe7, 0x9e, 0xef, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xbf, 0xf7, 0x94, 0x84, 0x70, 0x5b, 0x4f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x2f, 0x5b, 0xb0, 0x6b, 0xff, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9e, 0xef, 0x5e, 0xef, 0xd9, 0xad, 0x75, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0xb6, 0x84, 0xb6, 0x8c, 0xb6, 0x84, 0x54, 0x7c, 0xb1, 0x63, 0x2e, 0x53, 0x0d, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xcd, 0x4a, 0x4f, 0x5b, 0x59, 0xc6, 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, 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, 0xdf, 0xff, 0x73, 0x84, 0x4f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xd2, 0x6b, 0xd1, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0x13, 0x74, 0x94, 0x84, 0x7a, 0xce, 0xbf, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x93, 0x84, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2e, 0x53, 0x90, 0x6b, 0x9e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7e, 0xf7, 0x5a, 0xc6, 0xd6, 0x8c, 0x95, 0x84, 0x75, 0x84, 0x75, 0x7c, 0x95, 0x84, 0xb6, 0x84, 0xb6, 0x84, 0x96, 0x84, 0x33, 0x74, 0x90, 0x5b, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x0e, 0x53, 0xf1, 0x6b, 0x3d, 0xef, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x56, 0xa5, 0xb1, 0x63, 0x50, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x5b, 0x90, 0x63, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0x91, 0x63, 0xd1, 0x6b, 0xd2, 0x6b, 0xf2, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x63, 0xf2, 0x6b, 0x74, 0x7c, 0xf6, 0x94, 0xd9, 0xb5, 0x9b, 0xce, 0x1d, 0xe7, 0xff, 0xff, 0xbe, 0xf7, 0x32, 0x7c, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2e, 0x53, 0x90, 0x6b, 0xd8, 0xb5, 0x3d, 0xef, 0x3d, 0xe7, 0xbb, 0xd6, 0x98, 0xa5, 0xd6, 0x8c, 0x75, 0x84, 0x34, 0x7c, 0x54, 0x7c, 0x75, 0x7c, 0x95, 0x84, 0xb6, 0x84, 0x96, 0x84, 0x54, 0x7c, 0xd2, 0x6b, 0x6f, 0x5b, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0xed, 0x4a, 0x2e, 0x53, 0x52, 0x7c, 0x5d, 0xef, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xc6, 0x90, 0x63, 0x4f, 0x53, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x90, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xd2, 0x6b, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x13, 0x74, 0xf2, 0x6b, 0xd2, 0x6b, 0xd2, 0x6b, 0x13, 0x74, 0xb5, 0x84, 0xb8, 0xad, 0x77, 0xa5, 0xb1, 0x6b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x90, 0x63, 0x53, 0x7c, 0xd5, 0x8c, 0x95, 0x84, 0x13, 0x74, 0xf3, 0x6b, 0x13, 0x74, 0x54, 0x74, 0x74, 0x7c, 0x95, 0x84, 0x95, 0x84, 0x95, 0x84, 0x54, 0x7c, 0xf2, 0x6b, 0x90, 0x63, 0x4e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0xcd, 0x42, 0x4f, 0x5b, 0xb3, 0x8c, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0xd6, 0x32, 0x74, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0xb1, 0x63, 0xd1, 0x6b, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x34, 0x74, 0x13, 0x74, 0x90, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x91, 0x63, 0xf2, 0x6b, 0x13, 0x74, 0x13, 0x74, 0x33, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x74, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x34, 0x74, 0x12, 0x74, 0xb1, 0x63, 0x4f, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0xcc, 0x42, 0xd0, 0x6b, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb4, 0x8c, 0x90, 0x5b, 0x4f, 0x5b, 0x90, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0xd2, 0x6b, 0xf2, 0x6b, 0x13, 0x74, 0x33, 0x74, 0x33, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x54, 0x7c, 0x33, 0x74, 0x90, 0x63, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x91, 0x63, 0xf3, 0x6b, 0x33, 0x74, 0x33, 0x74, 0x33, 0x74, 0x34, 0x74, 0x54, 0x7c, 0x54, 0x7c, 0x13, 0x74, 0xd2, 0x6b, 0x90, 0x5b, 0x4f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0d, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0xed, 0x4a, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0xac, 0x3a, 0xb0, 0x63, 0x1c, 0xdf, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x53, 0x7c, 0x4f, 0x53, 0x4f, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x6f, 0x5b, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x6f, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0x12, 0x6c, 0x33, 0x74, 0x54, 0x7c, 0x95, 0x84, 0x54, 0x7c, 0x90, 0x63, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x91, 0x63, 0x13, 0x74, 0x33, 0x74, 0x13, 0x74, 0xf2, 0x73, 0xf2, 0x6b, 0xd1, 0x63, 0x90, 0x63, 0x6f, 0x5b, 0x4f, 0x5b, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x52, 0x2e, 0x5b, 0x2e, 0x53, 0xed, 0x4a, 0xed, 0x4a, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0xf1, 0x73, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd5, 0x94, 0x90, 0x63, 0x2f, 0x53, 0x70, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x70, 0x5b, 0x4f, 0x53, 0x2e, 0x5b, 0x6f, 0x63, 0x90, 0x63, 0x4f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x6f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x70, 0x5b, 0x90, 0x63, 0xb1, 0x63, 0xd1, 0x6b, 0xf2, 0x6b, 0xd2, 0x6b, 0x70, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x70, 0x5b, 0xb1, 0x63, 0xb1, 0x63, 0xb1, 0x63, 0x90, 0x63, 0x70, 0x5b, 0x4f, 0x5b, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x2e, 0x63, 0xd0, 0x7b, 0x97, 0xb5, 0x18, 0xbe, 0x11, 0x74, 0x0e, 0x4b, 0xcd, 0x42, 0x0e, 0x4b, 0x0e, 0x4b, 0xed, 0x4a, 0xcd, 0x42, 0xb0, 0x6b, 0x56, 0xad, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0x32, 0x7c, 0x70, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x70, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x6f, 0x63, 0xb0, 0x7b, 0x73, 0x94, 0xb4, 0x8c, 0x12, 0x74, 0xb0, 0x63, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x5b, 0x6f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0d, 0x53, 0xed, 0x52, 0x4e, 0x63, 0x52, 0x8c, 0x9a, 0xde, 0xff, 0xff, 0x00, 0x00, 0xfb, 0xde, 0x32, 0x7c, 0x2e, 0x53, 0xed, 0x4a, 0xcd, 0x42, 0x0e, 0x53, 0xb0, 0x6b, 0xf4, 0x9c, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xf7, 0x32, 0x7c, 0x90, 0x63, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x6f, 0x5b, 0xd0, 0x73, 0x52, 0x8c, 0xdc, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0xad, 0x11, 0x74, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0xed, 0x4a, 0xcc, 0x52, 0x6f, 0x73, 0x76, 0xb5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb7, 0xad, 0x2e, 0x53, 0x2e, 0x53, 0xd0, 0x6b, 0xb7, 0xb5, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x94, 0xb1, 0x6b, 0x4f, 0x5b, 0xd1, 0x6b, 0x73, 0x8c, 0xdb, 0xde, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5e, 0xef, 0x73, 0x84, 0x6f, 0x5b, 0x2e, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xcc, 0x4a, 0x4e, 0x6b, 0x96, 0xb5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 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, 0xff, 0xff, 0x77, 0xa5, 0x15, 0x95, 0xb8, 0xb5, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x77, 0xa5, 0x90, 0x63, 0x0e, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0d, 0x4b, 0xed, 0x52, 0x11, 0x84, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x94, 0x90, 0x63, 0x0e, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0d, 0x4b, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0x0e, 0x53, 0x72, 0x84, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf1, 0x73, 0x4f, 0x5b, 0x2e, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x2f, 0x53, 0x2f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0x0d, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0d, 0x4b, 0x0e, 0x4b, 0x32, 0x7c, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6f, 0x5b, 0x2f, 0x53, 0x4f, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x2f, 0x53, 0x0e, 0x53, 0xed, 0x52, 0x6f, 0x63, 0xd0, 0x6b, 0xb0, 0x63, 0x4f, 0x5b, 0x2e, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0xed, 0x52, 0x4e, 0x5b, 0x8f, 0x6b, 0xd0, 0x73, 0x52, 0x84, 0x73, 0x84, 0x6f, 0x63, 0xcd, 0x42, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0d, 0x4b, 0xed, 0x4a, 0xf1, 0x73, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0xff, 0xff, 0x9b, 0xce, 0x4f, 0x5b, 0x0e, 0x53, 0x4f, 0x5b, 0x4f, 0x5b, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x4f, 0x53, 0x0e, 0x53, 0xed, 0x5a, 0xd0, 0x7b, 0xb7, 0xbd, 0xbb, 0xd6, 0x5a, 0xc6, 0xf5, 0x94, 0x6f, 0x5b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0x2e, 0x5b, 0xd0, 0x7b, 0xd8, 0xbd, 0x9a, 0xd6, 0x7a, 0xd6, 0x3c, 0xe7, 0x9f, 0xf7, 0x35, 0x9d, 0x0e, 0x4b, 0x0d, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x4b, 0x0e, 0x53, 0x0e, 0x4b, 0xcd, 0x42, 0xb0, 0x63, 0x39, 0xc6, 0xff, 0xff, 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, 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, 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, 0xff, 0xff, 0xd4, 0x8c, 0x2f, 0x53, 0x0e, 0x4b, 0x4f, 0x5b, 0x4f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x8f, 0x73, 0x59, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xf7, 0xd0, 0x6b, 0x2e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xed, 0x4a, 0xed, 0x52, 0xd0, 0x7b, 0xdb, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xef, 0x32, 0x74, 0xed, 0x4a, 0xed, 0x4a, 0x0e, 0x53, 0x0e, 0x4b, 0x0e, 0x4b, 0x0d, 0x4b, 0xcd, 0x42, 0x6f, 0x5b, 0xb3, 0x94, 0xff, 0xff, 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, 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, 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, 0xff, 0xff, 0x76, 0xa5, 0x2e, 0x53, 0xed, 0x4a, 0x2e, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2f, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x6f, 0x63, 0x76, 0xad, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x11, 0x74, 0x4f, 0x5b, 0x0e, 0x4b, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0xed, 0x4a, 0x2e, 0x63, 0xf4, 0xa4, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x97, 0xad, 0x2e, 0x53, 0xcd, 0x42, 0x0e, 0x4b, 0x0e, 0x4b, 0xed, 0x4a, 0xed, 0x4a, 0xcd, 0x42, 0xb0, 0x6b, 0x9b, 0xd6, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xf7, 0x52, 0x7c, 0x6f, 0x5b, 0xee, 0x4a, 0xed, 0x4a, 0x0e, 0x4b, 0x0e, 0x53, 0xee, 0x4a, 0x2e, 0x5b, 0x32, 0x84, 0xbe, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x93, 0x8c, 0x6f, 0x5b, 0xed, 0x4a, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x4b, 0xed, 0x4a, 0x6f, 0x63, 0xdb, 0xde, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x5d, 0xef, 0x12, 0x74, 0xcd, 0x42, 0xac, 0x42, 0xcd, 0x4a, 0x0e, 0x53, 0x4f, 0x5b, 0xf1, 0x73, 0x5a, 0xce, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0xf7, 0xd8, 0xb5, 0x52, 0x7c, 0xd1, 0x6b, 0x6f, 0x5b, 0x2e, 0x53, 0x6f, 0x5b, 0x52, 0x84, 0x9a, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x94, 0x6f, 0x5b, 0xed, 0x4a, 0x0e, 0x53, 0x0e, 0x53, 0x0e, 0x53, 0x2e, 0x53, 0x0e, 0x4b, 0x0e, 0x53, 0x6f, 0x6b, 0xbe, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9a, 0xce, 0x52, 0x7c, 0xb0, 0x6b, 0x12, 0x74, 0xb3, 0x8c, 0x39, 0xc6, 0x9e, 0xf7, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xf7, 0x3d, 0xe7, 0xf5, 0x94, 0x11, 0x74, 0xf8, 0xb5, 0xbf, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x35, 0x9d, 0x4f, 0x5b, 0xcd, 0x42, 0x0d, 0x4b, 0x0d, 0x4b, 0x0d, 0x4b, 0x0e, 0x4b, 0xed, 0x4a, 0x0e, 0x53, 0xd0, 0x73, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xf7, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xef, 0x8f, 0x63, 0xed, 0x4a, 0x0d, 0x4b, 0x0d, 0x4b, 0x0d, 0x4b, 0xed, 0x4a, 0xcd, 0x4a, 0x4f, 0x5b, 0x93, 0x94, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x76, 0xa5, 0x11, 0x74, 0x11, 0x74, 0x11, 0x74, 0x11, 0x74, 0xf1, 0x73, 0xd0, 0x6b, 0x73, 0x84, 0x7e, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  /*alpha channel*/
+  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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 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, 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, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 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, 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, 0x0c, 0x0f, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x53, 0xff, 0x28, 0x06, 0x0b, 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, 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, 0x06, 0x0c, 0x2b, 0xff, 0xff, 0xa5, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x51, 0xff, 0xff, 0xff, 0xff, 0xff, 0x28, 0x08, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xb2, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x23, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6b, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xc4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x01, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xa2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x0e, 0x00, 0x00, 0x00, 0x07, 0x2d, 0x82, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x46, 0x05, 0x00, 0x31, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xdc, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbb, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, 0x3b, 0x34, 0x4e, 0xac, 0xff, 0xff, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xa8, 0x59, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xf3, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf3, 0xf0, 0xf3, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x95, 0x2e, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x4b, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x86, 0xe6, 0xff, 0xff, 0x93, 0x05, 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, 0x07, 0xaf, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xd2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xf4, 0xff, 0xff, 0xdc, 0xff, 0xff, 0xb1, 0x04, 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, 0x08, 0xcc, 0xff, 0xff, 0xff, 0xff, 0x4a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0x83, 0x02, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xbf, 0x06, 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, 0x08, 0xc8, 0xff, 0xff, 0xf9, 0xf9, 0xff, 0xff, 0xbb, 0x19, 0x00, 0x00, 0x02, 0x78, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x6b, 0x2c, 0xf7, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xa7, 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, 0x01, 0x9f, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xe6, 0x20, 0x06, 0x76, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xe3, 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, 0x09, 0xd7, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb9, 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, 0x06, 0xc4, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 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, 0x6f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, 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, 0x0a, 0x8f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x12, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x62, 0x19, 0x14, 0x31, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x1d, 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, 0x13, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, 0x0f, 0x04, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x03, 0x00, 0x00, 0x00, 0x07, 0x36, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9d, 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, 0x28, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x55, 0x0f, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0b, 0x4f, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0e, 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, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x40, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x5e, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 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, 0x02, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 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, 0x19, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0x89, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xc1, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x44, 0x7c, 0x70, 0x86, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x70, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xac, 0x80, 0x80, 0x78, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xf3, 0xe8, 0x64, 0x0b, 0x01, 0x02, 0x00, 0x04, 0x94, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe6, 0xe8, 0xe6, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x11, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xcd, 0xcf, 0xad, 0xd5, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x19, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x51, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x04, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x04, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x02, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x08, 0x92, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xad, 0x29, 0x01, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x05, 0x41, 0xd8, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x46, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xa6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x83, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x7f, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0x85, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x17, 0x79, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x8c, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xf7, 0xff, 0xff, 0x5b, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x8a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb9, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xfb, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xe9, 0xff, 0xe2, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xde, 0xff, 0xb6, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x91, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x95, 0xff, 0xf4, 0xff, 0xd9, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xce, 0xfb, 0xf7, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x78, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xff, 0xff, 0xd5, 0x04, 0x00, 0x0f, 0xff, 0xff, 0xe8, 0xaf, 0xb5, 0xb4, 0xae, 0xe6, 0xff, 0xff, 0xb3, 0x03, 0x01, 0xcb, 0xff, 0xff, 0xff, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xed, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xff, 0xff, 0xf8, 0xff, 0xdd, 0x02, 0x00, 0x00, 0x15, 0x79, 0x0d, 0x00, 0x01, 0x01, 0x00, 0x0a, 0x77, 0x3b, 0x01, 0x00, 0x02, 0xdf, 0xff, 0xf3, 0xff, 0xcb, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x26, 0x01, 0x02, 0x02, 0x03, 0x02, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xf4, 0xff, 0xff, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xd5, 0xdc, 0xdf, 0xff, 0xe6, 0x0d, 0x00,
+  0x00, 0x00, 0x09, 0x11, 0x0b, 0x1a, 0x50, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x42, 0x02, 0x03, 0x04, 0x04, 0x05, 0x05, 0x04, 0x04, 0x04, 0x05, 0x03, 0x05, 0x13, 0x81, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xb1, 0x11, 0x03, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x02, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x01,
+  0x00, 0x20, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 0x65, 0x81, 0x80, 0x89, 0x8b, 0x89, 0x88, 0x87, 0x89, 0x78, 0xaf, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x08,
+  0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb6, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x3a,
+  0x51, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xaf,
+  0x60, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff,
+  0x3b, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff,
+  0x3d, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xb2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e,
+  0x2d, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b,
+  0x0b, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x93, 0x56, 0x5b, 0x5b, 0x62, 0x62, 0x5a, 0x5c, 0x64, 0x53, 0x90, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x79, 0x85, 0x83, 0x83, 0x83, 0x83, 0x7e, 0x8b, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0x60, 0x16, 0x0d, 0x08, 0x00,
+  0x00, 0x16, 0xa1, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x1d, 0x04, 0x02, 0x02, 0x02, 0x03, 0x03, 0x02, 0x02, 0x03, 0x02, 0x05, 0x11, 0x71, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xf8, 0xff, 0xfb, 0xff, 0xff, 0xf7, 0xff, 0xff, 0x2b, 0x03, 0x06, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x32, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x05, 0x0c, 0x0b, 0x07, 0x19, 0x90, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xb2, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3b, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x50, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x29, 0x00, 0x02, 0x78, 0xed, 0x40, 0x01, 0x02, 0x02, 0x01, 0x20, 0x9e, 0x23, 0x00, 0x00, 0x02, 0xd9, 0xff, 0xfb, 0xff, 0xff, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7c, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xff, 0xff, 0xff, 0xff, 0x58, 0x06, 0x2e, 0xff, 0xff, 0xff, 0xbc, 0xbe, 0xc1, 0xbc, 0xfc, 0xff, 0xff, 0x37, 0x02, 0x07, 0xd9, 0xff, 0xff, 0xff, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x68, 0xff, 0xff, 0xff, 0xff, 0xe8, 0xfc, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0xd9, 0xf8, 0xff, 0xff, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x54, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8d, 0xff, 0xe8, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xef, 0xff, 0x6d, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xee, 0xff, 0xfc, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf8, 0xff, 0xd9, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6c, 0xff, 0xff, 0xfc, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x76, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x53, 0x09, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x29, 0x90, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xa4, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x84, 0x18, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x90, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x35, 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x03, 0x57, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x05, 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x09, 0x00, 0x00,
+  0x00, 0x01, 0x00, 0x1b, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x05, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x7d, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x07, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x01, 0x00, 0x15, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x55, 0x35, 0xca, 0xd6, 0xca, 0xdc, 0xf8, 0x19, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0xc6, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xc8, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xce, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xaa, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xbd, 0x9b, 0x99, 0xa3, 0x93, 0x25, 0x0b, 0x74, 0xf6, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xd5, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xb1, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x2c, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x7f, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x48, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x74, 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, 0x02, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x7a, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x12, 0x92, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x08, 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, 0x01, 0x00, 0x09, 0xc8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xcd, 0x38, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x13, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3e, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x72, 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, 0x01, 0x00, 0x04, 0xa8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xac, 0x31, 0x22, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x13, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x1f, 0x23, 0x86, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4e, 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, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x57, 0x1a, 0x08, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x0f, 0x28, 0x68, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 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, 0x02, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x75, 0x3b, 0x33, 0x12, 0x26, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x3b, 0x2d, 0x39, 0xa3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x1e, 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, 0x4d, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0xac, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xb3, 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, 0x4c, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0x0a, 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, 0x04, 0xe8, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 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, 0x0c, 0xee, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xe2, 0x0d, 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, 0x06, 0xd2, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0x8b, 0x73, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xff, 0x8a, 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, 0x1b, 0xeb, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xdd, 0xd2, 0xe3, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xfc, 0x4e, 0x03, 0x00, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0x0a, 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, 0x11, 0xe6, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xe8, 0x42, 0x09, 0x03, 0x0c, 0x93, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x72, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10, 0x66, 0xf6, 0xd8, 0xe6, 0x8b, 0x0b, 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, 0x0f, 0xd0, 0xff, 0xff, 0xff, 0xf6, 0x4e, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x0c, 0x0f, 0x06, 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, 0x12, 0x9b, 0xa0, 0x91, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x0b, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf9, 0xf9, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf9, 0xf7, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x17, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x66, 0x3a, 0x50, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x58, 0x40, 0x4e, 0x3f, 0x2e, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x59, 0x00, 0x00, 0x00, 0x24, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x05, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x05, 0x00, 0x01, 0x00, 0x0c, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x82, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x54, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x29, 0x00, 0x00, 0x00, 0x00, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x52, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x07, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x95, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x01, 0x00, 0x00, 0x12, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x68, 0xff, 0xff, 0xff, 0xff, 0x6a, 0x25, 0x07, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x16, 0x39, 0xeb, 0xff, 0x63, 0x17, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x1e, 0x1e, 0x1f, 0x1c, 0x06, 0x00, 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, 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, 0x12, 0x1a, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 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, 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, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0xb8, 0xff, 0xe7, 0xe2, 0xe4, 0xe7, 0xff, 0xf7, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 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, 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, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x0c, 0x0c, 0x0b, 0x10, 0x18, 0x12, 0x0b, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+};
+
+const lv_img_dsc_t img_benchmark_cogwheel_rgb565a8 = {
+  .header.cf = LV_IMG_CF_RGB565A8,
+  .header.always_zero = 0,
+  .header.reserved = 0,
+  .header.w = 100,
+  .header.h = 100,
+  .data_size = 30000,
+  .data = img_benchmark_cogwheel_rgb565a8_map,
+};
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/_static/js/custom.js b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/_static/js/custom.js
new file mode 100644 (file)
index 0000000..d16e00b
--- /dev/null
@@ -0,0 +1,18 @@
+/* API collapsing */
+document.addEventListener('DOMContentLoaded', (event) => {
+    document.querySelectorAll("dl.cpp").forEach(cppListing => {
+        const dt = cppListing.querySelector("dt");
+        let shouldBeExpanded = false;
+        if(dt.id == document.location.hash.substring(1))
+            shouldBeExpanded = true;
+        cppListing.classList.add(shouldBeExpanded ? "expanded" : "unexpanded");
+        const button = document.createElement("span");
+        button.classList.add("lv-api-expansion-button");
+        button.addEventListener("click", () => {
+            cppListing.classList.toggle("unexpanded");
+            cppListing.classList.toggle("expanded");
+        });
+        
+        dt.insertBefore(button, dt.firstChild);
+    });
+})
\ No newline at end of file
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/bindings/cpp.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/bindings/cpp.md
new file mode 100644 (file)
index 0000000..1260165
--- /dev/null
@@ -0,0 +1,4 @@
+# Cpp
+
+In progress: https://github.com/lvgl/lv_binding_cpp
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/bindings/index.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/bindings/index.md
new file mode 100644 (file)
index 0000000..32636ca
--- /dev/null
@@ -0,0 +1,12 @@
+# Bindings
+
+
+```eval_rst
+
+.. toctree::
+   :maxdepth: 2
+
+   micropython
+   cpp
+```
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/bindings/micropython.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/bindings/micropython.md
new file mode 100644 (file)
index 0000000..613e719
--- /dev/null
@@ -0,0 +1,92 @@
+# Micropython
+
+## What is Micropython?
+
+[Micropython](http://micropython.org/) is Python for microcontrollers.
+Using Micropython, you can write Python3 code and run it even on a bare metal architecture with limited resources.
+
+### Highlights of Micropython
+
+- **Compact** - Fits and runs within just 256k of code space and 16k of RAM. No OS is needed, although you can also run it with an OS, if you want.
+- **Compatible** - Strives to be as compatible as possible with normal Python (known as CPython).
+- **Versatile** - Supports many architectures (x86, x86-64, ARM, ARM Thumb, Xtensa).
+- **Interactive** - No need for the compile-flash-boot cycle. With the REPL (interactive prompt) you can type commands and execute them immediately, run scripts, etc.
+- **Popular** - Many platforms are supported. The user base is growing bigger. Notable forks: [MicroPython](https://github.com/micropython/micropython), [CircuitPython](https://github.com/adafruit/circuitpython), [MicroPython_ESP32_psRAM_LoBo](https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo)
+- **Embedded Oriented** - Comes with modules specifically for embedded systems, such as the [machine module](https://docs.micropython.org/en/latest/library/machine.html#classes) for accessing low-level hardware (I/O pins, ADC, UART, SPI, I2C, RTC, Timers etc.)
+
+---
+
+## Why Micropython + LVGL?
+
+Currently, Micropython [does not have a good high-level GUI library](https://forum.micropython.org/viewtopic.php?f=18&t=5543) by default. LVGL is an [Object-Oriented Component Based](https://blog.lvgl.io/2018-12-13/extend-lvgl-objects) high-level GUI library, which seems to be a natural candidate to map into a higher level language, such as Python. LVGL is implemented in C and its APIs are in C.
+
+### Here are some advantages of using LVGL in Micropython:
+
+- Develop GUI in Python, a very popular high level language. Use paradigms such as Object-Oriented Programming.
+- Usually, GUI development requires multiple iterations to get things right. With C, each iteration consists of **`Change code` > `Build` > `Flash` > `Run`**.
+In Micropython it's just **`Change code` > `Run`** ! You can even run commands interactively using the [REPL](https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop) (the interactive prompt)
+
+### Micropython + LVGL could be used for:
+
+- Fast prototyping GUI.
+- Shortening the cycle of changing and fine-tuning the GUI.
+- Modelling the GUI in a more abstract way by defining reusable composite objects, taking advantage of Python's language features such as Inheritance, Closures, List Comprehension, Generators, Exception Handling, Arbitrary Precision Integers and others.
+- Make LVGL accessible to a larger audience. No need to know C to create a nice GUI on an embedded system.
+This goes well with [CircuitPython vision](https://learn.adafruit.com/welcome-to-circuitpython/what-is-circuitpython). CircuitPython was designed with education in mind, to make it easier for new or inexperienced users to get started with embedded development.
+- Creating tools to work with LVGL at a higher level (e.g. drag-and-drop designer).
+
+---
+
+## So what does it look like?
+
+> TL;DR:
+> It's very much like the C API, but Object-Oriented for LVGL components.
+
+Let's dive right into an example!
+
+### A simple example
+
+```python
+import lvgl as lv
+lv.init()
+scr = lv.obj()
+btn = lv.btn(scr)
+btn.align(lv.scr_act(), lv.ALIGN.CENTER, 0, 0)
+label = lv.label(btn)
+label.set_text("Button")
+lv.scr_load(scr)
+```
+
+## How can I use it?
+
+### Online Simulator
+
+If you want to experiment with LVGL + Micropython without downloading anything - you can use our online simulator!
+It's a fully functional LVGL + Micropython that runs entirely in the browser and allows you to edit a python script and run it.
+
+[Click here to experiment on the online simulator](https://sim.lvgl.io/)
+
+[Hello World](https://sim.lvgl.io/v7/micropython/ports/javascript/bundle_out/index.html?script=https://gist.githubusercontent.com/amirgon/51299ce9b6448328a855826149482ae6/raw/0f235c6d40462fd2f0e55364b874f14fe3fd613c/lvgl_hello_world.py&script_startup=https://gist.githubusercontent.com/amirgon/7bf15a66ba6d959bbf90d10f3da571be/raw/8684b5fa55318c184b1310663b187aaab5c65be6/init_lv_mp_js.py)
+
+Note: the online simulator is available for lvgl v6 and v7.
+
+### PC Simulator
+
+Micropython is ported to many platforms. One notable port is "unix", which allows you to build and run Micropython (+LVGL) on a Linux machine. (On a Windows machine you might need Virtual Box or WSL or MinGW or Cygwin etc.)
+
+[Click here to know more information about building and running the unix port](https://github.com/lvgl/lv_micropython)
+
+### Embedded platform
+
+In the end, the goal is to run it all on an embedded platform.
+Both Micropython and LVGL can be used on many embedded architectures, such as stm32, ESP32 etc.
+You would also need display and input drivers. We have some sample drivers (ESP32+ILI9341, as well as some other examples), but chances are you would want to create your own input/display drivers for your specific hardware.
+Drivers can be implemented either in C as a Micropython module, or in pure Micropython!
+
+## Where can I find more information?
+
+- In this [Blog Post](https://blog.lvgl.io/2019-02-20/micropython-bindings)
+- `lv_micropython` [README](https://github.com/lvgl/lv_micropython)
+- `lv_binding_micropython` [README](https://github.com/lvgl/lv_binding_micropython)
+- The [LVGL micropython forum](https://forum.lvgl.io/c/micropython) (Feel free to ask anything!)
+- At Micropython: [docs](http://docs.micropython.org/en/latest/) and [forum](https://forum.micropython.org/)
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/os/freertos.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/os/freertos.md
new file mode 100644 (file)
index 0000000..8c50b2a
--- /dev/null
@@ -0,0 +1,3 @@
+# FreeRTOS
+
+TODO
\ No newline at end of file
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/os/index.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/os/index.md
new file mode 100644 (file)
index 0000000..30ea6af
--- /dev/null
@@ -0,0 +1,13 @@
+# (RT)OS
+
+```eval_rst
+
+.. toctree::
+   :maxdepth: 2
+
+   nuttx
+   rt-thread
+   freertos
+   zephyr
+```
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/os/nuttx.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/os/nuttx.md
new file mode 100644 (file)
index 0000000..97b95f7
--- /dev/null
@@ -0,0 +1,97 @@
+# NuttX RTOS
+
+## What is NuttX?
+
+[NuttX](https://nuttx.apache.org/) is a mature and secure real-time operating system (RTOS) with an emphasis on technical standards compliance and small size.
+It is scalable from 8-bit to 64-bit microcontrollers and microprocessors and compliant with the Portable Operating System Interface (POSIX) and the American National Standards Institute (ANSI) standards and with many Linux-like subsystems.
+The best way to think about NuttX is to think of it as a small Unix/Linux for microcontrollers.
+
+### Highlights of NuttX
+
+- **Small** - Fits and runs in microcontrollers as small as 32 kB Flash and 8 kB of RAM.
+- **Compliant** - Strives to be as compatible as possible with POSIX and Linux.
+- **Versatile** - Supports many architectures (ARM, ARM Thumb, AVR, MIPS, OpenRISC, RISC-V 32-bit and 64-bit, RX65N, x86-64, Xtensa, Z80/Z180, etc.).
+- **Modular** - Its modular design allows developers to select only what really matters and use modules to include new features.
+- **Popular** - NuttX is used by many companies around the world. Probably you already used a product with NuttX without knowing it was running NuttX.
+- **Predictable** - NuttX is a preemptible Realtime kernel, so you can use it to create predictable applications for realtime control.
+
+---
+
+## Why NuttX + LVGL?
+
+Although NuttX has its own graphic library called [NX](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=139629474), LVGL is a good alternative because users could find more eye-candy demos and they can reuse code from previous projects.
+LVGL is an [Object-Oriented Component Based](https://blog.lvgl.io/2018-12-13/extend-lvgl-objects) high-level GUI library, that could fit very well for a RTOS with advanced features like NuttX.
+LVGL is implemented in C and its APIs are in C.
+
+### Here are some advantages of using LVGL in NuttX
+
+- Develop GUI in Linux first and when it is done just compile it for NuttX. Nothing more, no wasting of time.
+- Usually, GUI development for low level RTOS requires multiple iterations to get things right, where each iteration consists of **`Change code` > `Build` > `Flash` > `Run`**.
+Using LVGL, Linux and NuttX you can reduce this process and just test everything on your computer and when it is done, compile it on NuttX and that is it.
+
+### NuttX + LVGL could be used for
+
+- GUI demos to demonstrate your board graphics capacities.
+- Fast prototyping GUI for MVP (Minimum Viable Product) presentation.
+- visualize sensor data directly and easily on the board without using a computer.
+- Final products with a GUI without a touchscreen (i.e. 3D Printer Interface using Rotary Encoder to Input data).
+- Final products with a touchscreen (and all sorts of bells and whistles).
+
+---
+
+## How to get started with NuttX and LVGL?
+
+There are many boards in the [NuttX mainline](https://github.com/apache/incubator-nuttx) with support for LVGL.
+Let's use the [STM32F429IDISCOVERY](https://www.st.com/en/evaluation-tools/32f429idiscovery.html) as an example because it is a very popular board.
+
+### First you need to install the pre-requisites on your system
+
+Let's use the [Windows Subsystem for Linux](https://acassis.wordpress.com/2018/01/10/how-to-build-nuttx-on-windows-10/)
+
+```shell
+$ sudo apt-get install automake bison build-essential flex gcc-arm-none-eabi gperf git libncurses5-dev libtool libusb-dev libusb-1.0.0-dev pkg-config kconfig-frontends openocd
+```
+
+### Now let's create a workspace to save our files
+
+```shell
+$ mkdir ~/nuttxspace
+$ cd ~/nuttxspace
+```
+
+### Clone the NuttX and Apps repositories:
+
+```shell
+$ git clone https://github.com/apache/incubator-nuttx nuttx
+$ git clone https://github.com/apache/incubator-nuttx-apps apps
+```
+
+### Configure NuttX to use the stm32f429i-disco board and the LVGL Demo
+
+```shell
+$ ./tools/configure.sh stm32f429i-disco:lvgl
+$ make
+```
+
+If everything went fine you should have now the file `nuttx.bin` to flash on your board:
+
+```shell
+$ ls -l nuttx.bin
+-rwxrwxr-x 1 alan alan 287144 Jun 27 09:26 nuttx.bin
+```
+
+### Flashing the firmware in the board using OpenOCD:
+```shell
+$ sudo openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg -c init -c "reset halt" -c "flash write_image erase nuttx.bin 0x08000000"
+```
+
+Reset the board and using the 'NSH>' terminal start the LVGL demo:
+```shell
+nsh> lvgldemo
+```
+
+## Where can I find more information?
+
+- This blog post: [LVGL on LPCXpresso54628](https://acassis.wordpress.com/2018/07/19/running-nuttx-on-lpcxpresso54628-om13098/)
+- NuttX mailing list: [Apache NuttX Mailing List](http://nuttx.incubator.apache.org/community/)
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/os/rt-thread.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/os/rt-thread.md
new file mode 100644 (file)
index 0000000..25bf61f
--- /dev/null
@@ -0,0 +1,48 @@
+# RT-Thread RTOS
+
+<img src="https://raw.githubusercontent.com/RT-Thread/rt-thread/master/documentation/figures/logo.png" width=40% style="float: center;" >
+
+## What is RT-Thread?
+
+[Introduce about RT-Thread and how to run LVGL on RT-Thread in simulators](https://www.youtube.com/watch?v=k7QYk6hSwnc)
+
+[**RT-Thread**](https://www.rt-thread.io/) is an [open source](https://github.com/RT-Thread/rt-thread), neutral, and community-based real-time operating system (RTOS). RT-Thread has **Standard version** and **Nano version**. For resource-constrained microcontroller (MCU) systems, the Nano version that requires only 3 KB Flash and 1.2 KB RAM memory resources can be tailored with easy-to-use tools. For resource-rich IoT devices, RT-Thread can use the **online software package** management tool, together with system configuration tools, to achieve intuitive and rapid modular cutting, seamlessly import rich software packages; thus, achieving complex functions like Android's graphical interface and touch sliding effects, smart voice interaction effects, and so on.
+
+### Key features
+
+- Designed for resource-constrained devices, the minimum kernel requires only 1.2KB of RAM and 3 KB of Flash.
+- A variety of standard interfaces, such as POSIX, CMSIS, C++ application environment.
+- Has rich components and a prosperous and fast growing <a href="https://packages.rt-thread.org/en/">package ecosystem</a>
+- Elegant code style, easy to use, read and master.
+- High Scalability. RT-Thread has high-quality scalable software architecture, loose coupling, modularity, is easy to tailor and expand.
+- Supports high-performance applications.
+- Supports all mainstream compiling tools such as GCC, Keil and IAR.
+- Supports a wide range of <a href="https://www.rt-thread.io/board.html">architectures and chips</a>.
+
+
+## How to run LVGL on RT-Thread?
+
+[中文文档](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/packages-manual/lvgl-docs/introduction)
+
+LVGL has registered as a [software package](https://packages.rt-thread.org/en/detail.html?package=LVGL) of RT-Thread. By using [Env tool](https://www.rt-thread.io/download.html?download=Env) or [RT-Thread Studio IDE](https://www.rt-thread.io/download.html?download=Studio), RT-Thread users can easily download LVGL source code and combine with RT-Thread project. RT-Thread community has port LVGL to several BSPs:
+
+| BSP                                                          | Note |
+| ------------------------------------------------------------ | ---- |
+| [QEMU simulator](https://github.com/RT-Thread/rt-thread/tree/master/bsp/qemu-vexpress-a9/applications/lvgl) |      |
+| [Visual Studio simulator](https://github.com/RT-Thread/rt-thread/tree/master/bsp/simulator/applications/lvgl) |      |
+| [Nuvoton numaker-iot-m487](https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/numaker-iot-m487/applications/lvgl) |      |
+| [Nuvoton numaker-pfm-m487](https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/numaker-pfm-m487/applications/lvgl) |      |
+| [Nuvoton nk-980iot](https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/nk-980iot/applications/lvgl) |      |
+| [Nuvoton numaker-m2354](https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/numaker-m2354/applications/lvgl) |      |
+| [Nuvoton nk-n9h30](https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/nk-n9h30/applications/lvgl) |      |
+| [Nuvoton numaker-m032ki](https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/numaker-m032ki/applications/lvgl) |      |
+| [NXP imxrt1060-evk](https://github.com/RT-Thread/rt-thread/tree/master/bsp/imxrt/imxrt1060-nxp-evk/applications/lvgl) |      |
+| [STM32L475 pandora](https://github.com/RT-Thread/rt-thread/tree/master/bsp/stm32/stm32l475-atk-pandora/applications/lvgl) |      |
+| [STM32F407 explorer](https://github.com/RT-Thread/rt-thread/tree/master/bsp/stm32/stm32f407-atk-explorer/applications/lvgl) |      |
+| [STM32F469 Discovery](https://github.com/RT-Thread/rt-thread/tree/master/bsp/stm32/stm32f469-st-disco/applications/lvgl) |      |
+| [Raspberry PICO](https://github.com/RT-Thread/rt-thread/tree/master/bsp/raspberry-pico/applications/lvgl) |      |
+
+
+### Import a BSP project into RT-Thread Studio
+
+Clone the latest code from RT-Thread official repository. Open the RT-Thread Studio and select `File -> Import`. In the Import menu, please select `RT-Thread BSP Project into Workspace`, and click `next` button. In the `BSP location area`, please select the root path of the BSP which you prefer to import, such as `C:\Users\xxx\Desktop\rt-thread\bsp\stm32\stm32l475-atk-pandora`. In the `Project Name area`, please type a name for this project, then, press `Finish` button.
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/os/zephyr.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/os/zephyr.md
new file mode 100644 (file)
index 0000000..3de4726
--- /dev/null
@@ -0,0 +1,3 @@
+# Zephyr
+
+TODO
\ No newline at end of file
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/arduino.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/arduino.md
new file mode 100644 (file)
index 0000000..2571cac
--- /dev/null
@@ -0,0 +1,84 @@
+
+# Arduino
+
+The [LVGL library](https://github.com/lvgl/lvgl) is directly available as Arduino libraries.
+
+Note that you need to choose a board powerful enough to run LVGL and your GUI.  See the [requirements of LVGL](https://docs.lvgl.io/master/intro/index.html#requirements).
+
+For example ESP32 is a good candidate to create UI's with LVGL.
+
+## Get the LVGL Arduino library
+
+LVGL can be installed via the Arduino IDE Library Manager or as a .ZIP library.
+
+You can [Download](https://github.com/lvgl/lvgl/archive/refs/heads/master.zip) the latest version of LVGL from GitHub and simply copy it to Arduino's library folder.
+
+## Set up drivers
+
+To get started it's recommended to use [TFT_eSPI](https://github.com/Bodmer/TFT_eSPI) library as a TFT driver to simplify testing.
+To make it work, setup `TFT_eSPI` according to your TFT display type via editing either
+- `User_Setup.h`
+- or by selecting a configuration in the `User_Setup_Select.h`
+
+Both files are located in `TFT_eSPI` library's folder.
+
+## Configure LVGL
+
+LVGL has its own configuration file called `lv_conf.h`. When LVGL is installed, follow these configuration steps:
+1. Go to the directory of the installed Arduino libraries
+2. Go to `lvgl` and copy `lv_conf_template.h` as `lv_conf.h` into the Arduino Libraries directory next to the `lvgl` library folder.
+3. Open `lv_conf.h` and change the first `#if 0` to `#if 1` to enable the content of the file
+4. Set the color depth of you display in `LV_COLOR_DEPTH`
+5. Set `LV_TICK_CUSTOM 1`
+
+Finally the layout with `lv_conf.h` should look like this:
+```
+arduino
+ |-libraries
+   |-lvgl
+   |-other_lib_1
+   |-other_lib_2
+   |-lv_conf.h
+```
+
+## Initialize and run LVGL
+
+Take a look at [LVGL_Arduino.ino](https://github.com/lvgl/lvgl/blob/master/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino) to see how to initialize LVGL.
+`TFT_eSPI` is used as the display driver.
+
+In the INO file you can see how to register a display and a touchpad for LVGL and call an example.
+
+## Use the examples and demos
+
+Note that, there is no dedicated INO file for every example. Instead, you can load an example by calling an `lv_example_...` function. For example `lv_example_btn_1()`.
+
+**IMPORTANT NOTE 1**
+Due to some the limitations of Arduino's build system you need to copy `lvgl/examples` to `lvgl/src/examples`. Similarly for the demos `lvgl/demos` to `lvgl/src/demos`.
+
+
+**IMPORTANT NOTE 2**
+Note that the `lv_examples` library is for LVGL v7 and you shouldn't install it for this version (since LVGL v8)
+as the examples and demos are now part of the main LVGL library.
+
+## Debugging and logging
+
+LVGL can display debug information in case of trouble.
+In the `LVGL_Arduino.ino` example there is a `my_print` method, which sends this debug information to the serial interface.
+To enable this feature you have to edit the `lv_conf.h` file and enable logging in the section `log settings`:
+
+```c
+/*Log settings*/
+#define USE_LV_LOG      1   /*Enable/disable the log module*/
+#if LV_USE_LOG
+/* How important log should be added:
+ * LV_LOG_LEVEL_TRACE       A lot of logs to give detailed information
+ * LV_LOG_LEVEL_INFO        Log important events
+ * LV_LOG_LEVEL_WARN        Log if something unwanted happened but didn't cause a problem
+ * LV_LOG_LEVEL_ERROR       Only critical issue, when the system may fail
+ * LV_LOG_LEVEL_NONE        Do not log anything
+ */
+#  define LV_LOG_LEVEL    LV_LOG_LEVEL_WARN
+```
+
+After enabling the log module and setting LV_LOG_LEVEL accordingly, the output log is sent to the `Serial` port @ 115200 bps.
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/cmake.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/cmake.md
new file mode 100644 (file)
index 0000000..cee542a
--- /dev/null
@@ -0,0 +1,89 @@
+
+# CMake
+LVGL supports integrating with [CMake](https://cmake.org/). It comes with preconfigured targets for:
+- [Espressif (ESP32)](https://docs.espressif.com/projects/esp-idf/en/v3.3/get-started-cmake/index.html)
+- [MicroPython](https://docs.micropython.org/en/v1.15/develop/cmodules.html)
+- [Zephyr](https://docs.zephyrproject.org/latest/guides/zephyr_cmake_package.html)
+
+On top of the preconfigured targets you can also use "plain" CMake to integrate LVGL into any custom C/C++ project.
+
+### Prerequisites
+- CMake ( >= 3.12.4 )
+- Compatible build tool e.g.
+  - [Make](https://www.gnu.org/software/make/)
+  - [Ninja](https://ninja-build.org/)
+
+## Building LVGL with CMake
+There are many ways to include external CMake projects into your own. A modern one also used in this example is the CMake [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) module. This module conveniently allows us to download dependencies directly at configure time from e.g. [GitHub](https://github.com/). Here is an example how we might include LVGL into our own project.
+
+```cmake
+cmake_minimum_required(VERSION 3.14)
+include(FetchContent)
+
+project(MyProject LANGUAGES C CXX)
+
+# Build an executable called "MyFirmware"
+add_executable(MyFirmware src/main.c)
+
+# Specify path to own LVGL config header
+set(LV_CONF_PATH
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/lv_conf.h
+    CACHE STRING "" FORCE)
+
+# Fetch LVGL from GitHub
+FetchContent_Declare(lvgl URL https://github.com/lvgl/lvgl.git)
+FetchContent_MakeAvailable(lvgl)
+
+# The target "MyFirmware" depends on LVGL
+target_link_libraries(MyFirmware PRIVATE lvgl::lvgl)
+```
+
+This configuration declares a dependency between the two targets **MyFirmware** and **lvgl**. Upon building the target **MyFirmware** this dependency will be resolved and **lvgl** will be built and linked with it. Since LVGL requires a config header called [lv_conf.h](https://github.com/lvgl/lvgl/blob/master/lv_conf_template.h) to be includable by its sources we also set the option `LV_CONF_PATH` to point to our own copy of it.
+
+### Additional CMake options
+Besides `LV_CONF_PATH` there are two additional CMake options to specify include paths.
+
+`LV_LVGL_H_INCLUDE_SIMPLE` which specifies whether to `#include "lvgl.h"` absolut or relative
+
+| ON (default) | OFF            |
+| ------------ | -------------- |
+| "lvgl.h"     | "../../lvgl.h" |
+
+`LV_CONF_INCLUDE_SIMPLE` which specifies whether to `#include "lv_conf.h"` and `"lv_drv_conf.h"` absolut or relative
+
+| ON (default)    | OFF                   |
+| --------------- | --------------------- |
+| "lv_conf.h"     | "../../lv_conf.h"     |
+| "lv_drv_conf.h" | "../../lv_drv_conf.h" |
+
+I do not recommend disabling those options unless your folder layout makes it absolutely necessary.
+
+## Building LVGL examples with CMake
+LVGL [examples](https://docs.lvgl.io/master/examples.html) have their own CMake target. If you want to build the examples simply add them to your dependencies.
+
+```cmake
+# The target "MyFirmware" depends on LVGL and examples
+target_link_libraries(MyFirmware PRIVATE lvgl::lvgl lvgl::examples)
+```
+
+## Building LVGL drivers and demos with CMake
+Exactly the same goes for the [drivers](https://github.com/lvgl/lv_drivers) and the [demos](https://github.com/lvgl/lvgl/demos).
+
+```cmake
+FetchContent_Declare(lv_drivers
+                     GIT_REPOSITORY https://github.com/lvgl/lv_drivers)
+FetchContent_MakeAvailable(lv_drivers)
+
+# The target "MyFirmware" depends on LVGL, drivers and demos
+target_link_libraries(MyFirmware PRIVATE lvgl::lvgl lvgl::drivers lvgl::examples)
+```
+
+# Build shared libraries with CMake
+By default, LVGL will be built as a static library (archive). CMake can instead be instructed to build LVGL as shared library (.so/.dll/etc.):
+```cmake
+set(BUILD_SHARED_LIBS ON)
+```
+OR
+```
+$ cmake "-DBUILD_SHARED_LIBS=ON" .
+```
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/espressif.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/espressif.md
new file mode 100644 (file)
index 0000000..ee65fa2
--- /dev/null
@@ -0,0 +1,58 @@
+
+# Espressif (ESP32 chip series)
+LVGL can be used and configured as a standard [ESP-IDF](https://github.com/espressif/esp-idf) component.
+
+More information about ESP-IDF build system can be found [here](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html).
+
+## LVGL demo project for ESP32
+
+We've created [lv_port_esp32](https://github.com/lvgl/lv_port_esp32), a project using ESP-IDF and LVGL to show one of the demos from [demos](https://github.com/lvgl/lvgl/demos).
+You can configure the project to use one of the many supported display controllers and targets (chips).
+
+See [lvgl_esp32_drivers](https://github.com/lvgl/lvgl_esp32_drivers) repository for a complete list
+of supported display and indev (touch) controllers and targets.
+
+## Using LVGL in your ESP-IDF project
+
+### Prerequisites
+
+ * ESP-IDF v4.1 and above
+ * ESP evaluation board with a display
+
+### Obtaining LVGL
+
+__Option 1:__ git submodule
+
+Simply clone LVGL into your `project_root/components` directory and it will be automatically integrated into the project.
+If the project is a git repository you can include LVGL as a git submodule:
+
+```sh
+git submodule add https://github.com/lvgl/lvgl.git components/lvgl
+```
+
+The above command will clone LVGL's main repository into the `components/lvgl` directory. LVGL includes a `CMakeLists.txt` file that sets some configuration options so you can use LVGL right away.
+
+__Option 2:__ IDF Component Manager
+
+LVGL is also distributed through [IDF Component Manager](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html).
+It allows users to seamlessly integrate [LVGL component](https://components.espressif.com/component/lvgl/lvgl) into their project with following command:
+
+```sh
+idf.py add-dependency lvgl/lvgl>=8.*
+```
+
+During next project build, LVGL component will be fetched from the component registry and added to project build.
+
+### Configuration
+
+When you are ready to configure LVGL, launch the configuration menu with `idf.py menuconfig` in your project root directory, go to `Component config` and then `LVGL configuration`.
+
+## Using lvgl_esp32_drivers in ESP-IDF project
+
+You can also add `lvgl_esp32_drivers` as a "component". This component should be located inside a directory named "components" in your project root directory.
+
+When your project is a git repository you can include `lvgl_esp32_drivers` as a git submodule:
+
+```sh
+git submodule add https://github.com/lvgl/lvgl_esp32_drivers.git components/lvgl_esp32_drivers
+```
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/index.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/index.md
new file mode 100644 (file)
index 0000000..7ed6a01
--- /dev/null
@@ -0,0 +1,16 @@
+# Platforms
+
+```eval_rst
+
+.. toctree::
+   :maxdepth: 2
+
+   pc-simulator
+   nxp
+   stm32
+   espressif
+   arduino
+   tasmota-berry
+   cmake
+```
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/nxp.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/nxp.md
new file mode 100644 (file)
index 0000000..48e25d2
--- /dev/null
@@ -0,0 +1,182 @@
+# NXP
+NXP has integrated LVGL into the MCUXpresso SDK packages for general purpose and crossover microcontrollers, allowing
+easy evaluation and migration into your product design.
+[Download an SDK for a supported board](https://www.nxp.com/design/software/embedded-software/littlevgl-open-source-graphics-library:LITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY?&tid=vanLITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY)
+today and get started with your next GUI application.
+
+## Creating new project with LVGL
+Downloading the MCU SDK example project is recommended as a starting point. It comes fully configured with LVGL (and
+with PXP/VGLite support if the modules are present), no additional integration work is required.
+
+## HW acceleration for NXP iMX RT platforms
+Depending on the RT platform used, the acceleration can be done by NXP PXP (PiXel Pipeline) and/or the Verisilicon GPU
+through an API named VGLite. Each accelerator has its own context that allows them to be used individually as well
+simultaneously (in LVGL multithreading mode).
+
+### PXP accelerator
+Several drawing features in LVGL can be offloaded to the PXP engine. The CPU is available for other operations while the
+PXP is running. RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU for
+power savings.
+
+Supported draw callbacks are available in "src/draw/nxp/pxp/lv_draw_pxp.c":
+```c
+    pxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_pxp_img_decoded;
+    pxp_draw_ctx->blend = lv_draw_pxp_blend;
+    pxp_draw_ctx->base_draw.wait_for_finish = lv_draw_pxp_wait_for_finish;
+    pxp_draw_ctx->base_draw.buffer_copy = lv_draw_pxp_buffer_copy;
+```
+
+#### Features supported:
+    All operations can be used in conjunction with optional transparency.
+
+  - RGB565 and ARGB8888 color formats
+  - Area fill with color
+  - BLIT (BLock Image Transfer)
+  - Screen Rotation (90, 180, 270 degree)
+  - Color keying
+  - Recoloring (color tint)
+  - Image Rotation (90, 180, 270 degree)
+  - Buffer copy
+  - RTOS integration layer
+  - Default FreeRTOS and bare metal code provided
+
+  - Combination of recolor and/or rotation + color key/alpha blend/transparency is supported.
+  That is achieved by PXP in two steps:
+    - First step is to recolor/rotate the image to a temporary buffer (statically allocated)
+    - Second step is required to handle color keying, alpha channel or to apply transparency
+
+#### Known limitations:
+  - Rotation is not supported for images unaligned to blocks of 16x16 pixels.
+PXP is set to process 16x16 blocks to optimize the system for memory bandwidth and image processing time.
+The output engine essentially truncates any output pixels after the desired number of pixels has been written.
+When rotating a source image and the output is not divisible by the block size, the incorrect pixels could be truncated
+and the final output image can look shifted.
+
+#### Basic configuration:
+  - Select NXP PXP engine in lv_conf.h: Set `LV_USE_GPU_NXP_PXP` to 1
+  - Enable default implementation for interrupt handling, PXP start function and automatic initialization:
+  Set `LV_USE_GPU_NXP_PXP_AUTO_INIT` to 1
+  - If `SDK_OS_FREE_RTOS` symbol is defined, FreeRTOS implementation will be used, otherwise bare metal code will be
+  included
+
+#### Basic initialization:
+  - If `LV_USE_GPU_NXP_PXP_AUTO_INIT` is enabled, no user code is required; PXP is initialized automatically in
+  `lv_init()`
+  - For manual PXP initialization, default configuration structure for callbacks can be used. Initialize PXP before
+  calling `lv_init()`
+```c
+      #if LV_USE_GPU_NXP_PXP
+        #include "src/draw/nxp/pxp/lv_gpu_nxp_pxp.h"
+      #endif
+      . . .
+      #if LV_USE_GPU_NXP_PXP
+        PXP_COND_STOP(!lv_gpu_nxp_pxp_init(), "PXP init failed.");
+      #endif
+```
+
+#### Project setup:
+  - Add PXP related files to project:
+    - src/draw/nxp/pxp/lv_draw_pxp.c[.h]: draw context callbacks
+    - src/draw/nxp/pxp/lv_draw_pxp_blend.c[.h]: fill and blit (with optional transformation)
+    - src/draw/nxp/pxp/lv_gpu_nxp_pxp.c[.h]: init, uninit, run/wait PXP device
+    - src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c[.h]: OS abstraction (FreeRTOS or bare metal)
+        - optional, required only if `LV_USE_GPU_NXP_PXP_AUTO_INIT` is set to 1
+  - PXP related code depends on two drivers provided by MCU SDK. These drivers need to be added to project:
+      - fsl_pxp.c[.h]: PXP driver
+      - fsl_cache.c[.h]: CPU cache handling functions
+
+#### Logging:
+  - By default, `LV_GPU_NXP_PXP_LOG_ERRORS` is enabled so that any PXP error will be seen on SDK debug console
+  - By default, `LV_GPU_NXP_PXP_LOG_TRACES` is disabled. Enable it for tracing logs (like PXP limitations)
+
+#### Advanced configuration:
+  - Implementation depends on multiple OS-specific functions. The struct `lv_nxp_pxp_cfg_t` with callback pointers is
+  used as a parameter for the `lv_gpu_nxp_pxp_init()` function. Default implementation for FreeRTOS and bare metal is
+  provided in lv_gpu_nxp_pxp_osa.c
+      - `pxp_interrupt_init()`: Initialize PXP interrupt (HW setup, OS setup)
+      - `pxp_interrupt_deinit()`: Deinitialize PXP interrupt (HW setup, OS setup)
+      - `pxp_run()`: Start PXP job. Use OS-specific mechanism to block drawing thread. PXP must finish drawing before
+      leaving this function.
+  - Area threshold (size limit) is configurable and used to decide whether the area will be processed by PXP or not.
+  Areas smaller than the defined value will be processed by CPU and those bigger than the threshold will be processed by
+  PXP. The threshold is defined as a macro in lv_draw_pxp.c
+      - `LV_GPU_NXP_PXP_SIZE_LIMIT`: size threshold for fill/blit (with optional transformation)
+
+### VGLite accelerator
+Extra drawing features in LVGL can be handled by the VGLite engine. The CPU is available for other operations while the
+VGLite is running. An RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU
+for power savings.
+
+Supported draw callbacks are available in "src/draw/nxp/vglite/lv_draw_vglite.c":
+```c
+    vglite_draw_ctx->base_draw.init_buf = lv_draw_vglite_init_buf;
+    vglite_draw_ctx->base_draw.draw_line = lv_draw_vglite_line;
+    vglite_draw_ctx->base_draw.draw_arc = lv_draw_vglite_arc;
+    vglite_draw_ctx->base_draw.draw_rect = lv_draw_vglite_rect;
+    vglite_draw_ctx->base_draw.draw_img_decoded = lv_draw_vglite_img_decoded;
+    vglite_draw_ctx->blend = lv_draw_vglite_blend;
+    vglite_draw_ctx->base_draw.wait_for_finish = lv_draw_vglite_wait_for_finish;
+    vglite_draw_ctx->base_draw.buffer_copy = lv_draw_vglite_buffer_copy;
+```
+
+#### Features supported:
+    All operations can be used in conjunction with optional transparency.
+
+  - RGB565 and ARGB8888 color formats
+  - Area fill with color
+  - BLIT (BLock Image Transfer)
+  - Image Rotation (any degree with decimal)
+  - Image Scale
+  - Draw rectangle background with optional radius or gradient
+  - Blit rectangle background image
+  - Draw rectangle border/outline with optional rounded corners
+  - Draw arc with optional rounded ending
+  - Draw line or dashed line with optional rounded ending
+  - Buffer copy
+
+#### Known limitations:
+  - Source image alignment:
+  The byte alignment requirement for a pixel depends on the specific pixel format. Both buffer address and buffer stride
+  must be aligned. As general rule, the alignment is set to 16 pixels. This makes the buffer address alignment to be
+  32 bytes for RGB565 and 64 bytes for ARGB8888.
+  - For pixel engine (PE) destination, the alignment should be 64 bytes for all tiled (4x4) buffer layouts.
+  The pixel engine has no additional alignment requirement for linear buffer layouts (`VG_LITE_LINEAR`).
+
+#### Basic configuration:
+  - Select NXP VGLite engine in lv_conf.h: Set `LV_USE_GPU_NXP_VG_LITE` to 1
+  - `SDK_OS_FREE_RTOS` symbol needs to be defined so that the FreeRTOS implementation will be used
+
+#### Basic initialization:
+  - Initialize VGLite before calling `lv_init()` by specifying the width/height of tessellation window. Value should be
+  a multiple of 16; minimum value is 16 pixels, maximum cannot be greater than the frame width. If less than or equal
+  to 0, then no tessellation buffer is created, in which case VGLite is initialized only for blitting.
+```c
+      #if LV_USE_GPU_NXP_VG_LITE
+        #include "vg_lite.h"
+      #endif
+      . . .
+      #if LV_USE_GPU_NXP_VG_LITE
+        VG_LITE_COND_STOP(vg_lite_init(64, 64) != VG_LITE_SUCCESS, "VGLite init failed.");
+      #endif
+```
+
+#### Project setup:
+  - Add VGLite related files to project:
+    - src/draw/nxp/vglite/lv_draw_vglite.c[.h]: draw context callbacks
+    - src/draw/nxp/vglite/lv_draw_vglite_blend.c[.h]: fill and blit (with optional transformation)
+    - src/draw/nxp/vglite/lv_draw_vglite_rect.c[.h]: draw rectangle
+    - src/draw/nxp/vglite/lv_draw_vglite_arc.c[.h]: draw arc
+    - src/draw/nxp/vglite/lv_draw_vglite_line.c[.h]: draw line
+    - src/draw/nxp/vglite/lv_vglite_buf.c[.h]: init/get vglite buffer
+    - src/draw/nxp/vglite/lv_vglite_utils.c[.h]: function helpers
+
+#### Logging:
+  - By default, `LV_GPU_NXP_VG_LITE_LOG_ERRORS` is enabled so that any VGLite error will be seen on SDK debug console
+  - By default, `LV_GPU_NXP_VG_LITE_LOG_TRACES` is disabled. Enable it for tracing logs (like blit split workaround or
+  VGLite fallback to CPU due to any error on the driver)
+
+#### Advanced configuration:
+  - Area threshold (size limit) is configurable and used to decide whether the area will be processed by VGLite or not.
+  Areas smaller than the defined value will be processed by CPU and those bigger than the threshold will be processed by
+  VGLite. The threshold is defined as a macro in lv_draw_vglite.c
+      - `LV_GPU_NXP_VG_LITE_SIZE_LIMIT`: size threshold for fill/blit (with optional transformation)
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/pc-simulator.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/pc-simulator.md
new file mode 100644 (file)
index 0000000..3bdc495
--- /dev/null
@@ -0,0 +1,100 @@
+# Simulator on PC
+
+
+You can try out LVGL **using only your PC** (i.e. without any development boards). LVGL will run on a simulator environment on the PC where anyone can write and experiment with real LVGL applications.
+
+Using the simulator on a PC has the following advantages:
+- Hardware independent - Write code, run it on the PC and see the result on a monitor.
+- Cross-platform - Any Windows, Linux or macOS system can run the PC simulator.
+- Portability - The written code is portable, which means you can simply copy it when migrating to embedded hardware.
+- Easy Validation - The simulator is also very useful to report bugs because it provides a common platform for every user. So it's a good idea to reproduce a bug in the simulator and use that code snippet in the [Forum](https://forum.lvgl.io).
+
+## Select an IDE
+
+The simulator is ported to various IDEs (Integrated Development Environments). Choose your favorite IDE, read its README on GitHub, download the project, and load it to the IDE.
+
+- [Eclipse with SDL driver](https://github.com/lvgl/lv_sim_eclipse_sdl): Recommended on Linux and Mac
+- [CodeBlocks](https://github.com/lvgl/lv_sim_codeblocks_win): Recommended on Windows
+- [VisualStudio with SDL driver](https://github.com/lvgl/lv_sim_visual_studio_sdl): For Windows
+- [VSCode with SDL driver](https://github.com/lvgl/lv_sim_vscode_sdl): Recommended on Linux and Mac
+- [PlatformIO with SDL driver](https://github.com/lvgl/lv_platformio): Recommended on Linux and Mac
+- [MDK with FastModel](https://github.com/lvgl/lv_port_an547_cm55_sim): For Windows
+
+External project not maintained by the LVGL organization:
+- [QT Creator](https://github.com/Varanda-Labs/lvgl-qt-sim): Cross platform
+
+You can use any IDE for development but, for simplicity, the configuration for Eclipse CDT is what we'll focus on in this tutorial.
+The following section describes the set-up guide of Eclipse CDT in more detail.
+
+
+
+**Note: If you are on Windows, it's usually better to use the Visual Studio or CodeBlocks projects instead. They work out of the box without requiring extra steps.**
+
+## Set-up Eclipse CDT
+
+### Install Eclipse CDT
+
+[Eclipse CDT](https://eclipse.org/cdt/) is a C/C++ IDE.
+
+Eclipse is a Java-based tool so be sure **Java Runtime Environment** is installed on your system.
+
+On Debian-based distros (e.g. Ubuntu): `sudo apt-get install default-jre`
+
+Note: If you are using other distros, then please install a 'Java Runtime Environment' suitable to your distro.
+Note: If you are using macOS and get a "Failed to create the Java Virtual Machine" error, uninstall any other Java JDK installs and install Java JDK 8u. This should fix the problem.
+
+You can download Eclipse's CDT from: [https://www.eclipse.org/cdt/downloads.php](https://www.eclipse.org/cdt/downloads.php). Start the installer and choose *Eclipse CDT* from the list.
+
+### Install SDL 2
+
+The PC simulator uses the [SDL 2](https://www.libsdl.org/download-2.0.php) cross-platform library to simulate a TFT display and a touchpad.
+
+#### Linux
+On **Linux** you can easily install SDL2 using a terminal:
+
+1. Find the current version of SDL2: `apt-cache search libsdl2 (e.g. libsdl2-2.0-0)`
+2. Install SDL2: `sudo apt-get install libsdl2-2.0-0` (replace with the found version)
+3. Install SDL2 development package: `sudo apt-get install libsdl2-dev`
+4. If build essentials are not installed yet: `sudo apt-get install build-essential`
+
+#### Windows
+If you are using **Windows** firstly you need to install MinGW ([64 bit version](http://mingw-w64.org/doku.php/download)). After installing MinGW, do the following steps to add SDL2:
+
+1. Download the development libraries of SDL.
+Go to [https://www.libsdl.org/download-2.0.php](https://www.libsdl.org/download-2.0.php) and download _Development Libraries: SDL2-devel-2.0.5-mingw.tar.gz_
+2. Decompress the file and go to _x86_64-w64-mingw32_ directory (for 64 bit MinGW) or to _i686-w64-mingw32_ (for 32 bit MinGW)
+3. Copy _..._mingw32/include/SDL2_ folder to _C:/MinGW/.../x86_64-w64-mingw32/include_
+4. Copy _..._mingw32/lib/_ content to _C:/MinGW/.../x86_64-w64-mingw32/lib_
+5. Copy _..._mingw32/bin/SDL2.dll_ to _{eclipse_workspace}/pc_simulator/Debug/_.  Do it later when Eclipse is installed.
+
+Note: If you are using **Microsoft Visual Studio** instead of Eclipse then you don't have to install MinGW.
+
+#### OSX
+On **OSX** you can easily install SDL2 with brew: `brew install sdl2`
+
+If something is not working, then please refer [this tutorial](http://lazyfoo.net/tutorials/SDL/01_hello_SDL/index.php) to get started with SDL.
+
+### Pre-configured project
+
+A pre-configured graphics library project (based on the latest release) is always available to get started easily.
+You can find the latest one on [GitHub](https://github.com/lvgl/lv_sim_eclipse_sdl).
+(Please note that, the project is configured for Eclipse CDT).
+
+### Add the pre-configured project to Eclipse CDT
+
+Run Eclipse CDT. It will show a dialogue about the **workspace path**. Before accepting the path, check that path and copy (and unzip) the downloaded pre-configured project there. After that, you can accept the workspace path. Of course you can modify this path but in that case copy the project to the corresponding location.
+
+Close the start-up window and go to **File-&gt;Import** and choose **General-&gt;Existing project into Workspace**. **Browse the root directory** of the project and click **Finish**
+
+On **Windows** you have to do two additional things:
+
+- Copy the **SDL2.dll** into the project's Debug folder
+- Right-click on the project -&gt; Project properties -&gt; C/C++ Build -&gt; Settings -&gt; Libraries -&gt; Add ... and add _mingw32_ above SDLmain and SDL. (The order is important: mingw32, SDLmain, SDL)
+
+### Compile and Run
+
+Now you are ready to run LVGL on your PC. Click on the Hammer Icon on the top menu bar to Build the project. If you have done everything right, then you will not get any errors. Note that on some systems additional steps might be required to "see" SDL 2 from Eclipse but in most cases the configuration in the downloaded project is enough.
+
+After a successful build, click on the Play button on the top menu bar to run the project. Now a window should appear in the middle of your screen.
+
+Now you are ready to use LVGL and begin development on your PC.
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/stm32.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/stm32.md
new file mode 100644 (file)
index 0000000..9cf9308
--- /dev/null
@@ -0,0 +1,4 @@
+
+# STM32
+
+TODO
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/tasmota-berry.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/tasmota-berry.md
new file mode 100644 (file)
index 0000000..4eb6459
--- /dev/null
@@ -0,0 +1,73 @@
+# Tasmota and berry
+
+## What is Tasmota?
+
+[Tasmota](https://github.com/arendst/Tasmota) is a widely used open-source firmware for ESP8266 and EPS32 based devices. It supports a wide variety of devices, sensors and integrations to Home Automation and Cloud services. Tasmota firmware is downloaded more than 200,000 times each month, and has an active and growing community.
+
+Tasmota provides access to hundreds of supported devices, full support of MQTT, HTTP(S), integration with major Home Automation systems, myriad of sensors, IR, RF, Zigbee, Bluetooth, AWS IoT, Azure IoT, Alexa and many more.
+
+## What is Berry?
+
+[Berry](https://github.com/berry-lang/berry) is a ultra-lightweight dynamically typed embedded scripting language. It is designed for lower-performance embedded devices. The interpreter of Berry include a one-pass compiler and register-based VM, all the code is written in ANSI C99. Berry offers a syntax very similar to Python, and is inspired from LUA VM. It is fully integrated in Tasmota
+
+### Highlights of Berry
+
+Berry has the following advantages:
+
+- Lightweight: A well-optimized interpreter with very little resources. Ideal for use in microprocessors.
+- Fast: optimized one-pass bytecode compiler and register-based virtual machine.
+- Powerful: supports imperative programming, object-oriented programming, functional programming.
+- Flexible: Berry is a dynamic type script, and it's intended for embedding in applications. It can provide good dynamic scalability for the host system.
+- Simple: simple and natural syntax, support garbage collection, and easy to use FFI (foreign function interface).
+- RAM saving: With compile-time object construction, most of the constant objects are stored in read-only code data segments, so the RAM usage of the interpreter is very low when it starts.
+
+All features are detailed in the [Berry Reference Manual](https://github.com/berry-lang/berry/wiki/Reference)
+
+---
+
+## Why LVGL + Tasmota + Berry?
+
+In 2021, Tasmota added full support of LVGL for ESP32 based devices. It also introduced the Berry scripting language, a small-footprint language similar to Python and fully integrated in Tasmota.
+
+A comprehensive mapping of LVGL in Berry language is now available, similar to the mapping of Micropython. It allows to use +98% of all LVGL features. It is also possible to write custom widgets in Berry.
+
+Versions supported: LVGL v8.3.0, LodePNG v20201017, Freetype 2.10.4
+
+### Tasmota + Berry + LVGL could be used for:
+
+- Fast prototyping GUI.
+- Shortening the cycle of changing and fine-tuning the GUI.
+- Modelling the GUI in a more abstract way by defining reusable composite objects, taking advantage of Berry's language features such as Inheritance, Closures, Exception Handling...
+- Make LVGL accessible to a larger audience. No need to know C to create a nice GUI on an embedded system.
+
+A higher level interface compatible with [OpenHASP](https://github.com/HASwitchPlate/openHASP) is also under development.
+
+---
+
+## So what does it look like?
+
+> TL;DR:
+> Similar to MicroPython, it's very much like the C API, but Object-Oriented for LVGL components.
+
+Let's dive right into an example!
+
+### A simple example
+
+```python
+lv.start()                 # start LVGL
+scr = lv.scr_act()         # get default screen
+btn = lv.btn(scr)          # create button
+btn.center()
+label = lv.label(btn)      # create a label in the button
+label.set_text("Button")   # set a label to the button
+```
+
+## How can I use it?
+
+You can start in less than 10 minutes on a M5Stack or equivalent device in less than 10 minutes in this [short tutorial](https://tasmota.github.io/docs/LVGL_in_10_minutes/)
+
+## Where can I find more information?
+
+- [Tasmota Documentation](https://tasmota.github.io/docs/)
+- [Berry Documentation](https://github.com/berry-lang/berry/wiki/Reference)
+- [Tasmota LVGL Berry documentation](https://tasmota.github.io/docs/LVGL/)
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/others/fragment.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/others/fragment.md
new file mode 100644 (file)
index 0000000..ae90938
--- /dev/null
@@ -0,0 +1,77 @@
+
+# Fragment
+
+Fragment is a concept copied from [Android](https://developer.android.com/guide/fragments).
+
+It represents a reusable portion of your app's UI. A fragment defines and manages its own layout, has its own lifecycle,
+and can handle its own events. Like Android's Fragment that must be hosted by an activity or another fragment, Fragment
+in LVGL needs to be hosted by an object, or another fragment. The fragment’s view hierarchy becomes part of, or attaches
+to, the host’s view hierarchy.
+
+Such concept also has some similarities
+to [UiViewController on iOS](https://developer.apple.com/documentation/uikit/uiviewcontroller).
+
+Fragment Manager is a manager holding references to fragments attached to it, and has an internal stack to achieve
+navigation. You can use fragment manager to build navigation stack, or multi pane application easily.
+
+## Usage
+
+Enable `LV_USE_FRAGMENT` in `lv_conf.h`.
+
+### Create Fragment Class
+
+```c
+struct sample_fragment_t {
+    /* IMPORTANT: don't miss this part */
+    lv_fragment_t base;
+    /* States, object references and data fields for this fragment */
+    const char *title;
+};
+
+const lv_fragment_class_t sample_cls = {
+        /* Initialize something needed */
+        .constructor_cb = sample_fragment_ctor,
+        /* Create view objects */
+        .create_obj_cb = sample_fragment_create_obj,
+        /* IMPORTANT: size of your fragment struct */
+        .instance_size = sizeof(struct sample_fragment_t)
+};
+```
+
+### Use `lv_fragment_manager`
+
+```c
+/* Create fragment instance, and objects will be added to container */
+lv_fragment_manager_t *manager = lv_fragment_manager_create(container, NULL);
+/* Replace current fragment with instance of sample_cls, and init_argument is user defined pointer */
+lv_fragment_manager_replace(manager, &sample_cls, init_argument);
+```
+
+### Fragment Based Navigation
+
+```c
+/* Add one instance into manager stack. View object of current fragment will be destroyed,
+ * but instances created in class constructor will be kept.
+ */
+lv_fragment_manager_push(manager, &sample_cls, NULL);
+
+/* Remove the top most fragment from the stack, and bring back previous one. */
+lv_fragment_manager_pop(manager);
+```
+
+## Example
+
+```eval_rst
+
+.. include:: ../../examples/others/fragment/index.rst
+
+```
+
+## API
+
+```eval_rst
+
+.. doxygenfile:: lv_fragment.h
+  :project: lvgl
+
+```
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/others/ime_pinyin.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/others/ime_pinyin.md
new file mode 100644 (file)
index 0000000..82747ff
--- /dev/null
@@ -0,0 +1,150 @@
+# Pinyin IME
+
+Pinyin IME provides API to provide Chinese Pinyin input method (Chinese input) for keyboard object, which supports 26 key and 9 key input modes. You can think of `lv_ime_pinyin` as a Pinyin input method plug-in for keyboard objects.
+
+Normally, an environment where [lv_keyboard](/widgets/extra/keyboard) can run can also run `lv_ime_pinyin`. There are two main influencing factors: the size of the font file and the size of the dictionary.
+
+<details>
+<summary>中文</summary>
+<p>
+            
+`lv_ime_pinyin`为[键盘](/widgets/extra/keyboard)组件提供汉语拼音输入法(中文输入)的功能(后文简称为拼音输入法),支持26键和9键输入模式。您可以将 `lv_ime_pinyin` 看成是键盘组件的汉语拼音输入法插件。
+ 
+一般情况下,只要是[键盘](/widgets/extra/keyboard)组件能运行的环境 `lv_ime_pinyin` 也能运行。有两个影响因素:字库的大小和词库的大小。
+            
+</p>
+</details>
+
+## Usage
+
+Enable `LV_USE_IME_PINYIN` in `lv_conf.h`.
+
+First use `lv_ime_pinyin_create(lv_scr_act())` to create a Pinyin input method plug-in, then use `lv_ime_pinyin_set_keyboard(pinyin_ime, kb)` to add the `keyboard` you created to the Pinyin input method plug-in.
+You can use `lv_ime_pinyin_set_dict(pinyin_ime, your_dict)` to use a custom dictionary (if you don't want to use the built-in dictionary at first, you can disable `LV_IME_PINYIN_USE_DEFAULT_DICT` in `lv_conf.h`, which can save a lot of memory space).
+
+The built-in thesaurus is customized based on the **LV_FONT_SIMSUN_16_CJK** font library, which currently only has more than `1,000` most common CJK radicals, so it is recommended to use custom fonts and thesaurus.
+
+In the process of using the Pinyin input method plug-in, you can change the keyboard and dictionary at any time.
+
+<details>
+<summary>中文</summary>
+<p>
+            
+在 `lv_conf.h` 中打开 `LV_USE_IME_PINYIN`。
+            
+首先,使用 `lv_ime_pinyin_create(lv_scr_act())` 函数创建一个拼音输入法插件,
+然后使用 `lv_ime_pinyin_set_keyboard(pinyin_ime, kb)` 函数将您创建的键盘组件添加到插件中。
+
+内置的词库是基于 LVGL 的 **LV_FONT_SIMSUN_16_CJK** 字库定制,这个字库目前只有 `1000` 多个最常见的 CJK 部首,所以建议使用自定义字库和词库。
+
+您可以使用 `lv_ime_pinyin_set_dict(pinyin_ime, your_dict)` 函数来设置使用自定义的词库,如果您一开始就不打算使用内置的词库,建议您在 `lv_conf.h` 中将 `LV_IME_PINYIN_USE_DEFAULT_DICT` 关闭,这可以节省一些内存空间。
+
+</p>
+</details>
+
+## Custom dictionary
+
+If you don't want to use the built-in Pinyin dictionary, you can use the custom dictionary.
+Or if you think that the built-in phonetic dictionary consumes a lot of memory, you can also use a custom dictionary.
+
+Customizing the dictionary is very simple.
+
+First, set `LV_IME_PINYIN_USE_DEFAULT_DICT` to `0` in `lv_conf.h`
+
+Then, write a dictionary in the following format.
+
+<details>
+<summary>中文</summary>
+<p>
+            
+如果您不想使用内置的词库,可以通过下面的方法自定义词库。
+
+自定义词典非常简单。
+首先,在 `lv_conf.h` 将 `LV_IME_PINYIN_USE_DEFAULT_DICT` 设置为 0。
+然后按照下面的格式编写词库。
+
+</p>
+</details>
+
+### Dictionary format
+
+The arrangement order of each pinyin syllable is very important. You need to customize your own thesaurus according to the Hanyu Pinyin syllable table. You can read [here](https://baike.baidu.com/item/%E6%B1%89%E8%AF%AD%E6%8B%BC%E9%9F%B3%E9%9F%B3%E8%8A%82/9167981) to learn about the Hanyu Pinyin syllables and the syllable table.
+
+Then, write your own dictionary according to the following format:
+
+<details>
+<summary>中文</summary>
+<p>
+
+**注意**,各个拼音音节的排列顺序非常重要,您需要按照汉语拼音音节表定制自己的词库,可以阅读[这里](https://baike.baidu.com/item/%E6%B1%89%E8%AF%AD%E6%8B%BC%E9%9F%B3%E9%9F%B3%E8%8A%82/9167981)了解[汉语拼音音节](https://baike.baidu.com/item/%E6%B1%89%E8%AF%AD%E6%8B%BC%E9%9F%B3%E9%9F%B3%E8%8A%82/9167981)以及[音节表](https://baike.baidu.com/item/%E6%B1%89%E8%AF%AD%E6%8B%BC%E9%9F%B3%E9%9F%B3%E8%8A%82/9167981#1)。
+
+然后,根据下面的格式编写自己的词库:
+
+</p>
+</details>
+
+```c
+lv_100ask_pinyin_dict_t your_pinyin_dict[] = {
+            { "a", "啊阿呵吖" },
+            { "ai", "埃挨哎唉哀皑蔼矮碍爱隘癌艾" },
+            { "an", "按安暗岸俺案鞍氨胺厂广庵揞犴铵桉谙鹌埯黯" },
+            { "ang", "昂肮盎仰" },
+            { "ao", "凹敖熬翱袄傲奥懊澳" },
+            { "ba", "芭捌叭吧笆八疤巴拔跋靶把坝霸罢爸扒耙" },
+            { "bai", "白摆佰败拜柏百稗伯" },
+            /* ...... */
+            { "zuo", "昨左佐做作坐座撮琢柞"},
+            {NULL, NULL}
+
+```
+
+**The last item** must end with `{null, null}` , or it will not work properly.
+
+### Apply new dictionary
+
+After writing a dictionary according to the above dictionary format, you only need to call this function to set up and use your dictionary:
+
+<details>
+<summary>中文</summary>
+<p>
+
+按照上面的词库格式编写好自己的词库之后,参考下面的用法,调用 `lv_100ask_pinyin_ime_set_dict(pinyin_ime, your_pinyin_dict)` 函数即可设置和使用新词库:
+
+</p>
+</details>
+
+```c
+    lv_obj_t * pinyin_ime = lv_100ask_pinyin_ime_create(lv_scr_act());
+    lv_100ask_pinyin_ime_set_dict(pinyin_ime, your_pinyin_dict);
+```
+
+## Input modes
+
+`lv_ime_pinyin` supports 26 key and 9 key input modes. The mode switching is very simple, just call the function `lv_ime_pinyin_set_mode`. If the second parameter of function `lv_ime_pinyin_set_mode` is' 1 ', switch to 26 key input mode; if it is' 0', switch to 9 key input mode, and the default is' 1 '.
+
+<details>
+<summary>中文</summary>
+<p>
+
+`lv_ime_pinyin` 支持26键和9键输入模式。模式的切换非常简单,只需调用函数 `lv_ime_pinyin_set_mode` 即可。如果函数 `lv_ime_pinyin_set_mode` 的第2个参数为 `1` 则切换到 26 键输入模式,如果为 `0` 则切换到 9 键输入法模式,默认为 `1` 。
+
+</p>
+</details>
+
+
+## Example
+
+```eval_rst
+
+.. include:: ../../examples/others/ime/index.rst
+
+```
+
+## API
+
+```eval_rst
+
+.. doxygenfile:: lv_ime_pinyin.h
+  :project: lvgl
+
+```
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/others/imgfont.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/others/imgfont.md
new file mode 100644 (file)
index 0000000..0f0f099
--- /dev/null
@@ -0,0 +1,25 @@
+# Image font (imgfont)
+Draw image in label or span obj with imgfont.
+This is often used to display Unicode emoji icons in text.
+Supported image formats: determined by LVGL image decoder.
+
+## Usage
+Enable `LV_USE_IMGFONT` in `lv_conf.h`.
+
+To create a new imgfont use `lv_imgfont_create(height, path_cb)`.
+
+`height` used to indicate the size of a imgfont.
+`path_cb` Used to get the image path of the specified unicode.
+
+Use `lv_imgfont_destroy(imgfont)` to destroy a imgfont that is no longer used.
+
+## Example
+```eval_rst
+.. include:: ../../examples/others/imgfont/index.rst
+```
+
+## API
+```eval_rst
+.. doxygenfile:: lv_imgfont.h
+  :project: lvgl
+```
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/others/msg.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/others/msg.md
new file mode 100644 (file)
index 0000000..53deb58
--- /dev/null
@@ -0,0 +1,97 @@
+# Messaging
+
+Messaging (`lv_msg`) is a classic []publisher subscriber](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) implementation for LVGL.
+
+## IDs
+Both the publishers and the subscribers needs to know the message identifiers.
+In `lv_msg` these are simple `uint32_t` integers. For example:
+```c
+#define MSG_DOOR_OPENED             1
+#define MSG_DOOR_CLOSED             2
+#define MSG_USER_NAME_CHANGED       100
+#define MSG_USER_AVATAR_CHANGED     101
+```
+
+You can orgnaize the message IDs as you wish.
+
+Both parties also need to know about the format of teh payload. E.g. in the above example
+`MSG_DOOR_OPENED` and `MSG_DOOR_CLOSED` has no payload but `MSG_USER_NAME_CHANGED` can have a `const char *` payload containing the user name, and `MSG_USER_AVATAR_CHANGED` a `const void *` image source with the new avatar image.
+
+
+## Send message
+
+Messages can be sent with `lv_msg_send(msg_id, payload)`. E.g.
+```c
+lv_msg_send(MSG_USER_DOOR_OPENED, NULL);
+lv_msg_send(MSG_USER_NAME_CHANGED, "John Smith");
+```
+
+## Subscribe to a message
+
+`lv_msg_subscribe(msg_id, callback, user_data)` can be used to subscribe to message.
+
+The callback should look like this:
+```c
+
+static void user_name_subscriber_cb(void * s, lv_msg_t * m)
+{
+    /*s: a subscriber obeject, can be used to unscubscribe*/
+    /*m: a message object with the msg_id, payload, and user_data (set durung subscription)*/
+
+    ...do something...
+}
+```
+
+From `lv_msg_t` the followings can be used to get some data:
+- `lv_msg_get_id(m)`
+- `lv_msg_get_payload(m)`
+- `lv_msg_get_user_data(m)`
+
+## Subscribe with an lv_obj
+It's quite typical that an LVGL widget is interested in some messages.
+To make it simpler `lv_msg_subsribe_obj(msg_id, obj, user_data)` can be used.
+If a new message is published with `msg_id` an `LV_EVENT_MSG_RECEIVED` event will be sent to the object.
+
+For example:
+```c
+lv_obj_add_event_cb(user_name_label, user_name_label_event_cb, LV_EVENT_MSG_RECEIVED, NULL);
+lv_msg_subsribe_obj(MSG_USER_NAME_CHANGED, user_name_label, NULL);
+
+...
+
+void user_name_label_event_cb(lv_event_t * e)
+{
+    lv_obj_t * label = lv_event_get_target(e);
+    lv_msg_t * m = lv_event_get_msg(e);
+    lv_label_set_text(label, lv_msg_get_payload(m));
+}
+
+```
+
+### Unsubscribe
+`lv_msg_subscribe` returns a pointer which can be used to unsubscribe:
+```c
+void * s1;
+s1 = lv_msg_subscribe(MSG_USER_DOOR_OPENED, some_callback, NULL);
+
+...
+
+lv_msg_unsubscribe(s1);
+```
+
+## Example
+
+```eval_rst
+
+.. include:: ../../examples/others/msg/index.rst
+
+```
+## API
+
+
+```eval_rst
+
+.. doxygenfile:: lv_msg.h
+  :project: lvgl
+
+```
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/arm-2d.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/arm-2d.md
new file mode 100644 (file)
index 0000000..85a4dbc
--- /dev/null
@@ -0,0 +1,32 @@
+# Arm-2D GPU
+
+Arm-2D is not a GPU but **an abstraction layer for 2D GPUs dedicated to Microcontrollers**. It supports all Cortex-M processors ranging from Cortex-M0 to the latest Cortex-M85. 
+
+Arm-2D is an open-source project on Github. For more, please refer to: https://github.com/ARM-software/Arm-2D.
+
+
+
+## How to Use
+
+In general, you can set the macro `LV_USE_GPU_ARM2D` to `1`in `lv_conf.h` to enable Arm-2D acceleration for LVGL.
+
+If you are using **[CMSIS-Pack](https://github.com/lvgl/lvgl/tree/master/env_support/cmsis-pack)** to deploy the LVGL. You don't have to define the macro `LV_USE_GPU_ARM2D` manually, instead, please select the component `GPU Arm-2D` in the **RTE** dialog. This step will define the macro for us. 
+
+
+
+## Design Considerations
+
+As mentioned before, Arm-2D is an abstraction layer for 2D GPU; hence if there is no accelerator or dedicated instruction set (such as Helium or ACI) available for Arm-2D, it provides negligible performance boost for LVGL (sometimes worse) for regular Cortex-M processors. 
+
+**We highly recommend you enable Arm-2D acceleration for LVGL** when:
+
+- The target processors are **Cortex-M55** and/or **Cortex-M85**
+- The target processors support **[Helium](https://developer.arm.com/documentation/102102/0103/?lang=en)**.
+- The device vendor provides an arm-2d compliant driver for their propriotory 2D accelerators and/or customized instruction set.
+- The target device contains [DMA-350](https://community.arm.com/arm-community-blogs/b/internet-of-things-blog/posts/arm-corelink-dma-350-next-generation-direct-memory-access-for-endpoint-ai)
+
+
+
+## Examples
+
+- [A Cortex-M55 (supports Helium) based MDK Project, PC emulation is available.](https://github.com/lvgl/lv_port_an547_cm55_sim)
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/dma2d.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/dma2d.md
new file mode 100644 (file)
index 0000000..6c6b3d1
--- /dev/null
@@ -0,0 +1,4 @@
+# DMA2D GPU
+
+TODO
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/index.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/index.md
new file mode 100644 (file)
index 0000000..b11f588
--- /dev/null
@@ -0,0 +1,16 @@
+
+# Renderers and GPUs
+
+
+```eval_rst
+
+.. toctree::
+   :maxdepth: 2
+
+   sw
+   sdl
+   arm-2d
+   pxp-vglite
+   dma2d
+```
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/pxp-vglite.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/pxp-vglite.md
new file mode 100644 (file)
index 0000000..d68d1e7
--- /dev/null
@@ -0,0 +1,4 @@
+# NXP PXP and VGLite GPU
+
+TODO
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/sdl.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/sdl.md
new file mode 100644 (file)
index 0000000..af8b976
--- /dev/null
@@ -0,0 +1,4 @@
+# SDL renderer
+
+TODO
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/sw.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/overview/renderers/sw.md
new file mode 100644 (file)
index 0000000..ccc1c26
--- /dev/null
@@ -0,0 +1,4 @@
+# Software renderer
+
+TODO
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/porting/timer-handler.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/porting/timer-handler.md
new file mode 100644 (file)
index 0000000..2f086b5
--- /dev/null
@@ -0,0 +1,38 @@
+# Timer Handler
+
+To handle the tasks of LVGL you need to call `lv_timer_handler()` periodically in one of the following:
+- *while(1)* of *main()* function
+- timer interrupt periodically (lower priority than `lv_tick_inc()`)
+- an OS task periodically
+
+The timing is not critical but it should be about 5 milliseconds to keep the system responsive.
+
+Example:
+```c
+while(1) {
+  lv_timer_handler();
+  my_delay_ms(5);
+}
+```
+
+If you want to use `lv_timer_handler()` in a super-loop, a helper function`lv_timer_handler_run_in_period()` is provided to simplify the porting:
+
+```c
+while(1) {
+    ...
+    lv_timer_handler_run_in_period(5); /* run lv_timer_handler() every 5ms */
+    ...
+}
+```
+
+ In an OS environment, you can use it together with the **delay** or **sleep** provided by OS to release CPU whenever possible:
+
+```c
+while (1) {
+    lv_timer_handler_run_in_period(5); /* run lv_timer_handler() every 5ms */
+    my_delay_ms(5);                    /* delay 5ms to avoid unnecessary polling */
+}
+```
+
+To learn more about timers visit the [Timer](/overview/timer) section.
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/cmsis-pack/LVGL.lvgl.8.3.7.pack b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/cmsis-pack/LVGL.lvgl.8.3.7.pack
new file mode 100644 (file)
index 0000000..e6c23f5
Binary files /dev/null and b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/cmsis-pack/LVGL.lvgl.8.3.7.pack differ
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/cmsis-pack/LVGL.pidx b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/cmsis-pack/LVGL.pidx
new file mode 100644 (file)
index 0000000..8603c60
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<index schemaVersion="1.0.0" xs:noNamespaceSchemaLocation="PackIndex.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
+  <vendor>LVGL</vendor>
+  <url>https://raw.githubusercontent.com/lvgl/lvgl/master/env_support/cmsis-pack/</url>
+  <timestamp>2023-05-03</timestamp>
+  <pindex>
+    <pdsc url="https://raw.githubusercontent.com/lvgl/lvgl/release/v8.3/env_support/cmsis-pack/" vendor="LVGL" name="lvgl" version="8.3.7"/>
+  </pindex>
+</index>
\ No newline at end of file
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/rt-thread/squareline/README.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/rt-thread/squareline/README.md
new file mode 100644 (file)
index 0000000..e55796b
--- /dev/null
@@ -0,0 +1,4 @@
+This folder is for LVGL SquareLine Studio
+
+SquareLine Studio can automatically put the generated C files into `ui` folder, so that rt-thread will automatically detect them; or, as a user, you can move the generated C files into `ui` folder manually.
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/rt-thread/squareline/SConscript b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/rt-thread/squareline/SConscript
new file mode 100644 (file)
index 0000000..51edf22
--- /dev/null
@@ -0,0 +1,10 @@
+from building import *
+
+cwd = GetCurrentDir()
+src = ['lv_ui_entry.c']
+
+src += Glob(cwd + '/ui/*.c')
+
+group = DefineGroup('LVGL-SquareLine', src, depend = ['PKG_USING_LVGL_SQUARELINE'])
+
+Return('group')
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/rt-thread/squareline/lv_ui_entry.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/rt-thread/squareline/lv_ui_entry.c
new file mode 100644 (file)
index 0000000..f08e1f5
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Change Logs:
+ * Date           Author        Notes
+ * 2022-05-13     Meco Man      First version
+ */
+
+#ifdef __RTTHREAD__
+
+void lv_user_gui_init(void)
+{
+    extern void ui_init(void);
+    ui_init();
+}
+
+#endif /* __RTTHREAD__ */
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/rt-thread/squareline/ui/lvgl/lvgl.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/rt-thread/squareline/ui/lvgl/lvgl.h
new file mode 100644 (file)
index 0000000..f2d518f
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2022-11-20     Meco Man     The first version
+ */
+
+#ifdef __RTTHREAD__
+
+#include "../../../../../lvgl.h" /* back to the root folder's lvgl.h */
+
+#endif /* __RTTHREAD__ */
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/assets/emoji/F600.png b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/assets/emoji/F600.png
new file mode 100644 (file)
index 0000000..c31a1f7
Binary files /dev/null and b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/assets/emoji/F600.png differ
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/assets/emoji/img_emoji_F617.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/assets/emoji/img_emoji_F617.c
new file mode 100644 (file)
index 0000000..29fd2fa
--- /dev/null
@@ -0,0 +1,324 @@
+#ifdef LV_LVGL_H_INCLUDE_SIMPLE
+#include "lvgl.h"
+#else
+#include "../../../lvgl.h"
+#endif
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+#ifndef LV_ATTRIBUTE_IMG_1F617
+#define LV_ATTRIBUTE_IMG_1F617
+#endif
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_1F617 uint8_t emoji_F617_map[] = {
+#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
+  /*Pixel format: Red: 3 bit, Green: 3 bit, Blue: 2 bit*/
+  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, 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, 0xd1,
+  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, 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,
+  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, 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,
+  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, 0xd1, 0xd1, 0xd0, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xd0, 0xd1, 0xd1, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xf1, 0xf1, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf8, 0xf8, 0xf8, 0xf9, 0xf8, 0xf9, 0xf4, 0xf4, 0xf0, 0xf1, 0xf1, 0xd1, 0xd1, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0xf0, 0xf4, 0xf4, 0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xf4, 0xf4, 0xf0, 0xf1, 0xd1, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0xf0, 0xf4, 0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xf4, 0xf4, 0xf1, 0xd1, 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, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0xf4, 0xf4, 0xf8, 0xf8, 0xfc, 0xfc, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xf8, 0xf8, 0xf4, 0xf4, 0xf1, 0xd1, 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, 0xd1, 0xf1, 0xf0, 0xf4, 0xf8, 0xf8, 0xfc, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xfc, 0xf8, 0xf8, 0xf4, 0xf0, 0xf1, 0xd1, 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, 0xd1, 0xf0, 0xf4, 0xf4, 0xf8, 0xf8, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xfc, 0xf8, 0xf4, 0xf4, 0xf0, 0xd1, 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, 0xd0, 0xf0, 0xf4, 0xf4, 0xf8, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xf8, 0xf4, 0xf4, 0xf0, 0xd0, 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, 0xf1, 0xf0, 0xf4, 0xf8, 0xf8, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf8, 0xf8, 0xf4, 0xf0, 0xf1, 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, 0xcc, 0xf0, 0xf4, 0xf8, 0xf8, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf9, 0xf8, 0xf4, 0xf0, 0xf1, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf4, 0xf4, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf9, 0xf8, 0xf4, 0xf0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf4, 0xf4, 0xf9, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xf9, 0xf4, 0xf4, 0xf0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, 0xf4, 0xf4, 0xf8, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf9, 0xf4, 0xf4, 0xf0, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf4, 0xf4, 0xf8, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf9, 0xf4, 0xf4, 0xf0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf4, 0xf4, 0xf8, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf8, 0xf4, 0xf4, 0xf0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf4, 0xf4, 0xf9, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xf4, 0xf4, 0xf0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf4, 0xf4, 0xf9, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xf9, 0xf4, 0xf4, 0xf0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf4, 0xf4, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xf4, 0xf4, 0xf0, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf4, 0xf4, 0xf9, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xf9, 0xf4, 0xf4, 0xf0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf4, 0xf4, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf4, 0xf0, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf0, 0xf4, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf4, 0xf4, 0xf0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf4, 0xf4, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf4, 0xf4, 0xf0, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf0, 0xf4, 0xf4, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xb0, 0x88, 0xac, 0xf9, 0xfd, 0xfe, 0xfd, 0xfe, 0xfd, 0xfe, 0xfe, 0xfe, 0xfd, 0xfe, 0xfe, 0xfd, 0xfe, 0xfd, 0xd5, 0xac, 0x88, 0xd0, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf4, 0xf0, 0xf0, 0xd1, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf0, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0x88, 0x64, 0x64, 0x64, 0x68, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xd0, 0x64, 0x64, 0x64, 0x64, 0xac, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf0, 0xf0, 0xd1, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf0, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xb0, 0x64, 0x88, 0x88, 0x88, 0x64, 0xac, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0x88, 0x68, 0x88, 0x88, 0x88, 0x64, 0xd5, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf0, 0xf0, 0xf1, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0x88, 0x88, 0xac, 0xac, 0xac, 0x88, 0x88, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xd5, 0x68, 0x88, 0xac, 0xac, 0xac, 0x68, 0xb0, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf0, 0xf0, 0xd0, 0xd1, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0x88, 0x88, 0xac, 0xac, 0xac, 0xac, 0x88, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xd5, 0x88, 0xac, 0xac, 0xac, 0xac, 0x88, 0xac, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf0, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0x88, 0x88, 0xac, 0xac, 0xac, 0xac, 0x88, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xd5, 0x88, 0xac, 0xac, 0xac, 0xac, 0x88, 0xac, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf0, 0xf0, 0xd1, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xd1, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xb0, 0x88, 0xac, 0xac, 0xac, 0x88, 0xac, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0x88, 0xac, 0xac, 0xac, 0xac, 0x88, 0xd0, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf0, 0xd0, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xd0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0x88, 0x88, 0xac, 0x88, 0x88, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xd5, 0x88, 0xac, 0xac, 0x88, 0xac, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf0, 0xf1, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xb0, 0xac, 0xb0, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xd5, 0xac, 0xac, 0xd0, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xcc, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xcc, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xd0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf1, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xd0, 0xcc, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xd0, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xf9, 0xf9, 0xfd, 0xf9, 0xfd, 0xf9, 0xfd, 0xfd, 0xfd, 0xfd, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xf9, 0xd5, 0xd0, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xd0, 0xd1, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xb0, 0x68, 0x64, 0x88, 0xac, 0xd0, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf1, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xf9, 0xd5, 0xac, 0x68, 0x64, 0x88, 0xcc, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xfd, 0xf9, 0xb0, 0x64, 0x64, 0xac, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xf9, 0x88, 0x64, 0x68, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xd0, 0x88, 0x68, 0xac, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xb0, 0x68, 0x88, 0xb0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xb0, 0x88, 0x64, 0x88, 0xd0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xac, 0x64, 0x64, 0xb0, 0xf9, 0xf4, 0xf0, 0xf0, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xd0, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xb0, 0x64, 0x68, 0xb0, 0xf4, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xd5, 0xac, 0x68, 0x88, 0xac, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfd, 0xfd, 0xd0, 0x68, 0x64, 0x88, 0xcc, 0xf4, 0xf4, 0xf4, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xd5, 0x88, 0x64, 0x68, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0x88, 0x68, 0x88, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf4, 0xf9, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xcc, 0x88, 0x68, 0x88, 0xd0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xac, 0x88, 0x68, 0x68, 0xac, 0xd0, 0xf4, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xd0, 0xac, 0xac, 0xd0, 0xf4, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xd1, 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, 0xd1, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf9, 0xf9, 0xf9, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xd1, 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, 0xd0, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xd0, 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, 0xd1, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xd1, 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, 0xd1, 0xcc, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xcc, 0xd1, 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, 0xd1, 0xcc, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf0, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xd0, 0xd1, 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, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xcc, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xd0, 0xd0, 0xd1, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xd1, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xf1, 0xd0, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xd0, 0xf1, 0xd1, 0xd1, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xd1, 0xd0, 0xf1, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xf1, 0xd0, 0xd1, 0xd1, 0xd1, 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, 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, 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, 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, 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,
+  0xd1, 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, 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,
+#endif
+#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0
+  /*Pixel format: Red: 5 bit, Green: 6 bit, Blue: 5 bit*/
+  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, 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, 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, 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, 0x25, 0xcc,
+  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, 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, 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, 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,
+  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, 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, 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, 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,
+  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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0xe4, 0xcb, 0xc4, 0xd3, 0x04, 0xdc, 0x04, 0xdc, 0x84, 0xec, 0x84, 0xec, 0x84, 0xec, 0x84, 0xec, 0x04, 0xdc, 0x04, 0xdc, 0xc4, 0xd3, 0xe4, 0xcb, 0x25, 0xcc, 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, 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, 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, 0x25, 0xcc, 0xe4, 0xcb, 0x04, 0xdc, 0x84, 0xec, 0x83, 0xf4, 0x03, 0xf5, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xc5, 0xfd, 0x01, 0xfe, 0xa4, 0xfd, 0x83, 0xfd, 0x03, 0xf5, 0x83, 0xf4, 0x84, 0xec, 0x04, 0xdc, 0xe4, 0xcb, 0x25, 0xcc, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x04, 0xdc, 0x83, 0xf4, 0x03, 0xf5, 0x83, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x83, 0xfd, 0x03, 0xf5, 0x83, 0xf4, 0x84, 0xec, 0xe4, 0xcb, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x84, 0xec, 0x42, 0xf4, 0x83, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x06, 0xff, 0x67, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xac, 0xff, 0x8a, 0xff, 0x09, 0xff, 0x06, 0xff, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x83, 0xfd, 0x03, 0xf5, 0x84, 0xec, 0xe4, 0xcb, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x84, 0xec, 0x03, 0xf5, 0x61, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x09, 0xff, 0x4e, 0xff, 0xd3, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xd3, 0xff, 0xcf, 0xff, 0x09, 0xff, 0xa6, 0xfe, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x61, 0xfd, 0x03, 0xf5, 0x84, 0xec, 0xe4, 0xcb, 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, 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, 0x25, 0xcc, 0x04, 0xdc, 0x42, 0xf4, 0x61, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xe6, 0xfe, 0x4e, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0x70, 0xff, 0x09, 0xff, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x61, 0xfd, 0x42, 0xf4, 0x84, 0xec, 0x25, 0xcc, 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, 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, 0xe4, 0xcb, 0x83, 0xf4, 0x01, 0xfd, 0x61, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0xa6, 0xfe, 0x70, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xd1, 0xff, 0x09, 0xff, 0xa1, 0xfe, 0x01, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x83, 0xf4, 0xe4, 0xcb, 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, 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, 0xc4, 0xd3, 0x42, 0xf4, 0x61, 0xfd, 0x61, 0xfd, 0x01, 0xfe, 0xa1, 0xfe, 0x4e, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0x70, 0xff, 0xa6, 0xfe, 0x01, 0xfe, 0x61, 0xfd, 0x61, 0xfd, 0x42, 0xf4, 0xc4, 0xd3, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdc, 0x81, 0xfc, 0x61, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0xa9, 0xfe, 0xd3, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0x0b, 0xff, 0x01, 0xfe, 0x01, 0xfe, 0x61, 0xfd, 0x81, 0xfc, 0x84, 0xec, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x81, 0xfc, 0x61, 0xfd, 0x01, 0xfe, 0x01, 0xfe, 0x0b, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0x70, 0xff, 0x25, 0xfe, 0x01, 0xfe, 0x61, 0xfd, 0x81, 0xfc, 0x84, 0xec, 0x25, 0xcc, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdc, 0x81, 0xfc, 0x61, 0xfd, 0x61, 0xfd, 0x01, 0xfe, 0x4e, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0x70, 0xff, 0x66, 0xfe, 0x01, 0xfe, 0x61, 0xfd, 0x81, 0xfc, 0x84, 0xec, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdc, 0x81, 0xfc, 0x61, 0xfd, 0x61, 0xfd, 0x25, 0xfe, 0x4e, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0x70, 0xff, 0x87, 0xfe, 0x61, 0xfd, 0x61, 0xfd, 0x81, 0xfc, 0x84, 0xec, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xd3, 0x81, 0xfc, 0x01, 0xfd, 0x61, 0xfd, 0x01, 0xfe, 0x4e, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0x70, 0xff, 0x46, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0xc4, 0xd3, 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, 0x00, 0x00, 0xe4, 0xcb, 0x42, 0xf4, 0x01, 0xfd, 0x61, 0xfd, 0x01, 0xfe, 0x4e, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0x70, 0xff, 0xd3, 0xff, 0x70, 0xff, 0x25, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x42, 0xf4, 0xe4, 0xcb, 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, 0x25, 0xcc, 0x83, 0xf4, 0x01, 0xfd, 0x61, 0xfd, 0x01, 0xfe, 0xa9, 0xfe, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0x70, 0xff, 0xd1, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x4e, 0xff, 0x01, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x83, 0xf4, 0x25, 0xcc, 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, 0x04, 0xdc, 0x81, 0xfc, 0x01, 0xfd, 0x61, 0xfd, 0x47, 0xfe, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0xd1, 0xff, 0x70, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0xa9, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0x84, 0xec, 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, 0xe4, 0xcb, 0x42, 0xf4, 0x01, 0xfd, 0x61, 0xfd, 0xc5, 0xfd, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x70, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0x70, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x07, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x42, 0xf4, 0xe4, 0xcb, 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, 0x84, 0xec, 0x81, 0xfc, 0x01, 0xfd, 0x61, 0xfd, 0xa9, 0xfe, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x0b, 0xff, 0x83, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0x82, 0xcb, 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, 0xe4, 0xcb, 0x42, 0xf4, 0x01, 0xfd, 0x61, 0xfd, 0xc5, 0xfd, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0x4e, 0xff, 0xac, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x47, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x61, 0xe4, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x81, 0xfc, 0x01, 0xfd, 0x61, 0xfd, 0x47, 0xfe, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x4e, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x4e, 0xff, 0xac, 0xff, 0x4e, 0xff, 0xac, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0xa9, 0xfe, 0xa4, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x42, 0xf4, 0x81, 0xfc, 0x01, 0xfd, 0xc5, 0xfd, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0xac, 0xff, 0x4e, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x0b, 0xff, 0xac, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0xa9, 0xfe, 0xa9, 0xfe, 0x07, 0xfe, 0x61, 0xfd, 0x01, 0xfd, 0x42, 0xf4, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdc, 0x81, 0xfc, 0x01, 0xfd, 0x61, 0xfd, 0x07, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x0b, 0xff, 0xa9, 0xfe, 0x0b, 0xff, 0x09, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xa9, 0xfe, 0x09, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x09, 0xff, 0xa9, 0xfe, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x09, 0xff, 0x0b, 0xff, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x07, 0xfe, 0x83, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0x84, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x83, 0xf4, 0x81, 0xfc, 0x01, 0xfd, 0x83, 0xfd, 0x47, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x0b, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x47, 0xe6, 0xa3, 0xab, 0x61, 0x8a, 0x21, 0xa3, 0x47, 0xe6, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xff, 0x25, 0xcd, 0xe1, 0x9a, 0x61, 0x8a, 0x64, 0xc4, 0xa9, 0xfe, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x09, 0xff, 0x09, 0xff, 0x0b, 0xff, 0x09, 0xff, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x47, 0xfe, 0xa4, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0x83, 0xf4, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x42, 0xf4, 0x81, 0xfc, 0x01, 0xfd, 0xa4, 0xfd, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x47, 0xe6, 0x61, 0x8a, 0x40, 0x61, 0x80, 0x69, 0x40, 0x61, 0xc0, 0x71, 0x47, 0xe6, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x64, 0xc4, 0x80, 0x69, 0x40, 0x61, 0x80, 0x69, 0x40, 0x61, 0x21, 0xa3, 0xa9, 0xfe, 0x8a, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0xa9, 0xfe, 0x09, 0xff, 0xa9, 0xfe, 0xa9, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0xe6, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0x21, 0xe4, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdc, 0x81, 0xfc, 0x81, 0xfc, 0x01, 0xfd, 0xc5, 0xfd, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0xa9, 0xfe, 0xe6, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0xa3, 0xab, 0x80, 0x69, 0x61, 0x8a, 0x61, 0x8a, 0x61, 0x8a, 0x80, 0x69, 0xe1, 0x9a, 0x09, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x47, 0xe6, 0x00, 0x7a, 0xc0, 0x71, 0x61, 0x8a, 0x61, 0x8a, 0x00, 0x7a, 0x80, 0x69, 0x25, 0xcd, 0x67, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0xa9, 0xfe, 0xa9, 0xfe, 0x87, 0xfe, 0xa9, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0x43, 0xfd, 0x81, 0xfc, 0x81, 0xfc, 0x04, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x81, 0xfc, 0x81, 0xfc, 0x43, 0xfd, 0xc5, 0xfd, 0x07, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0x09, 0xff, 0xe6, 0xfe, 0x09, 0xff, 0x09, 0xff, 0x67, 0xff, 0x67, 0xff, 0xe6, 0xfe, 0x61, 0x8a, 0x00, 0x7a, 0xe1, 0x9a, 0x21, 0xa3, 0xe1, 0x9a, 0x61, 0x8a, 0x00, 0x7a, 0x47, 0xe6, 0x8a, 0xff, 0x67, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x67, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x25, 0xcd, 0xc0, 0x71, 0x61, 0x8a, 0x21, 0xa3, 0x21, 0xa3, 0xe1, 0x9a, 0xc0, 0x71, 0xa3, 0xab, 0x09, 0xff, 0x67, 0xff, 0x09, 0xff, 0x09, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa9, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0x43, 0xfd, 0x81, 0xfc, 0x81, 0xfc, 0x82, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x61, 0xcb, 0x81, 0xfc, 0x01, 0xfd, 0x43, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0x46, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x67, 0xff, 0x47, 0xe6, 0x61, 0x8a, 0x61, 0x8a, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0xe1, 0x9a, 0x00, 0x7a, 0x47, 0xe6, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x25, 0xcd, 0x00, 0x7a, 0xe1, 0x9a, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x00, 0x7a, 0xe1, 0x9a, 0x06, 0xff, 0x67, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa9, 0xfe, 0xe6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0xe6, 0xfd, 0xc5, 0xfd, 0x43, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0x61, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0xc0, 0xdb, 0x81, 0xfc, 0x01, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0x25, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x67, 0xff, 0xe6, 0xfe, 0x61, 0x8a, 0x61, 0x8a, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0xe1, 0x9a, 0x61, 0x8a, 0x47, 0xe6, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x25, 0xcd, 0x00, 0x7a, 0xe1, 0x9a, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x61, 0x8a, 0x21, 0xa3, 0x06, 0xff, 0x06, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x25, 0xfe, 0xc5, 0xfd, 0xc5, 0xfd, 0x43, 0xfd, 0x01, 0xfd, 0x81, 0xfc, 0xc0, 0xdb, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0xc0, 0xdb, 0xa2, 0xec, 0xe2, 0xf4, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0x25, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x67, 0xff, 0xa3, 0xab, 0x61, 0x8a, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x61, 0x8a, 0x21, 0xa3, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x47, 0xe6, 0x61, 0x8a, 0xe1, 0x9a, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x00, 0x7a, 0x64, 0xc4, 0x67, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x46, 0xfe, 0x25, 0xfe, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xa2, 0xec, 0x21, 0xe4, 0xc4, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xd3, 0x21, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x06, 0xff, 0x47, 0xe6, 0x61, 0x8a, 0x61, 0x8a, 0xe1, 0x9a, 0x61, 0x8a, 0x61, 0x8a, 0x47, 0xe6, 0x67, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x67, 0xff, 0x67, 0xff, 0x25, 0xcd, 0x61, 0x8a, 0xe1, 0x9a, 0xe1, 0x9a, 0x61, 0x8a, 0x21, 0xa3, 0xe6, 0xfe, 0x06, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xa2, 0xec, 0x21, 0xe4, 0x04, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x21, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0x67, 0xff, 0x47, 0xe6, 0xa3, 0xab, 0x21, 0xa3, 0xa3, 0xab, 0x47, 0xe6, 0x67, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x67, 0xff, 0x67, 0xff, 0x25, 0xcd, 0x21, 0xa3, 0x21, 0xa3, 0x64, 0xc4, 0x47, 0xe6, 0x06, 0xff, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0xe2, 0xf4, 0xa2, 0xec, 0x21, 0xe4, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x21, 0xe4, 0x61, 0xe4, 0xe2, 0xf4, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x67, 0xff, 0x67, 0xff, 0x09, 0xff, 0x67, 0xff, 0x67, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x67, 0xff, 0x09, 0xff, 0xe6, 0xfe, 0x67, 0xff, 0x06, 0xff, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0xe2, 0xf4, 0xa2, 0xec, 0x21, 0xe4, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x21, 0xe4, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0x06, 0xff, 0x06, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0xe2, 0xf4, 0x61, 0xe4, 0x21, 0xe4, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0xc0, 0xdb, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x06, 0xff, 0xa6, 0xfe, 0x06, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0x06, 0xff, 0xe6, 0xfe, 0x06, 0xff, 0xe6, 0xfe, 0x06, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0x06, 0xff, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xc5, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0x61, 0xe4, 0x21, 0xe4, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0xc0, 0xdb, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x06, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x06, 0xff, 0xe6, 0xfe, 0x06, 0xff, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0x61, 0xe4, 0xc0, 0xdb, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdc, 0xc0, 0xdb, 0x61, 0xe4, 0xa2, 0xec, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x25, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0x06, 0xff, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0x61, 0xe4, 0xc0, 0xdb, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xd3, 0xc0, 0xdb, 0x21, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x46, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xa2, 0xec, 0x61, 0xe4, 0xc0, 0xdb, 0x04, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xd3, 0x60, 0xcb, 0x21, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x25, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x21, 0xe4, 0xc0, 0xdb, 0xc4, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x41, 0xcb, 0x21, 0xe4, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0x61, 0xe4, 0x21, 0xe4, 0x60, 0xcb, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x61, 0xcb, 0xc0, 0xdb, 0x61, 0xe4, 0xa2, 0xec, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0x61, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0xc0, 0xdb, 0x21, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0x46, 0xfe, 0x25, 0xcd, 0x64, 0xc4, 0xa2, 0xec, 0x43, 0xfd, 0xe6, 0xfd, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x21, 0xe4, 0xc0, 0xdb, 0x82, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdc, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0xa3, 0xab, 0xc0, 0x71, 0x80, 0x69, 0x00, 0x7a, 0xe1, 0x9a, 0x64, 0xc4, 0x03, 0xf5, 0xe6, 0xfd, 0x46, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0x04, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x41, 0xcb, 0xc0, 0xdb, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa9, 0xfe, 0x47, 0xe6, 0x25, 0xcd, 0x21, 0xa3, 0xc0, 0x71, 0x40, 0x61, 0x00, 0x7a, 0x60, 0xcb, 0xa4, 0xfd, 0x46, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0xa2, 0xec, 0x61, 0xe4, 0xc0, 0xdb, 0x60, 0xcb, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x61, 0xcb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa9, 0xfe, 0x09, 0xff, 0x09, 0xff, 0x47, 0xe6, 0xa3, 0xab, 0x80, 0x69, 0x40, 0x61, 0xe1, 0x9a, 0xa4, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x21, 0xe4, 0xc0, 0xdb, 0x61, 0xcb, 0x25, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x09, 0xff, 0x07, 0xfe, 0x61, 0x8a, 0x80, 0x69, 0xc0, 0x71, 0xa2, 0xec, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x41, 0xcb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x64, 0xc4, 0x00, 0x7a, 0xc0, 0x71, 0xe1, 0x9a, 0x43, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x21, 0xe4, 0xc0, 0xdb, 0x41, 0xcb, 0xe4, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x03, 0xf5, 0xa3, 0xab, 0xc0, 0x71, 0x00, 0x7a, 0xa3, 0xab, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x82, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x41, 0xcb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x03, 0xf5, 0xa3, 0xab, 0x00, 0x7a, 0x80, 0x69, 0x61, 0x8a, 0x64, 0xc4, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x43, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0xe2, 0xf4, 0xe2, 0xf4, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0x60, 0xcb, 0xe4, 0xcb, 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, 0x82, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0xe1, 0x9a, 0x40, 0x61, 0x40, 0x61, 0xa3, 0xab, 0xa4, 0xfd, 0x43, 0xfd, 0x81, 0xfc, 0x81, 0xfc, 0x03, 0xf5, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x82, 0xcb, 0x25, 0xcc, 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, 0xe4, 0xcb, 0x41, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0xa3, 0xab, 0x80, 0x69, 0xc0, 0x71, 0xa3, 0xab, 0xa2, 0xec, 0x81, 0xfc, 0x81, 0xfc, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0x41, 0xcb, 0xe4, 0xcb, 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, 0x82, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xa9, 0xfe, 0x25, 0xcd, 0x21, 0xa3, 0xc0, 0x71, 0x00, 0x7a, 0x21, 0xa3, 0xc0, 0xdb, 0x81, 0xfc, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0x60, 0xcb, 0x82, 0xcb, 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, 0x25, 0xcc, 0x61, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xa9, 0xfe, 0xa9, 0xfe, 0x64, 0xc4, 0xc0, 0x71, 0x40, 0x61, 0x00, 0x7a, 0x60, 0xcb, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x61, 0xcb, 0x25, 0xcc, 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, 0xe4, 0xcb, 0x41, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0x87, 0xfe, 0x25, 0xcd, 0x00, 0x7a, 0x80, 0x69, 0xc0, 0x71, 0x61, 0xe4, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x41, 0xcb, 0xe4, 0xcb, 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, 0x00, 0x00, 0xc4, 0xd3, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0xa2, 0xec, 0x61, 0x8a, 0xc0, 0x71, 0x00, 0x7a, 0xa2, 0xec, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x04, 0xdc, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0xa2, 0xec, 0x60, 0xcb, 0x00, 0x7a, 0xc0, 0x71, 0x61, 0x8a, 0x64, 0xc4, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xe2, 0xf4, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0x60, 0xcb, 0x82, 0xcb, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x82, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xa2, 0xec, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x61, 0xe4, 0x21, 0xa3, 0x61, 0x8a, 0xc0, 0x71, 0xc0, 0x71, 0xe1, 0x9a, 0x64, 0xc4, 0x43, 0xfd, 0xa4, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xa2, 0xec, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0x60, 0xcb, 0x82, 0xcb, 0x25, 0xcc, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x82, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xe2, 0xf4, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x64, 0xc4, 0xe1, 0x9a, 0x21, 0xa3, 0x64, 0xc4, 0x03, 0xf5, 0xa4, 0xfd, 0xa4, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xe2, 0xf4, 0xa2, 0xec, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x82, 0xcb, 0x25, 0xcc, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0x82, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xa2, 0xec, 0xe2, 0xf4, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xe2, 0xf4, 0xa2, 0xec, 0xa2, 0xec, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x82, 0xcb, 0x25, 0xcc, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xd3, 0x41, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xa2, 0xec, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x43, 0xfd, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xe2, 0xf4, 0xa2, 0xec, 0xa2, 0xec, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0x60, 0xcb, 0x41, 0xcb, 0xc4, 0xd3, 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, 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, 0xe4, 0xcb, 0x61, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xa2, 0xec, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0x03, 0xf5, 0x03, 0xf5, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x61, 0xcb, 0xe4, 0xcb, 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, 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, 0x25, 0xcc, 0x82, 0xcb, 0x41, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xe2, 0xf4, 0xe2, 0xf4, 0xa2, 0xec, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xa2, 0xec, 0xe2, 0xf4, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x41, 0xcb, 0x82, 0xcb, 0x25, 0xcc, 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, 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, 0xe4, 0xcb, 0x82, 0xcb, 0x41, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0xa2, 0xec, 0x61, 0xe4, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x41, 0xcb, 0x82, 0xcb, 0xe4, 0xcb, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0xe4, 0xcb, 0x82, 0xcb, 0x41, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x41, 0xcb, 0x82, 0xcb, 0xc4, 0xd3, 0x25, 0xcc, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xcb, 0x82, 0xcb, 0x61, 0xcb, 0x41, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0x21, 0xe4, 0xc0, 0xdb, 0x21, 0xe4, 0xc0, 0xdb, 0x21, 0xe4, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0x60, 0xcb, 0x60, 0xcb, 0x41, 0xcb, 0x61, 0xcb, 0x82, 0xcb, 0xe4, 0xcb, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xcc, 0xe4, 0xcb, 0x04, 0xdc, 0x82, 0xcb, 0x61, 0xcb, 0x41, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x41, 0xcb, 0x61, 0xcb, 0x82, 0xcb, 0x04, 0xdc, 0xe4, 0xcb, 0x25, 0xcc, 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, 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, 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, 0x25, 0xcc, 0x25, 0xcc, 0xe4, 0xcb, 0xc4, 0xd3, 0x04, 0xdc, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x04, 0xdc, 0xc4, 0xd3, 0xe4, 0xcb, 0x25, 0xcc, 0x25, 0xcc, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x25, 0xcc, 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, 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, 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, 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,
+#endif
+#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0
+  /*Pixel format: Red: 5 bit, Green: 6 bit, Blue: 5 bit BUT the 2 bytes are swapped*/
+  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, 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, 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, 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, 0xcc, 0x25,
+  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, 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, 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, 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,
+  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, 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, 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, 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,
+  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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0xe4, 0xd3, 0xc4, 0xdc, 0x04, 0xdc, 0x04, 0xec, 0x84, 0xec, 0x84, 0xec, 0x84, 0xec, 0x84, 0xdc, 0x04, 0xdc, 0x04, 0xd3, 0xc4, 0xcb, 0xe4, 0xcc, 0x25, 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, 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, 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, 0xcc, 0x25, 0xcb, 0xe4, 0xdc, 0x04, 0xec, 0x84, 0xf4, 0x83, 0xf5, 0x03, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfd, 0xc5, 0xfe, 0x01, 0xfd, 0xa4, 0xfd, 0x83, 0xf5, 0x03, 0xf4, 0x83, 0xec, 0x84, 0xdc, 0x04, 0xcb, 0xe4, 0xcc, 0x25, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xdc, 0x04, 0xf4, 0x83, 0xf5, 0x03, 0xfd, 0x83, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfd, 0x83, 0xf5, 0x03, 0xf4, 0x83, 0xec, 0x84, 0xcb, 0xe4, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xec, 0x84, 0xf4, 0x42, 0xfd, 0x83, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xff, 0x06, 0xff, 0x67, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xac, 0xff, 0x8a, 0xff, 0x09, 0xff, 0x06, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfd, 0x83, 0xf5, 0x03, 0xec, 0x84, 0xcb, 0xe4, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xec, 0x84, 0xf5, 0x03, 0xfd, 0x61, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xa1, 0xff, 0x09, 0xff, 0x4e, 0xff, 0xd3, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xd3, 0xff, 0xcf, 0xff, 0x09, 0xfe, 0xa6, 0xfe, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfd, 0x61, 0xf5, 0x03, 0xec, 0x84, 0xcb, 0xe4, 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, 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, 0xcc, 0x25, 0xdc, 0x04, 0xf4, 0x42, 0xfd, 0x61, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xa1, 0xfe, 0xe6, 0xff, 0x4e, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0x70, 0xff, 0x09, 0xfe, 0xa1, 0xfe, 0x01, 0xfe, 0x01, 0xfd, 0x61, 0xf4, 0x42, 0xec, 0x84, 0xcc, 0x25, 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, 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, 0xcb, 0xe4, 0xf4, 0x83, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xa6, 0xff, 0x70, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xd1, 0xff, 0x09, 0xfe, 0xa1, 0xfe, 0x01, 0xfd, 0x61, 0xfd, 0x01, 0xf4, 0x83, 0xcb, 0xe4, 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, 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, 0xd3, 0xc4, 0xf4, 0x42, 0xfd, 0x61, 0xfd, 0x61, 0xfe, 0x01, 0xfe, 0xa1, 0xff, 0x4e, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0x70, 0xfe, 0xa6, 0xfe, 0x01, 0xfd, 0x61, 0xfd, 0x61, 0xf4, 0x42, 0xd3, 0xc4, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xfc, 0x81, 0xfd, 0x61, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xa9, 0xff, 0xd3, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0x0b, 0xfe, 0x01, 0xfe, 0x01, 0xfd, 0x61, 0xfc, 0x81, 0xec, 0x84, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xfc, 0x81, 0xfd, 0x61, 0xfe, 0x01, 0xfe, 0x01, 0xff, 0x0b, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0x70, 0xfe, 0x25, 0xfe, 0x01, 0xfd, 0x61, 0xfc, 0x81, 0xec, 0x84, 0xcc, 0x25, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xfc, 0x81, 0xfd, 0x61, 0xfd, 0x61, 0xfe, 0x01, 0xff, 0x4e, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0x70, 0xfe, 0x66, 0xfe, 0x01, 0xfd, 0x61, 0xfc, 0x81, 0xec, 0x84, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xfc, 0x81, 0xfd, 0x61, 0xfd, 0x61, 0xfe, 0x25, 0xff, 0x4e, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0x70, 0xfe, 0x87, 0xfd, 0x61, 0xfd, 0x61, 0xfc, 0x81, 0xec, 0x84, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xc4, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0x01, 0xff, 0x4e, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0x70, 0xfe, 0x46, 0xfd, 0x61, 0xfd, 0x01, 0xfc, 0x81, 0xd3, 0xc4, 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, 0x00, 0x00, 0xcb, 0xe4, 0xf4, 0x42, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0x01, 0xff, 0x4e, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0x70, 0xff, 0xd3, 0xff, 0x70, 0xfe, 0x25, 0xfd, 0x61, 0xfd, 0x01, 0xf4, 0x42, 0xcb, 0xe4, 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, 0xcc, 0x25, 0xf4, 0x83, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0x01, 0xfe, 0xa9, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0x70, 0xff, 0xd1, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x4e, 0xfe, 0x01, 0xfd, 0x61, 0xfd, 0x01, 0xf4, 0x83, 0xcc, 0x25, 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, 0xdc, 0x04, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0x47, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0xd1, 0xff, 0x70, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xff, 0x70, 0xfe, 0xa9, 0xfd, 0x61, 0xfd, 0x01, 0xfc, 0x81, 0xec, 0x84, 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, 0xcb, 0xe4, 0xf4, 0x42, 0xfd, 0x01, 0xfd, 0x61, 0xfd, 0xc5, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x70, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0x70, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xfe, 0x07, 0xfd, 0x61, 0xfd, 0x01, 0xf4, 0x42, 0xcb, 0xe4, 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, 0xec, 0x84, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0xa9, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x0b, 0xfd, 0x83, 0xfd, 0x01, 0xfc, 0x81, 0xcb, 0x82, 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, 0xcb, 0xe4, 0xf4, 0x42, 0xfd, 0x01, 0xfd, 0x61, 0xfd, 0xc5, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0x4e, 0xff, 0xac, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x0b, 0xff, 0x0b, 0xfe, 0x47, 0xfd, 0x61, 0xfd, 0x01, 0xe4, 0x61, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0x47, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x4e, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x4e, 0xff, 0xac, 0xff, 0x4e, 0xff, 0xac, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xfe, 0xa9, 0xfd, 0xa4, 0xfd, 0x01, 0xfc, 0x81, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xf4, 0x42, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0xc5, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0xac, 0xff, 0x4e, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x0b, 0xff, 0xac, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x0b, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x07, 0xfd, 0x61, 0xfd, 0x01, 0xf4, 0x42, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x61, 0xfe, 0x07, 0xfe, 0xa9, 0xfe, 0xa9, 0xff, 0x0b, 0xfe, 0xa9, 0xff, 0x0b, 0xff, 0x09, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xac, 0xff, 0x8a, 0xfe, 0xa9, 0xff, 0x09, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x09, 0xfe, 0xa9, 0xff, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x09, 0xff, 0x0b, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x07, 0xfd, 0x83, 0xfd, 0x01, 0xfc, 0x81, 0xec, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xf4, 0x83, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x83, 0xfe, 0x47, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xff, 0x0b, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xe6, 0x47, 0xab, 0xa3, 0x8a, 0x61, 0xa3, 0x21, 0xe6, 0x47, 0xff, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xac, 0xff, 0x8a, 0xcd, 0x25, 0x9a, 0xe1, 0x8a, 0x61, 0xc4, 0x64, 0xfe, 0xa9, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x0b, 0xff, 0x8a, 0xff, 0x09, 0xff, 0x09, 0xff, 0x0b, 0xff, 0x09, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x47, 0xfd, 0xa4, 0xfd, 0x01, 0xfc, 0x81, 0xf4, 0x83, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xf4, 0x42, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0xa4, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0xa9, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x8a, 0xff, 0x8a, 0xe6, 0x47, 0x8a, 0x61, 0x61, 0x40, 0x69, 0x80, 0x61, 0x40, 0x71, 0xc0, 0xe6, 0x47, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xc4, 0x64, 0x69, 0x80, 0x61, 0x40, 0x69, 0x80, 0x61, 0x40, 0xa3, 0x21, 0xfe, 0xa9, 0xff, 0x8a, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xfe, 0xa9, 0xff, 0x09, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfd, 0xe6, 0xfd, 0x01, 0xfc, 0x81, 0xe4, 0x21, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xfc, 0x81, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0xc5, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0xa9, 0xfe, 0xe6, 0xfe, 0xa9, 0xfe, 0xa9, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xab, 0xa3, 0x69, 0x80, 0x8a, 0x61, 0x8a, 0x61, 0x8a, 0x61, 0x69, 0x80, 0x9a, 0xe1, 0xff, 0x09, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x8a, 0xe6, 0x47, 0x7a, 0x00, 0x71, 0xc0, 0x8a, 0x61, 0x8a, 0x61, 0x7a, 0x00, 0x69, 0x80, 0xcd, 0x25, 0xff, 0x67, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xff, 0x09, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x87, 0xfe, 0xa9, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0x43, 0xfc, 0x81, 0xfc, 0x81, 0xdc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xfc, 0x81, 0xfc, 0x81, 0xfd, 0x43, 0xfd, 0xc5, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xff, 0x09, 0xfe, 0xe6, 0xff, 0x09, 0xff, 0x09, 0xff, 0x67, 0xff, 0x67, 0xfe, 0xe6, 0x8a, 0x61, 0x7a, 0x00, 0x9a, 0xe1, 0xa3, 0x21, 0x9a, 0xe1, 0x8a, 0x61, 0x7a, 0x00, 0xe6, 0x47, 0xff, 0x8a, 0xff, 0x67, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x67, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x8a, 0xcd, 0x25, 0x71, 0xc0, 0x8a, 0x61, 0xa3, 0x21, 0xa3, 0x21, 0x9a, 0xe1, 0x71, 0xc0, 0xab, 0xa3, 0xff, 0x09, 0xff, 0x67, 0xff, 0x09, 0xff, 0x09, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa9, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0x43, 0xfc, 0x81, 0xfc, 0x81, 0xcb, 0x82, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0x61, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x43, 0xfd, 0xc5, 0xfd, 0xe6, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x67, 0xe6, 0x47, 0x8a, 0x61, 0x8a, 0x61, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0x9a, 0xe1, 0x7a, 0x00, 0xe6, 0x47, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xcd, 0x25, 0x7a, 0x00, 0x9a, 0xe1, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0x7a, 0x00, 0x9a, 0xe1, 0xff, 0x06, 0xff, 0x67, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa9, 0xfe, 0xe6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x46, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0x43, 0xfd, 0x01, 0xfc, 0x81, 0xcb, 0x61, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xdb, 0xc0, 0xfc, 0x81, 0xfd, 0x01, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x67, 0xfe, 0xe6, 0x8a, 0x61, 0x8a, 0x61, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0x9a, 0xe1, 0x8a, 0x61, 0xe6, 0x47, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xcd, 0x25, 0x7a, 0x00, 0x9a, 0xe1, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0x8a, 0x61, 0xa3, 0x21, 0xff, 0x06, 0xff, 0x06, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x25, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x43, 0xfd, 0x01, 0xfc, 0x81, 0xdb, 0xc0, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xdb, 0xc0, 0xec, 0xa2, 0xf4, 0xe2, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x67, 0xab, 0xa3, 0x8a, 0x61, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0x8a, 0x61, 0xa3, 0x21, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xff, 0x67, 0xe6, 0x47, 0x8a, 0x61, 0x9a, 0xe1, 0xa3, 0x21, 0xa3, 0x21, 0xa3, 0x21, 0x7a, 0x00, 0xc4, 0x64, 0xff, 0x67, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x46, 0xfe, 0x25, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x43, 0xf5, 0x03, 0xec, 0xa2, 0xe4, 0x21, 0xd3, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xc4, 0xe4, 0x21, 0xec, 0xa2, 0xf4, 0xe2, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x06, 0xe6, 0x47, 0x8a, 0x61, 0x8a, 0x61, 0x9a, 0xe1, 0x8a, 0x61, 0x8a, 0x61, 0xe6, 0x47, 0xff, 0x67, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x67, 0xff, 0x67, 0xcd, 0x25, 0x8a, 0x61, 0x9a, 0xe1, 0x9a, 0xe1, 0x8a, 0x61, 0xa3, 0x21, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x43, 0xf5, 0x03, 0xec, 0xa2, 0xe4, 0x21, 0xdc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xe4, 0x21, 0xec, 0xa2, 0xf4, 0xe2, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xff, 0x67, 0xe6, 0x47, 0xab, 0xa3, 0xa3, 0x21, 0xab, 0xa3, 0xe6, 0x47, 0xff, 0x67, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x67, 0xff, 0x67, 0xcd, 0x25, 0xa3, 0x21, 0xa3, 0x21, 0xc4, 0x64, 0xe6, 0x47, 0xff, 0x06, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x21, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xe4, 0x21, 0xe4, 0x61, 0xf4, 0xe2, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xff, 0x67, 0xff, 0x67, 0xff, 0x09, 0xff, 0x67, 0xff, 0x67, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x67, 0xff, 0x09, 0xfe, 0xe6, 0xff, 0x67, 0xff, 0x06, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x21, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xe4, 0x21, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xff, 0x06, 0xff, 0x06, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xff, 0x06, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf4, 0xe2, 0xe4, 0x61, 0xe4, 0x21, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xdb, 0xc0, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xff, 0x06, 0xfe, 0xa6, 0xff, 0x06, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xff, 0x06, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xf5, 0x03, 0xf4, 0xe2, 0xe4, 0x61, 0xe4, 0x21, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xdb, 0xc0, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x66, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x83, 0xfd, 0x83, 0xf5, 0x03, 0xf4, 0xe2, 0xe4, 0x61, 0xdb, 0xc0, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xdb, 0xc0, 0xe4, 0x61, 0xec, 0xa2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xff, 0x06, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xe4, 0x61, 0xdb, 0xc0, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xc4, 0xdb, 0xc0, 0xe4, 0x21, 0xec, 0xa2, 0xf4, 0xe2, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x25, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x46, 0xfe, 0x25, 0xfe, 0x25, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xec, 0xa2, 0xe4, 0x61, 0xdb, 0xc0, 0xdc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xc4, 0xcb, 0x60, 0xe4, 0x21, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x25, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x21, 0xdb, 0xc0, 0xd3, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xcb, 0x41, 0xe4, 0x21, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xe4, 0x61, 0xe4, 0x21, 0xcb, 0x60, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0x61, 0xdb, 0xc0, 0xe4, 0x61, 0xec, 0xa2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x66, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xcb, 0x61, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xdb, 0xc0, 0xe4, 0x21, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xe6, 0xfe, 0x46, 0xcd, 0x25, 0xc4, 0x64, 0xec, 0xa2, 0xfd, 0x43, 0xfd, 0xe6, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x82, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x47, 0xab, 0xa3, 0x71, 0xc0, 0x69, 0x80, 0x7a, 0x00, 0x9a, 0xe1, 0xc4, 0x64, 0xf5, 0x03, 0xfd, 0xe6, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xdc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xcb, 0x41, 0xdb, 0xc0, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa9, 0xe6, 0x47, 0xcd, 0x25, 0xa3, 0x21, 0x71, 0xc0, 0x61, 0x40, 0x7a, 0x00, 0xcb, 0x60, 0xfd, 0xa4, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x47, 0xfe, 0x46, 0xfe, 0x07, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xec, 0xa2, 0xe4, 0x61, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0x61, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xa9, 0xff, 0x09, 0xff, 0x09, 0xe6, 0x47, 0xab, 0xa3, 0x69, 0x80, 0x61, 0x40, 0x9a, 0xe1, 0xfd, 0xa4, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x61, 0xcc, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xcb, 0x60, 0xdb, 0xc0, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xff, 0x09, 0xfe, 0x07, 0x8a, 0x61, 0x69, 0x80, 0x71, 0xc0, 0xec, 0xa2, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xcb, 0x41, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x87, 0xfe, 0x47, 0xfe, 0x07, 0xc4, 0x64, 0x7a, 0x00, 0x71, 0xc0, 0x9a, 0xe1, 0xfd, 0x43, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x41, 0xcb, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xf5, 0x03, 0xab, 0xa3, 0x71, 0xc0, 0x7a, 0x00, 0xab, 0xa3, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xcb, 0x41, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x07, 0xf5, 0x03, 0xab, 0xa3, 0x7a, 0x00, 0x69, 0x80, 0x8a, 0x61, 0xc4, 0x64, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf4, 0xe2, 0xf4, 0xe2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0xe4, 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, 0xcb, 0x82, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xfe, 0x07, 0x9a, 0xe1, 0x61, 0x40, 0x61, 0x40, 0xab, 0xa3, 0xfd, 0xa4, 0xfd, 0x43, 0xfc, 0x81, 0xfc, 0x81, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x82, 0xcc, 0x25, 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, 0xcb, 0xe4, 0xcb, 0x41, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x47, 0xab, 0xa3, 0x69, 0x80, 0x71, 0xc0, 0xab, 0xa3, 0xec, 0xa2, 0xfc, 0x81, 0xfc, 0x81, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x41, 0xcb, 0xe4, 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, 0xcb, 0x82, 0xcb, 0x60, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0xa9, 0xcd, 0x25, 0xa3, 0x21, 0x71, 0xc0, 0x7a, 0x00, 0xa3, 0x21, 0xdb, 0xc0, 0xfc, 0x81, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x82, 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, 0xcc, 0x25, 0xcb, 0x61, 0xcb, 0x60, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0xe6, 0xfe, 0xa9, 0xfe, 0xa9, 0xc4, 0x64, 0x71, 0xc0, 0x61, 0x40, 0x7a, 0x00, 0xcb, 0x60, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x61, 0xcc, 0x25, 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, 0xcb, 0xe4, 0xcb, 0x41, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0xc5, 0xfe, 0x87, 0xcd, 0x25, 0x7a, 0x00, 0x69, 0x80, 0x71, 0xc0, 0xe4, 0x61, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x41, 0xcb, 0xe4, 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, 0x00, 0x00, 0xd3, 0xc4, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x83, 0xec, 0xa2, 0x8a, 0x61, 0x71, 0xc0, 0x7a, 0x00, 0xec, 0xa2, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xdc, 0x04, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x82, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x83, 0xfd, 0x43, 0xec, 0xa2, 0xcb, 0x60, 0x7a, 0x00, 0x71, 0xc0, 0x8a, 0x61, 0xc4, 0x64, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xf4, 0xe2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x82, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0x82, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xec, 0xa2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x83, 0xfd, 0x43, 0xe4, 0x61, 0xa3, 0x21, 0x8a, 0x61, 0x71, 0xc0, 0x71, 0xc0, 0x9a, 0xe1, 0xc4, 0x64, 0xfd, 0x43, 0xfd, 0xa4, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xec, 0xa2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x82, 0xcc, 0x25, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0x82, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xec, 0xa2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x83, 0xfd, 0x43, 0xc4, 0x64, 0x9a, 0xe1, 0xa3, 0x21, 0xc4, 0x64, 0xf5, 0x03, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xf4, 0xe2, 0xec, 0xa2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x82, 0xcc, 0x25, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0x82, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xec, 0xa2, 0xec, 0xa2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0x43, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xa4, 0xfd, 0x43, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xf4, 0xe2, 0xec, 0xa2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x82, 0xcc, 0x25, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xc4, 0xcb, 0x41, 0xcb, 0x60, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xec, 0xa2, 0xec, 0xa2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xfd, 0x43, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xf4, 0xe2, 0xec, 0xa2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x41, 0xd3, 0xc4, 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, 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, 0xcb, 0xe4, 0xcb, 0x61, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xec, 0xa2, 0xec, 0xa2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xf5, 0x03, 0xf5, 0x03, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x61, 0xcb, 0xe4, 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, 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, 0xcc, 0x25, 0xcb, 0x82, 0xcb, 0x41, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xf4, 0xe2, 0xf4, 0xe2, 0xec, 0xa2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xec, 0xa2, 0xf4, 0xe2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x41, 0xcb, 0x82, 0xcc, 0x25, 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, 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, 0xcb, 0xe4, 0xcb, 0x82, 0xcb, 0x41, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xec, 0xa2, 0xe4, 0x61, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xec, 0xa2, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x41, 0xcb, 0x82, 0xcb, 0xe4, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0xe4, 0xcb, 0x82, 0xcb, 0x41, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x61, 0xe4, 0x21, 0xe4, 0x21, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x41, 0xcb, 0x82, 0xd3, 0xc4, 0xcc, 0x25, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xe4, 0xcb, 0x82, 0xcb, 0x61, 0xcb, 0x41, 0xcb, 0x60, 0xcb, 0x60, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xe4, 0x21, 0xdb, 0xc0, 0xe4, 0x21, 0xdb, 0xc0, 0xe4, 0x21, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xdb, 0xc0, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x41, 0xcb, 0x61, 0xcb, 0x82, 0xcb, 0xe4, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x25, 0xcb, 0xe4, 0xdc, 0x04, 0xcb, 0x82, 0xcb, 0x61, 0xcb, 0x41, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x60, 0xcb, 0x41, 0xcb, 0x61, 0xcb, 0x82, 0xdc, 0x04, 0xcb, 0xe4, 0xcc, 0x25, 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, 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, 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, 0xcc, 0x25, 0xcc, 0x25, 0xcb, 0xe4, 0xd3, 0xc4, 0xdc, 0x04, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xcb, 0x82, 0xdc, 0x04, 0xd3, 0xc4, 0xcb, 0xe4, 0xcc, 0x25, 0xcc, 0x25, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0xcc, 0x25, 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, 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, 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, 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,
+#endif
+#if LV_COLOR_DEPTH == 32
+  /*Pixel format: Fix 0xFF: 8 bit, Red: 8 bit, Green: 8 bit, Blue: 8 bit*/
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0a, 0xd3, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xd4, 0xfd, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xc1, 0xfc, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x0b, 0xc0, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x9c, 0xf9, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x82, 0xec, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x8a, 0xf8, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x77, 0xf7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x6d, 0xe7, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x05, 0xae, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x05, 0xae, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x22, 0x8f, 0xe6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x62, 0xf5, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x5a, 0xe1, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x18, 0x8f, 0xed, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x0e, 0x8a, 0xf1, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x03, 0x38, 0x70, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x03, 0x38, 0x70, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x28, 0xba, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x4f, 0xf1, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x03, 0x38, 0x70, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x03, 0x38, 0x70, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x05, 0x9f, 0xfe, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x3c, 0xec, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x31, 0xe1, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x2a, 0xc6, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x2d, 0xce, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x30, 0xd6, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x34, 0xdb, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x03, 0x38, 0x70, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x03, 0x38, 0x70, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x32, 0xc8, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x36, 0xc8, 0xe0, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x46, 0xe2, 0xfe, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x03, 0x38, 0x70, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x03, 0x38, 0x70, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x03, 0x38, 0x70, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x39, 0xc9, 0xff, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x03, 0x38, 0x70, 0xff, 0x1a, 0x74, 0xaa, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x37, 0xc2, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x03, 0x38, 0x70, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x08, 0x90, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x30, 0xbd, 0xff, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x48, 0xd5, 0xfe, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x03, 0x38, 0x70, 0xff, 0x00, 0x27, 0x5d, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x35, 0xd0, 0xff, 0xff, 0x2a, 0xa5, 0xca, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x01, 0x2f, 0x66, 0xff, 0x03, 0x38, 0x70, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x03, 0x38, 0x70, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x03, 0x41, 0x7c, 0xff, 0x03, 0x38, 0x70, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x06, 0x4e, 0x89, 0xff, 0x03, 0x38, 0x70, 0xff, 0x03, 0x38, 0x70, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xb0, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x0a, 0x5b, 0x96, 0xff, 0x0c, 0x66, 0xa1, 0xff, 0x1f, 0x8c, 0xc3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x28, 0xba, 0xff, 0xff, 0x28, 0xba, 0xff, 0xff, 0x21, 0xb5, 0xfe, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x17, 0xa9, 0xfa, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x15, 0xa2, 0xf3, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0f, 0x9b, 0xed, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0e, 0x93, 0xe7, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x0a, 0x8c, 0xe2, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x07, 0x83, 0xdd, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x78, 0xd7, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x04, 0x6b, 0xcb, 0xff, 0x07, 0x67, 0xc6, 0xff, 0x0b, 0x6c, 0xca, 0xff, 0x13, 0x71, 0xcc, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x13, 0x6f, 0xc7, 0xff, 0x14, 0x70, 0xc5, 0xff, 0x21, 0x80, 0xd6, 0xff, 0x1e, 0x79, 0xce, 0xff, 0x22, 0x7b, 0xc8, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+  0x28, 0x86, 0xc9, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+#endif
+};
+
+const lv_img_dsc_t emoji_F617 = {
+  .header.cf = LV_IMG_CF_TRUE_COLOR,
+  .header.always_zero = 0,
+  .header.reserved = 0,
+  .header.w = 72,
+  .header.h = 72,
+  .data_size = 5184 * LV_COLOR_SIZE / 8,
+  .data = emoji_F617_map,
+};
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/libs/freetype/Lato-Regular.ttf b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/libs/freetype/Lato-Regular.ttf
new file mode 100644 (file)
index 0000000..04ea8ef
Binary files /dev/null and b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/libs/freetype/Lato-Regular.ttf differ
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/lv_examples.mk b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/lv_examples.mk
new file mode 100644 (file)
index 0000000..b8fa7eb
--- /dev/null
@@ -0,0 +1 @@
+CSRCS += $(shell find -L $(LVGL_DIR)/$(LVGL_DIR_NAME)/examples -name \*.c)
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/fragment/index.rst b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/fragment/index.rst
new file mode 100644 (file)
index 0000000..cc821ea
--- /dev/null
@@ -0,0 +1,16 @@
+
+Basic fragment usage
+"""""""""""""""""""
+
+.. lv_example:: others/fragment/lv_example_fragment_1
+  :language: c
+
+
+
+Stack navigation example
+"""""""""""""""""""
+
+.. lv_example:: others/fragment/lv_example_fragment_2
+:language: c
+
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/fragment/lv_example_fragment.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/fragment/lv_example_fragment.h
new file mode 100644 (file)
index 0000000..09b5b36
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * @file lv_example_fragment.h
+ */
+#ifndef LV_EXAMPLE_FRAGMENT_H
+#define LV_EXAMPLE_FRAGMENT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void lv_example_fragment_1(void);
+
+void lv_example_fragment_2(void);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_EXAMPLE_fragment_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/fragment/lv_example_fragment_1.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/fragment/lv_example_fragment_1.c
new file mode 100644 (file)
index 0000000..9e59124
--- /dev/null
@@ -0,0 +1,60 @@
+/**
+ * @file lv_example_fragment_1.c
+ * @brief Basic usage of obj fragment
+ */
+#include "../../lv_examples.h"
+
+#if LV_USE_FRAGMENT && LV_BUILD_EXAMPLES
+
+static void sample_fragment_ctor(lv_fragment_t * self, void * args);
+
+static lv_obj_t * sample_fragment_create_obj(lv_fragment_t * self, lv_obj_t * parent);
+
+static void sample_container_del(lv_event_t * e);
+
+static lv_obj_t * root = NULL;
+
+struct sample_fragment_t {
+    lv_fragment_t base;
+    const char * name;
+};
+
+static const lv_fragment_class_t sample_cls = {
+    .constructor_cb = sample_fragment_ctor,
+    .create_obj_cb = sample_fragment_create_obj,
+    .instance_size = sizeof(struct sample_fragment_t)
+};
+
+void lv_example_fragment_1(void)
+{
+    root = lv_obj_create(lv_scr_act());
+    lv_obj_set_size(root, LV_PCT(100), LV_PCT(100));
+    lv_fragment_manager_t * manager = lv_fragment_manager_create(NULL);
+    /* Clean up the fragment manager before objects in containers got deleted */
+    lv_obj_add_event_cb(root, sample_container_del, LV_EVENT_DELETE, manager);
+
+    lv_fragment_t * fragment = lv_fragment_create(&sample_cls, "Fragment");
+    lv_fragment_manager_replace(manager, fragment, &root);
+}
+
+
+static void sample_fragment_ctor(lv_fragment_t * self, void * args)
+{
+    ((struct sample_fragment_t *) self)->name = args;
+}
+
+static lv_obj_t * sample_fragment_create_obj(lv_fragment_t * self, lv_obj_t * parent)
+{
+    lv_obj_t * label = lv_label_create(parent);
+    lv_obj_set_style_bg_opa(label, LV_OPA_COVER, 0);;
+    lv_label_set_text_fmt(label, "Hello, %s!", ((struct sample_fragment_t *) self)->name);
+    return label;
+}
+
+static void sample_container_del(lv_event_t * e)
+{
+    lv_fragment_manager_t * manager = (lv_fragment_manager_t *) lv_event_get_user_data(e);
+    lv_fragment_manager_del(manager);
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/fragment/lv_example_fragment_2.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/fragment/lv_example_fragment_2.c
new file mode 100644 (file)
index 0000000..c6a3e44
--- /dev/null
@@ -0,0 +1,127 @@
+/**
+ * @file lv_example_fragment_2.c
+ * @brief Navigation stack using obj fragment
+ */
+#include "../../lv_examples.h"
+
+#if LV_USE_FRAGMENT && LV_USE_WIN && LV_BUILD_EXAMPLES
+
+static void sample_fragment_ctor(lv_fragment_t * self, void * args);
+
+static lv_obj_t * sample_fragment_create_obj(lv_fragment_t * self, lv_obj_t * parent);
+
+static void sample_push_click(lv_event_t * e);
+
+static void sample_pop_click(lv_event_t * e);
+
+static void sample_container_del(lv_event_t * e);
+
+static void sample_fragment_inc_click(lv_event_t * e);
+
+typedef struct sample_fragment_t {
+    lv_fragment_t base;
+    lv_obj_t * label;
+    int depth;
+    int counter;
+} sample_fragment_t;
+
+static const lv_fragment_class_t sample_cls = {
+    .constructor_cb = sample_fragment_ctor,
+    .create_obj_cb = sample_fragment_create_obj,
+    .instance_size = sizeof(sample_fragment_t)
+};
+
+static lv_obj_t * container = NULL;
+
+void lv_example_fragment_2(void)
+{
+    lv_obj_t * root = lv_obj_create(lv_scr_act());
+    lv_obj_set_size(root, LV_PCT(100), LV_PCT(100));
+    lv_obj_set_layout(root, LV_LAYOUT_GRID);
+    static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
+    static const lv_coord_t row_dsc[] = {LV_GRID_FR(1), LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
+    lv_obj_set_grid_dsc_array(root, col_dsc, row_dsc);
+    container = lv_obj_create(root);
+    lv_obj_remove_style_all(container);
+    lv_obj_set_grid_cell(container, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_STRETCH, 0, 1);
+
+    lv_obj_t * push_btn = lv_btn_create(root);
+    lv_obj_t * push_label = lv_label_create(push_btn);
+    lv_label_set_text(push_label, "Push");
+
+    lv_obj_t * pop_btn = lv_btn_create(root);
+    lv_obj_t * pop_label = lv_label_create(pop_btn);
+    lv_label_set_text(pop_label, "Pop");
+    lv_obj_set_grid_cell(push_btn, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_CENTER, 1, 1);
+    lv_obj_set_grid_cell(pop_btn, LV_GRID_ALIGN_END, 1, 1, LV_GRID_ALIGN_CENTER, 1, 1);
+
+    lv_fragment_manager_t * manager = lv_fragment_manager_create(NULL);
+    /* Clean up the fragment manager before objects in containers got deleted */
+    lv_obj_add_event_cb(root, sample_container_del, LV_EVENT_DELETE, manager);
+
+    int depth = 0;
+    lv_fragment_t * fragment = lv_fragment_create(&sample_cls, &depth);
+    lv_fragment_manager_push(manager, fragment, &container);
+    lv_obj_add_event_cb(push_btn, sample_push_click, LV_EVENT_CLICKED, manager);
+    lv_obj_add_event_cb(pop_btn, sample_pop_click, LV_EVENT_CLICKED, manager);
+}
+
+
+static void sample_fragment_ctor(lv_fragment_t * self, void * args)
+{
+    LV_UNUSED(args);
+    ((sample_fragment_t *) self)->depth = *((int *) args);
+    ((sample_fragment_t *) self)->counter = 0;
+}
+
+static lv_obj_t * sample_fragment_create_obj(lv_fragment_t * self, lv_obj_t * parent)
+{
+    sample_fragment_t * fragment = (sample_fragment_t *) self;
+    lv_obj_t * content = lv_obj_create(parent);
+    lv_obj_remove_style_all(content);
+    lv_obj_set_style_bg_opa(content, LV_OPA_50, 0);
+    lv_obj_set_style_bg_color(content, lv_palette_main(LV_PALETTE_YELLOW), 0);
+    lv_obj_set_size(content, LV_PCT(100), LV_PCT(100));
+    lv_obj_set_flex_flow(content, LV_FLEX_FLOW_COLUMN);
+    lv_obj_t * depth = lv_label_create(content);
+    lv_label_set_text_fmt(depth, "Depth: %d", fragment->depth);
+    lv_obj_t * label = lv_label_create(content);
+    fragment->label = label;
+    lv_label_set_text_fmt(label, "The button has been pressed %d times", fragment->counter);
+
+    lv_obj_t * inc_btn = lv_btn_create(content);
+    lv_obj_t * inc_label = lv_label_create(inc_btn);
+    lv_label_set_text(inc_label, "+1");
+    lv_obj_add_event_cb(inc_btn, sample_fragment_inc_click, LV_EVENT_CLICKED, fragment);
+
+    return content;
+}
+
+static void sample_push_click(lv_event_t * e)
+{
+    lv_fragment_manager_t * manager = (lv_fragment_manager_t *) lv_event_get_user_data(e);
+    size_t stack_size = lv_fragment_manager_get_stack_size(manager);
+    lv_fragment_t * fragment = lv_fragment_create(&sample_cls, &stack_size);
+    lv_fragment_manager_push(manager, fragment, &container);
+}
+
+static void sample_pop_click(lv_event_t * e)
+{
+    lv_fragment_manager_t * manager = (lv_fragment_manager_t *) lv_event_get_user_data(e);
+    lv_fragment_manager_pop(manager);
+}
+
+static void sample_container_del(lv_event_t * e)
+{
+    lv_fragment_manager_t * manager = (lv_fragment_manager_t *) lv_event_get_user_data(e);
+    lv_fragment_manager_del(manager);
+}
+
+static void sample_fragment_inc_click(lv_event_t * e)
+{
+    sample_fragment_t * fragment = (sample_fragment_t *) lv_event_get_user_data(e);
+    fragment->counter++;
+    lv_label_set_text_fmt(fragment->label, "The button has been pressed %d times", fragment->counter);
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/ime/index.rst b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/ime/index.rst
new file mode 100644 (file)
index 0000000..e7cc1fb
--- /dev/null
@@ -0,0 +1,12 @@
+
+Pinyin IME 26 key input
+"""""""""""""""""""""""""
+
+.. lv_example:: others/ime/lv_example_ime_pinyin_1
+  :language: c
+
+Pinyin IME 9 key input
+"""""""""""""""""""""""""
+
+.. lv_example:: others/ime/lv_example_ime_pinyin_2
+  :language: c
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/ime/lv_example_ime_pinyin.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/ime/lv_example_ime_pinyin.h
new file mode 100644 (file)
index 0000000..96991e3
--- /dev/null
@@ -0,0 +1,39 @@
+/**
+ * @file lv_example_ime_pinyin.h
+ *
+ */
+
+#ifndef LV_EX_IME_PINYIN_H
+#define LV_EX_IME_PINYIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void lv_example_ime_pinyin_1(void);
+void lv_example_ime_pinyin_2(void);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_EX_IME_PINYIN_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/ime/lv_example_ime_pinyin_1.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/ime/lv_example_ime_pinyin_1.c
new file mode 100644 (file)
index 0000000..b609ee6
--- /dev/null
@@ -0,0 +1,56 @@
+#include "../../lv_examples.h"
+#if LV_USE_LABEL && LV_USE_TEXTAREA && LV_FONT_SIMSUN_16_CJK && LV_USE_IME_PINYIN && LV_BUILD_EXAMPLES
+
+static void ta_event_cb(lv_event_t * e)
+{
+    lv_event_code_t code = lv_event_get_code(e);
+    lv_obj_t * ta = lv_event_get_target(e);
+    lv_obj_t * kb = lv_event_get_user_data(e);
+
+    if(code == LV_EVENT_FOCUSED) {
+        if(lv_indev_get_type(lv_indev_get_act()) != LV_INDEV_TYPE_KEYPAD) {
+            lv_keyboard_set_textarea(kb, ta);
+            lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN);
+        }
+    }
+    else if(code == LV_EVENT_CANCEL) {
+        lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
+        lv_obj_clear_state(ta, LV_STATE_FOCUSED);
+        lv_indev_reset(NULL, ta);   /*To forget the last clicked object to make it focusable again*/
+    }
+}
+
+void lv_example_ime_pinyin_1(void)
+{
+    lv_obj_t * pinyin_ime = lv_ime_pinyin_create(lv_scr_act());
+    lv_obj_set_style_text_font(pinyin_ime, &lv_font_simsun_16_cjk, 0);
+    //lv_ime_pinyin_set_dict(pinyin_ime, your_dict); // Use a custom dictionary. If it is not set, the built-in dictionary will be used.
+
+    /* ta1 */
+    lv_obj_t * ta1 = lv_textarea_create(lv_scr_act());
+    lv_textarea_set_one_line(ta1, true);
+    lv_obj_set_style_text_font(ta1, &lv_font_simsun_16_cjk, 0);
+    lv_obj_align(ta1, LV_ALIGN_TOP_LEFT, 0, 0);
+
+    /*Create a keyboard and add it to ime_pinyin*/
+    lv_obj_t * kb = lv_keyboard_create(lv_scr_act());
+    lv_ime_pinyin_set_keyboard(pinyin_ime, kb);
+    lv_keyboard_set_textarea(kb, ta1);
+
+    lv_obj_add_event_cb(ta1, ta_event_cb, LV_EVENT_ALL, kb);
+
+    /*Get the cand_panel, and adjust its size and position*/
+    lv_obj_t * cand_panel = lv_ime_pinyin_get_cand_panel(pinyin_ime);
+    lv_obj_set_size(cand_panel, LV_PCT(100), LV_PCT(10));
+    lv_obj_align_to(cand_panel, kb, LV_ALIGN_OUT_TOP_MID, 0, 0);
+
+    /*Try using ime_pinyin to output the Chinese below in the ta1 above*/
+    lv_obj_t * cz_label = lv_label_create(lv_scr_act());
+    lv_label_set_text(cz_label,
+                      "嵌入式系统(Embedded System),\n是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。");
+    lv_obj_set_style_text_font(cz_label, &lv_font_simsun_16_cjk, 0);
+    lv_obj_set_width(cz_label, 310);
+    lv_obj_align_to(cz_label, ta1, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0);
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/ime/lv_example_ime_pinyin_2.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/ime/lv_example_ime_pinyin_2.c
new file mode 100644 (file)
index 0000000..af5a058
--- /dev/null
@@ -0,0 +1,58 @@
+#include "../../lv_examples.h"
+#if LV_USE_LABEL && LV_USE_TEXTAREA && LV_FONT_SIMSUN_16_CJK && LV_USE_IME_PINYIN && LV_IME_PINYIN_USE_K9_MODE && LV_BUILD_EXAMPLES
+
+static void ta_event_cb(lv_event_t * e)
+{
+    lv_event_code_t code = lv_event_get_code(e);
+    lv_obj_t * ta = lv_event_get_target(e);
+    lv_obj_t * kb = lv_event_get_user_data(e);
+
+    if(code == LV_EVENT_FOCUSED) {
+        if(lv_indev_get_type(lv_indev_get_act()) != LV_INDEV_TYPE_KEYPAD) {
+            lv_keyboard_set_textarea(kb, ta);
+            lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN);
+        }
+    }
+    else if(code == LV_EVENT_READY) {
+        lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
+        lv_obj_clear_state(ta, LV_STATE_FOCUSED);
+        lv_indev_reset(NULL, ta);   /*To forget the last clicked object to make it focusable again*/
+    }
+}
+
+void lv_example_ime_pinyin_2(void)
+{
+    lv_obj_t * pinyin_ime = lv_ime_pinyin_create(lv_scr_act());
+    lv_obj_set_style_text_font(pinyin_ime, &lv_font_simsun_16_cjk, 0);
+    //lv_ime_pinyin_set_dict(pinyin_ime, your_dict); // Use a custom dictionary. If it is not set, the built-in dictionary will be used.
+
+    /* ta1 */
+    lv_obj_t * ta1 = lv_textarea_create(lv_scr_act());
+    lv_textarea_set_one_line(ta1, true);
+    lv_obj_set_style_text_font(ta1, &lv_font_simsun_16_cjk, 0);
+    lv_obj_align(ta1, LV_ALIGN_TOP_LEFT, 0, 0);
+
+    /*Create a keyboard and add it to ime_pinyin*/
+    lv_obj_t * kb = lv_keyboard_create(lv_scr_act());
+    lv_keyboard_set_textarea(kb, ta1);
+
+    lv_ime_pinyin_set_keyboard(pinyin_ime, kb);
+    lv_ime_pinyin_set_mode(pinyin_ime,
+                           LV_IME_PINYIN_MODE_K9);  // Set to 9-key input mode. Default: 26-key input(k26) mode.
+    lv_obj_add_event_cb(ta1, ta_event_cb, LV_EVENT_ALL, kb);
+
+    /*Get the cand_panel, and adjust its size and position*/
+    lv_obj_t * cand_panel = lv_ime_pinyin_get_cand_panel(pinyin_ime);
+    lv_obj_set_size(cand_panel, LV_PCT(100), LV_PCT(10));
+    lv_obj_align_to(cand_panel, kb, LV_ALIGN_OUT_TOP_MID, 0, 0);
+
+    /*Try using ime_pinyin to output the Chinese below in the ta1 above*/
+    lv_obj_t * cz_label = lv_label_create(lv_scr_act());
+    lv_label_set_text(cz_label,
+                      "嵌入式系统(Embedded System),\n是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。");
+    lv_obj_set_style_text_font(cz_label, &lv_font_simsun_16_cjk, 0);
+    lv_obj_set_width(cz_label, 310);
+    lv_obj_align_to(cz_label, ta1, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0);
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/imgfont/index.rst b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/imgfont/index.rst
new file mode 100644 (file)
index 0000000..101f9e2
--- /dev/null
@@ -0,0 +1,6 @@
+Use emojis in a text.
+"""""""""""""""""""""""""""""""""""""""""""""""
+
+.. lv_example:: others/imgfont/lv_example_imgfont_1
+  :language: c
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/imgfont/lv_example_imgfont.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/imgfont/lv_example_imgfont.h
new file mode 100644 (file)
index 0000000..460a976
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * @file lv_example_imgfont.h
+ *
+ */
+
+#ifndef LV_EXAMPLE_IMGFONT_H
+#define LV_EXAMPLE_IMGFONT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void lv_example_imgfont_1(void);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_EXAMPLE_IMGFONT_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/imgfont/lv_example_imgfont_1.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/imgfont/lv_example_imgfont_1.c
new file mode 100644 (file)
index 0000000..e983932
--- /dev/null
@@ -0,0 +1,54 @@
+#include "../../lv_examples.h"
+#include <stdio.h>
+
+#if LV_BUILD_EXAMPLES
+#if LV_USE_IMGFONT
+
+LV_IMG_DECLARE(emoji_F617)
+static bool get_imgfont_path(const lv_font_t * font, void * img_src,
+                             uint16_t len, uint32_t unicode, uint32_t unicode_next)
+{
+    LV_UNUSED(font);
+    LV_UNUSED(unicode_next);
+    LV_ASSERT_NULL(img_src);
+
+    if(unicode == 0xF617) {
+        memcpy(img_src, &emoji_F617, sizeof(lv_img_dsc_t));
+    }
+    else {
+        char * path = (char *)img_src;
+        snprintf(path, len, "%s/%04X.%s", "A:lvgl/examples/assets/emoji", unicode, "png");
+        path[len - 1] = '\0';
+    }
+
+    return true;
+}
+
+/**
+ * draw img in label or span obj
+ */
+void lv_example_imgfont_1(void)
+{
+    lv_font_t * imgfont = lv_imgfont_create(80, get_imgfont_path);
+    if(imgfont == NULL) {
+        LV_LOG_ERROR("imgfont init error");
+    }
+
+    imgfont->fallback = LV_FONT_DEFAULT;
+
+    lv_obj_t * label1 = lv_label_create(lv_scr_act());
+    lv_label_set_text(label1, "12\uF600\uF617AB");
+    lv_obj_set_style_text_font(label1, imgfont, LV_PART_MAIN);
+    lv_obj_center(label1);
+}
+#else
+
+void lv_example_imgfont_1(void)
+{
+    lv_obj_t * label = lv_label_create(lv_scr_act());
+    lv_label_set_text(label, "imgfont is not installed");
+    lv_obj_center(label);
+}
+
+#endif
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/msg/index.rst b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/msg/index.rst
new file mode 100644 (file)
index 0000000..93d04dc
--- /dev/null
@@ -0,0 +1,20 @@
+
+Slider to label messaging
+"""""""""""""""""""""""""
+
+.. lv_example:: others/msg/lv_example_msg_1
+  :language: c
+
+Handling login and its states
+"""""""""""""""""""""""""""""
+
+.. lv_example:: others/msg/lv_example_msg_2
+  :language: c
+
+Setting the same value from many sources
+""""""""""""""""""""""""""""""""""""""""
+
+.. lv_example:: others/msg/lv_example_msg_3
+  :language: c
+
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/msg/lv_example_msg.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/msg/lv_example_msg.h
new file mode 100644 (file)
index 0000000..e7accc8
--- /dev/null
@@ -0,0 +1,40 @@
+/**
+ * @file lv_example_msg.h
+ *
+ */
+
+#ifndef LV_EXAMPLE_MSG_H
+#define LV_EXAMPLE_MSG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void lv_example_msg_1(void);
+void lv_example_msg_2(void);
+void lv_example_msg_3(void);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_EXAMPLE_MSG_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/msg/lv_example_msg_1.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/msg/lv_example_msg_1.c
new file mode 100644 (file)
index 0000000..d2cb8a3
--- /dev/null
@@ -0,0 +1,49 @@
+#include "../../lv_examples.h"
+#if LV_USE_MSG && LV_USE_SLIDER && LV_USE_LABEL && LV_BUILD_EXAMPLES
+
+/*Define a message ID*/
+#define MSG_NEW_TEMPERATURE     1
+
+static void slider_event_cb(lv_event_t * e);
+static void label_event_cb(lv_event_t * e);
+
+/**
+ * A slider sends a message on value change and a label display's that value
+ */
+void lv_example_msg_1(void)
+{
+    /*Create a slider in the center of the display*/
+    lv_obj_t * slider = lv_slider_create(lv_scr_act());
+    lv_obj_center(slider);
+    lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
+
+    /*Create a label below the slider*/
+    lv_obj_t * label = lv_label_create(lv_scr_act());
+    lv_obj_add_event_cb(label, label_event_cb, LV_EVENT_MSG_RECEIVED, NULL);
+    lv_label_set_text(label, "0%");
+    lv_obj_align(label, LV_ALIGN_CENTER, 0, 30);
+
+    /*Subscribe the label to a message. Also use the user_data to set a format string here.*/
+    lv_msg_subsribe_obj(MSG_NEW_TEMPERATURE, label, "%d °C");
+}
+
+static void slider_event_cb(lv_event_t * e)
+{
+    /*Notify all subscribers (only the label now) that the slider value has been changed*/
+    lv_obj_t * slider = lv_event_get_target(e);
+    int32_t v = lv_slider_get_value(slider);
+    lv_msg_send(MSG_NEW_TEMPERATURE, &v);
+}
+
+static void label_event_cb(lv_event_t * e)
+{
+    lv_obj_t * label = lv_event_get_target(e);
+    lv_msg_t * m = lv_event_get_msg(e);
+
+    const char * fmt = lv_msg_get_user_data(m);
+    const int32_t * v = lv_msg_get_payload(m);
+
+    lv_label_set_text_fmt(label, fmt, *v);
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/msg/lv_example_msg_2.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/msg/lv_example_msg_2.c
new file mode 100644 (file)
index 0000000..f9cf585
--- /dev/null
@@ -0,0 +1,171 @@
+#include "../../lv_examples.h"
+#if LV_USE_MSG && LV_USE_SLIDER && LV_USE_LABEL && LV_BUILD_EXAMPLES
+
+/*Define a message ID*/
+#define MSG_LOGIN_ATTEMPT   1
+#define MSG_LOG_OUT         2
+#define MSG_LOGIN_ERROR     3
+#define MSG_LOGIN_OK        4
+
+static void auth_manager(void * s, lv_msg_t * m);
+static void textarea_event_cb(lv_event_t * e);
+static void log_out_event_cb(lv_event_t * e);
+static void start_engine_msg_event_cb(lv_event_t * e);
+static void info_label_msg_event_cb(lv_event_t * e);
+
+/**
+ * Simple PIN login screen.
+ * No global variables are used, all state changes are communicated via messages.
+ */
+void lv_example_msg_2(void)
+{
+    lv_msg_subsribe(MSG_LOGIN_ATTEMPT, auth_manager, "hello");
+
+    /*Create a slider in the center of the display*/
+    lv_obj_t * ta = lv_textarea_create(lv_scr_act());
+    lv_obj_set_pos(ta, 10, 10);
+    lv_obj_set_width(ta, 200);
+    lv_textarea_set_one_line(ta, true);
+    lv_textarea_set_password_mode(ta, true);
+    lv_textarea_set_placeholder_text(ta, "The password is: hello");
+    lv_obj_add_event_cb(ta, textarea_event_cb, LV_EVENT_ALL, NULL);
+    lv_msg_subsribe_obj(MSG_LOGIN_ERROR, ta, NULL);
+    lv_msg_subsribe_obj(MSG_LOGIN_OK, ta, NULL);
+    lv_msg_subsribe_obj(MSG_LOG_OUT, ta, NULL);
+
+    lv_obj_t * kb = lv_keyboard_create(lv_scr_act());
+    lv_keyboard_set_textarea(kb, ta);
+
+    lv_obj_t * btn;
+    lv_obj_t * label;
+
+    /*Create a log out button which will be active only when logged in*/
+    btn = lv_btn_create(lv_scr_act());
+    lv_obj_set_pos(btn, 240, 10);
+    lv_obj_add_event_cb(btn, log_out_event_cb, LV_EVENT_ALL, NULL);
+    lv_msg_subsribe_obj(MSG_LOGIN_OK, btn, NULL);
+    lv_msg_subsribe_obj(MSG_LOG_OUT, btn, NULL);
+
+    label = lv_label_create(btn);
+    lv_label_set_text(label, "LOG OUT");
+
+    /*Create a label to show info*/
+    label = lv_label_create(lv_scr_act());
+    lv_label_set_text(label, "");
+    lv_obj_add_event_cb(label, info_label_msg_event_cb, LV_EVENT_MSG_RECEIVED, NULL);
+    lv_obj_set_pos(label, 10, 60);
+    lv_msg_subsribe_obj(MSG_LOGIN_ERROR, label, NULL);
+    lv_msg_subsribe_obj(MSG_LOGIN_OK, label, NULL);
+    lv_msg_subsribe_obj(MSG_LOG_OUT, label, NULL);
+
+    /*Create button which will be active only when logged in*/
+    btn = lv_btn_create(lv_scr_act());
+    lv_obj_set_pos(btn, 10, 80);
+    lv_obj_add_event_cb(btn, start_engine_msg_event_cb, LV_EVENT_MSG_RECEIVED, NULL);
+    lv_obj_add_flag(btn, LV_OBJ_FLAG_CHECKABLE);
+    lv_msg_subsribe_obj(MSG_LOGIN_OK, btn, NULL);
+    lv_msg_subsribe_obj(MSG_LOG_OUT, btn, NULL);
+
+    label = lv_label_create(btn);
+    lv_label_set_text(label, "START ENGINE");
+
+    lv_msg_send(MSG_LOG_OUT, NULL);
+}
+
+static void auth_manager(void * s, lv_msg_t * m)
+{
+    LV_UNUSED(s);
+    const char * pin_act = lv_msg_get_payload(m);
+    const char * pin_expexted = lv_msg_get_user_data(m);
+    if(strcmp(pin_act, pin_expexted) == 0) {
+        lv_msg_send(MSG_LOGIN_OK, NULL);
+    }
+    else {
+        lv_msg_send(MSG_LOGIN_ERROR, "Incorrect PIN");
+    }
+
+}
+
+static void textarea_event_cb(lv_event_t * e)
+{
+    lv_obj_t * ta = lv_event_get_target(e);
+    lv_event_code_t code = lv_event_get_code(e);
+    if(code == LV_EVENT_READY) {
+        lv_msg_send(MSG_LOGIN_ATTEMPT, lv_textarea_get_text(ta));
+    }
+    else if(code == LV_EVENT_MSG_RECEIVED) {
+        lv_msg_t * m = lv_event_get_msg(e);
+        switch(lv_msg_get_id(m)) {
+            case MSG_LOGIN_ERROR:
+                /*If there was an error, clean the text area*/
+                if(strlen(lv_msg_get_payload(m))) lv_textarea_set_text(ta, "");
+                break;
+            case MSG_LOGIN_OK:
+                lv_obj_add_state(ta, LV_STATE_DISABLED);
+                lv_obj_clear_state(ta, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY);
+                break;
+            case MSG_LOG_OUT:
+                lv_textarea_set_text(ta, "");
+                lv_obj_clear_state(ta, LV_STATE_DISABLED);
+                break;
+        }
+    }
+}
+
+static void log_out_event_cb(lv_event_t * e)
+{
+    lv_event_code_t code = lv_event_get_code(e);
+    if(code == LV_EVENT_CLICKED) {
+        lv_msg_send(MSG_LOG_OUT, NULL);
+    }
+    else if(code == LV_EVENT_MSG_RECEIVED) {
+        lv_msg_t * m = lv_event_get_msg(e);
+        lv_obj_t * btn = lv_event_get_target(e);
+        switch(lv_msg_get_id(m)) {
+            case MSG_LOGIN_OK:
+                lv_obj_clear_state(btn, LV_STATE_DISABLED);
+                break;
+            case MSG_LOG_OUT:
+                lv_obj_add_state(btn, LV_STATE_DISABLED);
+                break;
+        }
+    }
+}
+
+static void start_engine_msg_event_cb(lv_event_t * e)
+{
+    lv_msg_t * m = lv_event_get_msg(e);
+    lv_obj_t * btn = lv_event_get_target(e);
+    switch(lv_msg_get_id(m)) {
+        case MSG_LOGIN_OK:
+            lv_obj_clear_state(btn, LV_STATE_DISABLED);
+            break;
+        case MSG_LOG_OUT:
+            lv_obj_add_state(btn, LV_STATE_DISABLED);
+            break;
+    }
+}
+
+static void info_label_msg_event_cb(lv_event_t * e)
+{
+    lv_obj_t * label = lv_event_get_target(e);
+    lv_msg_t * m = lv_event_get_msg(e);
+    switch(lv_msg_get_id(m)) {
+        case MSG_LOGIN_ERROR:
+            lv_label_set_text(label, lv_msg_get_payload(m));
+            lv_obj_set_style_text_color(label, lv_palette_main(LV_PALETTE_RED), 0);
+            break;
+        case MSG_LOGIN_OK:
+            lv_label_set_text(label, "Login successful");
+            lv_obj_set_style_text_color(label, lv_palette_main(LV_PALETTE_GREEN), 0);
+            break;
+        case MSG_LOG_OUT:
+            lv_label_set_text(label, "Logged out");
+            lv_obj_set_style_text_color(label, lv_palette_main(LV_PALETTE_GREY), 0);
+            break;
+        default:
+            break;
+    }
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/msg/lv_example_msg_3.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/others/msg/lv_example_msg_3.c
new file mode 100644 (file)
index 0000000..dddb4a8
--- /dev/null
@@ -0,0 +1,154 @@
+#include "../../lv_examples.h"
+#if LV_USE_MSG && LV_USE_SLIDER && LV_USE_LABEL && LV_BUILD_EXAMPLES
+
+/*Define a message ID*/
+#define MSG_INC             1
+#define MSG_DEC             2
+#define MSG_SET             3
+#define MSG_UPDATE          4
+#define MSG_UPDATE_REQUEST  5
+
+static void value_handler(void * s, lv_msg_t * m);
+static void value_handler(void * s, lv_msg_t * m);
+static void btn_event_cb(lv_event_t * e);
+static void label_event_cb(lv_event_t * e);
+static void slider_event_cb(lv_event_t * e);
+
+/**
+ * Show how an increment button, a decrement button, as slider can set a value
+ * and a label display it.
+ * The current value (i.e. the system's state) is stored only in one static variable in a function
+ * and no global variables are required.
+ */
+void lv_example_msg_3(void)
+{
+
+    lv_msg_subsribe(MSG_INC, value_handler, NULL);
+    lv_msg_subsribe(MSG_DEC, value_handler, NULL);
+    lv_msg_subsribe(MSG_SET, value_handler, NULL);
+    lv_msg_subsribe(MSG_UPDATE, value_handler, NULL);
+    lv_msg_subsribe(MSG_UPDATE_REQUEST, value_handler, NULL);
+
+    lv_obj_t * panel = lv_obj_create(lv_scr_act());
+    lv_obj_set_size(panel, 250, LV_SIZE_CONTENT);
+    lv_obj_center(panel);
+    lv_obj_set_flex_flow(panel, LV_FLEX_FLOW_ROW);
+    lv_obj_set_flex_align(panel, LV_FLEX_ALIGN_SPACE_BETWEEN, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START);
+
+    lv_obj_t * btn;
+    lv_obj_t * label;
+
+    /*Up button*/
+    btn = lv_btn_create(panel);
+    lv_obj_set_flex_grow(btn, 1);
+    lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_ALL, NULL);
+    label = lv_label_create(btn);
+    lv_label_set_text(label, LV_SYMBOL_LEFT);
+    lv_obj_center(label);
+
+    /*Current value*/
+    label = lv_label_create(panel);
+    lv_obj_set_flex_grow(label, 2);
+    lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, 0);
+    lv_label_set_text(label, "?");
+    lv_msg_subsribe_obj(MSG_UPDATE, label, NULL);
+    lv_obj_add_event_cb(label, label_event_cb, LV_EVENT_MSG_RECEIVED, NULL);
+
+    /*Down button*/
+    btn = lv_btn_create(panel);
+    lv_obj_set_flex_grow(btn, 1);
+    lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_ALL, NULL);
+    label = lv_label_create(btn);
+    lv_label_set_text(label, LV_SYMBOL_RIGHT);
+    lv_obj_center(label);
+
+    /*Slider*/
+    lv_obj_t * slider = lv_slider_create(panel);
+    lv_obj_set_flex_grow(slider, 1);
+    lv_obj_add_flag(slider, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
+    lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_ALL, NULL);
+    lv_msg_subsribe_obj(MSG_UPDATE, slider, NULL);
+
+
+    /* As there are new UI elements that don't know the system's state
+     * send an UPDATE REQUEST message which will trigger an UPDATE message with the current value*/
+    lv_msg_send(MSG_UPDATE_REQUEST, NULL);
+}
+
+
+static void value_handler(void * s, lv_msg_t * m)
+{
+    LV_UNUSED(s);
+
+    static int32_t value = 10;
+    int32_t old_value = value;
+    switch(lv_msg_get_id(m)) {
+        case MSG_INC:
+            if(value < 100) value++;
+            break;
+        case MSG_DEC:
+            if(value > 0) value--;
+            break;
+        case MSG_SET: {
+                const int32_t * new_value = lv_msg_get_payload(m);
+                value = *new_value;
+            }
+            break;
+        case MSG_UPDATE_REQUEST:
+            lv_msg_send(MSG_UPDATE, &value);
+            break;
+        default:
+            break;
+    }
+
+    if(value != old_value) {
+        lv_msg_send(MSG_UPDATE, &value);
+    }
+}
+
+
+static void btn_event_cb(lv_event_t * e)
+{
+    lv_obj_t * btn = lv_event_get_target(e);
+    lv_event_code_t code = lv_event_get_code(e);
+    if(code == LV_EVENT_CLICKED || code == LV_EVENT_LONG_PRESSED_REPEAT) {
+        if(lv_obj_get_index(btn) == 0) {    /*First object is the dec. button*/
+            lv_msg_send(MSG_DEC, NULL);
+        }
+        else {
+            lv_msg_send(MSG_INC, NULL);
+        }
+    }
+}
+
+static void label_event_cb(lv_event_t * e)
+{
+    lv_obj_t * label = lv_event_get_target(e);
+    lv_event_code_t code = lv_event_get_code(e);
+    if(code == LV_EVENT_MSG_RECEIVED) {
+        lv_msg_t * m = lv_event_get_msg(e);
+        if(lv_msg_get_id(m) == MSG_UPDATE) {
+            const int32_t * v = lv_msg_get_payload(m);
+            lv_label_set_text_fmt(label, "%d %%", *v);
+        }
+    }
+}
+
+static void slider_event_cb(lv_event_t * e)
+{
+    lv_obj_t * slider = lv_event_get_target(e);
+    lv_event_code_t code = lv_event_get_code(e);
+    if(code == LV_EVENT_VALUE_CHANGED) {
+        int32_t v = lv_slider_get_value(slider);
+        lv_msg_send(MSG_SET, &v);
+    }
+    else if(code == LV_EVENT_MSG_RECEIVED) {
+        lv_msg_t * m = lv_event_get_msg(e);
+        if(lv_msg_get_id(m) == MSG_UPDATE) {
+            const int32_t * v = lv_msg_get_payload(m);
+            lv_slider_set_value(slider, *v, LV_ANIM_OFF);
+        }
+    }
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/styles/lv_example_style_15.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/styles/lv_example_style_15.c
new file mode 100644 (file)
index 0000000..cab321f
--- /dev/null
@@ -0,0 +1,50 @@
+#include "../lv_examples.h"
+#if LV_BUILD_EXAMPLES && LV_USE_BTN && LV_USE_LABEL
+
+
+
+/**
+ * Opacity and Transformations
+ */
+void lv_example_style_15(void)
+{
+    lv_obj_t * btn;
+    lv_obj_t * label;
+
+    /*Normal button*/
+    btn = lv_btn_create(lv_scr_act());
+    lv_obj_set_size(btn, 100, 40);
+    lv_obj_align(btn, LV_ALIGN_CENTER, 0, -70);
+
+    label = lv_label_create(btn);
+    lv_label_set_text(label, "Normal");
+    lv_obj_center(label);
+
+    /*Set opacity
+     *The button and the label is rendered to a layer first and that layer is blended*/
+    btn = lv_btn_create(lv_scr_act());
+    lv_obj_set_size(btn, 100, 40);
+    lv_obj_set_style_opa(btn, LV_OPA_50, 0);
+    lv_obj_align(btn, LV_ALIGN_CENTER, 0, 0);
+
+    label = lv_label_create(btn);
+    lv_label_set_text(label, "Opa:50%");
+    lv_obj_center(label);
+
+    /*Set transformations
+     *The button and the label is rendered to a layer first and that layer is transformed*/
+    btn = lv_btn_create(lv_scr_act());
+    lv_obj_set_size(btn, 100, 40);
+    lv_obj_set_style_transform_angle(btn, 150, 0);        /*15 deg*/
+    lv_obj_set_style_transform_zoom(btn, 256 + 64, 0);   /*1.25x*/
+    lv_obj_set_style_transform_pivot_x(btn, 50, 0);
+    lv_obj_set_style_transform_pivot_y(btn, 20, 0);
+    lv_obj_set_style_opa(btn, LV_OPA_50, 0);
+    lv_obj_align(btn, LV_ALIGN_CENTER, 0, 70);
+
+    label = lv_label_create(btn);
+    lv_label_set_text(label, "Transf.");
+    lv_obj_center(label);
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/widgets/label/lv_example_label_5.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/widgets/label/lv_example_label_5.c
new file mode 100644 (file)
index 0000000..c190df6
--- /dev/null
@@ -0,0 +1,30 @@
+#include "../../lv_examples.h"
+#if LV_USE_LABEL && LV_BUILD_EXAMPLES
+
+/**
+ * Show customizing the circular scrolling animation of a label with `LV_LABEL_LONG_SCROLL_CIRCULAR`
+ * long mode.
+ */
+void lv_example_label_5(void)
+{
+    static lv_anim_t animation_template;
+    static lv_style_t label_style;
+
+    lv_anim_init(&animation_template);
+    lv_anim_set_delay(&animation_template, 1000);           /*Wait 1 second to start the first scroll*/
+    lv_anim_set_repeat_delay(&animation_template,
+                             3000);    /*Repeat the scroll 3 seconds after the label scrolls back to the initial position*/
+
+    /*Initialize the label style with the animation template*/
+    lv_style_init(&label_style);
+    lv_style_set_anim(&label_style, &animation_template);
+
+    lv_obj_t * label1 = lv_label_create(lv_scr_act());
+    lv_label_set_long_mode(label1, LV_LABEL_LONG_SCROLL_CIRCULAR);      /*Circular scroll*/
+    lv_obj_set_width(label1, 150);
+    lv_label_set_text(label1, "It is a circularly scrolling text. ");
+    lv_obj_align(label1, LV_ALIGN_CENTER, 0, 40);
+    lv_obj_add_style(label1, &label_style, LV_STATE_DEFAULT);           /*Add the style to the label*/
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/widgets/label/lv_example_label_5.py b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/widgets/label/lv_example_label_5.py
new file mode 100644 (file)
index 0000000..817d53e
--- /dev/null
@@ -0,0 +1,10 @@
+#
+# Show customizing the circular scrolling animation of a label with `LV_LABEL_LONG_SCROLL_CIRCULAR` long mode.
+#
+
+label1 = lv.label(lv.scr_act())
+label1.set_long_mode(lv.label.LONG.SCROLL_CIRCULAR)         # Circular scroll
+label1.set_width(150)
+label1.set_text("It is a circularly scrolling text. ")
+label1.align(lv.ALIGN.CENTER, 0, 40)
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/lv_conf_template.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/lv_conf_template.h
new file mode 100644 (file)
index 0000000..1e31047
--- /dev/null
@@ -0,0 +1,770 @@
+/**
+ * @file lv_conf.h
+ * Configuration file for v8.3.7
+ */
+
+/*
+ * Copy this file as `lv_conf.h`
+ * 1. simply next to the `lvgl` folder
+ * 2. or any other places and
+ *    - define `LV_CONF_INCLUDE_SIMPLE`
+ *    - add the path as include path
+ */
+
+/* clang-format off */
+#if 0 /*Set it to "1" to enable content*/
+
+#ifndef LV_CONF_H
+#define LV_CONF_H
+
+#include <stdint.h>
+
+/*====================
+   COLOR SETTINGS
+ *====================*/
+
+/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/
+#define LV_COLOR_DEPTH 16
+
+/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/
+#define LV_COLOR_16_SWAP 0
+
+/*Enable features to draw on transparent background.
+ *It's required if opa, and transform_* style properties are used.
+ *Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/
+#define LV_COLOR_SCREEN_TRANSP 0
+
+/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently.
+ * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */
+#define LV_COLOR_MIX_ROUND_OFS 0
+
+/*Images pixels with this color will not be drawn if they are chroma keyed)*/
+#define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00)         /*pure green*/
+
+/*=========================
+   MEMORY SETTINGS
+ *=========================*/
+
+/*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/
+#define LV_MEM_CUSTOM 0
+#if LV_MEM_CUSTOM == 0
+    /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
+    #define LV_MEM_SIZE (48U * 1024U)          /*[bytes]*/
+
+    /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/
+    #define LV_MEM_ADR 0     /*0: unused*/
+    /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/
+    #if LV_MEM_ADR == 0
+        #undef LV_MEM_POOL_INCLUDE
+        #undef LV_MEM_POOL_ALLOC
+    #endif
+
+#else       /*LV_MEM_CUSTOM*/
+    #define LV_MEM_CUSTOM_INCLUDE <stdlib.h>   /*Header for the dynamic memory function*/
+    #define LV_MEM_CUSTOM_ALLOC   malloc
+    #define LV_MEM_CUSTOM_FREE    free
+    #define LV_MEM_CUSTOM_REALLOC realloc
+#endif     /*LV_MEM_CUSTOM*/
+
+/*Number of the intermediate memory buffer used during rendering and other internal processing mechanisms.
+ *You will see an error log message if there wasn't enough buffers. */
+#define LV_MEM_BUF_MAX_NUM 16
+
+/*Use the standard `memcpy` and `memset` instead of LVGL's own functions. (Might or might not be faster).*/
+#define LV_MEMCPY_MEMSET_STD 0
+
+/*====================
+   HAL SETTINGS
+ *====================*/
+
+/*Default display refresh period. LVG will redraw changed areas with this period time*/
+#define LV_DISP_DEF_REFR_PERIOD 30      /*[ms]*/
+
+/*Input device read period in milliseconds*/
+#define LV_INDEV_DEF_READ_PERIOD 30     /*[ms]*/
+
+/*Use a custom tick source that tells the elapsed time in milliseconds.
+ *It removes the need to manually update the tick with `lv_tick_inc()`)*/
+#define LV_TICK_CUSTOM 0
+#if LV_TICK_CUSTOM
+    #define LV_TICK_CUSTOM_INCLUDE "Arduino.h"         /*Header for the system time function*/
+    #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis())    /*Expression evaluating to current system time in ms*/
+    /*If using lvgl as ESP32 component*/
+    // #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h"
+    // #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL))
+#endif   /*LV_TICK_CUSTOM*/
+
+/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings.
+ *(Not so important, you can adjust it to modify default sizes and spaces)*/
+#define LV_DPI_DEF 130     /*[px/inch]*/
+
+/*=======================
+ * FEATURE CONFIGURATION
+ *=======================*/
+
+/*-------------
+ * Drawing
+ *-----------*/
+
+/*Enable complex draw engine.
+ *Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/
+#define LV_DRAW_COMPLEX 1
+#if LV_DRAW_COMPLEX != 0
+
+    /*Allow buffering some shadow calculation.
+    *LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius`
+    *Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/
+    #define LV_SHADOW_CACHE_SIZE 0
+
+    /* Set number of maximally cached circle data.
+    * The circumference of 1/4 circle are saved for anti-aliasing
+    * radius * 4 bytes are used per circle (the most often used radiuses are saved)
+    * 0: to disable caching */
+    #define LV_CIRCLE_CACHE_SIZE 4
+#endif /*LV_DRAW_COMPLEX*/
+
+/**
+ * "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer
+ * and blend it as an image with the given opacity.
+ * Note that `bg_opa`, `text_opa` etc don't require buffering into layer)
+ * The widget can be buffered in smaller chunks to avoid using large buffers.
+ *
+ * - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it
+ * - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes]  used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated.
+ *
+ * Both buffer sizes are in bytes.
+ * "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers
+ * and can't be drawn in chunks. So these settings affects only widgets with opacity.
+ */
+#define LV_LAYER_SIMPLE_BUF_SIZE          (24 * 1024)
+#define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024)
+
+/*Default image cache size. Image caching keeps the images opened.
+ *If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added)
+ *With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images.
+ *However the opened images might consume additional RAM.
+ *0: to disable caching*/
+#define LV_IMG_CACHE_DEF_SIZE 0
+
+/*Number of stops allowed per gradient. Increase this to allow more stops.
+ *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/
+#define LV_GRADIENT_MAX_STOPS 2
+
+/*Default gradient buffer size.
+ *When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again.
+ *LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes.
+ *If the cache is too small the map will be allocated only while it's required for the drawing.
+ *0 mean no caching.*/
+#define LV_GRAD_CACHE_DEF_SIZE 0
+
+/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display)
+ *LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface
+ *The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */
+#define LV_DITHER_GRADIENT 0
+#if LV_DITHER_GRADIENT
+    /*Add support for error diffusion dithering.
+     *Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing.
+     *The increase in memory consumption is (24 bits * object's width)*/
+    #define LV_DITHER_ERROR_DIFFUSION 0
+#endif
+
+/*Maximum buffer size to allocate for rotation.
+ *Only used if software rotation is enabled in the display driver.*/
+#define LV_DISP_ROT_MAX_BUF (10*1024)
+
+/*-------------
+ * GPU
+ *-----------*/
+
+/*Use Arm's 2D acceleration library Arm-2D */
+#define LV_USE_GPU_ARM2D 0
+
+/*Use STM32's DMA2D (aka Chrom Art) GPU*/
+#define LV_USE_GPU_STM32_DMA2D 0
+#if LV_USE_GPU_STM32_DMA2D
+    /*Must be defined to include path of CMSIS header of target processor
+    e.g. "stm32f7xx.h" or "stm32f4xx.h"*/
+    #define LV_GPU_DMA2D_CMSIS_INCLUDE
+#endif
+
+/*Enable RA6M3 G2D GPU*/
+#define LV_USE_GPU_RA6M3_G2D 0
+#if LV_USE_GPU_RA6M3_G2D
+    /*include path of target processor
+    e.g. "hal_data.h"*/
+    #define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h"
+#endif
+
+/*Use SWM341's DMA2D GPU*/
+#define LV_USE_GPU_SWM341_DMA2D 0
+#if LV_USE_GPU_SWM341_DMA2D
+    #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h"
+#endif
+
+/*Use NXP's PXP GPU iMX RTxxx platforms*/
+#define LV_USE_GPU_NXP_PXP 0
+#if LV_USE_GPU_NXP_PXP
+    /*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c)
+    *   and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS
+    *   has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected.
+    *0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init()
+    */
+    #define LV_USE_GPU_NXP_PXP_AUTO_INIT 0
+#endif
+
+/*Use NXP's VG-Lite GPU iMX RTxxx platforms*/
+#define LV_USE_GPU_NXP_VG_LITE 0
+
+/*Use SDL renderer API*/
+#define LV_USE_GPU_SDL 0
+#if LV_USE_GPU_SDL
+    #define LV_GPU_SDL_INCLUDE_PATH <SDL2/SDL.h>
+    /*Texture cache size, 8MB by default*/
+    #define LV_GPU_SDL_LRU_SIZE (1024 * 1024 * 8)
+    /*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/
+    #define LV_GPU_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6))
+#endif
+
+/*-------------
+ * Logging
+ *-----------*/
+
+/*Enable the log module*/
+#define LV_USE_LOG 0
+#if LV_USE_LOG
+
+    /*How important log should be added:
+    *LV_LOG_LEVEL_TRACE       A lot of logs to give detailed information
+    *LV_LOG_LEVEL_INFO        Log important events
+    *LV_LOG_LEVEL_WARN        Log if something unwanted happened but didn't cause a problem
+    *LV_LOG_LEVEL_ERROR       Only critical issue, when the system may fail
+    *LV_LOG_LEVEL_USER        Only logs added by the user
+    *LV_LOG_LEVEL_NONE        Do not log anything*/
+    #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN
+
+    /*1: Print the log with 'printf';
+    *0: User need to register a callback with `lv_log_register_print_cb()`*/
+    #define LV_LOG_PRINTF 0
+
+    /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/
+    #define LV_LOG_TRACE_MEM        1
+    #define LV_LOG_TRACE_TIMER      1
+    #define LV_LOG_TRACE_INDEV      1
+    #define LV_LOG_TRACE_DISP_REFR  1
+    #define LV_LOG_TRACE_EVENT      1
+    #define LV_LOG_TRACE_OBJ_CREATE 1
+    #define LV_LOG_TRACE_LAYOUT     1
+    #define LV_LOG_TRACE_ANIM       1
+
+#endif  /*LV_USE_LOG*/
+
+/*-------------
+ * Asserts
+ *-----------*/
+
+/*Enable asserts if an operation is failed or an invalid data is found.
+ *If LV_USE_LOG is enabled an error message will be printed on failure*/
+#define LV_USE_ASSERT_NULL          1   /*Check if the parameter is NULL. (Very fast, recommended)*/
+#define LV_USE_ASSERT_MALLOC        1   /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/
+#define LV_USE_ASSERT_STYLE         0   /*Check if the styles are properly initialized. (Very fast, recommended)*/
+#define LV_USE_ASSERT_MEM_INTEGRITY 0   /*Check the integrity of `lv_mem` after critical operations. (Slow)*/
+#define LV_USE_ASSERT_OBJ           0   /*Check the object's type and existence (e.g. not deleted). (Slow)*/
+
+/*Add a custom handler when assert happens e.g. to restart the MCU*/
+#define LV_ASSERT_HANDLER_INCLUDE <stdint.h>
+#define LV_ASSERT_HANDLER while(1);   /*Halt by default*/
+
+/*-------------
+ * Others
+ *-----------*/
+
+/*1: Show CPU usage and FPS count*/
+#define LV_USE_PERF_MONITOR 0
+#if LV_USE_PERF_MONITOR
+    #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT
+#endif
+
+/*1: Show the used memory and the memory fragmentation
+ * Requires LV_MEM_CUSTOM = 0*/
+#define LV_USE_MEM_MONITOR 0
+#if LV_USE_MEM_MONITOR
+    #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT
+#endif
+
+/*1: Draw random colored rectangles over the redrawn areas*/
+#define LV_USE_REFR_DEBUG 0
+
+/*Change the built in (v)snprintf functions*/
+#define LV_SPRINTF_CUSTOM 0
+#if LV_SPRINTF_CUSTOM
+    #define LV_SPRINTF_INCLUDE <stdio.h>
+    #define lv_snprintf  snprintf
+    #define lv_vsnprintf vsnprintf
+#else   /*LV_SPRINTF_CUSTOM*/
+    #define LV_SPRINTF_USE_FLOAT 0
+#endif  /*LV_SPRINTF_CUSTOM*/
+
+#define LV_USE_USER_DATA 1
+
+/*Garbage Collector settings
+ *Used if lvgl is bound to higher level language and the memory is managed by that language*/
+#define LV_ENABLE_GC 0
+#if LV_ENABLE_GC != 0
+    #define LV_GC_INCLUDE "gc.h"                           /*Include Garbage Collector related things*/
+#endif /*LV_ENABLE_GC*/
+
+/*=====================
+ *  COMPILER SETTINGS
+ *====================*/
+
+/*For big endian systems set to 1*/
+#define LV_BIG_ENDIAN_SYSTEM 0
+
+/*Define a custom attribute to `lv_tick_inc` function*/
+#define LV_ATTRIBUTE_TICK_INC
+
+/*Define a custom attribute to `lv_timer_handler` function*/
+#define LV_ATTRIBUTE_TIMER_HANDLER
+
+/*Define a custom attribute to `lv_disp_flush_ready` function*/
+#define LV_ATTRIBUTE_FLUSH_READY
+
+/*Required alignment size for buffers*/
+#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1
+
+/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default).
+ * E.g. __attribute__((aligned(4)))*/
+#define LV_ATTRIBUTE_MEM_ALIGN
+
+/*Attribute to mark large constant arrays for example font's bitmaps*/
+#define LV_ATTRIBUTE_LARGE_CONST
+
+/*Compiler prefix for a big array declaration in RAM*/
+#define LV_ATTRIBUTE_LARGE_RAM_ARRAY
+
+/*Place performance critical functions into a faster memory (e.g RAM)*/
+#define LV_ATTRIBUTE_FAST_MEM
+
+/*Prefix variables that are used in GPU accelerated operations, often these need to be placed in RAM sections that are DMA accessible*/
+#define LV_ATTRIBUTE_DMA
+
+/*Export integer constant to binding. This macro is used with constants in the form of LV_<CONST> that
+ *should also appear on LVGL binding API such as Micropython.*/
+#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/
+
+/*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/
+#define LV_USE_LARGE_COORD 0
+
+/*==================
+ *   FONT USAGE
+ *===================*/
+
+/*Montserrat fonts with ASCII range and some symbols using bpp = 4
+ *https://fonts.google.com/specimen/Montserrat*/
+#define LV_FONT_MONTSERRAT_8  0
+#define LV_FONT_MONTSERRAT_10 0
+#define LV_FONT_MONTSERRAT_12 0
+#define LV_FONT_MONTSERRAT_14 1
+#define LV_FONT_MONTSERRAT_16 0
+#define LV_FONT_MONTSERRAT_18 0
+#define LV_FONT_MONTSERRAT_20 0
+#define LV_FONT_MONTSERRAT_22 0
+#define LV_FONT_MONTSERRAT_24 0
+#define LV_FONT_MONTSERRAT_26 0
+#define LV_FONT_MONTSERRAT_28 0
+#define LV_FONT_MONTSERRAT_30 0
+#define LV_FONT_MONTSERRAT_32 0
+#define LV_FONT_MONTSERRAT_34 0
+#define LV_FONT_MONTSERRAT_36 0
+#define LV_FONT_MONTSERRAT_38 0
+#define LV_FONT_MONTSERRAT_40 0
+#define LV_FONT_MONTSERRAT_42 0
+#define LV_FONT_MONTSERRAT_44 0
+#define LV_FONT_MONTSERRAT_46 0
+#define LV_FONT_MONTSERRAT_48 0
+
+/*Demonstrate special features*/
+#define LV_FONT_MONTSERRAT_12_SUBPX      0
+#define LV_FONT_MONTSERRAT_28_COMPRESSED 0  /*bpp = 3*/
+#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0  /*Hebrew, Arabic, Persian letters and all their forms*/
+#define LV_FONT_SIMSUN_16_CJK            0  /*1000 most common CJK radicals*/
+
+/*Pixel perfect monospace fonts*/
+#define LV_FONT_UNSCII_8  0
+#define LV_FONT_UNSCII_16 0
+
+/*Optionally declare custom fonts here.
+ *You can use these fonts as default font too and they will be available globally.
+ *E.g. #define LV_FONT_CUSTOM_DECLARE   LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/
+#define LV_FONT_CUSTOM_DECLARE
+
+/*Always set a default font*/
+#define LV_FONT_DEFAULT &lv_font_montserrat_14
+
+/*Enable handling large font and/or fonts with a lot of characters.
+ *The limit depends on the font size, font face and bpp.
+ *Compiler error will be triggered if a font needs it.*/
+#define LV_FONT_FMT_TXT_LARGE 0
+
+/*Enables/disables support for compressed fonts.*/
+#define LV_USE_FONT_COMPRESSED 0
+
+/*Enable subpixel rendering*/
+#define LV_USE_FONT_SUBPX 0
+#if LV_USE_FONT_SUBPX
+    /*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/
+    #define LV_FONT_SUBPX_BGR 0  /*0: RGB; 1:BGR order*/
+#endif
+
+/*Enable drawing placeholders when glyph dsc is not found*/
+#define LV_USE_FONT_PLACEHOLDER 1
+
+/*=================
+ *  TEXT SETTINGS
+ *=================*/
+
+/**
+ * Select a character encoding for strings.
+ * Your IDE or editor should have the same character encoding
+ * - LV_TXT_ENC_UTF8
+ * - LV_TXT_ENC_ASCII
+ */
+#define LV_TXT_ENC LV_TXT_ENC_UTF8
+
+/*Can break (wrap) texts on these chars*/
+#define LV_TXT_BREAK_CHARS " ,.;:-_"
+
+/*If a word is at least this long, will break wherever "prettiest"
+ *To disable, set to a value <= 0*/
+#define LV_TXT_LINE_BREAK_LONG_LEN 0
+
+/*Minimum number of characters in a long word to put on a line before a break.
+ *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/
+#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3
+
+/*Minimum number of characters in a long word to put on a line after a break.
+ *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/
+#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3
+
+/*The control character to use for signalling text recoloring.*/
+#define LV_TXT_COLOR_CMD "#"
+
+/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts.
+ *The direction will be processed according to the Unicode Bidirectional Algorithm:
+ *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/
+#define LV_USE_BIDI 0
+#if LV_USE_BIDI
+    /*Set the default direction. Supported values:
+    *`LV_BASE_DIR_LTR` Left-to-Right
+    *`LV_BASE_DIR_RTL` Right-to-Left
+    *`LV_BASE_DIR_AUTO` detect texts base direction*/
+    #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO
+#endif
+
+/*Enable Arabic/Persian processing
+ *In these languages characters should be replaced with an other form based on their position in the text*/
+#define LV_USE_ARABIC_PERSIAN_CHARS 0
+
+/*==================
+ *  WIDGET USAGE
+ *================*/
+
+/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/
+
+#define LV_USE_ARC        1
+
+#define LV_USE_BAR        1
+
+#define LV_USE_BTN        1
+
+#define LV_USE_BTNMATRIX  1
+
+#define LV_USE_CANVAS     1
+
+#define LV_USE_CHECKBOX   1
+
+#define LV_USE_DROPDOWN   1   /*Requires: lv_label*/
+
+#define LV_USE_IMG        1   /*Requires: lv_label*/
+
+#define LV_USE_LABEL      1
+#if LV_USE_LABEL
+    #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/
+    #define LV_LABEL_LONG_TXT_HINT 1  /*Store some extra info in labels to speed up drawing of very long texts*/
+#endif
+
+#define LV_USE_LINE       1
+
+#define LV_USE_ROLLER     1   /*Requires: lv_label*/
+#if LV_USE_ROLLER
+    #define LV_ROLLER_INF_PAGES 7 /*Number of extra "pages" when the roller is infinite*/
+#endif
+
+#define LV_USE_SLIDER     1   /*Requires: lv_bar*/
+
+#define LV_USE_SWITCH     1
+
+#define LV_USE_TEXTAREA   1   /*Requires: lv_label*/
+#if LV_USE_TEXTAREA != 0
+    #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500    /*ms*/
+#endif
+
+#define LV_USE_TABLE      1
+
+/*==================
+ * EXTRA COMPONENTS
+ *==================*/
+
+/*-----------
+ * Widgets
+ *----------*/
+#define LV_USE_ANIMIMG    1
+
+#define LV_USE_CALENDAR   1
+#if LV_USE_CALENDAR
+    #define LV_CALENDAR_WEEK_STARTS_MONDAY 0
+    #if LV_CALENDAR_WEEK_STARTS_MONDAY
+        #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"}
+    #else
+        #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"}
+    #endif
+
+    #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March",  "April", "May",  "June", "July", "August", "September", "October", "November", "December"}
+    #define LV_USE_CALENDAR_HEADER_ARROW 1
+    #define LV_USE_CALENDAR_HEADER_DROPDOWN 1
+#endif  /*LV_USE_CALENDAR*/
+
+#define LV_USE_CHART      1
+
+#define LV_USE_COLORWHEEL 1
+
+#define LV_USE_IMGBTN     1
+
+#define LV_USE_KEYBOARD   1
+
+#define LV_USE_LED        1
+
+#define LV_USE_LIST       1
+
+#define LV_USE_MENU       1
+
+#define LV_USE_METER      1
+
+#define LV_USE_MSGBOX     1
+
+#define LV_USE_SPAN       1
+#if LV_USE_SPAN
+    /*A line text can contain maximum num of span descriptor */
+    #define LV_SPAN_SNIPPET_STACK_SIZE 64
+#endif
+
+#define LV_USE_SPINBOX    1
+
+#define LV_USE_SPINNER    1
+
+#define LV_USE_TABVIEW    1
+
+#define LV_USE_TILEVIEW   1
+
+#define LV_USE_WIN        1
+
+/*-----------
+ * Themes
+ *----------*/
+
+/*A simple, impressive and very complete theme*/
+#define LV_USE_THEME_DEFAULT 1
+#if LV_USE_THEME_DEFAULT
+
+    /*0: Light mode; 1: Dark mode*/
+    #define LV_THEME_DEFAULT_DARK 0
+
+    /*1: Enable grow on press*/
+    #define LV_THEME_DEFAULT_GROW 1
+
+    /*Default transition time in [ms]*/
+    #define LV_THEME_DEFAULT_TRANSITION_TIME 80
+#endif /*LV_USE_THEME_DEFAULT*/
+
+/*A very simple theme that is a good starting point for a custom theme*/
+#define LV_USE_THEME_BASIC 1
+
+/*A theme designed for monochrome displays*/
+#define LV_USE_THEME_MONO 1
+
+/*-----------
+ * Layouts
+ *----------*/
+
+/*A layout similar to Flexbox in CSS.*/
+#define LV_USE_FLEX 1
+
+/*A layout similar to Grid in CSS.*/
+#define LV_USE_GRID 1
+
+/*---------------------
+ * 3rd party libraries
+ *--------------------*/
+
+/*File system interfaces for common APIs */
+
+/*API for fopen, fread, etc*/
+#define LV_USE_FS_STDIO 0
+#if LV_USE_FS_STDIO
+    #define LV_FS_STDIO_LETTER '\0'     /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
+    #define LV_FS_STDIO_PATH ""         /*Set the working directory. File/directory paths will be appended to it.*/
+    #define LV_FS_STDIO_CACHE_SIZE 0    /*>0 to cache this number of bytes in lv_fs_read()*/
+#endif
+
+/*API for open, read, etc*/
+#define LV_USE_FS_POSIX 0
+#if LV_USE_FS_POSIX
+    #define LV_FS_POSIX_LETTER '\0'     /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
+    #define LV_FS_POSIX_PATH ""         /*Set the working directory. File/directory paths will be appended to it.*/
+    #define LV_FS_POSIX_CACHE_SIZE 0    /*>0 to cache this number of bytes in lv_fs_read()*/
+#endif
+
+/*API for CreateFile, ReadFile, etc*/
+#define LV_USE_FS_WIN32 0
+#if LV_USE_FS_WIN32
+    #define LV_FS_WIN32_LETTER '\0'     /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
+    #define LV_FS_WIN32_PATH ""         /*Set the working directory. File/directory paths will be appended to it.*/
+    #define LV_FS_WIN32_CACHE_SIZE 0    /*>0 to cache this number of bytes in lv_fs_read()*/
+#endif
+
+/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/
+#define LV_USE_FS_FATFS 0
+#if LV_USE_FS_FATFS
+    #define LV_FS_FATFS_LETTER '\0'     /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
+    #define LV_FS_FATFS_CACHE_SIZE 0    /*>0 to cache this number of bytes in lv_fs_read()*/
+#endif
+
+/*PNG decoder library*/
+#define LV_USE_PNG 0
+
+/*BMP decoder library*/
+#define LV_USE_BMP 0
+
+/* JPG + split JPG decoder library.
+ * Split JPG is a custom format optimized for embedded systems. */
+#define LV_USE_SJPG 0
+
+/*GIF decoder library*/
+#define LV_USE_GIF 0
+
+/*QR code library*/
+#define LV_USE_QRCODE 0
+
+/*FreeType library*/
+#define LV_USE_FREETYPE 0
+#if LV_USE_FREETYPE
+    /*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/
+    #define LV_FREETYPE_CACHE_SIZE (16 * 1024)
+    #if LV_FREETYPE_CACHE_SIZE >= 0
+        /* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */
+        /* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */
+        /* if font size >= 256, must be configured as image cache */
+        #define LV_FREETYPE_SBIT_CACHE 0
+        /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */
+        /* (0:use system defaults) */
+        #define LV_FREETYPE_CACHE_FT_FACES 0
+        #define LV_FREETYPE_CACHE_FT_SIZES 0
+    #endif
+#endif
+
+/*Rlottie library*/
+#define LV_USE_RLOTTIE 0
+
+/*FFmpeg library for image decoding and playing videos
+ *Supports all major image formats so do not enable other image decoder with it*/
+#define LV_USE_FFMPEG 0
+#if LV_USE_FFMPEG
+    /*Dump input information to stderr*/
+    #define LV_FFMPEG_DUMP_FORMAT 0
+#endif
+
+/*-----------
+ * Others
+ *----------*/
+
+/*1: Enable API to take snapshot for object*/
+#define LV_USE_SNAPSHOT 0
+
+/*1: Enable Monkey test*/
+#define LV_USE_MONKEY 0
+
+/*1: Enable grid navigation*/
+#define LV_USE_GRIDNAV 0
+
+/*1: Enable lv_obj fragment*/
+#define LV_USE_FRAGMENT 0
+
+/*1: Support using images as font in label or span widgets */
+#define LV_USE_IMGFONT 0
+
+/*1: Enable a published subscriber based messaging system */
+#define LV_USE_MSG 0
+
+/*1: Enable Pinyin input method*/
+/*Requires: lv_keyboard*/
+#define LV_USE_IME_PINYIN 0
+#if LV_USE_IME_PINYIN
+    /*1: Use default thesaurus*/
+    /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/
+    #define LV_IME_PINYIN_USE_DEFAULT_DICT 1
+    /*Set the maximum number of candidate panels that can be displayed*/
+    /*This needs to be adjusted according to the size of the screen*/
+    #define LV_IME_PINYIN_CAND_TEXT_NUM 6
+
+    /*Use 9 key input(k9)*/
+    #define LV_IME_PINYIN_USE_K9_MODE      1
+    #if LV_IME_PINYIN_USE_K9_MODE == 1
+        #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3
+    #endif // LV_IME_PINYIN_USE_K9_MODE
+#endif
+
+/*==================
+* EXAMPLES
+*==================*/
+
+/*Enable the examples to be built with the library*/
+#define LV_BUILD_EXAMPLES 1
+
+/*===================
+ * DEMO USAGE
+ ====================*/
+
+/*Show some widget. It might be required to increase `LV_MEM_SIZE` */
+#define LV_USE_DEMO_WIDGETS 0
+#if LV_USE_DEMO_WIDGETS
+#define LV_DEMO_WIDGETS_SLIDESHOW 0
+#endif
+
+/*Demonstrate the usage of encoder and keyboard*/
+#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0
+
+/*Benchmark your system*/
+#define LV_USE_DEMO_BENCHMARK 0
+#if LV_USE_DEMO_BENCHMARK
+/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/
+#define LV_DEMO_BENCHMARK_RGB565A8 0
+#endif
+
+/*Stress test for LVGL*/
+#define LV_USE_DEMO_STRESS 0
+
+/*Music player demo*/
+#define LV_USE_DEMO_MUSIC 0
+#if LV_USE_DEMO_MUSIC
+    #define LV_DEMO_MUSIC_SQUARE    0
+    #define LV_DEMO_MUSIC_LANDSCAPE 0
+    #define LV_DEMO_MUSIC_ROUND     0
+    #define LV_DEMO_MUSIC_LARGE     0
+    #define LV_DEMO_MUSIC_AUTO_PLAY 0
+#endif
+
+/*--END OF LV_CONF_H--*/
+
+#endif /*LV_CONF_H*/
+
+#endif /*End of "Content enable"*/
index d7bd045..99bd1a2 100644 (file)
@@ -209,10 +209,12 @@ void lv_deinit(void)
 #endif
 }
 #endif
-
+#include "helios_debug.h"
+#define lv_obj_create_log(msg, ...)      custom_log("lv_obj_create", msg, ##__VA_ARGS__)
 lv_obj_t * lv_obj_create(lv_obj_t * parent)
 {
     LV_LOG_INFO("begin");
+    lv_obj_create_log("parent:0x%p!!!!!!\n\n\n",parent);
     lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
     lv_obj_class_init_obj(obj);
     return obj;
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/arm2d/lv_draw_arm2d.mk b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/arm2d/lv_draw_arm2d.mk
new file mode 100644 (file)
index 0000000..17219b0
--- /dev/null
@@ -0,0 +1,6 @@
+CSRCS += lv_gpu_arm2d.c
+
+DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/arm2d
+VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/arm2d
+
+CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/arm2d"
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/arm2d/lv_gpu_arm2d.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/arm2d/lv_gpu_arm2d.c
new file mode 100644 (file)
index 0000000..c42f238
--- /dev/null
@@ -0,0 +1,1585 @@
+/**
+ * @file lv_gpu_arm2d.c
+ *
+ */
+
+/*
+ * Copyright (C) 2010-2023 Arm Limited or its affiliates. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * 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
+ *
+ * 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.
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+#if defined(__clang__)
+    #pragma clang diagnostic ignored "-Wunknown-warning-option"
+    #pragma clang diagnostic ignored "-Wreserved-identifier"
+    #pragma clang diagnostic ignored "-Wincompatible-pointer-types-discards-qualifiers"
+    #pragma clang diagnostic ignored "-Wmissing-variable-declarations"
+    #pragma clang diagnostic ignored "-Wcast-qual"
+    #pragma clang diagnostic ignored "-Wcast-align"
+    #pragma clang diagnostic ignored "-Wextra-semi-stmt"
+    #pragma clang diagnostic ignored "-Wsign-conversion"
+    #pragma clang diagnostic ignored "-Wunused-function"
+    #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion"
+    #pragma clang diagnostic ignored "-Wdouble-promotion"
+    #pragma clang diagnostic ignored "-Wunused-parameter"
+    #pragma clang diagnostic ignored "-Wimplicit-float-conversion"
+    #pragma clang diagnostic ignored "-Wimplicit-int-conversion"
+    #pragma clang diagnostic ignored "-Wtautological-pointer-compare"
+    #pragma clang diagnostic ignored "-Wsign-compare"
+    #pragma clang diagnostic ignored "-Wfloat-conversion"
+    #pragma clang diagnostic ignored "-Wmissing-prototypes"
+    #pragma clang diagnostic ignored "-Wpadded"
+    #pragma clang diagnostic ignored "-Wundef"
+    #pragma clang diagnostic ignored "-Wdeclaration-after-statement"
+    #pragma clang diagnostic ignored "-Wdisabled-macro-expansion"
+    #pragma clang diagnostic ignored "-Wunused-variable"
+    #pragma clang diagnostic ignored "-Wunused-but-set-variable"
+    #pragma clang diagnostic ignored "-Wint-conversion"
+#endif
+
+
+#include "lv_gpu_arm2d.h"
+#include "../../core/lv_refr.h"
+
+#if LV_USE_GPU_ARM2D
+#define __ARM_2D_IMPL__
+#include "arm_2d.h"
+#include "__arm_2d_impl.h"
+
+
+#if defined(__IS_COMPILER_ARM_COMPILER_5__)
+    #pragma diag_suppress 174,177,188,68,513,144,1296
+#elif defined(__IS_COMPILER_IAR__)
+    #pragma diag_suppress=Pa093
+#elif defined(__IS_COMPILER_GCC__)
+    #pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#endif
+
+/*********************
+ *      DEFINES
+ *********************/
+#if (   !defined(__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__)                  \
+    ||  !__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__)                          \
+&&  LV_COLOR_DEPTH == 32                                                        \
+&&  !defined(__ARM_2D_LVGL_CFG_NO_WARNING__)
+#warning Please set macro __ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__ to 1 to get more acceleration opportunities. Or you can define macro __ARM_2D_LVGL_CFG_NO_WARNING__ to suppress this warning.
+#endif
+
+#define MAX_BUF_SIZE (uint32_t) lv_disp_get_hor_res(_lv_refr_get_disp_refreshing())
+
+#if LV_COLOR_DEPTH == 16
+#define arm_2d_fill_colour              arm_2d_rgb16_fill_colour
+#define arm_2d_fill_colour_with_alpha   arm_2d_rgb565_fill_colour_with_alpha
+#define arm_2d_fill_colour_with_mask    arm_2d_rgb565_fill_colour_with_mask
+#define arm_2d_fill_colour_with_mask_and_opacity                                \
+    arm_2d_rgb565_fill_colour_with_mask_and_opacity
+#define arm_2d_tile_copy                arm_2d_rgb16_tile_copy
+#define arm_2d_alpha_blending           arm_2d_rgb565_alpha_blending
+#define arm_2d_tile_copy_with_src_mask  arm_2d_rgb565_tile_copy_with_src_mask
+#define arm_2d_color_t                  arm_2d_color_rgb565_t
+
+/* arm-2d direct mode apis */
+#define __arm_2d_impl_colour_filling    __arm_2d_impl_rgb16_colour_filling
+#define __arm_2d_impl_colour_filling_with_opacity                               \
+    __arm_2d_impl_rgb565_colour_filling_with_opacity
+#define __arm_2d_impl_colour_filling_mask                                       \
+    __arm_2d_impl_rgb565_colour_filling_mask
+#define __arm_2d_impl_colour_filling_mask_opacity                               \
+    __arm_2d_impl_rgb565_colour_filling_mask_opacity
+#define __arm_2d_impl_copy              __arm_2d_impl_rgb16_copy
+#define __arm_2d_impl_alpha_blending    __arm_2d_impl_rgb565_alpha_blending
+#define __arm_2d_impl_src_msk_copy      __arm_2d_impl_rgb565_src_msk_copy
+#define __arm_2d_impl_src_chn_msk_copy  __arm_2d_impl_rgb565_src_chn_msk_copy
+#define __arm_2d_impl_cl_key_copy       __arm_2d_impl_rgb16_cl_key_copy
+#define __arm_2d_impl_alpha_blending_colour_keying                              \
+    __arm_2d_impl_rgb565_alpha_blending_colour_keying
+#define arm_2d_tile_transform_with_src_mask_and_opacity_prepare                 \
+    arm_2dp_rgb565_tile_transform_with_src_mask_and_opacity_prepare
+#define arm_2d_tile_transform_with_opacity_prepare                              \
+    arm_2dp_rgb565_tile_transform_with_opacity_prepare
+#define arm_2d_tile_transform_only_with_opacity_prepare                         \
+    arm_2dp_rgb565_tile_transform_only_with_opacity_prepare
+#define arm_2d_tile_transform_prepare                                           \
+    arm_2dp_rgb565_tile_transform_prepare
+
+#define __ARM_2D_PIXEL_BLENDING_OPA     __ARM_2D_PIXEL_BLENDING_OPA_RGB565
+
+#define color_int                       uint16_t
+
+#elif LV_COLOR_DEPTH == 32
+#define arm_2d_fill_colour              arm_2d_rgb32_fill_colour
+#define arm_2d_fill_colour_with_alpha   arm_2d_cccn888_fill_colour_with_alpha
+#define arm_2d_fill_colour_with_mask    arm_2d_cccn888_fill_colour_with_mask
+#define arm_2d_fill_colour_with_mask_and_opacity                                \
+    arm_2d_cccn888_fill_colour_with_mask_and_opacity
+#define arm_2d_tile_copy                arm_2d_rgb32_tile_copy
+#define arm_2d_alpha_blending           arm_2d_cccn888_alpha_blending
+#define arm_2d_tile_copy_with_src_mask  arm_2d_cccn888_tile_copy_with_src_mask
+#define arm_2d_color_t                  arm_2d_color_cccn888_t
+
+/* arm-2d direct mode apis */
+#define __arm_2d_impl_colour_filling    __arm_2d_impl_rgb32_colour_filling
+#define __arm_2d_impl_colour_filling_with_opacity                               \
+    __arm_2d_impl_cccn888_colour_filling_with_opacity
+#define __arm_2d_impl_colour_filling_mask                                       \
+    __arm_2d_impl_cccn888_colour_filling_mask
+#define __arm_2d_impl_colour_filling_mask_opacity                               \
+    __arm_2d_impl_cccn888_colour_filling_mask_opacity
+#define __arm_2d_impl_copy              __arm_2d_impl_rgb32_copy
+#define __arm_2d_impl_alpha_blending    __arm_2d_impl_cccn888_alpha_blending
+#define __arm_2d_impl_src_msk_copy      __arm_2d_impl_cccn888_src_msk_copy
+#define __arm_2d_impl_src_chn_msk_copy  __arm_2d_impl_cccn888_src_chn_msk_copy
+#define __arm_2d_impl_cl_key_copy       __arm_2d_impl_rgb32_cl_key_copy
+#define __arm_2d_impl_alpha_blending_colour_keying                              \
+    __arm_2d_impl_cccn888_alpha_blending_colour_keying
+#define arm_2d_tile_transform_with_src_mask_and_opacity_prepare                 \
+    arm_2dp_cccn888_tile_transform_with_src_mask_and_opacity_prepare
+#define arm_2d_tile_transform_with_opacity_prepare                              \
+    arm_2dp_cccn888_tile_transform_with_opacity_prepare
+#define arm_2d_tile_transform_only_with_opacity_prepare                         \
+    arm_2dp_cccn888_tile_transform_only_with_opacity_prepare
+#define arm_2d_tile_transform_prepare                                           \
+    arm_2dp_cccn888_tile_transform_prepare
+
+#define __ARM_2D_PIXEL_BLENDING_OPA     __ARM_2D_PIXEL_BLENDING_OPA_CCCN888
+
+#define color_int                       uint32_t
+
+#else
+#error The specified LV_COLOR_DEPTH is not supported by this version of lv_gpu_arm2d.c.
+#endif
+
+/* *INDENT-OFF* */
+#define __PREPARE_LL_ACCELERATION__()                                           \
+            int32_t src_stride = lv_area_get_width(coords);                     \
+                                                                                \
+            uint8_t px_size_byte = cf == LV_IMG_CF_TRUE_COLOR_ALPHA             \
+                                      ?  LV_IMG_PX_SIZE_ALPHA_BYTE              \
+                                      :  sizeof(lv_color_t);                    \
+                                                                                \
+            const uint8_t * src_buf_tmp = src_buf;                              \
+            src_buf_tmp += src_stride                                           \
+                         * (draw_area.y1 - coords->y1)                          \
+                         * px_size_byte;                                        \
+            src_buf_tmp += (draw_area.x1 - coords->x1) * px_size_byte;          \
+                                                                                \
+            lv_area_t blend_area2;                                              \
+            if(!_lv_area_intersect(&blend_area2,                                \
+                                   &draw_area,                                  \
+                                   draw_ctx->clip_area)) return;                \
+                                                                                \
+            int32_t w = lv_area_get_width(&blend_area2);                        \
+            int32_t h = lv_area_get_height(&blend_area2);                       \
+                                                                                \
+            lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area);     \
+                                                                                \
+            lv_color_t * dest_buf = draw_ctx->buf;                              \
+            dest_buf += dest_stride * (blend_area2.y1 - draw_ctx->buf_area->y1) \
+                        + (blend_area2.x1 - draw_ctx->buf_area->x1);            \
+                                                                                \
+            arm_2d_size_t copy_size = {                                         \
+                .iWidth = lv_area_get_width(&blend_area2),                      \
+                .iHeight = lv_area_get_height(&blend_area2),                    \
+            }
+
+#define __PREPARE_TARGET_TILE__(__blend_area)                                   \
+        static arm_2d_tile_t target_tile;                                       \
+        static arm_2d_region_t target_region;                                   \
+                                                                                \
+        lv_color_t * dest_buf = draw_ctx->buf;                                  \
+                                                                                \
+        target_tile = (arm_2d_tile_t) {                                         \
+            .tRegion = {                                                        \
+                .tSize = {                                                      \
+                    .iWidth = lv_area_get_width(draw_ctx->buf_area),            \
+                    .iHeight = lv_area_get_height(draw_ctx->buf_area),          \
+                },                                                              \
+            },                                                                  \
+            .tInfo.bIsRoot = true,                                              \
+            .phwBuffer = (uint16_t *)draw_ctx->buf,                             \
+        };                                                                      \
+                                                                                \
+        target_region = (arm_2d_region_t) {                                     \
+            .tLocation = {                                                      \
+                .iX = (__blend_area).x1 - draw_ctx->buf_area->x1,               \
+                .iY = (__blend_area).y1 - draw_ctx->buf_area->y1,               \
+            },                                                                  \
+            .tSize = {                                                          \
+                .iWidth = lv_area_get_width(&(__blend_area)),                   \
+                .iHeight = lv_area_get_height(&(__blend_area)),                 \
+            },                                                                  \
+        }
+
+#define __PREPARE_SOURCE_TILE__(__dsc, __blend_area)                            \
+        static arm_2d_tile_t source_tile_orig;                                  \
+        static arm_2d_tile_t source_tile;                                       \
+        const lv_color_t * src_buf = (__dsc)->src_buf;                          \
+        if (src_buf) {                                                          \
+            source_tile_orig = (arm_2d_tile_t) {                                \
+                .tRegion = {                                                    \
+                    .tSize = {                                                  \
+                        .iWidth = lv_area_get_width((__dsc)->blend_area),       \
+                        .iHeight = lv_area_get_height((__dsc)->blend_area),     \
+                    },                                                          \
+                },                                                              \
+                .tInfo.bIsRoot = true,                                          \
+                .phwBuffer = (uint16_t *)src_buf,                               \
+            };                                                                  \
+                                                                                \
+            arm_2d_tile_generate_child(                                         \
+                &source_tile_orig,                                              \
+                (arm_2d_region_t []) {                                          \
+                    {                                                           \
+                        .tLocation = {                                          \
+                            .iX = (__blend_area).x1 - (__dsc)->blend_area->x1,  \
+                            .iY = (__blend_area).y1 - (__dsc)->blend_area->y1,  \
+                        },                                                      \
+                        .tSize = source_tile_orig.tRegion.tSize,                \
+                    }                                                           \
+                },                                                              \
+                &source_tile,                                                   \
+                false);                                                         \
+            source_tile.tInfo.bDerivedResource = true;                          \
+        }
+
+#define __PREPARE_MASK_TILE__(__dsc, __blend_area, __mask, __is_chn)            \
+        static arm_2d_tile_t mask_tile_orig;                                    \
+        static arm_2d_tile_t mask_tile;                                         \
+        if(NULL != (__mask)) {                                                  \
+            mask_tile_orig = (arm_2d_tile_t) {                                  \
+                .tRegion = {                                                    \
+                    .tSize = {                                                  \
+                        .iWidth = lv_area_get_width((__dsc)->mask_area),        \
+                        .iHeight = lv_area_get_height((__dsc)->mask_area),      \
+                    },                                                          \
+                },                                                              \
+                .tInfo = {                                                      \
+                    .bIsRoot = true,                                            \
+                    .bHasEnforcedColour = true,                                 \
+                    .tColourInfo = {                                            \
+                        .chScheme = (__is_chn) ? ARM_2D_CHANNEL_8in32           \
+                                               : ARM_2D_COLOUR_8BIT,            \
+                    },                                                          \
+                },                                                              \
+                .pchBuffer = ((uint8_t *)(__mask)) + (__is_chn) ? 3 : 0,        \
+            };                                                                  \
+                                                                                \
+            arm_2d_tile_generate_child(                                         \
+                &mask_tile_orig,                                                \
+                (arm_2d_region_t []) {                                          \
+                    {                                                           \
+                        .tLocation = {                                          \
+                            .iX = (__dsc)->mask_area->x1 - (__blend_area).x1,   \
+                            .iY = (__dsc)->mask_area->y1 - (__blend_area).y1,   \
+                        },                                                      \
+                        .tSize = mask_tile_orig.tRegion.tSize,                  \
+                    }                                                           \
+                },                                                              \
+                &mask_tile,                                                     \
+                false);                                                         \
+            mask_tile.tInfo.bDerivedResource = true;                            \
+        }
+/* *INDENT-ON* */
+
+/* *INDENT-OFF* */
+#define __RECOLOUR_WRAPPER(...)                                                 \
+    do {                                                                        \
+        lv_color_t *rgb_tmp_buf = NULL;                                         \
+        if(draw_dsc->recolor_opa > LV_OPA_MIN) {                                \
+            rgb_tmp_buf                                                         \
+                = lv_mem_buf_get(src_w * src_h * sizeof(lv_color_t));           \
+            if (NULL == rgb_tmp_buf) {                                          \
+                LV_LOG_WARN(                                                    \
+                    "Failed to allocate memory for accelerating recolour, "     \
+                    "use normal route instead.");                               \
+                break;                                                          \
+            }                                                                   \
+            lv_memcpy(rgb_tmp_buf, src_buf, src_w * src_h * sizeof(lv_color_t));\
+            arm_2d_size_t copy_size = {                                         \
+                .iWidth = src_w,                                                \
+                .iHeight = src_h,                                               \
+            };                                                                  \
+            /* apply re-colour */                                               \
+            __arm_2d_impl_colour_filling_with_opacity(                          \
+                (color_int *)rgb_tmp_buf,                                       \
+                src_w,                                                          \
+                &copy_size,                                                     \
+                (color_int)draw_dsc->recolor.full,                              \
+                draw_dsc->recolor_opa);                                         \
+                                                                                \
+            /* replace src_buf for the following operation */                   \
+            src_buf = (const uint8_t *)rgb_tmp_buf;                             \
+        }                                                                       \
+        do {                                                                    \
+            __VA_ARGS__                                                         \
+        } while(0);                                                             \
+        if (NULL != rgb_tmp_buf) {                                              \
+            lv_mem_buf_release(rgb_tmp_buf);                                    \
+        }                                                                       \
+    } while(0);                                                                 \
+    src_buf = src_buf_org;
+
+#define __RECOLOUR_BEGIN()                                                      \
+    do {                                                                        \
+        lv_color_t *rgb_tmp_buf = NULL;                                         \
+        if(draw_dsc->recolor_opa > LV_OPA_MIN) {                                \
+            rgb_tmp_buf                                                         \
+                = lv_mem_buf_get(src_w * src_h * sizeof(lv_color_t));           \
+            if (NULL == rgb_tmp_buf) {                                          \
+                LV_LOG_WARN(                                                    \
+                    "Failed to allocate memory for accelerating recolour, "     \
+                    "use normal route instead.");                               \
+                break;                                                          \
+            }                                                                   \
+            lv_memcpy(rgb_tmp_buf, src_buf, src_w * src_h * sizeof(lv_color_t));\
+            arm_2d_size_t copy_size = {                                         \
+                .iWidth = src_w,                                                \
+                .iHeight = src_h,                                               \
+            };                                                                  \
+            /* apply re-colour */                                               \
+            __arm_2d_impl_colour_filling_with_opacity(                          \
+                (color_int *)rgb_tmp_buf,                                       \
+                src_w,                                                          \
+                &copy_size,                                                     \
+                (color_int)draw_dsc->recolor.full,                              \
+                draw_dsc->recolor_opa);                                         \
+                                                                                \
+            /* replace src_buf for the following operation */                   \
+            src_buf = (const uint8_t *)rgb_tmp_buf;                             \
+        }                                                                       \
+        do {
+
+#define __RECOLOUR_END()                                                        \
+        } while(0);                                                             \
+        if (NULL != rgb_tmp_buf) {                                              \
+            lv_mem_buf_release(rgb_tmp_buf);                                    \
+        }                                                                       \
+    } while(0);                                                                 \
+    src_buf = src_buf_org;
+
+#define __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION(__TRANS_PREPARE, ...)          \
+        do {                                                                    \
+            __TRANS_PREPARE(                                                    \
+                    NULL,                                                       \
+                    __VA_ARGS__);                                               \
+                                                                                \
+            target_region = (arm_2d_region_t) {                                 \
+                .tLocation = {                                                  \
+                    .iX = coords->x1 - draw_ctx->clip_area->x1,                 \
+                    .iY = coords->y1 - draw_ctx->clip_area->y1,                 \
+                },                                                              \
+                .tSize = {                                                      \
+                    .iWidth = lv_area_get_width(coords),                        \
+                    .iHeight = lv_area_get_height(coords),                      \
+                },                                                              \
+            };                                                                  \
+                                                                                \
+            arm_2d_size_t tTransSize                                            \
+                = ARM_2D_CTRL.DefaultOP                                         \
+                    .tTransform.Source.ptTile->tRegion.tSize;                   \
+                                                                                \
+            if (target_region.tSize.iWidth < tTransSize.iWidth) {               \
+                int16_t iDelta = tTransSize.iWidth - target_region.tSize.iWidth;\
+                target_region.tLocation.iX -= iDelta / 2;                       \
+                target_region.tSize.iWidth = tTransSize.iWidth;                 \
+            }                                                                   \
+                                                                                \
+            if (target_region.tSize.iHeight < tTransSize.iHeight) {             \
+                int16_t iDelta                                                  \
+                    = tTransSize.iHeight - target_region.tSize.iHeight;         \
+                target_region.tLocation.iY -= iDelta / 2;                       \
+                target_region.tSize.iHeight = tTransSize.iHeight;               \
+            }                                                                   \
+        } while(0)
+
+/* *INDENT-ON* */
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+#if __ARM_2D_HAS_HW_ACC__
+LV_ATTRIBUTE_FAST_MEM
+static bool lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile,
+                                      const arm_2d_region_t * region,
+                                      lv_color_t color,
+                                      lv_opa_t opa,
+                                      const arm_2d_tile_t * mask_tile);
+
+LV_ATTRIBUTE_FAST_MEM
+static bool lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile,
+                                    const arm_2d_region_t * region,
+                                    arm_2d_tile_t * source_tile,
+                                    lv_opa_t opa,
+                                    arm_2d_tile_t * mask_tile);
+#else
+
+static void convert_cb(const lv_area_t * dest_area,
+                       const void * src_buf,
+                       lv_coord_t src_w,
+                       lv_coord_t src_h,
+                       lv_coord_t src_stride,
+                       const lv_draw_img_dsc_t * draw_dsc,
+                       lv_img_cf_t cf,
+                       lv_color_t * cbuf,
+                       lv_opa_t * abuf);
+
+LV_ATTRIBUTE_FAST_MEM
+static bool arm_2d_fill_normal(lv_color_t * dest_buf,
+                               const lv_area_t * dest_area,
+                               lv_coord_t dest_stride,
+                               lv_color_t color,
+                               lv_opa_t opa,
+                               const lv_opa_t * mask,
+                               lv_coord_t mask_stride);
+
+LV_ATTRIBUTE_FAST_MEM
+static bool arm_2d_copy_normal(lv_color_t * dest_buf,
+                               const lv_area_t * dest_area,
+                               lv_coord_t dest_stride,
+                               const lv_color_t * src_buf,
+                               lv_coord_t src_stride,
+                               lv_opa_t opa,
+                               const lv_opa_t * mask,
+                               lv_coord_t mask_stride);
+#endif
+
+LV_ATTRIBUTE_FAST_MEM
+static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc);
+LV_ATTRIBUTE_FAST_MEM
+static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx);
+LV_ATTRIBUTE_FAST_MEM
+static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx,
+                                      const lv_draw_img_dsc_t * draw_dsc,
+                                      const lv_area_t * coords,
+                                      const uint8_t * src_buf,
+                                      lv_img_cf_t cf);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+void lv_draw_arm2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
+{
+    arm_2d_init();
+
+    lv_draw_sw_init_ctx(drv, draw_ctx);
+
+    lv_draw_arm2d_ctx_t * arm2d_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx;
+
+    arm2d_draw_ctx->blend = lv_draw_arm2d_blend;
+    arm2d_draw_ctx->base_draw.wait_for_finish = lv_gpu_arm2d_wait_cb;
+
+#if !__ARM_2D_HAS_HW_ACC__
+    arm2d_draw_ctx->base_draw.draw_img_decoded = lv_draw_arm2d_img_decoded;
+#endif
+
+}
+
+void lv_draw_arm2d_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
+{
+    LV_UNUSED(drv);
+    LV_UNUSED(draw_ctx);
+}
+
+extern void test_flush(lv_color_t * color_p);
+
+#if __ARM_2D_HAS_HW_ACC__
+LV_ATTRIBUTE_FAST_MEM
+static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc)
+{
+    const lv_opa_t * mask;
+    if(dsc->mask_buf == NULL) mask = NULL;
+    if(dsc->mask_buf && dsc->mask_res == LV_DRAW_MASK_RES_TRANSP) return;
+    else if(dsc->mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask = NULL;
+    else mask = dsc->mask_buf;
+
+
+    lv_area_t blend_area;
+    if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) {
+        return;
+    }
+
+    bool is_accelerated = false;
+
+    if(dsc->blend_mode == LV_BLEND_MODE_NORMAL
+       &&    lv_area_get_size(&blend_area) > 100) {
+
+        __PREPARE_TARGET_TILE__(blend_area);
+        __PREPARE_SOURCE_TILE__(dsc, blend_area);
+        __PREPARE_MASK_TILE__(dsc, blend_area, mask, false);
+
+        if(src_buf) {
+            is_accelerated = lv_draw_arm2d_tile_copy(
+                                 &target_tile,
+                                 &target_region,
+                                 &source_tile,
+                                 dsc->opa,
+                                 (NULL == mask) ? NULL : &mask_tile);
+        }
+        else {
+            is_accelerated = lv_draw_arm2d_fill_colour(
+                                 &target_tile,
+                                 &target_region,
+                                 dsc->color,
+                                 dsc->opa,
+                                 (NULL == mask) ? NULL : &mask_tile);
+        }
+    }
+
+    if(!is_accelerated) {
+        lv_draw_sw_blend_basic(draw_ctx, dsc);
+    }
+}
+
+
+LV_ATTRIBUTE_FAST_MEM
+static bool lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile,
+                                      const arm_2d_region_t * region,
+                                      lv_color_t color,
+                                      lv_opa_t opa,
+                                      const arm_2d_tile_t * mask_tile)
+{
+    arm_fsm_rt_t result = (arm_fsm_rt_t)ARM_2D_ERR_NONE;
+
+    if(NULL == mask_tile) {
+        if(opa >= LV_OPA_MAX) {
+            result = arm_2d_fill_colour(target_tile, region, color.full);
+        }
+        else {
+#if LV_COLOR_SCREEN_TRANSP
+            return false;
+#else
+            result = arm_2d_fill_colour_with_alpha(
+                         target_tile,
+                         region,
+            (arm_2d_color_t) {
+                color.full
+            },
+            opa);
+#endif
+        }
+    }
+    else {
+
+        if(opa >= LV_OPA_MAX) {
+            result = arm_2d_fill_colour_with_mask(
+                         target_tile,
+                         region,
+                         mask_tile,
+            (arm_2d_color_t) {
+                color.full
+            });
+        }
+        else {
+#if LV_COLOR_SCREEN_TRANSP
+            return false;
+#else
+            result = arm_2d_fill_colour_with_mask_and_opacity(
+                         target_tile,
+                         region,
+                         mask_tile,
+            (arm_2d_color_t) {
+                color.full
+            },
+            opa);
+#endif
+        }
+    }
+
+    if(result < 0) {
+        /* error detected */
+        return false;
+    }
+
+    return true;
+
+}
+
+LV_ATTRIBUTE_FAST_MEM
+static bool lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile,
+                                    const arm_2d_region_t * region,
+                                    arm_2d_tile_t * source_tile,
+                                    lv_opa_t opa,
+                                    arm_2d_tile_t * mask_tile)
+{
+    arm_fsm_rt_t result = (arm_fsm_rt_t)ARM_2D_ERR_NONE;
+
+    if(NULL == mask_tile) {
+        if(opa >= LV_OPA_MAX) {
+            result = arm_2d_tile_copy(source_tile,
+                                      target_tile,
+                                      region,
+                                      ARM_2D_CP_MODE_COPY);
+        }
+#if LV_COLOR_SCREEN_TRANSP
+        else {
+            return false;  /* not supported */
+        }
+#else
+        else {
+            result = arm_2d_alpha_blending(source_tile,
+                                           target_tile,
+                                           region,
+                                           opa);
+        }
+#endif
+    }
+    else {
+#if LV_COLOR_SCREEN_TRANSP
+        return false;       /* not support */
+#else
+
+        if(opa >= LV_OPA_MAX) {
+            result = arm_2d_tile_copy_with_src_mask(source_tile,
+                                                    mask_tile,
+                                                    target_tile,
+                                                    region,
+                                                    ARM_2D_CP_MODE_COPY);
+        }
+        else {
+            return false;
+        }
+#endif
+    }
+
+    if(result < 0) {
+        /* error detected */
+        return false;
+    }
+
+    return true;
+}
+
+static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx)
+{
+    lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+
+    arm_2d_op_wait_async(NULL);
+    if(disp->driver && disp->driver->wait_cb) {
+        disp->driver->wait_cb(disp->driver);
+    }
+    lv_draw_sw_wait_for_finish(draw_ctx);
+}
+#else
+
+
+LV_ATTRIBUTE_FAST_MEM
+static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc)
+{
+    const lv_opa_t * mask;
+    if(dsc->mask_buf == NULL) mask = NULL;
+    if(dsc->mask_buf && dsc->mask_res == LV_DRAW_MASK_RES_TRANSP) return;
+    else if(dsc->mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask = NULL;
+    else mask = dsc->mask_buf;
+
+    lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area);
+
+    lv_area_t blend_area;
+    if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) return;
+
+    //lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+
+    bool is_accelerated = false;
+    do {
+
+        /* target buffer */
+        lv_color_t * dest_buf = draw_ctx->buf;
+        lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+        if(disp->driver->screen_transp == 0) {
+            dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) + (blend_area.x1 - draw_ctx->buf_area->x1);
+        }
+        else {
+            /*With LV_COLOR_DEPTH 16 it means ARGB8565 (3 bytes format)*/
+            uint8_t * dest_buf8 = (uint8_t *) dest_buf;
+            dest_buf8 += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) * LV_IMG_PX_SIZE_ALPHA_BYTE;
+            dest_buf8 += (blend_area.x1 - draw_ctx->buf_area->x1) * LV_IMG_PX_SIZE_ALPHA_BYTE;
+            dest_buf = (lv_color_t *)dest_buf8;
+        }
+
+        /* source buffer */
+        const lv_color_t * src_buf = dsc->src_buf;
+        lv_coord_t src_stride;
+        if(src_buf) {
+            src_stride = lv_area_get_width(dsc->blend_area);
+            src_buf += src_stride * (blend_area.y1 - dsc->blend_area->y1) + (blend_area.x1 - dsc->blend_area->x1);
+        }
+        else {
+            src_stride = 0;
+        }
+
+        lv_coord_t mask_stride;
+        if(mask) {
+            mask_stride = lv_area_get_width(dsc->mask_area);
+            mask += mask_stride * (blend_area.y1 - dsc->mask_area->y1) + (blend_area.x1 - dsc->mask_area->x1);
+        }
+        else {
+            mask_stride = 0;
+        }
+
+        lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+        if(disp->driver->screen_transp) {
+            break;
+        }
+        if(dsc->src_buf == NULL) {
+            if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) {
+                is_accelerated = arm_2d_fill_normal(dest_buf,
+                                                    &blend_area,
+                                                    dest_stride,
+                                                    dsc->color,
+                                                    dsc->opa,
+                                                    mask,
+                                                    mask_stride);
+            }
+        }
+        else {
+            if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) {
+                is_accelerated = arm_2d_copy_normal(dest_buf,
+                                                    &blend_area,
+                                                    dest_stride,
+                                                    src_buf,
+                                                    src_stride,
+                                                    dsc->opa,
+                                                    mask,
+                                                    mask_stride);
+            }
+        }
+    } while(0);
+
+    if(!is_accelerated) lv_draw_sw_blend_basic(draw_ctx, dsc);
+}
+
+LV_ATTRIBUTE_FAST_MEM
+static bool arm_2d_fill_normal(lv_color_t * dest_buf,
+                               const lv_area_t * dest_area,
+                               lv_coord_t dest_stride,
+                               lv_color_t color,
+                               lv_opa_t opa,
+                               const lv_opa_t * mask,
+                               lv_coord_t mask_stride)
+{
+    arm_2d_size_t target_size = {
+        .iWidth = lv_area_get_width(dest_area),
+        .iHeight = lv_area_get_height(dest_area),
+    };
+
+    /*No mask*/
+    if(mask == NULL) {
+        if(opa >= LV_OPA_MAX) {
+            __arm_2d_impl_colour_filling((color_int *)dest_buf,
+                                         dest_stride,
+                                         &target_size,
+                                         color.full);
+        }
+        /*Has opacity*/
+        else {
+            __arm_2d_impl_colour_filling_with_opacity((color_int *)dest_buf,
+                                                      dest_stride,
+                                                      &target_size,
+                                                      color.full,
+                                                      opa);
+        }
+    }
+    /*Masked*/
+    else {
+        /*Only the mask matters*/
+        if(opa >= LV_OPA_MAX) {
+            __arm_2d_impl_colour_filling_mask((color_int *)dest_buf,
+                                              dest_stride,
+                                              (uint8_t *)mask,
+                                              mask_stride,
+                                              &target_size,
+                                              color.full);
+        }
+        /*With opacity*/
+        else {
+            __arm_2d_impl_colour_filling_mask_opacity((color_int *)dest_buf,
+                                                      dest_stride,
+                                                      (uint8_t *)mask,
+                                                      mask_stride,
+                                                      &target_size,
+                                                      color.full,
+                                                      opa);
+        }
+    }
+
+    return true;
+}
+
+
+LV_ATTRIBUTE_FAST_MEM
+static bool arm_2d_copy_normal(lv_color_t * dest_buf,
+                               const lv_area_t * dest_area,
+                               lv_coord_t dest_stride,
+                               const lv_color_t * src_buf,
+                               lv_coord_t src_stride,
+                               lv_opa_t opa,
+                               const lv_opa_t * mask,
+                               lv_coord_t mask_stride)
+
+{
+    int32_t w = lv_area_get_width(dest_area);
+    int32_t h = lv_area_get_height(dest_area);
+
+    arm_2d_size_t copy_size = {
+        .iWidth = lv_area_get_width(dest_area),
+        .iHeight = lv_area_get_height(dest_area),
+    };
+
+    /*Simple fill (maybe with opacity), no masking*/
+    if(mask == NULL) {
+        if(opa >= LV_OPA_MAX) {
+            __arm_2d_impl_copy((color_int *)src_buf,
+                               src_stride,
+                               (color_int *)dest_buf,
+                               dest_stride,
+                               &copy_size);
+        }
+        else {
+            __arm_2d_impl_alpha_blending((color_int *)src_buf,
+                                         src_stride,
+                                         (color_int *)dest_buf,
+                                         dest_stride,
+                                         &copy_size,
+                                         opa);
+        }
+    }
+    /*Masked*/
+    else {
+        /*Only the mask matters*/
+        if(opa > LV_OPA_MAX) {
+            __arm_2d_impl_src_msk_copy((color_int *)src_buf,
+                                       src_stride,
+                                       (uint8_t *)mask,
+                                       mask_stride,
+                                       &copy_size,
+                                       (color_int *)dest_buf,
+                                       dest_stride,
+                                       &copy_size);
+        }
+        /*Handle opa and mask values too*/
+        else {
+            __arm_2d_impl_gray8_alpha_blending((uint8_t *)mask,
+                                               mask_stride,
+                                               (uint8_t *)mask,
+                                               mask_stride,
+                                               &copy_size,
+                                               opa);
+
+            __arm_2d_impl_src_msk_copy((color_int *)src_buf,
+                                       src_stride,
+                                       (uint8_t *)mask,
+                                       mask_stride,
+                                       &copy_size,
+                                       (color_int *)dest_buf,
+                                       dest_stride,
+                                       &copy_size);
+        }
+    }
+
+    return true;
+}
+
+LV_ATTRIBUTE_FAST_MEM
+static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx,
+                                      const lv_draw_img_dsc_t * draw_dsc,
+                                      const lv_area_t * coords,
+                                      const uint8_t * src_buf,
+                                      lv_img_cf_t cf)
+{
+    /*Use the clip area as draw area*/
+    lv_area_t draw_area;
+    lv_area_copy(&draw_area, draw_ctx->clip_area);
+    const uint8_t * src_buf_org = src_buf;
+
+    bool mask_any = lv_draw_mask_is_any(&draw_area);
+    bool transform = draw_dsc->angle != 0 || draw_dsc->zoom != LV_IMG_ZOOM_NONE ? true : false;
+
+    lv_area_t blend_area;
+    lv_draw_sw_blend_dsc_t blend_dsc;
+
+    lv_memset_00(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t));
+    blend_dsc.opa = draw_dsc->opa;
+    blend_dsc.blend_mode = draw_dsc->blend_mode;
+    blend_dsc.blend_area = &blend_area;
+
+    if(lv_img_cf_is_chroma_keyed(cf)) cf = LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED;
+    else if(cf == LV_IMG_CF_ALPHA_8BIT) {}
+    else if(cf == LV_IMG_CF_RGB565A8) {}
+    else if(lv_img_cf_has_alpha(cf)) cf = LV_IMG_CF_TRUE_COLOR_ALPHA;
+    else cf = LV_IMG_CF_TRUE_COLOR;
+
+
+    /*The simplest case just copy the pixels into the draw_buf*/
+    if(!mask_any && !transform && cf == LV_IMG_CF_TRUE_COLOR && draw_dsc->recolor_opa == LV_OPA_TRANSP) {
+        blend_dsc.src_buf = (const lv_color_t *)src_buf;
+
+        blend_dsc.blend_area = coords;
+        lv_draw_sw_blend(draw_ctx, &blend_dsc);
+    }
+    else if(!mask_any && !transform && cf == LV_IMG_CF_ALPHA_8BIT) {
+        lv_area_t clipped_coords;
+        if(!_lv_area_intersect(&clipped_coords, coords, draw_ctx->clip_area)) return;
+
+        blend_dsc.mask_buf = (lv_opa_t *)src_buf;
+        blend_dsc.mask_area = coords;
+        blend_dsc.src_buf = NULL;
+        blend_dsc.color = draw_dsc->recolor;
+        blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
+
+        blend_dsc.blend_area = coords;
+        lv_draw_sw_blend(draw_ctx, &blend_dsc);
+    }
+#if LV_COLOR_DEPTH == 16
+    else if(!mask_any && !transform && cf == LV_IMG_CF_RGB565A8 && draw_dsc->recolor_opa == LV_OPA_TRANSP &&
+            blend_dsc.opa >= LV_OPA_MAX) {
+        lv_coord_t src_w = lv_area_get_width(coords);
+        lv_coord_t src_h = lv_area_get_height(coords);
+        blend_dsc.src_buf = (const lv_color_t *)src_buf;
+        blend_dsc.mask_buf = (lv_opa_t *)src_buf;
+        blend_dsc.mask_buf += sizeof(lv_color_t) * src_w * src_h;
+        blend_dsc.blend_area = coords;
+        blend_dsc.mask_area = coords;
+        blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
+        lv_draw_sw_blend(draw_ctx, &blend_dsc);
+    }
+#endif
+    /*In the other cases every pixel need to be checked one-by-one*/
+    else {
+        blend_area.x1 = draw_ctx->clip_area->x1;
+        blend_area.x2 = draw_ctx->clip_area->x2;
+        blend_area.y1 = draw_ctx->clip_area->y1;
+        blend_area.y2 = draw_ctx->clip_area->y2;
+
+        lv_coord_t src_w = lv_area_get_width(coords);
+        lv_coord_t src_h = lv_area_get_height(coords);
+        lv_coord_t blend_h = lv_area_get_height(&blend_area);
+        lv_coord_t blend_w = lv_area_get_width(&blend_area);
+
+        uint32_t max_buf_size = MAX_BUF_SIZE;
+        uint32_t blend_size = lv_area_get_size(&blend_area);
+        uint32_t buf_h;
+        uint32_t buf_w = blend_w;
+        if(blend_size <= max_buf_size) {
+            buf_h = blend_h;
+        }
+        else {
+            /*Round to full lines*/
+            buf_h = max_buf_size / blend_w;
+        }
+
+        /*Create buffers and masks*/
+        uint32_t buf_size = buf_w * buf_h;
+
+        lv_color_t * rgb_buf = lv_mem_buf_get(buf_size * sizeof(lv_color_t));
+        lv_opa_t * mask_buf = lv_mem_buf_get(buf_size);
+        blend_dsc.mask_buf = mask_buf;
+        blend_dsc.mask_area = &blend_area;
+        blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
+        blend_dsc.src_buf = rgb_buf;
+        lv_coord_t y_last = blend_area.y2;
+        blend_area.y2 = blend_area.y1 + buf_h - 1;
+
+        lv_draw_mask_res_t mask_res_def = (cf != LV_IMG_CF_TRUE_COLOR || draw_dsc->angle ||
+                                           draw_dsc->zoom != LV_IMG_ZOOM_NONE) ?
+                                          LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER;
+        blend_dsc.mask_res = mask_res_def;
+
+        if(cf == LV_IMG_CF_ALPHA_8BIT) {
+            /* original code:
+               lv_color_fill(rgb_buf, draw_dsc->recolor, buf_size);
+             */
+            arm_2d_size_t copy_size = {
+                .iWidth = buf_w,
+                .iHeight = buf_h,
+            };
+
+            /* apply re-colour */
+            __arm_2d_impl_colour_filling(
+                (color_int *)rgb_buf,
+                buf_w,
+                &copy_size,
+                (color_int)draw_dsc->recolor.full);
+        }
+
+        bool is_accelerated = false;
+
+        if(!transform) {
+            if(LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf)  {
+                /* copy with colour keying */
+
+                /* *INDENT-OFF* */
+                __RECOLOUR_WRAPPER(
+
+                    lv_color_t chrome_key = LV_COLOR_CHROMA_KEY;
+                    /* calculate new chrome-key colour */
+                    if(draw_dsc->recolor_opa > LV_OPA_MIN) {
+                    __ARM_2D_PIXEL_BLENDING_OPA(
+                        (color_int *) & (draw_dsc->recolor.full),
+                        (color_int *) & (chrome_key.full),
+                        draw_dsc->recolor_opa
+                    );
+                    }
+
+                    __PREPARE_LL_ACCELERATION__();
+
+                    if(blend_dsc.opa >= LV_OPA_MAX) {
+                    __arm_2d_impl_cl_key_copy(
+                        (color_int *)src_buf_tmp,
+                        src_stride,
+                        (color_int *)dest_buf,
+                        dest_stride,
+                        &copy_size,
+                        (color_int)chrome_key.full);
+                    }
+                    else {
+                        __arm_2d_impl_alpha_blending_colour_keying(
+                            (color_int *)src_buf_tmp,
+                            src_stride,
+                            (color_int *)dest_buf,
+                            dest_stride,
+                            &copy_size,
+                            blend_dsc.opa,
+                            (color_int)chrome_key.full);
+                    }
+                    is_accelerated = true;
+                )
+                /* *INDENT-ON* */
+            }
+            else if((LV_COLOR_DEPTH == 32)
+                    &&     !mask_any
+                    && (LV_IMG_CF_TRUE_COLOR_ALPHA == cf)) {
+                /* accelerate copy-with-source-masks-and-opacity */
+
+                /* *INDENT-OFF* */
+                __RECOLOUR_WRAPPER(
+                    __PREPARE_LL_ACCELERATION__();
+
+                    uint8_t * mask_temp_buf = NULL;
+                    if(blend_dsc.opa < LV_OPA_MAX) {
+                        mask_temp_buf = lv_mem_buf_get(copy_size.iHeight * copy_size.iWidth);
+                        if(NULL == mask_temp_buf) {
+                            LV_LOG_WARN(
+                                "Failed to allocate memory for alpha mask,"
+                                " use normal route instead.");
+                            break;
+                        }
+                        lv_memset_00(mask_temp_buf, copy_size.iHeight * copy_size.iWidth);
+
+                        __arm_2d_impl_gray8_colour_filling_channel_mask_opacity(
+                            mask_temp_buf,
+                            src_stride,
+                            (uint32_t *)
+                            ((uintptr_t)src_buf_tmp + LV_IMG_PX_SIZE_ALPHA_BYTE - 1),
+                            src_stride,
+                            &copy_size,
+                            0xFF,
+                            blend_dsc.opa);
+
+                        __arm_2d_impl_src_msk_copy(
+                            (color_int *)src_buf_tmp,
+                            src_stride,
+                            mask_temp_buf,
+                            src_stride,
+                            &copy_size,
+                            (color_int *)dest_buf,
+                            dest_stride,
+                            &copy_size);
+
+                        lv_mem_buf_release(mask_temp_buf);
+                    }
+                    else {
+                        __arm_2d_impl_src_chn_msk_copy(
+                            (color_int *)src_buf_tmp,
+                            src_stride,
+                            (uint32_t *)
+                            ((uintptr_t)src_buf_tmp + LV_IMG_PX_SIZE_ALPHA_BYTE - 1),
+                            src_stride,
+                            &copy_size,
+                            (color_int *)dest_buf,
+                            dest_stride,
+                            &copy_size);
+                    }
+
+                    is_accelerated = true;
+                )
+                /* *INDENT-ON* */
+            }
+            else if(!mask_any
+                    && (LV_IMG_CF_RGB565A8 == cf)) {
+                /* accelerate copy-with-source-masks-and-opacity */
+
+                uint8_t * mask_after_rgb = src_buf + sizeof(lv_color_t) * src_w * src_h;
+                /* *INDENT-OFF* */
+                __RECOLOUR_WRAPPER(
+                    __PREPARE_LL_ACCELERATION__();
+
+                    uint8_t * mask_temp_buf = NULL;
+                    if(blend_dsc.opa < LV_OPA_MAX) {
+                        mask_temp_buf = lv_mem_buf_get(copy_size.iHeight * copy_size.iWidth);
+                        if(NULL == mask_temp_buf) {
+                            LV_LOG_WARN(
+                                "Failed to allocate memory for alpha mask,"
+                                " use normal route instead.");
+                            break;
+                        }
+                        lv_memset_00(mask_temp_buf, copy_size.iHeight * copy_size.iWidth);
+
+                        __arm_2d_impl_gray8_colour_filling_mask_opacity(
+                            mask_temp_buf,
+                            src_stride,
+                            mask_after_rgb,
+                            src_stride,
+                            &copy_size,
+                            0xFF,
+                            blend_dsc.opa);
+
+                        __arm_2d_impl_src_msk_copy(
+                            (color_int *)src_buf_tmp,
+                            src_stride,
+                            mask_temp_buf,
+                            src_stride,
+                            &copy_size,
+                            (color_int *)dest_buf,
+                            dest_stride,
+                            &copy_size);
+
+                        lv_mem_buf_release(mask_temp_buf);
+                    }
+                    else {
+                        __arm_2d_impl_src_msk_copy(
+                            (color_int *)src_buf_tmp,
+                            src_stride,
+                            mask_after_rgb,
+                            src_stride,
+                            &copy_size,
+                            (color_int *)dest_buf,
+                            dest_stride,
+                            &copy_size);
+                    }
+
+                    is_accelerated = true;
+                )
+                /* *INDENT-ON* */
+            }
+            else if(!mask_any && (cf == LV_IMG_CF_TRUE_COLOR)) {
+                /* accelerate copy-with-source-masks-and-opacity */
+
+                /* *INDENT-OFF* */
+                __RECOLOUR_WRAPPER(
+                    __PREPARE_LL_ACCELERATION__();
+
+                    if(blend_dsc.opa >= LV_OPA_MAX) {
+                    __arm_2d_impl_copy(
+                        (color_int *)src_buf_tmp,
+                        src_stride,
+                        (color_int *)dest_buf,
+                        dest_stride,
+                        &copy_size);
+                    }
+                    else {
+                        __arm_2d_impl_alpha_blending(
+                            (color_int *)src_buf_tmp,
+                            src_stride,
+                            (color_int *)dest_buf,
+                            dest_stride,
+                            &copy_size,
+                            blend_dsc.opa);
+                    }
+                    is_accelerated = true;
+                )
+                /* *INDENT-ON* */
+            }
+        }
+        else if(!mask_any
+#if defined(__ARM_2D_HAS_ANTI_ALIAS_TRANSFORM__) && __ARM_2D_HAS_ANTI_ALIAS_TRANSFORM__
+                && (draw_dsc->antialias == 1)
+#else
+                && (draw_dsc->antialias == 0)
+#endif
+                && (draw_dsc->recolor_opa == LV_OPA_TRANSP)
+                && (((LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf)
+                     || (LV_IMG_CF_TRUE_COLOR == cf))
+                    || (LV_IMG_CF_RGB565A8 == cf)
+#if defined(__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__) &&  __ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__
+                    || ((LV_IMG_CF_TRUE_COLOR_ALPHA == cf)
+                        && (LV_COLOR_DEPTH == 32))
+#endif
+                   )
+               ) {
+
+            uint8_t * mask_after_rgb = src_buf + sizeof(lv_color_t) * src_w * src_h;
+            /* *INDENT-OFF* */
+            __RECOLOUR_WRAPPER(
+                /* accelerate transform without re-color */
+
+                static arm_2d_tile_t target_tile_origin;
+                static arm_2d_tile_t target_tile;
+                arm_2d_region_t clip_region;
+                static arm_2d_region_t target_region;
+
+                lv_color_t * dest_buf = draw_ctx->buf;
+
+                target_tile_origin = (arm_2d_tile_t) {
+                    .tRegion = {
+                        .tSize = {
+                            .iWidth = lv_area_get_width(draw_ctx->buf_area),
+                            .iHeight = lv_area_get_height(draw_ctx->buf_area),
+                        },
+                    },
+                    .tInfo.bIsRoot = true,
+                    .phwBuffer = (uint16_t *)draw_ctx->buf,
+                };
+
+                clip_region = (arm_2d_region_t) {
+                    .tLocation = {
+                        .iX = draw_ctx->clip_area->x1 - draw_ctx->buf_area->x1,
+                        .iY = draw_ctx->clip_area->y1 - draw_ctx->buf_area->y1,
+                    },
+                    .tSize = {
+                        .iWidth = lv_area_get_width(draw_ctx->clip_area),
+                        .iHeight = lv_area_get_height(draw_ctx->clip_area),
+                    },
+                };
+
+                arm_2d_tile_generate_child(&target_tile_origin,
+                                           &clip_region,
+                                           &target_tile,
+                                           false);
+
+                static arm_2d_tile_t source_tile;
+
+                source_tile = (arm_2d_tile_t) {
+                    .tRegion = {
+                        .tSize = {
+                            .iWidth = src_w,
+                            .iHeight = src_h,
+                        },
+                    },
+                    .tInfo.bIsRoot = true,
+                    .pchBuffer = (uint8_t *)src_buf,
+                };
+
+                static arm_2d_location_t source_center, target_center;
+                source_center.iX = draw_dsc->pivot.x;
+                source_center.iY = draw_dsc->pivot.y;
+
+                if(LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf) {
+
+                    __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION(
+                        arm_2d_tile_transform_with_opacity_prepare,
+                        &source_tile,
+                        source_center,
+                        ARM_2D_ANGLE((draw_dsc->angle / 10.0f)),
+                        draw_dsc->zoom / 256.0f,
+                        (color_int)LV_COLOR_CHROMA_KEY.full,
+                        blend_dsc.opa);
+
+                    arm_2d_tile_transform(
+                        &target_tile,
+                        &target_region,
+                        NULL
+                    );
+                    is_accelerated = true;
+                }
+    #if ARM_2D_VERISON >= 10103
+                else if (LV_IMG_CF_TRUE_COLOR == cf) {
+                    __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION(
+                        arm_2d_tile_transform_only_with_opacity_prepare,
+                        &source_tile,
+                        source_center,
+                        ARM_2D_ANGLE((draw_dsc->angle / 10.0f)),
+                        draw_dsc->zoom / 256.0f,
+                        blend_dsc.opa);
+
+                    arm_2d_tile_transform(
+                        &target_tile,
+                        &target_region,
+                        NULL
+                    );
+                    is_accelerated = true;
+                }
+    #endif
+                else if (LV_IMG_CF_RGB565A8 == cf) {
+                    static arm_2d_tile_t mask_tile;
+                    mask_tile = source_tile;
+
+                    mask_tile.tInfo.bHasEnforcedColour = true;
+                    mask_tile.tInfo.tColourInfo.chScheme = ARM_2D_COLOUR_GRAY8;
+                    mask_tile.pchBuffer = mask_after_rgb;
+
+                    __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION(
+                        arm_2d_tile_transform_with_src_mask_and_opacity_prepare,
+                        &source_tile,
+                        &mask_tile,
+                        source_center,
+                        ARM_2D_ANGLE((draw_dsc->angle / 10.0f)),
+                        draw_dsc->zoom / 256.0f,
+                        blend_dsc.opa
+                        );
+
+                    arm_2d_tile_transform(
+                        &target_tile,
+                        &target_region,
+                        NULL
+                    );
+
+                    is_accelerated = true;
+                }
+    #if defined(__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__)          \
+                &&  __ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__
+                else if((LV_IMG_CF_TRUE_COLOR_ALPHA == cf) &&
+                        (LV_COLOR_DEPTH == 32)) {
+                    static arm_2d_tile_t mask_tile;
+                    mask_tile = source_tile;
+
+                    mask_tile.tInfo.bHasEnforcedColour = true;
+                    mask_tile.tInfo.tColourInfo.chScheme = ARM_2D_CHANNEL_8in32;
+                    mask_tile.pchBuffer += 3;
+
+                    __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION(
+                        arm_2d_tile_transform_with_src_mask_and_opacity_prepare,
+                        &source_tile,
+                        &mask_tile,
+                        source_center,
+                        ARM_2D_ANGLE((draw_dsc->angle / 10.0f)),
+                        draw_dsc->zoom / 256.0f,
+                        blend_dsc.opa
+                        );
+
+                    arm_2d_tile_transform(
+                        &target_tile,
+                        &target_region,
+                        NULL
+                    );
+
+                    is_accelerated = true;
+                }
+    #endif
+            )
+            /* *INDENT-ON* */
+        }
+
+        /* *INDENT-OFF* */
+        if(!is_accelerated) while(blend_area.y1 <= y_last) {
+            /*Apply transformations if any or separate the channels*/
+            lv_area_t transform_area;
+            lv_area_copy(&transform_area, &blend_area);
+            lv_area_move(&transform_area, -coords->x1, -coords->y1);
+            if(transform) {
+                lv_draw_transform(draw_ctx, &transform_area, src_buf, src_w, src_h, src_w,
+                                  draw_dsc, cf, rgb_buf, mask_buf);
+            }
+            else {
+                convert_cb(&transform_area, src_buf, src_w, src_h, src_w, draw_dsc, cf, rgb_buf, mask_buf);
+            }
+
+            /*Apply recolor*/
+            if(draw_dsc->recolor_opa > LV_OPA_MIN) {
+                arm_2d_size_t copy_size = {
+                    .iWidth = buf_w,
+                    .iHeight = buf_h,
+                };
+
+                /* apply re-colour */
+                __arm_2d_impl_colour_filling_with_opacity(
+                    (color_int *)rgb_buf,
+                    buf_w,
+                    &copy_size,
+                    (color_int)draw_dsc->recolor.full,
+                    draw_dsc->recolor_opa);
+            }
+#if LV_USE_DRAW_MASKS
+            /*Apply the masks if any*/
+            if(mask_any) {
+                lv_coord_t y;
+                lv_opa_t * mask_buf_tmp = mask_buf;
+                for(y = blend_area.y1; y <= blend_area.y2; y++) {
+                    lv_draw_mask_res_t mask_res_line;
+                    mask_res_line = lv_draw_mask_apply(mask_buf_tmp, blend_area.x1, y, blend_w);
+
+                    if(mask_res_line == LV_DRAW_MASK_RES_TRANSP) {
+                        lv_memset_00(mask_buf_tmp, blend_w);
+                        blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
+                    }
+                    else if(mask_res_line == LV_DRAW_MASK_RES_CHANGED) {
+                        blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
+                    }
+                    mask_buf_tmp += blend_w;
+                }
+            }
+#endif
+
+            /*Blend*/
+            lv_draw_sw_blend(draw_ctx, &blend_dsc);
+
+            /*Go the the next lines*/
+            blend_area.y1 = blend_area.y2 + 1;
+            blend_area.y2 = blend_area.y1 + buf_h - 1;
+            if(blend_area.y2 > y_last) blend_area.y2 = y_last;
+        }
+
+        lv_mem_buf_release(mask_buf);
+        lv_mem_buf_release(rgb_buf);
+    }
+}
+
+static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx)
+{
+    lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+
+    arm_2d_op_wait_async(NULL);
+    if(disp->driver && disp->driver->wait_cb) {
+        disp->driver->wait_cb(disp->driver);
+    }
+    lv_draw_sw_wait_for_finish(draw_ctx);
+}
+
+
+#endif
+
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+/* Separate the image channels to RGB and Alpha to match LV_COLOR_DEPTH settings*/
+static void convert_cb(const lv_area_t * dest_area, const void * src_buf, lv_coord_t src_w, lv_coord_t src_h,
+                       lv_coord_t src_stride, const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf)
+{
+    LV_UNUSED(draw_dsc);
+    LV_UNUSED(src_h);
+    LV_UNUSED(src_w);
+
+    const uint8_t * src_tmp8 = (const uint8_t *)src_buf;
+    lv_coord_t y;
+    lv_coord_t x;
+
+    if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) {
+        uint32_t px_cnt = lv_area_get_size(dest_area);
+        lv_memset(abuf, 0xff, px_cnt);
+
+        src_tmp8 += (src_stride * dest_area->y1 * sizeof(lv_color_t)) + dest_area->x1 * sizeof(lv_color_t);
+        uint32_t dest_w = lv_area_get_width(dest_area);
+        uint32_t dest_w_byte = dest_w * sizeof(lv_color_t);
+
+        lv_coord_t src_stride_byte = src_stride * sizeof(lv_color_t);
+        lv_color_t * cbuf_tmp = cbuf;
+        for(y = dest_area->y1; y <= dest_area->y2; y++) {
+            lv_memcpy(cbuf_tmp, src_tmp8, dest_w_byte);
+            src_tmp8 += src_stride_byte;
+            cbuf_tmp += dest_w;
+        }
+
+        /*Make "holes" for with Chroma keying*/
+        if(cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) {
+            uint32_t i;
+            lv_color_t chk = LV_COLOR_CHROMA_KEY;
+#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1
+            uint8_t * cbuf_uint = (uint8_t *)cbuf;
+            uint8_t chk_v = chk.full;
+#elif LV_COLOR_DEPTH == 16
+            uint16_t * cbuf_uint = (uint16_t *)cbuf;
+            uint16_t chk_v = chk.full;
+#elif LV_COLOR_DEPTH == 32
+            uint32_t * cbuf_uint = (uint32_t *)cbuf;
+            uint32_t chk_v = chk.full;
+#endif
+            for(i = 0; i < px_cnt; i++) {
+                if(chk_v == cbuf_uint[i]) abuf[i] = 0x00;
+            }
+        }
+    }
+    else if(cf == LV_IMG_CF_TRUE_COLOR_ALPHA) {
+        src_tmp8 += (src_stride * dest_area->y1 * LV_IMG_PX_SIZE_ALPHA_BYTE) + dest_area->x1 * LV_IMG_PX_SIZE_ALPHA_BYTE;
+
+        lv_coord_t src_new_line_step_px = (src_stride - lv_area_get_width(dest_area));
+        lv_coord_t src_new_line_step_byte = src_new_line_step_px * LV_IMG_PX_SIZE_ALPHA_BYTE;
+
+        lv_coord_t dest_h = lv_area_get_height(dest_area);
+        lv_coord_t dest_w = lv_area_get_width(dest_area);
+        for(y = 0; y < dest_h; y++) {
+            for(x = 0; x < dest_w; x++) {
+                abuf[x] = src_tmp8[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
+#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1
+                cbuf[x].full = *src_tmp8;
+#elif LV_COLOR_DEPTH == 16
+                cbuf[x].full = *src_tmp8 + ((*(src_tmp8 + 1)) << 8);
+#elif LV_COLOR_DEPTH == 32
+                cbuf[x] = *((lv_color_t *) src_tmp8);
+                cbuf[x].ch.alpha = 0xff;
+#endif
+                src_tmp8 += LV_IMG_PX_SIZE_ALPHA_BYTE;
+
+            }
+            cbuf += dest_w;
+            abuf += dest_w;
+            src_tmp8 += src_new_line_step_byte;
+        }
+    }
+    else if(cf == LV_IMG_CF_RGB565A8) {
+        src_tmp8 += (src_stride * dest_area->y1 * sizeof(lv_color_t)) + dest_area->x1 * sizeof(lv_color_t);
+
+        lv_coord_t src_stride_byte = src_stride * sizeof(lv_color_t);
+
+        lv_coord_t dest_h = lv_area_get_height(dest_area);
+        lv_coord_t dest_w = lv_area_get_width(dest_area);
+        for(y = 0; y < dest_h; y++) {
+            lv_memcpy(cbuf, src_tmp8, dest_w * sizeof(lv_color_t));
+            cbuf += dest_w;
+            src_tmp8 += src_stride_byte;
+        }
+
+        src_tmp8 = (const uint8_t *)src_buf;
+        src_tmp8 += sizeof(lv_color_t) * src_w * src_h;
+        src_tmp8 += src_stride * dest_area->y1 + dest_area->x1;
+        for(y = 0; y < dest_h; y++) {
+            lv_memcpy(abuf, src_tmp8, dest_w);
+            abuf += dest_w;
+            src_tmp8 += src_stride;
+        }
+    }
+}
+
+#if 0
+static void invalidate_cache(void)
+{
+    lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+    if(disp->driver->clean_dcache_cb) disp->driver->clean_dcache_cb(disp->driver);
+    else {
+#if __CORTEX_M >= 0x07
+        if((SCB->CCR) & (uint32_t)SCB_CCR_DC_Msk)
+            SCB_CleanInvalidateDCache();
+#endif
+    }
+}
+#endif
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/arm2d/lv_gpu_arm2d.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/arm2d/lv_gpu_arm2d.h
new file mode 100644 (file)
index 0000000..50fa5a8
--- /dev/null
@@ -0,0 +1,51 @@
+/**
+ * @file lv_gpu_arm2d.h
+ *
+ */
+
+#ifndef LV_GPU_ARM2D_H
+#define LV_GPU_ARM2D_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../../misc/lv_color.h"
+#include "../../hal/lv_hal_disp.h"
+#include "../sw/lv_draw_sw.h"
+
+#if LV_USE_GPU_ARM2D
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+typedef lv_draw_sw_ctx_t lv_draw_arm2d_ctx_t;
+
+struct _lv_disp_drv_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+void lv_draw_arm2d_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
+
+void lv_draw_arm2d_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#endif  /*LV_USE_GPU_ARM2D*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_GPU_ARM2D_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_layer.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_layer.c
new file mode 100644 (file)
index 0000000..da35682
--- /dev/null
@@ -0,0 +1,93 @@
+/**
+ * @file lv_draw_layer.c
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "lv_draw.h"
+#include "lv_draw_arc.h"
+#include "../core/lv_refr.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+lv_draw_layer_ctx_t * lv_draw_layer_create(lv_draw_ctx_t * draw_ctx, const lv_area_t * layer_area,
+                                           lv_draw_layer_flags_t flags)
+{
+    if(draw_ctx->layer_init == NULL) return NULL;
+
+    lv_draw_layer_ctx_t * layer_ctx = lv_mem_alloc(draw_ctx->layer_instance_size);
+    LV_ASSERT_MALLOC(layer_ctx);
+    if(layer_ctx == NULL) {
+        LV_LOG_WARN("Couldn't allocate a new layer context");
+        return NULL;
+    }
+
+    lv_memset_00(layer_ctx, draw_ctx->layer_instance_size);
+
+    lv_disp_t * disp_refr = _lv_refr_get_disp_refreshing();
+    layer_ctx->original.buf = draw_ctx->buf;
+    layer_ctx->original.buf_area = draw_ctx->buf_area;
+    layer_ctx->original.clip_area = draw_ctx->clip_area;
+    layer_ctx->original.screen_transp = disp_refr->driver->screen_transp;
+    layer_ctx->area_full = *layer_area;
+
+    lv_draw_layer_ctx_t * init_layer_ctx =  draw_ctx->layer_init(draw_ctx, layer_ctx, flags);
+    if(NULL == init_layer_ctx) {
+        lv_mem_free(layer_ctx);
+    }
+    return init_layer_ctx;
+}
+
+void lv_draw_layer_adjust(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+                          lv_draw_layer_flags_t flags)
+{
+    if(draw_ctx->layer_adjust) draw_ctx->layer_adjust(draw_ctx, layer_ctx, flags);
+}
+
+void lv_draw_layer_blend(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+                         lv_draw_img_dsc_t * draw_dsc)
+{
+    if(draw_ctx->layer_blend) draw_ctx->layer_blend(draw_ctx, layer_ctx, draw_dsc);
+}
+
+void lv_draw_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx)
+{
+
+    lv_draw_wait_for_finish(draw_ctx);
+    draw_ctx->buf = layer_ctx->original.buf;
+    draw_ctx->buf_area = layer_ctx->original.buf_area;
+    draw_ctx->clip_area = layer_ctx->original.clip_area;
+    lv_disp_t * disp_refr = _lv_refr_get_disp_refreshing();
+    disp_refr->driver->screen_transp = layer_ctx->original.screen_transp;
+
+    if(draw_ctx->layer_destroy) draw_ctx->layer_destroy(draw_ctx, layer_ctx);
+    lv_mem_free(layer_ctx);
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_layer.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_layer.h
new file mode 100644 (file)
index 0000000..cd64149
--- /dev/null
@@ -0,0 +1,83 @@
+/**
+ * @file lv_draw_layer.h
+ *
+ */
+
+#ifndef LV_DRAW_LAYER_H
+#define LV_DRAW_LAYER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../lv_conf_internal.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+struct _lv_draw_ctx_t;
+struct _lv_draw_layer_ctx_t;
+
+typedef enum {
+    LV_DRAW_LAYER_FLAG_NONE,
+    LV_DRAW_LAYER_FLAG_HAS_ALPHA,
+    LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE,
+} lv_draw_layer_flags_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Create a new layer context. It is used to start and independent rendering session
+ * with the current draw_ctx
+ * @param draw_ctx      pointer to the current draw context
+ * @param layer_area    the coordinates of the layer
+ * @param flags         OR-ed flags from @lv_draw_layer_flags_t
+ * @return              pointer to the layer context, or NULL on error
+ */
+struct _lv_draw_layer_ctx_t * lv_draw_layer_create(struct _lv_draw_ctx_t * draw_ctx, const lv_area_t * layer_area,
+                                                   lv_draw_layer_flags_t flags);
+
+/**
+ * Adjust the layer_ctx and/or draw_ctx based on the `layer_ctx->area_act`.
+ * It's called only if flags has `LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE`
+ * @param draw_ctx      pointer to the current draw context
+ * @param layer_ctx     pointer to a layer context
+ * @param flags         OR-ed flags from @lv_draw_layer_flags_t
+ */
+void lv_draw_layer_adjust(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+                          lv_draw_layer_flags_t flags);
+
+/**
+ * Blend a rendered layer to `layer_ctx->area_act`
+ * @param draw_ctx      pointer to the current draw context
+ * @param layer_ctx     pointer to a layer context
+ * @param draw_dsc      pointer to an image draw descriptor
+ */
+void lv_draw_layer_blend(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+                         lv_draw_img_dsc_t * draw_dsc);
+
+/**
+ * Destroy a layer context.
+ * @param draw_ctx      pointer to the current draw context
+ * @param layer_ctx     pointer to a layer context
+ */
+void lv_draw_layer_destroy(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_DRAW_LAYER_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_transform.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_transform.c
new file mode 100644 (file)
index 0000000..580351d
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+ * @file lv_draw_transform.c
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "lv_draw.h"
+#include "lv_draw_transform.h"
+#include "../misc/lv_assert.h"
+#include "../misc/lv_area.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+void lv_draw_transform(lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, const void * src_buf, lv_coord_t src_w,
+                       lv_coord_t src_h,
+                       lv_coord_t src_stride, const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf)
+{
+    LV_ASSERT_NULL(draw_ctx);
+    if(draw_ctx->draw_transform == NULL) {
+        LV_LOG_WARN("draw_ctx->draw_transform == NULL");
+        return;
+    }
+
+    draw_ctx->draw_transform(draw_ctx, dest_area, src_buf, src_w, src_h, src_stride, draw_dsc, cf, cbuf, abuf);
+
+}
+
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_transform.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_transform.h
new file mode 100644 (file)
index 0000000..1926c2f
--- /dev/null
@@ -0,0 +1,44 @@
+/**
+ * @file lv_draw_transform.h
+ *
+ */
+
+#ifndef LV_DRAW_TRANSFORM_H
+#define LV_DRAW_TRANSFORM_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../lv_conf_internal.h"
+#include "../misc/lv_area.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+struct _lv_draw_ctx_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+void lv_draw_transform(struct _lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, const void * src_buf,
+                       lv_coord_t src_w, lv_coord_t src_h,
+                       lv_coord_t src_stride, const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_DRAW_TRANSFORM_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/lv_draw_nxp.mk b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/lv_draw_nxp.mk
new file mode 100644 (file)
index 0000000..18a751e
--- /dev/null
@@ -0,0 +1,7 @@
+DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp
+VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp
+
+CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp"
+
+include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk
+include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk
new file mode 100644 (file)
index 0000000..5c684bc
--- /dev/null
@@ -0,0 +1,9 @@
+CSRCS += lv_draw_pxp.c
+CSRCS += lv_draw_pxp_blend.c
+CSRCS += lv_gpu_nxp_pxp_osa.c
+CSRCS += lv_gpu_nxp_pxp.c
+
+DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/pxp
+VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/pxp
+
+CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/pxp"
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c
new file mode 100644 (file)
index 0000000..cd70f48
--- /dev/null
@@ -0,0 +1,275 @@
+/**
+ * @file lv_draw_pxp.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2022, 2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "lv_draw_pxp.h"
+
+#if LV_USE_GPU_NXP_PXP
+#include "lv_draw_pxp_blend.h"
+
+#if LV_COLOR_DEPTH != 32
+    #include "../../../core/lv_refr.h"
+#endif
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/* Minimum area (in pixels) for PXP blit/fill processing. */
+#ifndef LV_GPU_NXP_PXP_SIZE_LIMIT
+    #define LV_GPU_NXP_PXP_SIZE_LIMIT 5000
+#endif
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+static void lv_draw_pxp_wait_for_finish(lv_draw_ctx_t * draw_ctx);
+
+static void lv_draw_pxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc);
+
+static void lv_draw_pxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc,
+                                    const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf);
+
+static void lv_draw_pxp_buffer_copy(lv_draw_ctx_t * draw_ctx,
+                                    void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area,
+                                    void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+void lv_draw_pxp_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
+{
+    lv_draw_sw_init_ctx(drv, draw_ctx);
+
+    lv_draw_pxp_ctx_t * pxp_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx;
+    pxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_pxp_img_decoded;
+    pxp_draw_ctx->blend = lv_draw_pxp_blend;
+    pxp_draw_ctx->base_draw.wait_for_finish = lv_draw_pxp_wait_for_finish;
+    pxp_draw_ctx->base_draw.buffer_copy = lv_draw_pxp_buffer_copy;
+}
+
+void lv_draw_pxp_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
+{
+    lv_draw_sw_deinit_ctx(drv, draw_ctx);
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+/**
+ * During rendering, LVGL might initializes new draw_ctxs and start drawing into
+ * a separate buffer (called layer). If the content to be rendered has "holes",
+ * e.g. rounded corner, LVGL temporarily sets the disp_drv.screen_transp flag.
+ * It means the renderers should draw into an ARGB buffer.
+ * With 32 bit color depth it's not a big problem but with 16 bit color depth
+ * the target pixel format is ARGB8565 which is not supported by the GPU.
+ * In this case, the PXP callbacks should fallback to SW rendering.
+ */
+static inline bool need_argb8565_support()
+{
+#if LV_COLOR_DEPTH != 32
+    lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+
+    if(disp->driver->screen_transp == 1)
+        return true;
+#endif
+
+    return false;
+}
+
+static void lv_draw_pxp_wait_for_finish(lv_draw_ctx_t * draw_ctx)
+{
+    lv_gpu_nxp_pxp_wait();
+
+    lv_draw_sw_wait_for_finish(draw_ctx);
+}
+
+static void lv_draw_pxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc)
+{
+    if(dsc->opa <= (lv_opa_t)LV_OPA_MIN)
+        return;
+
+    if(need_argb8565_support()) {
+        lv_draw_sw_blend_basic(draw_ctx, dsc);
+        return;
+    }
+
+    lv_area_t blend_area;
+    /*Let's get the blend area which is the intersection of the area to draw and the clip area*/
+    if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area))
+        return; /*Fully clipped, nothing to do*/
+
+    /*Make the blend area relative to the buffer*/
+    lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+    if(dsc->mask_buf != NULL || dsc->blend_mode != LV_BLEND_MODE_NORMAL ||
+       lv_area_get_size(&blend_area) < LV_GPU_NXP_PXP_SIZE_LIMIT) {
+        lv_draw_sw_blend_basic(draw_ctx, dsc);
+        return;
+    }
+
+    /*Fill/Blend only non masked, normal blended*/
+    lv_color_t * dest_buf = draw_ctx->buf;
+    lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area);
+    const lv_color_t * src_buf = dsc->src_buf;
+
+    if(src_buf == NULL) {
+        lv_gpu_nxp_pxp_fill(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa);
+    }
+    else {
+        lv_area_t src_area;
+        src_area.x1 = blend_area.x1 - (dsc->blend_area->x1 - draw_ctx->buf_area->x1);
+        src_area.y1 = blend_area.y1 - (dsc->blend_area->y1 - draw_ctx->buf_area->y1);
+        src_area.x2 = src_area.x1 + lv_area_get_width(dsc->blend_area) - 1;
+        src_area.y2 = src_area.y1 + lv_area_get_height(dsc->blend_area) - 1;
+        lv_coord_t src_stride = lv_area_get_width(dsc->blend_area);
+
+        lv_gpu_nxp_pxp_blit(dest_buf, &blend_area, dest_stride, src_buf, &src_area, src_stride,
+                            dsc->opa, LV_DISP_ROT_NONE);
+    }
+}
+
+static void lv_draw_pxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc,
+                                    const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf)
+{
+    if(dsc->opa <= (lv_opa_t)LV_OPA_MIN)
+        return;
+
+    if(need_argb8565_support()) {
+        lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf);
+        return;
+    }
+
+    const lv_color_t * src_buf = (const lv_color_t *)map_p;
+    if(!src_buf) {
+        lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf);
+        return;
+    }
+
+    lv_area_t rel_coords;
+    lv_area_copy(&rel_coords, coords);
+    lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+    lv_area_t rel_clip_area;
+    lv_area_copy(&rel_clip_area, draw_ctx->clip_area);
+    lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+    bool has_scale = (dsc->zoom != LV_IMG_ZOOM_NONE);
+    bool has_rotation = (dsc->angle != 0);
+    bool unsup_rotation = false;
+
+    lv_area_t blend_area;
+    if(has_rotation)
+        lv_area_copy(&blend_area, &rel_coords);
+    else if(!_lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area))
+        return; /*Fully clipped, nothing to do*/
+
+    bool has_mask = lv_draw_mask_is_any(&blend_area);
+    lv_coord_t src_width = lv_area_get_width(coords);
+    lv_coord_t src_height = lv_area_get_height(coords);
+
+    if(has_rotation) {
+        /*
+         * PXP can only rotate at 90x angles.
+         */
+        if(dsc->angle % 900) {
+            PXP_LOG_TRACE("Rotation angle %d is not supported. PXP can rotate only 90x angle.", dsc->angle);
+            unsup_rotation = true;
+        }
+
+        /*
+         * PXP is set to process 16x16 blocks to optimize the system for memory
+         * bandwidth and image processing time.
+         * The output engine essentially truncates any output pixels after the
+         * desired number of pixels has been written.
+         * When rotating a source image and the output is not divisible by the block
+         * size, the incorrect pixels could be truncated and the final output image
+         * can look shifted.
+         */
+        if(src_width % 16 || src_height % 16) {
+            PXP_LOG_TRACE("Rotation is not supported for image w/o alignment to block size 16x16.");
+            unsup_rotation = true;
+        }
+    }
+
+    if(has_mask || has_scale || unsup_rotation || lv_area_get_size(&blend_area) < LV_GPU_NXP_PXP_SIZE_LIMIT
+#if LV_COLOR_DEPTH != 32
+       || lv_img_cf_has_alpha(cf)
+#endif
+      ) {
+        lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf);
+        return;
+    }
+
+    lv_color_t * dest_buf = draw_ctx->buf;
+    lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area);
+
+    lv_area_t src_area;
+    src_area.x1 = blend_area.x1 - (coords->x1 - draw_ctx->buf_area->x1);
+    src_area.y1 = blend_area.y1 - (coords->y1 - draw_ctx->buf_area->y1);
+    src_area.x2 = src_area.x1 + src_width - 1;
+    src_area.y2 = src_area.y1 + src_height - 1;
+    lv_coord_t src_stride = lv_area_get_width(coords);
+
+    lv_gpu_nxp_pxp_blit_transform(dest_buf, &blend_area, dest_stride, src_buf, &src_area, src_stride,
+                                  dsc, cf);
+}
+
+static void lv_draw_pxp_buffer_copy(lv_draw_ctx_t * draw_ctx,
+                                    void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area,
+                                    void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area)
+{
+    LV_UNUSED(draw_ctx);
+
+    if(lv_area_get_size(dest_area) < LV_GPU_NXP_PXP_SIZE_LIMIT) {
+        lv_draw_sw_buffer_copy(draw_ctx, dest_buf, dest_stride, dest_area, src_buf, src_stride, src_area);
+        return;
+    }
+
+    lv_gpu_nxp_pxp_buffer_copy(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride);
+}
+
+#endif /*LV_USE_GPU_NXP_PXP*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp.h
new file mode 100644 (file)
index 0000000..1ace3bc
--- /dev/null
@@ -0,0 +1,72 @@
+/**
+ * @file lv_draw_pxp.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2022, 2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+#ifndef LV_DRAW_PXP_H
+#define LV_DRAW_PXP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_PXP
+#include "../../sw/lv_draw_sw.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+typedef lv_draw_sw_ctx_t lv_draw_pxp_ctx_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+void lv_draw_pxp_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
+
+void lv_draw_pxp_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
+
+/**********************
+ *      MACROS
+ **********************/
+#endif /*LV_USE_GPU_NXP_PXP*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_DRAW_PXP_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.c
new file mode 100644 (file)
index 0000000..8292576
--- /dev/null
@@ -0,0 +1,573 @@
+/**
+ * @file lv_draw_pxp_blend.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2020-2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "lv_draw_pxp_blend.h"
+
+#if LV_USE_GPU_NXP_PXP
+#include "lvgl_support.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+#if LV_COLOR_16_SWAP
+    #error Color swap not implemented. Disable LV_COLOR_16_SWAP feature.
+#endif
+
+#if LV_COLOR_DEPTH == 16
+    #define PXP_OUT_PIXEL_FORMAT kPXP_OutputPixelFormatRGB565
+    #define PXP_AS_PIXEL_FORMAT kPXP_AsPixelFormatRGB565
+    #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB565
+    #define PXP_TEMP_BUF_SIZE LCD_WIDTH * LCD_HEIGHT * 2U
+#elif LV_COLOR_DEPTH == 32
+    #define PXP_OUT_PIXEL_FORMAT kPXP_OutputPixelFormatARGB8888
+    #define PXP_AS_PIXEL_FORMAT kPXP_AsPixelFormatARGB8888
+    #if (!(defined(FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT) && FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT)) && \
+        (!(defined(FSL_FEATURE_PXP_V3) && FSL_FEATURE_PXP_V3))
+        #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatARGB8888
+    #else
+        #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB888
+    #endif
+    #define PXP_TEMP_BUF_SIZE LCD_WIDTH * LCD_HEIGHT * 4U
+#elif
+    #error Only 16bit and 32bit color depth are supported. Set LV_COLOR_DEPTH to 16 or 32.
+#endif
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+static LV_ATTRIBUTE_MEM_ALIGN uint8_t temp_buf[PXP_TEMP_BUF_SIZE];
+
+/**
+ * BLock Image Transfer - copy rectangular image from src buffer to dst buffer
+ * with combination of transformation (rotation, scale, recolor) and opacity, alpha channel
+ * or color keying. This requires two steps. First step is used for transformation into
+ * a temporary buffer and the second one will handle the color format or opacity.
+ *
+ * @param[in/out] dest_buf Destination buffer
+ * @param[in] dest_area Area with relative coordinates of destination buffer
+ * @param[in] dest_stride Stride of destination buffer in pixels
+ * @param[in] src_buf Source buffer
+ * @param[in] src_area Area with relative coordinates of source buffer
+ * @param[in] src_stride Stride of source buffer in pixels
+ * @param[in] dsc Image descriptor
+ * @param[in] cf Color format
+ */
+static void lv_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+                            const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride,
+                            const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf);
+
+/**
+ * BLock Image Transfer - copy rectangular image from src buffer to dst buffer
+ * with transformation and full opacity.
+ *
+ * @param[in/out] dest_buf Destination buffer
+ * @param[in] dest_area Area with relative coordinates of destination buffer
+ * @param[in] dest_stride Stride of destination buffer in pixels
+ * @param[in] src_buf Source buffer
+ * @param[in] src_area Area with relative coordinates of source buffer
+ * @param[in] src_stride Stride of source buffer in pixels
+ * @param[in] dsc Image descriptor
+ * @param[in] cf Color format
+ */
+static void lv_pxp_blit_cover(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride,
+                              const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride,
+                              const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf);
+
+/**
+ * BLock Image Transfer - copy rectangular image from src buffer to dst buffer
+ * without transformation but handling color format or opacity.
+ *
+ * @param[in/out] dest_buf Destination buffer
+ * @param[in] dest_area Area with relative coordinates of destination buffer
+ * @param[in] dest_stride Stride of destination buffer in pixels
+ * @param[in] src_buf Source buffer
+ * @param[in] src_area Area with relative coordinates of source buffer
+ * @param[in] src_stride Stride of source buffer in pixels
+ * @param[in] dsc Image descriptor
+ * @param[in] cf Color format
+ */
+static void lv_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+                           const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride,
+                           const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+void lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+                         lv_color_t color, lv_opa_t opa)
+{
+    lv_coord_t dest_w = lv_area_get_width(dest_area);
+    lv_coord_t dest_h = lv_area_get_height(dest_area);
+
+    lv_gpu_nxp_pxp_reset();
+
+    /*OUT buffer configure*/
+    pxp_output_buffer_config_t outputConfig = {
+        .pixelFormat = PXP_OUT_PIXEL_FORMAT,
+        .interlacedMode = kPXP_OutputProgressive,
+        .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1),
+        .buffer1Addr = (uint32_t)NULL,
+        .pitchBytes = dest_stride * sizeof(lv_color_t),
+        .width = dest_w,
+        .height = dest_h
+    };
+
+    PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputConfig);
+
+    if(opa >= (lv_opa_t)LV_OPA_MAX) {
+        /*Simple color fill without opacity - AS disabled*/
+        PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U);
+
+    }
+    else {
+        /*Fill with opacity - AS used as source (same as OUT)*/
+        pxp_as_buffer_config_t asBufferConfig = {
+            .pixelFormat = PXP_AS_PIXEL_FORMAT,
+            .bufferAddr = (uint32_t)outputConfig.buffer0Addr,
+            .pitchBytes = outputConfig.pitchBytes
+        };
+
+        PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig);
+        PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U);
+    }
+
+    /*Disable PS, use as color generator*/
+    PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U);
+    PXP_SetProcessSurfaceBackGroundColor(LV_GPU_NXP_PXP_ID, lv_color_to32(color));
+
+    /**
+     * Configure Porter-Duff blending - src settings are unused for fill without opacity (opa = 0xff).
+     *
+     * Note: srcFactorMode and dstFactorMode are inverted in fsl_pxp.h:
+     * srcFactorMode is actually applied on PS alpha value
+     * dstFactorMode is actually applied on AS alpha value
+     */
+    pxp_porter_duff_config_t pdConfig = {
+        .enable = 1,
+        .dstColorMode = kPXP_PorterDuffColorNoAlpha,
+        .srcColorMode = kPXP_PorterDuffColorNoAlpha,
+        .dstGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha,
+        .srcGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha,
+        .dstFactorMode = kPXP_PorterDuffFactorStraight,
+        .srcFactorMode = (opa >= (lv_opa_t)LV_OPA_MAX) ? kPXP_PorterDuffFactorStraight : kPXP_PorterDuffFactorInversed,
+        .dstGlobalAlpha = opa,
+        .srcGlobalAlpha = opa,
+        .dstAlphaMode = kPXP_PorterDuffAlphaStraight, /*don't care*/
+        .srcAlphaMode = kPXP_PorterDuffAlphaStraight  /*don't care*/
+    };
+
+    PXP_SetPorterDuffConfig(LV_GPU_NXP_PXP_ID, &pdConfig);
+
+    lv_gpu_nxp_pxp_run();
+}
+
+void lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+                         const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride,
+                         lv_opa_t opa, lv_disp_rot_t angle)
+{
+    lv_coord_t dest_w = lv_area_get_width(dest_area);
+    lv_coord_t dest_h = lv_area_get_height(dest_area);
+    lv_coord_t src_w = lv_area_get_width(src_area);
+    lv_coord_t src_h = lv_area_get_height(src_area);
+
+    lv_gpu_nxp_pxp_reset();
+
+    /* convert rotation angle */
+    pxp_rotate_degree_t pxp_rot;
+    switch(angle) {
+        case LV_DISP_ROT_NONE:
+            pxp_rot = kPXP_Rotate0;
+            break;
+        case LV_DISP_ROT_90:
+            pxp_rot = kPXP_Rotate90;
+            break;
+        case LV_DISP_ROT_180:
+            pxp_rot = kPXP_Rotate180;
+            break;
+        case LV_DISP_ROT_270:
+            pxp_rot = kPXP_Rotate270;
+            break;
+        default:
+            pxp_rot = kPXP_Rotate0;
+            break;
+    }
+    PXP_SetRotateConfig(LV_GPU_NXP_PXP_ID, kPXP_RotateOutputBuffer, pxp_rot, kPXP_FlipDisable);
+
+    pxp_as_blend_config_t asBlendConfig = {
+        .alpha = opa,
+        .invertAlpha = false,
+        .alphaMode = kPXP_AlphaRop,
+        .ropMode = kPXP_RopMergeAs
+    };
+
+    if(opa >= (lv_opa_t)LV_OPA_MAX) {
+        /*Simple blit, no effect - Disable PS buffer*/
+        PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U);
+    }
+    else {
+        pxp_ps_buffer_config_t psBufferConfig = {
+            .pixelFormat = PXP_PS_PIXEL_FORMAT,
+            .swapByte = false,
+            .bufferAddr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1),
+            .bufferAddrU = 0U,
+            .bufferAddrV = 0U,
+            .pitchBytes = dest_stride * sizeof(lv_color_t)
+        };
+
+        asBlendConfig.alphaMode = kPXP_AlphaOverride;
+
+        PXP_SetProcessSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &psBufferConfig);
+        PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U);
+    }
+
+    /*AS buffer - source image*/
+    pxp_as_buffer_config_t asBufferConfig = {
+        .pixelFormat = PXP_AS_PIXEL_FORMAT,
+        .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_area->x1),
+        .pitchBytes = src_stride * sizeof(lv_color_t)
+    };
+    PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig);
+    PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, src_w - 1U, src_h - 1U);
+    PXP_SetAlphaSurfaceBlendConfig(LV_GPU_NXP_PXP_ID, &asBlendConfig);
+    PXP_EnableAlphaSurfaceOverlayColorKey(LV_GPU_NXP_PXP_ID, false);
+
+    /*Output buffer.*/
+    pxp_output_buffer_config_t outputBufferConfig = {
+        .pixelFormat = (pxp_output_pixel_format_t)PXP_OUT_PIXEL_FORMAT,
+        .interlacedMode = kPXP_OutputProgressive,
+        .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1),
+        .buffer1Addr = (uint32_t)0U,
+        .pitchBytes = dest_stride * sizeof(lv_color_t),
+        .width = dest_w,
+        .height = dest_h
+    };
+    PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig);
+
+    lv_gpu_nxp_pxp_run();
+}
+
+void lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride,
+                                   const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride,
+                                   const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf)
+{
+    bool has_recolor = (dsc->recolor_opa != LV_OPA_TRANSP);
+    bool has_rotation = (dsc->angle != 0);
+
+    if(has_recolor || has_rotation) {
+        if(dsc->opa >= (lv_opa_t)LV_OPA_MAX && !lv_img_cf_has_alpha(cf) && !lv_img_cf_is_chroma_keyed(cf)) {
+            lv_pxp_blit_cover(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride, dsc, cf);
+            return;
+        }
+        else {
+            /*Recolor and/or rotation with alpha or opacity is done in two steps.*/
+            lv_pxp_blit_opa(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride, dsc, cf);
+            return;
+        }
+    }
+
+    lv_pxp_blit_cf(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride, dsc, cf);
+}
+
+void lv_gpu_nxp_pxp_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+                                const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride)
+{
+    lv_coord_t src_width = lv_area_get_width(src_area);
+    lv_coord_t src_height = lv_area_get_height(src_area);
+
+    lv_gpu_nxp_pxp_reset();
+
+    const pxp_pic_copy_config_t picCopyConfig = {
+        .srcPicBaseAddr = (uint32_t)src_buf,
+        .srcPitchBytes = src_stride * sizeof(lv_color_t),
+        .srcOffsetX = src_area->x1,
+        .srcOffsetY = src_area->y1,
+        .destPicBaseAddr = (uint32_t)dest_buf,
+        .destPitchBytes = dest_stride * sizeof(lv_color_t),
+        .destOffsetX = dest_area->x1,
+        .destOffsetY = dest_area->y1,
+        .width = src_width,
+        .height = src_height,
+        .pixelFormat = PXP_AS_PIXEL_FORMAT
+    };
+
+    PXP_StartPictureCopy(LV_GPU_NXP_PXP_ID, &picCopyConfig);
+
+    lv_gpu_nxp_pxp_wait();
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+static void lv_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+                            const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride,
+                            const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf)
+{
+    lv_area_t temp_area;
+    lv_area_copy(&temp_area, dest_area);
+    lv_coord_t temp_stride = dest_stride;
+    lv_coord_t temp_w = lv_area_get_width(&temp_area);
+    lv_coord_t temp_h = lv_area_get_height(&temp_area);
+
+    /*Step 1: Transform with full opacity to temporary buffer*/
+    lv_pxp_blit_cover((lv_color_t *)temp_buf, &temp_area, temp_stride, src_buf, src_area, src_stride, dsc, cf);
+
+    /*Switch width and height if angle requires it*/
+    if(dsc->angle == 900 || dsc->angle == 2700) {
+        temp_area.x2 = temp_area.x1 + temp_h - 1;
+        temp_area.y2 = temp_area.y1 + temp_w - 1;
+    }
+
+    /*Step 2: Blit temporary result with required opacity to output*/
+    lv_pxp_blit_cf(dest_buf, &temp_area, dest_stride, (lv_color_t *)temp_buf, &temp_area, temp_stride, dsc, cf);
+}
+static void lv_pxp_blit_cover(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride,
+                              const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride,
+                              const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf)
+{
+    lv_coord_t dest_w = lv_area_get_width(dest_area);
+    lv_coord_t dest_h = lv_area_get_height(dest_area);
+    lv_coord_t src_w = lv_area_get_width(src_area);
+    lv_coord_t src_h = lv_area_get_height(src_area);
+
+    bool has_recolor = (dsc->recolor_opa != LV_OPA_TRANSP);
+    bool has_rotation = (dsc->angle != 0);
+
+    lv_point_t pivot = dsc->pivot;
+    lv_coord_t piv_offset_x;
+    lv_coord_t piv_offset_y;
+
+    lv_gpu_nxp_pxp_reset();
+
+    if(has_rotation) {
+        /*Convert rotation angle and calculate offsets caused by pivot*/
+        pxp_rotate_degree_t pxp_angle;
+        switch(dsc->angle) {
+            case 0:
+                pxp_angle = kPXP_Rotate0;
+                piv_offset_x = 0;
+                piv_offset_y = 0;
+                break;
+            case 900:
+                piv_offset_x = pivot.x + pivot.y - dest_h;
+                piv_offset_y = pivot.y - pivot.x;
+                pxp_angle = kPXP_Rotate90;
+                break;
+            case 1800:
+                piv_offset_x = 2 * pivot.x - dest_w;
+                piv_offset_y = 2 * pivot.y - dest_h;
+                pxp_angle = kPXP_Rotate180;
+                break;
+            case 2700:
+                piv_offset_x = pivot.x - pivot.y;
+                piv_offset_y = pivot.x + pivot.y - dest_w;
+                pxp_angle = kPXP_Rotate270;
+                break;
+            default:
+                piv_offset_x = 0;
+                piv_offset_y = 0;
+                pxp_angle = kPXP_Rotate0;
+        }
+        PXP_SetRotateConfig(LV_GPU_NXP_PXP_ID, kPXP_RotateOutputBuffer, pxp_angle, kPXP_FlipDisable);
+        lv_area_move(dest_area, piv_offset_x, piv_offset_y);
+    }
+
+    /*AS buffer - source image*/
+    pxp_as_buffer_config_t asBufferConfig = {
+        .pixelFormat = PXP_AS_PIXEL_FORMAT,
+        .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_area->x1),
+        .pitchBytes = src_stride * sizeof(lv_color_t)
+    };
+    PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig);
+    PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, src_w - 1U, src_h - 1U);
+
+    /*Disable PS buffer*/
+    PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U);
+    if(has_recolor)
+        /*Use as color generator*/
+        PXP_SetProcessSurfaceBackGroundColor(LV_GPU_NXP_PXP_ID, lv_color_to32(dsc->recolor));
+
+    /*Output buffer*/
+    pxp_output_buffer_config_t outputBufferConfig = {
+        .pixelFormat = (pxp_output_pixel_format_t)PXP_OUT_PIXEL_FORMAT,
+        .interlacedMode = kPXP_OutputProgressive,
+        .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1),
+        .buffer1Addr = (uint32_t)0U,
+        .pitchBytes = dest_stride * sizeof(lv_color_t),
+        .width = dest_w,
+        .height = dest_h
+    };
+    PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig);
+
+    if(has_recolor || lv_img_cf_has_alpha(cf)) {
+        /**
+         * Configure Porter-Duff blending.
+         *
+         * Note: srcFactorMode and dstFactorMode are inverted in fsl_pxp.h:
+         * srcFactorMode is actually applied on PS alpha value
+         * dstFactorMode is actually applied on AS alpha value
+         */
+        pxp_porter_duff_config_t pdConfig = {
+            .enable = 1,
+            .dstColorMode = kPXP_PorterDuffColorWithAlpha,
+            .srcColorMode = kPXP_PorterDuffColorNoAlpha,
+            .dstGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha,
+            .srcGlobalAlphaMode = lv_img_cf_has_alpha(cf) ? kPXP_PorterDuffLocalAlpha : kPXP_PorterDuffGlobalAlpha,
+            .dstFactorMode = kPXP_PorterDuffFactorStraight,
+            .srcFactorMode = kPXP_PorterDuffFactorInversed,
+            .dstGlobalAlpha = has_recolor ? dsc->recolor_opa : 0x00,
+            .srcGlobalAlpha = 0xff,
+            .dstAlphaMode = kPXP_PorterDuffAlphaStraight, /*don't care*/
+            .srcAlphaMode = kPXP_PorterDuffAlphaStraight
+        };
+        PXP_SetPorterDuffConfig(LV_GPU_NXP_PXP_ID, &pdConfig);
+    }
+
+    lv_gpu_nxp_pxp_run();
+}
+
+static void lv_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+                           const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride,
+                           const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf)
+{
+    lv_coord_t dest_w = lv_area_get_width(dest_area);
+    lv_coord_t dest_h = lv_area_get_height(dest_area);
+    lv_coord_t src_w = lv_area_get_width(src_area);
+    lv_coord_t src_h = lv_area_get_height(src_area);
+
+    lv_gpu_nxp_pxp_reset();
+
+    pxp_as_blend_config_t asBlendConfig = {
+        .alpha = dsc->opa,
+        .invertAlpha = false,
+        .alphaMode = kPXP_AlphaRop,
+        .ropMode = kPXP_RopMergeAs
+    };
+
+    if(dsc->opa >= (lv_opa_t)LV_OPA_MAX && !lv_img_cf_is_chroma_keyed(cf) && !lv_img_cf_has_alpha(cf)) {
+        /*Simple blit, no effect - Disable PS buffer*/
+        PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U);
+    }
+    else {
+        /*PS must be enabled to fetch background pixels.
+          PS and OUT buffers are the same, blend will be done in-place*/
+        pxp_ps_buffer_config_t psBufferConfig = {
+            .pixelFormat = PXP_PS_PIXEL_FORMAT,
+            .swapByte = false,
+            .bufferAddr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1),
+            .bufferAddrU = 0U,
+            .bufferAddrV = 0U,
+            .pitchBytes = dest_stride * sizeof(lv_color_t)
+        };
+        if(dsc->opa >= (lv_opa_t)LV_OPA_MAX) {
+            asBlendConfig.alphaMode = lv_img_cf_has_alpha(cf) ? kPXP_AlphaEmbedded : kPXP_AlphaOverride;
+        }
+        else {
+            asBlendConfig.alphaMode = lv_img_cf_has_alpha(cf) ? kPXP_AlphaMultiply : kPXP_AlphaOverride;
+        }
+        PXP_SetProcessSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &psBufferConfig);
+        PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U);
+    }
+
+    /*AS buffer - source image*/
+    pxp_as_buffer_config_t asBufferConfig = {
+        .pixelFormat = PXP_AS_PIXEL_FORMAT,
+        .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_area->x1),
+        .pitchBytes = src_stride * sizeof(lv_color_t)
+    };
+    PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig);
+    PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, src_w - 1U, src_h - 1U);
+    PXP_SetAlphaSurfaceBlendConfig(LV_GPU_NXP_PXP_ID, &asBlendConfig);
+
+    if(lv_img_cf_is_chroma_keyed(cf)) {
+        lv_color_t colorKeyLow = LV_COLOR_CHROMA_KEY;
+        lv_color_t colorKeyHigh = LV_COLOR_CHROMA_KEY;
+
+        bool has_recolor = (dsc->recolor_opa != LV_OPA_TRANSP);
+
+        if(has_recolor) {
+            /* New color key after recoloring */
+            lv_color_t colorKey =  lv_color_mix(dsc->recolor, LV_COLOR_CHROMA_KEY, dsc->recolor_opa);
+
+            LV_COLOR_SET_R(colorKeyLow, colorKey.ch.red != 0 ? colorKey.ch.red - 1 : 0);
+            LV_COLOR_SET_G(colorKeyLow, colorKey.ch.green != 0 ? colorKey.ch.green - 1 : 0);
+            LV_COLOR_SET_B(colorKeyLow, colorKey.ch.blue != 0 ? colorKey.ch.blue - 1 : 0);
+
+#if LV_COLOR_DEPTH == 16
+            LV_COLOR_SET_R(colorKeyHigh, colorKey.ch.red != 0x1f ? colorKey.ch.red + 1 : 0x1f);
+            LV_COLOR_SET_G(colorKeyHigh, colorKey.ch.green != 0x3f ? colorKey.ch.green + 1 : 0x3f);
+            LV_COLOR_SET_B(colorKeyHigh, colorKey.ch.blue != 0x1f ? colorKey.ch.blue + 1 : 0x1f);
+#else /*LV_COLOR_DEPTH == 32*/
+            LV_COLOR_SET_R(colorKeyHigh, colorKey.ch.red != 0xff ? colorKey.ch.red + 1 : 0xff);
+            LV_COLOR_SET_G(colorKeyHigh, colorKey.ch.green != 0xff ? colorKey.ch.green + 1 : 0xff);
+            LV_COLOR_SET_B(colorKeyHigh, colorKey.ch.blue != 0xff ? colorKey.ch.blue + 1 : 0xff);
+#endif
+        }
+
+        PXP_SetAlphaSurfaceOverlayColorKey(LV_GPU_NXP_PXP_ID, lv_color_to32(colorKeyLow),
+                                           lv_color_to32(colorKeyHigh));
+    }
+
+    PXP_EnableAlphaSurfaceOverlayColorKey(LV_GPU_NXP_PXP_ID, lv_img_cf_is_chroma_keyed(cf));
+
+    /*Output buffer.*/
+    pxp_output_buffer_config_t outputBufferConfig = {
+        .pixelFormat = (pxp_output_pixel_format_t)PXP_OUT_PIXEL_FORMAT,
+        .interlacedMode = kPXP_OutputProgressive,
+        .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1),
+        .buffer1Addr = (uint32_t)0U,
+        .pitchBytes = dest_stride * sizeof(lv_color_t),
+        .width = dest_w,
+        .height = dest_h
+    };
+    PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig);
+
+    lv_gpu_nxp_pxp_run();
+}
+
+#endif /*LV_USE_GPU_NXP_PXP*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.h
new file mode 100644 (file)
index 0000000..9615667
--- /dev/null
@@ -0,0 +1,130 @@
+/**
+ * @file lv_draw_pxp_blend.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2020-2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+#ifndef LV_DRAW_PXP_BLEND_H
+#define LV_DRAW_PXP_BLEND_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_PXP
+#include "lv_gpu_nxp_pxp.h"
+#include "../../sw/lv_draw_sw.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Fill area, with optional opacity.
+ *
+ * @param[in/out] dest_buf Destination buffer
+ * @param[in] dest_area Area with relative coordinates of destination buffer
+ * @param[in] dest_stride Stride of destination buffer in pixels
+ * @param[in] color Color
+ * @param[in] opa Opacity
+ */
+void lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+                         lv_color_t color, lv_opa_t opa);
+
+/**
+ * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects.
+ * By default, image is copied directly, with optional opacity. This function can also
+ * rotate the display output buffer to a specified angle (90x step).
+ *
+ * @param[in/out] dest_buf Destination buffer
+ * @param[in] dest_area Area with relative coordinates of destination buffer
+ * @param[in] dest_stride Stride of destination buffer in pixels
+ * @param[in] src_buf Source buffer
+ * @param[in] src_area Source area with relative coordinates of source buffer
+ * @param[in] src_stride Stride of source buffer in pixels
+ * @param[in] opa Opacity
+ * @param[in] angle Display rotation angle (90x)
+ */
+void lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+                         const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride,
+                         lv_opa_t opa, lv_disp_rot_t angle);
+
+/**
+ * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with transformation.
+ *
+ *
+ * @param[in/out] dest_buf Destination buffer
+ * @param[in] dest_area Area with relative coordinates of destination buffer
+ * @param[in] dest_stride Stride of destination buffer in pixels
+ * @param[in] src_buf Source buffer
+ * @param[in] src_area Area with relative coordinates of source buffer
+ * @param[in] src_stride Stride of source buffer in pixels
+ * @param[in] dsc Image descriptor
+ * @param[in] cf Color format
+ */
+void lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride,
+                                   const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride,
+                                   const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf);
+
+/**
+ * BLock Image Transfer - copy rectangular image from src_buf to dst_buf, no transformation or blending.
+ *
+ *
+ * @param[in/out] dest_buf Destination buffer
+ * @param[in] dest_area Area with relative coordinates of destination buffer
+ * @param[in] dest_stride Stride of destination buffer in pixels
+ * @param[in] src_buf Source buffer
+ * @param[in] src_area Area with relative coordinates of source buffer
+ * @param[in] src_stride Stride of source buffer in pixels
+ */
+void lv_gpu_nxp_pxp_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+                                const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#endif /*LV_USE_GPU_NXP_PXP*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_DRAW_PXP_BLEND_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c
new file mode 100644 (file)
index 0000000..164216f
--- /dev/null
@@ -0,0 +1,138 @@
+/**
+ * @file lv_gpu_nxp_pxp.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2020-2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "lv_gpu_nxp_pxp.h"
+
+#if LV_USE_GPU_NXP_PXP
+#include "lv_gpu_nxp_pxp_osa.h"
+#include "../../../core/lv_refr.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+/**
+ * Clean and invalidate cache.
+ */
+static inline void invalidate_cache(void);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+static lv_nxp_pxp_cfg_t * pxp_cfg;
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+lv_res_t lv_gpu_nxp_pxp_init(void)
+{
+#if LV_USE_GPU_NXP_PXP_AUTO_INIT
+    pxp_cfg = lv_gpu_nxp_pxp_get_cfg();
+#endif
+
+    if(!pxp_cfg || !pxp_cfg->pxp_interrupt_deinit || !pxp_cfg->pxp_interrupt_init ||
+       !pxp_cfg->pxp_run || !pxp_cfg->pxp_wait)
+        PXP_RETURN_INV("PXP configuration error.");
+
+    PXP_Init(LV_GPU_NXP_PXP_ID);
+
+    PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/
+    PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/
+
+    PXP_EnableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable);
+
+    if(pxp_cfg->pxp_interrupt_init() != LV_RES_OK) {
+        PXP_DisableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable);
+        PXP_Deinit(LV_GPU_NXP_PXP_ID);
+        PXP_RETURN_INV("PXP interrupt init failed.");
+    }
+
+    return LV_RES_OK;
+}
+
+void lv_gpu_nxp_pxp_deinit(void)
+{
+    pxp_cfg->pxp_interrupt_deinit();
+    PXP_DisableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable);
+    PXP_Deinit(LV_GPU_NXP_PXP_ID);
+}
+
+void lv_gpu_nxp_pxp_reset(void)
+{
+    /* Wait for previous command to complete before resetting the registers. */
+    lv_gpu_nxp_pxp_wait();
+
+    PXP_ResetControl(LV_GPU_NXP_PXP_ID);
+
+    PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/
+    PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/
+}
+
+void lv_gpu_nxp_pxp_run(void)
+{
+    invalidate_cache();
+
+    pxp_cfg->pxp_run();
+}
+
+void lv_gpu_nxp_pxp_wait(void)
+{
+    pxp_cfg->pxp_wait();
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+static inline void invalidate_cache(void)
+{
+    lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+    if(disp->driver->clean_dcache_cb)
+        disp->driver->clean_dcache_cb(disp->driver);
+}
+
+#endif /*LV_USE_GPU_NXP_PXP*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h
new file mode 100644 (file)
index 0000000..46f4a0b
--- /dev/null
@@ -0,0 +1,166 @@
+/**
+ * @file lv_gpu_nxp_pxp.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2020-2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+#ifndef LV_GPU_NXP_PXP_H
+#define LV_GPU_NXP_PXP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_PXP
+#include "fsl_cache.h"
+#include "fsl_pxp.h"
+
+#include "../../../misc/lv_log.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/** PXP module instance to use*/
+#define LV_GPU_NXP_PXP_ID PXP
+
+/** PXP interrupt line ID*/
+#define LV_GPU_NXP_PXP_IRQ_ID PXP_IRQn
+
+#ifndef LV_GPU_NXP_PXP_LOG_ERRORS
+/** Enable logging of PXP errors (\see LV_LOG_ERROR)*/
+#define LV_GPU_NXP_PXP_LOG_ERRORS 1
+#endif
+
+#ifndef LV_GPU_NXP_PXP_LOG_TRACES
+/** Enable logging of PXP errors (\see LV_LOG_ERROR)*/
+#define LV_GPU_NXP_PXP_LOG_TRACES 0
+#endif
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**
+ * NXP PXP device configuration - call-backs used for
+ * interrupt init/wait/deinit.
+ */
+typedef struct {
+    /** Callback for PXP interrupt initialization*/
+    lv_res_t (*pxp_interrupt_init)(void);
+
+    /** Callback for PXP interrupt de-initialization*/
+    void (*pxp_interrupt_deinit)(void);
+
+    /** Callback for PXP start*/
+    void (*pxp_run)(void);
+
+    /** Callback for waiting of PXP completion*/
+    void (*pxp_wait)(void);
+} lv_nxp_pxp_cfg_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Reset and initialize PXP device. This function should be called as a part
+ * of display init sequence.
+ *
+ * @retval LV_RES_OK PXP init completed
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS)
+ */
+lv_res_t lv_gpu_nxp_pxp_init(void);
+
+/**
+ * Disable PXP device. Should be called during display deinit sequence.
+ */
+void lv_gpu_nxp_pxp_deinit(void);
+
+/**
+ * Reset PXP device.
+ */
+void lv_gpu_nxp_pxp_reset(void);
+
+/**
+ * Clear cache and start PXP.
+ */
+void lv_gpu_nxp_pxp_run(void);
+
+/**
+ * Wait for PXP completion.
+ */
+void lv_gpu_nxp_pxp_wait(void);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#define PXP_COND_STOP(cond, txt)              \
+    do {                                      \
+        if (cond) {                           \
+            LV_LOG_ERROR("%s. STOP!", txt);   \
+            for ( ; ; );                      \
+        }                                     \
+    } while(0)
+
+#if LV_GPU_NXP_PXP_LOG_ERRORS
+#define PXP_RETURN_INV(fmt, ...)              \
+    do {                                      \
+        LV_LOG_ERROR(fmt, ##__VA_ARGS__);     \
+        return LV_RES_INV;                    \
+    } while (0)
+#else
+#define PXP_RETURN_INV(fmt, ...)              \
+    do {                                      \
+        return LV_RES_INV;                    \
+    }while(0)
+#endif /*LV_GPU_NXP_PXP_LOG_ERRORS*/
+
+#if LV_GPU_NXP_PXP_LOG_TRACES
+#define PXP_LOG_TRACE(fmt, ...)               \
+    do {                                      \
+        LV_LOG(fmt, ##__VA_ARGS__);     \
+    } while (0)
+#else
+#define PXP_LOG_TRACE(fmt, ...)               \
+    do {                                      \
+    } while (0)
+#endif /*LV_GPU_NXP_PXP_LOG_TRACES*/
+
+#endif /*LV_USE_GPU_NXP_PXP*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_GPU_NXP_PXP_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c
new file mode 100644 (file)
index 0000000..8e18840
--- /dev/null
@@ -0,0 +1,180 @@
+/**
+ * @file lv_gpu_nxp_pxp_osa.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2020, 2022, 2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "lv_gpu_nxp_pxp_osa.h"
+
+#if LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT
+#include "../../../misc/lv_log.h"
+#include "fsl_pxp.h"
+
+#if defined(SDK_OS_FREE_RTOS)
+    #include "FreeRTOS.h"
+    #include "semphr.h"
+#endif
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+/**
+ * PXP interrupt initialization.
+ */
+static lv_res_t _lv_gpu_nxp_pxp_interrupt_init(void);
+
+/**
+ * PXP interrupt de-initialization.
+ */
+static void _lv_gpu_nxp_pxp_interrupt_deinit(void);
+
+/**
+ * Start the PXP job.
+ */
+static void _lv_gpu_nxp_pxp_run(void);
+
+/**
+ * Wait for PXP completion.
+ */
+static void _lv_gpu_nxp_pxp_wait(void);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+#if defined(SDK_OS_FREE_RTOS)
+    static SemaphoreHandle_t s_pxpIdleSem;
+#endif
+static volatile bool s_pxpIdle;
+
+static lv_nxp_pxp_cfg_t pxp_default_cfg = {
+    .pxp_interrupt_init = _lv_gpu_nxp_pxp_interrupt_init,
+    .pxp_interrupt_deinit = _lv_gpu_nxp_pxp_interrupt_deinit,
+    .pxp_run = _lv_gpu_nxp_pxp_run,
+    .pxp_wait = _lv_gpu_nxp_pxp_wait,
+};
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+void PXP_IRQHandler(void)
+{
+#if defined(SDK_OS_FREE_RTOS)
+    BaseType_t taskAwake = pdFALSE;
+#endif
+
+    if(kPXP_CompleteFlag & PXP_GetStatusFlags(LV_GPU_NXP_PXP_ID)) {
+        PXP_ClearStatusFlags(LV_GPU_NXP_PXP_ID, kPXP_CompleteFlag);
+#if defined(SDK_OS_FREE_RTOS)
+        xSemaphoreGiveFromISR(s_pxpIdleSem, &taskAwake);
+        portYIELD_FROM_ISR(taskAwake);
+#else
+        s_pxpIdle = true;
+#endif
+    }
+}
+
+lv_nxp_pxp_cfg_t * lv_gpu_nxp_pxp_get_cfg(void)
+{
+    return &pxp_default_cfg;
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+static lv_res_t _lv_gpu_nxp_pxp_interrupt_init(void)
+{
+#if defined(SDK_OS_FREE_RTOS)
+    s_pxpIdleSem = xSemaphoreCreateBinary();
+    if(s_pxpIdleSem == NULL)
+        return LV_RES_INV;
+
+    NVIC_SetPriority(LV_GPU_NXP_PXP_IRQ_ID, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1);
+#endif
+    s_pxpIdle = true;
+
+    NVIC_EnableIRQ(LV_GPU_NXP_PXP_IRQ_ID);
+
+    return LV_RES_OK;
+}
+
+static void _lv_gpu_nxp_pxp_interrupt_deinit(void)
+{
+    NVIC_DisableIRQ(LV_GPU_NXP_PXP_IRQ_ID);
+#if defined(SDK_OS_FREE_RTOS)
+    vSemaphoreDelete(s_pxpIdleSem);
+#endif
+}
+
+/**
+ * Function to start PXP job.
+ */
+static void _lv_gpu_nxp_pxp_run(void)
+{
+    s_pxpIdle = false;
+
+    PXP_EnableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable);
+    PXP_Start(LV_GPU_NXP_PXP_ID);
+}
+
+/**
+ * Function to wait for PXP completion.
+ */
+static void _lv_gpu_nxp_pxp_wait(void)
+{
+#if defined(SDK_OS_FREE_RTOS)
+    /* Return if PXP was never started, otherwise the semaphore will lock forever. */
+    if(s_pxpIdle == true)
+        return;
+
+    if(xSemaphoreTake(s_pxpIdleSem, portMAX_DELAY) == pdTRUE)
+        s_pxpIdle = true;
+#else
+    while(s_pxpIdle == false) {
+    }
+#endif
+}
+
+#endif /*LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h
new file mode 100644 (file)
index 0000000..5c87824
--- /dev/null
@@ -0,0 +1,78 @@
+/**
+ * @file lv_gpu_nxp_pxp_osa.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2020, 2022 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+#ifndef LV_GPU_NXP_PXP_OSA_H
+#define LV_GPU_NXP_PXP_OSA_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT
+#include "lv_gpu_nxp_pxp.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * PXP device interrupt handler. Used to check PXP task completion status.
+ */
+void PXP_IRQHandler(void);
+
+/**
+ * Helper function to get the PXP default configuration.
+ */
+lv_nxp_pxp_cfg_t * lv_gpu_nxp_pxp_get_cfg(void);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#endif /*LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_GPU_NXP_PXP_OSA_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk
new file mode 100644 (file)
index 0000000..c9473cc
--- /dev/null
@@ -0,0 +1,12 @@
+CSRCS += lv_draw_vglite.c
+CSRCS += lv_draw_vglite_arc.c
+CSRCS += lv_draw_vglite_blend.c
+CSRCS += lv_draw_vglite_line.c
+CSRCS += lv_draw_vglite_rect.c
+CSRCS += lv_vglite_buf.c
+CSRCS += lv_vglite_utils.c
+
+DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite
+VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite
+
+CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite"
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c
new file mode 100644 (file)
index 0000000..031f57e
--- /dev/null
@@ -0,0 +1,557 @@
+/**
+ * @file lv_draw_vglite.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2022, 2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "lv_draw_vglite.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include <math.h>
+#include "lv_draw_vglite_blend.h"
+#include "lv_draw_vglite_line.h"
+#include "lv_draw_vglite_rect.h"
+#include "lv_draw_vglite_arc.h"
+#include "lv_vglite_buf.h"
+
+#if LV_COLOR_DEPTH != 32
+    #include "../../../core/lv_refr.h"
+#endif
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/* Minimum area (in pixels) for VG-Lite blit/fill processing. */
+#ifndef LV_GPU_NXP_VG_LITE_SIZE_LIMIT
+    #define LV_GPU_NXP_VG_LITE_SIZE_LIMIT 5000
+#endif
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+static void lv_draw_vglite_init_buf(lv_draw_ctx_t * draw_ctx);
+
+static void lv_draw_vglite_wait_for_finish(lv_draw_ctx_t * draw_ctx);
+
+static void lv_draw_vglite_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc,
+                                       const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf);
+
+static void lv_draw_vglite_buffer_copy(lv_draw_ctx_t * draw_ctx,
+                                       void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area,
+                                       void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area);
+
+static void lv_draw_vglite_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc);
+
+static void lv_draw_vglite_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1,
+                                const lv_point_t * point2);
+
+static void lv_draw_vglite_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords);
+
+static lv_res_t lv_draw_vglite_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords);
+
+static lv_res_t lv_draw_vglite_border(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc,
+                                      const lv_area_t * coords);
+
+static lv_res_t lv_draw_vglite_outline(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc,
+                                       const lv_area_t * coords);
+
+static void lv_draw_vglite_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center,
+                               uint16_t radius, uint16_t start_angle, uint16_t end_angle);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+void lv_draw_vglite_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
+{
+    lv_draw_sw_init_ctx(drv, draw_ctx);
+
+    lv_draw_vglite_ctx_t * vglite_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx;
+    vglite_draw_ctx->base_draw.init_buf = lv_draw_vglite_init_buf;
+    vglite_draw_ctx->base_draw.draw_line = lv_draw_vglite_line;
+    vglite_draw_ctx->base_draw.draw_arc = lv_draw_vglite_arc;
+    vglite_draw_ctx->base_draw.draw_rect = lv_draw_vglite_rect;
+    vglite_draw_ctx->base_draw.draw_img_decoded = lv_draw_vglite_img_decoded;
+    vglite_draw_ctx->blend = lv_draw_vglite_blend;
+    vglite_draw_ctx->base_draw.wait_for_finish = lv_draw_vglite_wait_for_finish;
+    vglite_draw_ctx->base_draw.buffer_copy = lv_draw_vglite_buffer_copy;
+}
+
+void lv_draw_vglite_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
+{
+    lv_draw_sw_deinit_ctx(drv, draw_ctx);
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+/**
+ * During rendering, LVGL might initializes new draw_ctxs and start drawing into
+ * a separate buffer (called layer). If the content to be rendered has "holes",
+ * e.g. rounded corner, LVGL temporarily sets the disp_drv.screen_transp flag.
+ * It means the renderers should draw into an ARGB buffer.
+ * With 32 bit color depth it's not a big problem but with 16 bit color depth
+ * the target pixel format is ARGB8565 which is not supported by the GPU.
+ * In this case, the VG-Lite callbacks should fallback to SW rendering.
+ */
+static inline bool need_argb8565_support()
+{
+#if LV_COLOR_DEPTH != 32
+    lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+
+    if(disp->driver->screen_transp == 1)
+        return true;
+#endif
+
+    return false;
+}
+
+static void lv_draw_vglite_init_buf(lv_draw_ctx_t * draw_ctx)
+{
+    lv_gpu_nxp_vglite_init_buf(draw_ctx->buf, draw_ctx->buf_area, lv_area_get_width(draw_ctx->buf_area));
+}
+
+static void lv_draw_vglite_wait_for_finish(lv_draw_ctx_t * draw_ctx)
+{
+    vg_lite_finish();
+
+    lv_draw_sw_wait_for_finish(draw_ctx);
+}
+
+static void lv_draw_vglite_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc)
+{
+    if(dsc->opa <= (lv_opa_t)LV_OPA_MIN)
+        return;
+
+    if(need_argb8565_support()) {
+        lv_draw_sw_blend_basic(draw_ctx, dsc);
+        return;
+    }
+
+    lv_area_t blend_area;
+    if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area))
+        return; /*Fully clipped, nothing to do*/
+
+    lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+    bool done = false;
+    /*Fill/Blend only non masked, normal blended*/
+    if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL &&
+       lv_area_get_size(&blend_area) >= LV_GPU_NXP_VG_LITE_SIZE_LIMIT) {
+        const lv_color_t * src_buf = dsc->src_buf;
+
+        if(src_buf == NULL) {
+            done = (lv_gpu_nxp_vglite_fill(&blend_area, dsc->color, dsc->opa) == LV_RES_OK);
+            if(!done)
+                VG_LITE_LOG_TRACE("VG-Lite fill failed. Fallback.");
+        }
+        else {
+            lv_area_t src_area;
+            src_area.x1 = blend_area.x1 - (dsc->blend_area->x1 - draw_ctx->buf_area->x1);
+            src_area.y1 = blend_area.y1 - (dsc->blend_area->y1 - draw_ctx->buf_area->y1);
+            src_area.x2 = src_area.x1 + lv_area_get_width(dsc->blend_area) - 1;
+            src_area.y2 = src_area.y1 + lv_area_get_height(dsc->blend_area) - 1;
+            lv_coord_t src_stride = lv_area_get_width(dsc->blend_area);
+
+#if VG_LITE_BLIT_SPLIT_ENABLED
+            lv_color_t * dest_buf = draw_ctx->buf;
+            lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area);
+
+            done = (lv_gpu_nxp_vglite_blit_split(dest_buf, &blend_area, dest_stride,
+                                                 src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK);
+#else
+            done = (lv_gpu_nxp_vglite_blit(&blend_area, src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK);
+#endif
+
+            if(!done)
+                VG_LITE_LOG_TRACE("VG-Lite blit failed. Fallback.");
+        }
+    }
+
+    if(!done)
+        lv_draw_sw_blend_basic(draw_ctx, dsc);
+}
+
+static void lv_draw_vglite_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc,
+                                       const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf)
+{
+    if(dsc->opa <= (lv_opa_t)LV_OPA_MIN)
+        return;
+
+    if(need_argb8565_support()) {
+        lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf);
+        return;
+    }
+
+    const lv_color_t * src_buf = (const lv_color_t *)map_p;
+    if(!src_buf) {
+        lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf);
+        return;
+    }
+
+    lv_area_t rel_coords;
+    lv_area_copy(&rel_coords, coords);
+    lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+    lv_area_t rel_clip_area;
+    lv_area_copy(&rel_clip_area, draw_ctx->clip_area);
+    lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+    lv_area_t blend_area;
+    bool has_transform = dsc->angle != 0 || dsc->zoom != LV_IMG_ZOOM_NONE;
+
+    if(has_transform)
+        lv_area_copy(&blend_area, &rel_coords);
+    else if(!_lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area))
+        return; /*Fully clipped, nothing to do*/
+
+    bool has_mask = lv_draw_mask_is_any(&blend_area);
+    bool has_recolor = (dsc->recolor_opa != LV_OPA_TRANSP);
+
+    bool done = false;
+    if(!has_mask && !has_recolor && !lv_img_cf_is_chroma_keyed(cf) &&
+       lv_area_get_size(&blend_area) >= LV_GPU_NXP_VG_LITE_SIZE_LIMIT
+#if LV_COLOR_DEPTH != 32
+       && !lv_img_cf_has_alpha(cf)
+#endif
+      ) {
+        lv_area_t src_area;
+        src_area.x1 = blend_area.x1 - (coords->x1 - draw_ctx->buf_area->x1);
+        src_area.y1 = blend_area.y1 - (coords->y1 - draw_ctx->buf_area->y1);
+        src_area.x2 = src_area.x1 + lv_area_get_width(coords) - 1;
+        src_area.y2 = src_area.y1 + lv_area_get_height(coords) - 1;
+        lv_coord_t src_stride = lv_area_get_width(coords);
+
+#if VG_LITE_BLIT_SPLIT_ENABLED
+        lv_color_t * dest_buf = draw_ctx->buf;
+        lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area);
+
+        if(has_transform)
+            /* VG-Lite blit split with transformation is not supported! */
+            done = false;
+        else
+            done = (lv_gpu_nxp_vglite_blit_split(dest_buf, &blend_area, dest_stride,
+                                                 src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK);
+#else
+        if(has_transform)
+            done = (lv_gpu_nxp_vglite_blit_transform(&blend_area, &rel_clip_area,
+                                                     src_buf, &src_area, src_stride, dsc) == LV_RES_OK);
+        else
+            done = (lv_gpu_nxp_vglite_blit(&blend_area, src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK);
+#endif
+
+        if(!done)
+            VG_LITE_LOG_TRACE("VG-Lite blit %sfailed. Fallback.", has_transform ? "transform " : "");
+    }
+
+    if(!done)
+        lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf);
+}
+
+static void lv_draw_vglite_buffer_copy(lv_draw_ctx_t * draw_ctx,
+                                       void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area,
+                                       void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area)
+{
+    bool done = false;
+
+    if(lv_area_get_size(dest_area) >= LV_GPU_NXP_VG_LITE_SIZE_LIMIT) {
+        done = lv_gpu_nxp_vglite_buffer_copy(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride);
+        if(!done)
+            VG_LITE_LOG_TRACE("VG-Lite buffer copy failed. Fallback.");
+    }
+
+    if(!done)
+        lv_draw_sw_buffer_copy(draw_ctx, dest_buf, dest_stride, dest_area, src_buf, src_stride, src_area);
+}
+
+static void lv_draw_vglite_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1,
+                                const lv_point_t * point2)
+{
+    if(dsc->width == 0)
+        return;
+    if(dsc->opa <= (lv_opa_t)LV_OPA_MIN)
+        return;
+    if(point1->x == point2->x && point1->y == point2->y)
+        return;
+
+    if(need_argb8565_support()) {
+        lv_draw_sw_line(draw_ctx, dsc, point1, point2);
+        return;
+    }
+
+    lv_area_t rel_clip_area;
+    rel_clip_area.x1 = LV_MIN(point1->x, point2->x) - dsc->width / 2;
+    rel_clip_area.x2 = LV_MAX(point1->x, point2->x) + dsc->width / 2;
+    rel_clip_area.y1 = LV_MIN(point1->y, point2->y) - dsc->width / 2;
+    rel_clip_area.y2 = LV_MAX(point1->y, point2->y) + dsc->width / 2;
+
+    lv_area_t clipped_coords;
+    if(!_lv_area_intersect(&clipped_coords, &rel_clip_area, draw_ctx->clip_area))
+        return; /*Fully clipped, nothing to do*/
+
+    lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+    lv_point_t rel_point1 = { point1->x - draw_ctx->buf_area->x1, point1->y - draw_ctx->buf_area->y1 };
+    lv_point_t rel_point2 = { point2->x - draw_ctx->buf_area->x1, point2->y - draw_ctx->buf_area->y1 };
+
+    bool done = false;
+    bool has_mask = lv_draw_mask_is_any(&rel_clip_area);
+
+    if(!has_mask) {
+        done = (lv_gpu_nxp_vglite_draw_line(&rel_point1, &rel_point2, &rel_clip_area, dsc) == LV_RES_OK);
+        if(!done)
+            VG_LITE_LOG_TRACE("VG-Lite draw line failed. Fallback.");
+    }
+
+    if(!done)
+        lv_draw_sw_line(draw_ctx, dsc, point1, point2);
+}
+
+static void lv_draw_vglite_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords)
+{
+    if(need_argb8565_support()) {
+        lv_draw_sw_rect(draw_ctx, dsc, coords);
+        return;
+    }
+
+    lv_draw_rect_dsc_t vglite_dsc;
+
+    lv_memcpy(&vglite_dsc, dsc, sizeof(vglite_dsc));
+    vglite_dsc.bg_opa = 0;
+    vglite_dsc.bg_img_opa = 0;
+    vglite_dsc.border_opa = 0;
+    vglite_dsc.outline_opa = 0;
+#if LV_DRAW_COMPLEX
+    /* Draw the shadow with CPU */
+    lv_draw_sw_rect(draw_ctx, &vglite_dsc, coords);
+    vglite_dsc.shadow_opa = 0;
+#endif /*LV_DRAW_COMPLEX*/
+
+    /* Draw the background */
+    vglite_dsc.bg_opa = dsc->bg_opa;
+    if(lv_draw_vglite_bg(draw_ctx, &vglite_dsc, coords) != LV_RES_OK)
+        lv_draw_sw_rect(draw_ctx, &vglite_dsc, coords);
+    vglite_dsc.bg_opa = 0;
+
+    /* Draw the background image
+     * It will be done once draw_ctx->draw_img_decoded()
+     * callback gets called from lv_draw_sw_rect().
+     */
+    vglite_dsc.bg_img_opa = dsc->bg_img_opa;
+    lv_draw_sw_rect(draw_ctx, &vglite_dsc, coords);
+    vglite_dsc.bg_img_opa = 0;
+
+    /* Draw the border */
+    vglite_dsc.border_opa = dsc->border_opa;
+    if(lv_draw_vglite_border(draw_ctx, &vglite_dsc, coords) != LV_RES_OK)
+        lv_draw_sw_rect(draw_ctx, &vglite_dsc, coords);
+    vglite_dsc.border_opa = 0;
+
+    /* Draw the outline */
+    vglite_dsc.outline_opa = dsc->outline_opa;
+    if(lv_draw_vglite_outline(draw_ctx, &vglite_dsc, coords) != LV_RES_OK)
+        lv_draw_sw_rect(draw_ctx, &vglite_dsc, coords);
+}
+
+static lv_res_t lv_draw_vglite_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords)
+{
+    if(dsc->bg_opa <= (lv_opa_t)LV_OPA_MIN)
+        return LV_RES_INV;
+
+    lv_area_t rel_coords;
+    lv_area_copy(&rel_coords, coords);
+
+    /*If the border fully covers make the bg area 1px smaller to avoid artifacts on the corners*/
+    if(dsc->border_width > 1 && dsc->border_opa >= (lv_opa_t)LV_OPA_MAX && dsc->radius != 0) {
+        rel_coords.x1 += (dsc->border_side & LV_BORDER_SIDE_LEFT) ? 1 : 0;
+        rel_coords.y1 += (dsc->border_side & LV_BORDER_SIDE_TOP) ? 1 : 0;
+        rel_coords.x2 -= (dsc->border_side & LV_BORDER_SIDE_RIGHT) ? 1 : 0;
+        rel_coords.y2 -= (dsc->border_side & LV_BORDER_SIDE_BOTTOM) ? 1 : 0;
+    }
+    lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+    lv_area_t rel_clip_area;
+    lv_area_copy(&rel_clip_area, draw_ctx->clip_area);
+    lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+    lv_area_t clipped_coords;
+    if(!_lv_area_intersect(&clipped_coords, &rel_coords, &rel_clip_area))
+        return LV_RES_OK; /*Fully clipped, nothing to do*/
+
+    bool has_mask = lv_draw_mask_is_any(&rel_coords);
+    lv_grad_dir_t grad_dir = dsc->bg_grad.dir;
+    lv_color_t bg_color = (grad_dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE) ?
+                          dsc->bg_color : dsc->bg_grad.stops[0].color;
+    if(bg_color.full == dsc->bg_grad.stops[1].color.full)
+        grad_dir = LV_GRAD_DIR_NONE;
+
+    /*
+     * Most simple case: just a plain rectangle (no mask, no radius, no gradient)
+     * shall be handled by draw_ctx->blend().
+     *
+     * Complex case: gradient or radius but no mask.
+     */
+    if(!has_mask && ((dsc->radius != 0) || (grad_dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE))) {
+        lv_res_t res = lv_gpu_nxp_vglite_draw_bg(&rel_coords, &rel_clip_area, dsc);
+        if(res != LV_RES_OK)
+            VG_LITE_LOG_TRACE("VG-Lite draw bg failed. Fallback.");
+
+        return res;
+    }
+
+    return LV_RES_INV;
+}
+
+static lv_res_t lv_draw_vglite_border(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc,
+                                      const lv_area_t * coords)
+{
+    if(dsc->border_opa <= (lv_opa_t)LV_OPA_MIN)
+        return LV_RES_INV;
+    if(dsc->border_width == 0)
+        return LV_RES_INV;
+    if(dsc->border_post)
+        return LV_RES_INV;
+    if(dsc->border_side != (lv_border_side_t)LV_BORDER_SIDE_FULL)
+        return LV_RES_INV;
+
+    lv_area_t rel_coords;
+    lv_coord_t border_width = dsc->border_width;
+
+    /* Move border inwards to align with software rendered border */
+    rel_coords.x1 = coords->x1 + ceil(border_width / 2.0f);
+    rel_coords.x2 = coords->x2 - floor(border_width / 2.0f);
+    rel_coords.y1 = coords->y1 + ceil(border_width / 2.0f);
+    rel_coords.y2 = coords->y2 - floor(border_width / 2.0f);
+
+    lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+    lv_area_t rel_clip_area;
+    lv_area_copy(&rel_clip_area, draw_ctx->clip_area);
+    lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+    lv_area_t clipped_coords;
+    if(!_lv_area_intersect(&clipped_coords, &rel_coords, &rel_clip_area))
+        return LV_RES_OK; /*Fully clipped, nothing to do*/
+
+    lv_res_t res = lv_gpu_nxp_vglite_draw_border_generic(&rel_coords, &rel_clip_area, dsc, true);
+    if(res != LV_RES_OK)
+        VG_LITE_LOG_TRACE("VG-Lite draw border failed. Fallback.");
+
+    return res;
+}
+
+static lv_res_t lv_draw_vglite_outline(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc,
+                                       const lv_area_t * coords)
+{
+    if(dsc->outline_opa <= (lv_opa_t)LV_OPA_MIN)
+        return LV_RES_INV;
+    if(dsc->outline_width == 0)
+        return LV_RES_INV;
+
+    /* Move outline outwards to align with software rendered outline */
+    lv_coord_t outline_pad = dsc->outline_pad - 1;
+    lv_area_t rel_coords;
+    rel_coords.x1 = coords->x1 - outline_pad - floor(dsc->outline_width / 2.0f);
+    rel_coords.x2 = coords->x2 + outline_pad + ceil(dsc->outline_width / 2.0f);
+    rel_coords.y1 = coords->y1 - outline_pad - floor(dsc->outline_width / 2.0f);
+    rel_coords.y2 = coords->y2 + outline_pad + ceil(dsc->outline_width / 2.0f);
+
+    lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+    lv_area_t rel_clip_area;
+    lv_area_copy(&rel_clip_area, draw_ctx->clip_area);
+    lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+    lv_area_t clipped_coords;
+    if(!_lv_area_intersect(&clipped_coords, &rel_coords, &rel_clip_area))
+        return LV_RES_OK; /*Fully clipped, nothing to do*/
+
+    lv_res_t res = lv_gpu_nxp_vglite_draw_border_generic(&rel_coords, &rel_clip_area, dsc, false);
+    if(res != LV_RES_OK)
+        VG_LITE_LOG_TRACE("VG-Lite draw outline failed. Fallback.");
+
+    return res;
+}
+
+static void lv_draw_vglite_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center,
+                               uint16_t radius, uint16_t start_angle, uint16_t end_angle)
+{
+    bool done = false;
+
+#if LV_DRAW_COMPLEX
+    if(dsc->opa <= (lv_opa_t)LV_OPA_MIN)
+        return;
+    if(dsc->width == 0)
+        return;
+    if(start_angle == end_angle)
+        return;
+
+    if(need_argb8565_support()) {
+        lv_draw_sw_arc(draw_ctx, dsc, center, radius, start_angle, end_angle);
+        return;
+    }
+
+    lv_point_t rel_center = {center->x - draw_ctx->buf_area->x1, center->y - draw_ctx->buf_area->y1};
+
+    lv_area_t rel_clip_area;
+    lv_area_copy(&rel_clip_area, draw_ctx->clip_area);
+    lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+
+    bool has_mask = lv_draw_mask_is_any(&rel_clip_area);
+
+    if(!has_mask) {
+        done = (lv_gpu_nxp_vglite_draw_arc(&rel_center, (int32_t)radius, (int32_t)start_angle, (int32_t)end_angle,
+                                           &rel_clip_area, dsc) == LV_RES_OK);
+        if(!done)
+            VG_LITE_LOG_TRACE("VG-Lite draw arc failed. Fallback.");
+    }
+
+#endif/*LV_DRAW_COMPLEX*/
+
+    if(!done)
+        lv_draw_sw_arc(draw_ctx, dsc, center, radius, start_angle, end_angle);
+}
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite.h
new file mode 100644 (file)
index 0000000..c44cb8f
--- /dev/null
@@ -0,0 +1,72 @@
+/**
+ * @file lv_draw_vglite.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2022, 2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+#ifndef LV_DRAW_VGLITE_H
+#define LV_DRAW_VGLITE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "../../sw/lv_draw_sw.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+typedef lv_draw_sw_ctx_t lv_draw_vglite_ctx_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+void lv_draw_vglite_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
+
+void lv_draw_vglite_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
+
+/**********************
+ *      MACROS
+ **********************/
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_DRAW_VGLITE_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c
new file mode 100644 (file)
index 0000000..3947052
--- /dev/null
@@ -0,0 +1,677 @@
+/**
+ * @file lv_draw_vglite_arc.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2021-2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "lv_draw_vglite_arc.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "lv_vglite_buf.h"
+#include <math.h>
+
+/*********************
+ *      DEFINES
+ *********************/
+
+#define T_FRACTION 16384.0f
+
+#define DICHOTO_ITER 5
+
+static const uint16_t TperDegree[90] = {
+    0, 174, 348, 522, 697, 873, 1049, 1226, 1403, 1581,
+    1759, 1938, 2117, 2297, 2477, 2658, 2839, 3020, 3202, 3384,
+    3567, 3749, 3933, 4116, 4300, 4484, 4668, 4852, 5037, 5222,
+    5407, 5592, 5777, 5962, 6148, 6334, 6519, 6705, 6891, 7077,
+    7264, 7450, 7636, 7822, 8008, 8193, 8378, 8564, 8750, 8936,
+    9122, 9309, 9495, 9681, 9867, 10052, 10238, 10424, 10609, 10794,
+    10979, 11164, 11349, 11534, 11718, 11902, 12086, 12270, 12453, 12637,
+    12819, 13002, 13184, 13366, 13547, 13728, 13909, 14089, 14269, 14448,
+    14627, 14805, 14983, 15160, 15337, 15513, 15689, 15864, 16038, 16212
+};
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/* intermediate arc params */
+typedef struct _vg_arc {
+    int32_t angle;   /* angle <90deg */
+    int32_t quarter; /* 0-3 counter-clockwise */
+    int32_t rad;     /* radius */
+    int32_t p0x;       /* point P0 */
+    int32_t p0y;
+    int32_t p1x;      /* point P1 */
+    int32_t p1y;
+    int32_t p2x;      /* point P2 */
+    int32_t p2y;
+    int32_t p3x;      /* point P3 */
+    int32_t p3y;
+} vg_arc;
+
+typedef struct _cubic_cont_pt {
+    float p0;
+    float p1;
+    float p2;
+    float p3;
+} cubic_cont_pt;
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+static void rotate_point(int32_t angle, int32_t * x, int32_t * y);
+static void add_arc_path(int32_t * arc_path, int * pidx, int32_t radius,
+                         int32_t start_angle, int32_t end_angle, const lv_point_t * center, bool cw);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+lv_res_t lv_gpu_nxp_vglite_draw_arc(const lv_point_t * center, int32_t radius, int32_t start_angle, int32_t end_angle,
+                                    const lv_area_t * clip_area, const lv_draw_arc_dsc_t * dsc)
+{
+    vg_lite_error_t err = VG_LITE_SUCCESS;
+    lv_color32_t col32 = {.full = lv_color_to32(dsc->color)}; /*Convert color to RGBA8888*/
+    vg_lite_path_t path;
+    vg_lite_color_t vgcol; /* vglite takes ABGR */
+    bool donut = ((end_angle - start_angle) % 360 == 0) ? true : false;
+    vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf();
+
+    /* path: max size = 16 cubic bezier (7 words each) */
+    int32_t arc_path[16 * 7];
+    lv_memset_00(arc_path, sizeof(arc_path));
+
+    /*** Init path ***/
+    lv_coord_t width = dsc->width;  /* inner arc radius = outer arc radius - width */
+    if(width > (lv_coord_t)radius)
+        width = radius;
+
+    int pidx = 0;
+    int32_t cp_x, cp_y; /* control point coords */
+
+    /* first control point of curve */
+    cp_x = radius;
+    cp_y = 0;
+    rotate_point(start_angle, &cp_x, &cp_y);
+    arc_path[pidx++] = VLC_OP_MOVE;
+    arc_path[pidx++] = center->x + cp_x;
+    arc_path[pidx++] = center->y + cp_y;
+
+    /* draw 1-5 outer quarters */
+    add_arc_path(arc_path, &pidx, radius, start_angle, end_angle, center, true);
+
+    if(donut) {
+        /* close outer circle */
+        cp_x = radius;
+        cp_y = 0;
+        rotate_point(start_angle, &cp_x, &cp_y);
+        arc_path[pidx++] = VLC_OP_LINE;
+        arc_path[pidx++] = center->x + cp_x;
+        arc_path[pidx++] = center->y + cp_y;
+        /* start inner circle */
+        cp_x = radius - width;
+        cp_y = 0;
+        rotate_point(start_angle, &cp_x, &cp_y);
+        arc_path[pidx++] = VLC_OP_MOVE;
+        arc_path[pidx++] = center->x + cp_x;
+        arc_path[pidx++] = center->y + cp_y;
+
+    }
+    else if(dsc->rounded != 0U) {    /* 1st rounded arc ending */
+        cp_x = radius - width / 2;
+        cp_y = 0;
+        rotate_point(end_angle, &cp_x, &cp_y);
+        lv_point_t round_center = {center->x + cp_x, center->y + cp_y};
+        add_arc_path(arc_path, &pidx, width / 2, end_angle, (end_angle + 180),
+                     &round_center, true);
+
+    }
+    else {   /* 1st flat ending */
+        cp_x = radius - width;
+        cp_y = 0;
+        rotate_point(end_angle, &cp_x, &cp_y);
+        arc_path[pidx++] = VLC_OP_LINE;
+        arc_path[pidx++] = center->x + cp_x;
+        arc_path[pidx++] = center->y + cp_y;
+    }
+
+    /* draw 1-5 inner quarters */
+    add_arc_path(arc_path, &pidx, radius - width, start_angle, end_angle, center, false);
+
+    /* last control point of curve */
+    if(donut) {     /* close the loop */
+        cp_x = radius - width;
+        cp_y = 0;
+        rotate_point(start_angle, &cp_x, &cp_y);
+        arc_path[pidx++] = VLC_OP_LINE;
+        arc_path[pidx++] = center->x + cp_x;
+        arc_path[pidx++] = center->y + cp_y;
+
+    }
+    else if(dsc->rounded != 0U) {    /* 2nd rounded arc ending */
+        cp_x = radius - width / 2;
+        cp_y = 0;
+        rotate_point(start_angle, &cp_x, &cp_y);
+        lv_point_t round_center = {center->x + cp_x, center->y + cp_y};
+        add_arc_path(arc_path, &pidx, width / 2, (start_angle + 180), (start_angle + 360),
+                     &round_center, true);
+
+    }
+    else {   /* 2nd flat ending */
+        cp_x = radius;
+        cp_y = 0;
+        rotate_point(start_angle, &cp_x, &cp_y);
+        arc_path[pidx++] = VLC_OP_LINE;
+        arc_path[pidx++] = center->x + cp_x;
+        arc_path[pidx++] = center->y + cp_y;
+    }
+
+    arc_path[pidx++] = VLC_OP_END;
+
+    err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, (uint32_t)pidx * sizeof(int32_t), arc_path,
+                            (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1,
+                            ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f);
+    VG_LITE_ERR_RETURN_INV(err, "Init path failed.");
+
+    vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888;
+    if(lv_vglite_premult_and_swizzle(&vgcol, col32, dsc->opa, color_format) != LV_RES_OK)
+        VG_LITE_RETURN_INV("Premultiplication and swizzle failed.");
+
+    vg_lite_matrix_t matrix;
+    vg_lite_identity(&matrix);
+
+    lv_vglite_set_scissor(clip_area);
+
+    /*** Draw arc ***/
+    err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol);
+    VG_LITE_ERR_RETURN_INV(err, "Draw arc failed.");
+
+    if(lv_vglite_run() != LV_RES_OK)
+        VG_LITE_RETURN_INV("Run failed.");
+
+    lv_vglite_disable_scissor();
+
+    err = vg_lite_clear_path(&path);
+    VG_LITE_ERR_RETURN_INV(err, "Clear path failed.");
+
+    return LV_RES_OK;
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+static void copy_arc(vg_arc * dst, vg_arc * src)
+{
+    dst->quarter = src->quarter;
+    dst->rad = src->rad;
+    dst->angle = src->angle;
+    dst->p0x = src->p0x;
+    dst->p1x = src->p1x;
+    dst->p2x = src->p2x;
+    dst->p3x = src->p3x;
+    dst->p0y = src->p0y;
+    dst->p1y = src->p1y;
+    dst->p2y = src->p2y;
+    dst->p3y = src->p3y;
+}
+
+/**
+ * Rotate the point according given rotation angle rotation center is 0,0
+ */
+static void rotate_point(int32_t angle, int32_t * x, int32_t * y)
+{
+    int32_t ori_x = *x;
+    int32_t ori_y = *y;
+    int16_t alpha = (int16_t)angle;
+    *x = ((lv_trigo_cos(alpha) * ori_x) / LV_TRIGO_SIN_MAX) - ((lv_trigo_sin(alpha) * ori_y) / LV_TRIGO_SIN_MAX);
+    *y = ((lv_trigo_sin(alpha) * ori_x) / LV_TRIGO_SIN_MAX) + ((lv_trigo_cos(alpha) * ori_y) / LV_TRIGO_SIN_MAX);
+}
+
+/**
+ * Set full arc control points depending on quarter.
+ * Control points match the best approximation of a circle.
+ * Arc Quarter position is:
+ * Q2 | Q3
+ * ---+---
+ * Q1 | Q0
+ */
+static void set_full_arc(vg_arc * fullarc)
+{
+    /* the tangent lenght for the bezier circle approx */
+    float tang = ((float)fullarc->rad) * BEZIER_OPTIM_CIRCLE;
+    switch(fullarc->quarter) {
+        case 0:
+            /* first quarter */
+            fullarc->p0x = fullarc->rad;
+            fullarc->p0y = 0;
+            fullarc->p1x = fullarc->rad;
+            fullarc->p1y = (int32_t)tang;
+            fullarc->p2x = (int32_t)tang;
+            fullarc->p2y = fullarc->rad;
+            fullarc->p3x = 0;
+            fullarc->p3y = fullarc->rad;
+            break;
+        case 1:
+            /* second quarter */
+            fullarc->p0x = 0;
+            fullarc->p0y = fullarc->rad;
+            fullarc->p1x = 0 - (int32_t)tang;
+            fullarc->p1y = fullarc->rad;
+            fullarc->p2x = 0 - fullarc->rad;
+            fullarc->p2y = (int32_t)tang;
+            fullarc->p3x = 0 - fullarc->rad;
+            fullarc->p3y = 0;
+            break;
+        case 2:
+            /* third quarter */
+            fullarc->p0x = 0 - fullarc->rad;
+            fullarc->p0y = 0;
+            fullarc->p1x = 0 - fullarc->rad;
+            fullarc->p1y = 0 - (int32_t)tang;
+            fullarc->p2x = 0 - (int32_t)tang;
+            fullarc->p2y = 0 - fullarc->rad;
+            fullarc->p3x = 0;
+            fullarc->p3y = 0 - fullarc->rad;
+            break;
+        case 3:
+            /* fourth quarter */
+            fullarc->p0x = 0;
+            fullarc->p0y = 0 - fullarc->rad;
+            fullarc->p1x = (int32_t)tang;
+            fullarc->p1y = 0 - fullarc->rad;
+            fullarc->p2x = fullarc->rad;
+            fullarc->p2y = 0 - (int32_t)tang;
+            fullarc->p3x = fullarc->rad;
+            fullarc->p3y = 0;
+            break;
+        default:
+            LV_LOG_ERROR("Invalid arc quarter value.");
+            break;
+    }
+}
+
+/**
+ * Linear interpolation between two points 'a' and 'b'
+ * 't' parameter is the proportion ratio expressed in range [0 ; T_FRACTION ]
+ */
+static inline float lerp(float coord_a, float coord_b, uint16_t t)
+{
+    float tf = (float)t;
+    return ((T_FRACTION - tf) * coord_a + tf * coord_b) / T_FRACTION;
+}
+
+/**
+ * Computes a point of bezier curve given 't' param
+ */
+static inline float comp_bezier_point(float t, cubic_cont_pt cp)
+{
+    float t_sq = t * t;
+    float inv_t_sq = (1.0f - t) * (1.0f - t);
+    float apt = (1.0f - t) * inv_t_sq * cp.p0 + 3.0f * inv_t_sq * t * cp.p1 + 3.0f * (1.0f - t) * t_sq * cp.p2 + t * t_sq *
+                cp.p3;
+    return apt;
+}
+
+/**
+ * Find parameter 't' in curve at point 'pt'
+ * proceed by dichotomy on only 1 dimension,
+ * works only if the curve is monotonic
+ * bezier curve is defined by control points [p0 p1 p2 p3]
+ * 'dec' tells if curve is decreasing (true) or increasing (false)
+ */
+static uint16_t get_bez_t_from_pos(float pt, cubic_cont_pt cp, bool dec)
+{
+    /* initialize dichotomy with boundary 't' values */
+    float t_low = 0.0f;
+    float t_mid = 0.5f;
+    float t_hig = 1.0f;
+    float a_pt;
+    /* dichotomy loop */
+    for(int i = 0; i < DICHOTO_ITER; i++) {
+        a_pt = comp_bezier_point(t_mid, cp);
+        /* check mid-point position on bezier curve versus targeted point */
+        if((a_pt > pt) != dec) {
+            t_hig = t_mid;
+        }
+        else {
+            t_low = t_mid;
+        }
+        /* define new 't' param for mid-point */
+        t_mid = (t_low + t_hig) / 2.0f;
+    }
+    /* return parameter 't' in integer range [0 ; T_FRACTION] */
+    return (uint16_t)floorf(t_mid * T_FRACTION + 0.5f);
+}
+
+/**
+ * Gives relative coords of the control points
+ * for the sub-arc starting at angle with given angle span
+ */
+static void get_subarc_control_points(vg_arc * arc, int32_t span)
+{
+    vg_arc fullarc;
+    fullarc.angle = arc->angle;
+    fullarc.quarter = arc->quarter;
+    fullarc.rad = arc->rad;
+    set_full_arc(&fullarc);
+
+    /* special case of full arc */
+    if(arc->angle == 90) {
+        copy_arc(arc, &fullarc);
+        return;
+    }
+
+    /* compute 1st arc using the geometric construction of curve */
+    uint16_t t2 = TperDegree[arc->angle + span];
+
+    /* lerp for A */
+    float a2x = lerp((float)fullarc.p0x, (float)fullarc.p1x, t2);
+    float a2y = lerp((float)fullarc.p0y, (float)fullarc.p1y, t2);
+    /* lerp for B */
+    float b2x = lerp((float)fullarc.p1x, (float)fullarc.p2x, t2);
+    float b2y = lerp((float)fullarc.p1y, (float)fullarc.p2y, t2);
+    /* lerp for C */
+    float c2x = lerp((float)fullarc.p2x, (float)fullarc.p3x, t2);
+    float c2y = lerp((float)fullarc.p2y, (float)fullarc.p3y, t2);
+
+    /* lerp for D */
+    float d2x = lerp(a2x, b2x, t2);
+    float d2y = lerp(a2y, b2y, t2);
+    /* lerp for E */
+    float e2x = lerp(b2x, c2x, t2);
+    float e2y = lerp(b2y, c2y, t2);
+
+    float pt2x = lerp(d2x, e2x, t2);
+    float pt2y = lerp(d2y, e2y, t2);
+
+    /* compute sub-arc using the geometric construction of curve */
+    uint16_t t1 = TperDegree[arc->angle];
+
+    /* lerp for A */
+    float a1x = lerp((float)fullarc.p0x, (float)fullarc.p1x, t1);
+    float a1y = lerp((float)fullarc.p0y, (float)fullarc.p1y, t1);
+    /* lerp for B */
+    float b1x = lerp((float)fullarc.p1x, (float)fullarc.p2x, t1);
+    float b1y = lerp((float)fullarc.p1y, (float)fullarc.p2y, t1);
+    /* lerp for C */
+    float c1x = lerp((float)fullarc.p2x, (float)fullarc.p3x, t1);
+    float c1y = lerp((float)fullarc.p2y, (float)fullarc.p3y, t1);
+
+    /* lerp for D */
+    float d1x = lerp(a1x, b1x, t1);
+    float d1y = lerp(a1y, b1y, t1);
+    /* lerp for E */
+    float e1x = lerp(b1x, c1x, t1);
+    float e1y = lerp(b1y, c1y, t1);
+
+    float pt1x = lerp(d1x, e1x, t1);
+    float pt1y = lerp(d1y, e1y, t1);
+
+    /* find the 't3' parameter for point P(t1) on the sub-arc [P0 A2 D2 P(t2)] using dichotomy
+     * use position of x axis only */
+    uint16_t t3;
+    t3 = get_bez_t_from_pos(pt1x,
+    (cubic_cont_pt) {
+        .p0 = ((float)fullarc.p0x), .p1 = a2x, .p2 = d2x, .p3 = pt2x
+    },
+    (bool)(pt2x < (float)fullarc.p0x));
+
+    /* lerp for B */
+    float b3x = lerp(a2x, d2x, t3);
+    float b3y = lerp(a2y, d2y, t3);
+    /* lerp for C */
+    float c3x = lerp(d2x, pt2x, t3);
+    float c3y = lerp(d2y, pt2y, t3);
+
+    /* lerp for E */
+    float e3x = lerp(b3x, c3x, t3);
+    float e3y = lerp(b3y, c3y, t3);
+
+    arc->p0x = (int32_t)floorf(0.5f + pt1x);
+    arc->p0y = (int32_t)floorf(0.5f + pt1y);
+    arc->p1x = (int32_t)floorf(0.5f + e3x);
+    arc->p1y = (int32_t)floorf(0.5f + e3y);
+    arc->p2x = (int32_t)floorf(0.5f + c3x);
+    arc->p2y = (int32_t)floorf(0.5f + c3y);
+    arc->p3x = (int32_t)floorf(0.5f + pt2x);
+    arc->p3y = (int32_t)floorf(0.5f + pt2y);
+}
+
+/**
+ * Gives relative coords of the control points
+ */
+static void get_arc_control_points(vg_arc * arc, bool start)
+{
+    vg_arc fullarc;
+    fullarc.angle = arc->angle;
+    fullarc.quarter = arc->quarter;
+    fullarc.rad = arc->rad;
+    set_full_arc(&fullarc);
+
+    /* special case of full arc */
+    if(arc->angle == 90) {
+        copy_arc(arc, &fullarc);
+        return;
+    }
+
+    /* compute sub-arc using the geometric construction of curve */
+    uint16_t t = TperDegree[arc->angle];
+    /* lerp for A */
+    float ax = lerp((float)fullarc.p0x, (float)fullarc.p1x, t);
+    float ay = lerp((float)fullarc.p0y, (float)fullarc.p1y, t);
+    /* lerp for B */
+    float bx = lerp((float)fullarc.p1x, (float)fullarc.p2x, t);
+    float by = lerp((float)fullarc.p1y, (float)fullarc.p2y, t);
+    /* lerp for C */
+    float cx = lerp((float)fullarc.p2x, (float)fullarc.p3x, t);
+    float cy = lerp((float)fullarc.p2y, (float)fullarc.p3y, t);
+
+    /* lerp for D */
+    float dx = lerp(ax, bx, t);
+    float dy = lerp(ay, by, t);
+    /* lerp for E */
+    float ex = lerp(bx, cx, t);
+    float ey = lerp(by, cy, t);
+
+    /* sub-arc's control points are tangents of DeCasteljau's algorithm */
+    if(start) {
+        arc->p0x = (int32_t)floorf(0.5f + lerp(dx, ex, t));
+        arc->p0y = (int32_t)floorf(0.5f + lerp(dy, ey, t));
+        arc->p1x = (int32_t)floorf(0.5f + ex);
+        arc->p1y = (int32_t)floorf(0.5f + ey);
+        arc->p2x = (int32_t)floorf(0.5f + cx);
+        arc->p2y = (int32_t)floorf(0.5f + cy);
+        arc->p3x = fullarc.p3x;
+        arc->p3y = fullarc.p3y;
+    }
+    else {
+        arc->p0x = fullarc.p0x;
+        arc->p0y = fullarc.p0y;
+        arc->p1x = (int32_t)floorf(0.5f + ax);
+        arc->p1y = (int32_t)floorf(0.5f + ay);
+        arc->p2x = (int32_t)floorf(0.5f + dx);
+        arc->p2y = (int32_t)floorf(0.5f + dy);
+        arc->p3x = (int32_t)floorf(0.5f + lerp(dx, ex, t));
+        arc->p3y = (int32_t)floorf(0.5f + lerp(dy, ey, t));
+    }
+}
+
+/**
+ * Add the arc control points into the path data for vglite,
+ * taking into account the real center of the arc (translation).
+ * arc_path: (in/out) the path data array for vglite
+ * pidx: (in/out) index of last element added in arc_path
+ * q_arc: (in) the arc data containing control points
+ * center: (in) the center of the circle in draw coordinates
+ * cw: (in) true if arc is clockwise
+ */
+static void add_split_arc_path(int32_t * arc_path, int * pidx, vg_arc * q_arc, const lv_point_t * center, bool cw)
+{
+    /* assumes first control point already in array arc_path[] */
+    int idx = *pidx;
+    if(cw) {
+#if BEZIER_DBG_CONTROL_POINTS
+        arc_path[idx++] = VLC_OP_LINE;
+        arc_path[idx++] = q_arc->p1x + center->x;
+        arc_path[idx++] = q_arc->p1y + center->y;
+        arc_path[idx++] = VLC_OP_LINE;
+        arc_path[idx++] = q_arc->p2x + center->x;
+        arc_path[idx++] = q_arc->p2y + center->y;
+        arc_path[idx++] = VLC_OP_LINE;
+        arc_path[idx++] = q_arc->p3x + center->x;
+        arc_path[idx++] = q_arc->p3y + center->y;
+#else
+        arc_path[idx++] = VLC_OP_CUBIC;
+        arc_path[idx++] = q_arc->p1x + center->x;
+        arc_path[idx++] = q_arc->p1y + center->y;
+        arc_path[idx++] = q_arc->p2x + center->x;
+        arc_path[idx++] = q_arc->p2y + center->y;
+        arc_path[idx++] = q_arc->p3x + center->x;
+        arc_path[idx++] = q_arc->p3y + center->y;
+#endif
+    }
+    else {      /* reverse points order when counter-clockwise */
+#if BEZIER_DBG_CONTROL_POINTS
+        arc_path[idx++] = VLC_OP_LINE;
+        arc_path[idx++] = q_arc->p2x + center->x;
+        arc_path[idx++] = q_arc->p2y + center->y;
+        arc_path[idx++] = VLC_OP_LINE;
+        arc_path[idx++] = q_arc->p1x + center->x;
+        arc_path[idx++] = q_arc->p1y + center->y;
+        arc_path[idx++] = VLC_OP_LINE;
+        arc_path[idx++] = q_arc->p0x + center->x;
+        arc_path[idx++] = q_arc->p0y + center->y;
+#else
+        arc_path[idx++] = VLC_OP_CUBIC;
+        arc_path[idx++] = q_arc->p2x + center->x;
+        arc_path[idx++] = q_arc->p2y + center->y;
+        arc_path[idx++] = q_arc->p1x + center->x;
+        arc_path[idx++] = q_arc->p1y + center->y;
+        arc_path[idx++] = q_arc->p0x + center->x;
+        arc_path[idx++] = q_arc->p0y + center->y;
+#endif
+    }
+    /* update index i n path array*/
+    *pidx = idx;
+}
+
+static void add_arc_path(int32_t * arc_path, int * pidx, int32_t radius,
+                         int32_t start_angle, int32_t end_angle, const lv_point_t * center, bool cw)
+{
+    /* set number of arcs to draw */
+    vg_arc q_arc;
+    int32_t start_arc_angle = start_angle % 90;
+    int32_t end_arc_angle = end_angle % 90;
+    int32_t inv_start_arc_angle = (start_arc_angle > 0) ? (90 - start_arc_angle) : 0;
+    int32_t nbarc = (end_angle - start_angle - inv_start_arc_angle - end_arc_angle) / 90;
+    q_arc.rad = radius;
+
+    /* handle special case of start & end point in the same quarter */
+    if(((start_angle / 90) == (end_angle / 90)) && (nbarc <= 0)) {
+        q_arc.quarter = (start_angle / 90) % 4;
+        q_arc.angle = start_arc_angle;
+        get_subarc_control_points(&q_arc, end_arc_angle - start_arc_angle);
+        add_split_arc_path(arc_path, pidx, &q_arc, center, cw);
+        return;
+    }
+
+    if(cw) {
+        /* partial starting arc */
+        if(start_arc_angle > 0) {
+            q_arc.quarter = (start_angle / 90) % 4;
+            q_arc.angle = start_arc_angle;
+            /* get cubic points relative to center */
+            get_arc_control_points(&q_arc, true);
+            /* put cubic points in arc_path */
+            add_split_arc_path(arc_path, pidx, &q_arc, center, cw);
+        }
+        /* full arcs */
+        for(int32_t q = 0; q < nbarc ; q++) {
+            q_arc.quarter = (q + ((start_angle + 89) / 90)) % 4;
+            q_arc.angle = 90;
+            /* get cubic points relative to center */
+            get_arc_control_points(&q_arc, true);   /* 2nd parameter 'start' ignored */
+            /* put cubic points in arc_path */
+            add_split_arc_path(arc_path, pidx, &q_arc, center, cw);
+        }
+        /* partial ending arc */
+        if(end_arc_angle > 0) {
+            q_arc.quarter = (end_angle / 90) % 4;
+            q_arc.angle = end_arc_angle;
+            /* get cubic points relative to center */
+            get_arc_control_points(&q_arc, false);
+            /* put cubic points in arc_path */
+            add_split_arc_path(arc_path, pidx, &q_arc, center, cw);
+        }
+
+    }
+    else {   /* counter clockwise */
+
+        /* partial ending arc */
+        if(end_arc_angle > 0) {
+            q_arc.quarter = (end_angle / 90) % 4;
+            q_arc.angle = end_arc_angle;
+            /* get cubic points relative to center */
+            get_arc_control_points(&q_arc, false);
+            /* put cubic points in arc_path */
+            add_split_arc_path(arc_path, pidx, &q_arc, center, cw);
+        }
+        /* full arcs */
+        for(int32_t q = nbarc - 1; q >= 0; q--) {
+            q_arc.quarter = (q + ((start_angle + 89) / 90)) % 4;
+            q_arc.angle = 90;
+            /* get cubic points relative to center */
+            get_arc_control_points(&q_arc, true);   /* 2nd parameter 'start' ignored */
+            /* put cubic points in arc_path */
+            add_split_arc_path(arc_path, pidx, &q_arc, center, cw);
+        }
+        /* partial starting arc */
+        if(start_arc_angle > 0) {
+            q_arc.quarter = (start_angle / 90) % 4;
+            q_arc.angle = start_arc_angle;
+            /* get cubic points relative to center */
+            get_arc_control_points(&q_arc, true);
+            /* put cubic points in arc_path */
+            add_split_arc_path(arc_path, pidx, &q_arc, center, cw);
+        }
+    }
+}
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.h
new file mode 100644 (file)
index 0000000..0fbff3d
--- /dev/null
@@ -0,0 +1,83 @@
+/**
+ * @file lv_draw_vglite_arc.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2021-2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+#ifndef LV_DRAW_VGLITE_ARC_H
+#define LV_DRAW_VGLITE_ARC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "lv_vglite_utils.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Draw arc shape with effects
+ *
+ * @param[in] center Arc center with relative coordinates
+ * @param[in] radius Radius of external arc
+ * @param[in] start_angle Starting angle in degrees
+ * @param[in] end_angle Ending angle in degrees
+ * @param[in] clip_area Clipping area with relative coordinates to dest buff
+ * @param[in] dsc Arc description structure (width, rounded ending, opacity)
+ *
+ * @retval LV_RES_OK Draw completed
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+lv_res_t lv_gpu_nxp_vglite_draw_arc(const lv_point_t * center, int32_t radius, int32_t start_angle, int32_t end_angle,
+                                    const lv_area_t * clip_area, const lv_draw_arc_dsc_t * dsc);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_DRAW_VGLITE_ARC_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.c
new file mode 100644 (file)
index 0000000..4a15fd5
--- /dev/null
@@ -0,0 +1,635 @@
+/**
+ * @file lv_draw_vglite_blend.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2020-2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "lv_draw_vglite_blend.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "lv_vglite_buf.h"
+#include "lv_vglite_utils.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/** Stride in px required by VG-Lite HW*/
+#define LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX 16U
+
+#if VG_LITE_BLIT_SPLIT_ENABLED
+    /**
+    * BLIT split threshold - BLITs with width or height higher than this value will be done
+    * in multiple steps. Value must be 16-aligned. Don't change.
+    */
+    #define LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR 352
+#endif
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+/**
+ * Blit image, with optional opacity.
+ *
+ * @param[in] src_area Source area with relative coordinates of source buffer
+ * @param[in] opa Opacity
+ *
+ * @retval LV_RES_OK Transfer complete
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+static lv_res_t lv_vglite_blit(const lv_area_t * src_area, lv_opa_t opa);
+
+/**
+ * Check source memory and stride alignment.
+ *
+ * @param[in] src_buf Source buffer
+ * @param[in] src_stride Stride of source buffer in pixels
+ *
+ * @retval LV_RES_OK Alignment OK
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+static lv_res_t check_src_alignment(const lv_color_t * src_buf, lv_coord_t src_stride);
+
+/**
+ * Creates matrix that translates to origin of given destination area.
+ *
+ * @param[in] dest_area Area with relative coordinates of destination buffer
+ */
+static inline void lv_vglite_set_translation_matrix(const lv_area_t * dest_area);
+
+/**
+ * Creates matrix that translates to origin of given destination area with transformation (scale or rotate).
+ *
+ * @param[in] dest_area Area with relative coordinates of destination buffer
+ * @param[in] dsc Image descriptor
+ */
+static inline void lv_vglite_set_transformation_matrix(const lv_area_t * dest_area, const lv_draw_img_dsc_t * dsc);
+
+#if VG_LITE_BLIT_SPLIT_ENABLED
+/**
+ * Move buffer pointer as close as possible to area, but with respect to alignment requirements. X-axis only.
+ *
+ * @param[in/out] area Area to be updated
+ * @param[in/out] buf Pointer to be updated
+ */
+static void align_x(lv_area_t * area, lv_color_t ** buf);
+
+/**
+ * Move buffer pointer to the area start and update variables, Y-axis only.
+ *
+ * @param[in/out] area Area to be updated
+ * @param[in/out] buf Pointer to be updated
+ * @param[in] stride Buffer stride in pixels
+ */
+static void align_y(lv_area_t * area, lv_color_t ** buf, lv_coord_t stride);
+
+/**
+ * Blit image split in tiles, with optional opacity.
+ *
+ * @param[in/out] dest_buf Destination buffer
+ * @param[in] dest_area Area with relative coordinates of destination buffer
+ * @param[in] dest_stride Stride of destination buffer in pixels
+ * @param[in] src_buf Source buffer
+ * @param[in] src_area Source area with relative coordinates of source buffer
+ * @param[in] src_stride Stride of source buffer in pixels
+ * @param[in] opa Opacity
+ *
+ * @retval LV_RES_OK Transfer complete
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+static lv_res_t lv_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride,
+                                     const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride,
+                                     lv_opa_t opa);
+#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+static vg_lite_matrix_t vgmatrix;
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+lv_res_t lv_gpu_nxp_vglite_fill(const lv_area_t * dest_area, lv_color_t color, lv_opa_t opa)
+{
+    vg_lite_error_t err = VG_LITE_SUCCESS;
+    lv_color32_t col32 = {.full = lv_color_to32(color)}; /*Convert color to RGBA8888*/
+    vg_lite_color_t vgcol; /* vglite takes ABGR */
+    vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf();
+
+    vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888;
+    if(lv_vglite_premult_and_swizzle(&vgcol, col32, opa, color_format) != LV_RES_OK)
+        VG_LITE_RETURN_INV("Premultiplication and swizzle failed.");
+
+    if(opa >= (lv_opa_t)LV_OPA_MAX) {   /*Opaque fill*/
+        vg_lite_rectangle_t rect = {
+            .x = dest_area->x1,
+            .y = dest_area->y1,
+            .width = lv_area_get_width(dest_area),
+            .height = lv_area_get_height(dest_area)
+        };
+
+        err = vg_lite_clear(vgbuf, &rect, vgcol);
+        VG_LITE_ERR_RETURN_INV(err, "Clear failed.");
+
+        if(lv_vglite_run() != LV_RES_OK)
+            VG_LITE_RETURN_INV("Run failed.");
+    }
+    else {   /*fill with transparency*/
+
+        vg_lite_path_t path;
+        int32_t path_data[] = { /*VG rectangular path*/
+            VLC_OP_MOVE, dest_area->x1,  dest_area->y1,
+            VLC_OP_LINE, dest_area->x2 + 1,  dest_area->y1,
+            VLC_OP_LINE, dest_area->x2 + 1,  dest_area->y2 + 1,
+            VLC_OP_LINE, dest_area->x1,  dest_area->y2 + 1,
+            VLC_OP_LINE, dest_area->x1,  dest_area->y1,
+            VLC_OP_END
+        };
+
+        err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_LOW, sizeof(path_data), path_data,
+                                (vg_lite_float_t) dest_area->x1, (vg_lite_float_t) dest_area->y1,
+                                ((vg_lite_float_t) dest_area->x2) + 1.0f, ((vg_lite_float_t) dest_area->y2) + 1.0f);
+        VG_LITE_ERR_RETURN_INV(err, "Init path failed.");
+
+        vg_lite_matrix_t matrix;
+        vg_lite_identity(&matrix);
+
+        /*Draw rectangle*/
+        err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol);
+        VG_LITE_ERR_RETURN_INV(err, "Draw rectangle failed.");
+
+        if(lv_vglite_run() != LV_RES_OK)
+            VG_LITE_RETURN_INV("Run failed.");
+
+        err = vg_lite_clear_path(&path);
+        VG_LITE_ERR_RETURN_INV(err, "Clear path failed.");
+    }
+
+    return LV_RES_OK;
+}
+
+#if VG_LITE_BLIT_SPLIT_ENABLED
+lv_res_t lv_gpu_nxp_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride,
+                                      const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride,
+                                      lv_opa_t opa)
+{
+    /* Set src_vgbuf structure. */
+    lv_vglite_set_src_buf(src_buf, src_area, src_stride);
+
+    lv_color_t * orig_dest_buf = dest_buf;
+
+    lv_res_t rv = lv_vglite_blit_split(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride, opa);
+
+    /* Restore the original dest_vgbuf memory address. */
+    lv_vglite_set_dest_buf_ptr(orig_dest_buf);
+
+    return rv;
+}
+#else
+lv_res_t lv_gpu_nxp_vglite_blit(const lv_area_t * dest_area,
+                                const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride,
+                                lv_opa_t opa)
+{
+    if(check_src_alignment(src_buf, src_stride) != LV_RES_OK)
+        VG_LITE_RETURN_INV("Check src alignment failed.");
+
+    /* Set src_vgbuf structure. */
+    lv_vglite_set_src_buf(src_buf, src_area, src_stride);
+
+    /* Set scissor. */
+    lv_vglite_set_scissor(dest_area);
+
+    /* Set vgmatrix. */
+    lv_vglite_set_translation_matrix(dest_area);
+
+    /* Start blit. */
+    lv_res_t rv = lv_vglite_blit(src_area, opa);
+
+    /* Disable scissor. */
+    lv_vglite_disable_scissor();
+
+    return rv;
+}
+
+lv_res_t lv_gpu_nxp_vglite_blit_transform(const lv_area_t * dest_area, const lv_area_t * clip_area,
+                                          const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride,
+                                          const lv_draw_img_dsc_t * dsc)
+{
+    lv_res_t rv = LV_RES_INV;
+
+    if(check_src_alignment(src_buf, src_stride) != LV_RES_OK)
+        VG_LITE_RETURN_INV("Check src alignment failed.");
+
+    /* Set src_vgbuf structure. */
+    lv_vglite_set_src_buf(src_buf, src_area, src_stride);
+
+    /* Set scissor */
+    lv_vglite_set_scissor(clip_area);
+
+    /* Set vgmatrix. */
+    lv_vglite_set_transformation_matrix(dest_area, dsc);
+
+    /* Start blit. */
+    rv = lv_vglite_blit(src_area, dsc->opa);
+
+    /* Disable scissor. */
+    lv_vglite_disable_scissor();
+
+    return rv;
+}
+#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/
+
+lv_res_t lv_gpu_nxp_vglite_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+                                       const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride)
+{
+    vg_lite_error_t err = VG_LITE_SUCCESS;
+
+    if(check_src_alignment(src_buf, src_stride) != LV_RES_OK)
+        VG_LITE_RETURN_INV("Check src alignment failed.");
+
+    vg_lite_buffer_t src_vgbuf;
+    /* Set src_vgbuf structure. */
+    lv_vglite_set_buf(&src_vgbuf, src_buf, src_area, src_stride);
+
+    vg_lite_buffer_t dest_vgbuf;
+    /* Set dest_vgbuf structure. */
+    lv_vglite_set_buf(&dest_vgbuf, dest_buf, dest_area, dest_stride);
+
+    uint32_t rect[] = {
+        (uint32_t)src_area->x1, /* start x */
+        (uint32_t)src_area->y1, /* start y */
+        (uint32_t)lv_area_get_width(src_area), /* width */
+        (uint32_t)lv_area_get_height(src_area) /* height */
+    };
+
+    /* Set scissor. */
+    lv_vglite_set_scissor(dest_area);
+
+    /* Set vgmatrix. */
+    lv_vglite_set_translation_matrix(dest_area);
+
+    err = vg_lite_blit_rect(&dest_vgbuf, &src_vgbuf, rect, &vgmatrix,
+                            VG_LITE_BLEND_NONE, 0xFFFFFFFFU, VG_LITE_FILTER_POINT);
+    if(err != VG_LITE_SUCCESS) {
+        LV_LOG_ERROR("Blit rectangle failed.");
+        /* Disable scissor. */
+        lv_vglite_disable_scissor();
+
+        return LV_RES_INV;
+    }
+
+    if(lv_vglite_run() != LV_RES_OK) {
+        LV_LOG_ERROR("Run failed.");
+        /* Disable scissor. */
+        lv_vglite_disable_scissor();
+
+        return LV_RES_INV;
+    }
+
+    /* Disable scissor. */
+    lv_vglite_disable_scissor();
+
+    return LV_RES_OK;
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+#if VG_LITE_BLIT_SPLIT_ENABLED
+static lv_res_t lv_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride,
+                                     const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride,
+                                     lv_opa_t opa)
+{
+    lv_res_t rv = LV_RES_INV;
+
+    VG_LITE_LOG_TRACE("Blit "
+                      "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | "
+                      "Size: ([%dx%d] -> [%dx%d]) | "
+                      "Addr: (0x%x -> 0x%x)",
+                      src_area->x1, src_area->y1, src_area->x2, src_area->y2,
+                      dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2,
+                      lv_area_get_width(src_area), lv_area_get_height(src_area),
+                      lv_area_get_width(dest_area), lv_area_get_height(dest_area),
+                      (uintptr_t)src_buf, (uintptr_t)dest_buf);
+
+    /* Stage 1: Move starting pointers as close as possible to [x1, y1], so coordinates are as small as possible. */
+    align_x(src_area, (lv_color_t **)&src_buf);
+    align_y(src_area, (lv_color_t **)&src_buf, src_stride);
+    align_x(dest_area, (lv_color_t **)&dest_buf);
+    align_y(dest_area, (lv_color_t **)&dest_buf, dest_stride);
+
+    /* Stage 2: If we're in limit, do a single BLIT */
+    if((src_area->x2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) &&
+       (src_area->y2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR)) {
+        if(check_src_alignment(src_buf, src_stride) != LV_RES_OK)
+            VG_LITE_RETURN_INV("Check src alignment failed.");
+
+        /* Set new dest_vgbuf and src_vgbuf memory addresses. */
+        lv_vglite_set_dest_buf_ptr(dest_buf);
+        lv_vglite_set_src_buf_ptr(src_buf);
+
+        /* Set scissor */
+        lv_vglite_set_scissor(dest_area);
+
+        /* Set vgmatrix. */
+        lv_vglite_set_translation_matrix(dest_area);
+
+        /* Start blit. */
+        rv = lv_vglite_blit(src_area, opa);
+
+        /* Disable scissor. */
+        lv_vglite_disable_scissor();
+
+        VG_LITE_LOG_TRACE("Single "
+                          "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | "
+                          "Size: ([%dx%d] -> [%dx%d]) | "
+                          "Addr: (0x%x -> 0x%x) %s",
+                          src_area->x1, src_area->y1, src_area->x2, src_area->y2,
+                          dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2,
+                          lv_area_get_width(src_area), lv_area_get_height(src_area),
+                          lv_area_get_width(dest_area), lv_area_get_height(dest_area),
+                          (uintptr_t)src_buf, (uintptr_t)dest_buf,
+                          rv == LV_RES_OK ? "OK!" : "FAILED!");
+
+        return rv;
+    };
+
+    /* Stage 3: Split the BLIT into multiple tiles */
+    VG_LITE_LOG_TRACE("Split "
+                      "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | "
+                      "Size: ([%dx%d] -> [%dx%d]) | "
+                      "Addr: (0x%x -> 0x%x)",
+                      src_area->x1, src_area->y1, src_area->x2, src_area->y2,
+                      dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2,
+                      lv_area_get_width(src_area), lv_area_get_height(src_area),
+                      lv_area_get_width(dest_area), lv_area_get_height(dest_area),
+                      (uintptr_t)src_buf, (uintptr_t)dest_buf);
+
+
+    lv_coord_t width = lv_area_get_width(src_area);
+    lv_coord_t height = lv_area_get_height(src_area);
+
+    /* Number of tiles needed */
+    int total_tiles_x = (src_area->x1 + width + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) /
+                        LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR;
+    int total_tiles_y = (src_area->y1 + height + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) /
+                        LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR;
+
+    /* src and dst buffer shift against each other. Src buffer real data [0,0] may start actually at [3,0] in buffer, as
+     * the buffer pointer has to be aligned, while dst buffer real data [0,0] may start at [1,0] in buffer. alignment may be
+     * different */
+    int shift_src_x = (src_area->x1 > dest_area->x1) ? (src_area->x1 - dest_area->x1) : 0;
+    int shift_dest_x = (src_area->x1 < dest_area->x1) ? (dest_area->x1 - src_area->x1) : 0;
+
+    VG_LITE_LOG_TRACE("X shift: src: %d, dst: %d", shift_src_x, shift_dest_x);
+
+    lv_color_t * tile_dest_buf;
+    lv_area_t tile_dest_area;
+    const lv_color_t * tile_src_buf;
+    lv_area_t tile_src_area;
+
+    for(int y = 0; y < total_tiles_y; y++) {
+
+        tile_src_area.y1 = 0; /* no vertical alignment, always start from 0 */
+        tile_src_area.y2 = height - y * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1;
+        if(tile_src_area.y2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) {
+            tile_src_area.y2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; /* Should never happen */
+        }
+        tile_src_buf = src_buf + y * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * src_stride;
+
+        tile_dest_area.y1 = tile_src_area.y1; /* y has no alignment, always in sync with src */
+        tile_dest_area.y2 = tile_src_area.y2;
+
+        tile_dest_buf = dest_buf + y * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * dest_stride;
+
+        for(int x = 0; x < total_tiles_x; x++) {
+
+            if(x == 0) {
+                /* 1st tile is special - there may be a gap between buffer start pointer
+                 * and area.x1 value, as the pointer has to be aligned.
+                 * tile_src_buf pointer - keep init value from Y-loop.
+                 * Also, 1st tile start is not shifted! shift is applied from 2nd tile */
+                tile_src_area.x1 = src_area->x1;
+                tile_dest_area.x1 = dest_area->x1;
+            }
+            else {
+                /* subsequent tiles always starts from 0, but shifted*/
+                tile_src_area.x1 = 0 + shift_src_x;
+                tile_dest_area.x1 = 0 + shift_dest_x;
+                /* and advance start pointer + 1 tile size */
+                tile_src_buf += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR;
+                tile_dest_buf += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR;
+            }
+
+            /* Clip tile end coordinates */
+            tile_src_area.x2 = width + src_area->x1 - x * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1;
+            if(tile_src_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) {
+                tile_src_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1;
+            }
+
+            tile_dest_area.x2 = width + dest_area->x1 - x * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1;
+            if(tile_dest_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) {
+                tile_dest_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1;
+            }
+
+            if(x < (total_tiles_x - 1)) {
+                /* And adjust end coords if shifted, but not for last tile! */
+                tile_src_area.x2 += shift_src_x;
+                tile_dest_area.x2 += shift_dest_x;
+            }
+
+            if(check_src_alignment(tile_src_buf, src_stride) != LV_RES_OK)
+                VG_LITE_RETURN_INV("Check src alignment failed.");
+
+            /* Set new dest_vgbuf and src_vgbuf memory addresses. */
+            lv_vglite_set_dest_buf_ptr(tile_dest_buf);
+            lv_vglite_set_src_buf_ptr(tile_src_buf);
+
+            /* Set scissor */
+            lv_vglite_set_scissor(&tile_dest_area);
+
+            /* Set vgmatrix. */
+            lv_vglite_set_translation_matrix(&tile_dest_area);
+
+            /* Start blit. */
+            rv = lv_vglite_blit(&tile_src_area, opa);
+
+            /* Disable scissor. */
+            lv_vglite_disable_scissor();
+
+            VG_LITE_LOG_TRACE("Tile [%d, %d] "
+                              "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | "
+                              "Size: ([%dx%d] -> [%dx%d]) | "
+                              "Addr: (0x%x -> 0x%x) %s",
+                              x, y,
+                              tile_src_area.x1, tile_src_area.y1, tile_src_area.x2, tile_src_area.y2,
+                              tile_dest_area.x1, tile_dest_area.y1, tile_dest_area.x2, tile_dest_area.y2,
+                              lv_area_get_width(&tile_src_area), lv_area_get_height(&tile_src_area),
+                              lv_area_get_width(&tile_dest_area), lv_area_get_height(&tile_dest_area),
+                              (uintptr_t)tile_src_buf, (uintptr_t)tile_dest_buf,
+                              rv == LV_RES_OK ? "OK!" : "FAILED!");
+
+            if(rv != LV_RES_OK) {
+                return rv;
+            }
+        }
+    }
+
+    return rv;
+}
+#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/
+
+static lv_res_t lv_vglite_blit(const lv_area_t * src_area, lv_opa_t opa)
+{
+    vg_lite_error_t err = VG_LITE_SUCCESS;
+    vg_lite_buffer_t * dst_vgbuf = lv_vglite_get_dest_buf();
+    vg_lite_buffer_t * src_vgbuf = lv_vglite_get_src_buf();
+
+    uint32_t rect[] = {
+        (uint32_t)src_area->x1, /* start x */
+        (uint32_t)src_area->y1, /* start y */
+        (uint32_t)lv_area_get_width(src_area), /* width */
+        (uint32_t)lv_area_get_height(src_area) /* height */
+    };
+
+    uint32_t color;
+    vg_lite_blend_t blend;
+    if(opa >= (lv_opa_t)LV_OPA_MAX) {
+        color = 0xFFFFFFFFU;
+        blend = VG_LITE_BLEND_SRC_OVER;
+        src_vgbuf->transparency_mode = VG_LITE_IMAGE_TRANSPARENT;
+    }
+    else {
+        if(vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) {
+            color = (opa << 24) | 0x00FFFFFFU;
+        }
+        else {
+            color = (opa << 24) | (opa << 16) | (opa << 8) | opa;
+        }
+        blend = VG_LITE_BLEND_SRC_OVER;
+        src_vgbuf->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE;
+        src_vgbuf->transparency_mode = VG_LITE_IMAGE_TRANSPARENT;
+    }
+
+    err = vg_lite_blit_rect(dst_vgbuf, src_vgbuf, rect, &vgmatrix, blend, color, VG_LITE_FILTER_POINT);
+    VG_LITE_ERR_RETURN_INV(err, "Blit rectangle failed.");
+
+    if(lv_vglite_run() != LV_RES_OK)
+        VG_LITE_RETURN_INV("Run failed.");
+
+    return LV_RES_OK;
+}
+
+static lv_res_t check_src_alignment(const lv_color_t * src_buf, lv_coord_t src_stride)
+{
+    /* No alignment requirement for destination pixel buffer when using mode VG_LITE_LINEAR */
+
+    /* Test for pointer alignment */
+    if((((uintptr_t)src_buf) % (uintptr_t)LV_ATTRIBUTE_MEM_ALIGN_SIZE) != (uintptr_t)0x0U)
+        VG_LITE_RETURN_INV("Src buffer ptr (0x%x) not aligned to 0x%x bytes.",
+                           (size_t)src_buf, LV_ATTRIBUTE_MEM_ALIGN_SIZE);
+
+    /* Test for stride alignment */
+    if((src_stride % (lv_coord_t)LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX) != 0x0U)
+        VG_LITE_RETURN_INV("Src buffer stride (%d px) not aligned to %d px.",
+                           src_stride, LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX);
+    return LV_RES_OK;
+}
+
+static inline void lv_vglite_set_translation_matrix(const lv_area_t * dest_area)
+{
+    vg_lite_identity(&vgmatrix);
+    vg_lite_translate((vg_lite_float_t)dest_area->x1, (vg_lite_float_t)dest_area->y1, &vgmatrix);
+}
+
+static inline void lv_vglite_set_transformation_matrix(const lv_area_t * dest_area, const lv_draw_img_dsc_t * dsc)
+{
+    lv_vglite_set_translation_matrix(dest_area);
+
+    bool has_scale = (dsc->zoom != LV_IMG_ZOOM_NONE);
+    bool has_rotation = (dsc->angle != 0);
+
+    vg_lite_translate(dsc->pivot.x, dsc->pivot.y, &vgmatrix);
+    if(has_rotation)
+        vg_lite_rotate(dsc->angle / 10.0f, &vgmatrix);   /* angle is 1/10 degree */
+    if(has_scale) {
+        vg_lite_float_t scale = 1.0f * dsc->zoom / LV_IMG_ZOOM_NONE;
+        vg_lite_scale(scale, scale, &vgmatrix);
+    }
+    vg_lite_translate(0.0f - dsc->pivot.x, 0.0f - dsc->pivot.y, &vgmatrix);
+}
+
+#if VG_LITE_BLIT_SPLIT_ENABLED
+static void align_x(lv_area_t * area, lv_color_t ** buf)
+{
+    int alignedAreaStartPx = area->x1 - (area->x1 % (LV_ATTRIBUTE_MEM_ALIGN_SIZE / sizeof(lv_color_t)));
+    VG_LITE_COND_STOP(alignedAreaStartPx < 0, "Negative X alignment.");
+
+    area->x1 -= alignedAreaStartPx;
+    area->x2 -= alignedAreaStartPx;
+    *buf += alignedAreaStartPx;
+}
+
+static void align_y(lv_area_t * area, lv_color_t ** buf, lv_coord_t stride)
+{
+    int LineToAlignMem;
+    int alignedAreaStartPy;
+    /* find how many lines of pixels will respect memory alignment requirement */
+    if((stride % (lv_coord_t)LV_ATTRIBUTE_MEM_ALIGN_SIZE) == 0x0U) {
+        alignedAreaStartPy = area->y1;
+    }
+    else {
+        LineToAlignMem = LV_ATTRIBUTE_MEM_ALIGN_SIZE / (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t));
+        VG_LITE_COND_STOP(LV_ATTRIBUTE_MEM_ALIGN_SIZE % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t)),
+                          "Complex case: need gcd function.");
+        alignedAreaStartPy = area->y1 - (area->y1 % LineToAlignMem);
+        VG_LITE_COND_STOP(alignedAreaStartPy < 0, "Negative Y alignment.");
+    }
+
+    area->y1 -= alignedAreaStartPy;
+    area->y2 -= alignedAreaStartPy;
+    *buf += (uint32_t)(alignedAreaStartPy * stride);
+}
+#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.h
new file mode 100644 (file)
index 0000000..1aae34b
--- /dev/null
@@ -0,0 +1,168 @@
+/**
+ * @file lv_draw_vglite_blend.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2020-2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+#ifndef LV_DRAW_VGLITE_BLEND_H
+#define LV_DRAW_VGLITE_BLEND_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "lv_vglite_utils.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**
+ * Enable BLIT quality degradation workaround for RT595,
+ * recommended for screen's dimension > 352 pixels.
+ */
+#define RT595_BLIT_WRKRND_ENABLED 1
+
+/* Internal compound symbol */
+#if (defined(CPU_MIMXRT595SFFOB) || defined(CPU_MIMXRT595SFFOB_cm33) || \
+    defined(CPU_MIMXRT595SFFOC) || defined(CPU_MIMXRT595SFFOC_cm33)) && \
+    RT595_BLIT_WRKRND_ENABLED
+#define VG_LITE_BLIT_SPLIT_ENABLED 1
+#else
+#define VG_LITE_BLIT_SPLIT_ENABLED 0
+#endif
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Fill area, with optional opacity.
+ *
+ * @param[in] dest_area Area with relative coordinates of destination buffer
+ * @param[in] color Color
+ * @param[in] opa Opacity (255 = full, 128 = 50% background/50% color, 0 = no fill)
+ *
+ * @retval LV_RES_OK Fill completed
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+lv_res_t lv_gpu_nxp_vglite_fill(const lv_area_t * dest_area, lv_color_t color, lv_opa_t opa);
+
+#if VG_LITE_BLIT_SPLIT_ENABLED
+/**
+ * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects.
+ * By default, image is copied directly, with optional opacity.
+ *
+ * @param[in/out] dest_buf Destination buffer
+ * @param[in] dest_area Area with relative coordinates of destination buffer
+ * @param[in] dest_stride Stride of destination buffer in pixels
+ * @param[in] src_buf Source buffer
+ * @param[in] src_area Source area with relative coordinates of source buffer
+ * @param[in] src_stride Stride of source buffer in pixels
+ * @param[in] opa Opacity
+ *
+ * @retval LV_RES_OK Transfer complete
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+lv_res_t lv_gpu_nxp_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride,
+                                      const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride,
+                                      lv_opa_t opa);
+#else
+/**
+ * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects.
+ * By default, image is copied directly, with optional opacity.
+ *
+ * @param[in] dest_stride Stride of destination buffer in pixels
+ * @param[in] src_buf Source buffer
+ * @param[in] src_area Source area with relative coordinates of source buffer
+ * @param[in] src_stride Stride of source buffer in pixels
+ * @param[in] opa Opacity
+ *
+ * @retval LV_RES_OK Transfer complete
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+lv_res_t lv_gpu_nxp_vglite_blit(const lv_area_t * dest_area,
+                                const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride,
+                                lv_opa_t opa);
+
+/**
+ * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with transformation.
+ * By default, image is copied directly, with optional opacity.
+ *
+ * @param[in] dest_area Area with relative coordinates of destination buffer
+ * @param[in] clip_area Clip area with relative coordinates of destination buffer
+ * @param[in] src_buf Source buffer
+ * @param[in] src_area Source area with relative coordinates of source buffer
+ * @param[in] src_stride Stride of source buffer in pixels
+ * @param[in] dsc Image descriptor
+ *
+ * @retval LV_RES_OK Transfer complete
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+lv_res_t lv_gpu_nxp_vglite_blit_transform(const lv_area_t * dest_area, const lv_area_t * clip_area,
+                                          const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride,
+                                          const lv_draw_img_dsc_t * dsc);
+
+#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/
+
+/**
+ * BLock Image Transfer - simple copy of rectangular image from source to destination.
+ *
+ * @param[in] dest_buf Destination buffer
+ * @param[in] dest_area Area with relative coordinates of destination buffer
+ * @param[in] dest_stride Stride of destination buffer in pixels
+ * @param[in] src_buf Source buffer
+ * @param[in] src_area Source area with relative coordinates of source buffer
+ * @param[in] src_stride Stride of source buffer in pixels
+ *
+ * @retval LV_RES_OK Transfer complete
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+lv_res_t lv_gpu_nxp_vglite_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+                                       const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_DRAW_VGLITE_BLEND_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.c
new file mode 100644 (file)
index 0000000..bf7bee1
--- /dev/null
@@ -0,0 +1,142 @@
+/**
+ * @file lv_draw_vglite_line.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2022, 2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "lv_draw_vglite_line.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "lv_vglite_buf.h"
+#include <math.h>
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+lv_res_t lv_gpu_nxp_vglite_draw_line(const lv_point_t * point1, const lv_point_t * point2,
+                                     const lv_area_t * clip_area, const lv_draw_line_dsc_t * dsc)
+{
+    vg_lite_error_t err = VG_LITE_SUCCESS;
+    vg_lite_path_t path;
+    vg_lite_color_t vgcol; /* vglite takes ABGR */
+    vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf();
+    vg_lite_cap_style_t cap_style = (dsc->round_start || dsc->round_end) ? VG_LITE_CAP_ROUND : VG_LITE_CAP_BUTT;
+    vg_lite_join_style_t join_style = (dsc->round_start || dsc->round_end) ? VG_LITE_JOIN_ROUND : VG_LITE_JOIN_MITER;
+
+    bool is_dashed = (dsc->dash_width && dsc->dash_gap);
+
+    vg_lite_float_t stroke_dash_pattern[2] = {0, 0};
+    uint32_t stroke_dash_count = 0;
+    vg_lite_float_t stroke_dash_phase = 0;
+    if(is_dashed) {
+        stroke_dash_pattern[0] = (vg_lite_float_t)dsc->dash_width;
+        stroke_dash_pattern[1] = (vg_lite_float_t)dsc->dash_gap;
+        stroke_dash_count = sizeof(stroke_dash_pattern) / sizeof(vg_lite_float_t);
+        stroke_dash_phase = (vg_lite_float_t)dsc->dash_width / 2;
+    }
+
+    /* Choose vglite blend mode based on given lvgl blend mode */
+    vg_lite_blend_t vglite_blend_mode = lv_vglite_get_blend_mode(dsc->blend_mode);
+
+    /*** Init path ***/
+    lv_coord_t width = dsc->width;
+
+    int32_t line_path[] = { /*VG line path*/
+        VLC_OP_MOVE, point1->x, point1->y,
+        VLC_OP_LINE, point2->x, point2->y,
+        VLC_OP_END
+    };
+
+    err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(line_path), line_path,
+                            (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1,
+                            ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f);
+    VG_LITE_ERR_RETURN_INV(err, "Init path failed.");
+
+    vg_lite_matrix_t matrix;
+    vg_lite_identity(&matrix);
+
+    lv_color32_t col32 = { .full = lv_color_to32(dsc->color) }; /*Convert color to RGBA8888*/
+    vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888;
+    if(lv_vglite_premult_and_swizzle(&vgcol, col32, dsc->opa, color_format) != LV_RES_OK)
+        VG_LITE_RETURN_INV("Premultiplication and swizzle failed.");
+
+    /*** Draw line ***/
+    err = vg_lite_set_draw_path_type(&path, VG_LITE_DRAW_STROKE_PATH);
+    VG_LITE_ERR_RETURN_INV(err, "Set draw path type failed.");
+
+    err = vg_lite_set_stroke(&path, cap_style, join_style, width, 8, stroke_dash_pattern, stroke_dash_count,
+                             stroke_dash_phase, vgcol);
+    VG_LITE_ERR_RETURN_INV(err, "Set stroke failed.");
+
+    err = vg_lite_update_stroke(&path);
+    VG_LITE_ERR_RETURN_INV(err, "Update stroke failed.");
+
+    lv_vglite_set_scissor(clip_area);
+
+    err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, vglite_blend_mode, vgcol);
+    VG_LITE_ERR_RETURN_INV(err, "Draw line failed.");
+
+    if(lv_vglite_run() != LV_RES_OK)
+        VG_LITE_RETURN_INV("Run failed.");
+
+    lv_vglite_disable_scissor();
+
+    err = vg_lite_clear_path(&path);
+    VG_LITE_ERR_RETURN_INV(err, "Clear path failed.");
+
+    return LV_RES_OK;
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.h
new file mode 100644 (file)
index 0000000..cbd4b95
--- /dev/null
@@ -0,0 +1,83 @@
+/**
+ * @file lv_draw_vglite_line.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2022, 2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+#ifndef LV_DRAW_VGLITE_LINE_H
+#define LV_DRAW_VGLITE_LINE_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "lv_vglite_utils.h"
+#include "../../lv_draw_line.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Draw line shape with effects
+ *
+ * @param[in] point1 Starting point with relative coordinates
+ * @param[in] point2 Ending point with relative coordinates
+ * @param[in] clip_area Clipping area with relative coordinates to dest buff
+ * @param[in] dsc Line description structure (width, rounded ending, opacity, ...)
+ *
+ * @retval LV_RES_OK Draw completed
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+lv_res_t lv_gpu_nxp_vglite_draw_line(const lv_point_t * point1, const lv_point_t * point2,
+                                     const lv_area_t * clip_area, const lv_draw_line_dsc_t * dsc);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_DRAW_VGLITE_RECT_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.c
new file mode 100644 (file)
index 0000000..e9db57d
--- /dev/null
@@ -0,0 +1,459 @@
+/**
+ * @file lv_draw_vglite_rect.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2021-2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "lv_draw_vglite_rect.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "lv_vglite_buf.h"
+#include <math.h>
+
+/*********************
+ *      DEFINES
+ *********************/
+/*********************
+ *      DEFINES
+ *********************/
+
+/* Path data sizes for different elements */
+#define CUBIC_PATH_DATA_SIZE 7 /* 1 opcode, 6 arguments */
+#define LINE_PATH_DATA_SIZE 3  /* 1 opcode, 2 arguments */
+#define MOVE_PATH_DATA_SIZE 3  /* 1 opcode, 2 arguments */
+#define END_PATH_DATA_SIZE 1   /* 1 opcode, 0 arguments */
+/* Maximum possible rectangle path size
+ * is in the rounded rectangle case:
+ * - 1 move for the path start
+ * - 4 cubics for the corners
+ * - 4 lines for the sides
+ * - 1 end for the path end */
+#define RECT_PATH_DATA_MAX_SIZE 1 * MOVE_PATH_DATA_SIZE + 4 * CUBIC_PATH_DATA_SIZE + 4 * LINE_PATH_DATA_SIZE + 1 * END_PATH_DATA_SIZE
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+/**
+ * Generates path data for rectangle drawing.
+ *
+ * @param[in/out] path The path data to initialize
+ * @param[in/out] path_size The resulting size of the created path data
+ * @param[in] dsc The style descriptor for the rectangle to be drawn
+ * @param[in] coords The coordinates of the rectangle to be drawn
+ */
+static void lv_vglite_create_rect_path_data(int32_t * path_data, uint32_t * path_data_size,
+                                            lv_coord_t radius,
+                                            const lv_area_t * coords);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+lv_res_t lv_gpu_nxp_vglite_draw_bg(const lv_area_t * coords, const lv_area_t * clip_area,
+                                   const lv_draw_rect_dsc_t * dsc)
+{
+    vg_lite_error_t err = VG_LITE_SUCCESS;
+    lv_coord_t width = lv_area_get_width(coords);
+    lv_coord_t height = lv_area_get_height(coords);
+    vg_lite_color_t vgcol;
+    lv_coord_t radius = dsc->radius;
+    vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf();
+
+    if(dsc->radius < 0)
+        return LV_RES_INV;
+
+    /*** Init path ***/
+    int32_t path_data[RECT_PATH_DATA_MAX_SIZE];
+    uint32_t path_data_size;
+    lv_vglite_create_rect_path_data(path_data, &path_data_size, radius, coords);
+    vg_lite_quality_t path_quality = dsc->radius > 0 ? VG_LITE_HIGH : VG_LITE_LOW;
+
+    vg_lite_path_t path;
+    err = vg_lite_init_path(&path, VG_LITE_S32, path_quality, path_data_size, path_data,
+                            (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1,
+                            ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f);
+    VG_LITE_ERR_RETURN_INV(err, "Init path failed.");
+
+    vg_lite_matrix_t matrix;
+    vg_lite_identity(&matrix);
+
+    vg_lite_matrix_t * grad_matrix;
+    vg_lite_linear_gradient_t gradient;
+
+    /*** Init Color/Gradient ***/
+    if(dsc->bg_grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE) {
+        uint32_t colors[2];
+        uint32_t stops[2];
+        lv_color32_t col32[2];
+
+        /* Gradient setup */
+        uint8_t cnt = LV_MAX(dsc->bg_grad.stops_count, 2);
+        for(uint8_t i = 0; i < cnt; i++) {
+            col32[i].full = lv_color_to32(dsc->bg_grad.stops[i].color); /*Convert color to RGBA8888*/
+            stops[i] = dsc->bg_grad.stops[i].frac;
+
+            vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_ABGR8888 : VG_LITE_ARGB8888;
+            if(lv_vglite_premult_and_swizzle(&colors[i], col32[i], dsc->bg_opa, color_format) != LV_RES_OK)
+                VG_LITE_RETURN_INV("Premultiplication and swizzle failed.");
+        }
+
+        lv_memset_00(&gradient, sizeof(vg_lite_linear_gradient_t));
+
+        err = vg_lite_init_grad(&gradient);
+        VG_LITE_ERR_RETURN_INV(err, "Init gradient failed");
+
+        err = vg_lite_set_grad(&gradient, cnt, colors, stops);
+        VG_LITE_ERR_RETURN_INV(err, "Set gradient failed.");
+
+        err = vg_lite_update_grad(&gradient);
+        VG_LITE_ERR_RETURN_INV(err, "Update gradient failed.");
+
+        grad_matrix = vg_lite_get_grad_matrix(&gradient);
+        vg_lite_identity(grad_matrix);
+        vg_lite_translate((float)coords->x1, (float)coords->y1, grad_matrix);
+
+        if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_VER) {
+            vg_lite_scale(1.0f, (float)height / 256.0f, grad_matrix);
+            vg_lite_rotate(90.0f, grad_matrix);
+        }
+        else {   /*LV_GRAD_DIR_HOR*/
+            vg_lite_scale((float)width / 256.0f, 1.0f, grad_matrix);
+        }
+    }
+
+    lv_color32_t bg_col32 = {.full = lv_color_to32(dsc->bg_color)}; /*Convert color to RGBA8888*/
+    vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888;
+    if(lv_vglite_premult_and_swizzle(&vgcol, bg_col32, dsc->bg_opa, color_format) != LV_RES_OK)
+        VG_LITE_RETURN_INV("Premultiplication and swizzle failed.");
+
+    lv_vglite_set_scissor(clip_area);
+
+    /*** Draw rectangle ***/
+    if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE) {
+        err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol);
+    }
+    else {
+        err = vg_lite_draw_gradient(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, &gradient, VG_LITE_BLEND_SRC_OVER);
+    }
+    VG_LITE_ERR_RETURN_INV(err, "Draw gradient failed.");
+
+    if(lv_vglite_run() != LV_RES_OK)
+        VG_LITE_RETURN_INV("Run failed.");
+
+    lv_vglite_disable_scissor();
+
+    err = vg_lite_clear_path(&path);
+    VG_LITE_ERR_RETURN_INV(err, "Clear path failed.");
+
+    if(dsc->bg_grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE) {
+        err = vg_lite_clear_grad(&gradient);
+        VG_LITE_ERR_RETURN_INV(err, "Clear gradient failed.");
+    }
+
+    return LV_RES_OK;
+}
+
+lv_res_t lv_gpu_nxp_vglite_draw_border_generic(const lv_area_t * coords, const lv_area_t * clip_area,
+                                               const lv_draw_rect_dsc_t * dsc, bool border)
+{
+    vg_lite_error_t err = VG_LITE_SUCCESS;
+    vg_lite_color_t vgcol; /* vglite takes ABGR */
+    lv_coord_t radius = dsc->radius;
+    vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf();
+
+    if(radius < 0)
+        return LV_RES_INV;
+
+    if(border) {
+        /* Draw border - only has radius if object has radius*/
+        lv_coord_t border_half = (lv_coord_t)floor(dsc->border_width / 2.0f);
+        if(radius > border_half)
+            radius = radius - border_half;
+    }
+    else {
+        /* Draw outline - always has radius, leave the same radius in the circle case */
+        lv_coord_t outline_half = (lv_coord_t)ceil(dsc->outline_width / 2.0f);
+        if(radius < (lv_coord_t)LV_RADIUS_CIRCLE - outline_half)
+            radius = radius + outline_half;
+    }
+
+    vg_lite_cap_style_t cap_style = (radius) ? VG_LITE_CAP_ROUND : VG_LITE_CAP_BUTT;
+    vg_lite_join_style_t join_style = (radius) ? VG_LITE_JOIN_ROUND : VG_LITE_JOIN_MITER;
+
+    /* Choose vglite blend mode based on given lvgl blend mode */
+    vg_lite_blend_t vglite_blend_mode = lv_vglite_get_blend_mode(dsc->blend_mode);
+
+    /*** Init path ***/
+    int32_t path_data[RECT_PATH_DATA_MAX_SIZE];
+    uint32_t path_data_size;
+    lv_vglite_create_rect_path_data(path_data, &path_data_size, radius, coords);
+    vg_lite_quality_t path_quality = dsc->radius > 0 ? VG_LITE_HIGH : VG_LITE_LOW;
+
+    vg_lite_path_t path;
+    err = vg_lite_init_path(&path, VG_LITE_S32, path_quality, path_data_size, path_data,
+                            (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1,
+                            ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f);
+    VG_LITE_ERR_RETURN_INV(err, "Init path failed.");
+
+    vg_lite_matrix_t matrix;
+    vg_lite_identity(&matrix);
+
+    lv_opa_t opa;
+    lv_color32_t col32;
+    lv_coord_t line_width;
+
+    if(border) {
+        opa = dsc->border_opa;
+        col32.full = lv_color_to32(dsc->border_color); /*Convert color to RGBA8888*/
+        line_width = dsc->border_width;
+    }
+    else {
+        opa = dsc->outline_opa;
+        col32.full = lv_color_to32(dsc->outline_color); /*Convert color to RGBA8888*/
+        line_width = dsc->outline_width;
+    }
+
+    vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888;
+    if(lv_vglite_premult_and_swizzle(&vgcol, col32, opa, color_format) != LV_RES_OK)
+        VG_LITE_RETURN_INV("Premultiplication and swizzle failed.");
+
+    /*** Draw border ***/
+    err = vg_lite_set_draw_path_type(&path, VG_LITE_DRAW_STROKE_PATH);
+    VG_LITE_ERR_RETURN_INV(err, "Set draw path type failed.");
+
+    err = vg_lite_set_stroke(&path, cap_style, join_style, line_width, 8, NULL, 0, 0, vgcol);
+    VG_LITE_ERR_RETURN_INV(err, "Set stroke failed.");
+
+    err = vg_lite_update_stroke(&path);
+    VG_LITE_ERR_RETURN_INV(err, "Update stroke failed.");
+
+    lv_vglite_set_scissor(clip_area);
+
+    err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, vglite_blend_mode, vgcol);
+    VG_LITE_ERR_RETURN_INV(err, "Draw border failed.");
+
+    if(lv_vglite_run() != LV_RES_OK)
+        VG_LITE_RETURN_INV("Run failed.");
+
+    lv_vglite_disable_scissor();
+
+    err = vg_lite_clear_path(&path);
+    VG_LITE_ERR_RETURN_INV(err, "Clear path failed.");
+
+    return LV_RES_OK;
+
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+static void lv_vglite_create_rect_path_data(int32_t * path_data, uint32_t * path_data_size,
+                                            lv_coord_t radius,
+                                            const lv_area_t * coords)
+{
+    lv_coord_t rect_width = lv_area_get_width(coords);
+    lv_coord_t rect_height = lv_area_get_height(coords);
+
+    /* Get the final radius. Can't be larger than the half of the shortest side */
+    int32_t shortest_side = LV_MIN(rect_width, rect_height);
+    int32_t final_radius = LV_MIN(radius, shortest_side / 2);
+
+    /* Path data element index */
+    uint8_t pidx = 0;
+
+    if((radius == (lv_coord_t)LV_RADIUS_CIRCLE) && (rect_width == rect_height)) {
+
+        /* Get the control point offset for rounded cases */
+        int32_t cpoff = (int32_t)((float)final_radius * BEZIER_OPTIM_CIRCLE);
+
+        /* Circle case */
+        /* Starting point */
+        path_data[pidx++] = VLC_OP_MOVE;
+        path_data[pidx++] = coords->x1 + final_radius;
+        path_data[pidx++] = coords->y1;
+
+        /* Top-right arc */
+        path_data[pidx++] = VLC_OP_CUBIC_REL;
+        path_data[pidx++] = cpoff;
+        path_data[pidx++] = 0;
+        path_data[pidx++] = final_radius;
+        path_data[pidx++] = final_radius - cpoff;
+        path_data[pidx++] = final_radius;
+        path_data[pidx++] = final_radius;
+
+        /* Bottom-right arc*/
+        path_data[pidx++] = VLC_OP_CUBIC_REL;
+        path_data[pidx++] = 0;
+        path_data[pidx++] = cpoff;
+        path_data[pidx++] = cpoff - final_radius;
+        path_data[pidx++] = final_radius;
+        path_data[pidx++] = 0 - final_radius;
+        path_data[pidx++] = final_radius;
+
+        /* Bottom-left arc */
+        path_data[pidx++] = VLC_OP_CUBIC_REL;
+        path_data[pidx++] = 0 - cpoff;
+        path_data[pidx++] = 0;
+        path_data[pidx++] = 0 - final_radius;
+        path_data[pidx++] = cpoff - final_radius;
+        path_data[pidx++] = 0 - final_radius;
+        path_data[pidx++] = 0 - final_radius;
+
+        /* Top-left arc*/
+        path_data[pidx++] = VLC_OP_CUBIC_REL;
+        path_data[pidx++] = 0;
+        path_data[pidx++] = 0 - cpoff;
+        path_data[pidx++] = final_radius - cpoff;
+        path_data[pidx++] = 0 - final_radius;
+        path_data[pidx++] = final_radius;
+        path_data[pidx++] = 0 - final_radius;
+
+        /* Ending point */
+        path_data[pidx++] = VLC_OP_END;
+    }
+    else if(radius > 0) {
+        /* Get the control point offset for rounded cases */
+        int32_t cpoff = (int32_t)((float)final_radius * BEZIER_OPTIM_CIRCLE);
+
+        /* Rounded rectangle case */
+        /* Starting point */
+        path_data[pidx++] = VLC_OP_MOVE;
+        path_data[pidx++] = coords->x1 + final_radius;
+        path_data[pidx++] = coords->y1;
+
+        /* Top side */
+        path_data[pidx++] = VLC_OP_LINE;
+        path_data[pidx++] = coords->x2 - final_radius + 1;  // Extended for VGLite
+        path_data[pidx++] = coords->y1;
+
+        /* Top-right corner */
+        path_data[pidx++] = VLC_OP_CUBIC_REL;
+        path_data[pidx++] = cpoff;
+        path_data[pidx++] = 0;
+        path_data[pidx++] = final_radius;
+        path_data[pidx++] = final_radius - cpoff;
+        path_data[pidx++] = final_radius;
+        path_data[pidx++] = final_radius;
+
+        /* Right side */
+        path_data[pidx++] = VLC_OP_LINE;
+        path_data[pidx++] = coords->x2 + 1;                 // Extended for VGLite
+        path_data[pidx++] = coords->y2 - final_radius + 1;  // Extended for VGLite
+
+        /* Bottom-right corner*/
+        path_data[pidx++] = VLC_OP_CUBIC_REL;
+        path_data[pidx++] = 0;
+        path_data[pidx++] = cpoff;
+        path_data[pidx++] = cpoff - final_radius;
+        path_data[pidx++] = final_radius;
+        path_data[pidx++] = 0 - final_radius;
+        path_data[pidx++] = final_radius;
+
+        /* Bottom side */
+        path_data[pidx++] = VLC_OP_LINE;
+        path_data[pidx++] = coords->x1 + final_radius;
+        path_data[pidx++] = coords->y2 + 1;                 // Extended for VGLite
+
+        /* Bottom-left corner */
+        path_data[pidx++] = VLC_OP_CUBIC_REL;
+        path_data[pidx++] = 0 - cpoff;
+        path_data[pidx++] = 0;
+        path_data[pidx++] = 0 - final_radius;
+        path_data[pidx++] = cpoff - final_radius;
+        path_data[pidx++] = 0 - final_radius;
+        path_data[pidx++] = 0 - final_radius;
+
+        /* Left side*/
+        path_data[pidx++] = VLC_OP_LINE;
+        path_data[pidx++] = coords->x1;
+        path_data[pidx++] = coords->y1 + final_radius;
+
+        /* Top-left corner */
+        path_data[pidx++] = VLC_OP_CUBIC_REL;
+        path_data[pidx++] = 0;
+        path_data[pidx++] = 0 - cpoff;
+        path_data[pidx++] = final_radius - cpoff;
+        path_data[pidx++] = 0 - final_radius;
+        path_data[pidx++] = final_radius;
+        path_data[pidx++] = 0 - final_radius;
+
+        /* Ending point */
+        path_data[pidx++] = VLC_OP_END;
+    }
+    else {
+        /* Non-rounded rectangle case */
+        /* Starting point */
+        path_data[pidx++] = VLC_OP_MOVE;
+        path_data[pidx++] = coords->x1;
+        path_data[pidx++] = coords->y1;
+
+        /* Top side */
+        path_data[pidx++] = VLC_OP_LINE;
+        path_data[pidx++] = coords->x2 + 1; // Extended for VGLite
+        path_data[pidx++] = coords->y1;
+
+        /* Right side */
+        path_data[pidx++] = VLC_OP_LINE;
+        path_data[pidx++] = coords->x2 + 1; // Extended for VGLite
+        path_data[pidx++] = coords->y2 + 1; // Extended for VGLite
+
+        /* Bottom side */
+        path_data[pidx++] = VLC_OP_LINE;
+        path_data[pidx++] = coords->x1;
+        path_data[pidx++] = coords->y2 + 1; // Extended for VGLite
+
+        /* Left side*/
+        path_data[pidx++] = VLC_OP_LINE;
+        path_data[pidx++] = coords->x1;
+        path_data[pidx++] = coords->y1;
+
+        /* Ending point */
+        path_data[pidx++] = VLC_OP_END;
+    }
+
+    /* Resulting path size */
+    *path_data_size = pidx * sizeof(int32_t);
+}
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.h
new file mode 100644 (file)
index 0000000..7958227
--- /dev/null
@@ -0,0 +1,97 @@
+/**
+ * @file lv_draw_vglite_rect.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2021-2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+#ifndef LV_DRAW_VGLITE_RECT_H
+#define LV_DRAW_VGLITE_RECT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "lv_vglite_utils.h"
+#include "../../lv_draw_rect.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Draw rectangle background with effects (rounded corners, gradient)
+ *
+ * @param[in] coords Coordinates of the rectangle background (relative to dest buff)
+ * @param[in] clip_area Clipping area with relative coordinates to dest buff
+ * @param[in] dsc Description of the rectangle background
+ *
+ * @retval LV_RES_OK Draw completed
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ *
+ */
+lv_res_t lv_gpu_nxp_vglite_draw_bg(const lv_area_t * coords, const lv_area_t * clip_area,
+                                   const lv_draw_rect_dsc_t * dsc);
+
+/**
+ * Draw rectangle border/outline shape with effects (rounded corners, opacity)
+ *
+ * @param[in] coords Coordinates of the rectangle border/outline (relative to dest buff)
+ * @param[in] clip_area Clipping area with relative coordinates to dest buff
+ * @param[in] dsc Description of the rectangle border/outline
+ * @param[in] border True for border, False for outline
+ *
+ * @retval LV_RES_OK Draw completed
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ *
+ */
+lv_res_t lv_gpu_nxp_vglite_draw_border_generic(const lv_area_t * coords, const lv_area_t * clip_area,
+                                               const lv_draw_rect_dsc_t * dsc, bool border);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_DRAW_VGLITE_RECT_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_vglite_buf.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_vglite_buf.c
new file mode 100644 (file)
index 0000000..e1ff6a2
--- /dev/null
@@ -0,0 +1,141 @@
+/**
+ * @file lv_vglite_buf.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "lv_vglite_buf.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+
+/*********************
+ *      DEFINES
+ *********************/
+
+#if LV_COLOR_DEPTH == 16
+    #define VG_LITE_PX_FMT VG_LITE_RGB565
+#elif LV_COLOR_DEPTH == 32
+    #define VG_LITE_PX_FMT VG_LITE_BGRA8888
+#else
+    #error Only 16bit and 32bit color depth are supported. Set LV_COLOR_DEPTH to 16 or 32.
+#endif
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+static inline void lv_vglite_set_dest_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride);
+static inline void lv_vglite_set_buf_ptr(vg_lite_buffer_t * vgbuf, const lv_color_t * buf);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+static vg_lite_buffer_t dest_vgbuf;
+static vg_lite_buffer_t src_vgbuf;
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+void lv_gpu_nxp_vglite_init_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride)
+{
+    lv_vglite_set_dest_buf(buf, area, stride);
+}
+
+vg_lite_buffer_t * lv_vglite_get_dest_buf(void)
+{
+    return &dest_vgbuf;
+}
+
+vg_lite_buffer_t * lv_vglite_get_src_buf(void)
+{
+    return &src_vgbuf;
+}
+
+void lv_vglite_set_dest_buf_ptr(const lv_color_t * buf)
+{
+    lv_vglite_set_buf_ptr(&dest_vgbuf, buf);
+}
+
+void lv_vglite_set_src_buf_ptr(const lv_color_t * buf)
+{
+    lv_vglite_set_buf_ptr(&src_vgbuf, buf);
+}
+
+void lv_vglite_set_src_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride)
+{
+    if(src_vgbuf.memory != (void *)buf)
+        lv_vglite_set_buf(&src_vgbuf, buf, area, stride);
+}
+
+void lv_vglite_set_buf(vg_lite_buffer_t * vgbuf, const lv_color_t * buf,
+                       const lv_area_t * area, lv_coord_t stride)
+{
+    vgbuf->format = VG_LITE_PX_FMT;
+    vgbuf->tiled = VG_LITE_LINEAR;
+    vgbuf->image_mode = VG_LITE_NORMAL_IMAGE_MODE;
+    vgbuf->transparency_mode = VG_LITE_IMAGE_OPAQUE;
+
+    vgbuf->width = (int32_t)lv_area_get_width(area);
+    vgbuf->height = (int32_t)lv_area_get_height(area);
+    vgbuf->stride = (int32_t)(stride) * sizeof(lv_color_t);
+
+    lv_memset_00(&vgbuf->yuv, sizeof(vgbuf->yuv));
+
+    vgbuf->memory = (void *)buf;
+    vgbuf->address = (uint32_t)vgbuf->memory;
+    vgbuf->handle = NULL;
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+static inline void lv_vglite_set_dest_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride)
+{
+    lv_vglite_set_buf(&dest_vgbuf, buf, area, stride);
+}
+
+static inline void lv_vglite_set_buf_ptr(vg_lite_buffer_t * vgbuf, const lv_color_t * buf)
+{
+    vgbuf->memory = (void *)buf;
+    vgbuf->address = (uint32_t)vgbuf->memory;
+}
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_vglite_buf.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_vglite_buf.h
new file mode 100644 (file)
index 0000000..e89af1c
--- /dev/null
@@ -0,0 +1,124 @@
+/**
+ * @file lv_vglite_buf.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+#ifndef LV_VGLITE_BUF_H
+#define LV_VGLITE_BUF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "vg_lite.h"
+#include "../../sw/lv_draw_sw.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+/**
+ * Init vglite destination buffer. It will be done once per frame.
+ *
+ * @param[in] buf Destination buffer address (does not require alignment for VG_LITE_LINEAR mode)
+ * @param[in] area Destination buffer area (for width and height)
+ * @param[in] stride Stride of destination buffer
+ */
+void lv_gpu_nxp_vglite_init_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride);
+
+/**
+ * Get vglite destination buffer pointer.
+ *
+ * @retval The vglite destination buffer
+ */
+vg_lite_buffer_t * lv_vglite_get_dest_buf(void);
+
+/**
+ * Get vglite source buffer pointer.
+ *
+ * @retval The vglite source buffer
+ */
+vg_lite_buffer_t * lv_vglite_get_src_buf(void);
+
+/**
+ * Set vglite destination buffer address only.
+ *
+ * @param[in] buf Destination buffer address (does not require alignment for VG_LITE_LINEAR mode)
+ */
+void lv_vglite_set_dest_buf_ptr(const lv_color_t * buf);
+
+/**
+ * Set vglite source buffer address only.
+ *
+ * @param[in] buf Source buffer address
+ */
+void lv_vglite_set_src_buf_ptr(const lv_color_t * buf);
+
+/**
+ * Set vglite source buffer. It will be done only if buffer addreess is different.
+ *
+ * @param[in] buf Source buffer address
+ * @param[in] area Source buffer area (for width and height)
+ * @param[in] stride Stride of source buffer
+ */
+void lv_vglite_set_src_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride);
+
+/**
+ * Set vglite buffer.
+ *
+ * @param[in] vgbuf Address of the VGLite buffer object
+ * @param[in] buf Address of the memory for the VGLite buffer
+ * @param[in] area buffer area (for width and height)
+ * @param[in] stride buffer stride
+ */
+void lv_vglite_set_buf(vg_lite_buffer_t * vgbuf, const lv_color_t * buf,
+                       const lv_area_t * area, lv_coord_t stride);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_VGLITE_BUF_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_vglite_utils.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_vglite_utils.c
new file mode 100644 (file)
index 0000000..adc9f77
--- /dev/null
@@ -0,0 +1,149 @@
+/**
+ * @file lv_vglite_utils.c
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2022, 2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "lv_vglite_utils.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "../../../core/lv_refr.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+/**
+ * Clean and invalidate cache.
+ */
+static inline void invalidate_cache(void);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+lv_res_t lv_vglite_run(void)
+{
+    invalidate_cache();
+
+    VG_LITE_ERR_RETURN_INV(vg_lite_flush(), "Flush failed.");
+
+    return LV_RES_OK;
+}
+
+lv_res_t lv_vglite_premult_and_swizzle(vg_lite_color_t * vg_col32, lv_color32_t lv_col32, lv_opa_t opa,
+                                       vg_lite_buffer_format_t vg_col_format)
+{
+
+    lv_color32_t lv_col32_premul = lv_col32;
+    if(opa <= (lv_opa_t)LV_OPA_MAX) {
+        /* Only pre-multiply color if hardware pre-multiplication is not present */
+        if(!vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) {
+            lv_col32_premul.ch.red = (uint8_t)(((uint16_t)lv_col32.ch.red * opa) >> 8);
+            lv_col32_premul.ch.green = (uint8_t)(((uint16_t)lv_col32.ch.green * opa) >> 8);
+            lv_col32_premul.ch.blue = (uint8_t)(((uint16_t)lv_col32.ch.blue * opa) >> 8);
+        }
+        lv_col32_premul.ch.alpha = opa;
+    }
+
+    switch(vg_col_format) {
+        case VG_LITE_BGRA8888:
+            *vg_col32 = lv_col32_premul.full;
+            break;
+        case VG_LITE_RGBA8888:
+            *vg_col32 = ((uint32_t)lv_col32_premul.ch.red << 24) | ((uint32_t)lv_col32_premul.ch.green << 16) |
+                        ((uint32_t)lv_col32_premul.ch.blue << 8) | (uint32_t)lv_col32_premul.ch.alpha;
+            break;
+        case VG_LITE_ABGR8888:
+            *vg_col32 = ((uint32_t)lv_col32_premul.ch.alpha << 24) | ((uint32_t)lv_col32_premul.ch.blue << 16) |
+                        ((uint32_t)lv_col32_premul.ch.green << 8) | (uint32_t)lv_col32_premul.ch.red;
+            break;
+        case VG_LITE_ARGB8888:
+            *vg_col32 = ((uint32_t)lv_col32_premul.ch.alpha << 24) | ((uint32_t)lv_col32_premul.ch.red << 16) |
+                        ((uint32_t)lv_col32_premul.ch.green << 8) | (uint32_t)lv_col32_premul.ch.blue;
+            break;
+        default:
+            return LV_RES_INV;
+    }
+
+    return LV_RES_OK;
+}
+
+vg_lite_blend_t lv_vglite_get_blend_mode(lv_blend_mode_t lv_blend_mode)
+{
+    vg_lite_blend_t vg_blend_mode;
+    switch(lv_blend_mode) {
+        case LV_BLEND_MODE_ADDITIVE:
+            vg_blend_mode = VG_LITE_BLEND_ADDITIVE;
+            break;
+        case LV_BLEND_MODE_SUBTRACTIVE:
+            vg_blend_mode = VG_LITE_BLEND_SUBTRACT;
+            break;
+        case LV_BLEND_MODE_MULTIPLY:
+            vg_blend_mode = VG_LITE_BLEND_MULTIPLY;
+            break;
+        case LV_BLEND_MODE_REPLACE:
+            vg_blend_mode = VG_LITE_BLEND_NONE;
+            break;
+        default:
+            vg_blend_mode = VG_LITE_BLEND_SRC_OVER;
+            break;
+    }
+    return vg_blend_mode;
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+static inline void invalidate_cache(void)
+{
+    lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+    if(disp->driver->clean_dcache_cb)
+        disp->driver->clean_dcache_cb(disp->driver);
+}
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_vglite_utils.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/nxp/vglite/lv_vglite_utils.h
new file mode 100644 (file)
index 0000000..219396b
--- /dev/null
@@ -0,0 +1,200 @@
+/**
+ * @file lv_vglite_utils.h
+ *
+ */
+
+/**
+ * MIT License
+ *
+ * Copyright 2022, 2023 NXP
+ *
+ * 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 (including the next paragraph)
+ * 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.
+ *
+ */
+
+#ifndef LV_VGLITE_UTILS_H
+#define LV_VGLITE_UTILS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_GPU_NXP_VG_LITE
+#include "vg_lite.h"
+#include "../../sw/lv_draw_sw.h"
+#include "../../../misc/lv_log.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+#ifndef LV_GPU_NXP_VG_LITE_LOG_ERRORS
+/** Enable logging of VG-Lite errors (\see LV_LOG_ERROR)*/
+#define LV_GPU_NXP_VG_LITE_LOG_ERRORS 1
+#endif
+
+#ifndef LV_GPU_NXP_VG_LITE_LOG_TRACES
+/** Enable logging of VG-Lite traces (\see LV_LOG_ERROR)*/
+#define LV_GPU_NXP_VG_LITE_LOG_TRACES 0
+#endif
+
+
+/* The optimal Bezier control point offset for radial unit
+ * see: https://spencermortensen.com/articles/bezier-circle/
+ **/
+#define BEZIER_OPTIM_CIRCLE 0.551915024494f
+
+/* Draw lines for control points of Bezier curves */
+#define BEZIER_DBG_CONTROL_POINTS   0
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+/**
+ * Enable scissor and set the clipping box.
+ *
+ * @param[in] clip_area Clip area with relative coordinates of destination buffer
+ */
+static inline void lv_vglite_set_scissor(const lv_area_t * clip_area);
+
+/**
+ * Disable scissor.
+ */
+static inline void lv_vglite_disable_scissor(void);
+
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Premultiplies and swizzles given LVGL 32bit color to obtain vglite color.
+ *
+ * @param[in/out] vg_col32 The obtained vglite color
+ * @param[in] lv_col32 The initial LVGL 32bit color
+ * @param[in] opa The opacity to premultiply with
+ * @param[in] vg_col_format The format of the resulting vglite color
+ *
+ * @retval LV_RES_OK Operation completed
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+lv_res_t lv_vglite_premult_and_swizzle(vg_lite_color_t * vg_col32, lv_color32_t lv_col32, lv_opa_t opa,
+                                       vg_lite_buffer_format_t vg_col_format);
+
+/**
+ * Get vglite blend mode.
+ *
+ * @param[in] lv_blend_mode The LVGL blend mode
+ *
+ * @retval The vglite blend mode
+ */
+vg_lite_blend_t lv_vglite_get_blend_mode(lv_blend_mode_t lv_blend_mode);
+
+/**
+ * Clear cache and flush command to VG-Lite.
+ *
+ * @retval LV_RES_OK Run completed
+ * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS)
+ */
+lv_res_t lv_vglite_run(void);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#define VG_LITE_COND_STOP(cond, txt)          \
+    do {                                      \
+        if (cond) {                           \
+            LV_LOG_ERROR("%s. STOP!", txt);   \
+            for ( ; ; );                      \
+        }                                     \
+    } while(0)
+
+#if LV_GPU_NXP_VG_LITE_LOG_ERRORS
+#define VG_LITE_ERR_RETURN_INV(err, fmt, ...) \
+    do {                                      \
+        if(err != VG_LITE_SUCCESS) {          \
+            LV_LOG_ERROR(fmt" (err = %d)",    \
+                         err, ##__VA_ARGS__); \
+            return LV_RES_INV;                \
+        }                                     \
+    } while (0)
+#else
+#define VG_LITE_ERR_RETURN_INV(err, fmt, ...) \
+    do {                                      \
+        if(err != VG_LITE_SUCCESS) {          \
+            return LV_RES_INV;                \
+        }                                     \
+    }while(0)
+#endif /*LV_GPU_NXP_VG_LITE_LOG_ERRORS*/
+
+#if LV_GPU_NXP_VG_LITE_LOG_TRACES
+#define VG_LITE_LOG_TRACE(fmt, ...)           \
+    do {                                      \
+        LV_LOG(fmt, ##__VA_ARGS__);     \
+    } while (0)
+
+#define VG_LITE_RETURN_INV(fmt, ...)          \
+    do {                                      \
+        LV_LOG_ERROR(fmt, ##__VA_ARGS__);     \
+        return LV_RES_INV;                    \
+    } while (0)
+#else
+#define VG_LITE_LOG_TRACE(fmt, ...)           \
+    do {                                      \
+    } while (0)
+#define VG_LITE_RETURN_INV(fmt, ...)          \
+    do {                                      \
+        return LV_RES_INV;                    \
+    }while(0)
+#endif /*LV_GPU_NXP_VG_LITE_LOG_TRACES*/
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+static inline void lv_vglite_set_scissor(const lv_area_t * clip_area)
+{
+    vg_lite_enable_scissor();
+    vg_lite_set_scissor((int32_t)clip_area->x1, (int32_t)clip_area->y1,
+                        (int32_t)lv_area_get_width(clip_area),
+                        (int32_t)lv_area_get_height(clip_area));
+}
+
+static inline void lv_vglite_disable_scissor(void)
+{
+    vg_lite_disable_scissor();
+}
+
+#endif /*LV_USE_GPU_NXP_VG_LITE*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_VGLITE_UTILS_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/renesas/lv_draw_renesas.mk b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/renesas/lv_draw_renesas.mk
new file mode 100644 (file)
index 0000000..b5e3ad1
--- /dev/null
@@ -0,0 +1,7 @@
+CSRCS += lv_gpu_d2_ra6m3.c
+CSRCS += lv_gpu_d2_draw_label.c
+
+DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/renesas
+VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/renesas
+
+CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/renesas"
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/renesas/lv_gpu_d2_draw_label.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/renesas/lv_gpu_d2_draw_label.c
new file mode 100644 (file)
index 0000000..b12866d
--- /dev/null
@@ -0,0 +1,292 @@
+/**
+ * @file lv_gpu_d2_draw_label.c
+ *
+ * @description HAL layer for display driver
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../../draw/lv_draw_label.h"
+#include "../../misc/lv_assert.h"
+#include "../../core/lv_refr.h"
+#include "lv_gpu_d2_ra6m3.h"
+
+#if LV_USE_GPU_RA6M3_G2D
+#include LV_GPU_RA6M3_G2D_INCLUDE
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *  GLOBAL VARIABLES
+ **********************/
+extern const uint8_t _lv_bpp1_opa_table[2];
+extern const uint8_t _lv_bpp2_opa_table[4];
+extern const uint8_t _lv_bpp4_opa_table[16];
+extern const uint8_t _lv_bpp8_opa_table[256];
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+LV_ATTRIBUTE_FAST_MEM static void draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc,
+                                                     const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p)
+{
+
+    const uint8_t * bpp_opa_table_p;
+    uint32_t bitmask_init;
+    uint32_t bitmask;
+    uint32_t bpp = g->bpp;
+    lv_opa_t opa = dsc->opa;
+    uint32_t shades;
+    if(bpp == 3) bpp = 4;
+
+#if LV_USE_IMGFONT
+    if(bpp == LV_IMGFONT_BPP) { //is imgfont
+        lv_area_t fill_area;
+        fill_area.x1 = pos->x;
+        fill_area.y1 = pos->y;
+        fill_area.x2 = pos->x + g->box_w - 1;
+        fill_area.y2 = pos->y + g->box_h - 1;
+        lv_draw_img_dsc_t img_dsc;
+        lv_draw_img_dsc_init(&img_dsc);
+        img_dsc.angle = 0;
+        img_dsc.zoom = LV_IMG_ZOOM_NONE;
+        img_dsc.opa = dsc->opa;
+        img_dsc.blend_mode = dsc->blend_mode;
+        lv_draw_img(draw_ctx, &img_dsc, &fill_area, map_p);
+        return;
+    }
+#endif
+
+    switch(bpp) {
+        case 1:
+            bpp_opa_table_p = _lv_bpp1_opa_table;
+            bitmask_init  = 0x80;
+            shades = 2;
+            break;
+        case 2:
+            bpp_opa_table_p = _lv_bpp2_opa_table;
+            bitmask_init  = 0xC0;
+            shades = 4;
+            break;
+        case 4:
+            bpp_opa_table_p = _lv_bpp4_opa_table;
+            bitmask_init  = 0xF0;
+            shades = 16;
+            break;
+        case 8:
+            bpp_opa_table_p = _lv_bpp8_opa_table;
+            bitmask_init  = 0xFF;
+            shades = 256;
+            break;       /*No opa table, pixel value will be used directly*/
+        default:
+            LV_LOG_WARN("lv_draw_letter: invalid bpp");
+            return; /*Invalid bpp. Can't render the letter*/
+    }
+
+    static lv_opa_t opa_table[256];
+    static lv_opa_t prev_opa = LV_OPA_TRANSP;
+    static uint32_t prev_bpp = 0;
+    if(opa < LV_OPA_MAX) {
+        if(prev_opa != opa || prev_bpp != bpp) {
+            uint32_t i;
+            for(i = 0; i < shades; i++) {
+                opa_table[i] = bpp_opa_table_p[i] == LV_OPA_COVER ? opa : ((bpp_opa_table_p[i] * opa) >> 8);
+            }
+        }
+        bpp_opa_table_p = opa_table;
+        prev_opa = opa;
+        prev_bpp = bpp;
+    }
+
+    int32_t col, row;
+    int32_t box_w = g->box_w;
+    int32_t box_h = g->box_h;
+    int32_t width_bit = box_w * bpp; /*Letter width in bits*/
+
+    /*Calculate the col/row start/end on the map*/
+    int32_t col_start = pos->x >= draw_ctx->clip_area->x1 ? 0 : draw_ctx->clip_area->x1 - pos->x;
+    int32_t col_end   = pos->x + box_w <= draw_ctx->clip_area->x2 ? box_w : draw_ctx->clip_area->x2 - pos->x + 1;
+    int32_t row_start = pos->y >= draw_ctx->clip_area->y1 ? 0 : draw_ctx->clip_area->y1 - pos->y;
+    int32_t row_end   = pos->y + box_h <= draw_ctx->clip_area->y2 ? box_h : draw_ctx->clip_area->y2 - pos->y + 1;
+
+    /*Move on the map too*/
+    uint32_t bit_ofs = (row_start * width_bit) + (col_start * bpp);
+    map_p += bit_ofs >> 3;
+
+    uint8_t letter_px;
+    uint32_t col_bit;
+    col_bit = bit_ofs & 0x7; /*"& 0x7" equals to "% 8" just faster*/
+
+    lv_draw_sw_blend_dsc_t blend_dsc;
+    lv_memset_00(&blend_dsc, sizeof(blend_dsc));
+    blend_dsc.color = dsc->color;
+    blend_dsc.opa = LV_OPA_COVER;
+    blend_dsc.blend_mode = dsc->blend_mode;
+
+    lv_coord_t hor_res = lv_disp_get_hor_res(_lv_refr_get_disp_refreshing());
+    uint32_t mask_buf_size = box_w * box_h > hor_res ? hor_res : box_w * box_h;
+    lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size);
+    blend_dsc.mask_buf = mask_buf;
+    int32_t mask_p = 0;
+
+    lv_area_t fill_area;
+    fill_area.x1 = col_start + pos->x;
+    fill_area.x2 = col_end  + pos->x - 1;
+    fill_area.y1 = row_start + pos->y;
+    fill_area.y2 = fill_area.y1;
+#if LV_DRAW_COMPLEX
+    lv_coord_t fill_w = lv_area_get_width(&fill_area);
+    lv_area_t mask_area;
+    lv_area_copy(&mask_area, &fill_area);
+    mask_area.y2 = mask_area.y1 + row_end;
+    bool mask_any = lv_draw_mask_is_any(&mask_area);
+#endif
+    blend_dsc.blend_area = &fill_area;
+    blend_dsc.mask_area = &fill_area;
+
+    uint32_t col_bit_max = 8 - bpp;
+    uint32_t col_bit_row_ofs = (box_w + col_start - col_end) * bpp;
+
+    for(row = row_start ; row < row_end; row++) {
+#if LV_DRAW_COMPLEX
+        int32_t mask_p_start = mask_p;
+#endif
+        bitmask = bitmask_init >> col_bit;
+        for(col = col_start; col < col_end; col++) {
+            /*Load the pixel's opacity into the mask*/
+            letter_px = (*map_p & bitmask) >> (col_bit_max - col_bit);
+            if(letter_px) {
+                mask_buf[mask_p] = bpp_opa_table_p[letter_px];
+            }
+            else {
+                mask_buf[mask_p] = 0;
+            }
+
+            /*Go to the next column*/
+            if(col_bit < col_bit_max) {
+                col_bit += bpp;
+                bitmask = bitmask >> bpp;
+            }
+            else {
+                col_bit = 0;
+                bitmask = bitmask_init;
+                map_p++;
+            }
+
+            /*Next mask byte*/
+            mask_p++;
+        }
+
+#if LV_DRAW_COMPLEX
+        /*Apply masks if any*/
+        if(mask_any) {
+            blend_dsc.mask_res = lv_draw_mask_apply(mask_buf + mask_p_start, fill_area.x1, fill_area.y2,
+                                                    fill_w);
+            if(blend_dsc.mask_res == LV_DRAW_MASK_RES_TRANSP) {
+                lv_memset_00(mask_buf + mask_p_start, fill_w);
+            }
+        }
+#endif
+
+        if((uint32_t) mask_p + (col_end - col_start) < mask_buf_size) {
+            fill_area.y2 ++;
+        }
+        else {
+            blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
+            lv_draw_ra6m3_2d_blend(draw_ctx, &blend_dsc);
+
+            fill_area.y1 = fill_area.y2 + 1;
+            fill_area.y2 = fill_area.y1;
+            mask_p = 0;
+        }
+
+        col_bit += col_bit_row_ofs;
+        map_p += (col_bit >> 3);
+        col_bit = col_bit & 0x7;
+    }
+
+    /*Flush the last part*/
+    if(fill_area.y1 != fill_area.y2) {
+        fill_area.y2--;
+        blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED;
+        lv_draw_ra6m3_2d_blend(draw_ctx, &blend_dsc);
+        mask_p = 0;
+    }
+
+    lv_mem_buf_release(mask_buf);
+}
+
+void lv_draw_gpu_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc,  const lv_point_t * pos_p,
+                        uint32_t letter)
+{
+    const lv_font_t * font_p = dsc->font;
+
+    lv_opa_t opa = dsc->opa;
+    if(opa < LV_OPA_MIN) return;
+    if(opa > LV_OPA_MAX) opa = LV_OPA_COVER;
+
+    if(font_p == NULL) {
+        LV_LOG_WARN("lv_draw_letter: font is NULL");
+        return;
+    }
+
+    lv_font_glyph_dsc_t g;
+    bool g_ret = lv_font_get_glyph_dsc(font_p, &g, letter, '\0');
+    if(g_ret == false) {
+        /*Add warning if the dsc is not found
+         *but do not print warning for non printable ASCII chars (e.g. '\n')*/
+        if(letter >= 0x20 &&
+           letter != 0xf8ff && /*LV_SYMBOL_DUMMY*/
+           letter != 0x200c) { /*ZERO WIDTH NON-JOINER*/
+            LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%X", letter);
+        }
+        return;
+    }
+
+    /*Don't draw anything if the character is empty. E.g. space*/
+    if((g.box_h == 0) || (g.box_w == 0)) return;
+
+    lv_point_t gpos;
+    gpos.x = pos_p->x + g.ofs_x;
+    gpos.y = pos_p->y + (dsc->font->line_height - dsc->font->base_line) - g.box_h - g.ofs_y;
+
+    /*If the letter is completely out of mask don't draw it*/
+    if(gpos.x + g.box_w < draw_ctx->clip_area->x1 ||
+       gpos.x > draw_ctx->clip_area->x2 ||
+       gpos.y + g.box_h < draw_ctx->clip_area->y1 ||
+       gpos.y > draw_ctx->clip_area->y2) {
+        return;
+    }
+
+    const uint8_t * map_p = lv_font_get_glyph_bitmap(font_p, letter);
+    if(map_p == NULL) {
+        LV_LOG_WARN("lv_draw_letter: character's bitmap not found");
+        return;
+    }
+
+    if(font_p->subpx) {
+#if LV_DRAW_COMPLEX && LV_USE_FONT_SUBPX
+        draw_letter_subpx(pos_x, pos_y, &g, clip_area, map_p, color, opa, blend_mode);
+#else
+        LV_LOG_WARN("Can't draw sub-pixel rendered letter because LV_USE_FONT_SUBPX == 0 in lv_conf.h");
+#endif
+    }
+    else {
+        draw_letter_normal(draw_ctx, dsc, &gpos, &g, map_p);
+    }
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.c
new file mode 100644 (file)
index 0000000..ba4c084
--- /dev/null
@@ -0,0 +1,742 @@
+/**
+ * @file lv_gpu_d2_ra6m3.c
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "lv_gpu_d2_ra6m3.h"
+#include "../../core/lv_refr.h"
+#include <math.h>
+
+#if LV_USE_GPU_RA6M3_G2D
+
+#include LV_GPU_RA6M3_G2D_INCLUDE
+
+/*********************
+ *      DEFINES
+ *********************/
+#define LOG_ERRORS
+#ifdef LOG_ERRORS
+    #define STRINGIFY(x)                #x
+    #define TOSTRING(x)                 STRINGIFY(x)
+
+    #define ERROR_LIST_SIZE             (4)
+    #define D2_EXEC(a)                  lv_port_gpu_log_error(a, __func__,  __LINE__)
+#else
+    /* here is error logging not enabled */
+    #define D2_EXEC(a)                  a;
+#endif
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+typedef struct {
+    d2_s32 error;
+    const char * func;
+    int line;
+} log_error_entry;
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+#ifdef LOG_ERRORS
+    static void lv_port_gpu_log_error(d2_s32 status, const char * func, int line);
+#endif
+static void invalidate_cache(void);
+
+void lv_draw_gpu_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc,  const lv_point_t * pos_p,
+                        uint32_t letter);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+#ifdef LOG_ERRORS
+    static log_error_entry log_error_list[ERROR_LIST_SIZE];
+    static int error_list_index;
+    static int error_count;
+#endif
+
+static d2_device * _d2_handle;
+static d2_renderbuffer * renderbuffer;
+
+static d2_s32 src_cf_val, dst_cf_val;
+static lv_draw_img_dsc_t img_dsc;
+static bool color_key_enabled, alpha_enabled, blend_enabled, colorize_enabled;
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+static d2_s32 lv_port_gpu_cf_lv_to_d2(lv_img_cf_t cf)
+{
+    d2_s32 d2_cf;
+
+#if (DLG_LVGL_CF == 1)
+    switch(cf & ~(1 << 5)) {
+#else
+    switch(cf) {
+#endif /* (DLG_LVGL_CF == 1) */
+        case LV_IMG_CF_TRUE_COLOR:
+            d2_cf = d2_mode_rgb565;
+            break;
+        case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED:
+            d2_cf = d2_mode_rgb565;
+            break;
+        case LV_IMG_CF_ALPHA_1BIT:
+            d2_cf = d2_mode_alpha1;
+            break;
+        case LV_IMG_CF_ALPHA_2BIT:
+            d2_cf = d2_mode_alpha2;
+            break;
+        case LV_IMG_CF_ALPHA_4BIT:
+            d2_cf = d2_mode_alpha4;
+            break;
+        case LV_IMG_CF_ALPHA_8BIT:
+            d2_cf = d2_mode_alpha8;
+            break;
+        case LV_IMG_CF_INDEXED_1BIT:
+            d2_cf = d2_mode_i1 | d2_mode_clut;
+            break;
+        case LV_IMG_CF_INDEXED_2BIT:
+            d2_cf = d2_mode_i2 | d2_mode_clut;
+            break;
+        case LV_IMG_CF_INDEXED_4BIT:
+            d2_cf = d2_mode_i4 | d2_mode_clut;
+            break;
+        case LV_IMG_CF_INDEXED_8BIT:
+            d2_cf = d2_mode_i8 | d2_mode_clut;
+            break;
+#if (DLG_LVGL_CF == 1)
+        case LV_IMG_CF_RGB565:
+            d2_cf = d2_mode_rgb565;
+            break;
+        case LV_IMG_CF_RGB888:
+            d2_cf = d2_mode_rgb888;
+            break;
+        case LV_IMG_CF_RGBA8888:
+            d2_cf = d2_mode_rgba8888;
+            break;
+#endif /* DLG_LVGL_CF */
+        default:
+            return -1;
+    }
+
+#if (DLG_LVGL_CF == 1)
+    return d2_cf | (cf & (1 << 5) ? d2_mode_rle : 0);
+#else
+    return d2_cf;
+#endif /* (DLG_LVGL_CF == 1) */
+}
+
+static bool lv_port_gpu_cf_fb_valid(d2_s32 cf)
+{
+    if((cf & (d2_mode_rle | d2_mode_clut)) || cf < 0) {
+        return false;
+    }
+
+    switch(cf) {
+        case d2_mode_alpha8:
+        case d2_mode_rgb565:
+        case d2_mode_argb8888:
+        case d2_mode_argb4444:
+        case d2_mode_rgba8888:
+        case d2_mode_rgba4444:
+            return true;
+        default:
+            return false;
+    }
+}
+
+static bool lv_port_gpu_cf_has_alpha(d2_s32 cf)
+{
+    switch(cf & ~(d2_mode_clut | d2_mode_rle)) {
+        case d2_mode_argb8888:
+        case d2_mode_rgba8888:
+        case d2_mode_argb4444:
+        case d2_mode_rgba4444:
+        case d2_mode_argb1555:
+        case d2_mode_rgba5551:
+        case d2_mode_ai44:
+        case d2_mode_i8:
+        case d2_mode_i4:
+        case d2_mode_i2:
+        case d2_mode_i1:
+        case d2_mode_alpha8:
+        case d2_mode_alpha4:
+        case d2_mode_alpha2:
+        case d2_mode_alpha1:
+            return true;
+        default:
+            return false;
+    }
+}
+
+static bool lv_port_gpu_cf_is_alpha(d2_s32 cf)
+{
+    switch(cf & ~d2_mode_rle) {
+        case d2_mode_alpha8:
+        case d2_mode_alpha4:
+        case d2_mode_alpha2:
+        case d2_mode_alpha1:
+            return true;
+        default:
+            return false;
+    }
+}
+
+static d2_color lv_port_gpu_color_lv_to_d2(lv_color_t color)
+{
+    uint8_t alpha, red, green, blue;
+
+    alpha = 0xFF;
+    red = color.ch.red << 3 | color.ch.red >> 2;
+    green = color.ch.green << 2 | color.ch.green >> 4;
+    blue = color.ch.blue << 3 | color.ch.blue >> 2;
+
+    return (alpha) << 24UL
+           | (red) << 16UL
+           | (green) << 8UL
+           | (blue) << 0UL;
+}
+
+static void lv_port_gpu_get_recolor_consts(d2_color * cl, d2_color * ch)
+{
+    d2_color c = lv_port_gpu_color_lv_to_d2(img_dsc.recolor);
+    d2_alpha r, g, b, opa = img_dsc.recolor_opa > LV_OPA_MAX ? LV_OPA_COVER : img_dsc.recolor_opa;
+
+    r = ((uint32_t)((uint8_t)(c >> 16UL)) * opa) / 255;
+    g = ((uint32_t)((uint8_t)(c >> 8UL)) * opa) / 255;
+    b = ((uint32_t)((uint8_t)(c >> 0UL)) * opa) / 255;
+    *cl = r << 16UL | g << 8UL | b << 0UL;
+
+    r += 255 - opa;
+    g += 255 - opa;
+    b += 255 - opa;
+    *ch = r << 16UL | g << 8UL | b << 0UL;
+}
+
+static int lv_port_gpu_handle_indexed_color(const lv_color_t ** src, const d2_color ** clut, d2_s32 cf)
+{
+    int clut_len = 0;
+
+    if(cf & d2_mode_clut) {
+        /* Calculate CLUT length in entries */
+        switch(cf & ~(d2_mode_clut | d2_mode_rle)) {
+            case d2_mode_i1:
+                clut_len = 2;
+                break;
+            case d2_mode_i2:
+                clut_len = 4;
+                break;
+            case d2_mode_i4:
+                clut_len = 16;
+                break;
+            case d2_mode_i8:
+                clut_len = 256;
+                break;
+            case d2_mode_ai44:
+                clut_len = 16;
+                break;
+            default:
+                return 0;
+        }
+
+        *clut = (const d2_color *)*src;
+        *src = (const lv_color_t *)((const uint32_t *)*src + clut_len);
+    }
+    return clut_len;
+}
+
+static int lv_port_gpu_cf_bpp(d2_s32 cf)
+{
+    switch(cf & ~(d2_mode_clut | d2_mode_rle)) {
+        case d2_mode_argb8888:
+            return 32;
+        case d2_mode_rgba8888:
+            return 32;
+        case d2_mode_rgb888:
+            return 32;
+        case d2_mode_argb4444:
+            return 16;
+        case d2_mode_rgba4444:
+            return 16;
+        case d2_mode_argb1555:
+            return 16;
+        case d2_mode_rgba5551:
+            return 16;
+        case d2_mode_rgb565:
+            return 16;
+        case d2_mode_ai44:
+            return 8;
+        case d2_mode_i8:
+            return 8;
+        case d2_mode_i4:
+            return 4;
+        case d2_mode_i2:
+            return 2;
+        case d2_mode_i1:
+            return 1;
+        case d2_mode_alpha8:
+            return 8;
+        case d2_mode_alpha4:
+            return 4;
+        case d2_mode_alpha2:
+            return 2;
+        case d2_mode_alpha1:
+            return 1;
+        default:
+            return 0;
+    }
+}
+
+static d2_s32 lv_port_gpu_cf_get_default(void)
+{
+    return d2_mode_rgb565;
+}
+
+static void lv_port_gpu_config_blit_clear(void)
+{
+    alpha_enabled = false;
+    color_key_enabled = false;
+    blend_enabled = true;
+    colorize_enabled = false;
+
+    lv_draw_img_dsc_init(&img_dsc);
+
+    src_cf_val = lv_port_gpu_cf_get_default();
+    dst_cf_val = lv_port_gpu_cf_get_default();
+}
+
+void lv_port_gpu_init(void)
+{
+    lv_port_gpu_config_blit_clear();
+}
+
+static void lv_port_gpu_rotate_point(int * x, int * y, float cos_angle, float sin_angle, int pivot_x, int pivot_y)
+{
+    float fx, fy;
+
+    *x -= pivot_x;
+    *y -= pivot_y;
+
+    fx = ((float) * x) / 16.0f;
+    fy = ((float) * y) / 16.0f;
+
+    *x = (int)(((fx * cos_angle) - (fy * sin_angle)) * 16.0f);
+    *y = (int)(((fx * sin_angle) + (fy * cos_angle)) * 16.0f);
+
+    *x += pivot_x;
+    *y += pivot_y;
+}
+
+void lv_draw_ra6m3_g2d_init(void)
+{
+    if(_d2_handle != NULL) {
+        return;
+    }
+
+    _d2_handle = d2_opendevice(0);
+
+    if(_d2_handle == NULL)
+        return;
+
+    /* set blocksize for default displaylist */
+    if(d2_setdlistblocksize(_d2_handle, 25) != D2_OK) {
+        LV_LOG_ERROR("Could NOT d2_setdlistblocksize\n");
+        d2_closedevice(_d2_handle);
+
+        return;
+    }
+
+    /* bind the hardware */
+    if(d2_inithw(_d2_handle, 0) != D2_OK) {
+        LV_LOG_ERROR("Could NOT d2_inithw\n");
+        d2_closedevice(_d2_handle);
+
+        return;
+    }
+
+    renderbuffer = d2_newrenderbuffer(_d2_handle, 20, 20);
+    if(!renderbuffer) {
+        LV_LOG_ERROR("NO renderbuffer\n");
+        d2_closedevice(_d2_handle);
+
+        return;
+    }
+}
+
+static void lv_port_gpu_hw_deinit(void)
+{
+    if(_d2_handle == NULL)
+        return;
+
+    D2_EXEC(d2_freerenderbuffer(_d2_handle, renderbuffer));
+    D2_EXEC(d2_closedevice(_d2_handle));
+
+    renderbuffer = NULL;
+    _d2_handle = NULL;
+}
+
+void lv_port_gpu_flush(void)
+{
+    lv_port_gpu_hw_deinit();
+}
+
+static void lv_port_gpu_start_render(void)
+{
+    D2_EXEC(d2_selectrenderbuffer(_d2_handle, renderbuffer));
+}
+
+static void lv_port_gpu_complete_render(void)
+{
+    D2_EXEC(d2_flushframe(_d2_handle));
+}
+
+void lv_port_gpu_wait(lv_draw_ctx_t * draw_ctx)
+{
+    lv_port_gpu_complete_render();
+
+    lv_draw_sw_wait_for_finish(draw_ctx);
+}
+
+static void lv_port_gpu_execute_render(void)
+{
+    if(_d2_handle) {
+        D2_EXEC(d2_executerenderbuffer(_d2_handle, renderbuffer, 0));
+    }
+}
+
+void lv_port_gpu_blit(int32_t x, int32_t y, lv_color_t * dst, const lv_area_t * fill_area)
+{
+    uint32_t ModeSrc;
+
+    ModeSrc = d2_mode_rgb565;
+
+    lv_coord_t dst_width, dst_hight;
+    dst_width = lv_area_get_width(fill_area);
+    dst_hight = lv_area_get_height(fill_area);
+
+    d2_selectrenderbuffer(_d2_handle, renderbuffer);
+
+    // Generate render operations
+    d2_framebuffer(_d2_handle, (uint16_t *)&fb_background[0], LV_HOR_RES_MAX, LV_HOR_RES_MAX,
+                   MAX(fill_area->y2 + 1, 2), lv_port_gpu_cf_get_default());
+
+    d2_cliprect(_d2_handle, 0, 0, LV_HOR_RES_MAX - 1, fill_area->y2);
+    d2_setblitsrc(_d2_handle, (void *) dst, dst_width, dst_width, dst_hight, ModeSrc);
+    d2_blitcopy(_d2_handle, dst_width, dst_hight, 0, 0, D2_FIX4(dst_width), D2_FIX4(dst_hight),
+                D2_FIX4(fill_area->x1), D2_FIX4(fill_area->y1), 0);
+
+    // Execute render operations
+    d2_executerenderbuffer(_d2_handle, renderbuffer, 0);
+}
+
+void lv_port_gpu_fill(lv_color_t * dest_buf, const lv_area_t * fill_area, lv_coord_t dst_width,
+                      lv_color_t color, lv_opa_t opa)
+{
+    invalidate_cache();
+
+    lv_port_gpu_start_render();
+
+    D2_EXEC(d2_framebuffer(_d2_handle, d1_maptovidmem(_d2_handle, dest_buf), MAX(dst_width, 2), MAX(dst_width, 2),
+                           MAX(fill_area->y2 + 1, 2), lv_port_gpu_cf_get_default()));
+
+    D2_EXEC(d2_cliprect(_d2_handle, 0, 0, dst_width - 1, fill_area->y2));
+    D2_EXEC(d2_setalpha(_d2_handle, opa > LV_OPA_MAX ? 0xFF : opa));
+    D2_EXEC(d2_setcolor(_d2_handle, 0, lv_port_gpu_color_lv_to_d2(color)));
+    D2_EXEC(d2_renderbox(_d2_handle, D2_FIX4(fill_area->x1), D2_FIX4(fill_area->y1),
+                         D2_FIX4(lv_area_get_width(fill_area)), D2_FIX4(lv_area_get_height(fill_area))));
+
+    lv_port_gpu_execute_render();
+}
+
+bool lv_port_gpu_config_blit(const lv_draw_img_dsc_t * draw_dsc,  lv_img_cf_t dst_cf,
+                             lv_img_cf_t src_cf, bool alpha_en, bool color_key_en, bool blend_en, bool colorize_en)
+{
+    d2_s32 d2_src_cf, d2_dst_cf;
+
+    if(blend_en && draw_dsc->blend_mode != LV_BLEND_MODE_NORMAL
+       && draw_dsc->blend_mode != LV_BLEND_MODE_ADDITIVE) {
+        return false;
+    }
+
+    d2_src_cf = lv_port_gpu_cf_lv_to_d2(src_cf);
+    d2_dst_cf = lv_port_gpu_cf_lv_to_d2(dst_cf);
+    if(d2_src_cf < 0 || !lv_port_gpu_cf_fb_valid(d2_dst_cf)) {
+        return false;
+    }
+    src_cf_val = d2_src_cf;
+    dst_cf_val = d2_dst_cf;
+
+    img_dsc = *draw_dsc;
+
+    /* Disable alpha if alpha channel does not exist */
+    alpha_enabled = lv_port_gpu_cf_has_alpha(src_cf_val) ? alpha_en : 0;
+    color_key_enabled = color_key_en;
+    blend_enabled = blend_en;
+    colorize_enabled = colorize_en | lv_port_gpu_cf_is_alpha(src_cf_val);
+
+    return true;
+}
+
+static void lv_port_gpu_blit_internal(const lv_area_t * dest_area, const lv_color_t * src_buf,
+                                      const lv_area_t * src_area, d2_u32 flags)
+{
+    const lv_area_t * img_area = src_area;
+    lv_area_t img_area_scaled;
+    lv_coord_t w, h, img_w, img_h;
+    d2_s32 pitch;
+    int bpp = lv_port_gpu_cf_bpp(src_cf_val);
+
+    D2_EXEC(d2_cliprect(_d2_handle, dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2));
+
+    pitch = w = lv_area_get_width(src_area);
+    h = lv_area_get_height(src_area);
+
+    if(img_dsc.zoom != LV_IMG_ZOOM_NONE) {
+        img_area_scaled.x1 = src_area->x1 + ((((int32_t)0 - img_dsc.pivot.x) * img_dsc.zoom) >> 8) + img_dsc.pivot.x;
+        img_area_scaled.x2 = src_area->x1 + ((((int32_t)w - img_dsc.pivot.x) * img_dsc.zoom) >> 8) + img_dsc.pivot.x;
+        img_area_scaled.y1 = src_area->y1 + ((((int32_t)0 - img_dsc.pivot.y) * img_dsc.zoom) >> 8) + img_dsc.pivot.y;
+        img_area_scaled.y2 = src_area->y1 + ((((int32_t)h - img_dsc.pivot.y) * img_dsc.zoom) >> 8) + img_dsc.pivot.y;
+        img_area = &img_area_scaled;
+    }
+
+    img_w = lv_area_get_width(img_area);
+    img_h = lv_area_get_height(img_area);
+
+    if(0 < bpp && bpp < 8) {
+        pitch = (w + (8 - bpp)) & (~(8 - bpp));
+    }
+
+    if(img_dsc.angle == 0) {
+        D2_EXEC(d2_setblitsrc(_d2_handle, (void *) src_buf, pitch, w, h, src_cf_val));
+
+        D2_EXEC(d2_blitcopy(_d2_handle, w, h, 0, 0,
+                            D2_FIX4(img_w), D2_FIX4(img_h), D2_FIX4(img_area->x1), D2_FIX4(img_area->y1), flags));
+    }
+    else {
+        int x, y, x1, y1, x2, y2, x3, y3, x4, y4, dxu, dxv, dyu, dyv, xx, xy, yx, yy;
+        int pivot_scaled_x, pivot_scaled_y;
+        int tex_offset = (flags & d2_bf_filter) ? -32767 : 0;
+        d2_u8 amode, cmode = d2_to_copy;
+        float angle = ((float)img_dsc.angle / 10) * M_PI / 180;
+        float cos_angle = cosf(angle);
+        float sin_angle = sinf(angle);
+        d2_u8 fillmode_backup;
+
+        /* setup texture params */
+        fillmode_backup = d2_getfillmode(_d2_handle);
+        D2_EXEC(d2_setfillmode(_d2_handle, d2_fm_texture));
+        D2_EXEC(d2_settexture(_d2_handle, (void *) src_buf, pitch, w, h, src_cf_val));
+        D2_EXEC(d2_settexturemode(_d2_handle, flags & (d2_bf_filter | d2_bf_wrap)));
+        amode = flags & d2_bf_usealpha ? d2_to_copy : d2_to_one;
+        cmode = flags & d2_bf_colorize2 ? d2_to_blend : d2_to_copy;
+        D2_EXEC(d2_settextureoperation(_d2_handle, amode, cmode, cmode, cmode));
+        if(flags & d2_bf_colorize2) {
+            d2_color cl = d2_getcolor(_d2_handle, 0), ch = d2_getcolor(_d2_handle, 1);
+            D2_EXEC(d2_settexopparam(_d2_handle, d2_cc_red, (uint8_t)(cl >> 16UL),
+                                     (uint8_t)(ch >> 16UL)));
+            D2_EXEC(d2_settexopparam(_d2_handle, d2_cc_green, (uint8_t)(cl >> 8UL),
+                                     (uint8_t)(ch >> 8UL)));
+            D2_EXEC(d2_settexopparam(_d2_handle, d2_cc_blue, (uint8_t)(cl >> 0UL),
+                                     (uint8_t)(ch >> 0UL)));
+        }
+
+        x = D2_FIX4(img_area->x1);
+        y = D2_FIX4(img_area->y1);
+
+        /* define quad points */
+        x1 = D2_FIX4(0);
+        y1 = D2_FIX4(0);
+        x2 = D2_FIX4(img_w);
+        y2 = D2_FIX4(0);
+        x3 = D2_FIX4(img_w);
+        y3 = D2_FIX4(img_h);
+        x4 = D2_FIX4(0);
+        y4 = D2_FIX4(img_h);
+
+        /* rotate points for quad */
+        pivot_scaled_x = (img_dsc.pivot.x * img_dsc.zoom) >> 4;
+        pivot_scaled_y = (img_dsc.pivot.y * img_dsc.zoom) >> 4;
+
+        lv_port_gpu_rotate_point(&x1, &y1, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y);
+        lv_port_gpu_rotate_point(&x2, &y2, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y);
+        lv_port_gpu_rotate_point(&x3, &y3, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y);
+        lv_port_gpu_rotate_point(&x4, &y4, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y);
+
+        /* compute texture increments */
+        xx = (int)(cos_angle * 65536.0f);
+        xy = (int)(sin_angle * 65536.0f);
+        yx = (int)(-sin_angle * 65536.0f);
+        yy = (int)(cos_angle * 65536.0f);
+        dxu = ((D2_FIX16(w) / D2_FIX4(img_w)) * xx) >> 12;
+        dxv = ((D2_FIX16(w) / D2_FIX4(img_w)) * xy) >> 12;
+        dyu = ((D2_FIX16(h) / D2_FIX4(img_h)) * yx) >> 12;
+        dyv = ((D2_FIX16(h) / D2_FIX4(img_h)) * yy) >> 12;
+
+        /* map texture exactly to rotated quad, so texel center is always (0/0) top-left */
+        D2_EXEC(d2_settexelcenter(_d2_handle, 0, 0));
+        D2_EXEC(d2_settexturemapping(_d2_handle, (d2_point)(x + x1), (d2_point)(y + y1),
+                                     tex_offset, tex_offset, dxu, dxv, dyu, dyv));
+
+        int minx = MAX(dest_area->x1, D2_INT4(x + MIN(x1, MIN(x2, MIN(x3, x4)))));
+        int maxx = MIN(dest_area->x2, D2_INT4(x + MAX(x1, MAX(x2, MAX(x3, x4)))));
+        int slice = (flags & d2_bf_filter) ? 6 : 8;
+
+        /* Perform render operation in slices to acheive better performance */
+        for(int posx = minx; posx < maxx; posx += slice) {
+            D2_EXEC(d2_cliprect(_d2_handle, posx, dest_area->y1, MIN(posx + slice - 1, maxx), dest_area->y2));
+            D2_EXEC(d2_renderquad(_d2_handle, (d2_point)(x + x1), (d2_point)(y + y1),
+                                  (d2_point)(x + x2), (d2_point)(y + y2),
+                                  (d2_point)(x + x3), (d2_point)(y + y3),
+                                  (d2_point)(x + x4), (d2_point)(y + y4), 0));
+        }
+        D2_EXEC(d2_setfillmode(_d2_handle, fillmode_backup));
+    }
+}
+
+void lv_port_ra_gpu_blit(lv_color_t * dst, const lv_area_t * dst_area, lv_coord_t dest_stride,
+                         const lv_color_t * src, const lv_area_t * src_area, lv_opa_t opa)
+{
+    d2_u32 flags = 0;
+    const d2_color * clut = NULL;
+    int clut_len = 0;
+
+    invalidate_cache();
+
+    clut_len = lv_port_gpu_handle_indexed_color(&src, &clut, src_cf_val);
+
+    lv_port_gpu_start_render();
+
+    D2_EXEC(d2_framebuffer(_d2_handle, d1_maptovidmem(_d2_handle, dst), MAX(dest_stride, 2),
+                           MAX(dst_area->x2 + 1, 2), MAX(dst_area->y2 + 1, 2), dst_cf_val));
+
+    flags |= alpha_enabled ? d2_bf_usealpha : 0;
+
+    D2_EXEC(d2_setalpha(_d2_handle, opa > LV_OPA_MAX ? LV_OPA_COVER : opa));
+
+    if(clut) {
+        D2_EXEC(d2_writetexclut_direct(_d2_handle, clut, 0, clut_len));
+    }
+
+    flags |= color_key_enabled ? d2_bf_usealpha : 0;
+    flags |= (colorize_enabled || img_dsc.recolor_opa != LV_OPA_TRANSP) ? d2_bf_colorize2 : 0;
+    if(colorize_enabled) {
+        D2_EXEC(d2_setcolor(_d2_handle, 0, lv_port_gpu_color_lv_to_d2(img_dsc.recolor)));
+        D2_EXEC(d2_setcolor(_d2_handle, 1, lv_port_gpu_color_lv_to_d2(img_dsc.recolor)));
+    }
+    else if(img_dsc.recolor_opa != LV_OPA_TRANSP) {
+        d2_color cl = 0, ch = 0;
+        lv_port_gpu_get_recolor_consts(&cl, &ch);
+        D2_EXEC(d2_setcolor(_d2_handle, 0, cl));
+        D2_EXEC(d2_setcolor(_d2_handle, 1, ch));
+    }
+
+    flags |= ((img_dsc.angle || img_dsc.zoom != LV_IMG_ZOOM_NONE) && img_dsc.antialias) ? d2_bf_filter : 0;
+
+    if(blend_enabled) {
+        D2_EXEC(d2_setblendmode(_d2_handle, d2_bm_alpha,
+                                img_dsc.blend_mode != LV_BLEND_MODE_NORMAL ? d2_bm_one : d2_bm_one_minus_alpha));
+        D2_EXEC(d2_setalphablendmode(_d2_handle, d2_bm_one, d2_bm_one_minus_alpha));
+    }
+    else {
+        D2_EXEC(d2_setblendmode(_d2_handle, d2_bm_one, d2_bm_zero));
+        D2_EXEC(d2_setalphablendmode(_d2_handle, d2_bm_one, d2_bm_zero));
+    }
+
+    lv_port_gpu_blit_internal(dst_area, src, src_area, flags);
+
+    lv_port_gpu_execute_render();
+}
+
+void lv_draw_ra6m3_2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc)
+{
+    lv_area_t blend_area;
+    if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) return;
+
+    bool done = false;
+
+    if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && lv_area_get_size(&blend_area) > 100) {
+        lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area);
+
+        lv_color_t * dest_buf = draw_ctx->buf;
+
+        const lv_color_t * src_buf = dsc->src_buf;
+        if(src_buf) {
+            lv_draw_sw_blend_basic(draw_ctx, dsc);
+
+            lv_area_t src_area;
+            src_area.x1 = blend_area.x1 - (dsc->blend_area->x1 - draw_ctx->buf_area->x1);
+            src_area.y1 = blend_area.y1 - (dsc->blend_area->y1 - draw_ctx->buf_area->y1);
+            src_area.x2 = src_area.x1 + lv_area_get_width(dsc->blend_area) - 1;
+            src_area.y2 = src_area.y1 + lv_area_get_height(dsc->blend_area) - 1;
+
+            lv_port_ra_gpu_blit(dest_buf, &blend_area, dest_stride, src_buf, &src_area, dsc->opa);
+            done = true;
+        }
+        else if(dsc->opa >= LV_OPA_MAX) {
+            lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+            lv_port_gpu_fill(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa);
+            done = true;
+        }
+    }
+
+    if(!done) lv_draw_sw_blend_basic(draw_ctx, dsc);
+}
+
+static void lv_port_gpu_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc,
+                                    const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format)
+{
+    /*TODO basic ARGB8888 image can be handles here*/
+
+    lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, color_format);
+}
+
+void lv_draw_ra6m3_2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
+{
+    lv_draw_sw_init_ctx(drv, draw_ctx);
+
+    lv_draw_ra6m3_dma2d_ctx_t * ra_2d_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx;
+
+    ra_2d_draw_ctx->blend = lv_draw_ra6m3_2d_blend;
+    ra_2d_draw_ctx->base_draw.draw_img_decoded = lv_port_gpu_img_decoded;
+    ra_2d_draw_ctx->base_draw.wait_for_finish = lv_port_gpu_wait;
+    ra_2d_draw_ctx->base_draw.draw_letter = lv_draw_gpu_letter;
+    //ra_2d_draw_ctx->base_draw.buffer_copy = lv_draw_ra6m3_2d_buffer_copy;
+}
+
+void lv_draw_stm32_dma2d_ctx_deinit(lv_disp_t * disp, lv_draw_ctx_t * draw_ctx)
+{
+    LV_UNUSED(disp);
+    LV_UNUSED(draw_ctx);
+}
+
+static void invalidate_cache(void)
+{
+    lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+    if(disp->driver->clean_dcache_cb) disp->driver->clean_dcache_cb(disp->driver);
+}
+
+#ifdef LOG_ERRORS
+static void lv_port_gpu_log_error(d2_s32 status, const char * func, int line)
+{
+    if(status) {
+        log_error_list[error_list_index].error = status;
+        log_error_list[error_list_index].func = func;
+        log_error_list[error_list_index].line = line;
+        LV_LOG_ERROR("%s\r\n", d2_geterrorstring(_d2_handle));
+        LV_LOG_ERROR("%d:\t%d - %s : %d\r\n", error_count,
+                     log_error_list[error_list_index].error,
+                     log_error_list[error_list_index].func,
+                     log_error_list[error_list_index].line);
+
+        error_count++;
+        error_list_index++;
+        if(error_list_index >= ERROR_LIST_SIZE) {
+            error_list_index = 0;
+        }
+    }
+}
+#endif
+#endif /* LV_USE_GPU_RA6M3_G2D */
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.h
new file mode 100644 (file)
index 0000000..5d37ce4
--- /dev/null
@@ -0,0 +1,56 @@
+/**
+ * @file lv_gpu_d2_ra6m3.h
+ *
+ */
+#ifndef LV_GPU_D2_RA6M3_H
+#define LV_GPU_D2_RA6M3_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../../misc/lv_color.h"
+
+#if LV_USE_GPU_RA6M3_G2D
+#include "../../core/lv_disp.h"
+#include "../sw/lv_draw_sw.h"
+
+/**********************
+ *      DEFINE
+ **********************/
+#define MIN(A, B) ((A) < (B) ? (A) : (B))
+#define MAX(A, B) ((A) > (B) ? (A) : (B))
+#define M_PI    3.1415926
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+typedef lv_draw_sw_ctx_t lv_draw_ra6m3_dma2d_ctx_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void lv_draw_ra6m3_g2d_init(void);
+
+void lv_port_gpu_init(void);
+
+void lv_port_gpu_flush(void);
+
+void lv_port_gpu_blit(int32_t x, int32_t y, lv_color_t * dst, const lv_area_t * fill_area);
+
+void lv_draw_ra6m3_2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc);
+
+void lv_draw_ra6m3_2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
+
+void lv_draw_ra6m3_2d_ctx_deinit(lv_disp_drv_t * disp, lv_draw_ctx_t * draw_ctx);
+
+#endif  /*LV_USE_GPU_GD32_IPA*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sdl/lv_draw_sdl_layer.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sdl/lv_draw_sdl_layer.c
new file mode 100644 (file)
index 0000000..d517636
--- /dev/null
@@ -0,0 +1,147 @@
+/**
+ * @file lv_draw_sdl_refr.c
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../../lv_conf_internal.h"
+
+#if LV_USE_GPU_SDL
+
+#include "../../core/lv_refr.h"
+
+#include "lv_draw_sdl.h"
+#include "lv_draw_sdl_priv.h"
+#include "lv_draw_sdl_composite.h"
+#include "lv_draw_sdl_utils.h"
+#include "lv_draw_sdl_layer.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+lv_draw_layer_ctx_t * lv_draw_sdl_layer_init(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx,
+                                             lv_draw_layer_flags_t flags)
+{
+    lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx;
+    SDL_Renderer * renderer = ctx->renderer;
+
+    lv_draw_sdl_layer_ctx_t * transform_ctx = (lv_draw_sdl_layer_ctx_t *) layer_ctx;
+
+    transform_ctx->flags = flags;
+    transform_ctx->orig_target = SDL_GetRenderTarget(renderer);
+
+    lv_coord_t target_w = lv_area_get_width(&layer_ctx->area_full);
+    lv_coord_t target_h = lv_area_get_height(&layer_ctx->area_full);
+
+    enum lv_draw_sdl_composite_texture_id_t texture_id = LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TRANSFORM0 +
+                                                         ctx->internals->transform_count;
+    transform_ctx->target = lv_draw_sdl_composite_texture_obtain(ctx, texture_id, target_w, target_h,
+                                                                 &transform_ctx->target_in_cache);
+    transform_ctx->target_rect.x = 0;
+    transform_ctx->target_rect.y = 0;
+    transform_ctx->target_rect.w = target_w;
+    transform_ctx->target_rect.h = target_h;
+
+    layer_ctx->max_row_with_alpha = target_h;
+    layer_ctx->max_row_with_no_alpha = target_h;
+
+    SDL_SetTextureBlendMode(transform_ctx->target, SDL_BLENDMODE_BLEND);
+    SDL_SetRenderTarget(renderer, transform_ctx->target);
+
+    /* SDL_RenderClear is not working properly, so we overwrite the target with solid color */
+    SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE);
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
+    SDL_RenderFillRect(renderer, NULL);
+    SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND);
+
+    /* Set proper drawing context for transform layer */
+    ctx->internals->transform_count += 1;
+    draw_ctx->buf_area = &layer_ctx->area_full;
+    draw_ctx->clip_area = &layer_ctx->area_full;
+
+    return layer_ctx;
+}
+
+void lv_draw_sdl_layer_blend(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx,
+                             const lv_draw_img_dsc_t * draw_dsc)
+{
+    lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx;
+    lv_draw_sdl_layer_ctx_t * transform_ctx = (lv_draw_sdl_layer_ctx_t *) layer_ctx;
+
+    SDL_Renderer * renderer = ctx->renderer;
+
+    SDL_Rect trans_rect;
+
+    if(transform_ctx->flags & LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE) {
+        lv_area_zoom_to_sdl_rect(&layer_ctx->area_act, &trans_rect, draw_dsc->zoom, &draw_dsc->pivot);
+    }
+    else {
+        lv_area_zoom_to_sdl_rect(&layer_ctx->area_full, &trans_rect, draw_dsc->zoom, &draw_dsc->pivot);
+    }
+
+    SDL_SetRenderTarget(renderer, transform_ctx->orig_target);
+
+    /*Render off-screen texture, transformed*/
+    SDL_Rect clip_rect;
+    lv_area_to_sdl_rect(layer_ctx->original.clip_area, &clip_rect);
+    SDL_Point center = {.x = draw_dsc->pivot.x, .y = draw_dsc->pivot.y};
+    SDL_RenderSetClipRect(renderer, &clip_rect);
+    SDL_SetTextureAlphaMod(transform_ctx->target, draw_dsc->opa);
+    SDL_RenderCopyEx(renderer, transform_ctx->target, &transform_ctx->target_rect, &trans_rect,
+                     draw_dsc->angle, &center, SDL_FLIP_NONE);
+    SDL_RenderSetClipRect(renderer, NULL);
+}
+
+void lv_draw_sdl_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx)
+{
+    lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx;
+    lv_draw_sdl_layer_ctx_t * transform_ctx = (lv_draw_sdl_layer_ctx_t *) layer_ctx;
+    if(!transform_ctx->target_in_cache && transform_ctx->target != NULL) {
+        LV_LOG_WARN("Texture is not cached, this will impact performance.");
+        SDL_DestroyTexture(transform_ctx->target);
+    }
+    ctx->internals->transform_count -= 1;
+}
+
+void lv_draw_sdl_transform_areas_offset(lv_draw_sdl_ctx_t * ctx, bool has_composite, lv_area_t * apply_area,
+                                        lv_area_t * coords, lv_area_t * clip)
+{
+    if(ctx->internals->transform_count == 0) {
+        return;
+    }
+    lv_area_t * area = ctx->base_draw.buf_area;
+    lv_area_move(coords, -area->x1, -area->y1);
+    lv_area_move(clip, -area->x1, -area->y1);
+    if(has_composite) {
+        lv_area_move(apply_area, -area->x1, -area->y1);
+    }
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+#endif /*LV_USE_GPU_SDL*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sdl/lv_draw_sdl_layer.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sdl/lv_draw_sdl_layer.h
new file mode 100644 (file)
index 0000000..f6aa668
--- /dev/null
@@ -0,0 +1,56 @@
+/**
+ * @file lv_draw_sdl_refr.h
+ *
+ */
+
+#ifndef LV_TEMPL_H
+#define LV_TEMPL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "lv_draw_sdl.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+typedef struct _lv_draw_sdl_layer_ctx_t {
+    lv_draw_layer_ctx_t base;
+
+    SDL_Texture * orig_target;
+    SDL_Texture * target;
+    SDL_Rect target_rect;
+    bool target_in_cache;
+    lv_draw_layer_flags_t flags;
+} lv_draw_sdl_layer_ctx_t;
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+lv_draw_layer_ctx_t * lv_draw_sdl_layer_init(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx,
+                                             lv_draw_layer_flags_t flags);
+
+void lv_draw_sdl_layer_blend(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * transform_ctx,
+                             const lv_draw_img_dsc_t * draw_dsc);
+
+void lv_draw_sdl_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx);
+
+void lv_draw_sdl_transform_areas_offset(lv_draw_sdl_ctx_t * ctx, bool has_composite, lv_area_t * apply_area,
+                                        lv_area_t * coords, lv_area_t * clip);
+/**********************
+ *      MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_TEMPL_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk
new file mode 100644 (file)
index 0000000..8ed00b0
--- /dev/null
@@ -0,0 +1,6 @@
+CSRCS += lv_gpu_stm32_dma2d.c
+
+DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/stm32_dma2d
+VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/stm32_dma2d
+
+CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/stm32_dma2d"
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_layer.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_layer.c
new file mode 100644 (file)
index 0000000..b53c662
--- /dev/null
@@ -0,0 +1,150 @@
+/**
+ * @file lv_draw_sw_layer.h
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "lv_draw_sw.h"
+#include "../../hal/lv_hal_disp.h"
+#include "../../misc/lv_area.h"
+#include "../../core/lv_refr.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *  GLOBAL VARIABLES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+
+struct _lv_draw_layer_ctx_t * lv_draw_sw_layer_create(struct _lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx,
+                                                      lv_draw_layer_flags_t flags)
+{
+    if(LV_COLOR_SCREEN_TRANSP == 0 && (flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA)) {
+        LV_LOG_WARN("Rendering this widget needs LV_COLOR_SCREEN_TRANSP 1");
+        return NULL;
+    }
+
+    lv_draw_sw_layer_ctx_t * layer_sw_ctx = (lv_draw_sw_layer_ctx_t *) layer_ctx;
+    uint32_t px_size = flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA ? LV_IMG_PX_SIZE_ALPHA_BYTE : sizeof(lv_color_t);
+    if(flags & LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE) {
+        layer_sw_ctx->buf_size_bytes = LV_LAYER_SIMPLE_BUF_SIZE;
+        uint32_t full_size = lv_area_get_size(&layer_sw_ctx->base_draw.area_full) * px_size;
+        if(layer_sw_ctx->buf_size_bytes > full_size) layer_sw_ctx->buf_size_bytes = full_size;
+        layer_sw_ctx->base_draw.buf = lv_mem_alloc(layer_sw_ctx->buf_size_bytes);
+        if(layer_sw_ctx->base_draw.buf == NULL) {
+            LV_LOG_WARN("Cannot allocate %"LV_PRIu32" bytes for layer buffer. Allocating %"LV_PRIu32" bytes instead. (Reduced performance)",
+                        (uint32_t)layer_sw_ctx->buf_size_bytes, (uint32_t)LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE * px_size);
+            layer_sw_ctx->buf_size_bytes = LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE;
+            layer_sw_ctx->base_draw.buf = lv_mem_alloc(layer_sw_ctx->buf_size_bytes);
+            if(layer_sw_ctx->base_draw.buf == NULL) {
+                return NULL;
+            }
+        }
+        layer_sw_ctx->base_draw.area_act = layer_sw_ctx->base_draw.area_full;
+        layer_sw_ctx->base_draw.area_act.y2 = layer_sw_ctx->base_draw.area_full.y1;
+        lv_coord_t w = lv_area_get_width(&layer_sw_ctx->base_draw.area_act);
+        layer_sw_ctx->base_draw.max_row_with_alpha = layer_sw_ctx->buf_size_bytes / w / LV_IMG_PX_SIZE_ALPHA_BYTE;
+        layer_sw_ctx->base_draw.max_row_with_no_alpha = layer_sw_ctx->buf_size_bytes / w / sizeof(lv_color_t);
+    }
+    else {
+        layer_sw_ctx->base_draw.area_act = layer_sw_ctx->base_draw.area_full;
+        layer_sw_ctx->buf_size_bytes = lv_area_get_size(&layer_sw_ctx->base_draw.area_full) * px_size;
+        layer_sw_ctx->base_draw.buf = lv_mem_alloc(layer_sw_ctx->buf_size_bytes);
+        lv_memset_00(layer_sw_ctx->base_draw.buf, layer_sw_ctx->buf_size_bytes);
+        layer_sw_ctx->has_alpha = flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA ? 1 : 0;
+        if(layer_sw_ctx->base_draw.buf == NULL) {
+            return NULL;
+        }
+
+        draw_ctx->buf = layer_sw_ctx->base_draw.buf;
+        draw_ctx->buf_area = &layer_sw_ctx->base_draw.area_act;
+        draw_ctx->clip_area = &layer_sw_ctx->base_draw.area_act;
+
+        lv_disp_t * disp_refr = _lv_refr_get_disp_refreshing();
+        disp_refr->driver->screen_transp = flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA ? 1 : 0;
+    }
+
+    return layer_ctx;
+}
+
+void lv_draw_sw_layer_adjust(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+                             lv_draw_layer_flags_t flags)
+{
+
+    lv_draw_sw_layer_ctx_t * layer_sw_ctx = (lv_draw_sw_layer_ctx_t *) layer_ctx;
+    lv_disp_t * disp_refr = _lv_refr_get_disp_refreshing();
+    if(flags & LV_DRAW_LAYER_FLAG_HAS_ALPHA) {
+        lv_memset_00(layer_ctx->buf, layer_sw_ctx->buf_size_bytes);
+        layer_sw_ctx->has_alpha = 1;
+        disp_refr->driver->screen_transp = 1;
+    }
+    else {
+        layer_sw_ctx->has_alpha = 0;
+        disp_refr->driver->screen_transp = 0;
+    }
+
+    draw_ctx->buf = layer_ctx->buf;
+    draw_ctx->buf_area = &layer_ctx->area_act;
+    draw_ctx->clip_area = &layer_ctx->area_act;
+}
+
+void lv_draw_sw_layer_blend(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
+                            const lv_draw_img_dsc_t * draw_dsc)
+{
+    lv_draw_sw_layer_ctx_t * layer_sw_ctx = (lv_draw_sw_layer_ctx_t *) layer_ctx;
+
+    lv_img_dsc_t img;
+    img.data = draw_ctx->buf;
+    img.header.always_zero = 0;
+    img.header.w = lv_area_get_width(draw_ctx->buf_area);
+    img.header.h = lv_area_get_height(draw_ctx->buf_area);
+    img.header.cf = layer_sw_ctx->has_alpha ? LV_IMG_CF_TRUE_COLOR_ALPHA : LV_IMG_CF_TRUE_COLOR;
+
+    /*Restore the original draw_ctx*/
+    draw_ctx->buf = layer_ctx->original.buf;
+    draw_ctx->buf_area = layer_ctx->original.buf_area;
+    draw_ctx->clip_area = layer_ctx->original.clip_area;
+    lv_disp_t * disp_refr = _lv_refr_get_disp_refreshing();
+    disp_refr->driver->screen_transp = layer_ctx->original.screen_transp;
+
+    /*Blend the layer*/
+    lv_draw_img(draw_ctx, draw_dsc, &layer_ctx->area_act, &img);
+    lv_draw_wait_for_finish(draw_ctx);
+    lv_img_cache_invalidate_src(&img);
+}
+
+void lv_draw_sw_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx)
+{
+    LV_UNUSED(draw_ctx);
+
+    lv_mem_free(layer_ctx->buf);
+}
+
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_transform.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_transform.c
new file mode 100644 (file)
index 0000000..204503a
--- /dev/null
@@ -0,0 +1,496 @@
+/**
+ * @file lv_draw_sw_tranform.c
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "lv_draw_sw.h"
+#include "../../misc/lv_assert.h"
+#include "../../misc/lv_area.h"
+#include "../../core/lv_refr.h"
+
+#if LV_DRAW_COMPLEX
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+typedef struct {
+    int32_t x_in;
+    int32_t y_in;
+    int32_t x_out;
+    int32_t y_out;
+    int32_t sinma;
+    int32_t cosma;
+    int32_t zoom;
+    int32_t angle;
+    int32_t pivot_x_256;
+    int32_t pivot_y_256;
+    lv_point_t pivot;
+} point_transform_dsc_t;
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+/**
+ * Transform a point with 1/256 precision (the output coordinates are upscaled by 256)
+ * @param t         pointer to n initialized `point_transform_dsc_t` structure
+ * @param xin       X coordinate to rotate
+ * @param yin       Y coordinate to rotate
+ * @param xout      upscaled, transformed X
+ * @param yout      upscaled, transformed Y
+ */
+static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int32_t yin, int32_t * xout,
+                                     int32_t * yout);
+
+static void argb_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+                       int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+                       int32_t x_end, lv_color_t * cbuf, uint8_t * abuf);
+
+static void rgb_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+                      int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+                      int32_t x_end, lv_color_t * cbuf, uint8_t * abuf, lv_img_cf_t cf);
+
+#if LV_COLOR_DEPTH == 16
+static void rgb565a8_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+                           int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+                           int32_t x_end, lv_color_t * cbuf, uint8_t * abuf);
+#endif
+
+static void argb_and_rgb_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+                            int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+                            int32_t x_end, lv_color_t * cbuf, uint8_t * abuf, lv_img_cf_t cf);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+void lv_draw_sw_transform(lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, const void * src_buf,
+                          lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+                          const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf)
+{
+    LV_UNUSED(draw_ctx);
+
+    point_transform_dsc_t tr_dsc;
+    tr_dsc.angle = -draw_dsc->angle;
+    tr_dsc.zoom = (256 * 256) / draw_dsc->zoom;
+    tr_dsc.pivot = draw_dsc->pivot;
+
+    int32_t angle_low = tr_dsc.angle / 10;
+    int32_t angle_high = angle_low + 1;
+    int32_t angle_rem = tr_dsc.angle  - (angle_low * 10);
+
+    int32_t s1 = lv_trigo_sin(angle_low);
+    int32_t s2 = lv_trigo_sin(angle_high);
+
+    int32_t c1 = lv_trigo_sin(angle_low + 90);
+    int32_t c2 = lv_trigo_sin(angle_high + 90);
+
+    tr_dsc.sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10;
+    tr_dsc.cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10;
+    tr_dsc.sinma = tr_dsc.sinma >> (LV_TRIGO_SHIFT - 10);
+    tr_dsc.cosma = tr_dsc.cosma >> (LV_TRIGO_SHIFT - 10);
+    tr_dsc.pivot_x_256 = tr_dsc.pivot.x * 256;
+    tr_dsc.pivot_y_256 = tr_dsc.pivot.y * 256;
+
+    lv_coord_t dest_w = lv_area_get_width(dest_area);
+    lv_coord_t dest_h = lv_area_get_height(dest_area);
+    lv_coord_t y;
+    for(y = 0; y < dest_h; y++) {
+        int32_t xs1_ups, ys1_ups, xs2_ups, ys2_ups;
+
+        transform_point_upscaled(&tr_dsc, dest_area->x1, dest_area->y1 + y, &xs1_ups, &ys1_ups);
+        transform_point_upscaled(&tr_dsc, dest_area->x2, dest_area->y1 + y, &xs2_ups, &ys2_ups);
+
+        int32_t xs_diff = xs2_ups - xs1_ups;
+        int32_t ys_diff = ys2_ups - ys1_ups;
+        int32_t xs_step_256 = 0;
+        int32_t ys_step_256 = 0;
+        if(dest_w > 1) {
+            xs_step_256 = (256 * xs_diff) / (dest_w - 1);
+            ys_step_256 = (256 * ys_diff) / (dest_w - 1);
+        }
+        int32_t xs_ups = xs1_ups + 0x80;
+        int32_t ys_ups = ys1_ups + 0x80;
+
+        if(draw_dsc->antialias == 0) {
+            switch(cf) {
+                case LV_IMG_CF_TRUE_COLOR_ALPHA:
+                    argb_no_aa(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, cbuf, abuf);
+                    break;
+                case LV_IMG_CF_TRUE_COLOR:
+                case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED:
+                    rgb_no_aa(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, cbuf, abuf, cf);
+                    break;
+
+#if LV_COLOR_DEPTH == 16
+                case LV_IMG_CF_RGB565A8:
+                    rgb565a8_no_aa(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, cbuf, abuf);
+                    break;
+#endif
+                default:
+                    break;
+            }
+        }
+        else {
+            argb_and_rgb_aa(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, cbuf, abuf, cf);
+        }
+
+        cbuf += dest_w;
+        abuf += dest_w;
+    }
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+static void rgb_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+                      int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+                      int32_t x_end, lv_color_t * cbuf, uint8_t * abuf, lv_img_cf_t cf)
+{
+    int32_t xs_ups_start = xs_ups;
+    int32_t ys_ups_start = ys_ups;
+    lv_disp_t * d = _lv_refr_get_disp_refreshing();
+    lv_color_t ck = d->driver->color_chroma_key;
+
+    lv_memset_ff(abuf, x_end);
+
+    lv_coord_t x;
+    for(x = 0; x < x_end; x++) {
+        xs_ups = xs_ups_start + ((xs_step * x) >> 8);
+        ys_ups = ys_ups_start + ((ys_step * x) >> 8);
+
+        int32_t xs_int = xs_ups >> 8;
+        int32_t ys_int = ys_ups >> 8;
+        if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) {
+            abuf[x] = 0x00;
+        }
+        else {
+
+#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
+            const uint8_t * src_tmp = src;
+            src_tmp += ys_int * src_stride + xs_int;
+            cbuf[x].full = src_tmp[0];
+#elif LV_COLOR_DEPTH == 16
+            const lv_color_t * src_tmp = (const lv_color_t *)src;
+            src_tmp += ys_int * src_stride + xs_int;
+            cbuf[x] = *src_tmp;
+#elif LV_COLOR_DEPTH == 32
+            const uint8_t * src_tmp = src;
+            src_tmp += (ys_int * src_stride * sizeof(lv_color_t)) + xs_int * sizeof(lv_color_t);
+            cbuf[x].full = *((uint32_t *)src_tmp);
+#endif
+        }
+        if(cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED && cbuf[x].full == ck.full) {
+            abuf[x] = 0x00;
+        }
+    }
+}
+
+static void argb_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+                       int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+                       int32_t x_end, lv_color_t * cbuf, uint8_t * abuf)
+{
+    int32_t xs_ups_start = xs_ups;
+    int32_t ys_ups_start = ys_ups;
+
+    lv_coord_t x;
+    for(x = 0; x < x_end; x++) {
+        xs_ups = xs_ups_start + ((xs_step * x) >> 8);
+        ys_ups = ys_ups_start + ((ys_step * x) >> 8);
+
+        int32_t xs_int = xs_ups >> 8;
+        int32_t ys_int = ys_ups >> 8;
+        if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) {
+            abuf[x] = 0;
+        }
+        else {
+            const uint8_t * src_tmp = src;
+            src_tmp += (ys_int * src_stride * LV_IMG_PX_SIZE_ALPHA_BYTE) + xs_int * LV_IMG_PX_SIZE_ALPHA_BYTE;
+
+#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
+            cbuf[x].full = src_tmp[0];
+#elif LV_COLOR_DEPTH == 16
+            cbuf[x].full = src_tmp[0] + (src_tmp[1] << 8);
+#elif LV_COLOR_DEPTH == 32
+            cbuf[x].full = *((uint32_t *)src_tmp);
+#endif
+            abuf[x] = src_tmp[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
+        }
+    }
+}
+
+#if LV_COLOR_DEPTH == 16
+static void rgb565a8_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+                           int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+                           int32_t x_end, lv_color_t * cbuf, uint8_t * abuf)
+{
+    int32_t xs_ups_start = xs_ups;
+    int32_t ys_ups_start = ys_ups;
+
+    lv_coord_t x;
+    for(x = 0; x < x_end; x++) {
+        xs_ups = xs_ups_start + ((xs_step * x) >> 8);
+        ys_ups = ys_ups_start + ((ys_step * x) >> 8);
+
+        int32_t xs_int = xs_ups >> 8;
+        int32_t ys_int = ys_ups >> 8;
+        if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) {
+            abuf[x] = 0;
+        }
+        else {
+            const lv_color_t * src_tmp = (const lv_color_t *)src;
+            src_tmp += ys_int * src_stride + xs_int;
+            cbuf[x] = *src_tmp;
+
+            const lv_opa_t * a_tmp = src + src_stride * src_h * sizeof(lv_color_t);
+            a_tmp += ys_int * src_stride + xs_int;
+            abuf[x] = *a_tmp;
+        }
+    }
+}
+#endif
+
+
+static void argb_and_rgb_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
+                            int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
+                            int32_t x_end, lv_color_t * cbuf, uint8_t * abuf, lv_img_cf_t cf)
+{
+    int32_t xs_ups_start = xs_ups;
+    int32_t ys_ups_start = ys_ups;
+    bool has_alpha;
+    int32_t px_size;
+    lv_color_t ck = {0};
+    switch(cf) {
+        case LV_IMG_CF_TRUE_COLOR:
+            has_alpha = false;
+            px_size = sizeof(lv_color_t);
+            break;
+        case LV_IMG_CF_TRUE_COLOR_ALPHA:
+            has_alpha = true;
+            px_size = LV_IMG_PX_SIZE_ALPHA_BYTE;
+            break;
+        case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: {
+                has_alpha = true;
+                px_size = sizeof(lv_color_t);
+                lv_disp_t * d = _lv_refr_get_disp_refreshing();
+                ck = d->driver->color_chroma_key;
+                break;
+            }
+#if LV_COLOR_DEPTH == 16
+        case LV_IMG_CF_RGB565A8:
+            has_alpha = true;
+            px_size = sizeof(lv_color_t);
+            break;
+#endif
+        default:
+            return;
+    }
+
+    lv_coord_t x;
+    for(x = 0; x < x_end; x++) {
+        xs_ups = xs_ups_start + ((xs_step * x) >> 8);
+        ys_ups = ys_ups_start + ((ys_step * x) >> 8);
+
+        int32_t xs_int = xs_ups >> 8;
+        int32_t ys_int = ys_ups >> 8;
+
+        /*Fully out of the image*/
+        if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) {
+            abuf[x] = 0x00;
+            continue;
+        }
+
+        /*Get the direction the hor and ver neighbor
+         *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/
+        int32_t xs_fract = xs_ups & 0xFF;
+        int32_t ys_fract = ys_ups & 0xFF;
+
+        int32_t x_next;
+        int32_t y_next;
+        if(xs_fract < 0x80) {
+            x_next = -1;
+            xs_fract = (0x7F - xs_fract) * 2;
+        }
+        else {
+            x_next = 1;
+            xs_fract = (xs_fract - 0x80) * 2;
+        }
+        if(ys_fract < 0x80) {
+            y_next = -1;
+            ys_fract = (0x7F - ys_fract) * 2;
+        }
+        else {
+            y_next = 1;
+            ys_fract = (ys_fract - 0x80) * 2;
+        }
+
+        const uint8_t * src_tmp = src;
+        src_tmp += (ys_int * src_stride * px_size) + xs_int * px_size;
+
+
+        if(xs_int + x_next >= 0 &&
+           xs_int + x_next <= src_w - 1 &&
+           ys_int + y_next >= 0 &&
+           ys_int + y_next <= src_h - 1) {
+
+            const uint8_t * px_base = src_tmp;
+            const uint8_t * px_hor = src_tmp + x_next * px_size;
+            const uint8_t * px_ver = src_tmp + y_next * src_stride * px_size;
+            lv_color_t c_base;
+            lv_color_t c_ver;
+            lv_color_t c_hor;
+
+            if(has_alpha) {
+                lv_opa_t a_base;
+                lv_opa_t a_ver;
+                lv_opa_t a_hor;
+                if(cf == LV_IMG_CF_TRUE_COLOR_ALPHA) {
+                    a_base = px_base[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
+                    a_ver = px_ver[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
+                    a_hor = px_hor[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
+                }
+#if LV_COLOR_DEPTH == 16
+                else if(cf == LV_IMG_CF_RGB565A8) {
+                    const lv_opa_t * a_tmp = src + src_stride * src_h * sizeof(lv_color_t);
+                    a_base = *(a_tmp + (ys_int * src_stride) + xs_int);
+                    a_hor = *(a_tmp + (ys_int * src_stride) + xs_int + x_next);
+                    a_ver = *(a_tmp + ((ys_int + y_next) * src_stride) + xs_int);
+                }
+#endif
+                else if(cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) {
+                    if(((lv_color_t *)px_base)->full == ck.full ||
+                       ((lv_color_t *)px_ver)->full == ck.full ||
+                       ((lv_color_t *)px_hor)->full == ck.full) {
+                        abuf[x] = 0x00;
+                        continue;
+                    }
+                    else {
+                        a_base = 0xff;
+                        a_ver = 0xff;
+                        a_hor = 0xff;
+                    }
+                }
+                else {
+                    a_base = 0xff;
+                    a_ver = 0xff;
+                    a_hor = 0xff;
+                }
+
+                if(a_ver != a_base) a_ver = ((a_ver * ys_fract) + (a_base * (0x100 - ys_fract))) >> 8;
+                if(a_hor != a_base) a_hor = ((a_hor * xs_fract) + (a_base * (0x100 - xs_fract))) >> 8;
+                abuf[x] = (a_ver + a_hor) >> 1;
+
+                if(abuf[x] == 0x00) continue;
+
+#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
+                c_base.full = px_base[0];
+                c_ver.full = px_ver[0];
+                c_hor.full = px_hor[0];
+#elif LV_COLOR_DEPTH == 16
+                c_base.full = px_base[0] + (px_base[1] << 8);
+                c_ver.full = px_ver[0] + (px_ver[1] << 8);
+                c_hor.full = px_hor[0] + (px_hor[1] << 8);
+#elif LV_COLOR_DEPTH == 32
+                c_base.full = *((uint32_t *)px_base);
+                c_ver.full = *((uint32_t *)px_ver);
+                c_hor.full = *((uint32_t *)px_hor);
+#endif
+            }
+            /*No alpha channel -> RGB*/
+            else {
+                c_base = *((const lv_color_t *) px_base);
+                c_hor = *((const lv_color_t *) px_hor);
+                c_ver = *((const lv_color_t *) px_ver);
+                abuf[x] = 0xff;
+            }
+
+            if(c_base.full == c_ver.full && c_base.full == c_hor.full) {
+                cbuf[x] = c_base;
+            }
+            else {
+                c_ver = lv_color_mix(c_ver, c_base, ys_fract);
+                c_hor = lv_color_mix(c_hor, c_base, xs_fract);
+                cbuf[x] = lv_color_mix(c_hor, c_ver, LV_OPA_50);
+            }
+        }
+        /*Partially out of the image*/
+        else {
+#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
+            cbuf[x].full = src_tmp[0];
+#elif LV_COLOR_DEPTH == 16
+            cbuf[x].full = src_tmp[0] + (src_tmp[1] << 8);
+#elif LV_COLOR_DEPTH == 32
+            cbuf[x].full = *((uint32_t *)src_tmp);
+#endif
+            lv_opa_t a;
+            switch(cf) {
+                case LV_IMG_CF_TRUE_COLOR_ALPHA:
+                    a = src_tmp[LV_IMG_PX_SIZE_ALPHA_BYTE - 1];
+                    break;
+                case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED:
+                    a = cbuf[x].full == ck.full ? 0x00 : 0xff;
+                    break;
+#if LV_COLOR_DEPTH == 16
+                case LV_IMG_CF_RGB565A8:
+                    a = *(src + src_stride * src_h * sizeof(lv_color_t) + (ys_int * src_stride) + xs_int);
+                    break;
+#endif
+                default:
+                    a = 0xff;
+            }
+
+            if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0))  {
+                abuf[x] = (a * (0xFF - xs_fract)) >> 8;
+            }
+            else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0))  {
+                abuf[x] = (a * (0xFF - ys_fract)) >> 8;
+            }
+            else {
+                abuf[x] = 0x00;
+            }
+        }
+    }
+}
+
+static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int32_t yin, int32_t * xout,
+                                     int32_t * yout)
+{
+    if(t->angle == 0 && t->zoom == LV_IMG_ZOOM_NONE) {
+        *xout = xin * 256;
+        *yout = yin * 256;
+        return;
+    }
+
+    xin -= t->pivot.x;
+    yin -= t->pivot.y;
+
+    if(t->angle == 0) {
+        *xout = ((int32_t)(xin * t->zoom)) + (t->pivot_x_256);
+        *yout = ((int32_t)(yin * t->zoom)) + (t->pivot_y_256);
+    }
+    else if(t->zoom == LV_IMG_ZOOM_NONE) {
+        *xout = ((t->cosma * xin - t->sinma * yin) >> 2) + (t->pivot_x_256);
+        *yout = ((t->sinma * xin + t->cosma * yin) >> 2) + (t->pivot_y_256);
+    }
+    else {
+        *xout = (((t->cosma * xin - t->sinma * yin) * t->zoom) >> 10) + (t->pivot_x_256);
+        *yout = (((t->sinma * xin + t->cosma * yin) * t->zoom) >> 10) + (t->pivot_y_256);
+    }
+}
+
+#endif
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk
new file mode 100644 (file)
index 0000000..bc19e38
--- /dev/null
@@ -0,0 +1,6 @@
+CSRCS += lv_gpu_swm341_dma2d.c
+
+DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/swm341_dma2d
+VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/swm341_dma2d
+
+CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/swm341_dma2d"
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c
new file mode 100644 (file)
index 0000000..74a5394
--- /dev/null
@@ -0,0 +1,241 @@
+/**
+ * @file lv_gpu_swm341_dma2d.c
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "lv_gpu_swm341_dma2d.h"
+#include "../../core/lv_refr.h"
+
+#if LV_USE_GPU_SWM341_DMA2D
+
+#include LV_GPU_SWM341_DMA2D_INCLUDE
+
+/*********************
+ *      DEFINES
+ *********************/
+
+#if LV_COLOR_16_SWAP
+    #error "Can't use DMA2D with LV_COLOR_16_SWAP 1"
+#endif
+
+#if LV_COLOR_DEPTH == 8
+    #error "Can't use DMA2D with LV_COLOR_DEPTH == 8"
+#endif
+
+#if LV_COLOR_DEPTH == 16
+    #define LV_DMA2D_COLOR_FORMAT LV_SWM341_DMA2D_RGB565
+#elif LV_COLOR_DEPTH == 32
+    #define LV_DMA2D_COLOR_FORMAT LV_SWM341_DMA2D_ARGB8888
+#else
+    /*Can't use GPU with other formats*/
+#endif
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+static void lv_draw_swm341_dma2d_blend_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area,
+                                            lv_color_t color);
+
+static void lv_draw_swm341_dma2d_blend_map(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+                                           const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa);
+
+static void lv_draw_swm341_dma2d_img_decoded(lv_draw_ctx_t * draw, const lv_draw_img_dsc_t * dsc,
+                                             const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * Turn on the peripheral and set output color mode, this only needs to be done once
+ */
+void lv_draw_swm341_dma2d_init(void)
+{
+    /*Enable DMA2D clock*/
+    SYS->CLKEN0 |= (1 << SYS_CLKEN0_DMA2D_Pos);
+
+    DMA2D->CR &= ~DMA2D_CR_WAIT_Msk;
+    DMA2D->CR |= (CyclesPerUs << DMA2D_CR_WAIT_Pos);
+
+    DMA2D->IF = 0xFF;
+    DMA2D->IE = (0 << DMA2D_IE_DONE_Pos);
+
+    /*set output colour mode*/
+    DMA2D->L[DMA2D_LAYER_OUT].PFCCR = (LV_DMA2D_COLOR_FORMAT << DMA2D_PFCCR_CFMT_Pos);
+}
+
+void lv_draw_swm341_dma2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
+{
+
+    lv_draw_sw_init_ctx(drv, draw_ctx);
+
+    lv_draw_swm341_dma2d_ctx_t * dma2d_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx;
+
+    dma2d_draw_ctx->blend = lv_draw_swm341_dma2d_blend;
+    //    dma2d_draw_ctx->base_draw.draw_img_decoded = lv_draw_swm341_dma2d_img_decoded;
+    dma2d_draw_ctx->base_draw.wait_for_finish = lv_gpu_swm341_dma2d_wait_cb;
+}
+
+void lv_draw_swm341_dma2d_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
+{
+    LV_UNUSED(drv);
+    LV_UNUSED(draw_ctx);
+}
+
+void lv_draw_swm341_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc)
+{
+    lv_area_t blend_area;
+    if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area))
+        return;
+
+    bool done = false;
+
+    if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && lv_area_get_size(&blend_area) > 100) {
+        lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area);
+
+        lv_color_t * dest_buf = draw_ctx->buf;
+        dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) + (blend_area.x1 - draw_ctx->buf_area->x1);
+
+        const lv_color_t * src_buf = dsc->src_buf;
+        if(src_buf) {
+            lv_draw_sw_blend_basic(draw_ctx, dsc);
+            lv_coord_t src_stride;
+            src_stride = lv_area_get_width(dsc->blend_area);
+            src_buf += src_stride * (blend_area.y1 - dsc->blend_area->y1) + (blend_area.x1 - dsc->blend_area->x1);
+            lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+            lv_draw_swm341_dma2d_blend_map(dest_buf, &blend_area, dest_stride, src_buf, src_stride, dsc->opa);
+            done = true;
+        }
+        else if(dsc->opa >= LV_OPA_MAX) {
+            lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1);
+            lv_draw_swm341_dma2d_blend_fill(dest_buf, dest_stride, &blend_area, dsc->color);
+            done = true;
+        }
+    }
+
+    if(!done) lv_draw_sw_blend_basic(draw_ctx, dsc);
+}
+
+static void lv_draw_swm341_dma2d_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc,
+                                             const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format)
+{
+    /*TODO basic ARGB8888 image can be handles here*/
+
+    lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, color_format);
+}
+
+static void lv_draw_swm341_dma2d_blend_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area,
+                                            lv_color_t color)
+{
+    /*Simply fill an area*/
+    int32_t area_w = lv_area_get_width(fill_area);
+    int32_t area_h = lv_area_get_height(fill_area);
+
+#if 1
+    DMA2D->L[DMA2D_LAYER_OUT].COLOR = color.full;
+
+    DMA2D->L[DMA2D_LAYER_OUT].MAR = (uint32_t)dest_buf;
+    DMA2D->L[DMA2D_LAYER_OUT].OR = dest_stride - area_w;
+    DMA2D->NLR = ((area_w - 1) << DMA2D_NLR_NPIXEL_Pos) | ((area_h - 1) << DMA2D_NLR_NLINE_Pos);
+
+    /*start transfer*/
+    DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
+    DMA2D->CR |= (3 << DMA2D_CR_MODE_Pos) |
+                 (1 << DMA2D_CR_START_Pos);
+#else
+    for(uint32_t y = 0; y < area_h; y++) {
+        for(uint32_t x = 0; x < area_w; x++) {
+            dest_buf[y * dest_stride + x] = color;
+        }
+    }
+#endif
+}
+
+static void lv_draw_swm341_dma2d_blend_map(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
+                                           const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa)
+{
+
+    /*Simple copy*/
+    int32_t dest_w = lv_area_get_width(dest_area);
+    int32_t dest_h = lv_area_get_height(dest_area);
+
+    if(opa >= LV_OPA_MAX) {
+#if 1
+        /*copy output colour mode, this register controls both input and output colour format*/
+        DMA2D->L[DMA2D_LAYER_FG].MAR = (uint32_t)src_buf;
+        DMA2D->L[DMA2D_LAYER_FG].OR = src_stride - dest_w;
+        DMA2D->L[DMA2D_LAYER_FG].PFCCR = (LV_DMA2D_COLOR_FORMAT << DMA2D_PFCCR_CFMT_Pos);
+
+        DMA2D->L[DMA2D_LAYER_OUT].MAR = (uint32_t)dest_buf;
+        DMA2D->L[DMA2D_LAYER_OUT].OR = dest_stride - dest_w;
+
+        DMA2D->NLR = ((dest_w - 1) << DMA2D_NLR_NPIXEL_Pos) | ((dest_h - 1) << DMA2D_NLR_NLINE_Pos);
+
+        /*start transfer*/
+        DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
+        DMA2D->CR |= (0 << DMA2D_CR_MODE_Pos) |
+                     (1 << DMA2D_CR_START_Pos);
+#else
+        lv_color_t temp_buf[1024];
+        for(uint32_t y = 0; y < dest_h; y++) {
+            memcpy(temp_buf, &src_buf[y * src_stride], dest_w * sizeof(lv_color_t));
+            memcpy(&dest_buf[y * dest_stride], temp_buf, dest_w * sizeof(lv_color_t));
+        }
+#endif
+    }
+    else {
+        DMA2D->L[DMA2D_LAYER_FG].MAR = (uint32_t)src_buf;
+        DMA2D->L[DMA2D_LAYER_FG].OR = src_stride - dest_w;
+        DMA2D->L[DMA2D_LAYER_FG].PFCCR = (LV_DMA2D_COLOR_FORMAT << DMA2D_PFCCR_CFMT_Pos)
+                                         /*alpha mode 2, replace with foreground * alpha value*/
+                                         | (2 << DAM2D_PFCCR_AMODE_Pos)
+                                         /*alpha value*/
+                                         | (opa << DMA2D_PFCCR_ALPHA_Pos);
+
+        DMA2D->L[DMA2D_LAYER_BG].MAR = (uint32_t)dest_buf;
+        DMA2D->L[DMA2D_LAYER_BG].OR = dest_stride - dest_w;
+        DMA2D->L[DMA2D_LAYER_BG].PFCCR = (LV_DMA2D_COLOR_FORMAT << DMA2D_PFCCR_CFMT_Pos);
+
+        DMA2D->L[DMA2D_LAYER_OUT].MAR = (uint32_t)dest_buf;
+        DMA2D->L[DMA2D_LAYER_OUT].OR = dest_stride - dest_w;
+
+        DMA2D->NLR = ((dest_w - 1) << DMA2D_NLR_NPIXEL_Pos) | ((dest_h - 1) << DMA2D_NLR_NLINE_Pos);
+
+        /*start transfer*/
+        DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
+        DMA2D->CR |= (2 << DMA2D_CR_MODE_Pos) |
+                     (1 << DMA2D_CR_START_Pos);
+    }
+}
+
+void lv_gpu_swm341_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx)
+{
+    lv_disp_t * disp = _lv_refr_get_disp_refreshing();
+    if(disp->driver && disp->driver->wait_cb) {
+        while(DMA2D->CR & DMA2D_CR_START_Msk) {
+            disp->driver->wait_cb(disp->driver);
+        }
+    }
+    else {
+        while(DMA2D->CR & DMA2D_CR_START_Msk);
+    }
+    lv_draw_sw_wait_for_finish(draw_ctx);
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h
new file mode 100644 (file)
index 0000000..20b8922
--- /dev/null
@@ -0,0 +1,64 @@
+/**
+ * @file lv_gpu_swm341_dma2d.h
+ *
+ */
+
+#ifndef LV_GPU_SWM341_DMA2D_H
+#define LV_GPU_SWM341_DMA2D_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../../misc/lv_color.h"
+#include "../../hal/lv_hal_disp.h"
+#include "../sw/lv_draw_sw.h"
+
+#if LV_USE_GPU_SWM341_DMA2D
+
+/*********************
+ *      DEFINES
+ *********************/
+
+#define LV_SWM341_DMA2D_ARGB8888 0
+#define LV_SWM341_DMA2D_RGB888 1
+#define LV_SWM341_DMA2D_RGB565 2
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+typedef lv_draw_sw_ctx_t lv_draw_swm341_dma2d_ctx_t;
+
+struct _lv_disp_drv_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Turn on the peripheral and set output color mode, this only needs to be done once
+ */
+void lv_draw_swm341_dma2d_init(void);
+
+void lv_draw_swm341_dma2d_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
+
+void lv_draw_swm341_dma2d_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
+
+void lv_draw_swm341_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc);
+
+void lv_gpu_swm341_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#endif  /*LV_USE_GPU_SWM341_DMA2D*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_GPU_SWM341_DMA2D_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/lv_extra.mk b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/lv_extra.mk
new file mode 100644 (file)
index 0000000..1afcc7b
--- /dev/null
@@ -0,0 +1 @@
+CSRCS += $(shell find -L $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/extra -name \*.c)
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/fragment/README.md b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/fragment/README.md
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/fragment/lv_fragment.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/fragment/lv_fragment.c
new file mode 100644 (file)
index 0000000..a2cdfad
--- /dev/null
@@ -0,0 +1,144 @@
+/**
+ * @file lv_fragment.c
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "lv_fragment.h"
+
+#if LV_USE_FRAGMENT
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+static void cb_delete_assertion(lv_event_t * event);
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+lv_fragment_t * lv_fragment_create(const lv_fragment_class_t * cls, void * args)
+{
+    LV_ASSERT_NULL(cls);
+    LV_ASSERT_NULL(cls->create_obj_cb);
+    LV_ASSERT(cls->instance_size > 0);
+    lv_fragment_t * instance = lv_mem_alloc(cls->instance_size);
+    lv_memset_00(instance, cls->instance_size);
+    instance->cls = cls;
+    instance->child_manager = lv_fragment_manager_create(instance);
+    if(cls->constructor_cb) {
+        cls->constructor_cb(instance, args);
+    }
+    return instance;
+}
+
+void lv_fragment_del(lv_fragment_t * fragment)
+{
+    LV_ASSERT_NULL(fragment);
+    if(fragment->managed) {
+        lv_fragment_manager_remove(fragment->managed->manager, fragment);
+        return;
+    }
+    if(fragment->obj) {
+        lv_fragment_del_obj(fragment);
+    }
+    /* Objects will leak if this function called before objects deleted */
+    const lv_fragment_class_t * cls = fragment->cls;
+    if(cls->destructor_cb) {
+        cls->destructor_cb(fragment);
+    }
+    lv_fragment_manager_del(fragment->child_manager);
+    lv_mem_free(fragment);
+}
+
+lv_fragment_manager_t * lv_fragment_get_manager(lv_fragment_t * fragment)
+{
+    LV_ASSERT_NULL(fragment);
+    LV_ASSERT_NULL(fragment->managed);
+    return fragment->managed->manager;
+}
+
+lv_obj_t * const * lv_fragment_get_container(lv_fragment_t * fragment)
+{
+    LV_ASSERT_NULL(fragment);
+    LV_ASSERT_NULL(fragment->managed);
+    return fragment->managed->container;
+}
+
+lv_fragment_t * lv_fragment_get_parent(lv_fragment_t * fragment)
+{
+    LV_ASSERT_NULL(fragment);
+    LV_ASSERT_NULL(fragment->managed);
+    return lv_fragment_manager_get_parent_fragment(fragment->managed->manager);
+}
+
+lv_obj_t * lv_fragment_create_obj(lv_fragment_t * fragment, lv_obj_t * container)
+{
+    lv_fragment_managed_states_t * states = fragment->managed;
+    if(states) {
+        states->destroying_obj = false;
+    }
+    const lv_fragment_class_t * cls = fragment->cls;
+    lv_obj_t * obj = cls->create_obj_cb(fragment, container);
+    LV_ASSERT_NULL(obj);
+    fragment->obj = obj;
+    lv_fragment_manager_create_obj(fragment->child_manager);
+    if(states) {
+        states->obj_created = true;
+        lv_obj_add_event_cb(obj, cb_delete_assertion, LV_EVENT_DELETE, NULL);
+    }
+    if(cls->obj_created_cb) {
+        cls->obj_created_cb(fragment, obj);
+    }
+    return obj;
+}
+
+void lv_fragment_del_obj(lv_fragment_t * fragment)
+{
+    LV_ASSERT_NULL(fragment);
+    lv_fragment_manager_del_obj(fragment->child_manager);
+    lv_fragment_managed_states_t * states = fragment->managed;
+    if(states) {
+        if(!states->obj_created) return;
+        states->destroying_obj = true;
+        bool cb_removed = lv_obj_remove_event_cb(fragment->obj, cb_delete_assertion);
+        LV_ASSERT(cb_removed);
+    }
+    LV_ASSERT_NULL(fragment->obj);
+    const lv_fragment_class_t * cls = fragment->cls;
+    if(cls->obj_will_delete_cb) {
+        cls->obj_will_delete_cb(fragment, fragment->obj);
+    }
+    lv_obj_del(fragment->obj);
+    if(cls->obj_deleted_cb) {
+        cls->obj_deleted_cb(fragment, fragment->obj);
+    }
+    if(states) {
+        states->obj_created = false;
+    }
+    fragment->obj = NULL;
+}
+
+void lv_fragment_recreate_obj(lv_fragment_t * fragment)
+{
+    LV_ASSERT_NULL(fragment);
+    LV_ASSERT_NULL(fragment->managed);
+    lv_fragment_del_obj(fragment);
+    lv_fragment_create_obj(fragment, *fragment->managed->container);
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+static void cb_delete_assertion(lv_event_t * event)
+{
+    LV_UNUSED(event);
+    LV_ASSERT_MSG(0, "Please delete objects with lv_fragment_destroy_obj");
+}
+
+#endif /*LV_USE_FRAGMENT*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/fragment/lv_fragment.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/fragment/lv_fragment.h
new file mode 100644 (file)
index 0000000..da30b39
--- /dev/null
@@ -0,0 +1,339 @@
+/**
+ * Public header for Fragment
+ * @file lv_fragment.h
+ */
+
+#ifndef LV_FRAGMENT_H
+#define LV_FRAGMENT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../../../lv_conf_internal.h"
+
+#if LV_USE_FRAGMENT
+
+#include "../../../core/lv_obj.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+typedef struct _lv_fragment_manager_t lv_fragment_manager_t;
+
+typedef struct _lv_fragment_t lv_fragment_t;
+typedef struct _lv_fragment_class_t lv_fragment_class_t;
+typedef struct _lv_fragment_managed_states_t lv_fragment_managed_states_t;
+
+struct _lv_fragment_t {
+    /**
+     * Class of this fragment
+     */
+    const lv_fragment_class_t * cls;
+    /**
+     * Managed fragment states. If not null, then this fragment is managed.
+     *
+     * @warning Don't modify values inside this struct!
+     */
+    lv_fragment_managed_states_t * managed;
+    /**
+     * Child fragment manager
+     */
+    lv_fragment_manager_t * child_manager;
+    /**
+     * lv_obj returned by create_obj_cb
+     */
+    lv_obj_t * obj;
+
+};
+
+struct _lv_fragment_class_t {
+    /**
+     * Constructor function for fragment class
+     * @param self Fragment instance
+     * @param args Arguments assigned by fragment manager
+     */
+    void (*constructor_cb)(lv_fragment_t * self, void * args);
+
+    /**
+     * Destructor function for fragment class
+     * @param self Fragment instance, will be freed after this call
+     */
+    void (*destructor_cb)(lv_fragment_t * self);
+
+    /**
+     * Fragment attached to manager
+     * @param self Fragment instance
+     */
+    void (*attached_cb)(lv_fragment_t * self);
+
+    /**
+     * Fragment detached from manager
+     * @param self Fragment instance
+     */
+    void (*detached_cb)(lv_fragment_t * self);
+
+    /**
+     * Create objects
+     * @param self Fragment instance
+     * @param container Container of the objects should be created upon
+     * @return Created object, NULL if multiple objects has been created
+     */
+    lv_obj_t * (*create_obj_cb)(lv_fragment_t * self, lv_obj_t * container);
+
+    /**
+     *
+     * @param self Fragment instance
+     * @param obj lv_obj returned by create_obj_cb
+     */
+    void (*obj_created_cb)(lv_fragment_t * self, lv_obj_t * obj);
+
+    /**
+     * Called before objects in the fragment will be deleted.
+     *
+     * @param self Fragment instance
+     * @param obj object with this fragment
+     */
+    void (*obj_will_delete_cb)(lv_fragment_t * self, lv_obj_t * obj);
+
+    /**
+     * Called when the object created by fragment received `LV_EVENT_DELETE` event
+     * @param self Fragment instance
+     * @param obj object with this fragment
+     */
+    void (*obj_deleted_cb)(lv_fragment_t * self, lv_obj_t * obj);
+
+    /**
+     * Handle event
+     * @param self Fragment instance
+     * @param which User-defined ID of event
+     * @param data1 User-defined data
+     * @param data2 User-defined data
+     */
+    bool (*event_cb)(lv_fragment_t * self, int code, void * userdata);
+
+    /**
+     * *REQUIRED*: Allocation size of fragment
+     */
+    size_t instance_size;
+};
+
+/**
+ * Fragment states
+ */
+typedef struct _lv_fragment_managed_states_t  {
+    /**
+     * Class of the fragment
+     */
+    const lv_fragment_class_t * cls;
+    /**
+     * Manager the fragment attached to
+     */
+    lv_fragment_manager_t * manager;
+    /**
+     * Container object the fragment adding view to
+     */
+    lv_obj_t * const * container;
+    /**
+     * Fragment instance
+     */
+    lv_fragment_t * instance;
+    /**
+     * true between `create_obj_cb` and `obj_deleted_cb`
+     */
+    bool obj_created;
+    /**
+     * true before `lv_fragment_del_obj` is called. Don't touch any object if this is true
+     */
+    bool destroying_obj;
+    /**
+     * true if this fragment is in navigation stack that can be popped
+     */
+    bool in_stack;
+} lv_fragment_managed_states_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Create fragment manager instance
+ * @param parent Parent fragment if this manager is placed inside another fragment, can be null.
+ * @return Fragment manager instance
+ */
+lv_fragment_manager_t * lv_fragment_manager_create(lv_fragment_t * parent);
+
+/**
+ * Destroy fragment manager instance
+ * @param manager Fragment manager instance
+ */
+void lv_fragment_manager_del(lv_fragment_manager_t * manager);
+
+/**
+ * Create object of all fragments managed by this manager.
+ * @param manager Fragment manager instance
+ */
+void lv_fragment_manager_create_obj(lv_fragment_manager_t * manager);
+
+/**
+ * Delete object created by all fragments managed by this manager. Instance of fragments will not be deleted.
+ * @param manager Fragment manager instance
+ */
+void lv_fragment_manager_del_obj(lv_fragment_manager_t * manager);
+
+/**
+ * Attach fragment to manager, and add to container.
+ * @param manager Fragment manager instance
+ * @param fragment Fragment instance
+ * @param container Pointer to container object for manager to add objects to
+ */
+void lv_fragment_manager_add(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container);
+
+/**
+ * Detach and destroy fragment. If fragment is in navigation stack, remove from it.
+ * @param manager Fragment manager instance
+ * @param fragment Fragment instance
+ */
+void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * fragment);
+
+/**
+ * Attach fragment to manager and add to navigation stack.
+ * @param manager Fragment manager instance
+ * @param fragment Fragment instance
+ * @param container Pointer to container object for manager to add objects to
+ */
+void lv_fragment_manager_push(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container);
+
+/**
+ * Remove the top-most fragment for stack
+ * @param manager Fragment manager instance
+ * @return true if there is fragment to pop
+ */
+bool lv_fragment_manager_pop(lv_fragment_manager_t * manager);
+
+/**
+ * Replace fragment. Old item in the stack will be removed.
+ * @param manager Fragment manager instance
+ * @param fragment Fragment instance
+ * @param container Pointer to container object for manager to add objects to
+ */
+void lv_fragment_manager_replace(lv_fragment_manager_t * manager, lv_fragment_t * fragment,
+                                 lv_obj_t * const * container);
+
+/**
+ * Send event to top-most fragment
+ * @param manager Fragment manager instance
+ * @param code User-defined ID of event
+ * @param userdata User-defined data
+ * @return true if fragment returned true
+ */
+bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, void * userdata);
+
+/**
+ * Get stack size of this fragment manager
+ * @param manager Fragment manager instance
+ * @return Stack size of this fragment manager
+ */
+size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager);
+
+/**
+ * Get top most fragment instance
+ * @param manager Fragment manager instance
+ * @return Top most fragment instance
+ */
+lv_fragment_t * lv_fragment_manager_get_top(lv_fragment_manager_t * manager);
+
+/**
+ * Find first fragment instance in the container
+ * @param manager Fragment manager instance
+ * @param container Container which target fragment added to
+ * @return First fragment instance in the container
+ */
+lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * manager, const lv_obj_t * container);
+
+/**
+ * Get parent fragment
+ * @param manager Fragment manager instance
+ * @return Parent fragment instance
+ */
+lv_fragment_t * lv_fragment_manager_get_parent_fragment(lv_fragment_manager_t * manager);
+
+
+/**
+ * Create a fragment instance.
+ *
+ * @param cls Fragment class. This fragment must return non null object.
+ * @param args Arguments assigned by fragment manager
+ * @return Fragment instance
+ */
+lv_fragment_t * lv_fragment_create(const lv_fragment_class_t * cls, void * args);
+
+/**
+ * Destroy a fragment.
+ * @param fragment Fragment instance.
+ */
+void lv_fragment_del(lv_fragment_t * fragment);
+
+/**
+ * Get associated manager of this fragment
+ * @param fragment Fragment instance
+ * @return Fragment manager instance
+ */
+lv_fragment_manager_t * lv_fragment_get_manager(lv_fragment_t * fragment);
+
+/**
+ * Get container object of this fragment
+ * @param fragment Fragment instance
+ * @return Reference to container object
+ */
+lv_obj_t * const * lv_fragment_get_container(lv_fragment_t * fragment);
+
+/**
+ * Get parent fragment of this fragment
+ * @param fragment Fragment instance
+ * @return Parent fragment
+ */
+lv_fragment_t * lv_fragment_get_parent(lv_fragment_t * fragment);
+
+/**
+ * Create object by fragment.
+ *
+ * @param fragment Fragment instance.
+ * @param container Container of the objects should be created upon.
+ * @return Created object
+ */
+lv_obj_t * lv_fragment_create_obj(lv_fragment_t * fragment, lv_obj_t * container);
+
+/**
+ * Delete created object of a fragment
+ *
+ * @param fragment Fragment instance.
+ */
+void lv_fragment_del_obj(lv_fragment_t * fragment);
+
+/**
+ * Destroy obj in fragment, and recreate them.
+ * @param fragment Fragment instance
+ */
+void lv_fragment_recreate_obj(lv_fragment_t * fragment);
+
+
+/**********************
+ *      MACROS
+ **********************/
+
+#endif /*LV_USE_FRAGMENT*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_FRAGMENT_H*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/fragment/lv_fragment_manager.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/fragment/lv_fragment_manager.c
new file mode 100644 (file)
index 0000000..ade7215
--- /dev/null
@@ -0,0 +1,281 @@
+/**
+ * @file lv_fragment_manager.c
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+
+#include "lv_fragment.h"
+
+#if LV_USE_FRAGMENT
+
+#include "../../../misc/lv_ll.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+typedef struct _lv_fragment_stack_item_t {
+    lv_fragment_managed_states_t * states;
+} lv_fragment_stack_item_t;
+
+struct _lv_fragment_manager_t {
+    lv_fragment_t * parent;
+    /**
+     * Linked list to store attached fragments
+     */
+    lv_ll_t attached;
+    /**
+     * Linked list to store fragments in stack
+     */
+    lv_ll_t stack;
+};
+
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+static void item_create_obj(lv_fragment_managed_states_t * item);
+
+static void item_del_obj(lv_fragment_managed_states_t * item);
+
+static void item_del_fragment(lv_fragment_managed_states_t * item);
+
+static lv_fragment_managed_states_t * fragment_attach(lv_fragment_manager_t * manager, lv_fragment_t * fragment,
+                                                      lv_obj_t * const * container);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+lv_fragment_manager_t * lv_fragment_manager_create(lv_fragment_t * parent)
+{
+    lv_fragment_manager_t * instance = lv_mem_alloc(sizeof(lv_fragment_manager_t));
+    lv_memset_00(instance, sizeof(lv_fragment_manager_t));
+    instance->parent = parent;
+    _lv_ll_init(&instance->attached, sizeof(lv_fragment_managed_states_t));
+    _lv_ll_init(&instance->stack, sizeof(lv_fragment_stack_item_t));
+    return instance;
+}
+
+void lv_fragment_manager_del(lv_fragment_manager_t * manager)
+{
+    LV_ASSERT_NULL(manager);
+    lv_fragment_managed_states_t * states;
+    _LV_LL_READ_BACK(&manager->attached, states) {
+        item_del_obj(states);
+        item_del_fragment(states);
+    }
+    _lv_ll_clear(&manager->attached);
+    _lv_ll_clear(&manager->stack);
+    lv_mem_free(manager);
+}
+
+void lv_fragment_manager_create_obj(lv_fragment_manager_t * manager)
+{
+    LV_ASSERT_NULL(manager);
+    lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack);
+    lv_fragment_managed_states_t * states = NULL;
+    _LV_LL_READ(&manager->attached, states) {
+        if(states->in_stack && top->states != states) {
+            /*Only create obj for top item in stack*/
+            continue;
+        }
+        item_create_obj(states);
+    }
+}
+
+void lv_fragment_manager_del_obj(lv_fragment_manager_t * manager)
+{
+    LV_ASSERT_NULL(manager);
+    lv_fragment_managed_states_t * states = NULL;
+    _LV_LL_READ_BACK(&manager->attached, states) {
+        item_del_obj(states);
+    }
+}
+
+void lv_fragment_manager_add(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container)
+{
+    lv_fragment_managed_states_t * states = fragment_attach(manager, fragment, container);
+    if(!manager->parent || manager->parent->managed->obj_created) {
+        item_create_obj(states);
+    }
+}
+
+void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * fragment)
+{
+    LV_ASSERT_NULL(manager);
+    LV_ASSERT_NULL(fragment);
+    LV_ASSERT_NULL(fragment->managed);
+    LV_ASSERT(fragment->managed->manager == manager);
+    lv_fragment_managed_states_t * states = fragment->managed;
+    lv_fragment_managed_states_t * prev = NULL;
+    bool was_top = false;
+    if(states->in_stack) {
+        void * stack_top = _lv_ll_get_tail(&manager->stack);
+        lv_fragment_stack_item_t * item = NULL;
+        _LV_LL_READ_BACK(&manager->stack, item) {
+            if(item->states == states) {
+                was_top = stack_top == item;
+                void * stack_prev = _lv_ll_get_prev(&manager->stack, item);
+                if(!stack_prev) break;
+                prev = ((lv_fragment_stack_item_t *) stack_prev)->states;
+                break;
+            }
+        }
+        if(item) {
+            _lv_ll_remove(&manager->stack, item);
+            lv_mem_free(item);
+        }
+    }
+    item_del_obj(states);
+    item_del_fragment(states);
+    _lv_ll_remove(&manager->attached, states);
+    lv_mem_free(states);
+    if(prev && was_top) {
+        item_create_obj(prev);
+    }
+}
+
+void lv_fragment_manager_push(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container)
+{
+    lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack);
+    if(top != NULL) {
+        item_del_obj(top->states);
+    }
+    lv_fragment_managed_states_t * states = fragment_attach(manager, fragment, container);
+    states->in_stack = true;
+    /*Add fragment to the top of the stack*/
+    lv_fragment_stack_item_t * item = _lv_ll_ins_tail(&manager->stack);
+    lv_memset_00(item, sizeof(lv_fragment_stack_item_t));
+    item->states = states;
+    item_create_obj(states);
+}
+
+bool lv_fragment_manager_pop(lv_fragment_manager_t * manager)
+{
+    lv_fragment_t * top = lv_fragment_manager_get_top(manager);
+    if(top == NULL) return false;
+    lv_fragment_manager_remove(manager, top);
+    return true;
+}
+
+void lv_fragment_manager_replace(lv_fragment_manager_t * manager, lv_fragment_t * fragment,
+                                 lv_obj_t * const * container)
+{
+    lv_fragment_t * top = lv_fragment_manager_find_by_container(manager, *container);
+    if(top != NULL) {
+        lv_fragment_manager_remove(manager, top);
+    }
+    lv_fragment_manager_add(manager, fragment, container);
+}
+
+bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, void * userdata)
+{
+    LV_ASSERT_NULL(manager);
+    lv_fragment_managed_states_t * p = NULL;
+    _LV_LL_READ_BACK(&manager->attached, p) {
+        if(!p->obj_created || p->destroying_obj) continue;
+        lv_fragment_t * instance = p->instance;
+        if(!instance) continue;
+        if(lv_fragment_manager_send_event(instance->child_manager, code, userdata)) return true;
+        if(p->cls->event_cb && p->cls->event_cb(instance, code, userdata)) return true;
+    }
+    return false;
+}
+
+size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager)
+{
+    LV_ASSERT_NULL(manager);
+    return _lv_ll_get_len(&manager->stack);
+}
+
+lv_fragment_t * lv_fragment_manager_get_top(lv_fragment_manager_t * manager)
+{
+    LV_ASSERT(manager);
+    lv_fragment_stack_item_t * top = _lv_ll_get_tail(&manager->stack);
+    if(!top)return NULL;
+    return top->states->instance;
+}
+
+lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * manager, const lv_obj_t * container)
+{
+    LV_ASSERT(manager);
+    lv_fragment_managed_states_t * states;
+    _LV_LL_READ(&manager->attached, states) {
+        if(*states->container == container) return states->instance;
+    }
+    return NULL;
+}
+
+lv_fragment_t * lv_fragment_manager_get_parent_fragment(lv_fragment_manager_t * manager)
+{
+    LV_ASSERT_NULL(manager);
+    return manager->parent;
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+static void item_create_obj(lv_fragment_managed_states_t * item)
+{
+    LV_ASSERT(item->instance);
+    lv_fragment_create_obj(item->instance, item->container ? *item->container : NULL);
+}
+
+static void item_del_obj(lv_fragment_managed_states_t * item)
+{
+    lv_fragment_del_obj(item->instance);
+}
+
+/**
+ * Detach, then destroy fragment
+ * @param item fragment states
+ */
+static void item_del_fragment(lv_fragment_managed_states_t * item)
+{
+    lv_fragment_t * instance = item->instance;
+    if(instance->cls->detached_cb) {
+        instance->cls->detached_cb(instance);
+    }
+    instance->managed = NULL;
+    lv_fragment_del(instance);
+    item->instance = NULL;
+}
+
+
+static lv_fragment_managed_states_t * fragment_attach(lv_fragment_manager_t * manager, lv_fragment_t * fragment,
+                                                      lv_obj_t * const * container)
+{
+    LV_ASSERT(manager);
+    LV_ASSERT(fragment);
+    LV_ASSERT(fragment->managed == NULL);
+    lv_fragment_managed_states_t * states = _lv_ll_ins_tail(&manager->attached);
+    lv_memset_00(states, sizeof(lv_fragment_managed_states_t));
+    states->cls = fragment->cls;
+    states->manager = manager;
+    states->container = container;
+    states->instance = fragment;
+    fragment->managed = states;
+    if(fragment->cls->attached_cb) {
+        fragment->cls->attached_cb(fragment);
+    }
+    return states;
+}
+
+#endif /*LV_USE_FRAGMENT*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/ime/lv_ime_pinyin.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/ime/lv_ime_pinyin.c
new file mode 100644 (file)
index 0000000..b1661e4
--- /dev/null
@@ -0,0 +1,1198 @@
+/**
+ * @file lv_ime_pinyin.c
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "lv_ime_pinyin.h"
+#if LV_USE_IME_PINYIN != 0
+
+#include <stdio.h>
+
+/*********************
+ *      DEFINES
+ *********************/
+#define MY_CLASS    &lv_ime_pinyin_class
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
+static void lv_ime_pinyin_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
+static void lv_ime_pinyin_style_change_event(lv_event_t * e);
+static void lv_ime_pinyin_kb_event(lv_event_t * e);
+static void lv_ime_pinyin_cand_panel_event(lv_event_t * e);
+
+static void init_pinyin_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict);
+static void pinyin_input_proc(lv_obj_t * obj);
+static void pinyin_page_proc(lv_obj_t * obj, uint16_t btn);
+static char * pinyin_search_matching(lv_obj_t * obj, char * py_str, uint16_t * cand_num);
+static void pinyin_ime_clear_data(lv_obj_t * obj);
+
+#if LV_IME_PINYIN_USE_K9_MODE
+    static void pinyin_k9_init_data(lv_obj_t * obj);
+    static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char * py9_map[]);
+    static bool pinyin_k9_is_valid_py(lv_obj_t * obj, char * py_str);
+    static void pinyin_k9_fill_cand(lv_obj_t * obj);
+    static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir);
+#endif
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+const lv_obj_class_t lv_ime_pinyin_class = {
+    .constructor_cb = lv_ime_pinyin_constructor,
+    .destructor_cb  = lv_ime_pinyin_destructor,
+    .width_def      = LV_SIZE_CONTENT,
+    .height_def     = LV_SIZE_CONTENT,
+    .group_def      = LV_OBJ_CLASS_GROUP_DEF_TRUE,
+    .instance_size  = sizeof(lv_ime_pinyin_t),
+    .base_class     = &lv_obj_class
+};
+
+#if LV_IME_PINYIN_USE_K9_MODE
+static char * lv_btnm_def_pinyin_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 20] = {\
+                                                                                ",\0", "1#\0",  "abc \0", "def\0",  LV_SYMBOL_BACKSPACE"\0", "\n\0",
+                                                                                ".\0", "ghi\0", "jkl\0", "mno\0",  LV_SYMBOL_KEYBOARD"\0", "\n\0",
+                                                                                "?\0", "pqrs\0", "tuv\0", "wxyz\0",  LV_SYMBOL_NEW_LINE"\0", "\n\0",
+                                                                                LV_SYMBOL_LEFT"\0", "\0"
+                                                                               };
+
+static lv_btnmatrix_ctrl_t default_kb_ctrl_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 16] = { 1 };
+static char   lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 2][LV_IME_PINYIN_K9_MAX_INPUT] = {0};
+#endif
+
+static char   lv_pinyin_cand_str[LV_IME_PINYIN_CAND_TEXT_NUM][4];
+static char * lv_btnm_def_pinyin_sel_map[LV_IME_PINYIN_CAND_TEXT_NUM + 3];
+
+#if LV_IME_PINYIN_USE_DEFAULT_DICT
+lv_pinyin_dict_t lv_ime_pinyin_def_dict[] = {
+    { "a", "啊" },
+    { "ai", "愛" },
+    { "an", "安暗案" },
+    { "ba", "吧把爸八" },
+    { "bai", "百白敗" },
+    { "ban", "半般辦" },
+    { "bang", "旁" },
+    { "bao", "保薄包報" },
+    { "bei", "被背悲北杯備" },
+    { "ben", "本" },
+    { "bi", "必比避鼻彼筆秘閉" },
+    { "bian", "便邊變変辺" },
+    { "biao", "表標" },
+    { "bie", "別" },
+    { "bing", "病並氷" },
+    { "bo", "波薄泊" },
+    { "bu", "不布步部捕補歩" },
+    { "ca", "察" },
+    { "cai", "才材菜財採" },
+    { "can", "参残參" },
+    { "ce", "策側" },
+    { "ceng", "曾" },
+    { "cha", "差查茶" },
+    { "chai", "差" },
+    { "chan", "產産單" },
+    { "chang", "場廠" },
+    { "chao", "超朝" },
+    { "che", "車" },
+    { "cheng", "成程乗" },
+    { "chi", "尺吃持赤池遅歯" },
+    { "chong", "充种重種" },
+    { "chu", "出初楚触處処" },
+    { "chuan", "川船傳" },
+    { "chuang", "創窓" },
+    { "chun", "春" },
+    { "ci", "此次辞差" },
+    { "cong", "從従" },
+    { "cu", "卒" },
+    { "cun", "存村" },
+    { "cuo", "錯" },
+    { "da", "大打答達" },
+    { "dai", "代待帯帶貸" },
+    { "dan", "但担擔誕單単" },
+    { "dang", "当党當黨" },
+    { "dao", "到道盗導島辺" },
+    { "de", "的得" },
+    { "dei", "" },
+    { "deng", "等" },
+    { "di", "地得低底弟第締" },
+    { "dian", "点电店點電" },
+    { "diao", "調" },
+    { "ding", "定町" },
+    { "dong", "冬東動働凍" },
+    { "du", "独度都渡読" },
+    { "duan", "段断短斷" },
+    { "dui", "對対" },
+    { "duo", "多駄" },
+    { "e", "嗯悪" },
+    { "en", "嗯" },
+    { "er", "而耳二兒" },
+    { "fa", "乏法發発髪" },
+    { "fan", "反返犯番仮販飯範払" },
+    { "fang", "方放房坊訪" },
+    { "fei", "非飛費" },
+    { "fen", "分份" },
+    { "feng", "風豐" },
+    { "fou", "否不" },
+    { "fu", "父夫富服符付附府幅婦復複負払" },
+    { "gai", "改概該" },
+    { "gan", "甘感敢" },
+    { "gang", "港剛" },
+    { "gao", "告高" },
+    { "ge", "各格歌革割個" },
+    { "gei", "給" },
+    { "gen", "跟根" },
+    { "geng", "更" },
+    { "gong", "工共供功公" },
+    { "gou", "夠構溝" },
+    { "gu", "古故鼓" },
+    { "guai", "掛" },
+    { "guan", "官管慣館觀関關" },
+    { "guang", "光広" },
+    { "gui", "規帰" },
+    { "guo", "果国裏菓國過" },
+    { "hai", "孩海害還" },
+    { "han", "寒漢" },
+    { "hang", "航行" },
+    { "hao", "好号" },
+    { "he", "合和喝何荷" },
+    { "hei", "黒" },
+    { "hen", "很" },
+    { "heng", "行横" },
+    { "hou", "厚喉候後" },
+    { "hu", "乎呼湖護" },
+    { "hua", "化画花話畫劃" },
+    { "huai", "壊劃" },
+    { "huan", "緩環歡還換" },
+    { "huang", "黄" },
+    { "hui", "回会慧絵揮會" },
+    { "hun", "混婚" },
+    { "huo", "活或火獲" },
+    { "i", "" },
+    { "ji", "己计及机既急季寄技即集基祭系奇紀積計記済幾際極繼績機濟" },
+    { "jia", "家加價" },
+    { "jian", "件建健肩見減間検簡漸" },
+    { "jiang", "降強講將港" },
+    { "jiao", "叫教交角覚覺較學" },
+    { "jie", "介借接姐皆届界解結階節價" },
+    { "jin", "今近禁金僅進" },
+    { "jing", "京境景静精經経" },
+    { "jiu", "就久九酒究" },
+    { "ju", "句具局居決挙據舉" },
+    { "jue", "角覚覺" },
+    { "jun", "均" },
+    { "kai", "開" },
+    { "kan", "看刊" },
+    { "kang", "康" },
+    { "kao", "考" },
+    { "ke", "可刻科克客渇課" },
+    { "ken", "肯" },
+    { "kong", "空控" },
+    { "kou", "口" },
+    { "ku", "苦庫" },
+    { "kuai", "快塊会會" },
+    { "kuang", "況" },
+    { "kun", "困" },
+    { "kuo", "括拡適" },
+    { "la", "拉啦落" },
+    { "lai", "来來頼" },
+    { "lao", "老絡落" },
+    { "le", "了楽樂" },
+    { "lei", "類" },
+    { "leng", "冷" },
+    { "li", "力立利理例礼離麗裡勵歷" },
+    { "lian", "連練臉聯" },
+    { "liang", "良量涼兩両" },
+    { "liao", "料" },
+    { "lie", "列" },
+    { "lin", "林隣賃" },
+    { "ling", "另令領" },
+    { "liu", "六留流" },
+    { "lu", "律路録緑陸履慮" },
+    { "lv", "旅" },
+    { "lun", "輪論" },
+    { "luo", "落絡" },
+    { "ma", "媽嗎嘛" },
+    { "mai", "買売" },
+    { "man", "滿" },
+    { "mang", "忙" },
+    { "mao", "毛猫貿" },
+    { "me", "麼" },
+    { "mei", "美妹每沒毎媒" },
+    { "men", "們" },
+    { "mi", "米密秘" },
+    { "mian", "免面勉眠" },
+    { "miao", "描" },
+    { "min", "民皿" },
+    { "ming", "命明名" },
+    { "mo", "末模麼" },
+    { "mou", "某" },
+    { "mu", "母木目模" },
+    { "na", "那哪拿內南" },
+    { "nan", "男南難" },
+    { "nao", "腦" },
+    { "ne", "那哪呢" },
+    { "nei", "内那哪內" },
+    { "neng", "能" },
+    { "ni", "你妳呢" },
+    { "nian", "年念" },
+    { "niang", "娘" },
+    { "nin", "您" },
+    { "ning", "凝" },
+    { "niu", "牛" },
+    { "nong", "農濃" },
+    { "nu", "女努" },
+    { "nuan", "暖" },
+    { "o", "" },
+    { "ou", "歐" },
+    { "pa", "怕" },
+    { "pian", "片便" },
+    { "pai", "迫派排" },
+    { "pan", "判番" },
+    { "pang", "旁" },
+    { "pei", "配" },
+    { "peng", "朋" },
+    { "pi", "疲否" },
+    { "pin", "品貧" },
+    { "ping", "平評" },
+    { "po", "迫破泊頗" },
+    { "pu", "普僕" },
+    { "qi", "起其奇七气期泣企妻契気" },
+    { "qian", "嵌浅千前鉛錢針" },
+    { "qiang", "強將" },
+    { "qiao", "橋繰" },
+    { "qie", "且切契" },
+    { "qin", "寝勤親" },
+    { "qing", "青清情晴輕頃請軽" },
+    { "qiu", "求秋球" },
+    { "qu", "去取趣曲區" },
+    { "quan", "全犬券" },
+    { "que", "缺確卻" },
+    { "ran", "然" },
+    { "rang", "讓" },
+    { "re", "熱" },
+    { "ren", "人任認" },
+    { "reng", "仍" },
+    { "ri", "日" },
+    { "rong", "容" },
+    { "rou", "弱若肉" },
+    { "ru", "如入" },
+    { "ruan", "軟" },
+    { "sai", "賽" },
+    { "san", "三" },
+    { "sao", "騒繰" },
+    { "se", "色" },
+    { "sen", "森" },
+    { "sha", "砂" },
+    { "shan", "善山單" },
+    { "shang", "上尚商" },
+    { "shao", "少紹" },
+    { "shaung", "雙" },
+    { "she", "社射設捨渉" },
+    { "shei", "誰" },
+    { "shen", "什申深甚身伸沈神" },
+    { "sheng", "生声昇勝乗聲" },
+    { "shi", "是失示食时事式十石施使世实史室市始柿氏士仕拭時視師試適実實識" },
+    { "shou", "手首守受授" },
+    { "shu", "束数暑殊樹書屬輸術" },
+    { "shui", "水説說誰" },
+    { "shuo", "数説說" },
+    { "si", "思寺司四私似死価" },
+    { "song", "送" },
+    { "su", "速宿素蘇訴" },
+    { "suan", "算酸" },
+    { "sui", "隨雖歲歳" },
+    { "sun", "孫" },
+    { "suo", "所" },
+    { "ta", "她他它牠" },
+    { "tai", "太台態臺" },
+    { "tan", "探談曇" },
+    { "tang", "糖" },
+    { "tao", "桃逃套討" },
+    { "te", "特" },
+    { "ti", "体提替題體戻" },
+    { "tian", "天田" },
+    { "tiao", "条條調" },
+    { "tie", "鉄" },
+    { "ting", "停庭聽町" },
+    { "tong", "同童通痛统統" },
+    { "tou", "投透頭" },
+    { "tu", "土徒茶図" },
+    { "tuan", "團" },
+    { "tui", "推退" },
+    { "tuo", "脱駄" },
+    { "u", "" },
+    { "v", "" },
+    { "wai", "外" },
+    { "wan", "完万玩晩腕灣" },
+    { "wang", "忘望亡往網" },
+    { "wei", "危位未味委為謂維違圍" },
+    { "wen", "文温問聞" },
+    { "wo", "我" },
+    { "wu", "午物五無屋亡鳥務汚" },
+    { "xi", "夕息西洗喜系昔席希析嬉膝細習係" },
+    { "xia", "下夏狭暇" },
+    { "xian", "先限嫌洗現見線顯" },
+    { "xiang", "向相香像想象降項詳響" },
+    { "xiao", "小笑消效校削咲" },
+    { "xie", "写携些解邪械協謝寫契" },
+    { "xin", "心信新辛" },
+    { "xing", "行形性幸型星興" },
+    { "xiong", "兄胸" },
+    { "xiu", "休秀修" },
+    { "xu", "須需許續緒続" },
+    { "xuan", "選懸" },
+    { "xue", "学雪削靴學" },
+    { "xun", "訓訊" },
+    { "ya", "呀押壓" },
+    { "yan", "言顔研煙嚴厳験驗塩" },
+    { "yang", "央洋陽樣様" },
+    { "yao", "要揺腰薬曜" },
+    { "ye", "也野夜邪業葉" },
+    { "yi", "一已亦依以移意医易伊役異億義議藝醫訳" },
+    { "yin", "因引音飲銀" },
+    { "ying", "英迎影映應營営" },
+    { "yong", "永用泳擁" },
+    { "you", "又有右友由尤油遊郵誘優" },
+    { "yu", "予育余雨浴欲愈御宇域語於魚與込" },
+    { "yuan", "元原源院員円園遠猿願" },
+    { "yue", "月越約楽" },
+    { "yun", "雲伝運" },
+    { "za", "雑" },
+    { "zai", "在再載災" },
+    { "zang", "蔵" },
+    { "zao", "早造" },
+    { "ze", "則擇責" },
+    { "zen", "怎" },
+    { "zeng", "曾增増" },
+    { "zha", "札" },
+    { "zhai", "宅擇" },
+    { "zhan", "站展戰戦" },
+    { "zhang", "丈長障帳張" },
+    { "zhao", "找着朝招" },
+    { "zhe", "者這" },
+    { "zhen", "真震針" },
+    { "zheng", "正整争政爭" },
+    { "zhi", "之只知支止制至治直指值置智値紙製質誌織隻識職執" },
+    { "zhong", "中种終重種眾" },
+    { "zhou", "周州昼宙洲週" },
+    { "zhu", "助主住柱株祝逐注著諸屬術" },
+    { "zhuan", "专專転" },
+    { "zhuang", "状狀" },
+    { "zhui", "追" },
+    { "zhun", "準" },
+    { "zhuo", "着" },
+    { "zi", "子自字姉資" },
+    { "zong", "總" },
+    { "zuo", "左做昨坐座作" },
+    { "zu", "足祖族卒組" },
+    { "zui", "最酔" },
+    { "zou", "走" },
+    {NULL, NULL}
+};
+#endif
+
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+lv_obj_t * lv_ime_pinyin_create(lv_obj_t * parent)
+{
+    LV_LOG_INFO("begin");
+    lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
+    lv_obj_class_init_obj(obj);
+    return obj;
+}
+
+
+/*=====================
+ * Setter functions
+ *====================*/
+
+/**
+ * Set the keyboard of Pinyin input method.
+ * @param obj  pointer to a Pinyin input method object
+ * @param dict pointer to a Pinyin input method keyboard
+ */
+void lv_ime_pinyin_set_keyboard(lv_obj_t * obj, lv_obj_t * kb)
+{
+    if(kb) {
+        LV_ASSERT_OBJ(kb, &lv_keyboard_class);
+    }
+
+    LV_ASSERT_OBJ(obj, MY_CLASS);
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    pinyin_ime->kb = kb;
+    lv_obj_add_event_cb(pinyin_ime->kb, lv_ime_pinyin_kb_event, LV_EVENT_VALUE_CHANGED, obj);
+    lv_obj_align_to(pinyin_ime->cand_panel, pinyin_ime->kb, LV_ALIGN_OUT_TOP_MID, 0, 0);
+}
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj  pointer to a Pinyin input method object
+ * @param dict pointer to a Pinyin input method dictionary
+ */
+void lv_ime_pinyin_set_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict)
+{
+    LV_ASSERT_OBJ(obj, MY_CLASS);
+
+    init_pinyin_dict(obj, dict);
+}
+
+/**
+ * Set mode, 26-key input(k26) or 9-key input(k9).
+ * @param obj  pointer to a Pinyin input method object
+ * @param mode   the mode from 'lv_keyboard_mode_t'
+ */
+void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode)
+{
+    LV_ASSERT_OBJ(obj, MY_CLASS);
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    LV_ASSERT_OBJ(pinyin_ime->kb, &lv_keyboard_class);
+
+    pinyin_ime->mode = mode;
+
+#if LV_IME_PINYIN_USE_K9_MODE
+    if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) {
+        pinyin_k9_init_data(obj);
+        lv_keyboard_set_map(pinyin_ime->kb, LV_KEYBOARD_MODE_USER_1, (const char *)lv_btnm_def_pinyin_k9_map,
+                            (const)default_kb_ctrl_k9_map);
+        lv_keyboard_set_mode(pinyin_ime->kb, LV_KEYBOARD_MODE_USER_1);
+    }
+#endif
+}
+
+/*=====================
+ * Getter functions
+ *====================*/
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj  pointer to a Pinyin IME object
+ * @return     pointer to the Pinyin IME keyboard
+ */
+lv_obj_t * lv_ime_pinyin_get_kb(lv_obj_t * obj)
+{
+    LV_ASSERT_OBJ(obj, MY_CLASS);
+
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    return pinyin_ime->kb;
+}
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj  pointer to a Pinyin input method object
+ * @return     pointer to the Pinyin input method candidate panel
+ */
+lv_obj_t * lv_ime_pinyin_get_cand_panel(lv_obj_t * obj)
+{
+    LV_ASSERT_OBJ(obj, MY_CLASS);
+
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    return pinyin_ime->cand_panel;
+}
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj  pointer to a Pinyin input method object
+ * @return     pointer to the Pinyin input method dictionary
+ */
+lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj)
+{
+    LV_ASSERT_OBJ(obj, MY_CLASS);
+
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    return pinyin_ime->dict;
+}
+
+/*=====================
+ * Other functions
+ *====================*/
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
+{
+    LV_UNUSED(class_p);
+    LV_TRACE_OBJ_CREATE("begin");
+
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    uint16_t py_str_i = 0;
+    uint16_t btnm_i = 0;
+    for(btnm_i = 0; btnm_i < (LV_IME_PINYIN_CAND_TEXT_NUM + 3); btnm_i++) {
+        if(btnm_i == 0) {
+            lv_btnm_def_pinyin_sel_map[btnm_i] = "<";
+        }
+        else if(btnm_i == (LV_IME_PINYIN_CAND_TEXT_NUM + 1)) {
+            lv_btnm_def_pinyin_sel_map[btnm_i] = ">";
+        }
+        else if(btnm_i == (LV_IME_PINYIN_CAND_TEXT_NUM + 2)) {
+            lv_btnm_def_pinyin_sel_map[btnm_i] = "";
+        }
+        else {
+            lv_pinyin_cand_str[py_str_i][0] = ' ';
+            lv_btnm_def_pinyin_sel_map[btnm_i] = lv_pinyin_cand_str[py_str_i];
+            py_str_i++;
+        }
+    }
+
+    pinyin_ime->mode = LV_IME_PINYIN_MODE_K26;
+    pinyin_ime->py_page = 0;
+    pinyin_ime->ta_count = 0;
+    pinyin_ime->cand_num = 0;
+    lv_memset_00(pinyin_ime->input_char, sizeof(pinyin_ime->input_char));
+    lv_memset_00(pinyin_ime->py_num, sizeof(pinyin_ime->py_num));
+    lv_memset_00(pinyin_ime->py_pos, sizeof(pinyin_ime->py_pos));
+
+    lv_obj_set_size(obj, LV_PCT(100), LV_PCT(55));
+    lv_obj_align(obj, LV_ALIGN_BOTTOM_MID, 0, 0);
+
+#if LV_IME_PINYIN_USE_DEFAULT_DICT
+    init_pinyin_dict(obj, lv_ime_pinyin_def_dict);
+#endif
+
+    /* Init pinyin_ime->cand_panel */
+    pinyin_ime->cand_panel = lv_btnmatrix_create(lv_scr_act());
+    lv_btnmatrix_set_map(pinyin_ime->cand_panel, (const char **)lv_btnm_def_pinyin_sel_map);
+    lv_obj_set_size(pinyin_ime->cand_panel, LV_PCT(100), LV_PCT(5));
+    lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
+
+    lv_btnmatrix_set_one_checked(pinyin_ime->cand_panel, true);
+
+    /* Set cand_panel style*/
+    // Default style
+    lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_0, 0);
+    lv_obj_set_style_border_width(pinyin_ime->cand_panel, 0, 0);
+    lv_obj_set_style_pad_all(pinyin_ime->cand_panel, 8, 0);
+    lv_obj_set_style_pad_gap(pinyin_ime->cand_panel, 0, 0);
+    lv_obj_set_style_radius(pinyin_ime->cand_panel, 0, 0);
+    lv_obj_set_style_pad_gap(pinyin_ime->cand_panel, 0, 0);
+    lv_obj_set_style_base_dir(pinyin_ime->cand_panel, LV_BASE_DIR_LTR, 0);
+
+    // LV_PART_ITEMS style
+    lv_obj_set_style_radius(pinyin_ime->cand_panel, 12, LV_PART_ITEMS);
+    lv_obj_set_style_bg_color(pinyin_ime->cand_panel, lv_color_white(), LV_PART_ITEMS);
+    lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_0, LV_PART_ITEMS);
+    lv_obj_set_style_shadow_opa(pinyin_ime->cand_panel, LV_OPA_0, LV_PART_ITEMS);
+
+    // LV_PART_ITEMS | LV_STATE_PRESSED style
+    lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_COVER, LV_PART_ITEMS | LV_STATE_PRESSED);
+    lv_obj_set_style_bg_color(pinyin_ime->cand_panel, lv_color_white(), LV_PART_ITEMS | LV_STATE_PRESSED);
+
+    /* event handler */
+    lv_obj_add_event_cb(pinyin_ime->cand_panel, lv_ime_pinyin_cand_panel_event, LV_EVENT_VALUE_CHANGED, obj);
+    lv_obj_add_event_cb(obj, lv_ime_pinyin_style_change_event, LV_EVENT_STYLE_CHANGED, NULL);
+
+#if LV_IME_PINYIN_USE_K9_MODE
+    pinyin_ime->k9_input_str_len = 0;
+    pinyin_ime->k9_py_ll_pos = 0;
+    pinyin_ime->k9_legal_py_count = 0;
+    lv_memset_00(pinyin_ime->k9_input_str, LV_IME_PINYIN_K9_MAX_INPUT);
+
+    pinyin_k9_init_data(obj);
+
+    _lv_ll_init(&(pinyin_ime->k9_legal_py_ll), sizeof(ime_pinyin_k9_py_str_t));
+#endif
+}
+
+
+static void lv_ime_pinyin_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
+{
+    LV_UNUSED(class_p);
+
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    if(lv_obj_is_valid(pinyin_ime->kb))
+        lv_obj_del(pinyin_ime->kb);
+
+    if(lv_obj_is_valid(pinyin_ime->cand_panel))
+        lv_obj_del(pinyin_ime->cand_panel);
+}
+
+
+static void lv_ime_pinyin_kb_event(lv_event_t * e)
+{
+    lv_event_code_t code = lv_event_get_code(e);
+    lv_obj_t * kb = lv_event_get_target(e);
+    lv_obj_t * obj = lv_event_get_user_data(e);
+
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+#if LV_IME_PINYIN_USE_K9_MODE
+    static const char * k9_py_map[8] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
+#endif
+
+    if(code == LV_EVENT_VALUE_CHANGED) {
+        uint16_t btn_id  = lv_btnmatrix_get_selected_btn(kb);
+        if(btn_id == LV_BTNMATRIX_BTN_NONE) return;
+
+        const char * txt = lv_btnmatrix_get_btn_text(kb, lv_btnmatrix_get_selected_btn(kb));
+        if(txt == NULL) return;
+
+#if LV_IME_PINYIN_USE_K9_MODE
+        if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) {
+            lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb);
+            uint16_t tmp_btn_str_len = strlen(pinyin_ime->input_char);
+            if((btn_id >= 16) && (tmp_btn_str_len > 0) && (btn_id < (16 + LV_IME_PINYIN_K9_CAND_TEXT_NUM))) {
+                tmp_btn_str_len = strlen(pinyin_ime->input_char);
+                lv_memset_00(pinyin_ime->input_char, sizeof(pinyin_ime->input_char));
+                strcat(pinyin_ime->input_char, txt);
+                pinyin_input_proc(obj);
+
+                for(int index = 0; index < (pinyin_ime->ta_count + tmp_btn_str_len); index++) {
+                    lv_textarea_del_char(ta);
+                }
+
+                pinyin_ime->ta_count = tmp_btn_str_len;
+                pinyin_ime->k9_input_str_len = tmp_btn_str_len;
+                lv_textarea_add_text(ta, pinyin_ime->input_char);
+
+                return;
+            }
+        }
+#endif
+
+        if(strcmp(txt, "Enter") == 0 || strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) {
+            pinyin_ime_clear_data(obj);
+            lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
+        }
+        else if(strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) {
+            // del input char
+            if(pinyin_ime->ta_count > 0) {
+                if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26)
+                    pinyin_ime->input_char[pinyin_ime->ta_count - 1] = '\0';
+#if LV_IME_PINYIN_USE_K9_MODE
+                else
+                    pinyin_ime->k9_input_str[pinyin_ime->ta_count - 1] = '\0';
+#endif
+
+                pinyin_ime->ta_count = pinyin_ime->ta_count - 1;
+                if(pinyin_ime->ta_count <= 0) {
+                    lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
+#if LV_IME_PINYIN_USE_K9_MODE
+                    lv_memset_00(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str));
+                    strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0");
+                    strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0");
+#endif
+                }
+                else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) {
+                    pinyin_input_proc(obj);
+                }
+#if LV_IME_PINYIN_USE_K9_MODE
+                else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) {
+                    pinyin_ime->k9_input_str_len = strlen(pinyin_ime->input_char) - 1;
+                    pinyin_k9_get_legal_py(obj, pinyin_ime->k9_input_str, k9_py_map);
+                    pinyin_k9_fill_cand(obj);
+                    pinyin_input_proc(obj);
+                }
+#endif
+            }
+        }
+        else if((strcmp(txt, "ABC") == 0) || (strcmp(txt, "abc") == 0) || (strcmp(txt, "1#") == 0)) {
+            pinyin_ime->ta_count = 0;
+            lv_memset_00(pinyin_ime->input_char, sizeof(pinyin_ime->input_char));
+            return;
+        }
+        else if(strcmp(txt, LV_SYMBOL_KEYBOARD) == 0) {
+            if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) {
+                lv_ime_pinyin_set_mode(pinyin_ime, LV_IME_PINYIN_MODE_K9);
+            }
+            else {
+                lv_ime_pinyin_set_mode(pinyin_ime, LV_IME_PINYIN_MODE_K26);
+                lv_keyboard_set_mode(pinyin_ime->kb, LV_KEYBOARD_MODE_TEXT_LOWER);
+            }
+            pinyin_ime_clear_data(obj);
+        }
+        else if(strcmp(txt, LV_SYMBOL_OK) == 0) {
+            pinyin_ime_clear_data(obj);
+        }
+        else if((pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) && ((txt[0] >= 'a' && txt[0] <= 'z') || (txt[0] >= 'A' &&
+                                                                                                      txt[0] <= 'Z'))) {
+            strcat(pinyin_ime->input_char, txt);
+            pinyin_input_proc(obj);
+            pinyin_ime->ta_count++;
+        }
+#if LV_IME_PINYIN_USE_K9_MODE
+        else if((pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) && (txt[0] >= 'a' && txt[0] <= 'z')) {
+            for(uint16_t i = 0; i < 8; i++) {
+                if((strcmp(txt, k9_py_map[i]) == 0) || (strcmp(txt, "abc ") == 0)) {
+                    if(strcmp(txt, "abc ") == 0)    pinyin_ime->k9_input_str_len += strlen(k9_py_map[i]) + 1;
+                    else                            pinyin_ime->k9_input_str_len += strlen(k9_py_map[i]);
+                    pinyin_ime->k9_input_str[pinyin_ime->ta_count] = 50 + i;
+
+                    break;
+                }
+            }
+            pinyin_k9_get_legal_py(obj, pinyin_ime->k9_input_str, k9_py_map);
+            pinyin_k9_fill_cand(obj);
+            pinyin_input_proc(obj);
+        }
+        else if(strcmp(txt, LV_SYMBOL_LEFT) == 0) {
+            pinyin_k9_cand_page_proc(obj, 0);
+        }
+        else if(strcmp(txt, LV_SYMBOL_RIGHT) == 0) {
+            pinyin_k9_cand_page_proc(obj, 1);
+        }
+#endif
+    }
+}
+
+
+static void lv_ime_pinyin_cand_panel_event(lv_event_t * e)
+{
+    lv_event_code_t code = lv_event_get_code(e);
+    lv_obj_t * cand_panel = lv_event_get_target(e);
+    lv_obj_t * obj = (lv_obj_t *)lv_event_get_user_data(e);
+
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    if(code == LV_EVENT_VALUE_CHANGED) {
+        uint32_t id = lv_btnmatrix_get_selected_btn(cand_panel);
+        if(id == 0) {
+            pinyin_page_proc(obj, 0);
+            return;
+        }
+        if(id == (LV_IME_PINYIN_CAND_TEXT_NUM + 1)) {
+            pinyin_page_proc(obj, 1);
+            return;
+        }
+
+        const char * txt = lv_btnmatrix_get_btn_text(cand_panel, id);
+        lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb);
+        uint16_t index = 0;
+        for(index = 0; index < pinyin_ime->ta_count; index++)
+            lv_textarea_del_char(ta);
+
+        lv_textarea_add_text(ta, txt);
+
+        pinyin_ime_clear_data(obj);
+    }
+}
+
+
+static void pinyin_input_proc(lv_obj_t * obj)
+{
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    pinyin_ime->cand_str = pinyin_search_matching(obj, pinyin_ime->input_char, &pinyin_ime->cand_num);
+    if(pinyin_ime->cand_str == NULL) {
+        return;
+    }
+
+    pinyin_ime->py_page = 0;
+
+    for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) {
+        memset(lv_pinyin_cand_str[i], 0x00, sizeof(lv_pinyin_cand_str[i]));
+        lv_pinyin_cand_str[i][0] = ' ';
+    }
+
+    // fill buf
+    for(uint8_t i = 0; (i < pinyin_ime->cand_num && i < LV_IME_PINYIN_CAND_TEXT_NUM); i++) {
+        for(uint8_t j = 0; j < 3; j++) {
+            lv_pinyin_cand_str[i][j] = pinyin_ime->cand_str[i * 3 + j];
+        }
+    }
+
+    lv_obj_clear_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
+}
+
+static void pinyin_page_proc(lv_obj_t * obj, uint16_t dir)
+{
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+    uint16_t page_num = pinyin_ime->cand_num / LV_IME_PINYIN_CAND_TEXT_NUM;
+    uint16_t sur = pinyin_ime->cand_num % LV_IME_PINYIN_CAND_TEXT_NUM;
+
+    if(dir == 0) {
+        if(pinyin_ime->py_page) {
+            pinyin_ime->py_page--;
+        }
+    }
+    else {
+        if(sur == 0) {
+            page_num -= 1;
+        }
+        if(pinyin_ime->py_page < page_num) {
+            pinyin_ime->py_page++;
+        }
+        else return;
+    }
+
+    for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) {
+        memset(lv_pinyin_cand_str[i], 0x00, sizeof(lv_pinyin_cand_str[i]));
+        lv_pinyin_cand_str[i][0] = ' ';
+    }
+
+    // fill buf
+    uint16_t offset = pinyin_ime->py_page * (3 * LV_IME_PINYIN_CAND_TEXT_NUM);
+    for(uint8_t i = 0; (i < pinyin_ime->cand_num && i < LV_IME_PINYIN_CAND_TEXT_NUM); i++) {
+        if((sur > 0) && (pinyin_ime->py_page == page_num)) {
+            if(i > sur)
+                break;
+        }
+        for(uint8_t j = 0; j < 3; j++) {
+            lv_pinyin_cand_str[i][j] = pinyin_ime->cand_str[offset + (i * 3) + j];
+        }
+    }
+}
+
+
+static void lv_ime_pinyin_style_change_event(lv_event_t * e)
+{
+    lv_event_code_t code = lv_event_get_code(e);
+    lv_obj_t * obj = lv_event_get_target(e);
+
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    if(code == LV_EVENT_STYLE_CHANGED) {
+        const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN);
+        lv_obj_set_style_text_font(pinyin_ime->cand_panel, font, 0);
+    }
+}
+
+
+static void init_pinyin_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict)
+{
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    char headletter = 'a';
+    uint16_t offset_sum = 0;
+    uint16_t offset_count = 0;
+    uint16_t letter_calc = 0;
+
+    pinyin_ime->dict = dict;
+
+    for(uint16_t i = 0; ; i++) {
+        if((NULL == (dict[i].py)) || (NULL == (dict[i].py_mb))) {
+            headletter = dict[i - 1].py[0];
+            letter_calc = headletter - 'a';
+            pinyin_ime->py_num[letter_calc] = offset_count;
+            break;
+        }
+
+        if(headletter == (dict[i].py[0])) {
+            offset_count++;
+        }
+        else {
+            headletter = dict[i].py[0];
+            letter_calc = headletter - 'a';
+            pinyin_ime->py_num[letter_calc - 1] = offset_count;
+            offset_sum += offset_count;
+            pinyin_ime->py_pos[letter_calc] = offset_sum;
+
+            offset_count = 1;
+        }
+    }
+}
+
+
+static char * pinyin_search_matching(lv_obj_t * obj, char * py_str, uint16_t * cand_num)
+{
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    lv_pinyin_dict_t * cpHZ;
+    uint8_t index, len = 0, offset;
+    volatile uint8_t count = 0;
+
+    if(*py_str == '\0')    return NULL;
+    if(*py_str == 'i')     return NULL;
+    if(*py_str == 'u')     return NULL;
+    if(*py_str == 'v')     return NULL;
+
+    offset = py_str[0] - 'a';
+    len = strlen(py_str);
+
+    cpHZ  = &pinyin_ime->dict[pinyin_ime->py_pos[offset]];
+    count = pinyin_ime->py_num[offset];
+
+    while(count--) {
+        for(index = 0; index < len; index++) {
+            if(*(py_str + index) != *((cpHZ->py) + index)) {
+                break;
+            }
+        }
+
+        // perfect match
+        if(len == 1 || index == len) {
+            // The Chinese character in UTF-8 encoding format is 3 bytes
+            * cand_num = strlen((const char *)(cpHZ->py_mb)) / 3;
+            return (char *)(cpHZ->py_mb);
+        }
+        cpHZ++;
+    }
+    return NULL;
+}
+
+static void pinyin_ime_clear_data(lv_obj_t * obj)
+{
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+
+#if LV_IME_PINYIN_USE_K9_MODE
+    if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) {
+        pinyin_ime->k9_input_str_len = 0;
+        pinyin_ime->k9_py_ll_pos = 0;
+        pinyin_ime->k9_legal_py_count = 0;
+        lv_memset_00(pinyin_ime->k9_input_str,  LV_IME_PINYIN_K9_MAX_INPUT);
+        lv_memset_00(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str));
+        strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0");
+        strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0");
+    }
+#endif
+
+    pinyin_ime->ta_count = 0;
+    lv_memset_00(lv_pinyin_cand_str, (sizeof(lv_pinyin_cand_str)));
+    lv_memset_00(pinyin_ime->input_char, sizeof(pinyin_ime->input_char));
+
+    lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
+}
+
+
+#if LV_IME_PINYIN_USE_K9_MODE
+static void pinyin_k9_init_data(lv_obj_t * obj)
+{
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    uint16_t py_str_i = 0;
+    uint16_t btnm_i = 0;
+    for(btnm_i = 19; btnm_i < (LV_IME_PINYIN_K9_CAND_TEXT_NUM + 21); btnm_i++) {
+        if(py_str_i == LV_IME_PINYIN_K9_CAND_TEXT_NUM) {
+            strcpy(lv_pinyin_k9_cand_str[py_str_i], LV_SYMBOL_RIGHT"\0");
+        }
+        else if(py_str_i == LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1) {
+            strcpy(lv_pinyin_k9_cand_str[py_str_i], "\0");
+        }
+        else {
+            strcpy(lv_pinyin_k9_cand_str[py_str_i], " \0");
+        }
+
+        lv_btnm_def_pinyin_k9_map[btnm_i] = lv_pinyin_k9_cand_str[py_str_i];
+        py_str_i++;
+    }
+
+    default_kb_ctrl_k9_map[0]  = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+    default_kb_ctrl_k9_map[4]  = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+    default_kb_ctrl_k9_map[5]  = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+    default_kb_ctrl_k9_map[9]  = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+    default_kb_ctrl_k9_map[10] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+    default_kb_ctrl_k9_map[14] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+    default_kb_ctrl_k9_map[15] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+    default_kb_ctrl_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 16] = LV_KEYBOARD_CTRL_BTN_FLAGS | 1;
+}
+
+static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char * py9_map[])
+{
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    uint16_t len = strlen(k9_input);
+
+    if((len == 0) || (len >= LV_IME_PINYIN_K9_MAX_INPUT)) {
+        return;
+    }
+
+    char py_comp[LV_IME_PINYIN_K9_MAX_INPUT] = {0};
+    int mark[LV_IME_PINYIN_K9_MAX_INPUT] = {0};
+    int index = 0;
+    int flag = 0;
+    int count = 0;
+
+    uint32_t ll_len = 0;
+    ime_pinyin_k9_py_str_t * ll_index = NULL;
+
+    ll_len = _lv_ll_get_len(&pinyin_ime->k9_legal_py_ll);
+    ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll);
+
+    while(index != -1) {
+        if(index == len) {
+            if(pinyin_k9_is_valid_py(obj, py_comp)) {
+                if((count >= ll_len) || (ll_len == 0)) {
+                    ll_index = _lv_ll_ins_tail(&pinyin_ime->k9_legal_py_ll);
+                    strcpy(ll_index->py_str, py_comp);
+                }
+                else if((count < ll_len)) {
+                    strcpy(ll_index->py_str, py_comp);
+                    ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index);
+                }
+                count++;
+            }
+            index--;
+        }
+        else {
+            flag = mark[index];
+            if(flag < strlen(py9_map[k9_input[index] - '2'])) {
+                py_comp[index] = py9_map[k9_input[index] - '2'][flag];
+                mark[index] = mark[index] + 1;
+                index++;
+            }
+            else {
+                mark[index] = 0;
+                index--;
+            }
+        }
+    }
+
+    if(count > 0) {
+        pinyin_ime->ta_count++;
+        pinyin_ime->k9_legal_py_count = count;
+    }
+}
+
+
+/*true: visible; false: not visible*/
+static bool pinyin_k9_is_valid_py(lv_obj_t * obj, char * py_str)
+{
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    lv_pinyin_dict_t * cpHZ = NULL;
+    uint8_t index = 0, len = 0, offset = 0;
+    uint16_t ret = 1;
+    volatile uint8_t count = 0;
+
+    if(*py_str == '\0')    return false;
+    if(*py_str == 'i')     return false;
+    if(*py_str == 'u')     return false;
+    if(*py_str == 'v')     return false;
+
+    offset = py_str[0] - 'a';
+    len = strlen(py_str);
+
+    cpHZ  = &pinyin_ime->dict[pinyin_ime->py_pos[offset]];
+    count = pinyin_ime->py_num[offset];
+
+    while(count--) {
+        for(index = 0; index < len; index++) {
+            if(*(py_str + index) != *((cpHZ->py) + index)) {
+                break;
+            }
+        }
+
+        // perfect match
+        if(len == 1 || index == len) {
+            return true;
+        }
+        cpHZ++;
+    }
+    return false;
+}
+
+
+static void pinyin_k9_fill_cand(lv_obj_t * obj)
+{
+    static uint16_t len = 0;
+    uint16_t index = 0, tmp_len = 0;
+    ime_pinyin_k9_py_str_t * ll_index = NULL;
+
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    tmp_len = pinyin_ime->k9_legal_py_count;
+
+    if(tmp_len != len) {
+        lv_memset_00(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str));
+        strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0");
+        strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0");
+        len = tmp_len;
+    }
+
+    ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll);
+    strcpy(pinyin_ime->input_char, ll_index->py_str);
+    while(ll_index) {
+        if((index >= LV_IME_PINYIN_K9_CAND_TEXT_NUM) || \
+           (index >= pinyin_ime->k9_legal_py_count))
+            break;
+
+        strcpy(lv_pinyin_k9_cand_str[index], ll_index->py_str);
+        ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/
+        index++;
+    }
+    pinyin_ime->k9_py_ll_pos = index;
+
+    lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb);
+    for(index = 0; index < pinyin_ime->k9_input_str_len; index++) {
+        lv_textarea_del_char(ta);
+    }
+    pinyin_ime->k9_input_str_len = strlen(pinyin_ime->input_char);
+    lv_textarea_add_text(ta, pinyin_ime->input_char);
+}
+
+
+static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir)
+{
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb);
+    uint16_t ll_len =  _lv_ll_get_len(&pinyin_ime->k9_legal_py_ll);
+
+    if((ll_len > LV_IME_PINYIN_K9_CAND_TEXT_NUM) && (pinyin_ime->k9_legal_py_count > LV_IME_PINYIN_K9_CAND_TEXT_NUM)) {
+        ime_pinyin_k9_py_str_t * ll_index = NULL;
+        uint16_t tmp_btn_str_len = 0;
+        int count = 0;
+
+        ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll);
+        while(ll_index) {
+            if(count >= pinyin_ime->k9_py_ll_pos)   break;
+
+            ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/
+            count++;
+        }
+
+        if((NULL == ll_index) && (dir == 1))   return;
+
+        lv_memset_00(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str));
+        strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0");
+        strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0");
+
+        // next page
+        if(dir == 1) {
+            count = 0;
+            while(ll_index) {
+                if(count >= (LV_IME_PINYIN_K9_CAND_TEXT_NUM - 1))
+                    break;
+
+                strcpy(lv_pinyin_k9_cand_str[count], ll_index->py_str);
+                ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/
+                count++;
+            }
+            pinyin_ime->k9_py_ll_pos += count - 1;
+
+        }
+        // previous page
+        else {
+            count = LV_IME_PINYIN_K9_CAND_TEXT_NUM - 1;
+            ll_index = _lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index);
+            while(ll_index) {
+                if(count < 0)  break;
+
+                strcpy(lv_pinyin_k9_cand_str[count], ll_index->py_str);
+                ll_index = _lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the previous list*/
+                count--;
+            }
+
+            if(pinyin_ime->k9_py_ll_pos > LV_IME_PINYIN_K9_CAND_TEXT_NUM)
+                pinyin_ime->k9_py_ll_pos -= 1;
+        }
+
+        lv_textarea_set_cursor_pos(ta, LV_TEXTAREA_CURSOR_LAST);
+    }
+}
+
+#endif  /*LV_IME_PINYIN_USE_K9_MODE*/
+
+#endif  /*LV_USE_IME_PINYIN*/
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/ime/lv_ime_pinyin.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/ime/lv_ime_pinyin.h
new file mode 100644 (file)
index 0000000..3ff7bb9
--- /dev/null
@@ -0,0 +1,145 @@
+/**
+ * @file lv_ime_pinyin.h
+ *
+ */
+#ifndef LV_IME_PINYIN_H
+#define LV_IME_PINYIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../../../lvgl.h"
+
+#if LV_USE_IME_PINYIN != 0
+
+/*********************
+ *      DEFINES
+ *********************/
+#define LV_IME_PINYIN_K9_MAX_INPUT  7
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+typedef enum {
+    LV_IME_PINYIN_MODE_K26,
+    LV_IME_PINYIN_MODE_K9,
+} lv_ime_pinyin_mode_t;
+
+/*Data of pinyin_dict*/
+typedef struct {
+    const char * const py;
+    const char * const py_mb;
+} lv_pinyin_dict_t;
+
+/*Data of 9-key input(k9) mode*/
+typedef struct {
+    char py_str[7];
+} ime_pinyin_k9_py_str_t;
+
+/*Data of lv_ime_pinyin*/
+typedef struct {
+    lv_obj_t obj;
+    lv_obj_t * kb;
+    lv_obj_t * cand_panel;
+    lv_pinyin_dict_t * dict;
+    lv_ll_t k9_legal_py_ll;
+    char * cand_str;            /* Candidate string */
+    char   input_char[16];      /* Input box character */
+#if LV_IME_PINYIN_USE_K9_MODE
+    char   k9_input_str[LV_IME_PINYIN_K9_MAX_INPUT]; /* 9-key input(k9) mode input string */
+    uint16_t k9_py_ll_pos;      /* Current pinyin map pages(k9) */
+    uint16_t k9_legal_py_count; /* Count of legal Pinyin numbers(k9) */
+    uint16_t k9_input_str_len;  /* 9-key input(k9) mode input string max len */
+#endif
+    uint16_t ta_count;          /* The number of characters entered in the text box this time */
+    uint16_t cand_num;          /* Number of candidates */
+    uint16_t py_page;           /* Current pinyin map pages(k26) */
+    uint16_t py_num[26];        /* Number and length of Pinyin */
+    uint16_t py_pos[26];        /* Pinyin position */
+    uint8_t  mode : 1;          /* Set mode, 1: 26-key input(k26), 0: 9-key input(k9). Default: 1. */
+} lv_ime_pinyin_t;
+
+/***********************
+ * GLOBAL VARIABLES
+ ***********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+lv_obj_t * lv_ime_pinyin_create(lv_obj_t * parent);
+
+/*=====================
+ * Setter functions
+ *====================*/
+
+/**
+ * Set the keyboard of Pinyin input method.
+ * @param obj  pointer to a Pinyin input method object
+ * @param dict pointer to a Pinyin input method keyboard
+ */
+void lv_ime_pinyin_set_keyboard(lv_obj_t * obj, lv_obj_t * kb);
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj  pointer to a Pinyin input method object
+ * @param dict pointer to a Pinyin input method dictionary
+ */
+void lv_ime_pinyin_set_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict);
+
+/**
+ * Set mode, 26-key input(k26) or 9-key input(k9).
+ * @param obj  pointer to a Pinyin input method object
+ * @param mode   the mode from 'lv_ime_pinyin_mode_t'
+ */
+void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode);
+
+
+/*=====================
+ * Getter functions
+ *====================*/
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj  pointer to a Pinyin IME object
+ * @return     pointer to the Pinyin IME keyboard
+ */
+lv_obj_t * lv_ime_pinyin_get_kb(lv_obj_t * obj);
+
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj  pointer to a Pinyin input method object
+ * @return     pointer to the Pinyin input method candidate panel
+ */
+lv_obj_t * lv_ime_pinyin_get_cand_panel(lv_obj_t * obj);
+
+
+/**
+ * Set the dictionary of Pinyin input method.
+ * @param obj  pointer to a Pinyin input method object
+ * @return     pointer to the Pinyin input method dictionary
+ */
+lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj);
+
+/*=====================
+ * Other functions
+ *====================*/
+
+/**********************
+ *      MACROS
+ **********************/
+
+#endif  /*LV_IME_PINYIN*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_USE_IME_PINYIN*/
+
+
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/imgfont/lv_imgfont.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/imgfont/lv_imgfont.c
new file mode 100644 (file)
index 0000000..ad4ab60
--- /dev/null
@@ -0,0 +1,126 @@
+/**
+ * @file lv_imgfont.c
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "lv_imgfont.h"
+
+#if LV_USE_IMGFONT
+
+/*********************
+ *      DEFINES
+ *********************/
+#define LV_IMGFONT_PATH_MAX_LEN 64
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+typedef struct {
+    lv_font_t * font;
+    lv_get_imgfont_path_cb_t path_cb;
+    char path[LV_IMGFONT_PATH_MAX_LEN];
+} imgfont_dsc_t;
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+static const uint8_t * imgfont_get_glyph_bitmap(const lv_font_t * font, uint32_t unicode);
+static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out,
+                                  uint32_t unicode, uint32_t unicode_next);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+lv_font_t * lv_imgfont_create(uint16_t height, lv_get_imgfont_path_cb_t path_cb)
+{
+    LV_ASSERT_MSG(LV_IMGFONT_PATH_MAX_LEN > sizeof(lv_img_dsc_t),
+                  "LV_IMGFONT_PATH_MAX_LEN must be greater than sizeof(lv_img_dsc_t)");
+
+    size_t size = sizeof(imgfont_dsc_t) + sizeof(lv_font_t);
+    imgfont_dsc_t * dsc = (imgfont_dsc_t *)lv_mem_alloc(size);
+    if(dsc == NULL) return NULL;
+    lv_memset_00(dsc, size);
+
+    dsc->font = (lv_font_t *)(((char *)dsc) + sizeof(imgfont_dsc_t));
+    dsc->path_cb = path_cb;
+
+    lv_font_t * font = dsc->font;
+    font->dsc = dsc;
+    font->get_glyph_dsc = imgfont_get_glyph_dsc;
+    font->get_glyph_bitmap = imgfont_get_glyph_bitmap;
+    font->subpx = LV_FONT_SUBPX_NONE;
+    font->line_height = height;
+    font->base_line = 0;
+    font->underline_position = 0;
+    font->underline_thickness = 0;
+
+    return dsc->font;
+}
+
+void lv_imgfont_destroy(lv_font_t * font)
+{
+    if(font == NULL) {
+        return;
+    }
+
+    imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc;
+    lv_mem_free(dsc);
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+static const uint8_t * imgfont_get_glyph_bitmap(const lv_font_t * font, uint32_t unicode)
+{
+    LV_UNUSED(unicode);
+    LV_ASSERT_NULL(font);
+    imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc;
+    return (uint8_t *)dsc->path;
+}
+
+static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out,
+                                  uint32_t unicode, uint32_t unicode_next)
+{
+    LV_ASSERT_NULL(font);
+
+    imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc;
+    LV_ASSERT_NULL(dsc);
+    if(dsc->path_cb == NULL) return false;
+
+    if(!dsc->path_cb(dsc->font, dsc->path, LV_IMGFONT_PATH_MAX_LEN, unicode, unicode_next)) {
+        return false;
+    }
+
+    lv_img_header_t header;
+    if(lv_img_decoder_get_info(dsc->path, &header) != LV_RES_OK) {
+        return false;
+    }
+
+    dsc_out->is_placeholder = 0;
+    dsc_out->adv_w = header.w;
+    dsc_out->box_w = header.w;
+    dsc_out->box_h = header.h;
+    dsc_out->bpp = LV_IMGFONT_BPP;   /* is image identifier */
+    dsc_out->ofs_x = 0;
+    dsc_out->ofs_y = 0;
+
+    return true;
+}
+
+#endif /*LV_USE_IMGFONT*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/imgfont/lv_imgfont.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/imgfont/lv_imgfont.h
new file mode 100644 (file)
index 0000000..5069b62
--- /dev/null
@@ -0,0 +1,60 @@
+/**
+ * @file lv_imgfont.h
+ *
+ */
+
+#ifndef LV_IMGFONT_H
+#define LV_IMGFONT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../../../lvgl.h"
+
+#if LV_USE_IMGFONT
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+/* gets the image path name of this character */
+typedef bool (*lv_get_imgfont_path_cb_t)(const lv_font_t * font, void * img_src,
+                                         uint16_t len, uint32_t unicode, uint32_t unicode_next);
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Creates a image font with info parameter specified.
+ * @param height font size
+ * @param path_cb a function to get the image path name of character.
+ * @return pointer to the new imgfont or NULL if create error.
+ */
+lv_font_t * lv_imgfont_create(uint16_t height, lv_get_imgfont_path_cb_t path_cb);
+
+/**
+ * Destroy a image font that has been created.
+ * @param font pointer to image font handle.
+ */
+void lv_imgfont_destroy(lv_font_t * font);
+
+/**********************
+ *      MACROS
+ **********************/
+
+#endif /*LV_USE_IMGFONT*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /* LV_IMGFONT_H */
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/msg/lv_msg.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/msg/lv_msg.c
new file mode 100644 (file)
index 0000000..d54279c
--- /dev/null
@@ -0,0 +1,189 @@
+/**
+ * @file lv_msg.c
+ *
+ */
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "lv_msg.h"
+#if LV_USE_MSG
+
+#include "../../../misc/lv_assert.h"
+#include "../../../misc/lv_ll.h"
+
+/*********************
+ *      DEFINES
+ *********************/
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+typedef struct {
+    uint32_t msg_id;
+    lv_msg_subscribe_cb_t callback;
+    void * user_data;
+    void * _priv_data;      /*Internal: used only store 'obj' in lv_obj_subscribe*/
+} sub_dsc_t;
+
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+
+static void notify(lv_msg_t * m);
+static void obj_notify_cb(void * s, lv_msg_t * m);
+static void obj_delete_event_cb(lv_event_t * e);
+
+/**********************
+ *  STATIC VARIABLES
+ **********************/
+static lv_ll_t subs_ll;
+
+/**********************
+ *  GLOBAL VARIABLES
+ **********************/
+lv_event_code_t LV_EVENT_MSG_RECEIVED;
+
+/**********************
+ *      MACROS
+ **********************/
+
+/**********************
+ *   GLOBAL FUNCTIONS
+ **********************/
+
+void lv_msg_init(void)
+{
+    LV_EVENT_MSG_RECEIVED = lv_event_register_id();
+    _lv_ll_init(&subs_ll, sizeof(sub_dsc_t));
+}
+
+void * lv_msg_subsribe(uint32_t msg_id, lv_msg_subscribe_cb_t cb, void * user_data)
+{
+    sub_dsc_t * s = _lv_ll_ins_tail(&subs_ll);
+    LV_ASSERT_MALLOC(s);
+    if(s == NULL) return NULL;
+
+    lv_memset_00(s, sizeof(*s));
+
+    s->msg_id = msg_id;
+    s->callback = cb;
+    s->user_data = user_data;
+    return s;
+}
+
+void * lv_msg_subsribe_obj(uint32_t msg_id, lv_obj_t * obj, void * user_data)
+{
+    sub_dsc_t * s = lv_msg_subsribe(msg_id, obj_notify_cb, user_data);
+    if(s == NULL) return NULL;
+    s->_priv_data = obj;
+
+    /*If not added yet, add a delete event cb which automatically unsubcribes the object*/
+    sub_dsc_t * s_first = lv_obj_get_event_user_data(obj, obj_delete_event_cb);
+    if(s_first == NULL) {
+        lv_obj_add_event_cb(obj, obj_delete_event_cb, LV_EVENT_DELETE, s);
+    }
+    return s;
+}
+
+void lv_msg_unsubscribe(void * s)
+{
+    LV_ASSERT_NULL(s);
+    _lv_ll_remove(&subs_ll, s);
+    lv_mem_free(s);
+}
+
+uint32_t lv_msg_unsubscribe_obj(uint32_t msg_id, lv_obj_t * obj)
+{
+    uint32_t cnt = 0;
+    sub_dsc_t * s = _lv_ll_get_head(&subs_ll);
+    while(s) {
+        sub_dsc_t * s_next = _lv_ll_get_next(&subs_ll, s);
+        if(s->callback == obj_notify_cb &&
+           (s->msg_id == LV_MSG_ID_ANY || s->msg_id == msg_id) &&
+           (obj == NULL || s->_priv_data == obj)) {
+            lv_msg_unsubscribe(s);
+            cnt++;
+        }
+
+        s = s_next;
+    }
+
+    return cnt;
+}
+
+void lv_msg_send(uint32_t msg_id, const void * payload)
+{
+    lv_msg_t m;
+    lv_memset_00(&m, sizeof(m));
+    m.id = msg_id;
+    m.payload = payload;
+    notify(&m);
+}
+
+uint32_t lv_msg_get_id(lv_msg_t * m)
+{
+    return m->id;
+}
+
+const void * lv_msg_get_payload(lv_msg_t * m)
+{
+    return m->payload;
+}
+
+void * lv_msg_get_user_data(lv_msg_t * m)
+{
+    return m->user_data;
+}
+
+lv_msg_t * lv_event_get_msg(lv_event_t * e)
+{
+    if(e->code == LV_EVENT_MSG_RECEIVED) {
+        return lv_event_get_param(e);
+    }
+    else {
+        LV_LOG_WARN("Not interpreted with this event code");
+        return NULL;
+    }
+}
+
+/**********************
+ *   STATIC FUNCTIONS
+ **********************/
+
+static void notify(lv_msg_t * m)
+{
+    sub_dsc_t * s;
+    _LV_LL_READ(&subs_ll, s) {
+        if(s->msg_id == m->id && s->callback) {
+            m->user_data = s->user_data;
+            m->_priv_data = s->_priv_data;
+            s->callback(s, m);
+        }
+    }
+}
+
+static void obj_notify_cb(void * s, lv_msg_t * m)
+{
+    LV_UNUSED(s);
+    lv_event_send(m->_priv_data, LV_EVENT_MSG_RECEIVED, m);
+}
+
+static void obj_delete_event_cb(lv_event_t * e)
+{
+    lv_obj_t * obj = lv_event_get_target(e);
+
+    sub_dsc_t * s = _lv_ll_get_head(&subs_ll);
+    sub_dsc_t * s_next;
+    while(s) {
+        /*On unsubscribe the list changes s becomes invalid so get next item while it's surely valid*/
+        s_next = _lv_ll_get_next(&subs_ll, s);
+        if(s->_priv_data == obj) {
+            lv_msg_unsubscribe(s);
+        }
+        s = s_next;
+    }
+}
+
+#endif /*LV_USE_MSG*/
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/msg/lv_msg.h b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/msg/lv_msg.h
new file mode 100644 (file)
index 0000000..0ac2f77
--- /dev/null
@@ -0,0 +1,145 @@
+/**
+ * @file lv_msg.h
+ *
+ */
+
+#ifndef LV_MSG_H
+#define LV_MSG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ *      INCLUDES
+ *********************/
+#include "../../../core/lv_obj.h"
+#if LV_USE_MSG
+
+/*********************
+ *      DEFINES
+ *********************/
+#define LV_MSG_ID_ANY UINT32_MAX
+LV_EXPORT_CONST_INT(LV_MSG_ID_ANY);
+
+/**********************
+ *      TYPEDEFS
+ **********************/
+
+typedef struct {
+    uint32_t id;            /*Identifier of the message*/
+    void * user_data;       /*Set the the user_data set in `lv_msg_subscribe`*/
+    void * _priv_data;      /*Used internally*/
+    const void * payload;   /*Pointer to the data of the message*/
+} lv_msg_t;
+
+typedef void (*lv_msg_subscribe_cb_t)(void * s, lv_msg_t * msg);
+
+typedef void (*lv_msg_request_cb_t)(void * r, uint32_t msg_id);
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Called internally to initialize the message module
+ */
+void lv_msg_init(void);
+
+/**
+ * Subscribe to an `msg_id`
+ * @param msg_id        the message ID to listen to
+ * @param cb            callback to call if a message with `msg_id` was sent
+ * @param user_data     arbitrary data which will be available in `cb` too
+ * @return              pointer to a "subscribe object". It can be used the unsubscribe.
+ */
+void * lv_msg_subsribe(uint32_t msg_id, lv_msg_subscribe_cb_t cb, void * user_data);
+
+/**
+ * Subscribe an `lv_obj` to a message.
+ * `LV_EVENT_MSG_RECEIVED` will be triggered if a message with matching ID was sent
+ * @param msg_id        the message ID to listen to
+ * @param obj           pointer to an `lv_obj`
+ * @param user_data     arbitrary data which will be available in `cb` too
+ * @return              pointer to a "subscribe object". It can be used the unsubscribe.
+ */
+void * lv_msg_subsribe_obj(uint32_t msg_id, lv_obj_t * obj, void * user_data);
+
+/**
+ * Cancel a previous subscription
+ * @param s             pointer to a "subscibe object".
+ *                      Return value of `lv_msg_subsribe` or `lv_msg_subsribe_obj`
+ */
+void lv_msg_unsubscribe(void * s);
+
+/**
+ * Unsubscribe an object from a message ID
+ * @param msg_id        the message ID to unsubcribe from or `LV_MSG_ID_ANY` for any message ID
+ * @param obj           the object to unsubscribe or NULL for any object
+ * @return              number of unsubscriptions
+ */
+uint32_t lv_msg_unsubscribe_obj(uint32_t msg_id, lv_obj_t * obj);
+
+/**
+ * Send a message with a given ID and payload
+ * @param msg_id        ID of the message to send
+ * @param data          pointer to the data to send
+ */
+void lv_msg_send(uint32_t msg_id, const void * payload);
+
+/**
+ * Get the ID of a message object. Typically used in the subscriber callback.
+ * @param m             pointer to a message object
+ * @return              the ID of the message
+ */
+uint32_t lv_msg_get_id(lv_msg_t * m);
+
+/**
+ * Get the payload of a message object. Typically used in the subscriber callback.
+ * @param m             pointer to a message object
+ * @return              the payload of the message
+ */
+const void * lv_msg_get_payload(lv_msg_t * m);
+
+/**
+ * Get the user data of a message object. Typically used in the subscriber callback.
+ * @param m             pointer to a message object
+ * @return              the user data of the message
+ */
+void * lv_msg_get_user_data(lv_msg_t * m);
+
+/**
+ * Get the message object from an event object. Can be used in `LV_EVENT_MSG_RECEIVED` events.
+ * @param e     pointer to an event object
+ * @return      the message object or NULL if called with unrelated event code.
+ */
+lv_msg_t * lv_event_get_msg(lv_event_t * e);
+
+/*Fix typo*/
+static inline void * lv_msg_subscribe(uint32_t msg_id, lv_msg_subscribe_cb_t cb, void * user_data)
+{
+    return lv_msg_subsribe(msg_id, cb, user_data);
+}
+
+static inline void * lv_msg_subscribe_obj(uint32_t msg_id, lv_obj_t * obj, void * user_data)
+{
+    return lv_msg_subsribe_obj(msg_id, obj, user_data);
+}
+
+/**********************
+ * GLOBAL VARIABLES
+ **********************/
+
+extern lv_event_code_t LV_EVENT_MSG_RECEIVED;
+
+/**********************
+ *      MACROS
+ **********************/
+
+#endif /*LV_USE_MSG*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_MSG_H*/
index d3253c7..2b27894 100644 (file)
@@ -75,7 +75,7 @@ LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void)
     if(already_running) {
         TIMER_TRACE("already running, concurrent calls are not allow, returning");
         lv_timer_log("lv_timer_handler:ERROR1:already_running:%d",already_running);
-        return 1;
+        //return 1;
     }
     already_running = true;
 
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/makefile/Makefile b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/makefile/Makefile
new file mode 100644 (file)
index 0000000..486d1e1
--- /dev/null
@@ -0,0 +1,9 @@
+LVGL_DIR := $(CURDIR)/../..
+include ../../lvgl.mk
+
+CSRCS += test.c
+CFLAGS += -DLV_CONF_SKIP=1 -DLV_BUILD_TEST=1 -I$(LVGL_DIR)/..
+COBJS := $(patsubst %.c, %.o, $(CSRCS))
+
+test_file: $(COBJS)
+       $(CC) -o $@ $^
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/makefile/test.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/makefile/test.c
new file mode 100644 (file)
index 0000000..e725ade
--- /dev/null
@@ -0,0 +1,9 @@
+#if LV_BUILD_TEST
+#include <stdio.h>
+#include "lvgl/lvgl.h"
+
+int main(void) {
+    lv_init();
+    return 0;
+}
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/ref_imgs/table_1.png b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/ref_imgs/table_1.png
new file mode 100644 (file)
index 0000000..193e132
Binary files /dev/null and b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/ref_imgs/table_1.png differ
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_fs.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_fs.c
new file mode 100644 (file)
index 0000000..7e31a96
--- /dev/null
@@ -0,0 +1,53 @@
+#if LV_BUILD_TEST
+#include "../lvgl.h"
+
+#include "unity/unity.h"
+
+
+const char * read_exp =
+    "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sed maximus orci. Morbi massa nisi, varius eu convallis ac, venenatis at metus. In in nibh id urna pretium feugiat vitae eu libero. Ut eget fringilla eros. Nunc ullamcorper lectus mauris, vel rhoncus velit volutpat et. Phasellus sed molestie massa. Maecenas quis dui sollicitudin, vulputate nunc ut, dictum quam. Nam a congue lorem. Nulla non facilisis sapien. Ut luctus nulla nibh, sed finibus urna porta non. Duis aliquet augue id urna euismod auctor. Integer pellentesque vulputate enim non mattis. Donec finibus mattis dolor, et feugiat nisi pharetra porta. Mauris ullamcorper cursus magna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.";
+
+void setUp(void)
+{
+    /* Function run before every test */
+}
+
+void tearDown(void)
+{
+    /* Function run after every test */
+}
+#include <stdio.h>
+void test_read(void)
+{
+    lv_fs_res_t res;
+
+    /*'A' has cache*/
+    lv_fs_file_t fa;
+    res = lv_fs_open(&fa, "A:src/test_files/readtest.txt", LV_FS_MODE_RD);
+    TEST_ASSERT_EQUAL(LV_FS_RES_OK, res);
+
+    /*'B' has no cache*/
+    lv_fs_file_t fb;
+    res = lv_fs_open(&fb, "B:src/test_files/readtest.txt", LV_FS_MODE_RD);
+    TEST_ASSERT_EQUAL(LV_FS_RES_OK, res);
+
+    /*Use an odd size to make sure it's not aligned with the drivier's'cache size*/
+    uint8_t buf[79];
+    uint32_t cnt = 0;
+    uint32_t br = 1;
+    while(br) {
+        res = lv_fs_read(&fa, buf, sizeof(buf), &br);
+        TEST_ASSERT_EQUAL(LV_FS_RES_OK, res);
+        TEST_ASSERT_TRUE(memcmp(buf, read_exp + cnt, br) == 0);
+
+        res = lv_fs_read(&fb, buf, sizeof(buf), &br);
+        TEST_ASSERT_EQUAL(LV_FS_RES_OK, res);
+        TEST_ASSERT_TRUE(memcmp(buf, read_exp + cnt, br) == 0);
+        cnt += br;
+    }
+
+    lv_fs_close(&fa);
+    lv_fs_close(&fb);
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_line.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_line.c
new file mode 100644 (file)
index 0000000..e2f781d
--- /dev/null
@@ -0,0 +1,95 @@
+#if LV_BUILD_TEST
+#include "../lvgl.h"
+
+#include "unity/unity.h"
+
+static lv_obj_t * active_screen = NULL;
+static lv_obj_t * line = NULL;
+
+static const uint16_t default_point_num = 0U;
+static const lv_coord_t initial_extra_draw_size = 5U;
+static const lv_coord_t final_extra_draw_size = 10U;
+
+void setUp(void)
+{
+    active_screen = lv_scr_act();
+    line = lv_line_create(active_screen);
+}
+
+void tearDown(void)
+{
+    lv_obj_clean(active_screen);
+}
+
+void test_line_should_have_valid_documented_default_values(void)
+{
+    lv_line_t * line_ptr = (lv_line_t *) line;
+    TEST_ASSERT_EQUAL_UINT16(default_point_num, line_ptr->point_num);
+    TEST_ASSERT_NULL(line_ptr->point_array);
+    TEST_ASSERT_FALSE(lv_line_get_y_invert(line));
+    TEST_ASSERT_FALSE(lv_obj_has_flag(line, LV_OBJ_FLAG_CLICKABLE));
+    /* line doesn't have any points, so it's 0,0 in size */
+    TEST_ASSERT_EQUAL_UINT16(0U, lv_obj_get_self_width(line));
+    TEST_ASSERT_EQUAL_UINT16(0U, lv_obj_get_self_height(line));
+}
+
+void test_line_should_return_valid_y_invert(void)
+{
+    lv_line_set_y_invert(line, true);
+    TEST_ASSERT_TRUE(lv_line_get_y_invert(line));
+}
+
+void test_line_size_should_be_updated_after_adding_points(void)
+{
+    static lv_point_t points[] = { {5, 5} };
+    uint16_t point_cnt = (uint16_t) sizeof(points) / sizeof(lv_point_t);
+    lv_line_set_points(line, points, point_cnt);
+
+    lv_coord_t calculated_width = 0;
+    lv_coord_t calculated_height = 0;
+
+    /* Get the biggest coordinate on both axis */
+    uint16_t point_idx = 0;
+    for(point_idx = 0; point_idx < point_cnt; point_idx++) {
+        calculated_width = LV_MAX(points[point_idx].x, calculated_width);
+        calculated_height = LV_MAX(points[point_idx].y, calculated_height);
+    }
+    /* Add style line width */
+    lv_coord_t line_width = lv_obj_get_style_line_width(line, LV_PART_MAIN);
+    calculated_width += line_width;
+    calculated_height += line_width;
+
+    TEST_ASSERT_EQUAL_UINT16(calculated_width, lv_obj_get_self_width(line));
+    TEST_ASSERT_EQUAL_UINT16(calculated_height, lv_obj_get_self_height(line));
+}
+
+static void line_event_cb(lv_event_t * e)
+{
+    lv_event_code_t code = lv_event_get_code(e);
+
+    if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) {
+        /* Set the new line extra draw size */
+        lv_event_set_ext_draw_size(e, initial_extra_draw_size);
+    }
+}
+
+void test_line_should_update_extra_draw_size_based_on_style(void)
+{
+    /* Setup an event handler for line extra draw size event */
+    lv_obj_add_event_cb(line, line_event_cb, LV_EVENT_ALL, NULL);
+    /* Trigger the extra draw size event */
+    lv_obj_refresh_ext_draw_size(line);
+
+    TEST_ASSERT_EQUAL(initial_extra_draw_size, _lv_obj_get_ext_draw_size(line));
+
+    /* Update line width style, the event handler should set the extra draw size
+     * to the line width */
+    lv_obj_set_style_line_width(line, final_extra_draw_size, LV_PART_MAIN);
+
+    /* Trigger the extra draw size event */
+    lv_obj_refresh_ext_draw_size(line);
+
+    TEST_ASSERT_EQUAL(final_extra_draw_size, _lv_obj_get_ext_draw_size(line));
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_mem.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_mem.c
new file mode 100644 (file)
index 0000000..c97e271
--- /dev/null
@@ -0,0 +1,26 @@
+#if LV_BUILD_TEST
+#include "../lvgl.h"
+
+#include "unity/unity.h"
+
+void setUp(void)
+{
+    /* Function run before every test */
+}
+
+void tearDown(void)
+{
+    /* Function run after every test */
+}
+
+/* #3324 */
+void test_mem_buf_realloc(void)
+{
+#if LV_MEM_CUSTOM == 0
+    void * buf1 = lv_mem_alloc(20);
+    void * buf2 = lv_mem_realloc(buf1, LV_MEM_SIZE + 16384);
+    TEST_ASSERT_NULL(buf2);
+#endif
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_slider.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_slider.c
new file mode 100644 (file)
index 0000000..2fe8824
--- /dev/null
@@ -0,0 +1,214 @@
+#if LV_BUILD_TEST
+#include "../lvgl.h"
+
+#include "unity/unity.h"
+#include "lv_test_indev.h"
+
+static lv_obj_t * active_screen = NULL;
+static lv_obj_t * slider = NULL;
+static lv_obj_t * sliderRangeMode = NULL;
+static lv_obj_t * sliderNormalMode = NULL;
+static lv_obj_t * sliderSymmetricalMode = NULL;
+static lv_group_t * g = NULL;
+
+void setUp(void)
+{
+    active_screen = lv_scr_act();
+    slider = lv_slider_create(active_screen);
+    sliderRangeMode = lv_slider_create(active_screen);
+    sliderNormalMode = lv_slider_create(active_screen);
+    sliderSymmetricalMode = lv_slider_create(active_screen);
+
+    lv_slider_set_mode(sliderRangeMode, LV_SLIDER_MODE_RANGE);
+    lv_slider_set_mode(sliderNormalMode, LV_SLIDER_MODE_NORMAL);
+    lv_slider_set_mode(sliderSymmetricalMode, LV_SLIDER_MODE_SYMMETRICAL);
+
+    g = lv_group_create();
+    lv_indev_set_group(lv_test_encoder_indev, g);
+}
+
+void tearDown(void)
+{
+    lv_obj_clean(active_screen);
+}
+
+void test_textarea_should_have_valid_documented_default_values(void)
+{
+    lv_coord_t objw = lv_obj_get_width(slider);
+    lv_coord_t objh = lv_obj_get_height(slider);
+
+    /* Horizontal slider */
+    TEST_ASSERT_TRUE(objw >= objh);
+    TEST_ASSERT_FALSE(lv_obj_has_flag(slider, LV_OBJ_FLAG_SCROLL_CHAIN));
+    TEST_ASSERT_FALSE(lv_obj_has_flag(slider, LV_OBJ_FLAG_SCROLLABLE));
+}
+
+void test_slider_event_keys_right_and_up_increment_value_by_one(void)
+{
+    char key = LV_KEY_RIGHT;
+    lv_slider_set_value(slider, 10, LV_ANIM_OFF);
+    int32_t value = lv_slider_get_value(slider);
+
+    lv_event_send(slider, LV_EVENT_KEY, (void *) &key);
+
+    int32_t new_value = lv_slider_get_value(slider);
+    TEST_ASSERT_EQUAL_INT32(value + 1, new_value);
+
+    key = LV_KEY_UP;
+    lv_event_send(slider, LV_EVENT_KEY, (void *) &key);
+    TEST_ASSERT_EQUAL_INT32(new_value + 1, lv_slider_get_value(slider));
+}
+
+void test_slider_event_keys_left_and_down_decrement_value_by_one(void)
+{
+    char key = LV_KEY_LEFT;
+    lv_slider_set_value(slider, 10, LV_ANIM_OFF);
+    int32_t value = lv_slider_get_value(slider);
+
+    lv_event_send(slider, LV_EVENT_KEY, (void *) &key);
+
+    int32_t new_value = lv_slider_get_value(slider);
+    TEST_ASSERT_EQUAL_INT32(value - 1, new_value);
+
+    key = LV_KEY_DOWN;
+    lv_event_send(slider, LV_EVENT_KEY, (void *) &key);
+    TEST_ASSERT_EQUAL_INT32(new_value - 1, lv_slider_get_value(slider));
+}
+
+void test_slider_event_invalid_key_should_not_change_values(void)
+{
+    char key = LV_KEY_ENTER;
+    lv_slider_set_value(slider, 10, LV_ANIM_OFF);
+    int32_t value = lv_slider_get_value(slider);
+
+    lv_event_send(slider, LV_EVENT_KEY, (void *) &key);
+
+    TEST_ASSERT_EQUAL_INT32(value, lv_slider_get_value(slider));
+}
+
+void test_slider_range_mode_should_leave_edit_mode_if_released(void)
+{
+    lv_slider_t * ptr = (lv_slider_t *) sliderRangeMode;
+
+    /* Setup group and encoder indev */
+    lv_group_add_obj(g, sliderNormalMode);
+    lv_group_set_editing(g, true);
+
+    lv_test_encoder_click();
+
+    /* Always executed when handling LV_EVENT_RELEASED or
+     * LV_EVENT_PRESS_LOST */
+    TEST_ASSERT_FALSE(ptr->dragging);
+    TEST_ASSERT_NULL(ptr->value_to_set);
+    TEST_ASSERT_EQUAL(0U, ptr->left_knob_focus);
+
+    /* Group leaved edit mode */
+    TEST_ASSERT_FALSE(lv_group_get_editing(g));
+}
+
+void test_slider_range_mode_should_not_leave_edit_mode_if_released_with_no_left_knob_focus(void)
+{
+    lv_slider_t * ptr = (lv_slider_t *) sliderRangeMode;
+
+    /* Setup group and encoder indev */
+    lv_group_add_obj(g, sliderRangeMode);
+    lv_group_set_editing(g, true);
+
+    lv_test_encoder_release();
+    lv_test_indev_wait(50);
+
+    /* Always executed when handling LV_EVENT_RELEASED or
+     * LV_EVENT_PRESS_LOST */
+    TEST_ASSERT_FALSE(ptr->dragging);
+    TEST_ASSERT_NULL(ptr->value_to_set);
+
+    TEST_ASSERT(lv_group_get_editing(g));
+}
+
+void test_slider_normal_mode_should_leave_edit_mode_if_released(void)
+{
+    lv_slider_t * ptr = (lv_slider_t *) sliderNormalMode;
+    ptr->left_knob_focus = 1;
+
+    /* Setup group and encoder indev */
+    lv_group_add_obj(g, sliderNormalMode);
+    lv_group_set_editing(g, true);
+
+    lv_test_encoder_click();
+
+    /* Always executed when handling LV_EVENT_RELEASED or
+     * LV_EVENT_PRESS_LOST */
+    TEST_ASSERT_FALSE(ptr->dragging);
+    TEST_ASSERT_NULL(ptr->value_to_set);
+    TEST_ASSERT_EQUAL(0U, ptr->left_knob_focus);
+
+    /* Group leaved edit mode */
+    TEST_ASSERT_FALSE(lv_group_get_editing(g));
+}
+
+void test_ranged_mode_adjust_with_encoder(void)
+{
+    lv_slider_set_value(sliderRangeMode, 90, LV_ANIM_OFF);
+    lv_slider_set_left_value(sliderRangeMode, 10, LV_ANIM_OFF);
+
+    /* Setup group and encoder indev */
+    lv_group_add_obj(g, sliderRangeMode);
+    lv_group_set_editing(g, false);
+
+    /*Go the edit mode*/
+    lv_test_encoder_click();
+
+    /*Adjust the right knob*/
+    lv_test_encoder_turn(-10);
+    TEST_ASSERT_EQUAL(80, lv_slider_get_value(sliderRangeMode));  /*Updated?*/
+    TEST_ASSERT_EQUAL(10, lv_slider_get_left_value(sliderRangeMode));     /*Maintained?*/
+
+    /*Focus the left knob*/
+    lv_test_encoder_click();
+
+    /*Adjust the left knob*/
+    lv_test_encoder_turn(5);
+    TEST_ASSERT_EQUAL(80, lv_slider_get_value(sliderRangeMode));  /*Maintained?*/
+    TEST_ASSERT_EQUAL(15, lv_slider_get_left_value(sliderRangeMode));  /*Updated?*/
+
+}
+
+void test_normal_mode_slider_hit_test(void)
+{
+    /* Validate if point 0,0 can click in the slider */
+    lv_point_t point = {
+        .x = 0,
+        .y = 0
+    };
+
+    lv_hit_test_info_t info = {
+        .res = false,
+        .point = &point
+    };
+
+    lv_slider_set_value(sliderNormalMode, 100, LV_ANIM_OFF);
+    lv_event_send(sliderNormalMode, LV_EVENT_HIT_TEST, (void *) &info);
+
+    /* point can click slider */
+    TEST_ASSERT(info.res);
+}
+
+void test_slider_range_event_hit_test(void)
+{
+    /* Validate if point 0,0 can click in the slider */
+    lv_point_t point = {
+        .x = 0,
+        .y = 0
+    };
+
+    lv_hit_test_info_t info = {
+        .res = false,
+        .point = &point
+    };
+    lv_event_send(sliderRangeMode, LV_EVENT_HIT_TEST, (void *) &info);
+
+    /* point can click slider in the left knob */
+    TEST_ASSERT(info.res);
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_table.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_table.c
new file mode 100644 (file)
index 0000000..f563718
--- /dev/null
@@ -0,0 +1,247 @@
+#if LV_BUILD_TEST
+#include "../lvgl.h"
+
+#include "unity/unity.h"
+
+static lv_obj_t * scr = NULL;
+static lv_obj_t * table = NULL;
+
+void setUp(void)
+{
+    scr = lv_scr_act();
+    table = lv_table_create(scr);
+}
+
+void tearDown(void)
+{
+    lv_obj_clean(lv_scr_act());
+}
+
+void test_table_should_return_assigned_cell_value(void)
+{
+    uint16_t row = 0;
+    uint16_t column = 0;
+    const char * value = "LVGL";
+
+    lv_table_set_cell_value(table, row, column, value);
+
+    TEST_ASSERT_EQUAL_STRING(value, lv_table_get_cell_value(table, row, column));
+}
+
+void test_table_should_grow_columns_automatically_when_setting_formatted_cell_value(void)
+{
+    /* Newly created tables have 1 column and 1 row */
+    uint16_t original_column_count = lv_table_get_col_cnt(table);
+    TEST_ASSERT_EQUAL_UINT16(1, original_column_count);
+
+    /* Table currently only has a cell at 0,0 (row, colum) */
+    lv_table_set_cell_value_fmt(table, 0, 1, "LVGL %s", "Rocks!");
+
+    /* Table now should have cells at 0,0 and 0,1, so 2 columns */
+    uint16_t expected_column_count = original_column_count + 1;
+    TEST_ASSERT_EQUAL_UINT16(expected_column_count, lv_table_get_col_cnt(table));
+}
+
+void test_table_should_identify_cell_with_ctrl(void)
+{
+    bool has_ctrl = false;
+
+    has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+
+    TEST_ASSERT_FALSE(has_ctrl);
+
+    lv_table_add_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+    has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+    TEST_ASSERT_TRUE(has_ctrl);
+}
+
+void test_table_should_clear_selected_cell_ctrl(void)
+{
+    bool has_ctrl = false;
+
+    lv_table_add_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+    has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+    TEST_ASSERT_TRUE(has_ctrl);
+
+    lv_table_clear_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+    has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+    TEST_ASSERT_FALSE(has_ctrl);
+}
+
+void test_table_should_keep_not_selected_cell_ctrl(void)
+{
+    bool has_ctrl = false;
+
+    lv_table_add_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT | LV_TABLE_CELL_CTRL_TEXT_CROP);
+
+    lv_table_clear_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+    has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+    TEST_ASSERT_FALSE(has_ctrl);
+
+    has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_TEXT_CROP);
+    TEST_ASSERT_TRUE(has_ctrl);
+}
+
+/* We're using a newly created table */
+void test_table_cell_value_should_return_empty_string_when_cell_is_empty(void)
+{
+    TEST_ASSERT_EQUAL_STRING("", lv_table_get_cell_value(table, 0, 0));
+}
+
+void test_table_row_height_should_increase_with_multiline_cell_value(void)
+{
+    lv_table_t * table_ptr = (lv_table_t *) table;
+    const char * singleline_value = "LVGL";
+    const char * multiline_value = "LVGL\nRocks";
+
+    lv_table_set_cell_value(table, 0, 0, singleline_value);
+    lv_coord_t singleline_row_height = table_ptr->row_h[0];
+
+    lv_table_set_cell_value(table, 0, 0, multiline_value);
+    lv_coord_t multiline_row_height = table_ptr->row_h[0];
+
+    TEST_ASSERT_GREATER_THAN(singleline_row_height, multiline_row_height);
+}
+
+void test_table_should_wrap_long_texts(void)
+{
+    lv_table_t * table_ptr = (lv_table_t *) table;
+    const char * long_text = "Testing automatic text wrap with a very long text";
+    const char * small_text = "Hi";
+
+    lv_table_set_col_width(table, 0, 50);
+
+    lv_table_set_cell_value(table, 0, 0, small_text);
+    lv_coord_t row_height = table_ptr->row_h[0];
+
+    lv_table_set_cell_value(table, 0, 0, long_text);
+    lv_coord_t wrapped_row_height = table_ptr->row_h[0];
+
+    /* Row height on cells with wrapped text is bigger than cells with small texts */
+    TEST_ASSERT_GREATER_THAN(row_height, wrapped_row_height);
+}
+
+static void draw_part_event_cb(lv_event_t * e)
+{
+    lv_obj_t * obj = lv_event_get_target(e);
+    lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e);
+    /*If the cells are drawn...*/
+    if(dsc->part == LV_PART_ITEMS) {
+        uint32_t row = dsc->id /  lv_table_get_col_cnt(obj);
+        uint32_t col = dsc->id - row * lv_table_get_col_cnt(obj);
+
+        /*Make the texts in the first cell center aligned*/
+        if(row == 0) {
+            dsc->label_dsc->align = LV_TEXT_ALIGN_CENTER;
+            dsc->rect_dsc->bg_color = lv_color_mix(lv_palette_main(LV_PALETTE_BLUE), dsc->rect_dsc->bg_color, LV_OPA_40);
+            dsc->rect_dsc->bg_opa = LV_OPA_COVER;
+        }
+        /*In the first column align the texts to the right*/
+        else if(col == 0) {
+            dsc->label_dsc->align = LV_TEXT_ALIGN_RIGHT;
+        }
+
+        /*Make every 2nd row grayish*/
+        if(row != 0 && (row % 2 == 0)) {
+            dsc->rect_dsc->bg_color = lv_color_mix(lv_palette_main(LV_PALETTE_RED), dsc->rect_dsc->bg_color, LV_OPA_30);
+            dsc->rect_dsc->bg_opa = LV_OPA_COVER;
+        }
+    }
+}
+
+void test_table_rendering(void)
+{
+    lv_obj_center(table);
+    lv_obj_add_event_cb(table, draw_part_event_cb, LV_EVENT_DRAW_PART_BEGIN, NULL);
+    lv_obj_set_style_border_side(table, LV_BORDER_SIDE_FULL, LV_PART_ITEMS);
+    lv_obj_set_style_pad_all(table, 10, LV_PART_ITEMS);
+    lv_obj_set_style_border_width(table, 5, LV_PART_ITEMS);
+    lv_table_set_col_cnt(table, 5);
+    lv_table_set_row_cnt(table, 5);
+    lv_table_set_col_width(table, 1, 60);
+    lv_table_set_col_width(table, 2, 100);
+
+    lv_table_add_cell_ctrl(table, 0, 1, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+    lv_table_set_cell_value(table, 0, 1, "2 cells are merged");
+
+    lv_table_add_cell_ctrl(table, 1, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+    lv_table_add_cell_ctrl(table, 1, 1, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+    lv_table_add_cell_ctrl(table, 1, 2, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+    lv_table_add_cell_ctrl(table, 1, 3, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
+    lv_table_set_cell_value(table, 1, 0, "5 cells are merged");
+
+    uint32_t i;
+    for(i = 0; i < 5; i++) {
+        lv_table_set_cell_value_fmt(table, 3, i, "%d", i);
+    }
+
+    lv_table_set_cell_value_fmt(table, 2, 3, "Multi\nline text");
+    lv_table_set_cell_value_fmt(table, 2, 4, "Very long text wrapped automatically");
+
+    lv_table_add_cell_ctrl(table, 4, 3, LV_TABLE_CELL_CTRL_TEXT_CROP);
+    lv_table_set_cell_value_fmt(table, 4, 3, "crop crop crop crop crop crop crop crop ");
+
+    TEST_ASSERT_EQUAL_SCREENSHOT("table_1.png");
+}
+
+/* See #3120 for context */
+void test_table_should_reduce_cells(void)
+{
+    const uint16_t initial_col_num = 8;
+    const uint16_t initial_row_num = 1;
+    const uint16_t final_col_num = 4;
+    const uint16_t final_row_num = 1;
+
+    lv_obj_center(table);
+
+    lv_table_set_col_cnt(table, initial_col_num);
+    lv_table_set_row_cnt(table, initial_row_num);
+
+    uint32_t row_idx, col_idx;
+    for(row_idx = 0; row_idx < initial_row_num; row_idx++) {
+        for(col_idx = 0; col_idx < initial_col_num; col_idx++) {
+            lv_table_set_cell_value(table, row_idx, col_idx, "00");
+        }
+    }
+
+    lv_table_set_col_cnt(table, final_col_num);
+    lv_table_set_row_cnt(table, final_row_num);
+
+    for(row_idx = 0; row_idx < final_row_num; row_idx++) {
+        for(col_idx = 0; col_idx < final_col_num; col_idx++) {
+            lv_table_set_cell_value(table, row_idx, col_idx, "00");
+        }
+    }
+}
+
+/* See #3120 for context */
+void test_table_should_reduce_cells_with_more_than_one_row(void)
+{
+    const uint16_t initial_col_num = 8;
+    const uint16_t initial_row_num = 2;
+    const uint16_t final_col_num = 4;
+    const uint16_t final_row_num = 1;
+
+    lv_obj_center(table);
+
+    lv_table_set_col_cnt(table, initial_col_num);
+    lv_table_set_row_cnt(table, initial_row_num);
+
+    uint32_t row_idx, col_idx;
+    for(row_idx = 0; row_idx < initial_row_num; row_idx++) {
+        for(col_idx = 0; col_idx < initial_col_num; col_idx++) {
+            lv_table_set_cell_value(table, row_idx, col_idx, "00");
+        }
+    }
+
+    lv_table_set_col_cnt(table, final_col_num);
+    lv_table_set_row_cnt(table, final_row_num);
+
+    for(row_idx = 0; row_idx < final_row_num; row_idx++) {
+        for(col_idx = 0; col_idx < final_col_num; col_idx++) {
+            lv_table_set_cell_value(table, row_idx, col_idx, "00");
+        }
+    }
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_textarea.c b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_cases/test_textarea.c
new file mode 100644 (file)
index 0000000..99a14d8
--- /dev/null
@@ -0,0 +1,107 @@
+#if LV_BUILD_TEST
+#include "../lvgl.h"
+
+#include "unity/unity.h"
+
+static lv_obj_t * active_screen = NULL;
+static lv_obj_t * textarea = NULL;
+
+static const char * textarea_default_text = "";
+
+void setUp(void)
+{
+    active_screen = lv_scr_act();
+    textarea = lv_textarea_create(active_screen);
+}
+
+void tearDown(void)
+{
+    /* Function run after every test */
+}
+
+void test_textarea_should_have_valid_documented_defualt_values(void)
+{
+    TEST_ASSERT(lv_textarea_get_cursor_click_pos(textarea));
+    TEST_ASSERT_EQUAL(0U, lv_textarea_get_one_line(textarea));
+    /* No placeholder text should be set on widget creation */
+    TEST_ASSERT_EQUAL_STRING(textarea_default_text, lv_textarea_get_placeholder_text(textarea));
+    TEST_ASSERT_EQUAL_STRING(textarea_default_text, lv_textarea_get_text(textarea));
+}
+
+/* When in password mode the lv_textarea_get_text function returns
+ * the actual text, not the bullet characters. */
+void test_textarea_should_return_actual_text_when_password_mode_is_enabled(void)
+{
+    const char * text = "Hello LVGL!";
+
+    lv_textarea_add_text(textarea, text);
+    lv_textarea_set_password_mode(textarea, true);
+
+    TEST_ASSERT_TRUE(lv_textarea_get_password_mode(textarea));
+    TEST_ASSERT_EQUAL_STRING(text, lv_textarea_get_text(textarea));
+}
+
+void test_textarea_should_update_label_style_with_one_line_enabled(void)
+{
+    lv_textarea_t * txt_ptr = (lv_textarea_t *) textarea;
+
+    lv_textarea_add_text(textarea, "Hi");
+    lv_textarea_set_one_line(textarea, true);
+
+    lv_coord_t left_padding = lv_obj_get_style_pad_left(txt_ptr->label, LV_PART_MAIN);
+    lv_coord_t right_padding = lv_obj_get_style_pad_right(txt_ptr->label, LV_PART_MAIN);
+    lv_coord_t line_width = lv_obj_get_width(txt_ptr->label);
+    lv_coord_t expected_size = left_padding + right_padding + line_width;
+
+    TEST_ASSERT(lv_textarea_get_one_line(textarea));
+    TEST_ASSERT_EQUAL_UINT16(expected_size, lv_obj_get_width(txt_ptr->label));
+    TEST_ASSERT_EQUAL_UINT16(lv_pct(100), lv_obj_get_style_min_width(txt_ptr->label, LV_PART_MAIN));
+}
+
+void test_textarea_cursor_click_pos_field_update(void)
+{
+    lv_textarea_set_cursor_click_pos(textarea, false);
+
+    TEST_ASSERT_FALSE(lv_textarea_get_cursor_click_pos(textarea));
+}
+
+void test_textarea_should_update_placeholder_text(void)
+{
+    const char * new_placeholder = "LVGL Rocks!!!!!";
+    const char * text = "Hello LVGL!";
+
+    /* Allocating memory for placeholder text */
+    lv_textarea_set_placeholder_text(textarea, text);
+    TEST_ASSERT_EQUAL_STRING(text, lv_textarea_get_placeholder_text(textarea));
+
+    /* Reallocating memory for the new placeholder text */
+    lv_textarea_set_placeholder_text(textarea, new_placeholder);
+    TEST_ASSERT_EQUAL_STRING(new_placeholder, lv_textarea_get_placeholder_text(textarea));
+
+    /* Freeing allocated memory for placeholder text */
+    lv_textarea_set_placeholder_text(textarea, "");
+    TEST_ASSERT_EQUAL_STRING("", lv_textarea_get_placeholder_text(textarea));
+}
+
+void test_textarea_should_keep_only_accepted_chars(void)
+{
+    const char * accepted_list = "abcd";
+
+    lv_textarea_set_accepted_chars(textarea, accepted_list);
+    lv_textarea_set_text(textarea, "abcde");
+
+    TEST_ASSERT_EQUAL_STRING(accepted_list, lv_textarea_get_text(textarea));
+}
+
+void test_textarea_in_one_line_mode_should_ignore_line_break_characters(void)
+{
+    lv_textarea_set_one_line(textarea, true);
+
+    lv_textarea_add_char(textarea, '\n');
+    TEST_ASSERT_EQUAL_STRING(textarea_default_text, lv_textarea_get_text(textarea));
+
+    lv_textarea_add_char(textarea, '\r');
+    TEST_ASSERT_EQUAL_STRING(textarea_default_text, lv_textarea_get_text(textarea));
+}
+
+#endif
diff --git a/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_files/readtest.txt b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_files/readtest.txt
new file mode 100644 (file)
index 0000000..e398426
Binary files /dev/null and b/2.sdk/Helios_SDK/services/microPython/lib/lvgl/tests/src/test_files/readtest.txt differ
index c644536..ed38885 100644 (file)
@@ -55,6 +55,7 @@ class aLiYun:
         self.mqttObj = True
         self.error_callback = None
         self.reconn = True
+        self.keepalive = 300
         self.listen_task_id = None
 
     def formatConnectInfo(self, secret, randomNum=None):
@@ -73,6 +74,7 @@ class aLiYun:
     def setMqtt(self, clientID=None, clean_session=True, keepAlive=300, reconn=True, pingmaxnum=0, manage=False):
         self.clientID = clientID
         self.reconn = reconn
+        self.keepalive = keepAlive
         if (not self.mqttObj) and (self.mqtt_client != None):
             return self.mqtt_client
         if self.productSecret == None:
@@ -163,13 +165,13 @@ class aLiYun:
                 self.clientID = data.get("clientId")
                 data_info = {"clientId": self.clientID,"deviceToken": self.DeviceToken}
                 save_connwl(data_info)
-                self.setMqtt(self.clientID, manage=True)
+                self.setMqtt(self.clientID, manage=True, keepAlive=self.keepalive)
             else:
                 self.DeviceSecret = data.get("deviceSecret")
                 self.productSecret = None
                 data = {self.DeviceName: self.DeviceSecret}
                 save_Secret(data)  # save DeviceSecret
-                self.setMqtt(self.clientID, manage=True)
+                self.setMqtt(self.clientID, manage=True, keepAlive=self.keepalive)
         else:
             return self.recvCb(topic, msg)
 
index befcc88..7d1fb26 100644 (file)
@@ -45,6 +45,8 @@ def getLocation(*args):
                 return -2
             try:
                 cellinfo = cellLocator_qpy.getCellLocreq(args[2])
+                if isinstance(cellinfo,int) == True:
+                    raise ValueError("error info:getCellLocreq result error!")
                 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                 sockaddr = socket.getaddrinfo(args[0], args[1])[0][-1]
                 if args[3] > 0:
@@ -68,6 +70,7 @@ def getLocation(*args):
                         if not l or l == b"\r\n":
                             break
                     data = sock.recv(1024)
+                    sock.close()
                     # In order to keep consistent with other platforms  burols modify
                     try:
                         return cellLocator_qpy.encodeCellLocreq(data)
@@ -130,6 +133,7 @@ def startLocation(*args):
                         if not l or l == b"\r\n":
                             break
                     data = sock.recv(1024)
+                    sock.close()
                     return cellLocator_qpy.encodeCellLocreq(data)
                 else:
                     if len(l) > 2:
index 9ff5e08..2677d67 100644 (file)
@@ -347,13 +347,13 @@ STATIC mp_obj_t helios_set_pa(size_t n_args, const mp_obj_t *args)
        gpio_struct.value = HELIOS_LVL_LOW;
        
        if(mp_obj_get_int(args[1]) == 0 || mp_obj_get_int(args[1]) > PLAT_GPIO_NUM) {
-               mp_raise_ValueError("invalid pin");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid pin"));
        }
        g_gpio_pa = mp_obj_get_int(args[1]);
        if (n_args == 3)
        {
                if(mp_obj_get_int(args[2]) > 10 || mp_obj_get_int(args[2]) < 0) {
-                       mp_raise_ValueError("Too many PA pulses, limited to 10. [0,10]");
+                       mp_raise_ValueError(MP_ERROR_TEXT("Too many PA pulses, limited to 10. [0,10]"));
                }
         if(g_pa_class == 0 && 0 != mp_obj_get_int(args[2]) && play_state == PA_AUDIO_PLAY) {
             g_pa_class = mp_obj_get_int(args[2]);
@@ -510,7 +510,7 @@ STATIC mp_obj_t helios_audio_set_channel(mp_obj_t self_in, mp_obj_t dev)
 
                if (!audio_channel_check(device))
                {
-                       mp_raise_msg_varg(&mp_type_ValueError, "The current platform does not support device %d.", device);
+                       mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("The current platform does not support device %d."), device);
                }
                
                if(device == HELIOS_OUTPUT_RECEIVER||device == HELIOS_OUTPUT_SPEAKER||device == HELIOS_OUTPUT_HEADPHONE){
@@ -537,14 +537,14 @@ STATIC mp_obj_t audio_make_new(const mp_obj_type_t *type, size_t n_args, size_t
     device = mp_obj_get_int(args[0]);
        
        if (device < 0 || device > 2) {
-               mp_raise_ValueError("invalid device index, the value of device should be in[0,2]");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid device index, the value of device should be in[0,2]"));
        }
        asynch_open_pa_init();
 #if !CONFIG_AUDIO_PWM
 #if !defined(PLAT_EIGEN)
        if (!audio_channel_check(device))
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "The current platform does not support device %d.", device);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("The current platform does not support device %d."), device);
        }
 #endif
 #endif
@@ -603,7 +603,7 @@ STATIC mp_obj_t audio_make_new(const mp_obj_type_t *type, size_t n_args, size_t
                {
                        Helios_Mutex_Delete(audio.queue_mutex);
                        Helios_Mutex_Delete(audio.montage_mutex);
-                       mp_raise_ValueError("create audio object failed, can not create msgQ.");
+                       mp_raise_ValueError(MP_ERROR_TEXT("create audio object failed, can not create msgQ."));
                }
                
                Helios_ThreadAttr attr = {0};
@@ -618,7 +618,7 @@ STATIC mp_obj_t audio_make_new(const mp_obj_type_t *type, size_t n_args, size_t
                        Helios_MsgQ_Delete(audio.queue_msg);
                        Helios_Mutex_Delete(audio.queue_mutex);
                        Helios_Mutex_Delete(audio.montage_mutex);
-                       mp_raise_ValueError("create audio object failed, can not create queue play task.");
+                       mp_raise_ValueError(MP_ERROR_TEXT("create audio object failed, can not create queue play task."));
                }
        }
        
@@ -669,7 +669,7 @@ STATIC mp_obj_t helios_play_file_start(size_t n_args, const mp_obj_t *args, mp_m
        } 
        else 
        {
-               mp_raise_ValueError("invalid data");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid data"));
        }
        GET_FILE_VFS_PATH(new_data, vfs_name);
 
@@ -972,7 +972,7 @@ STATIC mp_obj_t helios_play_stream_start(size_t n_args, const mp_obj_t *args, mp
        if(format != HELIOS_AUDIO_FORMAT_PCM && format != HELIOS_AUDIO_FORMAT_WAVPCM && format != HELIOS_AUDIO_FORMAT_MP3 && format != HELIOS_AUDIO_FORMAT_AMRNB
         && format != HELIOS_AUDIO_FORMAT_AMRWB && format != HELIOS_AUDIO_FORMAT_AAC && format != HELIOS_AUDIO_FORMAT_M4A && format != HELIOS_AUDIO_FORMAT_TS)
        {
-               mp_raise_ValueError("Unsupport format!");
+               mp_raise_ValueError(MP_ERROR_TEXT("Unsupport format!"));
                return mp_obj_new_int(-1);
        }
        
@@ -982,7 +982,7 @@ STATIC mp_obj_t helios_play_stream_start(size_t n_args, const mp_obj_t *args, mp
        if(format != HELIOS_AUDIO_FORMAT_WAVPCM && format != HELIOS_AUDIO_FORMAT_MP3 && format != HELIOS_AUDIO_FORMAT_AMRNB
         && format != HELIOS_AUDIO_FORMAT_AMRWB)
        {
-               mp_raise_ValueError("Unsupport format!");
+               mp_raise_ValueError(MP_ERROR_TEXT("Unsupport format!"));
                return mp_obj_new_int(-1);
        }
 #endif
@@ -992,11 +992,13 @@ STATIC mp_obj_t helios_play_stream_start(size_t n_args, const mp_obj_t *args, mp
        if(vals[ARG_audiobuf].u_obj != mp_const_none) {
                mp_get_buffer_raise(vals[ARG_audiobuf].u_obj, &buff_a, MP_BUFFER_READ);
                if(buff_a.len <= 0 || buff_a.buf == NULL) {
-                       mp_raise_ValueError("invalid audio_buff data");
+                       mp_raise_ValueError(MP_ERROR_TEXT("invalid audio_buff data"));
                }
        }
 #if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+       #if CONFIG_AUDIO_MP3
        Helios_mp3_stream_close_flag(vals[ARG_mode].u_int);
+       #endif
 #endif
        MP_THREAD_GIL_EXIT();
        int ret = Helios_Audio_StreamPlayStart(format, buff_a.buf, buff_a.len, HELIOS_AUDIO_PLAY_TYPE_LOCAL, self->device, audio_play_callback);
@@ -1022,14 +1024,14 @@ STATIC mp_obj_t helios_pcm_para_set(size_t n_args, const mp_obj_t *args, mp_map_
        if(samplerate != 96000 && samplerate != 88200 && samplerate != 64000&& samplerate != 48000 && samplerate != 44100 
                && samplerate != 32000 && samplerate != 22050 && samplerate != 16000 && samplerate != 11025 && samplerate != 8000 && samplerate!=6000)
        {
-               mp_raise_ValueError("Unsupport samplerate!");
+               mp_raise_ValueError(MP_ERROR_TEXT("Unsupport samplerate!"));
                return mp_obj_new_int(-1);
        }
 
        int channels = vals[ARG_channels].u_int;
        if(channels != 2 && channels != 1)
        {
-               mp_raise_ValueError("Unsupport channels!");
+               mp_raise_ValueError(MP_ERROR_TEXT("Unsupport channels!"));
                return mp_obj_new_int(-1);
        }
        
@@ -1110,7 +1112,7 @@ STATIC mp_obj_t helios_set_volume(mp_obj_t self_in, mp_obj_t volume)
        int vol = mp_obj_get_int(volume);
        if (vol < 0 || vol > 11)
        {
-               mp_raise_ValueError("invalid value,TTS volume should be array between [0,11]");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value,TTS volume should be array between [0,11]"));
                return mp_obj_new_int(-1);
        }
        
@@ -1164,7 +1166,7 @@ STATIC mp_obj_t helios_set_ToneVolume(mp_obj_t self_in, mp_obj_t volume)
        int vol = mp_obj_get_int(volume);
        if (vol < 0 || vol > 11)
        {
-               mp_raise_ValueError("invalid value,Tone volume should be array between [0,10]");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value,Tone volume should be array between [0,10]"));
                return mp_obj_new_int(-1);
        }
        
@@ -1440,7 +1442,7 @@ STATIC mp_obj_t helios_aud_tone_play(size_t n_args, const mp_obj_t *p_args, mp_m
 
        if(tone > 22 || tone < 0) 
        {
-               mp_raise_ValueError("Parameter error\n");
+               mp_raise_ValueError(MP_ERROR_TEXT("Parameter error\n"));
                return mp_obj_new_int(-1);
        }
        
@@ -1550,7 +1552,7 @@ STATIC mp_obj_t helios_setGainTabel(size_t n_args, const mp_obj_t *args, mp_map_
        
        HELIOS_AUDIO_LOG("gain para count = %d\n",n_args);
        if(n_args != 14) {
-               mp_raise_ValueError("Please enter complete parameters, including the gain corresponding to ID and volume (0-11)");
+               mp_raise_ValueError(MP_ERROR_TEXT("Please enter complete parameters, including the gain corresponding to ID and volume (0-11)"));
        }
 
        HELIOS_AUDIO_LOG("gain id[%d]\n",mp_obj_get_int(args[1]));
@@ -1559,7 +1561,7 @@ STATIC mp_obj_t helios_setGainTabel(size_t n_args, const mp_obj_t *args, mp_map_
                gain[i] = mp_obj_get_int(args[i+2]);
                HELIOS_AUDIO_LOG("gain para[%d]:%d\n",i,gain[i]);
                if (gain[i] < -26 || gain[i] > 23) {
-                       mp_raise_ValueError("gain error, gain is out (-26db-23db)");
+                       mp_raise_ValueError(MP_ERROR_TEXT("gain error, gain is out (-26db-23db)"));
                        return mp_obj_new_int(-1);
                }
        }
@@ -1583,7 +1585,7 @@ STATIC mp_obj_t helios_setGainTabel(size_t n_args, const mp_obj_t *args, mp_map_
        
        HELIOS_AUDIO_LOG("gain para count = %d\n",n_args);
        if(n_args != 13) {
-               mp_raise_ValueError("Please enter complete parameters, including the gain corresponding to ID and volume (0-11)");
+               mp_raise_ValueError(MP_ERROR_TEXT("Please enter complete parameters, including the gain corresponding to ID and volume (0-11)"));
        }
 
        HELIOS_AUDIO_LOG("gain id[%d]\n",mp_obj_get_int(args[1]));
@@ -1592,7 +1594,7 @@ STATIC mp_obj_t helios_setGainTabel(size_t n_args, const mp_obj_t *args, mp_map_
                gain[i] = mp_obj_get_int(args[i+2]);
                HELIOS_AUDIO_LOG("gain para[%d]:%d\n",i,gain[i]);
                if (gain[i] < -36 || gain[i] > 36) {
-                       mp_raise_ValueError("gain error, gain is out (-36db-36db)");
+                       mp_raise_ValueError(MP_ERROR_TEXT("gain error, gain is out (-36db-36db)"));
                        return mp_obj_new_int(-1);
                }
        }
@@ -2312,11 +2314,11 @@ static mp_obj_t helios_play_montage_file_start(size_t n_args, const mp_obj_t *ar
 
        if(vals[ARG_priority].u_int > 4)
        {
-               mp_raise_ValueError("invalid priority,must be in 0~4");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid priority,must be in 0~4"));
        }
        if(vals[ARG_breakin].u_int > 1)
        {
-               mp_raise_ValueError("invalid breakin,must be in 0~1");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid breakin,must be in 0~1"));
        }
        audio_obj_t *self = MP_OBJ_TO_PTR(args[0]);
     int new_priority = vals[ARG_priority].u_int;
@@ -2331,7 +2333,7 @@ static mp_obj_t helios_play_montage_file_start(size_t n_args, const mp_obj_t *ar
     }
     else
     {
-        mp_raise_ValueError("invalid data");
+        mp_raise_ValueError(MP_ERROR_TEXT("invalid data"));
     }
     // GET_FILE_VFS_PATH(new_data, vfs_name);
     memcpy(vfs_name, new_data, strlen(new_data));
@@ -2342,7 +2344,7 @@ static mp_obj_t helios_play_montage_file_start(size_t n_args, const mp_obj_t *ar
     }
     else
     {
-        mp_raise_ValueError("invalid montage fail");
+        mp_raise_ValueError(MP_ERROR_TEXT("invalid montage fail"));
     }
     GET_FILE_VFS_PATH(new_monFile, vfs_monFile);
 
@@ -2350,7 +2352,7 @@ static mp_obj_t helios_play_montage_file_start(size_t n_args, const mp_obj_t *ar
     if (NULL == fp)
     {
         HELIOS_AUDIO_LOG("montage(%s) does not exist\n", vfs_monFile);
-        mp_raise_ValueError("monatage file does not exist");
+        mp_raise_ValueError(MP_ERROR_TEXT("monatage file does not exist"));
     } else {
         Helios_fclose(fp);
     }
@@ -2601,6 +2603,7 @@ static MP_DEFINE_CONST_FUN_OBJ_KW(helios_play_montage_file_start_obj, 1, helios_
 //================================montage Handel end=====================================================
 
 #if defined (PLAT_ASR) || defined(PLAT_ASR_1606)
+#if CONFIG_AUDIO_MP3
 STATIC mp_obj_t helios_aud_mp3_clear_cache(mp_obj_t self_in)
 {
        int ret = Helios_mp3_Clear_Cache();
@@ -2617,6 +2620,7 @@ STATIC mp_obj_t helios_aud_mp3_cache_size(mp_obj_t self_in)
 
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_aud_cache_size_obj, helios_aud_mp3_cache_size);
 #endif
+#endif
 
 
 const mp_obj_type_t audio_audio_pcm;
@@ -2652,8 +2656,10 @@ STATIC const mp_rom_map_elem_t audio_locals_dict_table[] = {
        { MP_ROM_QSTR(MP_QSTR_aud_tone_play), MP_ROM_PTR(&mp_helios_aud_tone_play_obj) },
        { MP_ROM_QSTR(MP_QSTR_aud_tone_play_stop), MP_ROM_PTR(&helios_aud_tone_play_stop_obj) },
 #if defined (PLAT_ASR) || defined(PLAT_ASR_1606)
+       #if CONFIG_AUDIO_MP3
        { MP_ROM_QSTR(MP_QSTR_aud_cache_clear), MP_ROM_PTR(&helios_aud_clear_cache_obj) },
        { MP_ROM_QSTR(MP_QSTR_aud_cache_size), MP_ROM_PTR(&helios_aud_cache_size_obj) },
+       #endif
 #endif
 #endif
 #if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05)
@@ -2759,23 +2765,23 @@ STATIC void machine_pcm_init_helper(machine_pcm_obj_t *self, size_t n_args, cons
     mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
 
        if(args[ARG_channel].u_int != 1 && args[ARG_channel].u_int != 2) {
-               mp_raise_ValueError("invalid channels");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid channels"));
        }
        
        if(true != is_support_samplerate(args[ARG_samplerate].u_int)) {
-               mp_raise_ValueError("invalid samplerate");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid samplerate"));
        }
 
        if(args[ARG_flags].u_int >= PCM_FLAG_MAX) {
-               mp_raise_ValueError("invalid flag");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid flag"));
        }
 
        if(args[ARG_mode].u_int != QL_PCM_BLOCK_FLAG && args[ARG_mode].u_int != QL_PCM_NONBLOCK_FLAG){
-               mp_raise_ValueError("invalid mode, Value range [1,2]. 1: BLOCK 2:NOBLOCK");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid mode, Value range [1,2]. 1: BLOCK 2:NOBLOCK"));
        }
 
        if(args[ARG_periodcnt].u_int < 2 || args[ARG_periodcnt].u_int > 25){
-               mp_raise_ValueError("invalid periodcnt, Value range [2,25]");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid periodcnt, Value range [2,25]"));
        }
 
        self->channels = args[ARG_channel].u_int;
@@ -2799,7 +2805,7 @@ STATIC void machine_pcm_init_helper(machine_pcm_obj_t *self, size_t n_args, cons
                                self->handle_read = Helios_PCM_Open(&pcm_info, QL_PCM_READ_FLAG|args[ARG_mode].u_int);
 #endif
                                if(NULL == self->handle_read) {
-                               mp_raise_ValueError("pcm open read only fail");
+                               mp_raise_ValueError(MP_ERROR_TEXT("pcm open read only fail"));
                        }
                        self->handle_write = NULL;
                break;
@@ -2810,7 +2816,7 @@ STATIC void machine_pcm_init_helper(machine_pcm_obj_t *self, size_t n_args, cons
                        self->handle_write = Helios_PCM_Open(&pcm_info, QL_PCM_WRITE_FLAG|args[ARG_mode].u_int);
 #endif
                        if(NULL == self->handle_write) {
-                               mp_raise_ValueError("pcm open write only fail");
+                               mp_raise_ValueError(MP_ERROR_TEXT("pcm open write only fail"));
                        }
                        self->handle_read = NULL;
                break;
@@ -2821,7 +2827,7 @@ STATIC void machine_pcm_init_helper(machine_pcm_obj_t *self, size_t n_args, cons
                        self->handle_read = Helios_PCM_Open(&pcm_info, QL_PCM_READ_FLAG|args[ARG_mode].u_int);
 #endif
                        if(NULL == self->handle_read) {
-                               mp_raise_ValueError("pcm open read fail");
+                               mp_raise_ValueError(MP_ERROR_TEXT("pcm open read fail"));
                        }
 #if CONFIG_AUDIO
                        self->handle_write = Helios_PCM_Open(pcm_info.channels, pcm_info.samplerate, QL_PCM_WRITE_FLAG|args[ARG_mode].u_int);
@@ -2829,7 +2835,7 @@ STATIC void machine_pcm_init_helper(machine_pcm_obj_t *self, size_t n_args, cons
                        self->handle_write = Helios_PCM_Open(&pcm_info, QL_PCM_WRITE_FLAG|args[ARG_mode].u_int);
 #endif
                        if(NULL == self->handle_write) {
-                               mp_raise_ValueError("pcm open write fail");
+                               mp_raise_ValueError(MP_ERROR_TEXT("pcm open write fail"));
                        }
                break;          
                }
@@ -2844,7 +2850,7 @@ STATIC mp_obj_t pcm_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_
     mic_channel = mp_obj_get_int(args[0]);
        
        if (mic_channel < 0 || mic_channel >= MIC_CHANNEL_MAX) {
-               mp_raise_ValueError("Wrong mic channel, value range [0-2]. 0: Automatic 1: Headset 2: receiver");
+               mp_raise_ValueError(MP_ERROR_TEXT("Wrong mic channel, value range [0-2]. 0: Automatic 1: Headset 2: receiver"));
        }
 
        machine_pcm_obj_t *self = m_new_obj_with_finaliser(machine_pcm_obj_t);
@@ -2865,7 +2871,7 @@ STATIC mp_uint_t audio_pcm_read(mp_obj_t self_in, void *buf_in, mp_uint_t size,
 
        
        if(self->flags == PCM_FLAG_WRITE_ONLY || self->handle_read == NULL) {
-               mp_raise_ValueError("This pcm only supports write operations");
+               mp_raise_ValueError(MP_ERROR_TEXT("This pcm only supports write operations"));
        }
 
     // make sure we want at least 1 char
@@ -2888,7 +2894,7 @@ STATIC mp_uint_t audio_pcm_write(mp_obj_t self_in, const void *buf_in, mp_uint_t
     machine_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
 
        if(self->flags == PCM_FLAG_READ_ONLY || self->handle_read == NULL) {
-               mp_raise_ValueError("This pcm only supports read operations");
+               mp_raise_ValueError(MP_ERROR_TEXT("This pcm only supports read operations"));
        }
        int bytes_written = Helios_PCM_Write(self->handle_write, (void*)buf_in, size);
     if (bytes_written < 0) {
index fbbc66d..b46bf99 100644 (file)
@@ -136,6 +136,7 @@ extern int Helios_Audio_MontageFilePlayStart(char *montage_name, char *file_name
 void helios_audio_play_queue(void)
 {
        int i = 0, ret = 0;
+       char *mondata = NULL;
        HELIOS_AUDIO_QUEUE_LOG("---- enter queue. ----\r\n");
        for (i=QUEUE_NUMS-1; i>=0; i--)
        {
@@ -145,7 +146,9 @@ void helios_audio_play_queue(void)
                        uint8_t front = (audio.audio_queue[i].front + 1) % QUEUE_SIZE;
                        uint8_t audio_type = audio.audio_queue[i].audio_data[front].audio_type;
                        int   mode = audio.audio_queue[i].audio_data[front].mode;
+                       
                        int len = strlen(audio.audio_queue[i].audio_data[front].data);
+                       
                        char *data = calloc(1, len+16);
                        if (data) {
                                memset(data, 0, len+16);
@@ -154,15 +157,18 @@ void helios_audio_play_queue(void)
                        else {
                                HELIOS_AUDIO_QUEUE_LOG("calloc fault\r\n");
                        }
-                       len = strlen(audio.audio_queue[i].audio_data[front].montage);
-                       char *mondata = calloc(1, len+16);
-                       if (mondata) {
-                               memset(mondata, 0, len+16);
-                               strncpy(mondata, audio.audio_queue[i].audio_data[front].montage, len);
-                       }
-                       else {
-                               HELIOS_AUDIO_QUEUE_LOG("calloc fault\r\n");
+                       if (audio.audio_queue[i].audio_data[front].montage != NULL) {
+                               len = strlen(audio.audio_queue[i].audio_data[front].montage);
+                               mondata = calloc(1, len+16);
+                               if (mondata) {
+                                       memset(mondata, 0, len+16);
+                                       strncpy(mondata, audio.audio_queue[i].audio_data[front].montage, len);
+                               }
+                               else {
+                                       HELIOS_AUDIO_QUEUE_LOG("calloc fault\r\n");
+                               }
                        }
+                       
                        uint8_t device = audio.audio_queue[i].audio_data[front].device;
                        audio.cur_priority = audio.audio_queue[i].audio_data[front].priority;
                        audio.cur_breakin  = audio.audio_queue[i].audio_data[front].breakin;
index 5e9786d..070426f 100644 (file)
@@ -28,6 +28,7 @@
 #include "helios_os.h"
 #include "stackctrl.h"
 #include "py/runtime.h"
+#include "py/gc.h"
 #include "callbackdeal.h"
 #if MICROPY_ENABLE_CALLBACK_DEAL
 
@@ -116,8 +117,102 @@ int qpy_send_msg_to_callback_deal_thread(uint8_t id, void *msg)
     }
        return ret;
 }
-bool mp_sched_empty(void);
 
+
+st_CallBack_LoadBoundMeth * qpy_callback_para_node_add(c_callback_t *callback, mp_obj_t arg)
+{
+    st_CallBack_LoadBoundMeth *loadboundmet_msg = calloc(1, sizeof(st_CallBack_LoadBoundMeth));
+    if(NULL == loadboundmet_msg)
+    {
+        return NULL;
+    }
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+    int rc = Helios_Critical_Enter();
+#endif
+    loadboundmet_msg->next = (st_CallBack_LoadBoundMeth *)MP_STATE_PORT(loadmeth_para);
+    loadboundmet_msg->callback = callback;
+    loadboundmet_msg->arg = arg;
+    MP_STATE_PORT(loadmeth_para) = (void *)loadboundmet_msg;
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+    Helios_Critical_Exit(rc);
+#endif
+
+    return loadboundmet_msg;
+}
+
+
+void qpy_callback_para_node_delete(st_CallBack_LoadBoundMeth *cb_msg)
+{
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+    int rc = Helios_Critical_Enter();
+#endif
+    st_CallBack_LoadBoundMeth *loadmeth_para_head = (st_CallBack_LoadBoundMeth *)MP_STATE_PORT(loadmeth_para);
+    st_CallBack_LoadBoundMeth *loadmeth_para_tmp = loadmeth_para_head;
+    for(;loadmeth_para_head != NULL; loadmeth_para_head = loadmeth_para_head->next)
+    {
+        if(loadmeth_para_head == cb_msg)
+        {
+            if(loadmeth_para_head == (st_CallBack_LoadBoundMeth *)MP_STATE_PORT(loadmeth_para))
+            {
+                MP_STATE_PORT(loadmeth_para) = loadmeth_para_head->next;
+            }
+            else
+            {
+                loadmeth_para_tmp->next = loadmeth_para_head->next;
+            }
+            break;
+        }
+        loadmeth_para_tmp = loadmeth_para_head;
+    }
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+    Helios_Critical_Exit(rc);
+#endif
+
+}
+
+void qpy_callback_para_link_mark_in_used(void)
+{
+
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+   int rc = Helios_Critical_Enter();
+#endif
+   st_CallBack_LoadBoundMeth *loadmeth_para_head = (st_CallBack_LoadBoundMeth *)MP_STATE_PORT(loadmeth_para);
+   for(;loadmeth_para_head != NULL; loadmeth_para_head = loadmeth_para_head->next)
+   {
+       if(NULL != loadmeth_para_head->arg)
+       {
+           gc_collect_root((void **)&loadmeth_para_head->arg, 1);
+       }
+   }
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+   Helios_Critical_Exit(rc);
+#endif
+
+}
+
+
+void qpy_callback_para_link_free_all(void)
+{
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+    int rc = Helios_Critical_Enter();
+#endif
+    st_CallBack_LoadBoundMeth *loadmeth_para_head = (st_CallBack_LoadBoundMeth *)MP_STATE_PORT(loadmeth_para);
+    st_CallBack_LoadBoundMeth *loadmeth_para_tmp = NULL;
+    while(loadmeth_para_head != NULL)
+    {
+        loadmeth_para_tmp = loadmeth_para_head;
+        loadmeth_para_head = loadmeth_para_head->next;
+        free(loadmeth_para_tmp);
+    }
+    MP_STATE_PORT(loadmeth_para) = NULL;
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+    Helios_Critical_Exit(rc);
+#endif
+
+}
+
+
+bool mp_sched_empty(void);
 /*
  * Resolve the crash issue when non-Python threads apply for GC memory and throw exceptions when memory application fails
  */
@@ -348,34 +443,10 @@ void qpy_callback_deal_thread(void * args_in)
                            case CALLBACK_TYPE_ID_LOAD_BOUNDMETH:
                            {
                                st_CallBack_LoadBoundMeth *cb_msg = (st_CallBack_LoadBoundMeth *)msg.msg;
-                               mp_obj_t cb = mp_load_attr(cb_msg->callback->method_self, cb_msg->callback->method_name);
 
-#if 0
-                    #if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
-                    int rc = Helios_Critical_Enter();
-                    #endif
-                               st_CallBack_LoadBoundMeth *loadmeth_para_head = (st_CallBack_LoadBoundMeth *)MP_STATE_PORT(loadmeth_para);
-                               st_CallBack_LoadBoundMeth *loadmeth_para_tmp = loadmeth_para_head;
-                               for(;loadmeth_para_head != NULL; loadmeth_para_head = loadmeth_para_head->next)
-                               {
-                        if(loadmeth_para_head == cb_msg)
-                        {
-                                                       if(loadmeth_para_head == (st_CallBack_LoadBoundMeth *)MP_STATE_PORT(loadmeth_para))
-                            {
-                                MP_STATE_PORT(loadmeth_para) = loadmeth_para_head->next;
-                            }
-                                                       else
-                                                       {
-                                                               loadmeth_para_tmp->next = loadmeth_para_head->next;
-                                                       }
-                            break;
-                        }
-                        loadmeth_para_tmp = loadmeth_para_head;
-                               }
-                               #if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
-                               Helios_Critical_Exit(rc);
-                               #endif
-#endif                    
+                    qpy_callback_para_node_delete(cb_msg);
+                               
+                               mp_obj_t cb = mp_load_attr(cb_msg->callback->method_self, cb_msg->callback->method_name);
                     mp_call_function_1_protected(cb, cb_msg->arg);
                                break;
                            }
index bf6ad96..fb282a5 100644 (file)
@@ -246,6 +246,9 @@ void qpy_callback_deal_init(void);
 void qpy_callback_deal_deinit(void);
 int qpy_send_msg_to_callback_deal_thread(uint8_t id, void *msg);
 bool qpy_is_callback_deal_thread(void);
-
+st_CallBack_LoadBoundMeth * qpy_callback_para_node_add(c_callback_t *callback, mp_obj_t arg);
+void qpy_callback_para_node_delete(st_CallBack_LoadBoundMeth *cb_msg);
+void qpy_callback_para_link_free_all(void);
+void qpy_callback_para_link_mark_in_used(void);
 #endif
 #endif //__CALLBACKDEAL_H__
\ No newline at end of file
index 39bbbfd..c7537c5 100644 (file)
@@ -58,6 +58,7 @@ void gc_stacktop_set(void * ptr)
 {
     MP_STATE_PORT(global_stacktop_ptr) = ptr;
 }
+#include "helios_debug.h"
 
 void gc_collect(void) {
     // get current time, in case we want to time the GC
@@ -68,6 +69,7 @@ void gc_collect(void) {
        int val = 0;
 #endif
     // start the GC
+    _ql_app_log("gc_collect --start th_id:%x", Helios_Thread_GetID());
     gc_collect_start();
 #if defined(PLAT_ECR6600)
        uintptr_t sp = (uintptr_t)&val;
@@ -95,8 +97,9 @@ void gc_collect(void) {
     #endif
 
     // end the GC
+    _ql_app_log("gc_collect --end1 th_id:%x", Helios_Thread_GetID());
     gc_collect_end();
-
+    _ql_app_log("gc_collect --end2 th_id:%x", Helios_Thread_GetID());
     #if 0
     // print GC info
     uint32_t ticks = mp_hal_ticks_us() - start;
index 13e9592..e57a7f7 100644 (file)
@@ -811,7 +811,7 @@ locator_encodeinfo_struct locator_info_encode(void *info, uint8_t loc_method, ui
 
     len = QTlv_Serialize_BaseInfo_Buf(&(baseinfo_req), basicBuf);
     tag.tag_value = BER_LOC_BASIC_TAG;
-    buf_len_1 = tlv_serialize_tlv_buffer(&tag, len, basicBuf,len, &buf_1);
+    buf_len_1 = tlv_serialize_tlv_buffer(&tag, len, basicBuf, len, &buf_1);
     if(buf_len_1 <= 0)
     {
         QPY_MODLBS_LOG("serialize buffer Fail \r\n");
@@ -867,30 +867,44 @@ locator_encodeinfo_struct locator_info_encode(void *info, uint8_t loc_method, ui
    
     if (loc_method == Q_LOC_MOD_CELL)
     {
-        tlv_cellinfo_struct *cellinfo = (tlv_cellinfo_struct *)info;
-        unsigned char cellBuf[32];
-        len = Tlv_Serialize_CellInfo_Buf(cellinfo, cellBuf);
-        QPY_MODLBS_LOG("radio_type:%d, mcc=%d, mnc=%d, lac=%d, cellid=%d, bcch=%d, signal=%d, ta=%d\n", cellinfo->radio_type, \
-        cellinfo->mcc, cellinfo->mnc,cellinfo->lac, cellinfo->cellId, cellinfo->bcch,cellinfo->signal, cellinfo->timead);
-        QTlv_data_encryption_xor(baseinfo_req.key_index, cellBuf, cellBuf, len);
-        tag.tag_value = BER_LOC_CELL1_TAG;
-        buf_len_2 = tlv_serialize_tlv_buffer(&tag, len, cellBuf, len, &buf_2);
-        if(buf_len_2 <=0)
-        {
-            SAFE_FREE(buf_1);
-            mp_raise_ValueError("cellinfo tlv_buffer Fail.");
-        }
-        else
-        {
-            buf_1 = tlv_realloc_memory(buf_1,buf_len_1,buf_2,buf_len_2);
-            if (!buf_1)
-            {
-                SAFE_FREE(buf_1);
-                SAFE_FREE(buf_2);
-                mp_raise_ValueError("cellinfo memory Fail.");
-            }
-            buf_len_1 += buf_len_2;
-        }
+        tlv_cellinfos_struct *cell = (tlv_cellinfos_struct *)info;
+        unsigned char cellBuf[32] = {0};
+               uint8_t i = 0;
+               
+               for (i=0; i<cell->num; i++)
+               {
+               QPY_MODLBS_LOG("[%d]radio_type:%d, mcc=%d, mnc=%d, lac=%d, cellid=%d, bcch=%d, signal=%d, ta=%d\n", i,\
+                               cell->cellinfo[i].radio_type, \
+                       cell->cellinfo[i].mcc, \
+                       cell->cellinfo[i].mnc, \
+                       cell->cellinfo[i].lac, \
+                       cell->cellinfo[i].cellId, \
+                       cell->cellinfo[i].bcch, \
+                       cell->cellinfo[i].signal, \
+                       cell->cellinfo[i].timead);
+                       
+                       memset((void *)cellBuf, 0, sizeof(cellBuf));
+               len = Tlv_Serialize_CellInfo_Buf(&cell->cellinfo[i], cellBuf);
+                       QTlv_data_encryption_xor(baseinfo_req.key_index, cellBuf, cellBuf, len);
+               tag.tag_value = BER_LOC_CELL1_TAG + i;
+               buf_len_2 = tlv_serialize_tlv_buffer(&tag, len, cellBuf, len, &buf_2);
+               if(buf_len_2 <= 0)
+               {
+                   SAFE_FREE(buf_1);
+                   mp_raise_ValueError("cellinfo tlv_buffer Fail.");
+               }
+               else
+               {
+                   buf_1 = tlv_realloc_memory(buf_1, buf_len_1, buf_2, buf_len_2);
+                   if (!buf_1)
+                   {
+                       SAFE_FREE(buf_1);
+                       SAFE_FREE(buf_2);
+                       mp_raise_ValueError("cellinfo memory Fail.");
+                   }
+                   buf_len_1 += buf_len_2;
+               }
+               }
     }
     else if (loc_method == Q_LOC_MOD_WIFI)
     {
@@ -964,8 +978,8 @@ locator_encodeinfo_struct locator_info_encode(void *info, uint8_t loc_method, ui
     memset(serialBuf, 0, 64);
     if (loc_method == Q_LOC_MOD_CELL)
     {
-        tlv_cellinfo_struct *cellinfo = (tlv_cellinfo_struct *)info;
-        retLen = Tlv_Serialize_CellInfo_Buf(cellinfo, serialBuf);
+        tlv_cellinfos_struct *cell = (tlv_cellinfos_struct *)info;
+        retLen = Tlv_Serialize_CellInfo_Buf(&cell->cellinfo[0], serialBuf);
     }
     else if (loc_method == Q_LOC_MOD_WIFI)
     {
@@ -1090,6 +1104,7 @@ int32_t tlv_parse_to_tree(const uint8_t* buffer, uint32_t bufSize, QTLVNode** ro
                 if (0 >= tagused)
                 {
                     mp_raise_ValueError("WiFi-Scan TLV ber_fetch_tag Fail.");
+                    return -1;
                 }
                 else
                 {
@@ -1107,6 +1122,7 @@ int32_t tlv_parse_to_tree(const uint8_t* buffer, uint32_t bufSize, QTLVNode** ro
                 if (0 >= lenused)
                 {
                     mp_raise_ValueError("WiFi-Scan TLV ber_fetch_length Fail.");
+                    return -1;
                 }
                 else
                 {
@@ -1123,6 +1139,7 @@ int32_t tlv_parse_to_tree(const uint8_t* buffer, uint32_t bufSize, QTLVNode** ro
                     if (!ktlvNode->value)
                     {
                         mp_raise_ValueError("WiFi-Scan TLV malloc Fail.");
+                                               return -1;
                     }
 
                     memcpy(ktlvNode->value, buffer+currentIndex, ktlvNode->length);
@@ -1134,12 +1151,14 @@ int32_t tlv_parse_to_tree(const uint8_t* buffer, uint32_t bufSize, QTLVNode** ro
                         if (start == 0)
                         {
                             mp_raise_ValueError("WiFi-Scan TLV server status Fail.");
+                            return -1;
                         }
                         else if (start >= POS_POS_NUM_10)
                         {
                             char ret_buf[60];
                             sprintf(ret_buf, "WiFi-Scan token %d Fail.",start);
                             mp_raise_ValueError(ret_buf);
+                            return -1;
                         }
                     }
                     else if (ktlvNode->tag.tag_value == BER_POS_BASIC_TAG)
@@ -1175,6 +1194,10 @@ int32_t tlv_parse_to_tree(const uint8_t* buffer, uint32_t bufSize, QTLVNode** ro
                         decodeLen += sizeof(uint16_t);
                         //QPY_MODLBS_LOG("position.longitude [%f] latitude [%f]\r\n", position_rec.longitude, position_rec.latitude);
                         //QPY_MODLBS_LOG("position.accuracy [%d]\r\n", position_rec.accuracy);
+                        if (!bFirst)
+                        {
+                            insertNode = insertNode->AddBrother(insertNode, ktlvNode);
+                        }
                         return 0;
                     }
 
@@ -1205,4 +1228,30 @@ int32_t tlv_parse_to_tree(const uint8_t* buffer, uint32_t bufSize, QTLVNode** ro
 
     return -1;
 }
+
+static void tlv_safe_delete_node(QTLVNode* node)
+{
+       if (  node == NULL ){
+        return ;
+    }
+       SAFE_FREE(node->value);
+       SAFE_FREE(node);
+}
+
+static void tlv_destroy_tree(QTLVNode* root)
+{
+       QTLVNode* node = root;
+       while(node != NULL)
+       {
+               QTLVNode* tempNode = NULL;
+
+               tlv_destroy_tree(node->child);
+               tempNode = node;
+               node = node->next;
+               tlv_safe_delete_node(tempNode);
+       }
+}
+void QTLVNode_Destroy(QTLVNode* root){
+    tlv_destroy_tree(root);
+}
 #endif /* MICROPY_QPY_MODULE_WIFILOCATOR */
index f0a7237..e8400f3 100644 (file)
@@ -74,6 +74,9 @@
 #define MAX_RAW_KEY_NUM     (8) /*加扰key的总个�?*/
 #define XOR_KEY_LEN         (8) /*异或加解密的KEY长度*/
 
+#define LBS_MAX_CELL_NUM       6
+#define LBS_MAX_WIFI_NUM       6
+
 static uint8_t xor_key[MAX_RAW_KEY_NUM][XOR_KEY_LEN] =
 { 
     {0x01,0x03,0xef,0xfe,0x12,0x34,0x66,0x88},
@@ -201,6 +204,12 @@ typedef struct
        uint16_t earfcn;//used for lte
 }tlv_cellinfo_struct;
 
+typedef struct
+{
+       uint8_t num;
+       tlv_cellinfo_struct cellinfo[LBS_MAX_CELL_NUM];
+}tlv_cellinfos_struct;
+
 enum {
     NETWORK_MODE_UNKNOWN,
     NETWORK_MODE_GSM,
@@ -297,7 +306,7 @@ int32_t tlv_parse_to_tree(const uint8_t* buffer, uint32_t bufSize, QTLVNode** ro
 uint8_t* tlv_realloc_memory(uint8_t* buf1, uint32_t buf1Len, uint8_t* buf2, uint32_t buf2Len);
 
 QTLVNode* QTLVNode_Create(void);
-
+void QTLVNode_Destroy(QTLVNode* root);
 void wifi_hex_to_str(unsigned char *pbDest, unsigned char *pbSrc, int nLen);
 
 /* MD5*/
index a845dad..5fa3770 100644 (file)
 #include "callbackdeal.h"
 
 
-#if defined(BOARD_EC600MCN_LA_POC_XBND)
-#include "helios_os.h"
-#include "poc.h"
-extern Helios_ThreadAttr thread_poc_speak_t;
-extern Helios_Thread_t thread_poc_speak_ctl_t;
-extern Helios_MsgQ_t msg_poc_speak_t;
-extern PTT_CFG_T ptt_cfg;
-#endif
-
-
 #define EXTINT_LOG(msg, ...)      custom_log("extint", msg, ##__VA_ARGS__)
 
 
@@ -102,36 +92,6 @@ enum {
 
 #endif
 
-//彬其  PTT  回调里处理poc speak
-#if defined(BOARD_EC600MCN_LA_POC_XBND)  
-#define extra_deal(x,y)                                                                                       \
-       if((ptt_cfg.speak_deal_mode == DEAL_BY_CALLBACK) && (ptt_cfg.key_type == TYPE_GPIO))                      \
-    {                                                                                                         \
-                       unsigned char data = 0;                                                                           \
-                       if(x == ptt_cfg.gpio_key_info.gpio_num)                                                           \
-                       {                                                                                                         \
-                                if(y == HELIOS_EXTINT_FALLING)                                                               \
-                                {                                                                                            \
-                                                if(msg_poc_speak_t)                                                                  \
-                                            {                                                                                    \
-                                                data = (ptt_cfg.gpio_key_info.level_press == PRESS_LEVEL_LOW) ? 1 : 0;           \
-                                                        Helios_MsgQ_Put(msg_poc_speak_t, &data, sizeof(unsigned char), HELIOS_NO_WAIT);  \
-                                            }                                                                                    \
-                                }                                                                                            \
-                                else                                                                                         \
-                                {                                                                                            \
-                                           if(msg_poc_speak_t)                                                                   \
-                                           {                                                                                     \
-                                               data = (ptt_cfg.gpio_key_info.level_press == PRESS_LEVEL_LOW) ? 0 : 1;            \
-                                                       Helios_MsgQ_Put(msg_poc_speak_t, &data, sizeof(unsigned char), HELIOS_NO_WAIT);   \
-                                           }                                                                                     \
-                                }                                                                                            \
-                       }                                                                                                 \
-     }                                                                                                                          
-#else
-#define extra_deal(x,y) 
-#endif 
-
 
 
 #define HANDLER_FUN(X)                                                                                                                                     \
@@ -164,7 +124,6 @@ static void handler##X(void)
        {                                                                                                   \
                EXTINT_CALLBACK_OP(X, edge);                                                        \
        }                                                                                                                                                                   \
-     extra_deal(X,edge);                                                                    \
        Helios_ExtInt_Enable(extint_obj[X]->line);                                              \
 }                                                                                           
 
@@ -296,7 +255,7 @@ STATIC mp_obj_t extint_make_new(const mp_obj_type_t *type, size_t n_args, size_t
 
 #if !defined(PLAT_ECR6600)
        if (vals[0].u_int < HELIOS_GPIO0 || vals[0].u_int > HELIOS_GPIOMAX) {
-               mp_raise_ValueError("invalid pin value");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid pin value"));
        }
 #endif
 
@@ -310,12 +269,12 @@ STATIC mp_obj_t extint_make_new(const mp_obj_type_t *type, size_t n_args, size_t
        
        self->mode = vals[1].u_int;
        if (self->mode < HELIOS_EDGE_RISING || self->mode > HELIOS_EDGE_BOTH) {
-               mp_raise_ValueError("invalid mode value");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid mode value"));
        }
        
        self->pull = vals[2].u_int;
        if (self->pull < HELIOS_PULL_NONE || self->pull > HELIOS_PULL_DOWN) {
-               mp_raise_ValueError("invalid pull value");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid pull value"));
        }
        
     mp_sched_schedule_callback_register(&self->callback, vals[3].u_obj);
@@ -330,7 +289,7 @@ STATIC mp_obj_t extint_make_new(const mp_obj_type_t *type, size_t n_args, size_t
 
        
        if(0 != Helios_ExtInt_Init((Helios_GPIONum) self->line,  &extint_struct)) {
-               mp_raise_ValueError("Interrupt initialization failed");
+               mp_raise_ValueError(MP_ERROR_TEXT("Interrupt initialization failed"));
        }
        
 #if defined(BOARD_EG810MCN_GA_ALIPAY)  
@@ -360,7 +319,7 @@ STATIC mp_obj_t extint_obj_read_count(mp_obj_t self_in, mp_obj_t is_reset) {
        int reset_flag = mp_obj_get_int(is_reset);
 
        if(reset_flag != 0 && reset_flag != 1) {
-               mp_raise_ValueError("invalid is_reset value, must in [0,1]");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid is_reset value, must in [0,1]"));
        } 
 
 #if defined(BOARD_EG810MCN_GA_ALIPAY)
@@ -506,8 +465,10 @@ STATIC const mp_rom_map_elem_t extint_locals_dict_table[] = {
        { MP_ROM_QSTR(MP_QSTR_GPIO16), MP_ROM_INT(HELIOS_GPIO16) },
 #endif
 #else
+#if !defined(PLAT_ECR6600)
        PLAT_GPIO_DEF(PLAT_GPIO_NUM),
 #endif
+#endif
 };
 
 STATIC MP_DEFINE_CONST_DICT(extint_locals_dict, extint_locals_dict_table);
index 32eb07f..f36615d 100644 (file)
@@ -64,29 +64,29 @@ mp_obj_t machine_hard_spi_make_new(const mp_obj_type_t *type, size_t n_args, siz
     int ret=0;
 
     if (port > HELIOS_SPI3) {
-       mp_raise_ValueError("port must be (0~3)");
+       mp_raise_ValueError(MP_ERROR_TEXT("port must be (0~3)"));
     }
        
        if ( mode > 3) {
-       mp_raise_ValueError("mode must be (0~3)");
+       mp_raise_ValueError(MP_ERROR_TEXT("mode must be (0~3)"));
     }
 
 #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
        if (clk > 9) {
-       mp_raise_ValueError("clk must be (0~9)");
+       mp_raise_ValueError(MP_ERROR_TEXT("clk must be (0~9)"));
     }
 #elif defined(PLAT_RDA)
        if (clk > 39) {
-       mp_raise_ValueError("clk must be (0~39)");
+       mp_raise_ValueError(MP_ERROR_TEXT("clk must be (0~39)"));
     }
 #elif defined(PLAT_Unisoc_8850)
 if (clk > 14) 
 {
-   mp_raise_ValueError("clk must be (0~14)");
+   mp_raise_ValueError(MP_ERROR_TEXT("clk must be (0~14)"));
 }
 #else
        if (clk > 6) {
-          mp_raise_ValueError("clk must be (0~6)");
+          mp_raise_ValueError(MP_ERROR_TEXT("clk must be (0~6)"));
        }
 #endif
 
@@ -100,7 +100,7 @@ if (clk > 14)
        
        ret = Helios_SPI_Init((Helios_SPINum) self->port, (Helios_SPIMode) self->mode, (uint32_t) self->clk);
        if(ret != 0) {
-               mp_raise_ValueError("spi init fail");
+               mp_raise_ValueError(MP_ERROR_TEXT("spi init fail"));
        }
        
     HELIOS_SPI_LOG("Helios_SPI_Init %d\r\n",ret);
index 19cde32..8799281 100644 (file)
@@ -58,7 +58,7 @@ mp_obj_t machine_hard_i2c_make_new(const mp_obj_type_t *type, size_t n_args, siz
     
 
     if (bus_id > HELIOS_I2C3) {
-       mp_raise_ValueError("bus id must be (0~3)");
+       mp_raise_ValueError(MP_ERROR_TEXT("bus id must be (0~3)"));
     }
    
     volatile machine_hard_i2c_obj_t *self = m_new_obj(machine_hard_i2c_obj_t);
index b5c3ea4..e482afd 100644 (file)
@@ -411,7 +411,7 @@ mp_obj_t key_extint_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_
 
        if(vals[ARG_gpio].u_int <= HELIOS_GPIO0 || vals[ARG_gpio].u_int > PLAT_GPIO_NUM) 
        {
-               mp_raise_ValueError("invalid gpio value");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid gpio value"));
        }
        //HELIOS_KEY_LOG("gpio_number = %d\n",gpio_number);
        
@@ -429,7 +429,7 @@ mp_obj_t key_extint_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_
        self->press_lvl = vals[ARG_press_lvl].u_int;
        if((self->press_lvl != HELIOS_LVL_LOW) && (self->press_lvl != HELIOS_LVL_HIGH))
        {
-               mp_raise_ValueError("invalid press value");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid press value"));
        }
        
        self->time_parameter.timer_short_press = vals[ARG_timer_short_press].u_int;
@@ -441,12 +441,12 @@ mp_obj_t key_extint_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_
        }
        if((self->time_parameter.timer_long_press > 10) || (self->time_parameter.timer_long_press * 1000 <= self->time_parameter.timer_short_press))
        {
-               mp_raise_ValueError("invalid long press timer");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid long press timer"));
        }
        self->time_parameter.timer_double_click_int = vals[ARG_timer_double_click_int].u_int;
        if((self->time_parameter.timer_double_click_int > 1000) || (self->time_parameter.timer_double_click_int <= 0))
        {
-               mp_raise_ValueError("invalid double click int timer");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid double click int timer"));
        }
        self->timer = 0;
        self->mode = HELIOS_EDGE_BOTH;//双边沿触发
@@ -466,7 +466,7 @@ mp_obj_t key_extint_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_
 
        if(0 != Helios_ExtInt_Init((Helios_GPIONum) self->pin, &extint_struct))
        {
-               mp_raise_ValueError("Interrupt initialization failed");
+               mp_raise_ValueError(MP_ERROR_TEXT("Interrupt initialization failed"));
        }
 
        if(key_queue == 0)
@@ -474,7 +474,7 @@ mp_obj_t key_extint_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_
                key_queue = Helios_MsgQ_Create(256, sizeof(Key_Msg));
                if(key_queue == 0)
                {
-                       mp_raise_ValueError("initialization failed");
+                       mp_raise_ValueError(MP_ERROR_TEXT("initialization failed"));
                }
        }
 
@@ -495,7 +495,7 @@ mp_obj_t key_extint_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_
                thread_id = Helios_Thread_Create(&ThreadAttr);
                if(thread_id == 0)
                {
-                       mp_raise_ValueError("initialization failed");
+                       mp_raise_ValueError(MP_ERROR_TEXT("initialization failed"));
                }
        }
     return MP_OBJ_FROM_PTR(self);
index 8379fbc..fe91a78 100644 (file)
@@ -64,6 +64,8 @@ static machine_keypad_obj_t *keypad_obj = NULL;
 
 uint32_t helios_keypad_callback_to_python(Helios_KeyPad_Event event)
 {      
+    unsigned char i = 0;
+
        if( helios_keypad_callback == NULL) 
     {
                return -1;
@@ -76,33 +78,70 @@ uint32_t helios_keypad_callback_to_python(Helios_KeyPad_Event event)
            Keypad_t->row = event.param_01;                                                            
            Keypad_t->col = event.param_02;  
         Keypad_t->callback = *helios_keypad_callback;
-           qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_KEYPAD, Keypad_t); 
 #if defined(BOARD_EC600MCN_LA_POC_XBND)//彬其 PTT按键按下 直接调poc_speak
-      if((ptt_cfg.speak_deal_mode == DEAL_BY_CALLBACK) && (ptt_cfg.key_type == TYPE_KEYPAD))//keypad 模式
-      {
-                       unsigned char data = 0; 
-                       if((event.param_01 == ptt_cfg.keypad_key_info.row) && (event.param_02 == ptt_cfg.keypad_key_info.col))//
+           unsigned char ptt_cb_no_report = 0;
+               unsigned char ptt_valid = 0;
+
+               for(i=0;i<5;i++)
+               {
+                       if(ptt_cfg.key_cfg[i].key_type == TYPE_KEYPAD)
                        {
-                            
-                    if(event.event_id == 1)//按下
-                    {
-                                        if(msg_poc_speak_t)
-                                    {
-                                        data = 1;
-                                                Helios_MsgQ_Put(msg_poc_speak_t, &data, sizeof(unsigned char), HELIOS_NO_WAIT);
-                                    }
-                    }
-                                else//松开
-                                {
-                                   if(msg_poc_speak_t)
-                                   {   
-                                       data = 0;
-                                               Helios_MsgQ_Put(msg_poc_speak_t, &data, sizeof(unsigned char), HELIOS_NO_WAIT);
-                                   }
-                                }
+                               if((event.param_01 == ptt_cfg.key_cfg[i].key_info.keypad_key_info.row) 
+                                       && (event.param_02 == ptt_cfg.key_cfg[i].key_info.keypad_key_info.col))
+                               {
+                                       if(ptt_cfg.speak_deal_mode == DEAL_BY_CALLBACK)
+                                       {
+                                               if(ptt_cfg.pressed && ((ptt_cfg.pressed & (1<<i)) == 0)) 
+                                               {
+                                                       ptt_cb_no_report = 1;//ptt 按键 在有其他按键按下时不再上报回调到python,也不做任何处理
+                                               }
+                                               else
+                                               {       
+                                                       ptt_valid = 1;
+                                               }
+                                       }
+                                       else
+                                       {
+                                               ptt_cb_no_report = 1;
+                                       }
+                                       break;
+                               }
                        }
-       }
+               }
+
+               
+               if(ptt_cb_no_report == 0)
+               {
+                       qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_KEYPAD, Keypad_t); 
+               }
+               
+               if(ptt_valid)
+               {
+                       unsigned char data = 0; 
+                       ptt_valid = 0;
+                        if(event.event_id == 1)//按下
+             {
+                                if(msg_poc_speak_t)
+                            {
+                                data = 1;
+                                        Helios_MsgQ_Put(msg_poc_speak_t, &data, sizeof(unsigned char), HELIOS_NO_WAIT);
+                                        ptt_cfg.pressed |= 1 << i;     
+                            }
+             }
+                        else//松开
+                        {
+                           if(msg_poc_speak_t)
+                           {   
+                               data = 0;
+                                       Helios_MsgQ_Put(msg_poc_speak_t, &data, sizeof(unsigned char), HELIOS_NO_WAIT);
+                                       ptt_cfg.pressed &= ~(1 << i);
+                           }
+                        }
+               }
+#else
+           qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_KEYPAD, Keypad_t); 
 #endif
+
         return 0;
        }
     return -1;    
index 09a45f3..2b5b6f6 100644 (file)
@@ -76,7 +76,7 @@ STATIC mp_obj_t machine_pin_obj_init_helper(machine_pin_obj_t *self, size_t n_ar
                        self->dir = args[ARG_dir].u_int;
                        break;
                default:
-                       mp_raise_ValueError("invalid pin dir, range{0:dir in, 1:dir out}");
+                       mp_raise_ValueError(MP_ERROR_TEXT("invalid pin dir, range{0:dir in, 1:dir out}"));
                        break;
        }
     // get pull mode
@@ -89,7 +89,7 @@ STATIC mp_obj_t machine_pin_obj_init_helper(machine_pin_obj_t *self, size_t n_ar
                        self->pull = args[ARG_pull].u_int;
                        break;
                default:
-                       mp_raise_ValueError("invalid pin pull, range{0:PIN_PULL_DISABLE, 1:PIN_PULL_PU, 2:PIN_PULL_PD}");
+                       mp_raise_ValueError(MP_ERROR_TEXT("invalid pin pull, range{0:PIN_PULL_DISABLE, 1:PIN_PULL_PU, 2:PIN_PULL_PD}"));
                        break;
        }
        // get initial value
@@ -101,7 +101,7 @@ STATIC mp_obj_t machine_pin_obj_init_helper(machine_pin_obj_t *self, size_t n_ar
                        self->value = args[ARG_value].u_int;
                        break;
                default:
-                       mp_raise_ValueError("invalid pin value, range{0:PIN_LEVEL_LOW, 1:PIN_LEVEL_HIGH}");
+                       mp_raise_ValueError(MP_ERROR_TEXT("invalid pin value, range{0:PIN_LEVEL_LOW, 1:PIN_LEVEL_HIGH}"));
                        break;
        }
        Helios_GPIOInitStruct gpio_struct = {0};
@@ -113,7 +113,7 @@ STATIC mp_obj_t machine_pin_obj_init_helper(machine_pin_obj_t *self, size_t n_ar
        HELIOS_PIN_LOG("gpio init ret = %d\n",ret);
        
        if (ret != 0){
-        mp_raise_ValueError("GPIO initialization failed");
+        mp_raise_ValueError(MP_ERROR_TEXT("GPIO initialization failed"));
     }
 
     return mp_const_none;
@@ -130,7 +130,7 @@ mp_obj_t mp_pin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw,
 
 #if !defined(PLAT_ECR6600)
        if(wanted_pin == 0 || wanted_pin > PLAT_GPIO_NUM) {
-               mp_raise_ValueError("invalid pin");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid pin"));
        }
 #endif
 
@@ -250,7 +250,7 @@ STATIC mp_obj_t machine_pin_set_dir(mp_obj_t self_in, mp_obj_t dir)
        
     int pin_value = mp_obj_get_int(dir);
        if((pin_value != HELIOS_GPIO_INPUT) && (pin_value != HELIOS_GPIO_OUTPUT)){
-               mp_raise_ValueError("Invalid direction parameter");
+               mp_raise_ValueError(MP_ERROR_TEXT("Invalid direction parameter"));
        }
        ret = Helios_GPIO_SetDirection((Helios_GPIONum) self->pin, (Helios_GPIODir) pin_value);
     return mp_obj_new_int(ret);
index d6c0aa8..e90a0b9 100644 (file)
@@ -191,7 +191,7 @@ STATIC mp_obj_t machine_timer_make_new(const mp_obj_type_t *type, size_t n_args,
     }
        if ((timer_id < 0) || (timer_id > 3))
        {
-               mp_raise_ValueError("invalid value, Timern should be in (Timer0~Timer3).");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, Timern should be in (Timer0~Timer3)."));
        }
        
        machine_timer_obj_t *self = m_new_obj(machine_timer_obj_t);
index 5155ae8..e126a6d 100644 (file)
@@ -94,7 +94,7 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
             self->config.baudrate = args[ARG_baudrate].u_int;
             break;
         default:
-            mp_raise_ValueError("invalid baudrate");
+            mp_raise_ValueError(MP_ERROR_TEXT("invalid baudrate"));
             break;
     }
 
@@ -105,7 +105,7 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
             self->config.data_bit = HELIOS_UART_DATABIT_8;
             break;
         default:
-            mp_raise_ValueError("invalid data bits, Unisoc platform only support 8 data bit.");
+            mp_raise_ValueError(MP_ERROR_TEXT("invalid data bits, Unisoc platform only support 8 data bit."));
             break;
     }
 #else
@@ -123,7 +123,7 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
             self->config.data_bit = HELIOS_UART_DATABIT_8;
             break;
         default:
-            mp_raise_ValueError("invalid data bits");
+            mp_raise_ValueError(MP_ERROR_TEXT("invalid data bits"));
             break;
     }
 #endif
@@ -147,7 +147,7 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
             break;
                #endif
         default:
-            mp_raise_ValueError("invalid parity bits");
+            mp_raise_ValueError(MP_ERROR_TEXT("invalid parity bits"));
             break;
     }
 
@@ -160,7 +160,7 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
             self->config.stop_bit = HELIOS_UART_STOP_2;
             break;
         default:
-            mp_raise_ValueError("invalid stop bits");
+            mp_raise_ValueError(MP_ERROR_TEXT("invalid stop bits"));
             break;
     }
 
@@ -173,7 +173,7 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
             self->config.flow_ctrl = HELIOS_UART_FC_HW;
             break;
         default:
-            mp_raise_ValueError("invalid flow bits");
+            mp_raise_ValueError(MP_ERROR_TEXT("invalid flow bits"));
             break;
     }
        Helios_UARTInitStruct uart_para = {0};
@@ -187,7 +187,7 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
 
        Helios_UART_Deinit((Helios_UARTNum) self->uart_num);
        if(Helios_UART_Init((Helios_UARTNum) self->uart_num, &uart_para) != 0) {
-               mp_raise_msg_varg(&mp_type_ValueError, "UART(%d) init fail", self->uart_num);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("UART(%d) init fail"), self->uart_num);
        }
 }
 
@@ -197,7 +197,7 @@ STATIC mp_obj_t machine_uart_make_new(const mp_obj_type_t *type, size_t n_args,
     // get uart id
     mp_int_t uart_num = mp_obj_get_int(args[0]);
     if (uart_num < HELIOS_UART0 || uart_num > HELIOS_UARTMAX) {
-        mp_raise_msg_varg(&mp_type_ValueError, "UART(%d) does not exist", uart_num);
+        mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("UART(%d) does not exist"), uart_num);
     }
 
     // create instance
@@ -332,7 +332,7 @@ STATIC mp_obj_t machine_uart_rx_disable(mp_obj_t self_in,mp_obj_t set)
     size_t set_value = mp_obj_get_int(set);
     if(set_value > 1)
     {
-        mp_raise_ValueError("setting_value must be 0 or 1");
+        mp_raise_ValueError(MP_ERROR_TEXT("setting_value must be 0 or 1"));
     }
     ret = Helios_Uart_Disable_Rx(self->uart_num,set_value);
     return mp_obj_new_int(ret);
@@ -375,23 +375,23 @@ STATIC const mp_rom_map_elem_t machine_uart_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_UART3), MP_ROM_INT(HELIOS_UART3) },
 #endif
 #endif
+
 #if defined(PLAT_Qualcomm) \
        || defined (PLAT_Unisoc) \
        || defined(PLAT_Unisoc_8910_R05) \
        || defined(BOARD_EC600GCN_LD) \
-       || defined(BOARD_EC600GCN_LD_YM) 
+    || defined(BOARD_EC600GCN_LA) \
+       || defined(BOARD_EC600GCN_LD_YM) \
+    || MICROPY_QPY_UART4
        { MP_ROM_QSTR(MP_QSTR_UART4), MP_ROM_INT(HELIOS_UART4) },
 #endif
-#if defined(BOARD_EC600GCN_LD) || defined(BOARD_EC600GCN_LD_YM) 
+
+#if defined(PLAT_Unisoc_8850) || MICROPY_QPY_USB_DOUBLE_CDC
     { MP_ROM_QSTR(MP_QSTR_UART5), MP_ROM_INT(HELIOS_UART5) },
-    { MP_ROM_QSTR(MP_QSTR_UART6), MP_ROM_INT(HELIOS_UARTMAX) },
-#else
-#if MICROPY_QPY_UART4//only ASR1606 R06 EC800M
-       { MP_ROM_QSTR(MP_QSTR_UART4), MP_ROM_INT(HELIOS_UART4) },
-#endif
-#if MICROPY_QPY_USB_DOUBLE_CDC
-       { MP_ROM_QSTR(MP_QSTR_UART5), MP_ROM_INT(HELIOS_UART5) },
 #endif
+
+#if defined(PLAT_Unisoc_8850)
+    { MP_ROM_QSTR(MP_QSTR_UART6), MP_ROM_INT(HELIOS_UART6) },
 #endif
 
 #if defined(PLAT_ASR_1803s)
index d0af729..b1cac1e 100644 (file)
@@ -39,7 +39,7 @@ STATIC mp_obj_t misc_power_reset(size_t n_args, const mp_obj_t *args)
                mode = mp_obj_get_int(args[0]);
                if ((mode != 0) && (mode != 1))
                {
-                       mp_raise_ValueError("invalid value, mode should be in 0 or 1.");
+                       mp_raise_ValueError(MP_ERROR_TEXT("invalid value, mode should be in 0 or 1."));
                }
        }
        Helios_Power_Reset(mode);
@@ -56,7 +56,7 @@ STATIC mp_obj_t misc_power_down(size_t n_args, const mp_obj_t *args)
                mode = mp_obj_get_int(args[0]);
                if ((mode != 0) && (mode != 1))
                {
-                       mp_raise_ValueError("invalid value, mode should be in 0 or 1.");
+                       mp_raise_ValueError(MP_ERROR_TEXT("invalid value, mode should be in 0 or 1."));
                }
        }
        Helios_Power_Down(mode);
index 7c283c1..74dba19 100644 (file)
@@ -113,7 +113,7 @@ STATIC void misc_pwm_init_helper(misc_pwm_obj_t *self,
        //PWM_LOG("cycle_range=%d, high_time=%d, cycle_time=%d\n",args[ARG_cycle_range].u_int, args[ARG_high_time].u_int, args[ARG_cycle_time].u_int);
 #if !defined(PLAT_ASR) && !defined(PLAT_ASR_1606) && !defined(PLAT_ASR_1803s) && !defined(PLAT_EIGEN)
        if(-1 == check_pwm_para(args[ARG_cycle_range].u_int, args[ARG_cycle_time].u_int, args[ARG_high_time].u_int)) {
-               mp_raise_ValueError("PWM parameter error, please refer to wiki instructions to correct the parameters");
+               mp_raise_ValueError(MP_ERROR_TEXT("PWM parameter error, please refer to wiki instructions to correct the parameters"));
        }
 #endif
 
@@ -124,7 +124,7 @@ STATIC void misc_pwm_init_helper(misc_pwm_obj_t *self,
        PWM_LOG("cycle_range=%d, high_time=%d, cycle_time=%d\n",self->cycle_range, self->high_time, self->cycle_time);
 
        if(Helios_PWM_Init(self->pin) != 0) {
-               mp_raise_ValueError("fail");
+               mp_raise_ValueError(MP_ERROR_TEXT("fail"));
        }
 
 }
@@ -138,7 +138,7 @@ STATIC mp_obj_t misc_pwm_make_new(const mp_obj_type_t *type,
 
        if ((pin_id < 0) || (pin_id > PWMMAX-1))
        {
-               mp_raise_ValueError("invalid PWMn value, must be in {0~3}.");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid PWMn value, must be in {0~3}."));
        }
        
     // create PWM object from the given pin
@@ -181,18 +181,18 @@ STATIC void misc_pwm_v2_init_helper(misc_pwm_obj_t *self,
 
     if(mp_obj_is_float(args[ARG_frequency].u_obj) == 0)
     {
-        mp_raise_TypeError("frequency type isn't float");
+        mp_raise_TypeError(MP_ERROR_TEXT("frequency type isn't float"));
     }
      if(args[ARG_duty].u_int > 100)
      {
-         mp_raise_ValueError("PWM parameter error,range duty should be 0~100");
+         mp_raise_ValueError(MP_ERROR_TEXT("PWM parameter error,range duty should be 0~100"));
      }
        self->duty = args[ARG_duty].u_int;
        self->frequency = mp_obj_float_get(args[ARG_frequency].u_obj);
     self->type_pwm = PWM_V2;
 
        if(Helios_PWM_Init(self->pin) != 0) {
-               mp_raise_ValueError("fail");
+               mp_raise_ValueError(MP_ERROR_TEXT("fail"));
        }
 
 }    
@@ -204,7 +204,7 @@ STATIC mp_obj_t misc_pwm_v2_make_new(const mp_obj_type_t *type,
     
        if ((pin_id < 0) || (pin_id > PWMMAX-1))
        {
-               mp_raise_ValueError("invalid PWMn value, must be in {0~3}.");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid PWMn value, must be in {0~3}."));
        }
        
     // create PWM object from the given pin
@@ -236,7 +236,7 @@ STATIC mp_obj_t misc_pwm_enable(size_t n_args, const mp_obj_t *args)
 #if !defined(PLAT_ASR) && !defined(PLAT_ASR_1606) && !defined(PLAT_ASR_1803s) && !defined(PLAT_EIGEN)
             if(-1 == check_pwm_para(mp_obj_get_int(args[1]), mp_obj_get_int(args[3]), mp_obj_get_int(args[2])))
             {
-                       mp_raise_ValueError("PWM parameter error, please refer to wiki instructions to correct the parameters");
+                       mp_raise_ValueError(MP_ERROR_TEXT("PWM parameter error, please refer to wiki instructions to correct the parameters"));
                }
 #endif
             self->cycle_range = mp_obj_get_int(args[1]);
@@ -270,11 +270,11 @@ STATIC mp_obj_t misc_pwm_enable(size_t n_args, const mp_obj_t *args)
         {
              if((mp_obj_get_int(args[2]) < 0) || (mp_obj_get_int(args[2]) > 100))
              {
-                 mp_raise_ValueError("PWM parameter error,range duty should be 0~100");
+                 mp_raise_ValueError(MP_ERROR_TEXT("PWM parameter error,range duty should be 0~100"));
              }
              if(mp_obj_is_float(args[1]) == 0)
              {
-                 mp_raise_TypeError("frequency type isn't float");
+                 mp_raise_TypeError(MP_ERROR_TEXT("frequency type isn't float"));
              }
              self->frequency = mp_obj_float_get(args[1]);
              self->duty = mp_obj_get_int(args[2]);
index 6a4a51f..e805121 100644 (file)
@@ -130,11 +130,14 @@ STATIC SC7A20_obj_t *g_SC7A20 = NULL;
 unsigned char SL_SC7A20_I2c_Spi_Write(bool sl_spi_iic,unsigned char reg, unsigned char data)
 {
        uint8_t reg_addr = reg;
-       //SC7A20_LOG("SC7A20 iic write reg = %d, buf is %d\n", reg_addr, data);
+       //SC7A20_LOG("SL_SC7A20_I2c_Spi_Write reg_addr:%d, data:%02x\n", reg_addr, data);
        if(HELIOS_I2C_Write((Helios_I2CEnum)0, SC7A20_IIC_ADDRESS, &reg_addr, 1, &data, 1) == 0)
+       {
                return 1;
+       }
        else
        {
+               
                SC7A20_LOG("SL_SC7A20_I2c_Spi_Write error!!!!!!!\r\n");
                return 0;
        }
@@ -143,10 +146,16 @@ unsigned char SL_SC7A20_I2c_Spi_Write(bool sl_spi_iic,unsigned char reg, unsigne
 unsigned char SL_SC7A20_I2c_Spi_Read(bool sl_spi_iic,unsigned char reg, unsigned char len, unsigned char *buf)
 {
        uint8_t reg_addr = reg;
+       if(len <= 0)
+               return 0;
        if(HELIOS_I2C_Read((Helios_I2CEnum)0, SC7A20_IIC_ADDRESS, &reg_addr, 1, (void*)buf, len, 0)==0)
+       {
+               //SC7A20_LOG("SL_SC7A20_I2c_Spi_Read:reg_addr:%d, buf[0]:0x%02x\n", reg_addr, buf[0]);
                return 1;
+       }
        else
        {
+               
                SC7A20_LOG("SL_SC7A20_I2c_Spi_Read error!!!!!!!\r\n");
                return 0;
        }
@@ -161,8 +170,19 @@ unsigned char SL_SC7A20_I2c_Spi_Read(bool sl_spi_iic,unsigned char reg, unsigned
 uint8_t sc7a20_reg_read(uint8_t addr)
 {
     uint8_t val = 0;
-       HELIOS_I2C_Read((Helios_I2CEnum)0, SC7A20_IIC_ADDRESS, &addr, 1, &val, 1, 10); 
-    return val;
+       //SC7A20_LOG("sc7a20_reg_read = %d\n", addr);
+       if(HELIOS_I2C_Read((Helios_I2CEnum)0, SC7A20_IIC_ADDRESS, &addr, 1, &val, 1, 10)== 0)
+       {
+               
+               return val;
+       }
+       else
+       {
+               SC7A20_LOG("sc7a20_reg_read = %d\n", addr);
+               SC7A20_LOG("sc7a20_reg_read error!!!!!!!\r\n");
+               return 0;
+       }
+    
 }
 /*****************************************************************************/
 //  Description:    write configuration data to chip registers
@@ -173,7 +193,16 @@ uint8_t sc7a20_reg_read(uint8_t addr)
 void sc7a20_reg_write(uint8_t addr, uint8_t val)
 {
     uint8_t reg_addr = addr;
-       HELIOS_I2C_Write((Helios_I2CEnum)0, SC7A20_IIC_ADDRESS, &reg_addr, 1, (void*)&val, 1);
+       //SC7A20_LOG("sc7a20_reg_write addr= %d, val is %d\n", addr, val);
+       if(HELIOS_I2C_Write((Helios_I2CEnum)0, SC7A20_IIC_ADDRESS, &reg_addr, 1, (void*)&val, 1)== 0)
+       {
+
+       }
+       else
+       {
+               
+               SC7A20_LOG("sc7a20_reg_read error!!!!!!!\r\n");
+       }
   
 }
 
@@ -276,7 +305,7 @@ unsigned int  SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO(void)
                        SL_INT_TIME_CNT++;
                }
        }
-       
+
        if(SL_INT_TIME_CNT<SL_INT_TIME_TH)//6s
        {
            /*******get sc7a20 FIFO data******/
@@ -305,7 +334,7 @@ unsigned int  SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO(void)
                /*****motion degree****/    
                SL_CADENCE_DEGREE    = SL_Pedo_Step_Get_Motion_Degree();
     
-    
+
            /*******get wrist value******/
            SL_WRIST= SL_Watch_Wrist_Algo();
 
@@ -337,6 +366,7 @@ unsigned int  SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO(void)
                //SC7A20_ODR_SET(0);//data for 10Hz 0.5S=5'S data //for heart rate algo
                SC7A20_ODR_SET(0);//data for 25Hz 0.5S=12-13'S data //for heart rate algo
        }
+
        //抬腕亮屏
        /**Return:  2     备注说明:屏幕点亮后需要关闭*********/
        /**Return:  1     备注说明:屏幕需要点亮***************/
@@ -349,43 +379,62 @@ unsigned int  SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO(void)
        {
                Gsensor_CALLBACK_OP(Gsensor_WRIST_DOWN);
        }
+
        SL_WRIST = 0;
        //以下代码为了筹够25个数据给hsensor
        if(SC7A20_XYZ_Buf_tmp_len+SC7A20_FIFO_NUM > 32)
                SC7A20_FIFO_NUM = 32 - SC7A20_XYZ_Buf_tmp_len;
+       //SC7A20_LOG("SC7A20_FIFO_NUM :%d  SC7A20_XYZ_Buf_tmp_len: %d SC7A20_XYZ_Buf_tmp[0]len:%d!!!!!!!!!!!!\n", SC7A20_FIFO_NUM,SC7A20_XYZ_Buf_tmp_len,sizeof(SC7A20_XYZ_Buf_tmp[0]));
+       for(i = 0; i < SC7A20_FIFO_NUM; i++)
+       {
+               if(i+SC7A20_XYZ_Buf_tmp_len < 31)
+               {
+                       SC7A20_XYZ_Buf_tmp[0][i+SC7A20_XYZ_Buf_tmp_len] = SC7A20_XYZ_Buf[0][i];
+                       SC7A20_XYZ_Buf_tmp[1][i+SC7A20_XYZ_Buf_tmp_len] = SC7A20_XYZ_Buf[1][i];
+                       SC7A20_XYZ_Buf_tmp[2][i+SC7A20_XYZ_Buf_tmp_len] = SC7A20_XYZ_Buf[2][i];
+                       s_acc.x = (float)((SC7A20_XYZ_Buf[0][i]*9.8f)/((uint16_t)ACC_0G_X));
+                       s_acc.y = (float)((SC7A20_XYZ_Buf[1][i]*9.8f)/((uint16_t)ACC_0G_Y));
+                       s_acc.z = (float)((SC7A20_XYZ_Buf[2][i]*9.8f)/((uint16_t)ACC_0G_Z));
+                       if(gsensor_sc7a20_fall_detect(&s_acc) == 1)//跌倒报警
+                               Gsensor_CALLBACK_OP(Gsensor_FALL_DOWN); 
+               }
+               
+       }
+       //memcpy(SC7A20_XYZ_Buf_tmp+SC7A20_XYZ_Buf_tmp_len*6,SC7A20_XYZ_Buf,SC7A20_FIFO_NUM);
        
-       memcpy(SC7A20_XYZ_Buf_tmp+SC7A20_XYZ_Buf_tmp_len*6,SC7A20_XYZ_Buf,SC7A20_FIFO_NUM);
-
        SC7A20_XYZ_Buf_tmp_len += SC7A20_FIFO_NUM;
+       //dump2
+
        // s_sc7a20_read_data_counter++;  
        if(SC7A20_XYZ_Buf_tmp_len >= 25)
        {
                //reset data
-               memset(s_sc7a20_read_data, 0x0, sizeof(ST_GS_DATA_TYPE)*32);
+               memset(s_sc7a20_read_data, 0x0, sizeof(s_sc7a20_read_data));
                s_sc7a20_read_data_len = 0;
                
                //get first data
+               
+                       
                for(i = 0; i < SC7A20_XYZ_Buf_tmp_len; i++)
                { 
-                       s_sc7a20_read_data[i].sXAxisVal = SC7A20_XYZ_Buf_tmp[0][i];
-                       s_sc7a20_read_data[i].sYAxisVal = SC7A20_XYZ_Buf_tmp[1][i];
-                       s_sc7a20_read_data[i].sZAxisVal = SC7A20_XYZ_Buf_tmp[2][i];
-                       s_acc.x = (float)((SC7A20_XYZ_Buf[0][i]*9.8f)/((uint16_t)ACC_0G_X));
-                       s_acc.y = (float)((SC7A20_XYZ_Buf[1][i]*9.8f)/((uint16_t)ACC_0G_Y));
-                       s_acc.z = (float)((SC7A20_XYZ_Buf[2][i]*9.8f)/((uint16_t)ACC_0G_Z));
-                       if(gsensor_sc7a20_fall_detect(&s_acc) == 1)
-                               Gsensor_CALLBACK_OP(Gsensor_FALL_DOWN); 
+                       if(i < 32)
+                       {
+                               s_sc7a20_read_data[i].sXAxisVal = SC7A20_XYZ_Buf_tmp[0][i];
+                               s_sc7a20_read_data[i].sYAxisVal = SC7A20_XYZ_Buf_tmp[1][i];
+                               s_sc7a20_read_data[i].sZAxisVal = SC7A20_XYZ_Buf_tmp[2][i];
+                       }
+                       
                }
-
+               //1dump 
                s_sc7a20_read_data_len = SC7A20_XYZ_Buf_tmp_len;
                SC7A20_XYZ_Buf_tmp_len = 0;
                //SC7A20_LOG("SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO:s_sc7a20_read_data_len:%d\r\n",s_sc7a20_read_data_len);
        }
        //SC7A20_LOG("SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO:SC7A20_FIFO_NUM:%d\r\n",SC7A20_FIFO_NUM);
        
-       x = (float)((SC7A20_XYZ_Buf[0][0]*9.8f)/((uint16_t)ACC_0G_X));
-       y = (float)((SC7A20_XYZ_Buf[1][0]*9.8f)/((uint16_t)ACC_0G_Y));
-       z = (float)((SC7A20_XYZ_Buf[2][0]*9.8f)/((uint16_t)ACC_0G_Z));
+       x = s_acc.x;
+       y = s_acc.y;
+       z = s_acc.z;
        //SC7A20_LOG("SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO : x = %d y = %d z = %d\r\n",(int)(x*100), (int)(y*100), (int)(z*100));
        /*******get sleep status value******/
        SL_SLEEP_CNT++;
@@ -406,9 +455,8 @@ unsigned int  SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO(void)
                }
 #endif
                SL_SLEEP_CNT=0;
-               SL_MCU_SLEEP_ALGO_FUNCTION();
+               //SL_MCU_SLEEP_ALGO_FUNCTION();//1分钟测一次睡眠
        }
-
     return SL_STEP;
 }
 //获取Gsensor数据,填充到buf,返回长度,data长度需要32*3个short大小
index dbdc0f7..342c06f 100644 (file)
@@ -34,7 +34,6 @@
 #include "helios_debug.h"
 #include "gh3011_example.h"
 #define GH3018_LOG(msg, ...)      custom_log("GH3018", msg, ##__VA_ARGS__)
-
 //////////////////////////////////////////////////////////////////////////////
 typedef struct _GH3018_obj_t
 {
@@ -182,6 +181,7 @@ void sensor_thread_entry(void * argv)
                if(gh3018_run_mode != RUN_MODE_INVALID )
                {
                        GH3018_test(gh3018_run_mode);
+                       
                        gh3018_run_mode = RUN_MODE_INVALID;
                }
                if(is_gh3018 == 1 && is_open_gh3018 == 1)//处理Hsensor中断数据
@@ -190,6 +190,7 @@ void sensor_thread_entry(void * argv)
                        {
                                GH3018_irq_lock = 1;
                                hal_gh30x_int_handler();
+                               
                                GH3018_irq_lock = 0;
                                //GH3018_LOG("GH3018_irq_cb: 1111111111111!!!!!!!!\r\n");
                                //GH3018_LOG("hal_gh30x_int_handler:test_count1:%d test_count2:%d\r\n",test_count1,test_count2);
@@ -198,8 +199,9 @@ void sensor_thread_entry(void * argv)
                        if(timer_Gsensor_count>(1000/TIMER_TIME_MS))//1秒定时,轮询更新Gsensor数据
                        {
                                timer_Gsensor_count = 0;
-                               Helios_msleep(5);
+                               //Helios_msleep(5);
                                SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO();
+
                        }
                }
                else
@@ -365,7 +367,6 @@ void GH3018_test(uint32_t mode)
                
                Helios_Timer_Start(sensor_timer, TIMER_TIME_MS, IS_CYCLICAL);
        }
-       
 }
 //打开心律测试
 STATIC mp_obj_t mp_GH3018_open_heart(mp_obj_t self_in)
index 75fe06f..143f1c6 100644 (file)
@@ -63,7 +63,7 @@ static AudioChannelSupport_t audio_channel_tab = {
     || defined(BOARD_EC600MCN_LE) || defined(BOARD_EC600MCN_LE_POC_XBND) \
        || defined(BOARD_EC600MCN_LA_POC_ZZD) || defined(BOARD_EC600MCN_LE_POC_ZZD) \
        ||defined(BOARD_EC600MCN_LE_POC_QS) || defined(BOARD_EC600MCN_CC) || defined(BOARD_EC600MCN_LE_VOLTE) || defined(BOARD_EC600MCN_LF) \
-       || defined(BOARD_EC600MCN_CC) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) 
+       || defined(BOARD_EC600MCN_CC) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(BOARD_EC600MCN_CC_EXT_TTS)
        {1, 0, 0}
 #elif defined(BOARD_EC800MCN_LA) || defined(BOARD_EC800MCN_GA) \
     || defined(BOARD_EC800MCN_LA_VOLTE) || defined(BOARD_EC800MCN_GC) || defined(BOARD_EC800MCN_LC) || defined(BOARD_EC800MCN_LF) \
index 738a7f2..7ff0354 100644 (file)
@@ -61,7 +61,9 @@ STATIC mp_obj_t cell_wifi_locreqencode(size_t n_args, const mp_obj_t *args)
 #endif
 
     /* cell info encode*/
+#if !defined(PLAT_Unisoc) && !defined(PLAT_Unisoc_8910_R05) && !defined(PLAT_Unisoc_8850)
     char para[5]={0};
+#endif
     tlv_cellinfo_struct info[MAX_CELL_NUM] = {0};
     Helios_NwCellInfoStruct cell_info = {0};
 
@@ -79,12 +81,19 @@ STATIC mp_obj_t cell_wifi_locreqencode(size_t n_args, const mp_obj_t *args)
             {
                 if(cell_info.gsm_info[i].cid != 0)
                 {
-                    memset(para, 0, 5);
                     info[0].radio_type = NETWORK_MODE_GSM;
+                                       
+                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850)
+                                       info[0].mcc = cell_info.gsm_info[i].mcc;
+                                       info[0].mnc = cell_info.gsm_info[i].mnc;
+                               #else
+                                       memset(para, 0, 5);
                                sprintf(para,"%x",cell_info.gsm_info[i].mcc);
                                sscanf(para,"%d",&(info[0].mcc));
                     sprintf(para,"%x",cell_info.gsm_info[i].mnc);
                                sscanf(para,"%d",&(info[0].mnc));
+                               #endif  
+                               
                     info[0].lac = cell_info.gsm_info[i].lac;
                     info[0].cellId = cell_info.gsm_info[i].cid;
                     info[0].bcch = cell_info.gsm_info[i].arfcn;
@@ -100,12 +109,19 @@ STATIC mp_obj_t cell_wifi_locreqencode(size_t n_args, const mp_obj_t *args)
             {
                 if(cell_info.umts_info[i].cid != 0)
                 {
-                    memset(para, 0, 5);
                     info[0].radio_type = NETWORK_MODE_WCDMA;
+                                       
+                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850)
+                                       info[0].mcc = cell_info.umts_info[i].mcc;
+                                       info[0].mnc = cell_info.umts_info[i].mnc;
+                               #else
+                                       memset(para, 0, 5);
                     sprintf(para,"%x",cell_info.umts_info[i].mcc);
                                sscanf(para,"%d",&(info[0].mcc));
                     sprintf(para,"%x",cell_info.umts_info[i].mnc);
                                sscanf(para,"%d",&(info[0].mnc));
+                               #endif
+                               
                     info[0].lac = cell_info.umts_info[i].lac;
                     info[0].cellId = cell_info.umts_info[i].cid;
                     info[0].bcch = cell_info.umts_info[i].uarfcn;
@@ -122,17 +138,26 @@ STATIC mp_obj_t cell_wifi_locreqencode(size_t n_args, const mp_obj_t *args)
                 if(cell_info.lte_info[i].cid != 0)
                 {
                     if (cell_num > MAX_CELL_NUM-1)
+                    {
                         break;
-                    memset(para, 0, 5);
+                    }
 
                     QPY_MODLBS_LOG("lte_info[%d]:flag:%d,cid:%d,mcc:%d,mnc:%d,tac:%d,earfcn:%d,rssi:%d,pci:%d,rsrq:%d\r\n", \
                 i,cell_info.lte_info[i].flag,cell_info.lte_info[i].cid,cell_info.lte_info[i].mcc, cell_info.lte_info[i].mnc, \
                 cell_info.lte_info[i].tac,cell_info.lte_info[i].earfcn,cell_info.lte_info[i].rssi, cell_info.lte_info[i].pci, cell_info.lte_info[i].rsrq);
                     info[cell_num].radio_type = NETWORK_MODE_LTE;
+                                       
+                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850)
+                                       info[cell_num].mcc = cell_info.lte_info[i].mcc;
+                                       info[cell_num].mnc = cell_info.lte_info[i].mnc;
+                               #else
+                                       memset(para, 0, 5);
                     sprintf(para,"%x",cell_info.lte_info[i].mcc);
                                sscanf(para,"%d",&(info[cell_num].mcc));
                     sprintf(para,"%x",cell_info.lte_info[i].mnc);
                                sscanf(para,"%d",&(info[cell_num].mnc));
+                               #endif
+                               
                     info[cell_num].lac = cell_info.lte_info[i].tac;
                     info[cell_num].cellId = cell_info.lte_info[i].cid;
                     info[cell_num].bcch = cell_info.lte_info[i].earfcn;
@@ -792,8 +817,11 @@ STATIC mp_obj_t cell_locreqencode(size_t n_args, const mp_obj_t *args)
     /* cell info encode*/
     uint8_t ret = 0;
     uint8_t i = 0;
+#if !defined(PLAT_Unisoc) && !defined(PLAT_Unisoc_8910_R05) && !defined(PLAT_Unisoc_8850)
     char para[5]={0};
-    tlv_cellinfo_struct info = {0};
+#endif
+    //tlv_cellinfo_struct info = {0};
+       tlv_cellinfos_struct info = {0};
     Helios_NwCellInfoStruct cell_info = {0};
 
     extern int _get_current_simid(void);
@@ -810,17 +838,34 @@ STATIC mp_obj_t cell_locreqencode(size_t n_args, const mp_obj_t *args)
             {
                 if(cell_info.gsm_info[i].cid != 0)
                 {
-                    info.radio_type = NETWORK_MODE_GSM;
+                                       if (i > (LBS_MAX_CELL_NUM - 1))
+                                       {
+                                               break;
+                                       }
+                                       
+                                       info.cellinfo[i].radio_type = NETWORK_MODE_GSM;
+                                       
+                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850)
+                                       info.cellinfo[i].mcc = cell_info.gsm_info[i].mcc;
+                                       info.cellinfo[i].mnc = cell_info.gsm_info[i].mnc;
+                               #else
+                                       memset((void *)para, 0, sizeof(para));
                     sprintf(para,"%x",cell_info.gsm_info[i].mcc);
-                    sscanf(para,"%d",&(info.mcc));
+                    sscanf(para,"%d",&(info.cellinfo[i].mcc));
+                                       
+                                       memset((void *)para, 0, sizeof(para));
                     sprintf(para,"%x",cell_info.gsm_info[i].mnc);
-                    sscanf(para,"%d",&(info.mnc));
-                    info.lac = cell_info.gsm_info[i].lac;
-                    info.cellId = cell_info.gsm_info[i].cid;
-                    info.bcch = cell_info.gsm_info[i].arfcn;
-                    info.timead = 0xFFFF;
-                    info.signal = 0xFFD2;
-                    break;
+                    sscanf(para,"%d",&(info.cellinfo[i].mnc));
+                               #endif
+                               
+                    info.cellinfo[i].lac = cell_info.gsm_info[i].lac;
+                    info.cellinfo[i].cellId = cell_info.gsm_info[i].cid;
+                    info.cellinfo[i].bcch = cell_info.gsm_info[i].arfcn;
+                                       info.cellinfo[i].bsic = cell_info.gsm_info[i].bsic;
+                                       info.cellinfo[i].uarfcndl = cell_info.gsm_info[i].arfcn;
+                                       info.cellinfo[i].signal = cell_info.gsm_info[i].rssi;
+                    info.cellinfo[i].timead = 0xFFFF;
+                                       info.num++;
                 }
             }
         }
@@ -829,38 +874,76 @@ STATIC mp_obj_t cell_locreqencode(size_t n_args, const mp_obj_t *args)
             for(i = 0; i < cell_info.umts_info_num; i++)
             {
                 if(cell_info.umts_info[i].cid != 0)
-                {   
-                    info.radio_type = NETWORK_MODE_WCDMA;
+                {
+                                       if (i > (LBS_MAX_CELL_NUM - 1))
+                                       {
+                                               break;
+                                       }
+                                       
+                    info.cellinfo[i].radio_type = NETWORK_MODE_WCDMA;
+
+                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850)
+                                       info.cellinfo[i].mcc = cell_info.umts_info[i].mcc;
+                                       info.cellinfo[i].mnc = cell_info.umts_info[i].mnc;
+                               #else
+                                       memset((void *)para, 0, sizeof(para));
                     sprintf(para,"%x",cell_info.umts_info[i].mcc);
-                    sscanf(para,"%d",&(info.mcc));
+                    sscanf(para,"%d",&(info.cellinfo[i].mcc));
+
+                                       memset((void *)para, 0, sizeof(para));
                     sprintf(para,"%x",cell_info.umts_info[i].mnc);
-                    sscanf(para,"%d",&(info.mnc));
-                    info.lac = cell_info.umts_info[i].lac;
-                    info.cellId = cell_info.umts_info[i].cid;
-                    info.bcch = cell_info.umts_info[i].uarfcn;
-                    info.timead = 0xFFFF;
-                    info.signal = 0xFFD2;
+                    sscanf(para,"%d",&(info.cellinfo[i].mnc));
+                               #endif
+                               
+                    info.cellinfo[i].lac = cell_info.umts_info[i].lac;
+                    info.cellinfo[i].cellId = cell_info.umts_info[i].cid;
+                    info.cellinfo[i].bcch = cell_info.umts_info[i].uarfcn;
+                                       info.cellinfo[i].uarfcndl = cell_info.umts_info[i].uarfcn;
+                                       info.cellinfo[i].signal = cell_info.umts_info[i].rssi;
+                    info.cellinfo[i].timead = 0xFFFF;
+                                       info.num++;
                 }
-                break;
             }
         }
         else if(cell_info.lte_info_valid)
         {
             for(i = 0; i < cell_info.lte_info_num; i++)
             {
-                if(cell_info.lte_info[i].flag == 0)
+                if(cell_info.lte_info[i].cid != 0)
                 {
-                    info.radio_type = NETWORK_MODE_LTE;
+                                       if (i > (LBS_MAX_CELL_NUM - 1))
+                                       {
+                                               break;
+                                       }
+                                       
+                    info.cellinfo[i].radio_type = NETWORK_MODE_LTE;
+
+                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850)
+                                       info.cellinfo[i].mcc = cell_info.lte_info[i].mcc;
+                                       info.cellinfo[i].mnc = cell_info.lte_info[i].mnc;
+                               #else
+                                       memset((void *)para, 0, sizeof(para));
                     sprintf(para,"%x",cell_info.lte_info[i].mcc);
-                    sscanf(para,"%d",&(info.mcc));
+                    sscanf(para,"%d",&(info.cellinfo[i].mcc));
+
+                                       memset((void *)para, 0, sizeof(para));
                     sprintf(para,"%x",cell_info.lte_info[i].mnc);
-                    sscanf(para,"%d",&(info.mnc));
-                    info.lac = cell_info.lte_info[i].tac;
-                    info.cellId = cell_info.lte_info[i].cid;
-                    info.bcch = cell_info.lte_info[i].earfcn;
-                    info.timead = 0xFFFF;
-                    info.signal = 0xFFD2;
-                    break;
+                    sscanf(para,"%d",&(info.cellinfo[i].mnc));
+                               #endif
+                                       
+                    info.cellinfo[i].lac = cell_info.lte_info[i].tac;
+                                       info.cellinfo[i].tac = cell_info.lte_info[i].tac;
+                    info.cellinfo[i].cellId = cell_info.lte_info[i].cid;
+                                       info.cellinfo[i].pci = cell_info.lte_info[i].pci;
+                    info.cellinfo[i].bcch = cell_info.lte_info[i].earfcn;
+                                       info.cellinfo[i].earfcn = cell_info.lte_info[i].earfcn;
+                                       info.cellinfo[i].signal = cell_info.lte_info[i].rssi;
+                    info.cellinfo[i].timead = 0xFFFF;
+                    info.num++;
+
+                                       //QPY_MODLBS_LOG("[lte][%d]mcc:%x,mnc:%x,lac:%d,cellid:%d,bcch:%d\r\n", i,
+                                       //      cell_info.lte_info[i].mcc, cell_info.lte_info[i].mnc, cell_info.lte_info[i].tac,
+                                       //      cell_info.lte_info[i].cid, cell_info.lte_info[i].earfcn);
                 }            
             }
         }
@@ -869,7 +952,8 @@ STATIC mp_obj_t cell_locreqencode(size_t n_args, const mp_obj_t *args)
     {
         mp_raise_ValueError("Find cellinfo Fail.");
     }
-
+       QPY_MODLBS_LOG("cellnums=%d, 2GCell:%d, 3GCell:%d, 4GCell:%d\r\n", info.num, cell_info.gsm_info_num, 
+               cell_info.umts_info_num, cell_info.lte_info_num);
     mp_buffer_info_t tokeninfo = {0};
     mp_get_buffer_raise(args[0], &tokeninfo, MP_BUFFER_READ);
     
@@ -906,10 +990,16 @@ STATIC mp_obj_t encode_cell_locreq_tlvinfo(size_t n_args, const mp_obj_t *args)
                 mp_obj_new_float(position_rec.latitude),
                 mp_obj_new_int(position_rec.accuracy),
                 };
+        if ( firstNode != NULL ){
+            QTLVNode_Destroy(firstNode);
+        }
         return mp_obj_new_tuple(3, codeinfo_objs);
     }
     else
     {
+        if ( firstNode != NULL ){
+            QTLVNode_Destroy(firstNode);
+        }
         return mp_obj_new_int(-1);
     }
 }
index 32c30f3..366c3a5 100644 (file)
@@ -53,27 +53,27 @@ STATIC mp_obj_t qpy_datacall_set_pdp_context(size_t n_args, const mp_obj_t *args
        
        if ((profile_id < min_profile_id) || (profile_id > max_profile_id))
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, profileID should be in [%d,%d].", min_profile_id, max_profile_id);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, profileID should be in [%d,%d]."), min_profile_id, max_profile_id);
        }
        if ((ip_type < 0) || (ip_type > HELIOS_PDP_TYPE_NUM - 1))
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, ipType should be in [0~%d].", HELIOS_PDP_TYPE_NUM - 1);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, ipType should be in [0~%d]."), HELIOS_PDP_TYPE_NUM - 1);
        }
        if ((auth_type < 0) || (auth_type > HELIOS_AUTH_TYPE_NUM - 1))
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, authType should be in [0~%d].", HELIOS_AUTH_TYPE_NUM - 1);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, authType should be in [0~%d]."), HELIOS_AUTH_TYPE_NUM - 1);
        }
        if (apninfo.len > HELIOS_APN_LEN_MAX)
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of apn should be no more than [%d] bytes.", HELIOS_APN_LEN_MAX);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of apn should be no more than [%d] bytes."), HELIOS_APN_LEN_MAX);
        }
        if (usrinfo.len > HELIOS_USR_LEN_MAX)
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of username should be no more than [%d] bytes.", HELIOS_USR_LEN_MAX);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of username should be no more than [%d] bytes."), HELIOS_USR_LEN_MAX);
        }
        if (pwdinfo.len > HELIOS_PWD_LEN_MAX)
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of password should be no more than [%d] bytes.", HELIOS_PWD_LEN_MAX);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of password should be no more than [%d] bytes."), HELIOS_PWD_LEN_MAX);
        }
 
        Helios_DataCallStartStruct pdp_context = {0};
@@ -100,7 +100,7 @@ STATIC mp_obj_t qpy_datacall_get_pdp_context(size_t n_args, const mp_obj_t *args
        
        if ((profile_id < min_profile_id) || (profile_id > max_profile_id))
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, profileID should be in [%d,%d].", min_profile_id, max_profile_id);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, profileID should be in [%d,%d]."), min_profile_id, max_profile_id);
        }
 
        ret = Helios_DataCall_GetPDPContext(profile_id, &pdp_context);
@@ -155,27 +155,27 @@ STATIC mp_obj_t qpy_datacall_start(size_t n_args, const mp_obj_t *args)
        
        if ((profile_id < min_profile_id) || (profile_id > max_profile_id))
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, profileID should be in [%d,%d].", min_profile_id, max_profile_id);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, profileID should be in [%d,%d]."), min_profile_id, max_profile_id);
        }
        if ((ip_type < 0) || (ip_type > HELIOS_PDP_TYPE_NUM - 1))
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, ipType should be in [0~%d].", HELIOS_PDP_TYPE_NUM - 1);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, ipType should be in [0~%d]."), HELIOS_PDP_TYPE_NUM - 1);
        }
        if ((auth_type < 0) || (auth_type > HELIOS_AUTH_TYPE_NUM - 1))
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, authType should be in [0~%d].", HELIOS_AUTH_TYPE_NUM - 1);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, authType should be in [0~%d]."), HELIOS_AUTH_TYPE_NUM - 1);
        }
        if (apninfo.len > HELIOS_APN_LEN_MAX)
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of apn should be no more than [%d] bytes.", HELIOS_APN_LEN_MAX);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of apn should be no more than [%d] bytes."), HELIOS_APN_LEN_MAX);
        }
        if (usrinfo.len > HELIOS_USR_LEN_MAX)
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of username should be no more than [%d] bytes.", HELIOS_USR_LEN_MAX);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of username should be no more than [%d] bytes."), HELIOS_USR_LEN_MAX);
        }
        if (pwdinfo.len > HELIOS_PWD_LEN_MAX)
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of password should be no more than [%d] bytes.", HELIOS_PWD_LEN_MAX);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of password should be no more than [%d] bytes."), HELIOS_PWD_LEN_MAX);
        }
 
        MOD_DATACALL_LOG("[datacall] profile_idx=%d, ip_version=%d, auth_type=%d\r\n", profile_id, ip_type, auth_type);
@@ -210,11 +210,11 @@ STATIC mp_obj_t qpy_datacall_stop(size_t n_args, const mp_obj_t *args)
        
        if ((profile_id < min_profile_id) || (profile_id > max_profile_id))
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, profileID should be in [%d,%d].", min_profile_id, max_profile_id);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, profileID should be in [%d,%d]."), min_profile_id, max_profile_id);
        }
        if ((ip_type < 0) || (ip_type > 2))
        {
-               mp_raise_ValueError("invalid value, ipTpye should be in [0,2].");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, ipTpye should be in [0,2]."));
        }
 
        MP_THREAD_GIL_EXIT();
@@ -247,7 +247,7 @@ STATIC mp_obj_t qpy_datacall_set_autoconnect(size_t n_args, const mp_obj_t *args
        
        if ((profile_id < min_profile_id) || (profile_id > max_profile_id))
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, profileID should be in [%d,%d].", min_profile_id, max_profile_id);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, profileID should be in [%d,%d]."), min_profile_id, max_profile_id);
        }
        int cur_simid = _get_current_simid();
        ret = Helios_DataCall_SetAutoConnect((int32_t)profile_id, cur_simid, enable);
@@ -293,11 +293,11 @@ STATIC mp_obj_t qpy_datacall_get_info(size_t n_args, const mp_obj_t *args)
        
        if ((profile_id < min_profile_id) || (profile_id > max_profile_id))
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, profileID should be in [%d,%d].", min_profile_id, max_profile_id);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, profileID should be in [%d,%d]."), min_profile_id, max_profile_id);
        }
        if ((ip_type < 0) || (ip_type > HELIOS_PDP_TYPE_NUM - 1))
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, ipType should be in [0~%d].", HELIOS_PDP_TYPE_NUM - 1);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, ipType should be in [0~%d]."), HELIOS_PDP_TYPE_NUM - 1);
        }
        int cur_simid = _get_current_simid();
        ret = Helios_DataCall_GetInfo(profile_id, cur_simid, &info);
@@ -487,7 +487,7 @@ STATIC mp_obj_t qpy_datacall_get_apn(size_t n_args, const mp_obj_t *args)
     char apn[99+1] = {0};
        if (sim_id != 0)
        {
-               mp_raise_ValueError("invalid simid.");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid simid."));
        }
     if (n_args == 1)
     {
@@ -511,10 +511,10 @@ STATIC mp_obj_t qpy_datacall_get_apn(size_t n_args, const mp_obj_t *args)
     }
     else
     {
-        mp_raise_ValueError("invalid value, The number of parameters cannot be greater than 2.");
+        mp_raise_ValueError(MP_ERROR_TEXT("invalid value, The number of parameters cannot be greater than 2."));
     }
 #else
-    mp_raise_ValueError("NOT SUPPORT");
+    mp_raise_ValueError(MP_ERROR_TEXT("NOT SUPPORT"));
 #endif
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_get_apn_obj, 1, 2, qpy_datacall_get_apn);
index f586493..bbd7f02 100644 (file)
@@ -126,21 +126,21 @@ STATIC mp_obj_t example_exec(const mp_obj_t arg0)
        }
        if ( ret == -1 )
        {
-               mp_raise_msg_varg(&mp_type_OSError, "File path error or not exist: [%s]", (char *)bufinfo.buf);
+               mp_raise_msg_varg(&mp_type_OSError, MP_ERROR_TEXT("File path error or not exist: [%s]"), (char *)bufinfo.buf);
        }
        #if MICROPY_KBD_EXCEPTION
        else if(ret == RET_KBD_INTERRUPT)
        {
         pyexec_system_exit = PYEXEC_FORCED_EXIT;
         MAINPY_INTERRUPT_BY_KBD_FLAG_SET();
-        mp_raise_msg_varg(&mp_type_SystemExit, "CTRL_C Interrupt");
+        mp_raise_msg_varg(&mp_type_SystemExit, MP_ERROR_TEXT("CTRL_C Interrupt"));
        }
        #endif
        #if MICROPY_PY_SOFT_RESET
        else if((ret & PYEXEC_SOFTRESET) == PYEXEC_SOFTRESET)
        {
         pyexec_system_exit = PYEXEC_FORCED_EXIT;
-        mp_raise_msg_varg(&mp_type_SystemExit, "SoftReset");
+        mp_raise_msg_varg(&mp_type_SystemExit, MP_ERROR_TEXT("SoftReset"));
        }
        #endif
        // Pawn 2021-01-18 for JIRA STASR3601-2428 end
index e6dd0d4..3b380e8 100644 (file)
@@ -40,8 +40,6 @@ typedef struct
 
 //for callback
 static int default_level = 0x081F;
-static uint8_t cb_reg_output = _AW9523_REG_INPUT0;
-static uint8_t cb_reg_output_1 = _AW9523_REG_INPUT1;
 static uint8_t cb_reg_enable_flag = 0xff;
 
 typedef void(*aw_eint_handler_t)(void);
@@ -70,19 +68,21 @@ static void aw9523_key_extint_event(void * argv)
 
                        uint8_t read_buf = 0;
                        uint8_t read_buf_1 = 0;
-                       HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &cb_reg_output, 1, &read_buf, 1, 5);
-                       HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &cb_reg_output_1, 1, &read_buf_1, 1, 5);
+                       uint8_t reg_output = _AW9523_REG_INPUT0;
+                       uint8_t reg_output_1 = _AW9523_REG_INPUT1;
+                       HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &reg_output, 1, &read_buf, 1, 5);
+                       HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &reg_output_1, 1, &read_buf_1, 1, 5);
 
                        //port0和port1的电平
                        uint16_t reg_level = (read_buf_1 << 8) | read_buf;
                        int level_change = (default_level ^ reg_level);
                        default_level = reg_level;
 
-                       uint16_t pin = 0;
-                       uint8_t pin_level = 0;
                        //判断两组寄存器的电平是否有变化
                        if (level_change != 0)
                        {
+                               uint16_t pin = 0;
+                               uint8_t pin_level = 0;
                                //获取触发引脚和电平
                                while (pin < 16){
                                        if (level_change & (1 << pin)){
@@ -100,7 +100,16 @@ static void aw9523_key_extint_event(void * argv)
                                if (!(cb_reg_enable_flag & (1 << pin))){
                                        AW9523_EXTINT_CALLBACK_OP(msg.pin, pin, pin_level);
                                }
+                               if (Helios_GPIO_GetLevel(self->int_pin) != 1) {
+                                       HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &reg_output, 1, &read_buf, 1, 5);
+                                       HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &reg_output_1, 1, &read_buf_1, 1, 5);
+                               }
                        }       
+                       else if (Helios_GPIO_GetLevel(self->int_pin) != 1)
+                       {
+                               HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &reg_output, 1, &read_buf, 1, 5);
+                               HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &reg_output_1, 1, &read_buf_1, 1, 5);
+                       }
                }
 }
 
@@ -115,6 +124,7 @@ static void handler##X(void)
                                Key_Msg msg;                                                                                                                            \
                                msg.pin = X;                                                                                            \
                                Helios_MsgQ_Put(key_queue, (void *)&msg, sizeof(Key_Msg), HELIOS_NO_WAIT);      \
+                               Helios_ExtInt_Enable(aw9523_obj[X]->int_pin);                                                           \
                        }                                                                                                                                                               \
        }                                                                                                                                                                               \
 }
@@ -181,7 +191,7 @@ STATIC mp_obj_t aw9523_make_new(const mp_obj_type_t *type, size_t n_args, size_t
 
                Helios_ExtIntStruct extint_struct = {0};
                extint_struct.gpio_trigger = HELIOS_EDGE_TRIGGER;
-               extint_struct.gpio_edge = HELIOS_EDGE_BOTH;
+               extint_struct.gpio_edge = HELIOS_EDGE_FALLING;
                extint_struct.gpio_debounce = HELIOS_DEBOUNCE_EN;
                extint_struct.gpio_pull = HELIOS_PULL_UP;
                extint_struct.eint_cb = NULL;
@@ -193,7 +203,7 @@ STATIC mp_obj_t aw9523_make_new(const mp_obj_type_t *type, size_t n_args, size_t
 
                if(key_queue == 0)
                {
-                       key_queue = Helios_MsgQ_Create(10, sizeof(Key_Msg));
+                       key_queue = Helios_MsgQ_Create(20, sizeof(Key_Msg));
                        if(key_queue == 0)
                        {
                                mp_raise_ValueError("create aw9523 queue initialization failed");
@@ -204,7 +214,7 @@ STATIC mp_obj_t aw9523_make_new(const mp_obj_type_t *type, size_t n_args, size_t
                {
                        Helios_ThreadAttr attr = {0};
                        attr.name = "extgpio_aw9523";
-                       attr.stack_size = 2048;
+                       attr.stack_size = 4096;
                        attr.priority = 90;
                        attr.entry = aw9523_key_extint_event;
 
@@ -382,7 +392,7 @@ STATIC mp_obj_t aw9523_obj_read(mp_obj_t self_in,mp_obj_t pin)
     HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &reg_output, 1, &read_buf, 1, 5);
     HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &reg_output_1, 1, &read_buf_1, 1, 5);
 
-       uint8_t reg = (read_buf_1 << 8) | read_buf;
+       uint16_t reg = (read_buf_1 << 8) | read_buf;
        int pin_level = -1;
        if (reg & (1 << _pin)){
         pin_level = 1;
index 920315c..46022b5 100644 (file)
@@ -948,11 +948,11 @@ STATIC mp_obj_t qpy_net_set_band(size_t n_args, const mp_obj_t *args)
 
        if ((net_type < 0) || (net_type > 3))
        {
-        mp_raise_msg_varg(&mp_type_ValueError, "invalid value, net_type should be in [0,%d].", HELIOS_BAND_TYPE_MAX_NUM);
+        mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, net_type should be in [0,%d]."), HELIOS_BAND_TYPE_MAX_NUM);
        }
        if ((gsm_band < 0) || (gsm_band > 0x0f))
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, gsm_band should be in [0,%x].", HELIOS_BAND_GSM_MAXVALUE);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, gsm_band should be in [0,%x]."), HELIOS_BAND_GSM_MAXVALUE);
        }
 
        size_t len = 0;
@@ -991,7 +991,7 @@ STATIC mp_obj_t qpy_net_get_band(mp_obj_t net_type)
        int band_type = mp_obj_get_int(net_type);
        if ((band_type < 0) || (band_type > 3))
        {
-               mp_raise_ValueError("invalid value, net_type should be in [0,3].");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, net_type should be in [0,3]."));
        }
 
        int ret = 0;
@@ -1346,11 +1346,11 @@ STATIC mp_obj_t qpy_net_set_apn(size_t n_args, const mp_obj_t *args)
         int ret = 0;
         if (net_simid != 0)
         {
-            mp_raise_ValueError("invalid simid.");
+            mp_raise_ValueError(MP_ERROR_TEXT("invalid simid."));
         }
         if (apninfo.len > HELIOS_APN_LEN_MAX)
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of apn should be no more than [%d] bytes.", HELIOS_APN_LEN_MAX);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of apn should be no more than [%d] bytes."), HELIOS_APN_LEN_MAX);
        }       
         ret = Helios_Nw_SetApn((char *)apninfo.buf, net_simid);
        if (ret == 0)
@@ -1382,31 +1382,31 @@ STATIC mp_obj_t qpy_net_set_apn(size_t n_args, const mp_obj_t *args)
 
             if (net_simid != 0)
             {
-                mp_raise_ValueError("invalid simid.");
+                mp_raise_ValueError(MP_ERROR_TEXT("invalid simid."));
             }
                if ((profile_id < min_profile_id) || (profile_id > max_profile_id))
                {
-                       mp_raise_msg_varg(&mp_type_ValueError, "invalid value, profileIdx should be in [%d,%d].", min_profile_id, max_profile_id);
+                       mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, profileIdx should be in [%d,%d]."), min_profile_id, max_profile_id);
                }
                if ((ip_type < 0) || (ip_type > HELIOS_PDP_TYPE_NUM - 1))
                {
-                       mp_raise_msg_varg(&mp_type_ValueError, "invalid value, ipType should be in [0~%d].", HELIOS_PDP_TYPE_NUM-1);
+                       mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, ipType should be in [0~%d]."), HELIOS_PDP_TYPE_NUM-1);
                }
                if ((auth_type < 0) || (auth_type > HELIOS_AUTH_TYPE_NUM - 1))
                {
-                       mp_raise_msg_varg(&mp_type_ValueError, "invalid value, authType should be in [0~%d].", HELIOS_AUTH_TYPE_NUM-1);
+                       mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, authType should be in [0~%d]."), HELIOS_AUTH_TYPE_NUM-1);
                }
                if (apninfo.len > HELIOS_APN_LEN_MAX)
                {
-                       mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of apn should be no more than [%d] bytes.", HELIOS_APN_LEN_MAX);
+                       mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of apn should be no more than [%d] bytes."), HELIOS_APN_LEN_MAX);
                }
                if (usrinfo.len > HELIOS_USR_LEN_MAX)
                {
-                       mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of username should be no more than [%d] bytes.", HELIOS_USR_LEN_MAX);
+                       mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of username should be no more than [%d] bytes."), HELIOS_USR_LEN_MAX);
                }
                if (pwdinfo.len > HELIOS_PWD_LEN_MAX)
                {
-                       mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of password should be no more than [%d] bytes.", HELIOS_PWD_LEN_MAX);
+                       mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of password should be no more than [%d] bytes."), HELIOS_PWD_LEN_MAX);
                }
 
                QPY_NET_LOG("[NW-PDNINFO] profile_idx=%d, ip_version=%d, auth_type=%d\r\n", profile_id, ip_type, auth_type);
@@ -1427,7 +1427,7 @@ STATIC mp_obj_t qpy_net_set_apn(size_t n_args, const mp_obj_t *args)
         }
         else
         {
-            mp_raise_ValueError("Incorrect parameter number!");
+            mp_raise_ValueError(MP_ERROR_TEXT("Incorrect parameter number!"));
         }
     }
 }
@@ -1444,7 +1444,7 @@ STATIC mp_obj_t qpy_net_get_apn(size_t n_args, const mp_obj_t *args)
         char apn[99+1] = {0};
         if (net_simid != 0)
         {
-            mp_raise_ValueError("invalid simid.");
+            mp_raise_ValueError(MP_ERROR_TEXT("invalid simid."));
         }
         ret = Helios_Nw_GetApn(apn, net_simid);
        if (ret == 0)
@@ -1465,12 +1465,12 @@ STATIC mp_obj_t qpy_net_get_apn(size_t n_args, const mp_obj_t *args)
 
             if (net_simid != 0)
             {
-                mp_raise_ValueError("invalid simid.");
+                mp_raise_ValueError(MP_ERROR_TEXT("invalid simid."));
             }
             
             if ((profile_id < HELIOS_PROFILE_IDX_MIN) || (profile_id > HELIOS_PROFILE_IDX_MAX))
                {
-                       mp_raise_ValueError("invalid profile_id.");
+                       mp_raise_ValueError(MP_ERROR_TEXT("invalid profile_id."));
                }
             memset(&pdpinfo_get, 0, sizeof(Helios_DataCallStartStruct));
             ret = Helios_DataCall_GetPDPContext(profile_id, &pdpinfo_get);
@@ -1488,7 +1488,7 @@ STATIC mp_obj_t qpy_net_get_apn(size_t n_args, const mp_obj_t *args)
         }
         else
         {
-            mp_raise_ValueError("Incorrect parameter number!");
+            mp_raise_ValueError(MP_ERROR_TEXT("Incorrect parameter number!"));
         }
     }
 }
@@ -1644,6 +1644,150 @@ STATIC mp_obj_t qpy_ftm_mode_stop(void)
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_ftm_mode_stop_obj, qpy_ftm_mode_stop);
 #endif
 
+
+
+#if MICROPY_QPY_MODULE_BACKCELL
+
+STATIC mp_obj_t qpy_add_black_cell(size_t n_args, const mp_obj_t *args)
+{
+       int8_t ret = -1;
+       uint8_t rat =5;
+       if (n_args == 2){
+               rat = mp_obj_get_int(args[1]);
+       }
+       mp_buffer_info_t cell_info = {0};
+       mp_get_buffer_raise(args[0], &cell_info, MP_BUFFER_READ);
+       MP_THREAD_GIL_EXIT();
+       ret = Helios_Nw_AddBlackCell(rat, (char *)cell_info.buf);
+       MP_THREAD_GIL_ENTER();
+       if (ret != 0){
+               ret =-1;
+       }
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_add_black_cell_obj, 1, 2, qpy_add_black_cell);
+
+STATIC mp_obj_t qpy_get_black_cell(void)
+{
+       int8_t ret = 0;
+       int8_t i = 0;
+       mp_obj_t list_gsm  = mp_obj_new_list(0, NULL);
+       mp_obj_t list_lte  = mp_obj_new_list(0, NULL);
+       Helios_NwBackCellInfo info;
+       memset(&info, 0, sizeof(Helios_NwBackCellInfo));
+       MP_THREAD_GIL_EXIT();
+       ret = Helios_Nw_GetBlackCell(&info);
+       MP_THREAD_GIL_ENTER();
+       if (ret == 0){
+               if (info.gsm_info_num > 0)
+               {
+                       for (i=0; i<info.gsm_info_num; i++)
+                       {
+                               mp_obj_list_append(list_gsm, mp_obj_new_str(info.gsm_cell_info[i], strlen(info.gsm_cell_info[i])));
+                       }                       
+               }
+               if (info.lte_info_num > 0)
+               {
+                       for (i=0; i<info.lte_info_num; i++)
+                       {
+                               mp_obj_list_append(list_lte, mp_obj_new_str(info.lte_cell_info[i], strlen(info.lte_cell_info[i])));
+                       }
+               }
+               mp_obj_t list[2] = {list_gsm, list_lte};
+               return mp_obj_new_tuple(2, list);
+       }
+       if (ret != 0){
+               ret =-1;
+       }
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_get_black_cell_obj, qpy_get_black_cell);
+
+STATIC mp_obj_t qpy_get_black_cell_cfg(void)
+{
+
+       int8_t ret = 0;
+       int blackcellCfg = 0;
+       int blackcellCfg_num = 0;
+       ret = Helios_Nw_GetBlackCellCfg(&blackcellCfg,&blackcellCfg_num);
+       if (ret == 0)
+       {
+               mp_obj_t list[2] = {mp_obj_new_int(blackcellCfg), mp_obj_new_int(blackcellCfg_num)};
+               return mp_obj_new_tuple(2, list);
+       }
+       if (ret != 0){
+               ret =-1;
+       }
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_get_black_cell_cfg_obj, qpy_get_black_cell_cfg);
+
+
+STATIC mp_obj_t qpy_set_black_cell_cfg(size_t n_args, const mp_obj_t *args)
+{
+       int8_t ret = -1;
+       uint8_t blackcellCfg = mp_obj_get_int(args[0]);
+       if (blackcellCfg > 1)
+       {
+               mp_raise_ValueError("invalid value, blackcellCfg should be in [0,1].");
+       }
+       uint8_t blackcellCfg_num = mp_obj_get_int(args[1]);
+       if (blackcellCfg_num > 8)
+       {
+               mp_raise_ValueError("invalid value, blackcellCfg_num should be in [0,8].");
+       }
+       ret = Helios_Nw_SetBlackCellCfg(blackcellCfg, blackcellCfg_num);
+       if (ret != 0){
+               ret =-1;
+       }
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_set_black_cell_cfg_obj, 2, 2, qpy_set_black_cell_cfg);
+
+STATIC mp_obj_t qpy_delete_black_cell(size_t n_args, const mp_obj_t *args)
+{
+       int8_t ret = -1;
+       if (n_args == 0)
+       {
+               ret = Helios_Nw_DeleteAllBlackCell();
+       }
+       else if (n_args == 1)
+       {
+               uint8_t rat = 5;
+               mp_buffer_info_t cell_info = {0};
+               mp_get_buffer_raise(args[0], &cell_info, MP_BUFFER_READ);
+               MP_THREAD_GIL_EXIT();
+               ret = Helios_Nw_DeleteBlackCell(rat, (char *)cell_info.buf);
+               MP_THREAD_GIL_ENTER();
+       }
+       if (ret != 0){
+               ret =-1;
+       }
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_delete_black_cell_obj, 0, 1, qpy_delete_black_cell);
+
+
+STATIC mp_obj_t qpy_set_black_cell(mp_obj_t mode)
+{
+       int8_t ret = -1;
+       uint8_t black_cell_mode = mp_obj_get_int(mode);
+       if (black_cell_mode > 1)
+       {
+               mp_raise_ValueError("invalid value, mode should be in [0,1].");
+       }
+       MP_THREAD_GIL_EXIT();
+       ret = Helios_Nw_SetBlackCell(black_cell_mode);
+       MP_THREAD_GIL_ENTER();
+       if (ret != 0){
+               ret = -1;
+       }
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_set_black_cell_obj, qpy_set_black_cell);
+
+#endif
+
 STATIC const mp_rom_map_elem_t net_module_globals_table[] = {
        { MP_OBJ_NEW_QSTR(MP_QSTR___name__),    MP_ROM_QSTR(MP_QSTR_net)                                        },
        { MP_ROM_QSTR(MP_QSTR___qpy_module_deinit__),   MP_ROM_PTR(&qpy_module_net_deinit_obj) },
@@ -1687,6 +1831,15 @@ STATIC const mp_rom_map_elem_t net_module_globals_table[] = {
        { MP_ROM_QSTR(MP_QSTR_ftmTestStop),         MP_ROM_PTR(&qpy_ftm_mode_stop_obj) },
 #endif
 
+#if MICROPY_QPY_MODULE_BACKCELL
+       { MP_ROM_QSTR(MP_QSTR_setBlackCell),         MP_ROM_PTR(&qpy_set_black_cell_obj) },
+       { MP_ROM_QSTR(MP_QSTR_addBlackCell),         MP_ROM_PTR(&qpy_add_black_cell_obj) },
+       { MP_ROM_QSTR(MP_QSTR_getBlackCell),         MP_ROM_PTR(&qpy_get_black_cell_obj) },
+       { MP_ROM_QSTR(MP_QSTR_getBlackCellCfg),         MP_ROM_PTR(&qpy_get_black_cell_cfg_obj) },
+       { MP_ROM_QSTR(MP_QSTR_setBlackCellCfg),         MP_ROM_PTR(&qpy_set_black_cell_cfg_obj) },
+       { MP_ROM_QSTR(MP_QSTR_deleteBlackCell),         MP_ROM_PTR(&qpy_delete_black_cell_obj) },
+#endif
+
 };
 
 STATIC MP_DEFINE_CONST_DICT(net_module_globals, net_module_globals_table);
index 61564c6..bc07eac 100644 (file)
 #if defined(BOARD_EC600MCN_LA_POC_XBND)
 #include "helios_pin.h"
 #include "helios_os.h"
-
+#include "helios_extint.h"
+#include "helios_timer.h"
+#include "helios_debug.h"
 void poc_speak_ctl_entry(void* p);
-Helios_ThreadAttr thread_poc_speak_t ={"poc_speak",2048,95,poc_speak_ctl_entry};
+Helios_ThreadAttr thread_poc_speak_t = {"poc_speak",2048,95,poc_speak_ctl_entry};
 Helios_Thread_t thread_poc_speak_ctl_t = 0;
 Helios_MsgQ_t msg_poc_speak_t = 0;
 PTT_CFG_T ptt_cfg =
 {
        DEAL_BY_USER,
-       TYPE_KEYPAD,
-       {
-               0xff,
-               0xff
-       },
+       0,
        {
-               0xff,
-               PRESS_LEVEL_LOW 
+               {
+                       .key_type = 0,
+                       .key_info.keypad_key_info = {0,0},
+               },
+               {
+                       .key_type = 0,
+                       .key_info.keypad_key_info = {0,0},      
+               },
+               {
+                       .key_type = 0,
+                       .key_info.keypad_key_info = {0,0},
+               },
+               {
+                       .key_type = 0,
+                       .key_info.keypad_key_info = {0,0},      
+               },
+               {
+                       .key_type = 0,
+                       .key_info.keypad_key_info = {0,0},      
+               }
        }
 };
 #endif
@@ -491,6 +507,11 @@ int location_switch= 0;
 int report_rate = 0;
 STATIC void qpy_poc_cell_location_change_callback(int location_switch, int report_rate);
 
+STATIC void qpy_poc_register_sos_status_callback(char send_sos_status);
+STATIC void qpy_poc_register_sos_map_callback(char *z8filename,char *z12filename, char *z16filename,char is_sos_map);
+STATIC void qpy_poc_register_recv_sos_info_callback(char *sendname, char *timestamp, double lon, double lat);
+STATIC void qpy_poc_register_recv_enclosure_alarm_callback(int alarm, char *tips);
+
 static void qpy_poc_prefunction_cell_location_change_cb(int location_switch_in, int report_rate_in){
     
     location_switch = location_switch_in;
@@ -1072,6 +1093,7 @@ void poc_speak_ctl_entry(void* p)
                {
                        break;
                }
+               //helios_debug("poc_speak_ctl_entry data:%d\r\n",data);
         if(data == 0)
         {
                        if(poc_ops)
@@ -1115,66 +1137,254 @@ STATIC mp_obj_t qpy_poc_speak_mode(size_t n_args,const mp_obj_t *args)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_poc_speak_mode_obj, 0, 1, qpy_poc_speak_mode);
 
+typedef struct {
+    mp_obj_base_t base;
+    mp_int_t line;
+       mp_int_t mode;
+       mp_int_t pull;
+       PTT_KEY_LEVEL_T press_lvl;
+       c_callback_t callback;
+       unsigned char ptt_num;
+} extint_obj_t;
+static extint_obj_t *extint_obj[5];
+
+typedef void(*eint_handler_t)(void);
+#define TIMER_TIME_10_MS 10
+static int timer_debuonce_[5] = {0};
+
+enum {
+       HELIOS_EXTINT_RISING,
+       HELIOS_EXTINT_FALLING,
+};
+
+#if MICROPY_ENABLE_CALLBACK_DEAL
+#define EXTINT_CALLBACK_OP(X, edge)     do{                                                                                     \
+                                            st_CallBack_Extint *extint = malloc(sizeof(st_CallBack_Extint));                    \
+                                           if(NULL != extint) {                                                                \
+                                                   extint->pin_no = X->line;                                                             \
+                                                   extint->edge = X->press_lvl^edge;                                                            \
+                                                   extint->callback = X->callback;                                     \
+                                                   qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_EXTINT, extint);          \
+                                               }                                                                                   \
+                                        }while(0)
+#else
+#define EXTINT_CALLBACK_OP(X, edge)     do{                                                                                     \
+                                            GC_STACKTOP_SET();                                                                  \
+                                            mp_obj_t extint_list[2] = {                                                         \
+                                                mp_obj_new_int(X->line),                                                              \
+                                                mp_obj_new_int(edge),                                                           \
+                                            };                                                                                  \
+                                            mp_sched_schedule_ex(&X->callback,  mp_obj_new_list(2, extint_list));   \
+                                            GC_STACKTOP_CLEAR();                                                                \
+                                        }while(0)
+
+#endif
+
+#define extra_deal(x,y)                                                                                       \
+       if(ptt_cfg.speak_deal_mode == DEAL_BY_CALLBACK)                    \
+    {                                                                                                         \
+                       unsigned char data = 0;                                                                           \
+                       data = y^x->press_lvl;                                                                                                                                  \
+                       if(data)                                                                                                                                                                \
+                       {                                                                                                                                                                                               \
+                               ptt_cfg.pressed |= 1 << x->ptt_num;                                                                                                             \
+                       }                                                                                                                                                                                       \
+                       else                                                                                                                                                                            \
+                       {                                                                                                                                                                                       \
+                               ptt_cfg.pressed &= ~(1 << x->ptt_num);                                                                                                                                  \
+                       }                                                                                                                                                                                       \
+                       if(msg_poc_speak_t)                                                                   \
+                   {                                                                                     \
+                               Helios_MsgQ_Put(msg_poc_speak_t, &data, sizeof(unsigned char), HELIOS_NO_WAIT);   \
+                   }                                                                                                                                                                                                                   \
+     }   
+
+
+static void debounce_timer_isr(uint32_t p) 
+{
+       extint_obj_t *pt = (extint_obj_t *)p;
+       int edge = HELIOS_EXTINT_RISING;
+       if(ptt_cfg.speak_deal_mode == DEAL_BY_CALLBACK)
+       {
+               if(pt->mode != HELIOS_EDGE_BOTH)
+               {
+                       return;
+               }
+               if(Helios_GPIO_GetLevel((Helios_GPIONum)(pt->line)) == 0)                                    
+               {                                                                                                                                                               
+                       edge = HELIOS_EXTINT_FALLING;                                                                                          
+               }                                                                                   
+
+               if((ptt_cfg.pressed == 0) || (ptt_cfg.pressed & (1<<(pt->ptt_num))))                                                                                                    
+               {                                                                                                                                                                                                                               
+                       if(pt->callback.cb != mp_const_none &&                               
+                                           ((mp_sched_num_pending() < MICROPY_SCHEDULER_DEPTH)))                       
+                       {                                                                                                   
+                               EXTINT_CALLBACK_OP(pt, edge);                                       
+                       }               
+                       extra_deal(pt,edge);  
+               }
+       }
+       Helios_ExtInt_Enable(pt->line);                                       
+}
+
+#define EINT_HANDLER_DEF(n) handler##n
+#define PLAT_EINT_HANDLER_DEF(n) BOOST_PP_REPEAT_1(n,EINT_HANDLER_DEF)
+
+
+#define HANDLER_FUN(X)                                                                                                                                     \
+static void handler##X(void)                                                   \
+{                                                                                  \
+       if(timer_debuonce_[X] == 0)                                                                                                     \
+       {                                                                                                                                                               \
+               timer_debuonce_[X] = Helios_Timer_init((void* )debounce_timer_isr, (void*)extint_obj[X]);\
+       }                                                                                                                                                                                               \
+       Helios_Timer_Start(timer_debuonce_[X], TIMER_TIME_10_MS, 0);                                                                    \
+}  
+HANDLER_FUN(0)
+HANDLER_FUN(1)
+HANDLER_FUN(2)
+HANDLER_FUN(3)
+HANDLER_FUN(4)
+
+
+
+static eint_handler_t eint_handler_[5] = {
+       handler0, PLAT_EINT_HANDLER_DEF(4)
+};
+
 //get PTT KEY info ,called by user
 STATIC mp_obj_t qpy_poc_ptt_cfg(size_t n_args,const mp_obj_t *args) 
 {      
        int ret = 0;
        unsigned char temp1 = 0;
        unsigned char temp2 = 0;
-       if(n_args == 3)
+       unsigned char i = 0;
+       size_t len;
+       PTT_CFG_T ptt_cfg_back = ptt_cfg;
+       //helios_debug("qpy_poc_ptt_cfg n_args:%d\r\n",n_args);
+       if((n_args > 0) && (n_args <= 5))//set ptt, max support ptt key number:5
        {
-           ptt_cfg.key_type = mp_obj_get_int(args[0]);
-           if(ptt_cfg.key_type == TYPE_KEYPAD)//keypad
-           {
-               ptt_cfg.keypad_key_info.row = mp_obj_get_int(args[1]);
-                       ptt_cfg.keypad_key_info.col = mp_obj_get_int(args[2]);
+               if(ptt_cfg.speak_deal_mode == DEAL_BY_USER)
+               {
+                       mp_raise_ValueError("mode error");
                }
-               else if(ptt_cfg.key_type == TYPE_GPIO)//独立按键
+
+               mp_obj_t *items;
+               memset(&ptt_cfg.key_cfg,0,sizeof(ptt_cfg.key_cfg));
+               //helios_debug("qpy_poc_ptt_cfg ptt_cfg.key_cfg[0]:%d\r\n",n_args);
+               for(i=0;i<n_args;i++)
                {
-                   ptt_cfg.gpio_key_info.gpio_num = mp_obj_get_int(args[1]);
-                       if(ptt_cfg.gpio_key_info.gpio_num > PLAT_GPIO_NUM)
+                       mp_obj_get_array(args[i], &len, &items);
+                       //helios_debug("qpy_poc_ptt_cfg len=%d\r\n",len);
+                       if((len > 4) || (len < 3))
                        {
-                          ret = -1;
+                               ptt_cfg = ptt_cfg_back;
+                               mp_raise_ValueError("invalid para");
                        }
-                       ptt_cfg.gpio_key_info.level_press = mp_obj_get_int(args[2]);
-                       if((ptt_cfg.gpio_key_info.level_press != PRESS_LEVEL_HIGH) && (ptt_cfg.gpio_key_info.level_press != PRESS_LEVEL_LOW))
+
+                       if(len == 4)//gpio  
+                       {       
+                               //helios_debug("qpy_poc_ptt_cfg len=4\r\n");
+                               ptt_cfg.key_cfg[i].key_type = mp_obj_get_int(items[0]);
+                               if(mp_obj_get_int(items[0]) != TYPE_GPIO)
+                               {
+                                       ptt_cfg = ptt_cfg_back;
+                                       mp_raise_ValueError("invalid para");
+                               }
+                               
+                               ptt_cfg.key_cfg[i].key_info.gpio_key_info.gpio_num = mp_obj_get_int(items[1]);
+                               ptt_cfg.key_cfg[i].key_info.gpio_key_info.level_press = mp_obj_get_int(items[2]);
+
+                               if(mp_obj_get_int(items[1]) > PLAT_GPIO_NUM)
+                               {          
+                                  ptt_cfg = ptt_cfg_back;
+                                  mp_raise_ValueError("invalid para");
+                               }
+                               if((mp_obj_get_int(items[2]) != PRESS_LEVEL_HIGH) && (mp_obj_get_int(items[2]) != PRESS_LEVEL_LOW))
+                               {                           
+                                       ptt_cfg = ptt_cfg_back;
+                                       mp_raise_ValueError("invalid para");
+                               }
+                               if(extint_obj[i] == NULL)
+                               {
+                                       extint_obj[i] = m_new_obj_with_finaliser(extint_obj_t);
+                               }
+
+                               extint_obj[i]->line = mp_obj_get_int(items[1]);
+                               extint_obj[i]->mode = HELIOS_EDGE_BOTH;
+                               extint_obj[i]->pull = (ptt_cfg.key_cfg[i].key_info.gpio_key_info.level_press == PRESS_LEVEL_LOW)?HELIOS_PULL_UP:HELIOS_PULL_DOWN;
+                               extint_obj[i]->press_lvl = mp_obj_get_int(items[2]);
+                               extint_obj[i]->ptt_num  = i;
+                               mp_sched_schedule_callback_register(&extint_obj[i]->callback, items[3]);
+                               
+                               //init extint
+                               Helios_ExtIntStruct extint_struct = {0};
+                               extint_struct.gpio_trigger = HELIOS_EDGE_TRIGGER;
+                               extint_struct.gpio_edge = HELIOS_EDGE_BOTH;
+                               extint_struct.gpio_debounce = HELIOS_DEBOUNCE_EN;
+                               extint_struct.gpio_pull = (ptt_cfg.key_cfg[i].key_info.gpio_key_info.level_press == PRESS_LEVEL_LOW)?HELIOS_PULL_UP:HELIOS_PULL_DOWN;
+                               extint_struct.eint_cb = NULL;
+                               extint_struct.wakeup_eint_cb = eint_handler_[i];
+
+                               if(0 != Helios_ExtInt_Init((Helios_GPIONum) extint_obj[i]->line,  &extint_struct)) 
+                               {
+                                       ptt_cfg = ptt_cfg_back;
+                                       mp_raise_ValueError("Interrupt initialization failed");
+                               }
+                               ret = Helios_ExtInt_Enable((Helios_GPIONum) extint_obj[i]->line);
+                               if(ret)
+                               {
+                                       ptt_cfg = ptt_cfg_back;
+                               return mp_obj_new_int(ret);
+                               }
+
+                       }
+                       else if(len == 3)
                        {
-                   ret = -1;
+                               //helios_debug("qpy_poc_ptt_cfg len=3\r\n");
+                               ptt_cfg.key_cfg[i].key_type = mp_obj_get_int(items[0]);
+                               if(ptt_cfg.key_cfg[i].key_type != TYPE_KEYPAD)
+                               {
+                                       ptt_cfg = ptt_cfg_back;
+                                       mp_raise_ValueError("invalid para");
+                               }
+                               ptt_cfg.key_cfg[i].key_info.keypad_key_info.row = mp_obj_get_int(items[1]);
+                               ptt_cfg.key_cfg[i].key_info.keypad_key_info.col = mp_obj_get_int(items[2]);
                        }
+
+               
                }
-               else
-               {
-                       ret = -1;
-               }
-           return mp_obj_new_int(ret);
+               return mp_obj_new_int(ret);
        }
+       
        else if(n_args == 0)
        {
-               if(ptt_cfg.key_type == TYPE_KEYPAD)
+               mp_obj_t res = mp_obj_new_list(0, NULL);
+               for(i=0;i<5;i++)
                {
-            temp1 = ptt_cfg.keypad_key_info.row;
-            temp2 = ptt_cfg.keypad_key_info.col;
-               }
-               else
-               {
-                       temp1 = ptt_cfg.gpio_key_info.gpio_num;
-            temp2 = ptt_cfg.gpio_key_info.level_press;
+                       if(ptt_cfg.key_cfg[i].key_type != 0)
+                       {
+                               mp_obj_t tuple[3] = 
+                               {
+                           mp_obj_new_int(ptt_cfg.key_cfg[i].key_type),
+                                       mp_obj_new_int(ptt_cfg.key_cfg[i].key_info.gpio_key_info.gpio_num),
+                                       mp_obj_new_int(ptt_cfg.key_cfg[i].key_info.gpio_key_info.level_press),          
+                       };
+                               mp_obj_list_append(res, mp_obj_new_tuple(3, tuple));
+                       }
                }
-               mp_obj_t tuple[3] = 
-               {
-            mp_obj_new_int(ptt_cfg.key_type),
-                       mp_obj_new_int(temp1),
-                       mp_obj_new_int(temp2),          
-        };
-        return mp_obj_new_tuple(3, tuple);
+        return res;
        }
+
        else
        {
                ret = -1;
                return mp_obj_new_int(ret);
        }
+       return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_poc_ptt_cfg_obj, 0, 3, qpy_poc_ptt_cfg);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_poc_ptt_cfg_obj, 0, 5, qpy_poc_ptt_cfg);
 
 STATIC void qpy_poc_register_sos_status_callback(char send_sos_status){
     if(!(poc_obj.register_sos_status_cb.cb)) return;
@@ -1271,9 +1481,20 @@ STATIC mp_obj_t qpy_poc_set_tone_switch(mp_obj_t value)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_set_tone_switch_obj, qpy_poc_set_tone_switch);
 #endif
-
 //tone switch end
 
+#if defined(CONFIG_POC_QS)
+STATIC mp_obj_t qpy_poc_set_tone_CodeGain(mp_obj_t value) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    int ret = -1;
+    float tone_gain = mp_obj_get_float(value);
+    ret = poc_ops->set_tone_codecGain(tone_gain);
+    return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_set_tone_codeGain_obj, qpy_poc_set_tone_CodeGain);
+#endif
+
 //calluser
 
 STATIC mp_obj_t qpy_poc_calluser(mp_obj_t poc_uid, mp_obj_t poc_cb)
@@ -1708,7 +1929,7 @@ STATIC mp_obj_t qpy_poc_set_vol(mp_obj_t type,mp_obj_t vol)
         return mp_obj_new_int(-1);
     }
     poc_ops_t *poc_ops = poc_get_ops();
-#if defined(CONFIG_POC_BND_XIN ) || defined(CONFIG_POC_BND )
+#if defined(CONFIG_POC_BND_XIN ) || defined(CONFIG_POC_BND ) || defined(CONFIG_POC_YDWL)
     VOL_TYPE voice_type = (VOL_TYPE) mp_obj_get_int(type);
     int voice_value = (int) mp_obj_get_int(vol);
     poc_ops->set_vol(voice_type , voice_value);
@@ -1908,6 +2129,17 @@ STATIC mp_obj_t qpy_poc_tts_play(mp_obj_t data_obj) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_tts_play_obj, qpy_poc_tts_play);
 
+STATIC mp_obj_t qpy_poc_get_map_png(size_t n_args, const mp_obj_t *args) 
+{      
+    if (  !mp_obj_is_int(args[2])   || !mp_obj_is_int(args[3]) ||\
+          !mp_obj_is_float(args[0]) || !mp_obj_is_float(args[1]) )
+    {
+        return mp_obj_new_int(-1);
+    }
+    poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->get_map_png(mp_obj_get_float_to_d(args[0]), mp_obj_get_float_to_d(args[1]),mp_obj_get_int(args[2]),mp_obj_get_int(args[3])));
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_poc_get_map_png_obj, 4, 4, qpy_poc_get_map_png);
 #endif
 
 #if defined(CONFIG_POC_ZZD) || defined(CONFIG_POC_YDWL)
@@ -2782,6 +3014,14 @@ STATIC mp_obj_t qpy_poc_get_friendcount()
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_friendcount_obj, qpy_poc_get_friendcount);
 
+STATIC mp_obj_t qpy_poc_play_tone()
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    poc_ops->play_tone();
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_play_tone_obj, qpy_poc_play_tone);
+
 STATIC mp_obj_t qpy_poc_get_friendlist()
 {
        poc_ops_t *poc_ops = poc_get_ops();
@@ -2966,6 +3206,23 @@ STATIC mp_obj_t qpy_poc_get_gps_set_value()
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_gps_set_value_obj, qpy_poc_get_gps_set_value);
 
+STATIC mp_obj_t qpy_poc_set_gps_value(mp_obj_t arg)
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(arg))
+    {
+        return mp_obj_new_int(-1);
+    }
+    int value = mp_obj_get_int(arg);
+    if (value < 0 || value >6)
+    {
+        return mp_obj_new_int(-1);
+    }
+    poc_ops->set_gps_value(value);
+       return mp_obj_new_int(0);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_set_gps_value_obj, qpy_poc_set_gps_value);
+
 STATIC mp_obj_t qpy_poc_play_tts_request_location_permission()
 {
     poc_ops_t *poc_ops = poc_get_ops();
@@ -3266,10 +3523,13 @@ STATIC const mp_rom_map_elem_t mp_module_poc_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_record_get_state), MP_ROM_PTR(&qpy_poc_record_get_state_obj) },
     { MP_ROM_QSTR(MP_QSTR_tts_init), MP_ROM_PTR(&qpy_poc_tts_init_obj) },
     { MP_ROM_QSTR(MP_QSTR_tts_play), MP_ROM_PTR(&qpy_poc_tts_play_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_map), MP_ROM_PTR(&qpy_poc_get_map_png_obj) },
 #endif
 
 #if defined(CONFIG_POC_QS)
-       { MP_ROM_QSTR(MP_QSTR_Set_Tone_Switch),  MP_ROM_PTR(&qpy_poc_set_tone_switch_obj) },
+       { MP_ROM_QSTR(MP_QSTR_set_tone_switch),  MP_ROM_PTR(&qpy_poc_set_tone_switch_obj) },
+    { MP_ROM_QSTR(MP_QSTR_play_tone),  MP_ROM_PTR(&qpy_poc_play_tone_obj) },
+       { MP_ROM_QSTR(MP_QSTR_Set_Tone_Gain),  MP_ROM_PTR(&qpy_poc_set_tone_codeGain_obj) },
 #endif
 
 
@@ -3380,6 +3640,7 @@ STATIC const mp_rom_map_elem_t mp_module_poc_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_open_gps), MP_ROM_PTR(&qpy_poc_open_gps_obj) },
     { MP_ROM_QSTR(MP_QSTR_close_gps), MP_ROM_PTR(&qpy_poc_close_gps_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_gps_set_value), MP_ROM_PTR(&qpy_poc_get_gps_set_value_obj) },
+    { MP_ROM_QSTR(MP_QSTR_set_gps_value), MP_ROM_PTR(&qpy_poc_set_gps_value_obj) },
     { MP_ROM_QSTR(MP_QSTR_play_tts_request_location_permission), MP_ROM_PTR(&qpy_poc_play_tts_request_location_permission_obj) },
     { MP_ROM_QSTR(MP_QSTR_is_in_gps_information_ui), MP_ROM_PTR(&qpy_poc_is_in_gps_information_ui_obj) },
     { MP_ROM_QSTR(MP_QSTR_update_network_mcc_mnc_lac_cid_infomation), MP_ROM_PTR(&qpy_poc_update_network_mcc_mnc_lac_cid_infomation_obj) },
index 1bf85fc..dfef4a4 100644 (file)
@@ -171,7 +171,7 @@ STATIC mp_obj_t qpy_sim_enable_pin(const mp_obj_t pin)
 
     if (bufinfo.len > HELIOS_SIM_PIN_LEN_MAX)
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of pin should be no more than [%d] bytes.", HELIOS_SIM_PIN_LEN_MAX);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of pin should be no more than [%d] bytes."), HELIOS_SIM_PIN_LEN_MAX);
        }
        
        strncpy((char *)info.pin, (const char *)bufinfo.buf, bufinfo.len);
@@ -207,7 +207,7 @@ STATIC mp_obj_t qpy_sim_disable_pin(const mp_obj_t pin)
 
        if (bufinfo.len > HELIOS_SIM_PIN_LEN_MAX)
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of pin should be no more than [%d] bytes.", HELIOS_SIM_PIN_LEN_MAX);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of pin should be no more than [%d] bytes."), HELIOS_SIM_PIN_LEN_MAX);
        }
        
        strncpy((char *)info.pin, (const char *)bufinfo.buf, bufinfo.len);
@@ -243,7 +243,7 @@ STATIC mp_obj_t qpy_sim_verify_pin(const mp_obj_t pin)
 
        if (bufinfo.len > HELIOS_SIM_PIN_LEN_MAX)
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of pin should be no more than [%d] bytes.", HELIOS_SIM_PIN_LEN_MAX);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of pin should be no more than [%d] bytes."), HELIOS_SIM_PIN_LEN_MAX);
        }
        
        strncpy((char *)info.pin, (const char *)bufinfo.buf, bufinfo.len);
@@ -281,7 +281,7 @@ STATIC mp_obj_t qpy_sim_change_pin(const mp_obj_t old_pin, const mp_obj_t new_pi
 
        if ((bufinfo[0].len > HELIOS_SIM_PIN_LEN_MAX) || (bufinfo[1].len > HELIOS_SIM_PIN_LEN_MAX))
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of pin should be no more than [%d] bytes.", HELIOS_SIM_PIN_LEN_MAX);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of pin should be no more than [%d] bytes."), HELIOS_SIM_PIN_LEN_MAX);
        }
        
        strncpy((char *)info.old_pin, (const char *)bufinfo[0].buf, bufinfo[0].len);
@@ -321,7 +321,7 @@ STATIC mp_obj_t qpy_sim_unblock_pin(const mp_obj_t puk, const mp_obj_t new_pin)
     
     if ((bufinfo[0].len > HELIOS_SIM_PIN_LEN_MAX) || (bufinfo[1].len > HELIOS_SIM_PIN_LEN_MAX))
        {
-               mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of pin or puk should be no more than [%d] bytes.", HELIOS_SIM_PIN_LEN_MAX);
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of pin or puk should be no more than [%d] bytes."), HELIOS_SIM_PIN_LEN_MAX);
        }
        
        strncpy((char *)info.puk, (const char *)bufinfo[0].buf, bufinfo[0].len);
@@ -427,20 +427,20 @@ STATIC mp_obj_t qpy_sim_read_phonebook_record(size_t n_args, const mp_obj_t *arg
 
        if ((storage < 0) || (storage > 15))
        {
-               mp_raise_ValueError("invalid value, storage should be in (0,15).");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, storage should be in (0,15)."));
        }
        if (records.end_index < records.start_index)
        {
-               mp_raise_ValueError("invalid value, end >= start.");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, end >= start."));
        }
        if ((records.end_index - records.start_index) > 20)
        {
-               mp_raise_ValueError("invalid value, end - start <= 20.");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, end - start <= 20."));
        }
 
        if (nameinfo.len > 30)
        {
-               mp_raise_ValueError("invalid value, the length of username should be no more than 30 bytes.");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, the length of username should be no more than 30 bytes."));
        }
        records.user_name = (char *)nameinfo.buf;
     
@@ -499,19 +499,19 @@ STATIC mp_obj_t qpy_sim_write_phonebook_record(size_t n_args, const mp_obj_t *ar
 
        if ((storage < 0) || (storage > 15))
        {
-               mp_raise_ValueError("invalid value, storage should be in (0,15).");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, storage should be in (0,15)."));
        }
        if ((record.index < 1) || (record.index > 500))
        {
-               mp_raise_ValueError("invalid value, index should be in (1,500).");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, index should be in (1,500)."));
        }
        if (bufinfo[0].len > 30)
        {
-               mp_raise_ValueError("invalid value, the length of username should be no more than 30 bytes.");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, the length of username should be no more than 30 bytes."));
        }
        if (bufinfo[1].len > 20)
        {
-               mp_raise_ValueError("invalid value, the length of phonenumber should be no more than 20 bytes.");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, the length of phonenumber should be no more than 20 bytes."));
        }
 
        strncpy(record.user_name, bufinfo[0].buf, bufinfo[0].len);
@@ -536,9 +536,9 @@ STATIC mp_obj_t qpy_sim_set_simdet(const mp_obj_t obj_detenable, const mp_obj_t
     int insertlevel = mp_obj_get_int(obj_insertlevel);
 
        if (detenable != 0 && detenable != 1)
-        mp_raise_ValueError("invalid value, detenable should be in (0,1).");
+        mp_raise_ValueError(MP_ERROR_TEXT("invalid value, detenable should be in (0,1)."));
     if (insertlevel != 0 && insertlevel != 1)
-        mp_raise_ValueError("invalid value, insertlevel should be in (0,1).");
+        mp_raise_ValueError(MP_ERROR_TEXT("invalid value, insertlevel should be in (0,1)."));
 
     int cur_simid = _get_current_simid();
     ret = Helios_SIM_SetSimDet(cur_simid, detenable, insertlevel);
@@ -612,12 +612,12 @@ STATIC mp_obj_t qpy_sim_genericaccess(const mp_obj_t sim_id, const mp_obj_t cmd)
 
        if (bufinfo.len <= 0)
        {
-               mp_raise_ValueError("invalid value, the length of cmd should be more than 0 bytes.");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, the length of cmd should be more than 0 bytes."));
        }
 
        if (simid != 0)
        {
-               mp_raise_ValueError("invalid simid.");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid simid."));
        }
 
        strncpy((char *)info.cmd, (const char *)bufinfo.buf, bufinfo.len);
index 4de4992..56976da 100644 (file)
@@ -683,7 +683,7 @@ STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
             }
             else
             {
-                mp_raise_ValueError("[socket]find IPV4 netif cfg failed..\r\n");
+                mp_raise_ValueError(MP_ERROR_TEXT("[socket]find IPV4 netif cfg failed..\r\n"));
             }
         }
         else
@@ -723,7 +723,7 @@ STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
             }
             else
             {
-                mp_raise_ValueError("[socket]find IPV6 netif cfg failed..\r\n");
+                mp_raise_ValueError(MP_ERROR_TEXT("[socket]find IPV6 netif cfg failed..\r\n"));
             }
         }
         else
index a6d8f84..e861b8c 100644 (file)
@@ -131,7 +131,7 @@ STATIC mp_obj_t time_mktime(mp_obj_t tuple) {
        mp_uint_t time_unix;
     // localtime generates a tuple of len 8. CPython uses 9, so we accept both.
     if (len < 8 || len > 9) {
-        mp_raise_msg_varg(&mp_type_TypeError, "mktime needs a tuple of length 8 or 9 (%d given)", len);
+        mp_raise_msg_varg(&mp_type_TypeError, MP_ERROR_TEXT("mktime needs a tuple of length 8 or 9 (%d given)"), len);
     }
        rtc_tm.tm_year = mp_obj_get_int(elem[0]);
        rtc_tm.tm_mon = mp_obj_get_int(elem[1]);
@@ -172,7 +172,7 @@ STATIC mp_obj_t time_set_timezone(mp_obj_t tz)
        int offset = mp_obj_get_int(tz);
        if ((offset < -12) || (offset > 12))
        {
-               mp_raise_ValueError("invalid value, timezone should be in [-12, +12].");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, timezone should be in [-12, +12]."));
        }
        Helios_RTC_SetTimeZoneOffset((float)offset);
        return mp_obj_new_int(0);
@@ -191,7 +191,7 @@ STATIC mp_obj_t time_set_timezone_ex(mp_obj_t tz)
        float offset = mp_obj_get_float(tz);
        if ((offset < -12.0f) || (offset > 12.0f) || (fmod(offset, 0.25f) != 0))
        {
-               mp_raise_ValueError("invalid value, timezone should be in [-12, +12] and minimum unit is a quarter of one hour.");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, timezone should be in [-12, +12] and minimum unit is a quarter of one hour."));
        }
        Helios_RTC_SetTimeZoneOffset(offset);
        return mp_obj_new_int(0);
@@ -212,7 +212,7 @@ STATIC mp_obj_t time_set_timezone(mp_obj_t tz)
        int offset = mp_obj_get_int(tz);
        if ((offset < -12) || (offset > 12))
        {
-               mp_raise_ValueError("invalid value, timezone should be in [-12, +12].");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, timezone should be in [-12, +12]."));
        }
        Helios_RTC_SetTimeZoneOffset(offset);
        return mp_obj_new_int(0);
index 95b0e3e..6369ac4 100644 (file)
@@ -347,6 +347,9 @@ STATIC mp_obj_t encode_wifi_locreq_tlvinfo(size_t n_args, const mp_obj_t *args)
     
     memset(&position_rec, 0, sizeof(Helios_LBSInfoStruct));
     retValue = tlv_parse_to_tree(buffer, (uint32_t)strlen((char *)buffer), &firstNode);
+    if ( firstNode != NULL ){
+        QTLVNode_Destroy(firstNode);
+    }
     if (retValue == 0)
     {
         mp_obj_t codeinfo_objs[3] = {
index 1ddebe4..6398657 100644 (file)
 #define MICROPY_EMIT_XTENSAWIN              (MICROPY_QPY_EMIT_XTENSAWIN)
 
 
-//#define MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF (1)
 //#define MICROPY_WARNINGS                    (1)
 //#define MICROPY_STREAMS_NON_BLOCK           (1)
 
 #define MICROPY_MAKE_POINTER_CALLABLE(p) ((void*)((mp_uint_t)(p) | 1))
 #define MICROPY_ENABLE_FINALISER (1) // Pawn 2020/11/03
+#define MICROPY_ROM_TEXT_COMPRESSION    (0)
 
 
 #define MICROPY_ENABLE_DEVICE_REPORT          (MICROPY_QPY_DEVICE_REPORT)
 
 #define MICROPY_PY_SOFT_RESET                 (1)
 
+//==Start Add by freddy.li for raise error has no reason. @20230625
+#define MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF   (1)
+#define MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE     (256)
+//==End
+
 #if MICROPY_QPY_ETHERNET_W5500 || MICROPY_QPY_MISC_USBNET
 #define MICROPY_PY_ENABLE_WEBSERVER    (MICROPY_QPY_PY_ENABLE_WEBSERVER)
 #else
@@ -712,7 +717,7 @@ extern const struct _mp_obj_module_t mp_module_Hsensor;
 
 
 extern const struct _mp_obj_module_t mp_module_code128;
-#define MICROPY_PORT_BUILTIN_MODULES_code128           { MP_OBJ_NEW_QSTR(MP_QSTR_code128), (mp_obj_t)&mp_module_code128 }, /* ע²á`code128`Ä£¿é */ 
+#define MICROPY_PORT_BUILTIN_MODULES_code128           { MP_OBJ_NEW_QSTR(MP_QSTR_code128), (mp_obj_t)&mp_module_code128 }, /* ע��`code128`ģ�� */ 
 #if MICROPY_QPY_MODULE_NETWORK
 extern const struct _mp_obj_module_t mp_module_network;
 #define MICROPY_PORT_BUILTIN_MODULES_NETWORK       { MP_OBJ_NEW_QSTR(MP_QSTR_network), (mp_obj_t)&mp_module_network },
@@ -837,7 +842,7 @@ extern const struct _mp_obj_module_t mp_module_network;
                void *mp_lv_user_data; \
            const char *readline_hist[8]; \
            struct _machine_timer_obj_t *machine_timer_obj_head; \
-           void *global_stacktop_ptr; \
+           volatile void *global_stacktop_ptr; \
            void *loadmeth_para;
 #else
 #define MICROPY_PORT_ROOT_POINTERS \
index e4387c2..82bc88c 100644 (file)
@@ -153,7 +153,7 @@ int mp_thread_create_ex(void *(*entry)(void *), void *arg, size_t *stack_size, i
        if(thread_id == 0)
        {
                mp_thread_mutex_unlock(&thread_mutex);
-               mp_raise_msg(&mp_type_OSError, "can't create thread");
+               mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("can't create thread"));
        }
 
     // add thread to linked list of all threads
@@ -234,20 +234,6 @@ bool mp_is_python_thread(void) {
     return false;
 }
 
-//返回当前python线程栈的大小
-uint32_t mp_python_thread_get_stacksize(void) {
-       Helios_Thread_t curr_id = Helios_Thread_GetID(); 
-    mp_thread_mutex_lock(&thread_mutex, 1);
-    for (thread_t *th = thread; th != NULL; th = th->next) {
-        if (th->id == curr_id) {
-               mp_thread_mutex_unlock(&thread_mutex);
-            return th->stack_len;
-        }
-    }
-    mp_thread_mutex_unlock(&thread_mutex);
-    return false;
-}
-
 //返回当前线程对应的task_node地址
 int mp_thread_get_current_tsknode(void) {
     Helios_Thread_t curr_id = Helios_Thread_GetID(); 
index cf5b3dd..bdb9343 100644 (file)
@@ -157,6 +157,33 @@ static int vm_softreset_flag = 0;
 #define SOFTRESET_FLAG_TRUE() (1 == vm_softreset_flag)
 #define SOFTRESET_FLAG_FALSE() (0 == vm_softreset_flag)
 #endif
+typedef enum
+{      
+       QL_LOG_BSP_MASK           = 0x0000000000000001,
+               
+       QL_LOG_OS_MASK            = 0x0000000000000002,
+       
+       QL_LOG_FS_MASK            = 0x0000000000000004,
+       
+       QL_LOG_TCPIP_MASK         = 0x0000000000000008,
+       
+       QL_LOG_MQTT_MASK          = 0x0000000000000010,
+       
+       QL_LOG_APP_MASK           = 0x0000000000000020,
+       
+}ql_log_module_mask;
+
+
+typedef enum
+{
+       QL_LOG_PORT_UART = 0x1,
+       QL_LOG_PORT_USB  = 0x2,
+}ql_log_port_mask;
+
+void ql_log_mask_set(unsigned        long long module_mask, unsigned long port_mask);
+
+
+
 void quecpython_task(void *arg)
 {
        Helios_Thread_t id = 0;
@@ -167,6 +194,10 @@ void quecpython_task(void *arg)
     extern void qpy_poc_register_task();
     qpy_poc_register_task();
     #endif
+
+    ql_log_mask_set((unsigned long long)QL_LOG_APP_MASK,(unsigned long)QL_LOG_PORT_USB);
+
+    
     //Added by Freddy @20210520 在线程sleep时,通过wait queue的方式超时代替实际的sleep,
     //当有callback执行时,给此queue发消息即可快速执行callback
     mp_mthread_sleep_deal_init();
index 7726078..24607c2 100644 (file)
@@ -162,7 +162,7 @@ void handmic_isr(void * argv) {
 
        adc0 = Helios_ADC_Read(HELIOS_ADC0);
        adc1 = Helios_ADC_Read(HELIOS_ADC1);
-       SENSOR_HANDMIC_LOG("adc0 = %d, adc1=%d", adc0, adc1);
+       //SENSOR_HANDMIC_LOG("adc0 = %d, adc1=%d", adc0, adc1);
        if ((abs(adc0-adc0_old) < 200) && (abs(adc1-adc1_old) < 200)) {
                //adc0_sum = adc0_sum/3;
                //adc1_sum = adc1_sum/3;
index 91906f5..7282602 100644 (file)
@@ -227,7 +227,7 @@ class BaseMqtt(object):
         if resp[3] != 0:
             raise MQTTException(resp[3])
         # self.last_time = utime.mktime(utime.localtime())
-        self.last_time = utime.ticks_ms() / 1000
+        self.last_time = utime.ticks_ms() // 1000
         self.connSta = True
         self.clean_session = clean_session
         global ALIYDEVREGISTER, PING
@@ -280,7 +280,7 @@ class BaseMqtt(object):
     def ping(self):
         global PING
         # self.last_time = utime.mktime(utime.localtime())
-        self.last_time = utime.ticks_ms() / 1000
+        self.last_time = utime.ticks_ms() // 1000
         self.sock.write(b"\xc0\0")
         PING = True
 
@@ -309,7 +309,7 @@ class BaseMqtt(object):
         if qos == 0:
             if self.keepalive >= 30:
                 # time = utime.mktime(utime.localtime())
-                time = utime.ticks_ms() / 1000
+                time = utime.ticks_ms() // 1000
                 if (time - self.last_time) > (self.keepalive - 15):
                     self.last_time = time - self.keepalive
             return True
@@ -322,7 +322,7 @@ class BaseMqtt(object):
                 return False
             else:
                 # self.last_time = utime.mktime(utime.localtime())
-                self.last_time = utime.ticks_ms() / 1000
+                self.last_time = utime.ticks_ms() // 1000
                 return True
         elif qos == 2:
             mqtt_log.warning("publish QOS2 Not Support")
@@ -683,7 +683,7 @@ class MQTTClient(BaseMqtt):
                     LOOPTASKID = None
                     break
                 # time = utime.mktime(utime.localtime())
-                time = utime.ticks_ms() / 1000
+                time = utime.ticks_ms() // 1000
 
                 if time - self.last_time > keepalive:
                     if self.mqttlock.locked():
index abc2cc5..206d75a 100644 (file)
@@ -352,24 +352,9 @@ void gc_collect_start(void) {
     ptrs = (void **)(void *)MP_STATE_THREAD(pystack_start);
     gc_collect_root(ptrs, (MP_STATE_THREAD(pystack_cur) - MP_STATE_THREAD(pystack_start)) / sizeof(void *));
     #endif
-
-    #if 0
+    
     #if MICROPY_ENABLE_CALLBACK_DEAL
-    #if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
-    int rc = Helios_Critical_Enter();
-    #endif
-    st_CallBack_LoadBoundMeth *loadmeth_para_head = (st_CallBack_LoadBoundMeth *)MP_STATE_PORT(loadmeth_para);
-    for(;loadmeth_para_head != NULL; loadmeth_para_head = loadmeth_para_head->next)
-    {
-        if(NULL != loadmeth_para_head->arg)
-        {
-            gc_collect_root((void **)&loadmeth_para_head->arg, 1);
-        }
-    }
-    #if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
-    Helios_Critical_Exit(rc);
-    #endif
-    #endif
+    qpy_callback_para_link_mark_in_used();
     #endif
 }
 
index fcb316b..c63da19 100644 (file)
@@ -82,10 +82,11 @@ STATIC void *realloc_ext(void *ptr, size_t n_bytes, bool allow_move) {
 }
 
 #endif // MICROPY_ENABLE_GC
-
+#include "helios_debug.h"
 void *m_malloc(size_t num_bytes) {
     void *ptr = malloc(num_bytes);
     if (ptr == NULL && num_bytes != 0) {
+        _ql_app_log("m_malloc fail, num_bytes:%d gc_is_locked:%d", num_bytes, gc_is_locked());
         m_malloc_fail(num_bytes);
     }
     #if MICROPY_MEM_STATS
@@ -141,6 +142,7 @@ void *m_realloc(void *ptr, size_t new_num_bytes)
 {
     void *new_ptr = realloc(ptr, new_num_bytes);
     if (new_ptr == NULL && new_num_bytes != 0) {
+        _ql_app_log("m_realloc fail");
         m_malloc_fail(new_num_bytes);
     }
     #if MICROPY_MEM_STATS
index 5d0d883..b62d2e0 100644 (file)
@@ -315,8 +315,6 @@ STATIC void *thread_entry(void *args_in) {
 
     MP_THREAD_GIL_ENTER();
 
-    // extern void heios_mem_check(void);
-    // if(args->stack_size == 13376) helios_mem_check();//stack_size为某一特殊值时,运行mem_check
     // signal that we are set up and running
     mp_thread_start();
 
@@ -475,7 +473,7 @@ STATIC mp_obj_t mod_thread_stop_thread(mp_obj_t th_node)
         tsk_id = mp_thread_get_tskid_by_tsknode((void *)th_id);//从task_node获取task_id
         if(0 == tsk_id) {
             //未找到对应的task_node
-            mp_raise_msg_varg(&mp_type_ValueError, "No thread with thread id %lu was found!", (uint32_t)th_id);
+            mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("No thread with thread id %lu was found!"), (uint32_t)th_id);
             return mp_obj_new_int(-1);//must not be here
         }
     }
@@ -488,14 +486,14 @@ STATIC mp_obj_t mod_thread_stop_thread(mp_obj_t th_node)
     //不允许删除主线程
        if(tsk_id == ql_micropython_task_ref)
        {
-               mp_raise_ValueError("Deleting the main thread is not allowed!");
+               mp_raise_ValueError(MP_ERROR_TEXT("Deleting the main thread is not allowed!"));
 
                return mp_obj_new_int(-1);//must not be here
        }
 #if MICROPY_ENABLE_CALLBACK_DEAL
        else if (tsk_id == qpy_callback_deal_task_ref) {//不允许callbackdeal线程
        
-               mp_raise_ValueError("Deleting the callbackdeal thread is not allowed!");
+               mp_raise_ValueError(MP_ERROR_TEXT("Deleting the callbackdeal thread is not allowed!"));
 
                return mp_obj_new_int(-1);//must not be here
        }
@@ -521,7 +519,7 @@ STATIC mp_obj_t mod_thread_stop_thread(mp_obj_t th_node)
         return mp_obj_new_int(0);
     }
        
-       mp_raise_msg_varg(&mp_type_ValueError, "No thread with thread id %lu was found!", (uint32_t)th_id);
+       mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("No thread with thread id %lu was found!"), (uint32_t)th_id);
        
        return mp_obj_new_int(-1);//must not be here
 }
@@ -538,16 +536,6 @@ STATIC mp_obj_t mp_thread_is_running(mp_obj_t th_in) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_thread_is_running_obj, mp_thread_is_running);
 
-//MEMORY CHECK
-#ifdef PLAT_ASR_1606
-STATIC mp_obj_t mod_thread_mem_check(void)
-{
-    // extern void helios_mem_check(void);
-    // helios_mem_check();
-    return mp_obj_new_int(0);
-}
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(mod_thread_mem_check_obj, mod_thread_mem_check);
-#endif
 
 STATIC const mp_rom_map_elem_t mp_module_thread_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR__thread) },
@@ -565,9 +553,6 @@ STATIC const mp_rom_map_elem_t mp_module_thread_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_get_heap_size), MP_ROM_PTR(&mod_thread_get_heap_size_obj) },
     { MP_ROM_QSTR(MP_QSTR_stop_thread), MP_ROM_PTR(&mod_thread_stop_thread_obj) },
     { MP_ROM_QSTR(MP_QSTR_threadIsRunning), MP_ROM_PTR(&mp_thread_is_running_obj) },
-#ifdef PLAT_ASR_1606
-    { MP_ROM_QSTR(MP_QSTR_mem_check), MP_ROM_PTR(&mod_thread_mem_check_obj) },
-#endif    
 };
 
 STATIC MP_DEFINE_CONST_DICT(mp_module_thread_globals, mp_module_thread_globals_table);
index cc04d17..32555ad 100644 (file)
@@ -204,6 +204,7 @@ STATIC const mp_rom_map_elem_t mp_builtin_module_table[] = {
     { MP_ROM_QSTR(MP_QSTR_ucryptolib), MP_ROM_PTR(&mp_module_ucryptolib) },
     #endif
     #if MICROPY_PY_UBINASCII
+    { MP_ROM_QSTR(MP_QSTR_binascii), MP_ROM_PTR(&mp_module_ubinascii) },
     { MP_ROM_QSTR(MP_QSTR_ubinascii), MP_ROM_PTR(&mp_module_ubinascii) },
     #endif
     #if MICROPY_PY_URANDOM
index 77c8300..02f685c 100644 (file)
@@ -171,6 +171,7 @@ void mp_deinit(void) {
 
     #if MICROPY_ENABLE_CALLBACK_DEAL
     qpy_callback_deal_deinit();
+    qpy_callback_para_link_free_all();
     #endif
 
     // call port specific deinitialization if any
index 8ee9ca0..d387ae9 100644 (file)
@@ -192,26 +192,16 @@ bool mp_sched_schedule_ex(c_callback_t *callback, mp_obj_t arg)
 
     #if MICROPY_ENABLE_CALLBACK_DEAL
         if( false == qpy_is_callback_deal_thread()) {
-            st_CallBack_LoadBoundMeth *loadboundmet_msg = calloc(1, sizeof(st_CallBack_LoadBoundMeth));
+            st_CallBack_LoadBoundMeth *loadboundmet_msg = qpy_callback_para_node_add(callback, arg);
             if(NULL == loadboundmet_msg)
             {
                 return false;
             }
-            #if 0
-            #if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
-            int rc = Helios_Critical_Enter();
-            #endif
-            loadboundmet_msg->next = (st_CallBack_LoadBoundMeth *)MP_STATE_PORT(loadmeth_para);
-            MP_STATE_PORT(loadmeth_para) = (void *)loadboundmet_msg;
-            #endif
-            loadboundmet_msg->callback = callback;
-            loadboundmet_msg->arg = arg;
-            #if 0
-            #if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
-            Helios_Critical_Exit(rc);
-            #endif
-            #endif
-               qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_LOAD_BOUNDMETH, loadboundmet_msg);
+               int ret = qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_LOAD_BOUNDMETH, loadboundmet_msg);
+               if(ret != 0)
+               {
+                   free(loadboundmet_msg);
+               }
                return true;
        }
        else
index 269501c..b53a4fb 100644 (file)
@@ -26,6 +26,7 @@ void Helios_Debug_Enable(void);
 void Helios_Debug_Disable(void);
 int Helios_Debug_Output(const char *fmt, ...);
 void Helios_Assert(const char      *cond, const char *file, int line, const char* fmt, ...);
+void _ql_app_log(const char* fmt, ...);
 
 #if CONFIG_POC_SLPOC
 void Helios_USB_Log_Enable(void);
index 873fc1d..97a9a60 100644 (file)
@@ -18,6 +18,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <assert.h>
 #include "helios_debug.h"
 
 #if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8850) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8910_R05)
@@ -39,8 +40,21 @@ void Helios_lfs_Map_printf() {
        }
 
 }
-
-
+//fs map check hook start
+// void Helios_fs_map_check(void)
+// {
+//     // HELIOS_FS_LOG("FS MAP CHECK!!\r\n");
+//     int index = 0;
+//     for(index = 0; index < 3; index++)
+//     {
+//             if(strcmp(fs_map[index].pythonPath, "/ext") == 0 && strcmp(fs_map[index].Letter, "E:") != 0)
+//             {
+//                     assert(0);
+//             }
+//     }
+// }
+
+//fs map check hook end
 int Helios_lfs_register_map(const char *flashName, const char* Letter, const char *python_path, void* vfs_self) {
        int index = 0;
        
@@ -65,9 +79,18 @@ int Helios_lfs_register_map(const char *flashName, const char* Letter, const cha
                        strncpy(fs_map[index].pythonPath, python_path, strlen(python_path));
                        fs_map[index].vfs_self = vfs_self;
                        Helios_lfs_Map_printf();
+                       //fs map check hook start
+                       if(!strcmp(Letter, "E:"))
+                       {
+                               // extern void Helios_fs_map_check_hook_register(void* hook);
+                               // Helios_fs_map_check_hook_register(Helios_fs_map_check);
+                               HELIOS_FS_LOG("FS MAP CHECK HOOK REGISTER!\r\n");
+                       }
+                       //fs map check hook end
                        return 0;
                }
        }
+
        return -1;
 }
 
diff --git a/2.sdk/Helios_SDK/system/fs/helios_python_fs.txt b/2.sdk/Helios_SDK/system/fs/helios_python_fs.txt
new file mode 100644 (file)
index 0000000..304804f
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) Quectel Wireless Solution, 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.
+ */
+
+#include "helios_fs.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "helios_debug.h"
+
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8850) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8910_R05)
+
+
+#define FS_MAP_MAX 8
+
+#define HELIOS_FS_LOG(fmt, ...) custom_log(helios_python_fs, fmt, ##__VA_ARGS__)
+
+FS_MAP_S fs_map[FS_MAP_MAX] = {0};
+
+void Helios_lfs_Map_printf() {
+       int index = 0;
+       for(index = 0; index < FS_MAP_MAX; index++) { 
+               if(fs_map[index].is_used == 1) {
+                       HELIOS_FS_LOG("index[%d] flashName[%s] Letter[%s] pythonPath[%s] self[%x]\n", index, 
+                               fs_map[index].FlashName, fs_map[index].Letter, fs_map[index].pythonPath, fs_map[index].vfs_self);
+               }
+       }
+
+}
+//fs map check hook start
+static void Helios_fs_map_check(void)
+{
+       // HELIOS_FS_LOG("FS MAP CHECK!!\r\n");
+       int index = 0;
+       for(index = 0; index < 3; index++)
+       {
+               if(strcmp(fs_map[index].pythonPath, "/ext") == 0 && strcmp(fs_map[index].Letter, "E:") != 0)
+               {
+                       assert(0);
+               }
+       }
+}
+//fs map check hook end
+int Helios_lfs_register_map(const char *flashName, const char* Letter, const char *python_path, void* vfs_self) {
+       int index = 0;
+       
+       for(index = 0; index < FS_MAP_MAX; index++) {
+               if(fs_map[index].is_used == 1 && strcmp(fs_map[index].FlashName, flashName) == 0)
+               {
+                   fs_map[index].is_used = 0;
+                       memset(fs_map[index].Letter, 0, FS_PATH_MAX);
+                       memset(fs_map[index].pythonPath, 0, FS_PATH_MAX);
+                       //return 0;
+               }
+       }
+       
+       for(index = 0; index < FS_MAP_MAX; index++) {
+               if(fs_map[index].is_used == 0){
+                       fs_map[index].is_used = 1;
+                       memset(fs_map[index].FlashName, 0, FS_PATH_MAX);
+                       strncpy(fs_map[index].FlashName, flashName, strlen(flashName));
+                       memset(fs_map[index].Letter, 0, FS_PATH_MAX);
+                       strncpy(fs_map[index].Letter, Letter, strlen(Letter));
+                       memset(fs_map[index].pythonPath, 0, FS_PATH_MAX);
+                       strncpy(fs_map[index].pythonPath, python_path, strlen(python_path));
+                       fs_map[index].vfs_self = vfs_self;
+                       Helios_lfs_Map_printf();
+                       //fs map check hook start
+                       if(!strcmp(Letter, "E:"))
+                       {
+                               extern void Helios_fs_map_check_hook_register(void* hook);
+                               Helios_fs_map_check_hook_register(Helios_fs_map_check);
+                               HELIOS_FS_LOG("FS MAP CHECK HOOK REGISTER!\r\n");
+                       }
+                       //fs map check hook end
+                       return 0;
+               }
+       }
+
+       return -1;
+}
+
+
+
+
+int Helios_lfs_unregister_map(const char *pythonPath) {
+       int index = 0;
+       for(index = 0; index < FS_MAP_MAX; index++) {
+               if(fs_map[index].is_used == 1 && strcmp(fs_map[index].FlashName, pythonPath) == 0){
+                       fs_map[index].is_used = 0;
+                       memset(fs_map[index].FlashName, 0, FS_PATH_MAX);
+                       memset(fs_map[index].Letter, 0, FS_PATH_MAX);
+                       memset(fs_map[index].pythonPath, 0, FS_PATH_MAX);
+                       fs_map[index].vfs_self = NULL;
+                       return 0;
+               }
+       }
+       return -1;
+}
+
+
+char* Helios_lfs_get_letter_by_PYPath(const char *python_path) {
+       int index = 0;
+       for(index = 0; index <= 4; index++) {
+               if(fs_map[index].is_used == 1 && python_path != NULL && strcmp(fs_map[index].pythonPath, python_path) == 0) {
+                       return fs_map[index].Letter;
+               }
+       }
+       return NULL;
+}
+
+void* Helios_vfs_get_vfsobj_by_PYPath(const char *python_path) {
+       int index = 0;
+       
+       for(index = 0; index <= 4; index++) {
+               if(fs_map[index].is_used == 1 && python_path != NULL && (strcmp(fs_map[index].pythonPath, python_path) == 0)) {
+                       return fs_map[index].vfs_self;
+               }
+       }
+       return NULL;
+}
+
+#endif
index 4f2b442..4b18105 100644 (file)
@@ -710,6 +710,7 @@ int Helios_PCM_Write(void* handle, void* data, unsigned int count);
 int Helios_PCM_Read(void* handle, void* data, unsigned int count);
 int Helios_set_mic_channel(int channel);
 
+void Helios_aud_data_done(void);
 
 void *Helios_Aud_PWM_Open(int pwm_n, unsigned int channels, unsigned int samplerate, unsigned int flags);
 int Helios_Aud_PWM_Close(void* handle);
index ff9db97..813543a 100644 (file)
@@ -210,7 +210,7 @@ extern "C" {
     || defined(BOARD_EC600MCN_LE) || defined(BOARD_EC600MCN_LF) || defined(BOARD_EC600MCN_LE_POC_XBND) \
        || defined(BOARD_EC600MCN_LA_POC_ZZD) || defined(BOARD_EC600MCN_LE_POC_ZZD) \
        || defined(BOARD_EC600MCN_LE_POC_QS) || defined(BOARD_EC600MCN_CC) || defined(BOARD_EC600MCN_LE_VOLTE) \
-       || defined(BOARD_EC600MCN_CC_EXT) ||  defined(BOARD_EC600MCN_LF_SLPOC)
+       || defined(BOARD_EC600MCN_CC_EXT) ||  defined(BOARD_EC600MCN_LF_SLPOC) || defined(BOARD_EC600MCN_CC_EXT_TTS)
 #define PLAT_GPIO_NUM 45
 #elif defined(BOARD_EC800MCN_LA) || defined(BOARD_EC800MCN_GA)  || defined(BOARD_EC800MCN_LE) \
     || defined(BOARD_EC800MCN_LA_VOLTE) || defined(BOARD_EC800MCN_GC) || defined(BOARD_EC800MCN_LC) \
@@ -233,7 +233,7 @@ extern "C" {
 #endif
 #elif defined(PLAT_ECR6600)
 #if defined(BOARD_FCM360W)
-#define PLAT_GPIO_NUM 26
+#define PLAT_GPIO_NUM 29
 #else
 #error "Please confirm the ecr6600 platform"
 
index 88bde93..909cef0 100644 (file)
@@ -142,6 +142,7 @@ typedef enum {
        HELIOS_UART3,
        HELIOS_UART4,
        HELIOS_UART5,
+       HELIOS_UART6,
        HELIOS_UARTMAX,
 }Helios_UARTNum;
 
index 6837fe5..46bf20d 100644 (file)
@@ -51,6 +51,9 @@ extern "C" {
 #define HELIOS_NW_LONG_NAME_MAX_LEN    32
 #define HELIOS_NW_SHORT_NAME_MAX_LEN 32
 
+#define HELIOS_NW_MAX_BLACK_CELL_NUM 10
+#define HELIOS_CELL_INFO_MAX 128
+
 #define HELIOS_NW_DATA_REG_STATUS_IND  1       //Network registration status event
 #define        HELIOS_NW_VOICE_REG_STATUS_IND  2
 #define HELIOS_NW_NITZ_TIME_UPDATE_IND 3
@@ -392,6 +395,14 @@ typedef struct
 }Helios_NwConfigInfoStruct;
 
 
+typedef struct
+{
+       int32_t gsm_info_num;
+       char gsm_cell_info[HELIOS_NW_MAX_BLACK_CELL_NUM][HELIOS_CELL_INFO_MAX];
+       int32_t lte_info_num;
+       char lte_cell_info[HELIOS_NW_MAX_BLACK_CELL_NUM][HELIOS_CELL_INFO_MAX];
+}Helios_NwBackCellInfo;
+
 /**
  * @brief: net module initialize
  * @sideeffect:
@@ -524,6 +535,15 @@ int Helios_Nw_SetConfiguration(uint8_t sim_id, Helios_NwConfigInfoStruct *info);
 */
 int Helios_Nw_GetConfiguration(uint8_t sim_id, Helios_NwConfigInfoStruct *info);
 
+int Helios_Nw_SetBlackCell(uint8_t mode);
+int Helios_Nw_DeleteBlackCell(int rat, char *info);
+int Helios_Nw_AddBlackCell(int rat, char *info);
+int Helios_Nw_GetBlackCell(Helios_NwBackCellInfo *info);
+int Helios_Nw_GetBlackCellCfg(int* blackcellCfg,int* blackcellCfg_num);
+int Helios_Nw_SetBlackCellCfg(int blackcellCfg,int blackcellCfg_num);
+int Helios_Nw_DeleteAllBlackCell(void);
+
+
 #if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_Qualcomm) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R05)
 int Helios_Nw_SetApn(char *apn, uint8_t simid);
 
index 79a175a..b8932bd 100644 (file)
                "EG810MCN_GA_ALIPAY",
                "EC600MCN_LF_SLPOC",
                "EC800MCN_GA_VOEXT",
-               "EG810MCN_GA_VOEXT"
+               "EG810MCN_GA_VOEXT",
+               "EC600MCN_CC_EXT_TTS"
        ],
        
        "EIGEN": [
index c660e42..ff0911d 100644 (file)
@@ -14,9 +14,15 @@ class EventStore(object):
     def append(self, event, cb):
         self.map[event] = cb
 
-    def fire_async(self, event, msg):
+    def fire_async(self, event, msg,thread_size):
         if event in self.map:
+            #print("fire_async:thread_size:{}".format(thread_size))
+            if thread_size != None:
+                _thread.stack_size(thread_size)
+                #print("fire_async:thread_size:{}".format(thread_size))
             _thread.start_new_thread(self.map[event], (event, msg))
+            if thread_size != None:
+                _thread.stack_size(8*1024)
             if self.log:
                 self.log.info("ASYNC executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, None))
 
@@ -52,11 +58,11 @@ def publish(event, msg=None):
     return publish_sync(event, msg)
 
 
-def publish_async(event, msg=None):
+def publish_async(event, msg=None,thread_size = None):
     """
     异步发送
     """
-    return event_store.fire_async(event, msg)
+    return event_store.fire_async(event, msg,thread_size)
 
 
 def publish_sync(event, msg=None):
index d0b6d1c..165b3f9 100644 (file)
@@ -427,6 +427,20 @@ $(HEADER_BUILD)/qstrdefs.generated.h: $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_C
        $(Q)$(CAT) $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) | $(SED) 's/^Q(.*)/"&"/' | $(CPP) $(C_FLAGS) - | $(SED) 's/^\"\(Q(.*)\)\"/\1/' > $(HEADER_BUILD)/qstrdefs.preprocessed.h
        $(Q)$(PYTHON) $(PY_SRC)/makeqstrdata.py $(HEADER_BUILD)/qstrdefs.preprocessed.h > $@
 
+# Compressed error strings.
+$(HEADER_BUILD)/compressed.split: $(HEADER_BUILD)/qstr.i.last
+       @$(ECHO) "GEN $@"
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py split compress $< $(HEADER_BUILD)/compress _
+       $(Q)$(TOUCH) $@
+       
+$(HEADER_BUILD)/compressed.collected: $(HEADER_BUILD)/compressed.split
+       @$(ECHO) "GEN $@"
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py $(CAT) compress _ $(HEADER_BUILD)/compress $@
+       
+$(HEADER_BUILD)/compressed.data.h: $(HEADER_BUILD)/compressed.collected
+       @$(ECHO) "GEN $@"
+       $(Q)$(PYTHON) $(PY_SRC)/makecompresseddata.py $< > $@
+       
 # build a list of registered modules for py/objmodule.c.
 $(HEADER_BUILD)/moduledefs.h: $(SRC_QSTR) $(QSTR_GLOBAL_DEPENDENCIES) | $(HEADER_BUILD)
        @$(ECHO) "GEN $@"
@@ -457,6 +471,7 @@ INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/inclu
 INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/threadx_api
 INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
 INC += -I$(ROOT)/system/at
+INC += -I$(ROOT)/system/esim
 endif
 
 INC += -I.
@@ -888,8 +903,14 @@ frozen_mpy_list =  $(BUILD)/_boot.mpy \
                                        $(BUILD)/backup_restore.mpy \
                                        $(BUILD)/ntptime.mpy \
                                        $(BUILD)/checkNet.mpy \
-                                       $(BUILD)/ymodem.mpy \
-                                       
+                                       $(BUILD)/ymodem.mpy
+
+else ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600MCN_CC_EXT_TTS))
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/ymodem.mpy
 else
 frozen_mpy_list =      $(BUILD)/_boot.mpy \
                                        $(BUILD)/umqtt.mpy \
@@ -1147,7 +1168,7 @@ $(BUILD):
        $(Q)echo creating directory: $@
        -$(Q)$(MKDIR) $@
 
-all:$(BUILD) $(HEADER_BUILD)/qstrdefs.generated.h $(HEADER_BUILD)/moduledefs.h  $(BUILD)/_frozen_mpy.c
+all:$(BUILD) $(HEADER_BUILD)/qstrdefs.generated.h $(HEADER_BUILD)/moduledefs.h  $(HEADER_BUILD)/compressed.data.h $(BUILD)/_frozen_mpy.c
 
 clean:
        @echo ----- cleaning microPython private target
index b20c2f8..a86baf3 100644 (file)
@@ -66,6 +66,7 @@ style_alarm_screen_default.set_pad_bottom(0)
 
 # -------------------------------------------clk_list screen----------------------------------------------------------
 clk_list_screen = lv.obj()
+print("clk_list_screen")
 clk_list_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 clk_list_title_bg= lv.btn(clk_list_screen)
@@ -119,6 +120,7 @@ no_add_alarm.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
 # -------------------------------------------clk_edit screen----------------------------------------------------------
 
 clk_edit_screen = lv.obj()
+print("clk_edit_screen")
 clk_edit_screen.add_style(style_alarm_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 clk_edit_title = lv.label(clk_edit_screen)
@@ -167,6 +169,7 @@ clk_delete_alarm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.
 
 # -------------------------------------------clk_repeat screen----------------------------------------------------------
 clk_repeat_screen = lv.obj()
+print("clk_repeat_screen")
 clk_repeat_screen.set_scrollbar_mode(0)
 clk_repeat_screen.add_style(style_alarm_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT)
 
@@ -335,6 +338,7 @@ clk_repeat_switch6.set_style_bg_color(lv.color_make(0xFF, 0xFF, 0xFF),lv.PART.IN
 
 # -------------------------------------------clk_repeat screen----------------------------------------------------------
 clk_time_screen = lv.obj()
+print("clk_time_screen")
 clk_time_screen.set_scrollbar_mode(0)
 clk_time_screen.add_style(style_alarm_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT)
 
@@ -391,7 +395,12 @@ label_ok.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
 label_ok.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
 
 #闹钟信息
-alarm_list = []#用于显示闹钟列表不包含开关机信息
+alarm_list = [{'hour': 16, 'repeart': 1, 'idx': 0, 'enabled': 0, 'days': [], 'minute': 39},
+               {'hour': 16, 'repeart': 1, 'idx': 1, 'enabled': 0, 'days': [], 'minute': 39}, 
+               {'hour': 15, 'repeart': 1, 'idx': 2, 'enabled': 0, 'days': [], 'minute': 13}, 
+               {'hour': 16, 'repeart': 1, 'idx': 3, 'enabled': 0, 'days': [], 'minute': 39}, 
+               {'hour': 15, 'repeart': 1, 'idx': 4, 'enabled': 0, 'days': [], 'minute': 13}]
+#用于显示闹钟列表不包含开关机信息
 
 class ClockManager(Abstract):
     def __init__(self):
@@ -615,15 +624,18 @@ class ClockManager(Abstract):
         global alarm_list
         EventMesh.publish("read_alarminjson")
         idx = self.idx
-        print("单次闹钟关闭:",idx)
+        print("单次闹钟关闭:{} alarm_list:{}".format(idx,alarm_list))
         #判断是否是单次闹钟,如果是,则将开关状态设置为关闭
-        print("关闭1:",alarm_list[idx]["days"])
-        if not alarm_list [idx]["days"] :
-                print("关闭2:",alarm_list [idx]["days"])
-                alarm_list[idx]["enabled"] = False
-                with open("/ext/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
-                    ujson.dump(alarm_list,fd)
-
+        # for i in range(len(alarm_list)):
+        #     if alarm_list[i]["idx"] == self.idx:
+        #         idx = i
+        if not alarm_list[idx]["days"] :
+            print("关闭1:",alarm_list[idx]["days"])
+            print("关闭2:",alarm_list [idx]["days"])
+            alarm_list[idx]["enabled"] = False
+            with open("/ext/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+                ujson.dump(alarm_list,fd)
+        EventMesh.publish("set_rtc_alarm")
         #设置下一个闹钟,定时开关机功能
         if 0 :
             msg_data = EventMesh.publish("get_boot_off_time")
@@ -636,10 +648,9 @@ class ClockManager(Abstract):
 
             rtc_now_time = self.rtc.datetime()
             current = rtc_now_time[4]*60+rtc_now_time[5]
-            EventMesh.publish("set_rtc_alarm")
+            
             print("end_min:{} current:{} off_tmp2:{}".format(end_min,current,off_tmp2))
             if end_min == current:#结束的时间分钟等于关机时间分钟数则关机
-                
                 EventMesh.publish("load_screen", {"screen": "poweroff_comfirm"})
                 return
         
@@ -771,6 +782,7 @@ class ClockManager(Abstract):
            
 #闹钟弹窗
 popup_alarm_screen = lv.obj()
+print("popup_alarm_screen")
 popup_alarm_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 
index 9619f3d..f928673 100644 (file)
@@ -57,38 +57,7 @@ class Alipay(Abstract):
         self.product_type = 0
         self.timer_Alipay = osTimer()
         self.Alipay_Ui_isOpen = 0
- 
-        self.is_simcard_identify = 255
-        self.is_init = 255
-        self.upay_bound = 0 #绑定结果
-        self.alipay = ALIPAY(self.imei, self.iccid,self.imsi, self.mac, self.sn,self.vendor, self.product_name, self. product_model, self.pk_alipay , self.pk_aliyun, self.ps_aliyun,0)
-        #self.alipay = ALIPAY("867387060319491", "898604293619F0549750","460044917509047", "123456", "P1Q22I80C0007530P","ZHIHUISHIXUN", "ZHIHUISHIXUN", "EC800M", "uHTfYqOlGlA" , "a15PcyZ3IHA", "kOGGPhtXAg1Lz1vg",0)
-        self.alipay.register_print()
-        #self.alipay.set_log_limit(5)
-        self.alipay.set_log_limit(0)
-        if  self.is_init != 0:
-            id2_st = bytearray([0])
-            id2_ret = self.alipay.id2_init()
-            #print("id2_ret:%d"%id2_ret)
-            self.alipay.id2_check_status(id2_st)
-            #print("id2_st:",str(id2_st))
-            if id2_st[0] == 1:
-                self.is_init = self.alipay.pay_init(90000, 90000,\
-                                                    2000, 2000, \
-                                                    200, 40*1024, \
-                                                    self.upay_display_notify_cb, 0) 
-                #alipay.pay_init(90000, 90000,2000, 2000,200, 40*1024,upay_display_notify_cb, 0)                                    
-                print("self.is_pay_init:%d"%self.is_init)
-                if self.is_init == 0 :
-                    self.alipay.enable_collectioncode(1)
-        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and self.alipay != None and (self.is_simcard_identify != 0 ):#or time[3] == 0 or time[3] == 12):
-            self.is_simcard_identify = self.alipay.start_simcard_identify()
-            print("is_simcard_identify:%d"%self.is_simcard_identify)
-        #self.timer_Alipay.start(20000, 1, self.timeout_Alipay)
-    def post_processor_after_instantiation(self):
-        print("post_processor_after_instantiation")
-        
-        
+        self.Alipay_init_flag = 0
         EventMesh.subscribe("alipay_unbind", self.alipay_unbind)
 
         EventMesh.subscribe("alipay_1", self.alipay_1)
@@ -101,11 +70,32 @@ class Alipay(Abstract):
         EventMesh.subscribe("Alipay_init", self.Alipay_init)
         EventMesh.subscribe("get_Alipay_Ui_isOpen",self.get_Alipay_Ui_isOpen)
         EventMesh.subscribe("set_Alipay_Ui_isOpen",self.set_Alipay_Ui_isOpen)
+
+        self.is_simcard_identify = 255
+        self.is_init = 255
+        self.upay_bound = 0 #绑定结果
+        self.alipay = ALIPAY(self.imei, self.iccid,self.imsi, self.mac, self.sn,self.vendor, self.product_name, self. product_model, self.pk_alipay , self.pk_aliyun, self.ps_aliyun,0)
+        #self.alipay = ALIPAY("867387060319491", "898604293619F0549750","460044917509047", "123456", "P1Q22I80C0007530P","ZHIHUISHIXUN", "ZHIHUISHIXUN", "EC800M", "uHTfYqOlGlA" , "a15PcyZ3IHA", "kOGGPhtXAg1Lz1vg",0)
+        #self.alipay.register_print()
+        self.alipay.set_log_limit(5)
+        self.alipay.set_log_limit(0)
+        
+        #self.timer_Alipay.start(20000, 1, self.timeout_Alipay)
+    def post_processor_after_instantiation(self):
+        print("post_processor_after_instantiation")
+        EventMesh.publish_async("Alipay_init","",40*1024)
+        
+       
     def get_Alipay_Ui_isOpen(self, event, msg):
         return self.Alipay_Ui_isOpen
     def set_Alipay_Ui_isOpen(self, event, msg):
         self.Alipay_Ui_isOpen = msg
     def Alipay_init(self, event, msg):
+        if self.Alipay_init_flag == 1:
+            print("Alipay_init:reuse!!!!!!!!")
+            #self.Alipay_init_flag = 0
+            return
+        self.Alipay_init_flag = 1
         #print("timeout_Alipay1:{}".format(EventMesh.publish(constants.EVENT.GET_CONNECT)))
         #time = utime.localtime()
 
@@ -133,6 +123,7 @@ class Alipay(Abstract):
             else :
                 print("id2_st:",str(id2_st))
             print("self.is_pay_init:%d"%self.is_init)
+        self.Alipay_init_flag = 0
 
     def upay_display_notify_cb(self,arg):
         #print("upay_display_notify_cb!!!!!!!!!!!!!!!!!!!!")
@@ -354,6 +345,7 @@ style_alipay_img_default.set_img_recolor_opa(0)
 style_alipay_img_default.set_img_recolor(lv.color_make(0xff,0xff,0xff))
 
 alipay_open_screen = lv.obj()
+print("alipay_open_screen")
 alipay_open_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 # add style for watchface
 alipay_open_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -380,7 +372,13 @@ class AlipayOpenScreen(Screen):
     def initialization(self):
         print("AlipayOpenScreen:initialization")
         self.flag = 0
-        EventMesh.publish("Alipay_init")
+        
+        if EventMesh.publish("get_alipay_init") == 0:
+            if self.flag == 0:
+                self.flag = 1
+                EventMesh.publish("alipay_1")
+        else:
+            EventMesh.publish_async("Alipay_init","",40*1024)
         self.timer_AlipayOpen.start(1000, 1, self.timeout_AlipayOpen)
         EventMesh.publish("set_Alipay_Ui_isOpen",1)
 
@@ -393,9 +391,8 @@ class AlipayOpenScreen(Screen):
                 self.flag = 1
                 EventMesh.publish("alipay_1")
         else :
-            
             if(self.timer_AlipayOpen_count>10 or self.timer_AlipayOpen_count == 0 ):
-                EventMesh.publish("Alipay_init")
+                EventMesh.publish_async("Alipay_init","",40*1024)
                 self.timer_AlipayOpen_count = 1
             self.timer_AlipayOpen_count+=1
             # self.timer_AlipayOpen.stop()
@@ -421,6 +418,7 @@ class AlipayOpenScreen(Screen):
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
 alipay_1_1_screen = lv.obj()
+print("alipay_1_1_screen")
 alipay_1_1_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 # add style for watchface
 alipay_1_1_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -494,6 +492,7 @@ class Alipay_1_1(Screen):
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
 alipay_invite_screen = lv.obj()
+print("alipay_invite_screen")
 alipay_invite_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 # add style for watchface
 alipay_invite_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -565,6 +564,7 @@ class Alipay_invite(Screen):
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
 alipay_inviting_screen = lv.obj()
+print("alipay_inviting_screen")
 alipay_inviting_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 # add style for watchface
 alipay_inviting_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -602,6 +602,7 @@ class Alipay_inviting(Screen):
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
 alipay_success_screen = lv.obj()
+print("alipay_success_screen")
 alipay_success_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 # add style for watchface
 alipay_success_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -654,6 +655,7 @@ class Alipay_success(Screen):
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
 alipay_paycode_screen = lv.obj()
+print("alipay_paycode_screen")
 alipay_paycode_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 # add style for watchface
 alipay_paycode_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -836,6 +838,7 @@ class Alipay_paycode(Screen):
 
 
 alipay_pay_success_screen = lv.obj()
+print("alipay_pay_success_screen")
 alipay_pay_success_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 # add style for watchface
 alipay_pay_success_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -896,6 +899,7 @@ class Alipay_pay_success(Screen):
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
 alipay_collect_screen = lv.obj()
+print("alipay_collect_screen")
 alipay_collect_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 # add style for watchface
 alipay_collect_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -949,6 +953,7 @@ class Alipay_collect(Screen):
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
 alipay_parent_screen = lv.obj()
+print("alipay_parent_screen")
 alipay_parent_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 # add style for watchface
 alipay_parent_screen.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
index 005a8df..566efd7 100644 (file)
@@ -14,6 +14,7 @@ import ALIPAY
 from misc import Power
 factorymode_cont_y = 0
 factorymode_screen = lv.obj()
+print("factorymode_screen")
 factorymode_screen.center()
 factorymode_screen.set_size(240, 320)
 factorymode_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
@@ -54,7 +55,7 @@ factorymode_location_label.align(lv.ALIGN.LEFT_MID, 70, 0)
 factorymode_location_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT)
 factorymode_location_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
 factorymode_location.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
-factorymode_cont_y+=60
+factorymode_cont_y+=200
 
 factorymode_alipay_init = lv.btn(factorymode_cont)
 factorymode_alipay_init.set_pos(0, factorymode_cont_y)
@@ -86,6 +87,7 @@ class FactoryModeScreen(Screen):
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
 FactoryModeAlipayInit_screen = lv.obj()
+print("FactoryModeAlipayInit_screen")
 FactoryModeAlipayInit_screen.center()
 FactoryModeAlipayInit_screen.set_size(240, 320)
 FactoryModeAlipayInit_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
@@ -122,6 +124,7 @@ class FactoryModeAlipayInitScreen(Screen):
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
 FactoryModeLocation_screen = lv.obj()
+print("FactoryModeLocation_screen")
 FactoryModeLocation_screen.center()
 FactoryModeLocation_screen.set_size(240, 320)
 FactoryModeLocation_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
@@ -206,8 +209,9 @@ class FactoryModeLocationScreen(Screen):
                         break 
             count = 0
             for key in GSV_dict :
-                if GSV_dict[key] != [] :
-                    GNSS_DATA+=" {}:[{}] ".format(key,GSV_dict[key])
+                print("GSV_dict[key]:len".format(len(GSV_dict[key])))
+                if len(GSV_dict[key]) >= 1 :
+                    GNSS_DATA+=" {:<3}:[{:<3}] ".format(key,GSV_dict[key])#:<3 宽度为3左对齐
                     count+=1
                 if count%2 == 0:
                     GNSS_DATA+="\n"
@@ -217,7 +221,7 @@ class FactoryModeLocationScreen(Screen):
             FactoryModeLocation_GNSS_label.set_text(GNSS_DATA)  
         if msg[2] != [] :#基站
             #print("CALL data:".format(msg[2][0]))
-            if len(msg[2]) > 2 :
+            if len(msg[2]) >= 2 :
                 FactoryModeLocation_CALL_label.set_text("CALL:{}".format(msg[2][0]))      
     def Close(self):
         EventMesh.publish(constants.EVENT.CLOSE_LOCATION) 
index 7d24b9f..1d6c779 100644 (file)
@@ -13,7 +13,15 @@ from machine import Pin
 import utime
 import _thread
 from protocol import ProtoCol,UnicodeHexStr_To_Utf8Str
-
+import usys
+import log
+Testlog = log.getLogger("WechatLog")
+log.set_output(usys.stdout)
+is_appwechat_log = 0
+def Wechat_log(str):
+    if(is_appwechat_log == 1) :
+        Testlog.info(str)
+    
 style_wechat_r_btn =  lv.style_t()
 style_wechat_r_btn.init()
 style_wechat_r_btn.set_bg_color(lv.color_make(0x00, 0xff, 0x2a))
@@ -42,6 +50,7 @@ style_wechat_btn.set_shadow_opa(0)
 
 # -------------------------------------------wechat screen----------------------------------------------------------
 wechat_screen = lv.obj()
+print("wechat_screen")
 wechat_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 wechat_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
@@ -190,6 +199,7 @@ class WechatScreen(Screen):
 
 
     def initialization(self):
+        Wechat_log("initialization1")
         self.aud.setVolume(11)#设置最大声录音
         wechat_label.set_text(" ")
         wechat_label.add_flag(lv.obj.FLAG.HIDDEN)
@@ -207,29 +217,30 @@ class WechatScreen(Screen):
         # utime.sleep(1)
         # for j in range( 200):
         #     self.updata_list_show(1)
+        Wechat_log("initialization2")
 
     def get_wechat_data(self,event, msg): 
         return [self.MXA_MSG ,self.wechat_recode_list]
     
     def set_wechat_data(self, event, msg): 
-
+        Wechat_log("set_wechat_data1")
         self.MXA_MSG = msg[0]
-
         self.wechat_recode_list = msg[1]
         self.wechat_num = self.wechat_recode_list["num"]
         with open("/ext/static/storage_file/wechat_record.json","w",encoding="utf-8") as fd:
                 ujson.dump(self.wechat_recode_list,fd)
             #写编号
-        #self.old_num = self.wechat_num
-        print("set_wechat_data:{} ".format(self.wechat_num))
-        # with open("/ext/static/storage_file/wechat_num.txt","w") as fd:
-        #         fd.write("{}".format(self.wechat_num))
+        Wechat_log("set_wechat_data2:{} ".format(self.wechat_num))
+
 
     def reciving(self,e):
+        Wechat_log("reciving1")
         #self.updata_list_show(0)
         EventMesh.publish("publish_message_event_ui",{"func":self.updata_list_show,"data":0})   
+        Wechat_log("reciving2")
     #接收到新的消息,刷新界面
     def wechat_updata_list_show(self, event, msg): 
+        Wechat_log("wechat_updata_list_show1")
         if (self.wechat_list.has_flag(lv.obj.FLAG.HIDDEN)) == False:
             # wechat_label.clear_flag(lv.obj.FLAG.HIDDEN)
             # wechat_label.set_text("接收中")
@@ -241,7 +252,7 @@ class WechatScreen(Screen):
             #     self.paay_btn_count = 0
             if self.paay_btn_count >= 0:
                 self.paay_btn_old_count = self.paay_btn_count
-    
+        Wechat_log("wechat_updata_list_show2")
     # def handle_message_event(self,data):
     #     if data[0] == "updata_list_show":
     #        self.updata_list_show(data[1])
@@ -249,6 +260,7 @@ class WechatScreen(Screen):
 
     #index=0 不改变列表控件显示到lcd上;index=2只更新列表控件,不显示;index=1更新列表并显示控件
     def updata_list_show(self,index):
+        Wechat_log("updata_list_show1")
         global wechat_screen_list_screen
         if self.press_state != 1:
             if self.wechat_num != 0:
@@ -258,7 +270,7 @@ class WechatScreen(Screen):
                 elif index == 2 or index == 1:
                     
                     #读取json文件中的键作为label文本;                 
-                    print("self.wechat_recode_list:{}".format(self.wechat_recode_list))
+                    Wechat_log("self.wechat_recode_list:{}".format(self.wechat_recode_list))
 
                     if index == 2:
                         self.wechat_list.add_flag(lv.obj.FLAG.HIDDEN)
@@ -275,7 +287,7 @@ class WechatScreen(Screen):
                             continue
                         j+=1
                         
-                        #print("wechat_list_dict:num:{}".format(self.wechat_list_dict[i]["num"]))
+                        #Wechat_log("wechat_list_dict:num:{}".format(self.wechat_list_dict[i]["num"]))
                         value = self.wechat_recode_list[key]
                         
                         self.startY = 56*i
@@ -347,13 +359,15 @@ class WechatScreen(Screen):
                         
                     # bottom_btn1 = self.wechat_list.get_child(-1)
                     # bottom_btn1.scroll_to_view(lv.ANIM.ON)
-                    
+        Wechat_log("updata_list_show2")            
         
     def talking_cb(self,e):
+        Wechat_log("talking_cb1")
         EventMesh.publish("publish_message_event_ui",{"func":self.talking,"data":e})
-        
+        Wechat_log("talking_cb2")
     #按下录音
     def talking(self,e):
+        Wechat_log("talking1")
         self.play_timer.stop()
         self.aud.stop()
         self.wechat_list.add_flag(lv.obj.FLAG.HIDDEN)#隐藏列表选项方框
@@ -371,27 +385,32 @@ class WechatScreen(Screen):
         self.wechat_num += 1 
         self.wechat_show = self.wechat_num
         self.wechat_recode_list["num"] = self.wechat_num
+        Wechat_log("talking1.0")
         self.record_test.start("/ext/static/storage_file/{}.amr".format(self.wechat_num),16) 
         self.second_timer.start(1000, 1, self.reduce_second)
         self.press_state = 1
         self.ble_send = 1
         #松开发送   
-    
+        Wechat_log("talking2")
    
 
     def sending_cb(self,e):
-        #EventMesh.publish("publish_message_event_ui",{"func":self.sending,"data":e})
-        self.sending(e)
-
+        Wechat_log("sending_cb1")
+        EventMesh.publish("publish_message_event_ui",{"func":self.sending,"data":e})
+        #self.sending(e)
+        Wechat_log("sending_cb2")
     #松手0.2秒后显示
     def hide_label(self,*args):
+        Wechat_log("hide_label1")
         if self.ble_send != 1:
             wechat_label.add_flag(lv.obj.FLAG.HIDDEN)
             wechat_label.set_text(" ")
             #self.updata_list_show(0)
-            EventMesh.publish("publish_message_event_ui",{"func":self.updata_list_show,"data":0})    
+            EventMesh.publish("publish_message_event_ui",{"func":self.updata_list_show,"data":0}) 
+        Wechat_log("hide_label2")   
      #松开发送   
     def sending(self,e):
+        Wechat_log("sending1") 
         if self.press_state == 1:
             # wechat_label.clear_flag(lv.obj.FLAG.HIDDEN)
             # wechat_label.set_text("发送中")
@@ -408,7 +427,7 @@ class WechatScreen(Screen):
             self.record_test.stop() #停止錄音
             self.second_timer.stop() #停止计时器
             self.countdown_old = self.countdown
-            # print("self.countdown :{} self.wechat_num:{} self.wechat_recode_list:{} self.wechat_show:{}".format(self.countdown,self.wechat_num,self.wechat_recode_list,self.wechat_show))
+            # Wechat_log("self.countdown :{} self.wechat_num:{} self.wechat_recode_list:{} self.wechat_show:{}".format(self.countdown,self.wechat_num,self.wechat_recode_list,self.wechat_show))
             self.wechat_recode_list["%02d"%(self.wechat_show)] = "S:{}".format(str(self.countdown))
             self.wechat_recode_list["num"] = self.wechat_show
 
@@ -417,29 +436,33 @@ class WechatScreen(Screen):
             #修改或添加词典键值
             self.press_state = 0
             self.ble_send = 0
+            ##隐藏显示文本 显示列表显示框
+            EventMesh.publish("publish_message_event_ui",{"func":self.updata_list_show,"data":2})
             self.timer.start(200, 0, self.hide_label)
             with open("/ext/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
                 ujson.dump(self.wechat_recode_list,fd)
-            print("send wechat data!!!!!!!!!!!!!!!!!!!!!")
+            Wechat_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")
             path = "/ext/static/storage_file/{}.amr".format(self.wechat_show)
             with open(path,"rb") as fd:
                 buf = bytearray(ql_fs.path_getsize(path))
                 fd.readinto(buf)
                 senddata = [self.countdown_old,buf]
                 EventMesh.publish(constants.PROTOCOL.TK_SEND,senddata)
-            #隐藏显示文本 显示列表显示框
-            #self.updata_list_show(2)
-            EventMesh.publish("publish_message_event_ui",{"func":self.updata_list_show,"data":2})
-
+            
+            
+        Wechat_log("sending2") 
 
     def play_img_cb(self,*args):
+        Wechat_log("play_img_cb1")
         EventMesh.publish("publish_message_event_ui",{"func":self.play_img,"data":args})
+        Wechat_log("play_img_cb2")
     def play_img(self,*args):    
+        Wechat_log("play_img1")
         if self.paay_btn_count < 0 or self.paay_btn_count>= self.MXA_MSG:
             self.play_timer.stop()
             return
         EventMesh.publish("system_sleep_rest")#防止黑屏
-        # print("self.count_img :{} self.play_text:{}".format(self.count_img,self.play_text))
+        # Wechat_log("self.count_img :{} self.play_text:{}".format(self.count_img,self.play_text))
         self.count_img+=1
         if self.count_img > 3:
             self.count_img = 1
@@ -453,7 +476,7 @@ class WechatScreen(Screen):
 
         self.sec_num+=1
         if self.sec_num % 2 == 0:
-            # print("self.play_sec:{}".format(self.play_sec))
+            # Wechat_log("self.play_sec:{}".format(self.play_sec))
             if self.play_sec > 0:
                 self.play_sec -= 1
                 if self.play_sec == 0:
@@ -470,22 +493,24 @@ class WechatScreen(Screen):
                     self.wechat_list_dict[self.paay_btn_count]["_btn_img"].set_src("E:/static/APP/wechat/R_3.png")
                 elif self.play_text == "S:":
                     self.wechat_list_dict[self.paay_btn_count]["_btn_img"].set_src("E:/static/APP/wechat/S_3.png") 
-
+        Wechat_log("play_img2")
     def play_label_cb(self,e): #lvgl按钮回调
-        #print("play_label_cb.0:e:{}".format(e.get_code()))
+        Wechat_log("play_label_cb1")
+        #Wechat_log("play_label_cb.0:e:{}".format(e.get_code()))
         paay_btn = e.get_target()
         for i in range(self.MXA_MSG):
             if(self.wechat_list_dict[i]["wechat_btn"] == paay_btn):
-                print("play_label_cb:wechat_btn = e.get_target():i:{}".format(i))
+                Wechat_log("play_label_cb:wechat_btn = e.get_target():i:{}".format(i))
                 self.paay_btn_count = i
                 break
         EventMesh.publish("publish_message_event_ui",{"func":self.play_label,"data":paay_btn})#发到另外一个线程执行更改ui
+        Wechat_log("play_label_cb2")
         #utime.sleep_ms(1000)
     #点击播放
     def play_label(self,play_btn):#另外一个线程实际执行的地方
-
+        Wechat_log("play_label1")
         self.sec_num = 0
-        # print("play_label self.play_text:{}".format(self.play_text)) 
+        # Wechat_log("play_label self.play_text:{}".format(self.play_text)) 
         if self.paay_btn_old_count <= self.MXA_MSG: #停止东画还原到3图标
             text = self.wechat_list_dict[self.paay_btn_old_count]["_btn_label2"].get_text()
             self.play_text = text[0:2]
@@ -499,7 +524,7 @@ class WechatScreen(Screen):
 
         text = self.wechat_list_dict[self.paay_btn_count]["_btn_label2"].get_text()
         self.play_text = text[0:2] #区分左右喇叭动画显示 "R":左边 "S:"右边 "T:":左边
-        print("self.play_text2:{}".format(self.play_text))
+        Wechat_log("self.play_text2:{}".format(self.play_text))
         play_img_s = self.wechat_list_dict[self.paay_btn_count]["_btn_label1"].get_text()
         play_img_s = play_img_s.split('"')
         play_img_s = play_img_s[0]#获取实际显示秒数 '"'前面实际的秒数
@@ -511,19 +536,19 @@ class WechatScreen(Screen):
                 self.play_sec = int(play_img_s)
 
             self.play_timer.start(500, 1, self.play_img_cb)
-        # print("play_label self.count_img :{} self.play_text:{} play_img_s:{} self.play_sec:{}".format(self.count_img,self.play_text,play_img_s,self.play_sec))
+        # Wechat_log("play_label self.count_img :{} self.play_text:{} play_img_s:{} self.play_sec:{}".format(self.count_img,self.play_text,play_img_s,self.play_sec))
         
         num_amr = self.wechat_list_dict[self.paay_btn_count]["_btn_label2"].get_text()
         num_amr = num_amr.split(':')
         num_amr = num_amr[1]#获取实际秒数
         i = int(num_amr)
-        # print("num:{}".format(i))
+        # Wechat_log("num:{}".format(i))
         if self.play_text == "R:" or self.play_text == "S:":#过滤掉文字显示 不需要播放音频文件
             self.aud = audio.Audio(0)
             self.aud.stop()#
             self.aud.play(1, 1, '/ext/static/storage_file/{}.amr'.format(i))  #文件名前面要加上路径
         self.paay_btn_old_count = self.paay_btn_count
-    
+        Wechat_log("play_label2")
 
      #获取是否在录音
     def get_aduio_state(self, event, msg): 
@@ -534,6 +559,7 @@ class WechatScreen(Screen):
 
 
     def Close(self):
+        Wechat_log("Close1")
         self.play_timer.stop()
         self.record_test.stop() #停止錄音
         self.second_timer.stop() #停止计时器
@@ -542,6 +568,7 @@ class WechatScreen(Screen):
         if num == None:
             num = 8
         self.aud.setVolume(num)#恢复原始音量
+        Wechat_log("Close2")
 
     def reduce_second(self,*args):
         if self.countdown < 15:
@@ -566,6 +593,7 @@ class WechatScreen(Screen):
 #微聊弹窗
 
 wechat_popup_screen = lv.obj()
+print("wechat_popup_screen")
 wechat_popup_screen.center()
 wechat_popup_screen.set_size(240, 320)
 wechat_popup_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
@@ -625,7 +653,7 @@ class TK_ProtoCol(ProtoCol):
         #[XT*YYYYYYYYYYYYYYY*LEN*TKS,秒数(十进制),AMR 格式音频数据]
         arm_data = msg[1]
         arm_sec = msg[0]
-        print("TK_ProtoCol:msgtype:{} arm_sec:{}".format(type(msg),arm_sec))
+        Wechat_log("TK_ProtoCol:msgtype:{} arm_sec:{}".format(type(msg),arm_sec))
 
         arm = bytearray()
         for i in range(len(arm_data)):
@@ -643,7 +671,7 @@ class TK_ProtoCol(ProtoCol):
                 arm.append(arm_data[i])
                
         datalen = len(arm) + 4+len(str(arm_sec))+1
-        #print("len(str(arm_sec)):{}".format(len(str(arm_sec))+1))
+        #Wechat_log("len(str(arm_sec)):{}".format(len(str(arm_sec))+1))
         send_data = bytearray("SZKW*%s*%04X*TKS,%d,"%(self.imei,datalen,arm_sec))
         send_data.extend(arm)
         MD5_SIGN = self.pack_MD5_head(send_data)
@@ -661,19 +689,19 @@ class TK_ProtoCol(ProtoCol):
         @param msg: 接收到的下行数据
         [SZKW*860132060004322*20BD*TK,#!AMR...]
         """
-        #print("K_ProtoCol:recv:data:{}".format(msg))
+        #Wechat_log("K_ProtoCol:recv:data:{}".format(msg))
         msg_tmp = msg.decode('ascii')
         str = msg_tmp.split('TK,')
-        # print("TK_ProtoCol:recv:len:{} {} {}".format(len(msg),len(str),msg_tmp.find("#!AMR")))
+        # Wechat_log("TK_ProtoCol:recv:len:{} {} {}".format(len(msg),len(str),msg_tmp.find("#!AMR")))
         if  msg_tmp.find("#!AMR") != -1: #是否是服务器下发音频数据
-            # print("TK_ProtoCol:recv:datalen{}".format(len(msg)))
+            # Wechat_log("TK_ProtoCol:recv:datalen{}".format(len(msg)))
             arm_data = bytearray(str[1])#获取amr输出
             get_wechat_data = EventMesh.publish("get_wechat_data")
             
             MXA_MSG = get_wechat_data[0]
             wechat_recode_list = get_wechat_data[1]
             wechat_num = wechat_recode_list["num"]
-            # print("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list))
+            # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list))
             
             if wechat_num >= MXA_MSG:
                 wechat_num = 0 
@@ -683,13 +711,14 @@ class TK_ProtoCol(ProtoCol):
                 wechat_num += 1 
           
 
-            print("num_total:datalen:{} {}".format(MXA_MSG,wechat_recode_list))
+            Wechat_log("num_total:datalen:{} {}".format(MXA_MSG,wechat_recode_list))
             wechat_recode_list["%02d"%(wechat_num)] = "R:{}".format(3)
             wechat_recode_list['num'] = wechat_num
             EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list])
             #写语音文件数据
-            screen_NAME=EventMesh.publish("get_screen_NAME")
-            if screen_NAME != "wechat":
+            screen_NAME = EventMesh.publish("get_screen_NAME")
+            get_lcd_state = EventMesh.publish("get_lcd_state")
+            if screen_NAME != "wechat" or get_lcd_state == 0:
                 EventMesh.publish("load_screen", {"screen": "wechat_popup"})
             else:
                 EventMesh.publish("wechat_updata_list_show")
@@ -735,7 +764,7 @@ class MESSAGE_ProtoCol(ProtoCol):
         send_data = "SZKW*%s*0007*MESSAGE"%(self.imei)
         MD5_SIGN = self.pack_MD5_head(send_data)
         data = "[%s%s]"%(str(MD5_SIGN),send_data)
-        #print("POWEROFF_ProtoCol:send:%s"%(data))
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
         # 通过socket发送到服务器端
         EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
 
@@ -750,7 +779,7 @@ class MESSAGE_ProtoCol(ProtoCol):
         msg_s = msg.decode('ascii')
         msg_s = msg_s.split(',')
         msg_s = msg_s[1]
-        # print("msg_tmp:len:{}\r\n data:{}".format(len(msg_s),msg_s))
+        # Wechat_log("msg_tmp:len:{}\r\n data:{}".format(len(msg_s),msg_s))
         
 
         get_wechat_data = EventMesh.publish("get_wechat_data")
@@ -758,7 +787,7 @@ class MESSAGE_ProtoCol(ProtoCol):
         MXA_MSG = get_wechat_data[0]
         wechat_recode_list = get_wechat_data[1]
         wechat_num = wechat_recode_list["num"]
-        # print("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list))
+        # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list))
         
         if wechat_num >= MXA_MSG:
             wechat_num = 0 
@@ -768,16 +797,17 @@ class MESSAGE_ProtoCol(ProtoCol):
             wechat_num += 1 
         msg_txt = {}
         # 0 1 2 3
-        print("wechat_num:init {}".format(wechat_num))
+        Wechat_log("wechat_num:init {}".format(wechat_num))
         msg_txt = UnicodeHexStr_To_Utf8Str(msg_s)
-        # print("msg_txt:{}".format(msg_txt))
+        # Wechat_log("msg_txt:{}".format(msg_txt))
         wechat_recode_list["%02d"%(wechat_num)] = "T:{}".format(msg_txt)
         wechat_recode_list['num'] = wechat_num
         EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list])
-        # print("wechat_recode_list:len data:{}".format(wechat_recode_list))
+        # Wechat_log("wechat_recode_list:len data:{}".format(wechat_recode_list))
         EventMesh.publish(constants.PROTOCOL.MESSAGE_SEND)
-        screen_NAME=EventMesh.publish("get_screen_NAME")
-        if screen_NAME != "wechat":
+        screen_NAME = EventMesh.publish("get_screen_NAME")
+        get_lcd_state = EventMesh.publish("get_lcd_state")
+        if screen_NAME != "wechat" or get_lcd_state == 0:
             EventMesh.publish("load_screen", {"screen": "wechat_popup"})
         else:
             EventMesh.publish("wechat_updata_list_show")
index 7044dfc..25f2b3f 100644 (file)
@@ -222,6 +222,7 @@ style_font_youyuan_40.set_text_color(lv.color_make(0xff, 0xff, 0xff))
 style_font_youyuan_40.set_text_font_v2("font_40.bin",40,0)
 
 power_on_screen = lv.obj()
+print("power_on_screen")
 power_on_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 power_on_label = lv.label(power_on_screen)
index 2f997a0..5d3984c 100644 (file)
@@ -62,10 +62,10 @@ if __name__ == '__main__':
     print("init4:{}".format(utime.localtime()))
     ui = _ui.UI()
     ui.post_processor_after_instantiation()
-    ui.add_screen(MainMenuScreen()) 
-    EventMesh.publish("load_screen", {"screen": "main_menu"})
+    ui.add_screen(_ui.SystemInitScreen()) 
+    EventMesh.publish("load_screen", {"screen": "system_init"})
     print("init5:{}".format(utime.localtime()))
-    
+    ui.add_screen(MainMenuScreen()) 
     ui.add_screen(_ui.PopupScreen()) 
     ui.add_screen(_ui.PhoneScreen()) 
     ui.add_screen(_ui.HeartrateScreen()) 
@@ -79,7 +79,7 @@ if __name__ == '__main__':
     ui.add_screen(_ui.Spo2Screen()) 
     ui.add_screen(_ui.TemperatureScreen()) 
     ui.add_screen(_ui.ContactsScreen()) 
-    from usr.appWechat import WechatScreen,TK_ProtoCol,MESSAGE_ProtoCol,NewWechatPopupScreen
+    from appWechat import WechatScreen,TK_ProtoCol,MESSAGE_ProtoCol,NewWechatPopupScreen
     ui.add_screen(WechatScreen()) 
     from alarm import ClkListScreen,ClockManager,NewEditClk,CLKTimeScreen,ClkPeriod,PopupAlarmScreen
     from ui_health import HealthScreen
@@ -136,7 +136,7 @@ if __name__ == '__main__':
     print("init6:{}".format(utime.localtime()))
     
 
-    from protocol import LK_ProtoCol,PING_ProtoCol,HEART_ProtoCol,OXYGEN_ProtoCol,OXYGEN_One_ProtoCol,HRSTART_ProtoCol,CENTER_ProtoCol,UPLOAD_ProtoCol,\
+    from usr.protocol import LK_ProtoCol,PING_ProtoCol,HEART_ProtoCol,OXYGEN_ProtoCol,OXYGEN_One_ProtoCol,HRSTART_ProtoCol,CENTER_ProtoCol,UPLOAD_ProtoCol,\
         TEMP_ProtoCol,DLT_ProtoCol,WT_ProtoCol,UD_ProtoCol,REMIND_ProtoCol, CR_ProtoCol,KA_ProtoCol,FIND_ProtoCol,POWEROFF_ProtoCol,\
             ProtoColResolver,PHL_ProtoCol,MONITOR_ProtoCol,bootoff_ProtoCol,WDSTART_ProtoCol,LOWBAT_ProtoCol,sosHome_dial_ProtoCol,SockManager,NetManager
     import mgr as mgr
@@ -235,6 +235,6 @@ if __name__ == '__main__':
     if sms_lacv != 'SM':#每次开机设置一下短信的存储位置
         sms.setSaveLoc('SM', 'SM', 'SM')
     print("init12:{}".format(utime.localtime()))
-    
+    EventMesh.publish("load_screen", {"screen": "main_menu"})
 
 
index 343e110..74a9118 100644 (file)
@@ -28,7 +28,7 @@ import wifiScan
 import math
 import voiceCall
 from misc import PWM
-
+from queue import Queue
 class PhoneVolumeLevelManager(Abstract):
     def __init__(self):
         self.level = 0
@@ -418,7 +418,6 @@ class Battery(object):
     def get_charge_status(self):
         return self.__charge_status
 
-
 class BatteryManager(Abstract):
     def __init__(self):
         """电池管理器"""
@@ -584,6 +583,10 @@ class DeviceInfoManager(Abstract):
     """
 
     def __init__(self):
+
+        self.DeviceInfo_queue = Queue()
+        _thread.start_new_thread(self.DeviceInfo_queue_thread, ())
+        EventMesh.subscribe("publish_message_event_DeviceInfo",self.publish_message_event_DeviceInfo)
         self.key = ""
         self.imei = ""
         self.cid = "ETEST20221014010"
@@ -593,13 +596,10 @@ class DeviceInfoManager(Abstract):
         #self.__location = None
         self.timer_push_schedule = osTimer()
         self.timer_pusht_test = osTimer()
-        self.usb = USB()
+        
         #self.battery_push_schedule = osTimer()
         self.check_battery_list = []
-        self.__bat_num = 0
-        self.usb.setCallback(self.usb_event_cb)
-        self.log = LogAdapter(self.__class__.__name__)
-        self.rtc = RTC()
+        
         self.step = [0,0,0,0]
         self.timer_push=0
         self.timer_push_tmp=60
@@ -629,6 +629,10 @@ class DeviceInfoManager(Abstract):
         self.temp_state = 0
         self.temp_one_state = 0
 
+        self.usb = USB()
+        self.usb.setCallback(self.usb_event_cb)
+        self.log = LogAdapter(self.__class__.__name__)
+        self.rtc = RTC()
         self.aud = audio.Audio(0)
         print("DeviceInfoManager:1")
         self.gsensor = SC7A20()
@@ -644,8 +648,6 @@ class DeviceInfoManager(Abstract):
         self.hsensor.close()
         # #print("hsensor.open_heart:%d\r\n"%(self.hsensor.open_heart()))
         print("DeviceInfoManager:3")
-        
-
         self.i2c0 = I2C(I2C.I2C0, I2C.FAST_MODE)
         self.stop_temp( None, None)
         
@@ -692,34 +694,35 @@ class DeviceInfoManager(Abstract):
         EventMesh.subscribe(constants.EVENT.GET_TEMP, self.get_temp)
 
         print("post_processor_after_instantiation:2")
-        self.timer_push_schedule.start(10000, 1, self.publish_event)
+        self.timer_push_schedule.start(10000, 1, self.publish_event_cb)
         # self.timer_pusht_test.start(2000, 1, self.publish_test)
         # self.battery_push_schedule.start(3000, 1, self.__check_battery)
         self.log.debug("post_processor_after_instantiation finished")
         #EventMesh.publish(constants.EVENT.START_HEART)
         # 设备开机立刻更新一次参数
-        self.publish_event()
+        self.publish_event_cb()
         print("post_processor_after_instantiation:3")
-    def publish_test(self, *args, **kwargs):
-        if self.test == 0:
-            self.test = 1
-            self.aud.play(1, 1, 'E:/static/audio_audio_haixiu.mp3')  #播放声音
-        elif self.test == 1:
-            self.aud.stop()
-            self.test = 0
-        # self.read_data = {}
-        # check = ql_fs.path_exists("/ext/static/storage_file/config.json")
-        # if check == True:
-        #     with open("/ext/static/storage_file/config.json","r") as fd:
-        #         self.read_data = ujson.load(fd)
-        # self.read_data["test"] = "7817871837381378"
-        # with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd:
-        #     ujson.dump(self.read_data,fd)
+
+    def publish_message_event_DeviceInfo(self,event,msg):
+        self.DeviceInfo_queue.put(msg)
+
+    #DeviceInfo的消息队列处理,防止卡顿
+    def DeviceInfo_queue_thread(self):
+        while True:
+            data = self.DeviceInfo_queue.get()
+            #print("DeviceInfo_queue_thread:data = {}".format(data))
+            if data != None:
+                try:
+                    data["func"](data["data"])
+                except Exception as e:
+                    print("DeviceInfo_queue_thread:ERROR:{}".format(e))
+
 
     def gsensor_cb(self, para):
         print("gsensor_cb:{}".format(para))
         if para == 0: #跌倒报警
-            EventMesh.publish("load_screen", {"screen": "FIND"})
+            pass
+            #EventMesh.publish("load_screen", {"screen": "FIND"})
         elif para == 1: #抬腕
             pass
             # EventMesh.publish(constants.EVENT.SYSTEM_UP)
@@ -727,7 +730,9 @@ class DeviceInfoManager(Abstract):
             pass
             # EventMesh.publish(constants.EVENT.SYSTEM_SLEEP)
 
-    def publish_event(self, *args, **kwargs):
+    def publish_event_cb(self, *args, **kwargs):
+        EventMesh.publish("publish_message_event_DeviceInfo",{"func":self.publish_event,"data":0})  
+    def publish_event(self,data):
         """
         主动推送事件
         :param args:
@@ -767,7 +772,7 @@ class DeviceInfoManager(Abstract):
                     EventMesh.publish(constants.EVENT.START_LOCATION) #开始定位
         EventMesh.publish(constants.EVENT.PUSH_STEP, self.get_step_count())
 
-        hr_time = EventMesh.publish("get_time_hr_spo2")#获取时间是否大于0
+        
         
         self.get_hr_state = EventMesh.publish("get_hr_state")
         self.get_spo2_state = EventMesh.publish("get_spo2_state")
@@ -852,7 +857,7 @@ class DeviceInfoManager(Abstract):
 
         get_temp_time  = EventMesh.publish("get_temp_time")
         get_temp_state  = EventMesh.publish("get_temp_state")
-
+        hr_time = EventMesh.publish("get_time_hr_spo2")#获取时间是否大于0
         if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and battery[1] != 1:
             # print("get_temp_time:{} self.temp_one_state:{}".format(get_temp_time,self.temp_one_state))
             if get_temp_time != None:#定时测量体温
@@ -1241,7 +1246,6 @@ class DeviceInfoManager(Abstract):
       
     def READ_LOCATION(self, event, msg) :
         #print("READ_LOCATIO",msg)
-        
         EventMesh.publish(constants.PROTOCOL.UD_SEND,msg)
 
     def get_device_ope(self, event, msg):
@@ -1621,8 +1625,8 @@ class LocationManager(Abstract):
 
     def gps_open(self, event, msg):
         #print("publish:gps_open")
-        quecgnss.init()
-        #quecgnss.gnssEnable(1)
+        #quecgnss.init()
+        quecgnss.gnssEnable(1)
         self.gps.__gps_nmea_data_clean()
         
 
index 46b53af..76491ff 100644 (file)
@@ -16,6 +16,7 @@ import net
 import usocket
 import osTimer
 import _thread
+from queue import Queue
 def unicode_to_utf8(src):
     ref = 0xe08080
     result = ref
@@ -86,9 +87,11 @@ class SockManager(Abstract):
         self.reconnect_time = 1000
         self.reconnect_flag = 0
         self.connect_tmp = 0
-        _thread.stack_size(24*1024)
-        _thread.start_new_thread(self.recv, ())
-        _thread.stack_size(8*1024)
+        _thread.start_new_thread(self.connect, ())
+        
+        self.socket_send_queue = Queue()
+        _thread.start_new_thread(self.socket_send_queue_thread, ())
+        
 
     def post_processor_after_instantiation(self):
         EventMesh.subscribe(constants.EVENT.CHANNEL_SOCKET_SEND, self.send)
@@ -98,15 +101,20 @@ class SockManager(Abstract):
         self.resolver = resolver
 
     def initialization(self, *args, **kwargs):
-        self.connect()
+        _thread.stack_size(16*1024)
+        _thread.start_new_thread(self.recv, ())
+        _thread.stack_size(8*1024)
+    
 
     def connect(self):
-
-        print(str((self.server_addr, self.server_port)))
+        print("connect1{}:{}".format(self.server_addr, self.server_port))
+        if EventMesh.publish("network_state") == 0: #没注网
+            return
         try:
             if(self.sock != None) :
                 self.sock.close()
             self.sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
+            #self.sock.setblocking(False) &self.sock.settimeout(0)不阻塞
             self.sock.connect((self.server_addr, self.server_port))
             
             #utime.sleep_ms(500)
@@ -118,8 +126,11 @@ class SockManager(Abstract):
             self.run_flag = False
         else:
             self.run_flag = True
+        print("connect2{}:{}".format(self.server_addr, self.server_port))
+        self.reconnect_flag = 0
     def publish_timer_cb(self, *args):
         EventMesh.publish(constants.PROTOCOL.LK_SEND)
+        
     def check(self, *args):
         if (not self.run_flag) or (self.connect_tmp == 0) : #7分钟无数据读取,则认为是掉线了
             print("tcp reconnect!!!!!!!!!!!!!!!!!!")
@@ -132,31 +143,63 @@ class SockManager(Abstract):
             return
         self.reconnect_flag = 1
         self.reconnect_timer.start(self.reconnect_time, 0, self.reconnect_timer_cb)
-        if self.reconnect_time < 7*1000:
+        if self.reconnect_time < 60*1000:
             self.reconnect_time += 30*1000
 
-    def reconnect_timer_cb(self, *args):    
-        self.connect()
-        self.reconnect_flag = 0
+    def reconnect_timer_cb(self, *args): 
+        _thread.start_new_thread(self.connect, ())   
+        
+    def socket_send_queue_thread(self):
+         while True:
+            data = self.socket_send_queue.get()
+            print("TCP:send data1 len:{}".format(len(data)))
+
+            #print("ui_queue_thread:data = {}".format(data))
+            socketsta = self.sock.getsocketsta() 
+            if(socketsta == -1): #给释放了或者出错了
+                continue
+            if(socketsta == 4):#正常连击
+                if data != None:
+                    try:
+                        self.sock.send(data)
+                        print("TCP:send data2 len:{}".format(len(data)))    
+                    except Exception as e:
+                        self.reconnect()
+                        self.socket_send_queue.put(data)#重新把数据加回队列
+                        print("socket_send_queue_thread1:ERROR:{}".format(e))
+            elif socketsta < 4:#正在连接,等待连接成功重新发送
+                count = 0
+                while True:
+                    if count > 15 :
+                        break
+                    utime.sleep(1)
+                    if(self.sock.getsocketsta() == 4):#
+                        try:
+                            self.sock.send(data)
+                            print("TCP:send data3 len:{}".format(len(data)))    
+                        except Exception as e:
+                            self.reconnect()
+                            self.socket_send_queue.put(data)#重新把数据加回队列
+                            print("socket_send_queue_thread2:ERROR:{}".format(e))
+                        break
+            else :#连接错误
+                print("socket_send_queue_thread:ERROR:reconnect")
+                self.reconnect()
+            utime.sleep(1)
 
     def send(self, topic, msg):
         #print("TCP:send data:{}".format(msg))
-        print("TCP:send data len:{}".format(len(msg)))
-        try:
-            if(self.sock != None):
-                self.sock.send(msg)
-            
-        except Exception as e:
-            #print("TCP:ERROR:send:{}".format(e))    
-            self.reconnect()
-            # self.run_flag = False
-            
+        if EventMesh.publish("network_state") == 0: #没注网,则不发送
+            EventMesh.publish(constants.EVENT.SET_CONNECT, 0)#标记断网
+            print("dataCall not connect")
+            return
+        else :
+            try:
+                self.socket_send_queue.put(msg)
+            except Exception as e:   
+                print("self.socket_send_queue.put:ERROR:{}".format(e)) 
+                # self.run_flag = False
 
-            # self.sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
-            # self.sock.connect(("api.xcloudtech.com", 9000))    
-            # _thread.stack_size(24*1024)
-            # _thread.start_new_thread(self.reconnect, ())
-            # _thread.stack_size(8*1024)
     def recv(self):
         data = b''
         while True:
@@ -174,14 +217,14 @@ class SockManager(Abstract):
                 if data[-1] != 0x5d and len(data)<20*1024: #']':
                     continue
                 self.connect_tmp = 1 #有数据,就认为是连接状态
-                
+                self.reconnect_time = 1000
                 EventMesh.publish(constants.EVENT.SET_CONNECT, 1)
                 data_str = data.decode('ascii')
                 data_str = data_str.split(']')
                 if len(data_str) < 3 :
                     self.resolver.handler(data)
                 else :
-                    for i in range(len(data_str)):
+                    for i in range(len(data_str)-1):
                         self.resolver.handler(data_str[i])
                 
                 data = b''
@@ -202,7 +245,8 @@ class NetManager(Abstract):
         self.__data_call = dataCall
         self.__net = net
         self.check_net = checkNet.CheckNetwork("QuecPython_Helios_Framework", "this latest version")
-        
+        EventMesh.subscribe("get_network_state", self.get_network_state)
+        self.network_state = 0
 
     def post_processor_after_instantiation(self, *args, **kwargs):
         count = 0
@@ -213,6 +257,7 @@ class NetManager(Abstract):
             data = dataCall.getInfo(1, 0)
             print("data call INFO {}".format(data))
             if data[2][0]:
+                self.network_state = 1
                 break
             utime.sleep(1)
         self.__data_call.start(2, 0, "", "", "", 0)
@@ -222,13 +267,16 @@ class NetManager(Abstract):
         pdp = args[0]
         nw_sta = args[1]
         if nw_sta == 1:
-            state = 2
+            self.network_state = 1
             print("*** network %d connected! ***" % pdp)
-            EventMesh.publish('network_state', state)
+
         else:
-            state = 3
+            self.network_state = 0
             print("*** network %d not connected! ***" % pdp)
-            EventMesh.publish('network_state', state)
+           
+    def get_network_state(self, topic, msg):
+        return self.network_state 
+
 
 class ProtoCol(Abstract):
     TYPE = ""
@@ -753,16 +801,18 @@ class REMIND_ProtoCol(ProtoCol):
 
         alarm_new  = EventMesh.publish("read_alarminjson")
         # print("alarm_list:{} msg_tmp:{}",alarm_new,msg_tmp)
-        num = 2
-        count = 1
-        j=0
-        new = 0
-        for j in range(0,3):
+
+        k=0
+        if len(alarm_new) < 5 :
+            alarm_new = []
+            for i in range(5):
+                alarm_new.append({'hour': 16, 'repeart': 1, 'idx': i, 'enabled': 0, 'days': [], 'minute': 39}) 
+        for j in range(2,5):#0 1是开关机,234是闹钟
             alarm_day = []
             alarm_week = []
             alarm_total_data = []
-            alarm_total_data = msg_tmp.split(',')[j]
-
+            alarm_total_data = msg_tmp.split(',')[k]
+            k+=1
             b = alarm_total_data.find('-')
             if b != -1:
                 alarm_data = alarm_total_data.split('-')#-作为分隔符
@@ -781,43 +831,8 @@ class REMIND_ProtoCol(ProtoCol):
                     for i in range(0,7):
                         if alarm_week[i] != '0':
                            alarm_day.append(i)
-                if alarm_new and new == 0 :
-                    for x in range(0,5):
-                       
-                        # print("count :{} self.alarm_new:111111{} len(self.alarm_new):{} ".format(count,alarm_new,len(alarm_new)))
-                        if new == 1 and count > len(alarm_new):
-                            break
-                        tmp = alarm_new[count-1]['idx']
-                        if tmp == 2 or tmp == 3 or tmp == 4 :#覆盖旧的
-                            alarm_new[count-1] = {"idx": tmp, "hour": alarm_time_hour, "minute": alarm_time_min, "days":alarm_day, "enabled": alarm_switch,"repeart":alarm_day_num}
-                            count+=1
-                            if count > len(alarm_new):
-                                new = 1
-                            # print("self.alarm_list:5555 {}".format(alarm_new))
-                            break
-                        else:#添加最新的
-                            count+=1
-                            if tmp == 0 or tmp == 1:#添加最新的
-                                msg_data = EventMesh.publish("get_boot_off_time")
-                                # print("msg_data all_data {}".format(msg_data))
-                                if msg_data != None: 
-                                    if msg_data[1] != 0:#只有关机时间长度为0时才添加新元素 不是就覆盖原来旧的数据
-                                        # print("alarm_new:444444 {}".format(alarm_new))
-                                        if count > len(alarm_new):
-                                            new = 1
-                                        continue
-                                    else:
-                                        alarm_new.append({"idx": num, "hour": alarm_time_hour, "minute": alarm_time_min, "days":alarm_day, "enabled": alarm_switch,"repeart":alarm_day_num}) 
-                                        # print("self.alarm_list:7777777 {}".format(alarm_new))
-                                        if count > len(alarm_new):
-                                            new = 1
-                                        break
-                        count+=1
-                    # print("self.alarm_list:111111 {}".format(alarm_new))
-                else:#添加最新的
-                    alarm_new.append({"idx": num, "hour": alarm_time_hour, "minute": alarm_time_min, "days":alarm_day, "enabled": alarm_switch,"repeart":alarm_day_num})
-                    new = 1
-            num+=1
+                alarm_new[j] = {"idx": j, "hour": alarm_time_hour, "minute": alarm_time_min, "days":alarm_day, "enabled": alarm_switch,"repeart":alarm_day_num}
+                
         # print("self.alarm_list: {}".format(alarm_new))
         with open("/ext/static/storage_file/alarm_msg.json", 'w',encoding='utf-8') as fd:
             ujson.dump(alarm_new,fd)
@@ -1292,14 +1307,15 @@ class ProtoColResolver(object):
         #     data = data[7:]
         #     EventMesh.publish(constants.PROTOCOL.H04_RECV, data)
         try:
-            print("handler:{}".format(len(data)))
-            data_tmp = data.decode('ascii')
-            data_tmp = data_tmp.split(']')[0] #去掉]
-            ProtoCol_type = data_tmp.split('*')[3] #拿到协议标识
-            ProtoCol_type = ProtoCol_type.split(',')[0]
-            ProtoCol_type = "%s_RECV"%(ProtoCol_type)
-            # print("ProtoColResolver:ProtoCol_type:%s\r\ndata:%s"%(ProtoCol_type,data))
-            EventMesh.publish(ProtoCol_type, data) #返回协议read
+            if len(data) > 0: 
+                print("handler:{}".format(len(data)))
+                data_tmp = data.decode('ascii')
+                data_tmp = data_tmp.split(']')[0] #去掉]
+                ProtoCol_type = data_tmp.split('*')[3] #拿到协议标识
+                ProtoCol_type = ProtoCol_type.split(',')[0]
+                ProtoCol_type = "%s_RECV"%(ProtoCol_type)
+                # print("ProtoColResolver:ProtoCol_type:%s\r\ndata:%s"%(ProtoCol_type,data))
+                EventMesh.publish(ProtoCol_type, data) #返回协议read
         except Exception as e:
             print("handler:ERROR:{}".format(e))
             print("handler:error data:{}".format(len(data)))
index 584425a..6b09a4e 100644 (file)
@@ -246,6 +246,7 @@ class PhoneScreen(Screen):
         phone_zero,phone_hash,phone_call,phone_call_btn,phone_contact,phone_contact_btn,phone_delete,phone_delete_btn
         if phone_screen == None:
             phone_screen = lv.obj()
+            print("phone_screen")
             phone_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             phone_line = lv.line(phone_screen)
@@ -663,6 +664,7 @@ class CallLogScreen(Screen):
         global call_log_screen,contacts_cont_list ,call_log_title ,none_call_log_title ,call_log_cont_list_screen
         if call_log_screen  == None:
             call_log_screen = lv.obj()
+            print("call_log_screen")
             call_log_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
             call_log_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
@@ -721,6 +723,9 @@ class CallLogScreen(Screen):
         self.btn_create()
     
     def btn_create(self):
+        EventMesh.publish("publish_message_event_ui",{"func":self.btn_create_screen,"data":0})
+
+    def btn_create_screen(self,data):    
         global call_log_screen,contacts_cont_list ,call_log_title ,none_call_log_title ,call_log_cont_list_screen
         h = 0
         if call_log_screen != None:
@@ -880,6 +885,7 @@ class DialingScreen(Screen):
         global dialing_screen,dialing_img,dialing_name ,hangup_imgbtn 
         if dialing_screen == None:
             dialing_screen = lv.obj()
+            print("dialing_screen")
             dialing_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             dialing_img = lv.img(dialing_screen)
@@ -998,6 +1004,7 @@ class NewMessageScreen(Screen):
         global message_popup_screen,message_popup_title 
         if message_popup_screen == None :
             message_popup_screen = lv.obj()
+            print("message_popup_screen")
             message_popup_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             message_popup_title = lv.label(message_popup_screen)
@@ -1049,6 +1056,7 @@ class MessageFullScreen(Screen):
         global message_full_screen,message_full_label,message_full_confirm,message_full_cancel
         if message_full_screen == None :
             message_full_screen = lv.obj()
+            print("message_full_screen")
             message_full_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             message_full_label = lv.label(message_full_screen)
@@ -1162,8 +1170,10 @@ class PopupScreen(Screen):
 
     def initialization(self):
         global msg_list_screen,msg_top_title,msg_cont_detail,msg_list_t,msg_list_t_done_img,no_msg_text,msg_cont_list_screen
+        print("PopupScreen:initialization1")
         if msg_list_screen == None :
             msg_list_screen = lv.obj()
+            print("msg_list_screen")
             msg_list_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
             msg_list_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
@@ -1221,12 +1231,16 @@ class PopupScreen(Screen):
         self.msg_nums = sms.getMsgNums() 
         # print("self.msg_nums:{} type:{}".format(self.msg_nums,type(sms.getMsgNums())))
         self.btn_create(1)
+        print("PopupScreen:initialization2")
     def sms_create_list(self,event,msg):
         self.msg_nums = sms.getMsgNums() 
         self.btn_create(1)
 
 
     def btn_create(self,msg):
+        EventMesh.publish("publish_message_event_ui",{"func":self.btn_create_screen,"data":msg})
+
+    def btn_create_screen(self,msg):
         global msg_list_screen,msg_top_title,msg_cont_detail,msg_list_t,msg_list_t_done_img,no_msg_text,msg_cont_list_screen
         count = 0
         j = 0
@@ -1255,8 +1269,8 @@ class PopupScreen(Screen):
                     self.sms_detail_list_dict[i]["msg_btn"].set_size(230,65)
                     self.sms_detail_list_dict[i]["msg_btn"].set_pos(0,67*count)
                     self.sms_detail_list_dict[i]["msg_btn"].add_style(style_sms_bg_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
-                    self.sms_detail_list_dict[i]["msg_btn"].add_event_cb(lambda e: EventMesh.callback_wrapper(self.sms_cb(e)),
-                                            lv.EVENT.CLICKED, None)
+                    # self.sms_detail_list_dict[i]["msg_btn"].add_event_cb(lambda e: EventMesh.callback_wrapper(self.sms_cb(e)),
+                    #                         lv.EVENT.CLICKED, None)
                 
                     title = tmp[0] 
                     # print("title:{}".format(title))
@@ -1348,6 +1362,7 @@ class MsgDetailScreen(Screen):
         global msg_detail_screen,msg_detail_title,msg_detail_cont
         if msg_detail_screen == None:    
             msg_detail_screen = lv.obj()
+            print("msg_detail_screen")
             msg_detail_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             msg_detail_title = lv.label(msg_detail_screen)
@@ -1404,6 +1419,7 @@ class HeartrateScreen(Screen):
         global heartrate_screen,heartrate_label,heartrate_done_img ,heartrate_start_label,heartrate_bpm_label ,heartrate_done_label 
         if heartrate_screen == None:
             heartrate_screen = lv.obj()
+            print("heartrate_screen")
             heartrate_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             heartrate_label = lv.label(heartrate_screen)
@@ -1553,6 +1569,7 @@ class ToolboxScreen(Screen):
         if toolbox_screen == None:
             tool_set_y = 0
             toolbox_screen = lv.obj()
+            print("toolbox_screen")
             toolbox_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
             toolbox_screen.set_scrollbar_mode(0)
 
@@ -1683,6 +1700,7 @@ class IncomingCallScreen(Screen):
         if incoming_call_screen == None :
             # -------------------------------------------incoming_call screen----------------------------------------------------------
             incoming_call_screen = lv.obj()
+            print("incoming_call_screen")
             incoming_call_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             incoming_call_img = lv.img(incoming_call_screen)
@@ -1895,6 +1913,7 @@ class OnCallScreen(Screen):
         global on_call_screen,on_call_label_name,on_call_second_label ,on_call_hangup  
         if on_call_screen ==None :
             on_call_screen = lv.obj()
+            print("on_call_screen")
             on_call_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
             on_call_label_name = lv.label(on_call_screen)
             on_call_label_name.set_pos(0, 100)
@@ -1980,6 +1999,7 @@ class StepScreen(Screen):
         global step_screen,step_label ,step_label_01 ,step_img 
         if step_screen == None:
             step_screen = lv.obj()
+            print("step_screen")
             step_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             step_label = lv.label(step_screen)
@@ -2052,6 +2072,7 @@ class WeatherScreen(Screen):
             weather_detail_label,weather_location_label,no_connect_label ,no_connect_label1 
         if weather_screen == None :
             weather_screen = lv.obj()
+            print("weather_screen")
             weather_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             weather_img = lv.img(weather_screen)
@@ -2216,6 +2237,7 @@ class ContactsScreen(Screen):
         EventMesh.subscribe("contact_updata_list_show", self.btn_create_list)
         self.MXA_phone_num = 50 #最大显示号码个数
         self.contact_detail_listt_dict = []
+        self.calling_btn = []
 
     def post_processor_before_initialization(self):
         data = EventMesh.publish("get_phonebook_list")
@@ -2228,6 +2250,7 @@ class ContactsScreen(Screen):
         global contacts_screen,contacts_cont,contacts_top_title,contact_none_label,contacts_screen_list_screen
         if contacts_screen == None:
             contacts_screen = lv.obj()
+            print("contacts_screen")
             contacts_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
             contacts_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
@@ -2261,7 +2284,7 @@ class ContactsScreen(Screen):
             self.contact_detail_list.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
             for i in range(self.MXA_phone_num):
                 contact_btn = lv.btn(self.contact_detail_list)
-                contact_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling(e)),
+                contact_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_cb(e)),
                                         lv.EVENT.CLICKED, None)
                 contact_btn.add_flag(lv.obj.FLAG.HIDDEN)
                 contact_btn_label_1 = lv.label(contact_btn)
@@ -2280,8 +2303,11 @@ class ContactsScreen(Screen):
         self.btn_create_list_show(1)
 
     def btn_create_list_show(self,state):
+        EventMesh.publish("publish_message_event_ui",{"func":self.btn_create_list_show_screen,"data":state})
+
+    def btn_create_list_show_screen(self,state):
         global contacts_screen,contacts_cont,contacts_top_title,contact_none_label,contacts_screen_list_screen
-        print("btn_create_list_show!!!!!!!!!!!")
+        print("btn_create_list_show_screen!!!!!!!!!!!")
         if contacts_screen == None:
             return
         #读取json文件中的键作为label文本;
@@ -2352,19 +2378,24 @@ class ContactsScreen(Screen):
                 self.contact_detail_list.add_flag(lv.obj.FLAG.HIDDEN)#隐藏空文本
             
 
-    def calling(self,e):
+    def calling_cb(self,e):
         code = e.get_code()
         if code == lv.EVENT.CLICKED:
-            _msg = e.get_target().get_child(1).get_text()
-            # print("_msg:{}".format(_msg))
-            msg_tmp = _msg.split(':')
-            msg_tmp = msg_tmp[1]
-            EventMesh.publish("save_phonename", msg_tmp)   
-
-            phone_num = self.phonebook[_msg]
-            EventMesh.publish("save_phonenum", phone_num)  
-            # phone_num_tmp = int(phone_num)
-            voiceCall.callStart(phone_num)
+            msg_text = e.get_target().get_child(1).get_text()
+            EventMesh.publish("publish_message_event_ui",{"func":self.calling,"data":msg_text})
+
+    def calling(self,msg_text):    
+        _msg = msg_text
+        print("contacts:calling_cb1:{}".format(_msg))
+        # print("_msg:{}".format(_msg))
+        msg_tmp = _msg.split(':')
+        msg_tmp = msg_tmp[1]
+        EventMesh.publish("save_phonename", msg_tmp)   
+
+        phone_num = self.phonebook[_msg]
+        EventMesh.publish("save_phonenum", phone_num)  
+        # phone_num_tmp = int(phone_num)
+        voiceCall.callStart(phone_num)
 
     def done_return(self):
         EventMesh.publish("load_screen", {"screen": "main_menu"})
@@ -2400,6 +2431,7 @@ class TemperatureScreen(Screen):
             temperature_wrist_label,temperature_wrist_degree_img ,temperature_wrist_value_label,temperature_measure_end_label,temperature_measure_countdown_label
         if temperature_screen == None:
             temperature_screen = lv.obj()
+            print("temperature_screen")
             temperature_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             temperature_bg_img = lv.img(temperature_screen)
@@ -2544,6 +2576,7 @@ class Spo2Screen(Screen):
         global spo2_screen ,spo2_label_0 ,spo2_done_img ,spo2_label ,spo2_label_1 ,spo2_line ,spo2_last_time,spo2_last_value 
         if spo2_screen == None:
             spo2_screen = lv.obj()
+            print("spo2_screen")
             spo2_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             spo2_label_0 = lv.label(spo2_screen)
@@ -2723,6 +2756,7 @@ class CountdownScreen(Screen):
             countdown_start_img,countdown_start_imgbtn,countdown_stop_img ,countdown_min 
         if countdown_screen == None :           
             countdown_screen = lv.obj()
+            print("countdown_screen")
             countdown_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             countdown_title = lv.label(countdown_screen)
@@ -3207,6 +3241,7 @@ class CountdownEndScreen(Screen):
         global countdown_end_screen ,countdown_end_img ,countdown_end_label 
         if countdown_end_screen == None:
             countdown_end_screen = lv.obj()
+            print("countdown_end_screen")
             countdown_end_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
             countdown_end_img = lv.img(countdown_end_screen)
             countdown_end_img.set_size(140, 140)
@@ -3298,6 +3333,7 @@ class StopwatchScreen(Screen):
             stopwatch_start_imgbtn, stopwatch_stop_img  
         if  stopwatch_screen == None :
             stopwatch_screen = lv.obj()
+            print("stopwatch_screen")
             stopwatch_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             stopwatch_title = lv.label(stopwatch_screen)
@@ -3583,6 +3619,7 @@ class UIFINDScreen(Screen):
         
         if FIND_screen ==None:
             FIND_screen = lv.obj()
+            print("FIND_screen")
             FIND_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
             # add style for watchface
             FIND_screen.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -3653,6 +3690,7 @@ class LowPowerScreen(Screen):
         global Lowpower_screen ,Lowpower_screen_img  
         if Lowpower_screen == None :
             Lowpower_screen = lv.obj()
+            print("Lowpower_screen")
             Lowpower_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
             # add style for watchface
             Lowpower_screen.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -3684,14 +3722,59 @@ class LowPowerScreen(Screen):
 
     def btn8_press(self):
         EventMesh.publish("load_screen", {"screen": "main_menu"})
- 
+
+system_init_screen = None
+system_init_label = None
+class SystemInitScreen(Screen):
+    #系统初始化中...
+    NAME = "system_init"
+    
+    def __init__(self):
+        super().__init__()
+        self.meta = None
+        self.system_init_timer=osTimer()
+        self.system_init_timer_count = 0
+
+    def initialization(self):
+        global system_init_screen ,system_init_label  
+        if system_init_screen == None:
+            system_init_screen = lv.obj()
+            print("Lowpower_screen")
+            system_init_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+       
+            system_init_label = lv.label(system_init_screen)
+            system_init_label.set_pos(0, 150)
+            system_init_label.set_size(240, 40)
+            system_init_label.set_text("系统初始化中")
+            system_init_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+            system_init_label.set_long_mode(lv.label.LONG.WRAP)
+            system_init_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+            self.meta = system_init_screen
+        self.system_init_timer_count = 0
+        self.system_init_timer.start(1000, 1, self.system_init_timer_cb)
+
+    def system_init_timer_cb(self, *args):
+        EventMesh.publish("system_sleep_rest")#防止黑屏
+        self.system_init_timer_count += 1
+        if system_init_screen != None:
+            system_init_label_str = "系统初始化中"
+            for i in range(self.system_init_timer_count%5):
+                system_init_label_str += "."
+            system_init_label.set_text("{:<23}".format(system_init_label_str))
+
+
+    def Close(self):
+       self.system_init_timer.stop()
+
+    
+
 #from usr.ui_WatchFaceScreen import WatchFaceScreen
 class UI(object):
     def __init__(self):
         #self.screen = WatchFaceScreen()
         #self.screen_old = self.screen
         self.ui_queue = Queue()
-        _thread.stack_size(13*1024+64)
+        _thread.stack_size(13*1024)
         _thread.start_new_thread(self.ui_queue_thread, ())
         _thread.stack_size(8*1024)
         self.screen = None
@@ -3736,7 +3819,7 @@ class UI(object):
         self.sleep_lock = 0
 
     def post_processor_after_instantiation(self):
-        EventMesh.subscribe("load_screen", self.load_screen)
+        EventMesh.subscribe("load_screen", self.load_screen_cb)
 
         EventMesh.subscribe("btn1_press", self.btn_press)
         EventMesh.subscribe("btn8_press", self.btn_press)
@@ -3776,10 +3859,9 @@ class UI(object):
         self.system_sleep_timer.start(1000, 1, self.system_sleep_timer_cb)
 
     def publish_message_event_ui(self,event,msg):
-        
         self.ui_queue.put(msg)
 
-    #ui的消息队列处理,防止内存越界,handle_message_event处理消息,返回1表示消息处理完data格式:{函数名,数据}
+    #ui的消息队列处理,防止内存越界 格式:{函数名,数据}
     def ui_queue_thread(self):
         while True:
             data = self.ui_queue.get()
@@ -3881,6 +3963,7 @@ class UI(object):
         if self.sleep_flag == 0 :
             print("__lcd_on")
             if self.sleep_lock == 1:
+                print("__lcd_on:sleep_lock:error!")
                 utime.sleep_ms(200)
             self.sleep_lock = 1
             self.sleep_flag = 1
@@ -3893,10 +3976,11 @@ class UI(object):
             EventMesh.publish("set_lcd_state",self.sleep_flag)
             tp_cst816.resume()
             lcd.lcd_display_on()
+            utime.sleep_ms(2)
             lv.autoSleep(0)
             pm.autosleep(0)
             pm.sclkEx_set(0, 1, 5)
-            utime.sleep_ms(100)
+            utime.sleep_ms(60)
             self.level = EventMesh.publish("get_brightness_level")
             if self.level == None:
                 self.level = 6 
@@ -3917,19 +4001,21 @@ class UI(object):
         if self.sleep_flag == 1 :
             print("__lcd_off")
             if self.sleep_lock == 1:
+                print("__lcd_on:sleep_lock:error!")
                 utime.sleep_ms(200)
             self.sleep_lock = 1
             self.sleep_flag = 0
             self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 0, 1)
             self.PWM_backlight.open()
             #lcd_ctrl.write(0)
-            #utime.sleep(10)
-            tp_cst816.suspend()
-            lcd.lcd_display_off()
+            #
             lv.autoSleep(1)
             pm.autosleep(1)
             pm.sclkEx_set(1, 1, 5)
-            utime.sleep_ms(100)
+            utime.sleep_ms(2)
+            tp_cst816.suspend()
+            lcd.lcd_display_off()
+            #utime.sleep_ms(80)
             EventMesh.publish("set_lcd_state",self.sleep_flag)
             self.sleep_lock = 0
             self.screen.lcd_off()
@@ -3967,10 +4053,16 @@ class UI(object):
     def get_screen_NAME(self, event, msg):
         return self.screen.NAME
     
-    def load_screen(self, topic, msg):
+    def load_screen_cb(self, topic, msg):
+        EventMesh.publish("publish_message_event_ui",{"func":self.load_screen,"data":msg})  
+
+    def load_screen(self, msg):
         print("msg1={}".format(msg))
         if self.UI_high_priority_flag == 1:#电话界面屏蔽其他界面
             return
+        if self.screen :
+            if self.screen.NAME == msg["screen"]:
+                return
         for scr in self.screen_list:
             if scr.NAME == msg["screen"]:
                 # 每次屏幕切换开始息屏倒计时
@@ -3997,7 +4089,9 @@ class UI(object):
                 self.screen_old = self.screen
                 if msg.get("meta"):
                     self.screen.meta_info = msg.get("meta")
+                print("load_screen:post_processor_before_initialization")
                 self.screen.post_processor_before_initialization()
+                print("load_screen:initialization")
                 self.screen.initialization()
                 
                 print("load_screen.load()")
index ca19a63..e45cd8f 100644 (file)
@@ -28,7 +28,7 @@ style_font_youyuan_28.set_text_color(lv.color_make(0xFF, 0xFF, 0xFF))
 style_font_youyuan_28.set_text_font(lv.font_28_dial)
 
 Watchface = lv.obj()
-
+print("Watchface")
 Watchface1 = lv.obj(Watchface)
 
 Watchface1.set_size(240,320)
@@ -244,7 +244,7 @@ class WatchFace1():
         #print("__signal_cb:{}".format(msg//8))
         if msg:
             if msg >= 0 and msg<=31 :
-                watchface1_mpsignal_img.set_src("E:/static/mpsignal{}.png".format(msg//8))
+                watchface1_mpsignal_img.set_src("E:/static/mpsignal{}.png".format(msg//8+1))
             else :
                 watchface1_mpsignal_img.set_src("E:/static/mpsignal5.png") 
 
@@ -468,7 +468,7 @@ class WatchFace2():
         #print("__signal_cb:{}".format(msg//8))
         if msg:
             if msg >= 0 and msg<=31 :
-                watchface2_mpsignal_img.set_src("E:/static/mpsignal{}.png".format(msg//8))
+                watchface2_mpsignal_img.set_src("E:/static/mpsignal{}.png".format(msg//8+1))
             else :
                 watchface2_mpsignal_img.set_src("E:/static/mpsignal5.png") 
 
index d355d12..ba3cf5a 100644 (file)
@@ -40,6 +40,7 @@ style_bar_indic.set_bg_opa(255)
 
 health_cont_y = 0
 health_screen = lv.obj()
+print("health_screen")
 health_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 health_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
index d569636..57bb8b7 100644 (file)
@@ -91,6 +91,7 @@ style_font_youyuan_font_60.set_text_color(lv.color_make(0xFF, 0xFF, 0xFF))
 style_font_youyuan_font_60.set_text_font(lv.font_60_main_menu)
 
 MainMenu2 = lv.obj()
+print("MainMenu2")
 MainMenu2_til = lv.tileview(MainMenu2)
 MainMenu2_til.set_scrollbar_mode(0)
 MainMenu2_til.add_style(style_MainMenu_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT)
index c702260..b75cee0 100644 (file)
@@ -40,6 +40,7 @@ style_bar_indic.set_bg_opa(255)
 
 setting_cont_y = 0
 setting_screen = lv.obj()
+print("setting_screen")
 setting_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 setting_imei_img = lv.img(setting_screen)
@@ -316,6 +317,7 @@ class SettingScreen(Screen):
 ##################################################################
 # -------------------------------------------language screen----------------------------------------------------------
 language_screen = lv.obj()
+print("language_screen")
 language_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 language_title = lv.label(language_screen)
@@ -348,6 +350,7 @@ language_chinese_btn_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.ST
 
 # -------------------------------------------dialswitch screen----------------------------------------------------------
 dialswitch_screen = lv.obj()
+print("dialswitch_screen")
 dialswitch_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 dialswitch_title = lv.label(dialswitch_screen)
@@ -394,6 +397,7 @@ btn2_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.KNOB)
 
 # -------------------------------------------menustyle screen----------------------------------------------------------
 menustyle_screen = lv.obj()
+print("menustyle_screen")
 menustyle_screen.center()
 menustyle_screen.set_size(240, 320)
 menustyle_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
@@ -448,6 +452,7 @@ menu_btn2_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.KNOB
 # -------------------------------------------app screen----------------------------------------------------------
 #app_screen = lv.obj()
 app_screen = lv.obj()
+print("app_screen")
 app_screen.center()
 app_screen.set_size(240, 320)
 app_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
@@ -478,6 +483,7 @@ app_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 # -------------------------------------------volume screen----------------------------------------------------------
 volume_screen = lv.obj()
+print("volume_screen")
 volume_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 volume_phone_btn = lv.btn(volume_screen)
@@ -512,6 +518,7 @@ volume_message_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DE
 
 # -------------------------------------------phonering screen----------------------------------------------------------
 phonering_screen = lv.obj()
+print("phonering_screen")
 phonering_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 phonering_title = lv.label(phonering_screen)
@@ -559,6 +566,7 @@ phonering_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 # -------------------------------------------alarmvolume screen----------------------------------------------------------
 alarmvolume_screen = lv.obj()
+print("alarmvolume_screen")
 alarmvolume_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 alarmvolume_title = lv.label(alarmvolume_screen)
@@ -608,6 +616,7 @@ alarmvolume_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 # -------------------------------------------msgvolume screen----------------------------------------------------------
 msgvolume_screen = lv.obj()
+print("msgvolume_screen")
 msgvolume_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 msgvolume_title = lv.label(msgvolume_screen)
@@ -657,6 +666,7 @@ msgvolume_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 # -------------------------------------------restore screen----------------------------------------------------------
 restore_screen = lv.obj()
+print("restore_screen")
 restore_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 restore_label = lv.label(restore_screen)
@@ -700,6 +710,7 @@ restore_cancel.add_flag(lv.obj.FLAG.CLICKABLE)
 
 # -------------------------------------------version screen----------------------------------------------------------
 version_screen = lv.obj()
+print("version_screen")
 version_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 version_msg = "Software Version:\n\
@@ -798,6 +809,7 @@ version_label9.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 # -------------------------------------------update screen----------------------------------------------------------
 update_screen = lv.obj()
+print("update_screen")
 update_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 update_title = lv.label(update_screen)
@@ -914,6 +926,7 @@ class VersionScreen(Screen):
 
 # -------------------------------------------poweroff screen----------------------------------------------------------
 poweroff_screen = lv.obj()
+print("poweroff_screen")
 poweroff_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 poweroff_img = lv.img(poweroff_screen)
@@ -986,6 +999,7 @@ class PoweroffScreen(Screen):
 
 
 poweroff_confirm_screen = lv.obj()
+print("poweroff_confirm_screen")
 poweroff_confirm_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 poweroff_confirm_label = lv.label(poweroff_confirm_screen)
@@ -1190,6 +1204,7 @@ class ThemeswitchScreen(Screen):
 
 # -------------------------------------------imei screen----------------------------------------------------------
 imei_screen = lv.obj()
+print("imei_screen")
 imei_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5)
@@ -1255,6 +1270,7 @@ class AppScreen(Screen):
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 # -------------------------------------------brightness screen----------------------------------------------------------
 brightness_screen = lv.obj()
+print("brightness_screen")
 brightness_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 
@@ -1575,6 +1591,7 @@ class MsgvolumeScreen(Screen):
 #-----------------------------------------Total--volum-------------------------------
 
 volume_adjust_screen = lv.obj()
+print("volume_adjust_screen")
 volume_adjust_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 totalvolume_title = lv.label(volume_adjust_screen)
@@ -1650,8 +1667,10 @@ class totalvolumeScreen(Screen):
         self.show_bar(1)
 
     def reduce_volum_size(self, e):
-        if self.volum_size > 0:
-            self.volum_size -= 2
+        
+        self.volum_size -= 2
+        if self.volum_size < 0:
+            self.volum_size = 0
         self.show_bar(1)
 
     def show_bar(self,msg):
index a700e21..6d26c8e 100644 (file)
@@ -53,6 +53,7 @@
 #define MICROPY_QPY_MODULE_UHASHLIB         (1)
 #define MICROPY_QPY_MODULE_UCRYPTOLIB       (1)
 #define MICROPY_QPY_MODULE_ALIPAY           (1)
+#define MICROPY_QPY_MODULE_VFS_THREADSAFE   (1)
 
 #if CONFIG_MBEDTLS
     #define MICROPY_QPY_MODULE_USSL         (0)
index 52c52aa..07d345b 100644 (file)
Binary files a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/DBG.7z and b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/DBG.7z differ
index d9f5c5a..e1e0331 100644 (file)
Binary files a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip and b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip differ
index 912992f..29cbb79 100644 (file)
Binary files a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/libHeliosAPI.lib and b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/libHeliosAPI.lib differ
index 0fc04e5..ba7beb3 100644 (file)
Binary files a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/ql_common_api.lib and b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/ql_common_api.lib differ
index 6df2076..195c12c 100644 (file)
@@ -1,7 +1,7 @@
 import sms
 import atcmd
-# resp=bytearray(50)
-# atcmd.sendSync('AT+log=52,1\r\n',resp,'',20)
+resp=bytearray(50)
+# atcmd.sendSync('AT+log=52,1\r\n',resp,'',200)
 # print("AT+log=52,1:{}".format(resp))
 
 class App(object):
@@ -62,10 +62,10 @@ if __name__ == '__main__':
     print("init4:{}".format(utime.localtime()))
     ui = _ui.UI()
     ui.post_processor_after_instantiation()
-    ui.add_screen(MainMenuScreen()) 
-    EventMesh.publish("load_screen", {"screen": "main_menu"})
+    ui.add_screen(_ui.SystemInitScreen()) 
+    EventMesh.publish("load_screen", {"screen": "system_init"})
     print("init5:{}".format(utime.localtime()))
-    
+    ui.add_screen(MainMenuScreen()) 
     ui.add_screen(_ui.PopupScreen()) 
     ui.add_screen(_ui.PhoneScreen()) 
     ui.add_screen(_ui.HeartrateScreen()) 
@@ -231,10 +231,11 @@ if __name__ == '__main__':
     print("init11.0:{}".format(utime.localtime()))   
     app.start()
     sms_data = sms.getSaveLoc()
-    sms_lacv = sms_data[0][0]
-    if sms_lacv != 'SM':#每次开机设置一下短信的存储位置
-        sms.setSaveLoc('SM', 'SM', 'SM')
+    if(sms_data != -1):
+        sms_lacv = sms_data[0][0]
+        if sms_lacv != 'SM':#每次开机设置一下短信的存储位置
+            sms.setSaveLoc('SM', 'SM', 'SM')
     print("init12:{}".format(utime.localtime()))
-    
+    EventMesh.publish("load_screen", {"screen": "main_menu"})