commit 5ab7512417c5dcbc3722f5ac0531f751eb9d5d75 Author: unknown Date: Fri Aug 11 00:29:02 2023 -0400 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b24d71e --- /dev/null +++ b/.gitignore @@ -0,0 +1,50 @@ +# These are some examples of commonly ignored file patterns. +# You should customize this list as applicable to your project. +# Learn more about .gitignore: +# https://www.atlassian.com/git/tutorials/saving-changes/gitignore + +# Node artifact files +node_modules/ +dist/ + +# Compiled Java class files +*.class + +# Compiled Python bytecode +*.py[cod] + +# Log files +*.log + +# Package files +*.jar + +# Maven +target/ +dist/ + +# JetBrains IDE +.idea/ + +# Unit test reports +TEST*.xml + +# Generated by MacOS +.DS_Store + +# Generated by Windows +Thumbs.db + +# Applications +*.app +*.exe +*.war + +# Large media files +*.mp4 +*.tiff +*.avi +*.flv +*.mov +*.wmv + diff --git a/bom.txt b/bom.txt new file mode 100644 index 0000000..907232b --- /dev/null +++ b/bom.txt @@ -0,0 +1,51 @@ +1. LILYGOŽ TTGO T-Beam V1.1 SX1262 LORA 915MHZ ESP32 WiFi Wireless Bluetooth Module GPS NEO-M8N IPEX 18650 $41.85 +https://www.aliexpress.com/item/4001287221970.html?spm=a2g0s.9042311.0.0.1f854c4dBQY7TG + +2. EVE3-35A-IPS-BLH-TPN-F128 $64.5 +https://www.matrixorbital.com/eve3-35a-ips + +3. MCP23017 $13 +https://www.aliexpress.com/item/32957655097.html?spm=a2g0s.9042311.0.0.1f854c4dBQY7TG + +4. SGY-9250 $9 +https://www.aliexpress.com/item/1904051617.html?spm=a2g0s.9042311.0.0.1f854c4dBQY7TG + +5. 76342-303LF x2 $2 or CES-103-01-G-D +https://www.newark.com/amphenol-icc/76342-303lf/connector-rcpt-6pos-2row-2-54mm/dp/62K8357 + +6. B3S-1000P x6 $2 +https://www.newark.com/omron-electronic-components/b3s-1000p/switch-tactile-spst-no-50ma-smd/dp/50B6363 + +7. MOLEX 15134-0800 $2.5 +https://www.newark.com/molex/15134-0800/cable-assy-8pos-rcpt-rcpt-2/dp/33AC8053 + +8. MOLEX 53048-0810 $1 +https://www.newark.com/molex/53048-0810/connector-header-8pos-1row-1-25mm/dp/98K9836 + +9. SPC20493 or XG8T-0631 x2 $1 +https://www.newark.com/multicomp/spc20493/board-board-connector-header-6way/dp/93K5746 +https://www.newark.com/omron-electronic-components/xg8t-0631/connector-header-6-position-2row/dp/05M2064 + +10. S2B-PH-SM4-TB(LF)(SN) $0.8 +https://www.newark.com/jst-japan-solderless-terminals/s2b-ph-sm4-tb-lf-sn/wire-to-board-connector-header/dp/38K8067 + +11. GM5539 5mm $0.5 +https://www.amazon.com/gp/product/B01N7V536K/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1 + +12. Optional DWM1000 $21 +https://www.mouser.com/ProductDetail/772-DWM1000/ + +13. 10mmx2mm Mini Tiny Vibration Motors 10000rpm Flat Coin Button-Type Micro DC Vibrating Motor $1 +https://www.amazon.com/gp/product/B073YFR5WR/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1 + +14. HTSW-150-06-G-S +https://www.digikey.com/en/products/detail/samtec-inc/HTSW-150-06-G-S/8085307 + +15. Adafruit NPN Bipolar Transistors (PN2222) +https://www.amazon.com/gp/product/B00XW2OK7M/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1 + +case+hw $10 +glass $3 +pcb $3 + +$133/153 \ No newline at end of file diff --git a/compiler_script.py b/compiler_script.py new file mode 100644 index 0000000..1b872a7 --- /dev/null +++ b/compiler_script.py @@ -0,0 +1,6 @@ +Import("env") + +env.Replace( + AR="xtensa-esp32-elf-gcc-ar", + RANLIB="xtensa-esp32-elf-gcc-ranlib", +) \ No newline at end of file diff --git a/data/at.png b/data/at.png new file mode 100644 index 0000000..e2120d9 Binary files /dev/null and b/data/at.png differ diff --git a/data/gps.png b/data/gps.png new file mode 100644 index 0000000..32fd7f0 Binary files /dev/null and b/data/gps.png differ diff --git a/fonts/calibri_14/L1/calibri_14_L1.c b/fonts/calibri_14/L1/calibri_14_L1.c new file mode 100644 index 0000000..70c203e --- /dev/null +++ b/fonts/calibri_14/L1/calibri_14_L1.c @@ -0,0 +1,28 @@ +/* +This file is automatically generated +calibri_14_L1 +C Source +*/ + +#include "App_Common.h" + +#define FONT_HANDLE (1) +#define FONT_FILE_ADDRESS (RAM_G + 153600) +#define FIRST_CHARACTER (32) + +void Load_Font() +{ + Gpu_CoCmd_Dlstart(phost); + App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1)); + App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255)); + Gpu_Hal_LoadImageToMemory(phost, "path\\to\\calibri_14_L1.raw", FONT_FILE_ADDRESS, LOAD); + + Gpu_CoCmd_SetFont2(phost, FONT_HANDLE, FONT_FILE_ADDRESS, FIRST_CHARACTER); + Gpu_CoCmd_Text(phost, 0, 0, FONT_HANDLE, 0, "AaBbCcDdEeFf"); + App_WrCoCmd_Buffer(phost, DISPLAY()); + Gpu_CoCmd_Swap(phost); + App_Flush_Co_Buffer(phost); + Gpu_Hal_WaitCmdfifo_empty(phost); +} + +/* end of file */ diff --git a/fonts/calibri_14/L1/calibri_14_L1.json b/fonts/calibri_14/L1/calibri_14_L1.json new file mode 100644 index 0000000..e3072e4 --- /dev/null +++ b/fonts/calibri_14/L1/calibri_14_L1.json @@ -0,0 +1 @@ +{"name": "calibri_14_L1", "type": "legacyfont", "format": "L1", "size": 14, "base_line": 11, "caps_height": 9, "mid_line": 7} \ No newline at end of file diff --git a/fonts/calibri_14/L1/calibri_14_L1.raw b/fonts/calibri_14/L1/calibri_14_L1.raw new file mode 100644 index 0000000..9ea77e2 Binary files /dev/null and b/fonts/calibri_14/L1/calibri_14_L1.raw differ diff --git a/fonts/calibri_14/L1/calibri_14_L1.rawh b/fonts/calibri_14/L1/calibri_14_L1.rawh new file mode 100644 index 0000000..c9156c7 --- /dev/null +++ b/fonts/calibri_14/L1/calibri_14_L1.rawh @@ -0,0 +1,110 @@ +/*Command Line: fnt_cvt.exe -f legacy -C BT81X -i Q:/fonts/calibri.ttf -s 14 -d 153600 -c setfont2 -l 32 -a -o D:/Projects/Embedded/AirsoftTracker/fonts*/ + +/*95 characters have been converted */ + +/* 148 Metric Block Begin +++ */ +/*('file properties ', 'format ', 'L1', ' stride ', 2, ' width ', 14, 'height', 14)*/ +{ +/* Widths */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,6,7,7,10,10,3,4,4,7,7,4,4,4,6,7,7,7,7,7,7,7,7,7,7,4,4,7,7,7,6,13,8,8,8,9,7,6,9,9,4,4,7,6,12,9,9,7,10,8,6,7,9,8,13,7,7,7,4,6,4,7,8,4,7,7,6,7,7,5,7,7,3,4,7,3,11,7,7,7,7,5,5,5,7,7,10,6,7,6,4,6,5,7,0, +/* Format */ +1,0,0,0, +/* Stride */ +2,0,0,0, +/* Max Width */ +14,0,0,0, +/* Max Height */ +14,0,0,0, +/* Raw Data Address in Decimal: <153748> */ +148,88,2,0, + +/* 148 Metric Block End --- */ + +/*Bitmap Raw Data begin +++*/ +/*The expected raw bitmap size is 2660 Bytes */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0, +64,0,64,0,64,0,64,0,64,0,64,0,0,0,64,0,64,0,0,0,0,0,0,0,0,0,88,0,80,0,80,0, +64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,0,36,0,126,0,36,0, +72,0,252,0,72,0,72,0,72,0,0,0,0,0,0,0,0,0,16,0,56,0,68,0,64,0,96,0,56,0,4,0, +4,0,68,0,120,0,32,0,32,0,0,0,0,0,0,0,113,0,81,0,18,0,84,0,123,128,10,128,18,0,34,128, +35,128,0,0,0,0,0,0,0,0,60,0,36,0,36,0,44,0,56,0,57,0,77,0,71,0,103,0,61,128,0,0, +0,0,0,0,0,0,64,0,64,0,64,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,32,0,32,0,32,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,32,0,32,0,32,0,0,0,64,0, +64,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,64,0,64,0,0,0,32,0,248,0,112,0, +248,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0, +16,0,124,0,16,0,16,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,64,0,64,0,64,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,128,0,0,0, +0,0,0,0,0,0,8,0,8,0,24,0,16,0,16,0,32,0,32,0,32,0,64,0,64,0,192,0,128,0,0,0, +0,0,0,0,56,0,68,0,68,0,70,0,70,0,70,0,68,0,68,0,56,0,0,0,0,0,0,0,0,0,0,0, +32,0,224,0,32,0,32,0,32,0,32,0,32,0,32,0,248,0,0,0,0,0,0,0,0,0,0,0,56,0,76,0, +4,0,12,0,8,0,24,0,48,0,96,0,124,0,0,0,0,0,0,0,0,0,0,0,56,0,76,0,4,0,8,0, +56,0,12,0,4,0,76,0,120,0,0,0,0,0,0,0,0,0,0,0,8,0,24,0,40,0,40,0,72,0,72,0, +254,0,8,0,8,0,0,0,0,0,0,0,0,0,0,0,124,0,64,0,64,0,120,0,12,0,4,0,4,0,76,0, +120,0,0,0,0,0,0,0,0,0,0,0,28,0,32,0,64,0,124,0,68,0,70,0,68,0,100,0,56,0,0,0, +0,0,0,0,0,0,0,0,124,0,4,0,4,0,8,0,8,0,16,0,16,0,48,0,32,0,0,0,0,0,0,0, +0,0,0,0,56,0,68,0,68,0,108,0,56,0,68,0,68,0,68,0,56,0,0,0,0,0,0,0,0,0,0,0, +56,0,68,0,68,0,68,0,124,0,4,0,4,0,12,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +192,0,192,0,0,0,0,0,0,0,192,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0, +96,0,0,0,0,0,96,0,96,0,64,0,64,0,0,0,0,0,0,0,0,0,4,0,24,0,96,0,192,0,96,0, +24,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,0,0,0,0,124,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,48,0,12,0,12,0,48,0,64,0,0,0,0,0, +0,0,0,0,0,0,120,0,76,0,4,0,12,0,56,0,32,0,32,0,0,0,48,0,48,0,0,0,0,0,0,0, +0,0,0,0,15,0,48,192,64,64,79,64,146,64,146,64,146,64,159,128,192,0,96,0,62,0,0,0,0,0,0,0, +24,0,24,0,60,0,36,0,36,0,102,0,126,0,66,0,195,0,0,0,0,0,0,0,0,0,0,0,240,0,136,0, +136,0,136,0,248,0,140,0,132,0,140,0,248,0,0,0,0,0,0,0,0,0,0,0,28,0,34,0,64,0,64,0, +64,0,64,0,64,0,98,0,60,0,0,0,0,0,0,0,0,0,0,0,248,0,140,0,134,0,130,0,130,0,130,0, +134,0,140,0,248,0,0,0,0,0,0,0,0,0,0,0,248,0,128,0,128,0,128,0,248,0,128,0,128,0,128,0, +248,0,0,0,0,0,0,0,0,0,0,0,248,0,128,0,128,0,128,0,248,0,128,0,128,0,128,0,128,0,0,0, +0,0,0,0,0,0,0,0,30,0,33,0,64,0,64,0,79,0,65,0,65,0,35,0,30,0,0,0,0,0,0,0, +0,0,0,0,134,0,134,0,134,0,134,0,254,0,134,0,134,0,134,0,134,0,0,0,0,0,0,0,0,0,0,0, +128,0,128,0,128,0,128,0,128,0,128,0,128,0,128,0,128,0,0,0,0,0,0,0,0,0,0,0,32,0,32,0, +32,0,32,0,32,0,32,0,32,0,32,0,224,0,0,0,0,0,0,0,0,0,0,0,140,0,152,0,144,0,224,0, +224,0,176,0,144,0,136,0,140,0,0,0,0,0,0,0,0,0,0,0,128,0,128,0,128,0,128,0,128,0,128,0, +128,0,128,0,248,0,0,0,0,0,0,0,0,0,0,0,192,192,225,192,161,64,161,64,146,64,146,64,156,64,140,64, +140,64,0,0,0,0,0,0,0,0,0,0,194,0,226,0,162,0,178,0,146,0,154,0,142,0,134,0,134,0,0,0, +0,0,0,0,0,0,0,0,30,0,35,0,65,0,65,0,65,128,65,0,65,0,99,0,30,0,0,0,0,0,0,0, +0,0,0,0,240,0,136,0,140,0,136,0,136,0,240,0,128,0,128,0,128,0,0,0,0,0,0,0,0,0,0,0, +30,0,35,0,65,0,65,0,65,128,65,0,65,0,99,0,63,0,0,192,0,0,0,0,0,0,0,0,248,0,136,0, +140,0,136,0,240,0,152,0,136,0,140,0,132,0,0,0,0,0,0,0,0,0,0,0,56,0,64,0,64,0,96,0, +56,0,12,0,4,0,12,0,120,0,0,0,0,0,0,0,0,0,0,0,254,0,16,0,16,0,16,0,16,0,16,0, +16,0,16,0,16,0,0,0,0,0,0,0,0,0,0,0,130,0,130,0,130,0,130,0,130,0,130,0,134,0,68,0, +56,0,0,0,0,0,0,0,0,0,0,0,195,0,66,0,66,0,102,0,36,0,36,0,60,0,24,0,24,0,0,0, +0,0,0,0,0,0,0,0,66,16,70,16,70,32,101,32,41,32,41,96,41,192,56,192,16,192,0,0,0,0,0,0, +0,0,0,0,70,0,100,0,44,0,56,0,24,0,56,0,44,0,68,0,70,0,0,0,0,0,0,0,0,0,0,0, +196,0,68,0,104,0,40,0,48,0,16,0,16,0,16,0,16,0,0,0,0,0,0,0,0,0,0,0,124,0,12,0, +8,0,24,0,16,0,32,0,96,0,64,0,252,0,0,0,0,0,0,0,0,0,224,0,128,0,128,0,128,0,128,0, +128,0,128,0,128,0,128,0,128,0,128,0,224,0,0,0,0,0,128,0,64,0,64,0,64,0,32,0,32,0,32,0, +16,0,16,0,24,0,8,0,8,0,0,0,0,0,96,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0, +32,0,32,0,96,0,0,0,0,0,0,0,16,0,56,0,40,0,76,0,68,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0, +0,0,64,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,56,0,76,0,4,0,60,0,68,0,76,0,124,0,0,0,0,0,0,0,0,0,128,0,128,0,128,0, +184,0,200,0,140,0,140,0,140,0,200,0,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,64,0, +64,0,64,0,64,0,64,0,56,0,0,0,0,0,0,0,0,0,4,0,4,0,4,0,60,0,76,0,68,0,68,0, +68,0,76,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,68,0,68,0,124,0,64,0,64,0, +60,0,0,0,0,0,0,0,0,0,48,0,96,0,64,0,240,0,64,0,64,0,64,0,64,0,64,0,64,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,60,0,72,0,72,0,72,0,120,0,64,0,120,0,68,0,196,0,120,0, +0,0,128,0,128,0,128,0,176,0,200,0,136,0,136,0,136,0,136,0,136,0,0,0,0,0,0,0,0,0,0,0, +64,0,0,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0, +32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,96,0,0,0,128,0,128,0,128,0,152,0,176,0, +224,0,224,0,176,0,144,0,136,0,0,0,0,0,0,0,0,0,128,0,128,0,128,0,128,0,128,0,128,0,128,0, +128,0,128,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,179,0,204,128,136,128,136,128,136,128,136,128, +136,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,0,200,0,136,0,136,0,136,0,136,0,136,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,56,0,100,0,70,0,66,0,70,0,68,0,56,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,184,0,200,0,140,0,140,0,140,0,200,0,240,0,128,0,128,0,128,0,0,0,0,0, +0,0,0,0,60,0,76,0,68,0,68,0,68,0,76,0,60,0,4,0,4,0,4,0,0,0,0,0,0,0,0,0, +176,0,192,0,128,0,128,0,128,0,128,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,64,0, +64,0,48,0,24,0,8,0,112,0,0,0,0,0,0,0,0,0,0,0,64,0,64,0,240,0,64,0,64,0,64,0, +64,0,96,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,0,136,0,136,0,136,0,136,0,216,0, +120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,0,68,0,72,0,72,0,40,0,48,0,48,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,204,192,76,128,76,128,76,128,51,0,51,0,51,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,72,0,72,0,48,0,48,0,48,0,72,0,204,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,196,0,68,0,72,0,104,0,40,0,48,0,48,0,16,0,32,0,32,0,0,0,0,0,0,0,0,0, +120,0,16,0,16,0,32,0,32,0,64,0,120,0,0,0,0,0,0,0,0,0,48,0,32,0,32,0,32,0,32,0, +64,0,96,0,32,0,32,0,32,0,32,0,48,0,0,0,0,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0, +64,0,64,0,64,0,64,0,64,0,64,0,0,0,96,0,32,0,32,0,32,0,32,0,16,0,32,0,32,0,32,0, +32,0,32,0,64,0,0,0,0,0,0,0,0,0,98,0,84,0,140,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0, +/*Bitmap Raw Data end ---*/ +} diff --git a/fonts/calibri_14/L1/calibri_14_L1.rtf b/fonts/calibri_14/L1/calibri_14_L1.rtf new file mode 100644 index 0000000..92f501e --- /dev/null +++ b/fonts/calibri_14/L1/calibri_14_L1.rtf @@ -0,0 +1,98 @@ +95 characters are converted + +Character Index No. + 32 + ! 33 + " 34 + # 35 + $ 36 + % 37 + & 38 + ' 39 + ( 40 + ) 41 + * 42 + + 43 + , 44 + - 45 + . 46 + / 47 + 0 48 + 1 49 + 2 50 + 3 51 + 4 52 + 5 53 + 6 54 + 7 55 + 8 56 + 9 57 + : 58 + ; 59 + < 60 + = 61 + > 62 + ? 63 + @ 64 + A 65 + B 66 + C 67 + D 68 + E 69 + F 70 + G 71 + H 72 + I 73 + J 74 + K 75 + L 76 + M 77 + N 78 + O 79 + P 80 + Q 81 + R 82 + S 83 + T 84 + U 85 + V 86 + W 87 + X 88 + Y 89 + Z 90 + [ 91 + \ 92 + ] 93 + ^ 94 + _ 95 + ` 96 + a 97 + b 98 + c 99 + d 100 + e 101 + f 102 + g 103 + h 104 + i 105 + j 106 + k 107 + l 108 + m 109 + n 110 + o 111 + p 112 + q 113 + r 114 + s 115 + t 116 + u 117 + v 118 + w 119 + x 120 + y 121 + z 122 + { 123 + | 124 + } 125 + ~ 126 diff --git a/fonts/calibri_14/L2/calibri_14_L2.c b/fonts/calibri_14/L2/calibri_14_L2.c new file mode 100644 index 0000000..4b0ad8f --- /dev/null +++ b/fonts/calibri_14/L2/calibri_14_L2.c @@ -0,0 +1,28 @@ +/* +This file is automatically generated +calibri_14_L2 +C Source +*/ + +#include "App_Common.h" + +#define FONT_HANDLE (1) +#define FONT_FILE_ADDRESS (RAM_G + 153600) +#define FIRST_CHARACTER (32) + +void Load_Font() +{ + Gpu_CoCmd_Dlstart(phost); + App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1)); + App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255)); + Gpu_Hal_LoadImageToMemory(phost, "path\\to\\calibri_14_L2.raw", FONT_FILE_ADDRESS, LOAD); + + Gpu_CoCmd_SetFont2(phost, FONT_HANDLE, FONT_FILE_ADDRESS, FIRST_CHARACTER); + Gpu_CoCmd_Text(phost, 0, 0, FONT_HANDLE, 0, "AaBbCcDdEeFf"); + App_WrCoCmd_Buffer(phost, DISPLAY()); + Gpu_CoCmd_Swap(phost); + App_Flush_Co_Buffer(phost); + Gpu_Hal_WaitCmdfifo_empty(phost); +} + +/* end of file */ diff --git a/fonts/calibri_14/L2/calibri_14_L2.json b/fonts/calibri_14/L2/calibri_14_L2.json new file mode 100644 index 0000000..9b2798c --- /dev/null +++ b/fonts/calibri_14/L2/calibri_14_L2.json @@ -0,0 +1 @@ +{"name": "calibri_14_L2", "type": "legacyfont", "format": "L2", "size": 14, "base_line": 11, "caps_height": 9, "mid_line": 7} \ No newline at end of file diff --git a/fonts/calibri_14/L2/calibri_14_L2.raw b/fonts/calibri_14/L2/calibri_14_L2.raw new file mode 100644 index 0000000..5962856 Binary files /dev/null and b/fonts/calibri_14/L2/calibri_14_L2.raw differ diff --git a/fonts/calibri_14/L2/calibri_14_L2.rawh b/fonts/calibri_14/L2/calibri_14_L2.rawh new file mode 100644 index 0000000..136b663 --- /dev/null +++ b/fonts/calibri_14/L2/calibri_14_L2.rawh @@ -0,0 +1,193 @@ +/*Command Line: fnt_cvt.exe -f legacy -C BT81X -i Q:/fonts/calibri.ttf -s 14 -d 153600 -c setfont2 -l 32 -a -o D:/Projects/Embedded/AirsoftTracker/fonts*/ + +/*95 characters have been converted */ + +/* 148 Metric Block Begin +++ */ +/*('file properties ', 'format ', 'L2', ' stride ', 4, ' width ', 14, 'height', 14)*/ +{ +/* Widths */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,6,7,7,10,10,3,4,4,7,7,4,4,4,6,7,7,7,7,7,7,7,7,7,7,4,4,7,7,7,6,13,8,8,8,9,7,6,9,9,4,4,7,6,12,9,9,7,10,8,6,7,9,8,13,7,7,7,4,6,4,7,8,4,7,7,6,7,7,5,7,7,3,4,7,3,11,7,7,7,7,5,5,5,7,7,10,6,7,6,4,6,5,7,0, +/* Format */ +17,0,0,0, +/* Stride */ +4,0,0,0, +/* Max Width */ +14,0,0,0, +/* Max Height */ +14,0,0,0, +/* Raw Data Address in Decimal: <153748> */ +148,88,2,0, + +/* 148 Metric Block End --- */ + +/*Bitmap Raw Data begin +++*/ +/*The expected raw bitmap size is 5320 Bytes */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0, +48,0,0,0,48,0,0,0,48,0,0,0,48,0,0,0,48,0,0,0,48,0,0,0,0,0,0,0,48,0,0,0, +48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,128,0,0,50,64,0,0,50,64,0,0, +49,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,48,0,0,12,96,0,0,127,248,0,0,24,96,0,0, +36,144,0,0,191,244,0,0,36,192,0,0,48,192,0,0,48,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,64,0,0,2,64,0,0,27,208,0,0,52,96,0,0,48,0,0,0,41,0,0,0,11,208,0,0,0,112,0,0, +0,52,0,0,96,112,0,0,47,144,0,0,9,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +46,2,64,0,99,6,0,0,82,76,0,0,99,36,0,0,46,155,128,0,1,140,144,0,3,24,80,0,9,12,144,0, +24,11,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,224,0,0,28,52,0,0,24,36,0,0, +13,160,0,0,11,128,0,0,30,131,0,0,52,163,0,0,112,62,0,0,56,46,0,0,27,226,192,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,48,0,0,0,48,0,0,0,48,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,9,0,0,0,12,0,0,0,24,0,0,0,36,0,0,0,52,0,0,0,48,0,0,0,48,0,0,0, +48,0,0,0,52,0,0,0,36,0,0,0,24,0,0,0,12,0,0,0,9,0,0,0,0,0,0,0,48,0,0,0, +36,0,0,0,24,0,0,0,28,0,0,0,12,0,0,0,13,0,0,0,13,0,0,0,13,0,0,0,13,0,0,0, +28,0,0,0,24,0,0,0,36,0,0,0,48,0,0,0,0,0,0,0,12,0,0,0,170,128,0,0,46,0,0,0, +170,128,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, +3,0,0,0,127,244,0,0,3,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,36,0,0,0,36,0,0,0,48,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,0,0,0,208,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,208,0,0,1,192,0,0,2,128,0,0,3,0,0,0,6,0,0,0, +9,0,0,0,12,0,0,0,24,0,0,0,36,0,0,0,112,0,0,0,160,0,0,0,208,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,27,208,0,0,52,112,0,0,112,36,0,0,96,40,0,0,96,40,0,0,96,40,0,0, +112,36,0,0,52,112,0,0,31,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +29,0,0,0,169,0,0,0,73,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0, +191,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,128,0,0,32,160,0,0, +0,112,0,0,0,160,0,0,0,208,0,0,2,128,0,0,10,0,0,0,40,0,0,0,127,244,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,128,0,0,32,160,0,0,0,96,0,0,1,208,0,0, +31,128,0,0,0,176,0,0,0,52,0,0,96,176,0,0,47,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,208,0,0,3,144,0,0,9,144,0,0,28,144,0,0,36,144,0,0,96,144,0,0, +191,248,0,0,0,144,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +47,224,0,0,52,0,0,0,52,0,0,0,63,144,0,0,0,176,0,0,0,52,0,0,0,48,0,0,96,160,0,0, +47,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,224,0,0,25,16,0,0, +48,0,0,0,59,224,0,0,116,116,0,0,112,40,0,0,48,36,0,0,56,112,0,0,27,208,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,244,0,0,0,52,0,0,0,96,0,0,0,208,0,0, +1,192,0,0,2,64,0,0,7,0,0,0,10,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,27,208,0,0,52,112,0,0,48,48,0,0,41,160,0,0,11,192,0,0,52,112,0,0, +96,36,0,0,116,116,0,0,31,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +27,144,0,0,52,112,0,0,96,52,0,0,116,116,0,0,47,180,0,0,0,52,0,0,0,112,0,0,17,224,0,0, +63,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +160,0,0,0,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,0,0,0,160,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0,0,0, +40,0,0,0,0,0,0,0,0,0,0,0,40,0,0,0,40,0,0,0,48,0,0,0,96,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,100,0,0,2,208,0,0,45,0,0,0,176,0,0,0,45,0,0,0, +2,208,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,127,244,0,0,0,0,0,0,0,0,0,0,127,244,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +100,0,0,0,26,64,0,0,0,164,0,0,1,180,0,0,26,64,0,0,100,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,47,128,0,0,32,160,0,0,0,96,0,0,0,160,0,0,11,128,0,0, +9,0,0,0,9,0,0,0,0,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,190,64,0,14,65,160,0,36,0,48,0,97,250,36,0,147,73,36,0,150,9,48,0, +150,28,96,0,147,235,128,0,160,0,0,0,57,0,0,0,11,253,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,192,0,0,6,208,0,0,10,160,0,0,13,112,0,0,28,52,0,0,40,40,0,0,63,252,0,0,112,13,0,0, +160,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,64,0,0,145,208,0,0, +144,144,0,0,145,192,0,0,191,128,0,0,144,160,0,0,144,112,0,0,144,160,0,0,191,128,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,228,0,0,29,24,0,0,52,0,0,0,112,0,0,0, +112,0,0,0,112,0,0,0,52,0,0,0,45,24,0,0,11,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,191,144,0,0,144,176,0,0,144,40,0,0,144,28,0,0,144,28,0,0,144,28,0,0, +144,40,0,0,144,176,0,0,191,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +191,192,0,0,144,0,0,0,144,0,0,0,144,0,0,0,191,128,0,0,144,0,0,0,144,0,0,0,144,0,0,0, +191,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,128,0,0,144,0,0,0, +144,0,0,0,144,0,0,0,191,128,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,249,0,0,29,6,0,0,52,0,0,0,112,0,0,0, +112,190,0,0,112,6,0,0,52,6,0,0,29,10,0,0,6,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,144,40,0,0,144,40,0,0,144,40,0,0,144,40,0,0,191,248,0,0,144,40,0,0, +144,40,0,0,144,40,0,0,144,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0, +144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,13,0,0,0, +13,0,0,0,13,0,0,0,13,0,0,0,13,0,0,0,13,0,0,0,13,0,0,0,248,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,160,0,0,146,128,0,0,151,0,0,0,173,0,0,0, +172,0,0,0,154,0,0,0,147,64,0,0,145,192,0,0,144,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0, +144,0,0,0,144,0,0,0,191,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +180,1,224,0,168,2,160,0,156,3,96,0,153,6,96,0,151,13,96,0,147,88,96,0,146,164,96,0,144,240,96,0, +144,160,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,28,0,0,184,28,0,0, +157,28,0,0,154,28,0,0,147,92,0,0,146,156,0,0,144,236,0,0,144,124,0,0,144,40,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,248,0,0,29,10,0,0,52,3,64,0,112,2,64,0, +112,2,128,0,112,2,64,0,52,3,64,0,45,10,0,0,7,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,191,64,0,0,145,208,0,0,144,160,0,0,144,144,0,0,145,208,0,0,190,64,0,0, +144,0,0,0,144,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +6,248,0,0,29,10,0,0,52,3,64,0,112,2,64,0,112,2,128,0,112,2,64,0,52,3,64,0,45,10,0,0, +11,251,64,0,0,1,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,128,0,0,145,208,0,0, +144,160,0,0,145,208,0,0,191,64,0,0,146,128,0,0,144,208,0,0,144,160,0,0,144,112,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,128,0,0,52,80,0,0,112,0,0,0,57,0,0,0, +11,128,0,0,0,160,0,0,0,112,0,0,80,160,0,0,47,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,255,248,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0, +7,0,0,0,7,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +144,24,0,0,208,24,0,0,208,24,0,0,208,24,0,0,208,24,0,0,208,24,0,0,144,40,0,0,116,116,0,0, +31,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,10,0,0,112,13,0,0, +52,28,0,0,40,40,0,0,28,52,0,0,13,112,0,0,10,160,0,0,7,208,0,0,3,128,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,28,7,0,112,45,6,0,52,57,9,0,40,102,12,0, +24,147,28,0,12,147,104,0,9,194,164,0,11,129,240,0,7,64,224,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,112,40,0,0,40,112,0,0,28,160,0,0,10,192,0,0,7,128,0,0,10,192,0,0, +28,160,0,0,52,52,0,0,96,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +160,36,0,0,112,112,0,0,40,144,0,0,29,192,0,0,11,64,0,0,7,0,0,0,7,0,0,0,7,0,0,0, +7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,240,0,0,0,160,0,0, +1,208,0,0,2,128,0,0,7,0,0,0,13,0,0,0,40,0,0,0,112,0,0,0,191,244,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,184,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0, +144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,184,0,0,0,0,0,0,0, +0,0,0,0,144,0,0,0,96,0,0,0,48,0,0,0,36,0,0,0,24,0,0,0,12,0,0,0,9,0,0,0, +7,0,0,0,3,64,0,0,2,128,0,0,1,192,0,0,0,208,0,0,0,0,0,0,0,0,0,0,124,0,0,0, +12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0, +12,0,0,0,12,0,0,0,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,64,0,0,10,128,0,0, +24,208,0,0,36,160,0,0,48,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,255,0,0, +0,0,0,0,36,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,27,128,0,0,36,160,0,0,0,96,0,0,31,224,0,0,116,96,0,0,112,160,0,0, +47,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,208,0,0,0,208,0,0,0, +223,128,0,0,225,208,0,0,208,160,0,0,208,160,0,0,208,160,0,0,225,208,0,0,223,64,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,128,0,0,52,80,0,0, +112,0,0,0,96,0,0,0,112,0,0,0,52,80,0,0,31,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,36,0,0,0,36,0,0,0,36,0,0,27,180,0,0,52,180,0,0,112,36,0,0,112,36,0,0, +112,52,0,0,52,180,0,0,31,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,11,144,0,0,52,112,0,0,112,52,0,0,127,244,0,0,112,0,0,0,52,0,0,0, +27,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,64,0,0,40,0,0,0,36,0,0,0, +191,0,0,0,36,0,0,0,36,0,0,0,36,0,0,0,36,0,0,0,36,0,0,0,36,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,240,0,0,52,208,0,0, +112,144,0,0,52,208,0,0,63,128,0,0,96,0,0,0,63,208,0,0,96,112,0,0,160,112,0,0,47,144,0,0, +0,0,0,0,192,0,0,0,208,0,0,0,208,0,0,0,223,64,0,0,225,192,0,0,208,208,0,0,208,144,0,0, +208,144,0,0,208,144,0,0,192,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0, +52,0,0,0,0,0,0,0,48,0,0,0,52,0,0,0,52,0,0,0,52,0,0,0,52,0,0,0,52,0,0,0, +48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0, +9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,13,0,0,0, +12,0,0,0,120,0,0,0,0,0,0,0,192,0,0,0,208,0,0,0,208,0,0,0,210,128,0,0,218,0,0,0, +232,0,0,0,232,0,0,0,218,0,0,0,215,64,0,0,193,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,192,0,0,0,208,0,0,0,208,0,0,0,208,0,0,0,208,0,0,0,208,0,0,0,208,0,0,0, +208,0,0,0,208,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,223,95,64,0,225,225,192,0,208,208,192,0,208,208,208,0,208,208,208,0,208,208,208,0, +192,192,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +223,64,0,0,225,192,0,0,208,208,0,0,208,144,0,0,208,144,0,0,208,144,0,0,192,144,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,208,0,0,56,116,0,0, +112,40,0,0,96,24,0,0,112,40,0,0,52,116,0,0,27,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,128,0,0,225,208,0,0,208,160,0,0,208,160,0,0, +208,160,0,0,225,208,0,0,239,64,0,0,208,0,0,0,208,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,27,164,0,0,52,180,0,0,112,36,0,0,112,36,0,0,112,52,0,0,52,180,0,0, +31,164,0,0,0,36,0,0,0,36,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +222,0,0,0,224,0,0,0,208,0,0,0,208,0,0,0,208,0,0,0,208,0,0,0,192,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,128,0,0,112,0,0,0, +52,0,0,0,30,64,0,0,2,128,0,0,1,128,0,0,126,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,36,0,0,0,36,0,0,0,191,64,0,0,36,0,0,0,36,0,0,0,36,0,0,0, +36,0,0,0,40,0,0,0,31,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,192,144,0,0,192,144,0,0,192,144,0,0,192,144,0,0,208,144,0,0,162,208,0,0, +126,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +160,48,0,0,112,96,0,0,48,144,0,0,36,192,0,0,25,128,0,0,15,64,0,0,11,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,160,160,0,112,240,144,0, +48,176,192,0,37,165,128,0,26,90,64,0,14,14,0,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,144,0,0,53,192,0,0,31,64,0,0,15,0,0,0, +26,64,0,0,53,192,0,0,160,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,160,48,0,0,112,96,0,0,52,144,0,0,40,192,0,0,29,128,0,0,15,64,0,0, +11,0,0,0,6,0,0,0,9,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +127,128,0,0,2,64,0,0,7,0,0,0,13,0,0,0,24,0,0,0,48,0,0,0,127,192,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,12,0,0,0,28,0,0,0,24,0,0,0,24,0,0,0, +112,0,0,0,40,0,0,0,24,0,0,0,28,0,0,0,28,0,0,0,12,0,0,0,11,0,0,0,0,0,0,0, +0,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0, +96,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0,0,0,0,0,56,0,0,0, +28,0,0,0,12,0,0,0,12,0,0,0,13,0,0,0,7,0,0,0,9,0,0,0,12,0,0,0,12,0,0,0, +12,0,0,0,28,0,0,0,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,24,0,0, +103,36,0,0,145,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +/*Bitmap Raw Data end ---*/ +} diff --git a/fonts/calibri_14/L2/calibri_14_L2.rtf b/fonts/calibri_14/L2/calibri_14_L2.rtf new file mode 100644 index 0000000..92f501e --- /dev/null +++ b/fonts/calibri_14/L2/calibri_14_L2.rtf @@ -0,0 +1,98 @@ +95 characters are converted + +Character Index No. + 32 + ! 33 + " 34 + # 35 + $ 36 + % 37 + & 38 + ' 39 + ( 40 + ) 41 + * 42 + + 43 + , 44 + - 45 + . 46 + / 47 + 0 48 + 1 49 + 2 50 + 3 51 + 4 52 + 5 53 + 6 54 + 7 55 + 8 56 + 9 57 + : 58 + ; 59 + < 60 + = 61 + > 62 + ? 63 + @ 64 + A 65 + B 66 + C 67 + D 68 + E 69 + F 70 + G 71 + H 72 + I 73 + J 74 + K 75 + L 76 + M 77 + N 78 + O 79 + P 80 + Q 81 + R 82 + S 83 + T 84 + U 85 + V 86 + W 87 + X 88 + Y 89 + Z 90 + [ 91 + \ 92 + ] 93 + ^ 94 + _ 95 + ` 96 + a 97 + b 98 + c 99 + d 100 + e 101 + f 102 + g 103 + h 104 + i 105 + j 106 + k 107 + l 108 + m 109 + n 110 + o 111 + p 112 + q 113 + r 114 + s 115 + t 116 + u 117 + v 118 + w 119 + x 120 + y 121 + z 122 + { 123 + | 124 + } 125 + ~ 126 diff --git a/fonts/calibri_14/L4/calibri_14_L4.c b/fonts/calibri_14/L4/calibri_14_L4.c new file mode 100644 index 0000000..bf5a6d2 --- /dev/null +++ b/fonts/calibri_14/L4/calibri_14_L4.c @@ -0,0 +1,28 @@ +/* +This file is automatically generated +calibri_14_L4 +C Source +*/ + +#include "App_Common.h" + +#define FONT_HANDLE (1) +#define FONT_FILE_ADDRESS (RAM_G + 153600) +#define FIRST_CHARACTER (32) + +void Load_Font() +{ + Gpu_CoCmd_Dlstart(phost); + App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1)); + App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255)); + Gpu_Hal_LoadImageToMemory(phost, "path\\to\\calibri_14_L4.raw", FONT_FILE_ADDRESS, LOAD); + + Gpu_CoCmd_SetFont2(phost, FONT_HANDLE, FONT_FILE_ADDRESS, FIRST_CHARACTER); + Gpu_CoCmd_Text(phost, 0, 0, FONT_HANDLE, 0, "AaBbCcDdEeFf"); + App_WrCoCmd_Buffer(phost, DISPLAY()); + Gpu_CoCmd_Swap(phost); + App_Flush_Co_Buffer(phost); + Gpu_Hal_WaitCmdfifo_empty(phost); +} + +/* end of file */ diff --git a/fonts/calibri_14/L4/calibri_14_L4.json b/fonts/calibri_14/L4/calibri_14_L4.json new file mode 100644 index 0000000..a0c2cda --- /dev/null +++ b/fonts/calibri_14/L4/calibri_14_L4.json @@ -0,0 +1 @@ +{"name": "calibri_14_L4", "type": "legacyfont", "format": "L4", "size": 14, "base_line": 11, "caps_height": 9, "mid_line": 7} \ No newline at end of file diff --git a/fonts/calibri_14/L4/calibri_14_L4.raw b/fonts/calibri_14/L4/calibri_14_L4.raw new file mode 100644 index 0000000..70542d6 Binary files /dev/null and b/fonts/calibri_14/L4/calibri_14_L4.raw differ diff --git a/fonts/calibri_14/L4/calibri_14_L4.rawh b/fonts/calibri_14/L4/calibri_14_L4.rawh new file mode 100644 index 0000000..5b0fa98 --- /dev/null +++ b/fonts/calibri_14/L4/calibri_14_L4.rawh @@ -0,0 +1,317 @@ +/*Command Line: fnt_cvt.exe -f legacy -C BT81X -i Q:/fonts/calibri.ttf -s 14 -d 153600 -c setfont2 -l 32 -a -o D:/Projects/Embedded/AirsoftTracker/fonts*/ + +/*95 characters have been converted */ + +/* 148 Metric Block Begin +++ */ +/*('file properties ', 'format ', 'L4', ' stride ', 7, ' width ', 14, 'height', 14)*/ +{ +/* Widths */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,6,7,7,10,10,3,4,4,7,7,4,4,4,6,7,7,7,7,7,7,7,7,7,7,4,4,7,7,7,6,13,8,8,8,9,7,6,9,9,4,4,7,6,12,9,9,7,10,8,6,7,9,8,13,7,7,7,4,6,4,7,8,4,7,7,6,7,7,5,7,7,3,4,7,3,11,7,7,7,7,5,5,5,7,7,10,6,7,6,4,6,5,7,0, +/* Format */ +2,0,0,0, +/* Stride */ +7,0,0,0, +/* Max Width */ +14,0,0,0, +/* Max Height */ +14,0,0,0, +/* Raw Data Address in Decimal: <153748> */ +148,88,2,0, + +/* 148 Metric Block End --- */ + +/*Bitmap Raw Data begin +++*/ +/*The expected raw bitmap size is 9310 Bytes */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,31,32,0,0,0,0,0,31,32,0,0,0,0,0,31,32,0,0,0,0,0,15,32, +0,0,0,0,0,15,16,0,0,0,0,0,15,16,0,0,0,0,0,14,16,0,0,0,0,0,0,0,0,0,0,0, +0,46,32,0,0,0,0,0,46,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,15,25,128,0,0,0,0,15,25,112,0,0,0,0,14,8,112,0,0,0,0, +13,7,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,29,0,0,0,0,2,208,76,0,0, +0,0,95,255,255,160,0,0,0,6,144,120,0,0,0,0,8,112,150,0,0,0,0,191,255,255,64,0,0,0,12,64, +210,0,0,0,0,13,32,241,0,0,0,0,14,1,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7,96,0,0,0,0,0,9,80,0,0,0,0,4,207,231,0,0,0,0,14,97,58, +0,0,0,0,31,32,0,0,0,0,0,12,196,0,0,0,0,0,1,142,213,0,0,0,0,0,0,127,32,0,0,0, +0,0,14,80,0,0,0,89,33,110,32,0,0,0,27,239,196,0,0,0,0,0,133,0,0,0,0,0,0,148,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,233,0,10,80,0,0,90, +29,32,106,0,0,0,119,10,66,209,0,0,0,106,29,44,48,0,0,0,27,232,135,142,177,0,0,0,4,178,209,166, +0,0,0,29,36,160,119,0,0,0,181,2,209,165,0,0,6,144,0,158,176,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,141,235,16,0,0,0,4,226,29,112,0,0, +0,6,192,12,112,0,0,0,2,244,156,16,0,0,0,0,175,161,0,0,0,0,7,219,176,14,32,0,0,47,49,202, +47,16,0,0,63,0,45,233,0,0,0,30,129,42,251,16,0,0,4,207,232,25,224,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,32,0,0,0,0,0,15,16,0,0, +0,0,0,14,16,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,180,0,0,0,0,0,2,224, +0,0,0,0,0,7,144,0,0,0,0,0,11,96,0,0,0,0,0,14,48,0,0,0,0,0,15,32,0,0,0,0, +0,31,32,0,0,0,0,0,31,32,0,0,0,0,0,14,64,0,0,0,0,0,11,96,0,0,0,0,0,7,160,0, +0,0,0,0,2,224,0,0,0,0,0,0,180,0,0,0,0,0,0,0,0,0,0,0,0,29,16,0,0,0,0,0, +10,96,0,0,0,0,0,6,160,0,0,0,0,0,3,224,0,0,0,0,0,0,242,0,0,0,0,0,0,228,0,0, +0,0,0,0,213,0,0,0,0,0,0,228,0,0,0,0,0,0,243,0,0,0,0,0,3,240,0,0,0,0,0,6, +176,0,0,0,0,0,11,96,0,0,0,0,0,30,16,0,0,0,0,0,0,0,0,0,0,0,0,0,208,0,0,0, +0,0,184,200,160,0,0,0,0,27,250,0,0,0,0,0,184,200,160,0,0,0,0,0,208,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,15,0,0,0,0,0, +0,15,0,0,0,0,0,127,255,255,112,0,0,0,0,15,0,0,0,0,0,0,15,0,0,0,0,0,0,14,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,112,0,0,0,0,0,12,96, +0,0,0,0,0,45,16,0,0,0,0,0,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,127,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,0,0,0,0, +0,0,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,211,0,0,0,0,0,4,208,0,0,0,0,0,9,128,0,0,0,0,0,30,32,0,0,0, +0,0,92,0,0,0,0,0,0,182,0,0,0,0,0,1,225,0,0,0,0,0,7,160,0,0,0,0,0,12,80,0, +0,0,0,0,62,0,0,0,0,0,0,137,0,0,0,0,0,0,211,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,207,213,0,0,0,0,13,113,95,32,0,0,0,78,0,12,96, +0,0,0,107,0,10,128,0,0,0,123,0,9,144,0,0,0,107,0,10,128,0,0,0,94,0,12,96,0,0,0,30, +113,110,16,0,0,0,4,223,196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,231,0,0,0,0,0,155,199,0,0,0,0,0,48,167, +0,0,0,0,0,0,167,0,0,0,0,0,0,167,0,0,0,0,0,0,167,0,0,0,0,0,0,167,0,0,0,0, +0,0,167,0,0,0,0,0,191,255,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,222,178,0,0,0,0,27,33,203,0,0,0,0, +0,0,125,0,0,0,0,0,0,155,0,0,0,0,0,2,228,0,0,0,0,0,28,128,0,0,0,0,0,186,0,0, +0,0,0,11,160,0,0,0,0,0,63,255,255,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,222,178,0,0,0,0,11,33,186,0,0, +0,0,0,0,124,0,0,0,0,0,3,214,0,0,0,0,5,255,194,0,0,0,0,0,2,157,16,0,0,0,0,0, +47,48,0,0,0,73,33,142,16,0,0,0,26,238,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,246,0,0,0,0,0,45,199, +0,0,0,0,0,167,183,0,0,0,0,3,208,183,0,0,0,0,12,64,183,0,0,0,0,106,0,183,0,0,0,0, +175,255,255,144,0,0,0,0,0,183,0,0,0,0,0,0,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,255,250,0,0,0,0,13, +48,0,0,0,0,0,13,48,0,0,0,0,0,13,254,179,0,0,0,0,1,1,158,16,0,0,0,0,0,31,48,0, +0,0,0,0,31,32,0,0,0,72,17,172,0,0,0,0,27,238,162,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,125,252,16,0,0, +0,7,179,3,0,0,0,0,14,32,0,0,0,0,0,47,174,232,0,0,0,0,79,81,62,64,0,0,0,78,0,10, +128,0,0,0,47,32,11,96,0,0,0,13,145,94,32,0,0,0,3,207,212,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,255,255,96, +0,0,0,0,0,30,48,0,0,0,0,0,123,0,0,0,0,0,0,213,0,0,0,0,0,5,208,0,0,0,0,0, +12,112,0,0,0,0,0,63,16,0,0,0,0,0,170,0,0,0,0,0,1,243,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,206, +214,0,0,0,0,14,96,95,16,0,0,0,31,32,31,32,0,0,0,9,196,184,0,0,0,0,1,206,210,0,0,0, +0,29,112,126,32,0,0,0,108,0,11,112,0,0,0,78,48,62,80,0,0,0,7,223,215,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,206,195,0,0,0,0,46,65,125,0,0,0,0,108,0,14,48,0,0,0,78,48,62,80,0,0,0,8,238,190,80, +0,0,0,0,0,14,64,0,0,0,0,0,79,16,0,0,0,19,3,216,0,0,0,0,29,253,112,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,0,0,0,0,0,0,153,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,0,0,0,0,0,0,153,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,144,0,0,0,0,0, +9,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,160,0,0,0,0,0,9,144,0,0, +0,0,0,13,32,0,0,0,0,0,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,64,0,0,0,0,41,213,0,0,0,0,24,231,0,0,0, +0,0,142,32,0,0,0,0,0,24,214,0,0,0,0,0,0,41,212,0,0,0,0,0,0,59,64,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,255,255, +64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,255,255,64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,64,0,0,0,0,0,4, +172,80,0,0,0,0,0,2,156,64,0,0,0,0,3,173,64,0,0,0,4,188,80,0,0,0,0,75,64,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,8,238,161,0,0,0,0,26,18,185,0,0,0,0,0,0,108,0,0,0,0,0,1,185,0,0,0, +0,0,159,177,0,0,0,0,0,151,0,0,0,0,0,0,151,0,0,0,0,0,0,0,0,0,0,0,0,0,169,0, +0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,206,236,112,0,0,2,217,49,20,201,0,0,12,112,0,0, +47,32,0,76,4,222,152,12,64,0,151,30,82,198,12,64,0,180,91,0,195,14,32,0,195,108,22,242,123,0,0,181, +45,232,158,194,0,0,138,0,0,0,0,0,0,46,147,0,0,0,0,0,2,157,255,246,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,208,0,0,0,0,0,60,212,0,0,0,0,0,136, +138,0,0,0,0,0,211,78,16,0,0,0,4,224,14,80,0,0,0,9,144,9,176,0,0,0,14,255,255,241,0,0, +0,94,16,0,230,0,0,0,168,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,254,112,0,0,0,0,197,3,228,0,0,0,0, +197,0,198,0,0,0,0,197,4,226,0,0,0,0,207,255,177,0,0,0,0,197,2,171,0,0,0,0,197,0,78,0, +0,0,0,197,1,171,0,0,0,0,207,254,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,252,80,0,0,0,7,228,19,176,0, +0,0,30,96,0,0,0,0,0,79,16,0,0,0,0,0,95,0,0,0,0,0,0,79,16,0,0,0,0,0,31,80, +0,0,0,0,0,8,212,19,177,0,0,0,0,141,252,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,254,163,0,0,0,0,197,2,158, +32,0,0,0,197,0,11,160,0,0,0,197,0,6,224,0,0,0,197,0,4,240,0,0,0,197,0,6,208,0,0,0, +197,0,11,144,0,0,0,197,2,158,32,0,0,0,207,254,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,255,240,0,0,0,0,197, +0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,207,255,128,0,0,0,0,197,0,0,0,0, +0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,207,255,241,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,255,192,0,0,0, +0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,207,255,144,0,0,0,0,197,0,0, +0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,238,179, +0,0,0,5,230,17,90,0,0,0,29,96,0,0,0,0,0,79,0,0,0,0,0,0,93,0,159,251,0,0,0,79, +0,0,108,0,0,0,30,96,0,108,0,0,0,7,230,17,140,0,0,0,0,92,239,197,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,0, +9,128,0,0,0,197,0,9,128,0,0,0,197,0,9,128,0,0,0,197,0,9,128,0,0,0,207,255,255,128,0,0, +0,197,0,9,128,0,0,0,197,0,9,128,0,0,0,197,0,9,128,0,0,0,197,0,9,128,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0, +0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,212,0,0,0,0,0,0,213,0,0,0,0,0,0,213,0,0,0,0,0,0,213,0,0,0,0,0,0,213, +0,0,0,0,0,0,213,0,0,0,0,0,0,213,0,0,0,0,0,1,227,0,0,0,0,0,238,144,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,197,0,185,0,0,0,0,197,8,193,0,0,0,0,197,94,32,0,0,0,0,200,227,0,0,0,0,0, +204,209,0,0,0,0,0,198,201,0,0,0,0,0,197,46,80,0,0,0,0,197,5,226,0,0,0,0,197,0,155,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0, +0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,207,255, +176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,191,64,0,3,235,0,0,204,160,0,10,204,0,0,198,242,0,30,108,0,0,197,183,0, +121,92,0,0,197,93,0,211,92,0,0,197,14,69,192,92,0,0,197,8,171,96,92,0,0,197,2,254,16,92,0,0, +196,0,185,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,190,32,3,208,0,0,0,205,144,4,208,0,0,0,199,243,4,208,0,0,0,196, +155,4,208,0,0,0,196,30,68,208,0,0,0,196,8,196,208,0,0,0,196,1,233,208,0,0,0,196,0,111,208,0, +0,0,196,0,12,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,108,254,161,0,0,0,7,228,2,188,0,0,0,30,80,0,31,80,0, +0,63,0,0,11,112,0,0,78,0,0,10,144,0,0,63,0,0,12,112,0,0,31,64,0,31,48,0,0,9,211,2, +203,0,0,0,0,125,253,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,253,96,0,0,0,0,197,4,244,0,0,0,0,197,0,184,0, +0,0,0,197,0,183,0,0,0,0,197,5,243,0,0,0,0,207,252,80,0,0,0,0,197,0,0,0,0,0,0,197, +0,0,0,0,0,0,197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,254,145,0,0,0,7,228,2,188,0,0,0,30,80, +0,31,64,0,0,63,0,0,11,112,0,0,78,0,0,10,144,0,0,63,0,0,12,112,0,0,31,64,0,31,64,0, +0,9,211,2,203,0,0,0,0,141,253,174,113,0,0,0,0,0,3,169,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,254,128,0,0,0,0,197,3,229,0,0,0,0, +197,0,184,0,0,0,0,197,4,228,0,0,0,0,207,255,80,0,0,0,0,197,26,176,0,0,0,0,197,1,243,0, +0,0,0,197,0,169,0,0,0,0,197,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,222,161,0,0,0,0,47,65,118,0,0, +0,0,79,16,0,0,0,0,0,29,179,0,0,0,0,0,2,175,161,0,0,0,0,0,2,202,0,0,0,0,0,0, +93,0,0,0,0,119,17,185,0,0,0,0,42,238,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,255,255,160,0,0,0,0,63,0, +0,0,0,0,0,63,0,0,0,0,0,0,63,0,0,0,0,0,0,63,0,0,0,0,0,0,63,0,0,0,0,0, +0,63,0,0,0,0,0,0,63,0,0,0,0,0,0,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,0,5,192,0,0,0,213, +0,5,192,0,0,0,213,0,5,192,0,0,0,213,0,5,192,0,0,0,213,0,5,192,0,0,0,213,0,5,192,0, +0,0,183,0,8,160,0,0,0,110,65,78,80,0,0,0,7,222,198,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,0,0,153,0,0, +0,94,0,0,228,0,0,0,30,64,4,224,0,0,0,10,144,9,144,0,0,0,4,224,13,48,0,0,0,0,228,77, +0,0,0,0,0,153,136,0,0,0,0,0,78,211,0,0,0,0,0,13,192,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,0,7,208, +0,62,0,78,0,12,243,0,122,0,14,64,30,183,0,182,0,10,128,75,107,0,242,0,6,192,135,47,20,208,0,2, +241,196,13,72,128,0,0,198,224,9,140,64,0,0,141,176,5,222,0,0,0,79,112,1,234,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,16, +9,160,0,0,0,12,128,62,32,0,0,0,4,226,184,0,0,0,0,0,172,225,0,0,0,0,0,79,144,0,0,0, +0,0,186,226,0,0,0,0,5,208,170,0,0,0,0,29,80,47,48,0,0,0,124,0,9,176,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +153,0,12,112,0,0,0,63,32,78,16,0,0,0,10,144,183,0,0,0,0,3,228,225,0,0,0,0,0,174,112,0, +0,0,0,0,79,16,0,0,0,0,0,63,0,0,0,0,0,0,63,0,0,0,0,0,0,63,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,127,255,255,16,0,0,0,0,0,139,0,0,0,0,0,3,227,0,0,0,0,0,12,128,0,0,0,0,0,109, +0,0,0,0,0,2,228,0,0,0,0,0,10,160,0,0,0,0,0,78,16,0,0,0,0,0,143,255,255,48,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,160,0, +0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,0,0,0, +166,0,0,0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,0,0,0,166,0,0,0, +0,0,0,166,0,0,0,0,0,0,175,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197, +0,0,0,0,0,0,122,0,0,0,0,0,0,46,16,0,0,0,0,0,11,96,0,0,0,0,0,6,192,0,0,0, +0,0,1,226,0,0,0,0,0,0,167,0,0,0,0,0,0,77,0,0,0,0,0,0,14,48,0,0,0,0,0,9, +144,0,0,0,0,0,3,224,0,0,0,0,0,0,212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,95,224,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0, +0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0, +1,240,0,0,0,0,0,1,240,0,0,0,0,0,95,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,111,64,0,0,0,0,0,201,176,0,0,0,0,4,193,227,0,0,0,0,11, +96,138,0,0,0,0,46,16,46,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,255,255,254,0,0,0, +0,0,0,0,0,0,0,12,64,0,0,0,0,0,2,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,206, +177,0,0,0,0,11,49,184,0,0,0,0,0,0,122,0,0,0,0,6,223,250,0,0,0,0,62,48,122,0,0,0, +0,78,34,202,0,0,0,0,10,237,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,226,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0, +231,222,128,0,0,0,0,236,35,229,0,0,0,0,227,0,153,0,0,0,0,227,0,138,0,0,0,0,227,0,153,0, +0,0,0,236,35,228,0,0,0,0,230,238,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,206,177,0,0,0,0,30,113,102,0,0,0,0,78,0,0,0,0,0,0,108,0,0,0,0,0,0,78,0, +0,0,0,0,0,30,97,102,0,0,0,0,4,223,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,64,0,0,0,0,0,12,80,0,0,0,0,0,12, +80,0,0,0,3,206,141,80,0,0,0,13,113,143,80,0,0,0,62,0,12,80,0,0,0,93,0,12,80,0,0,0, +78,0,13,80,0,0,0,14,97,143,80,0,0,0,4,222,138,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,190,195,0,0,0,0,13,113,109,0,0,0,0,62,0,13,48,0,0,0,95,255,255,48,0, +0,0,77,0,0,0,0,0,0,29,113,0,0,0,0,0,3,206,255,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,206,80,0,0,0,0,8,161,16,0,0,0, +0,10,112,0,0,0,0,0,191,255,16,0,0,0,0,10,112,0,0,0,0,0,10,112,0,0,0,0,0,10,112,0, +0,0,0,0,10,112,0,0,0,0,0,10,112,0,0,0,0,0,10,112,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,5,223,255,32,0,0,0,30,50,212,0,0,0,0,61,0,151,0,0,0,0,30, +50,212,0,0,0,0,45,222,128,0,0,0,0,91,0,0,0,0,0,0,30,254,214,0,0,0,0,123,1,95,16,0, +0,0,154,17,110,0,0,0,0,43,238,195,0,0,0,0,0,0,0,0,0,0,0,226,0,0,0,0,0,0,227,0, +0,0,0,0,0,227,0,0,0,0,0,0,231,222,112,0,0,0,0,236,36,242,0,0,0,0,227,0,213,0,0,0, +0,227,0,197,0,0,0,0,227,0,197,0,0,0,0,227,0,197,0,0,0,0,226,0,181,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0, +14,48,0,0,0,0,0,0,0,0,0,0,0,0,14,32,0,0,0,0,0,14,48,0,0,0,0,0,14,48,0,0, +0,0,0,14,48,0,0,0,0,0,14,48,0,0,0,0,0,14,48,0,0,0,0,0,14,32,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,0,0,0, +0,0,0,213,0,0,0,0,0,0,0,0,0,0,0,0,0,196,0,0,0,0,0,0,196,0,0,0,0,0,0,196, +0,0,0,0,0,0,196,0,0,0,0,0,0,196,0,0,0,0,0,0,196,0,0,0,0,0,0,196,0,0,0,0, +0,0,212,0,0,0,0,0,1,226,0,0,0,0,0,78,144,0,0,0,0,0,0,0,0,0,0,0,0,226,0,0, +0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,227,10,160,0,0,0,0,227,156,16,0,0,0,0, +233,193,0,0,0,0,0,235,192,0,0,0,0,0,227,200,0,0,0,0,0,227,62,64,0,0,0,0,226,6,208,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,226, +0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0, +0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,226,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,222,101,222,80,0,0,236,38,252, +38,224,0,0,227,0,243,0,242,0,0,227,0,227,0,243,0,0,227,0,227,0,243,0,0,227,0,227,0,243,0,0, +226,0,226,0,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,222,112,0,0,0,0,236, +36,242,0,0,0,0,227,0,213,0,0,0,0,227,0,197,0,0,0,0,227,0,197,0,0,0,0,227,0,197,0,0, +0,0,226,0,181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,191,215,0,0,0, +0,13,129,78,80,0,0,0,78,0,8,160,0,0,0,92,0,7,176,0,0,0,78,0,9,144,0,0,0,30,113,78, +48,0,0,0,3,206,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,222,128,0, +0,0,0,236,35,229,0,0,0,0,227,0,153,0,0,0,0,227,0,138,0,0,0,0,227,0,153,0,0,0,0,236, +35,228,0,0,0,0,232,238,112,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,226,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,206, +154,64,0,0,0,13,113,143,80,0,0,0,62,0,12,80,0,0,0,93,0,12,80,0,0,0,78,0,13,80,0,0, +0,14,97,143,80,0,0,0,4,222,140,80,0,0,0,0,0,12,80,0,0,0,0,0,12,80,0,0,0,0,0,12, +64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +230,233,0,0,0,0,0,236,17,0,0,0,0,0,228,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0, +0,0,0,227,0,0,0,0,0,0,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,8,239,128,0,0,0,0,61,16,0,0,0,0,0,46,64,0,0,0,0,0,5,220,48,0,0,0,0,0,8, +192,0,0,0,0,0,7,192,0,0,0,0,111,252,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,96,0,0,0,0,0,10,112,0, +0,0,0,0,191,255,48,0,0,0,0,10,112,0,0,0,0,0,10,112,0,0,0,0,0,10,112,0,0,0,0,0, +10,112,0,0,0,0,0,9,145,16,0,0,0,0,3,222,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,226,0,196,0,0,0,0,242,0,197,0,0,0,0,242,0,197,0,0,0,0,242,0,197,0,0, +0,0,227,0,197,0,0,0,0,200,24,245,0,0,0,0,61,232,180,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,168,0,46,0,0,0,0,109,0,123,0,0,0,0,31,32,197,0,0,0,0,11,113,225, +0,0,0,0,5,198,160,0,0,0,0,1,253,80,0,0,0,0,0,174,16,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,137,0,153,0,136,0,0,77,0,221,0,197,0,0,31,34,206,33,225,0,0,11, +101,154,101,176,0,0,6,169,85,169,96,0,0,2,236,17,236,32,0,0,0,204,0,204,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,108,0,167,0,0,0,0,13,100,209,0,0,0,0,4,237,80,0,0,0, +0,0,222,0,0,0,0,0,6,204,112,0,0,0,0,30,68,225,0,0,0,0,138,0,169,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,0,46,0,0,0,0,93,0,123,0,0,0,0,30,48,198,0, +0,0,0,10,130,241,0,0,0,0,5,214,160,0,0,0,0,0,237,80,0,0,0,0,0,158,16,0,0,0,0,0, +122,0,0,0,0,0,0,198,0,0,0,0,0,2,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,255,176,0,0,0,0,0,11,112,0,0,0,0,0,93, +0,0,0,0,0,0,213,0,0,0,0,0,7,176,0,0,0,0,0,46,32,0,0,0,0,0,95,255,224,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,190,0, +0,0,0,0,2,225,0,0,0,0,0,3,208,0,0,0,0,0,3,192,0,0,0,0,0,7,160,0,0,0,0,0, +110,32,0,0,0,0,0,8,144,0,0,0,0,0,3,192,0,0,0,0,0,3,208,0,0,0,0,0,3,208,0,0, +0,0,0,2,224,0,0,0,0,0,0,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75, +0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0, +0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,91,0, +0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,75,0,0,0,0,0,0,0,0,0,0,0,0, +0,47,128,0,0,0,0,0,3,224,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,0,227,0, +0,0,0,0,0,95,32,0,0,0,0,0,198,0,0,0,0,0,0,240,0,0,0,0,0,1,240,0,0,0,0,0, +1,240,0,0,0,0,0,3,224,0,0,0,0,0,46,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,229,5,128,0,0,0,105,61,41,96,0,0,0,133, +5,235,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*Bitmap Raw Data end ---*/ +} diff --git a/fonts/calibri_14/L4/calibri_14_L4.rtf b/fonts/calibri_14/L4/calibri_14_L4.rtf new file mode 100644 index 0000000..92f501e --- /dev/null +++ b/fonts/calibri_14/L4/calibri_14_L4.rtf @@ -0,0 +1,98 @@ +95 characters are converted + +Character Index No. + 32 + ! 33 + " 34 + # 35 + $ 36 + % 37 + & 38 + ' 39 + ( 40 + ) 41 + * 42 + + 43 + , 44 + - 45 + . 46 + / 47 + 0 48 + 1 49 + 2 50 + 3 51 + 4 52 + 5 53 + 6 54 + 7 55 + 8 56 + 9 57 + : 58 + ; 59 + < 60 + = 61 + > 62 + ? 63 + @ 64 + A 65 + B 66 + C 67 + D 68 + E 69 + F 70 + G 71 + H 72 + I 73 + J 74 + K 75 + L 76 + M 77 + N 78 + O 79 + P 80 + Q 81 + R 82 + S 83 + T 84 + U 85 + V 86 + W 87 + X 88 + Y 89 + Z 90 + [ 91 + \ 92 + ] 93 + ^ 94 + _ 95 + ` 96 + a 97 + b 98 + c 99 + d 100 + e 101 + f 102 + g 103 + h 104 + i 105 + j 106 + k 107 + l 108 + m 109 + n 110 + o 111 + p 112 + q 113 + r 114 + s 115 + t 116 + u 117 + v 118 + w 119 + x 120 + y 121 + z 122 + { 123 + | 124 + } 125 + ~ 126 diff --git a/fonts/calibri_14/L8/calibri_14_L8.c b/fonts/calibri_14/L8/calibri_14_L8.c new file mode 100644 index 0000000..39749a6 --- /dev/null +++ b/fonts/calibri_14/L8/calibri_14_L8.c @@ -0,0 +1,28 @@ +/* +This file is automatically generated +calibri_14_L8 +C Source +*/ + +#include "App_Common.h" + +#define FONT_HANDLE (1) +#define FONT_FILE_ADDRESS (RAM_G + 153600) +#define FIRST_CHARACTER (32) + +void Load_Font() +{ + Gpu_CoCmd_Dlstart(phost); + App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1)); + App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255)); + Gpu_Hal_LoadImageToMemory(phost, "path\\to\\calibri_14_L8.raw", FONT_FILE_ADDRESS, LOAD); + + Gpu_CoCmd_SetFont2(phost, FONT_HANDLE, FONT_FILE_ADDRESS, FIRST_CHARACTER); + Gpu_CoCmd_Text(phost, 0, 0, FONT_HANDLE, 0, "AaBbCcDdEeFf"); + App_WrCoCmd_Buffer(phost, DISPLAY()); + Gpu_CoCmd_Swap(phost); + App_Flush_Co_Buffer(phost); + Gpu_Hal_WaitCmdfifo_empty(phost); +} + +/* end of file */ diff --git a/fonts/calibri_14/L8/calibri_14_L8.json b/fonts/calibri_14/L8/calibri_14_L8.json new file mode 100644 index 0000000..1894f1d --- /dev/null +++ b/fonts/calibri_14/L8/calibri_14_L8.json @@ -0,0 +1 @@ +{"name": "calibri_14_L8", "type": "legacyfont", "format": "L8", "size": 14, "base_line": 11, "caps_height": 9, "mid_line": 7} \ No newline at end of file diff --git a/fonts/calibri_14/L8/calibri_14_L8.raw b/fonts/calibri_14/L8/calibri_14_L8.raw new file mode 100644 index 0000000..0b467ba Binary files /dev/null and b/fonts/calibri_14/L8/calibri_14_L8.raw differ diff --git a/fonts/calibri_14/L8/calibri_14_L8.rawh b/fonts/calibri_14/L8/calibri_14_L8.rawh new file mode 100644 index 0000000..802d696 --- /dev/null +++ b/fonts/calibri_14/L8/calibri_14_L8.rawh @@ -0,0 +1,608 @@ +/*Command Line: fnt_cvt.exe -f legacy -C BT81X -i Q:/fonts/calibri.ttf -s 14 -d 153600 -c setfont2 -l 32 -a -o D:/Projects/Embedded/AirsoftTracker/fonts*/ + +/*95 characters have been converted */ + +/* 148 Metric Block Begin +++ */ +/*('file properties ', 'format ', 'L8', ' stride ', 14, ' width ', 14, 'height', 14)*/ +{ +/* Widths */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,6,7,7,10,10,3,4,4,7,7,4,4,4,6,7,7,7,7,7,7,7,7,7,7,4,4,7,7,7,6,13,8,8,8,9,7,6,9,9,4,4,7,6,12,9,9,7,10,8,6,7,9,8,13,7,7,7,4,6,4,7,8,4,7,7,6,7,7,5,7,7,3,4,7,3,11,7,7,7,7,5,5,5,7,7,10,6,7,6,4,6,5,7,0, +/* Format */ +3,0,0,0, +/* Stride */ +14,0,0,0, +/* Max Width */ +14,0,0,0, +/* Max Height */ +14,0,0,0, +/* Raw Data Address in Decimal: <153748> */ +148,88,2,0, + +/* 148 Metric Block End --- */ + +/*Bitmap Raw Data begin +++*/ +/*The expected raw bitmap size is 18620 Bytes */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,248,32,0,0,0,0,0,0,0,0,0,0,0, +15,255,34,0,0,0,0,0,0,0,0,0,0,0,11,255,30,0,0,0,0,0,0,0,0,0,0,0,7,255,26,0, +0,0,0,0,0,0,0,0,0,0,2,255,21,0,0,0,0,0,0,0,0,0,0,0,0,254,17,0,0,0,0,0, +0,0,0,0,0,0,0,242,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,29,243,42,0,0,0,0,0,0,0,0,0,0,0,29,243,42,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,247,23,150,130,0,0,0,0,0, +0,0,0,0,0,253,17,146,125,0,0,0,0,0,0,0,0,0,0,243,5,135,113,0,0,0,0,0,0,0,0,0, +0,216,0,118,98,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,242,6,23,228,0,0,0,0,0,0,0,0,0,36,223,0,61,198,0,0,0,0, +0,0,0,0,85,255,255,255,255,255,170,0,0,0,0,0,0,0,0,103,157,0,124,133,0,0,0,0,0,0,0,0, +0,138,121,0,161,97,0,0,0,0,0,0,0,0,179,255,255,255,255,255,73,0,0,0,0,0,0,0,0,202,61,0, +222,38,0,0,0,0,0,0,0,0,0,228,34,0,247,12,0,0,0,0,0,0,0,0,0,243,8,14,236,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,104,0,0,0,0,0,0,0,0,0,0,0, +0,146,87,0,0,0,0,0,0,0,0,0,0,62,204,251,234,114,0,0,0,0,0,0,0,0,5,237,100,10,57,171, +0,0,0,0,0,0,0,0,23,255,31,0,0,0,0,0,0,0,0,0,0,0,0,203,203,68,1,0,0,0,0,0, +0,0,0,0,0,16,143,239,221,80,0,0,0,0,0,0,0,0,0,0,0,8,124,251,38,0,0,0,0,0,0,0, +0,0,0,0,0,232,82,0,0,0,0,0,0,0,79,149,31,10,94,243,28,0,0,0,0,0,0,0,25,179,246,247, +198,65,0,0,0,0,0,0,0,0,0,0,144,92,0,0,0,0,0,0,0,0,0,0,0,0,161,66,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,176,240,148,0,0,0,162,91,0,0,0,0,0,88,172, +17,219,40,0,96,172,0,0,0,0,0,0,121,120,0,173,68,37,213,16,0,0,0,0,0,0,97,171,14,215,41,201, +59,0,0,0,0,0,0,0,13,191,241,138,141,126,135,240,185,12,0,0,0,0,0,0,0,71,192,36,218,18,172,96, +0,0,0,0,0,0,23,214,28,65,176,0,117,124,0,0,0,0,0,1,183,80,0,41,219,15,167,90,0,0,0,0, +0,106,147,0,0,0,154,242,179,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,129,228,243,179,14,0,0,0,0,0,0,0,0,69,237,40,24,214,115,0,0,0,0,0, +0,0,0,103,207,0,0,196,114,0,0,0,0,0,0,0,0,32,249,68,146,211,14,0,0,0,0,0,0,0,0,0, +165,254,164,14,0,0,0,0,0,0,0,0,0,119,221,194,189,5,0,233,38,0,0,0,0,0,26,252,43,17,212,168, +31,249,9,0,0,0,0,0,59,253,5,0,26,217,233,156,0,0,0,0,0,0,16,243,134,13,31,172,249,192,24,0, +0,0,0,0,0,66,206,249,230,143,22,150,231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,6,249,28,0,0,0,0,0,0,0,0,0,0,0,0,253,21,0,0,0,0,0, +0,0,0,0,0,0,0,243,9,0,0,0,0,0,0,0,0,0,0,0,0,219,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,182,70,0,0,0,0,0,0,0,0,0,0,0,33,232,4, +0,0,0,0,0,0,0,0,0,0,0,117,161,0,0,0,0,0,0,0,0,0,0,0,0,187,99,0,0,0,0,0, +0,0,0,0,0,0,0,235,59,0,0,0,0,0,0,0,0,0,0,0,7,255,36,0,0,0,0,0,0,0,0,0, +0,0,20,255,27,0,0,0,0,0,0,0,0,0,0,0,10,255,37,0,0,0,0,0,0,0,0,0,0,0,0,240, +62,0,0,0,0,0,0,0,0,0,0,0,0,195,104,0,0,0,0,0,0,0,0,0,0,0,0,126,166,0,0,0, +0,0,0,0,0,0,0,0,0,40,236,5,0,0,0,0,0,0,0,0,0,0,0,0,186,73,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,229,9,0,0,0,0,0,0,0,0,0,0,0, +0,178,95,0,0,0,0,0,0,0,0,0,0,0,0,103,178,0,0,0,0,0,0,0,0,0,0,0,0,43,244,2, +0,0,0,0,0,0,0,0,0,0,0,5,251,40,0,0,0,0,0,0,0,0,0,0,0,0,233,68,0,0,0,0, +0,0,0,0,0,0,0,0,223,80,0,0,0,0,0,0,0,0,0,0,0,0,234,69,0,0,0,0,0,0,0,0, +0,0,0,6,252,43,0,0,0,0,0,0,0,0,0,0,0,44,247,4,0,0,0,0,0,0,0,0,0,0,0,105, +183,0,0,0,0,0,0,0,0,0,0,0,0,179,99,0,0,0,0,0,0,0,0,0,0,0,15,230,10,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,3,227,0,5,0,0,0,0,0, +0,0,0,0,185,128,199,142,166,0,0,0,0,0,0,0,0,0,11,179,255,167,7,0,0,0,0,0,0,0,0,0, +185,129,199,143,166,0,0,0,0,0,0,0,0,0,5,3,229,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,243,0,0,0,0,0,0,0,0,0,0,0,0,4,255,0,0,0,0,0,0,0,0,0,0, +0,0,4,255,0,0,0,0,0,0,0,0,0,0,120,255,255,255,255,255,112,0,0,0,0,0,0,0,0,0,4,255, +0,0,0,0,0,0,0,0,0,0,0,0,4,255,0,0,0,0,0,0,0,0,0,0,0,0,3,245,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,120,0,0,0,0,0,0,0,0,0,0,0,0,207,106,0, +0,0,0,0,0,0,0,0,0,0,40,226,11,0,0,0,0,0,0,0,0,0,0,0,143,87,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,255,255,195,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,212,97,0,0,0,0,0,0,0,0, +0,0,0,0,216,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,2,221,48,0,0,0,0,0,0,0,0,0,0,0,66,221,0,0,0, +0,0,0,0,0,0,0,0,0,159,128,0,0,0,0,0,0,0,0,0,0,0,10,241,36,0,0,0,0,0,0,0, +0,0,0,0,90,198,0,0,0,0,0,0,0,0,0,0,0,0,183,105,0,0,0,0,0,0,0,0,0,0,0,23, +246,19,0,0,0,0,0,0,0,0,0,0,0,114,175,0,0,0,0,0,0,0,0,0,0,0,0,207,82,0,0,0, +0,0,0,0,0,0,0,0,44,238,7,0,0,0,0,0,0,0,0,0,0,0,138,152,0,0,0,0,0,0,0,0, +0,0,0,0,218,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,201,248, +223,89,0,0,0,0,0,0,0,0,2,225,122,9,88,250,33,0,0,0,0,0,0,0,66,233,1,0,0,207,106,0, +0,0,0,0,0,0,106,191,0,0,0,165,134,0,0,0,0,0,0,0,122,181,0,0,0,154,150,0,0,0,0,0, +0,0,110,190,0,0,0,163,133,0,0,0,0,0,0,0,80,233,1,0,0,205,95,0,0,0,0,0,0,0,10,242, +114,12,95,241,13,0,0,0,0,0,0,0,0,72,217,249,210,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,83,230,119,0,0,0,0,0,0,0,0,0,0,152,185,203,124,0,0,0,0,0,0,0,0,0,0,44,0,176,124, +0,0,0,0,0,0,0,0,0,0,0,0,176,124,0,0,0,0,0,0,0,0,0,0,0,0,176,124,0,0,0,0, +0,0,0,0,0,0,0,0,176,124,0,0,0,0,0,0,0,0,0,0,0,0,176,124,0,0,0,0,0,0,0,0, +0,0,0,0,176,124,0,0,0,0,0,0,0,0,0,0,187,255,255,255,255,73,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,110,219,244,191,38,0,0,0,0,0,0,0,0,10,187,41,23,199,186,0,0,0,0,0,0,0,0, +0,0,0,0,112,223,0,0,0,0,0,0,0,0,0,0,0,0,152,181,0,0,0,0,0,0,0,0,0,0,0,31, +245,64,0,0,0,0,0,0,0,0,0,0,9,202,141,0,0,0,0,0,0,0,0,0,0,7,182,169,2,0,0,0, +0,0,0,0,0,0,3,179,173,4,0,0,0,0,0,0,0,0,0,0,47,255,255,255,255,255,67,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,109,221,246,195,38,0,0,0,0,0,0,0,0,8,187,42,20,192,177,0,0,0,0, +0,0,0,0,0,0,0,0,122,203,0,0,0,0,0,0,0,0,0,0,2,45,219,110,0,0,0,0,0,0,0,0, +0,91,255,255,196,30,0,0,0,0,0,0,0,0,0,0,1,28,159,229,12,0,0,0,0,0,0,0,0,0,0,0, +31,255,50,0,0,0,0,0,0,0,68,149,31,15,138,235,10,0,0,0,0,0,0,0,16,165,238,243,195,55,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,252,102,0,0,0,0,0,0,0,0,0,0,26,227,201,112, +0,0,0,0,0,0,0,0,0,0,164,111,180,112,0,0,0,0,0,0,0,0,0,57,213,4,180,112,0,0,0,0, +0,0,0,0,1,203,71,0,180,112,0,0,0,0,0,0,0,0,96,178,0,0,180,112,0,0,0,0,0,0,0,0, +164,255,255,255,255,255,158,0,0,0,0,0,0,0,0,0,0,0,180,112,0,0,0,0,0,0,0,0,0,0,0,0, +175,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,255,255,255,171,0,0,0,0,0,0,0,0,0,220, +44,0,0,0,0,0,0,0,0,0,0,0,0,220,44,0,0,0,0,0,0,0,0,0,0,0,0,216,251,244,195,55, +0,0,0,0,0,0,0,0,0,11,5,25,153,234,11,0,0,0,0,0,0,0,0,0,0,0,11,254,57,0,0,0, +0,0,0,0,0,0,0,0,18,255,38,0,0,0,0,0,0,0,72,134,21,24,164,201,1,0,0,0,0,0,0,0, +25,179,243,234,166,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,116,220,249,210,13,0,0,0,0,0, +0,0,0,118,193,43,7,50,4,0,0,0,0,0,0,0,3,235,30,0,0,0,0,0,0,0,0,0,0,0,41,248, +178,244,230,136,1,0,0,0,0,0,0,0,63,248,81,9,52,240,76,0,0,0,0,0,0,0,62,245,0,0,0,175, +128,0,0,0,0,0,0,0,33,255,29,0,0,190,110,0,0,0,0,0,0,0,0,215,152,14,80,245,29,0,0,0, +0,0,0,0,0,49,205,249,216,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,255,255,255,255,255,104,0, +0,0,0,0,0,0,0,0,0,0,18,245,48,0,0,0,0,0,0,0,0,0,0,0,121,195,0,0,0,0,0,0, +0,0,0,0,0,5,228,86,0,0,0,0,0,0,0,0,0,0,0,90,228,4,0,0,0,0,0,0,0,0,0,0, +0,202,124,0,0,0,0,0,0,0,0,0,0,0,59,249,22,0,0,0,0,0,0,0,0,0,0,0,172,162,0,0, +0,0,0,0,0,0,0,0,0,23,248,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,207,246, +223,98,0,0,0,0,0,0,0,0,5,241,94,8,78,253,24,0,0,0,0,0,0,0,17,255,31,0,14,252,29,0, +0,0,0,0,0,0,0,153,207,73,187,135,0,0,0,0,0,0,0,0,0,14,205,246,216,36,0,0,0,0,0,0, +0,0,14,214,114,7,116,239,36,0,0,0,0,0,0,0,96,207,0,0,0,190,117,0,0,0,0,0,0,0,72,243, +59,6,49,234,77,0,0,0,0,0,0,0,0,122,225,248,221,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,84,210,245,207,55,0,0,0,0,0,0,0,0,41,246,72,12,116,228,4,0,0,0,0,0,0,0,100,201,0,0, +2,238,57,0,0,0,0,0,0,0,73,242,51,8,50,231,90,0,0,0,0,0,0,0,1,140,232,243,193,235,93,0, +0,0,0,0,0,0,0,0,0,0,0,237,67,0,0,0,0,0,0,0,0,0,0,0,63,247,14,0,0,0,0,0, +0,0,13,47,5,47,223,139,0,0,0,0,0,0,0,0,24,216,250,221,126,3,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +157,156,0,0,0,0,0,0,0,0,0,0,0,0,158,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,156,155,0,0,0,0,0,0,0,0,0,0,0,0,158,157,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,157,156,0,0,0,0,0,0,0,0,0,0,0, +0,158,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,132,166,0,0,0,0,0,0,0,0,0,0,0,0,155,150,0,0,0,0,0, +0,0,0,0,0,0,7,229,38,0,0,0,0,0,0,0,0,0,0,0,91,135,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,183, +61,0,0,0,0,0,0,0,0,0,30,161,217,80,0,0,0,0,0,0,0,0,16,139,233,117,6,0,0,0,0,0, +0,0,0,0,128,237,39,0,0,0,0,0,0,0,0,0,0,0,16,138,228,109,4,0,0,0,0,0,0,0,0,0, +0,0,30,161,213,74,0,0,0,0,0,0,0,0,0,0,0,0,47,184,62,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,255,255,255,255,255, +65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,75,255,255,255,255,255,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,71,192,72,0,0,0,0,0,0,0,0,0,0,0,0,63, +178,205,88,3,0,0,0,0,0,0,0,0,0,0,0,39,153,212,64,0,0,0,0,0,0,0,0,0,0,48,166,219, +66,0,0,0,0,0,0,0,0,68,186,208,91,3,0,0,0,0,0,0,0,0,72,193,73,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,140,233,236,166,18,0,0,0,0,0,0,0,0,18,175,25,27,191,152,0,0, +0,0,0,0,0,0,0,0,0,0,99,204,0,0,0,0,0,0,0,0,0,0,0,20,184,161,0,0,0,0,0,0, +0,0,0,0,146,249,183,24,0,0,0,0,0,0,0,0,0,0,155,124,0,0,0,0,0,0,0,0,0,0,0,0, +146,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,149,0,0, +0,0,0,0,0,0,0,0,0,0,166,149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,124, +208,241,246,208,113,3,0,0,0,0,0,30,217,158,53,13,12,67,207,159,0,0,0,0,0,198,114,0,0,0,0,0, +31,247,31,0,0,0,68,207,0,71,220,238,146,136,0,204,76,0,0,0,147,118,13,237,79,26,212,104,0,200,71,0, +0,0,195,69,79,193,0,0,209,49,3,240,28,0,0,0,211,56,98,200,14,99,252,29,115,190,0,0,0,0,185,82, +30,222,242,137,147,246,196,32,0,0,0,0,138,175,0,0,0,0,0,0,0,0,0,0,0,0,26,233,152,43,7,0, +0,0,0,0,0,0,0,0,0,31,157,226,250,255,255,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,208,227,4,0,0,0,0,0,0,0,0,0,0,50,212,217,73,0,0,0,0,0,0,0,0,0,0,141,135, +139,164,0,0,0,0,0,0,0,0,0,2,228,57,60,243,10,0,0,0,0,0,0,0,0,66,233,2,2,235,89,0, +0,0,0,0,0,0,0,157,158,0,0,159,180,0,0,0,0,0,0,0,7,240,255,255,255,255,251,20,0,0,0,0, +0,0,82,238,9,0,0,7,235,105,0,0,0,0,0,0,165,139,0,0,0,0,132,189,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,197,255,254,235,127,0,0,0,0,0,0,0,0,0,212,88,3,58,246,69,0,0,0,0,0,0,0,0, +212,88,0,0,206,106,0,0,0,0,0,0,0,0,212,88,2,61,240,37,0,0,0,0,0,0,0,0,212,255,255,255, +191,24,0,0,0,0,0,0,0,0,212,88,1,28,177,190,0,0,0,0,0,0,0,0,212,88,0,0,72,245,0,0, +0,0,0,0,0,0,212,88,0,18,165,194,0,0,0,0,0,0,0,0,197,255,255,244,179,31,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,102,215,248,212,92,0,0,0,0,0,0,0,0,114,237,76,12,54,193,5,0,0, +0,0,0,0,9,240,98,0,0,0,0,0,0,0,0,0,0,0,61,255,17,0,0,0,0,0,0,0,0,0,0,0, +83,247,0,0,0,0,0,0,0,0,0,0,0,0,70,255,11,0,0,0,0,0,0,0,0,0,0,0,18,247,83,0, +0,0,0,0,0,0,0,0,0,0,0,135,228,68,11,50,187,12,0,0,0,0,0,0,0,4,130,226,249,210,96,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,197,255,254,236,172,43,0,0,0,0,0,0,0,0,212,92,2,30,156,243, +41,0,0,0,0,0,0,0,212,92,0,0,0,187,168,0,0,0,0,0,0,0,212,92,0,0,0,98,231,0,0,0, +0,0,0,0,212,92,0,0,0,76,247,0,0,0,0,0,0,0,212,92,0,0,0,103,225,0,0,0,0,0,0,0, +212,92,0,0,0,184,160,0,0,0,0,0,0,0,212,92,1,27,145,241,37,0,0,0,0,0,0,0,197,255,253,234, +170,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,255,255,255,251,5,0,0,0,0,0,0,0,0,212,92, +0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0, +0,0,0,0,0,0,0,0,212,255,255,255,130,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0, +0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0, +197,255,255,255,253,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,255,255,255,200,0,0,0,0,0,0,0, +0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92, +0,0,0,0,0,0,0,0,0,0,0,0,212,255,255,255,152,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0, +0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0, +0,0,0,0,206,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,190,244,241,185,57, +0,0,0,0,0,0,0,80,244,107,14,20,93,173,0,0,0,0,0,0,9,228,105,0,0,0,0,0,0,0,0,0, +0,0,66,252,8,0,0,0,0,0,0,0,0,0,0,0,91,229,0,0,156,255,255,192,0,0,0,0,0,0,74,252, +7,0,0,0,96,204,0,0,0,0,0,0,16,245,100,0,0,0,96,204,0,0,0,0,0,0,0,115,243,103,22,14, +140,203,0,0,0,0,0,0,0,0,88,201,246,247,199,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,205,85,0,0, +0,153,133,0,0,0,0,0,0,0,212,92,0,0,0,160,140,0,0,0,0,0,0,0,212,92,0,0,0,160,140,0, +0,0,0,0,0,0,212,92,0,0,0,160,140,0,0,0,0,0,0,0,212,255,255,255,255,255,140,0,0,0,0,0, +0,0,212,92,0,0,0,160,140,0,0,0,0,0,0,0,212,92,0,0,0,160,140,0,0,0,0,0,0,0,212,92, +0,0,0,160,140,0,0,0,0,0,0,0,206,86,0,0,0,154,134,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +205,86,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0, +0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0, +0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0, +0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,206,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,213,74,0,0,0,0,0,0,0,0,0,0,0,0,220,80,0,0,0,0,0,0,0,0,0,0, +0,0,220,80,0,0,0,0,0,0,0,0,0,0,0,0,220,80,0,0,0,0,0,0,0,0,0,0,0,0,220,80, +0,0,0,0,0,0,0,0,0,0,0,0,220,80,0,0,0,0,0,0,0,0,0,0,0,0,222,78,0,0,0,0, +0,0,0,0,0,0,0,21,246,51,0,0,0,0,0,0,0,0,0,0,235,246,161,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,205,86,0,2,180,148,0,0,0,0,0,0,0,0,212,92,0,135,206,10,0,0,0,0, +0,0,0,0,212,92,80,231,29,0,0,0,0,0,0,0,0,0,212,131,234,57,0,0,0,0,0,0,0,0,0,0, +212,210,217,9,0,0,0,0,0,0,0,0,0,0,212,96,197,154,0,0,0,0,0,0,0,0,0,0,212,92,31,239, +88,0,0,0,0,0,0,0,0,0,212,92,0,84,242,37,0,0,0,0,0,0,0,0,206,86,0,0,149,195,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,205,86,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0, +0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0, +0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0, +212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,197,255,255,255, +184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,193,247,65,0,0,0,0,53,246,189,0,0,0,0,212,200, +177,0,0,0,0,168,196,204,0,0,0,0,212,105,248,26,0,0,23,239,104,204,0,0,0,0,212,80,179,123,0,0, +123,158,88,204,0,0,0,0,212,80,81,222,1,3,225,55,88,204,0,0,0,0,212,80,5,233,69,79,208,0,88,204, +0,0,0,0,212,80,0,140,170,184,105,0,88,204,0,0,0,0,212,80,0,41,250,242,14,0,88,204,0,0,0,0, +206,75,0,0,194,153,0,0,83,198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194,233,27,0,0,59,213,0,0,0,0,0, +0,0,212,226,159,0,0,64,220,0,0,0,0,0,0,0,212,111,249,46,0,64,220,0,0,0,0,0,0,0,212,75, +154,184,0,64,220,0,0,0,0,0,0,0,212,76,24,244,69,64,220,0,0,0,0,0,0,0,212,76,0,129,203,65, +220,0,0,0,0,0,0,0,212,76,0,12,232,145,220,0,0,0,0,0,0,0,212,76,0,0,104,248,220,0,0,0, +0,0,0,0,206,71,0,0,3,201,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,212,249,236,163,25, +0,0,0,0,0,0,0,112,234,68,7,33,189,212,5,0,0,0,0,0,9,237,84,0,0,0,18,247,77,0,0,0, +0,0,49,254,8,0,0,0,0,194,120,0,0,0,0,0,75,241,0,0,0,0,0,174,145,0,0,0,0,0,54,254, +4,0,0,0,0,196,126,0,0,0,0,0,17,252,71,0,0,0,22,249,55,0,0,0,0,0,0,156,223,55,5,38, +199,179,0,0,0,0,0,0,0,3,122,225,250,229,145,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,195,255,254,225, +109,0,0,0,0,0,0,0,0,0,212,92,4,73,247,73,0,0,0,0,0,0,0,0,212,92,0,0,183,142,0,0, +0,0,0,0,0,0,212,92,0,0,184,127,0,0,0,0,0,0,0,0,212,92,7,84,248,46,0,0,0,0,0,0, +0,0,212,255,247,207,77,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92, +0,0,0,0,0,0,0,0,0,0,0,0,206,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,105,212,249,235,159,22,0,0,0,0,0,0,0,112,234,68,7,33,189,199,0,0,0,0,0,0,9,237,83,0, +0,0,18,247,73,0,0,0,0,0,49,254,7,0,0,0,0,194,121,0,0,0,0,0,75,241,0,0,0,0,0,174, +145,0,0,0,0,0,54,254,5,0,0,0,0,196,125,0,0,0,0,0,17,252,72,0,0,0,23,250,63,0,0,0, +0,0,0,157,223,55,5,38,199,193,0,0,0,0,0,0,0,6,137,226,250,224,163,237,113,10,0,0,0,0,0,0, +0,0,0,0,0,44,176,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,197,255,254,230,132,2,0,0,0,0,0,0,0,0,212,92,3,54,242,87,0,0,0,0,0,0,0,0, +212,92,0,0,190,129,0,0,0,0,0,0,0,0,212,92,4,65,242,62,0,0,0,0,0,0,0,0,212,255,255,252, +85,0,0,0,0,0,0,0,0,0,212,92,19,174,181,0,0,0,0,0,0,0,0,0,212,92,0,25,250,50,0,0, +0,0,0,0,0,0,212,92,0,0,173,154,0,0,0,0,0,0,0,0,206,86,0,0,71,239,5,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,90,218,245,174,19,0,0,0,0,0,0,0,0,30,249,66,14,118,96,0,0,0,0, +0,0,0,0,62,248,10,0,0,0,0,0,0,0,0,0,0,0,11,223,195,49,0,0,0,0,0,0,0,0,0,0, +0,26,165,252,174,20,0,0,0,0,0,0,0,0,0,0,0,38,207,172,0,0,0,0,0,0,0,0,0,0,0,0, +91,222,0,0,0,0,0,0,0,0,116,122,21,23,182,159,0,0,0,0,0,0,0,0,26,171,243,235,159,16,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,218,255,255,255,255,255,172,0,0,0,0,0,0,0,0,0,44,255,0,0, +0,0,0,0,0,0,0,0,0,0,44,255,0,0,0,0,0,0,0,0,0,0,0,0,44,255,0,0,0,0,0,0, +0,0,0,0,0,0,44,255,0,0,0,0,0,0,0,0,0,0,0,0,44,255,0,0,0,0,0,0,0,0,0,0, +0,0,44,255,0,0,0,0,0,0,0,0,0,0,0,0,44,255,0,0,0,0,0,0,0,0,0,0,0,0,40,249, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,209,78,0,0,0,82,205,0,0,0,0,0,0,0,216,84, +0,0,0,88,212,0,0,0,0,0,0,0,216,84,0,0,0,88,212,0,0,0,0,0,0,0,216,84,0,0,0,88, +212,0,0,0,0,0,0,0,216,84,0,0,0,88,212,0,0,0,0,0,0,0,214,87,0,0,0,90,208,0,0,0, +0,0,0,0,183,123,0,0,0,128,174,0,0,0,0,0,0,0,96,234,66,10,62,235,78,0,0,0,0,0,0,0, +0,114,220,246,212,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,143,0,0,0,0,145,152,0,0,0,0, +0,0,88,231,2,0,0,2,231,71,0,0,0,0,0,0,10,244,64,0,0,62,234,4,0,0,0,0,0,0,0,165, +151,0,0,147,148,0,0,0,0,0,0,0,0,76,234,3,1,229,59,0,0,0,0,0,0,0,0,5,237,69,60,224, +1,0,0,0,0,0,0,0,0,0,153,156,144,136,0,0,0,0,0,0,0,0,0,0,64,237,227,47,0,0,0,0, +0,0,0,0,0,0,2,223,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,125,180,0,0,0,126,229,1, +0,0,53,237,0,0,62,246,7,0,0,196,255,50,0,0,123,176,0,0,4,240,65,0,10,242,187,119,0,0,190,103, +0,0,0,173,134,0,70,192,108,189,0,8,247,31,0,0,0,101,203,0,135,127,37,248,10,67,213,0,0,0,0,28, +252,18,200,63,0,222,73,133,140,0,0,0,0,0,212,97,242,7,0,152,142,199,68,0,0,0,0,0,139,221,189,0, +0,81,221,240,7,0,0,0,0,0,62,251,118,0,0,14,243,170,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,225,11,0, +0,150,165,0,0,0,0,0,0,0,3,211,130,0,45,246,36,0,0,0,0,0,0,0,0,67,246,29,187,136,0,0, +0,0,0,0,0,0,0,0,175,212,230,12,0,0,0,0,0,0,0,0,0,0,74,255,146,0,0,0,0,0,0,0, +0,0,0,0,195,172,243,26,0,0,0,0,0,0,0,0,0,91,223,7,177,162,0,0,0,0,0,0,0,0,12,228, +87,0,39,250,55,0,0,0,0,0,0,0,124,196,0,0,0,145,190,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +161,158,0,0,0,196,113,0,0,0,0,0,0,0,46,250,33,0,67,238,14,0,0,0,0,0,0,0,0,174,151,0, +188,125,0,0,0,0,0,0,0,0,0,48,245,68,238,15,0,0,0,0,0,0,0,0,0,0,175,239,126,0,0,0, +0,0,0,0,0,0,0,0,64,255,15,0,0,0,0,0,0,0,0,0,0,0,48,255,0,0,0,0,0,0,0,0, +0,0,0,0,48,255,0,0,0,0,0,0,0,0,0,0,0,0,43,249,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,116,255,255,255,255,250,12,0,0,0,0,0,0,0,0,0,0,0,137,195,0,0,0,0,0,0,0,0, +0,0,0,45,245,43,0,0,0,0,0,0,0,0,0,0,2,199,133,0,0,0,0,0,0,0,0,0,0,0,106,220, +8,0,0,0,0,0,0,0,0,0,0,26,240,69,0,0,0,0,0,0,0,0,0,0,0,172,164,0,0,0,0,0, +0,0,0,0,0,0,74,237,22,0,0,0,0,0,0,0,0,0,0,0,139,255,255,255,255,255,54,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,255,163,0,0,0, +0,0,0,0,0,0,0,0,176,96,0,0,0,0,0,0,0,0,0,0,0,0,176,96,0,0,0,0,0,0,0,0, +0,0,0,0,176,96,0,0,0,0,0,0,0,0,0,0,0,0,176,96,0,0,0,0,0,0,0,0,0,0,0,0, +176,96,0,0,0,0,0,0,0,0,0,0,0,0,176,96,0,0,0,0,0,0,0,0,0,0,0,0,176,96,0,0, +0,0,0,0,0,0,0,0,0,0,176,96,0,0,0,0,0,0,0,0,0,0,0,0,176,96,0,0,0,0,0,0, +0,0,0,0,0,0,176,96,0,0,0,0,0,0,0,0,0,0,0,0,166,255,163,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,78, +0,0,0,0,0,0,0,0,0,0,0,0,117,173,0,0,0,0,0,0,0,0,0,0,0,0,27,246,17,0,0,0, +0,0,0,0,0,0,0,0,0,189,103,0,0,0,0,0,0,0,0,0,0,0,0,96,196,0,0,0,0,0,0,0, +0,0,0,0,0,13,245,33,0,0,0,0,0,0,0,0,0,0,0,0,167,125,0,0,0,0,0,0,0,0,0,0, +0,0,75,218,0,0,0,0,0,0,0,0,0,0,0,0,4,233,55,0,0,0,0,0,0,0,0,0,0,0,0,146, +148,0,0,0,0,0,0,0,0,0,0,0,0,54,236,5,0,0,0,0,0,0,0,0,0,0,0,0,214,71,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,89,255,243,0,0,0,0,0,0,0,0,0,0,0,0,20,255,0,0,0,0,0,0,0,0,0,0,0,0,20, +255,0,0,0,0,0,0,0,0,0,0,0,0,20,255,0,0,0,0,0,0,0,0,0,0,0,0,20,255,0,0,0, +0,0,0,0,0,0,0,0,0,20,255,0,0,0,0,0,0,0,0,0,0,0,0,20,255,0,0,0,0,0,0,0, +0,0,0,0,0,20,255,0,0,0,0,0,0,0,0,0,0,0,0,20,255,0,0,0,0,0,0,0,0,0,0,0, +0,20,255,0,0,0,0,0,0,0,0,0,0,0,0,20,255,0,0,0,0,0,0,0,0,0,0,0,89,255,245,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,94,250,68,0,0,0,0,0,0,0, +0,0,0,0,211,157,187,0,0,0,0,0,0,0,0,0,0,71,210,10,238,49,0,0,0,0,0,0,0,0,0,186, +108,0,141,165,0,0,0,0,0,0,0,0,37,241,16,0,34,245,23,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,249,255,255,255,255,255,241,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,201,75,0,0,0,0,0,0,0,0,0,0,0,0,31,206,11, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,211,244, +186,23,0,0,0,0,0,0,0,0,8,186,43,16,189,136,0,0,0,0,0,0,0,0,0,0,0,0,116,172,0,0, +0,0,0,0,0,0,0,110,215,248,255,176,0,0,0,0,0,0,0,0,59,239,51,4,112,176,0,0,0,0,0,0, +0,0,74,231,33,38,199,176,0,0,0,0,0,0,0,0,4,165,244,220,148,171,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,237,39,0,0,0,0,0,0,0,0, +0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0, +244,111,218,245,141,1,0,0,0,0,0,0,0,0,244,202,33,48,239,83,0,0,0,0,0,0,0,0,244,50,0,0, +157,154,0,0,0,0,0,0,0,0,244,44,0,0,130,172,0,0,0,0,0,0,0,0,244,48,0,0,159,147,0,0, +0,0,0,0,0,0,244,197,29,51,240,65,0,0,0,0,0,0,0,0,236,97,230,231,119,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,50,199,245,186,24,0,0,0,0,0,0,0,0,10,233,114,14,107,98,0,0,0,0,0,0,0,0, +72,235,2,0,0,0,0,0,0,0,0,0,0,0,94,210,0,0,0,0,0,0,0,0,0,0,0,0,70,233,1,0, +0,0,0,0,0,0,0,0,0,0,13,237,109,13,100,105,0,0,0,0,0,0,0,0,0,65,213,247,185,28,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,202,74,0,0,0,0,0,0,0,0,0,0,0,0,208,80,0,0,0,0,0,0,0,0,0,0,0,0,208, +80,0,0,0,0,0,0,0,0,55,208,237,143,213,80,0,0,0,0,0,0,0,4,227,121,14,130,255,80,0,0,0, +0,0,0,0,55,240,4,0,0,212,80,0,0,0,0,0,0,0,80,216,0,0,0,208,80,0,0,0,0,0,0,0, +62,238,2,0,0,214,80,0,0,0,0,0,0,0,8,238,110,14,136,252,80,0,0,0,0,0,0,0,0,72,228,242, +131,173,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,38,189,244,212,52,0,0,0,0,0,0,0,0,3,217,122,13,96,227, +5,0,0,0,0,0,0,0,55,234,1,0,0,229,52,0,0,0,0,0,0,0,83,255,255,255,255,254,59,0,0,0, +0,0,0,0,62,227,0,0,0,0,0,0,0,0,0,0,0,0,9,228,112,12,0,0,0,0,0,0,0,0,0,0, +0,51,196,245,255,250,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,34,209,246,81,0,0,0,0,0,0,0,0,0,0,141,170,10,16,0,0,0,0,0,0,0, +0,0,0,166,121,0,0,0,0,0,0,0,0,0,0,0,181,255,255,252,10,0,0,0,0,0,0,0,0,0,0,168, +120,0,0,0,0,0,0,0,0,0,0,0,0,168,120,0,0,0,0,0,0,0,0,0,0,0,0,168,120,0,0,0, +0,0,0,0,0,0,0,0,0,168,120,0,0,0,0,0,0,0,0,0,0,0,0,168,120,0,0,0,0,0,0,0, +0,0,0,0,0,162,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,225,255,255,255,33,0,0,0,0,0, +0,0,19,242,58,26,218,75,0,0,0,0,0,0,0,0,58,216,0,0,157,118,0,0,0,0,0,0,0,0,23,243, +53,26,220,74,0,0,0,0,0,0,0,0,32,223,224,238,141,0,0,0,0,0,0,0,0,0,88,185,6,0,0,0, +0,0,0,0,0,0,0,0,19,241,253,242,216,100,0,0,0,0,0,0,0,0,125,184,6,11,77,253,13,0,0,0, +0,0,0,0,146,175,19,9,97,236,3,0,0,0,0,0,0,0,27,180,239,243,196,58,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,237,39,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0, +0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,111,219,235,122,0,0,0, +0,0,0,0,0,0,244,203,32,62,252,36,0,0,0,0,0,0,0,0,244,50,0,0,213,79,0,0,0,0,0,0, +0,0,244,44,0,0,200,88,0,0,0,0,0,0,0,0,244,44,0,0,200,88,0,0,0,0,0,0,0,0,244,44, +0,0,200,88,0,0,0,0,0,0,0,0,237,39,0,0,194,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,6,0,0,0,0,0,0,0,0,0,0,0, +7,242,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,237,39,0, +0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0, +0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0, +0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,237,39,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,11,0,0,0,0,0,0, +0,0,0,0,0,0,219,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,205,70,0,0,0,0,0,0,0,0,0,0,0,0,212,76,0,0,0,0,0,0,0,0,0,0,0,0,212,76, +0,0,0,0,0,0,0,0,0,0,0,0,212,76,0,0,0,0,0,0,0,0,0,0,0,0,212,76,0,0,0,0, +0,0,0,0,0,0,0,0,212,76,0,0,0,0,0,0,0,0,0,0,0,0,212,76,0,0,0,0,0,0,0,0, +0,0,0,0,215,72,0,0,0,0,0,0,0,0,0,0,1,25,246,37,0,0,0,0,0,0,0,0,0,0,63,246, +154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,237,39,0,0,0,0, +0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0, +0,0,0,0,244,44,3,175,165,0,0,0,0,0,0,0,0,0,244,44,146,196,10,0,0,0,0,0,0,0,0,0, +244,152,208,15,0,0,0,0,0,0,0,0,0,0,244,188,204,5,0,0,0,0,0,0,0,0,0,0,244,52,211,139, +0,0,0,0,0,0,0,0,0,0,244,44,44,246,70,0,0,0,0,0,0,0,0,0,237,39,0,106,227,5,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,237,39, +0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0, +0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0, +0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0, +244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,238,40,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,236,93,225,237,107,80,226,230,93,0,0,0,0,0,244,201,29,96,251,199, +29,94,241,7,0,0,0,0,244,50,0,2,251,50,0,2,253,36,0,0,0,0,244,44,0,0,244,44,0,0,248,44, +0,0,0,0,244,44,0,0,244,44,0,0,248,44,0,0,0,0,244,44,0,0,244,44,0,0,248,44,0,0,0,0, +237,39,0,0,237,39,0,0,240,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,92,222,235,122,0,0,0,0,0,0,0,0,0,244,203, +32,62,252,36,0,0,0,0,0,0,0,0,244,50,0,0,213,79,0,0,0,0,0,0,0,0,244,44,0,0,200,88, +0,0,0,0,0,0,0,0,244,44,0,0,200,88,0,0,0,0,0,0,0,0,244,44,0,0,200,88,0,0,0,0, +0,0,0,0,237,39,0,0,194,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,189,247,221,115,0,0,0,0,0,0, +0,0,4,219,133,16,60,238,81,0,0,0,0,0,0,0,64,237,4,0,0,144,164,0,0,0,0,0,0,0,91,210, +0,0,0,114,186,0,0,0,0,0,0,0,69,235,2,0,0,145,156,0,0,0,0,0,0,0,10,232,124,15,60,238, +59,0,0,0,0,0,0,0,0,53,199,245,223,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,75,216,245,144,2,0,0, +0,0,0,0,0,0,244,201,36,46,236,84,0,0,0,0,0,0,0,0,244,50,0,0,155,154,0,0,0,0,0,0, +0,0,244,44,0,0,130,172,0,0,0,0,0,0,0,0,244,49,0,0,160,147,0,0,0,0,0,0,0,0,244,199, +30,53,241,65,0,0,0,0,0,0,0,0,244,128,231,230,119,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0, +0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,237,39,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,207,244, +148,176,75,0,0,0,0,0,0,0,4,227,121,14,130,254,80,0,0,0,0,0,0,0,55,240,4,0,0,212,80,0, +0,0,0,0,0,0,80,216,0,0,0,208,80,0,0,0,0,0,0,0,62,238,2,0,0,214,80,0,0,0,0,0, +0,0,8,238,110,14,136,255,80,0,0,0,0,0,0,0,0,72,229,242,133,210,80,0,0,0,0,0,0,0,0,0, +0,0,0,208,80,0,0,0,0,0,0,0,0,0,0,0,0,208,80,0,0,0,0,0,0,0,0,0,0,0,0,202, +74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +236,103,241,145,0,0,0,0,0,0,0,0,0,0,244,203,21,17,0,0,0,0,0,0,0,0,0,0,244,61,0,0, +0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0, +0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,237,39,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,136,237,255,143,0,0,0,0,0,0,0,0,0,53,227,22,0,0,0,0,0,0,0,0,0,0,0, +41,244,72,0,0,0,0,0,0,0,0,0,0,0,0,91,225,206,48,0,0,0,0,0,0,0,0,0,0,0,3,134, +204,0,0,0,0,0,0,0,0,0,0,0,3,111,201,0,0,0,0,0,0,0,0,0,107,255,252,208,53,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,169,105,0,0,0,0,0,0,0,0,0,0,0,0,176,112,0,0,0, +0,0,0,0,0,0,0,0,187,255,255,255,51,0,0,0,0,0,0,0,0,0,0,176,112,0,0,0,0,0,0,0, +0,0,0,0,0,176,112,0,0,0,0,0,0,0,0,0,0,0,0,176,112,0,0,0,0,0,0,0,0,0,0,0, +0,175,113,0,0,0,0,0,0,0,0,0,0,0,0,156,159,14,9,0,0,0,0,0,0,0,0,0,0,52,226,242, +43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,244,32,0,0,202,74,0,0,0,0,0,0,0,0,252,36,0,0,208,80, +0,0,0,0,0,0,0,0,252,36,0,0,208,80,0,0,0,0,0,0,0,0,252,36,0,0,208,80,0,0,0,0, +0,0,0,0,243,46,0,0,212,80,0,0,0,0,0,0,0,0,202,140,13,130,254,80,0,0,0,0,0,0,0,0, +57,215,236,144,179,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,129,0,0,37,243,7,0,0,0,0,0,0,0,96,216, +0,0,118,179,0,0,0,0,0,0,0,0,16,249,42,0,199,92,0,0,0,0,0,0,0,0,0,179,124,25,246,14, +0,0,0,0,0,0,0,0,0,93,207,105,176,0,0,0,0,0,0,0,0,0,0,14,247,213,90,0,0,0,0,0, +0,0,0,0,0,0,169,242,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,152,0,0,159,157,0,0,136,144,0,0, +0,0,76,223,0,0,225,227,0,0,206,78,0,0,0,0,10,247,33,30,212,232,37,17,246,11,0,0,0,0,0,184, +100,91,145,162,103,81,185,0,0,0,0,0,0,110,167,152,80,91,169,146,110,0,0,0,0,0,0,35,233,212,18,21, +232,212,35,0,0,0,0,0,0,0,210,201,0,0,198,212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,209,4,0,171,124,0,0, +0,0,0,0,0,0,6,217,109,68,228,11,0,0,0,0,0,0,0,0,0,73,238,215,88,0,0,0,0,0,0,0, +0,0,0,1,225,240,5,0,0,0,0,0,0,0,0,0,0,96,206,212,115,0,0,0,0,0,0,0,0,0,15,232, +64,70,241,23,0,0,0,0,0,0,0,0,136,172,0,0,177,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,133,0,0, +36,244,8,0,0,0,0,0,0,0,92,222,0,0,119,180,0,0,0,0,0,0,0,0,12,245,51,0,201,94,0,0, +0,0,0,0,0,0,0,169,135,27,247,15,0,0,0,0,0,0,0,0,0,79,220,108,176,0,0,0,0,0,0,0, +0,0,0,6,239,225,89,0,0,0,0,0,0,0,0,0,0,0,154,246,12,0,0,0,0,0,0,0,0,0,0,0, +126,177,0,0,0,0,0,0,0,0,0,0,0,0,210,101,0,0,0,0,0,0,0,0,0,0,0,28,244,26,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +64,255,255,255,191,0,0,0,0,0,0,0,0,0,0,0,0,187,119,0,0,0,0,0,0,0,0,0,0,0,81,220, +7,0,0,0,0,0,0,0,0,0,0,7,222,77,0,0,0,0,0,0,0,0,0,0,0,124,184,0,0,0,0,0, +0,0,0,0,0,0,28,239,40,0,0,0,0,0,0,0,0,0,0,0,89,255,255,255,234,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,183,231,0,0, +0,0,0,0,0,0,0,0,0,36,237,9,0,0,0,0,0,0,0,0,0,0,0,47,216,0,0,0,0,0,0,0, +0,0,0,0,0,53,212,0,0,0,0,0,0,0,0,0,0,0,1,127,173,0,0,0,0,0,0,0,0,0,0,0, +96,239,41,0,0,0,0,0,0,0,0,0,0,0,1,138,161,0,0,0,0,0,0,0,0,0,0,0,0,55,209,0, +0,0,0,0,0,0,0,0,0,0,0,48,216,0,0,0,0,0,0,0,0,0,0,0,0,47,217,0,0,0,0,0, +0,0,0,0,0,0,0,33,238,8,0,0,0,0,0,0,0,0,0,0,0,0,178,230,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,185, +0,0,0,0,0,0,0,0,0,0,0,0,80,192,0,0,0,0,0,0,0,0,0,0,0,0,80,192,0,0,0,0, +0,0,0,0,0,0,0,0,80,192,0,0,0,0,0,0,0,0,0,0,0,0,80,192,0,0,0,0,0,0,0,0, +0,0,0,0,80,192,0,0,0,0,0,0,0,0,0,0,0,0,80,192,0,0,0,0,0,0,0,0,0,0,0,0, +80,192,0,0,0,0,0,0,0,0,0,0,0,0,80,192,0,0,0,0,0,0,0,0,0,0,0,0,80,192,0,0, +0,0,0,0,0,0,0,0,0,0,80,192,0,0,0,0,0,0,0,0,0,0,0,0,80,192,0,0,0,0,0,0, +0,0,0,0,0,0,75,186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,39,247,134,0,0,0,0,0,0,0,0,0,0,0,0,46,237,0,0,0,0,0,0,0,0,0,0,0,0,16, +251,0,0,0,0,0,0,0,0,0,0,0,0,15,252,0,0,0,0,0,0,0,0,0,0,0,0,2,241,55,0,0, +0,0,0,0,0,0,0,0,0,0,87,253,38,0,0,0,0,0,0,0,0,0,0,0,200,94,0,0,0,0,0,0, +0,0,0,0,0,4,254,8,0,0,0,0,0,0,0,0,0,0,0,15,252,0,0,0,0,0,0,0,0,0,0,0, +0,17,250,0,0,0,0,0,0,0,0,0,0,0,0,50,231,0,0,0,0,0,0,0,0,0,0,0,38,246,123,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,17,199,236,82,0,79,138,0,0,0,0,0,0,0,110,149,46,229,42,150,102,0,0,0,0,0,0,0,139,78, +0,84,239,191,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*Bitmap Raw Data end ---*/ +} diff --git a/fonts/calibri_14/L8/calibri_14_L8.rtf b/fonts/calibri_14/L8/calibri_14_L8.rtf new file mode 100644 index 0000000..92f501e --- /dev/null +++ b/fonts/calibri_14/L8/calibri_14_L8.rtf @@ -0,0 +1,98 @@ +95 characters are converted + +Character Index No. + 32 + ! 33 + " 34 + # 35 + $ 36 + % 37 + & 38 + ' 39 + ( 40 + ) 41 + * 42 + + 43 + , 44 + - 45 + . 46 + / 47 + 0 48 + 1 49 + 2 50 + 3 51 + 4 52 + 5 53 + 6 54 + 7 55 + 8 56 + 9 57 + : 58 + ; 59 + < 60 + = 61 + > 62 + ? 63 + @ 64 + A 65 + B 66 + C 67 + D 68 + E 69 + F 70 + G 71 + H 72 + I 73 + J 74 + K 75 + L 76 + M 77 + N 78 + O 79 + P 80 + Q 81 + R 82 + S 83 + T 84 + U 85 + V 86 + W 87 + X 88 + Y 89 + Z 90 + [ 91 + \ 92 + ] 93 + ^ 94 + _ 95 + ` 96 + a 97 + b 98 + c 99 + d 100 + e 101 + f 102 + g 103 + h 104 + i 105 + j 106 + k 107 + l 108 + m 109 + n 110 + o 111 + p 112 + q 113 + r 114 + s 115 + t 116 + u 117 + v 118 + w 119 + x 120 + y 121 + z 122 + { 123 + | 124 + } 125 + ~ 126 diff --git a/fonts/calibri_14/calibri_14_L8.PNG b/fonts/calibri_14/calibri_14_L8.PNG new file mode 100644 index 0000000..0025155 Binary files /dev/null and b/fonts/calibri_14/calibri_14_L8.PNG differ diff --git a/hw.txt b/hw.txt new file mode 100644 index 0000000..c279a1d --- /dev/null +++ b/hw.txt @@ -0,0 +1,5 @@ +1. R2 & R3 10K, R1 - 1K +2. Molex cable 33mm +3. Ground plane between screen & board. Capton tape+Copper Foil Tape, solder to board ground via 22 cable + + diff --git a/images/at.png b/images/at.png new file mode 100644 index 0000000..ad9b675 Binary files /dev/null and b/images/at.png differ diff --git a/images/gps.png b/images/gps.png new file mode 100644 index 0000000..efdafd1 Binary files /dev/null and b/images/gps.png differ diff --git a/include/version.h b/include/version.h new file mode 100644 index 0000000..61f330f --- /dev/null +++ b/include/version.h @@ -0,0 +1,9 @@ + + // AUTO GENERATED FILE, DO NOT EDIT + #ifndef VERSION + #define VERSION "1.0.1203" + #endif + #ifndef BUILD_TIMESTAMP + #define BUILD_TIMESTAMP "2023-07-18 14:37:23.725627" + #endif + \ No newline at end of file diff --git a/lib/SparkFun u-blox Arduino Library/SparkFun_Ublox_Arduino_Library.cpp b/lib/SparkFun u-blox Arduino Library/SparkFun_Ublox_Arduino_Library.cpp new file mode 100644 index 0000000..afe019e --- /dev/null +++ b/lib/SparkFun u-blox Arduino Library/SparkFun_Ublox_Arduino_Library.cpp @@ -0,0 +1,5102 @@ +/* + This is a library written for the u-blox ZED-F9P and NEO-M8P-2 + SparkFun sells these at its website: www.sparkfun.com + Do you like this library? Help support SparkFun. Buy a board! + https://www.sparkfun.com/products/16481 + https://www.sparkfun.com/products/15136 + https://www.sparkfun.com/products/15005 + https://www.sparkfun.com/products/15733 + https://www.sparkfun.com/products/15193 + https://www.sparkfun.com/products/15210 + + Written by Nathan Seidle @ SparkFun Electronics, September 6th, 2018 + + This library handles configuring and handling the responses + from a u-blox GPS module. Works with most modules from u-blox including + the Zed-F9P, NEO-M8P-2, NEO-M9N, ZOE-M8Q, SAM-M8Q, and many others. + + https://github.com/sparkfun/SparkFun_Ublox_Arduino_Library + + Development environment specifics: + Arduino IDE 1.8.5 + + SparkFun code, firmware, and software is released under the MIT License(http://opensource.org/licenses/MIT). + The MIT License (MIT) + Copyright (c) 2016 SparkFun Electronics + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the Software is furnished to + do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial + portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#include "SparkFun_Ublox_Arduino_Library.h" + +SFE_UBLOX_GPS::SFE_UBLOX_GPS(void) +{ + // Constructor + currentGeofenceParams.numFences = 0; // Zero the number of geofences currently in use + moduleQueried.versionNumber = false; + moduleQueried.hwState = false; + + if (checksumFailurePin >= 0) + { + pinMode((uint8_t)checksumFailurePin, OUTPUT); + digitalWrite((uint8_t)checksumFailurePin, HIGH); + } + + //Define the size of the I2C buffer based on the platform the user has + //In general we found that most platforms use 32 bytes as the I2C buffer size. We could + //implement platform gaurds here but as you can see, none currently benefit from >32 + //so we'll leave it up to the user to set it using setI2CTransactionSize if they will benefit from it + // //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + // #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) + + // i2cTransactionSize = 32; + + // #elif defined(__SAMD21G18A__) + + // i2cTransactionSize = 32; + + //#elif __MK20DX256__ + //Teensy + + // #elif defined(ARDUINO_ARCH_ESP32) + + // i2cTransactionSize = 32; //The ESP32 has an I2C buffer length of 128. We reduce it to 32 bytes to increase stability with the module + + // #endif +} + +//Initialize the Serial port +boolean SFE_UBLOX_GPS::begin(TwoWire &wirePort, uint8_t deviceAddress) +{ + commType = COMM_TYPE_I2C; + _i2cPort = &wirePort; //Grab which port the user wants us to use + + //We expect caller to begin their I2C port, with the speed of their choice external to the library + //But if they forget, we start the hardware here. + + //We're moving away from the practice of starting Wire hardware in a library. This is to avoid cross platform issues. + //ie, there are some platforms that don't handle multiple starts to the wire hardware. Also, every time you start the wire + //hardware the clock speed reverts back to 100kHz regardless of previous Wire.setClocks(). + //_i2cPort->begin(); + + _gpsI2Caddress = deviceAddress; //Store the I2C address from user + + // Attempt isConnected up to 3 times if required + boolean success = isConnected(); + + if (!success) + success = isConnected(); + + if (!success) + success = isConnected(); + + return (success); +} + +//Initialize the Serial port +boolean SFE_UBLOX_GPS::begin(Stream &serialPort) +{ + commType = COMM_TYPE_SERIAL; + _serialPort = &serialPort; //Grab which port the user wants us to use + + // Attempt isConnected up to 3 times if required + boolean success = isConnected(); + + if (!success) + success = isConnected(); + +// if (!success) +// success = isConnected(); + + return (success); +} + +//Sets the global size for I2C transactions +//Most platforms use 32 bytes (the default) but this allows users to increase the transaction +//size if the platform supports it +//Note: If the transaction size is set larger than the platforms buffer size, bad things will happen. +void SFE_UBLOX_GPS::setI2CTransactionSize(uint8_t transactionSize) +{ + i2cTransactionSize = transactionSize; +} +uint8_t SFE_UBLOX_GPS::getI2CTransactionSize(void) +{ + return (i2cTransactionSize); +} + +//Enable or disable the printing of sent/response HEX values. +//Use this in conjunction with 'Transport Logging' from the Universal Reader Assistant to see what they're doing that we're not +void SFE_UBLOX_GPS::enableDebugging(Stream &debugPort, boolean printLimitedDebug) +{ + _debugSerial = &debugPort; //Grab which port the user wants us to use for debugging + if (printLimitedDebug == false) + { + _printDebug = true; //Should we print the commands we send? Good for debugging + } + else + { + _printLimitedDebug = true; //Should we print limited debug messages? Good for debugging high navigation rates + } +} +void SFE_UBLOX_GPS::disableDebugging(void) +{ + _printDebug = false; //Turn off extra print statements + _printLimitedDebug = false; +} + +//Safely print messages +void SFE_UBLOX_GPS::debugPrint(char *message) +{ + if (_printDebug == true) + { + _debugSerial->print(message); + } +} +//Safely print messages +void SFE_UBLOX_GPS::debugPrintln(char *message) +{ + if (_printDebug == true) + { + _debugSerial->println(message); + } +} + +const char *SFE_UBLOX_GPS::statusString(sfe_ublox_status_e stat) +{ + switch (stat) + { + case SFE_UBLOX_STATUS_SUCCESS: + return "Success"; + break; + case SFE_UBLOX_STATUS_FAIL: + return "General Failure"; + break; + case SFE_UBLOX_STATUS_CRC_FAIL: + return "CRC Fail"; + break; + case SFE_UBLOX_STATUS_TIMEOUT: + return "Timeout"; + break; + case SFE_UBLOX_STATUS_COMMAND_NACK: + return "Command not acknowledged (NACK)"; + break; + case SFE_UBLOX_STATUS_OUT_OF_RANGE: + return "Out of range"; + break; + case SFE_UBLOX_STATUS_INVALID_ARG: + return "Invalid Arg"; + break; + case SFE_UBLOX_STATUS_INVALID_OPERATION: + return "Invalid operation"; + break; + case SFE_UBLOX_STATUS_MEM_ERR: + return "Memory Error"; + break; + case SFE_UBLOX_STATUS_HW_ERR: + return "Hardware Error"; + break; + case SFE_UBLOX_STATUS_DATA_SENT: + return "Data Sent"; + break; + case SFE_UBLOX_STATUS_DATA_RECEIVED: + return "Data Received"; + break; + case SFE_UBLOX_STATUS_I2C_COMM_FAILURE: + return "I2C Comm Failure"; + break; + case SFE_UBLOX_STATUS_DATA_OVERWRITTEN: + return "Data Packet Overwritten"; + break; + default: + return "Unknown Status"; + break; + } + return "None"; +} + +void SFE_UBLOX_GPS::factoryReset() +{ + // Copy default settings to permanent + // Note: this does not load the permanent configuration into the current configuration. Calling factoryDefault() will do that. + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_CFG; + packetCfg.len = 13; + packetCfg.startingSpot = 0; + for (uint8_t i = 0; i < 4; i++) + { + payloadCfg[0 + i] = 0xff; // clear mask: copy default config to permanent config + payloadCfg[4 + i] = 0x00; // save mask: don't save current to permanent + payloadCfg[8 + i] = 0x00; // load mask: don't copy permanent config to current + } + payloadCfg[12] = 0xff; // all forms of permanent memory + sendCommand(&packetCfg, 0); // don't expect ACK + hardReset(); // cause factory default config to actually be loaded and used cleanly +} + +void SFE_UBLOX_GPS::hardReset() +{ + // Issue hard reset + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_RST; + packetCfg.len = 4; + packetCfg.startingSpot = 0; + payloadCfg[0] = 0xff; // cold start + payloadCfg[1] = 0xff; // cold start + payloadCfg[2] = 0; // 0=HW reset + payloadCfg[3] = 0; // reserved + sendCommand(&packetCfg, 0); // don't expect ACK +} + +//Changes the serial baud rate of the u-blox module, can't return success/fail 'cause ACK from modem +//is lost due to baud rate change +void SFE_UBLOX_GPS::setSerialRate(uint32_t baudrate, uint8_t uartPort, uint16_t maxWait) +{ + //Get the current config values for the UART port + getPortSettings(uartPort, maxWait); //This will load the payloadCfg array with current port settings + + if (_printDebug == true) + { + _debugSerial->print(F("Current baud rate: ")); + _debugSerial->println(((uint32_t)payloadCfg[10] << 16) | ((uint32_t)payloadCfg[9] << 8) | payloadCfg[8]); + } + + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_PRT; + packetCfg.len = 20; + packetCfg.startingSpot = 0; + + //payloadCfg is now loaded with current bytes. Change only the ones we need to + payloadCfg[8] = baudrate; + payloadCfg[9] = baudrate >> 8; + payloadCfg[10] = baudrate >> 16; + payloadCfg[11] = baudrate >> 24; + + if (_printDebug == true) + { + _debugSerial->print(F("New baud rate:")); + _debugSerial->println(((uint32_t)payloadCfg[10] << 16) | ((uint32_t)payloadCfg[9] << 8) | payloadCfg[8]); + } + + sfe_ublox_status_e retVal = sendCommand(&packetCfg, maxWait); + if (_printDebug == true) + { + _debugSerial->print(F("setSerialRate: sendCommand returned: ")); + _debugSerial->println(statusString(retVal)); + } +} + +//Changes the I2C address that the u-blox module responds to +//0x42 is the default but can be changed with this command +boolean SFE_UBLOX_GPS::setI2CAddress(uint8_t deviceAddress, uint16_t maxWait) +{ + //Get the current config values for the I2C port + getPortSettings(COM_PORT_I2C, maxWait); //This will load the payloadCfg array with current port settings + + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_PRT; + packetCfg.len = 20; + packetCfg.startingSpot = 0; + + //payloadCfg is now loaded with current bytes. Change only the ones we need to + payloadCfg[4] = deviceAddress << 1; //DDC mode LSB + + if (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT) // We are only expecting an ACK + { + //Success! Now change our internal global. + _gpsI2Caddress = deviceAddress; //Store the I2C address from user + return (true); + } + return (false); +} + +//Want to see the NMEA messages on the Serial port? Here's how +void SFE_UBLOX_GPS::setNMEAOutputPort(Stream &nmeaOutputPort) +{ + _nmeaOutputPort = &nmeaOutputPort; //Store the port from user +} + +//Called regularly to check for available bytes on the user' specified port +boolean SFE_UBLOX_GPS::checkUblox(uint8_t requestedClass, uint8_t requestedID) +{ + return checkUbloxInternal(&packetCfg, requestedClass, requestedID); +} + +//Called regularly to check for available bytes on the user' specified port +boolean SFE_UBLOX_GPS::checkUbloxInternal(ubxPacket *incomingUBX, uint8_t requestedClass, uint8_t requestedID) +{ + if (commType == COMM_TYPE_I2C) + return (checkUbloxI2C(incomingUBX, requestedClass, requestedID)); + else if (commType == COMM_TYPE_SERIAL) + return (checkUbloxSerial(incomingUBX, requestedClass, requestedID)); + return false; +} + +//Polls I2C for data, passing any new bytes to process() +//Returns true if new bytes are available +boolean SFE_UBLOX_GPS::checkUbloxI2C(ubxPacket *incomingUBX, uint8_t requestedClass, uint8_t requestedID) +{ + if (millis() - lastCheck >= i2cPollingWait) + { + //Get the number of bytes available from the module + uint16_t bytesAvailable = 0; + _i2cPort->beginTransmission(_gpsI2Caddress); + _i2cPort->write(0xFD); //0xFD (MSB) and 0xFE (LSB) are the registers that contain number of bytes available + if (_i2cPort->endTransmission(false) != 0) //Send a restart command. Do not release bus. + return (false); //Sensor did not ACK + + _i2cPort->requestFrom((uint8_t)_gpsI2Caddress, (uint8_t)2); + if (_i2cPort->available()) + { + uint8_t msb = _i2cPort->read(); + uint8_t lsb = _i2cPort->read(); + if (lsb == 0xFF) + { + //I believe this is a u-blox bug. Device should never present an 0xFF. + if ((_printDebug == true) || (_printLimitedDebug == true)) // Print this if doing limited debugging + { + _debugSerial->println(F("checkUbloxI2C: u-blox bug, length lsb is 0xFF")); + } + if (checksumFailurePin >= 0) + { + digitalWrite((uint8_t)checksumFailurePin, LOW); + delay(10); + digitalWrite((uint8_t)checksumFailurePin, HIGH); + } + lastCheck = millis(); //Put off checking to avoid I2C bus traffic + return (false); + } + bytesAvailable = (uint16_t)msb << 8 | lsb; + } + + if (bytesAvailable == 0) + { + if (_printDebug == true) + { + _debugSerial->println(F("checkUbloxI2C: OK, zero bytes available")); + } + lastCheck = millis(); //Put off checking to avoid I2C bus traffic + return (false); + } + + //Check for undocumented bit error. We found this doing logic scans. + //This error is rare but if we incorrectly interpret the first bit of the two 'data available' bytes as 1 + //then we have far too many bytes to check. May be related to I2C setup time violations: https://github.com/sparkfun/SparkFun_Ublox_Arduino_Library/issues/40 + if (bytesAvailable & ((uint16_t)1 << 15)) + { + //Clear the MSbit + bytesAvailable &= ~((uint16_t)1 << 15); + + if ((_printDebug == true) || (_printLimitedDebug == true)) // Print this if doing limited debugging + { + _debugSerial->print(F("checkUbloxI2C: Bytes available error:")); + _debugSerial->println(bytesAvailable); + if (checksumFailurePin >= 0) + { + digitalWrite((uint8_t)checksumFailurePin, LOW); + delay(10); + digitalWrite((uint8_t)checksumFailurePin, HIGH); + } + } + } + + if (bytesAvailable > 100) + { + if (_printDebug == true) + { + _debugSerial->print(F("checkUbloxI2C: Large packet of ")); + _debugSerial->print(bytesAvailable); + _debugSerial->println(F(" bytes received")); + } + } + else + { + if (_printDebug == true) + { + _debugSerial->print(F("checkUbloxI2C: Reading ")); + _debugSerial->print(bytesAvailable); + _debugSerial->println(F(" bytes")); + } + } + + while (bytesAvailable) + { + _i2cPort->beginTransmission(_gpsI2Caddress); + _i2cPort->write(0xFF); //0xFF is the register to read data from + if (_i2cPort->endTransmission(false) != 0) //Send a restart command. Do not release bus. + return (false); //Sensor did not ACK + + //Limit to 32 bytes or whatever the buffer limit is for given platform + uint16_t bytesToRead = bytesAvailable; + if (bytesToRead > i2cTransactionSize) + bytesToRead = i2cTransactionSize; + + TRY_AGAIN: + + _i2cPort->requestFrom((uint8_t)_gpsI2Caddress, (uint8_t)bytesToRead); + if (_i2cPort->available()) + { + for (uint16_t x = 0; x < bytesToRead; x++) + { + uint8_t incoming = _i2cPort->read(); //Grab the actual character + + //Check to see if the first read is 0x7F. If it is, the module is not ready + //to respond. Stop, wait, and try again + if (x == 0) + { + if (incoming == 0x7F) + { + if ((_printDebug == true) || (_printLimitedDebug == true)) // Print this if doing limited debugging + { + _debugSerial->println(F("checkUbloxU2C: u-blox error, module not ready with data")); + } + delay(5); //In logic analyzation, the module starting responding after 1.48ms + if (checksumFailurePin >= 0) + { + digitalWrite((uint8_t)checksumFailurePin, LOW); + delay(10); + digitalWrite((uint8_t)checksumFailurePin, HIGH); + } + goto TRY_AGAIN; + } + } + + process(incoming, incomingUBX, requestedClass, requestedID); //Process this valid character + } + } + else + return (false); //Sensor did not respond + + bytesAvailable -= bytesToRead; + } + } + + return (true); + +} //end checkUbloxI2C() + +//Checks Serial for data, passing any new bytes to process() +boolean SFE_UBLOX_GPS::checkUbloxSerial(ubxPacket *incomingUBX, uint8_t requestedClass, uint8_t requestedID) +{ + while (_serialPort->available()) + { + process(_serialPort->read(), incomingUBX, requestedClass, requestedID); + } + return (true); + +} //end checkUbloxSerial() + +//Processes NMEA and UBX binary sentences one byte at a time +//Take a given byte and file it into the proper array +void SFE_UBLOX_GPS::process(uint8_t incoming, ubxPacket *incomingUBX, uint8_t requestedClass, uint8_t requestedID) +{ + if(_debugSerial) + _debugSerial->printf("%0X %d %d\n",(int)incoming,(int)currentSentence,(int)ubxFrameCounter); + + if ((currentSentence == NONE) || (currentSentence == NMEA)) + { + if (incoming == 0xB5) //UBX binary frames start with 0xB5, aka Îŧ + { + //This is the start of a binary sentence. Reset flags. + //We still don't know the response class + ubxFrameCounter = 0; + currentSentence = UBX; + //Reset the packetBuf.counter even though we will need to reset it again when ubxFrameCounter == 2 + packetBuf.counter = 0; + ignoreThisPayload = false; //We should not ignore this payload - yet + //Store data in packetBuf until we know if we have a requested class and ID match + activePacketBuffer = SFE_UBLOX_PACKET_PACKETBUF; + } + else if (incoming == '$') + { + currentSentence = NMEA; + } + else if (incoming == 0xD3) //RTCM frames start with 0xD3 + { + rtcmFrameCounter = 0; + currentSentence = RTCM; + } + else + { + //This character is unknown or we missed the previous start of a sentence + } + } + + //Depending on the sentence, pass the character to the individual processor + if (currentSentence == UBX) + { + //Decide what type of response this is + if ((ubxFrameCounter == 0) && (incoming != 0xB5)) //ISO 'Îŧ' + { + currentSentence = NONE; //Something went wrong. Reset. + } + else if ((ubxFrameCounter == 1) && (incoming != 0x62)) //ASCII 'b' + { + currentSentence = NONE; //Something went wrong. Reset. + // Note to future self: + // There may be some duplication / redundancy in the next few lines as processUBX will also + // load information into packetBuf, but we'll do it here too for clarity + } + else if (ubxFrameCounter == 2) //Class + { + // Record the class in packetBuf until we know what to do with it + packetBuf.cls = incoming; // (Duplication) + rollingChecksumA = 0; //Reset our rolling checksums here (not when we receive the 0xB5) + rollingChecksumB = 0; + packetBuf.counter = 0; //Reset the packetBuf.counter (again) + packetBuf.valid = SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED; // Reset the packet validity (redundant?) + packetBuf.startingSpot = incomingUBX->startingSpot; //Copy the startingSpot + } + else if (ubxFrameCounter == 3) //ID + { + // Record the ID in packetBuf until we know what to do with it + packetBuf.id = incoming; // (Duplication) + //We can now identify the type of response + //If the packet we are receiving is not an ACK then check for a class and ID match + if (packetBuf.cls != UBX_CLASS_ACK) + { + //This is not an ACK so check for a class and ID match + if ((packetBuf.cls == requestedClass) && (packetBuf.id == requestedID)) + { + //This is not an ACK and we have a class and ID match + //So start diverting data into incomingUBX (usually packetCfg) + activePacketBuffer = SFE_UBLOX_PACKET_PACKETCFG; + incomingUBX->cls = packetBuf.cls; //Copy the class and ID into incomingUBX (usually packetCfg) + incomingUBX->id = packetBuf.id; + incomingUBX->counter = packetBuf.counter; //Copy over the .counter too + } + //This is not an ACK and we do not have a complete class and ID match + //So let's check for an HPPOSLLH message arriving when we were expecting PVT and vice versa + else if ((packetBuf.cls == requestedClass) && + (((packetBuf.id == UBX_NAV_PVT) && (requestedID == UBX_NAV_HPPOSLLH || requestedID == UBX_NAV_DOP)) || + ((packetBuf.id == UBX_NAV_HPPOSLLH) && (requestedID == UBX_NAV_PVT || requestedID == UBX_NAV_DOP)) || + ((packetBuf.id == UBX_NAV_DOP) && (requestedID == UBX_NAV_PVT || requestedID == UBX_NAV_HPPOSLLH)))) + { + //This is not the message we were expecting but we start diverting data into incomingUBX (usually packetCfg) and process it anyway + activePacketBuffer = SFE_UBLOX_PACKET_PACKETCFG; + incomingUBX->cls = packetBuf.cls; //Copy the class and ID into incomingUBX (usually packetCfg) + incomingUBX->id = packetBuf.id; + incomingUBX->counter = packetBuf.counter; //Copy over the .counter too + if (_printDebug == true) + { + _debugSerial->print(F("process: auto NAV PVT/HPPOSLLH/DOP collision: Requested ID: 0x")); + _debugSerial->print(requestedID, HEX); + _debugSerial->print(F(" Message ID: 0x")); + _debugSerial->println(packetBuf.id, HEX); + } + } + else if ((packetBuf.cls == requestedClass) && + (((packetBuf.id == UBX_HNR_ATT) && (requestedID == UBX_HNR_INS || requestedID == UBX_HNR_PVT)) || + ((packetBuf.id == UBX_HNR_INS) && (requestedID == UBX_HNR_ATT || requestedID == UBX_HNR_PVT)) || + ((packetBuf.id == UBX_HNR_PVT) && (requestedID == UBX_HNR_ATT || requestedID == UBX_HNR_INS)))) + { + //This is not the message we were expecting but we start diverting data into incomingUBX (usually packetCfg) and process it anyway + activePacketBuffer = SFE_UBLOX_PACKET_PACKETCFG; + incomingUBX->cls = packetBuf.cls; //Copy the class and ID into incomingUBX (usually packetCfg) + incomingUBX->id = packetBuf.id; + incomingUBX->counter = packetBuf.counter; //Copy over the .counter too + if (_printDebug == true) + { + _debugSerial->print(F("process: auto HNR ATT/INS/PVT collision: Requested ID: 0x")); + _debugSerial->print(requestedID, HEX); + _debugSerial->print(F(" Message ID: 0x")); + _debugSerial->println(packetBuf.id, HEX); + } + } + else if (packetBuf.cls == UBX_CLASS_MON && packetBuf.id==UBX_MON_HW) + { + activePacketBuffer = SFE_UBLOX_PACKET_PACKETCFG; + incomingUBX->cls = packetBuf.cls; //Copy the class and ID into incomingUBX (usually packetCfg) + incomingUBX->id = packetBuf.id; + incomingUBX->counter = packetBuf.counter; //Copy over the .counter too + } + else + { + //This is not an ACK and we do not have a class and ID match + //so we should keep diverting data into packetBuf and ignore the payload + ignoreThisPayload = true; + } + } + else + { + // This is an ACK so it is to early to do anything with it + // We need to wait until we have received the length and data bytes + // So we should keep diverting data into packetBuf + } + } + else if (ubxFrameCounter == 4) //Length LSB + { + //We should save the length in packetBuf even if activePacketBuffer == SFE_UBLOX_PACKET_PACKETCFG + packetBuf.len = incoming; // (Duplication) + } + else if (ubxFrameCounter == 5) //Length MSB + { + //We should save the length in packetBuf even if activePacketBuffer == SFE_UBLOX_PACKET_PACKETCFG + packetBuf.len |= incoming << 8; // (Duplication) + } + else if (ubxFrameCounter == 6) //This should be the first byte of the payload unless .len is zero + { + if (packetBuf.len == 0) // Check if length is zero (hopefully this is impossible!) + { + if (_printDebug == true) + { + _debugSerial->print(F("process: ZERO LENGTH packet received: Class: 0x")); + _debugSerial->print(packetBuf.cls, HEX); + _debugSerial->print(F(" ID: 0x")); + _debugSerial->println(packetBuf.id, HEX); + } + //If length is zero (!) this will be the first byte of the checksum so record it + packetBuf.checksumA = incoming; + } + else + { + //The length is not zero so record this byte in the payload + packetBuf.payload[0] = incoming; + } + } + else if (ubxFrameCounter == 7) //This should be the second byte of the payload unless .len is zero or one + { + if (packetBuf.len == 0) // Check if length is zero (hopefully this is impossible!) + { + //If length is zero (!) this will be the second byte of the checksum so record it + packetBuf.checksumB = incoming; + } + else if (packetBuf.len == 1) // Check if length is one + { + //The length is one so this is the first byte of the checksum + packetBuf.checksumA = incoming; + } + else // Length is >= 2 so this must be a payload byte + { + packetBuf.payload[1] = incoming; + } + // Now that we have received two payload bytes, we can check for a matching ACK/NACK + if ((activePacketBuffer == SFE_UBLOX_PACKET_PACKETBUF) // If we are not already processing a data packet + && (packetBuf.cls == UBX_CLASS_ACK) // and if this is an ACK/NACK + && (packetBuf.payload[0] == requestedClass) // and if the class matches + && (packetBuf.payload[1] == requestedID)) // and if the ID matches + { + if (packetBuf.len == 2) // Check if .len is 2 + { + // Then this is a matching ACK so copy it into packetAck + activePacketBuffer = SFE_UBLOX_PACKET_PACKETACK; + packetAck.cls = packetBuf.cls; + packetAck.id = packetBuf.id; + packetAck.len = packetBuf.len; + packetAck.counter = packetBuf.counter; + packetAck.payload[0] = packetBuf.payload[0]; + packetAck.payload[1] = packetBuf.payload[1]; + } + else // Length is not 2 (hopefully this is impossible!) + { + if (_printDebug == true) + { + _debugSerial->print(F("process: ACK received with .len != 2: Class: 0x")); + _debugSerial->print(packetBuf.payload[0], HEX); + _debugSerial->print(F(" ID: 0x")); + _debugSerial->print(packetBuf.payload[1], HEX); + _debugSerial->print(F(" len: ")); + _debugSerial->println(packetBuf.len); + } + } + } + } + + //Divert incoming into the correct buffer + if (activePacketBuffer == SFE_UBLOX_PACKET_PACKETACK) + processUBX(incoming, &packetAck, requestedClass, requestedID); + else if (activePacketBuffer == SFE_UBLOX_PACKET_PACKETCFG) + processUBX(incoming, incomingUBX, requestedClass, requestedID); + else // if (activePacketBuffer == SFE_UBLOX_PACKET_PACKETBUF) + processUBX(incoming, &packetBuf, requestedClass, requestedID); + + //Finally, increment the frame counter + ubxFrameCounter++; + } + else if (currentSentence == NMEA) + { + processNMEA(incoming); //Process each NMEA character + } + else if (currentSentence == RTCM) + { + processRTCMframe(incoming); //Deal with RTCM bytes + } +} + +//This is the default or generic NMEA processor. We're only going to pipe the data to serial port so we can see it. +//User could overwrite this function to pipe characters to nmea.process(c) of tinyGPS or MicroNMEA +//Or user could pipe each character to a buffer, radio, etc. +void SFE_UBLOX_GPS::processNMEA(char incoming) +{ + //If user has assigned an output port then pipe the characters there + if (_nmeaOutputPort != NULL) + _nmeaOutputPort->write(incoming); //Echo this byte to the serial port +} + +//We need to be able to identify an RTCM packet and then the length +//so that we know when the RTCM message is completely received and we then start +//listening for other sentences (like NMEA or UBX) +//RTCM packet structure is very odd. I never found RTCM STANDARD 10403.2 but +//http://d1.amobbs.com/bbs_upload782111/files_39/ourdev_635123CK0HJT.pdf is good +//https://dspace.cvut.cz/bitstream/handle/10467/65205/F3-BP-2016-Shkalikava-Anastasiya-Prenos%20polohove%20informace%20prostrednictvim%20datove%20site.pdf?sequence=-1 +//Lead me to: https://forum.u-blox.com/index.php/4348/how-to-read-rtcm-messages-from-neo-m8p +//RTCM 3.2 bytes look like this: +//Byte 0: Always 0xD3 +//Byte 1: 6-bits of zero +//Byte 2: 10-bits of length of this packet including the first two-ish header bytes, + 6. +//byte 3 + 4 bits: Msg type 12 bits +//Example: D3 00 7C 43 F0 ... / 0x7C = 124+6 = 130 bytes in this packet, 0x43F = Msg type 1087 +void SFE_UBLOX_GPS::processRTCMframe(uint8_t incoming) +{ + if (rtcmFrameCounter == 1) + { + rtcmLen = (incoming & 0x03) << 8; //Get the last two bits of this byte. Bits 8&9 of 10-bit length + } + else if (rtcmFrameCounter == 2) + { + rtcmLen |= incoming; //Bits 0-7 of packet length + rtcmLen += 6; //There are 6 additional bytes of what we presume is header, msgType, CRC, and stuff + } + /*else if (rtcmFrameCounter == 3) + { + rtcmMsgType = incoming << 4; //Message Type, MS 4 bits + } + else if (rtcmFrameCounter == 4) + { + rtcmMsgType |= (incoming >> 4); //Message Type, bits 0-7 + }*/ + + rtcmFrameCounter++; + + processRTCM(incoming); //Here is where we expose this byte to the user + + if (rtcmFrameCounter == rtcmLen) + { + //We're done! + currentSentence = NONE; //Reset and start looking for next sentence type + } +} + +//This function is called for each byte of an RTCM frame +//Ths user can overwrite this function and process the RTCM frame as they please +//Bytes can be piped to Serial or other interface. The consumer could be a radio or the internet (Ntrip broadcaster) +void SFE_UBLOX_GPS::processRTCM(uint8_t incoming) +{ + //Radio.sendReliable((String)incoming); //An example of passing this byte to a radio + + //_debugSerial->write(incoming); //An example of passing this byte out the serial port + + //Debug printing + // _debugSerial->print(F(" ")); + // if(incoming < 0x10) _debugSerial->print(F("0")); + // if(incoming < 0x10) _debugSerial->print(F("0")); + // _debugSerial->print(incoming, HEX); + // if(rtcmFrameCounter % 16 == 0) _debugSerial->println(); +} + +//Given a character, file it away into the uxb packet structure +//Set valid to VALID or NOT_VALID once sentence is completely received and passes or fails CRC +//The payload portion of the packet can be 100s of bytes but the max array +//size is MAX_PAYLOAD_SIZE bytes. startingSpot can be set so we only record +//a subset of bytes within a larger packet. +void SFE_UBLOX_GPS::processUBX(uint8_t incoming, ubxPacket *incomingUBX, uint8_t requestedClass, uint8_t requestedID) +{ + size_t max_payload_size = (activePacketBuffer == SFE_UBLOX_PACKET_PACKETCFG) ? MAX_PAYLOAD_SIZE : 2; + bool overrun = false; + + //Add all incoming bytes to the rolling checksum + //Stop at len+4 as this is the checksum bytes to that should not be added to the rolling checksum + if (incomingUBX->counter < incomingUBX->len + 4) + addToChecksum(incoming); + + if (incomingUBX->counter == 0) + { + incomingUBX->cls = incoming; + } + else if (incomingUBX->counter == 1) + { + incomingUBX->id = incoming; + } + else if (incomingUBX->counter == 2) //Len LSB + { + incomingUBX->len = incoming; + } + else if (incomingUBX->counter == 3) //Len MSB + { + incomingUBX->len |= incoming << 8; + } + else if (incomingUBX->counter == incomingUBX->len + 4) //ChecksumA + { + incomingUBX->checksumA = incoming; + } + else if (incomingUBX->counter == incomingUBX->len + 5) //ChecksumB + { + incomingUBX->checksumB = incoming; + + currentSentence = NONE; //We're done! Reset the sentence to being looking for a new start char + + //Validate this sentence + if ((incomingUBX->checksumA == rollingChecksumA) && (incomingUBX->checksumB == rollingChecksumB)) + { + incomingUBX->valid = SFE_UBLOX_PACKET_VALIDITY_VALID; // Flag the packet as valid + + // Let's check if the class and ID match the requestedClass and requestedID + // Remember - this could be a data packet or an ACK packet + if ((incomingUBX->cls == requestedClass) && (incomingUBX->id == requestedID)) + { + incomingUBX->classAndIDmatch = SFE_UBLOX_PACKET_VALIDITY_VALID; // If we have a match, set the classAndIDmatch flag to valid + } + + // If this is an ACK then let's check if the class and ID match the requestedClass and requestedID + else if ((incomingUBX->cls == UBX_CLASS_ACK) && (incomingUBX->id == UBX_ACK_ACK) && (incomingUBX->payload[0] == requestedClass) && (incomingUBX->payload[1] == requestedID)) + { + incomingUBX->classAndIDmatch = SFE_UBLOX_PACKET_VALIDITY_VALID; // If we have a match, set the classAndIDmatch flag to valid + } + + // If this is a NACK then let's check if the class and ID match the requestedClass and requestedID + else if ((incomingUBX->cls == UBX_CLASS_ACK) && (incomingUBX->id == UBX_ACK_NACK) && (incomingUBX->payload[0] == requestedClass) && (incomingUBX->payload[1] == requestedID)) + { + incomingUBX->classAndIDmatch = SFE_UBLOX_PACKET_NOTACKNOWLEDGED; // If we have a match, set the classAndIDmatch flag to NOTACKNOWLEDGED + if (_printDebug == true) + { + _debugSerial->print(F("processUBX: NACK received: Requested Class: 0x")); + _debugSerial->print(incomingUBX->payload[0], HEX); + _debugSerial->print(F(" Requested ID: 0x")); + _debugSerial->println(incomingUBX->payload[1], HEX); + } + } + + //This is not an ACK and we do not have a complete class and ID match + //So let's check for an HPPOSLLH message arriving when we were expecting PVT and vice versa + else if ((incomingUBX->cls == requestedClass) && + (((incomingUBX->id == UBX_NAV_PVT) && (requestedID == UBX_NAV_HPPOSLLH || requestedID == UBX_NAV_DOP)) || + ((incomingUBX->id == UBX_NAV_HPPOSLLH) && (requestedID == UBX_NAV_PVT || requestedID == UBX_NAV_DOP)) || + ((incomingUBX->id == UBX_NAV_DOP) && (requestedID == UBX_NAV_PVT || requestedID == UBX_NAV_HPPOSLLH)))) + { + // This isn't the message we are looking for... + // Let's say so and leave incomingUBX->classAndIDmatch _unchanged_ + if (_printDebug == true) + { + _debugSerial->print(F("processUBX: auto NAV PVT/HPPOSLLH/DOP collision: Requested ID: 0x")); + _debugSerial->print(requestedID, HEX); + _debugSerial->print(F(" Message ID: 0x")); + _debugSerial->println(incomingUBX->id, HEX); + } + } + // Let's do the same for the HNR messages + else if ((incomingUBX->cls == requestedClass) && + (((incomingUBX->id == UBX_HNR_ATT) && (requestedID == UBX_HNR_INS || requestedID == UBX_HNR_PVT)) || + ((incomingUBX->id == UBX_HNR_INS) && (requestedID == UBX_HNR_ATT || requestedID == UBX_HNR_PVT)) || + ((incomingUBX->id == UBX_HNR_PVT) && (requestedID == UBX_HNR_ATT || requestedID == UBX_HNR_INS)))) + { + // This isn't the message we are looking for... + // Let's say so and leave incomingUBX->classAndIDmatch _unchanged_ + if (_printDebug == true) + { + _debugSerial->print(F("processUBX: auto HNR ATT/INS/PVT collision: Requested ID: 0x")); + _debugSerial->print(requestedID, HEX); + _debugSerial->print(F(" Message ID: 0x")); + _debugSerial->println(incomingUBX->id, HEX); + } + } + + if (_printDebug == true) + { + _debugSerial->print(F("Incoming: Size: ")); + _debugSerial->print(incomingUBX->len); + _debugSerial->print(F(" Received: ")); + printPacket(incomingUBX); + + if (incomingUBX->valid == SFE_UBLOX_PACKET_VALIDITY_VALID) + { + _debugSerial->println(F("packetCfg now valid")); + } + if (packetAck.valid == SFE_UBLOX_PACKET_VALIDITY_VALID) + { + _debugSerial->println(F("packetAck now valid")); + } + if (incomingUBX->classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_VALID) + { + _debugSerial->println(F("packetCfg classAndIDmatch")); + } + if (packetAck.classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_VALID) + { + _debugSerial->println(F("packetAck classAndIDmatch")); + } + } + + //We've got a valid packet, now do something with it but only if ignoreThisPayload is false + if (ignoreThisPayload == false) + { + processUBXpacket(incomingUBX); + } + } + else // Checksum failure + { + incomingUBX->valid = SFE_UBLOX_PACKET_VALIDITY_NOT_VALID; + + // Let's check if the class and ID match the requestedClass and requestedID. + // This is potentially risky as we are saying that we saw the requested Class and ID + // but that the packet checksum failed. Potentially it could be the class or ID bytes + // that caused the checksum error! + if ((incomingUBX->cls == requestedClass) && (incomingUBX->id == requestedID)) + { + incomingUBX->classAndIDmatch = SFE_UBLOX_PACKET_VALIDITY_NOT_VALID; // If we have a match, set the classAndIDmatch flag to not valid + } + // If this is an ACK then let's check if the class and ID match the requestedClass and requestedID + else if ((incomingUBX->cls == UBX_CLASS_ACK) && (incomingUBX->payload[0] == requestedClass) && (incomingUBX->payload[1] == requestedID)) + { + incomingUBX->classAndIDmatch = SFE_UBLOX_PACKET_VALIDITY_NOT_VALID; // If we have a match, set the classAndIDmatch flag to not valid + } + + if ((_printDebug == true) || (_printLimitedDebug == true)) // Print this if doing limited debugging + { + //Drive an external pin to allow for easier logic analyzation + if (checksumFailurePin >= 0) + { + digitalWrite((uint8_t)checksumFailurePin, LOW); + delay(10); + digitalWrite((uint8_t)checksumFailurePin, HIGH); + } + + _debugSerial->print(F("Checksum failed:")); + _debugSerial->print(F(" checksumA: ")); + _debugSerial->print(incomingUBX->checksumA); + _debugSerial->print(F(" checksumB: ")); + _debugSerial->print(incomingUBX->checksumB); + + _debugSerial->print(F(" rollingChecksumA: ")); + _debugSerial->print(rollingChecksumA); + _debugSerial->print(F(" rollingChecksumB: ")); + _debugSerial->print(rollingChecksumB); + _debugSerial->println(); + + _debugSerial->print(F("Failed : ")); + _debugSerial->print(F("Size: ")); + _debugSerial->print(incomingUBX->len); + _debugSerial->print(F(" Received: ")); + printPacket(incomingUBX); + } + } + } + else //Load this byte into the payload array + { + //If a UBX_NAV_PVT packet comes in asynchronously, we need to fudge the startingSpot + uint16_t startingSpot = incomingUBX->startingSpot; + if (incomingUBX->cls == UBX_CLASS_NAV && incomingUBX->id == UBX_NAV_PVT) + startingSpot = 0; + // Check if this is payload data which should be ignored + if (ignoreThisPayload == false) + { + //Begin recording if counter goes past startingSpot + if ((incomingUBX->counter - 4) >= startingSpot) + { + //Check to see if we have room for this byte + if (((incomingUBX->counter - 4) - startingSpot) < max_payload_size) //If counter = 208, starting spot = 200, we're good to record. + { + incomingUBX->payload[incomingUBX->counter - 4 - startingSpot] = incoming; //Store this byte into payload array + } + else + { + overrun = true; + } + } + } + } + + //Increment the counter + incomingUBX->counter++; + + if (overrun || (incomingUBX->counter == MAX_PAYLOAD_SIZE)) + { + //Something has gone very wrong + currentSentence = NONE; //Reset the sentence to being looking for a new start char + if ((_printDebug == true) || (_printLimitedDebug == true)) // Print this if doing limited debugging + { + if (overrun) + _debugSerial->println(F("processUBX: buffer overrun detected")); + else + _debugSerial->println(F("processUBX: counter hit MAX_PAYLOAD_SIZE")); + } + } +} + +//Once a packet has been received and validated, identify this packet's class/id and update internal flags +//Note: if the user requests a PVT or a HPPOSLLH message using a custom packet, the data extraction will +// not work as expected beacuse extractLong etc are hardwired to packetCfg payloadCfg. Ideally +// extractLong etc should be updated so they receive a pointer to the packet buffer. +void SFE_UBLOX_GPS::processUBXpacket(ubxPacket *msg) +{ + switch (msg->cls) + { + case UBX_CLASS_MON: + { + switch(msg->id) + { + case UBX_MON_HW: + { + hwState.noisePerMS = extractInt(16); + hwState.agcCnt = extractInt(18); + hwState.aStatus = extractByte(20); + hwState.aPower = extractByte(21); + hwState.aFlags = extractByte(22); + moduleQueried.hwState = true; + break; + } + } + break; + } + case UBX_CLASS_NAV: + if (msg->id == UBX_NAV_PVT && msg->len == 92) + { + pvtSeqId++; + //Parse various byte fields into global vars + constexpr int startingSpot = 0; //fixed value used in processUBX + + timeOfWeek = extractLong(0); + gpsMillisecond = extractLong(0) % 1000; //Get last three digits of iTOW + gpsYear = extractInt(4); + gpsMonth = extractByte(6); + gpsDay = extractByte(7); + gpsHour = extractByte(8); + gpsMinute = extractByte(9); + gpsSecond = extractByte(10); + gpsDateValid = extractByte(11) & 0x01; + gpsTimeValid = (extractByte(11) & 0x02) >> 1; + gpsNanosecond = extractSignedLong(16); //Includes milliseconds + + fixType = extractByte(20 - startingSpot); + gnssFixOk = extractByte(21 - startingSpot) & 0x1; //Get the 1st bit + diffSoln = (extractByte(21 - startingSpot) >> 1) & 0x1; //Get the 2nd bit + carrierSolution = extractByte(21 - startingSpot) >> 6; //Get 6th&7th bits of this byte + headVehValid = (extractByte(21 - startingSpot) >> 5) & 0x1; // Get the 5th bit + SIV = extractByte(23 - startingSpot); + longitude = extractSignedLong(24 - startingSpot); + latitude = extractSignedLong(28 - startingSpot); + altitude = extractSignedLong(32 - startingSpot); + altitudeMSL = extractSignedLong(36 - startingSpot); + horizontalAccEst = extractLong(40 - startingSpot); + verticalAccEst = extractLong(44 - startingSpot); + nedNorthVel = extractSignedLong(48 - startingSpot); + nedEastVel = extractSignedLong(52 - startingSpot); + nedDownVel = extractSignedLong(56 - startingSpot); + groundSpeed = extractSignedLong(60 - startingSpot); + headingOfMotion = extractSignedLong(64 - startingSpot); + speedAccEst = extractLong(68 - startingSpot); + headingAccEst = extractLong(72 - startingSpot); + pDOP = extractInt(76 - startingSpot); + invalidLlh = extractByte(78 - startingSpot) & 0x1; + headVeh = extractSignedLong(84 - startingSpot); + magDec = extractSignedInt(88 - startingSpot); + magAcc = extractInt(90 - startingSpot); + + //Mark all datums as fresh (not read before) + moduleQueried.gpsiTOW = true; + moduleQueried.gpsYear = true; + moduleQueried.gpsMonth = true; + moduleQueried.gpsDay = true; + moduleQueried.gpsHour = true; + moduleQueried.gpsMinute = true; + moduleQueried.gpsSecond = true; + moduleQueried.gpsDateValid = true; + moduleQueried.gpsTimeValid = true; + moduleQueried.gpsNanosecond = true; + + moduleQueried.all = true; + moduleQueried.gnssFixOk = true; + moduleQueried.diffSoln = true; + moduleQueried.headVehValid = true; + moduleQueried.longitude = true; + moduleQueried.latitude = true; + moduleQueried.altitude = true; + moduleQueried.altitudeMSL = true; + moduleQueried.horizontalAccEst = true; + moduleQueried.verticalAccEst = true; + moduleQueried.nedNorthVel = true; + moduleQueried.nedEastVel = true; + moduleQueried.nedDownVel = true; + moduleQueried.SIV = true; + moduleQueried.fixType = true; + moduleQueried.carrierSolution = true; + moduleQueried.groundSpeed = true; + moduleQueried.headingOfMotion = true; + moduleQueried.speedAccEst = true; + moduleQueried.headingAccEst = true; + moduleQueried.pDOP = true; + moduleQueried.invalidLlh = true; + moduleQueried.headVeh = true; + moduleQueried.magDec = true; + moduleQueried.magAcc = true; + } + else if (msg->id == UBX_NAV_HPPOSLLH && msg->len == 36) + { + timeOfWeek = extractLong(4); + highResLongitude = extractSignedLong(8); + highResLatitude = extractSignedLong(12); + elipsoid = extractSignedLong(16); + meanSeaLevel = extractSignedLong(20); + highResLongitudeHp = extractSignedChar(24); + highResLatitudeHp = extractSignedChar(25); + elipsoidHp = extractSignedChar(26); + meanSeaLevelHp = extractSignedChar(27); + horizontalAccuracy = extractLong(28); + verticalAccuracy = extractLong(32); + + highResModuleQueried.all = true; + highResModuleQueried.highResLatitude = true; + highResModuleQueried.highResLatitudeHp = true; + highResModuleQueried.highResLongitude = true; + highResModuleQueried.highResLongitudeHp = true; + highResModuleQueried.elipsoid = true; + highResModuleQueried.elipsoidHp = true; + highResModuleQueried.meanSeaLevel = true; + highResModuleQueried.meanSeaLevelHp = true; + highResModuleQueried.geoidSeparation = true; + highResModuleQueried.horizontalAccuracy = true; + highResModuleQueried.verticalAccuracy = true; + moduleQueried.gpsiTOW = true; // this can arrive via HPPOS too. + +/* + if (_printDebug == true) + { + _debugSerial->print(F("Sec: ")); + _debugSerial->print(((float)extractLong(4)) / 1000.0f); + _debugSerial->print(F(" ")); + _debugSerial->print(F("LON: ")); + _debugSerial->print(((float)(int32_t)extractLong(8)) / 10000000.0f); + _debugSerial->print(F(" ")); + _debugSerial->print(F("LAT: ")); + _debugSerial->print(((float)(int32_t)extractLong(12)) / 10000000.0f); + _debugSerial->print(F(" ")); + _debugSerial->print(F("ELI M: ")); + _debugSerial->print(((float)(int32_t)extractLong(16)) / 1000.0f); + _debugSerial->print(F(" ")); + _debugSerial->print(F("MSL M: ")); + _debugSerial->print(((float)(int32_t)extractLong(20)) / 1000.0f); + _debugSerial->print(F(" ")); + _debugSerial->print(F("LON HP: ")); + _debugSerial->print(extractSignedChar(24)); + _debugSerial->print(F(" ")); + _debugSerial->print(F("LAT HP: ")); + _debugSerial->print(extractSignedChar(25)); + _debugSerial->print(F(" ")); + _debugSerial->print(F("ELI HP: ")); + _debugSerial->print(extractSignedChar(26)); + _debugSerial->print(F(" ")); + _debugSerial->print(F("MSL HP: ")); + _debugSerial->print(extractSignedChar(27)); + _debugSerial->print(F(" ")); + _debugSerial->print(F("HA 2D M: ")); + _debugSerial->print(((float)(int32_t)extractLong(28)) / 10000.0f); + _debugSerial->print(F(" ")); + _debugSerial->print(F("VERT M: ")); + _debugSerial->println(((float)(int32_t)extractLong(32)) / 10000.0f); + } +*/ + } + else if (msg->id == UBX_NAV_DOP && msg->len == 18) + { + geometricDOP = extractInt(4); + positionDOP = extractInt(6); + timeDOP = extractInt(8); + verticalDOP = extractInt(10); + horizontalDOP = extractInt(12); + northingDOP = extractInt(14); + eastingDOP = extractInt(16); + dopModuleQueried.all = true; + dopModuleQueried.geometricDOP = true; + dopModuleQueried.positionDOP = true; + dopModuleQueried.timeDOP = true; + dopModuleQueried.verticalDOP = true; + dopModuleQueried.horizontalDOP = true; + dopModuleQueried.northingDOP = true; + dopModuleQueried.eastingDOP = true; + } + break; + case UBX_CLASS_HNR: + if (msg->id == UBX_HNR_ATT && msg->len == 32) + { + //Parse various byte fields into global vars + hnrAtt.iTOW = extractLong(0); + hnrAtt.roll = extractSignedLong(8); + hnrAtt.pitch = extractSignedLong(12); + hnrAtt.heading = extractSignedLong(16); + hnrAtt.accRoll = extractLong(20); + hnrAtt.accPitch = extractLong(24); + hnrAtt.accHeading = extractLong(28); + + hnrAttQueried = true; + } + else if (msg->id == UBX_HNR_INS && msg->len == 36) + { + //Parse various byte fields into global vars + hnrVehDyn.iTOW = extractLong(8); + hnrVehDyn.xAngRate = extractSignedLong(12); + hnrVehDyn.yAngRate = extractSignedLong(16); + hnrVehDyn.zAngRate = extractSignedLong(20); + hnrVehDyn.xAccel = extractSignedLong(24); + hnrVehDyn.yAccel = extractSignedLong(28); + hnrVehDyn.zAccel = extractSignedLong(32); + + uint32_t bitfield0 = extractLong(0); + hnrVehDyn.xAngRateValid = (bitfield0 & 0x00000100) > 0; + hnrVehDyn.yAngRateValid = (bitfield0 & 0x00000200) > 0; + hnrVehDyn.zAngRateValid = (bitfield0 & 0x00000400) > 0; + hnrVehDyn.xAccelValid = (bitfield0 & 0x00000800) > 0; + hnrVehDyn.yAccelValid = (bitfield0 & 0x00001000) > 0; + hnrVehDyn.zAccelValid = (bitfield0 & 0x00002000) > 0; + + hnrDynQueried = true; + } + else if (msg->id == UBX_HNR_PVT && msg->len == 72) + { + //Parse various byte fields into global vars + hnrPVT.iTOW = extractLong(0); + hnrPVT.year = extractInt(4); + hnrPVT.month = extractByte(6); + hnrPVT.day = extractByte(7); + hnrPVT.hour = extractByte(8); + hnrPVT.min = extractByte(9); + hnrPVT.sec = extractByte(10); + hnrPVT.nano = extractSignedLong(12); + hnrPVT.gpsFix = extractByte(16); + hnrPVT.lon = extractSignedLong(20); + hnrPVT.lat = extractSignedLong(24); + hnrPVT.height = extractSignedLong(28); + hnrPVT.hMSL = extractSignedLong(32); + hnrPVT.gSpeed = extractSignedLong(36); + hnrPVT.speed = extractSignedLong(40); + hnrPVT.headMot = extractSignedLong(44); + hnrPVT.headVeh = extractSignedLong(48); + hnrPVT.hAcc = extractLong(52); + hnrPVT.vAcc = extractLong(56); + hnrPVT.sAcc = extractLong(60); + hnrPVT.headAcc = extractLong(64); + + uint8_t valid = extractByte(11); + hnrPVT.validDate = (valid & 0x01) > 0; + hnrPVT.validTime = (valid & 0x02) > 0; + hnrPVT.fullyResolved = (valid & 0x04) > 0; + + uint8_t flags = extractByte(17); + hnrPVT.gpsFixOK = (flags & 0x01) > 0; + hnrPVT.diffSoln = (flags & 0x02) > 0; + hnrPVT.WKNSET = (flags & 0x04) > 0; + hnrPVT.TOWSET = (flags & 0x08) > 0; + hnrPVT.headVehValid = (flags & 0x10) > 0; + + hnrPVTQueried = true; + } + } +} + +//Given a packet and payload, send everything including CRC bytes via I2C port +sfe_ublox_status_e SFE_UBLOX_GPS::sendCommand(ubxPacket *outgoingUBX, uint16_t maxWait) +{ + sfe_ublox_status_e retVal = SFE_UBLOX_STATUS_SUCCESS; + + calcChecksum(outgoingUBX); //Sets checksum A and B bytes of the packet + + if (_printDebug == true) + { + _debugSerial->print(F("\nSending: ")); + printPacket(outgoingUBX); + } + + if (commType == COMM_TYPE_I2C) + { + retVal = sendI2cCommand(outgoingUBX, maxWait); + if (retVal != SFE_UBLOX_STATUS_SUCCESS) + { + if (_printDebug == true) + { + _debugSerial->println(F("Send I2C Command failed")); + } + return retVal; + } + } + else if (commType == COMM_TYPE_SERIAL) + { + sendSerialCommand(outgoingUBX); + } + + if (maxWait > 0) + { + //Depending on what we just sent, either we need to look for an ACK or not + if (outgoingUBX->cls == UBX_CLASS_CFG) + { + if (_printDebug == true) + { + _debugSerial->println(F("sendCommand: Waiting for ACK response")); + } + retVal = waitForACKResponse(outgoingUBX, outgoingUBX->cls, outgoingUBX->id, maxWait); //Wait for Ack response + } + else + { + if (_printDebug == true) + { + _debugSerial->println(F("sendCommand: Waiting for No ACK response")); + } + retVal = waitForNoACKResponse(outgoingUBX, outgoingUBX->cls, outgoingUBX->id, maxWait); //Wait for Ack response + } + } + return retVal; +} + +//Returns false if sensor fails to respond to I2C traffic +sfe_ublox_status_e SFE_UBLOX_GPS::sendI2cCommand(ubxPacket *outgoingUBX, uint16_t maxWait) +{ + //Point at 0xFF data register + _i2cPort->beginTransmission((uint8_t)_gpsI2Caddress); //There is no register to write to, we just begin writing data bytes + _i2cPort->write(0xFF); + if (_i2cPort->endTransmission(false) != 0) //Don't release bus + return (SFE_UBLOX_STATUS_I2C_COMM_FAILURE); //Sensor did not ACK + + //Write header bytes + _i2cPort->beginTransmission((uint8_t)_gpsI2Caddress); //There is no register to write to, we just begin writing data bytes + _i2cPort->write(UBX_SYNCH_1); //Îŧ - oh ublox, you're funny. I will call you micro-blox from now on. + _i2cPort->write(UBX_SYNCH_2); //b + _i2cPort->write(outgoingUBX->cls); + _i2cPort->write(outgoingUBX->id); + _i2cPort->write(outgoingUBX->len & 0xFF); //LSB + _i2cPort->write(outgoingUBX->len >> 8); //MSB + if (_i2cPort->endTransmission(false) != 0) //Do not release bus + return (SFE_UBLOX_STATUS_I2C_COMM_FAILURE); //Sensor did not ACK + + //Write payload. Limit the sends into 32 byte chunks + //This code based on ublox: https://forum.u-blox.com/index.php/20528/how-to-use-i2c-to-get-the-nmea-frames + uint16_t bytesToSend = outgoingUBX->len; + + //"The number of data bytes must be at least 2 to properly distinguish + //from the write access to set the address counter in random read accesses." + uint16_t startSpot = 0; + while (bytesToSend > 1) + { + uint8_t len = bytesToSend; + if (len > i2cTransactionSize) + len = i2cTransactionSize; + + _i2cPort->beginTransmission((uint8_t)_gpsI2Caddress); + //_i2cPort->write(outgoingUBX->payload, len); //Write a portion of the payload to the bus + + for (uint16_t x = 0; x < len; x++) + _i2cPort->write(outgoingUBX->payload[startSpot + x]); //Write a portion of the payload to the bus + + if (_i2cPort->endTransmission(false) != 0) //Don't release bus + return (SFE_UBLOX_STATUS_I2C_COMM_FAILURE); //Sensor did not ACK + + //*outgoingUBX->payload += len; //Move the pointer forward + startSpot += len; //Move the pointer forward + bytesToSend -= len; + } + + //Write checksum + _i2cPort->beginTransmission((uint8_t)_gpsI2Caddress); + if (bytesToSend == 1) + _i2cPort->write(outgoingUBX->payload, 1); + _i2cPort->write(outgoingUBX->checksumA); + _i2cPort->write(outgoingUBX->checksumB); + + //All done transmitting bytes. Release bus. + if (_i2cPort->endTransmission() != 0) + return (SFE_UBLOX_STATUS_I2C_COMM_FAILURE); //Sensor did not ACK + return (SFE_UBLOX_STATUS_SUCCESS); +} + +//Given a packet and payload, send everything including CRC bytesA via Serial port +void SFE_UBLOX_GPS::sendSerialCommand(ubxPacket *outgoingUBX) +{ + //Write header bytes + _serialPort->write(UBX_SYNCH_1); //Îŧ - oh ublox, you're funny. I will call you micro-blox from now on. + _serialPort->write(UBX_SYNCH_2); //b + _serialPort->write(outgoingUBX->cls); + _serialPort->write(outgoingUBX->id); + _serialPort->write(outgoingUBX->len & 0xFF); //LSB + _serialPort->write(outgoingUBX->len >> 8); //MSB + + //Write payload. + for (int i = 0; i < outgoingUBX->len; i++) + { + _serialPort->write(outgoingUBX->payload[i]); + } + + //Write checksum + _serialPort->write(outgoingUBX->checksumA); + _serialPort->write(outgoingUBX->checksumB); +} + +//Returns true if I2C device ack's +boolean SFE_UBLOX_GPS::isConnected(uint16_t maxWait) +{ + if (commType == COMM_TYPE_I2C) + { + _i2cPort->beginTransmission((uint8_t)_gpsI2Caddress); + if (_i2cPort->endTransmission() != 0) + return false; //Sensor did not ack + } + + // Query navigation rate to see whether we get a meaningful response + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_RATE; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + sfe_ublox_status_e result = sendCommand(&packetCfg, maxWait); // Poll the navigation rate + + // In this case, we don't acutally care what the navigation rate is, we're just polling it to indicate a connection. + // So we return true if result is DATA_RECEIVED or DATA_OVERWRITTEN (just in case the RATE was overwritten by an auto packet). + if ((result == SFE_UBLOX_STATUS_DATA_RECEIVED) || (result == SFE_UBLOX_STATUS_DATA_OVERWRITTEN)) + return (true); + else + return (false); +} + +//Given a message, calc and store the two byte "8-Bit Fletcher" checksum over the entirety of the message +//This is called before we send a command message +void SFE_UBLOX_GPS::calcChecksum(ubxPacket *msg) +{ + msg->checksumA = 0; + msg->checksumB = 0; + + msg->checksumA += msg->cls; + msg->checksumB += msg->checksumA; + + msg->checksumA += msg->id; + msg->checksumB += msg->checksumA; + + msg->checksumA += (msg->len & 0xFF); + msg->checksumB += msg->checksumA; + + msg->checksumA += (msg->len >> 8); + msg->checksumB += msg->checksumA; + + for (uint16_t i = 0; i < msg->len; i++) + { + msg->checksumA += msg->payload[i]; + msg->checksumB += msg->checksumA; + } +} + +//Given a message and a byte, add to rolling "8-Bit Fletcher" checksum +//This is used when receiving messages from module +void SFE_UBLOX_GPS::addToChecksum(uint8_t incoming) +{ + rollingChecksumA += incoming; + rollingChecksumB += rollingChecksumA; +} + +//Pretty prints the current ubxPacket +void SFE_UBLOX_GPS::printPacket(ubxPacket *packet) +{ + if (_printDebug == true) + { + _debugSerial->print(F("CLS:")); + if (packet->cls == UBX_CLASS_NAV) //1 + _debugSerial->print(F("NAV")); + else if (packet->cls == UBX_CLASS_ACK) //5 + _debugSerial->print(F("ACK")); + else if (packet->cls == UBX_CLASS_CFG) //6 + _debugSerial->print(F("CFG")); + else if (packet->cls == UBX_CLASS_MON) //0x0A + _debugSerial->print(F("MON")); + else + { + _debugSerial->print(F("0x")); + _debugSerial->print(packet->cls, HEX); + } + + _debugSerial->print(F(" ID:")); + if (packet->cls == UBX_CLASS_NAV && packet->id == UBX_NAV_PVT) + _debugSerial->print(F("PVT")); + else if (packet->cls == UBX_CLASS_CFG && packet->id == UBX_CFG_RATE) + _debugSerial->print(F("RATE")); + else if (packet->cls == UBX_CLASS_CFG && packet->id == UBX_CFG_CFG) + _debugSerial->print(F("SAVE")); + else + { + _debugSerial->print(F("0x")); + _debugSerial->print(packet->id, HEX); + } + + _debugSerial->print(F(" Len: 0x")); + _debugSerial->print(packet->len, HEX); + + // Only print the payload is ignoreThisPayload is false otherwise + // we could be printing gibberish from beyond the end of packetBuf + if (ignoreThisPayload == false) + { + _debugSerial->print(F(" Payload:")); + + for (int x = 0; x < packet->len; x++) + { + _debugSerial->print(F(" ")); + _debugSerial->print(packet->payload[x], HEX); + } + } + else + { + _debugSerial->print(F(" Payload: IGNORED")); + } + _debugSerial->println(); + } +} + +//=-=-=-=-=-=-=-= Specific commands =-=-=-=-=-=-=-==-=-=-=-=-=-=-= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +//When messages from the class CFG are sent to the receiver, the receiver will send an "acknowledge"(UBX - ACK - ACK) or a +//"not acknowledge"(UBX-ACK-NAK) message back to the sender, depending on whether or not the message was processed correctly. +//Some messages from other classes also use the same acknowledgement mechanism. + +//When we poll or get a setting, we will receive _both_ a config packet and an ACK +//If the poll or get request is not valid, we will receive _only_ a NACK + +//If we are trying to get or poll a setting, then packetCfg.len will be 0 or 1 when the packetCfg is _sent_. +//If we poll the setting for a particular port using UBX-CFG-PRT then .len will be 1 initially +//For all other gets or polls, .len will be 0 initially +//(It would be possible for .len to be 2 _if_ we were using UBX-CFG-MSG to poll the settings for a particular message - but we don't use that (currently)) + +//If the get or poll _fails_, i.e. is NACK'd, then packetCfg.len could still be 0 or 1 after the NACK is received +//But if the get or poll is ACK'd, then packetCfg.len will have been updated by the incoming data and will always be at least 2 + +//If we are going to set the value for a setting, then packetCfg.len will be at least 3 when the packetCfg is _sent_. +//(UBX-CFG-MSG appears to have the shortest set length of 3 bytes) + +//We need to think carefully about how interleaved PVT packets affect things. +//It is entirely possible that our packetCfg and packetAck were received successfully +//but while we are still in the "if (checkUblox() == true)" loop a PVT packet is processed +//or _starts_ to arrive (remember that Serial data can arrive very slowly). + +//Returns SFE_UBLOX_STATUS_DATA_RECEIVED if we got an ACK and a valid packetCfg (module is responding with register content) +//Returns SFE_UBLOX_STATUS_DATA_SENT if we got an ACK and no packetCfg (no valid packetCfg needed, module absorbs new register data) +//Returns SFE_UBLOX_STATUS_FAIL if something very bad happens (e.g. a double checksum failure) +//Returns SFE_UBLOX_STATUS_COMMAND_NACK if the packet was not-acknowledged (NACK) +//Returns SFE_UBLOX_STATUS_CRC_FAIL if we had a checksum failure +//Returns SFE_UBLOX_STATUS_TIMEOUT if we timed out +//Returns SFE_UBLOX_STATUS_DATA_OVERWRITTEN if we got an ACK and a valid packetCfg but that the packetCfg has been +// or is currently being overwritten (remember that Serial data can arrive very slowly) +sfe_ublox_status_e SFE_UBLOX_GPS::waitForACKResponse(ubxPacket *outgoingUBX, uint8_t requestedClass, uint8_t requestedID, uint16_t maxTime) +{ + outgoingUBX->valid = SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED; //This will go VALID (or NOT_VALID) when we receive a response to the packet we sent + packetAck.valid = SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED; + packetBuf.valid = SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED; + outgoingUBX->classAndIDmatch = SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED; // This will go VALID (or NOT_VALID) when we receive a packet that matches the requested class and ID + packetAck.classAndIDmatch = SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED; + packetBuf.classAndIDmatch = SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED; + + unsigned long startTime = millis(); + while (millis() - startTime < maxTime) + { + if (checkUbloxInternal(outgoingUBX, requestedClass, requestedID) == true) //See if new data is available. Process bytes as they come in. + { + // If both the outgoingUBX->classAndIDmatch and packetAck.classAndIDmatch are VALID + // and outgoingUBX->valid is _still_ VALID and the class and ID _still_ match + // then we can be confident that the data in outgoingUBX is valid + if ((outgoingUBX->classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_VALID) && (packetAck.classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_VALID) && (outgoingUBX->valid == SFE_UBLOX_PACKET_VALIDITY_VALID) && (outgoingUBX->cls == requestedClass) && (outgoingUBX->id == requestedID)) + { + if (_printDebug == true) + { + _debugSerial->print(F("waitForACKResponse: valid data and valid ACK received after ")); + _debugSerial->print(millis() - startTime); + _debugSerial->println(F(" msec")); + } + return (SFE_UBLOX_STATUS_DATA_RECEIVED); //We received valid data and a correct ACK! + } + + // We can be confident that the data packet (if we are going to get one) will always arrive + // before the matching ACK. So if we sent a config packet which only produces an ACK + // then outgoingUBX->classAndIDmatch will be NOT_DEFINED and the packetAck.classAndIDmatch will VALID. + // We should not check outgoingUBX->valid, outgoingUBX->cls or outgoingUBX->id + // as these may have been changed by a PVT packet. + else if ((outgoingUBX->classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED) && (packetAck.classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_VALID)) + { + if (_printDebug == true) + { + _debugSerial->print(F("waitForACKResponse: no data and valid ACK after ")); + _debugSerial->print(millis() - startTime); + _debugSerial->println(F(" msec")); + } + return (SFE_UBLOX_STATUS_DATA_SENT); //We got an ACK but no data... + } + + // If both the outgoingUBX->classAndIDmatch and packetAck.classAndIDmatch are VALID + // but the outgoingUBX->cls or ID no longer match then we can be confident that we had + // valid data but it has been or is currently being overwritten by another packet (e.g. PVT). + // If (e.g.) a PVT packet is _being_ received: outgoingUBX->valid will be NOT_DEFINED + // If (e.g.) a PVT packet _has been_ received: outgoingUBX->valid will be VALID (or just possibly NOT_VALID) + // So we cannot use outgoingUBX->valid as part of this check. + // Note: the addition of packetBuf should make this check redundant! + else if ((outgoingUBX->classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_VALID) && (packetAck.classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_VALID) && ((outgoingUBX->cls != requestedClass) || (outgoingUBX->id != requestedID))) + { + if (_printDebug == true) + { + _debugSerial->print(F("waitForACKResponse: data being OVERWRITTEN after ")); + _debugSerial->print(millis() - startTime); + _debugSerial->println(F(" msec")); + } + return (SFE_UBLOX_STATUS_DATA_OVERWRITTEN); // Data was valid but has been or is being overwritten + } + + // If packetAck.classAndIDmatch is VALID but both outgoingUBX->valid and outgoingUBX->classAndIDmatch + // are NOT_VALID then we can be confident we have had a checksum failure on the data packet + else if ((packetAck.classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_VALID) && (outgoingUBX->classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_NOT_VALID) && (outgoingUBX->valid == SFE_UBLOX_PACKET_VALIDITY_NOT_VALID)) + { + if (_printDebug == true) + { + _debugSerial->print(F("waitForACKResponse: CRC failed after ")); + _debugSerial->print(millis() - startTime); + _debugSerial->println(F(" msec")); + } + return (SFE_UBLOX_STATUS_CRC_FAIL); //Checksum fail + } + + // If our packet was not-acknowledged (NACK) we do not receive a data packet - we only get the NACK. + // So you would expect outgoingUBX->valid and outgoingUBX->classAndIDmatch to still be NOT_DEFINED + // But if a full PVT packet arrives afterwards outgoingUBX->valid could be VALID (or just possibly NOT_VALID) + // but outgoingUBX->cls and outgoingUBX->id would not match... + // So I think this is telling us we need a special state for packetAck.classAndIDmatch to tell us + // the packet was definitely NACK'd otherwise we are possibly just guessing... + // Note: the addition of packetBuf changes the logic of this, but we'll leave the code as is for now. + else if (packetAck.classAndIDmatch == SFE_UBLOX_PACKET_NOTACKNOWLEDGED) + { + if (_printDebug == true) + { + _debugSerial->print(F("waitForACKResponse: data was NOTACKNOWLEDGED (NACK) after ")); + _debugSerial->print(millis() - startTime); + _debugSerial->println(F(" msec")); + } + return (SFE_UBLOX_STATUS_COMMAND_NACK); //We received a NACK! + } + + // If the outgoingUBX->classAndIDmatch is VALID but the packetAck.classAndIDmatch is NOT_VALID + // then the ack probably had a checksum error. We will take a gamble and return DATA_RECEIVED. + // If we were playing safe, we should return FAIL instead + else if ((outgoingUBX->classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_VALID) && (packetAck.classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_NOT_VALID) && (outgoingUBX->valid == SFE_UBLOX_PACKET_VALIDITY_VALID) && (outgoingUBX->cls == requestedClass) && (outgoingUBX->id == requestedID)) + { + if (_printDebug == true) + { + _debugSerial->print(F("waitForACKResponse: VALID data and INVALID ACK received after ")); + _debugSerial->print(millis() - startTime); + _debugSerial->println(F(" msec")); + } + return (SFE_UBLOX_STATUS_DATA_RECEIVED); //We received valid data and an invalid ACK! + } + + // If the outgoingUBX->classAndIDmatch is NOT_VALID and the packetAck.classAndIDmatch is NOT_VALID + // then we return a FAIL. This must be a double checksum failure? + else if ((outgoingUBX->classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_NOT_VALID) && (packetAck.classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_NOT_VALID)) + { + if (_printDebug == true) + { + _debugSerial->print(F("waitForACKResponse: INVALID data and INVALID ACK received after ")); + _debugSerial->print(millis() - startTime); + _debugSerial->println(F(" msec")); + } + return (SFE_UBLOX_STATUS_FAIL); //We received invalid data and an invalid ACK! + } + + // If the outgoingUBX->classAndIDmatch is VALID and the packetAck.classAndIDmatch is NOT_DEFINED + // then the ACK has not yet been received and we should keep waiting for it + else if ((outgoingUBX->classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_VALID) && (packetAck.classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED)) + { + if (_printDebug == true) + { + _debugSerial->print(F("waitForACKResponse: valid data after ")); + _debugSerial->print(millis() - startTime); + _debugSerial->println(F(" msec. Waiting for ACK.")); + } + } + + } //checkUbloxInternal == true + + delayMicroseconds(500); + } //while (millis() - startTime < maxTime) + + // We have timed out... + // If the outgoingUBX->classAndIDmatch is VALID then we can take a gamble and return DATA_RECEIVED + // even though we did not get an ACK + if ((outgoingUBX->classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_VALID) && (packetAck.classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED) && (outgoingUBX->valid == SFE_UBLOX_PACKET_VALIDITY_VALID) && (outgoingUBX->cls == requestedClass) && (outgoingUBX->id == requestedID)) + { + if (_printDebug == true) + { + _debugSerial->print(F("waitForACKResponse: TIMEOUT with valid data after ")); + _debugSerial->print(millis() - startTime); + _debugSerial->println(F(" msec. ")); + } + return (SFE_UBLOX_STATUS_DATA_RECEIVED); //We received valid data... But no ACK! + } + + if (_printDebug == true) + { + _debugSerial->print(F("waitForACKResponse: TIMEOUT after ")); + _debugSerial->print(millis() - startTime); + _debugSerial->println(F(" msec.")); + } + + return (SFE_UBLOX_STATUS_TIMEOUT); +} + +//For non-CFG queries no ACK is sent so we use this function +//Returns SFE_UBLOX_STATUS_DATA_RECEIVED if we got a config packet full of response data that has CLS/ID match to our query packet +//Returns SFE_UBLOX_STATUS_CRC_FAIL if we got a corrupt config packet that has CLS/ID match to our query packet +//Returns SFE_UBLOX_STATUS_TIMEOUT if we timed out +//Returns SFE_UBLOX_STATUS_DATA_OVERWRITTEN if we got an a valid packetCfg but that the packetCfg has been +// or is currently being overwritten (remember that Serial data can arrive very slowly) +sfe_ublox_status_e SFE_UBLOX_GPS::waitForNoACKResponse(ubxPacket *outgoingUBX, uint8_t requestedClass, uint8_t requestedID, uint16_t maxTime) +{ + outgoingUBX->valid = SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED; //This will go VALID (or NOT_VALID) when we receive a response to the packet we sent + packetAck.valid = SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED; + packetBuf.valid = SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED; + outgoingUBX->classAndIDmatch = SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED; // This will go VALID (or NOT_VALID) when we receive a packet that matches the requested class and ID + packetAck.classAndIDmatch = SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED; + packetBuf.classAndIDmatch = SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED; + + unsigned long startTime = millis(); + while (millis() - startTime < maxTime) + { + if (checkUbloxInternal(outgoingUBX, requestedClass, requestedID) == true) //See if new data is available. Process bytes as they come in. + { + + // If outgoingUBX->classAndIDmatch is VALID + // and outgoingUBX->valid is _still_ VALID and the class and ID _still_ match + // then we can be confident that the data in outgoingUBX is valid + if ((outgoingUBX->classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_VALID) && (outgoingUBX->valid == SFE_UBLOX_PACKET_VALIDITY_VALID) && (outgoingUBX->cls == requestedClass) && (outgoingUBX->id == requestedID)) + { + if (_printDebug == true) + { + _debugSerial->print(F("waitForNoACKResponse: valid data with CLS/ID match after ")); + _debugSerial->print(millis() - startTime); + _debugSerial->println(F(" msec")); + } + return (SFE_UBLOX_STATUS_DATA_RECEIVED); //We received valid data! + } + + // If the outgoingUBX->classAndIDmatch is VALID + // but the outgoingUBX->cls or ID no longer match then we can be confident that we had + // valid data but it has been or is currently being overwritten by another packet (e.g. PVT). + // If (e.g.) a PVT packet is _being_ received: outgoingUBX->valid will be NOT_DEFINED + // If (e.g.) a PVT packet _has been_ received: outgoingUBX->valid will be VALID (or just possibly NOT_VALID) + // So we cannot use outgoingUBX->valid as part of this check. + // Note: the addition of packetBuf should make this check redundant! + else if ((outgoingUBX->classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_VALID) && ((outgoingUBX->cls != requestedClass) || (outgoingUBX->id != requestedID))) + { + if (_printDebug == true) + { + _debugSerial->print(F("waitForNoACKResponse: data being OVERWRITTEN after ")); + _debugSerial->print(millis() - startTime); + _debugSerial->println(F(" msec")); + } + return (SFE_UBLOX_STATUS_DATA_OVERWRITTEN); // Data was valid but has been or is being overwritten + } + + // If outgoingUBX->classAndIDmatch is NOT_DEFINED + // and outgoingUBX->valid is VALID then this must be (e.g.) a PVT packet + else if ((outgoingUBX->classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED) && (outgoingUBX->valid == SFE_UBLOX_PACKET_VALIDITY_VALID)) + { + // if (_printDebug == true) + // { + // _debugSerial->print(F("waitForNoACKResponse: valid but UNWANTED data after ")); + // _debugSerial->print(millis() - startTime); + // _debugSerial->print(F(" msec. Class: ")); + // _debugSerial->print(outgoingUBX->cls); + // _debugSerial->print(F(" ID: ")); + // _debugSerial->print(outgoingUBX->id); + // } + } + + // If the outgoingUBX->classAndIDmatch is NOT_VALID then we return CRC failure + else if (outgoingUBX->classAndIDmatch == SFE_UBLOX_PACKET_VALIDITY_NOT_VALID) + { + if (_printDebug == true) + { + _debugSerial->print(F("waitForNoACKResponse: CLS/ID match but failed CRC after ")); + _debugSerial->print(millis() - startTime); + _debugSerial->println(F(" msec")); + } + return (SFE_UBLOX_STATUS_CRC_FAIL); //We received invalid data + } + } + + delayMicroseconds(500); + } + + if (_printDebug == true) + { + _debugSerial->print(F("waitForNoACKResponse: TIMEOUT after ")); + _debugSerial->print(millis() - startTime); + _debugSerial->println(F(" msec. No packet received.")); + } + + return (SFE_UBLOX_STATUS_TIMEOUT); +} + +//Save current configuration to flash and BBR (battery backed RAM) +//This still works but it is the old way of configuring ublox modules. See getVal and setVal for the new methods +boolean SFE_UBLOX_GPS::saveConfiguration(uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_CFG; + packetCfg.len = 12; + packetCfg.startingSpot = 0; + + //Clear packet payload + for (uint8_t x = 0; x < packetCfg.len; x++) + packetCfg.payload[x] = 0; + + packetCfg.payload[4] = 0xFF; //Set any bit in the saveMask field to save current config to Flash and BBR + packetCfg.payload[5] = 0xFF; + + return (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Save the selected configuration sub-sections to flash and BBR (battery backed RAM) +//This still works but it is the old way of configuring ublox modules. See getVal and setVal for the new methods +boolean SFE_UBLOX_GPS::saveConfigSelective(uint32_t configMask, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_CFG; + packetCfg.len = 12; + packetCfg.startingSpot = 0; + + //Clear packet payload + for (uint8_t x = 0; x < packetCfg.len; x++) + packetCfg.payload[x] = 0; + + packetCfg.payload[4] = configMask & 0xFF; //Set the appropriate bits in the saveMask field to save current config to Flash and BBR + packetCfg.payload[5] = (configMask >> 8) & 0xFF; + packetCfg.payload[6] = (configMask >> 16) & 0xFF; + packetCfg.payload[7] = (configMask >> 24) & 0xFF; + + return (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Reset module to factory defaults +//This still works but it is the old way of configuring ublox modules. See getVal and setVal for the new methods +boolean SFE_UBLOX_GPS::factoryDefault(uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_CFG; + packetCfg.len = 12; + packetCfg.startingSpot = 0; + + //Clear packet payload + for (uint8_t x = 0; x < packetCfg.len; x++) + packetCfg.payload[x] = 0; + + packetCfg.payload[0] = 0xFF; //Set any bit in the clearMask field to clear saved config + packetCfg.payload[1] = 0xFF; + packetCfg.payload[8] = 0xFF; //Set any bit in the loadMask field to discard current config and rebuild from lower non-volatile memory layers + packetCfg.payload[9] = 0xFF; + + return (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Given a key, load the payload with data that can then be extracted to 8, 16, or 32 bits +//This function takes a full 32-bit key +//Default layer is RAM +//Configuration of modern u-blox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P +sfe_ublox_status_e SFE_UBLOX_GPS::getVal(uint32_t key, uint8_t layer, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_VALGET; + packetCfg.len = 4 + 4 * 1; //While multiple keys are allowed, we will send only one key at a time + packetCfg.startingSpot = 0; + + //Clear packet payload + for (uint8_t x = 0; x < packetCfg.len; x++) + packetCfg.payload[x] = 0; + + //VALGET uses different memory layer definitions to VALSET + //because it can only return the value for one layer. + //So we need to fiddle the layer here. + //And just to complicate things further, the ZED-F9P only responds + //correctly to layer 0 (RAM) and layer 7 (Default)! + uint8_t getLayer = 7; // 7 is the "Default Layer" + if ((layer & VAL_LAYER_RAM) == VAL_LAYER_RAM) // Did the user request the RAM layer? + { + getLayer = 0; // Layer 0 is RAM + } + + payloadCfg[0] = 0; //Message Version - set to 0 + payloadCfg[1] = getLayer; //Layer + + //Load key into outgoing payload + payloadCfg[4] = key >> 8 * 0; //Key LSB + payloadCfg[5] = key >> 8 * 1; + payloadCfg[6] = key >> 8 * 2; + payloadCfg[7] = key >> 8 * 3; + + if (_printDebug == true) + { + _debugSerial->print(F("key: 0x")); + _debugSerial->print(key, HEX); + _debugSerial->println(); + } + + //Send VALGET command with this key + + sfe_ublox_status_e retVal = sendCommand(&packetCfg, maxWait); + if (_printDebug == true) + { + _debugSerial->print(F("getVal: sendCommand returned: ")); + _debugSerial->println(statusString(retVal)); + } + + //Verify the response is the correct length as compared to what the user called (did the module respond with 8-bits but the user called getVal32?) + //Response is 8 bytes plus cfg data + //if(packet->len > 8+1) + + //The response is now sitting in payload, ready for extraction + return (retVal); +} + +//Given a key, return its value +//This function takes a full 32-bit key +//Default layer is RAM +//Configuration of modern Ublox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P +uint8_t SFE_UBLOX_GPS::getVal8(uint32_t key, uint8_t layer, uint16_t maxWait) +{ + if (getVal(key, layer, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) + return (0); + + return (extractByte(8)); +} +uint16_t SFE_UBLOX_GPS::getVal16(uint32_t key, uint8_t layer, uint16_t maxWait) +{ + if (getVal(key, layer, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) + return (0); + + return (extractInt(8)); +} +uint32_t SFE_UBLOX_GPS::getVal32(uint32_t key, uint8_t layer, uint16_t maxWait) +{ + if (getVal(key, layer, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) + return (0); + + return (extractLong(8)); +} + +//Form 32-bit key from group/id/size +uint32_t SFE_UBLOX_GPS::createKey(uint16_t group, uint16_t id, uint8_t size) +{ + uint32_t key = 0; + key |= (uint32_t)id; + key |= (uint32_t)group << 16; + key |= (uint32_t)size << 28; + return (key); +} + +//Given a group, ID and size, return the value of this config spot +//The 32-bit key is put together from group/ID/size. See other getVal to send key directly. +//Configuration of modern Ublox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P +uint8_t SFE_UBLOX_GPS::getVal8(uint16_t group, uint16_t id, uint8_t size, uint8_t layer, uint16_t maxWait) +{ + uint32_t key = createKey(group, id, size); + return getVal8(key, layer, maxWait); +} +uint16_t SFE_UBLOX_GPS::getVal16(uint16_t group, uint16_t id, uint8_t size, uint8_t layer, uint16_t maxWait) +{ + uint32_t key = createKey(group, id, size); + return getVal16(key, layer, maxWait); +} +uint32_t SFE_UBLOX_GPS::getVal32(uint16_t group, uint16_t id, uint8_t size, uint8_t layer, uint16_t maxWait) +{ + uint32_t key = createKey(group, id, size); + return getVal32(key, layer, maxWait); +} + +//Given a key, set a 16-bit value +//This function takes a full 32-bit key +//Default layer is all: RAM+BBR+Flash +//Configuration of modern Ublox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P +uint8_t SFE_UBLOX_GPS::setVal(uint32_t key, uint16_t value, uint8_t layer, uint16_t maxWait) +{ + return setVal16(key, value, layer, maxWait); +} + +//Given a key, set a 16-bit value +//This function takes a full 32-bit key +//Default layer is all: RAM+BBR+Flash +//Configuration of modern Ublox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P +uint8_t SFE_UBLOX_GPS::setVal16(uint32_t key, uint16_t value, uint8_t layer, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_VALSET; + packetCfg.len = 4 + 4 + 2; //4 byte header, 4 byte key ID, 2 bytes of value + packetCfg.startingSpot = 0; + + //Clear packet payload + for (uint16_t x = 0; x < packetCfg.len; x++) + packetCfg.payload[x] = 0; + + payloadCfg[0] = 0; //Message Version - set to 0 + payloadCfg[1] = layer; //By default we ask for the BBR layer + + //Load key into outgoing payload + payloadCfg[4] = key >> 8 * 0; //Key LSB + payloadCfg[5] = key >> 8 * 1; + payloadCfg[6] = key >> 8 * 2; + payloadCfg[7] = key >> 8 * 3; + + //Load user's value + payloadCfg[8] = value >> 8 * 0; //Value LSB + payloadCfg[9] = value >> 8 * 1; + + //Send VALSET command with this key and value + return (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Given a key, set an 8-bit value +//This function takes a full 32-bit key +//Default layer is all: RAM+BBR+Flash +//Configuration of modern Ublox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P +uint8_t SFE_UBLOX_GPS::setVal8(uint32_t key, uint8_t value, uint8_t layer, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_VALSET; + packetCfg.len = 4 + 4 + 1; //4 byte header, 4 byte key ID, 1 byte value + packetCfg.startingSpot = 0; + + //Clear packet payload + for (uint16_t x = 0; x < packetCfg.len; x++) + packetCfg.payload[x] = 0; + + payloadCfg[0] = 0; //Message Version - set to 0 + payloadCfg[1] = layer; //By default we ask for the BBR layer + + //Load key into outgoing payload + payloadCfg[4] = key >> 8 * 0; //Key LSB + payloadCfg[5] = key >> 8 * 1; + payloadCfg[6] = key >> 8 * 2; + payloadCfg[7] = key >> 8 * 3; + + //Load user's value + payloadCfg[8] = value; //Value + + //Send VALSET command with this key and value + return (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Given a key, set a 32-bit value +//This function takes a full 32-bit key +//Default layer is all: RAM+BBR+Flash +//Configuration of modern Ublox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P +uint8_t SFE_UBLOX_GPS::setVal32(uint32_t key, uint32_t value, uint8_t layer, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_VALSET; + packetCfg.len = 4 + 4 + 4; //4 byte header, 4 byte key ID, 4 bytes of value + packetCfg.startingSpot = 0; + + //Clear packet payload + for (uint16_t x = 0; x < packetCfg.len; x++) + packetCfg.payload[x] = 0; + + payloadCfg[0] = 0; //Message Version - set to 0 + payloadCfg[1] = layer; //By default we ask for the BBR layer + + //Load key into outgoing payload + payloadCfg[4] = key >> 8 * 0; //Key LSB + payloadCfg[5] = key >> 8 * 1; + payloadCfg[6] = key >> 8 * 2; + payloadCfg[7] = key >> 8 * 3; + + //Load user's value + payloadCfg[8] = value >> 8 * 0; //Value LSB + payloadCfg[9] = value >> 8 * 1; + payloadCfg[10] = value >> 8 * 2; + payloadCfg[11] = value >> 8 * 3; + + //Send VALSET command with this key and value + return (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Start defining a new UBX-CFG-VALSET ubxPacket +//This function takes a full 32-bit key and 32-bit value +//Default layer is BBR +//Configuration of modern u-blox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P +uint8_t SFE_UBLOX_GPS::newCfgValset32(uint32_t key, uint32_t value, uint8_t layer) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_VALSET; + packetCfg.len = 4 + 4 + 4; //4 byte header, 4 byte key ID, 4 bytes of value + packetCfg.startingSpot = 0; + + //Clear packet payload + for (uint16_t x = 0; x < MAX_PAYLOAD_SIZE; x++) + packetCfg.payload[x] = 0; + + payloadCfg[0] = 0; //Message Version - set to 0 + payloadCfg[1] = layer; //By default we ask for the BBR layer + + //Load key into outgoing payload + payloadCfg[4] = key >> 8 * 0; //Key LSB + payloadCfg[5] = key >> 8 * 1; + payloadCfg[6] = key >> 8 * 2; + payloadCfg[7] = key >> 8 * 3; + + //Load user's value + payloadCfg[8] = value >> 8 * 0; //Value LSB + payloadCfg[9] = value >> 8 * 1; + payloadCfg[10] = value >> 8 * 2; + payloadCfg[11] = value >> 8 * 3; + + //All done + return (true); +} + +//Start defining a new UBX-CFG-VALSET ubxPacket +//This function takes a full 32-bit key and 16-bit value +//Default layer is BBR +//Configuration of modern u-blox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P +uint8_t SFE_UBLOX_GPS::newCfgValset16(uint32_t key, uint16_t value, uint8_t layer) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_VALSET; + packetCfg.len = 4 + 4 + 2; //4 byte header, 4 byte key ID, 2 bytes of value + packetCfg.startingSpot = 0; + + //Clear packet payload + for (uint16_t x = 0; x < MAX_PAYLOAD_SIZE; x++) + packetCfg.payload[x] = 0; + + payloadCfg[0] = 0; //Message Version - set to 0 + payloadCfg[1] = layer; //By default we ask for the BBR layer + + //Load key into outgoing payload + payloadCfg[4] = key >> 8 * 0; //Key LSB + payloadCfg[5] = key >> 8 * 1; + payloadCfg[6] = key >> 8 * 2; + payloadCfg[7] = key >> 8 * 3; + + //Load user's value + payloadCfg[8] = value >> 8 * 0; //Value LSB + payloadCfg[9] = value >> 8 * 1; + + //All done + return (true); +} + +//Start defining a new UBX-CFG-VALSET ubxPacket +//This function takes a full 32-bit key and 8-bit value +//Default layer is BBR +//Configuration of modern u-blox modules is now done via getVal/setVal/delVal, ie protocol v27 and above found on ZED-F9P +uint8_t SFE_UBLOX_GPS::newCfgValset8(uint32_t key, uint8_t value, uint8_t layer) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_VALSET; + packetCfg.len = 4 + 4 + 1; //4 byte header, 4 byte key ID, 1 byte value + packetCfg.startingSpot = 0; + + //Clear packet payload + for (uint16_t x = 0; x < MAX_PAYLOAD_SIZE; x++) + packetCfg.payload[x] = 0; + + payloadCfg[0] = 0; //Message Version - set to 0 + payloadCfg[1] = layer; //By default we ask for the BBR layer + + //Load key into outgoing payload + payloadCfg[4] = key >> 8 * 0; //Key LSB + payloadCfg[5] = key >> 8 * 1; + payloadCfg[6] = key >> 8 * 2; + payloadCfg[7] = key >> 8 * 3; + + //Load user's value + payloadCfg[8] = value; //Value + + //All done + return (true); +} + +//Add another keyID and value to an existing UBX-CFG-VALSET ubxPacket +//This function takes a full 32-bit key and 32-bit value +uint8_t SFE_UBLOX_GPS::addCfgValset32(uint32_t key, uint32_t value) +{ + //Load key into outgoing payload + payloadCfg[packetCfg.len + 0] = key >> 8 * 0; //Key LSB + payloadCfg[packetCfg.len + 1] = key >> 8 * 1; + payloadCfg[packetCfg.len + 2] = key >> 8 * 2; + payloadCfg[packetCfg.len + 3] = key >> 8 * 3; + + //Load user's value + payloadCfg[packetCfg.len + 4] = value >> 8 * 0; //Value LSB + payloadCfg[packetCfg.len + 5] = value >> 8 * 1; + payloadCfg[packetCfg.len + 6] = value >> 8 * 2; + payloadCfg[packetCfg.len + 7] = value >> 8 * 3; + + //Update packet length: 4 byte key ID, 4 bytes of value + packetCfg.len = packetCfg.len + 4 + 4; + + //All done + return (true); +} + +//Add another keyID and value to an existing UBX-CFG-VALSET ubxPacket +//This function takes a full 32-bit key and 16-bit value +uint8_t SFE_UBLOX_GPS::addCfgValset16(uint32_t key, uint16_t value) +{ + //Load key into outgoing payload + payloadCfg[packetCfg.len + 0] = key >> 8 * 0; //Key LSB + payloadCfg[packetCfg.len + 1] = key >> 8 * 1; + payloadCfg[packetCfg.len + 2] = key >> 8 * 2; + payloadCfg[packetCfg.len + 3] = key >> 8 * 3; + + //Load user's value + payloadCfg[packetCfg.len + 4] = value >> 8 * 0; //Value LSB + payloadCfg[packetCfg.len + 5] = value >> 8 * 1; + + //Update packet length: 4 byte key ID, 2 bytes of value + packetCfg.len = packetCfg.len + 4 + 2; + + //All done + return (true); +} + +//Add another keyID and value to an existing UBX-CFG-VALSET ubxPacket +//This function takes a full 32-bit key and 8-bit value +uint8_t SFE_UBLOX_GPS::addCfgValset8(uint32_t key, uint8_t value) +{ + //Load key into outgoing payload + payloadCfg[packetCfg.len + 0] = key >> 8 * 0; //Key LSB + payloadCfg[packetCfg.len + 1] = key >> 8 * 1; + payloadCfg[packetCfg.len + 2] = key >> 8 * 2; + payloadCfg[packetCfg.len + 3] = key >> 8 * 3; + + //Load user's value + payloadCfg[packetCfg.len + 4] = value; //Value + + //Update packet length: 4 byte key ID, 1 byte value + packetCfg.len = packetCfg.len + 4 + 1; + + //All done + return (true); +} + +//Add a final keyID and value to an existing UBX-CFG-VALSET ubxPacket and send it +//This function takes a full 32-bit key and 32-bit value +uint8_t SFE_UBLOX_GPS::sendCfgValset32(uint32_t key, uint32_t value, uint16_t maxWait) +{ + //Load keyID and value into outgoing payload + addCfgValset32(key, value); + + //Send VALSET command with this key and value + return (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Add a final keyID and value to an existing UBX-CFG-VALSET ubxPacket and send it +//This function takes a full 32-bit key and 16-bit value +uint8_t SFE_UBLOX_GPS::sendCfgValset16(uint32_t key, uint16_t value, uint16_t maxWait) +{ + //Load keyID and value into outgoing payload + addCfgValset16(key, value); + + //Send VALSET command with this key and value + return (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Add a final keyID and value to an existing UBX-CFG-VALSET ubxPacket and send it +//This function takes a full 32-bit key and 8-bit value +uint8_t SFE_UBLOX_GPS::sendCfgValset8(uint32_t key, uint8_t value, uint16_t maxWait) +{ + //Load keyID and value into outgoing payload + addCfgValset8(key, value); + + //Send VALSET command with this key and value + return (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Get the current TimeMode3 settings - these contain survey in statuses +boolean SFE_UBLOX_GPS::getSurveyMode(uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_TMODE3; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + return ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_RECEIVED); // We are expecting data and an ACK +} + +//Control Survey-In for NEO-M8P +boolean SFE_UBLOX_GPS::setSurveyMode(uint8_t mode, uint16_t observationTime, float requiredAccuracy, uint16_t maxWait) +{ + if (getSurveyMode(maxWait) == false) //Ask module for the current TimeMode3 settings. Loads into payloadCfg. + return (false); + + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_TMODE3; + packetCfg.len = 40; + packetCfg.startingSpot = 0; + + //Clear packet payload + for (uint8_t x = 0; x < packetCfg.len; x++) + packetCfg.payload[x] = 0; + + //payloadCfg should be loaded with poll response. Now modify only the bits we care about + payloadCfg[2] = mode; //Set mode. Survey-In and Disabled are most common. Use ECEF (not LAT/LON/ALT). + + //svinMinDur is U4 (uint32_t) but we'll only use a uint16_t (waiting more than 65535 seconds seems excessive!) + payloadCfg[24] = observationTime & 0xFF; //svinMinDur in seconds + payloadCfg[25] = observationTime >> 8; //svinMinDur in seconds + payloadCfg[26] = 0; //Truncate to 16 bits + payloadCfg[27] = 0; //Truncate to 16 bits + + //svinAccLimit is U4 (uint32_t) in 0.1mm. + uint32_t svinAccLimit = (uint32_t)(requiredAccuracy * 10000.0); //Convert m to 0.1mm + payloadCfg[28] = svinAccLimit & 0xFF; //svinAccLimit in 0.1mm increments + payloadCfg[29] = svinAccLimit >> 8; + payloadCfg[30] = svinAccLimit >> 16; + payloadCfg[31] = svinAccLimit >> 24; + + return ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Begin Survey-In for NEO-M8P +boolean SFE_UBLOX_GPS::enableSurveyMode(uint16_t observationTime, float requiredAccuracy, uint16_t maxWait) +{ + return (setSurveyMode(SVIN_MODE_ENABLE, observationTime, requiredAccuracy, maxWait)); +} + +//Stop Survey-In for NEO-M8P +boolean SFE_UBLOX_GPS::disableSurveyMode(uint16_t maxWait) +{ + return (setSurveyMode(SVIN_MODE_DISABLE, 0, 0, maxWait)); +} + +//Reads survey in status and sets the global variables +//for status, position valid, observation time, and mean 3D StdDev +//Returns true if commands was successful +boolean SFE_UBLOX_GPS::getSurveyStatus(uint16_t maxWait) +{ + //Reset variables + svin.active = false; + svin.valid = false; + svin.observationTime = 0; + svin.meanAccuracy = 0; + + packetCfg.cls = UBX_CLASS_NAV; + packetCfg.id = UBX_NAV_SVIN; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + if ((sendCommand(&packetCfg, maxWait)) != SFE_UBLOX_STATUS_DATA_RECEIVED) // We are expecting data and an ACK + return (false); //If command send fails then bail + + //We got a response, now parse the bits into the svin structure + + //dur (Passed survey-in observation time) is U4 (uint32_t) seconds. We truncate to 16 bits + //(waiting more than 65535 seconds (18.2 hours) seems excessive!) + uint32_t tmpObsTime = extractLong(8); + if (tmpObsTime <= 0xFFFF) + { + svin.observationTime = (uint16_t)tmpObsTime; + } + else + { + svin.observationTime = 0xFFFF; + } + + // meanAcc is U4 (uint32_t) in 0.1mm. We convert this to float. + uint32_t tempFloat = extractLong(28); + svin.meanAccuracy = ((float)tempFloat) / 10000.0; //Convert 0.1mm to m + + svin.valid = payloadCfg[36]; //1 if survey-in position is valid, 0 otherwise + svin.active = payloadCfg[37]; //1 if survey-in in progress, 0 otherwise + + return (true); +} + +//Loads the payloadCfg array with the current protocol bits located the UBX-CFG-PRT register for a given port +boolean SFE_UBLOX_GPS::getPortSettings(uint8_t portID, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_PRT; + packetCfg.len = 1; + packetCfg.startingSpot = 0; + + payloadCfg[0] = portID; + + return ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_RECEIVED); // We are expecting data and an ACK +} + +//Configure a given port to output UBX, NMEA, RTCM3 or a combination thereof +//Port 0=I2c, 1=UART1, 2=UART2, 3=USB, 4=SPI +//Bit:0 = UBX, :1=NMEA, :5=RTCM3 +boolean SFE_UBLOX_GPS::setPortOutput(uint8_t portID, uint8_t outStreamSettings, uint16_t maxWait) +{ + //Get the current config values for this port ID + if (getPortSettings(portID, maxWait) == false) + return (false); //Something went wrong. Bail. + + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_PRT; + packetCfg.len = 20; + packetCfg.startingSpot = 0; + + //payloadCfg is now loaded with current bytes. Change only the ones we need to + payloadCfg[14] = outStreamSettings; //OutProtocolMask LSB - Set outStream bits + + return ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Configure a given port to input UBX, NMEA, RTCM3 or a combination thereof +//Port 0=I2c, 1=UART1, 2=UART2, 3=USB, 4=SPI +//Bit:0 = UBX, :1=NMEA, :5=RTCM3 +boolean SFE_UBLOX_GPS::setPortInput(uint8_t portID, uint8_t inStreamSettings, uint16_t maxWait) +{ + //Get the current config values for this port ID + //This will load the payloadCfg array with current port settings + if (getPortSettings(portID, maxWait) == false) + return (false); //Something went wrong. Bail. + + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_PRT; + packetCfg.len = 20; + packetCfg.startingSpot = 0; + + //payloadCfg is now loaded with current bytes. Change only the ones we need to + payloadCfg[12] = inStreamSettings; //InProtocolMask LSB - Set inStream bits + + return ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Configure a port to output UBX, NMEA, RTCM3 or a combination thereof +boolean SFE_UBLOX_GPS::setI2COutput(uint8_t comSettings, uint16_t maxWait) +{ + return (setPortOutput(COM_PORT_I2C, comSettings, maxWait)); +} +boolean SFE_UBLOX_GPS::setUART1Output(uint8_t comSettings, uint16_t maxWait) +{ + return (setPortOutput(COM_PORT_UART1, comSettings, maxWait)); +} +boolean SFE_UBLOX_GPS::setUART2Output(uint8_t comSettings, uint16_t maxWait) +{ + return (setPortOutput(COM_PORT_UART2, comSettings, maxWait)); +} +boolean SFE_UBLOX_GPS::setUSBOutput(uint8_t comSettings, uint16_t maxWait) +{ + return (setPortOutput(COM_PORT_USB, comSettings, maxWait)); +} +boolean SFE_UBLOX_GPS::setSPIOutput(uint8_t comSettings, uint16_t maxWait) +{ + return (setPortOutput(COM_PORT_SPI, comSettings, maxWait)); +} + +//Set the rate at which the module will give us an updated navigation solution +//Expects a number that is the updates per second. For example 1 = 1Hz, 2 = 2Hz, etc. +//Max is 40Hz(?!) +boolean SFE_UBLOX_GPS::setNavigationFrequency(uint8_t navFreq, uint16_t maxWait) +{ + //if(updateRate > 40) updateRate = 40; //Not needed: module will correct out of bounds values + + //Adjust the I2C polling timeout based on update rate + i2cPollingWait = 1000 / (((int)navFreq) * 4); //This is the number of ms to wait between checks for new I2C data + + //Query the module for the latest lat/long + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_RATE; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + //This will load the payloadCfg array with current settings of the given register + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) // We are expecting data and an ACK + return (false); //If command send fails then bail + + uint16_t measurementRate = 1000 / navFreq; + + //payloadCfg is now loaded with current bytes. Change only the ones we need to + payloadCfg[0] = measurementRate & 0xFF; //measRate LSB + payloadCfg[1] = measurementRate >> 8; //measRate MSB + + return ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Get the rate at which the module is outputting nav solutions +uint8_t SFE_UBLOX_GPS::getNavigationFrequency(uint16_t maxWait) +{ + //Query the module for the latest lat/long + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_RATE; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + //This will load the payloadCfg array with current settings of the given register + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) // We are expecting data and an ACK + return (false); //If command send fails then bail + + //payloadCfg is now loaded with current bytes. Get what we need + uint16_t measurementRate = extractInt(0); //Pull from payloadCfg at measRate LSB + + measurementRate = 1000 / measurementRate; //This may return an int when it's a float, but I'd rather not return 4 bytes + return (measurementRate); +} + +//In case no config access to the GPS is possible and PVT is send cyclically already +//set config to suitable parameters +boolean SFE_UBLOX_GPS::assumeAutoPVT(boolean enabled, boolean implicitUpdate) +{ + boolean changes = autoPVT != enabled || autoPVTImplicitUpdate != implicitUpdate; + if (changes) + { + autoPVT = enabled; + autoPVTImplicitUpdate = implicitUpdate; + } + return changes; +} + +//Enable or disable automatic navigation message generation by the GPS. This changes the way getPVT +//works. +boolean SFE_UBLOX_GPS::setAutoPVT(boolean enable, uint16_t maxWait) +{ + return setAutoPVT(enable, true, maxWait); +} + +//Enable or disable automatic navigation message generation by the GPS. This changes the way getPVT +//works. +boolean SFE_UBLOX_GPS::setAutoPVT(boolean enable, boolean implicitUpdate, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_MSG; + packetCfg.len = 3; + packetCfg.startingSpot = 0; + payloadCfg[0] = UBX_CLASS_NAV; + payloadCfg[1] = UBX_NAV_PVT; + payloadCfg[2] = enable ? 1 : 0; // rate relative to navigation freq. + + boolean ok = ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK + if (ok) + { + autoPVT = enable; + autoPVTImplicitUpdate = implicitUpdate; + } + moduleQueried.all = false; + return ok; +} + +//In case no config access to the GPS is possible and HPPOSLLH is send cyclically already +//set config to suitable parameters +boolean SFE_UBLOX_GPS::assumeAutoHPPOSLLH(boolean enabled, boolean implicitUpdate) +{ + boolean changes = autoHPPOSLLH != enabled || autoHPPOSLLHImplicitUpdate != implicitUpdate; + if (changes) + { + autoHPPOSLLH = enabled; + autoHPPOSLLHImplicitUpdate = implicitUpdate; + } + return changes; +} + +//Enable or disable automatic navigation message generation by the GPS. This changes the way getHPPOSLLH +//works. +boolean SFE_UBLOX_GPS::setAutoHPPOSLLH(boolean enable, uint16_t maxWait) +{ + return setAutoHPPOSLLH(enable, true, maxWait); +} + +//Enable or disable automatic navigation message generation by the GPS. This changes the way getHPPOSLLH +//works. +boolean SFE_UBLOX_GPS::setAutoHPPOSLLH(boolean enable, boolean implicitUpdate, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_MSG; + packetCfg.len = 3; + packetCfg.startingSpot = 0; + payloadCfg[0] = UBX_CLASS_NAV; + payloadCfg[1] = UBX_NAV_HPPOSLLH; + payloadCfg[2] = enable ? 1 : 0; // rate relative to navigation freq. + + boolean ok = ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK + if (ok) + { + autoHPPOSLLH = enable; + autoHPPOSLLHImplicitUpdate = implicitUpdate; + } + highResModuleQueried.all = false; + return ok; +} + + +//In case no config access to the GPS is possible and DOP is send cyclically already +//set config to suitable parameters +boolean SFE_UBLOX_GPS::assumeAutoDOP(boolean enabled, boolean implicitUpdate) +{ + boolean changes = autoDOP != enabled || autoDOPImplicitUpdate != implicitUpdate; + if (changes) + { + autoDOP = enabled; + autoDOPImplicitUpdate = implicitUpdate; + } + return changes; +} + +//Enable or disable automatic navigation message generation by the GPS. This changes the way getDOP +//works. +boolean SFE_UBLOX_GPS::setAutoDOP(boolean enable, uint16_t maxWait) +{ + return setAutoDOP(enable, true, maxWait); +} + +//Enable or disable automatic navigation message generation by the GPS. This changes the way getDOP +//works. +boolean SFE_UBLOX_GPS::setAutoDOP(boolean enable, boolean implicitUpdate, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_MSG; + packetCfg.len = 3; + packetCfg.startingSpot = 0; + payloadCfg[0] = UBX_CLASS_NAV; + payloadCfg[1] = UBX_NAV_DOP; + payloadCfg[2] = enable ? 1 : 0; // rate relative to navigation freq. + + boolean ok = ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK + if (ok) + { + autoDOP = enable; + autoDOPImplicitUpdate = implicitUpdate; + } + dopModuleQueried.all = false; + return ok; +} + +//Configure a given message type for a given port (UART1, I2C, SPI, etc) +boolean SFE_UBLOX_GPS::configureMessage(uint8_t msgClass, uint8_t msgID, uint8_t portID, uint8_t sendRate, uint16_t maxWait) +{ + //Poll for the current settings for a given message + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_MSG; + packetCfg.len = 2; + packetCfg.startingSpot = 0; + + payloadCfg[0] = msgClass; + payloadCfg[1] = msgID; + + //This will load the payloadCfg array with current settings of the given register + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) // We are expecting data and an ACK + return (false); //If command send fails then bail + + //Now send it back with new mods + packetCfg.len = 8; + + //payloadCfg is now loaded with current bytes. Change only the ones we need to + payloadCfg[2 + portID] = sendRate; //Send rate is relative to the event a message is registered on. For example, if the rate of a navigation message is set to 2, the message is sent every 2nd navigation solution. + + return ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Enable a given message type, default of 1 per update rate (usually 1 per second) +boolean SFE_UBLOX_GPS::enableMessage(uint8_t msgClass, uint8_t msgID, uint8_t portID, uint8_t rate, uint16_t maxWait) +{ + return (configureMessage(msgClass, msgID, portID, rate, maxWait)); +} +//Disable a given message type on a given port +boolean SFE_UBLOX_GPS::disableMessage(uint8_t msgClass, uint8_t msgID, uint8_t portID, uint16_t maxWait) +{ + return (configureMessage(msgClass, msgID, portID, 0, maxWait)); +} + +boolean SFE_UBLOX_GPS::enableNMEAMessage(uint8_t msgID, uint8_t portID, uint8_t rate, uint16_t maxWait) +{ + return (configureMessage(UBX_CLASS_NMEA, msgID, portID, rate, maxWait)); +} +boolean SFE_UBLOX_GPS::disableNMEAMessage(uint8_t msgID, uint8_t portID, uint16_t maxWait) +{ + return (enableNMEAMessage(msgID, portID, 0, maxWait)); +} + +//Given a message number turns on a message ID for output over a given portID (UART, I2C, SPI, USB, etc) +//To disable a message, set secondsBetween messages to 0 +//Note: This function will return false if the message is already enabled +//For base station RTK output we need to enable various sentences + +//NEO-M8P has four: +//1005 = 0xF5 0x05 - Stationary RTK reference ARP +//1077 = 0xF5 0x4D - GPS MSM7 +//1087 = 0xF5 0x57 - GLONASS MSM7 +//1230 = 0xF5 0xE6 - GLONASS code-phase biases, set to once every 10 seconds + +//ZED-F9P has six: +//1005, 1074, 1084, 1094, 1124, 1230 + +//Much of this configuration is not documented and instead discerned from u-center binary console +boolean SFE_UBLOX_GPS::enableRTCMmessage(uint8_t messageNumber, uint8_t portID, uint8_t sendRate, uint16_t maxWait) +{ + return (configureMessage(UBX_RTCM_MSB, messageNumber, portID, sendRate, maxWait)); +} + +//Disable a given message on a given port by setting secondsBetweenMessages to zero +boolean SFE_UBLOX_GPS::disableRTCMmessage(uint8_t messageNumber, uint8_t portID, uint16_t maxWait) +{ + return (enableRTCMmessage(messageNumber, portID, 0, maxWait)); +} + +//Add a new geofence using UBX-CFG-GEOFENCE +boolean SFE_UBLOX_GPS::addGeofence(int32_t latitude, int32_t longitude, uint32_t radius, byte confidence, byte pinPolarity, byte pin, uint16_t maxWait) +{ + if (currentGeofenceParams.numFences >= 4) + return (false); // Quit if we already have four geofences defined + + // Store the new geofence parameters + currentGeofenceParams.lats[currentGeofenceParams.numFences] = latitude; + currentGeofenceParams.longs[currentGeofenceParams.numFences] = longitude; + currentGeofenceParams.rads[currentGeofenceParams.numFences] = radius; + currentGeofenceParams.numFences = currentGeofenceParams.numFences + 1; // Increment the number of fences + + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_GEOFENCE; + packetCfg.len = (currentGeofenceParams.numFences * 12) + 8; + packetCfg.startingSpot = 0; + + payloadCfg[0] = 0; // Message version = 0x00 + payloadCfg[1] = currentGeofenceParams.numFences; // numFences + payloadCfg[2] = confidence; // confLvl = Confidence level 0-4 (none, 68%, 95%, 99.7%, 99.99%) + payloadCfg[3] = 0; // reserved1 + if (pin > 0) + { + payloadCfg[4] = 1; // enable PIO combined fence state + } + else + { + payloadCfg[4] = 0; // disable PIO combined fence state + } + payloadCfg[5] = pinPolarity; // PIO pin polarity (0 = low means inside, 1 = low means outside (or unknown)) + payloadCfg[6] = pin; // PIO pin + payloadCfg[7] = 0; //reserved2 + payloadCfg[8] = currentGeofenceParams.lats[0] & 0xFF; + payloadCfg[9] = currentGeofenceParams.lats[0] >> 8; + payloadCfg[10] = currentGeofenceParams.lats[0] >> 16; + payloadCfg[11] = currentGeofenceParams.lats[0] >> 24; + payloadCfg[12] = currentGeofenceParams.longs[0] & 0xFF; + payloadCfg[13] = currentGeofenceParams.longs[0] >> 8; + payloadCfg[14] = currentGeofenceParams.longs[0] >> 16; + payloadCfg[15] = currentGeofenceParams.longs[0] >> 24; + payloadCfg[16] = currentGeofenceParams.rads[0] & 0xFF; + payloadCfg[17] = currentGeofenceParams.rads[0] >> 8; + payloadCfg[18] = currentGeofenceParams.rads[0] >> 16; + payloadCfg[19] = currentGeofenceParams.rads[0] >> 24; + if (currentGeofenceParams.numFences >= 2) + { + payloadCfg[20] = currentGeofenceParams.lats[1] & 0xFF; + payloadCfg[21] = currentGeofenceParams.lats[1] >> 8; + payloadCfg[22] = currentGeofenceParams.lats[1] >> 16; + payloadCfg[23] = currentGeofenceParams.lats[1] >> 24; + payloadCfg[24] = currentGeofenceParams.longs[1] & 0xFF; + payloadCfg[25] = currentGeofenceParams.longs[1] >> 8; + payloadCfg[26] = currentGeofenceParams.longs[1] >> 16; + payloadCfg[27] = currentGeofenceParams.longs[1] >> 24; + payloadCfg[28] = currentGeofenceParams.rads[1] & 0xFF; + payloadCfg[29] = currentGeofenceParams.rads[1] >> 8; + payloadCfg[30] = currentGeofenceParams.rads[1] >> 16; + payloadCfg[31] = currentGeofenceParams.rads[1] >> 24; + } + if (currentGeofenceParams.numFences >= 3) + { + payloadCfg[32] = currentGeofenceParams.lats[2] & 0xFF; + payloadCfg[33] = currentGeofenceParams.lats[2] >> 8; + payloadCfg[34] = currentGeofenceParams.lats[2] >> 16; + payloadCfg[35] = currentGeofenceParams.lats[2] >> 24; + payloadCfg[36] = currentGeofenceParams.longs[2] & 0xFF; + payloadCfg[37] = currentGeofenceParams.longs[2] >> 8; + payloadCfg[38] = currentGeofenceParams.longs[2] >> 16; + payloadCfg[39] = currentGeofenceParams.longs[2] >> 24; + payloadCfg[40] = currentGeofenceParams.rads[2] & 0xFF; + payloadCfg[41] = currentGeofenceParams.rads[2] >> 8; + payloadCfg[42] = currentGeofenceParams.rads[2] >> 16; + payloadCfg[43] = currentGeofenceParams.rads[2] >> 24; + } + if (currentGeofenceParams.numFences >= 4) + { + payloadCfg[44] = currentGeofenceParams.lats[3] & 0xFF; + payloadCfg[45] = currentGeofenceParams.lats[3] >> 8; + payloadCfg[46] = currentGeofenceParams.lats[3] >> 16; + payloadCfg[47] = currentGeofenceParams.lats[3] >> 24; + payloadCfg[48] = currentGeofenceParams.longs[3] & 0xFF; + payloadCfg[49] = currentGeofenceParams.longs[3] >> 8; + payloadCfg[50] = currentGeofenceParams.longs[3] >> 16; + payloadCfg[51] = currentGeofenceParams.longs[3] >> 24; + payloadCfg[52] = currentGeofenceParams.rads[3] & 0xFF; + payloadCfg[53] = currentGeofenceParams.rads[3] >> 8; + payloadCfg[54] = currentGeofenceParams.rads[3] >> 16; + payloadCfg[55] = currentGeofenceParams.rads[3] >> 24; + } + return ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Clear all geofences using UBX-CFG-GEOFENCE +boolean SFE_UBLOX_GPS::clearGeofences(uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_GEOFENCE; + packetCfg.len = 8; + packetCfg.startingSpot = 0; + + payloadCfg[0] = 0; // Message version = 0x00 + payloadCfg[1] = 0; // numFences + payloadCfg[2] = 0; // confLvl + payloadCfg[3] = 0; // reserved1 + payloadCfg[4] = 0; // disable PIO combined fence state + payloadCfg[5] = 0; // PIO pin polarity (0 = low means inside, 1 = low means outside (or unknown)) + payloadCfg[6] = 0; // PIO pin + payloadCfg[7] = 0; //reserved2 + + currentGeofenceParams.numFences = 0; // Zero the number of geofences currently in use + + return ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Clear the antenna control settings using UBX-CFG-ANT +//This function is hopefully redundant but may be needed to release +//any PIO pins pre-allocated for antenna functions +boolean SFE_UBLOX_GPS::clearAntPIO(uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_ANT; + packetCfg.len = 4; + packetCfg.startingSpot = 0; + + payloadCfg[0] = 0x10; // Antenna flag mask: set the recovery bit + payloadCfg[1] = 0; + payloadCfg[2] = 0xFF; // Antenna pin configuration: set pinSwitch and pinSCD to 31 + payloadCfg[3] = 0xFF; // Antenna pin configuration: set pinOCD to 31, set reconfig bit + + return ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Returns the combined geofence state using UBX-NAV-GEOFENCE +boolean SFE_UBLOX_GPS::getGeofenceState(geofenceState ¤tGeofenceState, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_NAV; + packetCfg.id = UBX_NAV_GEOFENCE; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + //Ask module for the geofence status. Loads into payloadCfg. + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) // We are expecting data and an ACK + return (false); + + currentGeofenceState.status = payloadCfg[5]; // Extract the status + currentGeofenceState.numFences = payloadCfg[6]; // Extract the number of geofences + currentGeofenceState.combState = payloadCfg[7]; // Extract the combined state of all geofences + if (currentGeofenceState.numFences > 0) + currentGeofenceState.states[0] = payloadCfg[8]; // Extract geofence 1 state + if (currentGeofenceState.numFences > 1) + currentGeofenceState.states[1] = payloadCfg[10]; // Extract geofence 2 state + if (currentGeofenceState.numFences > 2) + currentGeofenceState.states[2] = payloadCfg[12]; // Extract geofence 3 state + if (currentGeofenceState.numFences > 3) + currentGeofenceState.states[3] = payloadCfg[14]; // Extract geofence 4 state + + return (true); +} + +//Power Save Mode +//Enables/Disables Low Power Mode using UBX-CFG-RXM +boolean SFE_UBLOX_GPS::powerSaveMode(bool power_save, uint16_t maxWait) +{ + // Let's begin by checking the Protocol Version as UBX_CFG_RXM is not supported on the ZED (protocol >= 27) + uint8_t protVer = getProtocolVersionHigh(maxWait); + /* + if (_printDebug == true) + { + _debugSerial->print(F("Protocol version is ")); + _debugSerial->println(protVer); + } + */ + if (protVer >= 27) + { + if (_printDebug == true) + { + _debugSerial->println(F("powerSaveMode (UBX-CFG-RXM) is not supported by this protocol version")); + } + return (false); + } + + // Now let's change the power setting using UBX-CFG-RXM + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_RXM; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + //Ask module for the current power management settings. Loads into payloadCfg. + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) // We are expecting data and an ACK + return (false); + + if (power_save) + { + payloadCfg[1] = 1; // Power Save Mode + } + else + { + payloadCfg[1] = 0; // Continuous Mode + } + + packetCfg.len = 2; + packetCfg.startingSpot = 0; + + return (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +// Get Power Save Mode +// Returns the current Low Power Mode using UBX-CFG-RXM +// Returns 255 if the sendCommand fails +uint8_t SFE_UBLOX_GPS::getPowerSaveMode(uint16_t maxWait) +{ + // Let's begin by checking the Protocol Version as UBX_CFG_RXM is not supported on the ZED (protocol >= 27) + uint8_t protVer = getProtocolVersionHigh(maxWait); + /* + if (_printDebug == true) + { + _debugSerial->print(F("Protocol version is ")); + _debugSerial->println(protVer); + } + */ + if (protVer >= 27) + { + if (_printDebug == true) + { + _debugSerial->println(F("powerSaveMode (UBX-CFG-RXM) is not supported by this protocol version")); + } + return (255); + } + + // Now let's read the power setting using UBX-CFG-RXM + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_RXM; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + //Ask module for the current power management settings. Loads into payloadCfg. + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) // We are expecting data and an ACK + return (255); + + return (payloadCfg[1]); // Return the low power mode +} + +// Powers off the GPS device for a given duration to reduce power consumption. +// NOTE: Querying the device before the duration is complete, for example by "getLatitude()" will wake it up! +// Returns true if command has not been not acknowledged. +// Returns false if command has not been acknowledged or maxWait = 0. +boolean SFE_UBLOX_GPS::powerOff(uint32_t durationInMs, uint16_t maxWait) +{ + // use durationInMs = 0 for infinite duration + if (_printDebug == true) + { + _debugSerial->print(F("Powering off for ")); + _debugSerial->print(durationInMs); + _debugSerial->println(" ms"); + } + + // Power off device using UBX-RXM-PMREQ + packetCfg.cls = UBX_CLASS_RXM; // 0x02 + packetCfg.id = UBX_RXM_PMREQ; // 0x41 + packetCfg.len = 8; + packetCfg.startingSpot = 0; + + // duration + // big endian to little endian, switch byte order + payloadCfg[0] = (durationInMs >> (8 * 0)) & 0xff; + payloadCfg[1] = (durationInMs >> (8 * 1)) & 0xff; + payloadCfg[2] = (durationInMs >> (8 * 2)) & 0xff; + payloadCfg[3] = (durationInMs >> (8 * 3)) & 0xff; + + payloadCfg[4] = 0x02; //Flags : set the backup bit + payloadCfg[5] = 0x00; //Flags + payloadCfg[6] = 0x00; //Flags + payloadCfg[7] = 0x00; //Flags + + if (maxWait != 0) + { + // check for "not acknowledged" command + return (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_COMMAND_NACK); + } + else + { + sendCommand(&packetCfg, maxWait); + return false; // can't tell if command not acknowledged if maxWait = 0 + } +} + +// Powers off the GPS device for a given duration to reduce power consumption. +// While powered off it can be woken up by creating a falling or rising voltage edge on the specified pin. +// NOTE: The GPS seems to be sensitve to signals on the pins while powered off. Works best when Microcontroller is in deepsleep. +// NOTE: Querying the device before the duration is complete, for example by "getLatitude()" will wake it up! +// Returns true if command has not been not acknowledged. +// Returns false if command has not been acknowledged or maxWait = 0. +boolean SFE_UBLOX_GPS::powerOffWithInterrupt(uint32_t durationInMs, uint32_t wakeupSources, boolean forceWhileUsb, uint16_t maxWait) +{ + // use durationInMs = 0 for infinite duration + if (_printDebug == true) + { + _debugSerial->print(F("Powering off for ")); + _debugSerial->print(durationInMs); + _debugSerial->println(" ms"); + } + + // Power off device using UBX-RXM-PMREQ + packetCfg.cls = UBX_CLASS_RXM; // 0x02 + packetCfg.id = UBX_RXM_PMREQ; // 0x41 + packetCfg.len = 16; + packetCfg.startingSpot = 0; + + payloadCfg[0] = 0x00; // message version + + // bytes 1-3 are reserved - and must be set to zero + payloadCfg[1] = 0x00; + payloadCfg[2] = 0x00; + payloadCfg[3] = 0x00; + + // duration + // big endian to little endian, switch byte order + payloadCfg[4] = (durationInMs >> (8 * 0)) & 0xff; + payloadCfg[5] = (durationInMs >> (8 * 1)) & 0xff; + payloadCfg[6] = (durationInMs >> (8 * 2)) & 0xff; + payloadCfg[7] = (durationInMs >> (8 * 3)) & 0xff; + + // flags + + // disables USB interface when powering off, defaults to true + if (forceWhileUsb) + { + payloadCfg[8] = 0x06; // force | backup + } + else + { + payloadCfg[8] = 0x02; // backup only (leave the force bit clear - module will stay on if USB is connected) + } + + payloadCfg[9] = 0x00; + payloadCfg[10] = 0x00; + payloadCfg[11] = 0x00; + + // wakeUpSources + + // wakeupPin mapping, defaults to VAL_RXM_PMREQ_WAKEUPSOURCE_EXTINT0 + + // Possible values are: + // VAL_RXM_PMREQ_WAKEUPSOURCE_UARTRX + // VAL_RXM_PMREQ_WAKEUPSOURCE_EXTINT0 + // VAL_RXM_PMREQ_WAKEUPSOURCE_EXTINT1 + // VAL_RXM_PMREQ_WAKEUPSOURCE_SPICS + + payloadCfg[12] = (wakeupSources >> (8 * 0)) & 0xff; + payloadCfg[13] = (wakeupSources >> (8 * 1)) & 0xff; + payloadCfg[14] = (wakeupSources >> (8 * 2)) & 0xff; + payloadCfg[15] = (wakeupSources >> (8 * 3)) & 0xff; + + if (maxWait != 0) + { + // check for "not acknowledged" command + return (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_COMMAND_NACK); + } + else + { + sendCommand(&packetCfg, maxWait); + return false; // can't tell if command not acknowledged if maxWait = 0 + } +} + +//Change the dynamic platform model using UBX-CFG-NAV5 +//Possible values are: +//PORTABLE,STATIONARY,PEDESTRIAN,AUTOMOTIVE,SEA, +//AIRBORNE1g,AIRBORNE2g,AIRBORNE4g,WRIST,BIKE +//WRIST is not supported in protocol versions less than 18 +//BIKE is supported in protocol versions 19.2 +boolean SFE_UBLOX_GPS::setDynamicModel(dynModel newDynamicModel, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_NAV5; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + //Ask module for the current navigation model settings. Loads into payloadCfg. + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) // We are expecting data and an ACK + return (false); + + payloadCfg[0] = 0x01; // mask: set only the dyn bit (0) + payloadCfg[1] = 0x00; // mask + payloadCfg[2] = newDynamicModel; // dynModel + + packetCfg.len = 36; + packetCfg.startingSpot = 0; + + return (sendCommand(&packetCfg, maxWait) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +//Get the dynamic platform model using UBX-CFG-NAV5 +//Returns 255 if the sendCommand fails +uint8_t SFE_UBLOX_GPS::getDynamicModel(uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_NAV5; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + //Ask module for the current navigation model settings. Loads into payloadCfg. + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) // We are expecting data and an ACK + return (255); + + return (payloadCfg[2]); // Return the dynamic model +} + +//Given a spot in the payload array, extract four bytes and build a long +uint32_t SFE_UBLOX_GPS::extractLong(uint8_t spotToStart) +{ + uint32_t val = 0; + val |= (uint32_t)payloadCfg[spotToStart + 0] << 8 * 0; + val |= (uint32_t)payloadCfg[spotToStart + 1] << 8 * 1; + val |= (uint32_t)payloadCfg[spotToStart + 2] << 8 * 2; + val |= (uint32_t)payloadCfg[spotToStart + 3] << 8 * 3; + return (val); +} + +//Just so there is no ambiguity about whether a uint32_t will cast to a int32_t correctly... +int32_t SFE_UBLOX_GPS::extractSignedLong(uint8_t spotToStart) +{ + union // Use a union to convert from uint32_t to int32_t + { + uint32_t unsignedLong; + int32_t signedLong; + } unsignedSigned; + + unsignedSigned.unsignedLong = extractLong(spotToStart); + return (unsignedSigned.signedLong); +} + +//Given a spot in the payload array, extract two bytes and build an int +uint16_t SFE_UBLOX_GPS::extractInt(uint8_t spotToStart) +{ + uint16_t val = 0; + val |= (uint16_t)payloadCfg[spotToStart + 0] << 8 * 0; + val |= (uint16_t)payloadCfg[spotToStart + 1] << 8 * 1; + return (val); +} + +//Just so there is no ambiguity about whether a uint16_t will cast to a int16_t correctly... +int16_t SFE_UBLOX_GPS::extractSignedInt(int8_t spotToStart) +{ + union // Use a union to convert from uint16_t to int16_t + { + uint16_t unsignedInt; + int16_t signedInt; + } stSignedInt; + + stSignedInt.unsignedInt = extractInt(spotToStart); + return (stSignedInt.signedInt); +} + +//Given a spot, extract a byte from the payload +uint8_t SFE_UBLOX_GPS::extractByte(uint8_t spotToStart) +{ + return (payloadCfg[spotToStart]); +} + +//Given a spot, extract a signed 8-bit value from the payload +int8_t SFE_UBLOX_GPS::extractSignedChar(uint8_t spotToStart) +{ + return ((int8_t)payloadCfg[spotToStart]); +} + +//Get the current year +uint16_t SFE_UBLOX_GPS::getYear(uint16_t maxWait) +{ + if (moduleQueried.gpsYear == false) + getPVT(maxWait); + moduleQueried.gpsYear = false; //Since we are about to give this to user, mark this data as stale + return (gpsYear); +} + +//Get the current month +uint8_t SFE_UBLOX_GPS::getMonth(uint16_t maxWait) +{ + if (moduleQueried.gpsMonth == false) + getPVT(maxWait); + moduleQueried.gpsMonth = false; //Since we are about to give this to user, mark this data as stale + return (gpsMonth); +} + +//Get the current day +uint8_t SFE_UBLOX_GPS::getDay(uint16_t maxWait) +{ + if (moduleQueried.gpsDay == false) + getPVT(maxWait); + moduleQueried.gpsDay = false; //Since we are about to give this to user, mark this data as stale + return (gpsDay); +} + +//Get the current hour +uint8_t SFE_UBLOX_GPS::getHour(uint16_t maxWait) +{ + if (moduleQueried.gpsHour == false) + getPVT(maxWait); + moduleQueried.gpsHour = false; //Since we are about to give this to user, mark this data as stale + return (gpsHour); +} + +//Get the current minute +uint8_t SFE_UBLOX_GPS::getMinute(uint16_t maxWait) +{ + if (moduleQueried.gpsMinute == false) + getPVT(maxWait); + moduleQueried.gpsMinute = false; //Since we are about to give this to user, mark this data as stale + return (gpsMinute); +} + +//Get the current second +uint8_t SFE_UBLOX_GPS::getSecond(uint16_t maxWait) +{ + if (moduleQueried.gpsSecond == false) + getPVT(maxWait); + moduleQueried.gpsSecond = false; //Since we are about to give this to user, mark this data as stale + return (gpsSecond); +} + +//Get the current date validity +bool SFE_UBLOX_GPS::getDateValid(uint16_t maxWait) +{ + if (moduleQueried.gpsDateValid == false) + getPVT(maxWait); + moduleQueried.gpsDateValid = false; //Since we are about to give this to user, mark this data as stale + return (gpsDateValid); +} + +//Get the current time validity +bool SFE_UBLOX_GPS::getTimeValid(uint16_t maxWait) +{ + if (moduleQueried.gpsTimeValid == false) + getPVT(maxWait); + moduleQueried.gpsTimeValid = false; //Since we are about to give this to user, mark this data as stale + return (gpsTimeValid); +} + +uint32_t SFE_UBLOX_GPS::getSpeedAccEst(uint16_t maxWait) +{ + if (moduleQueried.speedAccEst == false) + getPVT(maxWait); + moduleQueried.speedAccEst = false; //Since we are about to give this to user, mark this data as stale + return (speedAccEst); +} + +uint32_t SFE_UBLOX_GPS::getHeadingAccEst(uint16_t maxWait) +{ + if (moduleQueried.headingAccEst == false) + getPVT(maxWait); + moduleQueried.headingAccEst = false; //Since we are about to give this to user, mark this data as stale + return (headingAccEst); +} + +bool SFE_UBLOX_GPS::getInvalidLlh(uint16_t maxWait) +{ + if (moduleQueried.invalidLlh == false) + getPVT(maxWait); + moduleQueried.invalidLlh = false; //Since we are about to give this to user, mark this data as stale + return (invalidLlh); +} + +int32_t SFE_UBLOX_GPS::getHeadVeh(uint16_t maxWait) +{ + if (moduleQueried.headVeh == false) + getPVT(maxWait); + moduleQueried.headVeh = false; //Since we are about to give this to user, mark this data as stale + return (headVeh); +} + +int16_t SFE_UBLOX_GPS::getMagDec(uint16_t maxWait) +{ + if (moduleQueried.magDec == false) + getPVT(maxWait); + moduleQueried.magDec = false; //Since we are about to give this to user, mark this data as stale + return (magDec); +} + +uint16_t SFE_UBLOX_GPS::getMagAcc(uint16_t maxWait) +{ + if (moduleQueried.magAcc == false) + getPVT(maxWait); + moduleQueried.magAcc = false; //Since we are about to give this to user, mark this data as stale + return (magAcc); +} + +//Get the current millisecond +uint16_t SFE_UBLOX_GPS::getMillisecond(uint16_t maxWait) +{ + if (moduleQueried.gpsiTOW == false) + getPVT(maxWait); + moduleQueried.gpsiTOW = false; //Since we are about to give this to user, mark this data as stale + return (gpsMillisecond); +} + +//Get the current nanoseconds - includes milliseconds +int32_t SFE_UBLOX_GPS::getNanosecond(uint16_t maxWait) +{ + if (moduleQueried.gpsNanosecond == false) + getPVT(maxWait); + moduleQueried.gpsNanosecond = false; //Since we are about to give this to user, mark this data as stale + return (gpsNanosecond); +} + +//Get the latest Position/Velocity/Time solution and fill all global variables +boolean SFE_UBLOX_GPS::getPVT(uint16_t maxWait) +{ + if (autoPVT && autoPVTImplicitUpdate) + { + //The GPS is automatically reporting, we just check whether we got unread data + if (_printDebug == true) + { + _debugSerial->println(F("getPVT: Autoreporting")); + } + checkUbloxInternal(&packetCfg, UBX_CLASS_NAV, UBX_NAV_PVT); + return moduleQueried.all; + } + else if (autoPVT && !autoPVTImplicitUpdate) + { + //Someone else has to call checkUblox for us... + if (_printDebug == true) + { + _debugSerial->println(F("getPVT: Exit immediately")); + } + return (false); + } + else + { + if (_printDebug == true) + { + _debugSerial->println(F("getPVT: Polling")); + } + + //The GPS is not automatically reporting navigation position so we have to poll explicitly + packetCfg.cls = UBX_CLASS_NAV; + packetCfg.id = UBX_NAV_PVT; + packetCfg.len = 0; + //packetCfg.startingSpot = 20; //Begin listening at spot 20 so we can record up to 20+MAX_PAYLOAD_SIZE = 84 bytes Note:now hard-coded in processUBX + + //The data is parsed as part of processing the response + sfe_ublox_status_e retVal = sendCommand(&packetCfg, maxWait); + + if (retVal == SFE_UBLOX_STATUS_DATA_RECEIVED || retVal == SFE_UBLOX_STATUS_SUCCESS) + return (true); + + if ((retVal == SFE_UBLOX_STATUS_DATA_OVERWRITTEN) && (packetCfg.cls == UBX_CLASS_NAV)) + { + if (_printDebug == true) + { + _debugSerial->println(F("getPVT: data was OVERWRITTEN by another NAV message (but that's OK)")); + } + return (true); + } + + if ((retVal == SFE_UBLOX_STATUS_DATA_OVERWRITTEN) && (packetCfg.cls == UBX_CLASS_HNR)) + { + if (_printDebug == true) + { + _debugSerial->println(F("getPVT: data was OVERWRITTEN by a HNR message (and that's not OK)")); + } + return (false); + } + + if (_printDebug == true) + { + _debugSerial->print(F("getPVT retVal: ")); + _debugSerial->println(statusString(retVal)); + } + return (false); + } +} + +uint32_t SFE_UBLOX_GPS::getTimeOfWeek(uint16_t maxWait /* = 250*/) +{ + if (moduleQueried.gpsiTOW == false) + getPVT(maxWait); + moduleQueried.gpsiTOW = false; //Since we are about to give this to user, mark this data as stale + return (timeOfWeek); +} + +int32_t SFE_UBLOX_GPS::getHighResLatitude(uint16_t maxWait /* = 250*/) +{ + if (highResModuleQueried.highResLatitude == false) + getHPPOSLLH(maxWait); + highResModuleQueried.highResLatitude = false; //Since we are about to give this to user, mark this data as stale + highResModuleQueried.all = false; + + return (highResLatitude); +} + +int8_t SFE_UBLOX_GPS::getHighResLatitudeHp(uint16_t maxWait /* = 250*/) +{ + if (highResModuleQueried.highResLatitudeHp == false) + getHPPOSLLH(maxWait); + highResModuleQueried.highResLatitudeHp = false; //Since we are about to give this to user, mark this data as stale + highResModuleQueried.all = false; + + return (highResLatitudeHp); +} + +int32_t SFE_UBLOX_GPS::getHighResLongitude(uint16_t maxWait /* = 250*/) +{ + if (highResModuleQueried.highResLongitude == false) + getHPPOSLLH(maxWait); + highResModuleQueried.highResLongitude = false; //Since we are about to give this to user, mark this data as stale + highResModuleQueried.all = false; + + return (highResLongitude); +} + +int8_t SFE_UBLOX_GPS::getHighResLongitudeHp(uint16_t maxWait /* = 250*/) +{ + if (highResModuleQueried.highResLongitudeHp == false) + getHPPOSLLH(maxWait); + highResModuleQueried.highResLongitudeHp = false; //Since we are about to give this to user, mark this data as stale + highResModuleQueried.all = false; + + return (highResLongitudeHp); +} + +int32_t SFE_UBLOX_GPS::getElipsoid(uint16_t maxWait /* = 250*/) +{ + if (highResModuleQueried.elipsoid == false) + getHPPOSLLH(maxWait); + highResModuleQueried.elipsoid = false; //Since we are about to give this to user, mark this data as stale + highResModuleQueried.all = false; + + return (elipsoid); +} + +int8_t SFE_UBLOX_GPS::getElipsoidHp(uint16_t maxWait /* = 250*/) +{ + if (highResModuleQueried.elipsoidHp == false) + getHPPOSLLH(maxWait); + highResModuleQueried.elipsoidHp = false; //Since we are about to give this to user, mark this data as stale + highResModuleQueried.all = false; + + return (elipsoidHp); +} + +int32_t SFE_UBLOX_GPS::getMeanSeaLevel(uint16_t maxWait /* = 250*/) +{ + if (highResModuleQueried.meanSeaLevel == false) + getHPPOSLLH(maxWait); + highResModuleQueried.meanSeaLevel = false; //Since we are about to give this to user, mark this data as stale + highResModuleQueried.all = false; + + return (meanSeaLevel); +} + +int8_t SFE_UBLOX_GPS::getMeanSeaLevelHp(uint16_t maxWait /* = 250*/) +{ + if (highResModuleQueried.meanSeaLevelHp == false) + getHPPOSLLH(maxWait); + highResModuleQueried.meanSeaLevelHp = false; //Since we are about to give this to user, mark this data as stale + highResModuleQueried.all = false; + + return (meanSeaLevelHp); +} + +// getGeoidSeparation is currently redundant. The geoid separation seems to only be provided in NMEA GGA and GNS messages. +int32_t SFE_UBLOX_GPS::getGeoidSeparation(uint16_t maxWait /* = 250*/) +{ + if (highResModuleQueried.geoidSeparation == false) + getHPPOSLLH(maxWait); + highResModuleQueried.geoidSeparation = false; //Since we are about to give this to user, mark this data as stale + highResModuleQueried.all = false; + + return (geoidSeparation); +} + +uint32_t SFE_UBLOX_GPS::getHorizontalAccuracy(uint16_t maxWait /* = 250*/) +{ + if (highResModuleQueried.horizontalAccuracy == false) + getHPPOSLLH(maxWait); + highResModuleQueried.horizontalAccuracy = false; //Since we are about to give this to user, mark this data as stale + highResModuleQueried.all = false; + + return (horizontalAccuracy); +} + +uint32_t SFE_UBLOX_GPS::getVerticalAccuracy(uint16_t maxWait /* = 250*/) +{ + if (highResModuleQueried.verticalAccuracy == false) + getHPPOSLLH(maxWait); + highResModuleQueried.verticalAccuracy = false; //Since we are about to give this to user, mark this data as stale + highResModuleQueried.all = false; + + return (verticalAccuracy); +} + +boolean SFE_UBLOX_GPS::getHPPOSLLH(uint16_t maxWait) +{ + if (autoHPPOSLLH && autoHPPOSLLHImplicitUpdate) + { + //The GPS is automatically reporting, we just check whether we got unread data + if (_printDebug == true) + { + _debugSerial->println(F("getHPPOSLLH: Autoreporting")); + } + checkUbloxInternal(&packetCfg, UBX_CLASS_NAV, UBX_NAV_HPPOSLLH); + return highResModuleQueried.all; + } + else if (autoHPPOSLLH && !autoHPPOSLLHImplicitUpdate) + { + //Someone else has to call checkUblox for us... + if (_printDebug == true) + { + _debugSerial->println(F("getHPPOSLLH: Exit immediately")); + } + return (false); + } + else + { + if (_printDebug == true) + { + _debugSerial->println(F("getHPPOSLLH: Polling")); + } + + //The GPS is not automatically reporting navigation position so we have to poll explicitly + packetCfg.cls = UBX_CLASS_NAV; + packetCfg.id = UBX_NAV_HPPOSLLH; + packetCfg.len = 0; + + //The data is parsed as part of processing the response + sfe_ublox_status_e retVal = sendCommand(&packetCfg, maxWait); + + if (retVal == SFE_UBLOX_STATUS_DATA_RECEIVED) + return (true); + + if ((retVal == SFE_UBLOX_STATUS_DATA_OVERWRITTEN) && (packetCfg.cls == UBX_CLASS_NAV)) + { + if (_printDebug == true) + { + _debugSerial->println(F("getHPPOSLLH: data was OVERWRITTEN by another NAV message (but that's OK)")); + } + return (true); + } + if ((retVal == SFE_UBLOX_STATUS_DATA_OVERWRITTEN) && (packetCfg.cls == UBX_CLASS_HNR)) + { + if (_printDebug == true) + { + _debugSerial->println(F("getHPPOSLLH: data was OVERWRITTEN by a HNR message (and that's not OK)")); + } + return (false); + } + + if (_printDebug == true) + { + _debugSerial->print(F("getHPPOSLLH retVal: ")); + _debugSerial->println(statusString(retVal)); + } + return (false); + } +} + +uint16_t SFE_UBLOX_GPS::getGeometricDOP(uint16_t maxWait /* = 250*/) +{ + if (dopModuleQueried.geometricDOP == false) + getDOP(maxWait); + dopModuleQueried.geometricDOP = false; //Since we are about to give this to user, mark this data as stale + dopModuleQueried.all = false; + + return (geometricDOP); +} + +uint16_t SFE_UBLOX_GPS::getPositionDOP(uint16_t maxWait /* = 250*/) +{ + if (dopModuleQueried.positionDOP == false) + getDOP(maxWait); + dopModuleQueried.positionDOP = false; //Since we are about to give this to user, mark this data as stale + dopModuleQueried.all = false; + + return (positionDOP); +} + +uint16_t SFE_UBLOX_GPS::getTimeDOP(uint16_t maxWait /* = 250*/) +{ + if (dopModuleQueried.timeDOP == false) + getDOP(maxWait); + dopModuleQueried.timeDOP = false; //Since we are about to give this to user, mark this data as stale + dopModuleQueried.all = false; + + return (timeDOP); +} + +uint16_t SFE_UBLOX_GPS::getVerticalDOP(uint16_t maxWait /* = 250*/) +{ + if (dopModuleQueried.verticalDOP == false) + getDOP(maxWait); + dopModuleQueried.verticalDOP = false; //Since we are about to give this to user, mark this data as stale + dopModuleQueried.all = false; + + return (verticalDOP); +} + +uint16_t SFE_UBLOX_GPS::getHorizontalDOP(uint16_t maxWait /* = 250*/) +{ + if (dopModuleQueried.horizontalDOP == false) + getDOP(maxWait); + dopModuleQueried.horizontalDOP = false; //Since we are about to give this to user, mark this data as stale + dopModuleQueried.all = false; + + return (horizontalDOP); +} + +uint16_t SFE_UBLOX_GPS::getNorthingDOP(uint16_t maxWait /* = 250*/) +{ + if (dopModuleQueried.northingDOP == false) + getDOP(maxWait); + dopModuleQueried.northingDOP = false; //Since we are about to give this to user, mark this data as stale + dopModuleQueried.all = false; + + return (northingDOP); +} + +uint16_t SFE_UBLOX_GPS::getEastingDOP(uint16_t maxWait /* = 250*/) +{ + if (dopModuleQueried.eastingDOP == false) + getDOP(maxWait); + dopModuleQueried.eastingDOP = false; //Since we are about to give this to user, mark this data as stale + dopModuleQueried.all = false; + + return (eastingDOP); +} + +boolean SFE_UBLOX_GPS::getDOP(uint16_t maxWait) +{ + if (autoDOP && autoDOPImplicitUpdate) + { + //The GPS is automatically reporting, we just check whether we got unread data + if (_printDebug == true) + { + _debugSerial->println(F("getDOP: Autoreporting")); + } + checkUbloxInternal(&packetCfg, UBX_CLASS_NAV, UBX_NAV_DOP); + return dopModuleQueried.all; + } + else if (autoDOP && !autoDOPImplicitUpdate) + { + //Someone else has to call checkUblox for us... + if (_printDebug == true) + { + _debugSerial->println(F("getDOP: Exit immediately")); + } + return (false); + } + else + { + if (_printDebug == true) + { + _debugSerial->println(F("getDOP: Polling")); + } + + //The GPS is not automatically reporting navigation position so we have to poll explicitly + packetCfg.cls = UBX_CLASS_NAV; + packetCfg.id = UBX_NAV_DOP; + packetCfg.len = 0; + + //The data is parsed as part of processing the response + sfe_ublox_status_e retVal = sendCommand(&packetCfg, maxWait); + + if (retVal == SFE_UBLOX_STATUS_DATA_RECEIVED) + return (true); + + if ((retVal == SFE_UBLOX_STATUS_DATA_OVERWRITTEN) && (packetCfg.cls == UBX_CLASS_NAV)) + { + if (_printDebug == true) + { + _debugSerial->println(F("getDOP: data was OVERWRITTEN by another NAV message (but that's OK)")); + } + return (true); + } + + if ((retVal == SFE_UBLOX_STATUS_DATA_OVERWRITTEN) && (packetCfg.cls == UBX_CLASS_HNR)) + { + if (_printDebug == true) + { + _debugSerial->println(F("getDOP: data was OVERWRITTEN by a HNR message (and that's not OK)")); + } + return (false); + } + + if (_printDebug == true) + { + _debugSerial->print(F("getDOP retVal: ")); + _debugSerial->println(statusString(retVal)); + } + return (false); + } +} + +//Get the current 3D high precision positional accuracy - a fun thing to watch +//Returns a long representing the 3D accuracy in millimeters +uint32_t SFE_UBLOX_GPS::getPositionAccuracy(uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_NAV; + packetCfg.id = UBX_NAV_HPPOSECEF; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) // We are only expecting data (no ACK) + return (0); //If command send fails then bail + + uint32_t tempAccuracy = extractLong(24); //We got a response, now extract a long beginning at a given position + + if ((tempAccuracy % 10) >= 5) + tempAccuracy += 5; //Round fraction of mm up to next mm if .5 or above + tempAccuracy /= 10; //Convert 0.1mm units to mm + + return (tempAccuracy); +} + +//Get the current latitude in degrees +//Returns a long representing the number of degrees *10^-7 +int32_t SFE_UBLOX_GPS::getLatitude(uint16_t maxWait) +{ + if (moduleQueried.latitude == false) + getPVT(maxWait); + moduleQueried.latitude = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (latitude); +} + +//Get the current longitude in degrees +//Returns a long representing the number of degrees *10^-7 +int32_t SFE_UBLOX_GPS::getLongitude(uint16_t maxWait) +{ + if (moduleQueried.longitude == false) + getPVT(maxWait); + moduleQueried.longitude = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (longitude); +} + +//Get the current altitude in mm according to ellipsoid model +int32_t SFE_UBLOX_GPS::getAltitude(uint16_t maxWait) +{ + if (moduleQueried.altitude == false) + getPVT(maxWait); + moduleQueried.altitude = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (altitude); +} + +//Get the current altitude in mm according to mean sea level +//Ellipsoid model: https://www.esri.com/news/arcuser/0703/geoid1of3.html +//Difference between Ellipsoid Model and Mean Sea Level: https://eos-gnss.com/elevation-for-beginners/ +int32_t SFE_UBLOX_GPS::getAltitudeMSL(uint16_t maxWait) +{ + if (moduleQueried.altitudeMSL == false) + getPVT(maxWait); + moduleQueried.altitudeMSL = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (altitudeMSL); +} + +int32_t SFE_UBLOX_GPS::getHorizontalAccEst(uint16_t maxWait) +{ + if (moduleQueried.horizontalAccEst == false) + getPVT(maxWait); + moduleQueried.horizontalAccEst = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (horizontalAccEst); +} + +int32_t SFE_UBLOX_GPS::getVerticalAccEst(uint16_t maxWait) +{ + if (moduleQueried.verticalAccEst == false) + getPVT(maxWait); + moduleQueried.verticalAccEst = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (verticalAccEst); +} + +int32_t SFE_UBLOX_GPS::getNedNorthVel(uint16_t maxWait) +{ + if (moduleQueried.nedNorthVel == false) + getPVT(maxWait); + moduleQueried.nedNorthVel = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (nedNorthVel); +} + +int32_t SFE_UBLOX_GPS::getNedEastVel(uint16_t maxWait) +{ + if (moduleQueried.nedEastVel == false) + getPVT(maxWait); + moduleQueried.nedEastVel = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (nedEastVel); +} + +int32_t SFE_UBLOX_GPS::getNedDownVel(uint16_t maxWait) +{ + if (moduleQueried.nedDownVel == false) + getPVT(maxWait); + moduleQueried.nedDownVel = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (nedDownVel); +} + +//Get the number of satellites used in fix +uint8_t SFE_UBLOX_GPS::getSIV(uint16_t maxWait) +{ + if (moduleQueried.SIV == false) + getPVT(maxWait); + moduleQueried.SIV = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (SIV); +} + +//Get the current fix type +//0=no fix, 1=dead reckoning, 2=2D, 3=3D, 4=GNSS, 5=Time fix +uint8_t SFE_UBLOX_GPS::getFixType(uint16_t maxWait) +{ + if (moduleQueried.fixType == false) + { + getPVT(maxWait); + } + moduleQueried.fixType = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (fixType); +} + +//Get whether we have a valid fix (i.e within DOP & accuracy masks) +bool SFE_UBLOX_GPS::getGnssFixOk(uint16_t maxWait) +{ + if (moduleQueried.gnssFixOk == false) + getPVT(maxWait); + moduleQueried.gnssFixOk = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (gnssFixOk); +} + +//Get whether differential corrections were applied +bool SFE_UBLOX_GPS::getDiffSoln(uint16_t maxWait) +{ + if (moduleQueried.diffSoln == false) + getPVT(maxWait); + moduleQueried.diffSoln = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (diffSoln); +} + +//Get the carrier phase range solution status +//Useful when querying module to see if it has high-precision RTK fix +//0=No solution, 1=Float solution, 2=Fixed solution +uint8_t SFE_UBLOX_GPS::getCarrierSolutionType(uint16_t maxWait) +{ + if (moduleQueried.carrierSolution == false) + getPVT(maxWait); + moduleQueried.carrierSolution = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (carrierSolution); +} + +//Get whether head vehicle valid or not +bool SFE_UBLOX_GPS::getHeadVehValid(uint16_t maxWait) +{ + if (moduleQueried.headVehValid == false) + getPVT(maxWait); + moduleQueried.headVehValid = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (headVehValid); +} + + +//Get the ground speed in mm/s +int32_t SFE_UBLOX_GPS::getGroundSpeed(uint16_t maxWait) +{ + if (moduleQueried.groundSpeed == false) + getPVT(maxWait); + moduleQueried.groundSpeed = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (groundSpeed); +} + +//Get the heading of motion (as opposed to heading of car) in degrees * 10^-5 +int32_t SFE_UBLOX_GPS::getHeading(uint16_t maxWait) +{ + if (moduleQueried.headingOfMotion == false) + getPVT(maxWait); + moduleQueried.headingOfMotion = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (headingOfMotion); +} + +//Get the positional dillution of precision * 10^-2 (dimensionless) +uint16_t SFE_UBLOX_GPS::getPDOP(uint16_t maxWait) +{ + if (moduleQueried.pDOP == false) + getPVT(maxWait); + moduleQueried.pDOP = false; //Since we are about to give this to user, mark this data as stale + moduleQueried.all = false; + + return (pDOP); +} + +//Get the current protocol version of the u-blox module we're communicating with +//This is helpful when deciding if we should call the high-precision Lat/Long (HPPOSLLH) or the regular (POSLLH) +uint8_t SFE_UBLOX_GPS::getProtocolVersionHigh(uint16_t maxWait) +{ + if (moduleQueried.versionNumber == false) + getProtocolVersion(maxWait); + return (versionHigh); +} + +//Get the current protocol version of the u-blox module we're communicating with +//This is helpful when deciding if we should call the high-precision Lat/Long (HPPOSLLH) or the regular (POSLLH) +uint8_t SFE_UBLOX_GPS::getProtocolVersionLow(uint16_t maxWait) +{ + if (moduleQueried.versionNumber == false) + getProtocolVersion(maxWait); + return (versionLow); +} + +//Get the current protocol version of the u-blox module we're communicating with +//This is helpful when deciding if we should call the high-precision Lat/Long (HPPOSLLH) or the regular (POSLLH) +boolean SFE_UBLOX_GPS::getProtocolVersion(uint16_t maxWait) +{ + //Send packet with only CLS and ID, length of zero. This will cause the module to respond with the contents of that CLS/ID. + packetCfg.cls = UBX_CLASS_MON; + packetCfg.id = UBX_MON_VER; + + packetCfg.len = 0; + packetCfg.startingSpot = 40; //Start at first "extended software information" string + memset(payloadCfg,0,sizeof(payloadCfg)); + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) // We are only expecting data (no ACK) + return (false); //If command send fails then bail + + //Payload should now contain ~220 characters (depends on module type) + + // if (_printDebug == true) + // { + // _debugSerial->print(F("MON VER Payload:")); + // for (int location = 0; location < packetCfg.len; location++) + // { + // if (location % 30 == 0) + // _debugSerial->println(); + // _debugSerial->write(payloadCfg[location]); + // } + // _debugSerial->println(); + // } + + //We will step through the payload looking at each extension field of 30 bytes + for (uint8_t extensionNumber = 0; extensionNumber < 10; extensionNumber++) + { + //Now we need to find "PROTVER=18.00" in the incoming byte stream + if ((payloadCfg[(30 * extensionNumber) + 0] == 'P') && (payloadCfg[(30 * extensionNumber) + 6] == 'R')) + { + versionHigh = (payloadCfg[(30 * extensionNumber) + 8] - '0') * 10 + (payloadCfg[(30 * extensionNumber) + 9] - '0'); //Convert '18' to 18 + versionLow = (payloadCfg[(30 * extensionNumber) + 11] - '0') * 10 + (payloadCfg[(30 * extensionNumber) + 12] - '0'); //Convert '00' to 00 + moduleQueried.versionNumber = true; //Mark this data as new + + if (_printDebug == true) + { + _debugSerial->print(F("Protocol version: ")); + _debugSerial->print(versionHigh); + _debugSerial->print(F(".")); + _debugSerial->println(versionLow); + } + return (true); //Success! + } + } + + return (false); //We failed +} + +void SFE_UBLOX_GPS::queryHwState(uint16_t maxWait) +{ +// memset(&hwState,0,sizeof(ubxHwState)); +// moduleQueried.hwState = false; + + packetCfg.cls = UBX_CLASS_MON; + packetCfg.id = UBX_MON_HW; + + packetCfg.len = 0; + packetCfg.startingSpot = 0; + memset(payloadCfg,0,sizeof(payloadCfg)); + sendCommand(&packetCfg, maxWait); +} + +boolean SFE_UBLOX_GPS::getHwState(ubxHwState &state) +{ + if(moduleQueried.hwState) + { + state = hwState; + moduleQueried.hwState = false; + return true; + } + else + return false; +} + +//Mark all the PVT data as read/stale. This is handy to get data alignment after CRC failure +void SFE_UBLOX_GPS::flushPVT() +{ + //Mark all datums as stale (read before) + moduleQueried.gpsiTOW = false; + moduleQueried.gpsYear = false; + moduleQueried.gpsMonth = false; + moduleQueried.gpsDay = false; + moduleQueried.gpsHour = false; + moduleQueried.gpsMinute = false; + moduleQueried.gpsSecond = false; + moduleQueried.gpsDateValid = false; + moduleQueried.gpsTimeValid = false; + moduleQueried.gpsNanosecond = false; + + moduleQueried.all = false; + moduleQueried.gnssFixOk = false; + moduleQueried.diffSoln = false; + moduleQueried.headVehValid = false; + moduleQueried.longitude = false; + moduleQueried.latitude = false; + moduleQueried.altitude = false; + moduleQueried.altitudeMSL = false; + moduleQueried.SIV = false; + moduleQueried.fixType = false; + moduleQueried.carrierSolution = false; + moduleQueried.groundSpeed = false; + moduleQueried.headingOfMotion = false; + moduleQueried.speedAccEst = false; + moduleQueried.headingAccEst = false; + moduleQueried.pDOP = false; + moduleQueried.invalidLlh = false; + moduleQueried.headVeh = false; + moduleQueried.magDec = false; + moduleQueried.magAcc = false; +} + +//Mark all the HPPOSLLH data as read/stale. This is handy to get data alignment after CRC failure +void SFE_UBLOX_GPS::flushHPPOSLLH() +{ + //Mark all datums as stale (read before) + highResModuleQueried.all = false; + highResModuleQueried.highResLatitude = false; + highResModuleQueried.highResLatitudeHp = false; + highResModuleQueried.highResLongitude = false; + highResModuleQueried.highResLongitudeHp = false; + highResModuleQueried.elipsoid = false; + highResModuleQueried.elipsoidHp = false; + highResModuleQueried.meanSeaLevel = false; + highResModuleQueried.meanSeaLevelHp = false; + highResModuleQueried.geoidSeparation = false; + highResModuleQueried.horizontalAccuracy = false; + highResModuleQueried.verticalAccuracy = false; + //moduleQueried.gpsiTOW = false; // this can arrive via HPPOS too. +} + +//Mark all the DOP data as read/stale. This is handy to get data alignment after CRC failure +void SFE_UBLOX_GPS::flushDOP() +{ + //Mark all DOPs as stale (read before) + dopModuleQueried.all = false; + dopModuleQueried.geometricDOP = false; + dopModuleQueried.positionDOP = false; + dopModuleQueried.timeDOP = false; + dopModuleQueried.verticalDOP = false; + dopModuleQueried.horizontalDOP = false; + dopModuleQueried.northingDOP = false; + dopModuleQueried.eastingDOP = false; +} + +//Relative Positioning Information in NED frame +//Returns true if commands was successful +//Note: +// RELPOSNED on the M8 is only 40 bytes long +// RELPOSNED on the F9 is 64 bytes long and contains much more information +boolean SFE_UBLOX_GPS::getRELPOSNED(uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_NAV; + packetCfg.id = UBX_NAV_RELPOSNED; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) // We are only expecting data (no ACK) + return (false); //If command send fails then bail + + //We got a response, now parse the bits + + uint16_t refStationID = extractInt(2); + //_debugSerial->print(F("refStationID: ")); + //_debugSerial->println(refStationID)); + + int32_t tempRelPos; + + tempRelPos = extractSignedLong(8); + relPosInfo.relPosN = ((float)tempRelPos) / 100.0; //Convert cm to m + + tempRelPos = extractSignedLong(12); + relPosInfo.relPosE = ((float)tempRelPos) / 100.0; //Convert cm to m + + tempRelPos = extractSignedLong(16); + relPosInfo.relPosD = ((float)tempRelPos) / 100.0; //Convert cm to m + + if (packetCfg.len == 40) + { + // The M8 version does not contain relPosLength or relPosHeading + relPosInfo.relPosLength = 0; + relPosInfo.relPosHeading = 0; + } + else + { + relPosInfo.relPosLength = extractSignedLong(20); + relPosInfo.relPosHeading = extractSignedLong(24); + } + + if (packetCfg.len == 40) + { + relPosInfo.relPosHPN = payloadCfg[20]; + relPosInfo.relPosHPE = payloadCfg[21]; + relPosInfo.relPosHPD = payloadCfg[22]; + relPosInfo.relPosHPLength = 0; // The M8 version does not contain relPosHPLength + } + else + { + relPosInfo.relPosHPN = payloadCfg[32]; + relPosInfo.relPosHPE = payloadCfg[33]; + relPosInfo.relPosHPD = payloadCfg[34]; + relPosInfo.relPosHPLength = payloadCfg[35]; + } + + uint32_t tempAcc; + + if (packetCfg.len == 40) + { + tempAcc = extractLong(24); + relPosInfo.accN = ((float)tempAcc) / 10000.0; //Convert 0.1 mm to m + tempAcc = extractLong(28); + relPosInfo.accE = ((float)tempAcc) / 10000.0; //Convert 0.1 mm to m + tempAcc = extractLong(32); + relPosInfo.accD = ((float)tempAcc) / 10000.0; //Convert 0.1 mm to m + } + else + { + tempAcc = extractLong(36); + relPosInfo.accN = ((float)tempAcc) / 10000.0; //Convert 0.1 mm to m + tempAcc = extractLong(40); + relPosInfo.accE = ((float)tempAcc) / 10000.0; //Convert 0.1 mm to m + tempAcc = extractLong(44); + relPosInfo.accD = ((float)tempAcc) / 10000.0; //Convert 0.1 mm to m + } + + uint8_t flags; + + if (packetCfg.len == 40) + { + flags = payloadCfg[36]; + } + else + { + flags = payloadCfg[60]; + } + + relPosInfo.gnssFixOk = flags & (1 << 0); + relPosInfo.diffSoln = flags & (1 << 1); + relPosInfo.relPosValid = flags & (1 << 2); + relPosInfo.carrSoln = (flags & (0b11 << 3)) >> 3; + relPosInfo.isMoving = flags & (1 << 5); + relPosInfo.refPosMiss = flags & (1 << 6); + relPosInfo.refObsMiss = flags & (1 << 7); + + return (true); +} + +boolean SFE_UBLOX_GPS::getEsfInfo(uint16_t maxWait) +{ + // Requesting Data from the receiver + packetCfg.cls = UBX_CLASS_ESF; + packetCfg.id = UBX_ESF_STATUS; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) + return (false); //If command send fails then bail + + //checkUblox(); + + // payload should be loaded. + imuMeas.version = extractByte(4); + imuMeas.fusionMode = extractByte(12); + ubloxSen.numSens = extractByte(15); + + // Individual Status Sensor in different function + return (true); +} + +// +boolean SFE_UBLOX_GPS::getEsfIns(uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_ESF; + packetCfg.id = UBX_ESF_INS; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) + return (false); //If command send fails then bail + + //checkUblox(); + + // Validity of each sensor value below + uint32_t validity = extractLong(0); + + imuMeas.xAngRateVald = (validity & 0x0100) >> 8; + imuMeas.yAngRateVald = (validity & 0x0200) >> 9; + imuMeas.zAngRateVald = (validity & 0x0400) >> 10; + imuMeas.xAccelVald = (validity & 0x0800) >> 11; + imuMeas.yAccelVald = (validity & 0x1000) >> 12; + imuMeas.zAccelVald = (validity & 0x2000) >> 13; + + imuMeas.xAngRate = extractSignedLong(12); // 0.001 deg/s + imuMeas.yAngRate = extractSignedLong(16); // 0.001 deg/s + imuMeas.zAngRate = extractSignedLong(20); // 0.001 deg/s + + imuMeas.xAccel = extractSignedLong(24); // 0.01 m/s^2 + imuMeas.yAccel = extractSignedLong(28); // 0.01 m/s^2 + imuMeas.zAccel = extractSignedLong(32); // 0.01 m/s^2 + + return (true); +} + +// +boolean SFE_UBLOX_GPS::getEsfDataInfo(uint16_t maxWait) +{ + + packetCfg.cls = UBX_CLASS_ESF; + packetCfg.id = UBX_ESF_MEAS; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) + return (false); //If command send fails then bail + + //checkUblox(); + + uint32_t timeStamp = extractLong(0); + uint32_t flags = extractInt(4); + + uint8_t timeSent = flags & 0x03; // timeSent is 2-bit: 0 = none, 1 = on Ext0, 2 = on Ext1 + uint8_t timeEdge = (flags & 0x04) >> 2; + uint8_t tagValid = (flags & 0x08) >> 3; + uint8_t numMeas = (flags & 0xF800) >> 11; + + if (numMeas > DEF_NUM_SENS) // Truncate numMeas if required + numMeas = DEF_NUM_SENS; + + uint8_t byteOffset = 4; + + for (uint8_t i = 0; i < numMeas; i++) + { + uint32_t bitField = extractLong(8 + (byteOffset * i)); + imuMeas.dataType[i] = (bitField & 0x3F000000) >> 24; + imuMeas.data[i] = (bitField & 0xFFFFFF); + } + + numMeas = (flags & 0xF800) >> 11; // Restore numMeas + + if (packetCfg.len > (8 + (4 * numMeas))) // The calibTtag is optional - only extract it if it is present + { + uint8_t startOfTtag = 8 + (4 * numMeas); // Calculate where the Ttag data starts + if (numMeas > DEF_NUM_SENS) // Truncate numMeas again if required + numMeas = DEF_NUM_SENS; + for (uint8_t i = 0; i < numMeas; i++) + { + imuMeas.dataTStamp[i] = extractLong(startOfTtag); // calibTtag is only appended once + } + } + + return (true); +} + +boolean SFE_UBLOX_GPS::getEsfRawDataInfo(uint16_t maxWait) +{ + + // Need to know the number of sensor to get the correct data + // Rate selected in UBX-CFG-MSG is not respected + packetCfg.cls = UBX_CLASS_ESF; + packetCfg.id = UBX_ESF_RAW; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) + return (false); //If command send fails then bail + + //checkUblox(); + + uint32_t bitField = extractLong(4); + imuMeas.rawDataType = (bitField & 0xFF000000) >> 24; + imuMeas.rawData = (bitField & 0xFFFFFF); + + imuMeas.rawTStamp = extractLong(8); + + return (true); +} + +// Note: senor numbering starts at 1 (not 0) +sfe_ublox_status_e SFE_UBLOX_GPS::getSensState(uint8_t sensor, uint16_t maxWait) +{ + + packetCfg.cls = UBX_CLASS_ESF; + packetCfg.id = UBX_ESF_STATUS; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) + return (SFE_UBLOX_STATUS_FAIL); //If command send fails then bail + + ubloxSen.numSens = extractByte(15); + + if (sensor > ubloxSen.numSens) + return (SFE_UBLOX_STATUS_OUT_OF_RANGE); + + //checkUblox(); + + uint8_t offset = 4; + + // Only the last sensor value checked will remain. + for (uint8_t i = 0; i < sensor; i++) + { + + uint8_t sensorFieldOne = extractByte(16 + (offset * i)); + uint8_t sensorFieldTwo = extractByte(17 + (offset * i)); + ubloxSen.freq = extractByte(18 + (offset * i)); + uint8_t sensorFieldThr = extractByte(19 + offset * i); + + ubloxSen.senType = (sensorFieldOne & 0x3F); + ubloxSen.isUsed = (sensorFieldOne & 0x40) >> 6; + ubloxSen.isReady = (sensorFieldOne & 0x80) >> 7; + + ubloxSen.calibStatus = sensorFieldTwo & 0x03; + ubloxSen.timeStatus = (sensorFieldTwo & 0xC) >> 2; + + ubloxSen.badMeas = (sensorFieldThr & 0x01); + ubloxSen.badTag = (sensorFieldThr & 0x02) >> 1; + ubloxSen.missMeas = (sensorFieldThr & 0x04) >> 2; + ubloxSen.noisyMeas = (sensorFieldThr & 0x08) >> 3; + } + + return (SFE_UBLOX_STATUS_SUCCESS); +} + +boolean SFE_UBLOX_GPS::getVehAtt(uint16_t maxWait) +{ + + packetCfg.cls = UBX_CLASS_NAV; + packetCfg.id = UBX_NAV_ATT; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) + return (SFE_UBLOX_STATUS_FAIL); //If command send fails then bail + + //checkUblox(); + + vehAtt.roll = extractSignedLong(8); // 0.00001 deg + vehAtt.pitch = extractSignedLong(12); // 0.00001 deg + vehAtt.heading = extractSignedLong(16); // 0.00001 deg + + vehAtt.accRoll = extractLong(20); // 0.00001 deg + vehAtt.accPitch = extractLong(24); // 0.00001 deg + vehAtt.accHeading = extractLong(28); // 0.00001 deg + + return (true); +} + +//Set the ECEF or Lat/Long coordinates of a receiver +//This imediately puts the receiver in TIME mode (fixed) and will begin outputting RTCM sentences if enabled +//This is helpful once an antenna's position has been established. See this tutorial: https://learn.sparkfun.com/tutorials/how-to-build-a-diy-gnss-reference-station#gather-raw-gnss-data +// For ECEF the units are: cm, 0.1mm, cm, 0.1mm, cm, 0.1mm +// For Lat/Lon/Alt the units are: degrees^-7, degrees^-9, degrees^-7, degrees^-9, cm, 0.1mm +bool SFE_UBLOX_GPS::setStaticPosition(int32_t ecefXOrLat, int8_t ecefXOrLatHP, int32_t ecefYOrLon, int8_t ecefYOrLonHP, int32_t ecefZOrAlt, int8_t ecefZOrAltHP, bool latLong, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_TMODE3; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + //Ask module for the current TimeMode3 settings. Loads into payloadCfg. + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) + return (false); + + packetCfg.len = 40; + + //Clear packet payload + for (uint8_t x = 0; x < packetCfg.len; x++) + payloadCfg[x] = 0; + + //customCfg should be loaded with poll response. Now modify only the bits we care about + payloadCfg[2] = 2; //Set mode to fixed. Use ECEF (not LAT/LON/ALT). + + if (latLong == true) + payloadCfg[3] = (uint8_t)(1 << 0); //Set mode to fixed. Use LAT/LON/ALT. + + //Set ECEF X or Lat + payloadCfg[4] = (ecefXOrLat >> 8 * 0) & 0xFF; //LSB + payloadCfg[5] = (ecefXOrLat >> 8 * 1) & 0xFF; + payloadCfg[6] = (ecefXOrLat >> 8 * 2) & 0xFF; + payloadCfg[7] = (ecefXOrLat >> 8 * 3) & 0xFF; //MSB + + //Set ECEF Y or Long + payloadCfg[8] = (ecefYOrLon >> 8 * 0) & 0xFF; //LSB + payloadCfg[9] = (ecefYOrLon >> 8 * 1) & 0xFF; + payloadCfg[10] = (ecefYOrLon >> 8 * 2) & 0xFF; + payloadCfg[11] = (ecefYOrLon >> 8 * 3) & 0xFF; //MSB + + //Set ECEF Z or Altitude + payloadCfg[12] = (ecefZOrAlt >> 8 * 0) & 0xFF; //LSB + payloadCfg[13] = (ecefZOrAlt >> 8 * 1) & 0xFF; + payloadCfg[14] = (ecefZOrAlt >> 8 * 2) & 0xFF; + payloadCfg[15] = (ecefZOrAlt >> 8 * 3) & 0xFF; //MSB + + //Set high precision parts + payloadCfg[16] = ecefXOrLatHP; + payloadCfg[17] = ecefYOrLonHP; + payloadCfg[18] = ecefZOrAltHP; + + return ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK +} + +bool SFE_UBLOX_GPS::setStaticPosition(int32_t ecefXOrLat, int32_t ecefYOrLon, int32_t ecefZOrAlt, bool latlong, uint16_t maxWait) +{ + return (setStaticPosition(ecefXOrLat, 0, ecefYOrLon, 0, ecefZOrAlt, 0, latlong, maxWait)); +} + +// Push (e.g.) RTCM data directly to the module +// Returns true if all numDataBytes were pushed successfully +// Warning: this function does not check that the data is valid. It is the user's responsibility to ensure the data is valid before pushing. +boolean SFE_UBLOX_GPS::pushRawData(uint8_t *dataBytes, size_t numDataBytes) +{ + if (commType == COMM_TYPE_SERIAL) + { + // Serial: write all the bytes in one go + size_t bytesWritten = _serialPort->write(dataBytes, numDataBytes); + return (bytesWritten == numDataBytes); + } + else + { + // I2C: split the data up into packets of i2cTransactionSize + size_t bytesLeftToWrite = numDataBytes; + size_t bytesWrittenTotal = 0; + + while (bytesLeftToWrite > 0) + { + size_t bytesToWrite; // Limit bytesToWrite to i2cTransactionSize + if (bytesLeftToWrite > i2cTransactionSize) + bytesToWrite = i2cTransactionSize; + else + bytesToWrite = bytesLeftToWrite; + + _i2cPort->beginTransmission(_gpsI2Caddress); + size_t bytesWritten = _i2cPort->write(dataBytes, bytesToWrite); // Write the bytes + + bytesWrittenTotal += bytesWritten; // Update the totals + bytesLeftToWrite -= bytesToWrite; + dataBytes += bytesToWrite; // Point to fresh data + + if (bytesLeftToWrite > 0) + { + if (_i2cPort->endTransmission(false) != 0) //Send a restart command. Do not release bus. + return (false); //Sensor did not ACK + } + else + { + if (_i2cPort->endTransmission() != 0) //We're done. Release bus. + return (false); //Sensor did not ACK + } + } + + return (bytesWrittenTotal == numDataBytes); + } +} + +// Set the High Navigation Rate +// Returns true if the setHNRNavigationRate is successful +boolean SFE_UBLOX_GPS::setHNRNavigationRate(uint8_t rate, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_HNR; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + //Ask module for the current HNR settings. Loads into payloadCfg. + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) + return (false); + + //Load the new navigation rate into payloadCfg + payloadCfg[0] = rate; + + //Update the navigation rate + sfe_ublox_status_e result = sendCommand(&packetCfg, maxWait); // We are only expecting an ACK + + //Adjust the I2C polling timeout based on update rate + if (result == SFE_UBLOX_STATUS_DATA_SENT) + i2cPollingWait = 1000 / (((int)rate) * 4); //This is the number of ms to wait between checks for new I2C data + + return (result == SFE_UBLOX_STATUS_DATA_SENT); +} + +// Get the High Navigation Rate +// Returns 0 if the getHNRNavigationRate fails +uint8_t SFE_UBLOX_GPS::getHNRNavigationRate(uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_HNR; + packetCfg.len = 0; + packetCfg.startingSpot = 0; + + //Ask module for the current HNR settings. Loads into payloadCfg. + if (sendCommand(&packetCfg, maxWait) != SFE_UBLOX_STATUS_DATA_RECEIVED) + return (0); + + //Return the navigation rate + return (payloadCfg[0]); +} + +//In case no config access to the GPS is possible and HNR attitude is send cyclically already +//set config to suitable parameters +boolean SFE_UBLOX_GPS::assumeAutoHNRAtt(boolean enabled, boolean implicitUpdate) +{ + boolean changes = autoHNRAtt != enabled || autoHNRAttImplicitUpdate != implicitUpdate; + if (changes) + { + autoHNRAtt = enabled; + autoHNRAttImplicitUpdate = implicitUpdate; + } + return changes; +} + +//Enable or disable automatic HNR attitude message generation by the GPS. This changes the way getHNRAtt +//works. +boolean SFE_UBLOX_GPS::setAutoHNRAtt(boolean enable, uint16_t maxWait) +{ + return setAutoHNRAtt(enable, true, maxWait); +} + +//Enable or disable automatic HNR attitude message generation by the GPS. This changes the way getHNRAtt +//works. +boolean SFE_UBLOX_GPS::setAutoHNRAtt(boolean enable, boolean implicitUpdate, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_MSG; + packetCfg.len = 3; + packetCfg.startingSpot = 0; + payloadCfg[0] = UBX_CLASS_HNR; + payloadCfg[1] = UBX_HNR_ATT; + payloadCfg[2] = enable ? 1 : 0; // rate relative to navigation freq. + + boolean ok = ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK + if (ok) + { + autoHNRAtt = enable; + autoHNRAttImplicitUpdate = implicitUpdate; + } + hnrAttQueried = false; // Mark data as stale + return ok; +} + +//Get the HNR Attitude data +// Returns true if the get HNR attitude is successful. Data is returned in hnrAtt +// Note: if hnrAttQueried is true, it gets set to false by this function since we assume +// that the user will read hnrAtt immediately after this. I.e. this function will +// only return true _once_ after each auto HNR Att is processed +boolean SFE_UBLOX_GPS::getHNRAtt(uint16_t maxWait) +{ + if (autoHNRAtt && autoHNRAttImplicitUpdate) + { + //The GPS is automatically reporting, we just check whether we got unread data + if (_printDebug == true) + { + _debugSerial->println(F("getHNRAtt: Autoreporting")); + } + checkUbloxInternal(&packetCfg, UBX_CLASS_HNR, UBX_HNR_ATT); + if (hnrAttQueried) + { + hnrAttQueried = false; // Mark data as stale as we assume the user will read it after this + return true; + } + return false; + } + else if (autoHNRAtt && !autoHNRAttImplicitUpdate) + { + //Someone else has to call checkUblox for us... + if (_printDebug == true) + { + _debugSerial->println(F("getHNRAtt: Exit immediately")); + } + return (false); + } + else + { + if (_printDebug == true) + { + _debugSerial->println(F("getHNRAtt: Polling")); + } + + //The GPS is not automatically reporting HNR attitude so we have to poll explicitly + packetCfg.cls = UBX_CLASS_HNR; + packetCfg.id = UBX_HNR_ATT; + packetCfg.len = 0; + + //The data is parsed as part of processing the response + sfe_ublox_status_e retVal = sendCommand(&packetCfg, maxWait); + + if (retVal == SFE_UBLOX_STATUS_DATA_RECEIVED) + return (true); + + if ((retVal == SFE_UBLOX_STATUS_DATA_OVERWRITTEN) && (packetCfg.cls == UBX_CLASS_NAV)) + { + if (_printDebug == true) + { + _debugSerial->println(F("getHNRAtt: data was OVERWRITTEN by a NAV message (and that's not OK)")); + } + return (false); + } + + if ((retVal == SFE_UBLOX_STATUS_DATA_OVERWRITTEN) && (packetCfg.cls == UBX_CLASS_HNR)) + { + if (_printDebug == true) + { + _debugSerial->println(F("getHNRAtt: data was OVERWRITTEN by another HNR message (but that's OK)")); + } + return (true); + } + + if (_printDebug == true) + { + _debugSerial->print(F("getHNRAtt retVal: ")); + _debugSerial->println(statusString(retVal)); + } + return (false); + } + + return (false); // Trap. We should never get here... +} + +//In case no config access to the GPS is possible and HNR vehicle dynamics is send cyclically already +//set config to suitable parameters +boolean SFE_UBLOX_GPS::assumeAutoHNRDyn(boolean enabled, boolean implicitUpdate) +{ + boolean changes = autoHNRDyn != enabled || autoHNRDynImplicitUpdate != implicitUpdate; + if (changes) + { + autoHNRDyn = enabled; + autoHNRDynImplicitUpdate = implicitUpdate; + } + return changes; +} + +//Enable or disable automatic HNR vehicle dynamics message generation by the GPS. This changes the way getHNRDyn +//works. +boolean SFE_UBLOX_GPS::setAutoHNRDyn(boolean enable, uint16_t maxWait) +{ + return setAutoHNRDyn(enable, true, maxWait); +} + +//Enable or disable automatic HNR vehicle dynamics message generation by the GPS. This changes the way getHNRDyn +//works. +boolean SFE_UBLOX_GPS::setAutoHNRDyn(boolean enable, boolean implicitUpdate, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_MSG; + packetCfg.len = 3; + packetCfg.startingSpot = 0; + payloadCfg[0] = UBX_CLASS_HNR; + payloadCfg[1] = UBX_HNR_INS; + payloadCfg[2] = enable ? 1 : 0; // rate relative to navigation freq. + + boolean ok = ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK + if (ok) + { + autoHNRDyn = enable; + autoHNRDynImplicitUpdate = implicitUpdate; + } + hnrDynQueried = false; // Mark data as stale + return ok; +} + +//Get the HNR vehicle dynamics data +// Returns true if the get HNR vehicle dynamics is successful. Data is returned in hnrVehDyn +// Note: if hnrDynQueried is true, it gets set to false by this function since we assume +// that the user will read hnrVehDyn immediately after this. I.e. this function will +// only return true _once_ after each auto HNR Dyn is processed +boolean SFE_UBLOX_GPS::getHNRDyn(uint16_t maxWait) +{ + if (autoHNRDyn && autoHNRDynImplicitUpdate) + { + //The GPS is automatically reporting, we just check whether we got unread data + if (_printDebug == true) + { + _debugSerial->println(F("getHNRDyn: Autoreporting")); + } + checkUbloxInternal(&packetCfg, UBX_CLASS_HNR, UBX_HNR_INS); + if (hnrDynQueried) + { + hnrDynQueried = false; // Mark data as stale as we assume the user will read it after this + return true; + } + return false; + } + else if (autoHNRDyn && !autoHNRDynImplicitUpdate) + { + //Someone else has to call checkUblox for us... + if (_printDebug == true) + { + _debugSerial->println(F("getHNRDyn: Exit immediately")); + } + return (false); + } + else + { + if (_printDebug == true) + { + _debugSerial->println(F("getHNRDyn: Polling")); + } + + //The GPS is not automatically reporting HNR vehicle dynamics so we have to poll explicitly + packetCfg.cls = UBX_CLASS_HNR; + packetCfg.id = UBX_HNR_INS; + packetCfg.len = 0; + + //The data is parsed as part of processing the response + sfe_ublox_status_e retVal = sendCommand(&packetCfg, maxWait); + + if (retVal == SFE_UBLOX_STATUS_DATA_RECEIVED) + return (true); + + if ((retVal == SFE_UBLOX_STATUS_DATA_OVERWRITTEN) && (packetCfg.cls == UBX_CLASS_NAV)) + { + if (_printDebug == true) + { + _debugSerial->println(F("getHNRDyn: data was OVERWRITTEN by a NAV message (and that's not OK)")); + } + return (false); + } + + if ((retVal == SFE_UBLOX_STATUS_DATA_OVERWRITTEN) && (packetCfg.cls == UBX_CLASS_HNR)) + { + if (_printDebug == true) + { + _debugSerial->println(F("getHNRDyn: data was OVERWRITTEN by another HNR message (but that's OK)")); + } + return (true); + } + + if (_printDebug == true) + { + _debugSerial->print(F("getHNRDyn retVal: ")); + _debugSerial->println(statusString(retVal)); + } + return (false); + } + + return (false); // Trap. We should never get here... +} + +//In case no config access to the GPS is possible and HNR PVT is send cyclically already +//set config to suitable parameters +boolean SFE_UBLOX_GPS::assumeAutoHNRPVT(boolean enabled, boolean implicitUpdate) +{ + boolean changes = autoHNRPVT != enabled || autoHNRPVTImplicitUpdate != implicitUpdate; + if (changes) + { + autoHNRPVT = enabled; + autoHNRPVTImplicitUpdate = implicitUpdate; + } + return changes; +} + +//Enable or disable automatic HNR PVT message generation by the GPS. This changes the way getHNRPVT +//works. +boolean SFE_UBLOX_GPS::setAutoHNRPVT(boolean enable, uint16_t maxWait) +{ + return setAutoHNRPVT(enable, true, maxWait); +} + +//Enable or disable automatic HNR PVT message generation by the GPS. This changes the way getHNRPVT +//works. +boolean SFE_UBLOX_GPS::setAutoHNRPVT(boolean enable, boolean implicitUpdate, uint16_t maxWait) +{ + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_MSG; + packetCfg.len = 3; + packetCfg.startingSpot = 0; + payloadCfg[0] = UBX_CLASS_HNR; + payloadCfg[1] = UBX_HNR_PVT; + payloadCfg[2] = enable ? 1 : 0; // rate relative to navigation freq. + + boolean ok = ((sendCommand(&packetCfg, maxWait)) == SFE_UBLOX_STATUS_DATA_SENT); // We are only expecting an ACK + if (ok) + { + autoHNRPVT = enable; + autoHNRPVTImplicitUpdate = implicitUpdate; + } + hnrPVTQueried = false; // Mark data as stale + return ok; +} + +//Get the HNR PVT data +// Returns true if the get HNR PVT is successful. Data is returned in hnrPVT +// Note: if hnrPVTQueried is true, it gets set to false by this function since we assume +// that the user will read hnrPVT immediately after this. I.e. this function will +// only return true _once_ after each auto HNR PVT is processed +boolean SFE_UBLOX_GPS::getHNRPVT(uint16_t maxWait) +{ + if (autoHNRPVT && autoHNRPVTImplicitUpdate) + { + //The GPS is automatically reporting, we just check whether we got unread data + if (_printDebug == true) + { + _debugSerial->println(F("getHNRPVT: Autoreporting")); + } + checkUbloxInternal(&packetCfg, UBX_CLASS_HNR, UBX_HNR_PVT); + if (hnrPVTQueried) + { + hnrPVTQueried = false; // Mark data as stale as we assume the user will read it after this + return true; + } + return false; + } + else if (autoHNRPVT && !autoHNRPVTImplicitUpdate) + { + //Someone else has to call checkUblox for us... + if (_printDebug == true) + { + _debugSerial->println(F("getHNRPVT: Exit immediately")); + } + return (false); + } + else + { + if (_printDebug == true) + { + _debugSerial->println(F("getHNRPVT: Polling")); + } + + //The GPS is not automatically reporting HNR PVT so we have to poll explicitly + packetCfg.cls = UBX_CLASS_HNR; + packetCfg.id = UBX_HNR_PVT; + packetCfg.len = 0; + + //The data is parsed as part of processing the response + sfe_ublox_status_e retVal = sendCommand(&packetCfg, maxWait); + + if (retVal == SFE_UBLOX_STATUS_DATA_RECEIVED) + return (true); + + if ((retVal == SFE_UBLOX_STATUS_DATA_OVERWRITTEN) && (packetCfg.cls == UBX_CLASS_NAV)) + { + if (_printDebug == true) + { + _debugSerial->println(F("getHNRPVT: data was OVERWRITTEN by a NAV message (and that's not OK)")); + } + return (false); + } + + if ((retVal == SFE_UBLOX_STATUS_DATA_OVERWRITTEN) && (packetCfg.cls == UBX_CLASS_HNR)) + { + if (_printDebug == true) + { + _debugSerial->println(F("getHNRPVT: data was OVERWRITTEN by another HNR message (but that's OK)")); + } + return (true); + } + + if (_printDebug == true) + { + _debugSerial->print(F("getHNRPVT retVal: ")); + _debugSerial->println(statusString(retVal)); + } + return (false); + } + + return (false); // Trap. We should never get here... +} + + +boolean SFE_UBLOX_GPS::getPOSLLH(uint16_t maxWait) +{ + debugPrintln((char *)F("getPOSLLH: Polling")); + + //The GPS is not automatically reporting navigation position so we have to poll explicitly + packetCfg.cls = UBX_CLASS_NAV; + packetCfg.id = UBX_NAV_POSLLH; + packetCfg.len = 0; + //packetCfg.startingSpot = 20; //Begin listening at spot 20 so we can record up to 20+MAX_PAYLOAD_SIZE = 84 bytes Note:now hard-coded in processUBX + + //The data is parsed as part of processing the response + sfe_ublox_status_e retVal = sendCommand(&packetCfg, maxWait); + + if (_printDebug == true) + { + _debugSerial->print(F("getPOSLLH retVal: ")); + _debugSerial->println(statusString(retVal)); + } + + if (retVal == SFE_UBLOX_STATUS_DATA_RECEIVED || retVal == SFE_UBLOX_STATUS_SUCCESS) + return (true); + + return (false); +} + +#define UBX_SYNC1 0xb5 // UBX protocol synchronization characters +#define UBX_SYNC2 0x62 + +#define PARSER_INCOMPLETE 1 +#define PARSER_ERROR -1 +#define PARSER_COMPLETE 0 + +int parse_ubx_stream (uint8_t c, ubxPacket *packet,uint8_t *data) +{ + enum proto_states { + START, + UBX_SY2, + UBX_CLASS, + UBX_ID, + UBX_LEN1, + UBX_LEN2, + UBX_PAYLOAD, + UBX_CHK1, + UBX_CHK2, + FINISHED + }; + + static enum proto_states proto_state = START; + static uint16_t rx_count = 0; + + switch (proto_state) { + case START: // detect protocol + if (c == UBX_SYNC1) // first UBX sync char found + proto_state = UBX_SY2; + break; + case UBX_SY2: + if (c == UBX_SYNC2) // second UBX sync char found + proto_state = UBX_CLASS; + else + proto_state = START; // reset state + break; + case UBX_CLASS: + packet->cls = c; + proto_state = UBX_ID; + break; + case UBX_ID: + packet->id = c; + proto_state = UBX_LEN1; + break; + case UBX_LEN1: + packet->len = c; + proto_state = UBX_LEN2; + break; + case UBX_LEN2: + packet->len += (c << 8); + if (packet->len > MAX_PAYLOAD_SIZE) { + proto_state = START; + } else { + rx_count = 0; + proto_state = UBX_PAYLOAD; + } + break; + case UBX_PAYLOAD: + if (rx_count < packet->len) { + data[rx_count] = c; + if (++rx_count == packet->len) + proto_state = UBX_CHK1; + } else { + proto_state = START; + } + break; + case UBX_CHK1: + packet->checksumA = c; + proto_state = UBX_CHK2; + break; + case UBX_CHK2: + packet->checksumB = c; + proto_state = FINISHED; + break; + default: break; + } + + if (proto_state == START) + return PARSER_ERROR; // parser couldn't use this byte + else if (proto_state == FINISHED) { + proto_state = START; + return PARSER_COMPLETE; // message complete & processed + } + + return PARSER_INCOMPLETE; // message not (yet) complete +} + +boolean SFE_UBLOX_GPS::sendNavigationDatabase(uint8_t *data, int16_t size) +{ + int sended = 0; + while(sendedavailable()) + { + if(cnt>0) + cnt = 0; + int state = parse_ubx_stream(_serialPort->read(),&packet,payloadCfg); + if(state==PARSER_COMPLETE) + { + if(packet.cls == UBX_CLASS_MGA && packet.id==UBX_MGA_DBD) + { + cnt = 0; + if(packet.len<256 && (packet.len+pos)> 8; + memcpy(&data[pos],payloadCfg,packet.len); + pos += packet.len; + } + } + } + } + cnt++; + } + size = pos; + return true; +} \ No newline at end of file diff --git a/lib/SparkFun u-blox Arduino Library/SparkFun_Ublox_Arduino_Library.h b/lib/SparkFun u-blox Arduino Library/SparkFun_Ublox_Arduino_Library.h new file mode 100644 index 0000000..1244081 --- /dev/null +++ b/lib/SparkFun u-blox Arduino Library/SparkFun_Ublox_Arduino_Library.h @@ -0,0 +1,1119 @@ +/* + This is a library written for the u-blox ZED-F9P and NEO-M8P-2 + SparkFun sells these at its website: www.sparkfun.com + Do you like this library? Help support SparkFun. Buy a board! + https://www.sparkfun.com/products/16481 + https://www.sparkfun.com/products/15136 + https://www.sparkfun.com/products/15005 + https://www.sparkfun.com/products/15733 + https://www.sparkfun.com/products/15193 + https://www.sparkfun.com/products/15210 + + Written by Nathan Seidle @ SparkFun Electronics, September 6th, 2018 + + This library handles configuring and handling the responses + from a u-blox GPS module. Works with most modules from u-blox including + the Zed-F9P, NEO-M8P-2, NEO-M9N, ZOE-M8Q, SAM-M8Q, and many others. + + https://github.com/sparkfun/SparkFun_Ublox_Arduino_Library + + Development environment specifics: + Arduino IDE 1.8.5 + + SparkFun code, firmware, and software is released under the MIT License(http://opensource.org/licenses/MIT). + The MIT License (MIT) + Copyright (c) 2016 SparkFun Electronics + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the Software is furnished to + do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial + portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef SPARKFUN_UBLOX_ARDUINO_LIBRARY_H +#define SPARKFUN_UBLOX_ARDUINO_LIBRARY_H + +#if (ARDUINO >= 100) +#include "Arduino.h" +#else +#include "WProgram.h" +#endif + +#include + +#include "u-blox_config_keys.h" + +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +//Define a digital pin to aid checksum failure capture and analysis +//Leave set to -1 if not needed +const int checksumFailurePin = -1; + +// Global Status Returns +typedef enum +{ + SFE_UBLOX_STATUS_SUCCESS, + SFE_UBLOX_STATUS_FAIL, + SFE_UBLOX_STATUS_CRC_FAIL, + SFE_UBLOX_STATUS_TIMEOUT, + SFE_UBLOX_STATUS_COMMAND_NACK, // Indicates that the command was unrecognised, invalid or that the module is too busy to respond + SFE_UBLOX_STATUS_OUT_OF_RANGE, + SFE_UBLOX_STATUS_INVALID_ARG, + SFE_UBLOX_STATUS_INVALID_OPERATION, + SFE_UBLOX_STATUS_MEM_ERR, + SFE_UBLOX_STATUS_HW_ERR, + SFE_UBLOX_STATUS_DATA_SENT, // This indicates that a 'set' was successful + SFE_UBLOX_STATUS_DATA_RECEIVED, // This indicates that a 'get' (poll) was successful + SFE_UBLOX_STATUS_I2C_COMM_FAILURE, + SFE_UBLOX_STATUS_DATA_OVERWRITTEN // This is an error - the data was valid but has been or _is being_ overwritten by another packet +} sfe_ublox_status_e; + +// ubxPacket validity +typedef enum +{ + SFE_UBLOX_PACKET_VALIDITY_NOT_VALID, + SFE_UBLOX_PACKET_VALIDITY_VALID, + SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED, + SFE_UBLOX_PACKET_NOTACKNOWLEDGED // This indicates that we received a NACK +} sfe_ublox_packet_validity_e; + +// Identify which packet buffer is in use: +// packetCfg (or a custom packet), packetAck or packetBuf +typedef enum +{ + SFE_UBLOX_PACKET_PACKETCFG, + SFE_UBLOX_PACKET_PACKETACK, + SFE_UBLOX_PACKET_PACKETBUF +} sfe_ublox_packet_buffer_e; + +//Registers +const uint8_t UBX_SYNCH_1 = 0xB5; +const uint8_t UBX_SYNCH_2 = 0x62; + +//The following are UBX Class IDs. Descriptions taken from ZED-F9P Interface Description Document page 32, NEO-M8P Interface Description page 145 +const uint8_t UBX_CLASS_NAV = 0x01; //Navigation Results Messages: Position, Speed, Time, Acceleration, Heading, DOP, SVs used +const uint8_t UBX_CLASS_RXM = 0x02; //Receiver Manager Messages: Satellite Status, RTC Status +const uint8_t UBX_CLASS_INF = 0x04; //Information Messages: Printf-Style Messages, with IDs such as Error, Warning, Notice +const uint8_t UBX_CLASS_ACK = 0x05; //Ack/Nak Messages: Acknowledge or Reject messages to UBX-CFG input messages +const uint8_t UBX_CLASS_CFG = 0x06; //Configuration Input Messages: Configure the receiver. +const uint8_t UBX_CLASS_UPD = 0x09; //Firmware Update Messages: Memory/Flash erase/write, Reboot, Flash identification, etc. +const uint8_t UBX_CLASS_MON = 0x0A; //Monitoring Messages: Communication Status, CPU Load, Stack Usage, Task Status +const uint8_t UBX_CLASS_AID = 0x0B; //(NEO-M8P ONLY!!!) AssistNow Aiding Messages: Ephemeris, Almanac, other A-GPS data input +const uint8_t UBX_CLASS_TIM = 0x0D; //Timing Messages: Time Pulse Output, Time Mark Results +const uint8_t UBX_CLASS_ESF = 0x10; //(NEO-M8P ONLY!!!) External Sensor Fusion Messages: External Sensor Measurements and Status Information +const uint8_t UBX_CLASS_MGA = 0x13; //Multiple GNSS Assistance Messages: Assistance data for various GNSS +const uint8_t UBX_CLASS_LOG = 0x21; //Logging Messages: Log creation, deletion, info and retrieval +const uint8_t UBX_CLASS_SEC = 0x27; //Security Feature Messages +const uint8_t UBX_CLASS_HNR = 0x28; //(NEO-M8P ONLY!!!) High Rate Navigation Results Messages: High rate time, position speed, heading +const uint8_t UBX_CLASS_NMEA = 0xF0; //NMEA Strings: standard NMEA strings + +//The following are used for configuration. Descriptions are from the ZED-F9P Interface Description pg 33-34 and NEO-M9N Interface Description pg 47-48 +const uint8_t UBX_CFG_ANT = 0x13; //Antenna Control Settings. Used to configure the antenna control settings +const uint8_t UBX_CFG_BATCH = 0x93; //Get/set data batching configuration. +const uint8_t UBX_CFG_CFG = 0x09; //Clear, Save, and Load Configurations. Used to save current configuration +const uint8_t UBX_CFG_DAT = 0x06; //Set User-defined Datum or The currently defined Datum +const uint8_t UBX_CFG_DGNSS = 0x70; //DGNSS configuration +const uint8_t UBX_CFG_ESFALG = 0x56; //ESF alignment +const uint8_t UBX_CFG_ESFA = 0x4C; //ESF accelerometer +const uint8_t UBX_CFG_ESFG = 0x4D; //ESF gyro +const uint8_t UBX_CFG_GEOFENCE = 0x69; //Geofencing configuration. Used to configure a geofence +const uint8_t UBX_CFG_GNSS = 0x3E; //GNSS system configuration +const uint8_t UBX_CFG_HNR = 0x5C; //High Navigation Rate +const uint8_t UBX_CFG_INF = 0x02; //Depending on packet length, either: poll configuration for one protocol, or information message configuration +const uint8_t UBX_CFG_ITFM = 0x39; //Jamming/Interference Monitor configuration +const uint8_t UBX_CFG_LOGFILTER = 0x47; //Data Logger Configuration +const uint8_t UBX_CFG_MSG = 0x01; //Poll a message configuration, or Set Message Rate(s), or Set Message Rate +const uint8_t UBX_CFG_NAV5 = 0x24; //Navigation Engine Settings. Used to configure the navigation engine including the dynamic model. +const uint8_t UBX_CFG_NAVX5 = 0x23; //Navigation Engine Expert Settings +const uint8_t UBX_CFG_NMEA = 0x17; //Extended NMEA protocol configuration V1 +const uint8_t UBX_CFG_ODO = 0x1E; //Odometer, Low-speed COG Engine Settings +const uint8_t UBX_CFG_PM2 = 0x3B; //Extended power management configuration +const uint8_t UBX_CFG_PMS = 0x86; //Power mode setup +const uint8_t UBX_CFG_PRT = 0x00; //Used to configure port specifics. Polls the configuration for one I/O Port, or Port configuration for UART ports, or Port configuration for USB port, or Port configuration for SPI port, or Port configuration for DDC port +const uint8_t UBX_CFG_PWR = 0x57; //Put receiver in a defined power state +const uint8_t UBX_CFG_RATE = 0x08; //Navigation/Measurement Rate Settings. Used to set port baud rates. +const uint8_t UBX_CFG_RINV = 0x34; //Contents of Remote Inventory +const uint8_t UBX_CFG_RST = 0x04; //Reset Receiver / Clear Backup Data Structures. Used to reset device. +const uint8_t UBX_CFG_RXM = 0x11; //RXM configuration +const uint8_t UBX_CFG_SBAS = 0x16; //SBAS configuration +const uint8_t UBX_CFG_TMODE3 = 0x71; //Time Mode Settings 3. Used to enable Survey In Mode +const uint8_t UBX_CFG_TP5 = 0x31; //Time Pulse Parameters +const uint8_t UBX_CFG_USB = 0x1B; //USB Configuration +const uint8_t UBX_CFG_VALDEL = 0x8C; //Used for config of higher version u-blox modules (ie protocol v27 and above). Deletes values corresponding to provided keys/ provided keys with a transaction +const uint8_t UBX_CFG_VALGET = 0x8B; //Used for config of higher version u-blox modules (ie protocol v27 and above). Configuration Items +const uint8_t UBX_CFG_VALSET = 0x8A; //Used for config of higher version u-blox modules (ie protocol v27 and above). Sets values corresponding to provided key-value pairs/ provided key-value pairs within a transaction. + +//The following are used to enable NMEA messages. Descriptions come from the NMEA messages overview in the ZED-F9P Interface Description +const uint8_t UBX_NMEA_MSB = 0xF0; //All NMEA enable commands have 0xF0 as MSB +const uint8_t UBX_NMEA_DTM = 0x0A; //GxDTM (datum reference) +const uint8_t UBX_NMEA_GAQ = 0x45; //GxGAQ (poll a standard message (if the current talker ID is GA)) +const uint8_t UBX_NMEA_GBQ = 0x44; //GxGBQ (poll a standard message (if the current Talker ID is GB)) +const uint8_t UBX_NMEA_GBS = 0x09; //GxGBS (GNSS satellite fault detection) +const uint8_t UBX_NMEA_GGA = 0x00; //GxGGA (Global positioning system fix data) +const uint8_t UBX_NMEA_GLL = 0x01; //GxGLL (latitude and long, whith time of position fix and status) +const uint8_t UBX_NMEA_GLQ = 0x43; //GxGLQ (poll a standard message (if the current Talker ID is GL)) +const uint8_t UBX_NMEA_GNQ = 0x42; //GxGNQ (poll a standard message (if the current Talker ID is GN)) +const uint8_t UBX_NMEA_GNS = 0x0D; //GxGNS (GNSS fix data) +const uint8_t UBX_NMEA_GPQ = 0x040; //GxGPQ (poll a standard message (if the current Talker ID is GP)) +const uint8_t UBX_NMEA_GRS = 0x06; //GxGRS (GNSS range residuals) +const uint8_t UBX_NMEA_GSA = 0x02; //GxGSA (GNSS DOP and Active satellites) +const uint8_t UBX_NMEA_GST = 0x07; //GxGST (GNSS Pseudo Range Error Statistics) +const uint8_t UBX_NMEA_GSV = 0x03; //GxGSV (GNSS satellites in view) +const uint8_t UBX_NMEA_RMC = 0x04; //GxRMC (Recommended minimum data) +const uint8_t UBX_NMEA_TXT = 0x41; //GxTXT (text transmission) +const uint8_t UBX_NMEA_VLW = 0x0F; //GxVLW (dual ground/water distance) +const uint8_t UBX_NMEA_VTG = 0x05; //GxVTG (course over ground and Ground speed) +const uint8_t UBX_NMEA_ZDA = 0x08; //GxZDA (Time and Date) + +//The following are used to configure the NMEA protocol main talker ID and GSV talker ID +const uint8_t UBX_NMEA_MAINTALKERID_NOTOVERRIDDEN = 0x00; //main talker ID is system dependent +const uint8_t UBX_NMEA_MAINTALKERID_GP = 0x01; //main talker ID is GPS +const uint8_t UBX_NMEA_MAINTALKERID_GL = 0x02; //main talker ID is GLONASS +const uint8_t UBX_NMEA_MAINTALKERID_GN = 0x03; //main talker ID is combined receiver +const uint8_t UBX_NMEA_MAINTALKERID_GA = 0x04; //main talker ID is Galileo +const uint8_t UBX_NMEA_MAINTALKERID_GB = 0x05; //main talker ID is BeiDou +const uint8_t UBX_NMEA_GSVTALKERID_GNSS = 0x00; //GNSS specific Talker ID (as defined by NMEA) +const uint8_t UBX_NMEA_GSVTALKERID_MAIN = 0x01; //use the main Talker ID + +//The following are used to configure the HNR message rates +const uint8_t UBX_HNR_ATT = 0x01; //HNR Attitude +const uint8_t UBX_HNR_INS = 0x02; //HNR Vehicle Dynamics +const uint8_t UBX_HNR_PVT = 0x00; //HNR PVT + +//The following are used to configure INF UBX messages (information messages). Descriptions from UBX messages overview (ZED_F9P Interface Description Document page 34) +const uint8_t UBX_INF_CLASS = 0x04; //All INF messages have 0x04 as the class +const uint8_t UBX_INF_DEBUG = 0x04; //ASCII output with debug contents +const uint8_t UBX_INF_ERROR = 0x00; //ASCII output with error contents +const uint8_t UBX_INF_NOTICE = 0x02; //ASCII output with informational contents +const uint8_t UBX_INF_TEST = 0x03; //ASCII output with test contents +const uint8_t UBX_INF_WARNING = 0x01; //ASCII output with warning contents + +//The following are used to configure LOG UBX messages (loggings messages). Descriptions from UBX messages overview (ZED_F9P Interface Description Document page 34) +const uint8_t UBX_LOG_CREATE = 0x07; //Create Log File +const uint8_t UBX_LOG_ERASE = 0x03; //Erase Logged Data +const uint8_t UBX_LOG_FINDTIME = 0x0E; //Find index of a log entry based on a given time, or response to FINDTIME requested +const uint8_t UBX_LOG_INFO = 0x08; //Poll for log information, or Log information +const uint8_t UBX_LOG_RETRIEVEPOSEXTRA = 0x0F; //Odometer log entry +const uint8_t UBX_LOG_RETRIEVEPOS = 0x0B; //Position fix log entry +const uint8_t UBX_LOG_RETRIEVESTRING = 0x0D; //Byte string log entry +const uint8_t UBX_LOG_RETRIEVE = 0x09; //Request log data +const uint8_t UBX_LOG_STRING = 0x04; //Store arbitrary string on on-board flash + +//The following are used to configure MGA UBX messages (Multiple GNSS Assistance Messages). Descriptions from UBX messages overview (ZED_F9P Interface Description Document page 34) +const uint8_t UBX_MGA_ACK_DATA0 = 0x60; //Multiple GNSS Acknowledge message +const uint8_t UBX_MGA_BDS_EPH = 0x03; //BDS Ephemeris Assistance +const uint8_t UBX_MGA_BDS_ALM = 0x03; //BDS Almanac Assistance +const uint8_t UBX_MGA_BDS_HEALTH = 0x03; //BDS Health Assistance +const uint8_t UBX_MGA_BDS_UTC = 0x03; //BDS UTC Assistance +const uint8_t UBX_MGA_BDS_IONO = 0x03; //BDS Ionospheric Assistance +const uint8_t UBX_MGA_DBD = 0x80; //Either: Poll the Navigation Database, or Navigation Database Dump Entry +const uint8_t UBX_MGA_GAL_EPH = 0x02; //Galileo Ephemeris Assistance +const uint8_t UBX_MGA_GAL_ALM = 0x02; //Galileo Almanac Assitance +const uint8_t UBX_MGA_GAL_TIMOFFSET = 0x02; //Galileo GPS time offset assistance +const uint8_t UBX_MGA_GAL_UTC = 0x02; //Galileo UTC Assistance +const uint8_t UBX_MGA_GLO_EPH = 0x06; //GLONASS Ephemeris Assistance +const uint8_t UBX_MGA_GLO_ALM = 0x06; //GLONASS Almanac Assistance +const uint8_t UBX_MGA_GLO_TIMEOFFSET = 0x06; //GLONASS Auxiliary Time Offset Assistance +const uint8_t UBX_MGA_GPS_EPH = 0x00; //GPS Ephemeris Assistance +const uint8_t UBX_MGA_GPS_ALM = 0x00; //GPS Almanac Assistance +const uint8_t UBX_MGA_GPS_HEALTH = 0x00; //GPS Health Assistance +const uint8_t UBX_MGA_GPS_UTC = 0x00; //GPS UTC Assistance +const uint8_t UBX_MGA_GPS_IONO = 0x00; //GPS Ionosphere Assistance +const uint8_t UBX_MGA_INI_POS_XYZ = 0x40; //Initial Position Assistance +const uint8_t UBX_MGA_INI_POS_LLH = 0x40; //Initial Position Assitance +const uint8_t UBX_MGA_INI_TIME_UTC = 0x40; //Initial Time Assistance +const uint8_t UBX_MGA_INI_TIME_GNSS = 0x40; //Initial Time Assistance +const uint8_t UBX_MGA_INI_CLKD = 0x40; //Initial Clock Drift Assitance +const uint8_t UBX_MGA_INI_FREQ = 0x40; //Initial Frequency Assistance +const uint8_t UBX_MGA_INI_EOP = 0x40; //Earth Orientation Parameters Assistance +const uint8_t UBX_MGA_QZSS_EPH = 0x05; //QZSS Ephemeris Assistance +const uint8_t UBX_MGA_QZSS_ALM = 0x05; //QZSS Almanac Assistance +const uint8_t UBX_MGA_QZAA_HEALTH = 0x05; //QZSS Health Assistance + +//The following are used to configure the MON UBX messages (monitoring messages). Descriptions from UBX messages overview (ZED_F9P Interface Description Document page 35) +const uint8_t UBX_MON_COMMS = 0x36; //Comm port information +const uint8_t UBX_MON_GNSS = 0x28; //Information message major GNSS selection +const uint8_t UBX_MON_HW2 = 0x0B; //Extended Hardware Status +const uint8_t UBX_MON_HW3 = 0x37; //HW I/O pin information +const uint8_t UBX_MON_HW = 0x09; //Hardware Status +const uint8_t UBX_MON_IO = 0x02; //I/O Subsystem Status +const uint8_t UBX_MON_MSGPP = 0x06; //Message Parse and Process Status +const uint8_t UBX_MON_PATCH = 0x27; //Output information about installed patches +const uint8_t UBX_MON_RF = 0x38; //RF information +const uint8_t UBX_MON_RXBUF = 0x07; //Receiver Buffer Status +const uint8_t UBX_MON_RXR = 0x21; //Receiver Status Information +const uint8_t UBX_MON_TXBUF = 0x08; //Transmitter Buffer Status. Used for query tx buffer size/state. +const uint8_t UBX_MON_VER = 0x04; //Receiver/Software Version. Used for obtaining Protocol Version. + +//The following are used to configure the NAV UBX messages (navigation results messages). Descriptions from UBX messages overview (ZED_F9P Interface Description Document page 35-36) +const uint8_t UBX_NAV_ATT = 0x05; //Vehicle "Attitude" Solution +const uint8_t UBX_NAV_CLOCK = 0x22; //Clock Solution +const uint8_t UBX_NAV_DOP = 0x04; //Dilution of precision +const uint8_t UBX_NAV_EOE = 0x61; //End of Epoch +const uint8_t UBX_NAV_GEOFENCE = 0x39; //Geofencing status. Used to poll the geofence status +const uint8_t UBX_NAV_HPPOSECEF = 0x13; //High Precision Position Solution in ECEF. Used to find our positional accuracy (high precision). +const uint8_t UBX_NAV_HPPOSLLH = 0x14; //High Precision Geodetic Position Solution. Used for obtaining lat/long/alt in high precision +const uint8_t UBX_NAV_ODO = 0x09; //Odometer Solution +const uint8_t UBX_NAV_ORB = 0x34; //GNSS Orbit Database Info +const uint8_t UBX_NAV_POSECEF = 0x01; //Position Solution in ECEF +const uint8_t UBX_NAV_POSLLH = 0x02; //Geodetic Position Solution +const uint8_t UBX_NAV_PVT = 0x07; //All the things! Position, velocity, time, PDOP, height, h/v accuracies, number of satellites. Navigation Position Velocity Time Solution. +const uint8_t UBX_NAV_RELPOSNED = 0x3C; //Relative Positioning Information in NED frame +const uint8_t UBX_NAV_RESETODO = 0x10; //Reset odometer +const uint8_t UBX_NAV_SAT = 0x35; //Satellite Information +const uint8_t UBX_NAV_SIG = 0x43; //Signal Information +const uint8_t UBX_NAV_STATUS = 0x03; //Receiver Navigation Status +const uint8_t UBX_NAV_SVIN = 0x3B; //Survey-in data. Used for checking Survey In status +const uint8_t UBX_NAV_TIMEBDS = 0x24; //BDS Time Solution +const uint8_t UBX_NAV_TIMEGAL = 0x25; //Galileo Time Solution +const uint8_t UBX_NAV_TIMEGLO = 0x23; //GLO Time Solution +const uint8_t UBX_NAV_TIMEGPS = 0x20; //GPS Time Solution +const uint8_t UBX_NAV_TIMELS = 0x26; //Leap second event information +const uint8_t UBX_NAV_TIMEUTC = 0x21; //UTC Time Solution +const uint8_t UBX_NAV_VELECEF = 0x11; //Velocity Solution in ECEF +const uint8_t UBX_NAV_VELNED = 0x12; //Velocity Solution in NED + +//The following are used to configure the RXM UBX messages (receiver manager messages). Descriptions from UBX messages overview (ZED_F9P Interface Description Document page 36) +const uint8_t UBX_RXM_MEASX = 0x14; //Satellite Measurements for RRLP +const uint8_t UBX_RXM_PMREQ = 0x41; //Requests a Power Management task (two differenent packet sizes) +const uint8_t UBX_RXM_RAWX = 0x15; //Multi-GNSS Raw Measurement Data +const uint8_t UBX_RXM_RLM = 0x59; //Galileo SAR Short-RLM report (two different packet sizes) +const uint8_t UBX_RXM_RTCM = 0x32; //RTCM input status +const uint8_t UBX_RXM_SFRBX = 0x13; //Boradcast Navigation Data Subframe + +//The following are used to configure the SEC UBX messages (security feature messages). Descriptions from UBX messages overview (ZED_F9P Interface Description Document page 36) +const uint8_t UBX_SEC_UNIQID = 0x03; //Unique chip ID + +//The following are used to configure the TIM UBX messages (timing messages). Descriptions from UBX messages overview (ZED_F9P Interface Description Document page 36) +const uint8_t UBX_TIM_TM2 = 0x03; //Time mark data +const uint8_t UBX_TIM_TP = 0x01; //Time Pulse Timedata +const uint8_t UBX_TIM_VRFY = 0x06; //Sourced Time Verification + +//The following are used to configure the UPD UBX messages (firmware update messages). Descriptions from UBX messages overview (ZED-F9P Interface Description Document page 36) +const uint8_t UBX_UPD_SOS = 0x14; //Poll Backup Fil Restore Status, Create Backup File in Flash, Clear Backup File in Flash, Backup File Creation Acknowledge, System Restored from Backup + +//The following are used to enable RTCM messages +const uint8_t UBX_RTCM_MSB = 0xF5; //All RTCM enable commands have 0xF5 as MSB +const uint8_t UBX_RTCM_1005 = 0x05; //Stationary RTK reference ARP +const uint8_t UBX_RTCM_1074 = 0x4A; //GPS MSM4 +const uint8_t UBX_RTCM_1077 = 0x4D; //GPS MSM7 +const uint8_t UBX_RTCM_1084 = 0x54; //GLONASS MSM4 +const uint8_t UBX_RTCM_1087 = 0x57; //GLONASS MSM7 +const uint8_t UBX_RTCM_1094 = 0x5E; //Galileo MSM4 +const uint8_t UBX_RTCM_1097 = 0x61; //Galileo MSM7 +const uint8_t UBX_RTCM_1124 = 0x7C; //BeiDou MSM4 +const uint8_t UBX_RTCM_1127 = 0x7F; //BeiDou MSM7 +const uint8_t UBX_RTCM_1230 = 0xE6; //GLONASS code-phase biases, set to once every 10 seconds +const uint8_t UBX_RTCM_4072_0 = 0xFE; //Reference station PVT (ublox proprietary RTCM message) +const uint8_t UBX_RTCM_4072_1 = 0xFD; //Additional reference station information (ublox proprietary RTCM message) + +const uint8_t UBX_ACK_NACK = 0x00; +const uint8_t UBX_ACK_ACK = 0x01; +const uint8_t UBX_ACK_NONE = 0x02; //Not a real value + +// The following constants are used to get External Sensor Measurements and Status +// Information. +const uint8_t UBX_ESF_MEAS = 0x02; +const uint8_t UBX_ESF_RAW = 0x03; +const uint8_t UBX_ESF_STATUS = 0x10; +const uint8_t UBX_ESF_INS = 0x15; //36 bytes + +const uint8_t SVIN_MODE_DISABLE = 0x00; +const uint8_t SVIN_MODE_ENABLE = 0x01; + +//The following consts are used to configure the various ports and streams for those ports. See -CFG-PRT. +const uint8_t COM_PORT_I2C = 0; +const uint8_t COM_PORT_UART1 = 1; +const uint8_t COM_PORT_UART2 = 2; +const uint8_t COM_PORT_USB = 3; +const uint8_t COM_PORT_SPI = 4; + +const uint8_t COM_TYPE_UBX = (1 << 0); +const uint8_t COM_TYPE_NMEA = (1 << 1); +const uint8_t COM_TYPE_RTCM3 = (1 << 5); + +// Configuration Sub-Section mask definitions for saveConfigSelective (UBX-CFG-CFG) +const uint32_t VAL_CFG_SUBSEC_IOPORT = 0x00000001; // ioPort - communications port settings (causes IO system reset!) +const uint32_t VAL_CFG_SUBSEC_MSGCONF = 0x00000002; // msgConf - message configuration +const uint32_t VAL_CFG_SUBSEC_INFMSG = 0x00000004; // infMsg - INF message configuration +const uint32_t VAL_CFG_SUBSEC_NAVCONF = 0x00000008; // navConf - navigation configuration +const uint32_t VAL_CFG_SUBSEC_RXMCONF = 0x00000010; // rxmConf - receiver manager configuration +const uint32_t VAL_CFG_SUBSEC_SENCONF = 0x00000100; // senConf - sensor interface configuration (requires protocol 19+) +const uint32_t VAL_CFG_SUBSEC_RINVCONF = 0x00000200; // rinvConf - remove inventory configuration +const uint32_t VAL_CFG_SUBSEC_ANTCONF = 0x00000400; // antConf - antenna configuration +const uint32_t VAL_CFG_SUBSEC_LOGCONF = 0x00000800; // logConf - logging configuration +const uint32_t VAL_CFG_SUBSEC_FTSCONF = 0x00001000; // ftsConf - FTS configuration (FTS products only) + +// Bitfield wakeupSources for UBX_RXM_PMREQ +const uint32_t VAL_RXM_PMREQ_WAKEUPSOURCE_UARTRX = 0x00000008; // uartrx +const uint32_t VAL_RXM_PMREQ_WAKEUPSOURCE_EXTINT0 = 0x00000020; // extint0 +const uint32_t VAL_RXM_PMREQ_WAKEUPSOURCE_EXTINT1 = 0x00000040; // extint1 +const uint32_t VAL_RXM_PMREQ_WAKEUPSOURCE_SPICS = 0x00000080; // spics + +enum dynModel // Possible values for the dynamic platform model, which provide more accuract position output for the situation. Description extracted from ZED-F9P Integration Manual +{ + DYN_MODEL_PORTABLE = 0, //Applications with low acceleration, e.g. portable devices. Suitable for most situations. + // 1 is not defined + DYN_MODEL_STATIONARY = 2, //Used in timing applications (antenna must be stationary) or other stationary applications. Velocity restricted to 0 m/s. Zero dynamics assumed. + DYN_MODEL_PEDESTRIAN, //Applications with low acceleration and speed, e.g. how a pedestrian would move. Low acceleration assumed. + DYN_MODEL_AUTOMOTIVE, //Used for applications with equivalent dynamics to those of a passenger car. Low vertical acceleration assumed + DYN_MODEL_SEA, //Recommended for applications at sea, with zero vertical velocity. Zero vertical velocity assumed. Sea level assumed. + DYN_MODEL_AIRBORNE1g, //Airborne <1g acceleration. Used for applications with a higher dynamic range and greater vertical acceleration than a passenger car. No 2D position fixes supported. + DYN_MODEL_AIRBORNE2g, //Airborne <2g acceleration. Recommended for typical airborne environments. No 2D position fixes supported. + DYN_MODEL_AIRBORNE4g, //Airborne <4g acceleration. Only recommended for extremely dynamic environments. No 2D position fixes supported. + DYN_MODEL_WRIST, // Not supported in protocol versions less than 18. Only recommended for wrist worn applications. Receiver will filter out arm motion. + DYN_MODEL_BIKE, // Supported in protocol versions 19.2 +}; + +#ifndef MAX_PAYLOAD_SIZE + +#define MAX_PAYLOAD_SIZE 768 //We need ~220 bytes for getProtocolVersion on most ublox modules +//#define MAX_PAYLOAD_SIZE 768 //Worst case: UBX_CFG_VALSET packet with 64 keyIDs each with 64 bit values + +#endif + +//-=-=-=-=- UBX binary specific variables +typedef struct +{ + uint8_t cls; + uint8_t id; + uint16_t len; //Length of the payload. Does not include cls, id, or checksum bytes + uint16_t counter; //Keeps track of number of overall bytes received. Some responses are larger than 255 bytes. + uint16_t startingSpot; //The counter value needed to go past before we begin recording into payload array + uint8_t *payload; + uint8_t checksumA; //Given to us from module. Checked against the rolling calculated A/B checksums. + uint8_t checksumB; + sfe_ublox_packet_validity_e valid; //Goes from NOT_DEFINED to VALID or NOT_VALID when checksum is checked + sfe_ublox_packet_validity_e classAndIDmatch; // Goes from NOT_DEFINED to VALID or NOT_VALID when the Class and ID match the requestedClass and requestedID +} ubxPacket; + +// Struct to hold the results returned by getGeofenceState (returned by UBX-NAV-GEOFENCE) +typedef struct +{ + uint8_t status; // Geofencing status: 0 - Geofencing not available or not reliable; 1 - Geofencing active + uint8_t numFences; // Number of geofences + uint8_t combState; // Combined (logical OR) state of all geofences: 0 - Unknown; 1 - Inside; 2 - Outside + uint8_t states[4]; // Geofence states: 0 - Unknown; 1 - Inside; 2 - Outside +} geofenceState; + +// Struct to hold the current geofence parameters +typedef struct +{ + uint8_t numFences; // Number of active geofences + int32_t lats[4]; // Latitudes of geofences (in degrees * 10^-7) + int32_t longs[4]; // Longitudes of geofences (in degrees * 10^-7) + uint32_t rads[4]; // Radii of geofences (in m * 10^-2) +} geofenceParams; + +typedef struct +{ + uint16_t noisePerMS; + uint16_t agcCnt; + uint8_t aStatus; + uint8_t aPower; + uint8_t aFlags; +}ubxHwState; + +class SFE_UBLOX_GPS +{ +public: + uint32_t pvtSeqId=0; + SFE_UBLOX_GPS(void); + +// A default of 250ms for maxWait seems fine for I2C but is not enough for SerialUSB. +// If you know you are only going to be using I2C / Qwiic communication, you can +// safely reduce defaultMaxWait to 250. +#ifndef defaultMaxWait // Let's allow the user to define their own value if they want to +#define defaultMaxWait 1100 +#endif + + //By default use the default I2C address, and use Wire port + boolean begin(TwoWire &wirePort = Wire, uint8_t deviceAddress = 0x42); //Returns true if module is detected + //serialPort needs to be perviously initialized to correct baud rate + boolean begin(Stream &serialPort); //Returns true if module is detected + + //Control the size of the internal I2C transaction amount + void setI2CTransactionSize(uint8_t bufferSize); + uint8_t getI2CTransactionSize(void); + + //Set the max number of bytes set in a given I2C transaction + uint8_t i2cTransactionSize = 32; //Default to ATmega328 limit + + void resetSentence() { currentSentence = NONE; } + + //Returns true if device answers on _gpsI2Caddress address or via Serial + //maxWait is only used for Serial + boolean isConnected(uint16_t maxWait = 1100); + + //Changed in V1.8.1: provides backward compatibility for the examples that call checkUblox directly + //Will default to using packetCfg to look for explicit autoPVT packets so they get processed correctly by processUBX + boolean checkUblox(uint8_t requestedClass = UBX_CLASS_NAV, uint8_t requestedID = UBX_NAV_PVT); //Checks module with user selected commType + + boolean checkUbloxI2C(ubxPacket *incomingUBX, uint8_t requestedClass, uint8_t requestedID); //Method for I2C polling of data, passing any new bytes to process() + boolean checkUbloxSerial(ubxPacket *incomingUBX, uint8_t requestedClass, uint8_t requestedID); //Method for serial polling of data, passing any new bytes to process() + + void process(uint8_t incoming, ubxPacket *incomingUBX, uint8_t requestedClass, uint8_t requestedID); //Processes NMEA and UBX binary sentences one byte at a time + void processUBX(uint8_t incoming, ubxPacket *incomingUBX, uint8_t requestedClass, uint8_t requestedID); //Given a character, file it away into the uxb packet structure + void processRTCMframe(uint8_t incoming); //Monitor the incoming bytes for start and length bytes + void processRTCM(uint8_t incoming) __attribute__((weak)); //Given rtcm byte, do something with it. User can overwrite if desired to pipe bytes to radio, internet, etc. + + void processUBXpacket(ubxPacket *msg); //Once a packet has been received and validated, identify this packet's class/id and update internal flags + void processNMEA(char incoming) __attribute__((weak)); //Given a NMEA character, do something with it. User can overwrite if desired to use something like tinyGPS or MicroNMEA libraries + + void calcChecksum(ubxPacket *msg); //Sets the checksumA and checksumB of a given messages + sfe_ublox_status_e sendCommand(ubxPacket *outgoingUBX, uint16_t maxWait = defaultMaxWait); //Given a packet and payload, send everything including CRC bytes, return true if we got a response + sfe_ublox_status_e sendI2cCommand(ubxPacket *outgoingUBX, uint16_t maxWait = 250); + void sendSerialCommand(ubxPacket *outgoingUBX); + + void printPacket(ubxPacket *packet); //Useful for debugging + + void factoryReset(); //Send factory reset sequence (i.e. load "default" configuration and perform hardReset) + void hardReset(); //Perform a reset leading to a cold start (zero info start-up) + + boolean setI2CAddress(uint8_t deviceAddress, uint16_t maxTime = 250); //Changes the I2C address of the u-blox module + void setSerialRate(uint32_t baudrate, uint8_t uartPort = COM_PORT_UART1, uint16_t maxTime = defaultMaxWait); //Changes the serial baud rate of the u-blox module, uartPort should be COM_PORT_UART1/2 + void setNMEAOutputPort(Stream &nmeaOutputPort); //Sets the internal variable for the port to direct NMEA characters to + + boolean setNavigationFrequency(uint8_t navFreq, uint16_t maxWait = defaultMaxWait); //Set the number of nav solutions sent per second + uint8_t getNavigationFrequency(uint16_t maxWait = defaultMaxWait); //Get the number of nav solutions sent per second currently being output by module + boolean saveConfiguration(uint16_t maxWait = defaultMaxWait); //Save current configuration to flash and BBR (battery backed RAM) + boolean factoryDefault(uint16_t maxWait = defaultMaxWait); //Reset module to factory defaults + boolean saveConfigSelective(uint32_t configMask, uint16_t maxWait = defaultMaxWait); //Save the selected configuration sub-sections to flash and BBR (battery backed RAM) + + sfe_ublox_status_e waitForACKResponse(ubxPacket *outgoingUBX, uint8_t requestedClass, uint8_t requestedID, uint16_t maxTime = defaultMaxWait); //Poll the module until a config packet and an ACK is received + sfe_ublox_status_e waitForNoACKResponse(ubxPacket *outgoingUBX, uint8_t requestedClass, uint8_t requestedID, uint16_t maxTime = defaultMaxWait); //Poll the module until a config packet is received + +// getPVT will only return data once in each navigation cycle. By default, that is once per second. +// Therefore we should set getPVTmaxWait to slightly longer than that. +// If you change the navigation frequency to (e.g.) 4Hz using setNavigationFrequency(4) +// then you should use a shorter maxWait for getPVT. 300msec would be about right: getPVT(300) +// The same is true for getHPPOSLLH. +#define getPVTmaxWait 1100 // Default maxWait for getPVT and all functions which call it +#define getHPPOSLLHmaxWait 1100 // Default maxWait for getHPPOSLLH and all functions which call it +#define getDOPmaxWait 1100 // Default maxWait for getDOP and all functions which all it + + boolean assumeAutoPVT(boolean enabled, boolean implicitUpdate = true); //In case no config access to the GPS is possible and PVT is send cyclically already + boolean setAutoPVT(boolean enabled, uint16_t maxWait = defaultMaxWait); //Enable/disable automatic PVT reports at the navigation frequency + boolean setAutoPVT(boolean enabled, boolean implicitUpdate, uint16_t maxWait = defaultMaxWait); //Enable/disable automatic PVT reports at the navigation frequency, with implicitUpdate == false accessing stale data will not issue parsing of data in the rxbuffer of your interface, instead you have to call checkUblox when you want to perform an update + boolean getPVT(uint16_t maxWait = getPVTmaxWait); //Query module for latest group of datums and load global vars: lat, long, alt, speed, SIV, accuracies, etc. If autoPVT is disabled, performs an explicit poll and waits, if enabled does not block. Returns true if new PVT is available. + boolean assumeAutoHPPOSLLH(boolean enabled, boolean implicitUpdate = true); //In case no config access to the GPS is possible and HPPOSLLH is send cyclically already + boolean setAutoHPPOSLLH(boolean enabled, uint16_t maxWait = defaultMaxWait); //Enable/disable automatic HPPOSLLH reports at the navigation frequency + boolean setAutoHPPOSLLH(boolean enabled, boolean implicitUpdate, uint16_t maxWait = defaultMaxWait); //Enable/disable automatic HPPOSLLH reports at the navigation frequency, with implicitUpdate == false accessing stale data will not issue parsing of data in the rxbuffer of your interface, instead you have to call checkUblox when you want to perform an update + boolean getHPPOSLLH(uint16_t maxWait = getHPPOSLLHmaxWait); //Query module for latest group of datums and load global vars: lat, long, alt, speed, SIV, accuracies, etc. If autoPVT is disabled, performs an explicit poll and waits, if enabled does not block. Returns true if new HPPOSLLH is available. + boolean getPOSLLH(uint16_t maxWait = getPVTmaxWait); + boolean assumeAutoDOP(boolean enabled, boolean implicitUpdate = true); //In case no config access to the GPS is possible and DOP is send cyclically already + boolean setAutoDOP(boolean enabled, uint16_t maxWait = defaultMaxWait); //Enable/disable automatic DOP reports at the navigation frequency + boolean setAutoDOP(boolean enabled, boolean implicitUpdate, uint16_t maxWait = defaultMaxWait); //Enable/disable automatic DOP reports at the navigation frequency, with implicitUpdate == false accessing stale data will not issue parsing of data in the rxbuffer of your interface, instead you have to call checkUblox when you want to perform an update + boolean getDOP(uint16_t maxWait = getDOPmaxWait); //Query module for latest dilution of precision values and load global vars:. If autoDOP is disabled, performs an explicit poll and waits, if enabled does not block. Returns true if new DOP is available. + void flushPVT(); //Mark all the PVT data as read/stale. This is handy to get data alignment after CRC failure + void flushHPPOSLLH(); //Mark all the PVT data as read/stale. This is handy to get data alignment after CRC failure + void flushDOP(); //Mark all the DOP data as read/stale. This is handy to get data alignment after CRC failure + + bool getGnssFixOk(uint16_t maxWait = getPVTmaxWait); //Get whether we have a valid fix (i.e within DOP & accuracy masks) + bool getDiffSoln(uint16_t maxWait = getPVTmaxWait); //Get whether differential corrections were applied + bool getHeadVehValid(uint16_t maxWait = getPVTmaxWait); + int32_t getLatitude(uint16_t maxWait = getPVTmaxWait); //Returns the current latitude in degrees * 10^-7. Auto selects between HighPrecision and Regular depending on ability of module. + int32_t getLongitude(uint16_t maxWait = getPVTmaxWait); //Returns the current longitude in degrees * 10-7. Auto selects between HighPrecision and Regular depending on ability of module. + int32_t getAltitude(uint16_t maxWait = getPVTmaxWait); //Returns the current altitude in mm above ellipsoid + int32_t getAltitudeMSL(uint16_t maxWait = getPVTmaxWait); //Returns the current altitude in mm above mean sea level + int32_t getHorizontalAccEst(uint16_t maxWait = getPVTmaxWait); + int32_t getVerticalAccEst(uint16_t maxWait = getPVTmaxWait); + int32_t getNedNorthVel(uint16_t maxWait = getPVTmaxWait); + int32_t getNedEastVel(uint16_t maxWait = getPVTmaxWait); + int32_t getNedDownVel(uint16_t maxWait = getPVTmaxWait); + uint8_t getSIV(uint16_t maxWait = getPVTmaxWait); //Returns number of sats used in fix + uint8_t getFixType(uint16_t maxWait = getPVTmaxWait); //Returns the type of fix: 0=no, 3=3D, 4=GNSS+Deadreckoning + uint8_t getCarrierSolutionType(uint16_t maxWait = getPVTmaxWait); //Returns RTK solution: 0=no, 1=float solution, 2=fixed solution + int32_t getGroundSpeed(uint16_t maxWait = getPVTmaxWait); //Returns speed in mm/s + int32_t getHeading(uint16_t maxWait = getPVTmaxWait); //Returns heading in degrees * 10^-5 + uint16_t getPDOP(uint16_t maxWait = getPVTmaxWait); //Returns positional dillution of precision * 10^-2 (dimensionless) + uint16_t getYear(uint16_t maxWait = getPVTmaxWait); + uint8_t getMonth(uint16_t maxWait = getPVTmaxWait); + uint8_t getDay(uint16_t maxWait = getPVTmaxWait); + uint8_t getHour(uint16_t maxWait = getPVTmaxWait); + uint8_t getMinute(uint16_t maxWait = getPVTmaxWait); + uint8_t getSecond(uint16_t maxWait = getPVTmaxWait); + uint16_t getMillisecond(uint16_t maxWait = getPVTmaxWait); + int32_t getNanosecond(uint16_t maxWait = getPVTmaxWait); + uint32_t getTimeOfWeek(uint16_t maxWait = getPVTmaxWait); + bool getDateValid(uint16_t maxWait = getPVTmaxWait); + bool getTimeValid(uint16_t maxWait = getPVTmaxWait); + uint32_t getSpeedAccEst(uint16_t maxWait = getPVTmaxWait); + uint32_t getHeadingAccEst(uint16_t maxWait = getPVTmaxWait); + bool getInvalidLlh(uint16_t maxWait = getPVTmaxWait); + int32_t getHeadVeh(uint16_t maxWait = getPVTmaxWait); + int16_t getMagDec(uint16_t maxWait = getPVTmaxWait); + uint16_t getMagAcc(uint16_t maxWait = getPVTmaxWait); + + int32_t getHighResLatitude(uint16_t maxWait = getHPPOSLLHmaxWait); + int8_t getHighResLatitudeHp(uint16_t maxWait = getHPPOSLLHmaxWait); + int32_t getHighResLongitude(uint16_t maxWait = getHPPOSLLHmaxWait); + int8_t getHighResLongitudeHp(uint16_t maxWait = getHPPOSLLHmaxWait); + int32_t getElipsoid(uint16_t maxWait = getHPPOSLLHmaxWait); + int8_t getElipsoidHp(uint16_t maxWait = getHPPOSLLHmaxWait); + int32_t getMeanSeaLevel(uint16_t maxWait = getHPPOSLLHmaxWait); + int8_t getMeanSeaLevelHp(uint16_t maxWait = getHPPOSLLHmaxWait); + int32_t getGeoidSeparation(uint16_t maxWait = getHPPOSLLHmaxWait); + uint32_t getHorizontalAccuracy(uint16_t maxWait = getHPPOSLLHmaxWait); + uint32_t getVerticalAccuracy(uint16_t maxWait = getHPPOSLLHmaxWait); + + uint16_t getGeometricDOP(uint16_t maxWait = getDOPmaxWait); + uint16_t getPositionDOP(uint16_t maxWait = getDOPmaxWait); + uint16_t getTimeDOP(uint16_t maxWait = getDOPmaxWait); + uint16_t getVerticalDOP(uint16_t maxWait = getDOPmaxWait); + uint16_t getHorizontalDOP(uint16_t maxWait = getDOPmaxWait); + uint16_t getNorthingDOP(uint16_t maxWait = getDOPmaxWait); + uint16_t getEastingDOP(uint16_t maxWait = getDOPmaxWait); + + //Port configurations + boolean setPortOutput(uint8_t portID, uint8_t comSettings, uint16_t maxWait = defaultMaxWait); //Configure a given port to output UBX, NMEA, RTCM3 or a combination thereof + boolean setPortInput(uint8_t portID, uint8_t comSettings, uint16_t maxWait = defaultMaxWait); //Configure a given port to input UBX, NMEA, RTCM3 or a combination thereof + boolean getPortSettings(uint8_t portID, uint16_t maxWait = defaultMaxWait); //Returns the current protocol bits in the UBX-CFG-PRT command for a given port + + boolean setI2COutput(uint8_t comSettings, uint16_t maxWait = 250); //Configure I2C port to output UBX, NMEA, RTCM3 or a combination thereof + boolean setUART1Output(uint8_t comSettings, uint16_t maxWait = defaultMaxWait); //Configure UART1 port to output UBX, NMEA, RTCM3 or a combination thereof + boolean setUART2Output(uint8_t comSettings, uint16_t maxWait = defaultMaxWait); //Configure UART2 port to output UBX, NMEA, RTCM3 or a combination thereof + boolean setUSBOutput(uint8_t comSettings, uint16_t maxWait = 250); //Configure USB port to output UBX, NMEA, RTCM3 or a combination thereof + boolean setSPIOutput(uint8_t comSettings, uint16_t maxWait = 250); //Configure SPI port to output UBX, NMEA, RTCM3 or a combination thereof + + //Functions to turn on/off message types for a given port ID (see COM_PORT_I2C, etc above) + boolean configureMessage(uint8_t msgClass, uint8_t msgID, uint8_t portID, uint8_t sendRate, uint16_t maxWait = defaultMaxWait); + boolean enableMessage(uint8_t msgClass, uint8_t msgID, uint8_t portID, uint8_t sendRate = 1, uint16_t maxWait = defaultMaxWait); + boolean disableMessage(uint8_t msgClass, uint8_t msgID, uint8_t portID, uint16_t maxWait = defaultMaxWait); + boolean enableNMEAMessage(uint8_t msgID, uint8_t portID, uint8_t sendRate = 1, uint16_t maxWait = defaultMaxWait); + boolean disableNMEAMessage(uint8_t msgID, uint8_t portID, uint16_t maxWait = defaultMaxWait); + boolean enableRTCMmessage(uint8_t messageNumber, uint8_t portID, uint8_t sendRate, uint16_t maxWait = defaultMaxWait); //Given a message number turns on a message ID for output over given PortID + boolean disableRTCMmessage(uint8_t messageNumber, uint8_t portID, uint16_t maxWait = defaultMaxWait); //Turn off given RTCM message from a given port + + //General configuration (used only on protocol v27 and higher - ie, ZED-F9P) + //It is probably safe to assume that users of the ZED-F9P will be using I2C / Qwiic. + //If they are using Serial then the higher baud rate will also help. So let's leave maxWait set to 250ms. + uint32_t createKey(uint16_t group, uint16_t id, uint8_t size); //Form 32-bit key from group/id/size + + sfe_ublox_status_e getVal(uint32_t keyID, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Load payload with response + uint8_t getVal8(uint32_t keyID, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given key location + uint16_t getVal16(uint32_t keyID, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given key location + uint32_t getVal32(uint32_t keyID, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given key location + uint8_t getVal8(uint16_t group, uint16_t id, uint8_t size, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given group/id/size location + uint16_t getVal16(uint16_t group, uint16_t id, uint8_t size, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given group/id/size location + uint32_t getVal32(uint16_t group, uint16_t id, uint8_t size, uint8_t layer = VAL_LAYER_RAM, uint16_t maxWait = 250); //Returns the value at a given group/id/size location + uint8_t setVal(uint32_t keyID, uint16_t value, uint8_t layer = VAL_LAYER_ALL, uint16_t maxWait = 250); //Sets the 16-bit value at a given group/id/size location + uint8_t setVal8(uint32_t keyID, uint8_t value, uint8_t layer = VAL_LAYER_ALL, uint16_t maxWait = 250); //Sets the 8-bit value at a given group/id/size location + uint8_t setVal16(uint32_t keyID, uint16_t value, uint8_t layer = VAL_LAYER_ALL, uint16_t maxWait = 250); //Sets the 16-bit value at a given group/id/size location + uint8_t setVal32(uint32_t keyID, uint32_t value, uint8_t layer = VAL_LAYER_ALL, uint16_t maxWait = 250); //Sets the 32-bit value at a given group/id/size location + uint8_t newCfgValset8(uint32_t keyID, uint8_t value, uint8_t layer = VAL_LAYER_ALL); //Define a new UBX-CFG-VALSET with the given KeyID and 8-bit value + uint8_t newCfgValset16(uint32_t keyID, uint16_t value, uint8_t layer = VAL_LAYER_ALL); //Define a new UBX-CFG-VALSET with the given KeyID and 16-bit value + uint8_t newCfgValset32(uint32_t keyID, uint32_t value, uint8_t layer = VAL_LAYER_ALL); //Define a new UBX-CFG-VALSET with the given KeyID and 32-bit value + uint8_t addCfgValset8(uint32_t keyID, uint8_t value); //Add a new KeyID and 8-bit value to an existing UBX-CFG-VALSET ubxPacket + uint8_t addCfgValset16(uint32_t keyID, uint16_t value); //Add a new KeyID and 16-bit value to an existing UBX-CFG-VALSET ubxPacket + uint8_t addCfgValset32(uint32_t keyID, uint32_t value); //Add a new KeyID and 32-bit value to an existing UBX-CFG-VALSET ubxPacket + uint8_t sendCfgValset8(uint32_t keyID, uint8_t value, uint16_t maxWait = 250); //Add the final KeyID and 8-bit value to an existing UBX-CFG-VALSET ubxPacket and send it + uint8_t sendCfgValset16(uint32_t keyID, uint16_t value, uint16_t maxWait = 250); //Add the final KeyID and 16-bit value to an existing UBX-CFG-VALSET ubxPacket and send it + uint8_t sendCfgValset32(uint32_t keyID, uint32_t value, uint16_t maxWait = 250); //Add the final KeyID and 32-bit value to an existing UBX-CFG-VALSET ubxPacket and send it + + //Functions used for RTK and base station setup + //It is probably safe to assume that users of the RTK will be using I2C / Qwiic. So let's leave maxWait set to 250ms. + boolean getSurveyMode(uint16_t maxWait = 250); //Get the current TimeMode3 settings + boolean setSurveyMode(uint8_t mode, uint16_t observationTime, float requiredAccuracy, uint16_t maxWait = 250); //Control survey in mode + boolean enableSurveyMode(uint16_t observationTime, float requiredAccuracy, uint16_t maxWait = 250); //Begin Survey-In for NEO-M8P + boolean disableSurveyMode(uint16_t maxWait = 250); //Stop Survey-In mode + + boolean getSurveyStatus(uint16_t maxWait); //Reads survey in status and sets the global variables + + uint32_t getPositionAccuracy(uint16_t maxWait = 1100); //Returns the 3D accuracy of the current high-precision fix, in mm. Supported on NEO-M8P, ZED-F9P, + + uint8_t getProtocolVersionHigh(uint16_t maxWait = 500); //Returns the PROTVER XX.00 from UBX-MON-VER register + uint8_t getProtocolVersionLow(uint16_t maxWait = 500); //Returns the PROTVER 00.XX from UBX-MON-VER register + boolean getProtocolVersion(uint16_t maxWait = 500); //Queries module, loads low/high bytes + + void queryHwState(uint16_t maxWait = 500); + boolean getHwState(ubxHwState &state); + + boolean getRELPOSNED(uint16_t maxWait = 1100); //Get Relative Positioning Information of the NED frame + + // Enable debug messages using the chosen Serial port (Stream) + // Boards like the RedBoard Turbo use SerialUSB (not Serial). + // But other boards like the SAMD51 Thing Plus use Serial (not SerialUSB). + // These lines let the code compile cleanly on as many SAMD boards as possible. + #if defined(ARDUINO_ARCH_SAMD) // Is this a SAMD board? + #if defined(USB_VID) // Is the USB Vendor ID defined? + #if (USB_VID == 0x1B4F) // Is this a SparkFun board? + #if !defined(ARDUINO_SAMD51_THING_PLUS) & !defined(ARDUINO_SAMD51_MICROMOD) // If it is not a SAMD51 Thing Plus or SAMD51 MicroMod + void enableDebugging(Stream &debugPort = SerialUSB, boolean printLimitedDebug = false); //Given a port to print to, enable debug messages. Default to all, not limited. + #else + void enableDebugging(Stream &debugPort = Serial, boolean printLimitedDebug = false); //Given a port to print to, enable debug messages. Default to all, not limited. + #endif + #else + void enableDebugging(Stream &debugPort = Serial, boolean printLimitedDebug = false); //Given a port to print to, enable debug messages. Default to all, not limited. + #endif + #else + void enableDebugging(Stream &debugPort = Serial, boolean printLimitedDebug = false); //Given a port to print to, enable debug messages. Default to all, not limited. + #endif + #else + void enableDebugging(Stream &debugPort = Serial, boolean printLimitedDebug = false); //Given a port to print to, enable debug messages. Default to all, not limited. + #endif + + void disableDebugging(void); //Turn off debug statements + void debugPrint(char *message); //Safely print debug statements + void debugPrintln(char *message); //Safely print debug statements + const char *statusString(sfe_ublox_status_e stat); //Pretty print the return value + + //Support for geofences + boolean addGeofence(int32_t latitude, int32_t longitude, uint32_t radius, byte confidence = 0, byte pinPolarity = 0, byte pin = 0, uint16_t maxWait = 1100); // Add a new geofence + boolean clearGeofences(uint16_t maxWait = 1100); //Clears all geofences + boolean getGeofenceState(geofenceState ¤tGeofenceState, uint16_t maxWait = 1100); //Returns the combined geofence state + boolean clearAntPIO(uint16_t maxWait = 1100); //Clears the antenna control pin settings to release the PIOs + geofenceParams currentGeofenceParams; // Global to store the geofence parameters + + boolean powerSaveMode(bool power_save = true, uint16_t maxWait = 1100); + uint8_t getPowerSaveMode(uint16_t maxWait = 1100); // Returns 255 if the sendCommand fails + boolean powerOff(uint32_t durationInMs, uint16_t maxWait = 1100); + boolean powerOffWithInterrupt(uint32_t durationInMs, uint32_t wakeupSources = VAL_RXM_PMREQ_WAKEUPSOURCE_EXTINT0, boolean forceWhileUsb = true, uint16_t maxWait = 1100); + + //Change the dynamic platform model using UBX-CFG-NAV5 + boolean setDynamicModel(dynModel newDynamicModel = DYN_MODEL_PORTABLE, uint16_t maxWait = 1100); + uint8_t getDynamicModel(uint16_t maxWait = 1100); // Get the dynamic model - returns 255 if the sendCommand fails + + boolean getEsfInfo(uint16_t maxWait = 1100); + boolean getEsfIns(uint16_t maxWait = 1100); + boolean getEsfDataInfo(uint16_t maxWait = 1100); + boolean getEsfRawDataInfo(uint16_t maxWait = 1100); + sfe_ublox_status_e getSensState(uint8_t sensor, uint16_t maxWait = 1100); + boolean getVehAtt(uint16_t maxWait = 1100); + boolean pollNavigationDatabase(uint8_t *data, int16_t &size, uint16_t maxWait = 1100); + boolean sendNavigationDatabase(uint8_t *data, int16_t size); + + // Given coordinates, put receiver into static position. Set latlong to true to pass in lat/long values instead of ecef. + // For ECEF the units are: cm, 0.1mm, cm, 0.1mm, cm, 0.1mm + // For Lat/Lon/Alt the units are: degrees^-7, degrees^-9, degrees^-7, degrees^-9, cm, 0.1mm + bool setStaticPosition(int32_t ecefXOrLat, int8_t ecefXOrLatHP, int32_t ecefYOrLon, int8_t ecefYOrLonHP, int32_t ecefZOrAlt, int8_t ecefZOrAltHP, bool latLong = false, uint16_t maxWait = 250); + bool setStaticPosition(int32_t ecefXOrLat, int32_t ecefYOrLon, int32_t ecefZOrAlt, bool latLong = false, uint16_t maxWait = 250); + + // Push (e.g.) RTCM data directly to the module + // Warning: this function does not check that the data is valid. It is the user's responsibility to ensure the data is valid before pushing. + boolean pushRawData(uint8_t *dataBytes, size_t numDataBytes); + + //Survey-in specific controls + struct svinStructure + { + boolean active; + boolean valid; + uint16_t observationTime; + float meanAccuracy; + } svin; + + //Relative Positioning Info in NED frame specific controls + struct frelPosInfoStructure + { + uint16_t refStationID; + + float relPosN; + float relPosE; + float relPosD; + + long relPosLength; + long relPosHeading; + + int8_t relPosHPN; + int8_t relPosHPE; + int8_t relPosHPD; + int8_t relPosHPLength; + + float accN; + float accE; + float accD; + + bool gnssFixOk; + bool diffSoln; + bool relPosValid; + uint8_t carrSoln; + bool isMoving; + bool refPosMiss; + bool refObsMiss; + } relPosInfo; + + //The major datums we want to globally store + uint16_t gpsYear; + uint8_t gpsMonth; + uint8_t gpsDay; + uint8_t gpsHour; + uint8_t gpsMinute; + uint8_t gpsSecond; + uint16_t gpsMillisecond; + int32_t gpsNanosecond; + bool gpsDateValid; + bool gpsTimeValid; + + bool gnssFixOk; //valid fix (i.e within DOP & accuracy masks) + bool diffSoln; //Differential corrections were applied + bool headVehValid; + int32_t latitude; //Degrees * 10^-7 (more accurate than floats) + int32_t longitude; //Degrees * 10^-7 (more accurate than floats) + int32_t altitude; //Number of mm above ellipsoid + int32_t altitudeMSL; //Number of mm above Mean Sea Level + uint32_t horizontalAccEst; + uint32_t verticalAccEst; + int32_t nedNorthVel; + int32_t nedEastVel; + int32_t nedDownVel; + uint8_t SIV; //Number of satellites used in position solution + uint8_t fixType; //Tells us when we have a solution aka lock + uint8_t carrierSolution; //Tells us when we have an RTK float/fixed solution + int32_t groundSpeed; //mm/s + int32_t headingOfMotion; //degrees * 10^-5 + uint32_t speedAccEst; + uint32_t headingAccEst; + uint16_t pDOP; //Positional dilution of precision * 10^-2 (dimensionless) + bool invalidLlh; + int32_t headVeh; + int16_t magDec; + uint16_t magAcc; + uint8_t versionLow; //Loaded from getProtocolVersion(). + uint8_t versionHigh; + + uint32_t timeOfWeek; // ms + int32_t highResLatitude; // Degrees * 10^-7 + int32_t highResLongitude; // Degrees * 10^-7 + int32_t elipsoid; // Height above ellipsoid in mm (Typo! Should be eLLipsoid! **Uncorrected for backward-compatibility.**) + int32_t meanSeaLevel; // Height above mean sea level in mm + int32_t geoidSeparation; // This seems to only be provided in NMEA GGA and GNS messages + uint32_t horizontalAccuracy; // mm * 10^-1 (i.e. 0.1mm) + uint32_t verticalAccuracy; // mm * 10^-1 (i.e. 0.1mm) + int8_t elipsoidHp; // High precision component of the height above ellipsoid in mm * 10^-1 (Deliberate typo! Should be eLLipsoidHp!) + int8_t meanSeaLevelHp; // High precision component of Height above mean sea level in mm * 10^-1 + int8_t highResLatitudeHp; // High precision component of latitude: Degrees * 10^-9 + int8_t highResLongitudeHp; // High precision component of longitude: Degrees * 10^-9 + + uint16_t rtcmFrameCounter = 0; //Tracks the type of incoming byte inside RTCM frame + + uint16_t geometricDOP; // Geometric dilution of precision * 10^-2 + uint16_t positionDOP; // Posoition dilution of precision * 10^-2 + uint16_t timeDOP; // Time dilution of precision * 10^-2 + uint16_t verticalDOP; // Vertical dilution of precision * 10^-2 + uint16_t horizontalDOP; // Horizontal dilution of precision * 10^-2 + uint16_t northingDOP; // Northing dilution of precision * 10^-2 + uint16_t eastingDOP; // Easting dilution of precision * 10^-2 + + ubxHwState hwState; + +#define DEF_NUM_SENS 7 + struct deadReckData + { + uint8_t version; + uint8_t fusionMode; + + uint8_t xAngRateVald; + uint8_t yAngRateVald; + uint8_t zAngRateVald; + uint8_t xAccelVald; + uint8_t yAccelVald; + uint8_t zAccelVald; + + int32_t xAngRate; + int32_t yAngRate; + int32_t zAngRate; + + int32_t xAccel; + int32_t yAccel; + int32_t zAccel; + + // The array size is based on testing directly on M8U and F9R + uint32_t rawData; + uint32_t rawDataType; + uint32_t rawTStamp; + + uint32_t data[DEF_NUM_SENS]; + uint32_t dataType[DEF_NUM_SENS]; + uint32_t dataTStamp[DEF_NUM_SENS]; + } imuMeas; + + struct indivImuData + { + + uint8_t numSens; + + uint8_t senType; + boolean isUsed; + boolean isReady; + uint8_t calibStatus; + uint8_t timeStatus; + + uint8_t freq; // Hz + + boolean badMeas; + boolean badTag; + boolean missMeas; + boolean noisyMeas; + } ubloxSen; + + struct vehicleAttitude + { + // All values in degrees + int32_t roll; + int32_t pitch; + int32_t heading; + uint32_t accRoll; + uint32_t accPitch; + uint32_t accHeading; + } vehAtt; + + //HNR-specific structs + struct hnrAttitudeSolution + { + uint32_t iTOW; + int32_t roll; // Degrees * 1e-5 + int32_t pitch; // Degrees * 1e-5 + int32_t heading; // Degrees * 1e-5 + uint32_t accRoll; // Degrees * 1e-5 + uint32_t accPitch; // Degrees * 1e-5 + uint32_t accHeading; // Degrees * 1e-5 + } hnrAtt; + + struct hnrVehicleDynamics + { + boolean xAngRateValid; + boolean yAngRateValid; + boolean zAngRateValid; + boolean xAccelValid; + boolean yAccelValid; + boolean zAccelValid; + uint32_t iTOW; + int32_t xAngRate; // Degrees/s * 1e-3 + int32_t yAngRate; // Degrees/s * 1e-3 + int32_t zAngRate; // Degrees/s * 1e-3 + int32_t xAccel; // m/s^2 * 1e-2 + int32_t yAccel; // m/s^2 * 1e-2 + int32_t zAccel; // m/s^2 * 1e-2 + } hnrVehDyn; + + struct hnrPosVelTime + { + uint32_t iTOW; + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t hour; + uint8_t min; + uint8_t sec; + boolean validDate; + boolean validTime; + boolean fullyResolved; + int32_t nano; + uint8_t gpsFix; + boolean gpsFixOK; + boolean diffSoln; + boolean WKNSET; + boolean TOWSET; + boolean headVehValid; + int32_t lon; // Degrees * 1e-7 + int32_t lat; // Degrees * 1e-7 + int32_t height; // mm above ellipsoid + int32_t hMSL; // mm above MSL + int32_t gSpeed; // mm/s 2D + int32_t speed; // mm/s 3D + int32_t headMot; // Degrees * 1e-5 + int32_t headVeh; // Degrees * 1e-5 + uint32_t hAcc; // mm + uint32_t vAcc; // mm + uint32_t sAcc; // mm + uint32_t headAcc; // Degrees * 1e-5 + } hnrPVT; + + //HNR functions + boolean setHNRNavigationRate(uint8_t rate, uint16_t maxWait = 1100); // Returns true if the setHNRNavigationRate is successful + uint8_t getHNRNavigationRate(uint16_t maxWait = 1100); // Returns 0 if the getHNRNavigationRate fails + boolean assumeAutoHNRAtt(boolean enabled, boolean implicitUpdate = true); //In case no config access to the GPS is possible and HNR Attitude is send cyclically already + boolean setAutoHNRAtt(boolean enabled, uint16_t maxWait = defaultMaxWait); //Enable/disable automatic HNR Attitude reports at the HNR rate + boolean setAutoHNRAtt(boolean enabled, boolean implicitUpdate, uint16_t maxWait = defaultMaxWait); //Enable/disable automatic HNR Attitude reports at the HNR rate, with implicitUpdate == false accessing stale data will not issue parsing of data in the rxbuffer of your interface, instead you have to call checkUblox when you want to perform an update + boolean getHNRAtt(uint16_t maxWait = 1100); // Returns true if the get HNR attitude is successful. Data is returned in hnrAtt + boolean assumeAutoHNRDyn(boolean enabled, boolean implicitUpdate = true); //In case no config access to the GPS is possible and HNR dynamics is send cyclically already + boolean setAutoHNRDyn(boolean enabled, uint16_t maxWait = defaultMaxWait); //Enable/disable automatic HNR dynamics reports at the HNR rate + boolean setAutoHNRDyn(boolean enabled, boolean implicitUpdate, uint16_t maxWait = defaultMaxWait); //Enable/disable automatic HNR dynamics reports at the HNR rate, with implicitUpdate == false accessing stale data will not issue parsing of data in the rxbuffer of your interface, instead you have to call checkUblox when you want to perform an update + boolean getHNRDyn(uint16_t maxWait = 1100); // Returns true if the get HNR dynamics is successful. Data is returned in hnrVehDyn + boolean assumeAutoHNRPVT(boolean enabled, boolean implicitUpdate = true); //In case no config access to the GPS is possible and HNR PVT is send cyclically already + boolean setAutoHNRPVT(boolean enabled, uint16_t maxWait = defaultMaxWait); //Enable/disable automatic HNR PVT reports at the HNR rate + boolean setAutoHNRPVT(boolean enabled, boolean implicitUpdate, uint16_t maxWait = defaultMaxWait); //Enable/disable automatic HNR PVT reports at the HNR rate, with implicitUpdate == false accessing stale data will not issue parsing of data in the rxbuffer of your interface, instead you have to call checkUblox when you want to perform an update + boolean getHNRPVT(uint16_t maxWait = 1100); // Returns true if the get HNR PVT is successful. Data is returned in hnrPVT + +public: + //Depending on the sentence type the processor will load characters into different arrays + enum SentenceTypes + { + NONE = 0, + NMEA, + UBX, + RTCM + } currentSentence = NONE; + + //Depending on the ubx binary response class, store binary responses into different places + enum classTypes + { + CLASS_NONE = 0, + CLASS_ACK, + CLASS_NOT_AN_ACK + } ubxFrameClass = CLASS_NONE; + + enum commTypes + { + COMM_TYPE_I2C = 0, + COMM_TYPE_SERIAL, + COMM_TYPE_SPI + } commType = COMM_TYPE_I2C; //Controls which port we look to for incoming bytes + + //Functions + boolean checkUbloxInternal(ubxPacket *incomingUBX, uint8_t requestedClass = 255, uint8_t requestedID = 255); //Checks module with user selected commType + uint32_t extractLong(uint8_t spotToStart); //Combine four bytes from payload into long + int32_t extractSignedLong(uint8_t spotToStart); //Combine four bytes from payload into signed long (avoiding any ambiguity caused by casting) + uint16_t extractInt(uint8_t spotToStart); //Combine two bytes from payload into int + int16_t extractSignedInt(int8_t spotToStart); + uint8_t extractByte(uint8_t spotToStart); //Get byte from payload + int8_t extractSignedChar(uint8_t spotToStart); //Get signed 8-bit value from payload + void addToChecksum(uint8_t incoming); //Given an incoming byte, adjust rollingChecksumA/B + + //Variables + TwoWire *_i2cPort; //The generic connection to user's chosen I2C hardware + Stream *_serialPort; //The generic connection to user's chosen Serial hardware + Stream *_nmeaOutputPort = NULL; //The user can assign an output port to print NMEA sentences if they wish + Stream *_debugSerial = NULL; //The stream to send debug messages to if enabled + + uint8_t _gpsI2Caddress = 0x42; //Default 7-bit unshifted address of the ublox 6/7/8/M8/F9 series + //This can be changed using the ublox configuration software + + boolean _printDebug = false; //Flag to print the serial commands we are sending to the Serial port for debug + boolean _printLimitedDebug = false; //Flag to print limited debug messages. Useful for I2C debugging or high navigation rates + + //The packet buffers + //These are pointed at from within the ubxPacket + uint8_t payloadAck[2]; // Holds the requested ACK/NACK + uint8_t payloadCfg[MAX_PAYLOAD_SIZE]; // Holds the requested data packet + uint8_t payloadBuf[2]; // Temporary buffer used to screen incoming packets or dump unrequested packets + + //Init the packet structures and init them with pointers to the payloadAck, payloadCfg and payloadBuf arrays + ubxPacket packetAck = {0, 0, 0, 0, 0, payloadAck, 0, 0, SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED, SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED}; + ubxPacket packetCfg = {0, 0, 0, 0, 0, payloadCfg, 0, 0, SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED, SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED}; + ubxPacket packetBuf = {0, 0, 0, 0, 0, payloadBuf, 0, 0, SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED, SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED}; + + //Flag if this packet is unrequested (and so should be ignored and not copied into packetCfg or packetAck) + boolean ignoreThisPayload = false; + + //Identify which buffer is in use + //Data is stored in packetBuf until the requested class and ID can be validated + //If a match is seen, data is diverted into packetAck or packetCfg + sfe_ublox_packet_buffer_e activePacketBuffer = SFE_UBLOX_PACKET_PACKETBUF; + + //Limit checking of new data to every X ms + //If we are expecting an update every X Hz then we should check every half that amount of time + //Otherwise we may block ourselves from seeing new data + uint8_t i2cPollingWait = 100; //Default to 100ms. Adjusted when user calls setNavigationFrequency() + + unsigned long lastCheck = 0; + boolean autoPVT = false; //Whether autoPVT is enabled or not + boolean autoPVTImplicitUpdate = true; // Whether autoPVT is triggered by accessing stale data (=true) or by a call to checkUblox (=false) + boolean autoHPPOSLLH = false; //Whether autoHPPOSLLH is enabled or not + boolean autoHPPOSLLHImplicitUpdate = true; // Whether autoHPPOSLLH is triggered by accessing stale data (=true) or by a call to checkUblox (=false) + boolean autoDOP = false; //Whether autoDOP is enabled or not + boolean autoDOPImplicitUpdate = true; // Whether autoDOP is triggered by accessing stale data (=true) or by a call to checkUblox (=false) + boolean autoHNRAtt = false; //Whether auto HNR attitude is enabled or not + boolean autoHNRAttImplicitUpdate = true; // Whether auto HNR attitude is triggered by accessing stale data (=true) or by a call to checkUblox (=false) + boolean autoHNRDyn = false; //Whether auto HNR dynamics is enabled or not + boolean autoHNRDynImplicitUpdate = true; // Whether auto HNR dynamics is triggered by accessing stale data (=true) or by a call to checkUblox (=false) + boolean autoHNRPVT = false; //Whether auto HNR PVT is enabled or not + boolean autoHNRPVTImplicitUpdate = true; // Whether auto HNR PVT is triggered by accessing stale data (=true) or by a call to checkUblox (=false) + + uint16_t ubxFrameCounter; //It counts all UBX frame. [Fixed header(2bytes), CLS(1byte), ID(1byte), length(2bytes), payload(x bytes), checksums(2bytes)] + + uint8_t rollingChecksumA; //Rolls forward as we receive incoming bytes. Checked against the last two A/B checksum bytes + uint8_t rollingChecksumB; //Rolls forward as we receive incoming bytes. Checked against the last two A/B checksum bytes + + //Create bit field for staleness of each datum in PVT we want to monitor + //moduleQueried.latitude goes true each time we call getPVT() + //This reduces the number of times we have to call getPVT as this can take up to ~1s per read + //depending on update rate + struct + { + uint32_t gpsiTOW : 1; + uint32_t gpsYear : 1; + uint32_t gpsMonth : 1; + uint32_t gpsDay : 1; + uint32_t gpsHour : 1; + uint32_t gpsMinute : 1; + uint32_t gpsSecond : 1; + uint32_t gpsDateValid : 1; + uint32_t gpsTimeValid : 1; + uint32_t gpsNanosecond : 1; + + uint32_t all : 1; + uint32_t gnssFixOk : 1; + uint32_t diffSoln : 1; + uint32_t headVehValid : 1; + uint32_t longitude : 1; + uint32_t latitude : 1; + uint32_t altitude : 1; + uint32_t altitudeMSL : 1; + uint32_t horizontalAccEst : 1; + uint32_t verticalAccEst : 1; + uint32_t nedNorthVel : 1; + uint32_t nedEastVel : 1; + uint32_t nedDownVel : 1; + uint32_t SIV : 1; + uint32_t fixType : 1; + uint32_t carrierSolution : 1; + uint32_t groundSpeed : 1; + uint32_t headingOfMotion : 1; + uint32_t speedAccEst : 1; + uint32_t headingAccEst : 1; + uint32_t pDOP : 1; + uint32_t invalidLlh : 1; + uint32_t headVeh : 1; + uint32_t magDec : 1; + uint32_t magAcc : 1; + uint32_t versionNumber : 1; + uint32_t hwState : 1; + } moduleQueried; + + struct + { + uint16_t all : 1; + uint16_t timeOfWeek : 1; + uint16_t highResLatitude : 1; + uint16_t highResLongitude : 1; + uint16_t elipsoid : 1; + uint16_t meanSeaLevel : 1; + uint16_t geoidSeparation : 1; // Redundant but kept for backward-compatibility + uint16_t horizontalAccuracy : 1; + uint16_t verticalAccuracy : 1; + uint16_t elipsoidHp : 1; + uint16_t meanSeaLevelHp : 1; + uint16_t highResLatitudeHp : 1; + uint16_t highResLongitudeHp : 1; + } highResModuleQueried; + + struct + { + uint16_t all : 1; + uint16_t geometricDOP : 1; + uint16_t positionDOP : 1; + uint16_t timeDOP : 1; + uint16_t verticalDOP : 1; + uint16_t horizontalDOP : 1; + uint16_t northingDOP : 1; + uint16_t eastingDOP : 1; + } dopModuleQueried; + + boolean hnrAttQueried; + boolean hnrDynQueried; + boolean hnrPVTQueried; + + uint16_t rtcmLen = 0; +}; + +#endif diff --git a/lib/SparkFun u-blox Arduino Library/u-blox_config_keys.h b/lib/SparkFun u-blox Arduino Library/u-blox_config_keys.h new file mode 100644 index 0000000..9e5b463 --- /dev/null +++ b/lib/SparkFun u-blox Arduino Library/u-blox_config_keys.h @@ -0,0 +1,838 @@ +/* + This is a library written for the u-blox ZED-F9P and NEO-M8P-2 + SparkFun sells these at its website: www.sparkfun.com + Do you like this library? Help support SparkFun. Buy a board! + https://www.sparkfun.com/products/16481 + https://www.sparkfun.com/products/15136 + https://www.sparkfun.com/products/15005 + https://www.sparkfun.com/products/15733 + https://www.sparkfun.com/products/15193 + https://www.sparkfun.com/products/15210 + + Written by Nathan Seidle @ SparkFun Electronics, September 6th, 2018 + + This library handles configuring and handling the responses + from a u-blox GPS module. Works with most modules from u-blox including + the Zed-F9P, NEO-M8P-2, NEO-M9N, ZOE-M8Q, SAM-M8Q, and many others. + + https://github.com/sparkfun/SparkFun_Ublox_Arduino_Library + + Development environment specifics: + Arduino IDE 1.8.5 + + SparkFun code, firmware, and software is released under the MIT License(http://opensource.org/licenses/MIT). + The MIT License (MIT) + Copyright (c) 2016 SparkFun Electronics + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the Software is furnished to + do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial + portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef __u_blox_config_keys_h__ +#define __u_blox_config_keys_h__ + +//The following consts are used to generate KEY values for the advanced protocol functions of VELGET/SET/DEL +const uint8_t VAL_SIZE_1 = 0x01; //One bit +const uint8_t VAL_SIZE_8 = 0x02; //One byte +const uint8_t VAL_SIZE_16 = 0x03; //Two bytes +const uint8_t VAL_SIZE_32 = 0x04; //Four bytes +const uint8_t VAL_SIZE_64 = 0x05; //Eight bytes + +//These are the Bitfield layers definitions for the UBX-CFG-VALSET message (not to be confused with Bitfield deviceMask in UBX-CFG-CFG) +const uint8_t VAL_LAYER_RAM = (1 << 0); +const uint8_t VAL_LAYER_BBR = (1 << 1); +const uint8_t VAL_LAYER_FLASH = (1 << 2); +const uint8_t VAL_LAYER_ALL = VAL_LAYER_RAM | VAL_LAYER_BBR | VAL_LAYER_FLASH; //Not valid with getVal() + +//Below are various Groups, IDs, and sizes for various settings +//These can be used to call getVal/setVal/delVal +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint8_t VAL_ID_PROT_UBX = 0x01; +const uint8_t VAL_ID_PROT_NMEA = 0x02; +const uint8_t VAL_ID_PROT_RTCM3 = 0x04; + +const uint8_t VAL_GROUP_I2C = 0x51; +const uint8_t VAL_GROUP_I2COUTPROT = 0x72; +const uint8_t VAL_GROUP_UART1INPROT = 0x73; +const uint8_t VAL_GROUP_UART1OUTPROT = 0x74; +const uint8_t VAL_GROUP_UART2INPROT = 0x75; +const uint8_t VAL_GROUP_UART2OUTPROT = 0x76; +const uint8_t VAL_GROUP_USBINPROT = 0x77; +const uint8_t VAL_GROUP_USBOUTPROT = 0x78; + +const uint8_t VAL_GROUP_UART_SIZE = VAL_SIZE_1; //All fields in UART group are currently 1 bit +const uint8_t VAL_GROUP_I2C_SIZE = VAL_SIZE_8; //All fields in I2C group are currently 1 byte + +const uint8_t VAL_ID_I2C_ADDRESS = 0x01; + +//Below are the key values for a given configuration setting + +//CFG-BDS: BeiDou system configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_BDS_USE_PRN_1_TO_5 = 0x10340014; // Use BeiDou geostationary satellites (PRN 1-5) + +//CFG-GEOFENCE: Geofencing configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_GEOFENCE_CONFLVL = 0x20240011; // Required confidence level for state evaluation +const uint32_t UBLOX_CFG_GEOFENCE_USE_PIO = 0x10240012; // Use PIO combined fence state output +const uint32_t UBLOX_CFG_GEOFENCE_PINPOL = 0x20240013; // PIO pin polarity +const uint32_t UBLOX_CFG_GEOFENCE_PIN = 0x20240014; // PIO pin number +const uint32_t UBLOX_CFG_GEOFENCE_USE_FENCE1 = 0x10240020; // Use frst geofence +const uint32_t UBLOX_CFG_GEOFENCE_FENCE1_LAT = 0x40240021; // Latitude of the first geofence circle center +const uint32_t UBLOX_CFG_GEOFENCE_FENCE1_LON = 0x40240022; // Longitude of the first geofence circle center +const uint32_t UBLOX_CFG_GEOFENCE_FENCE1_RAD = 0x40240023; // Radius of the first geofence circle +const uint32_t UBLOX_CFG_GEOFENCE_USE_FENCE2 = 0x10240030; // Use second geofence +const uint32_t UBLOX_CFG_GEOFENCE_FENCE2_LAT = 0x40240031; // Latitude of the second geofence circle center +const uint32_t UBLOX_CFG_GEOFENCE_FENCE2_LON = 0x40240032; // Longitude of the second geofence circle center +const uint32_t UBLOX_CFG_GEOFENCE_FENCE2_RAD = 0x40240033; // Radius of the second geofence circle +const uint32_t UBLOX_CFG_GEOFENCE_USE_FENCE3 = 0x10240040; // Use third geofence +const uint32_t UBLOX_CFG_GEOFENCE_FENCE3_LAT = 0x40240041; // Latitude of the third geofence circle center +const uint32_t UBLOX_CFG_GEOFENCE_FENCE3_LON = 0x40240042; // Longitude of the third geofence circle center +const uint32_t UBLOX_CFG_GEOFENCE_FENCE3_RAD = 0x40240043; // Radius of the third geofence circle +const uint32_t UBLOX_CFG_GEOFENCE_USE_FENCE4 = 0x10240050; // Use fourth geofence +const uint32_t UBLOX_CFG_GEOFENCE_FENCE4_LAT = 0x40240051; // Latitude of the fourth geofence circle center +const uint32_t UBLOX_CFG_GEOFENCE_FENCE4_LON = 0x40240052; // Longitude of the fourth geofence circle center +const uint32_t UBLOX_CFG_GEOFENCE_FENCE4_RAD = 0x40240053; // Radius of the fourth geofence circle + +//CFG-HW: Hardware configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_HW_ANT_CFG_VOLTCTRL = 0x10a3002e; // Active antenna voltage control flag +const uint32_t UBLOX_CFG_HW_ANT_CFG_SHORTDET = 0x10a3002f; // Short antenna detection flag +const uint32_t UBLOX_CFG_HW_ANT_CFG_SHORTDET_POL = 0x10a30030; // Short antenna detection polarity +const uint32_t UBLOX_CFG_HW_ANT_CFG_OPENDET = 0x10a30031; // Open antenna detection flag +const uint32_t UBLOX_CFG_HW_ANT_CFG_OPENDET_POL = 0x10a30032; // Open antenna detection polarity +const uint32_t UBLOX_CFG_HW_ANT_CFG_PWRDOWN = 0x10a30033; // Power down antenna flag +const uint32_t UBLOX_CFG_HW_ANT_CFG_PWRDOWN_POL = 0x10a30034; // Power down antenna logic polarity +const uint32_t UBLOX_CFG_HW_ANT_CFG_RECOVER = 0x10a30035; // Automatic recovery from short state flag +const uint32_t UBLOX_CFG_HW_ANT_SUP_SWITCH_PIN = 0x20a30036; // ANT1 PIO number +const uint32_t UBLOX_CFG_HW_ANT_SUP_SHORT_PIN = 0x20a30037; // ANT0 PIO number +const uint32_t UBLOX_CFG_HW_ANT_SUP_OPEN_PIN = 0x20a30038; // ANT2 PIO number +const uint32_t UBLOX_CFG_HW_ANT_SUP_ENGINE = 0x20a30054; // Antenna supervisor engine selection +const uint32_t UBLOX_CFG_HW_ANT_SUP_SHORT_THR = 0x20a30055; // Antenna supervisor MADC engine short detection threshold +const uint32_t UBLOX_CFG_HW_ANT_SUP_OPEN_THR = 0x20a30056; // Antenna supervisor MADC engine open detection threshold + +//CFG-I2C: Configuration of the I2C interface +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_I2C_ADDRESS = 0x20510001; // I2C slave address of the receiver (7 bits) +const uint32_t UBLOX_CFG_I2C_EXTENDEDTIMEOUT = 0x10510002; // Flag to disable timeouting the interface after 1.5 s +const uint32_t UBLOX_CFG_I2C_ENABLED = 0x10510003; // Flag to indicate if the I2C interface should be enabled + +//CFG-I2CINPROT: Input protocol configuration of the I2C interface +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_I2CINPROT_UBX = 0x10710001; // Flag to indicate if UBX should be an input protocol on I2C +const uint32_t UBLOX_CFG_I2CINPROT_NMEA = 0x10710002; // Flag to indicate if NMEA should be an input protocol on I2C +const uint32_t UBLOX_CFG_I2CINPROT_RTCM3X = 0x10710004; // Flag to indicate if RTCM3X should be an input protocol on I2C + +//CFG-I2COUTPROT: Output protocol configuration of the I2C interface +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_I2COUTPROT_UBX = 0x10720001; // Flag to indicate if UBX should be an output protocol on I2C +const uint32_t UBLOX_CFG_I2COUTPROT_NMEA = 0x10720002; // Flag to indicate if NMEA should be an output protocol on I2C +const uint32_t UBLOX_CFG_I2COUTPROT_RTCM3X = 0x10720004; // Flag to indicate if RTCM3X should be an output protocol on I2C + +//CFG-INFMSG: Information message configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_INFMSG_UBX_I2C = 0x20920001; // Information message enable flags for the UBX protocol on the I2C interface +const uint32_t UBLOX_CFG_INFMSG_UBX_UART1 = 0x20920002; // Information message enable flags for the UBX protocol on the UART1 interface +const uint32_t UBLOX_CFG_INFMSG_UBX_UART2 = 0x20920003; // Information message enable flags for the UBX protocol on the UART2 interface +const uint32_t UBLOX_CFG_INFMSG_UBX_USB = 0x20920004; // Information message enable flags for the UBX protocol on the USB interface +const uint32_t UBLOX_CFG_INFMSG_UBX_SPI = 0x20920005; // Information message enable flags for the UBX protocol on the SPI interface +const uint32_t UBLOX_CFG_INFMSG_NMEA_I2C = 0x20920006; // Information message enable flags for the NMEA protocol on the I2C interface +const uint32_t UBLOX_CFG_INFMSG_NMEA_UART1 = 0x20920007; // Information message enable flags for the NMEA protocol on the UART1 interface +const uint32_t UBLOX_CFG_INFMSG_NMEA_UART2 = 0x20920008; // Information message enable flags for the NMEA protocol on the UART2 interface +const uint32_t UBLOX_CFG_INFMSG_NMEA_USB = 0x20920009; // Information message enable flags for the NMEA protocol on the USB interface +const uint32_t UBLOX_CFG_INFMSG_NMEA_SPI = 0x2092000a; // Information message enable flags for the NMEA protocol on the SPI interface + +//CFG-ITFM: Jamming and interference monitor configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_ITFM_BBTHRESHOLD = 0x20410001; // Broadband jamming detection threshold +const uint32_t UBLOX_CFG_ITFM_CWTHRESHOLD = 0x20410002; // CW jamming detection threshold +const uint32_t UBLOX_CFG_ITFM_ENABLE = 0x1041000d; // Enable interference detection +const uint32_t UBLOX_CFG_ITFM_ANTSETTING = 0x20410010; // Antenna setting +const uint32_t UBLOX_CFG_ITFM_ENABLE_AUX = 0x10410013; // Scan auxiliary bands + +//CFG-LOGFILTER: Data logger configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_LOGFILTER_RECORD_ENA = 0x10de0002; // Recording enabled +const uint32_t UBLOX_CFG_LOGFILTER_ONCE_PER_WAKE_UP_ENA = 0x10de0003; // Once per wake up +const uint32_t UBLOX_CFG_LOGFILTER_APPLY_ALL_FILTERS = 0x10de0004; // Apply all filter settings +const uint32_t UBLOX_CFG_LOGFILTER_MIN_INTERVAL = 0x30de0005; // Minimum time interval between loggedpositions +const uint32_t UBLOX_CFG_LOGFILTER_TIME_THRS = 0x30de0006; // Time threshold +const uint32_t UBLOX_CFG_LOGFILTER_SPEED_THRS = 0x30de0007; // Speed threshold +const uint32_t UBLOX_CFG_LOGFILTER_POSITION_THRS = 0x40de0008; // Position threshold + +//CFG-MOT: Motion detector configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_MOT_GNSSSPEED_THRS = 0x20250038; // GNSS speed threshold below which platform is considered as stationary (a.k.a. static hold threshold) +const uint32_t UBLOX_CFG_MOT_GNSSDIST_THRS = 0x3025003b; // Distance above which GNSS-based stationary motion is exit (a.k.a. static hold distance threshold) + +// CFG-MSGOUT: Message output configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +// For each message and port a separate output rate (per second, per epoch) can be configured. +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_DTM_I2C = 0x209100a6; //Output rate of the NMEA-GX-DTM message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_DTM_SPI = 0x209100aa; //Output rate of the NMEA-GX-DTM message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_DTM_UART1 = 0x209100a7; //Output rate of the NMEA-GX-DTM message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_DTM_UART2 = 0x209100a8; //Output rate of the NMEA-GX-DTM message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_DTM_USB = 0x209100a9; //Output rate of the NMEA-GX-DTM message on port USB +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GBS_I2C = 0x209100dd; //Output rate of the NMEA-GX-GBS message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GBS_SPI = 0x209100e1; //Output rate of the NMEA-GX-GBS message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GBS_UART1 = 0x209100de; //Output rate of the NMEA-GX-GBS message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GBS_UART2 = 0x209100df; //Output rate of the NMEA-GX-GBS message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GBS_USB = 0x209100e0; //Output rate of the NMEA-GX-GBS message on port USB +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GGA_I2C = 0x209100ba; //Output rate of the NMEA-GX-GGA message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GGA_SPI = 0x209100be; //Output rate of the NMEA-GX-GGA message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GGA_UART1 = 0x209100bb; //Output rate of the NMEA-GX-GGA message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GGA_UART2 = 0x209100bc; //Output rate of the NMEA-GX-GGA message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GGA_USB = 0x209100bd; //Output rate of the NMEA-GX-GGA message on port USB +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GLL_I2C = 0x209100c9; //Output rate of the NMEA-GX-GLL message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GLL_SPI = 0x209100cd; //Output rate of the NMEA-GX-GLL message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GLL_UART1 = 0x209100ca; //Output rate of the NMEA-GX-GLL message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GLL_UART2 = 0x209100cb; //Output rate of the NMEA-GX-GLL message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GLL_USB = 0x209100cc; //Output rate of the NMEA-GX-GLL message on port USB +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GNS_I2C = 0x209100b5; //Output rate of the NMEA-GX-GNS message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GNS_SPI = 0x209100b9; //Output rate of the NMEA-GX-GNS message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GNS_UART1 = 0x209100b6; //Output rate of the NMEA-GX-GNS message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GNS_UART2 = 0x209100b7; //Output rate of the NMEA-GX-GNS message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GNS_USB = 0x209100b8; //Output rate of the NMEA-GX-GNS message on port USB +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GRS_I2C = 0x209100ce; //Output rate of the NMEA-GX-GRS message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GRS_SPI = 0x209100d2; //Output rate of the NMEA-GX-GRS message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GRS_UART1 = 0x209100cf; //Output rate of the NMEA-GX-GRS message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GRS_UART2 = 0x209100d0; //Output rate of the NMEA-GX-GRS message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GRS_USB = 0x209100d1; //Output rate of the NMEA-GX-GRS message on port USB +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSA_I2C = 0x209100bf; //Output rate of the NMEA-GX-GSA message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSA_SPI = 0x209100c3; //Output rate of the NMEA-GX-GSA message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSA_UART1 = 0x209100c0; //Output rate of the NMEA-GX-GSA message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSA_UART2 = 0x209100c1; //Output rate of the NMEA-GX-GSA message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSA_USB = 0x209100c2; //Output rate of the NMEA-GX-GSA message on port USB +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GST_I2C = 0x209100d3; //Output rate of the NMEA-GX-GST message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GST_SPI = 0x209100d7; //Output rate of the NMEA-GX-GST message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GST_UART1 = 0x209100d4; //Output rate of the NMEA-GX-GST message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GST_UART2 = 0x209100d5; //Output rate of the NMEA-GX-GST message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GST_USB = 0x209100d6; //Output rate of the NMEA-GX-GST message on port USB +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSV_I2C = 0x209100c4; //Output rate of the NMEA-GX-GSV message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSV_SPI = 0x209100c8; //Output rate of the NMEA-GX-GSV message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSV_UART1 = 0x209100c5; //Output rate of the NMEA-GX-GSV message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSV_UART2 = 0x209100c6; //Output rate of the NMEA-GX-GSV message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSV_USB = 0x209100c7; //Output rate of the NMEA-GX-GSV message on port USB +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RLM_I2C = 0x20910400; //Output rate of the NMEA-GX-RLM message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RLM_SPI = 0x20910404; //Output rate of the NMEA-GX-RLM message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RLM_UART1 = 0x20910401; //Output rate of the NMEA-GX-RLM message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RLM_UART2 = 0x20910402; //Output rate of the NMEA-GX-RLM message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RLM_USB = 0x20910403; //Output rate of the NMEA-GX-RLM message on port USB +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RMC_I2C = 0x209100ab; //Output rate of the NMEA-GX-RMC message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RMC_SPI = 0x209100af; //Output rate of the NMEA-GX-RMC message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RMC_UART1 = 0x209100ac; //Output rate of the NMEA-GX-RMC message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RMC_UART2 = 0x209100ad; //Output rate of the NMEA-GX-RMC message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RMC_USB = 0x209100ae; //Output rate of the NMEA-GX-RMC message on port USB +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VLW_I2C = 0x209100e7; //Output rate of the NMEA-GX-VLW message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VLW_SPI = 0x209100eb; //Output rate of the NMEA-GX-VLW message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VLW_UART1 = 0x209100e8; //Output rate of the NMEA-GX-VLW message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VLW_UART2 = 0x209100e9; //Output rate of the NMEA-GX-VLW message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VLW_USB = 0x209100ea; //Output rate of the NMEA-GX-VLW message on port USB +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VTG_I2C = 0x209100b0; //Output rate of the NMEA-GX-VTG message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VTG_SPI = 0x209100b4; //Output rate of the NMEA-GX-VTG message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VTG_UART1 = 0x209100b1; //Output rate of the NMEA-GX-VTG message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VTG_UART2 = 0x209100b2; //Output rate of the NMEA-GX-VTG message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VTG_USB = 0x209100b3; //Output rate of the NMEA-GX-VTG message on port USB +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_ZDA_I2C = 0x209100d8; //Output rate of the NMEA-GX-ZDA message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_ZDA_SPI = 0x209100dc; //Output rate of the NMEA-GX-ZDA message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_ZDA_UART1 = 0x209100d9; //Output rate of the NMEA-GX-ZDA message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_ZDA_UART2 = 0x209100da; //Output rate of the NMEA-GX-ZDA message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_ZDA_USB = 0x209100db; //Output rate of the NMEA-GX-ZDA message on port USB +const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYP_I2C = 0x209100ec; //Output rate of the NMEA-GX-PUBX00 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYP_SPI = 0x209100f0; //Output rate of the NMEA-GX-PUBX00 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYP_UART1 = 0x209100ed; //Output rate of the NMEA-GX-PUBX00 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYP_UART2 = 0x209100ee; //Output rate of the NMEA-GX-PUBX00 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYP_USB = 0x209100ef; //Output rate of the NMEA-GX-PUBX00 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYS_I2C = 0x209100f1; //Output rate of the NMEA-GX-PUBX03 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYS_SPI = 0x209100f5; //Output rate of the NMEA-GX-PUBX03 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYS_UART1 = 0x209100f2; //Output rate of the NMEA-GX-PUBX03 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYS_UART2 = 0x209100f3; //Output rate of the NMEA-GX-PUBX03 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYS_USB = 0x209100f4; //Output rate of the NMEA-GX-PUBX03 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYT_I2C = 0x209100f6; //Output rate of the NMEA-GX-PUBX04 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYT_SPI = 0x209100fa; //Output rate of the NMEA-GX-PUBX04 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYT_UART1 = 0x209100f7; //Output rate of the NMEA-GX-PUBX04 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYT_UART2 = 0x209100f8; //Output rate of the NMEA-GX-PUBX04 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYT_USB = 0x209100f9; //Output rate of the NMEA-GX-PUBX04 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1005_I2C = 0x209102bd; //Output rate of the RTCM-3X-TYPE1005 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1005_SPI = 0x209102c1; //Output rate of the RTCM-3X-TYPE1005 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1005_UART1 = 0x209102be;//Output rate of the RTCM-3X-TYPE1005 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1005_UART2 = 0x209102bf;//Output rate of the RTCM-3X-TYPE1005 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1005_USB = 0x209102c0; //Output rate of the RTCM-3X-TYPE1005 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1074_I2C = 0x2091035e; //Output rate of the RTCM-3X-TYPE1074 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1074_SPI = 0x20910362; //Output rate of the RTCM-3X-TYPE1074 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1074_UART1 = 0x2091035f;//Output rate of the RTCM-3X-TYPE1074 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1074_UART2 = 0x20910360;//Output rate of the RTCM-3X-TYPE1074 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1074_USB = 0x20910361; //Output rate of the RTCM-3X-TYPE1074 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1077_I2C = 0x209102cc; //Output rate of the RTCM-3X-TYPE1077 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1077_SPI = 0x209102d0; //Output rate of the RTCM-3X-TYPE1077 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1077_UART1 = 0x209102cd;//Output rate of the RTCM-3X-TYPE1077 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1077_UART2 = 0x209102ce;//Output rate of the RTCM-3X-TYPE1077 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1077_USB = 0x209102cf; //Output rate of the RTCM-3X-TYPE1077 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1084_I2C = 0x20910363; //Output rate of the RTCM-3X-TYPE1084 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1084_SPI = 0x20910367; //Output rate of the RTCM-3X-TYPE1084 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1084_UART1 = 0x20910364;//Output rate of the RTCM-3X-TYPE1084 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1084_UART2 = 0x20910365;//Output rate of the RTCM-3X-TYPE1084 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1084_USB = 0x20910366; //Output rate of the RTCM-3X-TYPE1084 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1087_I2C = 0x209102d1; //Output rate of the RTCM-3X-TYPE1087 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1087_SPI = 0x209102d5; //Output rate of the RTCM-3X-TYPE1087 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1087_UART1 = 0x209102d2;//Output rate of the RTCM-3X-TYPE1087 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1087_UART2 = 0x209102d3;//Output rate of the RTCM-3X-TYPE1087 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1087_USB = 0x209102d4; //Output rate of the RTCM-3X-TYPE1087 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1094_I2C = 0x20910368; //Output rate of the RTCM-3X-TYPE1094 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1094_SPI = 0x2091036c; //Output rate of the RTCM-3X-TYPE1094 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1094_UART1 = 0x20910369;//Output rate of the RTCM-3X-TYPE1094 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1094_UART2 = 0x2091036a;//Output rate of the RTCM-3X-TYPE1094 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1094_USB = 0x2091036b; //Output rate of the RTCM-3X-TYPE1094 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1097_I2C = 0x20910318; //Output rate of the RTCM-3X-TYPE1097 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1097_SPI = 0x2091031c; //Output rate of the RTCM-3X-TYPE1097 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1097_UART1 = 0x20910319;//Output rate of the RTCM-3X-TYPE1097 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1097_UART2 = 0x2091031a;//Output rate of the RTCM-3X-TYPE1097 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1097_USB = 0x2091031b; //Output rate of the RTCM-3X-TYPE1097 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1124_I2C = 0x2091036d; //Output rate of the RTCM-3X-TYPE1124 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1124_SPI = 0x20910371; //Output rate of the RTCM-3X-TYPE1124 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1124_UART1 = 0x2091036e;//Output rate of the RTCM-3X-TYPE1124 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1124_UART2 = 0x2091036f;//Output rate of the RTCM-3X-TYPE1124 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1124_USB = 0x20910370; //Output rate of the RTCM-3X-TYPE1124 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1127_I2C = 0x209102d6; //Output rate of the RTCM-3X-TYPE1127 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1127_SPI = 0x209102da; //Output rate of the RTCM-3X-TYPE1127 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1127_UART1 = 0x209102d7;//Output rate of the RTCM-3X-TYPE1127 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1127_UART2 = 0x209102d8;//Output rate of the RTCM-3X-TYPE1127 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1127_USB = 0x209102d9; //Output rate of the RTCM-3X-TYPE1127 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1230_I2C = 0x20910303; //Output rate of the RTCM-3X-TYPE1230 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1230_SPI = 0x20910307; //Output rate of the RTCM-3X-TYPE1230 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1230_UART1 = 0x20910304;//Output rate of the RTCM-3X-TYPE1230 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1230_UART2 = 0x20910305;//Output rate of the RTCM-3X-TYPE1230 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1230_USB = 0x20910306; //Output rate of the RTCM-3X-TYPE1230 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_0_I2C = 0x209102fe;//Output rate of the RTCM-3X-TYPE4072_0 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_0_SPI = 0x20910302;//Output rate of the RTCM-3X-TYPE4072_0 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_0_UART1 = 0x209102ff; //Output rate of the RTCM-3X-TYPE4072_0 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_0_UART2 = 0x20910300; //Output rate of the RTCM-3X-TYPE4072_0 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_0_USB = 0x20910301;//Output rate of the RTCM-3X-TYPE4072_0 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_1_I2C = 0x20910381;//Output rate of the RTCM-3X-TYPE4072_1 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_1_SPI = 0x20910385;//Output rate of the RTCM-3X-TYPE4072_1 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_1_UART1 = 0x20910382; //Output rate of the RTCM-3X-TYPE4072_1 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_1_UART2 = 0x20910383; //Output rate of the RTCM-3X-TYPE4072_1 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_1_USB = 0x20910384;//Output rate of the RTCM-3X-TYPE4072_1 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_LOG_INFO_I2C = 0x20910259; //Output rate of the UBX-LOG-INFO message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_LOG_INFO_SPI = 0x2091025d; //Output rate of the UBX-LOG-INFO message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_LOG_INFO_UART1 = 0x2091025a; //Output rate of the UBX-LOG-INFO message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_LOG_INFO_UART2 = 0x2091025b; //Output rate of the UBX-LOG-INFO message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_LOG_INFO_USB = 0x2091025c; //Output rate of the UBX-LOG-INFO message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_COMMS_I2C = 0x2091034f; //Output rate of the UBX-MON-COMMS message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_COMMS_SPI = 0x20910353; //Output rate of the UBX-MON-COMMS message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_COMMS_UART1 = 0x20910350; //Output rate of the UBX-MON-COMMS message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_COMMS_UART2 = 0x20910351; //Output rate of the UBX-MON-COMMS message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_COMMS_USB = 0x20910352; //Output rate of the UBX-MON-COMMS message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW2_I2C = 0x209101b9; //Output rate of the UBX-MON-HW2 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW2_SPI = 0x209101bd; //Output rate of the UBX-MON-HW2 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW2_UART1 = 0x209101ba; //Output rate of the UBX-MON-HW2 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW2_UART2 = 0x209101bb; //Output rate of the UBX-MON-HW2 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW2_USB = 0x209101bc; //Output rate of the UBX-MON-HW2 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW3_I2C = 0x20910354; //Output rate of the UBX-MON-HW3 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW3_SPI = 0x20910358; //Output rate of the UBX-MON-HW3 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW3_UART1 = 0x20910355; //Output rate of the UBX-MON-HW3 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW3_UART2 = 0x20910356; //Output rate of the UBX-MON-HW3 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW3_USB = 0x20910357; //Output rate of the UBX-MON-HW3 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW_I2C = 0x209101b4; //Output rate of the UBX-MON-HW message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW_SPI = 0x209101b8; //Output rate of the UBX-MON-HW message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW_UART1 = 0x209101b5; //Output rate of the UBX-MON-HW message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW_UART2 = 0x209101b6; //Output rate of the UBX-MON-HW message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW_USB = 0x209101b7; //Output rate of the UBX-MON-HW message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_IO_I2C = 0x209101a5; //Output rate of the UBX-MON-IO message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_IO_SPI = 0x209101a9; //Output rate of the UBX-MON-IO message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_IO_UART1 = 0x209101a6; //Output rate of the UBX-MON-IO message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_IO_UART2 = 0x209101a7; //Output rate of the UBX-MON-IO message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_IO_USB = 0x209101a8; //Output rate of the UBX-MON-IO message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_MSGPP_I2C = 0x20910196; //Output rate of the UBX-MON-MSGPP message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_MSGPP_SPI = 0x2091019a; //Output rate of the UBX-MON-MSGPP message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_MSGPP_UART1 = 0x20910197; //Output rate of the UBX-MON-MSGPP message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_MSGPP_UART2 = 0x20910198; //Output rate of the UBX-MON-MSGPP message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_MSGPP_USB = 0x20910199; //Output rate of the UBX-MON-MSGPP message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RF_I2C = 0x20910359; //Output rate of the UBX-MON-RF message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RF_SPI = 0x2091035d; //Output rate of the UBX-MON-RF message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RF_UART1 = 0x2091035a; //Output rate of the UBX-MON-RF message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RF_UART2 = 0x2091035b; //Output rate of the UBX-MON-RF message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RF_USB = 0x2091035c; // Output rate of the UBX-MON-RF message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXBUF_I2C = 0x209101a0; // Output rate of the UBX-MON-RXBUF message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXBUF_SPI = 0x209101a4; // Output rate of the UBX-MON-RXBUF message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXBUF_UART1 = 0x209101a1; // Output rate of the UBX-MON-RXBUF message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXBUF_UART2 = 0x209101a2; // Output rate of the UBX-MON-RXBUF message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXBUF_USB = 0x209101a3; // Output rate of the UBX-MON-RXBUF message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXR_I2C = 0x20910187; // Output rate of the UBX-MON-RXR message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXR_SPI = 0x2091018b; // Output rate of the UBX-MON-RXR message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXR_UART1 = 0x20910188; // Output rate of the UBX-MON-RXR message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXR_UART2 = 0x20910189; // Output rate of the UBX-MON-RXR message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXR_USB = 0x2091018a; // Output rate of the UBX-MON-RXR message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_SPAN_I2C = 0x2091038b; // Output rate of the UBX-MON-SPAN message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_SPAN_SPI = 0x2091038f; // Output rate of the UBX-MON-SPAN message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_SPAN_UART1 = 0x2091038c; // Output rate of the UBX-MON-SPAN message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_SPAN_UART2 = 0x2091038d; // Output rate of the UBX-MON-SPAN message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_SPAN_USB = 0x2091038e; // Output rate of the UBX-MON-SPAN message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_TXBUF_I2C = 0x2091019b; // Output rate of the UBX-MON-TXBUF message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_TXBUF_SPI = 0x2091019f; // Output rate of the UBX-MON-TXBUF message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_TXBUF_UART1 = 0x2091019c; // Output rate of the UBX-MON-TXBUF message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_TXBUF_UART2 = 0x2091019d; // Output rate of the UBX-MON-TXBUF message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_TXBUF_USB = 0x2091019e; // Output rate of the UBX-MON-TXBUF message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ATT_I2C = 0x2091001f; // Output rate of the UBX_NAV_ATT message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ATT_SPI = 0x20910023; // Output rate of the UBX_NAV_ATT message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ATT_UART1 = 0x20910020; // Output rate of the UBX_NAV_ATT message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ATT_UART2 = 0x20910021; // Output rate of the UBX_NAV_ATT message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ATT_USB = 0x20910022; // Output rate of the UBX_NAV_ATT message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_CLOCK_I2C = 0x20910065; // Output rate of the UBX-NAV-CLOCK message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_CLOCK_SPI = 0x20910069; // Output rate of the UBX-NAV-CLOCK message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_CLOCK_UART1 = 0x20910066; // Output rate of the UBX-NAV-CLOCK message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_CLOCK_UART2 = 0x20910067; // Output rate of the UBX-NAV-CLOCK message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_CLOCK_USB = 0x20910068; // Output rate of the UBX-NAV-CLOCK message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_DOP_I2C = 0x20910038; // Output rate of the UBX-NAV-DOP message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_DOP_SPI = 0x2091003c; // Output rate of the UBX-NAV-DOP message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_DOP_UART1 = 0x20910039; // Output rate of the UBX-NAV-DOP message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_DOP_UART2 = 0x2091003a; // Output rate of the UBX-NAV-DOP message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_DOP_USB = 0x2091003b; // Output rate of the UBX-NAV-DOP message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_EOE_I2C = 0x2091015f; // Output rate of the UBX-NAV-EOE message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_EOE_SPI = 0x20910163; // Output rate of the UBX-NAV-EOE message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_EOE_UART1 = 0x20910160; // Output rate of the UBX-NAV-EOE message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_EOE_UART2 = 0x20910161; // Output rate of the UBX-NAV-EOE message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_EOE_USB = 0x20910162; // Output rate of the UBX-NAV-EOE message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_GEOFENCE_I2C = 0x209100a1; // Output rate of the UBX-NAV-GEOFENCE message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_GEOFENCE_SPI = 0x209100a5; // Output rate of the UBX-NAV-GEOFENCE message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_GEOFENCE_UART1 = 0x209100a2;// Output rate of the UBX-NAV-GEOFENCE message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_GEOFENCE_UART2 = 0x209100a3;// Output rate of the UBX-NAV-GEOFENCE message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_GEOFENCE_USB = 0x209100a4; // Output rate of the UBX-NAV-GEOFENCE message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSECEF_I2C = 0x2091002e;// Output rate of the UBX-NAV-HPPOSECEF message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSECEF_SPI = 0x20910032;// Output rate of the UBX-NAV-HPPOSECEF message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSECEF_UART1 = 0x2091002f;// Output rate of the UBX-NAV-HPPOSECEF message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSECEF_UART2 = 0x20910030;// Output rate of the UBX-NAV-HPPOSECEF message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSECEF_USB = 0x20910031;// Output rate of the UBX-NAV-HPPOSECEF message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSLLH_I2C = 0x20910033; // Output rate of the UBX-NAV-HPPOSLLH message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSLLH_SPI = 0x20910037; // Output rate of the UBX-NAV-HPPOSLLH message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSLLH_UART1 = 0x20910034;// Output rate of the UBX-NAV-HPPOSLLH message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSLLH_UART2 = 0x20910035;// Output rate of the UBX-NAV-HPPOSLLH message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSLLH_USB = 0x20910036; // Output rate of the UBX-NAV-HPPOSLLH message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ODO_I2C = 0x2091007e; // Output rate of the UBX-NAV-ODO message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ODO_SPI = 0x20910082; // Output rate of the UBX-NAV-ODO message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ODO_UART1 = 0x2091007f; // Output rate of the UBX-NAV-ODO message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ODO_UART2 = 0x20910080; // Output rate of the UBX-NAV-ODO message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ODO_USB = 0x20910081; // Output rate of the UBX-NAV-ODO message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ORB_I2C = 0x20910010; // Output rate of the UBX-NAV-ORB message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ORB_SPI = 0x20910014; // Output rate of the UBX-NAV-ORB message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ORB_UART1 = 0x20910011; // Output rate of the UBX-NAV-ORB message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ORB_UART2 = 0x20910012; // Output rate of the UBX-NAV-ORB message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ORB_USB = 0x20910013; // Output rate of the UBX-NAV-ORB message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSECEF_I2C = 0x20910024; // Output rate of the UBX-NAV-POSECEF message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSECEF_SPI = 0x20910028; // Output rate of the UBX-NAV-POSECEF message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSECEF_UART1 = 0x20910025;// Output rate of the UBX-NAV-POSECEF message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSECEF_UART2 = 0x20910026;// Output rate of the UBX-NAV-POSECEF message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSECEF_USB = 0x20910027; // Output rate of the UBX-NAV-POSECEF message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSLLH_I2C = 0x20910029; // Output rate of the UBX-NAV-POSLLH message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSLLH_SPI = 0x2091002d; // Output rate of the UBX-NAV-POSLLH message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSLLH_UART1 = 0x2091002a; // Output rate of the UBX-NAV-POSLLH message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSLLH_UART2 = 0x2091002b; // Output rate of the UBX-NAV-POSLLH message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSLLH_USB = 0x2091002c; // Output rate of the UBX-NAV-POSLLH message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_PVT_I2C = 0x20910006; // Output rate of the UBX-NAV-PVT message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_PVT_SPI = 0x2091000a; // Output rate of the UBX-NAV-PVT message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_PVT_UART1 = 0x20910007; // Output rate of the UBX-NAV-PVT message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_PVT_UART2 = 0x20910008; // Output rate of the UBX-NAV-PVT message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_PVT_USB = 0x20910009; // Output rate of the UBX-NAV-PVT message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_RELPOSNED_I2C = 0x2091008d; // Output rate of the UBX-NAV-RELPOSNED message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_RELPOSNED_SPI = 0x20910091;// Output rate of the UBX-NAV-RELPOSNED message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_RELPOSNED_UART1 = 0x2091008e;// Output rate of the UBX-NAV-RELPOSNED message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_RELPOSNED_UART2 = 0x2091008f;// Output rate of the UBX-NAV-RELPOSNED message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_RELPOSNED_USB = 0x20910090;// Output rate of the UBX-NAV-RELPOSNED message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SAT_I2C = 0x20910015; // Output rate of the UBX-NAV-SAT message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SAT_SPI = 0x20910019; // Output rate of the UBX-NAV-SAT message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SAT_UART1 = 0x20910016; // Output rate of the UBX-NAV-SAT message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SAT_UART2 = 0x20910017; // Output rate of the UBX-NAV-SAT message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SAT_USB = 0x20910018; // Output rate of the UBX-NAV-SAT message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SBAS_I2C = 0x2091006a; // Output rate of the UBX-NAV-SBAS message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SBAS_SPI = 0x2091006e; // Output rate of the UBX-NAV-SBAS message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SBAS_UART1 = 0x2091006b; // Output rate of the UBX-NAV-SBAS message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SBAS_UART2 = 0x2091006c; // Output rate of the UBX-NAV-SBAS message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SBAS_USB = 0x2091006d; // Output rate of the UBX-NAV-SBAS message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SIG_I2C = 0x20910345; // Output rate of the UBX-NAV-SIG message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SIG_SPI = 0x20910349; // Output rate of the UBX-NAV-SIG message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SIG_UART1 = 0x20910346; // Output rate of the UBX-NAV-SIG message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SIG_UART2 = 0x20910347; // Output rate of the UBX-NAV-SIG message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SIG_USB = 0x20910348; // Output rate of the UBX-NAV-SIG message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SLAS_I2C = 0x20910336; // Output rate of the UBX-NAV-SLAS message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SLAS_SPI = 0x2091033a; // Output rate of the UBX-NAV-SLAS message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SLAS_UART1 = 0x20910337; // Output rate of the UBX-NAV-SLAS message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SLAS_UART2 = 0x20910338; // Output rate of the UBX-NAV-SLAS message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SLAS_USB = 0x20910339; // Output rate of the UBX-NAV-SLAS message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_STATUS_I2C = 0x2091001a; // Output rate of the UBX-NAV-STATUS message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_STATUS_SPI = 0x2091001e; // Output rate of the UBX-NAV-STATUS message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_STATUS_UART1 = 0x2091001b; // Output rate of the UBX-NAV-STATUS message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_STATUS_UART2 = 0x2091001c; // Output rate of the UBX-NAV-STATUS message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_STATUS_USB = 0x2091001d; // Output rate of the UBX-NAV-STATUS message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SVIN_I2C = 0x20910088; // Output rate of the UBX-NAV-SVIN message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SVIN_SPI = 0x2091008c; // Output rate of the UBX-NAV-SVIN message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SVIN_UART1 = 0x20910089; // Output rate of the UBX-NAV-SVIN message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SVIN_UART2 = 0x2091008a; // Output rate of the UBX-NAV-SVIN message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SVIN_USB = 0x2091008b; // Output rate of the UBX-NAV-SVIN message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEBDS_I2C = 0x20910051; // Output rate of the UBX-NAV-TIMEBDS message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEBDS_SPI = 0x20910055; // Output rate of the UBX-NAV-TIMEBDS message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEBDS_UART1 = 0x20910052;// Output rate of the UBX-NAV-TIMEBDS message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEBDS_UART2 = 0x20910053;// Output rate of the UBX-NAV-TIMEBDS message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEBDS_USB = 0x20910054; // Output rate of the UBX-NAV-TIMEBDS message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGAL_I2C = 0x20910056; // Output rate of the UBX-NAV-TIMEGAL message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGAL_SPI = 0x2091005a; // Output rate of the UBX-NAV-TIMEGAL message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGAL_UART1 = 0x20910057;// Output rate of the UBX-NAV-TIMEGAL message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGAL_UART2 = 0x20910058;// Output rate of the UBX-NAV-TIMEGAL message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGAL_USB = 0x20910059; // Output rate of the UBX-NAV-TIMEGAL message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGLO_I2C = 0x2091004c; // Output rate of the UBX-NAV-TIMEGLO message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGLO_SPI = 0x20910050; // Output rate of the UBX-NAV-TIMEGLO message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGLO_UART1 = 0x2091004d;// Output rate of the UBX-NAV-TIMEGLO message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGLO_UART2 = 0x2091004e;// Output rate of the UBX-NAV-TIMEGLO message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGLO_USB = 0x2091004f; // Output rate of the UBX-NAV-TIMEGLO message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGPS_I2C = 0x20910047; // Output rate of the UBX-NAV-TIMEGPS message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGPS_SPI = 0x2091004b; // Output rate of the UBX-NAV-TIMEGPS message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGPS_UART1 = 0x20910048;// Output rate of the UBX-NAV-TIMEGPS message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGPS_UART2 = 0x20910049;// Output rate of the UBX-NAV-TIMEGPS message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGPS_USB = 0x2091004a; // Output rate of the UBX-NAV-TIMEGPS message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMELS_I2C = 0x20910060; // Output rate of the UBX-NAV-TIMELS message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMELS_SPI = 0x20910064; // Output rate of the UBX-NAV-TIMELS message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMELS_UART1 = 0x20910061; // Output rate of the UBX-NAV-TIMELS message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMELS_UART2 = 0x20910062; // Output rate of the UBX-NAV-TIMELS message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMELS_USB = 0x20910063; // Output rate of the UBX-NAV-TIMELS message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEQZSS_I2C = 0x20910386; // Output rate of the UBX-NAV-TIMEQZSSmessage on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEQZSS_SPI = 0x2091038a; // Output rate of the UBX-NAV-TIMEQZSSmessage on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEQZSS_UART1 = 0x20910387;// Output rate of the UBX-NAV-TIMEQZSSmessage on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEQZSS_UART2 = 0x20910388;// Output rate of the UBX-NAV-TIMEQZSSmessage on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEQZSS_USB = 0x20910389; // Output rate of the UBX-NAV-TIMEQZSSmessage on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEUTC_I2C = 0x2091005b; // Output rate of the UBX-NAV-TIMEUTC message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEUTC_SPI = 0x2091005f; // Output rate of the UBX-NAV-TIMEUTC message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEUTC_UART1 = 0x2091005c;// Output rate of the UBX-NAV-TIMEUTC message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEUTC_UART2 = 0x2091005d;// Output rate of the UBX-NAV-TIMEUTC message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEUTC_USB = 0x2091005e; // Output rate of the UBX-NAV-TIMEUTC message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELECEF_I2C = 0x2091003d; // Output rate of the UBX-NAV-VELECEF message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELECEF_SPI = 0x20910041; // Output rate of the UBX-NAV-VELECEF message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELECEF_UART1 = 0x2091003e;// Output rate of the UBX-NAV-VELECEF message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELECEF_UART2 = 0x2091003f;// Output rate of the UBX-NAV-VELECEF message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELECEF_USB = 0x20910040; // Output rate of the UBX-NAV-VELECEF message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELNED_I2C = 0x20910042; // Output rate of the UBX-NAV-VELNED message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELNED_SPI = 0x20910046; // Output rate of the UBX-NAV-VELNED message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELNED_UART1 = 0x20910043; // Output rate of the UBX-NAV-VELNED message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELNED_UART2 = 0x20910044; // Output rate of the UBX-NAV-VELNED message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELNED_USB = 0x20910045; // Output rate of the UBX-NAV-VELNED message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_MEASX_I2C = 0x20910204; // Output rate of the UBX-RXM-MEASX message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_MEASX_SPI = 0x20910208; // Output rate of the UBX-RXM-MEASX message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_MEASX_UART1 = 0x20910205; // Output rate of the UBX-RXM-MEASX message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_MEASX_UART2 = 0x20910206; // Output rate of the UBX-RXM-MEASX message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_MEASX_USB = 0x20910207; // Output rate of the UBX-RXM-MEASX message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RAWX_I2C = 0x209102a4; // Output rate of the UBX-RXM-RAWX message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RAWX_SPI = 0x209102a8; // Output rate of the UBX-RXM-RAWX message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RAWX_UART1 = 0x209102a5; // Output rate of the UBX-RXM-RAWX message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RAWX_UART2 = 0x209102a6; // Output rate of the UBX-RXM-RAWX message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RAWX_USB = 0x209102a7; // Output rate of the UBX-RXM-RAWX message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RLM_I2C = 0x2091025e; // Output rate of the UBX-RXM-RLM message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RLM_SPI = 0x20910262; // Output rate of the UBX-RXM-RLM message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RLM_UART1 = 0x2091025f; // Output rate of the UBX-RXM-RLM message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RLM_UART2 = 0x20910260; // Output rate of the UBX-RXM-RLM message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RLM_USB = 0x20910261; // Output rate of the UBX-RXM-RLM message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RTCM_I2C = 0x20910268; // Output rate of the UBX-RXM-RTCM message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RTCM_SPI = 0x2091026c; // Output rate of the UBX-RXM-RTCM message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RTCM_UART1 = 0x20910269; // Output rate of the UBX-RXM-RTCM message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RTCM_UART2 = 0x2091026a; // Output rate of the UBX-RXM-RTCM message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RTCM_USB = 0x2091026b; // Output rate of the UBX-RXM-RTCM message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_SFRBX_I2C = 0x20910231; // Output rate of the UBX-RXM-SFRBX message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_SFRBX_SPI = 0x20910235; // Output rate of the UBX-RXM-SFRBX message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_SFRBX_UART1 = 0x20910232; // Output rate of the UBX-RXM-SFRBX message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_SFRBX_UART2 = 0x20910233; // Output rate of the UBX-RXM-SFRBX message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_SFRBX_USB = 0x20910234; // Output rate of the UBX-RXM-SFRBX message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TM2_I2C = 0x20910178; // Output rate of the UBX-TIM-TM2 message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TM2_SPI = 0x2091017c; // Output rate of the UBX-TIM-TM2 message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TM2_UART1 = 0x20910179; // Output rate of the UBX-TIM-TM2 message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TM2_UART2 = 0x2091017a; // Output rate of the UBX-TIM-TM2 message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TM2_USB = 0x2091017b; // Output rate of the UBX-TIM-TM2 message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TP_I2C = 0x2091017d; // Output rate of the UBX-TIM-TP message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TP_SPI = 0x20910181; // Output rate of the UBX-TIM-TP message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TP_UART1 = 0x2091017e; // Output rate of the UBX-TIM-TP message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TP_UART2 = 0x2091017f; // Output rate of the UBX-TIM-TP message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TP_USB = 0x20910180; // Output rate of the UBX-TIM-TP message on port USB +const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_VRFY_I2C = 0x20910092; // Output rate of the UBX-TIM-VRFY message on port I2C +const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_VRFY_SPI = 0x20910096; // Output rate of the UBX-TIM-VRFY message on port SPI +const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_VRFY_UART1 = 0x20910093; // Output rate of the UBX-TIM-VRFY message on port UART1 +const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_VRFY_UART2 = 0x20910094; // Output rate of the UBX-TIM-VRFY message on port UART2 +const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_VRFY_USB = 0x20910095; // Output rate of the UBX-TIM-VRFY message on port USB + +//CFG-NAVHPG: High precision navigation configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_NAVHPG_DGNSSMODE = 0x20140011; // DiīŦ€erential corrections mode + +//CFG-NAVSPG: Standard precision navigation configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_NAVSPG_FIXMODE = 0x20110011; // Position fix mode +const uint32_t UBLOX_CFG_NAVSPG_INIFIX3D = 0x10110013; // Initial fix must be a 3D fix +const uint32_t UBLOX_CFG_NAVSPG_WKNROLLOVER = 0x30110017; // GPS week rollover number +const uint32_t UBLOX_CFG_NAVSPG_UTCSTANDARD = 0x2011001c; // UTC standard to be used +const uint32_t UBLOX_CFG_NAVSPG_DYNMODEL = 0x20110021; // Dynamic platform model +const uint32_t UBLOX_CFG_NAVSPG_ACKAIDING = 0x10110025; // Acknowledge assistance input messages +const uint32_t UBLOX_CFG_NAVSPG_USE_USRDAT = 0x10110061; // Use user geodetic datum parameters +const uint32_t UBLOX_CFG_NAVSPG_USRDAT_MAJA = 0x50110062; // Geodetic datum semi-major axis +const uint32_t UBLOX_CFG_NAVSPG_USRDAT_FLAT = 0x50110063; // Geodetic datum 1.0 flattening +const uint32_t UBLOX_CFG_NAVSPG_USRDAT_DX = 0x40110064; // Geodetic datum X axis shift at the origin +const uint32_t UBLOX_CFG_NAVSPG_USRDAT_DY = 0x40110065; // Geodetic datum Y axis shift at the origin +const uint32_t UBLOX_CFG_NAVSPG_USRDAT_DZ = 0x40110066; // Geodetic datum Z axis shift at the origin +const uint32_t UBLOX_CFG_NAVSPG_USRDAT_ROTX = 0x40110067; // arcsec Geodetic datum rotation about the X axis +const uint32_t UBLOX_CFG_NAVSPG_USRDAT_ROTY = 0x40110068; // arcsec Geodetic datum rotation about the Y axis +const uint32_t UBLOX_CFG_NAVSPG_USRDAT_ROTZ = 0x40110069; // arcsec Geodetic datum rotation about the Z axis +const uint32_t UBLOX_CFG_NAVSPG_USRDAT_SCALE = 0x4011006a; // ppm Geodetic datum scale factor +const uint32_t UBLOX_CFG_NAVSPG_INFIL_MINSVS = 0x201100a1; // Minimum number of satellites for navigation +const uint32_t UBLOX_CFG_NAVSPG_INFIL_MAXSVS = 0x201100a2; // Maximum number of satellites for navigation +const uint32_t UBLOX_CFG_NAVSPG_INFIL_MINCNO = 0x201100a3; // Minimum satellite signal level for navigation +const uint32_t UBLOX_CFG_NAVSPG_INFIL_MINELEV = 0x201100a4; // Minimum elevation for a GNSS satellite to be used in navigation +const uint32_t UBLOX_CFG_NAVSPG_INFIL_NCNOTHRS = 0x201100aa; // Number of satellites required to have C/N0 above const uint32_t UBLOX_CFG_NAVSPG-INFIL_CNOTHRS for a fix to be attempted +const uint32_t UBLOX_CFG_NAVSPG_INFIL_CNOTHRS = 0x201100ab; // C/N0 threshold for deciding whether to attempt a fix +const uint32_t UBLOX_CFG_NAVSPG_OUTFIL_PDOP = 0x301100b1; // Output filter position DOP mask (threshold) +const uint32_t UBLOX_CFG_NAVSPG_OUTFIL_TDOP = 0x301100b2; // Output filter time DOP mask (threshold) +const uint32_t UBLOX_CFG_NAVSPG_OUTFIL_PACC = 0x301100b3; // Output filter position accuracy mask (threshold) +const uint32_t UBLOX_CFG_NAVSPG_OUTFIL_TACC = 0x301100b4; // Output filter time accuracy mask (threshold) +const uint32_t UBLOX_CFG_NAVSPG_OUTFIL_FACC = 0x301100b5; // Output filter frequency accuracy mask (threshold) +const uint32_t UBLOX_CFG_NAVSPG_CONSTR_ALT = 0x401100c1; // Fixed altitude (mean sea level) for 2D fix mode +const uint32_t UBLOX_CFG_NAVSPG_CONSTR_ALTVAR = 0x401100c2; // Fixed altitude variance for 2D mode +const uint32_t UBLOX_CFG_NAVSPG_CONSTR_DGNSSTO = 0x201100c4; // DGNSS timeout + +//CFG-NMEA: NMEA protocol configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_NMEA_PROTVER = 0x20930001; // NMEA protocol version +const uint32_t UBLOX_CFG_NMEA_MAXSVS = 0x20930002; // Maximum number of SVs to report per Talker ID +const uint32_t UBLOX_CFG_NMEA_COMPAT = 0x10930003; // Enable compatibility mode +const uint32_t UBLOX_CFG_NMEA_CONSIDER = 0x10930004; // Enable considering mode +const uint32_t UBLOX_CFG_NMEA_LIMIT82 = 0x10930005; // Enable strict limit to 82 characters maximum NMEA message length +const uint32_t UBLOX_CFG_NMEA_HIGHPREC = 0x10930006; // Enable high precision mode +const uint32_t UBLOX_CFG_NMEA_SVNUMBERING = 0x20930007; // Display configuration for SVs that do not have value defined in NMEA +const uint32_t UBLOX_CFG_NMEA_FILT_GPS = 0x10930011; // Disable reporting of GPS satellites +const uint32_t UBLOX_CFG_NMEA_FILT_SBAS = 0x10930012; // Disable reporting of SBAS satellites +const uint32_t UBLOX_CFG_NMEA_FILT_GAL = 0x10930013; // Disable reporting of Galileo satellites +const uint32_t UBLOX_CFG_NMEA_FILT_QZSS = 0x10930015; // Disable reporting of QZSS satellites +const uint32_t UBLOX_CFG_NMEA_FILT_GLO = 0x10930016; // Disable reporting of GLONASS satellites +const uint32_t UBLOX_CFG_NMEA_FILT_BDS = 0x10930017; // Disable reporting of BeiDou satellites +const uint32_t UBLOX_CFG_NMEA_OUT_INVFIX = 0x10930021; // Enable position output for failed or invalid fixes +const uint32_t UBLOX_CFG_NMEA_OUT_MSKFIX = 0x10930022; // Enable position output for invalid fixes +const uint32_t UBLOX_CFG_NMEA_OUT_INVTIME = 0x10930023; // Enable time output for invalid times +const uint32_t UBLOX_CFG_NMEA_OUT_INVDATE = 0x10930024; // Enable date output for invalid dates +const uint32_t UBLOX_CFG_NMEA_OUT_ONLYGPS = 0x10930025; // Restrict output to GPS satellites only +const uint32_t UBLOX_CFG_NMEA_OUT_FROZENCOG = 0x10930026; // Enable course over ground output even if it is frozen +const uint32_t UBLOX_CFG_NMEA_MAINTALKERID = 0x20930031; // Main Talker ID +const uint32_t UBLOX_CFG_NMEA_GSVTALKERID = 0x20930032; // Talker ID for GSV NMEA messages +const uint32_t UBLOX_CFG_NMEA_BDSTALKERID = 0x30930033; // BeiDou Talker ID + +//CFG-ODO: Odometer and low-speed course over ground filter +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_ODO_USE_ODO = 0x10220001; // Use odometer +const uint32_t UBLOX_CFG_ODO_USE_COG = 0x10220002; // Use low-speed course over ground filter +const uint32_t UBLOX_CFG_ODO_OUTLPVEL = 0x10220003; // Output low-pass filtered velocity +const uint32_t UBLOX_CFG_ODO_OUTLPCOG = 0x10220004; // Output low-pass filtered course over ground (heading) +const uint32_t UBLOX_CFG_ODO_PROFILE = 0x20220005; // Odometer profile configuration +const uint32_t UBLOX_CFG_ODO_COGMAXSPEED = 0x20220021; // Upper speed limit for low-speed course over ground filter +const uint32_t UBLOX_CFG_ODO_COGMAXPOSACC = 0x20220022; // Maximum acceptable position accuracy for computing low-speed filtered course over ground +const uint32_t UBLOX_CFG_ODO_VELLPGAIN = 0x20220031; // Velocity low-pass filter level +const uint32_t UBLOX_CFG_ODO_COGLPGAIN = 0x20220032; // Course over ground low-pass filter level (at speed < 8 m/s) + +//CFG-QZSS: QZSS system configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_QZSS_USE_SLAS_DGNSS = 0x10370005; // Apply QZSS SLAS DGNSS corrections +const uint32_t UBLOX_CFG_QZSS_USE_SLAS_TESTMODE = 0x10370006; // Use QZSS SLAS data when it is in test mode (SLAS msg 0) +const uint32_t UBLOX_CFG_QZSS_USE_SLAS_RAIM_UNCORR = 0x10370007; // Raim out measurements that are not corrected by QZSS SLAS, if at least 5 measurements are corrected + +//CFG-RATE: Navigation and measurement rate configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_RATE_MEAS = 0x30210001; // Nominal time between GNSS measurements +const uint32_t UBLOX_CFG_RATE_NAV = 0x30210002; // Ratio of number of measurements to number of navigation solutions +const uint32_t UBLOX_CFG_RATE_TIMEREF = 0x20210003; // Time system to which measurements are aligned + +//CFG-RINV: Remote inventory +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_RINV_DUMP = 0x10c70001; // Dump data at startup +const uint32_t UBLOX_CFG_RINV_BINARY = 0x10c70002; // Data is binary +const uint32_t UBLOX_CFG_RINV_DATA_SIZE = 0x20c70003; // Size of data +const uint32_t UBLOX_CFG_RINV_CHUNK0 = 0x50c70004; // Data bytes 1-8 (LSB) +const uint32_t UBLOX_CFG_RINV_CHUNK1 = 0x50c70005; // Data bytes 9-16 +const uint32_t UBLOX_CFG_RINV_CHUNK2 = 0x50c70006; // Data bytes 17-240x44434241. +const uint32_t UBLOX_CFG_RINV_CHUNK3 = 0x50c70007; // Data bytes 25-30 (MSB) + +//CFG-RTCM: RTCM protocol configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_RTCM_DF003_OUT = 0x30090001; // RTCM DF003 (Reference station ID) output value +const uint32_t UBLOX_CFG_RTCM_DF003_IN = 0x30090008; // RTCM DF003 (Reference station ID) input value +const uint32_t UBLOX_CFG_RTCM_DF003_IN_FILTER = 0x20090009; // RTCM input filter configuration based on RTCM DF003 (Reference station ID) value + +//CFG-SBAS: SBAS configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_SBAS_USE_TESTMODE = 0x10360002; // Use SBAS data when it is in test mode (SBAS msg 0) +const uint32_t UBLOX_CFG_SBAS_USE_RANGING = 0x10360003; // Use SBAS GEOs as a ranging source (for navigation) +const uint32_t UBLOX_CFG_SBAS_USE_DIFFCORR = 0x10360004; // Use SBAS diīŦ€erential corrections +const uint32_t UBLOX_CFG_SBAS_USE_INTEGRITY = 0x10360005; // Use SBAS integrity information +const uint32_t UBLOX_CFG_SBAS_PRNSCANMASK = 0x50360006; // SBAS PRN search configuration + +//CFG-SIGNAL: Satellite systems (GNSS) signal configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_SIGNAL_GPS_ENA = 0x1031001f; // GPS enable +const uint32_t UBLOX_CFG_SIGNAL_GPS_L1CA_ENA = 0x10310001; // GPS L1C/A +const uint32_t UBLOX_CFG_SIGNAL_GPS_L2C_ENA = 0x10310003; // GPS L2C (only on u-blox F9 platform products) +const uint32_t UBLOX_CFG_SIGNAL_SBAS_ENA = 0x10310020; // SBAS enable +const uint32_t UBLOX_CFG_SIGNAL_SBAS_L1CA_ENA = 0x10310005; // SBAS L1C/A +const uint32_t UBLOX_CFG_SIGNAL_GAL_ENA = 0x10310021; // Galileo enable +const uint32_t UBLOX_CFG_SIGNAL_GAL_E1_ENA = 0x10310007; // Galileo E1 +const uint32_t UBLOX_CFG_SIGNAL_GAL_E5B_ENA = 0x1031000a; // Galileo E5b (only on u-blox F9 platform products) +const uint32_t UBLOX_CFG_SIGNAL_BDS_ENA = 0x10310022; // BeiDou Enable +const uint32_t UBLOX_CFG_SIGNAL_BDS_B1_ENA = 0x1031000d; // BeiDou B1I +const uint32_t UBLOX_CFG_SIGNAL_BDS_B2_ENA = 0x1031000e; // BeiDou B2I (only on u-blox F9 platform products) +const uint32_t UBLOX_CFG_SIGNAL_QZSS_ENA = 0x10310024; // QZSS enable +const uint32_t UBLOX_CFG_SIGNAL_QZSS_L1CA_ENA = 0x10310012; // QZSS L1C/A +const uint32_t UBLOX_CFG_SIGNAL_QZSS_L1S_ENA = 0x10310014; // QZSS L1S +const uint32_t UBLOX_CFG_SIGNAL_QZSS_L2C_ENA = 0x10310015; // QZSS L2C (only on u-blox F9 platform products) +const uint32_t UBLOX_CFG_SIGNAL_GLO_ENA = 0x10310025; // GLONASS enable +const uint32_t UBLOX_CFG_SIGNAL_GLO_L1_ENA = 0x10310018; // GLONASS L1 +const uint32_t UBLOX_CFG_SIGNAL_GLO_L2_ENA = 0x1031001a; // GLONASS L2 (only on u-blox F9 platform products) + +//CFG-SPI: Configuration of the SPI interface +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_SPI_MAXFF = 0x20640001; // Number of bytes containing 0xFF to receive before switching oīŦ€ reception. Range: 0 (mechanism oīŦ€) - 63 +const uint32_t UBLOX_CFG_SPI_CPOLARITY = 0x10640002; // Clock polarity select: 0: Active Hight Clock, SCLK idles low, 1: Active Low Clock, SCLK idles high +const uint32_t UBLOX_CFG_SPI_CPHASE = 0x10640003; // Clock phase select: 0: Data captured on first edge of SCLK, 1: Data captured on second edge of SCLK +const uint32_t UBLOX_CFG_SPI_EXTENDEDTIMEOUT = 0x10640005; // Flag to disable timeouting the interface after 1.5s +const uint32_t UBLOX_CFG_SPI_ENABLED = 0x10640006; // Flag to indicate if the SPI interface should be enabled + +//CFG-SPIINPROT: Input protocol configuration of the SPI interface +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_SPIINPROT_UBX = 0x10790001; // Flag to indicate if UBX should be an input protocol on SPI +const uint32_t UBLOX_CFG_SPIINPROT_NMEA = 0x10790002; // Flag to indicate if NMEA should be an input protocol on SPI +const uint32_t UBLOX_CFG_SPIINPROT_RTCM3X = 0x10790004; // Flag to indicate if RTCM3X should be an input protocol on SPI + +//CFG-SPIOUTPROT: Output protocol configuration of the SPI interface +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_SPIOUTPROT_UBX = 0x107a0001; // Flag to indicate if UBX should be an output protocol on SPI +const uint32_t UBLOX_CFG_SPIOUTPROT_NMEA = 0x107a0002; // Flag to indicate if NMEA should be an output protocol on SPI +const uint32_t UBLOX_CFG_SPIOUTPROT_RTCM3X = 0x107a0004; // Flag to indicate if RTCM3X should be an output protocol on SPI + +//CFG-TMODE: Time mode configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_TMODE_MODE = 0x20030001; // Receiver mode +const uint32_t UBLOX_CFG_TMODE_POS_TYPE = 0x20030002; // Determines whether the ARP position is given in ECEF or LAT/LON/HEIGHT? +const uint32_t UBLOX_CFG_TMODE_ECEF_X = 0x40030003; // ECEF X coordinate of the ARP position. +const uint32_t UBLOX_CFG_TMODE_ECEF_Y = 0x40030004; // ECEF Y coordinate of the ARP position. +const uint32_t UBLOX_CFG_TMODE_ECEF_Z = 0x40030005; // ECEF Z coordinate of the ARP position. +const uint32_t UBLOX_CFG_TMODE_ECEF_X_HP = 0x20030006; // High-precision ECEF X coordinate of the ARP position. +const uint32_t UBLOX_CFG_TMODE_ECEF_Y_HP = 0x20030007; // High-precision ECEF Y coordinate of the ARP position. +const uint32_t UBLOX_CFG_TMODE_ECEF_Z_HP = 0x20030008; // High-precision ECEF Z coordinate of the ARP position. +const uint32_t UBLOX_CFG_TMODE_LAT = 0x40030009; // Latitude of the ARP position. +const uint32_t UBLOX_CFG_TMODE_LON = 0x4003000a; // Longitude of the ARP position. +const uint32_t UBLOX_CFG_TMODE_HEIGHT = 0x4003000b; // Height of the ARP position. +const uint32_t UBLOX_CFG_TMODE_LAT_HP = 0x2003000c; // High-precision latitude of the ARP position +const uint32_t UBLOX_CFG_TMODE_LON_HP = 0x2003000d; // High-precision longitude of the ARP position. +const uint32_t UBLOX_CFG_TMODE_HEIGHT_HP = 0x2003000e; // High-precision height of the ARP position. +const uint32_t UBLOX_CFG_TMODE_FIXED_POS_ACC = 0x4003000f; // Fixed position 3D accuracy +const uint32_t UBLOX_CFG_TMODE_SVIN_MIN_DUR = 0x40030010; // Survey-in minimum duration +const uint32_t UBLOX_CFG_TMODE_SVIN_ACC_LIMIT = 0x40030011; // Survey-in position accuracy limit + +//CFG-TP: Timepulse configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_TP_PULSE_DEF = 0x20050023; // Determines whether the time pulse is interpreted as frequency or period +const uint32_t UBLOX_CFG_TP_PULSE_LENGTH_DEF = 0x20050030; // Determines whether the time pulse length is interpreted as length[us] or pulse ratio[%] +const uint32_t UBLOX_CFG_TP_FREQ_TP1 = 0x40050024; // Time pulse frequency (TP1) +const uint32_t UBLOX_CFG_TP_FREQ_LOCK_TP1 = 0x40050025; // Time pulse frequency when locked to GNSS time (TP1) +const uint32_t UBLOX_CFG_TP_LEN_TP1 = 0x40050004; // Time pulse length (TP1) +const uint32_t UBLOX_CFG_TP_LEN_LOCK_TP1 = 0x40050005; // Time pulse length when locked to GNSS time (TP1) +const uint32_t UBLOX_CFG_TP_DUTY_TP1 = 0x5005002a; // Time pulse duty cycle (TP1) +const uint32_t UBLOX_CFG_TP_DUTY_LOCK_TP1 = 0x5005002b; // Time pulse duty cycle when locked to GNSS time (TP1) +const uint32_t UBLOX_CFG_TP_USER_DELAY_TP1 = 0x40050006; // User-configurable time pulse delay (TP1) +const uint32_t UBLOX_CFG_TP_TP1_ENA = 0x10050007; // Enable the first timepulse +const uint32_t UBLOX_CFG_TP_SYNC_GNSS_TP1 = 0x10050008; // Sync time pulse to GNSS time or local clock (TP1) +const uint32_t UBLOX_CFG_TP_USE_LOCKED_TP1 = 0x10050009; // Use locked parameters when possible (TP1) +const uint32_t UBLOX_CFG_TP_ALIGN_TO_TOW_TP1 = 0x1005000a; // Align time pulse to top of second (TP1) +const uint32_t UBLOX_CFG_TP_POL_TP1 = 0x1005000b; // Set time pulse polarity (TP1) +const uint32_t UBLOX_CFG_TP_TIMEGRID_TP1 = 0x2005000c; // Time grid to use (TP1) + +//CFG-TXREADY: TX ready configuration +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_TXREADY_ENABLED = 0x10a20001; // Flag to indicate if TX ready pin mechanism should be enabled +const uint32_t UBLOX_CFG_TXREADY_POLARITY = 0x10a20002; // The polarity of the TX ready pin: false:high- active, true:low-active +const uint32_t UBLOX_CFG_TXREADY_PIN = 0x20a20003; // Pin number to use for the TX ready functionality +const uint32_t UBLOX_CFG_TXREADY_THRESHOLD = 0x30a20004; // Amount of data that should be ready on the interface before triggering the TX ready pin +const uint32_t UBLOX_CFG_TXREADY_INTERFACE = 0x20a20005; // Interface where the TX ready feature should be linked to + +//CFG-UART1: Configuration of the UART1 interface +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_UART1_BAUDRATE = 0x40520001; // The baud rate that should be configured on the UART1 +const uint32_t UBLOX_CFG_UART1_STOPBITS = 0x20520002; // Number of stopbits that should be used on UART1 +const uint32_t UBLOX_CFG_UART1_DATABITS = 0x20520003; // Number of databits that should be used on UART1 +const uint32_t UBLOX_CFG_UART1_PARITY = 0x20520004; // Parity mode that should be used on UART1 +const uint32_t UBLOX_CFG_UART1_ENABLED = 0x10520005; // Flag to indicate if the UART1 should be enabled + +//CFG-UART1INPROT: Input protocol configuration of the UART1 interface +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_UART1INPROT_UBX = 0x10730001; // Flag to indicate if UBX should be an input protocol on UART1 +const uint32_t UBLOX_CFG_UART1INPROT_NMEA = 0x10730002; // Flag to indicate if NMEA should be an input protocol on UART1 +const uint32_t UBLOX_CFG_UART1INPROT_RTCM3X = 0x10730004; // Flag to indicate if RTCM3X should be an input protocol on UART1 + +//CFG-UART1OUTPROT: Output protocol configuration of the UART1 interface +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_UART1OUTPROT_UBX = 0x10740001; // Flag to indicate if UBX should be an output protocol on UART1 +const uint32_t UBLOX_CFG_UART1OUTPROT_NMEA = 0x10740002; // Flag to indicate if NMEA should be an output protocol on UART1 +const uint32_t UBLOX_CFG_UART1OUTPROT_RTCM3X = 0x10740004; // Flag to indicate if RTCM3X should be an output protocol on UART1 + +//CFG-UART2: Configuration of the UART2 interface +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_UART2_BAUDRATE = 0x40530001; // The baud rate that should be configured on the UART2 +const uint32_t UBLOX_CFG_UART2_STOPBITS = 0x20530002; // Number of stopbits that should be used on UART2 +const uint32_t UBLOX_CFG_UART2_DATABITS = 0x20530003; // Number of databits that should be used on UART2 +const uint32_t UBLOX_CFG_UART2_PARITY = 0x20530004; // Parity mode that should be used on UART2 +const uint32_t UBLOX_CFG_UART2_ENABLED = 0x10530005; // Flag to indicate if the UART2 should be enabled +const uint32_t UBLOX_CFG_UART2_REMAP = 0x10530006; // UART2 Remapping + +//CFG-UART2INPROT: Input protocol configuration of the UART2 interface +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_UART2INPROT_UBX = 0x10750001; // Flag to indicate if UBX should be an input protocol on UART2 +const uint32_t UBLOX_CFG_UART2INPROT_NMEA = 0x10750002; // Flag to indicate if NMEA should be an input protocol on UART2 +const uint32_t UBLOX_CFG_UART2INPROT_RTCM3X = 0x10750004; // Flag to indicate if RTCM3X should be an input protocol on UART2 + +//CFG-UART2OUTPROT: Output protocol configuration of the UART2 interface +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_UART2OUTPROT_UBX = 0x10760001; // Flag to indicate if UBX should be an output protocol on UART2 +const uint32_t UBLOX_CFG_UART2OUTPROT_NMEA = 0x10760002; // Flag to indicate if NMEA should be an output protocol on UART2 +const uint32_t UBLOX_CFG_UART2OUTPROT_RTCM3X = 0x10760004; // Flag to indicate if RTCM3X should be an output protocol on UART2 + +//CFG-USB: Configuration of the USB interface +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_USB_ENABLED = 0x10650001; // Flag to indicate if the USB interface should be enabled +const uint32_t UBLOX_CFG_USB_SELFPOW = 0x10650002; // Self-powered device +const uint32_t UBLOX_CFG_USB_VENDOR_ID = 0x3065000a; // Vendor ID +const uint32_t UBLOX_CFG_USB_PRODUCT_ID = 0x3065000b; // Vendor ID +const uint32_t UBLOX_CFG_USB_POWER = 0x3065000c; // Power consumption +const uint32_t UBLOX_CFG_USB_VENDOR_STR0 = 0x5065000d; // Vendor string characters 0-7 +const uint32_t UBLOX_CFG_USB_VENDOR_STR1 = 0x5065000e; // Vendor string characters 8-15 +const uint32_t UBLOX_CFG_USB_VENDOR_STR2 = 0x5065000f; // Vendor string characters 16-23 +const uint32_t UBLOX_CFG_USB_VENDOR_STR3 = 0x50650010; // Vendor string characters 24-31 +const uint32_t UBLOX_CFG_USB_PRODUCT_STR0 = 0x50650011; // Product string characters 0-7 +const uint32_t UBLOX_CFG_USB_PRODUCT_STR1 = 0x50650012; // Product string characters 8-15 +const uint32_t UBLOX_CFG_USB_PRODUCT_STR2 = 0x50650013; // Product string characters 16-23 +const uint32_t UBLOX_CFG_USB_PRODUCT_STR3 = 0x50650014; // Product string characters 24-31 +const uint32_t UBLOX_CFG_USB_SERIAL_NO_STR0 = 0x50650015; // Serial number string characters 0-7 +const uint32_t UBLOX_CFG_USB_SERIAL_NO_STR1 = 0x50650016; // Serial number string characters 8-15 +const uint32_t UBLOX_CFG_USB_SERIAL_NO_STR2 = 0x50650017; // Serial number string characters 16-23 +const uint32_t UBLOX_CFG_USB_SERIAL_NO_STR3 = 0x50650018; // Serial number string characters 24-31 + +//CFG-USBINPROT: Input protocol configuration of the USB interface +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_USBINPROT_UBX = 0x10770001; // Flag to indicate if UBX should be an input protocol on USB +const uint32_t UBLOX_CFG_USBINPROT_NMEA = 0x10770002; // Flag to indicate if NMEA should be an input protocol on USB +const uint32_t UBLOX_CFG_USBINPROT_RTCM3X = 0x10770004; // Flag to indicate if RTCM3X should be an input protocol on USB + +//CFG-USBOUTPROT: Output protocol configuration of the USB interface +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const uint32_t UBLOX_CFG_USBOUTPROT_UBX = 0x10780001; // Flag to indicate if UBX should be an output protocol on USB +const uint32_t UBLOX_CFG_USBOUTPROT_NMEA = 0x10780002; // Flag to indicate if NMEA should be an output protocol on USB +const uint32_t UBLOX_CFG_USBOUTPROT_RTCM3X = 0x10780004; // Flag to indicate if RTCM3X should be an output protocol on USB + +#endif diff --git a/lib/axp192/axp20x.cpp b/lib/axp192/axp20x.cpp new file mode 100644 index 0000000..baf9253 --- /dev/null +++ b/lib/axp192/axp20x.cpp @@ -0,0 +1,1809 @@ +///////////////////////////////////////////////////////////////// +/* +MIT License + +Copyright (c) 2019 lewis he + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +axp20x.cpp - Arduino library for X-Power AXP202 chip. +Created by Lewis he on April 1, 2019. +github:https://github.com/lewisxhe/AXP202X_Libraries +*/ +///////////////////////////////////////////////////////////////// + +#include "axp20x.h" +#include + +const uint8_t AXP20X_Class::startupParams[] = { + 0b00000000, + 0b01000000, + 0b10000000, + 0b11000000 +}; + +const uint8_t AXP20X_Class::longPressParams[] = { + 0b00000000, + 0b00010000, + 0b00100000, + 0b00110000 +}; + +const uint8_t AXP20X_Class::shutdownParams[] = { + 0b00000000, + 0b00000001, + 0b00000010, + 0b00000011 +}; + +const uint8_t AXP20X_Class::targetVolParams[] = { + 0b00000000, + 0b00100000, + 0b01000000, + 0b01100000 +}; + + + +// Power Output Control register +uint8_t AXP20X_Class::_outputReg; + +int AXP20X_Class::_axp_probe() +{ + uint8_t data; + if (_isAxp173) { + //!Axp173 does not have a chip ID, read the status register to see if it reads normally + _readByte(0x01, 1, &data); + if (data == 0 || data == 0xFF) { + return AXP_FAIL; + } + _chip_id = AXP173_CHIP_ID; + _readByte(AXP202_LDO234_DC23_CTL, 1, &_outputReg); + AXP_DEBUG("OUTPUT Register 0x%x\n", _outputReg); + _init = true; + return AXP_PASS; + } + _readByte(AXP202_IC_TYPE, 1, &_chip_id); + AXP_DEBUG("chip id detect 0x%x\n", _chip_id); + if (_chip_id == AXP202_CHIP_ID || _chip_id == AXP192_CHIP_ID) { + AXP_DEBUG("Detect CHIP :%s\n", _chip_id == AXP202_CHIP_ID ? "AXP202" : "AXP192"); + _readByte(AXP202_LDO234_DC23_CTL, 1, &_outputReg); + AXP_DEBUG("OUTPUT Register 0x%x\n", _outputReg); + _init = true; + return AXP_PASS; + } + return AXP_FAIL; +} + +int AXP20X_Class::begin(TwoWire &port, uint8_t addr, bool isAxp173) +{ + _i2cPort = &port; //Grab which port the user wants us to use + _address = addr; + _isAxp173 = isAxp173; + + return _axp_probe(); +} + +int AXP20X_Class::begin(axp_com_fptr_t read_cb, axp_com_fptr_t write_cb, uint8_t addr, bool isAxp173) +{ + if (read_cb == nullptr || write_cb == nullptr)return AXP_FAIL; + _read_cb = read_cb; + _write_cb = write_cb; + _address = addr; + _isAxp173 = isAxp173; + return _axp_probe(); +} + +//Only axp192 chip +bool AXP20X_Class::isDCDC1Enable() +{ + if (_chip_id == AXP192_CHIP_ID) + return IS_OPEN(_outputReg, AXP192_DCDC1); + else if (_chip_id == AXP173_CHIP_ID) + return IS_OPEN(_outputReg, AXP173_DCDC1); + return false; +} + +bool AXP20X_Class::isExtenEnable() +{ + if (_chip_id == AXP192_CHIP_ID) + return IS_OPEN(_outputReg, AXP192_EXTEN); + else if (_chip_id == AXP202_CHIP_ID) + return IS_OPEN(_outputReg, AXP202_EXTEN); + else if (_chip_id == AXP173_CHIP_ID) { + uint8_t data; + _readByte(AXP173_EXTEN_DC2_CTL, 1, &data); + return IS_OPEN(data, AXP173_CTL_EXTEN_BIT); + } + return false; +} + +bool AXP20X_Class::isLDO2Enable() +{ + if (_chip_id == AXP173_CHIP_ID) { + return IS_OPEN(_outputReg, AXP173_LDO2); + } + //axp192 same axp202 ldo2 bit + return IS_OPEN(_outputReg, AXP202_LDO2); +} + +bool AXP20X_Class::isLDO3Enable() +{ + if (_chip_id == AXP192_CHIP_ID) + return IS_OPEN(_outputReg, AXP192_LDO3); + else if (_chip_id == AXP202_CHIP_ID) + return IS_OPEN(_outputReg, AXP202_LDO3); + else if (_chip_id == AXP173_CHIP_ID) + return IS_OPEN(_outputReg, AXP173_LDO3); + return false; +} + +bool AXP20X_Class::isLDO4Enable() +{ + if (_chip_id == AXP202_CHIP_ID) + return IS_OPEN(_outputReg, AXP202_LDO4); + if (_chip_id == AXP173_CHIP_ID) + return IS_OPEN(_outputReg, AXP173_LDO4); + return false; +} + +bool AXP20X_Class::isDCDC2Enable() +{ + if (_chip_id == AXP173_CHIP_ID) { + uint8_t data; + _readByte(AXP173_EXTEN_DC2_CTL, 1, &data); + return IS_OPEN(data, AXP173_CTL_DC2_BIT); + } + //axp192 same axp202 dc2 bit + return IS_OPEN(_outputReg, AXP202_DCDC2); +} + +bool AXP20X_Class::isDCDC3Enable() +{ + if (_chip_id == AXP173_CHIP_ID) + return false; + //axp192 same axp202 dc3 bit + return IS_OPEN(_outputReg, AXP202_DCDC3); +} + +int AXP20X_Class::setPowerOutPut(uint8_t ch, bool en) +{ + uint8_t data; + uint8_t val = 0; + if (!_init) + return AXP_NOT_INIT; + + //! Axp173 cannot use the REG12H register to control + //! DC2 and EXTEN. It is necessary to control REG10H separately. + if (_chip_id == AXP173_CHIP_ID) { + _readByte(AXP173_EXTEN_DC2_CTL, 1, &data); + if (ch & AXP173_DCDC2) { + data = en ? data | BIT_MASK(AXP173_CTL_DC2_BIT) : data & (~BIT_MASK(AXP173_CTL_DC2_BIT)); + ch &= (~BIT_MASK(AXP173_DCDC2)); + _writeByte(AXP173_EXTEN_DC2_CTL, 1, &data); + } else if (ch & AXP173_EXTEN) { + data = en ? data | BIT_MASK(AXP173_CTL_EXTEN_BIT) : data & (~BIT_MASK(AXP173_CTL_EXTEN_BIT)); + ch &= (~BIT_MASK(AXP173_EXTEN)); + _writeByte(AXP173_EXTEN_DC2_CTL, 1, &data); + } + } + + _readByte(AXP202_LDO234_DC23_CTL, 1, &data); + if (en) { + data |= (1 << ch); + } else { + data &= (~(1 << ch)); + } + + if (_chip_id == AXP202_CHIP_ID) { + FORCED_OPEN_DCDC3(data); //! Must be forced open in T-Watch + } + + _writeByte(AXP202_LDO234_DC23_CTL, 1, &data); + delay(1); + _readByte(AXP202_LDO234_DC23_CTL, 1, &val); + if (data == val) { + _outputReg = val; + return AXP_PASS; + } + return AXP_FAIL; +} + +bool AXP20X_Class::isChargeing() +{ + uint8_t reg; + if (!_init) + return AXP_NOT_INIT; + _readByte(AXP202_MODE_CHGSTATUS, 1, ®); + return IS_OPEN(reg, 6); +} + +bool AXP20X_Class::isBatteryConnect() +{ + uint8_t reg; + if (!_init) + return AXP_NOT_INIT; + _readByte(AXP202_MODE_CHGSTATUS, 1, ®); + return IS_OPEN(reg, 5); +} + +float AXP20X_Class::getAcinVoltage() +{ + if (!_init) + return AXP_NOT_INIT; + return _getRegistResult(AXP202_ACIN_VOL_H8, AXP202_ACIN_VOL_L4) * AXP202_ACIN_VOLTAGE_STEP; +} + +float AXP20X_Class::getAcinCurrent() +{ + if (!_init) + return AXP_NOT_INIT; + return _getRegistResult(AXP202_ACIN_CUR_H8, AXP202_ACIN_CUR_L4) * AXP202_ACIN_CUR_STEP; +} + +float AXP20X_Class::getVbusVoltage() +{ + if (!_init) + return AXP_NOT_INIT; + return _getRegistResult(AXP202_VBUS_VOL_H8, AXP202_VBUS_VOL_L4) * AXP202_VBUS_VOLTAGE_STEP; +} + +float AXP20X_Class::getVbusCurrent() +{ + if (!_init) + return AXP_NOT_INIT; + return _getRegistResult(AXP202_VBUS_CUR_H8, AXP202_VBUS_CUR_L4) * AXP202_VBUS_CUR_STEP; +} + +float AXP20X_Class::getTemp() +{ + if (!_init) + return AXP_NOT_INIT; + return _getRegistResult(AXP202_INTERNAL_TEMP_H8, AXP202_INTERNAL_TEMP_L4) * AXP202_INTERNAL_TEMP_STEP; +} + +float AXP20X_Class::getTSTemp() +{ + if (!_init) + return AXP_NOT_INIT; + return _getRegistResult(AXP202_TS_IN_H8, AXP202_TS_IN_L4) * AXP202_TS_PIN_OUT_STEP; +} + +float AXP20X_Class::getGPIO0Voltage() +{ + if (!_init) + return AXP_NOT_INIT; + return _getRegistResult(AXP202_GPIO0_VOL_ADC_H8, AXP202_GPIO0_VOL_ADC_L4) * AXP202_GPIO0_STEP; +} + +float AXP20X_Class::getGPIO1Voltage() +{ + if (!_init) + return AXP_NOT_INIT; + return _getRegistResult(AXP202_GPIO1_VOL_ADC_H8, AXP202_GPIO1_VOL_ADC_L4) * AXP202_GPIO1_STEP; +} + +/* +Note: the battery power formula: +Pbat =2* register value * Voltage LSB * Current LSB / 1000. +(Voltage LSB is 1.1mV; Current LSB is 0.5mA, and unit of calculation result is mW.) +*/ +float AXP20X_Class::getBattInpower() +{ + float rslt; + uint8_t hv, mv, lv; + if (!_init) + return AXP_NOT_INIT; + _readByte(AXP202_BAT_POWERH8, 1, &hv); + _readByte(AXP202_BAT_POWERM8, 1, &mv); + _readByte(AXP202_BAT_POWERL8, 1, &lv); + rslt = (hv << 16) | (mv << 8) | lv; + rslt = 2 * rslt * 1.1 * 0.5 / 1000; + return rslt; +} + +float AXP20X_Class::getBattVoltage() +{ + if (!_init) + return AXP_NOT_INIT; + return _getRegistResult(AXP202_BAT_AVERVOL_H8, AXP202_BAT_AVERVOL_L4) * AXP202_BATT_VOLTAGE_STEP; +} + +float AXP20X_Class::getBattChargeCurrent() +{ + if (!_init) + return AXP_NOT_INIT; + switch (_chip_id) { + case AXP202_CHIP_ID: + return _getRegistResult(AXP202_BAT_AVERCHGCUR_H8, AXP202_BAT_AVERCHGCUR_L4) * AXP202_BATT_CHARGE_CUR_STEP; + case AXP192_CHIP_ID: + return _getRegistH8L5(AXP202_BAT_AVERCHGCUR_H8, AXP202_BAT_AVERCHGCUR_L5) * AXP202_BATT_CHARGE_CUR_STEP; + default: + return AXP_FAIL; + } +} + +float AXP20X_Class::getBattDischargeCurrent() +{ + if (!_init) + return AXP_NOT_INIT; + return _getRegistH8L5(AXP202_BAT_AVERDISCHGCUR_H8, AXP202_BAT_AVERDISCHGCUR_L5) * AXP202_BATT_DISCHARGE_CUR_STEP; +} + +float AXP20X_Class::getSysIPSOUTVoltage() +{ + if (!_init) + return AXP_NOT_INIT; + return _getRegistResult(AXP202_APS_AVERVOL_H8, AXP202_APS_AVERVOL_L4); +} + +/* +Coulomb calculation formula: +C= 65536 * current LSB *īŧˆcharge coulomb counter value - discharge coulomb counter valueīŧ‰ / +3600 / ADC sample rate. Refer to REG84H setting for ADC sample rateīŧ›the current LSB is +0.5mAīŧ›unit of the calculation result is mAh. īŧ‰ +*/ +uint32_t AXP20X_Class::getBattChargeCoulomb() +{ + uint8_t buffer[4]; + if (!_init) + return AXP_NOT_INIT; + _readByte(0xB0, 4, buffer); + return (buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3]; +} + +uint32_t AXP20X_Class::getBattDischargeCoulomb() +{ + uint8_t buffer[4]; + if (!_init) + return AXP_NOT_INIT; + _readByte(0xB4, 4, buffer); + return (buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3]; +} + +float AXP20X_Class::getCoulombData() +{ + if (!_init) + return AXP_NOT_INIT; + uint32_t charge = getBattChargeCoulomb(), discharge = getBattDischargeCoulomb(); + uint8_t rate = getAdcSamplingRate(); + float result = 65536.0 * 0.5 * (charge - discharge) / 3600.0 / rate; + return result; +} + + +//------------------------------------------------------- +// New Coulomb functions by MrFlexi +//------------------------------------------------------- + +uint8_t AXP20X_Class::getCoulombRegister() +{ + uint8_t buffer; + if (!_init) + return AXP_NOT_INIT; + _readByte(AXP202_COULOMB_CTL, 1, &buffer); + return buffer; +} + + +int AXP20X_Class::setCoulombRegister(uint8_t val) +{ + if (!_init) + return AXP_NOT_INIT; + _writeByte(AXP202_COULOMB_CTL, 1, &val); + return AXP_PASS; +} + + +int AXP20X_Class::EnableCoulombcounter(void) +{ + + if (!_init) + return AXP_NOT_INIT; + uint8_t val = 0x80; + _writeByte(AXP202_COULOMB_CTL, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::DisableCoulombcounter(void) +{ + + if (!_init) + return AXP_NOT_INIT; + uint8_t val = 0x00; + _writeByte(AXP202_COULOMB_CTL, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::StopCoulombcounter(void) +{ + + if (!_init) + return AXP_NOT_INIT; + uint8_t val = 0xB8; + _writeByte(AXP202_COULOMB_CTL, 1, &val); + return AXP_PASS; +} + + +int AXP20X_Class::ClearCoulombcounter(void) +{ + + if (!_init) + return AXP_NOT_INIT; + uint8_t val = 0xA0; + _writeByte(AXP202_COULOMB_CTL, 1, &val); + return AXP_PASS; +} + +//------------------------------------------------------- +// END +//------------------------------------------------------- + + + +uint8_t AXP20X_Class::getAdcSamplingRate() +{ + //axp192 same axp202 aregister address 0x84 + if (!_init) + return AXP_NOT_INIT; + uint8_t val; + _readByte(AXP202_ADC_SPEED, 1, &val); + return 25 * (int)pow(2, (val & 0xC0) >> 6); +} + +int AXP20X_Class::setAdcSamplingRate(axp_adc_sampling_rate_t rate) +{ + //axp192 same axp202 aregister address 0x84 + if (!_init) + return AXP_NOT_INIT; + if (rate > AXP_ADC_SAMPLING_RATE_200HZ) + return AXP_FAIL; + uint8_t val; + _readByte(AXP202_ADC_SPEED, 1, &val); + uint8_t rw = rate; + val &= 0x3F; + val |= (rw << 6); + _writeByte(AXP202_ADC_SPEED, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::setTSfunction(axp_ts_pin_function_t func) +{ + //axp192 same axp202 aregister address 0x84 + if (!_init) + return AXP_NOT_INIT; + if (func > AXP_TS_PIN_FUNCTION_ADC) + return AXP_FAIL; + uint8_t val; + _readByte(AXP202_ADC_SPEED, 1, &val); + uint8_t rw = func; + val &= 0xFA; + val |= (rw << 2); + _writeByte(AXP202_ADC_SPEED, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::setTScurrent(axp_ts_pin_current_t current) +{ + //axp192 same axp202 aregister address 0x84 + if (!_init) + return AXP_NOT_INIT; + if (current > AXP_TS_PIN_CURRENT_80UA) + return AXP_FAIL; + uint8_t val; + _readByte(AXP202_ADC_SPEED, 1, &val); + uint8_t rw = current; + val &= 0xCF; + val |= (rw << 4); + _writeByte(AXP202_ADC_SPEED, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::setTSmode(axp_ts_pin_mode_t mode) +{ + //axp192 same axp202 aregister address 0x84 + if (!_init) + return AXP_NOT_INIT; + if (mode > AXP_TS_PIN_MODE_ENABLE) + return AXP_FAIL; + uint8_t val; + _readByte(AXP202_ADC_SPEED, 1, &val); + uint8_t rw = mode; + val &= 0xFC; + val |= rw; + _writeByte(AXP202_ADC_SPEED, 1, &val); + + // TS pin ADC function enable/disable + if (mode == AXP_TS_PIN_MODE_DISABLE) + adc1Enable(AXP202_TS_PIN_ADC1, false); + else + adc1Enable(AXP202_TS_PIN_ADC1, true); + return AXP_PASS; +} + +int AXP20X_Class::adc1Enable(uint16_t params, bool en) +{ + if (!_init) + return AXP_NOT_INIT; + uint8_t val; + _readByte(AXP202_ADC_EN1, 1, &val); + if (en) + val |= params; + else + val &= ~(params); + _writeByte(AXP202_ADC_EN1, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::adc2Enable(uint16_t params, bool en) +{ + if (!_init) + return AXP_NOT_INIT; + uint8_t val; + _readByte(AXP202_ADC_EN2, 1, &val); + if (en) + val |= params; + else + val &= ~(params); + _writeByte(AXP202_ADC_EN2, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::enableIRQ(uint64_t params, bool en) +{ + if (!_init) + return AXP_NOT_INIT; + uint8_t val, val1; + if (params & 0xFF) { + val1 = params & 0xFF; + _readByte(AXP202_INTEN1, 1, &val); + if (en) + val |= val1; + else + val &= ~(val1); + AXP_DEBUG("%s [0x%x]val:0x%x\n", en ? "enable" : "disable", AXP202_INTEN1, val); + _writeByte(AXP202_INTEN1, 1, &val); + } + if (params & 0xFF00) { + val1 = params >> 8; + _readByte(AXP202_INTEN2, 1, &val); + if (en) + val |= val1; + else + val &= ~(val1); + AXP_DEBUG("%s [0x%x]val:0x%x\n", en ? "enable" : "disable", AXP202_INTEN2, val); + _writeByte(AXP202_INTEN2, 1, &val); + } + + if (params & 0xFF0000) { + val1 = params >> 16; + _readByte(AXP202_INTEN3, 1, &val); + if (en) + val |= val1; + else + val &= ~(val1); + AXP_DEBUG("%s [0x%x]val:0x%x\n", en ? "enable" : "disable", AXP202_INTEN3, val); + _writeByte(AXP202_INTEN3, 1, &val); + } + + if (params & 0xFF000000) { + val1 = params >> 24; + _readByte(AXP202_INTEN4, 1, &val); + if (en) + val |= val1; + else + val &= ~(val1); + AXP_DEBUG("%s [0x%x]val:0x%x\n", en ? "enable" : "disable", AXP202_INTEN4, val); + _writeByte(AXP202_INTEN4, 1, &val); + } + + if (params & 0xFF00000000) { + val1 = params >> 32; + _readByte(AXP202_INTEN5, 1, &val); + if (en) + val |= val1; + else + val &= ~(val1); + AXP_DEBUG("%s [0x%x]val:0x%x\n", en ? "enable" : "disable", AXP202_INTEN5, val); + _writeByte(AXP202_INTEN5, 1, &val); + } + return AXP_PASS; +} + +int AXP20X_Class::readIRQ() +{ + if (!_init) + return AXP_NOT_INIT; + switch (_chip_id) { + case AXP192_CHIP_ID: + for (int i = 0; i < 4; ++i) { + _readByte(AXP192_INTSTS1 + i, 1, &_irq[i]); + } + _readByte(AXP192_INTSTS5, 1, &_irq[4]); + return AXP_PASS; + + case AXP202_CHIP_ID: + for (int i = 0; i < 5; ++i) { + _readByte(AXP202_INTSTS1 + i, 1, &_irq[i]); + } + return AXP_PASS; + default: + return AXP_FAIL; + } +} + +void AXP20X_Class::clearIRQ() +{ + uint8_t val = 0xFF; + switch (_chip_id) { + case AXP192_CHIP_ID: + for (int i = 0; i < 3; i++) { + _writeByte(AXP192_INTSTS1 + i, 1, &val); + } + _writeByte(AXP192_INTSTS5, 1, &val); + break; + case AXP202_CHIP_ID: + for (int i = 0; i < 5; i++) { + _writeByte(AXP202_INTSTS1 + i, 1, &val); + } + break; + default: + break; + } + memset(_irq, 0, sizeof(_irq)); +} + +bool AXP20X_Class::isAcinOverVoltageIRQ() +{ + return (bool)(_irq[0] & BIT_MASK(7)); +} + +bool AXP20X_Class::isAcinPlugInIRQ() +{ + return (bool)(_irq[0] & BIT_MASK(6)); +} + +bool AXP20X_Class::isAcinRemoveIRQ() +{ + return (bool)(_irq[0] & BIT_MASK(5)); +} + +bool AXP20X_Class::isVbusOverVoltageIRQ() +{ + return (bool)(_irq[0] & BIT_MASK(4)); +} + +bool AXP20X_Class::isVbusPlugInIRQ() +{ + return (bool)(_irq[0] & BIT_MASK(3)); +} + +bool AXP20X_Class::isVbusRemoveIRQ() +{ + return (bool)(_irq[0] & BIT_MASK(2)); +} + +bool AXP20X_Class::isVbusLowVHOLDIRQ() +{ + return (bool)(_irq[0] & BIT_MASK(1)); +} + +bool AXP20X_Class::isBattPlugInIRQ() +{ + return (bool)(_irq[1] & BIT_MASK(7)); +} +bool AXP20X_Class::isBattRemoveIRQ() +{ + return (bool)(_irq[1] & BIT_MASK(6)); +} +bool AXP20X_Class::isBattEnterActivateIRQ() +{ + return (bool)(_irq[1] & BIT_MASK(5)); +} +bool AXP20X_Class::isBattExitActivateIRQ() +{ + return (bool)(_irq[1] & BIT_MASK(4)); +} +bool AXP20X_Class::isChargingIRQ() +{ + return (bool)(_irq[1] & BIT_MASK(3)); +} +bool AXP20X_Class::isChargingDoneIRQ() +{ + return (bool)(_irq[1] & BIT_MASK(2)); +} +bool AXP20X_Class::isBattTempLowIRQ() +{ + return (bool)(_irq[1] & BIT_MASK(1)); +} +bool AXP20X_Class::isBattTempHighIRQ() +{ + return (bool)(_irq[1] & BIT_MASK(0)); +} + +bool AXP20X_Class::isPEKShortPressIRQ() +{ + return (bool)(_irq[2] & BIT_MASK(1)); +} + +bool AXP20X_Class::isPEKLongtPressIRQ() +{ + return (bool)(_irq[2] & BIT_MASK(0)); +} + +bool AXP20X_Class::isTimerTimeoutIRQ() +{ + return (bool)(_irq[4] & BIT_MASK(7)); +} + +bool AXP20X_Class::isVBUSPlug() +{ + if (!_init) + return AXP_NOT_INIT; + uint8_t reg; + _readByte(AXP202_STATUS, 1, ®); + return IS_OPEN(reg, 5); +} + +int AXP20X_Class::setDCDC2Voltage(uint16_t mv) +{ + if (!_init) + return AXP_NOT_INIT; + if (mv < 700) { + AXP_DEBUG("DCDC2:Below settable voltage:700mV~2275mV"); + mv = 700; + } + if (mv > 2275) { + AXP_DEBUG("DCDC2:Above settable voltage:700mV~2275mV"); + mv = 2275; + } + uint8_t val = (mv - 700) / 25; + //! axp173/192/202 same register + _writeByte(AXP202_DC2OUT_VOL, 1, &val); + return AXP_PASS; +} + +uint16_t AXP20X_Class::getDCDC2Voltage() +{ + uint8_t val = 0; + //! axp173/192/202 same register + _readByte(AXP202_DC2OUT_VOL, 1, &val); + return val * 25 + 700; +} + +uint16_t AXP20X_Class::getDCDC3Voltage() +{ + if (!_init) + return 0; + if (_chip_id == AXP173_CHIP_ID)return AXP_NOT_SUPPORT; + uint8_t val = 0; + _readByte(AXP202_DC3OUT_VOL, 1, &val); + return val * 25 + 700; +} + +int AXP20X_Class::setDCDC3Voltage(uint16_t mv) +{ + if (!_init) + return AXP_NOT_INIT; + if (_chip_id == AXP173_CHIP_ID)return AXP_NOT_SUPPORT; + if (mv < 700) { + AXP_DEBUG("DCDC3:Below settable voltage:700mV~3500mV"); + mv = 700; + } + if (mv > 3500) { + AXP_DEBUG("DCDC3:Above settable voltage:700mV~3500mV"); + mv = 3500; + } + uint8_t val = (mv - 700) / 25; + _writeByte(AXP202_DC3OUT_VOL, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::setLDO2Voltage(uint16_t mv) +{ + uint8_t rVal, wVal; + if (!_init) + return AXP_NOT_INIT; + if (mv < 1800) { + AXP_DEBUG("LDO2:Below settable voltage:1800mV~3300mV"); + mv = 1800; + } + if (mv > 3300) { + AXP_DEBUG("LDO2:Above settable voltage:1800mV~3300mV"); + mv = 3300; + } + wVal = (mv - 1800) / 100; + if (_chip_id == AXP202_CHIP_ID) { + _readByte(AXP202_LDO24OUT_VOL, 1, &rVal); + rVal &= 0x0F; + rVal |= (wVal << 4); + _writeByte(AXP202_LDO24OUT_VOL, 1, &rVal); + return AXP_PASS; + } else if (_chip_id == AXP192_CHIP_ID || _chip_id == AXP173_CHIP_ID) { + _readByte(AXP192_LDO23OUT_VOL, 1, &rVal); + rVal &= 0x0F; + rVal |= (wVal << 4); + _writeByte(AXP192_LDO23OUT_VOL, 1, &rVal); + return AXP_PASS; + } + return AXP_FAIL; +} + +uint16_t AXP20X_Class::getLDO2Voltage() +{ + uint8_t rVal; + if (_chip_id == AXP202_CHIP_ID) { + _readByte(AXP202_LDO24OUT_VOL, 1, &rVal); + rVal &= 0xF0; + rVal >>= 4; + return rVal * 100 + 1800; + } else if (_chip_id == AXP192_CHIP_ID || _chip_id == AXP173_CHIP_ID ) { + _readByte(AXP192_LDO23OUT_VOL, 1, &rVal); + AXP_DEBUG("get result:%x\n", rVal); + rVal &= 0xF0; + rVal >>= 4; + return rVal * 100 + 1800; + } + return 0; +} + +int AXP20X_Class::setLDO3Voltage(uint16_t mv) +{ + uint8_t rVal; + if (!_init) + return AXP_NOT_INIT; + if (_chip_id == AXP202_CHIP_ID && mv < 700) { + AXP_DEBUG("LDO3:Below settable voltage:700mV~3500mV"); + mv = 700; + } else if (_chip_id == AXP192_CHIP_ID && mv < 1800) { + AXP_DEBUG("LDO3:Below settable voltage:1800mV~3300mV"); + mv = 1800; + } + + if (_chip_id == AXP202_CHIP_ID && mv > 3500) { + AXP_DEBUG("LDO3:Above settable voltage:700mV~3500mV"); + mv = 3500; + } else if (_chip_id == AXP192_CHIP_ID && mv > 3300) { + AXP_DEBUG("LDO3:Above settable voltage:1800mV~3300mV"); + mv = 3300; + } + + if (_chip_id == AXP202_CHIP_ID) { + _readByte(AXP202_LDO3OUT_VOL, 1, &rVal); + rVal &= 0x80; + rVal |= ((mv - 700) / 25); + _writeByte(AXP202_LDO3OUT_VOL, 1, &rVal); + return AXP_PASS; + } else if (_chip_id == AXP192_CHIP_ID || _chip_id == AXP173_CHIP_ID) { + _readByte(AXP192_LDO23OUT_VOL, 1, &rVal); + rVal &= 0xF0; + rVal |= ((mv - 1800) / 100); + _writeByte(AXP192_LDO23OUT_VOL, 1, &rVal); + return AXP_PASS; + } + return AXP_FAIL; +} + +uint16_t AXP20X_Class::getLDO3Voltage() +{ + uint8_t rVal; + if (!_init) + return AXP_NOT_INIT; + + if (_chip_id == AXP202_CHIP_ID) { + _readByte(AXP202_LDO3OUT_VOL, 1, &rVal); + if (rVal & 0x80) { + //! According to the hardware N_VBUSEN Pin selection + return getVbusVoltage() * 1000; + } else { + return (rVal & 0x7F) * 25 + 700; + } + } else if (_chip_id == AXP192_CHIP_ID || _chip_id == AXP173_CHIP_ID) { + _readByte(AXP192_LDO23OUT_VOL, 1, &rVal); + rVal &= 0x0F; + return rVal * 100 + 1800; + } + return 0; +} + +//! Only axp173 support +int AXP20X_Class::setLDO4Voltage(uint16_t mv) +{ + if (!_init) + return AXP_NOT_INIT; + if (_chip_id != AXP173_CHIP_ID) + return AXP_FAIL; + + if (mv < 700) { + AXP_DEBUG("LDO4:Below settable voltage:700mV~3500mV"); + mv = 700; + } + if (mv > 3500) { + AXP_DEBUG("LDO4:Above settable voltage:700mV~3500mV"); + mv = 3500; + } + uint8_t val = (mv - 700) / 25; + _writeByte(AXP173_LDO4_VLOTAGE, 1, &val); + return AXP_PASS; +} + +uint16_t AXP20X_Class::getLDO4Voltage() +{ + const uint16_t ldo4_table[] = {1250, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2500, 2700, 2800, 3000, 3100, 3200, 3300}; + if (!_init) + return 0; + uint8_t val = 0; + switch (_chip_id) { + case AXP173_CHIP_ID: + _readByte(AXP173_LDO4_VLOTAGE, 1, &val); + return val * 25 + 700; + case AXP202_CHIP_ID: + _readByte(AXP202_LDO24OUT_VOL, 1, &val); + val &= 0xF; + return ldo4_table[val]; + break; + case AXP192_CHIP_ID: + default: + break; + } + return 0; +} + + +//! Only axp202 support +int AXP20X_Class::setLDO4Voltage(axp_ldo4_table_t param) +{ + if (!_init) + return AXP_NOT_INIT; + if (_chip_id == AXP202_CHIP_ID) { + if (param >= AXP202_LDO4_MAX) + return AXP_INVALID; + uint8_t val; + _readByte(AXP202_LDO24OUT_VOL, 1, &val); + val &= 0xF0; + val |= param; + _writeByte(AXP202_LDO24OUT_VOL, 1, &val); + return AXP_PASS; + } + return AXP_FAIL; +} + +//! Only AXP202 support +// 0 : LDO 1 : DCIN +int AXP20X_Class::setLDO3Mode(uint8_t mode) +{ + uint8_t val; + if (_chip_id != AXP202_CHIP_ID) + return AXP_FAIL; + _readByte(AXP202_LDO3OUT_VOL, 1, &val); + if (mode) { + val |= BIT_MASK(7); + } else { + val &= (~BIT_MASK(7)); + } + _writeByte(AXP202_LDO3OUT_VOL, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::setStartupTime(uint8_t param) +{ + uint8_t val; + if (!_init) + return AXP_NOT_INIT; + if (param > sizeof(startupParams) / sizeof(startupParams[0])) + return AXP_INVALID; + _readByte(AXP202_POK_SET, 1, &val); + val &= (~0b11000000); + val |= startupParams[param]; + _writeByte(AXP202_POK_SET, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::setlongPressTime(uint8_t param) +{ + uint8_t val; + if (!_init) + return AXP_NOT_INIT; + if (param > sizeof(longPressParams) / sizeof(longPressParams[0])) + return AXP_INVALID; + _readByte(AXP202_POK_SET, 1, &val); + val &= (~0b00110000); + val |= longPressParams[param]; + _writeByte(AXP202_POK_SET, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::setShutdownTime(uint8_t param) +{ + uint8_t val; + if (!_init) + return AXP_NOT_INIT; + if (param > sizeof(shutdownParams) / sizeof(shutdownParams[0])) + return AXP_INVALID; + _readByte(AXP202_POK_SET, 1, &val); + val &= (~0b00000011); + val |= shutdownParams[param]; + _writeByte(AXP202_POK_SET, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::setTimeOutShutdown(bool en) +{ + uint8_t val; + if (!_init) + return AXP_NOT_INIT; + _readByte(AXP202_POK_SET, 1, &val); + if (en) + val |= (1 << 3); + else + val &= (~(1 << 3)); + _writeByte(AXP202_POK_SET, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::shutdown() +{ + uint8_t val; + if (!_init) + return AXP_NOT_INIT; + _readByte(AXP202_OFF_CTL, 1, &val); + val |= (1 << 7); + _writeByte(AXP202_OFF_CTL, 1, &val); + return AXP_PASS; +} + +float AXP20X_Class::getSettingChargeCurrent() +{ + uint8_t val; + if (!_init) + return AXP_NOT_INIT; + _readByte(AXP202_CHARGE1, 1, &val); + val &= 0b00000111; + float cur = 300.0 + val * 100.0; + AXP_DEBUG("Setting Charge current : %.2f mA\n", cur); + return cur; +} + +bool AXP20X_Class::isChargeingEnable() +{ + uint8_t val; + if (!_init) + return false; + _readByte(AXP202_CHARGE1, 1, &val); + if (val & (1 << 7)) { + AXP_DEBUG("Charging enable is enable\n"); + val = true; + } else { + AXP_DEBUG("Charging enable is disable\n"); + val = false; + } + return val; +} + +int AXP20X_Class::enableChargeing(bool en) +{ + uint8_t val; + if (!_init) + return AXP_NOT_INIT; + _readByte(AXP202_CHARGE1, 1, &val); + val |= (1 << 7); + _writeByte(AXP202_CHARGE1, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::setChargingTargetVoltage(axp_chargeing_vol_t param) +{ + uint8_t val; + if (!_init) + return AXP_NOT_INIT; + if (param > sizeof(targetVolParams) / sizeof(targetVolParams[0])) + return AXP_INVALID; + _readByte(AXP202_CHARGE1, 1, &val); + val &= ~(0b01100000); + val |= targetVolParams[param]; + _writeByte(AXP202_CHARGE1, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::getBattPercentage() +{ + if (!_init) + return AXP_NOT_INIT; + if (_chip_id != AXP202_CHIP_ID) + return AXP_NOT_SUPPORT; + uint8_t val; + if (!isBatteryConnect()) + return 0; + _readByte(AXP202_BATT_PERCENTAGE, 1, &val); + if (!(val & BIT_MASK(7))) { + return val & (~BIT_MASK(7)); + } + return 0; +} + +int AXP20X_Class::setChgLEDModeCharging() +{ + uint8_t val; + _readByte(AXP202_OFF_CTL, 1, &val); + val &= 0b11110111; + _writeByte(AXP202_OFF_CTL, 1, &val); + return AXP_PASS; +} + +int AXP20X_Class::setChgLEDMode(axp_chgled_mode_t mode) +{ + uint8_t val; + _readByte(AXP202_OFF_CTL, 1, &val); + val &= 0b11001111; + val |= BIT_MASK(3); + switch (mode) { + case AXP20X_LED_OFF: + _writeByte(AXP202_OFF_CTL, 1, &val); + break; + case AXP20X_LED_BLINK_1HZ: + val |= 0b00010000; + _writeByte(AXP202_OFF_CTL, 1, &val); + break; + case AXP20X_LED_BLINK_4HZ: + val |= 0b00100000; + _writeByte(AXP202_OFF_CTL, 1, &val); + break; + case AXP20X_LED_LOW_LEVEL: + val |= 0b00110000; + _writeByte(AXP202_OFF_CTL, 1, &val); + break; + default: + return AXP_FAIL; + } + return AXP_PASS; +} + +int AXP20X_Class::debugCharging() +{ + uint8_t val; + _readByte(AXP202_CHARGE1, 1, &val); + AXP_DEBUG("SRC REG:0x%x\n", val); + if (val & (1 << 7)) { + AXP_DEBUG("Charging enable is enable\n"); + } else { + AXP_DEBUG("Charging enable is disable\n"); + } + AXP_DEBUG("Charging target-voltage : 0x%x\n", ((val & 0b01100000) >> 5) & 0b11); + if (val & (1 << 4)) { + AXP_DEBUG("end when the charge current is lower than 15%% of the set value\n"); + } else { + AXP_DEBUG(" end when the charge current is lower than 10%% of the set value\n"); + } + val &= 0b00000111; + AXP_DEBUG("Charge current : %.2f mA\n", 300.0 + val * 100.0); + return AXP_PASS; +} + +int AXP20X_Class::debugStatus() +{ + if (!_init) + return AXP_NOT_INIT; + uint8_t val, val1, val2; + _readByte(AXP202_STATUS, 1, &val); + _readByte(AXP202_MODE_CHGSTATUS, 1, &val1); + _readByte(AXP202_IPS_SET, 1, &val2); + AXP_DEBUG("AXP202_STATUS: AXP202_MODE_CHGSTATUS AXP202_IPS_SET\n"); + AXP_DEBUG("0x%x\t\t\t 0x%x\t\t\t 0x%x\n", val, val1, val2); + return AXP_PASS; +} + +int AXP20X_Class::limitingOff() +{ + if (!_init) + return AXP_NOT_INIT; + uint8_t val; + _readByte(AXP202_IPS_SET, 1, &val); + if (_chip_id == AXP202_CHIP_ID) { + val |= 0x03; + } else { + val &= ~(1 << 1); + } + _writeByte(AXP202_IPS_SET, 1, &val); + return AXP_PASS; +} + +// Only AXP129 chip and AXP173 +int AXP20X_Class::setDCDC1Voltage(uint16_t mv) +{ + if (!_init) + return AXP_NOT_INIT; + if (_chip_id != AXP192_CHIP_ID && _chip_id != AXP173_CHIP_ID) + return AXP_FAIL; + if (mv < 700) { + AXP_DEBUG("DCDC1:Below settable voltage:700mV~3500mV"); + mv = 700; + } + if (mv > 3500) { + AXP_DEBUG("DCDC1:Above settable voltage:700mV~3500mV"); + mv = 3500; + } + uint8_t val = (mv - 700) / 25; + //! axp192 and axp173 dc1 control register same + _writeByte(AXP192_DC1_VLOTAGE, 1, &val); + return AXP_PASS; +} + +// Only AXP129 chip and AXP173 +uint16_t AXP20X_Class::getDCDC1Voltage() +{ + if (_chip_id != AXP192_CHIP_ID && _chip_id != AXP173_CHIP_ID) + return AXP_FAIL; + uint8_t val = 0; + //! axp192 and axp173 dc1 control register same + _readByte(AXP192_DC1_VLOTAGE, 1, &val); + return val * 25 + 700; +} + + +/*********************************************** + * !!! TIMER FUNCTION !!! + * *********************************************/ + +int AXP20X_Class::setTimer(uint8_t minutes) +{ + if (!_init) + return AXP_NOT_INIT; + if (_chip_id == AXP202_CHIP_ID) { + if (minutes > 63) { + return AXP_ARG_INVALID; + } + _writeByte(AXP202_TIMER_CTL, 1, &minutes); + return AXP_PASS; + } + return AXP_NOT_SUPPORT; +} + +int AXP20X_Class::offTimer() +{ + if (!_init) + return AXP_NOT_INIT; + if (_chip_id == AXP202_CHIP_ID) { + uint8_t minutes = 0x80; + _writeByte(AXP202_TIMER_CTL, 1, &minutes); + return AXP_PASS; + } + return AXP_NOT_SUPPORT; +} + +int AXP20X_Class::clearTimerStatus() +{ + if (!_init) + return AXP_NOT_INIT; + if (_chip_id == AXP202_CHIP_ID) { + uint8_t val; + _readByte(AXP202_TIMER_CTL, 1, &val); + val |= 0x80; + _writeByte(AXP202_TIMER_CTL, 1, &val); + return AXP_PASS; + } + return AXP_NOT_SUPPORT; +} + +/*********************************************** + * !!! GPIO FUNCTION !!! + * *********************************************/ + +int AXP20X_Class::_axp192_gpio_0_select( axp_gpio_mode_t mode) +{ + switch (mode) { + case AXP_IO_OUTPUT_LOW_MODE: + return 0b101; + case AXP_IO_INPUT_MODE: + return 0b001; + case AXP_IO_LDO_MODE: + return 0b010; + case AXP_IO_ADC_MODE: + return 0b100; + case AXP_IO_FLOATING_MODE: + return 0b111; + case AXP_IO_OPEN_DRAIN_OUTPUT_MODE: + return 0; + case AXP_IO_OUTPUT_HIGH_MODE: + case AXP_IO_PWM_OUTPUT_MODE: + default: + break; + } + return AXP_NOT_SUPPORT; +} + +int AXP20X_Class::_axp192_gpio_1_select( axp_gpio_mode_t mode) +{ + switch (mode) { + case AXP_IO_OUTPUT_LOW_MODE: + return 0b101; + case AXP_IO_INPUT_MODE: + return 0b001; + case AXP_IO_ADC_MODE: + return 0b100; + case AXP_IO_FLOATING_MODE: + return 0b111; + case AXP_IO_OPEN_DRAIN_OUTPUT_MODE: + return 0; + case AXP_IO_PWM_OUTPUT_MODE: + return 0b010; + case AXP_IO_OUTPUT_HIGH_MODE: + case AXP_IO_LDO_MODE: + default: + break; + } + return AXP_NOT_SUPPORT; +} + + +int AXP20X_Class::_axp192_gpio_3_select( axp_gpio_mode_t mode) +{ + switch (mode) { + case AXP_IO_EXTERN_CHARGING_CTRL_MODE: + return 0; + case AXP_IO_OPEN_DRAIN_OUTPUT_MODE: + return 1; + case AXP_IO_INPUT_MODE: + return 2; + default: + break; + } + return AXP_NOT_SUPPORT; +} + +int AXP20X_Class::_axp192_gpio_4_select( axp_gpio_mode_t mode) +{ + switch (mode) { + case AXP_IO_EXTERN_CHARGING_CTRL_MODE: + return 0; + case AXP_IO_OPEN_DRAIN_OUTPUT_MODE: + return 1; + case AXP_IO_INPUT_MODE: + return 2; + case AXP_IO_ADC_MODE: + return 3; + default: + break; + } + return AXP_NOT_SUPPORT; +} + + +int AXP20X_Class::_axp192_gpio_set(axp_gpio_t gpio, axp_gpio_mode_t mode) +{ + int rslt; + uint8_t val; + switch (gpio) { + case AXP_GPIO_0: { + rslt = _axp192_gpio_0_select(mode); + if (rslt < 0)return rslt; + _readByte(AXP192_GPIO0_CTL, 1, &val); + val &= 0xF8; + val |= (uint8_t)rslt; + _writeByte(AXP192_GPIO0_CTL, 1, &val); + return AXP_PASS; + } + case AXP_GPIO_1: { + rslt = _axp192_gpio_1_select(mode); + if (rslt < 0)return rslt; + _readByte(AXP192_GPIO1_CTL, 1, &val); + val &= 0xF8; + val |= (uint8_t)rslt; + _writeByte(AXP192_GPIO1_CTL, 1, &val); + return AXP_PASS; + } + case AXP_GPIO_2: { + rslt = _axp192_gpio_1_select(mode); + if (rslt < 0)return rslt; + _readByte(AXP192_GPIO2_CTL, 1, &val); + val &= 0xF8; + val |= (uint8_t)rslt; + _writeByte(AXP192_GPIO2_CTL, 1, &val); + return AXP_PASS; + } + case AXP_GPIO_3: { + rslt = _axp192_gpio_3_select(mode); + if (rslt < 0)return rslt; + _readByte(AXP192_GPIO34_CTL, 1, &val); + val &= 0xFC; + val |= (uint8_t)rslt; + _writeByte(AXP192_GPIO34_CTL, 1, &val); + return AXP_PASS; + } + case AXP_GPIO_4: { + rslt = _axp192_gpio_4_select(mode); + if (rslt < 0)return rslt; + _readByte(AXP192_GPIO34_CTL, 1, &val); + val &= 0xF3; + val |= (uint8_t)rslt; + _writeByte(AXP192_GPIO34_CTL, 1, &val); + return AXP_PASS; + } + default: + break; + } + return AXP_NOT_SUPPORT; +} + +int AXP20X_Class::_axp202_gpio_0_select( axp_gpio_mode_t mode) +{ + switch (mode) { + case AXP_IO_OUTPUT_LOW_MODE: + return 0; + case AXP_IO_OUTPUT_HIGH_MODE: + return 1; + case AXP_IO_INPUT_MODE: + return 2; + case AXP_IO_LDO_MODE: + return 3; + case AXP_IO_ADC_MODE: + return 4; + default: + break; + } + return AXP_NOT_SUPPORT; +} + +int AXP20X_Class::_axp202_gpio_1_select( axp_gpio_mode_t mode) +{ + switch (mode) { + case AXP_IO_OUTPUT_LOW_MODE: + return 0; + case AXP_IO_OUTPUT_HIGH_MODE: + return 1; + case AXP_IO_INPUT_MODE: + return 2; + case AXP_IO_ADC_MODE: + return 4; + default: + break; + } + return AXP_NOT_SUPPORT; +} + +int AXP20X_Class::_axp202_gpio_2_select( axp_gpio_mode_t mode) +{ + switch (mode) { + case AXP_IO_OUTPUT_LOW_MODE: + return 0; + case AXP_IO_INPUT_MODE: + return 2; + case AXP_IO_FLOATING_MODE: + return 1; + default: + break; + } + return AXP_NOT_SUPPORT; +} + + +int AXP20X_Class::_axp202_gpio_3_select(axp_gpio_mode_t mode) +{ + switch (mode) { + case AXP_IO_INPUT_MODE: + return 1; + case AXP_IO_OPEN_DRAIN_OUTPUT_MODE: + return 0; + default: + break; + } + return AXP_NOT_SUPPORT; +} + +int AXP20X_Class::_axp202_gpio_set(axp_gpio_t gpio, axp_gpio_mode_t mode) +{ + uint8_t val; + int rslt; + switch (gpio) { + case AXP_GPIO_0: { + rslt = _axp202_gpio_0_select(mode); + if (rslt < 0)return rslt; + _readByte(AXP202_GPIO0_CTL, 1, &val); + val &= 0b11111000; + val |= (uint8_t)rslt; + _writeByte(AXP202_GPIO0_CTL, 1, &val); + return AXP_PASS; + } + case AXP_GPIO_1: { + rslt = _axp202_gpio_1_select(mode); + if (rslt < 0)return rslt; + _readByte(AXP202_GPIO1_CTL, 1, &val); + val &= 0b11111000; + val |= (uint8_t)rslt; + _writeByte(AXP202_GPIO1_CTL, 1, &val); + return AXP_PASS; + } + case AXP_GPIO_2: { + rslt = _axp202_gpio_2_select(mode); + if (rslt < 0)return rslt; + _readByte(AXP202_GPIO2_CTL, 1, &val); + val &= 0b11111000; + val |= (uint8_t)rslt; + _writeByte(AXP202_GPIO2_CTL, 1, &val); + return AXP_PASS; + } + case AXP_GPIO_3: { + rslt = _axp202_gpio_3_select(mode); + if (rslt < 0)return rslt; + _readByte(AXP202_GPIO3_CTL, 1, &val); + val = rslt ? (val | BIT_MASK(2)) : (val & (~BIT_MASK(2))); + _writeByte(AXP202_GPIO3_CTL, 1, &val); + return AXP_PASS; + } + default: + break; + } + return AXP_NOT_SUPPORT; +} + + +int AXP20X_Class::setGPIOMode(axp_gpio_t gpio, axp_gpio_mode_t mode) +{ + if (!_init) + return AXP_NOT_INIT; + switch (_chip_id) { + case AXP202_CHIP_ID: + return _axp202_gpio_set(gpio, mode); + break; + case AXP192_CHIP_ID: + return _axp192_gpio_set(gpio, mode); + break; + default: + break; + } + return AXP_NOT_SUPPORT; +} + + +int AXP20X_Class::_axp_irq_mask(axp_gpio_irq_t irq) +{ + switch (irq) { + case AXP_IRQ_NONE: + return 0; + case AXP_IRQ_RISING: + return BIT_MASK(7); + case AXP_IRQ_FALLING: + return BIT_MASK(6); + case AXP_IRQ_DOUBLE_EDGE: + return 0b1100000; + default: + break; + } + return AXP_NOT_SUPPORT; +} + +int AXP20X_Class::_axp202_gpio_irq_set(axp_gpio_t gpio, axp_gpio_irq_t irq) +{ + uint8_t reg; + uint8_t val; + int mask; + mask = _axp_irq_mask(irq); + + if (mask < 0)return mask; + switch (gpio) { + case AXP_GPIO_0: + reg = AXP202_GPIO0_CTL; + break; + case AXP_GPIO_1: + reg = AXP202_GPIO1_CTL; + break; + case AXP_GPIO_2: + reg = AXP202_GPIO2_CTL; + break; + case AXP_GPIO_3: + reg = AXP202_GPIO3_CTL; + break; + default: + return AXP_NOT_SUPPORT; + } + _readByte(reg, 1, &val); + val = mask == 0 ? (val & 0b00111111) : (val | mask); + _writeByte(reg, 1, &val); + return AXP_PASS; +} + + +int AXP20X_Class::setGPIOIrq(axp_gpio_t gpio, axp_gpio_irq_t irq) +{ + if (!_init) + return AXP_NOT_INIT; + switch (_chip_id) { + case AXP202_CHIP_ID: + return _axp202_gpio_irq_set(gpio, irq); + case AXP192_CHIP_ID: + case AXP173_CHIP_ID: + return AXP_NOT_SUPPORT; + default: + break; + } + return AXP_NOT_SUPPORT; +} + +int AXP20X_Class::setLDO5Voltage(axp_ldo5_table_t vol) +{ + const uint8_t params[] = { + 0b11111000, //1.8V + 0b11111001, //2.5V + 0b11111010, //2.8V + 0b11111011, //3.0V + 0b11111100, //3.1V + 0b11111101, //3.3V + 0b11111110, //3.4V + 0b11111111, //3.5V + }; + if (!_init) + return AXP_NOT_INIT; + if (_chip_id != AXP202_CHIP_ID) + return AXP_NOT_SUPPORT; + if (vol > sizeof(params) / sizeof(params[0])) + return AXP_ARG_INVALID; + uint8_t val = 0; + _readByte(AXP202_GPIO0_VOL, 1, &val); + val &= 0b11111000; + val |= params[vol]; + _writeByte(AXP202_GPIO0_VOL, 1, &val); + return AXP_PASS; +} + + +int AXP20X_Class::_axp202_gpio_write(axp_gpio_t gpio, uint8_t val) +{ + uint8_t reg; + uint8_t wVal = 0; + switch (gpio) { + case AXP_GPIO_0: + reg = AXP202_GPIO0_CTL; + break; + case AXP_GPIO_1: + reg = AXP202_GPIO1_CTL; + break; + case AXP_GPIO_2: + reg = AXP202_GPIO2_CTL; + if (val) { + return AXP_NOT_SUPPORT; + } + break; + case AXP_GPIO_3: + if (val) { + return AXP_NOT_SUPPORT; + } + _readByte(AXP202_GPIO3_CTL, 1, &wVal); + wVal &= 0b11111101; + _writeByte(AXP202_GPIO3_CTL, 1, &wVal); + return AXP_PASS; + default: + return AXP_NOT_SUPPORT; + } + _readByte(reg, 1, &wVal); + wVal = val ? (wVal | 1) : (wVal & 0b11111000); + _writeByte(reg, 1, &wVal); + return AXP_PASS; +} + +int AXP20X_Class::_axp202_gpio_read(axp_gpio_t gpio) +{ + uint8_t val; + uint8_t reg = AXP202_GPIO012_SIGNAL; + uint8_t offset; + switch (gpio) { + case AXP_GPIO_0: + offset = 4; + break; + case AXP_GPIO_1: + offset = 5; + break; + case AXP_GPIO_2: + offset = 6; + break; + case AXP_GPIO_3: + reg = AXP202_GPIO3_CTL; + offset = 0; + break; + default: + return AXP_NOT_SUPPORT; + } + _readByte(reg, 1, &val); + return val & BIT_MASK(offset) ? 1 : 0; +} + +int AXP20X_Class::gpioWrite(axp_gpio_t gpio, uint8_t val) +{ + if (!_init) + return AXP_NOT_INIT; + switch (_chip_id) { + case AXP202_CHIP_ID: + return _axp202_gpio_write(gpio, val); + case AXP192_CHIP_ID: + case AXP173_CHIP_ID: + return AXP_NOT_SUPPORT; + default: + break; + } + return AXP_NOT_SUPPORT; +} + +int AXP20X_Class::gpioRead(axp_gpio_t gpio) +{ + if (!_init) + return AXP_NOT_INIT; + switch (_chip_id) { + case AXP202_CHIP_ID: + return _axp202_gpio_read(gpio); + case AXP192_CHIP_ID: + case AXP173_CHIP_ID: + return AXP_NOT_SUPPORT; + default: + break; + } + return AXP_NOT_SUPPORT; +} + + + +int AXP20X_Class::getChargeControlCur() +{ + int cur; + uint8_t val; + if (!_init) + return AXP_NOT_INIT; + switch (_chip_id) { + case AXP202_CHIP_ID: + _readByte(AXP202_CHARGE1, 1, &val); + val &= 0x0F; + cur = val * 100 + 300; + if (cur > 1800 || cur < 300)return 0; + return cur; + case AXP192_CHIP_ID: + case AXP173_CHIP_ID: + _readByte(AXP202_CHARGE1, 1, &val); + return val & 0x0F; + default: + break; + } + return AXP_NOT_SUPPORT; +} + +int AXP20X_Class::setChargeControlCur(uint16_t mA) +{ + uint8_t val; + if (!_init) + return AXP_NOT_INIT; + switch (_chip_id) { + case AXP202_CHIP_ID: + _readByte(AXP202_CHARGE1, 1, &val); + val &= 0b11110000; + mA -= 300; + val |= (mA / 100); + _writeByte(AXP202_CHARGE1, 1, &val); + return AXP_PASS; + case AXP192_CHIP_ID: + case AXP173_CHIP_ID: + _readByte(AXP202_CHARGE1, 1, &val); + val &= 0b11110000; + if(mA > AXP1XX_CHARGE_CUR_1320MA) + mA = AXP1XX_CHARGE_CUR_1320MA; + val |= mA; + _writeByte(AXP202_CHARGE1, 1, &val); + return AXP_PASS; + default: + break; + } + return AXP_NOT_SUPPORT; +} + diff --git a/lib/axp192/axp20x.h b/lib/axp192/axp20x.h new file mode 100644 index 0000000..1e89260 --- /dev/null +++ b/lib/axp192/axp20x.h @@ -0,0 +1,852 @@ +///////////////////////////////////////////////////////////////// +/* +MIT License + +Copyright (c) 2019 lewis he + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +axp20x.h - Arduino library for X-Power AXP202 chip. +Created by Lewis he on April 1, 2019. +github:https://github.com/lewisxhe/AXP202X_Libraries +*/ +///////////////////////////////////////////////////////////////// +#pragma once + +#include +#include + +// #define AXP_DEBUG_PORT Serial +#ifdef AXP_DEBUG_PORT +#define AXP_DEBUG(fmt, ...) AXP_DEBUG_PORT.printf_P((PGM_P)PSTR(fmt), ##__VA_ARGS__) +#else +#define AXP_DEBUG(...) +#endif + +#ifndef RISING +#define RISING 0x01 +#endif + +#ifndef FALLING +#define FALLING 0x02 +#endif + +#ifdef _BV +#undef _BV +#endif +#define _BV(b) (1ULL << (b)) + +//! Error Code +#define AXP_PASS (0) +#define AXP_FAIL (-1) +#define AXP_INVALID (-2) +#define AXP_NOT_INIT (-3) +#define AXP_NOT_SUPPORT (-4) +#define AXP_ARG_INVALID (-5) + +//! Chip Address +#define AXP202_SLAVE_ADDRESS (0x35) +#define AXP192_SLAVE_ADDRESS (0x34) +#define AXP173_SLAVE_ADDRESS (0x34) + +//! Chip ID +#define AXP202_CHIP_ID 0x41 +#define AXP192_CHIP_ID 0x03 +#define AXP173_CHIP_ID 0xAD //!Axp173 does not have a chip ID, given a custom ID + +//! Logic states +#define AXP202_ON 1 +#define AXP202_OFF 0 + +//! REG MAP +#define AXP202_STATUS (0x00) +#define AXP202_MODE_CHGSTATUS (0x01) +#define AXP202_OTG_STATUS (0x02) +#define AXP202_IC_TYPE (0x03) +#define AXP202_DATA_BUFFER1 (0x04) +#define AXP202_DATA_BUFFER2 (0x05) +#define AXP202_DATA_BUFFER3 (0x06) +#define AXP202_DATA_BUFFER4 (0x07) +#define AXP202_DATA_BUFFER5 (0x08) +#define AXP202_DATA_BUFFER6 (0x09) +#define AXP202_DATA_BUFFER7 (0x0A) +#define AXP202_DATA_BUFFER8 (0x0B) +#define AXP202_DATA_BUFFER9 (0x0C) +#define AXP202_DATA_BUFFERA (0x0D) +#define AXP202_DATA_BUFFERB (0x0E) +#define AXP202_DATA_BUFFERC (0x0F) +#define AXP202_LDO234_DC23_CTL (0x12) +#define AXP202_DC2OUT_VOL (0x23) +#define AXP202_LDO3_DC2_DVM (0x25) +#define AXP202_DC3OUT_VOL (0x27) +#define AXP202_LDO24OUT_VOL (0x28) +#define AXP202_LDO3OUT_VOL (0x29) +#define AXP202_IPS_SET (0x30) +#define AXP202_VOFF_SET (0x31) +#define AXP202_OFF_CTL (0x32) +#define AXP202_CHARGE1 (0x33) +#define AXP202_CHARGE2 (0x34) +#define AXP202_BACKUP_CHG (0x35) +#define AXP202_POK_SET (0x36) +#define AXP202_DCDC_FREQSET (0x37) +#define AXP202_VLTF_CHGSET (0x38) +#define AXP202_VHTF_CHGSET (0x39) +#define AXP202_APS_WARNING1 (0x3A) +#define AXP202_APS_WARNING2 (0x3B) +#define AXP202_TLTF_DISCHGSET (0x3C) +#define AXP202_THTF_DISCHGSET (0x3D) +#define AXP202_DCDC_MODESET (0x80) +#define AXP202_ADC_EN1 (0x82) +#define AXP202_ADC_EN2 (0x83) +#define AXP202_ADC_SPEED (0x84) +#define AXP202_ADC_INPUTRANGE (0x85) +#define AXP202_ADC_IRQ_RETFSET (0x86) +#define AXP202_ADC_IRQ_FETFSET (0x87) +#define AXP202_TIMER_CTL (0x8A) +#define AXP202_VBUS_DET_SRP (0x8B) +#define AXP202_HOTOVER_CTL (0x8F) +#define AXP202_GPIO0_CTL (0x90) +#define AXP202_GPIO0_VOL (0x91) +#define AXP202_GPIO1_CTL (0x92) +#define AXP202_GPIO2_CTL (0x93) +#define AXP202_GPIO012_SIGNAL (0x94) +#define AXP202_GPIO3_CTL (0x95) +#define AXP202_INTEN1 (0x40) +#define AXP202_INTEN2 (0x41) +#define AXP202_INTEN3 (0x42) +#define AXP202_INTEN4 (0x43) +#define AXP202_INTEN5 (0x44) +#define AXP202_INTSTS1 (0x48) +#define AXP202_INTSTS2 (0x49) +#define AXP202_INTSTS3 (0x4A) +#define AXP202_INTSTS4 (0x4B) +#define AXP202_INTSTS5 (0x4C) + +//Irq control register +#define AXP192_INTEN1 (0x40) +#define AXP192_INTEN2 (0x41) +#define AXP192_INTEN3 (0x42) +#define AXP192_INTEN4 (0x43) +#define AXP192_INTEN5 (0x4A) +//Irq status register +#define AXP192_INTSTS1 (0x44) +#define AXP192_INTSTS2 (0x45) +#define AXP192_INTSTS3 (0x46) +#define AXP192_INTSTS4 (0x47) +#define AXP192_INTSTS5 (0x4D) + +#define AXP192_DC1_VLOTAGE (0x26) +#define AXP192_LDO23OUT_VOL (0x28) +#define AXP192_GPIO0_CTL (0x90) +#define AXP192_GPIO0_VOL (0x91) +#define AXP192_GPIO1_CTL (0X92) +#define AXP192_GPIO2_CTL (0x93) +#define AXP192_GPIO012_SIGNAL (0x94) +#define AXP192_GPIO34_CTL (0x95) + + + +/* axp 192/202 adc data register */ +#define AXP202_BAT_AVERVOL_H8 (0x78) +#define AXP202_BAT_AVERVOL_L4 (0x79) +#define AXP202_BAT_AVERCHGCUR_H8 (0x7A) +#define AXP202_BAT_AVERCHGCUR_L4 (0x7B) +#define AXP202_BAT_AVERCHGCUR_L5 (0x7B) +#define AXP202_ACIN_VOL_H8 (0x56) +#define AXP202_ACIN_VOL_L4 (0x57) +#define AXP202_ACIN_CUR_H8 (0x58) +#define AXP202_ACIN_CUR_L4 (0x59) +#define AXP202_VBUS_VOL_H8 (0x5A) +#define AXP202_VBUS_VOL_L4 (0x5B) +#define AXP202_VBUS_CUR_H8 (0x5C) +#define AXP202_VBUS_CUR_L4 (0x5D) +#define AXP202_INTERNAL_TEMP_H8 (0x5E) +#define AXP202_INTERNAL_TEMP_L4 (0x5F) +#define AXP202_TS_IN_H8 (0x62) +#define AXP202_TS_IN_L4 (0x63) +#define AXP202_GPIO0_VOL_ADC_H8 (0x64) +#define AXP202_GPIO0_VOL_ADC_L4 (0x65) +#define AXP202_GPIO1_VOL_ADC_H8 (0x66) +#define AXP202_GPIO1_VOL_ADC_L4 (0x67) + +#define AXP202_BAT_AVERDISCHGCUR_H8 (0x7C) +#define AXP202_BAT_AVERDISCHGCUR_L5 (0x7D) +#define AXP202_APS_AVERVOL_H8 (0x7E) +#define AXP202_APS_AVERVOL_L4 (0x7F) +#define AXP202_INT_BAT_CHGCUR_H8 (0xA0) +#define AXP202_INT_BAT_CHGCUR_L4 (0xA1) +#define AXP202_EXT_BAT_CHGCUR_H8 (0xA2) +#define AXP202_EXT_BAT_CHGCUR_L4 (0xA3) +#define AXP202_INT_BAT_DISCHGCUR_H8 (0xA4) +#define AXP202_INT_BAT_DISCHGCUR_L4 (0xA5) +#define AXP202_EXT_BAT_DISCHGCUR_H8 (0xA6) +#define AXP202_EXT_BAT_DISCHGCUR_L4 (0xA7) +#define AXP202_BAT_CHGCOULOMB3 (0xB0) +#define AXP202_BAT_CHGCOULOMB2 (0xB1) +#define AXP202_BAT_CHGCOULOMB1 (0xB2) +#define AXP202_BAT_CHGCOULOMB0 (0xB3) +#define AXP202_BAT_DISCHGCOULOMB3 (0xB4) +#define AXP202_BAT_DISCHGCOULOMB2 (0xB5) +#define AXP202_BAT_DISCHGCOULOMB1 (0xB6) +#define AXP202_BAT_DISCHGCOULOMB0 (0xB7) +#define AXP202_COULOMB_CTL (0xB8) +#define AXP202_BAT_POWERH8 (0x70) +#define AXP202_BAT_POWERM8 (0x71) +#define AXP202_BAT_POWERL8 (0x72) + +#define AXP202_VREF_TEM_CTRL (0xF3) +#define AXP202_BATT_PERCENTAGE (0xB9) + +/* bit definitions for AXP events, irq event */ +/* AXP202 */ +#define AXP202_IRQ_USBLO (1) +#define AXP202_IRQ_USBRE (2) +#define AXP202_IRQ_USBIN (3) +#define AXP202_IRQ_USBOV (4) +#define AXP202_IRQ_ACRE (5) +#define AXP202_IRQ_ACIN (6) +#define AXP202_IRQ_ACOV (7) + +#define AXP202_IRQ_TEMLO (8) +#define AXP202_IRQ_TEMOV (9) +#define AXP202_IRQ_CHAOV (10) +#define AXP202_IRQ_CHAST (11) +#define AXP202_IRQ_BATATOU (12) +#define AXP202_IRQ_BATATIN (13) +#define AXP202_IRQ_BATRE (14) +#define AXP202_IRQ_BATIN (15) + +#define AXP202_IRQ_POKLO (16) +#define AXP202_IRQ_POKSH (17) +#define AXP202_IRQ_LDO3LO (18) +#define AXP202_IRQ_DCDC3LO (19) +#define AXP202_IRQ_DCDC2LO (20) +#define AXP202_IRQ_CHACURLO (22) +#define AXP202_IRQ_ICTEMOV (23) + +#define AXP202_IRQ_EXTLOWARN2 (24) +#define AXP202_IRQ_EXTLOWARN1 (25) +#define AXP202_IRQ_SESSION_END (26) +#define AXP202_IRQ_SESS_AB_VALID (27) +#define AXP202_IRQ_VBUS_UN_VALID (28) +#define AXP202_IRQ_VBUS_VALID (29) +#define AXP202_IRQ_PDOWN_BY_NOE (30) +#define AXP202_IRQ_PUP_BY_NOE (31) + +#define AXP202_IRQ_GPIO0TG (32) +#define AXP202_IRQ_GPIO1TG (33) +#define AXP202_IRQ_GPIO2TG (34) +#define AXP202_IRQ_GPIO3TG (35) +#define AXP202_IRQ_PEKFE (37) +#define AXP202_IRQ_PEKRE (38) +#define AXP202_IRQ_TIMER (39) + +//Signal Capture +#define AXP202_BATT_VOLTAGE_STEP (1.1F) +#define AXP202_BATT_DISCHARGE_CUR_STEP (0.5F) +#define AXP202_BATT_CHARGE_CUR_STEP (0.5F) +#define AXP202_ACIN_VOLTAGE_STEP (1.7F) +#define AXP202_ACIN_CUR_STEP (0.625F) +#define AXP202_VBUS_VOLTAGE_STEP (1.7F) +#define AXP202_VBUS_CUR_STEP (0.375F) +#define AXP202_INTERNAL_TEMP_STEP (0.1F) +#define AXP202_APS_VOLTAGE_STEP (1.4F) +#define AXP202_TS_PIN_OUT_STEP (0.8F) +#define AXP202_GPIO0_STEP (0.5F) +#define AXP202_GPIO1_STEP (0.5F) +// AXP192 only +#define AXP202_GPIO2_STEP (0.5F) +#define AXP202_GPIO3_STEP (0.5F) + +// AXP173 +#define AXP173_EXTEN_DC2_CTL (0x10) +#define AXP173_CTL_DC2_BIT (0) +#define AXP173_CTL_EXTEN_BIT (2) +#define AXP173_DC1_VLOTAGE (0x26) +#define AXP173_LDO4_VLOTAGE (0x27) + +#define FORCED_OPEN_DCDC3(x) (x |= (AXP202_ON << AXP202_DCDC3)) +#define BIT_MASK(x) (1 << x) +#define IS_OPEN(reg, channel) (bool)(reg & BIT_MASK(channel)) + +enum { + AXP202_EXTEN = 0, + AXP202_DCDC3 = 1, + AXP202_LDO2 = 2, + AXP202_LDO4 = 3, + AXP202_DCDC2 = 4, + AXP202_LDO3 = 6, + AXP202_OUTPUT_MAX, +}; + +enum { + AXP192_DCDC1 = 0, + AXP192_DCDC3 = 1, + AXP192_LDO2 = 2, + AXP192_LDO3 = 3, + AXP192_DCDC2 = 4, + AXP192_EXTEN = 6, + AXP192_OUTPUT_MAX, +}; + +enum { + AXP173_DCDC1 = 0, + AXP173_LDO4 = 1, + AXP173_LDO2 = 2, + AXP173_LDO3 = 3, + AXP173_DCDC2 = 4, + AXP173_EXTEN = 6, + AXP173_OUTPUT_MAX, +}; + +typedef enum { + AXP202_STARTUP_TIME_128MS, + AXP202_STARTUP_TIME_3S, + AXP202_STARTUP_TIME_1S, + AXP202_STARTUP_TIME_2S, +} axp202_startup_time_t; + +typedef enum { + AXP192_STARTUP_TIME_128MS, + AXP192_STARTUP_TIME_512MS, + AXP192_STARTUP_TIME_1S, + AXP192_STARTUP_TIME_2S, +} axp192_startup_time_t; + +typedef enum { + AXP_LONGPRESS_TIME_1S, + AXP_LONGPRESS_TIME_1S5, + AXP_LONGPRESS_TIME_2S, + AXP_LONGPRESS_TIME_2S5, +} axp_loonPress_time_t; + +typedef enum { + AXP_POWER_OFF_TIME_4S, + AXP_POWER_OFF_TIME_65, + AXP_POWER_OFF_TIME_8S, + AXP_POWER_OFF_TIME_16S, +} axp_poweroff_time_t; + +//REG 33H: Charging control 1 Charging target-voltage setting +typedef enum { + AXP202_TARGET_VOL_4_1V, + AXP202_TARGET_VOL_4_15V, + AXP202_TARGET_VOL_4_2V, + AXP202_TARGET_VOL_4_36V +} axp_chargeing_vol_t; + +//REG 82H: ADC Enable 1 register Parameter +typedef enum { + AXP202_BATT_VOL_ADC1 = 1 << 7, + AXP202_BATT_CUR_ADC1 = 1 << 6, + AXP202_ACIN_VOL_ADC1 = 1 << 5, + AXP202_ACIN_CUR_ADC1 = 1 << 4, + AXP202_VBUS_VOL_ADC1 = 1 << 3, + AXP202_VBUS_CUR_ADC1 = 1 << 2, + AXP202_APS_VOL_ADC1 = 1 << 1, + AXP202_TS_PIN_ADC1 = 1 << 0 +} axp_adc1_func_t; + +// REG 83H: ADC Enable 2 register Parameter +typedef enum { + AXP202_TEMP_MONITORING_ADC2 = 1 << 7, + AXP202_GPIO1_FUNC_ADC2 = 1 << 3, + AXP202_GPIO0_FUNC_ADC2 = 1 << 2 +} axp_adc2_func_t; + +typedef enum { + AXP202_LDO3_MODE_LDO, + AXP202_LDO3_MODE_DCIN +} axp202_ldo3_mode_t; + + + +typedef enum { + //! IRQ1 REG 40H + AXP202_VBUS_VHOLD_LOW_IRQ = _BV(1), //VBUS is available, but lower than V HOLD, IRQ enable + AXP202_VBUS_REMOVED_IRQ = _BV(2), //VBUS removed, IRQ enable + AXP202_VBUS_CONNECT_IRQ = _BV(3), //VBUS connected, IRQ enable + AXP202_VBUS_OVER_VOL_IRQ = _BV(4), //VBUS over-voltage, IRQ enable + AXP202_ACIN_REMOVED_IRQ = _BV(5), //ACIN removed, IRQ enable + AXP202_ACIN_CONNECT_IRQ = _BV(6), //ACIN connected, IRQ enable + AXP202_ACIN_OVER_VOL_IRQ = _BV(7), //ACIN over-voltage, IRQ enable + + //! IRQ2 REG 41H + AXP202_BATT_LOW_TEMP_IRQ = _BV(8), //Battery low-temperature, IRQ enable + AXP202_BATT_OVER_TEMP_IRQ = _BV(9), //Battery over-temperature, IRQ enable + AXP202_CHARGING_FINISHED_IRQ = _BV(10), //Charge finished, IRQ enable + AXP202_CHARGING_IRQ = _BV(11), //Be charging, IRQ enable + AXP202_BATT_EXIT_ACTIVATE_IRQ = _BV(12), //Exit battery activate mode, IRQ enable + AXP202_BATT_ACTIVATE_IRQ = _BV(13), //Battery activate mode, IRQ enable + AXP202_BATT_REMOVED_IRQ = _BV(14), //Battery removed, IRQ enable + AXP202_BATT_CONNECT_IRQ = _BV(15), //Battery connected, IRQ enable + + //! IRQ3 REG 42H + AXP202_PEK_LONGPRESS_IRQ = _BV(16), //PEK long press, IRQ enable + AXP202_PEK_SHORTPRESS_IRQ = _BV(17), //PEK short press, IRQ enable + AXP202_LDO3_LOW_VOL_IRQ = _BV(18), //LDO3output voltage is lower than the set value, IRQ enable + AXP202_DC3_LOW_VOL_IRQ = _BV(19), //DC-DC3output voltage is lower than the set value, IRQ enable + AXP202_DC2_LOW_VOL_IRQ = _BV(20), //DC-DC2 output voltage is lower than the set value, IRQ enable + //**Reserved and unchangeable BIT 5 + AXP202_CHARGE_LOW_CUR_IRQ = _BV(22), //Charge current is lower than the set current, IRQ enable + AXP202_CHIP_TEMP_HIGH_IRQ = _BV(23), //AXP202 internal over-temperature, IRQ enable + + //! IRQ4 REG 43H + AXP202_APS_LOW_VOL_LEVEL2_IRQ = _BV(24), //APS low-voltage, IRQ enableīŧˆLEVEL2īŧ‰ + APX202_APS_LOW_VOL_LEVEL1_IRQ = _BV(25), //APS low-voltage, IRQ enableīŧˆLEVEL1īŧ‰ + AXP202_VBUS_SESSION_END_IRQ = _BV(26), //VBUS Session End IRQ enable + AXP202_VBUS_SESSION_AB_IRQ = _BV(27), //VBUS Session A/B IRQ enable + AXP202_VBUS_INVALID_IRQ = _BV(28), //VBUS invalid, IRQ enable + AXP202_VBUS_VAILD_IRQ = _BV(29), //VBUS valid, IRQ enable + AXP202_NOE_OFF_IRQ = _BV(30), //N_OE shutdown, IRQ enable + AXP202_NOE_ON_IRQ = _BV(31), //N_OE startup, IRQ enable + + //! IRQ5 REG 44H + AXP202_GPIO0_EDGE_TRIGGER_IRQ = _BV(32), //GPIO0 input edge trigger, IRQ enable + AXP202_GPIO1_EDGE_TRIGGER_IRQ = _BV(33), //GPIO1input edge trigger or ADC input, IRQ enable + AXP202_GPIO2_EDGE_TRIGGER_IRQ = _BV(34), //GPIO2input edge trigger, IRQ enable + AXP202_GPIO3_EDGE_TRIGGER_IRQ = _BV(35), //GPIO3 input edge trigger, IRQ enable + //**Reserved and unchangeable BIT 4 + AXP202_PEK_FALLING_EDGE_IRQ = _BV(37), //PEK press falling edge, IRQ enable + AXP202_PEK_RISING_EDGE_IRQ = _BV(38), //PEK press rising edge, IRQ enable + AXP202_TIMER_TIMEOUT_IRQ = _BV(39), //Timer timeout, IRQ enable + + AXP202_ALL_IRQ = (0xFFFFFFFFFFULL) +} axp_irq_t; + +typedef enum { + AXP202_LDO4_1250MV, + AXP202_LDO4_1300MV, + AXP202_LDO4_1400MV, + AXP202_LDO4_1500MV, + AXP202_LDO4_1600MV, + AXP202_LDO4_1700MV, + AXP202_LDO4_1800MV, + AXP202_LDO4_1900MV, + AXP202_LDO4_2000MV, + AXP202_LDO4_2500MV, + AXP202_LDO4_2700MV, + AXP202_LDO4_2800MV, + AXP202_LDO4_3000MV, + AXP202_LDO4_3100MV, + AXP202_LDO4_3200MV, + AXP202_LDO4_3300MV, + AXP202_LDO4_MAX, +} axp_ldo4_table_t; + +typedef enum { + AXP202_LDO5_1800MV, + AXP202_LDO5_2500MV, + AXP202_LDO5_2800MV, + AXP202_LDO5_3000MV, + AXP202_LDO5_3100MV, + AXP202_LDO5_3300MV, + AXP202_LDO5_3400MV, + AXP202_LDO5_3500MV, +} axp_ldo5_table_t; + +typedef enum { + AXP20X_LED_OFF, + AXP20X_LED_BLINK_1HZ, + AXP20X_LED_BLINK_4HZ, + AXP20X_LED_LOW_LEVEL, +} axp_chgled_mode_t; + +typedef enum { + AXP_ADC_SAMPLING_RATE_25HZ = 0, + AXP_ADC_SAMPLING_RATE_50HZ = 1, + AXP_ADC_SAMPLING_RATE_100HZ = 2, + AXP_ADC_SAMPLING_RATE_200HZ = 3, +} axp_adc_sampling_rate_t; + +typedef enum { + AXP_TS_PIN_CURRENT_20UA = 0, + AXP_TS_PIN_CURRENT_40UA = 1, + AXP_TS_PIN_CURRENT_60UA = 2, + AXP_TS_PIN_CURRENT_80UA = 3, +} axp_ts_pin_current_t; + +typedef enum { + AXP_TS_PIN_FUNCTION_BATT = 0, + AXP_TS_PIN_FUNCTION_ADC = 1, +} axp_ts_pin_function_t; + +typedef enum { + AXP_TS_PIN_MODE_DISABLE = 0, + AXP_TS_PIN_MODE_CHARGING = 1, + AXP_TS_PIN_MODE_SAMPLING = 2, + AXP_TS_PIN_MODE_ENABLE = 3, +} axp_ts_pin_mode_t; + +//! Only AXP192 and AXP202 have gpio function +typedef enum { + AXP_GPIO_0, + AXP_GPIO_1, + AXP_GPIO_2, + AXP_GPIO_3, + AXP_GPIO_4, +} axp_gpio_t; + +typedef enum { + AXP_IO_OUTPUT_LOW_MODE, + AXP_IO_OUTPUT_HIGH_MODE, + AXP_IO_INPUT_MODE, + AXP_IO_LDO_MODE, + AXP_IO_ADC_MODE, + AXP_IO_FLOATING_MODE, + AXP_IO_OPEN_DRAIN_OUTPUT_MODE, + AXP_IO_PWM_OUTPUT_MODE, + AXP_IO_EXTERN_CHARGING_CTRL_MODE, +} axp_gpio_mode_t; + +typedef enum { + AXP_IRQ_NONE, + AXP_IRQ_RISING, + AXP_IRQ_FALLING, + AXP_IRQ_DOUBLE_EDGE, +} axp_gpio_irq_t; + + +typedef enum { + AXP192_GPIO_1V8, + AXP192_GPIO_1V9, + AXP192_GPIO_2V0, + AXP192_GPIO_2V1, + AXP192_GPIO_2V2, + AXP192_GPIO_2V3, + AXP192_GPIO_2V4, + AXP192_GPIO_2V5, + AXP192_GPIO_2V6, + AXP192_GPIO_2V7, + AXP192_GPIO_2V8, + AXP192_GPIO_2V9, + AXP192_GPIO_3V0, + AXP192_GPIO_3V1, + AXP192_GPIO_3V2, + AXP192_GPIO_3V3, +} axp192_gpio_voltage_t; + +typedef enum { + AXP1XX_CHARGE_CUR_100MA, + AXP1XX_CHARGE_CUR_190MA, + AXP1XX_CHARGE_CUR_280MA, + AXP1XX_CHARGE_CUR_360MA, + AXP1XX_CHARGE_CUR_450MA, + AXP1XX_CHARGE_CUR_550MA, + AXP1XX_CHARGE_CUR_630MA, + AXP1XX_CHARGE_CUR_700MA, + AXP1XX_CHARGE_CUR_780MA, + AXP1XX_CHARGE_CUR_880MA, + AXP1XX_CHARGE_CUR_960MA, + AXP1XX_CHARGE_CUR_1000MA, + AXP1XX_CHARGE_CUR_1080MA, + AXP1XX_CHARGE_CUR_1160MA, + AXP1XX_CHARGE_CUR_1240MA, + AXP1XX_CHARGE_CUR_1320MA, +} axp1xx_charge_current_t; + +typedef uint8_t (*axp_com_fptr_t)(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t len); + + +/** + * A common baseclass for any component that can provide a battery charge level + */ +class HasBatteryLevel { +public: + /** + * Battery state of charge, from 0 to 100 or -1 for unknown + */ + virtual int getBattPercentage() { return -1; } + + /** + * The raw voltage of the battery or NAN if unknown + */ + virtual float getBattVoltage() { return NAN; } + + /** + * return true if there is a battery installed in this unit + */ + virtual bool isBatteryConnect() { return false; } + + virtual bool isVBUSPlug() { return false; } + virtual bool isChargeing() { return false; } +}; + +class AXP20X_Class : public HasBatteryLevel +{ +public: + int begin(TwoWire &port = Wire, uint8_t addr = AXP202_SLAVE_ADDRESS, bool isAxp173 = false); + int begin(axp_com_fptr_t read_cb, axp_com_fptr_t write_cb, uint8_t addr = AXP202_SLAVE_ADDRESS, bool isAxp173 = false); + + // Power Output Control + int setPowerOutPut(uint8_t ch, bool en); + + bool isBatteryConnect(); + bool isChargeing(); + bool isLDO2Enable(); + bool isLDO3Enable(); + bool isLDO4Enable(); + bool isDCDC3Enable(); + bool isDCDC2Enable(); + bool isChargeingEnable(); + bool isVBUSPlug(); + bool isExtenEnable(); + + //Only axp192 chip + bool isDCDC1Enable(); + + + //IRQ Status + bool isAcinOverVoltageIRQ(); + bool isAcinPlugInIRQ(); + bool isAcinRemoveIRQ(); + bool isVbusOverVoltageIRQ(); + bool isVbusPlugInIRQ(); + bool isVbusRemoveIRQ(); + bool isVbusLowVHOLDIRQ(); + + bool isBattPlugInIRQ(); + bool isBattRemoveIRQ(); + bool isBattEnterActivateIRQ(); + bool isBattExitActivateIRQ(); + bool isChargingIRQ(); + bool isChargingDoneIRQ(); + bool isBattTempLowIRQ(); + bool isBattTempHighIRQ(); + + bool isPEKShortPressIRQ(); + bool isPEKLongtPressIRQ(); + bool isTimerTimeoutIRQ(); + + //! Group4 ADC data + float getAcinVoltage(); + float getAcinCurrent(); + float getVbusVoltage(); + float getVbusCurrent(); + float getTemp(); + float getTSTemp(); + float getGPIO0Voltage(); + float getGPIO1Voltage(); + float getBattInpower(); + float getBattVoltage(); + float getBattChargeCurrent(); + float getBattDischargeCurrent(); + float getSysIPSOUTVoltage(); + uint32_t getBattChargeCoulomb(); + uint32_t getBattDischargeCoulomb(); + float getSettingChargeCurrent(); + + int setChargingTargetVoltage(axp_chargeing_vol_t param); + int enableChargeing(bool en); + + int adc1Enable(uint16_t params, bool en); + int adc2Enable(uint16_t params, bool en); + + int setTScurrent(axp_ts_pin_current_t current); + int setTSfunction(axp_ts_pin_function_t func); + int setTSmode(axp_ts_pin_mode_t mode); + + + int setTimer(uint8_t minutes); + int offTimer(); + int clearTimerStatus(); + /** + * param: axp202_startup_time_t or axp192_startup_time_t + */ + int setStartupTime(uint8_t param); + + /** + * param: axp_loonPress_time_t + */ + int setlongPressTime(uint8_t param); + + /** + * @param param: axp_poweroff_time_t + */ + int setShutdownTime(uint8_t param); + + int setTimeOutShutdown(bool en); + + int shutdown(); + + /** + * params: axp_irq_t + */ + int enableIRQ(uint64_t params, bool en); + int readIRQ(); + void clearIRQ(); + + int setDCDC1Voltage(uint16_t mv); //! Only AXP192 support and AXP173 + // return mv + uint16_t getDCDC1Voltage(); //! Only AXP192 support and AXP173 + + // ----------------- + + /* + !! Chip resource table + | CHIP | AXP173 | AXP192 | AXP202 | + | -------- | ---------------- | ---------------- | ---------------- | + | DC1 | 0v7~3v5 /1200mA | 0v7~3v5 /1200mA | X | + | DC2 | 0v7~2v275/1600mA | 0v7~2v275/1600mA | 0v7~2v275/1600mA | + | DC3 | X | 0v7~3v5 /700mA | 0v7~3v5 /1200mA | + | LDO1 | 3v3 /30mA | 3v3 /30mA | 3v3 /30mA | + | LDO2 | 1v8~3v3 /200mA | 1v8~3v3 /200mA | 1v8~3v3 /200mA | + | LDO3 | 1v8~3v3 /200mA | 1v8~3v3 /200mA | 0v7~3v3 /200mA | + | LDO4 | 0v7~3v5 /500mA | X | 1v8~3v3 /200mA | + | LDO5/IO0 | X | 1v8~3v3 /50mA | 1v8~3v3 /50mA | + */ + int setDCDC2Voltage(uint16_t mv); + uint16_t getDCDC2Voltage(); + + int setDCDC3Voltage(uint16_t mv); + uint16_t getDCDC3Voltage(); + + int setLDO2Voltage(uint16_t mv); + uint16_t getLDO2Voltage(); + + int setLDO3Voltage(uint16_t mv); + uint16_t getLDO3Voltage(); + + + int setLDO4Voltage(axp_ldo4_table_t param); //! Only axp202 support + int setLDO4Voltage(uint16_t mv); //! Only axp173 support + + // return mv + uint16_t getLDO4Voltage(); //! Only axp173/axp202 support + + + /** + * @param mode: axp_chgled_mode_t + */ + int setChgLEDMode(axp_chgled_mode_t mode); + int setChgLEDModeCharging(); + + /** + * @param mode: axp202_ldo3_mode_t + */ + int setLDO3Mode(uint8_t mode); //! Only AXP202 support + + int getBattPercentage(); + + int debugCharging(); + int debugStatus(); + int limitingOff(); + + int setAdcSamplingRate(axp_adc_sampling_rate_t rate); + uint8_t getAdcSamplingRate(); + float getCoulombData(); + uint8_t getCoulombRegister(); + int setCoulombRegister(uint8_t val); + int EnableCoulombcounter(void); + int DisableCoulombcounter(void); + int StopCoulombcounter(void); + int ClearCoulombcounter(void); + + + int setGPIOMode(axp_gpio_t gpio, axp_gpio_mode_t mode); + int setGPIOIrq(axp_gpio_t gpio, axp_gpio_irq_t irq); + int setLDO5Voltage(axp_ldo5_table_t vol); + + int gpioWrite(axp_gpio_t gpio, uint8_t vol); + int gpioRead(axp_gpio_t gpio); + + // When the chip is axp192 / 173, the allowed values are 0 ~ 15, corresponding to the axp1xx_charge_current_t enumeration + // When the chip is axp202 allows maximum charging current of 1800mA, minimum 300mA + int getChargeControlCur(); + int setChargeControlCur(uint16_t mA); + +private: + uint16_t _getRegistH8L5(uint8_t regh8, uint8_t regl5) + { + uint8_t hv, lv; + _readByte(regh8, 1, &hv); + _readByte(regl5, 1, &lv); + return (hv << 5) | (lv & 0x1F); + } + + uint16_t _getRegistResult(uint8_t regh8, uint8_t regl4) + { + uint8_t hv, lv; + _readByte(regh8, 1, &hv); + _readByte(regl4, 1, &lv); + return (hv << 4) | (lv & 0x0F); + } + + int _readByte(uint8_t reg, uint8_t nbytes, uint8_t *data) + { + if (_read_cb != nullptr) { + return _read_cb(_address, reg, data, nbytes); + } + if (nbytes == 0 || !data) + return -1; + _i2cPort->beginTransmission(_address); + _i2cPort->write(reg); + _i2cPort->endTransmission(); + _i2cPort->requestFrom(_address, nbytes); + uint8_t index = 0; + while (_i2cPort->available()) + data[index++] = _i2cPort->read(); + return 0; + } + + int _writeByte(uint8_t reg, uint8_t nbytes, uint8_t *data) + { + if (_write_cb != nullptr) { + return _write_cb(_address, reg, data, nbytes); + } + if (nbytes == 0 || !data) + return -1; + _i2cPort->beginTransmission(_address); + _i2cPort->write(reg); + for (uint8_t i = 0; i < nbytes; i++) { + _i2cPort->write(data[i]); + } + _i2cPort->endTransmission(); + return 0; + } + + int _setGpioInterrupt(uint8_t *val, int mode, bool en); + int _axp_probe(); + int _axp_irq_mask(axp_gpio_irq_t irq); + + int _axp192_gpio_set(axp_gpio_t gpio, axp_gpio_mode_t mode); + int _axp192_gpio_0_select( axp_gpio_mode_t mode); + int _axp192_gpio_1_select( axp_gpio_mode_t mode); + int _axp192_gpio_3_select( axp_gpio_mode_t mode); + int _axp192_gpio_4_select( axp_gpio_mode_t mode); + + int _axp202_gpio_set(axp_gpio_t gpio, axp_gpio_mode_t mode); + int _axp202_gpio_0_select( axp_gpio_mode_t mode); + int _axp202_gpio_1_select( axp_gpio_mode_t mode); + int _axp202_gpio_2_select( axp_gpio_mode_t mode); + int _axp202_gpio_3_select( axp_gpio_mode_t mode); + int _axp202_gpio_irq_set(axp_gpio_t gpio, axp_gpio_irq_t irq); + int _axp202_gpio_write(axp_gpio_t gpio, uint8_t val); + int _axp202_gpio_read(axp_gpio_t gpio); + + + static const uint8_t startupParams[], longPressParams[], shutdownParams[], targetVolParams[]; + static uint8_t _outputReg; + uint8_t _address, _irq[5], _chip_id, _gpio[4]; + bool _init = false; + axp_com_fptr_t _read_cb = nullptr; + axp_com_fptr_t _write_cb = nullptr; + TwoWire *_i2cPort; + bool _isAxp173; +}; diff --git a/lib/lvgl_esp32_drivers/lvgl_helpers.c b/lib/lvgl_esp32_drivers/lvgl_helpers.c new file mode 100644 index 0000000..6875497 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_helpers.c @@ -0,0 +1,241 @@ +/** + * @file lvgl_helpers.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "sdkconfig.h" +#include "lv_conf.h" +#include "lvgl_helpers.h" +#include "esp_log.h" + +#include "lvgl_tft/disp_spi.h" +#include "lvgl_touch/tp_spi.h" + +#include "lvgl_spi_conf.h" +#include "lvgl_i2c_conf.h" + +#include "driver/i2c.h" + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "src/lv_core/lv_refr.h" +#else +#include "lvgl/src/lv_core/lv_refr.h" +#endif + +/********************* + * DEFINES + *********************/ + + #define TAG "lvgl_helpers" + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/* Interface and driver initialization */ +void lvgl_driver_init(void) +{ + ESP_LOGI(TAG, "Display hor size: %d, ver size: %d", LV_HOR_RES_MAX, LV_VER_RES_MAX); + ESP_LOGI(TAG, "Display buffer size: %d", DISP_BUF_SIZE); + +#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) + ESP_LOGI(TAG, "Initializing SPI master for FT81X"); + + lvgl_spi_driver_init(TFT_SPI_HOST, + DISP_SPI_MISO, DISP_SPI_MOSI, DISP_SPI_CLK, + SPI_BUS_MAX_TRANSFER_SZ, 1, + DISP_SPI_IO2, DISP_SPI_IO3); + + disp_spi_add_device(TFT_SPI_HOST); + disp_driver_init(); + +#if defined (CONFIG_LV_TOUCH_CONTROLLER_FT81X) + touch_driver_init(); +#endif + + return; +#endif + +#if defined (SHARED_SPI_BUS) + ESP_LOGI(TAG, "Initializing shared SPI master"); + + lvgl_spi_driver_init(TFT_SPI_HOST, + TP_SPI_MISO, DISP_SPI_MOSI, DISP_SPI_CLK, + SPI_BUS_MAX_TRANSFER_SZ, 1, + -1, -1); + + disp_spi_add_device(TFT_SPI_HOST); + tp_spi_add_device(TOUCH_SPI_HOST); + + disp_driver_init(); + touch_driver_init(); + + return; +#endif + +#if defined (SHARED_I2C_BUS) + ESP_LOGI(TAG, "Initializing shared I2C master"); + + lvgl_i2c_driver_init(DISP_I2C_PORT, + DISP_I2C_SDA, DISP_I2C_SCL, + DISP_I2C_SPEED_HZ); + + disp_driver_init(); + touch_driver_init(); + + return; +#endif + +/* Display controller initialization */ +#if defined CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI + ESP_LOGI(TAG, "Initializing SPI master for display"); + + lvgl_spi_driver_init(TFT_SPI_HOST, + DISP_SPI_MISO, DISP_SPI_MOSI, DISP_SPI_CLK, + SPI_BUS_MAX_TRANSFER_SZ, 1, + DISP_SPI_IO2, DISP_SPI_IO3); + + disp_spi_add_device(TFT_SPI_HOST); + + disp_driver_init(); +#elif defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_I2C) + ESP_LOGI(TAG, "Initializing I2C master for display"); + /* Init the i2c master on the display driver code */ + lvgl_i2c_driver_init(DISP_I2C_PORT, + DISP_I2C_SDA, DISP_I2C_SCL, + DISP_I2C_SPEED_HZ); + + disp_driver_init(); +#else +#error "No protocol defined for display controller" +#endif + +/* Touch controller initialization */ +#if CONFIG_LV_TOUCH_CONTROLLER != TOUCH_CONTROLLER_NONE + #if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI) + ESP_LOGI(TAG, "Initializing SPI master for touch"); + + lvgl_spi_driver_init(TOUCH_SPI_HOST, + TP_SPI_MISO, TP_SPI_MOSI, TP_SPI_CLK, + 0 /* Defaults to 4094 */, 2, + -1, -1); + + tp_spi_add_device(TOUCH_SPI_HOST); + + touch_driver_init(); + #elif defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_I2C) + ESP_LOGI(TAG, "Initializing I2C master for touch"); + + lvgl_i2c_driver_init(TOUCH_I2C_PORT, + TOUCH_I2C_SDA, TOUCH_I2C_SCL, + TOUCH_I2C_SPEED_HZ); + + touch_driver_init(); + #elif defined (CONFIG_LV_TOUCH_DRIVER_ADC) + touch_driver_init(); + #elif defined (CONFIG_LV_TOUCH_DRIVER_DISPLAY) + touch_driver_init(); + #else + #error "No protocol defined for touch controller" + #endif +#else +#endif +} + +/* Config the i2c master + * + * This should init the i2c master to be used on display and touch controllers. + * So we should be able to know if the display and touch controllers shares the + * same i2c master. + */ +bool lvgl_i2c_driver_init(int port, int sda_pin, int scl_pin, int speed_hz) +{ + esp_err_t err; + + ESP_LOGI(TAG, "Initializing I2C master port %d...", port); + ESP_LOGI(TAG, "SDA pin: %d, SCL pin: %d, Speed: %d (Hz)", + sda_pin, scl_pin, speed_hz); + + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = sda_pin, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = scl_pin, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = speed_hz, + }; + + ESP_LOGI(TAG, "Setting I2C master configuration..."); + err = i2c_param_config(port, &conf); + assert(ESP_OK == err); + + ESP_LOGI(TAG, "Installing I2C master driver..."); + err = i2c_driver_install(port, + I2C_MODE_MASTER, + 0, 0 /*I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE */, + 0 /* intr_alloc_flags */); + assert(ESP_OK == err); + + return ESP_OK != err; +} + +/* Initialize spi bus master */ +bool lvgl_spi_driver_init(int host, + int miso_pin, int mosi_pin, int sclk_pin, + int max_transfer_sz, + int dma_channel, + int quadwp_pin, int quadhd_pin) +{ +#if defined (CONFIG_IDF_TARGET_ESP32) + assert((SPI_HOST <= host) && (VSPI_HOST >= host)); + const char *spi_names[] = { + "SPI_HOST", "HSPI_HOST", "VSPI_HOST" + }; +#elif defined (CONFIG_IDF_TARGET_ESP32S2) + assert((SPI_HOST <= host) && (HSPI_HOST >= host)); + const char *spi_names[] = { + "SPI_HOST", "", "" + }; +#endif + + ESP_LOGI(TAG, "Configuring SPI host %s (%d)", spi_names[host], host); + ESP_LOGI(TAG, "MISO pin: %d, MOSI pin: %d, SCLK pin: %d, IO2/WP pin: %d, IO3/HD pin: %d", + miso_pin, mosi_pin, sclk_pin, quadwp_pin, quadhd_pin); + + ESP_LOGI(TAG, "Max transfer size: %d (bytes)", max_transfer_sz); + + spi_bus_config_t buscfg = { + .miso_io_num = miso_pin, + .mosi_io_num = mosi_pin, + .sclk_io_num = sclk_pin, + .quadwp_io_num = quadwp_pin, + .quadhd_io_num = quadhd_pin, + .max_transfer_sz = max_transfer_sz + }; + + ESP_LOGI(TAG, "Initializing SPI bus..."); + esp_err_t ret = spi_bus_initialize(host, &buscfg, dma_channel); + assert(ret == ESP_OK); + + return ESP_OK != ret; +} + diff --git a/lib/lvgl_esp32_drivers/lvgl_helpers.h b/lib/lvgl_esp32_drivers/lvgl_helpers.h new file mode 100644 index 0000000..54b4566 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_helpers.h @@ -0,0 +1,85 @@ +/** + * @file lvgl_helpers.h + */ + +#ifndef LVGL_HELPERS_H +#define LVGL_HELPERS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include + +#include "lvgl_spi_conf.h" +#include "lvgl_tft/disp_driver.h" +#include "lvgl_touch/touch_driver.h" + +/********************* + * DEFINES + *********************/ +#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789) +#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S +#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357 +#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107 +#define DISP_BUF_SIZE (CONFIG_LV_DISPLAY_WIDTH*CONFIG_LV_DISPLAY_HEIGHT) +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481 +#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486 +#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488 +#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341 +#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 64) +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306 +#define DISP_BUF_SIZE (CONFIG_LV_DISPLAY_WIDTH*CONFIG_LV_DISPLAY_HEIGHT) +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) +#define DISP_BUF_LINES 40 +#define DISP_BUF_SIZE (LV_HOR_RES_MAX * DISP_BUF_LINES) +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820) +#define DISP_BUF_SIZE (CONFIG_LV_DISPLAY_HEIGHT * IL3820_COLUMNS) +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875 +#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01) +#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A) +#define DISP_BUF_SIZE ((CONFIG_LV_DISPLAY_HEIGHT * CONFIG_LV_DISPLAY_WIDTH) / 8) // 5KB +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D) +#define DISP_BUF_SIZE ((CONFIG_LV_DISPLAY_HEIGHT * CONFIG_LV_DISPLAY_WIDTH) / 8) // 2888 bytes +#else +#error "No display controller selected" +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/* Initialize detected SPI and I2C bus and devices */ +void lvgl_driver_init(void); + +/* Initialize SPI master */ +bool lvgl_spi_driver_init(int host, int miso_pin, int mosi_pin, int sclk_pin, + int max_transfer_sz, int dma_channel, int quadwp_pin, int quadhd_pin); +/* Initialize I2C master */ +bool lvgl_i2c_driver_init(int port, int sda_pin, int scl_pin, int speed); + +/********************** + * MACROS + **********************/ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LVGL_HELPERS_H */ diff --git a/lib/lvgl_esp32_drivers/lvgl_i2c_conf.h b/lib/lvgl_esp32_drivers/lvgl_i2c_conf.h new file mode 100644 index 0000000..cf8ac45 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_i2c_conf.h @@ -0,0 +1,116 @@ +/** + * @file lvgl_i2c_config.h + */ + +#ifndef LVGL_I2C_CONF_H +#define LVGL_I2C_CONF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +/********************* + * DEFINES + *********************/ + +/* TODO: Define the I2C bus clock based on the selected display or touch + * controllers. */ + +/* Do both display and touch controllers uses I2C? */ +#if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_I2C) && \ + defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_I2C) + +#if defined (CONFIG_LV_DISPLAY_I2C_PORT_0) && \ + defined (CONFIG_LV_TOUCH_I2C_PORT_0) +#define SHARED_I2C_PORT +#define DISP_I2C_PORT I2C_NUM_0 +#endif + +#if defined (CONFIG_LV_DISPLAY_I2C_PORT_1) && \ + defined (CONFIG_LV_TOUCH_I2C_PORT_1) +#define SHARED_I2C_PORT +#define DISP_I2C_PORT I2C_NUM_1 +#endif + +#if !defined (SHARED_I2C_PORT) +#endif +#endif + +#if defined (SHARED_I2C_PORT) +/* If the port is shared the display and touch controllers must use the same + * SCL and SDA pins, otherwise let the user know with an error. */ +#if (CONFIG_LV_DISP_PIN_SDA != CONFIG_LV_TOUCH_I2C_SDA) || \ + (CONFIG_LV_DISP_PIN_SCL != CONFIG_LV_TOUCH_I2C_SCL) +#error "To share I2C port you need to choose the same SDA and SCL pins on both display and touch configurations" +#endif + +#define DISP_I2C_SDA CONFIG_LV_DISP_PIN_SDA +#define DISP_I2C_SCL CONFIG_LV_DISP_PIN_SCL +#define DISP_I2C_ORIENTATION TFT_ORIENTATION_LANDSCAPE + +/* Setting the I2C speed to the slowest one */ +#if DISP_I2C_SPEED_HZ < TOUCH_I2C_SPEED_HZ +#define DISP_I2C_SPEED_HZ 400000 /* DISP_I2C_SPEED_HZ */ +#else +#define DISP_I2C_SPEED_HZ 400000 /* DISP_I2C_SPEED_HZ */ +#endif + +#else + +/* lets check if the touch controller uses I2C... */ +#if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_I2C) +#if defined (CONFIG_LV_TOUCH_I2C_PORT_0) +#define TOUCH_I2C_PORT I2C_NUM_0 +#else +#define TOUCH_I2C_PORT I2C_NUM_1 +#endif +#define TOUCH_I2C_SDA CONFIG_LV_TOUCH_I2C_SDA +#define TOUCH_I2C_SCL CONFIG_LV_TOUCH_I2C_SCL +#define TOUCH_I2C_SPEED_HZ 400000 +#endif + +/* lets check if the display controller uses I2C... */ +#if defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_I2C) +#if defined (CONFIG_LV_DISPLAY_I2C_PORT_0) +#define DISP_I2C_PORT I2C_NUM_0 +#else +#define DISP_I2C_PORT I2C_NUM_1 +#endif + +#define DISP_I2C_SDA CONFIG_LV_DISP_PIN_SDA +#define DISP_I2C_SCL CONFIG_LV_DISP_PIN_SCL +#define DISP_I2C_ORIENTATION TFT_ORIENTATION_LANDSCAPE +#define DISP_I2C_SPEED_HZ 400000 +#endif + +#endif + +/********************** + * TYPEDEFS + **********************/ + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + + +/********************** + * MACROS + **********************/ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LVGL_I2C_CONF_H*/ diff --git a/lib/lvgl_esp32_drivers/lvgl_spi_conf.h b/lib/lvgl_esp32_drivers/lvgl_spi_conf.h new file mode 100644 index 0000000..16e63b4 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_spi_conf.h @@ -0,0 +1,198 @@ +/** + * @file lvgl_spi_conf.h + * + */ + +#ifndef LVGL_SPI_CONF_H +#define LVGL_SPI_CONF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ +// DISPLAY PINS +#define DISP_SPI_MOSI CONFIG_LV_DISP_SPI_MOSI +#if defined (CONFIG_LV_DISPLAY_USE_SPI_MISO) + #define DISP_SPI_MISO CONFIG_LV_DISP_SPI_MISO + #define DISP_SPI_INPUT_DELAY_NS CONFIG_LV_DISP_SPI_INPUT_DELAY_NS +#else + #define DISP_SPI_MISO (-1) + #define DISP_SPI_INPUT_DELAY_NS (0) +#endif +#if defined(CONFIG_LV_DISP_SPI_IO2) +#define DISP_SPI_IO2 CONFIG_LV_DISP_SPI_IO2 +#else +#define DISP_SPI_IO2 (-1) +#endif +#if defined(CONFIG_LV_DISP_SPI_IO3) +#define DISP_SPI_IO3 CONFIG_LV_DISP_SPI_IO3 +#else +#define DISP_SPI_IO3 (-1) +#endif +#define DISP_SPI_CLK CONFIG_LV_DISP_SPI_CLK +#if defined (CONFIG_LV_DISPLAY_USE_SPI_CS) + #define DISP_SPI_CS CONFIG_LV_DISP_SPI_CS +#else + #define DISP_SPI_CS (-1) +#endif + +/* Define TOUCHPAD PINS when selecting a touch controller */ +#if !defined (CONFIG_LV_TOUCH_CONTROLLER_NONE) + +/* Handle FT81X special case */ +#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) && \ + defined (CONFIG_LV_TOUCH_CONTROLLER_FT81X) + + #define TP_SPI_MOSI CONFIG_LV_DISP_SPI_MOSI + #define TP_SPI_MISO CONFIG_LV_DISP_SPI_MISO + #define TP_SPI_CLK CONFIG_LV_DISP_SPI_CLK + #define TP_SPI_CS CONFIG_LV_DISP_SPI_CS +#else + #define TP_SPI_MOSI CONFIG_LV_TOUCH_SPI_MOSI + #define TP_SPI_MISO CONFIG_LV_TOUCH_SPI_MISO + #define TP_SPI_CLK CONFIG_LV_TOUCH_SPI_CLK + #define TP_SPI_CS CONFIG_LV_TOUCH_SPI_CS +#endif +#endif + +#define ENABLE_TOUCH_INPUT CONFIG_LV_ENABLE_TOUCH + +#if defined (CONFIG_LV_TFT_DISPLAY_SPI_HSPI) +#define TFT_SPI_HOST HSPI_HOST +#elif defined (CONFIG_LV_TFT_DISPLAY_SPI_VSPI) +#define TFT_SPI_HOST VSPI_HOST +#elif defined (CONFIG_LV_TFT_DISPLAY_SPI_FSPI) +#define TFT_SPI_HOST FSPI_HOST +#endif + +#if defined (CONFIG_LV_TFT_DISPLAY_SPI_HALF_DUPLEX) +#define DISP_SPI_HALF_DUPLEX +#else +#define DISP_SPI_FULL_DUPLEX +#endif + +#if defined (CONFIG_LV_TFT_DISPLAY_SPI_TRANS_MODE_DIO) +#define DISP_SPI_TRANS_MODE_DIO +#elif defined (CONFIG_LV_TFT_DISPLAY_SPI_TRANS_MODE_QIO) +#define DISP_SPI_TRANS_MODE_QIO +#else +#define DISP_SPI_TRANS_MODE_SIO +#endif + +#if defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_HSPI) +#define TOUCH_SPI_HOST HSPI_HOST +#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_VSPI) +#define TOUCH_SPI_HOST VSPI_HOST +#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_FSPI) +#define TOUCH_SPI_HOST FSPI_HOST +#endif + +/* Handle the FT81X Special case */ +#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) + +#if defined (CONFIG_LV_TOUCH_CONTROLLER_FT81X) +#define SHARED_SPI_BUS +#else +/* Empty */ +#endif + +#else +// Detect the use of a shared SPI Bus and verify the user specified the same SPI bus for both touch and tft +#if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI) && TP_SPI_MOSI == DISP_SPI_MOSI && TP_SPI_CLK == DISP_SPI_CLK +#if TFT_SPI_HOST != TOUCH_SPI_HOST +#error You must specify the same SPI host (HSPI, VSPI or FSPI) for both display and touch driver +#endif + +#define SHARED_SPI_BUS +#endif + +#endif + +/********************** + * TYPEDEFS + **********************/ +#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488) + +#define SPI_BUS_MAX_TRANSFER_SZ (DISP_BUF_SIZE * 3) + +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820) || \ + defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A) + +#define SPI_BUS_MAX_TRANSFER_SZ (DISP_BUF_SIZE * 2) + +#else +#define SPI_BUS_MAX_TRANSFER_SZ (DISP_BUF_SIZE * 2) +#endif + +#if defined (CONFIG_LV_TFT_USE_CUSTOM_SPI_CLK_DIVIDER) +#define SPI_TFT_CLOCK_SPEED_HZ ((80 * 1000 * 1000) / CONFIG_LV_TFT_CUSTOM_SPI_CLK_DIVIDER) +#else +#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789) +#define SPI_TFT_CLOCK_SPEED_HZ (20*1000*1000) +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S) +#define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000) +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357) +#define SPI_TFT_CLOCK_SPEED_HZ (26*1000*1000) +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107) +#define SPI_TFT_CLOCK_SPEED_HZ (8*1000*1000) +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481) +#define SPI_TFT_CLOCK_SPEED_HZ (16*1000*1000) +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486) +#define SPI_TFT_CLOCK_SPEED_HZ (20*1000*1000) +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488) +#define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000) +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341) +#define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000) +#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) +#define SPI_TFT_CLOCK_SPEED_HZ (32*1000*1000) +#else +#define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000) +#endif + +#endif + + +#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789) +#define SPI_TFT_SPI_MODE (2) +#else +#define SPI_TFT_SPI_MODE (0) +#endif + +/* Touch driver */ +#if (CONFIG_LV_TOUCH_CONTROLLER == TOUCH_CONTROLLER_STMPE610) +#define SPI_TOUCH_CLOCK_SPEED_HZ (1*1000*1000) +#define SPI_TOUCH_SPI_MODE (1) +#else +#define SPI_TOUCH_CLOCK_SPEED_HZ (2*1000*1000) +#define SPI_TOUCH_SPI_MODE (0) +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + + +/********************** + * MACROS + **********************/ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LVGL_SPI_CONF_H*/ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/CMakeLists.txt b/lib/lvgl_esp32_drivers/lvgl_tft/CMakeLists.txt new file mode 100644 index 0000000..d52f35f --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/CMakeLists.txt @@ -0,0 +1,53 @@ +if(ESP_PLATFORM) + +set(SOURCES "disp_driver.c") + +# Include only the source file of the selected +# display controller. +if(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341) + list(APPEND SOURCES "ili9341.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481) + list(APPEND SOURCES "ili9481.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486) + list(APPEND SOURCES "ili9486.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488) + list(APPEND SOURCES "ili9488.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789) + list(APPEND SOURCES "st7789.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S) + list(APPEND SOURCES "st7735s.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357) + list(APPEND SOURCES "hx8357.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107) + list(APPEND SOURCES "sh1107.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306) + list(APPEND SOURCES "ssd1306.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) + list(APPEND SOURCES "EVE_commands.c") + list(APPEND SOURCES "FT81x.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820) + list(APPEND SOURCES "il3820.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A) + list(APPEND SOURCES "jd79653a.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D) + list(APPEND SOURCES "uc8151d.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875) + list(APPEND SOURCES "ra8875.c") +elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01) + list(APPEND SOURCES "GC9A01.c") +else() + message("DISPLAY CONTROLLER NOT DEFINED") +endif() + +if(CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI) + list(APPEND SOURCES "disp_spi.c") +endif() + +# Print the included source files +message("SOURCES contents: " "${SOURCES}") + +idf_component_register(SRCS ${SOURCES} + INCLUDE_DIRS . + REQUIRES lvgl) + +endif() diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/EVE.h b/lib/lvgl_esp32_drivers/lvgl_tft/EVE.h new file mode 100644 index 0000000..2f03dee --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/EVE.h @@ -0,0 +1,842 @@ +/* +@file EVE.h +@brief Contains FT80x/FT81x/BT81x API definitions +@version 4.1 LvGL edition +@date 2020-04-15 +@author Rudolph Riedel, David Jade + +@section LICENSE + +MIT License + +Copyright (c) 2016-2020 Rudolph Riedel and David Jade + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +@section History + +4.1 LvGL edition + + - This version is a heavily modified version of the MIT licensed FT81x code from https://github.com/RudolphRiedel/FT800-FT813 + This version is based on a fork by David Jade that added native SPI DMA support and stripped out non-ESP32 code. + It has also been trimmed down to suit LvGL's needs. Extra features can be enabled by defining FT81X_FULL +*/ + +#if defined (ESP_PLATFORM) +#include +#include +#endif + +#include "EVE_config.h" + +#ifndef EVE_H_ +#define EVE_H_ + + +#define DL_CLEAR 0x26000000UL /* requires OR'd arguments */ +#define DL_CLEAR_RGB 0x02000000UL /* requires OR'd arguments */ +#define DL_COLOR_RGB 0x04000000UL /* requires OR'd arguments */ +#define DL_POINT_SIZE 0x0D000000UL /* requires OR'd arguments */ +#define DL_END 0x21000000UL +#define DL_BEGIN 0x1F000000UL /* requires OR'd arguments */ +#define DL_DISPLAY 0x00000000UL + +#define CLR_COL 0x4 +#define CLR_STN 0x2 +#define CLR_TAG 0x1 + +/* SPI SIO/DIO/QIO tranfer widths */ +#define SPI_WIDTH_SIO 0x0 +#define SPI_WIDTH_DIO 0x1 +#define SPI_WIDTH_QIO 0x2 + + +/* Host commands */ +#define EVE_ACTIVE 0x00 /* place FT8xx in active state */ +#define EVE_STANDBY 0x41 /* place FT8xx in Standby (clk running) */ +#define EVE_SLEEP 0x42 /* place FT8xx in Sleep (clk off) */ +#define EVE_PWRDOWN 0x50 /* place FT8xx in Power Down (core off) */ +#define EVE_CLKEXT 0x44 /* select external clock source */ +#define EVE_CLKINT 0x48 /* select internal clock source */ +#define EVE_CORERST 0x68 /* reset core - all registers default and processors reset */ +#define EVE_CLK48M 0x62 /* select 48MHz PLL output */ +#define EVE_CLK36M 0x61 /* select 36MHz PLL output */ + + +/* defines used for graphics commands */ +#define EVE_NEVER 0UL +#define EVE_LESS 1UL +#define EVE_LEQUAL 2UL +#define EVE_GREATER 3UL +#define EVE_GEQUAL 4UL +#define EVE_EQUAL 5UL +#define EVE_NOTEQUAL 6UL +#define EVE_ALWAYS 7UL + + +/* Bitmap formats */ +#define EVE_ARGB1555 0UL +#define EVE_L1 1UL +#define EVE_L4 2UL +#define EVE_L8 3UL +#define EVE_RGB332 4UL +#define EVE_ARGB2 5UL +#define EVE_ARGB4 6UL +#define EVE_RGB565 7UL +#define EVE_PALETTED 8UL +#define EVE_TEXT8X8 9UL +#define EVE_TEXTVGA 10UL +#define EVE_BARGRAPH 11UL + + +/* Bitmap filter types */ +#define EVE_NEAREST 0UL +#define EVE_BILINEAR 1UL + + +/* Bitmap wrap types */ +#define EVE_BORDER 0UL +#define EVE_REPEAT 1UL + + +/* Stencil defines */ +#define EVE_KEEP 1UL +#define EVE_REPLACE 2UL +#define EVE_INCR 3UL +#define EVE_DECR 4UL +#define EVE_INVERT 5UL + + +/* Graphics display list swap defines */ +#define EVE_DLSWAP_DONE 0UL +#define EVE_DLSWAP_LINE 1UL +#define EVE_DLSWAP_FRAME 2UL + + +/* Interrupt bits */ +#define EVE_INT_SWAP 0x01 +#define EVE_INT_TOUCH 0x02 +#define EVE_INT_TAG 0x04 +#define EVE_INT_SOUND 0x08 +#define EVE_INT_PLAYBACK 0x10 +#define EVE_INT_CMDEMPTY 0x20 +#define EVE_INT_CMDFLAG 0x40 +#define EVE_INT_CONVCOMPLETE 0x80 + + +/* Touch mode */ +#define EVE_TMODE_OFF 0 +#define EVE_TMODE_ONESHOT 1 +#define EVE_TMODE_FRAME 2 +#define EVE_TMODE_CONTINUOUS 3 + + +/* Alpha blending */ +#define EVE_ZERO 0UL +#define EVE_ONE 1UL +#define EVE_SRC_ALPHA 2UL +#define EVE_DST_ALPHA 3UL +#define EVE_ONE_MINUS_SRC_ALPHA 4UL +#define EVE_ONE_MINUS_DST_ALPHA 5UL + + +/* Graphics primitives */ +#define EVE_BITMAPS 1UL +#define EVE_POINTS 2UL +#define EVE_LINES 3UL +#define EVE_LINE_STRIP 4UL +#define EVE_EDGE_STRIP_R 5UL +#define EVE_EDGE_STRIP_L 6UL +#define EVE_EDGE_STRIP_A 7UL +#define EVE_EDGE_STRIP_B 8UL +#define EVE_RECTS 9UL + + +/* Widget command */ +#define EVE_OPT_MONO 1 +#define EVE_OPT_NODL 2 +#define EVE_OPT_FLAT 256 +#define EVE_OPT_CENTERX 512 +#define EVE_OPT_CENTERY 1024 +#define EVE_OPT_CENTER (EVE_OPT_CENTERX | EVE_OPT_CENTERY) +#define EVE_OPT_NOBACK 4096 +#define EVE_OPT_NOTICKS 8192 +#define EVE_OPT_NOHM 16384 +#define EVE_OPT_NOPOINTER 16384 +#define EVE_OPT_NOSECS 32768 +#define EVE_OPT_NOHANDS 49152 +#define EVE_OPT_RIGHTX 2048 +#define EVE_OPT_SIGNED 256 + + +/* Defines related to inbuilt font */ +#define EVE_NUMCHAR_PERFONT (128L) /* number of font characters per bitmap handle */ +#define EVE_FONT_TABLE_SIZE (148L) /* size of the font table - utilized for loopup by the graphics engine */ +#define EVE_FONT_TABLE_POINTER (0xFFFFCUL) /* pointer to the inbuilt font tables starting from bitmap handle 16 */ + + +/* Audio sample type defines */ +#define EVE_LINEAR_SAMPLES 0UL /* 8bit signed samples */ +#define EVE_ULAW_SAMPLES 1UL /* 8bit ulaw samples */ +#define EVE_ADPCM_SAMPLES 2UL /* 4bit ima adpcm samples */ + + +/* Synthesized sound */ +#define EVE_SILENCE 0x00 +#define EVE_SQUAREWAVE 0x01 +#define EVE_SINEWAVE 0x02 +#define EVE_SAWTOOTH 0x03 +#define EVE_TRIANGLE 0x04 +#define EVE_BEEPING 0x05 +#define EVE_ALARM 0x06 +#define EVE_WARBLE 0x07 +#define EVE_CAROUSEL 0x08 +#define EVE_PIPS(n) (0x0F + (n)) +#define EVE_HARP 0x40 +#define EVE_XYLOPHONE 0x41 +#define EVE_TUBA 0x42 +#define EVE_GLOCKENSPIEL 0x43 +#define EVE_ORGAN 0x44 +#define EVE_TRUMPET 0x45 +#define EVE_PIANO 0x46 +#define EVE_CHIMES 0x47 +#define EVE_MUSICBOX 0x48 +#define EVE_BELL 0x49 +#define EVE_CLICK 0x50 +#define EVE_SWITCH 0x51 +#define EVE_COWBELL 0x52 +#define EVE_NOTCH 0x53 +#define EVE_HIHAT 0x54 +#define EVE_KICKDRUM 0x55 +#define EVE_POP 0x56 +#define EVE_CLACK 0x57 +#define EVE_CHACK 0x58 +#define EVE_MUTE 0x60 +#define EVE_UNMUTE 0x61 + + +/* Synthesized sound frequencies, midi note */ +#define EVE_MIDI_A0 21 +#define EVE_MIDI_A_0 22 +#define EVE_MIDI_B0 23 +#define EVE_MIDI_C1 24 +#define EVE_MIDI_C_1 25 +#define EVE_MIDI_D1 26 +#define EVE_MIDI_D_1 27 +#define EVE_MIDI_E1 28 +#define EVE_MIDI_F1 29 +#define EVE_MIDI_F_1 30 +#define EVE_MIDI_G1 31 +#define EVE_MIDI_G_1 32 +#define EVE_MIDI_A1 33 +#define EVE_MIDI_A_1 34 +#define EVE_MIDI_B1 35 +#define EVE_MIDI_C2 36 +#define EVE_MIDI_C_2 37 +#define EVE_MIDI_D2 38 +#define EVE_MIDI_D_2 39 +#define EVE_MIDI_E2 40 +#define EVE_MIDI_F2 41 +#define EVE_MIDI_F_2 42 +#define EVE_MIDI_G2 43 +#define EVE_MIDI_G_2 44 +#define EVE_MIDI_A2 45 +#define EVE_MIDI_A_2 46 +#define EVE_MIDI_B2 47 +#define EVE_MIDI_C3 48 +#define EVE_MIDI_C_3 49 +#define EVE_MIDI_D3 50 +#define EVE_MIDI_D_3 51 +#define EVE_MIDI_E3 52 +#define EVE_MIDI_F3 53 +#define EVE_MIDI_F_3 54 +#define EVE_MIDI_G3 55 +#define EVE_MIDI_G_3 56 +#define EVE_MIDI_A3 57 +#define EVE_MIDI_A_3 58 +#define EVE_MIDI_B3 59 +#define EVE_MIDI_C4 60 +#define EVE_MIDI_C_4 61 +#define EVE_MIDI_D4 62 +#define EVE_MIDI_D_4 63 +#define EVE_MIDI_E4 64 +#define EVE_MIDI_F4 65 +#define EVE_MIDI_F_4 66 +#define EVE_MIDI_G4 67 +#define EVE_MIDI_G_4 68 +#define EVE_MIDI_A4 69 +#define EVE_MIDI_A_4 70 +#define EVE_MIDI_B4 71 +#define EVE_MIDI_C5 72 +#define EVE_MIDI_C_5 73 +#define EVE_MIDI_D5 74 +#define EVE_MIDI_D_5 75 +#define EVE_MIDI_E5 76 +#define EVE_MIDI_F5 77 +#define EVE_MIDI_F_5 78 +#define EVE_MIDI_G5 79 +#define EVE_MIDI_G_5 80 +#define EVE_MIDI_A5 81 +#define EVE_MIDI_A_5 82 +#define EVE_MIDI_B5 83 +#define EVE_MIDI_C6 84 +#define EVE_MIDI_C_6 85 +#define EVE_MIDI_D6 86 +#define EVE_MIDI_D_6 87 +#define EVE_MIDI_E6 88 +#define EVE_MIDI_F6 89 +#define EVE_MIDI_F_6 90 +#define EVE_MIDI_G6 91 +#define EVE_MIDI_G_6 92 +#define EVE_MIDI_A6 93 +#define EVE_MIDI_A_6 94 +#define EVE_MIDI_B6 95 +#define EVE_MIDI_C7 96 +#define EVE_MIDI_C_7 97 +#define EVE_MIDI_D7 98 +#define EVE_MIDI_D_7 99 +#define EVE_MIDI_E7 100 +#define EVE_MIDI_F7 101 +#define EVE_MIDI_F_7 102 +#define EVE_MIDI_G7 103 +#define EVE_MIDI_G_7 104 +#define EVE_MIDI_A7 105 +#define EVE_MIDI_A_7 106 +#define EVE_MIDI_B7 107 +#define EVE_MIDI_C8 108 + + +/* GPIO bits */ +#define EVE_GPIO0 0 +#define EVE_GPIO1 1 /* default gpio pin for audio shutdown, 1 - enable, 0 - disable */ +#define EVE_GPIO7 7 /* default gpio pin for display enable, 1 - enable, 0 - disable */ + + +/* Display rotation */ +#define EVE_DISPLAY_0 0 /* 0 degrees rotation */ +#define EVE_DISPLAY_180 1 /* 180 degrees rotation */ + + +/* commands common to EVE/EVE2/EVE3 */ +#define CMD_APPEND 0xFFFFFF1E +#define CMD_BGCOLOR 0xFFFFFF09 +#define CMD_BUTTON 0xFFFFFF0D +#define CMD_CALIBRATE 0xFFFFFF15 +#define CMD_CLOCK 0xFFFFFF14 +#define CMD_COLDSTART 0xFFFFFF32 +#define CMD_DIAL 0xFFFFFF2D +#define CMD_DLSTART 0xFFFFFF00 +#define CMD_FGCOLOR 0xFFFFFF0A +#define CMD_GAUGE 0xFFFFFF13 +#define CMD_GETMATRIX 0xFFFFFF33 +#define CMD_GETPROPS 0xFFFFFF25 +#define CMD_GETPTR 0xFFFFFF23 +#define CMD_GRADCOLOR 0xFFFFFF34 +#define CMD_GRADIENT 0xFFFFFF0B +#define CMD_INFLATE 0xFFFFFF22 +#define CMD_INTERRUPT 0xFFFFFF02 +#define CMD_KEYS 0xFFFFFF0E +#define CMD_LOADIDENTITY 0xFFFFFF26 +#define CMD_LOADIMAGE 0xFFFFFF24 +#define CMD_LOGO 0xFFFFFF31 +#define CMD_MEMCPY 0xFFFFFF1D +#define CMD_MEMCRC 0xFFFFFF18 +#define CMD_MEMSET 0xFFFFFF1B +#define CMD_MEMWRITE 0xFFFFFF1A +#define CMD_MEMZERO 0xFFFFFF1C +#define CMD_NUMBER 0xFFFFFF2E +#define CMD_PROGRESS 0xFFFFFF0F +#define CMD_REGREAD 0xFFFFFF19 +#define CMD_ROTATE 0xFFFFFF29 +#define CMD_SCALE 0xFFFFFF28 +#define CMD_SCREENSAVER 0xFFFFFF2F +#define CMD_SCROLLBAR 0xFFFFFF11 +#define CMD_SETFONT 0xFFFFFF2B +#define CMD_SETMATRIX 0xFFFFFF2A +#define CMD_SKETCH 0xFFFFFF30 +#define CMD_SLIDER 0xFFFFFF10 +#define CMD_SNAPSHOT 0xFFFFFF1F +#define CMD_SPINNER 0xFFFFFF16 +#define CMD_STOP 0xFFFFFF17 +#define CMD_SWAP 0xFFFFFF01 +#define CMD_TEXT 0xFFFFFF0C +#define CMD_TOGGLE 0xFFFFFF12 +#define CMD_TRACK 0xFFFFFF2C +#define CMD_TRANSLATE 0xFFFFFF27 + + +/* the following are undocumented commands that therefore should not be used */ +#if 0 +#define CMD_CRC 0xFFFFFF03 +#define CMD_HAMMERAUX 0xFFFFFF04 +#define CMD_MARCH 0xFFFFFF05 +#define CMD_IDCT 0xFFFFFF06 +#define CMD_EXECUTE 0xFFFFFF07 +#define CMD_GETPOINT 0xFFFFFF08 +#define CMD_TOUCH_TRANSFORM 0xFFFFFF20 +#endif + + +/* FT8xx graphics engine specific macros useful for static display list generation */ +#define ALPHA_FUNC(func,ref) ((9UL<<24)|(((func)&7UL)<<8)|(((ref)&255UL)<<0)) +#define BEGIN(prim) ((31UL<<24)|(((prim)&15UL)<<0)) +#define BITMAP_HANDLE(handle) ((5UL<<24)|(((handle)&31UL)<<0)) +#define BITMAP_LAYOUT(format,linestride,height) ((7UL<<24)|(((format)&31UL)<<19)|(((linestride)&1023UL)<<9)|(((height)&511UL)<<0)) +#define BITMAP_SIZE(filter,wrapx,wrapy,width,height) ((8UL<<24)|(((filter)&1UL)<<20)|(((wrapx)&1UL)<<19)|(((wrapy)&1UL)<<18)|(((width)&511UL)<<9)|(((height)&511UL)<<0)) +#define BITMAP_TRANSFORM_A(a) ((21UL<<24)|(((a)&131071UL)<<0)) +#define BITMAP_TRANSFORM_B(b) ((22UL<<24)|(((b)&131071UL)<<0)) +#define BITMAP_TRANSFORM_C(c) ((23UL<<24)|(((c)&16777215UL)<<0)) +#define BITMAP_TRANSFORM_D(d) ((24UL<<24)|(((d)&131071UL)<<0)) +#define BITMAP_TRANSFORM_E(e) ((25UL<<24)|(((e)&131071UL)<<0)) +#define BITMAP_TRANSFORM_F(f) ((26UL<<24)|(((f)&16777215UL)<<0)) +#define BLEND_FUNC(src,dst) ((11UL<<24)|(((src)&7UL)<<3)|(((dst)&7UL)<<0)) +#define CALL(dest) ((29UL<<24)|(((dest)&65535UL)<<0)) +#define CELL(cell) ((6UL<<24)|(((cell)&127UL)<<0)) +#define CLEAR(c,s,t) ((38UL<<24)|(((c)&1UL)<<2)|(((s)&1UL)<<1)|(((t)&1UL)<<0)) +#define CLEAR_COLOR_A(alpha) ((15UL<<24)|(((alpha)&255UL)<<0)) +#define CLEAR_COLOR_RGB(red,green,blue) ((2UL<<24)|(((red)&255UL)<<16)|(((green)&255UL)<<8)|(((blue)&255UL)<<0)) +#define CLEAR_STENCIL(s) ((17UL<<24)|(((s)&255UL)<<0)) +#define CLEAR_TAG(s) ((18UL<<24)|(((s)&255UL)<<0)) +#define COLOR_A(alpha) ((16UL<<24)|(((alpha)&255UL)<<0)) +#define COLOR_MASK(r,g,b,a) ((32UL<<24)|(((r)&1UL)<<3)|(((g)&1UL)<<2)|(((b)&1UL)<<1)|(((a)&1UL)<<0)) +#define COLOR_RGB(red,green,blue) ((4UL<<24)|(((red)&255UL)<<16)|(((green)&255UL)<<8)|(((blue)&255UL)<<0)) +/* #define DISPLAY() ((0UL<<24)) */ +#define END() ((33UL<<24)) +#define JUMP(dest) ((30UL<<24)|(((dest)&65535UL)<<0)) +#define LINE_WIDTH(width) ((14UL<<24)|(((width)&4095UL)<<0)) +#define MACRO(m) ((37UL<<24)|(((m)&1UL)<<0)) +#define POINT_SIZE(size) ((13UL<<24)|(((size)&8191UL)<<0)) +#define RESTORE_CONTEXT() ((35UL<<24)) +#define RETURN() ((36UL<<24)) +#define SAVE_CONTEXT() ((34UL<<24)) +#define STENCIL_FUNC(func,ref,mask) ((10UL<<24)|(((func)&7UL)<<16)|(((ref)&255UL)<<8)|(((mask)&255UL)<<0)) +#define STENCIL_MASK(mask) ((19UL<<24)|(((mask)&255UL)<<0)) +#define STENCIL_OP(sfail,spass) ((12UL<<24)|(((sfail)&7UL)<<3)|(((spass)&7UL)<<0)) +#define TAG(s) ((3UL<<24)|(((s)&255UL)<<0)) +#define TAG_MASK(mask) ((20UL<<24)|(((mask)&1UL)<<0)) +#define VERTEX2F(x,y) ((1UL<<30)|(((x)&32767UL)<<15)|(((y)&32767UL)<<0)) +#define VERTEX2II(x,y,handle,cell) ((2UL<<30)|(((x)&511UL)<<21)|(((y)&511UL)<<12)|(((handle)&31UL)<<7)|(((cell)&127UL)<<0)) + + +/* ----------------- BT81x exclusive definitions -----------------*/ +#if defined (BT81X_ENABLE) + +#define EVE_GLFORMAT 31UL /* used with BITMAP_LAYOUT to indicate bitmap-format is specified by BITMAP_EXT_FORMAT */ + +#define DL_BITMAP_EXT_FORMAT 0x2E000000 /* requires OR'd arguments */ + +/* extended Bitmap formats */ +#define EVE_COMPRESSED_RGBA_ASTC_4x4_KHR 37808UL +#define EVE_COMPRESSED_RGBA_ASTC_5x4_KHR 37809UL +#define EVE_COMPRESSED_RGBA_ASTC_5x5_KHR 37810UL +#define EVE_COMPRESSED_RGBA_ASTC_6x5_KHR 37811UL +#define EVE_COMPRESSED_RGBA_ASTC_6x6_KHR 37812UL +#define EVE_COMPRESSED_RGBA_ASTC_8x5_KHR 37813UL +#define EVE_COMPRESSED_RGBA_ASTC_8x6_KHR 37814UL +#define EVE_COMPRESSED_RGBA_ASTC_8x8_KHR 37815UL +#define EVE_COMPRESSED_RGBA_ASTC_10x5_KHR 37816UL +#define EVE_COMPRESSED_RGBA_ASTC_10x6_KHR 37817UL +#define EVE_COMPRESSED_RGBA_ASTC_10x8_KHR 37818UL +#define EVE_COMPRESSED_RGBA_ASTC_10x10_KHR 37819UL +#define EVE_COMPRESSED_RGBA_ASTC_12x10_KHR 37820UL +#define EVE_COMPRESSED_RGBA_ASTC_12x12_KHR 37821UL + + +#define EVE_RAM_ERR_REPORT 0x309800UL /* max 128 bytes null terminated string */ +#define EVE_RAM_FLASH 0x800000UL +#define EVE_RAM_FLASH_POSTBLOB 0x801000UL + +#define EVE_OPT_FLASH 64UL +#define EVE_OPT_FORMAT 4096UL +#define EVE_OPT_FILL 8192UL + + +/* additional commands for BT81x */ +#define CMD_BITMAP_TRANSFORM 0xFFFFFF21 +#define CMD_SYNC 0xFFFFFF42 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_SYNC) */ +#define CMD_FLASHERASE 0xFFFFFF44 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHERASE) */ +#define CMD_FLASHWRITE 0xFFFFFF45 +#define CMD_FLASHREAD 0xFFFFFF46 +#define CMD_FLASHUPDATE 0xFFFFFF47 +#define CMD_FLASHDETACH 0xFFFFFF48 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHDETACH) */ +#define CMD_FLASHATTACH 0xFFFFFF49 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHATTACH) */ +#define CMD_FLASHFAST 0xFFFFFF4A +#define CMD_FLASHSPIDESEL 0xFFFFFF4B /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHSPIDESEL) */ +#define CMD_FLASHSPITX 0xFFFFFF4C +#define CMD_FLASHSPIRX 0xFFFFFF4D +#define CMD_FLASHSOURCE 0xFFFFFF4E +#define CMD_CLEARCACHE 0xFFFFFF4F /* does not need a dedicated function, just use EVE_cmd_dl(CMD_CLEARCACHE) */ +#define CMD_INFLATE2 0xFFFFFF50 +#define CMD_ROTATEAROUND 0xFFFFFF51 +#define CMD_RESETFONTS 0xFFFFFF52 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_RESETFONTS) */ +#define CMD_ANIMSTART 0xFFFFFF53 +#define CMD_ANIMSTOP 0xFFFFFF54 +#define CMD_ANIMXY 0xFFFFFF55 +#define CMD_ANIMDRAW 0xFFFFFF56 +#define CMD_GRADIENTA 0xFFFFFF57 +#define CMD_FILLWIDTH 0xFFFFFF58 +#define CMD_APPENDF 0xFFFFFF59 +#define CMD_ANIMFRAME 0xFFFFFF5A +#define CMD_VIDEOSTARTF 0xFFFFFF5F /* does not need a dedicated function, just use EVE_cmd_dl(CMD_VIDEOSTARTF) */ + +#if 0 +/* some undocumented commands for BT81x */ +#define CMD_NOP 0xFFFFFF5B +#define CMD_SHA1 0xFFFFFF5C +#define CMD_HMAC 0xFFFFFF5D +#define CMD_LAST_ 0xFFFFFF5E + +#endif + + +/* additional registers for BT81x */ +#define REG_ADAPTIVE_FRAMERATE 0x30257cUL +#define REG_PLAYBACK_PAUSE 0x3025ecUL +#define REG_FLASH_STATUS 0x3025f0UL +#define REG_FLASH_SIZE 0x309024UL +#define REG_PLAY_CONTROL 0x30914eUL +#define REG_COPRO_PATCH_DTR 0x309162UL + + +/* BT81x graphics engine specific macros */ +#define BITMAP_EXT_FORMAT(format) ((46UL<<24)|(((format)&65535UL)<<0)) +#define BITMAP_SWIZZLE(r,g,b,a) ((47UL<<24)|(((r)&7UL)<<9)|(((g)&7UL)<<6)|(((b)&7UL)<<3)|(((a)&7UL)<<0)) +#define BITMAP_SOURCE2(flash_or_ram, addr) ((1UL<<24)|((flash_or_ram) << 23)|(((addr)&8388607UL)<<0)) +#define INT_FRR() ((48UL<<24)) + +#undef BITMAP_TRANSFORM_A +#undef BITMAP_TRANSFORM_B +#undef BITMAP_TRANSFORM_D +#undef BITMAP_TRANSFORM_E + +#define BITMAP_TRANSFORM_A_EXT(p,v) ((21UL<<24)|(((p)&1UL)<<17)|(((v)&131071UL)<<0)) +#define BITMAP_TRANSFORM_B_EXT(p,v) ((22UL<<24)|(((p)&1UL)<<17)|(((v)&131071UL)<<0)) +#define BITMAP_TRANSFORM_D_EXT(p,v) ((24UL<<24)|(((p)&1UL)<<17)|(((v)&131071UL)<<0)) +#define BITMAP_TRANSFORM_E_EXT(p,v) ((25UL<<24)|(((p)&1UL)<<17)|(((v)&131071UL)<<0)) + +#define BITMAP_TRANSFORM_A(a) BITMAP_TRANSFORM_A_EXT(0,a) +#define BITMAP_TRANSFORM_B(b) BITMAP_TRANSFORM_B_EXT(0,b) +#define BITMAP_TRANSFORM_D(d) BITMAP_TRANSFORM_D_EXT(0,d) +#define BITMAP_TRANSFORM_E(e) BITMAP_TRANSFORM_E_EXT(0,e) + +#endif + +/* ----------------- FT81x / BT81x exclusive definitions -----------------*/ +#if defined (FT81X_ENABLE) + + +/* Host commands */ +#define EVE_CLKSEL 0x61 /* configure system clock */ +#define EVE_RST_PULSE 0x68 /* reset core - all registers default and processors reset */ +#define EVE_PINDRIVE 0x70 /* setup drive strength for various pins */ +#define EVE_PIN_PD_STATE 0x71 /* setup how pins behave during power down */ + + +/* Memory definitions */ +#define EVE_RAM_G 0x000000UL +#define EVE_ROM_CHIPID 0x0C0000UL +#define EVE_ROM_FONT 0x1E0000UL +#define EVE_ROM_FONT_ADDR 0x2FFFFCUL +#define EVE_RAM_DL 0x300000UL +#define EVE_RAM_REG 0x302000UL +#define EVE_RAM_CMD 0x308000UL + + +/* Memory buffer sizes */ +#define EVE_RAM_G_SIZE 1024*1024L +#define EVE_CMDFIFO_SIZE 4*1024L +#define EVE_RAM_DL_SIZE 8*1024L + + +/* various additional defines for FT81x */ +#define EVE_ADC_DIFFERENTIAL 1UL +#define EVE_ADC_SINGLE_ENDED 0UL + +#define EVE_INT_G8 18UL +#define EVE_INT_L8C 12UL +#define EVE_INT_VGA 13UL + +#define EVE_OPT_MEDIAFIFO 16UL +#define EVE_OPT_FULLSCREEN 8UL +#define EVE_OPT_NOTEAR 4UL +#define EVE_OPT_SOUND 32UL + +#define EVE_PALETTED565 14UL +#define EVE_PALETTED4444 15UL +#define EVE_PALETTED8 16UL +#define EVE_L2 17UL + + +/* additional commands for FT81x */ +#define CMD_MEDIAFIFO 0xFFFFFF39 +#define CMD_PLAYVIDEO 0xFFFFFF3A +#define CMD_ROMFONT 0xFFFFFF3F +#define CMD_SETBASE 0xFFFFFF38 +#define CMD_SETBITMAP 0xFFFFFF43 +#define CMD_SETFONT2 0xFFFFFF3B +#define CMD_SETROTATE 0xFFFFFF36 +#define CMD_SETSCRATCH 0xFFFFFF3C +#define CMD_SNAPSHOT2 0xFFFFFF37 +#define CMD_VIDEOFRAME 0xFFFFFF41 +#define CMD_VIDEOSTART 0xFFFFFF40 + + +/* the following are undocumented commands that therefore should not be used */ +#if 0 +#define CMD_CSKETCH 0xFFFFFF35 +#define CMD_INT_RAMSHARED 0xFFFFFF3D +#define CMD_INT_SWLOADIMAGE 0xFFFFFF3E +#endif + + +/* Register definitions */ +#define REG_ANA_COMP 0x302184UL /* only listed in datasheet */ +#define REG_BIST_EN 0x302174UL /* only listed in datasheet */ +#define REG_CLOCK 0x302008UL +#define REG_CMDB_SPACE 0x302574UL +#define REG_CMDB_WRITE 0x302578UL +#define REG_CMD_DL 0x302100UL +#define REG_CMD_READ 0x3020f8UL +#define REG_CMD_WRITE 0x3020fcUL +#define REG_CPURESET 0x302020UL +#define REG_CSPREAD 0x302068UL +#define REG_CTOUCH_EXTENDED 0x302108UL +#define REG_CTOUCH_TOUCH0_XY 0x302124UL /* only listed in datasheet */ +#define REG_CTOUCH_TOUCH4_X 0x30216cUL +#define REG_CTOUCH_TOUCH4_Y 0x302120UL +#define REG_CTOUCH_TOUCH1_XY 0x30211cUL +#define REG_CTOUCH_TOUCH2_XY 0x30218cUL +#define REG_CTOUCH_TOUCH3_XY 0x302190UL +#define REG_TOUCH_CONFIG 0x302168UL +#define REG_DATESTAMP 0x302564UL /* only listed in datasheet */ +#define REG_DITHER 0x302060UL +#define REG_DLSWAP 0x302054UL +#define REG_FRAMES 0x302004UL +#define REG_FREQUENCY 0x30200cUL +#define REG_GPIO 0x302094UL +#define REG_GPIOX 0x30209cUL +#define REG_GPIOX_DIR 0x302098UL +#define REG_GPIO_DIR 0x302090UL +#define REG_HCYCLE 0x30202cUL +#define REG_HOFFSET 0x302030UL +#define REG_HSIZE 0x302034UL +#define REG_HSYNC0 0x302038UL +#define REG_HSYNC1 0x30203cUL +#define REG_ID 0x302000UL +#define REG_INT_EN 0x3020acUL +#define REG_INT_FLAGS 0x3020a8UL +#define REG_INT_MASK 0x3020b0UL +#define REG_MACRO_0 0x3020d8UL +#define REG_MACRO_1 0x3020dcUL +#define REG_MEDIAFIFO_READ 0x309014UL /* only listed in programmers guide */ +#define REG_MEDIAFIFO_WRITE 0x309018UL /* only listed in programmers guide */ +#define REG_OUTBITS 0x30205cUL +#define REG_PCLK 0x302070UL +#define REG_PCLK_POL 0x30206cUL +#define REG_PLAY 0x30208cUL +#define REG_PLAYBACK_FORMAT 0x3020c4UL +#define REG_PLAYBACK_FREQ 0x3020c0UL +#define REG_PLAYBACK_LENGTH 0x3020b8UL +#define REG_PLAYBACK_LOOP 0x3020c8UL +#define REG_PLAYBACK_PLAY 0x3020ccUL +#define REG_PLAYBACK_READPTR 0x3020bcUL +#define REG_PLAYBACK_START 0x3020b4UL +#define REG_PWM_DUTY 0x3020d4UL +#define REG_PWM_HZ 0x3020d0UL +#define REG_RENDERMODE 0x302010UL /* only listed in datasheet */ +#define REG_ROTATE 0x302058UL +#define REG_SNAPFORMAT 0x30201cUL /* only listed in datasheet */ +#define REG_SNAPSHOT 0x302018UL /* only listed in datasheet */ +#define REG_SNAPY 0x302014UL /* only listed in datasheet */ +#define REG_SOUND 0x302088UL +#define REG_SPI_WIDTH 0x302188UL /* listed with false offset in programmers guide V1.1 */ +#define REG_SWIZZLE 0x302064UL +#define REG_TAG 0x30207cUL +#define REG_TAG_X 0x302074UL +#define REG_TAG_Y 0x302078UL +#define REG_TAP_CRC 0x302024UL /* only listed in datasheet */ +#define REG_TAP_MASK 0x302028UL /* only listed in datasheet */ +#define REG_TOUCH_ADC_MODE 0x302108UL +#define REG_TOUCH_CHARGE 0x30210cUL +#define REG_TOUCH_DIRECT_XY 0x30218cUL +#define REG_TOUCH_DIRECT_Z1Z2 0x302190UL +#define REG_TOUCH_MODE 0x302104UL +#define REG_TOUCH_OVERSAMPLE 0x302114UL +#define REG_TOUCH_RAW_XY 0x30211cUL +#define REG_TOUCH_RZ 0x302120UL +#define REG_TOUCH_RZTHRESH 0x302118UL +#define REG_TOUCH_SCREEN_XY 0x302124UL +#define REG_TOUCH_SETTLE 0x302110UL +#define REG_TOUCH_TAG 0x30212cUL +#define REG_TOUCH_TAG1 0x302134UL /* only listed in datasheet */ +#define REG_TOUCH_TAG1_XY 0x302130UL /* only listed in datasheet */ +#define REG_TOUCH_TAG2 0x30213cUL /* only listed in datasheet */ +#define REG_TOUCH_TAG2_XY 0x302138UL /* only listed in datasheet */ +#define REG_TOUCH_TAG3 0x302144UL /* only listed in datasheet */ +#define REG_TOUCH_TAG3_XY 0x302140UL /* only listed in datasheet */ +#define REG_TOUCH_TAG4 0x30214cUL /* only listed in datasheet */ +#define REG_TOUCH_TAG4_XY 0x302148UL /* only listed in datasheet */ +#define REG_TOUCH_TAG_XY 0x302128UL +#define REG_TOUCH_TRANSFORM_A 0x302150UL +#define REG_TOUCH_TRANSFORM_B 0x302154UL +#define REG_TOUCH_TRANSFORM_C 0x302158UL +#define REG_TOUCH_TRANSFORM_D 0x30215cUL +#define REG_TOUCH_TRANSFORM_E 0x302160UL +#define REG_TOUCH_TRANSFORM_F 0x302164UL +#define REG_TRACKER 0x309000UL /* only listed in programmers guide */ +#define REG_TRACKER_1 0x309004UL /* only listed in programmers guide */ +#define REG_TRACKER_2 0x309008UL /* only listed in programmers guide */ +#define REG_TRACKER_3 0x30900cUL /* only listed in programmers guide */ +#define REG_TRACKER_4 0x309010UL /* only listed in programmers guide */ +#define REG_TRIM 0x302180UL +#define REG_VCYCLE 0x302040UL +#define REG_VOFFSET 0x302044UL +#define REG_VOL_PB 0x302080UL +#define REG_VOL_SOUND 0x302084UL +#define REG_VSIZE 0x302048UL +#define REG_VSYNC0 0x30204cUL +#define REG_VSYNC1 0x302050UL + +#if 0 +#define REG_BUSYBITS 0x3020e8UL /* only listed as "reserved" in datasheet */ +#define REG_CRC 0x302178UL /* only listed as "reserved" in datasheet */ +#define REG_SPI_EARLY_TX 0x30217cUL /* only listed as "reserved" in datasheet */ +#define REG_ROMSUB_SEL 0x3020f0UL /* only listed as "reserved" in datasheet */ +#define REG_TOUCH_FAULT 0x302170UL /* only listed as "reserved" in datasheet */ +#endif + + +/* FT81x graphics engine specific macros useful for static display list generation */ + +/* beware, these are different to FTDIs implementation as these take the original values as parameters and not only the upper bits */ +#define BITMAP_LAYOUT_H(linestride,height) ((40UL<<24)|((((linestride&0xC00)>>10)&3UL)<<2)|((((height&0x600)>>9)&3UL)<<0)) +#define BITMAP_SIZE_H(width,height) ((41UL<<24)|((((width&0x600)>>9)&3UL)<<2)|((((height&0x600)>>9)&3UL)<<0)) + +#define BITMAP_SOURCE(addr) ((1UL<<24)|(((addr)&4194303UL)<<0)) +//#define NOP() ((45UL<<24)) +#define PALETTE_SOURCE(addr) ((42UL<<24)|(((addr)&4194303UL)<<0)) +#define SCISSOR_SIZE(width,height) ((28UL<<24)|(((width)&4095UL)<<12)|(((height)&4095UL)<<0)) +#define SCISSOR_XY(x,y) ((27UL<<24)|(((x)&2047UL)<<11)|(((y)&2047UL)<<0)) +#define VERTEX_FORMAT(frac) ((39UL<<24)|(((frac)&7UL)<<0)) +#define VERTEX_TRANSLATE_X(x) ((43UL<<24)|(((x)&131071UL)<<0)) +#define VERTEX_TRANSLATE_Y(y) ((44UL<<24)|(((y)&131071UL)<<0)) + + + +/* ----------------- FT80x exclusive definitions -----------------*/ +#else + +/* Memory definitions */ +#define EVE_RAM_G 0x000000UL +#define EVE_ROM_CHIPID 0x0C0000UL +#define EVE_ROM_FONT 0x0BB23CUL +#define EVE_ROM_FONT_ADDR 0x0FFFFCUL +#define EVE_RAM_DL 0x100000UL +#define EVE_RAM_PAL 0x102000UL +#define EVE_RAM_CMD 0x108000UL +#define EVE_RAM_SCREENSHOT 0x1C2000UL + + +/* Memory buffer sizes */ +#define EVE_RAM_G_SIZE 256*1024L +#define EVE_CMDFIFO_SIZE 4*1024L +#define EVE_RAM_DL_SIZE 8*1024L +#define EVE_RAM_PAL_SIZE 1*1024L + + +/* Register definitions */ +#define REG_ID 0x102400UL +#define REG_FRAMES 0x102404UL +#define REG_CLOCK 0x102408UL +#define REG_FREQUENCY 0x10240CUL +#define REG_SCREENSHOT_EN 0x102410UL +#define REG_SCREENSHOT_Y 0x102414UL +#define REG_SCREENSHOT_START 0x102418UL +#define REG_CPURESET 0x10241CUL +#define REG_TAP_CRC 0x102420UL +#define REG_TAP_MASK 0x102424UL +#define REG_HCYCLE 0x102428UL +#define REG_HOFFSET 0x10242CUL +#define REG_HSIZE 0x102430UL +#define REG_HSYNC0 0x102434UL +#define REG_HSYNC1 0x102438UL +#define REG_VCYCLE 0x10243CUL +#define REG_VOFFSET 0x102440UL +#define REG_VSIZE 0x102444UL +#define REG_VSYNC0 0x102448UL +#define REG_VSYNC1 0x10244CUL +#define REG_DLSWAP 0x102450UL +#define REG_ROTATE 0x102454UL +#define REG_OUTBITS 0x102458UL +#define REG_DITHER 0x10245CUL +#define REG_SWIZZLE 0x102460UL +#define REG_CSPREAD 0x102464UL +#define REG_PCLK_POL 0x102468UL +#define REG_PCLK 0x10246CUL +#define REG_TAG_X 0x102470UL +#define REG_TAG_Y 0x102474UL +#define REG_TAG 0x102478UL +#define REG_VOL_PB 0x10247CUL +#define REG_VOL_SOUND 0x102480UL +#define REG_SOUND 0x102484UL +#define REG_PLAY 0x102488UL +#define REG_GPIO_DIR 0x10248CUL +#define REG_GPIO 0x102490UL +#define REG_INT_FLAGS 0x102498UL +#define REG_INT_EN 0x10249CUL +#define REG_INT_MASK 0x1024A0UL +#define REG_PLAYBACK_START 0x1024A4UL +#define REG_PLAYBACK_LENGTH 0x1024A8UL +#define REG_PLAYBACK_READPTR 0x1024ACUL +#define REG_PLAYBACK_FREQ 0x1024B0UL +#define REG_PLAYBACK_FORMAT 0x1024B4UL +#define REG_PLAYBACK_LOOP 0x1024B8UL +#define REG_PLAYBACK_PLAY 0x1024BCUL +#define REG_PWM_HZ 0x1024C0UL +#define REG_PWM_DUTY 0x1024C4UL +#define REG_MACRO_0 0x1024C8UL +#define REG_MACRO_1 0x1024CCUL +#define REG_SCREENSHOT_BUSY 0x1024D8UL +#define REG_CMD_READ 0x1024E4UL +#define REG_CMD_WRITE 0x1024E8UL +#define REG_CMD_DL 0x1024ECUL +#define REG_TOUCH_MODE 0x1024F0UL +#define REG_TOUCH_ADC_MODE 0x1024F4UL +#define REG_TOUCH_CHARGE 0x1024F8UL +#define REG_TOUCH_SETTLE 0x1024FCUL +#define REG_TOUCH_OVERSAMPLE 0x102500UL +#define REG_TOUCH_RZTHRESH 0x102504UL +#define REG_TOUCH_RAW_XY 0x102508UL +#define REG_TOUCH_RZ 0x10250CUL +#define REG_TOUCH_SCREEN_XY 0x102510UL +#define REG_TOUCH_TAG_XY 0x102514UL +#define REG_TOUCH_TAG 0x102518UL +#define REG_TOUCH_TRANSFORM_A 0x10251CUL +#define REG_TOUCH_TRANSFORM_B 0x102520UL +#define REG_TOUCH_TRANSFORM_C 0x102524UL +#define REG_TOUCH_TRANSFORM_D 0x102528UL +#define REG_TOUCH_TRANSFORM_E 0x10252CUL +#define REG_TOUCH_TRANSFORM_F 0x102530UL +#define REG_SCREENSHOT_READ 0x102554UL +#define REG_TRIM 0x10256CUL +#define REG_TOUCH_DIRECT_XY 0x102574UL +#define REG_TOUCH_DIRECT_Z1Z2 0x102578UL +#define REG_TRACKER 0x109000UL + +/* FT80x graphics engine specific macros useful for static display list generation */ +#define BITMAP_SOURCE(addr) ((1UL<<24)|(((addr)&1048575UL)<<0)) +#define SCISSOR_SIZE(width,height) ((28UL<<24)|(((width)&1023UL)<<10)|(((height)&1023UL)<<0)) +#define SCISSOR_XY(x,y) ((27UL<<24)|(((x)&511UL)<<9)|(((y)&511UL)<<0)) + +#endif + +#endif /* EVE_H_ */ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/EVE_commands.c b/lib/lvgl_esp32_drivers/lvgl_tft/EVE_commands.c new file mode 100644 index 0000000..213cdcc --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/EVE_commands.c @@ -0,0 +1,2314 @@ +/* +@file EVE_commands.c +@brief contains FT8xx / BT8xx functions +@version 4.0 +@date 2020-04-13 +@author Rudolph Riedel, David Jade + +@section info + +This file needs to be renamed to EVE_command.cpp for use with Arduino. +At least fÃŧr ATSAM I had the best result with -O2. +The c-standard is C99. + + +@section LICENSE + +MIT License + +Copyright (c) 2016-2020 Rudolph Riedel and David Jade + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +@section History + +4.1 LvGL edition + + - This version is a heavily modified version of the MIT licensed FT81x code from https://github.com/RudolphRiedel/FT800-FT813 + This version is based on a fork by David Jade that added native SPI DMA support and stripped out non-ESP32 code. + It has also been trimmed down to suit LvGL's needs. Extra features can be enabled by defining FT81X_FULL +*/ + + +#include + +#include "EVE.h" +#include "EVE_commands.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" +#include "esp_log.h" +#include "soc/soc_memory_layout.h" + +#include "esp_log.h" + +#include "disp_spi.h" + +#include + +#if defined (BT81X_ENABLE) +#include +#endif + +#define TAG "FT81X" + +/* data structure for SPI reading that has (optional) space for inserted dummy byte */ +typedef struct _spi_read_data { +#if defined(DISP_SPI_FULL_DUPLEX) + uint8_t _dummy_byte; +#endif + union { + uint8_t byte; + uint16_t word; + uint32_t dword; + } __attribute__((packed)); +} spi_read_data __attribute__((aligned(4))); + + +/* Receive data helpers */ +#define member_size(type, member) sizeof(((type *)0)->member) + +#if defined(DISP_SPI_FULL_DUPLEX) +#define SPI_READ_DUMMY_LEN member_size(spi_read_data, _dummy_byte) +#else +#define SPI_READ_DUMMY_LEN 0 +#endif +#define SPI_READ_BYTE_LEN (SPI_READ_DUMMY_LEN + member_size(spi_read_data, byte)) +#define SPI_READ_WORD_LEN (SPI_READ_DUMMY_LEN + member_size(spi_read_data, word)) +#define SPI_READ_DWORD_LEN (SPI_READ_DUMMY_LEN + member_size(spi_read_data, dword)) + + +// EVE Memory Commands - used with EVE_memWritexx and EVE_memReadxx +#define MEM_WRITE 0x80 // EVE Host Memory Write +#define MEM_READ 0x00 // EVE Host Memory Read +#define MEM_WRITE_24 0x800000 // EVE Host Memory Write (24-bit format) + +volatile uint16_t cmdOffset = 0x0000; /* offset for the 4k co-processor FIFO */ + +volatile uint8_t cmd_burst = 0; /* flag to indicate cmd-burst is active */ + +// Buffer for SPI transactions +uint8_t SPIBuffer[SPI_BUFFER_SIZE]; // must be in DMA capable memory if DMA is used! +uint16_t SPIBufferIndex = 0; +disp_spi_send_flag_t SPIInherentSendFlags = 0; // additional inherent SPI flags (for DIO/QIO mode switching) +uint8_t SPIDummyReadBits = 0; // Dummy bits for reading in DIO/QIO modes + +// Macros to make SPI use explicit and less verbose +// (macros do obscure code a little but they also help code search and readability) + +// Buffer a byte +#define BUFFER_SPI_BYTE(byte) SPIBuffer[SPIBufferIndex++] = (byte); + +// Buffer a Word - little Endian format +#define BUFFER_SPI_WORD(word) \ + BUFFER_SPI_BYTE((uint8_t)(word)) \ + BUFFER_SPI_BYTE((uint8_t)((word) >> 8)) + +// Buffer a DWord - little Endian format +#define BUFFER_SPI_DWORD(dword) \ + BUFFER_SPI_BYTE((uint8_t)(dword)) \ + BUFFER_SPI_BYTE((uint8_t)((dword) >> 8)) \ + BUFFER_SPI_BYTE((uint8_t)((dword) >> 16)) \ + BUFFER_SPI_BYTE((uint8_t)((dword) >> 24)) + +// Buffer a 24-bit SPI Memory Write address - big Endian format +#define BUFFER_SPI_WRITE_ADDRESS(addr) \ + BUFFER_SPI_BYTE((uint8_t)((addr) >> 16) | MEM_WRITE) \ + BUFFER_SPI_BYTE((uint8_t)((addr) >> 8)) \ + BUFFER_SPI_BYTE((uint8_t)(addr)) + +// Send buffer +#define SEND_SPI_BUFFER() \ + disp_spi_transaction(SPIBuffer, SPIBufferIndex, (disp_spi_send_flag_t)(DISP_SPI_SEND_QUEUED | SPIInherentSendFlags), NULL, 0, 0); \ + SPIBufferIndex = 0; + +// Wait for DMA queued SPI transactions to complete +#define WAIT_SPI() \ + disp_wait_for_pending_transactions(); + + + +void DELAY_MS(uint16_t ms) +{ + vTaskDelay(ms / portTICK_PERIOD_MS); +} + + +void EVE_pdn_set(void) +{ + gpio_set_level(EVE_PDN, 0); /* Power-Down low */ +} + + +void EVE_pdn_clear(void) +{ + gpio_set_level(EVE_PDN, 1); /* Power-Down high */ +} + + +void spi_acquire() +{ + disp_spi_acquire(); +} + + +void spi_release() +{ + disp_spi_release(); +} + + +void EVE_cmdWrite(uint8_t command, uint8_t parameter) +{ + const uint8_t data[] = + { + command, + parameter, + 0x00 + }; + + disp_spi_transaction(data, sizeof(data), (disp_spi_send_flag_t)(DISP_SPI_SEND_POLLING | SPIInherentSendFlags), NULL, 0, 0); +} + + +uint8_t EVE_memRead8(uint32_t ftAddress) +{ + spi_read_data data = {}; + disp_spi_send_flag_t readflags = (disp_spi_send_flag_t)(DISP_SPI_RECEIVE | DISP_SPI_SEND_POLLING | DISP_SPI_ADDRESS_24 | SPIInherentSendFlags); + +#if defined(DISP_SPI_HALF_DUPLEX) + // in half-duplex mode the FT81x requires dummy bits + readflags |= DISP_SPI_VARIABLE_DUMMY; +#endif + + disp_spi_transaction(NULL, SPI_READ_BYTE_LEN, readflags, (uint8_t*)&data, ftAddress, SPIDummyReadBits); + return data.byte; /* return byte read */ +} + + +uint16_t EVE_memRead16(uint32_t ftAddress) +{ +#if defined(DISP_SPI_HALF_DUPLEX) + // There are esp32 issues when reading in DMA half-duplex mode that prevents reading more than 1 byte at a time so we work around that + uint16_t word = 0; + for(int i = 0; i < sizeof(word); i++) + { + word |= (EVE_memRead8(ftAddress + i) << i * 8); + } + return word; +#endif + + spi_read_data data = {}; + disp_spi_send_flag_t readflags = (disp_spi_send_flag_t)(DISP_SPI_RECEIVE | DISP_SPI_SEND_POLLING | DISP_SPI_ADDRESS_24 | SPIInherentSendFlags); + +#if defined(DISP_SPI_HALF_DUPLEX) + // in half-duplex mode the FT81x requires dummy bits + readflags |= DISP_SPI_VARIABLE_DUMMY; +#endif + + disp_spi_transaction(NULL, SPI_READ_WORD_LEN, readflags, (uint8_t*)&data, ftAddress, SPIDummyReadBits); + return data.word; /* return integer read */ +} + + +uint32_t EVE_memRead32(uint32_t ftAddress) +{ +#if defined(DISP_SPI_HALF_DUPLEX) + // There are esp32 issues when reading in DMA half-duplex mode that prevents reading more than 1 byte at a time so we work around that + uint32_t dword = 0; + for(int i = 0; i < sizeof(dword); i++) + { + dword |= (EVE_memRead8(ftAddress + i) << i * 8); + } + return dword; +#endif + + spi_read_data data = {}; + disp_spi_send_flag_t readflags = (disp_spi_send_flag_t)(DISP_SPI_RECEIVE | DISP_SPI_SEND_POLLING | DISP_SPI_ADDRESS_24 | SPIInherentSendFlags); + +#if defined(DISP_SPI_HALF_DUPLEX) + // in half-duplex mode the FT81x requires dummy bits + readflags |= DISP_SPI_VARIABLE_DUMMY; +#endif + + disp_spi_transaction(NULL, SPI_READ_DWORD_LEN, readflags, (uint8_t*)&data, ftAddress, SPIDummyReadBits); + return data.dword; /* return integer read */ +} + + +void EVE_memWrite8(uint32_t ftAddress, uint8_t ftData8) +{ + disp_spi_transaction(&ftData8, sizeof(ftData8), (disp_spi_send_flag_t)(DISP_SPI_SEND_POLLING | DISP_SPI_ADDRESS_24 | SPIInherentSendFlags), NULL, (ftAddress | MEM_WRITE_24), 0); +} + + +void EVE_memWrite16(uint32_t ftAddress, uint16_t ftData16) +{ + disp_spi_transaction((uint8_t*)&ftData16, sizeof(ftData16), (disp_spi_send_flag_t)(DISP_SPI_SEND_POLLING | DISP_SPI_ADDRESS_24 | SPIInherentSendFlags), NULL, (ftAddress | MEM_WRITE_24), 0); +} + + +void EVE_memWrite32(uint32_t ftAddress, uint32_t ftData32) +{ + disp_spi_transaction((uint8_t*)&ftData32, sizeof(ftData32), (disp_spi_send_flag_t)(DISP_SPI_SEND_POLLING | DISP_SPI_ADDRESS_24 | SPIInherentSendFlags), NULL, (ftAddress | MEM_WRITE_24), 0); +} + + +// write to EVE memory via SPI memory-mapped protocol using queued SPI transactions (i.e. DMA) +// Note: data should be in DMA-capable memory! +void EVE_memWrite_buffer(uint32_t ftAddress, const uint8_t *data, uint32_t len, bool LvGL_Flush) +{ + // chunk by DMA transfer size (SPI_TRANSER_SIZE) + uint32_t bytes_left = len; + while(bytes_left > 0) + { + uint32_t block_len = (bytes_left > SPI_TRANSER_SIZE ? SPI_TRANSER_SIZE : bytes_left); + + // only send flush on last chunk + disp_spi_send_flag_t flush_flag = 0; + if(LvGL_Flush && bytes_left - block_len == 0) + { + flush_flag = DISP_SPI_SIGNAL_FLUSH; + } + + disp_spi_transaction(data, block_len, (disp_spi_send_flag_t)(DISP_SPI_SEND_QUEUED | DISP_SPI_ADDRESS_24 | SPIInherentSendFlags | flush_flag), NULL, (ftAddress | MEM_WRITE_24), 0); + data += block_len; + ftAddress += block_len; + bytes_left -= block_len; + } +} + + +/* Check if the graphics processor completed executing the current command list. */ +/* This is the case when REG_CMD_READ matches cmdOffset, indicating that all commands have been executed. */ +uint8_t EVE_busy(void) +{ + uint16_t cmdBufferRead; + + WAIT_SPI(); // can't tell if EVE is busy if SPI is taking place + + cmdBufferRead = EVE_memRead16(REG_CMD_READ); /* read the graphics processor read pointer */ + + if(cmdBufferRead == 0xFFF) /* we have a co-processor fault, make EVE play with us again */ + { + #if defined (BT81X_ENABLE) + + uint16_t copro_patch_pointer; + + copro_patch_pointer = EVE_memRead16(REG_COPRO_PATCH_DTR); + + #endif + + EVE_memWrite8(REG_CPURESET, 1); /* hold co-processor engine in the reset condition */ + EVE_memWrite16(REG_CMD_READ, 0); /* set REG_CMD_READ to 0 */ + EVE_memWrite16(REG_CMD_WRITE, 0); /* set REG_CMD_WRITE to 0 */ + EVE_memWrite32(REG_CMD_DL, 0); /* reset REG_CMD_DL to 0 as required by the BT81x programming guide, should not hurt FT8xx */ + cmdOffset = 0; + EVE_memWrite8(REG_CPURESET, 0); /* set REG_CMD_WRITE to 0 to restart the co-processor engine*/ + + #if defined (BT81X_ENABLE) + + EVE_memWrite16(REG_COPRO_PATCH_DTR, copro_patch_pointer); + + DELAY_MS(5); /* just to be safe */ + + // reset the SPI buffer just to be cautious + SPIBufferIndex = 0; + + BUFFER_SPI_WRITE_ADDRESS(EVE_RAM_CMD + cmdOffset) + BUFFER_SPI_DWORD(CMD_FLASHATTACH) + BUFFER_SPI_DWORD(CMD_FLASHFAST) + SEND_SPI_BUFFER() + WAIT_SPI() + + cmdOffset += 8; + +// BUFFER_SPI_BYTE + BUFFER_SPI_BYTE(MEM_WRITE | 0x30); /* send Memory Write plus high address byte of REG_CMD_WRITE for EVE81x */ + BUFFER_SPI_BYTE(0x20); /* send middle address byte of REG_CMD_WRITE for EVE81x */ + BUFFER_SPI_BYTE(0xfc); /* send low address byte of REG_CMD_WRITE for EVE81x */ + BUFFER_SPI_WORD(cmdOffset); + SEND_SPI_BUFFER() + WAIT_SPI() + + EVE_memWrite8(REG_PCLK, EVE_PCLK); /* restore REG_PCLK in case it was set to zero by an error */ + + DELAY_MS(5); /* just to be safe */ + + #endif + } + + if(cmdOffset != cmdBufferRead) + { + return 1; + } + else + { + return 0; + } +} + + +void EVE_get_cmdoffset(void) +{ + cmdOffset = EVE_memRead16(REG_CMD_WRITE); +} + + +void EVE_inc_cmdoffset(uint16_t increment) +{ + cmdOffset += increment; + cmdOffset &= 0x0fff; // circular +} + + +/* order the command co-processor to start processing its FIFO queue and do not wait for completion */ +void EVE_cmd_start(void) +{ + WAIT_SPI(); + + EVE_memWrite16(REG_CMD_WRITE, cmdOffset); +} + + +/* order the command co-processor to start processing its FIFO queue and wait for completion */ +void EVE_cmd_execute(void) +{ + EVE_cmd_start(); + while (EVE_busy()); +} + + +/* begin a co-processor command, this is used for all non-display-list commands */ +void EVE_begin_cmd(uint32_t command) +{ + BUFFER_SPI_WRITE_ADDRESS(EVE_RAM_CMD + cmdOffset) + BUFFER_SPI_DWORD(command) + + EVE_inc_cmdoffset(4); // only count the command size - not the write address directive +} + + +/* co-processor commands that are not used in displays lists, these are no to be used with async transfers */ + + +/* this is meant to be called outside display-list building, does not support cmd-burst */ +void EVE_cmd_memzero(uint32_t ptr, uint32_t num) +{ + EVE_begin_cmd(CMD_MEMZERO); + BUFFER_SPI_DWORD(ptr) + BUFFER_SPI_DWORD(num) + + EVE_inc_cmdoffset(8); + + SEND_SPI_BUFFER() +} + + +/* this is meant to be called outside display-list building, does not support cmd-burst */ +void EVE_cmd_memset(uint32_t ptr, uint8_t value, uint32_t num) +{ + EVE_begin_cmd(CMD_MEMSET); + BUFFER_SPI_DWORD(ptr) + BUFFER_SPI_DWORD(value) + BUFFER_SPI_DWORD(num) + + EVE_inc_cmdoffset(12); + + SEND_SPI_BUFFER() +} + + +/* this is meant to be called outside display-list building, does not support cmd-burst */ +void block_transfer(const uint8_t *data, uint32_t len); // forward ref + +void EVE_cmd_memwrite(uint32_t dest, uint32_t num, const uint8_t *data) +{ + EVE_begin_cmd(CMD_MEMWRITE); + BUFFER_SPI_DWORD(dest) + BUFFER_SPI_DWORD(num) + + EVE_inc_cmdoffset(8); + + SEND_SPI_BUFFER() + + block_transfer(data, num); // block_transfer is immediate - make sure CMD buffer is prepared! +} + + +/* this is meant to be called outside display-list building, does not support cmd-burst */ +void EVE_cmd_memcpy(uint32_t dest, uint32_t src, uint32_t num) +{ + EVE_begin_cmd(CMD_MEMCPY); + BUFFER_SPI_DWORD(dest) + BUFFER_SPI_DWORD(src) + BUFFER_SPI_DWORD(num) + + EVE_inc_cmdoffset(12); + + SEND_SPI_BUFFER() +} + + + +/* commands for loading image data into FT8xx CMD memory, with DWORD padding: */ +/* Note: these are immediate SPI transfers and assume the CMD buffer is prepared to process the data, etc... */ +// Note: data should be in DMA-capable memory! +void eve_spi_CMD_write(uint64_t addr, const uint8_t *data, uint16_t len) +{ + // we can use a direct transaction because it is already chunked + disp_spi_transaction(data, len, (disp_spi_send_flag_t)(DISP_SPI_SEND_QUEUED | DISP_SPI_ADDRESS_24 | SPIInherentSendFlags), NULL, (addr | MEM_WRITE_24), 0); + + uint8_t padding = len & 0x03; /* 0, 1, 2 or 3 */ + padding = 4 - padding; /* 4, 3, 2 or 1 */ + padding &= 3; /* 3, 2, 1 or 0 */ + + // padding is another transaction and needs it's own address (this is a DMA requirement) + if(padding) + { + addr += len; + + uint8_t padData[4] = {0}; + disp_spi_transaction(padData, padding, (disp_spi_send_flag_t)(DISP_SPI_SEND_QUEUED | DISP_SPI_ADDRESS_24 | SPIInherentSendFlags), NULL, (addr | MEM_WRITE_24), 0); + + len += padding; + } + + EVE_inc_cmdoffset(len); +} + + +void block_transfer(const uint8_t *data, uint32_t len) +{ + WAIT_SPI(); // SPI commands must be in CMD buffer first + + uint32_t bytes_left; + + bytes_left = len; + while(bytes_left > 0) + { + uint32_t block_len; + block_len = (bytes_left > BLOCK_TRANSFER_SIZE ? BLOCK_TRANSFER_SIZE : bytes_left); + + eve_spi_CMD_write(EVE_RAM_CMD + cmdOffset, data, block_len); + + data += block_len; + bytes_left -= block_len; + + // signal to process data + EVE_cmd_execute(); + } +} + +#if FT81X_FULL +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +void EVE_cmd_inflate(uint32_t ptr, const uint8_t *data, uint16_t len) +{ + EVE_begin_cmd(CMD_INFLATE); + BUFFER_SPI_DWORD(ptr) + + EVE_inc_cmdoffset(4); + + SEND_SPI_BUFFER() + + block_transfer(data, len); // block_transfer is immediate - make sure CMD buffer is prepared! +} + + +#if defined (BT81X_ENABLE) +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +void EVE_cmd_inflate2(uint32_t ptr, uint32_t options, const uint8_t *data, uint16_t len) +{ + EVE_begin_cmd(CMD_INFLATE2); + BUFFER_SPI_DWORD(ptr) + BUFFER_SPI_DWORD(options) + + EVE_inc_cmdoffset(8); + + SEND_SPI_BUFFER() + + if(options == 0) /* direct data, not by Media-FIFO or Flash */ + { + block_transfer(data, len); // block_transfer is immediate - make sure CMD buffer is prepared! + } +} +#endif + + +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +void EVE_cmd_loadimage(uint32_t ptr, uint32_t options, const uint8_t *data, uint16_t len) +{ + EVE_begin_cmd(CMD_LOADIMAGE); + BUFFER_SPI_DWORD(ptr) + BUFFER_SPI_DWORD(options) + + EVE_inc_cmdoffset(8); + + SEND_SPI_BUFFER() + + #if defined (BT81X_ENABLE) + if( ((options & EVE_OPT_MEDIAFIFO) == 0) && ((options & EVE_OPT_FLASH) == 0) )/* direct data, neither by Media-FIFO or from Flash */ + #elif defined (FT81X_ENABLE) + if((options & EVE_OPT_MEDIAFIFO) == 0) /* direct data, not by Media-FIFO */ + #endif + { + block_transfer(data, len); // block_transfer is immediate - make sure CMD buffer is prepared! + } +} + + +#if defined (FT81X_ENABLE) +/* this is meant to be called outside display-list building, does not support cmd-burst */ +void EVE_cmd_mediafifo(uint32_t ptr, uint32_t size) +{ + EVE_begin_cmd(CMD_MEDIAFIFO); + BUFFER_SPI_DWORD(ptr) + BUFFER_SPI_DWORD(size) + + EVE_inc_cmdoffset(8); + + SEND_SPI_BUFFER() +} +#endif + + +/* this is meant to be called outside display-list building, does not support cmd-burst */ +void EVE_cmd_interrupt(uint32_t ms) +{ + EVE_begin_cmd(CMD_INTERRUPT); + BUFFER_SPI_DWORD(ms) + + EVE_inc_cmdoffset(4); + + SEND_SPI_BUFFER() +} + + +/* this is meant to be called outside display-list building, does not support cmd-burst */ +void EVE_cmd_setfont(uint32_t font, uint32_t ptr) +{ + EVE_begin_cmd(CMD_SETFONT); + BUFFER_SPI_DWORD(font) + BUFFER_SPI_DWORD(ptr) + + EVE_inc_cmdoffset(8); + + SEND_SPI_BUFFER() +} + + +#if defined (FT81X_ENABLE) +/* this is meant to be called outside display-list building, does not support cmd-burst */ +void EVE_cmd_setfont2(uint32_t font, uint32_t ptr, uint32_t firstchar) +{ + EVE_begin_cmd(CMD_SETFONT2); + BUFFER_SPI_DWORD(font) + BUFFER_SPI_DWORD(ptr) + BUFFER_SPI_DWORD(firstchar) + + EVE_inc_cmdoffset(12); + + SEND_SPI_BUFFER() +} +#endif + + +#if defined (FT81X_ENABLE) +/* this is meant to be called outside display-list building, does not support cmd-burst */ +void EVE_cmd_setrotate(uint32_t r) +{ + EVE_begin_cmd(CMD_SETROTATE); + BUFFER_SPI_DWORD(r) + + EVE_inc_cmdoffset(4); + + SEND_SPI_BUFFER() +} +#endif + + +/* this is meant to be called outside display-list building, does not support cmd-burst */ +void EVE_cmd_snapshot(uint32_t ptr) +{ + EVE_begin_cmd(CMD_SNAPSHOT); + BUFFER_SPI_DWORD(ptr) + + EVE_inc_cmdoffset(4); + + SEND_SPI_BUFFER() +} + + +#if defined (FT81X_ENABLE) +/* this is meant to be called outside display-list building, does not support cmd-burst */ +void EVE_cmd_snapshot2(uint32_t fmt, uint32_t ptr, int16_t x0, int16_t y0, int16_t w0, int16_t h0) +{ + EVE_begin_cmd(CMD_SNAPSHOT2); + BUFFER_SPI_DWORD(fmt) + BUFFER_SPI_DWORD(ptr) + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(w0) + BUFFER_SPI_WORD(h0) + + EVE_inc_cmdoffset(16); + + SEND_SPI_BUFFER() +} +#endif + + +/* this is meant to be called outside display-list building, does not support cmd-burst */ +void EVE_cmd_track(int16_t x0, int16_t y0, int16_t w0, int16_t h0, int16_t tag) +{ + EVE_begin_cmd(CMD_TRACK); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(w0) + BUFFER_SPI_WORD(h0) + BUFFER_SPI_WORD(tag) + BUFFER_SPI_WORD(0) + + EVE_inc_cmdoffset(12); + + SEND_SPI_BUFFER() +} + + + +/* commands that return values by writing to the command-fifo */ +/* note: yes, these are different than the functions in the Programmers Guide from FTDI, + this is because I have no idea why anyone would want to pass "result" as an actual argument to these functions + when this only marks the offset the command-processor is writing to */ + +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +/* crc32 = EVE_cmd_memcrc(my_ptr_to_some_memory_region, some_amount_of_bytes); */ +uint32_t EVE_cmd_memcrc(uint32_t ptr, uint32_t num) +{ + EVE_begin_cmd(CMD_MEMCRC); + BUFFER_SPI_DWORD(ptr) + BUFFER_SPI_DWORD(num) + BUFFER_SPI_DWORD(0) + + EVE_inc_cmdoffset(8); + + uint16_t offset = cmdOffset; + EVE_inc_cmdoffset(4); + + SEND_SPI_BUFFER() + + EVE_cmd_execute(); + + return (EVE_memRead32(EVE_RAM_CMD + offset)); +} + + +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +/* address = EVE_cmd_getpr(); */ +uint32_t EVE_cmd_getptr(void) +{ + EVE_begin_cmd(CMD_GETPTR); + + uint16_t offset = cmdOffset; + EVE_inc_cmdoffset(4); + + SEND_SPI_BUFFER() + + EVE_cmd_execute(); + + return (EVE_memRead32(EVE_RAM_CMD + offset)); +} + + +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +/* regvalue = EVE_cmd_regread(ptr); */ +/* this seems to be completely pointless, there is no real use for it outside a display-list since the register could be read directly */ +/* and for what purpose would this be implemented to be used in a display list?? */ +uint32_t EVE_cmd_regread(uint32_t ptr) +{ + uint16_t offset; + + EVE_begin_cmd(CMD_REGREAD); + BUFFER_SPI_DWORD(ptr) + + EVE_inc_cmdoffset(4); + + offset = cmdOffset; + EVE_inc_cmdoffset(4); + + SEND_SPI_BUFFER() + + EVE_cmd_execute(); + + return (EVE_memRead32(EVE_RAM_CMD + offset)); +} + + +/* + Get the properties of an image after a CMD_LOADIMAGE operation. + + uint32 pointer, width, height; + EVE_LIB_GetProps(&pointer, &width, &height); + + uint32 width, height; + EVE_LIB_GetProps(0, &width, &height); + + this is meant to be called outside display-list building, it includes executing the command + and waiting for completion, does not support cmd-burst +*/ +void EVE_LIB_GetProps(uint32_t *pointer, uint32_t *width, uint32_t *height) +{ + EVE_begin_cmd(CMD_GETPROPS); + + uint16_t offset = cmdOffset; + EVE_inc_cmdoffset(12); + + SEND_SPI_BUFFER() + + EVE_cmd_execute(); + + if(pointer) + { + *pointer = EVE_memRead32(EVE_RAM_CMD + offset); + } + if(width) + { + *width = EVE_memRead32(EVE_RAM_CMD + offset + 4); + } + if(height) + { + *height = EVE_memRead32(EVE_RAM_CMD + offset + 8); + } +} + + +/* FT811 / FT813 binary-blob from FTDIs AN_336 to patch the touch-engine for Goodix GT911 / GT9271 touch controllers */ +#if defined (EVE_HAS_GT911) + +#if defined (__AVR__) +#include +#else +#define PROGMEM +#endif + +const uint16_t EVE_GT911_len = 1184; +const uint8_t EVE_GT911_data[1184] PROGMEM = +{ + 26,255,255,255,32,32,48,0,4,0,0,0,2,0,0,0, + 34,255,255,255,0,176,48,0,120,218,237,84,221,111,84,69,20,63,51,179,93,160,148,101,111,76,5,44,141,123,111,161,11,219,154,16,9,16,17,229,156,75,26,11,13,21,227,3,16,252,184,179, + 45,219,143,45,41,125,144,72,67,100,150,71,189,113,18,36,17,165,100,165,198,16,32,17,149,196,240,128,161,16,164,38,54,240,0,209,72,130,15,38,125,48,66,82,30,76,19,31,172,103,46, + 139,24,255,4,227,157,204,156,51,115,102,206,231,239,220,5,170,94,129,137,75,194,216,98,94,103,117,115,121,76,131,177,125,89,125,82,123,60,243,58,142,242,204,185,243,188,118,156, + 227,155,203,238,238,195,251,205,229,71,92,28,169,190,184,84,143,113,137,53,244,103,181,237,87,253,113,137,233,48,12,198,165,181,104,139,25,84,253,155,114,74,191,0,54,138,163, + 12,62,131,207,129,23,217,34,91,31,128,65,246,163,175,213,8,147,213,107,35,203,94,108,3,111,40,171,83,24,15,165,177,222,116,97,23,188,140,206,150,42,102,181,87,78,86,182,170,134, + 215,241,121,26,243,252,2,76,115,217,139,222,206,173,136,132,81,61,35,185,39,113,23,46,199,76,178,54,151,183,224,0,40,189,28,149,182,58,131,79,152,30,76,34,98,234,162,216,133,141, + 102,39,170,40,192,101,53,201,146,191,37,77,44,177,209,74,211,5,206,187,5,6,216,47,53,96,123,22,50,103,251,192,84,17,74,227,185,56,106,51,91,161,96,182,163,48,171,141,139,65,152, + 66,66,11,102,43,158,75,36,80,147,184,147,139,112,17,235,216,103,111,239,245,92,10,175,194,40,44,58,125,5,59,112,50,103,245,4,78,192,5,156,194,51,60,191,134,75,110,173,237,46,192, + 121,156,192,115,184,218,120,67,63,115,46,11,102,10,97,232,50,235,114,182,148,118,178,41,188,12,135,77,202,124,12,96,238,35,161,234,189,129,23,249,212,139,230,25,53,48,205,52,93, + 163,117,53,154,170,81,85,163,178,70,69,66,167,241,14,46,241,1,226,136,152,179,197,59,184,148,254,49,132,48,15,176,137,192,76,131,196,105,104,162,86,81,160,165,255,26,173,162,137, + 86,145,210,183,192,55,175,194,211,60,91,120,230,184,174,27,41,131,155,40,224,29,87,179,232,16,55,55,7,165,147,81,23,165,49,101,54,224,75,180,81,108,18,29,226,69,225,110,175,224, + 42,212,25,47,130,193,110,234,192,215,252,56,74,162,24,46,251,174,54,106,68,245,14,9,155,160,22,120,207,104,240,29,90,178,140,28,24,220,47,166,112,61,251,208,192,111,56,239,238, + 93,255,251,62,99,32,193,75,61,190,235,123,229,110,218,194,85,79,225,59,98,20,238,227,235,220,11,221,149,25,180,116,194,159,111,96,192,24,213,59,139,179,156,215,69,230,19,24,35, + 135,117,206,171,206,162,67,129,234,61,235,11,104,103,84,64,223,167,254,40,163,101,92,84,43,150,46,249,219,205,7,116,11,91,104,61,57,75,223,8,48,25,28,119,252,222,113,49,86,249, + 74,180,211,156,181,61,215,168,157,7,251,199,150,242,250,91,58,132,94,121,7,53,151,139,98,6,165,153,69,214,32,110,211,100,101,31,89,45,81,98,23,205,205,197,209,109,186,198,35, + 141,191,249,25,60,132,223,153,251,98,20,239,146,139,20,217,250,41,250,137,58,177,90,57,79,51,108,233,20,253,194,187,49,222,205,114,141,96,48,175,219,107,54,111,138,22,154,103, + 108,79,58,252,179,178,79,164,195,2,153,36,39,170,199,201,167,197,85,106,8,59,177,81,46,56,2,230,75,114,17,55,112,188,65,208,137,77,114,10,115,55,58,208,197,173,122,87,6,140, + 110,42,208,124,163,70,108,241,104,18,245,98,214,187,134,53,42,221,22,182,133,211,116,148,177,194,209,192,85,90,199,58,55,203,2,229,19,137,187,161,228,154,112,203,145,125,244, + 188,220,118,228,41,201,181,41,195,144,215,183,51,80,250,21,217,16,217,200,235,109,227,188,122,218,142,60,170,224,112,240,184,130,229,224,113,5,223,148,163,80,165,183,130,187, + 132,116,64,238,161,85,220,115,139,205,98,227,244,29,102,125,7,37,243,123,223,11,26,92,63,243,116,61,191,138,123,244,160,84,186,74,31,5,174,247,119,135,199,248,253,135,242,97, + 102,145,190,144,14,85,238,221,231,193,158,48,205,25,120,248,15,220,29,158,9,70,185,30,103,229,33,254,23,237,160,172,62,193,90,222,224,232,14,200,56,90,104,142,227,120,110,6, + 21,211,203,65,150,99,151,220,247,87,164,50,159,49,239,234,58,142,0,109,108,123,18,79,227,36,100,248,222,205,96,127,120,26,171,228,69,63,36,17,252,200,17,116,242,187,227,88,143, + 247,2,75,191,6,130,59,188,11,55,240,31,243,122,152,226,183,207,154,73,188,39,219,43,105,222,87,41,143,141,140,175,73,112,184,252,61,184,16,90,250,35,168,82,119,176,57,116,94, + 200,150,22,190,179,44,104,12,235,84,149,102,252,89,154,193,99,228,106,242,125,248,64,194,255,223,127,242,83,11,255,2,70,214,226,128,0,0 +}; +#endif +#endif // FT81X_FULL + + +/* init, has to be executed with the SPI setup to 11 MHz or less as required by FT8xx / BT8xx */ +uint8_t EVE_init(void) +{ + uint8_t chipid = 0; + uint16_t timeout = 0; + + EVE_pdn_set(); + DELAY_MS(6); /* minimum time for power-down is 5ms */ + + EVE_pdn_clear(); + DELAY_MS(21); /* minimum time to allow from rising PD_N to first access is 20ms */ + + /* EVE_cmdWrite(EVE_CORERST,0); */ /* reset, only required for warm-start if PowerDown line is not used */ + +#if defined (EVE_HAS_CRYSTAL) + EVE_cmdWrite(EVE_CLKEXT, 0); /* setup EVE for external clock */ +#else + EVE_cmdWrite(EVE_CLKINT, 0); /* setup EVE for internal clock */ +#endif + +#if defined (BT81X_ENABLE) + EVE_cmdWrite(EVE_CLKSEL ,0x46); /* set clock to 72 MHz */ +#endif + + EVE_cmdWrite(EVE_ACTIVE, 0); /* start EVE */ + + /* BRT AN033 BT81X_Series_Programming_Guide V1.2 had a small change to chapter 2.4 "Initialization Sequence during Boot Up" */ + /* Send Host command “ACTIVE” and wait for at least 300 milliseconds. */ + /* Ensure that there is no SPI access during this time. */ + /* I asked Bridgetek for clarification why this has been made stricter. */ + /* From observation with quite a few of different displays I do not agree that either the 300ms are necessary or that */ + /* *reading* the SPI while EVE inits itself is causing any issues. */ + /* But since BT815 at 72MHz need 42ms anyways before they start to answer, here is my compromise, a fixed 40ms delay */ + /* to provide at least a short moment of silence for EVE */ + DELAY_MS(40); + + /* The most reliable DIO/QIO switching point is after EVE start up but before reading the ChipID. */ +#if defined(DISP_SPI_TRANS_MODE_DIO) + ESP_LOGI(TAG, "Switching to DIO mode"); + DELAY_MS(20); /* different boards may take a different delay but this generally seems to work */ + EVE_memWrite16(REG_SPI_WIDTH, SPI_WIDTH_DIO); + SPIInherentSendFlags = DISP_SPI_MODE_DIO | DISP_SPI_MODE_DIOQIO_ADDR; + SPIDummyReadBits = 4; /* Esp32 DMA SPI transaction dummy_bits works more like clock cycles, so in DIO 4 dummy_bits == 8 total bits */ +#elif defined(DISP_SPI_TRANS_MODE_QIO) + ESP_LOGI(TAG, "Switching to QIO mode"); + DELAY_MS(20); /* different boards may take a different delay but this generally seems to work */ + EVE_memWrite16(REG_SPI_WIDTH, SPI_WIDTH_QIO); + SPIInherentSendFlags = DISP_SPI_MODE_QIO | DISP_SPI_MODE_DIOQIO_ADDR; + SPIDummyReadBits = 2; /* Esp32 DMA SPI transaction dummy_bits works more like clock cycles, so in QIO 2 dummy_bits == 8 total bits */ +#elif defined(DISP_SPI_HALF_DUPLEX) + SPIDummyReadBits = 8; /* SIO half-duplex mode */ +#endif + + while(chipid != 0x7C) /* if chipid is not 0x7c, continue to read it until it is, EVE needs a moment for it's power on self-test and configuration */ + { + DELAY_MS(1); + chipid = EVE_memRead8(REG_ID); + timeout++; + if(timeout > 400) + { + ESP_LOGI(TAG, "Failed to read ChipID...aborting initialization."); + return 0; + } + } + + timeout = 0; + while (0x00 != (EVE_memRead8(REG_CPURESET) & 0x03)) /* check if EVE is in working status */ + { + DELAY_MS(1); + timeout++; + if(timeout > 50) /* experimental, 10 was the lowest value to get the BT815 started with, the touch-controller was the last to get out of reset */ + { + ESP_LOGI(TAG, "Failed to read CPU status...aborting initialization."); + return 0; + } + } + + /* tell EVE that we changed the frequency from default to 72MHz for BT8xx */ +#if defined (BT81X_ENABLE) + EVE_memWrite32(REG_FREQUENCY, 72000000); +#endif + + /* we have a display with a Goodix GT911 / GT9271 touch-controller on it, so we patch our FT811 or FT813 according to AN_336 or setup a BT815 accordingly */ +#if defined (EVE_HAS_GT911) + + #if defined (BT81X_ENABLE) + EVE_memWrite32(REG_TOUCH_CONFIG, 0x000005d1); /* switch to Goodix touch controller */ + #else + + EVE_get_cmdoffset(); + + BUFFER_SPI_WRITE_ADDRESS(EVE_RAM_CMD + cmdOffset) + SEND_SPI_BUFFER() + + spi_flash_write(EVE_GT911_data, EVE_GT911_len); + + EVE_cmd_execute(); + + EVE_memWrite8(REG_TOUCH_OVERSAMPLE, 0x0f); /* setup oversample to 0x0f as "hidden" in binary-blob for AN_336 */ + EVE_memWrite16(REG_TOUCH_CONFIG, 0x05D0); /* write magic cookie as requested by AN_336 */ + + /* specific to the EVE2 modules from Matrix-Orbital we have to use GPIO3 to reset GT911 */ + EVE_memWrite16(REG_GPIOX_DIR, 0x8008); /* Reset-Value is 0x8000, adding 0x08 sets GPIO3 to output, default-value for REG_GPIOX is 0x8000 -> Low output on GPIO3 */ + DELAY_MS(1); /* wait more than 100Âĩs */ + EVE_memWrite8(REG_CPURESET, 0x00); /* clear all resets */ + DELAY_MS(56); /* wait more than 55ms */ + EVE_memWrite16(REG_GPIOX_DIR, 0x8000); /* setting GPIO3 back to input */ + #endif +#endif + + /* EVE_memWrite8(REG_PCLK, 0x00); */ /* set PCLK to zero - don't clock the LCD until later, line disabled because zero is reset-default and we just did a reset */ + +#if defined (EVE_ADAM101) + EVE_memWrite8(REG_PWM_DUTY, 0x80); /* turn off backlight for Glyn ADAM101 module, it uses inverted values */ +#else + EVE_memWrite8(REG_PWM_DUTY, 0); /* turn off backlight for any other module */ +#endif + + /* Initialize Display */ + EVE_memWrite16(REG_HSIZE, EVE_HSIZE); /* active display width */ + EVE_memWrite16(REG_HCYCLE, EVE_HCYCLE); /* total number of clocks per line, incl front/back porch */ + EVE_memWrite16(REG_HOFFSET, EVE_HOFFSET); /* start of active line */ + EVE_memWrite16(REG_HSYNC0, EVE_HSYNC0); /* start of horizontal sync pulse */ + EVE_memWrite16(REG_HSYNC1, EVE_HSYNC1); /* end of horizontal sync pulse */ + EVE_memWrite16(REG_VSIZE, EVE_VSIZE); /* active display height */ + EVE_memWrite16(REG_VCYCLE, EVE_VCYCLE); /* total number of lines per screen, including pre/post */ + EVE_memWrite16(REG_VOFFSET, EVE_VOFFSET); /* start of active screen */ + EVE_memWrite16(REG_VSYNC0, EVE_VSYNC0); /* start of vertical sync pulse */ + EVE_memWrite16(REG_VSYNC1, EVE_VSYNC1); /* end of vertical sync pulse */ + EVE_memWrite8(REG_SWIZZLE, EVE_SWIZZLE); /* FT8xx output to LCD - pin order */ + EVE_memWrite8(REG_PCLK_POL, EVE_PCLKPOL); /* LCD data is clocked in on this PCLK edge */ + EVE_memWrite8(REG_CSPREAD, EVE_CSPREAD); /* helps with noise, when set to 1 fewer signals are changed simultaneously, reset-default: 1 */ + + /* do not set PCLK yet - wait for just after the first display list */ + + /* configure Touch */ + //EVE_memWrite8(REG_TOUCH_MODE, EVE_TMODE_CONTINUOUS); /* enable touch */ + EVE_memWrite8(REG_TOUCH_MODE, EVE_TMODE_OFF); + EVE_memWrite16(REG_TOUCH_RZTHRESH, EVE_TOUCH_RZTHRESH); /* eliminate any false touches */ + + /* disable Audio for now */ + EVE_memWrite8(REG_VOL_PB, 0x00); /* turn recorded audio volume down */ + EVE_memWrite8(REG_VOL_SOUND, 0x00); /* turn synthesizer volume off */ + EVE_memWrite16(REG_SOUND, 0x6000); /* set synthesizer to mute */ + + /* write a basic display-list to get things started */ + EVE_memWrite32(EVE_RAM_DL, DL_CLEAR_RGB); + EVE_memWrite32(EVE_RAM_DL + 4, (DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG)); + EVE_memWrite32(EVE_RAM_DL + 8, DL_DISPLAY); /* end of display list */ + EVE_memWrite32(REG_DLSWAP, EVE_DLSWAP_FRAME); + + /* nothing is being displayed yet... the pixel clock is still 0x00 */ + EVE_memWrite8(REG_GPIO, 0x80); /* enable the DISP signal to the LCD panel, it is set to output in REG_GPIO_DIR by default */ + EVE_memWrite8(REG_PCLK, EVE_PCLK); /* now start clocking data to the LCD panel */ + +#if defined (EVE_ADAM101) + EVE_memWrite8(REG_PWM_DUTY, 0x60); /* turn on backlight to 25% for Glyn ADAM101 module, it uses inverted values */ +#else + EVE_memWrite8(REG_PWM_DUTY, 0x20); /* turn on backlight to 25% for any other module */ +#endif + + timeout = 0; + while(EVE_busy()) /* just to be safe, should not even enter the loop */ + { + DELAY_MS(1); + timeout++; + if(timeout > 4) + { + break; /* something is wrong here, but since we made it this far through the init, just leave the loop */ + } + } + + EVE_get_cmdoffset(); /* just to be safe */ + +#if defined (EVE_DMA) + EVE_init_dma(); /* prepare DMA */ +#endif + + return 1; +} + + +/* +These eliminate the overhead of transmitting the command-fifo address with every single command, just wrap a sequence of commands +with these and the address is only transmitted once at the start of the block. +Be careful to not use any functions in the sequence that do not address the command-fifo as for example any EVE_mem...() function. +*/ +void EVE_start_cmd_burst(void) +{ + cmd_burst = 42; + + WAIT_SPI() // it is important to wait before writing to the SPI buffer as it might be in a DMA transaction + BUFFER_SPI_WRITE_ADDRESS(EVE_RAM_CMD + cmdOffset) +} + + +void EVE_end_cmd_burst(void) +{ + cmd_burst = 0; + + SEND_SPI_BUFFER() +} + + +/* begin a co-processor command */ +void EVE_start_cmd(uint32_t command) +{ + if(!cmd_burst) + { + WAIT_SPI() // it is important to wait before writing to the SPI buffer as it might be in a DMA transaction + BUFFER_SPI_WRITE_ADDRESS(EVE_RAM_CMD + cmdOffset) + } + + BUFFER_SPI_DWORD(command) + + EVE_inc_cmdoffset(4); /* update the command-ram pointer */ +} + + +/* generic function for all commands that have no arguments and all display-list specific control words */ +/* + examples: + EVE_cmd_dl(CMD_DLSTART); + EVE_cmd_dl(CMD_SWAP); + EVE_cmd_dl(CMD_SCREENSAVER); + EVE_cmd_dl(LINE_WIDTH(1*16)); + EVE_cmd_dl(VERTEX2F(0,0)); + EVE_cmd_dl(DL_BEGIN | EVE_RECTS); +*/ +void EVE_cmd_dl(uint32_t command) +{ + if(cmd_burst) + { + BUFFER_SPI_DWORD(command) + + EVE_inc_cmdoffset(4); /* update the command-ram pointer */ + } + else + { + EVE_start_cmd(command); + SEND_SPI_BUFFER() + } +} + +#if FT81X_FULL +/* write a string to co-processor memory in context of a command: no chip-select, just plain SPI-transfers */ +/* note: assumes cmdOffset is already DWORD aligned */ +void EVE_write_string(const char *text) +{ + uint8_t textindex = 0; + uint8_t padding = 0; + uint8_t *bytes = (uint8_t *) text; /* need to handle the array as bunch of bytes */ + + while(bytes[textindex] != 0) + { + BUFFER_SPI_BYTE(bytes[textindex]); + textindex++; + if(textindex > 249 || SPIBufferIndex >= SPI_BUFFER_SIZE) /* there appears to be no end for the "string", or no more room in SPI buffer, so leave */ + { + break; + } + } + + /* we need to transmit at least one 0x00 byte and up to four if the string happens to be 4-byte aligned already */ + padding = textindex & 3; /* 0, 1, 2 or 3 */ + padding = 4-padding; /* 4, 3, 2 or 1 */ + textindex += padding; + + while(padding > 0 && SPIBufferIndex < SPI_BUFFER_SIZE) + { + BUFFER_SPI_BYTE(0); + padding--; + } + + EVE_inc_cmdoffset(textindex); +} + + +/* EVE3 FLASH functions */ +#if defined (BT81X_ENABLE) + +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +/* write "num" bytes from *data to the external flash on a BT81x board at address ptr */ +/* note: ptr must be 256 byte aligned, num must be a multiple of 256 */ +/* note: EVE will not do anything if the alignment requirements are not met */ +/* note: the address ptr is relative to the flash so the first address is 0x00000000 not 0x800000 */ +/* note: on AVR controllers this expects the data to be located in the controllers flash memory */ +void EVE_cmd_flashwrite(uint32_t ptr, uint32_t num, const uint8_t *data) +{ + EVE_begin_cmd(CMD_FLASHWRITE); + BUFFER_SPI_DWORD(ptr) + BUFFER_SPI_DWORD(num) + + EVE_inc_cmdoffset(8); + + SEND_SPI_BUFFER() + + WAIT_SPI() + block_transfer(data, num); +} + + +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +/* write "num" bytes from src in the external flash on a BT81x board to dest in RAM_G */ +/* note: src must be 64-byte aligned, dest must be 4-byte aligned, num must be a multiple of 4 */ +/* note: EVE will not do anything if the alignment requirements are not met */ +/* note: the src pointer is relative to the flash so the first address is 0x00000000 not 0x800000 */ +void EVE_cmd_flashread(uint32_t dest, uint32_t src, uint32_t num) +{ + EVE_begin_cmd(CMD_FLASHREAD); + BUFFER_SPI_DWORD(dest) + BUFFER_SPI_DWORD(src) + BUFFER_SPI_DWORD(num) + + EVE_inc_cmdoffset(12); + + SEND_SPI_BUFFER() + + EVE_cmd_execute(); +} + + +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +/* write "num" bytes from src in RAM_G to to the external flash on a BT81x board at address dest */ +/* note: dest must be 4096-byte aligned, src must be 4-byte aligned, num must be a multiple of 4096 */ +/* note: EVE will not do anything if the alignment requirements are not met */ +/* note: the address ptr is relative to the flash so the first address is 0x00000000 not 0x800000 */ +void EVE_cmd_flashupdate(uint32_t dest, uint32_t src, uint32_t num) +{ + EVE_begin_cmd(CMD_FLASHUPDATE); + BUFFER_SPI_DWORD(dest) + BUFFER_SPI_DWORD(src) + BUFFER_SPI_DWORD(num) + + EVE_inc_cmdoffset(12); + + SEND_SPI_BUFFER() + + EVE_cmd_execute(); +} + + +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +/* this is added for conveniance, using EVE_cmd_dl(CMD_FLASHERASE); followed by EVE_cmd_execute(); would work as well */ +void EVE_cmd_flasherase(void) +{ + EVE_begin_cmd(CMD_FLASHERASE); + + SEND_SPI_BUFFER() + + EVE_cmd_execute(); +} + + +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +/* this is added for conveniance, using EVE_cmd_dl(CMD_FLASHATTACH); followed by EVE_cmd_execute(); would work as well */ +void EVE_cmd_flashattach(void) +{ + EVE_begin_cmd(CMD_FLASHATTACH); + + SEND_SPI_BUFFER() + + EVE_cmd_execute(); +} + + +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +/* this is added for conveniance, using EVE_cmd_dl(CMD_FLASHDETACH); followed by EVE_cmd_execute(); would work as well */ +void EVE_cmd_flashdetach(void) +{ + EVE_begin_cmd(CMD_FLASHDETACH); + + SEND_SPI_BUFFER() + + EVE_cmd_execute(); +} + + +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +/* this is added for conveniance, using EVE_cmd_dl(CMD_FLASHSPIDESEL); followed by EVE_cmd_execute(); would work as well */ +void EVE_cmd_flashspidesel(void) +{ + EVE_begin_cmd(CMD_FLASHSPIDESEL); + + SEND_SPI_BUFFER() + + EVE_cmd_execute(); +} + + +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +uint32_t EVE_cmd_flashfast(void) +{ + uint16_t offset; + + EVE_begin_cmd(CMD_FLASHFAST); + BUFFER_SPI_DWORD(0) + + offset = cmdOffset; + EVE_inc_cmdoffset(4); + + SEND_SPI_BUFFER() + + EVE_cmd_execute(); + + return EVE_memRead32(EVE_RAM_CMD + offset); +} + + +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +/* write "num" bytes from *data to the BT81x SPI interface */ +/* note: raw direct access, not really useful for anything */ +void EVE_cmd_flashspitx(uint32_t num, const uint8_t *data) +{ + EVE_begin_cmd(CMD_FLASHSPITX); + BUFFER_SPI_DWORD(num) + + EVE_inc_cmdoffset(4); + + SEND_SPI_BUFFER() + + WAIT_SPI() + block_transfer(data, num); +} + + +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +/* write "num" bytes from the BT81x SPI interface dest in RAM_G */ +/* note: raw direct access, not really useful for anything */ +void EVE_cmd_flashspirx(uint32_t dest, uint32_t num) +{ + EVE_begin_cmd(CMD_FLASHREAD); + BUFFER_SPI_DWORD(dest) + BUFFER_SPI_DWORD(num) + + EVE_inc_cmdoffset(8); + + SEND_SPI_BUFFER() + + EVE_cmd_execute(); +} + + +/* this is meant to be called outside display-list building, it includes executing the command and waiting for completion, does not support cmd-burst */ +void EVE_cmd_flashsource(uint32_t ptr) +{ + EVE_begin_cmd(CMD_FLASHSOURCE); + BUFFER_SPI_DWORD(ptr) + + EVE_inc_cmdoffset(4); + + SEND_SPI_BUFFER() + + EVE_cmd_execute(); +} + + +/* switch the FLASH attached to a BT815/BT816 to full-speed mode, returns 0 for failing to do so, does not support cmd-burst */ +uint8_t EVE_init_flash(void) +{ + uint8_t timeout = 0; + uint8_t status; + + status = EVE_memRead8(REG_FLASH_STATUS); /* should be 0x02 - FLASH_STATUS_BASIC, power-up is done and the attached flash is detected */ + + while(status == 0) /* FLASH_STATUS_INIT - we are somehow still in init, give it a litte more time, this should never happen */ + { + status = EVE_memRead8(REG_FLASH_STATUS); + DELAY_MS(1); + timeout++; + if(timeout > 100) /* 100ms and still in init, lets call quits now and exit with an error */ + { + return 0; + } + } + + if(status == 1) /* FLASH_STATUS_DETACHED - no flash was found during init, no flash present or the detection failed, but have hope and let the BT81x have annother try */ + { + EVE_cmd_dl(CMD_FLASHATTACH); + EVE_cmd_execute(); + status = EVE_memRead8(REG_FLASH_STATUS); + if(status != 2) /* still not in FLASH_STATUS_BASIC, time to give up */ + { + return 0; + } + } + + if(status == 2) /* FLASH_STATUS_BASIC - flash detected and ready for action, lets move it up to FLASH_STATUS_FULL */ + { + uint32_t result; + + result = EVE_cmd_flashfast(); + + if(result == 0) /* cmd_flashfast was successful */ + { + return 1; + } + else /* room for improvement, cmd_flashfast provided an error code but there is no way to return it without returning a value that is FALSE all the same */ + { + return 0; + } + } + + if(status == 3) /* FLASH_STATUS_FULL - we are already there, why has this function been called? */ + { + return 1; + } + + return 0; +} +#endif + + +/* commands to draw graphics objects: */ + + +#if defined (BT81X_ENABLE) +/* as the name implies, "num_args" is the number of arguments passed to this function as variadic arguments */ +void EVE_cmd_text_var(int16_t x0, int16_t y0, int16_t font, uint16_t options, const char* text, uint8_t num_args, ...) +{ + va_list arguments; + uint8_t counter; + uint32_t data; + + va_start(arguments, num_args); + + BUFFER_SPI_DWORD(CMD_TEXT) + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(font) + BUFFER_SPI_WORD(options) + + EVE_inc_cmdoffset(12); + + EVE_write_string(text); + + if(options & EVE_OPT_FORMAT) + { + for(counter = 0; counter < num_args; counter++) + { + data = (uint32_t) va_arg(arguments, int); + BUFFER_SPI_DWORD(data) + EVE_inc_cmdoffset(4); + } + } + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } + + va_end(arguments); +} +#endif + + +void EVE_cmd_text(int16_t x0, int16_t y0, int16_t font, uint16_t options, const char* text) +{ + EVE_start_cmd(CMD_TEXT); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(font) + BUFFER_SPI_WORD(options) + + EVE_inc_cmdoffset(8); + + EVE_write_string(text); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +#if defined (BT81X_ENABLE) +/* as the name implies, "num_args" is the number of arguments passed to this function as variadic arguments */ +void EVE_cmd_button_var(int16_t x0, int16_t y0, int16_t w0, int16_t h0, int16_t font, uint16_t options, const char* text, uint8_t num_args, ...) +{ + va_list arguments; + uint8_t counter; + uint32_t data; + + va_start(arguments, num_args); + + EVE_start_cmd(CMD_BUTTON); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(w0) + BUFFER_SPI_WORD(h0) + BUFFER_SPI_WORD(font) + BUFFER_SPI_WORD(options) + + EVE_inc_cmdoffset(12); + + EVE_write_string(text); + + if(options & EVE_OPT_FORMAT) + { + for(counter = 0; counter < num_args; counter++) + { + data = (uint32_t) va_arg(arguments, int); + BUFFER_SPI_DWORD(data) + EVE_inc_cmdoffset(4); + } + } + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } + + va_end(arguments); +} +#endif + + +void EVE_cmd_button(int16_t x0, int16_t y0, int16_t w0, int16_t h0, int16_t font, uint16_t options, const char* text) +{ + EVE_start_cmd(CMD_BUTTON); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(w0) + BUFFER_SPI_WORD(h0) + BUFFER_SPI_WORD(font) + BUFFER_SPI_WORD(options) + + EVE_inc_cmdoffset(12); + + EVE_write_string(text); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +/* draw a clock */ +void EVE_cmd_clock(int16_t x0, int16_t y0, int16_t r0, uint16_t options, uint16_t hours, uint16_t minutes, uint16_t seconds, uint16_t millisecs) +{ + EVE_start_cmd(CMD_CLOCK); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(r0) + BUFFER_SPI_WORD(options) + BUFFER_SPI_WORD(hours) + BUFFER_SPI_WORD(minutes) + BUFFER_SPI_WORD(seconds) + BUFFER_SPI_WORD(millisecs) + + EVE_inc_cmdoffset(16); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_color_rgb(uint8_t red, uint8_t green, uint8_t blue) +{ + BUFFER_SPI_BYTE(green) /* low-byte */ + BUFFER_SPI_BYTE(blue) + BUFFER_SPI_BYTE(red) + BUFFER_SPI_BYTE(0x04) /* encoding for COLOR_RGB */ + + EVE_inc_cmdoffset(4); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_bgcolor(uint32_t color) +{ + EVE_start_cmd(CMD_BGCOLOR); + BUFFER_SPI_DWORD(color & 0x00ffffff) + + EVE_inc_cmdoffset(4); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_fgcolor(uint32_t color) +{ + EVE_start_cmd(CMD_FGCOLOR); + BUFFER_SPI_DWORD(color & 0x00ffffff) + + EVE_inc_cmdoffset(4); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_gradcolor(uint32_t color) +{ + EVE_start_cmd(CMD_GRADCOLOR); + BUFFER_SPI_DWORD(color & 0x00ffffff) + + EVE_inc_cmdoffset(4); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_gauge(int16_t x0, int16_t y0, int16_t r0, uint16_t options, uint16_t major, uint16_t minor, uint16_t val, uint16_t range) +{ + EVE_start_cmd(CMD_GAUGE); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(r0) + BUFFER_SPI_WORD(options) + BUFFER_SPI_WORD(major) + BUFFER_SPI_WORD(minor) + BUFFER_SPI_WORD(val) + BUFFER_SPI_WORD(range) + + EVE_inc_cmdoffset(16); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_gradient(int16_t x0, int16_t y0, uint32_t rgb0, int16_t x1, int16_t y1, uint32_t rgb1) +{ + EVE_start_cmd(CMD_GRADIENT); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_DWORD(rgb0 & 0x00ffffff) + BUFFER_SPI_WORD(x1) + BUFFER_SPI_WORD(y1) + BUFFER_SPI_DWORD(rgb1 & 0x00ffffff) + + EVE_inc_cmdoffset(16); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_keys(int16_t x0, int16_t y0, int16_t w0, int16_t h0, int16_t font, uint16_t options, const char* text) +{ + EVE_start_cmd(CMD_KEYS); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(w0) + BUFFER_SPI_WORD(h0) + BUFFER_SPI_WORD(font) + BUFFER_SPI_WORD(options) + + EVE_inc_cmdoffset(12); + + EVE_write_string(text); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_progress(int16_t x0, int16_t y0, int16_t w0, int16_t h0, uint16_t options, uint16_t val, uint16_t range) +{ + EVE_start_cmd(CMD_PROGRESS); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(w0) + BUFFER_SPI_WORD(h0) + BUFFER_SPI_WORD(options) + BUFFER_SPI_WORD(val) + BUFFER_SPI_WORD(range) + BUFFER_SPI_WORD(0) /* dummy word for 4-byte alignment */ + + EVE_inc_cmdoffset(16); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_scrollbar(int16_t x0, int16_t y0, int16_t w0, int16_t h0, uint16_t options, uint16_t val, uint16_t size, uint16_t range) +{ + EVE_start_cmd(CMD_SCROLLBAR); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(w0) + BUFFER_SPI_WORD(h0) + BUFFER_SPI_WORD(options) + BUFFER_SPI_WORD(val) + BUFFER_SPI_WORD(size) + BUFFER_SPI_WORD(range) + + EVE_inc_cmdoffset(16); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_slider(int16_t x1, int16_t y1, int16_t w1, int16_t h1, uint16_t options, uint16_t val, uint16_t range) +{ + EVE_start_cmd(CMD_SLIDER); + BUFFER_SPI_WORD(x1) + BUFFER_SPI_WORD(y1) + BUFFER_SPI_WORD(w1) + BUFFER_SPI_WORD(h1) + BUFFER_SPI_WORD(options) + BUFFER_SPI_WORD(val) + BUFFER_SPI_WORD(range) + BUFFER_SPI_WORD(0) /* dummy word for 4-byte alignment */ + + EVE_inc_cmdoffset(16); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_dial(int16_t x0, int16_t y0, int16_t r0, uint16_t options, uint16_t val) +{ + EVE_start_cmd(CMD_DIAL); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(r0) + BUFFER_SPI_WORD(options) + BUFFER_SPI_WORD(val) + BUFFER_SPI_WORD(0) /* dummy word for 4-byte alignment */ + + EVE_inc_cmdoffset(12); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +#if defined (BT81X_ENABLE) +/* as the name implies, "num_args" is the number of arguments passed to this function as variadic arguments */ +void EVE_cmd_toggle_var(int16_t x0, int16_t y0, int16_t w0, int16_t font, uint16_t options, uint16_t state, const char* text, uint8_t num_args, ...) +{ + va_list arguments; + uint8_t counter; + uint32_t data; + + va_start(arguments, num_args); + + EVE_start_cmd(CMD_TOGGLE); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(w0) + BUFFER_SPI_WORD(font) + BUFFER_SPI_WORD(options) + BUFFER_SPI_WORD(state) + + EVE_inc_cmdoffset(12); + + EVE_write_string(text); + + if(options & EVE_OPT_FORMAT) + { + for(counter = 0; counter < num_args; counter++) + { + data = (uint32_t) va_arg(arguments, int); + BUFFER_SPI_DWORD(data) + EVE_inc_cmdoffset(4); + } + } + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } + + va_end(arguments); +} +#endif + + +void EVE_cmd_toggle(int16_t x0, int16_t y0, int16_t w0, int16_t font, uint16_t options, uint16_t state, const char* text) +{ + EVE_start_cmd(CMD_TOGGLE); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(font) + BUFFER_SPI_WORD(options) + BUFFER_SPI_WORD(state) + + EVE_inc_cmdoffset(12); + + EVE_write_string(text); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +#if defined (FT81X_ENABLE) +void EVE_cmd_setbase(uint32_t base) +{ + EVE_start_cmd(CMD_SETBASE); + BUFFER_SPI_DWORD(base); + + EVE_inc_cmdoffset(4); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} +#endif +#endif // FT81X_FULL + + +#if defined (FT81X_ENABLE) +void EVE_cmd_setbitmap(uint32_t addr, uint16_t fmt, uint16_t width, uint16_t height) +{ + EVE_start_cmd(CMD_SETBITMAP); + BUFFER_SPI_DWORD(addr) + BUFFER_SPI_WORD(fmt) + BUFFER_SPI_WORD(width) + BUFFER_SPI_WORD(height) + BUFFER_SPI_WORD(0) + + EVE_inc_cmdoffset(12); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } + +} +#endif + +#if FT81X_FULL +void EVE_cmd_number(int16_t x0, int16_t y0, int16_t font, uint16_t options, int32_t number) +{ + EVE_start_cmd(CMD_NUMBER); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(font) + BUFFER_SPI_WORD(options) + BUFFER_SPI_DWORD(number) + + EVE_inc_cmdoffset(12); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_append(uint32_t ptr, uint32_t num) +{ + EVE_start_cmd(CMD_APPEND); + BUFFER_SPI_DWORD(ptr) + BUFFER_SPI_DWORD(num) + + EVE_inc_cmdoffset(8); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +/* commands for setting the bitmap transform matrix: */ + +/* + The description in the programmers guide is strange for this function. + While it is named *get*matrix, parameters 'a' to 'f' are supplied to the function + and described as "output parameter" + Best guess is that this one allows to setup the matrix coefficients manually. + If this assumption is correct it rather should be named cmd_setupmatrix(). +*/ +void EVE_cmd_getmatrix(int32_t a, int32_t b, int32_t c, int32_t d, int32_t e, int32_t f) +{ + EVE_start_cmd(CMD_GETMATRIX); + BUFFER_SPI_DWORD(a) + BUFFER_SPI_DWORD(b) + BUFFER_SPI_DWORD(c) + BUFFER_SPI_DWORD(d) + BUFFER_SPI_DWORD(e) + BUFFER_SPI_DWORD(f) + + EVE_inc_cmdoffset(24); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_translate(int32_t tx, int32_t ty) +{ + EVE_start_cmd(CMD_TRANSLATE); + BUFFER_SPI_DWORD(tx) + BUFFER_SPI_DWORD(ty) + + EVE_inc_cmdoffset(8); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_scale(int32_t sx, int32_t sy) +{ + EVE_start_cmd(CMD_SCALE); + BUFFER_SPI_DWORD(sx) + BUFFER_SPI_DWORD(sy) + + EVE_inc_cmdoffset(8); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_rotate(int32_t ang) +{ + EVE_start_cmd(CMD_ROTATE); + BUFFER_SPI_DWORD(ang) + + EVE_inc_cmdoffset(4); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +#if defined (BT81X_ENABLE) +void EVE_cmd_rotatearound(int32_t x0, int32_t y0, int32_t angle, int32_t scale) +{ + EVE_start_cmd(CMD_ROTATEAROUND); + BUFFER_SPI_DWORD(x0) + BUFFER_SPI_DWORD(y0) + BUFFER_SPI_DWORD(angle) + BUFFER_SPI_DWORD(scale) + + EVE_inc_cmdoffset(16); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} +#endif + + +/* other commands: */ +void EVE_cmd_calibrate(void) +{ + EVE_start_cmd(CMD_CALIBRATE); + BUFFER_SPI_DWORD(0) + + EVE_inc_cmdoffset(4); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +#if defined (FT81X_ENABLE) +void EVE_cmd_romfont(uint32_t font, uint32_t romslot) +{ + EVE_start_cmd(CMD_ROMFONT); + BUFFER_SPI_DWORD(font & 0x0000ffff) + BUFFER_SPI_DWORD(romslot & 0x0000ffff) + + EVE_inc_cmdoffset(8); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} +#endif + + +#if defined (FT81X_ENABLE) +void EVE_cmd_setscratch(uint32_t handle) +{ + EVE_start_cmd(CMD_SETSCRATCH); + BUFFER_SPI_DWORD(handle) + + EVE_inc_cmdoffset(4); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} +#endif + + +void EVE_cmd_sketch(int16_t x0, int16_t y0, uint16_t w0, uint16_t h0, uint32_t ptr, uint16_t format) +{ + EVE_start_cmd(CMD_SKETCH); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(w0) + BUFFER_SPI_WORD(h0) + BUFFER_SPI_DWORD(ptr) + BUFFER_SPI_WORD(format) + BUFFER_SPI_WORD(0) /* dummy word for 4-byte alignment */ + + EVE_inc_cmdoffset(16); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_spinner(int16_t x0, int16_t y0, uint16_t style, uint16_t scale) +{ + EVE_start_cmd(CMD_SPINNER); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_WORD(style) + BUFFER_SPI_WORD(scale) + + EVE_inc_cmdoffset(8); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +/* various commands new for EVE3 */ +#if defined (BT81X_ENABLE) + +void EVE_cmd_animstart(int32_t ch, uint32_t aoptr, uint32_t loop) +{ + EVE_start_cmd(CMD_ANIMSTART); + BUFFER_SPI_DWORD(ch) + BUFFER_SPI_DWORD(aoptr) + BUFFER_SPI_DWORD(loop) + + EVE_inc_cmdoffset(12); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_animstop(int32_t ch) +{ + EVE_start_cmd(CMD_ANIMSTOP); + BUFFER_SPI_DWORD(ch) + + EVE_inc_cmdoffset(4); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_animxy(int32_t ch, int16_t x0, int16_t y0) +{ + EVE_start_cmd(CMD_ANIMXY); + BUFFER_SPI_DWORD(ch) + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + + EVE_inc_cmdoffset(8); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_animdraw(int32_t ch) +{ + EVE_start_cmd(CMD_ANIMDRAW); + BUFFER_SPI_DWORD(ch) + + EVE_inc_cmdoffset(4); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_animframe(int16_t x0, int16_t y0, uint32_t aoptr, uint32_t frame) +{ + EVE_start_cmd(CMD_ANIMFRAME); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_DWORD(aoptr) + BUFFER_SPI_DWORD(frame) + + EVE_inc_cmdoffset(12); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_gradienta(int16_t x0, int16_t y0, uint32_t argb0, int16_t x1, int16_t y1, uint32_t argb1) +{ + EVE_start_cmd(CMD_GRADIENTA); + BUFFER_SPI_WORD(x0) + BUFFER_SPI_WORD(y0) + BUFFER_SPI_DWORD(argb0) + BUFFER_SPI_WORD(x1) + BUFFER_SPI_WORD(y1) + BUFFER_SPI_DWORD(argb1) + + EVE_inc_cmdoffset(16); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_fillwidth(uint32_t s) +{ + EVE_start_cmd(CMD_FILLWIDTH); + BUFFER_SPI_DWORD(s) + + EVE_inc_cmdoffset(4); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +void EVE_cmd_appendf(uint32_t ptr, uint32_t num) +{ + EVE_start_cmd(CMD_APPENDF); + BUFFER_SPI_DWORD(ptr) + BUFFER_SPI_DWORD(num) + + EVE_inc_cmdoffset(8); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +#endif + + +/* warning! meta-command! this is a sequence of display-list commands to simplify use at the price of some overhead */ +void EVE_cmd_point(int16_t x0, int16_t y0, uint16_t size) +{ + EVE_start_cmd((DL_BEGIN | EVE_POINTS)); + + uint32_t calc = POINT_SIZE(size*16); + BUFFER_SPI_DWORD(calc) + + calc = VERTEX2F(x0 * 16, y0 * 16); + BUFFER_SPI_DWORD(calc) + + BUFFER_SPI_DWORD(DL_END) + + EVE_inc_cmdoffset(12); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +/* warning! meta-command! this is a sequence of display-list commands to simplify use at the price of some overhead */ +void EVE_cmd_line(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t width) +{ + EVE_start_cmd((DL_BEGIN | EVE_LINES)); + + uint32_t calc = LINE_WIDTH(width * 16); + BUFFER_SPI_DWORD(calc) + + calc = VERTEX2F(x0 * 16, y0 * 16); + BUFFER_SPI_DWORD(calc) + + calc = VERTEX2F(x1 * 16, y1 * 16); + BUFFER_SPI_DWORD(calc) + + BUFFER_SPI_DWORD(DL_END) + + EVE_inc_cmdoffset(16); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +/* warning! meta-command! this is a sequence of display-list commands to simplify use at the price of some overhead */ +void EVE_cmd_rect(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t corner) +{ + EVE_start_cmd((DL_BEGIN | EVE_RECTS)); + + uint32_t calc = LINE_WIDTH(corner * 16); + BUFFER_SPI_DWORD(calc) + + calc = VERTEX2F(x0 * 16, y0 * 16); + BUFFER_SPI_DWORD(calc) + + calc = VERTEX2F(x1 * 16, y1 * 16); + BUFFER_SPI_DWORD(calc) + + BUFFER_SPI_DWORD(DL_END) + + EVE_inc_cmdoffset(16); + + if(!cmd_burst) + { + SEND_SPI_BUFFER() + } +} + + +/* this is meant to be called outside display-list building */ +/* this function displays an interactive calibration screen, calculates the calibration values and */ +/* writes the new values to the touch matrix registers of EVE */ +/* unlike the built-in cmd_calibrate() of EVE this also works with displays that are cut down from larger ones like EVE2-38A / EVE2-38G */ +/* the height is needed as parameter as EVE_VSIZE for the EVE2-38 is 272 but the visible size is only 116 */ +/* so the call would be EVE_calibrate_manual(116); for the EVE2-38A and EVE2-38G while for most other displays */ +/* using EVE_calibrate_manual(EVE_VSIZE) would work - but for normal displays the built-in cmd_calibrate would work as expected anyways */ +/* this code was taken from the MatrixOrbital EVE2-Library on Github, adapted and modified */ +void EVE_calibrate_manual(uint16_t height) +{ + uint32_t displayX[3], displayY[3]; + uint32_t touchX[3], touchY[3]; + uint32_t touchValue; + int32_t tmp, k; + int32_t TransMatrix[6]; + uint8_t count = 0; + char num[2]; + uint8_t touch_lock = 1; + + /* these values determine where your calibration points will be drawn on your display */ + displayX[0] = (EVE_HSIZE * 0.15); + displayY[0] = (height * 0.15); + + displayX[1] = (EVE_HSIZE * 0.85); + displayY[1] = (height / 2); + + displayX[2] = (EVE_HSIZE / 2); + displayY[2] = (height * 0.85); + + while (count < 3) + { + // immediate transfer mode + EVE_cmd_dl(CMD_DLSTART); + EVE_cmd_dl(DL_CLEAR_RGB | 0x000000); + EVE_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); + + /* draw Calibration Point on screen */ + EVE_cmd_dl(DL_COLOR_RGB | 0x0000ff); + EVE_cmd_dl(POINT_SIZE(20*16)); + EVE_cmd_dl((DL_BEGIN | EVE_POINTS)); + EVE_cmd_dl(VERTEX2F((uint32_t)(displayX[count]) * 16, (uint32_t)((displayY[count])) * 16)); + EVE_cmd_dl(DL_END); + EVE_cmd_dl(DL_COLOR_RGB | 0xffffff); + EVE_cmd_text((EVE_HSIZE/2), 50, 27, EVE_OPT_CENTER, "Please tap on the dot."); + num[0] = count + 0x31; num[1] = 0; /* null terminated string of one character */ + EVE_cmd_text(displayX[count], displayY[count], 27, EVE_OPT_CENTER, num); + + EVE_cmd_dl(DL_DISPLAY); + EVE_cmd_dl(CMD_SWAP); + EVE_cmd_execute(); + + while(1) + { + touchValue = EVE_memRead32(REG_TOUCH_DIRECT_XY); /* read for any new touch tag inputs */ + + if(touch_lock) + { + if(touchValue & 0x80000000) /* check if we have no touch */ + { + touch_lock = 0; + } + } + else + { + if (!(touchValue & 0x80000000)) /* check if a touch is detected */ + { + touchX[count] = (touchValue>>16) & 0x03FF; /* raw Touchscreen Y coordinate */ + touchY[count] = touchValue & 0x03FF; /* raw Touchscreen Y coordinate */ + touch_lock = 1; + count++; + break; /* leave while(1) */ + } + } + } + } + + k = ((touchX[0] - touchX[2])*(touchY[1] - touchY[2])) - ((touchX[1] - touchX[2])*(touchY[0] - touchY[2])); + + tmp = (((displayX[0] - displayX[2]) * (touchY[1] - touchY[2])) - ((displayX[1] - displayX[2])*(touchY[0] - touchY[2]))); + TransMatrix[0] = ((int64_t)tmp << 16) / k; + + tmp = (((touchX[0] - touchX[2]) * (displayX[1] - displayX[2])) - ((displayX[0] - displayX[2])*(touchX[1] - touchX[2]))); + TransMatrix[1] = ((int64_t)tmp << 16) / k; + + tmp = ((touchY[0] * (((touchX[2] * displayX[1]) - (touchX[1] * displayX[2])))) + (touchY[1] * (((touchX[0] * displayX[2]) - (touchX[2] * displayX[0])))) + (touchY[2] * (((touchX[1] * displayX[0]) - (touchX[0] * displayX[1]))))); + TransMatrix[2] = ((int64_t)tmp << 16) / k; + + tmp = (((displayY[0] - displayY[2]) * (touchY[1] - touchY[2])) - ((displayY[1] - displayY[2])*(touchY[0] - touchY[2]))); + TransMatrix[3] = ((int64_t)tmp << 16) / k; + + tmp = (((touchX[0] - touchX[2]) * (displayY[1] - displayY[2])) - ((displayY[0] - displayY[2])*(touchX[1] - touchX[2]))); + TransMatrix[4] = ((int64_t)tmp << 16) / k; + + tmp = ((touchY[0] * (((touchX[2] * displayY[1]) - (touchX[1] * displayY[2])))) + (touchY[1] * (((touchX[0] * displayY[2]) - (touchX[2] * displayY[0])))) + (touchY[2] * (((touchX[1] * displayY[0]) - (touchX[0] * displayY[1]))))); + TransMatrix[5] = ((int64_t)tmp << 16) / k; + + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, TransMatrix[0]); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, TransMatrix[1]); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, TransMatrix[2]); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, TransMatrix[3]); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, TransMatrix[4]); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, TransMatrix[5]); +} +#endif // FT81X_FULL diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/EVE_commands.h b/lib/lvgl_esp32_drivers/lvgl_tft/EVE_commands.h new file mode 100644 index 0000000..dcde16c --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/EVE_commands.h @@ -0,0 +1,204 @@ +/* +@file EVE_commands.h +@brief contains FT8xx / BT8xx function prototypes +@version 4.1 LvGL edition +@date 2020-04-13 +@author Rudolph Riedel, David Jade + +@section LICENSE + +MIT License + +Copyright (c) 2016-2020 Rudolph Riedel and David Jade + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +@section History + +4.1 LvGL edition + + - This version is a heavily modified version of the MIT licensed FT81x code from https://github.com/RudolphRiedel/FT800-FT813 + This version is based on a fork by David Jade that added native SPI DMA support and stripped out non-ESP32 code. + It has also been trimmed down to suit LvGL's needs. Extra features can be enabled by defining FT81X_FULL +*/ + +#include "EVE.h" + +#ifndef EVE_COMMANDS_H_ +#define EVE_COMMANDS_H_ + +#define BLOCK_TRANSFER_SIZE 3840 // block transfer size when write data to CMD buffer + +void DELAY_MS(uint16_t ms); +void EVE_pdn_set(void); +void EVE_pdn_clear(void); +void spi_acquire(); +void spi_release(); + +void EVE_cmdWrite(uint8_t command, uint8_t parameter); + +uint8_t EVE_memRead8(uint32_t ftAddress); +uint16_t EVE_memRead16(uint32_t ftAddress); +uint32_t EVE_memRead32(uint32_t ftAddress); + +void EVE_memWrite8(uint32_t ftAddress, uint8_t ftData8); +void EVE_memWrite16(uint32_t ftAddress, uint16_t ftData16); +void EVE_memWrite32(uint32_t ftAddress, uint32_t ftData32); + +void EVE_memWrite_buffer(uint32_t ftAddress, const uint8_t *data, uint32_t len, bool LvGL_Flush); + +uint8_t EVE_busy(void); + +void EVE_get_cmdoffset(void); + + +/* commands to operate on memory: */ +void EVE_cmd_memzero(uint32_t ptr, uint32_t num); +void EVE_cmd_memset(uint32_t ptr, uint8_t value, uint32_t num); +void EVE_cmd_memwrite(uint32_t dest, uint32_t num, const uint8_t *data); +void EVE_cmd_memcpy(uint32_t dest, uint32_t src, uint32_t num); + +#if FT81X_FULL +void block_transfer(const uint8_t *data, uint32_t len); +/* commands for loading image data into FT8xx memory: */ +void EVE_cmd_inflate(uint32_t ptr, const uint8_t *data, uint16_t len); +void EVE_cmd_loadimage(uint32_t ptr, uint32_t options, const uint8_t *data, uint16_t len); + +#if defined (FT81X_ENABLE) +void EVE_cmd_mediafifo(uint32_t ptr, uint32_t size); +#endif +#endif // FT81X_FULL + +void EVE_cmd_start(void); +void EVE_cmd_execute(void); + +void EVE_start_cmd_burst(void); +void EVE_end_cmd_burst(void); + +void EVE_cmd_dl(uint32_t command); + + +#if FT81X_FULL +/* EVE3 commands */ +#if defined (BT81X_ENABLE) + +void EVE_cmd_flashwrite(uint32_t ptr, uint32_t num, const uint8_t *data); +void EVE_cmd_flashread(uint32_t dest, uint32_t src, uint32_t num); +void EVE_cmd_flashupdate(uint32_t dest, uint32_t src, uint32_t num); +void EVE_cmd_flasherase(void); +void EVE_cmd_flashattach(void); +void EVE_cmd_flashdetach(void); +void EVE_cmd_flashspidesel(void); +uint32_t EVE_cmd_flashfast(void); +void EVE_cmd_flashspitx(uint32_t num, const uint8_t *data); +void EVE_cmd_flashspirx(uint32_t dest, uint32_t num); +void EVE_cmd_flashsource(uint32_t ptr); + +void EVE_cmd_inflate2(uint32_t ptr, uint32_t options, const uint8_t *data, uint16_t len); +void EVE_cmd_rotatearound(int32_t x0, int32_t y0, int32_t angle, int32_t scale); +void EVE_cmd_animstart(int32_t ch, uint32_t aoptr, uint32_t loop); +void EVE_cmd_animstop(int32_t ch); +void EVE_cmd_animxy(int32_t ch, int16_t x0, int16_t y0); +void EVE_cmd_animdraw(int32_t ch); +void EVE_cmd_animframe(int16_t x0, int16_t y0, uint32_t aoptr, uint32_t frame); +void EVE_cmd_gradienta(int16_t x0, int16_t y0, uint32_t argb0, int16_t x1, int16_t y1, uint32_t argb1); +void EVE_cmd_fillwidth(uint32_t s); +void EVE_cmd_appendf(uint32_t ptr, uint32_t num); + +uint8_t EVE_init_flash(void); +#endif + + +/* commands to draw graphics objects: */ + +#if defined (BT81X_ENABLE) +void EVE_cmd_text_var(int16_t x0, int16_t y0, int16_t font, uint16_t options, const char* text, uint8_t numargs, ...); +void EVE_cmd_button_var(int16_t x0, int16_t y0, int16_t w0, int16_t h0, int16_t font, uint16_t options, const char* text, uint8_t num_args, ...); +void EVE_cmd_toggle_var(int16_t x0, int16_t y0, int16_t w0, int16_t font, uint16_t options, uint16_t state, const char* text, uint8_t num_args, ...); +#endif + +void EVE_cmd_text(int16_t x0, int16_t y0, int16_t font, uint16_t options, const char* text); +void EVE_cmd_button(int16_t x0, int16_t y0, int16_t w0, int16_t h0, int16_t font, uint16_t options, const char* text); +void EVE_cmd_clock(int16_t x0, int16_t y0, int16_t r0, uint16_t options, uint16_t hours, uint16_t minutes, uint16_t seconds, uint16_t millisecs); +void EVE_color_rgb(uint8_t red, uint8_t green, uint8_t blue); +void EVE_cmd_bgcolor(uint32_t color); +void EVE_cmd_fgcolor(uint32_t color); +void EVE_cmd_gradcolor(uint32_t color); +void EVE_cmd_gauge(int16_t x0, int16_t y0, int16_t r0, uint16_t options, uint16_t major, uint16_t minor, uint16_t val, uint16_t range); +void EVE_cmd_gradient(int16_t x0, int16_t y0, uint32_t rgb0, int16_t x1, int16_t y1, uint32_t rgb1); +void EVE_cmd_keys(int16_t x0, int16_t y0, int16_t w0, int16_t h0, int16_t font, uint16_t options, const char* text); +void EVE_cmd_progress(int16_t x0, int16_t y0, int16_t w0, int16_t h0, uint16_t options, uint16_t val, uint16_t range); +void EVE_cmd_scrollbar(int16_t x0, int16_t y0, int16_t w0, int16_t h0, uint16_t options, uint16_t val, uint16_t size, uint16_t range); +void EVE_cmd_slider(int16_t x1, int16_t y1, int16_t w1, int16_t h1, uint16_t options, uint16_t val, uint16_t range); +void EVE_cmd_dial(int16_t x0, int16_t y0, int16_t r0, uint16_t options, uint16_t val); +void EVE_cmd_toggle(int16_t x0, int16_t y0, int16_t w0, int16_t font, uint16_t options, uint16_t state, const char* text); +void EVE_cmd_number(int16_t x0, int16_t y0, int16_t font, uint16_t options, int32_t number); +#endif // FT81X_FULL + +#if defined (FT81X_ENABLE) +#if FT81X_FULL +void EVE_cmd_setbase(uint32_t base); +#endif +void EVE_cmd_setbitmap(uint32_t addr, uint16_t fmt, uint16_t width, uint16_t height); +#endif + + +#if FT81X_FULL +void EVE_cmd_append(uint32_t ptr, uint32_t num); + + +/* commands for setting the bitmap transform matrix: */ +void EVE_cmd_getmatrix(int32_t a, int32_t b, int32_t c, int32_t d, int32_t e, int32_t f); +void EVE_cmd_translate(int32_t tx, int32_t ty); +void EVE_cmd_scale(int32_t sx, int32_t sy); +void EVE_cmd_rotate(int32_t ang); + + +/* other commands: */ +void EVE_cmd_calibrate(void); +void EVE_cmd_interrupt(uint32_t ms); +void EVE_cmd_setfont(uint32_t font, uint32_t ptr); +#if defined (FT81X_ENABLE) +void EVE_cmd_romfont(uint32_t font, uint32_t romslot); +void EVE_cmd_setfont2(uint32_t font, uint32_t ptr, uint32_t firstchar); +void EVE_cmd_setrotate(uint32_t r); +void EVE_cmd_setscratch(uint32_t handle); +#endif +void EVE_cmd_sketch(int16_t x0, int16_t y0, uint16_t w0, uint16_t h0, uint32_t ptr, uint16_t format); +void EVE_cmd_snapshot(uint32_t ptr); +#if defined (FT81X_ENABLE) +void EVE_cmd_snapshot2(uint32_t fmt, uint32_t ptr, int16_t x0, int16_t y0, int16_t w0, int16_t h0); +#endif +void EVE_cmd_spinner(int16_t x0, int16_t y0, uint16_t style, uint16_t scale); +void EVE_cmd_track(int16_t x0, int16_t y0, int16_t w0, int16_t h0, int16_t tag); + + +/* commands that return values by writing to the command-fifo */ +uint32_t EVE_cmd_memcrc(uint32_t ptr, uint32_t num); +uint32_t EVE_cmd_getptr(void); +uint32_t EVE_cmd_regread(uint32_t ptr); +void EVE_LIB_GetProps(uint32_t *pointer, uint32_t *width, uint32_t *height); + + +/* meta-commands, sequences of several display-list entries condensed into simpler to use functions at the price of some overhead */ +void EVE_cmd_point(int16_t x0, int16_t y0, uint16_t size); +void EVE_cmd_line(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t w0); +void EVE_cmd_rect(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t corner); + +void EVE_calibrate_manual(uint16_t height); +#endif // FT81X_FULL + + +/* startup FT8xx: */ +uint8_t EVE_init(void); + +#endif /* EVE_COMMANDS_H_ */ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/EVE_config.h b/lib/lvgl_esp32_drivers/lvgl_tft/EVE_config.h new file mode 100644 index 0000000..f06c7e6 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/EVE_config.h @@ -0,0 +1,1047 @@ +/* +@file EVE_config.h +@brief configuration information for some TFTs +@version 4.0 +@date 2020-02-16 +@author Rudolph Riedel, David Jade + +@section LICENSE + +MIT License + +Copyright (c) 2016-2020 Rudolph Riedel amd David Jade + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +@section History + +4.1 LvGL edition + + - This version is a heavily modified version of the MIT licensed FT81x code from https://github.com/RudolphRiedel/FT800-FT813 + This version is based on a fork by David Jade that added native SPI DMA support and stripped out non-ESP32 code. + It has also been trimmed down to suit LvGL's needs. Extra features can be enabled by defining FT81X_FULL +*/ + + +#ifndef EVE_CONFIG_H_ +#define EVE_CONFIG_H_ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif +#include "../lvgl_spi_conf.h" + +#include "FT81x.h" + +#define EVE_CLK DISP_SPI_CLK // orange +#define EVE_MISO DISP_SPI_MISO // yellow +#define EVE_MOSI DISP_SPI_MOSI // green +#define EVE_CS DISP_SPI_CS // blue +#define EVE_PDN CONFIG_LV_DISP_PIN_RST // grey +#define EVE_COLOR_DEPTH 16 +#define SPI_TRANSER_SIZE (DISP_BUF_SIZE * (EVE_COLOR_DEPTH / 8)) + +#define BYTES_PER_PIXEL (EVE_COLOR_DEPTH / 8) +#define BYTES_PER_LINE (EVE_HSIZE * BYTES_PER_PIXEL) + +#define LV_BYTES_PER_PIXEL (LV_COLOR_DEPTH / 8) +#define LV_BYTES_PER_LINE (EVE_HSIZE * LV_BYTES_PER_PIXEL) + +#define SCREEN_BUFFER_SIZE (EVE_HSIZE * EVE_VSIZE * BYTES_PER_PIXEL) + +#define SPI_BUFFER_SIZE 256 // size in bytes (multiples of 4) of SPI transaction buffer for streaming commands + +/* select the settings for the TFT attached */ +#if 0 + #define EVE_VM800B35A + #define EVE_VM800B43A + #define EVE_VM800B50A + #define EVE_VM810C + #define EVE_ME812A + #define EVE_ME813A + #define EVE_FT810CB_HY50HD + #define EVE_FT811CB_HY50HD + #define EVE_ET07 + #define EVE_RVT28 + #define EVE_RVT35 + #define EVE_RVT43 + #define EVE_RVT50 + #define EVE_RVT70 + #define EVE_RiTFT43 + #define EVE_RiTFT50 + #define EVE_RiTFT70 + #define EVE_EVE2_29 + #define EVE_EVE2_35 + #define EVE_EVE2_35G + #define EVE_EVE2_38 + #define EVE_EVE2_38G + #define EVE_EVE2_43 + #define EVE_EVE2_43G + #define EVE_EVE2_50 + #define EVE_EVE2_50G + #define EVE_EVE2_70 + #define EVE_EVE2_70G + #define EVE_EVE3_35 + #define EVE_EVE3_35G + #define EVE_EVE3_43 + #define EVE_EVE3_43G + #define EVE_EVE3_50 + #define EVE_EVE3_50G + #define EVE_EVE3_70 + #define EVE_EVE3_70G + #define EVE_NHD_35 + #define EVE_NHD_43 + #define EVE_NHD_50 + #define EVE_NHD_70 + #define EVE_ADAM101 + #define EVE_CFAF240400C1_030SC + #define EVE_CFAF320240F_035T + #define EVE_CFAF480128A0_039TC + #define EVE_CFAF800480E0_050SC + #define EVE_PAF90 + #define EVE_SUNFLOWER + #define EVE_CONNECTEVE +#endif + + +#if defined(CONFIG_LV_FT81X_CONFIG_EVE_VM800B35A) +#define EVE_VM800B35A +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_VM800B43A) +#define EVE_VM800B43A +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_VM800B50A) +#define EVE_VM800B50A +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_VM810C) +#define EVE_VM810C +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_ME812A) +#define EVE_ME812A +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_ME813A) +#define EVE_ME813A +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_FT810CB_HY50HD) +#define EVE_FT810CB_HY50HD +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_FT811CB_HY50HD) +#define EVE_FT811CB_HY50HD +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_ET07) +#define EVE_ET07 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_RVT28) +#define EVE_RVT28 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_RVT35) +#define EVE_RVT35 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_RVT43) +#define EVE_RVT43 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_RVT50) +#define EVE_RVT50 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_RVT70) +#define EVE_RVT70 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_RiTFT43) +#define EVE_RiTFT43 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_RiTFT50) +#define EVE_RiTFT50 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_RiTFT70) +#define EVE_RiTFT70 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE2_29) +#define EVE_EVE2_29 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE2_35) +#define EVE_EVE2_35 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE2_35G) +#define EVE_EVE2_35G +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE2_38) +#define EVE_EVE2_38 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE2_38G) +#define EVE_EVE2_38G +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE2_43) +#define EVE_EVE2_43 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE2_43G) +#define EVE_EVE2_43G +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE2_50) +#define EVE_EVE2_50 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE2_50G) +#define EVE_EVE2_50G +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE2_70) +#define EVE_EVE2_70 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE2_70G) +#define EVE_EVE2_70G +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE3_35) +#define EVE_EVE3_35 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE3_35G) +#define EVE_EVE3_35G +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE3_43) +#define EVE_EVE3_43 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE3_43G) +#define EVE_EVE3_43G +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE3_50) +#define EVE_EVE3_50 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE3_50G) +#define EVE_EVE3_50G +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE3_70) +#define EVE_EVE3_70 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_EVE3_70G) +#define EVE_EVE3_70G +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_NHD_35) +#define EVE_NHD_35 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_NHD_43) +#define EVE_NHD_43 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_NHD_50) +#define EVE_NHD_50 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_NHD_70) +#define EVE_NHD_70 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_ADAM101) +#define EVE_ADAM101 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_CFAF240400C1_030SC) +#define EVE_CFAF240400C1_030SC +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_CFAF320240F_035T) +#define EVE_CFAF320240F_035T +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_CFAF480128A0_039TC) +#define EVE_CFAF480128A0_039TC +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_CFAF800480E0_050SC) +#define EVE_CFAF800480E0_050SC +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_PAF90) +#define EVE_PAF90 +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_SUNFLOWER) +#define EVE_SUNFLOWER +#elif defined(CONFIG_LV_FT81X_CONFIG_EVE_CONNECTEVE) +#define EVE_CONNECTEVE +#endif + +/* display timing parameters below */ + +/* untested */ +#if defined (EVE_EVE3_35) +#define EVE_EVE2_35 +#define EVE_HAS_CRYSTAL +#define BT81X_ENABLE +#endif + +/* untested */ +#if defined (EVE_EVE3_35G) +#define EVE_EVE2_35G +#define EVE_HAS_CRYSTAL +#define BT81X_ENABLE +#endif + +/* untested */ +#if defined (EVE_EVE3_43) +#define EVE_EVE2_43 +#define EVE_HAS_CRYSTAL +#define BT81X_ENABLE +#endif + +#if defined (EVE_EVE3_43G) +#define EVE_EVE2_43G +#define EVE_HAS_CRYSTAL +#define BT81X_ENABLE +#endif + +/* untested */ +#if defined (EVE_EVE3_50) +#define EVE_EVE2_50 +#define EVE_HAS_CRYSTAL +#define BT81X_ENABLE +#endif + +#if defined (EVE_EVE3_50G) +#define EVE_EVE2_50G +#define EVE_HAS_CRYSTAL +#define BT81X_ENABLE +#endif + +/* untested */ +#if defined (EVE_EVE3_70) +#define EVE_EVE2_70 +#define EVE_HAS_CRYSTAL +#define BT81X_ENABLE +#endif + +/* untested */ +#if defined (EVE_EVE3_70G) +#define EVE_EVE2_70G +#define EVE_HAS_CRYSTAL +#define BT81X_ENABLE +#endif + +#if defined (EVE_RiTFT43) +#define EVE_RVT43 +#define EVE_HAS_CRYSTAL +#define FT81X_ENABLE +#define BT81X_ENABLE +#endif + +/* untested */ +#if defined (EVE_RiTFT50) +#define EVE_RVT70 +#define EVE_HAS_CRYSTAL +#define BT81X_ENABLE +#endif + +/* untested */ +#if defined (EVE_RiTFT70) +#define EVE_RVT70 +#define EVE_HAS_CRYSTAL +#define BT81X_ENABLE +#endif + + +/* some test setup */ +#if defined (EVE_800x480x) +#define EVE_HSIZE (800L) /* Thd Length of visible part of line (in PCLKs) - display width */ +#define EVE_VSIZE (480L) /* Tvd Number of visible lines (in lines) - display height */ + +#define EVE_VSYNC0 (0L) /* Tvf Vertical Front Porch */ +#define EVE_VSYNC1 (10L) /* Tvf + Tvp Vertical Front Porch plus Vsync Pulse width */ +#define EVE_VOFFSET (35L) /* Tvf + Tvp + Tvb Number of non-visible lines (in lines) */ +#define EVE_VCYCLE (516L) /* Tv Total number of lines (visible and non-visible) (in lines) */ +#define EVE_HSYNC0 (0L) /* (40L) // Thf Horizontal Front Porch */ +#define EVE_HSYNC1 (88L) /* Thf + Thp Horizontal Front Porch plus Hsync Pulse width */ +#define EVE_HOFFSET (169L) /* Thf + Thp + Thb Length of non-visible part of line (in PCLK cycles) */ +#define EVE_HCYCLE (969L) /* Th Total length of line (visible and non-visible) (in PCLKs) */ +#define EVE_PCLKPOL (1L) /* PCLK polarity (0 = rising edge, 1 = falling edge) */ +#define EVE_SWIZZLE (0L) /* Defines the arrangement of the RGB pins of the FT800 */ +#define EVE_PCLK (2L) /* 60MHz / REG_PCLK = PCLK frequency 30 MHz */ +#define EVE_CSPREAD (1L) /* helps with noise, when set to 1 fewer signals are changed simultaneously, reset-default: 1 */ +#define EVE_TOUCH_RZTHRESH (1200L) /* touch-sensitivity */ +#define EVE_HAS_CRYSTAL +#define FT81X_ENABLE +#endif + + +/* VM800B35A: FT800 320x240 3.5" FTDI FT800 */ +#if defined (EVE_VM800B35A) +#define EVE_HSIZE (320L) /* Thd Length of visible part of line (in PCLKs) - display width */ +#define EVE_VSIZE (240L) /* Tvd Number of visible lines (in lines) - display height */ + +#define EVE_VSYNC0 (0L) /* Tvf Vertical Front Porch */ +#define EVE_VSYNC1 (2L) /* Tvf + Tvp Vertical Front Porch plus Vsync Pulse width */ +#define EVE_VOFFSET (13L) /* Tvf + Tvp + Tvb Number of non-visible lines (in lines) */ +#define EVE_VCYCLE (263L) /* Tv Total number of lines (visible and non-visible) (in lines) */ +#define EVE_HSYNC0 (0L) /* Thf Horizontal Front Porch */ +#define EVE_HSYNC1 (10L) /* Thf + Thp Horizontal Front Porch plus Hsync Pulse width */ +#define EVE_HOFFSET (70L) /* Thf + Thp + Thb Length of non-visible part of line (in PCLK cycles) */ +#define EVE_HCYCLE (408L) /* Th Total length of line (visible and non-visible) (in PCLKs) */ +#define EVE_PCLKPOL (0L) /* PCLK polarity (0 = rising edge, 1 = falling edge) */ +#define EVE_SWIZZLE (2L) /* Defines the arrangement of the RGB pins of the FT800 */ +#define EVE_PCLK (8L) /* 48MHz / REG_PCLK = PCLK frequency */ +#define EVE_CSPREAD (1L) /* helps with noise, when set to 1 fewer signals are changed simultaneously, reset-default: 1 */ +#define EVE_TOUCH_RZTHRESH (1200L) /* touch-sensitivity */ +#define EVE_HAS_CRYSTAL /* use external crystal or internal oscillator? */ +#endif + + +/* FTDI/BRT EVE modules VM800B43A and VM800B50A FT800 480x272 4.3" and 5.0" */ +#if defined (EVE_VM800B43A) || defined (EVE_VM800B50A) +#define EVE_HSIZE (480L) +#define EVE_VSIZE (272L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (10L) +#define EVE_VOFFSET (12L) +#define EVE_VCYCLE (292L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (41L) +#define EVE_HOFFSET (43L) +#define EVE_HCYCLE (548L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (5L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define EVE_HAS_CRYSTAL +#endif + + +/* untested */ +/* FTDI/BRT EVE2 modules VM810C50A-D, ME812A-WH50R and ME813A-WH50C, 800x480 5.0" */ +#if defined (EVE_VM810C) || defined (EVE_ME812A) || defined (EVE_ME813A) +#define EVE_HSIZE (800L) +#define EVE_VSIZE (480L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (3L) +#define EVE_VOFFSET (32L) +#define EVE_VCYCLE (525L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (48L) +#define EVE_HOFFSET (88L) +#define EVE_HCYCLE (928L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (2L) +#define EVE_CSPREAD (0L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define EVE_HAS_CRYSTAL +#define FT81X_ENABLE +#endif + + +/* FT810CB-HY50HD: FT810 800x480 5.0" HAOYU */ +#if defined (EVE_FT810CB_HY50HD) +#define EVE_HSIZE (800L) +#define EVE_VSIZE (480L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (2L) +#define EVE_VOFFSET (13L) +#define EVE_VCYCLE (525L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (20L) +#define EVE_HOFFSET (64L) +#define EVE_HCYCLE (952L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (2L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (2000L) /* touch-sensitivity */ +#define EVE_HAS_CRYSTAL +#define FT81X_ENABLE +#endif + + +/* FT811CB-HY50HD: FT811 800x480 5.0" HAOYU */ +#if defined (EVE_FT811CB_HY50HD) +#define EVE_HSIZE (800L) +#define EVE_VSIZE (480L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (2L) +#define EVE_VOFFSET (13L) +#define EVE_VCYCLE (525L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (20L) +#define EVE_HOFFSET (64L) +#define EVE_HCYCLE (952L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (2L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) /* touch-sensitivity */ +#define EVE_HAS_CRYSTAL +#define FT81X_ENABLE +#endif + + +/* untested */ +/* G-ET0700G0DM6 800x480 7.0" Glyn */ +#if defined (EVE_ET07) +#define EVE_HSIZE (800L) +#define EVE_VSIZE (480L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (2L) +#define EVE_VOFFSET (35L) +#define EVE_VCYCLE (525L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (128L) +#define EVE_HOFFSET (203L) +#define EVE_HCYCLE (1056L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (2L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define FT81X_ENABLE +#endif + + +/* untested */ +/* RVT28 240x320 2.8" Riverdi, various options, FT800/FT801 */ +#if defined (EVE_RVT28) +#define EVE_HSIZE (320L) +#define EVE_VSIZE (240L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (2L) +#define EVE_VOFFSET (2L) +#define EVE_VCYCLE (326L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (10L) +#define EVE_HOFFSET (20L) +#define EVE_HCYCLE (270L) +#define EVE_PCLKPOL (0L) +#define EVE_SWIZZLE (4L) +#define EVE_PCLK (5L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#endif + + +/* untested */ +/* RVT3.5 320x240 3.5" Riverdi, various options, FT800/FT801 */ +#if defined (EVE_RVT35) +#define EVE_HSIZE (320L) +#define EVE_VSIZE (240L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (2L) +#define EVE_VOFFSET (13L) +#define EVE_VCYCLE (263L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (10L) +#define EVE_HOFFSET (70L) +#define EVE_HCYCLE (408L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (2L) +#define EVE_PCLK (6L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#endif + + +/* untested */ +/* RVT43 / RVT4.3 480x272 4.3" Riverdi, various options, FT800/FT801 */ +#if defined (EVE_RVT43) +#define EVE_HSIZE (480L) +#define EVE_VSIZE (272L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (10L) +#define EVE_VOFFSET (12L) +#define EVE_VCYCLE (292L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (41L) +#define EVE_HOFFSET (43L) +#define EVE_HCYCLE (548L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (5L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#endif + + +/* untested */ +/* RVT50xQFxxxxx 800x480 5.0" Riverdi, various options, FT812/FT813 */ +#if defined (EVE_RVT50) +#define EVE_HSIZE (800L) +#define EVE_VSIZE (480L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (3L) +#define EVE_VOFFSET (32L) +#define EVE_VCYCLE (525L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (48L) +#define EVE_HOFFSET (88L) +#define EVE_HCYCLE (928L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (2L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define FT81X_ENABLE +#endif + + +/* RVT70xQFxxxxx 800x480 7.0" Riverdi, various options, FT812/FT813, tested with RVT70UQFNWC0x */ +#if defined (EVE_RVT70) +#define EVE_HSIZE (800L) /* Thd Length of visible part of line (in PCLKs) - display width */ +#define EVE_VSIZE (480L) /* Tvd Number of visible lines (in lines) - display height */ + +#define EVE_VSYNC0 (0L) /* Tvf Vertical Front Porch */ +#define EVE_VSYNC1 (10L) /* Tvf + Tvp Vertical Front Porch plus Vsync Pulse width */ +#define EVE_VOFFSET (23L) /* Tvf + Tvp + Tvb Number of non-visible lines (in lines) */ +#define EVE_VCYCLE (525L) /* Tv Total number of lines (visible and non-visible) (in lines) */ +#define EVE_HSYNC0 (0L) /* Thf Horizontal Front Porch */ +#define EVE_HSYNC1 (10L) /* Thf + Thp Horizontal Front Porch plus Hsync Pulse width */ +#define EVE_HOFFSET (46L) /* Thf + Thp + Thb Length of non-visible part of line (in PCLK cycles) */ +#define EVE_HCYCLE (1056L) /* Th Total length of line (visible and non-visible) (in PCLKs) */ +#define EVE_PCLKPOL (1L) /* PCLK polarity (0 = rising edge, 1 = falling edge) */ +#define EVE_SWIZZLE (0L) /* Defines the arrangement of the RGB pins of the FT800 */ +#define EVE_PCLK (2L) /* 60MHz / REG_PCLK = PCLK frequency 30 MHz */ +#define EVE_CSPREAD (1L) /* helps with noise, when set to 1 fewer signals are changed simultaneously, reset-default: 1 */ +#define EVE_TOUCH_RZTHRESH (1800L) /* touch-sensitivity */ +#define FT81X_ENABLE +#endif + + +/* untested */ +/* EVE2-29A 320x102 2.9" 1U Matrix Orbital, non-touch, FT812 */ +#if defined (EVE_EVE2_29) +#define EVE_HSIZE (320L) +#define EVE_VSIZE (102L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (2L) +#define EVE_VOFFSET (156L) +#define EVE_VCYCLE (262L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (10L) +#define EVE_HOFFSET (70L) +#define EVE_HCYCLE (408L) +#define EVE_PCLKPOL (0L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (8L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define FT81X_ENABLE +#endif + + +/* EVE2-35A 320x240 3.5" Matrix Orbital, resistive, or non-touch, FT812 */ +#if defined (EVE_EVE2_35) +#define EVE_HSIZE (320L) +#define EVE_VSIZE (240L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (2L) +#define EVE_VOFFSET (18L) +#define EVE_VCYCLE (262L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (10L) +#define EVE_HOFFSET (70L) +#define EVE_HCYCLE (408L) +#define EVE_PCLKPOL (0L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (10L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define FT81X_ENABLE +#endif + + +/* EVE2-35G 320x240 3.5" Matrix Orbital, capacitive touch, FT813 */ +#if defined (EVE_EVE2_35G) +#define EVE_HSIZE (320L) +#define EVE_VSIZE (240L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (2L) +#define EVE_VOFFSET (18L) +#define EVE_VCYCLE (262L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (10L) +#define EVE_HOFFSET (70L) +#define EVE_HCYCLE (408L) +#define EVE_PCLKPOL (0L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (8L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define EVE_HAS_GT911 /* special treatment required for out-of-spec touch-controller */ +#define FT81X_ENABLE +#endif + + +/* EVE2-38A 480x116 3.8" 1U Matrix Orbital, resistive touch, FT812 */ +#if defined (EVE_EVE2_38) +#define EVE_HSIZE (480L) +#define EVE_VSIZE (272L) + +#define EVE_VSYNC0 (152L) +#define EVE_VSYNC1 (10L) +#define EVE_VOFFSET (12L) +#define EVE_VCYCLE (292L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (41L) +#define EVE_HOFFSET (43L) +#define EVE_HCYCLE (548L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (5L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define FT81X_ENABLE +#endif + + +/* EVE2-38G 480x116 3.8" 1U Matrix Orbital, capacitive touch, FT813 */ +#if defined (EVE_EVE2_38G) +#define EVE_HSIZE (480L) +#define EVE_VSIZE (272L) + +#define EVE_VSYNC0 (152L) +#define EVE_VSYNC1 (10L) +#define EVE_VOFFSET (12L) +#define EVE_VCYCLE (292L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (41L) +#define EVE_HOFFSET (43L) +#define EVE_HCYCLE (548L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (5L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define EVE_HAS_GT911 /* special treatment required for out-of-spec touch-controller */ +#define FT81X_ENABLE +#endif + + +/* untested */ +/* EVE2-43A 480x272 4.3" Matrix Orbital, resistive or no touch, FT812 */ +#if defined (EVE_EVE2_43) +#define EVE_HSIZE (480L) +#define EVE_VSIZE (272L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (10L) +#define EVE_VOFFSET (12L) +#define EVE_VCYCLE (292L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (41L) +#define EVE_HOFFSET (43L) +#define EVE_HCYCLE (548L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (5L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define FT81X_ENABLE +#endif + + +/* EVE2-43G 480x272 4.3" Matrix Orbital, capacitive touch, FT813 */ +#if defined (EVE_EVE2_43G) +#define EVE_HSIZE (480L) +#define EVE_VSIZE (272L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (10L) +#define EVE_VOFFSET (12L) +#define EVE_VCYCLE (292L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (41L) +#define EVE_HOFFSET (43L) +#define EVE_HCYCLE (548L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (5L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define EVE_HAS_GT911 /* special treatment required for out-of-spec touch-controller */ +#define FT81X_ENABLE +#endif + + +/* untested */ +/* Matrix Orbital EVE2 modules EVE2-50A, EVE2-70A : 800x480 5.0" and 7.0" resistive, or no touch, FT812 */ +#if defined (EVE_EVE2_50) || defined (EVE_EVE2_70) +#define EVE_HSIZE (800L) +#define EVE_VSIZE (480L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (3L) +#define EVE_VOFFSET (32L) +#define EVE_VCYCLE (525L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (48L) +#define EVE_HOFFSET (88L) +#define EVE_HCYCLE (928L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (2L) +#define EVE_CSPREAD (0L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define FT81X_ENABLE +#endif + + +/* Matrix Orbital EVE2 modules EVE2-50G, EVE2-70G : 800x480 5.0" and 7.0" capacitive touch, FT813 */ +#if defined (EVE_EVE2_50G) || defined (EVE_EVE2_70G) +#define EVE_HSIZE (800L) +#define EVE_VSIZE (480L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (3L) +#define EVE_VOFFSET (32L) +#define EVE_VCYCLE (525L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (48L) +#define EVE_HOFFSET (88L) +#define EVE_HCYCLE (928L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (2L) +#define EVE_CSPREAD (0L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define EVE_HAS_GT911 /* special treatment required for out-of-spec touch-controller */ +#define FT81X_ENABLE +#endif + + +/* NHD-3.5-320240FT-CxXx-xxx 320x240 3.5" Newhaven, resistive or capacitive, FT81x */ +#if defined (EVE_NHD_35) +#define EVE_HSIZE (320L) +#define EVE_VSIZE (240L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (2L) +#define EVE_VOFFSET (13L) +#define EVE_VCYCLE (263L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (10L) +#define EVE_HOFFSET (70L) +#define EVE_HCYCLE (408L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (2L) +#define EVE_PCLK (6L) +#define EVE_CSPREAD (0L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define EVE_HAS_CRYSTAL +#define FT81X_ENABLE +#endif + + +/* untested */ +/* NHD-4.3-480272FT-CxXx-xxx 480x272 4.3" Newhaven, resistive or capacitive, FT81x */ +#if defined (EVE_NHD_43) +#define EVE_HSIZE (480L) +#define EVE_VSIZE (272L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (10L) +#define EVE_VOFFSET (12L) +#define EVE_VCYCLE (292L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (41L) +#define EVE_HOFFSET (43L) +#define EVE_HCYCLE (548L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (5L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define EVE_HAS_CRYSTAL +#define FT81X_ENABLE +#endif + + +/* untested */ +/* NHD-5.0-800480FT-CxXx-xxx 800x480 5.0" Newhaven, resistive or capacitive, FT81x */ +#if defined (EVE_NHD_50) +#define EVE_HSIZE (800L) +#define EVE_VSIZE (480L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (3L) +#define EVE_VOFFSET (32L) +#define EVE_VCYCLE (525L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (48L) +#define EVE_HOFFSET (88L) +#define EVE_HCYCLE (928L) +#define EVE_PCLKPOL (0L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (2L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define EVE_HAS_CRYSTAL +#define FT81X_ENABLE +#endif + + +/* untested */ +/* NHD-7.0-800480FT-CxXx-xxx 800x480 7.0" Newhaven, resistive or capacitive, FT81x */ +#if defined (EVE_NHD_70) +#define EVE_HSIZE (800L) +#define EVE_VSIZE (480L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (3L) +#define EVE_VOFFSET (32L) +#define EVE_VCYCLE (525L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (48L) +#define EVE_HOFFSET (88L) +#define EVE_HCYCLE (928L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (2L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define EVE_HAS_CRYSTAL +#define FT81X_ENABLE +#endif + + +/* ADAM101-LCP-SWVGA-NEW 1024x600 10.1" Glyn, capacitive, FT813 */ +#if defined (EVE_ADAM101) +#define EVE_HSIZE (1024L) +#define EVE_VSIZE (600L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (1L) +#define EVE_VOFFSET (1L) +#define EVE_VCYCLE (720L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (1L) +#define EVE_HOFFSET (1L) +#define EVE_HCYCLE (1100L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (2L) +#define EVE_CSPREAD (1L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define EVE_HAS_CRYSTAL +#define FT81X_ENABLE +#endif + + +/* Crystalfonts CFAF240400C1-030SC 240x400 3.0" , FT811 capacitive touch */ +#if defined (EVE_CFAF240400C1_030SC) +#define EVE_HSIZE (240L) +#define EVE_VSIZE (400L) + +#define EVE_VSYNC0 (4L) +#define EVE_VSYNC1 (6L) +#define EVE_VOFFSET (8L) +#define EVE_VCYCLE (409L) +#define EVE_HSYNC0 (10L) +#define EVE_HSYNC1 (20L) +#define EVE_HOFFSET (40L) +#define EVE_HCYCLE (489L) +#define EVE_PCLKPOL (0L) +#define EVE_SWIZZLE (2L) +#define EVE_PCLK (5L) +#define EVE_CSPREAD (0L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define FT81X_ENABLE +#endif + + +/* Crystalfonts CFAF320240F-035T 320x240 3.5" , FT810 resistive touch */ +#if defined (EVE_CFAF320240F_035T) +#define EVE_HSIZE (320L) +#define EVE_VSIZE (240L) + +#define EVE_VSYNC0 (1L) +#define EVE_VSYNC1 (4L) +#define EVE_VOFFSET (4L) +#define EVE_VCYCLE (245L) +#define EVE_HSYNC0 (10L) +#define EVE_HSYNC1 (20L) +#define EVE_HOFFSET (40L) +#define EVE_HCYCLE (510L) +#define EVE_PCLKPOL (0L) +#define EVE_SWIZZLE (2L) +#define EVE_PCLK (8L) +#define EVE_CSPREAD (0L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define FT81X_ENABLE +#endif + + +/* Crystalfonts CFAF480128A0-039TC 480x128 3.9" , FT811 capacitive touch */ +#if defined (EVE_CFAF480128A0_039TC) +#define EVE_HSIZE (480L) +#define EVE_VSIZE (128L) + +#define EVE_VSYNC0 (4L) +#define EVE_VSYNC1 (5L) +#define EVE_VOFFSET (8L) +#define EVE_VCYCLE (137L) +#define EVE_HSYNC0 (24L) +#define EVE_HSYNC1 (35L) +#define EVE_HOFFSET (41L) +#define EVE_HCYCLE (1042L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (7L) +#define EVE_CSPREAD (0L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define FT81X_ENABLE +#endif + + +/* Crystalfonts CFAF800480E0-050SC 800x480 5.0" , FT813 capacitive touch */ +#if defined (EVE_CFAF800480E0_050SC) +#define EVE_HSIZE (800L) +#define EVE_VSIZE (480L) + +#define EVE_VSYNC0 (7L) +#define EVE_VSYNC1 (8L) +#define EVE_VOFFSET (30L) +#define EVE_VCYCLE (511L) +#define EVE_HSYNC0 (16L) +#define EVE_HSYNC1 (17L) +#define EVE_HOFFSET (62L) +#define EVE_HCYCLE (978L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (2L) +#define EVE_CSPREAD (0L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define EVE_HAS_GT911 +#define FT81X_ENABLE +#endif + + +/* PAF90B5WFNWC01 800x480 9.0" Panasys, BT815 */ +#if defined (EVE_PAF90) +#define EVE_HSIZE (800L) /* Thd Length of visible part of line (in PCLKs) - display width */ +#define EVE_VSIZE (480L) /* Tvd Number of visible lines (in lines) - display height */ + +#define EVE_VSYNC0 (0L) /* Tvf Vertical Front Porch */ +#define EVE_VSYNC1 (10L) /* Tvf + Tvp Vertical Front Porch plus Vsync Pulse width */ +#define EVE_VOFFSET (23L) /* Tvf + Tvp + Tvb Number of non-visible lines (in lines) */ +#define EVE_VCYCLE (525L) /* Tv Total number of lines (visible and non-visible) (in lines) */ +#define EVE_HSYNC0 (0L) /* Thf Horizontal Front Porch */ +#define EVE_HSYNC1 (10L) /* Thf + Thp Horizontal Front Porch plus Hsync Pulse width */ +#define EVE_HOFFSET (46L) /* Thf + Thp + Thb Length of non-visible part of line (in PCLK cycles) */ +#define EVE_HCYCLE (1056L) /* Th Total length of line (visible and non-visible) (in PCLKs) */ +#define EVE_PCLKPOL (1L) /* PCLK polarity (0 = rising edge, 1 = falling edge) */ +#define EVE_SWIZZLE (0L) /* Defines the arrangement of the RGB pins of the FT800 */ +#define EVE_PCLK (2L) /* 60MHz / REG_PCLK = PCLK frequency 30 MHz */ +#define EVE_CSPREAD (1L) /* helps with noise, when set to 1 fewer signals are changed simultaneously, reset-default: 1 */ +#define EVE_TOUCH_RZTHRESH (1200L) /* touch-sensitivity */ +#define EVE_HAS_CRYSTAL +#define FT81X_ENABLE +#define BT81X_ENABLE +#endif + + +/* untested */ +/* Sunflower Arduino Shield, 320x240 3.5" from Cowfish, FT813, https://github.com/Cowfish-Studios/Cowfish_Sunflower_Shield_PCB */ +/* set EVE_CS to 6 and EVE_PDN to 5 in the Arduino block in EVE_target.h */ +#if defined (EVE_SUNFLOWER) +#define EVE_HSIZE (320L) +#define EVE_VSIZE (240L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (2L) +#define EVE_VOFFSET (13L) +#define EVE_VCYCLE (263L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (10L) +#define EVE_HOFFSET (70L) +#define EVE_HCYCLE (408L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (2L) +#define EVE_PCLK (6L) +#define EVE_CSPREAD (0L) +#define EVE_TOUCH_RZTHRESH (1200L) +#define EVE_HAS_CRYSTAL +#define FT81X_ENABLE +#endif + +/* untested */ +/* MikroElektronika ConnectEVE, FT800 480x272 4.3" */ +#if defined (EVE_CONNECTEVE) +#define EVE_HSIZE (480L) +#define EVE_VSIZE (272L) + +#define EVE_VSYNC0 (0L) +#define EVE_VSYNC1 (10L) +#define EVE_VOFFSET (12L) +#define EVE_VCYCLE (286L) +#define EVE_HSYNC0 (0L) +#define EVE_HSYNC1 (41L) +#define EVE_HOFFSET (43L) +#define EVE_HCYCLE (525L) +#define EVE_PCLKPOL (1L) +#define EVE_SWIZZLE (0L) +#define EVE_PCLK (5L) +#define EVE_CSPREAD (0L) +#define EVE_TOUCH_RZTHRESH (2000L) +#define EVE_HAS_CRYSTAL +#endif + +#endif /* EVE_CONFIG_H */ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/FT81x.c b/lib/lvgl_esp32_drivers/lvgl_tft/FT81x.c new file mode 100644 index 0000000..f6d1864 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/FT81x.c @@ -0,0 +1,352 @@ + +#include + +#include "driver/gpio.h" + +#include "FT81x.h" + +#include "EVE.h" +#include "EVE_commands.h" + +/* some pre-definded colors */ +#define RED 0xff0000UL +#define ORANGE 0xffa500UL +#define GREEN 0x00ff00UL +#define BLUE 0x0000ffUL +#define BLUE_1 0x5dade2L +#define YELLOW 0xffff00UL +#define PINK 0xff00ffUL +#define PURPLE 0x800080UL +#define WHITE 0xffffffUL +#define BLACK 0x000000UL + +/* memory-map defines */ +#define SCREEN_BITMAP_ADDR 0x00000000 // full screen buffer (0x00000000 - 0x000‭‭BBE40â€Ŧ) + +uint8_t tft_active = 0; + +void touch_calibrate(void) +{ + +/* send pre-recorded touch calibration values, depending on the display the code is compiled for */ + +#if defined (EVE_CFAF240400C1_030SC) + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x0000ed11); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x00001139); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff76809); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x00000000); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00010690); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xfffadf2e); +#endif + +#if defined (EVE_CFAF320240F_035T) + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x00005614); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x0000009e); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff43422); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x0000001d); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0xffffbda4); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x00f8f2ef); +#endif + +#if defined (EVE_CFAF480128A0_039TC) + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x00010485); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x0000017f); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfffb0bd3); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x00000073); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0000e293); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x00069904); +#endif + +#if defined (EVE_CFAF800480E0_050SC) + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000107f9); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0xffffff8c); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff451ae); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x000000d2); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0000feac); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xfffcfaaf); +#endif + +#if defined (EVE_PAF90) + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x00000159); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x0001019c); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff93625); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x00010157); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00000000); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x0000c101); +#endif + +#if defined (EVE_RiTFT43) + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000062cd); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0xfffffe45); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff45e0a); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x000001a3); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00005b33); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xFFFbb870); +#endif + +#if defined (EVE_EVE2_38) + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x00007bed); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x000001b0); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff60aa5); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x00000095); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0xffffdcda); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x00829c08); +#endif + +#if defined (EVE_EVE2_35G) + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000109E4); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x000007A6); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xFFEC1EBA); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x0000072C); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0001096A); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xFFF469CF); +#endif + +#if defined (EVE_EVE2_43G) + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x0000a1ff); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x00000680); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xffe54cc2); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0xffffff53); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0000912c); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xfffe628d); +#endif + +#if defined (EVE_EVE2_50G) + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000109E4); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x000007A6); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xFFEC1EBA); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x0000072C); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0001096A); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xFFF469CF); +#endif + +#if defined (EVE_EVE2_70G) + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000105BC); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0xFFFFFA8A); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0x00004670); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0xFFFFFF75); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00010074); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xFFFF14C8); +#endif + +#if defined (EVE_NHD_35) + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x0000f78b); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x00000427); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfffcedf8); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0xfffffba4); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0000f756); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x0009279e); +#endif + +#if defined (EVE_RVT70) + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000074df); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x000000e6); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfffd5474); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x000001af); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00007e79); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xffe9a63c); +#endif + +#if defined (EVE_FT811CB_HY50HD) + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 66353); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 712); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 4293876677); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 4294966157); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 67516); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 418276); +#endif + +#if defined (EVE_ADAM101) + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000101E3); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x00000114); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xFFF5EEBA); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0xFFFFFF5E); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00010226); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x0000C783); +#endif + +/* activate this if you are using a module for the first time or if you need to re-calibrate it */ +/* write down the numbers on the screen and either place them in one of the pre-defined blocks above or make a new block */ +// Note: requires FT81x_FULL to be defined +#if 0 + /* calibrate touch and displays values to screen */ + EVE_cmd_dl(CMD_DLSTART); + EVE_cmd_dl(DL_CLEAR_RGB | BLACK); + EVE_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); + EVE_cmd_text((EVE_HSIZE/2), 50, 26, EVE_OPT_CENTER, "Please tap on the dot."); + EVE_cmd_calibrate(); + EVE_cmd_dl(DL_DISPLAY); + EVE_cmd_dl(CMD_SWAP); + EVE_cmd_execute(); + + uint32_t touch_a, touch_b, touch_c, touch_d, touch_e, touch_f; + + touch_a = EVE_memRead32(REG_TOUCH_TRANSFORM_A); + touch_b = EVE_memRead32(REG_TOUCH_TRANSFORM_B); + touch_c = EVE_memRead32(REG_TOUCH_TRANSFORM_C); + touch_d = EVE_memRead32(REG_TOUCH_TRANSFORM_D); + touch_e = EVE_memRead32(REG_TOUCH_TRANSFORM_E); + touch_f = EVE_memRead32(REG_TOUCH_TRANSFORM_F); + + EVE_cmd_dl(CMD_DLSTART); + EVE_cmd_dl(DL_CLEAR_RGB | BLACK); + EVE_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); + EVE_cmd_dl(TAG(0)); + + EVE_cmd_text(5, 15, 26, 0, "TOUCH_TRANSFORM_A:"); + EVE_cmd_text(5, 30, 26, 0, "TOUCH_TRANSFORM_B:"); + EVE_cmd_text(5, 45, 26, 0, "TOUCH_TRANSFORM_C:"); + EVE_cmd_text(5, 60, 26, 0, "TOUCH_TRANSFORM_D:"); + EVE_cmd_text(5, 75, 26, 0, "TOUCH_TRANSFORM_E:"); + EVE_cmd_text(5, 90, 26, 0, "TOUCH_TRANSFORM_F:"); + +#if defined (FT81X_ENABLE) + EVE_cmd_setbase(16L); /* FT81x only */ + EVE_cmd_number(310, 15, 26, EVE_OPT_RIGHTX|8, touch_a); + EVE_cmd_number(310, 30, 26, EVE_OPT_RIGHTX|8, touch_b); + EVE_cmd_number(310, 45, 26, EVE_OPT_RIGHTX|8, touch_c); + EVE_cmd_number(310, 60, 26, EVE_OPT_RIGHTX|8, touch_d); + EVE_cmd_number(310, 75, 26, EVE_OPT_RIGHTX|8, touch_e); + EVE_cmd_number(310, 90, 26, EVE_OPT_RIGHTX|8, touch_f); +#else + EVE_cmd_number(310, 15, 26, EVE_OPT_RIGHTX, touch_a); + EVE_cmd_number(310, 30, 26, EVE_OPT_RIGHTX, touch_b); + EVE_cmd_number(310, 45, 26, EVE_OPT_RIGHTX, touch_c); + EVE_cmd_number(310, 60, 26, EVE_OPT_RIGHTX, touch_d); + EVE_cmd_number(310, 75, 26, EVE_OPT_RIGHTX, touch_e); + EVE_cmd_number(310, 90, 26, EVE_OPT_RIGHTX, touch_f); +#endif + + EVE_cmd_dl(DL_DISPLAY); /* instruct the graphics processor to show the list */ + EVE_cmd_dl(CMD_SWAP); /* make this list active */ + EVE_cmd_execute(); + + while(1); +#endif +} + + +// set up a display list for a fullscreen writable bitmap +void TFT_bitmap_display(void) +{ + if(tft_active != 0) + { + EVE_start_cmd_burst(); /* start writing to the cmd-fifo as one stream of bytes, only sending the address once */ + + EVE_cmd_dl(CMD_DLSTART); /* start the display list */ + + EVE_cmd_dl(DL_CLEAR_RGB | BLACK); /* set the default clear color to black */ + EVE_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); /* clear the screen - this and the previous prevent artifacts between lists, Attributes are the color, stencil and tag buffers */ + + EVE_cmd_dl(TAG(0)); + + // fullscreen bitmap for memory-mapped direct access + EVE_cmd_dl(TAG(20)); +#ifdef FT81X_ARGB4 + EVE_cmd_setbitmap(SCREEN_BITMAP_ADDR, EVE_ARGB4, EVE_HSIZE, EVE_VSIZE); +#else + EVE_cmd_setbitmap(SCREEN_BITMAP_ADDR, EVE_RGB565, EVE_HSIZE, EVE_VSIZE); +#endif + EVE_cmd_dl(DL_BEGIN | EVE_BITMAPS); + EVE_cmd_dl(VERTEX2F(0, 0)); + EVE_cmd_dl(DL_END); + + EVE_cmd_dl(TAG(0)); + + EVE_cmd_dl(DL_DISPLAY); /* instruct the graphics processor to show the list */ + + EVE_cmd_dl(CMD_SWAP); /* make this list active */ + + EVE_end_cmd_burst(); /* stop writing to the cmd-fifo */ + + EVE_cmd_start(); /* order the command co-processor to start processing its FIFO queue but do not wait for completion */ + } +} + + +void FT81x_init(void) +{ + gpio_pad_select_gpio(EVE_PDN); + gpio_set_level(EVE_CS, 1); + gpio_set_direction(EVE_PDN, GPIO_MODE_OUTPUT); + + spi_acquire(); + + if(EVE_init()) + { + tft_active = 1; + + EVE_memWrite8(REG_PWM_DUTY, 0x30); /* setup backlight, range is from 0 = off to 0x80 = max */ + + touch_calibrate(); + + EVE_cmd_memset(SCREEN_BITMAP_ADDR, BLACK, SCREEN_BUFFER_SIZE); // clear screen buffer + EVE_cmd_execute(); + + TFT_bitmap_display(); // set DL for fullscreen bitmap display + } + + spi_release(); +} + + +// write fullscreen bitmap directly +void TFT_WriteScreen(uint8_t* Bitmap) +{ + EVE_memWrite_buffer(SCREEN_BITMAP_ADDR, Bitmap, SCREEN_BUFFER_SIZE, false); +} + + +// write bitmap directly, line-by-line +void TFT_WriteBitmap(uint8_t* Bitmap, uint16_t X, uint16_t Y, uint16_t Width, uint16_t Height) +{ + // calc base address + uint32_t addr = SCREEN_BITMAP_ADDR + (Y * BYTES_PER_LINE) + (X * BYTES_PER_PIXEL); + + // can we do a fast full width block transfer? + if(X == 0 && Width == EVE_HSIZE) + { +#ifdef FT81X_ARGB4 + uint32_t *ptr32 = (uint32_t *)Bitmap; + uint16_t *ptr16 = (uint16_t *)Bitmap; + for (uint16_t i = 0; i < Width*Height; i++) + { + uint32_t c = *ptr32; + *ptr16 = ((c & 0xF0000000)>>16) | ((c & 0x00F00000)>>12) | ((c & 0x0000F000)>>8) | ((c & 0x000000F0)>>4); + ptr16++; + ptr32++; + } +#endif + + EVE_memWrite_buffer(addr, Bitmap, (Height * BYTES_PER_LINE), true); + } + else + { + // line by line mode +#ifdef FT81X_ARGB4 + uint32_t *ptr32 = (uint32_t *)Bitmap; + uint16_t *ptr16 = (uint16_t *)Bitmap; +#endif + uint32_t bpl = Width * BYTES_PER_PIXEL; + for (uint16_t i = 0; i < Height; i++) + { +#ifdef FT81X_ARGB4 + for (uint16_t j = 0; j < Width; j++) + { + uint32_t c = *ptr32; + *ptr16 = ((c & 0xF0000000)>>16) | ((c & 0x00F00000)>>12) | ((c & 0x0000F000)>>8) | ((c & 0x000000F0)>>4); + ptr16++; + ptr32++; + } +#endif + EVE_memWrite_buffer(addr, Bitmap + (i * bpl), bpl, (i == Height - 1)); + addr += BYTES_PER_LINE; + } + } +} + +// LittlevGL flush callback +void FT81x_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map) +{ + TFT_WriteBitmap((uint8_t*)color_map, area->x1, area->y1, lv_area_get_width(area), lv_area_get_height(area)); +} \ No newline at end of file diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/FT81x.h b/lib/lvgl_esp32_drivers/lvgl_tft/FT81x.h new file mode 100644 index 0000000..96366df --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/FT81x.h @@ -0,0 +1,17 @@ +#ifndef FT81X_H_ +#define FT81X_H_ + +#include + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif +#include "../lvgl_helpers.h" + +void FT81x_init(void); + +void FT81x_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); + +#endif /* FT81X_H_ */ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/GC9A01.h b/lib/lvgl_esp32_drivers/lvgl_tft/GC9A01.h new file mode 100644 index 0000000..d462c8d --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/GC9A01.h @@ -0,0 +1,65 @@ +/** + * @file lv_templ.h + * + */ + +#ifndef GC9A01_H +#define GC9A01_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif +#include "../lvgl_helpers.h" + +/********************* + * DEFINES + *********************/ +#define GC9A01_DC CONFIG_LV_DISP_PIN_DC +#define GC9A01_RST CONFIG_LV_DISP_PIN_RST +#define GC9A01_BCKL CONFIG_LV_DISP_PIN_BCKL + +#define GC9A01_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL + +#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL + #define GC9A01_BCKL_ACTIVE_LVL 1 +#else + #define GC9A01_BCKL_ACTIVE_LVL 0 +#endif + +#define GC9A01_INVERT_COLORS CONFIG_LV_INVERT_COLORS + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void GC9A01_init(void); +void GC9A01_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); +void GC9A01_enable_backlight(bool backlight); +void GC9A01_sleep_in(void); +void GC9A01_sleep_out(void); + +/********************** + * MACROS + **********************/ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*GC9A01_H*/ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/Kconfig b/lib/lvgl_esp32_drivers/lvgl_tft/Kconfig new file mode 100644 index 0000000..3cc90d5 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/Kconfig @@ -0,0 +1,1000 @@ +# NOTES: +# - default <> if <> work only when no prompt is available for the user + +menu "LVGL TFT Display controller" + + # Predefined display configurations for multiple + # evaluation/development boards. + choice LV_PREDEFINED_DISPLAY + prompt "Select predefined display configuration" + default LV_PREDEFINED_DISPLAY_NONE + help + Select predefined display configuration + + config LV_PREDEFINED_DISPLAY_NONE + bool "None" + config LV_PREDEFINED_DISPLAY_WROVER4 + bool "ESP-Wrover-KIT v4.1" + select LV_TFT_DISPLAY_CONTROLLER_ILI9341 + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_PREDEFINED_DISPLAY_M5STACK + bool "M5Stack" + select LV_TFT_DISPLAY_CONTROLLER_ILI9341 + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_PREDEFINED_DISPLAY_M5STICK + bool "M5Stick" + select LV_TFT_DISPLAY_CONTROLLER_SH1107 + select LV_TFT_DISPLAY_PROTOCOL_SPI + select LV_TFT_DISPLAY_MONOCHROME + select LV_THEME_MONO + config LV_PREDEFINED_DISPLAY_M5STICKC + bool "M5StickC" + select LV_TFT_DISPLAY_CONTROLLER_ST7735S + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_PREDEFINED_DISPLAY_ERTFT0356 + bool "ER-TFT035-6" + select LV_TFT_DISPLAY_CONTROLLER_ILI9488 + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_PREDEFINED_DISPLAY_ADA_FEATHERWING + bool "Adafruit 3.5 Featherwing" + select LV_TFT_DISPLAY_CONTROLLER_HX8357 + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_PREDEFINED_DISPLAY_RPI_MPI3501 + bool "RPi MPI3501" + select LV_TFT_DISPLAY_CONTROLLER_ILI9486 + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_PREDEFINED_DISPLAY_WEMOS_LOLIN + bool "Wemos Lolin OLED" + select LV_TFT_DISPLAY_CONTROLLER_SSD1306 + select LV_TFT_DISPLAY_PROTOCOL_I2C + select LV_TFT_DISPLAY_MONOCHROME + select LV_THEME_MONO + config LV_PREDEFINED_DISPLAY_ATAG + bool "AIRcable ATAGv3" + select LV_TFT_DISPLAY_CONTROLLER_IL3820 + select LV_TFT_DISPLAY_PROTOCOL_SPI + select LV_TFT_DISPLAY_MONOCHROME + select LV_THEME_MONO + config LV_PREDEFINED_DISPLAY_RPI_RA8875 + bool "RAiO RA8875" + select LV_TFT_DISPLAY_CONTROLLER_RA8875 + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_PREDEFINED_DISPLAY_TTGO + bool "TTGO T-Display" + select LV_TFT_DISPLAY_CONTROLLER_ST7789 + select LV_TFT_DISPLAY_PROTOCOL_SPI + select LV_TFT_DISPLAY_OFFSETS + config LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS + bool "TTGO Camera Plus" + select LV_TFT_DISPLAY_CONTROLLER_ST7789 + select LV_TFT_DISPLAY_PROTOCOL_SPI + endchoice + + # START of helper symbols. + # + # Display controller symbols, + # + # This boolean configuration symbols can be used to know what + # display controller has been choosen by the user. When selected + # the symbol is set to y, then in the file sdkconfig.h + # the symbol CONFIG_ is set to 1. + # + # If you add support for a new display controller to the repository + # you must add a config option for it on this helper symbols section. + config LV_TFT_DISPLAY_CONTROLLER_ILI9341 + bool + help + ILI9341 display controller. + + config LV_TFT_DISPLAY_CONTROLLER_ILI9481 + bool + help + ILI9481 display controller. + + config LV_TFT_DISPLAY_CONTROLLER_ILI9488 + bool + help + ILI9488 display controller. + + config LV_TFT_DISPLAY_CONTROLLER_ILI9486 + bool + help + ILI9486 display controller. + + config LV_TFT_DISPLAY_CONTROLLER_ST7789 + bool + help + ST7789 display controller. + + config LV_TFT_DISPLAY_CONTROLLER_GC9A01 + bool + help + GC9A01 display controller. + + config LV_TFT_DISPLAY_CONTROLLER_ST7735S + bool + help + ST7735S display controller. + + config LV_TFT_DISPLAY_CONTROLLER_HX8357 + bool + help + HX8357 display controller. + + config LV_TFT_DISPLAY_CONTROLLER_SH1107 + bool + help + SH1107 display controller. + + config LV_TFT_DISPLAY_CONTROLLER_SSD1306 + bool + help + SSD1306 display controller. + + config LV_TFT_DISPLAY_CONTROLLER_FT81X + bool + help + FT81x display controller. + + config LV_TFT_DISPLAY_CONTROLLER_IL3820 + bool + help + IL3820 epaper display controller. + + config LV_TFT_DISPLAY_CONTROLLER_JD79653A + bool + help + FitiPower JD79653A display controller for GoodDisplay GDEW0154M09 e-paper panel + + config LV_TFT_DISPLAY_CONTROLLER_UC8151D + bool + help + UltraChip UC8151D display controller with GoodDisplay GDEW0154M10 DES e-paper panel + + config LV_TFT_DISPLAY_CONTROLLER_RA8875 + bool + help + RA8875 display controller. + + # Display controller communication protocol + # + # This symbols define the communication protocol used by the + # ESP32 to communicate with the display controller. + # This symbols can be used, but not limited, to: + # - Know what peripherals to initialize. + # - Know if the touch and display controllers share the same peripheral. + # - Etc. + config LV_TFT_DISPLAY_PROTOCOL_SPI + bool + help + Display controller protocol SPI + + config LV_TFT_DISPLAY_PROTOCOL_I2C + bool + help + Display controller protocol I2C + + config LV_TFT_DISPLAY_OFFSETS + bool + help + Display area doesn't start at address 0 + + config LV_TFT_DISPLAY_X_OFFSET + depends on LV_TFT_DISPLAY_OFFSETS + int + default 40 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + default 53 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + default 0 + + config LV_TFT_DISPLAY_Y_OFFSET + depends on LV_TFT_DISPLAY_OFFSETS + int + default 53 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + default 40 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + default 0 + + + # Display colors(?) + # Useful to know when the display being used is a monochrome + # display, so we can use the monochrome theme, etc. + config LV_TFT_DISPLAY_MONOCHROME + bool + help + A monochrome display is used. + # END of helper symbols + + choice + prompt "Select predefined board pinouts" if LV_PREDEFINED_DISPLAY_NONE || LV_PREDEFINED_DISPLAY_ERTFT0356 + default LV_PREDEFINED_PINS_NONE + help + Select predefined board pin out configuration. + + config LV_PREDEFINED_PINS_NONE + bool "None" + config LV_PREDEFINED_PINS_38V4 + bool "ESP32 DevKit v4 with 38 pins" + config LV_PREDEFINED_PINS_30 + bool "ESP32 Devkit v1 with 30 pins" + config LV_PREDEFINED_PINS_38V1 + bool "Dev Board with 38 pins" + config LV_PREDEFINED_PINS_TKOALA + bool "TTGO Koala" + endchoice + + # Select one of the available display controllers. + choice + prompt "Select a display controller model." if LV_PREDEFINED_DISPLAY_NONE + help + Select the controller for your display. + + config LV_TFT_DISPLAY_USER_CONTROLLER_ILI9341 + bool "ILI9341" + select LV_TFT_DISPLAY_CONTROLLER_ILI9341 + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_TFT_DISPLAY_USER_CONTROLLER_ILI9481 + bool "ILI9481" + select LV_TFT_DISPLAY_CONTROLLER_ILI9481 + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_TFT_DISPLAY_USER_CONTROLLER_ILI9486 + bool "ILI9486" + select LV_TFT_DISPLAY_CONTROLLER_ILI9486 + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_TFT_DISPLAY_USER_CONTROLLER_ILI9488 + bool "ILI9488" + select LV_TFT_DISPLAY_CONTROLLER_ILI9488 + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_TFT_DISPLAY_USER_CONTROLLER_ST7789 + bool "ST7789" + select LV_TFT_DISPLAY_CONTROLLER_ST7789 + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_TFT_DISPLAY_USER_CONTROLLER_GC9A01 + bool "GC9A01" + select LV_TFT_DISPLAY_CONTROLLER_GC9A01 + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_TFT_DISPLAY_USER_CONTROLLER_ST7735S + bool "ST7735S" + select LV_TFT_DISPLAY_CONTROLLER_ST7735S + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_TFT_DISPLAY_USER_CONTROLLER_HX8357 + bool "HX8357" + select LV_TFT_DISPLAY_CONTROLLER_HX8357 + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_TFT_DISPLAY_USER_CONTROLLER_SH1107 + bool "SH1107" + select LV_TFT_DISPLAY_CONTROLLER_SH1107 + select LV_TFT_DISPLAY_PROTOCOL_SPI + select LV_TFT_DISPLAY_MONOCHROME + config LV_TFT_DISPLAY_USER_CONTROLLER_SSD1306 + bool "SSD1306" + select LV_TFT_DISPLAY_CONTROLLER_SSD1306 + select LV_TFT_DISPLAY_PROTOCOL_I2C + select LV_TFT_DISPLAY_MONOCHROME + config LV_TFT_DISPLAY_USER_CONTROLLER_FT81X + bool "FT81X" + select LV_TFT_DISPLAY_CONTROLLER_FT81X + select LV_TFT_DISPLAY_PROTOCOL_SPI + config LV_TFT_DISPLAY_USER_CONTROLLER_IL3820 + bool "IL3820" + select LV_TFT_DISPLAY_CONTROLLER_IL3820 + select LV_TFT_DISPLAY_PROTOCOL_SPI + select LV_TFT_DISPLAY_MONOCHROME + config LV_TFT_DISPLAY_USER_CONTROLLER_JD79653A + bool "JD79653A" + select LV_TFT_DISPLAY_CONTROLLER_JD79653A + select LV_TFT_DISPLAY_PROTOCOL_SPI + select LV_TFT_DISPLAY_MONOCHROME + config LV_TFT_DISPLAY_USER_CONTROLLER_UC8151D + bool "UC8151D" + select LV_TFT_DISPLAY_CONTROLLER_UC8151D + select LV_TFT_DISPLAY_PROTOCOL_SPI + select LV_TFT_DISPLAY_MONOCHROME + config LV_TFT_DISPLAY_USER_CONTROLLER_RA8875 + bool "RA8875" + select LV_TFT_DISPLAY_CONTROLLER_RA8875 + select LV_TFT_DISPLAY_PROTOCOL_SPI + endchoice + + # Select one of the available FT81x configurations. + choice + prompt "Select a FT81x configuration." if LV_TFT_DISPLAY_USER_CONTROLLER_FT81X + default LV_FT81X_CONFIG_EVE_NHD_50 + help + Select a configuration for your FT81x display. + config LV_FT81X_CONFIG_EVE_VM800B35A + bool "EVE_VM800B35A" + config LV_FT81X_CONFIG_EVE_VM800B43A + bool "EVE_VM800B43A" + config LV_FT81X_CONFIG_EVE_VM800B50A + bool "EVE_VM800B50A" + config LV_FT81X_CONFIG_EVE_VM810C + bool "EVE_VM810C" + config LV_FT81X_CONFIG_EVE_ME812A + bool "EVE_ME812A" + config LV_FT81X_CONFIG_EVE_ME813A + bool "EVE_ME813A" + config LV_FT81X_CONFIG_EVE_FT810CB_HY50HD + bool "EVE_FT810CB_HY50HD" + config LV_FT81X_CONFIG_EVE_FT811CB_HY50HD + bool "EVE_FT811CB_HY50HD" + config LV_FT81X_CONFIG_EVE_ET07 + bool "EVE_ET07" + config LV_FT81X_CONFIG_EVE_RVT28 + bool "EVE_RVT28" + config LV_FT81X_CONFIG_EVE_RVT35 + bool "EVE_RVT35" + config LV_FT81X_CONFIG_EVE_RVT43 + bool "EVE_RVT43" + config LV_FT81X_CONFIG_EVE_RVT50 + bool "EVE_RVT50" + config LV_FT81X_CONFIG_EVE_RVT70 + bool "EVE_RVT70" + config LV_FT81X_CONFIG_EVE_RiTFT43 + bool "EVE_RiTFT43" + config LV_FT81X_CONFIG_EVE_RiTFT50 + bool "EVE_RiTFT50" + config LV_FT81X_CONFIG_EVE_RiTFT70 + bool "EVE_RiTFT70" + config LV_FT81X_CONFIG_EVE_EVE2_29 + bool "EVE_EVE2_29" + config LV_FT81X_CONFIG_EVE_EVE2_35 + bool "EVE_EVE2_35" + config LV_FT81X_CONFIG_EVE_EVE2_35G + bool "EVE_EVE2_35G" + config LV_FT81X_CONFIG_EVE_EVE2_38 + bool "EVE_EVE2_38" + config LV_FT81X_CONFIG_EVE_EVE2_38G + bool "EVE_EVE2_38G" + config LV_FT81X_CONFIG_EVE_EVE2_43 + bool "EVE_EVE2_43" + config LV_FT81X_CONFIG_EVE_EVE2_43G + bool "EVE_EVE2_43G" + config LV_FT81X_CONFIG_EVE_EVE2_50 + bool "EVE_EVE2_50" + config LV_FT81X_CONFIG_EVE_EVE2_50G + bool "EVE_EVE2_50G" + config LV_FT81X_CONFIG_EVE_EVE2_70 + bool "EVE_EVE2_70" + config LV_FT81X_CONFIG_EVE_EVE2_70G + bool "EVE_EVE2_70G" + config LV_FT81X_CONFIG_EVE_EVE3_35 + bool "EVE_EVE3_35" + config LV_FT81X_CONFIG_EVE_EVE3_35G + bool "EVE_EVE3_35G" + config LV_FT81X_CONFIG_EVE_EVE3_43 + bool "EVE_EVE3_43" + config LV_FT81X_CONFIG_EVE_EVE3_43G + bool "EVE_EVE3_43G" + config LV_FT81X_CONFIG_EVE_EVE3_50 + bool "EVE_EVE3_50" + config LV_FT81X_CONFIG_EVE_EVE3_50G + bool "EVE_EVE3_50G" + config LV_FT81X_CONFIG_EVE_EVE3_70 + bool "EVE_EVE3_70" + config LV_FT81X_CONFIG_EVE_EVE3_70G + bool "EVE_EVE3_70G" + config LV_FT81X_CONFIG_EVE_NHD_35 + bool "EVE_NHD_35" + config LV_FT81X_CONFIG_EVE_NHD_43 + bool "EVE_NHD_43" + config LV_FT81X_CONFIG_EVE_NHD_50 + bool "EVE_NHD_50" + config LV_FT81X_CONFIG_EVE_NHD_70 + bool "EVE_NHD_70" + config LV_FT81X_CONFIG_EVE_ADAM101 + bool "EVE_ADAM101" + config LV_FT81X_CONFIG_EVE_CFAF240400C1_030SC + bool "EVE_CFAF240400C1_030SC" + config LV_FT81X_CONFIG_EVE_CFAF320240F_035T + bool "EVE_CFAF320240F_035T" + config LV_FT81X_CONFIG_EVE_CFAF480128A0_039TC + bool "EVE_CFAF480128A0_039TC" + config LV_FT81X_CONFIG_EVE_CFAF800480E0_050SC + bool "EVE_CFAF800480E0_050SC" + config LV_FT81X_CONFIG_EVE_PAF90 + bool "EVE_PAF90" + config LV_FT81X_CONFIG_EVE_SUNFLOWER + bool "EVE_SUNFLOWER" + config LV_FT81X_CONFIG_EVE_CONNECTEVE + bool "EVE_CONNECTEVE" + endchoice + + choice + prompt "TFT SPI Bus." if LV_TFT_DISPLAY_PROTOCOL_SPI && \ + !LV_PREDEFINED_DISPLAY_TTGO + default LV_TFT_DISPLAY_SPI_VSPI if LV_PREDEFINED_DISPLAY_TTGO && \ + !IDF_TARGET_ESP32S2 + default LV_TFT_DISPLAY_SPI_FSPI if IDF_TARGET_ESP32S2 + help + Select the SPI Bus the TFT Display is attached to. + + config LV_TFT_DISPLAY_SPI_HSPI + bool "HSPI" + config LV_TFT_DISPLAY_SPI_VSPI + bool "VSPI" if !IDF_TARGET_ESP32S2 + config LV_TFT_DISPLAY_SPI_FSPI + bool "FSPI" if IDF_TARGET_ESP32S2 + endchoice + + choice + prompt "TFT Data Transfer Mode" if LV_TFT_DISPLAY_PROTOCOL_SPI + default LV_TFT_DISPLAY_SPI_TRANS_MODE_SIO + help + Select the SPI SIO/DIO/QIO Transfer Mode for the TFT Display. + + config LV_TFT_DISPLAY_SPI_TRANS_MODE_SIO + bool "SIO (MOSI/MISO)" + config LV_TFT_DISPLAY_SPI_TRANS_MODE_DIO + bool "DIO (2-bit Dual SPI)" + config LV_TFT_DISPLAY_SPI_TRANS_MODE_QIO + bool "QIO (4-bit Quad SPI)" + endchoice + + choice + prompt "TFT SPI Duplex Mode" if LV_TFT_DISPLAY_PROTOCOL_SPI + default LV_TFT_DISPLAY_SPI_FULL_DUPLEX if LV_PREDEFINED_DISPLAY_RPI_RA8875 || LV_TFT_DISPLAY_CONTROLLER_FT81X + default LV_TFT_DISPLAY_SPI_HALF_DUPLEX + help + Select the SPI Duplex Mode for the TFT Display. + + config LV_TFT_DISPLAY_SPI_HALF_DUPLEX + bool "HALF DUPLEX" + config LV_TFT_DISPLAY_SPI_FULL_DUPLEX + bool "FULL DUPLEX" + depends on LV_TFT_DISPLAY_SPI_TRANS_MODE_SIO + endchoice + + choice + prompt "Display I2C port" if LV_TFT_DISPLAY_PROTOCOL_I2C + default LV_DISPLAY_I2C_PORT_0 + help + Select the I2C port used by the display controller. + + config LV_DISPLAY_I2C_PORT_0 + bool "I2C PORT 0" + config LV_DISPLAY_I2C_PORT_1 + bool "I2C PORT 1" + endchoice + + choice + prompt "Display orientation" + depends on LV_TFT_DISPLAY_CONTROLLER_ILI9341 || \ + LV_TFT_DISPLAY_CONTROLLER_ILI9481 || \ + LV_TFT_DISPLAY_CONTROLLER_ILI9486 || \ + LV_TFT_DISPLAY_CONTROLLER_ILI9488 || \ + LV_TFT_DISPLAY_CONTROLLER_SH1107 || \ + LV_TFT_DISPLAY_CONTROLLER_SSD1306 || \ + LV_TFT_DISPLAY_CONTROLLER_FT81X || \ + LV_TFT_DISPLAY_CONTROLLER_ST7789 || \ + LV_TFT_DISPLAY_CONTROLLER_GC9A01 || \ + LV_TFT_DISPLAY_CONTROLLER_ST7735S || \ + LV_TFT_DISPLAY_CONTROLLER_IL3820 || \ + LV_TFT_DISPLAY_CONTROLLER_RA8875 || \ + LV_TFT_DISPLAY_CONTROLLER_JD79653A || \ + LV_TFT_DISPLAY_CONTROLLER_UC8151D + default LV_DISPLAY_ORIENTATION_LANDSCAPE \ + if !LV_TFT_DISPLAY_CONTROLLER_JD79653A || \ + !LV_TFT_DISPLAY_CONTROLLER_UC8151D + default LV_DISPLAY_ORIENTATION_PORTRAIT if LV_TFT_DISPLAY_CONTROLLER_JD79653A || LV_TFT_DISPLAY_CONTROLLER_UC8151D + help + Display orientation. + + config LV_DISPLAY_ORIENTATION_PORTRAIT + bool "Portrait" + config LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED + bool "Inverted Portrait" + depends on !LV_TFT_DISPLAY_CONTROLLER_IL3820 + config LV_DISPLAY_ORIENTATION_LANDSCAPE + bool "Landscape" + depends on !LV_TFT_DISPLAY_CONTROLLER_JD79653A + depends on !LV_TFT_DISPLAY_CONTROLLER_UC8151D + config LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED + bool "Inverted Landscape" + depends on !LV_TFT_DISPLAY_CONTROLLER_IL3820 + depends on !LV_TFT_DISPLAY_CONTROLLER_JD79653A + depends on !LV_TFT_DISPLAY_CONTROLLER_UC8151D + endchoice + + + # Display orientation + # This symbol is meant to be used as parameter on the display_set_orientation + # function at init. + config LV_DISPLAY_ORIENTATION + int + default 0 if LV_DISPLAY_ORIENTATION_PORTRAIT + default 1 if LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED + default 2 if LV_DISPLAY_ORIENTATION_LANDSCAPE + default 3 if LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED + + config LV_DISPLAY_WIDTH + int "TFT display width in pixels." if LV_PREDEFINED_DISPLAY_NONE || \ + LV_TFT_DISPLAY_CONTROLLER_FT81X + default 240 if ( LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_WROVER4 ) && (LV_DISPLAY_ORIENTATION_PORTRAIT) + default 240 if ( LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_WROVER4 ) && (LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + default 320 if ( LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_WROVER4 ) && (LV_DISPLAY_ORIENTATION_LANDSCAPE) + default 320 if ( LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_WROVER4 ) && (LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + default 480 if LV_PREDEFINED_DISPLAY_ERTFT0356 || LV_PREDEFINED_DISPLAY_ADA_FEATHERWING + default 64 if ( LV_PREDEFINED_DISPLAY_WEMOS_LOLIN || LV_PREDEFINED_DISPLAY_M5STICK ) && LV_DISPLAY_ORIENTATION_PORTRAIT + default 128 if ( LV_PREDEFINED_DISPLAY_WEMOS_LOLIN || LV_PREDEFINED_DISPLAY_M5STICK ) && LV_DISPLAY_ORIENTATION_LANDSCAPE + default 800 if LV_TFT_DISPLAY_CONTROLLER_FT81X + default 128 if LV_PREDEFINED_DISPLAY_ATAG && LV_DISPLAY_ORIENTATION_PORTRAIT + default 296 if LV_PREDEFINED_DISPLAY_ATAG && LV_DISPLAY_ORIENTATION_LANDSCAPE + default 80 if LV_PREDEFINED_DISPLAY_M5STICKC && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + default 160 if LV_PREDEFINED_DISPLAY_M5STICKC && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + default 135 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + default 240 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + default 240 if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS + default 320 + + config LV_DISPLAY_HEIGHT + int "TFT display height in pixels." if LV_PREDEFINED_DISPLAY_NONE || \ + LV_TFT_DISPLAY_CONTROLLER_FT81X + default 320 if ( LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_WROVER4 ) && (LV_DISPLAY_ORIENTATION_PORTRAIT) + default 320 if ( LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_WROVER4 ) && (LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + default 240 if ( LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_WROVER4 ) && (LV_DISPLAY_ORIENTATION_LANDSCAPE) + default 240 if ( LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_WROVER4 ) && (LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + default 320 if LV_PREDEFINED_DISPLAY_ERTFT0356 || LV_PREDEFINED_DISPLAY_ADA_FEATHERWING + default 128 if ( LV_PREDEFINED_DISPLAY_WEMOS_LOLIN || LV_PREDEFINED_DISPLAY_M5STICK ) && LV_DISPLAY_ORIENTATION_PORTRAIT + default 64 if ( LV_PREDEFINED_DISPLAY_WEMOS_LOLIN || LV_PREDEFINED_DISPLAY_M5STICK ) && LV_DISPLAY_ORIENTATION_LANDSCAPE + default 480 if LV_TFT_DISPLAY_CONTROLLER_FT81X + default 296 if LV_PREDEFINED_DISPLAY_ATAG && LV_DISPLAY_ORIENTATION_PORTRAIT + default 128 if LV_PREDEFINED_DISPLAY_ATAG && LV_DISPLAY_ORIENTATION_LANDSCAPE + default 160 if LV_PREDEFINED_DISPLAY_M5STICKC && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + default 80 if LV_PREDEFINED_DISPLAY_M5STICKC && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + default 240 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_PORTRAIT || LV_DISPLAY_ORIENTATION_PORTRAIT_INVERTED) + default 135 if LV_PREDEFINED_DISPLAY_TTGO && (LV_DISPLAY_ORIENTATION_LANDSCAPE || LV_DISPLAY_ORIENTATION_LANDSCAPE_INVERTED) + default 240 if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS + default 240 + + config LV_TFT_USE_CUSTOM_SPI_CLK_DIVIDER + bool "Use custom SPI clock frequency." if LV_TFT_DISPLAY_PROTOCOL_SPI + default n + help + Allows to use a custom divider for the SPI clock frequency. + + choice + prompt "Select a custom frequency." + depends on LV_TFT_USE_CUSTOM_SPI_CLK_DIVIDER + default LV_TFT_SPI_CLK_DIVIDER_4 if LV_TFT_DISPLAY_CONTROLLER_ST7789 ||LV_TFT_DISPLAY_CONTROLLER_GC9A01 || LV_TFT_DISPLAY_CONTROLLER_ILI9486 + default LV_TFT_SPI_CLK_DIVIDER_5 if LV_TFT_DISPLAY_CONTROLLER_ILI9481 + default LV_TFT_SPI_CLK_DIVIDER_3 if LV_TFT_DISPLAY_CONTROLLER_HX8357 + default LV_TFT_SPI_CLK_DIVIDER_10 if LV_TFT_DISPLAY_CONTROLLER_SH1107 + default LV_TFT_SPI_CLK_DIVIDER_16 if LV_TFT_DISPLAY_CONTROLLER_JD79653A || LV_TFT_DISPLAY_CONTROLLER_UC8151D + default LV_TFT_SPI_CLK_DIVIDER_2 + + config LV_TFT_SPI_CLK_DIVIDER_1 + bool "80 MHz" + config LV_TFT_SPI_CLK_DIVIDER_2 + bool "40 MHz" + config LV_TFT_SPI_CLK_DIVIDER_3 + bool "26.67 MHz" + config LV_TFT_SPI_CLK_DIVIDER_4 + bool "20 MHz" + config LV_TFT_SPI_CLK_DIVIDER_5 + bool "16 MHz" + config LV_TFT_SPI_CLK_DIVIDER_6 + bool "13.33 MHz" + config LV_TFT_SPI_CLK_DIVIDER_7 + bool "11.43 MHz" + config LV_TFT_SPI_CLK_DIVIDER_8 + bool "10 MHz" + config LV_TFT_SPI_CLK_DIVIDER_9 + bool "8.89 MHz" + config LV_TFT_SPI_CLK_DIVIDER_10 + bool "8 MHz" + config LV_TFT_SPI_CLK_DIVIDER_12 + bool "6.67 MHz" + config LV_TFT_SPI_CLK_DIVIDER_16 + bool "5 MHz" + config LV_TFT_SPI_CLK_DIVIDER_20 + bool "4 MHz" + config LV_TFT_SPI_CLK_DIVIDER_24 + bool "3.33 MHz" + config LV_TFT_SPI_CLK_DIVIDER_32 + bool "2.5 MHz" + config LV_TFT_SPI_CLK_DIVIDER_40 + bool "2 MHz" + config LV_TFT_SPI_CLK_DIVIDER_48 + bool "1.67 MHz" + config LV_TFT_SPI_CLK_DIVIDER_80 + bool "1 MHz" + endchoice + + config LV_TFT_CUSTOM_SPI_CLK_DIVIDER + int + default 1 if LV_TFT_SPI_CLK_DIVIDER_1 + default 2 if LV_TFT_SPI_CLK_DIVIDER_2 + default 3 if LV_TFT_SPI_CLK_DIVIDER_3 + default 4 if LV_TFT_SPI_CLK_DIVIDER_4 + default 5 if LV_TFT_SPI_CLK_DIVIDER_5 + default 6 if LV_TFT_SPI_CLK_DIVIDER_6 + default 7 if LV_TFT_SPI_CLK_DIVIDER_7 + default 8 if LV_TFT_SPI_CLK_DIVIDER_8 + default 9 if LV_TFT_SPI_CLK_DIVIDER_9 + default 10 if LV_TFT_SPI_CLK_DIVIDER_10 + default 12 if LV_TFT_SPI_CLK_DIVIDER_12 + default 16 if LV_TFT_SPI_CLK_DIVIDER_16 + default 20 if LV_TFT_SPI_CLK_DIVIDER_20 + default 24 if LV_TFT_SPI_CLK_DIVIDER_24 + default 32 if LV_TFT_SPI_CLK_DIVIDER_32 + default 40 if LV_TFT_SPI_CLK_DIVIDER_40 + default 48 if LV_TFT_SPI_CLK_DIVIDER_48 + default 80 if LV_TFT_SPI_CLK_DIVIDER_80 + default 2 + + config LV_INVERT_DISPLAY + bool "IN DEPRECATION - Invert display." + default y if LV_PREDEFINED_DISPLAY_M5STACK + help + If text is backwards on your display, try enabling this. + + config LV_INVERT_COLORS + bool "Invert colors in display" if LV_TFT_DISPLAY_CONTROLLER_ILI9341 || LV_TFT_DISPLAY_CONTROLLER_ST7735S || LV_TFT_DISPLAY_CONTROLLER_ILI9481 + default y if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICKC + help + If the colors look inverted on your display, try enabling this. + + config LV_M5STICKC_HANDLE_AXP192 + bool "Handle Backlight and TFT power for M5StickC using AXP192." if LV_PREDEFINED_DISPLAY_M5STICKC || LV_TFT_DISPLAY_CONTROLLER_ST7735S + default y if LV_PREDEFINED_DISPLAY_M5STICKC + help + Display and TFT power supply on M5StickC is controlled using an AXP192 Power Mangerment IC. + Select yes if you want to enable TFT IC (LDO3) and backlight power using AXP192 by LVGL, or select no if you want to take care of + power management in your own code. + + config LV_AXP192_PIN_SDA + int "GPIO for AXP192 I2C SDA" if LV_M5STICKC_HANDLE_AXP192 + range 0 39 + default 21 if LV_PREDEFINED_DISPLAY_M5STICKC + default 21 + help + Configure the AXP192 I2C SDA pin here. + + config LV_AXP192_PIN_SCL + int "GPIO for AXP192 I2C SCL" if LV_M5STICKC_HANDLE_AXP192 + range 0 39 + default 22 if LV_PREDEFINED_DISPLAY_M5STICKC + default 22 + help + Configure the AXP192 I2C SDA pin here. + + # menu will be visible only when LV_PREDEFINED_DISPLAY_NONE is y + menu "Display RA8875 Configuration" + visible if LV_TFT_DISPLAY_CONTROLLER_RA8875 + + config LV_DISP_RA8875_PLLDIVM + int "PLLDIVM value for RA8875 System Clock" + depends on LV_TFT_DISPLAY_CONTROLLER_RA8875 + range 0 1 + default 0 + help + Configure the value to use for PLLDIVM in PLLC0 register here. + + config LV_DISP_RA8875_PLLDIVN + int "PLLDIVN value for RA8875 System Clock" + depends on LV_TFT_DISPLAY_CONTROLLER_RA8875 + range 1 31 + default 7 + help + Configure the value to use for PLLDIVN in PLLC0 register here. + + config LV_DISP_RA8875_PLLDIVK + int "PLLDIVK value for RA8875 System Clock" + depends on LV_TFT_DISPLAY_CONTROLLER_RA8875 + range 0 7 + default 3 + help + Configure the value to use for PLLDIVK in PLLC1 register here. + + config LV_DISP_RA8875_PCLK_MULTIPLIER + int "PCLK Period Setting" + depends on LV_TFT_DISPLAY_CONTROLLER_RA8875 + range 0 3 + default 0 + help + Configure the PCLK multiplier in PCSR register here. + + config LV_DISP_RA8875_PCLK_INVERT + bool "PCLK Inversion" + depends on LV_TFT_DISPLAY_CONTROLLER_RA8875 + default n + help + Configure the PCLK to be inverted in PCSR register here. + + config LV_DISP_RA8875_DE_POLARITY + bool "Data Enable (DE) Polarity/Invert" + depends on LV_TFT_DISPLAY_CONTROLLER_RA8875 + default n + help + Set to make data enable (DE) signal active low. + + config LV_DISP_RA8875_HORI_NON_DISP_PERIOD + int "Horizontal Non-Display Period" + depends on LV_TFT_DISPLAY_CONTROLLER_RA8875 + range 12 274 + default 12 + help + Configure the Horizontal Non-Display Period (aka Horizontal Back Porch). + Horizontal Non-Display Period(pixels) = 8*(HNDR+1) + 2*(HNDFTR/2+1) + 2 + + config LV_DISP_RA8875_HSYNC_START + int "HSYNC Start Position" + depends on LV_TFT_DISPLAY_CONTROLLER_RA8875 + range 8 256 + default 8 + help + Configure start position of HSYNC (aka Horizontal Front Porch). + HSYNC Start Position(pixels) = 8*(HSTR+1) + + config LV_DISP_RA8875_HSYNC_PW + int "HSYNC Pulse Width" + depends on LV_TFT_DISPLAY_CONTROLLER_RA8875 + range 8 256 + default 8 + help + Configure pulse width of HSYNC. + HSYNC Pulse Width(pixels) = 8*(HPW+1) + + config LV_DISP_RA8875_HSYNC_POLARITY + bool "HSYNC Polarity/Invert" + depends on LV_TFT_DISPLAY_CONTROLLER_RA8875 + default n + help + Set to make HSYNC signal active high. + + config LV_DISP_RA8875_VERT_NON_DISP_PERIOD + int "Vertical Non-Display Period" + depends on LV_TFT_DISPLAY_CONTROLLER_RA8875 + range 1 512 + default 1 + help + Configure the Vertical Non-Display Period (aka Vertical Back Porch). + Vertical Non-Display Period(lines) = (VNDR+1) + + config LV_DISP_RA8875_VSYNC_START + int "VSYNC Start Position" + depends on LV_TFT_DISPLAY_CONTROLLER_RA8875 + range 1 512 + default 1 + help + Configure start position of VSYNC (aka Vertical Front Porch). + VSYNC Start Position(lines) = (VSTR+1) + + config LV_DISP_RA8875_VSYNC_PW + int "VSYNC Pulse Width" + depends on LV_TFT_DISPLAY_CONTROLLER_RA8875 + range 1 128 + default 1 + help + Configure pulse width of VSYNC. + VSYNC Pulse Width(lines) = (VPWR+1) + + config LV_DISP_RA8875_VSYNC_POLARITY + bool "VSYNC Polarity/Invert" + depends on LV_TFT_DISPLAY_CONTROLLER_RA8875 + default n + help + Set to make VSYNC signal active high. + + endmenu + + # menu will be visible only when LV_PREDEFINED_DISPLAY_NONE is y + menu "Display Pin Assignments" + visible if LV_PREDEFINED_DISPLAY_NONE || LV_PREDEFINED_DISPLAY_RPI_MPI3501 || LV_PREDEFINED_PINS_TKOALA + + config LV_DISP_SPI_MOSI + int "GPIO for MOSI (Master Out Slave In)" if LV_TFT_DISPLAY_PROTOCOL_SPI + range 0 39 + default 23 if LV_PREDEFINED_DISPLAY_WROVER4 + default 23 if LV_PREDEFINED_DISPLAY_ATAG + default 23 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK + default 15 if LV_PREDEFINED_DISPLAY_M5STICKC + default 18 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING + default 23 if LV_PREDEFINED_PINS_TKOALA + default 19 if LV_PREDEFINED_DISPLAY_TTGO + default 19 if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS + default 13 + + help + Configure the display MOSI pin here. + + config LV_DISPLAY_USE_SPI_MISO + bool "GPIO for MISO (Master In Slave Out)" if LV_TFT_DISPLAY_PROTOCOL_SPI + default y if LV_PREDEFINED_PINS_TKOALA + help + Enable the MISO signal to control the display. You can disable + it when the display does not need MISO signal to be controlled. + + config LV_DISP_SPI_MISO + int "GPIO for MISO (Master In Slave Out)" if LV_TFT_DISPLAY_PROTOCOL_SPI + depends on LV_DISPLAY_USE_SPI_MISO + range 0 39 + default 19 if LV_PREDEFINED_PINS_TKOALA + default 0 + + help + Configure the display MISO pin here. + + config LV_DISP_SPI_INPUT_DELAY_NS + int "MISO Input Delay (ns)" if LV_TFT_DISPLAY_PROTOCOL_SPI + depends on LV_DISPLAY_USE_SPI_MISO + range 0 2147483647 + default 0 + help + The time required between SCLK and MISO being valid, including the possible clock + delay from processor to display. Leave at 0 unless you know you need a delay. + + config LV_DISP_SPI_IO2 + int "GPIO for Quad SPI IO2/WP" if LV_TFT_DISPLAY_PROTOCOL_SPI + depends on LV_TFT_DISPLAY_SPI_TRANS_MODE_QIO + range -1 39 + default 22 if LV_PREDEFINED_PINS_TKOALA && LV_TFT_DISPLAY_SPI_TRANS_MODE_QIO + default -1 + help + Configure the display Quad SPI IO2 pin here. + + config LV_DISP_SPI_IO3 + int "GPIO for Quad SPI IO3/HD" if LV_TFT_DISPLAY_PROTOCOL_SPI + depends on LV_TFT_DISPLAY_SPI_TRANS_MODE_QIO + range -1 39 + default 21 if LV_PREDEFINED_PINS_TKOALA && LV_TFT_DISPLAY_SPI_TRANS_MODE_QIO + default -1 + help + Configure the display Quad SPI IO2 pin here. + + config LV_DISP_SPI_CLK + int "GPIO for CLK (SCK / Serial Clock)" if LV_TFT_DISPLAY_PROTOCOL_SPI + range 0 39 + default 18 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK + default 13 if LV_PREDEFINED_DISPLAY_M5STICKC + default 18 if LV_PREDEFINED_DISPLAY_ATAG + default 19 if LV_PREDEFINED_DISPLAY_WROVER4 + default 5 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING + default 18 if LV_PREDEFINED_PINS_TKOALA + default 18 if LV_PREDEFINED_DISPLAY_TTGO + default 21 if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS + default 14 + + help + Configure the display CLK pin here. + + config LV_DISPLAY_USE_SPI_CS + bool "Use CS signal to control the display" if LV_TFT_DISPLAY_PROTOCOL_SPI + default y + help + Enable the CS signal to control the display. You can disable + it when the display does not need CS signal to be controlled. + + config LV_DISP_SPI_CS + int "GPIO for CS (Slave Select)" if LV_TFT_DISPLAY_PROTOCOL_SPI + depends on LV_DISPLAY_USE_SPI_CS + range 0 39 + default 5 if LV_PREDEFINED_PINS_38V1 + default 14 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK + default 5 if LV_PREDEFINED_DISPLAY_M5STICKC + default 22 if LV_PREDEFINED_DISPLAY_WROVER4 + default 15 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING + default 5 if LV_PREDEFINED_PINS_TKOALA + default 26 if LV_PREDEFINED_DISPLAY_ATAG + default 5 if LV_PREDEFINED_DISPLAY_TTGO + default 12 if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS + default 15 + + help + Configure the display CS pin here. + + config LV_DISPLAY_USE_DC + bool "Use DC signal to control the display" if LV_TFT_DISPLAY_PROTOCOL_SPI + default y if !LV_PREDEFINED_PINS_TKOALA + help + Enable the DC signal to control the display. You can disable + it when the display does not need DC signal to be controlled. + + config LV_DISP_PIN_DC + int "GPIO for DC (Data / Command)" if LV_TFT_DISPLAY_PROTOCOL_SPI + range 0 39 + depends on LV_DISPLAY_USE_DC + default 19 if LV_PREDEFINED_PINS_38V1 + default 17 if LV_PREDEFINED_PINS_38V4 + default 27 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK + default 23 if LV_PREDEFINED_DISPLAY_M5STICKC + default 21 if LV_PREDEFINED_DISPLAY_WROVER4 + default 33 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING + default 0 if LV_PREDEFINED_PINS_TKOALA + default 17 if LV_PREDEFINED_DISPLAY_ATAG + default 16 if LV_PREDEFINED_DISPLAY_TTGO + default 15 if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS + default 2 + + help + Configure the display DC pin here. + + config LV_DISP_PIN_RST + int "GPIO for Reset" if LV_TFT_DISPLAY_PROTOCOL_SPI + range 0 39 + default 18 if LV_PREDEFINED_PINS_38V1 + default 25 if LV_PREDEFINED_PINS_38V4 + default 33 if LV_PREDEFINED_DISPLAY_M5STACK || LV_PREDEFINED_DISPLAY_M5STICK + default 18 if LV_PREDEFINED_DISPLAY_M5STICKC + default 18 if LV_PREDEFINED_DISPLAY_WROVER4 + default 4 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING + default 4 if LV_PREDEFINED_PINS_TKOALA + default 16 if LV_PREDEFINED_DISPLAY_ATAG + default 23 if LV_PREDEFINED_DISPLAY_TTGO + default 33 if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS + default 4 + + help + Configure the display Reset pin here. + + config LV_DISP_PIN_BUSY + int "GPIO for Busy" if LV_TFT_DISPLAY_CONTROLLER_IL3820 || LV_TFT_DISPLAY_CONTROLLER_JD79653A || LV_TFT_DISPLAY_CONTROLLER_UC8151D + range 0 39 + default 35 if LV_TFT_DISPLAY_CONTROLLER_IL3820 || LV_TFT_DISPLAY_CONTROLLER_JD79653A || LV_TFT_DISPLAY_CONTROLLER_UC8151D + default 35 + + help + Configure the display Busy pin here. + + config LV_ENABLE_BACKLIGHT_CONTROL + bool "Enable control of the display backlight by using an GPIO." if \ + ( LV_PREDEFINED_DISPLAY_NONE && ! ( LV_TFT_DISPLAY_CONTROLLER_SH1107 || LV_TFT_DISPLAY_CONTROLLER_SSD1306 ) ) \ + || LV_PREDEFINED_DISPLAY_RPI_MPI3501 + default y if LV_PREDEFINED_DISPLAY_M5STACK + default y if LV_PREDEFINED_DISPLAY_WROVER4 + default y if LV_PREDEFINED_DISPLAY_ERTFT0356 + default y if LV_PREDEFINED_DISPLAY_TTGO + default y if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS + help + Enable controlling the display backlight using an GPIO + + config LV_BACKLIGHT_ACTIVE_LVL + bool "Is backlight turn on with a HIGH (1) logic level?" + depends on LV_ENABLE_BACKLIGHT_CONTROL + default y if LV_PREDEFINED_DISPLAY_M5STACK + default y if LV_PREDEFINED_DISPLAY_ERTFT0356 + default y if LV_PREDEFINED_DISPLAY_TTGO + default y if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS + help + Some backlights are turned on with a high signal, others held low. + If enabled, a value of 1 will be sent to the display to enable the backlight, + otherwise a 0 will be expected to enable it. + + config LV_DISP_PIN_BCKL + int "GPIO for Backlight Control" + depends on LV_ENABLE_BACKLIGHT_CONTROL + range 0 39 + default 23 if LV_PREDEFINED_PINS_38V1 + default 26 if LV_PREDEFINED_PINS_38V4 + default 32 if LV_PREDEFINED_DISPLAY_M5STACK + default 5 if LV_PREDEFINED_DISPLAY_WROVER4 + default 2 if LV_PREDEFINED_DISPLAY_ADA_FEATHERWING + default 27 if LV_PREDEFINED_DISPLAY_ERTFT0356 + default 0 if LV_PREDEFINED_PINS_TKOALA + default 4 if LV_PREDEFINED_DISPLAY_TTGO + default 2 if LV_PREDEFINED_DISPLAY_TTGO_CAMERA_PLUS + default 27 + + help + Configure the display BCLK (LED) pin here. + + config LV_DISP_PIN_SDA + int "GPIO for I2C SDA" if LV_TFT_DISPLAY_PROTOCOL_I2C + range 0 39 + default 5 if LV_PREDEFINED_DISPLAY_WEMOS_LOLIN + default 5 + + help + Configure the I2C SDA pin here. + + config LV_DISP_PIN_SCL + int "GPIO for I2C SCL" if LV_TFT_DISPLAY_PROTOCOL_I2C + range 0 39 + default 4 if LV_PREDEFINED_DISPLAY_WEMOS_LOLIN + default 4 + + help + Configure the I2C SCL pin here. + + endmenu + +endmenu diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/component.mk b/lib/lvgl_esp32_drivers/lvgl_tft/component.mk new file mode 100644 index 0000000..9c75766 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/component.mk @@ -0,0 +1,4 @@ +# TFT drivers + +COMPONENT_SRCDIRS := . +COMPONENT_ADD_INCLUDEDIRS := . diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/disp_driver.c b/lib/lvgl_esp32_drivers/lvgl_tft/disp_driver.c new file mode 100644 index 0000000..56b426d --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/disp_driver.c @@ -0,0 +1,107 @@ +/** + * @file disp_driver.c + */ + +#include "disp_driver.h" +#include "disp_spi.h" + +void disp_driver_init(void) +{ +#if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341 + ili9341_init(); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481 + ili9481_init(); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488 + ili9488_init(); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789 + st7789_init(); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S + st7735s_init(); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357 + hx8357_init(); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486 + ili9486_init(); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107 + sh1107_init(); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306 + ssd1306_init(); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X + FT81x_init(); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820 + il3820_init(); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875 + ra8875_init(); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01 + GC9A01_init(); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A + jd79653a_init(); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D + uc8151d_init(); +#endif +} + +void disp_driver_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map) +{ +#if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341 + ili9341_flush(drv, area, color_map); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481 + ili9481_flush(drv, area, color_map); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488 + ili9488_flush(drv, area, color_map); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789 + st7789_flush(drv, area, color_map); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S + st7735s_flush(drv, area, color_map); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357 + hx8357_flush(drv, area, color_map); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486 + ili9486_flush(drv, area, color_map); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107 + sh1107_flush(drv, area, color_map); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306 + ssd1306_flush(drv, area, color_map); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X + FT81x_flush(drv, area, color_map); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820 + il3820_flush(drv, area, color_map); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875 + ra8875_flush(drv, area, color_map); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01 + GC9A01_flush(drv, area, color_map); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A + jd79653a_lv_fb_flush(drv, area, color_map); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D + uc8151d_lv_fb_flush(drv, area, color_map); +#endif +} + +void disp_driver_rounder(lv_disp_drv_t * disp_drv, lv_area_t * area) +{ +#if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306 + ssd1306_rounder(disp_drv, area); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107 + sh1107_rounder(disp_drv, area); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820 + il3820_rounder(disp_drv, area); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A + jd79653a_lv_rounder_cb(disp_drv, area); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D + uc8151d_lv_rounder_cb(disp_drv, area); +#endif +} + +void disp_driver_set_px(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa) +{ +#if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306 + ssd1306_set_px_cb(disp_drv, buf, buf_w, x, y, color, opa); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107 + sh1107_set_px_cb(disp_drv, buf, buf_w, x, y, color, opa); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820 + il3820_set_px_cb(disp_drv, buf, buf_w, x, y, color, opa); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A + jd79653a_lv_set_fb_cb(disp_drv, buf, buf_w, x, y, color, opa); +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D + uc8151d_lv_set_fb_cb(disp_drv, buf, buf_w, x, y, color, opa); +#endif +} diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/disp_driver.h b/lib/lvgl_esp32_drivers/lvgl_tft/disp_driver.h new file mode 100644 index 0000000..1ee33c7 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/disp_driver.h @@ -0,0 +1,86 @@ +/** + * @file disp_driver.h + */ + +#ifndef DISP_DRIVER_H +#define DISP_DRIVER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +#if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341 +#include "ili9341.h" +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481 +#include "ili9481.h" +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488 +#include "ili9488.h" +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789 +#include "st7789.h" +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S +#include "st7735s.h" +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357 +#include "hx8357.h" +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486 +#include "ili9486.h" +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107 +#include "sh1107.h" +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306 +#include "ssd1306.h" +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X +#include "FT81x.h" +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820 +#include "il3820.h" +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875 +#include "ra8875.h" +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01 +#include "GC9A01.h" +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A +#include "jd79653a.h" +#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D +#include "uc8151d.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/* Initialize display */ +void disp_driver_init(void); + +/* Display flush callback */ +void disp_driver_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); + +/* Display rounder callback, used with monochrome dispays */ +void disp_driver_rounder(lv_disp_drv_t * disp_drv, lv_area_t * area); + +/* Display set_px callback, used with monochrome dispays */ +void disp_driver_set_px(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*DISP_DRIVER_H*/ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/disp_spi.c b/lib/lvgl_esp32_drivers/lvgl_tft/disp_spi.c new file mode 100644 index 0000000..0e4e548 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/disp_spi.c @@ -0,0 +1,320 @@ +/** + * @file disp_spi.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "esp_system.h" +#include "driver/gpio.h" +#include "driver/spi_master.h" +#include "esp_log.h" + +#define TAG "disp_spi" + +#include + +#include +#include +#include + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +#include "disp_spi.h" +#include "disp_driver.h" + +#include "../lvgl_helpers.h" +#include "../lvgl_spi_conf.h" + +/****************************************************************************** + * Notes about DMA spi_transaction_ext_t structure pooling + * + * An xQueue is used to hold a pool of reusable SPI spi_transaction_ext_t + * structures that get used for all DMA SPI transactions. While an xQueue may + * seem like overkill it is an already built-in RTOS feature that comes at + * little cost. xQueues are also ISR safe if it ever becomes necessary to + * access the pool in the ISR callback. + * + * When a DMA request is sent, a transaction structure is removed from the + * pool, filled out, and passed off to the esp32 SPI driver. Later, when + * servicing pending SPI transaction results, the transaction structure is + * recycled back into the pool for later reuse. This matches the DMA SPI + * transaction life cycle requirements of the esp32 SPI driver. + * + * When polling or synchronously sending SPI requests, and as required by the + * esp32 SPI driver, all pending DMA transactions are first serviced. Then the + * polling SPI request takes place. + * + * When sending an asynchronous DMA SPI request, if the pool is empty, some + * small percentage of pending transactions are first serviced before sending + * any new DMA SPI transactions. Not too many and not too few as this balance + * controls DMA transaction latency. + * + * It is therefore not the design that all pending transactions must be + * serviced and placed back into the pool with DMA SPI requests - that + * will happen eventually. The pool just needs to contain enough to float some + * number of in-flight SPI requests to speed up the overall DMA SPI data rate + * and reduce transaction latency. If however a display driver uses some + * polling SPI requests or calls disp_wait_for_pending_transactions() directly, + * the pool will reach the full state more often and speed up DMA queuing. + * + *****************************************************************************/ + +/********************* + * DEFINES + *********************/ +#define SPI_TRANSACTION_POOL_SIZE 50 /* maximum number of DMA transactions simultaneously in-flight */ + +/* DMA Transactions to reserve before queueing additional DMA transactions. A 1/10th seems to be a good balance. Too many (or all) and it will increase latency. */ +#define SPI_TRANSACTION_POOL_RESERVE_PERCENTAGE 10 +#if SPI_TRANSACTION_POOL_SIZE >= SPI_TRANSACTION_POOL_RESERVE_PERCENTAGE +#define SPI_TRANSACTION_POOL_RESERVE (SPI_TRANSACTION_POOL_SIZE / SPI_TRANSACTION_POOL_RESERVE_PERCENTAGE) +#else +#define SPI_TRANSACTION_POOL_RESERVE 1 /* defines minimum size */ +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void IRAM_ATTR spi_ready (spi_transaction_t *trans); + +/********************** + * STATIC VARIABLES + **********************/ +static spi_host_device_t spi_host; +static spi_device_handle_t spi; +static QueueHandle_t TransactionPool = NULL; +static transaction_cb_t chained_post_cb; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void disp_spi_add_device_config(spi_host_device_t host, spi_device_interface_config_t *devcfg) +{ + spi_host=host; + chained_post_cb=devcfg->post_cb; + devcfg->post_cb=spi_ready; + esp_err_t ret=spi_bus_add_device(host, devcfg, &spi); + assert(ret==ESP_OK); +} + +void disp_spi_add_device(spi_host_device_t host) +{ + disp_spi_add_device_with_speed(host, SPI_TFT_CLOCK_SPEED_HZ); +} + +void disp_spi_add_device_with_speed(spi_host_device_t host, int clock_speed_hz) +{ + ESP_LOGI(TAG, "Adding SPI device"); + ESP_LOGI(TAG, "Clock speed: %dHz, mode: %d, CS pin: %d", + clock_speed_hz, SPI_TFT_SPI_MODE, DISP_SPI_CS); + + spi_device_interface_config_t devcfg={ + .clock_speed_hz = clock_speed_hz, + .mode = SPI_TFT_SPI_MODE, + .spics_io_num=DISP_SPI_CS, // CS pin + .input_delay_ns=DISP_SPI_INPUT_DELAY_NS, + .queue_size=SPI_TRANSACTION_POOL_SIZE, + .pre_cb=NULL, + .post_cb=NULL, +#if defined(DISP_SPI_HALF_DUPLEX) + .flags = SPI_DEVICE_NO_DUMMY | SPI_DEVICE_HALFDUPLEX, /* dummy bits should be explicitly handled via DISP_SPI_VARIABLE_DUMMY as needed */ +#else + #if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) + .flags = 0, + #elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875) + .flags = SPI_DEVICE_NO_DUMMY, + #endif +#endif + }; + + disp_spi_add_device_config(host, &devcfg); + + /* create the transaction pool and fill it with ptrs to spi_transaction_ext_t to reuse */ + if(TransactionPool == NULL) { + TransactionPool = xQueueCreate(SPI_TRANSACTION_POOL_SIZE, sizeof(spi_transaction_ext_t*)); + assert(TransactionPool != NULL); + for (size_t i = 0; i < SPI_TRANSACTION_POOL_SIZE; i++) + { + spi_transaction_ext_t* pTransaction = (spi_transaction_ext_t*)heap_caps_malloc(sizeof(spi_transaction_ext_t), MALLOC_CAP_DMA); + assert(pTransaction != NULL); + memset(pTransaction, 0, sizeof(spi_transaction_ext_t)); + xQueueSend(TransactionPool, &pTransaction, portMAX_DELAY); + } + } +} + +void disp_spi_change_device_speed(int clock_speed_hz) +{ + if (clock_speed_hz <= 0) { + clock_speed_hz = SPI_TFT_CLOCK_SPEED_HZ; + } + ESP_LOGI(TAG, "Changing SPI device clock speed: %d", clock_speed_hz); + disp_spi_remove_device(); + disp_spi_add_device_with_speed(spi_host, clock_speed_hz); +} + +void disp_spi_remove_device() +{ + /* Wait for previous pending transaction results */ + disp_wait_for_pending_transactions(); + + esp_err_t ret=spi_bus_remove_device(spi); + assert(ret==ESP_OK); +} + +void disp_spi_transaction(const uint8_t *data, size_t length, + disp_spi_send_flag_t flags, uint8_t *out, + uint64_t addr, uint8_t dummy_bits) +{ + if (0 == length) { + return; + } + + spi_transaction_ext_t t = {0}; + + /* transaction length is in bits */ + t.base.length = length * 8; + + if (length <= 4 && data != NULL) { + t.base.flags = SPI_TRANS_USE_TXDATA; + memcpy(t.base.tx_data, data, length); + } else { + t.base.tx_buffer = data; + } + + if (flags & DISP_SPI_RECEIVE) { + assert(out != NULL && (flags & (DISP_SPI_SEND_POLLING | DISP_SPI_SEND_SYNCHRONOUS))); + t.base.rx_buffer = out; + +#if defined(DISP_SPI_HALF_DUPLEX) + t.base.rxlength = t.base.length; + t.base.length = 0; /* no MOSI phase in half-duplex reads */ +#else + t.base.rxlength = 0; /* in full-duplex mode, zero means same as tx length */ +#endif + } + + if (flags & DISP_SPI_ADDRESS_8) { + t.address_bits = 8; + } else if (flags & DISP_SPI_ADDRESS_16) { + t.address_bits = 16; + } else if (flags & DISP_SPI_ADDRESS_24) { + t.address_bits = 24; + } else if (flags & DISP_SPI_ADDRESS_32) { + t.address_bits = 32; + } + if (t.address_bits) { + t.base.addr = addr; + t.base.flags |= SPI_TRANS_VARIABLE_ADDR; + } + +#if defined(DISP_SPI_HALF_DUPLEX) + if (flags & DISP_SPI_MODE_DIO) { + t.base.flags |= SPI_TRANS_MODE_DIO; + } else if (flags & DISP_SPI_MODE_QIO) { + t.base.flags |= SPI_TRANS_MODE_QIO; + } + + if (flags & DISP_SPI_MODE_DIOQIO_ADDR) { + t.base.flags |= SPI_TRANS_MODE_DIOQIO_ADDR; + } + + if ((flags & DISP_SPI_VARIABLE_DUMMY) && dummy_bits) { + t.dummy_bits = dummy_bits; + t.base.flags |= SPI_TRANS_VARIABLE_DUMMY; + } +#endif + + /* Save flags for pre/post transaction processing */ + t.base.user = (void *) flags; + + /* Poll/Complete/Queue transaction */ + if (flags & DISP_SPI_SEND_POLLING) { + disp_wait_for_pending_transactions(); /* before polling, all previous pending transactions need to be serviced */ + spi_device_polling_transmit(spi, (spi_transaction_t *) &t); + } else if (flags & DISP_SPI_SEND_SYNCHRONOUS) { + disp_wait_for_pending_transactions(); /* before synchronous queueing, all previous pending transactions need to be serviced */ + spi_device_transmit(spi, (spi_transaction_t *) &t); + } else { + + /* if necessary, ensure we can queue new transactions by servicing some previous transactions */ + if(uxQueueMessagesWaiting(TransactionPool) == 0) { + spi_transaction_t *presult; + while(uxQueueMessagesWaiting(TransactionPool) < SPI_TRANSACTION_POOL_RESERVE) { + if (spi_device_get_trans_result(spi, &presult, 1) == ESP_OK) { + xQueueSend(TransactionPool, &presult, portMAX_DELAY); /* back to the pool to be reused */ + } + } + } + + spi_transaction_ext_t *pTransaction = NULL; + xQueueReceive(TransactionPool, &pTransaction, portMAX_DELAY); + memcpy(pTransaction, &t, sizeof(t)); + if (spi_device_queue_trans(spi, (spi_transaction_t *) pTransaction, portMAX_DELAY) != ESP_OK) { + xQueueSend(TransactionPool, &pTransaction, portMAX_DELAY); /* send failed transaction back to the pool to be reused */ + } + } +} + + +void disp_wait_for_pending_transactions(void) +{ + spi_transaction_t *presult; + + while(uxQueueMessagesWaiting(TransactionPool) < SPI_TRANSACTION_POOL_SIZE) { /* service until the transaction reuse pool is full again */ + if (spi_device_get_trans_result(spi, &presult, 1) == ESP_OK) { + xQueueSend(TransactionPool, &presult, portMAX_DELAY); + } + } +} + +void disp_spi_acquire(void) +{ + esp_err_t ret = spi_device_acquire_bus(spi, portMAX_DELAY); + assert(ret == ESP_OK); +} + +void disp_spi_release(void) +{ + spi_device_release_bus(spi); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void IRAM_ATTR spi_ready(spi_transaction_t *trans) +{ + disp_spi_send_flag_t flags = (disp_spi_send_flag_t) trans->user; + + if (flags & DISP_SPI_SIGNAL_FLUSH) { + lv_disp_t * disp = NULL; + +#if (LVGL_VERSION_MAJOR >= 7) + disp = _lv_refr_get_disp_refreshing(); +#else /* Before v7 */ + disp = lv_refr_get_disp_refreshing(); +#endif + + lv_disp_flush_ready(&disp->driver); + } + + if (chained_post_cb) { + chained_post_cb(trans); + } +} + diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/disp_spi.h b/lib/lvgl_esp32_drivers/lvgl_tft/disp_spi.h new file mode 100644 index 0000000..e2afb31 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/disp_spi.h @@ -0,0 +1,81 @@ +/** + * @file disp_spi.h + * + */ + +#ifndef DISP_SPI_H +#define DISP_SPI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum _disp_spi_send_flag_t { + DISP_SPI_SEND_QUEUED = 0x00000000, + DISP_SPI_SEND_POLLING = 0x00000001, + DISP_SPI_SEND_SYNCHRONOUS = 0x00000002, + DISP_SPI_SIGNAL_FLUSH = 0x00000004, + DISP_SPI_RECEIVE = 0x00000008, + DISP_SPI_CMD_8 = 0x00000010, /* Reserved */ + DISP_SPI_CMD_16 = 0x00000020, /* Reserved */ + DISP_SPI_ADDRESS_8 = 0x00000040, + DISP_SPI_ADDRESS_16 = 0x00000080, + DISP_SPI_ADDRESS_24 = 0x00000100, + DISP_SPI_ADDRESS_32 = 0x00000200, + DISP_SPI_MODE_DIO = 0x00000400, + DISP_SPI_MODE_QIO = 0x00000800, + DISP_SPI_MODE_DIOQIO_ADDR = 0x00001000, + DISP_SPI_VARIABLE_DUMMY = 0x00002000, +} disp_spi_send_flag_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void disp_spi_add_device(spi_host_device_t host); +void disp_spi_add_device_config(spi_host_device_t host, spi_device_interface_config_t *devcfg); +void disp_spi_add_device_with_speed(spi_host_device_t host, int clock_speed_hz); +void disp_spi_change_device_speed(int clock_speed_hz); +void disp_spi_remove_device(); + +/* Important! + All buffers should also be 32-bit aligned and DMA capable to prevent extra allocations and copying. + When DMA reading (even in polling mode) the ESP32 always read in 4-byte chunks even if less is requested. + Extra space will be zero filled. Always ensure the out buffer is large enough to hold at least 4 bytes! +*/ +void disp_spi_transaction(const uint8_t *data, size_t length, + disp_spi_send_flag_t flags, uint8_t *out, uint64_t addr, uint8_t dummy_bits); + +void disp_wait_for_pending_transactions(void); +void disp_spi_acquire(void); +void disp_spi_release(void); + +static inline void disp_spi_send_data(uint8_t *data, size_t length) { + disp_spi_transaction(data, length, DISP_SPI_SEND_POLLING, NULL, 0, 0); +} + +static inline void disp_spi_send_colors(uint8_t *data, size_t length) { + disp_spi_transaction(data, length, + DISP_SPI_SEND_QUEUED | DISP_SPI_SIGNAL_FLUSH, + NULL, 0, 0); +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*DISP_SPI_H*/ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/hx8357.h b/lib/lvgl_esp32_drivers/lvgl_tft/hx8357.h new file mode 100644 index 0000000..dc51532 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/hx8357.h @@ -0,0 +1,151 @@ +/** + * @file HX8357.h + * + * Roughly based on the Adafruit_HX8357_Library + * + * This library should work with: + * Adafruit 3.5" TFT 320x480 + Touchscreen Breakout + * http://www.adafruit.com/products/2050 + * + * Adafruit TFT FeatherWing - 3.5" 480x320 Touchscreen for Feathers + * https://www.adafruit.com/product/3651 + * + */ + +#ifndef HX8357_H +#define HX8357_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif +#include "../lvgl_helpers.h" + + /********************* + * DEFINES + *********************/ +#define HX8357_DC CONFIG_LV_DISP_PIN_DC +#define HX8357_RST CONFIG_LV_DISP_PIN_RST +#define HX8357_BCKL CONFIG_LV_DISP_PIN_BCKL + +#define HX8357_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL + +#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL + #define HX8357_BCKL_ACTIVE_LVL 1 +#else + #define HX8357_BCKL_ACTIVE_LVL 0 +#endif + +// if text/images are backwards, try setting this to 1 +#define HX8357_INVERT_DISPLAY CONFIG_LV_INVERT_DISPLAY + + +/******************* + * HX8357B/D REGS +*********************/ +#define HX8357D 0xD ///< Our internal const for D type +#define HX8357B 0xB ///< Our internal const for B type + +#define HX8357_TFTWIDTH 320 ///< 320 pixels wide +#define HX8357_TFTHEIGHT 480 ///< 480 pixels tall + +#define HX8357_NOP 0x00 ///< No op +#define HX8357_SWRESET 0x01 ///< software reset +#define HX8357_RDDID 0x04 ///< Read ID +#define HX8357_RDDST 0x09 ///< (unknown) + +#define HX8357_RDPOWMODE 0x0A ///< Read power mode Read power mode +#define HX8357_RDMADCTL 0x0B ///< Read MADCTL +#define HX8357_RDCOLMOD 0x0C ///< Column entry mode +#define HX8357_RDDIM 0x0D ///< Read display image mode +#define HX8357_RDDSDR 0x0F ///< Read dosplay signal mode + +#define HX8357_SLPIN 0x10 ///< Enter sleep mode +#define HX8357_SLPOUT 0x11 ///< Exit sleep mode +#define HX8357B_PTLON 0x12 ///< Partial mode on +#define HX8357B_NORON 0x13 ///< Normal mode + +#define HX8357_INVOFF 0x20 ///< Turn off invert +#define HX8357_INVON 0x21 ///< Turn on invert +#define HX8357_DISPOFF 0x28 ///< Display on +#define HX8357_DISPON 0x29 ///< Display off + +#define HX8357_CASET 0x2A ///< Column addr set +#define HX8357_PASET 0x2B ///< Page addr set +#define HX8357_RAMWR 0x2C ///< Write VRAM +#define HX8357_RAMRD 0x2E ///< Read VRAm + +#define HX8357B_PTLAR 0x30 ///< (unknown) +#define HX8357_TEON 0x35 ///< Tear enable on +#define HX8357_TEARLINE 0x44 ///< (unknown) +#define HX8357_MADCTL 0x36 ///< Memory access control +#define HX8357_COLMOD 0x3A ///< Color mode + +#define HX8357_SETOSC 0xB0 ///< Set oscillator +#define HX8357_SETPWR1 0xB1 ///< Set power control +#define HX8357B_SETDISPLAY 0xB2 ///< Set display mode +#define HX8357_SETRGB 0xB3 ///< Set RGB interface +#define HX8357D_SETCOM 0xB6 ///< Set VCOM voltage + +#define HX8357B_SETDISPMODE 0xB4 ///< Set display mode +#define HX8357D_SETCYC 0xB4 ///< Set display cycle reg +#define HX8357B_SETOTP 0xB7 ///< Set OTP memory +#define HX8357D_SETC 0xB9 ///< Enable extension command + +#define HX8357B_SET_PANEL_DRIVING 0xC0 ///< Set panel drive mode +#define HX8357D_SETSTBA 0xC0 ///< Set source option +#define HX8357B_SETDGC 0xC1 ///< Set DGC settings +#define HX8357B_SETID 0xC3 ///< Set ID +#define HX8357B_SETDDB 0xC4 ///< Set DDB +#define HX8357B_SETDISPLAYFRAME 0xC5 ///< Set display frame +#define HX8357B_GAMMASET 0xC8 ///< Set Gamma correction +#define HX8357B_SETCABC 0xC9 ///< Set CABC +#define HX8357_SETPANEL 0xCC ///< Set Panel + +#define HX8357B_SETPOWER 0xD0 ///< Set power control +#define HX8357B_SETVCOM 0xD1 ///< Set VCOM +#define HX8357B_SETPWRNORMAL 0xD2 ///< Set power normal + +#define HX8357B_RDID1 0xDA ///< Read ID #1 +#define HX8357B_RDID2 0xDB ///< Read ID #2 +#define HX8357B_RDID3 0xDC ///< Read ID #3 +#define HX8357B_RDID4 0xDD ///< Read ID #4 + +#define HX8357D_SETGAMMA 0xE0 ///< Set Gamma + +#define HX8357B_SETGAMMA 0xC8 ///< Set Gamma +#define HX8357B_SETPANELRELATED 0xE9 ///< Set panel related + + /********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void hx8357_init(void); +void hx8357_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); +void hx8357_enable_backlight(bool backlight); +void hx8357_set_rotation(uint8_t r); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*HX8357_H*/ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/il3820.h b/lib/lvgl_esp32_drivers/lvgl_tft/il3820.h new file mode 100644 index 0000000..15ff090 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/il3820.h @@ -0,0 +1,113 @@ +/** + * @file il3820.h + * + */ + +#ifndef IL3820_H +#define IL3820_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif +#include "sdkconfig.h" + +/* Values for Waveshare 2.9inch e-Paper Module, this values shouldn't be + * swapped to change display orientation */ +#define EPD_PANEL_WIDTH CONFIG_LV_DISPLAY_WIDTH /* 128 */ +#define EPD_PANEL_HEIGHT CONFIG_LV_DISPLAY_HEIGHT /* 296 */ + +/* 128 = panel width */ +#define IL3820_COLUMNS (EPD_PANEL_WIDTH / 8) + +#define IL3820_DC_PIN CONFIG_LV_DISP_PIN_DC +#define IL3820_RST_PIN CONFIG_LV_DISP_PIN_RST +#define IL3820_BUSY_PIN CONFIG_LV_DISP_PIN_BUSY +#define IL3820_BUSY_LEVEL 1 + +/* IL3820 commands */ +#define IL3820_CMD_GDO_CTRL 0x01 +#define IL3820_CMD_GDV_CTRL 0x03 +#define IL3820_CMD_SDV_CTRL 0x04 +#define IL3820_CMD_SOFTSTART 0x0c +#define IL3820_CMD_GSCAN_START 0x0f +#define IL3820_CMD_SLEEP_MODE 0x10 +#define IL3820_CMD_ENTRY_MODE 0x11 +#define IL3820_CMD_SW_RESET 0x12 +#define IL3820_CMD_TSENS_CTRL 0x1a +#define IL3820_CMD_MASTER_ACTIVATION 0x20 +#define IL3820_CMD_UPDATE_CTRL1 0x21 +#define IL3820_CMD_UPDATE_CTRL2 0x22 +#define IL3820_CMD_WRITE_RAM 0x24 +#define IL3820_CMD_WRITE_RED_RAM 0x26 +#define IL3820_CMD_VCOM_SENSE 0x28 +#define IL3820_CMD_VCOM_SENSE_DURATON 0x29 +#define IL3820_CMD_PRGM_VCOM_OTP 0x2a +#define IL3820_CMD_VCOM_VOLTAGE 0x2c +#define IL3820_CMD_PRGM_WS_OTP 0x30 +#define IL3820_CMD_UPDATE_LUT 0x32 +#define IL3820_CMD_PRGM_OTP_SELECTION 0x36 +#define IL3820_CMD_OTP_SELECTION_CTRL 0x37 +#define IL3820_CMD_DUMMY_LINE 0x3a +#define IL3820_CMD_GATE_LINE_WIDTH 0x3b +#define IL3820_CMD_BWF_CTRL 0x3c +#define IL3820_CMD_RAM_XPOS_CTRL 0x44 +#define IL3820_CMD_RAM_YPOS_CTRL 0x45 +#define IL3820_CMD_RAM_XPOS_CNTR 0x4e +#define IL3820_CMD_RAM_YPOS_CNTR 0x4f +#define IL3820_CMD_TERMINATE_FRAME_RW 0xff + +/* Data entry sequence modes */ +#define IL3820_DATA_ENTRY_MASK 0x07 +#define IL3820_DATA_ENTRY_XDYDX 0x00 +#define IL3820_DATA_ENTRY_XIYDX 0x01 +#define IL3820_DATA_ENTRY_XDYIX 0x02 +#define IL3820_DATA_ENTRY_XIYIX 0x03 +#define IL3820_DATA_ENTRY_XDYDY 0x04 +#define IL3820_DATA_ENTRY_XIYDY 0x05 +#define IL3820_DATA_ENTRY_XDYIY 0x06 +#define IL3820_DATA_ENTRY_XIYIY 0x07 + +/* Options for display update */ +#define IL3820_CTRL1_INITIAL_UPDATE_LL 0x00 +#define IL3820_CTRL1_INITIAL_UPDATE_LH 0x01 +#define IL3820_CTRL1_INITIAL_UPDATE_HL 0x02 +#define IL3820_CTRL1_INITIAL_UPDATE_HH 0x03 + +/* Options for display update sequence */ +#define IL3820_CTRL2_ENABLE_CLK 0x80 +#define IL3820_CTRL2_ENABLE_ANALOG 0x40 +#define IL3820_CTRL2_TO_INITIAL 0x08 +#define IL3820_CTRL2_TO_PATTERN 0x04 +#define IL3820_CTRL2_DISABLE_ANALOG 0x02 +#define IL3820_CTRL2_DISABLE_CLK 0x01 + +#define IL3820_SLEEP_MODE_DSM 0x01 +#define IL3820_SLEEP_MODE_PON 0x00 + +/* time constants in ms */ +#define IL3820_RESET_DELAY 20 +#define IL3820_BUSY_DELAY 1 +// normal wait time max 200ms +#define IL3820_WAIT 20 + +void il3820_init(void); +void il3820_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); +void il3820_fullflush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); +void il3820_rounder(struct _disp_drv_t * disp_drv, lv_area_t *area); +void il3820_set_px_cb(struct _disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa); +void il3820_sleep_in(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* __IL3820_REGS_H__ */ + diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/ili9341.h b/lib/lvgl_esp32_drivers/lvgl_tft/ili9341.h new file mode 100644 index 0000000..4beb4f3 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/ili9341.h @@ -0,0 +1,65 @@ +/** + * @file lv_templ.h + * + */ + +#ifndef ILI9341_H +#define ILI9341_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif +#include "../lvgl_helpers.h" + +/********************* + * DEFINES + *********************/ +#define ILI9341_DC CONFIG_LV_DISP_PIN_DC +#define ILI9341_RST CONFIG_LV_DISP_PIN_RST +#define ILI9341_BCKL CONFIG_LV_DISP_PIN_BCKL + +#define ILI9341_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL + +#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL + #define ILI9341_BCKL_ACTIVE_LVL 1 +#else + #define ILI9341_BCKL_ACTIVE_LVL 0 +#endif + +#define ILI9341_INVERT_COLORS CONFIG_LV_INVERT_COLORS + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void ili9341_init(void); +void ili9341_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); +void ili9341_enable_backlight(bool backlight); +void ili9341_sleep_in(void); +void ili9341_sleep_out(void); + +/********************** + * MACROS + **********************/ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*ILI9341_H*/ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/ili9481.h b/lib/lvgl_esp32_drivers/lvgl_tft/ili9481.h new file mode 100644 index 0000000..7932190 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/ili9481.h @@ -0,0 +1,130 @@ +/** + * @file ili9481.h + */ + +#ifndef ILI9481_H +#define ILI9481_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif +#include "../lvgl_helpers.h" + +/********************* + * DEFINES + *********************/ +#define ILI9481_DC CONFIG_LV_DISP_PIN_DC +#define ILI9481_RST CONFIG_LV_DISP_PIN_RST +#define ILI9481_BCKL CONFIG_LV_DISP_PIN_BCKL + +#define ILI9481_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL +#define ILI9481_INVERT_COLORS CONFIG_LV_INVERT_COLORS +#define ILI9481_DISPLAY_ORIENTATION CONFIG_LV_DISPLAY_ORIENTATION + +#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL + #define ILI9481_BCKL_ACTIVE_LVL 1 +#else + #define ILI9481_BCKL_ACTIVE_LVL 0 +#endif + +/******************* + * ILI9481 REGS +*********************/ + +/* MIPI DCS Type1 */ +#define ILI9481_CMD_NOP 0x00 +#define ILI9481_CMD_SOFTWARE_RESET 0x01 +#define ILI9481_CMD_READ_DISP_POWER_MODE 0x0A +#define ILI9481_CMD_READ_DISP_MADCTRL 0x0B // bits 7:3 only +#define ILI9481_CMD_READ_DISP_PIXEL_FORMAT 0x0C +#define ILI9481_CMD_READ_DISP_IMAGE_MODE 0x0D +#define ILI9481_CMD_READ_DISP_SIGNAL_MODE 0x0E +#define ILI9481_CMD_READ_DISP_SELF_DIAGNOSTIC 0x0F // bits 7:6 only +#define ILI9481_CMD_ENTER_SLEEP_MODE 0x10 +#define ILI9481_CMD_SLEEP_OUT 0x11 +#define ILI9481_CMD_PARTIAL_MODE_ON 0x12 +#define ILI9481_CMD_NORMAL_DISP_MODE_ON 0x13 +#define ILI9481_CMD_DISP_INVERSION_OFF 0x20 +#define ILI9481_CMD_DISP_INVERSION_ON 0x21 +#define ILI9481_CMD_DISPLAY_OFF 0x28 +#define ILI9481_CMD_DISPLAY_ON 0x29 +#define ILI9481_CMD_COLUMN_ADDRESS_SET 0x2A +#define ILI9481_CMD_PAGE_ADDRESS_SET 0x2B +#define ILI9481_CMD_MEMORY_WRITE 0x2C +#define ILI9481_CMD_MEMORY_READ 0x2E +#define ILI9481_CMD_PARTIAL_AREA 0x30 +#define ILI9481_CMD_VERT_SCROLL_DEFINITION 0x33 +#define ILI9481_CMD_TEARING_EFFECT_LINE_OFF 0x34 +#define ILI9481_CMD_TEARING_EFFECT_LINE_ON 0x35 +#define ILI9481_CMD_MEMORY_ACCESS_CONTROL 0x36 // bits 7:3,1:0 only +#define ILI9481_CMD_VERT_SCROLL_START_ADDRESS 0x37 +#define ILI9481_CMD_IDLE_MODE_OFF 0x38 +#define ILI9481_CMD_IDLE_MODE_ON 0x39 +#define ILI9481_CMD_COLMOD_PIXEL_FORMAT_SET 0x3A +#define ILI9481_CMD_WRITE_MEMORY_CONTINUE 0x3C +#define ILI9481_CMD_READ_MEMORY_CONTINUE 0x3E +#define ILI9481_CMD_SET_TEAR_SCANLINE 0x44 +#define ILI9481_CMD_GET_SCANLINE 0x45 + +#define ILI9481_DDB_START 0xA1 +#define ILI9481_DDB_CONTINUE 0xA8 + +/* other */ +#define ILI9481_CMD_ACCESS_PROTECT 0xB0 +#define ILI9481_CMD_LOW_POWER_CONTROL 0xB1 +#define ILI9481_CMD_FRAME_MEMORY_ACCESS 0xB3 +#define ILI9481_CMD_DISPLAY_MODE 0xB4 +#define ILI9481_CMD_DEVICE_CODE 0xBF + +#define ILI9481_CMD_PANEL_DRIVE 0xC0 +#define ILI9481_CMD_DISP_TIMING_NORMAL 0xC1 +#define ILI9481_CMD_DISP_TIMING_PARTIAL 0xC2 +#define ILI9481_CMD_DISP_TIMING_IDLE 0xC3 +#define ILI9481_CMD_FRAME_RATE 0xC5 +#define ILI9481_CMD_INTERFACE_CONTROL 0xC6 +#define ILI9481_CMD_GAMMA_SETTING 0xC8 + +#define ILI9481_CMD_POWER_SETTING 0xD0 +#define ILI9481_CMD_VCOM_CONTROL 0xD1 +#define ILI9481_CMD_POWER_CONTROL_NORMAL 0xD2 +#define ILI9481_CMD_POWER_CONTROL_IDEL 0xD3 +#define ILI9481_CMD_POWER_CONTROL_PARTIAL 0xD4 + +#define ILI9481_CMD_NVMEM_WRITE 0xE0 +#define ILI9481_CMD_NVMEM_PROTECTION_KEY 0xE1 +#define ILI9481_CMD_NVMEM_STATUS_READ 0xE2 +#define ILI9481_CMD_NVMEM_PROTECTION 0xE3 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void ili9481_init(void); +void ili9481_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); +void ili9481_enable_backlight(bool backlight); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*ILI9481_H*/ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/ili9486.h b/lib/lvgl_esp32_drivers/lvgl_tft/ili9486.h new file mode 100644 index 0000000..f65dd80 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/ili9486.h @@ -0,0 +1,61 @@ +/** + * @file ili9486.h + * + */ + +#ifndef ILI9486_H +#define ILI9486_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif +#include "../lvgl_helpers.h" + +/********************* + * DEFINES + *********************/ +#define ILI9486_DC CONFIG_LV_DISP_PIN_DC +#define ILI9486_RST CONFIG_LV_DISP_PIN_RST +#define ILI9486_BCKL CONFIG_LV_DISP_PIN_BCKL + +#define ILI9486_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL + +#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL + #define ILI9486_BCKL_ACTIVE_LVL 1 +#else + #define ILI9486_BCKL_ACTIVE_LVL 0 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void ili9486_init(void); +void ili9486_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); +void ili9486_enable_backlight(bool backlight); + +/********************** + * MACROS + **********************/ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ILI9486_H*/ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/ili9488.h b/lib/lvgl_esp32_drivers/lvgl_tft/ili9488.h new file mode 100644 index 0000000..45a7045 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/ili9488.h @@ -0,0 +1,167 @@ +/** + * @file ili9488.h + */ + +#ifndef ILI9844_H +#define ILI9844_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif +#include "../lvgl_helpers.h" + +/********************* + * DEFINES + *********************/ +#define ILI9488_DC CONFIG_LV_DISP_PIN_DC +#define ILI9488_RST CONFIG_LV_DISP_PIN_RST +#define ILI9488_BCKL CONFIG_LV_DISP_PIN_BCKL + +#define ILI9488_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL + +#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL + #define ILI9488_BCKL_ACTIVE_LVL 1 +#else + #define ILI9488_BCKL_ACTIVE_LVL 0 +#endif + +/******************* + * ILI9488 REGS +*********************/ + +/* Level 1 Commands (from the display Datasheet) */ +#define ILI9488_CMD_NOP 0x00 +#define ILI9488_CMD_SOFTWARE_RESET 0x01 +#define ILI9488_CMD_READ_DISP_ID 0x04 +#define ILI9488_CMD_READ_ERROR_DSI 0x05 +#define ILI9488_CMD_READ_DISP_STATUS 0x09 +#define ILI9488_CMD_READ_DISP_POWER_MODE 0x0A +#define ILI9488_CMD_READ_DISP_MADCTRL 0x0B +#define ILI9488_CMD_READ_DISP_PIXEL_FORMAT 0x0C +#define ILI9488_CMD_READ_DISP_IMAGE_MODE 0x0D +#define ILI9488_CMD_READ_DISP_SIGNAL_MODE 0x0E +#define ILI9488_CMD_READ_DISP_SELF_DIAGNOSTIC 0x0F +#define ILI9488_CMD_ENTER_SLEEP_MODE 0x10 +#define ILI9488_CMD_SLEEP_OUT 0x11 +#define ILI9488_CMD_PARTIAL_MODE_ON 0x12 +#define ILI9488_CMD_NORMAL_DISP_MODE_ON 0x13 +#define ILI9488_CMD_DISP_INVERSION_OFF 0x20 +#define ILI9488_CMD_DISP_INVERSION_ON 0x21 +#define ILI9488_CMD_PIXEL_OFF 0x22 +#define ILI9488_CMD_PIXEL_ON 0x23 +#define ILI9488_CMD_DISPLAY_OFF 0x28 +#define ILI9488_CMD_DISPLAY_ON 0x29 +#define ILI9488_CMD_COLUMN_ADDRESS_SET 0x2A +#define ILI9488_CMD_PAGE_ADDRESS_SET 0x2B +#define ILI9488_CMD_MEMORY_WRITE 0x2C +#define ILI9488_CMD_MEMORY_READ 0x2E +#define ILI9488_CMD_PARTIAL_AREA 0x30 +#define ILI9488_CMD_VERT_SCROLL_DEFINITION 0x33 +#define ILI9488_CMD_TEARING_EFFECT_LINE_OFF 0x34 +#define ILI9488_CMD_TEARING_EFFECT_LINE_ON 0x35 +#define ILI9488_CMD_MEMORY_ACCESS_CONTROL 0x36 +#define ILI9488_CMD_VERT_SCROLL_START_ADDRESS 0x37 +#define ILI9488_CMD_IDLE_MODE_OFF 0x38 +#define ILI9488_CMD_IDLE_MODE_ON 0x39 +#define ILI9488_CMD_COLMOD_PIXEL_FORMAT_SET 0x3A +#define ILI9488_CMD_WRITE_MEMORY_CONTINUE 0x3C +#define ILI9488_CMD_READ_MEMORY_CONTINUE 0x3E +#define ILI9488_CMD_SET_TEAR_SCANLINE 0x44 +#define ILI9488_CMD_GET_SCANLINE 0x45 +#define ILI9488_CMD_WRITE_DISPLAY_BRIGHTNESS 0x51 +#define ILI9488_CMD_READ_DISPLAY_BRIGHTNESS 0x52 +#define ILI9488_CMD_WRITE_CTRL_DISPLAY 0x53 +#define ILI9488_CMD_READ_CTRL_DISPLAY 0x54 +#define ILI9488_CMD_WRITE_CONTENT_ADAPT_BRIGHTNESS 0x55 +#define ILI9488_CMD_READ_CONTENT_ADAPT_BRIGHTNESS 0x56 +#define ILI9488_CMD_WRITE_MIN_CAB_LEVEL 0x5E +#define ILI9488_CMD_READ_MIN_CAB_LEVEL 0x5F +#define ILI9488_CMD_READ_ABC_SELF_DIAG_RES 0x68 +#define ILI9488_CMD_READ_ID1 0xDA +#define ILI9488_CMD_READ_ID2 0xDB +#define ILI9488_CMD_READ_ID3 0xDC + +/* Level 2 Commands (from the display Datasheet) */ +#define ILI9488_CMD_INTERFACE_MODE_CONTROL 0xB0 +#define ILI9488_CMD_FRAME_RATE_CONTROL_NORMAL 0xB1 +#define ILI9488_CMD_FRAME_RATE_CONTROL_IDLE_8COLOR 0xB2 +#define ILI9488_CMD_FRAME_RATE_CONTROL_PARTIAL 0xB3 +#define ILI9488_CMD_DISPLAY_INVERSION_CONTROL 0xB4 +#define ILI9488_CMD_BLANKING_PORCH_CONTROL 0xB5 +#define ILI9488_CMD_DISPLAY_FUNCTION_CONTROL 0xB6 +#define ILI9488_CMD_ENTRY_MODE_SET 0xB7 +#define ILI9488_CMD_BACKLIGHT_CONTROL_1 0xB9 +#define ILI9488_CMD_BACKLIGHT_CONTROL_2 0xBA +#define ILI9488_CMD_HS_LANES_CONTROL 0xBE +#define ILI9488_CMD_POWER_CONTROL_1 0xC0 +#define ILI9488_CMD_POWER_CONTROL_2 0xC1 +#define ILI9488_CMD_POWER_CONTROL_NORMAL_3 0xC2 +#define ILI9488_CMD_POWER_CONTROL_IDEL_4 0xC3 +#define ILI9488_CMD_POWER_CONTROL_PARTIAL_5 0xC4 +#define ILI9488_CMD_VCOM_CONTROL_1 0xC5 +#define ILI9488_CMD_CABC_CONTROL_1 0xC6 +#define ILI9488_CMD_CABC_CONTROL_2 0xC8 +#define ILI9488_CMD_CABC_CONTROL_3 0xC9 +#define ILI9488_CMD_CABC_CONTROL_4 0xCA +#define ILI9488_CMD_CABC_CONTROL_5 0xCB +#define ILI9488_CMD_CABC_CONTROL_6 0xCC +#define ILI9488_CMD_CABC_CONTROL_7 0xCD +#define ILI9488_CMD_CABC_CONTROL_8 0xCE +#define ILI9488_CMD_CABC_CONTROL_9 0xCF +#define ILI9488_CMD_NVMEM_WRITE 0xD0 +#define ILI9488_CMD_NVMEM_PROTECTION_KEY 0xD1 +#define ILI9488_CMD_NVMEM_STATUS_READ 0xD2 +#define ILI9488_CMD_READ_ID4 0xD3 +#define ILI9488_CMD_ADJUST_CONTROL_1 0xD7 +#define ILI9488_CMD_READ_ID_VERSION 0xD8 +#define ILI9488_CMD_POSITIVE_GAMMA_CORRECTION 0xE0 +#define ILI9488_CMD_NEGATIVE_GAMMA_CORRECTION 0xE1 +#define ILI9488_CMD_DIGITAL_GAMMA_CONTROL_1 0xE2 +#define ILI9488_CMD_DIGITAL_GAMMA_CONTROL_2 0xE3 +#define ILI9488_CMD_SET_IMAGE_FUNCTION 0xE9 +#define ILI9488_CMD_ADJUST_CONTROL_2 0xF2 +#define ILI9488_CMD_ADJUST_CONTROL_3 0xF7 +#define ILI9488_CMD_ADJUST_CONTROL_4 0xF8 +#define ILI9488_CMD_ADJUST_CONTROL_5 0xF9 +#define ILI9488_CMD_SPI_READ_SETTINGS 0xFB +#define ILI9488_CMD_ADJUST_CONTROL_6 0xFC +#define ILI9488_CMD_ADJUST_CONTROL_7 0xFF + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint8_t red; + uint8_t green; + uint8_t blue; +} lv_color_custom_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void ili9488_init(void); +void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); +void ili9488_enable_backlight(bool backlight); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*ILI9488_H*/ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/jd79653a.h b/lib/lvgl_esp32_drivers/lvgl_tft/jd79653a.h new file mode 100644 index 0000000..6a2065a --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/jd79653a.h @@ -0,0 +1,36 @@ +/** + * @file il3820.h + * + */ + +#ifndef JD79653A_H +#define JD79653A_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +void jd79653a_init(); +void jd79653a_deep_sleep(); + +void jd79653a_lv_set_fb_cb(struct _disp_drv_t * disp_drv, uint8_t* buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); +void jd79653a_lv_rounder_cb(struct _disp_drv_t * disp_drv, lv_area_t *area); +void jd79653a_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); + +void jd79653a_fb_set_full_color(uint8_t color); +void jd79653a_fb_full_update(uint8_t *data, size_t len); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif // JD79653A_H diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/ra8875.h b/lib/lvgl_esp32_drivers/lvgl_tft/ra8875.h new file mode 100644 index 0000000..a6d1fe5 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/ra8875.h @@ -0,0 +1,118 @@ +/** + * @file ra8875.h + * + */ + +#ifndef RA8875_H +#define RA8875_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +/********************* + * DEFINES + *********************/ +#define RA8875_RST CONFIG_LV_DISP_PIN_RST + +// System & Configuration Registers +#define RA8875_REG_PWRR (0x01) // Power and Display Control Register (PWRR) +#define RA8875_REG_MRWC (0x02) // Memory Read/Write Command (MRWC) +#define RA8875_REG_PCSR (0x04) // Pixel Clock Setting Register (PCSR) +#define RA8875_REG_SYSR (0x10) // System Configuration Register (SYSR) +#define RA8875_REG_HDWR (0x14) // LCD Horizontal Display Width Register (HDWR) +#define RA8875_REG_HNDFTR (0x15) // Horizontal Non-Display Period Fine Tuning Option Register (HNDFTR) +#define RA8875_REG_HNDR (0x16) // LCD Horizontal Non-Display Period Register (HNDR) +#define RA8875_REG_HSTR (0x17) // HSYNC Start Position Register (HSTR) +#define RA8875_REG_HPWR (0x18) // HSYNC Pulse Width Register (HPWR) +#define RA8875_REG_VDHR0 (0x19) // LCD Vertical Display Height Register (VDHR0) +#define RA8875_REG_VDHR1 (0x1A) // LCD Vertical Display Height Register (VDHR1) +#define RA8875_REG_VNDR0 (0x1B) // LCD Vertical Non-Display Period Register (VNDR0) +#define RA8875_REG_VNDR1 (0x1C) // LCD Vertical Non-Display Period Register (VNDR1) +#define RA8875_REG_VSTR0 (0x1D) // VSYNC Start Position Register (VSTR0) +#define RA8875_REG_VSTR1 (0x1E) // VSYNC Start Position Register (VSTR1) +#define RA8875_REG_VPWR (0x1F) // VSYNC Pulse Width Register (VPWR) + +// LCD Display Control Registers +#define RA8875_REG_DPCR (0x20) // Display Configuration Register (DPCR) + +// Active Window & Scroll Window Setting Registers +#define RA8875_REG_HSAW0 (0x30) // Horizontal Start Point 0 of Active Window (HSAW0) +#define RA8875_REG_HSAW1 (0x31) // Horizontal Start Point 1 of Active Window (HSAW1) +#define RA8875_REG_VSAW0 (0x32) // Vertical Start Point 0 of Active Window (VSAW0) +#define RA8875_REG_VSAW1 (0x33) // Vertical Start Point 1 of Active Window (VSAW1) +#define RA8875_REG_HEAW0 (0x34) // Horizontal End Point 0 of Active Window (HEAW0) +#define RA8875_REG_HEAW1 (0x35) // Horizontal End Point 1 of Active Window (HEAW1) +#define RA8875_REG_VEAW0 (0x36) // Vertical End Point 0 of Active Window (VEAW0) +#define RA8875_REG_VEAW1 (0x37) // Vertical End Point 1 of Active Window (VEAW1) + +// Cursor Setting Registers +#define RA8875_REG_MWCR0 (0x40) // Memory Write Control Register 0 (MWCR0) +#define RA8875_REG_MWCR1 (0x41) // Memory Write Control Register 1 (MWCR1) +#define RA8875_REG_CURH0 (0x46) // Memory Write Cursor Horizontal Position Register 0 (CURH0) +#define RA8875_REG_CURH1 (0x47) // Memory Write Cursor Horizontal Position Register 1 (CURH1) +#define RA8875_REG_CURV0 (0x48) // Memory Write Cursor Vertical Position Register 0 (CURV0) +#define RA8875_REG_CURV1 (0x49) // Memory Write Cursor Vertical Position Register 1 (CURV1) + +// Block Transfer Engine(BTE) Control Registers +#define RA8875_REG_LTPR0 (0x52) // Layer Transparency Register 0 (LTPR0) +#define RA8875_REG_LTPR1 (0x53) // Layer Transparency Register 1 (LTPR1) + +// Touch Panel Control Registers +#define RA8875_REG_TPCR0 (0x70) // Touch Panel Control Register 0 (TPCR0) +#define RA8875_REG_TPCR1 (0x71) // Touch Panel Control Register 1 (TPCR1) +#define RA8875_REG_TPXH (0x72) // Touch Panel X High Byte Data Register (TPXH) +#define RA8875_REG_TPYH (0x73) // Touch Panel Y High Byte Data Register (TPYH) +#define RA8875_REG_TPXYL (0x74) // Touch Panel X/Y Low Byte Data Register (TPXYL) + +// PLL Setting Registers +#define RA8875_REG_PLLC1 (0x88) // PLL Control Register 1 (PLLC1) +#define RA8875_REG_PLLC2 (0x89) // PLL Control Register 2 (PLLC2) + +// Memory Clear Register +#define RA8875_REG_MCLR (0x8E) // Memory Clear Control Register (MCLR) + +// Interrupt Control Registers +#define RA8875_REG_INTC1 (0xF0) // Interrupt Control Register1 (INTC1) +#define RA8875_REG_INTC2 (0xF1) // Interrupt Control Register1 (INTC2) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void ra8875_init(void); +void ra8875_enable_backlight(bool backlight); +void ra8875_enable_display(bool enable); +void ra8875_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); + +void ra8875_sleep_in(void); +void ra8875_sleep_out(void); + +uint8_t ra8875_read_cmd(uint8_t cmd); +void ra8875_write_cmd(uint8_t cmd, uint8_t data); + +/********************** + * MACROS + **********************/ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*RA8875_H*/ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/sh1107.h b/lib/lvgl_esp32_drivers/lvgl_tft/sh1107.h new file mode 100644 index 0000000..7a0db68 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/sh1107.h @@ -0,0 +1,55 @@ +/** + * @file lv_templ.h + * + */ + +#ifndef SH1107_H +#define SH1107_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif +#include "../lvgl_helpers.h" + +/********************* + * DEFINES + *********************/ +#define SH1107_DC CONFIG_LV_DISP_PIN_DC +#define SH1107_RST CONFIG_LV_DISP_PIN_RST + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void sh1107_init(void); +void sh1107_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); +void sh1107_rounder(struct _disp_drv_t * disp_drv, lv_area_t *area); +void sh1107_set_px_cb(struct _disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); +void sh1107_sleep_in(void); +void sh1107_sleep_out(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*SH1107_H*/ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/ssd1306.h b/lib/lvgl_esp32_drivers/lvgl_tft/ssd1306.h new file mode 100644 index 0000000..f859a76 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/ssd1306.h @@ -0,0 +1,57 @@ +/** + * @file lv_templ.h + * + */ + +#ifndef SSD1306_H +#define SSD1306_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif +#include "../lvgl_helpers.h" + +/********************* + * DEFINES + *********************/ +#define SSD1306_SDA CONFIG_LV_DISP_PIN_SDA +#define SSD1306_SCL CONFIG_LV_DISP_PIN_SCL +#define SSD1306_DISPLAY_ORIENTATION TFT_ORIENTATION_LANDSCAPE + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void ssd1306_init(void); +void ssd1306_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); +void ssd1306_rounder(struct _disp_drv_t * disp_drv, lv_area_t *area); +void ssd1306_set_px_cb(struct _disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); + +void ssd1306_sleep_in(void); +void ssd1306_sleep_out(void); + +/********************** + * MACROS + **********************/ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*SSD1306_H*/ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/st7735s.h b/lib/lvgl_esp32_drivers/lvgl_tft/st7735s.h new file mode 100644 index 0000000..03672ee --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/st7735s.h @@ -0,0 +1,149 @@ +/** + * @file lv_templ.h + * + */ + +#ifndef ST7735S_H +#define ST7735S_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +/********************* + * DEFINES + *********************/ +// #define DISP_BUF_SIZE (CONFIG_LV_DISPLAY_WIDTH*CONFIG_LV_DISPLAY_HEIGHT) +#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40) + +#define ST7735S_DC CONFIG_LV_DISP_PIN_DC +#define ST7735S_RST CONFIG_LV_DISP_PIN_RST + +#define AXP192_SDA CONFIG_LV_AXP192_PIN_SDA +#define AXP192_SCL CONFIG_LV_AXP192_PIN_SCL + +#define ST7735S_INVERT_COLORS CONFIG_LV_INVERT_COLORS + +// Defines are taken from +// https://raw.githubusercontent.com/m5stack/M5StickC/master/src/utility/ST7735_Defines.h +// and are modified to fit to the M5StickC device, and are taken from +// https://github.com/adafruit/Adafruit-ST7735-Library +// +#define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 / 1 offset) +#define COLSTART 26 +#define ROWSTART 1 + +// Delay between some initialisation commands +#define TFT_INIT_DELAY 0x80 + +#define TFT_NOP 0x00 +#define TFT_SWRST 0x01 + +#define TFT_CASET 0x2A +#define TFT_PASET 0x2B +#define TFT_RAMWR 0x2C + +#define TFT_RAMRD 0x2E +#define TFT_IDXRD 0x00 + +#define TFT_MADCTL 0x36 +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_RGB 0x00 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +// ST7735 specific commands used in init +#define ST7735_NOP 0x00 +#define ST7735_SWRESET 0x01 +#define ST7735_RDDID 0x04 +#define ST7735_RDDST 0x09 + +#define ST7735_SLPIN 0x10 +#define ST7735_SLPOUT 0x11 +#define ST7735_PTLON 0x12 +#define ST7735_NORON 0x13 + +#define ST7735_INVOFF 0x20 +#define ST7735_INVON 0x21 +#define ST7735_DISPOFF 0x28 +#define ST7735_DISPON 0x29 +#define ST7735_CASET 0x2A +#define ST7735_RASET 0x2B +#define ST7735_RAMWR 0x2C +#define ST7735_RAMRD 0x2E + +#define ST7735_PTLAR 0x30 +#define ST7735_VSCRDEF 0x33 +#define ST7735_COLMOD 0x3A +#define ST7735_MADCTL 0x36 +#define ST7735_VSCRSADD 0x37 + +#define ST7735_FRMCTR1 0xB1 +#define ST7735_FRMCTR2 0xB2 +#define ST7735_FRMCTR3 0xB3 +#define ST7735_INVCTR 0xB4 +#define ST7735_DISSET5 0xB6 + +#define ST7735_PWCTR1 0xC0 +#define ST7735_PWCTR2 0xC1 +#define ST7735_PWCTR3 0xC2 +#define ST7735_PWCTR4 0xC3 +#define ST7735_PWCTR5 0xC4 +#define ST7735_VMCTR1 0xC5 + +#define ST7735_RDID1 0xDA +#define ST7735_RDID2 0xDB +#define ST7735_RDID3 0xDC +#define ST7735_RDID4 0xDD + +#define ST7735_PWCTR6 0xFC + +#define ST7735_GMCTRP1 0xE0 +#define ST7735_GMCTRN1 0xE1 + +#define ST77XX_MADCTL_MY 0x80 +#define ST77XX_MADCTL_MX 0x40 +#define ST77XX_MADCTL_MV 0x20 +#define ST77XX_MADCTL_ML 0x10 +#define ST77XX_MADCTL_RGB 0x00 +#define ST77XX_MADCTL_BGR 0x08 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void st7735s_init(void); +void st7735s_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map); +void st7735s_enable_backlight(bool backlight); +void st7735s_sleep_in(void); +void st7735s_sleep_out(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*ST7735S_H*/ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/st7789.h b/lib/lvgl_esp32_drivers/lvgl_tft/st7789.h new file mode 100644 index 0000000..1136562 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/st7789.h @@ -0,0 +1,120 @@ +/** + * @file st7789.h + * + * Mostly taken from lbthomsen/esp-idf-littlevgl github. + */ + +#ifndef ST7789_H +#define ST7789_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif +#include "../lvgl_helpers.h" + +#include "sdkconfig.h" + +#define ST7789_DC CONFIG_LV_DISP_PIN_DC +#define ST7789_RST CONFIG_LV_DISP_PIN_RST +#define ST7789_BCKL CONFIG_LV_DISP_PIN_BCKL + +#define ST7789_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL + +#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL + #define ST7789_BCKL_ACTIVE_LVL 1 +#else + #define ST7789_BCKL_ACTIVE_LVL 0 +#endif + +/* ST7789 commands */ +#define ST7789_NOP 0x00 +#define ST7789_SWRESET 0x01 +#define ST7789_RDDID 0x04 +#define ST7789_RDDST 0x09 + +#define ST7789_RDDPM 0x0A // Read display power mode +#define ST7789_RDD_MADCTL 0x0B // Read display MADCTL +#define ST7789_RDD_COLMOD 0x0C // Read display pixel format +#define ST7789_RDDIM 0x0D // Read display image mode +#define ST7789_RDDSM 0x0E // Read display signal mode +#define ST7789_RDDSR 0x0F // Read display self-diagnostic result (ST7789V) + +#define ST7789_SLPIN 0x10 +#define ST7789_SLPOUT 0x11 +#define ST7789_PTLON 0x12 +#define ST7789_NORON 0x13 + +#define ST7789_INVOFF 0x20 +#define ST7789_INVON 0x21 +#define ST7789_GAMSET 0x26 // Gamma set +#define ST7789_DISPOFF 0x28 +#define ST7789_DISPON 0x29 +#define ST7789_CASET 0x2A +#define ST7789_RASET 0x2B +#define ST7789_RAMWR 0x2C +#define ST7789_RGBSET 0x2D // Color setting for 4096, 64K and 262K colors +#define ST7789_RAMRD 0x2E + +#define ST7789_PTLAR 0x30 +#define ST7789_VSCRDEF 0x33 // Vertical scrolling definition (ST7789V) +#define ST7789_TEOFF 0x34 // Tearing effect line off +#define ST7789_TEON 0x35 // Tearing effect line on +#define ST7789_MADCTL 0x36 // Memory data access control +#define ST7789_IDMOFF 0x38 // Idle mode off +#define ST7789_IDMON 0x39 // Idle mode on +#define ST7789_RAMWRC 0x3C // Memory write continue (ST7789V) +#define ST7789_RAMRDC 0x3E // Memory read continue (ST7789V) +#define ST7789_COLMOD 0x3A + +#define ST7789_RAMCTRL 0xB0 // RAM control +#define ST7789_RGBCTRL 0xB1 // RGB control +#define ST7789_PORCTRL 0xB2 // Porch control +#define ST7789_FRCTRL1 0xB3 // Frame rate control +#define ST7789_PARCTRL 0xB5 // Partial mode control +#define ST7789_GCTRL 0xB7 // Gate control +#define ST7789_GTADJ 0xB8 // Gate on timing adjustment +#define ST7789_DGMEN 0xBA // Digital gamma enable +#define ST7789_VCOMS 0xBB // VCOMS setting +#define ST7789_LCMCTRL 0xC0 // LCM control +#define ST7789_IDSET 0xC1 // ID setting +#define ST7789_VDVVRHEN 0xC2 // VDV and VRH command enable +#define ST7789_VRHS 0xC3 // VRH set +#define ST7789_VDVSET 0xC4 // VDV setting +#define ST7789_VCMOFSET 0xC5 // VCOMS offset set +#define ST7789_FRCTR2 0xC6 // FR Control 2 +#define ST7789_CABCCTRL 0xC7 // CABC control +#define ST7789_REGSEL1 0xC8 // Register value section 1 +#define ST7789_REGSEL2 0xCA // Register value section 2 +#define ST7789_PWMFRSEL 0xCC // PWM frequency selection +#define ST7789_PWCTRL1 0xD0 // Power control 1 +#define ST7789_VAPVANEN 0xD2 // Enable VAP/VAN signal output +#define ST7789_CMD2EN 0xDF // Command 2 enable +#define ST7789_PVGAMCTRL 0xE0 // Positive voltage gamma control +#define ST7789_NVGAMCTRL 0xE1 // Negative voltage gamma control +#define ST7789_DGMLUTR 0xE2 // Digital gamma look-up table for red +#define ST7789_DGMLUTB 0xE3 // Digital gamma look-up table for blue +#define ST7789_GATECTRL 0xE4 // Gate control +#define ST7789_SPI2EN 0xE7 // SPI2 enable +#define ST7789_PWCTRL2 0xE8 // Power control 2 +#define ST7789_EQCTRL 0xE9 // Equalize time control +#define ST7789_PROMCTRL 0xEC // Program control +#define ST7789_PROMEN 0xFA // Program mode enable +#define ST7789_NVMSET 0xFC // NVM setting +#define ST7789_PROMACT 0xFE // Program action + +void st7789_init(void); +void st7789_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); +void st7789_enable_backlight(bool backlight); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* ST7789_H */ diff --git a/lib/lvgl_esp32_drivers/lvgl_tft/uc8151d.h b/lib/lvgl_esp32_drivers/lvgl_tft/uc8151d.h new file mode 100644 index 0000000..e637f0e --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_tft/uc8151d.h @@ -0,0 +1,39 @@ +/** + @file uc8151d.h + @brief GoodDisplay GDEW0154M09 e-paper display w/ FitiPower JD79653A + @version 1.0 + @date 2020-08-28 + @author Jackson Ming Hu + + + @section LICENSE + + MIT License + + Copyright (c) 2020 Jackson Ming Hu + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LVGL_DEMO_UC8151D_H +#define LVGL_DEMO_UC8151D_H + +#include + +void uc8151d_init(); +void uc8151d_lv_set_fb_cb(struct _disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); + +void uc8151d_lv_rounder_cb(struct _disp_drv_t *disp_drv, lv_area_t *area); +void uc8151d_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map); + +#endif //LVGL_DEMO_UC8151D_H diff --git a/lib/lvgl_esp32_drivers/lvgl_touch/touch_driver.h b/lib/lvgl_esp32_drivers/lvgl_touch/touch_driver.h new file mode 100644 index 0000000..bc92f4f --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_touch/touch_driver.h @@ -0,0 +1,52 @@ +/** + * @file touch_driver.h + */ + +#ifndef TOUCH_DRIVER_H +#define TOUCH_DRIVER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +#if defined (CONFIG_LV_TOUCH_CONTROLLER_XPT2046) +#include "xpt2046.h" +#elif defined (CONFIG_LV_TOUCH_CONTROLLER_FT6X06) +#include "ft6x36.h" +#elif defined (CONFIG_LV_TOUCH_CONTROLLER_STMPE610) +#include "stmpe610.h" +#elif defined (CONFIG_LV_TOUCH_CONTROLLER_ADCRAW) +#include "adcraw.h" +#elif defined (CONFIG_LV_TOUCH_CONTROLLER_FT81X) +#include "FT81x.h" +#elif defined (CONFIG_LV_TOUCH_CONTROLLER_RA8875) +#include "ra8875_touch.h" +#endif + +/********************* +* DEFINES +*********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void touch_driver_init(void); +bool touch_driver_read(lv_indev_drv_t *drv, lv_indev_data_t *data); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* TOUCH_DRIVER_H */ + diff --git a/lib/lvgl_esp32_drivers/lvgl_touch/tp_i2c.h b/lib/lvgl_esp32_drivers/lvgl_touch/tp_i2c.h new file mode 100644 index 0000000..0f463a4 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_touch/tp_i2c.h @@ -0,0 +1,36 @@ +/* +* Copyright Š 2020 Wolfgang Christl + +* Permission is hereby granted, free of charge, to any person obtaining a copy of this +* software and associated documentation files (the “Software”), to deal in the Software +* without restriction, including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +* to whom the Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +#ifndef __TS_H +#define __TS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +esp_err_t i2c_master_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __TS_H */ diff --git a/lib/lvgl_esp32_drivers/lvgl_touch/tp_spi.h b/lib/lvgl_esp32_drivers/lvgl_touch/tp_spi.h new file mode 100644 index 0000000..3fd30c5 --- /dev/null +++ b/lib/lvgl_esp32_drivers/lvgl_touch/tp_spi.h @@ -0,0 +1,45 @@ +/** + * @file tp_spi.h + * + */ + +#ifndef TP_SPI_H +#define TP_SPI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void tp_spi_add_device(spi_host_device_t host); +void tp_spi_add_device_config(spi_host_device_t host, spi_device_interface_config_t *config); +void tp_spi_xchg(uint8_t* data_send, uint8_t* data_recv, uint8_t byte_count); +void tp_spi_write_reg(uint8_t* data, uint8_t byte_count); +void tp_spi_read_reg(uint8_t reg, uint8_t* data, uint8_t byte_count); + +/********************** + * MACROS + **********************/ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*TP_SPI_H*/ diff --git a/maps/bin/astc_conv.py b/maps/bin/astc_conv.py new file mode 100644 index 0000000..38727d9 --- /dev/null +++ b/maps/bin/astc_conv.py @@ -0,0 +1,89 @@ +# uncompyle6 version 3.7.4 +# Python bytecode 3.7 (3394) +# Decompiled from: Python 3.7.5 (tags/v3.7.5:5c02a39a0b, Oct 15 2019, 00:11:34) [MSC v.1916 64 bit (AMD64)] +# Embedded file name: astc_conv.py +from PIL import Image, ImageChops +import array, tempfile, os, struct + +def astc_dims(fmt): + if isinstance(fmt, int): + return astc_dims({37808:'COMPRESSED_RGBA_ASTC_4x4_KHR', + 37809:'COMPRESSED_RGBA_ASTC_5x4_KHR', + 37810:'COMPRESSED_RGBA_ASTC_5x5_KHR', + 37811:'COMPRESSED_RGBA_ASTC_6x5_KHR', + 37812:'COMPRESSED_RGBA_ASTC_6x6_KHR', + 37813:'COMPRESSED_RGBA_ASTC_8x5_KHR', + 37814:'COMPRESSED_RGBA_ASTC_8x6_KHR', + 37815:'COMPRESSED_RGBA_ASTC_8x8_KHR', + 37816:'COMPRESSED_RGBA_ASTC_10x5_KHR', + 37817:'COMPRESSED_RGBA_ASTC_10x6_KHR', + 37818:'COMPRESSED_RGBA_ASTC_10x8_KHR', + 37819:'COMPRESSED_RGBA_ASTC_10x10_KHR', + 37820:'COMPRESSED_RGBA_ASTC_12x10_KHR', + 37821:'COMPRESSED_RGBA_ASTC_12x12_KHR'}[fmt]) + dims = str(fmt).split('_')[3] + return [int(c) for c in dims.split('x')] + + +def tile(f): + _, w, h, _, iw, _, ih, _, _, _ = struct.unpack('0 : + barray = bytearray(m) + for i in range(0,m): + barray[i] = 0xFF + o.write(barray) + return + + +def alignFile(o, position, aligment): + m = position % aligment + if m>0 : + m = aligment-m + barray = bytearray(m) + for i in range(0,m): + barray[i] = 0xFF + o.write(barray) + return m + + +def main(): + output = sys.argv[1] + maps = [] + maps_meta = [] + position = 0 + with io.open(output, 'wb') as o: + for i, arg in enumerate(sys.argv): + if i>1: + maps.append(arg) + for map in maps: + with open(map, mode='rb') as file: + mapContent = file.read() + with open(map+'.json') as f: + mapMeta = json.load(f) + mapMeta["base_address"] = position + o.write(mapContent) + position += len(mapContent) + position += alignFile(o,position,4096) + maps_meta.append(mapMeta) + + with io.open(output+'.json', 'w') as f: + f.write(json.dumps(maps_meta,indent=6)) + + with io.open(output+'.dat', 'wb') as f: + cnt = len(maps_meta) + f.write(struct.pack('0 : + barray = bytearray(m) + for i in range(0,m): + barray[i] = 0xFF + o.write(barray) + return + + +def alignFile(o, position, aligment): + m = position % aligment + if m>0 : + m = aligment-m + barray = bytearray(m) + for i in range(0,m): + barray[i] = 0xFF + o.write(barray) + return m + + +def loadImage(filenameBase,x,y): + filename = filenameBase+str(x)+'/'+str(y)+'.png' + if path.exists(filename): + im=Image.open(filename) + return im + return None + +def main(): + folder = sys.argv[1] + output = sys.argv[2] + print('Processing '+folder) + tmeta = {} + position = 0 + with open(folder+'/metadata.json') as f: + meta = json.load(f) + tmeta['name'] = meta['name'] + tmeta['bounds'] = [meta['extent'][0],meta['extent'][3],meta['extent'][2],meta['extent'][1]] + tmeta['tile_matrix'] = [] + with io.open(output, 'wb') as o: + for zl in meta['tile_matrix']: + zitem = {} + zitem['id'] = zl['id'] + zitem['bounds'] = [zl['origin'][0],zl['origin'][1],zl['extent'][2],zl['extent'][1]] + zitem['images'] = [] + zitem['pixel_size'] = zl['pixel_size'] + zitem['tile_size'] = [zl['pixel_size'][0]*zl['tile_size'][0],zl['pixel_size'][1]*zl['tile_size'][1]] + xc = zl['origin'][0] + yc = zl['origin'][1] + xp = zl['pixel_size'][0] + yp = zl['pixel_size'][1] + fmt = 37808 + hasImages = False + if zl['matrix_size'][0]*zl['matrix_size'][1] >=8: + fmt = 37812 + for x in range(zl['matrix_size'][0]): + for y in range(zl['matrix_size'][1]): + filenameBase = folder+'/'+zl['id']+'/' + filename = filenameBase+str(x)+'/'+str(y)+'.png' + if path.exists(filename): + im=Image.open(filename) + expand = 1 + nim = Image.new('RGBA',(im.size[0]+expand*2,im.size[1]+expand*2)) + nim.putalpha(0) + nim.paste(im,(expand,expand)) + + pim = loadImage(filenameBase,x,y-1) + if pim!=None: + nim.paste(pim.crop((0,pim.size[1]-expand,pim.size[0],pim.size[1])),(expand,0)) + + pim = loadImage(filenameBase,x,y+1) + if pim!=None: + nim.paste(pim.crop((0,0,pim.size[0],expand)),(expand,nim.size[1]-expand)) + + pim = loadImage(filenameBase,x-1,y) + if pim!=None: + nim.paste(pim.crop((pim.size[0]-expand,0,pim.size[0],pim.size[1])),(0,expand)) + + pim = loadImage(filenameBase,x+1,y) + if pim!=None: + nim.paste(pim.crop((0,0,expand,pim.size[1])),(nim.size[0]-expand,expand)) + + rsize = im.size + im = nim + stride,asize,astc = astc_conv.convert(im,fmt) + if len(astc)>0: + hasImages = True + fileinfo = {} + fileinfo['size'] = im.size + fileinfo['bounds'] = [xc+x*rsize[0]*xp-xp*expand,yc+y*rsize[1]*yp-yp*expand,xc+(x+1)*rsize[0]*xp+xp*expand,yc+(y+1)*rsize[1]*yp+yp*expand] + fileinfo['x'] = x + fileinfo['y'] = y + fileinfo['address'] = position + fileinfo['image_stride'] = stride + fileinfo['image_size'] = len(astc) + fileinfo['image_fmt'] = fmt + o.write(astc) + with open(filename+'.bin','wb') as f: + f.write(astc) + position += len(astc) + pad(o,64) + position += 64 + position += alignFile(o,position,64) + zitem['images'].append(fileinfo) + if hasImages==True: + tmeta['tile_matrix'].append(zitem) + alignFile(o,position,4096) + with io.open(output+'.json', 'w', encoding='utf-8') as f: + f.write(json.dumps(tmeta, indent=4)) + + + + +main() \ No newline at end of file diff --git a/maps/bin/calc_tiles.py b/maps/bin/calc_tiles.py new file mode 100644 index 0000000..91f122c --- /dev/null +++ b/maps/bin/calc_tiles.py @@ -0,0 +1,36 @@ +import json +import sys +import os.path +import io +from os import path +from PIL import Image + +def main(): + folder = sys.argv[1] + print('Processing '+folder) + with open(folder+'/metadata.json') as f: + meta = json.load(f) + for zl in meta['tile_matrix']: + xc = zl['origin'][0] + yc = zl['origin'][1] + xp = zl['pixel_size'][0] + yp = zl['pixel_size'][1] + for x in range(zl['matrix_size'][0]): + yc = zl['origin'][1] + for y in range(zl['matrix_size'][1]): + filename = folder+'/'+zl['id']+'/'+str(x)+'/'+str(y)+'.png' + if path.exists(filename): + fileprops = {} + im=Image.open(filename) + fileprops['size'] = im.size + fileprops['bounds'] = [xc,yc,xc+im.size[0]*xp,yc+im.size[1]*yp] + xn = xc + im.size[0]*xp + yc = yc + im.size[1]*yp + with io.open(filename+'.json', 'w', encoding='utf-8') as f: + f.write(json.dumps(fileprops, ensure_ascii=False)) + xc = xn + + + + +main() \ No newline at end of file diff --git a/maps/bin/map_image_tool.py b/maps/bin/map_image_tool.py new file mode 100644 index 0000000..8e175a9 --- /dev/null +++ b/maps/bin/map_image_tool.py @@ -0,0 +1,338 @@ +import argparse +import json +import sys +import os.path +import io +from os import path +import serial +import time +import struct +import ntpath + +show_r = False +PMC_SCREEN_FLASH_START = 1 +PMC_SCREEN_FLASH_START_RESPONSE=2 +PMC_SCREEN_FLASH_END =3 +PMC_SCREEN_FLASH_WRITE =4 +PMC_SCREEN_FLASH_WRITE_COMPRESSED =14 +PMC_SCREEN_FLASH_READ =5 +PMC_SCREEN_FLASH_READ_RESPONSE =6 +PMC_SCREEN_FLASH_META_START =7 +PMC_SCREEN_FLASH_META_DATA =8 +PMC_SCREEN_FLASH_META_END =9 +PMC_SCREEN_FLASH_FILE_START =10 +PMC_SCREEN_FLASH_FILE_DATA =11 +PMC_SCREEN_FLASH_FILE_END =12 + +PMC_SCREEN_FLASH_EXIT =99 +PMC_SCREEN_FLASH_ACK =100 +PMC_SCREEN_FLASH_ERR =101 +SERIAL_APP_1=0x85 +SERIAL_APP_2=0x3B +SERIAL_APP_3=0xDE +SERIAL_APP_4=0x02 + +def csum(dd,extra): + result = extra & 0xFF + for b in dd: + result ^= (b & 0xFF) + return result + +def readPacket(ser,timeout=2): + global show_r + packet = bytearray([]) + readState = 0 + size = 0 + startTime = time.time() + while True: + if ser.inWaiting()>0: + b = ser.read(1)[0] + if(show_r==True): + print(hex(b), end ="", flush=True) + #print(bytearray([b]).decode('ascii'), end ="", flush=True) + if readState==0: + if b==SERIAL_APP_1: + readState = 1 + elif readState==1: + if b==SERIAL_APP_2: + readState = 2 + else: + readState = 0 + elif readState==2: + if b==SERIAL_APP_3: + readState = 3 + else: + readState = 0 + elif readState==3: + if b==SERIAL_APP_4: + readState = 4 + else: + readState = 0 + elif readState==4: + size = b + readState = 5 + elif readState==5: + size = size + (b<<8) + if size<8192: + readState = 6 + else: + readState = 0 + elif readState==6: + if len(packet)<(size-1): + packet.extend([b]) + else: + cs = csum(packet,0) + if b==cs: + return packet + else: + print('BAD CS '+hex(cs)+' '+hex(b)+' '+packet.hex()) + return bytearray([]) + else: + time.sleep(0.001) + if(time.time()-startTime)>=timeout: + print('Timeout') + #show_r = True + return bytearray([]) + + return bytearray([]) + +def createSerialPacket(cmd,dd): + result = bytearray([SERIAL_APP_1,SERIAL_APP_2,SERIAL_APP_3,SERIAL_APP_4]) + s = len(dd)+2 + result.extend([s & 0xFF,(s>>8) & 0xFF,cmd]) + result.extend(dd) + result.extend([csum(dd,cmd)]) + #print(result.hex()) + return result + + +def writeImage(ser,imagedata,metadata): + print("Writing image...") + ser.write(createSerialPacket(PMC_SCREEN_FLASH_START,bytearray([]))) + packet = readPacket(ser) + if len(packet)>0: + if packet[0]==PMC_SCREEN_FLASH_START_RESPONSE: + s = struct.Struct('> 8) & 0xFF + sector[4] = (address >> 16) & 0xFF + sector[5] = (address >> 24) & 0xFF + while 1: + print("Sector "+str(cnt)+"/"+str(i)+".", end ="", flush=True) + packet = createSerialPacket(PMC_SCREEN_FLASH_WRITE_COMPRESSED,sector) + spackets = [packet[i:i+1512] for i in range(0, len(packet), 1512)] + #spackets = [packet[i:i+32] for i in range(0, len(packet), 32)] + for p in spackets: + ser.write(p) + ser.flush() + time.sleep(0.0001) + packet = readPacket(ser) + if len(packet)>0: + if packet[0]!=PMC_SCREEN_FLASH_ACK: + print("ERR "+hex(packet[1])) + else: + print("OK") + break + time.sleep(0.02) + ser.write(createSerialPacket(PMC_SCREEN_FLASH_END,bytearray([]))) + readPacket(ser) + else: + print("Error") + print("Writing meta...") + ser.write(createSerialPacket(PMC_SCREEN_FLASH_META_START,bytearray([]))) + packet = readPacket(ser) + if len(packet)>0: + if packet[0]==PMC_SCREEN_FLASH_ACK: + + cnt = len(metadata) + i = 0 + while cnt>0: + if cnt>512: + s = 512 + else: + s = cnt + cnt -= s + sector = metadata[i:(i+s)] + while 1: + print("Sector "+str(i)+".", end ="", flush=True) + packet = createSerialPacket(PMC_SCREEN_FLASH_META_DATA,sector) + ser.write(packet) + ser.flush() + packet = readPacket(ser) + if len(packet)>0: + if packet[0]!=PMC_SCREEN_FLASH_ACK: + print("ERR") + else: + print("OK") + break + time.sleep(0.01) + i += s + ser.write(createSerialPacket(PMC_SCREEN_FLASH_META_END,bytearray([]))) + packet = readPacket(ser) + else: + print("Error") + + print("Done.") + return + +def writeFile(ser,imagedata,filename): + print("Writing file...") + ser.write(createSerialPacket(PMC_SCREEN_FLASH_FILE_START,bytearray(filename.encode())+ b'\x00')) + packet = readPacket(ser) + if len(packet)>0: + if packet[0]==PMC_SCREEN_FLASH_ACK: + + cnt = len(imagedata) + i = 0 + while cnt>0: + if cnt>512: + s = 512 + else: + s = cnt + cnt -= s + sector = imagedata[i:(i+s)] + while 1: + print("Sector "+str(i)+".", end ="", flush=True) + packet = createSerialPacket(PMC_SCREEN_FLASH_FILE_DATA,sector) + ser.write(packet) + ser.flush() + packet = readPacket(ser) + if len(packet)>0: + if packet[0]!=PMC_SCREEN_FLASH_ACK: + print("ERR") + else: + print("OK") + break + time.sleep(0.01) + i += s + ser.write(createSerialPacket(PMC_SCREEN_FLASH_FILE_END,bytearray([]))) + packet = readPacket(ser) + else: + print("Error") + + print("Done.") + return + +def readImage(ser,size): + print("Reading image...") + result = bytearray([]) + ser.write(createSerialPacket(PMC_SCREEN_FLASH_START,bytearray([]))) + packet = readPacket(ser) + if len(packet)>0: + if packet[0]==PMC_SCREEN_FLASH_START_RESPONSE: + s = struct.Struct('> 8) & 0xFF + sector[4] = (address >> 16) & 0xFF + sector[5] = (address >> 24) & 0xFF + while 1: + print("Sector "+str(i)+".", end ="", flush=True) + packet = createSerialPacket(PMC_SCREEN_FLASH_READ,sector) + ser.write(packet) + packet = readPacket(ser) + if len(packet)>0: + if packet[0]!=PMC_SCREEN_FLASH_READ_RESPONSE: + print("ERR") + else: + print("OK") + result.extend(packet[1:]) + break + ser.write(createSerialPacket(PMC_SCREEN_FLASH_END,bytearray([]))) + else: + print("Error") + print("Done.") + return result + + +def main(): + parser = argparse.ArgumentParser(description='Airsoft Tracker Maps Image Tool') + parser.add_argument('image', help='Image file name') + parser.add_argument('-c','--comm', required=False, help='COM port') + parser.add_argument('-r','--read',action='store_true', help='Read image') + parser.add_argument('-s','--size',type=int, default=16*1024, help='Read size in KB') + parser.add_argument('-w','--wfile',action='store_true', help='Write file') + args = parser.parse_args() + comm = args.comm + if not comm: + print("Looking for COM port") + import serial.tools.list_ports as list_ports + for each_port in reversed(sorted(list_ports.comports())): + if each_port[1].find("Silicon Labs")>=0: + comm = each_port[0] + print("Comm port found "+comm) + break + + imagefile = args.image + readSize = args.size + ser = serial.Serial(comm,baudrate=115200) + ser.set_buffer_size(rx_size = 8192, tx_size=256) + + print("Connecting", end ="", flush=True) + while True: + if ser.inWaiting()>0: + ser.read(ser.inWaiting()) + print(".", end ="", flush=True) + values = bytearray([0x92,0x5A]) + ser.write(values) + startTime = time.time() + while (time.time()-startTime)<2: + if ser.inWaiting()>0: + b = ser.read(1)[0] + #print(bytearray([b]).decode('ascii'), end ="", flush=True) + if b==0x07: + print("") + print("Connected") + time.sleep(0.01) + values = bytearray([0x07]) + ser.write(values) + ser.baudrate = 921600 + time.sleep(1) + + if args.read==True: + imagedata = readImage(ser,readSize) + with open(imagefile,"wb") as f: + f.write(imagedata) + else: + if args.wfile==True: + with open(imagefile,"rb") as f: + imagedata = f.read() + writeFile(ser,imagedata,ntpath.basename(imagefile)) + else: + with open(imagefile,"rb") as f: + imagedata = f.read() + with open(imagefile+'.dat',"rb") as f: + metadata = f.read() + writeImage(ser,imagedata,metadata) + + ser.write(createSerialPacket(PMC_SCREEN_FLASH_EXIT,bytearray([]))) + return + else: + time.sleep(0.01) + + +main() \ No newline at end of file diff --git a/maps/bin/maps.bin.json b/maps/bin/maps.bin.json new file mode 100644 index 0000000..2468221 --- /dev/null +++ b/maps/bin/maps.bin.json @@ -0,0 +1,2948 @@ +[ + { + "name": "zulu24", + "bounds": [ + -8249415.6496, + 5081574.6994, + -8248315.67159606, + 5080725.31638496 + ], + "tile_matrix": [ + { + "id": "1", + "bounds": [ + -8249415.6496, + 5081574.6994, + -8248315.67159606, + 5080725.31638496 + ], + "images": [ + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249418.4496, + 5081577.4994, + -8248740.8496, + 5080899.8994 + ], + "x": 0, + "y": 0, + "address": 0, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249418.4496, + 5080905.4994, + -8248740.8496, + 5080227.8994 + ], + "x": 0, + "y": 1, + "address": 59648, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248746.4496, + 5081577.4994, + -8248068.8496, + 5080899.8994 + ], + "x": 1, + "y": 0, + "address": 119296, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248746.4496, + 5080905.4994, + -8248068.8496, + 5080227.8994 + ], + "x": 1, + "y": 1, + "address": 178944, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + } + ], + "pixel_size": [ + 2.8, + -2.8 + ], + "tile_size": [ + 672.0, + -672.0 + ] + }, + { + "id": "2", + "bounds": [ + -8249415.6496, + 5081574.6994, + -8248315.67159606, + 5080725.31638496 + ], + "images": [ + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249417.0496000005, + 5081576.099400001, + -8249078.2496, + 5081237.2994 + ], + "x": 0, + "y": 0, + "address": 238592, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249417.0496000005, + 5081240.099400001, + -8249078.2496, + 5080901.2994 + ], + "x": 0, + "y": 1, + "address": 265600, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249417.0496000005, + 5080904.099400001, + -8249078.2496, + 5080565.2994 + ], + "x": 0, + "y": 2, + "address": 292608, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249081.0496000005, + 5081576.099400001, + -8248742.2496, + 5081237.2994 + ], + "x": 1, + "y": 0, + "address": 319616, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249081.0496000005, + 5081240.099400001, + -8248742.2496, + 5080901.2994 + ], + "x": 1, + "y": 1, + "address": 346624, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249081.0496000005, + 5080904.099400001, + -8248742.2496, + 5080565.2994 + ], + "x": 1, + "y": 2, + "address": 373632, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248745.0496000005, + 5081576.099400001, + -8248406.2496, + 5081237.2994 + ], + "x": 2, + "y": 0, + "address": 400640, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248745.0496000005, + 5081240.099400001, + -8248406.2496, + 5080901.2994 + ], + "x": 2, + "y": 1, + "address": 427648, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248745.0496000005, + 5080904.099400001, + -8248406.2496, + 5080565.2994 + ], + "x": 2, + "y": 2, + "address": 454656, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248409.0496000005, + 5081576.099400001, + -8248070.2496, + 5081237.2994 + ], + "x": 3, + "y": 0, + "address": 481664, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248409.0496000005, + 5081240.099400001, + -8248070.2496, + 5080901.2994 + ], + "x": 3, + "y": 1, + "address": 508672, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248409.0496000005, + 5080904.099400001, + -8248070.2496, + 5080565.2994 + ], + "x": 3, + "y": 2, + "address": 535680, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + } + ], + "pixel_size": [ + 1.4, + -1.4 + ], + "tile_size": [ + 336.0, + -336.0 + ] + }, + { + "id": "3", + "bounds": [ + -8249415.6496, + 5081574.6994, + -8248315.67159606, + 5080725.31638496 + ], + "images": [ + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249416.3496, + 5081575.3994, + -8249246.9496, + 5081405.9994 + ], + "x": 0, + "y": 0, + "address": 562688, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249416.3496, + 5081407.3994, + -8249246.9496, + 5081237.9994 + ], + "x": 0, + "y": 1, + "address": 589696, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249416.3496, + 5081239.3994, + -8249246.9496, + 5081069.9994 + ], + "x": 0, + "y": 2, + "address": 616704, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249416.3496, + 5081071.3994, + -8249246.9496, + 5080901.9994 + ], + "x": 0, + "y": 3, + "address": 643712, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249416.3496, + 5080903.3994, + -8249246.9496, + 5080733.9994 + ], + "x": 0, + "y": 4, + "address": 670720, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249416.3496, + 5080735.3994, + -8249246.9496, + 5080565.9994 + ], + "x": 0, + "y": 5, + "address": 697728, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249248.3496, + 5081575.3994, + -8249078.9496, + 5081405.9994 + ], + "x": 1, + "y": 0, + "address": 724736, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249248.3496, + 5081407.3994, + -8249078.9496, + 5081237.9994 + ], + "x": 1, + "y": 1, + "address": 751744, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249248.3496, + 5081239.3994, + -8249078.9496, + 5081069.9994 + ], + "x": 1, + "y": 2, + "address": 778752, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249248.3496, + 5081071.3994, + -8249078.9496, + 5080901.9994 + ], + "x": 1, + "y": 3, + "address": 805760, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249248.3496, + 5080903.3994, + -8249078.9496, + 5080733.9994 + ], + "x": 1, + "y": 4, + "address": 832768, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249248.3496, + 5080735.3994, + -8249078.9496, + 5080565.9994 + ], + "x": 1, + "y": 5, + "address": 859776, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249080.3496, + 5081575.3994, + -8248910.9496, + 5081405.9994 + ], + "x": 2, + "y": 0, + "address": 886784, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249080.3496, + 5081407.3994, + -8248910.9496, + 5081237.9994 + ], + "x": 2, + "y": 1, + "address": 913792, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249080.3496, + 5081239.3994, + -8248910.9496, + 5081069.9994 + ], + "x": 2, + "y": 2, + "address": 940800, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249080.3496, + 5081071.3994, + -8248910.9496, + 5080901.9994 + ], + "x": 2, + "y": 3, + "address": 967808, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249080.3496, + 5080903.3994, + -8248910.9496, + 5080733.9994 + ], + "x": 2, + "y": 4, + "address": 994816, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249080.3496, + 5080735.3994, + -8248910.9496, + 5080565.9994 + ], + "x": 2, + "y": 5, + "address": 1021824, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248912.3496, + 5081575.3994, + -8248742.9496, + 5081405.9994 + ], + "x": 3, + "y": 0, + "address": 1048832, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248912.3496, + 5081407.3994, + -8248742.9496, + 5081237.9994 + ], + "x": 3, + "y": 1, + "address": 1075840, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248912.3496, + 5081239.3994, + -8248742.9496, + 5081069.9994 + ], + "x": 3, + "y": 2, + "address": 1102848, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248912.3496, + 5081071.3994, + -8248742.9496, + 5080901.9994 + ], + "x": 3, + "y": 3, + "address": 1129856, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248912.3496, + 5080903.3994, + -8248742.9496, + 5080733.9994 + ], + "x": 3, + "y": 4, + "address": 1156864, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248912.3496, + 5080735.3994, + -8248742.9496, + 5080565.9994 + ], + "x": 3, + "y": 5, + "address": 1183872, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248744.3496, + 5081575.3994, + -8248574.9496, + 5081405.9994 + ], + "x": 4, + "y": 0, + "address": 1210880, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248744.3496, + 5081407.3994, + -8248574.9496, + 5081237.9994 + ], + "x": 4, + "y": 1, + "address": 1237888, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248744.3496, + 5081239.3994, + -8248574.9496, + 5081069.9994 + ], + "x": 4, + "y": 2, + "address": 1264896, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248744.3496, + 5081071.3994, + -8248574.9496, + 5080901.9994 + ], + "x": 4, + "y": 3, + "address": 1291904, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248744.3496, + 5080903.3994, + -8248574.9496, + 5080733.9994 + ], + "x": 4, + "y": 4, + "address": 1318912, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248744.3496, + 5080735.3994, + -8248574.9496, + 5080565.9994 + ], + "x": 4, + "y": 5, + "address": 1345920, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248576.3496, + 5081575.3994, + -8248406.9496, + 5081405.9994 + ], + "x": 5, + "y": 0, + "address": 1372928, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248576.3496, + 5081407.3994, + -8248406.9496, + 5081237.9994 + ], + "x": 5, + "y": 1, + "address": 1399936, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248576.3496, + 5081239.3994, + -8248406.9496, + 5081069.9994 + ], + "x": 5, + "y": 2, + "address": 1426944, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248576.3496, + 5081071.3994, + -8248406.9496, + 5080901.9994 + ], + "x": 5, + "y": 3, + "address": 1453952, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248576.3496, + 5080903.3994, + -8248406.9496, + 5080733.9994 + ], + "x": 5, + "y": 4, + "address": 1480960, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248576.3496, + 5080735.3994, + -8248406.9496, + 5080565.9994 + ], + "x": 5, + "y": 5, + "address": 1507968, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248408.3496, + 5081575.3994, + -8248238.9496, + 5081405.9994 + ], + "x": 6, + "y": 0, + "address": 1534976, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248408.3496, + 5081407.3994, + -8248238.9496, + 5081237.9994 + ], + "x": 6, + "y": 1, + "address": 1561984, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248408.3496, + 5081239.3994, + -8248238.9496, + 5081069.9994 + ], + "x": 6, + "y": 2, + "address": 1588992, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248408.3496, + 5081071.3994, + -8248238.9496, + 5080901.9994 + ], + "x": 6, + "y": 3, + "address": 1616000, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248408.3496, + 5080903.3994, + -8248238.9496, + 5080733.9994 + ], + "x": 6, + "y": 4, + "address": 1643008, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248408.3496, + 5080735.3994, + -8248238.9496, + 5080565.9994 + ], + "x": 6, + "y": 5, + "address": 1670016, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + } + ], + "pixel_size": [ + 0.7, + -0.7 + ], + "tile_size": [ + 168.0, + -168.0 + ] + } + ], + "base_address": 0 + }, + { + "name": "Picasso", + "bounds": [ + -8340140.7932, + 4828367.8328, + -8339268.82140956, + 4827393.46432224 + ], + "tile_matrix": [ + { + "id": "1", + "bounds": [ + -8340140.7932, + 4828367.8328, + -8339268.82140956, + 4827393.46432224 + ], + "images": [ + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340142.7932, + 4828369.8328, + -8339658.7932, + 4827885.8328 + ], + "x": 0, + "y": 0, + "address": 0, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340142.7932, + 4827889.8328, + -8339658.7932, + 4827405.8328 + ], + "x": 0, + "y": 1, + "address": 59648, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340142.7932, + 4827409.8328, + -8339658.7932, + 4826925.8328 + ], + "x": 0, + "y": 2, + "address": 119296, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339662.7932, + 4828369.8328, + -8339178.7932, + 4827885.8328 + ], + "x": 1, + "y": 0, + "address": 178944, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339662.7932, + 4827889.8328, + -8339178.7932, + 4827405.8328 + ], + "x": 1, + "y": 1, + "address": 238592, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339662.7932, + 4827409.8328, + -8339178.7932, + 4826925.8328 + ], + "x": 1, + "y": 2, + "address": 298240, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + } + ], + "pixel_size": [ + 2.0, + -2.0 + ], + "tile_size": [ + 480.0, + -480.0 + ] + }, + { + "id": "2", + "bounds": [ + -8340140.7932, + 4828367.8328, + -8339268.82140956, + 4827393.46432224 + ], + "images": [ + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.7932, + 4828368.8328, + -8339899.7932, + 4828126.8328 + ], + "x": 0, + "y": 0, + "address": 357888, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.7932, + 4828128.8328, + -8339899.7932, + 4827886.8328 + ], + "x": 0, + "y": 1, + "address": 384896, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.7932, + 4827888.8328, + -8339899.7932, + 4827646.8328 + ], + "x": 0, + "y": 2, + "address": 411904, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.7932, + 4827648.8328, + -8339899.7932, + 4827406.8328 + ], + "x": 0, + "y": 3, + "address": 438912, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.7932, + 4827408.8328, + -8339899.7932, + 4827166.8328 + ], + "x": 0, + "y": 4, + "address": 465920, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.7932, + 4828368.8328, + -8339659.7932, + 4828126.8328 + ], + "x": 1, + "y": 0, + "address": 492928, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.7932, + 4828128.8328, + -8339659.7932, + 4827886.8328 + ], + "x": 1, + "y": 1, + "address": 519936, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.7932, + 4827888.8328, + -8339659.7932, + 4827646.8328 + ], + "x": 1, + "y": 2, + "address": 546944, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.7932, + 4827648.8328, + -8339659.7932, + 4827406.8328 + ], + "x": 1, + "y": 3, + "address": 573952, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.7932, + 4827408.8328, + -8339659.7932, + 4827166.8328 + ], + "x": 1, + "y": 4, + "address": 600960, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.7932, + 4828368.8328, + -8339419.7932, + 4828126.8328 + ], + "x": 2, + "y": 0, + "address": 627968, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.7932, + 4828128.8328, + -8339419.7932, + 4827886.8328 + ], + "x": 2, + "y": 1, + "address": 654976, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.7932, + 4827888.8328, + -8339419.7932, + 4827646.8328 + ], + "x": 2, + "y": 2, + "address": 681984, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.7932, + 4827648.8328, + -8339419.7932, + 4827406.8328 + ], + "x": 2, + "y": 3, + "address": 708992, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.7932, + 4827408.8328, + -8339419.7932, + 4827166.8328 + ], + "x": 2, + "y": 4, + "address": 736000, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.7932, + 4828368.8328, + -8339179.7932, + 4828126.8328 + ], + "x": 3, + "y": 0, + "address": 763008, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.7932, + 4828128.8328, + -8339179.7932, + 4827886.8328 + ], + "x": 3, + "y": 1, + "address": 790016, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.7932, + 4827888.8328, + -8339179.7932, + 4827646.8328 + ], + "x": 3, + "y": 2, + "address": 817024, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.7932, + 4827648.8328, + -8339179.7932, + 4827406.8328 + ], + "x": 3, + "y": 3, + "address": 844032, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.7932, + 4827408.8328, + -8339179.7932, + 4827166.8328 + ], + "x": 3, + "y": 4, + "address": 871040, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + } + ], + "pixel_size": [ + 1.0, + -1.0 + ], + "tile_size": [ + 240.0, + -240.0 + ] + }, + { + "id": "3", + "bounds": [ + -8340140.7932, + 4828367.8328, + -8339268.82140956, + 4827393.46432224 + ], + "images": [ + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4828368.3328, + -8340020.2932, + 4828247.3328 + ], + "x": 0, + "y": 0, + "address": 898048, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4828248.3328, + -8340020.2932, + 4828127.3328 + ], + "x": 0, + "y": 1, + "address": 925056, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4828128.3328, + -8340020.2932, + 4828007.3328 + ], + "x": 0, + "y": 2, + "address": 952064, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4828008.3328, + -8340020.2932, + 4827887.3328 + ], + "x": 0, + "y": 3, + "address": 979072, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4827888.3328, + -8340020.2932, + 4827767.3328 + ], + "x": 0, + "y": 4, + "address": 1006080, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4827768.3328, + -8340020.2932, + 4827647.3328 + ], + "x": 0, + "y": 5, + "address": 1033088, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4827648.3328, + -8340020.2932, + 4827527.3328 + ], + "x": 0, + "y": 6, + "address": 1060096, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4827528.3328, + -8340020.2932, + 4827407.3328 + ], + "x": 0, + "y": 7, + "address": 1087104, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4827408.3328, + -8340020.2932, + 4827287.3328 + ], + "x": 0, + "y": 8, + "address": 1114112, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4828368.3328, + -8339900.2932, + 4828247.3328 + ], + "x": 1, + "y": 0, + "address": 1141120, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4828248.3328, + -8339900.2932, + 4828127.3328 + ], + "x": 1, + "y": 1, + "address": 1168128, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4828128.3328, + -8339900.2932, + 4828007.3328 + ], + "x": 1, + "y": 2, + "address": 1195136, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4828008.3328, + -8339900.2932, + 4827887.3328 + ], + "x": 1, + "y": 3, + "address": 1222144, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4827888.3328, + -8339900.2932, + 4827767.3328 + ], + "x": 1, + "y": 4, + "address": 1249152, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4827768.3328, + -8339900.2932, + 4827647.3328 + ], + "x": 1, + "y": 5, + "address": 1276160, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4827648.3328, + -8339900.2932, + 4827527.3328 + ], + "x": 1, + "y": 6, + "address": 1303168, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4827528.3328, + -8339900.2932, + 4827407.3328 + ], + "x": 1, + "y": 7, + "address": 1330176, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4827408.3328, + -8339900.2932, + 4827287.3328 + ], + "x": 1, + "y": 8, + "address": 1357184, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4828368.3328, + -8339780.2932, + 4828247.3328 + ], + "x": 2, + "y": 0, + "address": 1384192, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4828248.3328, + -8339780.2932, + 4828127.3328 + ], + "x": 2, + "y": 1, + "address": 1411200, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4828128.3328, + -8339780.2932, + 4828007.3328 + ], + "x": 2, + "y": 2, + "address": 1438208, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4828008.3328, + -8339780.2932, + 4827887.3328 + ], + "x": 2, + "y": 3, + "address": 1465216, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4827888.3328, + -8339780.2932, + 4827767.3328 + ], + "x": 2, + "y": 4, + "address": 1492224, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4827768.3328, + -8339780.2932, + 4827647.3328 + ], + "x": 2, + "y": 5, + "address": 1519232, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4827648.3328, + -8339780.2932, + 4827527.3328 + ], + "x": 2, + "y": 6, + "address": 1546240, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4827528.3328, + -8339780.2932, + 4827407.3328 + ], + "x": 2, + "y": 7, + "address": 1573248, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4827408.3328, + -8339780.2932, + 4827287.3328 + ], + "x": 2, + "y": 8, + "address": 1600256, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4828368.3328, + -8339660.2932, + 4828247.3328 + ], + "x": 3, + "y": 0, + "address": 1627264, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4828248.3328, + -8339660.2932, + 4828127.3328 + ], + "x": 3, + "y": 1, + "address": 1654272, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4828128.3328, + -8339660.2932, + 4828007.3328 + ], + "x": 3, + "y": 2, + "address": 1681280, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4828008.3328, + -8339660.2932, + 4827887.3328 + ], + "x": 3, + "y": 3, + "address": 1708288, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4827888.3328, + -8339660.2932, + 4827767.3328 + ], + "x": 3, + "y": 4, + "address": 1735296, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4827768.3328, + -8339660.2932, + 4827647.3328 + ], + "x": 3, + "y": 5, + "address": 1762304, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4827648.3328, + -8339660.2932, + 4827527.3328 + ], + "x": 3, + "y": 6, + "address": 1789312, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4827528.3328, + -8339660.2932, + 4827407.3328 + ], + "x": 3, + "y": 7, + "address": 1816320, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4827408.3328, + -8339660.2932, + 4827287.3328 + ], + "x": 3, + "y": 8, + "address": 1843328, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4828368.3328, + -8339540.2932, + 4828247.3328 + ], + "x": 4, + "y": 0, + "address": 1870336, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4828248.3328, + -8339540.2932, + 4828127.3328 + ], + "x": 4, + "y": 1, + "address": 1897344, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4828128.3328, + -8339540.2932, + 4828007.3328 + ], + "x": 4, + "y": 2, + "address": 1924352, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4828008.3328, + -8339540.2932, + 4827887.3328 + ], + "x": 4, + "y": 3, + "address": 1951360, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4827888.3328, + -8339540.2932, + 4827767.3328 + ], + "x": 4, + "y": 4, + "address": 1978368, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4827768.3328, + -8339540.2932, + 4827647.3328 + ], + "x": 4, + "y": 5, + "address": 2005376, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4827648.3328, + -8339540.2932, + 4827527.3328 + ], + "x": 4, + "y": 6, + "address": 2032384, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4827528.3328, + -8339540.2932, + 4827407.3328 + ], + "x": 4, + "y": 7, + "address": 2059392, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4827408.3328, + -8339540.2932, + 4827287.3328 + ], + "x": 4, + "y": 8, + "address": 2086400, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4828368.3328, + -8339420.2932, + 4828247.3328 + ], + "x": 5, + "y": 0, + "address": 2113408, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4828248.3328, + -8339420.2932, + 4828127.3328 + ], + "x": 5, + "y": 1, + "address": 2140416, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4828128.3328, + -8339420.2932, + 4828007.3328 + ], + "x": 5, + "y": 2, + "address": 2167424, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4828008.3328, + -8339420.2932, + 4827887.3328 + ], + "x": 5, + "y": 3, + "address": 2194432, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4827888.3328, + -8339420.2932, + 4827767.3328 + ], + "x": 5, + "y": 4, + "address": 2221440, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4827768.3328, + -8339420.2932, + 4827647.3328 + ], + "x": 5, + "y": 5, + "address": 2248448, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4827648.3328, + -8339420.2932, + 4827527.3328 + ], + "x": 5, + "y": 6, + "address": 2275456, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4827528.3328, + -8339420.2932, + 4827407.3328 + ], + "x": 5, + "y": 7, + "address": 2302464, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4827408.3328, + -8339420.2932, + 4827287.3328 + ], + "x": 5, + "y": 8, + "address": 2329472, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4828368.3328, + -8339300.2932, + 4828247.3328 + ], + "x": 6, + "y": 0, + "address": 2356480, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4828248.3328, + -8339300.2932, + 4828127.3328 + ], + "x": 6, + "y": 1, + "address": 2383488, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4828128.3328, + -8339300.2932, + 4828007.3328 + ], + "x": 6, + "y": 2, + "address": 2410496, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4828008.3328, + -8339300.2932, + 4827887.3328 + ], + "x": 6, + "y": 3, + "address": 2437504, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4827888.3328, + -8339300.2932, + 4827767.3328 + ], + "x": 6, + "y": 4, + "address": 2464512, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4827768.3328, + -8339300.2932, + 4827647.3328 + ], + "x": 6, + "y": 5, + "address": 2491520, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4827648.3328, + -8339300.2932, + 4827527.3328 + ], + "x": 6, + "y": 6, + "address": 2518528, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4827528.3328, + -8339300.2932, + 4827407.3328 + ], + "x": 6, + "y": 7, + "address": 2545536, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4827408.3328, + -8339300.2932, + 4827287.3328 + ], + "x": 6, + "y": 8, + "address": 2572544, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4828368.3328, + -8339180.2932, + 4828247.3328 + ], + "x": 7, + "y": 0, + "address": 2599552, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4828248.3328, + -8339180.2932, + 4828127.3328 + ], + "x": 7, + "y": 1, + "address": 2626560, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4828128.3328, + -8339180.2932, + 4828007.3328 + ], + "x": 7, + "y": 2, + "address": 2653568, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4828008.3328, + -8339180.2932, + 4827887.3328 + ], + "x": 7, + "y": 3, + "address": 2680576, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4827888.3328, + -8339180.2932, + 4827767.3328 + ], + "x": 7, + "y": 4, + "address": 2707584, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4827768.3328, + -8339180.2932, + 4827647.3328 + ], + "x": 7, + "y": 5, + "address": 2734592, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4827648.3328, + -8339180.2932, + 4827527.3328 + ], + "x": 7, + "y": 6, + "address": 2761600, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4827528.3328, + -8339180.2932, + 4827407.3328 + ], + "x": 7, + "y": 7, + "address": 2788608, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4827408.3328, + -8339180.2932, + 4827287.3328 + ], + "x": 7, + "y": 8, + "address": 2815616, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + } + ], + "pixel_size": [ + 0.5, + -0.5 + ], + "tile_size": [ + 120.0, + -120.0 + ] + } + ], + "base_address": 1699840 + } +] \ No newline at end of file diff --git a/maps/bin/picasso.bin.json b/maps/bin/picasso.bin.json new file mode 100644 index 0000000..e8648b9 --- /dev/null +++ b/maps/bin/picasso.bin.json @@ -0,0 +1,1832 @@ +{ + "name": "Picasso", + "bounds": [ + -8340140.7932, + 4828367.8328, + -8339268.82140956, + 4827393.46432224 + ], + "tile_matrix": [ + { + "id": "1", + "bounds": [ + -8340140.7932, + 4828367.8328, + -8339268.82140956, + 4827393.46432224 + ], + "images": [ + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340142.7932, + 4828369.8328, + -8339658.7932, + 4827885.8328 + ], + "x": 0, + "y": 0, + "address": 0, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340142.7932, + 4827889.8328, + -8339658.7932, + 4827405.8328 + ], + "x": 0, + "y": 1, + "address": 59648, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340142.7932, + 4827409.8328, + -8339658.7932, + 4826925.8328 + ], + "x": 0, + "y": 2, + "address": 119296, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339662.7932, + 4828369.8328, + -8339178.7932, + 4827885.8328 + ], + "x": 1, + "y": 0, + "address": 178944, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339662.7932, + 4827889.8328, + -8339178.7932, + 4827405.8328 + ], + "x": 1, + "y": 1, + "address": 238592, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339662.7932, + 4827409.8328, + -8339178.7932, + 4826925.8328 + ], + "x": 1, + "y": 2, + "address": 298240, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + } + ], + "pixel_size": [ + 2.0, + -2.0 + ], + "tile_size": [ + 480.0, + -480.0 + ] + }, + { + "id": "2", + "bounds": [ + -8340140.7932, + 4828367.8328, + -8339268.82140956, + 4827393.46432224 + ], + "images": [ + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.7932, + 4828368.8328, + -8339899.7932, + 4828126.8328 + ], + "x": 0, + "y": 0, + "address": 357888, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.7932, + 4828128.8328, + -8339899.7932, + 4827886.8328 + ], + "x": 0, + "y": 1, + "address": 384896, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.7932, + 4827888.8328, + -8339899.7932, + 4827646.8328 + ], + "x": 0, + "y": 2, + "address": 411904, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.7932, + 4827648.8328, + -8339899.7932, + 4827406.8328 + ], + "x": 0, + "y": 3, + "address": 438912, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.7932, + 4827408.8328, + -8339899.7932, + 4827166.8328 + ], + "x": 0, + "y": 4, + "address": 465920, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.7932, + 4828368.8328, + -8339659.7932, + 4828126.8328 + ], + "x": 1, + "y": 0, + "address": 492928, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.7932, + 4828128.8328, + -8339659.7932, + 4827886.8328 + ], + "x": 1, + "y": 1, + "address": 519936, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.7932, + 4827888.8328, + -8339659.7932, + 4827646.8328 + ], + "x": 1, + "y": 2, + "address": 546944, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.7932, + 4827648.8328, + -8339659.7932, + 4827406.8328 + ], + "x": 1, + "y": 3, + "address": 573952, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.7932, + 4827408.8328, + -8339659.7932, + 4827166.8328 + ], + "x": 1, + "y": 4, + "address": 600960, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.7932, + 4828368.8328, + -8339419.7932, + 4828126.8328 + ], + "x": 2, + "y": 0, + "address": 627968, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.7932, + 4828128.8328, + -8339419.7932, + 4827886.8328 + ], + "x": 2, + "y": 1, + "address": 654976, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.7932, + 4827888.8328, + -8339419.7932, + 4827646.8328 + ], + "x": 2, + "y": 2, + "address": 681984, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.7932, + 4827648.8328, + -8339419.7932, + 4827406.8328 + ], + "x": 2, + "y": 3, + "address": 708992, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.7932, + 4827408.8328, + -8339419.7932, + 4827166.8328 + ], + "x": 2, + "y": 4, + "address": 736000, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.7932, + 4828368.8328, + -8339179.7932, + 4828126.8328 + ], + "x": 3, + "y": 0, + "address": 763008, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.7932, + 4828128.8328, + -8339179.7932, + 4827886.8328 + ], + "x": 3, + "y": 1, + "address": 790016, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.7932, + 4827888.8328, + -8339179.7932, + 4827646.8328 + ], + "x": 3, + "y": 2, + "address": 817024, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.7932, + 4827648.8328, + -8339179.7932, + 4827406.8328 + ], + "x": 3, + "y": 3, + "address": 844032, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.7932, + 4827408.8328, + -8339179.7932, + 4827166.8328 + ], + "x": 3, + "y": 4, + "address": 871040, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + } + ], + "pixel_size": [ + 1.0, + -1.0 + ], + "tile_size": [ + 240.0, + -240.0 + ] + }, + { + "id": "3", + "bounds": [ + -8340140.7932, + 4828367.8328, + -8339268.82140956, + 4827393.46432224 + ], + "images": [ + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4828368.3328, + -8340020.2932, + 4828247.3328 + ], + "x": 0, + "y": 0, + "address": 898048, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4828248.3328, + -8340020.2932, + 4828127.3328 + ], + "x": 0, + "y": 1, + "address": 925056, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4828128.3328, + -8340020.2932, + 4828007.3328 + ], + "x": 0, + "y": 2, + "address": 952064, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4828008.3328, + -8340020.2932, + 4827887.3328 + ], + "x": 0, + "y": 3, + "address": 979072, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4827888.3328, + -8340020.2932, + 4827767.3328 + ], + "x": 0, + "y": 4, + "address": 1006080, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4827768.3328, + -8340020.2932, + 4827647.3328 + ], + "x": 0, + "y": 5, + "address": 1033088, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4827648.3328, + -8340020.2932, + 4827527.3328 + ], + "x": 0, + "y": 6, + "address": 1060096, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4827528.3328, + -8340020.2932, + 4827407.3328 + ], + "x": 0, + "y": 7, + "address": 1087104, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340141.2932, + 4827408.3328, + -8340020.2932, + 4827287.3328 + ], + "x": 0, + "y": 8, + "address": 1114112, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4828368.3328, + -8339900.2932, + 4828247.3328 + ], + "x": 1, + "y": 0, + "address": 1141120, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4828248.3328, + -8339900.2932, + 4828127.3328 + ], + "x": 1, + "y": 1, + "address": 1168128, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4828128.3328, + -8339900.2932, + 4828007.3328 + ], + "x": 1, + "y": 2, + "address": 1195136, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4828008.3328, + -8339900.2932, + 4827887.3328 + ], + "x": 1, + "y": 3, + "address": 1222144, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4827888.3328, + -8339900.2932, + 4827767.3328 + ], + "x": 1, + "y": 4, + "address": 1249152, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4827768.3328, + -8339900.2932, + 4827647.3328 + ], + "x": 1, + "y": 5, + "address": 1276160, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4827648.3328, + -8339900.2932, + 4827527.3328 + ], + "x": 1, + "y": 6, + "address": 1303168, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4827528.3328, + -8339900.2932, + 4827407.3328 + ], + "x": 1, + "y": 7, + "address": 1330176, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8340021.2932, + 4827408.3328, + -8339900.2932, + 4827287.3328 + ], + "x": 1, + "y": 8, + "address": 1357184, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4828368.3328, + -8339780.2932, + 4828247.3328 + ], + "x": 2, + "y": 0, + "address": 1384192, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4828248.3328, + -8339780.2932, + 4828127.3328 + ], + "x": 2, + "y": 1, + "address": 1411200, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4828128.3328, + -8339780.2932, + 4828007.3328 + ], + "x": 2, + "y": 2, + "address": 1438208, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4828008.3328, + -8339780.2932, + 4827887.3328 + ], + "x": 2, + "y": 3, + "address": 1465216, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4827888.3328, + -8339780.2932, + 4827767.3328 + ], + "x": 2, + "y": 4, + "address": 1492224, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4827768.3328, + -8339780.2932, + 4827647.3328 + ], + "x": 2, + "y": 5, + "address": 1519232, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4827648.3328, + -8339780.2932, + 4827527.3328 + ], + "x": 2, + "y": 6, + "address": 1546240, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4827528.3328, + -8339780.2932, + 4827407.3328 + ], + "x": 2, + "y": 7, + "address": 1573248, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339901.2932, + 4827408.3328, + -8339780.2932, + 4827287.3328 + ], + "x": 2, + "y": 8, + "address": 1600256, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4828368.3328, + -8339660.2932, + 4828247.3328 + ], + "x": 3, + "y": 0, + "address": 1627264, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4828248.3328, + -8339660.2932, + 4828127.3328 + ], + "x": 3, + "y": 1, + "address": 1654272, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4828128.3328, + -8339660.2932, + 4828007.3328 + ], + "x": 3, + "y": 2, + "address": 1681280, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4828008.3328, + -8339660.2932, + 4827887.3328 + ], + "x": 3, + "y": 3, + "address": 1708288, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4827888.3328, + -8339660.2932, + 4827767.3328 + ], + "x": 3, + "y": 4, + "address": 1735296, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4827768.3328, + -8339660.2932, + 4827647.3328 + ], + "x": 3, + "y": 5, + "address": 1762304, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4827648.3328, + -8339660.2932, + 4827527.3328 + ], + "x": 3, + "y": 6, + "address": 1789312, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4827528.3328, + -8339660.2932, + 4827407.3328 + ], + "x": 3, + "y": 7, + "address": 1816320, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339781.2932, + 4827408.3328, + -8339660.2932, + 4827287.3328 + ], + "x": 3, + "y": 8, + "address": 1843328, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4828368.3328, + -8339540.2932, + 4828247.3328 + ], + "x": 4, + "y": 0, + "address": 1870336, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4828248.3328, + -8339540.2932, + 4828127.3328 + ], + "x": 4, + "y": 1, + "address": 1897344, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4828128.3328, + -8339540.2932, + 4828007.3328 + ], + "x": 4, + "y": 2, + "address": 1924352, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4828008.3328, + -8339540.2932, + 4827887.3328 + ], + "x": 4, + "y": 3, + "address": 1951360, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4827888.3328, + -8339540.2932, + 4827767.3328 + ], + "x": 4, + "y": 4, + "address": 1978368, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4827768.3328, + -8339540.2932, + 4827647.3328 + ], + "x": 4, + "y": 5, + "address": 2005376, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4827648.3328, + -8339540.2932, + 4827527.3328 + ], + "x": 4, + "y": 6, + "address": 2032384, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4827528.3328, + -8339540.2932, + 4827407.3328 + ], + "x": 4, + "y": 7, + "address": 2059392, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339661.2932, + 4827408.3328, + -8339540.2932, + 4827287.3328 + ], + "x": 4, + "y": 8, + "address": 2086400, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4828368.3328, + -8339420.2932, + 4828247.3328 + ], + "x": 5, + "y": 0, + "address": 2113408, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4828248.3328, + -8339420.2932, + 4828127.3328 + ], + "x": 5, + "y": 1, + "address": 2140416, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4828128.3328, + -8339420.2932, + 4828007.3328 + ], + "x": 5, + "y": 2, + "address": 2167424, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4828008.3328, + -8339420.2932, + 4827887.3328 + ], + "x": 5, + "y": 3, + "address": 2194432, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4827888.3328, + -8339420.2932, + 4827767.3328 + ], + "x": 5, + "y": 4, + "address": 2221440, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4827768.3328, + -8339420.2932, + 4827647.3328 + ], + "x": 5, + "y": 5, + "address": 2248448, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4827648.3328, + -8339420.2932, + 4827527.3328 + ], + "x": 5, + "y": 6, + "address": 2275456, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4827528.3328, + -8339420.2932, + 4827407.3328 + ], + "x": 5, + "y": 7, + "address": 2302464, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339541.2932, + 4827408.3328, + -8339420.2932, + 4827287.3328 + ], + "x": 5, + "y": 8, + "address": 2329472, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4828368.3328, + -8339300.2932, + 4828247.3328 + ], + "x": 6, + "y": 0, + "address": 2356480, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4828248.3328, + -8339300.2932, + 4828127.3328 + ], + "x": 6, + "y": 1, + "address": 2383488, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4828128.3328, + -8339300.2932, + 4828007.3328 + ], + "x": 6, + "y": 2, + "address": 2410496, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4828008.3328, + -8339300.2932, + 4827887.3328 + ], + "x": 6, + "y": 3, + "address": 2437504, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4827888.3328, + -8339300.2932, + 4827767.3328 + ], + "x": 6, + "y": 4, + "address": 2464512, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4827768.3328, + -8339300.2932, + 4827647.3328 + ], + "x": 6, + "y": 5, + "address": 2491520, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4827648.3328, + -8339300.2932, + 4827527.3328 + ], + "x": 6, + "y": 6, + "address": 2518528, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4827528.3328, + -8339300.2932, + 4827407.3328 + ], + "x": 6, + "y": 7, + "address": 2545536, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339421.2932, + 4827408.3328, + -8339300.2932, + 4827287.3328 + ], + "x": 6, + "y": 8, + "address": 2572544, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4828368.3328, + -8339180.2932, + 4828247.3328 + ], + "x": 7, + "y": 0, + "address": 2599552, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4828248.3328, + -8339180.2932, + 4828127.3328 + ], + "x": 7, + "y": 1, + "address": 2626560, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4828128.3328, + -8339180.2932, + 4828007.3328 + ], + "x": 7, + "y": 2, + "address": 2653568, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4828008.3328, + -8339180.2932, + 4827887.3328 + ], + "x": 7, + "y": 3, + "address": 2680576, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4827888.3328, + -8339180.2932, + 4827767.3328 + ], + "x": 7, + "y": 4, + "address": 2707584, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4827768.3328, + -8339180.2932, + 4827647.3328 + ], + "x": 7, + "y": 5, + "address": 2734592, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4827648.3328, + -8339180.2932, + 4827527.3328 + ], + "x": 7, + "y": 6, + "address": 2761600, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4827528.3328, + -8339180.2932, + 4827407.3328 + ], + "x": 7, + "y": 7, + "address": 2788608, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8339301.2932, + 4827408.3328, + -8339180.2932, + 4827287.3328 + ], + "x": 7, + "y": 8, + "address": 2815616, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + } + ], + "pixel_size": [ + 0.5, + -0.5 + ], + "tile_size": [ + 120.0, + -120.0 + ] + } + ] +} \ No newline at end of file diff --git a/maps/bin/read_image.bat b/maps/bin/read_image.bat new file mode 100644 index 0000000..e252753 --- /dev/null +++ b/maps/bin/read_image.bat @@ -0,0 +1 @@ +C:\Applications\Python37\python map_image_tool.py -c COM22 maps_old.bin -r -s 1024 \ No newline at end of file diff --git a/maps/bin/write_image.bat b/maps/bin/write_image.bat new file mode 100644 index 0000000..c01c242 --- /dev/null +++ b/maps/bin/write_image.bat @@ -0,0 +1 @@ +C:\Applications\Python37\python map_image_tool.py maps.bin \ No newline at end of file diff --git a/maps/bin/write_points.bat b/maps/bin/write_points.bat new file mode 100644 index 0000000..802149c --- /dev/null +++ b/maps/bin/write_points.bat @@ -0,0 +1,2 @@ +C:\Applications\Python37\python map_image_tool.py ../zulu24/p_zulu24.json -w +C:\Applications\Python37\python map_image_tool.py ../picasso/p_picasso.json -w \ No newline at end of file diff --git a/maps/bin/zulu24.bin.json b/maps/bin/zulu24.bin.json new file mode 100644 index 0000000..c0253b2 --- /dev/null +++ b/maps/bin/zulu24.bin.json @@ -0,0 +1,1112 @@ +{ + "name": "zulu24", + "bounds": [ + -8249415.6496, + 5081574.6994, + -8248315.67159606, + 5080725.31638496 + ], + "tile_matrix": [ + { + "id": "1", + "bounds": [ + -8249415.6496, + 5081574.6994, + -8248315.67159606, + 5080725.31638496 + ], + "images": [ + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249418.4496, + 5081577.4994, + -8248740.8496, + 5080899.8994 + ], + "x": 0, + "y": 0, + "address": 0, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249418.4496, + 5080905.4994, + -8248740.8496, + 5080227.8994 + ], + "x": 0, + "y": 1, + "address": 59648, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248746.4496, + 5081577.4994, + -8248068.8496, + 5080899.8994 + ], + "x": 1, + "y": 0, + "address": 119296, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248746.4496, + 5080905.4994, + -8248068.8496, + 5080227.8994 + ], + "x": 1, + "y": 1, + "address": 178944, + "image_stride": 976, + "image_size": 59536, + "image_fmt": 37808 + } + ], + "pixel_size": [ + 2.8, + -2.8 + ], + "tile_size": [ + 672.0, + -672.0 + ] + }, + { + "id": "2", + "bounds": [ + -8249415.6496, + 5081574.6994, + -8248315.67159606, + 5080725.31638496 + ], + "images": [ + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249417.0496000005, + 5081576.099400001, + -8249078.2496, + 5081237.2994 + ], + "x": 0, + "y": 0, + "address": 238592, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249417.0496000005, + 5081240.099400001, + -8249078.2496, + 5080901.2994 + ], + "x": 0, + "y": 1, + "address": 265600, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249417.0496000005, + 5080904.099400001, + -8249078.2496, + 5080565.2994 + ], + "x": 0, + "y": 2, + "address": 292608, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249081.0496000005, + 5081576.099400001, + -8248742.2496, + 5081237.2994 + ], + "x": 1, + "y": 0, + "address": 319616, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249081.0496000005, + 5081240.099400001, + -8248742.2496, + 5080901.2994 + ], + "x": 1, + "y": 1, + "address": 346624, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249081.0496000005, + 5080904.099400001, + -8248742.2496, + 5080565.2994 + ], + "x": 1, + "y": 2, + "address": 373632, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248745.0496000005, + 5081576.099400001, + -8248406.2496, + 5081237.2994 + ], + "x": 2, + "y": 0, + "address": 400640, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248745.0496000005, + 5081240.099400001, + -8248406.2496, + 5080901.2994 + ], + "x": 2, + "y": 1, + "address": 427648, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248745.0496000005, + 5080904.099400001, + -8248406.2496, + 5080565.2994 + ], + "x": 2, + "y": 2, + "address": 454656, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248409.0496000005, + 5081576.099400001, + -8248070.2496, + 5081237.2994 + ], + "x": 3, + "y": 0, + "address": 481664, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248409.0496000005, + 5081240.099400001, + -8248070.2496, + 5080901.2994 + ], + "x": 3, + "y": 1, + "address": 508672, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248409.0496000005, + 5080904.099400001, + -8248070.2496, + 5080565.2994 + ], + "x": 3, + "y": 2, + "address": 535680, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + } + ], + "pixel_size": [ + 1.4, + -1.4 + ], + "tile_size": [ + 336.0, + -336.0 + ] + }, + { + "id": "3", + "bounds": [ + -8249415.6496, + 5081574.6994, + -8248315.67159606, + 5080725.31638496 + ], + "images": [ + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249416.3496, + 5081575.3994, + -8249246.9496, + 5081405.9994 + ], + "x": 0, + "y": 0, + "address": 562688, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249416.3496, + 5081407.3994, + -8249246.9496, + 5081237.9994 + ], + "x": 0, + "y": 1, + "address": 589696, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249416.3496, + 5081239.3994, + -8249246.9496, + 5081069.9994 + ], + "x": 0, + "y": 2, + "address": 616704, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249416.3496, + 5081071.3994, + -8249246.9496, + 5080901.9994 + ], + "x": 0, + "y": 3, + "address": 643712, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249416.3496, + 5080903.3994, + -8249246.9496, + 5080733.9994 + ], + "x": 0, + "y": 4, + "address": 670720, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249416.3496, + 5080735.3994, + -8249246.9496, + 5080565.9994 + ], + "x": 0, + "y": 5, + "address": 697728, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249248.3496, + 5081575.3994, + -8249078.9496, + 5081405.9994 + ], + "x": 1, + "y": 0, + "address": 724736, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249248.3496, + 5081407.3994, + -8249078.9496, + 5081237.9994 + ], + "x": 1, + "y": 1, + "address": 751744, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249248.3496, + 5081239.3994, + -8249078.9496, + 5081069.9994 + ], + "x": 1, + "y": 2, + "address": 778752, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249248.3496, + 5081071.3994, + -8249078.9496, + 5080901.9994 + ], + "x": 1, + "y": 3, + "address": 805760, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249248.3496, + 5080903.3994, + -8249078.9496, + 5080733.9994 + ], + "x": 1, + "y": 4, + "address": 832768, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249248.3496, + 5080735.3994, + -8249078.9496, + 5080565.9994 + ], + "x": 1, + "y": 5, + "address": 859776, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249080.3496, + 5081575.3994, + -8248910.9496, + 5081405.9994 + ], + "x": 2, + "y": 0, + "address": 886784, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249080.3496, + 5081407.3994, + -8248910.9496, + 5081237.9994 + ], + "x": 2, + "y": 1, + "address": 913792, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249080.3496, + 5081239.3994, + -8248910.9496, + 5081069.9994 + ], + "x": 2, + "y": 2, + "address": 940800, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249080.3496, + 5081071.3994, + -8248910.9496, + 5080901.9994 + ], + "x": 2, + "y": 3, + "address": 967808, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249080.3496, + 5080903.3994, + -8248910.9496, + 5080733.9994 + ], + "x": 2, + "y": 4, + "address": 994816, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8249080.3496, + 5080735.3994, + -8248910.9496, + 5080565.9994 + ], + "x": 2, + "y": 5, + "address": 1021824, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248912.3496, + 5081575.3994, + -8248742.9496, + 5081405.9994 + ], + "x": 3, + "y": 0, + "address": 1048832, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248912.3496, + 5081407.3994, + -8248742.9496, + 5081237.9994 + ], + "x": 3, + "y": 1, + "address": 1075840, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248912.3496, + 5081239.3994, + -8248742.9496, + 5081069.9994 + ], + "x": 3, + "y": 2, + "address": 1102848, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248912.3496, + 5081071.3994, + -8248742.9496, + 5080901.9994 + ], + "x": 3, + "y": 3, + "address": 1129856, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248912.3496, + 5080903.3994, + -8248742.9496, + 5080733.9994 + ], + "x": 3, + "y": 4, + "address": 1156864, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248912.3496, + 5080735.3994, + -8248742.9496, + 5080565.9994 + ], + "x": 3, + "y": 5, + "address": 1183872, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248744.3496, + 5081575.3994, + -8248574.9496, + 5081405.9994 + ], + "x": 4, + "y": 0, + "address": 1210880, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248744.3496, + 5081407.3994, + -8248574.9496, + 5081237.9994 + ], + "x": 4, + "y": 1, + "address": 1237888, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248744.3496, + 5081239.3994, + -8248574.9496, + 5081069.9994 + ], + "x": 4, + "y": 2, + "address": 1264896, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248744.3496, + 5081071.3994, + -8248574.9496, + 5080901.9994 + ], + "x": 4, + "y": 3, + "address": 1291904, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248744.3496, + 5080903.3994, + -8248574.9496, + 5080733.9994 + ], + "x": 4, + "y": 4, + "address": 1318912, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248744.3496, + 5080735.3994, + -8248574.9496, + 5080565.9994 + ], + "x": 4, + "y": 5, + "address": 1345920, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248576.3496, + 5081575.3994, + -8248406.9496, + 5081405.9994 + ], + "x": 5, + "y": 0, + "address": 1372928, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248576.3496, + 5081407.3994, + -8248406.9496, + 5081237.9994 + ], + "x": 5, + "y": 1, + "address": 1399936, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248576.3496, + 5081239.3994, + -8248406.9496, + 5081069.9994 + ], + "x": 5, + "y": 2, + "address": 1426944, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248576.3496, + 5081071.3994, + -8248406.9496, + 5080901.9994 + ], + "x": 5, + "y": 3, + "address": 1453952, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248576.3496, + 5080903.3994, + -8248406.9496, + 5080733.9994 + ], + "x": 5, + "y": 4, + "address": 1480960, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248576.3496, + 5080735.3994, + -8248406.9496, + 5080565.9994 + ], + "x": 5, + "y": 5, + "address": 1507968, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248408.3496, + 5081575.3994, + -8248238.9496, + 5081405.9994 + ], + "x": 6, + "y": 0, + "address": 1534976, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248408.3496, + 5081407.3994, + -8248238.9496, + 5081237.9994 + ], + "x": 6, + "y": 1, + "address": 1561984, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248408.3496, + 5081239.3994, + -8248238.9496, + 5081069.9994 + ], + "x": 6, + "y": 2, + "address": 1588992, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248408.3496, + 5081071.3994, + -8248238.9496, + 5080901.9994 + ], + "x": 6, + "y": 3, + "address": 1616000, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248408.3496, + 5080903.3994, + -8248238.9496, + 5080733.9994 + ], + "x": 6, + "y": 4, + "address": 1643008, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + }, + { + "size": [ + 242, + 242 + ], + "bounds": [ + -8248408.3496, + 5080735.3994, + -8248238.9496, + 5080565.9994 + ], + "x": 6, + "y": 5, + "address": 1670016, + "image_stride": 656, + "image_size": 26896, + "image_fmt": 37812 + } + ], + "pixel_size": [ + 0.7, + -0.7 + ], + "tile_size": [ + 168.0, + -168.0 + ] + } + ] +} \ No newline at end of file diff --git a/maps/picasso/p_picasso.json b/maps/picasso/p_picasso.json new file mode 100644 index 0000000..a6ec55b --- /dev/null +++ b/maps/picasso/p_picasso.json @@ -0,0 +1,13 @@ +{ +"points": [ +{ "type": 0, "color": 16776960, "name": "Office", "coordinates": [ -74.91830945685942,39.73604280105904 ] }, +{ "type": 0, "color": 16776960, "name": "Beach", "coordinates": [ -74.91917130906181,39.73630893810271 ] }, +{ "type": 0, "color": 16776960, "name": "Kill Box", "coordinates": [ -74.91902077980406,39.7355752412219 ] }, +{ "type": 0, "color": 16776960, "name": "Zero", "coordinates": [ -74.9189932630288,39.73718782439224 ] }, +{ "type": 0, "color": 16776960, "name": "Ridge", "coordinates": [ -74.91831533834912,39.73829361377636 ] }, +{ "type": 0, "color": 16776960, "name": "Calypso", "coordinates": [ -74.91990159096781,39.73872089766842 ] }, +{ "type": 0, "color": 16776960, "name": "Maze", "coordinates": [ -74.91634869800787,39.73697446559213 ] }, +{ "type": 0, "color": 16776960, "name": "Congo", "coordinates": [ -74.91602222829101,39.73763561652714 ] }, +{ "type": 0, "color": 16776960, "name": "Trenches", "coordinates": [ -74.91581248157634,39.73862186136292 ] } +] +} \ No newline at end of file diff --git a/maps/picasso/picasso.tif b/maps/picasso/picasso.tif new file mode 100644 index 0000000..aafe1b7 Binary files /dev/null and b/maps/picasso/picasso.tif differ diff --git a/maps/picasso/picasso.tif.aux.xml b/maps/picasso/picasso.tif.aux.xml new file mode 100644 index 0000000..15f21f0 --- /dev/null +++ b/maps/picasso/picasso.tif.aux.xml @@ -0,0 +1,32 @@ + + + + YES + 255 + 37.088994056078 + 0 + 23.597758036199 + 100 + + + + + YES + 255 + 38.660669983202 + 0 + 22.602363004851 + 100 + + + + + YES + 255 + 28.796404574234 + 0 + 19.640798405489 + 100 + + + diff --git a/maps/picasso/tiles/1/0/0.png b/maps/picasso/tiles/1/0/0.png new file mode 100644 index 0000000..d6fc0be Binary files /dev/null and b/maps/picasso/tiles/1/0/0.png differ diff --git a/maps/picasso/tiles/1/0/0.png.bin b/maps/picasso/tiles/1/0/0.png.bin new file mode 100644 index 0000000..5a4b355 Binary files /dev/null and b/maps/picasso/tiles/1/0/0.png.bin differ diff --git a/maps/picasso/tiles/1/0/1.png b/maps/picasso/tiles/1/0/1.png new file mode 100644 index 0000000..19ecf59 Binary files /dev/null and b/maps/picasso/tiles/1/0/1.png differ diff --git a/maps/picasso/tiles/1/0/1.png.bin b/maps/picasso/tiles/1/0/1.png.bin new file mode 100644 index 0000000..842bfda Binary files /dev/null and b/maps/picasso/tiles/1/0/1.png.bin differ diff --git a/maps/picasso/tiles/1/0/2.png b/maps/picasso/tiles/1/0/2.png new file mode 100644 index 0000000..09c3070 Binary files /dev/null and b/maps/picasso/tiles/1/0/2.png differ diff --git a/maps/picasso/tiles/1/0/2.png.bin b/maps/picasso/tiles/1/0/2.png.bin new file mode 100644 index 0000000..0f8f55b Binary files /dev/null and b/maps/picasso/tiles/1/0/2.png.bin differ diff --git a/maps/picasso/tiles/1/1/0.png b/maps/picasso/tiles/1/1/0.png new file mode 100644 index 0000000..e5c6edf Binary files /dev/null and b/maps/picasso/tiles/1/1/0.png differ diff --git a/maps/picasso/tiles/1/1/0.png.bin b/maps/picasso/tiles/1/1/0.png.bin new file mode 100644 index 0000000..8a1f141 Binary files /dev/null and b/maps/picasso/tiles/1/1/0.png.bin differ diff --git a/maps/picasso/tiles/1/1/1.png b/maps/picasso/tiles/1/1/1.png new file mode 100644 index 0000000..b03eac9 Binary files /dev/null and b/maps/picasso/tiles/1/1/1.png differ diff --git a/maps/picasso/tiles/1/1/1.png.bin b/maps/picasso/tiles/1/1/1.png.bin new file mode 100644 index 0000000..9169fca Binary files /dev/null and b/maps/picasso/tiles/1/1/1.png.bin differ diff --git a/maps/picasso/tiles/1/1/2.png b/maps/picasso/tiles/1/1/2.png new file mode 100644 index 0000000..a55d592 Binary files /dev/null and b/maps/picasso/tiles/1/1/2.png differ diff --git a/maps/picasso/tiles/1/1/2.png.bin b/maps/picasso/tiles/1/1/2.png.bin new file mode 100644 index 0000000..d0ec3a2 Binary files /dev/null and b/maps/picasso/tiles/1/1/2.png.bin differ diff --git a/maps/picasso/tiles/2/0/0.png b/maps/picasso/tiles/2/0/0.png new file mode 100644 index 0000000..c65a8b6 Binary files /dev/null and b/maps/picasso/tiles/2/0/0.png differ diff --git a/maps/picasso/tiles/2/0/0.png.bin b/maps/picasso/tiles/2/0/0.png.bin new file mode 100644 index 0000000..ca98a1a Binary files /dev/null and b/maps/picasso/tiles/2/0/0.png.bin differ diff --git a/maps/picasso/tiles/2/0/1.png b/maps/picasso/tiles/2/0/1.png new file mode 100644 index 0000000..330937e Binary files /dev/null and b/maps/picasso/tiles/2/0/1.png differ diff --git a/maps/picasso/tiles/2/0/1.png.bin b/maps/picasso/tiles/2/0/1.png.bin new file mode 100644 index 0000000..edfeebf Binary files /dev/null and b/maps/picasso/tiles/2/0/1.png.bin differ diff --git a/maps/picasso/tiles/2/0/2.png b/maps/picasso/tiles/2/0/2.png new file mode 100644 index 0000000..ea2f74f Binary files /dev/null and b/maps/picasso/tiles/2/0/2.png differ diff --git a/maps/picasso/tiles/2/0/2.png.bin b/maps/picasso/tiles/2/0/2.png.bin new file mode 100644 index 0000000..d20fcb1 Binary files /dev/null and b/maps/picasso/tiles/2/0/2.png.bin differ diff --git a/maps/picasso/tiles/2/0/3.png b/maps/picasso/tiles/2/0/3.png new file mode 100644 index 0000000..f8b6150 Binary files /dev/null and b/maps/picasso/tiles/2/0/3.png differ diff --git a/maps/picasso/tiles/2/0/3.png.bin b/maps/picasso/tiles/2/0/3.png.bin new file mode 100644 index 0000000..6797d11 Binary files /dev/null and b/maps/picasso/tiles/2/0/3.png.bin differ diff --git a/maps/picasso/tiles/2/0/4.png b/maps/picasso/tiles/2/0/4.png new file mode 100644 index 0000000..ec96c3f Binary files /dev/null and b/maps/picasso/tiles/2/0/4.png differ diff --git a/maps/picasso/tiles/2/0/4.png.bin b/maps/picasso/tiles/2/0/4.png.bin new file mode 100644 index 0000000..dfe218c Binary files /dev/null and b/maps/picasso/tiles/2/0/4.png.bin differ diff --git a/maps/picasso/tiles/2/1/0.png b/maps/picasso/tiles/2/1/0.png new file mode 100644 index 0000000..c460349 Binary files /dev/null and b/maps/picasso/tiles/2/1/0.png differ diff --git a/maps/picasso/tiles/2/1/0.png.bin b/maps/picasso/tiles/2/1/0.png.bin new file mode 100644 index 0000000..042e244 Binary files /dev/null and b/maps/picasso/tiles/2/1/0.png.bin differ diff --git a/maps/picasso/tiles/2/1/1.png b/maps/picasso/tiles/2/1/1.png new file mode 100644 index 0000000..6b8fbe8 Binary files /dev/null and b/maps/picasso/tiles/2/1/1.png differ diff --git a/maps/picasso/tiles/2/1/1.png.bin b/maps/picasso/tiles/2/1/1.png.bin new file mode 100644 index 0000000..8459f6b Binary files /dev/null and b/maps/picasso/tiles/2/1/1.png.bin differ diff --git a/maps/picasso/tiles/2/1/2.png b/maps/picasso/tiles/2/1/2.png new file mode 100644 index 0000000..828493d Binary files /dev/null and b/maps/picasso/tiles/2/1/2.png differ diff --git a/maps/picasso/tiles/2/1/2.png.bin b/maps/picasso/tiles/2/1/2.png.bin new file mode 100644 index 0000000..0524c10 Binary files /dev/null and b/maps/picasso/tiles/2/1/2.png.bin differ diff --git a/maps/picasso/tiles/2/1/3.png b/maps/picasso/tiles/2/1/3.png new file mode 100644 index 0000000..3992919 Binary files /dev/null and b/maps/picasso/tiles/2/1/3.png differ diff --git a/maps/picasso/tiles/2/1/3.png.bin b/maps/picasso/tiles/2/1/3.png.bin new file mode 100644 index 0000000..d61f8f3 Binary files /dev/null and b/maps/picasso/tiles/2/1/3.png.bin differ diff --git a/maps/picasso/tiles/2/1/4.png b/maps/picasso/tiles/2/1/4.png new file mode 100644 index 0000000..339b1ff Binary files /dev/null and b/maps/picasso/tiles/2/1/4.png differ diff --git a/maps/picasso/tiles/2/1/4.png.bin b/maps/picasso/tiles/2/1/4.png.bin new file mode 100644 index 0000000..9a8f3aa Binary files /dev/null and b/maps/picasso/tiles/2/1/4.png.bin differ diff --git a/maps/picasso/tiles/2/2/0.png b/maps/picasso/tiles/2/2/0.png new file mode 100644 index 0000000..8686a71 Binary files /dev/null and b/maps/picasso/tiles/2/2/0.png differ diff --git a/maps/picasso/tiles/2/2/0.png.bin b/maps/picasso/tiles/2/2/0.png.bin new file mode 100644 index 0000000..b852bb7 Binary files /dev/null and b/maps/picasso/tiles/2/2/0.png.bin differ diff --git a/maps/picasso/tiles/2/2/1.png b/maps/picasso/tiles/2/2/1.png new file mode 100644 index 0000000..363110c Binary files /dev/null and b/maps/picasso/tiles/2/2/1.png differ diff --git a/maps/picasso/tiles/2/2/1.png.bin b/maps/picasso/tiles/2/2/1.png.bin new file mode 100644 index 0000000..fa637b1 Binary files /dev/null and b/maps/picasso/tiles/2/2/1.png.bin differ diff --git a/maps/picasso/tiles/2/2/2.png b/maps/picasso/tiles/2/2/2.png new file mode 100644 index 0000000..7dc1563 Binary files /dev/null and b/maps/picasso/tiles/2/2/2.png differ diff --git a/maps/picasso/tiles/2/2/2.png.bin b/maps/picasso/tiles/2/2/2.png.bin new file mode 100644 index 0000000..b0adbae Binary files /dev/null and b/maps/picasso/tiles/2/2/2.png.bin differ diff --git a/maps/picasso/tiles/2/2/3.png b/maps/picasso/tiles/2/2/3.png new file mode 100644 index 0000000..6e2b459 Binary files /dev/null and b/maps/picasso/tiles/2/2/3.png differ diff --git a/maps/picasso/tiles/2/2/3.png.bin b/maps/picasso/tiles/2/2/3.png.bin new file mode 100644 index 0000000..e7c3960 Binary files /dev/null and b/maps/picasso/tiles/2/2/3.png.bin differ diff --git a/maps/picasso/tiles/2/2/4.png b/maps/picasso/tiles/2/2/4.png new file mode 100644 index 0000000..d4857e2 Binary files /dev/null and b/maps/picasso/tiles/2/2/4.png differ diff --git a/maps/picasso/tiles/2/2/4.png.bin b/maps/picasso/tiles/2/2/4.png.bin new file mode 100644 index 0000000..00bdb6b Binary files /dev/null and b/maps/picasso/tiles/2/2/4.png.bin differ diff --git a/maps/picasso/tiles/2/3/0.png b/maps/picasso/tiles/2/3/0.png new file mode 100644 index 0000000..b9210bf Binary files /dev/null and b/maps/picasso/tiles/2/3/0.png differ diff --git a/maps/picasso/tiles/2/3/0.png.bin b/maps/picasso/tiles/2/3/0.png.bin new file mode 100644 index 0000000..0c55a3a Binary files /dev/null and b/maps/picasso/tiles/2/3/0.png.bin differ diff --git a/maps/picasso/tiles/2/3/1.png b/maps/picasso/tiles/2/3/1.png new file mode 100644 index 0000000..6ee95da Binary files /dev/null and b/maps/picasso/tiles/2/3/1.png differ diff --git a/maps/picasso/tiles/2/3/1.png.bin b/maps/picasso/tiles/2/3/1.png.bin new file mode 100644 index 0000000..203291b Binary files /dev/null and b/maps/picasso/tiles/2/3/1.png.bin differ diff --git a/maps/picasso/tiles/2/3/2.png b/maps/picasso/tiles/2/3/2.png new file mode 100644 index 0000000..24adfc6 Binary files /dev/null and b/maps/picasso/tiles/2/3/2.png differ diff --git a/maps/picasso/tiles/2/3/2.png.bin b/maps/picasso/tiles/2/3/2.png.bin new file mode 100644 index 0000000..817023f Binary files /dev/null and b/maps/picasso/tiles/2/3/2.png.bin differ diff --git a/maps/picasso/tiles/2/3/3.png b/maps/picasso/tiles/2/3/3.png new file mode 100644 index 0000000..b389f68 Binary files /dev/null and b/maps/picasso/tiles/2/3/3.png differ diff --git a/maps/picasso/tiles/2/3/3.png.bin b/maps/picasso/tiles/2/3/3.png.bin new file mode 100644 index 0000000..f8f230e Binary files /dev/null and b/maps/picasso/tiles/2/3/3.png.bin differ diff --git a/maps/picasso/tiles/2/3/4.png b/maps/picasso/tiles/2/3/4.png new file mode 100644 index 0000000..cd78a78 Binary files /dev/null and b/maps/picasso/tiles/2/3/4.png differ diff --git a/maps/picasso/tiles/2/3/4.png.bin b/maps/picasso/tiles/2/3/4.png.bin new file mode 100644 index 0000000..a009615 Binary files /dev/null and b/maps/picasso/tiles/2/3/4.png.bin differ diff --git a/maps/picasso/tiles/3/0/0.png b/maps/picasso/tiles/3/0/0.png new file mode 100644 index 0000000..be5c1fd Binary files /dev/null and b/maps/picasso/tiles/3/0/0.png differ diff --git a/maps/picasso/tiles/3/0/0.png.bin b/maps/picasso/tiles/3/0/0.png.bin new file mode 100644 index 0000000..8ae162f Binary files /dev/null and b/maps/picasso/tiles/3/0/0.png.bin differ diff --git a/maps/picasso/tiles/3/0/1.png b/maps/picasso/tiles/3/0/1.png new file mode 100644 index 0000000..c9b57bb Binary files /dev/null and b/maps/picasso/tiles/3/0/1.png differ diff --git a/maps/picasso/tiles/3/0/1.png.bin b/maps/picasso/tiles/3/0/1.png.bin new file mode 100644 index 0000000..d1e676d Binary files /dev/null and b/maps/picasso/tiles/3/0/1.png.bin differ diff --git a/maps/picasso/tiles/3/0/2.png b/maps/picasso/tiles/3/0/2.png new file mode 100644 index 0000000..fcdc4e8 Binary files /dev/null and b/maps/picasso/tiles/3/0/2.png differ diff --git a/maps/picasso/tiles/3/0/2.png.bin b/maps/picasso/tiles/3/0/2.png.bin new file mode 100644 index 0000000..3cb43a8 Binary files /dev/null and b/maps/picasso/tiles/3/0/2.png.bin differ diff --git a/maps/picasso/tiles/3/0/3.png b/maps/picasso/tiles/3/0/3.png new file mode 100644 index 0000000..4dc1027 Binary files /dev/null and b/maps/picasso/tiles/3/0/3.png differ diff --git a/maps/picasso/tiles/3/0/3.png.bin b/maps/picasso/tiles/3/0/3.png.bin new file mode 100644 index 0000000..8c9c522 Binary files /dev/null and b/maps/picasso/tiles/3/0/3.png.bin differ diff --git a/maps/picasso/tiles/3/0/4.png b/maps/picasso/tiles/3/0/4.png new file mode 100644 index 0000000..b614e13 Binary files /dev/null and b/maps/picasso/tiles/3/0/4.png differ diff --git a/maps/picasso/tiles/3/0/4.png.bin b/maps/picasso/tiles/3/0/4.png.bin new file mode 100644 index 0000000..b63ac2f Binary files /dev/null and b/maps/picasso/tiles/3/0/4.png.bin differ diff --git a/maps/picasso/tiles/3/0/5.png b/maps/picasso/tiles/3/0/5.png new file mode 100644 index 0000000..037b356 Binary files /dev/null and b/maps/picasso/tiles/3/0/5.png differ diff --git a/maps/picasso/tiles/3/0/5.png.bin b/maps/picasso/tiles/3/0/5.png.bin new file mode 100644 index 0000000..0b6fb74 Binary files /dev/null and b/maps/picasso/tiles/3/0/5.png.bin differ diff --git a/maps/picasso/tiles/3/0/6.png b/maps/picasso/tiles/3/0/6.png new file mode 100644 index 0000000..8cb065d Binary files /dev/null and b/maps/picasso/tiles/3/0/6.png differ diff --git a/maps/picasso/tiles/3/0/6.png.bin b/maps/picasso/tiles/3/0/6.png.bin new file mode 100644 index 0000000..4b4e314 Binary files /dev/null and b/maps/picasso/tiles/3/0/6.png.bin differ diff --git a/maps/picasso/tiles/3/0/7.png b/maps/picasso/tiles/3/0/7.png new file mode 100644 index 0000000..0bbe240 Binary files /dev/null and b/maps/picasso/tiles/3/0/7.png differ diff --git a/maps/picasso/tiles/3/0/7.png.bin b/maps/picasso/tiles/3/0/7.png.bin new file mode 100644 index 0000000..aa9bdb6 Binary files /dev/null and b/maps/picasso/tiles/3/0/7.png.bin differ diff --git a/maps/picasso/tiles/3/0/8.png b/maps/picasso/tiles/3/0/8.png new file mode 100644 index 0000000..2cc0ff8 Binary files /dev/null and b/maps/picasso/tiles/3/0/8.png differ diff --git a/maps/picasso/tiles/3/0/8.png.bin b/maps/picasso/tiles/3/0/8.png.bin new file mode 100644 index 0000000..b1921bb Binary files /dev/null and b/maps/picasso/tiles/3/0/8.png.bin differ diff --git a/maps/picasso/tiles/3/1/0.png b/maps/picasso/tiles/3/1/0.png new file mode 100644 index 0000000..2b3afb1 Binary files /dev/null and b/maps/picasso/tiles/3/1/0.png differ diff --git a/maps/picasso/tiles/3/1/0.png.bin b/maps/picasso/tiles/3/1/0.png.bin new file mode 100644 index 0000000..130acbc Binary files /dev/null and b/maps/picasso/tiles/3/1/0.png.bin differ diff --git a/maps/picasso/tiles/3/1/1.png b/maps/picasso/tiles/3/1/1.png new file mode 100644 index 0000000..94ec533 Binary files /dev/null and b/maps/picasso/tiles/3/1/1.png differ diff --git a/maps/picasso/tiles/3/1/1.png.bin b/maps/picasso/tiles/3/1/1.png.bin new file mode 100644 index 0000000..1b51294 Binary files /dev/null and b/maps/picasso/tiles/3/1/1.png.bin differ diff --git a/maps/picasso/tiles/3/1/2.png b/maps/picasso/tiles/3/1/2.png new file mode 100644 index 0000000..caafbd7 Binary files /dev/null and b/maps/picasso/tiles/3/1/2.png differ diff --git a/maps/picasso/tiles/3/1/2.png.bin b/maps/picasso/tiles/3/1/2.png.bin new file mode 100644 index 0000000..6d85c76 Binary files /dev/null and b/maps/picasso/tiles/3/1/2.png.bin differ diff --git a/maps/picasso/tiles/3/1/3.png b/maps/picasso/tiles/3/1/3.png new file mode 100644 index 0000000..e0a4b82 Binary files /dev/null and b/maps/picasso/tiles/3/1/3.png differ diff --git a/maps/picasso/tiles/3/1/3.png.bin b/maps/picasso/tiles/3/1/3.png.bin new file mode 100644 index 0000000..627d7dd Binary files /dev/null and b/maps/picasso/tiles/3/1/3.png.bin differ diff --git a/maps/picasso/tiles/3/1/4.png b/maps/picasso/tiles/3/1/4.png new file mode 100644 index 0000000..6472c7b Binary files /dev/null and b/maps/picasso/tiles/3/1/4.png differ diff --git a/maps/picasso/tiles/3/1/4.png.bin b/maps/picasso/tiles/3/1/4.png.bin new file mode 100644 index 0000000..665d54f Binary files /dev/null and b/maps/picasso/tiles/3/1/4.png.bin differ diff --git a/maps/picasso/tiles/3/1/5.png b/maps/picasso/tiles/3/1/5.png new file mode 100644 index 0000000..847ba75 Binary files /dev/null and b/maps/picasso/tiles/3/1/5.png differ diff --git a/maps/picasso/tiles/3/1/5.png.bin b/maps/picasso/tiles/3/1/5.png.bin new file mode 100644 index 0000000..e02fdba Binary files /dev/null and b/maps/picasso/tiles/3/1/5.png.bin differ diff --git a/maps/picasso/tiles/3/1/6.png b/maps/picasso/tiles/3/1/6.png new file mode 100644 index 0000000..f92ff40 Binary files /dev/null and b/maps/picasso/tiles/3/1/6.png differ diff --git a/maps/picasso/tiles/3/1/6.png.bin b/maps/picasso/tiles/3/1/6.png.bin new file mode 100644 index 0000000..3b1e312 Binary files /dev/null and b/maps/picasso/tiles/3/1/6.png.bin differ diff --git a/maps/picasso/tiles/3/1/7.png b/maps/picasso/tiles/3/1/7.png new file mode 100644 index 0000000..bfc97c2 Binary files /dev/null and b/maps/picasso/tiles/3/1/7.png differ diff --git a/maps/picasso/tiles/3/1/7.png.bin b/maps/picasso/tiles/3/1/7.png.bin new file mode 100644 index 0000000..79a4d50 Binary files /dev/null and b/maps/picasso/tiles/3/1/7.png.bin differ diff --git a/maps/picasso/tiles/3/1/8.png b/maps/picasso/tiles/3/1/8.png new file mode 100644 index 0000000..d77b649 Binary files /dev/null and b/maps/picasso/tiles/3/1/8.png differ diff --git a/maps/picasso/tiles/3/1/8.png.bin b/maps/picasso/tiles/3/1/8.png.bin new file mode 100644 index 0000000..d6bc925 Binary files /dev/null and b/maps/picasso/tiles/3/1/8.png.bin differ diff --git a/maps/picasso/tiles/3/2/0.png b/maps/picasso/tiles/3/2/0.png new file mode 100644 index 0000000..29fd59b Binary files /dev/null and b/maps/picasso/tiles/3/2/0.png differ diff --git a/maps/picasso/tiles/3/2/0.png.bin b/maps/picasso/tiles/3/2/0.png.bin new file mode 100644 index 0000000..eb2e96c Binary files /dev/null and b/maps/picasso/tiles/3/2/0.png.bin differ diff --git a/maps/picasso/tiles/3/2/1.png b/maps/picasso/tiles/3/2/1.png new file mode 100644 index 0000000..d93c27c Binary files /dev/null and b/maps/picasso/tiles/3/2/1.png differ diff --git a/maps/picasso/tiles/3/2/1.png.bin b/maps/picasso/tiles/3/2/1.png.bin new file mode 100644 index 0000000..22035b3 Binary files /dev/null and b/maps/picasso/tiles/3/2/1.png.bin differ diff --git a/maps/picasso/tiles/3/2/2.png b/maps/picasso/tiles/3/2/2.png new file mode 100644 index 0000000..af3d615 Binary files /dev/null and b/maps/picasso/tiles/3/2/2.png differ diff --git a/maps/picasso/tiles/3/2/2.png.bin b/maps/picasso/tiles/3/2/2.png.bin new file mode 100644 index 0000000..04c9ca4 Binary files /dev/null and b/maps/picasso/tiles/3/2/2.png.bin differ diff --git a/maps/picasso/tiles/3/2/3.png b/maps/picasso/tiles/3/2/3.png new file mode 100644 index 0000000..851d8de Binary files /dev/null and b/maps/picasso/tiles/3/2/3.png differ diff --git a/maps/picasso/tiles/3/2/3.png.bin b/maps/picasso/tiles/3/2/3.png.bin new file mode 100644 index 0000000..f26ea5c Binary files /dev/null and b/maps/picasso/tiles/3/2/3.png.bin differ diff --git a/maps/picasso/tiles/3/2/4.png b/maps/picasso/tiles/3/2/4.png new file mode 100644 index 0000000..7129be5 Binary files /dev/null and b/maps/picasso/tiles/3/2/4.png differ diff --git a/maps/picasso/tiles/3/2/4.png.bin b/maps/picasso/tiles/3/2/4.png.bin new file mode 100644 index 0000000..4d78dd5 Binary files /dev/null and b/maps/picasso/tiles/3/2/4.png.bin differ diff --git a/maps/picasso/tiles/3/2/5.png b/maps/picasso/tiles/3/2/5.png new file mode 100644 index 0000000..fc817af Binary files /dev/null and b/maps/picasso/tiles/3/2/5.png differ diff --git a/maps/picasso/tiles/3/2/5.png.bin b/maps/picasso/tiles/3/2/5.png.bin new file mode 100644 index 0000000..59ab2e2 Binary files /dev/null and b/maps/picasso/tiles/3/2/5.png.bin differ diff --git a/maps/picasso/tiles/3/2/6.png b/maps/picasso/tiles/3/2/6.png new file mode 100644 index 0000000..4b5086b Binary files /dev/null and b/maps/picasso/tiles/3/2/6.png differ diff --git a/maps/picasso/tiles/3/2/6.png.bin b/maps/picasso/tiles/3/2/6.png.bin new file mode 100644 index 0000000..3d2cde3 Binary files /dev/null and b/maps/picasso/tiles/3/2/6.png.bin differ diff --git a/maps/picasso/tiles/3/2/7.png b/maps/picasso/tiles/3/2/7.png new file mode 100644 index 0000000..6a23b45 Binary files /dev/null and b/maps/picasso/tiles/3/2/7.png differ diff --git a/maps/picasso/tiles/3/2/7.png.bin b/maps/picasso/tiles/3/2/7.png.bin new file mode 100644 index 0000000..7c648de Binary files /dev/null and b/maps/picasso/tiles/3/2/7.png.bin differ diff --git a/maps/picasso/tiles/3/2/8.png b/maps/picasso/tiles/3/2/8.png new file mode 100644 index 0000000..cf79a63 Binary files /dev/null and b/maps/picasso/tiles/3/2/8.png differ diff --git a/maps/picasso/tiles/3/2/8.png.bin b/maps/picasso/tiles/3/2/8.png.bin new file mode 100644 index 0000000..c3090e3 Binary files /dev/null and b/maps/picasso/tiles/3/2/8.png.bin differ diff --git a/maps/picasso/tiles/3/3/0.png b/maps/picasso/tiles/3/3/0.png new file mode 100644 index 0000000..dc8bd42 Binary files /dev/null and b/maps/picasso/tiles/3/3/0.png differ diff --git a/maps/picasso/tiles/3/3/0.png.bin b/maps/picasso/tiles/3/3/0.png.bin new file mode 100644 index 0000000..6a05cc0 Binary files /dev/null and b/maps/picasso/tiles/3/3/0.png.bin differ diff --git a/maps/picasso/tiles/3/3/1.png b/maps/picasso/tiles/3/3/1.png new file mode 100644 index 0000000..a595226 Binary files /dev/null and b/maps/picasso/tiles/3/3/1.png differ diff --git a/maps/picasso/tiles/3/3/1.png.bin b/maps/picasso/tiles/3/3/1.png.bin new file mode 100644 index 0000000..032b959 Binary files /dev/null and b/maps/picasso/tiles/3/3/1.png.bin differ diff --git a/maps/picasso/tiles/3/3/2.png b/maps/picasso/tiles/3/3/2.png new file mode 100644 index 0000000..96ad07b Binary files /dev/null and b/maps/picasso/tiles/3/3/2.png differ diff --git a/maps/picasso/tiles/3/3/2.png.bin b/maps/picasso/tiles/3/3/2.png.bin new file mode 100644 index 0000000..56fd0cb Binary files /dev/null and b/maps/picasso/tiles/3/3/2.png.bin differ diff --git a/maps/picasso/tiles/3/3/3.png b/maps/picasso/tiles/3/3/3.png new file mode 100644 index 0000000..5af795e Binary files /dev/null and b/maps/picasso/tiles/3/3/3.png differ diff --git a/maps/picasso/tiles/3/3/3.png.bin b/maps/picasso/tiles/3/3/3.png.bin new file mode 100644 index 0000000..10c37a6 Binary files /dev/null and b/maps/picasso/tiles/3/3/3.png.bin differ diff --git a/maps/picasso/tiles/3/3/4.png b/maps/picasso/tiles/3/3/4.png new file mode 100644 index 0000000..ca28f29 Binary files /dev/null and b/maps/picasso/tiles/3/3/4.png differ diff --git a/maps/picasso/tiles/3/3/4.png.bin b/maps/picasso/tiles/3/3/4.png.bin new file mode 100644 index 0000000..7cd08e7 Binary files /dev/null and b/maps/picasso/tiles/3/3/4.png.bin differ diff --git a/maps/picasso/tiles/3/3/5.png b/maps/picasso/tiles/3/3/5.png new file mode 100644 index 0000000..b4ec905 Binary files /dev/null and b/maps/picasso/tiles/3/3/5.png differ diff --git a/maps/picasso/tiles/3/3/5.png.bin b/maps/picasso/tiles/3/3/5.png.bin new file mode 100644 index 0000000..38d079c Binary files /dev/null and b/maps/picasso/tiles/3/3/5.png.bin differ diff --git a/maps/picasso/tiles/3/3/6.png b/maps/picasso/tiles/3/3/6.png new file mode 100644 index 0000000..e87a36e Binary files /dev/null and b/maps/picasso/tiles/3/3/6.png differ diff --git a/maps/picasso/tiles/3/3/6.png.bin b/maps/picasso/tiles/3/3/6.png.bin new file mode 100644 index 0000000..f9276e1 Binary files /dev/null and b/maps/picasso/tiles/3/3/6.png.bin differ diff --git a/maps/picasso/tiles/3/3/7.png b/maps/picasso/tiles/3/3/7.png new file mode 100644 index 0000000..36c3549 Binary files /dev/null and b/maps/picasso/tiles/3/3/7.png differ diff --git a/maps/picasso/tiles/3/3/7.png.bin b/maps/picasso/tiles/3/3/7.png.bin new file mode 100644 index 0000000..77f608b Binary files /dev/null and b/maps/picasso/tiles/3/3/7.png.bin differ diff --git a/maps/picasso/tiles/3/3/8.png b/maps/picasso/tiles/3/3/8.png new file mode 100644 index 0000000..b551caa Binary files /dev/null and b/maps/picasso/tiles/3/3/8.png differ diff --git a/maps/picasso/tiles/3/3/8.png.bin b/maps/picasso/tiles/3/3/8.png.bin new file mode 100644 index 0000000..b2eda5e Binary files /dev/null and b/maps/picasso/tiles/3/3/8.png.bin differ diff --git a/maps/picasso/tiles/3/4/0.png b/maps/picasso/tiles/3/4/0.png new file mode 100644 index 0000000..86f9477 Binary files /dev/null and b/maps/picasso/tiles/3/4/0.png differ diff --git a/maps/picasso/tiles/3/4/0.png.bin b/maps/picasso/tiles/3/4/0.png.bin new file mode 100644 index 0000000..7f741e2 Binary files /dev/null and b/maps/picasso/tiles/3/4/0.png.bin differ diff --git a/maps/picasso/tiles/3/4/1.png b/maps/picasso/tiles/3/4/1.png new file mode 100644 index 0000000..1a178c3 Binary files /dev/null and b/maps/picasso/tiles/3/4/1.png differ diff --git a/maps/picasso/tiles/3/4/1.png.bin b/maps/picasso/tiles/3/4/1.png.bin new file mode 100644 index 0000000..59d06ea Binary files /dev/null and b/maps/picasso/tiles/3/4/1.png.bin differ diff --git a/maps/picasso/tiles/3/4/2.png b/maps/picasso/tiles/3/4/2.png new file mode 100644 index 0000000..bc31299 Binary files /dev/null and b/maps/picasso/tiles/3/4/2.png differ diff --git a/maps/picasso/tiles/3/4/2.png.bin b/maps/picasso/tiles/3/4/2.png.bin new file mode 100644 index 0000000..ed58e62 Binary files /dev/null and b/maps/picasso/tiles/3/4/2.png.bin differ diff --git a/maps/picasso/tiles/3/4/3.png b/maps/picasso/tiles/3/4/3.png new file mode 100644 index 0000000..f674488 Binary files /dev/null and b/maps/picasso/tiles/3/4/3.png differ diff --git a/maps/picasso/tiles/3/4/3.png.bin b/maps/picasso/tiles/3/4/3.png.bin new file mode 100644 index 0000000..80e842f Binary files /dev/null and b/maps/picasso/tiles/3/4/3.png.bin differ diff --git a/maps/picasso/tiles/3/4/4.png b/maps/picasso/tiles/3/4/4.png new file mode 100644 index 0000000..65c1081 Binary files /dev/null and b/maps/picasso/tiles/3/4/4.png differ diff --git a/maps/picasso/tiles/3/4/4.png.bin b/maps/picasso/tiles/3/4/4.png.bin new file mode 100644 index 0000000..a952d47 Binary files /dev/null and b/maps/picasso/tiles/3/4/4.png.bin differ diff --git a/maps/picasso/tiles/3/4/5.png b/maps/picasso/tiles/3/4/5.png new file mode 100644 index 0000000..b411c2e Binary files /dev/null and b/maps/picasso/tiles/3/4/5.png differ diff --git a/maps/picasso/tiles/3/4/5.png.bin b/maps/picasso/tiles/3/4/5.png.bin new file mode 100644 index 0000000..6fa903a Binary files /dev/null and b/maps/picasso/tiles/3/4/5.png.bin differ diff --git a/maps/picasso/tiles/3/4/6.png b/maps/picasso/tiles/3/4/6.png new file mode 100644 index 0000000..40c916d Binary files /dev/null and b/maps/picasso/tiles/3/4/6.png differ diff --git a/maps/picasso/tiles/3/4/6.png.bin b/maps/picasso/tiles/3/4/6.png.bin new file mode 100644 index 0000000..9fdf75c Binary files /dev/null and b/maps/picasso/tiles/3/4/6.png.bin differ diff --git a/maps/picasso/tiles/3/4/7.png b/maps/picasso/tiles/3/4/7.png new file mode 100644 index 0000000..900de72 Binary files /dev/null and b/maps/picasso/tiles/3/4/7.png differ diff --git a/maps/picasso/tiles/3/4/7.png.bin b/maps/picasso/tiles/3/4/7.png.bin new file mode 100644 index 0000000..b6d2e08 Binary files /dev/null and b/maps/picasso/tiles/3/4/7.png.bin differ diff --git a/maps/picasso/tiles/3/4/8.png b/maps/picasso/tiles/3/4/8.png new file mode 100644 index 0000000..2122107 Binary files /dev/null and b/maps/picasso/tiles/3/4/8.png differ diff --git a/maps/picasso/tiles/3/4/8.png.bin b/maps/picasso/tiles/3/4/8.png.bin new file mode 100644 index 0000000..cf2a7d0 Binary files /dev/null and b/maps/picasso/tiles/3/4/8.png.bin differ diff --git a/maps/picasso/tiles/3/5/0.png b/maps/picasso/tiles/3/5/0.png new file mode 100644 index 0000000..c1ed743 Binary files /dev/null and b/maps/picasso/tiles/3/5/0.png differ diff --git a/maps/picasso/tiles/3/5/0.png.bin b/maps/picasso/tiles/3/5/0.png.bin new file mode 100644 index 0000000..2a96ead Binary files /dev/null and b/maps/picasso/tiles/3/5/0.png.bin differ diff --git a/maps/picasso/tiles/3/5/1.png b/maps/picasso/tiles/3/5/1.png new file mode 100644 index 0000000..1ea6cbf Binary files /dev/null and b/maps/picasso/tiles/3/5/1.png differ diff --git a/maps/picasso/tiles/3/5/1.png.bin b/maps/picasso/tiles/3/5/1.png.bin new file mode 100644 index 0000000..204128a Binary files /dev/null and b/maps/picasso/tiles/3/5/1.png.bin differ diff --git a/maps/picasso/tiles/3/5/2.png b/maps/picasso/tiles/3/5/2.png new file mode 100644 index 0000000..4a4b94b Binary files /dev/null and b/maps/picasso/tiles/3/5/2.png differ diff --git a/maps/picasso/tiles/3/5/2.png.bin b/maps/picasso/tiles/3/5/2.png.bin new file mode 100644 index 0000000..cfb4eff Binary files /dev/null and b/maps/picasso/tiles/3/5/2.png.bin differ diff --git a/maps/picasso/tiles/3/5/3.png b/maps/picasso/tiles/3/5/3.png new file mode 100644 index 0000000..acb5e94 Binary files /dev/null and b/maps/picasso/tiles/3/5/3.png differ diff --git a/maps/picasso/tiles/3/5/3.png.bin b/maps/picasso/tiles/3/5/3.png.bin new file mode 100644 index 0000000..a2c6ef6 Binary files /dev/null and b/maps/picasso/tiles/3/5/3.png.bin differ diff --git a/maps/picasso/tiles/3/5/4.png b/maps/picasso/tiles/3/5/4.png new file mode 100644 index 0000000..af278a8 Binary files /dev/null and b/maps/picasso/tiles/3/5/4.png differ diff --git a/maps/picasso/tiles/3/5/4.png.bin b/maps/picasso/tiles/3/5/4.png.bin new file mode 100644 index 0000000..ab5efc2 Binary files /dev/null and b/maps/picasso/tiles/3/5/4.png.bin differ diff --git a/maps/picasso/tiles/3/5/5.png b/maps/picasso/tiles/3/5/5.png new file mode 100644 index 0000000..c288eb6 Binary files /dev/null and b/maps/picasso/tiles/3/5/5.png differ diff --git a/maps/picasso/tiles/3/5/5.png.bin b/maps/picasso/tiles/3/5/5.png.bin new file mode 100644 index 0000000..90acf75 Binary files /dev/null and b/maps/picasso/tiles/3/5/5.png.bin differ diff --git a/maps/picasso/tiles/3/5/6.png b/maps/picasso/tiles/3/5/6.png new file mode 100644 index 0000000..8c1cfbe Binary files /dev/null and b/maps/picasso/tiles/3/5/6.png differ diff --git a/maps/picasso/tiles/3/5/6.png.bin b/maps/picasso/tiles/3/5/6.png.bin new file mode 100644 index 0000000..fbc6026 Binary files /dev/null and b/maps/picasso/tiles/3/5/6.png.bin differ diff --git a/maps/picasso/tiles/3/5/7.png b/maps/picasso/tiles/3/5/7.png new file mode 100644 index 0000000..815298d Binary files /dev/null and b/maps/picasso/tiles/3/5/7.png differ diff --git a/maps/picasso/tiles/3/5/7.png.bin b/maps/picasso/tiles/3/5/7.png.bin new file mode 100644 index 0000000..124e966 Binary files /dev/null and b/maps/picasso/tiles/3/5/7.png.bin differ diff --git a/maps/picasso/tiles/3/5/8.png b/maps/picasso/tiles/3/5/8.png new file mode 100644 index 0000000..bb339c4 Binary files /dev/null and b/maps/picasso/tiles/3/5/8.png differ diff --git a/maps/picasso/tiles/3/5/8.png.bin b/maps/picasso/tiles/3/5/8.png.bin new file mode 100644 index 0000000..59eef90 Binary files /dev/null and b/maps/picasso/tiles/3/5/8.png.bin differ diff --git a/maps/picasso/tiles/3/6/0.png b/maps/picasso/tiles/3/6/0.png new file mode 100644 index 0000000..87c40a8 Binary files /dev/null and b/maps/picasso/tiles/3/6/0.png differ diff --git a/maps/picasso/tiles/3/6/0.png.bin b/maps/picasso/tiles/3/6/0.png.bin new file mode 100644 index 0000000..5effe12 Binary files /dev/null and b/maps/picasso/tiles/3/6/0.png.bin differ diff --git a/maps/picasso/tiles/3/6/1.png b/maps/picasso/tiles/3/6/1.png new file mode 100644 index 0000000..cdbfb37 Binary files /dev/null and b/maps/picasso/tiles/3/6/1.png differ diff --git a/maps/picasso/tiles/3/6/1.png.bin b/maps/picasso/tiles/3/6/1.png.bin new file mode 100644 index 0000000..1ef8bd1 Binary files /dev/null and b/maps/picasso/tiles/3/6/1.png.bin differ diff --git a/maps/picasso/tiles/3/6/2.png b/maps/picasso/tiles/3/6/2.png new file mode 100644 index 0000000..9c57eb8 Binary files /dev/null and b/maps/picasso/tiles/3/6/2.png differ diff --git a/maps/picasso/tiles/3/6/2.png.bin b/maps/picasso/tiles/3/6/2.png.bin new file mode 100644 index 0000000..6ceaa70 Binary files /dev/null and b/maps/picasso/tiles/3/6/2.png.bin differ diff --git a/maps/picasso/tiles/3/6/3.png b/maps/picasso/tiles/3/6/3.png new file mode 100644 index 0000000..7b6b5df Binary files /dev/null and b/maps/picasso/tiles/3/6/3.png differ diff --git a/maps/picasso/tiles/3/6/3.png.bin b/maps/picasso/tiles/3/6/3.png.bin new file mode 100644 index 0000000..64c1eb6 Binary files /dev/null and b/maps/picasso/tiles/3/6/3.png.bin differ diff --git a/maps/picasso/tiles/3/6/4.png b/maps/picasso/tiles/3/6/4.png new file mode 100644 index 0000000..f899dde Binary files /dev/null and b/maps/picasso/tiles/3/6/4.png differ diff --git a/maps/picasso/tiles/3/6/4.png.bin b/maps/picasso/tiles/3/6/4.png.bin new file mode 100644 index 0000000..896d01a Binary files /dev/null and b/maps/picasso/tiles/3/6/4.png.bin differ diff --git a/maps/picasso/tiles/3/6/5.png b/maps/picasso/tiles/3/6/5.png new file mode 100644 index 0000000..8b4ab1d Binary files /dev/null and b/maps/picasso/tiles/3/6/5.png differ diff --git a/maps/picasso/tiles/3/6/5.png.bin b/maps/picasso/tiles/3/6/5.png.bin new file mode 100644 index 0000000..3941f3b Binary files /dev/null and b/maps/picasso/tiles/3/6/5.png.bin differ diff --git a/maps/picasso/tiles/3/6/6.png b/maps/picasso/tiles/3/6/6.png new file mode 100644 index 0000000..81a12dc Binary files /dev/null and b/maps/picasso/tiles/3/6/6.png differ diff --git a/maps/picasso/tiles/3/6/6.png.bin b/maps/picasso/tiles/3/6/6.png.bin new file mode 100644 index 0000000..e4e82b1 Binary files /dev/null and b/maps/picasso/tiles/3/6/6.png.bin differ diff --git a/maps/picasso/tiles/3/6/7.png b/maps/picasso/tiles/3/6/7.png new file mode 100644 index 0000000..36cbc14 Binary files /dev/null and b/maps/picasso/tiles/3/6/7.png differ diff --git a/maps/picasso/tiles/3/6/7.png.bin b/maps/picasso/tiles/3/6/7.png.bin new file mode 100644 index 0000000..4ca0e25 Binary files /dev/null and b/maps/picasso/tiles/3/6/7.png.bin differ diff --git a/maps/picasso/tiles/3/6/8.png b/maps/picasso/tiles/3/6/8.png new file mode 100644 index 0000000..18cc69d Binary files /dev/null and b/maps/picasso/tiles/3/6/8.png differ diff --git a/maps/picasso/tiles/3/6/8.png.bin b/maps/picasso/tiles/3/6/8.png.bin new file mode 100644 index 0000000..88900cd Binary files /dev/null and b/maps/picasso/tiles/3/6/8.png.bin differ diff --git a/maps/picasso/tiles/3/7/0.png b/maps/picasso/tiles/3/7/0.png new file mode 100644 index 0000000..7678d37 Binary files /dev/null and b/maps/picasso/tiles/3/7/0.png differ diff --git a/maps/picasso/tiles/3/7/0.png.bin b/maps/picasso/tiles/3/7/0.png.bin new file mode 100644 index 0000000..4f56751 Binary files /dev/null and b/maps/picasso/tiles/3/7/0.png.bin differ diff --git a/maps/picasso/tiles/3/7/1.png b/maps/picasso/tiles/3/7/1.png new file mode 100644 index 0000000..48d35cc Binary files /dev/null and b/maps/picasso/tiles/3/7/1.png differ diff --git a/maps/picasso/tiles/3/7/1.png.bin b/maps/picasso/tiles/3/7/1.png.bin new file mode 100644 index 0000000..dbcbdab Binary files /dev/null and b/maps/picasso/tiles/3/7/1.png.bin differ diff --git a/maps/picasso/tiles/3/7/2.png b/maps/picasso/tiles/3/7/2.png new file mode 100644 index 0000000..8fe1b2a Binary files /dev/null and b/maps/picasso/tiles/3/7/2.png differ diff --git a/maps/picasso/tiles/3/7/2.png.bin b/maps/picasso/tiles/3/7/2.png.bin new file mode 100644 index 0000000..4bae3a6 Binary files /dev/null and b/maps/picasso/tiles/3/7/2.png.bin differ diff --git a/maps/picasso/tiles/3/7/3.png b/maps/picasso/tiles/3/7/3.png new file mode 100644 index 0000000..367b0d9 Binary files /dev/null and b/maps/picasso/tiles/3/7/3.png differ diff --git a/maps/picasso/tiles/3/7/3.png.bin b/maps/picasso/tiles/3/7/3.png.bin new file mode 100644 index 0000000..930aa1a Binary files /dev/null and b/maps/picasso/tiles/3/7/3.png.bin differ diff --git a/maps/picasso/tiles/3/7/4.png b/maps/picasso/tiles/3/7/4.png new file mode 100644 index 0000000..7b04e5e Binary files /dev/null and b/maps/picasso/tiles/3/7/4.png differ diff --git a/maps/picasso/tiles/3/7/4.png.bin b/maps/picasso/tiles/3/7/4.png.bin new file mode 100644 index 0000000..c0ead16 Binary files /dev/null and b/maps/picasso/tiles/3/7/4.png.bin differ diff --git a/maps/picasso/tiles/3/7/5.png b/maps/picasso/tiles/3/7/5.png new file mode 100644 index 0000000..18c50fb Binary files /dev/null and b/maps/picasso/tiles/3/7/5.png differ diff --git a/maps/picasso/tiles/3/7/5.png.bin b/maps/picasso/tiles/3/7/5.png.bin new file mode 100644 index 0000000..33f64b9 Binary files /dev/null and b/maps/picasso/tiles/3/7/5.png.bin differ diff --git a/maps/picasso/tiles/3/7/6.png b/maps/picasso/tiles/3/7/6.png new file mode 100644 index 0000000..ae2ecb4 Binary files /dev/null and b/maps/picasso/tiles/3/7/6.png differ diff --git a/maps/picasso/tiles/3/7/6.png.bin b/maps/picasso/tiles/3/7/6.png.bin new file mode 100644 index 0000000..8a6031c Binary files /dev/null and b/maps/picasso/tiles/3/7/6.png.bin differ diff --git a/maps/picasso/tiles/3/7/7.png b/maps/picasso/tiles/3/7/7.png new file mode 100644 index 0000000..63b5b16 Binary files /dev/null and b/maps/picasso/tiles/3/7/7.png differ diff --git a/maps/picasso/tiles/3/7/7.png.bin b/maps/picasso/tiles/3/7/7.png.bin new file mode 100644 index 0000000..1a486a6 Binary files /dev/null and b/maps/picasso/tiles/3/7/7.png.bin differ diff --git a/maps/picasso/tiles/3/7/8.png b/maps/picasso/tiles/3/7/8.png new file mode 100644 index 0000000..6749258 Binary files /dev/null and b/maps/picasso/tiles/3/7/8.png differ diff --git a/maps/picasso/tiles/3/7/8.png.bin b/maps/picasso/tiles/3/7/8.png.bin new file mode 100644 index 0000000..8dddb29 Binary files /dev/null and b/maps/picasso/tiles/3/7/8.png.bin differ diff --git a/maps/picasso/tiles/leaflet.html b/maps/picasso/tiles/leaflet.html new file mode 100644 index 0000000..a5c9760 --- /dev/null +++ b/maps/picasso/tiles/leaflet.html @@ -0,0 +1,56 @@ + + + + tiles + + + + + + + + + + +
+ + + + diff --git a/maps/picasso/tiles/metadata.json b/maps/picasso/tiles/metadata.json new file mode 100644 index 0000000..0a754db --- /dev/null +++ b/maps/picasso/tiles/metadata.json @@ -0,0 +1,46 @@ +{ + "name": "Picasso", + "version": "1.1.0", + "description": "", + "attribution": "Rendered with MapTiler Desktop", + "type": "baselayer", + "color": "#FFFFFF", + "format": "png", + "minzoom": "1", + "maxzoom": "3", + "scale": "1.000000", + "bounds": [-74.92075946, 39.73421155, -74.91292641, 39.74094236], + "profile": "custom", + "crs": "EPSG:3857", + "proj4": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs", + "extent": [-8340140.79320000, 4827393.46432224, -8339268.82140956, 4828367.83280000], + "tile_matrix": [ + { + "id": "1", + "tile_size": [240, 240], + "origin": [-8340140.79320000, 4828367.83280000], + "extent": [-8340140.79320000, 4827393.46432224, -8339268.82140956, 4828367.83280000], + "pixel_size": [2.00000000, -2.00000000], + "matrix_size": [2, 3], + "scale_denominator": 7142.85714286 + }, + { + "id": "2", + "tile_size": [240, 240], + "origin": [-8340140.79320000, 4828367.83280000], + "extent": [-8340140.79320000, 4827393.46432224, -8339268.82140956, 4828367.83280000], + "pixel_size": [1.00000000, -1.00000000], + "matrix_size": [4, 5], + "scale_denominator": 3571.42857143 + }, + { + "id": "3", + "tile_size": [240, 240], + "origin": [-8340140.79320000, 4828367.83280000], + "extent": [-8340140.79320000, 4827393.46432224, -8339268.82140956, 4828367.83280000], + "pixel_size": [0.50000000, -0.50000000], + "matrix_size": [8, 9], + "scale_denominator": 1785.71428571 + } +] +} diff --git a/maps/picasso/tiles/openlayers.html b/maps/picasso/tiles/openlayers.html new file mode 100644 index 0000000..58ea29c --- /dev/null +++ b/maps/picasso/tiles/openlayers.html @@ -0,0 +1,70 @@ + + + +tiles + + + + + + + + + + +
+ + + + diff --git a/maps/zulu24/p_zulu24.json b/maps/zulu24/p_zulu24.json new file mode 100644 index 0000000..0923abe --- /dev/null +++ b/maps/zulu24/p_zulu24.json @@ -0,0 +1,19 @@ +{ +"points": [ +{ "type": 0, "color": 16776960, "name": "Mosque", "coordinates": [ -74.1004643316022, 41.46504848793611] }, +{ "type": 0, "color": 16776960, "name": "CQB Far", "coordinates": [ -74.10067862794062, 41.46494129354262] }, +{ "type": 0, "color": 16776960, "name": "CQB Entrance", "coordinates": [ -74.10067862794062, 41.46494129354262] }, +{ "type": 0, "color": 16776960, "name": "Helicopter", "coordinates": [ -74.09997828558599, 41.46478820049636] }, +{ "type": 0, "color": 16776960, "name": "Lower City", "coordinates": [ -74.09979164079634, 41.46497371654159] }, +{ "type": 0, "color": 16776960, "name": "CQB", "coordinates": [ -74.09979164079634, 41.46497371654159] }, +{ "type": 0, "color": 16776960, "name": "African Village", "coordinates": [ -74.10135120356058, 41.46447225513926] }, +{ "type": 0, "color": 16776960, "name": "Fuel Depot", "coordinates": [ -74.10135120356058, 41.46447225513926] }, +{ "type": 0, "color": 16776960, "name": "Embassy", "coordinates": [ -74.09982305937324, 41.46389663840137] }, +{ "type": 0, "color": 16776960, "name": "Power Lines", "coordinates": [ -74.09966993556614, 41.46352064440545] }, +{ "type": 0, "color": 16776960, "name": "Field Entrance", "coordinates": [ -74.10008241351704, 41.46629135978078] }, +{ "type": 0, "color": 16776960, "name": "Gate", "coordinates": [ -74.10008241351704, 41.46629135978078] }, +{ "type": 0, "color": 16776960, "name": "Haji Camp", "coordinates": [ -74.10023398675399, 41.46629189619905] }, +{ "type": 0, "color": 16776960, "name": "Castle", "coordinates": [ -74.09936540466151, 41.46547710750193] }, +{ "type": 0, "color": 16776960, "name": "HKZ3", "coordinates": [ -74.09856745690514, 41.46471517156904] } +] +} \ No newline at end of file diff --git a/maps/zulu24/zulu24.tif b/maps/zulu24/zulu24.tif new file mode 100644 index 0000000..4196581 Binary files /dev/null and b/maps/zulu24/zulu24.tif differ diff --git a/maps/zulu24/zulu24/1/0/0.png b/maps/zulu24/zulu24/1/0/0.png new file mode 100644 index 0000000..89d917d Binary files /dev/null and b/maps/zulu24/zulu24/1/0/0.png differ diff --git a/maps/zulu24/zulu24/1/0/0.png.bin b/maps/zulu24/zulu24/1/0/0.png.bin new file mode 100644 index 0000000..625014a Binary files /dev/null and b/maps/zulu24/zulu24/1/0/0.png.bin differ diff --git a/maps/zulu24/zulu24/1/0/1.png b/maps/zulu24/zulu24/1/0/1.png new file mode 100644 index 0000000..2da5918 Binary files /dev/null and b/maps/zulu24/zulu24/1/0/1.png differ diff --git a/maps/zulu24/zulu24/1/0/1.png.bin b/maps/zulu24/zulu24/1/0/1.png.bin new file mode 100644 index 0000000..f02ed98 Binary files /dev/null and b/maps/zulu24/zulu24/1/0/1.png.bin differ diff --git a/maps/zulu24/zulu24/1/1/0.png b/maps/zulu24/zulu24/1/1/0.png new file mode 100644 index 0000000..0e9825a Binary files /dev/null and b/maps/zulu24/zulu24/1/1/0.png differ diff --git a/maps/zulu24/zulu24/1/1/0.png.bin b/maps/zulu24/zulu24/1/1/0.png.bin new file mode 100644 index 0000000..d35d716 Binary files /dev/null and b/maps/zulu24/zulu24/1/1/0.png.bin differ diff --git a/maps/zulu24/zulu24/1/1/1.png b/maps/zulu24/zulu24/1/1/1.png new file mode 100644 index 0000000..645a3eb Binary files /dev/null and b/maps/zulu24/zulu24/1/1/1.png differ diff --git a/maps/zulu24/zulu24/1/1/1.png.bin b/maps/zulu24/zulu24/1/1/1.png.bin new file mode 100644 index 0000000..d82f5c5 Binary files /dev/null and b/maps/zulu24/zulu24/1/1/1.png.bin differ diff --git a/maps/zulu24/zulu24/2/0/0.png b/maps/zulu24/zulu24/2/0/0.png new file mode 100644 index 0000000..f122b53 Binary files /dev/null and b/maps/zulu24/zulu24/2/0/0.png differ diff --git a/maps/zulu24/zulu24/2/0/0.png.bin b/maps/zulu24/zulu24/2/0/0.png.bin new file mode 100644 index 0000000..b68f36b Binary files /dev/null and b/maps/zulu24/zulu24/2/0/0.png.bin differ diff --git a/maps/zulu24/zulu24/2/0/1.png b/maps/zulu24/zulu24/2/0/1.png new file mode 100644 index 0000000..3d71ffe Binary files /dev/null and b/maps/zulu24/zulu24/2/0/1.png differ diff --git a/maps/zulu24/zulu24/2/0/1.png.bin b/maps/zulu24/zulu24/2/0/1.png.bin new file mode 100644 index 0000000..0229ba9 Binary files /dev/null and b/maps/zulu24/zulu24/2/0/1.png.bin differ diff --git a/maps/zulu24/zulu24/2/0/2.png b/maps/zulu24/zulu24/2/0/2.png new file mode 100644 index 0000000..ed9c92e Binary files /dev/null and b/maps/zulu24/zulu24/2/0/2.png differ diff --git a/maps/zulu24/zulu24/2/0/2.png.bin b/maps/zulu24/zulu24/2/0/2.png.bin new file mode 100644 index 0000000..c264965 Binary files /dev/null and b/maps/zulu24/zulu24/2/0/2.png.bin differ diff --git a/maps/zulu24/zulu24/2/1/0.png b/maps/zulu24/zulu24/2/1/0.png new file mode 100644 index 0000000..b130046 Binary files /dev/null and b/maps/zulu24/zulu24/2/1/0.png differ diff --git a/maps/zulu24/zulu24/2/1/0.png.bin b/maps/zulu24/zulu24/2/1/0.png.bin new file mode 100644 index 0000000..e00be51 Binary files /dev/null and b/maps/zulu24/zulu24/2/1/0.png.bin differ diff --git a/maps/zulu24/zulu24/2/1/1.png b/maps/zulu24/zulu24/2/1/1.png new file mode 100644 index 0000000..5369495 Binary files /dev/null and b/maps/zulu24/zulu24/2/1/1.png differ diff --git a/maps/zulu24/zulu24/2/1/1.png.bin b/maps/zulu24/zulu24/2/1/1.png.bin new file mode 100644 index 0000000..2fc0ab3 Binary files /dev/null and b/maps/zulu24/zulu24/2/1/1.png.bin differ diff --git a/maps/zulu24/zulu24/2/1/2.png b/maps/zulu24/zulu24/2/1/2.png new file mode 100644 index 0000000..eb6eb1c Binary files /dev/null and b/maps/zulu24/zulu24/2/1/2.png differ diff --git a/maps/zulu24/zulu24/2/1/2.png.bin b/maps/zulu24/zulu24/2/1/2.png.bin new file mode 100644 index 0000000..02017db Binary files /dev/null and b/maps/zulu24/zulu24/2/1/2.png.bin differ diff --git a/maps/zulu24/zulu24/2/2/0.png b/maps/zulu24/zulu24/2/2/0.png new file mode 100644 index 0000000..f41f8d9 Binary files /dev/null and b/maps/zulu24/zulu24/2/2/0.png differ diff --git a/maps/zulu24/zulu24/2/2/0.png.bin b/maps/zulu24/zulu24/2/2/0.png.bin new file mode 100644 index 0000000..9bae5da Binary files /dev/null and b/maps/zulu24/zulu24/2/2/0.png.bin differ diff --git a/maps/zulu24/zulu24/2/2/1.png b/maps/zulu24/zulu24/2/2/1.png new file mode 100644 index 0000000..4e00d44 Binary files /dev/null and b/maps/zulu24/zulu24/2/2/1.png differ diff --git a/maps/zulu24/zulu24/2/2/1.png.bin b/maps/zulu24/zulu24/2/2/1.png.bin new file mode 100644 index 0000000..aefd593 Binary files /dev/null and b/maps/zulu24/zulu24/2/2/1.png.bin differ diff --git a/maps/zulu24/zulu24/2/2/2.png b/maps/zulu24/zulu24/2/2/2.png new file mode 100644 index 0000000..f91fdc0 Binary files /dev/null and b/maps/zulu24/zulu24/2/2/2.png differ diff --git a/maps/zulu24/zulu24/2/2/2.png.bin b/maps/zulu24/zulu24/2/2/2.png.bin new file mode 100644 index 0000000..38b8f3b Binary files /dev/null and b/maps/zulu24/zulu24/2/2/2.png.bin differ diff --git a/maps/zulu24/zulu24/2/3/0.png b/maps/zulu24/zulu24/2/3/0.png new file mode 100644 index 0000000..80558c9 Binary files /dev/null and b/maps/zulu24/zulu24/2/3/0.png differ diff --git a/maps/zulu24/zulu24/2/3/0.png.bin b/maps/zulu24/zulu24/2/3/0.png.bin new file mode 100644 index 0000000..b955bb8 Binary files /dev/null and b/maps/zulu24/zulu24/2/3/0.png.bin differ diff --git a/maps/zulu24/zulu24/2/3/1.png b/maps/zulu24/zulu24/2/3/1.png new file mode 100644 index 0000000..cb67efa Binary files /dev/null and b/maps/zulu24/zulu24/2/3/1.png differ diff --git a/maps/zulu24/zulu24/2/3/1.png.bin b/maps/zulu24/zulu24/2/3/1.png.bin new file mode 100644 index 0000000..293bcf2 Binary files /dev/null and b/maps/zulu24/zulu24/2/3/1.png.bin differ diff --git a/maps/zulu24/zulu24/2/3/2.png b/maps/zulu24/zulu24/2/3/2.png new file mode 100644 index 0000000..542efba Binary files /dev/null and b/maps/zulu24/zulu24/2/3/2.png differ diff --git a/maps/zulu24/zulu24/2/3/2.png.bin b/maps/zulu24/zulu24/2/3/2.png.bin new file mode 100644 index 0000000..43c8ba0 Binary files /dev/null and b/maps/zulu24/zulu24/2/3/2.png.bin differ diff --git a/maps/zulu24/zulu24/3/0/0.png b/maps/zulu24/zulu24/3/0/0.png new file mode 100644 index 0000000..7d26360 Binary files /dev/null and b/maps/zulu24/zulu24/3/0/0.png differ diff --git a/maps/zulu24/zulu24/3/0/0.png.bin b/maps/zulu24/zulu24/3/0/0.png.bin new file mode 100644 index 0000000..a348516 Binary files /dev/null and b/maps/zulu24/zulu24/3/0/0.png.bin differ diff --git a/maps/zulu24/zulu24/3/0/1.png b/maps/zulu24/zulu24/3/0/1.png new file mode 100644 index 0000000..22aca63 Binary files /dev/null and b/maps/zulu24/zulu24/3/0/1.png differ diff --git a/maps/zulu24/zulu24/3/0/1.png.bin b/maps/zulu24/zulu24/3/0/1.png.bin new file mode 100644 index 0000000..1b0fc5a Binary files /dev/null and b/maps/zulu24/zulu24/3/0/1.png.bin differ diff --git a/maps/zulu24/zulu24/3/0/2.png b/maps/zulu24/zulu24/3/0/2.png new file mode 100644 index 0000000..c8f5702 Binary files /dev/null and b/maps/zulu24/zulu24/3/0/2.png differ diff --git a/maps/zulu24/zulu24/3/0/2.png.bin b/maps/zulu24/zulu24/3/0/2.png.bin new file mode 100644 index 0000000..3d245ef Binary files /dev/null and b/maps/zulu24/zulu24/3/0/2.png.bin differ diff --git a/maps/zulu24/zulu24/3/0/3.png b/maps/zulu24/zulu24/3/0/3.png new file mode 100644 index 0000000..fea9445 Binary files /dev/null and b/maps/zulu24/zulu24/3/0/3.png differ diff --git a/maps/zulu24/zulu24/3/0/3.png.bin b/maps/zulu24/zulu24/3/0/3.png.bin new file mode 100644 index 0000000..4e13c3f Binary files /dev/null and b/maps/zulu24/zulu24/3/0/3.png.bin differ diff --git a/maps/zulu24/zulu24/3/0/4.png b/maps/zulu24/zulu24/3/0/4.png new file mode 100644 index 0000000..04b09fa Binary files /dev/null and b/maps/zulu24/zulu24/3/0/4.png differ diff --git a/maps/zulu24/zulu24/3/0/4.png.bin b/maps/zulu24/zulu24/3/0/4.png.bin new file mode 100644 index 0000000..d65b11e Binary files /dev/null and b/maps/zulu24/zulu24/3/0/4.png.bin differ diff --git a/maps/zulu24/zulu24/3/0/5.png b/maps/zulu24/zulu24/3/0/5.png new file mode 100644 index 0000000..7132816 Binary files /dev/null and b/maps/zulu24/zulu24/3/0/5.png differ diff --git a/maps/zulu24/zulu24/3/0/5.png.bin b/maps/zulu24/zulu24/3/0/5.png.bin new file mode 100644 index 0000000..64ddd39 Binary files /dev/null and b/maps/zulu24/zulu24/3/0/5.png.bin differ diff --git a/maps/zulu24/zulu24/3/1/0.png b/maps/zulu24/zulu24/3/1/0.png new file mode 100644 index 0000000..6ac6e7b Binary files /dev/null and b/maps/zulu24/zulu24/3/1/0.png differ diff --git a/maps/zulu24/zulu24/3/1/0.png.bin b/maps/zulu24/zulu24/3/1/0.png.bin new file mode 100644 index 0000000..e408c8b Binary files /dev/null and b/maps/zulu24/zulu24/3/1/0.png.bin differ diff --git a/maps/zulu24/zulu24/3/1/1.png b/maps/zulu24/zulu24/3/1/1.png new file mode 100644 index 0000000..bc4f0e6 Binary files /dev/null and b/maps/zulu24/zulu24/3/1/1.png differ diff --git a/maps/zulu24/zulu24/3/1/1.png.bin b/maps/zulu24/zulu24/3/1/1.png.bin new file mode 100644 index 0000000..4c1ff4c Binary files /dev/null and b/maps/zulu24/zulu24/3/1/1.png.bin differ diff --git a/maps/zulu24/zulu24/3/1/2.png b/maps/zulu24/zulu24/3/1/2.png new file mode 100644 index 0000000..3002c13 Binary files /dev/null and b/maps/zulu24/zulu24/3/1/2.png differ diff --git a/maps/zulu24/zulu24/3/1/2.png.bin b/maps/zulu24/zulu24/3/1/2.png.bin new file mode 100644 index 0000000..31e8929 Binary files /dev/null and b/maps/zulu24/zulu24/3/1/2.png.bin differ diff --git a/maps/zulu24/zulu24/3/1/3.png b/maps/zulu24/zulu24/3/1/3.png new file mode 100644 index 0000000..71b112d Binary files /dev/null and b/maps/zulu24/zulu24/3/1/3.png differ diff --git a/maps/zulu24/zulu24/3/1/3.png.bin b/maps/zulu24/zulu24/3/1/3.png.bin new file mode 100644 index 0000000..3fe7e7e Binary files /dev/null and b/maps/zulu24/zulu24/3/1/3.png.bin differ diff --git a/maps/zulu24/zulu24/3/1/4.png b/maps/zulu24/zulu24/3/1/4.png new file mode 100644 index 0000000..db02845 Binary files /dev/null and b/maps/zulu24/zulu24/3/1/4.png differ diff --git a/maps/zulu24/zulu24/3/1/4.png.bin b/maps/zulu24/zulu24/3/1/4.png.bin new file mode 100644 index 0000000..8baf5b9 Binary files /dev/null and b/maps/zulu24/zulu24/3/1/4.png.bin differ diff --git a/maps/zulu24/zulu24/3/1/5.png b/maps/zulu24/zulu24/3/1/5.png new file mode 100644 index 0000000..008160b Binary files /dev/null and b/maps/zulu24/zulu24/3/1/5.png differ diff --git a/maps/zulu24/zulu24/3/1/5.png.bin b/maps/zulu24/zulu24/3/1/5.png.bin new file mode 100644 index 0000000..43b1d9f Binary files /dev/null and b/maps/zulu24/zulu24/3/1/5.png.bin differ diff --git a/maps/zulu24/zulu24/3/2/0.png b/maps/zulu24/zulu24/3/2/0.png new file mode 100644 index 0000000..04bb534 Binary files /dev/null and b/maps/zulu24/zulu24/3/2/0.png differ diff --git a/maps/zulu24/zulu24/3/2/0.png.bin b/maps/zulu24/zulu24/3/2/0.png.bin new file mode 100644 index 0000000..a6538b0 Binary files /dev/null and b/maps/zulu24/zulu24/3/2/0.png.bin differ diff --git a/maps/zulu24/zulu24/3/2/1.png b/maps/zulu24/zulu24/3/2/1.png new file mode 100644 index 0000000..0648dbb Binary files /dev/null and b/maps/zulu24/zulu24/3/2/1.png differ diff --git a/maps/zulu24/zulu24/3/2/1.png.bin b/maps/zulu24/zulu24/3/2/1.png.bin new file mode 100644 index 0000000..31719c3 Binary files /dev/null and b/maps/zulu24/zulu24/3/2/1.png.bin differ diff --git a/maps/zulu24/zulu24/3/2/2.png b/maps/zulu24/zulu24/3/2/2.png new file mode 100644 index 0000000..421a97d Binary files /dev/null and b/maps/zulu24/zulu24/3/2/2.png differ diff --git a/maps/zulu24/zulu24/3/2/2.png.bin b/maps/zulu24/zulu24/3/2/2.png.bin new file mode 100644 index 0000000..9f103b0 Binary files /dev/null and b/maps/zulu24/zulu24/3/2/2.png.bin differ diff --git a/maps/zulu24/zulu24/3/2/3.png b/maps/zulu24/zulu24/3/2/3.png new file mode 100644 index 0000000..e7e495a Binary files /dev/null and b/maps/zulu24/zulu24/3/2/3.png differ diff --git a/maps/zulu24/zulu24/3/2/3.png.bin b/maps/zulu24/zulu24/3/2/3.png.bin new file mode 100644 index 0000000..3ba126c Binary files /dev/null and b/maps/zulu24/zulu24/3/2/3.png.bin differ diff --git a/maps/zulu24/zulu24/3/2/4.png b/maps/zulu24/zulu24/3/2/4.png new file mode 100644 index 0000000..1897856 Binary files /dev/null and b/maps/zulu24/zulu24/3/2/4.png differ diff --git a/maps/zulu24/zulu24/3/2/4.png.bin b/maps/zulu24/zulu24/3/2/4.png.bin new file mode 100644 index 0000000..1ef4888 Binary files /dev/null and b/maps/zulu24/zulu24/3/2/4.png.bin differ diff --git a/maps/zulu24/zulu24/3/2/5.png b/maps/zulu24/zulu24/3/2/5.png new file mode 100644 index 0000000..098e925 Binary files /dev/null and b/maps/zulu24/zulu24/3/2/5.png differ diff --git a/maps/zulu24/zulu24/3/2/5.png.bin b/maps/zulu24/zulu24/3/2/5.png.bin new file mode 100644 index 0000000..0404b14 Binary files /dev/null and b/maps/zulu24/zulu24/3/2/5.png.bin differ diff --git a/maps/zulu24/zulu24/3/3/0.png b/maps/zulu24/zulu24/3/3/0.png new file mode 100644 index 0000000..a9a20db Binary files /dev/null and b/maps/zulu24/zulu24/3/3/0.png differ diff --git a/maps/zulu24/zulu24/3/3/0.png.bin b/maps/zulu24/zulu24/3/3/0.png.bin new file mode 100644 index 0000000..34e77ce Binary files /dev/null and b/maps/zulu24/zulu24/3/3/0.png.bin differ diff --git a/maps/zulu24/zulu24/3/3/1.png b/maps/zulu24/zulu24/3/3/1.png new file mode 100644 index 0000000..0ea92a8 Binary files /dev/null and b/maps/zulu24/zulu24/3/3/1.png differ diff --git a/maps/zulu24/zulu24/3/3/1.png.bin b/maps/zulu24/zulu24/3/3/1.png.bin new file mode 100644 index 0000000..664f671 Binary files /dev/null and b/maps/zulu24/zulu24/3/3/1.png.bin differ diff --git a/maps/zulu24/zulu24/3/3/2.png b/maps/zulu24/zulu24/3/3/2.png new file mode 100644 index 0000000..c92a7d3 Binary files /dev/null and b/maps/zulu24/zulu24/3/3/2.png differ diff --git a/maps/zulu24/zulu24/3/3/2.png.bin b/maps/zulu24/zulu24/3/3/2.png.bin new file mode 100644 index 0000000..bbd3026 Binary files /dev/null and b/maps/zulu24/zulu24/3/3/2.png.bin differ diff --git a/maps/zulu24/zulu24/3/3/3.png b/maps/zulu24/zulu24/3/3/3.png new file mode 100644 index 0000000..fe45277 Binary files /dev/null and b/maps/zulu24/zulu24/3/3/3.png differ diff --git a/maps/zulu24/zulu24/3/3/3.png.bin b/maps/zulu24/zulu24/3/3/3.png.bin new file mode 100644 index 0000000..3dd0b61 Binary files /dev/null and b/maps/zulu24/zulu24/3/3/3.png.bin differ diff --git a/maps/zulu24/zulu24/3/3/4.png b/maps/zulu24/zulu24/3/3/4.png new file mode 100644 index 0000000..41fddb4 Binary files /dev/null and b/maps/zulu24/zulu24/3/3/4.png differ diff --git a/maps/zulu24/zulu24/3/3/4.png.bin b/maps/zulu24/zulu24/3/3/4.png.bin new file mode 100644 index 0000000..05f6a9a Binary files /dev/null and b/maps/zulu24/zulu24/3/3/4.png.bin differ diff --git a/maps/zulu24/zulu24/3/3/5.png b/maps/zulu24/zulu24/3/3/5.png new file mode 100644 index 0000000..750fe15 Binary files /dev/null and b/maps/zulu24/zulu24/3/3/5.png differ diff --git a/maps/zulu24/zulu24/3/3/5.png.bin b/maps/zulu24/zulu24/3/3/5.png.bin new file mode 100644 index 0000000..0fd5e62 Binary files /dev/null and b/maps/zulu24/zulu24/3/3/5.png.bin differ diff --git a/maps/zulu24/zulu24/3/4/0.png b/maps/zulu24/zulu24/3/4/0.png new file mode 100644 index 0000000..53b7d6b Binary files /dev/null and b/maps/zulu24/zulu24/3/4/0.png differ diff --git a/maps/zulu24/zulu24/3/4/0.png.bin b/maps/zulu24/zulu24/3/4/0.png.bin new file mode 100644 index 0000000..8e14009 Binary files /dev/null and b/maps/zulu24/zulu24/3/4/0.png.bin differ diff --git a/maps/zulu24/zulu24/3/4/1.png b/maps/zulu24/zulu24/3/4/1.png new file mode 100644 index 0000000..c5ab6b5 Binary files /dev/null and b/maps/zulu24/zulu24/3/4/1.png differ diff --git a/maps/zulu24/zulu24/3/4/1.png.bin b/maps/zulu24/zulu24/3/4/1.png.bin new file mode 100644 index 0000000..9888874 Binary files /dev/null and b/maps/zulu24/zulu24/3/4/1.png.bin differ diff --git a/maps/zulu24/zulu24/3/4/2.png b/maps/zulu24/zulu24/3/4/2.png new file mode 100644 index 0000000..b026f5f Binary files /dev/null and b/maps/zulu24/zulu24/3/4/2.png differ diff --git a/maps/zulu24/zulu24/3/4/2.png.bin b/maps/zulu24/zulu24/3/4/2.png.bin new file mode 100644 index 0000000..399ad8d Binary files /dev/null and b/maps/zulu24/zulu24/3/4/2.png.bin differ diff --git a/maps/zulu24/zulu24/3/4/3.png b/maps/zulu24/zulu24/3/4/3.png new file mode 100644 index 0000000..ca1b3bc Binary files /dev/null and b/maps/zulu24/zulu24/3/4/3.png differ diff --git a/maps/zulu24/zulu24/3/4/3.png.bin b/maps/zulu24/zulu24/3/4/3.png.bin new file mode 100644 index 0000000..bf67b33 Binary files /dev/null and b/maps/zulu24/zulu24/3/4/3.png.bin differ diff --git a/maps/zulu24/zulu24/3/4/4.png b/maps/zulu24/zulu24/3/4/4.png new file mode 100644 index 0000000..e016691 Binary files /dev/null and b/maps/zulu24/zulu24/3/4/4.png differ diff --git a/maps/zulu24/zulu24/3/4/4.png.bin b/maps/zulu24/zulu24/3/4/4.png.bin new file mode 100644 index 0000000..c1ff6cc Binary files /dev/null and b/maps/zulu24/zulu24/3/4/4.png.bin differ diff --git a/maps/zulu24/zulu24/3/4/5.png b/maps/zulu24/zulu24/3/4/5.png new file mode 100644 index 0000000..f421c51 Binary files /dev/null and b/maps/zulu24/zulu24/3/4/5.png differ diff --git a/maps/zulu24/zulu24/3/4/5.png.bin b/maps/zulu24/zulu24/3/4/5.png.bin new file mode 100644 index 0000000..418fd36 Binary files /dev/null and b/maps/zulu24/zulu24/3/4/5.png.bin differ diff --git a/maps/zulu24/zulu24/3/5/0.png b/maps/zulu24/zulu24/3/5/0.png new file mode 100644 index 0000000..0cfc832 Binary files /dev/null and b/maps/zulu24/zulu24/3/5/0.png differ diff --git a/maps/zulu24/zulu24/3/5/0.png.bin b/maps/zulu24/zulu24/3/5/0.png.bin new file mode 100644 index 0000000..51b138b Binary files /dev/null and b/maps/zulu24/zulu24/3/5/0.png.bin differ diff --git a/maps/zulu24/zulu24/3/5/1.png b/maps/zulu24/zulu24/3/5/1.png new file mode 100644 index 0000000..2c8d08a Binary files /dev/null and b/maps/zulu24/zulu24/3/5/1.png differ diff --git a/maps/zulu24/zulu24/3/5/1.png.bin b/maps/zulu24/zulu24/3/5/1.png.bin new file mode 100644 index 0000000..f835a8f Binary files /dev/null and b/maps/zulu24/zulu24/3/5/1.png.bin differ diff --git a/maps/zulu24/zulu24/3/5/2.png b/maps/zulu24/zulu24/3/5/2.png new file mode 100644 index 0000000..a3f5f57 Binary files /dev/null and b/maps/zulu24/zulu24/3/5/2.png differ diff --git a/maps/zulu24/zulu24/3/5/2.png.bin b/maps/zulu24/zulu24/3/5/2.png.bin new file mode 100644 index 0000000..a047936 Binary files /dev/null and b/maps/zulu24/zulu24/3/5/2.png.bin differ diff --git a/maps/zulu24/zulu24/3/5/3.png b/maps/zulu24/zulu24/3/5/3.png new file mode 100644 index 0000000..aed113e Binary files /dev/null and b/maps/zulu24/zulu24/3/5/3.png differ diff --git a/maps/zulu24/zulu24/3/5/3.png.bin b/maps/zulu24/zulu24/3/5/3.png.bin new file mode 100644 index 0000000..6535101 Binary files /dev/null and b/maps/zulu24/zulu24/3/5/3.png.bin differ diff --git a/maps/zulu24/zulu24/3/5/4.png b/maps/zulu24/zulu24/3/5/4.png new file mode 100644 index 0000000..7dcfa5f Binary files /dev/null and b/maps/zulu24/zulu24/3/5/4.png differ diff --git a/maps/zulu24/zulu24/3/5/4.png.bin b/maps/zulu24/zulu24/3/5/4.png.bin new file mode 100644 index 0000000..c99d5fa Binary files /dev/null and b/maps/zulu24/zulu24/3/5/4.png.bin differ diff --git a/maps/zulu24/zulu24/3/5/5.png b/maps/zulu24/zulu24/3/5/5.png new file mode 100644 index 0000000..933d8d3 Binary files /dev/null and b/maps/zulu24/zulu24/3/5/5.png differ diff --git a/maps/zulu24/zulu24/3/5/5.png.bin b/maps/zulu24/zulu24/3/5/5.png.bin new file mode 100644 index 0000000..0918619 Binary files /dev/null and b/maps/zulu24/zulu24/3/5/5.png.bin differ diff --git a/maps/zulu24/zulu24/3/6/0.png b/maps/zulu24/zulu24/3/6/0.png new file mode 100644 index 0000000..2c36d4e Binary files /dev/null and b/maps/zulu24/zulu24/3/6/0.png differ diff --git a/maps/zulu24/zulu24/3/6/0.png.bin b/maps/zulu24/zulu24/3/6/0.png.bin new file mode 100644 index 0000000..4b4e4f6 Binary files /dev/null and b/maps/zulu24/zulu24/3/6/0.png.bin differ diff --git a/maps/zulu24/zulu24/3/6/1.png b/maps/zulu24/zulu24/3/6/1.png new file mode 100644 index 0000000..4894c58 Binary files /dev/null and b/maps/zulu24/zulu24/3/6/1.png differ diff --git a/maps/zulu24/zulu24/3/6/1.png.bin b/maps/zulu24/zulu24/3/6/1.png.bin new file mode 100644 index 0000000..ae3dd1c Binary files /dev/null and b/maps/zulu24/zulu24/3/6/1.png.bin differ diff --git a/maps/zulu24/zulu24/3/6/2.png b/maps/zulu24/zulu24/3/6/2.png new file mode 100644 index 0000000..5a938b0 Binary files /dev/null and b/maps/zulu24/zulu24/3/6/2.png differ diff --git a/maps/zulu24/zulu24/3/6/2.png.bin b/maps/zulu24/zulu24/3/6/2.png.bin new file mode 100644 index 0000000..775be61 Binary files /dev/null and b/maps/zulu24/zulu24/3/6/2.png.bin differ diff --git a/maps/zulu24/zulu24/3/6/3.png b/maps/zulu24/zulu24/3/6/3.png new file mode 100644 index 0000000..aa1e24e Binary files /dev/null and b/maps/zulu24/zulu24/3/6/3.png differ diff --git a/maps/zulu24/zulu24/3/6/3.png.bin b/maps/zulu24/zulu24/3/6/3.png.bin new file mode 100644 index 0000000..81d844d Binary files /dev/null and b/maps/zulu24/zulu24/3/6/3.png.bin differ diff --git a/maps/zulu24/zulu24/3/6/4.png b/maps/zulu24/zulu24/3/6/4.png new file mode 100644 index 0000000..76185e1 Binary files /dev/null and b/maps/zulu24/zulu24/3/6/4.png differ diff --git a/maps/zulu24/zulu24/3/6/4.png.bin b/maps/zulu24/zulu24/3/6/4.png.bin new file mode 100644 index 0000000..362e8a0 Binary files /dev/null and b/maps/zulu24/zulu24/3/6/4.png.bin differ diff --git a/maps/zulu24/zulu24/3/6/5.png b/maps/zulu24/zulu24/3/6/5.png new file mode 100644 index 0000000..532334e Binary files /dev/null and b/maps/zulu24/zulu24/3/6/5.png differ diff --git a/maps/zulu24/zulu24/3/6/5.png.bin b/maps/zulu24/zulu24/3/6/5.png.bin new file mode 100644 index 0000000..d92eccd Binary files /dev/null and b/maps/zulu24/zulu24/3/6/5.png.bin differ diff --git a/maps/zulu24/zulu24/leaflet.html b/maps/zulu24/zulu24/leaflet.html new file mode 100644 index 0000000..67a204d --- /dev/null +++ b/maps/zulu24/zulu24/leaflet.html @@ -0,0 +1,56 @@ + + + + zulu24 + + + + + + + + + + +
+ + + + diff --git a/maps/zulu24/zulu24/metadata.json b/maps/zulu24/zulu24/metadata.json new file mode 100644 index 0000000..5b0caa9 --- /dev/null +++ b/maps/zulu24/zulu24/metadata.json @@ -0,0 +1,54 @@ +{ + "name": "zulu24", + "version": "1.1.0", + "description": "", + "attribution": "Rendered with MapTiler Desktop", + "type": "overlay", + "format": "png", + "minzoom": "0", + "maxzoom": "3", + "scale": "1.000000", + "bounds": [-74.10576163, 41.46198696, -74.09588036, 41.46770470], + "profile": "custom", + "crs": "EPSG:3857", + "proj4": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs", + "extent": [-8249415.64960000, 5080725.31638496, -8248315.67159606, 5081574.69940000], + "tile_matrix": [ + { + "id": "0", + "tile_size": [240, 240], + "origin": [-8249415.64960000, 5081574.69940000], + "extent": [-8249415.64960000, 5080725.31638496, -8248315.67159606, 5081574.69940000], + "pixel_size": [5.60000000, -5.60000000], + "matrix_size": [1, 1], + "scale_denominator": 20000.00000000 + }, + { + "id": "1", + "tile_size": [240, 240], + "origin": [-8249415.64960000, 5081574.69940000], + "extent": [-8249415.64960000, 5080725.31638496, -8248315.67159606, 5081574.69940000], + "pixel_size": [2.80000000, -2.80000000], + "matrix_size": [2, 2], + "scale_denominator": 10000.00000000 + }, + { + "id": "2", + "tile_size": [240, 240], + "origin": [-8249415.64960000, 5081574.69940000], + "extent": [-8249415.64960000, 5080725.31638496, -8248315.67159606, 5081574.69940000], + "pixel_size": [1.40000000, -1.40000000], + "matrix_size": [4, 3], + "scale_denominator": 5000.00000000 + }, + { + "id": "3", + "tile_size": [240, 240], + "origin": [-8249415.64960000, 5081574.69940000], + "extent": [-8249415.64960000, 5080725.31638496, -8248315.67159606, 5081574.69940000], + "pixel_size": [0.70000000, -0.70000000], + "matrix_size": [7, 6], + "scale_denominator": 2500.00000000 + } +] +} diff --git a/maps/zulu24/zulu24/openlayers.html b/maps/zulu24/zulu24/openlayers.html new file mode 100644 index 0000000..948ef02 --- /dev/null +++ b/maps/zulu24/zulu24/openlayers.html @@ -0,0 +1,70 @@ + + + +zulu24 + + + + + + + + + + +
+ + + + diff --git a/partition-table.csv b/partition-table.csv new file mode 100644 index 0000000..589682a --- /dev/null +++ b/partition-table.csv @@ -0,0 +1,8 @@ +# FIXME! using the genpartitions based table doesn't work on TTGO so for now I stay with my old memory map +# This is a layout for 4MB of flash +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x320000, +config, data, spiffs, 0x330000,0x00F000, +spiffs, data, spiffs, 0x33F000,0x0C1000, diff --git a/pcb/AirsoftTracker 1.4/AirsoftTracker 1.1.json b/pcb/AirsoftTracker 1.4/AirsoftTracker 1.1.json new file mode 100644 index 0000000..cd59ba0 --- /dev/null +++ b/pcb/AirsoftTracker 1.4/AirsoftTracker 1.1.json @@ -0,0 +1 @@ +{"editorVersion":"6.4.7","docType":"5","title":"AirsoftTracker","description":"","colors":{},"schematics":[{"uuid":"6f6c619985c05af110033efcbbf3cf63","docType":"1","title":"MainSheet","description":"","dataStr":{"head":{"docType":"1","editorVersion":"6.4.16","newgId":true,"c_para":{"Prefix Start":"1"},"c_spiceCmd":"null","hasIdFlag":true,"uuid":"6f6c619985c05af110033efcbbf3cf63","x":"0","y":"0","portOfADImportHack":"","importFlag":0,"transformList":""},"canvas":"CA~1000~1000~#FFFFFF~yes~#CCCCCC~5~1000~1000~line~5~pixel~5~0~0","shape":["LIB~0~-806~package`NONE`BOM_Manufacturer Part`?`spicePre`.`~~0~frame_lib_1~~~0~~yes~yes#@$T~N~570.5~-809~0~#000080~Arial~~~~~comment~A~0~start~gge77~0~#@$PT~M 206 -796 L 206 -806 M 206 -10 L 206 0 M 402 -796 L 402 -806 M 402 -10 L 402 0 M 598 -796 L 598 -806 M 598 -10 L 598 0 M 794 -796 L 794 -806 M 794 -10 L 794 0 M 990 -796 L 990 -806 M 990 -10 L 990 0 M 10 -600 L 0 -600 M 1139 -600 L 1149 -600 M 10 -404 L 0 -404 M 1139 -404 L 1149 -404 M 10 -208 L 0 -208 M 1139 -208 L 1149 -208 M 10 -12 L 0 -12 M 1139 -12 L 1149 -12~#880000~1~0~none~gge6~0~frame_tick#@$T~P~571.5~-818~0~#000080~Arial~~~~~comment~A~0~start~gge76~0~#@$T~L~1.5~-698~0~#880000~~~~~~comment~A~1~start~gge7~0~frame_tick#@$T~L~1140.5~-698~0~#880000~~~~~~comment~A~1~start~gge9~0~frame_tick#@$T~L~1.5~-502~0~#880000~~~~~~comment~B~1~start~gge11~0~frame_tick#@$T~L~1140.5~-502~0~#880000~~~~~~comment~B~1~start~gge13~0~frame_tick#@$T~L~1.5~-306~0~#880000~~~~~~comment~C~1~start~gge15~0~frame_tick#@$T~L~1140.5~-306~0~#880000~~~~~~comment~C~1~start~gge17~0~frame_tick#@$T~L~1.5~-110~0~#880000~~~~~~comment~D~1~start~gge19~0~frame_tick#@$T~L~1140.5~-110~0~#880000~~~~~~comment~D~1~start~gge21~0~frame_tick#@$T~L~108~-797.5~0~#880000~~~~~~comment~1~1~start~gge23~0~frame_tick#@$T~L~108~-1.5~0~#880000~~~~~~comment~1~1~start~gge25~0~frame_tick#@$T~L~304~-797.5~0~#880000~~~~~~comment~2~1~start~gge27~0~frame_tick#@$T~L~304~-1.5~0~#880000~~~~~~comment~2~1~start~gge29~0~frame_tick#@$T~L~500~-797.5~0~#880000~~~~~~comment~3~1~start~gge31~0~frame_tick#@$T~L~500~-1.5~0~#880000~~~~~~comment~3~1~start~gge33~0~frame_tick#@$T~L~696~-797.5~0~#880000~~~~~~comment~4~1~start~gge35~0~frame_tick#@$T~L~696~-1.5~0~#880000~~~~~~comment~4~1~start~gge37~0~frame_tick#@$T~L~892~-797.5~0~#880000~~~~~~comment~5~1~start~gge39~0~frame_tick#@$T~L~892~-1.5~0~#880000~~~~~~comment~5~1~start~gge?~0~frame_tick#@$R~10~-796~~~1129~786~#880000~1~0~none~gge42~0~frame_innerbox#@$R~0~-806~~~1149~806~#880000~1~0~none~gge43~0~frame_outbox#@$R~694.99995~-90~~~444~80~#880000~1~0~none~gge44~0~frame_hitarea#@$PL~695.1 -50.75 1138.63 -50.75~#880000~1~0~none~gge45~0#@$PL~799.63 -30.75 1138.63 -30.75~#880000~1~0~none~gge46~0#@$PL~1059.61 -89.93 1059.63 -50.75~#880000~1~0~none~gge47~0#@$PL~1059.63 -50.75 1059.63 -30.75~#880000~1~0~none~gge48~0#@$T~L~699.99995~-77~0~#880000~~8pt~~~~comment~TITLE:~1~start~gge49~0~pinpart#@$T~L~757.62495~-64.41~0~#0000FF~~10pt~~~~comment~Airsoft Tracker~1~start~gge51~0~frame_title#@$T~L~1064.62495~-63.75~0~#880000~~8pt~~~~comment~REV:~1~start~gge53~0~pinpart#@$T~L~1102.62495~-63.75~0~#0000FF~~9pt~~~~comment~1.0~1~start~gge55~0~frame_version#@$T~L~804.62495~-15~0~#880000~~8pt~~~~comment~Date:~1~start~gge57~0~pinpart#@$T~L~851.62495~-14.52~0~#0000FF~~9pt~~~~comment~2021-01-15~1~start~gge59~0~frame_date#@$T~L~1063.62495~-35~0~#880000~~8pt~~~~comment~Sheet:~1~start~gge61~0~pinpart#@$T~L~1108.62495~-34.52~0~#0000FF~~9pt~~~~comment~1/1~1~start~gge63~0~frame_sheet#@$T~L~943.62495~-14.75~0~#880000~~8pt~~~~comment~Drawn By:~1~start~gge65~0~pinpart#@$T~L~1008.63~-14.75~0~#0000FF~~9pt~~~~comment~ddv2020~1~start~gge67~0~frame_drawn#@$T~L~804.62495~-36.75~0~#880000~~8pt~~~~comment~Company:~1~start~gge69~0~pinpart#@$T~L~871.24995~-36.64~0~#0000FF~~9pt~~~~comment~DDV~1~start~gge71~0~frame_company#@$PL~799.63 -50.75 799.63 -10.75~#880000~1~0~none~gge73~0#@$Pimage~L~1~gge74~0~gge75~694.99995~-38~104~20~data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0i5Zu+5bGCXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNTIwIg0KCSB2aWV3Qm94PSIwIDAgMTY5Mi45IDM0MS41IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxNjkyLjkgMzQxLjU7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiM1NTg4RkY7fQ0KPC9zdHlsZT4NCjxnPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik05MDEuNywxNjEuMWMyLjMtMS44LDUuMS0yLjcsOC4zLTIuN2M0LjMsMCw4LjksMS42LDEzLjgsNC43YzQuOSwzLjEsOS42LDgsMTQuMSwxNC43bDE3LjQtMjcuOQ0KCQljLTUuNC03LjgtMTIuMS0xMy45LTIwLjItMTguMmMtOC4xLTQuMy0xNi43LTYuNC0yNS43LTYuNGMtMTIuOCwwLTI0LDMuOS0zMy40LDExLjdjLTkuNCw3LjgtMTQuMSwxOC0xNC4xLDMwLjQNCgkJYzAsOC45LDMsMTcuNCw5LDI1LjRjNC4zLDUuNywxMi4xLDEyLjYsMjMuMywyMC42YzkuNyw2LjksMTUuNywxMS43LDE3LjksMTQuNGMyLjIsMi43LDMuMyw1LjMsMy4zLDcuOWMwLDMuMi0xLjQsNS45LTQuMyw4LjMNCgkJYy0yLjksMi4zLTYuNywzLjUtMTEuNSwzLjVjLTEyLjEsMC0yMy4zLTYuNy0zMy41LTIwLjJsLTIyLjUsMjYuMmMxMCwxMC42LDE5LjEsMTgsMjcuMiwyMmM4LjEsNCwxNy4yLDYsMjcuMSw2DQoJCWMxNy4yLDAsMzAuMy00LjksMzkuNC0xNC43YzkuMS05LjgsMTMuNi0yMC4zLDEzLjYtMzEuM2MwLTguNC0yLjItMTYuMS02LjYtMjMuM2MtNC40LTcuMS0xMy42LTE1LjctMjcuNi0yNS43DQoJCWMtOC44LTYuMy0xNC0xMC41LTE1LjctMTIuN2MtMS44LTIuMi0yLjctNC40LTIuNy02LjZDODk4LjIsMTY0LjksODk5LjQsMTYyLjksOTAxLjcsMTYxLjF6Ii8+DQoJPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxMDM4LjcsMjE3LjIgMTAwOS44LDEyOS4xIDk3NCwxMjkuMSAxMDE1LjgsMjU3LjQgOTczLjYsMzMyIDEwMTIuMSwzMzIgMTEyOC44LDEyOS4xIDEwODkuNSwxMjkuMSAJDQoJCSIvPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02NTEuNSwxNTQuMWwtNzAuNCwwbDUuOC00MS43YzAsMCw3NC43LTAuMSw3NS4xLTAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44YzAtOS44LTgtMTcuOC0xNy44LTE3LjgNCgkJYy0wLjMsMC0xMDguNCwwLTEwOC40LDBMNTI2LDI3Ny43aDExMy4ydjBjOS41LTAuMiwxNy4yLTgsMTcuMi0xNy41YzAtOS43LTcuOS0xNy42LTE3LjYtMTcuNmMtMC40LDAtNzAuMiwwLjEtNzAuMiwwLjFsNy40LTUzLjMNCgkJYzAsMCw3MS43LDAuMSw3Mi4zLDAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44QzY2Ni4zLDE2Mi44LDY1OS45LDE1NS41LDY1MS41LDE1NC4xeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMjY4LjQsNzYuOGMtMC4zLDAtMTA4LjQsMC0xMDguNCwwbC0yNy40LDIwMC44aDExMy4zdjBjOS41LTAuMiwxNy4yLTgsMTcuMi0xNy41YzAtOS43LTcuOS0xNy42LTE3LjYtMTcuNg0KCQljLTAuNCwwLTcwLjIsMC4xLTcwLjIsMC4xbDcuNC01My4zYzAsMCw3MS43LDAuMSw3Mi40LDAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44YzAtOC44LTYuNC0xNi4xLTE0LjgtMTcuNWwtNzAuNCwwbDUuOC00MS43DQoJCWMwLDAsNzQuNy0wLjEsNzUuMS0wLjFjOS44LDAsMTcuOC04LDE3LjgtMTcuOEMxMjg2LjIsODQuOCwxMjc4LjMsNzYuOCwxMjY4LjQsNzYuOHoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTQ3MC43LDE3M2MwLTE5LjctNC42LTM3LjItMTMuNy01Mi4zYy05LjEtMTUuMS0yMC45LTI2LjItMzUuNS0zMy4yYy0xNC42LTcuMS0zNi43LTEwLjYtNjYuNi0xMC42aC0zMS44DQoJCWwtMjcuNCwyMDAuOGg2Mi40YzI2LjIsMCw0Ni43LTMuOSw2MS40LTExLjdjMTQuNy03LjgsMjctMjAuMiwzNi43LTM3LjFDMTQ2NS45LDIxMS45LDE0NzAuNywxOTMuMywxNDcwLjcsMTczeiBNMTQyMS4zLDIxNC41DQoJCWMtNy4zLDExLTE2LjksMTguOC0yOC45LDIzLjNjLTguNiwzLjItMjIuNCw0LjgtNDEuNSw0LjhoLTEyLjRsMTcuNy0xMzAuNGg5LjVjMTUuNSwwLDI3LjksMi40LDM3LjIsNy4zDQoJCWM5LjMsNC45LDE2LjUsMTEuOCwyMS43LDIwLjhjNS4xLDksNy43LDIwLjEsNy43LDMzLjRDMTQzMi4yLDE4OS44LDE0MjguNiwyMDMuNSwxNDIxLjMsMjE0LjV6Ii8+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTE2MTkuMiwxNzAuN2wtMjIuMywxMi4zYy0xLjgsMTYuMi0xNS42LDI4LjctMzIuMiwyOC43Yy0xNy45LDAtMzIuNC0xNC41LTMyLjQtMzIuNA0KCQljMC0xNy45LDE0LjUtMzIuNCwzMi40LTMyLjRjNi45LDAsMTMuMywyLjIsMTguNSw1LjhsMjcuNy0xNS4zbC0xNS02MC4yaC0zMS43bC0xMDgsMjAwaDQwLjRsMjIuOC00Mi42aDc5LjRsMTAuNiw0Mi42aDM2LjQNCgkJTDE2MTkuMiwxNzAuN3oiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTU1Mi44LDE3OC41YzAsNi45LDUuNiwxMi41LDEyLjUsMTIuNWM2LjksMCwxMi41LTUuNiwxMi41LTEyLjVjMC02LjktNS42LTEyLjUtMTIuNS0xMi41DQoJCUMxNTU4LjQsMTY2LDE1NTIuOCwxNzEuNiwxNTUyLjgsMTc4LjV6Ii8+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTgxNC44LDE1Mi41QzgxNC44LDE1Mi41LDgxNC44LDE1Mi40LDgxNC44LDE1Mi41bC0xMi41LDBsLTEuMy0yLjRjLTUuMS04LjEtMTEuNS0xNC4yLTE5LjItMTguNA0KCQljLTcuOC00LjItMjAuMS02LjMtMjkuMy02LjNjLTEzLjcsMC0yNi44LDMuNy0zOS4zLDExLjFjLTEyLjUsNy40LTIyLjUsMTcuNy0yOS45LDMxYy03LjQsMTMuMi0xMS4yLDI3LjItMTEuMiw0MS44DQoJCWMwLDE5LjIsNS44LDM2LDE3LjQsNTAuNWMxMS42LDE0LjUsMjcuMywyMS43LDQ3LDIxLjdjOC42LDAsMTYuMy0xLjQsMjMuMi00LjRjNi45LTIuOSwxNC4zLTgsMjIuMi0xNS40YzAsMCw5LjMsOC4xLDkuNCw4DQoJCWM1LjgsNC42LDEzLDcuNSwyMC44LDhoMy42bDAuNS00LjNsMTIuNy0xMDYuOWMtMC4xLDAtMC4xLDAtMC4yLDBDODI4LjcsMTU4LjgsODIyLjUsMTUyLjYsODE0LjgsMTUyLjV6IE03ODUuNiwyMjQuMg0KCQljLTQuNSw4LjUtMTAuMSwxNC44LTE2LjgsMTguOGMtNi43LDQtMTQuNSw2LTIzLjUsNmMtMTAuOCwwLTE5LjYtMy41LTI2LjUtMTAuN2MtNi45LTcuMS0xMC4zLTE2LjUtMTAuMy0yOC4xDQoJCWMwLTE1LjEsNC41LTI3LjQsMTMuNi0zN2M5LjEtOS42LDIwLjEtMTQuMywzMy4xLTE0LjNjMTEuMiwwLDIwLjIsMy42LDI3LDEwLjdjNi44LDcuMiwxMC4yLDE2LjYsMTAuMiwyOC40DQoJCUM3OTIuNCwyMDYuOSw3OTAuMSwyMTUuNyw3ODUuNiwyMjQuMnoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNNDA0LjMsOTYuM2MtNy41LTE5LjktMTkuNy0zNy44LTM1LjgtNTIuM2MtMjQuNy0yMi4yLTU2LjctMzQuNS05MC0zNC41Yy0yOC44LDAtNTYuMyw5LTc5LjUsMjYNCgkJYy0xMS4yLDguMi0yMC45LDE3LjktMjguOSwyOC45Yy01LTAuNy0xMC4xLTEuMS0xNS4zLTEuMWMtMjguNywwLTU1LjgsMTEuMi03Ni4xLDMxLjVjLTIwLjMsMjAuMy0zMS41LDQ3LjMtMzEuNSw3Ni4xDQoJCWMwLDI2LjcsOS45LDUyLjMsMjcuOCw3Mi4xYzE0LjIsMTUuNywzMi42LDI2LjgsNTIuOSwzMmM4LjgsMjYuMiwzMy42LDQ1LjEsNjIuNyw0NS4xYzM2LjUsMCw2Ni4yLTI5LjcsNjYuMi02Ni4yDQoJCWMwLTIuMS0wLjEtNC4zLTAuMy02LjRsOTIuOS00OC44bC0yMC4zLTM1LjJsLTg4LjgsNDYuNmMtMTIuMS0xMy44LTI5LjktMjIuNS00OS43LTIyLjVjLTI4LjcsMC01My4yLDE4LjQtNjIuNCw0NA0KCQljLTIzLjQtMTAuMy0zOS44LTMzLjYtMzkuOC02MC44YzAtMzYuNiwyOS43LTY2LjQsNjYuNC02Ni40YzEyLjksMCwyNSwzLjcsMzUuMiwxMC4xYzEyLjMtMzcuMSw0Ny4zLTYzLjksODguNS02My45DQoJCWM0OCwwLDg3LjQsMzYuMiw5Mi43LDgyLjdjMS43LTAuMiwzLjQtMC4zLDUuMS0wLjNjMjguNywwLDUyLDIzLjMsNTIsNTJjMCwyNy4yLTIwLjksNDkuNS00Ny41LDUxLjhsLTI5LjcsMA0KCQljLTEuMy0wLjMtMi43LTAuNC00LjEtMC40Yy0xMS41LDAtMjAuOCw5LjMtMjAuOCwyMC44YzAsMTAuOSw4LjQsMTkuOCwxOS4xLDIwLjd2MC4ybDM1LjUsMGwxLjgsMGwxLjgtMC4yDQoJCWMyMy4yLTIsNDQuNy0xMi41LDYwLjUtMjkuN2MxNS45LTE3LjMsMjQuNy0zOS43LDI0LjctNjMuMkM0NjkuNiwxNDMuNiw0NDIuMSwxMDguMiw0MDQuMyw5Ni4zeiBNMTkwLjYsMjI4LjMNCgkJYzE0LjEsMCwyNS42LDExLjUsMjUuNiwyNS42YzAsMTQuMS0xMS41LDI1LjYtMjUuNiwyNS42Yy0xNC4xLDAtMjUuNi0xMS41LTI1LjYtMjUuNkMxNjUsMjM5LjgsMTc2LjUsMjI4LjMsMTkwLjYsMjI4LjN6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==","LIB~505~-570~package`TTGO-T-BEAM-ESP32-CONNECTOR`BOM_Manufacturer``BOM_Manufacturer Part``BOM_Supplier Part``BOM_Supplier``link``Contributor`grizli2509`spicePre`U`spiceSymbolName`TTGO-BEAM-ESP32`Package Display`No`~~0~gge6aaff6c194964e3d~5180c2e0c1da4a75b575a8495aee30f2~5657e928f1504b21b9e68062d66ba3e3~0~~yes~yes#@$T~N~470.46~-721.7890625~0~#000080~Arial~~~~~comment~MAIN BOARD~1~start~gge857~0~#@$T~P~494.04~-732.125~0~#000080~Arial~~~~~comment~U1~1~start~gge859~0~#@$P~show~0~1~475~-700~~gge861~0^^475~-700^^M 475 -700 h -20~#880000^^1~453~-697~0~S_VP~end~~~#0000FF^^1~460~-701~0~S_VP~start~~~#0000FF^^0~458~-700^^0~M 455 -703 L 452 -700 L 455 -697#@$P~show~0~2~475~-680~~gge868~0^^475~-680^^M 475 -680 h -20~#880000^^1~453~-677~0~S_VN~end~~~#0000FF^^1~460~-681~0~S_VN~start~~~#0000FF^^0~458~-680^^0~M 455 -683 L 452 -680 L 455 -677#@$P~show~0~3~475~-660~~gge875~0^^475~-660^^M 475 -660 h -20~#880000^^1~453~-657~0~RST~end~~~#0000FF^^1~460~-661~0~RST~start~~~#0000FF^^0~458~-660^^0~M 455 -663 L 452 -660 L 455 -657#@$P~show~0~4~475~-640~~gge882~0^^475~-640^^M 475 -640 h -20~#880000^^1~453~-637~0~15~end~~~#0000FF^^1~460~-641~0~15~start~~~#0000FF^^0~458~-640^^0~M 455 -643 L 452 -640 L 455 -637#@$P~show~0~5~475~-620~~gge889~0^^475~-620^^M 475 -620 h -20~#880000^^1~453~-617~0~35~end~~~#0000FF^^1~460~-621~0~35~start~~~#0000FF^^0~458~-620^^0~M 455 -623 L 452 -620 L 455 -617#@$P~show~0~6~475~-600~~gge896~0^^475~-600^^M 475 -600 h -20~#880000^^1~453~-597~0~32~end~~~#0000FF^^1~460~-601~0~32~start~~~#0000FF^^0~458~-600^^0~M 455 -603 L 452 -600 L 455 -597#@$P~show~0~7~475~-580~~gge903~0^^475~-580^^M 475 -580 h -20~#880000^^1~453~-577~0~33~end~~~#0000FF^^1~460~-581~0~33~start~~~#0000FF^^0~458~-580^^0~M 455 -583 L 452 -580 L 455 -577#@$P~show~0~8~475~-560~~gge910~0^^475~-560^^M 475 -560 h -20~#880000^^1~453~-557~0~25~end~~~#0000FF^^1~460~-561~0~25~start~~~#0000FF^^0~458~-560^^0~M 455 -563 L 452 -560 L 455 -557#@$P~show~0~9~475~-540~~gge917~0^^475~-540^^M 475 -540 h -20~#880000^^1~453~-537~0~14~end~~~#0000FF^^1~460~-541~0~14~start~~~#0000FF^^0~458~-540^^0~M 455 -543 L 452 -540 L 455 -537#@$P~show~0~10~475~-520~~gge924~0^^475~-520^^M 475 -520 h -20~#880000^^1~453~-517~0~13~end~~~#0000FF^^1~460~-521~0~13~start~~~#0000FF^^0~458~-520^^0~M 455 -523 L 452 -520 L 455 -517#@$P~show~0~11~475~-500~~gge931~0^^475~-500^^M 475 -500 h -20~#880000^^1~453~-497~0~02~end~~~#0000FF^^1~460~-501~0~02~start~~~#0000FF^^0~458~-500^^0~M 455 -503 L 452 -500 L 455 -497#@$P~show~0~12~475~-480~~gge938~0^^475~-480^^M 475 -480 h -20~#880000^^1~453~-477~0~GND~end~~~#0000FF^^1~460~-481~0~GND_3~start~~~#0000FF^^0~458~-480^^0~M 455 -483 L 452 -480 L 455 -477#@$P~show~0~13~475~-460~~gge945~0^^475~-460^^M 475 -460 h -20~#880000^^1~453~-457~0~5V~end~~~#0000FF^^1~460~-461~0~5V~start~~~#0000FF^^0~458~-460^^0~M 455 -463 L 452 -460 L 455 -457#@$P~show~0~14~515~-460~180~gge952~0^^515~-460^^M 515 -460 h 20~#880000^^1~537~-457~0~LORA1~start~~~#0000FF^^1~530~-461~0~LORA1~end~~~#0000FF^^0~532~-460^^0~M 535 -457 L 538 -460 L 535 -463#@$P~show~0~15~515~-480~180~gge959~0^^515~-480^^M 515 -480 h 20~#880000^^1~537~-477~0~LORA2~start~~~#0000FF^^1~530~-481~0~LORA2~end~~~#0000FF^^0~532~-480^^0~M 535 -477 L 538 -480 L 535 -483#@$P~show~0~16~515~-500~180~gge966~0^^515~-500^^M 515 -500 h 20~#880000^^1~537~-497~0~3V3~start~~~#0000FF^^1~528.33~-501~0~3V3_2~end~~~#0000FF^^0~532~-500^^0~M 535 -497 L 538 -500 L 535 -503#@$P~show~0~17~515~-520~180~gge973~0^^515~-520^^M 515 -520 h 20~#880000^^1~537~-517~0~21~start~~~#0000FF^^1~527.5~-521~0~21~end~~~#0000FF^^0~532~-520^^0~M 535 -517 L 538 -520 L 535 -523#@$P~show~0~18~515~-540~180~gge980~0^^515~-540^^M 515 -540 h 20~#880000^^1~537~-537~0~22~start~~~#0000FF^^1~530~-541~0~22~end~~~#0000FF^^0~532~-540^^0~M 535 -537 L 538 -540 L 535 -543#@$P~show~0~19~515~-560~180~gge987~0^^515~-560^^M 515 -560 h 20~#880000^^1~537~-557~0~GND~start~~~#0000FF^^1~530~-561~0~GND_2~end~~~#0000FF^^0~532~-560^^0~M 535 -557 L 538 -560 L 535 -563#@$P~show~0~20~515~-580~180~gge994~0^^515~-580^^M 515 -580 h 20~#880000^^1~537~-577~0~3V3~start~~~#0000FF^^1~530~-581~0~3V3_1~end~~~#0000FF^^0~532~-580^^0~M 535 -577 L 538 -580 L 535 -583#@$P~show~0~21~515~-600~180~gge1001~0^^515~-600^^M 515 -600 h 20~#880000^^1~537~-597~0~GND~start~~~#0000FF^^1~530~-601~0~GND_1~end~~~#0000FF^^0~532~-600^^0~M 535 -597 L 538 -600 L 535 -603#@$P~show~0~22~515~-620~180~gge1008~0^^515~-620^^M 515 -620 h 20~#880000^^1~537~-617~0~0~start~~~#0000FF^^1~530~-621~0~0~end~~~#0000FF^^0~532~-620^^0~M 535 -617 L 538 -620 L 535 -623#@$P~show~0~23~515~-640~180~gge1015~0^^515~-640^^M 515 -640 h 20~#880000^^1~537~-637~0~4~start~~~#0000FF^^1~530~-641~0~4~end~~~#0000FF^^0~532~-640^^0~M 535 -637 L 538 -640 L 535 -643#@$P~show~0~24~515~-660~180~gge1022~0^^515~-660^^M 515 -660 h 20~#880000^^1~537~-657~0~23~start~~~#0000FF^^1~530~-661~0~23~end~~~#0000FF^^0~532~-660^^0~M 535 -657 L 538 -660 L 535 -663#@$P~show~0~25~515~-680~180~gge1029~0^^515~-680^^M 515 -680 h 20~#880000^^1~537~-677~0~RX~start~~~#0000FF^^1~530~-681~0~RX~end~~~#0000FF^^0~532~-680^^0~M 535 -677 L 538 -680 L 535 -683#@$P~show~0~26~515~-700~180~gge1036~0^^515~-700^^M 515 -700 h 20~#880000^^1~537~-697~0~TX~start~~~#0000FF^^1~530~-701~0~TX~end~~~#0000FF^^0~532~-700^^0~M 535 -697 L 538 -700 L 535 -703#@$R~415~-720~~~170~290~#000000~1~0~none~gge1043~0~","LIB~750~-375~package`MCP23017`BOM_Manufacturer``BOM_Manufacturer Part`MCP23017`BOM_Supplier Part``BOM_Supplier``link``Contributor`emmanuel.malosse`spicePre`U`spiceSymbolName`MCP23017`~~0~ggeb1124de9a27319d1~f09420c4fd9946a583a6b15c1c5a483e~0f118b0d9063400da84e04b55532a171~0~~yes~yes#@$T~N~744.03125~-468.296875~0~#000080~Arial~~~~~comment~MCP23017~1~start~gge3184~0~#@$T~P~744.0390625~-477.421875~0~#000080~Arial~~~~~comment~U3~1~start~gge3186~0~#@$P~show~0~1~680~-455~180~gge3188~0^^680~-455^^M 680 -455 h 20~#880000^^1~702~-452~0~VCC~start~~~#0000FF^^1~695~-456~0~11~end~~~#0000FF^^0~697~-455^^0~M 700 -452 L 703 -455 L 700 -458#@$P~show~0~2~680~-445~180~gge3195~0^^680~-445^^M 680 -445 h 20~#880000^^1~702~-442~0~VCC~start~~~#0000FF^^1~695~-446~0~10~end~~~#0000FF^^0~697~-445^^0~M 700 -442 L 703 -445 L 700 -448#@$P~show~0~3~680~-405~180~gge3202~0^^680~-405^^M 680 -405 h 20~#880000^^1~702~-402~0~A0~start~~~#0000FF^^1~695~-406~0~3~end~~~#0000FF^^0~697~-405^^0~M 700 -402 L 703 -405 L 700 -408#@$P~show~0~4~680~-395~180~gge3209~0^^680~-395^^M 680 -395 h 20~#880000^^1~702~-392~0~A1~start~~~#0000FF^^1~695~-396~0~2~end~~~#0000FF^^0~697~-395^^0~M 700 -392 L 703 -395 L 700 -398#@$P~show~0~5~680~-385~180~gge3216~0^^680~-385^^M 680 -385 h 20~#880000^^1~702~-382~0~A2~start~~~#0000FF^^1~695~-386~0~1~end~~~#0000FF^^0~697~-385^^0~M 700 -382 L 703 -385 L 700 -388#@$P~show~0~6~680~-375~180~gge3223~0^^680~-375^^M 680 -375 h 20~#880000^^1~702~-372~0~Reset~start~~~#0000FF^^1~695~-376~0~4~end~~~#0000FF^^0~697~-375^^0~M 700 -372 L 703 -375 L 700 -378#@$P~show~0~7~680~-355~180~gge3230~0^^680~-355^^M 680 -355 h 20~#880000^^1~702~-352~0~SO~start~~~#0000FF^^1~695~-356~0~5~end~~~#0000FF^^0~697~-355^^0~M 700 -352 L 703 -355 L 700 -358#@$P~show~0~8~680~-345~180~gge3237~0^^680~-345^^M 680 -345 h 20~#880000^^1~702~-342~0~CS~start~~~#0000FF^^1~695~-346~0~6~end~~~#0000FF^^0~697~-345^^0~M 700 -342 L 703 -345 L 700 -348#@$P~show~0~9~680~-335~180~gge3244~0^^680~-335^^M 680 -335 h 20~#880000^^1~702~-332~0~SDA~start~~~#0000FF^^1~695~-336~0~7~end~~~#0000FF^^0~697~-335^^0~M 700 -332 L 703 -335 L 700 -338#@$P~show~0~10~680~-325~180~gge3251~0^^680~-325^^M 680 -325 h 20~#880000^^1~702~-322~0~SCL~start~~~#0000FF^^1~695~-326~0~8~end~~~#0000FF^^0~697~-325^^0~M 700 -322 L 703 -325 L 700 -328#@$P~show~0~11~820~-455~0~gge3258~0^^820~-455^^M 820 -455 h -20~#880000^^1~798~-452~0~A0~end~~~#0000FF^^1~805~-456~0~23~start~~~#0000FF^^0~803~-455^^0~M 800 -458 L 797 -455 L 800 -452#@$P~show~0~12~820~-445~0~gge3265~0^^820~-445^^M 820 -445 h -20~#880000^^1~798~-442~0~A1~end~~~#0000FF^^1~805~-446~0~24~start~~~#0000FF^^0~803~-445^^0~M 800 -448 L 797 -445 L 800 -442#@$P~show~0~13~820~-435~0~gge3272~0^^820~-435^^M 820 -435 h -20~#880000^^1~798~-432~0~A2~end~~~#0000FF^^1~805~-436~0~25~start~~~#0000FF^^0~803~-435^^0~M 800 -438 L 797 -435 L 800 -432#@$P~show~0~14~820~-425~0~gge3279~0^^820~-425^^M 820 -425 h -20~#880000^^1~798~-422~0~A3~end~~~#0000FF^^1~805~-426~0~26~start~~~#0000FF^^0~803~-425^^0~M 800 -428 L 797 -425 L 800 -422#@$P~show~0~15~820~-415~0~gge3286~0^^820~-415^^M 820 -415 h -20~#880000^^1~798~-412~0~A4~end~~~#0000FF^^1~805~-416~0~27~start~~~#0000FF^^0~803~-415^^0~M 800 -418 L 797 -415 L 800 -412#@$P~show~0~16~820~-405~0~gge3293~0^^820~-405^^M 820 -405 h -20~#880000^^1~798~-402~0~A5~end~~~#0000FF^^1~805~-406~0~28~start~~~#0000FF^^0~803~-405^^0~M 800 -408 L 797 -405 L 800 -402#@$P~show~0~17~820~-395~0~gge3300~0^^820~-395^^M 820 -395 h -20~#880000^^1~798~-392~0~A6~end~~~#0000FF^^1~805~-396~0~29~start~~~#0000FF^^0~803~-395^^0~M 800 -398 L 797 -395 L 800 -392#@$P~show~0~18~820~-385~0~gge3307~0^^820~-385^^M 820 -385 h -20~#880000^^1~798~-382~0~A7~end~~~#0000FF^^1~805~-386~0~30~start~~~#0000FF^^0~803~-385^^0~M 800 -388 L 797 -385 L 800 -382#@$P~show~0~19~820~-365~0~gge3314~0^^820~-365^^M 820 -365 h -20~#880000^^1~798~-362~0~B0~end~~~#0000FF^^1~805~-366~0~13~start~~~#0000FF^^0~803~-365^^0~M 800 -368 L 797 -365 L 800 -362#@$P~show~0~20~820~-355~0~gge3321~0^^820~-355^^M 820 -355 h -20~#880000^^1~798~-352~0~B1~end~~~#0000FF^^1~805~-356~0~14~start~~~#0000FF^^0~803~-355^^0~M 800 -358 L 797 -355 L 800 -352#@$P~show~0~21~820~-345~0~gge3328~0^^820~-345^^M 820 -345 h -20~#880000^^1~798~-342~0~B2~end~~~#0000FF^^1~805~-346~0~15~start~~~#0000FF^^0~803~-345^^0~M 800 -348 L 797 -345 L 800 -342#@$P~show~0~22~820~-335~0~gge3335~0^^820~-335^^M 820 -335 h -20~#880000^^1~798~-332~0~B3~end~~~#0000FF^^1~805~-336~0~16~start~~~#0000FF^^0~803~-335^^0~M 800 -338 L 797 -335 L 800 -332#@$P~show~0~23~820~-325~0~gge3342~0^^820~-325^^M 820 -325 h -20~#880000^^1~798~-322~0~B4~end~~~#0000FF^^1~805~-326~0~17~start~~~#0000FF^^0~803~-325^^0~M 800 -328 L 797 -325 L 800 -322#@$P~show~0~24~820~-315~0~gge3349~0^^820~-315^^M 820 -315 h -20~#880000^^1~798~-312~0~B5~end~~~#0000FF^^1~805~-316~0~18~start~~~#0000FF^^0~803~-315^^0~M 800 -318 L 797 -315 L 800 -312#@$P~show~0~25~820~-305~0~gge3356~0^^820~-305^^M 820 -305 h -20~#880000^^1~798~-302~0~B6~end~~~#0000FF^^1~805~-306~0~19~start~~~#0000FF^^0~803~-305^^0~M 800 -308 L 797 -305 L 800 -302#@$P~show~0~26~820~-295~0~gge3363~0^^820~-295^^M 820 -295 h -20~#880000^^1~798~-292~0~B7~end~~~#0000FF^^1~805~-296~0~20~start~~~#0000FF^^0~803~-295^^0~M 800 -298 L 797 -295 L 800 -292#@$P~show~0~27~680~-305~180~gge3370~0^^680~-305^^M 680 -305 h 20~#880000^^1~702~-302~0~ITA~start~~~#0000FF^^1~695~-306~0~22~end~~~#0000FF^^0~697~-305^^0~M 700 -302 L 703 -305 L 700 -308#@$P~show~0~28~680~-295~180~gge3377~0^^680~-295^^M 680 -295 h 20~#880000^^1~702~-292~0~ITB~start~~~#0000FF^^1~695~-296~0~11~end~~~#0000FF^^0~697~-295^^0~M 700 -292 L 703 -295 L 700 -298#@$T~L~720~-312.78~0~#0000FF~~9pt~~~~comment~MCP23017~1~start~gge3384~0~pinpart#@$R~700~-465~~~100~180~#000000~1~0~none~gge3386~0~#@$P~show~0~29~680~-435~180~gge3387~0^^680~-435^^M 680 -435 h 20~#880000^^1~702~-432~0~GND~start~~~#0000FF^^1~695~-436~0~21~end~~~#0000FF^^0~697~-435^^0~M 700 -432 L 703 -435 L 700 -438#@$P~show~0~0~680~-425~180~gge3394~0^^680~-425^^M 680 -425 h 20~#880000^^1~702~-422~0~GND~start~~~#0000FF^^1~695~-426~0~9~end~~~#0000FF^^0~697~-425^^0~M 700 -422 L 703 -425 L 700 -428","W~515 -560 665 -560 665 -660 700 -660~#008800~1~0~none~gge3621~0","W~680 -435 665 -435 665 -560~#008800~1~0~none~gge3622~0","W~680 -425 665 -425 665 -435~#008800~1~0~none~gge3626~0","W~515 -540 645 -540 645 -640 700 -640~#008800~1~0~none~gge3630~0","W~680 -325 645 -325 645 -540~#008800~1~0~none~gge3631~0","W~515 -520 635 -520 635 -335 680 -335~#008800~1~0~none~gge3633~0","W~700 -620 675 -620 675 -520 635 -520~#008800~1~0~none~gge3634~0","F~part_netLabel_gnD~875~-645~0~gge3637~~0^^875~-645^^GND~#000000~862~-619~0~start~1~Times New Roman~9pt~flag_gge5^^PL~875 -635 875 -645~#000000~1~0~transparent~gge3641~0^^PL~866 -635 884 -635~#000000~1~0~transparent~gge3642~0^^PL~869 -633 881 -633~#000000~1~0~transparent~gge3643~0^^PL~872 -631 878 -631~#000000~1~0~transparent~gge3644~0^^PL~874 -629 876 -629~#000000~1~0~transparent~gge3645~0","W~875 -645 875 -725 665 -725 665 -660~#008800~1~0~none~gge3655~0","W~655 -680 655 -455 680 -455~#008800~1~0~none~gge3670~0","W~680 -445 655 -445 655 -455~#008800~1~0~none~gge3672~0","W~515 -500 625 -500 625 -680 700 -680~#008800~1~0~none~gge3674~0","W~515 -600 665 -600~#008800~1~0~none~gge5803~0","W~475 -480 360 -480 360 -760 665 -760 665 -695~#008800~1~0~none~gge5805~0","W~225 -750 225 -750 625 -750 625 -680~#008800~1~0~none~gge5807~0","W~300 -640 280 -640 280 -700 475 -700~#008800~1~0~none~gge5809~0","LIB~320~-640~package`RES-TH_BD1.8-L3.2-P7.20-D0.4`BOM_Supplier`LCSC`BOM_Supplier Part`C714232`BOM_Manufacturer`Huaxing Mechanical-Elec.`BOM_Manufacturer Part`CF1/6W-10KΊ¹5%T52`nameAlias`Resistance (Ohms)`Contributor`LCSC`spicePre`R`spiceSymbolName`CF1/6W-10KΊ¹5%T52`~~0~gge2be133cf7b4aac5a~97467e7cb6374f7e9dd7fc644a47cfb1~2ba8a26395ab41a2a00f577110f8f3f7~0~~yes~yes#@$T~N~314.03125~-648~0~#000080~Arial~~~~~comment~10kΊ~1~start~gge6472~0~#@$T~P~314.0390625~-657.125~0~#000080~Arial~~~~~comment~R2~1~start~gge6474~0~#@$R~310~-645~~~20~10~#A00000~1~0~none~gge6476~0~#@$P~show~0~2~340~-640~0~gge6477~0^^340~-640^^M 330 -640 h 10~#800^^0~326~-640~0~2~end~~~#800^^0~334~-644~0~2~start~~~#800^^0~353~-640^^0~M 350 -643 L 347 -640 L 350 -637#@$P~show~0~1~300~-640~180~gge6484~0^^300~-640^^M 310 -640 h -10~#800^^0~314~-640~0~1~start~~~#800^^0~306~-644~0~1~end~~~#800^^0~287~-640^^0~M 290 -637 L 293 -640 L 290 -643","W~515 -580 610 -580 610 -410 335 -410~#008800~1~0~none~gge7116~0","W~335 -470 370 -470 370 -420 600 -420 600 -640 515 -640~#008800~1~0~none~gge7119~0","W~335 -430 405 -430 405 -500 475 -500~#008800~1~0~none~gge7120~0","W~335 -440 395 -440 395 -520 475 -520~#008800~1~0~none~gge7122~0","W~340 -640 360 -640~#008800~1~0~none~gge7126~0","W~335 -450 385 -450 385 -540 475 -540~#008800~1~0~none~gge7128~0","T~L~340~-405~0~#0000FF~~4pt~~~~comment~VCC~1~start~gge7135~0~pinpart","T~L~340~-465~0~#0000FF~~4pt~~~~comment~RST~1~start~gge7143~0~pinpart","T~L~340~-435~0~#0000FF~~4pt~~~~comment~MISO~1~start~gge7146~0~pinpart","T~L~340~-445~0~#0000FF~~4pt~~~~comment~MOSI~1~start~gge7149~0~pinpart","T~L~340~-425~0~#0000FF~~4pt~~~~comment~SCLK~1~start~gge7152~0~pinpart","T~L~340~-455~0~#0000FF~~4pt~~~~comment~CS~1~start~gge7155~0~pinpart","F~part_netLabel_gnD~330~-610~0~gge7160~~0^^330~-610^^GND~#000000~317~-584~0~start~1~Times New Roman~9pt~flag_gge6^^PL~330 -600 330 -610~#000000~1~0~transparent~gge7164~0^^PL~321 -600 339 -600~#000000~1~0~transparent~gge7165~0^^PL~324 -598 336 -598~#000000~1~0~transparent~gge7166~0^^PL~327 -596 333 -596~#000000~1~0~transparent~gge7167~0^^PL~329 -594 331 -594~#000000~1~0~transparent~gge7168~0","W~330 -610 360 -610~#008800~1~0~none~gge7178~0","W~280 -230 240 -230 240 -510 360 -510~#008800~1~0~none~gge7180~0","W~680 -405 665 -405 665 -425~#008800~1~0~none~gge7191~0","W~680 -395 665 -395 665 -405~#008800~1~0~none~gge7193~0","W~680 -385 665 -385 665 -395~#008800~1~0~none~gge7195~0","LIB~410~-230~package`WIRELM-TH_DWM1000`BOM_Supplier`LCSC`BOM_Manufacturer`DecaWave`BOM_Manufacturer Part`DWM1000`BOM_Supplier Part`C95238`spicePre`U`spiceSymbolName`DWM1000`~~0~gge40e5c90f659fccfc~921ff2190df246a4b1016c11071a51a1~605f956fd8c24817bb840fda3296ca74~0~~yes~yes#@$T~N~387.96875~-351.75~0~#000080~Arial~~~~~comment~DWM1000~1~start~gge7203~0~#@$T~P~404.21875~-362.125~0~#000080~Arial~~~~~comment~U5~1~start~gge7205~0~#@$E~295~-307~1.5~1.5~#880000~1~0~#880000~gge7207~0#@$R~290~-350~2~2~240~230~#880000~1~0~none~gge7208~0~#@$E~295~-307~1.5~1.5~#880000~1~0~#880000~gge7209~0#@$P~show~0~1~280~-300~180~gge7210~0^^280~-300^^M 280 -300 h 10~#880000^^1~293.7~-296~0~EXTON~start~~~#0000FF^^1~289.5~-301~0~1~end~~~#0000FF^^0~287~-300^^0~M 290 -297 L 293 -300 L 290 -303#@$P~show~0~2~280~-290~180~gge7217~0^^280~-290^^M 280 -290 h 10~#880000^^1~293.7~-286~0~WAKEUP~start~~~#0000FF^^1~289.5~-291~0~2~end~~~#0000FF^^0~287~-290^^0~M 290 -287 L 293 -290 L 290 -293#@$P~show~0~3~280~-280~180~gge7224~0^^280~-280^^M 280 -280 h 10~#880000^^1~293.7~-276~0~RSTn~start~~~#0000FF^^1~289.5~-281~0~3~end~~~#0000FF^^0~287~-280^^0~M 290 -277 L 293 -280 L 290 -283#@$P~show~0~4~280~-270~180~gge7231~0^^280~-270^^M 280 -270 h 10~#880000^^1~293.7~-266~0~GPIO7~start~~~#0000FF^^1~289.5~-271~0~4~end~~~#0000FF^^0~287~-270^^0~M 290 -267 L 293 -270 L 290 -273#@$P~show~0~5~280~-260~180~gge7238~0^^280~-260^^M 280 -260 h 10~#FF0000^^1~293.7~-256~0~VDDAON~start~~~#FF0000^^1~289.5~-261~0~5~end~~~#FF0000^^0~287~-260^^0~M 290 -257 L 293 -260 L 290 -263#@$P~show~0~6~280~-250~180~gge7245~0^^280~-250^^M 280 -250 h 10~#FF0000^^1~293.7~-246~0~VDD3V3~start~~~#FF0000^^1~289.5~-251~0~6~end~~~#FF0000^^0~287~-250^^0~M 290 -247 L 293 -250 L 290 -253#@$P~show~0~7~280~-240~180~gge7252~0^^280~-240^^M 280 -240 h 10~#FF0000^^1~293.7~-236~0~VDD3V3~start~~~#FF0000^^1~289.5~-241~0~7~end~~~#FF0000^^0~287~-240^^0~M 290 -237 L 293 -240 L 290 -243#@$P~show~0~8~280~-230~180~gge7259~0^^280~-230^^M 280 -230 h 10~#000000^^1~293.7~-226~0~VSS~start~~~#000000^^1~289.5~-231~0~8~end~~~#000000^^0~287~-230^^0~M 290 -227 L 293 -230 L 290 -233#@$P~show~0~9~370~-110~270~gge7266~0^^370~-110^^M 370 -110 v -10~#880000^^1~374~-123.7~270~GPIO6/EXTRXE/SPIPHA~start~~~#0000FF^^1~369~-119.5~270~9~end~~~#0000FF^^0~370~-117^^0~M 373 -120 L 370 -123 L 367 -120#@$P~show~0~10~380~-110~270~gge7273~0^^380~-110^^M 380 -110 v -10~#880000^^1~384~-123.7~270~GPIO5/EXTTXE/SPIPOL~start~~~#0000FF^^1~379~-119.5~270~10~end~~~#0000FF^^0~380~-117^^0~M 383 -120 L 380 -123 L 377 -120#@$P~show~0~11~390~-110~270~gge7280~0^^390~-110^^M 390 -110 v -10~#880000^^1~394~-123.7~270~GPIO4EXTPA~start~~~#0000FF^^1~389~-119.5~270~11~end~~~#0000FF^^0~390~-117^^0~M 393 -120 L 390 -123 L 387 -120#@$P~show~0~12~400~-110~270~gge7287~0^^400~-110^^M 400 -110 v -10~#880000^^1~404~-123.7~270~GPIO3TXLED~start~~~#0000FF^^1~399~-119.5~270~12~end~~~#0000FF^^0~400~-117^^0~M 403 -120 L 400 -123 L 397 -120#@$P~show~0~13~410~-110~270~gge7294~0^^410~-110^^M 410 -110 v -10~#880000^^1~414~-123.7~270~GPIO2RXLED~start~~~#0000FF^^1~409~-119.5~270~13~end~~~#0000FF^^0~410~-117^^0~M 413 -120 L 410 -123 L 407 -120#@$P~show~0~14~420~-110~270~gge7301~0^^420~-110^^M 420 -110 v -10~#880000^^1~424~-123.7~270~GPIO1SFDLED~start~~~#0000FF^^1~419~-119.5~270~14~end~~~#0000FF^^0~420~-117^^0~M 423 -120 L 420 -123 L 417 -120#@$P~show~0~15~430~-110~270~gge7308~0^^430~-110^^M 430 -110 v -10~#880000^^1~434~-123.7~270~GPIO0RXOKLED~start~~~#0000FF^^1~429~-119.5~270~15~end~~~#0000FF^^0~430~-117^^0~M 433 -120 L 430 -123 L 427 -120#@$P~show~0~16~440~-110~270~gge7315~0^^440~-110^^M 440 -110 v -10~#000000^^1~444~-123.7~270~VSS~start~~~#000000^^1~439~-119.5~270~16~end~~~#000000^^0~440~-117^^0~M 443 -120 L 440 -123 L 437 -120#@$P~show~0~17~540~-230~0~gge7322~0^^540~-230^^M 540 -230 h -10~#880000^^1~526.3~-226~0~SPICSn~end~~~#0000FF^^1~530.5~-231~0~17~start~~~#0000FF^^0~533~-230^^0~M 530 -233 L 527 -230 L 530 -227#@$P~show~0~18~540~-240~0~gge7329~0^^540~-240^^M 540 -240 h -10~#880000^^1~526.3~-236~0~SPIMOSI~end~~~#0000FF^^1~530.5~-241~0~18~start~~~#0000FF^^0~533~-240^^0~M 530 -243 L 527 -240 L 530 -237#@$P~show~0~19~540~-250~0~gge7336~0^^540~-250^^M 540 -250 h -10~#880000^^1~526.3~-246~0~SPIMISO~end~~~#0000FF^^1~530.5~-251~0~19~start~~~#0000FF^^0~533~-250^^0~M 530 -253 L 527 -250 L 530 -247#@$P~show~0~20~540~-260~0~gge7343~0^^540~-260^^M 540 -260 h -10~#880000^^1~526.3~-256~0~SPICLK~end~~~#0000FF^^1~530.5~-261~0~20~start~~~#0000FF^^0~533~-260^^0~M 530 -263 L 527 -260 L 530 -257#@$P~show~0~21~540~-270~0~gge7350~0^^540~-270^^M 540 -270 h -10~#000000^^1~526.3~-266~0~VSS~end~~~#000000^^1~530.5~-271~0~21~start~~~#000000^^0~533~-270^^0~M 530 -273 L 527 -270 L 530 -267#@$P~show~0~22~540~-280~0~gge7357~0^^540~-280^^M 540 -280 h -10~#880000^^1~526.3~-276~0~IRQ/GPIO8~end~~~#0000FF^^1~530.5~-281~0~22~start~~~#0000FF^^0~533~-280^^0~M 530 -283 L 527 -280 L 530 -277#@$P~show~0~23~540~-290~0~gge7364~0^^540~-290^^M 540 -290 h -10~#000000^^1~526.3~-286~0~VSS~end~~~#000000^^1~530.5~-291~0~23~start~~~#000000^^0~533~-290^^0~M 530 -293 L 527 -290 L 530 -287#@$P~show~0~24~540~-300~0~gge7371~0^^540~-300^^M 540 -300 h -10~#000000^^1~526.3~-296~0~VSS~end~~~#000000^^1~530.5~-301~0~24~start~~~#000000^^0~533~-300^^0~M 530 -303 L 527 -300 L 530 -297","W~335 -460 375 -460 375 -560 475 -560~#008800~1~0~none~gge7555~0","W~280 -260 225 -260 225 -750~#008800~1~0~none~gge7557~0","W~280 -250 225 -250 225 -260~#008800~1~0~none~gge7559~0","W~280 -240 225 -240 225 -250~#008800~1~0~none~gge7561~0","W~440 -110 440 -80 240 -80 240 -230~#008800~1~0~none~gge7565~0","W~540 -300 575 -300 575 -80 440 -80~#008800~1~0~none~gge7567~0","W~540 -290 575 -290~#008800~1~0~none~gge7569~0","W~540 -270 575 -270~#008800~1~0~none~gge7571~0","W~540 -240 585 -240 585 -380 385 -380 385 -450~#008800~1~0~none~gge7573~0","W~540 -250 595 -250 595 -390 395 -390 395 -440~#008800~1~0~none~gge7575~0","W~540 -260 605 -260 605 -400 405 -400 405 -430~#008800~1~0~none~gge7577~0","W~625 -280 625 -70 210 -70 210 -625 375 -625 375 -640 475 -640~#008800~1~0~none~gge7579~0","W~280 -280 270 -280 270 -60 680 -60 680 -260 835 -260 835 -415 820 -415~#008800~1~0~none~gge7580~0","LIB~625~-310~package`RES-TH_BD1.8-L3.2-P7.20-D0.4`BOM_Supplier`LCSC`BOM_Supplier Part`C714232`BOM_Manufacturer`Huaxing Mechanical-Elec.`BOM_Manufacturer Part`CF1/6W-10KΊ¹5%T52`nameAlias`Resistance (Ohms)`Contributor`LCSC`spicePre`R`spiceSymbolName`CF1/6W-10KΊ¹5%T52`~270~0~gge0d47179fde529207~97467e7cb6374f7e9dd7fc644a47cfb1~2ba8a26395ab41a2a00f577110f8f3f7~0~~yes~yes#@$T~N~632~-297.640625~0~#000080~Arial~~~~~comment~10kΊ~1~start~gge7584~0~#@$T~P~632~-306.78125~0~#000080~Arial~~~~~comment~R3~1~start~gge7586~0~#@$R~620~-320~~~10~20~#A00000~1~0~none~gge7588~0~#@$P~show~0~2~625~-290~270~gge7589~0^^625~-290^^M 625 -300 v 10~#800^^0~625~-304~270~2~start~~~#800^^0~621~-296~270~2~end~~~#800^^0~625~-277^^0~M 628 -280 L 625 -283 L 622 -280#@$P~show~0~1~625~-330~90~gge7596~0^^625~-330^^M 625 -320 v -10~#800^^0~625~-316~270~1~end~~~#800^^0~621~-324~270~1~start~~~#800^^0~625~-343^^0~M 622 -340 L 625 -337 L 628 -340","W~625 -330 625 -425 665 -425~#008800~1~0~none~gge7607~0","W~540 -280 625 -280 625 -290~#008800~1~0~none~gge7608~0","LIB~140~-670~package`M2X3`Contributor`DangerousPrototype`spicePre`J`spiceSymbolName`CON_HEADER_2X03`BOM_Manufacturer Part``~~0~gge73b657ec88652575~1a95e0cd8cf04abab1f0a955e387d9de~4cf556fe97124ad8934102a1b113e234~0~~yes~yes#@$T~N~128.3359375~-691.75~0~#000080~Arial~~~~~comment~LEFT IO~1~start~gge7932~0~#@$T~P~135.078125~-702~0~#000080~Arial~~~~~comment~J1~1~start~gge7934~0~#@$PL~120 -690 160 -690~#8D2323~2~0~none~gge7936~0#@$PL~160 -690 160 -650~#8D2323~2~0~none~gge7937~0#@$PL~160 -650 120 -650~#8D2323~2~0~none~gge7938~0#@$PL~120 -650 120 -690~#8D2323~2~0~none~gge7939~0#@$P~show~0~1~125~-680~180~gge7940~0^^125~-680^^M 125 -680 h 4~#8D2323^^0~138~-677~0~1~start~~~#8D2323^^1~129~-681~0~1~end~~~#8D2323^^1~132~-680^^0~M 135 -677 L 138 -680 L 135 -683#@$P~show~0~3~125~-670~180~gge7947~0^^125~-670^^M 125 -670 h 4~#8D2323^^0~138~-667~0~3~start~~~#8D2323^^1~129~-671~0~3~end~~~#8D2323^^1~132~-670^^0~M 135 -667 L 138 -670 L 135 -673#@$P~show~0~5~125~-660~180~gge7954~0^^125~-660^^M 125 -660 h 4~#8D2323^^0~138~-657~0~5~start~~~#8D2323^^1~129~-661~0~5~end~~~#8D2323^^1~132~-660^^0~M 135 -657 L 138 -660 L 135 -663#@$P~show~0~2~155~-680~0~gge7961~0^^155~-680^^M 155 -680 h -4~#8D2323^^0~142~-677~0~2~end~~~#8D2323^^1~151~-681~0~2~start~~~#8D2323^^1~148~-680^^0~M 145 -683 L 142 -680 L 145 -677#@$P~show~0~4~155~-670~0~gge7968~0^^155~-670^^M 155 -670 h -4~#8D2323^^0~142~-667~0~4~end~~~#8D2323^^1~151~-671~0~4~start~~~#8D2323^^1~148~-670^^0~M 145 -673 L 142 -670 L 145 -667#@$P~show~0~6~155~-660~0~gge7975~0^^155~-660^^M 155 -660 h -4~#8D2323^^0~142~-657~0~6~end~~~#8D2323^^1~151~-661~0~6~start~~~#8D2323^^1~148~-660^^0~M 145 -663 L 142 -660 L 145 -657","LIB~930~-355~package`M2X3`Contributor`DangerousPrototype`spicePre`J`spiceSymbolName`CON_HEADER_2X03`BOM_Manufacturer Part``~~0~gge7677077cf56e81b8~1a95e0cd8cf04abab1f0a955e387d9de~4cf556fe97124ad8934102a1b113e234~0~~yes~yes#@$T~N~909.28125~-377.0078125~0~#000080~Arial~~~~~comment~RIGHT IO~1~start~gge7984~0~#@$T~P~925.078125~-387~0~#000080~Arial~~~~~comment~J2~1~start~gge7986~0~#@$PL~910 -375 950 -375~#8D2323~2~0~none~gge7988~0#@$PL~950 -375 950 -335~#8D2323~2~0~none~gge7989~0#@$PL~950 -335 910 -335~#8D2323~2~0~none~gge7990~0#@$PL~910 -335 910 -375~#8D2323~2~0~none~gge7991~0#@$P~show~0~1~915~-365~180~gge7992~0^^915~-365^^M 915 -365 h 4~#8D2323^^0~928~-362~0~1~start~~~#8D2323^^1~919~-366~0~1~end~~~#8D2323^^1~922~-365^^0~M 925 -362 L 928 -365 L 925 -368#@$P~show~0~3~915~-355~180~gge7999~0^^915~-355^^M 915 -355 h 4~#8D2323^^0~928~-352~0~3~start~~~#8D2323^^1~919~-356~0~3~end~~~#8D2323^^1~922~-355^^0~M 925 -352 L 928 -355 L 925 -358#@$P~show~0~5~915~-345~180~gge8006~0^^915~-345^^M 915 -345 h 4~#8D2323^^0~928~-342~0~5~start~~~#8D2323^^1~919~-346~0~5~end~~~#8D2323^^1~922~-345^^0~M 925 -342 L 928 -345 L 925 -348#@$P~show~0~2~945~-365~0~gge8013~0^^945~-365^^M 945 -365 h -4~#8D2323^^0~932~-362~0~2~end~~~#8D2323^^1~941~-366~0~2~start~~~#8D2323^^1~938~-365^^0~M 935 -368 L 932 -365 L 935 -362#@$P~show~0~4~945~-355~0~gge8020~0^^945~-355^^M 945 -355 h -4~#8D2323^^0~932~-352~0~4~end~~~#8D2323^^1~941~-356~0~4~start~~~#8D2323^^1~938~-355^^0~M 935 -358 L 932 -355 L 935 -352#@$P~show~0~6~945~-345~0~gge8027~0^^945~-345^^M 945 -345 h -4~#8D2323^^0~932~-342~0~6~end~~~#8D2323^^1~941~-346~0~6~start~~~#8D2323^^1~938~-345^^0~M 935 -348 L 932 -345 L 935 -342","LIB~295~-430~package`MOLEX_PICOBLADE_8P`description``Contributor`DesertBit`sourceId`JjBuMGYgy`timeStamp`1472635423`spicePre`J`spiceSymbolName`MOLEX_PICOBLADE_8P`BOM_Manufacturer Part``~180~0~gge19aefbed2d4ff121~fc117d7fb2fa4d559044936821f94db6~abe5a9481474486593dfb32d8d0fb351~0~~yes~yes#@$T~N~284.5390625~-491.75~0~#000080~Arial~~~~~comment~Display~1~start~gge8639~0~#@$T~P~295.078125~-501.75~0~#000080~Arial~~~~~comment~J3~1~start~gge8641~0~#@$PL~315 -400 315 -490~#8D2323~1~0~none~gge8643~0#@$PL~315 -490 285 -490~#8D2323~1~0~none~gge8644~0#@$PL~285 -490 285 -400~#8D2323~1~0~none~gge8645~0#@$PL~285 -400 315 -400~#8D2323~1~0~none~gge8646~0#@$P~show~0~1~335~-410~0~gge8647~0^^335~-410^^M 335 -410 h -20~#8D2323^^1~312~-407~0~1~end~~~#8D2323^^1~321~-411~0~1~start~~~#8D2323^^0~318~-410^^0~M 315 -413 L 312 -410 L 315 -407#@$P~show~0~2~335~-420~0~gge8654~0^^335~-420^^M 335 -420 h -20~#8D2323^^1~312~-417~0~2~end~~~#8D2323^^1~321~-421~0~2~start~~~#8D2323^^0~318~-420^^0~M 315 -423 L 312 -420 L 315 -417#@$P~show~0~3~335~-430~0~gge8661~0^^335~-430^^M 335 -430 h -20~#8D2323^^1~312~-427~0~3~end~~~#8D2323^^1~321~-431~0~3~start~~~#8D2323^^0~318~-430^^0~M 315 -433 L 312 -430 L 315 -427#@$P~show~0~4~335~-440~0~gge8668~0^^335~-440^^M 335 -440 h -20~#8D2323^^1~312~-437~0~4~end~~~#8D2323^^1~321~-441~0~4~start~~~#8D2323^^0~318~-440^^0~M 315 -443 L 312 -440 L 315 -437#@$P~show~0~1~335~-450~0~gge8675~0^^335~-450^^M 335 -450 h -20~#8D2323^^1~312~-447~0~5~end~~~#8D2323^^1~321~-451~0~5~start~~~#8D2323^^0~318~-450^^0~M 315 -453 L 312 -450 L 315 -447#@$P~show~0~2~335~-460~0~gge8682~0^^335~-460^^M 335 -460 h -20~#8D2323^^1~312~-457~0~6~end~~~#8D2323^^1~321~-461~0~6~start~~~#8D2323^^0~318~-460^^0~M 315 -463 L 312 -460 L 315 -457#@$P~show~0~3~335~-470~0~gge8689~0^^335~-470^^M 335 -470 h -20~#8D2323^^1~312~-467~0~7~end~~~#8D2323^^1~321~-471~0~7~start~~~#8D2323^^0~318~-470^^0~M 315 -473 L 312 -470 L 315 -467#@$P~show~0~4~335~-480~0~gge8696~0^^335~-480^^M 335 -480 h -20~#8D2323^^1~312~-477~0~8~end~~~#8D2323^^1~321~-481~0~8~start~~~#8D2323^^0~318~-480^^0~M 315 -483 L 312 -480 L 315 -477","W~335 -420 360 -420 360 -480~#008800~1~0~none~gge8769~0","T~L~340~-415~0~#0000FF~~4pt~~~~comment~GND~1~start~gge8774~0~pinpart","W~335 -480 360 -480~#008800~1~0~none~gge8776~0","LIB~790~-620~package`IMU9250`BOM_Manufacturer``BOM_Manufacturer Part``BOM_Supplier Part``BOM_Supplier``link``Contributor`Phongnhp`spicePre`U`spiceSymbolName`IMU_9250`~~0~ggeac577a762ea3fc25~bc174898c43b41b89ffbf34ee09b95a5~38386194dc0a477c83fbd24273123f35~0~~yes~yes#@$T~N~743.484375~-692~0~#000080~Arial~~~~~comment~IMU_9250~1~start~gge10051~0~#@$T~P~758.0390625~-702.5~0~#000080~Arial~~~~~comment~U2~1~start~gge10053~0~#@$P~show~0~1~700~-680~180~gge10055~0^^700~-680^^M 700 -680 h 20~#880000^^1~722~-677~0~VCC~start~~~#0000FF^^1~715~-681~0~1~end~~~#0000FF^^0~717~-680^^0~M 720 -677 L 723 -680 L 720 -683#@$P~show~0~2~700~-660~180~gge10062~0^^700~-660^^M 700 -660 h 20~#880000^^1~722~-657~0~GND~start~~~#0000FF^^1~715~-661~0~2~end~~~#0000FF^^0~717~-660^^0~M 720 -657 L 723 -660 L 720 -663#@$P~show~0~3~700~-640~180~gge10069~0^^700~-640^^M 700 -640 h 20~#880000^^1~722~-637~0~SCL~start~~~#0000FF^^1~715~-641~0~3~end~~~#0000FF^^0~717~-640^^0~M 720 -637 L 723 -640 L 720 -643#@$P~show~0~4~700~-620~180~gge10076~0^^700~-620^^M 700 -620 h 20~#880000^^1~722~-617~0~SDA~start~~~#0000FF^^1~715~-621~0~4~end~~~#0000FF^^0~717~-620^^0~M 720 -617 L 723 -620 L 720 -623#@$P~show~0~5~700~-600~180~gge10083~0^^700~-600^^M 700 -600 h 20~#880000^^1~722~-597~0~ECL~start~~~#0000FF^^1~715~-601~0~5~end~~~#0000FF^^0~717~-600^^0~M 720 -597 L 723 -600 L 720 -603#@$P~show~0~6~700~-580~180~gge10090~0^^700~-580^^M 700 -580 h 20~#880000^^1~722~-577~0~EDA~start~~~#0000FF^^1~715~-581~0~6~end~~~#0000FF^^0~717~-580^^0~M 720 -577 L 723 -580 L 720 -583#@$P~show~0~7~700~-560~180~gge10097~0^^700~-560^^M 700 -560 h 20~#880000^^1~722~-557~0~AD0~start~~~#0000FF^^1~715~-561~0~7~end~~~#0000FF^^0~717~-560^^0~M 720 -557 L 723 -560 L 720 -563#@$P~show~0~8~700~-540~180~gge10104~0^^700~-540^^M 700 -540 h 20~#880000^^1~722~-537~0~INT~start~~~#0000FF^^1~715~-541~0~8~end~~~#0000FF^^0~717~-540^^0~M 720 -537 L 723 -540 L 720 -543#@$P~show~0~9~700~-520~180~gge10111~0^^700~-520^^M 700 -520 h 20~#880000^^1~722~-517~0~NCS~start~~~#0000FF^^1~715~-521~0~9~end~~~#0000FF^^0~717~-520^^0~M 720 -517 L 723 -520 L 720 -523#@$P~show~0~10~700~-500~180~gge10118~0^^700~-500^^M 700 -500 h 20~#880000^^1~722~-497~0~FSYNC~start~~~#0000FF^^1~715~-501~0~10~end~~~#0000FF^^0~717~-500^^0~M 720 -497 L 723 -500 L 720 -503#@$R~720~-690~~~110~200~#000000~1~0~none~gge10125~0~#@$T~L~745.52~-584.75~0~#0000FF~~10pt~bold~normal~~comment~IMU_9250~1~start~gge10126~0~pinpart","O~700~-600~gge10209~M 696 -604 L 704 -596 M 704 -604 L 696 -596~#33cc33~0","O~700~-580~gge10211~M 696 -584 L 704 -576 M 704 -584 L 696 -576~#33cc33~0","O~700~-560~gge10213~M 696 -564 L 704 -556 M 704 -564 L 696 -556~#33cc33~0","O~700~-540~gge10215~M 696 -544 L 704 -536 M 704 -544 L 696 -536~#33cc33~0","O~700~-520~gge10217~M 696 -524 L 704 -516 M 704 -524 L 696 -516~#33cc33~0","O~700~-500~gge10219~M 696 -504 L 704 -496 M 704 -504 L 696 -496~#33cc33~0","LIB~135~-475~package`M1X2_AWG20`Contributor`Nemo Capitano`spicePre`J`spiceSymbolName`CON_HEADER_1X02-PTH`BOM_Manufacturer Part``~~0~gge47ec3a850f2d689e~519ab30562c645fc9071b35164bd0656~d3e19c3068574fa0b89c92528028b98d~0~~yes~yes#@$T~N~118.8671875~-491.75~0~#000080~Arial~~~~~comment~MAIN BAT~1~start~gge10236~0~#@$T~P~130.92~-501~0~#000080~Arial~~~~~comment~J4~1~start~gge10238~0~#@$PL~125.84 -489 145.84 -489~#A54B4B~1.6~0~none~gge10240~0#@$PL~145.84 -489 145.84 -459~#A54B4B~1.6~0~none~gge10241~0#@$PL~145.84 -459 125.84 -459~#A54B4B~1.6~0~none~gge10242~0#@$PL~125.84 -459 125.84 -489~#A54B4B~1.6~0~none~gge10243~0#@$P~show~3~1~131~-479~180~gge10244~0^^131~-479^^M 131 -479 h 3.842~#A54B4B^^0~150.53~-476.047~0~1~start~~4.5pt~#A54B4B^^1~134.78~-480.97~0~1~end~~4.5pt~#A54B4B^^1~137~-479^^0~M 140 -476 L 143 -479 L 140 -482#@$P~show~3~2~131~-469~180~gge10251~0^^131~-469^^M 131 -469 h 3.842~#A54B4B^^0~150.53~-466.047~0~2~start~~4.5pt~#A54B4B^^1~134.78~-470.97~0~2~end~~4.5pt~#A54B4B^^1~137~-469^^0~M 140 -466 L 143 -469 L 140 -472","W~131 -479 185 -479 185 -540 270 -540~#008800~1~0~none~gge10284~0","W~131 -469 240 -469~#008800~1~0~none~gge10285~0","T~L~340~-475~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10291~0~pinpart","T~L~150~-460~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10294~0~pinpart","T~L~255~-555~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10297~0~pinpart","T~L~150~-485~0~#0000FF~~4pt~~~~comment~BAT +~1~start~gge10300~0~pinpart","T~L~255~-530~0~#0000FF~~4pt~~~~comment~BAT +~1~start~gge10303~0~pinpart","W~155 -680 280 -680~#008800~1~0~none~gge10313~0","W~125 -680 125 -730 225 -730~#008800~1~0~none~gge10315~0","T~L~110~-695~0~#0000FF~~4pt~~~~comment~VCC~1~start~gge10318~0~pinpart","T~L~165~-685~0~#0000FF~~4pt~~~~comment~PSENSOR~1~start~gge10321~0~pinpart","W~155 -660 270 -660 270 -715 360 -715~#008800~1~0~none~gge10323~0","T~L~165~-655~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10326~0~pinpart","W~125 -670 110 -670 110 -770 910 -770 910 -455 820 -455~#008800~1~0~none~gge10328~0","W~155 -670 235 -670 235 -780 920 -780 915 -435 820 -435~#008800~1~0~none~gge10336~0","W~125 -660 100 -660 100 -790 930 -790 930 -445 820 -445~#008800~1~0~none~gge10337~0","W~945 -345 970 -345 970 -485 665 -485~#008800~1~0~none~gge10338~0","W~820 -295 870 -295 870 -355 915 -355~#008800~1~0~none~gge10341~0","W~820 -395 880 -395 880 -325 960 -325 960 -355 945 -355~#008800~1~0~none~gge10343~0","W~820 -305 895 -305 895 -345 915 -345~#008800~1~0~none~gge10344~0","W~915 -365 895 -365 895 -475 655 -475~#008800~1~0~none~gge10345~0","LIB~288~-544~package`S2B-PH-SM4-TB`Contributor`andyfilms`spicePre`X`spiceSymbolName`S2B-PH-SM4-TB`BOM_Manufacturer Part``~180~0~gge12fa8dc00f010d07~ffe5780e60fc43f3861153d7ff9fe849~1c47b77e6d1948b89e39b944cd2029a5~0~~yes~yes#@$T~N~284.28125~-565.84375~0~#000080~Arial~~~~~comment~BAT~1~start~gge10431~0~#@$T~P~287.44~-575.85~0~#000080~Arial~~~~~comment~X1~1~start~gge10433~0~#@$PL~284.68 -560 304.68 -560~#EBEB37~1.6~0~none~gge10435~0#@$PL~294.68 -540 289.68 -540~#EBEB37~2.4~0~none~gge10436~0#@$PL~294.68 -550 289.68 -550~#EBEB37~2.4~0~none~gge10437~0#@$PL~304.68 -530 304.68 -560~#EBEB37~1.6~0~none~gge10438~0#@$PL~284.68 -560 284.68 -530~#EBEB37~1.6~0~none~gge10439~0#@$PL~304.68 -530 284.68 -530~#EBEB37~1.6~0~none~gge10440~0#@$P~show~3~1~270~-550~180~gge10441~0^^270~-550^^M 270 -550 h 19.685~#EBEB37^^0~299.21~-547.047~0~1~start~~4.5pt~#EBEB37^^1~277.56~-551.969~0~1~end~~4.5pt~#EBEB37^^0~286~-550^^0~M 289 -547 L 292 -550 L 289 -553#@$P~show~3~2~270~-540~180~gge10448~0^^270~-540^^M 270 -540 h 19.685~#EBEB37^^0~299.21~-537.047~0~2~start~~4.5pt~#EBEB37^^1~277.56~-541.969~0~2~end~~4.5pt~#EBEB37^^0~286~-540^^0~M 289 -537 L 292 -540 L 289 -543","N~185~-535~0~#0000ff~BAT~gge10482~start~187~-537.5~Times New Roman~7pt~0","O~475~-580~gge10488~M 471 -584 L 479 -576 M 479 -584 L 471 -576~#33cc33~0","O~475~-600~gge10490~M 471 -604 L 479 -596 M 479 -604 L 471 -596~#33cc33~0","O~475~-620~gge10492~M 471 -624 L 479 -616 M 479 -624 L 471 -616~#33cc33~0","O~515~-660~gge10498~M 511 -664 L 519 -656 M 519 -664 L 511 -656~#33cc33~0","O~515~-620~gge10500~M 511 -624 L 519 -616 M 519 -624 L 511 -616~#33cc33~0","W~540 -230 825 -230 825 -405 820 -405~#008800~1~0~none~gge10506~0","W~680 -375 655 -375 655 -445~#008800~1~0~none~gge10509~0","W~270 -550 240 -550 240 -510~#008800~1~0~none~gge10513~0","LIB~1005~-305~package`TO-92-3_L4.9-W3.7-P1.27-L`BOM_Supplier`LCSC`BOM_Manufacturer`SEMTECH`BOM_Manufacturer Part`2N2222`Contributor`LCSC`BOM_Supplier Part`C118536`BOM_LCSC Assembly`Yes`SMT Type`Extend`BOM_Assembly Type`manualWeld`BOM_Paste Type`expand`spicePre`Q`spiceSymbolName`2N2222`~~0~ggecd2b6c912041b411~6924b36489de4921bb29ca14bf27c33f~0b833263bcfb409d8a029dcd9c6a3b59~0~~yes~yes#@$T~N~1019~-292.8125~0~#000080~Arial~~~~~comment~2N2222~1~start~gge10516~0~#@$T~P~1019~-301.6484375~0~#000080~Arial~~~~~comment~Q1~1~start~gge10518~0~#@$P~show~0~3~1015~-325~90~gge10520~0^^1015~-325^^M 1015 -325 v 10~#880000^^0~1018~-313~270~C~end~~~#0000FF^^0~1014~-315~270~3~start~~~#0000FF^^0~1015~-318^^0~M 1012 -315 L 1015 -312 L 1018 -315#@$P~show~0~2~995~-305~180~gge10527~0^^995~-305^^M 995 -305 h 10~#880000^^0~1007~-302~0~B~start~~~#0000FF^^0~1005~-306~0~2~end~~~#0000FF^^0~1002~-305^^0~M 1005 -302 L 1008 -305 L 1005 -308#@$P~show~0~1~1015~-285~270~gge10534~0^^1015~-285^^M 1015 -285 v -10~#880000^^0~1018~-297~270~E~start~~~#0000FF^^0~1014~-295~270~1~end~~~#0000FF^^0~1015~-292^^0~M 1018 -295 L 1015 -298 L 1012 -295#@$PL~1015 -315 1005 -308~#880000~1~0~none~gge10541~0#@$PL~1005 -302 1015 -295~#880000~1~0~none~gge10542~0#@$PL~1005 -314 1005 -296~#880000~1~0~none~gge10543~0#@$PG~1015 -295 1012 -300 1009 -296~#880000~1~0~none~gge10544~0","LIB~1015~-365~package`DO-41_BD2.4-L4.7-P8.70-D0.9-RD`BOM_Supplier`LCSC`BOM_Manufacturer`LRC`BOM_Manufacturer Part`1N4001`BOM_Supplier Part`C82804`spicePre`D`spiceSymbolName`1N4001`~270~0~gge8f24df2e0c50e8b0~c2803222ad4b48fb94db0de548a6280a~6a469063902c4d47b9003ece9d1d25f0~0~~yes~yes#@$T~N~1024~-352.75~0~#000080~Arial~~~~~comment~1N4001~1~start~gge10576~0~#@$T~P~1024~-361.75~0~#000080~Arial~~~~~comment~D1~1~start~gge10578~0~#@$P~show~0~2~1015~-345~270~gge10580~0^^1015~-345^^M 1015 -345 v -15~#880000^^0~1018~-363~270~A~start~~~#0000FF^^0~1014~-354~270~2~end~~~#0000FF^^0~1015~-357^^0~M 1018 -360 L 1015 -363 L 1012 -360#@$P~show~0~1~1015~-385~90~gge10587~0^^1015~-385^^M 1015 -385 v 15~#880000^^0~1018~-367~270~K~end~~~#0000FF^^0~1014~-376~270~1~start~~~#0000FF^^0~1015~-373^^0~M 1012 -370 L 1015 -367 L 1018 -370#@$PT~M 1021 -360 L 1015 -370 L 1008 -360 Z ~#880000~1~0~#880000~gge10594~0~#@$PL~1022 -370 1008 -370~#880000~1~0~none~gge10595~0","LIB~1065~-365~package`CAP-TH_L5.0-W5.0-P5.08-D1.0`BOM_Supplier`LCSC`BOM_Supplier Part`C444738`BOM_Manufacturer`AVX`BOM_Manufacturer Part`SR211C104KAR`nameAlias`Capacitance`Contributor`LCSC`BOM_LCSC Assembly`Yes`SMT Type`Extend`BOM_Assembly Type`manualWeld`BOM_Paste Type`expand`spicePre`C`spiceSymbolName`SR211C104KAR`~~0~gge1986c0819620a5c0~4d5b8e8e8f89428f98436df910b3190e~e9b172bbe58746a0bfc16211d1d8f989~0~~yes~yes#@$T~N~1075~-352.75~0~#000080~Arial~~~~~comment~100nF~1~start~gge10840~0~#@$T~P~1075~-361.75~0~#000080~Arial~~~~~comment~C1~1~start~gge10842~0~#@$PL~1065 -363 1065 -360~#880000~1~0~none~gge10844~0#@$PL~1065 -370 1065 -367~#880000~1~0~none~gge10845~0#@$P~show~1~2~1065~-350~270~gge10846~0^^1065~-350^^M 1065 -350 v -10~#000000^^0~1068~-365~270~2~start~~~#000000^^0~1064~-355~270~2~end~~~#000000^^0~1065~-357^^0~M 1068 -360 L 1065 -363 L 1062 -360#@$P~show~1~1~1065~-380~90~gge10853~0^^1065~-380^^M 1065 -380 v 10~#000000^^0~1068~-365~270~1~end~~~#000000^^0~1064~-375~270~1~start~~~#000000^^0~1065~-373^^0~M 1062 -370 L 1065 -367 L 1068 -370#@$PL~1073 -363 1057 -363~#880000~1~0~none~gge10860~0#@$PL~1073 -367 1057 -367~#880000~1~0~none~gge10861~0","W~1015 -385 1015 -405 895 -405~#008800~1~0~none~gge10886~0","W~1065 -380 1065 -405 1015 -405~#008800~1~0~none~gge10888~0","W~1015 -325 1015 -345 1065 -345 1065 -350~#008800~1~0~none~gge10890~0","W~945 -365 990 -365 990 -345 1015 -345~#008800~1~0~none~gge10894~0","W~1015 -285 1105 -285 1105 -445 970 -445~#008800~1~0~none~gge10895~0","LIB~920~-285~package`RES-TH_BD2.2-L6.5-P10.50-D0.9`BOM_Supplier`LCSC`BOM_Supplier Part`C66649`BOM_Manufacturer`Uniroyal Elec`BOM_Manufacturer Part`CFR0W4J0102A50`nameAlias`Resistance (Ohms)`Contributor`LCSC`BOM_LCSC Assembly`Yes`SMT Type`Extend`BOM_Assembly Type`manualWeld`BOM_Paste Type`expand`spicePre`R`spiceSymbolName`CFR0W4J0102A50_C66649`~~0~ggeda6b708f9e9bc128~effc89414532445783190cb2bb98fda9~f59692c377e743b892e085a8b518b713~0~~yes~yes#@$T~N~914.03125~-293~0~#000080~Arial~~~~~comment~1k~1~start~gge11013~0~#@$T~P~914.0390625~-302~0~#000080~Arial~~~~~comment~R1~1~start~gge11015~0~#@$R~910~-290~~~20~10~#A00000~1~0~none~gge11017~0~#@$P~show~0~2~940~-285~0~gge11018~0^^940~-285^^M 930 -285 h 10~#800^^0~926~-285~0~2~end~~~#800^^0~934~-289~0~2~start~~~#800^^0~953~-285^^0~M 950 -288 L 947 -285 L 950 -282#@$P~show~0~1~900~-285~180~gge11025~0^^900~-285^^M 910 -285 h -10~#800^^0~914~-285~0~1~start~~~#800^^0~906~-289~0~1~end~~~#800^^0~887~-285^^0~M 890 -282 L 893 -285 L 890 -288","W~820 -385 855 -385 855 -285 900 -285~#008800~1~0~none~gge11035~0","W~940 -285 995 -285 995 -305~#008800~1~0~none~gge11036~0","J~665~-560~2.5~#CC0000~gge3623~0","J~645~-540~2.5~#CC0000~gge3632~0","J~665~-660~2.5~#CC0000~gge3656~0","J~665~-435~2.5~#CC0000~gge3669~0","J~655~-455~2.5~#CC0000~gge3673~0","J~635~-520~2.5~#CC0000~gge3677~0","J~665~-600~2.5~#CC0000~gge5804~0","J~665~-695~2.5~#CC0000~gge5806~0","J~625~-680~2.5~#CC0000~gge5808~0","J~360~-640~2.5~#CC0000~gge7127~0","J~360~-610~2.5~#CC0000~gge7179~0","J~360~-510~2.5~#CC0000~gge7181~0","J~665~-425~2.5~#CC0000~gge7192~0","J~665~-405~2.5~#CC0000~gge7194~0","J~665~-395~2.5~#CC0000~gge7196~0","J~225~-260~2.5~#CC0000~gge7560~0","J~225~-250~2.5~#CC0000~gge7562~0","J~240~-230~2.5~#CC0000~gge7566~0","J~440~-80~2.5~#CC0000~gge7568~0","J~575~-290~2.5~#CC0000~gge7570~0","J~575~-270~2.5~#CC0000~gge7572~0","J~385~-450~2.5~#CC0000~gge7574~0","J~395~-440~2.5~#CC0000~gge7576~0","J~405~-430~2.5~#CC0000~gge7578~0","J~360~-480~2.5~#CC0000~gge8770~0","J~655~-680~2.5~#CC0000~gge10208~0","J~280~-680~2.5~#CC0000~gge10314~0","J~225~-730~2.5~#CC0000~gge10316~0","J~360~-715~2.5~#CC0000~gge10324~0","J~665~-485~2.5~#CC0000~gge10339~0","J~655~-475~2.5~#CC0000~gge10346~0","J~240~-469~2.5~#CC0000~gge10286~0","J~625~-280~2.5~#CC0000~gge10505~0","J~655~-445~2.5~#CC0000~gge10510~0","J~240~-510~2.5~#CC0000~gge10514~0","J~895~-405~2.5~#CC0000~gge10887~0","J~1015~-405~2.5~#CC0000~gge10889~0","J~1015~-345~2.5~#CC0000~gge10893~0","J~970~-445~2.5~#CC0000~gge10896~0"],"BBox":{"x":0,"y":-807,"width":1149,"height":807.5},"colors":{}}}],"BOM":[["Value","Quantity","Package","Components","CustomPara"],["2N2222",1,"TO-92-3_L4.9-W3.7-P1.27-L","Q1",{"BOM_Supplier":"LCSC","BOM_Manufacturer":"SEMTECH","BOM_Manufacturer Part":"2N2222","BOM_Supplier Part":"C118536","BOM_LCSC Assembly":"Yes","BOM_Assembly Type":"manualWeld","BOM_Paste Type":"expand","puuid":"6924b36489de4921bb29ca14bf27c33f","uuid":"0b833263bcfb409d8a029dcd9c6a3b59"}],["MCP23017",1,"MCP23017","U3",{"BOM_Manufacturer":"","BOM_Manufacturer Part":"MCP23017","BOM_Supplier Part":"","BOM_Supplier":"","puuid":"f09420c4fd9946a583a6b15c1c5a483e","uuid":"0f118b0d9063400da84e04b55532a171"}],["BAT",1,"S2B-PH-SM4-TB","X1",{"BOM_Manufacturer Part":"","puuid":"ffe5780e60fc43f3861153d7ff9fe849","uuid":"1c47b77e6d1948b89e39b944cd2029a5"}],["10kΊ",2,"RES-TH_BD1.8-L3.2-P7.20-D0.4","R3,R2",{"BOM_Supplier":"LCSC","BOM_Supplier Part":"C714232","BOM_Manufacturer":"Huaxing Mechanical-Elec.","BOM_Manufacturer Part":"CF1/6W-10KΊ¹5%T52","puuid":"97467e7cb6374f7e9dd7fc644a47cfb1","uuid":"2ba8a26395ab41a2a00f577110f8f3f7"}],["RIGHT IO",1,"M2X3","J2",{"BOM_Manufacturer Part":"","puuid":"1a95e0cd8cf04abab1f0a955e387d9de","uuid":"4cf556fe97124ad8934102a1b113e234"}],["LEFT IO",1,"M2X3","J1",{"BOM_Manufacturer Part":"","puuid":"1a95e0cd8cf04abab1f0a955e387d9de","uuid":"4cf556fe97124ad8934102a1b113e234"}],["1N4001",1,"DO-41_BD2.4-L4.7-P8.70-D0.9-RD","D1",{"BOM_Supplier":"LCSC","BOM_Manufacturer":"LRC","BOM_Manufacturer Part":"1N4001","BOM_Supplier Part":"C82804","puuid":"c2803222ad4b48fb94db0de548a6280a","uuid":"6a469063902c4d47b9003ece9d1d25f0"}],["DWM1000",1,"WIRELM-TH_DWM1000","U5",{"BOM_Supplier":"LCSC","BOM_Manufacturer":"DecaWave","BOM_Manufacturer Part":"DWM1000","BOM_Supplier Part":"C95238","puuid":"921ff2190df246a4b1016c11071a51a1","uuid":"605f956fd8c24817bb840fda3296ca74"}],["MAIN BOARD",1,"TTGO-T-BEAM-ESP32-CONNECTOR","U1",{"BOM_Manufacturer":"","BOM_Manufacturer Part":"","BOM_Supplier Part":"","BOM_Supplier":"","puuid":"5180c2e0c1da4a75b575a8495aee30f2","uuid":"5657e928f1504b21b9e68062d66ba3e3"}],["IMU_9250",1,"IMU9250","U2",{"BOM_Manufacturer":"","BOM_Manufacturer Part":"","BOM_Supplier Part":"","BOM_Supplier":"","puuid":"bc174898c43b41b89ffbf34ee09b95a5","uuid":"38386194dc0a477c83fbd24273123f35"}],["Display",1,"MOLEX_PICOBLADE_8P","J3",{"BOM_Manufacturer Part":"","puuid":"fc117d7fb2fa4d559044936821f94db6","uuid":"abe5a9481474486593dfb32d8d0fb351"}],["MAIN BAT",1,"M1X2_AWG20","J4",{"BOM_Manufacturer Part":"","puuid":"519ab30562c645fc9071b35164bd0656","uuid":"d3e19c3068574fa0b89c92528028b98d"}],["100nF",1,"CAP-TH_L5.0-W5.0-P5.08-D1.0","C1",{"BOM_Supplier":"LCSC","BOM_Supplier Part":"C444738","BOM_Manufacturer":"AVX","BOM_Manufacturer Part":"SR211C104KAR","BOM_LCSC Assembly":"Yes","BOM_Assembly Type":"manualWeld","BOM_Paste Type":"expand","puuid":"4d5b8e8e8f89428f98436df910b3190e","uuid":"e9b172bbe58746a0bfc16211d1d8f989"}],["1k",1,"RES-TH_BD2.2-L6.5-P10.50-D0.9","R1",{"BOM_Supplier":"LCSC","BOM_Supplier Part":"C66649","BOM_Manufacturer":"Uniroyal Elec","BOM_Manufacturer Part":"CFR0W4J0102A50","BOM_LCSC Assembly":"Yes","BOM_Assembly Type":"manualWeld","BOM_Paste Type":"expand","puuid":"effc89414532445783190cb2bb98fda9","uuid":"f59692c377e743b892e085a8b518b713"}]],"components":{"5657e928f1504b21b9e68062d66ba3e3":1,"0f118b0d9063400da84e04b55532a171":1,"2ba8a26395ab41a2a00f577110f8f3f7":2,"605f956fd8c24817bb840fda3296ca74":1,"4cf556fe97124ad8934102a1b113e234":2,"abe5a9481474486593dfb32d8d0fb351":1,"38386194dc0a477c83fbd24273123f35":1,"d3e19c3068574fa0b89c92528028b98d":1,"1c47b77e6d1948b89e39b944cd2029a5":1,"0b833263bcfb409d8a029dcd9c6a3b59":1,"6a469063902c4d47b9003ece9d1d25f0":1,"e9b172bbe58746a0bfc16211d1d8f989":1,"f59692c377e743b892e085a8b518b713":1}} \ No newline at end of file diff --git a/pcb/AirsoftTracker 1.4/AirsoftTracker 1.3.json b/pcb/AirsoftTracker 1.4/AirsoftTracker 1.3.json new file mode 100644 index 0000000..55ced28 --- /dev/null +++ b/pcb/AirsoftTracker 1.4/AirsoftTracker 1.3.json @@ -0,0 +1 @@ +{"editorVersion":"6.4.7","docType":"5","title":"AirsoftTracker","description":"","colors":{},"schematics":[{"uuid":"c8a94b8712a814fb238f3e3dbbbd6e34","docType":"1","title":"MainSheet","description":"","dataStr":{"head":{"docType":"1","editorVersion":"6.4.16","newgId":true,"c_para":{"Prefix Start":"1"},"c_spiceCmd":"null","hasIdFlag":true,"uuid":"c8a94b8712a814fb238f3e3dbbbd6e34","x":"0","y":"0","portOfADImportHack":"","importFlag":0,"transformList":""},"canvas":"CA~1000~1000~#FFFFFF~yes~#CCCCCC~5~1000~1000~line~5~pixel~5~0~0","shape":["LIB~0~-806~package`NONE`BOM_Manufacturer Part`?`spicePre`.`~~0~frame_lib_1~~~0~~yes~yes#@$T~N~570.5~-809~0~#000080~Arial~~~~~comment~A~0~start~gge77~0~#@$PT~M 206 -796 L 206 -806 M 206 -10 L 206 0 M 402 -796 L 402 -806 M 402 -10 L 402 0 M 598 -796 L 598 -806 M 598 -10 L 598 0 M 794 -796 L 794 -806 M 794 -10 L 794 0 M 990 -796 L 990 -806 M 990 -10 L 990 0 M 10 -600 L 0 -600 M 1139 -600 L 1149 -600 M 10 -404 L 0 -404 M 1139 -404 L 1149 -404 M 10 -208 L 0 -208 M 1139 -208 L 1149 -208 M 10 -12 L 0 -12 M 1139 -12 L 1149 -12~#880000~1~0~none~gge6~0~frame_tick#@$T~P~571.5~-818~0~#000080~Arial~~~~~comment~A~0~start~gge76~0~#@$T~L~1.5~-698~0~#880000~~~~~~comment~A~1~start~gge7~0~frame_tick#@$T~L~1140.5~-698~0~#880000~~~~~~comment~A~1~start~gge9~0~frame_tick#@$T~L~1.5~-502~0~#880000~~~~~~comment~B~1~start~gge11~0~frame_tick#@$T~L~1140.5~-502~0~#880000~~~~~~comment~B~1~start~gge13~0~frame_tick#@$T~L~1.5~-306~0~#880000~~~~~~comment~C~1~start~gge15~0~frame_tick#@$T~L~1140.5~-306~0~#880000~~~~~~comment~C~1~start~gge17~0~frame_tick#@$T~L~1.5~-110~0~#880000~~~~~~comment~D~1~start~gge19~0~frame_tick#@$T~L~1140.5~-110~0~#880000~~~~~~comment~D~1~start~gge21~0~frame_tick#@$T~L~108~-797.5~0~#880000~~~~~~comment~1~1~start~gge23~0~frame_tick#@$T~L~108~-1.5~0~#880000~~~~~~comment~1~1~start~gge25~0~frame_tick#@$T~L~304~-797.5~0~#880000~~~~~~comment~2~1~start~gge27~0~frame_tick#@$T~L~304~-1.5~0~#880000~~~~~~comment~2~1~start~gge29~0~frame_tick#@$T~L~500~-797.5~0~#880000~~~~~~comment~3~1~start~gge31~0~frame_tick#@$T~L~500~-1.5~0~#880000~~~~~~comment~3~1~start~gge33~0~frame_tick#@$T~L~696~-797.5~0~#880000~~~~~~comment~4~1~start~gge35~0~frame_tick#@$T~L~696~-1.5~0~#880000~~~~~~comment~4~1~start~gge37~0~frame_tick#@$T~L~892~-797.5~0~#880000~~~~~~comment~5~1~start~gge39~0~frame_tick#@$T~L~892~-1.5~0~#880000~~~~~~comment~5~1~start~gge?~0~frame_tick#@$R~10~-796~~~1129~786~#880000~1~0~none~gge42~0~frame_innerbox#@$R~0~-806~~~1149~806~#880000~1~0~none~gge43~0~frame_outbox#@$R~694.99995~-90~~~444~80~#880000~1~0~none~gge44~0~frame_hitarea#@$PL~695.1 -50.75 1138.63 -50.75~#880000~1~0~none~gge45~0#@$PL~799.63 -30.75 1138.63 -30.75~#880000~1~0~none~gge46~0#@$PL~1059.61 -89.93 1059.63 -50.75~#880000~1~0~none~gge47~0#@$PL~1059.63 -50.75 1059.63 -30.75~#880000~1~0~none~gge48~0#@$T~L~699.99995~-77~0~#880000~~8pt~~~~comment~TITLE:~1~start~gge49~0~pinpart#@$T~L~757.62495~-64.41~0~#0000FF~~10pt~~~~comment~Airsoft Tracker~1~start~gge51~0~frame_title#@$T~L~1064.62495~-63.75~0~#880000~~8pt~~~~comment~REV:~1~start~gge53~0~pinpart#@$T~L~1102.62495~-63.75~0~#0000FF~~9pt~~~~comment~1.0~1~start~gge55~0~frame_version#@$T~L~804.62495~-15~0~#880000~~8pt~~~~comment~Date:~1~start~gge57~0~pinpart#@$T~L~851.62495~-14.52~0~#0000FF~~9pt~~~~comment~2021-01-15~1~start~gge59~0~frame_date#@$T~L~1063.62495~-35~0~#880000~~8pt~~~~comment~Sheet:~1~start~gge61~0~pinpart#@$T~L~1108.62495~-34.52~0~#0000FF~~9pt~~~~comment~1/1~1~start~gge63~0~frame_sheet#@$T~L~943.62495~-14.75~0~#880000~~8pt~~~~comment~Drawn By:~1~start~gge65~0~pinpart#@$T~L~1008.63~-14.75~0~#0000FF~~9pt~~~~comment~ddv2020~1~start~gge67~0~frame_drawn#@$T~L~804.62495~-36.75~0~#880000~~8pt~~~~comment~Company:~1~start~gge69~0~pinpart#@$T~L~871.24995~-36.64~0~#0000FF~~9pt~~~~comment~DDV~1~start~gge71~0~frame_company#@$PL~799.63 -50.75 799.63 -10.75~#880000~1~0~none~gge73~0#@$Pimage~L~1~gge74~0~gge75~694.99995~-38~104~20~data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0i5Zu+5bGCXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNTIwIg0KCSB2aWV3Qm94PSIwIDAgMTY5Mi45IDM0MS41IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxNjkyLjkgMzQxLjU7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiM1NTg4RkY7fQ0KPC9zdHlsZT4NCjxnPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik05MDEuNywxNjEuMWMyLjMtMS44LDUuMS0yLjcsOC4zLTIuN2M0LjMsMCw4LjksMS42LDEzLjgsNC43YzQuOSwzLjEsOS42LDgsMTQuMSwxNC43bDE3LjQtMjcuOQ0KCQljLTUuNC03LjgtMTIuMS0xMy45LTIwLjItMTguMmMtOC4xLTQuMy0xNi43LTYuNC0yNS43LTYuNGMtMTIuOCwwLTI0LDMuOS0zMy40LDExLjdjLTkuNCw3LjgtMTQuMSwxOC0xNC4xLDMwLjQNCgkJYzAsOC45LDMsMTcuNCw5LDI1LjRjNC4zLDUuNywxMi4xLDEyLjYsMjMuMywyMC42YzkuNyw2LjksMTUuNywxMS43LDE3LjksMTQuNGMyLjIsMi43LDMuMyw1LjMsMy4zLDcuOWMwLDMuMi0xLjQsNS45LTQuMyw4LjMNCgkJYy0yLjksMi4zLTYuNywzLjUtMTEuNSwzLjVjLTEyLjEsMC0yMy4zLTYuNy0zMy41LTIwLjJsLTIyLjUsMjYuMmMxMCwxMC42LDE5LjEsMTgsMjcuMiwyMmM4LjEsNCwxNy4yLDYsMjcuMSw2DQoJCWMxNy4yLDAsMzAuMy00LjksMzkuNC0xNC43YzkuMS05LjgsMTMuNi0yMC4zLDEzLjYtMzEuM2MwLTguNC0yLjItMTYuMS02LjYtMjMuM2MtNC40LTcuMS0xMy42LTE1LjctMjcuNi0yNS43DQoJCWMtOC44LTYuMy0xNC0xMC41LTE1LjctMTIuN2MtMS44LTIuMi0yLjctNC40LTIuNy02LjZDODk4LjIsMTY0LjksODk5LjQsMTYyLjksOTAxLjcsMTYxLjF6Ii8+DQoJPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxMDM4LjcsMjE3LjIgMTAwOS44LDEyOS4xIDk3NCwxMjkuMSAxMDE1LjgsMjU3LjQgOTczLjYsMzMyIDEwMTIuMSwzMzIgMTEyOC44LDEyOS4xIDEwODkuNSwxMjkuMSAJDQoJCSIvPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02NTEuNSwxNTQuMWwtNzAuNCwwbDUuOC00MS43YzAsMCw3NC43LTAuMSw3NS4xLTAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44YzAtOS44LTgtMTcuOC0xNy44LTE3LjgNCgkJYy0wLjMsMC0xMDguNCwwLTEwOC40LDBMNTI2LDI3Ny43aDExMy4ydjBjOS41LTAuMiwxNy4yLTgsMTcuMi0xNy41YzAtOS43LTcuOS0xNy42LTE3LjYtMTcuNmMtMC40LDAtNzAuMiwwLjEtNzAuMiwwLjFsNy40LTUzLjMNCgkJYzAsMCw3MS43LDAuMSw3Mi4zLDAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44QzY2Ni4zLDE2Mi44LDY1OS45LDE1NS41LDY1MS41LDE1NC4xeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMjY4LjQsNzYuOGMtMC4zLDAtMTA4LjQsMC0xMDguNCwwbC0yNy40LDIwMC44aDExMy4zdjBjOS41LTAuMiwxNy4yLTgsMTcuMi0xNy41YzAtOS43LTcuOS0xNy42LTE3LjYtMTcuNg0KCQljLTAuNCwwLTcwLjIsMC4xLTcwLjIsMC4xbDcuNC01My4zYzAsMCw3MS43LDAuMSw3Mi40LDAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44YzAtOC44LTYuNC0xNi4xLTE0LjgtMTcuNWwtNzAuNCwwbDUuOC00MS43DQoJCWMwLDAsNzQuNy0wLjEsNzUuMS0wLjFjOS44LDAsMTcuOC04LDE3LjgtMTcuOEMxMjg2LjIsODQuOCwxMjc4LjMsNzYuOCwxMjY4LjQsNzYuOHoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTQ3MC43LDE3M2MwLTE5LjctNC42LTM3LjItMTMuNy01Mi4zYy05LjEtMTUuMS0yMC45LTI2LjItMzUuNS0zMy4yYy0xNC42LTcuMS0zNi43LTEwLjYtNjYuNi0xMC42aC0zMS44DQoJCWwtMjcuNCwyMDAuOGg2Mi40YzI2LjIsMCw0Ni43LTMuOSw2MS40LTExLjdjMTQuNy03LjgsMjctMjAuMiwzNi43LTM3LjFDMTQ2NS45LDIxMS45LDE0NzAuNywxOTMuMywxNDcwLjcsMTczeiBNMTQyMS4zLDIxNC41DQoJCWMtNy4zLDExLTE2LjksMTguOC0yOC45LDIzLjNjLTguNiwzLjItMjIuNCw0LjgtNDEuNSw0LjhoLTEyLjRsMTcuNy0xMzAuNGg5LjVjMTUuNSwwLDI3LjksMi40LDM3LjIsNy4zDQoJCWM5LjMsNC45LDE2LjUsMTEuOCwyMS43LDIwLjhjNS4xLDksNy43LDIwLjEsNy43LDMzLjRDMTQzMi4yLDE4OS44LDE0MjguNiwyMDMuNSwxNDIxLjMsMjE0LjV6Ii8+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTE2MTkuMiwxNzAuN2wtMjIuMywxMi4zYy0xLjgsMTYuMi0xNS42LDI4LjctMzIuMiwyOC43Yy0xNy45LDAtMzIuNC0xNC41LTMyLjQtMzIuNA0KCQljMC0xNy45LDE0LjUtMzIuNCwzMi40LTMyLjRjNi45LDAsMTMuMywyLjIsMTguNSw1LjhsMjcuNy0xNS4zbC0xNS02MC4yaC0zMS43bC0xMDgsMjAwaDQwLjRsMjIuOC00Mi42aDc5LjRsMTAuNiw0Mi42aDM2LjQNCgkJTDE2MTkuMiwxNzAuN3oiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTU1Mi44LDE3OC41YzAsNi45LDUuNiwxMi41LDEyLjUsMTIuNWM2LjksMCwxMi41LTUuNiwxMi41LTEyLjVjMC02LjktNS42LTEyLjUtMTIuNS0xMi41DQoJCUMxNTU4LjQsMTY2LDE1NTIuOCwxNzEuNiwxNTUyLjgsMTc4LjV6Ii8+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTgxNC44LDE1Mi41QzgxNC44LDE1Mi41LDgxNC44LDE1Mi40LDgxNC44LDE1Mi41bC0xMi41LDBsLTEuMy0yLjRjLTUuMS04LjEtMTEuNS0xNC4yLTE5LjItMTguNA0KCQljLTcuOC00LjItMjAuMS02LjMtMjkuMy02LjNjLTEzLjcsMC0yNi44LDMuNy0zOS4zLDExLjFjLTEyLjUsNy40LTIyLjUsMTcuNy0yOS45LDMxYy03LjQsMTMuMi0xMS4yLDI3LjItMTEuMiw0MS44DQoJCWMwLDE5LjIsNS44LDM2LDE3LjQsNTAuNWMxMS42LDE0LjUsMjcuMywyMS43LDQ3LDIxLjdjOC42LDAsMTYuMy0xLjQsMjMuMi00LjRjNi45LTIuOSwxNC4zLTgsMjIuMi0xNS40YzAsMCw5LjMsOC4xLDkuNCw4DQoJCWM1LjgsNC42LDEzLDcuNSwyMC44LDhoMy42bDAuNS00LjNsMTIuNy0xMDYuOWMtMC4xLDAtMC4xLDAtMC4yLDBDODI4LjcsMTU4LjgsODIyLjUsMTUyLjYsODE0LjgsMTUyLjV6IE03ODUuNiwyMjQuMg0KCQljLTQuNSw4LjUtMTAuMSwxNC44LTE2LjgsMTguOGMtNi43LDQtMTQuNSw2LTIzLjUsNmMtMTAuOCwwLTE5LjYtMy41LTI2LjUtMTAuN2MtNi45LTcuMS0xMC4zLTE2LjUtMTAuMy0yOC4xDQoJCWMwLTE1LjEsNC41LTI3LjQsMTMuNi0zN2M5LjEtOS42LDIwLjEtMTQuMywzMy4xLTE0LjNjMTEuMiwwLDIwLjIsMy42LDI3LDEwLjdjNi44LDcuMiwxMC4yLDE2LjYsMTAuMiwyOC40DQoJCUM3OTIuNCwyMDYuOSw3OTAuMSwyMTUuNyw3ODUuNiwyMjQuMnoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNNDA0LjMsOTYuM2MtNy41LTE5LjktMTkuNy0zNy44LTM1LjgtNTIuM2MtMjQuNy0yMi4yLTU2LjctMzQuNS05MC0zNC41Yy0yOC44LDAtNTYuMyw5LTc5LjUsMjYNCgkJYy0xMS4yLDguMi0yMC45LDE3LjktMjguOSwyOC45Yy01LTAuNy0xMC4xLTEuMS0xNS4zLTEuMWMtMjguNywwLTU1LjgsMTEuMi03Ni4xLDMxLjVjLTIwLjMsMjAuMy0zMS41LDQ3LjMtMzEuNSw3Ni4xDQoJCWMwLDI2LjcsOS45LDUyLjMsMjcuOCw3Mi4xYzE0LjIsMTUuNywzMi42LDI2LjgsNTIuOSwzMmM4LjgsMjYuMiwzMy42LDQ1LjEsNjIuNyw0NS4xYzM2LjUsMCw2Ni4yLTI5LjcsNjYuMi02Ni4yDQoJCWMwLTIuMS0wLjEtNC4zLTAuMy02LjRsOTIuOS00OC44bC0yMC4zLTM1LjJsLTg4LjgsNDYuNmMtMTIuMS0xMy44LTI5LjktMjIuNS00OS43LTIyLjVjLTI4LjcsMC01My4yLDE4LjQtNjIuNCw0NA0KCQljLTIzLjQtMTAuMy0zOS44LTMzLjYtMzkuOC02MC44YzAtMzYuNiwyOS43LTY2LjQsNjYuNC02Ni40YzEyLjksMCwyNSwzLjcsMzUuMiwxMC4xYzEyLjMtMzcuMSw0Ny4zLTYzLjksODguNS02My45DQoJCWM0OCwwLDg3LjQsMzYuMiw5Mi43LDgyLjdjMS43LTAuMiwzLjQtMC4zLDUuMS0wLjNjMjguNywwLDUyLDIzLjMsNTIsNTJjMCwyNy4yLTIwLjksNDkuNS00Ny41LDUxLjhsLTI5LjcsMA0KCQljLTEuMy0wLjMtMi43LTAuNC00LjEtMC40Yy0xMS41LDAtMjAuOCw5LjMtMjAuOCwyMC44YzAsMTAuOSw4LjQsMTkuOCwxOS4xLDIwLjd2MC4ybDM1LjUsMGwxLjgsMGwxLjgtMC4yDQoJCWMyMy4yLTIsNDQuNy0xMi41LDYwLjUtMjkuN2MxNS45LTE3LjMsMjQuNy0zOS43LDI0LjctNjMuMkM0NjkuNiwxNDMuNiw0NDIuMSwxMDguMiw0MDQuMyw5Ni4zeiBNMTkwLjYsMjI4LjMNCgkJYzE0LjEsMCwyNS42LDExLjUsMjUuNiwyNS42YzAsMTQuMS0xMS41LDI1LjYtMjUuNiwyNS42Yy0xNC4xLDAtMjUuNi0xMS41LTI1LjYtMjUuNkMxNjUsMjM5LjgsMTc2LjUsMjI4LjMsMTkwLjYsMjI4LjN6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==","LIB~505~-570~package`TTGO-T-BEAM-ESP32-CONNECTOR`BOM_Manufacturer``BOM_Manufacturer Part``BOM_Supplier Part``BOM_Supplier``link``Contributor`grizli2509`spicePre`U`spiceSymbolName`TTGO-BEAM-ESP32`Package Display`No`~~0~gge6aaff6c194964e3d~5180c2e0c1da4a75b575a8495aee30f2~5657e928f1504b21b9e68062d66ba3e3~0~~yes~yes#@$T~N~470.46~-721.7890625~0~#000080~Arial~~~~~comment~MAIN BOARD~1~start~gge857~0~#@$T~P~494.04~-732.125~0~#000080~Arial~~~~~comment~U1~1~start~gge859~0~#@$P~show~0~1~475~-700~~gge861~0^^475~-700^^M 475 -700 h -20~#880000^^1~453~-697~0~S_VP~end~~~#0000FF^^1~460~-701~0~S_VP~start~~~#0000FF^^0~458~-700^^0~M 455 -703 L 452 -700 L 455 -697#@$P~show~0~2~475~-680~~gge868~0^^475~-680^^M 475 -680 h -20~#880000^^1~453~-677~0~S_VN~end~~~#0000FF^^1~460~-681~0~S_VN~start~~~#0000FF^^0~458~-680^^0~M 455 -683 L 452 -680 L 455 -677#@$P~show~0~3~475~-660~~gge875~0^^475~-660^^M 475 -660 h -20~#880000^^1~453~-657~0~RST~end~~~#0000FF^^1~460~-661~0~RST~start~~~#0000FF^^0~458~-660^^0~M 455 -663 L 452 -660 L 455 -657#@$P~show~0~4~475~-640~~gge882~0^^475~-640^^M 475 -640 h -20~#880000^^1~453~-637~0~15~end~~~#0000FF^^1~460~-641~0~15~start~~~#0000FF^^0~458~-640^^0~M 455 -643 L 452 -640 L 455 -637#@$P~show~0~5~475~-620~~gge889~0^^475~-620^^M 475 -620 h -20~#880000^^1~453~-617~0~35~end~~~#0000FF^^1~460~-621~0~35~start~~~#0000FF^^0~458~-620^^0~M 455 -623 L 452 -620 L 455 -617#@$P~show~0~6~475~-600~~gge896~0^^475~-600^^M 475 -600 h -20~#880000^^1~453~-597~0~32~end~~~#0000FF^^1~460~-601~0~32~start~~~#0000FF^^0~458~-600^^0~M 455 -603 L 452 -600 L 455 -597#@$P~show~0~7~475~-580~~gge903~0^^475~-580^^M 475 -580 h -20~#880000^^1~453~-577~0~33~end~~~#0000FF^^1~460~-581~0~33~start~~~#0000FF^^0~458~-580^^0~M 455 -583 L 452 -580 L 455 -577#@$P~show~0~8~475~-560~~gge910~0^^475~-560^^M 475 -560 h -20~#880000^^1~453~-557~0~25~end~~~#0000FF^^1~460~-561~0~25~start~~~#0000FF^^0~458~-560^^0~M 455 -563 L 452 -560 L 455 -557#@$P~show~0~9~475~-540~~gge917~0^^475~-540^^M 475 -540 h -20~#880000^^1~453~-537~0~14~end~~~#0000FF^^1~460~-541~0~14~start~~~#0000FF^^0~458~-540^^0~M 455 -543 L 452 -540 L 455 -537#@$P~show~0~10~475~-520~~gge924~0^^475~-520^^M 475 -520 h -20~#880000^^1~453~-517~0~13~end~~~#0000FF^^1~460~-521~0~13~start~~~#0000FF^^0~458~-520^^0~M 455 -523 L 452 -520 L 455 -517#@$P~show~0~11~475~-500~~gge931~0^^475~-500^^M 475 -500 h -20~#880000^^1~453~-497~0~02~end~~~#0000FF^^1~460~-501~0~02~start~~~#0000FF^^0~458~-500^^0~M 455 -503 L 452 -500 L 455 -497#@$P~show~0~12~475~-480~~gge938~0^^475~-480^^M 475 -480 h -20~#880000^^1~453~-477~0~GND~end~~~#0000FF^^1~460~-481~0~GND_3~start~~~#0000FF^^0~458~-480^^0~M 455 -483 L 452 -480 L 455 -477#@$P~show~0~13~475~-460~~gge945~0^^475~-460^^M 475 -460 h -20~#880000^^1~453~-457~0~5V~end~~~#0000FF^^1~460~-461~0~5V~start~~~#0000FF^^0~458~-460^^0~M 455 -463 L 452 -460 L 455 -457#@$P~show~0~14~515~-460~180~gge952~0^^515~-460^^M 515 -460 h 20~#880000^^1~537~-457~0~LORA1~start~~~#0000FF^^1~530~-461~0~LORA1~end~~~#0000FF^^0~532~-460^^0~M 535 -457 L 538 -460 L 535 -463#@$P~show~0~15~515~-480~180~gge959~0^^515~-480^^M 515 -480 h 20~#880000^^1~537~-477~0~LORA2~start~~~#0000FF^^1~530~-481~0~LORA2~end~~~#0000FF^^0~532~-480^^0~M 535 -477 L 538 -480 L 535 -483#@$P~show~0~16~515~-500~180~gge966~0^^515~-500^^M 515 -500 h 20~#880000^^1~537~-497~0~3V3~start~~~#0000FF^^1~528.33~-501~0~3V3_2~end~~~#0000FF^^0~532~-500^^0~M 535 -497 L 538 -500 L 535 -503#@$P~show~0~17~515~-520~180~gge973~0^^515~-520^^M 515 -520 h 20~#880000^^1~537~-517~0~21~start~~~#0000FF^^1~527.5~-521~0~21~end~~~#0000FF^^0~532~-520^^0~M 535 -517 L 538 -520 L 535 -523#@$P~show~0~18~515~-540~180~gge980~0^^515~-540^^M 515 -540 h 20~#880000^^1~537~-537~0~22~start~~~#0000FF^^1~530~-541~0~22~end~~~#0000FF^^0~532~-540^^0~M 535 -537 L 538 -540 L 535 -543#@$P~show~0~19~515~-560~180~gge987~0^^515~-560^^M 515 -560 h 20~#880000^^1~537~-557~0~GND~start~~~#0000FF^^1~530~-561~0~GND_2~end~~~#0000FF^^0~532~-560^^0~M 535 -557 L 538 -560 L 535 -563#@$P~show~0~20~515~-580~180~gge994~0^^515~-580^^M 515 -580 h 20~#880000^^1~537~-577~0~3V3~start~~~#0000FF^^1~530~-581~0~3V3_1~end~~~#0000FF^^0~532~-580^^0~M 535 -577 L 538 -580 L 535 -583#@$P~show~0~21~515~-600~180~gge1001~0^^515~-600^^M 515 -600 h 20~#880000^^1~537~-597~0~GND~start~~~#0000FF^^1~530~-601~0~GND_1~end~~~#0000FF^^0~532~-600^^0~M 535 -597 L 538 -600 L 535 -603#@$P~show~0~22~515~-620~180~gge1008~0^^515~-620^^M 515 -620 h 20~#880000^^1~537~-617~0~0~start~~~#0000FF^^1~530~-621~0~0~end~~~#0000FF^^0~532~-620^^0~M 535 -617 L 538 -620 L 535 -623#@$P~show~0~23~515~-640~180~gge1015~0^^515~-640^^M 515 -640 h 20~#880000^^1~537~-637~0~4~start~~~#0000FF^^1~530~-641~0~4~end~~~#0000FF^^0~532~-640^^0~M 535 -637 L 538 -640 L 535 -643#@$P~show~0~24~515~-660~180~gge1022~0^^515~-660^^M 515 -660 h 20~#880000^^1~537~-657~0~23~start~~~#0000FF^^1~530~-661~0~23~end~~~#0000FF^^0~532~-660^^0~M 535 -657 L 538 -660 L 535 -663#@$P~show~0~25~515~-680~180~gge1029~0^^515~-680^^M 515 -680 h 20~#880000^^1~537~-677~0~RX~start~~~#0000FF^^1~530~-681~0~RX~end~~~#0000FF^^0~532~-680^^0~M 535 -677 L 538 -680 L 535 -683#@$P~show~0~26~515~-700~180~gge1036~0^^515~-700^^M 515 -700 h 20~#880000^^1~537~-697~0~TX~start~~~#0000FF^^1~530~-701~0~TX~end~~~#0000FF^^0~532~-700^^0~M 535 -697 L 538 -700 L 535 -703#@$R~415~-720~~~170~290~#000000~1~0~none~gge1043~0~","LIB~750~-375~package`MCP23017`BOM_Manufacturer``BOM_Manufacturer Part`MCP23017`BOM_Supplier Part``BOM_Supplier``link``Contributor`emmanuel.malosse`spicePre`U`spiceSymbolName`MCP23017`~~0~ggeb1124de9a27319d1~f09420c4fd9946a583a6b15c1c5a483e~0f118b0d9063400da84e04b55532a171~0~~yes~yes#@$T~N~744.03125~-468.296875~0~#000080~Arial~~~~~comment~MCP23017~1~start~gge3184~0~#@$T~P~744.0390625~-477.421875~0~#000080~Arial~~~~~comment~U3~1~start~gge3186~0~#@$P~show~0~1~680~-455~180~gge3188~0^^680~-455^^M 680 -455 h 20~#880000^^1~702~-452~0~VCC~start~~~#0000FF^^1~695~-456~0~11~end~~~#0000FF^^0~697~-455^^0~M 700 -452 L 703 -455 L 700 -458#@$P~show~0~2~680~-445~180~gge3195~0^^680~-445^^M 680 -445 h 20~#880000^^1~702~-442~0~VCC~start~~~#0000FF^^1~695~-446~0~10~end~~~#0000FF^^0~697~-445^^0~M 700 -442 L 703 -445 L 700 -448#@$P~show~0~3~680~-405~180~gge3202~0^^680~-405^^M 680 -405 h 20~#880000^^1~702~-402~0~A0~start~~~#0000FF^^1~695~-406~0~3~end~~~#0000FF^^0~697~-405^^0~M 700 -402 L 703 -405 L 700 -408#@$P~show~0~4~680~-395~180~gge3209~0^^680~-395^^M 680 -395 h 20~#880000^^1~702~-392~0~A1~start~~~#0000FF^^1~695~-396~0~2~end~~~#0000FF^^0~697~-395^^0~M 700 -392 L 703 -395 L 700 -398#@$P~show~0~5~680~-385~180~gge3216~0^^680~-385^^M 680 -385 h 20~#880000^^1~702~-382~0~A2~start~~~#0000FF^^1~695~-386~0~1~end~~~#0000FF^^0~697~-385^^0~M 700 -382 L 703 -385 L 700 -388#@$P~show~0~6~680~-375~180~gge3223~0^^680~-375^^M 680 -375 h 20~#880000^^1~702~-372~0~Reset~start~~~#0000FF^^1~695~-376~0~4~end~~~#0000FF^^0~697~-375^^0~M 700 -372 L 703 -375 L 700 -378#@$P~show~0~7~680~-355~180~gge3230~0^^680~-355^^M 680 -355 h 20~#880000^^1~702~-352~0~SO~start~~~#0000FF^^1~695~-356~0~5~end~~~#0000FF^^0~697~-355^^0~M 700 -352 L 703 -355 L 700 -358#@$P~show~0~8~680~-345~180~gge3237~0^^680~-345^^M 680 -345 h 20~#880000^^1~702~-342~0~CS~start~~~#0000FF^^1~695~-346~0~6~end~~~#0000FF^^0~697~-345^^0~M 700 -342 L 703 -345 L 700 -348#@$P~show~0~9~680~-335~180~gge3244~0^^680~-335^^M 680 -335 h 20~#880000^^1~702~-332~0~SDA~start~~~#0000FF^^1~695~-336~0~7~end~~~#0000FF^^0~697~-335^^0~M 700 -332 L 703 -335 L 700 -338#@$P~show~0~10~680~-325~180~gge3251~0^^680~-325^^M 680 -325 h 20~#880000^^1~702~-322~0~SCL~start~~~#0000FF^^1~695~-326~0~8~end~~~#0000FF^^0~697~-325^^0~M 700 -322 L 703 -325 L 700 -328#@$P~show~0~11~820~-455~0~gge3258~0^^820~-455^^M 820 -455 h -20~#880000^^1~798~-452~0~A0~end~~~#0000FF^^1~805~-456~0~23~start~~~#0000FF^^0~803~-455^^0~M 800 -458 L 797 -455 L 800 -452#@$P~show~0~12~820~-445~0~gge3265~0^^820~-445^^M 820 -445 h -20~#880000^^1~798~-442~0~A1~end~~~#0000FF^^1~805~-446~0~24~start~~~#0000FF^^0~803~-445^^0~M 800 -448 L 797 -445 L 800 -442#@$P~show~0~13~820~-435~0~gge3272~0^^820~-435^^M 820 -435 h -20~#880000^^1~798~-432~0~A2~end~~~#0000FF^^1~805~-436~0~25~start~~~#0000FF^^0~803~-435^^0~M 800 -438 L 797 -435 L 800 -432#@$P~show~0~14~820~-425~0~gge3279~0^^820~-425^^M 820 -425 h -20~#880000^^1~798~-422~0~A3~end~~~#0000FF^^1~805~-426~0~26~start~~~#0000FF^^0~803~-425^^0~M 800 -428 L 797 -425 L 800 -422#@$P~show~0~15~820~-415~0~gge3286~0^^820~-415^^M 820 -415 h -20~#880000^^1~798~-412~0~A4~end~~~#0000FF^^1~805~-416~0~27~start~~~#0000FF^^0~803~-415^^0~M 800 -418 L 797 -415 L 800 -412#@$P~show~0~16~820~-405~0~gge3293~0^^820~-405^^M 820 -405 h -20~#880000^^1~798~-402~0~A5~end~~~#0000FF^^1~805~-406~0~28~start~~~#0000FF^^0~803~-405^^0~M 800 -408 L 797 -405 L 800 -402#@$P~show~0~17~820~-395~0~gge3300~0^^820~-395^^M 820 -395 h -20~#880000^^1~798~-392~0~A6~end~~~#0000FF^^1~805~-396~0~29~start~~~#0000FF^^0~803~-395^^0~M 800 -398 L 797 -395 L 800 -392#@$P~show~0~18~820~-385~0~gge3307~0^^820~-385^^M 820 -385 h -20~#880000^^1~798~-382~0~A7~end~~~#0000FF^^1~805~-386~0~30~start~~~#0000FF^^0~803~-385^^0~M 800 -388 L 797 -385 L 800 -382#@$P~show~0~19~820~-365~0~gge3314~0^^820~-365^^M 820 -365 h -20~#880000^^1~798~-362~0~B0~end~~~#0000FF^^1~805~-366~0~13~start~~~#0000FF^^0~803~-365^^0~M 800 -368 L 797 -365 L 800 -362#@$P~show~0~20~820~-355~0~gge3321~0^^820~-355^^M 820 -355 h -20~#880000^^1~798~-352~0~B1~end~~~#0000FF^^1~805~-356~0~14~start~~~#0000FF^^0~803~-355^^0~M 800 -358 L 797 -355 L 800 -352#@$P~show~0~21~820~-345~0~gge3328~0^^820~-345^^M 820 -345 h -20~#880000^^1~798~-342~0~B2~end~~~#0000FF^^1~805~-346~0~15~start~~~#0000FF^^0~803~-345^^0~M 800 -348 L 797 -345 L 800 -342#@$P~show~0~22~820~-335~0~gge3335~0^^820~-335^^M 820 -335 h -20~#880000^^1~798~-332~0~B3~end~~~#0000FF^^1~805~-336~0~16~start~~~#0000FF^^0~803~-335^^0~M 800 -338 L 797 -335 L 800 -332#@$P~show~0~23~820~-325~0~gge3342~0^^820~-325^^M 820 -325 h -20~#880000^^1~798~-322~0~B4~end~~~#0000FF^^1~805~-326~0~17~start~~~#0000FF^^0~803~-325^^0~M 800 -328 L 797 -325 L 800 -322#@$P~show~0~24~820~-315~0~gge3349~0^^820~-315^^M 820 -315 h -20~#880000^^1~798~-312~0~B5~end~~~#0000FF^^1~805~-316~0~18~start~~~#0000FF^^0~803~-315^^0~M 800 -318 L 797 -315 L 800 -312#@$P~show~0~25~820~-305~0~gge3356~0^^820~-305^^M 820 -305 h -20~#880000^^1~798~-302~0~B6~end~~~#0000FF^^1~805~-306~0~19~start~~~#0000FF^^0~803~-305^^0~M 800 -308 L 797 -305 L 800 -302#@$P~show~0~26~820~-295~0~gge3363~0^^820~-295^^M 820 -295 h -20~#880000^^1~798~-292~0~B7~end~~~#0000FF^^1~805~-296~0~20~start~~~#0000FF^^0~803~-295^^0~M 800 -298 L 797 -295 L 800 -292#@$P~show~0~27~680~-305~180~gge3370~0^^680~-305^^M 680 -305 h 20~#880000^^1~702~-302~0~ITA~start~~~#0000FF^^1~695~-306~0~22~end~~~#0000FF^^0~697~-305^^0~M 700 -302 L 703 -305 L 700 -308#@$P~show~0~28~680~-295~180~gge3377~0^^680~-295^^M 680 -295 h 20~#880000^^1~702~-292~0~ITB~start~~~#0000FF^^1~695~-296~0~11~end~~~#0000FF^^0~697~-295^^0~M 700 -292 L 703 -295 L 700 -298#@$T~L~720~-312.78~0~#0000FF~~9pt~~~~comment~MCP23017~1~start~gge3384~0~pinpart#@$R~700~-465~~~100~180~#000000~1~0~none~gge3386~0~#@$P~show~0~29~680~-435~180~gge3387~0^^680~-435^^M 680 -435 h 20~#880000^^1~702~-432~0~GND~start~~~#0000FF^^1~695~-436~0~21~end~~~#0000FF^^0~697~-435^^0~M 700 -432 L 703 -435 L 700 -438#@$P~show~0~0~680~-425~180~gge3394~0^^680~-425^^M 680 -425 h 20~#880000^^1~702~-422~0~GND~start~~~#0000FF^^1~695~-426~0~9~end~~~#0000FF^^0~697~-425^^0~M 700 -422 L 703 -425 L 700 -428","W~515 -560 665 -560 665 -660 700 -660~#008800~1~0~none~gge3621~0","W~680 -435 665 -435 665 -560~#008800~1~0~none~gge3622~0","W~680 -425 665 -425 665 -435~#008800~1~0~none~gge3626~0","W~515 -540 645 -540 645 -640 700 -640~#008800~1~0~none~gge3630~0","W~680 -325 645 -325 645 -540~#008800~1~0~none~gge3631~0","W~515 -520 635 -520 635 -335 680 -335~#008800~1~0~none~gge3633~0","W~700 -620 675 -620 675 -520 635 -520~#008800~1~0~none~gge3634~0","F~part_netLabel_gnD~875~-645~0~gge3637~~0^^875~-645^^GND~#000000~862~-619~0~start~1~Times New Roman~9pt~flag_gge5^^PL~875 -635 875 -645~#000000~1~0~transparent~gge3641~0^^PL~866 -635 884 -635~#000000~1~0~transparent~gge3642~0^^PL~869 -633 881 -633~#000000~1~0~transparent~gge3643~0^^PL~872 -631 878 -631~#000000~1~0~transparent~gge3644~0^^PL~874 -629 876 -629~#000000~1~0~transparent~gge3645~0","W~875 -645 875 -725 665 -725 665 -660~#008800~1~0~none~gge3655~0","W~655 -680 655 -455 680 -455~#008800~1~0~none~gge3670~0","W~680 -445 655 -445 655 -455~#008800~1~0~none~gge3672~0","W~515 -500 625 -500 625 -680 700 -680~#008800~1~0~none~gge3674~0","W~515 -600 665 -600~#008800~1~0~none~gge5803~0","W~475 -480 360 -480 360 -760 665 -760 665 -695~#008800~1~0~none~gge5805~0","W~225 -750 225 -750 625 -750 625 -680~#008800~1~0~none~gge5807~0","W~300 -640 280 -640 280 -700 475 -700~#008800~1~0~none~gge5809~0","LIB~320~-640~package`RES-TH_BD1.8-L3.2-P7.20-D0.4`BOM_Supplier`LCSC`BOM_Supplier Part`C714232`BOM_Manufacturer`Huaxing Mechanical-Elec.`BOM_Manufacturer Part`CF1/6W-10KΊ¹5%T52`nameAlias`Resistance (Ohms)`Contributor`LCSC`spicePre`R`spiceSymbolName`CF1/6W-10KΊ¹5%T52`~~0~gge2be133cf7b4aac5a~97467e7cb6374f7e9dd7fc644a47cfb1~2ba8a26395ab41a2a00f577110f8f3f7~0~~yes~yes#@$T~N~314.03125~-648~0~#000080~Arial~~~~~comment~10kΊ~1~start~gge6472~0~#@$T~P~314.0390625~-657.125~0~#000080~Arial~~~~~comment~R2~1~start~gge6474~0~#@$R~310~-645~~~20~10~#A00000~1~0~none~gge6476~0~#@$P~show~0~2~340~-640~0~gge6477~0^^340~-640^^M 330 -640 h 10~#800^^0~326~-640~0~2~end~~~#800^^0~334~-644~0~2~start~~~#800^^0~353~-640^^0~M 350 -643 L 347 -640 L 350 -637#@$P~show~0~1~300~-640~180~gge6484~0^^300~-640^^M 310 -640 h -10~#800^^0~314~-640~0~1~start~~~#800^^0~306~-644~0~1~end~~~#800^^0~287~-640^^0~M 290 -637 L 293 -640 L 290 -643","W~335 -410 335 -390 360 -390 360 -375 420 -375 420 -410 610 -410 610 -580 515 -580~#008800~1~0~none~gge7116~0","W~335 -470 370 -470 370 -420 600 -420 600 -640 515 -640~#008800~1~0~none~gge7119~0","W~335 -430 405 -430 405 -500 475 -500~#008800~1~0~none~gge7120~0","W~335 -440 395 -440 395 -520 475 -520~#008800~1~0~none~gge7122~0","W~340 -640 360 -640~#008800~1~0~none~gge7126~0","W~335 -450 385 -450 385 -540 475 -540~#008800~1~0~none~gge7128~0","T~L~340~-405~0~#0000FF~~4pt~~~~comment~VCC~1~start~gge7135~0~pinpart","T~L~340~-465~0~#0000FF~~4pt~~~~comment~RST~1~start~gge7143~0~pinpart","T~L~340~-435~0~#0000FF~~4pt~~~~comment~MISO~1~start~gge7146~0~pinpart","T~L~340~-445~0~#0000FF~~4pt~~~~comment~MOSI~1~start~gge7149~0~pinpart","T~L~340~-425~0~#0000FF~~4pt~~~~comment~SCLK~1~start~gge7152~0~pinpart","T~L~340~-455~0~#0000FF~~4pt~~~~comment~CS~1~start~gge7155~0~pinpart","F~part_netLabel_gnD~330~-610~0~gge7160~~0^^330~-610^^GND~#000000~317~-584~0~start~1~Times New Roman~9pt~flag_gge6^^PL~330 -600 330 -610~#000000~1~0~transparent~gge7164~0^^PL~321 -600 339 -600~#000000~1~0~transparent~gge7165~0^^PL~324 -598 336 -598~#000000~1~0~transparent~gge7166~0^^PL~327 -596 333 -596~#000000~1~0~transparent~gge7167~0^^PL~329 -594 331 -594~#000000~1~0~transparent~gge7168~0","W~330 -610 360 -610~#008800~1~0~none~gge7178~0","W~280 -230 240 -230 240 -510 360 -510~#008800~1~0~none~gge7180~0","W~680 -405 665 -405 665 -425~#008800~1~0~none~gge7191~0","W~680 -395 665 -395 665 -405~#008800~1~0~none~gge7193~0","W~680 -385 665 -385 665 -395~#008800~1~0~none~gge7195~0","LIB~410~-230~package`WIRELM-TH_DWM1000`BOM_Supplier`LCSC`BOM_Manufacturer`DecaWave`BOM_Manufacturer Part`DWM1000`BOM_Supplier Part`C95238`spicePre`U`spiceSymbolName`DWM1000`~~0~gge40e5c90f659fccfc~921ff2190df246a4b1016c11071a51a1~605f956fd8c24817bb840fda3296ca74~0~~yes~yes#@$T~N~387.96875~-351.75~0~#000080~Arial~~~~~comment~DWM1000~1~start~gge7203~0~#@$T~P~404.21875~-362.125~0~#000080~Arial~~~~~comment~U5~1~start~gge7205~0~#@$E~295~-307~1.5~1.5~#880000~1~0~#880000~gge7207~0#@$R~290~-350~2~2~240~230~#880000~1~0~none~gge7208~0~#@$E~295~-307~1.5~1.5~#880000~1~0~#880000~gge7209~0#@$P~show~0~1~280~-300~180~gge7210~0^^280~-300^^M 280 -300 h 10~#880000^^1~293.7~-296~0~EXTON~start~~~#0000FF^^1~289.5~-301~0~1~end~~~#0000FF^^0~287~-300^^0~M 290 -297 L 293 -300 L 290 -303#@$P~show~0~2~280~-290~180~gge7217~0^^280~-290^^M 280 -290 h 10~#880000^^1~293.7~-286~0~WAKEUP~start~~~#0000FF^^1~289.5~-291~0~2~end~~~#0000FF^^0~287~-290^^0~M 290 -287 L 293 -290 L 290 -293#@$P~show~0~3~280~-280~180~gge7224~0^^280~-280^^M 280 -280 h 10~#880000^^1~293.7~-276~0~RSTn~start~~~#0000FF^^1~289.5~-281~0~3~end~~~#0000FF^^0~287~-280^^0~M 290 -277 L 293 -280 L 290 -283#@$P~show~0~4~280~-270~180~gge7231~0^^280~-270^^M 280 -270 h 10~#880000^^1~293.7~-266~0~GPIO7~start~~~#0000FF^^1~289.5~-271~0~4~end~~~#0000FF^^0~287~-270^^0~M 290 -267 L 293 -270 L 290 -273#@$P~show~0~5~280~-260~180~gge7238~0^^280~-260^^M 280 -260 h 10~#FF0000^^1~293.7~-256~0~VDDAON~start~~~#FF0000^^1~289.5~-261~0~5~end~~~#FF0000^^0~287~-260^^0~M 290 -257 L 293 -260 L 290 -263#@$P~show~0~6~280~-250~180~gge7245~0^^280~-250^^M 280 -250 h 10~#FF0000^^1~293.7~-246~0~VDD3V3~start~~~#FF0000^^1~289.5~-251~0~6~end~~~#FF0000^^0~287~-250^^0~M 290 -247 L 293 -250 L 290 -253#@$P~show~0~7~280~-240~180~gge7252~0^^280~-240^^M 280 -240 h 10~#FF0000^^1~293.7~-236~0~VDD3V3~start~~~#FF0000^^1~289.5~-241~0~7~end~~~#FF0000^^0~287~-240^^0~M 290 -237 L 293 -240 L 290 -243#@$P~show~0~8~280~-230~180~gge7259~0^^280~-230^^M 280 -230 h 10~#000000^^1~293.7~-226~0~VSS~start~~~#000000^^1~289.5~-231~0~8~end~~~#000000^^0~287~-230^^0~M 290 -227 L 293 -230 L 290 -233#@$P~show~0~9~370~-110~270~gge7266~0^^370~-110^^M 370 -110 v -10~#880000^^1~374~-123.7~270~GPIO6/EXTRXE/SPIPHA~start~~~#0000FF^^1~369~-119.5~270~9~end~~~#0000FF^^0~370~-117^^0~M 373 -120 L 370 -123 L 367 -120#@$P~show~0~10~380~-110~270~gge7273~0^^380~-110^^M 380 -110 v -10~#880000^^1~384~-123.7~270~GPIO5/EXTTXE/SPIPOL~start~~~#0000FF^^1~379~-119.5~270~10~end~~~#0000FF^^0~380~-117^^0~M 383 -120 L 380 -123 L 377 -120#@$P~show~0~11~390~-110~270~gge7280~0^^390~-110^^M 390 -110 v -10~#880000^^1~394~-123.7~270~GPIO4EXTPA~start~~~#0000FF^^1~389~-119.5~270~11~end~~~#0000FF^^0~390~-117^^0~M 393 -120 L 390 -123 L 387 -120#@$P~show~0~12~400~-110~270~gge7287~0^^400~-110^^M 400 -110 v -10~#880000^^1~404~-123.7~270~GPIO3TXLED~start~~~#0000FF^^1~399~-119.5~270~12~end~~~#0000FF^^0~400~-117^^0~M 403 -120 L 400 -123 L 397 -120#@$P~show~0~13~410~-110~270~gge7294~0^^410~-110^^M 410 -110 v -10~#880000^^1~414~-123.7~270~GPIO2RXLED~start~~~#0000FF^^1~409~-119.5~270~13~end~~~#0000FF^^0~410~-117^^0~M 413 -120 L 410 -123 L 407 -120#@$P~show~0~14~420~-110~270~gge7301~0^^420~-110^^M 420 -110 v -10~#880000^^1~424~-123.7~270~GPIO1SFDLED~start~~~#0000FF^^1~419~-119.5~270~14~end~~~#0000FF^^0~420~-117^^0~M 423 -120 L 420 -123 L 417 -120#@$P~show~0~15~430~-110~270~gge7308~0^^430~-110^^M 430 -110 v -10~#880000^^1~434~-123.7~270~GPIO0RXOKLED~start~~~#0000FF^^1~429~-119.5~270~15~end~~~#0000FF^^0~430~-117^^0~M 433 -120 L 430 -123 L 427 -120#@$P~show~0~16~440~-110~270~gge7315~0^^440~-110^^M 440 -110 v -10~#000000^^1~444~-123.7~270~VSS~start~~~#000000^^1~439~-119.5~270~16~end~~~#000000^^0~440~-117^^0~M 443 -120 L 440 -123 L 437 -120#@$P~show~0~17~540~-230~0~gge7322~0^^540~-230^^M 540 -230 h -10~#880000^^1~526.3~-226~0~SPICSn~end~~~#0000FF^^1~530.5~-231~0~17~start~~~#0000FF^^0~533~-230^^0~M 530 -233 L 527 -230 L 530 -227#@$P~show~0~18~540~-240~0~gge7329~0^^540~-240^^M 540 -240 h -10~#880000^^1~526.3~-236~0~SPIMOSI~end~~~#0000FF^^1~530.5~-241~0~18~start~~~#0000FF^^0~533~-240^^0~M 530 -243 L 527 -240 L 530 -237#@$P~show~0~19~540~-250~0~gge7336~0^^540~-250^^M 540 -250 h -10~#880000^^1~526.3~-246~0~SPIMISO~end~~~#0000FF^^1~530.5~-251~0~19~start~~~#0000FF^^0~533~-250^^0~M 530 -253 L 527 -250 L 530 -247#@$P~show~0~20~540~-260~0~gge7343~0^^540~-260^^M 540 -260 h -10~#880000^^1~526.3~-256~0~SPICLK~end~~~#0000FF^^1~530.5~-261~0~20~start~~~#0000FF^^0~533~-260^^0~M 530 -263 L 527 -260 L 530 -257#@$P~show~0~21~540~-270~0~gge7350~0^^540~-270^^M 540 -270 h -10~#000000^^1~526.3~-266~0~VSS~end~~~#000000^^1~530.5~-271~0~21~start~~~#000000^^0~533~-270^^0~M 530 -273 L 527 -270 L 530 -267#@$P~show~0~22~540~-280~0~gge7357~0^^540~-280^^M 540 -280 h -10~#880000^^1~526.3~-276~0~IRQ/GPIO8~end~~~#0000FF^^1~530.5~-281~0~22~start~~~#0000FF^^0~533~-280^^0~M 530 -283 L 527 -280 L 530 -277#@$P~show~0~23~540~-290~0~gge7364~0^^540~-290^^M 540 -290 h -10~#000000^^1~526.3~-286~0~VSS~end~~~#000000^^1~530.5~-291~0~23~start~~~#000000^^0~533~-290^^0~M 530 -293 L 527 -290 L 530 -287#@$P~show~0~24~540~-300~0~gge7371~0^^540~-300^^M 540 -300 h -10~#000000^^1~526.3~-296~0~VSS~end~~~#000000^^1~530.5~-301~0~24~start~~~#000000^^0~533~-300^^0~M 530 -303 L 527 -300 L 530 -297","W~335 -460 375 -460 375 -560 475 -560~#008800~1~0~none~gge7555~0","W~280 -260 225 -260 225 -750~#008800~1~0~none~gge7557~0","W~280 -250 225 -250 225 -260~#008800~1~0~none~gge7559~0","W~280 -240 225 -240 225 -250~#008800~1~0~none~gge7561~0","W~440 -110 440 -80 240 -80 240 -230~#008800~1~0~none~gge7565~0","W~540 -300 575 -300 575 -80 440 -80~#008800~1~0~none~gge7567~0","W~540 -290 575 -290~#008800~1~0~none~gge7569~0","W~540 -270 575 -270~#008800~1~0~none~gge7571~0","W~540 -240 585 -240 585 -380 385 -380 385 -450~#008800~1~0~none~gge7573~0","W~540 -250 595 -250 595 -390 395 -390 395 -440~#008800~1~0~none~gge7575~0","W~540 -260 605 -260 605 -400 405 -400 405 -430~#008800~1~0~none~gge7577~0","W~625 -280 625 -70 210 -70 210 -625 375 -625 375 -640 475 -640~#008800~1~0~none~gge7579~0","W~280 -280 270 -280 270 -60 680 -60 680 -260 835 -260 835 -415 820 -415~#008800~1~0~none~gge7580~0","LIB~625~-310~package`RES-TH_BD1.8-L3.2-P7.20-D0.4`BOM_Supplier`LCSC`BOM_Supplier Part`C714232`BOM_Manufacturer`Huaxing Mechanical-Elec.`BOM_Manufacturer Part`CF1/6W-10KΊ¹5%T52`nameAlias`Resistance (Ohms)`Contributor`LCSC`spicePre`R`spiceSymbolName`CF1/6W-10KΊ¹5%T52`~270~0~gge0d47179fde529207~97467e7cb6374f7e9dd7fc644a47cfb1~2ba8a26395ab41a2a00f577110f8f3f7~0~~yes~yes#@$T~N~632~-297.640625~0~#000080~Arial~~~~~comment~10kΊ~1~start~gge7584~0~#@$T~P~632~-306.78125~0~#000080~Arial~~~~~comment~R3~1~start~gge7586~0~#@$R~620~-320~~~10~20~#A00000~1~0~none~gge7588~0~#@$P~show~0~2~625~-290~270~gge7589~0^^625~-290^^M 625 -300 v 10~#800^^0~625~-304~270~2~start~~~#800^^0~621~-296~270~2~end~~~#800^^0~625~-277^^0~M 628 -280 L 625 -283 L 622 -280#@$P~show~0~1~625~-330~90~gge7596~0^^625~-330^^M 625 -320 v -10~#800^^0~625~-316~270~1~end~~~#800^^0~621~-324~270~1~start~~~#800^^0~625~-343^^0~M 622 -340 L 625 -337 L 628 -340","W~625 -330 625 -425 665 -425~#008800~1~0~none~gge7607~0","W~540 -280 625 -280 625 -290~#008800~1~0~none~gge7608~0","LIB~140~-670~package`M2X3`Contributor`DangerousPrototype`spicePre`J`spiceSymbolName`CON_HEADER_2X03`BOM_Manufacturer Part``~~0~gge73b657ec88652575~1a95e0cd8cf04abab1f0a955e387d9de~4cf556fe97124ad8934102a1b113e234~0~~yes~yes#@$T~N~128.3359375~-691.75~0~#000080~Arial~~~~~comment~LEFT IO~1~start~gge7932~0~#@$T~P~135.078125~-702~0~#000080~Arial~~~~~comment~J1~1~start~gge7934~0~#@$PL~120 -690 160 -690~#8D2323~2~0~none~gge7936~0#@$PL~160 -690 160 -650~#8D2323~2~0~none~gge7937~0#@$PL~160 -650 120 -650~#8D2323~2~0~none~gge7938~0#@$PL~120 -650 120 -690~#8D2323~2~0~none~gge7939~0#@$P~show~0~1~125~-680~180~gge7940~0^^125~-680^^M 125 -680 h 4~#8D2323^^0~138~-677~0~1~start~~~#8D2323^^1~129~-681~0~1~end~~~#8D2323^^1~132~-680^^0~M 135 -677 L 138 -680 L 135 -683#@$P~show~0~3~125~-670~180~gge7947~0^^125~-670^^M 125 -670 h 4~#8D2323^^0~138~-667~0~3~start~~~#8D2323^^1~129~-671~0~3~end~~~#8D2323^^1~132~-670^^0~M 135 -667 L 138 -670 L 135 -673#@$P~show~0~5~125~-660~180~gge7954~0^^125~-660^^M 125 -660 h 4~#8D2323^^0~138~-657~0~5~start~~~#8D2323^^1~129~-661~0~5~end~~~#8D2323^^1~132~-660^^0~M 135 -657 L 138 -660 L 135 -663#@$P~show~0~2~155~-680~0~gge7961~0^^155~-680^^M 155 -680 h -4~#8D2323^^0~142~-677~0~2~end~~~#8D2323^^1~151~-681~0~2~start~~~#8D2323^^1~148~-680^^0~M 145 -683 L 142 -680 L 145 -677#@$P~show~0~4~155~-670~0~gge7968~0^^155~-670^^M 155 -670 h -4~#8D2323^^0~142~-667~0~4~end~~~#8D2323^^1~151~-671~0~4~start~~~#8D2323^^1~148~-670^^0~M 145 -673 L 142 -670 L 145 -667#@$P~show~0~6~155~-660~0~gge7975~0^^155~-660^^M 155 -660 h -4~#8D2323^^0~142~-657~0~6~end~~~#8D2323^^1~151~-661~0~6~start~~~#8D2323^^1~148~-660^^0~M 145 -663 L 142 -660 L 145 -657","LIB~930~-355~package`M2X3`Contributor`DangerousPrototype`spicePre`J`spiceSymbolName`CON_HEADER_2X03`BOM_Manufacturer Part``~~0~gge7677077cf56e81b8~1a95e0cd8cf04abab1f0a955e387d9de~4cf556fe97124ad8934102a1b113e234~0~~yes~yes#@$T~N~909.28125~-377.0078125~0~#000080~Arial~~~~~comment~RIGHT IO~1~start~gge7984~0~#@$T~P~925.078125~-387~0~#000080~Arial~~~~~comment~J2~1~start~gge7986~0~#@$PL~910 -375 950 -375~#8D2323~2~0~none~gge7988~0#@$PL~950 -375 950 -335~#8D2323~2~0~none~gge7989~0#@$PL~950 -335 910 -335~#8D2323~2~0~none~gge7990~0#@$PL~910 -335 910 -375~#8D2323~2~0~none~gge7991~0#@$P~show~0~1~915~-365~180~gge7992~0^^915~-365^^M 915 -365 h 4~#8D2323^^0~928~-362~0~1~start~~~#8D2323^^1~919~-366~0~1~end~~~#8D2323^^1~922~-365^^0~M 925 -362 L 928 -365 L 925 -368#@$P~show~0~3~915~-355~180~gge7999~0^^915~-355^^M 915 -355 h 4~#8D2323^^0~928~-352~0~3~start~~~#8D2323^^1~919~-356~0~3~end~~~#8D2323^^1~922~-355^^0~M 925 -352 L 928 -355 L 925 -358#@$P~show~0~5~915~-345~180~gge8006~0^^915~-345^^M 915 -345 h 4~#8D2323^^0~928~-342~0~5~start~~~#8D2323^^1~919~-346~0~5~end~~~#8D2323^^1~922~-345^^0~M 925 -342 L 928 -345 L 925 -348#@$P~show~0~2~945~-365~0~gge8013~0^^945~-365^^M 945 -365 h -4~#8D2323^^0~932~-362~0~2~end~~~#8D2323^^1~941~-366~0~2~start~~~#8D2323^^1~938~-365^^0~M 935 -368 L 932 -365 L 935 -362#@$P~show~0~4~945~-355~0~gge8020~0^^945~-355^^M 945 -355 h -4~#8D2323^^0~932~-352~0~4~end~~~#8D2323^^1~941~-356~0~4~start~~~#8D2323^^1~938~-355^^0~M 935 -358 L 932 -355 L 935 -352#@$P~show~0~6~945~-345~0~gge8027~0^^945~-345^^M 945 -345 h -4~#8D2323^^0~932~-342~0~6~end~~~#8D2323^^1~941~-346~0~6~start~~~#8D2323^^1~938~-345^^0~M 935 -348 L 932 -345 L 935 -342","LIB~295~-430~package`MOLEX_PICOBLADE_8P`description``Contributor`DesertBit`sourceId`JjBuMGYgy`timeStamp`1472635423`spicePre`J`spiceSymbolName`MOLEX_PICOBLADE_8P`BOM_Manufacturer Part``~180~0~gge19aefbed2d4ff121~fc117d7fb2fa4d559044936821f94db6~abe5a9481474486593dfb32d8d0fb351~0~~yes~yes#@$T~N~284.5390625~-491.75~0~#000080~Arial~~~~~comment~Display~1~start~gge8639~0~#@$T~P~295.078125~-501.75~0~#000080~Arial~~~~~comment~J3~1~start~gge8641~0~#@$PL~315 -400 315 -490~#8D2323~1~0~none~gge8643~0#@$PL~315 -490 285 -490~#8D2323~1~0~none~gge8644~0#@$PL~285 -490 285 -400~#8D2323~1~0~none~gge8645~0#@$PL~285 -400 315 -400~#8D2323~1~0~none~gge8646~0#@$P~show~0~1~335~-410~0~gge8647~0^^335~-410^^M 335 -410 h -20~#8D2323^^1~312~-407~0~1~end~~~#8D2323^^1~321~-411~0~1~start~~~#8D2323^^0~318~-410^^0~M 315 -413 L 312 -410 L 315 -407#@$P~show~0~2~335~-420~0~gge8654~0^^335~-420^^M 335 -420 h -20~#8D2323^^1~312~-417~0~2~end~~~#8D2323^^1~321~-421~0~2~start~~~#8D2323^^0~318~-420^^0~M 315 -423 L 312 -420 L 315 -417#@$P~show~0~3~335~-430~0~gge8661~0^^335~-430^^M 335 -430 h -20~#8D2323^^1~312~-427~0~3~end~~~#8D2323^^1~321~-431~0~3~start~~~#8D2323^^0~318~-430^^0~M 315 -433 L 312 -430 L 315 -427#@$P~show~0~4~335~-440~0~gge8668~0^^335~-440^^M 335 -440 h -20~#8D2323^^1~312~-437~0~4~end~~~#8D2323^^1~321~-441~0~4~start~~~#8D2323^^0~318~-440^^0~M 315 -443 L 312 -440 L 315 -437#@$P~show~0~1~335~-450~0~gge8675~0^^335~-450^^M 335 -450 h -20~#8D2323^^1~312~-447~0~5~end~~~#8D2323^^1~321~-451~0~5~start~~~#8D2323^^0~318~-450^^0~M 315 -453 L 312 -450 L 315 -447#@$P~show~0~2~335~-460~0~gge8682~0^^335~-460^^M 335 -460 h -20~#8D2323^^1~312~-457~0~6~end~~~#8D2323^^1~321~-461~0~6~start~~~#8D2323^^0~318~-460^^0~M 315 -463 L 312 -460 L 315 -457#@$P~show~0~3~335~-470~0~gge8689~0^^335~-470^^M 335 -470 h -20~#8D2323^^1~312~-467~0~7~end~~~#8D2323^^1~321~-471~0~7~start~~~#8D2323^^0~318~-470^^0~M 315 -473 L 312 -470 L 315 -467#@$P~show~0~4~335~-480~0~gge8696~0^^335~-480^^M 335 -480 h -20~#8D2323^^1~312~-477~0~8~end~~~#8D2323^^1~321~-481~0~8~start~~~#8D2323^^0~318~-480^^0~M 315 -483 L 312 -480 L 315 -477","W~335 -420 360 -420 360 -480~#008800~1~0~none~gge8769~0","T~L~340~-415~0~#0000FF~~4pt~~~~comment~GND~1~start~gge8774~0~pinpart","W~335 -480 360 -480~#008800~1~0~none~gge8776~0","LIB~790~-620~package`IMU9250`BOM_Manufacturer``BOM_Manufacturer Part``BOM_Supplier Part``BOM_Supplier``link``Contributor`Phongnhp`spicePre`U`spiceSymbolName`IMU_9250`~~0~ggeac577a762ea3fc25~bc174898c43b41b89ffbf34ee09b95a5~38386194dc0a477c83fbd24273123f35~0~~yes~yes#@$T~N~743.484375~-692~0~#000080~Arial~~~~~comment~IMU_9250~1~start~gge10051~0~#@$T~P~758.0390625~-702.5~0~#000080~Arial~~~~~comment~U2~1~start~gge10053~0~#@$P~show~0~1~700~-680~180~gge10055~0^^700~-680^^M 700 -680 h 20~#880000^^1~722~-677~0~VCC~start~~~#0000FF^^1~715~-681~0~1~end~~~#0000FF^^0~717~-680^^0~M 720 -677 L 723 -680 L 720 -683#@$P~show~0~2~700~-660~180~gge10062~0^^700~-660^^M 700 -660 h 20~#880000^^1~722~-657~0~GND~start~~~#0000FF^^1~715~-661~0~2~end~~~#0000FF^^0~717~-660^^0~M 720 -657 L 723 -660 L 720 -663#@$P~show~0~3~700~-640~180~gge10069~0^^700~-640^^M 700 -640 h 20~#880000^^1~722~-637~0~SCL~start~~~#0000FF^^1~715~-641~0~3~end~~~#0000FF^^0~717~-640^^0~M 720 -637 L 723 -640 L 720 -643#@$P~show~0~4~700~-620~180~gge10076~0^^700~-620^^M 700 -620 h 20~#880000^^1~722~-617~0~SDA~start~~~#0000FF^^1~715~-621~0~4~end~~~#0000FF^^0~717~-620^^0~M 720 -617 L 723 -620 L 720 -623#@$P~show~0~5~700~-600~180~gge10083~0^^700~-600^^M 700 -600 h 20~#880000^^1~722~-597~0~ECL~start~~~#0000FF^^1~715~-601~0~5~end~~~#0000FF^^0~717~-600^^0~M 720 -597 L 723 -600 L 720 -603#@$P~show~0~6~700~-580~180~gge10090~0^^700~-580^^M 700 -580 h 20~#880000^^1~722~-577~0~EDA~start~~~#0000FF^^1~715~-581~0~6~end~~~#0000FF^^0~717~-580^^0~M 720 -577 L 723 -580 L 720 -583#@$P~show~0~7~700~-560~180~gge10097~0^^700~-560^^M 700 -560 h 20~#880000^^1~722~-557~0~AD0~start~~~#0000FF^^1~715~-561~0~7~end~~~#0000FF^^0~717~-560^^0~M 720 -557 L 723 -560 L 720 -563#@$P~show~0~8~700~-540~180~gge10104~0^^700~-540^^M 700 -540 h 20~#880000^^1~722~-537~0~INT~start~~~#0000FF^^1~715~-541~0~8~end~~~#0000FF^^0~717~-540^^0~M 720 -537 L 723 -540 L 720 -543#@$P~show~0~9~700~-520~180~gge10111~0^^700~-520^^M 700 -520 h 20~#880000^^1~722~-517~0~NCS~start~~~#0000FF^^1~715~-521~0~9~end~~~#0000FF^^0~717~-520^^0~M 720 -517 L 723 -520 L 720 -523#@$P~show~0~10~700~-500~180~gge10118~0^^700~-500^^M 700 -500 h 20~#880000^^1~722~-497~0~FSYNC~start~~~#0000FF^^1~715~-501~0~10~end~~~#0000FF^^0~717~-500^^0~M 720 -497 L 723 -500 L 720 -503#@$R~720~-690~~~110~200~#000000~1~0~none~gge10125~0~#@$T~L~745.52~-584.75~0~#0000FF~~10pt~bold~normal~~comment~IMU_9250~1~start~gge10126~0~pinpart","O~700~-600~gge10209~M 696 -604 L 704 -596 M 704 -604 L 696 -596~#33cc33~0","O~700~-580~gge10211~M 696 -584 L 704 -576 M 704 -584 L 696 -576~#33cc33~0","O~700~-560~gge10213~M 696 -564 L 704 -556 M 704 -564 L 696 -556~#33cc33~0","O~700~-540~gge10215~M 696 -544 L 704 -536 M 704 -544 L 696 -536~#33cc33~0","O~700~-520~gge10217~M 696 -524 L 704 -516 M 704 -524 L 696 -516~#33cc33~0","O~700~-500~gge10219~M 696 -504 L 704 -496 M 704 -504 L 696 -496~#33cc33~0","LIB~135~-475~package`M1X2_AWG20`Contributor`Nemo Capitano`spicePre`J`spiceSymbolName`CON_HEADER_1X02-PTH`BOM_Manufacturer Part``~~0~gge47ec3a850f2d689e~519ab30562c645fc9071b35164bd0656~d3e19c3068574fa0b89c92528028b98d~0~~yes~yes#@$T~N~118.8671875~-491.75~0~#000080~Arial~~~~~comment~MAIN BAT~1~start~gge10236~0~#@$T~P~130.92~-501~0~#000080~Arial~~~~~comment~J4~1~start~gge10238~0~#@$PL~125.84 -489 145.84 -489~#A54B4B~1.6~0~none~gge10240~0#@$PL~145.84 -489 145.84 -459~#A54B4B~1.6~0~none~gge10241~0#@$PL~145.84 -459 125.84 -459~#A54B4B~1.6~0~none~gge10242~0#@$PL~125.84 -459 125.84 -489~#A54B4B~1.6~0~none~gge10243~0#@$P~show~3~1~131~-479~180~gge10244~0^^131~-479^^M 131 -479 h 3.842~#A54B4B^^0~150.53~-476.047~0~1~start~~4.5pt~#A54B4B^^1~134.78~-480.97~0~1~end~~4.5pt~#A54B4B^^1~137~-479^^0~M 140 -476 L 143 -479 L 140 -482#@$P~show~3~2~131~-469~180~gge10251~0^^131~-469^^M 131 -469 h 3.842~#A54B4B^^0~150.53~-466.047~0~2~start~~4.5pt~#A54B4B^^1~134.78~-470.97~0~2~end~~4.5pt~#A54B4B^^1~137~-469^^0~M 140 -466 L 143 -469 L 140 -472","W~131 -479 185 -479 185 -540 270 -540~#008800~1~0~none~gge10284~0","W~131 -469 240 -469~#008800~1~0~none~gge10285~0","T~L~340~-475~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10291~0~pinpart","T~L~150~-460~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10294~0~pinpart","T~L~255~-555~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10297~0~pinpart","T~L~150~-485~0~#0000FF~~4pt~~~~comment~BAT +~1~start~gge10300~0~pinpart","T~L~255~-530~0~#0000FF~~4pt~~~~comment~BAT +~1~start~gge10303~0~pinpart","W~155 -680 280 -680~#008800~1~0~none~gge10313~0","W~125 -680 125 -730 225 -730~#008800~1~0~none~gge10315~0","T~L~110~-695~0~#0000FF~~4pt~~~~comment~VCC~1~start~gge10318~0~pinpart","T~L~165~-685~0~#0000FF~~4pt~~~~comment~PSENSOR~1~start~gge10321~0~pinpart","W~155 -660 270 -660 270 -715 360 -715~#008800~1~0~none~gge10323~0","T~L~165~-655~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10326~0~pinpart","W~125 -670 110 -670 110 -770 910 -770 910 -455 820 -455~#008800~1~0~none~gge10328~0","W~155 -670 235 -670 235 -780 920 -780 915 -435 820 -435~#008800~1~0~none~gge10336~0","W~125 -660 100 -660 100 -790 930 -790 930 -445 820 -445~#008800~1~0~none~gge10337~0","W~945 -345 970 -345 970 -485 665 -485~#008800~1~0~none~gge10338~0","W~820 -295 870 -295 870 -355 915 -355~#008800~1~0~none~gge10341~0","W~820 -395 880 -395 880 -325 960 -325 960 -355 945 -355~#008800~1~0~none~gge10343~0","W~820 -305 895 -305 895 -345 915 -345~#008800~1~0~none~gge10344~0","W~915 -365 895 -365 895 -475 655 -475~#008800~1~0~none~gge10345~0","LIB~288~-544~package`S2B-PH-SM4-TB`Contributor`andyfilms`spicePre`X`spiceSymbolName`S2B-PH-SM4-TB`BOM_Manufacturer Part``~180~0~gge12fa8dc00f010d07~ffe5780e60fc43f3861153d7ff9fe849~1c47b77e6d1948b89e39b944cd2029a5~0~~yes~yes#@$T~N~284.28125~-565.84375~0~#000080~Arial~~~~~comment~BAT~1~start~gge10431~0~#@$T~P~287.44~-575.85~0~#000080~Arial~~~~~comment~X1~1~start~gge10433~0~#@$PL~284.68 -560 304.68 -560~#EBEB37~1.6~0~none~gge10435~0#@$PL~294.68 -540 289.68 -540~#EBEB37~2.4~0~none~gge10436~0#@$PL~294.68 -550 289.68 -550~#EBEB37~2.4~0~none~gge10437~0#@$PL~304.68 -530 304.68 -560~#EBEB37~1.6~0~none~gge10438~0#@$PL~284.68 -560 284.68 -530~#EBEB37~1.6~0~none~gge10439~0#@$PL~304.68 -530 284.68 -530~#EBEB37~1.6~0~none~gge10440~0#@$P~show~3~1~270~-550~180~gge10441~0^^270~-550^^M 270 -550 h 19.685~#EBEB37^^0~299.21~-547.047~0~1~start~~4.5pt~#EBEB37^^1~277.56~-551.969~0~1~end~~4.5pt~#EBEB37^^0~286~-550^^0~M 289 -547 L 292 -550 L 289 -553#@$P~show~3~2~270~-540~180~gge10448~0^^270~-540^^M 270 -540 h 19.685~#EBEB37^^0~299.21~-537.047~0~2~start~~4.5pt~#EBEB37^^1~277.56~-541.969~0~2~end~~4.5pt~#EBEB37^^0~286~-540^^0~M 289 -537 L 292 -540 L 289 -543","N~185~-535~0~#0000ff~BAT~gge10482~start~187~-537.5~Times New Roman~7pt~0","O~475~-580~gge10488~M 471 -584 L 479 -576 M 479 -584 L 471 -576~#33cc33~0","O~475~-600~gge10490~M 471 -604 L 479 -596 M 479 -604 L 471 -596~#33cc33~0","O~475~-620~gge10492~M 471 -624 L 479 -616 M 479 -624 L 471 -616~#33cc33~0","O~515~-660~gge10498~M 511 -664 L 519 -656 M 519 -664 L 511 -656~#33cc33~0","O~515~-620~gge10500~M 511 -624 L 519 -616 M 519 -624 L 511 -616~#33cc33~0","W~540 -230 825 -230 825 -405 820 -405~#008800~1~0~none~gge10506~0","W~680 -375 655 -375 655 -445~#008800~1~0~none~gge10509~0","W~270 -550 240 -550 240 -510~#008800~1~0~none~gge10513~0","LIB~1005~-305~package`TO-92-3_L4.9-W3.7-P1.27-L`BOM_Supplier`LCSC`BOM_Manufacturer`SEMTECH`BOM_Manufacturer Part`2N2222`Contributor`LCSC`BOM_Supplier Part`C118536`BOM_LCSC Assembly`Yes`SMT Type`Extend`BOM_Assembly Type`manualWeld`BOM_Paste Type`expand`spicePre`Q`spiceSymbolName`2N2222`~~0~ggecd2b6c912041b411~6924b36489de4921bb29ca14bf27c33f~0b833263bcfb409d8a029dcd9c6a3b59~0~~yes~yes#@$T~N~1019~-292.8125~0~#000080~Arial~~~~~comment~2N2222~1~start~gge10516~0~#@$T~P~1019~-301.6484375~0~#000080~Arial~~~~~comment~Q1~1~start~gge10518~0~#@$P~show~0~3~1015~-325~90~gge10520~0^^1015~-325^^M 1015 -325 v 10~#880000^^0~1018~-313~270~C~end~~~#0000FF^^0~1014~-315~270~3~start~~~#0000FF^^0~1015~-318^^0~M 1012 -315 L 1015 -312 L 1018 -315#@$P~show~0~2~995~-305~180~gge10527~0^^995~-305^^M 995 -305 h 10~#880000^^0~1007~-302~0~B~start~~~#0000FF^^0~1005~-306~0~2~end~~~#0000FF^^0~1002~-305^^0~M 1005 -302 L 1008 -305 L 1005 -308#@$P~show~0~1~1015~-285~270~gge10534~0^^1015~-285^^M 1015 -285 v -10~#880000^^0~1018~-297~270~E~start~~~#0000FF^^0~1014~-295~270~1~end~~~#0000FF^^0~1015~-292^^0~M 1018 -295 L 1015 -298 L 1012 -295#@$PL~1015 -315 1005 -308~#880000~1~0~none~gge10541~0#@$PL~1005 -302 1015 -295~#880000~1~0~none~gge10542~0#@$PL~1005 -314 1005 -296~#880000~1~0~none~gge10543~0#@$PG~1015 -295 1012 -300 1009 -296~#880000~1~0~none~gge10544~0","LIB~1015~-365~package`DO-41_BD2.4-L4.7-P8.70-D0.9-RD`BOM_Supplier`LCSC`BOM_Manufacturer`LRC`BOM_Manufacturer Part`1N4001`BOM_Supplier Part`C82804`spicePre`D`spiceSymbolName`1N4001`~270~0~gge8f24df2e0c50e8b0~c2803222ad4b48fb94db0de548a6280a~6a469063902c4d47b9003ece9d1d25f0~0~~yes~yes#@$T~N~1024~-352.75~0~#000080~Arial~~~~~comment~1N4001~1~start~gge10576~0~#@$T~P~1024~-361.75~0~#000080~Arial~~~~~comment~D1~1~start~gge10578~0~#@$P~show~0~2~1015~-345~270~gge10580~0^^1015~-345^^M 1015 -345 v -15~#880000^^0~1018~-363~270~A~start~~~#0000FF^^0~1014~-354~270~2~end~~~#0000FF^^0~1015~-357^^0~M 1018 -360 L 1015 -363 L 1012 -360#@$P~show~0~1~1015~-385~90~gge10587~0^^1015~-385^^M 1015 -385 v 15~#880000^^0~1018~-367~270~K~end~~~#0000FF^^0~1014~-376~270~1~start~~~#0000FF^^0~1015~-373^^0~M 1012 -370 L 1015 -367 L 1018 -370#@$PT~M 1021 -360 L 1015 -370 L 1008 -360 Z ~#880000~1~0~#880000~gge10594~0~#@$PL~1022 -370 1008 -370~#880000~1~0~none~gge10595~0","LIB~1065~-365~package`CAP-TH_L5.0-W5.0-P5.08-D1.0`BOM_Supplier`LCSC`BOM_Supplier Part`C444738`BOM_Manufacturer`AVX`BOM_Manufacturer Part`SR211C104KAR`nameAlias`Capacitance`Contributor`LCSC`BOM_LCSC Assembly`Yes`SMT Type`Extend`BOM_Assembly Type`manualWeld`BOM_Paste Type`expand`spicePre`C`spiceSymbolName`SR211C104KAR`~~0~gge1986c0819620a5c0~4d5b8e8e8f89428f98436df910b3190e~e9b172bbe58746a0bfc16211d1d8f989~0~~yes~yes#@$T~N~1075~-352.75~0~#000080~Arial~~~~~comment~100nF~1~start~gge10840~0~#@$T~P~1075~-361.75~0~#000080~Arial~~~~~comment~C1~1~start~gge10842~0~#@$PL~1065 -363 1065 -360~#880000~1~0~none~gge10844~0#@$PL~1065 -370 1065 -367~#880000~1~0~none~gge10845~0#@$P~show~1~2~1065~-350~270~gge10846~0^^1065~-350^^M 1065 -350 v -10~#000000^^0~1068~-365~270~2~start~~~#000000^^0~1064~-355~270~2~end~~~#000000^^0~1065~-357^^0~M 1068 -360 L 1065 -363 L 1062 -360#@$P~show~1~1~1065~-380~90~gge10853~0^^1065~-380^^M 1065 -380 v 10~#000000^^0~1068~-365~270~1~end~~~#000000^^0~1064~-375~270~1~start~~~#000000^^0~1065~-373^^0~M 1062 -370 L 1065 -367 L 1068 -370#@$PL~1073 -363 1057 -363~#880000~1~0~none~gge10860~0#@$PL~1073 -367 1057 -367~#880000~1~0~none~gge10861~0","W~1015 -385 1015 -405 895 -405~#008800~1~0~none~gge10886~0","W~1065 -380 1065 -405 1015 -405~#008800~1~0~none~gge10888~0","W~1015 -325 1015 -345 1065 -345 1065 -350~#008800~1~0~none~gge10890~0","W~945 -365 990 -365 990 -345 1015 -345~#008800~1~0~none~gge10894~0","W~1015 -285 1105 -285 1105 -445 970 -445~#008800~1~0~none~gge10895~0","W~820 -385 855 -385 855 -285 900 -285~#008800~1~0~none~gge11035~0","W~940 -285 995 -285 995 -305~#008800~1~0~none~gge11036~0","O~475~-460~gge11038~M 471 -464 L 479 -456 M 479 -464 L 471 -456~#33cc33~0","O~515~-460~gge11040~M 511 -464 L 519 -456 M 519 -464 L 511 -456~#33cc33~0","O~515~-480~gge11042~M 511 -484 L 519 -476 M 519 -484 L 511 -476~#33cc33~0","O~515~-680~gge11044~M 511 -684 L 519 -676 M 519 -684 L 511 -676~#33cc33~0","O~515~-700~gge11046~M 511 -704 L 519 -696 M 519 -704 L 511 -696~#33cc33~0","O~475~-660~gge11048~M 471 -664 L 479 -656 M 479 -664 L 471 -656~#33cc33~0","O~475~-680~gge11050~M 471 -684 L 479 -676 M 479 -684 L 471 -676~#33cc33~0","O~680~-355~gge11052~M 676 -359 L 684 -351 M 684 -359 L 676 -351~#33cc33~0","O~680~-345~gge11054~M 676 -349 L 684 -341 M 684 -349 L 676 -341~#33cc33~0","O~680~-305~gge11056~M 676 -309 L 684 -301 M 684 -309 L 676 -301~#33cc33~0","O~680~-295~gge11058~M 676 -299 L 684 -291 M 684 -299 L 676 -291~#33cc33~0","O~820~-425~gge11060~M 816 -429 L 824 -421 M 824 -429 L 816 -421~#33cc33~0","O~820~-365~gge11062~M 816 -369 L 824 -361 M 824 -369 L 816 -361~#33cc33~0","O~820~-355~gge11064~M 816 -359 L 824 -351 M 824 -359 L 816 -351~#33cc33~0","O~820~-345~gge11066~M 816 -349 L 824 -341 M 824 -349 L 816 -341~#33cc33~0","O~820~-335~gge11068~M 816 -339 L 824 -331 M 824 -339 L 816 -331~#33cc33~0","O~820~-325~gge11070~M 816 -329 L 824 -321 M 824 -329 L 816 -321~#33cc33~0","O~820~-315~gge11072~M 816 -319 L 824 -311 M 824 -319 L 816 -311~#33cc33~0","O~280~-300~gge11074~M 276 -304 L 284 -296 M 284 -304 L 276 -296~#33cc33~0","O~280~-290~gge11076~M 276 -294 L 284 -286 M 284 -294 L 276 -286~#33cc33~0","O~370~-110~gge11078~M 366 -114 L 374 -106 M 374 -114 L 366 -106~#33cc33~0","O~380~-110~gge11080~M 376 -114 L 384 -106 M 384 -114 L 376 -106~#33cc33~0","O~390~-110~gge11082~M 386 -114 L 394 -106 M 394 -114 L 386 -106~#33cc33~0","O~400~-110~gge11084~M 396 -114 L 404 -106 M 404 -114 L 396 -106~#33cc33~0","O~410~-110~gge11086~M 406 -114 L 414 -106 M 414 -114 L 406 -106~#33cc33~0","O~420~-110~gge11088~M 416 -114 L 424 -106 M 424 -114 L 416 -106~#33cc33~0","O~430~-110~gge11090~M 426 -114 L 434 -106 M 434 -114 L 426 -106~#33cc33~0","O~280~-270~gge11092~M 276 -274 L 284 -266 M 284 -274 L 276 -266~#33cc33~0","LIB~920~-285~package`RES-TH_BD1.8-L3.2-P7.20-D0.4`BOM_Supplier`LCSC`BOM_Supplier Part`C714232`BOM_Manufacturer`Huaxing Mechanical-Elec.`BOM_Manufacturer Part`CF1/6W-10KΊ¹5%T52`nameAlias`Resistance (Ohms)`Contributor`LCSC`spicePre`R`spiceSymbolName`CF1/6W-10KΊ¹5%T52`~~0~gge43ecfe7f34e78f71~97467e7cb6374f7e9dd7fc644a47cfb1~2ba8a26395ab41a2a00f577110f8f3f7~0~~yes~yes#@$T~N~914.03125~-293~0~#000080~Arial~~~~~comment~1kΊ~1~start~gge11101~0~#@$T~P~914.0390625~-302.125~0~#000080~Arial~~~~~comment~R1~1~start~gge11103~0~#@$R~910~-290~~~20~10~#A00000~1~0~none~gge11105~0~#@$P~show~0~2~940~-285~0~gge11106~0^^940~-285^^M 930 -285 h 10~#800^^0~926~-285~0~2~end~~~#800^^0~934~-289~0~2~start~~~#800^^0~953~-285^^0~M 950 -288 L 947 -285 L 950 -282#@$P~show~0~1~900~-285~180~gge11113~0^^900~-285^^M 910 -285 h -10~#800^^0~914~-285~0~1~start~~~#800^^0~906~-289~0~1~end~~~#800^^0~887~-285^^0~M 890 -282 L 893 -285 L 890 -288","LIB~360~-405~package`CAP-TH_BD8.0-P3.50-D1.0-FD`BOM_Supplier`LCSC`BOM_Manufacturer`ValuePro`BOM_Manufacturer Part`470uf16v`nameAlias`Capacitance`BOM_Supplier Part`C28067`spicePre`C`spiceSymbolName`470uf16v`~90~0~ggee35b13287a9793b8~90d1b58a2d284d63b5d026a0c4e38bab~ffcc179b5c0bb89105c20dd941419970~0~~yes~yes#@$T~N~370~-392.65625~0~#000080~Arial~~~~~comment~470uF~1~start~gge11147~0~#@$T~P~370.0078125~-401.7890625~0~#000080~Arial~~~~~comment~C3~1~start~gge11149~0~#@$PL~352 -403 368 -403~#880000~1~0~none~gge11151~0#@$P~show~1~1~360~-390~270~gge11152~0^^360~-390^^M 360 -390 v -10~#000000^^0~363~-405~270~1~start~~~#000000^^0~359~-395~270~1~end~~~#000000^^0~360~-397^^0~M 363 -400 L 360 -403 L 357 -400#@$P~show~1~2~360~-420~90~gge11159~0^^360~-420^^M 360 -420 v 10~#000000^^0~363~-405~270~2~end~~~#000000^^0~359~-415~270~2~start~~~#000000^^0~360~-413^^0~M 357 -410 L 360 -407 L 363 -410#@$PL~360 -400 360 -403~#880000~1~0~none~gge11166~0#@$PL~360 -407 360 -410~#880000~1~0~none~gge11167~0#@$A~M 352.33 -410.22 A 10 9 0 0 0 367.19 -409.75~~#880000~1~0~none~gge11168~0#@$PL~357 -395 357 -399~#880000~1~0~none~gge11169~0#@$PL~355 -397 359 -397~#880000~1~0~none~gge11170~0","J~665~-560~2.5~#CC0000~gge3623~0","J~645~-540~2.5~#CC0000~gge3632~0","J~665~-660~2.5~#CC0000~gge3656~0","J~665~-435~2.5~#CC0000~gge3669~0","J~655~-455~2.5~#CC0000~gge3673~0","J~635~-520~2.5~#CC0000~gge3677~0","J~665~-600~2.5~#CC0000~gge5804~0","J~665~-695~2.5~#CC0000~gge5806~0","J~625~-680~2.5~#CC0000~gge5808~0","J~360~-640~2.5~#CC0000~gge7127~0","J~360~-610~2.5~#CC0000~gge7179~0","J~360~-510~2.5~#CC0000~gge7181~0","J~665~-425~2.5~#CC0000~gge7192~0","J~665~-405~2.5~#CC0000~gge7194~0","J~665~-395~2.5~#CC0000~gge7196~0","J~225~-260~2.5~#CC0000~gge7560~0","J~225~-250~2.5~#CC0000~gge7562~0","J~240~-230~2.5~#CC0000~gge7566~0","J~440~-80~2.5~#CC0000~gge7568~0","J~575~-290~2.5~#CC0000~gge7570~0","J~575~-270~2.5~#CC0000~gge7572~0","J~385~-450~2.5~#CC0000~gge7574~0","J~395~-440~2.5~#CC0000~gge7576~0","J~405~-430~2.5~#CC0000~gge7578~0","J~360~-480~2.5~#CC0000~gge8770~0","J~655~-680~2.5~#CC0000~gge10208~0","J~280~-680~2.5~#CC0000~gge10314~0","J~225~-730~2.5~#CC0000~gge10316~0","J~360~-715~2.5~#CC0000~gge10324~0","J~665~-485~2.5~#CC0000~gge10339~0","J~655~-475~2.5~#CC0000~gge10346~0","J~240~-469~2.5~#CC0000~gge10286~0","J~625~-280~2.5~#CC0000~gge10505~0","J~655~-445~2.5~#CC0000~gge10510~0","J~240~-510~2.5~#CC0000~gge10514~0","J~895~-405~2.5~#CC0000~gge10887~0","J~1015~-405~2.5~#CC0000~gge10889~0","J~1015~-345~2.5~#CC0000~gge10893~0","J~970~-445~2.5~#CC0000~gge10896~0","J~360~-390~2.5~#CC0000~gge11197~0","J~360~-420~2.5~#CC0000~gge11198~0"],"BBox":{"x":0,"y":-806.7,"width":1149,"height":807.1},"colors":{}}}],"BOM":[["Value","Quantity","Package","Components","CustomPara"],["2N2222",1,"TO-92-3_L4.9-W3.7-P1.27-L","Q1",{"BOM_Supplier":"LCSC","BOM_Manufacturer":"SEMTECH","BOM_Manufacturer Part":"2N2222","BOM_Supplier Part":"C118536","BOM_LCSC Assembly":"Yes","BOM_Assembly Type":"manualWeld","BOM_Paste Type":"expand","puuid":"6924b36489de4921bb29ca14bf27c33f","uuid":"0b833263bcfb409d8a029dcd9c6a3b59"}],["MCP23017",1,"MCP23017","U3",{"BOM_Manufacturer":"","BOM_Manufacturer Part":"MCP23017","BOM_Supplier Part":"","BOM_Supplier":"","puuid":"f09420c4fd9946a583a6b15c1c5a483e","uuid":"0f118b0d9063400da84e04b55532a171"}],["BAT",1,"S2B-PH-SM4-TB","X1",{"BOM_Manufacturer Part":"","puuid":"ffe5780e60fc43f3861153d7ff9fe849","uuid":"1c47b77e6d1948b89e39b944cd2029a5"}],["10kΊ",2,"RES-TH_BD1.8-L3.2-P7.20-D0.4","R3,R2",{"BOM_Supplier":"LCSC","BOM_Supplier Part":"C714232","BOM_Manufacturer":"Huaxing Mechanical-Elec.","BOM_Manufacturer Part":"CF1/6W-10KΊ¹5%T52","puuid":"97467e7cb6374f7e9dd7fc644a47cfb1","uuid":"2ba8a26395ab41a2a00f577110f8f3f7"}],["1kΊ",1,"RES-TH_BD1.8-L3.2-P7.20-D0.4","R1",{"BOM_Supplier":"LCSC","BOM_Supplier Part":"C714232","BOM_Manufacturer":"Huaxing Mechanical-Elec.","BOM_Manufacturer Part":"CF1/6W-10KΊ¹5%T52","puuid":"97467e7cb6374f7e9dd7fc644a47cfb1","uuid":"2ba8a26395ab41a2a00f577110f8f3f7"}],["LEFT IO",1,"M2X3","J1",{"BOM_Manufacturer Part":"","puuid":"1a95e0cd8cf04abab1f0a955e387d9de","uuid":"4cf556fe97124ad8934102a1b113e234"}],["RIGHT IO",1,"M2X3","J2",{"BOM_Manufacturer Part":"","puuid":"1a95e0cd8cf04abab1f0a955e387d9de","uuid":"4cf556fe97124ad8934102a1b113e234"}],["1N4001",1,"DO-41_BD2.4-L4.7-P8.70-D0.9-RD","D1",{"BOM_Supplier":"LCSC","BOM_Manufacturer":"LRC","BOM_Manufacturer Part":"1N4001","BOM_Supplier Part":"C82804","puuid":"c2803222ad4b48fb94db0de548a6280a","uuid":"6a469063902c4d47b9003ece9d1d25f0"}],["DWM1000",1,"WIRELM-TH_DWM1000","U5",{"BOM_Supplier":"LCSC","BOM_Manufacturer":"DecaWave","BOM_Manufacturer Part":"DWM1000","BOM_Supplier Part":"C95238","puuid":"921ff2190df246a4b1016c11071a51a1","uuid":"605f956fd8c24817bb840fda3296ca74"}],["MAIN BOARD",1,"TTGO-T-BEAM-ESP32-CONNECTOR","U1",{"BOM_Manufacturer":"","BOM_Manufacturer Part":"","BOM_Supplier Part":"","BOM_Supplier":"","puuid":"5180c2e0c1da4a75b575a8495aee30f2","uuid":"5657e928f1504b21b9e68062d66ba3e3"}],["IMU_9250",1,"IMU9250","U2",{"BOM_Manufacturer":"","BOM_Manufacturer Part":"","BOM_Supplier Part":"","BOM_Supplier":"","puuid":"bc174898c43b41b89ffbf34ee09b95a5","uuid":"38386194dc0a477c83fbd24273123f35"}],["Display",1,"MOLEX_PICOBLADE_8P","J3",{"BOM_Manufacturer Part":"","puuid":"fc117d7fb2fa4d559044936821f94db6","uuid":"abe5a9481474486593dfb32d8d0fb351"}],["MAIN BAT",1,"M1X2_AWG20","J4",{"BOM_Manufacturer Part":"","puuid":"519ab30562c645fc9071b35164bd0656","uuid":"d3e19c3068574fa0b89c92528028b98d"}],["100nF",1,"CAP-TH_L5.0-W5.0-P5.08-D1.0","C1",{"BOM_Supplier":"LCSC","BOM_Supplier Part":"C444738","BOM_Manufacturer":"AVX","BOM_Manufacturer Part":"SR211C104KAR","BOM_LCSC Assembly":"Yes","BOM_Assembly Type":"manualWeld","BOM_Paste Type":"expand","puuid":"4d5b8e8e8f89428f98436df910b3190e","uuid":"e9b172bbe58746a0bfc16211d1d8f989"}],["470uF",1,"CAP-TH_BD8.0-P3.50-D1.0-FD","C3",{"BOM_Supplier":"LCSC","BOM_Manufacturer":"ValuePro","BOM_Manufacturer Part":"470uf16v","BOM_Supplier Part":"C28067","puuid":"90d1b58a2d284d63b5d026a0c4e38bab","uuid":"ffcc179b5c0bb89105c20dd941419970"}]],"components":{"5657e928f1504b21b9e68062d66ba3e3":1,"0f118b0d9063400da84e04b55532a171":1,"2ba8a26395ab41a2a00f577110f8f3f7":3,"605f956fd8c24817bb840fda3296ca74":1,"4cf556fe97124ad8934102a1b113e234":2,"abe5a9481474486593dfb32d8d0fb351":1,"38386194dc0a477c83fbd24273123f35":1,"d3e19c3068574fa0b89c92528028b98d":1,"1c47b77e6d1948b89e39b944cd2029a5":1,"0b833263bcfb409d8a029dcd9c6a3b59":1,"6a469063902c4d47b9003ece9d1d25f0":1,"e9b172bbe58746a0bfc16211d1d8f989":1,"ffcc179b5c0bb89105c20dd941419970":1}} \ No newline at end of file diff --git a/pcb/AirsoftTracker 1.4/AirsoftTracker 1.4.json b/pcb/AirsoftTracker 1.4/AirsoftTracker 1.4.json new file mode 100644 index 0000000..8feea81 --- /dev/null +++ b/pcb/AirsoftTracker 1.4/AirsoftTracker 1.4.json @@ -0,0 +1 @@ +{"editorVersion":"6.4.7","docType":"5","title":"AirsoftTracker","description":"","colors":{},"schematics":[{"uuid":"36185aec54333e8816b9b8a91c1fc7ed","docType":"1","title":"MainSheet","description":"","dataStr":{"head":{"docType":"1","editorVersion":"6.4.16","newgId":true,"c_para":{"Prefix Start":"1"},"c_spiceCmd":"null","hasIdFlag":true,"uuid":"c8a94b8712a814fb238f3e3dbbbd6e34","x":"0","y":"0","portOfADImportHack":"","importFlag":0,"transformList":""},"canvas":"CA~1000~1000~#FFFFFF~yes~#CCCCCC~5~1000~1000~line~5~pixel~5~0~0","shape":["LIB~0~-806~package`NONE`BOM_Manufacturer Part`?`spicePre`.`~~0~frame_lib_1~~~0~~yes~yes#@$T~N~570.5~-809~0~#000080~Arial~~~~~comment~A~0~start~gge77~0~#@$PT~M 206 -796 L 206 -806 M 206 -10 L 206 0 M 402 -796 L 402 -806 M 402 -10 L 402 0 M 598 -796 L 598 -806 M 598 -10 L 598 0 M 794 -796 L 794 -806 M 794 -10 L 794 0 M 990 -796 L 990 -806 M 990 -10 L 990 0 M 10 -600 L 0 -600 M 1139 -600 L 1149 -600 M 10 -404 L 0 -404 M 1139 -404 L 1149 -404 M 10 -208 L 0 -208 M 1139 -208 L 1149 -208 M 10 -12 L 0 -12 M 1139 -12 L 1149 -12~#880000~1~0~none~gge6~0~frame_tick#@$T~P~571.5~-818~0~#000080~Arial~~~~~comment~A~0~start~gge76~0~#@$T~L~1.5~-698~0~#880000~~~~~~comment~A~1~start~gge7~0~frame_tick#@$T~L~1140.5~-698~0~#880000~~~~~~comment~A~1~start~gge9~0~frame_tick#@$T~L~1.5~-502~0~#880000~~~~~~comment~B~1~start~gge11~0~frame_tick#@$T~L~1140.5~-502~0~#880000~~~~~~comment~B~1~start~gge13~0~frame_tick#@$T~L~1.5~-306~0~#880000~~~~~~comment~C~1~start~gge15~0~frame_tick#@$T~L~1140.5~-306~0~#880000~~~~~~comment~C~1~start~gge17~0~frame_tick#@$T~L~1.5~-110~0~#880000~~~~~~comment~D~1~start~gge19~0~frame_tick#@$T~L~1140.5~-110~0~#880000~~~~~~comment~D~1~start~gge21~0~frame_tick#@$T~L~108~-797.5~0~#880000~~~~~~comment~1~1~start~gge23~0~frame_tick#@$T~L~108~-1.5~0~#880000~~~~~~comment~1~1~start~gge25~0~frame_tick#@$T~L~304~-797.5~0~#880000~~~~~~comment~2~1~start~gge27~0~frame_tick#@$T~L~304~-1.5~0~#880000~~~~~~comment~2~1~start~gge29~0~frame_tick#@$T~L~500~-797.5~0~#880000~~~~~~comment~3~1~start~gge31~0~frame_tick#@$T~L~500~-1.5~0~#880000~~~~~~comment~3~1~start~gge33~0~frame_tick#@$T~L~696~-797.5~0~#880000~~~~~~comment~4~1~start~gge35~0~frame_tick#@$T~L~696~-1.5~0~#880000~~~~~~comment~4~1~start~gge37~0~frame_tick#@$T~L~892~-797.5~0~#880000~~~~~~comment~5~1~start~gge39~0~frame_tick#@$T~L~892~-1.5~0~#880000~~~~~~comment~5~1~start~gge?~0~frame_tick#@$R~10~-796~~~1129~786~#880000~1~0~none~gge42~0~frame_innerbox#@$R~0~-806~~~1149~806~#880000~1~0~none~gge43~0~frame_outbox#@$R~694.99995~-90~~~444~80~#880000~1~0~none~gge44~0~frame_hitarea#@$PL~695.1 -50.75 1138.63 -50.75~#880000~1~0~none~gge45~0#@$PL~799.63 -30.75 1138.63 -30.75~#880000~1~0~none~gge46~0#@$PL~1059.61 -89.93 1059.63 -50.75~#880000~1~0~none~gge47~0#@$PL~1059.63 -50.75 1059.63 -30.75~#880000~1~0~none~gge48~0#@$T~L~699.99995~-77~0~#880000~~8pt~~~~comment~TITLE:~1~start~gge49~0~pinpart#@$T~L~757.62495~-64.41~0~#0000FF~~10pt~~~~comment~Airsoft Tracker~1~start~gge51~0~frame_title#@$T~L~1064.62495~-63.75~0~#880000~~8pt~~~~comment~REV:~1~start~gge53~0~pinpart#@$T~L~1102.62495~-63.75~0~#0000FF~~9pt~~~~comment~1.0~1~start~gge55~0~frame_version#@$T~L~804.62495~-15~0~#880000~~8pt~~~~comment~Date:~1~start~gge57~0~pinpart#@$T~L~851.62495~-14.52~0~#0000FF~~9pt~~~~comment~2021-01-15~1~start~gge59~0~frame_date#@$T~L~1063.62495~-35~0~#880000~~8pt~~~~comment~Sheet:~1~start~gge61~0~pinpart#@$T~L~1108.62495~-34.52~0~#0000FF~~9pt~~~~comment~1/1~1~start~gge63~0~frame_sheet#@$T~L~943.62495~-14.75~0~#880000~~8pt~~~~comment~Drawn By:~1~start~gge65~0~pinpart#@$T~L~1008.63~-14.75~0~#0000FF~~9pt~~~~comment~ddv2020~1~start~gge67~0~frame_drawn#@$T~L~804.62495~-36.75~0~#880000~~8pt~~~~comment~Company:~1~start~gge69~0~pinpart#@$T~L~871.24995~-36.64~0~#0000FF~~9pt~~~~comment~DDV~1~start~gge71~0~frame_company#@$PL~799.63 -50.75 799.63 -10.75~#880000~1~0~none~gge73~0#@$Pimage~L~1~gge74~0~gge75~694.99995~-38~104~20~data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0i5Zu+5bGCXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNTIwIg0KCSB2aWV3Qm94PSIwIDAgMTY5Mi45IDM0MS41IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxNjkyLjkgMzQxLjU7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiM1NTg4RkY7fQ0KPC9zdHlsZT4NCjxnPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik05MDEuNywxNjEuMWMyLjMtMS44LDUuMS0yLjcsOC4zLTIuN2M0LjMsMCw4LjksMS42LDEzLjgsNC43YzQuOSwzLjEsOS42LDgsMTQuMSwxNC43bDE3LjQtMjcuOQ0KCQljLTUuNC03LjgtMTIuMS0xMy45LTIwLjItMTguMmMtOC4xLTQuMy0xNi43LTYuNC0yNS43LTYuNGMtMTIuOCwwLTI0LDMuOS0zMy40LDExLjdjLTkuNCw3LjgtMTQuMSwxOC0xNC4xLDMwLjQNCgkJYzAsOC45LDMsMTcuNCw5LDI1LjRjNC4zLDUuNywxMi4xLDEyLjYsMjMuMywyMC42YzkuNyw2LjksMTUuNywxMS43LDE3LjksMTQuNGMyLjIsMi43LDMuMyw1LjMsMy4zLDcuOWMwLDMuMi0xLjQsNS45LTQuMyw4LjMNCgkJYy0yLjksMi4zLTYuNywzLjUtMTEuNSwzLjVjLTEyLjEsMC0yMy4zLTYuNy0zMy41LTIwLjJsLTIyLjUsMjYuMmMxMCwxMC42LDE5LjEsMTgsMjcuMiwyMmM4LjEsNCwxNy4yLDYsMjcuMSw2DQoJCWMxNy4yLDAsMzAuMy00LjksMzkuNC0xNC43YzkuMS05LjgsMTMuNi0yMC4zLDEzLjYtMzEuM2MwLTguNC0yLjItMTYuMS02LjYtMjMuM2MtNC40LTcuMS0xMy42LTE1LjctMjcuNi0yNS43DQoJCWMtOC44LTYuMy0xNC0xMC41LTE1LjctMTIuN2MtMS44LTIuMi0yLjctNC40LTIuNy02LjZDODk4LjIsMTY0LjksODk5LjQsMTYyLjksOTAxLjcsMTYxLjF6Ii8+DQoJPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxMDM4LjcsMjE3LjIgMTAwOS44LDEyOS4xIDk3NCwxMjkuMSAxMDE1LjgsMjU3LjQgOTczLjYsMzMyIDEwMTIuMSwzMzIgMTEyOC44LDEyOS4xIDEwODkuNSwxMjkuMSAJDQoJCSIvPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02NTEuNSwxNTQuMWwtNzAuNCwwbDUuOC00MS43YzAsMCw3NC43LTAuMSw3NS4xLTAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44YzAtOS44LTgtMTcuOC0xNy44LTE3LjgNCgkJYy0wLjMsMC0xMDguNCwwLTEwOC40LDBMNTI2LDI3Ny43aDExMy4ydjBjOS41LTAuMiwxNy4yLTgsMTcuMi0xNy41YzAtOS43LTcuOS0xNy42LTE3LjYtMTcuNmMtMC40LDAtNzAuMiwwLjEtNzAuMiwwLjFsNy40LTUzLjMNCgkJYzAsMCw3MS43LDAuMSw3Mi4zLDAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44QzY2Ni4zLDE2Mi44LDY1OS45LDE1NS41LDY1MS41LDE1NC4xeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMjY4LjQsNzYuOGMtMC4zLDAtMTA4LjQsMC0xMDguNCwwbC0yNy40LDIwMC44aDExMy4zdjBjOS41LTAuMiwxNy4yLTgsMTcuMi0xNy41YzAtOS43LTcuOS0xNy42LTE3LjYtMTcuNg0KCQljLTAuNCwwLTcwLjIsMC4xLTcwLjIsMC4xbDcuNC01My4zYzAsMCw3MS43LDAuMSw3Mi40LDAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44YzAtOC44LTYuNC0xNi4xLTE0LjgtMTcuNWwtNzAuNCwwbDUuOC00MS43DQoJCWMwLDAsNzQuNy0wLjEsNzUuMS0wLjFjOS44LDAsMTcuOC04LDE3LjgtMTcuOEMxMjg2LjIsODQuOCwxMjc4LjMsNzYuOCwxMjY4LjQsNzYuOHoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTQ3MC43LDE3M2MwLTE5LjctNC42LTM3LjItMTMuNy01Mi4zYy05LjEtMTUuMS0yMC45LTI2LjItMzUuNS0zMy4yYy0xNC42LTcuMS0zNi43LTEwLjYtNjYuNi0xMC42aC0zMS44DQoJCWwtMjcuNCwyMDAuOGg2Mi40YzI2LjIsMCw0Ni43LTMuOSw2MS40LTExLjdjMTQuNy03LjgsMjctMjAuMiwzNi43LTM3LjFDMTQ2NS45LDIxMS45LDE0NzAuNywxOTMuMywxNDcwLjcsMTczeiBNMTQyMS4zLDIxNC41DQoJCWMtNy4zLDExLTE2LjksMTguOC0yOC45LDIzLjNjLTguNiwzLjItMjIuNCw0LjgtNDEuNSw0LjhoLTEyLjRsMTcuNy0xMzAuNGg5LjVjMTUuNSwwLDI3LjksMi40LDM3LjIsNy4zDQoJCWM5LjMsNC45LDE2LjUsMTEuOCwyMS43LDIwLjhjNS4xLDksNy43LDIwLjEsNy43LDMzLjRDMTQzMi4yLDE4OS44LDE0MjguNiwyMDMuNSwxNDIxLjMsMjE0LjV6Ii8+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTE2MTkuMiwxNzAuN2wtMjIuMywxMi4zYy0xLjgsMTYuMi0xNS42LDI4LjctMzIuMiwyOC43Yy0xNy45LDAtMzIuNC0xNC41LTMyLjQtMzIuNA0KCQljMC0xNy45LDE0LjUtMzIuNCwzMi40LTMyLjRjNi45LDAsMTMuMywyLjIsMTguNSw1LjhsMjcuNy0xNS4zbC0xNS02MC4yaC0zMS43bC0xMDgsMjAwaDQwLjRsMjIuOC00Mi42aDc5LjRsMTAuNiw0Mi42aDM2LjQNCgkJTDE2MTkuMiwxNzAuN3oiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTU1Mi44LDE3OC41YzAsNi45LDUuNiwxMi41LDEyLjUsMTIuNWM2LjksMCwxMi41LTUuNiwxMi41LTEyLjVjMC02LjktNS42LTEyLjUtMTIuNS0xMi41DQoJCUMxNTU4LjQsMTY2LDE1NTIuOCwxNzEuNiwxNTUyLjgsMTc4LjV6Ii8+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTgxNC44LDE1Mi41QzgxNC44LDE1Mi41LDgxNC44LDE1Mi40LDgxNC44LDE1Mi41bC0xMi41LDBsLTEuMy0yLjRjLTUuMS04LjEtMTEuNS0xNC4yLTE5LjItMTguNA0KCQljLTcuOC00LjItMjAuMS02LjMtMjkuMy02LjNjLTEzLjcsMC0yNi44LDMuNy0zOS4zLDExLjFjLTEyLjUsNy40LTIyLjUsMTcuNy0yOS45LDMxYy03LjQsMTMuMi0xMS4yLDI3LjItMTEuMiw0MS44DQoJCWMwLDE5LjIsNS44LDM2LDE3LjQsNTAuNWMxMS42LDE0LjUsMjcuMywyMS43LDQ3LDIxLjdjOC42LDAsMTYuMy0xLjQsMjMuMi00LjRjNi45LTIuOSwxNC4zLTgsMjIuMi0xNS40YzAsMCw5LjMsOC4xLDkuNCw4DQoJCWM1LjgsNC42LDEzLDcuNSwyMC44LDhoMy42bDAuNS00LjNsMTIuNy0xMDYuOWMtMC4xLDAtMC4xLDAtMC4yLDBDODI4LjcsMTU4LjgsODIyLjUsMTUyLjYsODE0LjgsMTUyLjV6IE03ODUuNiwyMjQuMg0KCQljLTQuNSw4LjUtMTAuMSwxNC44LTE2LjgsMTguOGMtNi43LDQtMTQuNSw2LTIzLjUsNmMtMTAuOCwwLTE5LjYtMy41LTI2LjUtMTAuN2MtNi45LTcuMS0xMC4zLTE2LjUtMTAuMy0yOC4xDQoJCWMwLTE1LjEsNC41LTI3LjQsMTMuNi0zN2M5LjEtOS42LDIwLjEtMTQuMywzMy4xLTE0LjNjMTEuMiwwLDIwLjIsMy42LDI3LDEwLjdjNi44LDcuMiwxMC4yLDE2LjYsMTAuMiwyOC40DQoJCUM3OTIuNCwyMDYuOSw3OTAuMSwyMTUuNyw3ODUuNiwyMjQuMnoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNNDA0LjMsOTYuM2MtNy41LTE5LjktMTkuNy0zNy44LTM1LjgtNTIuM2MtMjQuNy0yMi4yLTU2LjctMzQuNS05MC0zNC41Yy0yOC44LDAtNTYuMyw5LTc5LjUsMjYNCgkJYy0xMS4yLDguMi0yMC45LDE3LjktMjguOSwyOC45Yy01LTAuNy0xMC4xLTEuMS0xNS4zLTEuMWMtMjguNywwLTU1LjgsMTEuMi03Ni4xLDMxLjVjLTIwLjMsMjAuMy0zMS41LDQ3LjMtMzEuNSw3Ni4xDQoJCWMwLDI2LjcsOS45LDUyLjMsMjcuOCw3Mi4xYzE0LjIsMTUuNywzMi42LDI2LjgsNTIuOSwzMmM4LjgsMjYuMiwzMy42LDQ1LjEsNjIuNyw0NS4xYzM2LjUsMCw2Ni4yLTI5LjcsNjYuMi02Ni4yDQoJCWMwLTIuMS0wLjEtNC4zLTAuMy02LjRsOTIuOS00OC44bC0yMC4zLTM1LjJsLTg4LjgsNDYuNmMtMTIuMS0xMy44LTI5LjktMjIuNS00OS43LTIyLjVjLTI4LjcsMC01My4yLDE4LjQtNjIuNCw0NA0KCQljLTIzLjQtMTAuMy0zOS44LTMzLjYtMzkuOC02MC44YzAtMzYuNiwyOS43LTY2LjQsNjYuNC02Ni40YzEyLjksMCwyNSwzLjcsMzUuMiwxMC4xYzEyLjMtMzcuMSw0Ny4zLTYzLjksODguNS02My45DQoJCWM0OCwwLDg3LjQsMzYuMiw5Mi43LDgyLjdjMS43LTAuMiwzLjQtMC4zLDUuMS0wLjNjMjguNywwLDUyLDIzLjMsNTIsNTJjMCwyNy4yLTIwLjksNDkuNS00Ny41LDUxLjhsLTI5LjcsMA0KCQljLTEuMy0wLjMtMi43LTAuNC00LjEtMC40Yy0xMS41LDAtMjAuOCw5LjMtMjAuOCwyMC44YzAsMTAuOSw4LjQsMTkuOCwxOS4xLDIwLjd2MC4ybDM1LjUsMGwxLjgsMGwxLjgtMC4yDQoJCWMyMy4yLTIsNDQuNy0xMi41LDYwLjUtMjkuN2MxNS45LTE3LjMsMjQuNy0zOS43LDI0LjctNjMuMkM0NjkuNiwxNDMuNiw0NDIuMSwxMDguMiw0MDQuMyw5Ni4zeiBNMTkwLjYsMjI4LjMNCgkJYzE0LjEsMCwyNS42LDExLjUsMjUuNiwyNS42YzAsMTQuMS0xMS41LDI1LjYtMjUuNiwyNS42Yy0xNC4xLDAtMjUuNi0xMS41LTI1LjYtMjUuNkMxNjUsMjM5LjgsMTc2LjUsMjI4LjMsMTkwLjYsMjI4LjN6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==","LIB~505~-570~package`TTGO-T-BEAM-ESP32-CONNECTOR`BOM_Manufacturer``BOM_Manufacturer Part``BOM_Supplier Part``BOM_Supplier``link``Contributor`grizli2509`spicePre`U`spiceSymbolName`TTGO-BEAM-ESP32`Package Display`No`~~0~gge6aaff6c194964e3d~5180c2e0c1da4a75b575a8495aee30f2~5657e928f1504b21b9e68062d66ba3e3~0~~yes~yes#@$T~N~470.46~-721.7890625~0~#000080~Arial~~~~~comment~MAIN BOARD~1~start~gge857~0~#@$T~P~494.04~-732.125~0~#000080~Arial~~~~~comment~U1~1~start~gge859~0~#@$P~show~0~1~475~-700~~gge861~0^^475~-700^^M 475 -700 h -20~#880000^^1~453~-697~0~S_VP~end~~~#0000FF^^1~460~-701~0~S_VP~start~~~#0000FF^^0~458~-700^^0~M 455 -703 L 452 -700 L 455 -697#@$P~show~0~2~475~-680~~gge868~0^^475~-680^^M 475 -680 h -20~#880000^^1~453~-677~0~S_VN~end~~~#0000FF^^1~460~-681~0~S_VN~start~~~#0000FF^^0~458~-680^^0~M 455 -683 L 452 -680 L 455 -677#@$P~show~0~3~475~-660~~gge875~0^^475~-660^^M 475 -660 h -20~#880000^^1~453~-657~0~RST~end~~~#0000FF^^1~460~-661~0~RST~start~~~#0000FF^^0~458~-660^^0~M 455 -663 L 452 -660 L 455 -657#@$P~show~0~4~475~-640~~gge882~0^^475~-640^^M 475 -640 h -20~#880000^^1~453~-637~0~15~end~~~#0000FF^^1~460~-641~0~15~start~~~#0000FF^^0~458~-640^^0~M 455 -643 L 452 -640 L 455 -637#@$P~show~0~5~475~-620~~gge889~0^^475~-620^^M 475 -620 h -20~#880000^^1~453~-617~0~35~end~~~#0000FF^^1~460~-621~0~35~start~~~#0000FF^^0~458~-620^^0~M 455 -623 L 452 -620 L 455 -617#@$P~show~0~6~475~-600~~gge896~0^^475~-600^^M 475 -600 h -20~#880000^^1~453~-597~0~32~end~~~#0000FF^^1~460~-601~0~32~start~~~#0000FF^^0~458~-600^^0~M 455 -603 L 452 -600 L 455 -597#@$P~show~0~7~475~-580~~gge903~0^^475~-580^^M 475 -580 h -20~#880000^^1~453~-577~0~33~end~~~#0000FF^^1~460~-581~0~33~start~~~#0000FF^^0~458~-580^^0~M 455 -583 L 452 -580 L 455 -577#@$P~show~0~8~475~-560~~gge910~0^^475~-560^^M 475 -560 h -20~#880000^^1~453~-557~0~25~end~~~#0000FF^^1~460~-561~0~25~start~~~#0000FF^^0~458~-560^^0~M 455 -563 L 452 -560 L 455 -557#@$P~show~0~9~475~-540~~gge917~0^^475~-540^^M 475 -540 h -20~#880000^^1~453~-537~0~14~end~~~#0000FF^^1~460~-541~0~14~start~~~#0000FF^^0~458~-540^^0~M 455 -543 L 452 -540 L 455 -537#@$P~show~0~10~475~-520~~gge924~0^^475~-520^^M 475 -520 h -20~#880000^^1~453~-517~0~13~end~~~#0000FF^^1~460~-521~0~13~start~~~#0000FF^^0~458~-520^^0~M 455 -523 L 452 -520 L 455 -517#@$P~show~0~11~475~-500~~gge931~0^^475~-500^^M 475 -500 h -20~#880000^^1~453~-497~0~02~end~~~#0000FF^^1~460~-501~0~02~start~~~#0000FF^^0~458~-500^^0~M 455 -503 L 452 -500 L 455 -497#@$P~show~0~12~475~-480~~gge938~0^^475~-480^^M 475 -480 h -20~#880000^^1~453~-477~0~GND~end~~~#0000FF^^1~460~-481~0~GND_3~start~~~#0000FF^^0~458~-480^^0~M 455 -483 L 452 -480 L 455 -477#@$P~show~0~13~475~-460~~gge945~0^^475~-460^^M 475 -460 h -20~#880000^^1~453~-457~0~5V~end~~~#0000FF^^1~460~-461~0~5V~start~~~#0000FF^^0~458~-460^^0~M 455 -463 L 452 -460 L 455 -457#@$P~show~0~14~515~-460~180~gge952~0^^515~-460^^M 515 -460 h 20~#880000^^1~537~-457~0~LORA1~start~~~#0000FF^^1~530~-461~0~LORA1~end~~~#0000FF^^0~532~-460^^0~M 535 -457 L 538 -460 L 535 -463#@$P~show~0~15~515~-480~180~gge959~0^^515~-480^^M 515 -480 h 20~#880000^^1~537~-477~0~LORA2~start~~~#0000FF^^1~530~-481~0~LORA2~end~~~#0000FF^^0~532~-480^^0~M 535 -477 L 538 -480 L 535 -483#@$P~show~0~16~515~-500~180~gge966~0^^515~-500^^M 515 -500 h 20~#880000^^1~537~-497~0~3V3~start~~~#0000FF^^1~528.33~-501~0~3V3_2~end~~~#0000FF^^0~532~-500^^0~M 535 -497 L 538 -500 L 535 -503#@$P~show~0~17~515~-520~180~gge973~0^^515~-520^^M 515 -520 h 20~#880000^^1~537~-517~0~21~start~~~#0000FF^^1~527.5~-521~0~21~end~~~#0000FF^^0~532~-520^^0~M 535 -517 L 538 -520 L 535 -523#@$P~show~0~18~515~-540~180~gge980~0^^515~-540^^M 515 -540 h 20~#880000^^1~537~-537~0~22~start~~~#0000FF^^1~530~-541~0~22~end~~~#0000FF^^0~532~-540^^0~M 535 -537 L 538 -540 L 535 -543#@$P~show~0~19~515~-560~180~gge987~0^^515~-560^^M 515 -560 h 20~#880000^^1~537~-557~0~GND~start~~~#0000FF^^1~530~-561~0~GND_2~end~~~#0000FF^^0~532~-560^^0~M 535 -557 L 538 -560 L 535 -563#@$P~show~0~20~515~-580~180~gge994~0^^515~-580^^M 515 -580 h 20~#880000^^1~537~-577~0~3V3~start~~~#0000FF^^1~530~-581~0~3V3_1~end~~~#0000FF^^0~532~-580^^0~M 535 -577 L 538 -580 L 535 -583#@$P~show~0~21~515~-600~180~gge1001~0^^515~-600^^M 515 -600 h 20~#880000^^1~537~-597~0~GND~start~~~#0000FF^^1~530~-601~0~GND_1~end~~~#0000FF^^0~532~-600^^0~M 535 -597 L 538 -600 L 535 -603#@$P~show~0~22~515~-620~180~gge1008~0^^515~-620^^M 515 -620 h 20~#880000^^1~537~-617~0~0~start~~~#0000FF^^1~530~-621~0~0~end~~~#0000FF^^0~532~-620^^0~M 535 -617 L 538 -620 L 535 -623#@$P~show~0~23~515~-640~180~gge1015~0^^515~-640^^M 515 -640 h 20~#880000^^1~537~-637~0~4~start~~~#0000FF^^1~530~-641~0~4~end~~~#0000FF^^0~532~-640^^0~M 535 -637 L 538 -640 L 535 -643#@$P~show~0~24~515~-660~180~gge1022~0^^515~-660^^M 515 -660 h 20~#880000^^1~537~-657~0~23~start~~~#0000FF^^1~530~-661~0~23~end~~~#0000FF^^0~532~-660^^0~M 535 -657 L 538 -660 L 535 -663#@$P~show~0~25~515~-680~180~gge1029~0^^515~-680^^M 515 -680 h 20~#880000^^1~537~-677~0~RX~start~~~#0000FF^^1~530~-681~0~RX~end~~~#0000FF^^0~532~-680^^0~M 535 -677 L 538 -680 L 535 -683#@$P~show~0~26~515~-700~180~gge1036~0^^515~-700^^M 515 -700 h 20~#880000^^1~537~-697~0~TX~start~~~#0000FF^^1~530~-701~0~TX~end~~~#0000FF^^0~532~-700^^0~M 535 -697 L 538 -700 L 535 -703#@$R~415~-720~~~170~290~#000000~1~0~none~gge1043~0~","LIB~750~-375~package`MCP23017`BOM_Manufacturer``BOM_Manufacturer Part`MCP23017`BOM_Supplier Part``BOM_Supplier``link``Contributor`emmanuel.malosse`spicePre`U`spiceSymbolName`MCP23017`~~0~ggeb1124de9a27319d1~f09420c4fd9946a583a6b15c1c5a483e~0f118b0d9063400da84e04b55532a171~0~~yes~yes#@$T~N~744.03125~-468.296875~0~#000080~Arial~~~~~comment~MCP23017~1~start~gge3184~0~#@$T~P~744.0390625~-477.421875~0~#000080~Arial~~~~~comment~U3~1~start~gge3186~0~#@$P~show~0~1~680~-455~180~gge3188~0^^680~-455^^M 680 -455 h 20~#880000^^1~702~-452~0~VCC~start~~~#0000FF^^1~695~-456~0~11~end~~~#0000FF^^0~697~-455^^0~M 700 -452 L 703 -455 L 700 -458#@$P~show~0~2~680~-445~180~gge3195~0^^680~-445^^M 680 -445 h 20~#880000^^1~702~-442~0~VCC~start~~~#0000FF^^1~695~-446~0~10~end~~~#0000FF^^0~697~-445^^0~M 700 -442 L 703 -445 L 700 -448#@$P~show~0~3~680~-405~180~gge3202~0^^680~-405^^M 680 -405 h 20~#880000^^1~702~-402~0~A0~start~~~#0000FF^^1~695~-406~0~3~end~~~#0000FF^^0~697~-405^^0~M 700 -402 L 703 -405 L 700 -408#@$P~show~0~4~680~-395~180~gge3209~0^^680~-395^^M 680 -395 h 20~#880000^^1~702~-392~0~A1~start~~~#0000FF^^1~695~-396~0~2~end~~~#0000FF^^0~697~-395^^0~M 700 -392 L 703 -395 L 700 -398#@$P~show~0~5~680~-385~180~gge3216~0^^680~-385^^M 680 -385 h 20~#880000^^1~702~-382~0~A2~start~~~#0000FF^^1~695~-386~0~1~end~~~#0000FF^^0~697~-385^^0~M 700 -382 L 703 -385 L 700 -388#@$P~show~0~6~680~-375~180~gge3223~0^^680~-375^^M 680 -375 h 20~#880000^^1~702~-372~0~Reset~start~~~#0000FF^^1~695~-376~0~4~end~~~#0000FF^^0~697~-375^^0~M 700 -372 L 703 -375 L 700 -378#@$P~show~0~7~680~-355~180~gge3230~0^^680~-355^^M 680 -355 h 20~#880000^^1~702~-352~0~SO~start~~~#0000FF^^1~695~-356~0~5~end~~~#0000FF^^0~697~-355^^0~M 700 -352 L 703 -355 L 700 -358#@$P~show~0~8~680~-345~180~gge3237~0^^680~-345^^M 680 -345 h 20~#880000^^1~702~-342~0~CS~start~~~#0000FF^^1~695~-346~0~6~end~~~#0000FF^^0~697~-345^^0~M 700 -342 L 703 -345 L 700 -348#@$P~show~0~9~680~-335~180~gge3244~0^^680~-335^^M 680 -335 h 20~#880000^^1~702~-332~0~SDA~start~~~#0000FF^^1~695~-336~0~7~end~~~#0000FF^^0~697~-335^^0~M 700 -332 L 703 -335 L 700 -338#@$P~show~0~10~680~-325~180~gge3251~0^^680~-325^^M 680 -325 h 20~#880000^^1~702~-322~0~SCL~start~~~#0000FF^^1~695~-326~0~8~end~~~#0000FF^^0~697~-325^^0~M 700 -322 L 703 -325 L 700 -328#@$P~show~0~11~820~-455~0~gge3258~0^^820~-455^^M 820 -455 h -20~#880000^^1~798~-452~0~A0~end~~~#0000FF^^1~805~-456~0~23~start~~~#0000FF^^0~803~-455^^0~M 800 -458 L 797 -455 L 800 -452#@$P~show~0~12~820~-445~0~gge3265~0^^820~-445^^M 820 -445 h -20~#880000^^1~798~-442~0~A1~end~~~#0000FF^^1~805~-446~0~24~start~~~#0000FF^^0~803~-445^^0~M 800 -448 L 797 -445 L 800 -442#@$P~show~0~13~820~-435~0~gge3272~0^^820~-435^^M 820 -435 h -20~#880000^^1~798~-432~0~A2~end~~~#0000FF^^1~805~-436~0~25~start~~~#0000FF^^0~803~-435^^0~M 800 -438 L 797 -435 L 800 -432#@$P~show~0~14~820~-425~0~gge3279~0^^820~-425^^M 820 -425 h -20~#880000^^1~798~-422~0~A3~end~~~#0000FF^^1~805~-426~0~26~start~~~#0000FF^^0~803~-425^^0~M 800 -428 L 797 -425 L 800 -422#@$P~show~0~15~820~-415~0~gge3286~0^^820~-415^^M 820 -415 h -20~#880000^^1~798~-412~0~A4~end~~~#0000FF^^1~805~-416~0~27~start~~~#0000FF^^0~803~-415^^0~M 800 -418 L 797 -415 L 800 -412#@$P~show~0~16~820~-405~0~gge3293~0^^820~-405^^M 820 -405 h -20~#880000^^1~798~-402~0~A5~end~~~#0000FF^^1~805~-406~0~28~start~~~#0000FF^^0~803~-405^^0~M 800 -408 L 797 -405 L 800 -402#@$P~show~0~17~820~-395~0~gge3300~0^^820~-395^^M 820 -395 h -20~#880000^^1~798~-392~0~A6~end~~~#0000FF^^1~805~-396~0~29~start~~~#0000FF^^0~803~-395^^0~M 800 -398 L 797 -395 L 800 -392#@$P~show~0~18~820~-385~0~gge3307~0^^820~-385^^M 820 -385 h -20~#880000^^1~798~-382~0~A7~end~~~#0000FF^^1~805~-386~0~30~start~~~#0000FF^^0~803~-385^^0~M 800 -388 L 797 -385 L 800 -382#@$P~show~0~19~820~-365~0~gge3314~0^^820~-365^^M 820 -365 h -20~#880000^^1~798~-362~0~B0~end~~~#0000FF^^1~805~-366~0~13~start~~~#0000FF^^0~803~-365^^0~M 800 -368 L 797 -365 L 800 -362#@$P~show~0~20~820~-355~0~gge3321~0^^820~-355^^M 820 -355 h -20~#880000^^1~798~-352~0~B1~end~~~#0000FF^^1~805~-356~0~14~start~~~#0000FF^^0~803~-355^^0~M 800 -358 L 797 -355 L 800 -352#@$P~show~0~21~820~-345~0~gge3328~0^^820~-345^^M 820 -345 h -20~#880000^^1~798~-342~0~B2~end~~~#0000FF^^1~805~-346~0~15~start~~~#0000FF^^0~803~-345^^0~M 800 -348 L 797 -345 L 800 -342#@$P~show~0~22~820~-335~0~gge3335~0^^820~-335^^M 820 -335 h -20~#880000^^1~798~-332~0~B3~end~~~#0000FF^^1~805~-336~0~16~start~~~#0000FF^^0~803~-335^^0~M 800 -338 L 797 -335 L 800 -332#@$P~show~0~23~820~-325~0~gge3342~0^^820~-325^^M 820 -325 h -20~#880000^^1~798~-322~0~B4~end~~~#0000FF^^1~805~-326~0~17~start~~~#0000FF^^0~803~-325^^0~M 800 -328 L 797 -325 L 800 -322#@$P~show~0~24~820~-315~0~gge3349~0^^820~-315^^M 820 -315 h -20~#880000^^1~798~-312~0~B5~end~~~#0000FF^^1~805~-316~0~18~start~~~#0000FF^^0~803~-315^^0~M 800 -318 L 797 -315 L 800 -312#@$P~show~0~25~820~-305~0~gge3356~0^^820~-305^^M 820 -305 h -20~#880000^^1~798~-302~0~B6~end~~~#0000FF^^1~805~-306~0~19~start~~~#0000FF^^0~803~-305^^0~M 800 -308 L 797 -305 L 800 -302#@$P~show~0~26~820~-295~0~gge3363~0^^820~-295^^M 820 -295 h -20~#880000^^1~798~-292~0~B7~end~~~#0000FF^^1~805~-296~0~20~start~~~#0000FF^^0~803~-295^^0~M 800 -298 L 797 -295 L 800 -292#@$P~show~0~27~680~-305~180~gge3370~0^^680~-305^^M 680 -305 h 20~#880000^^1~702~-302~0~ITA~start~~~#0000FF^^1~695~-306~0~22~end~~~#0000FF^^0~697~-305^^0~M 700 -302 L 703 -305 L 700 -308#@$P~show~0~28~680~-295~180~gge3377~0^^680~-295^^M 680 -295 h 20~#880000^^1~702~-292~0~ITB~start~~~#0000FF^^1~695~-296~0~11~end~~~#0000FF^^0~697~-295^^0~M 700 -292 L 703 -295 L 700 -298#@$T~L~720~-312.78~0~#0000FF~~9pt~~~~comment~MCP23017~1~start~gge3384~0~pinpart#@$R~700~-465~~~100~180~#000000~1~0~none~gge3386~0~#@$P~show~0~29~680~-435~180~gge3387~0^^680~-435^^M 680 -435 h 20~#880000^^1~702~-432~0~GND~start~~~#0000FF^^1~695~-436~0~21~end~~~#0000FF^^0~697~-435^^0~M 700 -432 L 703 -435 L 700 -438#@$P~show~0~0~680~-425~180~gge3394~0^^680~-425^^M 680 -425 h 20~#880000^^1~702~-422~0~GND~start~~~#0000FF^^1~695~-426~0~9~end~~~#0000FF^^0~697~-425^^0~M 700 -422 L 703 -425 L 700 -428","W~515 -560 665 -560 665 -660 700 -660~#008800~1~0~none~gge3621~0","W~680 -435 665 -435 665 -560~#008800~1~0~none~gge3622~0","W~680 -425 665 -425 665 -435~#008800~1~0~none~gge3626~0","W~515 -540 645 -540 645 -640 700 -640~#008800~1~0~none~gge3630~0","W~680 -325 645 -325 645 -540~#008800~1~0~none~gge3631~0","W~515 -520 635 -520 635 -335 680 -335~#008800~1~0~none~gge3633~0","W~700 -620 675 -620 675 -520 635 -520~#008800~1~0~none~gge3634~0","F~part_netLabel_gnD~875~-645~0~gge3637~~0^^875~-645^^GND~#000000~862~-619~0~start~1~Times New Roman~9pt~flag_gge5^^PL~875 -635 875 -645~#000000~1~0~transparent~gge3641~0^^PL~866 -635 884 -635~#000000~1~0~transparent~gge3642~0^^PL~869 -633 881 -633~#000000~1~0~transparent~gge3643~0^^PL~872 -631 878 -631~#000000~1~0~transparent~gge3644~0^^PL~874 -629 876 -629~#000000~1~0~transparent~gge3645~0","W~875 -645 875 -725 665 -725 665 -660~#008800~1~0~none~gge3655~0","W~655 -680 655 -455 680 -455~#008800~1~0~none~gge3670~0","W~680 -445 655 -445 655 -455~#008800~1~0~none~gge3672~0","W~515 -500 625 -500 625 -680 700 -680~#008800~1~0~none~gge3674~0","W~515 -600 665 -600~#008800~1~0~none~gge5803~0","W~475 -480 360 -480 360 -760 665 -760 665 -695~#008800~1~0~none~gge5805~0","W~225 -750 225 -750 625 -750 625 -680~#008800~1~0~none~gge5807~0","W~300 -640 280 -640 280 -700 475 -700~#008800~1~0~none~gge5809~0","LIB~320~-640~package`RES-TH_BD1.8-L3.2-P7.20-D0.4`BOM_Supplier`LCSC`BOM_Supplier Part`C714232`BOM_Manufacturer`Huaxing Mechanical-Elec.`BOM_Manufacturer Part`CF1/6W-10KΊ¹5%T52`nameAlias`Resistance (Ohms)`Contributor`LCSC`spicePre`R`spiceSymbolName`CF1/6W-10KΊ¹5%T52`~~0~gge2be133cf7b4aac5a~97467e7cb6374f7e9dd7fc644a47cfb1~2ba8a26395ab41a2a00f577110f8f3f7~0~~yes~yes#@$T~N~314.03125~-648~0~#000080~Arial~~~~~comment~10kΊ~1~start~gge6472~0~#@$T~P~314.0390625~-657.125~0~#000080~Arial~~~~~comment~R2~1~start~gge6474~0~#@$R~310~-645~~~20~10~#A00000~1~0~none~gge6476~0~#@$P~show~0~2~340~-640~0~gge6477~0^^340~-640^^M 330 -640 h 10~#800^^0~326~-640~0~2~end~~~#800^^0~334~-644~0~2~start~~~#800^^0~353~-640^^0~M 350 -643 L 347 -640 L 350 -637#@$P~show~0~1~300~-640~180~gge6484~0^^300~-640^^M 310 -640 h -10~#800^^0~314~-640~0~1~start~~~#800^^0~306~-644~0~1~end~~~#800^^0~287~-640^^0~M 290 -637 L 293 -640 L 290 -643","W~335 -410 335 -390 360 -390 360 -375 420 -375 420 -410 610 -410 610 -580 515 -580~#008800~1~0~none~gge7116~0","W~335 -470 370 -470 370 -420 600 -420 600 -640 515 -640~#008800~1~0~none~gge7119~0","W~335 -430 405 -430 405 -500 475 -500~#008800~1~0~none~gge7120~0","W~335 -440 395 -440 395 -520 475 -520~#008800~1~0~none~gge7122~0","W~340 -640 360 -640~#008800~1~0~none~gge7126~0","W~335 -450 385 -450 385 -540 475 -540~#008800~1~0~none~gge7128~0","T~L~340~-405~0~#0000FF~~4pt~~~~comment~VCC~1~start~gge7135~0~pinpart","T~L~340~-465~0~#0000FF~~4pt~~~~comment~RST~1~start~gge7143~0~pinpart","T~L~340~-435~0~#0000FF~~4pt~~~~comment~MISO~1~start~gge7146~0~pinpart","T~L~340~-445~0~#0000FF~~4pt~~~~comment~MOSI~1~start~gge7149~0~pinpart","T~L~340~-425~0~#0000FF~~4pt~~~~comment~SCLK~1~start~gge7152~0~pinpart","T~L~340~-455~0~#0000FF~~4pt~~~~comment~CS~1~start~gge7155~0~pinpart","F~part_netLabel_gnD~330~-610~0~gge7160~~0^^330~-610^^GND~#000000~317~-584~0~start~1~Times New Roman~9pt~flag_gge6^^PL~330 -600 330 -610~#000000~1~0~transparent~gge7164~0^^PL~321 -600 339 -600~#000000~1~0~transparent~gge7165~0^^PL~324 -598 336 -598~#000000~1~0~transparent~gge7166~0^^PL~327 -596 333 -596~#000000~1~0~transparent~gge7167~0^^PL~329 -594 331 -594~#000000~1~0~transparent~gge7168~0","W~330 -610 360 -610~#008800~1~0~none~gge7178~0","W~280 -230 240 -230 240 -510 360 -510~#008800~1~0~none~gge7180~0","W~680 -405 665 -405 665 -425~#008800~1~0~none~gge7191~0","W~680 -395 665 -395 665 -405~#008800~1~0~none~gge7193~0","W~680 -385 665 -385 665 -395~#008800~1~0~none~gge7195~0","LIB~410~-230~package`WIRELM-TH_DWM1000`BOM_Supplier`LCSC`BOM_Manufacturer`DecaWave`BOM_Manufacturer Part`DWM1000`BOM_Supplier Part`C95238`spicePre`U`spiceSymbolName`DWM1000`~~0~gge40e5c90f659fccfc~921ff2190df246a4b1016c11071a51a1~605f956fd8c24817bb840fda3296ca74~0~~yes~yes#@$T~N~387.96875~-351.75~0~#000080~Arial~~~~~comment~DWM1000~1~start~gge7203~0~#@$T~P~404.21875~-362.125~0~#000080~Arial~~~~~comment~U5~1~start~gge7205~0~#@$E~295~-307~1.5~1.5~#880000~1~0~#880000~gge7207~0#@$R~290~-350~2~2~240~230~#880000~1~0~none~gge7208~0~#@$E~295~-307~1.5~1.5~#880000~1~0~#880000~gge7209~0#@$P~show~0~1~280~-300~180~gge7210~0^^280~-300^^M 280 -300 h 10~#880000^^1~293.7~-296~0~EXTON~start~~~#0000FF^^1~289.5~-301~0~1~end~~~#0000FF^^0~287~-300^^0~M 290 -297 L 293 -300 L 290 -303#@$P~show~0~2~280~-290~180~gge7217~0^^280~-290^^M 280 -290 h 10~#880000^^1~293.7~-286~0~WAKEUP~start~~~#0000FF^^1~289.5~-291~0~2~end~~~#0000FF^^0~287~-290^^0~M 290 -287 L 293 -290 L 290 -293#@$P~show~0~3~280~-280~180~gge7224~0^^280~-280^^M 280 -280 h 10~#880000^^1~293.7~-276~0~RSTn~start~~~#0000FF^^1~289.5~-281~0~3~end~~~#0000FF^^0~287~-280^^0~M 290 -277 L 293 -280 L 290 -283#@$P~show~0~4~280~-270~180~gge7231~0^^280~-270^^M 280 -270 h 10~#880000^^1~293.7~-266~0~GPIO7~start~~~#0000FF^^1~289.5~-271~0~4~end~~~#0000FF^^0~287~-270^^0~M 290 -267 L 293 -270 L 290 -273#@$P~show~0~5~280~-260~180~gge7238~0^^280~-260^^M 280 -260 h 10~#FF0000^^1~293.7~-256~0~VDDAON~start~~~#FF0000^^1~289.5~-261~0~5~end~~~#FF0000^^0~287~-260^^0~M 290 -257 L 293 -260 L 290 -263#@$P~show~0~6~280~-250~180~gge7245~0^^280~-250^^M 280 -250 h 10~#FF0000^^1~293.7~-246~0~VDD3V3~start~~~#FF0000^^1~289.5~-251~0~6~end~~~#FF0000^^0~287~-250^^0~M 290 -247 L 293 -250 L 290 -253#@$P~show~0~7~280~-240~180~gge7252~0^^280~-240^^M 280 -240 h 10~#FF0000^^1~293.7~-236~0~VDD3V3~start~~~#FF0000^^1~289.5~-241~0~7~end~~~#FF0000^^0~287~-240^^0~M 290 -237 L 293 -240 L 290 -243#@$P~show~0~8~280~-230~180~gge7259~0^^280~-230^^M 280 -230 h 10~#000000^^1~293.7~-226~0~VSS~start~~~#000000^^1~289.5~-231~0~8~end~~~#000000^^0~287~-230^^0~M 290 -227 L 293 -230 L 290 -233#@$P~show~0~9~370~-110~270~gge7266~0^^370~-110^^M 370 -110 v -10~#880000^^1~374~-123.7~270~GPIO6/EXTRXE/SPIPHA~start~~~#0000FF^^1~369~-119.5~270~9~end~~~#0000FF^^0~370~-117^^0~M 373 -120 L 370 -123 L 367 -120#@$P~show~0~10~380~-110~270~gge7273~0^^380~-110^^M 380 -110 v -10~#880000^^1~384~-123.7~270~GPIO5/EXTTXE/SPIPOL~start~~~#0000FF^^1~379~-119.5~270~10~end~~~#0000FF^^0~380~-117^^0~M 383 -120 L 380 -123 L 377 -120#@$P~show~0~11~390~-110~270~gge7280~0^^390~-110^^M 390 -110 v -10~#880000^^1~394~-123.7~270~GPIO4EXTPA~start~~~#0000FF^^1~389~-119.5~270~11~end~~~#0000FF^^0~390~-117^^0~M 393 -120 L 390 -123 L 387 -120#@$P~show~0~12~400~-110~270~gge7287~0^^400~-110^^M 400 -110 v -10~#880000^^1~404~-123.7~270~GPIO3TXLED~start~~~#0000FF^^1~399~-119.5~270~12~end~~~#0000FF^^0~400~-117^^0~M 403 -120 L 400 -123 L 397 -120#@$P~show~0~13~410~-110~270~gge7294~0^^410~-110^^M 410 -110 v -10~#880000^^1~414~-123.7~270~GPIO2RXLED~start~~~#0000FF^^1~409~-119.5~270~13~end~~~#0000FF^^0~410~-117^^0~M 413 -120 L 410 -123 L 407 -120#@$P~show~0~14~420~-110~270~gge7301~0^^420~-110^^M 420 -110 v -10~#880000^^1~424~-123.7~270~GPIO1SFDLED~start~~~#0000FF^^1~419~-119.5~270~14~end~~~#0000FF^^0~420~-117^^0~M 423 -120 L 420 -123 L 417 -120#@$P~show~0~15~430~-110~270~gge7308~0^^430~-110^^M 430 -110 v -10~#880000^^1~434~-123.7~270~GPIO0RXOKLED~start~~~#0000FF^^1~429~-119.5~270~15~end~~~#0000FF^^0~430~-117^^0~M 433 -120 L 430 -123 L 427 -120#@$P~show~0~16~440~-110~270~gge7315~0^^440~-110^^M 440 -110 v -10~#000000^^1~444~-123.7~270~VSS~start~~~#000000^^1~439~-119.5~270~16~end~~~#000000^^0~440~-117^^0~M 443 -120 L 440 -123 L 437 -120#@$P~show~0~17~540~-230~0~gge7322~0^^540~-230^^M 540 -230 h -10~#880000^^1~526.3~-226~0~SPICSn~end~~~#0000FF^^1~530.5~-231~0~17~start~~~#0000FF^^0~533~-230^^0~M 530 -233 L 527 -230 L 530 -227#@$P~show~0~18~540~-240~0~gge7329~0^^540~-240^^M 540 -240 h -10~#880000^^1~526.3~-236~0~SPIMOSI~end~~~#0000FF^^1~530.5~-241~0~18~start~~~#0000FF^^0~533~-240^^0~M 530 -243 L 527 -240 L 530 -237#@$P~show~0~19~540~-250~0~gge7336~0^^540~-250^^M 540 -250 h -10~#880000^^1~526.3~-246~0~SPIMISO~end~~~#0000FF^^1~530.5~-251~0~19~start~~~#0000FF^^0~533~-250^^0~M 530 -253 L 527 -250 L 530 -247#@$P~show~0~20~540~-260~0~gge7343~0^^540~-260^^M 540 -260 h -10~#880000^^1~526.3~-256~0~SPICLK~end~~~#0000FF^^1~530.5~-261~0~20~start~~~#0000FF^^0~533~-260^^0~M 530 -263 L 527 -260 L 530 -257#@$P~show~0~21~540~-270~0~gge7350~0^^540~-270^^M 540 -270 h -10~#000000^^1~526.3~-266~0~VSS~end~~~#000000^^1~530.5~-271~0~21~start~~~#000000^^0~533~-270^^0~M 530 -273 L 527 -270 L 530 -267#@$P~show~0~22~540~-280~0~gge7357~0^^540~-280^^M 540 -280 h -10~#880000^^1~526.3~-276~0~IRQ/GPIO8~end~~~#0000FF^^1~530.5~-281~0~22~start~~~#0000FF^^0~533~-280^^0~M 530 -283 L 527 -280 L 530 -277#@$P~show~0~23~540~-290~0~gge7364~0^^540~-290^^M 540 -290 h -10~#000000^^1~526.3~-286~0~VSS~end~~~#000000^^1~530.5~-291~0~23~start~~~#000000^^0~533~-290^^0~M 530 -293 L 527 -290 L 530 -287#@$P~show~0~24~540~-300~0~gge7371~0^^540~-300^^M 540 -300 h -10~#000000^^1~526.3~-296~0~VSS~end~~~#000000^^1~530.5~-301~0~24~start~~~#000000^^0~533~-300^^0~M 530 -303 L 527 -300 L 530 -297","W~335 -460 375 -460 375 -560 475 -560~#008800~1~0~none~gge7555~0","W~280 -260 225 -260 225 -750~#008800~1~0~none~gge7557~0","W~280 -250 225 -250 225 -260~#008800~1~0~none~gge7559~0","W~280 -240 225 -240 225 -250~#008800~1~0~none~gge7561~0","W~440 -110 440 -80 240 -80 240 -230~#008800~1~0~none~gge7565~0","W~540 -300 575 -300 575 -80 440 -80~#008800~1~0~none~gge7567~0","W~540 -290 575 -290~#008800~1~0~none~gge7569~0","W~540 -270 575 -270~#008800~1~0~none~gge7571~0","W~540 -240 585 -240 585 -380 385 -380 385 -450~#008800~1~0~none~gge7573~0","W~540 -250 595 -250 595 -390 395 -390 395 -440~#008800~1~0~none~gge7575~0","W~540 -260 605 -260 605 -400 405 -400 405 -430~#008800~1~0~none~gge7577~0","W~625 -280 625 -70 210 -70 210 -625 375 -625 375 -640 475 -640~#008800~1~0~none~gge7579~0","W~280 -280 270 -280 270 -60 680 -60 680 -260 835 -260 835 -415 820 -415~#008800~1~0~none~gge7580~0","LIB~625~-310~package`RES-TH_BD1.8-L3.2-P7.20-D0.4`BOM_Supplier`LCSC`BOM_Supplier Part`C714232`BOM_Manufacturer`Huaxing Mechanical-Elec.`BOM_Manufacturer Part`CF1/6W-10KΊ¹5%T52`nameAlias`Resistance (Ohms)`Contributor`LCSC`spicePre`R`spiceSymbolName`CF1/6W-10KΊ¹5%T52`~270~0~gge0d47179fde529207~97467e7cb6374f7e9dd7fc644a47cfb1~2ba8a26395ab41a2a00f577110f8f3f7~0~~yes~yes#@$T~N~632~-297.640625~0~#000080~Arial~~~~~comment~10kΊ~1~start~gge7584~0~#@$T~P~632~-306.78125~0~#000080~Arial~~~~~comment~R3~1~start~gge7586~0~#@$R~620~-320~~~10~20~#A00000~1~0~none~gge7588~0~#@$P~show~0~2~625~-290~270~gge7589~0^^625~-290^^M 625 -300 v 10~#800^^0~625~-304~270~2~start~~~#800^^0~621~-296~270~2~end~~~#800^^0~625~-277^^0~M 628 -280 L 625 -283 L 622 -280#@$P~show~0~1~625~-330~90~gge7596~0^^625~-330^^M 625 -320 v -10~#800^^0~625~-316~270~1~end~~~#800^^0~621~-324~270~1~start~~~#800^^0~625~-343^^0~M 622 -340 L 625 -337 L 628 -340","W~625 -330 625 -425 665 -425~#008800~1~0~none~gge7607~0","W~540 -280 625 -280 625 -290~#008800~1~0~none~gge7608~0","LIB~140~-670~package`M2X3`Contributor`DangerousPrototype`spicePre`J`spiceSymbolName`CON_HEADER_2X03`BOM_Manufacturer Part``~~0~gge73b657ec88652575~1a95e0cd8cf04abab1f0a955e387d9de~4cf556fe97124ad8934102a1b113e234~0~~yes~yes#@$T~N~128.3359375~-691.75~0~#000080~Arial~~~~~comment~LEFT IO~1~start~gge7932~0~#@$T~P~135.078125~-702~0~#000080~Arial~~~~~comment~J1~1~start~gge7934~0~#@$PL~120 -690 160 -690~#8D2323~2~0~none~gge7936~0#@$PL~160 -690 160 -650~#8D2323~2~0~none~gge7937~0#@$PL~160 -650 120 -650~#8D2323~2~0~none~gge7938~0#@$PL~120 -650 120 -690~#8D2323~2~0~none~gge7939~0#@$P~show~0~1~125~-680~180~gge7940~0^^125~-680^^M 125 -680 h 4~#8D2323^^0~138~-677~0~1~start~~~#8D2323^^1~129~-681~0~1~end~~~#8D2323^^1~132~-680^^0~M 135 -677 L 138 -680 L 135 -683#@$P~show~0~3~125~-670~180~gge7947~0^^125~-670^^M 125 -670 h 4~#8D2323^^0~138~-667~0~3~start~~~#8D2323^^1~129~-671~0~3~end~~~#8D2323^^1~132~-670^^0~M 135 -667 L 138 -670 L 135 -673#@$P~show~0~5~125~-660~180~gge7954~0^^125~-660^^M 125 -660 h 4~#8D2323^^0~138~-657~0~5~start~~~#8D2323^^1~129~-661~0~5~end~~~#8D2323^^1~132~-660^^0~M 135 -657 L 138 -660 L 135 -663#@$P~show~0~2~155~-680~0~gge7961~0^^155~-680^^M 155 -680 h -4~#8D2323^^0~142~-677~0~2~end~~~#8D2323^^1~151~-681~0~2~start~~~#8D2323^^1~148~-680^^0~M 145 -683 L 142 -680 L 145 -677#@$P~show~0~4~155~-670~0~gge7968~0^^155~-670^^M 155 -670 h -4~#8D2323^^0~142~-667~0~4~end~~~#8D2323^^1~151~-671~0~4~start~~~#8D2323^^1~148~-670^^0~M 145 -673 L 142 -670 L 145 -667#@$P~show~0~6~155~-660~0~gge7975~0^^155~-660^^M 155 -660 h -4~#8D2323^^0~142~-657~0~6~end~~~#8D2323^^1~151~-661~0~6~start~~~#8D2323^^1~148~-660^^0~M 145 -663 L 142 -660 L 145 -657","LIB~930~-355~package`M2X3`Contributor`DangerousPrototype`spicePre`J`spiceSymbolName`CON_HEADER_2X03`BOM_Manufacturer Part``~~0~gge7677077cf56e81b8~1a95e0cd8cf04abab1f0a955e387d9de~4cf556fe97124ad8934102a1b113e234~0~~yes~yes#@$T~N~909.28125~-377.0078125~0~#000080~Arial~~~~~comment~RIGHT IO~1~start~gge7984~0~#@$T~P~925.078125~-387~0~#000080~Arial~~~~~comment~J2~1~start~gge7986~0~#@$PL~910 -375 950 -375~#8D2323~2~0~none~gge7988~0#@$PL~950 -375 950 -335~#8D2323~2~0~none~gge7989~0#@$PL~950 -335 910 -335~#8D2323~2~0~none~gge7990~0#@$PL~910 -335 910 -375~#8D2323~2~0~none~gge7991~0#@$P~show~0~1~915~-365~180~gge7992~0^^915~-365^^M 915 -365 h 4~#8D2323^^0~928~-362~0~1~start~~~#8D2323^^1~919~-366~0~1~end~~~#8D2323^^1~922~-365^^0~M 925 -362 L 928 -365 L 925 -368#@$P~show~0~3~915~-355~180~gge7999~0^^915~-355^^M 915 -355 h 4~#8D2323^^0~928~-352~0~3~start~~~#8D2323^^1~919~-356~0~3~end~~~#8D2323^^1~922~-355^^0~M 925 -352 L 928 -355 L 925 -358#@$P~show~0~5~915~-345~180~gge8006~0^^915~-345^^M 915 -345 h 4~#8D2323^^0~928~-342~0~5~start~~~#8D2323^^1~919~-346~0~5~end~~~#8D2323^^1~922~-345^^0~M 925 -342 L 928 -345 L 925 -348#@$P~show~0~2~945~-365~0~gge8013~0^^945~-365^^M 945 -365 h -4~#8D2323^^0~932~-362~0~2~end~~~#8D2323^^1~941~-366~0~2~start~~~#8D2323^^1~938~-365^^0~M 935 -368 L 932 -365 L 935 -362#@$P~show~0~4~945~-355~0~gge8020~0^^945~-355^^M 945 -355 h -4~#8D2323^^0~932~-352~0~4~end~~~#8D2323^^1~941~-356~0~4~start~~~#8D2323^^1~938~-355^^0~M 935 -358 L 932 -355 L 935 -352#@$P~show~0~6~945~-345~0~gge8027~0^^945~-345^^M 945 -345 h -4~#8D2323^^0~932~-342~0~6~end~~~#8D2323^^1~941~-346~0~6~start~~~#8D2323^^1~938~-345^^0~M 935 -348 L 932 -345 L 935 -342","LIB~295~-430~package`MOLEX_PICOBLADE_8P`description``Contributor`DesertBit`sourceId`JjBuMGYgy`timeStamp`1472635423`spicePre`J`spiceSymbolName`MOLEX_PICOBLADE_8P`BOM_Manufacturer Part``~180~0~gge19aefbed2d4ff121~fc117d7fb2fa4d559044936821f94db6~abe5a9481474486593dfb32d8d0fb351~0~~yes~yes#@$T~N~284.5390625~-491.75~0~#000080~Arial~~~~~comment~Display~1~start~gge8639~0~#@$T~P~295.078125~-501.75~0~#000080~Arial~~~~~comment~J3~1~start~gge8641~0~#@$PL~315 -400 315 -490~#8D2323~1~0~none~gge8643~0#@$PL~315 -490 285 -490~#8D2323~1~0~none~gge8644~0#@$PL~285 -490 285 -400~#8D2323~1~0~none~gge8645~0#@$PL~285 -400 315 -400~#8D2323~1~0~none~gge8646~0#@$P~show~0~1~335~-410~0~gge8647~0^^335~-410^^M 335 -410 h -20~#8D2323^^1~312~-407~0~1~end~~~#8D2323^^1~321~-411~0~1~start~~~#8D2323^^0~318~-410^^0~M 315 -413 L 312 -410 L 315 -407#@$P~show~0~2~335~-420~0~gge8654~0^^335~-420^^M 335 -420 h -20~#8D2323^^1~312~-417~0~2~end~~~#8D2323^^1~321~-421~0~2~start~~~#8D2323^^0~318~-420^^0~M 315 -423 L 312 -420 L 315 -417#@$P~show~0~3~335~-430~0~gge8661~0^^335~-430^^M 335 -430 h -20~#8D2323^^1~312~-427~0~3~end~~~#8D2323^^1~321~-431~0~3~start~~~#8D2323^^0~318~-430^^0~M 315 -433 L 312 -430 L 315 -427#@$P~show~0~4~335~-440~0~gge8668~0^^335~-440^^M 335 -440 h -20~#8D2323^^1~312~-437~0~4~end~~~#8D2323^^1~321~-441~0~4~start~~~#8D2323^^0~318~-440^^0~M 315 -443 L 312 -440 L 315 -437#@$P~show~0~1~335~-450~0~gge8675~0^^335~-450^^M 335 -450 h -20~#8D2323^^1~312~-447~0~5~end~~~#8D2323^^1~321~-451~0~5~start~~~#8D2323^^0~318~-450^^0~M 315 -453 L 312 -450 L 315 -447#@$P~show~0~2~335~-460~0~gge8682~0^^335~-460^^M 335 -460 h -20~#8D2323^^1~312~-457~0~6~end~~~#8D2323^^1~321~-461~0~6~start~~~#8D2323^^0~318~-460^^0~M 315 -463 L 312 -460 L 315 -457#@$P~show~0~3~335~-470~0~gge8689~0^^335~-470^^M 335 -470 h -20~#8D2323^^1~312~-467~0~7~end~~~#8D2323^^1~321~-471~0~7~start~~~#8D2323^^0~318~-470^^0~M 315 -473 L 312 -470 L 315 -467#@$P~show~0~4~335~-480~0~gge8696~0^^335~-480^^M 335 -480 h -20~#8D2323^^1~312~-477~0~8~end~~~#8D2323^^1~321~-481~0~8~start~~~#8D2323^^0~318~-480^^0~M 315 -483 L 312 -480 L 315 -477","W~335 -420 360 -420 360 -480~#008800~1~0~none~gge8769~0","T~L~340~-415~0~#0000FF~~4pt~~~~comment~GND~1~start~gge8774~0~pinpart","W~335 -480 360 -480~#008800~1~0~none~gge8776~0","LIB~790~-620~package`IMU9250`BOM_Manufacturer``BOM_Manufacturer Part``BOM_Supplier Part``BOM_Supplier``link``Contributor`Phongnhp`spicePre`U`spiceSymbolName`IMU_9250`~~0~ggeac577a762ea3fc25~bc174898c43b41b89ffbf34ee09b95a5~38386194dc0a477c83fbd24273123f35~0~~yes~yes#@$T~N~743.484375~-692~0~#000080~Arial~~~~~comment~IMU_9250~1~start~gge10051~0~#@$T~P~758.0390625~-702.5~0~#000080~Arial~~~~~comment~U2~1~start~gge10053~0~#@$P~show~0~1~700~-680~180~gge10055~0^^700~-680^^M 700 -680 h 20~#880000^^1~722~-677~0~VCC~start~~~#0000FF^^1~715~-681~0~1~end~~~#0000FF^^0~717~-680^^0~M 720 -677 L 723 -680 L 720 -683#@$P~show~0~2~700~-660~180~gge10062~0^^700~-660^^M 700 -660 h 20~#880000^^1~722~-657~0~GND~start~~~#0000FF^^1~715~-661~0~2~end~~~#0000FF^^0~717~-660^^0~M 720 -657 L 723 -660 L 720 -663#@$P~show~0~3~700~-640~180~gge10069~0^^700~-640^^M 700 -640 h 20~#880000^^1~722~-637~0~SCL~start~~~#0000FF^^1~715~-641~0~3~end~~~#0000FF^^0~717~-640^^0~M 720 -637 L 723 -640 L 720 -643#@$P~show~0~4~700~-620~180~gge10076~0^^700~-620^^M 700 -620 h 20~#880000^^1~722~-617~0~SDA~start~~~#0000FF^^1~715~-621~0~4~end~~~#0000FF^^0~717~-620^^0~M 720 -617 L 723 -620 L 720 -623#@$P~show~0~5~700~-600~180~gge10083~0^^700~-600^^M 700 -600 h 20~#880000^^1~722~-597~0~ECL~start~~~#0000FF^^1~715~-601~0~5~end~~~#0000FF^^0~717~-600^^0~M 720 -597 L 723 -600 L 720 -603#@$P~show~0~6~700~-580~180~gge10090~0^^700~-580^^M 700 -580 h 20~#880000^^1~722~-577~0~EDA~start~~~#0000FF^^1~715~-581~0~6~end~~~#0000FF^^0~717~-580^^0~M 720 -577 L 723 -580 L 720 -583#@$P~show~0~7~700~-560~180~gge10097~0^^700~-560^^M 700 -560 h 20~#880000^^1~722~-557~0~AD0~start~~~#0000FF^^1~715~-561~0~7~end~~~#0000FF^^0~717~-560^^0~M 720 -557 L 723 -560 L 720 -563#@$P~show~0~8~700~-540~180~gge10104~0^^700~-540^^M 700 -540 h 20~#880000^^1~722~-537~0~INT~start~~~#0000FF^^1~715~-541~0~8~end~~~#0000FF^^0~717~-540^^0~M 720 -537 L 723 -540 L 720 -543#@$P~show~0~9~700~-520~180~gge10111~0^^700~-520^^M 700 -520 h 20~#880000^^1~722~-517~0~NCS~start~~~#0000FF^^1~715~-521~0~9~end~~~#0000FF^^0~717~-520^^0~M 720 -517 L 723 -520 L 720 -523#@$P~show~0~10~700~-500~180~gge10118~0^^700~-500^^M 700 -500 h 20~#880000^^1~722~-497~0~FSYNC~start~~~#0000FF^^1~715~-501~0~10~end~~~#0000FF^^0~717~-500^^0~M 720 -497 L 723 -500 L 720 -503#@$R~720~-690~~~110~200~#000000~1~0~none~gge10125~0~#@$T~L~745.52~-584.75~0~#0000FF~~10pt~bold~normal~~comment~IMU_9250~1~start~gge10126~0~pinpart","O~700~-600~gge10209~M 696 -604 L 704 -596 M 704 -604 L 696 -596~#33cc33~0","O~700~-580~gge10211~M 696 -584 L 704 -576 M 704 -584 L 696 -576~#33cc33~0","O~700~-560~gge10213~M 696 -564 L 704 -556 M 704 -564 L 696 -556~#33cc33~0","O~700~-540~gge10215~M 696 -544 L 704 -536 M 704 -544 L 696 -536~#33cc33~0","O~700~-520~gge10217~M 696 -524 L 704 -516 M 704 -524 L 696 -516~#33cc33~0","O~700~-500~gge10219~M 696 -504 L 704 -496 M 704 -504 L 696 -496~#33cc33~0","LIB~135~-475~package`M1X2_AWG20`Contributor`Nemo Capitano`spicePre`J`spiceSymbolName`CON_HEADER_1X02-PTH`BOM_Manufacturer Part``~~0~gge47ec3a850f2d689e~519ab30562c645fc9071b35164bd0656~d3e19c3068574fa0b89c92528028b98d~0~~yes~yes#@$T~N~118.8671875~-491.75~0~#000080~Arial~~~~~comment~MAIN BAT~1~start~gge10236~0~#@$T~P~130.92~-501~0~#000080~Arial~~~~~comment~J4~1~start~gge10238~0~#@$PL~125.84 -489 145.84 -489~#A54B4B~1.6~0~none~gge10240~0#@$PL~145.84 -489 145.84 -459~#A54B4B~1.6~0~none~gge10241~0#@$PL~145.84 -459 125.84 -459~#A54B4B~1.6~0~none~gge10242~0#@$PL~125.84 -459 125.84 -489~#A54B4B~1.6~0~none~gge10243~0#@$P~show~3~1~131~-479~180~gge10244~0^^131~-479^^M 131 -479 h 3.842~#A54B4B^^0~150.53~-476.047~0~1~start~~4.5pt~#A54B4B^^1~134.78~-480.97~0~1~end~~4.5pt~#A54B4B^^1~137~-479^^0~M 140 -476 L 143 -479 L 140 -482#@$P~show~3~2~131~-469~180~gge10251~0^^131~-469^^M 131 -469 h 3.842~#A54B4B^^0~150.53~-466.047~0~2~start~~4.5pt~#A54B4B^^1~134.78~-470.97~0~2~end~~4.5pt~#A54B4B^^1~137~-469^^0~M 140 -466 L 143 -469 L 140 -472","W~131 -479 185 -479 185 -540 270 -540~#008800~1~0~none~gge10284~0","W~131 -469 240 -469~#008800~1~0~none~gge10285~0","T~L~340~-475~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10291~0~pinpart","T~L~150~-460~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10294~0~pinpart","T~L~255~-555~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10297~0~pinpart","T~L~150~-485~0~#0000FF~~4pt~~~~comment~BAT +~1~start~gge10300~0~pinpart","T~L~255~-530~0~#0000FF~~4pt~~~~comment~BAT +~1~start~gge10303~0~pinpart","W~155 -680 280 -680~#008800~1~0~none~gge10313~0","W~125 -680 125 -730 225 -730~#008800~1~0~none~gge10315~0","T~L~110~-695~0~#0000FF~~4pt~~~~comment~VCC~1~start~gge10318~0~pinpart","T~L~165~-685~0~#0000FF~~4pt~~~~comment~PSENSOR~1~start~gge10321~0~pinpart","W~155 -660 270 -660 270 -715 360 -715~#008800~1~0~none~gge10323~0","T~L~165~-655~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10326~0~pinpart","W~125 -670 110 -670 110 -770 910 -770 910 -455 820 -455~#008800~1~0~none~gge10328~0","W~155 -670 235 -670 235 -780 920 -780 915 -435 820 -435~#008800~1~0~none~gge10336~0","W~125 -660 100 -660 100 -790 930 -790 930 -445 820 -445~#008800~1~0~none~gge10337~0","W~945 -345 970 -345 970 -485 665 -485~#008800~1~0~none~gge10338~0","W~820 -295 870 -295 870 -355 915 -355~#008800~1~0~none~gge10341~0","W~820 -395 880 -395 880 -325 960 -325 960 -355 945 -355~#008800~1~0~none~gge10343~0","W~820 -305 895 -305 895 -345 915 -345~#008800~1~0~none~gge10344~0","W~915 -365 895 -365 895 -475 655 -475~#008800~1~0~none~gge10345~0","LIB~288~-544~package`S2B-PH-SM4-TB`Contributor`andyfilms`spicePre`X`spiceSymbolName`S2B-PH-SM4-TB`BOM_Manufacturer Part``~180~0~gge12fa8dc00f010d07~ffe5780e60fc43f3861153d7ff9fe849~1c47b77e6d1948b89e39b944cd2029a5~0~~yes~yes#@$T~N~284.28125~-565.84375~0~#000080~Arial~~~~~comment~BAT~1~start~gge10431~0~#@$T~P~287.44~-575.85~0~#000080~Arial~~~~~comment~X1~1~start~gge10433~0~#@$PL~284.68 -560 304.68 -560~#EBEB37~1.6~0~none~gge10435~0#@$PL~294.68 -540 289.68 -540~#EBEB37~2.4~0~none~gge10436~0#@$PL~294.68 -550 289.68 -550~#EBEB37~2.4~0~none~gge10437~0#@$PL~304.68 -530 304.68 -560~#EBEB37~1.6~0~none~gge10438~0#@$PL~284.68 -560 284.68 -530~#EBEB37~1.6~0~none~gge10439~0#@$PL~304.68 -530 284.68 -530~#EBEB37~1.6~0~none~gge10440~0#@$P~show~3~1~270~-550~180~gge10441~0^^270~-550^^M 270 -550 h 19.685~#EBEB37^^0~299.21~-547.047~0~1~start~~4.5pt~#EBEB37^^1~277.56~-551.969~0~1~end~~4.5pt~#EBEB37^^0~286~-550^^0~M 289 -547 L 292 -550 L 289 -553#@$P~show~3~2~270~-540~180~gge10448~0^^270~-540^^M 270 -540 h 19.685~#EBEB37^^0~299.21~-537.047~0~2~start~~4.5pt~#EBEB37^^1~277.56~-541.969~0~2~end~~4.5pt~#EBEB37^^0~286~-540^^0~M 289 -537 L 292 -540 L 289 -543","N~185~-535~0~#0000ff~BAT~gge10482~start~187~-537.5~Times New Roman~7pt~0","O~475~-580~gge10488~M 471 -584 L 479 -576 M 479 -584 L 471 -576~#33cc33~0","O~475~-600~gge10490~M 471 -604 L 479 -596 M 479 -604 L 471 -596~#33cc33~0","O~475~-620~gge10492~M 471 -624 L 479 -616 M 479 -624 L 471 -616~#33cc33~0","O~515~-660~gge10498~M 511 -664 L 519 -656 M 519 -664 L 511 -656~#33cc33~0","O~515~-620~gge10500~M 511 -624 L 519 -616 M 519 -624 L 511 -616~#33cc33~0","W~540 -230 825 -230 825 -405 820 -405~#008800~1~0~none~gge10506~0","W~680 -375 655 -375 655 -445~#008800~1~0~none~gge10509~0","W~270 -550 240 -550 240 -510~#008800~1~0~none~gge10513~0","LIB~1005~-305~package`TO-92-3_L4.9-W3.7-P1.27-L`BOM_Supplier`LCSC`BOM_Manufacturer`SEMTECH`BOM_Manufacturer Part`2N2222`Contributor`LCSC`BOM_Supplier Part`C118536`BOM_LCSC Assembly`Yes`SMT Type`Extend`BOM_Assembly Type`manualWeld`BOM_Paste Type`expand`spicePre`Q`spiceSymbolName`2N2222`~~0~ggecd2b6c912041b411~6924b36489de4921bb29ca14bf27c33f~0b833263bcfb409d8a029dcd9c6a3b59~0~~yes~yes#@$T~N~1019~-292.8125~0~#000080~Arial~~~~~comment~2N2222~1~start~gge10516~0~#@$T~P~1019~-301.6484375~0~#000080~Arial~~~~~comment~Q1~1~start~gge10518~0~#@$P~show~0~3~1015~-325~90~gge10520~0^^1015~-325^^M 1015 -325 v 10~#880000^^0~1018~-313~270~C~end~~~#0000FF^^0~1014~-315~270~3~start~~~#0000FF^^0~1015~-318^^0~M 1012 -315 L 1015 -312 L 1018 -315#@$P~show~0~2~995~-305~180~gge10527~0^^995~-305^^M 995 -305 h 10~#880000^^0~1007~-302~0~B~start~~~#0000FF^^0~1005~-306~0~2~end~~~#0000FF^^0~1002~-305^^0~M 1005 -302 L 1008 -305 L 1005 -308#@$P~show~0~1~1015~-285~270~gge10534~0^^1015~-285^^M 1015 -285 v -10~#880000^^0~1018~-297~270~E~start~~~#0000FF^^0~1014~-295~270~1~end~~~#0000FF^^0~1015~-292^^0~M 1018 -295 L 1015 -298 L 1012 -295#@$PL~1015 -315 1005 -308~#880000~1~0~none~gge10541~0#@$PL~1005 -302 1015 -295~#880000~1~0~none~gge10542~0#@$PL~1005 -314 1005 -296~#880000~1~0~none~gge10543~0#@$PG~1015 -295 1012 -300 1009 -296~#880000~1~0~none~gge10544~0","LIB~1015~-365~package`DO-41_BD2.4-L4.7-P8.70-D0.9-RD`BOM_Supplier`LCSC`BOM_Manufacturer`LRC`BOM_Manufacturer Part`1N4001`BOM_Supplier Part`C82804`spicePre`D`spiceSymbolName`1N4001`~270~0~gge8f24df2e0c50e8b0~c2803222ad4b48fb94db0de548a6280a~6a469063902c4d47b9003ece9d1d25f0~0~~yes~yes#@$T~N~1024~-352.75~0~#000080~Arial~~~~~comment~1N4001~1~start~gge10576~0~#@$T~P~1024~-361.75~0~#000080~Arial~~~~~comment~D1~1~start~gge10578~0~#@$P~show~0~2~1015~-345~270~gge10580~0^^1015~-345^^M 1015 -345 v -15~#880000^^0~1018~-363~270~A~start~~~#0000FF^^0~1014~-354~270~2~end~~~#0000FF^^0~1015~-357^^0~M 1018 -360 L 1015 -363 L 1012 -360#@$P~show~0~1~1015~-385~90~gge10587~0^^1015~-385^^M 1015 -385 v 15~#880000^^0~1018~-367~270~K~end~~~#0000FF^^0~1014~-376~270~1~start~~~#0000FF^^0~1015~-373^^0~M 1012 -370 L 1015 -367 L 1018 -370#@$PT~M 1021 -360 L 1015 -370 L 1008 -360 Z ~#880000~1~0~#880000~gge10594~0~#@$PL~1022 -370 1008 -370~#880000~1~0~none~gge10595~0","LIB~1065~-365~package`CAP-TH_L5.0-W5.0-P5.08-D1.0`BOM_Supplier`LCSC`BOM_Supplier Part`C444738`BOM_Manufacturer`AVX`BOM_Manufacturer Part`SR211C104KAR`nameAlias`Capacitance`Contributor`LCSC`BOM_LCSC Assembly`Yes`SMT Type`Extend`BOM_Assembly Type`manualWeld`BOM_Paste Type`expand`spicePre`C`spiceSymbolName`SR211C104KAR`~~0~gge1986c0819620a5c0~4d5b8e8e8f89428f98436df910b3190e~e9b172bbe58746a0bfc16211d1d8f989~0~~yes~yes#@$T~N~1075~-352.75~0~#000080~Arial~~~~~comment~100nF~1~start~gge10840~0~#@$T~P~1075~-361.75~0~#000080~Arial~~~~~comment~C1~1~start~gge10842~0~#@$PL~1065 -363 1065 -360~#880000~1~0~none~gge10844~0#@$PL~1065 -370 1065 -367~#880000~1~0~none~gge10845~0#@$P~show~1~2~1065~-350~270~gge10846~0^^1065~-350^^M 1065 -350 v -10~#000000^^0~1068~-365~270~2~start~~~#000000^^0~1064~-355~270~2~end~~~#000000^^0~1065~-357^^0~M 1068 -360 L 1065 -363 L 1062 -360#@$P~show~1~1~1065~-380~90~gge10853~0^^1065~-380^^M 1065 -380 v 10~#000000^^0~1068~-365~270~1~end~~~#000000^^0~1064~-375~270~1~start~~~#000000^^0~1065~-373^^0~M 1062 -370 L 1065 -367 L 1068 -370#@$PL~1073 -363 1057 -363~#880000~1~0~none~gge10860~0#@$PL~1073 -367 1057 -367~#880000~1~0~none~gge10861~0","W~1015 -385 1015 -405 895 -405~#008800~1~0~none~gge10886~0","W~1065 -380 1065 -405 1015 -405~#008800~1~0~none~gge10888~0","W~1015 -325 1015 -345 1065 -345 1065 -350~#008800~1~0~none~gge10890~0","W~945 -365 990 -365 990 -345 1015 -345~#008800~1~0~none~gge10894~0","W~1015 -285 1105 -285 1105 -445 970 -445~#008800~1~0~none~gge10895~0","W~820 -385 855 -385 855 -285 900 -285~#008800~1~0~none~gge11035~0","W~940 -285 995 -285 995 -305~#008800~1~0~none~gge11036~0","O~475~-460~gge11038~M 471 -464 L 479 -456 M 479 -464 L 471 -456~#33cc33~0","O~515~-460~gge11040~M 511 -464 L 519 -456 M 519 -464 L 511 -456~#33cc33~0","O~515~-480~gge11042~M 511 -484 L 519 -476 M 519 -484 L 511 -476~#33cc33~0","O~515~-680~gge11044~M 511 -684 L 519 -676 M 519 -684 L 511 -676~#33cc33~0","O~515~-700~gge11046~M 511 -704 L 519 -696 M 519 -704 L 511 -696~#33cc33~0","O~475~-660~gge11048~M 471 -664 L 479 -656 M 479 -664 L 471 -656~#33cc33~0","O~475~-680~gge11050~M 471 -684 L 479 -676 M 479 -684 L 471 -676~#33cc33~0","O~680~-355~gge11052~M 676 -359 L 684 -351 M 684 -359 L 676 -351~#33cc33~0","O~680~-345~gge11054~M 676 -349 L 684 -341 M 684 -349 L 676 -341~#33cc33~0","O~680~-305~gge11056~M 676 -309 L 684 -301 M 684 -309 L 676 -301~#33cc33~0","O~680~-295~gge11058~M 676 -299 L 684 -291 M 684 -299 L 676 -291~#33cc33~0","O~820~-425~gge11060~M 816 -429 L 824 -421 M 824 -429 L 816 -421~#33cc33~0","O~820~-365~gge11062~M 816 -369 L 824 -361 M 824 -369 L 816 -361~#33cc33~0","O~820~-355~gge11064~M 816 -359 L 824 -351 M 824 -359 L 816 -351~#33cc33~0","O~820~-345~gge11066~M 816 -349 L 824 -341 M 824 -349 L 816 -341~#33cc33~0","O~820~-335~gge11068~M 816 -339 L 824 -331 M 824 -339 L 816 -331~#33cc33~0","O~820~-325~gge11070~M 816 -329 L 824 -321 M 824 -329 L 816 -321~#33cc33~0","O~820~-315~gge11072~M 816 -319 L 824 -311 M 824 -319 L 816 -311~#33cc33~0","O~280~-300~gge11074~M 276 -304 L 284 -296 M 284 -304 L 276 -296~#33cc33~0","O~280~-290~gge11076~M 276 -294 L 284 -286 M 284 -294 L 276 -286~#33cc33~0","O~370~-110~gge11078~M 366 -114 L 374 -106 M 374 -114 L 366 -106~#33cc33~0","O~380~-110~gge11080~M 376 -114 L 384 -106 M 384 -114 L 376 -106~#33cc33~0","O~390~-110~gge11082~M 386 -114 L 394 -106 M 394 -114 L 386 -106~#33cc33~0","O~400~-110~gge11084~M 396 -114 L 404 -106 M 404 -114 L 396 -106~#33cc33~0","O~410~-110~gge11086~M 406 -114 L 414 -106 M 414 -114 L 406 -106~#33cc33~0","O~420~-110~gge11088~M 416 -114 L 424 -106 M 424 -114 L 416 -106~#33cc33~0","O~430~-110~gge11090~M 426 -114 L 434 -106 M 434 -114 L 426 -106~#33cc33~0","O~280~-270~gge11092~M 276 -274 L 284 -266 M 284 -274 L 276 -266~#33cc33~0","LIB~920~-285~package`RES-TH_BD1.8-L3.2-P7.20-D0.4`BOM_Supplier`LCSC`BOM_Supplier Part`C714232`BOM_Manufacturer`Huaxing Mechanical-Elec.`BOM_Manufacturer Part`CF1/6W-10KΊ¹5%T52`nameAlias`Resistance (Ohms)`Contributor`LCSC`spicePre`R`spiceSymbolName`CF1/6W-10KΊ¹5%T52`~~0~gge43ecfe7f34e78f71~97467e7cb6374f7e9dd7fc644a47cfb1~2ba8a26395ab41a2a00f577110f8f3f7~0~~yes~yes#@$T~N~914.03125~-293~0~#000080~Arial~~~~~comment~1kΊ~1~start~gge11101~0~#@$T~P~914.0390625~-302.125~0~#000080~Arial~~~~~comment~R1~1~start~gge11103~0~#@$R~910~-290~~~20~10~#A00000~1~0~none~gge11105~0~#@$P~show~0~2~940~-285~0~gge11106~0^^940~-285^^M 930 -285 h 10~#800^^0~926~-285~0~2~end~~~#800^^0~934~-289~0~2~start~~~#800^^0~953~-285^^0~M 950 -288 L 947 -285 L 950 -282#@$P~show~0~1~900~-285~180~gge11113~0^^900~-285^^M 910 -285 h -10~#800^^0~914~-285~0~1~start~~~#800^^0~906~-289~0~1~end~~~#800^^0~887~-285^^0~M 890 -282 L 893 -285 L 890 -288","LIB~360~-405~package`CAP-TH_BD8.0-P3.50-D1.0-FD`BOM_Supplier`LCSC`BOM_Manufacturer`ValuePro`BOM_Manufacturer Part`470uf16v`nameAlias`Capacitance`BOM_Supplier Part`C28067`spicePre`C`spiceSymbolName`470uf16v`~90~0~ggee35b13287a9793b8~90d1b58a2d284d63b5d026a0c4e38bab~ffcc179b5c0bb89105c20dd941419970~0~~yes~yes#@$T~N~370~-392.65625~0~#000080~Arial~~~~~comment~470uF~1~start~gge11147~0~#@$T~P~370.0078125~-401.7890625~0~#000080~Arial~~~~~comment~C3~1~start~gge11149~0~#@$PL~352 -403 368 -403~#880000~1~0~none~gge11151~0#@$P~show~1~1~360~-390~270~gge11152~0^^360~-390^^M 360 -390 v -10~#000000^^0~363~-405~270~1~start~~~#000000^^0~359~-395~270~1~end~~~#000000^^0~360~-397^^0~M 363 -400 L 360 -403 L 357 -400#@$P~show~1~2~360~-420~90~gge11159~0^^360~-420^^M 360 -420 v 10~#000000^^0~363~-405~270~2~end~~~#000000^^0~359~-415~270~2~start~~~#000000^^0~360~-413^^0~M 357 -410 L 360 -407 L 363 -410#@$PL~360 -400 360 -403~#880000~1~0~none~gge11166~0#@$PL~360 -407 360 -410~#880000~1~0~none~gge11167~0#@$A~M 352.33 -410.22 A 10 9 0 0 0 367.19 -409.75~~#880000~1~0~none~gge11168~0#@$PL~357 -395 357 -399~#880000~1~0~none~gge11169~0#@$PL~355 -397 359 -397~#880000~1~0~none~gge11170~0","J~665~-560~2.5~#CC0000~gge3623~0","J~645~-540~2.5~#CC0000~gge3632~0","J~665~-660~2.5~#CC0000~gge3656~0","J~665~-435~2.5~#CC0000~gge3669~0","J~655~-455~2.5~#CC0000~gge3673~0","J~635~-520~2.5~#CC0000~gge3677~0","J~665~-600~2.5~#CC0000~gge5804~0","J~665~-695~2.5~#CC0000~gge5806~0","J~625~-680~2.5~#CC0000~gge5808~0","J~360~-640~2.5~#CC0000~gge7127~0","J~360~-610~2.5~#CC0000~gge7179~0","J~360~-510~2.5~#CC0000~gge7181~0","J~665~-425~2.5~#CC0000~gge7192~0","J~665~-405~2.5~#CC0000~gge7194~0","J~665~-395~2.5~#CC0000~gge7196~0","J~225~-260~2.5~#CC0000~gge7560~0","J~225~-250~2.5~#CC0000~gge7562~0","J~240~-230~2.5~#CC0000~gge7566~0","J~440~-80~2.5~#CC0000~gge7568~0","J~575~-290~2.5~#CC0000~gge7570~0","J~575~-270~2.5~#CC0000~gge7572~0","J~385~-450~2.5~#CC0000~gge7574~0","J~395~-440~2.5~#CC0000~gge7576~0","J~405~-430~2.5~#CC0000~gge7578~0","J~360~-480~2.5~#CC0000~gge8770~0","J~655~-680~2.5~#CC0000~gge10208~0","J~280~-680~2.5~#CC0000~gge10314~0","J~225~-730~2.5~#CC0000~gge10316~0","J~360~-715~2.5~#CC0000~gge10324~0","J~665~-485~2.5~#CC0000~gge10339~0","J~655~-475~2.5~#CC0000~gge10346~0","J~240~-469~2.5~#CC0000~gge10286~0","J~625~-280~2.5~#CC0000~gge10505~0","J~655~-445~2.5~#CC0000~gge10510~0","J~240~-510~2.5~#CC0000~gge10514~0","J~895~-405~2.5~#CC0000~gge10887~0","J~1015~-405~2.5~#CC0000~gge10889~0","J~1015~-345~2.5~#CC0000~gge10893~0","J~970~-445~2.5~#CC0000~gge10896~0","J~360~-390~2.5~#CC0000~gge11197~0","J~360~-420~2.5~#CC0000~gge11198~0"],"BBox":{"x":0,"y":-806.7,"width":1149,"height":807.1},"colors":{}}}],"BOM":[["Value","Quantity","Package","Components","CustomPara"],["2N2222",1,"TO-92-3_L4.9-W3.7-P1.27-L","Q1",{"BOM_Supplier":"LCSC","BOM_Manufacturer":"SEMTECH","BOM_Manufacturer Part":"2N2222","BOM_Supplier Part":"C118536","BOM_LCSC Assembly":"Yes","BOM_Assembly Type":"manualWeld","BOM_Paste Type":"expand","puuid":"6924b36489de4921bb29ca14bf27c33f","uuid":"0b833263bcfb409d8a029dcd9c6a3b59"}],["MCP23017",1,"MCP23017","U3",{"BOM_Manufacturer":"","BOM_Manufacturer Part":"MCP23017","BOM_Supplier Part":"","BOM_Supplier":"","puuid":"f09420c4fd9946a583a6b15c1c5a483e","uuid":"0f118b0d9063400da84e04b55532a171"}],["BAT",1,"S2B-PH-SM4-TB","X1",{"BOM_Manufacturer Part":"","puuid":"ffe5780e60fc43f3861153d7ff9fe849","uuid":"1c47b77e6d1948b89e39b944cd2029a5"}],["10kΊ",2,"RES-TH_BD1.8-L3.2-P7.20-D0.4","R3,R2",{"BOM_Supplier":"LCSC","BOM_Supplier Part":"C714232","BOM_Manufacturer":"Huaxing Mechanical-Elec.","BOM_Manufacturer Part":"CF1/6W-10KΊ¹5%T52","puuid":"97467e7cb6374f7e9dd7fc644a47cfb1","uuid":"2ba8a26395ab41a2a00f577110f8f3f7"}],["1kΊ",1,"RES-TH_BD1.8-L3.2-P7.20-D0.4","R1",{"BOM_Supplier":"LCSC","BOM_Supplier Part":"C714232","BOM_Manufacturer":"Huaxing Mechanical-Elec.","BOM_Manufacturer Part":"CF1/6W-10KΊ¹5%T52","puuid":"97467e7cb6374f7e9dd7fc644a47cfb1","uuid":"2ba8a26395ab41a2a00f577110f8f3f7"}],["LEFT IO",1,"M2X3","J1",{"BOM_Manufacturer Part":"","puuid":"1a95e0cd8cf04abab1f0a955e387d9de","uuid":"4cf556fe97124ad8934102a1b113e234"}],["RIGHT IO",1,"M2X3","J2",{"BOM_Manufacturer Part":"","puuid":"1a95e0cd8cf04abab1f0a955e387d9de","uuid":"4cf556fe97124ad8934102a1b113e234"}],["1N4001",1,"DO-41_BD2.4-L4.7-P8.70-D0.9-RD","D1",{"BOM_Supplier":"LCSC","BOM_Manufacturer":"LRC","BOM_Manufacturer Part":"1N4001","BOM_Supplier Part":"C82804","puuid":"c2803222ad4b48fb94db0de548a6280a","uuid":"6a469063902c4d47b9003ece9d1d25f0"}],["DWM1000",1,"WIRELM-TH_DWM1000","U5",{"BOM_Supplier":"LCSC","BOM_Manufacturer":"DecaWave","BOM_Manufacturer Part":"DWM1000","BOM_Supplier Part":"C95238","puuid":"921ff2190df246a4b1016c11071a51a1","uuid":"605f956fd8c24817bb840fda3296ca74"}],["MAIN BOARD",1,"TTGO-T-BEAM-ESP32-CONNECTOR","U1",{"BOM_Manufacturer":"","BOM_Manufacturer Part":"","BOM_Supplier Part":"","BOM_Supplier":"","puuid":"5180c2e0c1da4a75b575a8495aee30f2","uuid":"5657e928f1504b21b9e68062d66ba3e3"}],["IMU_9250",1,"IMU9250","U2",{"BOM_Manufacturer":"","BOM_Manufacturer Part":"","BOM_Supplier Part":"","BOM_Supplier":"","puuid":"bc174898c43b41b89ffbf34ee09b95a5","uuid":"38386194dc0a477c83fbd24273123f35"}],["Display",1,"MOLEX_PICOBLADE_8P","J3",{"BOM_Manufacturer Part":"","puuid":"fc117d7fb2fa4d559044936821f94db6","uuid":"abe5a9481474486593dfb32d8d0fb351"}],["MAIN BAT",1,"M1X2_AWG20","J4",{"BOM_Manufacturer Part":"","puuid":"519ab30562c645fc9071b35164bd0656","uuid":"d3e19c3068574fa0b89c92528028b98d"}],["100nF",1,"CAP-TH_L5.0-W5.0-P5.08-D1.0","C1",{"BOM_Supplier":"LCSC","BOM_Supplier Part":"C444738","BOM_Manufacturer":"AVX","BOM_Manufacturer Part":"SR211C104KAR","BOM_LCSC Assembly":"Yes","BOM_Assembly Type":"manualWeld","BOM_Paste Type":"expand","puuid":"4d5b8e8e8f89428f98436df910b3190e","uuid":"e9b172bbe58746a0bfc16211d1d8f989"}],["470uF",1,"CAP-TH_BD8.0-P3.50-D1.0-FD","C3",{"BOM_Supplier":"LCSC","BOM_Manufacturer":"ValuePro","BOM_Manufacturer Part":"470uf16v","BOM_Supplier Part":"C28067","puuid":"90d1b58a2d284d63b5d026a0c4e38bab","uuid":"ffcc179b5c0bb89105c20dd941419970"}]],"components":{"5657e928f1504b21b9e68062d66ba3e3":1,"0f118b0d9063400da84e04b55532a171":1,"2ba8a26395ab41a2a00f577110f8f3f7":3,"605f956fd8c24817bb840fda3296ca74":1,"4cf556fe97124ad8934102a1b113e234":2,"abe5a9481474486593dfb32d8d0fb351":1,"38386194dc0a477c83fbd24273123f35":1,"d3e19c3068574fa0b89c92528028b98d":1,"1c47b77e6d1948b89e39b944cd2029a5":1,"0b833263bcfb409d8a029dcd9c6a3b59":1,"6a469063902c4d47b9003ece9d1d25f0":1,"e9b172bbe58746a0bfc16211d1d8f989":1,"ffcc179b5c0bb89105c20dd941419970":1}} \ No newline at end of file diff --git a/pcb/AirsoftTracker 1.4/AirsoftTracker copy 5.json b/pcb/AirsoftTracker 1.4/AirsoftTracker copy 5.json new file mode 100644 index 0000000..405f9a9 --- /dev/null +++ b/pcb/AirsoftTracker 1.4/AirsoftTracker copy 5.json @@ -0,0 +1 @@ +{"editorVersion":"6.4.7","docType":"5","title":"AirsoftTracker","description":"","colors":{},"schematics":[{"uuid":"98e64a0917e55d184976207b09460285","docType":"1","title":"MainSheet","description":"","dataStr":{"head":{"docType":"1","editorVersion":"6.4.7","newgId":true,"c_para":{"Prefix Start":"1"},"c_spiceCmd":"null","hasIdFlag":true,"uuid":"59e43b64d1eaf50fe48821f12a6a0922","x":"0","y":"0","portOfADImportHack":"","importFlag":0,"transformList":""},"canvas":"CA~1000~1000~#FFFFFF~yes~#CCCCCC~5~1000~1000~line~5~pixel~5~0~0","shape":["LIB~0~-806~package`NONE`BOM_Manufacturer Part`?`spicePre`.`~~0~frame_lib_1~~~0~~yes~yes#@$T~N~570.5~-809~0~#000080~Arial~~~~~comment~A~0~start~gge77~0~#@$PT~M 206 -796 L 206 -806 M 206 -10 L 206 0 M 402 -796 L 402 -806 M 402 -10 L 402 0 M 598 -796 L 598 -806 M 598 -10 L 598 0 M 794 -796 L 794 -806 M 794 -10 L 794 0 M 990 -796 L 990 -806 M 990 -10 L 990 0 M 10 -600 L 0 -600 M 1139 -600 L 1149 -600 M 10 -404 L 0 -404 M 1139 -404 L 1149 -404 M 10 -208 L 0 -208 M 1139 -208 L 1149 -208 M 10 -12 L 0 -12 M 1139 -12 L 1149 -12~#880000~1~0~none~gge6~0~frame_tick#@$T~P~571.5~-818~0~#000080~Arial~~~~~comment~A~0~start~gge76~0~#@$T~L~1.5~-698~0~#880000~~~~~~comment~A~1~start~gge7~0~frame_tick#@$T~L~1140.5~-698~0~#880000~~~~~~comment~A~1~start~gge9~0~frame_tick#@$T~L~1.5~-502~0~#880000~~~~~~comment~B~1~start~gge11~0~frame_tick#@$T~L~1140.5~-502~0~#880000~~~~~~comment~B~1~start~gge13~0~frame_tick#@$T~L~1.5~-306~0~#880000~~~~~~comment~C~1~start~gge15~0~frame_tick#@$T~L~1140.5~-306~0~#880000~~~~~~comment~C~1~start~gge17~0~frame_tick#@$T~L~1.5~-110~0~#880000~~~~~~comment~D~1~start~gge19~0~frame_tick#@$T~L~1140.5~-110~0~#880000~~~~~~comment~D~1~start~gge21~0~frame_tick#@$T~L~108~-797.5~0~#880000~~~~~~comment~1~1~start~gge23~0~frame_tick#@$T~L~108~-1.5~0~#880000~~~~~~comment~1~1~start~gge25~0~frame_tick#@$T~L~304~-797.5~0~#880000~~~~~~comment~2~1~start~gge27~0~frame_tick#@$T~L~304~-1.5~0~#880000~~~~~~comment~2~1~start~gge29~0~frame_tick#@$T~L~500~-797.5~0~#880000~~~~~~comment~3~1~start~gge31~0~frame_tick#@$T~L~500~-1.5~0~#880000~~~~~~comment~3~1~start~gge33~0~frame_tick#@$T~L~696~-797.5~0~#880000~~~~~~comment~4~1~start~gge35~0~frame_tick#@$T~L~696~-1.5~0~#880000~~~~~~comment~4~1~start~gge37~0~frame_tick#@$T~L~892~-797.5~0~#880000~~~~~~comment~5~1~start~gge39~0~frame_tick#@$T~L~892~-1.5~0~#880000~~~~~~comment~5~1~start~gge?~0~frame_tick#@$R~10~-796~~~1129~786~#880000~1~0~none~gge42~0~frame_innerbox#@$R~0~-806~~~1149~806~#880000~1~0~none~gge43~0~frame_outbox#@$R~694.99995~-90~~~444~80~#880000~1~0~none~gge44~0~frame_hitarea#@$PL~695.1 -50.75 1138.63 -50.75~#880000~1~0~none~gge45~0#@$PL~799.63 -30.75 1138.63 -30.75~#880000~1~0~none~gge46~0#@$PL~1059.61 -89.93 1059.63 -50.75~#880000~1~0~none~gge47~0#@$PL~1059.63 -50.75 1059.63 -30.75~#880000~1~0~none~gge48~0#@$T~L~699.99995~-77~0~#880000~~8pt~~~~comment~TITLE:~1~start~gge49~0~pinpart#@$T~L~757.62495~-64.41~0~#0000FF~~10pt~~~~comment~Airsoft Tracker~1~start~gge51~0~frame_title#@$T~L~1064.62495~-63.75~0~#880000~~8pt~~~~comment~REV:~1~start~gge53~0~pinpart#@$T~L~1102.62495~-63.75~0~#0000FF~~9pt~~~~comment~1.0~1~start~gge55~0~frame_version#@$T~L~804.62495~-15~0~#880000~~8pt~~~~comment~Date:~1~start~gge57~0~pinpart#@$T~L~851.62495~-14.52~0~#0000FF~~9pt~~~~comment~2021-01-15~1~start~gge59~0~frame_date#@$T~L~1063.62495~-35~0~#880000~~8pt~~~~comment~Sheet:~1~start~gge61~0~pinpart#@$T~L~1108.62495~-34.52~0~#0000FF~~9pt~~~~comment~1/1~1~start~gge63~0~frame_sheet#@$T~L~943.62495~-14.75~0~#880000~~8pt~~~~comment~Drawn By:~1~start~gge65~0~pinpart#@$T~L~1008.63~-14.75~0~#0000FF~~9pt~~~~comment~ddv2020~1~start~gge67~0~frame_drawn#@$T~L~804.62495~-36.75~0~#880000~~8pt~~~~comment~Company:~1~start~gge69~0~pinpart#@$T~L~871.24995~-36.64~0~#0000FF~~9pt~~~~comment~DDV~1~start~gge71~0~frame_company#@$PL~799.63 -50.75 799.63 -10.75~#880000~1~0~none~gge73~0#@$Pimage~L~1~gge74~0~gge75~694.99995~-38~104~20~data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0i5Zu+5bGCXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNTIwIg0KCSB2aWV3Qm94PSIwIDAgMTY5Mi45IDM0MS41IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxNjkyLjkgMzQxLjU7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiM1NTg4RkY7fQ0KPC9zdHlsZT4NCjxnPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik05MDEuNywxNjEuMWMyLjMtMS44LDUuMS0yLjcsOC4zLTIuN2M0LjMsMCw4LjksMS42LDEzLjgsNC43YzQuOSwzLjEsOS42LDgsMTQuMSwxNC43bDE3LjQtMjcuOQ0KCQljLTUuNC03LjgtMTIuMS0xMy45LTIwLjItMTguMmMtOC4xLTQuMy0xNi43LTYuNC0yNS43LTYuNGMtMTIuOCwwLTI0LDMuOS0zMy40LDExLjdjLTkuNCw3LjgtMTQuMSwxOC0xNC4xLDMwLjQNCgkJYzAsOC45LDMsMTcuNCw5LDI1LjRjNC4zLDUuNywxMi4xLDEyLjYsMjMuMywyMC42YzkuNyw2LjksMTUuNywxMS43LDE3LjksMTQuNGMyLjIsMi43LDMuMyw1LjMsMy4zLDcuOWMwLDMuMi0xLjQsNS45LTQuMyw4LjMNCgkJYy0yLjksMi4zLTYuNywzLjUtMTEuNSwzLjVjLTEyLjEsMC0yMy4zLTYuNy0zMy41LTIwLjJsLTIyLjUsMjYuMmMxMCwxMC42LDE5LjEsMTgsMjcuMiwyMmM4LjEsNCwxNy4yLDYsMjcuMSw2DQoJCWMxNy4yLDAsMzAuMy00LjksMzkuNC0xNC43YzkuMS05LjgsMTMuNi0yMC4zLDEzLjYtMzEuM2MwLTguNC0yLjItMTYuMS02LjYtMjMuM2MtNC40LTcuMS0xMy42LTE1LjctMjcuNi0yNS43DQoJCWMtOC44LTYuMy0xNC0xMC41LTE1LjctMTIuN2MtMS44LTIuMi0yLjctNC40LTIuNy02LjZDODk4LjIsMTY0LjksODk5LjQsMTYyLjksOTAxLjcsMTYxLjF6Ii8+DQoJPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxMDM4LjcsMjE3LjIgMTAwOS44LDEyOS4xIDk3NCwxMjkuMSAxMDE1LjgsMjU3LjQgOTczLjYsMzMyIDEwMTIuMSwzMzIgMTEyOC44LDEyOS4xIDEwODkuNSwxMjkuMSAJDQoJCSIvPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02NTEuNSwxNTQuMWwtNzAuNCwwbDUuOC00MS43YzAsMCw3NC43LTAuMSw3NS4xLTAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44YzAtOS44LTgtMTcuOC0xNy44LTE3LjgNCgkJYy0wLjMsMC0xMDguNCwwLTEwOC40LDBMNTI2LDI3Ny43aDExMy4ydjBjOS41LTAuMiwxNy4yLTgsMTcuMi0xNy41YzAtOS43LTcuOS0xNy42LTE3LjYtMTcuNmMtMC40LDAtNzAuMiwwLjEtNzAuMiwwLjFsNy40LTUzLjMNCgkJYzAsMCw3MS43LDAuMSw3Mi4zLDAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44QzY2Ni4zLDE2Mi44LDY1OS45LDE1NS41LDY1MS41LDE1NC4xeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMjY4LjQsNzYuOGMtMC4zLDAtMTA4LjQsMC0xMDguNCwwbC0yNy40LDIwMC44aDExMy4zdjBjOS41LTAuMiwxNy4yLTgsMTcuMi0xNy41YzAtOS43LTcuOS0xNy42LTE3LjYtMTcuNg0KCQljLTAuNCwwLTcwLjIsMC4xLTcwLjIsMC4xbDcuNC01My4zYzAsMCw3MS43LDAuMSw3Mi40LDAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44YzAtOC44LTYuNC0xNi4xLTE0LjgtMTcuNWwtNzAuNCwwbDUuOC00MS43DQoJCWMwLDAsNzQuNy0wLjEsNzUuMS0wLjFjOS44LDAsMTcuOC04LDE3LjgtMTcuOEMxMjg2LjIsODQuOCwxMjc4LjMsNzYuOCwxMjY4LjQsNzYuOHoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTQ3MC43LDE3M2MwLTE5LjctNC42LTM3LjItMTMuNy01Mi4zYy05LjEtMTUuMS0yMC45LTI2LjItMzUuNS0zMy4yYy0xNC42LTcuMS0zNi43LTEwLjYtNjYuNi0xMC42aC0zMS44DQoJCWwtMjcuNCwyMDAuOGg2Mi40YzI2LjIsMCw0Ni43LTMuOSw2MS40LTExLjdjMTQuNy03LjgsMjctMjAuMiwzNi43LTM3LjFDMTQ2NS45LDIxMS45LDE0NzAuNywxOTMuMywxNDcwLjcsMTczeiBNMTQyMS4zLDIxNC41DQoJCWMtNy4zLDExLTE2LjksMTguOC0yOC45LDIzLjNjLTguNiwzLjItMjIuNCw0LjgtNDEuNSw0LjhoLTEyLjRsMTcuNy0xMzAuNGg5LjVjMTUuNSwwLDI3LjksMi40LDM3LjIsNy4zDQoJCWM5LjMsNC45LDE2LjUsMTEuOCwyMS43LDIwLjhjNS4xLDksNy43LDIwLjEsNy43LDMzLjRDMTQzMi4yLDE4OS44LDE0MjguNiwyMDMuNSwxNDIxLjMsMjE0LjV6Ii8+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTE2MTkuMiwxNzAuN2wtMjIuMywxMi4zYy0xLjgsMTYuMi0xNS42LDI4LjctMzIuMiwyOC43Yy0xNy45LDAtMzIuNC0xNC41LTMyLjQtMzIuNA0KCQljMC0xNy45LDE0LjUtMzIuNCwzMi40LTMyLjRjNi45LDAsMTMuMywyLjIsMTguNSw1LjhsMjcuNy0xNS4zbC0xNS02MC4yaC0zMS43bC0xMDgsMjAwaDQwLjRsMjIuOC00Mi42aDc5LjRsMTAuNiw0Mi42aDM2LjQNCgkJTDE2MTkuMiwxNzAuN3oiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTU1Mi44LDE3OC41YzAsNi45LDUuNiwxMi41LDEyLjUsMTIuNWM2LjksMCwxMi41LTUuNiwxMi41LTEyLjVjMC02LjktNS42LTEyLjUtMTIuNS0xMi41DQoJCUMxNTU4LjQsMTY2LDE1NTIuOCwxNzEuNiwxNTUyLjgsMTc4LjV6Ii8+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTgxNC44LDE1Mi41QzgxNC44LDE1Mi41LDgxNC44LDE1Mi40LDgxNC44LDE1Mi41bC0xMi41LDBsLTEuMy0yLjRjLTUuMS04LjEtMTEuNS0xNC4yLTE5LjItMTguNA0KCQljLTcuOC00LjItMjAuMS02LjMtMjkuMy02LjNjLTEzLjcsMC0yNi44LDMuNy0zOS4zLDExLjFjLTEyLjUsNy40LTIyLjUsMTcuNy0yOS45LDMxYy03LjQsMTMuMi0xMS4yLDI3LjItMTEuMiw0MS44DQoJCWMwLDE5LjIsNS44LDM2LDE3LjQsNTAuNWMxMS42LDE0LjUsMjcuMywyMS43LDQ3LDIxLjdjOC42LDAsMTYuMy0xLjQsMjMuMi00LjRjNi45LTIuOSwxNC4zLTgsMjIuMi0xNS40YzAsMCw5LjMsOC4xLDkuNCw4DQoJCWM1LjgsNC42LDEzLDcuNSwyMC44LDhoMy42bDAuNS00LjNsMTIuNy0xMDYuOWMtMC4xLDAtMC4xLDAtMC4yLDBDODI4LjcsMTU4LjgsODIyLjUsMTUyLjYsODE0LjgsMTUyLjV6IE03ODUuNiwyMjQuMg0KCQljLTQuNSw4LjUtMTAuMSwxNC44LTE2LjgsMTguOGMtNi43LDQtMTQuNSw2LTIzLjUsNmMtMTAuOCwwLTE5LjYtMy41LTI2LjUtMTAuN2MtNi45LTcuMS0xMC4zLTE2LjUtMTAuMy0yOC4xDQoJCWMwLTE1LjEsNC41LTI3LjQsMTMuNi0zN2M5LjEtOS42LDIwLjEtMTQuMywzMy4xLTE0LjNjMTEuMiwwLDIwLjIsMy42LDI3LDEwLjdjNi44LDcuMiwxMC4yLDE2LjYsMTAuMiwyOC40DQoJCUM3OTIuNCwyMDYuOSw3OTAuMSwyMTUuNyw3ODUuNiwyMjQuMnoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNNDA0LjMsOTYuM2MtNy41LTE5LjktMTkuNy0zNy44LTM1LjgtNTIuM2MtMjQuNy0yMi4yLTU2LjctMzQuNS05MC0zNC41Yy0yOC44LDAtNTYuMyw5LTc5LjUsMjYNCgkJYy0xMS4yLDguMi0yMC45LDE3LjktMjguOSwyOC45Yy01LTAuNy0xMC4xLTEuMS0xNS4zLTEuMWMtMjguNywwLTU1LjgsMTEuMi03Ni4xLDMxLjVjLTIwLjMsMjAuMy0zMS41LDQ3LjMtMzEuNSw3Ni4xDQoJCWMwLDI2LjcsOS45LDUyLjMsMjcuOCw3Mi4xYzE0LjIsMTUuNywzMi42LDI2LjgsNTIuOSwzMmM4LjgsMjYuMiwzMy42LDQ1LjEsNjIuNyw0NS4xYzM2LjUsMCw2Ni4yLTI5LjcsNjYuMi02Ni4yDQoJCWMwLTIuMS0wLjEtNC4zLTAuMy02LjRsOTIuOS00OC44bC0yMC4zLTM1LjJsLTg4LjgsNDYuNmMtMTIuMS0xMy44LTI5LjktMjIuNS00OS43LTIyLjVjLTI4LjcsMC01My4yLDE4LjQtNjIuNCw0NA0KCQljLTIzLjQtMTAuMy0zOS44LTMzLjYtMzkuOC02MC44YzAtMzYuNiwyOS43LTY2LjQsNjYuNC02Ni40YzEyLjksMCwyNSwzLjcsMzUuMiwxMC4xYzEyLjMtMzcuMSw0Ny4zLTYzLjksODguNS02My45DQoJCWM0OCwwLDg3LjQsMzYuMiw5Mi43LDgyLjdjMS43LTAuMiwzLjQtMC4zLDUuMS0wLjNjMjguNywwLDUyLDIzLjMsNTIsNTJjMCwyNy4yLTIwLjksNDkuNS00Ny41LDUxLjhsLTI5LjcsMA0KCQljLTEuMy0wLjMtMi43LTAuNC00LjEtMC40Yy0xMS41LDAtMjAuOCw5LjMtMjAuOCwyMC44YzAsMTAuOSw4LjQsMTkuOCwxOS4xLDIwLjd2MC4ybDM1LjUsMGwxLjgsMGwxLjgtMC4yDQoJCWMyMy4yLTIsNDQuNy0xMi41LDYwLjUtMjkuN2MxNS45LTE3LjMsMjQuNy0zOS43LDI0LjctNjMuMkM0NjkuNiwxNDMuNiw0NDIuMSwxMDguMiw0MDQuMyw5Ni4zeiBNMTkwLjYsMjI4LjMNCgkJYzE0LjEsMCwyNS42LDExLjUsMjUuNiwyNS42YzAsMTQuMS0xMS41LDI1LjYtMjUuNiwyNS42Yy0xNC4xLDAtMjUuNi0xMS41LTI1LjYtMjUuNkMxNjUsMjM5LjgsMTc2LjUsMjI4LjMsMTkwLjYsMjI4LjN6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==","LIB~505~-570~package`TTGO-T-BEAM-ESP32-CONNECTOR`BOM_Manufacturer``BOM_Manufacturer Part``BOM_Supplier Part``BOM_Supplier``link``Contributor`grizli2509`spicePre`U`spiceSymbolName`TTGO-BEAM-ESP32`Package Display`No`~~0~gge6aaff6c194964e3d~5180c2e0c1da4a75b575a8495aee30f2~5657e928f1504b21b9e68062d66ba3e3~0~~yes~yes#@$T~N~470.46~-721.7890625~0~#000080~Arial~~~~~comment~MAIN BOARD~1~start~gge857~0~#@$T~P~494.04~-732.125~0~#000080~Arial~~~~~comment~U1~1~start~gge859~0~#@$P~show~0~1~475~-700~~gge861~0^^475~-700^^M 475 -700 h -20~#880000^^1~453~-697~0~S_VP~end~~~#0000FF^^1~460~-701~0~S_VP~start~~~#0000FF^^0~458~-700^^0~M 455 -703 L 452 -700 L 455 -697#@$P~show~0~2~475~-680~~gge868~0^^475~-680^^M 475 -680 h -20~#880000^^1~453~-677~0~S_VN~end~~~#0000FF^^1~460~-681~0~S_VN~start~~~#0000FF^^0~458~-680^^0~M 455 -683 L 452 -680 L 455 -677#@$P~show~0~3~475~-660~~gge875~0^^475~-660^^M 475 -660 h -20~#880000^^1~453~-657~0~RST~end~~~#0000FF^^1~460~-661~0~RST~start~~~#0000FF^^0~458~-660^^0~M 455 -663 L 452 -660 L 455 -657#@$P~show~0~4~475~-640~~gge882~0^^475~-640^^M 475 -640 h -20~#880000^^1~453~-637~0~15~end~~~#0000FF^^1~460~-641~0~15~start~~~#0000FF^^0~458~-640^^0~M 455 -643 L 452 -640 L 455 -637#@$P~show~0~5~475~-620~~gge889~0^^475~-620^^M 475 -620 h -20~#880000^^1~453~-617~0~35~end~~~#0000FF^^1~460~-621~0~35~start~~~#0000FF^^0~458~-620^^0~M 455 -623 L 452 -620 L 455 -617#@$P~show~0~6~475~-600~~gge896~0^^475~-600^^M 475 -600 h -20~#880000^^1~453~-597~0~32~end~~~#0000FF^^1~460~-601~0~32~start~~~#0000FF^^0~458~-600^^0~M 455 -603 L 452 -600 L 455 -597#@$P~show~0~7~475~-580~~gge903~0^^475~-580^^M 475 -580 h -20~#880000^^1~453~-577~0~33~end~~~#0000FF^^1~460~-581~0~33~start~~~#0000FF^^0~458~-580^^0~M 455 -583 L 452 -580 L 455 -577#@$P~show~0~8~475~-560~~gge910~0^^475~-560^^M 475 -560 h -20~#880000^^1~453~-557~0~25~end~~~#0000FF^^1~460~-561~0~25~start~~~#0000FF^^0~458~-560^^0~M 455 -563 L 452 -560 L 455 -557#@$P~show~0~9~475~-540~~gge917~0^^475~-540^^M 475 -540 h -20~#880000^^1~453~-537~0~14~end~~~#0000FF^^1~460~-541~0~14~start~~~#0000FF^^0~458~-540^^0~M 455 -543 L 452 -540 L 455 -537#@$P~show~0~10~475~-520~~gge924~0^^475~-520^^M 475 -520 h -20~#880000^^1~453~-517~0~13~end~~~#0000FF^^1~460~-521~0~13~start~~~#0000FF^^0~458~-520^^0~M 455 -523 L 452 -520 L 455 -517#@$P~show~0~11~475~-500~~gge931~0^^475~-500^^M 475 -500 h -20~#880000^^1~453~-497~0~02~end~~~#0000FF^^1~460~-501~0~02~start~~~#0000FF^^0~458~-500^^0~M 455 -503 L 452 -500 L 455 -497#@$P~show~0~12~475~-480~~gge938~0^^475~-480^^M 475 -480 h -20~#880000^^1~453~-477~0~GND~end~~~#0000FF^^1~460~-481~0~GND_3~start~~~#0000FF^^0~458~-480^^0~M 455 -483 L 452 -480 L 455 -477#@$P~show~0~13~475~-460~~gge945~0^^475~-460^^M 475 -460 h -20~#880000^^1~453~-457~0~5V~end~~~#0000FF^^1~460~-461~0~5V~start~~~#0000FF^^0~458~-460^^0~M 455 -463 L 452 -460 L 455 -457#@$P~show~0~14~515~-460~180~gge952~0^^515~-460^^M 515 -460 h 20~#880000^^1~537~-457~0~LORA1~start~~~#0000FF^^1~530~-461~0~LORA1~end~~~#0000FF^^0~532~-460^^0~M 535 -457 L 538 -460 L 535 -463#@$P~show~0~15~515~-480~180~gge959~0^^515~-480^^M 515 -480 h 20~#880000^^1~537~-477~0~LORA2~start~~~#0000FF^^1~530~-481~0~LORA2~end~~~#0000FF^^0~532~-480^^0~M 535 -477 L 538 -480 L 535 -483#@$P~show~0~16~515~-500~180~gge966~0^^515~-500^^M 515 -500 h 20~#880000^^1~537~-497~0~3V3~start~~~#0000FF^^1~528.33~-501~0~3V3_2~end~~~#0000FF^^0~532~-500^^0~M 535 -497 L 538 -500 L 535 -503#@$P~show~0~17~515~-520~180~gge973~0^^515~-520^^M 515 -520 h 20~#880000^^1~537~-517~0~21~start~~~#0000FF^^1~527.5~-521~0~21~end~~~#0000FF^^0~532~-520^^0~M 535 -517 L 538 -520 L 535 -523#@$P~show~0~18~515~-540~180~gge980~0^^515~-540^^M 515 -540 h 20~#880000^^1~537~-537~0~22~start~~~#0000FF^^1~530~-541~0~22~end~~~#0000FF^^0~532~-540^^0~M 535 -537 L 538 -540 L 535 -543#@$P~show~0~19~515~-560~180~gge987~0^^515~-560^^M 515 -560 h 20~#880000^^1~537~-557~0~GND~start~~~#0000FF^^1~530~-561~0~GND_2~end~~~#0000FF^^0~532~-560^^0~M 535 -557 L 538 -560 L 535 -563#@$P~show~0~20~515~-580~180~gge994~0^^515~-580^^M 515 -580 h 20~#880000^^1~537~-577~0~3V3~start~~~#0000FF^^1~530~-581~0~3V3_1~end~~~#0000FF^^0~532~-580^^0~M 535 -577 L 538 -580 L 535 -583#@$P~show~0~21~515~-600~180~gge1001~0^^515~-600^^M 515 -600 h 20~#880000^^1~537~-597~0~GND~start~~~#0000FF^^1~530~-601~0~GND_1~end~~~#0000FF^^0~532~-600^^0~M 535 -597 L 538 -600 L 535 -603#@$P~show~0~22~515~-620~180~gge1008~0^^515~-620^^M 515 -620 h 20~#880000^^1~537~-617~0~0~start~~~#0000FF^^1~530~-621~0~0~end~~~#0000FF^^0~532~-620^^0~M 535 -617 L 538 -620 L 535 -623#@$P~show~0~23~515~-640~180~gge1015~0^^515~-640^^M 515 -640 h 20~#880000^^1~537~-637~0~4~start~~~#0000FF^^1~530~-641~0~4~end~~~#0000FF^^0~532~-640^^0~M 535 -637 L 538 -640 L 535 -643#@$P~show~0~24~515~-660~180~gge1022~0^^515~-660^^M 515 -660 h 20~#880000^^1~537~-657~0~23~start~~~#0000FF^^1~530~-661~0~23~end~~~#0000FF^^0~532~-660^^0~M 535 -657 L 538 -660 L 535 -663#@$P~show~0~25~515~-680~180~gge1029~0^^515~-680^^M 515 -680 h 20~#880000^^1~537~-677~0~RX~start~~~#0000FF^^1~530~-681~0~RX~end~~~#0000FF^^0~532~-680^^0~M 535 -677 L 538 -680 L 535 -683#@$P~show~0~26~515~-700~180~gge1036~0^^515~-700^^M 515 -700 h 20~#880000^^1~537~-697~0~TX~start~~~#0000FF^^1~530~-701~0~TX~end~~~#0000FF^^0~532~-700^^0~M 535 -697 L 538 -700 L 535 -703#@$R~415~-720~~~170~290~#000000~1~0~none~gge1043~0~","LIB~750~-375~package`MCP23017`BOM_Manufacturer``BOM_Manufacturer Part`MCP23017`BOM_Supplier Part``BOM_Supplier``link``Contributor`emmanuel.malosse`spicePre`U`spiceSymbolName`MCP23017`~~0~ggeb1124de9a27319d1~f09420c4fd9946a583a6b15c1c5a483e~0f118b0d9063400da84e04b55532a171~0~~yes~yes#@$T~N~744.03125~-468.296875~0~#000080~Arial~~~~~comment~MCP23017~1~start~gge3184~0~#@$T~P~744.0390625~-477.421875~0~#000080~Arial~~~~~comment~U3~1~start~gge3186~0~#@$P~show~0~1~680~-455~180~gge3188~0^^680~-455^^M 680 -455 h 20~#880000^^1~702~-452~0~VCC~start~~~#0000FF^^1~695~-456~0~11~end~~~#0000FF^^0~697~-455^^0~M 700 -452 L 703 -455 L 700 -458#@$P~show~0~2~680~-445~180~gge3195~0^^680~-445^^M 680 -445 h 20~#880000^^1~702~-442~0~VCC~start~~~#0000FF^^1~695~-446~0~10~end~~~#0000FF^^0~697~-445^^0~M 700 -442 L 703 -445 L 700 -448#@$P~show~0~3~680~-405~180~gge3202~0^^680~-405^^M 680 -405 h 20~#880000^^1~702~-402~0~A0~start~~~#0000FF^^1~695~-406~0~3~end~~~#0000FF^^0~697~-405^^0~M 700 -402 L 703 -405 L 700 -408#@$P~show~0~4~680~-395~180~gge3209~0^^680~-395^^M 680 -395 h 20~#880000^^1~702~-392~0~A1~start~~~#0000FF^^1~695~-396~0~2~end~~~#0000FF^^0~697~-395^^0~M 700 -392 L 703 -395 L 700 -398#@$P~show~0~5~680~-385~180~gge3216~0^^680~-385^^M 680 -385 h 20~#880000^^1~702~-382~0~A2~start~~~#0000FF^^1~695~-386~0~1~end~~~#0000FF^^0~697~-385^^0~M 700 -382 L 703 -385 L 700 -388#@$P~show~0~6~680~-375~180~gge3223~0^^680~-375^^M 680 -375 h 20~#880000^^1~702~-372~0~Reset~start~~~#0000FF^^1~695~-376~0~4~end~~~#0000FF^^0~697~-375^^0~M 700 -372 L 703 -375 L 700 -378#@$P~show~0~7~680~-355~180~gge3230~0^^680~-355^^M 680 -355 h 20~#880000^^1~702~-352~0~SO~start~~~#0000FF^^1~695~-356~0~5~end~~~#0000FF^^0~697~-355^^0~M 700 -352 L 703 -355 L 700 -358#@$P~show~0~8~680~-345~180~gge3237~0^^680~-345^^M 680 -345 h 20~#880000^^1~702~-342~0~CS~start~~~#0000FF^^1~695~-346~0~6~end~~~#0000FF^^0~697~-345^^0~M 700 -342 L 703 -345 L 700 -348#@$P~show~0~9~680~-335~180~gge3244~0^^680~-335^^M 680 -335 h 20~#880000^^1~702~-332~0~SDA~start~~~#0000FF^^1~695~-336~0~7~end~~~#0000FF^^0~697~-335^^0~M 700 -332 L 703 -335 L 700 -338#@$P~show~0~10~680~-325~180~gge3251~0^^680~-325^^M 680 -325 h 20~#880000^^1~702~-322~0~SCL~start~~~#0000FF^^1~695~-326~0~8~end~~~#0000FF^^0~697~-325^^0~M 700 -322 L 703 -325 L 700 -328#@$P~show~0~11~820~-455~0~gge3258~0^^820~-455^^M 820 -455 h -20~#880000^^1~798~-452~0~A0~end~~~#0000FF^^1~805~-456~0~23~start~~~#0000FF^^0~803~-455^^0~M 800 -458 L 797 -455 L 800 -452#@$P~show~0~12~820~-445~0~gge3265~0^^820~-445^^M 820 -445 h -20~#880000^^1~798~-442~0~A1~end~~~#0000FF^^1~805~-446~0~24~start~~~#0000FF^^0~803~-445^^0~M 800 -448 L 797 -445 L 800 -442#@$P~show~0~13~820~-435~0~gge3272~0^^820~-435^^M 820 -435 h -20~#880000^^1~798~-432~0~A2~end~~~#0000FF^^1~805~-436~0~25~start~~~#0000FF^^0~803~-435^^0~M 800 -438 L 797 -435 L 800 -432#@$P~show~0~14~820~-425~0~gge3279~0^^820~-425^^M 820 -425 h -20~#880000^^1~798~-422~0~A3~end~~~#0000FF^^1~805~-426~0~26~start~~~#0000FF^^0~803~-425^^0~M 800 -428 L 797 -425 L 800 -422#@$P~show~0~15~820~-415~0~gge3286~0^^820~-415^^M 820 -415 h -20~#880000^^1~798~-412~0~A4~end~~~#0000FF^^1~805~-416~0~27~start~~~#0000FF^^0~803~-415^^0~M 800 -418 L 797 -415 L 800 -412#@$P~show~0~16~820~-405~0~gge3293~0^^820~-405^^M 820 -405 h -20~#880000^^1~798~-402~0~A5~end~~~#0000FF^^1~805~-406~0~28~start~~~#0000FF^^0~803~-405^^0~M 800 -408 L 797 -405 L 800 -402#@$P~show~0~17~820~-395~0~gge3300~0^^820~-395^^M 820 -395 h -20~#880000^^1~798~-392~0~A6~end~~~#0000FF^^1~805~-396~0~29~start~~~#0000FF^^0~803~-395^^0~M 800 -398 L 797 -395 L 800 -392#@$P~show~0~18~820~-385~0~gge3307~0^^820~-385^^M 820 -385 h -20~#880000^^1~798~-382~0~A7~end~~~#0000FF^^1~805~-386~0~30~start~~~#0000FF^^0~803~-385^^0~M 800 -388 L 797 -385 L 800 -382#@$P~show~0~19~820~-365~0~gge3314~0^^820~-365^^M 820 -365 h -20~#880000^^1~798~-362~0~B0~end~~~#0000FF^^1~805~-366~0~13~start~~~#0000FF^^0~803~-365^^0~M 800 -368 L 797 -365 L 800 -362#@$P~show~0~20~820~-355~0~gge3321~0^^820~-355^^M 820 -355 h -20~#880000^^1~798~-352~0~B1~end~~~#0000FF^^1~805~-356~0~14~start~~~#0000FF^^0~803~-355^^0~M 800 -358 L 797 -355 L 800 -352#@$P~show~0~21~820~-345~0~gge3328~0^^820~-345^^M 820 -345 h -20~#880000^^1~798~-342~0~B2~end~~~#0000FF^^1~805~-346~0~15~start~~~#0000FF^^0~803~-345^^0~M 800 -348 L 797 -345 L 800 -342#@$P~show~0~22~820~-335~0~gge3335~0^^820~-335^^M 820 -335 h -20~#880000^^1~798~-332~0~B3~end~~~#0000FF^^1~805~-336~0~16~start~~~#0000FF^^0~803~-335^^0~M 800 -338 L 797 -335 L 800 -332#@$P~show~0~23~820~-325~0~gge3342~0^^820~-325^^M 820 -325 h -20~#880000^^1~798~-322~0~B4~end~~~#0000FF^^1~805~-326~0~17~start~~~#0000FF^^0~803~-325^^0~M 800 -328 L 797 -325 L 800 -322#@$P~show~0~24~820~-315~0~gge3349~0^^820~-315^^M 820 -315 h -20~#880000^^1~798~-312~0~B5~end~~~#0000FF^^1~805~-316~0~18~start~~~#0000FF^^0~803~-315^^0~M 800 -318 L 797 -315 L 800 -312#@$P~show~0~25~820~-305~0~gge3356~0^^820~-305^^M 820 -305 h -20~#880000^^1~798~-302~0~B6~end~~~#0000FF^^1~805~-306~0~19~start~~~#0000FF^^0~803~-305^^0~M 800 -308 L 797 -305 L 800 -302#@$P~show~0~26~820~-295~0~gge3363~0^^820~-295^^M 820 -295 h -20~#880000^^1~798~-292~0~B7~end~~~#0000FF^^1~805~-296~0~20~start~~~#0000FF^^0~803~-295^^0~M 800 -298 L 797 -295 L 800 -292#@$P~show~0~27~680~-305~180~gge3370~0^^680~-305^^M 680 -305 h 20~#880000^^1~702~-302~0~ITA~start~~~#0000FF^^1~695~-306~0~22~end~~~#0000FF^^0~697~-305^^0~M 700 -302 L 703 -305 L 700 -308#@$P~show~0~28~680~-295~180~gge3377~0^^680~-295^^M 680 -295 h 20~#880000^^1~702~-292~0~ITB~start~~~#0000FF^^1~695~-296~0~11~end~~~#0000FF^^0~697~-295^^0~M 700 -292 L 703 -295 L 700 -298#@$T~L~720~-312.78~0~#0000FF~~9pt~~~~comment~MCP23017~1~start~gge3384~0~pinpart#@$R~700~-465~~~100~180~#000000~1~0~none~gge3386~0~#@$P~show~0~29~680~-435~180~gge3387~0^^680~-435^^M 680 -435 h 20~#880000^^1~702~-432~0~GND~start~~~#0000FF^^1~695~-436~0~21~end~~~#0000FF^^0~697~-435^^0~M 700 -432 L 703 -435 L 700 -438#@$P~show~0~0~680~-425~180~gge3394~0^^680~-425^^M 680 -425 h 20~#880000^^1~702~-422~0~GND~start~~~#0000FF^^1~695~-426~0~9~end~~~#0000FF^^0~697~-425^^0~M 700 -422 L 703 -425 L 700 -428","W~515 -560 665 -560 665 -660 700 -660~#008800~1~0~none~gge3621~0","W~680 -435 665 -435 665 -560~#008800~1~0~none~gge3622~0","W~680 -425 665 -425 665 -435~#008800~1~0~none~gge3626~0","W~515 -540 645 -540 645 -640 700 -640~#008800~1~0~none~gge3630~0","W~680 -325 645 -325 645 -540~#008800~1~0~none~gge3631~0","W~515 -520 635 -520 635 -335 680 -335~#008800~1~0~none~gge3633~0","W~700 -620 675 -620 675 -520 635 -520~#008800~1~0~none~gge3634~0","F~part_netLabel_gnD~875~-645~0~gge3637~~0^^875~-645^^GND~#000000~862~-619~0~start~1~Times New Roman~9pt~flag_gge38^^PL~875 -635 875 -645~#000000~1~0~transparent~gge3641~0^^PL~866 -635 884 -635~#000000~1~0~transparent~gge3642~0^^PL~869 -633 881 -633~#000000~1~0~transparent~gge3643~0^^PL~872 -631 878 -631~#000000~1~0~transparent~gge3644~0^^PL~874 -629 876 -629~#000000~1~0~transparent~gge3645~0","W~875 -645 875 -725 665 -725 665 -660~#008800~1~0~none~gge3655~0","W~655 -680 655 -455 680 -455~#008800~1~0~none~gge3670~0","W~680 -445 655 -445 655 -455~#008800~1~0~none~gge3672~0","W~515 -500 625 -500 625 -680 700 -680~#008800~1~0~none~gge3674~0","W~515 -600 665 -600~#008800~1~0~none~gge5803~0","W~475 -480 360 -480 360 -760 665 -760 665 -695~#008800~1~0~none~gge5805~0","W~225 -750 225 -750 625 -750 625 -680~#008800~1~0~none~gge5807~0","W~300 -640 280 -640 280 -700 475 -700~#008800~1~0~none~gge5809~0","LIB~320~-640~package`RES-TH_BD1.8-L3.2-P7.20-D0.4`BOM_Supplier`LCSC`BOM_Supplier Part`C714232`BOM_Manufacturer`Huaxing Mechanical-Elec.`BOM_Manufacturer Part`CF1/6W-10KΊ¹5%T52`nameAlias`Resistance (Ohms)`Contributor`LCSC`spicePre`R`spiceSymbolName`CF1/6W-10KΊ¹5%T52`~~0~gge2be133cf7b4aac5a~97467e7cb6374f7e9dd7fc644a47cfb1~2ba8a26395ab41a2a00f577110f8f3f7~0~~yes~yes#@$T~N~314.03125~-648~0~#000080~Arial~~~~~comment~10kΊ~1~start~gge6472~0~#@$T~P~314.0390625~-657.125~0~#000080~Arial~~~~~comment~R2~1~start~gge6474~0~#@$R~310~-645~~~20~10~#A00000~1~0~none~gge6476~0~#@$P~show~0~2~340~-640~0~gge6477~0^^340~-640^^M 330 -640 h 10~#800^^0~326~-640~0~2~end~~~#800^^0~334~-644~0~2~start~~~#800^^0~353~-640^^0~M 350 -643 L 347 -640 L 350 -637#@$P~show~0~1~300~-640~180~gge6484~0^^300~-640^^M 310 -640 h -10~#800^^0~314~-640~0~1~start~~~#800^^0~306~-644~0~1~end~~~#800^^0~287~-640^^0~M 290 -637 L 293 -640 L 290 -643","W~515 -580 610 -580 610 -410 335 -410~#008800~1~0~none~gge7116~0","W~335 -470 370 -470 370 -420 600 -420 600 -640 515 -640~#008800~1~0~none~gge7119~0","W~335 -430 405 -430 405 -500 475 -500~#008800~1~0~none~gge7120~0","W~335 -440 395 -440 395 -520 475 -520~#008800~1~0~none~gge7122~0","W~340 -640 360 -640~#008800~1~0~none~gge7126~0","W~335 -450 385 -450 385 -540 475 -540~#008800~1~0~none~gge7128~0","T~L~340~-405~0~#0000FF~~4pt~~~~comment~VCC~1~start~gge7135~0~pinpart","T~L~340~-465~0~#0000FF~~4pt~~~~comment~RST~1~start~gge7143~0~pinpart","T~L~340~-435~0~#0000FF~~4pt~~~~comment~MISO~1~start~gge7146~0~pinpart","T~L~340~-445~0~#0000FF~~4pt~~~~comment~MOSI~1~start~gge7149~0~pinpart","T~L~340~-425~0~#0000FF~~4pt~~~~comment~SCLK~1~start~gge7152~0~pinpart","T~L~340~-455~0~#0000FF~~4pt~~~~comment~CS~1~start~gge7155~0~pinpart","F~part_netLabel_gnD~330~-610~0~gge7160~~0^^330~-610^^GND~#000000~317~-584~0~start~1~Times New Roman~9pt~flag_gge39^^PL~330 -600 330 -610~#000000~1~0~transparent~gge7164~0^^PL~321 -600 339 -600~#000000~1~0~transparent~gge7165~0^^PL~324 -598 336 -598~#000000~1~0~transparent~gge7166~0^^PL~327 -596 333 -596~#000000~1~0~transparent~gge7167~0^^PL~329 -594 331 -594~#000000~1~0~transparent~gge7168~0","W~330 -610 360 -610~#008800~1~0~none~gge7178~0","W~280 -230 240 -230 240 -510 360 -510~#008800~1~0~none~gge7180~0","W~680 -405 665 -405 665 -425~#008800~1~0~none~gge7191~0","W~680 -395 665 -395 665 -405~#008800~1~0~none~gge7193~0","W~680 -385 665 -385 665 -395~#008800~1~0~none~gge7195~0","LIB~410~-230~package`WIRELM-TH_DWM1000`BOM_Supplier`LCSC`BOM_Manufacturer`DecaWave`BOM_Manufacturer Part`DWM1000`BOM_Supplier Part`C95238`spicePre`U`spiceSymbolName`DWM1000`~~0~gge40e5c90f659fccfc~921ff2190df246a4b1016c11071a51a1~605f956fd8c24817bb840fda3296ca74~0~~yes~yes#@$T~N~387.96875~-351.75~0~#000080~Arial~~~~~comment~DWM1000~1~start~gge7203~0~#@$T~P~404.21875~-362.125~0~#000080~Arial~~~~~comment~U5~1~start~gge7205~0~#@$E~295~-307~1.5~1.5~#880000~1~0~#880000~gge7207~0#@$R~290~-350~2~2~240~230~#880000~1~0~none~gge7208~0~#@$E~295~-307~1.5~1.5~#880000~1~0~#880000~gge7209~0#@$P~show~0~1~280~-300~180~gge7210~0^^280~-300^^M 280 -300 h 10~#880000^^1~293.7~-296~0~EXTON~start~~~#0000FF^^1~289.5~-301~0~1~end~~~#0000FF^^0~287~-300^^0~M 290 -297 L 293 -300 L 290 -303#@$P~show~0~2~280~-290~180~gge7217~0^^280~-290^^M 280 -290 h 10~#880000^^1~293.7~-286~0~WAKEUP~start~~~#0000FF^^1~289.5~-291~0~2~end~~~#0000FF^^0~287~-290^^0~M 290 -287 L 293 -290 L 290 -293#@$P~show~0~3~280~-280~180~gge7224~0^^280~-280^^M 280 -280 h 10~#880000^^1~293.7~-276~0~RSTn~start~~~#0000FF^^1~289.5~-281~0~3~end~~~#0000FF^^0~287~-280^^0~M 290 -277 L 293 -280 L 290 -283#@$P~show~0~4~280~-270~180~gge7231~0^^280~-270^^M 280 -270 h 10~#880000^^1~293.7~-266~0~GPIO7~start~~~#0000FF^^1~289.5~-271~0~4~end~~~#0000FF^^0~287~-270^^0~M 290 -267 L 293 -270 L 290 -273#@$P~show~0~5~280~-260~180~gge7238~0^^280~-260^^M 280 -260 h 10~#FF0000^^1~293.7~-256~0~VDDAON~start~~~#FF0000^^1~289.5~-261~0~5~end~~~#FF0000^^0~287~-260^^0~M 290 -257 L 293 -260 L 290 -263#@$P~show~0~6~280~-250~180~gge7245~0^^280~-250^^M 280 -250 h 10~#FF0000^^1~293.7~-246~0~VDD3V3~start~~~#FF0000^^1~289.5~-251~0~6~end~~~#FF0000^^0~287~-250^^0~M 290 -247 L 293 -250 L 290 -253#@$P~show~0~7~280~-240~180~gge7252~0^^280~-240^^M 280 -240 h 10~#FF0000^^1~293.7~-236~0~VDD3V3~start~~~#FF0000^^1~289.5~-241~0~7~end~~~#FF0000^^0~287~-240^^0~M 290 -237 L 293 -240 L 290 -243#@$P~show~0~8~280~-230~180~gge7259~0^^280~-230^^M 280 -230 h 10~#000000^^1~293.7~-226~0~VSS~start~~~#000000^^1~289.5~-231~0~8~end~~~#000000^^0~287~-230^^0~M 290 -227 L 293 -230 L 290 -233#@$P~show~0~9~370~-110~270~gge7266~0^^370~-110^^M 370 -110 v -10~#880000^^1~374~-123.7~270~GPIO6/EXTRXE/SPIPHA~start~~~#0000FF^^1~369~-119.5~270~9~end~~~#0000FF^^0~370~-117^^0~M 373 -120 L 370 -123 L 367 -120#@$P~show~0~10~380~-110~270~gge7273~0^^380~-110^^M 380 -110 v -10~#880000^^1~384~-123.7~270~GPIO5/EXTTXE/SPIPOL~start~~~#0000FF^^1~379~-119.5~270~10~end~~~#0000FF^^0~380~-117^^0~M 383 -120 L 380 -123 L 377 -120#@$P~show~0~11~390~-110~270~gge7280~0^^390~-110^^M 390 -110 v -10~#880000^^1~394~-123.7~270~GPIO4EXTPA~start~~~#0000FF^^1~389~-119.5~270~11~end~~~#0000FF^^0~390~-117^^0~M 393 -120 L 390 -123 L 387 -120#@$P~show~0~12~400~-110~270~gge7287~0^^400~-110^^M 400 -110 v -10~#880000^^1~404~-123.7~270~GPIO3TXLED~start~~~#0000FF^^1~399~-119.5~270~12~end~~~#0000FF^^0~400~-117^^0~M 403 -120 L 400 -123 L 397 -120#@$P~show~0~13~410~-110~270~gge7294~0^^410~-110^^M 410 -110 v -10~#880000^^1~414~-123.7~270~GPIO2RXLED~start~~~#0000FF^^1~409~-119.5~270~13~end~~~#0000FF^^0~410~-117^^0~M 413 -120 L 410 -123 L 407 -120#@$P~show~0~14~420~-110~270~gge7301~0^^420~-110^^M 420 -110 v -10~#880000^^1~424~-123.7~270~GPIO1SFDLED~start~~~#0000FF^^1~419~-119.5~270~14~end~~~#0000FF^^0~420~-117^^0~M 423 -120 L 420 -123 L 417 -120#@$P~show~0~15~430~-110~270~gge7308~0^^430~-110^^M 430 -110 v -10~#880000^^1~434~-123.7~270~GPIO0RXOKLED~start~~~#0000FF^^1~429~-119.5~270~15~end~~~#0000FF^^0~430~-117^^0~M 433 -120 L 430 -123 L 427 -120#@$P~show~0~16~440~-110~270~gge7315~0^^440~-110^^M 440 -110 v -10~#000000^^1~444~-123.7~270~VSS~start~~~#000000^^1~439~-119.5~270~16~end~~~#000000^^0~440~-117^^0~M 443 -120 L 440 -123 L 437 -120#@$P~show~0~17~540~-230~0~gge7322~0^^540~-230^^M 540 -230 h -10~#880000^^1~526.3~-226~0~SPICSn~end~~~#0000FF^^1~530.5~-231~0~17~start~~~#0000FF^^0~533~-230^^0~M 530 -233 L 527 -230 L 530 -227#@$P~show~0~18~540~-240~0~gge7329~0^^540~-240^^M 540 -240 h -10~#880000^^1~526.3~-236~0~SPIMOSI~end~~~#0000FF^^1~530.5~-241~0~18~start~~~#0000FF^^0~533~-240^^0~M 530 -243 L 527 -240 L 530 -237#@$P~show~0~19~540~-250~0~gge7336~0^^540~-250^^M 540 -250 h -10~#880000^^1~526.3~-246~0~SPIMISO~end~~~#0000FF^^1~530.5~-251~0~19~start~~~#0000FF^^0~533~-250^^0~M 530 -253 L 527 -250 L 530 -247#@$P~show~0~20~540~-260~0~gge7343~0^^540~-260^^M 540 -260 h -10~#880000^^1~526.3~-256~0~SPICLK~end~~~#0000FF^^1~530.5~-261~0~20~start~~~#0000FF^^0~533~-260^^0~M 530 -263 L 527 -260 L 530 -257#@$P~show~0~21~540~-270~0~gge7350~0^^540~-270^^M 540 -270 h -10~#000000^^1~526.3~-266~0~VSS~end~~~#000000^^1~530.5~-271~0~21~start~~~#000000^^0~533~-270^^0~M 530 -273 L 527 -270 L 530 -267#@$P~show~0~22~540~-280~0~gge7357~0^^540~-280^^M 540 -280 h -10~#880000^^1~526.3~-276~0~IRQ/GPIO8~end~~~#0000FF^^1~530.5~-281~0~22~start~~~#0000FF^^0~533~-280^^0~M 530 -283 L 527 -280 L 530 -277#@$P~show~0~23~540~-290~0~gge7364~0^^540~-290^^M 540 -290 h -10~#000000^^1~526.3~-286~0~VSS~end~~~#000000^^1~530.5~-291~0~23~start~~~#000000^^0~533~-290^^0~M 530 -293 L 527 -290 L 530 -287#@$P~show~0~24~540~-300~0~gge7371~0^^540~-300^^M 540 -300 h -10~#000000^^1~526.3~-296~0~VSS~end~~~#000000^^1~530.5~-301~0~24~start~~~#000000^^0~533~-300^^0~M 530 -303 L 527 -300 L 530 -297","W~335 -460 375 -460 375 -560 475 -560~#008800~1~0~none~gge7555~0","W~280 -260 225 -260 225 -750~#008800~1~0~none~gge7557~0","W~280 -250 225 -250 225 -260~#008800~1~0~none~gge7559~0","W~280 -240 225 -240 225 -250~#008800~1~0~none~gge7561~0","W~440 -110 440 -80 240 -80 240 -230~#008800~1~0~none~gge7565~0","W~540 -300 575 -300 575 -80 440 -80~#008800~1~0~none~gge7567~0","W~540 -290 575 -290~#008800~1~0~none~gge7569~0","W~540 -270 575 -270~#008800~1~0~none~gge7571~0","W~540 -240 585 -240 585 -380 385 -380 385 -450~#008800~1~0~none~gge7573~0","W~540 -250 595 -250 595 -390 395 -390 395 -440~#008800~1~0~none~gge7575~0","W~540 -260 605 -260 605 -400 405 -400 405 -430~#008800~1~0~none~gge7577~0","W~625 -280 625 -70 210 -70 210 -625 375 -625 375 -640 475 -640~#008800~1~0~none~gge7579~0","W~280 -280 270 -280 270 -60 680 -60 680 -260 835 -260 835 -415 820 -415~#008800~1~0~none~gge7580~0","LIB~625~-310~package`RES-TH_BD1.8-L3.2-P7.20-D0.4`BOM_Supplier`LCSC`BOM_Supplier Part`C714232`BOM_Manufacturer`Huaxing Mechanical-Elec.`BOM_Manufacturer Part`CF1/6W-10KΊ¹5%T52`nameAlias`Resistance (Ohms)`Contributor`LCSC`spicePre`R`spiceSymbolName`CF1/6W-10KΊ¹5%T52`~270~0~gge0d47179fde529207~97467e7cb6374f7e9dd7fc644a47cfb1~2ba8a26395ab41a2a00f577110f8f3f7~0~~yes~yes#@$T~N~632~-297.640625~0~#000080~Arial~~~~~comment~10kΊ~1~start~gge7584~0~#@$T~P~632~-306.78125~0~#000080~Arial~~~~~comment~R3~1~start~gge7586~0~#@$R~620~-320~~~10~20~#A00000~1~0~none~gge7588~0~#@$P~show~0~2~625~-290~270~gge7589~0^^625~-290^^M 625 -300 v 10~#800^^0~625~-304~270~2~start~~~#800^^0~621~-296~270~2~end~~~#800^^0~625~-277^^0~M 628 -280 L 625 -283 L 622 -280#@$P~show~0~1~625~-330~90~gge7596~0^^625~-330^^M 625 -320 v -10~#800^^0~625~-316~270~1~end~~~#800^^0~621~-324~270~1~start~~~#800^^0~625~-343^^0~M 622 -340 L 625 -337 L 628 -340","W~625 -330 625 -425 665 -425~#008800~1~0~none~gge7607~0","W~540 -280 625 -280 625 -290~#008800~1~0~none~gge7608~0","LIB~140~-670~package`M2X3`Contributor`DangerousPrototype`spicePre`J`spiceSymbolName`CON_HEADER_2X03`BOM_Manufacturer Part``~~0~gge73b657ec88652575~1a95e0cd8cf04abab1f0a955e387d9de~4cf556fe97124ad8934102a1b113e234~0~~yes~yes#@$T~N~128.3359375~-691.75~0~#000080~Arial~~~~~comment~LEFT IO~1~start~gge7932~0~#@$T~P~135.078125~-702~0~#000080~Arial~~~~~comment~J1~1~start~gge7934~0~#@$PL~120 -690 160 -690~#8D2323~2~0~none~gge7936~0#@$PL~160 -690 160 -650~#8D2323~2~0~none~gge7937~0#@$PL~160 -650 120 -650~#8D2323~2~0~none~gge7938~0#@$PL~120 -650 120 -690~#8D2323~2~0~none~gge7939~0#@$P~show~0~1~125~-680~180~gge7940~0^^125~-680^^M 125 -680 h 4~#8D2323^^0~138~-677~0~1~start~~~#8D2323^^1~129~-681~0~1~end~~~#8D2323^^1~132~-680^^0~M 135 -677 L 138 -680 L 135 -683#@$P~show~0~3~125~-670~180~gge7947~0^^125~-670^^M 125 -670 h 4~#8D2323^^0~138~-667~0~3~start~~~#8D2323^^1~129~-671~0~3~end~~~#8D2323^^1~132~-670^^0~M 135 -667 L 138 -670 L 135 -673#@$P~show~0~5~125~-660~180~gge7954~0^^125~-660^^M 125 -660 h 4~#8D2323^^0~138~-657~0~5~start~~~#8D2323^^1~129~-661~0~5~end~~~#8D2323^^1~132~-660^^0~M 135 -657 L 138 -660 L 135 -663#@$P~show~0~2~155~-680~0~gge7961~0^^155~-680^^M 155 -680 h -4~#8D2323^^0~142~-677~0~2~end~~~#8D2323^^1~151~-681~0~2~start~~~#8D2323^^1~148~-680^^0~M 145 -683 L 142 -680 L 145 -677#@$P~show~0~4~155~-670~0~gge7968~0^^155~-670^^M 155 -670 h -4~#8D2323^^0~142~-667~0~4~end~~~#8D2323^^1~151~-671~0~4~start~~~#8D2323^^1~148~-670^^0~M 145 -673 L 142 -670 L 145 -667#@$P~show~0~6~155~-660~0~gge7975~0^^155~-660^^M 155 -660 h -4~#8D2323^^0~142~-657~0~6~end~~~#8D2323^^1~151~-661~0~6~start~~~#8D2323^^1~148~-660^^0~M 145 -663 L 142 -660 L 145 -657","LIB~930~-355~package`M2X3`Contributor`DangerousPrototype`spicePre`J`spiceSymbolName`CON_HEADER_2X03`BOM_Manufacturer Part``~~0~gge7677077cf56e81b8~1a95e0cd8cf04abab1f0a955e387d9de~4cf556fe97124ad8934102a1b113e234~0~~yes~yes#@$T~N~909.28125~-377.0078125~0~#000080~Arial~~~~~comment~RIGHT IO~1~start~gge7984~0~#@$T~P~925.078125~-387~0~#000080~Arial~~~~~comment~J2~1~start~gge7986~0~#@$PL~910 -375 950 -375~#8D2323~2~0~none~gge7988~0#@$PL~950 -375 950 -335~#8D2323~2~0~none~gge7989~0#@$PL~950 -335 910 -335~#8D2323~2~0~none~gge7990~0#@$PL~910 -335 910 -375~#8D2323~2~0~none~gge7991~0#@$P~show~0~1~915~-365~180~gge7992~0^^915~-365^^M 915 -365 h 4~#8D2323^^0~928~-362~0~1~start~~~#8D2323^^1~919~-366~0~1~end~~~#8D2323^^1~922~-365^^0~M 925 -362 L 928 -365 L 925 -368#@$P~show~0~3~915~-355~180~gge7999~0^^915~-355^^M 915 -355 h 4~#8D2323^^0~928~-352~0~3~start~~~#8D2323^^1~919~-356~0~3~end~~~#8D2323^^1~922~-355^^0~M 925 -352 L 928 -355 L 925 -358#@$P~show~0~5~915~-345~180~gge8006~0^^915~-345^^M 915 -345 h 4~#8D2323^^0~928~-342~0~5~start~~~#8D2323^^1~919~-346~0~5~end~~~#8D2323^^1~922~-345^^0~M 925 -342 L 928 -345 L 925 -348#@$P~show~0~2~945~-365~0~gge8013~0^^945~-365^^M 945 -365 h -4~#8D2323^^0~932~-362~0~2~end~~~#8D2323^^1~941~-366~0~2~start~~~#8D2323^^1~938~-365^^0~M 935 -368 L 932 -365 L 935 -362#@$P~show~0~4~945~-355~0~gge8020~0^^945~-355^^M 945 -355 h -4~#8D2323^^0~932~-352~0~4~end~~~#8D2323^^1~941~-356~0~4~start~~~#8D2323^^1~938~-355^^0~M 935 -358 L 932 -355 L 935 -352#@$P~show~0~6~945~-345~0~gge8027~0^^945~-345^^M 945 -345 h -4~#8D2323^^0~932~-342~0~6~end~~~#8D2323^^1~941~-346~0~6~start~~~#8D2323^^1~938~-345^^0~M 935 -348 L 932 -345 L 935 -342","LIB~295~-430~package`MOLEX_PICOBLADE_8P`description``Contributor`DesertBit`sourceId`JjBuMGYgy`timeStamp`1472635423`spicePre`J`spiceSymbolName`MOLEX_PICOBLADE_8P`BOM_Manufacturer Part``~180~0~gge19aefbed2d4ff121~fc117d7fb2fa4d559044936821f94db6~abe5a9481474486593dfb32d8d0fb351~0~~yes~yes#@$T~N~284.5390625~-491.75~0~#000080~Arial~~~~~comment~Display~1~start~gge8639~0~#@$T~P~295.078125~-501.75~0~#000080~Arial~~~~~comment~J3~1~start~gge8641~0~#@$PL~315 -400 315 -490~#8D2323~1~0~none~gge8643~0#@$PL~315 -490 285 -490~#8D2323~1~0~none~gge8644~0#@$PL~285 -490 285 -400~#8D2323~1~0~none~gge8645~0#@$PL~285 -400 315 -400~#8D2323~1~0~none~gge8646~0#@$P~show~0~1~335~-410~0~gge8647~0^^335~-410^^M 335 -410 h -20~#8D2323^^1~312~-407~0~1~end~~~#8D2323^^1~321~-411~0~1~start~~~#8D2323^^0~318~-410^^0~M 315 -413 L 312 -410 L 315 -407#@$P~show~0~2~335~-420~0~gge8654~0^^335~-420^^M 335 -420 h -20~#8D2323^^1~312~-417~0~2~end~~~#8D2323^^1~321~-421~0~2~start~~~#8D2323^^0~318~-420^^0~M 315 -423 L 312 -420 L 315 -417#@$P~show~0~3~335~-430~0~gge8661~0^^335~-430^^M 335 -430 h -20~#8D2323^^1~312~-427~0~3~end~~~#8D2323^^1~321~-431~0~3~start~~~#8D2323^^0~318~-430^^0~M 315 -433 L 312 -430 L 315 -427#@$P~show~0~4~335~-440~0~gge8668~0^^335~-440^^M 335 -440 h -20~#8D2323^^1~312~-437~0~4~end~~~#8D2323^^1~321~-441~0~4~start~~~#8D2323^^0~318~-440^^0~M 315 -443 L 312 -440 L 315 -437#@$P~show~0~1~335~-450~0~gge8675~0^^335~-450^^M 335 -450 h -20~#8D2323^^1~312~-447~0~5~end~~~#8D2323^^1~321~-451~0~5~start~~~#8D2323^^0~318~-450^^0~M 315 -453 L 312 -450 L 315 -447#@$P~show~0~2~335~-460~0~gge8682~0^^335~-460^^M 335 -460 h -20~#8D2323^^1~312~-457~0~6~end~~~#8D2323^^1~321~-461~0~6~start~~~#8D2323^^0~318~-460^^0~M 315 -463 L 312 -460 L 315 -457#@$P~show~0~3~335~-470~0~gge8689~0^^335~-470^^M 335 -470 h -20~#8D2323^^1~312~-467~0~7~end~~~#8D2323^^1~321~-471~0~7~start~~~#8D2323^^0~318~-470^^0~M 315 -473 L 312 -470 L 315 -467#@$P~show~0~4~335~-480~0~gge8696~0^^335~-480^^M 335 -480 h -20~#8D2323^^1~312~-477~0~8~end~~~#8D2323^^1~321~-481~0~8~start~~~#8D2323^^0~318~-480^^0~M 315 -483 L 312 -480 L 315 -477","W~335 -420 360 -420 360 -480~#008800~1~0~none~gge8769~0","T~L~340~-415~0~#0000FF~~4pt~~~~comment~GND~1~start~gge8774~0~pinpart","W~335 -480 360 -480~#008800~1~0~none~gge8776~0","LIB~790~-620~package`IMU9250`BOM_Manufacturer``BOM_Manufacturer Part``BOM_Supplier Part``BOM_Supplier``link``Contributor`Phongnhp`spicePre`U`spiceSymbolName`IMU_9250`~~0~ggeac577a762ea3fc25~bc174898c43b41b89ffbf34ee09b95a5~38386194dc0a477c83fbd24273123f35~0~~yes~yes#@$T~N~743.484375~-692~0~#000080~Arial~~~~~comment~IMU_9250~1~start~gge10051~0~#@$T~P~758.0390625~-702.5~0~#000080~Arial~~~~~comment~U2~1~start~gge10053~0~#@$P~show~0~1~700~-680~180~gge10055~0^^700~-680^^M 700 -680 h 20~#880000^^1~722~-677~0~VCC~start~~~#0000FF^^1~715~-681~0~1~end~~~#0000FF^^0~717~-680^^0~M 720 -677 L 723 -680 L 720 -683#@$P~show~0~2~700~-660~180~gge10062~0^^700~-660^^M 700 -660 h 20~#880000^^1~722~-657~0~GND~start~~~#0000FF^^1~715~-661~0~2~end~~~#0000FF^^0~717~-660^^0~M 720 -657 L 723 -660 L 720 -663#@$P~show~0~3~700~-640~180~gge10069~0^^700~-640^^M 700 -640 h 20~#880000^^1~722~-637~0~SCL~start~~~#0000FF^^1~715~-641~0~3~end~~~#0000FF^^0~717~-640^^0~M 720 -637 L 723 -640 L 720 -643#@$P~show~0~4~700~-620~180~gge10076~0^^700~-620^^M 700 -620 h 20~#880000^^1~722~-617~0~SDA~start~~~#0000FF^^1~715~-621~0~4~end~~~#0000FF^^0~717~-620^^0~M 720 -617 L 723 -620 L 720 -623#@$P~show~0~5~700~-600~180~gge10083~0^^700~-600^^M 700 -600 h 20~#880000^^1~722~-597~0~ECL~start~~~#0000FF^^1~715~-601~0~5~end~~~#0000FF^^0~717~-600^^0~M 720 -597 L 723 -600 L 720 -603#@$P~show~0~6~700~-580~180~gge10090~0^^700~-580^^M 700 -580 h 20~#880000^^1~722~-577~0~EDA~start~~~#0000FF^^1~715~-581~0~6~end~~~#0000FF^^0~717~-580^^0~M 720 -577 L 723 -580 L 720 -583#@$P~show~0~7~700~-560~180~gge10097~0^^700~-560^^M 700 -560 h 20~#880000^^1~722~-557~0~AD0~start~~~#0000FF^^1~715~-561~0~7~end~~~#0000FF^^0~717~-560^^0~M 720 -557 L 723 -560 L 720 -563#@$P~show~0~8~700~-540~180~gge10104~0^^700~-540^^M 700 -540 h 20~#880000^^1~722~-537~0~INT~start~~~#0000FF^^1~715~-541~0~8~end~~~#0000FF^^0~717~-540^^0~M 720 -537 L 723 -540 L 720 -543#@$P~show~0~9~700~-520~180~gge10111~0^^700~-520^^M 700 -520 h 20~#880000^^1~722~-517~0~NCS~start~~~#0000FF^^1~715~-521~0~9~end~~~#0000FF^^0~717~-520^^0~M 720 -517 L 723 -520 L 720 -523#@$P~show~0~10~700~-500~180~gge10118~0^^700~-500^^M 700 -500 h 20~#880000^^1~722~-497~0~FSYNC~start~~~#0000FF^^1~715~-501~0~10~end~~~#0000FF^^0~717~-500^^0~M 720 -497 L 723 -500 L 720 -503#@$R~720~-690~~~110~200~#000000~1~0~none~gge10125~0~#@$T~L~745.52~-584.75~0~#0000FF~~10pt~bold~normal~~comment~IMU_9250~1~start~gge10126~0~pinpart","O~700~-600~gge10209~M 696 -604 L 704 -596 M 704 -604 L 696 -596~#33cc33~0","O~700~-580~gge10211~M 696 -584 L 704 -576 M 704 -584 L 696 -576~#33cc33~0","O~700~-560~gge10213~M 696 -564 L 704 -556 M 704 -564 L 696 -556~#33cc33~0","O~700~-540~gge10215~M 696 -544 L 704 -536 M 704 -544 L 696 -536~#33cc33~0","O~700~-520~gge10217~M 696 -524 L 704 -516 M 704 -524 L 696 -516~#33cc33~0","O~700~-500~gge10219~M 696 -504 L 704 -496 M 704 -504 L 696 -496~#33cc33~0","W~260 -540 240 -540 240 -510~#008800~1~0~none~gge10223~0","LIB~135~-475~package`M1X2`Contributor`Nemo Capitano`spicePre`J`spiceSymbolName`CON_HEADER_1X02-PTH`BOM_Manufacturer Part``~~0~gge47ec3a850f2d689e~4c8cadf21a8948738149a2ad5bb40c24~d3e19c3068574fa0b89c92528028b98d~0~~yes~yes#@$T~N~118.8671875~-491.75~0~#000080~Arial~~~~~comment~MAIN BAT~1~start~gge10236~0~#@$T~P~130.92~-501~0~#000080~Arial~~~~~comment~J4~1~start~gge10238~0~#@$PL~125.84 -489 145.84 -489~#A54B4B~1.6~0~none~gge10240~0#@$PL~145.84 -489 145.84 -459~#A54B4B~1.6~0~none~gge10241~0#@$PL~145.84 -459 125.84 -459~#A54B4B~1.6~0~none~gge10242~0#@$PL~125.84 -459 125.84 -489~#A54B4B~1.6~0~none~gge10243~0#@$P~show~3~1~131~-479~180~gge10244~0^^131~-479^^M 131 -479 h 3.842~#A54B4B^^0~150.53~-476.047~0~1~start~~4.5pt~#A54B4B^^1~134.78~-480.97~0~1~end~~4.5pt~#A54B4B^^1~137~-479^^0~M 140 -476 L 143 -479 L 140 -482#@$P~show~3~2~131~-469~180~gge10251~0^^131~-469^^M 131 -469 h 3.842~#A54B4B^^0~150.53~-466.047~0~2~start~~4.5pt~#A54B4B^^1~134.78~-470.97~0~2~end~~4.5pt~#A54B4B^^1~137~-469^^0~M 140 -466 L 143 -469 L 140 -472","W~131 -479 185 -479 185 -550 260 -550~#008800~1~0~none~gge10284~0","W~131 -469 240 -469~#008800~1~0~none~gge10285~0","T~L~340~-475~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10291~0~pinpart","T~L~150~-460~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10294~0~pinpart","T~L~255~-530~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10297~0~pinpart","T~L~150~-485~0~#0000FF~~4pt~~~~comment~BAT +~1~start~gge10300~0~pinpart","T~L~250~-555~0~#0000FF~~4pt~~~~comment~BAT +~1~start~gge10303~0~pinpart","W~155 -680 280 -680~#008800~1~0~none~gge10313~0","W~125 -680 125 -730 225 -730~#008800~1~0~none~gge10315~0","T~L~110~-695~0~#0000FF~~4pt~~~~comment~VCC~1~start~gge10318~0~pinpart","T~L~165~-685~0~#0000FF~~4pt~~~~comment~PSENSOR~1~start~gge10321~0~pinpart","W~155 -660 270 -660 270 -715 360 -715~#008800~1~0~none~gge10323~0","T~L~165~-655~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10326~0~pinpart","W~125 -670 110 -670 110 -770 910 -770 910 -455 820 -455~#008800~1~0~none~gge10328~0","W~155 -670 235 -670 235 -780 920 -780 915 -435 820 -435~#008800~1~0~none~gge10336~0","W~125 -660 100 -660 100 -790 930 -790 930 -445 820 -445~#008800~1~0~none~gge10337~0","W~945 -345 970 -345 970 -485 665 -485~#008800~1~0~none~gge10338~0","W~820 -385 960 -385 960 -365 945 -365~#008800~1~0~none~gge10340~0","W~820 -295 870 -295 870 -355 915 -355~#008800~1~0~none~gge10341~0","W~820 -395 880 -395 880 -325 960 -325 960 -355 945 -355~#008800~1~0~none~gge10343~0","W~820 -305 895 -305 895 -345 915 -345~#008800~1~0~none~gge10344~0","W~915 -365 895 -365 895 -475 655 -475~#008800~1~0~none~gge10345~0","LIB~278~-544~package`S2B-PH-SM4-TB`Contributor`andyfilms`spicePre`X`spiceSymbolName`S2B-PH-SM4-TB`BOM_Manufacturer Part``~180~0~gge12fa8dc00f010d07~ffe5780e60fc43f3861153d7ff9fe849~1c47b77e6d1948b89e39b944cd2029a5~0~~yes~yes#@$T~N~274.28125~-565.84375~0~#000080~Arial~~~~~comment~BAT~1~start~gge10431~0~#@$T~P~277.44~-575.85~0~#000080~Arial~~~~~comment~X1~1~start~gge10433~0~#@$PL~274.68 -560 294.68 -560~#EBEB37~1.6~0~none~gge10435~0#@$PL~284.68 -540 279.68 -540~#EBEB37~2.4~0~none~gge10436~0#@$PL~284.68 -550 279.68 -550~#EBEB37~2.4~0~none~gge10437~0#@$PL~294.68 -530 294.68 -560~#EBEB37~1.6~0~none~gge10438~0#@$PL~274.68 -560 274.68 -530~#EBEB37~1.6~0~none~gge10439~0#@$PL~294.68 -530 274.68 -530~#EBEB37~1.6~0~none~gge10440~0#@$P~show~3~1~260~-550~180~gge10441~0^^260~-550^^M 260 -550 h 19.685~#EBEB37^^0~289.21~-547.047~0~1~start~~4.5pt~#EBEB37^^1~267.56~-551.969~0~1~end~~4.5pt~#EBEB37^^0~276~-550^^0~M 279 -547 L 282 -550 L 279 -553#@$P~show~3~2~260~-540~180~gge10448~0^^260~-540^^M 260 -540 h 19.685~#EBEB37^^0~289.21~-537.047~0~2~start~~4.5pt~#EBEB37^^1~267.56~-541.969~0~2~end~~4.5pt~#EBEB37^^0~276~-540^^0~M 279 -537 L 282 -540 L 279 -543","N~185~-535~0~#0000ff~BAT~gge10482~start~187~-537.5~Times New Roman~7pt~0","O~475~-580~gge10488~M 471 -584 L 479 -576 M 479 -584 L 471 -576~#33cc33~0","O~475~-600~gge10490~M 471 -604 L 479 -596 M 479 -604 L 471 -596~#33cc33~0","O~475~-620~gge10492~M 471 -624 L 479 -616 M 479 -624 L 471 -616~#33cc33~0","O~515~-660~gge10498~M 511 -664 L 519 -656 M 519 -664 L 511 -656~#33cc33~0","O~515~-620~gge10500~M 511 -624 L 519 -616 M 519 -624 L 511 -616~#33cc33~0","W~540 -230 825 -230 825 -405 820 -405~#008800~1~0~none~gge10506~0","W~680 -375 655 -375 655 -445~#008800~1~0~none~gge10509~0","J~665~-560~2.5~#CC0000~gge3623~0","J~645~-540~2.5~#CC0000~gge3632~0","J~665~-660~2.5~#CC0000~gge3656~0","J~665~-435~2.5~#CC0000~gge3669~0","J~655~-455~2.5~#CC0000~gge3673~0","J~635~-520~2.5~#CC0000~gge3677~0","J~665~-600~2.5~#CC0000~gge5804~0","J~665~-695~2.5~#CC0000~gge5806~0","J~625~-680~2.5~#CC0000~gge5808~0","J~360~-640~2.5~#CC0000~gge7127~0","J~360~-610~2.5~#CC0000~gge7179~0","J~360~-510~2.5~#CC0000~gge7181~0","J~665~-425~2.5~#CC0000~gge7192~0","J~665~-405~2.5~#CC0000~gge7194~0","J~665~-395~2.5~#CC0000~gge7196~0","J~225~-260~2.5~#CC0000~gge7560~0","J~225~-250~2.5~#CC0000~gge7562~0","J~240~-230~2.5~#CC0000~gge7566~0","J~440~-80~2.5~#CC0000~gge7568~0","J~575~-290~2.5~#CC0000~gge7570~0","J~575~-270~2.5~#CC0000~gge7572~0","J~385~-450~2.5~#CC0000~gge7574~0","J~395~-440~2.5~#CC0000~gge7576~0","J~405~-430~2.5~#CC0000~gge7578~0","J~360~-480~2.5~#CC0000~gge8770~0","J~655~-680~2.5~#CC0000~gge10208~0","J~240~-510~2.5~#CC0000~gge10306~0","J~280~-680~2.5~#CC0000~gge10314~0","J~225~-730~2.5~#CC0000~gge10316~0","J~360~-715~2.5~#CC0000~gge10324~0","J~665~-485~2.5~#CC0000~gge10339~0","J~655~-475~2.5~#CC0000~gge10346~0","J~240~-469~2.5~#CC0000~gge10286~0","J~625~-280~2.5~#CC0000~gge10505~0","J~655~-445~2.5~#CC0000~gge10510~0"],"BBox":{"x":0,"y":-806.8,"width":1149,"height":807.4},"colors":{}}}],"BOM":[["Value","Quantity","Package","Components","CustomPara"],["MCP23017",1,"MCP23017","U3",{"BOM_Manufacturer":"","BOM_Manufacturer Part":"MCP23017","BOM_Supplier Part":"","BOM_Supplier":"","puuid":"f09420c4fd9946a583a6b15c1c5a483e","uuid":"0f118b0d9063400da84e04b55532a171"}],["BAT",1,"S2B-PH-SM4-TB","X1",{"BOM_Manufacturer Part":"","puuid":"ffe5780e60fc43f3861153d7ff9fe849","uuid":"1c47b77e6d1948b89e39b944cd2029a5"}],["10kΊ",2,"RES-TH_BD1.8-L3.2-P7.20-D0.4","R2,R3",{"BOM_Supplier":"LCSC","BOM_Supplier Part":"C714232","BOM_Manufacturer":"Huaxing Mechanical-Elec.","BOM_Manufacturer Part":"CF1/6W-10KΊ¹5%T52","puuid":"97467e7cb6374f7e9dd7fc644a47cfb1","uuid":"2ba8a26395ab41a2a00f577110f8f3f7"}],["LEFT IO",1,"M2X3","J1",{"BOM_Manufacturer Part":"","puuid":"1a95e0cd8cf04abab1f0a955e387d9de","uuid":"4cf556fe97124ad8934102a1b113e234"}],["RIGHT IO",1,"M2X3","J2",{"BOM_Manufacturer Part":"","puuid":"1a95e0cd8cf04abab1f0a955e387d9de","uuid":"4cf556fe97124ad8934102a1b113e234"}],["DWM1000",1,"WIRELM-TH_DWM1000","U5",{"BOM_Supplier":"LCSC","BOM_Manufacturer":"DecaWave","BOM_Manufacturer Part":"DWM1000","BOM_Supplier Part":"C95238","puuid":"921ff2190df246a4b1016c11071a51a1","uuid":"605f956fd8c24817bb840fda3296ca74"}],["MAIN BOARD",1,"TTGO-T-BEAM-ESP32-CONNECTOR","U1",{"BOM_Manufacturer":"","BOM_Manufacturer Part":"","BOM_Supplier Part":"","BOM_Supplier":"","puuid":"5180c2e0c1da4a75b575a8495aee30f2","uuid":"5657e928f1504b21b9e68062d66ba3e3"}],["IMU_9250",1,"IMU9250","U2",{"BOM_Manufacturer":"","BOM_Manufacturer Part":"","BOM_Supplier Part":"","BOM_Supplier":"","puuid":"bc174898c43b41b89ffbf34ee09b95a5","uuid":"38386194dc0a477c83fbd24273123f35"}],["Display",1,"MOLEX_PICOBLADE_8P","J3",{"BOM_Manufacturer Part":"","puuid":"fc117d7fb2fa4d559044936821f94db6","uuid":"abe5a9481474486593dfb32d8d0fb351"}],["MAIN BAT",1,"M1X2","J4",{"BOM_Manufacturer Part":"","puuid":"4c8cadf21a8948738149a2ad5bb40c24","uuid":"d3e19c3068574fa0b89c92528028b98d"}]],"components":{"5657e928f1504b21b9e68062d66ba3e3":1,"0f118b0d9063400da84e04b55532a171":1,"2ba8a26395ab41a2a00f577110f8f3f7":2,"605f956fd8c24817bb840fda3296ca74":1,"4cf556fe97124ad8934102a1b113e234":2,"abe5a9481474486593dfb32d8d0fb351":1,"38386194dc0a477c83fbd24273123f35":1,"d3e19c3068574fa0b89c92528028b98d":1,"1c47b77e6d1948b89e39b944cd2029a5":1}} \ No newline at end of file diff --git a/pcb/AirsoftTracker 1.4/AirsoftTracker.json b/pcb/AirsoftTracker 1.4/AirsoftTracker.json new file mode 100644 index 0000000..f237396 --- /dev/null +++ b/pcb/AirsoftTracker 1.4/AirsoftTracker.json @@ -0,0 +1 @@ +{"editorVersion":"6.4.7","docType":"5","title":"AirsoftTracker","description":"","colors":{},"schematics":[{"uuid":"59e43b64d1eaf50fe48821f12a6a0922","docType":"1","title":"MainSheet","description":"","dataStr":{"head":{"docType":"1","editorVersion":"6.4.7","newgId":true,"c_para":{"Prefix Start":"1"},"c_spiceCmd":"null","hasIdFlag":true,"uuid":"59e43b64d1eaf50fe48821f12a6a0922","x":"0","y":"0","portOfADImportHack":"","importFlag":0,"transformList":""},"canvas":"CA~1000~1000~#FFFFFF~yes~#CCCCCC~5~1000~1000~line~5~pixel~5~0~0","shape":["LIB~0~-806~package`NONE`BOM_Manufacturer Part`?`spicePre`.`~~0~frame_lib_1~~~0~~yes~yes#@$T~N~570.5~-809~0~#000080~Arial~~~~~comment~A~0~start~gge77~0~#@$PT~M 206 -796 L 206 -806 M 206 -10 L 206 0 M 402 -796 L 402 -806 M 402 -10 L 402 0 M 598 -796 L 598 -806 M 598 -10 L 598 0 M 794 -796 L 794 -806 M 794 -10 L 794 0 M 990 -796 L 990 -806 M 990 -10 L 990 0 M 10 -600 L 0 -600 M 1139 -600 L 1149 -600 M 10 -404 L 0 -404 M 1139 -404 L 1149 -404 M 10 -208 L 0 -208 M 1139 -208 L 1149 -208 M 10 -12 L 0 -12 M 1139 -12 L 1149 -12~#880000~1~0~none~gge6~0~frame_tick#@$T~P~571.5~-818~0~#000080~Arial~~~~~comment~A~0~start~gge76~0~#@$T~L~1.5~-698~0~#880000~~~~~~comment~A~1~start~gge7~0~frame_tick#@$T~L~1140.5~-698~0~#880000~~~~~~comment~A~1~start~gge9~0~frame_tick#@$T~L~1.5~-502~0~#880000~~~~~~comment~B~1~start~gge11~0~frame_tick#@$T~L~1140.5~-502~0~#880000~~~~~~comment~B~1~start~gge13~0~frame_tick#@$T~L~1.5~-306~0~#880000~~~~~~comment~C~1~start~gge15~0~frame_tick#@$T~L~1140.5~-306~0~#880000~~~~~~comment~C~1~start~gge17~0~frame_tick#@$T~L~1.5~-110~0~#880000~~~~~~comment~D~1~start~gge19~0~frame_tick#@$T~L~1140.5~-110~0~#880000~~~~~~comment~D~1~start~gge21~0~frame_tick#@$T~L~108~-797.5~0~#880000~~~~~~comment~1~1~start~gge23~0~frame_tick#@$T~L~108~-1.5~0~#880000~~~~~~comment~1~1~start~gge25~0~frame_tick#@$T~L~304~-797.5~0~#880000~~~~~~comment~2~1~start~gge27~0~frame_tick#@$T~L~304~-1.5~0~#880000~~~~~~comment~2~1~start~gge29~0~frame_tick#@$T~L~500~-797.5~0~#880000~~~~~~comment~3~1~start~gge31~0~frame_tick#@$T~L~500~-1.5~0~#880000~~~~~~comment~3~1~start~gge33~0~frame_tick#@$T~L~696~-797.5~0~#880000~~~~~~comment~4~1~start~gge35~0~frame_tick#@$T~L~696~-1.5~0~#880000~~~~~~comment~4~1~start~gge37~0~frame_tick#@$T~L~892~-797.5~0~#880000~~~~~~comment~5~1~start~gge39~0~frame_tick#@$T~L~892~-1.5~0~#880000~~~~~~comment~5~1~start~gge?~0~frame_tick#@$R~10~-796~~~1129~786~#880000~1~0~none~gge42~0~frame_innerbox#@$R~0~-806~~~1149~806~#880000~1~0~none~gge43~0~frame_outbox#@$R~694.99995~-90~~~444~80~#880000~1~0~none~gge44~0~frame_hitarea#@$PL~695.1 -50.75 1138.63 -50.75~#880000~1~0~none~gge45~0#@$PL~799.63 -30.75 1138.63 -30.75~#880000~1~0~none~gge46~0#@$PL~1059.61 -89.93 1059.63 -50.75~#880000~1~0~none~gge47~0#@$PL~1059.63 -50.75 1059.63 -30.75~#880000~1~0~none~gge48~0#@$T~L~699.99995~-77~0~#880000~~8pt~~~~comment~TITLE:~1~start~gge49~0~pinpart#@$T~L~757.62495~-64.41~0~#0000FF~~10pt~~~~comment~Airsoft Tracker~1~start~gge51~0~frame_title#@$T~L~1064.62495~-63.75~0~#880000~~8pt~~~~comment~REV:~1~start~gge53~0~pinpart#@$T~L~1102.62495~-63.75~0~#0000FF~~9pt~~~~comment~1.0~1~start~gge55~0~frame_version#@$T~L~804.62495~-15~0~#880000~~8pt~~~~comment~Date:~1~start~gge57~0~pinpart#@$T~L~851.62495~-14.52~0~#0000FF~~9pt~~~~comment~2021-01-15~1~start~gge59~0~frame_date#@$T~L~1063.62495~-35~0~#880000~~8pt~~~~comment~Sheet:~1~start~gge61~0~pinpart#@$T~L~1108.62495~-34.52~0~#0000FF~~9pt~~~~comment~1/1~1~start~gge63~0~frame_sheet#@$T~L~943.62495~-14.75~0~#880000~~8pt~~~~comment~Drawn By:~1~start~gge65~0~pinpart#@$T~L~1008.63~-14.75~0~#0000FF~~9pt~~~~comment~ddv2020~1~start~gge67~0~frame_drawn#@$T~L~804.62495~-36.75~0~#880000~~8pt~~~~comment~Company:~1~start~gge69~0~pinpart#@$T~L~871.24995~-36.64~0~#0000FF~~9pt~~~~comment~DDV~1~start~gge71~0~frame_company#@$PL~799.63 -50.75 799.63 -10.75~#880000~1~0~none~gge73~0#@$Pimage~L~1~gge74~0~gge75~694.99995~-38~104~20~data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0i5Zu+5bGCXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNTIwIg0KCSB2aWV3Qm94PSIwIDAgMTY5Mi45IDM0MS41IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxNjkyLjkgMzQxLjU7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiM1NTg4RkY7fQ0KPC9zdHlsZT4NCjxnPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik05MDEuNywxNjEuMWMyLjMtMS44LDUuMS0yLjcsOC4zLTIuN2M0LjMsMCw4LjksMS42LDEzLjgsNC43YzQuOSwzLjEsOS42LDgsMTQuMSwxNC43bDE3LjQtMjcuOQ0KCQljLTUuNC03LjgtMTIuMS0xMy45LTIwLjItMTguMmMtOC4xLTQuMy0xNi43LTYuNC0yNS43LTYuNGMtMTIuOCwwLTI0LDMuOS0zMy40LDExLjdjLTkuNCw3LjgtMTQuMSwxOC0xNC4xLDMwLjQNCgkJYzAsOC45LDMsMTcuNCw5LDI1LjRjNC4zLDUuNywxMi4xLDEyLjYsMjMuMywyMC42YzkuNyw2LjksMTUuNywxMS43LDE3LjksMTQuNGMyLjIsMi43LDMuMyw1LjMsMy4zLDcuOWMwLDMuMi0xLjQsNS45LTQuMyw4LjMNCgkJYy0yLjksMi4zLTYuNywzLjUtMTEuNSwzLjVjLTEyLjEsMC0yMy4zLTYuNy0zMy41LTIwLjJsLTIyLjUsMjYuMmMxMCwxMC42LDE5LjEsMTgsMjcuMiwyMmM4LjEsNCwxNy4yLDYsMjcuMSw2DQoJCWMxNy4yLDAsMzAuMy00LjksMzkuNC0xNC43YzkuMS05LjgsMTMuNi0yMC4zLDEzLjYtMzEuM2MwLTguNC0yLjItMTYuMS02LjYtMjMuM2MtNC40LTcuMS0xMy42LTE1LjctMjcuNi0yNS43DQoJCWMtOC44LTYuMy0xNC0xMC41LTE1LjctMTIuN2MtMS44LTIuMi0yLjctNC40LTIuNy02LjZDODk4LjIsMTY0LjksODk5LjQsMTYyLjksOTAxLjcsMTYxLjF6Ii8+DQoJPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxMDM4LjcsMjE3LjIgMTAwOS44LDEyOS4xIDk3NCwxMjkuMSAxMDE1LjgsMjU3LjQgOTczLjYsMzMyIDEwMTIuMSwzMzIgMTEyOC44LDEyOS4xIDEwODkuNSwxMjkuMSAJDQoJCSIvPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02NTEuNSwxNTQuMWwtNzAuNCwwbDUuOC00MS43YzAsMCw3NC43LTAuMSw3NS4xLTAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44YzAtOS44LTgtMTcuOC0xNy44LTE3LjgNCgkJYy0wLjMsMC0xMDguNCwwLTEwOC40LDBMNTI2LDI3Ny43aDExMy4ydjBjOS41LTAuMiwxNy4yLTgsMTcuMi0xNy41YzAtOS43LTcuOS0xNy42LTE3LjYtMTcuNmMtMC40LDAtNzAuMiwwLjEtNzAuMiwwLjFsNy40LTUzLjMNCgkJYzAsMCw3MS43LDAuMSw3Mi4zLDAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44QzY2Ni4zLDE2Mi44LDY1OS45LDE1NS41LDY1MS41LDE1NC4xeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMjY4LjQsNzYuOGMtMC4zLDAtMTA4LjQsMC0xMDguNCwwbC0yNy40LDIwMC44aDExMy4zdjBjOS41LTAuMiwxNy4yLTgsMTcuMi0xNy41YzAtOS43LTcuOS0xNy42LTE3LjYtMTcuNg0KCQljLTAuNCwwLTcwLjIsMC4xLTcwLjIsMC4xbDcuNC01My4zYzAsMCw3MS43LDAuMSw3Mi40LDAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44YzAtOC44LTYuNC0xNi4xLTE0LjgtMTcuNWwtNzAuNCwwbDUuOC00MS43DQoJCWMwLDAsNzQuNy0wLjEsNzUuMS0wLjFjOS44LDAsMTcuOC04LDE3LjgtMTcuOEMxMjg2LjIsODQuOCwxMjc4LjMsNzYuOCwxMjY4LjQsNzYuOHoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTQ3MC43LDE3M2MwLTE5LjctNC42LTM3LjItMTMuNy01Mi4zYy05LjEtMTUuMS0yMC45LTI2LjItMzUuNS0zMy4yYy0xNC42LTcuMS0zNi43LTEwLjYtNjYuNi0xMC42aC0zMS44DQoJCWwtMjcuNCwyMDAuOGg2Mi40YzI2LjIsMCw0Ni43LTMuOSw2MS40LTExLjdjMTQuNy03LjgsMjctMjAuMiwzNi43LTM3LjFDMTQ2NS45LDIxMS45LDE0NzAuNywxOTMuMywxNDcwLjcsMTczeiBNMTQyMS4zLDIxNC41DQoJCWMtNy4zLDExLTE2LjksMTguOC0yOC45LDIzLjNjLTguNiwzLjItMjIuNCw0LjgtNDEuNSw0LjhoLTEyLjRsMTcuNy0xMzAuNGg5LjVjMTUuNSwwLDI3LjksMi40LDM3LjIsNy4zDQoJCWM5LjMsNC45LDE2LjUsMTEuOCwyMS43LDIwLjhjNS4xLDksNy43LDIwLjEsNy43LDMzLjRDMTQzMi4yLDE4OS44LDE0MjguNiwyMDMuNSwxNDIxLjMsMjE0LjV6Ii8+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTE2MTkuMiwxNzAuN2wtMjIuMywxMi4zYy0xLjgsMTYuMi0xNS42LDI4LjctMzIuMiwyOC43Yy0xNy45LDAtMzIuNC0xNC41LTMyLjQtMzIuNA0KCQljMC0xNy45LDE0LjUtMzIuNCwzMi40LTMyLjRjNi45LDAsMTMuMywyLjIsMTguNSw1LjhsMjcuNy0xNS4zbC0xNS02MC4yaC0zMS43bC0xMDgsMjAwaDQwLjRsMjIuOC00Mi42aDc5LjRsMTAuNiw0Mi42aDM2LjQNCgkJTDE2MTkuMiwxNzAuN3oiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTU1Mi44LDE3OC41YzAsNi45LDUuNiwxMi41LDEyLjUsMTIuNWM2LjksMCwxMi41LTUuNiwxMi41LTEyLjVjMC02LjktNS42LTEyLjUtMTIuNS0xMi41DQoJCUMxNTU4LjQsMTY2LDE1NTIuOCwxNzEuNiwxNTUyLjgsMTc4LjV6Ii8+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTgxNC44LDE1Mi41QzgxNC44LDE1Mi41LDgxNC44LDE1Mi40LDgxNC44LDE1Mi41bC0xMi41LDBsLTEuMy0yLjRjLTUuMS04LjEtMTEuNS0xNC4yLTE5LjItMTguNA0KCQljLTcuOC00LjItMjAuMS02LjMtMjkuMy02LjNjLTEzLjcsMC0yNi44LDMuNy0zOS4zLDExLjFjLTEyLjUsNy40LTIyLjUsMTcuNy0yOS45LDMxYy03LjQsMTMuMi0xMS4yLDI3LjItMTEuMiw0MS44DQoJCWMwLDE5LjIsNS44LDM2LDE3LjQsNTAuNWMxMS42LDE0LjUsMjcuMywyMS43LDQ3LDIxLjdjOC42LDAsMTYuMy0xLjQsMjMuMi00LjRjNi45LTIuOSwxNC4zLTgsMjIuMi0xNS40YzAsMCw5LjMsOC4xLDkuNCw4DQoJCWM1LjgsNC42LDEzLDcuNSwyMC44LDhoMy42bDAuNS00LjNsMTIuNy0xMDYuOWMtMC4xLDAtMC4xLDAtMC4yLDBDODI4LjcsMTU4LjgsODIyLjUsMTUyLjYsODE0LjgsMTUyLjV6IE03ODUuNiwyMjQuMg0KCQljLTQuNSw4LjUtMTAuMSwxNC44LTE2LjgsMTguOGMtNi43LDQtMTQuNSw2LTIzLjUsNmMtMTAuOCwwLTE5LjYtMy41LTI2LjUtMTAuN2MtNi45LTcuMS0xMC4zLTE2LjUtMTAuMy0yOC4xDQoJCWMwLTE1LjEsNC41LTI3LjQsMTMuNi0zN2M5LjEtOS42LDIwLjEtMTQuMywzMy4xLTE0LjNjMTEuMiwwLDIwLjIsMy42LDI3LDEwLjdjNi44LDcuMiwxMC4yLDE2LjYsMTAuMiwyOC40DQoJCUM3OTIuNCwyMDYuOSw3OTAuMSwyMTUuNyw3ODUuNiwyMjQuMnoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNNDA0LjMsOTYuM2MtNy41LTE5LjktMTkuNy0zNy44LTM1LjgtNTIuM2MtMjQuNy0yMi4yLTU2LjctMzQuNS05MC0zNC41Yy0yOC44LDAtNTYuMyw5LTc5LjUsMjYNCgkJYy0xMS4yLDguMi0yMC45LDE3LjktMjguOSwyOC45Yy01LTAuNy0xMC4xLTEuMS0xNS4zLTEuMWMtMjguNywwLTU1LjgsMTEuMi03Ni4xLDMxLjVjLTIwLjMsMjAuMy0zMS41LDQ3LjMtMzEuNSw3Ni4xDQoJCWMwLDI2LjcsOS45LDUyLjMsMjcuOCw3Mi4xYzE0LjIsMTUuNywzMi42LDI2LjgsNTIuOSwzMmM4LjgsMjYuMiwzMy42LDQ1LjEsNjIuNyw0NS4xYzM2LjUsMCw2Ni4yLTI5LjcsNjYuMi02Ni4yDQoJCWMwLTIuMS0wLjEtNC4zLTAuMy02LjRsOTIuOS00OC44bC0yMC4zLTM1LjJsLTg4LjgsNDYuNmMtMTIuMS0xMy44LTI5LjktMjIuNS00OS43LTIyLjVjLTI4LjcsMC01My4yLDE4LjQtNjIuNCw0NA0KCQljLTIzLjQtMTAuMy0zOS44LTMzLjYtMzkuOC02MC44YzAtMzYuNiwyOS43LTY2LjQsNjYuNC02Ni40YzEyLjksMCwyNSwzLjcsMzUuMiwxMC4xYzEyLjMtMzcuMSw0Ny4zLTYzLjksODguNS02My45DQoJCWM0OCwwLDg3LjQsMzYuMiw5Mi43LDgyLjdjMS43LTAuMiwzLjQtMC4zLDUuMS0wLjNjMjguNywwLDUyLDIzLjMsNTIsNTJjMCwyNy4yLTIwLjksNDkuNS00Ny41LDUxLjhsLTI5LjcsMA0KCQljLTEuMy0wLjMtMi43LTAuNC00LjEtMC40Yy0xMS41LDAtMjAuOCw5LjMtMjAuOCwyMC44YzAsMTAuOSw4LjQsMTkuOCwxOS4xLDIwLjd2MC4ybDM1LjUsMGwxLjgsMGwxLjgtMC4yDQoJCWMyMy4yLTIsNDQuNy0xMi41LDYwLjUtMjkuN2MxNS45LTE3LjMsMjQuNy0zOS43LDI0LjctNjMuMkM0NjkuNiwxNDMuNiw0NDIuMSwxMDguMiw0MDQuMyw5Ni4zeiBNMTkwLjYsMjI4LjMNCgkJYzE0LjEsMCwyNS42LDExLjUsMjUuNiwyNS42YzAsMTQuMS0xMS41LDI1LjYtMjUuNiwyNS42Yy0xNC4xLDAtMjUuNi0xMS41LTI1LjYtMjUuNkMxNjUsMjM5LjgsMTc2LjUsMjI4LjMsMTkwLjYsMjI4LjN6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==","LIB~505~-570~package`TTGO-T-BEAM-ESP32-CONNECTOR`BOM_Manufacturer``BOM_Manufacturer Part``BOM_Supplier Part``BOM_Supplier``link``Contributor`grizli2509`spicePre`U`spiceSymbolName`TTGO-BEAM-ESP32`Package Display`No`~~0~gge6aaff6c194964e3d~5180c2e0c1da4a75b575a8495aee30f2~5657e928f1504b21b9e68062d66ba3e3~0~~yes~yes#@$T~N~470.46~-721.7890625~0~#000080~Arial~~~~~comment~MAIN BOARD~1~start~gge857~0~#@$T~P~494.04~-732.125~0~#000080~Arial~~~~~comment~U1~1~start~gge859~0~#@$P~show~0~1~475~-700~~gge861~0^^475~-700^^M 475 -700 h -20~#880000^^1~453~-697~0~S_VP~end~~~#0000FF^^1~460~-701~0~S_VP~start~~~#0000FF^^0~458~-700^^0~M 455 -703 L 452 -700 L 455 -697#@$P~show~0~2~475~-680~~gge868~0^^475~-680^^M 475 -680 h -20~#880000^^1~453~-677~0~S_VN~end~~~#0000FF^^1~460~-681~0~S_VN~start~~~#0000FF^^0~458~-680^^0~M 455 -683 L 452 -680 L 455 -677#@$P~show~0~3~475~-660~~gge875~0^^475~-660^^M 475 -660 h -20~#880000^^1~453~-657~0~RST~end~~~#0000FF^^1~460~-661~0~RST~start~~~#0000FF^^0~458~-660^^0~M 455 -663 L 452 -660 L 455 -657#@$P~show~0~4~475~-640~~gge882~0^^475~-640^^M 475 -640 h -20~#880000^^1~453~-637~0~15~end~~~#0000FF^^1~460~-641~0~15~start~~~#0000FF^^0~458~-640^^0~M 455 -643 L 452 -640 L 455 -637#@$P~show~0~5~475~-620~~gge889~0^^475~-620^^M 475 -620 h -20~#880000^^1~453~-617~0~35~end~~~#0000FF^^1~460~-621~0~35~start~~~#0000FF^^0~458~-620^^0~M 455 -623 L 452 -620 L 455 -617#@$P~show~0~6~475~-600~~gge896~0^^475~-600^^M 475 -600 h -20~#880000^^1~453~-597~0~32~end~~~#0000FF^^1~460~-601~0~32~start~~~#0000FF^^0~458~-600^^0~M 455 -603 L 452 -600 L 455 -597#@$P~show~0~7~475~-580~~gge903~0^^475~-580^^M 475 -580 h -20~#880000^^1~453~-577~0~33~end~~~#0000FF^^1~460~-581~0~33~start~~~#0000FF^^0~458~-580^^0~M 455 -583 L 452 -580 L 455 -577#@$P~show~0~8~475~-560~~gge910~0^^475~-560^^M 475 -560 h -20~#880000^^1~453~-557~0~25~end~~~#0000FF^^1~460~-561~0~25~start~~~#0000FF^^0~458~-560^^0~M 455 -563 L 452 -560 L 455 -557#@$P~show~0~9~475~-540~~gge917~0^^475~-540^^M 475 -540 h -20~#880000^^1~453~-537~0~14~end~~~#0000FF^^1~460~-541~0~14~start~~~#0000FF^^0~458~-540^^0~M 455 -543 L 452 -540 L 455 -537#@$P~show~0~10~475~-520~~gge924~0^^475~-520^^M 475 -520 h -20~#880000^^1~453~-517~0~13~end~~~#0000FF^^1~460~-521~0~13~start~~~#0000FF^^0~458~-520^^0~M 455 -523 L 452 -520 L 455 -517#@$P~show~0~11~475~-500~~gge931~0^^475~-500^^M 475 -500 h -20~#880000^^1~453~-497~0~02~end~~~#0000FF^^1~460~-501~0~02~start~~~#0000FF^^0~458~-500^^0~M 455 -503 L 452 -500 L 455 -497#@$P~show~0~12~475~-480~~gge938~0^^475~-480^^M 475 -480 h -20~#880000^^1~453~-477~0~GND~end~~~#0000FF^^1~460~-481~0~GND_3~start~~~#0000FF^^0~458~-480^^0~M 455 -483 L 452 -480 L 455 -477#@$P~show~0~13~475~-460~~gge945~0^^475~-460^^M 475 -460 h -20~#880000^^1~453~-457~0~5V~end~~~#0000FF^^1~460~-461~0~5V~start~~~#0000FF^^0~458~-460^^0~M 455 -463 L 452 -460 L 455 -457#@$P~show~0~14~515~-460~180~gge952~0^^515~-460^^M 515 -460 h 20~#880000^^1~537~-457~0~LORA1~start~~~#0000FF^^1~530~-461~0~LORA1~end~~~#0000FF^^0~532~-460^^0~M 535 -457 L 538 -460 L 535 -463#@$P~show~0~15~515~-480~180~gge959~0^^515~-480^^M 515 -480 h 20~#880000^^1~537~-477~0~LORA2~start~~~#0000FF^^1~530~-481~0~LORA2~end~~~#0000FF^^0~532~-480^^0~M 535 -477 L 538 -480 L 535 -483#@$P~show~0~16~515~-500~180~gge966~0^^515~-500^^M 515 -500 h 20~#880000^^1~537~-497~0~3V3~start~~~#0000FF^^1~528.33~-501~0~3V3_2~end~~~#0000FF^^0~532~-500^^0~M 535 -497 L 538 -500 L 535 -503#@$P~show~0~17~515~-520~180~gge973~0^^515~-520^^M 515 -520 h 20~#880000^^1~537~-517~0~21~start~~~#0000FF^^1~527.5~-521~0~21~end~~~#0000FF^^0~532~-520^^0~M 535 -517 L 538 -520 L 535 -523#@$P~show~0~18~515~-540~180~gge980~0^^515~-540^^M 515 -540 h 20~#880000^^1~537~-537~0~22~start~~~#0000FF^^1~530~-541~0~22~end~~~#0000FF^^0~532~-540^^0~M 535 -537 L 538 -540 L 535 -543#@$P~show~0~19~515~-560~180~gge987~0^^515~-560^^M 515 -560 h 20~#880000^^1~537~-557~0~GND~start~~~#0000FF^^1~530~-561~0~GND_2~end~~~#0000FF^^0~532~-560^^0~M 535 -557 L 538 -560 L 535 -563#@$P~show~0~20~515~-580~180~gge994~0^^515~-580^^M 515 -580 h 20~#880000^^1~537~-577~0~3V3~start~~~#0000FF^^1~530~-581~0~3V3_1~end~~~#0000FF^^0~532~-580^^0~M 535 -577 L 538 -580 L 535 -583#@$P~show~0~21~515~-600~180~gge1001~0^^515~-600^^M 515 -600 h 20~#880000^^1~537~-597~0~GND~start~~~#0000FF^^1~530~-601~0~GND_1~end~~~#0000FF^^0~532~-600^^0~M 535 -597 L 538 -600 L 535 -603#@$P~show~0~22~515~-620~180~gge1008~0^^515~-620^^M 515 -620 h 20~#880000^^1~537~-617~0~0~start~~~#0000FF^^1~530~-621~0~0~end~~~#0000FF^^0~532~-620^^0~M 535 -617 L 538 -620 L 535 -623#@$P~show~0~23~515~-640~180~gge1015~0^^515~-640^^M 515 -640 h 20~#880000^^1~537~-637~0~4~start~~~#0000FF^^1~530~-641~0~4~end~~~#0000FF^^0~532~-640^^0~M 535 -637 L 538 -640 L 535 -643#@$P~show~0~24~515~-660~180~gge1022~0^^515~-660^^M 515 -660 h 20~#880000^^1~537~-657~0~23~start~~~#0000FF^^1~530~-661~0~23~end~~~#0000FF^^0~532~-660^^0~M 535 -657 L 538 -660 L 535 -663#@$P~show~0~25~515~-680~180~gge1029~0^^515~-680^^M 515 -680 h 20~#880000^^1~537~-677~0~RX~start~~~#0000FF^^1~530~-681~0~RX~end~~~#0000FF^^0~532~-680^^0~M 535 -677 L 538 -680 L 535 -683#@$P~show~0~26~515~-700~180~gge1036~0^^515~-700^^M 515 -700 h 20~#880000^^1~537~-697~0~TX~start~~~#0000FF^^1~530~-701~0~TX~end~~~#0000FF^^0~532~-700^^0~M 535 -697 L 538 -700 L 535 -703#@$R~415~-720~~~170~290~#000000~1~0~none~gge1043~0~","LIB~750~-375~package`MCP23017`BOM_Manufacturer``BOM_Manufacturer Part`MCP23017`BOM_Supplier Part``BOM_Supplier``link``Contributor`emmanuel.malosse`spicePre`U`spiceSymbolName`MCP23017`~~0~ggeb1124de9a27319d1~f09420c4fd9946a583a6b15c1c5a483e~0f118b0d9063400da84e04b55532a171~0~~yes~yes#@$T~N~744.03125~-468.296875~0~#000080~Arial~~~~~comment~MCP23017~1~start~gge3184~0~#@$T~P~744.0390625~-477.421875~0~#000080~Arial~~~~~comment~U3~1~start~gge3186~0~#@$P~show~0~1~680~-455~180~gge3188~0^^680~-455^^M 680 -455 h 20~#880000^^1~702~-452~0~VCC~start~~~#0000FF^^1~695~-456~0~11~end~~~#0000FF^^0~697~-455^^0~M 700 -452 L 703 -455 L 700 -458#@$P~show~0~2~680~-445~180~gge3195~0^^680~-445^^M 680 -445 h 20~#880000^^1~702~-442~0~VCC~start~~~#0000FF^^1~695~-446~0~10~end~~~#0000FF^^0~697~-445^^0~M 700 -442 L 703 -445 L 700 -448#@$P~show~0~3~680~-405~180~gge3202~0^^680~-405^^M 680 -405 h 20~#880000^^1~702~-402~0~A0~start~~~#0000FF^^1~695~-406~0~3~end~~~#0000FF^^0~697~-405^^0~M 700 -402 L 703 -405 L 700 -408#@$P~show~0~4~680~-395~180~gge3209~0^^680~-395^^M 680 -395 h 20~#880000^^1~702~-392~0~A1~start~~~#0000FF^^1~695~-396~0~2~end~~~#0000FF^^0~697~-395^^0~M 700 -392 L 703 -395 L 700 -398#@$P~show~0~5~680~-385~180~gge3216~0^^680~-385^^M 680 -385 h 20~#880000^^1~702~-382~0~A2~start~~~#0000FF^^1~695~-386~0~1~end~~~#0000FF^^0~697~-385^^0~M 700 -382 L 703 -385 L 700 -388#@$P~show~0~6~680~-375~180~gge3223~0^^680~-375^^M 680 -375 h 20~#880000^^1~702~-372~0~Reset~start~~~#0000FF^^1~695~-376~0~4~end~~~#0000FF^^0~697~-375^^0~M 700 -372 L 703 -375 L 700 -378#@$P~show~0~7~680~-355~180~gge3230~0^^680~-355^^M 680 -355 h 20~#880000^^1~702~-352~0~SO~start~~~#0000FF^^1~695~-356~0~5~end~~~#0000FF^^0~697~-355^^0~M 700 -352 L 703 -355 L 700 -358#@$P~show~0~8~680~-345~180~gge3237~0^^680~-345^^M 680 -345 h 20~#880000^^1~702~-342~0~CS~start~~~#0000FF^^1~695~-346~0~6~end~~~#0000FF^^0~697~-345^^0~M 700 -342 L 703 -345 L 700 -348#@$P~show~0~9~680~-335~180~gge3244~0^^680~-335^^M 680 -335 h 20~#880000^^1~702~-332~0~SDA~start~~~#0000FF^^1~695~-336~0~7~end~~~#0000FF^^0~697~-335^^0~M 700 -332 L 703 -335 L 700 -338#@$P~show~0~10~680~-325~180~gge3251~0^^680~-325^^M 680 -325 h 20~#880000^^1~702~-322~0~SCL~start~~~#0000FF^^1~695~-326~0~8~end~~~#0000FF^^0~697~-325^^0~M 700 -322 L 703 -325 L 700 -328#@$P~show~0~11~820~-455~0~gge3258~0^^820~-455^^M 820 -455 h -20~#880000^^1~798~-452~0~A0~end~~~#0000FF^^1~805~-456~0~23~start~~~#0000FF^^0~803~-455^^0~M 800 -458 L 797 -455 L 800 -452#@$P~show~0~12~820~-445~0~gge3265~0^^820~-445^^M 820 -445 h -20~#880000^^1~798~-442~0~A1~end~~~#0000FF^^1~805~-446~0~24~start~~~#0000FF^^0~803~-445^^0~M 800 -448 L 797 -445 L 800 -442#@$P~show~0~13~820~-435~0~gge3272~0^^820~-435^^M 820 -435 h -20~#880000^^1~798~-432~0~A2~end~~~#0000FF^^1~805~-436~0~25~start~~~#0000FF^^0~803~-435^^0~M 800 -438 L 797 -435 L 800 -432#@$P~show~0~14~820~-425~0~gge3279~0^^820~-425^^M 820 -425 h -20~#880000^^1~798~-422~0~A3~end~~~#0000FF^^1~805~-426~0~26~start~~~#0000FF^^0~803~-425^^0~M 800 -428 L 797 -425 L 800 -422#@$P~show~0~15~820~-415~0~gge3286~0^^820~-415^^M 820 -415 h -20~#880000^^1~798~-412~0~A4~end~~~#0000FF^^1~805~-416~0~27~start~~~#0000FF^^0~803~-415^^0~M 800 -418 L 797 -415 L 800 -412#@$P~show~0~16~820~-405~0~gge3293~0^^820~-405^^M 820 -405 h -20~#880000^^1~798~-402~0~A5~end~~~#0000FF^^1~805~-406~0~28~start~~~#0000FF^^0~803~-405^^0~M 800 -408 L 797 -405 L 800 -402#@$P~show~0~17~820~-395~0~gge3300~0^^820~-395^^M 820 -395 h -20~#880000^^1~798~-392~0~A6~end~~~#0000FF^^1~805~-396~0~29~start~~~#0000FF^^0~803~-395^^0~M 800 -398 L 797 -395 L 800 -392#@$P~show~0~18~820~-385~0~gge3307~0^^820~-385^^M 820 -385 h -20~#880000^^1~798~-382~0~A7~end~~~#0000FF^^1~805~-386~0~30~start~~~#0000FF^^0~803~-385^^0~M 800 -388 L 797 -385 L 800 -382#@$P~show~0~19~820~-365~0~gge3314~0^^820~-365^^M 820 -365 h -20~#880000^^1~798~-362~0~B0~end~~~#0000FF^^1~805~-366~0~13~start~~~#0000FF^^0~803~-365^^0~M 800 -368 L 797 -365 L 800 -362#@$P~show~0~20~820~-355~0~gge3321~0^^820~-355^^M 820 -355 h -20~#880000^^1~798~-352~0~B1~end~~~#0000FF^^1~805~-356~0~14~start~~~#0000FF^^0~803~-355^^0~M 800 -358 L 797 -355 L 800 -352#@$P~show~0~21~820~-345~0~gge3328~0^^820~-345^^M 820 -345 h -20~#880000^^1~798~-342~0~B2~end~~~#0000FF^^1~805~-346~0~15~start~~~#0000FF^^0~803~-345^^0~M 800 -348 L 797 -345 L 800 -342#@$P~show~0~22~820~-335~0~gge3335~0^^820~-335^^M 820 -335 h -20~#880000^^1~798~-332~0~B3~end~~~#0000FF^^1~805~-336~0~16~start~~~#0000FF^^0~803~-335^^0~M 800 -338 L 797 -335 L 800 -332#@$P~show~0~23~820~-325~0~gge3342~0^^820~-325^^M 820 -325 h -20~#880000^^1~798~-322~0~B4~end~~~#0000FF^^1~805~-326~0~17~start~~~#0000FF^^0~803~-325^^0~M 800 -328 L 797 -325 L 800 -322#@$P~show~0~24~820~-315~0~gge3349~0^^820~-315^^M 820 -315 h -20~#880000^^1~798~-312~0~B5~end~~~#0000FF^^1~805~-316~0~18~start~~~#0000FF^^0~803~-315^^0~M 800 -318 L 797 -315 L 800 -312#@$P~show~0~25~820~-305~0~gge3356~0^^820~-305^^M 820 -305 h -20~#880000^^1~798~-302~0~B6~end~~~#0000FF^^1~805~-306~0~19~start~~~#0000FF^^0~803~-305^^0~M 800 -308 L 797 -305 L 800 -302#@$P~show~0~26~820~-295~0~gge3363~0^^820~-295^^M 820 -295 h -20~#880000^^1~798~-292~0~B7~end~~~#0000FF^^1~805~-296~0~20~start~~~#0000FF^^0~803~-295^^0~M 800 -298 L 797 -295 L 800 -292#@$P~show~0~27~680~-305~180~gge3370~0^^680~-305^^M 680 -305 h 20~#880000^^1~702~-302~0~ITA~start~~~#0000FF^^1~695~-306~0~22~end~~~#0000FF^^0~697~-305^^0~M 700 -302 L 703 -305 L 700 -308#@$P~show~0~28~680~-295~180~gge3377~0^^680~-295^^M 680 -295 h 20~#880000^^1~702~-292~0~ITB~start~~~#0000FF^^1~695~-296~0~11~end~~~#0000FF^^0~697~-295^^0~M 700 -292 L 703 -295 L 700 -298#@$T~L~720~-312.78~0~#0000FF~~9pt~~~~comment~MCP23017~1~start~gge3384~0~pinpart#@$R~700~-465~~~100~180~#000000~1~0~none~gge3386~0~#@$P~show~0~29~680~-435~180~gge3387~0^^680~-435^^M 680 -435 h 20~#880000^^1~702~-432~0~GND~start~~~#0000FF^^1~695~-436~0~21~end~~~#0000FF^^0~697~-435^^0~M 700 -432 L 703 -435 L 700 -438#@$P~show~0~0~680~-425~180~gge3394~0^^680~-425^^M 680 -425 h 20~#880000^^1~702~-422~0~GND~start~~~#0000FF^^1~695~-426~0~9~end~~~#0000FF^^0~697~-425^^0~M 700 -422 L 703 -425 L 700 -428","W~515 -560 665 -560 665 -660 700 -660~#008800~1~0~none~gge3621~0","W~680 -435 665 -435 665 -560~#008800~1~0~none~gge3622~0","W~680 -425 665 -425 665 -435~#008800~1~0~none~gge3626~0","W~515 -540 645 -540 645 -640 700 -640~#008800~1~0~none~gge3630~0","W~680 -325 645 -325 645 -540~#008800~1~0~none~gge3631~0","W~515 -520 635 -520 635 -335 680 -335~#008800~1~0~none~gge3633~0","W~700 -620 675 -620 675 -520 635 -520~#008800~1~0~none~gge3634~0","F~part_netLabel_gnD~875~-645~0~gge3637~~0^^875~-645^^GND~#000000~862~-619~0~start~1~Times New Roman~9pt~flag_gge38^^PL~875 -635 875 -645~#000000~1~0~transparent~gge3641~0^^PL~866 -635 884 -635~#000000~1~0~transparent~gge3642~0^^PL~869 -633 881 -633~#000000~1~0~transparent~gge3643~0^^PL~872 -631 878 -631~#000000~1~0~transparent~gge3644~0^^PL~874 -629 876 -629~#000000~1~0~transparent~gge3645~0","W~875 -645 875 -725 665 -725 665 -660~#008800~1~0~none~gge3655~0","W~655 -680 655 -455 680 -455~#008800~1~0~none~gge3670~0","W~680 -445 655 -445 655 -455~#008800~1~0~none~gge3672~0","W~515 -500 625 -500 625 -680 700 -680~#008800~1~0~none~gge3674~0","W~515 -600 665 -600~#008800~1~0~none~gge5803~0","W~475 -480 360 -480 360 -760 665 -760 665 -695~#008800~1~0~none~gge5805~0","W~225 -750 225 -750 625 -750 625 -680~#008800~1~0~none~gge5807~0","W~300 -640 280 -640 280 -700 475 -700~#008800~1~0~none~gge5809~0","LIB~320~-640~package`RES-TH_BD1.8-L3.2-P7.20-D0.4`BOM_Supplier`LCSC`BOM_Supplier Part`C714232`BOM_Manufacturer`Huaxing Mechanical-Elec.`BOM_Manufacturer Part`CF1/6W-10KΊ¹5%T52`nameAlias`Resistance (Ohms)`Contributor`LCSC`spicePre`R`spiceSymbolName`CF1/6W-10KΊ¹5%T52`~~0~gge2be133cf7b4aac5a~97467e7cb6374f7e9dd7fc644a47cfb1~2ba8a26395ab41a2a00f577110f8f3f7~0~~yes~yes#@$T~N~314.03125~-648~0~#000080~Arial~~~~~comment~10kΊ~1~start~gge6472~0~#@$T~P~314.0390625~-657.125~0~#000080~Arial~~~~~comment~R2~1~start~gge6474~0~#@$R~310~-645~~~20~10~#A00000~1~0~none~gge6476~0~#@$P~show~0~2~340~-640~0~gge6477~0^^340~-640^^M 330 -640 h 10~#800^^0~326~-640~0~2~end~~~#800^^0~334~-644~0~2~start~~~#800^^0~353~-640^^0~M 350 -643 L 347 -640 L 350 -637#@$P~show~0~1~300~-640~180~gge6484~0^^300~-640^^M 310 -640 h -10~#800^^0~314~-640~0~1~start~~~#800^^0~306~-644~0~1~end~~~#800^^0~287~-640^^0~M 290 -637 L 293 -640 L 290 -643","W~515 -580 610 -580 610 -410 335 -410~#008800~1~0~none~gge7116~0","W~335 -470 370 -470 370 -420 600 -420 600 -640 515 -640~#008800~1~0~none~gge7119~0","W~335 -430 405 -430 405 -500 475 -500~#008800~1~0~none~gge7120~0","W~335 -440 395 -440 395 -520 475 -520~#008800~1~0~none~gge7122~0","W~340 -640 360 -640~#008800~1~0~none~gge7126~0","W~335 -450 385 -450 385 -540 475 -540~#008800~1~0~none~gge7128~0","T~L~340~-405~0~#0000FF~~4pt~~~~comment~VCC~1~start~gge7135~0~pinpart","T~L~340~-465~0~#0000FF~~4pt~~~~comment~RST~1~start~gge7143~0~pinpart","T~L~340~-435~0~#0000FF~~4pt~~~~comment~MISO~1~start~gge7146~0~pinpart","T~L~340~-445~0~#0000FF~~4pt~~~~comment~MOSI~1~start~gge7149~0~pinpart","T~L~340~-425~0~#0000FF~~4pt~~~~comment~SCLK~1~start~gge7152~0~pinpart","T~L~340~-455~0~#0000FF~~4pt~~~~comment~CS~1~start~gge7155~0~pinpart","F~part_netLabel_gnD~330~-610~0~gge7160~~0^^330~-610^^GND~#000000~317~-584~0~start~1~Times New Roman~9pt~flag_gge39^^PL~330 -600 330 -610~#000000~1~0~transparent~gge7164~0^^PL~321 -600 339 -600~#000000~1~0~transparent~gge7165~0^^PL~324 -598 336 -598~#000000~1~0~transparent~gge7166~0^^PL~327 -596 333 -596~#000000~1~0~transparent~gge7167~0^^PL~329 -594 331 -594~#000000~1~0~transparent~gge7168~0","W~330 -610 360 -610~#008800~1~0~none~gge7178~0","W~280 -230 240 -230 240 -510 360 -510~#008800~1~0~none~gge7180~0","W~680 -405 665 -405 665 -425~#008800~1~0~none~gge7191~0","W~680 -395 665 -395 665 -405~#008800~1~0~none~gge7193~0","W~680 -385 665 -385 665 -395~#008800~1~0~none~gge7195~0","LIB~410~-230~package`WIRELM-TH_DWM1000`BOM_Supplier`LCSC`BOM_Manufacturer`DecaWave`BOM_Manufacturer Part`DWM1000`BOM_Supplier Part`C95238`spicePre`U`spiceSymbolName`DWM1000`~~0~gge40e5c90f659fccfc~921ff2190df246a4b1016c11071a51a1~605f956fd8c24817bb840fda3296ca74~0~~yes~yes#@$T~N~387.96875~-351.75~0~#000080~Arial~~~~~comment~DWM1000~1~start~gge7203~0~#@$T~P~404.21875~-362.125~0~#000080~Arial~~~~~comment~U5~1~start~gge7205~0~#@$E~295~-307~1.5~1.5~#880000~1~0~#880000~gge7207~0#@$R~290~-350~2~2~240~230~#880000~1~0~none~gge7208~0~#@$E~295~-307~1.5~1.5~#880000~1~0~#880000~gge7209~0#@$P~show~0~1~280~-300~180~gge7210~0^^280~-300^^M 280 -300 h 10~#880000^^1~293.7~-296~0~EXTON~start~~~#0000FF^^1~289.5~-301~0~1~end~~~#0000FF^^0~287~-300^^0~M 290 -297 L 293 -300 L 290 -303#@$P~show~0~2~280~-290~180~gge7217~0^^280~-290^^M 280 -290 h 10~#880000^^1~293.7~-286~0~WAKEUP~start~~~#0000FF^^1~289.5~-291~0~2~end~~~#0000FF^^0~287~-290^^0~M 290 -287 L 293 -290 L 290 -293#@$P~show~0~3~280~-280~180~gge7224~0^^280~-280^^M 280 -280 h 10~#880000^^1~293.7~-276~0~RSTn~start~~~#0000FF^^1~289.5~-281~0~3~end~~~#0000FF^^0~287~-280^^0~M 290 -277 L 293 -280 L 290 -283#@$P~show~0~4~280~-270~180~gge7231~0^^280~-270^^M 280 -270 h 10~#880000^^1~293.7~-266~0~GPIO7~start~~~#0000FF^^1~289.5~-271~0~4~end~~~#0000FF^^0~287~-270^^0~M 290 -267 L 293 -270 L 290 -273#@$P~show~0~5~280~-260~180~gge7238~0^^280~-260^^M 280 -260 h 10~#FF0000^^1~293.7~-256~0~VDDAON~start~~~#FF0000^^1~289.5~-261~0~5~end~~~#FF0000^^0~287~-260^^0~M 290 -257 L 293 -260 L 290 -263#@$P~show~0~6~280~-250~180~gge7245~0^^280~-250^^M 280 -250 h 10~#FF0000^^1~293.7~-246~0~VDD3V3~start~~~#FF0000^^1~289.5~-251~0~6~end~~~#FF0000^^0~287~-250^^0~M 290 -247 L 293 -250 L 290 -253#@$P~show~0~7~280~-240~180~gge7252~0^^280~-240^^M 280 -240 h 10~#FF0000^^1~293.7~-236~0~VDD3V3~start~~~#FF0000^^1~289.5~-241~0~7~end~~~#FF0000^^0~287~-240^^0~M 290 -237 L 293 -240 L 290 -243#@$P~show~0~8~280~-230~180~gge7259~0^^280~-230^^M 280 -230 h 10~#000000^^1~293.7~-226~0~VSS~start~~~#000000^^1~289.5~-231~0~8~end~~~#000000^^0~287~-230^^0~M 290 -227 L 293 -230 L 290 -233#@$P~show~0~9~370~-110~270~gge7266~0^^370~-110^^M 370 -110 v -10~#880000^^1~374~-123.7~270~GPIO6/EXTRXE/SPIPHA~start~~~#0000FF^^1~369~-119.5~270~9~end~~~#0000FF^^0~370~-117^^0~M 373 -120 L 370 -123 L 367 -120#@$P~show~0~10~380~-110~270~gge7273~0^^380~-110^^M 380 -110 v -10~#880000^^1~384~-123.7~270~GPIO5/EXTTXE/SPIPOL~start~~~#0000FF^^1~379~-119.5~270~10~end~~~#0000FF^^0~380~-117^^0~M 383 -120 L 380 -123 L 377 -120#@$P~show~0~11~390~-110~270~gge7280~0^^390~-110^^M 390 -110 v -10~#880000^^1~394~-123.7~270~GPIO4EXTPA~start~~~#0000FF^^1~389~-119.5~270~11~end~~~#0000FF^^0~390~-117^^0~M 393 -120 L 390 -123 L 387 -120#@$P~show~0~12~400~-110~270~gge7287~0^^400~-110^^M 400 -110 v -10~#880000^^1~404~-123.7~270~GPIO3TXLED~start~~~#0000FF^^1~399~-119.5~270~12~end~~~#0000FF^^0~400~-117^^0~M 403 -120 L 400 -123 L 397 -120#@$P~show~0~13~410~-110~270~gge7294~0^^410~-110^^M 410 -110 v -10~#880000^^1~414~-123.7~270~GPIO2RXLED~start~~~#0000FF^^1~409~-119.5~270~13~end~~~#0000FF^^0~410~-117^^0~M 413 -120 L 410 -123 L 407 -120#@$P~show~0~14~420~-110~270~gge7301~0^^420~-110^^M 420 -110 v -10~#880000^^1~424~-123.7~270~GPIO1SFDLED~start~~~#0000FF^^1~419~-119.5~270~14~end~~~#0000FF^^0~420~-117^^0~M 423 -120 L 420 -123 L 417 -120#@$P~show~0~15~430~-110~270~gge7308~0^^430~-110^^M 430 -110 v -10~#880000^^1~434~-123.7~270~GPIO0RXOKLED~start~~~#0000FF^^1~429~-119.5~270~15~end~~~#0000FF^^0~430~-117^^0~M 433 -120 L 430 -123 L 427 -120#@$P~show~0~16~440~-110~270~gge7315~0^^440~-110^^M 440 -110 v -10~#000000^^1~444~-123.7~270~VSS~start~~~#000000^^1~439~-119.5~270~16~end~~~#000000^^0~440~-117^^0~M 443 -120 L 440 -123 L 437 -120#@$P~show~0~17~540~-230~0~gge7322~0^^540~-230^^M 540 -230 h -10~#880000^^1~526.3~-226~0~SPICSn~end~~~#0000FF^^1~530.5~-231~0~17~start~~~#0000FF^^0~533~-230^^0~M 530 -233 L 527 -230 L 530 -227#@$P~show~0~18~540~-240~0~gge7329~0^^540~-240^^M 540 -240 h -10~#880000^^1~526.3~-236~0~SPIMOSI~end~~~#0000FF^^1~530.5~-241~0~18~start~~~#0000FF^^0~533~-240^^0~M 530 -243 L 527 -240 L 530 -237#@$P~show~0~19~540~-250~0~gge7336~0^^540~-250^^M 540 -250 h -10~#880000^^1~526.3~-246~0~SPIMISO~end~~~#0000FF^^1~530.5~-251~0~19~start~~~#0000FF^^0~533~-250^^0~M 530 -253 L 527 -250 L 530 -247#@$P~show~0~20~540~-260~0~gge7343~0^^540~-260^^M 540 -260 h -10~#880000^^1~526.3~-256~0~SPICLK~end~~~#0000FF^^1~530.5~-261~0~20~start~~~#0000FF^^0~533~-260^^0~M 530 -263 L 527 -260 L 530 -257#@$P~show~0~21~540~-270~0~gge7350~0^^540~-270^^M 540 -270 h -10~#000000^^1~526.3~-266~0~VSS~end~~~#000000^^1~530.5~-271~0~21~start~~~#000000^^0~533~-270^^0~M 530 -273 L 527 -270 L 530 -267#@$P~show~0~22~540~-280~0~gge7357~0^^540~-280^^M 540 -280 h -10~#880000^^1~526.3~-276~0~IRQ/GPIO8~end~~~#0000FF^^1~530.5~-281~0~22~start~~~#0000FF^^0~533~-280^^0~M 530 -283 L 527 -280 L 530 -277#@$P~show~0~23~540~-290~0~gge7364~0^^540~-290^^M 540 -290 h -10~#000000^^1~526.3~-286~0~VSS~end~~~#000000^^1~530.5~-291~0~23~start~~~#000000^^0~533~-290^^0~M 530 -293 L 527 -290 L 530 -287#@$P~show~0~24~540~-300~0~gge7371~0^^540~-300^^M 540 -300 h -10~#000000^^1~526.3~-296~0~VSS~end~~~#000000^^1~530.5~-301~0~24~start~~~#000000^^0~533~-300^^0~M 530 -303 L 527 -300 L 530 -297","W~335 -460 375 -460 375 -560 475 -560~#008800~1~0~none~gge7555~0","W~280 -260 225 -260 225 -750~#008800~1~0~none~gge7557~0","W~280 -250 225 -250 225 -260~#008800~1~0~none~gge7559~0","W~280 -240 225 -240 225 -250~#008800~1~0~none~gge7561~0","W~440 -110 440 -80 240 -80 240 -230~#008800~1~0~none~gge7565~0","W~540 -300 575 -300 575 -80 440 -80~#008800~1~0~none~gge7567~0","W~540 -290 575 -290~#008800~1~0~none~gge7569~0","W~540 -270 575 -270~#008800~1~0~none~gge7571~0","W~540 -240 585 -240 585 -380 385 -380 385 -450~#008800~1~0~none~gge7573~0","W~540 -250 595 -250 595 -390 395 -390 395 -440~#008800~1~0~none~gge7575~0","W~540 -260 605 -260 605 -400 405 -400 405 -430~#008800~1~0~none~gge7577~0","W~625 -280 625 -70 210 -70 210 -625 375 -625 375 -640 475 -640~#008800~1~0~none~gge7579~0","W~280 -280 270 -280 270 -60 680 -60 680 -260 835 -260 835 -415 820 -415~#008800~1~0~none~gge7580~0","LIB~625~-310~package`RES-TH_BD1.8-L3.2-P7.20-D0.4`BOM_Supplier`LCSC`BOM_Supplier Part`C714232`BOM_Manufacturer`Huaxing Mechanical-Elec.`BOM_Manufacturer Part`CF1/6W-10KΊ¹5%T52`nameAlias`Resistance (Ohms)`Contributor`LCSC`spicePre`R`spiceSymbolName`CF1/6W-10KΊ¹5%T52`~270~0~gge0d47179fde529207~97467e7cb6374f7e9dd7fc644a47cfb1~2ba8a26395ab41a2a00f577110f8f3f7~0~~yes~yes#@$T~N~632~-297.640625~0~#000080~Arial~~~~~comment~10kΊ~1~start~gge7584~0~#@$T~P~632~-306.78125~0~#000080~Arial~~~~~comment~R3~1~start~gge7586~0~#@$R~620~-320~~~10~20~#A00000~1~0~none~gge7588~0~#@$P~show~0~2~625~-290~270~gge7589~0^^625~-290^^M 625 -300 v 10~#800^^0~625~-304~270~2~start~~~#800^^0~621~-296~270~2~end~~~#800^^0~625~-277^^0~M 628 -280 L 625 -283 L 622 -280#@$P~show~0~1~625~-330~90~gge7596~0^^625~-330^^M 625 -320 v -10~#800^^0~625~-316~270~1~end~~~#800^^0~621~-324~270~1~start~~~#800^^0~625~-343^^0~M 622 -340 L 625 -337 L 628 -340","W~625 -330 625 -425 665 -425~#008800~1~0~none~gge7607~0","W~540 -280 625 -280 625 -290~#008800~1~0~none~gge7608~0","LIB~140~-670~package`M2X3`Contributor`DangerousPrototype`spicePre`J`spiceSymbolName`CON_HEADER_2X03`BOM_Manufacturer Part``~~0~gge73b657ec88652575~1a95e0cd8cf04abab1f0a955e387d9de~4cf556fe97124ad8934102a1b113e234~0~~yes~yes#@$T~N~128.3359375~-691.75~0~#000080~Arial~~~~~comment~LEFT IO~1~start~gge7932~0~#@$T~P~135.078125~-702~0~#000080~Arial~~~~~comment~J1~1~start~gge7934~0~#@$PL~120 -690 160 -690~#8D2323~2~0~none~gge7936~0#@$PL~160 -690 160 -650~#8D2323~2~0~none~gge7937~0#@$PL~160 -650 120 -650~#8D2323~2~0~none~gge7938~0#@$PL~120 -650 120 -690~#8D2323~2~0~none~gge7939~0#@$P~show~0~1~125~-680~180~gge7940~0^^125~-680^^M 125 -680 h 4~#8D2323^^0~138~-677~0~1~start~~~#8D2323^^1~129~-681~0~1~end~~~#8D2323^^1~132~-680^^0~M 135 -677 L 138 -680 L 135 -683#@$P~show~0~3~125~-670~180~gge7947~0^^125~-670^^M 125 -670 h 4~#8D2323^^0~138~-667~0~3~start~~~#8D2323^^1~129~-671~0~3~end~~~#8D2323^^1~132~-670^^0~M 135 -667 L 138 -670 L 135 -673#@$P~show~0~5~125~-660~180~gge7954~0^^125~-660^^M 125 -660 h 4~#8D2323^^0~138~-657~0~5~start~~~#8D2323^^1~129~-661~0~5~end~~~#8D2323^^1~132~-660^^0~M 135 -657 L 138 -660 L 135 -663#@$P~show~0~2~155~-680~0~gge7961~0^^155~-680^^M 155 -680 h -4~#8D2323^^0~142~-677~0~2~end~~~#8D2323^^1~151~-681~0~2~start~~~#8D2323^^1~148~-680^^0~M 145 -683 L 142 -680 L 145 -677#@$P~show~0~4~155~-670~0~gge7968~0^^155~-670^^M 155 -670 h -4~#8D2323^^0~142~-667~0~4~end~~~#8D2323^^1~151~-671~0~4~start~~~#8D2323^^1~148~-670^^0~M 145 -673 L 142 -670 L 145 -667#@$P~show~0~6~155~-660~0~gge7975~0^^155~-660^^M 155 -660 h -4~#8D2323^^0~142~-657~0~6~end~~~#8D2323^^1~151~-661~0~6~start~~~#8D2323^^1~148~-660^^0~M 145 -663 L 142 -660 L 145 -657","LIB~930~-355~package`M2X3`Contributor`DangerousPrototype`spicePre`J`spiceSymbolName`CON_HEADER_2X03`BOM_Manufacturer Part``~~0~gge7677077cf56e81b8~1a95e0cd8cf04abab1f0a955e387d9de~4cf556fe97124ad8934102a1b113e234~0~~yes~yes#@$T~N~909.28125~-377.0078125~0~#000080~Arial~~~~~comment~RIGHT IO~1~start~gge7984~0~#@$T~P~925.078125~-387~0~#000080~Arial~~~~~comment~J2~1~start~gge7986~0~#@$PL~910 -375 950 -375~#8D2323~2~0~none~gge7988~0#@$PL~950 -375 950 -335~#8D2323~2~0~none~gge7989~0#@$PL~950 -335 910 -335~#8D2323~2~0~none~gge7990~0#@$PL~910 -335 910 -375~#8D2323~2~0~none~gge7991~0#@$P~show~0~1~915~-365~180~gge7992~0^^915~-365^^M 915 -365 h 4~#8D2323^^0~928~-362~0~1~start~~~#8D2323^^1~919~-366~0~1~end~~~#8D2323^^1~922~-365^^0~M 925 -362 L 928 -365 L 925 -368#@$P~show~0~3~915~-355~180~gge7999~0^^915~-355^^M 915 -355 h 4~#8D2323^^0~928~-352~0~3~start~~~#8D2323^^1~919~-356~0~3~end~~~#8D2323^^1~922~-355^^0~M 925 -352 L 928 -355 L 925 -358#@$P~show~0~5~915~-345~180~gge8006~0^^915~-345^^M 915 -345 h 4~#8D2323^^0~928~-342~0~5~start~~~#8D2323^^1~919~-346~0~5~end~~~#8D2323^^1~922~-345^^0~M 925 -342 L 928 -345 L 925 -348#@$P~show~0~2~945~-365~0~gge8013~0^^945~-365^^M 945 -365 h -4~#8D2323^^0~932~-362~0~2~end~~~#8D2323^^1~941~-366~0~2~start~~~#8D2323^^1~938~-365^^0~M 935 -368 L 932 -365 L 935 -362#@$P~show~0~4~945~-355~0~gge8020~0^^945~-355^^M 945 -355 h -4~#8D2323^^0~932~-352~0~4~end~~~#8D2323^^1~941~-356~0~4~start~~~#8D2323^^1~938~-355^^0~M 935 -358 L 932 -355 L 935 -352#@$P~show~0~6~945~-345~0~gge8027~0^^945~-345^^M 945 -345 h -4~#8D2323^^0~932~-342~0~6~end~~~#8D2323^^1~941~-346~0~6~start~~~#8D2323^^1~938~-345^^0~M 935 -348 L 932 -345 L 935 -342","LIB~295~-430~package`MOLEX_PICOBLADE_8P`description``Contributor`DesertBit`sourceId`JjBuMGYgy`timeStamp`1472635423`spicePre`J`spiceSymbolName`MOLEX_PICOBLADE_8P`BOM_Manufacturer Part``~180~0~gge19aefbed2d4ff121~fc117d7fb2fa4d559044936821f94db6~abe5a9481474486593dfb32d8d0fb351~0~~yes~yes#@$T~N~284.5390625~-491.75~0~#000080~Arial~~~~~comment~Display~1~start~gge8639~0~#@$T~P~295.078125~-501.75~0~#000080~Arial~~~~~comment~J3~1~start~gge8641~0~#@$PL~315 -400 315 -490~#8D2323~1~0~none~gge8643~0#@$PL~315 -490 285 -490~#8D2323~1~0~none~gge8644~0#@$PL~285 -490 285 -400~#8D2323~1~0~none~gge8645~0#@$PL~285 -400 315 -400~#8D2323~1~0~none~gge8646~0#@$P~show~0~1~335~-410~0~gge8647~0^^335~-410^^M 335 -410 h -20~#8D2323^^1~312~-407~0~1~end~~~#8D2323^^1~321~-411~0~1~start~~~#8D2323^^0~318~-410^^0~M 315 -413 L 312 -410 L 315 -407#@$P~show~0~2~335~-420~0~gge8654~0^^335~-420^^M 335 -420 h -20~#8D2323^^1~312~-417~0~2~end~~~#8D2323^^1~321~-421~0~2~start~~~#8D2323^^0~318~-420^^0~M 315 -423 L 312 -420 L 315 -417#@$P~show~0~3~335~-430~0~gge8661~0^^335~-430^^M 335 -430 h -20~#8D2323^^1~312~-427~0~3~end~~~#8D2323^^1~321~-431~0~3~start~~~#8D2323^^0~318~-430^^0~M 315 -433 L 312 -430 L 315 -427#@$P~show~0~4~335~-440~0~gge8668~0^^335~-440^^M 335 -440 h -20~#8D2323^^1~312~-437~0~4~end~~~#8D2323^^1~321~-441~0~4~start~~~#8D2323^^0~318~-440^^0~M 315 -443 L 312 -440 L 315 -437#@$P~show~0~1~335~-450~0~gge8675~0^^335~-450^^M 335 -450 h -20~#8D2323^^1~312~-447~0~5~end~~~#8D2323^^1~321~-451~0~5~start~~~#8D2323^^0~318~-450^^0~M 315 -453 L 312 -450 L 315 -447#@$P~show~0~2~335~-460~0~gge8682~0^^335~-460^^M 335 -460 h -20~#8D2323^^1~312~-457~0~6~end~~~#8D2323^^1~321~-461~0~6~start~~~#8D2323^^0~318~-460^^0~M 315 -463 L 312 -460 L 315 -457#@$P~show~0~3~335~-470~0~gge8689~0^^335~-470^^M 335 -470 h -20~#8D2323^^1~312~-467~0~7~end~~~#8D2323^^1~321~-471~0~7~start~~~#8D2323^^0~318~-470^^0~M 315 -473 L 312 -470 L 315 -467#@$P~show~0~4~335~-480~0~gge8696~0^^335~-480^^M 335 -480 h -20~#8D2323^^1~312~-477~0~8~end~~~#8D2323^^1~321~-481~0~8~start~~~#8D2323^^0~318~-480^^0~M 315 -483 L 312 -480 L 315 -477","W~335 -420 360 -420 360 -480~#008800~1~0~none~gge8769~0","T~L~340~-415~0~#0000FF~~4pt~~~~comment~GND~1~start~gge8774~0~pinpart","W~335 -480 360 -480~#008800~1~0~none~gge8776~0","LIB~790~-620~package`IMU9250`BOM_Manufacturer``BOM_Manufacturer Part``BOM_Supplier Part``BOM_Supplier``link``Contributor`Phongnhp`spicePre`U`spiceSymbolName`IMU_9250`~~0~ggeac577a762ea3fc25~bc174898c43b41b89ffbf34ee09b95a5~38386194dc0a477c83fbd24273123f35~0~~yes~yes#@$T~N~743.484375~-692~0~#000080~Arial~~~~~comment~IMU_9250~1~start~gge10051~0~#@$T~P~758.0390625~-702.5~0~#000080~Arial~~~~~comment~U2~1~start~gge10053~0~#@$P~show~0~1~700~-680~180~gge10055~0^^700~-680^^M 700 -680 h 20~#880000^^1~722~-677~0~VCC~start~~~#0000FF^^1~715~-681~0~1~end~~~#0000FF^^0~717~-680^^0~M 720 -677 L 723 -680 L 720 -683#@$P~show~0~2~700~-660~180~gge10062~0^^700~-660^^M 700 -660 h 20~#880000^^1~722~-657~0~GND~start~~~#0000FF^^1~715~-661~0~2~end~~~#0000FF^^0~717~-660^^0~M 720 -657 L 723 -660 L 720 -663#@$P~show~0~3~700~-640~180~gge10069~0^^700~-640^^M 700 -640 h 20~#880000^^1~722~-637~0~SCL~start~~~#0000FF^^1~715~-641~0~3~end~~~#0000FF^^0~717~-640^^0~M 720 -637 L 723 -640 L 720 -643#@$P~show~0~4~700~-620~180~gge10076~0^^700~-620^^M 700 -620 h 20~#880000^^1~722~-617~0~SDA~start~~~#0000FF^^1~715~-621~0~4~end~~~#0000FF^^0~717~-620^^0~M 720 -617 L 723 -620 L 720 -623#@$P~show~0~5~700~-600~180~gge10083~0^^700~-600^^M 700 -600 h 20~#880000^^1~722~-597~0~ECL~start~~~#0000FF^^1~715~-601~0~5~end~~~#0000FF^^0~717~-600^^0~M 720 -597 L 723 -600 L 720 -603#@$P~show~0~6~700~-580~180~gge10090~0^^700~-580^^M 700 -580 h 20~#880000^^1~722~-577~0~EDA~start~~~#0000FF^^1~715~-581~0~6~end~~~#0000FF^^0~717~-580^^0~M 720 -577 L 723 -580 L 720 -583#@$P~show~0~7~700~-560~180~gge10097~0^^700~-560^^M 700 -560 h 20~#880000^^1~722~-557~0~AD0~start~~~#0000FF^^1~715~-561~0~7~end~~~#0000FF^^0~717~-560^^0~M 720 -557 L 723 -560 L 720 -563#@$P~show~0~8~700~-540~180~gge10104~0^^700~-540^^M 700 -540 h 20~#880000^^1~722~-537~0~INT~start~~~#0000FF^^1~715~-541~0~8~end~~~#0000FF^^0~717~-540^^0~M 720 -537 L 723 -540 L 720 -543#@$P~show~0~9~700~-520~180~gge10111~0^^700~-520^^M 700 -520 h 20~#880000^^1~722~-517~0~NCS~start~~~#0000FF^^1~715~-521~0~9~end~~~#0000FF^^0~717~-520^^0~M 720 -517 L 723 -520 L 720 -523#@$P~show~0~10~700~-500~180~gge10118~0^^700~-500^^M 700 -500 h 20~#880000^^1~722~-497~0~FSYNC~start~~~#0000FF^^1~715~-501~0~10~end~~~#0000FF^^0~717~-500^^0~M 720 -497 L 723 -500 L 720 -503#@$R~720~-690~~~110~200~#000000~1~0~none~gge10125~0~#@$T~L~745.52~-584.75~0~#0000FF~~10pt~bold~normal~~comment~IMU_9250~1~start~gge10126~0~pinpart","O~700~-600~gge10209~M 696 -604 L 704 -596 M 704 -604 L 696 -596~#33cc33~0","O~700~-580~gge10211~M 696 -584 L 704 -576 M 704 -584 L 696 -576~#33cc33~0","O~700~-560~gge10213~M 696 -564 L 704 -556 M 704 -564 L 696 -556~#33cc33~0","O~700~-540~gge10215~M 696 -544 L 704 -536 M 704 -544 L 696 -536~#33cc33~0","O~700~-520~gge10217~M 696 -524 L 704 -516 M 704 -524 L 696 -516~#33cc33~0","O~700~-500~gge10219~M 696 -504 L 704 -496 M 704 -504 L 696 -496~#33cc33~0","W~260 -540 240 -540 240 -510~#008800~1~0~none~gge10223~0","LIB~135~-475~package`M1X2`Contributor`Nemo Capitano`spicePre`J`spiceSymbolName`CON_HEADER_1X02-PTH`BOM_Manufacturer Part``~~0~gge47ec3a850f2d689e~4c8cadf21a8948738149a2ad5bb40c24~d3e19c3068574fa0b89c92528028b98d~0~~yes~yes#@$T~N~118.8671875~-491.75~0~#000080~Arial~~~~~comment~MAIN BAT~1~start~gge10236~0~#@$T~P~130.92~-501~0~#000080~Arial~~~~~comment~J4~1~start~gge10238~0~#@$PL~125.84 -489 145.84 -489~#A54B4B~1.6~0~none~gge10240~0#@$PL~145.84 -489 145.84 -459~#A54B4B~1.6~0~none~gge10241~0#@$PL~145.84 -459 125.84 -459~#A54B4B~1.6~0~none~gge10242~0#@$PL~125.84 -459 125.84 -489~#A54B4B~1.6~0~none~gge10243~0#@$P~show~3~1~131~-479~180~gge10244~0^^131~-479^^M 131 -479 h 3.842~#A54B4B^^0~150.53~-476.047~0~1~start~~4.5pt~#A54B4B^^1~134.78~-480.97~0~1~end~~4.5pt~#A54B4B^^1~137~-479^^0~M 140 -476 L 143 -479 L 140 -482#@$P~show~3~2~131~-469~180~gge10251~0^^131~-469^^M 131 -469 h 3.842~#A54B4B^^0~150.53~-466.047~0~2~start~~4.5pt~#A54B4B^^1~134.78~-470.97~0~2~end~~4.5pt~#A54B4B^^1~137~-469^^0~M 140 -466 L 143 -469 L 140 -472","W~131 -479 185 -479 185 -550 260 -550~#008800~1~0~none~gge10284~0","W~131 -469 240 -469~#008800~1~0~none~gge10285~0","T~L~340~-475~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10291~0~pinpart","T~L~150~-460~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10294~0~pinpart","T~L~255~-530~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10297~0~pinpart","T~L~150~-485~0~#0000FF~~4pt~~~~comment~BAT +~1~start~gge10300~0~pinpart","T~L~250~-555~0~#0000FF~~4pt~~~~comment~BAT +~1~start~gge10303~0~pinpart","W~155 -680 280 -680~#008800~1~0~none~gge10313~0","W~125 -680 125 -730 225 -730~#008800~1~0~none~gge10315~0","T~L~110~-695~0~#0000FF~~4pt~~~~comment~VCC~1~start~gge10318~0~pinpart","T~L~165~-685~0~#0000FF~~4pt~~~~comment~PSENSOR~1~start~gge10321~0~pinpart","W~155 -660 270 -660 270 -715 360 -715~#008800~1~0~none~gge10323~0","T~L~165~-655~0~#0000FF~~4pt~~~~comment~GND~1~start~gge10326~0~pinpart","W~125 -670 110 -670 110 -770 910 -770 910 -455 820 -455~#008800~1~0~none~gge10328~0","W~155 -670 235 -670 235 -780 920 -780 915 -435 820 -435~#008800~1~0~none~gge10336~0","W~125 -660 100 -660 100 -790 930 -790 930 -445 820 -445~#008800~1~0~none~gge10337~0","W~945 -345 970 -345 970 -485 665 -485~#008800~1~0~none~gge10338~0","W~820 -385 960 -385 960 -365 945 -365~#008800~1~0~none~gge10340~0","W~820 -295 870 -295 870 -355 915 -355~#008800~1~0~none~gge10341~0","W~820 -395 880 -395 880 -325 960 -325 960 -355 945 -355~#008800~1~0~none~gge10343~0","W~820 -305 895 -305 895 -345 915 -345~#008800~1~0~none~gge10344~0","W~915 -365 895 -365 895 -475 655 -475~#008800~1~0~none~gge10345~0","LIB~278~-544~package`S2B-PH-SM4-TB`Contributor`andyfilms`spicePre`X`spiceSymbolName`S2B-PH-SM4-TB`BOM_Manufacturer Part``~180~0~gge12fa8dc00f010d07~ffe5780e60fc43f3861153d7ff9fe849~1c47b77e6d1948b89e39b944cd2029a5~0~~yes~yes#@$T~N~274.28125~-565.84375~0~#000080~Arial~~~~~comment~BAT~1~start~gge10431~0~#@$T~P~277.44~-575.85~0~#000080~Arial~~~~~comment~X1~1~start~gge10433~0~#@$PL~274.68 -560 294.68 -560~#EBEB37~1.6~0~none~gge10435~0#@$PL~284.68 -540 279.68 -540~#EBEB37~2.4~0~none~gge10436~0#@$PL~284.68 -550 279.68 -550~#EBEB37~2.4~0~none~gge10437~0#@$PL~294.68 -530 294.68 -560~#EBEB37~1.6~0~none~gge10438~0#@$PL~274.68 -560 274.68 -530~#EBEB37~1.6~0~none~gge10439~0#@$PL~294.68 -530 274.68 -530~#EBEB37~1.6~0~none~gge10440~0#@$P~show~3~1~260~-550~180~gge10441~0^^260~-550^^M 260 -550 h 19.685~#EBEB37^^0~289.21~-547.047~0~1~start~~4.5pt~#EBEB37^^1~267.56~-551.969~0~1~end~~4.5pt~#EBEB37^^0~276~-550^^0~M 279 -547 L 282 -550 L 279 -553#@$P~show~3~2~260~-540~180~gge10448~0^^260~-540^^M 260 -540 h 19.685~#EBEB37^^0~289.21~-537.047~0~2~start~~4.5pt~#EBEB37^^1~267.56~-541.969~0~2~end~~4.5pt~#EBEB37^^0~276~-540^^0~M 279 -537 L 282 -540 L 279 -543","N~185~-535~0~#0000ff~BAT~gge10482~start~187~-537.5~Times New Roman~7pt~0","O~475~-580~gge10488~M 471 -584 L 479 -576 M 479 -584 L 471 -576~#33cc33~0","O~475~-600~gge10490~M 471 -604 L 479 -596 M 479 -604 L 471 -596~#33cc33~0","O~475~-620~gge10492~M 471 -624 L 479 -616 M 479 -624 L 471 -616~#33cc33~0","O~515~-660~gge10498~M 511 -664 L 519 -656 M 519 -664 L 511 -656~#33cc33~0","O~515~-620~gge10500~M 511 -624 L 519 -616 M 519 -624 L 511 -616~#33cc33~0","W~540 -230 825 -230 825 -405 820 -405~#008800~1~0~none~gge10506~0","W~680 -375 655 -375 655 -445~#008800~1~0~none~gge10509~0","J~665~-560~2.5~#CC0000~gge3623~0","J~645~-540~2.5~#CC0000~gge3632~0","J~665~-660~2.5~#CC0000~gge3656~0","J~665~-435~2.5~#CC0000~gge3669~0","J~655~-455~2.5~#CC0000~gge3673~0","J~635~-520~2.5~#CC0000~gge3677~0","J~665~-600~2.5~#CC0000~gge5804~0","J~665~-695~2.5~#CC0000~gge5806~0","J~625~-680~2.5~#CC0000~gge5808~0","J~360~-640~2.5~#CC0000~gge7127~0","J~360~-610~2.5~#CC0000~gge7179~0","J~360~-510~2.5~#CC0000~gge7181~0","J~665~-425~2.5~#CC0000~gge7192~0","J~665~-405~2.5~#CC0000~gge7194~0","J~665~-395~2.5~#CC0000~gge7196~0","J~225~-260~2.5~#CC0000~gge7560~0","J~225~-250~2.5~#CC0000~gge7562~0","J~240~-230~2.5~#CC0000~gge7566~0","J~440~-80~2.5~#CC0000~gge7568~0","J~575~-290~2.5~#CC0000~gge7570~0","J~575~-270~2.5~#CC0000~gge7572~0","J~385~-450~2.5~#CC0000~gge7574~0","J~395~-440~2.5~#CC0000~gge7576~0","J~405~-430~2.5~#CC0000~gge7578~0","J~360~-480~2.5~#CC0000~gge8770~0","J~655~-680~2.5~#CC0000~gge10208~0","J~240~-510~2.5~#CC0000~gge10306~0","J~280~-680~2.5~#CC0000~gge10314~0","J~225~-730~2.5~#CC0000~gge10316~0","J~360~-715~2.5~#CC0000~gge10324~0","J~665~-485~2.5~#CC0000~gge10339~0","J~655~-475~2.5~#CC0000~gge10346~0","J~240~-469~2.5~#CC0000~gge10286~0","J~625~-280~2.5~#CC0000~gge10505~0","J~655~-445~2.5~#CC0000~gge10510~0"],"BBox":{"x":0,"y":-806.8,"width":1149,"height":807.4},"colors":{}}}],"BOM":[["Value","Quantity","Package","Components","CustomPara"],["MCP23017",1,"MCP23017","U3",{"BOM_Manufacturer":"","BOM_Manufacturer Part":"MCP23017","BOM_Supplier Part":"","BOM_Supplier":"","puuid":"f09420c4fd9946a583a6b15c1c5a483e","uuid":"0f118b0d9063400da84e04b55532a171"}],["BAT",1,"S2B-PH-SM4-TB","X1",{"BOM_Manufacturer Part":"","puuid":"ffe5780e60fc43f3861153d7ff9fe849","uuid":"1c47b77e6d1948b89e39b944cd2029a5"}],["10kΊ",2,"RES-TH_BD1.8-L3.2-P7.20-D0.4","R2,R3",{"BOM_Supplier":"LCSC","BOM_Supplier Part":"C714232","BOM_Manufacturer":"Huaxing Mechanical-Elec.","BOM_Manufacturer Part":"CF1/6W-10KΊ¹5%T52","puuid":"97467e7cb6374f7e9dd7fc644a47cfb1","uuid":"2ba8a26395ab41a2a00f577110f8f3f7"}],["LEFT IO",1,"M2X3","J1",{"BOM_Manufacturer Part":"","puuid":"1a95e0cd8cf04abab1f0a955e387d9de","uuid":"4cf556fe97124ad8934102a1b113e234"}],["RIGHT IO",1,"M2X3","J2",{"BOM_Manufacturer Part":"","puuid":"1a95e0cd8cf04abab1f0a955e387d9de","uuid":"4cf556fe97124ad8934102a1b113e234"}],["DWM1000",1,"WIRELM-TH_DWM1000","U5",{"BOM_Supplier":"LCSC","BOM_Manufacturer":"DecaWave","BOM_Manufacturer Part":"DWM1000","BOM_Supplier Part":"C95238","puuid":"921ff2190df246a4b1016c11071a51a1","uuid":"605f956fd8c24817bb840fda3296ca74"}],["MAIN BOARD",1,"TTGO-T-BEAM-ESP32-CONNECTOR","U1",{"BOM_Manufacturer":"","BOM_Manufacturer Part":"","BOM_Supplier Part":"","BOM_Supplier":"","puuid":"5180c2e0c1da4a75b575a8495aee30f2","uuid":"5657e928f1504b21b9e68062d66ba3e3"}],["IMU_9250",1,"IMU9250","U2",{"BOM_Manufacturer":"","BOM_Manufacturer Part":"","BOM_Supplier Part":"","BOM_Supplier":"","puuid":"bc174898c43b41b89ffbf34ee09b95a5","uuid":"38386194dc0a477c83fbd24273123f35"}],["Display",1,"MOLEX_PICOBLADE_8P","J3",{"BOM_Manufacturer Part":"","puuid":"fc117d7fb2fa4d559044936821f94db6","uuid":"abe5a9481474486593dfb32d8d0fb351"}],["MAIN BAT",1,"M1X2","J4",{"BOM_Manufacturer Part":"","puuid":"4c8cadf21a8948738149a2ad5bb40c24","uuid":"d3e19c3068574fa0b89c92528028b98d"}]],"components":{"5657e928f1504b21b9e68062d66ba3e3":1,"0f118b0d9063400da84e04b55532a171":1,"2ba8a26395ab41a2a00f577110f8f3f7":2,"605f956fd8c24817bb840fda3296ca74":1,"4cf556fe97124ad8934102a1b113e234":2,"abe5a9481474486593dfb32d8d0fb351":1,"38386194dc0a477c83fbd24273123f35":1,"d3e19c3068574fa0b89c92528028b98d":1,"1c47b77e6d1948b89e39b944cd2029a5":1}} \ No newline at end of file diff --git a/pcb/AirsoftTracker 1.4/MAIN PCB.json b/pcb/AirsoftTracker 1.4/MAIN PCB.json new file mode 100644 index 0000000..873e39b --- /dev/null +++ b/pcb/AirsoftTracker 1.4/MAIN PCB.json @@ -0,0 +1 @@ +{"head":{"docType":"3","editorVersion":"6.5.23","newgId":true,"c_para":{},"hasIdFlag":true,"x":"4020","y":"3597.5","importFlag":0,"transformList":""},"canvas":"CA~1000~1000~#000000~yes~#FFFFFF~10~1000~1000~line~0.5~mm~2.3622~45~visible~0.5~4020~3597.5~1~yes","shape":["TRACK~2.3622~2~U1_15~4216.85 3762.0931 4216.85 3700.88 4227.13 3690.6 4227.13 3629.71 4228.84 3627.99~gge29125~0","TRACK~2.3622~2~U1_02~4200.29 3631.66 4205.27 3636.63 4205.43 3773.57 4148 3829.5 4147.9 3838.45~gge29256~0","TRACK~2.3622~2~U1_S_VP~4033.62 3631.87 4028.3 3637.19 4028.3 3702.13 4039.5 3713.33 4039.5 3830.05 4047.9 3838.45~gge28788~0","TRACK~2.3622~2~U3_29~4390.08 3631.87 4384.7 3626.49 4359.41 3626.49 4350 3635.9 4350 3645~gge28797~0","TRACK~2.3622~2~U3_25~4310 3645 4310 3644.11 4295.92 3630.03 4281.03 3630.03 4278.95 3632.11 4269.63 3632.11 4257.2 3619.68 4136.35 3619.68 4129.62 3626.4 4049.09 3626.4 4043.62 3631.87~gge28796~0","TRACK~2.3622~2~U1_25~4117.9 3838.45 4092.28 3812.82 4092.28 3744.41~gge28791~0","TRACK~2.3622~2~U1_15~4275.83 3606.5 4267.19 3615.14 4233.2 3615.14~gge28781~0","TRACK~2.3622~2~U1_15~4216.85 3763.419 4216.85 3762.0931~gge28996~0","TRACK~2.3622~2~U1_02~4200.29 3631.66 4139.2 3631.66 4104.46 3666.4~gge28773~0","TRACK~2.3622~2~U1_13~4233.49 3635.82 4233.49 3670.04 4232.21 3671.32~gge28765~0","TRACK~2.3622~2~U1_13~4221.02 3762.0931 4221.02 3705.51 4232.21 3694.32 4232.21 3671.32~gge29138~0","TRACK~2.3622~2~U1_13~4221.02 3763.319 4221.02 3762.0931~gge29009~0","TRACK~2.3622~2~U3_28~4294.63 3634.63 4290.93 3638.33 4255.47 3638.33 4242.15 3651.64~gge28749~0","TRACK~2.3622~2~U3_27~4330 3645 4310.43 3625.43 4277.69 3625.43 4275.16 3627.96 4271.35 3627.96 4268.89 3625.51 4268.89 3620.96 4281.4 3608.46 4281.4 3604.48 4278.09 3601.17 4194.85 3601.17 4181.72 3614.3~gge28746~0","TRACK~2.3622~2~J2_2~4406.5 3610 4406.5 3657.39 4405 3658.89~gge28744~0","TRACK~2.3622~2~Q1_2~4401.5 3610 4401.5 3614.63 4399.57 3616.56 4371.73 3616.56 4360.5 3605.33~gge28741~0","TRACK~2.3622~2~U3_30~4360 3645 4360.5 3644.5 4360.5 3633.67~gge28740~0","TRACK~2.3622~2~U1_3V3_1~4062.47 3656.56 4066.2 3656.56 4071.65 3662.01 4071.65 3718.53 4075.13 3722.02 4090.97 3722.02 4107.4 3738.45~gge28738~0","TRACK~2.3622~2~U1_3V3_2~4382.96 3687 4387 3687~gge28728~0","TRACK~2.3622~2~U1_3V3_2~4360 3715 4382.96 3692.04 4382.96 3687~gge28727~0","TRACK~2.3622~2~U1_3V3_2~4382.96 3687 4380.08 3684.12 4380.08 3641.87~gge28726~0","TRACK~2.3622~2~U1_3V3_2~4270 3655 4300 3685 4300 3708.53~gge28725~0","TRACK~2.3622~2~U1_3V3_2~4300 3708.53 4300 3715~gge28724~0","TRACK~2.3622~2~U1_3V3_2~4300 3708.53 4353.53 3708.53 4360 3715~gge28723~0","TRACK~2.3622~2~U1_3V3_2~4147.4 3738.45 4147.4 3735.32 4167.11 3715.61~gge28709~0","TRACK~2.3622~2~U1_3V3_2~4167.11 3715.61 4167.11 3651.53 4180.88 3637.76~gge28708~0","TRACK~3.937~2~BAT~4389.61 3748.59 4392.06 3751.04~gge28706~0","TRACK~3.937~2~BAT~4237 3715.5 4245.91 3715.5~gge28705~0","TRACK~2.3622~2~U3_23~4261.43 3632.16 4253.1 3623.82 4140.14 3623.82 4133.22 3630.75 4105.3 3630.75 4089.12 3646.93~gge28701~0","TRACK~2.3622~2~GND~4062.47 3661.48 4060.92 3661.48 4057.9 3658.45 4057.9 3650.94 4059.02 3649.82 4059.02 3637.27 4053.62 3631.87~gge28695~0","TRACK~2.3622~2~GND~4117.4 3744.46 4103.42 3744.46 4097.4 3738.45~gge28688~0","TRACK~2.3622~2~GND~4270 3715 4264.04 3709.04 4264.04 3650.96 4270 3645~gge28685~0","TRACK~2.3622~2~GND~4304.17 3606.5 4290.37 3606.5 4273.07 3623.8~gge28679~0","TRACK~2.3622~2~GND~4062.47 3691.01 4064.65 3691.01~gge28675~0","TRACK~2.3622~2~GND~4064.65 3691.01 4067.12 3688.54 4067.12 3664.12 4064.48 3661.48 4062.47 3661.48~gge28674~0","TRACK~2.3622~2~GND~4400.08 3631.87 4400.08 3628.21 4393 3621.13~gge28670~0","TRACK~2.3622~2~GND~4399.94 3751.04 4399.94 3762.86~gge28666~0","TRACK~2.3622~2~GND~4097.4 3738.45 4087.37 3728.42 4075.67 3728.42 4064.65 3717.39 4064.65 3691.01~gge28663~0","TRACK~2.3622~2~GND~4097.4 3738.45 4087.37 3728.42 4075.67 3728.42 4064.65 3717.39 4064.65 3691.01~gge28657~0","TRACK~2.3622~2~U1_22~4127.402 3738.445 4127.402 3732.098 4130.5 3729 4143.5 3729 4147.5 3725 4147.5 3715.723 4147.613 3715.61~gge28930~0","TRACK~2.3622~2~GND~4117.4 3744.46 4117.4 3738.45~gge28687~0","COPPERAREA~1~2~GND~M 4003 3577.5 L 4434.5 3577.5 L 4437 3575 L 4437 3867 L3994.5,3867 L3992.5,3865 Z~1~solid~gge3621~spoke~none~[[\"M 4412.43387 3848.41805 L 4412.2808 3848.4485 4021.42 3848.4485 4021.26693 3848.41805 4021.13716 3848.33134 4021.05045 3848.20157 4021.02 3848.0485 4021.02 3792.11536 4021.04923 3791.96525 4021.13266 3791.83708 4021.25809 3791.74959 4021.40718 3791.71556 4021.55815 3791.73997 4021.68892 3791.81925 4021.75841 3791.88235 4022.22054 3792.20471 4022.71953 3792.46504 4022.75 3792.47614 4022.75 3790.1945 4021.42 3790.1945 4021.26693 3790.16405 4021.13716 3790.07734 4021.05045 3789.94757 4021.02 3789.7945 4021.02 3787.0945 4021.05045 3786.94143 4021.13716 3786.81166 4021.26693 3786.72495 4021.42 3786.6945 4022.75 3786.6945 4022.75 3784.41286 4022.71953 3784.42396 4022.22054 3784.68429 4021.75841 3785.00665 4021.68892 3785.06975 4021.55815 3785.14903 4021.40718 3785.17344 4021.25809 3785.13941 4021.13266 3785.05192 4021.04923 3784.92375 4021.02 3784.77364 4021.02 3598.92 4021.05045 3598.76693 4021.13716 3598.63716 4021.26693 3598.55045 4021.42 3598.52 4192.91143 3598.52 4193.06932 3598.55248 4193.20158 3598.64466 4193.2867 3598.78155 4193.31088 3598.94093 4193.27018 3599.09692 4193.17121 3599.22416 4193.01519 3599.35741 4180.12686 3612.24574 4179.77479 3612.57881 4179.52462 3612.91173 4179.33035 3613.28187 4179.19798 3613.67838 4179.13092 3614.09099 4179.13092 3614.50901 4179.19798 3614.92162 4179.33035 3615.31813 4179.52462 3615.68827 4179.77574 3616.02246 4180.07722 3616.31204 4180.16367 3616.37171 4180.27876 3616.49396 4180.33353 3616.65269 4180.31833 3616.8199 4180.23585 3616.96615 4180.10061 3617.06566 4179.93645 3617.1009 4136.36564 3617.1009 4135.9487 3617.13356 4135.55522 3617.22771 4135.18138 3617.38224 4134.83632 3617.59334 4134.51654 3617.86605 4128.66995 3623.70395 4128.54025 3623.79051 4128.38731 3623.8209 4103.12439 3623.8209 4102.97342 3623.79132 4102.84478 3623.70694 4102.7575 3623.58026 4102.72449 3623.43001 4102.75063 3623.2784 4102.83205 3623.14788 4103.0893 3622.87243 4103.38519 3622.45325 4103.62124 3621.9977 4103.64491 3621.9311 4101.6043 3621.9311 4101.6043 3623.4209 4101.57385 3623.57397 4101.48714 3623.70374 4101.35737 3623.79045 4101.2043 3623.8209 4099.1421 3623.8209 4098.98903 3623.79045 4098.85926 3623.70374 4098.77255 3623.57397 4098.7421 3623.4209 4098.7421 3621.9311 4096.70149 3621.9311 4096.72516 3621.9977 4096.96121 3622.45325 4097.2571 3622.87243 4097.51435 3623.14788 4097.59577 3623.2784 4097.62191 3623.43001 4097.5889 3623.58026 4097.50162 3623.70694 4097.37298 3623.79132 4097.22201 3623.8209 4074.77799 3623.8209 4074.62702 3623.79132 4074.49838 3623.70694 4074.4111 3623.58026 4074.37809 3623.43001 4074.40423 3623.2784 4074.48565 3623.14788 4074.7429 3622.87243 4075.03879 3622.45325 4075.27484 3621.9977 4075.44666 3621.51424 4075.55105 3621.01189 4075.58607 3620.5 4075.55105 3619.98811 4075.44666 3619.48576 4075.27484 3619.0023 4075.03879 3618.54675 4074.7429 3618.12757 4074.3927 3617.75259 4073.99469 3617.42879 4073.55631 3617.1622 4073.0857 3616.95779 4072.59165 3616.81936 4072.08334 3616.7495 4071.57026 3616.7495 4071.06195 3616.81936 4070.5679 3616.95779 4070.09729 3617.1622 4069.65891 3617.42879 4069.2609 3617.75259 4068.9107 3618.12757 4068.61481 3618.54675 4068.37876 3619.0023 4068.20694 3619.48576 4068.10255 3619.98811 4068.06753 3620.5 4068.10255 3621.01189 4068.20694 3621.51424 4068.37876 3621.9977 4068.61481 3622.45325 4068.9107 3622.87243 4069.16795 3623.14788 4069.24937 3623.2784 4069.27551 3623.43001 4069.2425 3623.58026 4069.15522 3623.70694 4069.02658 3623.79132 4068.87561 3623.8209 4049.10572 3623.8209 4048.68673 3623.85387 4048.2934 3623.94831 4047.91967 3624.10311 4047.57477 3624.31446 4047.25519 3624.58741 4043.83807 3628.00454 4043.7083 3628.09125 4043.55522 3628.12169 4043.36361 3628.12169 4042.8556 3628.19152 4042.36184 3628.32986 4041.89151 3628.53416 4041.45337 3628.80059 4041.0556 3629.1242 4040.7056 3629.49896 4040.40989 3629.91789 4040.17398 3630.37318 4040.00226 3630.85636 4039.89793 3631.35841 4039.86293 3631.87 4039.89793 3632.38159 4040.00226 3632.88364 4040.17398 3633.36682 4040.40989 3633.82211 4040.7056 3634.24104 4041.0556 3634.6158 4041.45337 3634.93941 4041.89151 3635.20584 4042.36184 3635.41014 4042.8556 3635.54848 4043.36361 3635.61831 4043.87639 3635.61831 4044.3844 3635.54848 4044.87816 3635.41014 4045.34849 3635.20584 4045.78663 3634.93941 4046.1844 3634.6158 4046.5344 3634.24104 4046.83011 3633.82211 4047.06602 3633.36682 4047.23774 3632.88364 4047.34207 3632.38159 4047.37489 3631.90183 4047.40985 3631.76353 4047.49111 3631.64629 4049.96162 3629.17578 4050.10318 3629.0844 4050.26981 3629.05942 4050.43195 3629.10528 4050.56081 3629.21383 4050.63355 3629.36581 4050.63725 3629.53426 4050.57125 3629.68929 4050.40989 3629.91789 4050.17398 3630.37318 4050.15023 3630.44 4052.19 3630.44 4052.19 3629.3791 4052.22045 3629.22603 4052.30716 3629.09626 4052.43693 3629.00955 4052.59 3628.9791 4054.65 3628.9791 4054.80307 3629.00955 4054.93284 3629.09626 4055.01955 3629.22603 4055.05 3629.3791 4055.05 3630.44 4057.08977 3630.44 4057.06602 3630.37318 4056.83011 3629.91789 4056.61262 3629.60977 4056.54569 3629.44975 4056.5528 3629.27645 4056.6326 3629.12245 4056.77008 3629.01671 4056.9394 3628.9791 4102.45782 3628.9791 4102.61089 3629.00955 4102.74066 3629.09626 4102.82737 3629.22603 4102.85782 3629.3791 4102.82737 3629.53217 4102.74066 3629.66194 4087.52686 3644.87574 4087.17479 3645.20881 4086.92462 3645.54173 4086.73035 3645.91187 4086.59798 3646.30838 4086.53092 3646.72099 4086.53092 3647.13901 4086.59798 3647.55162 4086.73035 3647.94813 4086.92462 3648.31827 4087.17574 3648.65246 4087.47722 3648.94204 4087.82125 3649.1795 4088.19891 3649.3587 4088.60043 3649.475 4089.01541 3649.52539 4089.43309 3649.50856 4089.84267 3649.42494 4090.23353 3649.27671 4090.59555 3649.0677 4090.91935 3648.80332 4091.12418 3648.57322 4106.25114 3633.44626 4106.38091 3633.35955 4106.53398 3633.3291 4132.91782 3633.3291 4133.07089 3633.35955 4133.20066 3633.44626 4133.28737 3633.57603 4133.31782 3633.7291 4133.28737 3633.88217 4133.20066 3634.01194 4125.00496 3642.20764 4124.87519 3642.29435 4124.72212 3642.3248 4123.2148 3642.3248 4123.2148 3643.83212 4123.18435 3643.98519 4123.09764 3644.11496 4102.86686 3664.34574 4102.51479 3664.67881 4102.26462 3665.01173 4102.07035 3665.38187 4101.93798 3665.77838 4101.87092 3666.19099 4101.87092 3666.60901 4101.93798 3667.02162 4102.07035 3667.41813 4102.26034 3667.78011 4102.3051 3667.93703 4102.28348 3668.09876 4102.19906 3668.23841 4102.0659 3668.33272 4101.90615 3668.366 4075.1574 3668.366 4075.118 3668.4054 4075.118 3709.6651 4075.1574 3709.7045 4157.7556 3709.7045 4157.795 3709.6651 4157.795 3668.4054 4157.7556 3668.366 4107.10708 3668.366 4106.95401 3668.33555 4106.82424 3668.24884 4106.73753 3668.11907 4106.70708 3667.966 4106.73753 3667.81293 4106.82424 3667.68316 4140.15114 3634.35626 4140.28091 3634.26955 4140.43398 3634.2391 4199.05777 3634.2391 4199.21066 3634.26947 4199.34033 3634.35597 4202.5749 3637.58405 4202.66173 3637.7137 4202.69234 3637.86671 4202.693 3638.42516 4202.66361 3638.57612 4202.57943 3638.70483 4202.45291 3638.79227 4202.30275 3638.82551 4202.15115 3638.79963 4201.82267 3638.67506 4201.41309 3638.59144 4200.99541 3638.57461 4200.58043 3638.625 4200.17891 3638.7413 4199.80125 3638.9205 4199.45722 3639.15796 4199.15574 3639.44754 4198.90462 3639.78173 4198.71035 3640.15187 4198.57798 3640.54838 4198.51092 3640.96099 4198.51092 3641.37901 4198.5209 3641.47269 4198.5209 3655.80602 4198.49045 3655.95909 4198.40374 3656.08886 4180.30686 3674.18574 4179.95479 3674.51881 4179.70462 3674.85173 4179.51035 3675.22187 4179.37798 3675.61838 4179.31092 3676.03099 4179.31092 3676.44901 4179.3209 3676.54269 4179.3209 3774.36602 4179.29045 3774.51909 4179.20374 3774.64886 4126.18662 3827.66598 4125.93212 3827.96061 4125.71633 3828.30409 4125.55736 3828.67605 4125.45854 3829.06831 4125.42089 3829.4869 4125.36299 3834.66855 4125.32243 3834.83964 4125.21241 3834.97681 4124.94537 3835.18977 4124.55339 3835.59453 4124.21638 3836.04609 4123.93988 3836.53704 4123.72843 3837.05931 4123.58551 3837.60434 4123.51346 3838.16317 4123.51346 3838.72663 4123.58551 3839.28546 4123.72843 3839.83049 4123.93988 3840.35276 4124.21638 3840.84371 4124.55339 3841.29527 4124.94537 3841.70003 4125.3859 3842.05134 4125.86774 3842.34343 4126.38297 3842.57151 4126.92314 3842.73183 4127.47937 3842.82176 4128.04254 3842.83982 4128.60339 3842.78571 4129.15272 3842.66033 4129.6815 3842.46573 4130.18106 3842.20511 4130.64319 3841.88275 4131.06031 3841.50394 4131.42556 3841.0749 4131.73294 3840.60267 4131.97742 3840.09502 4132.15497 3839.56026 4132.26268 3839.0072 4132.29878 3838.4449 4132.26268 3837.8826 4132.15497 3837.32954 4131.97742 3836.79478 4131.73294 3836.28713 4131.42556 3835.8149 4131.06031 3835.38586 4130.65205 3835.01509 4130.55431 3834.87885 4130.521 3834.71451 4130.56537 3830.74327 4130.59665 3830.5926 4130.6825 3830.4649 4183.71259 3777.43481 4183.98554 3777.11523 4184.19689 3776.77033 4184.35169 3776.3966 4184.44613 3776.00327 4184.4791 3775.58428 4184.4791 3677.47398 4184.50955 3677.32091 4184.59626 3677.19114 4202.0354 3659.752 4202.1651 3659.66532 4202.31809 3659.63484 4202.4711 3659.6652 4202.60087 3659.75178 4202.68765 3659.88141 4202.71824 3660.03437 4202.84943 3772.31383 4202.81805 3772.46959 4202.72851 3772.60085 4146.21185 3827.64137 4145.9347 3827.95731 4145.71879 3828.29939 4145.55906 3828.67103 4145.45943 3829.06308 4145.42096 3829.48118 4145.36299 3834.66855 4145.32243 3834.83964 4145.21241 3834.97681 4144.94537 3835.18977 4144.55339 3835.59453 4144.21638 3836.04609 4143.93988 3836.53704 4143.72843 3837.05931 4143.58551 3837.60434 4143.51346 3838.16317 4143.51346 3838.72663 4143.58551 3839.28546 4143.72843 3839.83049 4143.93988 3840.35276 4144.21638 3840.84371 4144.55339 3841.29527 4144.94537 3841.70003 4145.3859 3842.05134 4145.86774 3842.34343 4146.38297 3842.57151 4146.92314 3842.73183 4147.47937 3842.82176 4148.04254 3842.83982 4148.60339 3842.78571 4149.15272 3842.66033 4149.6815 3842.46573 4150.18106 3842.20511 4150.64319 3841.88275 4151.06031 3841.50394 4151.42556 3841.0749 4151.73294 3840.60267 4151.97742 3840.09502 4152.15497 3839.56026 4152.26268 3839.0072 4152.29878 3838.4449 4152.26268 3837.8826 4152.15497 3837.32954 4151.97742 3836.79478 4151.73294 3836.28713 4151.42556 3835.8149 4151.06031 3835.38586 4150.65205 3835.01509 4150.55431 3834.87885 4150.521 3834.71451 4150.56511 3830.76632 4150.59743 3830.61321 4150.68601 3830.48422 4207.21815 3775.42863 4207.4953 3775.11269 4207.71121 3774.77061 4207.87094 3774.39897 4207.97021 3774.00832 4208.00908 3773.54983 4207.84912 3636.64269 4207.81572 3636.22419 4207.72089 3635.83093 4207.56572 3635.45737 4207.35401 3635.11267 4207.08074 3634.79337 4202.29168 3630.01392 4202.08935 3629.78668 4201.76555 3629.5223 4201.40353 3629.31329 4201.01267 3629.16506 4200.60309 3629.08144 4200.18541 3629.06461 4200.02704 3629.0809 4139.49616 3629.0809 4139.34313 3629.05047 4139.21338 3628.96381 4139.12666 3628.83411 4139.09616 3628.68109 4139.12652 3628.52805 4139.21311 3628.39826 4141.0922 3626.51646 4141.22204 3626.4296 4141.37524 3626.3991 4225.82312 3626.3991 4225.97602 3626.42947 4226.10569 3626.51598 4226.19245 3626.64549 4226.22312 3626.79832 4226.19304 3626.95128 4226.10679 3627.08112 4225.31187 3627.88069 4225.04462 3628.19452 4224.83311 3628.53967 4224.67831 3628.9134 4224.58387 3629.30673 4224.5509 3629.72572 4224.5509 3689.36602 4224.52045 3689.51909 4224.43374 3689.64886 4215.03741 3699.04519 4214.76446 3699.36477 4214.55311 3699.70967 4214.39831 3700.0834 4214.30387 3700.47673 4214.2709 3700.89572 4214.2709 3761.79031 4214.26092 3761.88399 4214.26092 3762.30201 4214.2709 3762.39569 4214.2709 3763.40328 4214.30387 3763.82227 4214.39831 3764.2156 4214.55311 3764.58933 4214.76446 3764.93423 4215.02718 3765.24182 4215.33477 3765.50454 4215.67967 3765.71589 4216.0534 3765.87069 4216.44673 3765.96513 4216.85 3765.99686 4217.25327 3765.96513 4217.6466 3765.87069 4218.02033 3765.71589 4218.36523 3765.50454 4218.68359 3765.22922 4218.80616 3765.13259 4218.95637 3765.09023 4219.11136 3765.10857 4219.24753 3765.18483 4219.50477 3765.40454 4219.84967 3765.61589 4220.2234 3765.77069 4220.61673 3765.86513 4221.02 3765.89686 4221.42327 3765.86513 4221.8166 3765.77069 4222.19033 3765.61589 4222.53523 3765.40454 4222.84282 3765.14182 4223.10554 3764.83423 4223.31689 3764.48933 4223.47169 3764.1156 4223.56613 3763.72227 4223.5991 3763.30328 4223.6004 3762.30484 4223.6175 3762.093 4223.5991 3761.84897 4223.5991 3719.24269 4223.6366 3719.07359 4223.74208 3718.93619 4223.89576 3718.85627 4224.06881 3718.84882 4224.22879 3718.91522 4224.721 3719.26045 4225.21953 3719.52054 4225.25 3719.53164 4225.25 3717.25 4223.9991 3717.25 4223.84603 3717.21955 4223.71626 3717.13284 4223.62955 3717.00307 4223.5991 3716.85 4223.5991 3714.15 4223.62955 3713.99693 4223.71626 3713.86716 4223.84603 3713.78045 4223.9991 3713.75 4225.25 3713.75 4225.25 3711.46836 4225.21953 3711.47946 4224.721 3711.73955 4224.22879 3712.08478 4224.06881 3712.15118 4223.89576 3712.14373 4223.74208 3712.06381 4223.6366 3711.92641 4223.5991 3711.75731 4223.5991 3706.74398 4223.62955 3706.59091 4223.71626 3706.46114 4234.02259 3696.15481 4234.29554 3695.83523 4234.50689 3695.49033 4234.66169 3695.1166 4234.75613 3694.72327 4234.7891 3694.30428 4234.7891 3672.55398 4234.81955 3672.40091 4234.90626 3672.27114 4235.30259 3671.87481 4235.57554 3671.55523 4235.78689 3671.21033 4235.94169 3670.8366 4236.03613 3670.44327 4236.0691 3670.02428 4236.0691 3636.06403 4236.0875 3635.82 4236.05386 3635.40333 4235.95382 3634.99746 4235.78997 3634.61288 4235.56655 3634.25957 4235.28935 3633.94668 4234.96555 3633.6823 4234.60353 3633.47329 4234.21267 3633.32506 4233.80309 3633.24144 4233.38541 3633.22461 4232.97043 3633.275 4232.56891 3633.3913 4232.19125 3633.5705 4231.84722 3633.80796 4231.54574 3634.09754 4231.29462 3634.43173 4231.10035 3634.80187 4230.96798 3635.19838 4230.90092 3635.61099 4230.90092 3636.02901 4230.9109 3636.12269 4230.9109 3668.80602 4230.88045 3668.95909 4230.79374 3669.08886 4230.60882 3669.27356 4230.3839 3669.4862 4230.25349 3669.56857 4230.10162 3669.59547 4229.95086 3669.56291 4229.82363 3669.47573 4229.73884 3669.34688 4229.7091 3669.19554 4229.7091 3630.9389 4229.73933 3630.78636 4229.82543 3630.65688 4230.4921 3629.98632 4230.63935 3629.86332 4230.91655 3629.55043 4231.13997 3629.19712 4231.30382 3628.81254 4231.40386 3628.40667 4231.4375 3627.99 4231.40386 3627.57333 4231.30382 3627.16746 4231.21368 3626.95589 4231.18169 3626.80232 4231.2112 3626.64826 4231.29769 3626.5174 4231.42786 3626.42986 4231.58167 3626.3991 4251.86497 3626.3991 4252.01815 3626.42959 4252.14798 3626.51643 4259.40682 3633.78398 4259.48574 3633.88246 4259.78722 3634.17204 4260.13125 3634.4095 4260.50891 3634.5887 4260.91043 3634.705 4261.32541 3634.75539 4261.74309 3634.73856 4262.15267 3634.65494 4262.54353 3634.50671 4262.90555 3634.2977 4263.22935 3634.03332 4263.50655 3633.72043 4263.72997 3633.36712 4263.89382 3632.98254 4263.99386 3632.57667 4264.0275 3632.16 4263.99386 3631.74333 4263.89382 3631.33746 4263.72622 3630.94408 4263.69423 3630.79075 4263.72357 3630.63689 4263.80975 3630.50609 4263.93955 3630.41841 4264.09306 3630.3873 4264.24676 3630.41753 4264.37706 3630.50446 4267.79519 3633.92259 4268.11477 3634.19554 4268.45967 3634.40689 4268.8334 3634.56169 4269.22673 3634.65613 4269.64572 3634.6891 4278.93428 3634.6891 4279.35327 3634.65613 4279.7466 3634.56169 4280.12033 3634.40689 4280.46523 3634.19554 4280.78481 3633.92259 4281.98114 3632.72626 4282.11091 3632.63955 4282.26398 3632.6091 4292.03782 3632.6091 4292.19089 3632.63955 4292.32066 3632.72626 4292.40737 3632.85603 4292.43782 3633.0091 4292.40737 3633.16217 4292.32066 3633.29194 4289.97886 3635.63374 4289.84909 3635.72045 4289.69602 3635.7509 4255.48568 3635.7509 4255.06773 3635.78371 4254.67432 3635.87801 4254.30054 3636.03267 4253.95555 3636.2439 4253.63587 3636.51672 4240.55731 3649.58546 4240.20476 3649.91885 4239.95462 3650.25173 4239.76035 3650.62187 4239.62798 3651.01838 4239.56092 3651.43099 4239.56092 3651.84901 4239.62798 3652.26162 4239.76035 3652.65813 4239.95462 3653.02827 4240.20574 3653.36246 4240.50722 3653.65204 4240.85125 3653.8895 4241.22891 3654.0687 4241.63043 3654.185 4242.04541 3654.23539 4242.46309 3654.21856 4242.87267 3654.13494 4243.26353 3653.98671 4243.62555 3653.7777 4243.94935 3653.51332 4244.15324 3653.28429 4256.42059 3641.02615 4256.55032 3640.93952 4256.70333 3640.9091 4266.94904 3640.9091 4267.10703 3640.94163 4267.23933 3641.03391 4267.32442 3641.17095 4267.34847 3641.33046 4267.30755 3641.48649 4267.20833 3641.61368 4266.94096 3641.84129 4266.56215 3642.25841 4266.23979 3642.72054 4265.97946 3643.21953 4265.96836 3643.25 4268.25 3643.25 4268.25 3641.3091 4268.28045 3641.15603 4268.36716 3641.02626 4268.49693 3640.93955 4268.65 3640.9091 4271.35 3640.9091 4271.50307 3640.93955 4271.63284 3641.02626 4271.71955 3641.15603 4271.75 3641.3091 4271.75 3643.25 4274.03164 3643.25 4274.02054 3643.21953 4273.76021 3642.72054 4273.43785 3642.25841 4273.05904 3641.84129 4272.79167 3641.61368 4272.69245 3641.48649 4272.65153 3641.33046 4272.67558 3641.17095 4272.76067 3641.03391 4272.89297 3640.94163 4273.05096 3640.9091 4276.94904 3640.9091 4277.10703 3640.94163 4277.23933 3641.03391 4277.32442 3641.17095 4277.34847 3641.33046 4277.30755 3641.48649 4277.20833 3641.61368 4276.94096 3641.84129 4276.56215 3642.25841 4276.23979 3642.72054 4275.97917 3643.2201 4275.78457 3643.74888 4275.65919 3644.29821 4275.60508 3644.85906 4275.62314 3645.42223 4275.71307 3645.97846 4275.87339 3646.51863 4276.10147 3647.03386 4276.39356 3647.5157 4276.74487 3647.95623 4277.14963 3648.34821 4277.60119 3648.68522 4278.09214 3648.96172 4278.61441 3649.17317 4279.15944 3649.31609 4279.71827 3649.38814 4280.28173 3649.38814 4280.84056 3649.31609 4281.38559 3649.17317 4281.90786 3648.96172 4282.39881 3648.68522 4282.85037 3648.34821 4283.25513 3647.95623 4283.60644 3647.5157 4283.89853 3647.03386 4284.12661 3646.51863 4284.28693 3645.97846 4284.37686 3645.42223 4284.39492 3644.85906 4284.34081 3644.29821 4284.21543 3643.74888 4284.02083 3643.2201 4283.76021 3642.72054 4283.43785 3642.25841 4283.05904 3641.84129 4282.79167 3641.61368 4282.69245 3641.48649 4282.65153 3641.33046 4282.67558 3641.17095 4282.76067 3641.03391 4282.89297 3640.94163 4283.05096 3640.9091 4286.94904 3640.9091 4287.10703 3640.94163 4287.23933 3641.03391 4287.32442 3641.17095 4287.34847 3641.33046 4287.30755 3641.48649 4287.20833 3641.61368 4286.94096 3641.84129 4286.56215 3642.25841 4286.23979 3642.72054 4285.97917 3643.2201 4285.78457 3643.74888 4285.65919 3644.29821 4285.60508 3644.85906 4285.62314 3645.42223 4285.71307 3645.97846 4285.87339 3646.51863 4286.10147 3647.03386 4286.39356 3647.5157 4286.74487 3647.95623 4287.14963 3648.34821 4287.60119 3648.68522 4288.09214 3648.96172 4288.61441 3649.17317 4289.15944 3649.31609 4289.71827 3649.38814 4290.28173 3649.38814 4290.84056 3649.31609 4291.38559 3649.17317 4291.90786 3648.96172 4292.39881 3648.68522 4292.85037 3648.34821 4293.25513 3647.95623 4293.60644 3647.5157 4293.89853 3647.03386 4294.12661 3646.51863 4294.28693 3645.97846 4294.37686 3645.42223 4294.39492 3644.85906 4294.34081 3644.29821 4294.21543 3643.74888 4294.02083 3643.2201 4293.76021 3642.72054 4293.43785 3642.25841 4293.05904 3641.84129 4292.63 3641.47604 4292.2319 3641.21691 4292.11792 3641.10449 4292.05715 3640.95637 4292.05933 3640.79629 4292.12411 3640.64989 4292.24111 3640.54062 4292.44523 3640.41554 4292.76481 3640.14259 4296.27738 3636.63002 4296.42935 3636.50332 4296.70655 3636.19043 4296.92997 3635.83712 4297.04137 3635.57566 4297.12881 3635.44733 4297.25852 3635.36197 4297.41097 3635.33245 4297.56318 3635.3632 4297.6922 3635.4496 4303.04372 3640.80111 4303.13433 3640.94067 4303.16032 3641.10501 4303.11719 3641.26572 4303.01241 3641.39497 4302.86411 3641.47041 4302.69794 3641.47897 4302.54266 3641.41919 4302.15777 3641.16866 4301.65012 3640.92418 4301.11536 3640.74663 4300.5623 3640.63892 4300 3640.60282 4299.4377 3640.63892 4298.88464 3640.74663 4298.34988 3640.92418 4297.84223 3641.16866 4297.37 3641.47604 4296.94096 3641.84129 4296.56215 3642.25841 4296.23979 3642.72054 4295.97917 3643.2201 4295.78457 3643.74888 4295.65919 3644.29821 4295.60508 3644.85906 4295.62314 3645.42223 4295.71307 3645.97846 4295.87339 3646.51863 4296.10147 3647.03386 4296.39356 3647.5157 4296.74487 3647.95623 4297.14963 3648.34821 4297.60119 3648.68522 4298.09214 3648.96172 4298.61441 3649.17317 4299.15944 3649.31609 4299.71827 3649.38814 4300.28173 3649.38814 4300.84056 3649.31609 4301.38559 3649.17317 4301.90786 3648.96172 4302.39881 3648.68522 4302.85037 3648.34821 4303.25513 3647.95623 4303.60644 3647.5157 4303.89853 3647.03386 4304.12661 3646.51863 4304.28693 3645.97846 4304.37686 3645.42223 4304.39492 3644.85906 4304.34081 3644.29821 4304.21543 3643.74888 4304.02083 3643.2201 4303.76021 3642.72054 4303.57495 3642.45495 4303.50988 3642.29987 4303.51431 3642.13175 4303.58746 3641.98031 4303.71639 3641.87232 4303.87831 3641.82687 4304.0446 3641.852 4304.18587 3641.94326 4305.6667 3643.4241 4305.74424 3643.53338 4305.78134 3643.66215 4305.77383 3643.79595 4305.65919 3644.29821 4305.60508 3644.85906 4305.62314 3645.42223 4305.71307 3645.97846 4305.87339 3646.51863 4306.10147 3647.03386 4306.39356 3647.5157 4306.74487 3647.95623 4307.14963 3648.34821 4307.60119 3648.68522 4308.09214 3648.96172 4308.61441 3649.17317 4309.15944 3649.31609 4309.71827 3649.38814 4310.28173 3649.38814 4310.84056 3649.31609 4311.38559 3649.17317 4311.90786 3648.96172 4312.39881 3648.68522 4312.85037 3648.34821 4313.25513 3647.95623 4313.60644 3647.5157 4313.89853 3647.03386 4314.12661 3646.51863 4314.28693 3645.97846 4314.37686 3645.42223 4314.39492 3644.85906 4314.34081 3644.29821 4314.21543 3643.74888 4314.02083 3643.2201 4313.76021 3642.72054 4313.43785 3642.25841 4313.05904 3641.84129 4312.63 3641.47604 4312.15777 3641.16866 4311.65012 3640.92418 4311.11536 3640.74663 4310.5623 3640.63892 4310.30039 3640.62211 4310.16118 3640.58739 4310.04317 3640.50577 4298.22934 3628.69194 4298.14263 3628.56217 4298.11218 3628.4091 4298.14263 3628.25603 4298.22934 3628.12626 4298.35911 3628.03955 4298.51218 3628.0091 4309.19602 3628.0091 4309.34909 3628.03955 4309.47886 3628.12626 4321.41146 3640.05886 4321.50288 3640.20055 4321.52779 3640.36733 4321.48176 3640.52955 4321.37297 3640.65839 4321.22075 3640.73095 4321.05215 3640.73432 4320.5623 3640.63892 4320 3640.60282 4319.4377 3640.63892 4318.88464 3640.74663 4318.34988 3640.92418 4317.84223 3641.16866 4317.37 3641.47604 4316.94096 3641.84129 4316.56215 3642.25841 4316.23979 3642.72054 4315.97917 3643.2201 4315.78457 3643.74888 4315.65919 3644.29821 4315.60508 3644.85906 4315.62314 3645.42223 4315.71307 3645.97846 4315.87339 3646.51863 4316.10147 3647.03386 4316.39356 3647.5157 4316.74487 3647.95623 4317.14963 3648.34821 4317.60119 3648.68522 4318.09214 3648.96172 4318.61441 3649.17317 4319.15944 3649.31609 4319.71827 3649.38814 4320.28173 3649.38814 4320.84056 3649.31609 4321.38559 3649.17317 4321.90786 3648.96172 4322.39881 3648.68522 4322.85037 3648.34821 4323.25513 3647.95623 4323.60644 3647.5157 4323.89853 3647.03386 4324.12661 3646.51863 4324.28693 3645.97846 4324.37686 3645.42223 4324.39492 3644.85906 4324.34081 3644.29821 4324.26234 3643.9544 4324.26074 3643.78369 4324.33047 3643.62787 4324.45882 3643.51531 4324.62242 3643.46651 4324.79146 3643.49038 4324.93515 3643.58255 4325.52502 3644.17242 4325.61866 3644.32013 4325.64033 3644.49367 4325.60508 3644.85906 4325.62314 3645.42223 4325.71307 3645.97846 4325.87339 3646.51863 4326.10147 3647.03386 4326.39356 3647.5157 4326.74487 3647.95623 4327.14963 3648.34821 4327.60119 3648.68522 4328.09214 3648.96172 4328.61441 3649.17317 4329.15944 3649.31609 4329.71827 3649.38814 4330.28173 3649.38814 4330.84056 3649.31609 4331.38559 3649.17317 4331.90786 3648.96172 4332.39881 3648.68522 4332.85037 3648.34821 4333.25513 3647.95623 4333.60644 3647.5157 4333.89853 3647.03386 4334.12661 3646.51863 4334.28693 3645.97846 4334.37686 3645.42223 4334.39492 3644.85906 4334.34081 3644.29821 4334.21543 3643.74888 4334.02083 3643.2201 4333.76021 3642.72054 4333.43785 3642.25841 4333.05904 3641.84129 4332.63 3641.47604 4332.15777 3641.16866 4331.65012 3640.92418 4331.11536 3640.74663 4330.5623 3640.63892 4330 3640.60282 4329.476 3640.63647 4329.30922 3640.61156 4329.16753 3640.52013 4312.26481 3623.61741 4311.94523 3623.34446 4311.60033 3623.13311 4311.2266 3622.97831 4310.83327 3622.88387 4310.41428 3622.8509 4277.70572 3622.8509 4277.28673 3622.88387 4276.8934 3622.97831 4276.51967 3623.13311 4276.17477 3623.34446 4275.85519 3623.61741 4274.20886 3625.26374 4274.07909 3625.35045 4273.92602 3625.3809 4272.58043 3625.3809 4272.42773 3625.35061 4272.29816 3625.26432 4271.58683 3624.55588 4271.4997 3624.42591 4271.4691 3624.27246 4271.4691 3622.19468 4271.49958 3622.04153 4271.58637 3621.91173 4283.21185 3610.29554 4283.48493 3609.97606 4283.69642 3609.63124 4283.85137 3609.25758 4283.94596 3608.86428 4283.9791 3608.4454 4283.9791 3604.49572 4283.94613 3604.07673 4283.85169 3603.6834 4283.69689 3603.30967 4283.48554 3602.96477 4283.21259 3602.64519 4279.92481 3599.35741 4279.76879 3599.22416 4279.66982 3599.09692 4279.62912 3598.94093 4279.6533 3598.78155 4279.73842 3598.64466 4279.87068 3598.55248 4280.02857 3598.52 4412.2808 3598.52 4412.43387 3598.55045 4412.56364 3598.63716 4412.65035 3598.76693 4412.6808 3598.92 4412.6808 3765.1903 4412.65035 3765.34337 4412.56364 3765.47314 4412.43387 3765.55985 4412.2808 3765.5903 4406.25565 3765.5903 4405.96364 3765.61906 4405.70175 3765.6985 4405.46039 3765.82751 4405.24883 3766.00113 4405.07521 3766.21269 4404.9462 3766.45405 4404.86676 3766.71594 4404.838 3767.00795 4404.838 3780.35465 4404.86676 3780.64666 4404.9462 3780.90855 4405.07521 3781.14991 4405.24883 3781.36147 4405.46039 3781.53509 4405.70175 3781.6641 4405.96364 3781.74354 4406.25565 3781.7723 4412.2808 3781.7723 4412.43387 3781.80275 4412.56364 3781.88946 4412.65035 3782.01923 4412.6808 3782.1723 4412.6808 3848.0485 4412.65035 3848.20157 4412.56364 3848.33134 4412.43387 3848.41805 Z M 4320.28173 3719.38814 L 4320.84056 3719.31609 4321.38559 3719.17317 4321.90786 3718.96172 4322.39881 3718.68522 4322.85037 3718.34821 4323.25513 3717.95623 4323.60644 3717.5157 4323.89853 3717.03386 4324.12661 3716.51863 4324.28693 3715.97846 4324.37686 3715.42223 4324.39492 3714.85906 4324.34081 3714.29821 4324.21543 3713.74888 4324.02083 3713.2201 4323.76021 3712.72054 4323.43785 3712.25841 4323.05904 3711.84129 4322.92738 3711.68649 4322.88647 3711.53046 4322.91051 3711.37095 4322.9956 3711.23391 4323.1279 3711.14163 4323.28589 3711.1091 4326.71411 3711.1091 4326.8721 3711.14163 4327.0044 3711.23391 4327.08949 3711.37095 4327.11353 3711.53046 4327.07262 3711.68649 4326.94096 3711.84129 4326.56215 3712.25841 4326.23979 3712.72054 4325.97917 3713.2201 4325.78457 3713.74888 4325.65919 3714.29821 4325.60508 3714.85906 4325.62314 3715.42223 4325.71307 3715.97846 4325.87339 3716.51863 4326.10147 3717.03386 4326.39356 3717.5157 4326.74487 3717.95623 4327.14963 3718.34821 4327.60119 3718.68522 4328.09214 3718.96172 4328.61441 3719.17317 4329.15944 3719.31609 4329.71827 3719.38814 4330.28173 3719.38814 4330.84056 3719.31609 4331.38559 3719.17317 4331.90786 3718.96172 4332.39881 3718.68522 4332.85037 3718.34821 4333.25513 3717.95623 4333.60644 3717.5157 4333.89853 3717.03386 4334.12661 3716.51863 4334.28693 3715.97846 4334.37686 3715.42223 4334.39492 3714.85906 4334.34081 3714.29821 4334.21543 3713.74888 4334.02083 3713.2201 4333.76021 3712.72054 4333.43785 3712.25841 4333.05904 3711.84129 4332.92738 3711.68649 4332.88647 3711.53046 4332.91051 3711.37095 4332.9956 3711.23391 4333.1279 3711.14163 4333.28589 3711.1091 4336.71411 3711.1091 4336.8721 3711.14163 4337.0044 3711.23391 4337.08949 3711.37095 4337.11353 3711.53046 4337.07262 3711.68649 4336.94096 3711.84129 4336.56215 3712.25841 4336.23979 3712.72054 4335.97917 3713.2201 4335.78457 3713.74888 4335.65919 3714.29821 4335.60508 3714.85906 4335.62314 3715.42223 4335.71307 3715.97846 4335.87339 3716.51863 4336.10147 3717.03386 4336.39356 3717.5157 4336.74487 3717.95623 4337.14963 3718.34821 4337.60119 3718.68522 4338.09214 3718.96172 4338.61441 3719.17317 4339.15944 3719.31609 4339.71827 3719.38814 4340.28173 3719.38814 4340.84056 3719.31609 4341.38559 3719.17317 4341.90786 3718.96172 4342.39881 3718.68522 4342.85037 3718.34821 4343.25513 3717.95623 4343.60644 3717.5157 4343.89853 3717.03386 4344.12661 3716.51863 4344.28693 3715.97846 4344.37686 3715.42223 4344.39492 3714.85906 4344.34081 3714.29821 4344.21543 3713.74888 4344.02083 3713.2201 4343.76021 3712.72054 4343.43785 3712.25841 4343.05904 3711.84129 4342.92738 3711.68649 4342.88647 3711.53046 4342.91051 3711.37095 4342.9956 3711.23391 4343.1279 3711.14163 4343.28589 3711.1091 4346.71411 3711.1091 4346.8721 3711.14163 4347.0044 3711.23391 4347.08949 3711.37095 4347.11353 3711.53046 4347.07262 3711.68649 4346.94096 3711.84129 4346.56215 3712.25841 4346.23979 3712.72054 4345.97946 3713.21953 4345.96836 3713.25 4348.25 3713.25 4348.25 3711.5091 4348.28045 3711.35603 4348.36716 3711.22626 4348.49693 3711.13955 4348.65 3711.1091 4351.35 3711.1091 4351.50307 3711.13955 4351.63284 3711.22626 4351.71955 3711.35603 4351.75 3711.5091 4351.75 3713.25 4354.43692 3713.25 4354.58999 3713.28045 4354.71976 3713.36716 4355.52502 3714.17242 4355.61866 3714.32013 4355.64033 3714.49367 4355.60508 3714.85906 4355.62314 3715.42223 4355.71307 3715.97846 4355.87339 3716.51863 4356.10147 3717.03386 4356.39356 3717.5157 4356.74487 3717.95623 4357.14963 3718.34821 4357.60119 3718.68522 4358.09214 3718.96172 4358.61441 3719.17317 4359.15944 3719.31609 4359.71827 3719.38814 4360.28173 3719.38814 4360.84056 3719.31609 4361.38559 3719.17317 4361.90786 3718.96172 4362.39881 3718.68522 4362.85037 3718.34821 4363.25513 3717.95623 4363.60644 3717.5157 4363.89853 3717.03386 4364.12661 3716.51863 4364.28693 3715.97846 4364.37686 3715.42223 4364.39492 3714.85906 4364.35967 3714.49367 4364.38134 3714.32013 4364.47498 3714.17242 4384.77259 3693.87481 4385.04554 3693.55523 4385.25689 3693.21033 4385.41169 3692.8366 4385.50613 3692.44327 4385.5391 3692.02428 4385.5391 3691.8245 4385.57717 3691.65419 4385.68413 3691.51629 4385.83962 3691.43707 4386.01405 3691.43158 4386.43013 3691.51096 4387 3691.54681 4387.56987 3691.51096 4388.13075 3691.40396 4388.67379 3691.22752 4389.19044 3690.9844 4389.67255 3690.67845 4390.11251 3690.31448 4390.50338 3689.89825 4390.839 3689.4363 4391.11408 3688.93594 4391.32427 3688.40504 4391.46627 3687.85199 4391.53784 3687.2855 4391.53784 3686.7145 4391.46627 3686.14801 4391.32427 3685.59496 4391.11408 3685.06406 4390.839 3684.5637 4390.50338 3684.10175 4390.11251 3683.68552 4389.67255 3683.32155 4389.19044 3683.0156 4388.67379 3682.77248 4388.13075 3682.59604 4387.56987 3682.48904 4387 3682.45319 4386.43013 3682.48904 4385.86925 3682.59604 4385.32621 3682.77248 4384.80956 3683.0156 4384.32745 3683.32155 4383.88211 3683.69126 4383.75226 3683.78328 4383.5968 3683.81739 4383.44035 3683.78818 4383.30768 3683.70028 4382.77626 3683.16886 4382.68955 3683.03909 4382.6591 3682.88602 4382.6591 3669.97657 4382.69368 3669.81387 4382.79145 3669.67931 4382.93549 3669.59614 4383.10091 3669.57876 4383.2591 3669.63016 4383.38271 3669.74145 4383.49662 3669.89825 4383.88749 3670.31448 4384.32745 3670.67845 4384.80956 3670.9844 4385.32621 3671.22752 4385.86925 3671.40396 4386.43013 3671.51096 4387 3671.54681 4387.56987 3671.51096 4388.13075 3671.40396 4388.67379 3671.22752 4389.19044 3670.9844 4389.67255 3670.67845 4390.11251 3670.31448 4390.50338 3669.89825 4390.839 3669.4363 4391.11408 3668.93594 4391.32427 3668.40504 4391.46627 3667.85199 4391.53784 3667.2855 4391.53784 3666.7145 4391.46627 3666.14801 4391.32427 3665.59496 4391.11408 3665.06406 4390.839 3664.5637 4390.50338 3664.10175 4390.11251 3663.68552 4389.67255 3663.32155 4389.19044 3663.0156 4388.67379 3662.77248 4388.13075 3662.59604 4387.56987 3662.48904 4387 3662.45319 4386.43013 3662.48904 4385.86925 3662.59604 4385.32621 3662.77248 4384.80956 3663.0156 4384.32745 3663.32155 4383.88749 3663.68552 4383.49662 3664.10175 4383.38271 3664.25855 4383.2591 3664.36984 4383.10091 3664.42124 4382.93549 3664.40386 4382.79145 3664.32069 4382.69368 3664.18613 4382.6591 3664.02343 4382.6591 3645.91206 4382.69475 3645.74697 4382.79536 3645.61132 4383.21561 3645.39079 4383.42717 3645.21717 4383.60079 3645.00561 4383.7298 3644.76425 4383.80924 3644.50236 4383.838 3644.21035 4383.838 3639.52965 4383.80924 3639.23764 4383.7298 3638.97575 4383.60079 3638.73439 4383.42717 3638.52283 4383.21561 3638.34921 4382.97425 3638.2202 4382.71236 3638.14076 4382.42035 3638.112 4377.73965 3638.112 4377.44764 3638.14076 4377.18575 3638.2202 4376.94439 3638.34921 4376.73283 3638.52283 4376.55921 3638.73439 4376.4302 3638.97575 4376.35076 3639.23764 4376.322 3639.52965 4376.322 3644.21035 4376.35076 3644.50236 4376.4302 3644.76425 4376.55921 3645.00561 4376.73283 3645.21717 4376.94439 3645.39079 4377.36464 3645.61132 4377.46525 3645.74697 4377.5009 3645.91206 4377.5009 3684.10428 4377.53387 3684.52327 4377.62831 3684.9166 4377.78311 3685.29033 4377.99446 3685.63523 4378.26741 3685.95481 4380.26374 3687.95114 4380.35045 3688.08091 4380.3809 3688.23398 4380.3809 3690.80602 4380.35045 3690.95909 4380.26374 3691.08886 4360.83247 3710.52013 4360.69078 3710.61156 4360.524 3710.63647 4360 3710.60282 4359.476 3710.63647 4359.30922 3710.61156 4359.16753 3710.52013 4355.36481 3706.71741 4355.04523 3706.44446 4354.70033 3706.23311 4354.3266 3706.07831 4353.93327 3705.98387 4353.51428 3705.9509 4302.9791 3705.9509 4302.82603 3705.92045 4302.69626 3705.83374 4302.60955 3705.70397 4302.5791 3705.5509 4302.5791 3685.01572 4302.54613 3684.59673 4302.45169 3684.2034 4302.29689 3683.82967 4302.08554 3683.48477 4301.81259 3683.16519 4278.58281 3659.93542 4278.4899 3659.78972 4278.46712 3659.61842 4278.51871 3659.4535 4278.63506 3659.32573 4278.79445 3659.25896 4278.96712 3659.26566 4279.15944 3659.31609 4279.71827 3659.38814 4280.28173 3659.38814 4280.84056 3659.31609 4281.38559 3659.17317 4281.90786 3658.96172 4282.39881 3658.68522 4282.85037 3658.34821 4283.25513 3657.95623 4283.60644 3657.5157 4283.89853 3657.03386 4284.12661 3656.51863 4284.28693 3655.97846 4284.37686 3655.42223 4284.39492 3654.85906 4284.34081 3654.29821 4284.21543 3653.74888 4284.02083 3653.2201 4283.76021 3652.72054 4283.43785 3652.25841 4283.05904 3651.84129 4282.63 3651.47604 4282.15777 3651.16866 4281.65012 3650.92418 4281.11536 3650.74663 4280.5623 3650.63892 4280 3650.60282 4279.4377 3650.63892 4278.88464 3650.74663 4278.34988 3650.92418 4277.84223 3651.16866 4277.37 3651.47604 4276.94096 3651.84129 4276.56215 3652.25841 4276.23979 3652.72054 4275.97917 3653.2201 4275.78457 3653.74888 4275.65919 3654.29821 4275.60508 3654.85906 4275.62314 3655.42223 4275.71307 3655.97846 4275.73521 3656.18743 4275.67153 3656.35031 4275.54444 3656.47046 4275.37824 3656.5249 4275.2047 3656.50323 4275.05699 3656.40959 4274.47879 3655.83139 4274.40503 3655.72976 4274.36642 3655.61028 4274.37686 3655.42223 4274.39492 3654.85906 4274.34081 3654.29821 4274.21543 3653.74888 4274.02083 3653.2201 4273.76021 3652.72054 4273.43785 3652.25841 4273.05904 3651.84129 4272.63 3651.47604 4272.15777 3651.16866 4271.65012 3650.92418 4271.11536 3650.74663 4270.5623 3650.63892 4270 3650.60282 4269.4377 3650.63892 4268.88464 3650.74663 4268.34988 3650.92418 4267.84223 3651.16866 4267.37 3651.47604 4266.94096 3651.84129 4266.56215 3652.25841 4266.23979 3652.72054 4265.97917 3653.2201 4265.78457 3653.74888 4265.65919 3654.29821 4265.60508 3654.85906 4265.62314 3655.42223 4265.71307 3655.97846 4265.87339 3656.51863 4266.10147 3657.03386 4266.39356 3657.5157 4266.74487 3657.95623 4267.14963 3658.34821 4267.60119 3658.68522 4268.09214 3658.96172 4268.61441 3659.17317 4269.15944 3659.31609 4269.71827 3659.38814 4270.28173 3659.38814 4270.49334 3659.36086 4270.61465 3659.36377 4270.72951 3659.40293 4270.82733 3659.47473 4297.30374 3685.95114 4297.39045 3686.08091 4297.4209 3686.23398 4297.4209 3711.24792 4297.38402 3711.41568 4297.28019 3711.5525 4296.94096 3711.84129 4296.56215 3712.25841 4296.23979 3712.72054 4295.97917 3713.2201 4295.78457 3713.74888 4295.65919 3714.29821 4295.60508 3714.85906 4295.62314 3715.42223 4295.71307 3715.97846 4295.87339 3716.51863 4296.10147 3717.03386 4296.39356 3717.5157 4296.74487 3717.95623 4297.14963 3718.34821 4297.60119 3718.68522 4298.09214 3718.96172 4298.61441 3719.17317 4299.15944 3719.31609 4299.71827 3719.38814 4300.28173 3719.38814 4300.84056 3719.31609 4301.38559 3719.17317 4301.90786 3718.96172 4302.39881 3718.68522 4302.85037 3718.34821 4303.25513 3717.95623 4303.60644 3717.5157 4303.89853 3717.03386 4304.12661 3716.51863 4304.28693 3715.97846 4304.37686 3715.42223 4304.39492 3714.85906 4304.34081 3714.29821 4304.21543 3713.74888 4304.02083 3713.2201 4303.76021 3712.72054 4303.43785 3712.25841 4303.05904 3711.84129 4302.92738 3711.68649 4302.88647 3711.53046 4302.91051 3711.37095 4302.9956 3711.23391 4303.1279 3711.14163 4303.28589 3711.1091 4306.71411 3711.1091 4306.8721 3711.14163 4307.0044 3711.23391 4307.08949 3711.37095 4307.11353 3711.53046 4307.07262 3711.68649 4306.94096 3711.84129 4306.56215 3712.25841 4306.23979 3712.72054 4305.97917 3713.2201 4305.78457 3713.74888 4305.65919 3714.29821 4305.60508 3714.85906 4305.62314 3715.42223 4305.71307 3715.97846 4305.87339 3716.51863 4306.10147 3717.03386 4306.39356 3717.5157 4306.74487 3717.95623 4307.14963 3718.34821 4307.60119 3718.68522 4308.09214 3718.96172 4308.61441 3719.17317 4309.15944 3719.31609 4309.71827 3719.38814 4310.28173 3719.38814 4310.84056 3719.31609 4311.38559 3719.17317 4311.90786 3718.96172 4312.39881 3718.68522 4312.85037 3718.34821 4313.25513 3717.95623 4313.60644 3717.5157 4313.89853 3717.03386 4314.12661 3716.51863 4314.28693 3715.97846 4314.37686 3715.42223 4314.39492 3714.85906 4314.34081 3714.29821 4314.21543 3713.74888 4314.02083 3713.2201 4313.76021 3712.72054 4313.43785 3712.25841 4313.05904 3711.84129 4312.92738 3711.68649 4312.88647 3711.53046 4312.91051 3711.37095 4312.9956 3711.23391 4313.1279 3711.14163 4313.28589 3711.1091 4316.71411 3711.1091 4316.8721 3711.14163 4317.0044 3711.23391 4317.08949 3711.37095 4317.11353 3711.53046 4317.07262 3711.68649 4316.94096 3711.84129 4316.56215 3712.25841 4316.23979 3712.72054 4315.97917 3713.2201 4315.78457 3713.74888 4315.65919 3714.29821 4315.60508 3714.85906 4315.62314 3715.42223 4315.71307 3715.97846 4315.87339 3716.51863 4316.10147 3717.03386 4316.39356 3717.5157 4316.74487 3717.95623 4317.14963 3718.34821 4317.60119 3718.68522 4318.09214 3718.96172 4318.61441 3719.17317 4319.15944 3719.31609 4319.71827 3719.38814 4320.28173 3719.38814 Z M 4389.82164 3761.27054 L 4390.11365 3761.2993 4394.01135 3761.2993 4394.30336 3761.27054 4394.56525 3761.1911 4394.80661 3761.06209 4395.01817 3760.88847 4395.19179 3760.67691 4395.3208 3760.43555 4395.40024 3760.17366 4395.429 3759.88165 4395.429 3742.20495 4395.40024 3741.91294 4395.3208 3741.65105 4395.19179 3741.40969 4395.01817 3741.19813 4394.80661 3741.02451 4394.56525 3740.8955 4394.30336 3740.81606 4394.01135 3740.7873 4390.11365 3740.7873 4389.82164 3740.81606 4389.55975 3740.8955 4389.31839 3741.02451 4389.10683 3741.19813 4388.93321 3741.40969 4388.8042 3741.65105 4388.72476 3741.91294 4388.696 3742.20495 4388.696 3742.48016 4388.66739 3742.6287 4388.58567 3742.756 4388.46251 3742.84385 4388.31554 3742.87968 4388.16577 3742.85836 4388.03463 3742.78295 4380.71057 3736.46092 4380.31414 3736.16533 4379.89226 3735.936 4379.44203 3735.76905 4378.9729 3735.66793 4378.46994 3735.6336 4271.46479 3736.12631 4271.31072 3736.09621 4271.1801 3736.00915 4248.29552 3713.12457 4248.11442 3712.95596 4247.92732 3712.80518 4247.72993 3712.66813 4247.52327 3712.54552 4247.30839 3712.43796 4247.08638 3712.346 4246.85838 3712.27011 4246.62555 3712.21068 4246.38907 3712.16802 4246.15015 3712.14233 4245.90286 3712.1335 4241.61921 3712.1335 4241.47831 3712.10786 4241.35547 3712.03424 4241.26644 3711.92206 4241.16079 3711.72439 4240.98717 3711.51283 4240.77561 3711.33921 4240.53425 3711.2102 4240.27236 3711.13076 4239.98035 3711.102 4234.01965 3711.102 4233.72764 3711.13076 4233.46575 3711.2102 4233.22439 3711.33921 4233.01283 3711.51283 4232.83921 3711.72439 4232.7102 3711.96575 4232.63076 3712.22764 4232.602 3712.51965 4232.602 3718.48035 4232.63076 3718.77236 4232.7102 3719.03425 4232.83921 3719.27561 4233.01283 3719.48717 4233.22439 3719.66079 4233.46575 3719.7898 4233.72764 3719.86924 4234.01965 3719.898 4239.98035 3719.898 4240.27236 3719.86924 4240.53425 3719.7898 4240.77561 3719.66079 4240.98717 3719.48717 4241.16079 3719.27561 4241.26644 3719.07794 4241.35547 3718.96576 4241.47831 3718.89214 4241.61921 3718.8665 4244.34986 3718.8665 4244.50294 3718.89695 4244.63271 3718.98366 4267.52415 3741.8751 4267.71801 3742.05476 4267.89195 3742.19427 4268.10391 3742.34071 4268.29592 3742.45404 4268.52656 3742.56883 4268.73275 3742.65368 4268.97739 3742.73448 4269.19355 3742.78912 4269.44719 3742.83428 4269.66894 3742.8576 4269.9331 3742.86643 4377.10488 3742.37296 4377.24528 3742.39772 4377.36809 3742.47016 4387.3057 3751.04817 4388.57884 3752.31979 4388.66555 3752.44956 4388.696 3752.60264 4388.696 3759.88165 4388.72476 3760.17366 4388.8042 3760.43555 4388.93321 3760.67691 4389.10683 3760.88847 4389.31839 3761.06209 4389.55975 3761.1911 4389.82164 3761.27054 Z M 4048.04254 3842.83982 L 4048.60339 3842.78571 4049.15272 3842.66033 4049.6815 3842.46573 4050.18106 3842.20511 4050.64319 3841.88275 4051.06031 3841.50394 4051.42556 3841.0749 4051.73294 3840.60267 4051.97742 3840.09502 4052.15497 3839.56026 4052.26268 3839.0072 4052.29878 3838.4449 4052.26268 3837.8826 4052.15497 3837.32954 4051.97742 3836.79478 4051.73294 3836.28713 4051.42556 3835.8149 4051.06031 3835.38586 4050.64319 3835.00705 4050.18106 3834.68469 4049.6815 3834.42407 4049.15272 3834.22947 4048.60339 3834.10409 4048.04254 3834.04998 4047.47937 3834.06804 4047.28556 3834.07941 4047.16607 3834.0408 4047.06444 3833.96705 4042.19626 3829.09886 4042.10955 3828.96909 4042.0791 3828.81602 4042.0791 3740.28053 4042.10972 3740.12704 4042.19691 3739.99704 4042.3273 3739.91046 4042.48093 3739.88054 4042.63429 3739.91186 4042.76388 3739.99964 4042.84987 3740.13043 4042.93988 3740.35276 4043.21638 3740.84371 4043.55339 3741.29527 4043.94537 3741.70003 4044.3859 3742.05134 4044.86774 3742.34343 4045.38297 3742.57151 4045.92314 3742.73183 4046.47937 3742.82176 4047.04254 3742.83982 4047.60339 3742.78571 4048.15272 3742.66033 4048.6815 3742.46573 4049.18106 3742.20511 4049.64319 3741.88275 4050.06031 3741.50394 4050.42556 3741.0749 4050.73294 3740.60267 4050.97742 3740.09502 4051.15497 3739.56026 4051.26268 3739.0072 4051.29878 3738.4449 4051.26268 3737.8826 4051.15497 3737.32954 4050.97742 3736.79478 4050.73294 3736.28713 4050.42556 3735.8149 4050.06031 3735.38586 4049.64319 3735.00705 4049.18106 3734.68469 4048.6815 3734.42407 4048.15272 3734.22947 4047.60339 3734.10409 4047.04254 3734.04998 4046.47937 3734.06804 4045.92314 3734.15797 4045.38297 3734.31829 4044.86774 3734.54637 4044.3859 3734.83846 4043.94537 3735.18977 4043.55339 3735.59453 4043.21638 3736.04609 4042.93988 3736.53704 4042.84987 3736.75937 4042.76388 3736.89016 4042.63429 3736.97794 4042.48093 3737.00926 4042.3273 3736.97934 4042.19691 3736.89276 4042.10972 3736.76276 4042.0791 3736.60927 4042.0791 3713.34572 4042.04613 3712.92673 4041.95169 3712.5334 4041.79689 3712.15967 4041.58554 3711.81477 4041.31259 3711.49519 4030.99626 3701.17886 4030.90955 3701.04909 4030.8791 3700.89602 4030.8791 3646.028 4030.90955 3645.87493 4030.99626 3645.74516 4031.12603 3645.65845 4031.2791 3645.628 4035.96035 3645.628 4036.25236 3645.59924 4036.51425 3645.5198 4036.75561 3645.39079 4036.96717 3645.21717 4037.14079 3645.00561 4037.2698 3644.76425 4037.34924 3644.50236 4037.378 3644.21035 4037.378 3639.52965 4037.34924 3639.23764 4037.2698 3638.97575 4037.14079 3638.73439 4036.96717 3638.52283 4036.75561 3638.34921 4036.51425 3638.2202 4036.25236 3638.14076 4035.96035 3638.112 4031.99108 3638.112 4031.83801 3638.08155 4031.70824 3637.99484 4031.62153 3637.86507 4031.59108 3637.712 4031.62153 3637.55893 4031.70824 3637.42916 4033.40193 3635.73546 4033.5317 3635.64875 4033.68478 3635.61831 4033.87639 3635.61831 4034.3844 3635.54848 4034.87816 3635.41014 4035.34849 3635.20584 4035.78663 3634.93941 4036.1844 3634.6158 4036.5344 3634.24104 4036.83011 3633.82211 4037.06602 3633.36682 4037.23774 3632.88364 4037.34207 3632.38159 4037.37707 3631.87 4037.34207 3631.35841 4037.23774 3630.85636 4037.06602 3630.37318 4036.83011 3629.91789 4036.5344 3629.49896 4036.1844 3629.1242 4035.78663 3628.80059 4035.34849 3628.53416 4034.87816 3628.32986 4034.3844 3628.19152 4033.87639 3628.12169 4033.36361 3628.12169 4032.8556 3628.19152 4032.36184 3628.32986 4031.89151 3628.53416 4031.45337 3628.80059 4031.0556 3629.1242 4030.7056 3629.49896 4030.40989 3629.91789 4030.17398 3630.37318 4030.00226 3630.85636 4029.89793 3631.35841 4029.86511 3631.83817 4029.83015 3631.97647 4029.74889 3632.09371 4026.48741 3635.35519 4026.21446 3635.67477 4026.00311 3636.01967 4025.84831 3636.3934 4025.75387 3636.78673 4025.7209 3637.20572 4025.7209 3702.11428 4025.75387 3702.53327 4025.84831 3702.9266 4026.00311 3703.30033 4026.21446 3703.64523 4026.48741 3703.96481 4036.80374 3714.28114 4036.89045 3714.41091 4036.9209 3714.56398 4036.9209 3830.03428 4036.95387 3830.45327 4037.04831 3830.8466 4037.20311 3831.22033 4037.41446 3831.56523 4037.68741 3831.88481 4043.4261 3837.6235 4043.4979 3837.72133 4043.53706 3837.83618 4043.53998 3837.9575 4043.51346 3838.16317 4043.51346 3838.72663 4043.58551 3839.28546 4043.72843 3839.83049 4043.93988 3840.35276 4044.21638 3840.84371 4044.55339 3841.29527 4044.94537 3841.70003 4045.3859 3842.05134 4045.86774 3842.34343 4046.38297 3842.57151 4046.92314 3842.73183 4047.47937 3842.82176 4048.04254 3842.83982 Z M 4107.54254 3742.83982 L 4108.10339 3742.78571 4108.65272 3742.66033 4109.1815 3742.46573 4109.68106 3742.20511 4110.14319 3741.88275 4110.56031 3741.50394 4110.92556 3741.0749 4111.23294 3740.60267 4111.47742 3740.09502 4111.65497 3739.56026 4111.76268 3739.0072 4111.79878 3738.4449 4111.76268 3737.8826 4111.65497 3737.32954 4111.47742 3736.79478 4111.23294 3736.28713 4110.92556 3735.8149 4110.56031 3735.38586 4110.14319 3735.00705 4109.68106 3734.68469 4109.1815 3734.42407 4108.65272 3734.22947 4108.10339 3734.10409 4107.54254 3734.04998 4106.97937 3734.06804 4106.78556 3734.07941 4106.66607 3734.0408 4106.56444 3733.96705 4092.80481 3720.20741 4092.48523 3719.93446 4092.14033 3719.72311 4091.7666 3719.56831 4091.37344 3719.47392 4090.93354 3719.4397 4090.76452 3719.38728 4090.63465 3719.26708 4090.56935 3719.1026 4090.5814 3718.92605 4090.66845 3718.77198 4091.05005 3718.35179 4091.37241 3717.88966 4091.63303 3717.3901 4091.82763 3716.86132 4091.95301 3716.31199 4092.00712 3715.75114 4091.98906 3715.18797 4091.89913 3714.63174 4091.73881 3714.09157 4091.51073 3713.57634 4091.21864 3713.0945 4090.86733 3712.65397 4090.46257 3712.26199 4090.01101 3711.92498 4089.52006 3711.64848 4088.99779 3711.43703 4088.45276 3711.29411 4087.89393 3711.22206 4087.33047 3711.22206 4086.77164 3711.29411 4086.22661 3711.43703 4085.70434 3711.64848 4085.21339 3711.92498 4084.76183 3712.26199 4084.35707 3712.65397 4084.00576 3713.0945 4083.71367 3713.57634 4083.48559 3714.09157 4083.32527 3714.63174 4083.23534 3715.18797 4083.21728 3715.75114 4083.27139 3716.31199 4083.39677 3716.86132 4083.59137 3717.3901 4083.85199 3717.88966 4084.17435 3718.35179 4084.55595 3718.77198 4084.63523 3718.90275 4084.65963 3719.05372 4084.6256 3719.20281 4084.53811 3719.32824 4084.40995 3719.41167 4084.25984 3719.4409 4080.96456 3719.4409 4080.81445 3719.41167 4080.68629 3719.32824 4080.5988 3719.20281 4080.56477 3719.05372 4080.58917 3718.90275 4080.66845 3718.77198 4081.05005 3718.35179 4081.37241 3717.88966 4081.63303 3717.3901 4081.82763 3716.86132 4081.95301 3716.31199 4082.00712 3715.75114 4081.98906 3715.18797 4081.89913 3714.63174 4081.73881 3714.09157 4081.51073 3713.57634 4081.21864 3713.0945 4080.86733 3712.65397 4080.46257 3712.26199 4080.01101 3711.92498 4079.52006 3711.64848 4078.99779 3711.43703 4078.45276 3711.29411 4077.89393 3711.22206 4077.33047 3711.22206 4076.77164 3711.29411 4076.22661 3711.43703 4075.70434 3711.64848 4075.21339 3711.92498 4074.86834 3712.18249 4074.70808 3712.25405 4074.53261 3712.25011 4074.37571 3712.17143 4074.26761 3712.03316 4074.2291 3711.86193 4074.2291 3662.02572 4074.19613 3661.60673 4074.10169 3661.2134 4073.94689 3660.83967 4073.73554 3660.49477 4073.46259 3660.17519 4068.03481 3654.74741 4067.71523 3654.47446 4067.37033 3654.26311 4066.9966 3654.10831 4066.60327 3654.01387 4066.18428 3653.9809 4064.0446 3653.9809 4063.93861 3653.9666 4063.78857 3653.89403 4063.3666 3653.72397 4062.92362 3653.6203 4062.47 3653.58548 4062.01638 3653.6203 4061.5734 3653.72397 4061.15143 3653.89403 4060.76037 3654.12652 4060.40938 3654.41598 4060.10669 3654.75563 4059.85939 3655.1375 4059.67329 3655.55264 4059.55273 3655.99133 4059.50056 3656.44328 4059.51798 3656.8979 4059.6046 3657.34453 4059.75838 3657.7727 4059.97572 3658.17238 4060.25153 3658.5342 4060.44963 3658.72485 4060.54326 3658.86353 4060.57196 3659.02838 4060.53072 3659.19055 4060.40938 3659.33598 4060.10669 3659.67563 4059.85939 3660.0575 4059.68805 3660.4397 4061.4326 3660.4397 4061.4326 3659.86143 4061.46918 3659.69431 4061.57224 3659.55777 4061.72292 3659.47676 4061.89366 3659.46612 4062.24252 3659.52 4062.69748 3659.52 4063.04634 3659.46612 4063.21708 3659.47676 4063.36776 3659.55777 4063.47082 3659.69431 4063.5074 3659.86143 4063.5074 3660.4397 4065.25195 3660.4397 4065.18203 3660.28374 4065.14716 3660.12997 4065.17442 3659.97466 4065.25959 3659.84196 4065.38942 3659.75248 4065.54375 3659.72013 4065.69859 3659.74994 4065.82988 3659.83727 4068.95374 3662.96114 4069.04045 3663.09091 4069.0709 3663.24398 4069.0709 3718.51443 4069.10327 3718.92947 4069.19717 3719.32309 4069.35143 3719.69703 4069.56229 3720.04224 4069.83478 3720.36221 4073.29259 3723.82995 4073.61178 3724.10336 4073.95638 3724.31521 4074.32988 3724.47055 4074.72294 3724.56551 4075.14586 3724.5991 4089.73602 3724.5991 4089.88909 3724.62955 4090.01886 3724.71626 4099.03444 3733.73184 4099.12115 3733.86161 4099.1516 3734.01468 4099.1516 3736.6949 4101.83182 3736.6949 4101.98489 3736.72535 4102.11466 3736.81206 4102.9261 3737.6235 4102.9979 3737.72133 4103.03706 3737.83618 4103.03998 3737.9575 4103.01346 3738.16317 4103.01346 3738.72663 4103.08551 3739.28546 4103.22843 3739.83049 4103.43988 3740.35276 4103.71638 3740.84371 4104.05339 3741.29527 4104.44537 3741.70003 4104.8859 3742.05134 4105.36774 3742.34343 4105.88297 3742.57151 4106.42314 3742.73183 4106.97937 3742.82176 4107.54254 3742.83982 Z M 4147.54254 3742.83982 L 4148.10339 3742.78571 4148.65272 3742.66033 4149.1815 3742.46573 4149.68106 3742.20511 4150.14319 3741.88275 4150.56031 3741.50394 4150.92556 3741.0749 4151.23294 3740.60267 4151.47742 3740.09502 4151.65497 3739.56026 4151.76268 3739.0072 4151.79878 3738.4449 4151.76268 3737.8826 4151.65497 3737.32954 4151.47742 3736.79478 4151.23294 3736.28713 4150.95537 3735.8607 4150.90173 3735.73617 4150.89277 3735.60088 4150.92952 3735.47037 4151.00776 3735.35964 4166.27747 3720.08993 4166.41917 3719.9985 4166.58594 3719.97359 4167.1122 3720.00738 4167.6745 3719.97128 4168.22756 3719.86357 4168.76232 3719.68602 4169.26997 3719.44154 4169.7422 3719.13416 4170.17124 3718.76891 4170.55005 3718.35179 4170.87241 3717.88966 4171.13303 3717.3901 4171.32763 3716.86132 4171.45301 3716.31199 4171.50712 3715.75114 4171.48906 3715.18797 4171.39913 3714.63174 4171.23881 3714.09157 4171.01073 3713.57634 4170.71864 3713.0945 4170.36733 3712.65397 4169.96257 3712.26199 4169.84986 3712.17786 4169.7635 3712.08964 4169.70815 3711.97928 4169.6891 3711.8573 4169.6891 3652.76398 4169.71955 3652.61091 4169.80626 3652.48114 4182.52738 3639.76002 4182.67935 3639.63332 4182.95655 3639.32043 4183.17997 3638.96712 4183.34382 3638.58254 4183.44386 3638.17667 4183.4775 3637.76 4183.44386 3637.34333 4183.34382 3636.93746 4183.17997 3636.55288 4182.95655 3636.19957 4182.67935 3635.88668 4182.35555 3635.6223 4181.99353 3635.41329 4181.60267 3635.26506 4181.19309 3635.18144 4180.77541 3635.16461 4180.36043 3635.215 4179.95891 3635.3313 4179.58125 3635.5105 4179.23722 3635.74796 4178.93574 3636.03754 4178.85737 3636.13523 4165.29741 3649.69519 4165.02446 3650.01477 4164.81311 3650.35967 4164.65831 3650.7334 4164.56387 3651.12673 4164.5309 3651.54572 4164.5309 3711.86058 4164.51185 3711.98256 4164.4565 3712.09292 4164.37014 3712.18115 4164.26183 3712.26199 4163.85707 3712.65397 4163.50576 3713.0945 4163.21367 3713.57634 4162.98559 3714.09157 4162.82527 3714.63174 4162.73534 3715.18797 4162.71728 3715.75114 4162.75232 3716.11434 4162.73065 3716.28788 4162.63701 3716.43559 4161.82956 3717.24304 4161.69979 3717.32975 4161.54672 3717.3602 4158.8622 3717.3602 4158.8622 3720.04472 4158.83175 3720.19779 4158.74504 3720.32756 4145.58741 3733.48519 4145.31446 3733.80477 4145.10311 3734.14967 4144.94831 3734.5234 4144.90162 3734.71786 4144.85016 3734.83919 4144.76207 3734.93721 4144.44537 3735.18977 4144.05339 3735.59453 4143.71638 3736.04609 4143.43988 3736.53704 4143.22843 3737.05931 4143.08551 3737.60434 4143.01346 3738.16317 4143.01346 3738.72663 4143.08551 3739.28546 4143.22843 3739.83049 4143.43988 3740.35276 4143.71638 3740.84371 4144.05339 3741.29527 4144.44537 3741.70003 4144.8859 3742.05134 4145.36774 3742.34343 4145.88297 3742.57151 4146.42314 3742.73183 4146.97937 3742.82176 4147.54254 3742.83982 Z M 4108.04254 3842.83982 L 4108.60339 3842.78571 4109.15272 3842.66033 4109.6815 3842.46573 4110.18106 3842.20511 4110.64319 3841.88275 4111.06031 3841.50394 4111.42556 3841.0749 4111.73294 3840.60267 4111.97742 3840.09502 4112.15497 3839.56026 4112.26268 3839.0072 4112.29878 3838.4449 4112.26268 3837.8826 4112.16859 3837.3995 4112.17197 3837.23089 4112.24454 3837.07867 4112.3734 3836.96987 4112.53564 3836.92386 4112.70243 3836.94879 4112.84411 3837.04025 4113.42628 3837.62264 4113.49804 3837.72046 4113.53718 3837.83529 4113.5401 3837.95658 4113.51346 3838.16317 4113.51346 3838.72663 4113.58551 3839.28546 4113.72843 3839.83049 4113.93988 3840.35276 4114.21638 3840.84371 4114.55339 3841.29527 4114.94537 3841.70003 4115.3859 3842.05134 4115.86774 3842.34343 4116.38297 3842.57151 4116.92314 3842.73183 4117.47937 3842.82176 4118.04254 3842.83982 4118.60339 3842.78571 4119.15272 3842.66033 4119.6815 3842.46573 4120.18106 3842.20511 4120.64319 3841.88275 4121.06031 3841.50394 4121.42556 3841.0749 4121.73294 3840.60267 4121.97742 3840.09502 4122.15497 3839.56026 4122.26268 3839.0072 4122.29878 3838.4449 4122.26268 3837.8826 4122.15497 3837.32954 4121.97742 3836.79478 4121.73294 3836.28713 4121.42556 3835.8149 4121.06031 3835.38586 4120.64319 3835.00705 4120.18106 3834.68469 4119.6815 3834.42407 4119.15272 3834.22947 4118.60339 3834.10409 4118.04254 3834.04998 4117.47937 3834.06804 4117.28642 3834.07926 4117.16692 3834.04063 4117.06528 3833.96685 4094.9762 3811.86914 4094.88953 3811.73939 4094.8591 3811.58636 4094.8591 3744.65403 4094.8775 3744.41 4094.84386 3743.99333 4094.74382 3743.58746 4094.57997 3743.20288 4094.35655 3742.84957 4094.07935 3742.53668 4093.75555 3742.2723 4093.39353 3742.06329 4093.00267 3741.91506 4092.59309 3741.83144 4092.17541 3741.81461 4091.76043 3741.865 4091.35891 3741.9813 4091.02246 3742.14095 4090.87281 3742.17897 4090.71991 3742.15748 4090.58654 3742.07969 4090.49257 3741.95717 4090.452 3741.8082 4090.47089 3741.65495 4090.5464 3741.52028 4090.92556 3741.0749 4091.23294 3740.60267 4091.47742 3740.09502 4091.65497 3739.56026 4091.76268 3739.0072 4091.79878 3738.4449 4091.76268 3737.8826 4091.65497 3737.32954 4091.47742 3736.79478 4091.23294 3736.28713 4090.92556 3735.8149 4090.56031 3735.38586 4090.14319 3735.00705 4089.68106 3734.68469 4089.1815 3734.42407 4088.65272 3734.22947 4088.10339 3734.10409 4087.54254 3734.04998 4086.97937 3734.06804 4086.42314 3734.15797 4085.88297 3734.31829 4085.36774 3734.54637 4084.8859 3734.83846 4084.44537 3735.18977 4084.05339 3735.59453 4083.71638 3736.04609 4083.43988 3736.53704 4083.22843 3737.05931 4083.08551 3737.60434 4083.01346 3738.16317 4083.01346 3738.72663 4083.08551 3739.28546 4083.22843 3739.83049 4083.43988 3740.35276 4083.71638 3740.84371 4084.05339 3741.29527 4084.44537 3741.70003 4084.8859 3742.05134 4085.36774 3742.34343 4085.88297 3742.57151 4086.42314 3742.73183 4086.97937 3742.82176 4087.54254 3742.83982 4088.10339 3742.78571 4088.65272 3742.66033 4089.1815 3742.46573 4089.68106 3742.20511 4089.76823 3742.14431 4089.91541 3742.0808 4090.07571 3742.08018 4090.22338 3742.14254 4090.3347 3742.25788 4090.39181 3742.40766 4090.38552 3742.56783 4090.31686 3742.71267 4090.08462 3743.02173 4089.89035 3743.39187 4089.75798 3743.78838 4089.69092 3744.20099 4089.69092 3744.61901 4089.7009 3744.71269 4089.7009 3812.8043 4089.73379 3813.22275 4089.82815 3813.61613 4089.98288 3813.98988 4090.19417 3814.33482 4090.46706 3814.65446 4109.31384 3833.5086 4109.40598 3833.6523 4109.42982 3833.82133 4109.38101 3833.98491 4109.26845 3834.11324 4109.11263 3834.18296 4108.94193 3834.18136 4108.60339 3834.10409 4108.04254 3834.04998 4107.47937 3834.06804 4106.92314 3834.15797 4106.38297 3834.31829 4105.86774 3834.54637 4105.3859 3834.83846 4104.94537 3835.18977 4104.55339 3835.59453 4104.21638 3836.04609 4103.93988 3836.53704 4103.72843 3837.05931 4103.58551 3837.60434 4103.51346 3838.16317 4103.51346 3838.72663 4103.58551 3839.28546 4103.72843 3839.83049 4103.93988 3840.35276 4104.21638 3840.84371 4104.55339 3841.29527 4104.94537 3841.70003 4105.3859 3842.05134 4105.86774 3842.34343 4106.38297 3842.57151 4106.92314 3842.73183 4107.47937 3842.82176 4108.04254 3842.83982 Z M 4405 3663.83037 L 4405.59552 3663.79435 4406.18236 3663.6868 4406.75195 3663.50931 4407.296 3663.26446 4407.80656 3662.95581 4408.2762 3662.58787 4408.69807 3662.166 4409.06601 3661.69636 4409.37466 3661.1858 4409.61951 3660.64175 4409.797 3660.07216 4409.90455 3659.48532 4409.94057 3658.8898 4409.90455 3658.29428 4409.797 3657.70744 4409.61951 3657.13785 4409.37466 3656.5938 4409.13679 3656.20032 4409.09379 3656.1008 4409.0791 3655.99338 4409.0791 3613.33733 4409.09273 3613.23381 4409.13269 3613.13733 4409.35475 3612.75272 4409.52776 3612.31189 4409.63314 3611.85019 4409.66965 3611.36298 4409.66965 3608.63702 4409.63314 3608.14981 4409.52776 3607.68811 4409.35475 3607.24728 4409.11796 3606.83715 4408.8227 3606.4669 4408.47555 3606.14479 4408.08426 3605.87802 4407.65759 3605.67255 4407.20506 3605.53296 4406.73678 3605.46238 4406.26322 3605.46238 4405.79494 3605.53296 4405.34241 3605.67255 4404.91574 3605.87802 4404.52445 3606.14479 4404.27207 3606.37897 4404.14614 3606.4581 4404 3606.48575 4403.85386 3606.4581 4403.72793 3606.37897 4403.47555 3606.14479 4403.08426 3605.87802 4402.65759 3605.67255 4402.20506 3605.53296 4401.73678 3605.46238 4401.26322 3605.46238 4400.79494 3605.53296 4400.34241 3605.67255 4399.91574 3605.87802 4399.80466 3605.95375 4399.66971 3606.01292 4399.52249 3606.0192 4399.38299 3605.97175 4399.04726 3605.68961 4398.8059 3605.5606 4398.54401 3605.48116 4398.252 3605.4524 4397.63582 3605.4524 4397.63582 3608.1752 4397.93386 3608.1752 4398.09382 3608.20858 4398.22708 3608.30313 4398.31141 3608.44309 4398.33035 3608.63702 4398.33035 3611.36298 4398.31141 3611.55691 4398.22708 3611.69687 4398.09382 3611.79142 4397.93386 3611.8248 4397.63582 3611.8248 4397.63582 3613.5809 4397.60538 3613.73397 4397.51867 3613.86374 4397.3889 3613.95045 4397.23582 3613.9809 4395.76418 3613.9809 4395.6111 3613.95045 4395.48133 3613.86374 4395.39462 3613.73397 4395.36418 3613.5809 4395.36418 3611.8248 4393.33035 3611.8248 4393.33035 3613.12995 4393.35911 3613.42196 4393.38809 3613.61228 4393.34923 3613.75546 4393.26085 3613.87463 4393.13511 3613.95339 4392.98933 3613.9809 4372.96398 3613.9809 4372.81091 3613.95045 4372.68114 3613.86374 4364.36766 3605.55026 4364.28095 3605.42049 4364.2505 3605.26742 4364.2505 3605.07026 4364.18064 3604.56195 4364.04221 3604.0679 4363.8378 3603.59729 4363.57121 3603.15891 4363.24741 3602.7609 4362.87243 3602.4107 4362.45325 3602.11481 4361.9977 3601.87876 4361.51424 3601.70694 4361.01189 3601.60255 4360.5 3601.56753 4359.98811 3601.60255 4359.48576 3601.70694 4359.0023 3601.87876 4358.54675 3602.11481 4358.12757 3602.4107 4357.75259 3602.7609 4357.42879 3603.15891 4357.1622 3603.59729 4356.95779 3604.0679 4356.81936 3604.56195 4356.7495 3605.07026 4356.7495 3605.58334 4356.81936 3606.09165 4356.95779 3606.5857 4357.1622 3607.05631 4357.42879 3607.49469 4357.75259 3607.8927 4358.12757 3608.2429 4358.54675 3608.53879 4359.0023 3608.77484 4359.48576 3608.94666 4359.98811 3609.05105 4360.4671 3609.08381 4360.6054 3609.11877 4360.72264 3609.20004 4369.89519 3618.37259 4370.21477 3618.64554 4370.55967 3618.85689 4370.9334 3619.01169 4371.32673 3619.10613 4371.74572 3619.1391 4399.55428 3619.1391 4399.97327 3619.10613 4400.3666 3619.01169 4400.74033 3618.85689 4401.08523 3618.64554 4401.40481 3618.37259 4403.23806 3616.53934 4403.36783 3616.45263 4403.5209 3616.42218 4403.67397 3616.45263 4403.80374 3616.53934 4403.89045 3616.66911 4403.9209 3616.82218 4403.9209 3629.55122 4403.88595 3629.71475 4403.7872 3629.84969 4403.64191 3629.93248 4403.47547 3629.94863 4403.31697 3629.89533 4403.19411 3629.78189 4402.9944 3629.49896 4402.6444 3629.1242 4402.24663 3628.80059 4401.80849 3628.53416 4401.51 3628.4045 4401.51 3630.44 4403.5209 3630.44 4403.67397 3630.47045 4403.80374 3630.55716 4403.89045 3630.68693 4403.9209 3630.84 4403.9209 3632.9 4403.89045 3633.05307 4403.80374 3633.18284 4403.67397 3633.26955 4403.5209 3633.3 4401.51 3633.3 4401.51 3635.3355 4401.80849 3635.20584 4402.24663 3634.93941 4402.6444 3634.6158 4402.9944 3634.24104 4403.19411 3633.95811 4403.31697 3633.84467 4403.47547 3633.79137 4403.64191 3633.80752 4403.7872 3633.89031 4403.88595 3634.02525 4403.9209 3634.18878 4403.9209 3639.55122 4403.88595 3639.71475 4403.7872 3639.84969 4403.64191 3639.93248 4403.47547 3639.94863 4403.31697 3639.89533 4403.19411 3639.78189 4402.9944 3639.49896 4402.6444 3639.1242 4402.24663 3638.80059 4401.80849 3638.53416 4401.33816 3638.32986 4400.8444 3638.19152 4400.33639 3638.12169 4399.82361 3638.12169 4399.3156 3638.19152 4398.82184 3638.32986 4398.35151 3638.53416 4397.91337 3638.80059 4397.5156 3639.1242 4397.1656 3639.49896 4396.86989 3639.91789 4396.63398 3640.37318 4396.46226 3640.85636 4396.35793 3641.35841 4396.32293 3641.87 4396.35793 3642.38159 4396.46226 3642.88364 4396.63398 3643.36682 4396.86989 3643.82211 4397.1656 3644.24104 4397.5156 3644.6158 4397.91337 3644.93941 4398.35151 3645.20584 4398.82184 3645.41014 4399.3156 3645.54848 4399.82361 3645.61831 4400.33639 3645.61831 4400.8444 3645.54848 4401.33816 3645.41014 4401.80849 3645.20584 4402.24663 3644.93941 4402.6444 3644.6158 4402.9944 3644.24104 4403.19411 3643.95811 4403.31697 3643.84467 4403.47547 3643.79137 4403.64191 3643.80752 4403.7872 3643.89031 4403.88595 3644.02525 4403.9209 3644.18878 4403.9209 3653.76629 4403.88566 3653.93046 4403.78615 3654.0657 4403.6399 3654.14818 4403.24805 3654.27029 4402.704 3654.51514 4402.19344 3654.82379 4401.7238 3655.19173 4401.30193 3655.6136 4400.93399 3656.08324 4400.62534 3656.5938 4400.38049 3657.13785 4400.203 3657.70744 4400.09545 3658.29428 4400.05943 3658.8898 4400.09545 3659.48532 4400.203 3660.07216 4400.38049 3660.64175 4400.62534 3661.1858 4400.93399 3661.69636 4401.30193 3662.166 4401.7238 3662.58787 4402.19344 3662.95581 4402.704 3663.26446 4403.24805 3663.50931 4403.81764 3663.6868 4404.40448 3663.79435 4405 3663.83037 Z M 4359.15944 3649.31609 L 4359.71827 3649.38814 4360.28173 3649.38814 4360.84056 3649.31609 4361.38559 3649.17317 4361.90786 3648.96172 4362.39881 3648.68522 4362.85037 3648.34821 4363.25513 3647.95623 4363.60644 3647.5157 4363.89853 3647.03386 4364.12661 3646.51863 4364.28693 3645.97846 4364.37686 3645.42223 4364.39492 3644.85906 4364.34081 3644.29821 4364.21543 3643.74888 4364.02083 3643.2201 4363.76021 3642.72054 4363.43785 3642.25841 4363.18299 3641.97777 4363.10598 3641.853 4363.0791 3641.70885 4363.0791 3636.57003 4363.11222 3636.41067 4363.57121 3635.84109 4363.8378 3635.40271 4364.04221 3634.9321 4364.18064 3634.43805 4364.2505 3633.92974 4364.2505 3633.41666 4364.18064 3632.90835 4364.04221 3632.4143 4363.8378 3631.94369 4363.57121 3631.50531 4363.24741 3631.1073 4362.87243 3630.7571 4362.45325 3630.46121 4361.9977 3630.22516 4361.51424 3630.05334 4361.01189 3629.94895 4360.56638 3629.91848 4360.41983 3629.87965 4360.29825 3629.78908 4360.21911 3629.65977 4360.19378 3629.5103 4360.22589 3629.36214 4360.31083 3629.23656 4360.36114 3629.18626 4360.49091 3629.09955 4360.64398 3629.0691 4376.69707 3629.0691 4376.86639 3629.10671 4377.00387 3629.21245 4377.08367 3629.36645 4377.09078 3629.53975 4377.02385 3629.69977 4376.86989 3629.91789 4376.63398 3630.37318 4376.46226 3630.85636 4376.35793 3631.35841 4376.32293 3631.87 4376.35793 3632.38159 4376.46226 3632.88364 4376.63398 3633.36682 4376.86989 3633.82211 4377.1656 3634.24104 4377.5156 3634.6158 4377.91337 3634.93941 4378.35151 3635.20584 4378.82184 3635.41014 4379.3156 3635.54848 4379.82361 3635.61831 4380.33639 3635.61831 4380.8444 3635.54848 4381.33816 3635.41014 4381.80849 3635.20584 4382.24663 3634.93941 4382.6444 3634.6158 4382.9944 3634.24104 4383.29011 3633.82211 4383.52602 3633.36682 4383.69774 3632.88364 4383.80207 3632.38159 4383.83707 3631.87 4383.80207 3631.35841 4383.69774 3630.85636 4383.52602 3630.37318 4383.28931 3629.91635 4383.13725 3629.69695 4383.07269 3629.54184 4383.07751 3629.3739 4383.15088 3629.22275 4383.27984 3629.11507 4383.44165 3629.06984 4383.60776 3629.09506 4383.74886 3629.18626 4386.20889 3631.64629 4386.29015 3631.76353 4386.32511 3631.90183 4386.35793 3632.38159 4386.46226 3632.88364 4386.63398 3633.36682 4386.86989 3633.82211 4387.1656 3634.24104 4387.5156 3634.6158 4387.91337 3634.93941 4388.35151 3635.20584 4388.82184 3635.41014 4389.3156 3635.54848 4389.82361 3635.61831 4390.33639 3635.61831 4390.8444 3635.54848 4391.33816 3635.41014 4391.80849 3635.20584 4392.24663 3634.93941 4392.6444 3634.6158 4392.9944 3634.24104 4393.29011 3633.82211 4393.52602 3633.36682 4393.69774 3632.88364 4393.80207 3632.38159 4393.83707 3631.87 4393.80207 3631.35841 4393.69774 3630.85636 4393.52602 3630.37318 4393.29011 3629.91789 4392.9944 3629.49896 4392.6444 3629.1242 4392.24663 3628.80059 4391.80849 3628.53416 4391.33816 3628.32986 4390.8444 3628.19152 4390.33639 3628.12169 4390.14478 3628.12169 4389.9917 3628.09125 4389.86193 3628.00454 4386.53481 3624.67741 4386.21523 3624.40446 4385.87033 3624.19311 4385.4966 3624.03831 4385.10327 3623.94387 4384.68428 3623.9109 4359.42572 3623.9109 4359.00673 3623.94387 4358.6134 3624.03831 4358.23967 3624.19311 4357.89477 3624.40446 4357.57519 3624.67741 4348.18741 3634.06519 4347.91446 3634.38477 4347.70311 3634.72967 4347.54831 3635.1034 4347.45387 3635.49673 4347.4209 3635.91572 4347.4209 3641.24792 4347.38402 3641.41568 4347.28019 3641.5525 4346.94096 3641.84129 4346.56215 3642.25841 4346.23979 3642.72054 4345.97917 3643.2201 4345.78457 3643.74888 4345.65919 3644.29821 4345.60508 3644.85906 4345.62314 3645.42223 4345.71307 3645.97846 4345.87339 3646.51863 4346.10147 3647.03386 4346.39356 3647.5157 4346.74487 3647.95623 4347.14963 3648.34821 4347.60119 3648.68522 4348.09214 3648.96172 4348.61441 3649.17317 4349.15944 3649.31609 4349.71827 3649.38814 4350.28173 3649.38814 4350.84056 3649.31609 4351.38559 3649.17317 4351.90786 3648.96172 4352.39881 3648.68522 4352.85037 3648.34821 4353.25513 3647.95623 4353.60644 3647.5157 4353.89853 3647.03386 4354.12661 3646.51863 4354.28693 3645.97846 4354.37686 3645.42223 4354.39492 3644.85906 4354.34081 3644.29821 4354.21543 3643.74888 4354.02083 3643.2201 4353.76021 3642.72054 4353.43785 3642.25841 4353.05904 3641.84129 4352.71981 3641.5525 4352.61598 3641.41568 4352.5791 3641.24792 4352.5791 3637.13398 4352.60955 3636.98091 4352.69626 3636.85114 4356.06666 3633.48074 4356.19643 3633.39403 4356.3495 3633.36359 4356.50257 3633.39403 4356.63234 3633.48074 4356.71905 3633.61051 4356.7495 3633.76359 4356.7495 3633.92974 4356.81936 3634.43805 4356.95779 3634.9321 4357.1622 3635.40271 4357.42879 3635.84109 4357.75259 3636.2391 4357.88778 3636.41067 4357.9209 3636.57003 4357.9209 3640.90054 4357.89915 3641.03064 4357.83628 3641.14658 4357.73911 3641.23578 4357.37 3641.47604 4356.94096 3641.84129 4356.56215 3642.25841 4356.23979 3642.72054 4355.97917 3643.2201 4355.78457 3643.74888 4355.65919 3644.29821 4355.60508 3644.85906 4355.62314 3645.42223 4355.71307 3645.97846 4355.87339 3646.51863 4356.10147 3647.03386 4356.39356 3647.5157 4356.74487 3647.95623 4357.14963 3648.34821 4357.60119 3648.68522 4358.09214 3648.96172 4358.61441 3649.17317 4359.15944 3649.31609 Z M 4127.54254 3742.83982 L 4128.10339 3742.78571 4128.65272 3742.66033 4129.1815 3742.46573 4129.68106 3742.20511 4130.14319 3741.88275 4130.56031 3741.50394 4130.92556 3741.0749 4131.23294 3740.60267 4131.47742 3740.09502 4131.65497 3739.56026 4131.76268 3739.0072 4131.79878 3738.4449 4131.76268 3737.8826 4131.65497 3737.32954 4131.47742 3736.79478 4131.23294 3736.28713 4130.92556 3735.8149 4130.5607 3735.38632 4130.11306 3734.98221 4130.01558 3734.84776 4129.9811 3734.6853 4129.9811 3733.33198 4130.01155 3733.17891 4130.09826 3733.04914 4131.45114 3731.69626 4131.58091 3731.60955 4131.73398 3731.5791 4143.48428 3731.5791 4143.90327 3731.54613 4144.2966 3731.45169 4144.67033 3731.29689 4145.01523 3731.08554 4145.33481 3730.81259 4149.31259 3726.83481 4149.58554 3726.51523 4149.79689 3726.17033 4149.95169 3725.7966 4150.04613 3725.40327 4150.0791 3724.98428 4150.0791 3719.45723 4150.11604 3719.28935 4150.22002 3719.15247 4150.67133 3718.7688 4151.05005 3718.35179 4151.37241 3717.88966 4151.63303 3717.3901 4151.82763 3716.86132 4151.95301 3716.31199 4152.00712 3715.75114 4151.98906 3715.18797 4151.89913 3714.63174 4151.73881 3714.09157 4151.51073 3713.57634 4151.21864 3713.0945 4150.86733 3712.65397 4150.46257 3712.26199 4150.01101 3711.92498 4149.52006 3711.64848 4148.99779 3711.43703 4148.45276 3711.29411 4147.89393 3711.22206 4147.33047 3711.22206 4146.77164 3711.29411 4146.22661 3711.43703 4145.70434 3711.64848 4145.21339 3711.92498 4144.76183 3712.26199 4144.35707 3712.65397 4144.00576 3713.0945 4143.71367 3713.57634 4143.48559 3714.09157 4143.32527 3714.63174 4143.23534 3715.18797 4143.21728 3715.75114 4143.27139 3716.31199 4143.39677 3716.86132 4143.59137 3717.3901 4143.85199 3717.88966 4144.17435 3718.35179 4144.55316 3718.76891 4144.78019 3718.96218 4144.88402 3719.09901 4144.9209 3719.26676 4144.9209 3723.76602 4144.89045 3723.91909 4144.80374 3724.04886 4142.54886 3726.30374 4142.41909 3726.39045 4142.26602 3726.4209 4130.51572 3726.4209 4130.09673 3726.45387 4129.7034 3726.54831 4129.32967 3726.70311 4128.98477 3726.91446 4128.66519 3727.18741 4125.58941 3730.26319 4125.31646 3730.58277 4125.10511 3730.92767 4124.95031 3731.3014 4124.85587 3731.69473 4124.8229 3732.11372 4124.8229 3734.69607 4124.80513 3734.81397 4124.7534 3734.9214 4124.6723 3735.0088 4124.44537 3735.18977 4124.05339 3735.59453 4123.71638 3736.04609 4123.43988 3736.53704 4123.22843 3737.05931 4123.08551 3737.60434 4123.01346 3738.16317 4123.01346 3738.72663 4123.08551 3739.28546 4123.22843 3739.83049 4123.43988 3740.35276 4123.71638 3740.84371 4124.05339 3741.29527 4124.44537 3741.70003 4124.8859 3742.05134 4125.36774 3742.34343 4125.88297 3742.57151 4126.42314 3742.73183 4126.97937 3742.82176 4127.54254 3742.83982 Z M 4403.304 3746.3643 L 4403.304 3742.20495 4403.27524 3741.91294 4403.1958 3741.65105 4403.06679 3741.40969 4402.89317 3741.19813 4402.68161 3741.02451 4402.60511 3740.98362 4402.47964 3740.87862 4402.40671 3740.73217 4402.39851 3740.56877 4402.45642 3740.41576 4402.57075 3740.29873 4402.72237 3740.23726 4402.88591 3740.24164 4402.96476 3740.26032 4403.58817 3740.33319 4404.21583 3740.33319 4404.83924 3740.26032 4405.44997 3740.11558 4406.03977 3739.90091 4406.60066 3739.61922 4407.12506 3739.27432 4407.60587 3738.87087 4408.03659 3738.41433 4408.4114 3737.91088 4408.72522 3737.36731 4408.97382 3736.79099 4409.15384 3736.18971 4409.26283 3735.57159 4409.29932 3734.945 4409.26283 3734.31841 4409.15384 3733.70029 4408.97382 3733.09901 4408.72522 3732.52269 4408.4114 3731.97912 4408.03659 3731.47567 4407.60587 3731.01913 4407.12506 3730.61568 4406.60066 3730.27078 4406.03977 3729.98909 4405.44997 3729.77442 4404.83924 3729.62968 4404.21583 3729.55681 4403.58817 3729.55681 4402.96476 3729.62968 4402.35403 3729.77442 4401.76423 3729.98909 4401.20334 3730.27078 4400.67894 3730.61568 4400.19813 3731.01913 4399.76741 3731.47567 4399.3926 3731.97912 4399.07878 3732.52269 4398.83018 3733.09901 4398.65016 3733.70029 4398.54117 3734.31841 4398.50468 3734.945 4398.54117 3735.57159 4398.65016 3736.18971 4398.83018 3736.79099 4399.07878 3737.36731 4399.3926 3737.91088 4399.76741 3738.41433 4400.19813 3738.87087 4400.67894 3739.27432 4401.20334 3739.61922 4401.76423 3739.90091 4402.07716 3740.01481 4402.21651 3740.10131 4402.30943 3740.23646 4402.3403 3740.39754 4402.30393 3740.55747 4402.20643 3740.68936 4402.0642 3740.77103 4401.88635 3740.7873 4401.17125 3740.7873 4401.17125 3746.3643 4403.304 3746.3643 Z M 4061.4326 3689.9697 L 4061.4326 3689.39143 4061.46918 3689.22431 4061.57224 3689.08777 4061.72292 3689.00676 4061.89366 3688.99612 4062.24252 3689.05 4062.69748 3689.05 4063.04634 3688.99612 4063.21708 3689.00676 4063.36776 3689.08777 4063.47082 3689.22431 4063.5074 3689.39143 4063.5074 3689.9697 4065.25195 3689.9697 4065.08061 3689.5875 4064.83331 3689.20563 4064.51325 3688.85166 4064.40928 3688.72055 4064.36804 3688.55838 4064.39674 3688.39353 4064.49037 3688.25485 4064.68847 3688.0642 4064.96428 3687.70238 4065.18162 3687.3027 4065.3354 3686.87453 4065.42202 3686.4279 4065.43944 3685.97328 4065.38727 3685.52133 4065.26671 3685.08264 4065.08061 3684.6675 4064.83331 3684.28563 4064.53062 3683.94598 4064.40368 3683.79593 4064.36244 3683.63377 4064.39115 3683.46892 4064.48478 3683.33024 4064.68847 3683.1342 4064.96428 3682.77238 4065.18162 3682.3727 4065.3354 3681.94453 4065.42202 3681.4979 4065.43944 3681.04328 4065.38727 3680.59133 4065.26671 3680.15264 4065.08061 3679.7375 4064.83331 3679.35563 4064.51325 3679.00166 4064.40928 3678.87055 4064.36804 3678.70838 4064.39674 3678.54353 4064.49037 3678.40485 4064.68847 3678.2142 4064.96428 3677.85238 4065.18162 3677.4527 4065.3354 3677.02453 4065.42202 3676.5779 4065.43944 3676.12328 4065.38727 3675.67133 4065.26671 3675.23264 4065.08061 3674.8175 4064.83331 3674.43563 4064.51325 3674.08166 4064.40928 3673.95055 4064.36804 3673.78838 4064.39674 3673.62353 4064.49037 3673.48485 4064.68847 3673.2942 4064.96428 3672.93238 4065.18162 3672.5327 4065.3354 3672.10453 4065.42202 3671.6579 4065.43944 3671.20328 4065.38727 3670.75133 4065.26671 3670.31264 4065.08061 3669.8975 4064.83331 3669.51563 4064.51325 3669.16166 4064.40928 3669.03055 4064.36804 3668.86838 4064.39674 3668.70353 4064.49037 3668.56485 4064.68847 3668.3742 4064.96428 3668.01238 4065.18162 3667.6127 4065.3354 3667.18453 4065.42202 3666.7379 4065.43944 3666.28328 4065.38727 3665.83133 4065.26671 3665.39264 4065.08061 3664.9775 4064.83331 3664.59563 4064.51325 3664.24166 4064.40928 3664.11055 4064.36804 3663.94838 4064.39674 3663.78353 4064.49037 3663.64485 4064.68847 3663.4542 4064.96428 3663.09238 4065.18162 3662.6927 4065.24562 3662.5145 4063.5074 3662.5145 4063.5074 3663.0925 4063.48174 3663.23346 4063.40805 3663.35634 4063.29579 3663.44536 4063.15936 3663.48912 4063.01626 3663.48198 4062.92362 3663.4603 4062.47 3663.42548 4062.01638 3663.4603 4061.92374 3663.48198 4061.78064 3663.48912 4061.64421 3663.44536 4061.53195 3663.35634 4061.45826 3663.23346 4061.4326 3663.0925 4061.4326 3662.5145 4059.69438 3662.5145 4059.75838 3662.6927 4059.97572 3663.09238 4060.25153 3663.4542 4060.44963 3663.64485 4060.54326 3663.78353 4060.57196 3663.94838 4060.53072 3664.11055 4060.40938 3664.25598 4060.10669 3664.59563 4059.85939 3664.9775 4059.67329 3665.39264 4059.55273 3665.83133 4059.50056 3666.28328 4059.51798 3666.7379 4059.6046 3667.18453 4059.75838 3667.6127 4059.97572 3668.01238 4060.25153 3668.3742 4060.44963 3668.56485 4060.54326 3668.70353 4060.57196 3668.86838 4060.53072 3669.03055 4060.40938 3669.17598 4060.10669 3669.51563 4059.85939 3669.8975 4059.67329 3670.31264 4059.55273 3670.75133 4059.50056 3671.20328 4059.51798 3671.6579 4059.6046 3672.10453 4059.75838 3672.5327 4059.97572 3672.93238 4060.25153 3673.2942 4060.44963 3673.48485 4060.54326 3673.62353 4060.57196 3673.78838 4060.53072 3673.95055 4060.40938 3674.09598 4060.10669 3674.43563 4059.85939 3674.8175 4059.67329 3675.23264 4059.55273 3675.67133 4059.50056 3676.12328 4059.51798 3676.5779 4059.6046 3677.02453 4059.75838 3677.4527 4059.97572 3677.85238 4060.25153 3678.2142 4060.44963 3678.40485 4060.54326 3678.54353 4060.57196 3678.70838 4060.53072 3678.87055 4060.40938 3679.01598 4060.10669 3679.35563 4059.85939 3679.7375 4059.67329 3680.15264 4059.55273 3680.59133 4059.50056 3681.04328 4059.51798 3681.4979 4059.6046 3681.94453 4059.75838 3682.3727 4059.97572 3682.77238 4060.25153 3683.1342 4060.45522 3683.33024 4060.54885 3683.46892 4060.57756 3683.63377 4060.53632 3683.79593 4060.40938 3683.94598 4060.10669 3684.28563 4059.85939 3684.6675 4059.67329 3685.08264 4059.55273 3685.52133 4059.50056 3685.97328 4059.51798 3686.4279 4059.6046 3686.87453 4059.75838 3687.3027 4059.97572 3687.70238 4060.25153 3688.0642 4060.44963 3688.25485 4060.54326 3688.39353 4060.57196 3688.55838 4060.53072 3688.72055 4060.40938 3688.86598 4060.10669 3689.20563 4059.85939 3689.5875 4059.68805 3689.9697 4061.4326 3689.9697 Z M 4117.1122 3720.00738 L 4117.6745 3719.97128 4118.22756 3719.86357 4118.76232 3719.68602 4119.26997 3719.44154 4119.7422 3719.13416 4120.17124 3718.76891 4120.55005 3718.35179 4120.87241 3717.88966 4121.13303 3717.3901 4121.32763 3716.86132 4121.45301 3716.31199 4121.50712 3715.75114 4121.48906 3715.18797 4121.39913 3714.63174 4121.23881 3714.09157 4121.01073 3713.57634 4120.71864 3713.0945 4120.36733 3712.65397 4119.96257 3712.26199 4119.51101 3711.92498 4119.02006 3711.64848 4118.49779 3711.43703 4117.95276 3711.29411 4117.39393 3711.22206 4116.83047 3711.22206 4116.27164 3711.29411 4115.72661 3711.43703 4115.20434 3711.64848 4114.71339 3711.92498 4114.26183 3712.26199 4113.85707 3712.65397 4113.50576 3713.0945 4113.21367 3713.57634 4112.98559 3714.09157 4112.82527 3714.63174 4112.75707 3715.05356 4112.7004 3715.20331 4112.58954 3715.31883 4112.44226 3715.38163 4112.28214 3715.38163 4112.13486 3715.31883 4112.024 3715.20331 4111.96733 3715.05356 4111.89913 3714.63174 4111.73881 3714.09157 4111.51073 3713.57634 4111.21864 3713.0945 4110.86733 3712.65397 4110.46257 3712.26199 4110.01101 3711.92498 4109.52006 3711.64848 4108.99779 3711.43703 4108.45276 3711.29411 4107.89393 3711.22206 4107.33047 3711.22206 4106.77164 3711.29411 4106.22661 3711.43703 4105.70434 3711.64848 4105.21339 3711.92498 4104.76183 3712.26199 4104.35707 3712.65397 4104.00576 3713.0945 4103.71367 3713.57634 4103.48559 3714.09157 4103.32527 3714.63174 4103.23534 3715.18797 4103.21728 3715.75114 4103.27139 3716.31199 4103.39677 3716.86132 4103.59137 3717.3901 4103.85199 3717.88966 4104.17435 3718.35179 4104.55316 3718.76891 4104.9822 3719.13416 4105.45443 3719.44154 4105.96208 3719.68602 4106.49684 3719.86357 4107.0499 3719.97128 4107.6122 3720.00738 4108.1745 3719.97128 4108.72756 3719.86357 4109.26232 3719.68602 4109.76997 3719.44154 4110.2422 3719.13416 4110.67124 3718.76891 4111.05005 3718.35179 4111.37241 3717.88966 4111.63303 3717.3901 4111.82763 3716.86132 4111.95301 3716.31199 4111.96405 3716.19759 4112.01458 3716.03812 4112.1259 3715.91326 4112.27856 3715.84484 4112.44584 3715.84484 4112.5985 3715.91326 4112.70982 3716.03812 4112.76035 3716.19759 4112.77139 3716.31199 4112.89677 3716.86132 4113.09137 3717.3901 4113.35199 3717.88966 4113.67435 3718.35179 4114.05316 3718.76891 4114.4822 3719.13416 4114.95443 3719.44154 4115.46208 3719.68602 4115.99684 3719.86357 4116.5499 3719.97128 4117.1122 3720.00738 Z M 4385.74435 3781.7723 L 4386.03636 3781.74354 4386.29825 3781.6641 4386.53961 3781.53509 4386.75117 3781.36147 4386.92479 3781.14991 4387.0538 3780.90855 4387.13324 3780.64666 4387.162 3780.35465 4387.162 3767.00795 4387.13324 3766.71594 4387.0538 3766.45405 4386.92479 3766.21269 4386.75117 3766.00113 4386.53961 3765.82751 4386.29825 3765.6985 4386.03636 3765.61906 4385.74435 3765.5903 4379.48465 3765.5903 4379.19264 3765.61906 4378.93075 3765.6985 4378.68939 3765.82751 4378.47783 3766.00113 4378.30421 3766.21269 4378.1752 3766.45405 4378.09576 3766.71594 4378.067 3767.00795 4378.067 3780.35465 4378.09576 3780.64666 4378.1752 3780.90855 4378.30421 3781.14991 4378.47783 3781.36147 4378.68939 3781.53509 4378.93075 3781.6641 4379.19264 3781.74354 4379.48465 3781.7723 4385.74435 3781.7723 Z M 4029.46476 3847.26032 L 4030.08817 3847.33319 4030.71583 3847.33319 4031.33924 3847.26032 4031.94997 3847.11558 4032.53977 3846.90091 4033.10066 3846.61922 4033.62506 3846.27432 4034.10587 3845.87087 4034.53659 3845.41433 4034.9114 3844.91088 4035.22522 3844.36731 4035.47382 3843.79099 4035.65384 3843.18971 4035.76283 3842.57159 4035.79932 3841.945 4035.76283 3841.31841 4035.65384 3840.70029 4035.47382 3840.09901 4035.22522 3839.52269 4034.9114 3838.97912 4034.53659 3838.47567 4034.10587 3838.01913 4033.62506 3837.61568 4033.10066 3837.27078 4032.53977 3836.98909 4031.94997 3836.77442 4031.33924 3836.62968 4030.71583 3836.55681 4030.08817 3836.55681 4029.46476 3836.62968 4028.85403 3836.77442 4028.26423 3836.98909 4027.70334 3837.27078 4027.17894 3837.61568 4026.69813 3838.01913 4026.26741 3838.47567 4025.8926 3838.97912 4025.57878 3839.52269 4025.33018 3840.09901 4025.15016 3840.70029 4025.04117 3841.31841 4025.00468 3841.945 4025.04117 3842.57159 4025.15016 3843.18971 4025.33018 3843.79099 4025.57878 3844.36731 4025.8926 3844.91088 4026.26741 3845.41433 4026.69813 3845.87087 4027.17894 3846.27432 4027.70334 3846.61922 4028.26423 3846.90091 4028.85403 3847.11558 4029.46476 3847.26032 Z M 4215.91276 3693.36632 L 4216.53617 3693.43919 4217.16383 3693.43919 4217.78724 3693.36632 4218.39797 3693.22158 4218.98777 3693.00691 4219.54866 3692.72522 4220.07306 3692.38032 4220.55387 3691.97687 4220.98459 3691.52033 4221.3594 3691.01688 4221.67322 3690.47331 4221.92182 3689.89699 4222.10184 3689.29571 4222.21083 3688.67759 4222.24732 3688.051 4222.21083 3687.42441 4222.10184 3686.80629 4221.92182 3686.20501 4221.67322 3685.62869 4221.3594 3685.08512 4220.98459 3684.58167 4220.55387 3684.12513 4220.07306 3683.72168 4219.54866 3683.37678 4218.98777 3683.09509 4218.39797 3682.88042 4217.78724 3682.73568 4217.16383 3682.66281 4216.53617 3682.66281 4215.91276 3682.73568 4215.30203 3682.88042 4214.71223 3683.09509 4214.15134 3683.37678 4213.62694 3683.72168 4213.14613 3684.12513 4212.71541 3684.58167 4212.3406 3685.08512 4212.02678 3685.62869 4211.77818 3686.20501 4211.59816 3686.80629 4211.48917 3687.42441 4211.45268 3688.051 4211.48917 3688.67759 4211.59816 3689.29571 4211.77818 3689.89699 4212.02678 3690.47331 4212.3406 3691.01688 4212.71541 3691.52033 4213.14613 3691.97687 4213.62694 3692.38032 4214.15134 3692.72522 4214.71223 3693.00691 4215.30203 3693.22158 4215.91276 3693.36632 Z M 4404.21583 3847.33319 L 4404.83924 3847.26032 4405.44997 3847.11558 4406.03977 3846.90091 4406.60066 3846.61922 4407.12506 3846.27432 4407.60587 3845.87087 4408.03659 3845.41433 4408.4114 3844.91088 4408.72522 3844.36731 4408.97382 3843.79099 4409.15384 3843.18971 4409.26283 3842.57159 4409.29932 3841.945 4409.26283 3841.31841 4409.15384 3840.70029 4408.97382 3840.09901 4408.72522 3839.52269 4408.4114 3838.97912 4408.03659 3838.47567 4407.60587 3838.01913 4407.12506 3837.61568 4406.60066 3837.27078 4406.03977 3836.98909 4405.44997 3836.77442 4404.83924 3836.62968 4404.21583 3836.55681 4403.58817 3836.55681 4402.96476 3836.62968 4402.35403 3836.77442 4401.76423 3836.98909 4401.20334 3837.27078 4400.67894 3837.61568 4400.19813 3838.01913 4399.76741 3838.47567 4399.3926 3838.97912 4399.07878 3839.52269 4398.83018 3840.09901 4398.65016 3840.70029 4398.54117 3841.31841 4398.50468 3841.945 4398.54117 3842.57159 4398.65016 3843.18971 4398.83018 3843.79099 4399.07878 3844.36731 4399.3926 3844.91088 4399.76741 3845.41433 4400.19813 3845.87087 4400.67894 3846.27432 4401.20334 3846.61922 4401.76423 3846.90091 4402.35403 3847.11558 4402.96476 3847.26032 4403.58817 3847.33319 4404.21583 3847.33319 Z M 4028.96476 3740.26032 L 4029.58817 3740.33319 4030.21583 3740.33319 4030.83924 3740.26032 4031.44997 3740.11558 4032.03977 3739.90091 4032.60066 3739.61922 4033.12506 3739.27432 4033.60587 3738.87087 4034.03659 3738.41433 4034.4114 3737.91088 4034.72522 3737.36731 4034.97382 3736.79099 4035.15384 3736.18971 4035.26283 3735.57159 4035.29932 3734.945 4035.26283 3734.31841 4035.15384 3733.70029 4034.97382 3733.09901 4034.72522 3732.52269 4034.4114 3731.97912 4034.03659 3731.47567 4033.60587 3731.01913 4033.12506 3730.61568 4032.60066 3730.27078 4032.03977 3729.98909 4031.44997 3729.77442 4030.83924 3729.62968 4030.21583 3729.55681 4029.58817 3729.55681 4028.96476 3729.62968 4028.35403 3729.77442 4027.76423 3729.98909 4027.20334 3730.27078 4026.67894 3730.61568 4026.19813 3731.01913 4025.76741 3731.47567 4025.3926 3731.97912 4025.07878 3732.52269 4024.83018 3733.09901 4024.65016 3733.70029 4024.54117 3734.31841 4024.50468 3734.945 4024.54117 3735.57159 4024.65016 3736.18971 4024.83018 3736.79099 4025.07878 3737.36731 4025.3926 3737.91088 4025.76741 3738.41433 4026.19813 3738.87087 4026.67894 3739.27432 4027.20334 3739.61922 4027.76423 3739.90091 4028.35403 3740.11558 4028.96476 3740.26032 Z M 4390.38916 3709.1243 L 4391.0053 3709.05228 4391.6089 3708.90922 4392.19182 3708.69706 4392.74616 3708.41866 4393.26444 3708.07778 4393.73963 3707.67905 4394.16533 3707.22784 4394.53576 3706.73026 4394.84592 3706.19304 4395.09162 3705.62345 4395.26953 3705.02918 4395.37725 3704.41828 4395.41332 3703.799 4395.37725 3703.17972 4395.26953 3702.56882 4395.09162 3701.97455 4394.84592 3701.40496 4394.53576 3700.86774 4394.16533 3700.37016 4393.73963 3699.91895 4393.26444 3699.52022 4392.74616 3699.17934 4392.19182 3698.90094 4391.6089 3698.68878 4391.0053 3698.54572 4390.38916 3698.4737 4389.76884 3698.4737 4389.1527 3698.54572 4388.5491 3698.68878 4387.96618 3698.90094 4387.41184 3699.17934 4386.89356 3699.52022 4386.41837 3699.91895 4385.99267 3700.37016 4385.62224 3700.86774 4385.31208 3701.40496 4385.06638 3701.97455 4384.88847 3702.56882 4384.78075 3703.17972 4384.74468 3703.799 4384.78075 3704.41828 4384.88847 3705.02918 4385.06638 3705.62345 4385.31208 3706.19304 4385.62224 3706.73026 4385.99267 3707.22784 4386.41837 3707.67905 4386.89356 3708.07778 4387.41184 3708.41866 4387.96618 3708.69706 4388.5491 3708.90922 4389.1527 3709.05228 4389.76884 3709.1243 4390.38916 3709.1243 Z M 4043.93216 3709.1243 L 4044.5483 3709.05228 4045.1519 3708.90922 4045.73482 3708.69706 4046.28916 3708.41866 4046.80744 3708.07778 4047.28263 3707.67905 4047.70833 3707.22784 4048.07876 3706.73026 4048.38892 3706.19304 4048.63462 3705.62345 4048.81253 3705.02918 4048.92025 3704.41828 4048.95632 3703.799 4048.92025 3703.17972 4048.81253 3702.56882 4048.63462 3701.97455 4048.38892 3701.40496 4048.07876 3700.86774 4047.70833 3700.37016 4047.28263 3699.91895 4046.80744 3699.52022 4046.28916 3699.17934 4045.73482 3698.90094 4045.1519 3698.68878 4044.5483 3698.54572 4043.93216 3698.4737 4043.31184 3698.4737 4042.6957 3698.54572 4042.0921 3698.68878 4041.50918 3698.90094 4040.95484 3699.17934 4040.43656 3699.52022 4039.96137 3699.91895 4039.53567 3700.37016 4039.16524 3700.86774 4038.85508 3701.40496 4038.60938 3701.97455 4038.43147 3702.56882 4038.32375 3703.17972 4038.28768 3703.799 4038.32375 3704.41828 4038.43147 3705.02918 4038.60938 3705.62345 4038.85508 3706.19304 4039.16524 3706.73026 4039.53567 3707.22784 4039.96137 3707.67905 4040.43656 3708.07778 4040.95484 3708.41866 4041.50918 3708.69706 4042.0921 3708.90922 4042.6957 3709.05228 4043.31184 3709.1243 4043.93216 3709.1243 Z M 4050.81016 3793.7703 L 4051.4263 3793.69828 4052.0299 3793.55522 4052.61282 3793.34306 4053.16716 3793.06466 4053.68544 3792.72378 4054.16063 3792.32505 4054.58633 3791.87384 4054.95676 3791.37626 4055.26692 3790.83904 4055.51262 3790.26945 4055.69053 3789.67518 4055.79825 3789.06428 4055.83432 3788.445 4055.79825 3787.82572 4055.69053 3787.21482 4055.51262 3786.62055 4055.26692 3786.05096 4054.95676 3785.51374 4054.58633 3785.01616 4054.16063 3784.56495 4053.68544 3784.16622 4053.16716 3783.82534 4052.61282 3783.54694 4052.0299 3783.33478 4051.4263 3783.19172 4050.81016 3783.1197 4050.18984 3783.1197 4049.5737 3783.19172 4048.9701 3783.33478 4048.38718 3783.54694 4047.83284 3783.82534 4047.31456 3784.16622 4046.83937 3784.56495 4046.41367 3785.01616 4046.04324 3785.51374 4045.73308 3786.05096 4045.48738 3786.62055 4045.30947 3787.21482 4045.20175 3787.82572 4045.16568 3788.445 4045.20175 3789.06428 4045.30947 3789.67518 4045.48738 3790.26945 4045.73308 3790.83904 4046.04324 3791.37626 4046.41367 3791.87384 4046.83937 3792.32505 4047.31456 3792.72378 4047.83284 3793.06466 4048.38718 3793.34306 4048.9701 3793.55522 4049.5737 3793.69828 4050.18984 3793.7703 4050.81016 3793.7703 Z M 4379.3097 3612.59628 L 4379.92584 3612.6683 4380.54616 3612.6683 4381.1623 3612.59628 4381.7659 3612.45322 4382.34882 3612.24106 4382.90316 3611.96266 4383.42144 3611.62178 4383.89663 3611.22305 4384.32233 3610.77184 4384.69276 3610.27426 4385.00292 3609.73704 4385.24862 3609.16745 4385.42653 3608.57318 4385.53425 3607.96228 4385.57032 3607.343 4385.53425 3606.72372 4385.42653 3606.11282 4385.24862 3605.51855 4385.00292 3604.94896 4384.69276 3604.41174 4384.32233 3603.91416 4383.89663 3603.46295 4383.42144 3603.06422 4382.90316 3602.72334 4382.34882 3602.44494 4381.7659 3602.23278 4381.1623 3602.08972 4380.54616 3602.0177 4379.92584 3602.0177 4379.3097 3602.08972 4378.7061 3602.23278 4378.12318 3602.44494 4377.56884 3602.72334 4377.05056 3603.06422 4376.57537 3603.46295 4376.14967 3603.91416 4375.77924 3604.41174 4375.46908 3604.94896 4375.22338 3605.51855 4375.04547 3606.11282 4374.93775 3606.72372 4374.90168 3607.343 4374.93775 3607.96228 4375.04547 3608.57318 4375.22338 3609.16745 4375.46908 3609.73704 4375.77924 3610.27426 4376.14967 3610.77184 4376.57537 3611.22305 4377.05056 3611.62178 4377.56884 3611.96266 4378.12318 3612.24106 4378.7061 3612.45322 4379.3097 3612.59628 Z M 4032.8537 3612.59628 L 4033.46984 3612.6683 4034.09016 3612.6683 4034.7063 3612.59628 4035.3099 3612.45322 4035.89282 3612.24106 4036.44716 3611.96266 4036.96544 3611.62178 4037.44063 3611.22305 4037.86633 3610.77184 4038.23676 3610.27426 4038.54692 3609.73704 4038.79262 3609.16745 4038.97053 3608.57318 4039.07825 3607.96228 4039.11432 3607.343 4039.07825 3606.72372 4038.97053 3606.11282 4038.79262 3605.51855 4038.54692 3604.94896 4038.23676 3604.41174 4037.86633 3603.91416 4037.44063 3603.46295 4036.96544 3603.06422 4036.44716 3602.72334 4035.89282 3602.44494 4035.3099 3602.23278 4034.7063 3602.08972 4034.09016 3602.0177 4033.46984 3602.0177 4032.8537 3602.08972 4032.2501 3602.23278 4031.66718 3602.44494 4031.11284 3602.72334 4030.59456 3603.06422 4030.11937 3603.46295 4029.69367 3603.91416 4029.32324 3604.41174 4029.01308 3604.94896 4028.76738 3605.51855 4028.58947 3606.11282 4028.48175 3606.72372 4028.44568 3607.343 4028.48175 3607.96228 4028.58947 3608.57318 4028.76738 3609.16745 4029.01308 3609.73704 4029.32324 3610.27426 4029.69367 3610.77184 4030.11937 3611.22305 4030.59456 3611.62178 4031.11284 3611.96266 4031.66718 3612.24106 4032.2501 3612.45322 4032.8537 3612.59628 Z M 4405 3700.05077 L 4405.59552 3700.01475 4406.18236 3699.9072 4406.75195 3699.72971 4407.296 3699.48486 4407.80656 3699.17621 4408.2762 3698.80827 4408.69807 3698.3864 4409.06601 3697.91676 4409.37466 3697.4062 4409.61951 3696.86215 4409.797 3696.29256 4409.90455 3695.70572 4409.94057 3695.1102 4409.90455 3694.51468 4409.797 3693.92784 4409.61951 3693.35825 4409.37466 3692.8142 4409.06601 3692.30364 4408.69807 3691.834 4408.2762 3691.41213 4407.80656 3691.04419 4407.296 3690.73554 4406.75195 3690.49069 4406.18236 3690.3132 4405.59552 3690.20565 4405 3690.16963 4404.40448 3690.20565 4403.81764 3690.3132 4403.24805 3690.49069 4402.704 3690.73554 4402.19344 3691.04419 4401.7238 3691.41213 4401.30193 3691.834 4400.93399 3692.30364 4400.62534 3692.8142 4400.38049 3693.35825 4400.203 3693.92784 4400.09545 3694.51468 4400.05943 3695.1102 4400.09545 3695.70572 4400.203 3696.29256 4400.38049 3696.86215 4400.62534 3697.4062 4400.93399 3697.91676 4401.30193 3698.3864 4401.7238 3698.80827 4402.19344 3699.17621 4402.704 3699.48486 4403.24805 3699.72971 4403.81764 3699.9072 4404.40448 3700.01475 4405 3700.05077 Z M 4107.61 3645.04681 L 4108.17987 3645.01096 4108.74075 3644.90396 4109.28379 3644.72752 4109.80044 3644.4844 4110.28255 3644.17845 4110.72251 3643.81448 4111.11338 3643.39825 4111.449 3642.9363 4111.72408 3642.43594 4111.93427 3641.90504 4112.07627 3641.35199 4112.14784 3640.7855 4112.14784 3640.2145 4112.07627 3639.64801 4111.93427 3639.09496 4111.72408 3638.56406 4111.449 3638.0637 4111.11338 3637.60175 4110.72251 3637.18552 4110.28255 3636.82155 4109.80044 3636.5156 4109.28379 3636.27248 4108.74075 3636.09604 4108.17987 3635.98904 4107.61 3635.95319 4107.04013 3635.98904 4106.47925 3636.09604 4105.93621 3636.27248 4105.41956 3636.5156 4104.93745 3636.82155 4104.49749 3637.18552 4104.10662 3637.60175 4103.771 3638.0637 4103.49592 3638.56406 4103.28573 3639.09496 4103.14373 3639.64801 4103.07216 3640.2145 4103.07216 3640.7855 4103.14373 3641.35199 4103.28573 3641.90504 4103.49592 3642.43594 4103.771 3642.9363 4104.10662 3643.39825 4104.49749 3643.81448 4104.93745 3644.17845 4105.41956 3644.4844 4105.93621 3644.72752 4106.47925 3644.90396 4107.04013 3645.01096 4107.61 3645.04681 Z M 4340.28173 3649.38814 L 4340.84056 3649.31609 4341.38559 3649.17317 4341.90786 3648.96172 4342.39881 3648.68522 4342.85037 3648.34821 4343.25513 3647.95623 4343.60644 3647.5157 4343.89853 3647.03386 4344.12661 3646.51863 4344.28693 3645.97846 4344.37686 3645.42223 4344.39492 3644.85906 4344.34081 3644.29821 4344.21543 3643.74888 4344.02083 3643.2201 4343.76021 3642.72054 4343.43785 3642.25841 4343.05904 3641.84129 4342.63 3641.47604 4342.15777 3641.16866 4341.65012 3640.92418 4341.11536 3640.74663 4340.5623 3640.63892 4340 3640.60282 4339.4377 3640.63892 4338.88464 3640.74663 4338.34988 3640.92418 4337.84223 3641.16866 4337.37 3641.47604 4336.94096 3641.84129 4336.56215 3642.25841 4336.23979 3642.72054 4335.97917 3643.2201 4335.78457 3643.74888 4335.65919 3644.29821 4335.60508 3644.85906 4335.62314 3645.42223 4335.71307 3645.97846 4335.87339 3646.51863 4336.10147 3647.03386 4336.39356 3647.5157 4336.74487 3647.95623 4337.14963 3648.34821 4337.60119 3648.68522 4338.09214 3648.96172 4338.61441 3649.17317 4339.15944 3649.31609 4339.71827 3649.38814 4340.28173 3649.38814 Z M 4359.15944 3659.31609 L 4359.71827 3659.38814 4360.28173 3659.38814 4360.84056 3659.31609 4361.38559 3659.17317 4361.90786 3658.96172 4362.39881 3658.68522 4362.85037 3658.34821 4363.25513 3657.95623 4363.60644 3657.5157 4363.89853 3657.03386 4364.12661 3656.51863 4364.28693 3655.97846 4364.37686 3655.42223 4364.39492 3654.85906 4364.34081 3654.29821 4364.21543 3653.74888 4364.02083 3653.2201 4363.76021 3652.72054 4363.43785 3652.25841 4363.05904 3651.84129 4362.63 3651.47604 4362.15777 3651.16866 4361.65012 3650.92418 4361.11536 3650.74663 4360.5623 3650.63892 4360 3650.60282 4359.4377 3650.63892 4358.88464 3650.74663 4358.34988 3650.92418 4357.84223 3651.16866 4357.37 3651.47604 4356.94096 3651.84129 4356.56215 3652.25841 4356.23979 3652.72054 4355.97917 3653.2201 4355.78457 3653.74888 4355.65919 3654.29821 4355.60508 3654.85906 4355.62314 3655.42223 4355.71307 3655.97846 4355.87339 3656.51863 4356.10147 3657.03386 4356.39356 3657.5157 4356.74487 3657.95623 4357.14963 3658.34821 4357.60119 3658.68522 4358.09214 3658.96172 4358.61441 3659.17317 4359.15944 3659.31609 Z M 4319.15944 3659.31609 L 4319.71827 3659.38814 4320.28173 3659.38814 4320.84056 3659.31609 4321.38559 3659.17317 4321.90786 3658.96172 4322.39881 3658.68522 4322.85037 3658.34821 4323.25513 3657.95623 4323.60644 3657.5157 4323.89853 3657.03386 4324.12661 3656.51863 4324.28693 3655.97846 4324.37686 3655.42223 4324.39492 3654.85906 4324.34081 3654.29821 4324.21543 3653.74888 4324.02083 3653.2201 4323.76021 3652.72054 4323.43785 3652.25841 4323.05904 3651.84129 4322.63 3651.47604 4322.15777 3651.16866 4321.65012 3650.92418 4321.11536 3650.74663 4320.5623 3650.63892 4320 3650.60282 4319.4377 3650.63892 4318.88464 3650.74663 4318.34988 3650.92418 4317.84223 3651.16866 4317.37 3651.47604 4316.94096 3651.84129 4316.56215 3652.25841 4316.23979 3652.72054 4315.97917 3653.2201 4315.78457 3653.74888 4315.65919 3654.29821 4315.60508 3654.85906 4315.62314 3655.42223 4315.71307 3655.97846 4315.87339 3656.51863 4316.10147 3657.03386 4316.39356 3657.5157 4316.74487 3657.95623 4317.14963 3658.34821 4317.60119 3658.68522 4318.09214 3658.96172 4318.61441 3659.17317 4319.15944 3659.31609 Z M 4289.15944 3659.31609 L 4289.71827 3659.38814 4290.28173 3659.38814 4290.84056 3659.31609 4291.38559 3659.17317 4291.90786 3658.96172 4292.39881 3658.68522 4292.85037 3658.34821 4293.25513 3657.95623 4293.60644 3657.5157 4293.89853 3657.03386 4294.12661 3656.51863 4294.28693 3655.97846 4294.37686 3655.42223 4294.39492 3654.85906 4294.34081 3654.29821 4294.21543 3653.74888 4294.02083 3653.2201 4293.76021 3652.72054 4293.43785 3652.25841 4293.05904 3651.84129 4292.63 3651.47604 4292.15777 3651.16866 4291.65012 3650.92418 4291.11536 3650.74663 4290.5623 3650.63892 4290 3650.60282 4289.4377 3650.63892 4288.88464 3650.74663 4288.34988 3650.92418 4287.84223 3651.16866 4287.37 3651.47604 4286.94096 3651.84129 4286.56215 3652.25841 4286.23979 3652.72054 4285.97917 3653.2201 4285.78457 3653.74888 4285.65919 3654.29821 4285.60508 3654.85906 4285.62314 3655.42223 4285.71307 3655.97846 4285.87339 3656.51863 4286.10147 3657.03386 4286.39356 3657.5157 4286.74487 3657.95623 4287.14963 3658.34821 4287.60119 3658.68522 4288.09214 3658.96172 4288.61441 3659.17317 4289.15944 3659.31609 Z M 4340.28173 3659.38814 L 4340.84056 3659.31609 4341.38559 3659.17317 4341.90786 3658.96172 4342.39881 3658.68522 4342.85037 3658.34821 4343.25513 3657.95623 4343.60644 3657.5157 4343.89853 3657.03386 4344.12661 3656.51863 4344.28693 3655.97846 4344.37686 3655.42223 4344.39492 3654.85906 4344.34081 3654.29821 4344.21543 3653.74888 4344.02083 3653.2201 4343.76021 3652.72054 4343.43785 3652.25841 4343.05904 3651.84129 4342.63 3651.47604 4342.15777 3651.16866 4341.65012 3650.92418 4341.11536 3650.74663 4340.5623 3650.63892 4340 3650.60282 4339.4377 3650.63892 4338.88464 3650.74663 4338.34988 3650.92418 4337.84223 3651.16866 4337.37 3651.47604 4336.94096 3651.84129 4336.56215 3652.25841 4336.23979 3652.72054 4335.97917 3653.2201 4335.78457 3653.74888 4335.65919 3654.29821 4335.60508 3654.85906 4335.62314 3655.42223 4335.71307 3655.97846 4335.87339 3656.51863 4336.10147 3657.03386 4336.39356 3657.5157 4336.74487 3657.95623 4337.14963 3658.34821 4337.60119 3658.68522 4338.09214 3658.96172 4338.61441 3659.17317 4339.15944 3659.31609 4339.71827 3659.38814 4340.28173 3659.38814 Z M 4310.28173 3659.38814 L 4310.84056 3659.31609 4311.38559 3659.17317 4311.90786 3658.96172 4312.39881 3658.68522 4312.85037 3658.34821 4313.25513 3657.95623 4313.60644 3657.5157 4313.89853 3657.03386 4314.12661 3656.51863 4314.28693 3655.97846 4314.37686 3655.42223 4314.39492 3654.85906 4314.34081 3654.29821 4314.21543 3653.74888 4314.02083 3653.2201 4313.76021 3652.72054 4313.43785 3652.25841 4313.05904 3651.84129 4312.63 3651.47604 4312.15777 3651.16866 4311.65012 3650.92418 4311.11536 3650.74663 4310.5623 3650.63892 4310 3650.60282 4309.4377 3650.63892 4308.88464 3650.74663 4308.34988 3650.92418 4307.84223 3651.16866 4307.37 3651.47604 4306.94096 3651.84129 4306.56215 3652.25841 4306.23979 3652.72054 4305.97917 3653.2201 4305.78457 3653.74888 4305.65919 3654.29821 4305.60508 3654.85906 4305.62314 3655.42223 4305.71307 3655.97846 4305.87339 3656.51863 4306.10147 3657.03386 4306.39356 3657.5157 4306.74487 3657.95623 4307.14963 3658.34821 4307.60119 3658.68522 4308.09214 3658.96172 4308.61441 3659.17317 4309.15944 3659.31609 4309.71827 3659.38814 4310.28173 3659.38814 Z M 4329.15944 3659.31609 L 4329.71827 3659.38814 4330.28173 3659.38814 4330.84056 3659.31609 4331.38559 3659.17317 4331.90786 3658.96172 4332.39881 3658.68522 4332.85037 3658.34821 4333.25513 3657.95623 4333.60644 3657.5157 4333.89853 3657.03386 4334.12661 3656.51863 4334.28693 3655.97846 4334.37686 3655.42223 4334.39492 3654.85906 4334.34081 3654.29821 4334.21543 3653.74888 4334.02083 3653.2201 4333.76021 3652.72054 4333.43785 3652.25841 4333.05904 3651.84129 4332.63 3651.47604 4332.15777 3651.16866 4331.65012 3650.92418 4331.11536 3650.74663 4330.5623 3650.63892 4330 3650.60282 4329.4377 3650.63892 4328.88464 3650.74663 4328.34988 3650.92418 4327.84223 3651.16866 4327.37 3651.47604 4326.94096 3651.84129 4326.56215 3652.25841 4326.23979 3652.72054 4325.97917 3653.2201 4325.78457 3653.74888 4325.65919 3654.29821 4325.60508 3654.85906 4325.62314 3655.42223 4325.71307 3655.97846 4325.87339 3656.51863 4326.10147 3657.03386 4326.39356 3657.5157 4326.74487 3657.95623 4327.14963 3658.34821 4327.60119 3658.68522 4328.09214 3658.96172 4328.61441 3659.17317 4329.15944 3659.31609 Z M 4127.1122 3720.00738 L 4127.6745 3719.97128 4128.22756 3719.86357 4128.76232 3719.68602 4129.26997 3719.44154 4129.7422 3719.13416 4130.17124 3718.76891 4130.55005 3718.35179 4130.87241 3717.88966 4131.13303 3717.3901 4131.32763 3716.86132 4131.45301 3716.31199 4131.50712 3715.75114 4131.48906 3715.18797 4131.39913 3714.63174 4131.23881 3714.09157 4131.01073 3713.57634 4130.71864 3713.0945 4130.36733 3712.65397 4129.96257 3712.26199 4129.51101 3711.92498 4129.02006 3711.64848 4128.49779 3711.43703 4127.95276 3711.29411 4127.39393 3711.22206 4126.83047 3711.22206 4126.27164 3711.29411 4125.72661 3711.43703 4125.20434 3711.64848 4124.71339 3711.92498 4124.26183 3712.26199 4123.85707 3712.65397 4123.50576 3713.0945 4123.21367 3713.57634 4122.98559 3714.09157 4122.82527 3714.63174 4122.73534 3715.18797 4122.71728 3715.75114 4122.77139 3716.31199 4122.89677 3716.86132 4123.09137 3717.3901 4123.35199 3717.88966 4123.67435 3718.35179 4124.05316 3718.76891 4124.4822 3719.13416 4124.95443 3719.44154 4125.46208 3719.68602 4125.99684 3719.86357 4126.5499 3719.97128 4127.1122 3720.00738 Z M 4299.15944 3659.31609 L 4299.71827 3659.38814 4300.28173 3659.38814 4300.84056 3659.31609 4301.38559 3659.17317 4301.90786 3658.96172 4302.39881 3658.68522 4302.85037 3658.34821 4303.25513 3657.95623 4303.60644 3657.5157 4303.89853 3657.03386 4304.12661 3656.51863 4304.28693 3655.97846 4304.37686 3655.42223 4304.39492 3654.85906 4304.34081 3654.29821 4304.21543 3653.74888 4304.02083 3653.2201 4303.76021 3652.72054 4303.43785 3652.25841 4303.05904 3651.84129 4302.63 3651.47604 4302.15777 3651.16866 4301.65012 3650.92418 4301.11536 3650.74663 4300.5623 3650.63892 4300 3650.60282 4299.4377 3650.63892 4298.88464 3650.74663 4298.34988 3650.92418 4297.84223 3651.16866 4297.37 3651.47604 4296.94096 3651.84129 4296.56215 3652.25841 4296.23979 3652.72054 4295.97917 3653.2201 4295.78457 3653.74888 4295.65919 3654.29821 4295.60508 3654.85906 4295.62314 3655.42223 4295.71307 3655.97846 4295.87339 3656.51863 4296.10147 3657.03386 4296.39356 3657.5157 4296.74487 3657.95623 4297.14963 3658.34821 4297.60119 3658.68522 4298.09214 3658.96172 4298.61441 3659.17317 4299.15944 3659.31609 Z M 4349.15944 3659.31609 L 4349.71827 3659.38814 4350.28173 3659.38814 4350.84056 3659.31609 4351.38559 3659.17317 4351.90786 3658.96172 4352.39881 3658.68522 4352.85037 3658.34821 4353.25513 3657.95623 4353.60644 3657.5157 4353.89853 3657.03386 4354.12661 3656.51863 4354.28693 3655.97846 4354.37686 3655.42223 4354.39492 3654.85906 4354.34081 3654.29821 4354.21543 3653.74888 4354.02083 3653.2201 4353.76021 3652.72054 4353.43785 3652.25841 4353.05904 3651.84129 4352.63 3651.47604 4352.15777 3651.16866 4351.65012 3650.92418 4351.11536 3650.74663 4350.5623 3650.63892 4350 3650.60282 4349.4377 3650.63892 4348.88464 3650.74663 4348.34988 3650.92418 4347.84223 3651.16866 4347.37 3651.47604 4346.94096 3651.84129 4346.56215 3652.25841 4346.23979 3652.72054 4345.97917 3653.2201 4345.78457 3653.74888 4345.65919 3654.29821 4345.60508 3654.85906 4345.62314 3655.42223 4345.71307 3655.97846 4345.87339 3656.51863 4346.10147 3657.03386 4346.39356 3657.5157 4346.74487 3657.95623 4347.14963 3658.34821 4347.60119 3658.68522 4348.09214 3658.96172 4348.61441 3659.17317 4349.15944 3659.31609 Z M 4137.6122 3720.00738 L 4138.1745 3719.97128 4138.72756 3719.86357 4139.26232 3719.68602 4139.76997 3719.44154 4140.2422 3719.13416 4140.67124 3718.76891 4141.05005 3718.35179 4141.37241 3717.88966 4141.63303 3717.3901 4141.82763 3716.86132 4141.95301 3716.31199 4142.00712 3715.75114 4141.98906 3715.18797 4141.89913 3714.63174 4141.73881 3714.09157 4141.51073 3713.57634 4141.21864 3713.0945 4140.86733 3712.65397 4140.46257 3712.26199 4140.01101 3711.92498 4139.52006 3711.64848 4138.99779 3711.43703 4138.45276 3711.29411 4137.89393 3711.22206 4137.33047 3711.22206 4136.77164 3711.29411 4136.22661 3711.43703 4135.70434 3711.64848 4135.21339 3711.92498 4134.76183 3712.26199 4134.35707 3712.65397 4134.00576 3713.0945 4133.71367 3713.57634 4133.48559 3714.09157 4133.32527 3714.63174 4133.23534 3715.18797 4133.21728 3715.75114 4133.27139 3716.31199 4133.39677 3716.86132 4133.59137 3717.3901 4133.85199 3717.88966 4134.17435 3718.35179 4134.55316 3718.76891 4134.9822 3719.13416 4135.45443 3719.44154 4135.96208 3719.68602 4136.49684 3719.86357 4137.0499 3719.97128 4137.6122 3720.00738 Z M 4138.04254 3842.83982 L 4138.60339 3842.78571 4139.15272 3842.66033 4139.6815 3842.46573 4140.18106 3842.20511 4140.64319 3841.88275 4141.06031 3841.50394 4141.42556 3841.0749 4141.73294 3840.60267 4141.97742 3840.09502 4142.15497 3839.56026 4142.26268 3839.0072 4142.29878 3838.4449 4142.26268 3837.8826 4142.15497 3837.32954 4141.97742 3836.79478 4141.73294 3836.28713 4141.42556 3835.8149 4141.06031 3835.38586 4140.64319 3835.00705 4140.18106 3834.68469 4139.6815 3834.42407 4139.15272 3834.22947 4138.60339 3834.10409 4138.04254 3834.04998 4137.47937 3834.06804 4136.92314 3834.15797 4136.38297 3834.31829 4135.86774 3834.54637 4135.3859 3834.83846 4134.94537 3835.18977 4134.55339 3835.59453 4134.21638 3836.04609 4133.93988 3836.53704 4133.72843 3837.05931 4133.58551 3837.60434 4133.51346 3838.16317 4133.51346 3838.72663 4133.58551 3839.28546 4133.72843 3839.83049 4133.93988 3840.35276 4134.21638 3840.84371 4134.55339 3841.29527 4134.94537 3841.70003 4135.3859 3842.05134 4135.86774 3842.34343 4136.38297 3842.57151 4136.92314 3842.73183 4137.47937 3842.82176 4138.04254 3842.83982 Z M 4137.54254 3742.83982 L 4138.10339 3742.78571 4138.65272 3742.66033 4139.1815 3742.46573 4139.68106 3742.20511 4140.14319 3741.88275 4140.56031 3741.50394 4140.92556 3741.0749 4141.23294 3740.60267 4141.47742 3740.09502 4141.65497 3739.56026 4141.76268 3739.0072 4141.79878 3738.4449 4141.76268 3737.8826 4141.65497 3737.32954 4141.47742 3736.79478 4141.23294 3736.28713 4140.92556 3735.8149 4140.56031 3735.38586 4140.14319 3735.00705 4139.68106 3734.68469 4139.1815 3734.42407 4138.65272 3734.22947 4138.10339 3734.10409 4137.54254 3734.04998 4136.97937 3734.06804 4136.42314 3734.15797 4135.88297 3734.31829 4135.36774 3734.54637 4134.8859 3734.83846 4134.44537 3735.18977 4134.05339 3735.59453 4133.71638 3736.04609 4133.43988 3736.53704 4133.22843 3737.05931 4133.08551 3737.60434 4133.01346 3738.16317 4133.01346 3738.72663 4133.08551 3739.28546 4133.22843 3739.83049 4133.43988 3740.35276 4133.71638 3740.84371 4134.05339 3741.29527 4134.44537 3741.70003 4134.8859 3742.05134 4135.36774 3742.34343 4135.88297 3742.57151 4136.42314 3742.73183 4136.97937 3742.82176 4137.54254 3742.83982 Z M 4166.97937 3742.82176 L 4167.54254 3742.83982 4168.10339 3742.78571 4168.65272 3742.66033 4169.1815 3742.46573 4169.68106 3742.20511 4170.14319 3741.88275 4170.56031 3741.50394 4170.92556 3741.0749 4171.23294 3740.60267 4171.47742 3740.09502 4171.65497 3739.56026 4171.76268 3739.0072 4171.79878 3738.4449 4171.76268 3737.8826 4171.65497 3737.32954 4171.47742 3736.79478 4171.23294 3736.28713 4170.92556 3735.8149 4170.56031 3735.38586 4170.14319 3735.00705 4169.68106 3734.68469 4169.1815 3734.42407 4168.65272 3734.22947 4168.10339 3734.10409 4167.54254 3734.04998 4166.97937 3734.06804 4166.42314 3734.15797 4165.88297 3734.31829 4165.36774 3734.54637 4164.8859 3734.83846 4164.44537 3735.18977 4164.05339 3735.59453 4163.71638 3736.04609 4163.43988 3736.53704 4163.22843 3737.05931 4163.08551 3737.60434 4163.01346 3738.16317 4163.01346 3738.72663 4163.08551 3739.28546 4163.22843 3739.83049 4163.43988 3740.35276 4163.71638 3740.84371 4164.05339 3741.29527 4164.44537 3741.70003 4164.8859 3742.05134 4165.36774 3742.34343 4165.88297 3742.57151 4166.42314 3742.73183 4166.97937 3742.82176 Z M 4157.54254 3742.83982 L 4158.10339 3742.78571 4158.65272 3742.66033 4159.1815 3742.46573 4159.68106 3742.20511 4160.14319 3741.88275 4160.56031 3741.50394 4160.92556 3741.0749 4161.23294 3740.60267 4161.47742 3740.09502 4161.65497 3739.56026 4161.76268 3739.0072 4161.79878 3738.4449 4161.76268 3737.8826 4161.65497 3737.32954 4161.47742 3736.79478 4161.23294 3736.28713 4160.92556 3735.8149 4160.56031 3735.38586 4160.14319 3735.00705 4159.68106 3734.68469 4159.1815 3734.42407 4158.65272 3734.22947 4158.10339 3734.10409 4157.54254 3734.04998 4156.97937 3734.06804 4156.42314 3734.15797 4155.88297 3734.31829 4155.36774 3734.54637 4154.8859 3734.83846 4154.44537 3735.18977 4154.05339 3735.59453 4153.71638 3736.04609 4153.43988 3736.53704 4153.22843 3737.05931 4153.08551 3737.60434 4153.01346 3738.16317 4153.01346 3738.72663 4153.08551 3739.28546 4153.22843 3739.83049 4153.43988 3740.35276 4153.71638 3740.84371 4154.05339 3741.29527 4154.44537 3741.70003 4154.8859 3742.05134 4155.36774 3742.34343 4155.88297 3742.57151 4156.42314 3742.73183 4156.97937 3742.82176 4157.54254 3742.83982 Z M 4168.04254 3842.83982 L 4168.60339 3842.78571 4169.15272 3842.66033 4169.6815 3842.46573 4170.18106 3842.20511 4170.64319 3841.88275 4171.06031 3841.50394 4171.42556 3841.0749 4171.73294 3840.60267 4171.97742 3840.09502 4172.15497 3839.56026 4172.26268 3839.0072 4172.29878 3838.4449 4172.26268 3837.8826 4172.15497 3837.32954 4171.97742 3836.79478 4171.73294 3836.28713 4171.42556 3835.8149 4171.06031 3835.38586 4170.64319 3835.00705 4170.18106 3834.68469 4169.6815 3834.42407 4169.15272 3834.22947 4168.60339 3834.10409 4168.04254 3834.04998 4167.47937 3834.06804 4166.92314 3834.15797 4166.38297 3834.31829 4165.86774 3834.54637 4165.3859 3834.83846 4164.94537 3835.18977 4164.55339 3835.59453 4164.21638 3836.04609 4163.93988 3836.53704 4163.72843 3837.05931 4163.58551 3837.60434 4163.51346 3838.16317 4163.51346 3838.72663 4163.58551 3839.28546 4163.72843 3839.83049 4163.93988 3840.35276 4164.21638 3840.84371 4164.55339 3841.29527 4164.94537 3841.70003 4165.3859 3842.05134 4165.86774 3842.34343 4166.38297 3842.57151 4166.92314 3842.73183 4167.47937 3842.82176 4168.04254 3842.83982 Z M 4097.6122 3720.00738 L 4098.1745 3719.97128 4098.72756 3719.86357 4099.26232 3719.68602 4099.76997 3719.44154 4100.2422 3719.13416 4100.67124 3718.76891 4101.05005 3718.35179 4101.37241 3717.88966 4101.63303 3717.3901 4101.82763 3716.86132 4101.95301 3716.31199 4102.00712 3715.75114 4101.98906 3715.18797 4101.89913 3714.63174 4101.73881 3714.09157 4101.51073 3713.57634 4101.21864 3713.0945 4100.86733 3712.65397 4100.46257 3712.26199 4100.01101 3711.92498 4099.52006 3711.64848 4098.99779 3711.43703 4098.45276 3711.29411 4097.89393 3711.22206 4097.33047 3711.22206 4096.77164 3711.29411 4096.22661 3711.43703 4095.70434 3711.64848 4095.21339 3711.92498 4094.76183 3712.26199 4094.35707 3712.65397 4094.00576 3713.0945 4093.71367 3713.57634 4093.48559 3714.09157 4093.32527 3714.63174 4093.23534 3715.18797 4093.21728 3715.75114 4093.27139 3716.31199 4093.39677 3716.86132 4093.59137 3717.3901 4093.85199 3717.88966 4094.17435 3718.35179 4094.55316 3718.76891 4094.9822 3719.13416 4095.45443 3719.44154 4095.96208 3719.68602 4096.49684 3719.86357 4097.0499 3719.97128 4097.6122 3720.00738 Z M 4057.47937 3842.82176 L 4058.04254 3842.83982 4058.60339 3842.78571 4059.15272 3842.66033 4059.6815 3842.46573 4060.18106 3842.20511 4060.64319 3841.88275 4061.06031 3841.50394 4061.42556 3841.0749 4061.73294 3840.60267 4061.97742 3840.09502 4062.15497 3839.56026 4062.26268 3839.0072 4062.29878 3838.4449 4062.26268 3837.8826 4062.15497 3837.32954 4061.97742 3836.79478 4061.73294 3836.28713 4061.42556 3835.8149 4061.06031 3835.38586 4060.64319 3835.00705 4060.18106 3834.68469 4059.6815 3834.42407 4059.15272 3834.22947 4058.60339 3834.10409 4058.04254 3834.04998 4057.47937 3834.06804 4056.92314 3834.15797 4056.38297 3834.31829 4055.86774 3834.54637 4055.3859 3834.83846 4054.94537 3835.18977 4054.55339 3835.59453 4054.21638 3836.04609 4053.93988 3836.53704 4053.72843 3837.05931 4053.58551 3837.60434 4053.51346 3838.16317 4053.51346 3838.72663 4053.58551 3839.28546 4053.72843 3839.83049 4053.93988 3840.35276 4054.21638 3840.84371 4054.55339 3841.29527 4054.94537 3841.70003 4055.3859 3842.05134 4055.86774 3842.34343 4056.38297 3842.57151 4056.92314 3842.73183 4057.47937 3842.82176 Z M 4077.54254 3742.83982 L 4078.10339 3742.78571 4078.65272 3742.66033 4079.1815 3742.46573 4079.68106 3742.20511 4080.14319 3741.88275 4080.56031 3741.50394 4080.92556 3741.0749 4081.23294 3740.60267 4081.47742 3740.09502 4081.65497 3739.56026 4081.76268 3739.0072 4081.79878 3738.4449 4081.76268 3737.8826 4081.65497 3737.32954 4081.47742 3736.79478 4081.23294 3736.28713 4080.92556 3735.8149 4080.56031 3735.38586 4080.14319 3735.00705 4079.68106 3734.68469 4079.1815 3734.42407 4078.65272 3734.22947 4078.10339 3734.10409 4077.54254 3734.04998 4076.97937 3734.06804 4076.42314 3734.15797 4075.88297 3734.31829 4075.36774 3734.54637 4074.8859 3734.83846 4074.44537 3735.18977 4074.05339 3735.59453 4073.71638 3736.04609 4073.43988 3736.53704 4073.22843 3737.05931 4073.08551 3737.60434 4073.01346 3738.16317 4073.01346 3738.72663 4073.08551 3739.28546 4073.22843 3739.83049 4073.43988 3740.35276 4073.71638 3740.84371 4074.05339 3741.29527 4074.44537 3741.70003 4074.8859 3742.05134 4075.36774 3742.34343 4075.88297 3742.57151 4076.42314 3742.73183 4076.97937 3742.82176 4077.54254 3742.83982 Z M 4057.54254 3742.83982 L 4058.10339 3742.78571 4058.65272 3742.66033 4059.1815 3742.46573 4059.68106 3742.20511 4060.14319 3741.88275 4060.56031 3741.50394 4060.92556 3741.0749 4061.23294 3740.60267 4061.47742 3740.09502 4061.65497 3739.56026 4061.76268 3739.0072 4061.79878 3738.4449 4061.76268 3737.8826 4061.65497 3737.32954 4061.47742 3736.79478 4061.23294 3736.28713 4060.92556 3735.8149 4060.56031 3735.38586 4060.14319 3735.00705 4059.68106 3734.68469 4059.1815 3734.42407 4058.65272 3734.22947 4058.10339 3734.10409 4057.54254 3734.04998 4056.97937 3734.06804 4056.42314 3734.15797 4055.88297 3734.31829 4055.36774 3734.54637 4054.8859 3734.83846 4054.44537 3735.18977 4054.05339 3735.59453 4053.71638 3736.04609 4053.43988 3736.53704 4053.22843 3737.05931 4053.08551 3737.60434 4053.01346 3738.16317 4053.01346 3738.72663 4053.08551 3739.28546 4053.22843 3739.83049 4053.43988 3740.35276 4053.71638 3740.84371 4054.05339 3741.29527 4054.44537 3741.70003 4054.8859 3742.05134 4055.36774 3742.34343 4055.88297 3742.57151 4056.42314 3742.73183 4056.97937 3742.82176 4057.54254 3742.83982 Z M 4088.04254 3842.83982 L 4088.60339 3842.78571 4089.15272 3842.66033 4089.6815 3842.46573 4090.18106 3842.20511 4090.64319 3841.88275 4091.06031 3841.50394 4091.42556 3841.0749 4091.73294 3840.60267 4091.97742 3840.09502 4092.15497 3839.56026 4092.26268 3839.0072 4092.29878 3838.4449 4092.26268 3837.8826 4092.15497 3837.32954 4091.97742 3836.79478 4091.73294 3836.28713 4091.42556 3835.8149 4091.06031 3835.38586 4090.64319 3835.00705 4090.18106 3834.68469 4089.6815 3834.42407 4089.15272 3834.22947 4088.60339 3834.10409 4088.04254 3834.04998 4087.47937 3834.06804 4086.92314 3834.15797 4086.38297 3834.31829 4085.86774 3834.54637 4085.3859 3834.83846 4084.94537 3835.18977 4084.55339 3835.59453 4084.21638 3836.04609 4083.93988 3836.53704 4083.72843 3837.05931 4083.58551 3837.60434 4083.51346 3838.16317 4083.51346 3838.72663 4083.58551 3839.28546 4083.72843 3839.83049 4083.93988 3840.35276 4084.21638 3840.84371 4084.55339 3841.29527 4084.94537 3841.70003 4085.3859 3842.05134 4085.86774 3842.34343 4086.38297 3842.57151 4086.92314 3842.73183 4087.47937 3842.82176 4088.04254 3842.83982 Z M 4067.06104 3842.76099 L 4067.61987 3842.83304 4068.18333 3842.83304 4068.74216 3842.76099 4069.28719 3842.61807 4069.80946 3842.40662 4070.30041 3842.13012 4070.75197 3841.79311 4071.15673 3841.40113 4071.50804 3840.9606 4071.80013 3840.47876 4072.02821 3839.96353 4072.18853 3839.42336 4072.27846 3838.86713 4072.29652 3838.30396 4072.24241 3837.74311 4072.11703 3837.19378 4071.92243 3836.665 4071.66181 3836.16544 4071.33945 3835.70331 4070.96064 3835.28619 4070.5316 3834.92094 4070.05937 3834.61356 4069.55172 3834.36908 4069.01696 3834.19153 4068.4639 3834.08382 4067.9016 3834.04772 4067.3393 3834.08382 4066.78624 3834.19153 4066.25148 3834.36908 4065.74383 3834.61356 4065.2716 3834.92094 4064.84256 3835.28619 4064.46375 3835.70331 4064.14139 3836.16544 4063.88077 3836.665 4063.68617 3837.19378 4063.56079 3837.74311 4063.50668 3838.30396 4063.52474 3838.86713 4063.61467 3839.42336 4063.77499 3839.96353 4064.00307 3840.47876 4064.29516 3840.9606 4064.64647 3841.40113 4065.05123 3841.79311 4065.50279 3842.13012 4065.99374 3842.40662 4066.51601 3842.61807 4067.06104 3842.76099 Z M 4097.47937 3842.82176 L 4098.04254 3842.83982 4098.60339 3842.78571 4099.15272 3842.66033 4099.6815 3842.46573 4100.18106 3842.20511 4100.64319 3841.88275 4101.06031 3841.50394 4101.42556 3841.0749 4101.73294 3840.60267 4101.97742 3840.09502 4102.15497 3839.56026 4102.26268 3839.0072 4102.29878 3838.4449 4102.26268 3837.8826 4102.15497 3837.32954 4101.97742 3836.79478 4101.73294 3836.28713 4101.42556 3835.8149 4101.06031 3835.38586 4100.64319 3835.00705 4100.18106 3834.68469 4099.6815 3834.42407 4099.15272 3834.22947 4098.60339 3834.10409 4098.04254 3834.04998 4097.47937 3834.06804 4096.92314 3834.15797 4096.38297 3834.31829 4095.86774 3834.54637 4095.3859 3834.83846 4094.94537 3835.18977 4094.55339 3835.59453 4094.21638 3836.04609 4093.93988 3836.53704 4093.72843 3837.05931 4093.58551 3837.60434 4093.51346 3838.16317 4093.51346 3838.72663 4093.58551 3839.28546 4093.72843 3839.83049 4093.93988 3840.35276 4094.21638 3840.84371 4094.55339 3841.29527 4094.94537 3841.70003 4095.3859 3842.05134 4095.86774 3842.34343 4096.38297 3842.57151 4096.92314 3842.73183 4097.47937 3842.82176 Z M 4066.97937 3742.82176 L 4067.54254 3742.83982 4068.10339 3742.78571 4068.65272 3742.66033 4069.1815 3742.46573 4069.68106 3742.20511 4070.14319 3741.88275 4070.56031 3741.50394 4070.92556 3741.0749 4071.23294 3740.60267 4071.47742 3740.09502 4071.65497 3739.56026 4071.76268 3739.0072 4071.79878 3738.4449 4071.76268 3737.8826 4071.65497 3737.32954 4071.47742 3736.79478 4071.23294 3736.28713 4070.92556 3735.8149 4070.56031 3735.38586 4070.14319 3735.00705 4069.68106 3734.68469 4069.1815 3734.42407 4068.65272 3734.22947 4068.10339 3734.10409 4067.54254 3734.04998 4066.97937 3734.06804 4066.42314 3734.15797 4065.88297 3734.31829 4065.36774 3734.54637 4064.8859 3734.83846 4064.44537 3735.18977 4064.05339 3735.59453 4063.71638 3736.04609 4063.43988 3736.53704 4063.22843 3737.05931 4063.08551 3737.60434 4063.01346 3738.16317 4063.01346 3738.72663 4063.08551 3739.28546 4063.22843 3739.83049 4063.43988 3740.35276 4063.71638 3740.84371 4064.05339 3741.29527 4064.44537 3741.70003 4064.8859 3742.05134 4065.36774 3742.34343 4065.88297 3742.57151 4066.42314 3742.73183 4066.97937 3742.82176 Z M 4078.04254 3842.83982 L 4078.60339 3842.78571 4079.15272 3842.66033 4079.6815 3842.46573 4080.18106 3842.20511 4080.64319 3841.88275 4081.06031 3841.50394 4081.42556 3841.0749 4081.73294 3840.60267 4081.97742 3840.09502 4082.15497 3839.56026 4082.26268 3839.0072 4082.29878 3838.4449 4082.26268 3837.8826 4082.15497 3837.32954 4081.97742 3836.79478 4081.73294 3836.28713 4081.42556 3835.8149 4081.06031 3835.38586 4080.64319 3835.00705 4080.18106 3834.68469 4079.6815 3834.42407 4079.15272 3834.22947 4078.60339 3834.10409 4078.04254 3834.04998 4077.47937 3834.06804 4076.92314 3834.15797 4076.38297 3834.31829 4075.86774 3834.54637 4075.3859 3834.83846 4074.94537 3835.18977 4074.55339 3835.59453 4074.21638 3836.04609 4073.93988 3836.53704 4073.72843 3837.05931 4073.58551 3837.60434 4073.51346 3838.16317 4073.51346 3838.72663 4073.58551 3839.28546 4073.72843 3839.83049 4073.93988 3840.35276 4074.21638 3840.84371 4074.55339 3841.29527 4074.94537 3841.70003 4075.3859 3842.05134 4075.86774 3842.34343 4076.38297 3842.57151 4076.92314 3842.73183 4077.47937 3842.82176 4078.04254 3842.83982 Z M 4389.3156 3645.54848 L 4389.82361 3645.61831 4390.33639 3645.61831 4390.8444 3645.54848 4391.33816 3645.41014 4391.80849 3645.20584 4392.24663 3644.93941 4392.6444 3644.6158 4392.9944 3644.24104 4393.29011 3643.82211 4393.52602 3643.36682 4393.69774 3642.88364 4393.80207 3642.38159 4393.83707 3641.87 4393.80207 3641.35841 4393.69774 3640.85636 4393.52602 3640.37318 4393.29011 3639.91789 4392.9944 3639.49896 4392.6444 3639.1242 4392.24663 3638.80059 4391.80849 3638.53416 4391.33816 3638.32986 4390.8444 3638.19152 4390.33639 3638.12169 4389.82361 3638.12169 4389.3156 3638.19152 4388.82184 3638.32986 4388.35151 3638.53416 4387.91337 3638.80059 4387.5156 3639.1242 4387.1656 3639.49896 4386.86989 3639.91789 4386.63398 3640.37318 4386.46226 3640.85636 4386.35793 3641.35841 4386.32293 3641.87 4386.35793 3642.38159 4386.46226 3642.88364 4386.63398 3643.36682 4386.86989 3643.82211 4387.1656 3644.24104 4387.5156 3644.6158 4387.91337 3644.93941 4388.35151 3645.20584 4388.82184 3645.41014 4389.3156 3645.54848 Z M 4043.87639 3645.61831 L 4044.3844 3645.54848 4044.87816 3645.41014 4045.34849 3645.20584 4045.78663 3644.93941 4046.1844 3644.6158 4046.5344 3644.24104 4046.83011 3643.82211 4047.06602 3643.36682 4047.23774 3642.88364 4047.34207 3642.38159 4047.37707 3641.87 4047.34207 3641.35841 4047.23774 3640.85636 4047.06602 3640.37318 4046.83011 3639.91789 4046.5344 3639.49896 4046.1844 3639.1242 4045.78663 3638.80059 4045.34849 3638.53416 4044.87816 3638.32986 4044.3844 3638.19152 4043.87639 3638.12169 4043.36361 3638.12169 4042.8556 3638.19152 4042.36184 3638.32986 4041.89151 3638.53416 4041.45337 3638.80059 4041.0556 3639.1242 4040.7056 3639.49896 4040.40989 3639.91789 4040.17398 3640.37318 4040.00226 3640.85636 4039.89793 3641.35841 4039.86293 3641.87 4039.89793 3642.38159 4040.00226 3642.88364 4040.17398 3643.36682 4040.40989 3643.82211 4040.7056 3644.24104 4041.0556 3644.6158 4041.45337 3644.93941 4041.89151 3645.20584 4042.36184 3645.41014 4042.8556 3645.54848 4043.36361 3645.61831 4043.87639 3645.61831 Z M 4052.8556 3645.54848 L 4053.36361 3645.61831 4053.87639 3645.61831 4054.3844 3645.54848 4054.87816 3645.41014 4055.34849 3645.20584 4055.78663 3644.93941 4056.1844 3644.6158 4056.5344 3644.24104 4056.83011 3643.82211 4057.06602 3643.36682 4057.23774 3642.88364 4057.34207 3642.38159 4057.37707 3641.87 4057.34207 3641.35841 4057.23774 3640.85636 4057.06602 3640.37318 4056.83011 3639.91789 4056.5344 3639.49896 4056.1844 3639.1242 4055.78663 3638.80059 4055.34849 3638.53416 4054.87816 3638.32986 4054.3844 3638.19152 4053.87639 3638.12169 4053.36361 3638.12169 4052.8556 3638.19152 4052.36184 3638.32986 4051.89151 3638.53416 4051.45337 3638.80059 4051.0556 3639.1242 4050.7056 3639.49896 4050.40989 3639.91789 4050.17398 3640.37318 4050.00226 3640.85636 4049.89793 3641.35841 4049.86293 3641.87 4049.89793 3642.38159 4050.00226 3642.88364 4050.17398 3643.36682 4050.40989 3643.82211 4050.7056 3644.24104 4051.0556 3644.6158 4051.45337 3644.93941 4051.89151 3645.20584 4052.36184 3645.41014 4052.8556 3645.54848 Z M 4401.88635 3761.2993 L 4402.17836 3761.27054 4402.44025 3761.1911 4402.68161 3761.06209 4402.89317 3760.88847 4403.06679 3760.67691 4403.1958 3760.43555 4403.27524 3760.17366 4403.304 3759.88165 4403.304 3755.7223 4401.17125 3755.7223 4401.17125 3761.2993 4401.88635 3761.2993 Z M 4398.70275 3746.3643 L 4398.70275 3740.7873 4397.98865 3740.7873 4397.69664 3740.81606 4397.43475 3740.8955 4397.19339 3741.02451 4396.98183 3741.19813 4396.80821 3741.40969 4396.6792 3741.65105 4396.59976 3741.91294 4396.571 3742.20495 4396.571 3746.3643 4398.70275 3746.3643 Z M 4398.70275 3761.2993 L 4398.70275 3755.7223 4396.571 3755.7223 4396.571 3759.88165 4396.59976 3760.17366 4396.6792 3760.43555 4396.80821 3760.67691 4396.98183 3760.88847 4397.19339 3761.06209 4397.43475 3761.1911 4397.69664 3761.27054 4397.98865 3761.2993 4398.70275 3761.2993 Z M 4393.33035 3606.87005 L 4393.33035 3608.1752 4395.36418 3608.1752 4395.36418 3605.4524 4394.748 3605.4524 4394.45599 3605.48116 4394.1941 3605.5606 4393.95274 3605.68961 4393.74118 3605.86323 4393.56756 3606.07479 4393.43855 3606.31615 4393.35911 3606.57804 4393.33035 3606.87005 Z M 4125.54808 3638.6752 L 4125.50408 3638.56406 4125.229 3638.0637 4124.89338 3637.60175 4124.50251 3637.18552 4124.06255 3636.82155 4123.58044 3636.5156 4123.2148 3636.34354 4123.2148 3638.6752 4125.54808 3638.6752 Z M 4119.19956 3644.4844 L 4119.5652 3644.65646 4119.5652 3642.3248 4117.23192 3642.3248 4117.27592 3642.43594 4117.551 3642.9363 4117.88662 3643.39825 4118.27749 3643.81448 4118.71745 3644.17845 4119.19956 3644.4844 Z M 4119.5652 3638.6752 L 4119.5652 3636.34354 4119.19956 3636.5156 4118.71745 3636.82155 4118.27749 3637.18552 4117.88662 3637.60175 4117.551 3638.0637 4117.27592 3638.56406 4117.23192 3638.6752 4119.5652 3638.6752 Z M 4278.25 3713.25 L 4278.25 3710.97229 4277.84223 3711.16866 4277.37 3711.47604 4276.94096 3711.84129 4276.56215 3712.25841 4276.23979 3712.72054 4275.97917 3713.2201 4275.96816 3713.25 4278.25 3713.25 Z M 4288.25 3713.25 L 4288.25 3710.97229 4287.84223 3711.16866 4287.37 3711.47604 4286.94096 3711.84129 4286.56215 3712.25841 4286.23979 3712.72054 4285.97917 3713.2201 4285.96816 3713.25 4288.25 3713.25 Z M 4159.6516 3840.1949 L 4159.6516 3842.47654 4159.68207 3842.46544 4160.18106 3842.20511 4160.64319 3841.88275 4161.06031 3841.50394 4161.42556 3841.0749 4161.73294 3840.60267 4161.92931 3840.1949 4159.6516 3840.1949 Z M 4121.42931 3736.6949 L 4121.23294 3736.28713 4120.92556 3735.8149 4120.56031 3735.38586 4120.14319 3735.00705 4119.68106 3734.68469 4119.18207 3734.42436 4119.1516 3734.41326 4119.1516 3736.6949 4121.42931 3736.6949 Z M 4159.6516 3834.41326 L 4159.6516 3836.6949 4161.92931 3836.6949 4161.73294 3836.28713 4161.42556 3835.8149 4161.06031 3835.38586 4160.64319 3835.00705 4160.18106 3834.68469 4159.68207 3834.42436 4159.6516 3834.41326 Z M 4119.1516 3742.47654 L 4119.18207 3742.46544 4119.68106 3742.20511 4120.14319 3741.88275 4120.56031 3741.50394 4120.92556 3741.0749 4121.23294 3740.60267 4121.42931 3740.1949 4119.1516 3740.1949 4119.1516 3742.47654 Z M 4099.1516 3740.1949 L 4099.1516 3742.47654 4099.18207 3742.46544 4099.68106 3742.20511 4100.14319 3741.88275 4100.56031 3741.50394 4100.92556 3741.0749 4101.23294 3740.60267 4101.42931 3740.1949 4099.1516 3740.1949 Z M 4268.25 3713.25 L 4268.25 3710.97229 4267.84223 3711.16866 4267.37 3711.47604 4266.94096 3711.84129 4266.56215 3712.25841 4266.23979 3712.72054 4265.97946 3713.21953 4265.96836 3713.25 4268.25 3713.25 Z M 4155.3622 3719.63791 L 4155.3622 3717.3602 4153.08056 3717.3602 4153.09166 3717.39067 4153.35199 3717.88966 4153.67435 3718.35179 4154.05316 3718.76891 4154.4822 3719.13416 4154.95443 3719.44154 4155.3622 3719.63791 Z M 4294.03164 3713.25 L 4294.02054 3713.21953 4293.76021 3712.72054 4293.43785 3712.25841 4293.05904 3711.84129 4292.63 3711.47604 4292.15777 3711.16866 4291.75 3710.97229 4291.75 3713.25 4294.03164 3713.25 Z M 4271.75 3710.97229 L 4271.75 3713.25 4274.03164 3713.25 4274.02054 3713.21953 4273.76021 3712.72054 4273.43785 3712.25841 4273.05904 3711.84129 4272.63 3711.47604 4272.15777 3711.16866 4271.75 3710.97229 Z M 4284.03164 3713.25 L 4284.02054 3713.21953 4283.76021 3712.72054 4283.43785 3712.25841 4283.05904 3711.84129 4282.63 3711.47604 4282.15777 3711.16866 4281.75 3710.97229 4281.75 3713.25 4284.03164 3713.25 Z M 4228.75 3717.25 L 4228.75 3719.52419 4229.03386 3719.39853 4229.5157 3719.10644 4229.95623 3718.75513 4230.34821 3718.35037 4230.68522 3717.89881 4230.96172 3717.40786 4231.02563 3717.25 4228.75 3717.25 Z M 4153.93988 3836.53704 L 4153.87597 3836.6949 4156.1516 3836.6949 4156.1516 3834.42071 4155.86774 3834.54637 4155.3859 3834.83846 4154.94537 3835.18977 4154.55339 3835.59453 4154.21638 3836.04609 4153.93988 3836.53704 Z M 4115.6516 3736.6949 L 4115.6516 3734.42071 4115.36774 3734.54637 4114.8859 3734.83846 4114.44537 3735.18977 4114.05339 3735.59453 4113.71638 3736.04609 4113.43988 3736.53704 4113.37597 3736.6949 4115.6516 3736.6949 Z M 4028.52563 3786.6945 L 4028.46172 3786.53664 4028.18522 3786.04569 4027.84821 3785.59413 4027.45623 3785.18937 4027.0157 3784.83806 4026.53386 3784.54597 4026.25 3784.42031 4026.25 3786.6945 4028.52563 3786.6945 Z M 4115.6516 3742.46909 L 4115.6516 3740.1949 4113.37597 3740.1949 4113.43988 3740.35276 4113.71638 3740.84371 4114.05339 3741.29527 4114.44537 3741.70003 4114.8859 3742.05134 4115.36774 3742.34343 4115.6516 3742.46909 Z M 4268.25 3649.02563 L 4268.25 3646.75 4265.97581 3646.75 4266.10147 3647.03386 4266.39356 3647.5157 4266.74487 3647.95623 4267.14963 3648.34821 4267.60119 3648.68522 4268.09214 3648.96172 4268.25 3649.02563 Z M 4155.3622 3713.8602 L 4155.3622 3711.58457 4155.20434 3711.64848 4154.71339 3711.92498 4154.26183 3712.26199 4153.85707 3712.65397 4153.50576 3713.0945 4153.21367 3713.57634 4153.08801 3713.8602 4155.3622 3713.8602 Z M 4231.02563 3713.75 L 4230.96172 3713.59214 4230.68522 3713.10119 4230.34821 3712.64963 4229.95623 3712.24487 4229.5157 3711.89356 4229.03386 3711.60147 4228.75 3711.47581 4228.75 3713.75 4231.02563 3713.75 Z M 4161.13639 3713.8602 L 4161.01073 3713.57634 4160.71864 3713.0945 4160.36733 3712.65397 4159.96257 3712.26199 4159.51101 3711.92498 4159.02006 3711.64848 4158.8622 3711.58457 4158.8622 3713.8602 4161.13639 3713.8602 Z M 4271.75 3646.75 L 4271.75 3649.02563 4271.90786 3648.96172 4272.39881 3648.68522 4272.85037 3648.34821 4273.25513 3647.95623 4273.60644 3647.5157 4273.89853 3647.03386 4274.02419 3646.75 4271.75 3646.75 Z M 4278.25 3719.02563 L 4278.25 3716.75 4275.97581 3716.75 4276.10147 3717.03386 4276.39356 3717.5157 4276.74487 3717.95623 4277.14963 3718.34821 4277.60119 3718.68522 4278.09214 3718.96172 4278.25 3719.02563 Z M 4156.1516 3842.46909 L 4156.1516 3840.1949 4153.87597 3840.1949 4153.93988 3840.35276 4154.21638 3840.84371 4154.55339 3841.29527 4154.94537 3841.70003 4155.3859 3842.05134 4155.86774 3842.34343 4156.1516 3842.46909 Z M 4291.75 3719.02563 L 4291.90786 3718.96172 4292.39881 3718.68522 4292.85037 3718.34821 4293.25513 3717.95623 4293.60644 3717.5157 4293.89853 3717.03386 4294.02419 3716.75 4291.75 3716.75 4291.75 3719.02563 Z M 4026.25 3792.46869 L 4026.53386 3792.34303 4027.0157 3792.05094 4027.45623 3791.69963 4027.84821 3791.29487 4028.18522 3790.84331 4028.46172 3790.35236 4028.52563 3790.1945 4026.25 3790.1945 4026.25 3792.46869 Z M 4271.75 3719.02563 L 4271.90786 3718.96172 4272.39881 3718.68522 4272.85037 3718.34821 4273.25513 3717.95623 4273.60644 3717.5157 4273.89853 3717.03386 4274.02419 3716.75 4271.75 3716.75 4271.75 3719.02563 Z M 4348.25 3719.02563 L 4348.25 3716.75 4345.97581 3716.75 4346.10147 3717.03386 4346.39356 3717.5157 4346.74487 3717.95623 4347.14963 3718.34821 4347.60119 3718.68522 4348.09214 3718.96172 4348.25 3719.02563 Z M 4281.75 3716.75 L 4281.75 3719.02563 4281.90786 3718.96172 4282.39881 3718.68522 4282.85037 3718.34821 4283.25513 3717.95623 4283.60644 3717.5157 4283.89853 3717.03386 4284.02419 3716.75 4281.75 3716.75 Z M 4351.75 3719.02563 L 4351.90786 3718.96172 4352.39881 3718.68522 4352.85037 3718.34821 4353.25513 3717.95623 4353.60644 3717.5157 4353.89853 3717.03386 4354.02419 3716.75 4351.75 3716.75 4351.75 3719.02563 Z M 4288.09214 3718.96172 L 4288.25 3719.02563 4288.25 3716.75 4285.97581 3716.75 4286.10147 3717.03386 4286.39356 3717.5157 4286.74487 3717.95623 4287.14963 3718.34821 4287.60119 3718.68522 4288.09214 3718.96172 Z M 4268.25 3719.02563 L 4268.25 3716.75 4265.97581 3716.75 4266.10147 3717.03386 4266.39356 3717.5157 4266.74487 3717.95623 4267.14963 3718.34821 4267.60119 3718.68522 4268.09214 3718.96172 4268.25 3719.02563 Z M 4095.36774 3742.34343 L 4095.6516 3742.46909 4095.6516 3740.1949 4093.37597 3740.1949 4093.43988 3740.35276 4093.71638 3740.84371 4094.05339 3741.29527 4094.44537 3741.70003 4094.8859 3742.05134 4095.36774 3742.34343 Z M 4095.6516 3736.6949 L 4095.6516 3734.42071 4095.36774 3734.54637 4094.8859 3734.83846 4094.44537 3735.18977 4094.05339 3735.59453 4093.71638 3736.04609 4093.43988 3736.53704 4093.37597 3736.6949 4095.6516 3736.6949 Z M 4103.64491 3619.0689 L 4103.62124 3619.0023 4103.38519 3618.54675 4103.0893 3618.12757 4102.7391 3617.75259 4102.34109 3617.42879 4101.90271 3617.1622 4101.6043 3617.03259 4101.6043 3619.0689 4103.64491 3619.0689 Z M 4305.6043 3603.03259 L 4305.6043 3605.0689 4307.64491 3605.0689 4307.62124 3605.0023 4307.38519 3604.54675 4307.0893 3604.12757 4306.7391 3603.75259 4306.34109 3603.42879 4305.90271 3603.1622 4305.6043 3603.03259 Z M 4302.7421 3609.96741 L 4302.7421 3607.9311 4300.70149 3607.9311 4300.72516 3607.9977 4300.96121 3608.45325 4301.2571 3608.87243 4301.6073 3609.24741 4302.00531 3609.57121 4302.44369 3609.8378 4302.7421 3609.96741 Z M 4305.6043 3609.96741 L 4305.90271 3609.8378 4306.34109 3609.57121 4306.7391 3609.24741 4307.0893 3608.87243 4307.38519 3608.45325 4307.62124 3607.9977 4307.64491 3607.9311 4305.6043 3607.9311 4305.6043 3609.96741 Z M 4098.7421 3619.0689 L 4098.7421 3617.03259 4098.44369 3617.1622 4098.00531 3617.42879 4097.6073 3617.75259 4097.2571 3618.12757 4096.96121 3618.54675 4096.72516 3619.0023 4096.70149 3619.0689 4098.7421 3619.0689 Z M 4302.7421 3605.0689 L 4302.7421 3603.03259 4302.44369 3603.1622 4302.00531 3603.42879 4301.6073 3603.75259 4301.2571 3604.12757 4300.96121 3604.54675 4300.72516 3605.0023 4300.70149 3605.0689 4302.7421 3605.0689 Z M 4398.65 3630.44 L 4398.65 3628.4045 4398.35151 3628.53416 4397.91337 3628.80059 4397.5156 3629.1242 4397.1656 3629.49896 4396.86989 3629.91789 4396.63398 3630.37318 4396.61023 3630.44 4398.65 3630.44 Z M 4398.65 3635.3355 L 4398.65 3633.3 4396.61023 3633.3 4396.63398 3633.36682 4396.86989 3633.82211 4397.1656 3634.24104 4397.5156 3634.6158 4397.91337 3634.93941 4398.35151 3635.20584 4398.65 3635.3355 Z M 4052.19 3635.3355 L 4052.19 3633.3 4050.15023 3633.3 4050.17398 3633.36682 4050.40989 3633.82211 4050.7056 3634.24104 4051.0556 3634.6158 4051.45337 3634.93941 4051.89151 3635.20584 4052.19 3635.3355 Z M 4055.05 3633.3 L 4055.05 3635.3355 4055.34849 3635.20584 4055.78663 3634.93941 4056.1844 3634.6158 4056.5344 3634.24104 4056.83011 3633.82211 4057.06602 3633.36682 4057.08977 3633.3 4055.05 3633.3 Z M 4061.4326 3693.78653 L 4061.4326 3692.0445 4059.69438 3692.0445 4059.75838 3692.2227 4059.97572 3692.62238 4060.25153 3692.9842 4060.57933 3693.29967 4060.95145 3693.56142 4061.35916 3693.76329 4061.4326 3693.78653 Z M 4063.5074 3692.0445 L 4063.5074 3693.78653 4063.58084 3693.76329 4063.98855 3693.56142 4064.36067 3693.29967 4064.68847 3692.9842 4064.96428 3692.62238 4065.18162 3692.2227 4065.24562 3692.0445 4063.5074 3692.0445 Z \"]]~0~gge3621~1~1~1~1~yes~0","SOLIDREGION~2~~M 4075.118 3668.366 L 4157.795 3668.366 L 4157.795 3709.7045 L 4075.118 3709.7045 Z ~cutout~gge30632~~~~0","TRACK~3.937~2~BAT~4245.91 3715.5 4269.91 3739.5 4378.5 3739 4389.61 3748.59~gge28707~0","TRACK~2.3622~2~U1_14~4181.9 3676.24 4181.9 3775.6 4128 3829.5 4127.9 3838.45~gge30677~0","TRACK~2.3622~2~U1_14~4201.1 3641.17 4201.1 3657.04 4181.9 3676.24~gge28755~0","TEXT~L~4409.5~3807.5~0.8~0~1~4~~8~Airsoft Tracker Board 1.32~M4406.5909 3799.4273L4409.5 3807.0636M4406.5909 3799.4273L4403.6818 3807.0636M4408.4091 3804.5182L4404.7727 3804.5182M4401.2818 3799.4273L4400.9182 3799.7909 4400.5545 3799.4273 4400.9182 3799.0636 4401.2818 3799.4273M4400.9182 3801.9727L4400.9182 3807.0636M4398.1545 3801.9727L4398.1545 3807.0636M4398.1545 3804.1545L4397.7909 3803.0636 4397.0636 3802.3364 4396.3364 3801.9727 4395.2455 3801.9727M4388.8455 3803.0636L4389.2091 3802.3364 4390.3 3801.9727 4391.3909 3801.9727 4392.4818 3802.3364 4392.8455 3803.0636 4392.4818 3803.7909 4391.7545 3804.1545 4389.9364 3804.5182 4389.2091 3804.8818 4388.8455 3805.6091 4388.8455 3805.9727 4389.2091 3806.7 4390.3 3807.0636 4391.3909 3807.0636 4392.4818 3806.7 4392.8455 3805.9727M4384.6273 3801.9727L4385.3545 3802.3364 4386.0818 3803.0636 4386.4455 3804.1545 4386.4455 3804.8818 4386.0818 3805.9727 4385.3545 3806.7 4384.6273 3807.0636 4383.5364 3807.0636 4382.8091 3806.7 4382.0818 3805.9727 4381.7182 3804.8818 4381.7182 3804.1545 4382.0818 3803.0636 4382.8091 3802.3364 4383.5364 3801.9727 4384.6273 3801.9727M4376.4091 3799.4273L4377.1364 3799.4273 4377.8636 3799.7909 4378.2273 3800.8818 4378.2273 3807.0636M4379.3182 3801.9727L4376.7727 3801.9727M4372.9182 3799.4273L4372.9182 3805.6091 4372.5545 3806.7 4371.8273 3807.0636 4371.1 3807.0636M4374.0091 3801.9727L4371.4636 3801.9727M4360.5545 3799.4273L4360.5545 3807.0636M4363.1 3799.4273L4358.0091 3799.4273M4355.6091 3801.9727L4355.6091 3807.0636M4355.6091 3804.1545L4355.2455 3803.0636 4354.5182 3802.3364 4353.7909 3801.9727 4352.7 3801.9727M4345.9364 3801.9727L4345.9364 3807.0636M4345.9364 3803.0636L4346.6636 3802.3364 4347.3909 3801.9727 4348.4818 3801.9727 4349.2091 3802.3364 4349.9364 3803.0636 4350.3 3804.1545 4350.3 3804.8818 4349.9364 3805.9727 4349.2091 3806.7 4348.4818 3807.0636 4347.3909 3807.0636 4346.6636 3806.7 4345.9364 3805.9727M4339.1727 3803.0636L4339.9 3802.3364 4340.6273 3801.9727 4341.7182 3801.9727 4342.4455 3802.3364 4343.1727 3803.0636 4343.5364 3804.1545 4343.5364 3804.8818 4343.1727 3805.9727 4342.4455 3806.7 4341.7182 3807.0636 4340.6273 3807.0636 4339.9 3806.7 4339.1727 3805.9727M4336.7727 3799.4273L4336.7727 3807.0636M4333.1364 3801.9727L4336.7727 3805.6091M4335.3182 3804.1545L4332.7727 3807.0636M4330.3727 3804.1545L4326.0091 3804.1545 4326.0091 3803.4273 4326.3727 3802.7 4326.7364 3802.3364 4327.4636 3801.9727 4328.5545 3801.9727 4329.2818 3802.3364 4330.0091 3803.0636 4330.3727 3804.1545 4330.3727 3804.8818 4330.0091 3805.9727 4329.2818 3806.7 4328.5545 3807.0636 4327.4636 3807.0636 4326.7364 3806.7 4326.0091 3805.9727M4323.6091 3801.9727L4323.6091 3807.0636M4323.6091 3804.1545L4323.2455 3803.0636 4322.5182 3802.3364 4321.7909 3801.9727 4320.7 3801.9727M4312.7 3799.4273L4312.7 3807.0636M4312.7 3799.4273L4309.4273 3799.4273 4308.3364 3799.7909 4307.9727 3800.1545 4307.6091 3800.8818 4307.6091 3801.6091 4307.9727 3802.3364 4308.3364 3802.7 4309.4273 3803.0636M4312.7 3803.0636L4309.4273 3803.0636 4308.3364 3803.4273 4307.9727 3803.7909 4307.6091 3804.5182 4307.6091 3805.6091 4307.9727 3806.3364 4308.3364 3806.7 4309.4273 3807.0636 4312.7 3807.0636M4303.3909 3801.9727L4304.1182 3802.3364 4304.8455 3803.0636 4305.2091 3804.1545 4305.2091 3804.8818 4304.8455 3805.9727 4304.1182 3806.7 4303.3909 3807.0636 4302.3 3807.0636 4301.5727 3806.7 4300.8455 3805.9727 4300.4818 3804.8818 4300.4818 3804.1545 4300.8455 3803.0636 4301.5727 3802.3364 4302.3 3801.9727 4303.3909 3801.9727M4293.7182 3801.9727L4293.7182 3807.0636M4293.7182 3803.0636L4294.4455 3802.3364 4295.1727 3801.9727 4296.2636 3801.9727 4296.9909 3802.3364 4297.7182 3803.0636 4298.0818 3804.1545 4298.0818 3804.8818 4297.7182 3805.9727 4296.9909 3806.7 4296.2636 3807.0636 4295.1727 3807.0636 4294.4455 3806.7 4293.7182 3805.9727M4291.3182 3801.9727L4291.3182 3807.0636M4291.3182 3804.1545L4290.9545 3803.0636 4290.2273 3802.3364 4289.5 3801.9727 4288.4091 3801.9727M4281.6455 3799.4273L4281.6455 3807.0636M4281.6455 3803.0636L4282.3727 3802.3364 4283.1 3801.9727 4284.1909 3801.9727 4284.9182 3802.3364 4285.6455 3803.0636 4286.0091 3804.1545 4286.0091 3804.8818 4285.6455 3805.9727 4284.9182 3806.7 4284.1909 3807.0636 4283.1 3807.0636 4282.3727 3806.7 4281.6455 3805.9727M4273.6455 3800.8818L4272.9182 3800.5182 4271.8273 3799.4273 4271.8273 3807.0636M4269.0636 3805.2455L4269.4273 3805.6091 4269.0636 3805.9727 4268.7 3805.6091 4269.0636 3805.2455M4265.5727 3799.4273L4261.5727 3799.4273 4263.7545 3802.3364 4262.6636 3802.3364 4261.9364 3802.7 4261.5727 3803.0636 4261.2091 3804.1545 4261.2091 3804.8818 4261.5727 3805.9727 4262.3 3806.7 4263.3909 3807.0636 4264.4818 3807.0636 4265.5727 3806.7 4265.9364 3806.3364 4266.3 3805.6091M4258.4455 3801.2455L4258.4455 3800.8818 4258.0818 3800.1545 4257.7182 3799.7909 4256.9909 3799.4273 4255.5364 3799.4273 4254.8091 3799.7909 4254.4455 3800.1545 4254.0818 3800.8818 4254.0818 3801.6091 4254.4455 3802.3364 4255.1727 3803.4273 4258.8091 3807.0636 4253.7182 3807.0636~~gge19953~~0~pinpart","TEXT~L~4409.5~3821.5~0.8~0~1~4~~8~Copyright (c) 2022 DDV~M4404.0455 3815.2455L4404.4091 3814.5182 4405.1364 3813.7909 4405.8636 3813.4273 4407.3182 3813.4273 4408.0455 3813.7909 4408.7727 3814.5182 4409.1364 3815.2455 4409.5 3816.3364 4409.5 3818.1545 4409.1364 3819.2455 4408.7727 3819.9727 4408.0455 3820.7 4407.3182 3821.0636 4405.8636 3821.0636 4405.1364 3820.7 4404.4091 3819.9727 4404.0455 3819.2455M4399.8273 3815.9727L4400.5545 3816.3364 4401.2818 3817.0636 4401.6455 3818.1545 4401.6455 3818.8818 4401.2818 3819.9727 4400.5545 3820.7 4399.8273 3821.0636 4398.7364 3821.0636 4398.0091 3820.7 4397.2818 3819.9727 4396.9182 3818.8818 4396.9182 3818.1545 4397.2818 3817.0636 4398.0091 3816.3364 4398.7364 3815.9727 4399.8273 3815.9727M4394.5182 3815.9727L4394.5182 3823.6091M4394.5182 3817.0636L4393.7909 3816.3364 4393.0636 3815.9727 4391.9727 3815.9727 4391.2455 3816.3364 4390.5182 3817.0636 4390.1545 3818.1545 4390.1545 3818.8818 4390.5182 3819.9727 4391.2455 3820.7 4391.9727 3821.0636 4393.0636 3821.0636 4393.7909 3820.7 4394.5182 3819.9727M4387.3909 3815.9727L4385.2091 3821.0636M4383.0273 3815.9727L4385.2091 3821.0636 4385.9364 3822.5182 4386.6636 3823.2455 4387.3909 3823.6091 4387.7545 3823.6091M4380.6273 3815.9727L4380.6273 3821.0636M4380.6273 3818.1545L4380.2636 3817.0636 4379.5364 3816.3364 4378.8091 3815.9727 4377.7182 3815.9727M4375.3182 3813.4273L4374.9545 3813.7909 4374.5909 3813.4273 4374.9545 3813.0636 4375.3182 3813.4273M4374.9545 3815.9727L4374.9545 3821.0636M4367.8273 3815.9727L4367.8273 3821.7909 4368.1909 3822.8818 4368.5545 3823.2455 4369.2818 3823.6091 4370.3727 3823.6091 4371.1 3823.2455M4367.8273 3817.0636L4368.5545 3816.3364 4369.2818 3815.9727 4370.3727 3815.9727 4371.1 3816.3364 4371.8273 3817.0636 4372.1909 3818.1545 4372.1909 3818.8818 4371.8273 3819.9727 4371.1 3820.7 4370.3727 3821.0636 4369.2818 3821.0636 4368.5545 3820.7 4367.8273 3819.9727M4365.4273 3813.4273L4365.4273 3821.0636M4365.4273 3817.4273L4364.3364 3816.3364 4363.6091 3815.9727 4362.5182 3815.9727 4361.7909 3816.3364 4361.4273 3817.4273 4361.4273 3821.0636M4357.9364 3813.4273L4357.9364 3819.6091 4357.5727 3820.7 4356.8455 3821.0636 4356.1182 3821.0636M4359.0273 3815.9727L4356.4818 3815.9727M4345.5727 3811.9727L4346.3 3812.7 4347.0273 3813.7909 4347.7545 3815.2455 4348.1182 3817.0636 4348.1182 3818.5182 4347.7545 3820.3364 4347.0273 3821.7909 4346.3 3822.8818 4345.5727 3823.6091M4338.8091 3817.0636L4339.5364 3816.3364 4340.2636 3815.9727 4341.3545 3815.9727 4342.0818 3816.3364 4342.8091 3817.0636 4343.1727 3818.1545 4343.1727 3818.8818 4342.8091 3819.9727 4342.0818 3820.7 4341.3545 3821.0636 4340.2636 3821.0636 4339.5364 3820.7 4338.8091 3819.9727M4336.4091 3811.9727L4335.6818 3812.7 4334.9545 3813.7909 4334.2273 3815.2455 4333.8636 3817.0636 4333.8636 3818.5182 4334.2273 3820.3364 4334.9545 3821.7909 4335.6818 3822.8818 4336.4091 3823.6091M4325.5 3815.2455L4325.5 3814.8818 4325.1364 3814.1545 4324.7727 3813.7909 4324.0455 3813.4273 4322.5909 3813.4273 4321.8636 3813.7909 4321.5 3814.1545 4321.1364 3814.8818 4321.1364 3815.6091 4321.5 3816.3364 4322.2273 3817.4273 4325.8636 3821.0636 4320.7727 3821.0636M4316.1909 3813.4273L4317.2818 3813.7909 4318.0091 3814.8818 4318.3727 3816.7 4318.3727 3817.7909 4318.0091 3819.6091 4317.2818 3820.7 4316.1909 3821.0636 4315.4636 3821.0636 4314.3727 3820.7 4313.6455 3819.6091 4313.2818 3817.7909 4313.2818 3816.7 4313.6455 3814.8818 4314.3727 3813.7909 4315.4636 3813.4273 4316.1909 3813.4273M4310.5182 3815.2455L4310.5182 3814.8818 4310.1545 3814.1545 4309.7909 3813.7909 4309.0636 3813.4273 4307.6091 3813.4273 4306.8818 3813.7909 4306.5182 3814.1545 4306.1545 3814.8818 4306.1545 3815.6091 4306.5182 3816.3364 4307.2455 3817.4273 4310.8818 3821.0636 4305.7909 3821.0636M4303.0273 3815.2455L4303.0273 3814.8818 4302.6636 3814.1545 4302.3 3813.7909 4301.5727 3813.4273 4300.1182 3813.4273 4299.3909 3813.7909 4299.0273 3814.1545 4298.6636 3814.8818 4298.6636 3815.6091 4299.0273 3816.3364 4299.7545 3817.4273 4303.3909 3821.0636 4298.3 3821.0636M4290.3 3813.4273L4290.3 3821.0636M4290.3 3813.4273L4287.7545 3813.4273 4286.6636 3813.7909 4285.9364 3814.5182 4285.5727 3815.2455 4285.2091 3816.3364 4285.2091 3818.1545 4285.5727 3819.2455 4285.9364 3819.9727 4286.6636 3820.7 4287.7545 3821.0636 4290.3 3821.0636M4282.8091 3813.4273L4282.8091 3821.0636M4282.8091 3813.4273L4280.2636 3813.4273 4279.1727 3813.7909 4278.4455 3814.5182 4278.0818 3815.2455 4277.7182 3816.3364 4277.7182 3818.1545 4278.0818 3819.2455 4278.4455 3819.9727 4279.1727 3820.7 4280.2636 3821.0636 4282.8091 3821.0636M4275.3182 3813.4273L4272.4091 3821.0636M4269.5 3813.4273L4272.4091 3821.0636~~gge19952~~0~pinpart","TRACK~1~10~~4020 3597.5 4413.7008 3597.5 4413.7008 3849.4685 4020 3849.4685 4020 3597.5~gge398~0","TRACK~2.3622~1~U1_21~4329.999 3715 4329.999 3722.501 4323.5 3729 4137.61 3729~gge28939~0","TRACK~2.3622~1~U1_25~4062.47 3681.16 4060.2 3681.16 4055.5 3685.86 4055.5 3715.5 4039.5 3731.5 4039.5 3741.5 4042.41 3744.41 4092.28 3744.41~gge28790~0","TRACK~2.3622~1~U3_24~4053.62 3641.87 4086.56 3641.87 4125.23 3603.2 4258.36 3603.2 4277.23 3622.07 4277.23 3623.12 4299.11 3645 4300 3645~gge28795~0","TRACK~2.3622~1~U3_20~4390.08 3641.87 4376.95 3655 4360 3655~gge28794~0","TRACK~2.3622~1~U3_19~4350 3655 4356.69 3661.69 4380.26 3661.69 4400.08 3641.87~gge28793~0","TRACK~2.3622~1~U1_S_VP~4033.62 3631.87 4044.99 3620.5 4071.83 3620.5~gge28789~0","TRACK~2.3622~1~U1_4~4062.47 3686.09 4064.62 3686.09 4071.29 3692.76 4071.29 3732.33 4077.4 3738.45~gge28787~0","TRACK~2.3622~1~U1_15~4241.65 3619.16 4233.86 3619.16~gge28783~0","TRACK~2.3622~1~U1_15~4233.2 3619.16 4233.2 3615.14~gge28780~0","TRACK~2.3622~1~U1_15~4233.86 3619.16 4233.2 3619.16~gge28779~0","TRACK~2.3622~1~U1_15~4233.2 3619.16 4228.84 3623.51 4228.84 3627.99~gge28778~0","TRACK~2.3622~1~U1_02~4241.66 3630.17 4232.55 3630.17 4230.57 3632.15 4200.79 3632.15 4200.29 3631.66~gge28774~0","TRACK~2.3622~1~U1_02~4062.47 3666.4 4104.46 3666.4~gge28772~0","TRACK~2.3622~1~U1_13~4233.49 3635.82 4233.71 3635.82 4233.87 3635.66~gge28767~0","TRACK~2.3622~1~U1_13~4241.65 3635.66 4233.87 3635.66~gge28766~0","TRACK~2.3622~1~U1_13~4062.47 3671.32 4232.21 3671.32~gge28764~0","TRACK~2.3622~1~U1_14~4062.47 3676.24 4181.9 3676.24~gge28758~0","TRACK~2.3622~1~U1_14~4241.66 3641.17 4201.1 3641.17~gge28757~0","TRACK~2.3622~1~U3_28~4340 3645 4329.63 3634.63 4294.63 3634.63~gge28751~0","TRACK~2.3622~1~U3_28~4241.67 3646.67 4241.67 3651.16 4242.15 3651.64~gge28750~0","TRACK~2.3622~1~U3_27~4192.03 3619.15 4184.24 3619.15~gge28747~0","TRACK~2.3622~1~U3_27~4184.24 3619.15 4184.24 3616.83 4181.72 3614.3~gge28745~0","TRACK~2.3622~1~J2_2~4405 3658.89 4395.11 3658.89 4387 3667~gge28743~0","TRACK~2.3622~1~J2_2~4406.5 3610 4406.5 3613.95 4394.73 3625.72 4386.23 3625.72 4380.08 3631.87~gge28742~0","TRACK~2.3622~1~U1_3V3_1~4062.47 3656.56 4091.55 3656.56 4107.61 3640.5~gge28739~0","TRACK~2.3622~1~U1_21~4137.4 3738.45 4137.61 3738.23 4137.61 3715.61~gge28736~0","TRACK~2.3622~1~U1_3V3_2~4192.03 3635.7 4188.14 3635.7~gge28722~0","TRACK~2.3622~1~U1_3V3_2~4192.05 3630.18 4184.26 3630.18~gge28721~0","TRACK~2.3622~1~U1_3V3_2~4185.81 3635.7 4184.25 3635.7~gge28720~0","TRACK~2.3622~1~U1_3V3_2~4188.14 3635.7 4185.81 3635.7~gge28719~0","TRACK~2.3622~1~U1_3V3_2~4192.04 3641.2 4185.29 3641.2~gge28718~0","TRACK~2.3622~1~U1_3V3_2~4405 3695.11 4395.11 3695.11 4387 3687~gge28717~0","TRACK~2.3622~1~U1_3V3_2~4185.81 3635.7 4184.26 3634.15~gge28715~0","TRACK~2.3622~1~U1_3V3_2~4184.26 3634.15 4184.26 3630.18~gge28714~0","TRACK~2.3622~1~U1_3V3_2~4184.26 3634.15 4105.16 3634.15 4096.02 3643.29 4096.02 3645.92 4090.48 3651.46 4043.21 3651.46 4033.62 3641.87~gge28713~0","TRACK~2.3622~1~U1_3V3_2~4180.88 3637.76 4184.25 3637.76~gge28712~0","TRACK~2.3622~1~U1_3V3_2~4185.29 3641.2 4184.25 3640.16 4184.25 3637.76~gge28711~0","TRACK~2.3622~1~U1_3V3_2~4184.25 3637.76 4184.25 3635.7~gge28710~0","TRACK~2.3622~1~U3_23~4290 3645 4277.16 3632.16 4261.43 3632.16~gge28702~0","TRACK~2.3622~1~U3_23~4089.12 3646.93 4088.73 3647.32 4049.07 3647.32 4043.62 3641.87~gge28700~0","TRACK~2.3622~1~GND~4053.62 3631.87 4088.8 3631.87 4100.17 3620.5~gge28696~0","TRACK~2.3622~1~GND~4396.5 3610 4396.5 3616.11~gge28694~0","TRACK~2.3622~1~GND~4062.47 3661.48 4100.41 3661.48 4121.39 3640.5~gge28693~0","TRACK~2.3622~1~GND~4350 3715 4343.51 3708.51 4296.49 3708.51 4290 3715~gge28692~0","TRACK~2.3622~1~GND~4290 3715 4280 3715~gge28691~0","TRACK~2.3622~1~GND~4280 3715 4270 3715~gge28690~0","TRACK~2.3622~1~GND~4241.65 3624.67 4249.44 3624.67~gge28689~0","TRACK~2.3622~1~GND~4241.66 3608.13 4249.44 3608.13~gge28684~0","TRACK~2.3622~1~GND~4241.66 3613.65 4247.08 3613.65~gge28683~0","TRACK~2.3622~1~GND~4247.08 3613.65 4249.44 3613.65~gge28682~0","TRACK~2.3622~1~GND~4249.44 3608.13 4249.44 3613.64 4249.44 3613.65~gge28681~0","TRACK~2.3622~1~GND~4192.03 3646.71 4127.6 3646.71 4121.39 3640.5~gge28680~0","TRACK~2.3622~1~GND~4273.07 3623.8 4249.44 3623.8~gge28678~0","TRACK~2.3622~1~GND~4249.44 3613.65 4249.44 3623.8~gge28677~0","TRACK~2.3622~1~GND~4249.44 3623.8 4249.44 3624.67~gge28676~0","TRACK~2.3622~1~GND~4393 3616.11 4393 3621.13~gge28669~0","TRACK~2.3622~1~GND~4304.17 3606.5 4313.79 3616.11 4393 3616.11~gge28668~0","TRACK~2.3622~1~GND~4393 3616.11 4396.5 3616.11~gge28667~0","TRACK~2.3622~1~GND~4270 3645 4267 3645 4261.21 3639.2~gge28662~0","TRACK~2.3622~1~GND~4236.15 3657.73 4242.68 3657.73 4261.21 3639.2~gge28661~0","TRACK~2.3622~1~GND~4261.21 3639.2 4261.21 3637.82 4249.44 3626.05 4249.44 3624.67~gge28660~0","TRACK~2.3622~1~U1_3V3_2~4270 3655 4209.39 3715.61 4167.11 3715.61~gge28716~0","TRACK~2.3622~1~U1_15~4077.9 3838.45 4077.9 3835.1 4086.5 3826.5 4192 3826.5 4217 3798.5 4217 3762.2431 4216.85 3762.0931~gge29234~0","TRACK~2.3622~1~U1_13~4137.9 3838.45 4139.06 3838.45 4145.01 3832.5 4193 3832 4221 3800.5 4221.02 3762.09~gge29228~0","TRACK~2.3622~1~U1_22~4127.4 3738.45 4137.5 3750 4327.6 3749.9 4340 3737.5 4340 3715~gge28891~0","COPPERAREA~1~1~GND~M 4015 3587 L 4426 3587.5 L 4426 3860.5 L 4014.5 3860.5 L 4013.5 3861.5 Z~1~solid~gge29263~spoke~none~[[\"M 4061.1478 3741.8309 L 4060.99968 3741.80246 4060.87262 3741.7212 4060.78468 3741.59865 4060.74837 3741.45226 4060.76886 3741.30283 4060.84323 3741.17161 4060.92556 3741.0749 4061.23294 3740.60267 4061.47742 3740.09502 4061.65497 3739.56026 4061.76268 3739.0072 4061.79878 3738.4449 4061.76268 3737.8826 4061.65497 3737.32954 4061.47742 3736.79478 4061.23294 3736.28713 4060.92556 3735.8149 4060.56031 3735.38586 4060.14319 3735.00705 4059.68106 3734.68469 4059.1815 3734.42407 4058.65272 3734.22947 4058.10339 3734.10409 4057.54254 3734.04998 4056.97937 3734.06804 4056.42314 3734.15797 4055.88297 3734.31829 4055.36774 3734.54637 4054.8859 3734.83846 4054.44537 3735.18977 4054.05339 3735.59453 4053.71638 3736.04609 4053.43988 3736.53704 4053.22843 3737.05931 4053.08551 3737.60434 4053.01346 3738.16317 4053.01346 3738.72663 4053.08551 3739.28546 4053.22843 3739.83049 4053.43988 3740.35276 4053.71638 3740.84371 4053.97605 3741.19166 4054.04761 3741.35192 4054.04368 3741.52739 4053.965 3741.68429 4053.82673 3741.79239 4053.65549 3741.8309 4050.6478 3741.8309 4050.49968 3741.80246 4050.37262 3741.7212 4050.28468 3741.59865 4050.24837 3741.45226 4050.26886 3741.30283 4050.34323 3741.17161 4050.42556 3741.0749 4050.73294 3740.60267 4050.97742 3740.09502 4051.15497 3739.56026 4051.26268 3739.0072 4051.29878 3738.4449 4051.26268 3737.8826 4051.15497 3737.32954 4050.97742 3736.79478 4050.73294 3736.28713 4050.42556 3735.8149 4050.06031 3735.38586 4049.64319 3735.00705 4049.18106 3734.68469 4048.6815 3734.42407 4048.15272 3734.22947 4047.60339 3734.10409 4047.04254 3734.04998 4046.47937 3734.06804 4045.92314 3734.15797 4045.38297 3734.31829 4044.86774 3734.54637 4044.3859 3734.83846 4043.94537 3735.18977 4043.55339 3735.59453 4043.21638 3736.04609 4042.93988 3736.53704 4042.84987 3736.75937 4042.76388 3736.89016 4042.63429 3736.97794 4042.48093 3737.00926 4042.3273 3736.97934 4042.19691 3736.89276 4042.10972 3736.76276 4042.0791 3736.60927 4042.0791 3732.73398 4042.10955 3732.58091 4042.19626 3732.45114 4057.31259 3717.33481 4057.58554 3717.01523 4057.79689 3716.67033 4057.95169 3716.2966 4058.04613 3715.90327 4058.0791 3715.48428 4058.0791 3687.09398 4058.10955 3686.94091 4058.19626 3686.81114 4058.83586 3686.17154 4058.98104 3686.07882 4059.15174 3686.05575 4059.31632 3686.1066 4059.44425 3686.22195 4059.51181 3686.38041 4059.60498 3686.87558 4059.75838 3687.3027 4059.97572 3687.70238 4060.25153 3688.0642 4060.44963 3688.25485 4060.54326 3688.39353 4060.57196 3688.55838 4060.53072 3688.72055 4060.40938 3688.86598 4060.10669 3689.20563 4059.85939 3689.5875 4059.68805 3689.9697 4061.4326 3689.9697 4061.4326 3689.39143 4061.46918 3689.22431 4061.57224 3689.08777 4061.72292 3689.00676 4061.89366 3688.99612 4062.24252 3689.05 4062.69748 3689.05 4063.04634 3688.99612 4063.21708 3689.00676 4063.36776 3689.08777 4063.47082 3689.22431 4063.5074 3689.39143 4063.5074 3689.9697 4064.68662 3689.9697 4064.83969 3690.00015 4064.96946 3690.08686 4068.59374 3693.71114 4068.68045 3693.84091 4068.7109 3693.99398 4068.7109 3732.31437 4068.74353 3732.7311 4068.83766 3733.1246 4068.99215 3733.49845 4069.07149 3733.62816 4069.12527 3733.77384 4069.11951 3733.92902 4069.05509 3734.07031 4068.94172 3734.17642 4068.79648 3734.23136 4068.64126 3734.22685 4068.10339 3734.10409 4067.54254 3734.04998 4066.97937 3734.06804 4066.42314 3734.15797 4065.88297 3734.31829 4065.36774 3734.54637 4064.8859 3734.83846 4064.44537 3735.18977 4064.05339 3735.59453 4063.71638 3736.04609 4063.43988 3736.53704 4063.22843 3737.05931 4063.08551 3737.60434 4063.01346 3738.16317 4063.01346 3738.72663 4063.08551 3739.28546 4063.22843 3739.83049 4063.43988 3740.35276 4063.71638 3740.84371 4063.97605 3741.19166 4064.04761 3741.35192 4064.04368 3741.52739 4063.965 3741.68429 4063.82673 3741.79239 4063.65549 3741.8309 4061.1478 3741.8309 Z M 4061.35916 3693.76329 L 4061.4326 3693.78653 4061.4326 3692.0445 4059.69438 3692.0445 4059.75838 3692.2227 4059.97572 3692.62238 4060.25153 3692.9842 4060.57933 3693.29967 4060.95145 3693.56142 4061.35916 3693.76329 Z M 4063.5074 3692.0445 L 4063.5074 3693.78653 4063.58084 3693.76329 4063.98855 3693.56142 4064.36067 3693.29967 4064.68847 3692.9842 4064.96428 3692.62238 4065.18162 3692.2227 4065.24562 3692.0445 4063.5074 3692.0445 Z \",\"M 4021.42 3848.4485 L 4021.26693 3848.41805 4021.13716 3848.33134 4021.05045 3848.20157 4021.02 3848.0485 4021.02 3792.11536 4021.04923 3791.96525 4021.13266 3791.83708 4021.25809 3791.74959 4021.40718 3791.71556 4021.55815 3791.73997 4021.68892 3791.81925 4021.75841 3791.88235 4022.22054 3792.20471 4022.71953 3792.46504 4022.75 3792.47614 4022.75 3790.1945 4021.42 3790.1945 4021.26693 3790.16405 4021.13716 3790.07734 4021.05045 3789.94757 4021.02 3789.7945 4021.02 3787.0945 4021.05045 3786.94143 4021.13716 3786.81166 4021.26693 3786.72495 4021.42 3786.6945 4022.75 3786.6945 4022.75 3784.41286 4022.71953 3784.42396 4022.22054 3784.68429 4021.75841 3785.00665 4021.68892 3785.06975 4021.55815 3785.14903 4021.40718 3785.17344 4021.25809 3785.13941 4021.13266 3785.05192 4021.04923 3784.92375 4021.02 3784.77364 4021.02 3598.92 4021.05045 3598.76693 4021.13716 3598.63716 4021.26693 3598.55045 4021.42 3598.52 4412.2808 3598.52 4412.43387 3598.55045 4412.56364 3598.63716 4412.65035 3598.76693 4412.6808 3598.92 4412.6808 3848.0485 4412.65035 3848.20157 4412.56364 3848.33134 4412.43387 3848.41805 4412.2808 3848.4485 4021.42 3848.4485 Z M 4065.25195 3660.4397 L 4065.08061 3660.0575 4064.8857 3659.75653 4064.82568 3659.59713 4064.83742 3659.42721 4064.91878 3659.27758 4065.05503 3659.17536 4065.22145 3659.1391 4091.53428 3659.1391 4091.95327 3659.10613 4092.3466 3659.01169 4092.72033 3658.85689 4093.06523 3658.64554 4093.38481 3658.37259 4106.64373 3645.11366 4106.74872 3645.03822 4106.87229 3645.00021 4107.61 3645.04681 4108.17987 3645.01096 4108.74075 3644.90396 4109.28379 3644.72752 4109.80044 3644.4844 4110.28255 3644.17845 4110.72251 3643.81448 4111.11338 3643.39825 4111.449 3642.9363 4111.72408 3642.43594 4111.93427 3641.90504 4112.07627 3641.35199 4112.14784 3640.7855 4112.14784 3640.2145 4112.07627 3639.64801 4111.93427 3639.09496 4111.72408 3638.56406 4111.449 3638.0637 4111.11338 3637.60175 4110.92666 3637.40292 4110.84481 3637.27245 4110.81833 3637.12072 4110.85114 3636.97024 4110.93838 3636.84331 4111.06711 3636.75875 4111.21824 3636.7291 4117.78176 3636.7291 4117.93289 3636.75875 4118.06162 3636.84331 4118.14886 3636.97024 4118.18167 3637.12072 4118.15519 3637.27245 4118.07334 3637.40292 4117.88662 3637.60175 4117.551 3638.0637 4117.27592 3638.56406 4117.23192 3638.6752 4119.5652 3638.6752 4119.5652 3637.1291 4119.59565 3636.97603 4119.68236 3636.84626 4119.81213 3636.75955 4119.9652 3636.7291 4122.8148 3636.7291 4122.96787 3636.75955 4123.09764 3636.84626 4123.18435 3636.97603 4123.2148 3637.1291 4123.2148 3638.6752 4125.54808 3638.6752 4125.50408 3638.56406 4125.229 3638.0637 4124.89338 3637.60175 4124.70666 3637.40292 4124.62481 3637.27245 4124.59833 3637.12072 4124.63114 3636.97024 4124.71838 3636.84331 4124.84711 3636.75875 4124.99824 3636.7291 4177.95424 3636.7291 4178.12207 3636.76601 4178.25892 3636.86993 4178.33955 3637.02169 4178.34906 3637.19326 4178.29092 3637.55099 4178.29092 3637.96901 4178.35798 3638.38162 4178.49035 3638.77813 4178.68462 3639.14827 4178.93574 3639.48246 4179.23722 3639.77204 4179.58125 3640.0095 4179.95891 3640.1887 4180.36043 3640.305 4180.77541 3640.35539 4181.18775 3640.3391 4181.33472 3640.3391 4181.50693 3640.37807 4181.64558 3640.48737 4181.72367 3640.64572 4181.79831 3640.9566 4181.95311 3641.33033 4182.16446 3641.67523 4182.43741 3641.99481 4183.45519 3643.01259 4183.77477 3643.28554 4184.11967 3643.49689 4184.4934 3643.65169 4184.88673 3643.74613 4185.30572 3643.7791 4185.51254 3643.7791 4185.65833 3643.80661 4185.78406 3643.88537 4185.87244 3644.00454 4185.91131 3644.14772 4185.89531 3644.29521 4185.84131 3644.47324 4185.81255 3644.76525 4185.81255 3645.47985 4189.37198 3645.47985 4189.37198 3644.9646 4189.40242 3644.81153 4189.48913 3644.68176 4189.6189 3644.59505 4189.77198 3644.5646 4194.29482 3644.5646 4194.4479 3644.59505 4194.57767 3644.68176 4194.66438 3644.81153 4194.69482 3644.9646 4194.69482 3645.47985 4198.25425 3645.47985 4198.25425 3644.76525 4198.22549 3644.47324 4198.14605 3644.21135 4198.07251 3644.02874 4198.07251 3643.89843 4198.15405 3643.70085 4198.23349 3643.43896 4198.26225 3643.14695 4198.26225 3642.90158 4198.2964 3642.73987 4198.39301 3642.60577 4198.53558 3642.52217 4198.69979 3642.50335 4198.85758 3642.55252 4198.98203 3642.66128 4199.15574 3642.89246 4199.45722 3643.18204 4199.80125 3643.4195 4200.17891 3643.5987 4200.58043 3643.715 4200.99541 3643.76539 4201.40775 3643.7491 4235.14477 3643.7491 4235.29056 3643.77661 4235.4163 3643.85537 4235.50467 3643.97454 4235.54354 3644.11772 4235.52755 3644.26521 4235.47931 3644.42424 4235.45055 3644.71625 4235.45055 3648.61395 4235.47931 3648.90596 4235.55875 3649.16785 4235.68776 3649.40921 4235.86138 3649.62077 4236.07294 3649.79439 4236.3143 3649.9234 4236.57619 3650.00284 4236.8682 3650.0316 4238.6909 3650.0316 4238.84397 3650.06205 4238.97374 3650.14876 4239.06045 3650.27853 4239.0909 3650.4316 4239.0937 3651.17984 4239.07584 3651.33333 4239.00112 3651.4686 4238.88071 3651.56546 4238.73257 3651.60944 4238.57882 3651.594 4238.39426 3651.53801 4238.10225 3651.50925 4237.38765 3651.50925 4237.38765 3655.06867 4239.5199 3655.06867 4239.5199 3653.64253 4239.54984 3653.4907 4239.63517 3653.36159 4239.76311 3653.27454 4239.91453 3653.24257 4240.06675 3653.27046 4240.19699 3653.35405 4240.50722 3653.65204 4240.85125 3653.8895 4241.22891 3654.0687 4241.63043 3654.185 4242.04541 3654.23539 4242.46309 3654.21856 4242.87267 3654.13494 4243.26353 3653.98671 4243.62555 3653.7777 4243.94935 3653.51332 4244.22655 3653.20043 4244.44997 3652.84712 4244.61382 3652.46254 4244.71386 3652.05667 4244.7475 3651.64 4244.71386 3651.22333 4244.61382 3650.81746 4244.51623 3650.58839 4244.48423 3650.43482 4244.51375 3650.28076 4244.60024 3650.1499 4244.7304 3650.06236 4244.88422 3650.0316 4246.4746 3650.0316 4246.76661 3650.00284 4247.0285 3649.9234 4247.26986 3649.79439 4247.48142 3649.62077 4247.65504 3649.40921 4247.78405 3649.16785 4247.86349 3648.90596 4247.89225 3648.61395 4247.89225 3644.71625 4247.86349 3644.42424 4247.78405 3644.16235 4247.70619 3643.97166 4247.70619 3643.84135 4247.77005 3643.67685 4247.84949 3643.41496 4247.87825 3643.12295 4247.87825 3639.22525 4247.84949 3638.93324 4247.77005 3638.67135 4247.69158 3638.47952 4247.69158 3638.3492 4247.76605 3638.16485 4247.84549 3637.90296 4247.87425 3637.61095 4247.87425 3633.71325 4247.84549 3633.42124 4247.76605 3633.15935 4247.69699 3632.98513 4247.69699 3632.85481 4247.76805 3632.67685 4247.84749 3632.41496 4247.87625 3632.12295 4247.87625 3628.22525 4247.84749 3627.93324 4247.76805 3627.67135 4247.69092 3627.48202 4247.69092 3627.3517 4247.76405 3627.16985 4247.84349 3626.90796 4247.87225 3626.61595 4247.87225 3625.90135 4244.31282 3625.90135 4244.31282 3626.4076 4244.28238 3626.56067 4244.19567 3626.69044 4244.0659 3626.77715 4243.91282 3626.8076 4239.38998 3626.8076 4239.2369 3626.77715 4239.10713 3626.69044 4239.02042 3626.56067 4238.98998 3626.4076 4238.98998 3625.90135 4235.43055 3625.90135 4235.43055 3626.61595 4235.45931 3626.90796 4235.50992 3627.07479 4235.52591 3627.22228 4235.48704 3627.36546 4235.39866 3627.48463 4235.27293 3627.56339 4235.12714 3627.5909 4232.56572 3627.5909 4232.14673 3627.62387 4231.91248 3627.68011 4231.76897 3627.68801 4231.63193 3627.64467 4231.51906 3627.55569 4231.44492 3627.43256 4231.4191 3627.29117 4231.4191 3624.74599 4231.44964 3624.5927 4231.53658 3624.46282 4234.14946 3621.85593 4234.27912 3621.76946 4234.43198 3621.7391 4235.12841 3621.7391 4235.2742 3621.76661 4235.39994 3621.84537 4235.48831 3621.96454 4235.52718 3622.10772 4235.51119 3622.25521 4235.45931 3622.42624 4235.43055 3622.71825 4235.43055 3623.43285 4238.98998 3623.43285 4238.98998 3622.9216 4239.02042 3622.76853 4239.10713 3622.63876 4239.2369 3622.55205 4239.38998 3622.5216 4243.91282 3622.5216 4244.0659 3622.55205 4244.19567 3622.63876 4244.28238 3622.76853 4244.31282 3622.9216 4244.31282 3623.43285 4247.87225 3623.43285 4247.87225 3622.71825 4247.84349 3622.42624 4247.76405 3622.16435 4247.68558 3621.97252 4247.68558 3621.8422 4247.76005 3621.65785 4247.83949 3621.39596 4247.86825 3621.10395 4247.86825 3617.20625 4247.83949 3616.91424 4247.76005 3616.65235 4247.68892 3616.47424 4247.68892 3616.34393 4247.76805 3616.15085 4247.84749 3615.88896 4247.87625 3615.59695 4247.87625 3614.88235 4244.31682 3614.88235 4244.31682 3615.3886 4244.28638 3615.54167 4244.19967 3615.67144 4244.0699 3615.75815 4243.91682 3615.7886 4239.39397 3615.7886 4239.2409 3615.75815 4239.11113 3615.67144 4239.02442 3615.54167 4238.99398 3615.3886 4238.99398 3614.88235 4236.11644 3614.88235 4235.94496 3614.84373 4235.80659 3614.73533 4235.72806 3614.57808 4235.66382 3614.31746 4235.49997 3613.93288 4235.27655 3613.57957 4234.99935 3613.26668 4234.67555 3613.0023 4234.31353 3612.79329 4233.92267 3612.64506 4233.51309 3612.56144 4233.09541 3612.54461 4232.68043 3612.595 4232.27891 3612.7113 4231.90125 3612.8905 4231.55722 3613.12796 4231.25574 3613.41754 4231.00462 3613.75173 4230.81035 3614.12187 4230.67798 3614.51838 4230.61092 3614.93099 4230.61092 3615.34901 4230.6209 3615.44269 4230.6209 3617.92401 4230.59036 3618.0773 4230.50342 3618.20718 4227.02952 3621.67311 4226.75621 3621.99238 4226.54445 3622.33704 4226.38922 3622.71058 4226.29434 3623.10381 4226.2609 3623.52253 4226.2609 3627.68731 4226.25092 3627.78099 4226.25092 3628.19901 4226.31791 3628.61122 4226.46319 3629.04346 4226.48344 3629.1928 4226.44699 3629.33902 4226.35903 3629.46138 4226.23204 3629.54251 4226.08404 3629.5709 4201.9569 3629.5709 4201.85338 3629.55727 4201.7569 3629.51731 4201.40353 3629.31329 4201.01267 3629.16506 4200.60309 3629.08144 4200.18541 3629.06461 4199.77043 3629.115 4199.36891 3629.2313 4198.99125 3629.4105 4198.89648 3629.47592 4198.73659 3629.54102 4198.56417 3629.53268 4198.41131 3629.45245 4198.3065 3629.31529 4198.26925 3629.14672 4198.26925 3628.23525 4198.24049 3627.94324 4198.16105 3627.68135 4198.1163 3627.59763 4198.07441 3627.47423 4198.07441 3627.34391 4198.14605 3627.16485 4198.22549 3626.90296 4198.25425 3626.61095 4198.25425 3622.71325 4198.22549 3622.42124 4198.14605 3622.15935 4198.06758 3621.96752 4198.06758 3621.8372 4198.14205 3621.65285 4198.22149 3621.39096 4198.25025 3621.09895 4198.25025 3617.20125 4198.22149 3616.90924 4198.14205 3616.64735 4198.06785 3616.4635 4198.06785 3616.33318 4198.14605 3616.14185 4198.22549 3615.87996 4198.25425 3615.58795 4198.25425 3611.69025 4198.22549 3611.39824 4198.14605 3611.13635 4198.07492 3610.95824 4198.07492 3610.82793 4198.15405 3610.63485 4198.23349 3610.37296 4198.26225 3610.08095 4198.26225 3606.1791 4198.2927 3606.02603 4198.37941 3605.89626 4198.50918 3605.80955 4198.66225 3605.7791 4235.03455 3605.7791 4235.18762 3605.80955 4235.31739 3605.89626 4235.4041 3606.02603 4235.43455 3606.1791 4235.43455 3606.89785 4238.99398 3606.89785 4238.99398 3606.1791 4239.02442 3606.02603 4239.11113 3605.89626 4239.2409 3605.80955 4239.39397 3605.7791 4243.91682 3605.7791 4244.0699 3605.80955 4244.19967 3605.89626 4244.28638 3606.02603 4244.31682 3606.1791 4244.31682 3606.89785 4247.87625 3606.89785 4247.87625 3606.1791 4247.9067 3606.02603 4247.99341 3605.89626 4248.12318 3605.80955 4248.27625 3605.7791 4257.12602 3605.7791 4257.27909 3605.80955 4257.40886 3605.89626 4274.54946 3623.03686 4274.62987 3623.15224 4274.66538 3623.28832 4274.68387 3623.52327 4274.77831 3623.9166 4274.93311 3624.29033 4275.14446 3624.63523 4275.41741 3624.95481 4290.38855 3639.92594 4290.47687 3640.05967 4290.50561 3640.21733 4290.47016 3640.37363 4290.3762 3640.50346 4290.23882 3640.58599 4290.08007 3640.60796 4290 3640.60282 4289.476 3640.63647 4289.30922 3640.61156 4289.16753 3640.52013 4278.99481 3630.34741 4278.67523 3630.07446 4278.33033 3629.86311 4277.9566 3629.70831 4277.56327 3629.61387 4277.14428 3629.5809 4261.73775 3629.5809 4261.32541 3629.56461 4260.91043 3629.615 4260.50891 3629.7313 4260.13125 3629.9105 4259.78722 3630.14796 4259.48574 3630.43754 4259.23462 3630.77173 4259.04035 3631.14187 4258.90798 3631.53838 4258.84092 3631.95099 4258.84092 3632.36901 4258.90798 3632.78162 4259.04035 3633.17813 4259.23462 3633.54827 4259.48574 3633.88246 4259.78722 3634.17204 4260.13125 3634.4095 4260.50891 3634.5887 4260.91043 3634.705 4261.32541 3634.75539 4261.73775 3634.7391 4275.92602 3634.7391 4276.07909 3634.76955 4276.20886 3634.85626 4281.41146 3640.05886 4281.50288 3640.20055 4281.52779 3640.36733 4281.48176 3640.52955 4281.37297 3640.65839 4281.22075 3640.73095 4281.05215 3640.73432 4280.5623 3640.63892 4280 3640.60282 4279.4377 3640.63892 4278.88464 3640.74663 4278.34988 3640.92418 4277.84223 3641.16866 4277.37 3641.47604 4276.94096 3641.84129 4276.56215 3642.25841 4276.23979 3642.72054 4275.97917 3643.2201 4275.78457 3643.74888 4275.65919 3644.29821 4275.60508 3644.85906 4275.62314 3645.42223 4275.71307 3645.97846 4275.87339 3646.51863 4276.10147 3647.03386 4276.39356 3647.5157 4276.74487 3647.95623 4277.14963 3648.34821 4277.60119 3648.68522 4278.09214 3648.96172 4278.61441 3649.17317 4279.15944 3649.31609 4279.71827 3649.38814 4280.28173 3649.38814 4280.84056 3649.31609 4281.38559 3649.17317 4281.90786 3648.96172 4282.39881 3648.68522 4282.85037 3648.34821 4283.25513 3647.95623 4283.60644 3647.5157 4283.89853 3647.03386 4284.12661 3646.51863 4284.28693 3645.97846 4284.37686 3645.42223 4284.39492 3644.85906 4284.34081 3644.29821 4284.26234 3643.9544 4284.26074 3643.78369 4284.33047 3643.62787 4284.45882 3643.51531 4284.62242 3643.46651 4284.79146 3643.49038 4284.93515 3643.58255 4285.52502 3644.17242 4285.61866 3644.32013 4285.64033 3644.49367 4285.60508 3644.85906 4285.62314 3645.42223 4285.71307 3645.97846 4285.87339 3646.51863 4286.10147 3647.03386 4286.39356 3647.5157 4286.74487 3647.95623 4287.14963 3648.34821 4287.60119 3648.68522 4288.09214 3648.96172 4288.61441 3649.17317 4289.15944 3649.31609 4289.71827 3649.38814 4290.28173 3649.38814 4290.84056 3649.31609 4291.38559 3649.17317 4291.90786 3648.96172 4292.39881 3648.68522 4292.85037 3648.34821 4293.25513 3647.95623 4293.60644 3647.5157 4293.89853 3647.03386 4294.12661 3646.51863 4294.28693 3645.97846 4294.37686 3645.42223 4294.39411 3644.88417 4294.42858 3644.7341 4294.51717 3644.60817 4294.64678 3644.52503 4294.79818 3644.49701 4294.94895 3644.52826 4295.07675 3644.61415 4295.50259 3645.03999 4295.5868 3645.16386 4295.61954 3645.31001 4295.62314 3645.42223 4295.71307 3645.97846 4295.87339 3646.51863 4296.10147 3647.03386 4296.39356 3647.5157 4296.74487 3647.95623 4297.14963 3648.34821 4297.60119 3648.68522 4298.09214 3648.96172 4298.61441 3649.17317 4299.15944 3649.31609 4299.71827 3649.38814 4300.28173 3649.38814 4300.84056 3649.31609 4301.38559 3649.17317 4301.90786 3648.96172 4302.39881 3648.68522 4302.85037 3648.34821 4303.25513 3647.95623 4303.60644 3647.5157 4303.89853 3647.03386 4304.12661 3646.51863 4304.28693 3645.97846 4304.37686 3645.42223 4304.39492 3644.85906 4304.34081 3644.29821 4304.21543 3643.74888 4304.02083 3643.2201 4303.76021 3642.72054 4303.43785 3642.25841 4303.05904 3641.84129 4302.63 3641.47604 4302.15777 3641.16866 4301.65012 3640.92418 4301.11536 3640.74663 4300.5623 3640.63892 4300 3640.60282 4299.4377 3640.63892 4298.88464 3640.74663 4298.68794 3640.78362 4298.54526 3640.74985 4298.42433 3640.66693 4295.64934 3637.89194 4295.56263 3637.76217 4295.53218 3637.6091 4295.56263 3637.45603 4295.64934 3637.32626 4295.77911 3637.23955 4295.93218 3637.2091 4328.39602 3637.2091 4328.54909 3637.23955 4328.67886 3637.32626 4331.41146 3640.05886 4331.50288 3640.20055 4331.52779 3640.36733 4331.48176 3640.52955 4331.37297 3640.65839 4331.22075 3640.73095 4331.05215 3640.73432 4330.5623 3640.63892 4330 3640.60282 4329.4377 3640.63892 4328.88464 3640.74663 4328.34988 3640.92418 4327.84223 3641.16866 4327.37 3641.47604 4326.94096 3641.84129 4326.56215 3642.25841 4326.23979 3642.72054 4325.97917 3643.2201 4325.78457 3643.74888 4325.65919 3644.29821 4325.60508 3644.85906 4325.62314 3645.42223 4325.71307 3645.97846 4325.87339 3646.51863 4326.10147 3647.03386 4326.39356 3647.5157 4326.74487 3647.95623 4327.14963 3648.34821 4327.60119 3648.68522 4328.09214 3648.96172 4328.61441 3649.17317 4329.15944 3649.31609 4329.71827 3649.38814 4330.28173 3649.38814 4330.84056 3649.31609 4331.38559 3649.17317 4331.90786 3648.96172 4332.39881 3648.68522 4332.85037 3648.34821 4333.25513 3647.95623 4333.60644 3647.5157 4333.89853 3647.03386 4334.12661 3646.51863 4334.28693 3645.97846 4334.37686 3645.42223 4334.39492 3644.85906 4334.34081 3644.29821 4334.26234 3643.9544 4334.26074 3643.78369 4334.33047 3643.62787 4334.45882 3643.51531 4334.62242 3643.46651 4334.79146 3643.49038 4334.93515 3643.58255 4335.52502 3644.17242 4335.61866 3644.32013 4335.64033 3644.49367 4335.60508 3644.85906 4335.62314 3645.42223 4335.71307 3645.97846 4335.87339 3646.51863 4336.10147 3647.03386 4336.39356 3647.5157 4336.74487 3647.95623 4337.14963 3648.34821 4337.60119 3648.68522 4338.09214 3648.96172 4338.61441 3649.17317 4339.15944 3649.31609 4339.71827 3649.38814 4340.28173 3649.38814 4340.84056 3649.31609 4341.38559 3649.17317 4341.90786 3648.96172 4342.39881 3648.68522 4342.85037 3648.34821 4343.25513 3647.95623 4343.60644 3647.5157 4343.89853 3647.03386 4344.12661 3646.51863 4344.28693 3645.97846 4344.37686 3645.42223 4344.39492 3644.85906 4344.34081 3644.29821 4344.21543 3643.74888 4344.02083 3643.2201 4343.76021 3642.72054 4343.43785 3642.25841 4343.05904 3641.84129 4342.63 3641.47604 4342.15777 3641.16866 4341.65012 3640.92418 4341.11536 3640.74663 4340.5623 3640.63892 4340 3640.60282 4339.476 3640.63647 4339.30922 3640.61156 4339.16753 3640.52013 4331.46481 3632.81741 4331.14523 3632.54446 4330.80033 3632.33311 4330.4266 3632.17831 4330.03327 3632.08387 4329.61428 3632.0509 4294.93775 3632.0509 4294.52541 3632.03461 4294.11043 3632.085 4293.70891 3632.2013 4293.33125 3632.3805 4292.98722 3632.61796 4292.68574 3632.90754 4292.43462 3633.24173 4292.24035 3633.61187 4292.14609 3633.79113 4292.01632 3633.88743 4291.85904 3633.92452 4291.69991 3633.89635 4291.56492 3633.80752 4279.91054 3622.15314 4279.83013 3622.03776 4279.79462 3621.90168 4279.77613 3621.66673 4279.68169 3621.2734 4279.52689 3620.89967 4279.31554 3620.55477 4279.04259 3620.23519 4260.19481 3601.38741 4259.87523 3601.11446 4259.53033 3600.90311 4259.1566 3600.74831 4258.76327 3600.65387 4258.34428 3600.6209 4125.24572 3600.6209 4124.82673 3600.65387 4124.4334 3600.74831 4124.05967 3600.90311 4123.71477 3601.11446 4123.39519 3601.38741 4102.96866 3621.81394 4102.83889 3621.90065 4102.68582 3621.9311 4101.6043 3621.9311 4101.6043 3623.01262 4101.57385 3623.16569 4101.48714 3623.29546 4085.60886 3639.17374 4085.47909 3639.26045 4085.32602 3639.2909 4056.51383 3639.2909 4056.35447 3639.25778 4055.78663 3638.80059 4055.34849 3638.53416 4054.87816 3638.32986 4054.3844 3638.19152 4053.87639 3638.12169 4053.36361 3638.12169 4052.8556 3638.19152 4052.36184 3638.32986 4051.89151 3638.53416 4051.45337 3638.80059 4051.0556 3639.1242 4050.7056 3639.49896 4050.40989 3639.91789 4050.17398 3640.37318 4050.00226 3640.85636 4049.89793 3641.35841 4049.86293 3641.87 4049.89793 3642.38159 4050.00226 3642.88364 4050.17398 3643.36682 4050.40989 3643.82211 4050.57125 3644.05071 4050.63725 3644.20574 4050.63355 3644.37419 4050.56081 3644.52617 4050.43195 3644.63472 4050.26981 3644.68058 4050.10318 3644.6556 4049.96162 3644.56422 4047.49111 3642.09371 4047.40985 3641.97647 4047.37489 3641.83817 4047.34207 3641.35841 4047.23774 3640.85636 4047.06602 3640.37318 4046.83011 3639.91789 4046.5344 3639.49896 4046.1844 3639.1242 4045.78663 3638.80059 4045.34849 3638.53416 4044.87816 3638.32986 4044.3844 3638.19152 4043.87639 3638.12169 4043.36361 3638.12169 4042.8556 3638.19152 4042.36184 3638.32986 4041.89151 3638.53416 4041.45337 3638.80059 4041.0556 3639.1242 4040.7056 3639.49896 4040.40989 3639.91789 4040.17398 3640.37318 4040.00226 3640.85636 4039.89793 3641.35841 4039.86293 3641.87 4039.89793 3642.38159 4040.00226 3642.88364 4040.17398 3643.36682 4040.40989 3643.82211 4040.57125 3644.05071 4040.63725 3644.20574 4040.63355 3644.37419 4040.56081 3644.52617 4040.43195 3644.63472 4040.26981 3644.68058 4040.10318 3644.6556 4039.96162 3644.56422 4037.49516 3642.09776 4037.40845 3641.96799 4037.378 3641.81492 4037.378 3639.52965 4037.34924 3639.23764 4037.2698 3638.97575 4037.14079 3638.73439 4036.96717 3638.52283 4036.75561 3638.34921 4036.51425 3638.2202 4036.25236 3638.14076 4035.96035 3638.112 4031.27965 3638.112 4030.98764 3638.14076 4030.72575 3638.2202 4030.48439 3638.34921 4030.27283 3638.52283 4030.09921 3638.73439 4029.9702 3638.97575 4029.89076 3639.23764 4029.862 3639.52965 4029.862 3644.21035 4029.89076 3644.50236 4029.9702 3644.76425 4030.09921 3645.00561 4030.27283 3645.21717 4030.48439 3645.39079 4030.72575 3645.5198 4030.98764 3645.59924 4031.27965 3645.628 4033.56492 3645.628 4033.71799 3645.65845 4033.84776 3645.74516 4041.37519 3653.27259 4041.69477 3653.54554 4042.03967 3653.75689 4042.4134 3653.91169 4042.80673 3654.00613 4043.22572 3654.0391 4059.85298 3654.0391 4060.00251 3654.0681 4060.13035 3654.15089 4060.21798 3654.27547 4060.25269 3654.42378 4060.22944 3654.57431 4060.10669 3654.75563 4059.85939 3655.1375 4059.67329 3655.55264 4059.55273 3655.99133 4059.50056 3656.44328 4059.51798 3656.8979 4059.6046 3657.34453 4059.75838 3657.7727 4059.97572 3658.17238 4060.25153 3658.5342 4060.44963 3658.72485 4060.54326 3658.86353 4060.57196 3659.02838 4060.53072 3659.19055 4060.40938 3659.33598 4060.10669 3659.67563 4059.85939 3660.0575 4059.68805 3660.4397 4061.4326 3660.4397 4061.4326 3659.86143 4061.46918 3659.69431 4061.57224 3659.55777 4061.72292 3659.47676 4061.89366 3659.46612 4062.24252 3659.52 4062.69748 3659.52 4063.04634 3659.46612 4063.21708 3659.47676 4063.36776 3659.55777 4063.47082 3659.69431 4063.5074 3659.86143 4063.5074 3660.4397 4065.25195 3660.4397 Z M 4092.17541 3747.00539 L 4092.59309 3746.98856 4093.00267 3746.90494 4093.39353 3746.75671 4093.75555 3746.5477 4094.07935 3746.28332 4094.35655 3745.97043 4094.57997 3745.61712 4094.74382 3745.23254 4094.84386 3744.82667 4094.8775 3744.41 4094.84386 3743.99333 4094.74382 3743.58746 4094.57997 3743.20288 4094.35655 3742.84957 4094.07935 3742.53668 4093.75555 3742.2723 4093.39353 3742.06329 4093.00267 3741.91506 4092.59309 3741.83144 4092.17541 3741.81461 4092.01704 3741.8309 4091.1478 3741.8309 4090.99968 3741.80246 4090.87262 3741.7212 4090.78468 3741.59865 4090.74837 3741.45226 4090.76886 3741.30283 4090.84323 3741.17161 4090.92556 3741.0749 4091.23294 3740.60267 4091.47742 3740.09502 4091.65497 3739.56026 4091.76268 3739.0072 4091.79878 3738.4449 4091.76268 3737.8826 4091.65497 3737.32954 4091.47742 3736.79478 4091.23294 3736.28713 4090.92556 3735.8149 4090.56031 3735.38586 4090.14319 3735.00705 4089.68106 3734.68469 4089.1815 3734.42407 4088.65272 3734.22947 4088.10339 3734.10409 4087.54254 3734.04998 4086.97937 3734.06804 4086.42314 3734.15797 4085.88297 3734.31829 4085.36774 3734.54637 4084.8859 3734.83846 4084.44537 3735.18977 4084.05339 3735.59453 4083.71638 3736.04609 4083.43988 3736.53704 4083.22843 3737.05931 4083.08551 3737.60434 4083.01346 3738.16317 4083.01346 3738.72663 4083.08551 3739.28546 4083.22843 3739.83049 4083.43988 3740.35276 4083.71638 3740.84371 4083.97605 3741.19166 4084.04761 3741.35192 4084.04368 3741.52739 4083.965 3741.68429 4083.82673 3741.79239 4083.65549 3741.8309 4081.1478 3741.8309 4080.99968 3741.80246 4080.87262 3741.7212 4080.78468 3741.59865 4080.74837 3741.45226 4080.76886 3741.30283 4080.84323 3741.17161 4080.92556 3741.0749 4081.23294 3740.60267 4081.47742 3740.09502 4081.65497 3739.56026 4081.76268 3739.0072 4081.79878 3738.4449 4081.76268 3737.8826 4081.65497 3737.32954 4081.47742 3736.79478 4081.23294 3736.28713 4080.92556 3735.8149 4080.56031 3735.38586 4080.14319 3735.00705 4079.68106 3734.68469 4079.1815 3734.42407 4078.65272 3734.22947 4078.10339 3734.10409 4077.54254 3734.04998 4076.97937 3734.06804 4076.78919 3734.07879 4076.66962 3734.0401 4076.56796 3733.96621 4073.98603 3731.38005 4073.89949 3731.25037 4073.8691 3731.09744 4073.8691 3719.0511 4073.89758 3718.90288 4073.97895 3718.77576 4074.10163 3718.68784 4074.24816 3718.65165 4074.39767 3718.67232 4074.52888 3718.74693 4074.98247 3719.13433 4075.45443 3719.44154 4075.96208 3719.68602 4076.49684 3719.86357 4077.0499 3719.97128 4077.6122 3720.00738 4078.1745 3719.97128 4078.72756 3719.86357 4079.26232 3719.68602 4079.76997 3719.44154 4080.2422 3719.13416 4080.67124 3718.76891 4081.05005 3718.35179 4081.37241 3717.88966 4081.63303 3717.3901 4081.82763 3716.86132 4081.95301 3716.31199 4082.00712 3715.75114 4081.98906 3715.18797 4081.89913 3714.63174 4081.73881 3714.09157 4081.51073 3713.57634 4081.21864 3713.0945 4080.86733 3712.65397 4080.46257 3712.26199 4080.01101 3711.92498 4079.52006 3711.64848 4078.99779 3711.43703 4078.45276 3711.29411 4077.89393 3711.22206 4077.33047 3711.22206 4076.77164 3711.29411 4076.22661 3711.43703 4075.70434 3711.64848 4075.21339 3711.92498 4074.76183 3712.26199 4074.54737 3712.46967 4074.41722 3712.5539 4074.26483 3712.58231 4074.11307 3712.55065 4073.98475 3712.46366 4073.89914 3712.33442 4073.8691 3712.18233 4073.8691 3692.77572 4073.83613 3692.35673 4073.74169 3691.9634 4073.58689 3691.58967 4073.37554 3691.24477 4073.10259 3690.92519 4066.45481 3684.27741 4066.13523 3684.00446 4065.79033 3683.79311 4065.4166 3683.63831 4065.07313 3683.55585 4064.92991 3683.48942 4064.82354 3683.37275 4064.77061 3683.22402 4064.77934 3683.06638 4064.84839 3682.92441 4064.96428 3682.77238 4065.18162 3682.3727 4065.3354 3681.94453 4065.42202 3681.4979 4065.43944 3681.04328 4065.38727 3680.59133 4065.26671 3680.15264 4065.08061 3679.7375 4064.8857 3679.43653 4064.82568 3679.27713 4064.83742 3679.10721 4064.91878 3678.95758 4065.05503 3678.85536 4065.22145 3678.8191 4074.718 3678.8191 4074.87107 3678.84955 4075.00084 3678.93626 4075.08755 3679.06603 4075.118 3679.2191 4075.118 3709.6651 4075.1574 3709.7045 4157.7556 3709.7045 4157.795 3709.6651 4157.795 3679.2191 4157.82545 3679.06603 4157.91216 3678.93626 4158.04193 3678.84955 4158.195 3678.8191 4181.63704 3678.8191 4181.79541 3678.83539 4182.21309 3678.81856 4182.62267 3678.73494 4183.01353 3678.58671 4183.37555 3678.3777 4183.69935 3678.11332 4183.97655 3677.80043 4184.19997 3677.44712 4184.36382 3677.06254 4184.46386 3676.65667 4184.4975 3676.24 4184.46386 3675.82333 4184.36382 3675.41746 4184.19997 3675.03288 4183.97655 3674.67957 4183.87447 3674.56435 4183.79709 3674.43338 4183.7742 3674.28299 4183.80912 3674.13493 4183.89679 3674.01062 4184.02453 3673.92803 4184.17388 3673.8991 4231.94704 3673.8991 4232.10541 3673.91539 4232.52309 3673.89856 4232.93267 3673.81494 4233.32353 3673.66671 4233.68555 3673.4577 4234.00935 3673.19332 4234.28655 3672.88043 4234.50997 3672.52712 4234.67382 3672.14254 4234.77386 3671.73667 4234.8075 3671.32 4234.77386 3670.90333 4234.67382 3670.49746 4234.50997 3670.11288 4234.28655 3669.75957 4234.00935 3669.44668 4233.68555 3669.1823 4233.32353 3668.97329 4232.93267 3668.82506 4232.52309 3668.74144 4232.10541 3668.72461 4231.94704 3668.7409 4106.73388 3668.7409 4106.58453 3668.71197 4106.45679 3668.62938 4106.36912 3668.50507 4106.3342 3668.35701 4106.35709 3668.20662 4106.43447 3668.07565 4106.53655 3667.96043 4106.75997 3667.60712 4106.92382 3667.22254 4107.02386 3666.81667 4107.0575 3666.4 4107.02386 3665.98333 4106.92382 3665.57746 4106.75997 3665.19288 4106.53655 3664.83957 4106.25935 3664.52668 4105.93555 3664.2623 4105.57353 3664.05329 4105.18267 3663.90506 4104.77309 3663.82144 4104.35541 3663.80461 4104.19704 3663.8209 4065.21682 3663.8209 4065.04484 3663.78204 4064.90628 3663.67302 4064.82805 3663.51502 4064.82535 3663.33873 4064.8987 3663.17841 4064.96428 3663.09238 4065.18162 3662.6927 4065.24562 3662.5145 4063.5074 3662.5145 4063.5074 3663.0925 4063.48174 3663.23346 4063.40805 3663.35634 4063.29579 3663.44536 4063.15936 3663.48912 4063.01626 3663.48198 4062.92362 3663.4603 4062.47 3663.42548 4062.01638 3663.4603 4061.92374 3663.48198 4061.78064 3663.48912 4061.64421 3663.44536 4061.53195 3663.35634 4061.45826 3663.23346 4061.4326 3663.0925 4061.4326 3662.5145 4059.69438 3662.5145 4059.75838 3662.6927 4059.97572 3663.09238 4060.25153 3663.4542 4060.44963 3663.64485 4060.54326 3663.78353 4060.57196 3663.94838 4060.53072 3664.11055 4060.40938 3664.25598 4060.10669 3664.59563 4059.85939 3664.9775 4059.67329 3665.39264 4059.55273 3665.83133 4059.50056 3666.28328 4059.51798 3666.7379 4059.6046 3667.18453 4059.75838 3667.6127 4059.97572 3668.01238 4060.25153 3668.3742 4060.44963 3668.56485 4060.54326 3668.70353 4060.57196 3668.86838 4060.53072 3669.03055 4060.40938 3669.17598 4060.10669 3669.51563 4059.85939 3669.8975 4059.67329 3670.31264 4059.55273 3670.75133 4059.50056 3671.20328 4059.51798 3671.6579 4059.6046 3672.10453 4059.75838 3672.5327 4059.97572 3672.93238 4060.25153 3673.2942 4060.44963 3673.48485 4060.54326 3673.62353 4060.57196 3673.78838 4060.53072 3673.95055 4060.40938 3674.09598 4060.10669 3674.43563 4059.85939 3674.8175 4059.67329 3675.23264 4059.55273 3675.67133 4059.50056 3676.12328 4059.51798 3676.5779 4059.6046 3677.02453 4059.75838 3677.4527 4059.97572 3677.85238 4060.06829 3677.97381 4060.13744 3678.11619 4060.14595 3678.27425 4060.09248 3678.42324 4059.98541 3678.53982 4059.8415 3678.60574 4059.40242 3678.70871 4059.02967 3678.86311 4058.68477 3679.07446 4058.36519 3679.34741 4053.68741 3684.02519 4053.41446 3684.34477 4053.20311 3684.68967 4053.04831 3685.0634 4052.95387 3685.45673 4052.9209 3685.87572 4052.9209 3714.26602 4052.89045 3714.41909 4052.80374 3714.54886 4037.68741 3729.66519 4037.41446 3729.98477 4037.20311 3730.32967 4037.04831 3730.7034 4036.95387 3731.09673 4036.9209 3731.51572 4036.9209 3741.48428 4036.95387 3741.90327 4037.04831 3742.2966 4037.20311 3742.67033 4037.41446 3743.01523 4037.68741 3743.33481 4040.57519 3746.22259 4040.89477 3746.49554 4041.23967 3746.70689 4041.6134 3746.86169 4042.00673 3746.95613 4042.42572 3746.9891 4092.01704 3746.9891 4092.17541 3747.00539 Z M 4148.04254 3842.83982 L 4148.60339 3842.78571 4149.15272 3842.66033 4149.6815 3842.46573 4150.18106 3842.20511 4150.64319 3841.88275 4151.06031 3841.50394 4151.42556 3841.0749 4151.73294 3840.60267 4151.97742 3840.09502 4152.15497 3839.56026 4152.26268 3839.0072 4152.29878 3838.4449 4152.26268 3837.8826 4152.15497 3837.32954 4151.97742 3836.79478 4151.73294 3836.28713 4151.42556 3835.8149 4151.30205 3835.66982 4151.22791 3835.53926 4151.20713 3835.39056 4151.24264 3835.24467 4151.32943 3835.12215 4151.45528 3835.04027 4151.60246 3835.01055 4154.20768 3834.98341 4154.38007 3835.02048 4154.51976 3835.12807 4154.59963 3835.28528 4154.60413 3835.46155 4154.53241 3835.62263 4154.21638 3836.04609 4153.93988 3836.53704 4153.87597 3836.6949 4156.1516 3836.6949 4156.1516 3835.35901 4156.18165 3835.2069 4156.26729 3835.07765 4156.39564 3834.99067 4156.54743 3834.95903 4159.24743 3834.9309 4159.40178 3834.96014 4159.53297 3835.04657 4159.62075 3835.17685 4159.6516 3835.33088 4159.6516 3836.6949 4161.92931 3836.6949 4161.73294 3836.28713 4161.42556 3835.8149 4161.21413 3835.56655 4161.13999 3835.43599 4161.11921 3835.28729 4161.15472 3835.1414 4161.24151 3835.01888 4161.36737 3834.937 4161.51454 3834.90728 4164.29868 3834.87827 4164.45172 3834.90699 4164.58219 3834.99196 4164.67034 3835.12031 4164.70281 3835.27259 4164.67467 3835.42573 4164.55339 3835.59453 4164.21638 3836.04609 4163.93988 3836.53704 4163.72843 3837.05931 4163.58551 3837.60434 4163.51346 3838.16317 4163.51346 3838.72663 4163.58551 3839.28546 4163.72843 3839.83049 4163.93988 3840.35276 4164.21638 3840.84371 4164.55339 3841.29527 4164.94537 3841.70003 4165.3859 3842.05134 4165.86774 3842.34343 4166.38297 3842.57151 4166.92314 3842.73183 4167.47937 3842.82176 4168.04254 3842.83982 4168.60339 3842.78571 4169.15272 3842.66033 4169.6815 3842.46573 4170.18106 3842.20511 4170.64319 3841.88275 4171.06031 3841.50394 4171.42556 3841.0749 4171.73294 3840.60267 4171.97742 3840.09502 4172.15497 3839.56026 4172.26268 3839.0072 4172.29878 3838.4449 4172.26268 3837.8826 4172.15497 3837.32954 4171.97742 3836.79478 4171.73294 3836.28713 4171.42556 3835.8149 4171.12622 3835.46328 4171.05207 3835.33272 4171.03129 3835.18401 4171.0668 3835.03813 4171.1536 3834.91561 4171.27945 3834.83372 4171.42663 3834.80401 4193.02204 3834.57901 4193.1454 3834.57474 4193.43589 3834.54174 4193.54639 3834.5203 4193.82814 3834.44226 4193.93392 3834.40379 4194.2 3834.28264 4194.29846 3834.2281 4194.54231 3834.06681 4194.63103 3833.99755 4194.84664 3833.8001 4194.93085 3833.70985 4222.92114 3802.22077 4223.08778 3802.01375 4223.16963 3801.89391 4223.29888 3801.66852 4223.36097 3801.53734 4223.45337 3801.29451 4223.49418 3801.15523 4223.54746 3800.90093 4223.56598 3800.75699 4223.5791 3800.49156 4223.59897 3762.33842 4223.6175 3762.093 4223.58386 3761.67633 4223.48382 3761.27046 4223.31997 3760.88588 4223.09655 3760.53257 4222.81935 3760.21968 4222.49555 3759.9553 4222.13353 3759.74629 4221.74267 3759.59806 4221.33309 3759.51444 4220.91541 3759.49761 4220.50043 3759.548 4220.09891 3759.6643 4219.72125 3759.8435 4219.37722 3760.08096 4219.21793 3760.23397 4219.09703 3760.31374 4218.95565 3760.34522 4218.81232 3760.32428 4218.68585 3760.25368 4218.32442 3759.95465 4217.96353 3759.74629 4217.57267 3759.59806 4217.16309 3759.51444 4216.74541 3759.49761 4216.33043 3759.548 4215.92891 3759.6643 4215.55125 3759.8435 4215.20722 3760.08096 4214.90574 3760.37054 4214.65462 3760.70473 4214.46035 3761.07487 4214.32798 3761.47138 4214.26092 3761.88399 4214.26092 3762.30201 4214.32798 3762.71462 4214.40031 3762.93129 4214.4209 3763.05796 4214.4209 3797.36357 4214.39463 3797.50614 4214.31928 3797.62998 4190.96452 3823.78731 4190.8296 3823.88598 4190.66615 3823.9209 4086.51572 3823.9209 4086.09673 3823.95387 4085.7034 3824.04831 4085.32967 3824.20311 4084.98477 3824.41446 4084.66519 3824.68741 4076.08741 3833.26519 4075.81446 3833.58477 4075.60311 3833.92967 4075.44831 3834.3034 4075.35345 3834.70211 4075.30798 3834.85829 4075.20408 3834.98346 4074.94537 3835.18977 4074.55339 3835.59453 4074.21638 3836.04609 4073.93988 3836.53704 4073.72843 3837.05931 4073.58551 3837.60434 4073.51346 3838.16317 4073.51346 3838.72663 4073.58551 3839.28546 4073.72843 3839.83049 4073.93988 3840.35276 4074.21638 3840.84371 4074.55339 3841.29527 4074.94537 3841.70003 4075.3859 3842.05134 4075.86774 3842.34343 4076.38297 3842.57151 4076.92314 3842.73183 4077.47937 3842.82176 4078.04254 3842.83982 4078.60339 3842.78571 4079.15272 3842.66033 4079.6815 3842.46573 4080.18106 3842.20511 4080.64319 3841.88275 4081.06031 3841.50394 4081.42556 3841.0749 4081.73294 3840.60267 4081.97742 3840.09502 4082.15497 3839.56026 4082.26268 3839.0072 4082.29878 3838.4449 4082.26268 3837.8826 4082.15497 3837.32954 4081.97742 3836.79478 4081.73294 3836.28713 4081.42556 3835.8149 4081.31864 3835.64696 4081.29704 3835.50034 4081.33031 3835.35592 4081.41388 3835.23352 4087.45114 3829.19626 4087.58091 3829.10955 4087.73398 3829.0791 4149.00645 3829.0791 4149.17946 3829.11845 4149.31843 3829.22877 4149.39601 3829.38835 4149.39694 3829.56579 4149.32102 3829.72616 4149.18321 3829.83792 4149.01061 3829.87908 4144.9978 3829.92089 4144.60775 3829.95363 4144.2134 3830.04831 4143.83967 3830.20311 4143.49477 3830.41446 4143.17519 3830.68741 4139.6848 3834.17781 4139.55995 3834.26244 4139.41264 3834.29482 4139.26381 3834.27035 4139.15272 3834.22947 4138.60339 3834.10409 4138.04254 3834.04998 4137.47937 3834.06804 4136.92314 3834.15797 4136.38297 3834.31829 4135.86774 3834.54637 4135.3859 3834.83846 4134.94537 3835.18977 4134.55339 3835.59453 4134.21638 3836.04609 4133.93988 3836.53704 4133.72843 3837.05931 4133.58551 3837.60434 4133.51346 3838.16317 4133.51346 3838.72663 4133.58551 3839.28546 4133.72843 3839.83049 4133.93988 3840.35276 4134.21638 3840.84371 4134.55339 3841.29527 4134.94537 3841.70003 4135.3859 3842.05134 4135.86774 3842.34343 4136.38297 3842.57151 4136.92314 3842.73183 4137.47937 3842.82176 4138.04254 3842.83982 4138.60339 3842.78571 4139.15272 3842.66033 4139.6815 3842.46573 4140.18106 3842.20511 4140.64319 3841.88275 4141.06031 3841.50394 4141.42556 3841.0749 4141.73294 3840.60267 4141.97742 3840.09502 4142.15497 3839.56026 4142.26652 3838.98748 4142.30599 3838.87609 4142.3763 3838.7811 4142.83062 3838.32678 4142.96038 3838.24007 4143.11346 3838.20963 4143.26653 3838.24007 4143.3963 3838.32678 4143.48301 3838.45655 4143.51346 3838.60963 4143.51346 3838.72663 4143.58551 3839.28546 4143.72843 3839.83049 4143.93988 3840.35276 4144.21638 3840.84371 4144.55339 3841.29527 4144.94537 3841.70003 4145.3859 3842.05134 4145.86774 3842.34343 4146.38297 3842.57151 4146.92314 3842.73183 4147.47937 3842.82176 4148.04254 3842.83982 Z M 4137.5081 3752.5791 L 4327.58569 3752.47911 4328.00322 3752.44614 4328.3966 3752.35169 4328.77033 3752.19689 4329.11523 3751.98554 4329.43481 3751.71259 4341.81259 3739.33481 4342.08554 3739.01523 4342.29689 3738.67033 4342.45169 3738.2966 4342.54613 3737.90327 4342.5791 3737.48428 4342.5791 3718.75126 4342.59815 3718.62928 4342.6535 3718.51892 4342.73986 3718.43069 4342.85037 3718.34821 4343.25513 3717.95623 4343.60644 3717.5157 4343.89853 3717.03386 4344.12661 3716.51863 4344.28693 3715.97846 4344.37686 3715.42223 4344.39492 3714.85906 4344.34081 3714.29821 4344.21543 3713.74888 4344.02083 3713.2201 4343.76021 3712.72054 4343.43785 3712.25841 4343.05904 3711.84129 4342.63 3711.47604 4342.15777 3711.16866 4341.65012 3710.92418 4341.11536 3710.74663 4340.5623 3710.63892 4340 3710.60282 4339.4377 3710.63892 4338.88464 3710.74663 4338.34988 3710.92418 4337.84223 3711.16866 4337.37 3711.47604 4336.94096 3711.84129 4336.56215 3712.25841 4336.23979 3712.72054 4335.97917 3713.2201 4335.78457 3713.74888 4335.65919 3714.29821 4335.60508 3714.85906 4335.62314 3715.42223 4335.71307 3715.97846 4335.87339 3716.51863 4336.10147 3717.03386 4336.39356 3717.5157 4336.74487 3717.95623 4337.14963 3718.34821 4337.26014 3718.43069 4337.3465 3718.51892 4337.40185 3718.62928 4337.4209 3718.75126 4337.4209 3736.26602 4337.39045 3736.41909 4337.30374 3736.54886 4326.64821 3747.20439 4326.51854 3747.29106 4326.36558 3747.32155 4138.85196 3747.42019 4138.6865 3747.38446 4138.55064 3747.2835 4134.64827 3742.82089 4134.5689 3742.68099 4134.55105 3742.52113 4134.59762 3742.36716 4134.70108 3742.24399 4134.84469 3742.17153 4135.00523 3742.1615 4135.15674 3742.21553 4135.36774 3742.34343 4135.88297 3742.57151 4136.42314 3742.73183 4136.97937 3742.82176 4137.54254 3742.83982 4138.10339 3742.78571 4138.65272 3742.66033 4139.1815 3742.46573 4139.68106 3742.20511 4140.14319 3741.88275 4140.56031 3741.50394 4140.92556 3741.0749 4141.23294 3740.60267 4141.47742 3740.09502 4141.65497 3739.56026 4141.76268 3739.0072 4141.79878 3738.4449 4141.76268 3737.8826 4141.65497 3737.32954 4141.47742 3736.79478 4141.23294 3736.28713 4140.92556 3735.8149 4140.56031 3735.38586 4140.32018 3735.16778 4140.22333 3735.03358 4140.1891 3734.87167 4140.1891 3731.9791 4140.21955 3731.82603 4140.30626 3731.69626 4140.43603 3731.60955 4140.5891 3731.5791 4323.48428 3731.5791 4323.90327 3731.54613 4324.2966 3731.45169 4324.67033 3731.29689 4325.01523 3731.08554 4325.33481 3730.81259 4331.81159 3724.33581 4332.08454 3724.01623 4332.29589 3723.67133 4332.45069 3723.2976 4332.54513 3722.90427 4332.5781 3722.48528 4332.5781 3718.75201 4332.59715 3718.63003 4332.6525 3718.51967 4332.73886 3718.43144 4332.85037 3718.34821 4333.25513 3717.95623 4333.60644 3717.5157 4333.89853 3717.03386 4334.12661 3716.51863 4334.28693 3715.97846 4334.37686 3715.42223 4334.39492 3714.85906 4334.34081 3714.29821 4334.21543 3713.74888 4334.02083 3713.2201 4333.76021 3712.72054 4333.43785 3712.25841 4333.05904 3711.84129 4332.63 3711.47604 4332.15777 3711.16866 4331.65012 3710.92418 4331.11536 3710.74663 4330.5623 3710.63892 4330 3710.60282 4329.4377 3710.63892 4328.88464 3710.74663 4328.34988 3710.92418 4327.84223 3711.16866 4327.37 3711.47604 4326.94096 3711.84129 4326.56215 3712.25841 4326.23979 3712.72054 4325.97917 3713.2201 4325.78457 3713.74888 4325.65919 3714.29821 4325.60508 3714.85906 4325.62314 3715.42223 4325.71307 3715.97846 4325.87339 3716.51863 4326.10147 3717.03386 4326.39356 3717.5157 4326.74487 3717.95623 4327.14963 3718.34821 4327.25914 3718.42995 4327.3455 3718.51817 4327.40085 3718.62853 4327.4199 3718.75051 4327.4199 3721.26702 4327.38945 3721.42009 4327.30274 3721.54986 4322.54886 3726.30374 4322.41909 3726.39045 4322.26602 3726.4209 4140.5891 3726.4209 4140.43603 3726.39045 4140.30626 3726.30374 4140.21955 3726.17397 4140.1891 3726.0209 4140.1891 3719.36415 4140.22598 3719.1964 4140.32981 3719.05957 4140.67124 3718.76891 4141.05005 3718.35179 4141.37241 3717.88966 4141.63303 3717.3901 4141.82763 3716.86132 4141.95301 3716.31199 4142.00712 3715.75114 4141.98906 3715.18797 4141.89913 3714.63174 4141.73881 3714.09157 4141.51073 3713.57634 4141.21864 3713.0945 4140.86733 3712.65397 4140.46257 3712.26199 4140.01101 3711.92498 4139.52006 3711.64848 4138.99779 3711.43703 4138.45276 3711.29411 4137.89393 3711.22206 4137.33047 3711.22206 4136.77164 3711.29411 4136.22661 3711.43703 4135.70434 3711.64848 4135.21339 3711.92498 4134.76183 3712.26199 4134.35707 3712.65397 4134.00576 3713.0945 4133.71367 3713.57634 4133.48559 3714.09157 4133.32527 3714.63174 4133.23534 3715.18797 4133.21728 3715.75114 4133.27139 3716.31199 4133.39677 3716.86132 4133.59137 3717.3901 4133.85199 3717.88966 4134.17435 3718.35179 4134.55316 3718.76891 4134.89019 3719.05583 4134.99402 3719.19265 4135.0309 3719.36041 4135.0309 3734.5302 4135.01313 3734.6481 4134.9614 3734.75552 4134.8803 3734.84293 4134.44537 3735.18977 4134.05339 3735.59453 4133.71638 3736.04609 4133.43988 3736.53704 4133.22843 3737.05931 4133.08551 3737.60434 4133.01346 3738.16317 4133.01346 3738.72663 4133.08551 3739.28546 4133.22843 3739.83049 4133.36789 3740.17494 4133.39707 3740.33161 4133.36276 3740.48724 4133.27041 3740.61713 4133.13467 3740.70065 4132.97711 3740.72454 4132.82271 3740.68502 4132.69601 3740.58835 4131.8098 3739.57491 4131.74485 3739.47284 4131.71338 3739.35602 4131.71828 3739.23514 4131.76268 3739.0072 4131.79878 3738.4449 4131.76268 3737.8826 4131.65497 3737.32954 4131.47742 3736.79478 4131.23294 3736.28713 4130.92556 3735.8149 4130.56031 3735.38586 4130.14319 3735.00705 4129.68106 3734.68469 4129.1815 3734.42407 4128.65272 3734.22947 4128.10339 3734.10409 4127.54254 3734.04998 4126.97937 3734.06804 4126.42314 3734.15797 4125.88297 3734.31829 4125.36774 3734.54637 4124.8859 3734.83846 4124.44537 3735.18977 4124.05339 3735.59453 4123.71638 3736.04609 4123.43988 3736.53704 4123.22843 3737.05931 4123.08551 3737.60434 4123.01346 3738.16317 4123.01346 3738.72663 4123.08551 3739.28546 4123.22843 3739.83049 4123.43988 3740.35276 4123.71638 3740.84371 4124.05339 3741.29527 4124.44537 3741.70003 4124.8859 3742.05134 4125.36774 3742.34343 4125.88297 3742.57151 4126.42314 3742.73183 4126.97937 3742.82176 4127.54254 3742.83982 4127.71292 3742.8433 4127.82996 3742.88978 4127.92675 3742.97035 4135.55407 3751.69268 4135.6759 3751.82287 4135.8499 3751.98176 4135.98351 3752.08578 4136.18024 3752.2155 4136.32847 3752.29733 4136.54307 3752.39468 4136.70228 3752.45231 4136.92946 3752.51489 4137.09572 3752.54691 4137.3299 3752.57318 4137.5081 3752.5791 Z M 4167.1122 3720.00738 L 4167.6745 3719.97128 4168.22756 3719.86357 4168.76232 3719.68602 4169.26997 3719.44154 4169.7422 3719.13416 4170.17076 3718.76931 4170.57527 3718.3211 4170.70974 3718.22359 4170.87222 3718.1891 4209.37428 3718.1891 4209.79327 3718.15613 4210.1866 3718.06169 4210.56033 3717.90689 4210.90523 3717.69554 4211.22481 3717.42259 4269.17267 3659.47473 4269.27049 3659.40293 4269.38535 3659.36377 4269.50666 3659.36086 4269.71827 3659.38814 4270.28173 3659.38814 4270.84056 3659.31609 4271.38559 3659.17317 4271.90786 3658.96172 4272.39881 3658.68522 4272.85037 3658.34821 4273.25513 3657.95623 4273.60644 3657.5157 4273.89853 3657.03386 4274.12661 3656.51863 4274.28693 3655.97846 4274.37686 3655.42223 4274.39492 3654.85906 4274.34081 3654.29821 4274.21543 3653.74888 4274.02083 3653.2201 4273.76021 3652.72054 4273.43785 3652.25841 4273.05904 3651.84129 4272.63 3651.47604 4272.15777 3651.16866 4271.65012 3650.92418 4271.11536 3650.74663 4270.5623 3650.63892 4270 3650.60282 4269.4377 3650.63892 4268.88464 3650.74663 4268.34988 3650.92418 4267.84223 3651.16866 4267.37 3651.47604 4266.94096 3651.84129 4266.56215 3652.25841 4266.23979 3652.72054 4265.97917 3653.2201 4265.78457 3653.74888 4265.65919 3654.29821 4265.60508 3654.85906 4265.62314 3655.42223 4265.63358 3655.61028 4265.59497 3655.72976 4265.52121 3655.83139 4208.43886 3712.91374 4208.30909 3713.00045 4208.15602 3713.0309 4170.86055 3713.0309 4170.74265 3713.01313 4170.63522 3712.9614 4170.54782 3712.8803 4170.36733 3712.65397 4169.96257 3712.26199 4169.51101 3711.92498 4169.02006 3711.64848 4168.49779 3711.43703 4167.95276 3711.29411 4167.39393 3711.22206 4166.83047 3711.22206 4166.27164 3711.29411 4165.72661 3711.43703 4165.20434 3711.64848 4164.71339 3711.92498 4164.26183 3712.26199 4163.85707 3712.65397 4163.50576 3713.0945 4163.21367 3713.57634 4162.98559 3714.09157 4162.82527 3714.63174 4162.73534 3715.18797 4162.71728 3715.75114 4162.77139 3716.31199 4162.89677 3716.86132 4163.09137 3717.3901 4163.35199 3717.88966 4163.67435 3718.35179 4164.05316 3718.76891 4164.4822 3719.13416 4164.95443 3719.44154 4165.46208 3719.68602 4165.99684 3719.86357 4166.5499 3719.97128 4167.1122 3720.00738 Z M 4356.28673 3664.23613 L 4356.70572 3664.2691 4380.24428 3664.2691 4380.66327 3664.23613 4381.0566 3664.14169 4381.43033 3663.98689 4381.77523 3663.77554 4382.09481 3663.50259 4399.86193 3645.73546 4399.9917 3645.64875 4400.14478 3645.61831 4400.33639 3645.61831 4400.8444 3645.54848 4401.33816 3645.41014 4401.80849 3645.20584 4402.24663 3644.93941 4402.6444 3644.6158 4402.9944 3644.24104 4403.29011 3643.82211 4403.52602 3643.36682 4403.69774 3642.88364 4403.80207 3642.38159 4403.83707 3641.87 4403.80207 3641.35841 4403.69774 3640.85636 4403.52602 3640.37318 4403.29011 3639.91789 4402.9944 3639.49896 4402.6444 3639.1242 4402.24663 3638.80059 4401.80849 3638.53416 4401.33816 3638.32986 4400.8444 3638.19152 4400.33639 3638.12169 4399.82361 3638.12169 4399.3156 3638.19152 4398.82184 3638.32986 4398.35151 3638.53416 4397.91337 3638.80059 4397.5156 3639.1242 4397.1656 3639.49896 4396.86989 3639.91789 4396.63398 3640.37318 4396.46226 3640.85636 4396.35793 3641.35841 4396.32511 3641.83817 4396.29015 3641.97647 4396.20889 3642.09371 4393.73838 3644.56422 4393.59682 3644.6556 4393.43019 3644.68058 4393.26805 3644.63472 4393.13919 3644.52617 4393.06645 3644.37419 4393.06275 3644.20574 4393.12875 3644.05071 4393.29011 3643.82211 4393.52602 3643.36682 4393.69774 3642.88364 4393.80207 3642.38159 4393.83707 3641.87 4393.80207 3641.35841 4393.69774 3640.85636 4393.52602 3640.37318 4393.29011 3639.91789 4392.9944 3639.49896 4392.6444 3639.1242 4392.24663 3638.80059 4391.80849 3638.53416 4391.33816 3638.32986 4390.8444 3638.19152 4390.33639 3638.12169 4389.82361 3638.12169 4389.3156 3638.19152 4388.82184 3638.32986 4388.35151 3638.53416 4387.91337 3638.80059 4387.5156 3639.1242 4387.1656 3639.49896 4386.86989 3639.91789 4386.63398 3640.37318 4386.46226 3640.85636 4386.35793 3641.35841 4386.32511 3641.83817 4386.29015 3641.97647 4386.20889 3642.09371 4384.52084 3643.78176 4384.39107 3643.86847 4384.238 3643.89892 4384.08493 3643.86847 4383.95516 3643.78176 4383.86845 3643.65199 4383.838 3643.49892 4383.838 3639.52965 4383.80924 3639.23764 4383.7298 3638.97575 4383.60079 3638.73439 4383.42717 3638.52283 4383.21561 3638.34921 4382.97425 3638.2202 4382.71236 3638.14076 4382.42035 3638.112 4377.73965 3638.112 4377.44764 3638.14076 4377.18575 3638.2202 4376.94439 3638.34921 4376.73283 3638.52283 4376.55921 3638.73439 4376.4302 3638.97575 4376.35076 3639.23764 4376.322 3639.52965 4376.322 3644.21035 4376.35076 3644.50236 4376.4302 3644.76425 4376.55921 3645.00561 4376.73283 3645.21717 4376.94439 3645.39079 4377.18575 3645.5198 4377.44764 3645.59924 4377.73965 3645.628 4381.70892 3645.628 4381.86199 3645.65845 4381.99176 3645.74516 4382.07847 3645.87493 4382.10892 3646.028 4382.07847 3646.18107 4381.99176 3646.31084 4375.99886 3652.30374 4375.86909 3652.39045 4375.71602 3652.4209 4363.75988 3652.4209 4363.59741 3652.38642 4363.46294 3652.28891 4363.05857 3651.84089 4362.63 3651.47604 4362.15777 3651.16866 4361.65012 3650.92418 4361.11536 3650.74663 4360.5623 3650.63892 4360 3650.60282 4359.4377 3650.63892 4358.88464 3650.74663 4358.34988 3650.92418 4357.84223 3651.16866 4357.37 3651.47604 4356.94096 3651.84129 4356.56215 3652.25841 4356.23979 3652.72054 4355.97917 3653.2201 4355.78457 3653.74888 4355.65919 3654.29821 4355.60508 3654.85906 4355.62314 3655.42223 4355.71307 3655.97846 4355.73521 3656.18743 4355.67153 3656.35031 4355.54444 3656.47046 4355.37824 3656.5249 4355.2047 3656.50323 4355.05699 3656.40959 4354.47879 3655.83139 4354.40503 3655.72976 4354.36642 3655.61028 4354.37686 3655.42223 4354.39492 3654.85906 4354.34081 3654.29821 4354.21543 3653.74888 4354.02083 3653.2201 4353.76021 3652.72054 4353.43785 3652.25841 4353.05904 3651.84129 4352.63 3651.47604 4352.15777 3651.16866 4351.65012 3650.92418 4351.11536 3650.74663 4350.5623 3650.63892 4350 3650.60282 4349.4377 3650.63892 4348.88464 3650.74663 4348.34988 3650.92418 4347.84223 3651.16866 4347.37 3651.47604 4346.94096 3651.84129 4346.56215 3652.25841 4346.23979 3652.72054 4345.97917 3653.2201 4345.78457 3653.74888 4345.65919 3654.29821 4345.60508 3654.85906 4345.62314 3655.42223 4345.71307 3655.97846 4345.87339 3656.51863 4346.10147 3657.03386 4346.39356 3657.5157 4346.74487 3657.95623 4347.14963 3658.34821 4347.60119 3658.68522 4348.09214 3658.96172 4348.61441 3659.17317 4349.15944 3659.31609 4349.71827 3659.38814 4350.28173 3659.38814 4350.49334 3659.36086 4350.61465 3659.36377 4350.72951 3659.40293 4350.82733 3659.47473 4354.85519 3663.50259 4355.17477 3663.77554 4355.51967 3663.98689 4355.8934 3664.14169 4356.28673 3664.23613 Z M 4379.3156 3635.54848 L 4379.82361 3635.61831 4380.33639 3635.61831 4380.8444 3635.54848 4381.33816 3635.41014 4381.80849 3635.20584 4382.24663 3634.93941 4382.6444 3634.6158 4382.9944 3634.24104 4383.29011 3633.82211 4383.52602 3633.36682 4383.69774 3632.88364 4383.80207 3632.38159 4383.83489 3631.90183 4383.86985 3631.76353 4383.95111 3631.64629 4386.42162 3629.17578 4386.56318 3629.0844 4386.72981 3629.05942 4386.89195 3629.10528 4387.02081 3629.21383 4387.09355 3629.36581 4387.09725 3629.53426 4387.03125 3629.68929 4386.86989 3629.91789 4386.63398 3630.37318 4386.46226 3630.85636 4386.35793 3631.35841 4386.32293 3631.87 4386.35793 3632.38159 4386.46226 3632.88364 4386.63398 3633.36682 4386.86989 3633.82211 4387.1656 3634.24104 4387.5156 3634.6158 4387.91337 3634.93941 4388.35151 3635.20584 4388.82184 3635.41014 4389.3156 3635.54848 4389.82361 3635.61831 4390.33639 3635.61831 4390.8444 3635.54848 4391.33816 3635.41014 4391.80849 3635.20584 4392.24663 3634.93941 4392.6444 3634.6158 4392.9944 3634.24104 4393.29011 3633.82211 4393.52602 3633.36682 4393.69774 3632.88364 4393.80207 3632.38159 4393.83707 3631.87 4393.80207 3631.35841 4393.69774 3630.85636 4393.52602 3630.37318 4393.29011 3629.91789 4392.9944 3629.49896 4392.6444 3629.1242 4392.50327 3629.00938 4392.40055 3628.88313 4392.35664 3628.7264 4392.3788 3628.56515 4392.46337 3628.42608 4392.59634 3628.33222 4392.7557 3628.2991 4394.71428 3628.2991 4395.13327 3628.26613 4395.5266 3628.17169 4395.90033 3628.01689 4396.24523 3627.80554 4396.56481 3627.53259 4408.31259 3615.78481 4408.58554 3615.46523 4408.79689 3615.12033 4408.95169 3614.7466 4409.04613 3614.35327 4409.0791 3613.93428 4409.0791 3613.33733 4409.09273 3613.23381 4409.13269 3613.13733 4409.35475 3612.75272 4409.52776 3612.31189 4409.63314 3611.85019 4409.66965 3611.36298 4409.66965 3608.63702 4409.63314 3608.14981 4409.52776 3607.68811 4409.35475 3607.24728 4409.11796 3606.83715 4408.8227 3606.4669 4408.47555 3606.14479 4408.08426 3605.87802 4407.65759 3605.67255 4407.20506 3605.53296 4406.73678 3605.46238 4406.26322 3605.46238 4405.79494 3605.53296 4405.34241 3605.67255 4404.91574 3605.87802 4404.52445 3606.14479 4404.27207 3606.37897 4404.14614 3606.4581 4404 3606.48575 4403.85386 3606.4581 4403.72793 3606.37897 4403.47555 3606.14479 4403.08426 3605.87802 4402.65759 3605.67255 4402.20506 3605.53296 4401.73678 3605.46238 4401.26322 3605.46238 4400.79494 3605.53296 4400.34241 3605.67255 4399.91574 3605.87802 4399.80466 3605.95375 4399.66971 3606.01292 4399.52249 3606.0192 4399.38299 3605.97175 4399.04726 3605.68961 4398.8059 3605.5606 4398.54401 3605.48116 4398.252 3605.4524 4397.63582 3605.4524 4397.63582 3608.1752 4397.93386 3608.1752 4398.09382 3608.20858 4398.22708 3608.30313 4398.31141 3608.44309 4398.33035 3608.63702 4398.33035 3611.36298 4398.31141 3611.55691 4398.22708 3611.69687 4398.09382 3611.79142 4397.93386 3611.8248 4397.63582 3611.8248 4397.63582 3614.5476 4398.252 3614.5476 4398.54401 3614.51884 4398.8059 3614.4394 4399.04726 3614.31039 4399.38299 3614.02825 4399.52249 3613.9808 4399.66971 3613.98708 4399.80466 3614.04625 4399.91574 3614.12198 4400.34241 3614.32745 4400.79494 3614.46704 4401.26322 3614.53762 4401.45237 3614.56807 4401.58214 3614.65478 4401.66885 3614.78455 4401.6993 3614.93762 4401.66885 3615.09069 4401.58214 3615.22046 4393.77886 3623.02374 4393.64909 3623.11045 4393.49602 3623.1409 4386.24572 3623.1409 4385.82673 3623.17387 4385.4334 3623.26831 4385.05967 3623.42311 4384.71477 3623.63446 4384.39519 3623.90741 4380.29807 3628.00454 4380.1683 3628.09125 4380.01522 3628.12169 4379.82361 3628.12169 4379.3156 3628.19152 4378.82184 3628.32986 4378.35151 3628.53416 4377.91337 3628.80059 4377.5156 3629.1242 4377.1656 3629.49896 4376.86989 3629.91789 4376.63398 3630.37318 4376.46226 3630.85636 4376.35793 3631.35841 4376.32293 3631.87 4376.35793 3632.38159 4376.46226 3632.88364 4376.63398 3633.36682 4376.86989 3633.82211 4377.1656 3634.24104 4377.5156 3634.6158 4377.91337 3634.93941 4378.35151 3635.20584 4378.82184 3635.41014 4379.3156 3635.54848 Z M 4033.87639 3635.61831 L 4034.3844 3635.54848 4034.87816 3635.41014 4035.34849 3635.20584 4035.78663 3634.93941 4036.1844 3634.6158 4036.5344 3634.24104 4036.83011 3633.82211 4037.06602 3633.36682 4037.23774 3632.88364 4037.34207 3632.38159 4037.37489 3631.90183 4037.40985 3631.76353 4037.49111 3631.64629 4039.96162 3629.17578 4040.10318 3629.0844 4040.26981 3629.05942 4040.43195 3629.10528 4040.56081 3629.21383 4040.63355 3629.36581 4040.63725 3629.53426 4040.57125 3629.68929 4040.40989 3629.91789 4040.17398 3630.37318 4040.00226 3630.85636 4039.89793 3631.35841 4039.86293 3631.87 4039.89793 3632.38159 4040.00226 3632.88364 4040.17398 3633.36682 4040.40989 3633.82211 4040.7056 3634.24104 4041.0556 3634.6158 4041.45337 3634.93941 4041.89151 3635.20584 4042.36184 3635.41014 4042.8556 3635.54848 4043.36361 3635.61831 4043.87639 3635.61831 4044.3844 3635.54848 4044.87816 3635.41014 4045.34849 3635.20584 4045.78663 3634.93941 4046.1844 3634.6158 4046.5344 3634.24104 4046.83011 3633.82211 4047.06602 3633.36682 4047.23774 3632.88364 4047.34207 3632.38159 4047.37707 3631.87 4047.34207 3631.35841 4047.23774 3630.85636 4047.06602 3630.37318 4046.83011 3629.91789 4046.5344 3629.49896 4046.1844 3629.1242 4045.78663 3628.80059 4045.34849 3628.53416 4044.87816 3628.32986 4044.3844 3628.19152 4043.87639 3628.12169 4043.36361 3628.12169 4042.8556 3628.19152 4042.36184 3628.32986 4041.89151 3628.53416 4041.45011 3628.80258 4041.29481 3628.85734 4041.1306 3628.84491 4040.98533 3628.76737 4040.8836 3628.63787 4040.84266 3628.47837 4040.86945 3628.31588 4040.95943 3628.17797 4045.94114 3623.19626 4046.07091 3623.10955 4046.22398 3623.0791 4068.92997 3623.0791 4069.08933 3623.11222 4069.65891 3623.57121 4070.09729 3623.8378 4070.5679 3624.04221 4071.06195 3624.18064 4071.57026 3624.2505 4072.08334 3624.2505 4072.59165 3624.18064 4073.0857 3624.04221 4073.55631 3623.8378 4073.99469 3623.57121 4074.3927 3623.24741 4074.7429 3622.87243 4075.03879 3622.45325 4075.27484 3621.9977 4075.44666 3621.51424 4075.55105 3621.01189 4075.58607 3620.5 4075.55105 3619.98811 4075.44666 3619.48576 4075.27484 3619.0023 4075.03879 3618.54675 4074.7429 3618.12757 4074.3927 3617.75259 4073.99469 3617.42879 4073.55631 3617.1622 4073.0857 3616.95779 4072.59165 3616.81936 4072.08334 3616.7495 4071.57026 3616.7495 4071.06195 3616.81936 4070.5679 3616.95779 4070.09729 3617.1622 4069.65891 3617.42879 4069.2609 3617.75259 4069.08933 3617.88778 4068.92997 3617.9209 4045.00572 3617.9209 4044.58673 3617.95387 4044.1934 3618.04831 4043.81967 3618.20311 4043.47477 3618.41446 4043.15519 3618.68741 4033.83807 3628.00454 4033.7083 3628.09125 4033.55522 3628.12169 4033.36361 3628.12169 4032.8556 3628.19152 4032.36184 3628.32986 4031.89151 3628.53416 4031.45337 3628.80059 4031.0556 3629.1242 4030.7056 3629.49896 4030.40989 3629.91789 4030.17398 3630.37318 4030.00226 3630.85636 4029.89793 3631.35841 4029.86293 3631.87 4029.89793 3632.38159 4030.00226 3632.88364 4030.17398 3633.36682 4030.40989 3633.82211 4030.7056 3634.24104 4031.0556 3634.6158 4031.45337 3634.93941 4031.89151 3635.20584 4032.36184 3635.41014 4032.8556 3635.54848 4033.36361 3635.61831 4033.87639 3635.61831 Z M 4228.40154 3663.92619 L 4228.69355 3663.95495 4232.59125 3663.95495 4232.88326 3663.92619 4233.14515 3663.84675 4233.33648 3663.76855 4233.4668 3663.76855 4233.65065 3663.84275 4233.91254 3663.92219 4234.20455 3663.95095 4234.91915 3663.95095 4234.91915 3660.39152 4234.4089 3660.39152 4234.25583 3660.36108 4234.12606 3660.27437 4234.03935 3660.1446 4234.0089 3659.99152 4234.0089 3655.46868 4234.03935 3655.3156 4234.12606 3655.18583 4234.25583 3655.09912 4234.4089 3655.06867 4234.91915 3655.06867 4234.91915 3651.50925 4234.20455 3651.50925 4233.91254 3651.53801 4233.65065 3651.61745 4233.45932 3651.69565 4233.329 3651.69565 4233.14515 3651.62145 4232.88326 3651.54201 4232.59125 3651.51325 4228.69355 3651.51325 4228.40154 3651.54201 4228.13965 3651.62145 4227.95156 3651.69792 4227.82124 3651.69792 4227.63315 3651.62145 4227.37126 3651.54201 4227.07925 3651.51325 4223.18155 3651.51325 4222.88954 3651.54201 4222.62765 3651.62145 4222.43956 3651.69792 4222.30924 3651.69792 4222.12115 3651.62145 4221.85926 3651.54201 4221.56725 3651.51325 4217.66955 3651.51325 4217.37754 3651.54201 4217.11565 3651.62145 4216.92756 3651.69792 4216.79724 3651.69792 4216.60915 3651.62145 4216.34726 3651.54201 4216.05525 3651.51325 4212.15755 3651.51325 4211.86554 3651.54201 4211.60365 3651.62145 4211.41556 3651.69792 4211.28524 3651.69792 4211.09715 3651.62145 4210.83526 3651.54201 4210.54325 3651.51325 4206.64555 3651.51325 4206.35354 3651.54201 4206.09165 3651.62145 4205.91154 3651.69365 4205.78123 3651.69365 4205.58615 3651.61345 4205.32426 3651.53401 4205.03225 3651.50525 4201.13455 3651.50525 4200.84254 3651.53401 4200.58065 3651.61345 4200.39304 3651.68966 4200.26273 3651.68966 4200.06015 3651.60545 4199.79826 3651.52601 4199.50625 3651.49725 4195.60855 3651.49725 4195.31654 3651.52601 4195.05465 3651.60545 4194.81329 3651.73446 4194.60173 3651.90808 4194.42811 3652.11964 4194.2991 3652.361 4194.21966 3652.62289 4194.1909 3652.9149 4194.1909 3662.5213 4194.21966 3662.81331 4194.2991 3663.0752 4194.42811 3663.31656 4194.60173 3663.52812 4194.81329 3663.70174 4195.05465 3663.83075 4195.31654 3663.91019 4195.60855 3663.93895 4199.50625 3663.93895 4199.79826 3663.91019 4200.06015 3663.83075 4200.24776 3663.75454 4200.37807 3663.75454 4200.58065 3663.83875 4200.84254 3663.91819 4201.13455 3663.94695 4205.03225 3663.94695 4205.32426 3663.91819 4205.58615 3663.83875 4205.76626 3663.76655 4205.89657 3663.76655 4206.09165 3663.84675 4206.35354 3663.92619 4206.64555 3663.95495 4210.54325 3663.95495 4210.83526 3663.92619 4211.09715 3663.84675 4211.28524 3663.77028 4211.41556 3663.77028 4211.60365 3663.84675 4211.86554 3663.92619 4212.15755 3663.95495 4216.05525 3663.95495 4216.34726 3663.92619 4216.60915 3663.84675 4216.79724 3663.77028 4216.92756 3663.77028 4217.11565 3663.84675 4217.37754 3663.92619 4217.66955 3663.95495 4221.56725 3663.95495 4221.85926 3663.92619 4222.12115 3663.84675 4222.30924 3663.77028 4222.43956 3663.77028 4222.62765 3663.84675 4222.88954 3663.92619 4223.18155 3663.95495 4227.07925 3663.95495 4227.37126 3663.92619 4227.63315 3663.84675 4227.82124 3663.77028 4227.95156 3663.77028 4228.13965 3663.84675 4228.40154 3663.92619 Z M 4387 3671.54681 L 4387.56987 3671.51096 4388.13075 3671.40396 4388.67379 3671.22752 4389.19044 3670.9844 4389.67255 3670.67845 4390.11251 3670.31448 4390.50338 3669.89825 4390.839 3669.4363 4391.11408 3668.93594 4391.32427 3668.40504 4391.46627 3667.85199 4391.53784 3667.2855 4391.53784 3666.7145 4391.49455 3666.37182 4391.49771 3666.25086 4391.53691 3666.13637 4391.60855 3666.03885 4396.06114 3661.58626 4396.19091 3661.49955 4396.34398 3661.4691 4400.57101 3661.4691 4400.70529 3661.49231 4400.82398 3661.55926 4401.30193 3662.166 4401.7238 3662.58787 4402.19344 3662.95581 4402.704 3663.26446 4403.24805 3663.50931 4403.81764 3663.6868 4404.40448 3663.79435 4405 3663.83037 4405.59552 3663.79435 4406.18236 3663.6868 4406.75195 3663.50931 4407.296 3663.26446 4407.80656 3662.95581 4408.2762 3662.58787 4408.69807 3662.166 4409.06601 3661.69636 4409.37466 3661.1858 4409.61951 3660.64175 4409.797 3660.07216 4409.90455 3659.48532 4409.94057 3658.8898 4409.90455 3658.29428 4409.797 3657.70744 4409.61951 3657.13785 4409.37466 3656.5938 4409.06601 3656.08324 4408.69807 3655.6136 4408.2762 3655.19173 4407.80656 3654.82379 4407.296 3654.51514 4406.75195 3654.27029 4406.18236 3654.0928 4405.59552 3653.98525 4405 3653.94923 4404.40448 3653.98525 4403.81764 3654.0928 4403.24805 3654.27029 4402.704 3654.51514 4402.19344 3654.82379 4401.7238 3655.19173 4401.30193 3655.6136 4400.93399 3656.08324 4400.82374 3656.22074 4400.70505 3656.28769 4400.57076 3656.3109 4395.12572 3656.3109 4394.70673 3656.34387 4394.3134 3656.43831 4393.93967 3656.59311 4393.59477 3656.80446 4393.27519 3657.07741 4387.96627 3662.38634 4387.86128 3662.46178 4387.73771 3662.49979 4387 3662.45319 4386.43013 3662.48904 4385.86925 3662.59604 4385.32621 3662.77248 4384.80956 3663.0156 4384.32745 3663.32155 4383.88749 3663.68552 4383.49662 3664.10175 4383.161 3664.5637 4382.88592 3665.06406 4382.67573 3665.59496 4382.53373 3666.14801 4382.46216 3666.7145 4382.46216 3667.2855 4382.53373 3667.85199 4382.67573 3668.40504 4382.88592 3668.93594 4383.161 3669.4363 4383.49662 3669.89825 4383.88749 3670.31448 4384.32745 3670.67845 4384.80956 3670.9844 4385.32621 3671.22752 4385.86925 3671.40396 4386.43013 3671.51096 4387 3671.54681 Z M 4405 3700.05077 L 4405.59552 3700.01475 4406.18236 3699.9072 4406.75195 3699.72971 4407.296 3699.48486 4407.80656 3699.17621 4408.2762 3698.80827 4408.69807 3698.3864 4409.06601 3697.91676 4409.37466 3697.4062 4409.61951 3696.86215 4409.797 3696.29256 4409.90455 3695.70572 4409.94057 3695.1102 4409.90455 3694.51468 4409.797 3693.92784 4409.61951 3693.35825 4409.37466 3692.8142 4409.06601 3692.30364 4408.69807 3691.834 4408.2762 3691.41213 4407.80656 3691.04419 4407.296 3690.73554 4406.75195 3690.49069 4406.18236 3690.3132 4405.59552 3690.20565 4405 3690.16963 4404.40448 3690.20565 4403.81764 3690.3132 4403.24805 3690.49069 4402.704 3690.73554 4402.19344 3691.04419 4401.7238 3691.41213 4401.30193 3691.834 4400.93399 3692.30364 4400.82398 3692.44074 4400.70529 3692.50769 4400.57101 3692.5309 4396.34398 3692.5309 4396.19091 3692.50045 4396.06114 3692.41374 4391.60855 3687.96115 4391.53691 3687.86363 4391.49771 3687.74914 4391.49455 3687.62818 4391.53784 3687.2855 4391.53784 3686.7145 4391.46627 3686.14801 4391.32427 3685.59496 4391.11408 3685.06406 4390.839 3684.5637 4390.50338 3684.10175 4390.11251 3683.68552 4389.67255 3683.32155 4389.19044 3683.0156 4388.67379 3682.77248 4388.13075 3682.59604 4387.56987 3682.48904 4387 3682.45319 4386.43013 3682.48904 4385.86925 3682.59604 4385.32621 3682.77248 4384.80956 3683.0156 4384.32745 3683.32155 4383.88749 3683.68552 4383.49662 3684.10175 4383.161 3684.5637 4382.88592 3685.06406 4382.67573 3685.59496 4382.53373 3686.14801 4382.46216 3686.7145 4382.46216 3687.2855 4382.53373 3687.85199 4382.67573 3688.40504 4382.88592 3688.93594 4383.161 3689.4363 4383.49662 3689.89825 4383.88749 3690.31448 4384.32745 3690.67845 4384.80956 3690.9844 4385.32621 3691.22752 4385.86925 3691.40396 4386.43013 3691.51096 4387 3691.54681 4387.56987 3691.51096 4387.73771 3691.50021 4387.86128 3691.53822 4387.96627 3691.61366 4393.27519 3696.92259 4393.59477 3697.19554 4393.93967 3697.40689 4394.3134 3697.56169 4394.70673 3697.65613 4395.12572 3697.6891 4400.57076 3697.6891 4400.70505 3697.71231 4400.82374 3697.77926 4401.30193 3698.3864 4401.7238 3698.80827 4402.19344 3699.17621 4402.704 3699.48486 4403.24805 3699.72971 4403.81764 3699.9072 4404.40448 3700.01475 4405 3700.05077 Z M 4107.6122 3720.00738 L 4108.1745 3719.97128 4108.72756 3719.86357 4109.26232 3719.68602 4109.76997 3719.44154 4110.2422 3719.13416 4110.67124 3718.76891 4111.05005 3718.35179 4111.37241 3717.88966 4111.63303 3717.3901 4111.82763 3716.86132 4111.95301 3716.31199 4111.96405 3716.19759 4112.01458 3716.03812 4112.1259 3715.91326 4112.27856 3715.84484 4112.44584 3715.84484 4112.5985 3715.91326 4112.70982 3716.03812 4112.76035 3716.19759 4112.77139 3716.31199 4112.89677 3716.86132 4113.09137 3717.3901 4113.35199 3717.88966 4113.67435 3718.35179 4114.05316 3718.76891 4114.4822 3719.13416 4114.95443 3719.44154 4115.46208 3719.68602 4115.99684 3719.86357 4116.5499 3719.97128 4117.1122 3720.00738 4117.6745 3719.97128 4118.22756 3719.86357 4118.76232 3719.68602 4119.26997 3719.44154 4119.7422 3719.13416 4120.17124 3718.76891 4120.55005 3718.35179 4120.87241 3717.88966 4121.13303 3717.3901 4121.32763 3716.86132 4121.45301 3716.31199 4121.50712 3715.75114 4121.48906 3715.18797 4121.39913 3714.63174 4121.23881 3714.09157 4121.01073 3713.57634 4120.71864 3713.0945 4120.36733 3712.65397 4119.96257 3712.26199 4119.51101 3711.92498 4119.02006 3711.64848 4118.49779 3711.43703 4117.95276 3711.29411 4117.39393 3711.22206 4116.83047 3711.22206 4116.27164 3711.29411 4115.72661 3711.43703 4115.20434 3711.64848 4114.71339 3711.92498 4114.26183 3712.26199 4113.85707 3712.65397 4113.50576 3713.0945 4113.21367 3713.57634 4112.98559 3714.09157 4112.82527 3714.63174 4112.75707 3715.05356 4112.7004 3715.20331 4112.58954 3715.31883 4112.44226 3715.38163 4112.28214 3715.38163 4112.13486 3715.31883 4112.024 3715.20331 4111.96733 3715.05356 4111.89913 3714.63174 4111.73881 3714.09157 4111.51073 3713.57634 4111.21864 3713.0945 4110.86733 3712.65397 4110.46257 3712.26199 4110.01101 3711.92498 4109.52006 3711.64848 4108.99779 3711.43703 4108.45276 3711.29411 4107.89393 3711.22206 4107.33047 3711.22206 4106.77164 3711.29411 4106.22661 3711.43703 4105.70434 3711.64848 4105.21339 3711.92498 4104.76183 3712.26199 4104.35707 3712.65397 4104.00576 3713.0945 4103.71367 3713.57634 4103.48559 3714.09157 4103.32527 3714.63174 4103.23534 3715.18797 4103.21728 3715.75114 4103.27139 3716.31199 4103.39677 3716.86132 4103.59137 3717.3901 4103.85199 3717.88966 4104.17435 3718.35179 4104.55316 3718.76891 4104.9822 3719.13416 4105.45443 3719.44154 4105.96208 3719.68602 4106.49684 3719.86357 4107.0499 3719.97128 4107.6122 3720.00738 Z M 4028.96476 3740.26032 L 4029.58817 3740.33319 4030.21583 3740.33319 4030.83924 3740.26032 4031.44997 3740.11558 4032.03977 3739.90091 4032.60066 3739.61922 4033.12506 3739.27432 4033.60587 3738.87087 4034.03659 3738.41433 4034.4114 3737.91088 4034.72522 3737.36731 4034.97382 3736.79099 4035.15384 3736.18971 4035.26283 3735.57159 4035.29932 3734.945 4035.26283 3734.31841 4035.15384 3733.70029 4034.97382 3733.09901 4034.72522 3732.52269 4034.4114 3731.97912 4034.03659 3731.47567 4033.60587 3731.01913 4033.12506 3730.61568 4032.60066 3730.27078 4032.03977 3729.98909 4031.44997 3729.77442 4030.83924 3729.62968 4030.21583 3729.55681 4029.58817 3729.55681 4028.96476 3729.62968 4028.35403 3729.77442 4027.76423 3729.98909 4027.20334 3730.27078 4026.67894 3730.61568 4026.19813 3731.01913 4025.76741 3731.47567 4025.3926 3731.97912 4025.07878 3732.52269 4024.83018 3733.09901 4024.65016 3733.70029 4024.54117 3734.31841 4024.50468 3734.945 4024.54117 3735.57159 4024.65016 3736.18971 4024.83018 3736.79099 4025.07878 3737.36731 4025.3926 3737.91088 4025.76741 3738.41433 4026.19813 3738.87087 4026.67894 3739.27432 4027.20334 3739.61922 4027.76423 3739.90091 4028.35403 3740.11558 4028.96476 3740.26032 Z M 4217.16383 3693.43919 L 4217.78724 3693.36632 4218.39797 3693.22158 4218.98777 3693.00691 4219.54866 3692.72522 4220.07306 3692.38032 4220.55387 3691.97687 4220.98459 3691.52033 4221.3594 3691.01688 4221.67322 3690.47331 4221.92182 3689.89699 4222.10184 3689.29571 4222.21083 3688.67759 4222.24732 3688.051 4222.21083 3687.42441 4222.10184 3686.80629 4221.92182 3686.20501 4221.67322 3685.62869 4221.3594 3685.08512 4220.98459 3684.58167 4220.55387 3684.12513 4220.07306 3683.72168 4219.54866 3683.37678 4218.98777 3683.09509 4218.39797 3682.88042 4217.78724 3682.73568 4217.16383 3682.66281 4216.53617 3682.66281 4215.91276 3682.73568 4215.30203 3682.88042 4214.71223 3683.09509 4214.15134 3683.37678 4213.62694 3683.72168 4213.14613 3684.12513 4212.71541 3684.58167 4212.3406 3685.08512 4212.02678 3685.62869 4211.77818 3686.20501 4211.59816 3686.80629 4211.48917 3687.42441 4211.45268 3688.051 4211.48917 3688.67759 4211.59816 3689.29571 4211.77818 3689.89699 4212.02678 3690.47331 4212.3406 3691.01688 4212.71541 3691.52033 4213.14613 3691.97687 4213.62694 3692.38032 4214.15134 3692.72522 4214.71223 3693.00691 4215.30203 3693.22158 4215.91276 3693.36632 4216.53617 3693.43919 4217.16383 3693.43919 Z M 4029.46476 3847.26032 L 4030.08817 3847.33319 4030.71583 3847.33319 4031.33924 3847.26032 4031.94997 3847.11558 4032.53977 3846.90091 4033.10066 3846.61922 4033.62506 3846.27432 4034.10587 3845.87087 4034.53659 3845.41433 4034.9114 3844.91088 4035.22522 3844.36731 4035.47382 3843.79099 4035.65384 3843.18971 4035.76283 3842.57159 4035.79932 3841.945 4035.76283 3841.31841 4035.65384 3840.70029 4035.47382 3840.09901 4035.22522 3839.52269 4034.9114 3838.97912 4034.53659 3838.47567 4034.10587 3838.01913 4033.62506 3837.61568 4033.10066 3837.27078 4032.53977 3836.98909 4031.94997 3836.77442 4031.33924 3836.62968 4030.71583 3836.55681 4030.08817 3836.55681 4029.46476 3836.62968 4028.85403 3836.77442 4028.26423 3836.98909 4027.70334 3837.27078 4027.17894 3837.61568 4026.69813 3838.01913 4026.26741 3838.47567 4025.8926 3838.97912 4025.57878 3839.52269 4025.33018 3840.09901 4025.15016 3840.70029 4025.04117 3841.31841 4025.00468 3841.945 4025.04117 3842.57159 4025.15016 3843.18971 4025.33018 3843.79099 4025.57878 3844.36731 4025.8926 3844.91088 4026.26741 3845.41433 4026.69813 3845.87087 4027.17894 3846.27432 4027.70334 3846.61922 4028.26423 3846.90091 4028.85403 3847.11558 4029.46476 3847.26032 Z M 4404.21583 3740.33319 L 4404.83924 3740.26032 4405.44997 3740.11558 4406.03977 3739.90091 4406.60066 3739.61922 4407.12506 3739.27432 4407.60587 3738.87087 4408.03659 3738.41433 4408.4114 3737.91088 4408.72522 3737.36731 4408.97382 3736.79099 4409.15384 3736.18971 4409.26283 3735.57159 4409.29932 3734.945 4409.26283 3734.31841 4409.15384 3733.70029 4408.97382 3733.09901 4408.72522 3732.52269 4408.4114 3731.97912 4408.03659 3731.47567 4407.60587 3731.01913 4407.12506 3730.61568 4406.60066 3730.27078 4406.03977 3729.98909 4405.44997 3729.77442 4404.83924 3729.62968 4404.21583 3729.55681 4403.58817 3729.55681 4402.96476 3729.62968 4402.35403 3729.77442 4401.76423 3729.98909 4401.20334 3730.27078 4400.67894 3730.61568 4400.19813 3731.01913 4399.76741 3731.47567 4399.3926 3731.97912 4399.07878 3732.52269 4398.83018 3733.09901 4398.65016 3733.70029 4398.54117 3734.31841 4398.50468 3734.945 4398.54117 3735.57159 4398.65016 3736.18971 4398.83018 3736.79099 4399.07878 3737.36731 4399.3926 3737.91088 4399.76741 3738.41433 4400.19813 3738.87087 4400.67894 3739.27432 4401.20334 3739.61922 4401.76423 3739.90091 4402.35403 3740.11558 4402.96476 3740.26032 4403.58817 3740.33319 4404.21583 3740.33319 Z M 4402.96476 3847.26032 L 4403.58817 3847.33319 4404.21583 3847.33319 4404.83924 3847.26032 4405.44997 3847.11558 4406.03977 3846.90091 4406.60066 3846.61922 4407.12506 3846.27432 4407.60587 3845.87087 4408.03659 3845.41433 4408.4114 3844.91088 4408.72522 3844.36731 4408.97382 3843.79099 4409.15384 3843.18971 4409.26283 3842.57159 4409.29932 3841.945 4409.26283 3841.31841 4409.15384 3840.70029 4408.97382 3840.09901 4408.72522 3839.52269 4408.4114 3838.97912 4408.03659 3838.47567 4407.60587 3838.01913 4407.12506 3837.61568 4406.60066 3837.27078 4406.03977 3836.98909 4405.44997 3836.77442 4404.83924 3836.62968 4404.21583 3836.55681 4403.58817 3836.55681 4402.96476 3836.62968 4402.35403 3836.77442 4401.76423 3836.98909 4401.20334 3837.27078 4400.67894 3837.61568 4400.19813 3838.01913 4399.76741 3838.47567 4399.3926 3838.97912 4399.07878 3839.52269 4398.83018 3840.09901 4398.65016 3840.70029 4398.54117 3841.31841 4398.50468 3841.945 4398.54117 3842.57159 4398.65016 3843.18971 4398.83018 3843.79099 4399.07878 3844.36731 4399.3926 3844.91088 4399.76741 3845.41433 4400.19813 3845.87087 4400.67894 3846.27432 4401.20334 3846.61922 4401.76423 3846.90091 4402.35403 3847.11558 4402.96476 3847.26032 Z M 4390.38916 3709.1243 L 4391.0053 3709.05228 4391.6089 3708.90922 4392.19182 3708.69706 4392.74616 3708.41866 4393.26444 3708.07778 4393.73963 3707.67905 4394.16533 3707.22784 4394.53576 3706.73026 4394.84592 3706.19304 4395.09162 3705.62345 4395.26953 3705.02918 4395.37725 3704.41828 4395.41332 3703.799 4395.37725 3703.17972 4395.26953 3702.56882 4395.09162 3701.97455 4394.84592 3701.40496 4394.53576 3700.86774 4394.16533 3700.37016 4393.73963 3699.91895 4393.26444 3699.52022 4392.74616 3699.17934 4392.19182 3698.90094 4391.6089 3698.68878 4391.0053 3698.54572 4390.38916 3698.4737 4389.76884 3698.4737 4389.1527 3698.54572 4388.5491 3698.68878 4387.96618 3698.90094 4387.41184 3699.17934 4386.89356 3699.52022 4386.41837 3699.91895 4385.99267 3700.37016 4385.62224 3700.86774 4385.31208 3701.40496 4385.06638 3701.97455 4384.88847 3702.56882 4384.78075 3703.17972 4384.74468 3703.799 4384.78075 3704.41828 4384.88847 3705.02918 4385.06638 3705.62345 4385.31208 3706.19304 4385.62224 3706.73026 4385.99267 3707.22784 4386.41837 3707.67905 4386.89356 3708.07778 4387.41184 3708.41866 4387.96618 3708.69706 4388.5491 3708.90922 4389.1527 3709.05228 4389.76884 3709.1243 4390.38916 3709.1243 Z M 4043.93216 3709.1243 L 4044.5483 3709.05228 4045.1519 3708.90922 4045.73482 3708.69706 4046.28916 3708.41866 4046.80744 3708.07778 4047.28263 3707.67905 4047.70833 3707.22784 4048.07876 3706.73026 4048.38892 3706.19304 4048.63462 3705.62345 4048.81253 3705.02918 4048.92025 3704.41828 4048.95632 3703.799 4048.92025 3703.17972 4048.81253 3702.56882 4048.63462 3701.97455 4048.38892 3701.40496 4048.07876 3700.86774 4047.70833 3700.37016 4047.28263 3699.91895 4046.80744 3699.52022 4046.28916 3699.17934 4045.73482 3698.90094 4045.1519 3698.68878 4044.5483 3698.54572 4043.93216 3698.4737 4043.31184 3698.4737 4042.6957 3698.54572 4042.0921 3698.68878 4041.50918 3698.90094 4040.95484 3699.17934 4040.43656 3699.52022 4039.96137 3699.91895 4039.53567 3700.37016 4039.16524 3700.86774 4038.85508 3701.40496 4038.60938 3701.97455 4038.43147 3702.56882 4038.32375 3703.17972 4038.28768 3703.799 4038.32375 3704.41828 4038.43147 3705.02918 4038.60938 3705.62345 4038.85508 3706.19304 4039.16524 3706.73026 4039.53567 3707.22784 4039.96137 3707.67905 4040.43656 3708.07778 4040.95484 3708.41866 4041.50918 3708.69706 4042.0921 3708.90922 4042.6957 3709.05228 4043.31184 3709.1243 4043.93216 3709.1243 Z M 4380.54616 3612.6683 L 4381.1623 3612.59628 4381.7659 3612.45322 4382.34882 3612.24106 4382.90316 3611.96266 4383.42144 3611.62178 4383.89663 3611.22305 4384.32233 3610.77184 4384.69276 3610.27426 4385.00292 3609.73704 4385.24862 3609.16745 4385.42653 3608.57318 4385.53425 3607.96228 4385.57032 3607.343 4385.53425 3606.72372 4385.42653 3606.11282 4385.24862 3605.51855 4385.00292 3604.94896 4384.69276 3604.41174 4384.32233 3603.91416 4383.89663 3603.46295 4383.42144 3603.06422 4382.90316 3602.72334 4382.34882 3602.44494 4381.7659 3602.23278 4381.1623 3602.08972 4380.54616 3602.0177 4379.92584 3602.0177 4379.3097 3602.08972 4378.7061 3602.23278 4378.12318 3602.44494 4377.56884 3602.72334 4377.05056 3603.06422 4376.57537 3603.46295 4376.14967 3603.91416 4375.77924 3604.41174 4375.46908 3604.94896 4375.22338 3605.51855 4375.04547 3606.11282 4374.93775 3606.72372 4374.90168 3607.343 4374.93775 3607.96228 4375.04547 3608.57318 4375.22338 3609.16745 4375.46908 3609.73704 4375.77924 3610.27426 4376.14967 3610.77184 4376.57537 3611.22305 4377.05056 3611.62178 4377.56884 3611.96266 4378.12318 3612.24106 4378.7061 3612.45322 4379.3097 3612.59628 4379.92584 3612.6683 4380.54616 3612.6683 Z M 4034.09016 3612.6683 L 4034.7063 3612.59628 4035.3099 3612.45322 4035.89282 3612.24106 4036.44716 3611.96266 4036.96544 3611.62178 4037.44063 3611.22305 4037.86633 3610.77184 4038.23676 3610.27426 4038.54692 3609.73704 4038.79262 3609.16745 4038.97053 3608.57318 4039.07825 3607.96228 4039.11432 3607.343 4039.07825 3606.72372 4038.97053 3606.11282 4038.79262 3605.51855 4038.54692 3604.94896 4038.23676 3604.41174 4037.86633 3603.91416 4037.44063 3603.46295 4036.96544 3603.06422 4036.44716 3602.72334 4035.89282 3602.44494 4035.3099 3602.23278 4034.7063 3602.08972 4034.09016 3602.0177 4033.46984 3602.0177 4032.8537 3602.08972 4032.2501 3602.23278 4031.66718 3602.44494 4031.11284 3602.72334 4030.59456 3603.06422 4030.11937 3603.46295 4029.69367 3603.91416 4029.32324 3604.41174 4029.01308 3604.94896 4028.76738 3605.51855 4028.58947 3606.11282 4028.48175 3606.72372 4028.44568 3607.343 4028.48175 3607.96228 4028.58947 3608.57318 4028.76738 3609.16745 4029.01308 3609.73704 4029.32324 3610.27426 4029.69367 3610.77184 4030.11937 3611.22305 4030.59456 3611.62178 4031.11284 3611.96266 4031.66718 3612.24106 4032.2501 3612.45322 4032.8537 3612.59628 4033.46984 3612.6683 4034.09016 3612.6683 Z M 4049.5737 3793.69828 L 4050.18984 3793.7703 4050.81016 3793.7703 4051.4263 3793.69828 4052.0299 3793.55522 4052.61282 3793.34306 4053.16716 3793.06466 4053.68544 3792.72378 4054.16063 3792.32505 4054.58633 3791.87384 4054.95676 3791.37626 4055.26692 3790.83904 4055.51262 3790.26945 4055.69053 3789.67518 4055.79825 3789.06428 4055.83432 3788.445 4055.79825 3787.82572 4055.69053 3787.21482 4055.51262 3786.62055 4055.26692 3786.05096 4054.95676 3785.51374 4054.58633 3785.01616 4054.16063 3784.56495 4053.68544 3784.16622 4053.16716 3783.82534 4052.61282 3783.54694 4052.0299 3783.33478 4051.4263 3783.19172 4050.81016 3783.1197 4050.18984 3783.1197 4049.5737 3783.19172 4048.9701 3783.33478 4048.38718 3783.54694 4047.83284 3783.82534 4047.31456 3784.16622 4046.83937 3784.56495 4046.41367 3785.01616 4046.04324 3785.51374 4045.73308 3786.05096 4045.48738 3786.62055 4045.30947 3787.21482 4045.20175 3787.82572 4045.16568 3788.445 4045.20175 3789.06428 4045.30947 3789.67518 4045.48738 3790.26945 4045.73308 3790.83904 4046.04324 3791.37626 4046.41367 3791.87384 4046.83937 3792.32505 4047.31456 3792.72378 4047.83284 3793.06466 4048.38718 3793.34306 4048.9701 3793.55522 4049.5737 3793.69828 Z M 4233.72764 3719.86924 L 4234.01965 3719.898 4239.98035 3719.898 4240.27236 3719.86924 4240.53425 3719.7898 4240.77561 3719.66079 4240.98717 3719.48717 4241.16079 3719.27561 4241.2898 3719.03425 4241.36924 3718.77236 4241.398 3718.48035 4241.398 3712.51965 4241.36924 3712.22764 4241.2898 3711.96575 4241.16079 3711.72439 4240.98717 3711.51283 4240.77561 3711.33921 4240.53425 3711.2102 4240.27236 3711.13076 4239.98035 3711.102 4234.01965 3711.102 4233.72764 3711.13076 4233.46575 3711.2102 4233.22439 3711.33921 4233.01283 3711.51283 4232.83921 3711.72439 4232.7102 3711.96575 4232.63076 3712.22764 4232.602 3712.51965 4232.602 3718.48035 4232.63076 3718.77236 4232.7102 3719.03425 4232.83921 3719.27561 4233.01283 3719.48717 4233.22439 3719.66079 4233.46575 3719.7898 4233.72764 3719.86924 Z M 4360.28173 3719.38814 L 4360.84056 3719.31609 4361.38559 3719.17317 4361.90786 3718.96172 4362.39881 3718.68522 4362.85037 3718.34821 4363.25513 3717.95623 4363.60644 3717.5157 4363.89853 3717.03386 4364.12661 3716.51863 4364.28693 3715.97846 4364.37686 3715.42223 4364.39492 3714.85906 4364.34081 3714.29821 4364.21543 3713.74888 4364.02083 3713.2201 4363.76021 3712.72054 4363.43785 3712.25841 4363.05904 3711.84129 4362.63 3711.47604 4362.15777 3711.16866 4361.65012 3710.92418 4361.11536 3710.74663 4360.5623 3710.63892 4360 3710.60282 4359.4377 3710.63892 4358.88464 3710.74663 4358.34988 3710.92418 4357.84223 3711.16866 4357.37 3711.47604 4356.94096 3711.84129 4356.56215 3712.25841 4356.23979 3712.72054 4355.97917 3713.2201 4355.78457 3713.74888 4355.65919 3714.29821 4355.60508 3714.85906 4355.62314 3715.42223 4355.71307 3715.97846 4355.87339 3716.51863 4356.10147 3717.03386 4356.39356 3717.5157 4356.74487 3717.95623 4357.14963 3718.34821 4357.60119 3718.68522 4358.09214 3718.96172 4358.61441 3719.17317 4359.15944 3719.31609 4359.71827 3719.38814 4360.28173 3719.38814 Z M 4350.28173 3649.38814 L 4350.84056 3649.31609 4351.38559 3649.17317 4351.90786 3648.96172 4352.39881 3648.68522 4352.85037 3648.34821 4353.25513 3647.95623 4353.60644 3647.5157 4353.89853 3647.03386 4354.12661 3646.51863 4354.28693 3645.97846 4354.37686 3645.42223 4354.39492 3644.85906 4354.34081 3644.29821 4354.21543 3643.74888 4354.02083 3643.2201 4353.76021 3642.72054 4353.43785 3642.25841 4353.05904 3641.84129 4352.63 3641.47604 4352.15777 3641.16866 4351.65012 3640.92418 4351.11536 3640.74663 4350.5623 3640.63892 4350 3640.60282 4349.4377 3640.63892 4348.88464 3640.74663 4348.34988 3640.92418 4347.84223 3641.16866 4347.37 3641.47604 4346.94096 3641.84129 4346.56215 3642.25841 4346.23979 3642.72054 4345.97917 3643.2201 4345.78457 3643.74888 4345.65919 3644.29821 4345.60508 3644.85906 4345.62314 3645.42223 4345.71307 3645.97846 4345.87339 3646.51863 4346.10147 3647.03386 4346.39356 3647.5157 4346.74487 3647.95623 4347.14963 3648.34821 4347.60119 3648.68522 4348.09214 3648.96172 4348.61441 3649.17317 4349.15944 3649.31609 4349.71827 3649.38814 4350.28173 3649.38814 Z M 4300.28173 3719.38814 L 4300.84056 3719.31609 4301.38559 3719.17317 4301.90786 3718.96172 4302.39881 3718.68522 4302.85037 3718.34821 4303.25513 3717.95623 4303.60644 3717.5157 4303.89853 3717.03386 4304.12661 3716.51863 4304.28693 3715.97846 4304.37686 3715.42223 4304.39492 3714.85906 4304.34081 3714.29821 4304.21543 3713.74888 4304.02083 3713.2201 4303.76021 3712.72054 4303.43785 3712.25841 4303.05904 3711.84129 4302.63 3711.47604 4302.15777 3711.16866 4301.65012 3710.92418 4301.11536 3710.74663 4300.5623 3710.63892 4300 3710.60282 4299.4377 3710.63892 4298.88464 3710.74663 4298.34988 3710.92418 4297.84223 3711.16866 4297.37 3711.47604 4296.94096 3711.84129 4296.56215 3712.25841 4296.23979 3712.72054 4295.97917 3713.2201 4295.78457 3713.74888 4295.65919 3714.29821 4295.60508 3714.85906 4295.62314 3715.42223 4295.71307 3715.97846 4295.87339 3716.51863 4296.10147 3717.03386 4296.39356 3717.5157 4296.74487 3717.95623 4297.14963 3718.34821 4297.60119 3718.68522 4298.09214 3718.96172 4298.61441 3719.17317 4299.15944 3719.31609 4299.71827 3719.38814 4300.28173 3719.38814 Z M 4320.28173 3659.38814 L 4320.84056 3659.31609 4321.38559 3659.17317 4321.90786 3658.96172 4322.39881 3658.68522 4322.85037 3658.34821 4323.25513 3657.95623 4323.60644 3657.5157 4323.89853 3657.03386 4324.12661 3656.51863 4324.28693 3655.97846 4324.37686 3655.42223 4324.39492 3654.85906 4324.34081 3654.29821 4324.21543 3653.74888 4324.02083 3653.2201 4323.76021 3652.72054 4323.43785 3652.25841 4323.05904 3651.84129 4322.63 3651.47604 4322.15777 3651.16866 4321.65012 3650.92418 4321.11536 3650.74663 4320.5623 3650.63892 4320 3650.60282 4319.4377 3650.63892 4318.88464 3650.74663 4318.34988 3650.92418 4317.84223 3651.16866 4317.37 3651.47604 4316.94096 3651.84129 4316.56215 3652.25841 4316.23979 3652.72054 4315.97917 3653.2201 4315.78457 3653.74888 4315.65919 3654.29821 4315.60508 3654.85906 4315.62314 3655.42223 4315.71307 3655.97846 4315.87339 3656.51863 4316.10147 3657.03386 4316.39356 3657.5157 4316.74487 3657.95623 4317.14963 3658.34821 4317.60119 3658.68522 4318.09214 3658.96172 4318.61441 3659.17317 4319.15944 3659.31609 4319.71827 3659.38814 4320.28173 3659.38814 Z M 4320.28173 3719.38814 L 4320.84056 3719.31609 4321.38559 3719.17317 4321.90786 3718.96172 4322.39881 3718.68522 4322.85037 3718.34821 4323.25513 3717.95623 4323.60644 3717.5157 4323.89853 3717.03386 4324.12661 3716.51863 4324.28693 3715.97846 4324.37686 3715.42223 4324.39492 3714.85906 4324.34081 3714.29821 4324.21543 3713.74888 4324.02083 3713.2201 4323.76021 3712.72054 4323.43785 3712.25841 4323.05904 3711.84129 4322.63 3711.47604 4322.15777 3711.16866 4321.65012 3710.92418 4321.11536 3710.74663 4320.5623 3710.63892 4320 3710.60282 4319.4377 3710.63892 4318.88464 3710.74663 4318.34988 3710.92418 4317.84223 3711.16866 4317.37 3711.47604 4316.94096 3711.84129 4316.56215 3712.25841 4316.23979 3712.72054 4315.97917 3713.2201 4315.78457 3713.74888 4315.65919 3714.29821 4315.60508 3714.85906 4315.62314 3715.42223 4315.71307 3715.97846 4315.87339 3716.51863 4316.10147 3717.03386 4316.39356 3717.5157 4316.74487 3717.95623 4317.14963 3718.34821 4317.60119 3718.68522 4318.09214 3718.96172 4318.61441 3719.17317 4319.15944 3719.31609 4319.71827 3719.38814 4320.28173 3719.38814 Z M 4339.15944 3659.31609 L 4339.71827 3659.38814 4340.28173 3659.38814 4340.84056 3659.31609 4341.38559 3659.17317 4341.90786 3658.96172 4342.39881 3658.68522 4342.85037 3658.34821 4343.25513 3657.95623 4343.60644 3657.5157 4343.89853 3657.03386 4344.12661 3656.51863 4344.28693 3655.97846 4344.37686 3655.42223 4344.39492 3654.85906 4344.34081 3654.29821 4344.21543 3653.74888 4344.02083 3653.2201 4343.76021 3652.72054 4343.43785 3652.25841 4343.05904 3651.84129 4342.63 3651.47604 4342.15777 3651.16866 4341.65012 3650.92418 4341.11536 3650.74663 4340.5623 3650.63892 4340 3650.60282 4339.4377 3650.63892 4338.88464 3650.74663 4338.34988 3650.92418 4337.84223 3651.16866 4337.37 3651.47604 4336.94096 3651.84129 4336.56215 3652.25841 4336.23979 3652.72054 4335.97917 3653.2201 4335.78457 3653.74888 4335.65919 3654.29821 4335.60508 3654.85906 4335.62314 3655.42223 4335.71307 3655.97846 4335.87339 3656.51863 4336.10147 3657.03386 4336.39356 3657.5157 4336.74487 3657.95623 4337.14963 3658.34821 4337.60119 3658.68522 4338.09214 3658.96172 4338.61441 3659.17317 4339.15944 3659.31609 Z M 4280.28173 3659.38814 L 4280.84056 3659.31609 4281.38559 3659.17317 4281.90786 3658.96172 4282.39881 3658.68522 4282.85037 3658.34821 4283.25513 3657.95623 4283.60644 3657.5157 4283.89853 3657.03386 4284.12661 3656.51863 4284.28693 3655.97846 4284.37686 3655.42223 4284.39492 3654.85906 4284.34081 3654.29821 4284.21543 3653.74888 4284.02083 3653.2201 4283.76021 3652.72054 4283.43785 3652.25841 4283.05904 3651.84129 4282.63 3651.47604 4282.15777 3651.16866 4281.65012 3650.92418 4281.11536 3650.74663 4280.5623 3650.63892 4280 3650.60282 4279.4377 3650.63892 4278.88464 3650.74663 4278.34988 3650.92418 4277.84223 3651.16866 4277.37 3651.47604 4276.94096 3651.84129 4276.56215 3652.25841 4276.23979 3652.72054 4275.97917 3653.2201 4275.78457 3653.74888 4275.65919 3654.29821 4275.60508 3654.85906 4275.62314 3655.42223 4275.71307 3655.97846 4275.87339 3656.51863 4276.10147 3657.03386 4276.39356 3657.5157 4276.74487 3657.95623 4277.14963 3658.34821 4277.60119 3658.68522 4278.09214 3658.96172 4278.61441 3659.17317 4279.15944 3659.31609 4279.71827 3659.38814 4280.28173 3659.38814 Z M 4310.28173 3659.38814 L 4310.84056 3659.31609 4311.38559 3659.17317 4311.90786 3658.96172 4312.39881 3658.68522 4312.85037 3658.34821 4313.25513 3657.95623 4313.60644 3657.5157 4313.89853 3657.03386 4314.12661 3656.51863 4314.28693 3655.97846 4314.37686 3655.42223 4314.39492 3654.85906 4314.34081 3654.29821 4314.21543 3653.74888 4314.02083 3653.2201 4313.76021 3652.72054 4313.43785 3652.25841 4313.05904 3651.84129 4312.63 3651.47604 4312.15777 3651.16866 4311.65012 3650.92418 4311.11536 3650.74663 4310.5623 3650.63892 4310 3650.60282 4309.4377 3650.63892 4308.88464 3650.74663 4308.34988 3650.92418 4307.84223 3651.16866 4307.37 3651.47604 4306.94096 3651.84129 4306.56215 3652.25841 4306.23979 3652.72054 4305.97917 3653.2201 4305.78457 3653.74888 4305.65919 3654.29821 4305.60508 3654.85906 4305.62314 3655.42223 4305.71307 3655.97846 4305.87339 3656.51863 4306.10147 3657.03386 4306.39356 3657.5157 4306.74487 3657.95623 4307.14963 3658.34821 4307.60119 3658.68522 4308.09214 3658.96172 4308.61441 3659.17317 4309.15944 3659.31609 4309.71827 3659.38814 4310.28173 3659.38814 Z M 4127.1122 3720.00738 L 4127.6745 3719.97128 4128.22756 3719.86357 4128.76232 3719.68602 4129.26997 3719.44154 4129.7422 3719.13416 4130.17124 3718.76891 4130.55005 3718.35179 4130.87241 3717.88966 4131.13303 3717.3901 4131.32763 3716.86132 4131.45301 3716.31199 4131.50712 3715.75114 4131.48906 3715.18797 4131.39913 3714.63174 4131.23881 3714.09157 4131.01073 3713.57634 4130.71864 3713.0945 4130.36733 3712.65397 4129.96257 3712.26199 4129.51101 3711.92498 4129.02006 3711.64848 4128.49779 3711.43703 4127.95276 3711.29411 4127.39393 3711.22206 4126.83047 3711.22206 4126.27164 3711.29411 4125.72661 3711.43703 4125.20434 3711.64848 4124.71339 3711.92498 4124.26183 3712.26199 4123.85707 3712.65397 4123.50576 3713.0945 4123.21367 3713.57634 4122.98559 3714.09157 4122.82527 3714.63174 4122.73534 3715.18797 4122.71728 3715.75114 4122.77139 3716.31199 4122.89677 3716.86132 4123.09137 3717.3901 4123.35199 3717.88966 4123.67435 3718.35179 4124.05316 3718.76891 4124.4822 3719.13416 4124.95443 3719.44154 4125.46208 3719.68602 4125.99684 3719.86357 4126.5499 3719.97128 4127.1122 3720.00738 Z M 4360.28173 3649.38814 L 4360.84056 3649.31609 4361.38559 3649.17317 4361.90786 3648.96172 4362.39881 3648.68522 4362.85037 3648.34821 4363.25513 3647.95623 4363.60644 3647.5157 4363.89853 3647.03386 4364.12661 3646.51863 4364.28693 3645.97846 4364.37686 3645.42223 4364.39492 3644.85906 4364.34081 3644.29821 4364.21543 3643.74888 4364.02083 3643.2201 4363.76021 3642.72054 4363.43785 3642.25841 4363.05904 3641.84129 4362.63 3641.47604 4362.15777 3641.16866 4361.65012 3640.92418 4361.11536 3640.74663 4360.5623 3640.63892 4360 3640.60282 4359.4377 3640.63892 4358.88464 3640.74663 4358.34988 3640.92418 4357.84223 3641.16866 4357.37 3641.47604 4356.94096 3641.84129 4356.56215 3642.25841 4356.23979 3642.72054 4355.97917 3643.2201 4355.78457 3643.74888 4355.65919 3644.29821 4355.60508 3644.85906 4355.62314 3645.42223 4355.71307 3645.97846 4355.87339 3646.51863 4356.10147 3647.03386 4356.39356 3647.5157 4356.74487 3647.95623 4357.14963 3648.34821 4357.60119 3648.68522 4358.09214 3648.96172 4358.61441 3649.17317 4359.15944 3649.31609 4359.71827 3649.38814 4360.28173 3649.38814 Z M 4147.6122 3720.00738 L 4148.1745 3719.97128 4148.72756 3719.86357 4149.26232 3719.68602 4149.76997 3719.44154 4150.2422 3719.13416 4150.67124 3718.76891 4151.05005 3718.35179 4151.37241 3717.88966 4151.63303 3717.3901 4151.82763 3716.86132 4151.95301 3716.31199 4152.00712 3715.75114 4151.98906 3715.18797 4151.89913 3714.63174 4151.73881 3714.09157 4151.51073 3713.57634 4151.21864 3713.0945 4150.86733 3712.65397 4150.46257 3712.26199 4150.01101 3711.92498 4149.52006 3711.64848 4148.99779 3711.43703 4148.45276 3711.29411 4147.89393 3711.22206 4147.33047 3711.22206 4146.77164 3711.29411 4146.22661 3711.43703 4145.70434 3711.64848 4145.21339 3711.92498 4144.76183 3712.26199 4144.35707 3712.65397 4144.00576 3713.0945 4143.71367 3713.57634 4143.48559 3714.09157 4143.32527 3714.63174 4143.23534 3715.18797 4143.21728 3715.75114 4143.27139 3716.31199 4143.39677 3716.86132 4143.59137 3717.3901 4143.85199 3717.88966 4144.17435 3718.35179 4144.55316 3718.76891 4144.9822 3719.13416 4145.45443 3719.44154 4145.96208 3719.68602 4146.49684 3719.86357 4147.0499 3719.97128 4147.6122 3720.00738 Z M 4299.15944 3659.31609 L 4299.71827 3659.38814 4300.28173 3659.38814 4300.84056 3659.31609 4301.38559 3659.17317 4301.90786 3658.96172 4302.39881 3658.68522 4302.85037 3658.34821 4303.25513 3657.95623 4303.60644 3657.5157 4303.89853 3657.03386 4304.12661 3656.51863 4304.28693 3655.97846 4304.37686 3655.42223 4304.39492 3654.85906 4304.34081 3654.29821 4304.21543 3653.74888 4304.02083 3653.2201 4303.76021 3652.72054 4303.43785 3652.25841 4303.05904 3651.84129 4302.63 3651.47604 4302.15777 3651.16866 4301.65012 3650.92418 4301.11536 3650.74663 4300.5623 3650.63892 4300 3650.60282 4299.4377 3650.63892 4298.88464 3650.74663 4298.34988 3650.92418 4297.84223 3651.16866 4297.37 3651.47604 4296.94096 3651.84129 4296.56215 3652.25841 4296.23979 3652.72054 4295.97917 3653.2201 4295.78457 3653.74888 4295.65919 3654.29821 4295.60508 3654.85906 4295.62314 3655.42223 4295.71307 3655.97846 4295.87339 3656.51863 4296.10147 3657.03386 4296.39356 3657.5157 4296.74487 3657.95623 4297.14963 3658.34821 4297.60119 3658.68522 4298.09214 3658.96172 4298.61441 3659.17317 4299.15944 3659.31609 Z M 4309.15944 3649.31609 L 4309.71827 3649.38814 4310.28173 3649.38814 4310.84056 3649.31609 4311.38559 3649.17317 4311.90786 3648.96172 4312.39881 3648.68522 4312.85037 3648.34821 4313.25513 3647.95623 4313.60644 3647.5157 4313.89853 3647.03386 4314.12661 3646.51863 4314.28693 3645.97846 4314.37686 3645.42223 4314.39492 3644.85906 4314.34081 3644.29821 4314.21543 3643.74888 4314.02083 3643.2201 4313.76021 3642.72054 4313.43785 3642.25841 4313.05904 3641.84129 4312.63 3641.47604 4312.15777 3641.16866 4311.65012 3640.92418 4311.11536 3640.74663 4310.5623 3640.63892 4310 3640.60282 4309.4377 3640.63892 4308.88464 3640.74663 4308.34988 3640.92418 4307.84223 3641.16866 4307.37 3641.47604 4306.94096 3641.84129 4306.56215 3642.25841 4306.23979 3642.72054 4305.97917 3643.2201 4305.78457 3643.74888 4305.65919 3644.29821 4305.60508 3644.85906 4305.62314 3645.42223 4305.71307 3645.97846 4305.87339 3646.51863 4306.10147 3647.03386 4306.39356 3647.5157 4306.74487 3647.95623 4307.14963 3648.34821 4307.60119 3648.68522 4308.09214 3648.96172 4308.61441 3649.17317 4309.15944 3649.31609 Z M 4329.15944 3659.31609 L 4329.71827 3659.38814 4330.28173 3659.38814 4330.84056 3659.31609 4331.38559 3659.17317 4331.90786 3658.96172 4332.39881 3658.68522 4332.85037 3658.34821 4333.25513 3657.95623 4333.60644 3657.5157 4333.89853 3657.03386 4334.12661 3656.51863 4334.28693 3655.97846 4334.37686 3655.42223 4334.39492 3654.85906 4334.34081 3654.29821 4334.21543 3653.74888 4334.02083 3653.2201 4333.76021 3652.72054 4333.43785 3652.25841 4333.05904 3651.84129 4332.63 3651.47604 4332.15777 3651.16866 4331.65012 3650.92418 4331.11536 3650.74663 4330.5623 3650.63892 4330 3650.60282 4329.4377 3650.63892 4328.88464 3650.74663 4328.34988 3650.92418 4327.84223 3651.16866 4327.37 3651.47604 4326.94096 3651.84129 4326.56215 3652.25841 4326.23979 3652.72054 4325.97917 3653.2201 4325.78457 3653.74888 4325.65919 3654.29821 4325.60508 3654.85906 4325.62314 3655.42223 4325.71307 3655.97846 4325.87339 3656.51863 4326.10147 3657.03386 4326.39356 3657.5157 4326.74487 3657.95623 4327.14963 3658.34821 4327.60119 3658.68522 4328.09214 3658.96172 4328.61441 3659.17317 4329.15944 3659.31609 Z M 4319.15944 3649.31609 L 4319.71827 3649.38814 4320.28173 3649.38814 4320.84056 3649.31609 4321.38559 3649.17317 4321.90786 3648.96172 4322.39881 3648.68522 4322.85037 3648.34821 4323.25513 3647.95623 4323.60644 3647.5157 4323.89853 3647.03386 4324.12661 3646.51863 4324.28693 3645.97846 4324.37686 3645.42223 4324.39492 3644.85906 4324.34081 3644.29821 4324.21543 3643.74888 4324.02083 3643.2201 4323.76021 3642.72054 4323.43785 3642.25841 4323.05904 3641.84129 4322.63 3641.47604 4322.15777 3641.16866 4321.65012 3640.92418 4321.11536 3640.74663 4320.5623 3640.63892 4320 3640.60282 4319.4377 3640.63892 4318.88464 3640.74663 4318.34988 3640.92418 4317.84223 3641.16866 4317.37 3641.47604 4316.94096 3641.84129 4316.56215 3642.25841 4316.23979 3642.72054 4315.97917 3643.2201 4315.78457 3643.74888 4315.65919 3644.29821 4315.60508 3644.85906 4315.62314 3645.42223 4315.71307 3645.97846 4315.87339 3646.51863 4316.10147 3647.03386 4316.39356 3647.5157 4316.74487 3647.95623 4317.14963 3648.34821 4317.60119 3648.68522 4318.09214 3648.96172 4318.61441 3649.17317 4319.15944 3649.31609 Z M 4310.28173 3719.38814 L 4310.84056 3719.31609 4311.38559 3719.17317 4311.90786 3718.96172 4312.39881 3718.68522 4312.85037 3718.34821 4313.25513 3717.95623 4313.60644 3717.5157 4313.89853 3717.03386 4314.12661 3716.51863 4314.28693 3715.97846 4314.37686 3715.42223 4314.39492 3714.85906 4314.34081 3714.29821 4314.21543 3713.74888 4314.02083 3713.2201 4313.76021 3712.72054 4313.43785 3712.25841 4313.05904 3711.84129 4312.63 3711.47604 4312.15777 3711.16866 4311.65012 3710.92418 4311.11536 3710.74663 4310.5623 3710.63892 4310 3710.60282 4309.4377 3710.63892 4308.88464 3710.74663 4308.34988 3710.92418 4307.84223 3711.16866 4307.37 3711.47604 4306.94096 3711.84129 4306.56215 3712.25841 4306.23979 3712.72054 4305.97917 3713.2201 4305.78457 3713.74888 4305.65919 3714.29821 4305.60508 3714.85906 4305.62314 3715.42223 4305.71307 3715.97846 4305.87339 3716.51863 4306.10147 3717.03386 4306.39356 3717.5157 4306.74487 3717.95623 4307.14963 3718.34821 4307.60119 3718.68522 4308.09214 3718.96172 4308.61441 3719.17317 4309.15944 3719.31609 4309.71827 3719.38814 4310.28173 3719.38814 Z M 4289.15944 3659.31609 L 4289.71827 3659.38814 4290.28173 3659.38814 4290.84056 3659.31609 4291.38559 3659.17317 4291.90786 3658.96172 4292.39881 3658.68522 4292.85037 3658.34821 4293.25513 3657.95623 4293.60644 3657.5157 4293.89853 3657.03386 4294.12661 3656.51863 4294.28693 3655.97846 4294.37686 3655.42223 4294.39492 3654.85906 4294.34081 3654.29821 4294.21543 3653.74888 4294.02083 3653.2201 4293.76021 3652.72054 4293.43785 3652.25841 4293.05904 3651.84129 4292.63 3651.47604 4292.15777 3651.16866 4291.65012 3650.92418 4291.11536 3650.74663 4290.5623 3650.63892 4290 3650.60282 4289.4377 3650.63892 4288.88464 3650.74663 4288.34988 3650.92418 4287.84223 3651.16866 4287.37 3651.47604 4286.94096 3651.84129 4286.56215 3652.25841 4286.23979 3652.72054 4285.97917 3653.2201 4285.78457 3653.74888 4285.65919 3654.29821 4285.60508 3654.85906 4285.62314 3655.42223 4285.71307 3655.97846 4285.87339 3656.51863 4286.10147 3657.03386 4286.39356 3657.5157 4286.74487 3657.95623 4287.14963 3658.34821 4287.60119 3658.68522 4288.09214 3658.96172 4288.61441 3659.17317 4289.15944 3659.31609 Z M 4107.54254 3742.83982 L 4108.10339 3742.78571 4108.65272 3742.66033 4109.1815 3742.46573 4109.68106 3742.20511 4110.14319 3741.88275 4110.56031 3741.50394 4110.92556 3741.0749 4111.23294 3740.60267 4111.47742 3740.09502 4111.65497 3739.56026 4111.76268 3739.0072 4111.79878 3738.4449 4111.76268 3737.8826 4111.65497 3737.32954 4111.47742 3736.79478 4111.23294 3736.28713 4110.92556 3735.8149 4110.56031 3735.38586 4110.14319 3735.00705 4109.68106 3734.68469 4109.1815 3734.42407 4108.65272 3734.22947 4108.10339 3734.10409 4107.54254 3734.04998 4106.97937 3734.06804 4106.42314 3734.15797 4105.88297 3734.31829 4105.36774 3734.54637 4104.8859 3734.83846 4104.44537 3735.18977 4104.05339 3735.59453 4103.71638 3736.04609 4103.43988 3736.53704 4103.22843 3737.05931 4103.08551 3737.60434 4103.01346 3738.16317 4103.01346 3738.72663 4103.08551 3739.28546 4103.22843 3739.83049 4103.43988 3740.35276 4103.71638 3740.84371 4104.05339 3741.29527 4104.44537 3741.70003 4104.8859 3742.05134 4105.36774 3742.34343 4105.88297 3742.57151 4106.42314 3742.73183 4106.97937 3742.82176 4107.54254 3742.83982 Z M 4157.54254 3742.83982 L 4158.10339 3742.78571 4158.65272 3742.66033 4159.1815 3742.46573 4159.68106 3742.20511 4160.14319 3741.88275 4160.56031 3741.50394 4160.92556 3741.0749 4161.23294 3740.60267 4161.47742 3740.09502 4161.65497 3739.56026 4161.76268 3739.0072 4161.79878 3738.4449 4161.76268 3737.8826 4161.65497 3737.32954 4161.47742 3736.79478 4161.23294 3736.28713 4160.92556 3735.8149 4160.56031 3735.38586 4160.14319 3735.00705 4159.68106 3734.68469 4159.1815 3734.42407 4158.65272 3734.22947 4158.10339 3734.10409 4157.54254 3734.04998 4156.97937 3734.06804 4156.42314 3734.15797 4155.88297 3734.31829 4155.36774 3734.54637 4154.8859 3734.83846 4154.44537 3735.18977 4154.05339 3735.59453 4153.71638 3736.04609 4153.43988 3736.53704 4153.22843 3737.05931 4153.08551 3737.60434 4153.01346 3738.16317 4153.01346 3738.72663 4153.08551 3739.28546 4153.22843 3739.83049 4153.43988 3740.35276 4153.71638 3740.84371 4154.05339 3741.29527 4154.44537 3741.70003 4154.8859 3742.05134 4155.36774 3742.34343 4155.88297 3742.57151 4156.42314 3742.73183 4156.97937 3742.82176 4157.54254 3742.83982 Z M 4147.54254 3742.83982 L 4148.10339 3742.78571 4148.65272 3742.66033 4149.1815 3742.46573 4149.68106 3742.20511 4150.14319 3741.88275 4150.56031 3741.50394 4150.92556 3741.0749 4151.23294 3740.60267 4151.47742 3740.09502 4151.65497 3739.56026 4151.76268 3739.0072 4151.79878 3738.4449 4151.76268 3737.8826 4151.65497 3737.32954 4151.47742 3736.79478 4151.23294 3736.28713 4150.92556 3735.8149 4150.56031 3735.38586 4150.14319 3735.00705 4149.68106 3734.68469 4149.1815 3734.42407 4148.65272 3734.22947 4148.10339 3734.10409 4147.54254 3734.04998 4146.97937 3734.06804 4146.42314 3734.15797 4145.88297 3734.31829 4145.36774 3734.54637 4144.8859 3734.83846 4144.44537 3735.18977 4144.05339 3735.59453 4143.71638 3736.04609 4143.43988 3736.53704 4143.22843 3737.05931 4143.08551 3737.60434 4143.01346 3738.16317 4143.01346 3738.72663 4143.08551 3739.28546 4143.22843 3739.83049 4143.43988 3740.35276 4143.71638 3740.84371 4144.05339 3741.29527 4144.44537 3741.70003 4144.8859 3742.05134 4145.36774 3742.34343 4145.88297 3742.57151 4146.42314 3742.73183 4146.97937 3742.82176 4147.54254 3742.83982 Z M 4118.04254 3842.83982 L 4118.60339 3842.78571 4119.15272 3842.66033 4119.6815 3842.46573 4120.18106 3842.20511 4120.64319 3841.88275 4121.06031 3841.50394 4121.42556 3841.0749 4121.73294 3840.60267 4121.97742 3840.09502 4122.15497 3839.56026 4122.26268 3839.0072 4122.29878 3838.4449 4122.26268 3837.8826 4122.15497 3837.32954 4121.97742 3836.79478 4121.73294 3836.28713 4121.42556 3835.8149 4121.06031 3835.38586 4120.64319 3835.00705 4120.18106 3834.68469 4119.6815 3834.42407 4119.15272 3834.22947 4118.60339 3834.10409 4118.04254 3834.04998 4117.47937 3834.06804 4116.92314 3834.15797 4116.38297 3834.31829 4115.86774 3834.54637 4115.3859 3834.83846 4114.94537 3835.18977 4114.55339 3835.59453 4114.21638 3836.04609 4113.93988 3836.53704 4113.72843 3837.05931 4113.58551 3837.60434 4113.51346 3838.16317 4113.51346 3838.72663 4113.58551 3839.28546 4113.72843 3839.83049 4113.93988 3840.35276 4114.21638 3840.84371 4114.55339 3841.29527 4114.94537 3841.70003 4115.3859 3842.05134 4115.86774 3842.34343 4116.38297 3842.57151 4116.92314 3842.73183 4117.47937 3842.82176 4118.04254 3842.83982 Z M 4166.97937 3742.82176 L 4167.54254 3742.83982 4168.10339 3742.78571 4168.65272 3742.66033 4169.1815 3742.46573 4169.68106 3742.20511 4170.14319 3741.88275 4170.56031 3741.50394 4170.92556 3741.0749 4171.23294 3740.60267 4171.47742 3740.09502 4171.65497 3739.56026 4171.76268 3739.0072 4171.79878 3738.4449 4171.76268 3737.8826 4171.65497 3737.32954 4171.47742 3736.79478 4171.23294 3736.28713 4170.92556 3735.8149 4170.56031 3735.38586 4170.14319 3735.00705 4169.68106 3734.68469 4169.1815 3734.42407 4168.65272 3734.22947 4168.10339 3734.10409 4167.54254 3734.04998 4166.97937 3734.06804 4166.42314 3734.15797 4165.88297 3734.31829 4165.36774 3734.54637 4164.8859 3734.83846 4164.44537 3735.18977 4164.05339 3735.59453 4163.71638 3736.04609 4163.43988 3736.53704 4163.22843 3737.05931 4163.08551 3737.60434 4163.01346 3738.16317 4163.01346 3738.72663 4163.08551 3739.28546 4163.22843 3739.83049 4163.43988 3740.35276 4163.71638 3740.84371 4164.05339 3741.29527 4164.44537 3741.70003 4164.8859 3742.05134 4165.36774 3742.34343 4165.88297 3742.57151 4166.42314 3742.73183 4166.97937 3742.82176 Z M 4107.47937 3842.82176 L 4108.04254 3842.83982 4108.60339 3842.78571 4109.15272 3842.66033 4109.6815 3842.46573 4110.18106 3842.20511 4110.64319 3841.88275 4111.06031 3841.50394 4111.42556 3841.0749 4111.73294 3840.60267 4111.97742 3840.09502 4112.15497 3839.56026 4112.26268 3839.0072 4112.29878 3838.4449 4112.26268 3837.8826 4112.15497 3837.32954 4111.97742 3836.79478 4111.73294 3836.28713 4111.42556 3835.8149 4111.06031 3835.38586 4110.64319 3835.00705 4110.18106 3834.68469 4109.6815 3834.42407 4109.15272 3834.22947 4108.60339 3834.10409 4108.04254 3834.04998 4107.47937 3834.06804 4106.92314 3834.15797 4106.38297 3834.31829 4105.86774 3834.54637 4105.3859 3834.83846 4104.94537 3835.18977 4104.55339 3835.59453 4104.21638 3836.04609 4103.93988 3836.53704 4103.72843 3837.05931 4103.58551 3837.60434 4103.51346 3838.16317 4103.51346 3838.72663 4103.58551 3839.28546 4103.72843 3839.83049 4103.93988 3840.35276 4104.21638 3840.84371 4104.55339 3841.29527 4104.94537 3841.70003 4105.3859 3842.05134 4105.86774 3842.34343 4106.38297 3842.57151 4106.92314 3842.73183 4107.47937 3842.82176 Z M 4128.04254 3842.83982 L 4128.60339 3842.78571 4129.15272 3842.66033 4129.6815 3842.46573 4130.18106 3842.20511 4130.64319 3841.88275 4131.06031 3841.50394 4131.42556 3841.0749 4131.73294 3840.60267 4131.97742 3840.09502 4132.15497 3839.56026 4132.26268 3839.0072 4132.29878 3838.4449 4132.26268 3837.8826 4132.15497 3837.32954 4131.97742 3836.79478 4131.73294 3836.28713 4131.42556 3835.8149 4131.06031 3835.38586 4130.64319 3835.00705 4130.18106 3834.68469 4129.6815 3834.42407 4129.15272 3834.22947 4128.60339 3834.10409 4128.04254 3834.04998 4127.47937 3834.06804 4126.92314 3834.15797 4126.38297 3834.31829 4125.86774 3834.54637 4125.3859 3834.83846 4124.94537 3835.18977 4124.55339 3835.59453 4124.21638 3836.04609 4123.93988 3836.53704 4123.72843 3837.05931 4123.58551 3837.60434 4123.51346 3838.16317 4123.51346 3838.72663 4123.58551 3839.28546 4123.72843 3839.83049 4123.93988 3840.35276 4124.21638 3840.84371 4124.55339 3841.29527 4124.94537 3841.70003 4125.3859 3842.05134 4125.86774 3842.34343 4126.38297 3842.57151 4126.92314 3842.73183 4127.47937 3842.82176 4128.04254 3842.83982 Z M 4097.6122 3720.00738 L 4098.1745 3719.97128 4098.72756 3719.86357 4099.26232 3719.68602 4099.76997 3719.44154 4100.2422 3719.13416 4100.67124 3718.76891 4101.05005 3718.35179 4101.37241 3717.88966 4101.63303 3717.3901 4101.82763 3716.86132 4101.95301 3716.31199 4102.00712 3715.75114 4101.98906 3715.18797 4101.89913 3714.63174 4101.73881 3714.09157 4101.51073 3713.57634 4101.21864 3713.0945 4100.86733 3712.65397 4100.46257 3712.26199 4100.01101 3711.92498 4099.52006 3711.64848 4098.99779 3711.43703 4098.45276 3711.29411 4097.89393 3711.22206 4097.33047 3711.22206 4096.77164 3711.29411 4096.22661 3711.43703 4095.70434 3711.64848 4095.21339 3711.92498 4094.76183 3712.26199 4094.35707 3712.65397 4094.00576 3713.0945 4093.71367 3713.57634 4093.48559 3714.09157 4093.32527 3714.63174 4093.23534 3715.18797 4093.21728 3715.75114 4093.27139 3716.31199 4093.39677 3716.86132 4093.59137 3717.3901 4093.85199 3717.88966 4094.17435 3718.35179 4094.55316 3718.76891 4094.9822 3719.13416 4095.45443 3719.44154 4095.96208 3719.68602 4096.49684 3719.86357 4097.0499 3719.97128 4097.6122 3720.00738 Z M 4047.47937 3842.82176 L 4048.04254 3842.83982 4048.60339 3842.78571 4049.15272 3842.66033 4049.6815 3842.46573 4050.18106 3842.20511 4050.64319 3841.88275 4051.06031 3841.50394 4051.42556 3841.0749 4051.73294 3840.60267 4051.97742 3840.09502 4052.15497 3839.56026 4052.26268 3839.0072 4052.29878 3838.4449 4052.26268 3837.8826 4052.15497 3837.32954 4051.97742 3836.79478 4051.73294 3836.28713 4051.42556 3835.8149 4051.06031 3835.38586 4050.64319 3835.00705 4050.18106 3834.68469 4049.6815 3834.42407 4049.15272 3834.22947 4048.60339 3834.10409 4048.04254 3834.04998 4047.47937 3834.06804 4046.92314 3834.15797 4046.38297 3834.31829 4045.86774 3834.54637 4045.3859 3834.83846 4044.94537 3835.18977 4044.55339 3835.59453 4044.21638 3836.04609 4043.93988 3836.53704 4043.72843 3837.05931 4043.58551 3837.60434 4043.51346 3838.16317 4043.51346 3838.72663 4043.58551 3839.28546 4043.72843 3839.83049 4043.93988 3840.35276 4044.21638 3840.84371 4044.55339 3841.29527 4044.94537 3841.70003 4045.3859 3842.05134 4045.86774 3842.34343 4046.38297 3842.57151 4046.92314 3842.73183 4047.47937 3842.82176 Z M 4098.04254 3842.83982 L 4098.60339 3842.78571 4099.15272 3842.66033 4099.6815 3842.46573 4100.18106 3842.20511 4100.64319 3841.88275 4101.06031 3841.50394 4101.42556 3841.0749 4101.73294 3840.60267 4101.97742 3840.09502 4102.15497 3839.56026 4102.26268 3839.0072 4102.29878 3838.4449 4102.26268 3837.8826 4102.15497 3837.32954 4101.97742 3836.79478 4101.73294 3836.28713 4101.42556 3835.8149 4101.06031 3835.38586 4100.64319 3835.00705 4100.18106 3834.68469 4099.6815 3834.42407 4099.15272 3834.22947 4098.60339 3834.10409 4098.04254 3834.04998 4097.47937 3834.06804 4096.92314 3834.15797 4096.38297 3834.31829 4095.86774 3834.54637 4095.3859 3834.83846 4094.94537 3835.18977 4094.55339 3835.59453 4094.21638 3836.04609 4093.93988 3836.53704 4093.72843 3837.05931 4093.58551 3837.60434 4093.51346 3838.16317 4093.51346 3838.72663 4093.58551 3839.28546 4093.72843 3839.83049 4093.93988 3840.35276 4094.21638 3840.84371 4094.55339 3841.29527 4094.94537 3841.70003 4095.3859 3842.05134 4095.86774 3842.34343 4096.38297 3842.57151 4096.92314 3842.73183 4097.47937 3842.82176 4098.04254 3842.83982 Z M 4058.04254 3842.83982 L 4058.60339 3842.78571 4059.15272 3842.66033 4059.6815 3842.46573 4060.18106 3842.20511 4060.64319 3841.88275 4061.06031 3841.50394 4061.42556 3841.0749 4061.73294 3840.60267 4061.97742 3840.09502 4062.15497 3839.56026 4062.26268 3839.0072 4062.29878 3838.4449 4062.26268 3837.8826 4062.15497 3837.32954 4061.97742 3836.79478 4061.73294 3836.28713 4061.42556 3835.8149 4061.06031 3835.38586 4060.64319 3835.00705 4060.18106 3834.68469 4059.6815 3834.42407 4059.15272 3834.22947 4058.60339 3834.10409 4058.04254 3834.04998 4057.47937 3834.06804 4056.92314 3834.15797 4056.38297 3834.31829 4055.86774 3834.54637 4055.3859 3834.83846 4054.94537 3835.18977 4054.55339 3835.59453 4054.21638 3836.04609 4053.93988 3836.53704 4053.72843 3837.05931 4053.58551 3837.60434 4053.51346 3838.16317 4053.51346 3838.72663 4053.58551 3839.28546 4053.72843 3839.83049 4053.93988 3840.35276 4054.21638 3840.84371 4054.55339 3841.29527 4054.94537 3841.70003 4055.3859 3842.05134 4055.86774 3842.34343 4056.38297 3842.57151 4056.92314 3842.73183 4057.47937 3842.82176 4058.04254 3842.83982 Z M 4067.06104 3842.76099 L 4067.61987 3842.83304 4068.18333 3842.83304 4068.74216 3842.76099 4069.28719 3842.61807 4069.80946 3842.40662 4070.30041 3842.13012 4070.75197 3841.79311 4071.15673 3841.40113 4071.50804 3840.9606 4071.80013 3840.47876 4072.02821 3839.96353 4072.18853 3839.42336 4072.27846 3838.86713 4072.29652 3838.30396 4072.24241 3837.74311 4072.11703 3837.19378 4071.92243 3836.665 4071.66181 3836.16544 4071.33945 3835.70331 4070.96064 3835.28619 4070.5316 3834.92094 4070.05937 3834.61356 4069.55172 3834.36908 4069.01696 3834.19153 4068.4639 3834.08382 4067.9016 3834.04772 4067.3393 3834.08382 4066.78624 3834.19153 4066.25148 3834.36908 4065.74383 3834.61356 4065.2716 3834.92094 4064.84256 3835.28619 4064.46375 3835.70331 4064.14139 3836.16544 4063.88077 3836.665 4063.68617 3837.19378 4063.56079 3837.74311 4063.50668 3838.30396 4063.52474 3838.86713 4063.61467 3839.42336 4063.77499 3839.96353 4064.00307 3840.47876 4064.29516 3840.9606 4064.64647 3841.40113 4065.05123 3841.79311 4065.50279 3842.13012 4065.99374 3842.40662 4066.51601 3842.61807 4067.06104 3842.76099 Z M 4087.6122 3720.00738 L 4088.1745 3719.97128 4088.72756 3719.86357 4089.26232 3719.68602 4089.76997 3719.44154 4090.2422 3719.13416 4090.67124 3718.76891 4091.05005 3718.35179 4091.37241 3717.88966 4091.63303 3717.3901 4091.82763 3716.86132 4091.95301 3716.31199 4092.00712 3715.75114 4091.98906 3715.18797 4091.89913 3714.63174 4091.73881 3714.09157 4091.51073 3713.57634 4091.21864 3713.0945 4090.86733 3712.65397 4090.46257 3712.26199 4090.01101 3711.92498 4089.52006 3711.64848 4088.99779 3711.43703 4088.45276 3711.29411 4087.89393 3711.22206 4087.33047 3711.22206 4086.77164 3711.29411 4086.22661 3711.43703 4085.70434 3711.64848 4085.21339 3711.92498 4084.76183 3712.26199 4084.35707 3712.65397 4084.00576 3713.0945 4083.71367 3713.57634 4083.48559 3714.09157 4083.32527 3714.63174 4083.23534 3715.18797 4083.21728 3715.75114 4083.27139 3716.31199 4083.39677 3716.86132 4083.59137 3717.3901 4083.85199 3717.88966 4084.17435 3718.35179 4084.55316 3718.76891 4084.9822 3719.13416 4085.45443 3719.44154 4085.96208 3719.68602 4086.49684 3719.86357 4087.0499 3719.97128 4087.6122 3720.00738 Z M 4088.04254 3842.83982 L 4088.60339 3842.78571 4089.15272 3842.66033 4089.6815 3842.46573 4090.18106 3842.20511 4090.64319 3841.88275 4091.06031 3841.50394 4091.42556 3841.0749 4091.73294 3840.60267 4091.97742 3840.09502 4092.15497 3839.56026 4092.26268 3839.0072 4092.29878 3838.4449 4092.26268 3837.8826 4092.15497 3837.32954 4091.97742 3836.79478 4091.73294 3836.28713 4091.42556 3835.8149 4091.06031 3835.38586 4090.64319 3835.00705 4090.18106 3834.68469 4089.6815 3834.42407 4089.15272 3834.22947 4088.60339 3834.10409 4088.04254 3834.04998 4087.47937 3834.06804 4086.92314 3834.15797 4086.38297 3834.31829 4085.86774 3834.54637 4085.3859 3834.83846 4084.94537 3835.18977 4084.55339 3835.59453 4084.21638 3836.04609 4083.93988 3836.53704 4083.72843 3837.05931 4083.58551 3837.60434 4083.51346 3838.16317 4083.51346 3838.72663 4083.58551 3839.28546 4083.72843 3839.83049 4083.93988 3840.35276 4084.21638 3840.84371 4084.55339 3841.29527 4084.94537 3841.70003 4085.3859 3842.05134 4085.86774 3842.34343 4086.38297 3842.57151 4086.92314 3842.73183 4087.47937 3842.82176 4088.04254 3842.83982 Z M 4275.06195 3610.18064 L 4275.57026 3610.2505 4276.08334 3610.2505 4276.59165 3610.18064 4277.0857 3610.04221 4277.55631 3609.8378 4277.99469 3609.57121 4278.3927 3609.24741 4278.7429 3608.87243 4279.03879 3608.45325 4279.27484 3607.9977 4279.44666 3607.51424 4279.55105 3607.01189 4279.58607 3606.5 4279.55105 3605.98811 4279.44666 3605.48576 4279.27484 3605.0023 4279.03879 3604.54675 4278.7429 3604.12757 4278.3927 3603.75259 4277.99469 3603.42879 4277.55631 3603.1622 4277.0857 3602.95779 4276.59165 3602.81936 4276.08334 3602.7495 4275.57026 3602.7495 4275.06195 3602.81936 4274.5679 3602.95779 4274.09729 3603.1622 4273.65891 3603.42879 4273.2609 3603.75259 4272.9107 3604.12757 4272.61481 3604.54675 4272.37876 3605.0023 4272.20694 3605.48576 4272.10255 3605.98811 4272.06753 3606.5 4272.10255 3607.01189 4272.20694 3607.51424 4272.37876 3607.9977 4272.61481 3608.45325 4272.9107 3608.87243 4273.2609 3609.24741 4273.65891 3609.57121 4274.09729 3609.8378 4274.5679 3610.04221 4275.06195 3610.18064 Z M 4360.5 3637.43247 L 4361.01189 3637.39745 4361.51424 3637.29306 4361.9977 3637.12124 4362.45325 3636.88519 4362.87243 3636.5893 4363.24741 3636.2391 4363.57121 3635.84109 4363.8378 3635.40271 4364.04221 3634.9321 4364.18064 3634.43805 4364.2505 3633.92974 4364.2505 3633.41666 4364.18064 3632.90835 4364.04221 3632.4143 4363.8378 3631.94369 4363.57121 3631.50531 4363.24741 3631.1073 4362.87243 3630.7571 4362.45325 3630.46121 4361.9977 3630.22516 4361.51424 3630.05334 4361.01189 3629.94895 4360.5 3629.91393 4359.98811 3629.94895 4359.48576 3630.05334 4359.0023 3630.22516 4358.54675 3630.46121 4358.12757 3630.7571 4357.75259 3631.1073 4357.42879 3631.50531 4357.1622 3631.94369 4356.95779 3632.4143 4356.81936 3632.90835 4356.7495 3633.41666 4356.7495 3633.92974 4356.81936 3634.43805 4356.95779 3634.9321 4357.1622 3635.40271 4357.42879 3635.84109 4357.75259 3636.2391 4358.12757 3636.5893 4358.54675 3636.88519 4359.0023 3637.12124 4359.48576 3637.29306 4359.98811 3637.39745 4360.5 3637.43247 Z M 4360.5 3609.08607 L 4361.01189 3609.05105 4361.51424 3608.94666 4361.9977 3608.77484 4362.45325 3608.53879 4362.87243 3608.2429 4363.24741 3607.8927 4363.57121 3607.49469 4363.8378 3607.05631 4364.04221 3606.5857 4364.18064 3606.09165 4364.2505 3605.58334 4364.2505 3605.07026 4364.18064 3604.56195 4364.04221 3604.0679 4363.8378 3603.59729 4363.57121 3603.15891 4363.24741 3602.7609 4362.87243 3602.4107 4362.45325 3602.11481 4361.9977 3601.87876 4361.51424 3601.70694 4361.01189 3601.60255 4360.5 3601.56753 4359.98811 3601.60255 4359.48576 3601.70694 4359.0023 3601.87876 4358.54675 3602.11481 4358.12757 3602.4107 4357.75259 3602.7609 4357.42879 3603.15891 4357.1622 3603.59729 4356.95779 3604.0679 4356.81936 3604.56195 4356.7495 3605.07026 4356.7495 3605.58334 4356.81936 3606.09165 4356.95779 3606.5857 4357.1622 3607.05631 4357.42879 3607.49469 4357.75259 3607.8927 4358.12757 3608.2429 4358.54675 3608.53879 4359.0023 3608.77484 4359.48576 3608.94666 4359.98811 3609.05105 4360.5 3609.08607 Z M 4247.87625 3612.41385 L 4247.87625 3611.69925 4247.84749 3611.40724 4247.76805 3611.14535 4247.69051 3610.95526 4247.69051 3610.82494 4247.76805 3610.63485 4247.84749 3610.37296 4247.87625 3610.08095 4247.87625 3609.36635 4244.31682 3609.36635 4244.31682 3612.41385 4247.87625 3612.41385 Z M 4238.99398 3612.41385 L 4238.99398 3609.36635 4235.43455 3609.36635 4235.43455 3610.08095 4235.46331 3610.37296 4235.54275 3610.63485 4235.62029 3610.82494 4235.62029 3610.95526 4235.54275 3611.14535 4235.46331 3611.40724 4235.43455 3611.69925 4235.43455 3612.41385 4238.99398 3612.41385 Z M 4237.38765 3660.39152 L 4237.38765 3663.95095 4238.10225 3663.95095 4238.39426 3663.92219 4238.65615 3663.84275 4238.89751 3663.71374 4239.10907 3663.54012 4239.28269 3663.32856 4239.4117 3663.0872 4239.49114 3662.82531 4239.5199 3662.5333 4239.5199 3660.39152 4237.38765 3660.39152 Z M 4189.37198 3650.0806 L 4189.37198 3647.94835 4185.81255 3647.94835 4185.81255 3648.66295 4185.84131 3648.95496 4185.92075 3649.21685 4186.04976 3649.45821 4186.22338 3649.66977 4186.43494 3649.84339 4186.6763 3649.9724 4186.93819 3650.05184 4187.2302 3650.0806 4189.37198 3650.0806 Z M 4194.69482 3647.94835 L 4194.69482 3650.0806 4196.8366 3650.0806 4197.12861 3650.05184 4197.3905 3649.9724 4197.63186 3649.84339 4197.84342 3649.66977 4198.01704 3649.45821 4198.14605 3649.21685 4198.22549 3648.95496 4198.25425 3648.66295 4198.25425 3647.94835 4194.69482 3647.94835 Z M 4393.33035 3606.87005 L 4393.33035 3608.1752 4395.36418 3608.1752 4395.36418 3605.4524 4394.748 3605.4524 4394.45599 3605.48116 4394.1941 3605.5606 4393.95274 3605.68961 4393.74118 3605.86323 4393.56756 3606.07479 4393.43855 3606.31615 4393.35911 3606.57804 4393.33035 3606.87005 Z M 4394.45599 3614.51884 L 4394.748 3614.5476 4395.36418 3614.5476 4395.36418 3611.8248 4393.33035 3611.8248 4393.33035 3613.12995 4393.35911 3613.42196 4393.43855 3613.68385 4393.56756 3613.92521 4393.74118 3614.13677 4393.95274 3614.31039 4394.1941 3614.4394 4394.45599 3614.51884 Z M 4119.19956 3644.4844 L 4119.5652 3644.65646 4119.5652 3642.3248 4117.23192 3642.3248 4117.27592 3642.43594 4117.551 3642.9363 4117.88662 3643.39825 4118.27749 3643.81448 4118.71745 3644.17845 4119.19956 3644.4844 Z M 4123.2148 3642.3248 L 4123.2148 3644.65646 4123.58044 3644.4844 4124.06255 3644.17845 4124.50251 3643.81448 4124.89338 3643.39825 4125.229 3642.9363 4125.50408 3642.43594 4125.54808 3642.3248 4123.2148 3642.3248 Z M 4348.25 3713.25 L 4348.25 3710.97229 4347.84223 3711.16866 4347.37 3711.47604 4346.94096 3711.84129 4346.56215 3712.25841 4346.23979 3712.72054 4345.97917 3713.2201 4345.96816 3713.25 4348.25 3713.25 Z M 4268.25 3643.25 L 4268.25 3640.97229 4267.84223 3641.16866 4267.37 3641.47604 4266.94096 3641.84129 4266.56215 3642.25841 4266.23979 3642.72054 4265.97917 3643.2201 4265.96816 3643.25 4268.25 3643.25 Z M 4265.97917 3713.2201 L 4265.96816 3713.25 4268.25 3713.25 4268.25 3710.97229 4267.84223 3711.16866 4267.37 3711.47604 4266.94096 3711.84129 4266.56215 3712.25841 4266.23979 3712.72054 4265.97917 3713.2201 Z M 4285.97917 3713.2201 L 4285.96816 3713.25 4288.25 3713.25 4288.25 3710.97229 4287.84223 3711.16866 4287.37 3711.47604 4286.94096 3711.84129 4286.56215 3712.25841 4286.23979 3712.72054 4285.97917 3713.2201 Z M 4099.1516 3740.1949 L 4099.1516 3742.47654 4099.18207 3742.46544 4099.68106 3742.20511 4100.14319 3741.88275 4100.56031 3741.50394 4100.92556 3741.0749 4101.23294 3740.60267 4101.42931 3740.1949 4099.1516 3740.1949 Z M 4119.1516 3740.1949 L 4119.1516 3742.47654 4119.18207 3742.46544 4119.68106 3742.20511 4120.14319 3741.88275 4120.56031 3741.50394 4120.92556 3741.0749 4121.23294 3740.60267 4121.42931 3740.1949 4119.1516 3740.1949 Z M 4099.1516 3734.41326 L 4099.1516 3736.6949 4101.42931 3736.6949 4101.23294 3736.28713 4100.92556 3735.8149 4100.56031 3735.38586 4100.14319 3735.00705 4099.68106 3734.68469 4099.18207 3734.42436 4099.1516 3734.41326 Z M 4119.1516 3734.41326 L 4119.1516 3736.6949 4121.42931 3736.6949 4121.23294 3736.28713 4120.92556 3735.8149 4120.56031 3735.38586 4120.14319 3735.00705 4119.68106 3734.68469 4119.18207 3734.42436 4119.1516 3734.41326 Z M 4159.6516 3842.47654 L 4159.68207 3842.46544 4160.18106 3842.20511 4160.64319 3841.88275 4161.06031 3841.50394 4161.42556 3841.0749 4161.73294 3840.60267 4161.92931 3840.1949 4159.6516 3840.1949 4159.6516 3842.47654 Z M 4225.25 3713.75 L 4225.25 3711.46836 4225.21953 3711.47946 4224.72054 3711.73979 4224.25841 3712.06215 4223.84129 3712.44096 4223.47604 3712.87 4223.16866 3713.34223 4222.97229 3713.75 4225.25 3713.75 Z M 4158.8622 3719.63791 L 4159.26997 3719.44154 4159.7422 3719.13416 4160.17124 3718.76891 4160.55005 3718.35179 4160.87241 3717.88966 4161.13274 3717.39067 4161.14384 3717.3602 4158.8622 3717.3602 4158.8622 3719.63791 Z M 4278.25 3713.25 L 4278.25 3710.97229 4277.84223 3711.16866 4277.37 3711.47604 4276.94096 3711.84129 4276.56215 3712.25841 4276.23979 3712.72054 4275.97946 3713.21953 4275.96836 3713.25 4278.25 3713.25 Z M 4155.3622 3719.63791 L 4155.3622 3717.3602 4153.08056 3717.3602 4153.09166 3717.39067 4153.35199 3717.88966 4153.67435 3718.35179 4154.05316 3718.76891 4154.4822 3719.13416 4154.95443 3719.44154 4155.3622 3719.63791 Z M 4274.03164 3713.25 L 4274.02054 3713.21953 4273.76021 3712.72054 4273.43785 3712.25841 4273.05904 3711.84129 4272.63 3711.47604 4272.15777 3711.16866 4271.75 3710.97229 4271.75 3713.25 4274.03164 3713.25 Z M 4274.03164 3643.25 L 4274.02054 3643.21953 4273.76021 3642.72054 4273.43785 3642.25841 4273.05904 3641.84129 4272.63 3641.47604 4272.15777 3641.16866 4271.75 3640.97229 4271.75 3643.25 4274.03164 3643.25 Z M 4284.03164 3713.25 L 4284.02054 3713.21953 4283.76021 3712.72054 4283.43785 3712.25841 4283.05904 3711.84129 4282.63 3711.47604 4282.15777 3711.16866 4281.75 3710.97229 4281.75 3713.25 4284.03164 3713.25 Z M 4354.03164 3713.25 L 4354.02054 3713.21953 4353.76021 3712.72054 4353.43785 3712.25841 4353.05904 3711.84129 4352.63 3711.47604 4352.15777 3711.16866 4351.75 3710.97229 4351.75 3713.25 4354.03164 3713.25 Z M 4291.75 3710.97229 L 4291.75 3713.25 4294.03164 3713.25 4294.02054 3713.21953 4293.76021 3712.72054 4293.43785 3712.25841 4293.05904 3711.84129 4292.63 3711.47604 4292.15777 3711.16866 4291.75 3710.97229 Z M 4225.25 3719.53164 L 4225.25 3717.25 4222.97229 3717.25 4223.16866 3717.65777 4223.47604 3718.13 4223.84129 3718.55904 4224.25841 3718.93785 4224.72054 3719.26021 4225.21953 3719.52054 4225.25 3719.53164 Z M 4228.75 3717.25 L 4228.75 3719.52419 4229.03386 3719.39853 4229.5157 3719.10644 4229.95623 3718.75513 4230.34821 3718.35037 4230.68522 3717.89881 4230.96172 3717.40786 4231.02563 3717.25 4228.75 3717.25 Z M 4115.6516 3736.6949 L 4115.6516 3734.42071 4115.36774 3734.54637 4114.8859 3734.83846 4114.44537 3735.18977 4114.05339 3735.59453 4113.71638 3736.04609 4113.43988 3736.53704 4113.37597 3736.6949 4115.6516 3736.6949 Z M 4028.52563 3786.6945 L 4028.46172 3786.53664 4028.18522 3786.04569 4027.84821 3785.59413 4027.45623 3785.18937 4027.0157 3784.83806 4026.53386 3784.54597 4026.25 3784.42031 4026.25 3786.6945 4028.52563 3786.6945 Z M 4271.75 3646.75 L 4271.75 3649.02563 4271.90786 3648.96172 4272.39881 3648.68522 4272.85037 3648.34821 4273.25513 3647.95623 4273.60644 3647.5157 4273.89853 3647.03386 4274.02419 3646.75 4271.75 3646.75 Z M 4161.13639 3713.8602 L 4161.01073 3713.57634 4160.71864 3713.0945 4160.36733 3712.65397 4159.96257 3712.26199 4159.51101 3711.92498 4159.02006 3711.64848 4158.8622 3711.58457 4158.8622 3713.8602 4161.13639 3713.8602 Z M 4228.75 3711.47581 L 4228.75 3713.75 4231.02563 3713.75 4230.96172 3713.59214 4230.68522 3713.10119 4230.34821 3712.64963 4229.95623 3712.24487 4229.5157 3711.89356 4229.03386 3711.60147 4228.75 3711.47581 Z M 4026.25 3792.46869 L 4026.53386 3792.34303 4027.0157 3792.05094 4027.45623 3791.69963 4027.84821 3791.29487 4028.18522 3790.84331 4028.46172 3790.35236 4028.52563 3790.1945 4026.25 3790.1945 4026.25 3792.46869 Z M 4268.25 3649.02563 L 4268.25 3646.75 4265.97581 3646.75 4266.10147 3647.03386 4266.39356 3647.5157 4266.74487 3647.95623 4267.14963 3648.34821 4267.60119 3648.68522 4268.09214 3648.96172 4268.25 3649.02563 Z M 4351.75 3716.75 L 4351.75 3719.02563 4351.90786 3718.96172 4352.39881 3718.68522 4352.85037 3718.34821 4353.25513 3717.95623 4353.60644 3717.5157 4353.89853 3717.03386 4354.02419 3716.75 4351.75 3716.75 Z M 4271.75 3716.75 L 4271.75 3719.02563 4271.90786 3718.96172 4272.39881 3718.68522 4272.85037 3718.34821 4273.25513 3717.95623 4273.60644 3717.5157 4273.89853 3717.03386 4274.02419 3716.75 4271.75 3716.75 Z M 4156.1516 3842.46909 L 4156.1516 3840.1949 4153.87597 3840.1949 4153.93988 3840.35276 4154.21638 3840.84371 4154.55339 3841.29527 4154.94537 3841.70003 4155.3859 3842.05134 4155.86774 3842.34343 4156.1516 3842.46909 Z M 4288.25 3719.02563 L 4288.25 3716.75 4285.97581 3716.75 4286.10147 3717.03386 4286.39356 3717.5157 4286.74487 3717.95623 4287.14963 3718.34821 4287.60119 3718.68522 4288.09214 3718.96172 4288.25 3719.02563 Z M 4348.25 3719.02563 L 4348.25 3716.75 4345.97581 3716.75 4346.10147 3717.03386 4346.39356 3717.5157 4346.74487 3717.95623 4347.14963 3718.34821 4347.60119 3718.68522 4348.09214 3718.96172 4348.25 3719.02563 Z M 4155.3622 3713.8602 L 4155.3622 3711.58457 4155.20434 3711.64848 4154.71339 3711.92498 4154.26183 3712.26199 4153.85707 3712.65397 4153.50576 3713.0945 4153.21367 3713.57634 4153.08801 3713.8602 4155.3622 3713.8602 Z M 4291.75 3716.75 L 4291.75 3719.02563 4291.90786 3718.96172 4292.39881 3718.68522 4292.85037 3718.34821 4293.25513 3717.95623 4293.60644 3717.5157 4293.89853 3717.03386 4294.02419 3716.75 4291.75 3716.75 Z M 4268.09214 3718.96172 L 4268.25 3719.02563 4268.25 3716.75 4265.97581 3716.75 4266.10147 3717.03386 4266.39356 3717.5157 4266.74487 3717.95623 4267.14963 3718.34821 4267.60119 3718.68522 4268.09214 3718.96172 Z M 4115.6516 3742.46909 L 4115.6516 3740.1949 4113.37597 3740.1949 4113.43988 3740.35276 4113.71638 3740.84371 4114.05339 3741.29527 4114.44537 3741.70003 4114.8859 3742.05134 4115.36774 3742.34343 4115.6516 3742.46909 Z M 4278.09214 3718.96172 L 4278.25 3719.02563 4278.25 3716.75 4275.97581 3716.75 4276.10147 3717.03386 4276.39356 3717.5157 4276.74487 3717.95623 4277.14963 3718.34821 4277.60119 3718.68522 4278.09214 3718.96172 Z M 4281.75 3719.02563 L 4281.90786 3718.96172 4282.39881 3718.68522 4282.85037 3718.34821 4283.25513 3717.95623 4283.60644 3717.5157 4283.89853 3717.03386 4284.02419 3716.75 4281.75 3716.75 4281.75 3719.02563 Z M 4095.6516 3742.46909 L 4095.6516 3740.1949 4093.37597 3740.1949 4093.43988 3740.35276 4093.71638 3740.84371 4094.05339 3741.29527 4094.44537 3741.70003 4094.8859 3742.05134 4095.36774 3742.34343 4095.6516 3742.46909 Z M 4095.6516 3736.6949 L 4095.6516 3734.42071 4095.36774 3734.54637 4094.8859 3734.83846 4094.44537 3735.18977 4094.05339 3735.59453 4093.71638 3736.04609 4093.43988 3736.53704 4093.37597 3736.6949 4095.6516 3736.6949 Z M 4098.7421 3623.96741 L 4098.7421 3621.9311 4096.70149 3621.9311 4096.72516 3621.9977 4096.96121 3622.45325 4097.2571 3622.87243 4097.6073 3623.24741 4098.00531 3623.57121 4098.44369 3623.8378 4098.7421 3623.96741 Z M 4302.7421 3605.0689 L 4302.7421 3603.03259 4302.44369 3603.1622 4302.00531 3603.42879 4301.6073 3603.75259 4301.2571 3604.12757 4300.96121 3604.54675 4300.72516 3605.0023 4300.70149 3605.0689 4302.7421 3605.0689 Z M 4103.64491 3619.0689 L 4103.62124 3619.0023 4103.38519 3618.54675 4103.0893 3618.12757 4102.7391 3617.75259 4102.34109 3617.42879 4101.90271 3617.1622 4101.6043 3617.03259 4101.6043 3619.0689 4103.64491 3619.0689 Z M 4302.7421 3609.96741 L 4302.7421 3607.9311 4300.70149 3607.9311 4300.72516 3607.9977 4300.96121 3608.45325 4301.2571 3608.87243 4301.6073 3609.24741 4302.00531 3609.57121 4302.44369 3609.8378 4302.7421 3609.96741 Z M 4305.6043 3603.03259 L 4305.6043 3605.0689 4307.64491 3605.0689 4307.62124 3605.0023 4307.38519 3604.54675 4307.0893 3604.12757 4306.7391 3603.75259 4306.34109 3603.42879 4305.90271 3603.1622 4305.6043 3603.03259 Z M 4305.6043 3607.9311 L 4305.6043 3609.96741 4305.90271 3609.8378 4306.34109 3609.57121 4306.7391 3609.24741 4307.0893 3608.87243 4307.38519 3608.45325 4307.62124 3607.9977 4307.64491 3607.9311 4305.6043 3607.9311 Z M 4098.7421 3619.0689 L 4098.7421 3617.03259 4098.44369 3617.1622 4098.00531 3617.42879 4097.6073 3617.75259 4097.2571 3618.12757 4096.96121 3618.54675 4096.72516 3619.0023 4096.70149 3619.0689 4098.7421 3619.0689 Z M 4401.51 3635.3355 L 4401.80849 3635.20584 4402.24663 3634.93941 4402.6444 3634.6158 4402.9944 3634.24104 4403.29011 3633.82211 4403.52602 3633.36682 4403.54977 3633.3 4401.51 3633.3 4401.51 3635.3355 Z M 4398.65 3630.44 L 4398.65 3628.4045 4398.35151 3628.53416 4397.91337 3628.80059 4397.5156 3629.1242 4397.1656 3629.49896 4396.86989 3629.91789 4396.63398 3630.37318 4396.61023 3630.44 4398.65 3630.44 Z M 4398.65 3635.3355 L 4398.65 3633.3 4396.61023 3633.3 4396.63398 3633.36682 4396.86989 3633.82211 4397.1656 3634.24104 4397.5156 3634.6158 4397.91337 3634.93941 4398.35151 3635.20584 4398.65 3635.3355 Z M 4403.54977 3630.44 L 4403.52602 3630.37318 4403.29011 3629.91789 4402.9944 3629.49896 4402.6444 3629.1242 4402.24663 3628.80059 4401.80849 3628.53416 4401.51 3628.4045 4401.51 3630.44 4403.54977 3630.44 Z M 4052.19 3630.44 L 4052.19 3628.4045 4051.89151 3628.53416 4051.45337 3628.80059 4051.0556 3629.1242 4050.7056 3629.49896 4050.40989 3629.91789 4050.17398 3630.37318 4050.15023 3630.44 4052.19 3630.44 Z M 4052.19 3635.3355 L 4052.19 3633.3 4050.15023 3633.3 4050.17398 3633.36682 4050.40989 3633.82211 4050.7056 3634.24104 4051.0556 3634.6158 4051.45337 3634.93941 4051.89151 3635.20584 4052.19 3635.3355 Z M 4055.05 3635.3355 L 4055.34849 3635.20584 4055.78663 3634.93941 4056.1844 3634.6158 4056.5344 3634.24104 4056.83011 3633.82211 4057.06602 3633.36682 4057.08977 3633.3 4055.05 3633.3 4055.05 3635.3355 Z M 4057.08977 3630.44 L 4057.06602 3630.37318 4056.83011 3629.91789 4056.5344 3629.49896 4056.1844 3629.1242 4055.78663 3628.80059 4055.34849 3628.53416 4055.05 3628.4045 4055.05 3630.44 4057.08977 3630.44 Z \"]]~0~gge29263~2~1~2~1~yes~0","SOLIDREGION~1~U1_21~M 4075.118 3678.2085 L 4157.795 3678.2085 L 4157.795 3709.7045 L 4075.118 3709.7045 Z ~cutout~gge30587~~~~0","TRACK~2.3622~1~GND~4227 3715.5 4227 3719 4223.5 3722.5 4164 3722.5 4157.11 3715.61~gge30671~0","TRACK~2.3622~1~GND~4269.999 3715 4258 3715 4250 3723 4234.5 3723 4227 3715.5~gge30668~0","TEXT~L~4254.5~3806.5~0.8~0~0~3~~8~Airsoft Tracker Board 1.32~M 4257.41 3798.43 L 4254.5 3806.06 M 4257.41 3798.43 L 4260.32 3806.06 M 4255.59 3803.52 L 4259.23 3803.52 M 4262.72 3798.43 L 4263.08 3798.79 L 4263.45 3798.43 L 4263.08 3798.06 L 4262.72 3798.43 M 4263.08 3800.97 L 4263.08 3806.06 M 4265.85 3800.97 L 4265.85 3806.06 M 4265.85 3803.15 L 4266.21 3802.06 L 4266.94 3801.34 L 4267.66 3800.97 L 4268.75 3800.97 M 4275.15 3802.06 L 4274.79 3801.34 L 4273.7 3800.97 L 4272.61 3800.97 L 4271.52 3801.34 L 4271.15 3802.06 L 4271.52 3802.79 L 4272.25 3803.15 L 4274.06 3803.52 L 4274.79 3803.88 L 4275.15 3804.61 L 4275.15 3804.97 L 4274.79 3805.7 L 4273.7 3806.06 L 4272.61 3806.06 L 4271.52 3805.7 L 4271.15 3804.97 M 4279.37 3800.97 L 4278.65 3801.34 L 4277.92 3802.06 L 4277.55 3803.15 L 4277.55 3803.88 L 4277.92 3804.97 L 4278.65 3805.7 L 4279.37 3806.06 L 4280.46 3806.06 L 4281.19 3805.7 L 4281.92 3804.97 L 4282.28 3803.88 L 4282.28 3803.15 L 4281.92 3802.06 L 4281.19 3801.34 L 4280.46 3800.97 L 4279.37 3800.97 M 4287.59 3798.43 L 4286.86 3798.43 L 4286.14 3798.79 L 4285.77 3799.88 L 4285.77 3806.06 M 4284.68 3800.97 L 4287.23 3800.97 M 4291.08 3798.43 L 4291.08 3804.61 L 4291.45 3805.7 L 4292.17 3806.06 L 4292.9 3806.06 M 4289.99 3800.97 L 4292.54 3800.97 M 4303.45 3798.43 L 4303.45 3806.06 M 4300.9 3798.43 L 4305.99 3798.43 M 4308.39 3800.97 L 4308.39 3806.06 M 4308.39 3803.15 L 4308.75 3802.06 L 4309.48 3801.34 L 4310.21 3800.97 L 4311.3 3800.97 M 4318.06 3800.97 L 4318.06 3806.06 M 4318.06 3802.06 L 4317.34 3801.34 L 4316.61 3800.97 L 4315.52 3800.97 L 4314.79 3801.34 L 4314.06 3802.06 L 4313.7 3803.15 L 4313.7 3803.88 L 4314.06 3804.97 L 4314.79 3805.7 L 4315.52 3806.06 L 4316.61 3806.06 L 4317.34 3805.7 L 4318.06 3804.97 M 4324.83 3802.06 L 4324.1 3801.34 L 4323.37 3800.97 L 4322.28 3800.97 L 4321.55 3801.34 L 4320.83 3802.06 L 4320.46 3803.15 L 4320.46 3803.88 L 4320.83 3804.97 L 4321.55 3805.7 L 4322.28 3806.06 L 4323.37 3806.06 L 4324.1 3805.7 L 4324.83 3804.97 M 4327.23 3798.43 L 4327.23 3806.06 M 4330.86 3800.97 L 4327.23 3804.61 M 4328.68 3803.15 L 4331.23 3806.06 M 4333.63 3803.15 L 4337.99 3803.15 L 4337.99 3802.43 L 4337.63 3801.7 L 4337.26 3801.34 L 4336.54 3800.97 L 4335.45 3800.97 L 4334.72 3801.34 L 4333.99 3802.06 L 4333.63 3803.15 L 4333.63 3803.88 L 4333.99 3804.97 L 4334.72 3805.7 L 4335.45 3806.06 L 4336.54 3806.06 L 4337.26 3805.7 L 4337.99 3804.97 M 4340.39 3800.97 L 4340.39 3806.06 M 4340.39 3803.15 L 4340.75 3802.06 L 4341.48 3801.34 L 4342.21 3800.97 L 4343.3 3800.97 M 4351.3 3798.43 L 4351.3 3806.06 M 4351.3 3798.43 L 4354.57 3798.43 L 4355.66 3798.79 L 4356.03 3799.15 L 4356.39 3799.88 L 4356.39 3800.61 L 4356.03 3801.34 L 4355.66 3801.7 L 4354.57 3802.06 M 4351.3 3802.06 L 4354.57 3802.06 L 4355.66 3802.43 L 4356.03 3802.79 L 4356.39 3803.52 L 4356.39 3804.61 L 4356.03 3805.34 L 4355.66 3805.7 L 4354.57 3806.06 L 4351.3 3806.06 M 4360.61 3800.97 L 4359.88 3801.34 L 4359.15 3802.06 L 4358.79 3803.15 L 4358.79 3803.88 L 4359.15 3804.97 L 4359.88 3805.7 L 4360.61 3806.06 L 4361.7 3806.06 L 4362.43 3805.7 L 4363.15 3804.97 L 4363.52 3803.88 L 4363.52 3803.15 L 4363.15 3802.06 L 4362.43 3801.34 L 4361.7 3800.97 L 4360.61 3800.97 M 4370.28 3800.97 L 4370.28 3806.06 M 4370.28 3802.06 L 4369.55 3801.34 L 4368.83 3800.97 L 4367.74 3800.97 L 4367.01 3801.34 L 4366.28 3802.06 L 4365.92 3803.15 L 4365.92 3803.88 L 4366.28 3804.97 L 4367.01 3805.7 L 4367.74 3806.06 L 4368.83 3806.06 L 4369.55 3805.7 L 4370.28 3804.97 M 4372.68 3800.97 L 4372.68 3806.06 M 4372.68 3803.15 L 4373.05 3802.06 L 4373.77 3801.34 L 4374.5 3800.97 L 4375.59 3800.97 M 4382.35 3798.43 L 4382.35 3806.06 M 4382.35 3802.06 L 4381.63 3801.34 L 4380.9 3800.97 L 4379.81 3800.97 L 4379.08 3801.34 L 4378.35 3802.06 L 4377.99 3803.15 L 4377.99 3803.88 L 4378.35 3804.97 L 4379.08 3805.7 L 4379.81 3806.06 L 4380.9 3806.06 L 4381.63 3805.7 L 4382.35 3804.97 M 4390.35 3799.88 L 4391.08 3799.52 L 4392.17 3798.43 L 4392.17 3806.06 M 4394.94 3804.25 L 4394.57 3804.61 L 4394.94 3804.97 L 4395.3 3804.61 L 4394.94 3804.25 M 4398.43 3798.43 L 4402.43 3798.43 L 4400.25 3801.34 L 4401.34 3801.34 L 4402.06 3801.7 L 4402.43 3802.06 L 4402.79 3803.15 L 4402.79 3803.88 L 4402.43 3804.97 L 4401.7 3805.7 L 4400.61 3806.06 L 4399.52 3806.06 L 4398.43 3805.7 L 4398.06 3805.34 L 4397.7 3804.61 M 4405.55 3800.25 L 4405.55 3799.88 L 4405.92 3799.15 L 4406.28 3798.79 L 4407.01 3798.43 L 4408.46 3798.43 L 4409.19 3798.79 L 4409.55 3799.15 L 4409.92 3799.88 L 4409.92 3800.61 L 4409.55 3801.34 L 4408.83 3802.43 L 4405.19 3806.06 L 4410.28 3806.06~~gge19961~~0~pinpart","TEXT~L~4255~3820.5~0.8~0~0~3~~8~Copyright (c) 2022 DDV~M 4260.45 3814.25 L 4260.09 3813.52 L 4259.36 3812.79 L 4258.64 3812.43 L 4257.18 3812.43 L 4256.45 3812.79 L 4255.73 3813.52 L 4255.36 3814.25 L 4255 3815.34 L 4255 3817.15 L 4255.36 3818.25 L 4255.73 3818.97 L 4256.45 3819.7 L 4257.18 3820.06 L 4258.64 3820.06 L 4259.36 3819.7 L 4260.09 3818.97 L 4260.45 3818.25 M 4264.67 3814.97 L 4263.95 3815.34 L 4263.22 3816.06 L 4262.85 3817.15 L 4262.85 3817.88 L 4263.22 3818.97 L 4263.95 3819.7 L 4264.67 3820.06 L 4265.76 3820.06 L 4266.49 3819.7 L 4267.22 3818.97 L 4267.58 3817.88 L 4267.58 3817.15 L 4267.22 3816.06 L 4266.49 3815.34 L 4265.76 3814.97 L 4264.67 3814.97 M 4269.98 3814.97 L 4269.98 3822.61 M 4269.98 3816.06 L 4270.71 3815.34 L 4271.44 3814.97 L 4272.53 3814.97 L 4273.25 3815.34 L 4273.98 3816.06 L 4274.35 3817.15 L 4274.35 3817.88 L 4273.98 3818.97 L 4273.25 3819.7 L 4272.53 3820.06 L 4271.44 3820.06 L 4270.71 3819.7 L 4269.98 3818.97 M 4277.11 3814.97 L 4279.29 3820.06 M 4281.47 3814.97 L 4279.29 3820.06 L 4278.56 3821.52 L 4277.84 3822.25 L 4277.11 3822.61 L 4276.75 3822.61 M 4283.87 3814.97 L 4283.87 3820.06 M 4283.87 3817.15 L 4284.24 3816.06 L 4284.96 3815.34 L 4285.69 3814.97 L 4286.78 3814.97 M 4289.18 3812.43 L 4289.55 3812.79 L 4289.91 3812.43 L 4289.55 3812.06 L 4289.18 3812.43 M 4289.55 3814.97 L 4289.55 3820.06 M 4296.67 3814.97 L 4296.67 3820.79 L 4296.31 3821.88 L 4295.95 3822.25 L 4295.22 3822.61 L 4294.13 3822.61 L 4293.4 3822.25 M 4296.67 3816.06 L 4295.95 3815.34 L 4295.22 3814.97 L 4294.13 3814.97 L 4293.4 3815.34 L 4292.67 3816.06 L 4292.31 3817.15 L 4292.31 3817.88 L 4292.67 3818.97 L 4293.4 3819.7 L 4294.13 3820.06 L 4295.22 3820.06 L 4295.95 3819.7 L 4296.67 3818.97 M 4299.07 3812.43 L 4299.07 3820.06 M 4299.07 3816.43 L 4300.16 3815.34 L 4300.89 3814.97 L 4301.98 3814.97 L 4302.71 3815.34 L 4303.07 3816.43 L 4303.07 3820.06 M 4306.56 3812.43 L 4306.56 3818.61 L 4306.93 3819.7 L 4307.65 3820.06 L 4308.38 3820.06 M 4305.47 3814.97 L 4308.02 3814.97 M 4318.93 3810.97 L 4318.2 3811.7 L 4317.47 3812.79 L 4316.75 3814.25 L 4316.38 3816.06 L 4316.38 3817.52 L 4316.75 3819.34 L 4317.47 3820.79 L 4318.2 3821.88 L 4318.93 3822.61 M 4325.69 3816.06 L 4324.96 3815.34 L 4324.24 3814.97 L 4323.15 3814.97 L 4322.42 3815.34 L 4321.69 3816.06 L 4321.33 3817.15 L 4321.33 3817.88 L 4321.69 3818.97 L 4322.42 3819.7 L 4323.15 3820.06 L 4324.24 3820.06 L 4324.96 3819.7 L 4325.69 3818.97 M 4328.09 3810.97 L 4328.82 3811.7 L 4329.55 3812.79 L 4330.27 3814.25 L 4330.64 3816.06 L 4330.64 3817.52 L 4330.27 3819.34 L 4329.55 3820.79 L 4328.82 3821.88 L 4328.09 3822.61 M 4339 3814.25 L 4339 3813.88 L 4339.36 3813.15 L 4339.73 3812.79 L 4340.45 3812.43 L 4341.91 3812.43 L 4342.64 3812.79 L 4343 3813.15 L 4343.36 3813.88 L 4343.36 3814.61 L 4343 3815.34 L 4342.27 3816.43 L 4338.64 3820.06 L 4343.73 3820.06 M 4348.31 3812.43 L 4347.22 3812.79 L 4346.49 3813.88 L 4346.13 3815.7 L 4346.13 3816.79 L 4346.49 3818.61 L 4347.22 3819.7 L 4348.31 3820.06 L 4349.04 3820.06 L 4350.13 3819.7 L 4350.85 3818.61 L 4351.22 3816.79 L 4351.22 3815.7 L 4350.85 3813.88 L 4350.13 3812.79 L 4349.04 3812.43 L 4348.31 3812.43 M 4353.98 3814.25 L 4353.98 3813.88 L 4354.35 3813.15 L 4354.71 3812.79 L 4355.44 3812.43 L 4356.89 3812.43 L 4357.62 3812.79 L 4357.98 3813.15 L 4358.35 3813.88 L 4358.35 3814.61 L 4357.98 3815.34 L 4357.25 3816.43 L 4353.62 3820.06 L 4358.71 3820.06 M 4361.47 3814.25 L 4361.47 3813.88 L 4361.84 3813.15 L 4362.2 3812.79 L 4362.93 3812.43 L 4364.38 3812.43 L 4365.11 3812.79 L 4365.47 3813.15 L 4365.84 3813.88 L 4365.84 3814.61 L 4365.47 3815.34 L 4364.75 3816.43 L 4361.11 3820.06 L 4366.2 3820.06 M 4374.2 3812.43 L 4374.2 3820.06 M 4374.2 3812.43 L 4376.75 3812.43 L 4377.84 3812.79 L 4378.56 3813.52 L 4378.93 3814.25 L 4379.29 3815.34 L 4379.29 3817.15 L 4378.93 3818.25 L 4378.56 3818.97 L 4377.84 3819.7 L 4376.75 3820.06 L 4374.2 3820.06 M 4381.69 3812.43 L 4381.69 3820.06 M 4381.69 3812.43 L 4384.24 3812.43 L 4385.33 3812.79 L 4386.05 3813.52 L 4386.42 3814.25 L 4386.78 3815.34 L 4386.78 3817.15 L 4386.42 3818.25 L 4386.05 3818.97 L 4385.33 3819.7 L 4384.24 3820.06 L 4381.69 3820.06 M 4389.18 3812.43 L 4392.09 3820.06 M 4395 3812.43 L 4392.09 3820.06~~gge19960~~0~pinpart","LIB~4396~3751.0433~package`S2B-PH-SM4-TB`Contributor`andyfilms`spicePre`X`spiceSymbolName`S2B-PH-SM4-TB`BOM_Manufacturer Part``~180~~gge12fa8dc00f010d07~2~ffe5780e60fc43f3861153d7ff9fe849~1588994000~0~~yes~~#@$TEXT~N~4407.7~3793.833~0.6~0~1~4~~4.5~BAT~M 4407.7002 3789.2933 L 4407.7002 3793.5833 M 4407.7002 3789.2933 L 4405.8602 3789.2933 L 4405.2502 3789.4933 L 4405.0402 3789.7033 L 4404.8402 3790.1133 L 4404.8402 3790.5233 L 4405.0402 3790.9333 L 4405.2502 3791.1333 L 4405.8602 3791.3333 M 4407.7002 3791.3333 L 4405.8602 3791.3333 L 4405.2502 3791.5433 L 4405.0402 3791.7433 L 4404.8402 3792.1533 L 4404.8402 3792.7733 L 4405.0402 3793.1833 L 4405.2502 3793.3833 L 4405.8602 3793.5833 L 4407.7002 3793.5833 M 4401.8502 3789.2933 L 4403.4902 3793.5833 M 4401.8502 3789.2933 L 4400.2102 3793.5833 M 4402.8702 3792.1533 L 4400.8302 3792.1533 M 4397.4302 3789.2933 L 4397.4302 3793.5833 M 4398.8602 3789.2933 L 4396.0002 3789.2933~none~gge6127~~0~#@$TEXT~P~4399.5~3786.543~0.6~0~1~4~~4.5~X1~M 4399.5 3782.0033 L 4396.64 3786.2933 M 4396.64 3782.0033 L 4399.5 3786.2933 M 4395.29 3782.8233 L 4394.88 3782.6133 L 4394.26 3782.0033 L 4394.26 3786.2933~~gge6129~~0~#@$TRACK~0.6~4~~4386.748 3779.5863 4405.252 3779.5863~gge6131~0#@$TRACK~0.6~4~~4411.551 3766.0043 4411.551 3749.6653 4403.677 3749.6653 4403.677 3755.9643~gge6132~0#@$TRACK~0.6~4~~4388.323 3755.9643 4388.323 3749.6653 4380.449 3749.6653 4380.449 3766.0043~gge6133~0#@$TRACK~0.6~12~~4380.449 3779.5863 4395.213 3779.5863 4396.787 3779.5863 4411.551 3779.5863 4411.551 3749.6653 4403.677 3749.6653 4403.677 3755.9643 4388.323 3755.9643 4388.323 3749.6653 4380.449 3749.6653 4380.449 3779.5863~gge6134~0#@$TRACK~0.6~12~~4396.787 3779.5863 4396.787 3762.8543 4395.213 3762.8543 4395.213 3779.5863~gge6135~0#@$SOLIDREGION~12~~M 4398.953 3745.7283 L 4400.921 3745.7283 L 4400.921 3755.9643 L 4398.953 3755.9643 Z~solid~gge6136~~~~0#@$SOLIDREGION~12~~M 4391.079 3745.7283 L 4393.047 3745.7283 L 4393.047 3755.9643 L 4391.079 3755.9643 Z~solid~gge6137~~~~0#@$SOLIDREGION~12~~M 4399.937 3777.4213 L 4398.756 3779.3893 L 4401.118 3779.3893 Z~solid~gge6138~~~~0#@$TRACK~0.6~12~~4399.937 3777.4213 4398.756 3779.3893 4401.118 3779.3893 4399.937 3777.4213~gge6139~0#@$PAD~POLYGON~4399.937~3751.043~3.9365~17.7161~2~GND~1~0~4397.969 3759.9013 4401.906 3759.9013 4401.906 3742.1853 4397.969 3742.1853~180~gge6140~0~~Y~0~0~0.4~4399.937,3751.0433#@$PAD~POLYGON~4392.063~3751.043~3.9365~17.7161~2~BAT~2~0~4390.094 3759.9013 4394.031 3759.9013 4394.031 3742.1853 4390.094 3742.1853~180~gge6145~0~~Y~0~0~0.4~4392.063,3751.0433#@$PAD~POLYGON~4409.386~3773.681~6.2993~13.386~2~~M1~0~4406.236 3780.3743 4412.535 3780.3743 4412.535 3766.9883 4406.236 3766.9883~180~gge6150~0~~Y~0~0~0.4~4409.386,3773.6813#@$PAD~POLYGON~4382.614~3773.681~6.2993~13.386~2~~M2~0~4379.465 3780.3743 4385.764 3780.3743 4385.764 3766.9883 4379.465 3766.9883~180~gge6155~0~~Y~0~0~0.4~4382.614,3773.6813","LIB~4122.3622~3715.6102~package`IMU9250`BOM_Manufacturer``BOM_Manufacturer Part``BOM_Supplier Part``BOM_Supplier``link``Contributor`Phongnhp`spicePre`U`spiceSymbolName`IMU_9250`~270~~ggeac577a762ea3fc25~2~bc174898c43b41b89ffbf34ee09b95a5~1595392713~0~~yes~~#@$TEXT~N~4180.613~3691.61~0.6~270~1~4~~4.5~IMU_9250~M 4185.1522 3691.61 L 4180.8622 3691.61 M 4185.1522 3690.26 L 4180.8622 3690.26 M 4185.1522 3690.26 L 4180.8622 3688.62 M 4185.1522 3686.99 L 4180.8622 3688.62 M 4185.1522 3686.99 L 4180.8622 3686.99 M 4185.1522 3685.64 L 4182.0822 3685.64 L 4181.4722 3685.43 L 4181.0622 3685.02 L 4180.8622 3684.41 L 4180.8622 3684 L 4181.0622 3683.39 L 4181.4722 3682.98 L 4182.0822 3682.77 L 4185.1522 3682.77 M 4179.4222 3681.42 L 4179.4222 3677.74 M 4183.7222 3673.73 L 4183.1122 3673.94 L 4182.7022 3674.35 L 4182.4922 3674.96 L 4182.4922 3675.16 L 4182.7022 3675.78 L 4183.1122 3676.19 L 4183.7222 3676.39 L 4183.9222 3676.39 L 4184.5422 3676.19 L 4184.9522 3675.78 L 4185.1522 3675.16 L 4185.1522 3674.96 L 4184.9522 3674.35 L 4184.5422 3673.94 L 4183.7222 3673.73 L 4182.7022 3673.73 L 4181.6722 3673.94 L 4181.0622 3674.35 L 4180.8622 3674.96 L 4180.8622 3675.37 L 4181.0622 3675.98 L 4181.4722 3676.19 M 4184.1322 3672.18 L 4184.3322 3672.18 L 4184.7422 3671.97 L 4184.9522 3671.77 L 4185.1522 3671.36 L 4185.1522 3670.54 L 4184.9522 3670.13 L 4184.7422 3669.93 L 4184.3322 3669.72 L 4183.9222 3669.72 L 4183.5122 3669.93 L 4182.9022 3670.34 L 4180.8622 3672.38 L 4180.8622 3669.52 M 4185.1522 3665.71 L 4185.1522 3667.76 L 4183.3122 3667.96 L 4183.5122 3667.76 L 4183.7222 3667.15 L 4183.7222 3666.53 L 4183.5122 3665.92 L 4183.1122 3665.51 L 4182.4922 3665.31 L 4182.0822 3665.31 L 4181.4722 3665.51 L 4181.0622 3665.92 L 4180.8622 3666.53 L 4180.8622 3667.15 L 4181.0622 3667.76 L 4181.2622 3667.96 L 4181.6722 3668.17 M 4185.1522 3662.73 L 4184.9522 3663.34 L 4184.3322 3663.75 L 4183.3122 3663.96 L 4182.7022 3663.96 L 4181.6722 3663.75 L 4181.0622 3663.34 L 4180.8622 3662.73 L 4180.8622 3662.32 L 4181.0622 3661.71 L 4181.6722 3661.3 L 4182.7022 3661.09 L 4183.3122 3661.09 L 4184.3322 3661.3 L 4184.9522 3661.71 L 4185.1522 3662.32 L 4185.1522 3662.73~none~gge4128~~0~#@$TEXT~P~4150~3688.032~0.6~0~1~4~~4.5~U2~M 4150 3683.4915 L 4150 3686.5615 L 4149.8 3687.1715 L 4149.39 3687.5815 L 4148.77 3687.7815 L 4148.36 3687.7815 L 4147.75 3687.5815 L 4147.34 3687.1715 L 4147.14 3686.5615 L 4147.14 3683.4915 M 4145.58 3684.5115 L 4145.58 3684.3115 L 4145.38 3683.9015 L 4145.17 3683.6915 L 4144.76 3683.4915 L 4143.95 3683.4915 L 4143.54 3683.6915 L 4143.33 3683.9015 L 4143.13 3684.3115 L 4143.13 3684.7215 L 4143.33 3685.1315 L 4143.74 3685.7415 L 4145.79 3687.7815 L 4142.92 3687.7815~~gge4130~~0~#@$TEXT~L~4170.638~3710.563~1.1811~0~1~4~~3.937~Vcc~M 4170.6378 3706.5935 L 4169.2078 3710.3535 M 4167.7778 3706.5935 L 4169.2078 3710.3535 M 4164.4478 3708.3835 L 4164.8078 3708.0235 L 4165.1578 3707.8435 L 4165.6978 3707.8435 L 4166.0578 3708.0235 L 4166.4178 3708.3835 L 4166.5978 3708.9135 L 4166.5978 3709.2735 L 4166.4178 3709.8135 L 4166.0578 3710.1735 L 4165.6978 3710.3535 L 4165.1578 3710.3535 L 4164.8078 3710.1735 L 4164.4478 3709.8135 M 4161.1178 3708.3835 L 4161.4778 3708.0235 L 4161.8378 3707.8435 L 4162.3678 3707.8435 L 4162.7278 3708.0235 L 4163.0878 3708.3835 L 4163.2678 3708.9135 L 4163.2678 3709.2735 L 4163.0878 3709.8135 L 4162.7278 3710.1735 L 4162.3678 3710.3535 L 4161.8378 3710.3535 L 4161.4778 3710.1735 L 4161.1178 3709.8135~~gge4132~~0~pinpart#@$TEXT~L~4127.5~3683.532~1.1811~0~1~4~~8~IMU9250~M 4127.5 3675.4615 L 4127.5 3683.0915 M 4125.1 3675.4615 L 4125.1 3683.0915 M 4125.1 3675.4615 L 4122.19 3683.0915 M 4119.28 3675.4615 L 4122.19 3683.0915 M 4119.28 3675.4615 L 4119.28 3683.0915 M 4116.88 3675.4615 L 4116.88 3680.9115 L 4116.52 3682.0015 L 4115.79 3682.7315 L 4114.7 3683.0915 L 4113.97 3683.0915 L 4112.88 3682.7315 L 4112.15 3682.0015 L 4111.79 3680.9115 L 4111.79 3675.4615 M 4104.66 3678.0015 L 4105.03 3679.0915 L 4105.75 3679.8215 L 4106.85 3680.1815 L 4107.21 3680.1815 L 4108.3 3679.8215 L 4109.03 3679.0915 L 4109.39 3678.0015 L 4109.39 3677.6415 L 4109.03 3676.5515 L 4108.3 3675.8215 L 4107.21 3675.4615 L 4106.85 3675.4615 L 4105.75 3675.8215 L 4105.03 3676.5515 L 4104.66 3678.0015 L 4104.66 3679.8215 L 4105.03 3681.6415 L 4105.75 3682.7315 L 4106.85 3683.0915 L 4107.57 3683.0915 L 4108.66 3682.7315 L 4109.03 3682.0015 M 4101.9 3677.2815 L 4101.9 3676.9115 L 4101.54 3676.1815 L 4101.17 3675.8215 L 4100.45 3675.4615 L 4098.99 3675.4615 L 4098.26 3675.8215 L 4097.9 3676.1815 L 4097.54 3676.9115 L 4097.54 3677.6415 L 4097.9 3678.3715 L 4098.63 3679.4615 L 4102.26 3683.0915 L 4097.17 3683.0915 M 4090.41 3675.4615 L 4094.05 3675.4615 L 4094.41 3678.7315 L 4094.05 3678.3715 L 4092.95 3678.0015 L 4091.86 3678.0015 L 4090.77 3678.3715 L 4090.05 3679.0915 L 4089.68 3680.1815 L 4089.68 3680.9115 L 4090.05 3682.0015 L 4090.77 3682.7315 L 4091.86 3683.0915 L 4092.95 3683.0915 L 4094.05 3682.7315 L 4094.41 3682.3715 L 4094.77 3681.6415 M 4085.1 3675.4615 L 4086.19 3675.8215 L 4086.92 3676.9115 L 4087.28 3678.7315 L 4087.28 3679.8215 L 4086.92 3681.6415 L 4086.19 3682.7315 L 4085.1 3683.0915 L 4084.37 3683.0915 L 4083.28 3682.7315 L 4082.55 3681.6415 L 4082.19 3679.8215 L 4082.19 3678.7315 L 4082.55 3676.9115 L 4083.28 3675.8215 L 4084.37 3675.4615 L 4085.1 3675.4615~~gge4134~~0~pinpart#@$SVGNODE~{\"gId\":\"gge4136\",\"nodeName\":\"g\",\"nodeType\":1,\"layerid\":\"19\",\"attrs\":{\"c_width\":\"0.015\",\"c_height\":\"0.012775\",\"c_rotation\":\"0,0,180\",\"z\":\"0\",\"c_origin\":\"4122.6121,3691.0826\",\"uuid\":\"0a3ff226a9fe4ce1a55394db4227389d\",\"c_etype\":\"outline3D\",\"title\":\"mpu-9250\",\"layerid\":\"19\",\"transform\":\"scale(1) translate(0, 0)\",\"id\":\"gge4136\"},\"childNodes\":[{\"gId\":\"gge4137\",\"nodeName\":\"polyline\",\"nodeType\":1,\"attrs\":{\"fill\":\"none\",\"c_shapetype\":\"line\",\"points\":\"4122.6047 3691.0873 4122.6047 3691.0857 4122.605 3691.0857 4122.6052 3691.0857 4122.6052 3691.0857 4122.6053 3691.0857 4122.6054 3691.0857 4122.6057 3691.0857 4122.606 3691.0857 4122.6063 3691.0857 4122.6067 3691.0857 4122.6071 3691.0857 4122.6075 3691.0857 4122.6078 3691.0857 4122.608 3691.0857 4122.6082 3691.0857 4122.6082 3691.0857 4122.6082 3691.0857 4122.613 3691.0857 4122.6175 3691.0857 4122.6175 3691.0857 4122.6175 3691.0857 4122.6175 3691.0857 4122.6175 3691.0857 4122.6176 3691.0857 4122.6176 3691.0857 4122.6177 3691.0857 4122.6177 3691.0857 4122.6177 3691.0857 4122.6178 3691.0857 4122.6178 3691.0857 4122.6178 3691.0857 4122.6178 3691.0857 4122.6178 3691.0857 4122.6179 3691.0857 4122.6179 3691.0857 4122.6179 3691.0857 4122.6179 3691.0857 4122.6179 3691.0854 4122.6175 3691.0854 4122.6175 3691.0857 4122.617 3691.0857 4122.617 3691.0856 4122.617 3691.0831 4122.617 3691.0831 4122.617 3691.0831 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.6173 3691.0833 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.6173 3691.0833 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.6173 3691.0833 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.083 4122.617 3691.0829 4122.617 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6171 3691.0829 4122.6179 3691.0829 4122.6179 3691.0766 4122.6181 3691.0762 4122.6184 3691.0762 4122.6186 3691.0766 4122.6186 3691.0829 4122.6193 3691.0829 4122.6194 3691.0829 4122.6194 3691.0829 4122.6194 3691.0829 4122.6194 3691.0829 4122.6194 3691.0829 4122.6194 3691.083 4122.6195 3691.083 4122.6195 3691.083 4122.6195 3691.083 4122.6195 3691.083 4122.6195 3691.083 4122.6195 3691.083 4122.6195 3691.0831 4122.6195 3691.0831 4122.6195 3691.0831 4122.6195 3691.0856 4122.6195 3691.0857 4122.619 3691.0857 4122.619 3691.0854 4122.6186 3691.0854 4122.6186 3691.0857 4122.6186 3691.0857 4122.6186 3691.0857 4122.6186 3691.0857 4122.6187 3691.0857 4122.6187 3691.0857 4122.6187 3691.0857 4122.6187 3691.0857 4122.6187 3691.0857 4122.6187 3691.0857 4122.6187 3691.0857 4122.6188 3691.0857 4122.6189 3691.0857 4122.6189 3691.0857 4122.6189 3691.0857 4122.619 3691.0857 4122.619 3691.0857 4122.619 3691.0857 4122.619 3691.0857 4122.6197 3691.0857 4122.6197 3691.0873 4122.619 3691.0873 4122.619 3691.0873 4122.619 3691.0873 4122.619 3691.0873 4122.6189 3691.0873 4122.6189 3691.0873 4122.6189 3691.0873 4122.6188 3691.0873 4122.6187 3691.0873 4122.6187 3691.0873 4122.6187 3691.0873 4122.6187 3691.0873 4122.6187 3691.0873 4122.6187 3691.0873 4122.6187 3691.0873 4122.6186 3691.0873 4122.6186 3691.0873 4122.6186 3691.0873 4122.6186 3691.0873 4122.6186 3691.0886 4122.6184 3691.0889 4122.6181 3691.0889 4122.6179 3691.0886 4122.6179 3691.0873 4122.6179 3691.0873 4122.6179 3691.0873 4122.6179 3691.0873 4122.6178 3691.0873 4122.6178 3691.0873 4122.6178 3691.0873 4122.6178 3691.0873 4122.6178 3691.0873 4122.6177 3691.0873 4122.6177 3691.0873 4122.6177 3691.0873 4122.6176 3691.0873 4122.6176 3691.0873 4122.6175 3691.0873 4122.6175 3691.0873 4122.6175 3691.0873 4122.6175 3691.0873 4122.6175 3691.0873 4122.6139 3691.0873 4122.6139 3691.0875 4122.6137 3691.0875 4122.6137 3691.0878 4122.6137 3691.0881 4122.6137 3691.0881 4122.6137 3691.0881 4122.6137 3691.0881 4122.6137 3691.0882 4122.6137 3691.0882 4122.6137 3691.0882 4122.6137 3691.0882 4122.6137 3691.0882 4122.6137 3691.0882 4122.6137 3691.0882 4122.6137 3691.0882 4122.6136 3691.0882 4122.6134 3691.0882 4122.6134 3691.0882 4122.6134 3691.0882 4122.6133 3691.0882 4122.6133 3691.0882 4122.6132 3691.0882 4122.6132 3691.0884 4122.613 3691.0884 4122.613 3691.0884 4122.613 3691.0884 4122.6129 3691.0884 4122.6129 3691.0884 4122.6128 3691.0884 4122.6127 3691.0884 4122.6127 3691.0884 4122.6126 3691.0884 4122.6126 3691.0884 4122.6125 3691.0884 4122.6125 3691.0884 4122.6125 3691.0884 4122.6102 3691.0884 4122.6102 3691.0882 4122.6094 3691.0882 4122.6094 3691.0882 4122.6094 3691.0882 4122.6094 3691.0882 4122.6094 3691.0882 4122.6091 3691.0882 4122.6091 3691.0882 4122.6091 3691.0882 4122.6091 3691.0882 4122.6091 3691.0882 4122.6091 3691.0882 4122.6091 3691.0882 4122.6091 3691.0882 4122.609 3691.0882 4122.609 3691.0881 4122.609 3691.0881 4122.609 3691.0881 4122.609 3691.0881 4122.609 3691.0878 4122.609 3691.0874 4122.609 3691.0874 4122.609 3691.0873 4122.609 3691.0873 4122.6091 3691.0873 4122.6091 3691.0873 4122.6091 3691.0873 4122.6091 3691.0873 4122.6082 3691.0873 4122.6082 3691.0873 4122.6082 3691.0873 4122.608 3691.0873 4122.6078 3691.0873 4122.6078 3691.0873 4122.6078 3691.0873 4122.6078 3691.0873 4122.6078 3691.0873 4122.6078 3691.0873 4122.6078 3691.0873 4122.6078 3691.0873 4122.6078 3691.0874 4122.6078 3691.0874 4122.6078 3691.0874 4122.6078 3691.0874 4122.6078 3691.0874 4122.6078 3691.0874 4122.6081 3691.0874 4122.6082 3691.0881 4122.6081 3691.089 4122.608 3691.089 4122.608 3691.089 4122.608 3691.089 4122.608 3691.089 4122.608 3691.089 4122.608 3691.089 4122.608 3691.089 4122.608 3691.089 4122.608 3691.089 4122.608 3691.089 4122.608 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6079 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6078 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6077 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6076 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6075 3691.089 4122.6073 3691.089 4122.6073 3691.089 4122.6073 3691.089 4122.6073 3691.089 4122.6073 3691.089 4122.6073 3691.089 4122.6073 3691.089 4122.6073 3691.089 4122.6073 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6072 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.6071 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.607 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6069 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6068 3691.089 4122.6067 3691.089 4122.6067 3691.0888 4122.6066 3691.0882 4122.6066 3691.0881 4122.6067 3691.0874 4122.607 3691.0874 4122.607 3691.0874 4122.607 3691.0874 4122.607 3691.0874 4122.607 3691.0874 4122.607 3691.0873 4122.607 3691.0873 4122.607 3691.0873 4122.607 3691.0873 4122.607 3691.0873 4122.607 3691.0873 4122.607 3691.0873 4122.607 3691.0873 4122.6067 3691.0873 4122.6063 3691.0873 4122.606 3691.0873 4122.6057 3691.0873 4122.6054 3691.0873 4122.6053 3691.0873 4122.6052 3691.0873 4122.6052 3691.0873 4122.605 3691.0873 4122.6047 3691.0873 4122.6047 3691.0873\",\"id\":\"gge4137\"}}]}#@$TRACK~1~4~~4172.6122 3720.6102 4172.6122 3661.5552 4072.6122 3661.5552 4072.6122 3720.6102 4172.6122 3720.6102~gge4138~0#@$PAD~ELLIPSE~4167.113~3715.61~6~6~11~U1_3V3_2~1~1.8~~270~gge4139~0~~Y~0~0~0.4~4167.1122,3715.6102#@$PAD~ELLIPSE~4157.113~3715.61~6~6~11~GND~2~1.8~~270~gge4144~0~~Y~0~0~0.4~4157.1122,3715.6102#@$PAD~ELLIPSE~4147.613~3715.61~6~6~11~U1_22~3~1.8~~270~gge4149~0~~Y~0~0~0.4~4147.6122,3715.6102#@$PAD~ELLIPSE~4137.613~3715.61~6~6~11~U1_21~4~1.8~~270~gge4154~0~~Y~0~0~0.4~4137.6122,3715.6102#@$PAD~ELLIPSE~4127.113~3715.61~6~6~11~~5~1.8~~270~gge4159~0~~Y~0~0~0.4~4127.1122,3715.6102#@$PAD~ELLIPSE~4117.113~3715.61~6~6~11~~6~1.8~~270~gge4164~0~~Y~0~0~0.4~4117.1122,3715.6102#@$PAD~ELLIPSE~4107.613~3715.61~6~6~11~~7~1.8~~270~gge4169~0~~Y~0~0~0.4~4107.6122,3715.6102#@$PAD~ELLIPSE~4097.613~3715.61~6~6~11~~8~1.8~~270~gge4174~0~~Y~0~0~0.4~4097.6122,3715.6102#@$PAD~ELLIPSE~4087.613~3715.61~6~6~11~~9~1.8~~270~gge4179~0~~Y~0~0~0.4~4087.6122,3715.6102#@$PAD~ELLIPSE~4077.613~3715.61~6~6~11~~10~1.8~~270~gge4184~0~~Y~0~0~0.4~4077.6122,3715.6102","LIB~4114.5~3640.5~package`CAP-TH_BD8.0-P3.50-D1.0-FD`Contributor`åŽ˜æ–šå°čŖ…åē“`link`https://item.szlcsc.com/44329.html`3DModel`CAP-TH_D8.0-H8.0-P3.50`BOM_Supplier`LCSC`BOM_Manufacturer`ValuePro`BOM_Manufacturer Part`470uf16v`nameAlias`Capacitance`BOM_Supplier Part`C28067`spicePre`C`spiceSymbolName`470uf16v`~~~ggee35b13287a9793b8~1~90d1b58a2d284d63b5d026a0c4e38bab~1615949828~0~~yes~~#@$TEXT~N~4113.5~3616.5~0.6~0~0~3~~4.5~470uF~M 4115.55 3611.96 L 4113.5 3614.82 L 4116.57 3614.82 M 4115.55 3611.96 L 4115.55 3616.25 M 4120.78 3611.96 L 4118.74 3616.25 M 4117.92 3611.96 L 4120.78 3611.96 M 4123.36 3611.96 L 4122.75 3612.16 L 4122.34 3612.78 L 4122.13 3613.8 L 4122.13 3614.41 L 4122.34 3615.44 L 4122.75 3616.05 L 4123.36 3616.25 L 4123.77 3616.25 L 4124.38 3616.05 L 4124.79 3615.44 L 4125 3614.41 L 4125 3613.8 L 4124.79 3612.78 L 4124.38 3612.16 L 4123.77 3611.96 L 4123.36 3611.96 M 4126.35 3613.39 L 4126.35 3615.44 L 4126.55 3616.05 L 4126.96 3616.25 L 4127.57 3616.25 L 4127.98 3616.05 L 4128.6 3615.44 M 4128.6 3613.39 L 4128.6 3616.25 M 4129.95 3611.96 L 4129.95 3616.25 M 4129.95 3611.96 L 4132.6 3611.96 M 4129.95 3614 L 4131.58 3614~none~gge27823~~0~#@$TEXT~P~4111~3635~0.6~0~0~3~~4.5~C3~M 4114.07 3631.48 L 4113.86 3631.07 L 4113.45 3630.66 L 4113.05 3630.46 L 4112.23 3630.46 L 4111.82 3630.66 L 4111.41 3631.07 L 4111.2 3631.48 L 4111 3632.1 L 4111 3633.12 L 4111.2 3633.73 L 4111.41 3634.14 L 4111.82 3634.55 L 4112.23 3634.75 L 4113.05 3634.75 L 4113.45 3634.55 L 4113.86 3634.14 L 4114.07 3633.73 M 4115.83 3630.46 L 4118.08 3630.46 L 4116.85 3632.1 L 4117.46 3632.1 L 4117.87 3632.3 L 4118.08 3632.5 L 4118.28 3633.12 L 4118.28 3633.53 L 4118.08 3634.14 L 4117.67 3634.55 L 4117.05 3634.75 L 4116.44 3634.75 L 4115.83 3634.55 L 4115.62 3634.35 L 4115.42 3633.94~~gge27825~~0~#@$TRACK~1~3~~4103.4102 3637.6 4103.4102 3632.3~gge27827~0#@$TRACK~1~3~~4105.9102 3634.9 4101.0102 3634.9~gge27828~0#@$ARC~1~3~~M 4114.51 3624.75 A 15.74803 15.74803 0 1 0 4114.79 3624.75~~gge27829~0#@$CIRCLE~4121.39~3640.5~1.181~2.3622~100~gge27830~0~~#@$CIRCLE~4107.61~3640.5~1.181~2.3622~100~gge27831~0~~#@$SOLIDREGION~3~~M 4125.3268 3652.311 A 17.1259 17.1259 0 0 0 4125.3268 3628.689 Z ~solid~gge27832~~~~0#@$SOLIDREGION~99~~M 4114.5 3656.53 A 16.03 16.03 0 1 0 4114.49 3656.53 Z ~solid~gge27833~~~~0#@$SVGNODE~{\"gId\":\"gge27834\",\"nodeName\":\"g\",\"nodeType\":1,\"layerid\":\"19\",\"attrs\":{\"c_width\":\"31.496\",\"c_height\":\"31.4862\",\"c_rotation\":\"0,0,180\",\"z\":\"-11.811\",\"c_origin\":\"4114.5,3640.5\",\"uuid\":\"5d8fef05026249fba67d921d4fb62a95\",\"c_etype\":\"outline3D\",\"title\":\"CAP-TH_D8.0-H8.0-P3.50\",\"layerid\":\"19\",\"transform\":\"scale(1) translate(0, 0)\",\"id\":\"gge27834\"},\"childNodes\":[{\"gId\":\"gge27835\",\"nodeName\":\"polyline\",\"nodeType\":1,\"attrs\":{\"fill\":\"none\",\"c_shapetype\":\"line\",\"points\":\"4119.874 3648.3543 4119.874 3647.5669 4119.874 3646.7795 4119.7953 3645.9921 4119.7953 3645.9134 4119.7559 3645.7952 4119.7559 3645.6378 4119.7166 3645.3622 4119.7166 3645.2047 4119.4016 3643.6693 4119.2441 3643.2362 4119.1654 3642.9212 4119.2047 3643.0787 4119.126 3642.9606 4119.1654 3642.9212 4119.2441 3643.2362 4119.3229 3643.4724 4119.3229 3643.5118 4119.2835 3643.3543 4119.3622 3643.6693 4119.3229 3643.5118 4119.3229 3643.4724 4119.2047 3643.0787 4119.1654 3642.9212 4119.0866 3642.6456 4118.9292 3642.1732 4118.6536 3641.4645 4118.4961 3641.1496 4118.2992 3640.7165 4118.063 3640.2441 4118.0236 3640.1653 4117.9449 3640.0472 4117.9055 3639.9685 4117.8662 3639.8897 4117.8268 3639.811 4117.6693 3639.6142 4117.5512 3639.3386 4117.7481 3639.7323 4117.6693 3639.6142 4117.8268 3639.811 4117.7481 3639.7323 4117.7481 3639.6929 4117.5512 3639.3779 4117.6299 3639.496 4117.6299 3639.5748 4117.5512 3639.3779 4117.6693 3639.6142 4117.7481 3639.7323 4117.8662 3639.9291 4117.9449 3640.0472 4117.9055 3640.0472 4117.8662 3639.8897 4117.9055 3639.9685 4117.8662 3639.9291 4117.8268 3639.811 4117.8662 3639.8897 4117.8268 3639.8504 4117.7481 3639.7323 4117.8268 3639.811 4117.8662 3639.9291 4117.7481 3639.7323 4117.9449 3640.0472 4117.8662 3639.9291 4117.9055 3639.9685 4117.9449 3640.0472 4117.5512 3639.3386 4117.4725 3639.2205 4116.6851 3638.0394 4116.1733 3637.4488 4115.6614 3636.8583 4115.3859 3636.5827 4115.0709 3636.3464 4115.1103 3636.3071 4115.2677 3636.5039 4115.6614 3636.8583 4115.4646 3636.7008 4115.3859 3636.5827 4115.6614 3636.8583 4115.2677 3636.5039 4115.3859 3636.5827 4115.4646 3636.7008 4115.189 3636.4646 4115.0709 3636.3464 4115.6221 3636.8976 4115.189 3636.4646 4115.4646 3636.7008 4115.6221 3636.8976 4115.0709 3636.3464 4115.3859 3636.5827 4115.2677 3636.5039 4115.1103 3636.3071 4115.6614 3636.8583 4115.6221 3636.8976 4115.4646 3636.7008 4115.6614 3636.8583 4115.8977 3637.1732 4115.6221 3636.8976 4115.8189 3637.0551 4115.8977 3637.1732 4115.6614 3636.8583 4115.8189 3637.0551 4115.6221 3636.8976 4115.6614 3636.8583 4116.1733 3637.4488 4115.9764 3637.252 4115.8977 3637.1732 4115.8189 3637.0551 4115.6614 3636.8583 4115.1103 3636.3071 4114.6772 3635.874 4114.5985 3635.7953 4114.5591 3635.7559 4114.126 3635.4016 4113.9292 3635.2441 4113.2992 3634.7716 4113.0237 3634.6142 4112.6693 3634.3386 4112.1575 3634.0236 4112 3633.9449 4112.0788 3633.9842 4112.1181 3634.0236 4112 3633.9449 4112.6693 3634.3386 4112.3544 3634.1811 4112.1575 3634.0236 4112.6693 3634.3386 4112 3633.9449 4112.1181 3634.0236 4112.0788 3633.9842 4112.2363 3634.1024 4111.9607 3633.9842 4112 3633.9449 4112.1181 3634.0236 4112.315 3634.1811 4112.63 3634.3779 4112.5512 3634.3386 4112.5118 3634.2992 4112.63 3634.3779 4112.3544 3634.1811 4112.63 3634.3779 4112.5118 3634.2992 4112.2363 3634.1024 4112.0788 3633.9842 4112 3633.9449 4111.2914 3633.5512 4111.0158 3633.4331 4110.5827 3633.2362 4110.6221 3633.2362 4110.6221 3633.2756 4110.5827 3633.2362 4110.9764 3633.4331 4111.2914 3633.5512 4111.0552 3633.4724 4111.0158 3633.4331 4111.2914 3633.5512 4110.9764 3633.4331 4111.0158 3633.4331 4111.0552 3633.4724 4110.8583 3633.3937 4110.6221 3633.2756 4111.0158 3633.4331 4110.9764 3633.4331 4110.6221 3633.1968 4109.8741 3632.9213 4109.126 3632.6457 4109.2441 3632.685 4109.2835 3632.7244 4109.126 3632.6457 4109.4016 3632.7638 4109.8741 3632.9213 4109.8347 3632.9213 4109.6378 3632.8425 4109.8741 3632.9213 4109.4016 3632.7638 4109.441 3632.7638 4109.6378 3632.8425 4109.5197 3632.8425 4109.3622 3632.7244 4109.441 3632.7638 4109.4016 3632.7638 4109.3229 3632.7244 4109.3622 3632.7244 4109.5197 3632.8425 4109.441 3632.8031 4109.7166 3632.9213 4109.3622 3632.8031 4109.2441 3632.7638 4109.126 3632.7244 4109.1654 3632.7638 4109.126 3632.7244 4109.2048 3632.7638 4109.1654 3632.7244 4109.3229 3632.8425 4109.126 3632.7244 4109.1654 3632.7638 4109.4016 3632.8425 4109.3229 3632.8425 4109.1654 3632.7244 4109.126 3632.7244 4109.126 3632.685 4109.441 3632.8031 4109.5197 3632.8425 4109.8347 3632.9606 4109.7166 3632.9213 4109.7559 3632.9213 4109.7953 3632.9606 4109.6772 3632.9213 4109.7559 3632.9213 4109.8347 3632.9606 4109.5197 3632.8425 4109.6378 3632.8425 4109.8347 3632.9213 4109.8347 3632.9606 4109.7559 3632.9213 4109.7166 3632.9213 4109.441 3632.8031 4109.2835 3632.7244 4109.3622 3632.7244 4119.874 3648.3543 4119.874 3648.3543\",\"id\":\"gge27835\"}}]}#@$PAD~ELLIPSE~4121.39~3640.5~6.2992~6.2992~11~GND~2~1.9685~~90~gge27836~0~~Y~0~0~0.4~4121.39,3640.5#@$PAD~ELLIPSE~4107.61~3640.5~6.2992~6.2992~11~U1_3V3_1~1~1.9685~~90~gge27841~0~~Y~0~0~0.4~4107.61,3640.5","LIB~4360.5~3619.5~package`RES-TH_BD1.8-L3.2-P7.20-D0.4`Contributor`LCSC`link`https://item.szlcsc.com/120430.html`BOM_Supplier`LCSC`BOM_Supplier Part`C714232`BOM_Manufacturer`Huaxing Mechanical-Elec.`BOM_Manufacturer Part`CF1/6W-10KΊ¹5%T52`nameAlias`Resistance (Ohms)`spicePre`R`spiceSymbolName`CF1/6W-10KΊ¹5%T52`~90~~gge43ecfe7f34e78f71~1~97467e7cb6374f7e9dd7fc644a47cfb1~1570352249~0~~yes~~#@$TEXT~N~4342~3619.5~0.6~90~0~3~~4.5~1kΊ~M 4341.75 3618.01 C 4341.49 3618.01 4341.22 3618.01 4340.96 3618.01 L 4339.41 3618.01 L 4338.7 3618 L 4338.65 3618.06 L 4338.92 3619.08 L 4339.09 3619.08 L 4339.03 3618.42 L 4340.96 3618.42 C 4341.22 3618.42 4341.49 3618.42 4341.75 3618.43 L 4341.85 3619.13 L 4342 3619.13 L 4342 3617.31 L 4341.85 3617.31 Z M 4341.8 3614.64 L 4340.46 3615.48 L 4339.89 3614.91 L 4339.83 3614.45 L 4339.66 3614.45 L 4339.66 3615.59 L 4339.83 3615.59 L 4339.91 3615.2 L 4340.83 3616.09 L 4339.09 3616.09 L 4338.39 3616.07 L 4338.36 3616.13 L 4338.56 3616.89 L 4338.71 3616.89 L 4338.75 3616.49 L 4340.97 3616.49 C 4341.23 3616.49 4341.52 3616.5 4341.79 3616.5 L 4341.85 3616.89 L 4342 3616.89 L 4342 3615.69 L 4341.85 3615.69 L 4341.79 3616.08 C 4341.56 3616.08 4341.31 3616.09 4341.08 3616.09 L 4340.74 3615.76 L 4342 3615 L 4342 3614.33 L 4341.85 3614.33 Z M 4341.16 3611.18 L 4341.65 3611.29 L 4341.65 3611.99 L 4341.65 3611.99 C 4341.29 3611.48 4340.76 3611.08 4340.12 3611.08 C 4339.16 3611.08 4338.63 3611.76 4338.63 3612.52 C 4338.63 3613.29 4339.16 3613.97 4340.12 3613.97 C 4340.77 3613.97 4341.29 3613.56 4341.65 3613.05 L 4341.65 3613.05 L 4341.65 3613.75 L 4341.16 3613.87 L 4341.16 3614.13 L 4342 3614.08 L 4342 3612.76 L 4341.7 3612.76 C 4341.32 3613.22 4340.74 3613.51 4340.12 3613.51 C 4339.39 3613.51 4338.84 3613.14 4338.84 3612.52 C 4338.84 3611.9 4339.39 3611.54 4340.12 3611.54 C 4340.74 3611.54 4341.32 3611.83 4341.7 3612.29 L 4342 3612.29 L 4342 3610.96 L 4341.16 3610.92 Z~none~gge25696~~0~#@$TEXT~P~4349.5~3623.5~0.6~0~0~3~~4.5~R1~M 4349.5 3618.96 L 4349.5 3623.25 M 4349.5 3618.96 L 4351.34 3618.96 L 4351.95 3619.16 L 4352.16 3619.37 L 4352.36 3619.78 L 4352.36 3620.19 L 4352.16 3620.6 L 4351.95 3620.8 L 4351.34 3621 L 4349.5 3621 M 4350.93 3621 L 4352.36 3623.25 M 4353.71 3619.78 L 4354.12 3619.57 L 4354.74 3618.96 L 4354.74 3623.25~~gge25673~~0~#@$TRACK~1~3~S$11~4356.9568 3625.7993 4356.9567 3613.2007~gge25675~0#@$TRACK~1~3~S$13~4356.9568 3613.2007 4364.0433 3613.2007~gge25676~0#@$TRACK~1~3~S$11~4364.0432 3613.2007 4364.0433 3625.7993~gge25677~0#@$TRACK~1~3~S$13~4364.0432 3625.7993 4356.9567 3625.7993~gge25678~0#@$PAD~ELLIPSE~4360.5~3633.673~4.7244~4.7244~11~U3_30~1~1.5748~~90~gge25679~0~~Y~0~0~0.4~4360.5,3633.6732#@$PAD~ELLIPSE~4360.5~3605.327~4.7244~4.7244~11~Q1_2~2~1.5748~~90~gge25684~0~~Y~0~0~0.4~4360.5,3605.3268","LIB~4387~3677~package`CAP-TH_L5.0-W5.0-P5.08-D1.0`link`https://item.szlcsc.com/254335.html`Contributor`LCSC`3DModel`CAP-TH_BD5.0-W5.0-P5.08`BOM_Supplier`LCSC`BOM_Supplier Part`C444738`BOM_Manufacturer`AVX`BOM_Manufacturer Part`SR211C104KAR`nameAlias`Capacitance`BOM_LCSC Assembly`Yes`SMT Type`Extend`BOM_Assembly Type`manualWeld`BOM_Paste Type`expand`spicePre`C`spiceSymbolName`SR211C104KAR`~90~~gge1986c0819620a5c0~1~4d5b8e8e8f89428f98436df910b3190e~1594376330~0~~yes~~#@$TEXT~N~4369~3677~0.6~90~0~3~~4.5~100nF~M 4365.28 3677 L 4365.07 3676.59 L 4364.46 3675.98 L 4368.75 3675.98 M 4364.46 3673.4 L 4364.66 3674.01 L 4365.28 3674.42 L 4366.3 3674.63 L 4366.91 3674.63 L 4367.94 3674.42 L 4368.55 3674.01 L 4368.75 3673.4 L 4368.75 3672.99 L 4368.55 3672.38 L 4367.94 3671.97 L 4366.91 3671.76 L 4366.3 3671.76 L 4365.28 3671.97 L 4364.66 3672.38 L 4364.46 3672.99 L 4364.46 3673.4 M 4364.46 3669.19 L 4364.66 3669.8 L 4365.28 3670.21 L 4366.3 3670.41 L 4366.91 3670.41 L 4367.94 3670.21 L 4368.55 3669.8 L 4368.75 3669.19 L 4368.75 3668.78 L 4368.55 3668.16 L 4367.94 3667.75 L 4366.91 3667.55 L 4366.3 3667.55 L 4365.28 3667.75 L 4364.66 3668.16 L 4364.46 3668.78 L 4364.46 3669.19 M 4365.89 3666.2 L 4368.75 3666.2 M 4366.71 3666.2 L 4366.1 3665.59 L 4365.89 3665.18 L 4365.89 3664.56 L 4366.1 3664.15 L 4366.71 3663.95 L 4368.75 3663.95 M 4364.46 3662.6 L 4368.75 3662.6 M 4364.46 3662.6 L 4364.46 3659.94 M 4366.5 3662.6 L 4366.5 3660.96~none~gge25476~~0~#@$TEXT~P~4384~3678~0.6~0~0~3~~4.5~C1~M 4387.07 3674.48 L 4386.86 3674.07 L 4386.45 3673.66 L 4386.05 3673.46 L 4385.23 3673.46 L 4384.82 3673.66 L 4384.41 3674.07 L 4384.2 3674.48 L 4384 3675.1 L 4384 3676.12 L 4384.2 3676.73 L 4384.41 3677.14 L 4384.82 3677.55 L 4385.23 3677.75 L 4386.05 3677.75 L 4386.45 3677.55 L 4386.86 3677.14 L 4387.07 3676.73 M 4388.42 3674.28 L 4388.83 3674.07 L 4389.44 3673.46 L 4389.44 3677.75~~gge25478~~0~#@$TRACK~1~3~~4377 3687 4377 3667 4382.9404 3667~gge25480~0#@$TRACK~1~3~~4391.06 3667 4397 3667 4397 3687 4391.06 3687~gge25481~0#@$TRACK~1~3~~4382.9404 3687 4377 3687~gge25482~0#@$SVGNODE~{\"gId\":\"gge25483\",\"nodeName\":\"g\",\"nodeType\":1,\"layerid\":\"19\",\"attrs\":{\"c_width\":\"23.280756588\",\"c_height\":\"15.748\",\"c_rotation\":\"0,0,90\",\"z\":\"-13.7795\",\"c_origin\":\"4387,3677\",\"uuid\":\"b025a8beb93f468db953eeae2df27988\",\"c_etype\":\"outline3D\",\"title\":\"CAP-TH_BD5.0-W5.0-P5.08\",\"layerid\":\"19\",\"transform\":\"scale(1) translate(0, 0)\",\"id\":\"gge25483\"},\"childNodes\":[{\"gId\":\"gge25484\",\"nodeName\":\"polyline\",\"nodeType\":1,\"attrs\":{\"fill\":\"none\",\"c_shapetype\":\"line\",\"points\":\"4383.063 3683.7126 4383.4174 3683.6339 4383.7717 3683.5158 4384.0867 3683.3189 4384.3229 3683.0433 4384.5591 3682.7284 4384.6772 3682.4134 4384.7166 3682.0197 4384.7166 3681.7047 4384.9528 3681.6654 4385.8583 3681.3898 4386.7244 3680.9961 4387.5512 3680.4843 4388.2992 3679.8937 4388.9685 3679.2244 4389.5591 3678.4764 4390.0315 3677.689 4390.4252 3676.8229 4390.6221 3676.1929 4390.7008 3675.9174 4390.8977 3674.9725 4390.8189 3675.4055 4390.8977 3674.9331 4390.8977 3674.9725 4390.7008 3675.9174 4390.7796 3675.4449 4390.8189 3675.4055 4390.8977 3674.9725 4390.937 3674.0276 4390.937 3673.9882 4390.937 3673.9489 4390.937 3673.8701 4390.937 3673.7914 4390.937 3673.3977 4390.937 3673.2402 4390.937 3673.0827 4390.937 3672.8859 4390.937 3672.689 4390.937 3672.4922 4390.937 3672.2559 4390.937 3672.0591 4390.937 3671.941 4390.937 3671.8622 4390.937 3671.626 4390.937 3671.4292 4390.937 3671.2323 4390.937 3670.9567 4390.8977 3670.563 4390.937 3670.7599 4390.937 3670.878 4390.8977 3670.2874 4390.937 3670.7599 4390.8977 3670.563 4390.8977 3670.2874 4390.937 3670.878 4390.937 3671.0355 4390.8977 3670.563 4390.937 3670.9567 4390.8977 3670.8386 4390.8977 3670.563 4390.937 3671.0355 4390.937 3671.2323 4390.8977 3670.8386 4390.937 3671.193 4390.8977 3671.1142 4390.8977 3670.8386 4390.937 3671.2323 4390.937 3671.4292 4390.8977 3671.1142 4390.937 3671.193 4390.937 3671.4292 4390.8977 3671.4292 4390.8977 3671.1142 4390.937 3671.4292 4390.937 3671.626 4390.8977 3671.4292 4390.937 3671.4292 4390.937 3671.193 4390.8977 3670.8386 4390.937 3670.9567 4390.937 3671.2323 4383.063 3683.7126 4383.063 3683.7126\",\"id\":\"gge25484\"}}]}#@$PAD~ELLIPSE~4387~3687~6.2992~6.2992~11~U1_3V3_2~1~1.9685~~90~gge25485~0~~Y~0~0~0.4~4387,3687#@$PAD~ELLIPSE~4387~3667~6.2992~6.2992~11~J2_2~2~1.9685~~90~gge25490~0~~Y~0~0~0.4~4387,3667","LIB~4405~3677~package`DO-41_BD2.4-L4.7-P8.70-D0.9-RD`link`https://item.szlcsc.com/85412.html`Contributor`åŽ˜æ–šå°čŖ…åē“`3DModel`DO-41_D2.8-L4.2-P8.00`BOM_Supplier`LCSC`BOM_Manufacturer`LRC`BOM_Manufacturer Part`1N4001`BOM_Supplier Part`C82804`spicePre`D`spiceSymbolName`1N4001`~90~~gge8f24df2e0c50e8b0~1~c2803222ad4b48fb94db0de548a6280a~1612148571~0~~yes~~#@$TEXT~N~4390~3677.25~0.6~90~0~3~~4.5~1N4001~M 4386.28 3677.25 L 4386.07 3676.84 L 4385.46 3676.23 L 4389.75 3676.23 M 4385.46 3674.88 L 4389.75 3674.88 M 4385.46 3674.88 L 4389.75 3672.01 M 4385.46 3672.01 L 4389.75 3672.01 M 4385.46 3668.62 L 4388.32 3670.66 L 4388.32 3667.6 M 4385.46 3668.62 L 4389.75 3668.62 M 4385.46 3665.02 L 4385.66 3665.63 L 4386.28 3666.04 L 4387.3 3666.25 L 4387.91 3666.25 L 4388.94 3666.04 L 4389.55 3665.63 L 4389.75 3665.02 L 4389.75 3664.61 L 4389.55 3664 L 4388.94 3663.59 L 4387.91 3663.38 L 4387.3 3663.38 L 4386.28 3663.59 L 4385.66 3664 L 4385.46 3664.61 L 4385.46 3665.02 M 4385.46 3660.8 L 4385.66 3661.42 L 4386.28 3661.83 L 4387.3 3662.03 L 4387.91 3662.03 L 4388.94 3661.83 L 4389.55 3661.42 L 4389.75 3660.8 L 4389.75 3660.4 L 4389.55 3659.78 L 4388.94 3659.37 L 4387.91 3659.17 L 4387.3 3659.17 L 4386.28 3659.37 L 4385.66 3659.78 L 4385.46 3660.4 L 4385.46 3660.8 M 4386.28 3657.82 L 4386.07 3657.41 L 4385.46 3656.8 L 4389.75 3656.8~none~gge25497~~0~#@$TEXT~P~4402.5~3678~0.6~0~0~3~~4.5~D1~M 4402.5 3673.46 L 4402.5 3677.75 M 4402.5 3673.46 L 4403.93 3673.46 L 4404.55 3673.66 L 4404.95 3674.07 L 4405.16 3674.48 L 4405.36 3675.1 L 4405.36 3676.12 L 4405.16 3676.73 L 4404.95 3677.14 L 4404.55 3677.55 L 4403.93 3677.75 L 4402.5 3677.75 M 4406.71 3674.28 L 4407.12 3674.07 L 4407.74 3673.46 L 4407.74 3677.75~~gge25499~~0~#@$TRACK~1~3~~4399.4882 3687.2362 4399.4882 3666.7638~gge25501~0#@$TRACK~1~3~~4399.4882 3666.7638 4410.5118 3666.7638~gge25502~0#@$TRACK~1~3~~4410.5118 3687.2362 4410.5118 3666.7638~gge25503~0#@$TRACK~1~3~~4399.4882 3687.2362 4410.5118 3687.2362~gge25504~0#@$TRACK~1~3~~4399.4882 3683.4596 4410.5118 3683.4596~gge25505~0#@$SOLIDREGION~100~~M 4401.4567 3698.6533 L 4401.4567 3691.5667 L 4408.5433 3691.5667 L 4408.5433 3698.6533 Z~solid~gge25506~~~~0#@$SOLIDREGION~100~~M 4401.4567 3662.4333 L 4401.4567 3655.3467 L 4408.5433 3655.3467 L 4408.5433 3662.4333 Z~solid~gge25507~~~~0#@$SOLIDREGION~99~~M 4398.9882 3699.05 L 4398.9882 3654.95 L 4411.0118 3654.95 L 4411.0118 3699.05 Z~solid~gge25508~~~~0#@$SVGNODE~{\"gId\":\"gge25509\",\"nodeName\":\"g\",\"nodeType\":1,\"layerid\":\"19\",\"attrs\":{\"c_width\":\"39.3701\",\"c_height\":\"11.6321\",\"c_rotation\":\"0,0,90\",\"z\":\"-15.748\",\"c_origin\":\"4405,3677\",\"uuid\":\"a07e9d9fdd5344c9874389e670a02175\",\"c_etype\":\"outline3D\",\"title\":\"DO-41_D2.8-L4.2-P8.00\",\"layerid\":\"19\",\"transform\":\"scale(1.1364) translate(-528.724, -441.3435)\",\"id\":\"gge25509\"},\"childNodes\":[{\"gId\":\"gge25510\",\"nodeName\":\"polyline\",\"nodeType\":1,\"attrs\":{\"fill\":\"none\",\"c_shapetype\":\"line\",\"points\":\"4404.8031 3694.3228 4405 3694.3228 4405.1968 3694.3228 4405.3937 3694.2835 4405.5905 3694.2047 4405.7874 3694.126 4405.9055 3694.0472 4405.9449 3694.0079 4406.1023 3693.8504 4406.2204 3693.7323 4406.2598 3693.6929 4406.3779 3693.5354 4406.5354 3693.1417 4406.5748 3692.748 4406.5748 3692.6299 4406.5748 3692.5118 4406.5748 3692.3543 4406.5748 3692.2756 4406.5748 3692.2362 4406.5748 3692.1181 4406.5748 3692.0394 4406.5748 3692 4406.5748 3691.8425 4406.5748 3691.5276 4406.5748 3691.4488 4406.5748 3691.4095 4406.5748 3691.1339 4406.5748 3691.0158 4406.5748 3690.7402 4406.5748 3690.2677 4406.5748 3689.7953 4406.5748 3689.3228 4406.5748 3688.811 4406.5748 3686.8425 4407.0078 3686.8425 4407.4803 3686.8425 4407.9134 3686.8425 4408.3464 3686.8425 4408.7008 3686.8425 4409.0551 3686.8425 4409.3307 3686.8425 4409.6063 3686.8425 4409.8031 3686.8425 4409.9606 3686.8425 4410.0787 3686.8425 4410.1181 3686.8425 4410.1181 3682.9055 4410.1181 3674.8347 4410.1181 3666.7638 4410.0787 3666.7638 4409.9606 3666.7638 4409.8031 3666.7638 4409.6063 3666.7638 4409.3307 3666.7638 4409.0551 3666.7638 4408.7008 3666.7638 4408.3464 3666.7638 4407.9134 3666.7638 4407.4803 3666.7638 4407.0078 3666.7638 4406.5748 3666.7638 4406.5748 3665.189 4406.5748 3664.6772 4406.5748 3664.2048 4406.5748 3663.7323 4406.5748 3663.2599 4406.5748 3662.8662 4406.5748 3662.4725 4406.5748 3662.1575 4406.5748 3661.882 4406.5748 3661.6457 4406.5748 3661.5276 4406.5748 3661.4489 4406.5748 3661.3701 4406.5748 3661.2914 4406.5748 3661.252 4406.5354 3660.8583 4406.3779 3660.4646 4406.2598 3660.3072 4406.2204 3660.2678 4406.1023 3660.1497 4405.9449 3659.9922 4405.9055 3659.9528 4405.7874 3659.8741 4405.5905 3659.7953 4405.3937 3659.7166 4405.1968 3659.6772 4405 3659.6772 4404.8031 3659.6772 4404.6063 3659.7166 4404.4094 3659.7953 4404.2126 3659.8741 4404.0945 3659.9528 4404.0551 3659.9922 4403.8976 3660.1497 4403.7795 3660.2678 4403.7401 3660.3072 4403.622 3660.4646 4403.4645 3660.8583 4403.4252 3661.252 4403.4252 3661.4095 4403.4252 3661.4489 4403.4252 3661.567 4403.4252 3661.6064 4403.4252 3661.7245 4403.4252 3661.882 4403.4252 3661.9607 4403.4252 3662.1575 4403.4252 3662.2757 4403.4252 3662.4725 4403.4252 3662.5906 4403.4252 3662.8662 4403.4252 3662.9843 4403.4252 3663.2599 4403.4252 3663.4174 4403.4252 3663.7323 4403.4252 3664.2048 4403.4252 3664.6772 4403.4252 3665.189 4403.4252 3665.9764 4403.4252 3666.7638 4402.9921 3666.7638 4402.5197 3666.7638 4402.0866 3666.7638 4401.6535 3666.7638 4401.2992 3666.7638 4400.9449 3666.7638 4400.6693 3666.7638 4400.3937 3666.7638 4400.1968 3666.7638 4400.0394 3666.7638 4399.9212 3666.7638 4399.8819 3666.7638 4399.8819 3674.8347 4399.8819 3682.9055 4399.8819 3684.874 4399.8819 3686.8425 4399.9212 3686.8425 4400.0394 3686.8425 4400.1968 3686.8425 4400.3937 3686.8425 4400.6693 3686.8425 4400.9449 3686.8425 4401.2992 3686.8425 4401.6535 3686.8425 4402.0866 3686.8425 4402.5197 3686.8425 4402.9921 3686.8425 4403.4252 3686.8425 4403.4252 3688.811 4403.4252 3689.3228 4403.4252 3689.7953 4403.4252 3690.2677 4403.4252 3690.7402 4403.4252 3691.1339 4403.4252 3691.5276 4403.4252 3691.8425 4403.4252 3692.1181 4403.4252 3692.2756 4403.4252 3692.3543 4403.4252 3692.5118 4403.4252 3692.6693 4403.4252 3692.748 4403.4645 3693.1417 4403.622 3693.5354 4403.7401 3693.6929 4403.7795 3693.7323 4403.8976 3693.8504 4404.0551 3694.0079 4404.0945 3694.0472 4404.2126 3694.126 4404.4094 3694.2047 4404.6063 3694.2835 4404.8031 3694.3228 4404.8031 3694.3228\",\"id\":\"gge25510\"}}]}#@$PAD~ELLIPSE~4405~3695.11~7.0866~7.0866~11~U1_3V3_2~1~1.9685~~90~gge25511~0~~Y~0~0~0.4~4405,3695.1102#@$PAD~ELLIPSE~4405~3658.89~7.0866~7.0866~11~J2_2~2~1.9685~~90~gge25516~0~~Y~0~0~0.4~4405,3658.8898","LIB~4401.5~3610~package`TO-92-3_L4.9-W3.7-P1.27-L`Contributor`LCSC`link`https://item.szlcsc.com/233119.html`3DModel`TO-92-3_L4.9-W3.7-P1.27-L`BOM_Supplier`LCSC`BOM_Manufacturer`SEMTECH`BOM_Manufacturer Part`2N2222`BOM_Supplier Part`C118536`BOM_LCSC Assembly`Yes`SMT Type`Extend`BOM_Assembly Type`manualWeld`BOM_Paste Type`expand`spicePre`Q`spiceSymbolName`2N2222`~~~ggecd2b6c912041b411~1~6924b36489de4921bb29ca14bf27c33f~1585896954~0~~yes~~#@$TEXT~N~4401.5~3590.5~0.6~0~0~3~~4.5~2N2222~M 4401.7 3586.98 L 4401.7 3586.78 L 4401.91 3586.37 L 4402.11 3586.16 L 4402.52 3585.96 L 4403.34 3585.96 L 4403.75 3586.16 L 4403.95 3586.37 L 4404.16 3586.78 L 4404.16 3587.19 L 4403.95 3587.6 L 4403.55 3588.21 L 4401.5 3590.25 L 4404.36 3590.25 M 4405.71 3585.96 L 4405.71 3590.25 M 4405.71 3585.96 L 4408.58 3590.25 M 4408.58 3585.96 L 4408.58 3590.25 M 4410.13 3586.98 L 4410.13 3586.78 L 4410.34 3586.37 L 4410.54 3586.16 L 4410.95 3585.96 L 4411.77 3585.96 L 4412.18 3586.16 L 4412.38 3586.37 L 4412.59 3586.78 L 4412.59 3587.19 L 4412.38 3587.6 L 4411.97 3588.21 L 4409.93 3590.25 L 4412.79 3590.25 M 4414.35 3586.98 L 4414.35 3586.78 L 4414.55 3586.37 L 4414.75 3586.16 L 4415.16 3585.96 L 4415.98 3585.96 L 4416.39 3586.16 L 4416.6 3586.37 L 4416.8 3586.78 L 4416.8 3587.19 L 4416.6 3587.6 L 4416.19 3588.21 L 4414.14 3590.25 L 4417 3590.25 M 4418.56 3586.98 L 4418.56 3586.78 L 4418.76 3586.37 L 4418.97 3586.16 L 4419.38 3585.96 L 4420.2 3585.96 L 4420.6 3586.16 L 4420.81 3586.37 L 4421.01 3586.78 L 4421.01 3587.19 L 4420.81 3587.6 L 4420.4 3588.21 L 4418.35 3590.25 L 4421.22 3590.25 M 4422.77 3586.98 L 4422.77 3586.78 L 4422.98 3586.37 L 4423.18 3586.16 L 4423.59 3585.96 L 4424.41 3585.96 L 4424.82 3586.16 L 4425.02 3586.37 L 4425.23 3586.78 L 4425.23 3587.19 L 4425.02 3587.6 L 4424.61 3588.21 L 4422.57 3590.25 L 4425.43 3590.25~none~gge25523~~0~#@$TEXT~P~4405.5~3623~0.6~0~0~3~~4.5~Q1~M 4406.73 3618.46 L 4406.32 3618.66 L 4405.91 3619.07 L 4405.7 3619.48 L 4405.5 3620.1 L 4405.5 3621.12 L 4405.7 3621.73 L 4405.91 3622.14 L 4406.32 3622.55 L 4406.73 3622.75 L 4407.55 3622.75 L 4407.95 3622.55 L 4408.36 3622.14 L 4408.57 3621.73 L 4408.77 3621.12 L 4408.77 3620.1 L 4408.57 3619.48 L 4408.36 3619.07 L 4407.95 3618.66 L 4407.55 3618.46 L 4406.73 3618.46 M 4407.34 3621.94 L 4408.57 3623.16 M 4410.12 3619.28 L 4410.53 3619.07 L 4411.15 3618.46 L 4411.15 3622.75~~gge25525~~0~#@$TRACK~1~3~~4409.2949 3615.905 4393.7051 3615.905~gge25527~0#@$ARC~1~3~~M 4409.3 3615.91 A 9.7796 9.7796 0 1 0 4393.7 3615.91~~gge25528~0#@$SVGNODE~{\"gId\":\"gge25529\",\"nodeName\":\"g\",\"nodeType\":1,\"layerid\":\"19\",\"attrs\":{\"c_width\":\"18.078719748\",\"c_height\":\"14.144550451\",\"c_rotation\":\"0,0,0\",\"z\":\"-19.685\",\"c_origin\":\"4401.5,3607.7323\",\"uuid\":\"db569d051dcd4484acf2f9e50678fca3\",\"c_etype\":\"outline3D\",\"title\":\"TO-92-3_L4.9-W3.7-P1.27-L\",\"layerid\":\"19\",\"transform\":\"scale(1) translate(0, 0)\",\"id\":\"gge25529\"},\"childNodes\":[{\"gId\":\"gge25530\",\"nodeName\":\"polyline\",\"nodeType\":1,\"attrs\":{\"fill\":\"none\",\"c_shapetype\":\"line\",\"points\":\"4393.0158 3604.8976 4393.0552 3606.3543 4393.3701 3609.8582 4393.4095 3610.0551 4393.4883 3610.2125 4393.6064 3610.37 4393.7638 3610.4881 4393.9607 3610.5275 4394.1575 3610.5669 4398.6851 3610.5669 4399.3544 3610.5669 4399.5906 3610.5669 4400.2599 3610.5669 4400.4567 3610.5669 4400.4961 3610.5669 4400.5355 3610.5669 4400.6142 3610.5669 4400.693 3610.5669 4400.7323 3610.5669 4400.7717 3610.5669 4400.8111 3610.5669 4400.8111 3610.5275 4400.8504 3610.5669 4400.7717 3610.5669 4400.7717 3610.5275 4400.8504 3610.5275 4400.8504 3610.5669 4400.8111 3610.5275 4400.8504 3610.5275 4400.8898 3610.5669 4400.8504 3610.5669 4400.8504 3610.5275 4400.8898 3610.5275 4400.8898 3610.5669 4400.8504 3610.5275 4400.7717 3610.5275 4400.7323 3610.5275 4400.693 3610.5275 4400.6142 3610.5275 4400.5749 3610.5275 4400.5355 3610.5275 4400.4174 3610.5275 4400.4174 3610.5669 4400.2599 3610.5669 4400.2599 3610.5275 4399.7875 3610.5275 4399.5906 3610.5275 4399.3544 3610.5275 4398.6851 3610.5275 4398.6851 3610.5669 4394.1575 3610.5669 4408.6851 3609.9369 4409.9843 3610.5669 4405.378 3610.5669 4405.3386 3610.5275 4405.2993 3610.5275 4405.2599 3610.5275 4405.1811 3610.5275 4405.1418 3610.5275 4405.1024 3610.5275 4405.063 3610.5275 4405.0237 3610.5275 4404.9843 3610.5275 4404.9449 3610.5275 4404.9056 3610.5275 4404.8268 3610.5275 4404.7481 3610.5275 4404.7087 3610.5275 4404.6693 3610.5275 4404.63 3610.5275 4404.5906 3610.5275 4404.5512 3610.5275 4404.5119 3610.5275 4404.4725 3610.5275 4404.4331 3610.5275 4404.3937 3610.5275 4404.315 3610.5275 4404.2363 3610.5275 4404.1575 3610.5275 4404.1182 3610.5275 4404.0788 3610.5275 4404.0394 3610.5275 4404.0394 3610.5669 4403.8426 3610.5669 4403.8426 3610.5275 4403.8032 3610.5275 4403.7638 3610.5275 4403.6851 3610.5275 4403.6457 3610.5275 4403.6063 3610.5275 4403.567 3610.5275 4403.5276 3610.5275 4403.4489 3610.5275 4403.4095 3610.5275 4403.3701 3610.5275 4403.2914 3610.5275 4403.252 3610.5275 4403.1733 3610.5275 4403.1339 3610.5275 4403.0945 3610.5275 4403.0552 3610.5275 4402.9764 3610.5275 4402.9371 3610.5275 4402.8583 3610.5275 4402.8189 3610.5275 4402.7402 3610.5275 4402.7008 3610.5275 4402.6221 3610.5275 4402.5827 3610.5275 4402.5434 3610.5275 4402.5434 3610.5669 4402.3465 3610.5669 4402.3465 3610.5275 4402.3071 3610.5275 4402.2284 3610.5275 4402.189 3610.5275 4402.1103 3610.5275 4402.0709 3610.5275 4402.0315 3610.5275 4401.9528 3610.5275 4401.9134 3610.5275 4401.8347 3610.5275 4401.7166 3610.5275 4401.6378 3610.5275 4401.5591 3610.5275 4401.4804 3610.5275 4401.3623 3610.5275 4401.2441 3610.5275 4401.2048 3610.5275 4401.126 3610.5275 4401.0867 3610.5275 4401.0473 3610.5275 4401.0079 3610.5275 4400.9292 3610.5275 4400.8898 3610.5275 4400.8504 3610.5275 4400.8111 3610.5275 4400.7717 3610.5275 4400.7323 3610.5669 4400.7323 3610.5275 4400.7717 3610.5275 4400.7717 3610.5669 4400.7323 3610.5669 4400.7717 3610.5275 4400.8111 3610.5275 4400.8111 3610.5669 4400.7717 3610.5669 4393.0158 3604.8976 4393.0158 3604.8976\",\"id\":\"gge25530\"}}]}#@$PAD~OVAL~4406.5~3610~3.5433~6.2992~11~J2_2~3~1.378~4406.5 3608.6221 4406.5 3611.378~0~gge25531~0~~Y~0~0~0.4~4406.5,3610#@$PAD~OVAL~4401.5~3610~3.5433~6.2992~11~Q1_2~2~1.378~4401.5 3608.6221 4401.5 3611.378~0~gge25536~0~~Y~0~0~0.4~4401.5,3610#@$PAD~RECT~4396.5~3610~3.5433~6.2992~11~GND~1~1.378~4394.7284 3606.8504 4398.2717 3606.8504 4398.2717 3613.1496 4394.7284 3613.1496~0~gge25541~0~~Y~0~0~0.4~4396.5,3610","LIB~4216.8504~3632.9331~package`WIRELM-TH_DWM1000`BOM_Supplier`LCSC`BOM_Manufacturer`DecaWave`BOM_Manufacturer Part`DWM1000`BOM_Supplier Part`C95238`spicePre`U`spiceSymbolName`DWM1000`description``timeStamp`1466415331`link`https://item.szlcsc.com/96439.html`Contributor`įĢ‹åˆ›EDAåŽ˜æ–šå°čŖ…åē“`3DModel`WIRELM-TH_L23.0-W13.0-H3.0-DWM1000`~~~gge40e5c90f659fccfc~1~921ff2190df246a4b1016c11071a51a1~1615539076~0~~yes~~#@$TEXT~N~4216.85~3558.725~0.6~0~0~3~~4.5~DWM1000~M 4216.8494 3554.1851 L 4216.8494 3558.4751 M 4216.8494 3554.1851 L 4218.2794 3554.1851 L 4218.8994 3554.3851 L 4219.2994 3554.7951 L 4219.5094 3555.2051 L 4219.7094 3555.8251 L 4219.7094 3556.8451 L 4219.5094 3557.4551 L 4219.2994 3557.8651 L 4218.8994 3558.2751 L 4218.2794 3558.4751 L 4216.8494 3558.4751 M 4221.0594 3554.1851 L 4222.0894 3558.4751 M 4223.1094 3554.1851 L 4222.0894 3558.4751 M 4223.1094 3554.1851 L 4224.1294 3558.4751 M 4225.1494 3554.1851 L 4224.1294 3558.4751 M 4226.4994 3554.1851 L 4226.4994 3558.4751 M 4226.4994 3554.1851 L 4228.1394 3558.4751 M 4229.7794 3554.1851 L 4228.1394 3558.4751 M 4229.7794 3554.1851 L 4229.7794 3558.4751 M 4231.1294 3555.0051 L 4231.5394 3554.7951 L 4232.1494 3554.1851 L 4232.1494 3558.4751 M 4234.7294 3554.1851 L 4234.1094 3554.3851 L 4233.6994 3555.0051 L 4233.4994 3556.0251 L 4233.4994 3556.6351 L 4233.6994 3557.6651 L 4234.1094 3558.2751 L 4234.7294 3558.4751 L 4235.1394 3558.4751 L 4235.7494 3558.2751 L 4236.1594 3557.6651 L 4236.3594 3556.6351 L 4236.3594 3556.0251 L 4236.1594 3555.0051 L 4235.7494 3554.3851 L 4235.1394 3554.1851 L 4234.7294 3554.1851 M 4238.9394 3554.1851 L 4238.3294 3554.3851 L 4237.9194 3555.0051 L 4237.7094 3556.0251 L 4237.7094 3556.6351 L 4237.9194 3557.6651 L 4238.3294 3558.2751 L 4238.9394 3558.4751 L 4239.3494 3558.4751 L 4239.9594 3558.2751 L 4240.3694 3557.6651 L 4240.5794 3556.6351 L 4240.5794 3556.0251 L 4240.3694 3555.0051 L 4239.9594 3554.3851 L 4239.3494 3554.1851 L 4238.9394 3554.1851 M 4243.1494 3554.1851 L 4242.5394 3554.3851 L 4242.1294 3555.0051 L 4241.9294 3556.0251 L 4241.9294 3556.6351 L 4242.1294 3557.6651 L 4242.5394 3558.2751 L 4243.1494 3558.4751 L 4243.5594 3558.4751 L 4244.1794 3558.2751 L 4244.5894 3557.6651 L 4244.7894 3556.6351 L 4244.7894 3556.0251 L 4244.5894 3555.0051 L 4244.1794 3554.3851 L 4243.5594 3554.1851 L 4243.1494 3554.1851~none~gge958~~0~#@$TEXT~P~4213.351~3610.433~0.6~0~0~3~~4.5~U5~M 4213.3504 3605.8931 L 4213.3504 3608.9631 L 4213.5504 3609.5731 L 4213.9604 3609.9831 L 4214.5804 3610.1831 L 4214.9904 3610.1831 L 4215.6004 3609.9831 L 4216.0104 3609.5731 L 4216.2104 3608.9631 L 4216.2104 3605.8931 M 4220.0204 3605.8931 L 4217.9704 3605.8931 L 4217.7704 3607.7331 L 4217.9704 3607.5331 L 4218.5904 3607.3231 L 4219.2004 3607.3231 L 4219.8104 3607.5331 L 4220.2204 3607.9331 L 4220.4304 3608.5531 L 4220.4304 3608.9631 L 4220.2204 3609.5731 L 4219.8104 3609.9831 L 4219.2004 3610.1831 L 4218.5904 3610.1831 L 4217.9704 3609.9831 L 4217.7704 3609.7831 L 4217.5604 3609.3731~~gge960~~0~#@$TRACK~1~3~~4191.2594 3567.1741 4242.4404 3567.1741~gge321~0#@$TRACK~1~3~~4216.8494 3657.7251 4216.8494 3606.8591~gge322~0#@$TRACK~1~3~~4191.2594 3567.1741 4191.2594 3605.2531~gge392~0#@$TRACK~1~3~~4191.2594 3649.5921 4191.2594 3657.7251~gge393~0#@$TRACK~1~3~~4242.4404 3567.1741 4242.4404 3605.2531~gge395~0#@$TRACK~1~3~~4242.4404 3649.5431 4242.4404 3657.7251~gge396~0#@$TRACK~1~3~~4191.2594 3657.7251 4194.6784 3657.7251~gge25573~0#@$TRACK~1~3~~4239.0314 3657.7251 4242.4404 3657.7251~gge399~0#@$CIRCLE~4199.133~3604.576~1.18~1~3~gge315~0~~#@$SOLIDREGION~100~~M 4187.2184 3606.1631 L 4196.8644 3606.1631 L 4196.8644 3610.1001 L 4187.2184 3610.1001 Z ~solid~gge400~~~~0#@$SOLIDREGION~100~~M 4187.2104 3611.6701 L 4196.8564 3611.6701 L 4196.8564 3615.6071 L 4187.2104 3615.6071 Z ~solid~gge401~~~~0#@$SOLIDREGION~100~~M 4187.2064 3617.1811 L 4196.8524 3617.1811 L 4196.8524 3621.1181 L 4187.2064 3621.1181 Z ~solid~gge402~~~~0#@$SOLIDREGION~100~~M 4187.2104 3622.6931 L 4196.8564 3622.6931 L 4196.8564 3626.6301 L 4187.2104 3626.6301 Z ~solid~gge403~~~~0#@$SOLIDREGION~100~~M 4187.2254 3628.2151 L 4196.8714 3628.2151 L 4196.8714 3632.1521 L 4187.2254 3632.1521 Z ~solid~gge404~~~~0#@$SOLIDREGION~100~~M 4187.2104 3633.7261 L 4196.8564 3633.7261 L 4196.8564 3637.6631 L 4187.2104 3637.6631 Z ~solid~gge405~~~~0#@$SOLIDREGION~100~~M 4187.2184 3639.2291 L 4196.8644 3639.2291 L 4196.8644 3643.1661 L 4187.2184 3643.1661 Z ~solid~gge406~~~~0#@$SOLIDREGION~100~~M 4187.2104 3644.7451 L 4196.8564 3644.7451 L 4196.8564 3648.6821 L 4187.2104 3648.6821 Z ~solid~gge407~~~~0#@$SOLIDREGION~100~~M 4195.5884 3652.8951 L 4199.5254 3652.8951 L 4199.5254 3662.5411 L 4195.5884 3662.5411 Z ~solid~gge408~~~~0#@$SOLIDREGION~100~~M 4201.1144 3652.9031 L 4205.0514 3652.9031 L 4205.0514 3662.5491 L 4201.1144 3662.5491 Z ~solid~gge409~~~~0#@$SOLIDREGION~100~~M 4206.6254 3652.9111 L 4210.5624 3652.9111 L 4210.5624 3662.5571 L 4206.6254 3662.5571 Z ~solid~gge410~~~~0#@$SOLIDREGION~100~~M 4212.1374 3652.9111 L 4216.0744 3652.9111 L 4216.0744 3662.5571 L 4212.1374 3662.5571 Z ~solid~gge411~~~~0#@$SOLIDREGION~100~~M 4217.6494 3652.9111 L 4221.5864 3652.9111 L 4221.5864 3662.5571 L 4217.6494 3662.5571 Z ~solid~gge412~~~~0#@$SOLIDREGION~100~~M 4223.1614 3652.9111 L 4227.0984 3652.9111 L 4227.0984 3662.5571 L 4223.1614 3662.5571 Z ~solid~gge413~~~~0#@$SOLIDREGION~100~~M 4228.6734 3652.9111 L 4232.6104 3652.9111 L 4232.6104 3662.5571 L 4228.6734 3662.5571 Z ~solid~gge414~~~~0#@$SOLIDREGION~100~~M 4234.1844 3652.9071 L 4238.1214 3652.9071 L 4238.1214 3662.5531 L 4234.1844 3662.5531 Z ~solid~gge415~~~~0#@$SOLIDREGION~100~~M 4236.8484 3644.6961 L 4246.4944 3644.6961 L 4246.4944 3648.6331 L 4236.8484 3648.6331 Z ~solid~gge416~~~~0#@$SOLIDREGION~100~~M 4236.8344 3639.2051 L 4246.4804 3639.2051 L 4246.4804 3643.1421 L 4236.8344 3643.1421 Z ~solid~gge417~~~~0#@$SOLIDREGION~100~~M 4236.8304 3633.6931 L 4246.4764 3633.6931 L 4246.4764 3637.6301 L 4236.8304 3637.6301 Z ~solid~gge418~~~~0#@$SOLIDREGION~100~~M 4236.8324 3628.2051 L 4246.4784 3628.2051 L 4246.4784 3632.1421 L 4236.8324 3632.1421 Z ~solid~gge419~~~~0#@$SOLIDREGION~100~~M 4236.8284 3622.6981 L 4246.4744 3622.6981 L 4246.4744 3626.6351 L 4236.8284 3626.6351 Z ~solid~gge420~~~~0#@$SOLIDREGION~100~~M 4236.8244 3617.1861 L 4246.4704 3617.1861 L 4246.4704 3621.1231 L 4236.8244 3621.1231 Z ~solid~gge421~~~~0#@$SOLIDREGION~100~~M 4236.8324 3611.6791 L 4246.4784 3611.6791 L 4246.4784 3615.6161 L 4236.8324 3615.6161 Z ~solid~gge422~~~~0#@$SOLIDREGION~100~~M 4236.8324 3606.1631 L 4246.4784 3606.1631 L 4246.4784 3610.1001 L 4236.8324 3610.1001 Z ~solid~gge423~~~~0#@$SOLIDREGION~99~~M 4187.2064 3566.6741 L 4246.5494 3566.6741 L 4246.5494 3662.5571 L 4187.2064 3662.5571 Z ~solid~gge424~~~~0#@$SVGNODE~{\"gId\":\"g1_outline\",\"nodeName\":\"g\",\"nodeType\":1,\"layerid\":\"19\",\"attrs\":{\"c_width\":\"51.181\",\"c_height\":\"90.551\",\"c_rotation\":\"0,0,0\",\"z\":\"0\",\"c_origin\":\"4216.8504,3611.4016\",\"uuid\":\"ee7a724db94446e1982b4c8965f92286\",\"c_etype\":\"outline3D\",\"id\":\"g1_outline\",\"title\":\"WIRELM-TH_L23.0-W13.0-H3.0-DWM1000\",\"layerid\":\"19\",\"transform\":\"scale(1) translate(0, 0)\"},\"childNodes\":[{\"gId\":\"g1_outline_line0\",\"nodeName\":\"polyline\",\"nodeType\":1,\"attrs\":{\"fill\":\"none\",\"id\":\"g1_outline_line0\",\"c_shapetype\":\"line\",\"points\":\"4191.2599 3566.1261 4191.2599 3605.8898 4191.2599 3606.4804 4191.6536 3606.5197 4192.0473 3606.6772 4192.3623 3606.9528 4192.6379 3607.2678 4192.7953 3607.6615 4192.8347 3608.0552 4192.7953 3608.4489 4192.6379 3608.8426 4192.3623 3609.1575 4192.0473 3609.4331 4191.6536 3609.5906 4191.2599 3609.63 4191.2599 3610.2205 4191.2599 3611.4016 4191.2599 3611.9922 4191.6536 3612.0315 4192.0473 3612.189 4192.3623 3612.4646 4192.6379 3612.7796 4192.7953 3613.1733 4192.8347 3613.567 4192.7953 3613.9607 4192.6379 3614.3544 4192.3623 3614.6693 4192.0473 3614.9449 4191.6536 3615.1024 4191.2599 3615.1418 4191.2599 3615.7323 4191.2599 3616.9134 4191.2599 3617.504 4191.6536 3617.5433 4192.0473 3617.7008 4192.3623 3617.9764 4192.6379 3618.2914 4192.7953 3618.6851 4192.8347 3619.0788 4192.7953 3619.4725 4192.6379 3619.8662 4192.3623 3620.1811 4192.0473 3620.4567 4191.6536 3620.6142 4191.2599 3620.6536 4191.2599 3621.2441 4191.2599 3622.4252 4191.2599 3623.0158 4191.6536 3623.0551 4192.0473 3623.2126 4192.3623 3623.4882 4192.6379 3623.8032 4192.7953 3624.1969 4192.8347 3624.5906 4192.7953 3624.9843 4192.6379 3625.378 4192.3623 3625.6929 4192.0473 3625.9685 4191.6536 3626.126 4191.2599 3626.1654 4191.2599 3626.7559 4191.2599 3627.937 4191.2599 3628.5276 4191.6536 3628.5669 4192.0473 3628.7244 4192.3623 3629 4192.6379 3629.315 4192.7953 3629.7087 4192.8347 3630.1024 4192.7953 3630.4961 4192.6379 3630.8898 4192.3623 3631.2047 4192.0473 3631.4803 4191.6536 3631.6378 4191.2599 3631.6772 4191.2599 3632.2677 4191.2599 3633.4488 4191.2599 3634.0394 4191.6536 3634.0787 4192.0473 3634.2362 4192.3623 3634.5118 4192.6379 3634.8268 4192.7953 3635.2205 4192.8347 3635.6142 4192.7953 3636.0079 4192.6379 3636.4016 4192.3623 3636.7165 4192.0473 3636.9921 4191.6536 3637.1496 4191.2599 3637.189 4191.2599 3637.7795 4191.2599 3638.9606 4191.2599 3639.5512 4191.6536 3639.5905 4192.0473 3639.748 4192.3623 3640.0236 4192.6379 3640.3386 4192.7953 3640.7323 4192.8347 3641.126 4192.7953 3641.5197 4192.6379 3641.9134 4192.3623 3642.2283 4192.0473 3642.5039 4191.6536 3642.6614 4191.2599 3642.7008 4191.2599 3643.2913 4191.2599 3644.4724 4191.2599 3645.063 4191.6536 3645.1023 4192.0473 3645.2598 4192.3623 3645.5354 4192.6379 3645.8504 4192.7953 3646.2441 4192.8347 3646.6378 4192.7953 3647.0315 4192.6379 3647.4252 4192.3623 3647.7401 4192.0473 3648.0157 4191.6536 3648.1732 4191.2599 3648.2126 4191.2599 3648.8031 4191.2599 3656.6771 4195.3938 3656.6771 4195.9843 3656.6771 4196.0237 3656.2834 4196.1812 3655.8897 4196.4567 3655.5747 4196.7717 3655.2992 4197.1654 3655.1417 4197.5591 3655.1023 4197.9528 3655.1417 4198.3465 3655.2992 4198.6615 3655.5747 4198.9371 3655.8897 4199.0945 3656.2834 4199.1339 3656.6771 4199.7245 3656.6771 4200.9056 3656.6771 4201.4961 3656.6771 4201.5355 3656.2834 4201.693 3655.8897 4201.9685 3655.5747 4202.2835 3655.2992 4202.6772 3655.1417 4203.0709 3655.1023 4203.4646 3655.1417 4203.8583 3655.2992 4204.1733 3655.5747 4204.4489 3655.8897 4204.6063 3656.2834 4204.6457 3656.6771 4205.2363 3656.6771 4206.4174 3656.6771 4207.0079 3656.6771 4207.0473 3656.2834 4207.2048 3655.8897 4207.4803 3655.5747 4207.7953 3655.2992 4208.189 3655.1417 4208.5827 3655.1023 4208.9764 3655.1417 4209.3701 3655.2992 4209.6851 3655.5747 4209.9607 3655.8897 4210.1181 3656.2834 4210.1575 3656.6771 4210.7481 3656.6771 4211.9292 3656.6771 4212.5197 3656.6771 4212.5591 3656.2834 4212.7166 3655.8897 4212.9921 3655.5747 4213.3071 3655.2992 4213.7008 3655.1417 4214.0945 3655.1023 4214.4882 3655.1417 4214.8819 3655.2992 4215.1969 3655.5747 4215.4725 3655.8897 4215.6299 3656.2834 4215.6693 3656.6771 4216.2599 3656.6771 4216.378 3656.6771 4217.441 3656.6771 4218.0315 3656.6771 4218.0709 3656.2834 4218.2284 3655.8897 4218.5039 3655.5747 4218.8189 3655.2992 4219.2126 3655.1417 4219.6063 3655.1023 4220 3655.1417 4220.3937 3655.2992 4220.7087 3655.5747 4220.9843 3655.8897 4221.1417 3656.2834 4221.1811 3656.6771 4221.7716 3656.6771 4222.9528 3656.6771 4223.5433 3656.6771 4223.5827 3656.2834 4223.7402 3655.8897 4224.0157 3655.5747 4224.3307 3655.2992 4224.7244 3655.1417 4225.1181 3655.1023 4225.5118 3655.1417 4225.9055 3655.2992 4226.2205 3655.5747 4226.4961 3655.8897 4226.6535 3656.2834 4226.6929 3656.6771 4227.2835 3656.6771 4228.4646 3656.6771 4229.0551 3656.6771 4229.0945 3656.2834 4229.2519 3655.8897 4229.5275 3655.5747 4229.8425 3655.2992 4230.2362 3655.1417 4230.6299 3655.1023 4231.0236 3655.1417 4231.4173 3655.2992 4231.7323 3655.5747 4232.0079 3655.8897 4232.1653 3656.2834 4232.2047 3656.6771 4232.7953 3656.6771 4233.9764 3656.6771 4234.5669 3656.6771 4234.6063 3656.2834 4234.7638 3655.8897 4235.0393 3655.5747 4235.3543 3655.2992 4235.748 3655.1417 4236.1417 3655.1023 4236.5354 3655.1417 4236.9291 3655.2992 4237.2441 3655.5747 4237.5197 3655.8897 4237.6771 3656.2834 4237.7165 3656.6771 4238.3071 3656.6771 4242.4409 3656.6771 4242.4409 3648.8031 4242.4409 3648.2126 4242.0472 3648.1732 4241.6535 3648.0157 4241.3385 3647.7401 4241.063 3647.4252 4240.9055 3647.0315 4240.8661 3646.6378 4240.9055 3646.2441 4241.063 3645.8504 4241.3385 3645.5354 4241.6535 3645.2598 4242.0472 3645.1023 4242.4409 3645.063 4242.4409 3644.4724 4242.4409 3643.2913 4242.4409 3642.7008 4242.0472 3642.6614 4241.6535 3642.5039 4241.3385 3642.2283 4241.063 3641.9134 4240.9055 3641.5197 4240.8661 3641.126 4240.9055 3640.7323 4241.063 3640.3386 4241.3385 3640.0236 4241.6535 3639.748 4242.0472 3639.5905 4242.4409 3639.5512 4242.4409 3638.9606 4242.4409 3637.7795 4242.4409 3637.189 4242.0472 3637.1496 4241.6535 3636.9921 4241.3385 3636.7165 4241.063 3636.4016 4240.9055 3636.0079 4240.8661 3635.6142 4240.9055 3635.2205 4241.063 3634.8268 4241.3385 3634.5118 4241.6535 3634.2362 4242.0472 3634.0787 4242.4409 3634.0394 4242.4409 3633.4488 4242.4409 3632.2677 4242.4409 3631.6772 4242.0472 3631.6378 4241.6535 3631.4803 4241.3385 3631.2047 4241.063 3630.8898 4240.9055 3630.4961 4240.8661 3630.1024 4240.9055 3629.7087 4241.063 3629.315 4241.3385 3629 4241.6535 3628.7244 4242.0472 3628.5669 4242.4409 3628.5276 4242.4409 3627.937 4242.4409 3626.7559 4242.4409 3626.1654 4242.0472 3626.126 4241.6535 3625.9685 4241.3385 3625.6929 4241.063 3625.378 4240.9055 3624.9843 4240.8661 3624.5906 4240.9055 3624.1969 4241.063 3623.8032 4241.3385 3623.4882 4241.6535 3623.2126 4242.0472 3623.0551 4242.4409 3623.0158 4242.4409 3622.4252 4242.4409 3621.2441 4242.4409 3620.6536 4242.0472 3620.6142 4241.6535 3620.4567 4241.3385 3620.1811 4241.063 3619.8662 4240.9055 3619.4725 4240.8661 3619.0788 4240.9055 3618.6851 4241.063 3618.2914 4241.3385 3617.9764 4241.6535 3617.7008 4242.0472 3617.5433 4242.4409 3617.504 4242.4409 3616.9134 4242.4409 3615.7323 4242.4409 3615.1418 4242.0472 3615.1024 4241.6535 3614.9449 4241.3385 3614.6693 4241.063 3614.3544 4240.9055 3613.9607 4240.8661 3613.567 4240.9055 3613.1733 4241.063 3612.7796 4241.3385 3612.4646 4241.6535 3612.189 4242.0472 3612.0315 4242.4409 3611.9922 4242.4409 3611.4016 4242.4409 3610.2205 4242.4409 3609.63 4242.0472 3609.5906 4241.6535 3609.4331 4241.3385 3609.1575 4241.063 3608.8426 4240.9055 3608.4489 4240.8661 3608.0552 4240.9055 3607.6615 4241.063 3607.2678 4241.3385 3606.9528 4241.6535 3606.6772 4242.0472 3606.5197 4242.4409 3606.4804 4242.4409 3605.8898 4242.4409 3566.1261 4216.378 3566.1261 4191.2599 3566.1261 4191.2599 3566.1261\"}}]}#@$PAD~RECT~4192.041~3608.132~9.6457~3.937~1~~1~0~4187.2184 3606.1631 4196.8644 3606.1631 4196.8644 3610.1001 4187.2184 3610.1001~0~rep10~0~~Y~0~0~0.4~4192.0414,3608.1321#@$PAD~RECT~4192.033~3613.639~9.6457~3.937~1~~2~0~4187.2104 3611.6701 4196.8564 3611.6701 4196.8564 3615.6071 4187.2104 3615.6071~0~gge323~0~~Y~0~0~0.4~4192.0334,3613.6391#@$PAD~RECT~4192.029~3619.15~9.6457~3.937~1~U3_27~3~0~4187.2064 3617.1811 4196.8524 3617.1811 4196.8524 3621.1181 4187.2064 3621.1181~0~gge326~0~~Y~0~0~0.4~4192.0294,3619.1501#@$PAD~RECT~4192.033~3624.662~9.6457~3.937~1~~4~0~4187.2104 3622.6931 4196.8564 3622.6931 4196.8564 3626.6301 4187.2104 3626.6301~0~gge329~0~~Y~0~0~0.4~4192.0334,3624.6621#@$PAD~RECT~4192.048~3630.184~9.6457~3.937~1~U1_3V3_2~5~0~4187.2254 3628.2151 4196.8714 3628.2151 4196.8714 3632.1521 4187.2254 3632.1521~0~gge332~0~~Y~0~0~0.4~4192.0484,3630.1841#@$PAD~RECT~4192.033~3635.695~9.6457~3.937~1~U1_3V3_2~6~0~4187.2104 3633.7261 4196.8564 3633.7261 4196.8564 3637.6631 4187.2104 3637.6631~0~gge335~0~~Y~0~0~0.4~4192.0334,3635.6951#@$PAD~RECT~4192.041~3641.198~9.6457~3.937~1~U1_3V3_2~7~0~4187.2184 3639.2291 4196.8644 3639.2291 4196.8644 3643.1661 4187.2184 3643.1661~0~gge338~0~~Y~0~0~0.4~4192.0414,3641.1981#@$PAD~RECT~4192.033~3646.714~9.6457~3.937~1~GND~8~0~4187.2104 3644.7451 4196.8564 3644.7451 4196.8564 3648.6821 4187.2104 3648.6821~0~gge341~0~~Y~0~0~0.4~4192.0334,3646.7141#@$PAD~RECT~4197.557~3657.718~9.6457~3.937~1~~9~0~4195.5884 3662.5411 4195.5884 3652.8951 4199.5254 3652.8951 4199.5254 3662.5411~90~gge344~0~~Y~0~0~0.4~4197.5574,3657.7181#@$PAD~RECT~4203.083~3657.726~9.6457~3.937~1~~10~0~4201.1144 3662.5491 4201.1144 3652.9031 4205.0514 3652.9031 4205.0514 3662.5491~90~gge347~0~~Y~0~0~0.4~4203.0834,3657.7261#@$PAD~RECT~4208.594~3657.734~9.6457~3.937~1~~11~0~4206.6254 3662.5571 4206.6254 3652.9111 4210.5624 3652.9111 4210.5624 3662.5571~90~gge350~0~~Y~0~0~0.4~4208.5944,3657.7341#@$PAD~RECT~4214.106~3657.734~9.6457~3.937~1~~12~0~4212.1374 3662.5571 4212.1374 3652.9111 4216.0744 3652.9111 4216.0744 3662.5571~90~gge353~0~~Y~0~0~0.4~4214.1064,3657.7341#@$PAD~RECT~4219.618~3657.734~9.6457~3.937~1~~13~0~4217.6494 3662.5571 4217.6494 3652.9111 4221.5864 3652.9111 4221.5864 3662.5571~90~gge356~0~~Y~0~0~0.4~4219.6184,3657.7341#@$PAD~RECT~4225.13~3657.734~9.6457~3.937~1~~14~0~4223.1614 3662.5571 4223.1614 3652.9111 4227.0984 3652.9111 4227.0984 3662.5571~90~gge359~0~~Y~0~0~0.4~4225.1304,3657.7341#@$PAD~RECT~4230.642~3657.734~9.6457~3.937~1~~15~0~4228.6734 3662.5571 4228.6734 3652.9111 4232.6104 3652.9111 4232.6104 3662.5571~90~gge362~0~~Y~0~0~0.4~4230.6424,3657.7341#@$PAD~RECT~4236.153~3657.73~9.6457~3.937~1~GND~16~0~4234.1844 3662.5531 4234.1844 3652.9071 4238.1214 3652.9071 4238.1214 3662.5531~90~gge365~0~~Y~0~0~0.4~4236.1534,3657.7301#@$PAD~RECT~4241.671~3646.665~9.6457~3.937~1~U3_28~17~0~4246.4944 3648.6331 4236.8484 3648.6331 4236.8484 3644.6961 4246.4944 3644.6961~180~gge368~0~~Y~0~0~0.4~4241.6714,3646.6651#@$PAD~RECT~4241.657~3641.174~9.6457~3.937~1~U1_14~18~0~4246.4804 3643.1421 4236.8344 3643.1421 4236.8344 3639.2051 4246.4804 3639.2051~180~gge371~0~~Y~0~0~0.4~4241.6574,3641.1741#@$PAD~RECT~4241.653~3635.662~9.6457~3.937~1~U1_13~19~0~4246.4764 3637.6301 4236.8304 3637.6301 4236.8304 3633.6931 4246.4764 3633.6931~180~gge374~0~~Y~0~0~0.4~4241.6534,3635.6621#@$PAD~RECT~4241.655~3630.174~9.6457~3.937~1~U1_02~20~0~4236.8324 3628.2051 4246.4784 3628.2051 4246.4784 3632.1421 4236.8324 3632.1421~0~gge377~0~~Y~0~0~0.4~4241.6554,3630.1741#@$PAD~RECT~4241.651~3624.667~9.6457~3.937~1~GND~21~0~4236.8284 3622.6981 4246.4744 3622.6981 4246.4744 3626.6351 4236.8284 3626.6351~0~gge380~0~~Y~0~0~0.4~4241.6514,3624.6671#@$PAD~RECT~4241.647~3619.155~9.6457~3.937~1~U1_15~22~0~4236.8244 3617.1861 4246.4704 3617.1861 4246.4704 3621.1231 4236.8244 3621.1231~0~gge383~0~~Y~0~0~0.4~4241.6474,3619.1551#@$PAD~RECT~4241.655~3613.648~9.6457~3.937~1~GND~23~0~4236.8324 3611.6791 4246.4784 3611.6791 4246.4784 3615.6161 4236.8324 3615.6161~0~gge386~0~~Y~0~0~0.4~4241.6554,3613.6481#@$PAD~RECT~4241.655~3608.132~9.6457~3.937~1~GND~24~0~4236.8324 3606.1631 4246.4784 3606.1631 4246.4784 3610.1001 4236.8324 3610.1001~0~gge389~0~~Y~0~0~0.4~4241.6554,3608.1321","LIB~4232~3715.5~package`M1X2_AWG20`Contributor`Nemo Capitano`spicePre`J`spiceSymbolName`CON_HEADER_1X02-PTH`BOM_Manufacturer Part``~180~~gge47ec3a850f2d689e~1~519ab30562c645fc9071b35164bd0656~1612927096~0~~yes~~#@$TEXT~N~4202.34~3733.29~0.6~0~0~3~~4.5~MAIN BAT~M 4202.34 3728.75L4202.34 3733.04 M 4202.34 3728.75L4203.98 3733.04 M 4205.61 3728.75L4203.98 3733.04 M 4205.61 3728.75L4205.61 3733.04 M 4208.6 3728.75L4206.96 3733.04 M 4208.6 3728.75L4210.24 3733.04 M 4207.58 3731.61L4209.62 3731.61 M 4211.59 3728.75L4211.59 3733.04 M 4212.94 3728.75L4212.94 3733.04 M 4212.94 3728.75L4215.8 3733.04 M 4215.8 3728.75L4215.8 3733.04 M 4220.3 3728.75L4220.3 3733.04 M 4220.3 3728.75L4222.14 3728.75 L4222.75 3728.95 L4222.96 3729.16 L4223.16 3729.57 L4223.16 3729.98 L4222.96 3730.39 L4222.75 3730.59 L4222.14 3730.79 M 4220.3 3730.79L4222.14 3730.79 L4222.75 3731 L4222.96 3731.2 L4223.16 3731.61 L4223.16 3732.23 L4222.96 3732.64 L4222.75 3732.84 L4222.14 3733.04 L4220.3 3733.04 M 4226.15 3728.75L4224.51 3733.04 M 4226.15 3728.75L4227.79 3733.04 M 4225.13 3731.61L4227.17 3731.61 M 4230.57 3728.75L4230.57 3733.04 M 4229.14 3728.75L4232 3728.75 ~none~gge4313~~0~#@$TEXT~P~4229~3707.5~0.6~0~0~3~~4.5~J4~M 4231.05 3702.96L4231.05 3706.23 L4230.84 3706.85 L4230.64 3707.05 L4230.23 3707.25 L4229.82 3707.25 L4229.41 3707.05 L4229.2 3706.85 L4229 3706.23 L4229 3705.82 M 4234.44 3702.96L4232.4 3705.82 L4235.46 3705.82 M 4234.44 3702.96L4234.44 3707.25 ~~gge4315~~0~#@$TRACK~1~3~~4242 3710.5 4242 3720.5~gge25457~0#@$TRACK~1~3~~4242 3720.5 4232 3720.5~gge25458~0#@$TRACK~1~3~~4232 3720.5 4222 3720.5~gge25459~0#@$TRACK~1~3~~4222 3720.5 4222 3710.5~gge25460~0#@$TRACK~1~3~~4222 3710.5 4232 3710.5~gge25461~0#@$TRACK~1~3~~4232 3710.5 4242 3710.5~gge25462~0#@$TRACK~1~3~~4232 3710.5 4232 3720.5~gge25463~0#@$PAD~RECT~4237~3715.5~6~6~11~BAT~1~2~4240 3718.5 4234 3718.5 4234 3712.5 4240 3712.5~180~gge25464~0~~Y~0~0~0.4~4237,3715.5#@$PAD~ELLIPSE~4227~3715.5~6~6~11~GND~2~2~~180~gge25469~0~~Y~0~0~0.4~4227,3715.5","LIB~4107.4016~3788.4449~package`TTGO-T-BEAM-ESP32-CONNECTOR`BOM_Manufacturer``BOM_Manufacturer Part``BOM_Supplier Part``BOM_Supplier``link``Contributor`grizli2509`spicePre`U`spiceSymbolName`TTGO-BEAM-ESP32`Package Display`No`~~~gge6aaff6c194964e3d~1~5180c2e0c1da4a75b575a8495aee30f2~1607716397~0~~yes~~#@$TEXT~N~4216.902~3721.445~0.6~0~0~3~~4.5~MAIN BOARD~M 4216.9016 3716.9049 L 4216.9016 3721.1949 M 4216.9016 3716.9049 L 4218.5416 3721.1949 M 4220.1716 3716.9049 L 4218.5416 3721.1949 M 4220.1716 3716.9049 L 4220.1716 3721.1949 M 4223.1616 3716.9049 L 4221.5216 3721.1949 M 4223.1616 3716.9049 L 4224.8016 3721.1949 M 4222.1416 3719.7649 L 4224.1816 3719.7649 M 4226.1516 3716.9049 L 4226.1516 3721.1949 M 4227.5016 3716.9049 L 4227.5016 3721.1949 M 4227.5016 3716.9049 L 4230.3616 3721.1949 M 4230.3616 3716.9049 L 4230.3616 3721.1949 M 4234.8616 3716.9049 L 4234.8616 3721.1949 M 4234.8616 3716.9049 L 4236.7016 3716.9049 L 4237.3116 3717.1049 L 4237.5216 3717.3149 L 4237.7216 3717.7249 L 4237.7216 3718.1349 L 4237.5216 3718.5449 L 4237.3116 3718.7449 L 4236.7016 3718.9449 M 4234.8616 3718.9449 L 4236.7016 3718.9449 L 4237.3116 3719.1549 L 4237.5216 3719.3549 L 4237.7216 3719.7649 L 4237.7216 3720.3849 L 4237.5216 3720.7949 L 4237.3116 3720.9949 L 4236.7016 3721.1949 L 4234.8616 3721.1949 M 4240.3016 3716.9049 L 4239.8916 3717.1049 L 4239.4816 3717.5149 L 4239.2816 3717.9249 L 4239.0716 3718.5449 L 4239.0716 3719.5649 L 4239.2816 3720.1749 L 4239.4816 3720.5849 L 4239.8916 3720.9949 L 4240.3016 3721.1949 L 4241.1216 3721.1949 L 4241.5316 3720.9949 L 4241.9416 3720.5849 L 4242.1416 3720.1749 L 4242.3516 3719.5649 L 4242.3516 3718.5449 L 4242.1416 3717.9249 L 4241.9416 3717.5149 L 4241.5316 3717.1049 L 4241.1216 3716.9049 L 4240.3016 3716.9049 M 4245.3316 3716.9049 L 4243.7016 3721.1949 M 4245.3316 3716.9049 L 4246.9716 3721.1949 M 4244.3116 3719.7649 L 4246.3516 3719.7649 M 4248.3216 3716.9049 L 4248.3216 3721.1949 M 4248.3216 3716.9049 L 4250.1616 3716.9049 L 4250.7716 3717.1049 L 4250.9816 3717.3149 L 4251.1816 3717.7249 L 4251.1816 3718.1349 L 4250.9816 3718.5449 L 4250.7716 3718.7449 L 4250.1616 3718.9449 L 4248.3216 3718.9449 M 4249.7516 3718.9449 L 4251.1816 3721.1949 M 4252.5316 3716.9049 L 4252.5316 3721.1949 M 4252.5316 3716.9049 L 4253.9616 3716.9049 L 4254.5816 3717.1049 L 4254.9916 3717.5149 L 4255.1916 3717.9249 L 4255.4016 3718.5449 L 4255.4016 3719.5649 L 4255.1916 3720.1749 L 4254.9916 3720.5849 L 4254.5816 3720.9949 L 4253.9616 3721.1949 L 4252.5316 3721.1949~none~gge237~~0~#@$TEXT~P~4228.902~3791.445~0.6~0~0~3~~4.5~U1~M 4228.9016 3786.9049 L 4228.9016 3789.9749 L 4229.1016 3790.5849 L 4229.5116 3790.9949 L 4230.1316 3791.1949 L 4230.5416 3791.1949 L 4231.1516 3790.9949 L 4231.5616 3790.5849 L 4231.7616 3789.9749 L 4231.7616 3786.9049 M 4233.1116 3787.7249 L 4233.5216 3787.5149 L 4234.1416 3786.9049 L 4234.1416 3791.1949~~gge239~~0~#@$HOLE~4029.902~3734.945~4~gge11~1#@$HOLE~4030.402~3841.945~4~gge15~1#@$HOLE~4403.902~3841.945~4~gge19~1#@$HOLE~4403.902~3734.945~4~gge23~1#@$PAD~ELLIPSE~4046.902~3738.445~6~6~11~~TX~1.8~~0~gge77~0~~Y~0~0~0.4~4046.9016,3738.4449#@$PAD~ELLIPSE~4057.402~3738.445~6~6~11~~RX~1.8~~0~gge82~0~~Y~0~0~0.4~4057.4016,3738.4449#@$PAD~ELLIPSE~4067.402~3738.445~6~6~11~~23~1.8~~0~gge87~0~~Y~0~0~0.4~4067.4016,3738.4449#@$PAD~ELLIPSE~4077.402~3738.445~6~6~11~U1_4~4~1.8~~0~gge92~0~~Y~0~0~0.4~4077.4016,3738.4449#@$PAD~ELLIPSE~4087.402~3738.445~6~6~11~~0~1.8~~0~gge97~0~~Y~0~0~0.4~4087.4016,3738.4449#@$PAD~ELLIPSE~4097.402~3738.445~6~6~11~GND~GND_1~1.8~~0~gge102~0~~Y~0~0~0.4~4097.4016,3738.4449#@$PAD~ELLIPSE~4107.402~3738.445~6~6~11~U1_3V3_1~3V3_1~1.8~~0~gge107~0~~Y~0~0~0.4~4107.4016,3738.4449#@$PAD~ELLIPSE~4117.402~3738.445~6~6~11~GND~GND_2~1.8~~0~gge117~0~~Y~0~0~0.4~4117.4016,3738.4449#@$PAD~ELLIPSE~4127.402~3738.445~6~6~11~U1_22~22~1.8~~0~gge122~0~~Y~0~0~0.4~4127.4016,3738.4449#@$PAD~ELLIPSE~4137.402~3738.445~6~6~11~U1_21~21~1.8~~0~gge127~0~~Y~0~0~0.4~4137.4016,3738.4449#@$PAD~ELLIPSE~4147.402~3738.445~6~6~11~U1_3V3_2~3V3_2~1.8~~0~gge132~0~~Y~0~0~0.4~4147.4016,3738.4449#@$PAD~ELLIPSE~4047.902~3838.445~6~6~11~U1_S_VP~S_VP~1.8~~0~gge149~0~~Y~0~0~0.4~4047.9016,3838.4449#@$PAD~ELLIPSE~4057.902~3838.445~6~6~11~~S_VN~1.8~~0~gge154~0~~Y~0~0~0.4~4057.9016,3838.4449#@$PAD~ELLIPSE~4067.902~3838.445~6~6~11~~RST~1.8~~90~gge159~0~~Y~0~0~0.4~4067.9016,3838.4449#@$PAD~ELLIPSE~4077.902~3838.445~6~6~11~U1_15~15~1.8~~0~gge164~0~~Y~0~0~0.4~4077.9016,3838.4449#@$PAD~ELLIPSE~4087.902~3838.445~6~6~11~~35~1.8~~0~gge169~0~~Y~0~0~0.4~4087.9016,3838.4449#@$PAD~ELLIPSE~4097.902~3838.445~6~6~11~~32~1.8~~0~gge174~0~~Y~0~0~0.4~4097.9016,3838.4449#@$PAD~ELLIPSE~4107.902~3838.445~6~6~11~~33~1.8~~0~gge179~0~~Y~0~0~0.4~4107.9016,3838.4449#@$PAD~ELLIPSE~4117.902~3838.445~6~6~11~U1_25~25~1.8~~0~gge189~0~~Y~0~0~0.4~4117.9016,3838.4449#@$PAD~ELLIPSE~4127.902~3838.445~6~6~11~U1_14~14~1.8~~0~gge194~0~~Y~0~0~0.4~4127.9016,3838.4449#@$PAD~ELLIPSE~4137.902~3838.445~6~6~11~U1_13~13~1.8~~0~gge199~0~~Y~0~0~0.4~4137.9016,3838.4449#@$PAD~ELLIPSE~4147.902~3838.445~6~6~11~U1_02~02~1.8~~0~gge204~0~~Y~0~0~0.4~4147.9016,3838.4449#@$PAD~ELLIPSE~4157.402~3738.445~6~6~11~~LORA2~1.8~~0~gge209~0~~Y~0~0~0.4~4157.4016,3738.4449#@$PAD~ELLIPSE~4167.402~3738.445~6~6~11~~LORA1~1.8~~0~gge214~0~~Y~0~0~0.4~4167.4016,3738.4449#@$PAD~ELLIPSE~4157.902~3838.445~6~6~11~GND~GND_3~1.8~~0~gge219~0~~Y~0~0~0.4~4157.9016,3838.4449#@$PAD~ELLIPSE~4167.902~3838.445~6~6~11~~5V~1.8~~0~gge224~0~~Y~0~0~0.4~4167.9016,3838.4449","LIB~4315~3685~package`MCP23017`BOM_Manufacturer``BOM_Manufacturer Part`MCP23017`BOM_Supplier Part``BOM_Supplier``link``Contributor`emmanuel.malosse`spicePre`U`spiceSymbolName`MCP23017`~90~~ggeb1124de9a27319d1~1~f09420c4fd9946a583a6b15c1c5a483e~1560327649~0~~yes~~#@$TEXT~N~4251.999~3680~0.6~90~0~3~~4.5~MCP23017~M 4247.46 3680 L 4251.75 3680 M 4247.46 3680 L 4251.75 3678.36 M 4247.46 3676.73 L 4251.75 3678.36 M 4247.46 3676.73 L 4251.75 3676.73 M 4248.48 3672.31 L 4248.07 3672.51 L 4247.66 3672.92 L 4247.46 3673.33 L 4247.46 3674.15 L 4247.66 3674.56 L 4248.07 3674.97 L 4248.48 3675.17 L 4249.1 3675.38 L 4250.12 3675.38 L 4250.73 3675.17 L 4251.14 3674.97 L 4251.55 3674.56 L 4251.75 3674.15 L 4251.75 3673.33 L 4251.55 3672.92 L 4251.14 3672.51 L 4250.73 3672.31 M 4247.46 3670.96 L 4251.75 3670.96 M 4247.46 3670.96 L 4247.46 3669.12 L 4247.66 3668.5 L 4247.87 3668.3 L 4248.28 3668.1 L 4248.89 3668.1 L 4249.3 3668.3 L 4249.5 3668.5 L 4249.71 3669.12 L 4249.71 3670.96 M 4248.48 3666.54 L 4248.28 3666.54 L 4247.87 3666.34 L 4247.66 3666.13 L 4247.46 3665.72 L 4247.46 3664.9 L 4247.66 3664.5 L 4247.87 3664.29 L 4248.28 3664.09 L 4248.69 3664.09 L 4249.1 3664.29 L 4249.71 3664.7 L 4251.75 3666.75 L 4251.75 3663.88 M 4247.46 3662.12 L 4247.46 3659.87 L 4249.1 3661.1 L 4249.1 3660.49 L 4249.3 3660.08 L 4249.5 3659.87 L 4250.12 3659.67 L 4250.53 3659.67 L 4251.14 3659.87 L 4251.55 3660.28 L 4251.75 3660.9 L 4251.75 3661.51 L 4251.55 3662.12 L 4251.35 3662.33 L 4250.94 3662.53 M 4247.46 3657.09 L 4247.66 3657.7 L 4248.28 3658.11 L 4249.3 3658.32 L 4249.91 3658.32 L 4250.94 3658.11 L 4251.55 3657.7 L 4251.75 3657.09 L 4251.75 3656.68 L 4251.55 3656.07 L 4250.94 3655.66 L 4249.91 3655.45 L 4249.3 3655.45 L 4248.28 3655.66 L 4247.66 3656.07 L 4247.46 3656.68 L 4247.46 3657.09 M 4248.28 3654.1 L 4248.07 3653.7 L 4247.46 3653.08 L 4251.75 3653.08 M 4247.46 3648.87 L 4251.75 3650.91 M 4247.46 3651.73 L 4247.46 3648.87~none~gge3~~0~#@$TEXT~P~4315.499~3690~0.6~0~0~3~~4.5~U3~M 4315.5 3685.46 L 4315.5 3688.53 L 4315.7 3689.14 L 4316.11 3689.55 L 4316.73 3689.75 L 4317.14 3689.75 L 4317.75 3689.55 L 4318.16 3689.14 L 4318.36 3688.53 L 4318.36 3685.46 M 4320.12 3685.46 L 4322.37 3685.46 L 4321.15 3687.1 L 4321.76 3687.1 L 4322.17 3687.3 L 4322.37 3687.5 L 4322.58 3688.12 L 4322.58 3688.53 L 4322.37 3689.14 L 4321.96 3689.55 L 4321.35 3689.75 L 4320.74 3689.75 L 4320.12 3689.55 L 4319.92 3689.35 L 4319.71 3688.94~~gge5~~0~#@$TRACK~1~3~~4260 3720 4370 3720 4370 3640 4260 3640 4260 3720~gge7~0#@$TEXT~L~4289.999~3710~0.8~90~0~3~~3.937~A0~M 4287.85 3708.57 L 4291.61 3710 M 4287.85 3708.57 L 4291.61 3707.14 M 4290.36 3709.46 L 4290.36 3707.67 M 4287.85 3704.88 L 4288.03 3705.42 L 4288.57 3705.78 L 4289.46 3705.96 L 4290 3705.96 L 4290.89 3705.78 L 4291.43 3705.42 L 4291.61 3704.88 L 4291.61 3704.52 L 4291.43 3703.99 L 4290.89 3703.63 L 4290 3703.45 L 4289.46 3703.45 L 4288.57 3703.63 L 4288.03 3703.99 L 4287.85 3704.52 L 4287.85 3704.88~~gge8~~0~#@$TEXT~L~4279.999~3710~0.8~90~0~3~~3.937~A1~M 4277.85 3708.57 L 4281.61 3710 M 4277.85 3708.57 L 4281.61 3707.14 M 4280.36 3709.46 L 4280.36 3707.67 M 4278.57 3705.96 L 4278.39 3705.6 L 4277.85 3705.06 L 4281.61 3705.06~~gge10~~0~#@$TEXT~L~4269.999~3710~0.8~90~0~3~~3.937~A2~M 4267.85 3708.57 L 4271.61 3710 M 4267.85 3708.57 L 4271.61 3707.14 M 4270.36 3709.46 L 4270.36 3707.67 M 4268.75 3705.78 L 4268.57 3705.78 L 4268.21 3705.6 L 4268.03 3705.42 L 4267.85 3705.06 L 4267.85 3704.35 L 4268.03 3703.99 L 4268.21 3703.81 L 4268.57 3703.63 L 4268.93 3703.63 L 4269.28 3703.81 L 4269.82 3704.17 L 4271.61 3705.96 L 4271.61 3703.45~~gge12~~0~#@$TEXT~L~4299.999~3710~0.8~90~0~3~~3.937~Reset~M 4297.85 3710 L 4301.61 3710 M 4297.85 3710 L 4297.85 3708.39 L 4298.03 3707.85 L 4298.21 3707.67 L 4298.57 3707.49 L 4298.93 3707.49 L 4299.28 3707.67 L 4299.46 3707.85 L 4299.64 3708.39 L 4299.64 3710 M 4299.64 3708.75 L 4301.61 3707.49 M 4300.18 3706.31 L 4300.18 3704.17 L 4299.82 3704.17 L 4299.46 3704.35 L 4299.28 3704.52 L 4299.11 3704.88 L 4299.11 3705.42 L 4299.28 3705.78 L 4299.64 3706.13 L 4300.18 3706.31 L 4300.54 3706.31 L 4301.07 3706.13 L 4301.43 3705.78 L 4301.61 3705.42 L 4301.61 3704.88 L 4301.43 3704.52 L 4301.07 3704.17 M 4299.64 3701.02 L 4299.28 3701.2 L 4299.11 3701.73 L 4299.11 3702.27 L 4299.28 3702.81 L 4299.64 3702.98 L 4300 3702.81 L 4300.18 3702.45 L 4300.36 3701.55 L 4300.54 3701.2 L 4300.89 3701.02 L 4301.07 3701.02 L 4301.43 3701.2 L 4301.61 3701.73 L 4301.61 3702.27 L 4301.43 3702.81 L 4301.07 3702.98 M 4300.18 3699.84 L 4300.18 3697.69 L 4299.82 3697.69 L 4299.46 3697.87 L 4299.28 3698.05 L 4299.11 3698.4 L 4299.11 3698.94 L 4299.28 3699.3 L 4299.64 3699.66 L 4300.18 3699.84 L 4300.54 3699.84 L 4301.07 3699.66 L 4301.43 3699.3 L 4301.61 3698.94 L 4301.61 3698.4 L 4301.43 3698.05 L 4301.07 3697.69 M 4297.85 3695.97 L 4300.89 3695.97 L 4301.43 3695.79 L 4301.61 3695.43 L 4301.61 3695.08 M 4299.11 3696.51 L 4299.11 3695.25~~gge14~~0~#@$TEXT~L~4309.999~3710~0.8~90~0~3~~3.937~SO~M 4308.39 3707.49 L 4308.03 3707.85 L 4307.85 3708.39 L 4307.85 3709.11 L 4308.03 3709.64 L 4308.39 3710 L 4308.75 3710 L 4309.11 3709.82 L 4309.28 3709.64 L 4309.46 3709.28 L 4309.82 3708.21 L 4310 3707.85 L 4310.18 3707.67 L 4310.54 3707.49 L 4311.07 3707.49 L 4311.43 3707.85 L 4311.61 3708.39 L 4311.61 3709.11 L 4311.43 3709.64 L 4311.07 3710 M 4307.85 3705.24 L 4308.03 3705.6 L 4308.39 3705.96 L 4308.75 3706.13 L 4309.28 3706.31 L 4310.18 3706.31 L 4310.72 3706.13 L 4311.07 3705.96 L 4311.43 3705.6 L 4311.61 3705.24 L 4311.61 3704.52 L 4311.43 3704.17 L 4311.07 3703.81 L 4310.72 3703.63 L 4310.18 3703.45 L 4309.28 3703.45 L 4308.75 3703.63 L 4308.39 3703.81 L 4308.03 3704.17 L 4307.85 3704.52 L 4307.85 3705.24~~gge16~~0~#@$TEXT~L~4319.999~3710~0.8~90~0~3~~3.937~CS~M 4318.75 3707.32 L 4318.39 3707.49 L 4318.03 3707.85 L 4317.85 3708.21 L 4317.85 3708.93 L 4318.03 3709.28 L 4318.39 3709.64 L 4318.75 3709.82 L 4319.28 3710 L 4320.18 3710 L 4320.72 3709.82 L 4321.07 3709.64 L 4321.43 3709.28 L 4321.61 3708.93 L 4321.61 3708.21 L 4321.43 3707.85 L 4321.07 3707.49 L 4320.72 3707.32 M 4318.39 3703.63 L 4318.03 3703.99 L 4317.85 3704.52 L 4317.85 3705.24 L 4318.03 3705.78 L 4318.39 3706.13 L 4318.75 3706.13 L 4319.11 3705.96 L 4319.28 3705.78 L 4319.46 3705.42 L 4319.82 3704.35 L 4320 3703.99 L 4320.18 3703.81 L 4320.54 3703.63 L 4321.07 3703.63 L 4321.43 3703.99 L 4321.61 3704.52 L 4321.61 3705.24 L 4321.43 3705.78 L 4321.07 3706.13~~gge18~~0~#@$TEXT~L~4329.999~3710~0.8~90~0~3~~3.937~SDA~M 4328.39 3707.49 L 4328.03 3707.85 L 4327.85 3708.39 L 4327.85 3709.11 L 4328.03 3709.64 L 4328.39 3710 L 4328.75 3710 L 4329.11 3709.82 L 4329.28 3709.64 L 4329.46 3709.28 L 4329.82 3708.21 L 4330 3707.85 L 4330.18 3707.67 L 4330.54 3707.49 L 4331.07 3707.49 L 4331.43 3707.85 L 4331.61 3708.39 L 4331.61 3709.11 L 4331.43 3709.64 L 4331.07 3710 M 4327.85 3706.31 L 4331.61 3706.31 M 4327.85 3706.31 L 4327.85 3705.06 L 4328.03 3704.52 L 4328.39 3704.17 L 4328.75 3703.99 L 4329.28 3703.81 L 4330.18 3703.81 L 4330.72 3703.99 L 4331.07 3704.17 L 4331.43 3704.52 L 4331.61 3705.06 L 4331.61 3706.31 M 4327.85 3701.2 L 4331.61 3702.63 M 4327.85 3701.2 L 4331.61 3699.76 M 4330.36 3702.09 L 4330.36 3700.3~~gge20~~0~#@$TEXT~L~4339.999~3710~0.8~90~0~3~~3.937~SCL~M 4338.39 3707.49 L 4338.03 3707.85 L 4337.85 3708.39 L 4337.85 3709.11 L 4338.03 3709.64 L 4338.39 3710 L 4338.75 3710 L 4339.11 3709.82 L 4339.28 3709.64 L 4339.46 3709.28 L 4339.82 3708.21 L 4340 3707.85 L 4340.18 3707.67 L 4340.54 3707.49 L 4341.07 3707.49 L 4341.43 3707.85 L 4341.61 3708.39 L 4341.61 3709.11 L 4341.43 3709.64 L 4341.07 3710 M 4338.75 3703.63 L 4338.39 3703.81 L 4338.03 3704.17 L 4337.85 3704.52 L 4337.85 3705.24 L 4338.03 3705.6 L 4338.39 3705.96 L 4338.75 3706.13 L 4339.28 3706.31 L 4340.18 3706.31 L 4340.72 3706.13 L 4341.07 3705.96 L 4341.43 3705.6 L 4341.61 3705.24 L 4341.61 3704.52 L 4341.43 3704.17 L 4341.07 3703.81 L 4340.72 3703.63 M 4337.85 3702.45 L 4341.61 3702.45 M 4341.61 3702.45 L 4341.61 3700.3~~gge22~~0~#@$TEXT~L~4349.999~3710~0.8~90~0~3~~3.937~GND~M 4348.75 3707.32 L 4348.39 3707.49 L 4348.03 3707.85 L 4347.85 3708.21 L 4347.85 3708.93 L 4348.03 3709.28 L 4348.39 3709.64 L 4348.75 3709.82 L 4349.28 3710 L 4350.18 3710 L 4350.72 3709.82 L 4351.07 3709.64 L 4351.43 3709.28 L 4351.61 3708.93 L 4351.61 3708.21 L 4351.43 3707.85 L 4351.07 3707.49 L 4350.72 3707.32 L 4350.18 3707.32 M 4350.18 3708.21 L 4350.18 3707.32 M 4347.85 3706.13 L 4351.61 3706.13 M 4347.85 3706.13 L 4351.61 3703.63 M 4347.85 3703.63 L 4351.61 3703.63 M 4347.85 3702.45 L 4351.61 3702.45 M 4347.85 3702.45 L 4347.85 3701.2 L 4348.03 3700.66 L 4348.39 3700.3 L 4348.75 3700.12 L 4349.28 3699.94 L 4350.18 3699.94 L 4350.72 3700.12 L 4351.07 3700.3 L 4351.43 3700.66 L 4351.61 3701.2 L 4351.61 3702.45~~gge24~~0~#@$TEXT~L~4359.999~3710~0.8~90~0~3~~3.937~VCC~M 4357.85 3710 L 4361.61 3708.57 M 4357.85 3707.14 L 4361.61 3708.57 M 4358.75 3703.27 L 4358.39 3703.45 L 4358.03 3703.81 L 4357.85 3704.17 L 4357.85 3704.88 L 4358.03 3705.24 L 4358.39 3705.6 L 4358.75 3705.78 L 4359.28 3705.96 L 4360.18 3705.96 L 4360.72 3705.78 L 4361.07 3705.6 L 4361.43 3705.24 L 4361.61 3704.88 L 4361.61 3704.17 L 4361.43 3703.81 L 4361.07 3703.45 L 4360.72 3703.27 M 4358.75 3699.41 L 4358.39 3699.58 L 4358.03 3699.94 L 4357.85 3700.3 L 4357.85 3701.02 L 4358.03 3701.37 L 4358.39 3701.73 L 4358.75 3701.91 L 4359.28 3702.09 L 4360.18 3702.09 L 4360.72 3701.91 L 4361.07 3701.73 L 4361.43 3701.37 L 4361.61 3701.02 L 4361.61 3700.3 L 4361.43 3699.94 L 4361.07 3699.58 L 4360.72 3699.41~~gge26~~0~#@$TEXT~L~4269.999~3685~0.8~90~0~3~~3.937~VCC/GND~M 4267.85 3685 L 4271.61 3683.57 M 4267.85 3682.14 L 4271.61 3683.57 M 4268.75 3678.27 L 4268.39 3678.45 L 4268.03 3678.81 L 4267.85 3679.17 L 4267.85 3679.88 L 4268.03 3680.24 L 4268.39 3680.6 L 4268.75 3680.78 L 4269.28 3680.96 L 4270.18 3680.96 L 4270.72 3680.78 L 4271.07 3680.6 L 4271.43 3680.24 L 4271.61 3679.88 L 4271.61 3679.17 L 4271.43 3678.81 L 4271.07 3678.45 L 4270.72 3678.27 M 4268.75 3674.41 L 4268.39 3674.58 L 4268.03 3674.94 L 4267.85 3675.3 L 4267.85 3676.02 L 4268.03 3676.37 L 4268.39 3676.73 L 4268.75 3676.91 L 4269.28 3677.09 L 4270.18 3677.09 L 4270.72 3676.91 L 4271.07 3676.73 L 4271.43 3676.37 L 4271.61 3676.02 L 4271.61 3675.3 L 4271.43 3674.94 L 4271.07 3674.58 L 4270.72 3674.41 M 4267.14 3670 L 4272.86 3673.22 M 4268.75 3666.14 L 4268.39 3666.32 L 4268.03 3666.68 L 4267.85 3667.03 L 4267.85 3667.75 L 4268.03 3668.11 L 4268.39 3668.46 L 4268.75 3668.64 L 4269.28 3668.82 L 4270.18 3668.82 L 4270.72 3668.64 L 4271.07 3668.46 L 4271.43 3668.11 L 4271.61 3667.75 L 4271.61 3667.03 L 4271.43 3666.68 L 4271.07 3666.32 L 4270.72 3666.14 L 4270.18 3666.14 M 4270.18 3667.03 L 4270.18 3666.14 M 4267.85 3664.96 L 4271.61 3664.96 M 4267.85 3664.96 L 4271.61 3662.45 M 4267.85 3662.45 L 4271.61 3662.45 M 4267.85 3661.27 L 4271.61 3661.27 M 4267.85 3661.27 L 4267.85 3660.02 L 4268.03 3659.48 L 4268.39 3659.12 L 4268.75 3658.94 L 4269.28 3658.77 L 4270.18 3658.77 L 4270.72 3658.94 L 4271.07 3659.12 L 4271.43 3659.48 L 4271.61 3660.02 L 4271.61 3661.27~~gge28~~0~#@$TEXT~L~4279.999~3680~0.8~90~0~3~~3.937~ITB/ITA~M 4277.85 3680 L 4281.61 3680 M 4277.85 3677.57 L 4281.61 3677.57 M 4277.85 3678.82 L 4277.85 3676.31 M 4277.85 3675.13 L 4281.61 3675.13 M 4277.85 3675.13 L 4277.85 3673.52 L 4278.03 3672.98 L 4278.21 3672.81 L 4278.57 3672.63 L 4278.93 3672.63 L 4279.28 3672.81 L 4279.46 3672.98 L 4279.64 3673.52 M 4279.64 3675.13 L 4279.64 3673.52 L 4279.82 3672.98 L 4280 3672.81 L 4280.36 3672.63 L 4280.89 3672.63 L 4281.25 3672.81 L 4281.43 3672.98 L 4281.61 3673.52 L 4281.61 3675.13 M 4277.14 3668.22 L 4282.86 3671.45 M 4277.85 3667.04 L 4281.61 3667.04 M 4277.85 3664.61 L 4281.61 3664.61 M 4277.85 3665.86 L 4277.85 3663.36 M 4277.85 3660.74 L 4281.61 3662.18 M 4277.85 3660.74 L 4281.61 3659.31 M 4280.36 3661.64 L 4280.36 3659.85~~gge30~~0~#@$TEXT~L~4289.999~3680~0.8~90~0~3~~3.937~BO/A0~M 4287.85 3680 L 4291.61 3680 M 4287.85 3680 L 4287.85 3678.39 L 4288.03 3677.85 L 4288.21 3677.67 L 4288.57 3677.49 L 4288.93 3677.49 L 4289.28 3677.67 L 4289.46 3677.85 L 4289.64 3678.39 M 4289.64 3680 L 4289.64 3678.39 L 4289.82 3677.85 L 4290 3677.67 L 4290.36 3677.49 L 4290.89 3677.49 L 4291.25 3677.67 L 4291.43 3677.85 L 4291.61 3678.39 L 4291.61 3680 M 4287.85 3675.24 L 4288.03 3675.6 L 4288.39 3675.96 L 4288.75 3676.13 L 4289.28 3676.31 L 4290.18 3676.31 L 4290.72 3676.13 L 4291.07 3675.96 L 4291.43 3675.6 L 4291.61 3675.24 L 4291.61 3674.52 L 4291.43 3674.17 L 4291.07 3673.81 L 4290.72 3673.63 L 4290.18 3673.45 L 4289.28 3673.45 L 4288.75 3673.63 L 4288.39 3673.81 L 4288.03 3674.17 L 4287.85 3674.52 L 4287.85 3675.24 M 4287.14 3669.05 L 4292.86 3672.27 M 4287.85 3666.44 L 4291.61 3667.87 M 4287.85 3666.44 L 4291.61 3665 M 4290.36 3667.33 L 4290.36 3665.54 M 4287.85 3662.75 L 4288.03 3663.29 L 4288.57 3663.64 L 4289.46 3663.82 L 4290 3663.82 L 4290.89 3663.64 L 4291.43 3663.29 L 4291.61 3662.75 L 4291.61 3662.39 L 4291.43 3661.85 L 4290.89 3661.5 L 4290 3661.32 L 4289.46 3661.32 L 4288.57 3661.5 L 4288.03 3661.85 L 4287.85 3662.39 L 4287.85 3662.75~~gge32~~0~#@$TEXT~L~4299.999~3680~0.8~90~0~3~~3.937~B1/A1~M 4297.85 3680 L 4301.61 3680 M 4297.85 3680 L 4297.85 3678.39 L 4298.03 3677.85 L 4298.21 3677.67 L 4298.57 3677.49 L 4298.93 3677.49 L 4299.28 3677.67 L 4299.46 3677.85 L 4299.64 3678.39 M 4299.64 3680 L 4299.64 3678.39 L 4299.82 3677.85 L 4300 3677.67 L 4300.36 3677.49 L 4300.89 3677.49 L 4301.25 3677.67 L 4301.43 3677.85 L 4301.61 3678.39 L 4301.61 3680 M 4298.57 3676.31 L 4298.39 3675.96 L 4297.85 3675.42 L 4301.61 3675.42 M 4297.14 3671.02 L 4302.86 3674.24 M 4297.85 3668.4 L 4301.61 3669.84 M 4297.85 3668.4 L 4301.61 3666.97 M 4300.36 3669.3 L 4300.36 3667.51 M 4298.57 3665.79 L 4298.39 3665.43 L 4297.85 3664.9 L 4301.61 3664.9~~gge34~~0~#@$TEXT~L~4309.999~3680~0.8~90~0~3~~3.937~B2/A2~M 4307.85 3680 L 4311.61 3680 M 4307.85 3680 L 4307.85 3678.39 L 4308.03 3677.85 L 4308.21 3677.67 L 4308.57 3677.49 L 4308.93 3677.49 L 4309.28 3677.67 L 4309.46 3677.85 L 4309.64 3678.39 M 4309.64 3680 L 4309.64 3678.39 L 4309.82 3677.85 L 4310 3677.67 L 4310.36 3677.49 L 4310.89 3677.49 L 4311.25 3677.67 L 4311.43 3677.85 L 4311.61 3678.39 L 4311.61 3680 M 4308.75 3676.13 L 4308.57 3676.13 L 4308.21 3675.96 L 4308.03 3675.78 L 4307.85 3675.42 L 4307.85 3674.7 L 4308.03 3674.35 L 4308.21 3674.17 L 4308.57 3673.99 L 4308.93 3673.99 L 4309.28 3674.17 L 4309.82 3674.52 L 4311.61 3676.31 L 4311.61 3673.81 M 4307.14 3669.41 L 4312.86 3672.63 M 4307.85 3666.79 L 4311.61 3668.22 M 4307.85 3666.79 L 4311.61 3665.36 M 4310.36 3667.69 L 4310.36 3665.9 M 4308.75 3664 L 4308.57 3664 L 4308.21 3663.82 L 4308.03 3663.64 L 4307.85 3663.29 L 4307.85 3662.57 L 4308.03 3662.21 L 4308.21 3662.03 L 4308.57 3661.85 L 4308.93 3661.85 L 4309.28 3662.03 L 4309.82 3662.39 L 4311.61 3664.18 L 4311.61 3661.68~~gge36~~0~#@$TEXT~L~4319.999~3680~0.8~90~0~3~~3.937~B3/A3~M 4317.85 3680 L 4321.61 3680 M 4317.85 3680 L 4317.85 3678.39 L 4318.03 3677.85 L 4318.21 3677.67 L 4318.57 3677.49 L 4318.93 3677.49 L 4319.28 3677.67 L 4319.46 3677.85 L 4319.64 3678.39 M 4319.64 3680 L 4319.64 3678.39 L 4319.82 3677.85 L 4320 3677.67 L 4320.36 3677.49 L 4320.89 3677.49 L 4321.25 3677.67 L 4321.43 3677.85 L 4321.61 3678.39 L 4321.61 3680 M 4317.85 3675.96 L 4317.85 3673.99 L 4319.28 3675.06 L 4319.28 3674.52 L 4319.46 3674.17 L 4319.64 3673.99 L 4320.18 3673.81 L 4320.54 3673.81 L 4321.07 3673.99 L 4321.43 3674.35 L 4321.61 3674.88 L 4321.61 3675.42 L 4321.43 3675.96 L 4321.25 3676.13 L 4320.89 3676.31 M 4317.14 3669.41 L 4322.86 3672.63 M 4317.85 3666.79 L 4321.61 3668.22 M 4317.85 3666.79 L 4321.61 3665.36 M 4320.36 3667.69 L 4320.36 3665.9 M 4317.85 3663.82 L 4317.85 3661.85 L 4319.28 3662.93 L 4319.28 3662.39 L 4319.46 3662.03 L 4319.64 3661.85 L 4320.18 3661.68 L 4320.54 3661.68 L 4321.07 3661.85 L 4321.43 3662.21 L 4321.61 3662.75 L 4321.61 3663.29 L 4321.43 3663.82 L 4321.25 3664 L 4320.89 3664.18~~gge38~~0~#@$TEXT~L~4329.999~3680~0.8~90~0~3~~3.937~B4/A4~M 4327.85 3680 L 4331.61 3680 M 4327.85 3680 L 4327.85 3678.39 L 4328.03 3677.85 L 4328.21 3677.67 L 4328.57 3677.49 L 4328.93 3677.49 L 4329.28 3677.67 L 4329.46 3677.85 L 4329.64 3678.39 M 4329.64 3680 L 4329.64 3678.39 L 4329.82 3677.85 L 4330 3677.67 L 4330.36 3677.49 L 4330.89 3677.49 L 4331.25 3677.67 L 4331.43 3677.85 L 4331.61 3678.39 L 4331.61 3680 M 4327.85 3674.52 L 4330.36 3676.31 L 4330.36 3673.63 M 4327.85 3674.52 L 4331.61 3674.52 M 4327.14 3669.23 L 4332.86 3672.45 M 4327.85 3666.61 L 4331.61 3668.05 M 4327.85 3666.61 L 4331.61 3665.18 M 4330.36 3667.51 L 4330.36 3665.72 M 4327.85 3662.21 L 4330.36 3664 L 4330.36 3661.32 M 4327.85 3662.21 L 4331.61 3662.21~~gge40~~0~#@$TEXT~L~4339.999~3680~0.8~90~0~3~~3.937~B5/A5~M 4337.85 3680 L 4341.61 3680 M 4337.85 3680 L 4337.85 3678.39 L 4338.03 3677.85 L 4338.21 3677.67 L 4338.57 3677.49 L 4338.93 3677.49 L 4339.28 3677.67 L 4339.46 3677.85 L 4339.64 3678.39 M 4339.64 3680 L 4339.64 3678.39 L 4339.82 3677.85 L 4340 3677.67 L 4340.36 3677.49 L 4340.89 3677.49 L 4341.25 3677.67 L 4341.43 3677.85 L 4341.61 3678.39 L 4341.61 3680 M 4337.85 3674.17 L 4337.85 3675.96 L 4339.46 3676.13 L 4339.28 3675.96 L 4339.11 3675.42 L 4339.11 3674.88 L 4339.28 3674.35 L 4339.64 3673.99 L 4340.18 3673.81 L 4340.54 3673.81 L 4341.07 3673.99 L 4341.43 3674.35 L 4341.61 3674.88 L 4341.61 3675.42 L 4341.43 3675.96 L 4341.25 3676.13 L 4340.89 3676.31 M 4337.14 3669.41 L 4342.86 3672.63 M 4337.85 3666.79 L 4341.61 3668.22 M 4337.85 3666.79 L 4341.61 3665.36 M 4340.36 3667.69 L 4340.36 3665.9 M 4337.85 3662.03 L 4337.85 3663.82 L 4339.46 3664 L 4339.28 3663.82 L 4339.11 3663.29 L 4339.11 3662.75 L 4339.28 3662.21 L 4339.64 3661.85 L 4340.18 3661.68 L 4340.54 3661.68 L 4341.07 3661.85 L 4341.43 3662.21 L 4341.61 3662.75 L 4341.61 3663.29 L 4341.43 3663.82 L 4341.25 3664 L 4340.89 3664.18~~gge42~~0~#@$TEXT~L~4349.999~3680~0.8~90~0~3~~3.937~B6/A6~M 4347.85 3680 L 4351.61 3680 M 4347.85 3680 L 4347.85 3678.39 L 4348.03 3677.85 L 4348.21 3677.67 L 4348.57 3677.49 L 4348.93 3677.49 L 4349.28 3677.67 L 4349.46 3677.85 L 4349.64 3678.39 M 4349.64 3680 L 4349.64 3678.39 L 4349.82 3677.85 L 4350 3677.67 L 4350.36 3677.49 L 4350.89 3677.49 L 4351.25 3677.67 L 4351.43 3677.85 L 4351.61 3678.39 L 4351.61 3680 M 4348.39 3674.17 L 4348.03 3674.35 L 4347.85 3674.88 L 4347.85 3675.24 L 4348.03 3675.78 L 4348.57 3676.13 L 4349.46 3676.31 L 4350.36 3676.31 L 4351.07 3676.13 L 4351.43 3675.78 L 4351.61 3675.24 L 4351.61 3675.06 L 4351.43 3674.52 L 4351.07 3674.17 L 4350.54 3673.99 L 4350.36 3673.99 L 4349.82 3674.17 L 4349.46 3674.52 L 4349.28 3675.06 L 4349.28 3675.24 L 4349.46 3675.78 L 4349.82 3676.13 L 4350.36 3676.31 M 4347.14 3669.58 L 4352.86 3672.81 M 4347.85 3666.97 L 4351.61 3668.4 M 4347.85 3666.97 L 4351.61 3665.54 M 4350.36 3667.87 L 4350.36 3666.08 M 4348.39 3662.21 L 4348.03 3662.39 L 4347.85 3662.93 L 4347.85 3663.29 L 4348.03 3663.82 L 4348.57 3664.18 L 4349.46 3664.36 L 4350.36 3664.36 L 4351.07 3664.18 L 4351.43 3663.82 L 4351.61 3663.29 L 4351.61 3663.11 L 4351.43 3662.57 L 4351.07 3662.21 L 4350.54 3662.03 L 4350.36 3662.03 L 4349.82 3662.21 L 4349.46 3662.57 L 4349.28 3663.11 L 4349.28 3663.29 L 4349.46 3663.82 L 4349.82 3664.18 L 4350.36 3664.36~~gge44~~0~#@$TEXT~L~4359.999~3680~0.8~90~0~3~~3.937~B7/A7~M 4357.85 3680 L 4361.61 3680 M 4357.85 3680 L 4357.85 3678.39 L 4358.03 3677.85 L 4358.21 3677.67 L 4358.57 3677.49 L 4358.93 3677.49 L 4359.28 3677.67 L 4359.46 3677.85 L 4359.64 3678.39 M 4359.64 3680 L 4359.64 3678.39 L 4359.82 3677.85 L 4360 3677.67 L 4360.36 3677.49 L 4360.89 3677.49 L 4361.25 3677.67 L 4361.43 3677.85 L 4361.61 3678.39 L 4361.61 3680 M 4357.85 3673.81 L 4361.61 3675.6 M 4357.85 3676.31 L 4357.85 3673.81 M 4357.14 3669.41 L 4362.86 3672.63 M 4357.85 3666.79 L 4361.61 3668.22 M 4357.85 3666.79 L 4361.61 3665.36 M 4360.36 3667.69 L 4360.36 3665.9 M 4357.85 3661.68 L 4361.61 3663.46 M 4357.85 3664.18 L 4357.85 3661.68~~gge46~~0~#@$TEXT~L~4367.148~3700~0.8~90~0~3~~3.937~MCP23017~M 4364.9991 3700 L 4368.7591 3700 M 4364.9991 3700 L 4368.7591 3698.57 M 4364.9991 3697.14 L 4368.7591 3698.57 M 4364.9991 3697.14 L 4368.7591 3697.14 M 4365.8991 3693.27 L 4365.5391 3693.45 L 4365.1791 3693.81 L 4364.9991 3694.17 L 4364.9991 3694.88 L 4365.1791 3695.24 L 4365.5391 3695.6 L 4365.8991 3695.78 L 4366.4291 3695.96 L 4367.3291 3695.96 L 4367.8691 3695.78 L 4368.2191 3695.6 L 4368.5791 3695.24 L 4368.7591 3694.88 L 4368.7591 3694.17 L 4368.5791 3693.81 L 4368.2191 3693.45 L 4367.8691 3693.27 M 4364.9991 3692.09 L 4368.7591 3692.09 M 4364.9991 3692.09 L 4364.9991 3690.48 L 4365.1791 3689.94 L 4365.3591 3689.76 L 4365.7191 3689.58 L 4366.2491 3689.58 L 4366.6091 3689.76 L 4366.7891 3689.94 L 4366.9691 3690.48 L 4366.9691 3692.09 M 4365.8991 3688.22 L 4365.7191 3688.22 L 4365.3591 3688.05 L 4365.1791 3687.87 L 4364.9991 3687.51 L 4364.9991 3686.79 L 4365.1791 3686.44 L 4365.3591 3686.26 L 4365.7191 3686.08 L 4366.0791 3686.08 L 4366.4291 3686.26 L 4366.9691 3686.61 L 4368.7591 3688.4 L 4368.7591 3685.9 M 4364.9991 3684.36 L 4364.9991 3682.39 L 4366.4291 3683.46 L 4366.4291 3682.93 L 4366.6091 3682.57 L 4366.7891 3682.39 L 4367.3291 3682.21 L 4367.6891 3682.21 L 4368.2191 3682.39 L 4368.5791 3682.75 L 4368.7591 3683.29 L 4368.7591 3683.82 L 4368.5791 3684.36 L 4368.3991 3684.54 L 4368.0391 3684.72 M 4364.9991 3679.96 L 4365.1791 3680.49 L 4365.7191 3680.85 L 4366.6091 3681.03 L 4367.1491 3681.03 L 4368.0391 3680.85 L 4368.5791 3680.49 L 4368.7591 3679.96 L 4368.7591 3679.6 L 4368.5791 3679.06 L 4368.0391 3678.7 L 4367.1491 3678.53 L 4366.6091 3678.53 L 4365.7191 3678.7 L 4365.1791 3679.06 L 4364.9991 3679.6 L 4364.9991 3679.96 M 4365.7191 3677.34 L 4365.5391 3676.99 L 4364.9991 3676.45 L 4368.7591 3676.45 M 4364.9991 3672.76 L 4368.7591 3674.55 M 4364.9991 3675.27 L 4364.9991 3672.76~~gge48~~0~#@$PAD~ELLIPSE~4269.999~3715~6~6~11~GND~1~1.8~~90~gge50~0~~Y~0~0~0.4~4270,3715#@$PAD~ELLIPSE~4279.999~3715~6~6~11~GND~2~1.8~~90~gge55~0~~Y~1~0~0.4~4280,3715#@$PAD~ELLIPSE~4289.999~3715~6~6~11~GND~3~1.8~~90~gge60~0~~Y~0~0~0.4~4290,3715#@$PAD~ELLIPSE~4299.999~3715~6~6~11~U1_3V3_2~4~1.8~~90~gge65~0~~Y~0~0~0.4~4300,3715#@$PAD~ELLIPSE~4309.999~3715~6~6~11~~5~1.8~~90~gge70~0~~Y~0~0~0.4~4310,3715#@$PAD~ELLIPSE~4319.999~3715~6~6~11~~6~1.8~~90~gge75~0~~Y~0~0~0.4~4320,3715#@$PAD~ELLIPSE~4329.999~3715~6~6~11~U1_21~7~1.8~~90~gge80~0~~Y~0~0~0.4~4330,3715#@$PAD~ELLIPSE~4339.999~3715~6~6~11~U1_22~8~1.8~~90~gge85~0~~Y~0~0~0.4~4340,3715#@$PAD~ELLIPSE~4349.999~3715~6~6~11~GND~9~1.8~~90~gge90~0~~Y~0~0~0.4~4350,3715#@$PAD~ELLIPSE~4359.999~3715~6~6~11~U1_3V3_2~10~1.8~~90~gge95~0~~Y~0~0~0.4~4360,3715#@$PAD~ELLIPSE~4269.999~3655~6~6~11~U1_3V3_2~11~1.8~~90~gge100~0~~Y~0~0~0.4~4270,3655#@$PAD~ELLIPSE~4279.999~3655~6~6~11~~12~1.8~~90~gge105~0~~Y~0~0~0.4~4280,3655#@$PAD~ELLIPSE~4289.999~3655~6~6~11~~13~1.8~~90~gge110~0~~Y~0~0~0.4~4290,3655#@$PAD~ELLIPSE~4299.999~3655~6~6~11~~14~1.8~~90~gge115~0~~Y~0~0~0.4~4300,3655#@$PAD~ELLIPSE~4309.999~3655~6~6~11~~15~1.8~~90~gge120~0~~Y~0~0~0.4~4310,3655#@$PAD~ELLIPSE~4319.999~3655~6~6~11~~16~1.8~~90~gge125~0~~Y~0~0~0.4~4320,3655#@$PAD~ELLIPSE~4329.999~3655~6~6~11~~17~1.8~~90~gge130~0~~Y~0~0~0.4~4330,3655#@$PAD~ELLIPSE~4339.999~3655~6~6~11~~18~1.8~~90~gge135~0~~Y~0~0~0.4~4340,3655#@$PAD~ELLIPSE~4349.999~3655~6~6~11~U3_19~19~1.8~~90~gge140~0~~Y~0~0~0.4~4350,3655#@$PAD~ELLIPSE~4359.999~3655~6~6~11~U3_20~20~1.8~~90~gge145~0~~Y~0~0~0.4~4360,3655#@$PAD~ELLIPSE~4269.999~3645~6~6~11~GND~21~1.8~~90~gge150~0~~Y~0~0~0.4~4270,3645#@$PAD~ELLIPSE~4279.999~3645~6~6~11~~22~1.8~~90~gge155~0~~Y~0~0~0.4~4280,3645#@$PAD~ELLIPSE~4289.999~3645~6~6~11~U3_23~23~1.8~~90~gge160~0~~Y~0~0~0.4~4290,3645#@$PAD~ELLIPSE~4299.999~3645~6~6~11~U3_24~24~1.8~~90~gge165~0~~Y~0~0~0.4~4300,3645#@$PAD~ELLIPSE~4309.999~3645~6~6~11~U3_25~25~1.8~~90~gge170~0~~Y~0~0~0.4~4310,3645#@$PAD~ELLIPSE~4319.999~3645~6~6~11~~26~1.8~~90~gge175~0~~Y~0~0~0.4~4320,3645#@$PAD~ELLIPSE~4329.999~3645~6~6~11~U3_27~27~1.8~~90~gge180~0~~Y~0~0~0.4~4330,3645#@$PAD~ELLIPSE~4339.999~3645~6~6~11~U3_28~28~1.8~~90~gge185~0~~Y~0~0~0.4~4340,3645#@$PAD~ELLIPSE~4349.999~3645~6~6~11~U3_29~29~1.8~~90~gge190~0~~Y~0~0~0.4~4350,3645#@$PAD~ELLIPSE~4359.999~3645~6~6~11~U3_30~30~1.8~~90~gge195~0~~Y~0~0~0.4~4360,3645","LIB~4086~3620.5~package`RES-TH_BD1.8-L3.2-P7.20-D0.4`BOM_Supplier`LCSC`BOM_Supplier Part`C714232`BOM_Manufacturer`Huaxing Mechanical-Elec.`BOM_Manufacturer Part`CF1/6W-10KΊ¹5%T52`nameAlias`Resistance (Ohms)`Contributor`LCSC`spicePre`R`spiceSymbolName`CF1/6W-10KΊ¹5%T52`~~~gge2be133cf7b4aac5a~1~97467e7cb6374f7e9dd7fc644a47cfb1~1570352249~0~~yes~~#@$TEXT~N~4085.5~3602.5~0.6~0~0~3~~4.5~10kΊ~M 4086.9898 3602.2502 C 4086.9898 3601.9902 4086.9898 3601.7202 4086.9898 3601.4602 L 4086.9898 3599.9102 L 4086.9998 3599.2002 L 4086.9398 3599.1502 L 4085.9198 3599.4202 L 4085.9198 3599.5902 L 4086.5798 3599.5302 L 4086.5798 3601.4602 C 4086.5798 3601.7202 4086.5798 3601.9902 4086.5698 3602.2502 L 4085.8698 3602.3502 L 4085.8698 3602.5002 L 4087.6898 3602.5002 L 4087.6898 3602.3502 Z M 4088.6098 3600.8302 C 4088.6098 3599.6402 4088.8998 3599.3302 4089.2098 3599.3302 C 4089.5098 3599.3302 4089.7998 3599.6402 4089.7998 3600.8302 C 4089.7998 3602.0502 4089.5098 3602.3702 4089.2098 3602.3702 C 4088.8998 3602.3702 4088.6098 3602.0502 4088.6098 3600.8302 Z M 4089.2098 3599.1302 C 4088.6798 3599.1302 4088.1698 3599.5902 4088.1698 3600.8302 C 4088.1698 3602.1002 4088.6798 3602.5602 4089.2098 3602.5602 C 4089.7298 3602.5602 4090.2398 3602.1002 4090.2398 3600.8302 C 4090.2398 3599.5902 4089.7298 3599.1302 4089.2098 3599.1302 Z M 4092.8298 3602.3002 L 4091.9898 3600.9602 L 4092.5598 3600.3902 L 4093.0198 3600.3302 L 4093.0198 3600.1602 L 4091.8898 3600.1602 L 4091.8898 3600.3302 L 4092.2698 3600.4102 L 4091.3798 3601.3302 L 4091.3798 3599.5902 L 4091.3998 3598.8902 L 4091.3398 3598.8602 L 4090.5798 3599.0602 L 4090.5798 3599.2102 L 4090.9798 3599.2502 L 4090.9798 3601.4702 C 4090.9798 3601.7302 4090.9698 3602.0202 4090.9698 3602.2902 L 4090.5798 3602.3502 L 4090.5798 3602.5002 L 4091.7798 3602.5002 L 4091.7798 3602.3502 L 4091.3898 3602.2902 C 4091.3898 3602.0602 4091.3798 3601.8102 4091.3798 3601.5802 L 4091.7098 3601.2402 L 4092.4698 3602.5002 L 4093.1498 3602.5002 L 4093.1498 3602.3502 Z M 4096.2998 3601.6602 L 4096.1798 3602.1502 L 4095.4798 3602.1502 L 4095.4798 3602.1502 C 4095.9898 3601.7902 4096.3898 3601.2602 4096.3898 3600.6202 C 4096.3898 3599.6602 4095.7098 3599.1302 4094.9498 3599.1302 C 4094.1798 3599.1302 4093.5098 3599.6602 4093.5098 3600.6202 C 4093.5098 3601.2702 4093.9098 3601.7902 4094.4198 3602.1502 L 4094.4198 3602.1502 L 4093.7198 3602.1502 L 4093.5998 3601.6602 L 4093.3398 3601.6602 L 4093.3898 3602.5002 L 4094.7098 3602.5002 L 4094.7098 3602.2002 C 4094.2498 3601.8202 4093.9598 3601.2402 4093.9598 3600.6202 C 4093.9598 3599.8902 4094.3298 3599.3402 4094.9498 3599.3402 C 4095.5698 3599.3402 4095.9298 3599.8902 4095.9298 3600.6202 C 4095.9298 3601.2402 4095.6398 3601.8202 4095.1798 3602.2002 L 4095.1798 3602.5002 L 4096.5098 3602.5002 L 4096.5498 3601.6602 Z ~none~gge849~~0~#@$TEXT~P~4082.5~3614.5~0.6~0~0~3~~4.5~R2~M 4082.5 3609.96 L 4082.5 3614.25 M 4082.5 3609.96 L 4084.34 3609.96 L 4084.95 3610.16 L 4085.16 3610.37 L 4085.36 3610.78 L 4085.36 3611.19 L 4085.16 3611.6 L 4084.95 3611.8 L 4084.34 3612 L 4082.5 3612 M 4083.93 3612 L 4085.36 3614.25 M 4086.92 3610.98 L 4086.92 3610.78 L 4087.12 3610.37 L 4087.33 3610.16 L 4087.74 3609.96 L 4088.55 3609.96 L 4088.96 3610.16 L 4089.17 3610.37 L 4089.37 3610.78 L 4089.37 3611.19 L 4089.17 3611.6 L 4088.76 3612.21 L 4086.71 3614.25 L 4089.58 3614.25~~gge515~~0~#@$TRACK~1~3~S$11~4079.7007 3616.9568 4092.2993 3616.9567~gge517~0#@$TRACK~1~3~S$13~4092.2993 3616.9568 4092.2993 3624.0433~gge518~0#@$TRACK~1~3~S$11~4092.2993 3624.0432 4079.7007 3624.0433~gge519~0#@$TRACK~1~3~S$13~4079.7007 3624.0432 4079.7007 3616.9567~gge520~0#@$PAD~ELLIPSE~4071.827~3620.5~4.7244~4.7244~11~U1_S_VP~1~1.5748~~0~gge521~0~~Y~0~0~0.4~4071.8268,3620.5#@$PAD~ELLIPSE~4100.173~3620.5~4.7244~4.7244~11~GND~2~1.5748~~0~gge526~0~~Y~0~0~0.4~4100.1732,3620.5","LIB~4290~3606.5~package`RES-TH_BD1.8-L3.2-P7.20-D0.4`BOM_Supplier`LCSC`BOM_Supplier Part`C714232`BOM_Manufacturer`Huaxing Mechanical-Elec.`BOM_Manufacturer Part`CF1/6W-10KΊ¹5%T52`nameAlias`Resistance (Ohms)`Contributor`LCSC`spicePre`R`spiceSymbolName`CF1/6W-10KΊ¹5%T52`~180~~gge0d47179fde529207~1~97467e7cb6374f7e9dd7fc644a47cfb1~1570352249~0~~yes~~#@$TEXT~N~4279.08~3628.08~0.6~0~0~3~~4.5~10kΊ~M 4280.5701 3627.8298 C 4280.5701 3627.5698 4280.5701 3627.2998 4280.5701 3627.0398 L 4280.5701 3625.4898 L 4280.5801 3624.7798 L 4280.5201 3624.7298 L 4279.5001 3624.9998 L 4279.5001 3625.1698 L 4280.1601 3625.1098 L 4280.1601 3627.0398 C 4280.1601 3627.2998 4280.1601 3627.5698 4280.1501 3627.8298 L 4279.4501 3627.9298 L 4279.4501 3628.0798 L 4281.2701 3628.0798 L 4281.2701 3627.9298 Z M 4282.1901 3626.4098 C 4282.1901 3625.2198 4282.4801 3624.9098 4282.7901 3624.9098 C 4283.0901 3624.9098 4283.3801 3625.2198 4283.3801 3626.4098 C 4283.3801 3627.6298 4283.0901 3627.9498 4282.7901 3627.9498 C 4282.4801 3627.9498 4282.1901 3627.6298 4282.1901 3626.4098 Z M 4282.7901 3624.7098 C 4282.2601 3624.7098 4281.7501 3625.1698 4281.7501 3626.4098 C 4281.7501 3627.6798 4282.2601 3628.1398 4282.7901 3628.1398 C 4283.3101 3628.1398 4283.8201 3627.6798 4283.8201 3626.4098 C 4283.8201 3625.1698 4283.3101 3624.7098 4282.7901 3624.7098 Z M 4286.4101 3627.8798 L 4285.5701 3626.5398 L 4286.1401 3625.9698 L 4286.6001 3625.9098 L 4286.6001 3625.7398 L 4285.4701 3625.7398 L 4285.4701 3625.9098 L 4285.8501 3625.9898 L 4284.9601 3626.9098 L 4284.9601 3625.1698 L 4284.9801 3624.4698 L 4284.9201 3624.4398 L 4284.1601 3624.6398 L 4284.1601 3624.7898 L 4284.5601 3624.8298 L 4284.5601 3627.0498 C 4284.5601 3627.3098 4284.5501 3627.5998 4284.5501 3627.8698 L 4284.1601 3627.9298 L 4284.1601 3628.0798 L 4285.3601 3628.0798 L 4285.3601 3627.9298 L 4284.9701 3627.8698 C 4284.9701 3627.6398 4284.9601 3627.3898 4284.9601 3627.1598 L 4285.2901 3626.8198 L 4286.0501 3628.0798 L 4286.7301 3628.0798 L 4286.7301 3627.9298 Z M 4289.8801 3627.2398 L 4289.7601 3627.7298 L 4289.0601 3627.7298 L 4289.0601 3627.7298 C 4289.5701 3627.3698 4289.9701 3626.8398 4289.9701 3626.1998 C 4289.9701 3625.2398 4289.2901 3624.7098 4288.5301 3624.7098 C 4287.7601 3624.7098 4287.0901 3625.2398 4287.0901 3626.1998 C 4287.0901 3626.8498 4287.4901 3627.3698 4288.0001 3627.7298 L 4288.0001 3627.7298 L 4287.3001 3627.7298 L 4287.1801 3627.2398 L 4286.9201 3627.2398 L 4286.9701 3628.0798 L 4288.2901 3628.0798 L 4288.2901 3627.7798 C 4287.8301 3627.3998 4287.5401 3626.8198 4287.5401 3626.1998 C 4287.5401 3625.4698 4287.9101 3624.9198 4288.5301 3624.9198 C 4289.1501 3624.9198 4289.5101 3625.4698 4289.5101 3626.1998 C 4289.5101 3626.8198 4289.2201 3627.3998 4288.7601 3627.7798 L 4288.7601 3628.0798 L 4290.0901 3628.0798 L 4290.1301 3627.2398 Z~none~gge1118~~0~#@$TEXT~P~4287~3618~0.6~0~0~3~~4.5~R3~M 4287 3613.46 L 4287 3617.75 M 4287 3613.46 L 4288.84 3613.46 L 4289.45 3613.66 L 4289.66 3613.87 L 4289.86 3614.28 L 4289.86 3614.69 L 4289.66 3615.1 L 4289.45 3615.3 L 4288.84 3615.5 L 4287 3615.5 M 4288.43 3615.5 L 4289.86 3617.75 M 4291.62 3613.46 L 4293.87 3613.46 L 4292.65 3615.1 L 4293.26 3615.1 L 4293.67 3615.3 L 4293.87 3615.5 L 4294.08 3616.12 L 4294.08 3616.53 L 4293.87 3617.14 L 4293.46 3617.55 L 4292.85 3617.75 L 4292.24 3617.75 L 4291.62 3617.55 L 4291.42 3617.35 L 4291.21 3616.94~~gge940~~0~#@$TRACK~1~3~S$11~4296.2993 3610.0432 4283.7007 3610.0433~gge942~0#@$TRACK~1~3~S$13~4283.7007 3610.0432 4283.7007 3602.9567~gge943~0#@$TRACK~1~3~S$11~4283.7007 3602.9568 4296.2993 3602.9567~gge944~0#@$TRACK~1~3~S$13~4296.2993 3602.9568 4296.2993 3610.0433~gge945~0#@$PAD~ELLIPSE~4304.173~3606.5~4.7244~4.7244~11~GND~1~1.5748~~180~gge946~0~~Y~0~0~0.4~4304.1732,3606.5#@$PAD~ELLIPSE~4275.827~3606.5~4.7244~4.7244~11~U1_15~2~1.5748~~180~gge951~0~~Y~0~0~0.4~4275.8268,3606.5","LIB~4067~3640.8071~package`MOLEX_PICOBLADE_8P`description``Contributor`DesertBit`sourceId`JjBuMGYgy`timeStamp`1472635423`spicePre`J`spiceSymbolName`MOLEX_PICOBLADE_8P`BOM_Manufacturer Part``~270~~gge19aefbed2d4ff121~1~fc117d7fb2fa4d559044936821f94db6~1540579869~0~~yes~~#@$TEXT~N~4078.56~3693.997~0.6~90~0~3~~4.5~Display~M 4074.0201 3693.997 L 4078.3101 3693.997 M 4074.0201 3693.997 L 4074.0201 3692.567 L 4074.2201 3691.947 L 4074.6301 3691.547 L 4075.0401 3691.337 L 4075.6601 3691.137 L 4076.6801 3691.137 L 4077.2901 3691.337 L 4077.7001 3691.547 L 4078.1101 3691.947 L 4078.3101 3692.567 L 4078.3101 3693.997 M 4074.0201 3689.787 L 4074.2201 3689.577 L 4074.0201 3689.377 L 4073.8101 3689.577 L 4074.0201 3689.787 M 4075.4501 3689.577 L 4078.3101 3689.577 M 4076.0601 3685.777 L 4075.6601 3685.977 L 4075.4501 3686.597 L 4075.4501 3687.207 L 4075.6601 3687.817 L 4076.0601 3688.027 L 4076.4701 3687.817 L 4076.6801 3687.407 L 4076.8801 3686.387 L 4077.0901 3685.977 L 4077.5001 3685.777 L 4077.7001 3685.777 L 4078.1101 3685.977 L 4078.3101 3686.597 L 4078.3101 3687.207 L 4078.1101 3687.817 L 4077.7001 3688.027 M 4075.4501 3684.427 L 4079.7501 3684.427 M 4076.0601 3684.427 L 4075.6601 3684.017 L 4075.4501 3683.607 L 4075.4501 3682.997 L 4075.6601 3682.587 L 4076.0601 3682.177 L 4076.6801 3681.967 L 4077.0901 3681.967 L 4077.7001 3682.177 L 4078.1101 3682.587 L 4078.3101 3682.997 L 4078.3101 3683.607 L 4078.1101 3684.017 L 4077.7001 3684.427 M 4074.0201 3680.617 L 4078.3101 3680.617 M 4075.4501 3676.817 L 4078.3101 3676.817 M 4076.0601 3676.817 L 4075.6601 3677.227 L 4075.4501 3677.637 L 4075.4501 3678.247 L 4075.6601 3678.657 L 4076.0601 3679.067 L 4076.6801 3679.267 L 4077.0901 3679.267 L 4077.7001 3679.067 L 4078.1101 3678.657 L 4078.3101 3678.247 L 4078.3101 3677.637 L 4078.1101 3677.227 L 4077.7001 3676.817 M 4075.4501 3675.257 L 4078.3101 3674.037 M 4075.4501 3672.807 L 4078.3101 3674.037 L 4079.1301 3674.447 L 4079.5401 3674.847 L 4079.7501 3675.257 L 4079.7501 3675.467~none~gge3175~~0~#@$TEXT~P~4068~3672.807~0.6~270~0~3~~4.5~J3~M 4072.54 3674.8571 L 4069.27 3674.8571 L 4068.65 3674.6471 L 4068.45 3674.4471 L 4068.25 3674.0371 L 4068.25 3673.6271 L 4068.45 3673.2171 L 4068.65 3673.0071 L 4069.27 3672.8071 L 4069.68 3672.8071 M 4072.54 3676.6071 L 4072.54 3678.8571 L 4070.9 3677.6371 L 4070.9 3678.2471 L 4070.7 3678.6571 L 4070.5 3678.8571 L 4069.88 3679.0671 L 4069.47 3679.0671 L 4068.86 3678.8571 L 4068.45 3678.4571 L 4068.25 3677.8371 L 4068.25 3677.2271 L 4068.45 3676.6071 L 4068.65 3676.4071 L 4069.06 3676.2071~~gge3177~~0~#@$TRACK~1~3~~4067 3696.8071 4055 3696.8071~gge3179~0#@$TRACK~1~3~~4067 3650.2561 4067 3696.8311~gge3180~0#@$TRACK~1~3~~4067 3650.2571 4055 3650.2571~gge3181~0#@$TRACK~1~3~~4055 3650.2571 4055 3696.8271~gge3182~0#@$PAD~ELLIPSE~4062.47~3656.557~3.1496~3.1496~11~U1_3V3_1~1~0.9843~~90~gge3183~0~~Y~0~0~0.4~4062.47,3656.5571#@$PAD~ELLIPSE~4062.47~3661.477~3.1496~3.1496~11~GND~2~0.9843~~90~gge3188~0~~Y~0~0~0.4~4062.47,3661.4771#@$PAD~ELLIPSE~4062.47~3666.397~3.1496~3.1496~11~U1_02~3~0.9843~~90~gge3193~0~~Y~0~0~0.4~4062.47,3666.3971#@$PAD~ELLIPSE~4062.47~3671.317~3.1496~3.1496~11~U1_13~4~0.9843~~90~gge3198~0~~Y~0~0~0.4~4062.47,3671.3171#@$PAD~ELLIPSE~4062.47~3676.237~3.1496~3.1496~11~U1_14~5~0.9843~~90~gge3203~0~~Y~0~0~0.4~4062.47,3676.2371#@$PAD~ELLIPSE~4062.47~3681.157~3.1496~3.1496~11~U1_25~6~0.9843~~90~gge3208~0~~Y~0~0~0.4~4062.47,3681.1571#@$PAD~ELLIPSE~4062.47~3686.087~3.1496~3.1496~11~U1_4~7~0.9843~~90~gge3213~0~~Y~0~0~0.4~4062.47,3686.0871#@$PAD~ELLIPSE~4062.47~3691.007~3.1496~3.1496~11~GND~8~0.9843~~90~gge3218~0~~Y~0~0~0.4~4062.47,3691.0071","LIB~4043.62~3636.87~package`M2X3`Contributor`DangerousPrototype`spicePre`J`spiceSymbolName`CON_HEADER_2X03`BOM_Manufacturer Part``~~~gge73b657ec88652575~1~1a95e0cd8cf04abab1f0a955e387d9de~1541683872~0~~yes~~#@$TEXT~N~4094.262~3620.31~0.6~0~0~3~~4.5~LEFT IO~M 4094.26 3615.77L4094.26 3620.06 M 4094.26 3620.06L4096.72 3620.06 M 4098.07 3615.77L4098.07 3620.06 M 4098.07 3615.77L4100.73 3615.77 M 4098.07 3617.81L4099.7 3617.81 M 4098.07 3620.06L4100.73 3620.06 M 4102.08 3615.77L4102.08 3620.06 M 4102.08 3615.77L4104.73 3615.77 M 4102.08 3617.81L4103.71 3617.81 M 4107.52 3615.77L4107.52 3620.06 M 4106.08 3615.77L4108.95 3615.77 M 4113.45 3615.77L4113.45 3620.06 M 4116.03 3615.77L4115.62 3615.97 L4115.21 3616.38 L4115 3616.79 L4114.8 3617.41 L4114.8 3618.43 L4115 3619.04 L4115.21 3619.45 L4115.62 3619.86 L4116.03 3620.06 L4116.84 3620.06 L4117.25 3619.86 L4117.66 3619.45 L4117.87 3619.04 L4118.07 3618.43 L4118.07 3617.41 L4117.87 3616.79 L4117.66 3616.38 L4117.25 3615.97 L4116.84 3615.77 L4116.03 3615.77 ~none~gge3128~~0~#@$TEXT~P~4041~3623.5~0.6~0~0~3~~4.5~J1~M 4043.0479 3618.9599 L 4043.0479 3622.2299 L 4042.8379 3622.8499 L 4042.6379 3623.0499 L 4042.2279 3623.2499 L 4041.8179 3623.2499 L 4041.4079 3623.0499 L 4041.2079 3622.8499 L 4040.9979 3622.2299 L 4040.9979 3621.8199 M 4044.3979 3619.7799 L 4044.8079 3619.5699 L 4045.4179 3618.9599 L 4045.4179 3623.2499~~gge3130~~0~#@$TRACK~1~3~~4028.62 3626.87 4028.62 3636.87~gge11100~0#@$TRACK~1~3~~4028.62 3636.87 4028.62 3646.87~gge11101~0#@$TRACK~1~3~~4028.62 3646.87 4038.62 3646.87~gge11102~0#@$TRACK~1~3~~4038.62 3646.87 4058.62 3646.87~gge11103~0#@$TRACK~1~3~~4058.62 3646.87 4058.62 3626.87~gge11104~0#@$TRACK~1~3~~4058.62 3626.87 4028.62 3626.87~gge11105~0#@$TRACK~1~3~~4038.62 3636.87 4028.62 3636.87~gge11106~0#@$TRACK~1~3~~4038.62 3636.87 4038.62 3646.87~gge11107~0#@$PAD~RECT~4033.62~3641.87~4.72~4.72~11~U1_3V3_2~1~1.57~4031.26 3639.51 4035.98 3639.51 4035.98 3644.23 4031.26 3644.23~0~gge11108~0~~Y~0~0~0.4~4033.62,3641.87#@$PAD~ELLIPSE~4033.62~3631.87~4.72~4.72~11~U1_S_VP~2~1.57~~0~gge11113~0~~Y~0~0~0.4~4033.62,3631.87#@$PAD~ELLIPSE~4043.62~3641.87~4.72~4.72~11~U3_23~3~1.57~~0~gge11118~0~~Y~0~0~0.4~4043.62,3641.87#@$PAD~ELLIPSE~4043.62~3631.87~4.72~4.72~11~U3_25~4~1.57~~0~gge11123~0~~Y~0~0~0.4~4043.62,3631.87#@$PAD~ELLIPSE~4053.62~3641.87~4.72~4.72~11~U3_24~5~1.57~~0~gge11128~0~~Y~0~0~0.4~4053.62,3641.87#@$PAD~ELLIPSE~4053.62~3631.87~4.72~4.72~11~GND~6~1.57~~0~gge11133~0~~Y~0~0~0.4~4053.62,3631.87","LIB~4390.08~3636.87~package`M2X3`Contributor`DangerousPrototype`spicePre`J`spiceSymbolName`CON_HEADER_2X03`BOM_Manufacturer Part``~~~gge7677077cf56e81b8~1~1a95e0cd8cf04abab1f0a955e387d9de~1541683872~0~~yes~~#@$TEXT~N~4438.879~3620.31~0.6~0~0~3~~4.5~RIGHT IO~M 4438.88 3615.77L4438.88 3620.06 M 4438.88 3615.77L4440.72 3615.77 L4441.33 3615.97 L4441.54 3616.18 L4441.74 3616.59 L4441.74 3617 L4441.54 3617.41 L4441.33 3617.61 L4440.72 3617.81 L4438.88 3617.81 M 4440.31 3617.81L4441.74 3620.06 M 4443.09 3615.77L4443.09 3620.06 M 4447.51 3616.79L4447.31 3616.38 L4446.9 3615.97 L4446.49 3615.77 L4445.67 3615.77 L4445.26 3615.97 L4444.85 3616.38 L4444.65 3616.79 L4444.44 3617.41 L4444.44 3618.43 L4444.65 3619.04 L4444.85 3619.45 L4445.26 3619.86 L4445.67 3620.06 L4446.49 3620.06 L4446.9 3619.86 L4447.31 3619.45 L4447.51 3619.04 L4447.51 3618.43 M 4446.49 3618.43L4447.51 3618.43 M 4448.86 3615.77L4448.86 3620.06 M 4451.72 3615.77L4451.72 3620.06 M 4448.86 3617.81L4451.72 3617.81 M 4454.51 3615.77L4454.51 3620.06 M 4453.07 3615.77L4455.94 3615.77 M 4460.44 3615.77L4460.44 3620.06 M 4463.02 3615.77L4462.61 3615.97 L4462.2 3616.38 L4461.99 3616.79 L4461.79 3617.41 L4461.79 3618.43 L4461.99 3619.04 L4462.2 3619.45 L4462.61 3619.86 L4463.02 3620.06 L4463.83 3620.06 L4464.24 3619.86 L4464.65 3619.45 L4464.86 3619.04 L4465.06 3618.43 L4465.06 3617.41 L4464.86 3616.79 L4464.65 3616.38 L4464.24 3615.97 L4463.83 3615.77 L4463.02 3615.77 ~none~gge3084~~0~#@$TEXT~P~4377~3623.5~0.6~0~0~3~~4.5~J2~M 4379.0412 3618.9596 L 4379.0412 3622.2296 L 4378.8412 3622.8496 L 4378.6412 3623.0496 L 4378.2312 3623.2496 L 4377.8212 3623.2496 L 4377.4112 3623.0496 L 4377.2012 3622.8496 L 4377.0012 3622.2296 L 4377.0012 3621.8196 M 4380.6012 3619.9796 L 4380.6012 3619.7796 L 4380.8012 3619.3696 L 4381.0112 3619.1596 L 4381.4212 3618.9596 L 4382.2412 3618.9596 L 4382.6412 3619.1596 L 4382.8512 3619.3696 L 4383.0512 3619.7796 L 4383.0512 3620.1896 L 4382.8512 3620.5996 L 4382.4412 3621.2096 L 4380.3912 3623.2496 L 4383.2612 3623.2496~~gge3086~~0~#@$TRACK~1~3~~4375.08 3626.87 4375.08 3636.87~gge11142~0#@$TRACK~1~3~~4375.08 3636.87 4375.08 3646.87~gge11143~0#@$TRACK~1~3~~4375.08 3646.87 4385.08 3646.87~gge11144~0#@$TRACK~1~3~~4385.08 3646.87 4405.08 3646.87~gge11145~0#@$TRACK~1~3~~4405.08 3646.87 4405.08 3626.87~gge11146~0#@$TRACK~1~3~~4405.08 3626.87 4375.08 3626.87~gge11147~0#@$TRACK~1~3~~4385.08 3636.87 4375.08 3636.87~gge11148~0#@$TRACK~1~3~~4385.08 3636.87 4385.08 3646.87~gge11149~0#@$PAD~RECT~4380.08~3641.87~4.72~4.72~11~U1_3V3_2~1~1.57~4377.72 3639.51 4382.44 3639.51 4382.44 3644.23 4377.72 3644.23~0~gge11150~0~~Y~0~0~0.4~4380.08,3641.87#@$PAD~ELLIPSE~4380.08~3631.87~4.72~4.72~11~J2_2~2~1.57~~0~gge11155~0~~Y~0~0~0.4~4380.08,3631.87#@$PAD~ELLIPSE~4390.08~3641.87~4.72~4.72~11~U3_20~3~1.57~~0~gge11160~0~~Y~0~0~0.4~4390.08,3641.87#@$PAD~ELLIPSE~4390.08~3631.87~4.72~4.72~11~U3_29~4~1.57~~0~gge11165~0~~Y~0~0~0.4~4390.08,3631.87#@$PAD~ELLIPSE~4400.08~3641.87~4.72~4.72~11~U3_19~5~1.57~~0~gge11170~0~~Y~0~0~0.4~4400.08,3641.87#@$PAD~ELLIPSE~4400.08~3631.87~4.72~4.72~11~GND~6~1.57~~0~gge11175~0~~Y~0~0~0.4~4400.08,3631.87","VIA~4092.28~3744.41~2.4016~U1_25~0.6102~gge28792~0","VIA~4228.84~3627.99~2.4016~U1_15~0.6102~gge28786~0","VIA~4233.2~3615.14~2.4016~U1_15~0.6102~gge28784~0","VIA~4104.46~3666.4~2.4016~U1_02~0.6102~gge28776~0","VIA~4200.29~3631.66~2.4016~U1_02~0.6102~gge28775~0","VIA~4232.21~3671.32~2.4016~U1_13~0.6102~gge28770~0","VIA~4233.49~3635.82~2.4016~U1_13~0.6102~gge28769~0","VIA~4181.9~3676.24~2.4016~U1_14~0.6102~gge28761~0","VIA~4201.1~3641.17~2.4016~U1_14~0.6102~gge28760~0","VIA~4294.63~3634.63~2.4016~U3_28~0.6102~gge28753~0","VIA~4242.15~3651.64~2.4016~U3_28~0.6102~gge28752~0","VIA~4181.72~3614.3~2.4016~U3_27~0.6102~gge28748~0","VIA~4180.88~3637.76~2.4016~U1_3V3_2~0.6102~gge28729~0","VIA~4261.43~3632.16~2.4016~U3_23~0.6102~gge28704~0","VIA~4089.12~3646.93~2.4016~U3_23~0.6102~gge28703~0","VIA~4273.07~3623.8~2.4016~GND~0.6102~gge28699~0","VIA~4393~3621.13~2.4016~GND~0.6102~gge28698~0","HOLE~4216.85~3688.051~4~gge9740~0","HOLE~4033.78~3607.343~3.937~gge8701~0","HOLE~4043.622~3703.799~3.937~gge8697~0","HOLE~4390.079~3703.799~3.937~gge8693~0","HOLE~4380.236~3607.343~3.937~gge8689~0","HOLE~4050.5~3788.445~3.937~gge28837~0","PAD~ELLIPSE~4024.5~3788.445~6~6~11~GND~2~2~~180~gge28867~0~~Y~0~0~0.4~4024.5,3788.4445","VIA~4216.85~3762.093~2.4016~U1_15~0.6102~gge29124~0","VIA~4221.02~3762.093~2.4016~U1_13~0.6102~gge29137~0","VIA~4263~3833.72~2.4016~GND~0.6102~gge29399~0","VIA~4274.811~3833.72~2.4016~GND~0.6102~gge29402~0","VIA~4286.622~3833.72~2.4016~GND~0.6102~gge29405~0","VIA~4298.433~3833.72~2.4016~GND~0.6102~gge29408~0","VIA~4310.244~3833.72~2.4016~GND~0.6102~gge29411~0","VIA~4322.055~3833.72~2.4016~GND~0.6102~gge29414~0","VIA~4333.866~3833.72~2.4016~GND~0.6102~gge29417~0","VIA~4345.677~3833.72~2.4016~GND~0.6102~gge29420~0","VIA~4357.488~3833.72~2.4016~GND~0.6102~gge29423~0","VIA~4369.299~3833.72~2.4016~GND~0.6102~gge29426~0","VIA~4381.11~3833.72~2.4016~GND~0.6102~gge29429~0","VIA~4381.11~3794.35~2.4016~GND~0.6102~gge29573~0","VIA~4369.299~3794.35~2.4016~GND~0.6102~gge29576~0","VIA~4357.488~3794.35~2.4016~GND~0.6102~gge29579~0","VIA~4345.677~3794.35~2.4016~GND~0.6102~gge29582~0","VIA~4333.866~3794.35~2.4016~GND~0.6102~gge29585~0","VIA~4322.055~3794.35~2.4016~GND~0.6102~gge29588~0","VIA~4310.244~3794.35~2.4016~GND~0.6102~gge29591~0","VIA~4298.433~3794.35~2.4016~GND~0.6102~gge29594~0","VIA~4286.622~3794.35~2.4016~GND~0.6102~gge29597~0","VIA~4274.811~3794.35~2.4016~GND~0.6102~gge29600~0","VIA~4263~3794.35~2.4016~GND~0.6102~gge29603~0","VIA~4369.299~3754.98~2.4016~GND~0.6102~gge29741~0","VIA~4357.488~3754.98~2.4016~GND~0.6102~gge29744~0","VIA~4345.677~3754.98~2.4016~GND~0.6102~gge29747~0","VIA~4333.866~3754.98~2.4016~GND~0.6102~gge29750~0","VIA~4322.055~3754.98~2.4016~GND~0.6102~gge29753~0","VIA~4310.244~3754.98~2.4016~GND~0.6102~gge29756~0","VIA~4298.433~3754.98~2.4016~GND~0.6102~gge29759~0","VIA~4286.622~3754.98~2.4016~GND~0.6102~gge29762~0","VIA~4274.811~3754.98~2.4016~GND~0.6102~gge29765~0","VIA~4263~3754.98~2.4016~GND~0.6102~gge29768~0","VIA~4369.299~3774.665~2.4016~GND~0.6102~gge29906~0","VIA~4357.488~3774.665~2.4016~GND~0.6102~gge29909~0","VIA~4345.677~3774.665~2.4016~GND~0.6102~gge29912~0","VIA~4333.866~3774.665~2.4016~GND~0.6102~gge29915~0","VIA~4322.055~3774.665~2.4016~GND~0.6102~gge29918~0","VIA~4310.244~3774.665~2.4016~GND~0.6102~gge29921~0","VIA~4298.433~3774.665~2.4016~GND~0.6102~gge29924~0","VIA~4286.622~3774.665~2.4016~GND~0.6102~gge29927~0","VIA~4274.811~3774.665~2.4016~GND~0.6102~gge29930~0","VIA~4263~3774.665~2.4016~GND~0.6102~gge29933~0","VIA~4381.11~3814.035~2.4016~GND~0.6102~gge30068~0","VIA~4369.299~3814.035~2.4016~GND~0.6102~gge30071~0","VIA~4357.488~3814.035~2.4016~GND~0.6102~gge30074~0","VIA~4345.677~3814.035~2.4016~GND~0.6102~gge30077~0","VIA~4333.866~3814.035~2.4016~GND~0.6102~gge30080~0","VIA~4322.055~3814.035~2.4016~GND~0.6102~gge30083~0","VIA~4310.244~3814.035~2.4016~GND~0.6102~gge30086~0","VIA~4298.433~3814.035~2.4016~GND~0.6102~gge30089~0","VIA~4286.622~3814.035~2.4016~GND~0.6102~gge30092~0","VIA~4274.811~3814.035~2.4016~GND~0.6102~gge30095~0","VIA~4263~3814.035~2.4016~GND~0.6102~gge30098~0","VIA~4193.5~3722.5~2.4016~GND~0.6102~gge30200~0","VIA~4241.5~3692~2.4016~GND~0.6102~gge30317~0","VIA~4253.311~3692~2.4016~GND~0.6102~gge30320~0","VIA~4264.04~3692~2.4016~GND~0.6102~gge30323~0","VIA~4276.933~3692~2.4016~GND~0.6102~gge30326~0","VIA~4288.744~3692~2.4016~GND~0.6102~gge30329~0","VIA~4312.366~3692~2.4016~GND~0.6102~gge30335~0","VIA~4324.177~3692~2.4016~GND~0.6102~gge30338~0","VIA~4174.5~3684~2.4016~GND~0.6102~gge30437~0","VIA~4186.311~3684~2.4016~GND~0.6102~gge30440~0","VIA~4198.122~3684~2.4016~GND~0.6102~gge30443~0","VIA~4209.933~3684~2.4016~GND~0.6102~gge30446~0","VIA~4174.5~3690.5~2.4016~GND~0.6102~gge30509~0","VIA~4186.311~3690.5~2.4016~GND~0.6102~gge30512~0","VIA~4198.122~3690.5~2.4016~GND~0.6102~gge30515~0","VIA~4209.933~3690.5~2.4016~GND~0.6102~gge30518~0","VIA~4174.5~3697.5~2.4016~GND~0.6102~gge30569~0","VIA~4186.311~3697.5~2.4016~GND~0.6102~gge30572~0","VIA~4198.122~3697.5~2.4016~GND~0.6102~gge30575~0","VIA~4209.933~3697.5~2.4016~GND~0.6102~gge30578~0"],"layers":["1~TopLayer~#FF0000~true~true~true~","2~BottomLayer~#0000FF~true~false~true~","3~TopSilkLayer~#FFCC00~true~false~true~","4~BottomSilkLayer~#66CC33~true~false~true~","5~TopPasteMaskLayer~#808080~true~false~true~","6~BottomPasteMaskLayer~#800000~true~false~true~","7~TopSolderMaskLayer~#800080~true~false~true~0.3","8~BottomSolderMaskLayer~#AA00FF~true~false~true~0.3","9~Ratlines~#6464FF~true~false~true~","10~BoardOutLine~#FF00FF~true~false~true~","11~Multi-Layer~#C0C0C0~true~false~true~","12~Document~#FFFFFF~true~false~true~","13~TopAssembly~#33CC99~false~false~false~","14~BottomAssembly~#5555FF~false~false~false~","15~Mechanical~#F022F0~false~false~false~","19~3DModel~#66CCFF~false~false~false~","21~Inner1~#999966~false~false~false~~","22~Inner2~#008000~false~false~false~~","23~Inner3~#00FF00~false~false~false~~","24~Inner4~#BC8E00~false~false~false~~","25~Inner5~#70DBFA~false~false~false~~","26~Inner6~#00CC66~false~false~false~~","27~Inner7~#9966FF~false~false~false~~","28~Inner8~#800080~false~false~false~~","29~Inner9~#008080~false~false~false~~","30~Inner10~#15935F~false~false~false~~","31~Inner11~#000080~false~false~false~~","32~Inner12~#00B400~false~false~false~~","33~Inner13~#2E4756~false~false~false~~","34~Inner14~#99842F~false~false~false~~","35~Inner15~#FFFFAA~false~false~false~~","36~Inner16~#99842F~false~false~false~~","37~Inner17~#2E4756~false~false~false~~","38~Inner18~#3535FF~false~false~false~~","39~Inner19~#8000BC~false~false~false~~","40~Inner20~#43AE5F~false~false~false~~","41~Inner21~#C3ECCE~false~false~false~~","42~Inner22~#728978~false~false~false~~","43~Inner23~#39503F~false~false~false~~","44~Inner24~#0C715D~false~false~false~~","45~Inner25~#5A8A80~false~false~false~~","46~Inner26~#2B937E~false~false~false~~","47~Inner27~#23999D~false~false~false~~","48~Inner28~#45B4E3~false~false~false~~","49~Inner29~#215DA1~false~false~false~~","50~Inner30~#4564D7~false~false~false~~","51~Inner31~#6969E9~false~false~false~~","52~Inner32~#9069E9~false~false~false~~","99~ComponentShapeLayer~#00CCCC~false~false~false~","100~LeadShapeLayer~#CC9999~false~false~false~","101~ComponentPolarityLayer~#66FFCC~false~false~false~","Hole~Hole~#222222~false~false~true~","DRCError~DRCError~#FAD609~false~false~true~"],"objects":["All~true~false","Component~true~true","Prefix~true~true","Name~true~false","Track~true~true","Pad~true~true","Via~true~true","Hole~true~true","Copper_Area~true~true","Circle~true~true","Arc~true~true","Solid_Region~true~true","Text~true~true","Image~true~true","Rect~true~true","Dimension~true~true","Protractor~true~true"],"BBox":{"x":3992.5,"y":3567.2,"width":444.5,"height":299.8},"preference":{"hideFootprints":"","hideNets":""},"DRCRULE":{"Default":{"trackWidth":2.3622,"clearance":1.378,"viaHoleDiameter":2.4016,"viaHoleD":1.2008},"isRealtime":true,"isDrcOnRoutingOrPlaceVia":false,"checkObjectToCopperarea":true,"showDRCRangeLine":true},"routerRule":{"unit":"mm","trackWidth":0.6,"trackClearance":0.45,"viaHoleD":0.31,"viaDiameter":0.61,"routerLayers":[1,2],"smdClearance":0.45,"specialNets":[{"net":"BAT","width":"1mm","clearance":"1mm"}],"nets":["BAT","GND","J2_2","Q1_2","U1_02","U1_13","U1_14","U1_15","U1_21","U1_22","U1_25","U1_3V3_1","U1_3V3_2","U1_4","U1_S_VP","U3_19","U3_20","U3_23","U3_24","U3_25","U3_27","U3_28","U3_29","U3_30"],"padsCount":131,"skipNets":[],"realtime":true},"netColors":{}} \ No newline at end of file diff --git a/pcb/AirsoftTracker 1.4/info b/pcb/AirsoftTracker 1.4/info new file mode 100644 index 0000000..8a3adf7 --- /dev/null +++ b/pcb/AirsoftTracker 1.4/info @@ -0,0 +1,287 @@ +{ + "uuid": "0459f472d26ca335add64fa453cc1f9f", + "path": "Offline/AirsoftTracker%201.4", + "name": "AirsoftTracker 1.4", + "content": "", + "created_at": "2021-08-21 23:48:33", + "updated_at": "2023-08-11 00:01:19", + "stick": "", + "documents": [ + { + "uuid": "36185aec54333e8816b9b8a91c1fc7ed", + "title": "MainSheet", + "description": "", + "docType": "1", + "master": "", + "thumb": "/images/thumb-default.png", + "components": { + "5657e928f1504b21b9e68062d66ba3e3": 1, + "0f118b0d9063400da84e04b55532a171": 1, + "2ba8a26395ab41a2a00f577110f8f3f7": 3, + "605f956fd8c24817bb840fda3296ca74": 1, + "4cf556fe97124ad8934102a1b113e234": 2, + "abe5a9481474486593dfb32d8d0fb351": 1, + "38386194dc0a477c83fbd24273123f35": 1, + "d3e19c3068574fa0b89c92528028b98d": 1, + "1c47b77e6d1948b89e39b944cd2029a5": 1, + "0b833263bcfb409d8a029dcd9c6a3b59": 1, + "6a469063902c4d47b9003ece9d1d25f0": 1, + "e9b172bbe58746a0bfc16211d1d8f989": 1, + "ffcc179b5c0bb89105c20dd941419970": 1 + }, + "BOM": [ + [ + "Value", + "Quantity", + "Package", + "Components", + "CustomPara" + ], + [ + "2N2222", + 1, + "TO-92-3_L4.9-W3.7-P1.27-L", + "Q1", + { + "BOM_Supplier": "LCSC", + "BOM_Manufacturer": "SEMTECH", + "BOM_Manufacturer Part": "2N2222", + "BOM_Supplier Part": "C118536", + "BOM_LCSC Assembly": "Yes", + "BOM_Assembly Type": "manualWeld", + "BOM_Paste Type": "expand", + "puuid": "6924b36489de4921bb29ca14bf27c33f", + "uuid": "0b833263bcfb409d8a029dcd9c6a3b59" + } + ], + [ + "MCP23017", + 1, + "MCP23017", + "U3", + { + "BOM_Manufacturer": "", + "BOM_Manufacturer Part": "MCP23017", + "BOM_Supplier Part": "", + "BOM_Supplier": "", + "puuid": "f09420c4fd9946a583a6b15c1c5a483e", + "uuid": "0f118b0d9063400da84e04b55532a171" + } + ], + [ + "BAT", + 1, + "S2B-PH-SM4-TB", + "X1", + { + "BOM_Manufacturer Part": "", + "puuid": "ffe5780e60fc43f3861153d7ff9fe849", + "uuid": "1c47b77e6d1948b89e39b944cd2029a5" + } + ], + [ + "10kΊ", + 2, + "RES-TH_BD1.8-L3.2-P7.20-D0.4", + "R3,R2", + { + "BOM_Supplier": "LCSC", + "BOM_Supplier Part": "C714232", + "BOM_Manufacturer": "Huaxing Mechanical-Elec.", + "BOM_Manufacturer Part": "CF1/6W-10KΊ¹5%T52", + "puuid": "97467e7cb6374f7e9dd7fc644a47cfb1", + "uuid": "2ba8a26395ab41a2a00f577110f8f3f7" + } + ], + [ + "1kΊ", + 1, + "RES-TH_BD1.8-L3.2-P7.20-D0.4", + "R1", + { + "BOM_Supplier": "LCSC", + "BOM_Supplier Part": "C714232", + "BOM_Manufacturer": "Huaxing Mechanical-Elec.", + "BOM_Manufacturer Part": "CF1/6W-10KΊ¹5%T52", + "puuid": "97467e7cb6374f7e9dd7fc644a47cfb1", + "uuid": "2ba8a26395ab41a2a00f577110f8f3f7" + } + ], + [ + "LEFT IO", + 1, + "M2X3", + "J1", + { + "BOM_Manufacturer Part": "", + "puuid": "1a95e0cd8cf04abab1f0a955e387d9de", + "uuid": "4cf556fe97124ad8934102a1b113e234" + } + ], + [ + "RIGHT IO", + 1, + "M2X3", + "J2", + { + "BOM_Manufacturer Part": "", + "puuid": "1a95e0cd8cf04abab1f0a955e387d9de", + "uuid": "4cf556fe97124ad8934102a1b113e234" + } + ], + [ + "1N4001", + 1, + "DO-41_BD2.4-L4.7-P8.70-D0.9-RD", + "D1", + { + "BOM_Supplier": "LCSC", + "BOM_Manufacturer": "LRC", + "BOM_Manufacturer Part": "1N4001", + "BOM_Supplier Part": "C82804", + "puuid": "c2803222ad4b48fb94db0de548a6280a", + "uuid": "6a469063902c4d47b9003ece9d1d25f0" + } + ], + [ + "DWM1000", + 1, + "WIRELM-TH_DWM1000", + "U5", + { + "BOM_Supplier": "LCSC", + "BOM_Manufacturer": "DecaWave", + "BOM_Manufacturer Part": "DWM1000", + "BOM_Supplier Part": "C95238", + "puuid": "921ff2190df246a4b1016c11071a51a1", + "uuid": "605f956fd8c24817bb840fda3296ca74" + } + ], + [ + "MAIN BOARD", + 1, + "TTGO-T-BEAM-ESP32-CONNECTOR", + "U1", + { + "BOM_Manufacturer": "", + "BOM_Manufacturer Part": "", + "BOM_Supplier Part": "", + "BOM_Supplier": "", + "puuid": "5180c2e0c1da4a75b575a8495aee30f2", + "uuid": "5657e928f1504b21b9e68062d66ba3e3" + } + ], + [ + "IMU_9250", + 1, + "IMU9250", + "U2", + { + "BOM_Manufacturer": "", + "BOM_Manufacturer Part": "", + "BOM_Supplier Part": "", + "BOM_Supplier": "", + "puuid": "bc174898c43b41b89ffbf34ee09b95a5", + "uuid": "38386194dc0a477c83fbd24273123f35" + } + ], + [ + "Display", + 1, + "MOLEX_PICOBLADE_8P", + "J3", + { + "BOM_Manufacturer Part": "", + "puuid": "fc117d7fb2fa4d559044936821f94db6", + "uuid": "abe5a9481474486593dfb32d8d0fb351" + } + ], + [ + "MAIN BAT", + 1, + "M1X2_AWG20", + "J4", + { + "BOM_Manufacturer Part": "", + "puuid": "519ab30562c645fc9071b35164bd0656", + "uuid": "d3e19c3068574fa0b89c92528028b98d" + } + ], + [ + "100nF", + 1, + "CAP-TH_L5.0-W5.0-P5.08-D1.0", + "C1", + { + "BOM_Supplier": "LCSC", + "BOM_Supplier Part": "C444738", + "BOM_Manufacturer": "AVX", + "BOM_Manufacturer Part": "SR211C104KAR", + "BOM_LCSC Assembly": "Yes", + "BOM_Assembly Type": "manualWeld", + "BOM_Paste Type": "expand", + "puuid": "4d5b8e8e8f89428f98436df910b3190e", + "uuid": "e9b172bbe58746a0bfc16211d1d8f989" + } + ], + [ + "470uF", + 1, + "CAP-TH_BD8.0-P3.50-D1.0-FD", + "C3", + { + "BOM_Supplier": "LCSC", + "BOM_Manufacturer": "ValuePro", + "BOM_Manufacturer Part": "470uf16v", + "BOM_Supplier Part": "C28067", + "puuid": "90d1b58a2d284d63b5d026a0c4e38bab", + "uuid": "ffcc179b5c0bb89105c20dd941419970" + } + ] + ], + "updateTime": 1616029574, + "createTime": 1610754181, + "histories": [], + "created_at": "2021-01-15 18:43:01", + "updated_at": "2021-03-17 21:06:14" + }, + { + "uuid": "d25a02e17cf2144d6cc7e301a7d806ec", + "title": "MAIN PCB", + "filename": "MAIN PCB.json", + "description": "", + "docType": "3", + "master": "", + "thumb": "/images/thumb-default.png", + "components": { + "ffe5780e60fc43f3861153d7ff9fe849": 1, + "bc174898c43b41b89ffbf34ee09b95a5": 1, + "90d1b58a2d284d63b5d026a0c4e38bab": 1, + "97467e7cb6374f7e9dd7fc644a47cfb1": 3, + "4d5b8e8e8f89428f98436df910b3190e": 1, + "c2803222ad4b48fb94db0de548a6280a": 1, + "6924b36489de4921bb29ca14bf27c33f": 1, + "921ff2190df246a4b1016c11071a51a1": 1, + "519ab30562c645fc9071b35164bd0656": 1, + "5180c2e0c1da4a75b575a8495aee30f2": 1, + "f09420c4fd9946a583a6b15c1c5a483e": 1, + "fc117d7fb2fa4d559044936821f94db6": 1, + "1a95e0cd8cf04abab1f0a955e387d9de": 2 + }, + "BOM": [], + "updateTime": 1691726479, + "createTime": 1610756596, + "histories": [], + "created_at": "2021-01-15 19:23:16", + "updated_at": "2023-08-11 00:01:19" + } + ], + "sort": [ + "36185aec54333e8816b9b8a91c1fc7ed", + "c043ba3eac53e1a24fdc65c31791b21e" + ], + "title": "AirsoftTracker 1.4", + "foldername": "AirsoftTracker 1.4", + "schfilename": "AirsoftTracker 1.4.json", + "schfilemtime": 1629604113266.9019 +} \ No newline at end of file diff --git a/pcb/AirsoftTrackerLeftIO/AirsoftTrackerLeftIO.json b/pcb/AirsoftTrackerLeftIO/AirsoftTrackerLeftIO.json new file mode 100644 index 0000000..3eb880d --- /dev/null +++ b/pcb/AirsoftTrackerLeftIO/AirsoftTrackerLeftIO.json @@ -0,0 +1 @@ +{"editorVersion":"6.4.7","docType":"5","title":"AirsoftTrackerLeftIO","description":"","colors":{},"schematics":[{"description":"","uuid":"cad456857d695d9c6f9d99b21b0b449b","docType":"1","title":"Left IO","dataStr":{"head":{"docType":"1","editorVersion":"6.4.7","newgId":true,"c_para":{"Prefix Start":"1"},"c_spiceCmd":"null","hasIdFlag":true,"uuid":"cad456857d695d9c6f9d99b21b0b449b","x":"0","y":"0","portOfADImportHack":"","importFlag":0,"transformList":""},"canvas":"CA~1000~1000~#FFFFFF~yes~#CCCCCC~5~1000~1000~line~5~pixel~5~0~0","shape":["LIB~0~-806~package`NONE`BOM_Manufacturer Part`?`spicePre`.`~~0~frame_lib_1~~~0~~yes~yes#@$T~N~570.5~-809~0~#000080~Arial~~~~~comment~A~0~start~gge77~0~#@$PT~M 206 -796 L 206 -806 M 206 -10 L 206 0 M 402 -796 L 402 -806 M 402 -10 L 402 0 M 598 -796 L 598 -806 M 598 -10 L 598 0 M 794 -796 L 794 -806 M 794 -10 L 794 0 M 990 -796 L 990 -806 M 990 -10 L 990 0 M 10 -600 L 0 -600 M 1139 -600 L 1149 -600 M 10 -404 L 0 -404 M 1139 -404 L 1149 -404 M 10 -208 L 0 -208 M 1139 -208 L 1149 -208 M 10 -12 L 0 -12 M 1139 -12 L 1149 -12~#880000~1~0~none~gge6~0~frame_tick#@$T~P~571.5~-818~0~#000080~Arial~~~~~comment~A~0~start~gge76~0~#@$T~L~1.5~-698~0~#880000~~~~~~comment~A~1~start~gge7~0~frame_tick#@$T~L~1140.5~-698~0~#880000~~~~~~comment~A~1~start~gge9~0~frame_tick#@$T~L~1.5~-502~0~#880000~~~~~~comment~B~1~start~gge11~0~frame_tick#@$T~L~1140.5~-502~0~#880000~~~~~~comment~B~1~start~gge13~0~frame_tick#@$T~L~1.5~-306~0~#880000~~~~~~comment~C~1~start~gge15~0~frame_tick#@$T~L~1140.5~-306~0~#880000~~~~~~comment~C~1~start~gge17~0~frame_tick#@$T~L~1.5~-110~0~#880000~~~~~~comment~D~1~start~gge19~0~frame_tick#@$T~L~1140.5~-110~0~#880000~~~~~~comment~D~1~start~gge21~0~frame_tick#@$T~L~108~-797.5~0~#880000~~~~~~comment~1~1~start~gge23~0~frame_tick#@$T~L~108~-1.5~0~#880000~~~~~~comment~1~1~start~gge25~0~frame_tick#@$T~L~304~-797.5~0~#880000~~~~~~comment~2~1~start~gge27~0~frame_tick#@$T~L~304~-1.5~0~#880000~~~~~~comment~2~1~start~gge29~0~frame_tick#@$T~L~500~-797.5~0~#880000~~~~~~comment~3~1~start~gge31~0~frame_tick#@$T~L~500~-1.5~0~#880000~~~~~~comment~3~1~start~gge33~0~frame_tick#@$T~L~696~-797.5~0~#880000~~~~~~comment~4~1~start~gge35~0~frame_tick#@$T~L~696~-1.5~0~#880000~~~~~~comment~4~1~start~gge37~0~frame_tick#@$T~L~892~-797.5~0~#880000~~~~~~comment~5~1~start~gge39~0~frame_tick#@$T~L~892~-1.5~0~#880000~~~~~~comment~5~1~start~gge?~0~frame_tick#@$R~10~-796~~~1129~786~#880000~1~0~none~gge42~0~frame_innerbox#@$R~0~-806~~~1149~806~#880000~1~0~none~gge43~0~frame_outbox#@$R~694.99995~-90~~~444~80~#880000~1~0~none~gge44~0~frame_hitarea#@$PL~695.1 -50.75 1138.63 -50.75~#880000~1~0~none~gge45~0#@$PL~799.63 -30.75 1138.63 -30.75~#880000~1~0~none~gge46~0#@$PL~1059.61 -89.93 1059.63 -50.75~#880000~1~0~none~gge47~0#@$PL~1059.63 -50.75 1059.63 -30.75~#880000~1~0~none~gge48~0#@$T~L~699.99995~-77~0~#880000~~8pt~~~~comment~TITLE:~1~start~gge49~0~pinpart#@$T~L~757.62495~-64.41~0~#0000FF~~10pt~~~~comment~Left IO Board~1~start~gge51~0~frame_title#@$T~L~1064.62495~-63.75~0~#880000~~8pt~~~~comment~REV:~1~start~gge53~0~pinpart#@$T~L~1102.62495~-63.75~0~#0000FF~~9pt~~~~comment~1.0~1~start~gge55~0~frame_version#@$T~L~804.62495~-15~0~#880000~~8pt~~~~comment~Date:~1~start~gge57~0~pinpart#@$T~L~851.62495~-14.52~0~#0000FF~~9pt~~~~comment~2021-01-20~1~start~gge59~0~frame_date#@$T~L~1063.62495~-35~0~#880000~~8pt~~~~comment~Sheet:~1~start~gge61~0~pinpart#@$T~L~1108.62495~-34.52~0~#0000FF~~9pt~~~~comment~1/1~1~start~gge63~0~frame_sheet#@$T~L~943.62495~-14.75~0~#880000~~8pt~~~~comment~Drawn By:~1~start~gge65~0~pinpart#@$T~L~1008.63~-14.75~0~#0000FF~~9pt~~~~comment~ddv2020~1~start~gge67~0~frame_drawn#@$T~L~804.62495~-36.75~0~#880000~~8pt~~~~comment~Company:~1~start~gge69~0~pinpart#@$T~L~871.24995~-36.64~0~#0000FF~~9pt~~~~comment~DDV~1~start~gge71~0~frame_company#@$PL~799.63 -50.75 799.63 -10.75~#880000~1~0~none~gge73~0#@$Pimage~L~1~gge74~0~gge75~694.99995~-38~104~20~data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0i5Zu+5bGCXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNTIwIg0KCSB2aWV3Qm94PSIwIDAgMTY5Mi45IDM0MS41IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxNjkyLjkgMzQxLjU7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiM1NTg4RkY7fQ0KPC9zdHlsZT4NCjxnPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik05MDEuNywxNjEuMWMyLjMtMS44LDUuMS0yLjcsOC4zLTIuN2M0LjMsMCw4LjksMS42LDEzLjgsNC43YzQuOSwzLjEsOS42LDgsMTQuMSwxNC43bDE3LjQtMjcuOQ0KCQljLTUuNC03LjgtMTIuMS0xMy45LTIwLjItMTguMmMtOC4xLTQuMy0xNi43LTYuNC0yNS43LTYuNGMtMTIuOCwwLTI0LDMuOS0zMy40LDExLjdjLTkuNCw3LjgtMTQuMSwxOC0xNC4xLDMwLjQNCgkJYzAsOC45LDMsMTcuNCw5LDI1LjRjNC4zLDUuNywxMi4xLDEyLjYsMjMuMywyMC42YzkuNyw2LjksMTUuNywxMS43LDE3LjksMTQuNGMyLjIsMi43LDMuMyw1LjMsMy4zLDcuOWMwLDMuMi0xLjQsNS45LTQuMyw4LjMNCgkJYy0yLjksMi4zLTYuNywzLjUtMTEuNSwzLjVjLTEyLjEsMC0yMy4zLTYuNy0zMy41LTIwLjJsLTIyLjUsMjYuMmMxMCwxMC42LDE5LjEsMTgsMjcuMiwyMmM4LjEsNCwxNy4yLDYsMjcuMSw2DQoJCWMxNy4yLDAsMzAuMy00LjksMzkuNC0xNC43YzkuMS05LjgsMTMuNi0yMC4zLDEzLjYtMzEuM2MwLTguNC0yLjItMTYuMS02LjYtMjMuM2MtNC40LTcuMS0xMy42LTE1LjctMjcuNi0yNS43DQoJCWMtOC44LTYuMy0xNC0xMC41LTE1LjctMTIuN2MtMS44LTIuMi0yLjctNC40LTIuNy02LjZDODk4LjIsMTY0LjksODk5LjQsMTYyLjksOTAxLjcsMTYxLjF6Ii8+DQoJPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxMDM4LjcsMjE3LjIgMTAwOS44LDEyOS4xIDk3NCwxMjkuMSAxMDE1LjgsMjU3LjQgOTczLjYsMzMyIDEwMTIuMSwzMzIgMTEyOC44LDEyOS4xIDEwODkuNSwxMjkuMSAJDQoJCSIvPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02NTEuNSwxNTQuMWwtNzAuNCwwbDUuOC00MS43YzAsMCw3NC43LTAuMSw3NS4xLTAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44YzAtOS44LTgtMTcuOC0xNy44LTE3LjgNCgkJYy0wLjMsMC0xMDguNCwwLTEwOC40LDBMNTI2LDI3Ny43aDExMy4ydjBjOS41LTAuMiwxNy4yLTgsMTcuMi0xNy41YzAtOS43LTcuOS0xNy42LTE3LjYtMTcuNmMtMC40LDAtNzAuMiwwLjEtNzAuMiwwLjFsNy40LTUzLjMNCgkJYzAsMCw3MS43LDAuMSw3Mi4zLDAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44QzY2Ni4zLDE2Mi44LDY1OS45LDE1NS41LDY1MS41LDE1NC4xeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMjY4LjQsNzYuOGMtMC4zLDAtMTA4LjQsMC0xMDguNCwwbC0yNy40LDIwMC44aDExMy4zdjBjOS41LTAuMiwxNy4yLTgsMTcuMi0xNy41YzAtOS43LTcuOS0xNy42LTE3LjYtMTcuNg0KCQljLTAuNCwwLTcwLjIsMC4xLTcwLjIsMC4xbDcuNC01My4zYzAsMCw3MS43LDAuMSw3Mi40LDAuMWM5LjgsMCwxNy44LTgsMTcuOC0xNy44YzAtOC44LTYuNC0xNi4xLTE0LjgtMTcuNWwtNzAuNCwwbDUuOC00MS43DQoJCWMwLDAsNzQuNy0wLjEsNzUuMS0wLjFjOS44LDAsMTcuOC04LDE3LjgtMTcuOEMxMjg2LjIsODQuOCwxMjc4LjMsNzYuOCwxMjY4LjQsNzYuOHoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTQ3MC43LDE3M2MwLTE5LjctNC42LTM3LjItMTMuNy01Mi4zYy05LjEtMTUuMS0yMC45LTI2LjItMzUuNS0zMy4yYy0xNC42LTcuMS0zNi43LTEwLjYtNjYuNi0xMC42aC0zMS44DQoJCWwtMjcuNCwyMDAuOGg2Mi40YzI2LjIsMCw0Ni43LTMuOSw2MS40LTExLjdjMTQuNy03LjgsMjctMjAuMiwzNi43LTM3LjFDMTQ2NS45LDIxMS45LDE0NzAuNywxOTMuMywxNDcwLjcsMTczeiBNMTQyMS4zLDIxNC41DQoJCWMtNy4zLDExLTE2LjksMTguOC0yOC45LDIzLjNjLTguNiwzLjItMjIuNCw0LjgtNDEuNSw0LjhoLTEyLjRsMTcuNy0xMzAuNGg5LjVjMTUuNSwwLDI3LjksMi40LDM3LjIsNy4zDQoJCWM5LjMsNC45LDE2LjUsMTEuOCwyMS43LDIwLjhjNS4xLDksNy43LDIwLjEsNy43LDMzLjRDMTQzMi4yLDE4OS44LDE0MjguNiwyMDMuNSwxNDIxLjMsMjE0LjV6Ii8+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTE2MTkuMiwxNzAuN2wtMjIuMywxMi4zYy0xLjgsMTYuMi0xNS42LDI4LjctMzIuMiwyOC43Yy0xNy45LDAtMzIuNC0xNC41LTMyLjQtMzIuNA0KCQljMC0xNy45LDE0LjUtMzIuNCwzMi40LTMyLjRjNi45LDAsMTMuMywyLjIsMTguNSw1LjhsMjcuNy0xNS4zbC0xNS02MC4yaC0zMS43bC0xMDgsMjAwaDQwLjRsMjIuOC00Mi42aDc5LjRsMTAuNiw0Mi42aDM2LjQNCgkJTDE2MTkuMiwxNzAuN3oiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTU1Mi44LDE3OC41YzAsNi45LDUuNiwxMi41LDEyLjUsMTIuNWM2LjksMCwxMi41LTUuNiwxMi41LTEyLjVjMC02LjktNS42LTEyLjUtMTIuNS0xMi41DQoJCUMxNTU4LjQsMTY2LDE1NTIuOCwxNzEuNiwxNTUyLjgsMTc4LjV6Ii8+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTgxNC44LDE1Mi41QzgxNC44LDE1Mi41LDgxNC44LDE1Mi40LDgxNC44LDE1Mi41bC0xMi41LDBsLTEuMy0yLjRjLTUuMS04LjEtMTEuNS0xNC4yLTE5LjItMTguNA0KCQljLTcuOC00LjItMjAuMS02LjMtMjkuMy02LjNjLTEzLjcsMC0yNi44LDMuNy0zOS4zLDExLjFjLTEyLjUsNy40LTIyLjUsMTcuNy0yOS45LDMxYy03LjQsMTMuMi0xMS4yLDI3LjItMTEuMiw0MS44DQoJCWMwLDE5LjIsNS44LDM2LDE3LjQsNTAuNWMxMS42LDE0LjUsMjcuMywyMS43LDQ3LDIxLjdjOC42LDAsMTYuMy0xLjQsMjMuMi00LjRjNi45LTIuOSwxNC4zLTgsMjIuMi0xNS40YzAsMCw5LjMsOC4xLDkuNCw4DQoJCWM1LjgsNC42LDEzLDcuNSwyMC44LDhoMy42bDAuNS00LjNsMTIuNy0xMDYuOWMtMC4xLDAtMC4xLDAtMC4yLDBDODI4LjcsMTU4LjgsODIyLjUsMTUyLjYsODE0LjgsMTUyLjV6IE03ODUuNiwyMjQuMg0KCQljLTQuNSw4LjUtMTAuMSwxNC44LTE2LjgsMTguOGMtNi43LDQtMTQuNSw2LTIzLjUsNmMtMTAuOCwwLTE5LjYtMy41LTI2LjUtMTAuN2MtNi45LTcuMS0xMC4zLTE2LjUtMTAuMy0yOC4xDQoJCWMwLTE1LjEsNC41LTI3LjQsMTMuNi0zN2M5LjEtOS42LDIwLjEtMTQuMywzMy4xLTE0LjNjMTEuMiwwLDIwLjIsMy42LDI3LDEwLjdjNi44LDcuMiwxMC4yLDE2LjYsMTAuMiwyOC40DQoJCUM3OTIuNCwyMDYuOSw3OTAuMSwyMTUuNyw3ODUuNiwyMjQuMnoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNNDA0LjMsOTYuM2MtNy41LTE5LjktMTkuNy0zNy44LTM1LjgtNTIuM2MtMjQuNy0yMi4yLTU2LjctMzQuNS05MC0zNC41Yy0yOC44LDAtNTYuMyw5LTc5LjUsMjYNCgkJYy0xMS4yLDguMi0yMC45LDE3LjktMjguOSwyOC45Yy01LTAuNy0xMC4xLTEuMS0xNS4zLTEuMWMtMjguNywwLTU1LjgsMTEuMi03Ni4xLDMxLjVjLTIwLjMsMjAuMy0zMS41LDQ3LjMtMzEuNSw3Ni4xDQoJCWMwLDI2LjcsOS45LDUyLjMsMjcuOCw3Mi4xYzE0LjIsMTUuNywzMi42LDI2LjgsNTIuOSwzMmM4LjgsMjYuMiwzMy42LDQ1LjEsNjIuNyw0NS4xYzM2LjUsMCw2Ni4yLTI5LjcsNjYuMi02Ni4yDQoJCWMwLTIuMS0wLjEtNC4zLTAuMy02LjRsOTIuOS00OC44bC0yMC4zLTM1LjJsLTg4LjgsNDYuNmMtMTIuMS0xMy44LTI5LjktMjIuNS00OS43LTIyLjVjLTI4LjcsMC01My4yLDE4LjQtNjIuNCw0NA0KCQljLTIzLjQtMTAuMy0zOS44LTMzLjYtMzkuOC02MC44YzAtMzYuNiwyOS43LTY2LjQsNjYuNC02Ni40YzEyLjksMCwyNSwzLjcsMzUuMiwxMC4xYzEyLjMtMzcuMSw0Ny4zLTYzLjksODguNS02My45DQoJCWM0OCwwLDg3LjQsMzYuMiw5Mi43LDgyLjdjMS43LTAuMiwzLjQtMC4zLDUuMS0wLjNjMjguNywwLDUyLDIzLjMsNTIsNTJjMCwyNy4yLTIwLjksNDkuNS00Ny41LDUxLjhsLTI5LjcsMA0KCQljLTEuMy0wLjMtMi43LTAuNC00LjEtMC40Yy0xMS41LDAtMjAuOCw5LjMtMjAuOCwyMC44YzAsMTAuOSw4LjQsMTkuOCwxOS4xLDIwLjd2MC4ybDM1LjUsMGwxLjgsMGwxLjgtMC4yDQoJCWMyMy4yLTIsNDQuNy0xMi41LDYwLjUtMjkuN2MxNS45LTE3LjMsMjQuNy0zOS43LDI0LjctNjMuMkM0NjkuNiwxNDMuNiw0NDIuMSwxMDguMiw0MDQuMyw5Ni4zeiBNMTkwLjYsMjI4LjMNCgkJYzE0LjEsMCwyNS42LDExLjUsMjUuNiwyNS42YzAsMTQuMS0xMS41LDI1LjYtMjUuNiwyNS42Yy0xNC4xLDAtMjUuNi0xMS41LTI1LjYtMjUuNkMxNjUsMjM5LjgsMTc2LjUsMjI4LjMsMTkwLjYsMjI4LjN6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==","LIB~575~-625~package`PDV-P9XXX`BOM_Supplier Part``BOM_Supplier``Contributor`CalumGC`spicePre`R`spiceSymbolName`Photoresistor`BOM_Manufacturer Part``~180~0~gge444f54ff515ff9e8~99959802cb0742ccac25d0c38171a0c6~181a4b4c83b34b8491bb9b2cdc106792~0~~yes~yes#@$T~N~547.3203125~-646.75~0~#000080~Arial~~~~~comment~Photoresistor~1~start~gge155~0~#@$T~P~569.046875~-654.6328125~0~#000080~Arial~~~~~comment~R1~1~start~gge157~0~#@$PL~585 -630 583 -626~#8D2323~1~0~none~gge159~0#@$PL~583 -626 581 -634~#8D2323~1~0~none~gge160~0#@$PL~581 -634 578 -626~#8D2323~1~0~none~gge161~0#@$PL~578 -626 576 -634~#8D2323~1~0~none~gge162~0#@$PL~576 -634 574 -626~#8D2323~1~0~none~gge163~0#@$PL~574 -626 571 -634~#8D2323~1~0~none~gge164~0#@$PL~571 -634 569 -626~#8D2323~1~0~none~gge165~0#@$PL~569 -626 566 -634~#8D2323~1~0~none~gge166~0#@$PL~566 -634 565 -630~#8D2323~1~0~none~gge167~0#@$PL~590 -613 585 -618~#8D2323~1~0~none~gge168~0#@$PL~585 -616 585 -618~#8D2323~1~0~none~gge169~0#@$PL~585 -618 588 -618~#8D2323~1~0~none~gge170~0#@$PL~585 -610 581 -615~#8D2323~1~0~none~gge171~0#@$PL~581 -613 581 -615~#8D2323~1~0~none~gge172~0#@$PL~581 -615 583 -615~#8D2323~1~0~none~gge173~0#@$P~show~0~2~555~-630~180~gge174~0^^555~-630^^M 555 -630 h 10~#8D2323^^0~568~-627~0~2~start~~~#8D2323^^0~559~-631~0~2~end~~~#8D2323^^0~562~-630^^0~M 565 -627 L 568 -630 L 565 -633#@$P~show~0~1~595~-630~0~gge181~0^^595~-630^^M 595 -630 h -10~#8D2323^^0~582~-627~0~1~end~~~#8D2323^^0~591~-631~0~1~start~~~#8D2323^^0~588~-630^^0~M 585 -633 L 582 -630 L 585 -627#@$E~575~-630~12.5~12.5~#8D2323~1~0~none~gge188~0","LIB~435~-620~package`M2X3`Contributor`DangerousPrototype`spicePre`J`spiceSymbolName`CON_HEADER_2X03`BOM_Manufacturer Part``~~0~gge7fb3288c494a335c~1a95e0cd8cf04abab1f0a955e387d9de~4cf556fe97124ad8934102a1b113e234~0~~yes~yes#@$T~N~417.375~-642~0~#000080~Arial~~~~~comment~LEFT IO~1~start~gge190~0~#@$T~P~430.078125~-652~0~#000080~Arial~~~~~comment~J5~1~start~gge192~0~#@$PL~415 -640 455 -640~#8D2323~2~0~none~gge194~0#@$PL~455 -640 455 -600~#8D2323~2~0~none~gge195~0#@$PL~455 -600 415 -600~#8D2323~2~0~none~gge196~0#@$PL~415 -600 415 -640~#8D2323~2~0~none~gge197~0#@$P~show~0~1~420~-630~180~gge198~0^^420~-630^^M 420 -630 h 4~#8D2323^^0~433~-627~0~1~start~~~#8D2323^^1~424~-631~0~1~end~~~#8D2323^^1~427~-630^^0~M 430 -627 L 433 -630 L 430 -633#@$P~show~0~3~420~-620~180~gge205~0^^420~-620^^M 420 -620 h 4~#8D2323^^0~433~-617~0~3~start~~~#8D2323^^1~424~-621~0~3~end~~~#8D2323^^1~427~-620^^0~M 430 -617 L 433 -620 L 430 -623#@$P~show~0~5~420~-610~180~gge212~0^^420~-610^^M 420 -610 h 4~#8D2323^^0~433~-607~0~5~start~~~#8D2323^^1~424~-611~0~5~end~~~#8D2323^^1~427~-610^^0~M 430 -607 L 433 -610 L 430 -613#@$P~show~0~2~450~-630~0~gge219~0^^450~-630^^M 450 -630 h -4~#8D2323^^0~437~-627~0~2~end~~~#8D2323^^1~446~-631~0~2~start~~~#8D2323^^1~443~-630^^0~M 440 -633 L 437 -630 L 440 -627#@$P~show~0~4~450~-620~0~gge226~0^^450~-620^^M 450 -620 h -4~#8D2323^^0~437~-617~0~4~end~~~#8D2323^^1~446~-621~0~4~start~~~#8D2323^^1~443~-620^^0~M 440 -623 L 437 -620 L 440 -617#@$P~show~0~6~450~-610~0~gge233~0^^450~-610^^M 450 -610 h -4~#8D2323^^0~437~-607~0~6~end~~~#8D2323^^1~446~-611~0~6~start~~~#8D2323^^1~443~-610^^0~M 440 -613 L 437 -610 L 440 -607","W~595 -630 595 -665 520 -665 405 -665 405 -630 420 -630~#008800~1~0~none~gge292~0","W~450 -630 555 -630~#008800~1~0~none~gge294~0","LIB~455~-515~package`KEY-SMD_4P-L6.0-W6.0-P4.50-LS9.5`BOM_Supplier`LCSC`BOM_Supplier Part`C180420`BOM_Manufacturer`Omron Electronics`BOM_Manufacturer Part`B3S-1000P`Contributor`LCSC`spicePre`S`spiceSymbolName`B3S-1000P`~~0~gge6c4ed95c422dbc6a~8fffabc80ac54d08a323684a5a5c8f59~96da1098782146b3badbde5a666b3323~0~~yes~yes#@$T~N~444.890625~-553.5~0~#000080~Arial~~~~~comment~B3S-1000P~1~start~gge402~0~#@$T~P~444.8984375~-562.5~0~#000080~Arial~~~~~comment~SW1~1~start~gge404~0~#@$E~455~-500~2.5~2.5~#880000~1~0~none~gge406~0#@$E~455~-520~2.5~2.5~#880000~1~0~none~gge407~0#@$PL~455 -498 455 -480~#880000~1~0~none~gge408~0#@$PL~455 -522 455 -540~#880000~1~0~none~gge409~0#@$PL~435 -540 475 -540~#880000~1~0~none~gge410~0#@$PL~435 -480 475 -480~#880000~1~0~none~gge411~0#@$PL~458 -498 462 -522~#880000~1~0~none~gge412~0#@$P~show~0~1~485~-480~0~gge413~0^^485~-480^^M 485 -480 h -10~#880000^^0~473~-477~0~1~end~~~#0000FF^^1~475~-481~0~1~start~~~#0000FF^^0~478~-480^^0~M 475 -483 L 472 -480 L 475 -477#@$P~show~0~2~425~-480~180~gge420~0^^425~-480^^M 425 -480 h 10~#880000^^0~437~-477~0~2~start~~~#0000FF^^1~435~-481~0~2~end~~~#0000FF^^0~432~-480^^0~M 435 -477 L 438 -480 L 435 -483#@$P~show~0~3~485~-540~0~gge427~0^^485~-540^^M 485 -540 h -10~#880000^^0~473~-537~0~3~end~~~#0000FF^^1~475~-541~0~3~start~~~#0000FF^^0~478~-540^^0~M 475 -543 L 472 -540 L 475 -537#@$P~show~0~4~425~-540~180~gge434~0^^425~-540^^M 425 -540 h 10~#880000^^0~437~-537~0~4~start~~~#0000FF^^1~435~-541~0~4~end~~~#0000FF^^0~432~-540^^0~M 435 -537 L 438 -540 L 435 -543","LIB~575~-515~package`KEY-SMD_4P-L6.0-W6.0-P4.50-LS9.5`BOM_Supplier`LCSC`BOM_Supplier Part`C180420`BOM_Manufacturer`Omron Electronics`BOM_Manufacturer Part`B3S-1000P`Contributor`LCSC`spicePre`S`spiceSymbolName`B3S-1000P`~~0~gge4f906009ed98b9cc~8fffabc80ac54d08a323684a5a5c8f59~96da1098782146b3badbde5a666b3323~0~~yes~yes#@$T~N~564.890625~-553.5~0~#000080~Arial~~~~~comment~B3S-1000P~1~start~gge443~0~#@$T~P~564.8984375~-562.5~0~#000080~Arial~~~~~comment~SW2~1~start~gge445~0~#@$E~575~-500~2.5~2.5~#880000~1~0~none~gge447~0#@$E~575~-520~2.5~2.5~#880000~1~0~none~gge448~0#@$PL~575 -498 575 -480~#880000~1~0~none~gge449~0#@$PL~575 -522 575 -540~#880000~1~0~none~gge450~0#@$PL~555 -540 595 -540~#880000~1~0~none~gge451~0#@$PL~555 -480 595 -480~#880000~1~0~none~gge452~0#@$PL~578 -498 582 -522~#880000~1~0~none~gge453~0#@$P~show~0~1~605~-480~0~gge454~0^^605~-480^^M 605 -480 h -10~#880000^^0~593~-477~0~1~end~~~#0000FF^^1~595~-481~0~1~start~~~#0000FF^^0~598~-480^^0~M 595 -483 L 592 -480 L 595 -477#@$P~show~0~2~545~-480~180~gge461~0^^545~-480^^M 545 -480 h 10~#880000^^0~557~-477~0~2~start~~~#0000FF^^1~555~-481~0~2~end~~~#0000FF^^0~552~-480^^0~M 555 -477 L 558 -480 L 555 -483#@$P~show~0~3~605~-540~0~gge468~0^^605~-540^^M 605 -540 h -10~#880000^^0~593~-537~0~3~end~~~#0000FF^^1~595~-541~0~3~start~~~#0000FF^^0~598~-540^^0~M 595 -543 L 592 -540 L 595 -537#@$P~show~0~4~545~-540~180~gge475~0^^545~-540^^M 545 -540 h 10~#880000^^0~557~-537~0~4~start~~~#0000FF^^1~555~-541~0~4~end~~~#0000FF^^0~552~-540^^0~M 555 -537 L 558 -540 L 555 -543","LIB~690~-520~package`KEY-SMD_4P-L6.0-W6.0-P4.50-LS9.5`BOM_Supplier`LCSC`BOM_Supplier Part`C180420`BOM_Manufacturer`Omron Electronics`BOM_Manufacturer Part`B3S-1000P`Contributor`LCSC`spicePre`S`spiceSymbolName`B3S-1000P`~~0~ggea368c6bb20789447~8fffabc80ac54d08a323684a5a5c8f59~96da1098782146b3badbde5a666b3323~0~~yes~yes#@$T~N~679.890625~-558.5~0~#000080~Arial~~~~~comment~B3S-1000P~1~start~gge484~0~#@$T~P~679.8984375~-567.5~0~#000080~Arial~~~~~comment~SW3~1~start~gge486~0~#@$E~690~-505~2.5~2.5~#880000~1~0~none~gge488~0#@$E~690~-525~2.5~2.5~#880000~1~0~none~gge489~0#@$PL~690 -503 690 -485~#880000~1~0~none~gge490~0#@$PL~690 -527 690 -545~#880000~1~0~none~gge491~0#@$PL~670 -545 710 -545~#880000~1~0~none~gge492~0#@$PL~670 -485 710 -485~#880000~1~0~none~gge493~0#@$PL~693 -503 697 -527~#880000~1~0~none~gge494~0#@$P~show~0~1~720~-485~0~gge495~0^^720~-485^^M 720 -485 h -10~#880000^^0~708~-482~0~1~end~~~#0000FF^^1~710~-486~0~1~start~~~#0000FF^^0~713~-485^^0~M 710 -488 L 707 -485 L 710 -482#@$P~show~0~2~660~-485~180~gge502~0^^660~-485^^M 660 -485 h 10~#880000^^0~672~-482~0~2~start~~~#0000FF^^1~670~-486~0~2~end~~~#0000FF^^0~667~-485^^0~M 670 -482 L 673 -485 L 670 -488#@$P~show~0~3~720~-545~0~gge509~0^^720~-545^^M 720 -545 h -10~#880000^^0~708~-542~0~3~end~~~#0000FF^^1~710~-546~0~3~start~~~#0000FF^^0~713~-545^^0~M 710 -548 L 707 -545 L 710 -542#@$P~show~0~4~660~-545~180~gge516~0^^660~-545^^M 660 -545 h 10~#880000^^0~672~-542~0~4~start~~~#0000FF^^1~670~-546~0~4~end~~~#0000FF^^0~667~-545^^0~M 670 -542 L 673 -545 L 670 -548","W~450 -610 450 -580 425 -580 425 -540~#008800~1~0~none~gge564~0","W~720 -545 740 -545 740 -580 450 -580~#008800~1~0~none~gge565~0","W~660 -545 660 -580~#008800~1~0~none~gge567~0","W~605 -540 630 -540 630 -580~#008800~1~0~none~gge569~0","W~545 -540 545 -580~#008800~1~0~none~gge571~0","W~485 -540 510 -540 510 -580~#008800~1~0~none~gge573~0","W~485 -480 485 -465 395 -465 395 -620 420 -620~#008800~1~0~none~gge575~0","W~425 -480 425 -465~#008800~1~0~none~gge576~0","W~450 -620 535 -620 535 -465 605 -465 605 -480~#008800~1~0~none~gge578~0","W~545 -480 545 -465~#008800~1~0~none~gge579~0","W~420 -610 405 -610 405 -590 650 -590 650 -465 720 -465 720 -485~#008800~1~0~none~gge584~0","W~660 -485 660 -465~#008800~1~0~none~gge585~0","F~part_netLabel_gnD~795~-565~0~gge588~~0^^795~-565^^GND~#000000~782~-539~0~start~1~Times New Roman~9pt~gge590^^PL~795 -555 795 -565~#000000~1~0~transparent~gge592~0^^PL~786 -555 804 -555~#000000~1~0~transparent~gge593~0^^PL~789 -553 801 -553~#000000~1~0~transparent~gge594~0^^PL~792 -551 798 -551~#000000~1~0~transparent~gge595~0^^PL~794 -549 796 -549~#000000~1~0~transparent~gge596~0","W~795 -565 795 -580 740 -580~#008800~1~0~none~gge606~0","J~450~-580~2.5~#CC0000~gge566~0","J~660~-580~2.5~#CC0000~gge568~0","J~630~-580~2.5~#CC0000~gge570~0","J~545~-580~2.5~#CC0000~gge572~0","J~510~-580~2.5~#CC0000~gge574~0","J~425~-465~2.5~#CC0000~gge577~0","J~545~-465~2.5~#CC0000~gge580~0","J~660~-465~2.5~#CC0000~gge586~0","J~740~-580~2.5~#CC0000~gge607~0"],"BBox":{"x":0,"y":-806.8,"width":1149,"height":807.4},"colors":{}}}],"BOM":[["Value","Quantity","Package","Components","CustomPara"],["LEFT IO",1,"M2X3","J5",{"BOM_Manufacturer Part":"","puuid":"1a95e0cd8cf04abab1f0a955e387d9de","uuid":"4cf556fe97124ad8934102a1b113e234"}],["B3S-1000P",3,"KEY-SMD_4P-L6.0-W6.0-P4.50-LS9.5","SW1,SW2,SW3",{"BOM_Supplier":"LCSC","BOM_Supplier Part":"C180420","BOM_Manufacturer":"Omron Electronics","BOM_Manufacturer Part":"B3S-1000P","puuid":"8fffabc80ac54d08a323684a5a5c8f59","uuid":"96da1098782146b3badbde5a666b3323"}],["Photoresistor",1,"PDV-P9XXX","R1",{"BOM_Supplier Part":"","BOM_Supplier":"","BOM_Manufacturer Part":"","puuid":"99959802cb0742ccac25d0c38171a0c6","uuid":"181a4b4c83b34b8491bb9b2cdc106792"}]],"components":{"181a4b4c83b34b8491bb9b2cdc106792":1,"4cf556fe97124ad8934102a1b113e234":1,"96da1098782146b3badbde5a666b3323":3}} \ No newline at end of file diff --git a/pcb/AirsoftTrackerLeftIO/Left IO PCB.json b/pcb/AirsoftTrackerLeftIO/Left IO PCB.json new file mode 100644 index 0000000..03264a8 --- /dev/null +++ b/pcb/AirsoftTrackerLeftIO/Left IO PCB.json @@ -0,0 +1 @@ +{"head":{"docType":"3","editorVersion":"6.4.7","newgId":true,"c_para":{},"hasIdFlag":true,"x":"4020","y":"3597.5","importFlag":0,"transformList":""},"canvas":"CA~1000~1000~#000000~yes~#FFFFFF~10~1000~1000~line~0.5~mm~1~45~visible~0.5~4020~3597.5~1~yes","shape":["COPPERAREA~1~1~GND~M 4010.5 3591.5 L 4065.5 3591.5 L 4066.5 3592.5 L 4066.5 3851 L 4066 3853.5 L 4010 3854 L 4008.5 3852.5 Z~1~solid~gge334~spoke~none~~0~gge334~1~1~1~1~yes~0","TRACK~1~10~~4020 3597.5 4059.3701 3597.5 4059.3701 3849.4685 4020 3849.4685 4020 3597.5~gge188~0","TRACK~1.5748~1~J5_3~4048.55 3690.22 4048.55 3654.39~gge970~0","TRACK~1.5748~1~J5_3~4043.62 3654.39 4043.62 3645.8 4039.69 3641.87~gge969~0","TRACK~1.5748~1~J5_3~4048.55 3654.39 4043.62 3654.39~gge968~0","TRACK~1.5748~1~J5_5~4048.55 3824.08 4048.55 3788.25~gge967~0","TRACK~1.5748~1~J5_5~4053.48 3788.25 4053.48 3645.66 4049.69 3641.87~gge966~0","TRACK~1.5748~1~J5_5~4048.55 3788.25 4053.48 3788.25~gge965~0","TRACK~1.5748~1~R1_2~4052.56 3613.71 4047.84 3613.71 4029.69 3631.87~gge964~0","TRACK~1.5748~1~R1_2~4052.56 3609.31 4052.56 3613.71~gge963~0","TRACK~1.5748~1~R1_1~4029.69 3637.14 4027.32 3637.14 4024.37 3634.19 4024.37 3629.7 4040.36 3613.71 4042.56 3613.71~gge962~0","TRACK~1.5748~1~R1_1~4029.69 3641.87 4029.69 3637.14~gge961~0","TRACK~1.5748~1~R1_1~4042.56 3609.31 4042.56 3613.71~gge960~0","TRACK~1.5748~1~GND~4030.83 3824.08 4030.83 3788.25~gge959~0","TRACK~1.5748~1~GND~4030.83 3788.25 4030.83 3757.15~gge958~0","TRACK~1.5748~1~GND~4030.83 3757.15 4030.83 3721.32~gge957~0","TRACK~1.5748~1~GND~4030.83 3648.28 4031.74 3648.28 4034.46 3645.55 4034.46 3640.08 4037.55 3636.99 4044.56 3636.99 4049.69 3631.87~gge956~0","TRACK~1.5748~1~GND~4030.83 3654.39 4030.83 3648.28~gge955~0","TRACK~1.5748~1~GND~4030.83 3721.32 4030.83 3690.22~gge954~0","TRACK~1.5748~1~GND~4030.83 3690.22 4030.83 3654.39~gge953~0","TRACK~1.5748~1~J5_4~4048.55 3721.32 4048.55 3757.15~gge952~0","TRACK~1.5748~1~J5_4~4043.62 3757.15 4043.62 3829.13 4044.8 3830.32 4052.05 3830.32 4056.78 3825.59 4056.78 3632.14 4051.2 3626.56 4044.99 3626.56 4039.69 3631.87~gge951~0","TRACK~1.5748~1~J5_4~4048.55 3757.15 4043.62 3757.15~gge950~0","TEXT~L~4038~3605~0.8~0~0~1~~5.9055~+~M 4040.42 3599.85 L 4040.42 3604.68 M 4038 3602.26 L 4042.83 3602.26~~gge329~~0~pinpart","DIMENSION~12~M4106.1185,3806.1614L4106.1185,3839.626M4104.6185,3812.1614L4106.1185,3806.1614L4107.6185,3812.1614M4104.6185,3833.626L4106.1185,3839.626L4107.6185,3833.626M 4089.523 3852.8041L4089.983 3854.1641 L4090.893 3854.6241 L4091.803 3854.6241 L4092.713 3854.1641 L4093.163 3853.2541 L4093.623 3851.4441 L4094.073 3850.0741 L4094.983 3849.1641 L4095.893 3848.7141 L4097.253 3848.7141 L4098.163 3849.1641 L4098.623 3849.6241 L4099.073 3850.9841 L4099.073 3852.8041 L4098.623 3854.1641 L4098.163 3854.6241 L4097.253 3855.0741 L4095.893 3855.0741 L4094.983 3854.6241 L4094.073 3853.7141 L4093.623 3852.3441 L4093.163 3850.5341 L4092.713 3849.6241 L4091.803 3849.1641 L4090.893 3849.1641 L4089.983 3849.6241 L4089.523 3850.9841 L4089.523 3852.8041 M 4096.803 3845.2541L4097.253 3845.7141 L4097.713 3845.2541 L4097.253 3844.8041 L4096.803 3845.2541 M 4089.523 3836.3441L4089.523 3840.8941 L4093.623 3841.3441 L4093.163 3840.8941 L4092.713 3839.5341 L4092.713 3838.1641 L4093.163 3836.8041 L4094.073 3835.8941 L4095.433 3835.4441 L4096.343 3835.4441 L4097.713 3835.8941 L4098.623 3836.8041 L4099.073 3838.1641 L4099.073 3839.5341 L4098.623 3840.8941 L4098.163 3841.3441 L4097.253 3841.8041 M 4089.523 3829.7141L4089.983 3831.0741 L4091.343 3831.9841 L4093.623 3832.4441 L4094.983 3832.4441 L4097.253 3831.9841 L4098.623 3831.0741 L4099.073 3829.7141 L4099.073 3828.8041 L4098.623 3827.4441 L4097.253 3826.5341 L4094.983 3826.0741 L4093.623 3826.0741 L4091.343 3826.5341 L4089.983 3827.4441 L4089.523 3828.8041 L4089.523 3829.7141 M 4089.523 3820.3441L4089.983 3821.7141 L4091.343 3822.6241 L4093.623 3823.0741 L4094.983 3823.0741 L4097.253 3822.6241 L4098.623 3821.7141 L4099.073 3820.3441 L4099.073 3819.4441 L4098.623 3818.0741 L4097.253 3817.1641 L4094.983 3816.7141 L4093.623 3816.7141 L4091.343 3817.1641 L4089.983 3818.0741 L4089.523 3819.4441 L4089.523 3820.3441 M 4092.713 3813.7141L4099.073 3813.7141 M 4094.523 3813.7141L4093.163 3812.3441 L4092.713 3811.4441 L4092.713 3810.0741 L4093.163 3809.1641 L4094.523 3808.7141 L4099.073 3808.7141 M 4094.523 3808.7141L4093.163 3807.3441 L4092.713 3806.4441 L4092.713 3805.0741 L4093.163 3804.1641 L4094.523 3803.7141 L4099.073 3803.7141 M 4092.713 3800.7141L4099.073 3800.7141 M 4094.523 3800.7141L4093.163 3799.3441 L4092.713 3798.4441 L4092.713 3797.0741 L4093.163 3796.1641 L4094.523 3795.7141 L4099.073 3795.7141 M 4094.523 3795.7141L4093.163 3794.3441 L4092.713 3793.4441 L4092.713 3792.0741 L4093.163 3791.1641 L4094.523 3790.7141 L4099.073 3790.7141 M 4039.685 3806.1614 4116.1185 3806.1614 M 4039.685 3839.626 4116.1185 3839.626~gge906~~0~vertical~0.4","DIMENSION~12~M4084.9618,3839.626L4084.9618,3810.8035M4084.9618,3732.6217L4084.9618,3703.7992M4086.4618,3833.626L4084.9618,3839.626L4083.4618,3833.626M4086.4618,3709.7992L4084.9618,3703.7992L4083.4618,3709.7992M 4095.0535 3735.5299L4095.0535 3740.5299 L4091.4135 3737.7999 L4091.4135 3739.1699 L4090.9635 3740.0799 L4090.5035 3740.5299 L4089.1435 3740.9899 L4088.2335 3740.9899 L4086.8735 3740.5299 L4085.9635 3739.6199 L4085.5035 3738.2599 L4085.5035 3736.8899 L4085.9635 3735.5299 L4086.4135 3735.0799 L4087.3235 3734.6199 M 4095.0535 3748.5299L4088.6935 3743.9899 L4088.6935 3750.7999 M 4095.0535 3748.5299L4085.5035 3748.5299 M 4087.7835 3754.2599L4087.3235 3753.7999 L4086.8735 3754.2599 L4087.3235 3754.7099 L4087.7835 3754.2599 M 4095.0535 3763.1699L4095.0535 3758.6199 L4090.9635 3758.1699 L4091.4135 3758.6199 L4091.8735 3759.9899 L4091.8735 3761.3499 L4091.4135 3762.7099 L4090.5035 3763.6199 L4089.1435 3764.0799 L4088.2335 3764.0799 L4086.8735 3763.6199 L4085.9635 3762.7099 L4085.5035 3761.3499 L4085.5035 3759.9899 L4085.9635 3758.6199 L4086.4135 3758.1699 L4087.3235 3757.7099 M 4095.0535 3769.7999L4094.5935 3768.4399 L4093.2335 3767.5299 L4090.9635 3767.0799 L4089.5935 3767.0799 L4087.3235 3767.5299 L4085.9635 3768.4399 L4085.5035 3769.7999 L4085.5035 3770.7099 L4085.9635 3772.0799 L4087.3235 3772.9899 L4089.5935 3773.4399 L4090.9635 3773.4399 L4093.2335 3772.9899 L4094.5935 3772.0799 L4095.0535 3770.7099 L4095.0535 3769.7999 M 4095.0535 3779.1699L4094.5935 3777.7999 L4093.2335 3776.8899 L4090.9635 3776.4399 L4089.5935 3776.4399 L4087.3235 3776.8899 L4085.9635 3777.7999 L4085.5035 3779.1699 L4085.5035 3780.0799 L4085.9635 3781.4399 L4087.3235 3782.3499 L4089.5935 3782.7999 L4090.9635 3782.7999 L4093.2335 3782.3499 L4094.5935 3781.4399 L4095.0535 3780.0799 L4095.0535 3779.1699 M 4091.8735 3785.7999L4085.5035 3785.7999 M 4090.0535 3785.7999L4091.4135 3787.1699 L4091.8735 3788.0799 L4091.8735 3789.4399 L4091.4135 3790.3499 L4090.0535 3790.7999 L4085.5035 3790.7999 M 4090.0535 3790.7999L4091.4135 3792.1699 L4091.8735 3793.0799 L4091.8735 3794.4399 L4091.4135 3795.3499 L4090.0535 3795.7999 L4085.5035 3795.7999 M 4091.8735 3798.7999L4085.5035 3798.7999 M 4090.0535 3798.7999L4091.4135 3800.1699 L4091.8735 3801.0799 L4091.8735 3802.4399 L4091.4135 3803.3499 L4090.0535 3803.7999 L4085.5035 3803.7999 M 4090.0535 3803.7999L4091.4135 3805.1699 L4091.8735 3806.0799 L4091.8735 3807.4399 L4091.4135 3808.3499 L4090.0535 3808.7999 L4085.5035 3808.7999 M 4039.685 3839.626 4094.9618 3839.626 M 4039.685 3703.7992 4094.9618 3703.7992~gge904~~0~vertical~0.4","LIB~4039.685~3636.8701~package`M2X3`~~~gge7fb3288c494a335c~1~1a95e0cd8cf04abab1f0a955e387d9de~1541683872~0~#@$TEXT~N~4039.685~3618.87~0.6~0~0~3~~4.5~LEFT IO~M 4039.685 3614.3301 L 4039.685 3618.6201 M 4039.685 3618.6201 L 4042.135 3618.6201 M 4043.485 3614.3301 L 4043.485 3618.6201 M 4043.485 3614.3301 L 4046.145 3614.3301 M 4043.485 3616.3701 L 4045.125 3616.3701 M 4043.485 3618.6201 L 4046.145 3618.6201 M 4047.495 3614.3301 L 4047.495 3618.6201 M 4047.495 3614.3301 L 4050.155 3614.3301 M 4047.495 3616.3701 L 4049.135 3616.3701 M 4052.935 3614.3301 L 4052.935 3618.6201 M 4051.505 3614.3301 L 4054.375 3614.3301 M 4058.875 3614.3301 L 4058.875 3618.6201 M 4061.445 3614.3301 L 4061.035 3614.5301 L 4060.635 3614.9401 L 4060.425 3615.3501 L 4060.225 3615.9701 L 4060.225 3616.9901 L 4060.425 3617.6001 L 4060.635 3618.0101 L 4061.035 3618.4201 L 4061.445 3618.6201 L 4062.265 3618.6201 L 4062.675 3618.4201 L 4063.085 3618.0101 L 4063.285 3617.6001 L 4063.495 3616.9901 L 4063.495 3615.9701 L 4063.285 3615.3501 L 4063.085 3614.9401 L 4062.675 3614.5301 L 4062.265 3614.3301 L 4061.445 3614.3301~none~gge3~~0~#@$TEXT~P~4036.685~3624.37~0.6~0~0~3~~4.5~J5~M 4038.735 3619.8301 L 4038.735 3623.1001 L 4038.525 3623.7201 L 4038.325 3623.9201 L 4037.915 3624.1201 L 4037.505 3624.1201 L 4037.095 3623.9201 L 4036.885 3623.7201 L 4036.685 3623.1001 L 4036.685 3622.6901 M 4042.535 3619.8301 L 4040.485 3619.8301 L 4040.285 3621.6701 L 4040.485 3621.4701 L 4041.105 3621.2601 L 4041.715 3621.2601 L 4042.335 3621.4701 L 4042.735 3621.8701 L 4042.945 3622.4901 L 4042.945 3622.9001 L 4042.735 3623.5101 L 4042.335 3623.9201 L 4041.715 3624.1201 L 4041.105 3624.1201 L 4040.485 3623.9201 L 4040.285 3623.7201 L 4040.085 3623.3101~~gge5~~0~#@$TRACK~1~3~~4024.685 3626.8701 4024.685 3636.8701~gge7~0#@$TRACK~1~3~~4024.685 3636.8701 4024.685 3646.8701~gge8~0#@$TRACK~1~3~~4024.685 3646.8701 4034.685 3646.8701~gge9~0#@$TRACK~1~3~~4034.685 3646.8701 4054.685 3646.8701~gge10~0#@$TRACK~1~3~~4054.685 3646.8701 4054.685 3626.8701~gge11~0#@$TRACK~1~3~~4054.685 3626.8701 4024.685 3626.8701~gge12~0#@$TRACK~1~3~~4034.685 3636.8701 4024.685 3636.8701~gge13~0#@$TRACK~1~3~~4034.685 3636.8701 4034.685 3646.8701~gge14~0#@$PAD~RECT~4029.685~3641.87~4.72~4.72~11~R1_1~1~1.57~4027.325 3639.5101 4032.045 3639.5101 4032.045 3644.2301 4027.325 3644.2301~0~gge15~0~~Y~0~0~0.4~4029.685,3641.8701#@$PAD~ELLIPSE~4029.685~3631.87~4.72~4.72~11~R1_2~2~1.57~~0~gge20~0~~Y~0~0~0.4~4029.685,3631.8701#@$PAD~ELLIPSE~4039.685~3641.87~4.72~4.72~11~J5_3~3~1.57~~0~gge25~0~~Y~0~0~0.4~4039.685,3641.8701#@$PAD~ELLIPSE~4039.685~3631.87~4.72~4.72~11~J5_4~4~1.57~~0~gge30~0~~Y~0~0~0.4~4039.685,3631.8701#@$PAD~ELLIPSE~4049.685~3641.87~4.72~4.72~11~J5_5~5~1.57~~0~gge35~0~~Y~0~0~0.4~4049.685,3641.8701#@$PAD~ELLIPSE~4049.685~3631.87~4.72~4.72~11~GND~6~1.57~~0~gge40~0~~Y~0~0~0.4~4049.685,3631.8701","LIB~4039.685~3672.3031~package`KEY-SMD_4P-L6.0-W6.0-P4.50-LS9.5`~270~~gge6c4ed95c422dbc6a~1~8fffabc80ac54d08a323684a5a5c8f59~1588143520~0~#@$TEXT~N~4065.475~3707.853~0.6~90~0~3~~4.5~B3S-1000P~M 4060.935 3707.8532 L 4065.225 3707.8532 M 4060.935 3707.8532 L 4060.935 3706.0132 L 4061.135 3705.4032 L 4061.345 3705.1932 L 4061.755 3704.9932 L 4062.165 3704.9932 L 4062.575 3705.1932 L 4062.775 3705.4032 L 4062.975 3706.0132 M 4062.975 3707.8532 L 4062.975 3706.0132 L 4063.185 3705.4032 L 4063.385 3705.1932 L 4063.795 3704.9932 L 4064.415 3704.9932 L 4064.825 3705.1932 L 4065.025 3705.4032 L 4065.225 3706.0132 L 4065.225 3707.8532 M 4060.935 3703.2332 L 4060.935 3700.9832 L 4062.575 3702.2032 L 4062.575 3701.5932 L 4062.775 3701.1832 L 4062.975 3700.9832 L 4063.595 3700.7732 L 4064.005 3700.7732 L 4064.615 3700.9832 L 4065.025 3701.3932 L 4065.225 3702.0032 L 4065.225 3702.6132 L 4065.025 3703.2332 L 4064.825 3703.4332 L 4064.415 3703.6432 M 4061.545 3696.5632 L 4061.135 3696.9732 L 4060.935 3697.5832 L 4060.935 3698.4032 L 4061.135 3699.0132 L 4061.545 3699.4232 L 4061.955 3699.4232 L 4062.365 3699.2232 L 4062.575 3699.0132 L 4062.775 3698.6032 L 4063.185 3697.3832 L 4063.385 3696.9732 L 4063.595 3696.7632 L 4064.005 3696.5632 L 4064.615 3696.5632 L 4065.025 3696.9732 L 4065.225 3697.5832 L 4065.225 3698.4032 L 4065.025 3699.0132 L 4064.615 3699.4232 M 4063.385 3695.2132 L 4063.385 3691.5332 M 4061.755 3690.1832 L 4061.545 3689.7732 L 4060.935 3689.1532 L 4065.225 3689.1532 M 4060.935 3686.5832 L 4061.135 3687.1932 L 4061.755 3687.6032 L 4062.775 3687.8032 L 4063.385 3687.8032 L 4064.415 3687.6032 L 4065.025 3687.1932 L 4065.225 3686.5832 L 4065.225 3686.1732 L 4065.025 3685.5532 L 4064.415 3685.1532 L 4063.385 3684.9432 L 4062.775 3684.9432 L 4061.755 3685.1532 L 4061.135 3685.5532 L 4060.935 3686.1732 L 4060.935 3686.5832 M 4060.935 3682.3632 L 4061.135 3682.9832 L 4061.755 3683.3932 L 4062.775 3683.5932 L 4063.385 3683.5932 L 4064.415 3683.3932 L 4065.025 3682.9832 L 4065.225 3682.3632 L 4065.225 3681.9532 L 4065.025 3681.3432 L 4064.415 3680.9332 L 4063.385 3680.7332 L 4062.775 3680.7332 L 4061.755 3680.9332 L 4061.135 3681.3432 L 4060.935 3681.9532 L 4060.935 3682.3632 M 4060.935 3678.1532 L 4061.135 3678.7632 L 4061.755 3679.1732 L 4062.775 3679.3832 L 4063.385 3679.3832 L 4064.415 3679.1732 L 4065.025 3678.7632 L 4065.225 3678.1532 L 4065.225 3677.7432 L 4065.025 3677.1332 L 4064.415 3676.7232 L 4063.385 3676.5132 L 4062.775 3676.5132 L 4061.755 3676.7232 L 4061.135 3677.1332 L 4060.935 3677.7432 L 4060.935 3678.1532 M 4060.935 3675.1632 L 4065.225 3675.1632 M 4060.935 3675.1632 L 4060.935 3673.3232 L 4061.135 3672.7132 L 4061.345 3672.5032 L 4061.755 3672.3032 L 4062.365 3672.3032 L 4062.775 3672.5032 L 4062.975 3672.7132 L 4063.185 3673.3232 L 4063.185 3675.1632~none~gge47~~0~#@$TEXT~P~4034.5~3702.063~0.6~0~0~3~~4.5~SW1~M 4037.36 3698.133 L 4036.95 3697.723 L 4036.34 3697.523 L 4035.52 3697.523 L 4034.91 3697.723 L 4034.5 3698.133 L 4034.5 3698.543 L 4034.7 3698.953 L 4034.91 3699.163 L 4035.32 3699.363 L 4036.55 3699.773 L 4036.95 3699.973 L 4037.16 3700.183 L 4037.36 3700.593 L 4037.36 3701.203 L 4036.95 3701.613 L 4036.34 3701.813 L 4035.52 3701.813 L 4034.91 3701.613 L 4034.5 3701.203 M 4038.71 3697.523 L 4039.74 3701.813 M 4040.76 3697.523 L 4039.74 3701.813 M 4040.76 3697.523 L 4041.78 3701.813 M 4042.8 3697.523 L 4041.78 3701.813 M 4044.15 3698.343 L 4044.56 3698.133 L 4045.18 3697.523 L 4045.18 3701.813~~gge49~~0~#@$TRACK~1~3~~4051.89 3660.0982 4051.89 3684.5082~gge51~0#@$TRACK~1~3~~4027.475 3684.5132 4051.885 3684.5132~gge52~0#@$TRACK~1~3~~4027.48 3684.5082 4027.48 3660.0982~gge53~0#@$TRACK~1~3~~4051.89 3660.0982 4027.48 3660.0982~gge54~0#@$CIRCLE~4047.685~3664.303~2~1~3~gge55~0~~#@$CIRCLE~4047.685~3680.303~2~1~3~gge56~0~~#@$CIRCLE~4031.685~3664.303~2~1~3~gge57~0~~#@$CIRCLE~4031.685~3680.303~2~1~3~gge58~0~~#@$CIRCLE~4039.685~3672.303~5.5~1~3~gge59~0~~#@$SVGNODE~{\"gId\":\"gge60\",\"nodeName\":\"g\",\"nodeType\":1,\"layerid\":\"19\",\"attrs\":{\"c_width\":\"23.622\",\"c_height\":\"19.586575\",\"c_rotation\":\"180,90,0\",\"z\":\"9.8425\",\"c_origin\":\"4039.6851,3690.0198\",\"uuid\":\"cbe2081c289047bab9d9cfb65d1e9db1\",\"c_etype\":\"outline3D\",\"title\":\"SMD_4P-L6.0-W6.0-H5.0-LS10.0-P4.5\",\"layerid\":\"19\",\"transform\":\"scale(1) translate(0, 0)\",\"id\":\"gge60\",\"style\":\"\"},\"childNodes\":[{\"gId\":\"gge61\",\"nodeName\":\"polyline\",\"nodeType\":1,\"attrs\":{\"fill\":\"none\",\"c_shapetype\":\"line\",\"points\":\"4027.874 3686.1418 4027.874 3688.1103 4027.874 3697.9528 4027.874 3699.5276 4029.4488 3699.5276 4029.4488 3699.6851 4029.4488 3699.7638 4029.4488 3699.8032 4032.2047 3699.8032 4032.2047 3699.7638 4032.2047 3699.6851 4032.2047 3699.5276 4033.7795 3699.5276 4035.748 3699.5276 4035.748 3697.9528 4037.7165 3697.9528 4037.7165 3699.5276 4041.6535 3699.5276 4041.6535 3697.9528 4043.622 3697.9528 4043.622 3699.5276 4045.5905 3699.5276 4047.1653 3699.5276 4047.1653 3699.6851 4047.1653 3699.7638 4047.1653 3699.8032 4049.9212 3699.8032 4049.9212 3699.7638 4049.9212 3699.6851 4049.9212 3699.5276 4051.496 3699.5276 4051.496 3697.9528 4051.496 3693.0316 4051.496 3688.1103 4051.496 3687.1261 4051.4566 3686.1418 4051.3779 3686.1418 4051.2204 3686.1418 4051.0236 3686.1418 4050.748 3686.1418 4050.5118 3686.1418 4050.4724 3685.7087 4050.3149 3685.2757 4050.0787 3684.9213 4049.7637 3684.6064 4049.4094 3684.3702 4048.9763 3684.2127 4048.5433 3684.1733 4048.1102 3684.2127 4047.6771 3684.3702 4047.3228 3684.6064 4047.0078 3684.9213 4046.7716 3685.2757 4046.7716 3685.315 4046.6535 3681.1812 4046.6141 3680.945 4046.496 3680.7088 4046.3385 3680.5119 4046.1417 3680.3544 4045.9055 3680.2757 4045.7086 3680.2363 4045.748 3680.2363 4045.748 3680.2757 4045.6299 3680.2363 4045.7086 3680.2363 4045.9055 3680.2757 4045.6692 3680.2363 4045.7086 3680.2363 4027.874 3686.1418 4027.874 3686.1418\",\"id\":\"gge61\"}}]}#@$PAD~RECT~4048.545~3654.39~7.4803~5.1181~1~J5_3~1~0~4051.104 3650.6502 4051.104 3658.1302 4045.986 3658.1302 4045.986 3650.6502~270~gge62~0~~Y~0~0~0.4~4048.545,3654.3901#@$PAD~RECT~4048.545~3690.217~7.4803~5.1181~1~J5_3~2~0~4051.104 3686.4762 4051.104 3693.9572 4045.986 3693.9572 4045.986 3686.4762~270~gge67~0~~Y~0~0~0.4~4048.545,3690.2161#@$PAD~RECT~4030.825~3654.39~7.4803~5.1181~1~GND~3~0~4033.384 3650.6502 4033.384 3658.1302 4028.266 3658.1302 4028.266 3650.6502~270~gge72~0~~Y~0~0~0.4~4030.825,3654.3901#@$PAD~RECT~4030.825~3690.217~7.4803~5.1181~1~GND~4~0~4033.384 3686.4762 4033.384 3693.9572 4028.266 3693.9572 4028.266 3686.4762~270~gge77~0~~Y~0~0~0.4~4030.825,3690.2161","LIB~4039.685~3739.2323~package`KEY-SMD_4P-L6.0-W6.0-P4.50-LS9.5`~270~~gge4f906009ed98b9cc~1~8fffabc80ac54d08a323684a5a5c8f59~1588143520~0~#@$TEXT~N~4065.475~3774.782~0.6~90~0~3~~4.5~B3S-1000P~M 4060.935 3774.7823 L 4065.225 3774.7823 M 4060.935 3774.7823 L 4060.935 3772.9423 L 4061.135 3772.3323 L 4061.345 3772.1223 L 4061.755 3771.9223 L 4062.165 3771.9223 L 4062.575 3772.1223 L 4062.775 3772.3323 L 4062.975 3772.9423 M 4062.975 3774.7823 L 4062.975 3772.9423 L 4063.185 3772.3323 L 4063.385 3772.1223 L 4063.795 3771.9223 L 4064.415 3771.9223 L 4064.825 3772.1223 L 4065.025 3772.3323 L 4065.225 3772.9423 L 4065.225 3774.7823 M 4060.935 3770.1623 L 4060.935 3767.9123 L 4062.575 3769.1323 L 4062.575 3768.5223 L 4062.775 3768.1123 L 4062.975 3767.9123 L 4063.595 3767.7023 L 4064.005 3767.7023 L 4064.615 3767.9123 L 4065.025 3768.3223 L 4065.225 3768.9323 L 4065.225 3769.5423 L 4065.025 3770.1623 L 4064.825 3770.3623 L 4064.415 3770.5723 M 4061.545 3763.4923 L 4061.135 3763.9023 L 4060.935 3764.5123 L 4060.935 3765.3323 L 4061.135 3765.9423 L 4061.545 3766.3523 L 4061.955 3766.3523 L 4062.365 3766.1523 L 4062.575 3765.9423 L 4062.775 3765.5323 L 4063.185 3764.3123 L 4063.385 3763.9023 L 4063.595 3763.6923 L 4064.005 3763.4923 L 4064.615 3763.4923 L 4065.025 3763.9023 L 4065.225 3764.5123 L 4065.225 3765.3323 L 4065.025 3765.9423 L 4064.615 3766.3523 M 4063.385 3762.1423 L 4063.385 3758.4623 M 4061.755 3757.1123 L 4061.545 3756.7023 L 4060.935 3756.0823 L 4065.225 3756.0823 M 4060.935 3753.5123 L 4061.135 3754.1223 L 4061.755 3754.5323 L 4062.775 3754.7323 L 4063.385 3754.7323 L 4064.415 3754.5323 L 4065.025 3754.1223 L 4065.225 3753.5123 L 4065.225 3753.1023 L 4065.025 3752.4823 L 4064.415 3752.0823 L 4063.385 3751.8723 L 4062.775 3751.8723 L 4061.755 3752.0823 L 4061.135 3752.4823 L 4060.935 3753.1023 L 4060.935 3753.5123 M 4060.935 3749.2923 L 4061.135 3749.9123 L 4061.755 3750.3223 L 4062.775 3750.5223 L 4063.385 3750.5223 L 4064.415 3750.3223 L 4065.025 3749.9123 L 4065.225 3749.2923 L 4065.225 3748.8823 L 4065.025 3748.2723 L 4064.415 3747.8623 L 4063.385 3747.6623 L 4062.775 3747.6623 L 4061.755 3747.8623 L 4061.135 3748.2723 L 4060.935 3748.8823 L 4060.935 3749.2923 M 4060.935 3745.0823 L 4061.135 3745.6923 L 4061.755 3746.1023 L 4062.775 3746.3123 L 4063.385 3746.3123 L 4064.415 3746.1023 L 4065.025 3745.6923 L 4065.225 3745.0823 L 4065.225 3744.6723 L 4065.025 3744.0623 L 4064.415 3743.6523 L 4063.385 3743.4423 L 4062.775 3743.4423 L 4061.755 3743.6523 L 4061.135 3744.0623 L 4060.935 3744.6723 L 4060.935 3745.0823 M 4060.935 3742.0923 L 4065.225 3742.0923 M 4060.935 3742.0923 L 4060.935 3740.2523 L 4061.135 3739.6423 L 4061.345 3739.4323 L 4061.755 3739.2323 L 4062.365 3739.2323 L 4062.775 3739.4323 L 4062.975 3739.6423 L 4063.185 3740.2523 L 4063.185 3742.0923~none~gge84~~0~#@$TEXT~P~4035~3769.626~0.6~0~0~3~~4.5~SW2~M 4037.86 3765.696 L 4037.45 3765.286 L 4036.84 3765.086 L 4036.02 3765.086 L 4035.41 3765.286 L 4035 3765.696 L 4035 3766.106 L 4035.2 3766.516 L 4035.41 3766.726 L 4035.82 3766.926 L 4037.05 3767.336 L 4037.45 3767.536 L 4037.66 3767.746 L 4037.86 3768.156 L 4037.86 3768.766 L 4037.45 3769.176 L 4036.84 3769.376 L 4036.02 3769.376 L 4035.41 3769.176 L 4035 3768.766 M 4039.21 3765.086 L 4040.24 3769.376 M 4041.26 3765.086 L 4040.24 3769.376 M 4041.26 3765.086 L 4042.28 3769.376 M 4043.3 3765.086 L 4042.28 3769.376 M 4044.86 3766.106 L 4044.86 3765.906 L 4045.06 3765.496 L 4045.27 3765.286 L 4045.68 3765.086 L 4046.5 3765.086 L 4046.9 3765.286 L 4047.11 3765.496 L 4047.31 3765.906 L 4047.31 3766.316 L 4047.11 3766.726 L 4046.7 3767.336 L 4044.65 3769.376 L 4047.52 3769.376~~gge86~~0~#@$TRACK~1~3~~4051.89 3727.0273 4051.89 3751.4373~gge88~0#@$TRACK~1~3~~4027.475 3751.4423 4051.885 3751.4423~gge89~0#@$TRACK~1~3~~4027.48 3751.4373 4027.48 3727.0273~gge90~0#@$TRACK~1~3~~4051.89 3727.0273 4027.48 3727.0273~gge91~0#@$CIRCLE~4047.685~3731.232~2~1~3~gge92~0~~#@$CIRCLE~4047.685~3747.232~2~1~3~gge93~0~~#@$CIRCLE~4031.685~3731.232~2~1~3~gge94~0~~#@$CIRCLE~4031.685~3747.232~2~1~3~gge95~0~~#@$CIRCLE~4039.685~3739.232~5.5~1~3~gge96~0~~#@$SVGNODE~{\"gId\":\"gge97\",\"nodeName\":\"g\",\"nodeType\":1,\"layerid\":\"19\",\"attrs\":{\"c_width\":\"23.622\",\"c_height\":\"19.586575\",\"c_rotation\":\"180,90,0\",\"z\":\"9.8425\",\"c_origin\":\"4039.6851,3756.9489\",\"uuid\":\"cbe2081c289047bab9d9cfb65d1e9db1\",\"c_etype\":\"outline3D\",\"title\":\"SMD_4P-L6.0-W6.0-H5.0-LS10.0-P4.5\",\"layerid\":\"19\",\"transform\":\"scale(1) translate(0, 0)\",\"id\":\"gge97\",\"style\":\"\"},\"childNodes\":[{\"gId\":\"gge98\",\"nodeName\":\"polyline\",\"nodeType\":1,\"attrs\":{\"fill\":\"none\",\"c_shapetype\":\"line\",\"points\":\"4027.874 3753.0709 4027.874 3755.0394 4027.874 3764.8819 4027.874 3766.4567 4029.4488 3766.4567 4029.4488 3766.6142 4029.4488 3766.6929 4029.4488 3766.7323 4032.2047 3766.7323 4032.2047 3766.6929 4032.2047 3766.6142 4032.2047 3766.4567 4033.7795 3766.4567 4035.748 3766.4567 4035.748 3764.8819 4037.7165 3764.8819 4037.7165 3766.4567 4041.6535 3766.4567 4041.6535 3764.8819 4043.622 3764.8819 4043.622 3766.4567 4045.5905 3766.4567 4047.1653 3766.4567 4047.1653 3766.6142 4047.1653 3766.6929 4047.1653 3766.7323 4049.9212 3766.7323 4049.9212 3766.6929 4049.9212 3766.6142 4049.9212 3766.4567 4051.496 3766.4567 4051.496 3764.8819 4051.496 3759.9607 4051.496 3755.0394 4051.496 3754.0552 4051.4566 3753.0709 4051.3779 3753.0709 4051.2204 3753.0709 4051.0236 3753.0709 4050.748 3753.0709 4050.5118 3753.0709 4050.4724 3752.6378 4050.3149 3752.2048 4050.0787 3751.8504 4049.7637 3751.5355 4049.4094 3751.2993 4048.9763 3751.1418 4048.5433 3751.1024 4048.1102 3751.1418 4047.6771 3751.2993 4047.3228 3751.5355 4047.0078 3751.8504 4046.7716 3752.2048 4046.7716 3752.2441 4046.6535 3748.1103 4046.6141 3747.8741 4046.496 3747.6379 4046.3385 3747.441 4046.1417 3747.2835 4045.9055 3747.2048 4045.7086 3747.1654 4045.748 3747.1654 4045.748 3747.2048 4045.6299 3747.1654 4045.7086 3747.1654 4045.9055 3747.2048 4045.6692 3747.1654 4045.7086 3747.1654 4027.874 3753.0709 4027.874 3753.0709\",\"id\":\"gge98\"}}]}#@$PAD~RECT~4048.545~3721.319~7.4803~5.1181~1~J5_4~1~0~4051.104 3717.5793 4051.104 3725.0593 4045.986 3725.0593 4045.986 3717.5793~270~gge99~0~~Y~0~0~0.4~4048.545,3721.3193#@$PAD~RECT~4048.545~3757.146~7.4803~5.1181~1~J5_4~2~0~4051.104 3753.4053 4051.104 3760.8863 4045.986 3760.8863 4045.986 3753.4053~270~gge104~0~~Y~0~0~0.4~4048.545,3757.1453#@$PAD~RECT~4030.825~3721.319~7.4803~5.1181~1~GND~3~0~4033.384 3717.5793 4033.384 3725.0593 4028.266 3725.0593 4028.266 3717.5793~270~gge109~0~~Y~0~0~0.4~4030.825,3721.3193#@$PAD~RECT~4030.825~3757.146~7.4803~5.1181~1~GND~4~0~4033.384 3753.4053 4033.384 3760.8863 4028.266 3760.8863 4028.266 3753.4053~270~gge114~0~~Y~0~0~0.4~4030.825,3757.1453","LIB~4039.685~3806.1614~package`KEY-SMD_4P-L6.0-W6.0-P4.50-LS9.5`~270~~ggea368c6bb20789447~1~8fffabc80ac54d08a323684a5a5c8f59~1588143520~0~#@$TEXT~N~4065.475~3841.711~0.6~90~0~3~~4.5~B3S-1000P~M 4060.935 3841.7114 L 4065.225 3841.7114 M 4060.935 3841.7114 L 4060.935 3839.8714 L 4061.135 3839.2614 L 4061.345 3839.0514 L 4061.755 3838.8514 L 4062.165 3838.8514 L 4062.575 3839.0514 L 4062.775 3839.2614 L 4062.975 3839.8714 M 4062.975 3841.7114 L 4062.975 3839.8714 L 4063.185 3839.2614 L 4063.385 3839.0514 L 4063.795 3838.8514 L 4064.415 3838.8514 L 4064.825 3839.0514 L 4065.025 3839.2614 L 4065.225 3839.8714 L 4065.225 3841.7114 M 4060.935 3837.0914 L 4060.935 3834.8414 L 4062.575 3836.0614 L 4062.575 3835.4514 L 4062.775 3835.0414 L 4062.975 3834.8414 L 4063.595 3834.6314 L 4064.005 3834.6314 L 4064.615 3834.8414 L 4065.025 3835.2514 L 4065.225 3835.8614 L 4065.225 3836.4714 L 4065.025 3837.0914 L 4064.825 3837.2914 L 4064.415 3837.5014 M 4061.545 3830.4214 L 4061.135 3830.8314 L 4060.935 3831.4414 L 4060.935 3832.2614 L 4061.135 3832.8714 L 4061.545 3833.2814 L 4061.955 3833.2814 L 4062.365 3833.0814 L 4062.575 3832.8714 L 4062.775 3832.4614 L 4063.185 3831.2414 L 4063.385 3830.8314 L 4063.595 3830.6214 L 4064.005 3830.4214 L 4064.615 3830.4214 L 4065.025 3830.8314 L 4065.225 3831.4414 L 4065.225 3832.2614 L 4065.025 3832.8714 L 4064.615 3833.2814 M 4063.385 3829.0714 L 4063.385 3825.3914 M 4061.755 3824.0414 L 4061.545 3823.6314 L 4060.935 3823.0114 L 4065.225 3823.0114 M 4060.935 3820.4414 L 4061.135 3821.0514 L 4061.755 3821.4614 L 4062.775 3821.6614 L 4063.385 3821.6614 L 4064.415 3821.4614 L 4065.025 3821.0514 L 4065.225 3820.4414 L 4065.225 3820.0314 L 4065.025 3819.4114 L 4064.415 3819.0114 L 4063.385 3818.8014 L 4062.775 3818.8014 L 4061.755 3819.0114 L 4061.135 3819.4114 L 4060.935 3820.0314 L 4060.935 3820.4414 M 4060.935 3816.2214 L 4061.135 3816.8414 L 4061.755 3817.2514 L 4062.775 3817.4514 L 4063.385 3817.4514 L 4064.415 3817.2514 L 4065.025 3816.8414 L 4065.225 3816.2214 L 4065.225 3815.8114 L 4065.025 3815.2014 L 4064.415 3814.7914 L 4063.385 3814.5914 L 4062.775 3814.5914 L 4061.755 3814.7914 L 4061.135 3815.2014 L 4060.935 3815.8114 L 4060.935 3816.2214 M 4060.935 3812.0114 L 4061.135 3812.6214 L 4061.755 3813.0314 L 4062.775 3813.2414 L 4063.385 3813.2414 L 4064.415 3813.0314 L 4065.025 3812.6214 L 4065.225 3812.0114 L 4065.225 3811.6014 L 4065.025 3810.9914 L 4064.415 3810.5814 L 4063.385 3810.3714 L 4062.775 3810.3714 L 4061.755 3810.5814 L 4061.135 3810.9914 L 4060.935 3811.6014 L 4060.935 3812.0114 M 4060.935 3809.0214 L 4065.225 3809.0214 M 4060.935 3809.0214 L 4060.935 3807.1814 L 4061.135 3806.5714 L 4061.345 3806.3614 L 4061.755 3806.1614 L 4062.365 3806.1614 L 4062.775 3806.3614 L 4062.975 3806.5714 L 4063.185 3807.1814 L 4063.185 3809.0214~none~gge121~~0~#@$TEXT~P~4034.5~3834.689~0.6~0~0~3~~4.5~SW3~M 4037.36 3830.759 L 4036.95 3830.349 L 4036.34 3830.149 L 4035.52 3830.149 L 4034.91 3830.349 L 4034.5 3830.759 L 4034.5 3831.169 L 4034.7 3831.579 L 4034.91 3831.789 L 4035.32 3831.989 L 4036.55 3832.399 L 4036.95 3832.599 L 4037.16 3832.809 L 4037.36 3833.219 L 4037.36 3833.829 L 4036.95 3834.239 L 4036.34 3834.439 L 4035.52 3834.439 L 4034.91 3834.239 L 4034.5 3833.829 M 4038.71 3830.149 L 4039.74 3834.439 M 4040.76 3830.149 L 4039.74 3834.439 M 4040.76 3830.149 L 4041.78 3834.439 M 4042.8 3830.149 L 4041.78 3834.439 M 4044.56 3830.149 L 4046.81 3830.149 L 4045.59 3831.789 L 4046.2 3831.789 L 4046.61 3831.989 L 4046.81 3832.189 L 4047.02 3832.809 L 4047.02 3833.219 L 4046.81 3833.829 L 4046.4 3834.239 L 4045.79 3834.439 L 4045.18 3834.439 L 4044.56 3834.239 L 4044.36 3834.039 L 4044.15 3833.629~~gge123~~0~#@$TRACK~1~3~~4051.89 3793.9564 4051.89 3818.3664~gge125~0#@$TRACK~1~3~~4027.475 3818.3714 4051.885 3818.3714~gge126~0#@$TRACK~1~3~~4027.48 3818.3664 4027.48 3793.9564~gge127~0#@$TRACK~1~3~~4051.89 3793.9564 4027.48 3793.9564~gge128~0#@$CIRCLE~4047.685~3798.161~2~1~3~gge129~0~~#@$CIRCLE~4047.685~3814.161~2~1~3~gge130~0~~#@$CIRCLE~4031.685~3798.161~2~1~3~gge131~0~~#@$CIRCLE~4031.685~3814.161~2~1~3~gge132~0~~#@$CIRCLE~4039.685~3806.161~5.5~1~3~gge133~0~~#@$SVGNODE~{\"gId\":\"gge134\",\"nodeName\":\"g\",\"nodeType\":1,\"layerid\":\"19\",\"attrs\":{\"c_width\":\"23.622\",\"c_height\":\"19.586575\",\"c_rotation\":\"180,90,0\",\"z\":\"9.8425\",\"c_origin\":\"4039.6851,3823.8779\",\"uuid\":\"cbe2081c289047bab9d9cfb65d1e9db1\",\"c_etype\":\"outline3D\",\"title\":\"SMD_4P-L6.0-W6.0-H5.0-LS10.0-P4.5\",\"layerid\":\"19\",\"transform\":\"scale(1) translate(0, 0)\",\"id\":\"gge134\",\"style\":\"\"},\"childNodes\":[{\"gId\":\"gge135\",\"nodeName\":\"polyline\",\"nodeType\":1,\"attrs\":{\"fill\":\"none\",\"c_shapetype\":\"line\",\"points\":\"4027.874 3820 4027.874 3821.9685 4027.874 3831.811 4027.874 3833.3858 4029.4488 3833.3858 4029.4488 3833.5433 4029.4488 3833.622 4029.4488 3833.6614 4032.2047 3833.6614 4032.2047 3833.622 4032.2047 3833.5433 4032.2047 3833.3858 4033.7795 3833.3858 4035.748 3833.3858 4035.748 3831.811 4037.7165 3831.811 4037.7165 3833.3858 4041.6535 3833.3858 4041.6535 3831.811 4043.622 3831.811 4043.622 3833.3858 4045.5905 3833.3858 4047.1653 3833.3858 4047.1653 3833.5433 4047.1653 3833.622 4047.1653 3833.6614 4049.9212 3833.6614 4049.9212 3833.622 4049.9212 3833.5433 4049.9212 3833.3858 4051.496 3833.3858 4051.496 3831.811 4051.496 3826.8898 4051.496 3821.9685 4051.496 3820.9843 4051.4566 3820 4051.3779 3820 4051.2204 3820 4051.0236 3820 4050.748 3820 4050.5118 3820 4050.4724 3819.5669 4050.3149 3819.1339 4050.0787 3818.7795 4049.7637 3818.4646 4049.4094 3818.2284 4048.9763 3818.0709 4048.5433 3818.0315 4048.1102 3818.0709 4047.6771 3818.2284 4047.3228 3818.4646 4047.0078 3818.7795 4046.7716 3819.1339 4046.7716 3819.1732 4046.6535 3815.0394 4046.6141 3814.8032 4046.496 3814.567 4046.3385 3814.3701 4046.1417 3814.2126 4045.9055 3814.1339 4045.7086 3814.0945 4045.748 3814.0945 4045.748 3814.1339 4045.6299 3814.0945 4045.7086 3814.0945 4045.9055 3814.1339 4045.6692 3814.0945 4045.7086 3814.0945 4027.874 3820 4027.874 3820\",\"id\":\"gge135\"}}]}#@$PAD~RECT~4048.545~3788.248~7.4803~5.1181~1~J5_5~1~0~4051.104 3784.5084 4051.104 3791.9884 4045.986 3791.9884 4045.986 3784.5084~270~gge136~0~~Y~0~0~0.4~4048.545,3788.2484#@$PAD~RECT~4048.545~3824.075~7.4803~5.1181~1~J5_5~2~0~4051.104 3820.3344 4051.104 3827.8154 4045.986 3827.8154 4045.986 3820.3344~270~gge141~0~~Y~0~0~0.4~4048.545,3824.0744#@$PAD~RECT~4030.825~3788.248~7.4803~5.1181~1~GND~3~0~4033.384 3784.5084 4033.384 3791.9884 4028.266 3791.9884 4028.266 3784.5084~270~gge146~0~~Y~0~0~0.4~4030.825,3788.2484#@$PAD~RECT~4030.825~3824.075~7.4803~5.1181~1~GND~4~0~4033.384 3820.3344 4033.384 3827.8154 4028.266 3827.8154 4028.266 3820.3344~270~gge151~0~~Y~0~0~0.4~4030.825,3824.0744","LIB~4047.5591~3609.311~package`PDV-P9XXX`~~~gge444f54ff515ff9e8~1~99959802cb0742ccac25d0c38171a0c6~1541684083~0~#@$TEXT~N~4047.556~3592.313~0.6~0~0~3~~4.5~Photoresistor~M 4047.5561 3587.773 L 4047.5561 3592.063 M 4047.5561 3587.773 L 4049.3961 3587.773 L 4050.0061 3587.973 L 4050.2161 3588.183 L 4050.4161 3588.593 L 4050.4161 3589.203 L 4050.2161 3589.613 L 4050.0061 3589.813 L 4049.3961 3590.023 L 4047.5561 3590.023 M 4051.7661 3587.773 L 4051.7661 3592.063 M 4051.7661 3590.023 L 4052.3861 3589.413 L 4052.7961 3589.203 L 4053.4061 3589.203 L 4053.8161 3589.413 L 4054.0161 3590.023 L 4054.0161 3592.063 M 4056.3961 3589.203 L 4055.9861 3589.413 L 4055.5761 3589.813 L 4055.3661 3590.433 L 4055.3661 3590.843 L 4055.5761 3591.453 L 4055.9861 3591.863 L 4056.3961 3592.063 L 4057.0061 3592.063 L 4057.4161 3591.863 L 4057.8261 3591.453 L 4058.0261 3590.843 L 4058.0261 3590.433 L 4057.8261 3589.813 L 4057.4161 3589.413 L 4057.0061 3589.203 L 4056.3961 3589.203 M 4059.9961 3587.773 L 4059.9961 3591.253 L 4060.1961 3591.863 L 4060.6061 3592.063 L 4061.0161 3592.063 M 4059.3761 3589.203 L 4060.8061 3589.203 M 4063.3861 3589.203 L 4062.9761 3589.413 L 4062.5661 3589.813 L 4062.3661 3590.433 L 4062.3661 3590.843 L 4062.5661 3591.453 L 4062.9761 3591.863 L 4063.3861 3592.063 L 4064.0061 3592.063 L 4064.4061 3591.863 L 4064.8161 3591.453 L 4065.0261 3590.843 L 4065.0261 3590.433 L 4064.8161 3589.813 L 4064.4061 3589.413 L 4064.0061 3589.203 L 4063.3861 3589.203 M 4066.3761 3589.203 L 4066.3761 3592.063 M 4066.3761 3590.433 L 4066.5761 3589.813 L 4066.9861 3589.413 L 4067.3961 3589.203 L 4068.0061 3589.203 M 4069.3561 3590.433 L 4071.8161 3590.433 L 4071.8161 3590.023 L 4071.6061 3589.613 L 4071.4061 3589.413 L 4070.9961 3589.203 L 4070.3861 3589.203 L 4069.9761 3589.413 L 4069.5661 3589.813 L 4069.3561 3590.433 L 4069.3561 3590.843 L 4069.5661 3591.453 L 4069.9761 3591.863 L 4070.3861 3592.063 L 4070.9961 3592.063 L 4071.4061 3591.863 L 4071.8161 3591.453 M 4075.4161 3589.813 L 4075.2061 3589.413 L 4074.5961 3589.203 L 4073.9861 3589.203 L 4073.3661 3589.413 L 4073.1661 3589.813 L 4073.3661 3590.223 L 4073.7761 3590.433 L 4074.8061 3590.633 L 4075.2061 3590.843 L 4075.4161 3591.253 L 4075.4161 3591.453 L 4075.2061 3591.863 L 4074.5961 3592.063 L 4073.9861 3592.063 L 4073.3661 3591.863 L 4073.1661 3591.453 M 4076.7661 3587.773 L 4076.9661 3587.973 L 4077.1761 3587.773 L 4076.9661 3587.563 L 4076.7661 3587.773 M 4076.9661 3589.203 L 4076.9661 3592.063 M 4080.7761 3589.813 L 4080.5661 3589.413 L 4079.9561 3589.203 L 4079.3461 3589.203 L 4078.7261 3589.413 L 4078.5261 3589.813 L 4078.7261 3590.223 L 4079.1361 3590.433 L 4080.1561 3590.633 L 4080.5661 3590.843 L 4080.7761 3591.253 L 4080.7761 3591.453 L 4080.5661 3591.863 L 4079.9561 3592.063 L 4079.3461 3592.063 L 4078.7261 3591.863 L 4078.5261 3591.453 M 4082.7361 3587.773 L 4082.7361 3591.253 L 4082.9461 3591.863 L 4083.3561 3592.063 L 4083.7561 3592.063 M 4082.1261 3589.203 L 4083.5561 3589.203 M 4086.1361 3589.203 L 4085.7261 3589.413 L 4085.3161 3589.813 L 4085.1061 3590.433 L 4085.1061 3590.843 L 4085.3161 3591.453 L 4085.7261 3591.863 L 4086.1361 3592.063 L 4086.7461 3592.063 L 4087.1561 3591.863 L 4087.5661 3591.453 L 4087.7661 3590.843 L 4087.7661 3590.433 L 4087.5661 3589.813 L 4087.1561 3589.413 L 4086.7461 3589.203 L 4086.1361 3589.203 M 4089.1161 3589.203 L 4089.1161 3592.063 M 4089.1161 3590.433 L 4089.3261 3589.813 L 4089.7361 3589.413 L 4090.1461 3589.203 L 4090.7561 3589.203~none~gge158~~0~#@$TEXT~P~4057.874~3605.811~0.6~0~0~3~~4.5~R1~M 4057.8741 3601.271 L 4057.8741 3605.561 M 4057.8741 3601.271 L 4059.7141 3601.271 L 4060.3241 3601.471 L 4060.5341 3601.681 L 4060.7341 3602.091 L 4060.7341 3602.501 L 4060.5341 3602.911 L 4060.3241 3603.111 L 4059.7141 3603.311 L 4057.8741 3603.311 M 4059.3041 3603.311 L 4060.7341 3605.561 M 4062.0841 3602.091 L 4062.4941 3601.881 L 4063.1141 3601.271 L 4063.1141 3605.561~~gge160~~0~#@$CIRCLE~4047.556~3609.313~8.5~1~3~gge162~0~~#@$PAD~RECT~4052.559~3609.31~4.07~4.07~11~R1_2~2~1.25~4050.5211 3607.278 4054.5961 3607.278 4054.5961 3611.343 4050.5211 3611.343~0~gge163~0~~Y~0~0~0.4~4052.5591,3609.311#@$PAD~RECT~4042.559~3609.31~4.07~4.07~11~R1_1~1~1.25~4040.5211 3607.278 4044.5961 3607.278 4044.5961 3611.343 4040.5211 3611.343~0~gge168~0~~Y~0~0~0.4~4042.5591,3609.311","HOLE~4039.685~3703.799~4~gge796~0","HOLE~4039.685~3839.626~4~gge432~0","HOLE~4029.843~3607.343~4~gge428~0"],"layers":["1~TopLayer~#FF0000~true~true~true~","2~BottomLayer~#0000FF~true~false~true~","3~TopSilkLayer~#FFCC00~true~false~true~","4~BottomSilkLayer~#66CC33~true~false~true~","5~TopPasteMaskLayer~#808080~true~false~true~","6~BottomPasteMaskLayer~#800000~true~false~true~","7~TopSolderMaskLayer~#800080~true~false~true~0.3","8~BottomSolderMaskLayer~#AA00FF~true~false~true~0.3","9~Ratlines~#6464FF~true~false~true~","10~BoardOutLine~#FF00FF~true~false~true~","11~Multi-Layer~#C0C0C0~true~false~true~","12~Document~#FFFFFF~true~false~true~","13~TopAssembly~#33CC99~false~false~false~","14~BottomAssembly~#5555FF~false~false~false~","15~Mechanical~#F022F0~false~false~false~","19~3DModel~#66CCFF~false~false~false~","21~Inner1~#999966~false~false~false~~","22~Inner2~#008000~false~false~false~~","23~Inner3~#00FF00~false~false~false~~","24~Inner4~#BC8E00~false~false~false~~","25~Inner5~#70DBFA~false~false~false~~","26~Inner6~#00CC66~false~false~false~~","27~Inner7~#9966FF~false~false~false~~","28~Inner8~#800080~false~false~false~~","29~Inner9~#008080~false~false~false~~","30~Inner10~#15935F~false~false~false~~","31~Inner11~#000080~false~false~false~~","32~Inner12~#00B400~false~false~false~~","33~Inner13~#2E4756~false~false~false~~","34~Inner14~#99842F~false~false~false~~","35~Inner15~#FFFFAA~false~false~false~~","36~Inner16~#99842F~false~false~false~~","37~Inner17~#2E4756~false~false~false~~","38~Inner18~#3535FF~false~false~false~~","39~Inner19~#8000BC~false~false~false~~","40~Inner20~#43AE5F~false~false~false~~","41~Inner21~#C3ECCE~false~false~false~~","42~Inner22~#728978~false~false~false~~","43~Inner23~#39503F~false~false~false~~","44~Inner24~#0C715D~false~false~false~~","45~Inner25~#5A8A80~false~false~false~~","46~Inner26~#2B937E~false~false~false~~","47~Inner27~#23999D~false~false~false~~","48~Inner28~#45B4E3~false~false~false~~","49~Inner29~#215DA1~false~false~false~~","50~Inner30~#4564D7~false~false~false~~","51~Inner31~#6969E9~false~false~false~~","52~Inner32~#9069E9~false~false~false~~","99~ComponentShapeLayer~#00CCCC~false~false~false~","100~LeadShapeLayer~#CC9999~false~false~false~","Hole~Hole~#222222~false~false~true~","DRCError~DRCError~#FAD609~false~false~true~"],"objects":["All~true~false","Component~true~true","Prefix~true~true","Name~true~false","Track~true~true","Pad~true~true","Via~true~true","Hole~true~true","Copper_Area~true~true","Circle~true~true","Arc~true~true","Solid_Region~true~true","Text~true~true","Image~true~true","Rect~true~true","Dimension~true~true","Protractor~true~true"],"BBox":{"x":4008.5,"y":3591.5,"width":107.6,"height":263.6},"preference":{"hideFootprints":"","hideNets":""},"DRCRULE":{"Default":{"trackWidth":1.5748,"clearance":1.5748,"viaHoleDiameter":2.4016,"viaHoleD":1.2008},"isRealtime":true,"isDrcOnRoutingOrPlaceVia":false,"checkObjectToCopperarea":true,"showDRCRangeLine":true},"routerRule":{"unit":"mm","trackWidth":0.4,"trackClearance":0.4,"viaHoleD":0.31,"viaDiameter":0.61,"routerLayers":[1],"smdClearance":0.4,"specialNets":[],"nets":["GND","J5_3","J5_4","J5_5","R1_1","R1_2"],"padsCount":20,"skipNets":[],"realtime":true},"panelize":{"type":"noPanelize","row":1,"column":1,"rowSpacing":0,"columnSpacing":0,"createBorder":false,"stampPerRow":1,"stampPerColumn":1},"netColors":{}} \ No newline at end of file diff --git a/pcb/AirsoftTrackerLeftIO/info b/pcb/AirsoftTrackerLeftIO/info new file mode 100644 index 0000000..a0d8914 --- /dev/null +++ b/pcb/AirsoftTrackerLeftIO/info @@ -0,0 +1,104 @@ +{ + "uuid": "1aae177d255e90e509cd34fa611a826f", + "path": "Offline/AirsoftTrackerLeftIO", + "name": "AirsoftTrackerLeftIO", + "content": "", + "created_at": "2021-01-20 21:39:33", + "updated_at": "2021-02-04 17:12:37", + "stick": "", + "documents": [ + { + "uuid": "cad456857d695d9c6f9d99b21b0b449b", + "title": "Left IO", + "description": "", + "docType": "1", + "master": "", + "thumb": "/images/thumb-default.png", + "components": { + "181a4b4c83b34b8491bb9b2cdc106792": 1, + "4cf556fe97124ad8934102a1b113e234": 1, + "96da1098782146b3badbde5a666b3323": 3 + }, + "BOM": [ + [ + "Value", + "Quantity", + "Package", + "Components", + "CustomPara" + ], + [ + "LEFT IO", + 1, + "M2X3", + "J5", + { + "BOM_Manufacturer Part": "", + "puuid": "1a95e0cd8cf04abab1f0a955e387d9de", + "uuid": "4cf556fe97124ad8934102a1b113e234" + } + ], + [ + "B3S-1000P", + 3, + "KEY-SMD_4P-L6.0-W6.0-P4.50-LS9.5", + "SW1,SW2,SW3", + { + "BOM_Supplier": "LCSC", + "BOM_Supplier Part": "C180420", + "BOM_Manufacturer": "Omron Electronics", + "BOM_Manufacturer Part": "B3S-1000P", + "puuid": "8fffabc80ac54d08a323684a5a5c8f59", + "uuid": "96da1098782146b3badbde5a666b3323" + } + ], + [ + "Photoresistor", + 1, + "PDV-P9XXX", + "R1", + { + "BOM_Supplier Part": "", + "BOM_Supplier": "", + "BOM_Manufacturer Part": "", + "puuid": "99959802cb0742ccac25d0c38171a0c6", + "uuid": "181a4b4c83b34b8491bb9b2cdc106792" + } + ] + ], + "updateTime": 1611197690, + "createTime": 1611196798, + "histories": [], + "created_at": "2021-01-20 21:39:58", + "updated_at": "2021-01-20 21:54:50" + }, + { + "uuid": "cfb83ae987d294b25e489cfe6a47367a", + "puuid": "1aae177d255e90e509cd34fa611a826f", + "title": "Left IO PCB", + "filename": "Left IO PCB.json", + "description": "", + "docType": "3", + "master": "", + "thumb": "/images/thumb-default.png", + "components": { + "1a95e0cd8cf04abab1f0a955e387d9de": 1, + "8fffabc80ac54d08a323684a5a5c8f59": 3, + "99959802cb0742ccac25d0c38171a0c6": 1 + }, + "BOM": [], + "updateTime": 1612476757, + "createTime": 1611197020, + "histories": [], + "created_at": "2021-01-20 21:43:40", + "updated_at": "2021-02-04 17:12:37" + } + ], + "sort": [ + "cad456857d695d9c6f9d99b21b0b449b" + ], + "title": "AirsoftTrackerLeftIO", + "foldername": "AirsoftTrackerLeftIO", + "schfilename": "AirsoftTrackerLeftIO.json", + "schfilemtime": 1611197690894 +} \ No newline at end of file diff --git a/pcb/Production/Gerber_Left IO PCB_2023-08-10.zip b/pcb/Production/Gerber_Left IO PCB_2023-08-10.zip new file mode 100644 index 0000000..796e97a Binary files /dev/null and b/pcb/Production/Gerber_Left IO PCB_2023-08-10.zip differ diff --git a/pcb/Production/Gerber_MAIN PCB.zip b/pcb/Production/Gerber_MAIN PCB.zip new file mode 100644 index 0000000..544eb31 Binary files /dev/null and b/pcb/Production/Gerber_MAIN PCB.zip differ diff --git a/pcb/Production/PCB_IO.pdf b/pcb/Production/PCB_IO.pdf new file mode 100644 index 0000000..27d1bbe --- /dev/null +++ b/pcb/Production/PCB_IO.pdf @@ -0,0 +1,3014 @@ +%PDF-1.4 +%ēßŦā +3 0 obj +<> +endobj +4 0 obj +<< +/Length 47565 +>> +stream +0.14 w +0 G +2 J +0 j +72 M +0.00 g +[] 0 d +0.00 204.19 91.87 -204.19 re +f +1.00 0.00 0.00 rg /a0 gs +[] 0 d +16.502 11.989 m +16.392 12.011 l +16.299 12.073 l +16.236 12.167 l +16.214 12.277 l +16.214 191.650 l +16.236 191.760 l +16.299 191.853 l +16.392 191.916 l +16.502 191.938 l +26.774 191.938 l +26.879 191.918 l +26.970 191.861 l +27.033 191.775 l +27.061 191.672 l +27.050 191.566 l +27.027 191.492 l +27.004 191.254 l +27.004 187.229 l +27.027 186.991 l +27.092 186.776 l +27.198 186.577 l +27.341 186.403 l +27.515 186.261 l +27.713 186.155 l +27.928 186.090 l +28.166 186.066 l +28.835 186.066 l +28.952 186.041 l +29.049 185.972 l +29.109 185.868 l +29.122 185.750 l +29.109 185.619 l +29.109 182.717 l +29.126 182.546 l +29.120 182.454 l +29.086 182.369 l +29.027 182.299 l +28.919 182.206 l +17.420 170.707 l +17.269 170.537 l +17.234 170.489 l +17.115 170.299 l +17.088 170.247 l +17.002 170.039 l +16.984 169.983 l +16.934 169.764 l +16.925 169.706 l +16.911 169.479 l +16.911 166.264 l +16.925 166.037 l +16.934 165.979 l +16.984 165.760 l +17.002 165.704 l +17.088 165.497 l +17.115 165.444 l +17.234 165.254 l +17.269 165.207 l +17.420 165.036 l +19.532 162.925 l +19.592 162.855 l +19.626 162.769 l +19.632 162.677 l +19.606 162.411 l +19.606 159.040 l +19.629 158.803 l +19.694 158.587 l +19.800 158.389 l +19.943 158.215 l +20.117 158.073 l +20.315 157.967 l +20.530 157.902 l +20.768 157.878 l +24.138 157.878 l +24.376 157.902 l +24.591 157.967 l +24.790 158.073 l +24.963 158.215 l +25.106 158.389 l +25.212 158.587 l +25.277 158.803 l +25.301 159.040 l +25.301 162.411 l +25.277 162.648 l +25.212 162.864 l +25.106 163.062 l +24.963 163.236 l +24.790 163.378 l +24.591 163.484 l +24.376 163.549 l +24.270 163.609 l +24.198 163.706 l +24.172 163.825 l +24.172 164.125 l +24.166 164.273 l +24.148 164.413 l +24.119 164.552 l +24.079 164.688 l +24.027 164.820 l +23.966 164.945 l +23.860 165.116 l +23.820 165.220 l +23.824 165.332 l +23.869 165.434 l +23.949 165.511 l +24.142 165.634 l +24.432 165.879 l +24.687 166.161 l +24.903 166.475 l +25.074 166.814 l +25.199 167.173 l +25.275 167.546 l +25.300 167.926 l +25.282 168.187 l +25.300 168.308 l +25.366 168.410 l +26.886 169.931 l +26.990 169.998 l +27.113 170.015 l +27.231 169.979 l +27.323 169.897 l +27.373 169.784 l +27.370 169.660 l +27.306 169.537 l +27.112 169.209 l +26.964 168.859 l +26.863 168.493 l +26.813 168.116 l +26.813 167.735 l +26.863 167.358 l +26.964 166.992 l +27.112 166.642 l +27.306 166.314 l +27.542 166.016 l +27.815 165.752 l +28.121 165.526 l +28.455 165.343 l +28.810 165.207 l +29.180 165.118 l +29.558 165.080 l +29.938 165.093 l +30.313 165.156 l +30.676 165.269 l +31.021 165.429 l +31.342 165.634 l +31.632 165.879 l +31.887 166.161 l +32.103 166.475 l +32.274 166.814 l +32.399 167.173 l +32.475 167.546 l +32.500 167.926 l +32.482 168.190 l +32.500 168.310 l +32.566 168.412 l +34.100 169.949 l +34.204 170.016 l +34.327 170.033 l +34.445 169.997 l +34.537 169.915 l +34.587 169.802 l +34.584 169.678 l +34.506 169.537 l +34.312 169.209 l +34.205 168.955 l +35.824 168.955 l +35.824 169.746 l +35.846 169.856 l +35.908 169.949 l +36.001 170.012 l +36.112 170.034 l +37.114 170.034 l +37.224 170.012 l +37.318 169.949 l +37.798 169.469 l +37.861 169.375 l +37.883 169.265 l +37.883 168.955 l +38.193 168.955 l +38.303 168.933 l +38.396 168.871 l +39.880 167.388 l +39.955 167.279 l +40.051 167.216 l +40.162 167.105 l +40.224 167.012 l +40.246 166.901 l +40.246 161.155 l +40.221 161.037 l +40.151 160.940 l +40.046 160.880 l +39.927 160.868 l +39.813 160.906 l +39.724 160.987 l +39.676 161.097 l +39.599 161.478 l +39.474 161.837 l +39.303 162.176 l +39.087 162.490 l +38.832 162.772 l +38.542 163.017 l +38.221 163.222 l +37.876 163.382 l +37.513 163.495 l +37.138 163.558 l +36.758 163.571 l +36.380 163.533 l +36.010 163.445 l +35.655 163.308 l +35.321 163.125 l +35.015 162.900 l +34.742 162.635 l +34.506 162.337 l +34.312 162.009 l +34.164 161.659 l +34.063 161.293 l +34.013 160.916 l +34.013 160.535 l +34.063 160.158 l +34.164 159.792 l +34.312 159.442 l +34.506 159.114 l +34.742 158.816 l +35.015 158.552 l +35.321 158.326 l +35.655 158.143 l +36.010 158.007 l +36.380 157.918 l +36.758 157.880 l +37.135 157.893 l +37.250 157.873 l +37.348 157.809 l +37.786 157.371 l +37.848 157.277 l +37.870 157.167 l +37.870 155.840 l +37.848 155.730 l +37.786 155.637 l +37.693 155.574 l +37.582 155.552 l +34.490 155.552 l +34.379 155.574 l +34.286 155.637 l +34.224 155.730 l +34.202 155.840 l +34.202 157.887 l +34.187 158.114 l +34.179 158.172 l +34.128 158.391 l +34.110 158.447 l +34.025 158.655 l +33.998 158.707 l +33.879 158.897 l +33.843 158.945 l +33.693 159.115 l +32.566 160.242 l +32.500 160.344 l +32.483 160.465 l +32.500 160.726 l +32.475 161.105 l +32.399 161.478 l +32.274 161.837 l +32.103 162.176 l +31.887 162.490 l +31.632 162.772 l +31.342 163.017 l +31.021 163.222 l +30.676 163.382 l +30.313 163.495 l +29.938 163.558 l +29.558 163.571 l +29.180 163.533 l +28.810 163.445 l +28.455 163.308 l +28.121 163.125 l +27.815 162.900 l +27.542 162.635 l +27.306 162.337 l +27.112 162.009 l +26.964 161.659 l +26.863 161.293 l +26.813 160.916 l +26.813 160.535 l +26.863 160.158 l +26.964 159.792 l +27.112 159.442 l +27.306 159.114 l +27.542 158.816 l +27.815 158.552 l +28.121 158.326 l +28.455 158.143 l +28.810 158.007 l +29.180 157.918 l +29.558 157.880 l +29.935 157.893 l +30.050 157.873 l +30.148 157.809 l +30.687 157.270 l +30.749 157.176 l +30.771 157.066 l +30.771 151.717 l +30.777 151.570 l +30.795 151.429 l +30.824 151.290 l +30.864 151.154 l +30.916 151.022 l +30.978 150.895 l +31.051 150.773 l +31.133 150.658 l +31.225 150.550 l +31.325 150.449 l +31.433 150.358 l +31.548 150.276 l +31.670 150.203 l +31.798 150.141 l +31.930 150.089 l +32.065 150.049 l +32.204 150.020 l +32.345 150.002 l +32.492 149.996 l +32.754 149.996 l +32.864 149.974 l +32.957 149.912 l +33.020 149.818 l +33.042 149.708 l +33.042 149.032 l +33.065 148.794 l +33.130 148.579 l +33.236 148.381 l +33.379 148.207 l +33.553 148.065 l +33.751 147.959 l +33.966 147.893 l +34.061 147.884 l +34.162 147.855 l +34.246 147.791 l +34.302 147.701 l +34.321 147.597 l +34.321 130.030 l +34.302 129.926 l +34.246 129.837 l +34.162 129.773 l +34.061 129.743 l +33.966 129.734 l +33.751 129.669 l +33.553 129.563 l +33.379 129.420 l +33.236 129.246 l +33.130 129.048 l +33.065 128.833 l +33.042 128.595 l +33.042 123.238 l +33.065 123.000 l +33.130 122.785 l +33.236 122.586 l +33.379 122.413 l +33.553 122.270 l +33.751 122.164 l +33.966 122.099 l +34.204 122.075 l +37.582 122.075 l +37.693 122.053 l +37.786 121.991 l +37.848 121.897 l +37.870 121.787 l +37.870 107.651 l +37.848 107.541 l +37.786 107.448 l +37.693 107.385 l +37.582 107.363 l +34.204 107.363 l +33.966 107.340 l +33.751 107.275 l +33.553 107.169 l +33.379 107.026 l +33.236 106.852 l +33.130 106.654 l +33.065 106.439 l +33.042 106.201 l +33.042 100.843 l +33.065 100.605 l +33.130 100.390 l +33.236 100.192 l +33.379 100.018 l +33.553 99.876 l +33.751 99.770 l +33.966 99.704 l +34.061 99.695 l +34.162 99.666 l +34.246 99.602 l +34.302 99.512 l +34.321 99.408 l +34.321 81.841 l +34.302 81.737 l +34.246 81.648 l +34.162 81.584 l +34.061 81.554 l +33.966 81.545 l +33.751 81.480 l +33.553 81.374 l +33.379 81.231 l +33.236 81.057 l +33.130 80.859 l +33.065 80.644 l +33.042 80.406 l +33.042 79.727 l +33.020 79.617 l +32.957 79.524 l +32.864 79.461 l +32.754 79.439 l +32.492 79.439 l +32.345 79.433 l +32.204 79.416 l +32.065 79.386 l +31.930 79.346 l +31.798 79.294 l +31.670 79.232 l +31.548 79.160 l +31.433 79.077 l +31.325 78.986 l +31.225 78.885 l +31.133 78.777 l +31.051 78.662 l +30.978 78.540 l +30.916 78.413 l +30.864 78.281 l +30.824 78.145 l +30.795 78.006 l +30.777 77.866 l +30.771 77.718 l +30.771 25.907 l +30.784 25.688 l +30.794 25.621 l +30.842 25.411 l +30.863 25.347 l +30.945 25.147 l +30.976 25.087 l +31.090 24.903 l +31.130 24.849 l +31.275 24.685 l +32.110 23.842 l +32.334 23.651 l +32.577 23.505 l +32.840 23.401 l +33.119 23.341 l +33.345 23.326 l +38.547 23.326 l +38.774 23.341 l +38.832 23.349 l +39.051 23.400 l +39.107 23.418 l +39.315 23.503 l +39.367 23.530 l +39.557 23.649 l +39.605 23.685 l +39.775 23.835 l +42.600 26.660 l +42.694 26.723 l +42.804 26.745 l +42.914 26.723 l +43.008 26.660 l +43.070 26.567 l +43.092 26.457 l +43.092 12.277 l +43.070 12.167 l +43.008 12.073 l +42.914 12.011 l +42.804 11.989 l +16.502 11.989 l +h +29.538 14.315 m +29.998 14.328 l +30.453 14.394 l +30.898 14.511 l +31.326 14.677 l +31.733 14.892 l +32.113 15.152 l +32.460 15.453 l +32.771 15.792 l +33.042 16.164 l +33.268 16.564 l +33.447 16.988 l +33.576 17.429 l +33.655 17.882 l +33.681 18.341 l +33.655 18.800 l +33.576 19.254 l +33.447 19.695 l +33.268 20.118 l +33.042 20.519 l +32.771 20.891 l +32.460 21.230 l +32.113 21.531 l +31.733 21.790 l +31.326 22.005 l +30.898 22.172 l +30.453 22.289 l +29.998 22.354 l +29.538 22.367 l +29.080 22.328 l +28.629 22.237 l +28.192 22.095 l +27.774 21.904 l +27.380 21.666 l +27.016 21.385 l +26.686 21.065 l +26.395 20.709 l +26.146 20.322 l +25.943 19.909 l +25.789 19.476 l +25.684 19.028 l +25.632 18.571 l +25.632 18.111 l +25.684 17.654 l +25.789 17.207 l +25.943 16.773 l +26.146 16.361 l +26.395 15.974 l +26.686 15.618 l +27.016 15.297 l +27.380 15.016 l +27.774 14.779 l +28.192 14.588 l +28.629 14.446 l +29.080 14.354 l +29.538 14.315 l +h +22.452 181.559 m +22.912 181.572 l +23.367 181.637 l +23.812 181.754 l +24.240 181.921 l +24.647 182.136 l +25.027 182.395 l +25.374 182.697 l +25.685 183.035 l +25.955 183.407 l +26.181 183.808 l +26.361 184.232 l +26.490 184.673 l +26.568 185.126 l +26.595 185.585 l +26.568 186.044 l +26.490 186.497 l +26.361 186.939 l +26.181 187.362 l +25.955 187.763 l +25.685 188.135 l +25.374 188.473 l +25.027 188.775 l +24.647 189.034 l +24.240 189.249 l +23.812 189.416 l +23.367 189.533 l +22.912 189.598 l +22.452 189.611 l +21.994 189.572 l +21.543 189.480 l +21.106 189.338 l +20.687 189.147 l +20.294 188.910 l +19.929 188.629 l +19.600 188.309 l +19.308 187.953 l +19.060 187.566 l +18.857 187.153 l +18.702 186.720 l +18.598 186.272 l +18.546 185.815 l +18.546 185.355 l +18.598 184.898 l +18.702 184.450 l +18.857 184.017 l +19.060 183.604 l +19.308 183.218 l +19.600 182.862 l +19.929 182.541 l +20.294 182.260 l +20.687 182.023 l +21.106 181.832 l +21.543 181.690 l +21.994 181.598 l +22.452 181.559 l +h +29.538 112.111 m +29.998 112.124 l +30.453 112.189 l +30.898 112.306 l +31.326 112.473 l +31.733 112.688 l +32.113 112.947 l +32.460 113.248 l +32.771 113.587 l +33.042 113.959 l +33.268 114.360 l +33.447 114.783 l +33.576 115.224 l +33.655 115.678 l +33.681 116.137 l +33.655 116.596 l +33.576 117.049 l +33.447 117.490 l +33.268 117.914 l +33.042 118.314 l +32.771 118.686 l +32.460 119.025 l +32.113 119.326 l +31.733 119.586 l +31.326 119.801 l +30.898 119.967 l +30.453 120.084 l +29.998 120.150 l +29.538 120.163 l +29.080 120.124 l +28.629 120.032 l +28.192 119.890 l +27.774 119.699 l +27.380 119.462 l +27.016 119.181 l +26.686 118.860 l +26.395 118.504 l +26.146 118.117 l +25.943 117.705 l +25.789 117.271 l +25.684 116.824 l +25.632 116.367 l +25.632 115.907 l +25.684 115.450 l +25.789 115.002 l +25.943 114.569 l +26.146 114.156 l +26.395 113.769 l +26.686 113.413 l +27.016 113.093 l +27.380 112.812 l +27.774 112.574 l +28.192 112.383 l +28.629 112.241 l +29.080 112.150 l +29.538 112.111 l +h +20.283 32.217 m +20.283 31.065 l +22.173 31.065 l +22.173 33.380 l +21.446 33.380 l +21.208 33.356 l +20.993 33.291 l +20.794 33.185 l +20.621 33.042 l +20.478 32.869 l +20.372 32.670 l +20.307 32.455 l +20.283 32.217 l +h +24.375 33.380 m +24.375 31.065 l +26.265 31.065 l +26.265 32.217 l +26.241 32.455 l +26.176 32.670 l +26.070 32.869 l +25.927 33.042 l +25.754 33.185 l +25.555 33.291 l +25.340 33.356 l +25.102 33.380 l +24.375 33.380 l +h +25.102 51.492 m +25.340 51.515 l +25.555 51.581 l +25.754 51.687 l +25.927 51.829 l +26.070 52.003 l +26.176 52.201 l +26.241 52.417 l +26.265 52.654 l +26.265 53.807 l +24.375 53.807 l +24.375 51.492 l +25.102 51.492 l +h +22.173 51.492 m +22.173 53.807 l +20.283 53.807 l +20.283 52.654 l +20.307 52.417 l +20.372 52.201 l +20.478 52.003 l +20.621 51.829 l +20.794 51.687 l +20.993 51.581 l +21.208 51.515 l +21.446 51.492 l +22.173 51.492 l +h +20.283 58.012 m +20.283 56.860 l +22.173 56.860 l +22.173 59.174 l +21.446 59.174 l +21.208 59.151 l +20.993 59.086 l +20.794 58.980 l +20.621 58.837 l +20.478 58.663 l +20.372 58.465 l +20.307 58.250 l +20.283 58.012 l +h +26.265 56.860 m +26.265 58.012 l +26.241 58.250 l +26.176 58.465 l +26.070 58.663 l +25.927 58.837 l +25.754 58.980 l +25.555 59.086 l +25.340 59.151 l +25.102 59.174 l +24.375 59.174 l +24.375 56.860 l +26.265 56.860 l +h +22.173 73.886 m +22.173 76.201 l +20.283 76.201 l +20.283 75.049 l +20.307 74.811 l +20.372 74.596 l +20.478 74.397 l +20.621 74.224 l +20.794 74.081 l +20.993 73.975 l +21.208 73.910 l +21.446 73.886 l +22.173 73.886 l +h +25.102 73.886 m +25.340 73.910 l +25.555 73.975 l +25.754 74.081 l +25.927 74.224 l +26.070 74.397 l +26.176 74.596 l +26.241 74.811 l +26.265 75.049 l +26.265 76.201 l +24.375 76.201 l +24.375 73.886 l +25.102 73.886 l +h +26.265 79.254 m +26.265 80.406 l +26.241 80.644 l +26.176 80.859 l +26.070 81.057 l +25.927 81.231 l +25.754 81.374 l +25.555 81.480 l +25.340 81.545 l +25.102 81.569 l +24.375 81.569 l +24.375 79.254 l +26.265 79.254 l +h +22.173 79.254 m +22.173 81.569 l +21.446 81.569 l +21.208 81.545 l +20.993 81.480 l +20.794 81.374 l +20.621 81.231 l +20.478 81.057 l +20.372 80.859 l +20.307 80.644 l +20.283 80.406 l +20.283 79.254 l +22.173 79.254 l +h +24.375 101.996 m +24.375 99.681 l +25.102 99.681 l +25.340 99.704 l +25.555 99.770 l +25.754 99.876 l +25.927 100.018 l +26.070 100.192 l +26.176 100.390 l +26.241 100.605 l +26.265 100.843 l +26.265 101.996 l +24.375 101.996 l +h +21.208 99.704 m +21.446 99.681 l +22.173 99.681 l +22.173 101.996 l +20.283 101.996 l +20.283 100.843 l +20.307 100.605 l +20.372 100.390 l +20.478 100.192 l +20.621 100.018 l +20.794 99.876 l +20.993 99.770 l +21.208 99.704 l +h +22.173 105.049 m +22.173 107.363 l +21.446 107.363 l +21.208 107.340 l +20.993 107.275 l +20.794 107.169 l +20.621 107.026 l +20.478 106.852 l +20.372 106.654 l +20.307 106.439 l +20.283 106.201 l +20.283 105.049 l +22.173 105.049 l +h +26.265 105.049 m +26.265 106.201 l +26.241 106.439 l +26.176 106.654 l +26.070 106.852 l +25.927 107.026 l +25.754 107.169 l +25.555 107.275 l +25.340 107.340 l +25.102 107.363 l +24.375 107.363 l +24.375 105.049 l +26.265 105.049 l +h +22.173 25.697 m +22.173 28.012 l +20.283 28.012 l +20.283 26.860 l +20.307 26.622 l +20.372 26.407 l +20.478 26.208 l +20.621 26.035 l +20.794 25.892 l +20.993 25.786 l +21.208 25.721 l +21.446 25.697 l +22.173 25.697 l +h +22.173 122.075 m +22.173 124.390 l +20.283 124.390 l +20.283 123.238 l +20.307 123.000 l +20.372 122.785 l +20.478 122.586 l +20.621 122.413 l +20.794 122.270 l +20.993 122.164 l +21.208 122.099 l +21.446 122.075 l +22.173 122.075 l +h +25.102 122.075 m +25.340 122.099 l +25.555 122.164 l +25.754 122.270 l +25.927 122.413 l +26.070 122.586 l +26.176 122.785 l +26.241 123.000 l +26.265 123.238 l +26.265 124.390 l +24.375 124.390 l +24.375 122.075 l +25.102 122.075 l +h +22.173 127.443 m +22.173 129.758 l +21.446 129.758 l +21.208 129.734 l +20.993 129.669 l +20.794 129.563 l +20.621 129.420 l +20.478 129.246 l +20.372 129.048 l +20.307 128.833 l +20.283 128.595 l +20.283 127.443 l +22.173 127.443 l +h +26.265 127.443 m +26.265 128.595 l +26.241 128.833 l +26.176 129.048 l +26.070 129.246 l +25.927 129.420 l +25.754 129.563 l +25.555 129.669 l +25.340 129.734 l +25.102 129.758 l +24.375 129.758 l +24.375 127.443 l +26.265 127.443 l +h +24.375 150.185 m +24.375 147.870 l +25.102 147.870 l +25.340 147.893 l +25.555 147.959 l +25.754 148.065 l +25.927 148.207 l +26.070 148.381 l +26.176 148.579 l +26.241 148.794 l +26.265 149.032 l +26.265 150.185 l +24.375 150.185 l +h +21.208 147.893 m +21.446 147.870 l +22.173 147.870 l +22.173 150.185 l +20.283 150.185 l +20.283 149.032 l +20.307 148.794 l +20.372 148.579 l +20.478 148.381 l +20.621 148.207 l +20.794 148.065 l +20.993 147.959 l +21.208 147.893 l +h +22.173 153.238 m +22.173 155.552 l +21.446 155.552 l +21.208 155.529 l +20.993 155.464 l +20.794 155.358 l +20.621 155.215 l +20.478 155.041 l +20.372 154.843 l +20.307 154.628 l +20.283 154.390 l +20.283 153.238 l +22.173 153.238 l +h +26.265 153.238 m +26.265 154.390 l +26.241 154.628 l +26.176 154.843 l +26.070 155.041 l +25.927 155.215 l +25.754 155.358 l +25.555 155.464 l +25.340 155.529 l +25.102 155.552 l +24.375 155.552 l +24.375 153.238 l +26.265 153.238 l +h +25.102 25.697 m +25.340 25.721 l +25.555 25.786 l +25.754 25.892 l +25.927 26.035 l +26.070 26.208 l +26.176 26.407 l +26.241 26.622 l +26.265 26.860 l +26.265 28.012 l +24.375 28.012 l +24.375 25.697 l +25.102 25.697 l +h +37.883 166.896 m +37.883 165.272 l +38.221 165.429 l +38.542 165.634 l +38.832 165.879 l +39.087 166.161 l +39.303 166.475 l +39.474 166.814 l +39.503 166.896 l +37.883 166.896 l +h +35.824 165.278 m +35.824 166.896 l +34.205 166.896 l +34.312 166.642 l +34.506 166.314 l +34.742 166.016 l +35.015 165.752 l +35.321 165.526 l +35.655 165.343 l +35.824 165.278 l +h +f +1.00 0.00 0.00 rg /a0 gs +[] 0 d +16.502 11.989 m +16.392 12.011 l +16.299 12.073 l +16.236 12.167 l +16.214 12.277 l +16.214 191.650 l +16.236 191.760 l +16.299 191.853 l +16.392 191.916 l +16.502 191.938 l +26.774 191.938 l +26.879 191.918 l +26.970 191.861 l +27.033 191.775 l +27.061 191.672 l +27.050 191.566 l +27.027 191.492 l +27.004 191.254 l +27.004 187.229 l +27.027 186.991 l +27.092 186.776 l +27.198 186.577 l +27.341 186.403 l +27.515 186.261 l +27.713 186.155 l +27.928 186.090 l +28.166 186.066 l +28.835 186.066 l +28.952 186.041 l +29.049 185.972 l +29.109 185.868 l +29.122 185.750 l +29.109 185.619 l +29.109 182.717 l +29.126 182.546 l +29.120 182.454 l +29.086 182.369 l +29.027 182.299 l +28.919 182.206 l +17.420 170.707 l +17.269 170.537 l +17.234 170.489 l +17.115 170.299 l +17.088 170.247 l +17.002 170.039 l +16.984 169.983 l +16.934 169.764 l +16.925 169.706 l +16.911 169.479 l +16.911 166.264 l +16.925 166.037 l +16.934 165.979 l +16.984 165.760 l +17.002 165.704 l +17.088 165.497 l +17.115 165.444 l +17.234 165.254 l +17.269 165.207 l +17.420 165.036 l +19.532 162.925 l +19.592 162.855 l +19.626 162.769 l +19.632 162.677 l +19.606 162.411 l +19.606 159.040 l +19.629 158.803 l +19.694 158.587 l +19.800 158.389 l +19.943 158.215 l +20.117 158.073 l +20.315 157.967 l +20.530 157.902 l +20.768 157.878 l +24.138 157.878 l +24.376 157.902 l +24.591 157.967 l +24.790 158.073 l +24.963 158.215 l +25.106 158.389 l +25.212 158.587 l +25.277 158.803 l +25.301 159.040 l +25.301 162.411 l +25.277 162.648 l +25.212 162.864 l +25.106 163.062 l +24.963 163.236 l +24.790 163.378 l +24.591 163.484 l +24.376 163.549 l +24.270 163.609 l +24.198 163.706 l +24.172 163.825 l +24.172 164.125 l +24.166 164.273 l +24.148 164.413 l +24.119 164.552 l +24.079 164.688 l +24.027 164.820 l +23.966 164.945 l +23.860 165.116 l +23.820 165.220 l +23.824 165.332 l +23.869 165.434 l +23.949 165.511 l +24.142 165.634 l +24.432 165.879 l +24.687 166.161 l +24.903 166.475 l +25.074 166.814 l +25.199 167.173 l +25.275 167.546 l +25.300 167.926 l +25.282 168.187 l +25.300 168.308 l +25.366 168.410 l +26.886 169.931 l +26.990 169.998 l +27.113 170.015 l +27.231 169.979 l +27.323 169.897 l +27.373 169.784 l +27.370 169.660 l +27.306 169.537 l +27.112 169.209 l +26.964 168.859 l +26.863 168.493 l +26.813 168.116 l +26.813 167.735 l +26.863 167.358 l +26.964 166.992 l +27.112 166.642 l +27.306 166.314 l +27.542 166.016 l +27.815 165.752 l +28.121 165.526 l +28.455 165.343 l +28.810 165.207 l +29.180 165.118 l +29.558 165.080 l +29.938 165.093 l +30.313 165.156 l +30.676 165.269 l +31.021 165.429 l +31.342 165.634 l +31.632 165.879 l +31.887 166.161 l +32.103 166.475 l +32.274 166.814 l +32.399 167.173 l +32.475 167.546 l +32.500 167.926 l +32.482 168.190 l +32.500 168.310 l +32.566 168.412 l +34.100 169.949 l +34.204 170.016 l +34.327 170.033 l +34.445 169.997 l +34.537 169.915 l +34.587 169.802 l +34.584 169.678 l +34.506 169.537 l +34.312 169.209 l +34.205 168.955 l +35.824 168.955 l +35.824 169.746 l +35.846 169.856 l +35.908 169.949 l +36.001 170.012 l +36.112 170.034 l +37.114 170.034 l +37.224 170.012 l +37.318 169.949 l +37.798 169.469 l +37.861 169.375 l +37.883 169.265 l +37.883 168.955 l +38.193 168.955 l +38.303 168.933 l +38.396 168.871 l +39.880 167.388 l +39.955 167.279 l +40.051 167.216 l +40.162 167.105 l +40.224 167.012 l +40.246 166.901 l +40.246 161.155 l +40.221 161.037 l +40.151 160.940 l +40.046 160.880 l +39.927 160.868 l +39.813 160.906 l +39.724 160.987 l +39.676 161.097 l +39.599 161.478 l +39.474 161.837 l +39.303 162.176 l +39.087 162.490 l +38.832 162.772 l +38.542 163.017 l +38.221 163.222 l +37.876 163.382 l +37.513 163.495 l +37.138 163.558 l +36.758 163.571 l +36.380 163.533 l +36.010 163.445 l +35.655 163.308 l +35.321 163.125 l +35.015 162.900 l +34.742 162.635 l +34.506 162.337 l +34.312 162.009 l +34.164 161.659 l +34.063 161.293 l +34.013 160.916 l +34.013 160.535 l +34.063 160.158 l +34.164 159.792 l +34.312 159.442 l +34.506 159.114 l +34.742 158.816 l +35.015 158.552 l +35.321 158.326 l +35.655 158.143 l +36.010 158.007 l +36.380 157.918 l +36.758 157.880 l +37.135 157.893 l +37.250 157.873 l +37.348 157.809 l +37.786 157.371 l +37.848 157.277 l +37.870 157.167 l +37.870 155.840 l +37.848 155.730 l +37.786 155.637 l +37.693 155.574 l +37.582 155.552 l +34.490 155.552 l +34.379 155.574 l +34.286 155.637 l +34.224 155.730 l +34.202 155.840 l +34.202 157.887 l +34.187 158.114 l +34.179 158.172 l +34.128 158.391 l +34.110 158.447 l +34.025 158.655 l +33.998 158.707 l +33.879 158.897 l +33.843 158.945 l +33.693 159.115 l +32.566 160.242 l +32.500 160.344 l +32.483 160.465 l +32.500 160.726 l +32.475 161.105 l +32.399 161.478 l +32.274 161.837 l +32.103 162.176 l +31.887 162.490 l +31.632 162.772 l +31.342 163.017 l +31.021 163.222 l +30.676 163.382 l +30.313 163.495 l +29.938 163.558 l +29.558 163.571 l +29.180 163.533 l +28.810 163.445 l +28.455 163.308 l +28.121 163.125 l +27.815 162.900 l +27.542 162.635 l +27.306 162.337 l +27.112 162.009 l +26.964 161.659 l +26.863 161.293 l +26.813 160.916 l +26.813 160.535 l +26.863 160.158 l +26.964 159.792 l +27.112 159.442 l +27.306 159.114 l +27.542 158.816 l +27.815 158.552 l +28.121 158.326 l +28.455 158.143 l +28.810 158.007 l +29.180 157.918 l +29.558 157.880 l +29.935 157.893 l +30.050 157.873 l +30.148 157.809 l +30.687 157.270 l +30.749 157.176 l +30.771 157.066 l +30.771 151.717 l +30.777 151.570 l +30.795 151.429 l +30.824 151.290 l +30.864 151.154 l +30.916 151.022 l +30.978 150.895 l +31.051 150.773 l +31.133 150.658 l +31.225 150.550 l +31.325 150.449 l +31.433 150.358 l +31.548 150.276 l +31.670 150.203 l +31.798 150.141 l +31.930 150.089 l +32.065 150.049 l +32.204 150.020 l +32.345 150.002 l +32.492 149.996 l +32.754 149.996 l +32.864 149.974 l +32.957 149.912 l +33.020 149.818 l +33.042 149.708 l +33.042 149.032 l +33.065 148.794 l +33.130 148.579 l +33.236 148.381 l +33.379 148.207 l +33.553 148.065 l +33.751 147.959 l +33.966 147.893 l +34.061 147.884 l +34.162 147.855 l +34.246 147.791 l +34.302 147.701 l +34.321 147.597 l +34.321 130.030 l +34.302 129.926 l +34.246 129.837 l +34.162 129.773 l +34.061 129.743 l +33.966 129.734 l +33.751 129.669 l +33.553 129.563 l +33.379 129.420 l +33.236 129.246 l +33.130 129.048 l +33.065 128.833 l +33.042 128.595 l +33.042 123.238 l +33.065 123.000 l +33.130 122.785 l +33.236 122.586 l +33.379 122.413 l +33.553 122.270 l +33.751 122.164 l +33.966 122.099 l +34.204 122.075 l +37.582 122.075 l +37.693 122.053 l +37.786 121.991 l +37.848 121.897 l +37.870 121.787 l +37.870 107.651 l +37.848 107.541 l +37.786 107.448 l +37.693 107.385 l +37.582 107.363 l +34.204 107.363 l +33.966 107.340 l +33.751 107.275 l +33.553 107.169 l +33.379 107.026 l +33.236 106.852 l +33.130 106.654 l +33.065 106.439 l +33.042 106.201 l +33.042 100.843 l +33.065 100.605 l +33.130 100.390 l +33.236 100.192 l +33.379 100.018 l +33.553 99.876 l +33.751 99.770 l +33.966 99.704 l +34.061 99.695 l +34.162 99.666 l +34.246 99.602 l +34.302 99.512 l +34.321 99.408 l +34.321 81.841 l +34.302 81.737 l +34.246 81.648 l +34.162 81.584 l +34.061 81.554 l +33.966 81.545 l +33.751 81.480 l +33.553 81.374 l +33.379 81.231 l +33.236 81.057 l +33.130 80.859 l +33.065 80.644 l +33.042 80.406 l +33.042 79.727 l +33.020 79.617 l +32.957 79.524 l +32.864 79.461 l +32.754 79.439 l +32.492 79.439 l +32.345 79.433 l +32.204 79.416 l +32.065 79.386 l +31.930 79.346 l +31.798 79.294 l +31.670 79.232 l +31.548 79.160 l +31.433 79.077 l +31.325 78.986 l +31.225 78.885 l +31.133 78.777 l +31.051 78.662 l +30.978 78.540 l +30.916 78.413 l +30.864 78.281 l +30.824 78.145 l +30.795 78.006 l +30.777 77.866 l +30.771 77.718 l +30.771 25.907 l +30.784 25.688 l +30.794 25.621 l +30.842 25.411 l +30.863 25.347 l +30.945 25.147 l +30.976 25.087 l +31.090 24.903 l +31.130 24.849 l +31.275 24.685 l +32.110 23.842 l +32.334 23.651 l +32.577 23.505 l +32.840 23.401 l +33.119 23.341 l +33.345 23.326 l +38.547 23.326 l +38.774 23.341 l +38.832 23.349 l +39.051 23.400 l +39.107 23.418 l +39.315 23.503 l +39.367 23.530 l +39.557 23.649 l +39.605 23.685 l +39.775 23.835 l +42.600 26.660 l +42.694 26.723 l +42.804 26.745 l +42.914 26.723 l +43.008 26.660 l +43.070 26.567 l +43.092 26.457 l +43.092 12.277 l +43.070 12.167 l +43.008 12.073 l +42.914 12.011 l +42.804 11.989 l +16.502 11.989 l +h +29.538 14.315 m +29.998 14.328 l +30.453 14.394 l +30.898 14.511 l +31.326 14.677 l +31.733 14.892 l +32.113 15.152 l +32.460 15.453 l +32.771 15.792 l +33.042 16.164 l +33.268 16.564 l +33.447 16.988 l +33.576 17.429 l +33.655 17.882 l +33.681 18.341 l +33.655 18.800 l +33.576 19.254 l +33.447 19.695 l +33.268 20.118 l +33.042 20.519 l +32.771 20.891 l +32.460 21.230 l +32.113 21.531 l +31.733 21.790 l +31.326 22.005 l +30.898 22.172 l +30.453 22.289 l +29.998 22.354 l +29.538 22.367 l +29.080 22.328 l +28.629 22.237 l +28.192 22.095 l +27.774 21.904 l +27.380 21.666 l +27.016 21.385 l +26.686 21.065 l +26.395 20.709 l +26.146 20.322 l +25.943 19.909 l +25.789 19.476 l +25.684 19.028 l +25.632 18.571 l +25.632 18.111 l +25.684 17.654 l +25.789 17.207 l +25.943 16.773 l +26.146 16.361 l +26.395 15.974 l +26.686 15.618 l +27.016 15.297 l +27.380 15.016 l +27.774 14.779 l +28.192 14.588 l +28.629 14.446 l +29.080 14.354 l +29.538 14.315 l +h +22.452 181.559 m +22.912 181.572 l +23.367 181.637 l +23.812 181.754 l +24.240 181.921 l +24.647 182.136 l +25.027 182.395 l +25.374 182.697 l +25.685 183.035 l +25.955 183.407 l +26.181 183.808 l +26.361 184.232 l +26.490 184.673 l +26.568 185.126 l +26.595 185.585 l +26.568 186.044 l +26.490 186.497 l +26.361 186.939 l +26.181 187.362 l +25.955 187.763 l +25.685 188.135 l +25.374 188.473 l +25.027 188.775 l +24.647 189.034 l +24.240 189.249 l +23.812 189.416 l +23.367 189.533 l +22.912 189.598 l +22.452 189.611 l +21.994 189.572 l +21.543 189.480 l +21.106 189.338 l +20.687 189.147 l +20.294 188.910 l +19.929 188.629 l +19.600 188.309 l +19.308 187.953 l +19.060 187.566 l +18.857 187.153 l +18.702 186.720 l +18.598 186.272 l +18.546 185.815 l +18.546 185.355 l +18.598 184.898 l +18.702 184.450 l +18.857 184.017 l +19.060 183.604 l +19.308 183.218 l +19.600 182.862 l +19.929 182.541 l +20.294 182.260 l +20.687 182.023 l +21.106 181.832 l +21.543 181.690 l +21.994 181.598 l +22.452 181.559 l +h +29.538 112.111 m +29.998 112.124 l +30.453 112.189 l +30.898 112.306 l +31.326 112.473 l +31.733 112.688 l +32.113 112.947 l +32.460 113.248 l +32.771 113.587 l +33.042 113.959 l +33.268 114.360 l +33.447 114.783 l +33.576 115.224 l +33.655 115.678 l +33.681 116.137 l +33.655 116.596 l +33.576 117.049 l +33.447 117.490 l +33.268 117.914 l +33.042 118.314 l +32.771 118.686 l +32.460 119.025 l +32.113 119.326 l +31.733 119.586 l +31.326 119.801 l +30.898 119.967 l +30.453 120.084 l +29.998 120.150 l +29.538 120.163 l +29.080 120.124 l +28.629 120.032 l +28.192 119.890 l +27.774 119.699 l +27.380 119.462 l +27.016 119.181 l +26.686 118.860 l +26.395 118.504 l +26.146 118.117 l +25.943 117.705 l +25.789 117.271 l +25.684 116.824 l +25.632 116.367 l +25.632 115.907 l +25.684 115.450 l +25.789 115.002 l +25.943 114.569 l +26.146 114.156 l +26.395 113.769 l +26.686 113.413 l +27.016 113.093 l +27.380 112.812 l +27.774 112.574 l +28.192 112.383 l +28.629 112.241 l +29.080 112.150 l +29.538 112.111 l +h +20.283 32.217 m +20.283 31.065 l +22.173 31.065 l +22.173 33.380 l +21.446 33.380 l +21.208 33.356 l +20.993 33.291 l +20.794 33.185 l +20.621 33.042 l +20.478 32.869 l +20.372 32.670 l +20.307 32.455 l +20.283 32.217 l +h +24.375 33.380 m +24.375 31.065 l +26.265 31.065 l +26.265 32.217 l +26.241 32.455 l +26.176 32.670 l +26.070 32.869 l +25.927 33.042 l +25.754 33.185 l +25.555 33.291 l +25.340 33.356 l +25.102 33.380 l +24.375 33.380 l +h +25.102 51.492 m +25.340 51.515 l +25.555 51.581 l +25.754 51.687 l +25.927 51.829 l +26.070 52.003 l +26.176 52.201 l +26.241 52.417 l +26.265 52.654 l +26.265 53.807 l +24.375 53.807 l +24.375 51.492 l +25.102 51.492 l +h +22.173 51.492 m +22.173 53.807 l +20.283 53.807 l +20.283 52.654 l +20.307 52.417 l +20.372 52.201 l +20.478 52.003 l +20.621 51.829 l +20.794 51.687 l +20.993 51.581 l +21.208 51.515 l +21.446 51.492 l +22.173 51.492 l +h +20.283 58.012 m +20.283 56.860 l +22.173 56.860 l +22.173 59.174 l +21.446 59.174 l +21.208 59.151 l +20.993 59.086 l +20.794 58.980 l +20.621 58.837 l +20.478 58.663 l +20.372 58.465 l +20.307 58.250 l +20.283 58.012 l +h +26.265 56.860 m +26.265 58.012 l +26.241 58.250 l +26.176 58.465 l +26.070 58.663 l +25.927 58.837 l +25.754 58.980 l +25.555 59.086 l +25.340 59.151 l +25.102 59.174 l +24.375 59.174 l +24.375 56.860 l +26.265 56.860 l +h +22.173 73.886 m +22.173 76.201 l +20.283 76.201 l +20.283 75.049 l +20.307 74.811 l +20.372 74.596 l +20.478 74.397 l +20.621 74.224 l +20.794 74.081 l +20.993 73.975 l +21.208 73.910 l +21.446 73.886 l +22.173 73.886 l +h +25.102 73.886 m +25.340 73.910 l +25.555 73.975 l +25.754 74.081 l +25.927 74.224 l +26.070 74.397 l +26.176 74.596 l +26.241 74.811 l +26.265 75.049 l +26.265 76.201 l +24.375 76.201 l +24.375 73.886 l +25.102 73.886 l +h +26.265 79.254 m +26.265 80.406 l +26.241 80.644 l +26.176 80.859 l +26.070 81.057 l +25.927 81.231 l +25.754 81.374 l +25.555 81.480 l +25.340 81.545 l +25.102 81.569 l +24.375 81.569 l +24.375 79.254 l +26.265 79.254 l +h +22.173 79.254 m +22.173 81.569 l +21.446 81.569 l +21.208 81.545 l +20.993 81.480 l +20.794 81.374 l +20.621 81.231 l +20.478 81.057 l +20.372 80.859 l +20.307 80.644 l +20.283 80.406 l +20.283 79.254 l +22.173 79.254 l +h +24.375 101.996 m +24.375 99.681 l +25.102 99.681 l +25.340 99.704 l +25.555 99.770 l +25.754 99.876 l +25.927 100.018 l +26.070 100.192 l +26.176 100.390 l +26.241 100.605 l +26.265 100.843 l +26.265 101.996 l +24.375 101.996 l +h +21.208 99.704 m +21.446 99.681 l +22.173 99.681 l +22.173 101.996 l +20.283 101.996 l +20.283 100.843 l +20.307 100.605 l +20.372 100.390 l +20.478 100.192 l +20.621 100.018 l +20.794 99.876 l +20.993 99.770 l +21.208 99.704 l +h +22.173 105.049 m +22.173 107.363 l +21.446 107.363 l +21.208 107.340 l +20.993 107.275 l +20.794 107.169 l +20.621 107.026 l +20.478 106.852 l +20.372 106.654 l +20.307 106.439 l +20.283 106.201 l +20.283 105.049 l +22.173 105.049 l +h +26.265 105.049 m +26.265 106.201 l +26.241 106.439 l +26.176 106.654 l +26.070 106.852 l +25.927 107.026 l +25.754 107.169 l +25.555 107.275 l +25.340 107.340 l +25.102 107.363 l +24.375 107.363 l +24.375 105.049 l +26.265 105.049 l +h +22.173 25.697 m +22.173 28.012 l +20.283 28.012 l +20.283 26.860 l +20.307 26.622 l +20.372 26.407 l +20.478 26.208 l +20.621 26.035 l +20.794 25.892 l +20.993 25.786 l +21.208 25.721 l +21.446 25.697 l +22.173 25.697 l +h +22.173 122.075 m +22.173 124.390 l +20.283 124.390 l +20.283 123.238 l +20.307 123.000 l +20.372 122.785 l +20.478 122.586 l +20.621 122.413 l +20.794 122.270 l +20.993 122.164 l +21.208 122.099 l +21.446 122.075 l +22.173 122.075 l +h +25.102 122.075 m +25.340 122.099 l +25.555 122.164 l +25.754 122.270 l +25.927 122.413 l +26.070 122.586 l +26.176 122.785 l +26.241 123.000 l +26.265 123.238 l +26.265 124.390 l +24.375 124.390 l +24.375 122.075 l +25.102 122.075 l +h +22.173 127.443 m +22.173 129.758 l +21.446 129.758 l +21.208 129.734 l +20.993 129.669 l +20.794 129.563 l +20.621 129.420 l +20.478 129.246 l +20.372 129.048 l +20.307 128.833 l +20.283 128.595 l +20.283 127.443 l +22.173 127.443 l +h +26.265 127.443 m +26.265 128.595 l +26.241 128.833 l +26.176 129.048 l +26.070 129.246 l +25.927 129.420 l +25.754 129.563 l +25.555 129.669 l +25.340 129.734 l +25.102 129.758 l +24.375 129.758 l +24.375 127.443 l +26.265 127.443 l +h +24.375 150.185 m +24.375 147.870 l +25.102 147.870 l +25.340 147.893 l +25.555 147.959 l +25.754 148.065 l +25.927 148.207 l +26.070 148.381 l +26.176 148.579 l +26.241 148.794 l +26.265 149.032 l +26.265 150.185 l +24.375 150.185 l +h +21.208 147.893 m +21.446 147.870 l +22.173 147.870 l +22.173 150.185 l +20.283 150.185 l +20.283 149.032 l +20.307 148.794 l +20.372 148.579 l +20.478 148.381 l +20.621 148.207 l +20.794 148.065 l +20.993 147.959 l +21.208 147.893 l +h +22.173 153.238 m +22.173 155.552 l +21.446 155.552 l +21.208 155.529 l +20.993 155.464 l +20.794 155.358 l +20.621 155.215 l +20.478 155.041 l +20.372 154.843 l +20.307 154.628 l +20.283 154.390 l +20.283 153.238 l +22.173 153.238 l +h +26.265 153.238 m +26.265 154.390 l +26.241 154.628 l +26.176 154.843 l +26.070 155.041 l +25.927 155.215 l +25.754 155.358 l +25.555 155.464 l +25.340 155.529 l +25.102 155.552 l +24.375 155.552 l +24.375 153.238 l +26.265 153.238 l +h +25.102 25.697 m +25.340 25.721 l +25.555 25.786 l +25.754 25.892 l +25.927 26.035 l +26.070 26.208 l +26.176 26.407 l +26.241 26.622 l +26.265 26.860 l +26.265 28.012 l +24.375 28.012 l +24.375 25.697 l +25.102 25.697 l +h +37.883 166.896 m +37.883 165.272 l +38.221 165.429 l +38.542 165.634 l +38.832 165.879 l +39.087 166.161 l +39.303 166.475 l +39.474 166.814 l +39.503 166.896 l +37.883 166.896 l +h +35.824 165.278 m +35.824 166.896 l +34.205 166.896 l +34.312 166.642 l +34.506 166.314 l +34.742 166.016 l +35.015 165.752 l +35.321 165.526 l +35.655 165.343 l +35.824 165.278 l +h +f +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +36.036 77.724 m +32.486 77.724 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +32.486 77.724 m +32.486 25.898 l +33.336 25.042 l +38.556 25.042 l +41.962 28.447 l +41.962 167.731 l +37.944 171.749 l +33.473 171.749 l +29.657 167.926 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +36.036 103.522 m +36.036 77.724 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +23.278 125.914 m +23.278 151.711 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +23.278 103.522 m +23.278 125.914 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +23.278 151.711 m +23.278 156.110 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +23.278 156.110 m +23.933 156.110 l +25.891 158.076 l +25.891 162.014 l +28.116 164.239 l +33.163 164.239 l +36.857 167.926 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +23.278 77.724 m +23.278 103.522 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +23.278 55.332 m +23.278 77.724 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +23.278 29.534 m +23.278 55.332 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +31.723 184.169 m +31.723 181.001 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +22.457 160.726 m +22.457 164.131 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +22.457 164.131 m +20.750 164.131 l +18.626 166.255 l +18.626 169.488 l +30.139 181.001 l +31.723 181.001 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +38.923 184.169 m +38.923 181.001 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +38.923 181.001 m +35.525 181.001 l +22.457 167.926 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +36.036 55.332 m +39.586 55.332 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +39.586 55.332 m +39.586 157.997 l +36.857 160.726 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +36.036 29.534 m +36.036 55.332 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +36.036 151.711 m +32.486 151.711 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +32.486 151.711 m +32.486 157.896 l +29.657 160.726 l +S +1 J +1 j +1.13 w +1.00 0.00 0.00 RG /a0 gs +36.036 125.914 m +36.036 151.711 l +S +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +37.875 154.404 m +37.875 149.018 l +34.190 149.018 l +34.190 154.404 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +37.875 128.609 m +37.875 123.223 l +34.190 123.223 l +34.190 128.609 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +25.116 154.404 m +25.116 149.018 l +21.432 149.018 l +21.432 154.404 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +25.116 128.609 m +25.116 123.223 l +21.432 123.223 l +21.432 128.609 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +37.875 106.215 m +37.875 100.829 l +34.190 100.829 l +34.190 106.215 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +37.875 80.420 m +37.875 75.034 l +34.190 75.034 l +34.190 80.420 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +25.116 106.215 m +25.116 100.829 l +21.432 100.829 l +21.432 106.215 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +25.116 80.420 m +25.116 75.034 l +21.432 75.034 l +21.432 80.420 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +37.875 58.026 m +37.875 52.640 l +34.190 52.640 l +34.190 58.026 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +37.875 32.231 m +37.875 26.845 l +34.190 26.845 l +34.190 32.231 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +25.116 58.026 m +25.116 52.640 l +21.432 52.640 l +21.432 58.026 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +25.116 32.231 m +25.116 26.845 l +21.432 26.845 l +21.432 32.231 l + h +f +1 J +1 j +0.58 w +1.00 0.00 0.00 RG /a0 gs +[] 0 d +30.182 190.980 m +30.182 187.502 l +28.440 189.245 m +31.918 189.245 l +S +1 J +1 j +72 M +0.75 g /a0 gs +[] 0 d +20.754 162.425 m +24.152 162.425 l +24.152 159.026 l +20.754 159.026 l + h +f +0.13 g +[] 0 d +23.58 160.73 m 23.58 161.35 23.08 161.86 22.45 161.86 c +21.83 161.86 21.32 161.35 21.32 160.73 c +21.32 160.10 21.83 159.60 22.45 159.60 c +23.08 159.60 23.58 160.10 23.58 160.73 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +24.15 167.93 m 24.15 168.86 23.39 169.62 22.45 169.62 c +21.51 169.62 20.75 168.86 20.75 167.93 c +20.75 166.99 21.51 166.23 22.45 166.23 c +23.39 166.23 24.15 166.99 24.15 167.93 c +f +0.13 g +[] 0 d +23.58 167.93 m 23.58 168.55 23.08 169.06 22.45 169.06 c +21.83 169.06 21.32 168.55 21.32 167.93 c +21.32 167.30 21.83 166.80 22.45 166.80 c +23.08 166.80 23.58 167.30 23.58 167.93 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +31.35 160.73 m 31.35 161.66 30.59 162.42 29.65 162.42 c +28.71 162.42 27.95 161.66 27.95 160.73 c +27.95 159.79 28.71 159.03 29.65 159.03 c +30.59 159.03 31.35 159.79 31.35 160.73 c +f +0.13 g +[] 0 d +30.78 160.73 m 30.78 161.35 30.28 161.86 29.65 161.86 c +29.03 161.86 28.52 161.35 28.52 160.73 c +28.52 160.10 29.03 159.60 29.65 159.60 c +30.28 159.60 30.78 160.10 30.78 160.73 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +31.35 167.93 m 31.35 168.86 30.59 169.62 29.65 169.62 c +28.71 169.62 27.95 168.86 27.95 167.93 c +27.95 166.99 28.71 166.23 29.65 166.23 c +30.59 166.23 31.35 166.99 31.35 167.93 c +f +0.13 g +[] 0 d +30.78 167.93 m 30.78 168.55 30.28 169.06 29.65 169.06 c +29.03 169.06 28.52 168.55 28.52 167.93 c +28.52 167.30 29.03 166.80 29.65 166.80 c +30.28 166.80 30.78 167.30 30.78 167.93 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +38.55 160.73 m 38.55 161.66 37.79 162.42 36.85 162.42 c +35.91 162.42 35.15 161.66 35.15 160.73 c +35.15 159.79 35.91 159.03 36.85 159.03 c +37.79 159.03 38.55 159.79 38.55 160.73 c +f +0.13 g +[] 0 d +37.98 160.73 m 37.98 161.35 37.48 161.86 36.85 161.86 c +36.23 161.86 35.72 161.35 35.72 160.73 c +35.72 160.10 36.23 159.60 36.85 159.60 c +37.48 159.60 37.98 160.10 37.98 160.73 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +38.55 167.93 m 38.55 168.86 37.79 169.62 36.85 169.62 c +35.91 169.62 35.15 168.86 35.15 167.93 c +35.15 166.99 35.91 166.23 36.85 166.23 c +37.79 166.23 38.55 166.99 38.55 167.93 c +f +0.13 g +[] 0 d +37.98 167.93 m 37.98 168.55 37.48 169.06 36.85 169.06 c +36.23 169.06 35.72 168.55 35.72 167.93 c +35.72 167.30 36.23 166.80 36.85 166.80 c +37.48 166.80 37.98 167.30 37.98 167.93 c +f +1 J +1 j +72 M +0.75 g /a0 gs +[] 0 d +37.455 185.632 m +40.389 185.632 l +40.389 182.705 l +37.455 182.705 l + h +f +0.13 g +[] 0 d +39.82 184.17 m 39.82 184.67 39.42 185.07 38.92 185.07 c +38.43 185.07 38.02 184.67 38.02 184.17 c +38.02 183.67 38.43 183.27 38.92 183.27 c +39.42 183.27 39.82 183.67 39.82 184.17 c +f +1 J +1 j +72 M +0.75 g /a0 gs +[] 0 d +30.255 185.632 m +33.189 185.632 l +33.189 182.705 l +30.255 182.705 l + h +f +0.13 g +[] 0 d +32.62 184.17 m 32.62 184.67 32.22 185.07 31.72 185.07 c +31.23 185.07 30.82 184.67 30.82 184.17 c +30.82 183.67 31.23 183.27 31.72 183.27 c +32.22 183.27 32.62 183.67 32.62 184.17 c +f +0.13 g +[] 0 d +32.53 116.14 m 32.53 117.73 31.24 119.02 29.65 119.02 c +28.06 119.02 26.77 117.73 26.77 116.14 c +26.77 114.55 28.06 113.26 29.65 113.26 c +31.24 113.26 32.53 114.55 32.53 116.14 c +f +0.13 g +[] 0 d +32.53 18.34 m 32.53 19.93 31.24 21.22 29.65 21.22 c +28.06 21.22 26.77 19.93 26.77 18.34 c +26.77 16.75 28.06 15.46 29.65 15.46 c +31.24 15.46 32.53 16.75 32.53 18.34 c +f +0.13 g +[] 0 d +25.45 185.59 m 25.45 187.18 24.16 188.47 22.57 188.47 c +20.98 188.47 19.69 187.18 19.69 185.59 c +19.69 183.99 20.98 182.71 22.57 182.71 c +24.16 182.71 25.45 183.99 25.45 185.59 c +f +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +18.853 171.526 m +18.853 164.326 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +18.853 164.326 m +18.853 157.126 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +18.853 157.126 m +26.053 157.126 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +26.053 157.126 m +40.453 157.126 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +40.453 157.126 m +40.453 171.526 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +40.453 171.526 m +18.853 171.526 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +26.053 164.326 m +18.853 164.326 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +26.053 164.326 m +26.053 157.126 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +38.441 147.601 m +38.441 130.026 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +20.862 130.022 m +38.437 130.022 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +20.866 130.026 m +20.866 147.601 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +38.441 147.601 m +20.866 147.601 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +38.441 99.412 m +38.441 81.837 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +20.862 81.834 m +38.437 81.834 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +20.866 81.837 m +20.866 99.412 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +38.441 99.412 m +20.866 99.412 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +38.441 51.223 m +38.441 33.648 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +20.862 33.645 m +38.437 33.645 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +20.866 33.648 m +20.866 51.223 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +38.441 51.223 m +20.866 51.223 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +28.969 176.594 m +28.969 174.240 l +28.818 173.794 l +28.674 173.650 l +28.379 173.506 l +28.084 173.506 l +27.788 173.650 l +27.637 173.794 l +27.493 174.240 l +27.493 174.535 l +31.705 176.594 m +30.229 176.594 l +30.085 175.270 l +30.229 175.414 l +30.676 175.565 l +31.115 175.565 l +31.561 175.414 l +31.849 175.126 l +32.000 174.679 l +32.000 174.384 l +31.849 173.945 l +31.561 173.650 l +31.115 173.506 l +30.676 173.506 l +30.229 173.650 l +30.085 173.794 l +29.941 174.089 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +27.979 120.216 m +27.684 120.511 l +27.245 120.655 l +26.654 120.655 l +26.215 120.511 l +25.920 120.216 l +25.920 119.921 l +26.064 119.626 l +26.215 119.475 l +26.510 119.331 l +27.396 119.035 l +27.684 118.891 l +27.835 118.740 l +27.979 118.445 l +27.979 118.006 l +27.684 117.711 l +27.245 117.567 l +26.654 117.567 l +26.215 117.711 l +25.920 118.006 l +28.951 120.655 m +29.693 117.567 l +30.427 120.655 m +29.693 117.567 l +30.427 120.655 m +31.162 117.567 l +31.896 120.655 m +31.162 117.567 l +32.868 120.065 m +33.163 120.216 l +33.610 120.655 l +33.610 117.567 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +28.339 71.571 m +28.044 71.866 l +27.605 72.010 l +27.014 72.010 l +26.575 71.866 l +26.280 71.571 l +26.280 71.276 l +26.424 70.980 l +26.575 70.829 l +26.870 70.685 l +27.756 70.390 l +28.044 70.246 l +28.195 70.095 l +28.339 69.800 l +28.339 69.360 l +28.044 69.065 l +27.605 68.921 l +27.014 68.921 l +26.575 69.065 l +26.280 69.360 l +29.311 72.010 m +30.053 68.921 l +30.787 72.010 m +30.053 68.921 l +30.787 72.010 m +31.522 68.921 l +32.256 72.010 m +31.522 68.921 l +33.379 71.276 m +33.379 71.420 l +33.523 71.715 l +33.674 71.866 l +33.970 72.010 l +34.560 72.010 l +34.848 71.866 l +34.999 71.715 l +35.143 71.420 l +35.143 71.124 l +34.999 70.829 l +34.704 70.390 l +33.228 68.921 l +35.294 68.921 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +27.979 24.726 m +27.684 25.021 l +27.245 25.165 l +26.654 25.165 l +26.215 25.021 l +25.920 24.726 l +25.920 24.430 l +26.064 24.135 l +26.215 23.984 l +26.510 23.840 l +27.396 23.545 l +27.684 23.401 l +27.835 23.250 l +27.979 22.954 l +27.979 22.515 l +27.684 22.220 l +27.245 22.076 l +26.654 22.076 l +26.215 22.220 l +25.920 22.515 l +28.951 25.165 m +29.693 22.076 l +30.427 25.165 m +29.693 22.076 l +30.427 25.165 m +31.162 22.076 l +31.896 25.165 m +31.162 22.076 l +33.163 25.165 m +34.783 25.165 l +33.905 23.984 l +34.344 23.984 l +34.639 23.840 l +34.783 23.696 l +34.934 23.250 l +34.934 22.954 l +34.783 22.515 l +34.488 22.220 l +34.049 22.076 l +33.610 22.076 l +33.163 22.220 l +33.019 22.364 l +32.868 22.659 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +42.749 189.957 m +42.749 186.868 l +42.749 189.957 m +44.074 189.957 l +44.513 189.813 l +44.665 189.662 l +44.809 189.366 l +44.809 189.071 l +44.665 188.776 l +44.513 188.632 l +44.074 188.488 l +42.749 188.488 l +43.779 188.488 m +44.809 186.868 l +45.781 189.366 m +46.076 189.518 l +46.522 189.957 l +46.522 186.868 l +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +36.85 144.57 m 36.85 145.37 36.21 146.01 35.41 146.01 c +34.62 146.01 33.97 145.37 33.97 144.57 c +33.97 143.78 34.62 143.13 35.41 143.13 c +36.21 143.13 36.85 143.78 36.85 144.57 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +36.85 133.05 m 36.85 133.85 36.21 134.49 35.41 134.49 c +34.62 134.49 33.97 133.85 33.97 133.05 c +33.97 132.26 34.62 131.61 35.41 131.61 c +36.21 131.61 36.85 132.26 36.85 133.05 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +25.33 144.57 m 25.33 145.37 24.69 146.01 23.89 146.01 c +23.10 146.01 22.45 145.37 22.45 144.57 c +22.45 143.78 23.10 143.13 23.89 143.13 c +24.69 143.13 25.33 143.78 25.33 144.57 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +25.33 133.05 m 25.33 133.85 24.69 134.49 23.89 134.49 c +23.10 134.49 22.45 133.85 22.45 133.05 c +22.45 132.26 23.10 131.61 23.89 131.61 c +24.69 131.61 25.33 132.26 25.33 133.05 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +33.61 138.81 m 33.61 141.00 31.84 142.77 29.65 142.77 c +27.47 142.77 25.69 141.00 25.69 138.81 c +25.69 136.63 27.47 134.85 29.65 134.85 c +31.84 134.85 33.61 136.63 33.61 138.81 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +36.85 96.38 m 36.85 97.18 36.21 97.82 35.41 97.82 c +34.62 97.82 33.97 97.18 33.97 96.38 c +33.97 95.59 34.62 94.94 35.41 94.94 c +36.21 94.94 36.85 95.59 36.85 96.38 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +36.85 84.86 m 36.85 85.66 36.21 86.30 35.41 86.30 c +34.62 86.30 33.97 85.66 33.97 84.86 c +33.97 84.07 34.62 83.42 35.41 83.42 c +36.21 83.42 36.85 84.07 36.85 84.86 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +25.33 96.38 m 25.33 97.18 24.69 97.82 23.89 97.82 c +23.10 97.82 22.45 97.18 22.45 96.38 c +22.45 95.59 23.10 94.94 23.89 94.94 c +24.69 94.94 25.33 95.59 25.33 96.38 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +25.33 84.86 m 25.33 85.66 24.69 86.30 23.89 86.30 c +23.10 86.30 22.45 85.66 22.45 84.86 c +22.45 84.07 23.10 83.42 23.89 83.42 c +24.69 83.42 25.33 84.07 25.33 84.86 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +33.61 90.62 m 33.61 92.81 31.84 94.58 29.65 94.58 c +27.47 94.58 25.69 92.81 25.69 90.62 c +25.69 88.44 27.47 86.66 29.65 86.66 c +31.84 86.66 33.61 88.44 33.61 90.62 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +36.85 48.20 m 36.85 48.99 36.21 49.64 35.41 49.64 c +34.62 49.64 33.97 48.99 33.97 48.20 c +33.97 47.40 34.62 46.76 35.41 46.76 c +36.21 46.76 36.85 47.40 36.85 48.20 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +36.85 36.68 m 36.85 37.47 36.21 38.12 35.41 38.12 c +34.62 38.12 33.97 37.47 33.97 36.68 c +33.97 35.88 34.62 35.24 35.41 35.24 c +36.21 35.24 36.85 35.88 36.85 36.68 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +25.33 48.20 m 25.33 48.99 24.69 49.64 23.89 49.64 c +23.10 49.64 22.45 48.99 22.45 48.20 c +22.45 47.40 23.10 46.76 23.89 46.76 c +24.69 46.76 25.33 47.40 25.33 48.20 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +25.33 36.68 m 25.33 37.47 24.69 38.12 23.89 38.12 c +23.10 38.12 22.45 37.47 22.45 36.68 c +22.45 35.88 23.10 35.24 23.89 35.24 c +24.69 35.24 25.33 35.88 25.33 36.68 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +33.61 42.44 m 33.61 44.62 31.84 46.40 29.65 46.40 c +27.47 46.40 25.69 44.62 25.69 42.44 c +25.69 40.25 27.47 38.48 29.65 38.48 c +31.84 38.48 33.61 40.25 33.61 42.44 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +41.44 184.17 m 41.44 187.55 38.70 190.29 35.32 190.29 c +31.94 190.29 29.20 187.55 29.20 184.17 c +29.20 180.79 31.94 178.05 35.32 178.05 c +38.70 178.05 41.44 180.79 41.44 184.17 c +S +1 J +1 j +0.72 w +1.00 0.00 1.00 RG /a0 gs +15.480 192.672 m +43.826 192.672 l +43.826 11.255 l +15.480 11.255 l +15.480 192.672 l +S +endstream +endobj +1 0 obj +<> +endobj +2 0 obj +<< +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << +>> +/XObject << +>> +/ExtGState << + /a0 << /CA 1.00 /ca 1.00 >> +>> +>> +endobj +5 0 obj +<< +/Producer (jsPDF 0.0.0) +/CreationDate (D:20230810231227-04'00') +>> +endobj +6 0 obj +<< +/Type /Catalog +/Pages 1 0 R +/OpenAction [3 0 R /FitH null] +/PageLayout /OneColumn +>> +endobj +xref +0 7 +0000000000 65535 f +0000047741 00000 n +0000047798 00000 n +0000000015 00000 n +0000000123 00000 n +0000047938 00000 n +0000048023 00000 n +trailer +<< +/Size 7 +/Root 6 0 R +/Info 5 0 R +/ID [ <45577F64AAFB97B6643C04123AA9731A> <45577F64AAFB97B6643C04123AA9731A> ] +>> +startxref +48126 +%%EOF \ No newline at end of file diff --git a/pcb/Production/PCB_MAIN.pdf b/pcb/Production/PCB_MAIN.pdf new file mode 100644 index 0000000..3e6728e --- /dev/null +++ b/pcb/Production/PCB_MAIN.pdf @@ -0,0 +1,19643 @@ +%PDF-1.4 +%ēßŦā +3 0 obj +<> +endobj +4 0 obj +<< +/Length 356797 +>> +stream +0.14 w +0 G +2 J +0 j +72 M +0.00 g +[] 0 d +0.00 230.26 334.44 -230.26 re +f +0.00 0.00 1.00 rg /a0 gs +[] 0 d +309.552 20.579 m +309.442 20.557 l +28.022 20.557 l +27.912 20.579 l +27.819 20.641 l +27.756 20.735 l +27.734 20.845 l +27.734 61.117 l +27.755 61.225 l +27.816 61.317 l +27.906 61.380 l +28.013 61.405 l +28.122 61.387 l +28.216 61.330 l +28.266 61.285 l +28.599 61.053 l +28.958 60.865 l +28.980 60.857 l +28.980 62.500 l +28.022 62.500 l +27.912 62.522 l +27.819 62.584 l +27.756 62.678 l +27.734 62.788 l +27.734 64.732 l +27.756 64.842 l +27.819 64.936 l +27.912 64.998 l +28.022 65.020 l +28.980 65.020 l +28.980 66.663 l +28.958 66.655 l +28.599 66.467 l +28.266 66.235 l +28.216 66.190 l +28.122 66.133 l +28.013 66.115 l +27.906 66.140 l +27.816 66.203 l +27.755 66.295 l +27.734 66.403 l +27.734 200.218 l +27.756 200.328 l +27.819 200.421 l +27.912 200.484 l +28.022 200.506 l +151.496 200.506 l +151.610 200.482 l +151.705 200.416 l +151.766 200.317 l +151.784 200.203 l +151.755 200.090 l +151.683 199.999 l +151.571 199.903 l +142.291 190.623 l +142.038 190.383 l +141.858 190.144 l +141.718 189.877 l +141.623 189.592 l +141.574 189.294 l +141.574 188.994 l +141.623 188.696 l +141.718 188.411 l +141.858 188.144 l +142.039 187.904 l +142.256 187.695 l +142.318 187.652 l +142.401 187.564 l +142.440 187.450 l +142.429 187.330 l +142.370 187.224 l +142.272 187.153 l +142.154 187.127 l +110.783 187.127 l +110.483 187.104 l +110.200 187.036 l +109.931 186.925 l +109.682 186.773 l +109.452 186.576 l +105.242 182.373 l +105.149 182.311 l +105.039 182.289 l +86.850 182.289 l +86.741 182.310 l +86.648 182.371 l +86.585 182.462 l +86.562 182.570 l +86.580 182.680 l +86.639 182.774 l +86.824 182.972 l +87.037 183.274 l +87.207 183.602 l +87.224 183.650 l +85.755 183.650 l +85.755 182.577 l +85.733 182.467 l +85.671 182.373 l +85.577 182.311 l +85.467 182.289 l +83.982 182.289 l +83.872 182.311 l +83.779 182.373 l +83.716 182.467 l +83.694 182.577 l +83.694 183.650 l +82.225 183.650 l +82.242 183.602 l +82.412 183.274 l +82.625 182.972 l +82.810 182.774 l +82.869 182.680 l +82.888 182.570 l +82.864 182.462 l +82.801 182.371 l +82.709 182.310 l +82.600 182.289 l +66.440 182.289 l +66.331 182.310 l +66.239 182.371 l +66.176 182.462 l +66.152 182.570 l +66.171 182.680 l +66.230 182.774 l +66.415 182.972 l +66.628 183.274 l +66.798 183.602 l +66.922 183.950 l +66.997 184.311 l +67.022 184.680 l +66.997 185.049 l +66.922 185.410 l +66.798 185.758 l +66.628 186.086 l +66.415 186.388 l +66.163 186.658 l +65.876 186.891 l +65.561 187.083 l +65.222 187.230 l +64.866 187.330 l +64.500 187.380 l +64.131 187.380 l +63.765 187.330 l +63.409 187.230 l +63.070 187.083 l +62.754 186.891 l +62.468 186.658 l +62.216 186.388 l +62.003 186.086 l +61.833 185.758 l +61.709 185.410 l +61.634 185.049 l +61.609 184.680 l +61.634 184.311 l +61.709 183.950 l +61.833 183.602 l +62.003 183.274 l +62.216 182.972 l +62.401 182.774 l +62.460 182.680 l +62.478 182.570 l +62.455 182.462 l +62.392 182.371 l +62.299 182.310 l +62.190 182.289 l +47.956 182.289 l +47.654 182.265 l +47.371 182.197 l +47.102 182.086 l +46.854 181.934 l +46.624 181.737 l +44.163 179.277 l +44.070 179.214 l +43.960 179.192 l +43.822 179.192 l +43.456 179.142 l +43.101 179.043 l +42.762 178.895 l +42.446 178.704 l +42.160 178.471 l +41.908 178.201 l +41.695 177.899 l +41.525 177.571 l +41.402 177.223 l +41.327 176.862 l +41.301 176.494 l +41.327 176.125 l +41.402 175.764 l +41.525 175.416 l +41.695 175.088 l +41.908 174.786 l +42.160 174.517 l +42.446 174.284 l +42.762 174.092 l +43.101 173.945 l +43.456 173.845 l +43.822 173.795 l +44.191 173.795 l +44.557 173.845 l +44.912 173.945 l +45.251 174.092 l +45.566 174.284 l +45.853 174.517 l +46.105 174.786 l +46.318 175.088 l +46.488 175.416 l +46.611 175.764 l +46.686 176.125 l +46.710 176.471 l +46.735 176.570 l +46.794 176.655 l +48.572 178.433 l +48.674 178.499 l +48.794 178.517 l +48.911 178.484 l +49.004 178.406 l +49.056 178.297 l +49.059 178.175 l +49.011 178.064 l +48.895 177.899 l +48.725 177.571 l +48.708 177.523 l +50.177 177.523 l +50.177 178.287 l +50.199 178.397 l +50.261 178.491 l +50.355 178.553 l +50.465 178.575 l +51.948 178.575 l +52.058 178.553 l +52.152 178.491 l +52.214 178.397 l +52.236 178.287 l +52.236 177.523 l +53.705 177.523 l +53.688 177.571 l +53.518 177.899 l +53.361 178.121 l +53.313 178.236 l +53.318 178.361 l +53.375 178.472 l +53.474 178.548 l +53.596 178.575 l +86.370 178.575 l +86.480 178.553 l +86.573 178.491 l +86.636 178.397 l +86.658 178.287 l +86.636 178.177 l +86.573 178.083 l +75.619 167.129 l +75.366 166.890 l +75.186 166.650 l +75.046 166.383 l +74.951 166.098 l +74.902 165.801 l +74.902 165.500 l +74.951 165.203 l +75.046 164.917 l +75.186 164.651 l +75.367 164.410 l +75.584 164.202 l +75.831 164.031 l +76.103 163.902 l +76.392 163.818 l +76.691 163.782 l +76.992 163.794 l +77.287 163.854 l +77.568 163.961 l +77.829 164.111 l +78.062 164.302 l +78.209 164.467 l +89.101 175.359 l +89.194 175.421 l +89.304 175.443 l +108.301 175.443 l +108.411 175.421 l +108.504 175.359 l +108.567 175.265 l +108.589 175.155 l +108.567 175.045 l +108.504 174.951 l +102.604 169.050 l +102.510 168.988 l +102.400 168.966 l +101.315 168.966 l +101.315 167.881 l +101.293 167.771 l +101.230 167.677 l +86.664 153.111 l +86.411 152.871 l +86.231 152.632 l +86.091 152.365 l +85.995 152.080 l +85.947 151.782 l +85.947 151.482 l +85.995 151.184 l +86.091 150.899 l +86.227 150.638 l +86.260 150.525 l +86.244 150.409 l +86.183 150.308 l +86.087 150.240 l +85.972 150.216 l +66.713 150.216 l +66.685 150.188 l +66.685 120.481 l +66.713 120.453 l +126.184 120.453 l +126.212 120.481 l +126.212 150.188 l +126.184 150.216 l +89.717 150.216 l +89.607 150.238 l +89.513 150.301 l +89.451 150.394 l +89.429 150.504 l +89.451 150.615 l +89.513 150.708 l +113.509 174.703 l +113.602 174.766 l +113.712 174.788 l +155.922 174.788 l +156.032 174.766 l +156.125 174.704 l +158.454 172.379 l +158.516 172.286 l +158.538 172.176 l +158.539 171.774 l +158.518 171.665 l +158.457 171.573 l +158.366 171.510 l +158.258 171.486 l +158.149 171.504 l +157.912 171.594 l +157.617 171.654 l +157.317 171.666 l +157.018 171.630 l +156.729 171.546 l +156.457 171.417 l +156.209 171.246 l +155.992 171.038 l +155.811 170.797 l +155.671 170.531 l +155.576 170.245 l +155.528 169.948 l +155.528 169.647 l +155.535 169.580 l +155.535 159.260 l +155.513 159.149 l +155.451 159.056 l +142.421 146.026 l +142.167 145.786 l +141.987 145.547 l +141.847 145.280 l +141.752 144.995 l +141.704 144.698 l +141.704 144.397 l +141.711 144.329 l +141.711 73.896 l +141.689 73.786 l +141.627 73.693 l +103.454 35.520 l +103.271 35.308 l +103.116 35.061 l +103.001 34.793 l +102.930 34.511 l +102.903 34.209 l +102.861 30.479 l +102.832 30.355 l +102.753 30.257 l +102.561 30.103 l +102.278 29.812 l +102.036 29.487 l +101.837 29.133 l +101.684 28.757 l +101.582 28.365 l +101.530 27.963 l +101.530 27.557 l +101.582 27.154 l +101.684 26.762 l +101.837 26.386 l +102.036 26.033 l +102.278 25.707 l +102.561 25.416 l +102.878 25.163 l +103.225 24.953 l +103.596 24.789 l +103.985 24.673 l +104.385 24.608 l +104.791 24.595 l +105.194 24.634 l +105.590 24.725 l +105.971 24.865 l +106.330 25.052 l +106.663 25.284 l +106.963 25.557 l +107.226 25.866 l +107.448 26.206 l +107.624 26.572 l +107.752 26.957 l +107.829 27.355 l +107.855 27.760 l +107.829 28.165 l +107.752 28.563 l +107.624 28.948 l +107.448 29.313 l +107.226 29.653 l +106.963 29.962 l +106.669 30.229 l +106.599 30.327 l +106.575 30.446 l +106.607 33.305 l +106.630 33.413 l +106.691 33.505 l +144.873 71.687 l +145.070 71.917 l +145.222 72.165 l +145.333 72.434 l +145.401 72.718 l +145.425 73.019 l +145.425 143.659 l +145.447 143.769 l +145.509 143.862 l +158.065 156.419 l +158.159 156.481 l +158.269 156.503 l +158.379 156.481 l +158.473 156.419 l +158.535 156.325 l +158.557 156.215 l +158.652 75.374 l +158.629 75.262 l +158.565 75.167 l +117.873 35.538 l +117.673 35.311 l +117.518 35.064 l +117.403 34.797 l +117.331 34.515 l +117.303 34.214 l +117.261 30.479 l +117.232 30.355 l +117.153 30.257 l +116.961 30.103 l +116.678 29.812 l +116.436 29.487 l +116.237 29.133 l +116.084 28.757 l +115.982 28.365 l +115.930 27.963 l +115.930 27.557 l +115.982 27.154 l +116.084 26.762 l +116.237 26.386 l +116.436 26.033 l +116.678 25.707 l +116.961 25.416 l +117.278 25.163 l +117.625 24.953 l +117.996 24.789 l +118.385 24.673 l +118.785 24.608 l +119.191 24.595 l +119.594 24.634 l +119.990 24.725 l +120.371 24.865 l +120.730 25.052 l +121.063 25.284 l +121.363 25.557 l +121.626 25.866 l +121.848 26.206 l +122.024 26.572 l +122.152 26.957 l +122.229 27.355 l +122.255 27.760 l +122.229 28.165 l +122.152 28.563 l +122.024 28.948 l +121.848 29.313 l +121.626 29.653 l +121.363 29.962 l +121.069 30.229 l +120.999 30.327 l +120.975 30.446 l +121.007 33.288 l +121.030 33.398 l +121.094 33.491 l +161.797 73.131 l +161.997 73.359 l +162.152 73.605 l +162.267 73.873 l +162.339 74.154 l +162.367 74.484 l +162.251 173.057 l +162.227 173.359 l +162.159 173.642 l +162.047 173.911 l +161.895 174.159 l +161.698 174.389 l +158.250 177.830 l +158.104 177.994 l +157.871 178.184 l +157.611 178.334 l +157.329 178.441 l +157.034 178.501 l +156.733 178.513 l +156.619 178.502 l +113.037 178.502 l +112.927 178.524 l +112.834 178.586 l +112.771 178.679 l +112.749 178.790 l +112.771 178.900 l +112.833 178.993 l +114.186 180.348 l +114.280 180.411 l +114.390 180.433 l +175.193 180.433 l +175.303 180.411 l +175.396 180.348 l +175.459 180.255 l +175.481 180.145 l +175.459 180.035 l +175.397 179.942 l +174.825 179.366 l +174.632 179.140 l +174.480 178.891 l +174.368 178.622 l +174.300 178.339 l +174.277 178.037 l +174.277 135.096 l +174.255 134.986 l +174.192 134.893 l +167.427 128.127 l +167.230 127.897 l +167.078 127.649 l +166.967 127.380 l +166.899 127.097 l +166.875 126.795 l +166.875 82.951 l +166.868 82.884 l +166.868 82.583 l +166.875 82.515 l +166.875 81.790 l +166.899 81.488 l +166.967 81.205 l +167.078 80.936 l +167.230 80.687 l +167.420 80.466 l +167.641 80.277 l +167.889 80.125 l +168.158 80.013 l +168.442 79.945 l +168.732 79.922 l +169.022 79.945 l +169.306 80.013 l +169.575 80.125 l +169.823 80.277 l +170.052 80.475 l +170.140 80.545 l +170.249 80.575 l +170.360 80.562 l +170.458 80.507 l +170.643 80.349 l +170.892 80.197 l +171.161 80.085 l +171.444 80.017 l +171.734 79.994 l +172.025 80.017 l +172.308 80.085 l +172.577 80.197 l +172.825 80.349 l +173.047 80.538 l +173.236 80.759 l +173.388 81.008 l +173.500 81.277 l +173.568 81.560 l +173.591 81.862 l +173.592 82.581 l +173.605 82.733 l +173.591 82.909 l +173.591 113.585 l +173.618 113.707 l +173.694 113.806 l +173.805 113.863 l +173.930 113.869 l +174.045 113.821 l +174.399 113.572 l +174.758 113.385 l +174.780 113.377 l +174.780 115.020 l +173.879 115.020 l +173.769 115.042 l +173.676 115.104 l +173.613 115.198 l +173.591 115.308 l +173.591 117.252 l +173.613 117.362 l +173.676 117.456 l +173.769 117.518 l +173.879 117.540 l +174.780 117.540 l +174.780 119.183 l +174.758 119.175 l +174.399 118.988 l +174.045 118.739 l +173.930 118.691 l +173.805 118.697 l +173.694 118.754 l +173.618 118.853 l +173.591 118.975 l +173.591 122.584 l +173.613 122.695 l +173.676 122.788 l +181.096 130.209 l +181.293 130.439 l +181.445 130.687 l +181.556 130.956 l +181.624 131.239 l +181.648 131.541 l +181.648 147.201 l +181.670 147.311 l +181.733 147.405 l +182.018 147.690 l +182.214 147.920 l +182.367 148.169 l +182.478 148.438 l +182.546 148.721 l +182.570 149.023 l +182.570 173.474 l +182.583 173.650 l +182.559 173.950 l +182.487 174.242 l +182.369 174.519 l +182.208 174.773 l +182.008 174.998 l +181.775 175.189 l +181.515 175.339 l +181.233 175.446 l +180.938 175.506 l +180.637 175.518 l +180.339 175.482 l +180.050 175.398 l +179.778 175.269 l +179.530 175.098 l +179.313 174.890 l +179.132 174.649 l +178.992 174.383 l +178.897 174.097 l +178.849 173.800 l +178.849 173.499 l +178.856 173.432 l +178.856 149.900 l +178.834 149.789 l +178.771 149.696 l +178.638 149.563 l +178.476 149.410 l +178.383 149.351 l +178.273 149.331 l +178.165 149.355 l +178.073 149.417 l +178.012 149.510 l +177.991 149.619 l +177.991 177.164 l +178.012 177.274 l +178.074 177.367 l +178.554 177.850 l +178.660 177.938 l +178.860 178.164 l +179.021 178.418 l +179.139 178.695 l +179.211 178.987 l +179.235 179.287 l +179.211 179.587 l +179.139 179.879 l +179.074 180.032 l +179.051 180.142 l +179.072 180.253 l +179.134 180.347 l +179.228 180.411 l +179.339 180.433 l +193.943 180.433 l +194.053 180.411 l +194.147 180.348 l +199.373 175.116 l +199.430 175.045 l +199.647 174.836 l +199.895 174.665 l +200.166 174.536 l +200.456 174.452 l +200.754 174.416 l +201.055 174.428 l +201.350 174.488 l +201.631 174.595 l +201.892 174.746 l +202.125 174.936 l +202.325 175.161 l +202.486 175.416 l +202.604 175.693 l +202.676 175.985 l +202.700 176.285 l +202.676 176.585 l +202.604 176.877 l +202.483 177.160 l +202.460 177.271 l +202.481 177.381 l +202.543 177.476 l +202.636 177.539 l +202.747 177.561 l +202.858 177.539 l +202.951 177.477 l +205.413 175.016 l +205.643 174.819 l +205.891 174.667 l +206.160 174.556 l +206.443 174.488 l +206.745 174.464 l +213.433 174.464 l +213.734 174.488 l +214.018 174.556 l +214.287 174.667 l +214.535 174.819 l +214.765 175.016 l +215.626 175.877 l +215.720 175.940 l +215.830 175.961 l +222.867 175.961 l +222.977 175.940 l +223.071 175.877 l +223.133 175.784 l +223.155 175.673 l +223.133 175.563 l +223.071 175.470 l +221.385 173.784 l +221.291 173.721 l +221.181 173.699 l +196.550 173.699 l +196.249 173.676 l +195.966 173.608 l +195.696 173.496 l +195.448 173.344 l +195.218 173.148 l +185.801 163.738 l +185.547 163.498 l +185.367 163.259 l +185.227 162.992 l +185.132 162.707 l +185.084 162.410 l +185.084 162.109 l +185.132 161.812 l +185.227 161.526 l +185.367 161.260 l +185.548 161.019 l +185.765 160.811 l +186.013 160.640 l +186.285 160.511 l +186.574 160.427 l +186.873 160.391 l +187.173 160.403 l +187.468 160.463 l +187.750 160.570 l +188.010 160.720 l +188.244 160.910 l +188.390 161.075 l +197.223 169.901 l +197.316 169.964 l +197.426 169.985 l +204.803 169.985 l +204.917 169.962 l +205.012 169.896 l +205.074 169.797 l +205.091 169.682 l +205.061 169.570 l +204.990 169.478 l +204.797 169.314 l +204.525 169.014 l +204.293 168.681 l +204.105 168.322 l +204.097 168.300 l +205.740 168.300 l +205.740 169.697 l +205.762 169.808 l +205.824 169.901 l +205.918 169.964 l +206.028 169.985 l +207.972 169.985 l +208.082 169.964 l +208.176 169.901 l +208.238 169.808 l +208.260 169.697 l +208.260 168.300 l +209.903 168.300 l +209.895 168.322 l +209.707 168.681 l +209.475 169.014 l +209.203 169.314 l +209.010 169.478 l +208.939 169.570 l +208.909 169.682 l +208.926 169.797 l +208.988 169.896 l +209.083 169.962 l +209.197 169.985 l +212.003 169.985 l +212.117 169.962 l +212.212 169.896 l +212.274 169.797 l +212.291 169.682 l +212.261 169.570 l +212.190 169.478 l +211.997 169.314 l +211.725 169.014 l +211.493 168.681 l +211.305 168.322 l +211.165 167.941 l +211.075 167.545 l +211.036 167.141 l +211.049 166.736 l +211.113 166.336 l +211.229 165.947 l +211.393 165.576 l +211.603 165.229 l +211.856 164.912 l +212.148 164.629 l +212.473 164.387 l +212.826 164.188 l +213.202 164.035 l +213.595 163.932 l +213.997 163.881 l +214.403 163.881 l +214.805 163.932 l +215.198 164.035 l +215.574 164.188 l +215.927 164.387 l +216.252 164.629 l +216.544 164.912 l +216.797 165.229 l +217.007 165.576 l +217.171 165.947 l +217.287 166.336 l +217.351 166.736 l +217.364 167.141 l +217.325 167.545 l +217.235 167.941 l +217.095 168.322 l +216.907 168.681 l +216.675 169.014 l +216.403 169.314 l +216.210 169.478 l +216.139 169.570 l +216.109 169.682 l +216.126 169.797 l +216.188 169.896 l +216.283 169.962 l +216.397 169.985 l +219.203 169.985 l +219.317 169.962 l +219.412 169.896 l +219.474 169.797 l +219.491 169.682 l +219.461 169.570 l +219.390 169.478 l +219.197 169.314 l +218.925 169.014 l +218.693 168.681 l +218.505 168.322 l +218.365 167.941 l +218.275 167.545 l +218.236 167.141 l +218.249 166.736 l +218.313 166.336 l +218.429 165.947 l +218.593 165.576 l +218.803 165.229 l +219.056 164.912 l +219.348 164.629 l +219.673 164.387 l +220.026 164.188 l +220.402 164.035 l +220.795 163.932 l +221.197 163.881 l +221.603 163.881 l +222.005 163.932 l +222.398 164.035 l +222.774 164.188 l +223.127 164.387 l +223.452 164.629 l +223.744 164.912 l +223.997 165.229 l +224.207 165.576 l +224.371 165.947 l +224.487 166.336 l +224.551 166.736 l +224.564 167.141 l +224.525 167.545 l +224.435 167.941 l +224.295 168.322 l +224.107 168.681 l +223.875 169.014 l +223.603 169.314 l +223.294 169.577 l +223.007 169.764 l +222.925 169.845 l +222.881 169.951 l +222.883 170.067 l +222.929 170.172 l +223.014 170.251 l +223.161 170.341 l +223.391 170.537 l +225.920 173.066 l +226.029 173.158 l +226.229 173.383 l +226.390 173.637 l +226.470 173.826 l +226.533 173.918 l +226.626 173.979 l +226.736 174.001 l +226.845 173.978 l +226.938 173.916 l +230.791 170.063 l +230.857 169.963 l +230.875 169.844 l +230.844 169.729 l +230.769 169.636 l +230.662 169.581 l +230.543 169.575 l +230.431 169.618 l +230.154 169.799 l +229.788 169.975 l +229.403 170.102 l +229.005 170.180 l +228.600 170.206 l +228.195 170.180 l +227.797 170.102 l +227.412 169.975 l +227.046 169.799 l +226.706 169.577 l +226.397 169.314 l +226.125 169.014 l +225.893 168.681 l +225.705 168.322 l +225.565 167.941 l +225.475 167.545 l +225.436 167.141 l +225.449 166.736 l +225.513 166.336 l +225.629 165.947 l +225.793 165.576 l +226.003 165.229 l +226.256 164.912 l +226.548 164.629 l +226.873 164.387 l +227.226 164.188 l +227.602 164.035 l +227.995 163.932 l +228.397 163.881 l +228.803 163.881 l +229.205 163.932 l +229.598 164.035 l +229.974 164.188 l +230.327 164.387 l +230.652 164.629 l +230.944 164.912 l +231.197 165.229 l +231.407 165.576 l +231.571 165.947 l +231.687 166.336 l +231.751 166.736 l +231.764 167.141 l +231.725 167.545 l +231.635 167.941 l +231.495 168.322 l +231.307 168.681 l +231.174 168.872 l +231.127 168.984 l +231.130 169.105 l +231.183 169.214 l +231.276 169.292 l +231.392 169.325 l +231.512 169.307 l +231.614 169.241 l +232.680 168.175 l +232.736 168.096 l +232.763 168.003 l +232.757 167.907 l +232.675 167.545 l +232.636 167.141 l +232.649 166.736 l +232.713 166.336 l +232.829 165.947 l +232.993 165.576 l +233.203 165.229 l +233.456 164.912 l +233.748 164.629 l +234.073 164.387 l +234.426 164.188 l +234.802 164.035 l +235.195 163.932 l +235.597 163.881 l +236.003 163.881 l +236.405 163.932 l +236.798 164.035 l +237.174 164.188 l +237.527 164.387 l +237.852 164.629 l +238.144 164.912 l +238.397 165.229 l +238.607 165.576 l +238.771 165.947 l +238.887 166.336 l +238.951 166.736 l +238.964 167.141 l +238.925 167.545 l +238.835 167.941 l +238.695 168.322 l +238.507 168.681 l +238.275 169.014 l +238.003 169.314 l +237.694 169.577 l +237.354 169.799 l +236.988 169.975 l +236.603 170.102 l +236.205 170.180 l +236.016 170.192 l +235.916 170.217 l +235.831 170.276 l +227.325 178.782 l +227.263 178.875 l +227.241 178.985 l +227.263 179.096 l +227.325 179.189 l +227.419 179.252 l +227.529 179.273 l +235.221 179.273 l +235.331 179.252 l +235.425 179.189 l +244.016 170.598 l +244.082 170.496 l +244.100 170.376 l +244.067 170.259 l +243.989 170.166 l +243.879 170.114 l +243.758 170.111 l +243.405 170.180 l +243.000 170.206 l +242.595 170.180 l +242.197 170.102 l +241.812 169.975 l +241.446 169.799 l +241.106 169.577 l +240.797 169.314 l +240.525 169.014 l +240.293 168.681 l +240.105 168.322 l +239.965 167.941 l +239.875 167.545 l +239.836 167.141 l +239.849 166.736 l +239.913 166.336 l +240.029 165.947 l +240.193 165.576 l +240.403 165.229 l +240.656 164.912 l +240.948 164.629 l +241.273 164.387 l +241.626 164.188 l +242.002 164.035 l +242.395 163.932 l +242.797 163.881 l +243.203 163.881 l +243.605 163.932 l +243.998 164.035 l +244.374 164.188 l +244.727 164.387 l +245.052 164.629 l +245.344 164.912 l +245.597 165.229 l +245.807 165.576 l +245.971 165.947 l +246.087 166.336 l +246.151 166.736 l +246.164 167.141 l +246.125 167.545 l +246.069 167.793 l +246.068 167.916 l +246.118 168.028 l +246.210 168.109 l +246.328 168.144 l +246.450 168.127 l +246.553 168.061 l +246.978 167.636 l +247.045 167.530 l +247.061 167.405 l +247.036 167.141 l +247.049 166.736 l +247.113 166.336 l +247.229 165.947 l +247.393 165.576 l +247.603 165.229 l +247.856 164.912 l +248.148 164.629 l +248.473 164.387 l +248.826 164.188 l +249.202 164.035 l +249.595 163.932 l +249.997 163.881 l +250.403 163.881 l +250.805 163.932 l +251.198 164.035 l +251.574 164.188 l +251.927 164.387 l +252.252 164.629 l +252.544 164.912 l +252.797 165.229 l +253.007 165.576 l +253.171 165.947 l +253.287 166.336 l +253.351 166.736 l +253.364 167.141 l +253.325 167.545 l +253.235 167.941 l +253.095 168.322 l +252.907 168.681 l +252.675 169.014 l +252.403 169.314 l +252.094 169.577 l +251.754 169.799 l +251.388 169.975 l +251.003 170.102 l +250.605 170.180 l +250.200 170.206 l +249.823 170.182 l +249.703 170.200 l +249.601 170.266 l +237.431 182.435 l +237.201 182.632 l +236.952 182.784 l +236.683 182.896 l +236.400 182.964 l +236.098 182.987 l +212.548 182.987 l +212.246 182.964 l +211.963 182.896 l +211.694 182.784 l +211.446 182.632 l +211.216 182.435 l +210.030 181.250 l +209.937 181.188 l +209.827 181.166 l +208.858 181.166 l +208.748 181.188 l +208.655 181.250 l +208.143 181.760 l +208.080 181.853 l +208.058 181.964 l +208.058 183.460 l +208.080 183.570 l +208.142 183.664 l +216.513 192.027 l +216.709 192.257 l +216.861 192.506 l +216.973 192.775 l +217.041 193.058 l +217.065 193.359 l +217.065 196.203 l +217.041 196.505 l +216.973 196.788 l +216.862 197.057 l +216.710 197.305 l +216.513 197.535 l +214.146 199.903 l +214.034 199.999 l +213.962 200.090 l +213.933 200.203 l +213.950 200.317 l +214.012 200.416 l +214.107 200.482 l +214.221 200.506 l +309.442 200.506 l +309.552 200.484 l +309.646 200.421 l +309.708 200.328 l +309.730 200.218 l +309.730 80.503 l +309.708 80.393 l +309.646 80.299 l +309.552 80.237 l +309.442 80.215 l +305.104 80.215 l +304.894 80.194 l +304.705 80.137 l +304.531 80.044 l +304.379 79.919 l +304.254 79.767 l +304.161 79.593 l +304.104 79.405 l +304.083 79.194 l +304.083 69.585 l +304.104 69.374 l +304.161 69.186 l +304.254 69.012 l +304.379 68.860 l +304.531 68.735 l +304.705 68.642 l +304.894 68.585 l +305.104 68.564 l +309.442 68.564 l +309.552 68.542 l +309.646 68.480 l +309.708 68.386 l +309.730 68.276 l +309.730 20.845 l +309.708 20.735 l +309.646 20.641 l +309.552 20.579 l +h +243.203 113.481 m +243.605 113.532 l +243.998 113.635 l +244.374 113.788 l +244.727 113.987 l +245.052 114.229 l +245.344 114.512 l +245.597 114.829 l +245.807 115.176 l +245.971 115.547 l +246.087 115.936 l +246.151 116.336 l +246.164 116.741 l +246.125 117.145 l +246.035 117.541 l +245.895 117.922 l +245.707 118.281 l +245.475 118.614 l +245.203 118.914 l +245.108 119.026 l +245.078 119.138 l +245.096 119.253 l +245.157 119.352 l +245.252 119.418 l +245.366 119.441 l +247.834 119.441 l +247.948 119.418 l +248.043 119.352 l +248.104 119.253 l +248.122 119.138 l +248.092 119.026 l +247.997 118.914 l +247.725 118.614 l +247.493 118.281 l +247.305 117.922 l +247.165 117.541 l +247.075 117.145 l +247.036 116.741 l +247.049 116.336 l +247.113 115.936 l +247.229 115.547 l +247.393 115.176 l +247.603 114.829 l +247.856 114.512 l +248.148 114.229 l +248.473 113.987 l +248.826 113.788 l +249.202 113.635 l +249.595 113.532 l +249.997 113.481 l +250.403 113.481 l +250.805 113.532 l +251.198 113.635 l +251.574 113.788 l +251.927 113.987 l +252.252 114.229 l +252.544 114.512 l +252.797 114.829 l +253.007 115.176 l +253.171 115.547 l +253.287 115.936 l +253.351 116.336 l +253.364 116.741 l +253.325 117.145 l +253.235 117.541 l +253.095 117.922 l +252.907 118.281 l +252.675 118.614 l +252.403 118.914 l +252.308 119.026 l +252.278 119.138 l +252.296 119.253 l +252.357 119.352 l +252.452 119.418 l +252.566 119.441 l +255.034 119.441 l +255.148 119.418 l +255.243 119.352 l +255.304 119.253 l +255.322 119.138 l +255.292 119.026 l +255.197 118.914 l +254.925 118.614 l +254.693 118.281 l +254.505 117.922 l +254.365 117.541 l +254.275 117.145 l +254.236 116.741 l +254.249 116.336 l +254.313 115.936 l +254.429 115.547 l +254.593 115.176 l +254.803 114.829 l +255.056 114.512 l +255.348 114.229 l +255.673 113.987 l +256.026 113.788 l +256.402 113.635 l +256.795 113.532 l +257.197 113.481 l +257.603 113.481 l +258.005 113.532 l +258.398 113.635 l +258.774 113.788 l +259.127 113.987 l +259.452 114.229 l +259.744 114.512 l +259.997 114.829 l +260.207 115.176 l +260.371 115.547 l +260.487 115.936 l +260.551 116.336 l +260.564 116.741 l +260.525 117.145 l +260.435 117.541 l +260.295 117.922 l +260.107 118.281 l +259.875 118.614 l +259.603 118.914 l +259.508 119.026 l +259.478 119.138 l +259.496 119.253 l +259.557 119.352 l +259.652 119.418 l +259.766 119.441 l +262.234 119.441 l +262.348 119.418 l +262.443 119.352 l +262.504 119.253 l +262.522 119.138 l +262.492 119.026 l +262.397 118.914 l +262.125 118.614 l +261.893 118.281 l +261.705 117.922 l +261.697 117.900 l +263.340 117.900 l +263.340 119.153 l +263.362 119.264 l +263.424 119.357 l +263.518 119.420 l +263.628 119.441 l +265.572 119.441 l +265.682 119.420 l +265.776 119.357 l +265.838 119.264 l +265.860 119.153 l +265.860 117.900 l +267.795 117.900 l +267.905 117.878 l +267.998 117.816 l +268.578 117.236 l +268.645 117.130 l +268.661 117.005 l +268.636 116.741 l +268.649 116.336 l +268.713 115.936 l +268.829 115.547 l +268.993 115.176 l +269.203 114.829 l +269.456 114.512 l +269.748 114.229 l +270.073 113.987 l +270.426 113.788 l +270.802 113.635 l +271.195 113.532 l +271.597 113.481 l +272.003 113.481 l +272.405 113.532 l +272.798 113.635 l +273.174 113.788 l +273.527 113.987 l +273.852 114.229 l +274.144 114.512 l +274.397 114.829 l +274.607 115.176 l +274.771 115.547 l +274.887 115.936 l +274.951 116.336 l +274.964 116.741 l +274.939 117.005 l +274.955 117.130 l +275.022 117.236 l +289.636 131.850 l +289.833 132.080 l +289.985 132.329 l +290.096 132.598 l +290.164 132.881 l +290.188 133.183 l +290.188 133.326 l +290.216 133.449 l +290.293 133.548 l +290.405 133.605 l +290.530 133.609 l +290.830 133.552 l +291.240 133.526 l +291.650 133.552 l +292.054 133.629 l +292.445 133.756 l +292.817 133.931 l +293.164 134.152 l +293.481 134.414 l +293.762 134.713 l +294.004 135.046 l +294.202 135.406 l +294.353 135.788 l +294.456 136.187 l +294.507 136.594 l +294.507 137.006 l +294.456 137.413 l +294.353 137.812 l +294.202 138.194 l +294.004 138.554 l +293.762 138.887 l +293.481 139.186 l +293.164 139.448 l +292.817 139.669 l +292.445 139.844 l +292.054 139.971 l +291.650 140.048 l +291.240 140.074 l +290.830 140.048 l +290.426 139.971 l +290.035 139.844 l +289.663 139.669 l +289.316 139.448 l +288.995 139.182 l +288.902 139.116 l +288.790 139.091 l +288.677 139.113 l +288.582 139.176 l +288.199 139.558 l +288.136 139.652 l +288.115 139.762 l +288.115 149.057 l +288.139 149.174 l +288.210 149.271 l +288.314 149.331 l +288.433 149.343 l +288.547 149.306 l +288.636 149.226 l +288.718 149.113 l +288.999 148.814 l +289.316 148.552 l +289.663 148.331 l +290.035 148.156 l +290.426 148.029 l +290.830 147.952 l +291.240 147.926 l +291.650 147.952 l +292.054 148.029 l +292.445 148.156 l +292.817 148.331 l +293.164 148.552 l +293.481 148.814 l +293.762 149.113 l +294.004 149.446 l +294.202 149.806 l +294.353 150.188 l +294.456 150.587 l +294.507 150.994 l +294.507 151.406 l +294.456 151.813 l +294.353 152.212 l +294.202 152.594 l +294.004 152.954 l +293.762 153.287 l +293.481 153.586 l +293.164 153.848 l +292.817 154.069 l +292.445 154.244 l +292.054 154.371 l +291.650 154.448 l +291.240 154.474 l +290.830 154.448 l +290.426 154.371 l +290.035 154.244 l +289.663 154.069 l +289.316 153.848 l +288.999 153.586 l +288.718 153.287 l +288.636 153.174 l +288.547 153.094 l +288.433 153.057 l +288.314 153.069 l +288.210 153.129 l +288.139 153.226 l +288.115 153.343 l +288.115 166.383 l +288.140 166.502 l +288.213 166.600 l +288.515 166.759 l +288.668 166.884 l +288.793 167.036 l +288.885 167.210 l +288.943 167.398 l +288.963 167.609 l +288.963 170.979 l +288.943 171.189 l +288.885 171.377 l +288.793 171.551 l +288.668 171.704 l +288.515 171.829 l +288.341 171.921 l +288.153 171.979 l +287.943 171.999 l +284.573 171.999 l +284.362 171.979 l +284.174 171.921 l +284.000 171.829 l +283.848 171.704 l +283.723 171.551 l +283.630 171.377 l +283.573 171.189 l +283.552 170.979 l +283.552 167.609 l +283.573 167.398 l +283.630 167.210 l +283.723 167.036 l +283.848 166.884 l +284.000 166.759 l +284.303 166.600 l +284.375 166.502 l +284.401 166.383 l +284.401 138.885 l +284.424 138.583 l +284.492 138.300 l +284.604 138.031 l +284.756 137.783 l +284.953 137.553 l +286.390 136.115 l +286.452 136.022 l +286.474 135.912 l +286.474 134.060 l +286.452 133.949 l +286.390 133.856 l +272.399 119.866 l +272.297 119.800 l +272.177 119.782 l +271.800 119.806 l +271.423 119.782 l +271.303 119.800 l +271.201 119.866 l +268.463 122.603 l +268.233 122.800 l +267.984 122.952 l +267.715 123.064 l +267.432 123.132 l +267.130 123.155 l +230.745 123.155 l +230.635 123.177 l +230.541 123.240 l +230.479 123.333 l +230.457 123.443 l +230.457 138.229 l +230.433 138.530 l +230.365 138.814 l +230.254 139.083 l +230.102 139.331 l +229.905 139.561 l +213.180 156.286 l +213.113 156.391 l +213.096 156.515 l +213.133 156.633 l +213.217 156.725 l +213.332 156.774 l +213.456 156.769 l +213.595 156.732 l +213.997 156.681 l +214.403 156.681 l +214.805 156.732 l +215.198 156.835 l +215.574 156.988 l +215.927 157.187 l +216.252 157.429 l +216.544 157.712 l +216.797 158.029 l +217.007 158.376 l +217.171 158.747 l +217.287 159.136 l +217.351 159.536 l +217.364 159.941 l +217.325 160.345 l +217.235 160.741 l +217.095 161.122 l +216.907 161.481 l +216.675 161.814 l +216.403 162.114 l +216.094 162.377 l +215.754 162.599 l +215.388 162.775 l +215.003 162.902 l +214.605 162.980 l +214.200 163.006 l +213.795 162.980 l +213.397 162.902 l +213.012 162.775 l +212.646 162.599 l +212.306 162.377 l +211.997 162.114 l +211.725 161.814 l +211.493 161.481 l +211.305 161.122 l +211.165 160.741 l +211.075 160.345 l +211.036 159.941 l +211.049 159.536 l +211.113 159.136 l +211.129 158.985 l +211.084 158.868 l +210.992 158.781 l +210.872 158.742 l +210.747 158.758 l +210.641 158.825 l +210.225 159.241 l +210.172 159.315 l +210.144 159.401 l +210.151 159.536 l +210.164 159.941 l +210.125 160.345 l +210.035 160.741 l +209.895 161.122 l +209.707 161.481 l +209.475 161.814 l +209.203 162.114 l +208.894 162.377 l +208.554 162.599 l +208.188 162.775 l +207.803 162.902 l +207.405 162.980 l +207.000 163.006 l +206.595 162.980 l +206.197 162.902 l +205.812 162.775 l +205.446 162.599 l +205.106 162.377 l +204.797 162.114 l +204.525 161.814 l +204.293 161.481 l +204.105 161.122 l +203.965 160.741 l +203.875 160.345 l +203.836 159.941 l +203.849 159.536 l +203.913 159.136 l +204.029 158.747 l +204.193 158.376 l +204.403 158.029 l +204.656 157.712 l +204.948 157.429 l +205.273 157.187 l +205.626 156.988 l +206.002 156.835 l +206.395 156.732 l +206.797 156.681 l +207.203 156.681 l +207.355 156.700 l +207.443 156.698 l +207.525 156.670 l +207.596 156.618 l +226.659 137.555 l +226.721 137.462 l +226.743 137.352 l +226.743 119.341 l +226.716 119.221 l +226.642 119.122 l +226.397 118.914 l +226.125 118.614 l +225.893 118.281 l +225.705 117.922 l +225.565 117.541 l +225.475 117.145 l +225.436 116.741 l +225.449 116.336 l +225.513 115.936 l +225.629 115.547 l +225.793 115.176 l +226.003 114.829 l +226.256 114.512 l +226.548 114.229 l +226.873 113.987 l +227.226 113.788 l +227.602 113.635 l +227.995 113.532 l +228.397 113.481 l +228.803 113.481 l +229.205 113.532 l +229.598 113.635 l +229.974 113.788 l +230.327 113.987 l +230.652 114.229 l +230.944 114.512 l +231.197 114.829 l +231.407 115.176 l +231.571 115.547 l +231.687 115.936 l +231.751 116.336 l +231.764 116.741 l +231.725 117.145 l +231.635 117.541 l +231.495 117.922 l +231.307 118.281 l +231.075 118.614 l +230.803 118.914 l +230.708 119.026 l +230.678 119.138 l +230.696 119.253 l +230.757 119.352 l +230.852 119.418 l +230.966 119.441 l +233.434 119.441 l +233.548 119.418 l +233.643 119.352 l +233.704 119.253 l +233.722 119.138 l +233.692 119.026 l +233.597 118.914 l +233.325 118.614 l +233.093 118.281 l +232.905 117.922 l +232.765 117.541 l +232.675 117.145 l +232.636 116.741 l +232.649 116.336 l +232.713 115.936 l +232.829 115.547 l +232.993 115.176 l +233.203 114.829 l +233.456 114.512 l +233.748 114.229 l +234.073 113.987 l +234.426 113.788 l +234.802 113.635 l +235.195 113.532 l +235.597 113.481 l +236.003 113.481 l +236.405 113.532 l +236.798 113.635 l +237.174 113.788 l +237.527 113.987 l +237.852 114.229 l +238.144 114.512 l +238.397 114.829 l +238.607 115.176 l +238.771 115.547 l +238.887 115.936 l +238.951 116.336 l +238.964 116.741 l +238.925 117.145 l +238.835 117.541 l +238.695 117.922 l +238.507 118.281 l +238.275 118.614 l +238.003 118.914 l +237.908 119.026 l +237.878 119.138 l +237.896 119.253 l +237.957 119.352 l +238.052 119.418 l +238.166 119.441 l +240.634 119.441 l +240.748 119.418 l +240.843 119.352 l +240.904 119.253 l +240.922 119.138 l +240.892 119.026 l +240.797 118.914 l +240.525 118.614 l +240.293 118.281 l +240.105 117.922 l +239.965 117.541 l +239.875 117.145 l +239.836 116.741 l +239.849 116.336 l +239.913 115.936 l +240.029 115.547 l +240.193 115.176 l +240.403 114.829 l +240.656 114.512 l +240.948 114.229 l +241.273 113.987 l +241.626 113.788 l +242.002 113.635 l +242.395 113.532 l +242.797 113.481 l +243.203 113.481 l +h +293.272 83.325 m +293.482 83.305 l +296.288 83.305 l +296.498 83.325 l +296.687 83.382 l +296.861 83.475 l +297.013 83.600 l +297.138 83.753 l +297.231 83.926 l +297.288 84.115 l +297.309 84.325 l +297.309 97.052 l +297.288 97.263 l +297.231 97.451 l +297.138 97.625 l +297.013 97.777 l +296.861 97.902 l +296.687 97.995 l +296.498 98.052 l +296.288 98.073 l +293.482 98.073 l +293.272 98.052 l +293.083 97.995 l +292.909 97.902 l +292.757 97.777 l +292.632 97.625 l +292.539 97.451 l +292.482 97.263 l +292.461 97.052 l +292.461 96.854 l +292.441 96.747 l +292.382 96.656 l +292.293 96.592 l +292.187 96.567 l +292.079 96.582 l +291.985 96.636 l +286.712 101.188 l +286.426 101.401 l +286.122 101.566 l +285.798 101.686 l +285.460 101.759 l +285.098 101.784 l +208.055 101.429 l +207.944 101.451 l +207.850 101.513 l +191.373 117.990 l +191.242 118.112 l +191.108 118.220 l +190.966 118.319 l +190.817 118.407 l +190.662 118.485 l +190.502 118.551 l +190.338 118.606 l +190.170 118.648 l +190.000 118.679 l +189.828 118.698 l +189.650 118.704 l +186.566 118.704 l +186.464 118.722 l +186.376 118.775 l +186.312 118.856 l +186.236 118.998 l +186.111 119.151 l +185.958 119.276 l +185.785 119.369 l +185.596 119.426 l +185.386 119.447 l +181.094 119.447 l +180.884 119.426 l +180.695 119.369 l +180.522 119.276 l +180.369 119.151 l +180.244 118.998 l +180.151 118.825 l +180.094 118.636 l +180.073 118.426 l +180.073 114.134 l +180.094 113.924 l +180.151 113.735 l +180.244 113.562 l +180.369 113.409 l +180.522 113.284 l +180.695 113.191 l +180.884 113.134 l +181.094 113.113 l +185.386 113.113 l +185.596 113.134 l +185.785 113.191 l +185.958 113.284 l +186.111 113.409 l +186.236 113.562 l +186.312 113.704 l +186.376 113.785 l +186.464 113.838 l +186.566 113.856 l +188.532 113.856 l +188.642 113.834 l +188.736 113.772 l +205.217 97.290 l +205.357 97.161 l +205.482 97.060 l +205.635 96.955 l +205.773 96.873 l +205.939 96.790 l +206.088 96.729 l +206.264 96.671 l +206.419 96.632 l +206.602 96.599 l +206.762 96.583 l +206.952 96.576 l +284.116 96.931 l +284.217 96.914 l +284.305 96.861 l +291.460 90.685 l +292.377 89.770 l +292.439 89.676 l +292.461 89.566 l +292.461 84.325 l +292.482 84.115 l +292.539 83.926 l +292.632 83.753 l +292.757 83.600 l +292.909 83.475 l +293.083 83.382 l +293.272 83.325 l +h +47.191 24.595 m +47.594 24.634 l +47.990 24.725 l +48.371 24.865 l +48.730 25.052 l +49.063 25.284 l +49.363 25.557 l +49.626 25.866 l +49.848 26.206 l +50.024 26.572 l +50.152 26.957 l +50.229 27.355 l +50.255 27.760 l +50.229 28.165 l +50.152 28.563 l +50.024 28.948 l +49.848 29.313 l +49.626 29.653 l +49.363 29.962 l +49.063 30.235 l +48.730 30.467 l +48.371 30.655 l +47.990 30.795 l +47.594 30.885 l +47.191 30.924 l +46.785 30.911 l +46.646 30.903 l +46.560 30.931 l +46.486 30.984 l +42.981 34.489 l +42.919 34.582 l +42.897 34.692 l +42.897 98.438 l +42.919 98.549 l +42.982 98.642 l +43.076 98.704 l +43.186 98.726 l +43.297 98.703 l +43.390 98.640 l +43.452 98.546 l +43.517 98.386 l +43.716 98.033 l +43.958 97.707 l +44.241 97.416 l +44.558 97.163 l +44.905 96.953 l +45.276 96.789 l +45.665 96.673 l +46.065 96.608 l +46.471 96.595 l +46.874 96.634 l +47.270 96.725 l +47.651 96.865 l +48.010 97.052 l +48.343 97.284 l +48.643 97.557 l +48.906 97.866 l +49.128 98.206 l +49.304 98.572 l +49.432 98.957 l +49.509 99.355 l +49.535 99.760 l +49.509 100.165 l +49.432 100.563 l +49.304 100.948 l +49.128 101.313 l +48.906 101.653 l +48.643 101.962 l +48.343 102.235 l +48.010 102.467 l +47.651 102.655 l +47.270 102.795 l +46.874 102.885 l +46.471 102.924 l +46.065 102.911 l +45.665 102.846 l +45.276 102.731 l +44.905 102.567 l +44.558 102.356 l +44.241 102.103 l +43.958 101.812 l +43.716 101.487 l +43.517 101.133 l +43.452 100.973 l +43.390 100.879 l +43.297 100.816 l +43.186 100.793 l +43.076 100.815 l +42.982 100.877 l +42.919 100.971 l +42.897 101.081 l +42.897 117.831 l +42.873 118.133 l +42.805 118.416 l +42.694 118.685 l +42.542 118.933 l +42.345 119.163 l +34.917 126.591 l +34.855 126.685 l +34.833 126.795 l +34.833 166.300 l +34.855 166.410 l +34.917 166.503 l +35.011 166.566 l +35.121 166.588 l +38.491 166.588 l +38.702 166.609 l +38.890 166.666 l +39.064 166.759 l +39.216 166.884 l +39.341 167.036 l +39.434 167.210 l +39.491 167.398 l +39.512 167.609 l +39.512 170.979 l +39.491 171.189 l +39.434 171.377 l +39.341 171.551 l +39.216 171.704 l +39.064 171.829 l +38.890 171.921 l +38.702 171.979 l +38.491 171.999 l +35.634 171.999 l +35.523 172.021 l +35.430 172.084 l +35.368 172.177 l +35.346 172.287 l +35.368 172.398 l +35.430 172.491 l +36.649 173.710 l +36.743 173.773 l +36.853 173.795 l +36.991 173.795 l +37.357 173.845 l +37.712 173.945 l +38.051 174.092 l +38.366 174.284 l +38.653 174.517 l +38.905 174.786 l +39.118 175.088 l +39.288 175.416 l +39.411 175.764 l +39.486 176.125 l +39.511 176.494 l +39.486 176.862 l +39.411 177.223 l +39.288 177.571 l +39.118 177.899 l +38.905 178.201 l +38.653 178.471 l +38.366 178.704 l +38.051 178.895 l +37.712 179.043 l +37.357 179.142 l +36.991 179.192 l +36.622 179.192 l +36.256 179.142 l +35.901 179.043 l +35.562 178.895 l +35.246 178.704 l +34.960 178.471 l +34.708 178.201 l +34.495 177.899 l +34.325 177.571 l +34.202 177.223 l +34.127 176.862 l +34.103 176.517 l +34.078 176.417 l +34.019 176.333 l +31.671 173.984 l +31.474 173.754 l +31.322 173.506 l +31.211 173.237 l +31.143 172.954 l +31.119 172.652 l +31.119 125.918 l +31.143 125.616 l +31.211 125.333 l +31.322 125.064 l +31.474 124.815 l +31.671 124.585 l +39.099 117.158 l +39.161 117.064 l +39.183 116.954 l +39.183 33.815 l +39.207 33.514 l +39.275 33.230 l +39.386 32.961 l +39.538 32.713 l +39.735 32.483 l +43.867 28.351 l +43.918 28.281 l +43.947 28.198 l +43.949 28.111 l +43.930 27.963 l +43.930 27.557 l +43.982 27.154 l +44.084 26.762 l +44.237 26.386 l +44.436 26.033 l +44.678 25.707 l +44.961 25.416 l +45.278 25.163 l +45.625 24.953 l +45.996 24.789 l +46.385 24.673 l +46.785 24.608 l +47.191 24.595 l +h +90.031 96.595 m +90.434 96.634 l +90.830 96.725 l +91.211 96.865 l +91.570 97.052 l +91.903 97.284 l +92.203 97.557 l +92.466 97.866 l +92.688 98.206 l +92.864 98.572 l +92.992 98.957 l +93.069 99.355 l +93.095 99.760 l +93.069 100.165 l +92.992 100.563 l +92.864 100.948 l +92.688 101.313 l +92.466 101.653 l +92.203 101.962 l +91.903 102.235 l +91.570 102.467 l +91.211 102.655 l +90.830 102.795 l +90.434 102.885 l +90.031 102.924 l +89.625 102.911 l +89.486 102.903 l +89.400 102.931 l +89.326 102.984 l +79.419 112.891 l +79.189 113.087 l +78.941 113.239 l +78.672 113.351 l +78.389 113.419 l +78.072 113.443 l +77.950 113.481 l +77.857 113.568 l +77.810 113.686 l +77.819 113.813 l +77.881 113.924 l +78.156 114.227 l +78.388 114.559 l +78.576 114.919 l +78.716 115.300 l +78.806 115.695 l +78.845 116.099 l +78.832 116.505 l +78.767 116.905 l +78.652 117.294 l +78.488 117.665 l +78.277 118.012 l +78.024 118.329 l +77.733 118.611 l +77.408 118.854 l +77.054 119.053 l +76.678 119.205 l +76.286 119.308 l +75.884 119.360 l +75.478 119.360 l +75.076 119.308 l +74.683 119.205 l +74.307 119.053 l +73.954 118.854 l +73.629 118.611 l +73.337 118.329 l +73.084 118.012 l +72.874 117.665 l +72.710 117.294 l +72.594 116.905 l +72.529 116.505 l +72.516 116.099 l +72.555 115.695 l +72.646 115.300 l +72.786 114.919 l +72.973 114.559 l +73.206 114.227 l +73.480 113.924 l +73.537 113.830 l +73.555 113.721 l +73.530 113.614 l +73.467 113.524 l +73.375 113.464 l +73.267 113.443 l +70.894 113.443 l +70.786 113.464 l +70.694 113.524 l +70.631 113.614 l +70.607 113.721 l +70.624 113.830 l +70.681 113.924 l +70.956 114.227 l +71.188 114.559 l +71.376 114.919 l +71.516 115.300 l +71.606 115.695 l +71.645 116.099 l +71.632 116.505 l +71.567 116.905 l +71.452 117.294 l +71.288 117.665 l +71.077 118.012 l +70.824 118.329 l +70.533 118.611 l +70.208 118.854 l +69.854 119.053 l +69.478 119.205 l +69.086 119.308 l +68.684 119.360 l +68.278 119.360 l +67.876 119.308 l +67.483 119.205 l +67.107 119.053 l +66.754 118.854 l +66.505 118.669 l +66.390 118.617 l +66.263 118.620 l +66.151 118.677 l +66.073 118.776 l +66.045 118.899 l +66.045 154.781 l +66.021 155.083 l +65.953 155.366 l +65.842 155.635 l +65.690 155.884 l +65.493 156.114 l +61.585 160.022 l +61.355 160.218 l +61.107 160.371 l +60.838 160.482 l +60.554 160.550 l +60.253 160.574 l +58.712 160.574 l +58.636 160.584 l +58.528 160.636 l +58.224 160.759 l +57.905 160.833 l +57.578 160.858 l +57.252 160.833 l +56.933 160.759 l +56.629 160.636 l +56.347 160.469 l +56.095 160.260 l +55.877 160.016 l +55.699 159.741 l +55.565 159.442 l +55.478 159.126 l +55.440 158.801 l +55.453 158.474 l +55.515 158.152 l +55.626 157.844 l +55.783 157.556 l +55.981 157.295 l +56.124 157.158 l +56.191 157.058 l +56.212 156.940 l +56.182 156.823 l +56.095 156.718 l +55.877 156.474 l +55.699 156.199 l +55.575 155.923 l +56.831 155.923 l +56.831 156.340 l +56.858 156.460 l +56.932 156.558 l +57.041 156.617 l +57.163 156.624 l +57.415 156.586 l +57.742 156.586 l +57.993 156.624 l +58.116 156.617 l +58.225 156.558 l +58.299 156.460 l +58.325 156.340 l +58.325 155.923 l +59.581 155.923 l +59.531 156.036 l +59.506 156.146 l +59.526 156.258 l +59.587 156.354 l +59.680 156.418 l +59.791 156.442 l +59.903 156.420 l +59.998 156.357 l +62.247 154.108 l +62.309 154.015 l +62.331 153.904 l +62.331 114.110 l +62.354 113.811 l +62.422 113.527 l +62.533 113.258 l +62.685 113.010 l +62.881 112.779 l +65.371 110.282 l +65.600 110.086 l +65.849 109.933 l +66.118 109.821 l +66.401 109.753 l +66.705 109.729 l +77.210 109.729 l +77.320 109.707 l +77.414 109.644 l +83.905 103.153 l +83.967 103.060 l +83.989 102.949 l +83.989 101.020 l +85.919 101.020 l +86.029 100.998 l +86.123 100.935 l +86.707 100.351 l +86.758 100.281 l +86.787 100.198 l +86.789 100.111 l +86.770 99.963 l +86.770 99.557 l +86.822 99.154 l +86.924 98.762 l +87.077 98.386 l +87.276 98.033 l +87.518 97.707 l +87.801 97.416 l +88.118 97.163 l +88.465 96.953 l +88.836 96.789 l +89.225 96.673 l +89.625 96.608 l +90.031 96.595 l +h +118.831 96.595 m +119.234 96.634 l +119.630 96.725 l +120.011 96.865 l +120.370 97.052 l +120.703 97.284 l +121.003 97.557 l +121.266 97.866 l +121.488 98.206 l +121.664 98.572 l +121.792 98.957 l +121.869 99.355 l +121.895 99.760 l +121.869 100.165 l +121.792 100.563 l +121.664 100.948 l +121.488 101.313 l +121.288 101.620 l +121.249 101.710 l +121.243 101.807 l +121.269 101.901 l +121.326 101.981 l +132.320 112.975 l +132.422 113.041 l +132.542 113.059 l +132.921 113.035 l +133.326 113.061 l +133.724 113.138 l +134.109 113.266 l +134.474 113.442 l +134.814 113.663 l +135.123 113.926 l +135.396 114.227 l +135.628 114.559 l +135.816 114.919 l +135.956 115.300 l +136.046 115.695 l +136.085 116.099 l +136.072 116.505 l +136.007 116.905 l +135.892 117.294 l +135.728 117.665 l +135.517 118.012 l +135.264 118.329 l +134.973 118.611 l +134.892 118.672 l +134.830 118.735 l +134.790 118.815 l +134.776 118.903 l +134.776 161.450 l +134.798 161.560 l +134.861 161.654 l +144.020 170.813 l +144.129 170.904 l +144.329 171.129 l +144.490 171.384 l +144.608 171.661 l +144.680 171.953 l +144.704 172.253 l +144.680 172.553 l +144.608 172.845 l +144.490 173.122 l +144.329 173.376 l +144.129 173.602 l +143.896 173.792 l +143.635 173.942 l +143.354 174.049 l +143.059 174.109 l +142.758 174.121 l +142.460 174.085 l +142.170 174.001 l +141.899 173.872 l +141.651 173.701 l +141.434 173.493 l +141.377 173.423 l +131.614 163.659 l +131.418 163.429 l +131.265 163.181 l +131.154 162.912 l +131.086 162.629 l +131.062 162.327 l +131.062 118.900 l +131.049 118.813 l +131.009 118.733 l +130.947 118.670 l +130.869 118.611 l +130.577 118.329 l +130.324 118.012 l +130.114 117.665 l +129.950 117.294 l +129.834 116.905 l +129.769 116.505 l +129.756 116.099 l +129.782 115.838 l +129.766 115.713 l +129.699 115.606 l +129.117 115.025 l +129.024 114.963 l +128.914 114.941 l +126.981 114.941 l +126.981 113.008 l +126.959 112.898 l +126.896 112.804 l +117.423 103.331 l +117.226 103.101 l +117.074 102.852 l +116.963 102.583 l +116.929 102.443 l +116.892 102.356 l +116.829 102.285 l +116.601 102.103 l +116.318 101.812 l +116.076 101.487 l +115.877 101.133 l +115.724 100.757 l +115.622 100.365 l +115.570 99.963 l +115.570 99.557 l +115.622 99.154 l +115.724 98.762 l +115.877 98.386 l +116.076 98.033 l +116.318 97.707 l +116.601 97.416 l +116.918 97.163 l +117.265 96.953 l +117.636 96.789 l +118.025 96.673 l +118.425 96.608 l +118.831 96.595 l +h +90.391 24.595 m +90.794 24.634 l +91.190 24.725 l +91.571 24.865 l +91.930 25.052 l +92.263 25.284 l +92.563 25.557 l +92.826 25.866 l +93.048 26.206 l +93.224 26.572 l +93.352 26.957 l +93.429 27.355 l +93.455 27.760 l +93.429 28.165 l +93.361 28.512 l +93.364 28.634 l +93.416 28.743 l +93.509 28.822 l +93.626 28.855 l +93.746 28.837 l +93.848 28.771 l +94.267 28.352 l +94.319 28.281 l +94.347 28.199 l +94.349 28.111 l +94.330 27.963 l +94.330 27.557 l +94.382 27.154 l +94.484 26.762 l +94.637 26.386 l +94.836 26.033 l +95.078 25.707 l +95.361 25.416 l +95.678 25.163 l +96.025 24.953 l +96.396 24.789 l +96.785 24.673 l +97.185 24.608 l +97.591 24.595 l +97.994 24.634 l +98.390 24.725 l +98.771 24.865 l +99.130 25.052 l +99.463 25.284 l +99.763 25.557 l +100.026 25.866 l +100.248 26.206 l +100.424 26.572 l +100.552 26.957 l +100.629 27.355 l +100.655 27.760 l +100.629 28.165 l +100.552 28.563 l +100.424 28.948 l +100.248 29.313 l +100.026 29.653 l +99.763 29.962 l +99.463 30.235 l +99.130 30.467 l +98.771 30.655 l +98.390 30.795 l +97.994 30.885 l +97.591 30.924 l +97.185 30.911 l +97.046 30.903 l +96.960 30.931 l +96.887 30.984 l +80.983 46.894 l +80.920 46.988 l +80.899 47.098 l +80.899 95.289 l +80.912 95.465 l +80.888 95.765 l +80.816 96.057 l +80.698 96.334 l +80.537 96.588 l +80.337 96.814 l +80.104 97.004 l +79.843 97.154 l +79.562 97.261 l +79.267 97.321 l +78.966 97.333 l +78.668 97.297 l +78.378 97.213 l +78.136 97.099 l +78.028 97.071 l +77.918 97.087 l +77.822 97.143 l +77.755 97.231 l +77.725 97.338 l +77.739 97.448 l +77.793 97.545 l +78.066 97.866 l +78.288 98.206 l +78.464 98.572 l +78.592 98.957 l +78.669 99.355 l +78.695 99.760 l +78.669 100.165 l +78.592 100.563 l +78.464 100.948 l +78.288 101.313 l +78.066 101.653 l +77.803 101.962 l +77.503 102.235 l +77.170 102.467 l +76.811 102.655 l +76.430 102.795 l +76.034 102.885 l +75.631 102.924 l +75.225 102.911 l +74.825 102.846 l +74.436 102.731 l +74.065 102.567 l +73.718 102.356 l +73.401 102.103 l +73.118 101.812 l +72.876 101.487 l +72.677 101.133 l +72.524 100.757 l +72.422 100.365 l +72.370 99.963 l +72.370 99.557 l +72.422 99.154 l +72.524 98.762 l +72.677 98.386 l +72.876 98.033 l +73.118 97.707 l +73.401 97.416 l +73.718 97.163 l +74.065 96.953 l +74.436 96.789 l +74.825 96.673 l +75.225 96.608 l +75.631 96.595 l +76.034 96.634 l +76.430 96.725 l +76.811 96.865 l +77.170 97.052 l +77.233 97.096 l +77.339 97.142 l +77.455 97.142 l +77.561 97.097 l +77.641 97.014 l +77.682 96.906 l +77.678 96.791 l +77.628 96.687 l +77.461 96.464 l +77.321 96.198 l +77.226 95.912 l +77.177 95.615 l +77.177 95.314 l +77.185 95.247 l +77.185 46.221 l +77.208 45.920 l +77.276 45.636 l +77.388 45.367 l +77.540 45.119 l +77.736 44.889 l +91.306 31.314 l +91.372 31.210 l +91.389 31.089 l +91.354 30.971 l +91.273 30.878 l +91.161 30.828 l +91.038 30.829 l +90.794 30.885 l +90.391 30.924 l +89.985 30.911 l +89.585 30.846 l +89.196 30.731 l +88.825 30.567 l +88.478 30.356 l +88.161 30.103 l +87.878 29.812 l +87.636 29.487 l +87.437 29.133 l +87.284 28.757 l +87.182 28.365 l +87.130 27.963 l +87.130 27.557 l +87.182 27.154 l +87.284 26.762 l +87.437 26.386 l +87.636 26.033 l +87.878 25.707 l +88.161 25.416 l +88.478 25.163 l +88.825 24.953 l +89.196 24.789 l +89.585 24.673 l +89.985 24.608 l +90.391 24.595 l +h +304.200 153.482 m +304.629 153.508 l +305.051 153.586 l +305.461 153.713 l +305.853 153.890 l +306.221 154.112 l +306.559 154.377 l +306.863 154.680 l +307.128 155.019 l +307.350 155.386 l +307.526 155.778 l +307.654 156.188 l +307.731 156.611 l +307.757 157.039 l +307.731 157.468 l +307.654 157.891 l +307.526 158.301 l +307.350 158.692 l +307.178 158.976 l +307.148 159.047 l +307.137 159.125 l +307.137 189.837 l +307.147 189.912 l +307.176 189.981 l +307.335 190.258 l +307.460 190.575 l +307.536 190.908 l +307.562 191.259 l +307.562 193.221 l +307.536 193.572 l +307.460 193.905 l +307.335 194.222 l +307.165 194.517 l +306.952 194.784 l +306.702 195.016 l +306.421 195.208 l +306.113 195.356 l +305.788 195.456 l +305.450 195.507 l +305.110 195.507 l +304.772 195.456 l +304.447 195.356 l +304.139 195.208 l +303.858 195.016 l +303.676 194.847 l +303.585 194.790 l +303.480 194.770 l +303.375 194.790 l +303.284 194.847 l +303.102 195.016 l +302.821 195.208 l +302.513 195.356 l +302.188 195.456 l +301.850 195.507 l +301.510 195.507 l +301.172 195.456 l +300.847 195.356 l +300.539 195.208 l +300.459 195.153 l +300.362 195.111 l +300.256 195.106 l +300.156 195.140 l +299.914 195.343 l +299.740 195.436 l +299.552 195.494 l +299.341 195.514 l +298.898 195.514 l +298.898 193.554 l +299.112 193.554 l +299.228 193.530 l +299.323 193.462 l +299.384 193.361 l +299.398 193.221 l +299.398 191.259 l +299.384 191.119 l +299.323 191.018 l +299.228 190.950 l +299.112 190.926 l +298.898 190.926 l +298.898 189.662 l +298.876 189.552 l +298.813 189.458 l +298.720 189.396 l +298.610 189.374 l +297.550 189.374 l +297.440 189.396 l +297.347 189.458 l +297.284 189.552 l +297.262 189.662 l +297.262 190.926 l +295.798 190.926 l +295.798 189.986 l +295.819 189.776 l +295.839 189.639 l +295.811 189.536 l +295.748 189.450 l +295.657 189.394 l +295.552 189.374 l +281.134 189.374 l +281.024 189.396 l +280.930 189.458 l +274.945 195.444 l +274.882 195.537 l +274.860 195.647 l +274.860 195.789 l +274.810 196.155 l +274.710 196.511 l +274.563 196.850 l +274.371 197.166 l +274.138 197.452 l +273.868 197.704 l +273.566 197.917 l +273.238 198.087 l +272.890 198.211 l +272.529 198.286 l +272.160 198.311 l +271.791 198.286 l +271.430 198.211 l +271.082 198.087 l +270.754 197.917 l +270.452 197.704 l +270.182 197.452 l +269.949 197.166 l +269.757 196.850 l +269.610 196.511 l +269.510 196.155 l +269.460 195.789 l +269.460 195.420 l +269.510 195.054 l +269.610 194.698 l +269.757 194.359 l +269.949 194.044 l +270.182 193.757 l +270.452 193.505 l +270.754 193.292 l +271.082 193.122 l +271.430 192.998 l +271.791 192.923 l +272.136 192.900 l +272.236 192.874 l +272.320 192.816 l +278.925 186.212 l +279.155 186.015 l +279.403 185.863 l +279.672 185.752 l +279.955 185.684 l +280.257 185.660 l +300.279 185.660 l +300.581 185.684 l +300.864 185.752 l +301.133 185.863 l +301.381 186.015 l +301.611 186.212 l +302.931 187.532 l +303.025 187.594 l +303.135 187.616 l +303.245 187.594 l +303.339 187.532 l +303.401 187.438 l +303.423 187.328 l +303.423 178.163 l +303.398 178.045 l +303.327 177.948 l +303.222 177.889 l +303.102 177.877 l +302.988 177.915 l +302.900 177.997 l +302.756 178.201 l +302.504 178.471 l +302.218 178.704 l +301.902 178.895 l +301.687 178.989 l +301.687 177.523 l +303.135 177.523 l +303.245 177.501 l +303.339 177.439 l +303.401 177.345 l +303.423 177.235 l +303.423 175.752 l +303.401 175.642 l +303.339 175.548 l +303.245 175.486 l +303.135 175.464 l +301.687 175.464 l +301.687 173.998 l +301.902 174.092 l +302.218 174.284 l +302.504 174.517 l +302.756 174.786 l +302.900 174.990 l +302.988 175.072 l +303.102 175.110 l +303.222 175.099 l +303.327 175.039 l +303.398 174.942 l +303.423 174.824 l +303.423 170.963 l +303.398 170.845 l +303.327 170.748 l +303.222 170.689 l +303.102 170.677 l +302.988 170.715 l +302.900 170.797 l +302.756 171.001 l +302.504 171.271 l +302.218 171.504 l +301.902 171.695 l +301.563 171.843 l +301.208 171.942 l +300.842 171.992 l +300.473 171.992 l +300.107 171.942 l +299.752 171.843 l +299.413 171.695 l +299.098 171.504 l +298.811 171.271 l +298.559 171.001 l +298.346 170.699 l +298.176 170.371 l +298.053 170.023 l +297.978 169.662 l +297.953 169.294 l +297.978 168.925 l +298.053 168.564 l +298.176 168.216 l +298.346 167.888 l +298.559 167.586 l +298.811 167.317 l +299.098 167.084 l +299.413 166.892 l +299.752 166.745 l +300.107 166.645 l +300.473 166.595 l +300.842 166.595 l +301.208 166.645 l +301.563 166.745 l +301.902 166.892 l +302.218 167.084 l +302.504 167.317 l +302.756 167.586 l +302.900 167.790 l +302.988 167.872 l +303.102 167.910 l +303.222 167.899 l +303.327 167.839 l +303.398 167.742 l +303.423 167.624 l +303.423 160.728 l +303.398 160.610 l +303.326 160.513 l +303.221 160.453 l +302.939 160.365 l +302.547 160.189 l +302.179 159.967 l +301.841 159.702 l +301.537 159.398 l +301.272 159.060 l +301.050 158.692 l +300.874 158.301 l +300.746 157.891 l +300.669 157.468 l +300.643 157.039 l +300.669 156.611 l +300.746 156.188 l +300.874 155.778 l +301.050 155.386 l +301.272 155.019 l +301.537 154.680 l +301.841 154.377 l +302.179 154.112 l +302.547 153.890 l +302.939 153.713 l +303.349 153.586 l +303.771 153.508 l +304.200 153.482 l +h +271.195 163.932 m +271.597 163.881 l +272.003 163.881 l +272.405 163.932 l +272.798 164.035 l +273.174 164.188 l +273.527 164.387 l +273.852 164.629 l +274.144 164.912 l +274.397 165.229 l +274.607 165.576 l +274.771 165.947 l +274.887 166.336 l +274.951 166.736 l +274.964 167.141 l +274.925 167.545 l +274.835 167.941 l +274.695 168.322 l +274.507 168.681 l +274.275 169.014 l +274.092 169.216 l +274.036 169.306 l +274.017 169.410 l +274.017 173.110 l +274.041 173.224 l +274.371 173.634 l +274.563 173.950 l +274.710 174.289 l +274.810 174.645 l +274.860 175.011 l +274.860 175.380 l +274.810 175.746 l +274.710 176.102 l +274.563 176.441 l +274.371 176.756 l +274.138 177.043 l +273.868 177.295 l +273.566 177.508 l +273.238 177.678 l +272.890 177.802 l +272.529 177.877 l +272.208 177.899 l +272.102 177.927 l +272.015 177.992 l +271.958 178.085 l +271.940 178.193 l +271.963 178.299 l +272.024 178.390 l +272.060 178.426 l +272.153 178.488 l +272.264 178.510 l +283.822 178.510 l +283.944 178.483 l +284.043 178.407 l +284.100 178.296 l +284.105 178.171 l +284.057 178.056 l +283.946 177.899 l +283.776 177.571 l +283.653 177.223 l +283.578 176.862 l +283.553 176.494 l +283.578 176.125 l +283.653 175.764 l +283.776 175.416 l +283.946 175.088 l +284.159 174.786 l +284.411 174.517 l +284.698 174.284 l +285.013 174.092 l +285.352 173.945 l +285.707 173.845 l +286.073 173.795 l +286.442 173.795 l +286.808 173.845 l +287.163 173.945 l +287.502 174.092 l +287.818 174.284 l +288.104 174.517 l +288.356 174.786 l +288.569 175.088 l +288.739 175.416 l +288.862 175.764 l +288.937 176.125 l +288.963 176.494 l +288.937 176.862 l +288.862 177.223 l +288.739 177.571 l +288.568 177.900 l +288.459 178.058 l +288.412 178.170 l +288.416 178.291 l +288.469 178.400 l +288.561 178.477 l +288.678 178.510 l +288.798 178.492 l +288.899 178.426 l +290.670 176.655 l +290.729 176.570 l +290.754 176.471 l +290.778 176.125 l +290.853 175.764 l +290.976 175.416 l +291.146 175.088 l +291.359 174.786 l +291.611 174.517 l +291.898 174.284 l +292.213 174.092 l +292.552 173.945 l +292.907 173.845 l +293.273 173.795 l +293.642 173.795 l +294.008 173.845 l +294.363 173.945 l +294.702 174.092 l +295.018 174.284 l +295.304 174.517 l +295.556 174.786 l +295.769 175.088 l +295.939 175.416 l +296.062 175.764 l +296.137 176.125 l +296.163 176.494 l +296.137 176.862 l +296.062 177.223 l +295.939 177.571 l +295.769 177.899 l +295.556 178.201 l +295.304 178.471 l +295.018 178.704 l +294.702 178.895 l +294.363 179.043 l +294.008 179.142 l +293.642 179.192 l +293.504 179.192 l +293.394 179.214 l +293.301 179.277 l +290.905 181.672 l +290.675 181.869 l +290.427 182.021 l +290.158 182.132 l +289.874 182.200 l +289.573 182.224 l +271.387 182.224 l +271.085 182.200 l +270.802 182.132 l +270.533 182.021 l +270.284 181.869 l +270.054 181.672 l +263.295 174.913 l +263.098 174.683 l +262.946 174.435 l +262.835 174.166 l +262.767 173.882 l +262.743 173.581 l +262.743 169.741 l +262.716 169.621 l +262.642 169.522 l +262.397 169.314 l +262.125 169.014 l +261.893 168.681 l +261.705 168.322 l +261.565 167.941 l +261.475 167.545 l +261.436 167.141 l +261.449 166.736 l +261.513 166.336 l +261.629 165.947 l +261.793 165.576 l +262.003 165.229 l +262.256 164.912 l +262.548 164.629 l +262.873 164.387 l +263.226 164.188 l +263.602 164.035 l +263.995 163.932 l +264.397 163.881 l +264.803 163.881 l +265.205 163.932 l +265.598 164.035 l +265.974 164.188 l +266.327 164.387 l +266.652 164.629 l +266.944 164.912 l +267.197 165.229 l +267.407 165.576 l +267.571 165.947 l +267.687 166.336 l +267.751 166.736 l +267.764 167.141 l +267.725 167.545 l +267.635 167.941 l +267.495 168.322 l +267.307 168.681 l +267.075 169.014 l +266.803 169.314 l +266.558 169.522 l +266.484 169.621 l +266.457 169.741 l +266.457 172.704 l +266.479 172.814 l +266.541 172.907 l +268.968 175.334 l +269.061 175.396 l +269.172 175.418 l +269.282 175.396 l +269.375 175.334 l +269.438 175.240 l +269.460 175.130 l +269.460 175.011 l +269.510 174.645 l +269.610 174.289 l +269.757 173.950 l +269.949 173.634 l +270.182 173.348 l +270.279 173.224 l +270.303 173.110 l +270.303 169.992 l +270.287 169.898 l +270.242 169.814 l +270.172 169.750 l +269.906 169.577 l +269.597 169.314 l +269.325 169.014 l +269.093 168.681 l +268.905 168.322 l +268.765 167.941 l +268.675 167.545 l +268.636 167.141 l +268.649 166.736 l +268.713 166.336 l +268.829 165.947 l +268.993 165.576 l +269.203 165.229 l +269.456 164.912 l +269.748 164.629 l +270.073 164.387 l +270.426 164.188 l +270.802 164.035 l +271.195 163.932 l +h +104.431 96.595 m +104.834 96.634 l +105.230 96.725 l +105.611 96.865 l +105.970 97.052 l +106.303 97.284 l +106.603 97.557 l +106.866 97.866 l +107.088 98.206 l +107.264 98.572 l +107.392 98.957 l +107.469 99.355 l +107.495 99.760 l +107.469 100.165 l +107.392 100.563 l +107.264 100.948 l +107.088 101.313 l +106.866 101.653 l +106.604 101.962 l +106.281 102.253 l +106.211 102.350 l +106.186 102.467 l +106.186 103.441 l +106.208 103.551 l +106.271 103.645 l +107.245 104.619 l +107.338 104.681 l +107.448 104.703 l +115.909 104.703 l +116.210 104.727 l +116.494 104.795 l +116.763 104.906 l +117.011 105.058 l +117.241 105.255 l +120.105 108.119 l +120.302 108.349 l +120.454 108.597 l +120.565 108.866 l +120.633 109.150 l +120.657 109.451 l +120.657 113.431 l +120.684 113.552 l +120.758 113.650 l +121.083 113.926 l +121.356 114.227 l +121.588 114.559 l +121.776 114.919 l +121.916 115.300 l +122.006 115.695 l +122.045 116.099 l +122.032 116.505 l +121.967 116.905 l +121.852 117.294 l +121.688 117.665 l +121.477 118.012 l +121.224 118.329 l +120.933 118.611 l +120.608 118.854 l +120.254 119.053 l +119.878 119.205 l +119.486 119.308 l +119.084 119.360 l +118.678 119.360 l +118.276 119.308 l +117.883 119.205 l +117.507 119.053 l +117.154 118.854 l +116.829 118.611 l +116.537 118.329 l +116.284 118.012 l +116.074 117.665 l +115.910 117.294 l +115.794 116.905 l +115.729 116.505 l +115.716 116.099 l +115.755 115.695 l +115.846 115.300 l +115.986 114.919 l +116.173 114.559 l +116.406 114.227 l +116.678 113.926 l +116.842 113.787 l +116.916 113.689 l +116.943 113.568 l +116.943 110.328 l +116.921 110.218 l +116.859 110.125 l +115.235 108.501 l +115.142 108.439 l +115.032 108.417 l +106.571 108.417 l +106.270 108.393 l +105.986 108.325 l +105.717 108.214 l +105.469 108.062 l +105.239 107.865 l +103.024 105.651 l +102.828 105.420 l +102.676 105.172 l +102.564 104.903 l +102.496 104.620 l +102.472 104.318 l +102.472 102.459 l +102.460 102.374 l +102.422 102.297 l +102.364 102.234 l +102.201 102.103 l +101.918 101.812 l +101.676 101.487 l +101.477 101.133 l +101.324 100.757 l +101.222 100.365 l +101.170 99.963 l +101.170 99.557 l +101.222 99.154 l +101.324 98.762 l +101.477 98.386 l +101.676 98.033 l +101.918 97.707 l +102.201 97.416 l +102.518 97.163 l +102.865 96.953 l +103.236 96.789 l +103.625 96.673 l +104.025 96.608 l +104.431 96.595 l +h +302.979 94.058 m +302.979 97.052 l +302.958 97.263 l +302.901 97.451 l +302.808 97.625 l +302.683 97.777 l +302.531 97.902 l +302.476 97.932 l +302.385 98.007 l +302.333 98.113 l +302.327 98.230 l +302.369 98.341 l +302.451 98.425 l +302.560 98.469 l +302.678 98.466 l +302.735 98.453 l +303.183 98.400 l +303.635 98.400 l +304.084 98.453 l +304.524 98.557 l +304.949 98.711 l +305.352 98.914 l +305.730 99.162 l +306.076 99.453 l +306.386 99.782 l +306.656 100.144 l +306.882 100.536 l +307.061 100.950 l +307.191 101.383 l +307.269 101.828 l +307.296 102.280 l +307.269 102.731 l +307.191 103.176 l +307.061 103.609 l +306.882 104.024 l +306.656 104.415 l +306.386 104.778 l +306.076 105.106 l +305.730 105.397 l +305.352 105.645 l +304.949 105.848 l +304.524 106.002 l +304.084 106.107 l +303.635 106.159 l +303.183 106.159 l +302.735 106.107 l +302.295 106.002 l +301.870 105.848 l +301.466 105.645 l +301.089 105.397 l +300.743 105.106 l +300.433 104.778 l +300.163 104.415 l +299.937 104.024 l +299.758 103.609 l +299.628 103.176 l +299.550 102.731 l +299.523 102.280 l +299.550 101.828 l +299.628 101.383 l +299.758 100.950 l +299.937 100.536 l +300.163 100.144 l +300.433 99.782 l +300.743 99.453 l +301.089 99.162 l +301.466 98.914 l +301.870 98.711 l +302.096 98.629 l +302.196 98.567 l +302.263 98.470 l +302.285 98.354 l +302.259 98.239 l +302.189 98.144 l +302.086 98.085 l +301.958 98.073 l +301.443 98.073 l +301.443 94.058 l +302.979 94.058 l +h +56.831 134.662 m +56.831 135.078 l +56.858 135.198 l +56.932 135.297 l +57.041 135.355 l +57.163 135.363 l +57.415 135.324 l +57.742 135.324 l +57.993 135.363 l +58.116 135.355 l +58.225 135.297 l +58.299 135.198 l +58.325 135.078 l +58.325 134.662 l +59.581 134.662 l +59.458 134.937 l +59.280 135.212 l +59.050 135.467 l +58.975 135.561 l +58.945 135.678 l +58.966 135.797 l +59.033 135.897 l +59.176 136.034 l +59.374 136.294 l +59.531 136.582 l +59.641 136.890 l +59.704 137.212 l +59.716 137.539 l +59.679 137.865 l +59.592 138.180 l +59.458 138.479 l +59.280 138.754 l +59.062 138.999 l +58.971 139.107 l +58.941 139.224 l +58.962 139.342 l +59.029 139.442 l +59.176 139.583 l +59.374 139.844 l +59.531 140.132 l +59.641 140.440 l +59.704 140.762 l +59.716 141.089 l +59.679 141.414 l +59.592 141.730 l +59.458 142.029 l +59.280 142.304 l +59.050 142.559 l +58.975 142.653 l +58.945 142.770 l +58.966 142.889 l +59.033 142.989 l +59.176 143.126 l +59.374 143.386 l +59.531 143.674 l +59.641 143.982 l +59.704 144.304 l +59.716 144.631 l +59.679 144.957 l +59.592 145.272 l +59.458 145.571 l +59.280 145.846 l +59.050 146.101 l +58.975 146.196 l +58.945 146.312 l +58.966 146.431 l +59.033 146.531 l +59.176 146.668 l +59.374 146.929 l +59.531 147.216 l +59.641 147.525 l +59.704 147.846 l +59.716 148.174 l +59.679 148.499 l +59.592 148.815 l +59.458 149.114 l +59.280 149.389 l +59.050 149.644 l +58.975 149.738 l +58.945 149.855 l +58.966 149.973 l +59.033 150.073 l +59.176 150.211 l +59.374 150.471 l +59.531 150.759 l +59.641 151.067 l +59.704 151.389 l +59.716 151.716 l +59.679 152.041 l +59.592 152.357 l +59.458 152.656 l +59.280 152.931 l +59.050 153.186 l +58.975 153.280 l +58.945 153.397 l +58.966 153.516 l +59.033 153.616 l +59.176 153.753 l +59.374 154.013 l +59.531 154.301 l +59.577 154.430 l +58.325 154.430 l +58.325 154.013 l +58.307 153.912 l +58.254 153.823 l +58.173 153.759 l +58.075 153.728 l +57.972 153.733 l +57.905 153.749 l +57.578 153.774 l +57.252 153.749 l +57.185 153.733 l +57.082 153.728 l +56.984 153.759 l +56.903 153.823 l +56.850 153.912 l +56.831 154.013 l +56.831 154.430 l +55.580 154.430 l +55.626 154.301 l +55.783 154.013 l +55.981 153.753 l +56.124 153.616 l +56.191 153.516 l +56.212 153.397 l +56.182 153.280 l +56.095 153.176 l +55.877 152.931 l +55.699 152.656 l +55.565 152.357 l +55.478 152.041 l +55.440 151.716 l +55.453 151.389 l +55.515 151.067 l +55.626 150.759 l +55.783 150.471 l +55.981 150.211 l +56.124 150.073 l +56.191 149.973 l +56.212 149.855 l +56.182 149.738 l +56.095 149.633 l +55.877 149.389 l +55.699 149.114 l +55.565 148.815 l +55.478 148.499 l +55.440 148.174 l +55.453 147.846 l +55.515 147.525 l +55.626 147.216 l +55.783 146.929 l +55.981 146.668 l +56.124 146.531 l +56.191 146.431 l +56.212 146.312 l +56.182 146.196 l +56.095 146.091 l +55.877 145.846 l +55.699 145.571 l +55.565 145.272 l +55.478 144.957 l +55.440 144.631 l +55.453 144.304 l +55.515 143.982 l +55.626 143.674 l +55.783 143.386 l +55.981 143.126 l +56.124 142.989 l +56.191 142.889 l +56.212 142.770 l +56.182 142.653 l +56.095 142.548 l +55.877 142.304 l +55.699 142.029 l +55.565 141.730 l +55.478 141.414 l +55.440 141.089 l +55.453 140.762 l +55.515 140.440 l +55.626 140.132 l +55.783 139.844 l +55.981 139.583 l +56.128 139.442 l +56.195 139.342 l +56.216 139.224 l +56.186 139.107 l +56.095 138.999 l +55.877 138.754 l +55.699 138.479 l +55.565 138.180 l +55.478 137.865 l +55.440 137.539 l +55.453 137.212 l +55.515 136.890 l +55.626 136.582 l +55.783 136.294 l +55.981 136.034 l +56.124 135.897 l +56.191 135.797 l +56.212 135.678 l +56.182 135.561 l +56.095 135.456 l +55.877 135.212 l +55.699 134.937 l +55.575 134.662 l +56.831 134.662 l +h +96.921 113.035 m +97.326 113.061 l +97.724 113.138 l +98.109 113.266 l +98.474 113.442 l +98.814 113.663 l +99.123 113.926 l +99.396 114.227 l +99.628 114.559 l +99.816 114.919 l +99.956 115.300 l +100.046 115.695 l +100.085 116.099 l +100.072 116.505 l +100.007 116.905 l +99.892 117.294 l +99.728 117.665 l +99.517 118.012 l +99.264 118.329 l +98.973 118.611 l +98.648 118.854 l +98.294 119.053 l +97.918 119.205 l +97.526 119.308 l +97.124 119.360 l +96.718 119.360 l +96.316 119.308 l +95.923 119.205 l +95.547 119.053 l +95.194 118.854 l +94.869 118.611 l +94.577 118.329 l +94.324 118.012 l +94.114 117.665 l +93.950 117.294 l +93.834 116.905 l +93.785 116.601 l +93.744 116.494 l +93.664 116.410 l +93.558 116.365 l +93.443 116.365 l +93.337 116.410 l +93.257 116.494 l +93.216 116.601 l +93.167 116.905 l +93.052 117.294 l +92.888 117.665 l +92.677 118.012 l +92.424 118.329 l +92.133 118.611 l +91.808 118.854 l +91.454 119.053 l +91.078 119.205 l +90.686 119.308 l +90.284 119.360 l +89.878 119.360 l +89.476 119.308 l +89.083 119.205 l +88.707 119.053 l +88.354 118.854 l +88.029 118.611 l +87.737 118.329 l +87.484 118.012 l +87.274 117.665 l +87.110 117.294 l +86.994 116.905 l +86.929 116.505 l +86.916 116.099 l +86.955 115.695 l +87.046 115.300 l +87.186 114.919 l +87.373 114.559 l +87.606 114.227 l +87.878 113.926 l +88.187 113.663 l +88.527 113.442 l +88.893 113.266 l +89.278 113.138 l +89.676 113.061 l +90.081 113.035 l +90.486 113.061 l +90.884 113.138 l +91.269 113.266 l +91.634 113.442 l +91.974 113.663 l +92.283 113.926 l +92.556 114.227 l +92.788 114.559 l +92.976 114.919 l +93.116 115.300 l +93.206 115.695 l +93.214 115.778 l +93.250 115.893 l +93.331 115.982 l +93.441 116.032 l +93.561 116.032 l +93.671 115.982 l +93.751 115.893 l +93.787 115.778 l +93.795 115.695 l +93.886 115.300 l +94.026 114.919 l +94.213 114.559 l +94.446 114.227 l +94.718 113.926 l +95.027 113.663 l +95.367 113.442 l +95.733 113.266 l +96.118 113.138 l +96.516 113.061 l +96.921 113.035 l +h +290.336 68.564 m +290.546 68.585 l +290.735 68.642 l +290.909 68.735 l +291.061 68.860 l +291.186 69.012 l +291.279 69.186 l +291.336 69.374 l +291.357 69.585 l +291.357 79.194 l +291.336 79.405 l +291.279 79.593 l +291.186 79.767 l +291.061 79.919 l +290.909 80.044 l +290.735 80.137 l +290.546 80.194 l +290.336 80.215 l +285.829 80.215 l +285.619 80.194 l +285.430 80.137 l +285.256 80.044 l +285.104 79.919 l +284.979 79.767 l +284.886 79.593 l +284.829 79.405 l +284.808 79.194 l +284.808 69.585 l +284.829 69.374 l +284.886 69.186 l +284.979 69.012 l +285.104 68.860 l +285.256 68.735 l +285.430 68.642 l +285.619 68.585 l +285.829 68.564 l +290.336 68.564 l +h +33.815 21.413 m +34.263 21.360 l +34.715 21.360 l +35.164 21.413 l +35.604 21.517 l +36.029 21.671 l +36.432 21.874 l +36.810 22.122 l +37.156 22.413 l +37.466 22.742 l +37.736 23.104 l +37.962 23.496 l +38.141 23.910 l +38.271 24.343 l +38.349 24.788 l +38.376 25.240 l +38.349 25.691 l +38.271 26.136 l +38.141 26.569 l +37.962 26.984 l +37.736 27.375 l +37.466 27.738 l +37.156 28.066 l +36.810 28.357 l +36.432 28.605 l +36.029 28.808 l +35.604 28.962 l +35.164 29.067 l +34.715 29.119 l +34.263 29.119 l +33.815 29.067 l +33.375 28.962 l +32.950 28.808 l +32.546 28.605 l +32.169 28.357 l +31.823 28.066 l +31.513 27.738 l +31.243 27.375 l +31.017 26.984 l +30.838 26.569 l +30.708 26.136 l +30.630 25.691 l +30.603 25.240 l +30.630 24.788 l +30.708 24.343 l +30.838 23.910 l +31.017 23.496 l +31.243 23.104 l +31.513 22.742 l +31.823 22.413 l +32.169 22.122 l +32.546 21.874 l +32.950 21.671 l +33.375 21.517 l +33.815 21.413 l +h +168.057 132.216 m +168.506 132.164 l +168.958 132.164 l +169.407 132.216 l +169.847 132.320 l +170.271 132.475 l +170.675 132.678 l +171.053 132.926 l +171.399 133.217 l +171.709 133.545 l +171.979 133.908 l +172.205 134.299 l +172.384 134.714 l +172.513 135.147 l +172.592 135.592 l +172.618 136.043 l +172.592 136.494 l +172.513 136.939 l +172.384 137.372 l +172.205 137.787 l +171.979 138.179 l +171.709 138.541 l +171.399 138.870 l +171.053 139.160 l +170.675 139.409 l +170.271 139.612 l +169.847 139.766 l +169.407 139.870 l +168.958 139.923 l +168.506 139.923 l +168.057 139.870 l +167.617 139.766 l +167.193 139.612 l +166.789 139.409 l +166.411 139.160 l +166.065 138.870 l +165.755 138.541 l +165.485 138.179 l +165.259 137.787 l +165.080 137.372 l +164.951 136.939 l +164.872 136.494 l +164.846 136.043 l +164.872 135.592 l +164.951 135.147 l +165.080 134.714 l +165.259 134.299 l +165.485 133.908 l +165.755 133.545 l +166.065 133.217 l +166.411 132.926 l +166.789 132.678 l +167.193 132.475 l +167.617 132.320 l +168.057 132.216 l +h +303.635 21.360 m +304.084 21.413 l +304.524 21.517 l +304.949 21.671 l +305.352 21.874 l +305.730 22.122 l +306.076 22.413 l +306.386 22.742 l +306.656 23.104 l +306.882 23.496 l +307.061 23.910 l +307.191 24.343 l +307.269 24.788 l +307.296 25.240 l +307.269 25.691 l +307.191 26.136 l +307.061 26.569 l +306.882 26.984 l +306.656 27.375 l +306.386 27.738 l +306.076 28.066 l +305.730 28.357 l +305.352 28.605 l +304.949 28.808 l +304.524 28.962 l +304.084 29.067 l +303.635 29.119 l +303.183 29.119 l +302.735 29.067 l +302.295 28.962 l +301.870 28.808 l +301.466 28.605 l +301.089 28.357 l +300.743 28.066 l +300.433 27.738 l +300.163 27.375 l +299.937 26.984 l +299.758 26.569 l +299.628 26.136 l +299.550 25.691 l +299.523 25.240 l +299.550 24.788 l +299.628 24.343 l +299.758 23.910 l +299.937 23.496 l +300.163 23.104 l +300.433 22.742 l +300.743 22.413 l +301.089 22.122 l +301.466 21.874 l +301.870 21.671 l +302.295 21.517 l +302.735 21.413 l +303.183 21.360 l +303.635 21.360 l +h +33.455 98.453 m +33.903 98.400 l +34.355 98.400 l +34.804 98.453 l +35.244 98.557 l +35.669 98.711 l +36.072 98.914 l +36.450 99.162 l +36.796 99.453 l +37.106 99.782 l +37.376 100.144 l +37.602 100.536 l +37.781 100.950 l +37.911 101.383 l +37.989 101.828 l +38.016 102.280 l +37.989 102.731 l +37.911 103.176 l +37.781 103.609 l +37.602 104.024 l +37.376 104.415 l +37.106 104.778 l +36.796 105.106 l +36.450 105.397 l +36.072 105.645 l +35.669 105.848 l +35.244 106.002 l +34.804 106.107 l +34.355 106.159 l +33.903 106.159 l +33.455 106.107 l +33.015 106.002 l +32.590 105.848 l +32.186 105.645 l +31.809 105.397 l +31.463 105.106 l +31.153 104.778 l +30.883 104.415 l +30.657 104.024 l +30.478 103.609 l +30.348 103.176 l +30.270 102.731 l +30.243 102.280 l +30.270 101.828 l +30.348 101.383 l +30.478 100.950 l +30.657 100.536 l +30.883 100.144 l +31.153 99.782 l +31.463 99.453 l +31.809 99.162 l +32.186 98.914 l +32.590 98.711 l +33.015 98.557 l +33.455 98.453 l +h +293.680 120.871 m +294.124 120.922 l +294.558 121.025 l +294.978 121.178 l +295.377 121.379 l +295.750 121.624 l +296.093 121.911 l +296.399 122.236 l +296.666 122.594 l +296.889 122.981 l +297.066 123.391 l +297.194 123.819 l +297.272 124.259 l +297.298 124.705 l +297.272 125.151 l +297.194 125.590 l +297.066 126.018 l +296.889 126.428 l +296.666 126.815 l +296.399 127.173 l +296.093 127.498 l +295.750 127.785 l +295.377 128.031 l +294.978 128.231 l +294.558 128.384 l +294.124 128.487 l +293.680 128.539 l +293.234 128.539 l +292.790 128.487 l +292.355 128.384 l +291.936 128.231 l +291.537 128.031 l +291.163 127.785 l +290.821 127.498 l +290.515 127.173 l +290.248 126.815 l +290.025 126.428 l +289.848 126.018 l +289.720 125.590 l +289.642 125.151 l +289.616 124.705 l +289.642 124.259 l +289.720 123.819 l +289.848 123.391 l +290.025 122.981 l +290.248 122.594 l +290.515 122.236 l +290.821 121.911 l +291.163 121.624 l +291.537 121.379 l +291.936 121.178 l +292.355 121.025 l +292.790 120.922 l +293.234 120.871 l +293.680 120.871 l +h +44.231 120.871 m +44.675 120.922 l +45.109 121.025 l +45.529 121.178 l +45.928 121.379 l +46.301 121.624 l +46.643 121.911 l +46.950 122.236 l +47.217 122.594 l +47.440 122.981 l +47.617 123.391 l +47.745 123.819 l +47.823 124.259 l +47.849 124.705 l +47.823 125.151 l +47.745 125.590 l +47.617 126.018 l +47.440 126.428 l +47.217 126.815 l +46.950 127.173 l +46.643 127.498 l +46.301 127.785 l +45.928 128.031 l +45.529 128.231 l +45.109 128.384 l +44.675 128.487 l +44.231 128.539 l +43.785 128.539 l +43.341 128.487 l +42.906 128.384 l +42.487 128.231 l +42.087 128.031 l +41.714 127.785 l +41.372 127.498 l +41.066 127.173 l +40.799 126.815 l +40.576 126.428 l +40.399 126.018 l +40.271 125.590 l +40.193 125.151 l +40.167 124.705 l +40.193 124.259 l +40.271 123.819 l +40.399 123.391 l +40.576 122.981 l +40.799 122.594 l +41.066 122.236 l +41.372 121.911 l +41.714 121.624 l +42.087 121.379 l +42.487 121.178 l +42.906 121.025 l +43.341 120.922 l +43.785 120.871 l +44.231 120.871 l +h +49.183 59.925 m +49.627 59.977 l +50.062 60.080 l +50.481 60.233 l +50.880 60.433 l +51.254 60.679 l +51.596 60.966 l +51.902 61.291 l +52.169 61.649 l +52.392 62.036 l +52.569 62.446 l +52.697 62.874 l +52.775 63.314 l +52.801 63.760 l +52.775 64.205 l +52.697 64.645 l +52.569 65.073 l +52.392 65.483 l +52.169 65.870 l +51.902 66.228 l +51.596 66.553 l +51.254 66.840 l +50.880 67.086 l +50.481 67.286 l +50.062 67.439 l +49.627 67.542 l +49.183 67.594 l +48.737 67.594 l +48.293 67.542 l +47.858 67.439 l +47.439 67.286 l +47.040 67.086 l +46.666 66.840 l +46.324 66.553 l +46.018 66.228 l +45.751 65.870 l +45.528 65.483 l +45.351 65.073 l +45.223 64.645 l +45.145 64.205 l +45.119 63.760 l +45.145 63.314 l +45.223 62.874 l +45.351 62.446 l +45.528 62.036 l +45.751 61.649 l +46.018 61.291 l +46.324 60.966 l +46.666 60.679 l +47.040 60.433 l +47.439 60.233 l +47.858 60.080 l +48.293 59.977 l +48.737 59.925 l +49.183 59.925 l +h +285.703 190.371 m +286.147 190.319 l +286.593 190.319 l +287.037 190.371 l +287.471 190.474 l +287.891 190.626 l +288.290 190.827 l +288.663 191.072 l +289.006 191.359 l +289.312 191.684 l +289.579 192.043 l +289.802 192.429 l +289.979 192.839 l +290.107 193.267 l +290.185 193.707 l +290.211 194.153 l +290.185 194.599 l +290.107 195.039 l +289.979 195.467 l +289.802 195.877 l +289.579 196.264 l +289.312 196.622 l +289.006 196.947 l +288.663 197.234 l +288.290 197.479 l +287.891 197.680 l +287.471 197.832 l +287.037 197.935 l +286.593 197.987 l +286.147 197.987 l +285.703 197.935 l +285.268 197.832 l +284.849 197.680 l +284.450 197.479 l +284.076 197.234 l +283.734 196.947 l +283.428 196.622 l +283.161 196.264 l +282.938 195.877 l +282.761 195.467 l +282.633 195.039 l +282.555 194.599 l +282.529 194.153 l +282.555 193.707 l +282.633 193.267 l +282.761 192.839 l +282.938 192.429 l +283.161 192.043 l +283.428 191.684 l +283.734 191.359 l +284.076 191.072 l +284.450 190.827 l +284.849 190.626 l +285.268 190.474 l +285.703 190.371 l +h +36.255 190.371 m +36.698 190.319 l +37.145 190.319 l +37.589 190.371 l +38.023 190.474 l +38.443 190.626 l +38.842 190.827 l +39.215 191.072 l +39.557 191.359 l +39.864 191.684 l +40.130 192.043 l +40.354 192.429 l +40.531 192.839 l +40.659 193.267 l +40.736 193.707 l +40.762 194.153 l +40.736 194.599 l +40.659 195.039 l +40.531 195.467 l +40.354 195.877 l +40.130 196.264 l +39.864 196.622 l +39.557 196.947 l +39.215 197.234 l +38.842 197.479 l +38.443 197.680 l +38.023 197.832 l +37.589 197.935 l +37.145 197.987 l +36.698 197.987 l +36.255 197.935 l +35.820 197.832 l +35.400 197.680 l +35.001 197.479 l +34.628 197.234 l +34.286 196.947 l +33.979 196.622 l +33.713 196.264 l +33.489 195.877 l +33.313 195.467 l +33.184 195.039 l +33.107 194.599 l +33.081 194.153 l +33.107 193.707 l +33.184 193.267 l +33.313 192.839 l +33.489 192.429 l +33.713 192.043 l +33.979 191.684 l +34.286 191.359 l +34.628 191.072 l +35.001 190.827 l +35.400 190.626 l +35.820 190.474 l +36.255 190.371 l +h +304.200 127.403 m +304.629 127.429 l +305.051 127.507 l +305.461 127.635 l +305.853 127.811 l +306.221 128.033 l +306.559 128.298 l +306.863 128.602 l +307.128 128.940 l +307.350 129.308 l +307.526 129.699 l +307.654 130.109 l +307.731 130.532 l +307.757 130.961 l +307.731 131.389 l +307.654 131.812 l +307.526 132.222 l +307.350 132.614 l +307.128 132.981 l +306.863 133.320 l +306.559 133.623 l +306.221 133.888 l +305.853 134.110 l +305.461 134.287 l +305.051 134.414 l +304.629 134.492 l +304.200 134.518 l +303.771 134.492 l +303.349 134.414 l +302.939 134.287 l +302.547 134.110 l +302.179 133.888 l +301.841 133.623 l +301.537 133.320 l +301.272 132.981 l +301.050 132.614 l +300.874 132.222 l +300.746 131.812 l +300.669 131.389 l +300.643 130.961 l +300.669 130.532 l +300.746 130.109 l +300.874 129.699 l +301.050 129.308 l +301.272 128.940 l +301.537 128.602 l +301.841 128.298 l +302.179 128.033 l +302.547 127.811 l +302.939 127.635 l +303.349 127.507 l +303.771 127.429 l +304.200 127.403 l +h +90.079 167.006 m +90.490 167.032 l +90.893 167.109 l +91.284 167.236 l +91.656 167.411 l +92.003 167.632 l +92.320 167.894 l +92.602 168.193 l +92.843 168.526 l +93.041 168.886 l +93.193 169.268 l +93.295 169.667 l +93.346 170.074 l +93.346 170.486 l +93.295 170.893 l +93.193 171.292 l +93.041 171.674 l +92.843 172.034 l +92.602 172.367 l +92.320 172.666 l +92.003 172.928 l +91.656 173.149 l +91.284 173.324 l +90.893 173.451 l +90.490 173.528 l +90.079 173.554 l +89.669 173.528 l +89.265 173.451 l +88.874 173.324 l +88.502 173.149 l +88.155 172.928 l +87.838 172.666 l +87.557 172.367 l +87.315 172.034 l +87.117 171.674 l +86.966 171.292 l +86.863 170.893 l +86.812 170.486 l +86.812 170.074 l +86.863 169.667 l +86.966 169.268 l +87.117 168.886 l +87.315 168.526 l +87.557 168.193 l +87.838 167.894 l +88.155 167.632 l +88.502 167.411 l +88.874 167.236 l +89.265 167.109 l +89.669 167.032 l +90.079 167.006 l +h +257.603 163.881 m +258.005 163.932 l +258.398 164.035 l +258.774 164.188 l +259.127 164.387 l +259.452 164.629 l +259.744 164.912 l +259.997 165.229 l +260.207 165.576 l +260.371 165.947 l +260.487 166.336 l +260.551 166.736 l +260.564 167.141 l +260.525 167.545 l +260.435 167.941 l +260.295 168.322 l +260.107 168.681 l +259.875 169.014 l +259.603 169.314 l +259.294 169.577 l +258.954 169.799 l +258.588 169.975 l +258.203 170.102 l +257.805 170.180 l +257.400 170.206 l +256.995 170.180 l +256.597 170.102 l +256.212 169.975 l +255.846 169.799 l +255.506 169.577 l +255.197 169.314 l +254.925 169.014 l +254.693 168.681 l +254.505 168.322 l +254.365 167.941 l +254.275 167.545 l +254.236 167.141 l +254.249 166.736 l +254.313 166.336 l +254.429 165.947 l +254.593 165.576 l +254.803 165.229 l +255.056 164.912 l +255.348 164.629 l +255.673 164.387 l +256.026 164.188 l +256.402 164.035 l +256.795 163.932 l +257.197 163.881 l +257.603 163.881 l +h +271.195 156.732 m +271.597 156.681 l +272.003 156.681 l +272.405 156.732 l +272.798 156.835 l +273.174 156.988 l +273.527 157.187 l +273.852 157.429 l +274.144 157.712 l +274.397 158.029 l +274.607 158.376 l +274.771 158.747 l +274.887 159.136 l +274.951 159.536 l +274.964 159.941 l +274.925 160.345 l +274.835 160.741 l +274.695 161.122 l +274.507 161.481 l +274.275 161.814 l +274.003 162.114 l +273.694 162.377 l +273.354 162.599 l +272.988 162.775 l +272.603 162.902 l +272.205 162.980 l +271.800 163.006 l +271.395 162.980 l +270.997 162.902 l +270.612 162.775 l +270.246 162.599 l +269.906 162.377 l +269.597 162.114 l +269.325 161.814 l +269.093 161.481 l +268.905 161.122 l +268.765 160.741 l +268.675 160.345 l +268.636 159.941 l +268.649 159.536 l +268.713 159.136 l +268.829 158.747 l +268.993 158.376 l +269.203 158.029 l +269.456 157.712 l +269.748 157.429 l +270.073 157.187 l +270.426 156.988 l +270.802 156.835 l +271.195 156.732 l +h +242.395 156.732 m +242.797 156.681 l +243.203 156.681 l +243.605 156.732 l +243.998 156.835 l +244.374 156.988 l +244.727 157.187 l +245.052 157.429 l +245.344 157.712 l +245.597 158.029 l +245.807 158.376 l +245.971 158.747 l +246.087 159.136 l +246.151 159.536 l +246.164 159.941 l +246.125 160.345 l +246.035 160.741 l +245.895 161.122 l +245.707 161.481 l +245.475 161.814 l +245.203 162.114 l +244.894 162.377 l +244.554 162.599 l +244.188 162.775 l +243.803 162.902 l +243.405 162.980 l +243.000 163.006 l +242.595 162.980 l +242.197 162.902 l +241.812 162.775 l +241.446 162.599 l +241.106 162.377 l +240.797 162.114 l +240.525 161.814 l +240.293 161.481 l +240.105 161.122 l +239.965 160.741 l +239.875 160.345 l +239.836 159.941 l +239.849 159.536 l +239.913 159.136 l +240.029 158.747 l +240.193 158.376 l +240.403 158.029 l +240.656 157.712 l +240.948 157.429 l +241.273 157.187 l +241.626 156.988 l +242.002 156.835 l +242.395 156.732 l +h +220.795 156.732 m +221.197 156.681 l +221.603 156.681 l +222.005 156.732 l +222.398 156.835 l +222.774 156.988 l +223.127 157.187 l +223.452 157.429 l +223.744 157.712 l +223.997 158.029 l +224.207 158.376 l +224.371 158.747 l +224.487 159.136 l +224.551 159.536 l +224.564 159.941 l +224.525 160.345 l +224.435 160.741 l +224.295 161.122 l +224.107 161.481 l +223.875 161.814 l +223.603 162.114 l +223.294 162.377 l +222.954 162.599 l +222.588 162.775 l +222.203 162.902 l +221.805 162.980 l +221.400 163.006 l +220.995 162.980 l +220.597 162.902 l +220.212 162.775 l +219.846 162.599 l +219.506 162.377 l +219.197 162.114 l +218.925 161.814 l +218.693 161.481 l +218.505 161.122 l +218.365 160.741 l +218.275 160.345 l +218.236 159.941 l +218.249 159.536 l +218.313 159.136 l +218.429 158.747 l +218.593 158.376 l +218.803 158.029 l +219.056 157.712 l +219.348 157.429 l +219.673 157.187 l +220.026 156.988 l +220.402 156.835 l +220.795 156.732 l +h +257.603 156.681 m +258.005 156.732 l +258.398 156.835 l +258.774 156.988 l +259.127 157.187 l +259.452 157.429 l +259.744 157.712 l +259.997 158.029 l +260.207 158.376 l +260.371 158.747 l +260.487 159.136 l +260.551 159.536 l +260.564 159.941 l +260.525 160.345 l +260.435 160.741 l +260.295 161.122 l +260.107 161.481 l +259.875 161.814 l +259.603 162.114 l +259.294 162.377 l +258.954 162.599 l +258.588 162.775 l +258.203 162.902 l +257.805 162.980 l +257.400 163.006 l +256.995 162.980 l +256.597 162.902 l +256.212 162.775 l +255.846 162.599 l +255.506 162.377 l +255.197 162.114 l +254.925 161.814 l +254.693 161.481 l +254.505 161.122 l +254.365 160.741 l +254.275 160.345 l +254.236 159.941 l +254.249 159.536 l +254.313 159.136 l +254.429 158.747 l +254.593 158.376 l +254.803 158.029 l +255.056 157.712 l +255.348 157.429 l +255.673 157.187 l +256.026 156.988 l +256.402 156.835 l +256.795 156.732 l +257.197 156.681 l +257.603 156.681 l +h +236.003 156.681 m +236.405 156.732 l +236.798 156.835 l +237.174 156.988 l +237.527 157.187 l +237.852 157.429 l +238.144 157.712 l +238.397 158.029 l +238.607 158.376 l +238.771 158.747 l +238.887 159.136 l +238.951 159.536 l +238.964 159.941 l +238.925 160.345 l +238.835 160.741 l +238.695 161.122 l +238.507 161.481 l +238.275 161.814 l +238.003 162.114 l +237.694 162.377 l +237.354 162.599 l +236.988 162.775 l +236.603 162.902 l +236.205 162.980 l +235.800 163.006 l +235.395 162.980 l +234.997 162.902 l +234.612 162.775 l +234.246 162.599 l +233.906 162.377 l +233.597 162.114 l +233.325 161.814 l +233.093 161.481 l +232.905 161.122 l +232.765 160.741 l +232.675 160.345 l +232.636 159.941 l +232.649 159.536 l +232.713 159.136 l +232.829 158.747 l +232.993 158.376 l +233.203 158.029 l +233.456 157.712 l +233.748 157.429 l +234.073 157.187 l +234.426 156.988 l +234.802 156.835 l +235.195 156.732 l +235.597 156.681 l +236.003 156.681 l +h +249.595 156.732 m +249.997 156.681 l +250.403 156.681 l +250.805 156.732 l +251.198 156.835 l +251.574 156.988 l +251.927 157.187 l +252.252 157.429 l +252.544 157.712 l +252.797 158.029 l +253.007 158.376 l +253.171 158.747 l +253.287 159.136 l +253.351 159.536 l +253.364 159.941 l +253.325 160.345 l +253.235 160.741 l +253.095 161.122 l +252.907 161.481 l +252.675 161.814 l +252.403 162.114 l +252.094 162.377 l +251.754 162.599 l +251.388 162.775 l +251.003 162.902 l +250.605 162.980 l +250.200 163.006 l +249.795 162.980 l +249.397 162.902 l +249.012 162.775 l +248.646 162.599 l +248.306 162.377 l +247.997 162.114 l +247.725 161.814 l +247.493 161.481 l +247.305 161.122 l +247.165 160.741 l +247.075 160.345 l +247.036 159.941 l +247.049 159.536 l +247.113 159.136 l +247.229 158.747 l +247.393 158.376 l +247.603 158.029 l +247.856 157.712 l +248.148 157.429 l +248.473 157.187 l +248.826 156.988 l +249.202 156.835 l +249.595 156.732 l +h +104.121 113.035 m +104.526 113.061 l +104.924 113.138 l +105.309 113.266 l +105.674 113.442 l +106.014 113.663 l +106.323 113.926 l +106.596 114.227 l +106.828 114.559 l +107.016 114.919 l +107.156 115.300 l +107.246 115.695 l +107.285 116.099 l +107.272 116.505 l +107.207 116.905 l +107.092 117.294 l +106.928 117.665 l +106.717 118.012 l +106.464 118.329 l +106.173 118.611 l +105.848 118.854 l +105.494 119.053 l +105.118 119.205 l +104.726 119.308 l +104.324 119.360 l +103.918 119.360 l +103.516 119.308 l +103.123 119.205 l +102.747 119.053 l +102.394 118.854 l +102.069 118.611 l +101.777 118.329 l +101.524 118.012 l +101.314 117.665 l +101.150 117.294 l +101.034 116.905 l +100.969 116.505 l +100.956 116.099 l +100.995 115.695 l +101.086 115.300 l +101.226 114.919 l +101.413 114.559 l +101.646 114.227 l +101.918 113.926 l +102.227 113.663 l +102.567 113.442 l +102.933 113.266 l +103.318 113.138 l +103.716 113.061 l +104.121 113.035 l +h +227.995 156.732 m +228.397 156.681 l +228.803 156.681 l +229.205 156.732 l +229.598 156.835 l +229.974 156.988 l +230.327 157.187 l +230.652 157.429 l +230.944 157.712 l +231.197 158.029 l +231.407 158.376 l +231.571 158.747 l +231.687 159.136 l +231.751 159.536 l +231.764 159.941 l +231.725 160.345 l +231.635 160.741 l +231.495 161.122 l +231.307 161.481 l +231.075 161.814 l +230.803 162.114 l +230.494 162.377 l +230.154 162.599 l +229.788 162.775 l +229.403 162.902 l +229.005 162.980 l +228.600 163.006 l +228.195 162.980 l +227.797 162.902 l +227.412 162.775 l +227.046 162.599 l +226.706 162.377 l +226.397 162.114 l +226.125 161.814 l +225.893 161.481 l +225.705 161.122 l +225.565 160.741 l +225.475 160.345 l +225.436 159.941 l +225.449 159.536 l +225.513 159.136 l +225.629 158.747 l +225.793 158.376 l +226.003 158.029 l +226.256 157.712 l +226.548 157.429 l +226.873 157.187 l +227.226 156.988 l +227.602 156.835 l +227.995 156.732 l +h +263.995 156.732 m +264.397 156.681 l +264.803 156.681 l +265.205 156.732 l +265.598 156.835 l +265.974 156.988 l +266.327 157.187 l +266.652 157.429 l +266.944 157.712 l +267.197 158.029 l +267.407 158.376 l +267.571 158.747 l +267.687 159.136 l +267.751 159.536 l +267.764 159.941 l +267.725 160.345 l +267.635 160.741 l +267.495 161.122 l +267.307 161.481 l +267.075 161.814 l +266.803 162.114 l +266.494 162.377 l +266.154 162.599 l +265.788 162.775 l +265.403 162.902 l +265.005 162.980 l +264.600 163.006 l +264.195 162.980 l +263.797 162.902 l +263.412 162.775 l +263.046 162.599 l +262.706 162.377 l +262.397 162.114 l +262.125 161.814 l +261.893 161.481 l +261.705 161.122 l +261.565 160.741 l +261.475 160.345 l +261.436 159.941 l +261.449 159.536 l +261.513 159.136 l +261.629 158.747 l +261.793 158.376 l +262.003 158.029 l +262.256 157.712 l +262.548 157.429 l +262.873 157.187 l +263.226 156.988 l +263.602 156.835 l +263.995 156.732 l +h +111.681 113.035 m +112.086 113.061 l +112.484 113.138 l +112.869 113.266 l +113.234 113.442 l +113.574 113.663 l +113.883 113.926 l +114.156 114.227 l +114.388 114.559 l +114.576 114.919 l +114.716 115.300 l +114.806 115.695 l +114.845 116.099 l +114.832 116.505 l +114.767 116.905 l +114.652 117.294 l +114.488 117.665 l +114.277 118.012 l +114.024 118.329 l +113.733 118.611 l +113.408 118.854 l +113.054 119.053 l +112.678 119.205 l +112.286 119.308 l +111.884 119.360 l +111.478 119.360 l +111.076 119.308 l +110.683 119.205 l +110.307 119.053 l +109.954 118.854 l +109.629 118.611 l +109.337 118.329 l +109.084 118.012 l +108.874 117.665 l +108.710 117.294 l +108.594 116.905 l +108.529 116.505 l +108.516 116.099 l +108.555 115.695 l +108.646 115.300 l +108.786 114.919 l +108.973 114.559 l +109.206 114.227 l +109.478 113.926 l +109.787 113.663 l +110.127 113.442 l +110.493 113.266 l +110.878 113.138 l +111.276 113.061 l +111.681 113.035 l +h +111.991 24.595 m +112.394 24.634 l +112.790 24.725 l +113.171 24.865 l +113.530 25.052 l +113.863 25.284 l +114.163 25.557 l +114.426 25.866 l +114.648 26.206 l +114.824 26.572 l +114.952 26.957 l +115.029 27.355 l +115.055 27.760 l +115.029 28.165 l +114.952 28.563 l +114.824 28.948 l +114.648 29.313 l +114.426 29.653 l +114.163 29.962 l +113.863 30.235 l +113.530 30.467 l +113.171 30.655 l +112.790 30.795 l +112.394 30.885 l +111.991 30.924 l +111.585 30.911 l +111.185 30.846 l +110.796 30.731 l +110.425 30.567 l +110.078 30.356 l +109.761 30.103 l +109.478 29.812 l +109.236 29.487 l +109.037 29.133 l +108.884 28.757 l +108.782 28.365 l +108.730 27.963 l +108.730 27.557 l +108.782 27.154 l +108.884 26.762 l +109.037 26.386 l +109.236 26.033 l +109.478 25.707 l +109.761 25.416 l +110.078 25.163 l +110.425 24.953 l +110.796 24.789 l +111.185 24.673 l +111.585 24.608 l +111.991 24.595 l +h +111.631 96.595 m +112.034 96.634 l +112.430 96.725 l +112.811 96.865 l +113.170 97.052 l +113.503 97.284 l +113.803 97.557 l +114.066 97.866 l +114.288 98.206 l +114.464 98.572 l +114.592 98.957 l +114.669 99.355 l +114.695 99.760 l +114.669 100.165 l +114.592 100.563 l +114.464 100.948 l +114.288 101.313 l +114.066 101.653 l +113.803 101.962 l +113.503 102.235 l +113.170 102.467 l +112.811 102.655 l +112.430 102.795 l +112.034 102.885 l +111.631 102.924 l +111.225 102.911 l +110.825 102.846 l +110.436 102.731 l +110.065 102.567 l +109.718 102.356 l +109.401 102.103 l +109.118 101.812 l +108.876 101.487 l +108.677 101.133 l +108.524 100.757 l +108.422 100.365 l +108.370 99.963 l +108.370 99.557 l +108.422 99.154 l +108.524 98.762 l +108.677 98.386 l +108.876 98.033 l +109.118 97.707 l +109.401 97.416 l +109.718 97.163 l +110.065 96.953 l +110.436 96.789 l +110.825 96.673 l +111.225 96.608 l +111.631 96.595 l +h +132.825 96.608 m +133.231 96.595 l +133.634 96.634 l +134.030 96.725 l +134.411 96.865 l +134.770 97.052 l +135.103 97.284 l +135.403 97.557 l +135.666 97.866 l +135.888 98.206 l +136.064 98.572 l +136.192 98.957 l +136.269 99.355 l +136.295 99.760 l +136.269 100.165 l +136.192 100.563 l +136.064 100.948 l +135.888 101.313 l +135.666 101.653 l +135.403 101.962 l +135.103 102.235 l +134.770 102.467 l +134.411 102.655 l +134.030 102.795 l +133.634 102.885 l +133.231 102.924 l +132.825 102.911 l +132.425 102.846 l +132.036 102.731 l +131.665 102.567 l +131.318 102.356 l +131.001 102.103 l +130.718 101.812 l +130.476 101.487 l +130.277 101.133 l +130.124 100.757 l +130.022 100.365 l +129.970 99.963 l +129.970 99.557 l +130.022 99.154 l +130.124 98.762 l +130.277 98.386 l +130.476 98.033 l +130.718 97.707 l +131.001 97.416 l +131.318 97.163 l +131.665 96.953 l +132.036 96.789 l +132.425 96.673 l +132.825 96.608 l +h +126.031 96.595 m +126.434 96.634 l +126.830 96.725 l +127.211 96.865 l +127.570 97.052 l +127.903 97.284 l +128.203 97.557 l +128.466 97.866 l +128.688 98.206 l +128.864 98.572 l +128.992 98.957 l +129.069 99.355 l +129.095 99.760 l +129.069 100.165 l +128.992 100.563 l +128.864 100.948 l +128.688 101.313 l +128.466 101.653 l +128.203 101.962 l +127.903 102.235 l +127.570 102.467 l +127.211 102.655 l +126.830 102.795 l +126.434 102.885 l +126.031 102.924 l +125.625 102.911 l +125.225 102.846 l +124.836 102.731 l +124.465 102.567 l +124.118 102.356 l +123.801 102.103 l +123.518 101.812 l +123.276 101.487 l +123.077 101.133 l +122.924 100.757 l +122.822 100.365 l +122.770 99.963 l +122.770 99.557 l +122.822 99.154 l +122.924 98.762 l +123.077 98.386 l +123.276 98.033 l +123.518 97.707 l +123.801 97.416 l +124.118 97.163 l +124.465 96.953 l +124.836 96.789 l +125.225 96.673 l +125.625 96.608 l +126.031 96.595 l +h +133.591 24.595 m +133.994 24.634 l +134.390 24.725 l +134.771 24.865 l +135.130 25.052 l +135.463 25.284 l +135.763 25.557 l +136.026 25.866 l +136.248 26.206 l +136.424 26.572 l +136.552 26.957 l +136.629 27.355 l +136.655 27.760 l +136.629 28.165 l +136.552 28.563 l +136.424 28.948 l +136.248 29.313 l +136.026 29.653 l +135.763 29.962 l +135.463 30.235 l +135.130 30.467 l +134.771 30.655 l +134.390 30.795 l +133.994 30.885 l +133.591 30.924 l +133.185 30.911 l +132.785 30.846 l +132.396 30.731 l +132.025 30.567 l +131.678 30.356 l +131.361 30.103 l +131.078 29.812 l +130.836 29.487 l +130.637 29.133 l +130.484 28.757 l +130.382 28.365 l +130.330 27.963 l +130.330 27.557 l +130.382 27.154 l +130.484 26.762 l +130.637 26.386 l +130.836 26.033 l +131.078 25.707 l +131.361 25.416 l +131.678 25.163 l +132.025 24.953 l +132.396 24.789 l +132.785 24.673 l +133.185 24.608 l +133.591 24.595 l +h +82.881 113.035 m +83.286 113.061 l +83.684 113.138 l +84.069 113.266 l +84.434 113.442 l +84.774 113.663 l +85.083 113.926 l +85.356 114.227 l +85.588 114.559 l +85.776 114.919 l +85.916 115.300 l +86.006 115.695 l +86.045 116.099 l +86.032 116.505 l +85.967 116.905 l +85.852 117.294 l +85.688 117.665 l +85.477 118.012 l +85.224 118.329 l +84.933 118.611 l +84.608 118.854 l +84.254 119.053 l +83.878 119.205 l +83.486 119.308 l +83.084 119.360 l +82.678 119.360 l +82.276 119.308 l +81.883 119.205 l +81.507 119.053 l +81.154 118.854 l +80.829 118.611 l +80.537 118.329 l +80.284 118.012 l +80.074 117.665 l +79.910 117.294 l +79.794 116.905 l +79.729 116.505 l +79.716 116.099 l +79.755 115.695 l +79.846 115.300 l +79.986 114.919 l +80.173 114.559 l +80.406 114.227 l +80.678 113.926 l +80.987 113.663 l +81.327 113.442 l +81.693 113.266 l +82.078 113.138 l +82.476 113.061 l +82.881 113.035 l +h +53.985 24.608 m +54.391 24.595 l +54.794 24.634 l +55.190 24.725 l +55.571 24.865 l +55.930 25.052 l +56.263 25.284 l +56.563 25.557 l +56.826 25.866 l +57.048 26.206 l +57.224 26.572 l +57.352 26.957 l +57.429 27.355 l +57.455 27.760 l +57.429 28.165 l +57.352 28.563 l +57.224 28.948 l +57.048 29.313 l +56.826 29.653 l +56.563 29.962 l +56.263 30.235 l +55.930 30.467 l +55.571 30.655 l +55.190 30.795 l +54.794 30.885 l +54.391 30.924 l +53.985 30.911 l +53.585 30.846 l +53.196 30.731 l +52.825 30.567 l +52.478 30.356 l +52.161 30.103 l +51.878 29.812 l +51.636 29.487 l +51.437 29.133 l +51.284 28.757 l +51.182 28.365 l +51.130 27.963 l +51.130 27.557 l +51.182 27.154 l +51.284 26.762 l +51.437 26.386 l +51.636 26.033 l +51.878 25.707 l +52.161 25.416 l +52.478 25.163 l +52.825 24.953 l +53.196 24.789 l +53.585 24.673 l +53.985 24.608 l +h +68.431 96.595 m +68.834 96.634 l +69.230 96.725 l +69.611 96.865 l +69.970 97.052 l +70.303 97.284 l +70.603 97.557 l +70.866 97.866 l +71.088 98.206 l +71.264 98.572 l +71.392 98.957 l +71.469 99.355 l +71.495 99.760 l +71.469 100.165 l +71.392 100.563 l +71.264 100.948 l +71.088 101.313 l +70.866 101.653 l +70.603 101.962 l +70.303 102.235 l +69.970 102.467 l +69.611 102.655 l +69.230 102.795 l +68.834 102.885 l +68.431 102.924 l +68.025 102.911 l +67.625 102.846 l +67.236 102.731 l +66.865 102.567 l +66.518 102.356 l +66.201 102.103 l +65.918 101.812 l +65.676 101.487 l +65.477 101.133 l +65.324 100.757 l +65.222 100.365 l +65.170 99.963 l +65.170 99.557 l +65.222 99.154 l +65.324 98.762 l +65.477 98.386 l +65.676 98.033 l +65.918 97.707 l +66.201 97.416 l +66.518 97.163 l +66.865 96.953 l +67.236 96.789 l +67.625 96.673 l +68.025 96.608 l +68.431 96.595 l +h +54.031 96.595 m +54.434 96.634 l +54.830 96.725 l +55.211 96.865 l +55.570 97.052 l +55.903 97.284 l +56.203 97.557 l +56.466 97.866 l +56.688 98.206 l +56.864 98.572 l +56.992 98.957 l +57.069 99.355 l +57.095 99.760 l +57.069 100.165 l +56.992 100.563 l +56.864 100.948 l +56.688 101.313 l +56.466 101.653 l +56.203 101.962 l +55.903 102.235 l +55.570 102.467 l +55.211 102.655 l +54.830 102.795 l +54.434 102.885 l +54.031 102.924 l +53.625 102.911 l +53.225 102.846 l +52.836 102.731 l +52.465 102.567 l +52.118 102.356 l +51.801 102.103 l +51.518 101.812 l +51.276 101.487 l +51.077 101.133 l +50.924 100.757 l +50.822 100.365 l +50.770 99.963 l +50.770 99.557 l +50.822 99.154 l +50.924 98.762 l +51.077 98.386 l +51.276 98.033 l +51.518 97.707 l +51.801 97.416 l +52.118 97.163 l +52.465 96.953 l +52.836 96.789 l +53.225 96.673 l +53.625 96.608 l +54.031 96.595 l +h +75.991 24.595 m +76.394 24.634 l +76.790 24.725 l +77.171 24.865 l +77.530 25.052 l +77.863 25.284 l +78.163 25.557 l +78.426 25.866 l +78.648 26.206 l +78.824 26.572 l +78.952 26.957 l +79.029 27.355 l +79.055 27.760 l +79.029 28.165 l +78.952 28.563 l +78.824 28.948 l +78.648 29.313 l +78.426 29.653 l +78.163 29.962 l +77.863 30.235 l +77.530 30.467 l +77.171 30.655 l +76.790 30.795 l +76.394 30.885 l +75.991 30.924 l +75.585 30.911 l +75.185 30.846 l +74.796 30.731 l +74.425 30.567 l +74.078 30.356 l +73.761 30.103 l +73.478 29.812 l +73.236 29.487 l +73.037 29.133 l +72.884 28.757 l +72.782 28.365 l +72.730 27.963 l +72.730 27.557 l +72.782 27.154 l +72.884 26.762 l +73.037 26.386 l +73.236 26.033 l +73.478 25.707 l +73.761 25.416 l +74.078 25.163 l +74.425 24.953 l +74.796 24.789 l +75.185 24.673 l +75.585 24.608 l +75.991 24.595 l +h +60.884 24.652 m +61.286 24.600 l +61.692 24.600 l +62.094 24.652 l +62.487 24.755 l +62.863 24.907 l +63.216 25.106 l +63.541 25.349 l +63.833 25.631 l +64.086 25.948 l +64.296 26.295 l +64.460 26.666 l +64.576 27.055 l +64.640 27.456 l +64.653 27.861 l +64.615 28.265 l +64.524 28.660 l +64.384 29.041 l +64.197 29.401 l +63.964 29.734 l +63.692 30.034 l +63.383 30.297 l +63.043 30.518 l +62.677 30.694 l +62.292 30.822 l +61.894 30.900 l +61.489 30.926 l +61.084 30.900 l +60.686 30.822 l +60.301 30.694 l +59.936 30.518 l +59.596 30.297 l +59.287 30.034 l +59.014 29.734 l +58.782 29.401 l +58.594 29.041 l +58.454 28.660 l +58.364 28.265 l +58.325 27.861 l +58.338 27.456 l +58.403 27.055 l +58.518 26.666 l +58.682 26.295 l +58.893 25.948 l +59.145 25.631 l +59.437 25.349 l +59.762 25.106 l +60.115 24.907 l +60.492 24.755 l +60.884 24.652 l +h +82.785 24.608 m +83.191 24.595 l +83.594 24.634 l +83.990 24.725 l +84.371 24.865 l +84.730 25.052 l +85.063 25.284 l +85.363 25.557 l +85.626 25.866 l +85.848 26.206 l +86.024 26.572 l +86.152 26.957 l +86.229 27.355 l +86.255 27.760 l +86.229 28.165 l +86.152 28.563 l +86.024 28.948 l +85.848 29.313 l +85.626 29.653 l +85.363 29.962 l +85.063 30.235 l +84.730 30.467 l +84.371 30.655 l +83.990 30.795 l +83.594 30.885 l +83.191 30.924 l +82.785 30.911 l +82.385 30.846 l +81.996 30.731 l +81.625 30.567 l +81.278 30.356 l +80.961 30.103 l +80.678 29.812 l +80.436 29.487 l +80.237 29.133 l +80.084 28.757 l +79.982 28.365 l +79.930 27.963 l +79.930 27.557 l +79.982 27.154 l +80.084 26.762 l +80.237 26.386 l +80.436 26.033 l +80.678 25.707 l +80.961 25.416 l +81.278 25.163 l +81.625 24.953 l +81.996 24.789 l +82.385 24.673 l +82.785 24.608 l +h +60.825 96.608 m +61.231 96.595 l +61.634 96.634 l +62.030 96.725 l +62.411 96.865 l +62.770 97.052 l +63.103 97.284 l +63.403 97.557 l +63.666 97.866 l +63.888 98.206 l +64.064 98.572 l +64.192 98.957 l +64.269 99.355 l +64.295 99.760 l +64.269 100.165 l +64.192 100.563 l +64.064 100.948 l +63.888 101.313 l +63.666 101.653 l +63.403 101.962 l +63.103 102.235 l +62.770 102.467 l +62.411 102.655 l +62.030 102.795 l +61.634 102.885 l +61.231 102.924 l +60.825 102.911 l +60.425 102.846 l +60.036 102.731 l +59.665 102.567 l +59.318 102.356 l +59.001 102.103 l +58.718 101.812 l +58.476 101.487 l +58.277 101.133 l +58.124 100.757 l +58.022 100.365 l +57.970 99.963 l +57.970 99.557 l +58.022 99.154 l +58.124 98.762 l +58.277 98.386 l +58.476 98.033 l +58.718 97.707 l +59.001 97.416 l +59.318 97.163 l +59.665 96.953 l +60.036 96.789 l +60.425 96.673 l +60.825 96.608 l +h +68.791 24.595 m +69.194 24.634 l +69.590 24.725 l +69.971 24.865 l +70.330 25.052 l +70.663 25.284 l +70.963 25.557 l +71.226 25.866 l +71.448 26.206 l +71.624 26.572 l +71.752 26.957 l +71.829 27.355 l +71.855 27.760 l +71.829 28.165 l +71.752 28.563 l +71.624 28.948 l +71.448 29.313 l +71.226 29.653 l +70.963 29.962 l +70.663 30.235 l +70.330 30.467 l +69.971 30.655 l +69.590 30.795 l +69.194 30.885 l +68.791 30.924 l +68.385 30.911 l +67.985 30.846 l +67.596 30.731 l +67.225 30.567 l +66.878 30.356 l +66.561 30.103 l +66.278 29.812 l +66.036 29.487 l +65.837 29.133 l +65.684 28.757 l +65.582 28.365 l +65.530 27.963 l +65.530 27.557 l +65.582 27.154 l +65.684 26.762 l +65.837 26.386 l +66.036 26.033 l +66.278 25.707 l +66.561 25.416 l +66.878 25.163 l +67.225 24.953 l +67.596 24.789 l +67.985 24.673 l +68.385 24.608 l +68.791 24.595 l +h +292.907 166.645 m +293.273 166.595 l +293.642 166.595 l +294.008 166.645 l +294.363 166.745 l +294.702 166.892 l +295.018 167.084 l +295.304 167.317 l +295.556 167.586 l +295.769 167.888 l +295.939 168.216 l +296.062 168.564 l +296.137 168.925 l +296.163 169.294 l +296.137 169.662 l +296.062 170.023 l +295.939 170.371 l +295.769 170.699 l +295.556 171.001 l +295.304 171.271 l +295.018 171.504 l +294.702 171.695 l +294.363 171.843 l +294.008 171.942 l +293.642 171.992 l +293.273 171.992 l +292.907 171.942 l +292.552 171.843 l +292.213 171.695 l +291.898 171.504 l +291.611 171.271 l +291.359 171.001 l +291.146 170.699 l +290.976 170.371 l +290.853 170.023 l +290.778 169.662 l +290.753 169.294 l +290.778 168.925 l +290.853 168.564 l +290.976 168.216 l +291.146 167.888 l +291.359 167.586 l +291.611 167.317 l +291.898 167.084 l +292.213 166.892 l +292.552 166.745 l +292.907 166.645 l +h +44.191 166.595 m +44.557 166.645 l +44.912 166.745 l +45.251 166.892 l +45.566 167.084 l +45.853 167.317 l +46.105 167.586 l +46.318 167.888 l +46.488 168.216 l +46.611 168.564 l +46.686 168.925 l +46.711 169.294 l +46.686 169.662 l +46.611 170.023 l +46.488 170.371 l +46.318 170.699 l +46.105 171.001 l +45.853 171.271 l +45.566 171.504 l +45.251 171.695 l +44.912 171.843 l +44.557 171.942 l +44.191 171.992 l +43.822 171.992 l +43.456 171.942 l +43.101 171.843 l +42.762 171.695 l +42.446 171.504 l +42.160 171.271 l +41.908 171.001 l +41.695 170.699 l +41.525 170.371 l +41.402 170.023 l +41.327 169.662 l +41.301 169.294 l +41.327 168.925 l +41.402 168.564 l +41.525 168.216 l +41.695 167.888 l +41.908 167.586 l +42.160 167.317 l +42.446 167.084 l +42.762 166.892 l +43.101 166.745 l +43.456 166.645 l +43.822 166.595 l +44.191 166.595 l +h +50.656 166.645 m +51.022 166.595 l +51.391 166.595 l +51.757 166.645 l +52.112 166.745 l +52.451 166.892 l +52.766 167.084 l +53.053 167.317 l +53.305 167.586 l +53.518 167.888 l +53.688 168.216 l +53.811 168.564 l +53.886 168.925 l +53.911 169.294 l +53.886 169.662 l +53.811 170.023 l +53.688 170.371 l +53.518 170.699 l +53.305 171.001 l +53.053 171.271 l +52.766 171.504 l +52.451 171.695 l +52.112 171.843 l +51.757 171.942 l +51.391 171.992 l +51.022 171.992 l +50.656 171.942 l +50.301 171.843 l +49.962 171.695 l +49.646 171.504 l +49.360 171.271 l +49.108 171.001 l +48.895 170.699 l +48.725 170.371 l +48.602 170.023 l +48.527 169.662 l +48.501 169.294 l +48.527 168.925 l +48.602 168.564 l +48.725 168.216 l +48.895 167.888 l +49.108 167.586 l +49.360 167.317 l +49.646 167.084 l +49.962 166.892 l +50.301 166.745 l +50.656 166.645 l +h +301.958 83.305 m +302.168 83.325 l +302.357 83.382 l +302.531 83.475 l +302.683 83.600 l +302.808 83.753 l +302.901 83.926 l +302.958 84.115 l +302.979 84.325 l +302.979 87.320 l +301.443 87.320 l +301.443 83.305 l +301.958 83.305 l +h +299.666 94.058 m +299.666 98.073 l +299.152 98.073 l +298.942 98.052 l +298.753 97.995 l +298.579 97.902 l +298.427 97.777 l +298.302 97.625 l +298.209 97.451 l +298.152 97.263 l +298.131 97.052 l +298.131 94.058 l +299.666 94.058 l +h +299.666 83.305 m +299.666 87.320 l +298.131 87.320 l +298.131 84.325 l +298.152 84.115 l +298.209 83.926 l +298.302 83.753 l +298.427 83.600 l +298.579 83.475 l +298.753 83.382 l +298.942 83.325 l +299.152 83.305 l +299.666 83.305 l +h +295.798 194.494 m +295.798 193.554 l +297.262 193.554 l +297.262 195.514 l +296.819 195.514 l +296.608 195.494 l +296.420 195.436 l +296.246 195.343 l +296.094 195.218 l +295.969 195.066 l +295.876 194.892 l +295.819 194.704 l +295.798 194.494 l +h +102.995 171.594 m +102.963 171.674 l +102.765 172.034 l +102.523 172.367 l +102.242 172.666 l +101.925 172.928 l +101.578 173.149 l +101.315 173.273 l +101.315 171.594 l +102.995 171.594 l +h +98.424 167.411 m +98.687 167.287 l +98.687 168.966 l +97.007 168.966 l +97.039 168.886 l +97.237 168.526 l +97.478 168.193 l +97.760 167.894 l +98.077 167.632 l +98.424 167.411 l +h +98.687 171.594 m +98.687 173.273 l +98.424 173.149 l +98.077 172.928 l +97.760 172.666 l +97.478 172.367 l +97.237 172.034 l +97.039 171.674 l +97.007 171.594 l +98.687 171.594 l +h +212.940 117.900 m +212.940 119.540 l +212.646 119.399 l +212.306 119.177 l +211.997 118.914 l +211.725 118.614 l +211.493 118.281 l +211.305 117.922 l +211.297 117.900 l +212.940 117.900 l +h +220.140 117.900 m +220.140 119.540 l +219.846 119.399 l +219.506 119.177 l +219.197 118.914 l +218.925 118.614 l +218.693 118.281 l +218.505 117.922 l +218.497 117.900 l +220.140 117.900 l +h +127.549 26.500 m +127.549 24.857 l +127.571 24.865 l +127.930 25.052 l +128.263 25.284 l +128.563 25.557 l +128.826 25.866 l +129.048 26.206 l +129.189 26.500 l +127.549 26.500 l +h +100.029 101.020 m +99.888 101.313 l +99.666 101.653 l +99.403 101.962 l +99.103 102.235 l +98.770 102.467 l +98.411 102.654 l +98.389 102.662 l +98.389 101.020 l +100.029 101.020 l +h +127.549 30.662 m +127.549 29.020 l +129.189 29.020 l +129.048 29.313 l +128.826 29.653 l +128.563 29.962 l +128.263 30.235 l +127.930 30.467 l +127.571 30.654 l +127.549 30.662 l +h +98.389 96.857 m +98.411 96.865 l +98.770 97.052 l +99.103 97.284 l +99.403 97.557 l +99.666 97.866 l +99.888 98.206 l +100.029 98.500 l +98.389 98.500 l +98.389 96.857 l +h +83.989 98.500 m +83.989 96.857 l +84.011 96.865 l +84.370 97.052 l +84.703 97.284 l +85.003 97.557 l +85.266 97.866 l +85.488 98.206 l +85.629 98.500 l +83.989 98.500 l +h +205.740 117.900 m +205.740 119.540 l +205.446 119.399 l +205.106 119.177 l +204.797 118.914 l +204.525 118.614 l +204.293 118.281 l +204.105 117.922 l +204.097 117.900 l +205.740 117.900 l +h +124.461 113.301 m +124.461 114.941 l +122.818 114.941 l +122.826 114.919 l +123.013 114.559 l +123.246 114.227 l +123.518 113.926 l +123.827 113.663 l +124.167 113.442 l +124.461 113.301 l +h +224.303 117.900 m +224.295 117.922 l +224.107 118.281 l +223.875 118.614 l +223.603 118.914 l +223.294 119.177 l +222.954 119.399 l +222.660 119.540 l +222.660 117.900 l +224.303 117.900 l +h +208.260 119.540 m +208.260 117.900 l +209.903 117.900 l +209.895 117.922 l +209.707 118.281 l +209.475 118.614 l +209.203 118.914 l +208.894 119.177 l +208.554 119.399 l +208.260 119.540 l +h +217.103 117.900 m +217.095 117.922 l +216.907 118.281 l +216.675 118.614 l +216.403 118.914 l +216.094 119.177 l +215.754 119.399 l +215.460 119.540 l +215.460 117.900 l +217.103 117.900 l +h +177.300 115.020 m +177.300 113.383 l +177.504 113.473 l +177.851 113.683 l +178.168 113.936 l +178.451 114.228 l +178.693 114.553 l +178.892 114.906 l +178.938 115.020 l +177.300 115.020 l +h +123.437 29.133 m +123.391 29.020 l +125.029 29.020 l +125.029 30.657 l +124.825 30.567 l +124.478 30.356 l +124.161 30.103 l +123.878 29.812 l +123.636 29.487 l +123.437 29.133 l +h +95.869 101.020 m +95.869 102.657 l +95.665 102.567 l +95.318 102.356 l +95.001 102.103 l +94.718 101.812 l +94.476 101.487 l +94.277 101.133 l +94.231 101.020 l +95.869 101.020 l +h +33.138 65.020 m +33.092 65.134 l +32.893 65.487 l +32.651 65.812 l +32.368 66.104 l +32.051 66.357 l +31.704 66.567 l +31.500 66.657 l +31.500 65.020 l +33.138 65.020 l +h +95.869 96.862 m +95.869 98.500 l +94.231 98.500 l +94.277 98.386 l +94.476 98.033 l +94.718 97.707 l +95.001 97.416 l +95.318 97.163 l +95.665 96.953 l +95.869 96.862 l +h +205.740 164.142 m +205.740 165.780 l +204.103 165.780 l +204.193 165.576 l +204.403 165.229 l +204.656 164.912 l +204.948 164.629 l +205.273 164.387 l +205.626 164.188 l +205.740 164.142 l +h +124.461 117.461 m +124.461 119.099 l +124.347 119.053 l +123.994 118.854 l +123.669 118.611 l +123.377 118.329 l +123.124 118.012 l +122.914 117.665 l +122.823 117.461 l +124.461 117.461 l +h +178.938 117.540 m +178.892 117.654 l +178.693 118.007 l +178.451 118.332 l +178.168 118.624 l +177.851 118.877 l +177.504 119.087 l +177.300 119.177 l +177.300 117.540 l +178.938 117.540 l +h +128.618 117.461 m +128.528 117.665 l +128.317 118.012 l +128.064 118.329 l +127.773 118.611 l +127.448 118.854 l +127.094 119.053 l +126.981 119.099 l +126.981 117.461 l +128.618 117.461 l +h +208.260 165.780 m +208.260 164.142 l +208.374 164.188 l +208.727 164.387 l +209.052 164.629 l +209.344 164.912 l +209.597 165.229 l +209.807 165.576 l +209.897 165.780 l +208.260 165.780 l +h +212.940 113.742 m +212.940 115.380 l +211.303 115.380 l +211.393 115.176 l +211.603 114.829 l +211.856 114.512 l +212.148 114.229 l +212.473 113.987 l +212.826 113.788 l +212.940 113.742 l +h +125.029 24.862 m +125.029 26.500 l +123.391 26.500 l +123.437 26.386 l +123.636 26.033 l +123.878 25.707 l +124.161 25.416 l +124.478 25.163 l +124.825 24.953 l +125.029 24.862 l +h +222.660 113.742 m +222.774 113.788 l +223.127 113.987 l +223.452 114.229 l +223.744 114.512 l +223.997 114.829 l +224.207 115.176 l +224.297 115.380 l +222.660 115.380 l +222.660 113.742 l +h +31.500 60.863 m +31.704 60.953 l +32.051 61.163 l +32.368 61.416 l +32.651 61.708 l +32.893 62.033 l +33.092 62.386 l +33.138 62.500 l +31.500 62.500 l +31.500 60.863 l +h +208.260 113.742 m +208.374 113.788 l +208.727 113.987 l +209.052 114.229 l +209.344 114.512 l +209.597 114.829 l +209.807 115.176 l +209.897 115.380 l +208.260 115.380 l +208.260 113.742 l +h +263.340 113.742 m +263.340 115.380 l +261.703 115.380 l +261.793 115.176 l +262.003 114.829 l +262.256 114.512 l +262.548 114.229 l +262.873 113.987 l +263.226 113.788 l +263.340 113.742 l +h +215.460 115.380 m +215.460 113.742 l +215.574 113.788 l +215.927 113.987 l +216.252 114.229 l +216.544 114.512 l +216.797 114.829 l +217.007 115.176 l +217.097 115.380 l +215.460 115.380 l +h +265.860 113.742 m +265.974 113.788 l +266.327 113.987 l +266.652 114.229 l +266.944 114.512 l +267.197 114.829 l +267.407 115.176 l +267.497 115.380 l +265.860 115.380 l +265.860 113.742 l +h +220.026 113.788 m +220.140 113.742 l +220.140 115.380 l +218.503 115.380 l +218.593 115.176 l +218.803 114.829 l +219.056 114.512 l +219.348 114.229 l +219.673 113.987 l +220.026 113.788 l +h +205.740 113.742 m +205.740 115.380 l +204.103 115.380 l +204.193 115.176 l +204.403 114.829 l +204.656 114.512 l +204.948 114.229 l +205.273 113.987 l +205.626 113.788 l +205.740 113.742 l +h +81.265 96.953 m +81.469 96.862 l +81.469 98.500 l +79.831 98.500 l +79.877 98.386 l +80.076 98.033 l +80.318 97.707 l +80.601 97.416 l +80.918 97.163 l +81.265 96.953 l +h +81.469 101.020 m +81.469 102.657 l +81.265 102.567 l +80.918 102.356 l +80.601 102.103 l +80.318 101.812 l +80.076 101.487 l +79.877 101.133 l +79.831 101.020 l +81.469 101.020 l +h +87.224 185.710 m +87.207 185.758 l +87.037 186.086 l +86.824 186.388 l +86.572 186.658 l +86.286 186.891 l +85.970 187.083 l +85.755 187.177 l +85.755 185.710 l +87.224 185.710 l +h +232.635 197.257 m +232.635 195.790 l +234.104 195.790 l +234.087 195.838 l +233.917 196.166 l +233.704 196.468 l +233.452 196.738 l +233.166 196.971 l +232.850 197.163 l +232.635 197.257 l +h +230.574 192.263 m +230.574 193.730 l +229.105 193.730 l +229.122 193.682 l +229.292 193.354 l +229.505 193.052 l +229.757 192.782 l +230.044 192.549 l +230.359 192.357 l +230.574 192.263 l +h +232.635 192.263 m +232.850 192.357 l +233.166 192.549 l +233.452 192.782 l +233.704 193.052 l +233.917 193.354 l +234.087 193.682 l +234.104 193.730 l +232.635 193.730 l +232.635 192.263 l +h +83.694 185.710 m +83.694 187.177 l +83.479 187.083 l +83.164 186.891 l +82.877 186.658 l +82.625 186.388 l +82.412 186.086 l +82.242 185.758 l +82.225 185.710 l +83.694 185.710 l +h +230.574 195.790 m +230.574 197.257 l +230.359 197.163 l +230.044 196.971 l +229.757 196.738 l +229.505 196.468 l +229.292 196.166 l +229.122 195.838 l +229.105 195.790 l +230.574 195.790 l +h +299.628 177.523 m +299.628 178.989 l +299.413 178.895 l +299.098 178.704 l +298.811 178.471 l +298.559 178.201 l +298.346 177.899 l +298.176 177.571 l +298.159 177.523 l +299.628 177.523 l +h +299.628 173.998 m +299.628 175.464 l +298.159 175.464 l +298.176 175.416 l +298.346 175.088 l +298.559 174.786 l +298.811 174.517 l +299.098 174.284 l +299.413 174.092 l +299.628 173.998 l +h +50.177 173.998 m +50.177 175.464 l +48.708 175.464 l +48.725 175.416 l +48.895 175.088 l +49.108 174.786 l +49.360 174.517 l +49.646 174.284 l +49.962 174.092 l +50.177 173.998 l +h +52.236 175.464 m +52.236 173.998 l +52.451 174.092 l +52.766 174.284 l +53.053 174.517 l +53.305 174.786 l +53.518 175.088 l +53.688 175.416 l +53.705 175.464 l +52.236 175.464 l +h +56.831 131.914 m +56.831 133.168 l +55.580 133.168 l +55.626 133.040 l +55.783 132.752 l +55.981 132.491 l +56.217 132.264 l +56.485 132.076 l +56.779 131.930 l +56.831 131.914 l +h +58.325 133.168 m +58.325 131.914 l +58.378 131.930 l +58.672 132.076 l +58.940 132.264 l +59.176 132.491 l +59.374 132.752 l +59.531 133.040 l +59.577 133.168 l +58.325 133.168 l +h +f +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +168.732 82.733 m +168.732 126.806 l +176.134 134.208 l +176.134 178.049 l +177.365 179.287 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +156.809 176.645 m +160.394 173.066 l +160.510 74.470 l +119.160 34.200 l +119.088 27.756 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +36.806 176.494 m +32.976 172.663 l +32.976 125.906 l +41.040 117.842 l +41.040 33.804 l +47.088 27.756 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +293.458 176.494 m +289.584 180.367 l +271.375 180.367 l +264.600 173.592 l +264.600 167.040 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +235.800 167.040 m +235.800 167.681 l +225.662 177.818 l +214.942 177.818 l +213.444 176.321 l +206.734 176.321 l +197.784 185.270 l +110.772 185.270 l +105.926 180.432 l +47.945 180.432 l +44.006 176.494 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +97.488 27.756 m +79.042 46.210 l +79.042 95.465 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +211.198 194.760 m +204.977 188.539 l +180.504 188.539 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +168.732 81.778 m +168.732 82.733 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +156.809 176.645 m +112.824 176.645 l +87.811 151.632 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +180.713 173.650 m +180.713 149.011 l +179.791 148.090 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +171.734 82.733 m +171.734 123.473 l +179.791 131.530 l +179.791 148.090 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +171.734 81.850 m +171.734 82.733 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +224.734 174.506 m +222.070 171.842 l +196.538 171.842 l +186.948 162.259 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +250.200 167.040 m +236.110 181.130 l +212.537 181.130 l +210.715 179.309 l +207.972 179.309 l +206.201 181.073 l +206.201 184.349 l +215.208 193.349 l +215.208 196.214 l +212.825 198.598 l +152.892 198.598 l +143.438 189.144 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +305.280 192.240 m +305.280 158.119 l +304.200 157.039 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +301.680 192.240 m +301.680 188.906 l +300.290 187.517 l +280.246 187.517 l +272.160 195.602 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +271.800 167.040 m +272.160 167.400 l +272.160 175.198 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +57.578 158.717 m +60.264 158.717 l +64.188 154.793 l +64.188 114.098 l +66.694 111.586 l +78.098 111.586 l +89.928 99.756 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +288.331 136.800 m +291.240 136.800 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +271.800 116.640 m +288.331 133.171 l +288.331 136.800 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +288.331 136.800 m +286.258 138.874 l +286.258 169.294 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +207.000 159.840 m +228.600 138.240 l +228.600 121.298 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +228.600 121.298 m +228.600 116.640 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +228.600 121.298 m +267.142 121.298 l +271.800 116.640 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +118.728 99.756 m +118.728 102.010 l +132.919 116.201 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +132.919 116.201 m +132.919 162.338 l +142.834 172.253 l +S +1 J +1 j +2.83 w +0.00 0.00 1.00 RG /a0 gs +293.119 92.455 m +294.883 90.691 l +S +1 J +1 j +2.83 w +0.00 0.00 1.00 RG /a0 gs +183.240 116.280 m +189.655 116.280 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +200.830 176.285 m +194.832 182.290 l +113.501 182.290 l +108.518 177.300 l +88.416 177.300 l +76.766 165.650 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +57.578 155.174 m +56.462 155.174 l +54.288 157.356 l +54.288 162.763 l +55.094 163.570 l +55.094 172.606 l +51.206 176.494 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +97.128 95.429 m +87.062 95.429 l +82.728 99.756 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +207.000 116.640 m +202.709 120.931 l +202.709 162.749 l +207.000 167.040 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +231.602 194.760 m +221.666 194.760 l +209.210 182.304 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +57.578 133.913 m +59.148 133.913 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +59.148 133.913 m +60.926 135.691 l +60.926 153.274 l +59.026 155.174 l +57.578 155.174 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +300.658 176.494 m +300.658 179.129 l +295.560 184.226 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +300.557 90.691 m +300.557 82.181 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +82.728 99.756 m +75.506 106.978 l +67.082 106.978 l +59.148 114.919 l +59.148 133.913 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +82.728 99.756 m +75.506 106.978 l +67.082 106.978 l +59.148 114.919 l +59.148 133.913 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +104.329 99.760 m +104.329 104.329 l +106.560 106.560 l +115.920 106.560 l +118.800 109.440 l +118.800 116.119 l +118.881 116.201 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +97.128 95.429 m +97.128 99.756 l +S +1 J +1 j +2.83 w +0.00 0.00 1.00 RG /a0 gs +189.655 116.280 m +206.935 99.000 l +285.120 99.360 l +293.119 92.455 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +143.568 144.547 m +143.568 73.008 l +104.760 34.200 l +104.688 27.756 l +S +1 J +1 j +1.70 w +0.00 0.00 1.00 RG /a0 gs +157.392 169.798 m +157.392 158.371 l +143.568 144.547 l +S +1 J +1 j +72 M +0.00 0.00 1.00 rg /a0 gs +[] 0 d +299.138 84.311 m +301.972 84.311 l +301.972 97.067 l +299.138 97.067 l + h +f +1 J +1 j +72 M +0.00 0.00 1.00 rg /a0 gs +[] 0 d +293.468 84.311 m +296.302 84.311 l +296.302 97.067 l +293.468 97.067 l + h +f +1 J +1 j +72 M +0.00 0.00 1.00 rg /a0 gs +[] 0 d +305.090 69.571 m +309.625 69.571 l +309.625 79.208 l +305.090 79.208 l + h +f +1 J +1 j +72 M +0.00 0.00 1.00 rg /a0 gs +[] 0 d +285.815 69.571 m +290.350 69.571 l +290.350 79.208 l +285.815 79.208 l + h +f +1.00 0.00 0.00 rg /a0 gs +[] 0 d +56.626 97.322 m +56.520 97.342 l +56.428 97.401 l +56.365 97.489 l +56.339 97.594 l +56.354 97.702 l +56.407 97.796 l +56.466 97.866 l +56.688 98.206 l +56.864 98.572 l +56.992 98.957 l +57.069 99.355 l +57.095 99.760 l +57.069 100.165 l +56.992 100.563 l +56.864 100.948 l +56.688 101.313 l +56.466 101.653 l +56.203 101.962 l +55.903 102.235 l +55.570 102.467 l +55.211 102.655 l +54.830 102.795 l +54.434 102.885 l +54.031 102.924 l +53.625 102.911 l +53.225 102.846 l +52.836 102.731 l +52.465 102.567 l +52.118 102.356 l +51.801 102.103 l +51.518 101.812 l +51.276 101.487 l +51.077 101.133 l +50.924 100.757 l +50.822 100.365 l +50.770 99.963 l +50.770 99.557 l +50.822 99.154 l +50.924 98.762 l +51.077 98.386 l +51.276 98.033 l +51.463 97.782 l +51.514 97.667 l +51.511 97.540 l +51.455 97.427 l +51.355 97.349 l +51.232 97.322 l +49.066 97.322 l +48.960 97.342 l +48.868 97.401 l +48.805 97.489 l +48.779 97.594 l +48.794 97.702 l +48.847 97.796 l +48.906 97.866 l +49.128 98.206 l +49.304 98.572 l +49.432 98.957 l +49.509 99.355 l +49.535 99.760 l +49.509 100.165 l +49.432 100.563 l +49.304 100.948 l +49.128 101.313 l +48.906 101.653 l +48.643 101.962 l +48.343 102.235 l +48.010 102.467 l +47.651 102.655 l +47.270 102.795 l +46.874 102.885 l +46.471 102.924 l +46.065 102.911 l +45.665 102.846 l +45.276 102.731 l +44.905 102.567 l +44.558 102.356 l +44.241 102.103 l +43.958 101.812 l +43.716 101.487 l +43.517 101.133 l +43.452 100.973 l +43.390 100.879 l +43.297 100.816 l +43.186 100.793 l +43.076 100.815 l +42.982 100.877 l +42.919 100.971 l +42.897 101.081 l +42.897 103.872 l +42.919 103.982 l +42.981 104.075 l +53.865 114.959 l +54.062 115.189 l +54.214 115.437 l +54.325 115.706 l +54.393 115.990 l +54.417 116.291 l +54.417 136.732 l +54.439 136.843 l +54.501 136.936 l +54.962 137.396 l +55.066 137.463 l +55.189 137.480 l +55.308 137.443 l +55.400 137.360 l +55.449 137.246 l +55.516 136.890 l +55.626 136.582 l +55.783 136.294 l +55.981 136.034 l +56.124 135.897 l +56.191 135.797 l +56.212 135.678 l +56.182 135.561 l +56.095 135.456 l +55.877 135.212 l +55.699 134.937 l +55.575 134.662 l +56.831 134.662 l +56.831 135.078 l +56.858 135.198 l +56.932 135.297 l +57.041 135.355 l +57.163 135.363 l +57.415 135.324 l +57.742 135.324 l +57.993 135.363 l +58.116 135.355 l +58.225 135.297 l +58.299 135.198 l +58.325 135.078 l +58.325 134.662 l +59.174 134.662 l +59.285 134.640 l +59.378 134.577 l +61.987 131.968 l +62.050 131.875 l +62.072 131.764 l +62.072 104.174 l +62.095 103.874 l +62.163 103.590 l +62.274 103.321 l +62.331 103.228 l +62.370 103.123 l +62.366 103.011 l +62.320 102.909 l +62.238 102.833 l +62.133 102.793 l +62.022 102.797 l +61.634 102.885 l +61.231 102.924 l +60.825 102.911 l +60.425 102.846 l +60.036 102.731 l +59.665 102.567 l +59.318 102.356 l +59.001 102.103 l +58.718 101.812 l +58.476 101.487 l +58.277 101.133 l +58.124 100.757 l +58.022 100.365 l +57.970 99.963 l +57.970 99.557 l +58.022 99.154 l +58.124 98.762 l +58.277 98.386 l +58.476 98.033 l +58.663 97.782 l +58.714 97.667 l +58.711 97.540 l +58.655 97.427 l +58.555 97.349 l +58.432 97.322 l +56.626 97.322 l +h +56.779 131.930 m +56.831 131.914 l +56.831 133.168 l +55.580 133.168 l +55.626 133.040 l +55.783 132.752 l +55.981 132.491 l +56.217 132.264 l +56.485 132.076 l +56.779 131.930 l +h +58.325 133.168 m +58.325 131.914 l +58.378 131.930 l +58.672 132.076 l +58.940 132.264 l +59.176 132.491 l +59.374 132.752 l +59.531 133.040 l +59.577 133.168 l +58.325 133.168 l +h +f +1.00 0.00 0.00 rg /a0 gs +[] 0 d +28.022 20.557 m +27.912 20.579 l +27.819 20.641 l +27.756 20.735 l +27.734 20.845 l +27.734 61.117 l +27.755 61.225 l +27.816 61.317 l +27.906 61.380 l +28.013 61.405 l +28.122 61.387 l +28.216 61.330 l +28.266 61.285 l +28.599 61.053 l +28.958 60.865 l +28.980 60.857 l +28.980 62.500 l +28.022 62.500 l +27.912 62.522 l +27.819 62.584 l +27.756 62.678 l +27.734 62.788 l +27.734 64.732 l +27.756 64.842 l +27.819 64.936 l +27.912 64.998 l +28.022 65.020 l +28.980 65.020 l +28.980 66.663 l +28.958 66.655 l +28.599 66.467 l +28.266 66.235 l +28.216 66.190 l +28.122 66.133 l +28.013 66.115 l +27.906 66.140 l +27.816 66.203 l +27.755 66.295 l +27.734 66.403 l +27.734 200.218 l +27.756 200.328 l +27.819 200.421 l +27.912 200.484 l +28.022 200.506 l +309.442 200.506 l +309.552 200.484 l +309.646 200.421 l +309.708 200.328 l +309.730 200.218 l +309.730 20.845 l +309.708 20.735 l +309.646 20.641 l +309.552 20.579 l +309.442 20.557 l +28.022 20.557 l +h +59.581 155.923 m +59.458 156.199 l +59.318 156.415 l +59.274 156.530 l +59.283 156.652 l +59.342 156.760 l +59.440 156.834 l +59.559 156.860 l +78.505 156.860 l +78.806 156.884 l +79.090 156.952 l +79.359 157.063 l +79.607 157.215 l +79.837 157.412 l +89.383 166.958 l +89.459 167.012 l +89.548 167.040 l +90.079 167.006 l +90.490 167.032 l +90.893 167.109 l +91.284 167.236 l +91.656 167.411 l +92.003 167.632 l +92.320 167.894 l +92.602 168.193 l +92.843 168.526 l +93.041 168.886 l +93.193 169.268 l +93.295 169.667 l +93.346 170.074 l +93.346 170.486 l +93.295 170.893 l +93.193 171.292 l +93.041 171.674 l +92.843 172.034 l +92.602 172.367 l +92.467 172.510 l +92.408 172.604 l +92.389 172.713 l +92.413 172.821 l +92.476 172.913 l +92.568 172.974 l +92.677 172.995 l +97.403 172.995 l +97.512 172.974 l +97.604 172.913 l +97.667 172.821 l +97.691 172.713 l +97.672 172.604 l +97.613 172.510 l +97.478 172.367 l +97.237 172.034 l +97.039 171.674 l +97.007 171.594 l +98.687 171.594 l +98.687 172.707 l +98.709 172.817 l +98.771 172.911 l +98.865 172.973 l +98.975 172.995 l +101.027 172.995 l +101.137 172.973 l +101.230 172.911 l +101.293 172.817 l +101.315 172.707 l +101.315 171.594 l +102.995 171.594 l +102.963 171.674 l +102.765 172.034 l +102.523 172.367 l +102.389 172.510 l +102.330 172.604 l +102.311 172.713 l +102.334 172.821 l +102.397 172.913 l +102.490 172.974 l +102.599 172.995 l +140.727 172.995 l +140.848 172.968 l +140.946 172.894 l +141.004 172.784 l +141.011 172.661 l +140.969 172.403 l +140.969 172.102 l +141.018 171.805 l +141.113 171.520 l +141.253 171.253 l +141.434 171.013 l +141.651 170.804 l +141.899 170.633 l +142.170 170.504 l +142.460 170.420 l +142.758 170.384 l +143.055 170.396 l +143.161 170.396 l +143.285 170.368 l +143.385 170.289 l +143.441 170.175 l +143.495 169.951 l +143.606 169.682 l +143.758 169.434 l +143.955 169.204 l +144.688 168.471 l +144.918 168.274 l +145.166 168.122 l +145.435 168.011 l +145.718 167.943 l +146.020 167.919 l +146.169 167.919 l +146.274 167.899 l +146.365 167.843 l +146.428 167.757 l +146.456 167.654 l +146.445 167.547 l +146.406 167.419 l +146.385 167.209 l +146.385 166.695 l +148.948 166.695 l +148.948 167.065 l +148.970 167.176 l +149.032 167.269 l +149.126 167.332 l +149.236 167.353 l +152.492 167.353 l +152.602 167.332 l +152.696 167.269 l +152.758 167.176 l +152.780 167.065 l +152.780 166.695 l +155.343 166.695 l +155.343 167.209 l +155.322 167.419 l +155.265 167.608 l +155.212 167.739 l +155.212 167.833 l +155.271 167.975 l +155.328 168.164 l +155.349 168.374 l +155.349 168.551 l +155.373 168.667 l +155.443 168.764 l +155.546 168.824 l +155.664 168.838 l +155.777 168.802 l +155.867 168.724 l +155.992 168.557 l +156.209 168.349 l +156.457 168.178 l +156.729 168.049 l +157.018 167.965 l +157.317 167.929 l +157.614 167.941 l +181.904 167.941 l +182.009 167.921 l +182.100 167.864 l +182.163 167.778 l +182.191 167.675 l +182.180 167.569 l +182.145 167.455 l +182.124 167.244 l +182.124 164.438 l +182.145 164.228 l +182.202 164.039 l +182.295 163.865 l +182.420 163.713 l +182.573 163.588 l +182.746 163.495 l +182.935 163.438 l +183.145 163.417 l +184.457 163.417 l +184.568 163.395 l +184.661 163.333 l +184.724 163.239 l +184.745 163.129 l +184.747 162.591 l +184.735 162.480 l +184.681 162.383 l +184.594 162.313 l +184.487 162.281 l +184.377 162.292 l +184.244 162.333 l +184.034 162.353 l +183.519 162.353 l +183.519 159.791 l +185.054 159.791 l +185.054 160.817 l +185.076 160.927 l +185.137 161.020 l +185.229 161.082 l +185.338 161.105 l +185.448 161.085 l +185.542 161.025 l +185.765 160.811 l +186.013 160.640 l +186.285 160.511 l +186.574 160.427 l +186.873 160.391 l +187.173 160.403 l +187.468 160.463 l +187.750 160.570 l +188.010 160.720 l +188.244 160.910 l +188.443 161.136 l +188.604 161.390 l +188.722 161.667 l +188.794 161.959 l +188.818 162.259 l +188.794 162.559 l +188.722 162.851 l +188.652 163.016 l +188.629 163.127 l +188.650 163.238 l +188.712 163.332 l +188.806 163.395 l +188.917 163.417 l +190.062 163.417 l +190.272 163.438 l +190.461 163.495 l +190.634 163.588 l +190.787 163.713 l +190.912 163.865 l +191.005 164.039 l +191.062 164.228 l +191.082 164.438 l +191.082 167.244 l +191.062 167.455 l +191.005 167.643 l +190.948 167.780 l +190.948 167.874 l +190.994 167.993 l +191.052 168.181 l +191.072 168.391 l +191.072 171.198 l +191.052 171.408 l +190.994 171.597 l +190.938 171.735 l +190.938 171.829 l +190.992 171.961 l +191.049 172.150 l +191.069 172.360 l +191.069 175.166 l +191.049 175.377 l +190.992 175.565 l +190.942 175.691 l +190.942 175.785 l +190.993 175.913 l +191.050 176.101 l +191.071 176.311 l +191.071 179.118 l +191.050 179.328 l +190.993 179.517 l +190.937 179.653 l +190.937 179.747 l +190.990 179.878 l +191.047 180.066 l +191.068 180.277 l +191.068 180.791 l +188.505 180.791 l +188.505 180.427 l +188.483 180.316 l +188.421 180.223 l +188.327 180.160 l +188.217 180.139 l +184.961 180.139 l +184.851 180.160 l +184.757 180.223 l +184.695 180.316 l +184.673 180.427 l +184.673 180.791 l +182.110 180.791 l +182.110 180.277 l +182.131 180.066 l +182.167 179.946 l +182.179 179.840 l +182.151 179.737 l +182.087 179.651 l +181.997 179.594 l +181.892 179.575 l +180.047 179.575 l +179.746 179.551 l +179.577 179.510 l +179.474 179.505 l +179.375 179.536 l +179.294 179.600 l +179.240 179.689 l +179.222 179.790 l +179.222 181.623 l +179.244 181.733 l +179.306 181.827 l +181.188 183.704 l +181.281 183.766 l +181.391 183.788 l +181.892 183.788 l +181.997 183.768 l +182.088 183.711 l +182.152 183.626 l +182.180 183.522 l +182.168 183.416 l +182.131 183.293 l +182.110 183.083 l +182.110 182.568 l +184.673 182.568 l +184.673 182.936 l +184.695 183.047 l +184.757 183.140 l +184.851 183.203 l +184.961 183.224 l +188.217 183.224 l +188.327 183.203 l +188.421 183.140 l +188.483 183.047 l +188.505 182.936 l +188.505 182.568 l +191.068 182.568 l +191.068 183.083 l +191.047 183.293 l +190.990 183.482 l +190.934 183.620 l +190.934 183.714 l +190.987 183.846 l +191.044 184.035 l +191.065 184.245 l +191.065 187.051 l +191.044 187.262 l +190.987 187.450 l +190.936 187.579 l +190.936 187.672 l +190.993 187.811 l +191.050 188.000 l +191.071 188.210 l +191.071 188.725 l +188.508 188.725 l +188.508 188.360 l +188.486 188.250 l +188.424 188.157 l +188.330 188.094 l +188.220 188.072 l +184.964 188.072 l +184.853 188.094 l +184.760 188.157 l +184.698 188.250 l +184.676 188.360 l +184.676 188.725 l +182.604 188.725 l +182.480 188.753 l +182.381 188.831 l +182.324 188.944 l +182.278 189.131 l +182.160 189.408 l +181.999 189.663 l +181.800 189.888 l +181.566 190.078 l +181.306 190.229 l +181.024 190.336 l +180.729 190.396 l +180.429 190.408 l +180.130 190.372 l +179.841 190.288 l +179.569 190.159 l +179.321 189.988 l +179.104 189.779 l +178.923 189.539 l +178.783 189.272 l +178.688 188.987 l +178.640 188.690 l +178.640 188.389 l +178.647 188.321 l +178.647 186.535 l +178.625 186.424 l +178.562 186.331 l +176.061 183.835 l +175.864 183.605 l +175.712 183.357 l +175.600 183.088 l +175.532 182.805 l +175.508 182.504 l +175.508 179.505 l +175.501 179.438 l +175.501 179.137 l +175.549 178.840 l +175.653 178.529 l +175.668 178.421 l +175.642 178.316 l +175.579 178.228 l +175.487 178.169 l +175.381 178.149 l +158.009 178.149 l +157.934 178.159 l +157.865 178.188 l +157.611 178.334 l +157.329 178.441 l +157.034 178.501 l +156.733 178.513 l +156.435 178.477 l +156.146 178.393 l +155.874 178.264 l +155.805 178.217 l +155.690 178.170 l +155.566 178.176 l +155.456 178.234 l +155.381 178.333 l +155.354 178.454 l +155.354 179.111 l +155.333 179.321 l +155.276 179.509 l +155.244 179.570 l +155.214 179.659 l +155.214 179.752 l +155.265 179.881 l +155.322 180.070 l +155.343 180.280 l +155.343 183.086 l +155.322 183.297 l +155.265 183.485 l +155.209 183.623 l +155.209 183.717 l +155.262 183.850 l +155.319 184.039 l +155.340 184.249 l +155.340 187.055 l +155.319 187.265 l +155.262 187.454 l +155.209 187.586 l +155.209 187.680 l +155.265 187.818 l +155.322 188.006 l +155.343 188.217 l +155.343 191.023 l +155.322 191.233 l +155.265 191.422 l +155.214 191.550 l +155.214 191.644 l +155.271 191.783 l +155.328 191.971 l +155.349 192.182 l +155.349 194.991 l +155.371 195.101 l +155.433 195.195 l +155.527 195.257 l +155.637 195.279 l +181.825 195.279 l +181.935 195.257 l +182.029 195.195 l +182.091 195.101 l +182.113 194.991 l +182.113 194.474 l +184.676 194.474 l +184.676 194.991 l +184.698 195.101 l +184.760 195.195 l +184.853 195.257 l +184.964 195.279 l +188.220 195.279 l +188.330 195.257 l +188.424 195.195 l +188.486 195.101 l +188.508 194.991 l +188.508 194.474 l +191.071 194.474 l +191.071 194.991 l +191.093 195.101 l +191.155 195.195 l +191.249 195.257 l +191.359 195.279 l +197.731 195.279 l +197.841 195.257 l +197.934 195.195 l +210.276 182.853 l +210.334 182.770 l +210.359 182.672 l +210.372 182.503 l +210.440 182.220 l +210.552 181.951 l +210.704 181.703 l +210.901 181.473 l +221.680 170.693 l +221.743 170.597 l +221.764 170.484 l +221.739 170.371 l +221.671 170.278 l +221.572 170.218 l +221.458 170.202 l +221.400 170.206 l +221.023 170.182 l +220.903 170.200 l +220.801 170.266 l +213.476 177.590 l +213.246 177.786 l +212.998 177.939 l +212.729 178.050 l +212.446 178.118 l +212.144 178.142 l +201.051 178.142 l +200.754 178.153 l +200.456 178.117 l +200.166 178.033 l +199.895 177.904 l +199.647 177.733 l +199.430 177.525 l +199.249 177.284 l +199.109 177.018 l +199.014 176.732 l +198.965 176.435 l +198.965 176.134 l +199.014 175.837 l +199.109 175.552 l +199.249 175.285 l +199.430 175.045 l +199.647 174.836 l +199.895 174.665 l +200.166 174.536 l +200.456 174.452 l +200.754 174.416 l +201.051 174.428 l +211.267 174.428 l +211.377 174.406 l +211.470 174.343 l +215.216 170.598 l +215.282 170.496 l +215.300 170.376 l +215.267 170.259 l +215.189 170.166 l +215.079 170.114 l +214.958 170.111 l +214.605 170.180 l +214.200 170.206 l +213.795 170.180 l +213.397 170.102 l +213.012 169.975 l +212.646 169.799 l +212.306 169.577 l +211.997 169.314 l +211.725 169.014 l +211.493 168.681 l +211.305 168.322 l +211.165 167.941 l +211.075 167.545 l +211.036 167.141 l +211.049 166.736 l +211.113 166.336 l +211.229 165.947 l +211.393 165.576 l +211.603 165.229 l +211.856 164.912 l +212.148 164.629 l +212.473 164.387 l +212.826 164.188 l +213.202 164.035 l +213.595 163.932 l +213.997 163.881 l +214.403 163.881 l +214.805 163.932 l +215.198 164.035 l +215.574 164.188 l +215.927 164.387 l +216.252 164.629 l +216.544 164.912 l +216.797 165.229 l +217.007 165.576 l +217.171 165.947 l +217.287 166.336 l +217.351 166.736 l +217.364 167.141 l +217.325 167.545 l +217.269 167.793 l +217.268 167.916 l +217.318 168.028 l +217.410 168.109 l +217.528 168.144 l +217.650 168.127 l +217.753 168.061 l +218.178 167.636 l +218.245 167.530 l +218.261 167.405 l +218.236 167.141 l +218.249 166.736 l +218.313 166.336 l +218.429 165.947 l +218.593 165.576 l +218.803 165.229 l +219.056 164.912 l +219.348 164.629 l +219.673 164.387 l +220.026 164.188 l +220.402 164.035 l +220.795 163.932 l +221.197 163.881 l +221.603 163.881 l +222.005 163.932 l +222.398 164.035 l +222.774 164.188 l +223.127 164.387 l +223.452 164.629 l +223.744 164.912 l +223.997 165.229 l +224.207 165.576 l +224.371 165.947 l +224.487 166.336 l +224.551 166.736 l +224.564 167.123 l +224.589 167.231 l +224.652 167.322 l +224.746 167.382 l +224.855 167.402 l +224.963 167.380 l +225.055 167.318 l +225.362 167.011 l +225.422 166.922 l +225.446 166.817 l +225.449 166.736 l +225.513 166.336 l +225.629 165.947 l +225.793 165.576 l +226.003 165.229 l +226.256 164.912 l +226.548 164.629 l +226.873 164.387 l +227.226 164.188 l +227.602 164.035 l +227.995 163.932 l +228.397 163.881 l +228.803 163.881 l +229.205 163.932 l +229.598 164.035 l +229.974 164.188 l +230.327 164.387 l +230.652 164.629 l +230.944 164.912 l +231.197 165.229 l +231.407 165.576 l +231.571 165.947 l +231.687 166.336 l +231.751 166.736 l +231.764 167.141 l +231.725 167.545 l +231.635 167.941 l +231.495 168.322 l +231.307 168.681 l +231.075 169.014 l +230.803 169.314 l +230.494 169.577 l +230.154 169.799 l +229.788 169.975 l +229.403 170.102 l +229.005 170.180 l +228.600 170.206 l +228.195 170.180 l +227.797 170.102 l +227.655 170.076 l +227.553 170.100 l +227.466 170.160 l +225.468 172.158 l +225.405 172.251 l +225.383 172.361 l +225.405 172.472 l +225.468 172.565 l +225.561 172.628 l +225.671 172.649 l +249.045 172.649 l +249.155 172.628 l +249.249 172.565 l +251.216 170.598 l +251.282 170.496 l +251.300 170.376 l +251.267 170.259 l +251.189 170.166 l +251.079 170.114 l +250.958 170.111 l +250.605 170.180 l +250.200 170.206 l +249.795 170.180 l +249.397 170.102 l +249.012 169.975 l +248.646 169.799 l +248.306 169.577 l +247.997 169.314 l +247.725 169.014 l +247.493 168.681 l +247.305 168.322 l +247.165 167.941 l +247.075 167.545 l +247.036 167.141 l +247.049 166.736 l +247.113 166.336 l +247.229 165.947 l +247.393 165.576 l +247.603 165.229 l +247.856 164.912 l +248.148 164.629 l +248.473 164.387 l +248.826 164.188 l +249.202 164.035 l +249.595 163.932 l +249.997 163.881 l +250.403 163.881 l +250.805 163.932 l +251.198 164.035 l +251.574 164.188 l +251.927 164.387 l +252.252 164.629 l +252.544 164.912 l +252.797 165.229 l +253.007 165.576 l +253.171 165.947 l +253.287 166.336 l +253.351 166.736 l +253.364 167.141 l +253.325 167.545 l +253.269 167.793 l +253.268 167.916 l +253.318 168.028 l +253.410 168.109 l +253.528 168.144 l +253.650 168.127 l +253.753 168.061 l +254.178 167.636 l +254.245 167.530 l +254.261 167.405 l +254.236 167.141 l +254.249 166.736 l +254.313 166.336 l +254.429 165.947 l +254.593 165.576 l +254.803 165.229 l +255.056 164.912 l +255.348 164.629 l +255.673 164.387 l +256.026 164.188 l +256.402 164.035 l +256.795 163.932 l +257.197 163.881 l +257.603 163.881 l +258.005 163.932 l +258.398 164.035 l +258.774 164.188 l +259.127 164.387 l +259.452 164.629 l +259.744 164.912 l +259.997 165.229 l +260.207 165.576 l +260.371 165.947 l +260.487 166.336 l +260.551 166.736 l +260.564 167.141 l +260.525 167.545 l +260.435 167.941 l +260.295 168.322 l +260.107 168.681 l +259.875 169.014 l +259.603 169.314 l +259.294 169.577 l +258.954 169.799 l +258.588 169.975 l +258.203 170.102 l +257.805 170.180 l +257.400 170.206 l +257.023 170.182 l +256.903 170.200 l +256.801 170.266 l +251.255 175.811 l +251.025 176.008 l +250.776 176.160 l +250.507 176.272 l +250.224 176.340 l +249.922 176.363 l +224.955 176.363 l +224.658 176.375 l +224.360 176.339 l +224.070 176.255 l +223.799 176.126 l +223.551 175.955 l +223.334 175.747 l +223.153 175.506 l +223.013 175.239 l +222.945 175.110 l +222.852 175.041 l +222.739 175.014 l +222.624 175.035 l +222.527 175.099 l +214.136 183.490 l +214.078 183.573 l +214.052 183.671 l +214.039 183.840 l +213.971 184.123 l +213.859 184.392 l +213.707 184.641 l +213.511 184.871 l +199.940 198.441 l +199.710 198.638 l +199.462 198.790 l +199.193 198.901 l +198.910 198.969 l +198.608 198.993 l +102.777 198.993 l +102.475 198.969 l +102.192 198.901 l +101.923 198.790 l +101.675 198.638 l +101.445 198.441 l +86.737 183.734 l +86.644 183.672 l +86.534 183.650 l +85.755 183.650 l +85.755 182.871 l +85.733 182.761 l +85.671 182.667 l +74.238 171.235 l +74.145 171.172 l +74.035 171.151 l +53.290 171.151 l +53.175 171.174 l +52.766 171.504 l +52.451 171.695 l +52.112 171.843 l +51.757 171.942 l +51.391 171.992 l +51.022 171.992 l +50.656 171.942 l +50.301 171.843 l +49.962 171.695 l +49.646 171.504 l +49.360 171.271 l +49.108 171.001 l +48.895 170.699 l +48.725 170.371 l +48.602 170.023 l +48.527 169.662 l +48.501 169.294 l +48.527 168.925 l +48.602 168.564 l +48.725 168.216 l +48.895 167.888 l +49.011 167.723 l +49.059 167.612 l +49.056 167.491 l +49.004 167.381 l +48.911 167.303 l +48.794 167.270 l +48.674 167.288 l +48.572 167.354 l +46.794 169.133 l +46.735 169.217 l +46.710 169.317 l +46.686 169.662 l +46.611 170.023 l +46.488 170.371 l +46.318 170.699 l +46.105 171.001 l +45.853 171.271 l +45.566 171.504 l +45.251 171.695 l +44.912 171.843 l +44.557 171.942 l +44.191 171.992 l +43.822 171.992 l +43.456 171.942 l +43.101 171.843 l +42.762 171.695 l +42.446 171.504 l +42.160 171.271 l +41.908 171.001 l +41.695 170.699 l +41.525 170.371 l +41.402 170.023 l +41.327 169.662 l +41.301 169.294 l +41.327 168.925 l +41.402 168.564 l +41.525 168.216 l +41.695 167.888 l +41.811 167.723 l +41.859 167.612 l +41.856 167.491 l +41.804 167.381 l +41.711 167.303 l +41.594 167.270 l +41.474 167.288 l +41.372 167.354 l +39.597 169.130 l +39.534 169.223 l +39.512 169.333 l +39.512 170.979 l +39.491 171.189 l +39.434 171.377 l +39.341 171.551 l +39.216 171.704 l +39.064 171.829 l +38.890 171.921 l +38.702 171.979 l +38.491 171.999 l +35.121 171.999 l +34.911 171.979 l +34.723 171.921 l +34.549 171.829 l +34.396 171.704 l +34.271 171.551 l +34.179 171.377 l +34.121 171.189 l +34.101 170.979 l +34.101 167.609 l +34.121 167.398 l +34.179 167.210 l +34.271 167.036 l +34.396 166.884 l +34.549 166.759 l +34.723 166.666 l +34.911 166.609 l +35.121 166.588 l +36.767 166.588 l +36.877 166.566 l +36.970 166.503 l +42.390 161.084 l +42.620 160.887 l +42.869 160.735 l +43.138 160.624 l +43.421 160.556 l +43.723 160.532 l +55.694 160.532 l +55.802 160.511 l +55.894 160.451 l +55.957 160.362 l +55.982 160.255 l +55.965 160.146 l +55.877 160.016 l +55.699 159.741 l +55.565 159.442 l +55.478 159.126 l +55.440 158.801 l +55.453 158.474 l +55.515 158.152 l +55.626 157.844 l +55.783 157.556 l +55.981 157.295 l +56.124 157.158 l +56.191 157.058 l +56.212 156.940 l +56.182 156.823 l +56.095 156.718 l +55.877 156.474 l +55.699 156.199 l +55.575 155.923 l +56.831 155.923 l +56.831 156.340 l +56.858 156.460 l +56.932 156.558 l +57.041 156.617 l +57.163 156.624 l +57.415 156.586 l +57.742 156.586 l +57.993 156.624 l +58.116 156.617 l +58.225 156.558 l +58.299 156.460 l +58.325 156.340 l +58.325 155.923 l +59.581 155.923 l +h +78.966 93.596 m +79.267 93.608 l +79.562 93.668 l +79.843 93.775 l +80.104 93.926 l +80.337 94.116 l +80.537 94.341 l +80.698 94.596 l +80.816 94.873 l +80.888 95.165 l +80.912 95.465 l +80.888 95.765 l +80.816 96.057 l +80.698 96.334 l +80.537 96.588 l +80.337 96.814 l +80.104 97.004 l +79.843 97.154 l +79.562 97.261 l +79.267 97.321 l +78.966 97.333 l +78.852 97.322 l +78.226 97.322 l +78.120 97.342 l +78.028 97.401 l +77.965 97.489 l +77.939 97.594 l +77.954 97.702 l +78.007 97.796 l +78.066 97.866 l +78.288 98.206 l +78.464 98.572 l +78.592 98.957 l +78.669 99.355 l +78.695 99.760 l +78.669 100.165 l +78.592 100.563 l +78.464 100.948 l +78.288 101.313 l +78.066 101.653 l +77.803 101.962 l +77.503 102.235 l +77.170 102.467 l +76.811 102.655 l +76.430 102.795 l +76.034 102.885 l +75.631 102.924 l +75.225 102.911 l +74.825 102.846 l +74.436 102.731 l +74.065 102.567 l +73.718 102.356 l +73.401 102.103 l +73.118 101.812 l +72.876 101.487 l +72.677 101.133 l +72.524 100.757 l +72.422 100.365 l +72.370 99.963 l +72.370 99.557 l +72.422 99.154 l +72.524 98.762 l +72.677 98.386 l +72.876 98.033 l +73.063 97.782 l +73.114 97.667 l +73.111 97.540 l +73.055 97.427 l +72.955 97.349 l +72.832 97.322 l +71.026 97.322 l +70.920 97.342 l +70.828 97.401 l +70.765 97.489 l +70.739 97.594 l +70.754 97.702 l +70.807 97.796 l +70.866 97.866 l +71.088 98.206 l +71.264 98.572 l +71.392 98.957 l +71.469 99.355 l +71.495 99.760 l +71.469 100.165 l +71.392 100.563 l +71.264 100.948 l +71.088 101.313 l +70.866 101.653 l +70.603 101.962 l +70.303 102.235 l +69.970 102.467 l +69.611 102.655 l +69.230 102.795 l +68.834 102.885 l +68.431 102.924 l +68.025 102.911 l +67.888 102.903 l +67.802 102.931 l +67.729 102.984 l +65.870 104.846 l +65.808 104.940 l +65.786 105.050 l +65.786 113.723 l +65.806 113.830 l +65.865 113.921 l +65.953 113.985 l +66.059 114.011 l +66.166 113.996 l +66.261 113.942 l +66.587 113.663 l +66.927 113.442 l +67.293 113.266 l +67.678 113.138 l +68.076 113.061 l +68.481 113.035 l +68.886 113.061 l +69.284 113.138 l +69.669 113.266 l +70.034 113.442 l +70.374 113.663 l +70.683 113.926 l +70.956 114.227 l +71.188 114.559 l +71.376 114.919 l +71.516 115.300 l +71.606 115.695 l +71.645 116.099 l +71.632 116.505 l +71.567 116.905 l +71.452 117.294 l +71.288 117.665 l +71.077 118.012 l +70.824 118.329 l +70.533 118.611 l +70.208 118.854 l +69.854 119.053 l +69.478 119.205 l +69.086 119.308 l +68.684 119.360 l +68.278 119.360 l +67.876 119.308 l +67.483 119.205 l +67.107 119.053 l +66.754 118.854 l +66.429 118.611 l +66.274 118.462 l +66.180 118.401 l +66.071 118.381 l +65.961 118.404 l +65.869 118.466 l +65.807 118.559 l +65.786 118.669 l +65.786 132.641 l +65.762 132.943 l +65.694 133.226 l +65.583 133.495 l +65.430 133.744 l +65.234 133.974 l +60.447 138.760 l +60.217 138.957 l +59.969 139.109 l +59.700 139.220 l +59.453 139.280 l +59.350 139.328 l +59.273 139.412 l +59.235 139.519 l +59.241 139.632 l +59.291 139.734 l +59.374 139.844 l +59.531 140.132 l +59.641 140.440 l +59.704 140.762 l +59.716 141.089 l +59.679 141.414 l +59.592 141.730 l +59.458 142.029 l +59.318 142.246 l +59.274 142.360 l +59.283 142.483 l +59.342 142.591 l +59.440 142.664 l +59.559 142.690 l +66.397 142.690 l +66.507 142.668 l +66.601 142.606 l +66.663 142.512 l +66.685 142.402 l +66.685 120.481 l +66.713 120.453 l +126.184 120.453 l +126.212 120.481 l +126.212 142.402 l +126.234 142.512 l +126.297 142.606 l +126.390 142.668 l +126.500 142.690 l +143.379 142.690 l +143.493 142.679 l +143.793 142.691 l +144.088 142.751 l +144.370 142.858 l +144.630 143.008 l +144.864 143.198 l +145.063 143.424 l +145.224 143.678 l +145.342 143.955 l +145.414 144.247 l +145.438 144.547 l +145.414 144.847 l +145.342 145.139 l +145.224 145.416 l +145.063 145.671 l +144.990 145.754 l +144.934 145.848 l +144.917 145.956 l +144.943 146.063 l +145.006 146.152 l +145.098 146.212 l +145.205 146.233 l +179.602 146.233 l +179.716 146.221 l +180.017 146.233 l +180.312 146.293 l +180.593 146.400 l +180.854 146.550 l +181.087 146.741 l +181.286 146.966 l +181.447 147.220 l +181.565 147.497 l +181.637 147.790 l +181.661 148.090 l +181.637 148.390 l +181.565 148.682 l +181.447 148.959 l +181.286 149.213 l +181.087 149.438 l +180.854 149.629 l +180.593 149.779 l +180.312 149.886 l +180.017 149.946 l +179.716 149.958 l +179.602 149.947 l +89.448 149.947 l +89.341 149.967 l +89.249 150.027 l +89.186 150.116 l +89.161 150.223 l +89.177 150.331 l +89.233 150.426 l +89.306 150.508 l +89.467 150.763 l +89.585 151.040 l +89.657 151.332 l +89.681 151.632 l +89.657 151.932 l +89.585 152.224 l +89.467 152.501 l +89.306 152.756 l +89.107 152.981 l +88.874 153.171 l +88.613 153.322 l +88.332 153.428 l +88.037 153.489 l +87.736 153.501 l +87.622 153.489 l +59.556 153.489 l +59.432 153.517 l +59.333 153.595 l +59.276 153.709 l +59.274 153.836 l +59.327 153.952 l +59.374 154.013 l +59.531 154.301 l +59.577 154.430 l +58.325 154.430 l +58.325 154.013 l +58.307 153.912 l +58.254 153.823 l +58.173 153.759 l +58.075 153.728 l +57.972 153.733 l +57.905 153.749 l +57.578 153.774 l +57.252 153.749 l +57.185 153.733 l +57.082 153.728 l +56.984 153.759 l +56.903 153.823 l +56.850 153.912 l +56.831 154.013 l +56.831 154.430 l +55.580 154.430 l +55.626 154.301 l +55.783 154.013 l +55.981 153.753 l +56.124 153.616 l +56.191 153.516 l +56.212 153.397 l +56.182 153.280 l +56.095 153.176 l +55.877 152.931 l +55.699 152.656 l +55.565 152.357 l +55.478 152.041 l +55.440 151.716 l +55.453 151.389 l +55.515 151.067 l +55.626 150.759 l +55.783 150.471 l +55.981 150.211 l +56.124 150.073 l +56.191 149.973 l +56.212 149.855 l +56.182 149.738 l +56.095 149.633 l +55.877 149.389 l +55.699 149.114 l +55.565 148.815 l +55.478 148.499 l +55.440 148.174 l +55.453 147.846 l +55.515 147.525 l +55.626 147.216 l +55.783 146.929 l +55.981 146.668 l +56.124 146.531 l +56.191 146.431 l +56.212 146.312 l +56.182 146.196 l +56.095 146.091 l +55.877 145.846 l +55.699 145.571 l +55.565 145.272 l +55.478 144.957 l +55.440 144.631 l +55.453 144.304 l +55.515 143.982 l +55.626 143.674 l +55.783 143.386 l +55.849 143.299 l +55.899 143.196 l +55.905 143.083 l +55.867 142.975 l +55.789 142.891 l +55.686 142.844 l +55.370 142.770 l +55.101 142.659 l +54.853 142.506 l +54.623 142.310 l +51.255 138.942 l +51.058 138.712 l +50.906 138.463 l +50.795 138.194 l +50.727 137.911 l +50.703 137.609 l +50.703 117.168 l +50.681 117.058 l +50.619 116.965 l +39.735 106.081 l +39.538 105.851 l +39.386 105.603 l +39.275 105.334 l +39.207 105.050 l +39.183 104.749 l +39.183 97.571 l +39.207 97.270 l +39.275 96.986 l +39.386 96.717 l +39.538 96.469 l +39.735 96.239 l +41.814 94.160 l +42.044 93.963 l +42.293 93.811 l +42.562 93.700 l +42.845 93.632 l +43.147 93.608 l +78.852 93.608 l +78.966 93.596 l +h +119.191 24.595 m +119.594 24.634 l +119.990 24.725 l +120.371 24.865 l +120.730 25.052 l +121.063 25.284 l +121.363 25.557 l +121.626 25.866 l +121.848 26.206 l +122.024 26.572 l +122.152 26.957 l +122.229 27.355 l +122.255 27.760 l +122.229 28.165 l +122.152 28.563 l +122.024 28.948 l +121.848 29.313 l +121.626 29.653 l +121.537 29.758 l +121.484 29.852 l +121.469 29.959 l +121.495 30.064 l +121.557 30.152 l +121.648 30.211 l +121.754 30.232 l +123.630 30.252 l +123.754 30.225 l +123.854 30.148 l +123.912 30.035 l +123.915 29.908 l +123.863 29.792 l +123.636 29.487 l +123.437 29.133 l +123.391 29.020 l +125.029 29.020 l +125.029 29.982 l +125.051 30.091 l +125.112 30.184 l +125.205 30.247 l +125.314 30.269 l +127.258 30.290 l +127.369 30.269 l +127.464 30.206 l +127.527 30.113 l +127.549 30.002 l +127.549 29.020 l +129.189 29.020 l +129.048 29.313 l +128.826 29.653 l +128.674 29.832 l +128.621 29.926 l +128.606 30.033 l +128.631 30.138 l +128.694 30.226 l +128.785 30.285 l +128.890 30.307 l +130.895 30.328 l +131.005 30.307 l +131.099 30.246 l +131.163 30.153 l +131.186 30.044 l +131.166 29.933 l +131.078 29.812 l +130.836 29.487 l +130.637 29.133 l +130.484 28.757 l +130.382 28.365 l +130.330 27.963 l +130.330 27.557 l +130.382 27.154 l +130.484 26.762 l +130.637 26.386 l +130.836 26.033 l +131.078 25.707 l +131.361 25.416 l +131.678 25.163 l +132.025 24.953 l +132.396 24.789 l +132.785 24.673 l +133.185 24.608 l +133.591 24.595 l +133.994 24.634 l +134.390 24.725 l +134.771 24.865 l +135.130 25.052 l +135.463 25.284 l +135.763 25.557 l +136.026 25.866 l +136.248 26.206 l +136.424 26.572 l +136.552 26.957 l +136.629 27.355 l +136.655 27.760 l +136.629 28.165 l +136.552 28.563 l +136.424 28.948 l +136.248 29.313 l +136.026 29.653 l +135.811 29.906 l +135.757 30.000 l +135.743 30.108 l +135.768 30.213 l +135.831 30.301 l +135.921 30.360 l +136.027 30.381 l +151.576 30.543 l +151.665 30.546 l +151.874 30.570 l +151.953 30.585 l +152.156 30.642 l +152.232 30.669 l +152.424 30.756 l +152.495 30.796 l +152.670 30.912 l +152.734 30.962 l +152.890 31.104 l +152.950 31.169 l +173.103 53.841 l +173.223 53.990 l +173.282 54.076 l +173.375 54.239 l +173.420 54.333 l +173.486 54.508 l +173.516 54.608 l +173.554 54.791 l +173.568 54.895 l +173.577 55.086 l +173.591 82.556 l +173.605 82.733 l +173.580 83.033 l +173.508 83.325 l +173.390 83.602 l +173.230 83.857 l +173.030 84.082 l +172.797 84.272 l +172.536 84.423 l +172.255 84.529 l +171.960 84.590 l +171.659 84.602 l +171.360 84.565 l +171.071 84.482 l +170.799 84.353 l +170.552 84.182 l +170.437 84.072 l +170.350 84.014 l +170.248 83.991 l +170.145 84.007 l +170.054 84.057 l +169.794 84.273 l +169.534 84.423 l +169.252 84.529 l +168.957 84.590 l +168.657 84.602 l +168.358 84.565 l +168.069 84.482 l +167.797 84.353 l +167.549 84.182 l +167.332 83.973 l +167.151 83.733 l +167.011 83.466 l +166.916 83.181 l +166.868 82.884 l +166.868 82.583 l +166.916 82.285 l +166.968 82.129 l +166.983 82.038 l +166.983 57.338 l +166.964 57.236 l +166.910 57.146 l +150.094 38.313 l +149.997 38.242 l +149.880 38.217 l +74.891 38.217 l +74.590 38.193 l +74.306 38.125 l +74.037 38.014 l +73.789 37.862 l +73.559 37.665 l +67.383 31.489 l +67.186 31.259 l +67.034 31.011 l +66.923 30.742 l +66.854 30.454 l +66.822 30.342 l +66.747 30.252 l +66.561 30.103 l +66.278 29.812 l +66.036 29.487 l +65.837 29.133 l +65.684 28.757 l +65.582 28.365 l +65.530 27.963 l +65.530 27.557 l +65.582 27.154 l +65.684 26.762 l +65.837 26.386 l +66.036 26.033 l +66.278 25.707 l +66.561 25.416 l +66.878 25.163 l +67.225 24.953 l +67.596 24.789 l +67.985 24.673 l +68.385 24.608 l +68.791 24.595 l +69.194 24.634 l +69.590 24.725 l +69.971 24.865 l +70.330 25.052 l +70.663 25.284 l +70.963 25.557 l +71.226 25.866 l +71.448 26.206 l +71.624 26.572 l +71.752 26.957 l +71.829 27.355 l +71.855 27.760 l +71.829 28.165 l +71.752 28.563 l +71.624 28.948 l +71.448 29.313 l +71.226 29.653 l +71.149 29.774 l +71.134 29.880 l +71.158 29.984 l +71.218 30.072 l +75.565 34.419 l +75.658 34.481 l +75.768 34.503 l +119.885 34.503 l +120.009 34.475 l +120.109 34.395 l +120.165 34.280 l +120.166 34.153 l +120.111 34.037 l +120.012 33.957 l +119.888 33.927 l +116.998 33.897 l +116.718 33.873 l +116.434 33.805 l +116.165 33.694 l +115.916 33.542 l +115.686 33.345 l +113.173 30.832 l +113.083 30.771 l +112.977 30.748 l +112.870 30.765 l +112.790 30.795 l +112.394 30.885 l +111.991 30.924 l +111.585 30.911 l +111.185 30.846 l +110.796 30.731 l +110.425 30.567 l +110.078 30.356 l +109.761 30.103 l +109.478 29.812 l +109.236 29.487 l +109.037 29.133 l +108.884 28.757 l +108.782 28.365 l +108.730 27.963 l +108.730 27.557 l +108.782 27.154 l +108.884 26.762 l +109.037 26.386 l +109.236 26.033 l +109.478 25.707 l +109.761 25.416 l +110.078 25.163 l +110.425 24.953 l +110.796 24.789 l +111.185 24.673 l +111.585 24.608 l +111.991 24.595 l +112.394 24.634 l +112.790 24.725 l +113.171 24.865 l +113.530 25.052 l +113.863 25.284 l +114.163 25.557 l +114.426 25.866 l +114.648 26.206 l +114.824 26.572 l +114.952 26.957 l +115.032 27.369 l +115.060 27.449 l +115.111 27.518 l +115.438 27.845 l +115.531 27.907 l +115.642 27.929 l +115.752 27.907 l +115.845 27.845 l +115.908 27.751 l +115.930 27.641 l +115.930 27.557 l +115.982 27.154 l +116.084 26.762 l +116.237 26.386 l +116.436 26.033 l +116.678 25.707 l +116.961 25.416 l +117.278 25.163 l +117.625 24.953 l +117.996 24.789 l +118.385 24.673 l +118.785 24.608 l +119.191 24.595 l +h +111.606 89.583 m +248.462 89.655 l +248.762 89.679 l +249.046 89.747 l +249.315 89.858 l +249.563 90.010 l +249.793 90.207 l +258.705 99.119 l +258.902 99.349 l +259.054 99.597 l +259.165 99.866 l +259.233 100.150 l +259.257 100.451 l +259.257 113.939 l +259.271 114.027 l +259.311 114.106 l +259.373 114.170 l +259.452 114.229 l +259.744 114.512 l +259.997 114.829 l +260.207 115.176 l +260.371 115.547 l +260.487 115.936 l +260.551 116.336 l +260.564 116.741 l +260.525 117.145 l +260.435 117.541 l +260.295 117.922 l +260.107 118.281 l +259.875 118.614 l +259.603 118.914 l +259.294 119.177 l +258.954 119.399 l +258.588 119.575 l +258.203 119.702 l +257.805 119.780 l +257.400 119.806 l +256.995 119.780 l +256.597 119.702 l +256.212 119.575 l +255.846 119.399 l +255.506 119.177 l +255.197 118.914 l +254.925 118.614 l +254.693 118.281 l +254.505 117.922 l +254.365 117.541 l +254.275 117.145 l +254.236 116.741 l +254.249 116.336 l +254.313 115.936 l +254.429 115.547 l +254.593 115.176 l +254.803 114.829 l +255.056 114.512 l +255.348 114.229 l +255.427 114.170 l +255.489 114.106 l +255.529 114.027 l +255.543 113.939 l +255.543 101.328 l +255.521 101.218 l +255.459 101.125 l +247.787 93.453 l +247.693 93.390 l +247.583 93.368 l +112.573 93.297 l +112.454 93.323 l +112.356 93.396 l +109.547 96.609 l +109.490 96.710 l +109.477 96.825 l +109.510 96.936 l +109.585 97.024 l +109.688 97.076 l +109.804 97.084 l +109.913 97.045 l +110.065 96.953 l +110.436 96.789 l +110.825 96.673 l +111.225 96.608 l +111.631 96.595 l +112.034 96.634 l +112.430 96.725 l +112.811 96.865 l +113.170 97.052 l +113.503 97.284 l +113.803 97.557 l +114.066 97.866 l +114.288 98.206 l +114.464 98.572 l +114.592 98.957 l +114.669 99.355 l +114.695 99.760 l +114.669 100.165 l +114.592 100.563 l +114.464 100.948 l +114.288 101.313 l +114.066 101.653 l +113.803 101.962 l +113.631 102.119 l +113.561 102.216 l +113.536 102.332 l +113.536 104.415 l +113.558 104.525 l +113.621 104.619 l +113.714 104.681 l +113.824 104.703 l +245.509 104.703 l +245.810 104.727 l +246.094 104.795 l +246.363 104.906 l +246.611 105.058 l +246.841 105.255 l +251.504 109.918 l +251.701 110.148 l +251.853 110.397 l +251.964 110.666 l +252.032 110.949 l +252.056 111.251 l +252.056 113.939 l +252.070 114.026 l +252.110 114.106 l +252.172 114.169 l +252.252 114.229 l +252.544 114.512 l +252.797 114.829 l +253.007 115.176 l +253.171 115.547 l +253.287 115.936 l +253.351 116.336 l +253.364 116.741 l +253.325 117.145 l +253.235 117.541 l +253.095 117.922 l +252.907 118.281 l +252.675 118.614 l +252.403 118.914 l +252.094 119.177 l +251.754 119.399 l +251.388 119.575 l +251.003 119.702 l +250.605 119.780 l +250.200 119.806 l +249.795 119.780 l +249.397 119.702 l +249.012 119.575 l +248.646 119.399 l +248.306 119.177 l +247.997 118.914 l +247.725 118.614 l +247.493 118.281 l +247.305 117.922 l +247.165 117.541 l +247.075 117.145 l +247.036 116.741 l +247.049 116.336 l +247.113 115.936 l +247.229 115.547 l +247.393 115.176 l +247.603 114.829 l +247.856 114.512 l +248.148 114.229 l +248.227 114.170 l +248.289 114.107 l +248.329 114.027 l +248.342 113.940 l +248.342 112.128 l +248.320 112.018 l +248.258 111.924 l +244.835 108.501 l +244.742 108.439 l +244.632 108.417 l +113.824 108.417 l +113.714 108.439 l +113.621 108.501 l +113.558 108.595 l +113.536 108.705 l +113.536 113.498 l +113.563 113.619 l +113.637 113.717 l +113.883 113.926 l +114.156 114.227 l +114.388 114.559 l +114.576 114.919 l +114.716 115.300 l +114.806 115.695 l +114.845 116.099 l +114.832 116.505 l +114.767 116.905 l +114.652 117.294 l +114.488 117.665 l +114.277 118.012 l +114.024 118.329 l +113.733 118.611 l +113.408 118.854 l +113.054 119.053 l +112.678 119.205 l +112.286 119.308 l +111.884 119.360 l +111.478 119.360 l +111.076 119.308 l +110.683 119.205 l +110.307 119.053 l +109.954 118.854 l +109.629 118.611 l +109.337 118.329 l +109.084 118.012 l +108.874 117.665 l +108.710 117.294 l +108.594 116.905 l +108.529 116.505 l +108.516 116.099 l +108.555 115.695 l +108.646 115.300 l +108.786 114.919 l +108.973 114.559 l +109.206 114.227 l +109.478 113.926 l +109.721 113.720 l +109.796 113.621 l +109.822 113.501 l +109.822 102.578 l +109.809 102.493 l +109.772 102.416 l +109.714 102.353 l +109.401 102.103 l +109.118 101.812 l +108.876 101.487 l +108.677 101.133 l +108.524 100.757 l +108.422 100.365 l +108.370 99.963 l +108.370 99.557 l +108.422 99.154 l +108.524 98.762 l +108.625 98.514 l +108.646 98.401 l +108.621 98.289 l +108.555 98.196 l +108.457 98.136 l +108.344 98.118 l +108.232 98.147 l +108.141 98.216 l +107.503 98.946 l +107.456 99.020 l +107.434 99.104 l +107.437 99.191 l +107.469 99.355 l +107.495 99.760 l +107.469 100.165 l +107.392 100.563 l +107.264 100.948 l +107.088 101.313 l +106.866 101.653 l +106.603 101.962 l +106.303 102.235 l +105.970 102.467 l +105.611 102.655 l +105.230 102.795 l +104.834 102.885 l +104.431 102.924 l +104.025 102.911 l +103.625 102.846 l +103.236 102.731 l +102.865 102.567 l +102.518 102.356 l +102.201 102.103 l +101.918 101.812 l +101.676 101.487 l +101.477 101.133 l +101.324 100.757 l +101.222 100.365 l +101.170 99.963 l +101.170 99.557 l +101.222 99.154 l +101.324 98.762 l +101.477 98.386 l +101.676 98.033 l +101.918 97.707 l +102.201 97.416 l +102.518 97.163 l +102.865 96.953 l +103.236 96.789 l +103.625 96.673 l +104.025 96.608 l +104.431 96.595 l +104.553 96.593 l +104.638 96.559 l +104.707 96.501 l +110.199 90.221 l +110.287 90.128 l +110.412 90.013 l +110.508 89.938 l +110.650 89.845 l +110.756 89.786 l +110.911 89.716 l +111.026 89.674 l +111.189 89.629 l +111.309 89.606 l +111.478 89.587 l +111.606 89.583 l +h +132.921 113.035 m +133.326 113.061 l +133.724 113.138 l +134.109 113.266 l +134.474 113.442 l +134.814 113.663 l +135.123 113.926 l +135.414 114.249 l +135.511 114.319 l +135.628 114.344 l +163.349 114.344 l +163.651 114.368 l +163.934 114.436 l +164.203 114.547 l +164.452 114.699 l +164.682 114.896 l +206.404 156.618 l +206.475 156.670 l +206.557 156.698 l +206.645 156.700 l +206.797 156.681 l +207.203 156.681 l +207.605 156.732 l +207.998 156.835 l +208.374 156.988 l +208.727 157.187 l +209.052 157.429 l +209.344 157.712 l +209.597 158.029 l +209.807 158.376 l +209.971 158.747 l +210.087 159.136 l +210.151 159.536 l +210.164 159.941 l +210.125 160.345 l +210.035 160.741 l +209.895 161.122 l +209.707 161.481 l +209.475 161.814 l +209.203 162.114 l +208.894 162.377 l +208.554 162.599 l +208.188 162.775 l +207.803 162.902 l +207.405 162.980 l +207.000 163.006 l +206.595 162.980 l +206.197 162.902 l +205.812 162.775 l +205.446 162.599 l +205.106 162.377 l +204.797 162.114 l +204.525 161.814 l +204.293 161.481 l +204.105 161.122 l +203.965 160.741 l +203.875 160.345 l +203.836 159.941 l +203.849 159.536 l +203.856 159.401 l +203.828 159.315 l +203.775 159.241 l +162.676 118.142 l +162.583 118.080 l +162.472 118.058 l +135.620 118.058 l +135.535 118.071 l +135.457 118.108 l +135.394 118.166 l +135.264 118.329 l +134.973 118.611 l +134.648 118.854 l +134.294 119.053 l +133.918 119.205 l +133.526 119.308 l +133.124 119.360 l +132.718 119.360 l +132.316 119.308 l +131.923 119.205 l +131.547 119.053 l +131.194 118.854 l +130.869 118.611 l +130.577 118.329 l +130.324 118.012 l +130.114 117.665 l +129.950 117.294 l +129.834 116.905 l +129.769 116.505 l +129.756 116.099 l +129.795 115.695 l +129.886 115.300 l +130.026 114.919 l +130.213 114.559 l +130.446 114.227 l +130.718 113.926 l +131.027 113.663 l +131.367 113.442 l +131.733 113.266 l +132.118 113.138 l +132.516 113.061 l +132.921 113.035 l +h +269.126 153.190 m +269.428 153.166 l +286.376 153.166 l +286.678 153.190 l +286.961 153.258 l +287.230 153.369 l +287.478 153.522 l +287.708 153.718 l +300.501 166.510 l +300.594 166.573 l +300.704 166.595 l +300.842 166.595 l +301.208 166.645 l +301.563 166.745 l +301.902 166.892 l +302.218 167.084 l +302.504 167.317 l +302.756 167.586 l +302.969 167.888 l +303.139 168.216 l +303.262 168.564 l +303.337 168.925 l +303.363 169.294 l +303.337 169.662 l +303.262 170.023 l +303.139 170.371 l +302.969 170.699 l +302.756 171.001 l +302.504 171.271 l +302.218 171.504 l +301.902 171.695 l +301.563 171.843 l +301.208 171.942 l +300.842 171.992 l +300.473 171.992 l +300.107 171.942 l +299.752 171.843 l +299.413 171.695 l +299.098 171.504 l +298.811 171.271 l +298.559 171.001 l +298.346 170.699 l +298.176 170.371 l +298.053 170.023 l +297.978 169.662 l +297.954 169.317 l +297.929 169.217 l +297.870 169.133 l +296.092 167.354 l +295.990 167.288 l +295.870 167.270 l +295.753 167.303 l +295.660 167.381 l +295.608 167.491 l +295.605 167.612 l +295.653 167.723 l +295.769 167.888 l +295.939 168.216 l +296.062 168.564 l +296.137 168.925 l +296.163 169.294 l +296.137 169.662 l +296.062 170.023 l +295.939 170.371 l +295.769 170.699 l +295.556 171.001 l +295.304 171.271 l +295.018 171.504 l +294.702 171.695 l +294.363 171.843 l +294.008 171.942 l +293.642 171.992 l +293.273 171.992 l +292.907 171.942 l +292.552 171.843 l +292.213 171.695 l +291.898 171.504 l +291.611 171.271 l +291.359 171.001 l +291.146 170.699 l +290.976 170.371 l +290.853 170.023 l +290.778 169.662 l +290.754 169.317 l +290.729 169.217 l +290.670 169.133 l +289.455 167.917 l +289.362 167.855 l +289.251 167.833 l +289.141 167.855 l +289.048 167.917 l +288.985 168.011 l +288.963 168.121 l +288.963 170.979 l +288.943 171.189 l +288.885 171.377 l +288.793 171.551 l +288.668 171.704 l +288.515 171.829 l +288.341 171.921 l +288.153 171.979 l +287.943 171.999 l +284.573 171.999 l +284.362 171.979 l +284.174 171.921 l +284.000 171.829 l +283.848 171.704 l +283.723 171.551 l +283.630 171.377 l +283.573 171.189 l +283.552 170.979 l +283.552 167.609 l +283.573 167.398 l +283.630 167.210 l +283.723 167.036 l +283.848 166.884 l +284.000 166.759 l +284.174 166.666 l +284.362 166.609 l +284.573 166.588 l +287.430 166.588 l +287.541 166.566 l +287.634 166.503 l +287.696 166.410 l +287.718 166.300 l +287.696 166.190 l +287.634 166.096 l +283.319 161.781 l +283.226 161.719 l +283.116 161.697 l +274.507 161.697 l +274.390 161.722 l +274.293 161.792 l +274.002 162.115 l +273.694 162.377 l +273.354 162.599 l +272.988 162.775 l +272.603 162.902 l +272.205 162.980 l +271.800 163.006 l +271.395 162.980 l +270.997 162.902 l +270.612 162.775 l +270.246 162.599 l +269.906 162.377 l +269.597 162.114 l +269.325 161.814 l +269.093 161.481 l +268.905 161.122 l +268.765 160.741 l +268.675 160.345 l +268.636 159.941 l +268.649 159.536 l +268.713 159.136 l +268.729 158.985 l +268.684 158.868 l +268.592 158.781 l +268.472 158.742 l +268.347 158.758 l +268.241 158.825 l +267.825 159.241 l +267.772 159.315 l +267.744 159.401 l +267.751 159.536 l +267.764 159.941 l +267.725 160.345 l +267.635 160.741 l +267.495 161.122 l +267.307 161.481 l +267.075 161.814 l +266.803 162.114 l +266.494 162.377 l +266.154 162.599 l +265.788 162.775 l +265.403 162.902 l +265.005 162.980 l +264.600 163.006 l +264.195 162.980 l +263.797 162.902 l +263.412 162.775 l +263.046 162.599 l +262.706 162.377 l +262.397 162.114 l +262.125 161.814 l +261.893 161.481 l +261.705 161.122 l +261.565 160.741 l +261.475 160.345 l +261.436 159.941 l +261.449 159.536 l +261.513 159.136 l +261.629 158.747 l +261.793 158.376 l +262.003 158.029 l +262.256 157.712 l +262.548 157.429 l +262.873 157.187 l +263.226 156.988 l +263.602 156.835 l +263.995 156.732 l +264.397 156.681 l +264.803 156.681 l +264.955 156.700 l +265.043 156.698 l +265.125 156.670 l +265.196 156.618 l +268.096 153.718 l +268.326 153.522 l +268.574 153.369 l +268.843 153.258 l +269.126 153.190 l +h +285.707 173.845 m +286.073 173.795 l +286.442 173.795 l +286.808 173.845 l +287.163 173.945 l +287.502 174.092 l +287.818 174.284 l +288.104 174.517 l +288.356 174.786 l +288.569 175.088 l +288.739 175.416 l +288.862 175.764 l +288.937 176.125 l +288.961 176.471 l +288.986 176.570 l +289.045 176.655 l +290.824 178.433 l +290.925 178.499 l +291.045 178.517 l +291.162 178.484 l +291.255 178.406 l +291.307 178.297 l +291.310 178.175 l +291.262 178.064 l +291.146 177.899 l +290.976 177.571 l +290.853 177.223 l +290.778 176.862 l +290.753 176.494 l +290.778 176.125 l +290.853 175.764 l +290.976 175.416 l +291.146 175.088 l +291.359 174.786 l +291.611 174.517 l +291.898 174.284 l +292.213 174.092 l +292.552 173.945 l +292.907 173.845 l +293.273 173.795 l +293.642 173.795 l +294.008 173.845 l +294.363 173.945 l +294.702 174.092 l +295.018 174.284 l +295.304 174.517 l +295.556 174.786 l +295.769 175.088 l +295.939 175.416 l +296.062 175.764 l +296.137 176.125 l +296.163 176.494 l +296.137 176.862 l +296.062 177.223 l +295.939 177.571 l +295.769 177.899 l +295.556 178.201 l +295.304 178.471 l +295.202 178.553 l +295.128 178.644 l +295.097 178.757 l +295.113 178.873 l +295.174 178.973 l +295.269 179.041 l +295.384 179.065 l +296.794 179.065 l +297.096 179.088 l +297.379 179.156 l +297.648 179.268 l +297.897 179.420 l +298.127 179.617 l +306.585 188.075 l +306.782 188.305 l +306.934 188.553 l +307.045 188.822 l +307.113 189.106 l +307.137 189.407 l +307.137 189.837 l +307.147 189.912 l +307.176 189.981 l +307.335 190.258 l +307.460 190.575 l +307.536 190.908 l +307.562 191.259 l +307.562 193.221 l +307.536 193.572 l +307.460 193.905 l +307.335 194.222 l +307.165 194.517 l +306.952 194.784 l +306.702 195.016 l +306.421 195.208 l +306.113 195.356 l +305.788 195.456 l +305.450 195.507 l +305.110 195.507 l +304.772 195.456 l +304.447 195.356 l +304.139 195.208 l +303.858 195.016 l +303.676 194.847 l +303.585 194.790 l +303.480 194.770 l +303.375 194.790 l +303.284 194.847 l +303.102 195.016 l +302.821 195.208 l +302.513 195.356 l +302.188 195.456 l +301.850 195.507 l +301.510 195.507 l +301.172 195.456 l +300.847 195.356 l +300.539 195.208 l +300.459 195.153 l +300.362 195.111 l +300.256 195.106 l +300.156 195.140 l +299.914 195.343 l +299.740 195.436 l +299.552 195.494 l +299.341 195.514 l +298.898 195.514 l +298.898 193.554 l +299.112 193.554 l +299.228 193.530 l +299.323 193.462 l +299.384 193.361 l +299.398 193.221 l +299.398 191.259 l +299.384 191.119 l +299.323 191.018 l +299.228 190.950 l +299.112 190.926 l +298.898 190.926 l +298.898 188.966 l +299.341 188.966 l +299.552 188.986 l +299.740 189.044 l +299.914 189.137 l +300.156 189.340 l +300.256 189.374 l +300.362 189.369 l +300.459 189.327 l +300.539 189.272 l +300.847 189.124 l +301.172 189.024 l +301.510 188.973 l +301.646 188.951 l +301.739 188.889 l +301.802 188.795 l +301.823 188.685 l +301.802 188.575 l +301.739 188.481 l +296.121 182.863 l +296.027 182.800 l +295.917 182.779 l +290.697 182.779 l +290.395 182.755 l +290.112 182.687 l +289.843 182.575 l +289.595 182.423 l +289.365 182.227 l +286.415 179.277 l +286.321 179.214 l +286.211 179.192 l +286.073 179.192 l +285.707 179.142 l +285.352 179.043 l +285.013 178.895 l +284.698 178.704 l +284.411 178.471 l +284.159 178.201 l +283.946 177.899 l +283.776 177.571 l +283.653 177.223 l +283.578 176.862 l +283.553 176.494 l +283.578 176.125 l +283.653 175.764 l +283.776 175.416 l +283.946 175.088 l +284.159 174.786 l +284.411 174.517 l +284.698 174.284 l +285.013 174.092 l +285.352 173.945 l +285.707 173.845 l +h +36.991 173.795 m +37.357 173.845 l +37.712 173.945 l +38.051 174.092 l +38.366 174.284 l +38.653 174.517 l +38.905 174.786 l +39.118 175.088 l +39.288 175.416 l +39.411 175.764 l +39.486 176.125 l +39.510 176.471 l +39.535 176.570 l +39.594 176.655 l +41.372 178.433 l +41.474 178.499 l +41.594 178.517 l +41.711 178.484 l +41.804 178.406 l +41.856 178.297 l +41.859 178.175 l +41.811 178.064 l +41.695 177.899 l +41.525 177.571 l +41.402 177.223 l +41.327 176.862 l +41.301 176.494 l +41.327 176.125 l +41.402 175.764 l +41.525 175.416 l +41.695 175.088 l +41.908 174.786 l +42.160 174.517 l +42.446 174.284 l +42.762 174.092 l +43.101 173.945 l +43.456 173.845 l +43.822 173.795 l +44.191 173.795 l +44.557 173.845 l +44.912 173.945 l +45.251 174.092 l +45.566 174.284 l +45.853 174.517 l +46.105 174.786 l +46.318 175.088 l +46.488 175.416 l +46.611 175.764 l +46.686 176.125 l +46.711 176.494 l +46.686 176.862 l +46.611 177.223 l +46.488 177.571 l +46.318 177.899 l +46.105 178.201 l +45.853 178.471 l +45.566 178.704 l +45.251 178.895 l +44.912 179.043 l +44.557 179.142 l +44.191 179.192 l +43.822 179.192 l +43.456 179.142 l +43.101 179.043 l +42.762 178.895 l +42.444 178.702 l +42.332 178.663 l +42.214 178.672 l +42.109 178.727 l +42.036 178.821 l +42.007 178.936 l +42.026 179.053 l +42.091 179.152 l +45.678 182.739 l +45.771 182.801 l +45.881 182.823 l +62.230 182.823 l +62.344 182.799 l +62.754 182.469 l +63.070 182.277 l +63.409 182.130 l +63.765 182.030 l +64.131 181.980 l +64.500 181.980 l +64.866 182.030 l +65.222 182.130 l +65.561 182.277 l +65.876 182.469 l +66.163 182.702 l +66.415 182.972 l +66.628 183.274 l +66.798 183.602 l +66.922 183.950 l +66.997 184.311 l +67.022 184.680 l +66.997 185.049 l +66.922 185.410 l +66.798 185.758 l +66.628 186.086 l +66.415 186.388 l +66.163 186.658 l +65.876 186.891 l +65.561 187.083 l +65.222 187.230 l +64.866 187.330 l +64.500 187.380 l +64.131 187.380 l +63.765 187.330 l +63.409 187.230 l +63.070 187.083 l +62.754 186.891 l +62.468 186.658 l +62.344 186.561 l +62.230 186.537 l +45.004 186.537 l +44.702 186.513 l +44.419 186.445 l +44.150 186.334 l +43.902 186.182 l +43.672 185.985 l +36.963 179.277 l +36.870 179.214 l +36.760 179.192 l +36.622 179.192 l +36.256 179.142 l +35.901 179.043 l +35.562 178.895 l +35.246 178.704 l +34.960 178.471 l +34.708 178.201 l +34.495 177.899 l +34.325 177.571 l +34.202 177.223 l +34.127 176.862 l +34.101 176.494 l +34.127 176.125 l +34.202 175.764 l +34.325 175.416 l +34.495 175.088 l +34.708 174.786 l +34.960 174.517 l +35.246 174.284 l +35.562 174.092 l +35.901 173.945 l +36.256 173.845 l +36.622 173.795 l +36.991 173.795 l +h +177.049 153.413 m +177.259 153.392 l +180.066 153.392 l +180.276 153.413 l +180.465 153.470 l +180.602 153.527 l +180.696 153.527 l +180.828 153.473 l +181.017 153.416 l +181.227 153.395 l +181.742 153.395 l +181.742 155.958 l +181.374 155.958 l +181.264 155.980 l +181.171 156.042 l +181.108 156.136 l +181.086 156.246 l +181.086 159.503 l +181.108 159.613 l +181.171 159.706 l +181.264 159.769 l +181.374 159.791 l +181.742 159.791 l +181.742 162.353 l +181.227 162.353 l +181.017 162.333 l +180.828 162.275 l +180.691 162.219 l +180.597 162.219 l +180.465 162.273 l +180.276 162.330 l +180.066 162.350 l +177.259 162.350 l +177.049 162.330 l +176.861 162.273 l +176.725 162.217 l +176.631 162.217 l +176.496 162.273 l +176.307 162.330 l +176.097 162.350 l +173.291 162.350 l +173.080 162.330 l +172.892 162.273 l +172.756 162.217 l +172.663 162.217 l +172.527 162.273 l +172.339 162.330 l +172.128 162.350 l +169.322 162.350 l +169.112 162.330 l +168.923 162.273 l +168.788 162.217 l +168.694 162.217 l +168.559 162.273 l +168.370 162.330 l +168.160 162.350 l +165.353 162.350 l +165.143 162.330 l +164.955 162.273 l +164.819 162.217 l +164.725 162.217 l +164.590 162.273 l +164.401 162.330 l +164.191 162.350 l +161.385 162.350 l +161.175 162.330 l +160.986 162.273 l +160.856 162.221 l +160.762 162.221 l +160.622 162.278 l +160.433 162.336 l +160.223 162.356 l +157.417 162.356 l +157.207 162.336 l +157.018 162.278 l +156.883 162.223 l +156.789 162.223 l +156.643 162.284 l +156.455 162.341 l +156.245 162.362 l +153.438 162.362 l +153.228 162.341 l +153.039 162.284 l +152.866 162.191 l +152.713 162.066 l +152.588 161.914 l +152.495 161.740 l +152.438 161.552 l +152.417 161.341 l +152.417 154.425 l +152.438 154.214 l +152.495 154.026 l +152.588 153.852 l +152.713 153.700 l +152.866 153.575 l +153.039 153.482 l +153.228 153.425 l +153.438 153.404 l +156.245 153.404 l +156.455 153.425 l +156.643 153.482 l +156.778 153.537 l +156.872 153.537 l +157.018 153.476 l +157.207 153.419 l +157.417 153.398 l +160.223 153.398 l +160.433 153.419 l +160.622 153.476 l +160.752 153.528 l +160.846 153.528 l +160.986 153.470 l +161.175 153.413 l +161.385 153.392 l +164.191 153.392 l +164.401 153.413 l +164.590 153.470 l +164.725 153.525 l +164.819 153.525 l +164.955 153.470 l +165.143 153.413 l +165.353 153.392 l +168.160 153.392 l +168.370 153.413 l +168.559 153.470 l +168.694 153.525 l +168.788 153.525 l +168.923 153.470 l +169.112 153.413 l +169.322 153.392 l +172.128 153.392 l +172.339 153.413 l +172.527 153.470 l +172.663 153.525 l +172.756 153.525 l +172.892 153.470 l +173.080 153.413 l +173.291 153.392 l +176.097 153.392 l +176.307 153.413 l +176.496 153.470 l +176.631 153.525 l +176.725 153.525 l +176.861 153.470 l +177.049 153.413 l +h +291.240 147.926 m +291.650 147.952 l +292.054 148.029 l +292.445 148.156 l +292.817 148.331 l +293.164 148.552 l +293.481 148.814 l +293.762 149.113 l +294.004 149.446 l +294.202 149.806 l +294.353 150.188 l +294.456 150.587 l +294.507 150.994 l +294.507 151.406 l +294.476 151.652 l +294.478 151.739 l +294.507 151.822 l +294.558 151.892 l +297.764 155.098 l +297.857 155.160 l +297.968 155.182 l +301.011 155.182 l +301.108 155.166 l +301.193 155.117 l +301.537 154.680 l +301.841 154.377 l +302.179 154.112 l +302.547 153.890 l +302.939 153.713 l +303.349 153.586 l +303.771 153.508 l +304.200 153.482 l +304.629 153.508 l +305.051 153.586 l +305.461 153.713 l +305.853 153.890 l +306.221 154.112 l +306.559 154.377 l +306.863 154.680 l +307.128 155.019 l +307.350 155.386 l +307.526 155.778 l +307.654 156.188 l +307.731 156.611 l +307.757 157.039 l +307.731 157.468 l +307.654 157.891 l +307.526 158.301 l +307.350 158.692 l +307.128 159.060 l +306.863 159.398 l +306.559 159.702 l +306.221 159.967 l +305.853 160.189 l +305.461 160.365 l +305.051 160.493 l +304.629 160.571 l +304.200 160.597 l +303.771 160.571 l +303.349 160.493 l +302.939 160.365 l +302.547 160.189 l +302.179 159.967 l +301.841 159.702 l +301.537 159.398 l +301.272 159.060 l +301.193 158.961 l +301.108 158.913 l +301.011 158.896 l +297.091 158.896 l +296.789 158.872 l +296.506 158.804 l +296.237 158.693 l +295.988 158.541 l +295.758 158.344 l +291.936 154.522 l +291.860 154.468 l +291.771 154.440 l +291.240 154.474 l +290.830 154.448 l +290.426 154.371 l +290.035 154.244 l +289.663 154.069 l +289.316 153.848 l +288.999 153.586 l +288.718 153.287 l +288.476 152.954 l +288.278 152.594 l +288.127 152.212 l +288.024 151.813 l +287.973 151.406 l +287.973 150.994 l +288.024 150.587 l +288.127 150.188 l +288.278 149.806 l +288.476 149.446 l +288.718 149.113 l +288.999 148.814 l +289.316 148.552 l +289.663 148.331 l +290.035 148.156 l +290.426 148.029 l +290.830 147.952 l +291.240 147.926 l +h +304.200 127.403 m +304.629 127.429 l +305.051 127.507 l +305.461 127.635 l +305.853 127.811 l +306.221 128.033 l +306.559 128.298 l +306.863 128.602 l +307.128 128.940 l +307.350 129.308 l +307.526 129.699 l +307.654 130.109 l +307.731 130.532 l +307.757 130.961 l +307.731 131.389 l +307.654 131.812 l +307.526 132.222 l +307.350 132.614 l +307.128 132.981 l +306.863 133.320 l +306.559 133.623 l +306.221 133.888 l +305.853 134.110 l +305.461 134.287 l +305.051 134.414 l +304.629 134.492 l +304.200 134.518 l +303.771 134.492 l +303.349 134.414 l +302.939 134.287 l +302.547 134.110 l +302.179 133.888 l +301.841 133.623 l +301.537 133.320 l +301.272 132.981 l +301.193 132.883 l +301.108 132.834 l +301.011 132.818 l +297.968 132.818 l +297.857 132.840 l +297.764 132.902 l +294.558 136.108 l +294.507 136.178 l +294.478 136.261 l +294.476 136.348 l +294.507 136.594 l +294.507 137.006 l +294.456 137.413 l +294.353 137.812 l +294.202 138.194 l +294.004 138.554 l +293.762 138.887 l +293.481 139.186 l +293.164 139.448 l +292.817 139.669 l +292.445 139.844 l +292.054 139.971 l +291.650 140.048 l +291.240 140.074 l +290.830 140.048 l +290.426 139.971 l +290.035 139.844 l +289.663 139.669 l +289.316 139.448 l +288.999 139.186 l +288.718 138.887 l +288.476 138.554 l +288.278 138.194 l +288.127 137.812 l +288.024 137.413 l +287.973 137.006 l +287.973 136.594 l +288.024 136.187 l +288.127 135.788 l +288.278 135.406 l +288.476 135.046 l +288.718 134.713 l +288.999 134.414 l +289.316 134.152 l +289.663 133.931 l +290.035 133.756 l +290.426 133.629 l +290.830 133.552 l +291.240 133.526 l +291.650 133.552 l +291.771 133.560 l +291.860 133.532 l +291.936 133.478 l +295.758 129.656 l +295.988 129.459 l +296.237 129.307 l +296.506 129.196 l +296.789 129.128 l +297.091 129.104 l +301.011 129.104 l +301.108 129.087 l +301.193 129.039 l +301.537 128.602 l +301.841 128.298 l +302.179 128.033 l +302.547 127.811 l +302.939 127.635 l +303.349 127.507 l +303.771 127.429 l +304.200 127.403 l +h +90.081 113.035 m +90.486 113.061 l +90.884 113.138 l +91.269 113.266 l +91.634 113.442 l +91.974 113.663 l +92.283 113.926 l +92.556 114.227 l +92.788 114.559 l +92.976 114.919 l +93.116 115.300 l +93.206 115.695 l +93.214 115.778 l +93.250 115.893 l +93.331 115.982 l +93.441 116.032 l +93.561 116.032 l +93.671 115.982 l +93.751 115.893 l +93.787 115.778 l +93.795 115.695 l +93.886 115.300 l +94.026 114.919 l +94.213 114.559 l +94.446 114.227 l +94.718 113.926 l +95.027 113.663 l +95.367 113.442 l +95.733 113.266 l +96.118 113.138 l +96.516 113.061 l +96.921 113.035 l +97.326 113.061 l +97.724 113.138 l +98.109 113.266 l +98.474 113.442 l +98.814 113.663 l +99.123 113.926 l +99.396 114.227 l +99.628 114.559 l +99.816 114.919 l +99.956 115.300 l +100.046 115.695 l +100.085 116.099 l +100.072 116.505 l +100.007 116.905 l +99.892 117.294 l +99.728 117.665 l +99.517 118.012 l +99.264 118.329 l +98.973 118.611 l +98.648 118.854 l +98.294 119.053 l +97.918 119.205 l +97.526 119.308 l +97.124 119.360 l +96.718 119.360 l +96.316 119.308 l +95.923 119.205 l +95.547 119.053 l +95.194 118.854 l +94.869 118.611 l +94.577 118.329 l +94.324 118.012 l +94.114 117.665 l +93.950 117.294 l +93.834 116.905 l +93.785 116.601 l +93.744 116.494 l +93.664 116.410 l +93.558 116.365 l +93.443 116.365 l +93.337 116.410 l +93.257 116.494 l +93.216 116.601 l +93.167 116.905 l +93.052 117.294 l +92.888 117.665 l +92.677 118.012 l +92.424 118.329 l +92.133 118.611 l +91.808 118.854 l +91.454 119.053 l +91.078 119.205 l +90.686 119.308 l +90.284 119.360 l +89.878 119.360 l +89.476 119.308 l +89.083 119.205 l +88.707 119.053 l +88.354 118.854 l +88.029 118.611 l +87.737 118.329 l +87.484 118.012 l +87.274 117.665 l +87.110 117.294 l +86.994 116.905 l +86.929 116.505 l +86.916 116.099 l +86.955 115.695 l +87.046 115.300 l +87.186 114.919 l +87.373 114.559 l +87.606 114.227 l +87.878 113.926 l +88.187 113.663 l +88.527 113.442 l +88.893 113.266 l +89.278 113.138 l +89.676 113.061 l +90.081 113.035 l +h +33.455 98.453 m +33.903 98.400 l +34.355 98.400 l +34.804 98.453 l +35.244 98.557 l +35.669 98.711 l +36.072 98.914 l +36.450 99.162 l +36.796 99.453 l +37.106 99.782 l +37.376 100.144 l +37.602 100.536 l +37.781 100.950 l +37.911 101.383 l +37.989 101.828 l +38.016 102.280 l +37.989 102.731 l +37.911 103.176 l +37.781 103.609 l +37.602 104.024 l +37.376 104.415 l +37.106 104.778 l +36.796 105.106 l +36.450 105.397 l +36.072 105.645 l +35.669 105.848 l +35.244 106.002 l +34.804 106.107 l +34.355 106.159 l +33.903 106.159 l +33.455 106.107 l +33.015 106.002 l +32.590 105.848 l +32.186 105.645 l +31.809 105.397 l +31.463 105.106 l +31.153 104.778 l +30.883 104.415 l +30.657 104.024 l +30.478 103.609 l +30.348 103.176 l +30.270 102.731 l +30.243 102.280 l +30.270 101.828 l +30.348 101.383 l +30.478 100.950 l +30.657 100.536 l +30.883 100.144 l +31.153 99.782 l +31.463 99.453 l +31.809 99.162 l +32.186 98.914 l +32.590 98.711 l +33.015 98.557 l +33.455 98.453 l +h +168.958 132.164 m +169.407 132.216 l +169.847 132.320 l +170.271 132.475 l +170.675 132.678 l +171.053 132.926 l +171.399 133.217 l +171.709 133.545 l +171.979 133.908 l +172.205 134.299 l +172.384 134.714 l +172.513 135.147 l +172.592 135.592 l +172.618 136.043 l +172.592 136.494 l +172.513 136.939 l +172.384 137.372 l +172.205 137.787 l +171.979 138.179 l +171.709 138.541 l +171.399 138.870 l +171.053 139.160 l +170.675 139.409 l +170.271 139.612 l +169.847 139.766 l +169.407 139.870 l +168.958 139.923 l +168.506 139.923 l +168.057 139.870 l +167.617 139.766 l +167.193 139.612 l +166.789 139.409 l +166.411 139.160 l +166.065 138.870 l +165.755 138.541 l +165.485 138.179 l +165.259 137.787 l +165.080 137.372 l +164.951 136.939 l +164.872 136.494 l +164.846 136.043 l +164.872 135.592 l +164.951 135.147 l +165.080 134.714 l +165.259 134.299 l +165.485 133.908 l +165.755 133.545 l +166.065 133.217 l +166.411 132.926 l +166.789 132.678 l +167.193 132.475 l +167.617 132.320 l +168.057 132.216 l +168.506 132.164 l +168.958 132.164 l +h +33.815 21.413 m +34.263 21.360 l +34.715 21.360 l +35.164 21.413 l +35.604 21.517 l +36.029 21.671 l +36.432 21.874 l +36.810 22.122 l +37.156 22.413 l +37.466 22.742 l +37.736 23.104 l +37.962 23.496 l +38.141 23.910 l +38.271 24.343 l +38.349 24.788 l +38.376 25.240 l +38.349 25.691 l +38.271 26.136 l +38.141 26.569 l +37.962 26.984 l +37.736 27.375 l +37.466 27.738 l +37.156 28.066 l +36.810 28.357 l +36.432 28.605 l +36.029 28.808 l +35.604 28.962 l +35.164 29.067 l +34.715 29.119 l +34.263 29.119 l +33.815 29.067 l +33.375 28.962 l +32.950 28.808 l +32.546 28.605 l +32.169 28.357 l +31.823 28.066 l +31.513 27.738 l +31.243 27.375 l +31.017 26.984 l +30.838 26.569 l +30.708 26.136 l +30.630 25.691 l +30.603 25.240 l +30.630 24.788 l +30.708 24.343 l +30.838 23.910 l +31.017 23.496 l +31.243 23.104 l +31.513 22.742 l +31.823 22.413 l +32.169 22.122 l +32.546 21.874 l +32.950 21.671 l +33.375 21.517 l +33.815 21.413 l +h +303.635 98.400 m +304.084 98.453 l +304.524 98.557 l +304.949 98.711 l +305.352 98.914 l +305.730 99.162 l +306.076 99.453 l +306.386 99.782 l +306.656 100.144 l +306.882 100.536 l +307.061 100.950 l +307.191 101.383 l +307.269 101.828 l +307.296 102.280 l +307.269 102.731 l +307.191 103.176 l +307.061 103.609 l +306.882 104.024 l +306.656 104.415 l +306.386 104.778 l +306.076 105.106 l +305.730 105.397 l +305.352 105.645 l +304.949 105.848 l +304.524 106.002 l +304.084 106.107 l +303.635 106.159 l +303.183 106.159 l +302.735 106.107 l +302.295 106.002 l +301.870 105.848 l +301.466 105.645 l +301.089 105.397 l +300.743 105.106 l +300.433 104.778 l +300.163 104.415 l +299.937 104.024 l +299.758 103.609 l +299.628 103.176 l +299.550 102.731 l +299.523 102.280 l +299.550 101.828 l +299.628 101.383 l +299.758 100.950 l +299.937 100.536 l +300.163 100.144 l +300.433 99.782 l +300.743 99.453 l +301.089 99.162 l +301.466 98.914 l +301.870 98.711 l +302.295 98.557 l +302.735 98.453 l +303.183 98.400 l +303.635 98.400 l +h +302.735 21.413 m +303.183 21.360 l +303.635 21.360 l +304.084 21.413 l +304.524 21.517 l +304.949 21.671 l +305.352 21.874 l +305.730 22.122 l +306.076 22.413 l +306.386 22.742 l +306.656 23.104 l +306.882 23.496 l +307.061 23.910 l +307.191 24.343 l +307.269 24.788 l +307.296 25.240 l +307.269 25.691 l +307.191 26.136 l +307.061 26.569 l +306.882 26.984 l +306.656 27.375 l +306.386 27.738 l +306.076 28.066 l +305.730 28.357 l +305.352 28.605 l +304.949 28.808 l +304.524 28.962 l +304.084 29.067 l +303.635 29.119 l +303.183 29.119 l +302.735 29.067 l +302.295 28.962 l +301.870 28.808 l +301.466 28.605 l +301.089 28.357 l +300.743 28.066 l +300.433 27.738 l +300.163 27.375 l +299.937 26.984 l +299.758 26.569 l +299.628 26.136 l +299.550 25.691 l +299.523 25.240 l +299.550 24.788 l +299.628 24.343 l +299.758 23.910 l +299.937 23.496 l +300.163 23.104 l +300.433 22.742 l +300.743 22.413 l +301.089 22.122 l +301.466 21.874 l +301.870 21.671 l +302.295 21.517 l +302.735 21.413 l +h +293.680 120.871 m +294.124 120.922 l +294.558 121.025 l +294.978 121.178 l +295.377 121.379 l +295.750 121.624 l +296.093 121.911 l +296.399 122.236 l +296.666 122.594 l +296.889 122.981 l +297.066 123.391 l +297.194 123.819 l +297.272 124.259 l +297.298 124.705 l +297.272 125.151 l +297.194 125.590 l +297.066 126.018 l +296.889 126.428 l +296.666 126.815 l +296.399 127.173 l +296.093 127.498 l +295.750 127.785 l +295.377 128.031 l +294.978 128.231 l +294.558 128.384 l +294.124 128.487 l +293.680 128.539 l +293.234 128.539 l +292.790 128.487 l +292.355 128.384 l +291.936 128.231 l +291.537 128.031 l +291.163 127.785 l +290.821 127.498 l +290.515 127.173 l +290.248 126.815 l +290.025 126.428 l +289.848 126.018 l +289.720 125.590 l +289.642 125.151 l +289.616 124.705 l +289.642 124.259 l +289.720 123.819 l +289.848 123.391 l +290.025 122.981 l +290.248 122.594 l +290.515 122.236 l +290.821 121.911 l +291.163 121.624 l +291.537 121.379 l +291.936 121.178 l +292.355 121.025 l +292.790 120.922 l +293.234 120.871 l +293.680 120.871 l +h +44.231 120.871 m +44.675 120.922 l +45.109 121.025 l +45.529 121.178 l +45.928 121.379 l +46.301 121.624 l +46.643 121.911 l +46.950 122.236 l +47.217 122.594 l +47.440 122.981 l +47.617 123.391 l +47.745 123.819 l +47.823 124.259 l +47.849 124.705 l +47.823 125.151 l +47.745 125.590 l +47.617 126.018 l +47.440 126.428 l +47.217 126.815 l +46.950 127.173 l +46.643 127.498 l +46.301 127.785 l +45.928 128.031 l +45.529 128.231 l +45.109 128.384 l +44.675 128.487 l +44.231 128.539 l +43.785 128.539 l +43.341 128.487 l +42.906 128.384 l +42.487 128.231 l +42.087 128.031 l +41.714 127.785 l +41.372 127.498 l +41.066 127.173 l +40.799 126.815 l +40.576 126.428 l +40.399 126.018 l +40.271 125.590 l +40.193 125.151 l +40.167 124.705 l +40.193 124.259 l +40.271 123.819 l +40.399 123.391 l +40.576 122.981 l +40.799 122.594 l +41.066 122.236 l +41.372 121.911 l +41.714 121.624 l +42.087 121.379 l +42.487 121.178 l +42.906 121.025 l +43.341 120.922 l +43.785 120.871 l +44.231 120.871 l +h +286.593 190.319 m +287.037 190.371 l +287.471 190.474 l +287.891 190.626 l +288.290 190.827 l +288.663 191.072 l +289.006 191.359 l +289.312 191.684 l +289.579 192.043 l +289.802 192.429 l +289.979 192.839 l +290.107 193.267 l +290.185 193.707 l +290.211 194.153 l +290.185 194.599 l +290.107 195.039 l +289.979 195.467 l +289.802 195.877 l +289.579 196.264 l +289.312 196.622 l +289.006 196.947 l +288.663 197.234 l +288.290 197.479 l +287.891 197.680 l +287.471 197.832 l +287.037 197.935 l +286.593 197.987 l +286.147 197.987 l +285.703 197.935 l +285.268 197.832 l +284.849 197.680 l +284.450 197.479 l +284.076 197.234 l +283.734 196.947 l +283.428 196.622 l +283.161 196.264 l +282.938 195.877 l +282.761 195.467 l +282.633 195.039 l +282.555 194.599 l +282.529 194.153 l +282.555 193.707 l +282.633 193.267 l +282.761 192.839 l +282.938 192.429 l +283.161 192.043 l +283.428 191.684 l +283.734 191.359 l +284.076 191.072 l +284.450 190.827 l +284.849 190.626 l +285.268 190.474 l +285.703 190.371 l +286.147 190.319 l +286.593 190.319 l +h +37.145 190.319 m +37.589 190.371 l +38.023 190.474 l +38.443 190.626 l +38.842 190.827 l +39.215 191.072 l +39.557 191.359 l +39.864 191.684 l +40.130 192.043 l +40.354 192.429 l +40.531 192.839 l +40.659 193.267 l +40.736 193.707 l +40.762 194.153 l +40.736 194.599 l +40.659 195.039 l +40.531 195.467 l +40.354 195.877 l +40.130 196.264 l +39.864 196.622 l +39.557 196.947 l +39.215 197.234 l +38.842 197.479 l +38.443 197.680 l +38.023 197.832 l +37.589 197.935 l +37.145 197.987 l +36.698 197.987 l +36.255 197.935 l +35.820 197.832 l +35.400 197.680 l +35.001 197.479 l +34.628 197.234 l +34.286 196.947 l +33.979 196.622 l +33.713 196.264 l +33.489 195.877 l +33.313 195.467 l +33.184 195.039 l +33.107 194.599 l +33.081 194.153 l +33.107 193.707 l +33.184 193.267 l +33.313 192.839 l +33.489 192.429 l +33.713 192.043 l +33.979 191.684 l +34.286 191.359 l +34.628 191.072 l +35.001 190.827 l +35.400 190.626 l +35.820 190.474 l +36.255 190.371 l +36.698 190.319 l +37.145 190.319 l +h +48.293 59.977 m +48.737 59.925 l +49.183 59.925 l +49.627 59.977 l +50.062 60.080 l +50.481 60.233 l +50.880 60.433 l +51.254 60.679 l +51.596 60.966 l +51.902 61.291 l +52.169 61.649 l +52.392 62.036 l +52.569 62.446 l +52.697 62.874 l +52.775 63.314 l +52.801 63.760 l +52.775 64.205 l +52.697 64.645 l +52.569 65.073 l +52.392 65.483 l +52.169 65.870 l +51.902 66.228 l +51.596 66.553 l +51.254 66.840 l +50.880 67.086 l +50.481 67.286 l +50.062 67.439 l +49.627 67.542 l +49.183 67.594 l +48.737 67.594 l +48.293 67.542 l +47.858 67.439 l +47.439 67.286 l +47.040 67.086 l +46.666 66.840 l +46.324 66.553 l +46.018 66.228 l +45.751 65.870 l +45.528 65.483 l +45.351 65.073 l +45.223 64.645 l +45.145 64.205 l +45.119 63.760 l +45.145 63.314 l +45.223 62.874 l +45.351 62.446 l +45.528 62.036 l +45.751 61.649 l +46.018 61.291 l +46.324 60.966 l +46.666 60.679 l +47.040 60.433 l +47.439 60.233 l +47.858 60.080 l +48.293 59.977 l +h +180.884 113.134 m +181.094 113.113 l +185.386 113.113 l +185.596 113.134 l +185.785 113.191 l +185.958 113.284 l +186.111 113.409 l +186.236 113.562 l +186.329 113.735 l +186.386 113.924 l +186.407 114.134 l +186.407 118.426 l +186.386 118.636 l +186.329 118.825 l +186.236 118.998 l +186.111 119.151 l +185.958 119.276 l +185.785 119.369 l +185.596 119.426 l +185.386 119.447 l +181.094 119.447 l +180.884 119.426 l +180.695 119.369 l +180.522 119.276 l +180.369 119.151 l +180.244 118.998 l +180.151 118.825 l +180.094 118.636 l +180.073 118.426 l +180.073 114.134 l +180.094 113.924 l +180.151 113.735 l +180.244 113.562 l +180.369 113.409 l +180.522 113.284 l +180.695 113.191 l +180.884 113.134 l +h +272.003 113.481 m +272.405 113.532 l +272.798 113.635 l +273.174 113.788 l +273.527 113.987 l +273.852 114.229 l +274.144 114.512 l +274.397 114.829 l +274.607 115.176 l +274.771 115.547 l +274.887 115.936 l +274.951 116.336 l +274.964 116.741 l +274.925 117.145 l +274.835 117.541 l +274.695 117.922 l +274.507 118.281 l +274.275 118.614 l +274.003 118.914 l +273.694 119.177 l +273.354 119.399 l +272.988 119.575 l +272.603 119.702 l +272.205 119.780 l +271.800 119.806 l +271.395 119.780 l +270.997 119.702 l +270.612 119.575 l +270.246 119.399 l +269.906 119.177 l +269.597 118.914 l +269.325 118.614 l +269.093 118.281 l +268.905 117.922 l +268.765 117.541 l +268.675 117.145 l +268.636 116.741 l +268.649 116.336 l +268.713 115.936 l +268.829 115.547 l +268.993 115.176 l +269.203 114.829 l +269.456 114.512 l +269.748 114.229 l +270.073 113.987 l +270.426 113.788 l +270.802 113.635 l +271.195 113.532 l +271.597 113.481 l +272.003 113.481 l +h +264.803 163.881 m +265.205 163.932 l +265.598 164.035 l +265.974 164.188 l +266.327 164.387 l +266.652 164.629 l +266.944 164.912 l +267.197 165.229 l +267.407 165.576 l +267.571 165.947 l +267.687 166.336 l +267.751 166.736 l +267.764 167.141 l +267.725 167.545 l +267.635 167.941 l +267.495 168.322 l +267.307 168.681 l +267.075 169.014 l +266.803 169.314 l +266.494 169.577 l +266.154 169.799 l +265.788 169.975 l +265.403 170.102 l +265.005 170.180 l +264.600 170.206 l +264.195 170.180 l +263.797 170.102 l +263.412 169.975 l +263.046 169.799 l +262.706 169.577 l +262.397 169.314 l +262.125 169.014 l +261.893 168.681 l +261.705 168.322 l +261.565 167.941 l +261.475 167.545 l +261.436 167.141 l +261.449 166.736 l +261.513 166.336 l +261.629 165.947 l +261.793 165.576 l +262.003 165.229 l +262.256 164.912 l +262.548 164.629 l +262.873 164.387 l +263.226 164.188 l +263.602 164.035 l +263.995 163.932 l +264.397 163.881 l +264.803 163.881 l +h +228.803 113.481 m +229.205 113.532 l +229.598 113.635 l +229.974 113.788 l +230.327 113.987 l +230.652 114.229 l +230.944 114.512 l +231.197 114.829 l +231.407 115.176 l +231.571 115.547 l +231.687 115.936 l +231.751 116.336 l +231.764 116.741 l +231.725 117.145 l +231.635 117.541 l +231.495 117.922 l +231.307 118.281 l +231.075 118.614 l +230.803 118.914 l +230.494 119.177 l +230.154 119.399 l +229.788 119.575 l +229.403 119.702 l +229.005 119.780 l +228.600 119.806 l +228.195 119.780 l +227.797 119.702 l +227.412 119.575 l +227.046 119.399 l +226.706 119.177 l +226.397 118.914 l +226.125 118.614 l +225.893 118.281 l +225.705 117.922 l +225.565 117.541 l +225.475 117.145 l +225.436 116.741 l +225.449 116.336 l +225.513 115.936 l +225.629 115.547 l +225.793 115.176 l +226.003 114.829 l +226.256 114.512 l +226.548 114.229 l +226.873 113.987 l +227.226 113.788 l +227.602 113.635 l +227.995 113.532 l +228.397 113.481 l +228.803 113.481 l +h +243.203 156.681 m +243.605 156.732 l +243.998 156.835 l +244.374 156.988 l +244.727 157.187 l +245.052 157.429 l +245.344 157.712 l +245.597 158.029 l +245.807 158.376 l +245.971 158.747 l +246.087 159.136 l +246.151 159.536 l +246.164 159.941 l +246.125 160.345 l +246.035 160.741 l +245.895 161.122 l +245.707 161.481 l +245.475 161.814 l +245.203 162.114 l +244.894 162.377 l +244.554 162.599 l +244.188 162.775 l +243.803 162.902 l +243.405 162.980 l +243.000 163.006 l +242.595 162.980 l +242.197 162.902 l +241.812 162.775 l +241.446 162.599 l +241.106 162.377 l +240.797 162.114 l +240.525 161.814 l +240.293 161.481 l +240.105 161.122 l +239.965 160.741 l +239.875 160.345 l +239.836 159.941 l +239.849 159.536 l +239.913 159.136 l +240.029 158.747 l +240.193 158.376 l +240.403 158.029 l +240.656 157.712 l +240.948 157.429 l +241.273 157.187 l +241.626 156.988 l +242.002 156.835 l +242.395 156.732 l +242.797 156.681 l +243.203 156.681 l +h +243.203 113.481 m +243.605 113.532 l +243.998 113.635 l +244.374 113.788 l +244.727 113.987 l +245.052 114.229 l +245.344 114.512 l +245.597 114.829 l +245.807 115.176 l +245.971 115.547 l +246.087 115.936 l +246.151 116.336 l +246.164 116.741 l +246.125 117.145 l +246.035 117.541 l +245.895 117.922 l +245.707 118.281 l +245.475 118.614 l +245.203 118.914 l +244.894 119.177 l +244.554 119.399 l +244.188 119.575 l +243.803 119.702 l +243.405 119.780 l +243.000 119.806 l +242.595 119.780 l +242.197 119.702 l +241.812 119.575 l +241.446 119.399 l +241.106 119.177 l +240.797 118.914 l +240.525 118.614 l +240.293 118.281 l +240.105 117.922 l +239.965 117.541 l +239.875 117.145 l +239.836 116.741 l +239.849 116.336 l +239.913 115.936 l +240.029 115.547 l +240.193 115.176 l +240.403 114.829 l +240.656 114.512 l +240.948 114.229 l +241.273 113.987 l +241.626 113.788 l +242.002 113.635 l +242.395 113.532 l +242.797 113.481 l +243.203 113.481 l +h +256.795 156.732 m +257.197 156.681 l +257.603 156.681 l +258.005 156.732 l +258.398 156.835 l +258.774 156.988 l +259.127 157.187 l +259.452 157.429 l +259.744 157.712 l +259.997 158.029 l +260.207 158.376 l +260.371 158.747 l +260.487 159.136 l +260.551 159.536 l +260.564 159.941 l +260.525 160.345 l +260.435 160.741 l +260.295 161.122 l +260.107 161.481 l +259.875 161.814 l +259.603 162.114 l +259.294 162.377 l +258.954 162.599 l +258.588 162.775 l +258.203 162.902 l +257.805 162.980 l +257.400 163.006 l +256.995 162.980 l +256.597 162.902 l +256.212 162.775 l +255.846 162.599 l +255.506 162.377 l +255.197 162.114 l +254.925 161.814 l +254.693 161.481 l +254.505 161.122 l +254.365 160.741 l +254.275 160.345 l +254.236 159.941 l +254.249 159.536 l +254.313 159.136 l +254.429 158.747 l +254.593 158.376 l +254.803 158.029 l +255.056 157.712 l +255.348 157.429 l +255.673 157.187 l +256.026 156.988 l +256.402 156.835 l +256.795 156.732 l +h +214.403 156.681 m +214.805 156.732 l +215.198 156.835 l +215.574 156.988 l +215.927 157.187 l +216.252 157.429 l +216.544 157.712 l +216.797 158.029 l +217.007 158.376 l +217.171 158.747 l +217.287 159.136 l +217.351 159.536 l +217.364 159.941 l +217.325 160.345 l +217.235 160.741 l +217.095 161.122 l +216.907 161.481 l +216.675 161.814 l +216.403 162.114 l +216.094 162.377 l +215.754 162.599 l +215.388 162.775 l +215.003 162.902 l +214.605 162.980 l +214.200 163.006 l +213.795 162.980 l +213.397 162.902 l +213.012 162.775 l +212.646 162.599 l +212.306 162.377 l +211.997 162.114 l +211.725 161.814 l +211.493 161.481 l +211.305 161.122 l +211.165 160.741 l +211.075 160.345 l +211.036 159.941 l +211.049 159.536 l +211.113 159.136 l +211.229 158.747 l +211.393 158.376 l +211.603 158.029 l +211.856 157.712 l +212.148 157.429 l +212.473 157.187 l +212.826 156.988 l +213.202 156.835 l +213.595 156.732 l +213.997 156.681 l +214.403 156.681 l +h +236.003 156.681 m +236.405 156.732 l +236.798 156.835 l +237.174 156.988 l +237.527 157.187 l +237.852 157.429 l +238.144 157.712 l +238.397 158.029 l +238.607 158.376 l +238.771 158.747 l +238.887 159.136 l +238.951 159.536 l +238.964 159.941 l +238.925 160.345 l +238.835 160.741 l +238.695 161.122 l +238.507 161.481 l +238.275 161.814 l +238.003 162.114 l +237.694 162.377 l +237.354 162.599 l +236.988 162.775 l +236.603 162.902 l +236.205 162.980 l +235.800 163.006 l +235.395 162.980 l +234.997 162.902 l +234.612 162.775 l +234.246 162.599 l +233.906 162.377 l +233.597 162.114 l +233.325 161.814 l +233.093 161.481 l +232.905 161.122 l +232.765 160.741 l +232.675 160.345 l +232.636 159.941 l +232.649 159.536 l +232.713 159.136 l +232.829 158.747 l +232.993 158.376 l +233.203 158.029 l +233.456 157.712 l +233.748 157.429 l +234.073 157.187 l +234.426 156.988 l +234.802 156.835 l +235.195 156.732 l +235.597 156.681 l +236.003 156.681 l +h +104.121 113.035 m +104.526 113.061 l +104.924 113.138 l +105.309 113.266 l +105.674 113.442 l +106.014 113.663 l +106.323 113.926 l +106.596 114.227 l +106.828 114.559 l +107.016 114.919 l +107.156 115.300 l +107.246 115.695 l +107.285 116.099 l +107.272 116.505 l +107.207 116.905 l +107.092 117.294 l +106.928 117.665 l +106.717 118.012 l +106.464 118.329 l +106.173 118.611 l +105.848 118.854 l +105.494 119.053 l +105.118 119.205 l +104.726 119.308 l +104.324 119.360 l +103.918 119.360 l +103.516 119.308 l +103.123 119.205 l +102.747 119.053 l +102.394 118.854 l +102.069 118.611 l +101.777 118.329 l +101.524 118.012 l +101.314 117.665 l +101.150 117.294 l +101.034 116.905 l +100.969 116.505 l +100.956 116.099 l +100.995 115.695 l +101.086 115.300 l +101.226 114.919 l +101.413 114.559 l +101.646 114.227 l +101.918 113.926 l +102.227 113.663 l +102.567 113.442 l +102.933 113.266 l +103.318 113.138 l +103.716 113.061 l +104.121 113.035 l +h +272.003 163.881 m +272.405 163.932 l +272.798 164.035 l +273.174 164.188 l +273.527 164.387 l +273.852 164.629 l +274.144 164.912 l +274.397 165.229 l +274.607 165.576 l +274.771 165.947 l +274.887 166.336 l +274.951 166.736 l +274.964 167.141 l +274.925 167.545 l +274.835 167.941 l +274.695 168.322 l +274.507 168.681 l +274.275 169.014 l +274.003 169.314 l +273.694 169.577 l +273.354 169.799 l +272.988 169.975 l +272.603 170.102 l +272.205 170.180 l +271.800 170.206 l +271.395 170.180 l +270.997 170.102 l +270.612 169.975 l +270.246 169.799 l +269.906 169.577 l +269.597 169.314 l +269.325 169.014 l +269.093 168.681 l +268.905 168.322 l +268.765 167.941 l +268.675 167.545 l +268.636 167.141 l +268.649 166.736 l +268.713 166.336 l +268.829 165.947 l +268.993 165.576 l +269.203 165.229 l +269.456 164.912 l +269.748 164.629 l +270.073 164.387 l +270.426 164.188 l +270.802 164.035 l +271.195 163.932 l +271.597 163.881 l +272.003 163.881 l +h +118.881 113.035 m +119.286 113.061 l +119.684 113.138 l +120.069 113.266 l +120.434 113.442 l +120.774 113.663 l +121.083 113.926 l +121.356 114.227 l +121.588 114.559 l +121.776 114.919 l +121.916 115.300 l +122.006 115.695 l +122.045 116.099 l +122.032 116.505 l +121.967 116.905 l +121.852 117.294 l +121.688 117.665 l +121.477 118.012 l +121.224 118.329 l +120.933 118.611 l +120.608 118.854 l +120.254 119.053 l +119.878 119.205 l +119.486 119.308 l +119.084 119.360 l +118.678 119.360 l +118.276 119.308 l +117.883 119.205 l +117.507 119.053 l +117.154 118.854 l +116.829 118.611 l +116.537 118.329 l +116.284 118.012 l +116.074 117.665 l +115.910 117.294 l +115.794 116.905 l +115.729 116.505 l +115.716 116.099 l +115.755 115.695 l +115.846 115.300 l +115.986 114.919 l +116.173 114.559 l +116.406 114.227 l +116.678 113.926 l +116.987 113.663 l +117.327 113.442 l +117.693 113.266 l +118.078 113.138 l +118.476 113.061 l +118.881 113.035 l +h +227.995 156.732 m +228.397 156.681 l +228.803 156.681 l +229.205 156.732 l +229.598 156.835 l +229.974 156.988 l +230.327 157.187 l +230.652 157.429 l +230.944 157.712 l +231.197 158.029 l +231.407 158.376 l +231.571 158.747 l +231.687 159.136 l +231.751 159.536 l +231.764 159.941 l +231.725 160.345 l +231.635 160.741 l +231.495 161.122 l +231.307 161.481 l +231.075 161.814 l +230.803 162.114 l +230.494 162.377 l +230.154 162.599 l +229.788 162.775 l +229.403 162.902 l +229.005 162.980 l +228.600 163.006 l +228.195 162.980 l +227.797 162.902 l +227.412 162.775 l +227.046 162.599 l +226.706 162.377 l +226.397 162.114 l +226.125 161.814 l +225.893 161.481 l +225.705 161.122 l +225.565 160.741 l +225.475 160.345 l +225.436 159.941 l +225.449 159.536 l +225.513 159.136 l +225.629 158.747 l +225.793 158.376 l +226.003 158.029 l +226.256 157.712 l +226.548 157.429 l +226.873 157.187 l +227.226 156.988 l +227.602 156.835 l +227.995 156.732 l +h +235.195 163.932 m +235.597 163.881 l +236.003 163.881 l +236.405 163.932 l +236.798 164.035 l +237.174 164.188 l +237.527 164.387 l +237.852 164.629 l +238.144 164.912 l +238.397 165.229 l +238.607 165.576 l +238.771 165.947 l +238.887 166.336 l +238.951 166.736 l +238.964 167.141 l +238.925 167.545 l +238.835 167.941 l +238.695 168.322 l +238.507 168.681 l +238.275 169.014 l +238.003 169.314 l +237.694 169.577 l +237.354 169.799 l +236.988 169.975 l +236.603 170.102 l +236.205 170.180 l +235.800 170.206 l +235.395 170.180 l +234.997 170.102 l +234.612 169.975 l +234.246 169.799 l +233.906 169.577 l +233.597 169.314 l +233.325 169.014 l +233.093 168.681 l +232.905 168.322 l +232.765 167.941 l +232.675 167.545 l +232.636 167.141 l +232.649 166.736 l +232.713 166.336 l +232.829 165.947 l +232.993 165.576 l +233.203 165.229 l +233.456 164.912 l +233.748 164.629 l +234.073 164.387 l +234.426 164.188 l +234.802 164.035 l +235.195 163.932 l +h +249.595 156.732 m +249.997 156.681 l +250.403 156.681 l +250.805 156.732 l +251.198 156.835 l +251.574 156.988 l +251.927 157.187 l +252.252 157.429 l +252.544 157.712 l +252.797 158.029 l +253.007 158.376 l +253.171 158.747 l +253.287 159.136 l +253.351 159.536 l +253.364 159.941 l +253.325 160.345 l +253.235 160.741 l +253.095 161.122 l +252.907 161.481 l +252.675 161.814 l +252.403 162.114 l +252.094 162.377 l +251.754 162.599 l +251.388 162.775 l +251.003 162.902 l +250.605 162.980 l +250.200 163.006 l +249.795 162.980 l +249.397 162.902 l +249.012 162.775 l +248.646 162.599 l +248.306 162.377 l +247.997 162.114 l +247.725 161.814 l +247.493 161.481 l +247.305 161.122 l +247.165 160.741 l +247.075 160.345 l +247.036 159.941 l +247.049 159.536 l +247.113 159.136 l +247.229 158.747 l +247.393 158.376 l +247.603 158.029 l +247.856 157.712 l +248.148 157.429 l +248.473 157.187 l +248.826 156.988 l +249.202 156.835 l +249.595 156.732 l +h +242.395 163.932 m +242.797 163.881 l +243.203 163.881 l +243.605 163.932 l +243.998 164.035 l +244.374 164.188 l +244.727 164.387 l +245.052 164.629 l +245.344 164.912 l +245.597 165.229 l +245.807 165.576 l +245.971 165.947 l +246.087 166.336 l +246.151 166.736 l +246.164 167.141 l +246.125 167.545 l +246.035 167.941 l +245.895 168.322 l +245.707 168.681 l +245.475 169.014 l +245.203 169.314 l +244.894 169.577 l +244.554 169.799 l +244.188 169.975 l +243.803 170.102 l +243.405 170.180 l +243.000 170.206 l +242.595 170.180 l +242.197 170.102 l +241.812 169.975 l +241.446 169.799 l +241.106 169.577 l +240.797 169.314 l +240.525 169.014 l +240.293 168.681 l +240.105 168.322 l +239.965 167.941 l +239.875 167.545 l +239.836 167.141 l +239.849 166.736 l +239.913 166.336 l +240.029 165.947 l +240.193 165.576 l +240.403 165.229 l +240.656 164.912 l +240.948 164.629 l +241.273 164.387 l +241.626 164.188 l +242.002 164.035 l +242.395 163.932 l +h +236.003 113.481 m +236.405 113.532 l +236.798 113.635 l +237.174 113.788 l +237.527 113.987 l +237.852 114.229 l +238.144 114.512 l +238.397 114.829 l +238.607 115.176 l +238.771 115.547 l +238.887 115.936 l +238.951 116.336 l +238.964 116.741 l +238.925 117.145 l +238.835 117.541 l +238.695 117.922 l +238.507 118.281 l +238.275 118.614 l +238.003 118.914 l +237.694 119.177 l +237.354 119.399 l +236.988 119.575 l +236.603 119.702 l +236.205 119.780 l +235.800 119.806 l +235.395 119.780 l +234.997 119.702 l +234.612 119.575 l +234.246 119.399 l +233.906 119.177 l +233.597 118.914 l +233.325 118.614 l +233.093 118.281 l +232.905 117.922 l +232.765 117.541 l +232.675 117.145 l +232.636 116.741 l +232.649 116.336 l +232.713 115.936 l +232.829 115.547 l +232.993 115.176 l +233.203 114.829 l +233.456 114.512 l +233.748 114.229 l +234.073 113.987 l +234.426 113.788 l +234.802 113.635 l +235.195 113.532 l +235.597 113.481 l +236.003 113.481 l +h +220.795 156.732 m +221.197 156.681 l +221.603 156.681 l +222.005 156.732 l +222.398 156.835 l +222.774 156.988 l +223.127 157.187 l +223.452 157.429 l +223.744 157.712 l +223.997 158.029 l +224.207 158.376 l +224.371 158.747 l +224.487 159.136 l +224.551 159.536 l +224.564 159.941 l +224.525 160.345 l +224.435 160.741 l +224.295 161.122 l +224.107 161.481 l +223.875 161.814 l +223.603 162.114 l +223.294 162.377 l +222.954 162.599 l +222.588 162.775 l +222.203 162.902 l +221.805 162.980 l +221.400 163.006 l +220.995 162.980 l +220.597 162.902 l +220.212 162.775 l +219.846 162.599 l +219.506 162.377 l +219.197 162.114 l +218.925 161.814 l +218.693 161.481 l +218.505 161.122 l +218.365 160.741 l +218.275 160.345 l +218.236 159.941 l +218.249 159.536 l +218.313 159.136 l +218.429 158.747 l +218.593 158.376 l +218.803 158.029 l +219.056 157.712 l +219.348 157.429 l +219.673 157.187 l +220.026 156.988 l +220.402 156.835 l +220.795 156.732 l +h +90.031 96.595 m +90.434 96.634 l +90.830 96.725 l +91.211 96.865 l +91.570 97.052 l +91.903 97.284 l +92.203 97.557 l +92.466 97.866 l +92.688 98.206 l +92.864 98.572 l +92.992 98.957 l +93.069 99.355 l +93.095 99.760 l +93.069 100.165 l +92.992 100.563 l +92.864 100.948 l +92.688 101.313 l +92.466 101.653 l +92.203 101.962 l +91.903 102.235 l +91.570 102.467 l +91.211 102.655 l +90.830 102.795 l +90.434 102.885 l +90.031 102.924 l +89.625 102.911 l +89.225 102.846 l +88.836 102.731 l +88.465 102.567 l +88.118 102.356 l +87.801 102.103 l +87.518 101.812 l +87.276 101.487 l +87.077 101.133 l +86.924 100.757 l +86.822 100.365 l +86.770 99.963 l +86.770 99.557 l +86.822 99.154 l +86.924 98.762 l +87.077 98.386 l +87.276 98.033 l +87.518 97.707 l +87.801 97.416 l +88.118 97.163 l +88.465 96.953 l +88.836 96.789 l +89.225 96.673 l +89.625 96.608 l +90.031 96.595 l +h +126.031 96.595 m +126.434 96.634 l +126.830 96.725 l +127.211 96.865 l +127.570 97.052 l +127.903 97.284 l +128.203 97.557 l +128.466 97.866 l +128.688 98.206 l +128.864 98.572 l +128.992 98.957 l +129.069 99.355 l +129.095 99.760 l +129.069 100.165 l +128.992 100.563 l +128.864 100.948 l +128.688 101.313 l +128.466 101.653 l +128.203 101.962 l +127.903 102.235 l +127.570 102.467 l +127.211 102.655 l +126.830 102.795 l +126.434 102.885 l +126.031 102.924 l +125.625 102.911 l +125.225 102.846 l +124.836 102.731 l +124.465 102.567 l +124.118 102.356 l +123.801 102.103 l +123.518 101.812 l +123.276 101.487 l +123.077 101.133 l +122.924 100.757 l +122.822 100.365 l +122.770 99.963 l +122.770 99.557 l +122.822 99.154 l +122.924 98.762 l +123.077 98.386 l +123.276 98.033 l +123.518 97.707 l +123.801 97.416 l +124.118 97.163 l +124.465 96.953 l +124.836 96.789 l +125.225 96.673 l +125.625 96.608 l +126.031 96.595 l +h +118.831 96.595 m +119.234 96.634 l +119.630 96.725 l +120.011 96.865 l +120.370 97.052 l +120.703 97.284 l +121.003 97.557 l +121.266 97.866 l +121.488 98.206 l +121.664 98.572 l +121.792 98.957 l +121.869 99.355 l +121.895 99.760 l +121.869 100.165 l +121.792 100.563 l +121.664 100.948 l +121.488 101.313 l +121.266 101.653 l +121.003 101.962 l +120.703 102.235 l +120.370 102.467 l +120.011 102.655 l +119.630 102.795 l +119.234 102.885 l +118.831 102.924 l +118.425 102.911 l +118.025 102.846 l +117.636 102.731 l +117.265 102.567 l +116.918 102.356 l +116.601 102.103 l +116.318 101.812 l +116.076 101.487 l +115.877 101.133 l +115.724 100.757 l +115.622 100.365 l +115.570 99.963 l +115.570 99.557 l +115.622 99.154 l +115.724 98.762 l +115.877 98.386 l +116.076 98.033 l +116.318 97.707 l +116.601 97.416 l +116.918 97.163 l +117.265 96.953 l +117.636 96.789 l +118.025 96.673 l +118.425 96.608 l +118.831 96.595 l +h +97.591 24.595 m +97.994 24.634 l +98.390 24.725 l +98.771 24.865 l +99.130 25.052 l +99.463 25.284 l +99.763 25.557 l +100.026 25.866 l +100.248 26.206 l +100.424 26.572 l +100.552 26.957 l +100.629 27.355 l +100.655 27.760 l +100.629 28.165 l +100.552 28.563 l +100.424 28.948 l +100.248 29.313 l +100.026 29.653 l +99.763 29.962 l +99.463 30.235 l +99.130 30.467 l +98.771 30.655 l +98.390 30.795 l +97.994 30.885 l +97.591 30.924 l +97.185 30.911 l +96.785 30.846 l +96.396 30.731 l +96.025 30.567 l +95.678 30.356 l +95.361 30.103 l +95.078 29.812 l +94.836 29.487 l +94.637 29.133 l +94.484 28.757 l +94.382 28.365 l +94.330 27.963 l +94.330 27.557 l +94.382 27.154 l +94.484 26.762 l +94.637 26.386 l +94.836 26.033 l +95.078 25.707 l +95.361 25.416 l +95.678 25.163 l +96.025 24.953 l +96.396 24.789 l +96.785 24.673 l +97.185 24.608 l +97.591 24.595 l +h +132.825 96.608 m +133.231 96.595 l +133.634 96.634 l +134.030 96.725 l +134.411 96.865 l +134.770 97.052 l +135.103 97.284 l +135.403 97.557 l +135.666 97.866 l +135.888 98.206 l +136.064 98.572 l +136.192 98.957 l +136.269 99.355 l +136.295 99.760 l +136.269 100.165 l +136.192 100.563 l +136.064 100.948 l +135.888 101.313 l +135.666 101.653 l +135.403 101.962 l +135.103 102.235 l +134.770 102.467 l +134.411 102.655 l +134.030 102.795 l +133.634 102.885 l +133.231 102.924 l +132.825 102.911 l +132.425 102.846 l +132.036 102.731 l +131.665 102.567 l +131.318 102.356 l +131.001 102.103 l +130.718 101.812 l +130.476 101.487 l +130.277 101.133 l +130.124 100.757 l +130.022 100.365 l +129.970 99.963 l +129.970 99.557 l +130.022 99.154 l +130.124 98.762 l +130.277 98.386 l +130.476 98.033 l +130.718 97.707 l +131.001 97.416 l +131.318 97.163 l +131.665 96.953 l +132.036 96.789 l +132.425 96.673 l +132.825 96.608 l +h +89.985 24.608 m +90.391 24.595 l +90.794 24.634 l +91.190 24.725 l +91.571 24.865 l +91.930 25.052 l +92.263 25.284 l +92.563 25.557 l +92.826 25.866 l +93.048 26.206 l +93.224 26.572 l +93.352 26.957 l +93.429 27.355 l +93.455 27.760 l +93.429 28.165 l +93.352 28.563 l +93.224 28.948 l +93.048 29.313 l +92.826 29.653 l +92.563 29.962 l +92.263 30.235 l +91.930 30.467 l +91.571 30.655 l +91.190 30.795 l +90.794 30.885 l +90.391 30.924 l +89.985 30.911 l +89.585 30.846 l +89.196 30.731 l +88.825 30.567 l +88.478 30.356 l +88.161 30.103 l +87.878 29.812 l +87.636 29.487 l +87.437 29.133 l +87.284 28.757 l +87.182 28.365 l +87.130 27.963 l +87.130 27.557 l +87.182 27.154 l +87.284 26.762 l +87.437 26.386 l +87.636 26.033 l +87.878 25.707 l +88.161 25.416 l +88.478 25.163 l +88.825 24.953 l +89.196 24.789 l +89.585 24.673 l +89.985 24.608 l +h +104.791 24.595 m +105.194 24.634 l +105.590 24.725 l +105.971 24.865 l +106.330 25.052 l +106.663 25.284 l +106.963 25.557 l +107.226 25.866 l +107.448 26.206 l +107.624 26.572 l +107.752 26.957 l +107.829 27.355 l +107.855 27.760 l +107.829 28.165 l +107.752 28.563 l +107.624 28.948 l +107.448 29.313 l +107.226 29.653 l +106.963 29.962 l +106.663 30.235 l +106.330 30.467 l +105.971 30.655 l +105.590 30.795 l +105.194 30.885 l +104.791 30.924 l +104.385 30.911 l +103.985 30.846 l +103.596 30.731 l +103.225 30.567 l +102.878 30.356 l +102.561 30.103 l +102.278 29.812 l +102.036 29.487 l +101.837 29.133 l +101.684 28.757 l +101.582 28.365 l +101.530 27.963 l +101.530 27.557 l +101.582 27.154 l +101.684 26.762 l +101.837 26.386 l +102.036 26.033 l +102.278 25.707 l +102.561 25.416 l +102.878 25.163 l +103.225 24.953 l +103.596 24.789 l +103.985 24.673 l +104.385 24.608 l +104.791 24.595 l +h +82.881 113.035 m +83.286 113.061 l +83.684 113.138 l +84.069 113.266 l +84.434 113.442 l +84.774 113.663 l +85.083 113.926 l +85.356 114.227 l +85.588 114.559 l +85.776 114.919 l +85.916 115.300 l +86.006 115.695 l +86.045 116.099 l +86.032 116.505 l +85.967 116.905 l +85.852 117.294 l +85.688 117.665 l +85.477 118.012 l +85.224 118.329 l +84.933 118.611 l +84.608 118.854 l +84.254 119.053 l +83.878 119.205 l +83.486 119.308 l +83.084 119.360 l +82.678 119.360 l +82.276 119.308 l +81.883 119.205 l +81.507 119.053 l +81.154 118.854 l +80.829 118.611 l +80.537 118.329 l +80.284 118.012 l +80.074 117.665 l +79.910 117.294 l +79.794 116.905 l +79.729 116.505 l +79.716 116.099 l +79.755 115.695 l +79.846 115.300 l +79.986 114.919 l +80.173 114.559 l +80.406 114.227 l +80.678 113.926 l +80.987 113.663 l +81.327 113.442 l +81.693 113.266 l +82.078 113.138 l +82.476 113.061 l +82.881 113.035 l +h +46.785 24.608 m +47.191 24.595 l +47.594 24.634 l +47.990 24.725 l +48.371 24.865 l +48.730 25.052 l +49.063 25.284 l +49.363 25.557 l +49.626 25.866 l +49.848 26.206 l +50.024 26.572 l +50.152 26.957 l +50.229 27.355 l +50.255 27.760 l +50.229 28.165 l +50.152 28.563 l +50.024 28.948 l +49.848 29.313 l +49.626 29.653 l +49.363 29.962 l +49.063 30.235 l +48.730 30.467 l +48.371 30.655 l +47.990 30.795 l +47.594 30.885 l +47.191 30.924 l +46.785 30.911 l +46.385 30.846 l +45.996 30.731 l +45.625 30.567 l +45.278 30.356 l +44.961 30.103 l +44.678 29.812 l +44.436 29.487 l +44.237 29.133 l +44.084 28.757 l +43.982 28.365 l +43.930 27.963 l +43.930 27.557 l +43.982 27.154 l +44.084 26.762 l +44.237 26.386 l +44.436 26.033 l +44.678 25.707 l +44.961 25.416 l +45.278 25.163 l +45.625 24.953 l +45.996 24.789 l +46.385 24.673 l +46.785 24.608 l +h +83.191 24.595 m +83.594 24.634 l +83.990 24.725 l +84.371 24.865 l +84.730 25.052 l +85.063 25.284 l +85.363 25.557 l +85.626 25.866 l +85.848 26.206 l +86.024 26.572 l +86.152 26.957 l +86.229 27.355 l +86.255 27.760 l +86.229 28.165 l +86.152 28.563 l +86.024 28.948 l +85.848 29.313 l +85.626 29.653 l +85.363 29.962 l +85.063 30.235 l +84.730 30.467 l +84.371 30.655 l +83.990 30.795 l +83.594 30.885 l +83.191 30.924 l +82.785 30.911 l +82.385 30.846 l +81.996 30.731 l +81.625 30.567 l +81.278 30.356 l +80.961 30.103 l +80.678 29.812 l +80.436 29.487 l +80.237 29.133 l +80.084 28.757 l +79.982 28.365 l +79.930 27.963 l +79.930 27.557 l +79.982 27.154 l +80.084 26.762 l +80.237 26.386 l +80.436 26.033 l +80.678 25.707 l +80.961 25.416 l +81.278 25.163 l +81.625 24.953 l +81.996 24.789 l +82.385 24.673 l +82.785 24.608 l +83.191 24.595 l +h +54.391 24.595 m +54.794 24.634 l +55.190 24.725 l +55.571 24.865 l +55.930 25.052 l +56.263 25.284 l +56.563 25.557 l +56.826 25.866 l +57.048 26.206 l +57.224 26.572 l +57.352 26.957 l +57.429 27.355 l +57.455 27.760 l +57.429 28.165 l +57.352 28.563 l +57.224 28.948 l +57.048 29.313 l +56.826 29.653 l +56.563 29.962 l +56.263 30.235 l +55.930 30.467 l +55.571 30.655 l +55.190 30.795 l +54.794 30.885 l +54.391 30.924 l +53.985 30.911 l +53.585 30.846 l +53.196 30.731 l +52.825 30.567 l +52.478 30.356 l +52.161 30.103 l +51.878 29.812 l +51.636 29.487 l +51.437 29.133 l +51.284 28.757 l +51.182 28.365 l +51.130 27.963 l +51.130 27.557 l +51.182 27.154 l +51.284 26.762 l +51.437 26.386 l +51.636 26.033 l +51.878 25.707 l +52.161 25.416 l +52.478 25.163 l +52.825 24.953 l +53.196 24.789 l +53.585 24.673 l +53.985 24.608 l +54.391 24.595 l +h +60.884 24.652 m +61.286 24.600 l +61.692 24.600 l +62.094 24.652 l +62.487 24.755 l +62.863 24.907 l +63.216 25.106 l +63.541 25.349 l +63.833 25.631 l +64.086 25.948 l +64.296 26.295 l +64.460 26.666 l +64.576 27.055 l +64.640 27.456 l +64.653 27.861 l +64.615 28.265 l +64.524 28.660 l +64.384 29.041 l +64.197 29.401 l +63.964 29.734 l +63.692 30.034 l +63.383 30.297 l +63.043 30.518 l +62.677 30.694 l +62.292 30.822 l +61.894 30.900 l +61.489 30.926 l +61.084 30.900 l +60.686 30.822 l +60.301 30.694 l +59.936 30.518 l +59.596 30.297 l +59.287 30.034 l +59.014 29.734 l +58.782 29.401 l +58.594 29.041 l +58.454 28.660 l +58.364 28.265 l +58.325 27.861 l +58.338 27.456 l +58.403 27.055 l +58.518 26.666 l +58.682 26.295 l +58.893 25.948 l +59.145 25.631 l +59.437 25.349 l +59.762 25.106 l +60.115 24.907 l +60.492 24.755 l +60.884 24.652 l +h +75.681 113.035 m +76.086 113.061 l +76.484 113.138 l +76.869 113.266 l +77.234 113.442 l +77.574 113.663 l +77.883 113.926 l +78.156 114.227 l +78.388 114.559 l +78.576 114.919 l +78.716 115.300 l +78.806 115.695 l +78.845 116.099 l +78.832 116.505 l +78.767 116.905 l +78.652 117.294 l +78.488 117.665 l +78.277 118.012 l +78.024 118.329 l +77.733 118.611 l +77.408 118.854 l +77.054 119.053 l +76.678 119.205 l +76.286 119.308 l +75.884 119.360 l +75.478 119.360 l +75.076 119.308 l +74.683 119.205 l +74.307 119.053 l +73.954 118.854 l +73.629 118.611 l +73.337 118.329 l +73.084 118.012 l +72.874 117.665 l +72.710 117.294 l +72.594 116.905 l +72.529 116.505 l +72.516 116.099 l +72.555 115.695 l +72.646 115.300 l +72.786 114.919 l +72.973 114.559 l +73.206 114.227 l +73.478 113.926 l +73.787 113.663 l +74.127 113.442 l +74.493 113.266 l +74.878 113.138 l +75.276 113.061 l +75.681 113.035 l +h +75.991 24.595 m +76.394 24.634 l +76.790 24.725 l +77.171 24.865 l +77.530 25.052 l +77.863 25.284 l +78.163 25.557 l +78.426 25.866 l +78.648 26.206 l +78.824 26.572 l +78.952 26.957 l +79.029 27.355 l +79.055 27.760 l +79.029 28.165 l +78.952 28.563 l +78.824 28.948 l +78.648 29.313 l +78.426 29.653 l +78.163 29.962 l +77.863 30.235 l +77.530 30.467 l +77.171 30.655 l +76.790 30.795 l +76.394 30.885 l +75.991 30.924 l +75.585 30.911 l +75.185 30.846 l +74.796 30.731 l +74.425 30.567 l +74.078 30.356 l +73.761 30.103 l +73.478 29.812 l +73.236 29.487 l +73.037 29.133 l +72.884 28.757 l +72.782 28.365 l +72.730 27.963 l +72.730 27.557 l +72.782 27.154 l +72.884 26.762 l +73.037 26.386 l +73.236 26.033 l +73.478 25.707 l +73.761 25.416 l +74.078 25.163 l +74.425 24.953 l +74.796 24.789 l +75.185 24.673 l +75.585 24.608 l +75.991 24.595 l +h +210.645 192.110 m +211.011 192.060 l +211.380 192.060 l +211.746 192.110 l +212.102 192.210 l +212.441 192.357 l +212.756 192.549 l +213.043 192.782 l +213.295 193.052 l +213.508 193.354 l +213.678 193.682 l +213.802 194.030 l +213.877 194.391 l +213.902 194.760 l +213.877 195.129 l +213.802 195.490 l +213.678 195.838 l +213.508 196.166 l +213.295 196.468 l +213.043 196.738 l +212.756 196.971 l +212.441 197.163 l +212.102 197.310 l +211.746 197.410 l +211.380 197.460 l +211.011 197.460 l +210.645 197.410 l +210.289 197.310 l +209.950 197.163 l +209.634 196.971 l +209.348 196.738 l +209.096 196.468 l +208.883 196.166 l +208.713 195.838 l +208.589 195.490 l +208.514 195.129 l +208.489 194.760 l +208.514 194.391 l +208.589 194.030 l +208.713 193.682 l +208.883 193.354 l +209.096 193.052 l +209.348 192.782 l +209.634 192.549 l +209.950 192.357 l +210.289 192.210 l +210.645 192.110 l +h +272.160 172.489 m +272.529 172.514 l +272.890 172.589 l +273.238 172.713 l +273.566 172.883 l +273.868 173.096 l +274.138 173.348 l +274.371 173.634 l +274.563 173.950 l +274.710 174.289 l +274.810 174.645 l +274.860 175.011 l +274.860 175.380 l +274.810 175.746 l +274.710 176.102 l +274.563 176.441 l +274.371 176.756 l +274.138 177.043 l +273.868 177.295 l +273.566 177.508 l +273.238 177.678 l +272.890 177.802 l +272.529 177.877 l +272.160 177.902 l +271.791 177.877 l +271.430 177.802 l +271.082 177.678 l +270.754 177.508 l +270.452 177.295 l +270.182 177.043 l +269.949 176.756 l +269.757 176.441 l +269.610 176.102 l +269.510 175.746 l +269.460 175.380 l +269.460 175.011 l +269.510 174.645 l +269.610 174.289 l +269.757 173.950 l +269.949 173.634 l +270.182 173.348 l +270.452 173.096 l +270.754 172.883 l +271.082 172.713 l +271.430 172.589 l +271.791 172.514 l +272.160 172.489 l +h +272.160 192.898 m +272.529 192.923 l +272.890 192.998 l +273.238 193.122 l +273.566 193.292 l +273.868 193.505 l +274.138 193.757 l +274.371 194.044 l +274.563 194.359 l +274.710 194.698 l +274.810 195.054 l +274.860 195.420 l +274.860 195.789 l +274.810 196.155 l +274.710 196.511 l +274.563 196.850 l +274.371 197.166 l +274.138 197.452 l +273.868 197.704 l +273.566 197.917 l +273.238 198.087 l +272.890 198.211 l +272.529 198.286 l +272.160 198.311 l +271.791 198.286 l +271.430 198.211 l +271.082 198.087 l +270.754 197.917 l +270.452 197.704 l +270.182 197.452 l +269.949 197.166 l +269.757 196.850 l +269.610 196.511 l +269.510 196.155 l +269.460 195.789 l +269.460 195.420 l +269.510 195.054 l +269.610 194.698 l +269.757 194.359 l +269.949 194.044 l +270.182 193.757 l +270.452 193.505 l +270.754 193.292 l +271.082 193.122 l +271.430 192.998 l +271.791 192.923 l +272.160 192.898 l +h +191.071 190.502 m +191.071 191.017 l +191.050 191.227 l +190.993 191.415 l +190.937 191.552 l +190.937 191.646 l +190.993 191.783 l +191.050 191.971 l +191.071 192.182 l +191.071 192.696 l +188.508 192.696 l +188.508 190.502 l +191.071 190.502 l +h +184.676 190.502 m +184.676 192.696 l +182.113 192.696 l +182.113 192.182 l +182.134 191.971 l +182.191 191.783 l +182.247 191.646 l +182.247 191.552 l +182.191 191.415 l +182.134 191.227 l +182.113 191.017 l +182.113 190.502 l +184.676 190.502 l +h +183.519 155.958 m +183.519 153.395 l +184.034 153.395 l +184.244 153.416 l +184.432 153.473 l +184.606 153.566 l +184.759 153.691 l +184.884 153.843 l +184.976 154.017 l +185.034 154.206 l +185.054 154.416 l +185.054 155.958 l +183.519 155.958 l +h +148.948 163.382 m +148.948 164.917 l +146.385 164.917 l +146.385 164.403 l +146.406 164.192 l +146.463 164.004 l +146.556 163.830 l +146.681 163.678 l +146.833 163.553 l +147.007 163.460 l +147.195 163.403 l +147.406 163.382 l +148.948 163.382 l +h +152.780 164.917 m +152.780 163.382 l +154.322 163.382 l +154.533 163.403 l +154.721 163.460 l +154.895 163.553 l +155.047 163.678 l +155.172 163.830 l +155.265 164.004 l +155.322 164.192 l +155.343 164.403 l +155.343 164.917 l +152.780 164.917 l +h +295.798 194.494 m +295.798 193.554 l +297.262 193.554 l +297.262 195.514 l +296.819 195.514 l +296.608 195.494 l +296.420 195.436 l +296.246 195.343 l +296.094 195.218 l +295.969 195.066 l +295.876 194.892 l +295.819 194.704 l +295.798 194.494 l +h +296.608 188.986 m +296.819 188.966 l +297.262 188.966 l +297.262 190.926 l +295.798 190.926 l +295.798 189.986 l +295.819 189.776 l +295.876 189.588 l +295.969 189.414 l +296.094 189.262 l +296.246 189.137 l +296.420 189.044 l +296.608 188.986 l +h +98.424 167.411 m +98.687 167.287 l +98.687 168.966 l +97.007 168.966 l +97.039 168.886 l +97.237 168.526 l +97.478 168.193 l +97.760 167.894 l +98.077 167.632 l +98.424 167.411 l +h +101.315 168.966 m +101.315 167.287 l +101.578 167.411 l +101.925 167.632 l +102.242 167.894 l +102.523 168.193 l +102.765 168.526 l +102.963 168.886 l +102.995 168.966 l +101.315 168.966 l +h +263.340 117.900 m +263.340 119.540 l +263.046 119.399 l +262.706 119.177 l +262.397 118.914 l +262.125 118.614 l +261.893 118.281 l +261.705 117.922 l +261.697 117.900 l +263.340 117.900 l +h +205.740 168.300 m +205.740 169.940 l +205.446 169.799 l +205.106 169.577 l +204.797 169.314 l +204.525 169.014 l +204.293 168.681 l +204.105 168.322 l +204.097 168.300 l +205.740 168.300 l +h +204.105 117.922 m +204.097 117.900 l +205.740 117.900 l +205.740 119.540 l +205.446 119.399 l +205.106 119.177 l +204.797 118.914 l +204.525 118.614 l +204.293 118.281 l +204.105 117.922 l +h +218.505 117.922 m +218.497 117.900 l +220.140 117.900 l +220.140 119.540 l +219.846 119.399 l +219.506 119.177 l +219.197 118.914 l +218.925 118.614 l +218.693 118.281 l +218.505 117.922 l +h +83.989 98.500 m +83.989 96.857 l +84.011 96.865 l +84.370 97.052 l +84.703 97.284 l +85.003 97.557 l +85.266 97.866 l +85.488 98.206 l +85.629 98.500 l +83.989 98.500 l +h +98.389 98.500 m +98.389 96.857 l +98.411 96.865 l +98.770 97.052 l +99.103 97.284 l +99.403 97.557 l +99.666 97.866 l +99.888 98.206 l +100.029 98.500 l +98.389 98.500 l +h +83.989 102.662 m +83.989 101.020 l +85.629 101.020 l +85.488 101.313 l +85.266 101.653 l +85.003 101.962 l +84.703 102.235 l +84.370 102.467 l +84.011 102.654 l +83.989 102.662 l +h +98.389 102.662 m +98.389 101.020 l +100.029 101.020 l +99.888 101.313 l +99.666 101.653 l +99.403 101.962 l +99.103 102.235 l +98.770 102.467 l +98.411 102.654 l +98.389 102.662 l +h +127.549 24.857 m +127.571 24.865 l +127.930 25.052 l +128.263 25.284 l +128.563 25.557 l +128.826 25.866 l +129.048 26.206 l +129.189 26.500 l +127.549 26.500 l +127.549 24.857 l +h +174.780 117.540 m +174.780 119.183 l +174.758 119.175 l +174.399 118.987 l +174.066 118.755 l +173.766 118.483 l +173.503 118.174 l +173.281 117.834 l +173.140 117.540 l +174.780 117.540 l +h +126.981 113.301 m +127.274 113.442 l +127.614 113.663 l +127.923 113.926 l +128.196 114.227 l +128.428 114.559 l +128.616 114.919 l +128.624 114.941 l +126.981 114.941 l +126.981 113.301 l +h +212.940 117.900 m +212.940 119.540 l +212.646 119.399 l +212.306 119.177 l +211.997 118.914 l +211.725 118.614 l +211.493 118.281 l +211.305 117.922 l +211.297 117.900 l +212.940 117.900 l +h +124.461 113.301 m +124.461 114.941 l +122.818 114.941 l +122.826 114.919 l +123.013 114.559 l +123.246 114.227 l +123.518 113.926 l +123.827 113.663 l +124.167 113.442 l +124.461 113.301 l +h +209.903 117.900 m +209.895 117.922 l +209.707 118.281 l +209.475 118.614 l +209.203 118.914 l +208.894 119.177 l +208.554 119.399 l +208.260 119.540 l +208.260 117.900 l +209.903 117.900 l +h +209.903 168.300 m +209.895 168.322 l +209.707 168.681 l +209.475 169.014 l +209.203 169.314 l +208.894 169.577 l +208.554 169.799 l +208.260 169.940 l +208.260 168.300 l +209.903 168.300 l +h +217.103 117.900 m +217.095 117.922 l +216.907 118.281 l +216.675 118.614 l +216.403 118.914 l +216.094 119.177 l +215.754 119.399 l +215.460 119.540 l +215.460 117.900 l +217.103 117.900 l +h +267.503 117.900 m +267.495 117.922 l +267.307 118.281 l +267.075 118.614 l +266.803 118.914 l +266.494 119.177 l +266.154 119.399 l +265.860 119.540 l +265.860 117.900 l +267.503 117.900 l +h +222.660 119.540 m +222.660 117.900 l +224.303 117.900 l +224.295 117.922 l +224.107 118.281 l +223.875 118.614 l +223.603 118.914 l +223.294 119.177 l +222.954 119.399 l +222.660 119.540 l +h +174.780 113.377 m +174.780 115.020 l +173.140 115.020 l +173.281 114.726 l +173.503 114.386 l +173.766 114.077 l +174.066 113.805 l +174.399 113.573 l +174.758 113.385 l +174.780 113.377 l +h +177.300 115.020 m +177.300 113.383 l +177.504 113.473 l +177.851 113.683 l +178.168 113.936 l +178.451 114.228 l +178.693 114.553 l +178.892 114.906 l +178.938 115.020 l +177.300 115.020 l +h +95.869 101.020 m +95.869 102.657 l +95.665 102.567 l +95.318 102.356 l +95.001 102.103 l +94.718 101.812 l +94.476 101.487 l +94.277 101.133 l +94.231 101.020 l +95.869 101.020 l +h +33.138 65.020 m +33.092 65.134 l +32.893 65.487 l +32.651 65.812 l +32.368 66.104 l +32.051 66.357 l +31.704 66.567 l +31.500 66.657 l +31.500 65.020 l +33.138 65.020 l +h +208.260 165.780 m +208.260 164.142 l +208.374 164.188 l +208.727 164.387 l +209.052 164.629 l +209.344 164.912 l +209.597 165.229 l +209.807 165.576 l +209.897 165.780 l +208.260 165.780 l +h +128.618 117.461 m +128.528 117.665 l +128.317 118.012 l +128.064 118.329 l +127.773 118.611 l +127.448 118.854 l +127.094 119.053 l +126.981 119.099 l +126.981 117.461 l +128.618 117.461 l +h +177.300 119.177 m +177.300 117.540 l +178.938 117.540 l +178.892 117.654 l +178.693 118.007 l +178.451 118.332 l +178.168 118.624 l +177.851 118.877 l +177.504 119.087 l +177.300 119.177 l +h +31.500 60.863 m +31.704 60.953 l +32.051 61.163 l +32.368 61.416 l +32.651 61.708 l +32.893 62.033 l +33.092 62.386 l +33.138 62.500 l +31.500 62.500 l +31.500 60.863 l +h +205.740 164.142 m +205.740 165.780 l +204.103 165.780 l +204.193 165.576 l +204.403 165.229 l +204.656 164.912 l +204.948 164.629 l +205.273 164.387 l +205.626 164.188 l +205.740 164.142 l +h +265.860 115.380 m +265.860 113.742 l +265.974 113.788 l +266.327 113.987 l +266.652 114.229 l +266.944 114.512 l +267.197 114.829 l +267.407 115.176 l +267.497 115.380 l +265.860 115.380 l +h +208.260 115.380 m +208.260 113.742 l +208.374 113.788 l +208.727 113.987 l +209.052 114.229 l +209.344 114.512 l +209.597 114.829 l +209.807 115.176 l +209.897 115.380 l +208.260 115.380 l +h +125.029 24.862 m +125.029 26.500 l +123.391 26.500 l +123.437 26.386 l +123.636 26.033 l +123.878 25.707 l +124.161 25.416 l +124.478 25.163 l +124.825 24.953 l +125.029 24.862 l +h +220.140 113.742 m +220.140 115.380 l +218.503 115.380 l +218.593 115.176 l +218.803 114.829 l +219.056 114.512 l +219.348 114.229 l +219.673 113.987 l +220.026 113.788 l +220.140 113.742 l +h +263.340 113.742 m +263.340 115.380 l +261.703 115.380 l +261.793 115.176 l +262.003 114.829 l +262.256 114.512 l +262.548 114.229 l +262.873 113.987 l +263.226 113.788 l +263.340 113.742 l +h +124.461 117.461 m +124.461 119.099 l +124.347 119.053 l +123.994 118.854 l +123.669 118.611 l +123.377 118.329 l +123.124 118.012 l +122.914 117.665 l +122.823 117.461 l +124.461 117.461 l +h +222.660 115.380 m +222.660 113.742 l +222.774 113.788 l +223.127 113.987 l +223.452 114.229 l +223.744 114.512 l +223.997 114.829 l +224.207 115.176 l +224.297 115.380 l +222.660 115.380 l +h +205.626 113.788 m +205.740 113.742 l +205.740 115.380 l +204.103 115.380 l +204.193 115.176 l +204.403 114.829 l +204.656 114.512 l +204.948 114.229 l +205.273 113.987 l +205.626 113.788 l +h +95.869 96.862 m +95.869 98.500 l +94.231 98.500 l +94.277 98.386 l +94.476 98.033 l +94.718 97.707 l +95.001 97.416 l +95.318 97.163 l +95.665 96.953 l +95.869 96.862 l +h +212.826 113.788 m +212.940 113.742 l +212.940 115.380 l +211.303 115.380 l +211.393 115.176 l +211.603 114.829 l +211.856 114.512 l +212.148 114.229 l +212.473 113.987 l +212.826 113.788 l +h +215.460 113.742 m +215.574 113.788 l +215.927 113.987 l +216.252 114.229 l +216.544 114.512 l +216.797 114.829 l +217.007 115.176 l +217.097 115.380 l +215.460 115.380 l +215.460 113.742 l +h +81.469 96.862 m +81.469 98.500 l +79.831 98.500 l +79.877 98.386 l +80.076 98.033 l +80.318 97.707 l +80.601 97.416 l +80.918 97.163 l +81.265 96.953 l +81.469 96.862 l +h +81.469 101.020 m +81.469 102.657 l +81.265 102.567 l +80.918 102.356 l +80.601 102.103 l +80.318 101.812 l +80.076 101.487 l +79.877 101.133 l +79.831 101.020 l +81.469 101.020 l +h +83.694 182.183 m +83.694 183.650 l +82.225 183.650 l +82.242 183.602 l +82.412 183.274 l +82.625 182.972 l +82.877 182.702 l +83.164 182.469 l +83.479 182.277 l +83.694 182.183 l +h +230.574 195.790 m +230.574 197.257 l +230.359 197.163 l +230.044 196.971 l +229.757 196.738 l +229.505 196.468 l +229.292 196.166 l +229.122 195.838 l +229.105 195.790 l +230.574 195.790 l +h +87.224 185.710 m +87.207 185.758 l +87.037 186.086 l +86.824 186.388 l +86.572 186.658 l +86.286 186.891 l +85.970 187.083 l +85.755 187.177 l +85.755 185.710 l +87.224 185.710 l +h +230.574 192.263 m +230.574 193.730 l +229.105 193.730 l +229.122 193.682 l +229.292 193.354 l +229.505 193.052 l +229.757 192.782 l +230.044 192.549 l +230.359 192.357 l +230.574 192.263 l +h +232.635 197.257 m +232.635 195.790 l +234.104 195.790 l +234.087 195.838 l +233.917 196.166 l +233.704 196.468 l +233.452 196.738 l +233.166 196.971 l +232.850 197.163 l +232.635 197.257 l +h +232.635 193.730 m +232.635 192.263 l +232.850 192.357 l +233.166 192.549 l +233.452 192.782 l +233.704 193.052 l +233.917 193.354 l +234.087 193.682 l +234.104 193.730 l +232.635 193.730 l +h +83.694 185.710 m +83.694 187.177 l +83.479 187.083 l +83.164 186.891 l +82.877 186.658 l +82.625 186.388 l +82.412 186.086 l +82.242 185.758 l +82.225 185.710 l +83.694 185.710 l +h +301.687 173.998 m +301.902 174.092 l +302.218 174.284 l +302.504 174.517 l +302.756 174.786 l +302.969 175.088 l +303.139 175.416 l +303.156 175.464 l +301.687 175.464 l +301.687 173.998 l +h +299.628 177.523 m +299.628 178.989 l +299.413 178.895 l +299.098 178.704 l +298.811 178.471 l +298.559 178.201 l +298.346 177.899 l +298.176 177.571 l +298.159 177.523 l +299.628 177.523 l +h +299.628 173.998 m +299.628 175.464 l +298.159 175.464 l +298.176 175.416 l +298.346 175.088 l +298.559 174.786 l +298.811 174.517 l +299.098 174.284 l +299.413 174.092 l +299.628 173.998 l +h +303.156 177.523 m +303.139 177.571 l +302.969 177.899 l +302.756 178.201 l +302.504 178.471 l +302.218 178.704 l +301.902 178.895 l +301.687 178.989 l +301.687 177.523 l +303.156 177.523 l +h +50.177 177.523 m +50.177 178.989 l +49.962 178.895 l +49.646 178.704 l +49.360 178.471 l +49.108 178.201 l +48.895 177.899 l +48.725 177.571 l +48.708 177.523 l +50.177 177.523 l +h +50.177 173.998 m +50.177 175.464 l +48.708 175.464 l +48.725 175.416 l +48.895 175.088 l +49.108 174.786 l +49.360 174.517 l +49.646 174.284 l +49.962 174.092 l +50.177 173.998 l +h +52.236 173.998 m +52.451 174.092 l +52.766 174.284 l +53.053 174.517 l +53.305 174.786 l +53.518 175.088 l +53.688 175.416 l +53.705 175.464 l +52.236 175.464 l +52.236 173.998 l +h +53.705 177.523 m +53.688 177.571 l +53.518 177.899 l +53.305 178.201 l +53.053 178.471 l +52.766 178.704 l +52.451 178.895 l +52.236 178.989 l +52.236 177.523 l +53.705 177.523 l +h +f +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +250.199 116.640 m +250.199 111.239 l +245.520 106.560 l +111.679 106.560 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +57.578 141.005 m +55.944 141.005 l +52.560 137.621 l +52.560 116.280 l +41.040 104.760 l +41.040 97.560 l +43.135 95.465 l +79.042 95.465 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +51.206 169.294 m +74.923 169.294 l +102.766 197.136 l +198.619 197.136 l +212.206 183.550 l +212.206 182.794 l +227.959 167.040 l +228.600 167.040 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +293.458 169.294 m +284.004 159.840 l +271.800 159.840 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +264.600 159.840 m +269.417 155.023 l +286.387 155.023 l +300.658 169.294 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +36.806 176.494 m +44.993 184.680 l +64.318 184.680 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +57.578 137.455 m +59.126 137.455 l +63.929 132.653 l +63.929 104.162 l +68.328 99.756 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +186.588 185.645 m +180.979 185.645 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +180.504 185.645 m +180.504 188.539 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +180.979 185.645 m +180.504 185.645 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +180.504 185.645 m +177.365 182.513 l +177.365 179.287 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +186.595 177.718 m +180.036 177.718 l +178.610 176.292 l +157.169 176.292 l +156.809 176.645 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +57.578 151.632 m +87.811 151.632 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +180.713 173.650 m +180.871 173.650 l +180.986 173.765 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +186.588 173.765 m +180.986 173.765 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +57.578 148.090 m +179.791 148.090 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +57.578 144.547 m +143.568 144.547 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +186.595 169.798 m +157.392 169.798 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +257.400 167.040 m +249.934 174.506 l +224.734 174.506 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +186.602 165.838 m +186.602 162.605 l +186.948 162.259 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +150.862 185.652 m +145.253 185.652 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +145.253 185.652 m +145.253 187.322 l +143.438 189.144 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +304.200 157.039 m +297.079 157.039 l +291.240 151.200 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +305.280 192.240 m +305.280 189.396 l +296.806 180.922 l +290.686 180.922 l +286.258 176.494 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +57.578 158.717 m +78.516 158.717 l +90.079 170.280 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +111.528 99.756 m +111.679 99.914 l +111.679 116.201 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +150.862 173.736 m +148.061 173.736 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +150.876 177.710 m +145.267 177.710 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +146.383 173.736 m +145.260 173.736 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +148.061 173.736 m +146.383 173.736 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +150.869 169.776 m +146.009 169.776 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +304.200 130.961 m +297.079 130.961 l +291.240 136.800 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +146.383 173.736 m +145.267 174.852 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +145.267 174.852 m +145.267 177.710 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +145.267 174.852 m +88.315 174.852 l +81.734 168.271 l +81.734 166.378 l +77.746 162.389 l +43.711 162.389 l +36.806 169.294 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +142.834 172.253 m +145.260 172.253 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +146.009 169.776 m +145.260 170.525 l +145.260 172.253 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +145.260 172.253 m +145.260 173.736 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +221.400 167.040 m +212.155 176.285 l +200.830 176.285 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +76.766 165.650 m +76.486 165.370 l +47.930 165.370 l +44.006 169.294 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +51.206 176.494 m +76.536 176.494 l +84.722 184.680 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +298.080 192.240 m +298.080 187.841 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +57.578 155.174 m +84.895 155.174 l +100.001 170.280 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +264.600 116.640 m +259.927 121.313 l +226.073 121.313 l +221.400 116.640 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +221.400 116.640 m +214.200 116.640 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +214.200 116.640 m +207.000 116.640 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +186.588 181.678 m +192.197 181.678 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +186.595 193.586 m +192.197 193.586 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +186.595 189.612 m +190.498 189.612 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +190.498 189.612 m +192.197 189.612 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +192.197 193.586 m +192.197 189.619 l +192.197 189.612 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +150.862 165.809 m +104.472 165.809 l +100.001 170.280 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +209.210 182.304 m +192.197 182.304 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +192.197 189.612 m +192.197 182.304 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +192.197 182.304 m +192.197 181.678 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +295.560 187.841 m +295.560 184.226 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +231.602 194.760 m +238.529 187.841 l +295.560 187.841 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +295.560 187.841 m +298.080 187.841 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +207.000 167.040 m +204.840 167.040 l +200.671 171.216 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +182.628 157.874 m +187.330 157.874 l +200.671 171.216 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +200.671 171.216 m +200.671 172.210 l +192.197 180.684 l +192.197 181.678 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +207.000 159.840 m +163.361 116.201 l +132.919 116.201 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +68.688 27.756 m +68.688 30.168 l +74.880 36.360 l +150.840 36.360 l +168.840 56.520 l +168.840 82.625 l +168.732 82.733 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +111.888 27.756 m +112.723 27.756 l +117.007 32.040 l +151.560 32.400 l +171.720 55.080 l +171.734 82.735 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +104.328 99.756 m +111.600 91.440 l +248.472 91.512 l +257.400 100.440 l +257.400 116.640 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +176.040 116.280 m +176.040 113.760 l +173.520 111.240 l +130.680 111.240 l +125.719 116.201 l +S +1 J +1 j +1.70 w +1.00 0.00 0.00 RG /a0 gs +206.999 116.640 m +198.360 116.640 l +192.600 110.880 l +181.440 110.880 l +176.040 116.280 l +S +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +147.397 195.003 m +154.342 195.003 l +154.342 192.168 l +147.397 192.168 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +147.391 191.038 m +154.337 191.038 l +154.337 188.203 l +147.391 188.203 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +147.389 187.070 m +154.334 187.070 l +154.334 184.235 l +147.389 184.235 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +147.391 183.101 m +154.337 183.101 l +154.337 180.266 l +147.391 180.266 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +147.402 179.125 m +154.347 179.125 l +154.347 176.290 l +147.402 176.290 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +147.391 175.157 m +154.337 175.157 l +154.337 172.323 l +147.391 172.323 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +147.397 171.195 m +154.342 171.195 l +154.342 168.360 l +147.397 168.360 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +147.391 167.224 m +154.337 167.224 l +154.337 164.389 l +147.391 164.389 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +153.424 154.410 m +153.424 161.356 l +156.258 161.356 l +156.258 154.410 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +157.402 154.405 m +157.402 161.350 l +160.237 161.350 l +160.237 154.405 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +161.370 154.399 m +161.370 161.344 l +164.205 161.344 l +164.205 154.399 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +165.339 154.399 m +165.339 161.344 l +168.174 161.344 l +168.174 154.399 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +169.308 154.399 m +169.308 161.344 l +172.142 161.344 l +172.142 154.399 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +173.276 154.399 m +173.276 161.344 l +176.111 161.344 l +176.111 154.399 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +177.245 154.399 m +177.245 161.344 l +180.079 161.344 l +180.079 154.399 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +181.213 154.402 m +181.213 161.347 l +184.047 161.347 l +184.047 154.402 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +190.076 164.424 m +183.131 164.424 l +183.131 167.259 l +190.076 167.259 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +190.066 168.378 m +183.121 168.378 l +183.121 171.212 l +190.066 171.212 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +190.063 172.346 m +183.118 172.346 l +183.118 175.181 l +190.063 175.181 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +183.119 179.132 m +190.064 179.132 l +190.064 176.298 l +183.119 176.298 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +183.116 183.097 m +190.062 183.097 l +190.062 180.263 l +183.116 180.263 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +183.114 187.066 m +190.059 187.066 l +190.059 184.231 l +183.114 184.231 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +183.119 191.031 m +190.064 191.031 l +190.064 188.196 l +183.119 188.196 l + h +f +1 J +1 j +72 M +1.00 0.00 0.00 rg /a0 gs +[] 0 d +183.119 195.003 m +190.064 195.003 l +190.064 192.168 l +183.119 192.168 l + h +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +32.40 63.76 m 32.40 64.95 31.43 65.92 30.24 65.92 c +29.05 65.92 28.08 64.95 28.08 63.76 c +28.08 62.57 29.05 61.60 30.24 61.60 c +31.43 61.60 32.40 62.57 32.40 63.76 c +f +0.13 g +[] 0 d +31.68 63.76 m 31.68 64.56 31.04 65.20 30.24 65.20 c +29.44 65.20 28.80 64.56 28.80 63.76 c +28.80 62.96 29.44 62.32 30.24 62.32 c +31.04 62.32 31.68 62.96 31.68 63.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +135.08 116.20 m 135.08 117.39 134.11 118.36 132.92 118.36 c +131.73 118.36 130.76 117.39 130.76 116.20 c +130.76 115.01 131.73 114.04 132.92 114.04 c +134.11 114.04 135.08 115.01 135.08 116.20 c +f +0.13 g +[] 0 d +134.22 116.20 m 134.22 116.92 133.64 117.50 132.92 117.50 c +132.21 117.50 131.62 116.92 131.62 116.20 c +131.62 115.48 132.21 114.90 132.92 114.90 c +133.64 114.90 134.22 115.48 134.22 116.20 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +127.88 116.20 m 127.88 117.39 126.91 118.36 125.72 118.36 c +124.53 118.36 123.56 117.39 123.56 116.20 c +123.56 115.01 124.53 114.04 125.72 114.04 c +126.91 114.04 127.88 115.01 127.88 116.20 c +f +0.13 g +[] 0 d +127.02 116.20 m 127.02 116.92 126.44 117.50 125.72 117.50 c +125.01 117.50 124.42 116.92 124.42 116.20 c +124.42 115.48 125.01 114.90 125.72 114.90 c +126.44 114.90 127.02 115.48 127.02 116.20 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +121.04 116.20 m 121.04 117.39 120.07 118.36 118.88 118.36 c +117.69 118.36 116.72 117.39 116.72 116.20 c +116.72 115.01 117.69 114.04 118.88 114.04 c +120.07 114.04 121.04 115.01 121.04 116.20 c +f +0.13 g +[] 0 d +120.18 116.20 m 120.18 116.92 119.60 117.50 118.88 117.50 c +118.17 117.50 117.58 116.92 117.58 116.20 c +117.58 115.48 118.17 114.90 118.88 114.90 c +119.60 114.90 120.18 115.48 120.18 116.20 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +113.84 116.20 m 113.84 117.39 112.87 118.36 111.68 118.36 c +110.49 118.36 109.52 117.39 109.52 116.20 c +109.52 115.01 110.49 114.04 111.68 114.04 c +112.87 114.04 113.84 115.01 113.84 116.20 c +f +0.13 g +[] 0 d +112.98 116.20 m 112.98 116.92 112.40 117.50 111.68 117.50 c +110.97 117.50 110.38 116.92 110.38 116.20 c +110.38 115.48 110.97 114.90 111.68 114.90 c +112.40 114.90 112.98 115.48 112.98 116.20 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +106.28 116.20 m 106.28 117.39 105.31 118.36 104.12 118.36 c +102.93 118.36 101.96 117.39 101.96 116.20 c +101.96 115.01 102.93 114.04 104.12 114.04 c +105.31 114.04 106.28 115.01 106.28 116.20 c +f +0.13 g +[] 0 d +105.42 116.20 m 105.42 116.92 104.84 117.50 104.12 117.50 c +103.41 117.50 102.82 116.92 102.82 116.20 c +102.82 115.48 103.41 114.90 104.12 114.90 c +104.84 114.90 105.42 115.48 105.42 116.20 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +99.08 116.20 m 99.08 117.39 98.11 118.36 96.92 118.36 c +95.73 118.36 94.76 117.39 94.76 116.20 c +94.76 115.01 95.73 114.04 96.92 114.04 c +98.11 114.04 99.08 115.01 99.08 116.20 c +f +0.13 g +[] 0 d +98.22 116.20 m 98.22 116.92 97.64 117.50 96.92 117.50 c +96.21 117.50 95.62 116.92 95.62 116.20 c +95.62 115.48 96.21 114.90 96.92 114.90 c +97.64 114.90 98.22 115.48 98.22 116.20 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +92.24 116.20 m 92.24 117.39 91.27 118.36 90.08 118.36 c +88.89 118.36 87.92 117.39 87.92 116.20 c +87.92 115.01 88.89 114.04 90.08 114.04 c +91.27 114.04 92.24 115.01 92.24 116.20 c +f +0.13 g +[] 0 d +91.38 116.20 m 91.38 116.92 90.80 117.50 90.08 117.50 c +89.37 117.50 88.78 116.92 88.78 116.20 c +88.78 115.48 89.37 114.90 90.08 114.90 c +90.80 114.90 91.38 115.48 91.38 116.20 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +85.04 116.20 m 85.04 117.39 84.07 118.36 82.88 118.36 c +81.69 118.36 80.72 117.39 80.72 116.20 c +80.72 115.01 81.69 114.04 82.88 114.04 c +84.07 114.04 85.04 115.01 85.04 116.20 c +f +0.13 g +[] 0 d +84.18 116.20 m 84.18 116.92 83.60 117.50 82.88 117.50 c +82.17 117.50 81.58 116.92 81.58 116.20 c +81.58 115.48 82.17 114.90 82.88 114.90 c +83.60 114.90 84.18 115.48 84.18 116.20 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +77.84 116.20 m 77.84 117.39 76.87 118.36 75.68 118.36 c +74.49 118.36 73.52 117.39 73.52 116.20 c +73.52 115.01 74.49 114.04 75.68 114.04 c +76.87 114.04 77.84 115.01 77.84 116.20 c +f +0.13 g +[] 0 d +76.98 116.20 m 76.98 116.92 76.40 117.50 75.68 117.50 c +74.97 117.50 74.38 116.92 74.38 116.20 c +74.38 115.48 74.97 114.90 75.68 114.90 c +76.40 114.90 76.98 115.48 76.98 116.20 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +70.64 116.20 m 70.64 117.39 69.67 118.36 68.48 118.36 c +67.29 118.36 66.32 117.39 66.32 116.20 c +66.32 115.01 67.29 114.04 68.48 114.04 c +69.67 114.04 70.64 115.01 70.64 116.20 c +f +0.13 g +[] 0 d +69.78 116.20 m 69.78 116.92 69.20 117.50 68.48 117.50 c +67.77 117.50 67.18 116.92 67.18 116.20 c +67.18 115.48 67.77 114.90 68.48 114.90 c +69.20 114.90 69.78 115.48 69.78 116.20 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +102.27 170.28 m 102.27 171.53 101.25 172.55 100.00 172.55 c +98.75 172.55 97.73 171.53 97.73 170.28 c +97.73 169.03 98.75 168.01 100.00 168.01 c +101.25 168.01 102.27 169.03 102.27 170.28 c +f +0.13 g +[] 0 d +101.42 170.28 m 101.42 171.06 100.78 171.70 100.00 171.70 c +99.22 171.70 98.58 171.06 98.58 170.28 c +98.58 169.50 99.22 168.86 100.00 168.86 c +100.78 168.86 101.42 169.50 101.42 170.28 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +92.35 170.28 m 92.35 171.53 91.33 172.55 90.08 172.55 c +88.83 172.55 87.81 171.53 87.81 170.28 c +87.81 169.03 88.83 168.01 90.08 168.01 c +91.33 168.01 92.35 169.03 92.35 170.28 c +f +0.13 g +[] 0 d +91.50 170.28 m 91.50 171.06 90.86 171.70 90.08 171.70 c +89.30 171.70 88.66 171.06 88.66 170.28 c +88.66 169.50 89.30 168.86 90.08 168.86 c +90.86 168.86 91.50 169.50 91.50 170.28 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +273.86 175.20 m 273.86 176.13 273.10 176.90 272.16 176.90 c +271.22 176.90 270.46 176.13 270.46 175.20 c +270.46 174.26 271.22 173.49 272.16 173.49 c +273.10 173.49 273.86 174.26 273.86 175.20 c +f +0.13 g +[] 0 d +273.29 175.20 m 273.29 175.82 272.79 176.33 272.16 176.33 c +271.53 176.33 271.03 175.82 271.03 175.20 c +271.03 174.57 271.53 174.06 272.16 174.06 c +272.79 174.06 273.29 174.57 273.29 175.20 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +273.86 195.60 m 273.86 196.54 273.10 197.31 272.16 197.31 c +271.22 197.31 270.46 196.54 270.46 195.60 c +270.46 194.67 271.22 193.90 272.16 193.90 c +273.10 193.90 273.86 194.67 273.86 195.60 c +f +0.13 g +[] 0 d +273.29 195.60 m 273.29 196.23 272.79 196.74 272.16 196.74 c +271.53 196.74 271.03 196.23 271.03 195.60 c +271.03 194.98 271.53 194.47 272.16 194.47 c +272.79 194.47 273.29 194.98 273.29 195.60 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +293.51 136.80 m 293.51 138.05 292.49 139.07 291.24 139.07 c +289.99 139.07 288.97 138.05 288.97 136.80 c +288.97 135.55 289.99 134.53 291.24 134.53 c +292.49 134.53 293.51 135.55 293.51 136.80 c +f +0.13 g +[] 0 d +292.66 136.80 m 292.66 137.58 292.02 138.22 291.24 138.22 c +290.46 138.22 289.82 137.58 289.82 136.80 c +289.82 136.02 290.46 135.38 291.24 135.38 c +292.02 135.38 292.66 136.02 292.66 136.80 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +293.51 151.20 m 293.51 152.45 292.49 153.47 291.24 153.47 c +289.99 153.47 288.97 152.45 288.97 151.20 c +288.97 149.95 289.99 148.93 291.24 148.93 c +292.49 148.93 293.51 149.95 293.51 151.20 c +f +0.13 g +[] 0 d +292.66 151.20 m 292.66 151.98 292.02 152.62 291.24 152.62 c +290.46 152.62 289.82 151.98 289.82 151.20 c +289.82 150.42 290.46 149.78 291.24 149.78 c +292.02 149.78 292.66 150.42 292.66 151.20 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +306.75 130.96 m 306.75 132.37 305.61 133.51 304.20 133.51 c +302.79 133.51 301.65 132.37 301.65 130.96 c +301.65 129.55 302.79 128.41 304.20 128.41 c +305.61 128.41 306.75 129.55 306.75 130.96 c +f +0.13 g +[] 0 d +305.62 130.96 m 305.62 131.74 304.98 132.38 304.20 132.38 c +303.42 132.38 302.78 131.74 302.78 130.96 c +302.78 130.18 303.42 129.54 304.20 129.54 c +304.98 129.54 305.62 130.18 305.62 130.96 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +306.75 157.04 m 306.75 158.45 305.61 159.59 304.20 159.59 c +302.79 159.59 301.65 158.45 301.65 157.04 c +301.65 155.63 302.79 154.49 304.20 154.49 c +305.61 154.49 306.75 155.63 306.75 157.04 c +f +0.13 g +[] 0 d +305.62 157.04 m 305.62 157.82 304.98 158.46 304.20 158.46 c +303.42 158.46 302.78 157.82 302.78 157.04 c +302.78 156.26 303.42 155.62 304.20 155.62 c +304.98 155.62 305.62 156.26 305.62 157.04 c +f +1 J +1 j +1 J +2.55 w +0.75 G /a0 gs +[] 0 d +305.280 193.232 m +305.280 191.248 l +S +0.13 g +[] 0 d +306.27 192.24 m 306.27 192.79 305.83 193.23 305.28 193.23 c +304.73 193.23 304.29 192.79 304.29 192.24 c +304.29 191.69 304.73 191.25 305.28 191.25 c +305.83 191.25 306.27 191.69 306.27 192.24 c +f +1 J +1 j +1 J +2.55 w +0.75 G /a0 gs +[] 0 d +301.680 193.232 m +301.680 191.248 l +S +0.13 g +[] 0 d +302.67 192.24 m 302.67 192.79 302.23 193.23 301.68 193.23 c +301.13 193.23 300.69 192.79 300.69 192.24 c +300.69 191.69 301.13 191.25 301.68 191.25 c +302.23 191.25 302.67 191.69 302.67 192.24 c +f +1 J +1 j +72 M +0.75 g /a0 gs +[] 0 d +296.804 194.508 m +299.356 194.508 l +299.356 189.972 l +296.804 189.972 l + h +f +0.13 g +[] 0 d +299.07 192.24 m 299.07 192.79 298.63 193.23 298.08 193.23 c +297.53 193.23 297.09 192.79 297.09 192.24 c +297.09 191.69 297.53 191.25 298.08 191.25 c +298.63 191.25 299.07 191.69 299.07 192.24 c +f +1 J +1 j +72 M +0.75 g /a0 gs +[] 0 d +185.400 114.120 m +181.080 114.120 l +181.080 118.440 l +185.400 118.440 l + h +f +0.13 g +[] 0 d +184.68 116.28 m 184.68 117.08 184.04 117.72 183.24 117.72 c +182.44 117.72 181.80 117.08 181.80 116.28 c +181.80 115.48 182.44 114.84 183.24 114.84 c +184.04 114.84 184.68 115.48 184.68 116.28 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +178.20 116.28 m 178.20 117.47 177.23 118.44 176.04 118.44 c +174.85 118.44 173.88 117.47 173.88 116.28 c +173.88 115.09 174.85 114.12 176.04 114.12 c +177.23 114.12 178.20 115.09 178.20 116.28 c +f +0.13 g +[] 0 d +177.48 116.28 m 177.48 117.08 176.84 117.72 176.04 117.72 c +175.24 117.72 174.60 117.08 174.60 116.28 c +174.60 115.48 175.24 114.84 176.04 114.84 c +176.84 114.84 177.48 115.48 177.48 116.28 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +48.53 99.76 m 48.53 100.95 47.56 101.92 46.37 101.92 c +45.18 101.92 44.21 100.95 44.21 99.76 c +44.21 98.57 45.18 97.60 46.37 97.60 c +47.56 97.60 48.53 98.57 48.53 99.76 c +f +0.13 g +[] 0 d +47.67 99.76 m 47.67 100.48 47.08 101.06 46.37 101.06 c +45.65 101.06 45.07 100.48 45.07 99.76 c +45.07 99.04 45.65 98.46 46.37 98.46 c +47.08 98.46 47.67 99.04 47.67 99.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +56.09 99.76 m 56.09 100.95 55.12 101.92 53.93 101.92 c +52.74 101.92 51.77 100.95 51.77 99.76 c +51.77 98.57 52.74 97.60 53.93 97.60 c +55.12 97.60 56.09 98.57 56.09 99.76 c +f +0.13 g +[] 0 d +55.23 99.76 m 55.23 100.48 54.64 101.06 53.93 101.06 c +53.21 101.06 52.63 100.48 52.63 99.76 c +52.63 99.04 53.21 98.46 53.93 98.46 c +54.64 98.46 55.23 99.04 55.23 99.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +63.29 99.76 m 63.29 100.95 62.32 101.92 61.13 101.92 c +59.94 101.92 58.97 100.95 58.97 99.76 c +58.97 98.57 59.94 97.60 61.13 97.60 c +62.32 97.60 63.29 98.57 63.29 99.76 c +f +0.13 g +[] 0 d +62.43 99.76 m 62.43 100.48 61.84 101.06 61.13 101.06 c +60.41 101.06 59.83 100.48 59.83 99.76 c +59.83 99.04 60.41 98.46 61.13 98.46 c +61.84 98.46 62.43 99.04 62.43 99.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +70.49 99.76 m 70.49 100.95 69.52 101.92 68.33 101.92 c +67.14 101.92 66.17 100.95 66.17 99.76 c +66.17 98.57 67.14 97.60 68.33 97.60 c +69.52 97.60 70.49 98.57 70.49 99.76 c +f +0.13 g +[] 0 d +69.63 99.76 m 69.63 100.48 69.04 101.06 68.33 101.06 c +67.61 101.06 67.03 100.48 67.03 99.76 c +67.03 99.04 67.61 98.46 68.33 98.46 c +69.04 98.46 69.63 99.04 69.63 99.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +77.69 99.76 m 77.69 100.95 76.72 101.92 75.53 101.92 c +74.34 101.92 73.37 100.95 73.37 99.76 c +73.37 98.57 74.34 97.60 75.53 97.60 c +76.72 97.60 77.69 98.57 77.69 99.76 c +f +0.13 g +[] 0 d +76.83 99.76 m 76.83 100.48 76.24 101.06 75.53 101.06 c +74.81 101.06 74.23 100.48 74.23 99.76 c +74.23 99.04 74.81 98.46 75.53 98.46 c +76.24 98.46 76.83 99.04 76.83 99.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +84.89 99.76 m 84.89 100.95 83.92 101.92 82.73 101.92 c +81.54 101.92 80.57 100.95 80.57 99.76 c +80.57 98.57 81.54 97.60 82.73 97.60 c +83.92 97.60 84.89 98.57 84.89 99.76 c +f +0.13 g +[] 0 d +84.03 99.76 m 84.03 100.48 83.44 101.06 82.73 101.06 c +82.01 101.06 81.43 100.48 81.43 99.76 c +81.43 99.04 82.01 98.46 82.73 98.46 c +83.44 98.46 84.03 99.04 84.03 99.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +92.09 99.76 m 92.09 100.95 91.12 101.92 89.93 101.92 c +88.74 101.92 87.77 100.95 87.77 99.76 c +87.77 98.57 88.74 97.60 89.93 97.60 c +91.12 97.60 92.09 98.57 92.09 99.76 c +f +0.13 g +[] 0 d +91.23 99.76 m 91.23 100.48 90.64 101.06 89.93 101.06 c +89.21 101.06 88.63 100.48 88.63 99.76 c +88.63 99.04 89.21 98.46 89.93 98.46 c +90.64 98.46 91.23 99.04 91.23 99.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +99.29 99.76 m 99.29 100.95 98.32 101.92 97.13 101.92 c +95.94 101.92 94.97 100.95 94.97 99.76 c +94.97 98.57 95.94 97.60 97.13 97.60 c +98.32 97.60 99.29 98.57 99.29 99.76 c +f +0.13 g +[] 0 d +98.43 99.76 m 98.43 100.48 97.84 101.06 97.13 101.06 c +96.41 101.06 95.83 100.48 95.83 99.76 c +95.83 99.04 96.41 98.46 97.13 98.46 c +97.84 98.46 98.43 99.04 98.43 99.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +106.49 99.76 m 106.49 100.95 105.52 101.92 104.33 101.92 c +103.14 101.92 102.17 100.95 102.17 99.76 c +102.17 98.57 103.14 97.60 104.33 97.60 c +105.52 97.60 106.49 98.57 106.49 99.76 c +f +0.13 g +[] 0 d +105.63 99.76 m 105.63 100.48 105.04 101.06 104.33 101.06 c +103.61 101.06 103.03 100.48 103.03 99.76 c +103.03 99.04 103.61 98.46 104.33 98.46 c +105.04 98.46 105.63 99.04 105.63 99.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +113.69 99.76 m 113.69 100.95 112.72 101.92 111.53 101.92 c +110.34 101.92 109.37 100.95 109.37 99.76 c +109.37 98.57 110.34 97.60 111.53 97.60 c +112.72 97.60 113.69 98.57 113.69 99.76 c +f +0.13 g +[] 0 d +112.83 99.76 m 112.83 100.48 112.24 101.06 111.53 101.06 c +110.81 101.06 110.23 100.48 110.23 99.76 c +110.23 99.04 110.81 98.46 111.53 98.46 c +112.24 98.46 112.83 99.04 112.83 99.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +120.89 99.76 m 120.89 100.95 119.92 101.92 118.73 101.92 c +117.54 101.92 116.57 100.95 116.57 99.76 c +116.57 98.57 117.54 97.60 118.73 97.60 c +119.92 97.60 120.89 98.57 120.89 99.76 c +f +0.13 g +[] 0 d +120.03 99.76 m 120.03 100.48 119.44 101.06 118.73 101.06 c +118.01 101.06 117.43 100.48 117.43 99.76 c +117.43 99.04 118.01 98.46 118.73 98.46 c +119.44 98.46 120.03 99.04 120.03 99.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +49.25 27.76 m 49.25 28.95 48.28 29.92 47.09 29.92 c +45.90 29.92 44.93 28.95 44.93 27.76 c +44.93 26.57 45.90 25.60 47.09 25.60 c +48.28 25.60 49.25 26.57 49.25 27.76 c +f +0.13 g +[] 0 d +48.39 27.76 m 48.39 28.48 47.80 29.06 47.09 29.06 c +46.37 29.06 45.79 28.48 45.79 27.76 c +45.79 27.04 46.37 26.46 47.09 26.46 c +47.80 26.46 48.39 27.04 48.39 27.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +56.45 27.76 m 56.45 28.95 55.48 29.92 54.29 29.92 c +53.10 29.92 52.13 28.95 52.13 27.76 c +52.13 26.57 53.10 25.60 54.29 25.60 c +55.48 25.60 56.45 26.57 56.45 27.76 c +f +0.13 g +[] 0 d +55.59 27.76 m 55.59 28.48 55.00 29.06 54.29 29.06 c +53.57 29.06 52.99 28.48 52.99 27.76 c +52.99 27.04 53.57 26.46 54.29 26.46 c +55.00 26.46 55.59 27.04 55.59 27.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +63.65 27.76 m 63.65 28.95 62.68 29.92 61.49 29.92 c +60.30 29.92 59.33 28.95 59.33 27.76 c +59.33 26.57 60.30 25.60 61.49 25.60 c +62.68 25.60 63.65 26.57 63.65 27.76 c +f +0.13 g +[] 0 d +62.79 27.76 m 62.79 28.48 62.20 29.06 61.49 29.06 c +60.77 29.06 60.19 28.48 60.19 27.76 c +60.19 27.04 60.77 26.46 61.49 26.46 c +62.20 26.46 62.79 27.04 62.79 27.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +70.85 27.76 m 70.85 28.95 69.88 29.92 68.69 29.92 c +67.50 29.92 66.53 28.95 66.53 27.76 c +66.53 26.57 67.50 25.60 68.69 25.60 c +69.88 25.60 70.85 26.57 70.85 27.76 c +f +0.13 g +[] 0 d +69.99 27.76 m 69.99 28.48 69.40 29.06 68.69 29.06 c +67.97 29.06 67.39 28.48 67.39 27.76 c +67.39 27.04 67.97 26.46 68.69 26.46 c +69.40 26.46 69.99 27.04 69.99 27.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +78.05 27.76 m 78.05 28.95 77.08 29.92 75.89 29.92 c +74.70 29.92 73.73 28.95 73.73 27.76 c +73.73 26.57 74.70 25.60 75.89 25.60 c +77.08 25.60 78.05 26.57 78.05 27.76 c +f +0.13 g +[] 0 d +77.19 27.76 m 77.19 28.48 76.60 29.06 75.89 29.06 c +75.17 29.06 74.59 28.48 74.59 27.76 c +74.59 27.04 75.17 26.46 75.89 26.46 c +76.60 26.46 77.19 27.04 77.19 27.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +85.25 27.76 m 85.25 28.95 84.28 29.92 83.09 29.92 c +81.90 29.92 80.93 28.95 80.93 27.76 c +80.93 26.57 81.90 25.60 83.09 25.60 c +84.28 25.60 85.25 26.57 85.25 27.76 c +f +0.13 g +[] 0 d +84.39 27.76 m 84.39 28.48 83.80 29.06 83.09 29.06 c +82.37 29.06 81.79 28.48 81.79 27.76 c +81.79 27.04 82.37 26.46 83.09 26.46 c +83.80 26.46 84.39 27.04 84.39 27.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +92.45 27.76 m 92.45 28.95 91.48 29.92 90.29 29.92 c +89.10 29.92 88.13 28.95 88.13 27.76 c +88.13 26.57 89.10 25.60 90.29 25.60 c +91.48 25.60 92.45 26.57 92.45 27.76 c +f +0.13 g +[] 0 d +91.59 27.76 m 91.59 28.48 91.00 29.06 90.29 29.06 c +89.57 29.06 88.99 28.48 88.99 27.76 c +88.99 27.04 89.57 26.46 90.29 26.46 c +91.00 26.46 91.59 27.04 91.59 27.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +99.65 27.76 m 99.65 28.95 98.68 29.92 97.49 29.92 c +96.30 29.92 95.33 28.95 95.33 27.76 c +95.33 26.57 96.30 25.60 97.49 25.60 c +98.68 25.60 99.65 26.57 99.65 27.76 c +f +0.13 g +[] 0 d +98.79 27.76 m 98.79 28.48 98.20 29.06 97.49 29.06 c +96.77 29.06 96.19 28.48 96.19 27.76 c +96.19 27.04 96.77 26.46 97.49 26.46 c +98.20 26.46 98.79 27.04 98.79 27.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +106.85 27.76 m 106.85 28.95 105.88 29.92 104.69 29.92 c +103.50 29.92 102.53 28.95 102.53 27.76 c +102.53 26.57 103.50 25.60 104.69 25.60 c +105.88 25.60 106.85 26.57 106.85 27.76 c +f +0.13 g +[] 0 d +105.99 27.76 m 105.99 28.48 105.40 29.06 104.69 29.06 c +103.97 29.06 103.39 28.48 103.39 27.76 c +103.39 27.04 103.97 26.46 104.69 26.46 c +105.40 26.46 105.99 27.04 105.99 27.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +114.05 27.76 m 114.05 28.95 113.08 29.92 111.89 29.92 c +110.70 29.92 109.73 28.95 109.73 27.76 c +109.73 26.57 110.70 25.60 111.89 25.60 c +113.08 25.60 114.05 26.57 114.05 27.76 c +f +0.13 g +[] 0 d +113.19 27.76 m 113.19 28.48 112.60 29.06 111.89 29.06 c +111.17 29.06 110.59 28.48 110.59 27.76 c +110.59 27.04 111.17 26.46 111.89 26.46 c +112.60 26.46 113.19 27.04 113.19 27.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +121.25 27.76 m 121.25 28.95 120.28 29.92 119.09 29.92 c +117.90 29.92 116.93 28.95 116.93 27.76 c +116.93 26.57 117.90 25.60 119.09 25.60 c +120.28 25.60 121.25 26.57 121.25 27.76 c +f +0.13 g +[] 0 d +120.39 27.76 m 120.39 28.48 119.80 29.06 119.09 29.06 c +118.37 29.06 117.79 28.48 117.79 27.76 c +117.79 27.04 118.37 26.46 119.09 26.46 c +119.80 26.46 120.39 27.04 120.39 27.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +128.09 99.76 m 128.09 100.95 127.12 101.92 125.93 101.92 c +124.74 101.92 123.77 100.95 123.77 99.76 c +123.77 98.57 124.74 97.60 125.93 97.60 c +127.12 97.60 128.09 98.57 128.09 99.76 c +f +0.13 g +[] 0 d +127.23 99.76 m 127.23 100.48 126.64 101.06 125.93 101.06 c +125.21 101.06 124.63 100.48 124.63 99.76 c +124.63 99.04 125.21 98.46 125.93 98.46 c +126.64 98.46 127.23 99.04 127.23 99.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +135.29 99.76 m 135.29 100.95 134.32 101.92 133.13 101.92 c +131.94 101.92 130.97 100.95 130.97 99.76 c +130.97 98.57 131.94 97.60 133.13 97.60 c +134.32 97.60 135.29 98.57 135.29 99.76 c +f +0.13 g +[] 0 d +134.43 99.76 m 134.43 100.48 133.84 101.06 133.13 101.06 c +132.41 101.06 131.83 100.48 131.83 99.76 c +131.83 99.04 132.41 98.46 133.13 98.46 c +133.84 98.46 134.43 99.04 134.43 99.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +128.45 27.76 m 128.45 28.95 127.48 29.92 126.29 29.92 c +125.10 29.92 124.13 28.95 124.13 27.76 c +124.13 26.57 125.10 25.60 126.29 25.60 c +127.48 25.60 128.45 26.57 128.45 27.76 c +f +0.13 g +[] 0 d +127.59 27.76 m 127.59 28.48 127.00 29.06 126.29 29.06 c +125.57 29.06 124.99 28.48 124.99 27.76 c +124.99 27.04 125.57 26.46 126.29 26.46 c +127.00 26.46 127.59 27.04 127.59 27.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +135.65 27.76 m 135.65 28.95 134.68 29.92 133.49 29.92 c +132.30 29.92 131.33 28.95 131.33 27.76 c +131.33 26.57 132.30 25.60 133.49 25.60 c +134.68 25.60 135.65 26.57 135.65 27.76 c +f +0.13 g +[] 0 d +134.79 27.76 m 134.79 28.48 134.20 29.06 133.49 29.06 c +132.77 29.06 132.19 28.48 132.19 27.76 c +132.19 27.04 132.77 26.46 133.49 26.46 c +134.20 26.46 134.79 27.04 134.79 27.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +209.16 116.64 m 209.16 117.83 208.19 118.80 207.00 118.80 c +205.81 118.80 204.84 117.83 204.84 116.64 c +204.84 115.45 205.81 114.48 207.00 114.48 c +208.19 114.48 209.16 115.45 209.16 116.64 c +f +0.13 g +[] 0 d +208.30 116.64 m 208.30 117.36 207.72 117.94 207.00 117.94 c +206.28 117.94 205.70 117.36 205.70 116.64 c +205.70 115.92 206.28 115.34 207.00 115.34 c +207.72 115.34 208.30 115.92 208.30 116.64 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +216.36 116.64 m 216.36 117.83 215.39 118.80 214.20 118.80 c +213.01 118.80 212.04 117.83 212.04 116.64 c +212.04 115.45 213.01 114.48 214.20 114.48 c +215.39 114.48 216.36 115.45 216.36 116.64 c +f +0.13 g +[] 0 d +215.50 116.64 m 215.50 117.36 214.92 117.94 214.20 117.94 c +213.48 117.94 212.90 117.36 212.90 116.64 c +212.90 115.92 213.48 115.34 214.20 115.34 c +214.92 115.34 215.50 115.92 215.50 116.64 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +223.56 116.64 m 223.56 117.83 222.59 118.80 221.40 118.80 c +220.21 118.80 219.24 117.83 219.24 116.64 c +219.24 115.45 220.21 114.48 221.40 114.48 c +222.59 114.48 223.56 115.45 223.56 116.64 c +f +0.13 g +[] 0 d +222.70 116.64 m 222.70 117.36 222.12 117.94 221.40 117.94 c +220.68 117.94 220.10 117.36 220.10 116.64 c +220.10 115.92 220.68 115.34 221.40 115.34 c +222.12 115.34 222.70 115.92 222.70 116.64 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +230.76 116.64 m 230.76 117.83 229.79 118.80 228.60 118.80 c +227.41 118.80 226.44 117.83 226.44 116.64 c +226.44 115.45 227.41 114.48 228.60 114.48 c +229.79 114.48 230.76 115.45 230.76 116.64 c +f +0.13 g +[] 0 d +229.90 116.64 m 229.90 117.36 229.32 117.94 228.60 117.94 c +227.88 117.94 227.30 117.36 227.30 116.64 c +227.30 115.92 227.88 115.34 228.60 115.34 c +229.32 115.34 229.90 115.92 229.90 116.64 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +237.96 116.64 m 237.96 117.83 236.99 118.80 235.80 118.80 c +234.61 118.80 233.64 117.83 233.64 116.64 c +233.64 115.45 234.61 114.48 235.80 114.48 c +236.99 114.48 237.96 115.45 237.96 116.64 c +f +0.13 g +[] 0 d +237.10 116.64 m 237.10 117.36 236.52 117.94 235.80 117.94 c +235.08 117.94 234.50 117.36 234.50 116.64 c +234.50 115.92 235.08 115.34 235.80 115.34 c +236.52 115.34 237.10 115.92 237.10 116.64 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +245.16 116.64 m 245.16 117.83 244.19 118.80 243.00 118.80 c +241.81 118.80 240.84 117.83 240.84 116.64 c +240.84 115.45 241.81 114.48 243.00 114.48 c +244.19 114.48 245.16 115.45 245.16 116.64 c +f +0.13 g +[] 0 d +244.30 116.64 m 244.30 117.36 243.72 117.94 243.00 117.94 c +242.28 117.94 241.70 117.36 241.70 116.64 c +241.70 115.92 242.28 115.34 243.00 115.34 c +243.72 115.34 244.30 115.92 244.30 116.64 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +252.36 116.64 m 252.36 117.83 251.39 118.80 250.20 118.80 c +249.01 118.80 248.04 117.83 248.04 116.64 c +248.04 115.45 249.01 114.48 250.20 114.48 c +251.39 114.48 252.36 115.45 252.36 116.64 c +f +0.13 g +[] 0 d +251.50 116.64 m 251.50 117.36 250.92 117.94 250.20 117.94 c +249.48 117.94 248.90 117.36 248.90 116.64 c +248.90 115.92 249.48 115.34 250.20 115.34 c +250.92 115.34 251.50 115.92 251.50 116.64 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +259.56 116.64 m 259.56 117.83 258.59 118.80 257.40 118.80 c +256.21 118.80 255.24 117.83 255.24 116.64 c +255.24 115.45 256.21 114.48 257.40 114.48 c +258.59 114.48 259.56 115.45 259.56 116.64 c +f +0.13 g +[] 0 d +258.70 116.64 m 258.70 117.36 258.12 117.94 257.40 117.94 c +256.68 117.94 256.10 117.36 256.10 116.64 c +256.10 115.92 256.68 115.34 257.40 115.34 c +258.12 115.34 258.70 115.92 258.70 116.64 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +266.76 116.64 m 266.76 117.83 265.79 118.80 264.60 118.80 c +263.41 118.80 262.44 117.83 262.44 116.64 c +262.44 115.45 263.41 114.48 264.60 114.48 c +265.79 114.48 266.76 115.45 266.76 116.64 c +f +0.13 g +[] 0 d +265.90 116.64 m 265.90 117.36 265.32 117.94 264.60 117.94 c +263.88 117.94 263.30 117.36 263.30 116.64 c +263.30 115.92 263.88 115.34 264.60 115.34 c +265.32 115.34 265.90 115.92 265.90 116.64 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +273.96 116.64 m 273.96 117.83 272.99 118.80 271.80 118.80 c +270.61 118.80 269.64 117.83 269.64 116.64 c +269.64 115.45 270.61 114.48 271.80 114.48 c +272.99 114.48 273.96 115.45 273.96 116.64 c +f +0.13 g +[] 0 d +273.10 116.64 m 273.10 117.36 272.52 117.94 271.80 117.94 c +271.08 117.94 270.50 117.36 270.50 116.64 c +270.50 115.92 271.08 115.34 271.80 115.34 c +272.52 115.34 273.10 115.92 273.10 116.64 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +209.16 159.84 m 209.16 161.03 208.19 162.00 207.00 162.00 c +205.81 162.00 204.84 161.03 204.84 159.84 c +204.84 158.65 205.81 157.68 207.00 157.68 c +208.19 157.68 209.16 158.65 209.16 159.84 c +f +0.13 g +[] 0 d +208.30 159.84 m 208.30 160.56 207.72 161.14 207.00 161.14 c +206.28 161.14 205.70 160.56 205.70 159.84 c +205.70 159.12 206.28 158.54 207.00 158.54 c +207.72 158.54 208.30 159.12 208.30 159.84 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +216.36 159.84 m 216.36 161.03 215.39 162.00 214.20 162.00 c +213.01 162.00 212.04 161.03 212.04 159.84 c +212.04 158.65 213.01 157.68 214.20 157.68 c +215.39 157.68 216.36 158.65 216.36 159.84 c +f +0.13 g +[] 0 d +215.50 159.84 m 215.50 160.56 214.92 161.14 214.20 161.14 c +213.48 161.14 212.90 160.56 212.90 159.84 c +212.90 159.12 213.48 158.54 214.20 158.54 c +214.92 158.54 215.50 159.12 215.50 159.84 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +223.56 159.84 m 223.56 161.03 222.59 162.00 221.40 162.00 c +220.21 162.00 219.24 161.03 219.24 159.84 c +219.24 158.65 220.21 157.68 221.40 157.68 c +222.59 157.68 223.56 158.65 223.56 159.84 c +f +0.13 g +[] 0 d +222.70 159.84 m 222.70 160.56 222.12 161.14 221.40 161.14 c +220.68 161.14 220.10 160.56 220.10 159.84 c +220.10 159.12 220.68 158.54 221.40 158.54 c +222.12 158.54 222.70 159.12 222.70 159.84 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +230.76 159.84 m 230.76 161.03 229.79 162.00 228.60 162.00 c +227.41 162.00 226.44 161.03 226.44 159.84 c +226.44 158.65 227.41 157.68 228.60 157.68 c +229.79 157.68 230.76 158.65 230.76 159.84 c +f +0.13 g +[] 0 d +229.90 159.84 m 229.90 160.56 229.32 161.14 228.60 161.14 c +227.88 161.14 227.30 160.56 227.30 159.84 c +227.30 159.12 227.88 158.54 228.60 158.54 c +229.32 158.54 229.90 159.12 229.90 159.84 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +237.96 159.84 m 237.96 161.03 236.99 162.00 235.80 162.00 c +234.61 162.00 233.64 161.03 233.64 159.84 c +233.64 158.65 234.61 157.68 235.80 157.68 c +236.99 157.68 237.96 158.65 237.96 159.84 c +f +0.13 g +[] 0 d +237.10 159.84 m 237.10 160.56 236.52 161.14 235.80 161.14 c +235.08 161.14 234.50 160.56 234.50 159.84 c +234.50 159.12 235.08 158.54 235.80 158.54 c +236.52 158.54 237.10 159.12 237.10 159.84 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +245.16 159.84 m 245.16 161.03 244.19 162.00 243.00 162.00 c +241.81 162.00 240.84 161.03 240.84 159.84 c +240.84 158.65 241.81 157.68 243.00 157.68 c +244.19 157.68 245.16 158.65 245.16 159.84 c +f +0.13 g +[] 0 d +244.30 159.84 m 244.30 160.56 243.72 161.14 243.00 161.14 c +242.28 161.14 241.70 160.56 241.70 159.84 c +241.70 159.12 242.28 158.54 243.00 158.54 c +243.72 158.54 244.30 159.12 244.30 159.84 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +252.36 159.84 m 252.36 161.03 251.39 162.00 250.20 162.00 c +249.01 162.00 248.04 161.03 248.04 159.84 c +248.04 158.65 249.01 157.68 250.20 157.68 c +251.39 157.68 252.36 158.65 252.36 159.84 c +f +0.13 g +[] 0 d +251.50 159.84 m 251.50 160.56 250.92 161.14 250.20 161.14 c +249.48 161.14 248.90 160.56 248.90 159.84 c +248.90 159.12 249.48 158.54 250.20 158.54 c +250.92 158.54 251.50 159.12 251.50 159.84 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +259.56 159.84 m 259.56 161.03 258.59 162.00 257.40 162.00 c +256.21 162.00 255.24 161.03 255.24 159.84 c +255.24 158.65 256.21 157.68 257.40 157.68 c +258.59 157.68 259.56 158.65 259.56 159.84 c +f +0.13 g +[] 0 d +258.70 159.84 m 258.70 160.56 258.12 161.14 257.40 161.14 c +256.68 161.14 256.10 160.56 256.10 159.84 c +256.10 159.12 256.68 158.54 257.40 158.54 c +258.12 158.54 258.70 159.12 258.70 159.84 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +266.76 159.84 m 266.76 161.03 265.79 162.00 264.60 162.00 c +263.41 162.00 262.44 161.03 262.44 159.84 c +262.44 158.65 263.41 157.68 264.60 157.68 c +265.79 157.68 266.76 158.65 266.76 159.84 c +f +0.13 g +[] 0 d +265.90 159.84 m 265.90 160.56 265.32 161.14 264.60 161.14 c +263.88 161.14 263.30 160.56 263.30 159.84 c +263.30 159.12 263.88 158.54 264.60 158.54 c +265.32 158.54 265.90 159.12 265.90 159.84 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +273.96 159.84 m 273.96 161.03 272.99 162.00 271.80 162.00 c +270.61 162.00 269.64 161.03 269.64 159.84 c +269.64 158.65 270.61 157.68 271.80 157.68 c +272.99 157.68 273.96 158.65 273.96 159.84 c +f +0.13 g +[] 0 d +273.10 159.84 m 273.10 160.56 272.52 161.14 271.80 161.14 c +271.08 161.14 270.50 160.56 270.50 159.84 c +270.50 159.12 271.08 158.54 271.80 158.54 c +272.52 158.54 273.10 159.12 273.10 159.84 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +209.16 167.04 m 209.16 168.23 208.19 169.20 207.00 169.20 c +205.81 169.20 204.84 168.23 204.84 167.04 c +204.84 165.85 205.81 164.88 207.00 164.88 c +208.19 164.88 209.16 165.85 209.16 167.04 c +f +0.13 g +[] 0 d +208.30 167.04 m 208.30 167.76 207.72 168.34 207.00 168.34 c +206.28 168.34 205.70 167.76 205.70 167.04 c +205.70 166.32 206.28 165.74 207.00 165.74 c +207.72 165.74 208.30 166.32 208.30 167.04 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +216.36 167.04 m 216.36 168.23 215.39 169.20 214.20 169.20 c +213.01 169.20 212.04 168.23 212.04 167.04 c +212.04 165.85 213.01 164.88 214.20 164.88 c +215.39 164.88 216.36 165.85 216.36 167.04 c +f +0.13 g +[] 0 d +215.50 167.04 m 215.50 167.76 214.92 168.34 214.20 168.34 c +213.48 168.34 212.90 167.76 212.90 167.04 c +212.90 166.32 213.48 165.74 214.20 165.74 c +214.92 165.74 215.50 166.32 215.50 167.04 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +223.56 167.04 m 223.56 168.23 222.59 169.20 221.40 169.20 c +220.21 169.20 219.24 168.23 219.24 167.04 c +219.24 165.85 220.21 164.88 221.40 164.88 c +222.59 164.88 223.56 165.85 223.56 167.04 c +f +0.13 g +[] 0 d +222.70 167.04 m 222.70 167.76 222.12 168.34 221.40 168.34 c +220.68 168.34 220.10 167.76 220.10 167.04 c +220.10 166.32 220.68 165.74 221.40 165.74 c +222.12 165.74 222.70 166.32 222.70 167.04 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +230.76 167.04 m 230.76 168.23 229.79 169.20 228.60 169.20 c +227.41 169.20 226.44 168.23 226.44 167.04 c +226.44 165.85 227.41 164.88 228.60 164.88 c +229.79 164.88 230.76 165.85 230.76 167.04 c +f +0.13 g +[] 0 d +229.90 167.04 m 229.90 167.76 229.32 168.34 228.60 168.34 c +227.88 168.34 227.30 167.76 227.30 167.04 c +227.30 166.32 227.88 165.74 228.60 165.74 c +229.32 165.74 229.90 166.32 229.90 167.04 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +237.96 167.04 m 237.96 168.23 236.99 169.20 235.80 169.20 c +234.61 169.20 233.64 168.23 233.64 167.04 c +233.64 165.85 234.61 164.88 235.80 164.88 c +236.99 164.88 237.96 165.85 237.96 167.04 c +f +0.13 g +[] 0 d +237.10 167.04 m 237.10 167.76 236.52 168.34 235.80 168.34 c +235.08 168.34 234.50 167.76 234.50 167.04 c +234.50 166.32 235.08 165.74 235.80 165.74 c +236.52 165.74 237.10 166.32 237.10 167.04 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +245.16 167.04 m 245.16 168.23 244.19 169.20 243.00 169.20 c +241.81 169.20 240.84 168.23 240.84 167.04 c +240.84 165.85 241.81 164.88 243.00 164.88 c +244.19 164.88 245.16 165.85 245.16 167.04 c +f +0.13 g +[] 0 d +244.30 167.04 m 244.30 167.76 243.72 168.34 243.00 168.34 c +242.28 168.34 241.70 167.76 241.70 167.04 c +241.70 166.32 242.28 165.74 243.00 165.74 c +243.72 165.74 244.30 166.32 244.30 167.04 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +252.36 167.04 m 252.36 168.23 251.39 169.20 250.20 169.20 c +249.01 169.20 248.04 168.23 248.04 167.04 c +248.04 165.85 249.01 164.88 250.20 164.88 c +251.39 164.88 252.36 165.85 252.36 167.04 c +f +0.13 g +[] 0 d +251.50 167.04 m 251.50 167.76 250.92 168.34 250.20 168.34 c +249.48 168.34 248.90 167.76 248.90 167.04 c +248.90 166.32 249.48 165.74 250.20 165.74 c +250.92 165.74 251.50 166.32 251.50 167.04 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +259.56 167.04 m 259.56 168.23 258.59 169.20 257.40 169.20 c +256.21 169.20 255.24 168.23 255.24 167.04 c +255.24 165.85 256.21 164.88 257.40 164.88 c +258.59 164.88 259.56 165.85 259.56 167.04 c +f +0.13 g +[] 0 d +258.70 167.04 m 258.70 167.76 258.12 168.34 257.40 168.34 c +256.68 168.34 256.10 167.76 256.10 167.04 c +256.10 166.32 256.68 165.74 257.40 165.74 c +258.12 165.74 258.70 166.32 258.70 167.04 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +266.76 167.04 m 266.76 168.23 265.79 169.20 264.60 169.20 c +263.41 169.20 262.44 168.23 262.44 167.04 c +262.44 165.85 263.41 164.88 264.60 164.88 c +265.79 164.88 266.76 165.85 266.76 167.04 c +f +0.13 g +[] 0 d +265.90 167.04 m 265.90 167.76 265.32 168.34 264.60 168.34 c +263.88 168.34 263.30 167.76 263.30 167.04 c +263.30 166.32 263.88 165.74 264.60 165.74 c +265.32 165.74 265.90 166.32 265.90 167.04 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +273.96 167.04 m 273.96 168.23 272.99 169.20 271.80 169.20 c +270.61 169.20 269.64 168.23 269.64 167.04 c +269.64 165.85 270.61 164.88 271.80 164.88 c +272.99 164.88 273.96 165.85 273.96 167.04 c +f +0.13 g +[] 0 d +273.10 167.04 m 273.10 167.76 272.52 168.34 271.80 168.34 c +271.08 168.34 270.50 167.76 270.50 167.04 c +270.50 166.32 271.08 165.74 271.80 165.74 c +272.52 165.74 273.10 166.32 273.10 167.04 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +66.02 184.68 m 66.02 185.62 65.25 186.38 64.32 186.38 c +63.38 186.38 62.61 185.62 62.61 184.68 c +62.61 183.74 63.38 182.98 64.32 182.98 c +65.25 182.98 66.02 183.74 66.02 184.68 c +f +0.13 g +[] 0 d +65.45 184.68 m 65.45 185.31 64.94 185.81 64.32 185.81 c +63.69 185.81 63.18 185.31 63.18 184.68 c +63.18 184.05 63.69 183.55 64.32 183.55 c +64.94 183.55 65.45 184.05 65.45 184.68 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +86.43 184.68 m 86.43 185.62 85.66 186.38 84.72 186.38 c +83.79 186.38 83.02 185.62 83.02 184.68 c +83.02 183.74 83.79 182.98 84.72 182.98 c +85.66 182.98 86.43 183.74 86.43 184.68 c +f +0.13 g +[] 0 d +85.86 184.68 m 85.86 185.31 85.35 185.81 84.72 185.81 c +84.10 185.81 83.59 185.31 83.59 184.68 c +83.59 184.05 84.10 183.55 84.72 183.55 c +85.35 183.55 85.86 184.05 85.86 184.68 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +233.31 194.76 m 233.31 195.70 232.54 196.46 231.60 196.46 c +230.67 196.46 229.90 195.70 229.90 194.76 c +229.90 193.82 230.67 193.06 231.60 193.06 c +232.54 193.06 233.31 193.82 233.31 194.76 c +f +0.13 g +[] 0 d +232.74 194.76 m 232.74 195.39 232.23 195.89 231.60 195.89 c +230.98 195.89 230.47 195.39 230.47 194.76 c +230.47 194.13 230.98 193.63 231.60 193.63 c +232.23 193.63 232.74 194.13 232.74 194.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +212.90 194.76 m 212.90 195.70 212.13 196.46 211.20 196.46 c +210.26 196.46 209.49 195.70 209.49 194.76 c +209.49 193.82 210.26 193.06 211.20 193.06 c +212.13 193.06 212.90 193.82 212.90 194.76 c +f +0.13 g +[] 0 d +212.33 194.76 m 212.33 195.39 211.82 195.89 211.20 195.89 c +210.57 195.89 210.06 195.39 210.06 194.76 c +210.06 194.13 210.57 193.63 211.20 193.63 c +211.82 193.63 212.33 194.13 212.33 194.76 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +58.71 158.72 m 58.71 159.35 58.20 159.85 57.58 159.85 c +56.95 159.85 56.44 159.35 56.44 158.72 c +56.44 158.09 56.95 157.59 57.58 157.59 c +58.20 157.59 58.71 158.09 58.71 158.72 c +f +0.13 g +[] 0 d +58.29 158.72 m 58.29 159.11 57.97 159.43 57.58 159.43 c +57.19 159.43 56.87 159.11 56.87 158.72 c +56.87 158.33 57.19 158.01 57.58 158.01 c +57.97 158.01 58.29 158.33 58.29 158.72 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +58.71 155.18 m 58.71 155.80 58.20 156.31 57.58 156.31 c +56.95 156.31 56.44 155.80 56.44 155.18 c +56.44 154.55 56.95 154.04 57.58 154.04 c +58.20 154.04 58.71 154.55 58.71 155.18 c +f +0.13 g +[] 0 d +58.29 155.18 m 58.29 155.57 57.97 155.89 57.58 155.89 c +57.19 155.89 56.87 155.57 56.87 155.18 c +56.87 154.79 57.19 154.47 57.58 154.47 c +57.97 154.47 58.29 154.79 58.29 155.18 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +58.71 151.63 m 58.71 152.26 58.20 152.77 57.58 152.77 c +56.95 152.77 56.44 152.26 56.44 151.63 c +56.44 151.01 56.95 150.50 57.58 150.50 c +58.20 150.50 58.71 151.01 58.71 151.63 c +f +0.13 g +[] 0 d +58.29 151.63 m 58.29 152.03 57.97 152.34 57.58 152.34 c +57.19 152.34 56.87 152.03 56.87 151.63 c +56.87 151.24 57.19 150.93 57.58 150.93 c +57.97 150.93 58.29 151.24 58.29 151.63 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +58.71 148.09 m 58.71 148.72 58.20 149.23 57.58 149.23 c +56.95 149.23 56.44 148.72 56.44 148.09 c +56.44 147.47 56.95 146.96 57.58 146.96 c +58.20 146.96 58.71 147.47 58.71 148.09 c +f +0.13 g +[] 0 d +58.29 148.09 m 58.29 148.48 57.97 148.80 57.58 148.80 c +57.19 148.80 56.87 148.48 56.87 148.09 c +56.87 147.70 57.19 147.38 57.58 147.38 c +57.97 147.38 58.29 147.70 58.29 148.09 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +58.71 144.55 m 58.71 145.18 58.20 145.68 57.58 145.68 c +56.95 145.68 56.44 145.18 56.44 144.55 c +56.44 143.92 56.95 143.42 57.58 143.42 c +58.20 143.42 58.71 143.92 58.71 144.55 c +f +0.13 g +[] 0 d +58.29 144.55 m 58.29 144.94 57.97 145.26 57.58 145.26 c +57.19 145.26 56.87 144.94 56.87 144.55 c +56.87 144.16 57.19 143.84 57.58 143.84 c +57.97 143.84 58.29 144.16 58.29 144.55 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +58.71 141.01 m 58.71 141.63 58.20 142.14 57.58 142.14 c +56.95 142.14 56.44 141.63 56.44 141.01 c +56.44 140.38 56.95 139.87 57.58 139.87 c +58.20 139.87 58.71 140.38 58.71 141.01 c +f +0.13 g +[] 0 d +58.29 141.01 m 58.29 141.40 57.97 141.72 57.58 141.72 c +57.19 141.72 56.87 141.40 56.87 141.01 c +56.87 140.62 57.19 140.30 57.58 140.30 c +57.97 140.30 58.29 140.62 58.29 141.01 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +58.71 137.46 m 58.71 138.08 58.20 138.59 57.58 138.59 c +56.95 138.59 56.44 138.08 56.44 137.46 c +56.44 136.83 56.95 136.32 57.58 136.32 c +58.20 136.32 58.71 136.83 58.71 137.46 c +f +0.13 g +[] 0 d +58.29 137.46 m 58.29 137.85 57.97 138.17 57.58 138.17 c +57.19 138.17 56.87 137.85 56.87 137.46 c +56.87 137.07 57.19 136.75 57.58 136.75 c +57.97 136.75 58.29 137.07 58.29 137.46 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +58.71 133.91 m 58.71 134.54 58.20 135.05 57.58 135.05 c +56.95 135.05 56.44 134.54 56.44 133.91 c +56.44 133.29 56.95 132.78 57.58 132.78 c +58.20 132.78 58.71 133.29 58.71 133.91 c +f +0.13 g +[] 0 d +58.29 133.91 m 58.29 134.31 57.97 134.62 57.58 134.62 c +57.19 134.62 56.87 134.31 56.87 133.91 c +56.87 133.52 57.19 133.21 57.58 133.21 c +57.97 133.21 58.29 133.52 58.29 133.91 c +f +1 J +1 j +72 M +0.75 g /a0 gs +[] 0 d +35.107 170.993 m +38.506 170.993 l +38.506 167.594 l +35.107 167.594 l + h +f +0.13 g +[] 0 d +37.94 169.29 m 37.94 169.92 37.43 170.42 36.81 170.42 c +36.18 170.42 35.68 169.92 35.68 169.29 c +35.68 168.67 36.18 168.16 36.81 168.16 c +37.43 168.16 37.94 168.67 37.94 169.29 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +38.51 176.49 m 38.51 177.43 37.74 178.19 36.81 178.19 c +35.87 178.19 35.11 177.43 35.11 176.49 c +35.11 175.56 35.87 174.79 36.81 174.79 c +37.74 174.79 38.51 175.56 38.51 176.49 c +f +0.13 g +[] 0 d +37.94 176.49 m 37.94 177.12 37.43 177.62 36.81 177.62 c +36.18 177.62 35.68 177.12 35.68 176.49 c +35.68 175.87 36.18 175.36 36.81 175.36 c +37.43 175.36 37.94 175.87 37.94 176.49 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +45.71 169.29 m 45.71 170.23 44.94 170.99 44.01 170.99 c +43.07 170.99 42.31 170.23 42.31 169.29 c +42.31 168.36 43.07 167.59 44.01 167.59 c +44.94 167.59 45.71 168.36 45.71 169.29 c +f +0.13 g +[] 0 d +45.14 169.29 m 45.14 169.92 44.63 170.42 44.01 170.42 c +43.38 170.42 42.88 169.92 42.88 169.29 c +42.88 168.67 43.38 168.16 44.01 168.16 c +44.63 168.16 45.14 168.67 45.14 169.29 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +45.71 176.49 m 45.71 177.43 44.94 178.19 44.01 178.19 c +43.07 178.19 42.31 177.43 42.31 176.49 c +42.31 175.56 43.07 174.79 44.01 174.79 c +44.94 174.79 45.71 175.56 45.71 176.49 c +f +0.13 g +[] 0 d +45.14 176.49 m 45.14 177.12 44.63 177.62 44.01 177.62 c +43.38 177.62 42.88 177.12 42.88 176.49 c +42.88 175.87 43.38 175.36 44.01 175.36 c +44.63 175.36 45.14 175.87 45.14 176.49 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +52.91 169.29 m 52.91 170.23 52.14 170.99 51.21 170.99 c +50.27 170.99 49.51 170.23 49.51 169.29 c +49.51 168.36 50.27 167.59 51.21 167.59 c +52.14 167.59 52.91 168.36 52.91 169.29 c +f +0.13 g +[] 0 d +52.34 169.29 m 52.34 169.92 51.83 170.42 51.21 170.42 c +50.58 170.42 50.08 169.92 50.08 169.29 c +50.08 168.67 50.58 168.16 51.21 168.16 c +51.83 168.16 52.34 168.67 52.34 169.29 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +52.91 176.49 m 52.91 177.43 52.14 178.19 51.21 178.19 c +50.27 178.19 49.51 177.43 49.51 176.49 c +49.51 175.56 50.27 174.79 51.21 174.79 c +52.14 174.79 52.91 175.56 52.91 176.49 c +f +0.13 g +[] 0 d +52.34 176.49 m 52.34 177.12 51.83 177.62 51.21 177.62 c +50.58 177.62 50.08 177.12 50.08 176.49 c +50.08 175.87 50.58 175.36 51.21 175.36 c +51.83 175.36 52.34 175.87 52.34 176.49 c +f +1 J +1 j +72 M +0.75 g /a0 gs +[] 0 d +284.558 170.993 m +287.957 170.993 l +287.957 167.594 l +284.558 167.594 l + h +f +0.13 g +[] 0 d +287.39 169.29 m 287.39 169.92 286.88 170.42 286.26 170.42 c +285.63 170.42 285.13 169.92 285.13 169.29 c +285.13 168.67 285.63 168.16 286.26 168.16 c +286.88 168.16 287.39 168.67 287.39 169.29 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +287.96 176.49 m 287.96 177.43 287.20 178.19 286.26 178.19 c +285.32 178.19 284.56 177.43 284.56 176.49 c +284.56 175.56 285.32 174.79 286.26 174.79 c +287.20 174.79 287.96 175.56 287.96 176.49 c +f +0.13 g +[] 0 d +287.39 176.49 m 287.39 177.12 286.88 177.62 286.26 177.62 c +285.63 177.62 285.13 177.12 285.13 176.49 c +285.13 175.87 285.63 175.36 286.26 175.36 c +286.88 175.36 287.39 175.87 287.39 176.49 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +295.16 169.29 m 295.16 170.23 294.40 170.99 293.46 170.99 c +292.52 170.99 291.76 170.23 291.76 169.29 c +291.76 168.36 292.52 167.59 293.46 167.59 c +294.40 167.59 295.16 168.36 295.16 169.29 c +f +0.13 g +[] 0 d +294.59 169.29 m 294.59 169.92 294.08 170.42 293.46 170.42 c +292.83 170.42 292.33 169.92 292.33 169.29 c +292.33 168.67 292.83 168.16 293.46 168.16 c +294.08 168.16 294.59 168.67 294.59 169.29 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +295.16 176.49 m 295.16 177.43 294.40 178.19 293.46 178.19 c +292.52 178.19 291.76 177.43 291.76 176.49 c +291.76 175.56 292.52 174.79 293.46 174.79 c +294.40 174.79 295.16 175.56 295.16 176.49 c +f +0.13 g +[] 0 d +294.59 176.49 m 294.59 177.12 294.08 177.62 293.46 177.62 c +292.83 177.62 292.33 177.12 292.33 176.49 c +292.33 175.87 292.83 175.36 293.46 175.36 c +294.08 175.36 294.59 175.87 294.59 176.49 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +302.36 169.29 m 302.36 170.23 301.60 170.99 300.66 170.99 c +299.72 170.99 298.96 170.23 298.96 169.29 c +298.96 168.36 299.72 167.59 300.66 167.59 c +301.60 167.59 302.36 168.36 302.36 169.29 c +f +0.13 g +[] 0 d +301.79 169.29 m 301.79 169.92 301.28 170.42 300.66 170.42 c +300.03 170.42 299.53 169.92 299.53 169.29 c +299.53 168.67 300.03 168.16 300.66 168.16 c +301.28 168.16 301.79 168.67 301.79 169.29 c +f +1 J +1 j +0.75 g /a0 gs +[] 0 d +302.36 176.49 m 302.36 177.43 301.60 178.19 300.66 178.19 c +299.72 178.19 298.96 177.43 298.96 176.49 c +298.96 175.56 299.72 174.79 300.66 174.79 c +301.60 174.79 302.36 175.56 302.36 176.49 c +f +0.13 g +[] 0 d +301.79 176.49 m 301.79 177.12 301.28 177.62 300.66 177.62 c +300.03 177.62 299.53 177.12 299.53 176.49 c +299.53 175.87 300.03 175.36 300.66 175.36 c +301.28 175.36 301.79 175.87 301.79 176.49 c +f +0.75 g /a0 gs +[] 0 d +79.91 95.46 m 79.91 95.94 79.52 96.33 79.04 96.33 c +78.56 96.33 78.18 95.94 78.18 95.46 c +78.18 94.99 78.56 94.60 79.04 94.60 c +79.52 94.60 79.91 94.99 79.91 95.46 c +f +0.13 g /a0 gs +[] 0 d +79.48 95.46 m 79.48 95.71 79.28 95.90 79.04 95.90 c +78.80 95.90 78.60 95.71 78.60 95.46 c +78.60 95.22 78.80 95.03 79.04 95.03 c +79.28 95.03 79.48 95.22 79.48 95.46 c +f +0.75 g /a0 gs +[] 0 d +178.23 179.29 m 178.23 179.76 177.84 180.15 177.36 180.15 c +176.89 180.15 176.50 179.76 176.50 179.29 c +176.50 178.81 176.89 178.42 177.36 178.42 c +177.84 178.42 178.23 178.81 178.23 179.29 c +f +0.13 g /a0 gs +[] 0 d +177.80 179.29 m 177.80 179.53 177.61 179.73 177.36 179.73 c +177.12 179.73 176.93 179.53 176.93 179.29 c +176.93 179.04 177.12 178.85 177.36 178.85 c +177.61 178.85 177.80 179.04 177.80 179.29 c +f +0.75 g /a0 gs +[] 0 d +181.37 188.54 m 181.37 189.02 180.98 189.40 180.50 189.40 c +180.03 189.40 179.64 189.02 179.64 188.54 c +179.64 188.06 180.03 187.67 180.50 187.67 c +180.98 187.67 181.37 188.06 181.37 188.54 c +f +0.13 g /a0 gs +[] 0 d +180.94 188.54 m 180.94 188.78 180.75 188.98 180.50 188.98 c +180.26 188.98 180.06 188.78 180.06 188.54 c +180.06 188.30 180.26 188.10 180.50 188.10 c +180.75 188.10 180.94 188.30 180.94 188.54 c +f +0.75 g /a0 gs +[] 0 d +88.68 151.63 m 88.68 152.11 88.29 152.50 87.81 152.50 c +87.33 152.50 86.95 152.11 86.95 151.63 c +86.95 151.15 87.33 150.77 87.81 150.77 c +88.29 150.77 88.68 151.15 88.68 151.63 c +f +0.13 g /a0 gs +[] 0 d +88.25 151.63 m 88.25 151.87 88.05 152.07 87.81 152.07 c +87.57 152.07 87.37 151.87 87.37 151.63 c +87.37 151.39 87.57 151.19 87.81 151.19 c +88.05 151.19 88.25 151.39 88.25 151.63 c +f +0.75 g /a0 gs +[] 0 d +157.67 176.64 m 157.67 177.12 157.29 177.51 156.81 177.51 c +156.33 177.51 155.94 177.12 155.94 176.64 c +155.94 176.17 156.33 175.78 156.81 175.78 c +157.29 175.78 157.67 176.17 157.67 176.64 c +f +0.13 g /a0 gs +[] 0 d +157.25 176.64 m 157.25 176.89 157.05 177.08 156.81 177.08 c +156.57 177.08 156.37 176.89 156.37 176.64 c +156.37 176.40 156.57 176.21 156.81 176.21 c +157.05 176.21 157.25 176.40 157.25 176.64 c +f +0.75 g /a0 gs +[] 0 d +180.66 148.09 m 180.66 148.57 180.27 148.95 179.79 148.95 c +179.31 148.95 178.93 148.57 178.93 148.09 c +178.93 147.61 179.31 147.23 179.79 147.23 c +180.27 147.23 180.66 147.61 180.66 148.09 c +f +0.13 g /a0 gs +[] 0 d +180.23 148.09 m 180.23 148.33 180.03 148.53 179.79 148.53 c +179.55 148.53 179.35 148.33 179.35 148.09 c +179.35 147.85 179.55 147.65 179.79 147.65 c +180.03 147.65 180.23 147.85 180.23 148.09 c +f +0.75 g /a0 gs +[] 0 d +181.58 173.65 m 181.58 174.13 181.19 174.51 180.71 174.51 c +180.24 174.51 179.85 174.13 179.85 173.65 c +179.85 173.17 180.24 172.79 180.71 172.79 c +181.19 172.79 181.58 173.17 181.58 173.65 c +f +0.13 g /a0 gs +[] 0 d +181.15 173.65 m 181.15 173.89 180.96 174.09 180.71 174.09 c +180.47 174.09 180.27 173.89 180.27 173.65 c +180.27 173.41 180.47 173.21 180.71 173.21 c +180.96 173.21 181.15 173.41 181.15 173.65 c +f +0.75 g /a0 gs +[] 0 d +144.43 144.55 m 144.43 145.02 144.05 145.41 143.57 145.41 c +143.09 145.41 142.70 145.02 142.70 144.55 c +142.70 144.07 143.09 143.68 143.57 143.68 c +144.05 143.68 144.43 144.07 144.43 144.55 c +f +0.13 g /a0 gs +[] 0 d +144.01 144.55 m 144.01 144.79 143.81 144.99 143.57 144.99 c +143.33 144.99 143.13 144.79 143.13 144.55 c +143.13 144.30 143.33 144.11 143.57 144.11 c +143.81 144.11 144.01 144.30 144.01 144.55 c +f +0.75 g /a0 gs +[] 0 d +158.26 169.80 m 158.26 170.28 157.87 170.66 157.39 170.66 c +156.91 170.66 156.53 170.28 156.53 169.80 c +156.53 169.32 156.91 168.93 157.39 168.93 c +157.87 168.93 158.26 169.32 158.26 169.80 c +f +0.13 g /a0 gs +[] 0 d +157.83 169.80 m 157.83 170.04 157.63 170.24 157.39 170.24 c +157.15 170.24 156.95 170.04 156.95 169.80 c +156.95 169.55 157.15 169.36 157.39 169.36 c +157.63 169.36 157.83 169.55 157.83 169.80 c +f +0.75 g /a0 gs +[] 0 d +225.60 174.51 m 225.60 174.98 225.21 175.37 224.73 175.37 c +224.26 175.37 223.87 174.98 223.87 174.51 c +223.87 174.03 224.26 173.64 224.73 173.64 c +225.21 173.64 225.60 174.03 225.60 174.51 c +f +0.13 g /a0 gs +[] 0 d +225.17 174.51 m 225.17 174.75 224.98 174.95 224.73 174.95 c +224.49 174.95 224.29 174.75 224.29 174.51 c +224.29 174.26 224.49 174.07 224.73 174.07 c +224.98 174.07 225.17 174.26 225.17 174.51 c +f +0.75 g /a0 gs +[] 0 d +187.81 162.26 m 187.81 162.74 187.43 163.12 186.95 163.12 c +186.47 163.12 186.08 162.74 186.08 162.26 c +186.08 161.78 186.47 161.39 186.95 161.39 c +187.43 161.39 187.81 161.78 187.81 162.26 c +f +0.13 g /a0 gs +[] 0 d +187.39 162.26 m 187.39 162.50 187.19 162.70 186.95 162.70 c +186.71 162.70 186.51 162.50 186.51 162.26 c +186.51 162.02 186.71 161.82 186.95 161.82 c +187.19 161.82 187.39 162.02 187.39 162.26 c +f +0.75 g /a0 gs +[] 0 d +144.30 189.14 m 144.30 189.62 143.92 190.01 143.44 190.01 c +142.96 190.01 142.57 189.62 142.57 189.14 c +142.57 188.67 142.96 188.28 143.44 188.28 c +143.92 188.28 144.30 188.67 144.30 189.14 c +f +0.13 g /a0 gs +[] 0 d +143.88 189.14 m 143.88 189.39 143.68 189.58 143.44 189.58 c +143.20 189.58 143.00 189.39 143.00 189.14 c +143.00 188.90 143.20 188.70 143.44 188.70 c +143.68 188.70 143.88 188.90 143.88 189.14 c +f +0.75 g /a0 gs +[] 0 d +143.70 172.25 m 143.70 172.73 143.31 173.12 142.83 173.12 c +142.36 173.12 141.97 172.73 141.97 172.25 c +141.97 171.78 142.36 171.39 142.83 171.39 c +143.31 171.39 143.70 171.78 143.70 172.25 c +f +0.13 g /a0 gs +[] 0 d +143.27 172.25 m 143.27 172.50 143.08 172.69 142.83 172.69 c +142.59 172.69 142.39 172.50 142.39 172.25 c +142.39 172.01 142.59 171.81 142.83 171.81 c +143.08 171.81 143.27 172.01 143.27 172.25 c +f +0.75 g /a0 gs +[] 0 d +201.69 176.28 m 201.69 176.76 201.31 177.15 200.83 177.15 c +200.35 177.15 199.97 176.76 199.97 176.28 c +199.97 175.81 200.35 175.42 200.83 175.42 c +201.31 175.42 201.69 175.81 201.69 176.28 c +f +0.13 g /a0 gs +[] 0 d +201.27 176.28 m 201.27 176.53 201.07 176.72 200.83 176.72 c +200.59 176.72 200.39 176.53 200.39 176.28 c +200.39 176.04 200.59 175.85 200.83 175.85 c +201.07 175.85 201.27 176.04 201.27 176.28 c +f +0.75 g /a0 gs +[] 0 d +77.63 165.65 m 77.63 166.13 77.24 166.51 76.77 166.51 c +76.29 166.51 75.90 166.13 75.90 165.65 c +75.90 165.17 76.29 164.79 76.77 164.79 c +77.24 164.79 77.63 165.17 77.63 165.65 c +f +0.13 g /a0 gs +[] 0 d +77.21 165.65 m 77.21 165.89 77.01 166.09 76.77 166.09 c +76.52 166.09 76.33 165.89 76.33 165.65 c +76.33 165.41 76.52 165.21 76.77 165.21 c +77.01 165.21 77.21 165.41 77.21 165.65 c +f +0.75 g /a0 gs +[] 0 d +210.07 182.30 m 210.07 182.78 209.69 183.17 209.21 183.17 c +208.73 183.17 208.35 182.78 208.35 182.30 c +208.35 181.83 208.73 181.44 209.21 181.44 c +209.69 181.44 210.07 181.83 210.07 182.30 c +f +0.13 g /a0 gs +[] 0 d +209.65 182.30 m 209.65 182.55 209.45 182.74 209.21 182.74 c +208.97 182.74 208.77 182.55 208.77 182.30 c +208.77 182.06 208.97 181.86 209.21 181.86 c +209.45 181.86 209.65 182.06 209.65 182.30 c +f +0.75 g /a0 gs +[] 0 d +296.42 184.23 m 296.42 184.70 296.04 185.09 295.56 185.09 c +295.08 185.09 294.70 184.70 294.70 184.23 c +294.70 183.75 295.08 183.36 295.56 183.36 c +296.04 183.36 296.42 183.75 296.42 184.23 c +f +0.13 g /a0 gs +[] 0 d +296.00 184.23 m 296.00 184.47 295.80 184.67 295.56 184.67 c +295.32 184.67 295.12 184.47 295.12 184.23 c +295.12 183.98 295.32 183.79 295.56 183.79 c +295.80 183.79 296.00 183.98 296.00 184.23 c +f +0.75 g /a0 gs +[] 0 d +169.60 82.73 m 169.60 83.21 169.21 83.60 168.73 83.60 c +168.25 83.60 167.87 83.21 167.87 82.73 c +167.87 82.26 168.25 81.87 168.73 81.87 c +169.21 81.87 169.60 82.26 169.60 82.73 c +f +0.13 g /a0 gs +[] 0 d +169.17 82.73 m 169.17 82.98 168.97 83.17 168.73 83.17 c +168.49 83.17 168.29 82.98 168.29 82.73 c +168.29 82.49 168.49 82.29 168.73 82.29 c +168.97 82.29 169.17 82.49 169.17 82.73 c +f +0.75 g /a0 gs +[] 0 d +172.60 82.73 m 172.60 83.21 172.21 83.60 171.73 83.60 c +171.26 83.60 170.87 83.21 170.87 82.73 c +170.87 82.26 171.26 81.87 171.73 81.87 c +172.21 81.87 172.60 82.26 172.60 82.73 c +f +0.13 g /a0 gs +[] 0 d +172.17 82.73 m 172.17 82.98 171.98 83.17 171.73 83.17 c +171.49 83.17 171.30 82.98 171.30 82.73 c +171.30 82.49 171.49 82.29 171.73 82.29 c +171.98 82.29 172.17 82.49 172.17 82.73 c +f +0.75 g /a0 gs +[] 0 d +202.82 31.16 m 202.82 31.64 202.44 32.03 201.96 32.03 c +201.48 32.03 201.10 31.64 201.10 31.16 c +201.10 30.68 201.48 30.30 201.96 30.30 c +202.44 30.30 202.82 30.68 202.82 31.16 c +f +0.13 g /a0 gs +[] 0 d +202.40 31.16 m 202.40 31.40 202.20 31.60 201.96 31.60 c +201.72 31.60 201.52 31.40 201.52 31.16 c +201.52 30.92 201.72 30.72 201.96 30.72 c +202.20 30.72 202.40 30.92 202.40 31.16 c +f +0.75 g /a0 gs +[] 0 d +211.33 31.16 m 211.33 31.64 210.94 32.03 210.46 32.03 c +209.99 32.03 209.60 31.64 209.60 31.16 c +209.60 30.68 209.99 30.30 210.46 30.30 c +210.94 30.30 211.33 30.68 211.33 31.16 c +f +0.13 g /a0 gs +[] 0 d +210.90 31.16 m 210.90 31.40 210.71 31.60 210.46 31.60 c +210.22 31.60 210.02 31.40 210.02 31.16 c +210.02 30.92 210.22 30.72 210.46 30.72 c +210.71 30.72 210.90 30.92 210.90 31.16 c +f +0.75 g /a0 gs +[] 0 d +219.83 31.16 m 219.83 31.64 219.45 32.03 218.97 32.03 c +218.49 32.03 218.10 31.64 218.10 31.16 c +218.10 30.68 218.49 30.30 218.97 30.30 c +219.45 30.30 219.83 30.68 219.83 31.16 c +f +0.13 g /a0 gs +[] 0 d +219.41 31.16 m 219.41 31.40 219.21 31.60 218.97 31.60 c +218.73 31.60 218.53 31.40 218.53 31.16 c +218.53 30.92 218.73 30.72 218.97 30.72 c +219.21 30.72 219.41 30.92 219.41 31.16 c +f +0.75 g /a0 gs +[] 0 d +228.34 31.16 m 228.34 31.64 227.95 32.03 227.47 32.03 c +226.99 32.03 226.61 31.64 226.61 31.16 c +226.61 30.68 226.99 30.30 227.47 30.30 c +227.95 30.30 228.34 30.68 228.34 31.16 c +f +0.13 g /a0 gs +[] 0 d +227.91 31.16 m 227.91 31.40 227.71 31.60 227.47 31.60 c +227.23 31.60 227.03 31.40 227.03 31.16 c +227.03 30.92 227.23 30.72 227.47 30.72 c +227.71 30.72 227.91 30.92 227.91 31.16 c +f +0.75 g /a0 gs +[] 0 d +236.84 31.16 m 236.84 31.64 236.45 32.03 235.98 32.03 c +235.50 32.03 235.11 31.64 235.11 31.16 c +235.11 30.68 235.50 30.30 235.98 30.30 c +236.45 30.30 236.84 30.68 236.84 31.16 c +f +0.13 g /a0 gs +[] 0 d +236.42 31.16 m 236.42 31.40 236.22 31.60 235.98 31.60 c +235.73 31.60 235.54 31.40 235.54 31.16 c +235.54 30.92 235.73 30.72 235.98 30.72 c +236.22 30.72 236.42 30.92 236.42 31.16 c +f +0.75 g /a0 gs +[] 0 d +245.34 31.16 m 245.34 31.64 244.96 32.03 244.48 32.03 c +244.00 32.03 243.62 31.64 243.62 31.16 c +243.62 30.68 244.00 30.30 244.48 30.30 c +244.96 30.30 245.34 30.68 245.34 31.16 c +f +0.13 g /a0 gs +[] 0 d +244.92 31.16 m 244.92 31.40 244.72 31.60 244.48 31.60 c +244.24 31.60 244.04 31.40 244.04 31.16 c +244.04 30.92 244.24 30.72 244.48 30.72 c +244.72 30.72 244.92 30.92 244.92 31.16 c +f +0.75 g /a0 gs +[] 0 d +253.85 31.16 m 253.85 31.64 253.46 32.03 252.98 32.03 c +252.51 32.03 252.12 31.64 252.12 31.16 c +252.12 30.68 252.51 30.30 252.98 30.30 c +253.46 30.30 253.85 30.68 253.85 31.16 c +f +0.13 g /a0 gs +[] 0 d +253.42 31.16 m 253.42 31.40 253.23 31.60 252.98 31.60 c +252.74 31.60 252.54 31.40 252.54 31.16 c +252.54 30.92 252.74 30.72 252.98 30.72 c +253.23 30.72 253.42 30.92 253.42 31.16 c +f +0.75 g /a0 gs +[] 0 d +262.35 31.16 m 262.35 31.64 261.96 32.03 261.49 32.03 c +261.01 32.03 260.62 31.64 260.62 31.16 c +260.62 30.68 261.01 30.30 261.49 30.30 c +261.96 30.30 262.35 30.68 262.35 31.16 c +f +0.13 g /a0 gs +[] 0 d +261.93 31.16 m 261.93 31.40 261.73 31.60 261.49 31.60 c +261.24 31.60 261.05 31.40 261.05 31.16 c +261.05 30.92 261.24 30.72 261.49 30.72 c +261.73 30.72 261.93 30.92 261.93 31.16 c +f +0.75 g /a0 gs +[] 0 d +270.86 31.16 m 270.86 31.64 270.47 32.03 269.99 32.03 c +269.51 32.03 269.13 31.64 269.13 31.16 c +269.13 30.68 269.51 30.30 269.99 30.30 c +270.47 30.30 270.86 30.68 270.86 31.16 c +f +0.13 g /a0 gs +[] 0 d +270.43 31.16 m 270.43 31.40 270.23 31.60 269.99 31.60 c +269.75 31.60 269.55 31.40 269.55 31.16 c +269.55 30.92 269.75 30.72 269.99 30.72 c +270.23 30.72 270.43 30.92 270.43 31.16 c +f +0.75 g /a0 gs +[] 0 d +279.36 31.16 m 279.36 31.64 278.97 32.03 278.50 32.03 c +278.02 32.03 277.63 31.64 277.63 31.16 c +277.63 30.68 278.02 30.30 278.50 30.30 c +278.97 30.30 279.36 30.68 279.36 31.16 c +f +0.13 g /a0 gs +[] 0 d +278.93 31.16 m 278.93 31.40 278.74 31.60 278.50 31.60 c +278.25 31.60 278.06 31.40 278.06 31.16 c +278.06 30.92 278.25 30.72 278.50 30.72 c +278.74 30.72 278.93 30.92 278.93 31.16 c +f +0.75 g /a0 gs +[] 0 d +287.86 31.16 m 287.86 31.64 287.48 32.03 287.00 32.03 c +286.52 32.03 286.13 31.64 286.13 31.16 c +286.13 30.68 286.52 30.30 287.00 30.30 c +287.48 30.30 287.86 30.68 287.86 31.16 c +f +0.13 g /a0 gs +[] 0 d +287.44 31.16 m 287.44 31.40 287.24 31.60 287.00 31.60 c +286.76 31.60 286.56 31.40 286.56 31.16 c +286.56 30.92 286.76 30.72 287.00 30.72 c +287.24 30.72 287.44 30.92 287.44 31.16 c +f +0.75 g /a0 gs +[] 0 d +287.86 59.51 m 287.86 59.99 287.48 60.37 287.00 60.37 c +286.52 60.37 286.13 59.99 286.13 59.51 c +286.13 59.03 286.52 58.64 287.00 58.64 c +287.48 58.64 287.86 59.03 287.86 59.51 c +f +0.13 g /a0 gs +[] 0 d +287.44 59.51 m 287.44 59.75 287.24 59.95 287.00 59.95 c +286.76 59.95 286.56 59.75 286.56 59.51 c +286.56 59.27 286.76 59.07 287.00 59.07 c +287.24 59.07 287.44 59.27 287.44 59.51 c +f +0.75 g /a0 gs +[] 0 d +279.36 59.51 m 279.36 59.99 278.97 60.37 278.50 60.37 c +278.02 60.37 277.63 59.99 277.63 59.51 c +277.63 59.03 278.02 58.64 278.50 58.64 c +278.97 58.64 279.36 59.03 279.36 59.51 c +f +0.13 g /a0 gs +[] 0 d +278.93 59.51 m 278.93 59.75 278.74 59.95 278.50 59.95 c +278.25 59.95 278.06 59.75 278.06 59.51 c +278.06 59.27 278.25 59.07 278.50 59.07 c +278.74 59.07 278.93 59.27 278.93 59.51 c +f +0.75 g /a0 gs +[] 0 d +270.86 59.51 m 270.86 59.99 270.47 60.37 269.99 60.37 c +269.51 60.37 269.13 59.99 269.13 59.51 c +269.13 59.03 269.51 58.64 269.99 58.64 c +270.47 58.64 270.86 59.03 270.86 59.51 c +f +0.13 g /a0 gs +[] 0 d +270.43 59.51 m 270.43 59.75 270.23 59.95 269.99 59.95 c +269.75 59.95 269.55 59.75 269.55 59.51 c +269.55 59.27 269.75 59.07 269.99 59.07 c +270.23 59.07 270.43 59.27 270.43 59.51 c +f +0.75 g /a0 gs +[] 0 d +262.35 59.51 m 262.35 59.99 261.96 60.37 261.49 60.37 c +261.01 60.37 260.62 59.99 260.62 59.51 c +260.62 59.03 261.01 58.64 261.49 58.64 c +261.96 58.64 262.35 59.03 262.35 59.51 c +f +0.13 g /a0 gs +[] 0 d +261.93 59.51 m 261.93 59.75 261.73 59.95 261.49 59.95 c +261.24 59.95 261.05 59.75 261.05 59.51 c +261.05 59.27 261.24 59.07 261.49 59.07 c +261.73 59.07 261.93 59.27 261.93 59.51 c +f +0.75 g /a0 gs +[] 0 d +253.85 59.51 m 253.85 59.99 253.46 60.37 252.98 60.37 c +252.51 60.37 252.12 59.99 252.12 59.51 c +252.12 59.03 252.51 58.64 252.98 58.64 c +253.46 58.64 253.85 59.03 253.85 59.51 c +f +0.13 g /a0 gs +[] 0 d +253.42 59.51 m 253.42 59.75 253.23 59.95 252.98 59.95 c +252.74 59.95 252.54 59.75 252.54 59.51 c +252.54 59.27 252.74 59.07 252.98 59.07 c +253.23 59.07 253.42 59.27 253.42 59.51 c +f +0.75 g /a0 gs +[] 0 d +245.34 59.51 m 245.34 59.99 244.96 60.37 244.48 60.37 c +244.00 60.37 243.62 59.99 243.62 59.51 c +243.62 59.03 244.00 58.64 244.48 58.64 c +244.96 58.64 245.34 59.03 245.34 59.51 c +f +0.13 g /a0 gs +[] 0 d +244.92 59.51 m 244.92 59.75 244.72 59.95 244.48 59.95 c +244.24 59.95 244.04 59.75 244.04 59.51 c +244.04 59.27 244.24 59.07 244.48 59.07 c +244.72 59.07 244.92 59.27 244.92 59.51 c +f +0.75 g /a0 gs +[] 0 d +236.84 59.51 m 236.84 59.99 236.45 60.37 235.98 60.37 c +235.50 60.37 235.11 59.99 235.11 59.51 c +235.11 59.03 235.50 58.64 235.98 58.64 c +236.45 58.64 236.84 59.03 236.84 59.51 c +f +0.13 g /a0 gs +[] 0 d +236.42 59.51 m 236.42 59.75 236.22 59.95 235.98 59.95 c +235.73 59.95 235.54 59.75 235.54 59.51 c +235.54 59.27 235.73 59.07 235.98 59.07 c +236.22 59.07 236.42 59.27 236.42 59.51 c +f +0.75 g /a0 gs +[] 0 d +228.34 59.51 m 228.34 59.99 227.95 60.37 227.47 60.37 c +226.99 60.37 226.61 59.99 226.61 59.51 c +226.61 59.03 226.99 58.64 227.47 58.64 c +227.95 58.64 228.34 59.03 228.34 59.51 c +f +0.13 g /a0 gs +[] 0 d +227.91 59.51 m 227.91 59.75 227.71 59.95 227.47 59.95 c +227.23 59.95 227.03 59.75 227.03 59.51 c +227.03 59.27 227.23 59.07 227.47 59.07 c +227.71 59.07 227.91 59.27 227.91 59.51 c +f +0.75 g /a0 gs +[] 0 d +219.83 59.51 m 219.83 59.99 219.45 60.37 218.97 60.37 c +218.49 60.37 218.10 59.99 218.10 59.51 c +218.10 59.03 218.49 58.64 218.97 58.64 c +219.45 58.64 219.83 59.03 219.83 59.51 c +f +0.13 g /a0 gs +[] 0 d +219.41 59.51 m 219.41 59.75 219.21 59.95 218.97 59.95 c +218.73 59.95 218.53 59.75 218.53 59.51 c +218.53 59.27 218.73 59.07 218.97 59.07 c +219.21 59.07 219.41 59.27 219.41 59.51 c +f +0.75 g /a0 gs +[] 0 d +211.33 59.51 m 211.33 59.99 210.94 60.37 210.46 60.37 c +209.99 60.37 209.60 59.99 209.60 59.51 c +209.60 59.03 209.99 58.64 210.46 58.64 c +210.94 58.64 211.33 59.03 211.33 59.51 c +f +0.13 g /a0 gs +[] 0 d +210.90 59.51 m 210.90 59.75 210.71 59.95 210.46 59.95 c +210.22 59.95 210.02 59.75 210.02 59.51 c +210.02 59.27 210.22 59.07 210.46 59.07 c +210.71 59.07 210.90 59.27 210.90 59.51 c +f +0.75 g /a0 gs +[] 0 d +202.82 59.51 m 202.82 59.99 202.44 60.37 201.96 60.37 c +201.48 60.37 201.10 59.99 201.10 59.51 c +201.10 59.03 201.48 58.64 201.96 58.64 c +202.44 58.64 202.82 59.03 202.82 59.51 c +f +0.13 g /a0 gs +[] 0 d +202.40 59.51 m 202.40 59.75 202.20 59.95 201.96 59.95 c +201.72 59.95 201.52 59.75 201.52 59.51 c +201.52 59.27 201.72 59.07 201.96 59.07 c +202.20 59.07 202.40 59.27 202.40 59.51 c +f +0.75 g /a0 gs +[] 0 d +279.36 87.85 m 279.36 88.33 278.97 88.72 278.50 88.72 c +278.02 88.72 277.63 88.33 277.63 87.85 c +277.63 87.38 278.02 86.99 278.50 86.99 c +278.97 86.99 279.36 87.38 279.36 87.85 c +f +0.13 g /a0 gs +[] 0 d +278.93 87.85 m 278.93 88.10 278.74 88.29 278.50 88.29 c +278.25 88.29 278.06 88.10 278.06 87.85 c +278.06 87.61 278.25 87.42 278.50 87.42 c +278.74 87.42 278.93 87.61 278.93 87.85 c +f +0.75 g /a0 gs +[] 0 d +270.86 87.85 m 270.86 88.33 270.47 88.72 269.99 88.72 c +269.51 88.72 269.13 88.33 269.13 87.85 c +269.13 87.38 269.51 86.99 269.99 86.99 c +270.47 86.99 270.86 87.38 270.86 87.85 c +f +0.13 g /a0 gs +[] 0 d +270.43 87.85 m 270.43 88.10 270.23 88.29 269.99 88.29 c +269.75 88.29 269.55 88.10 269.55 87.85 c +269.55 87.61 269.75 87.42 269.99 87.42 c +270.23 87.42 270.43 87.61 270.43 87.85 c +f +0.75 g /a0 gs +[] 0 d +262.35 87.85 m 262.35 88.33 261.96 88.72 261.49 88.72 c +261.01 88.72 260.62 88.33 260.62 87.85 c +260.62 87.38 261.01 86.99 261.49 86.99 c +261.96 86.99 262.35 87.38 262.35 87.85 c +f +0.13 g /a0 gs +[] 0 d +261.93 87.85 m 261.93 88.10 261.73 88.29 261.49 88.29 c +261.24 88.29 261.05 88.10 261.05 87.85 c +261.05 87.61 261.24 87.42 261.49 87.42 c +261.73 87.42 261.93 87.61 261.93 87.85 c +f +0.75 g /a0 gs +[] 0 d +253.85 87.85 m 253.85 88.33 253.46 88.72 252.98 88.72 c +252.51 88.72 252.12 88.33 252.12 87.85 c +252.12 87.38 252.51 86.99 252.98 86.99 c +253.46 86.99 253.85 87.38 253.85 87.85 c +f +0.13 g /a0 gs +[] 0 d +253.42 87.85 m 253.42 88.10 253.23 88.29 252.98 88.29 c +252.74 88.29 252.54 88.10 252.54 87.85 c +252.54 87.61 252.74 87.42 252.98 87.42 c +253.23 87.42 253.42 87.61 253.42 87.85 c +f +0.75 g /a0 gs +[] 0 d +245.34 87.85 m 245.34 88.33 244.96 88.72 244.48 88.72 c +244.00 88.72 243.62 88.33 243.62 87.85 c +243.62 87.38 244.00 86.99 244.48 86.99 c +244.96 86.99 245.34 87.38 245.34 87.85 c +f +0.13 g /a0 gs +[] 0 d +244.92 87.85 m 244.92 88.10 244.72 88.29 244.48 88.29 c +244.24 88.29 244.04 88.10 244.04 87.85 c +244.04 87.61 244.24 87.42 244.48 87.42 c +244.72 87.42 244.92 87.61 244.92 87.85 c +f +0.75 g /a0 gs +[] 0 d +236.84 87.85 m 236.84 88.33 236.45 88.72 235.98 88.72 c +235.50 88.72 235.11 88.33 235.11 87.85 c +235.11 87.38 235.50 86.99 235.98 86.99 c +236.45 86.99 236.84 87.38 236.84 87.85 c +f +0.13 g /a0 gs +[] 0 d +236.42 87.85 m 236.42 88.10 236.22 88.29 235.98 88.29 c +235.73 88.29 235.54 88.10 235.54 87.85 c +235.54 87.61 235.73 87.42 235.98 87.42 c +236.22 87.42 236.42 87.61 236.42 87.85 c +f +0.75 g /a0 gs +[] 0 d +228.34 87.85 m 228.34 88.33 227.95 88.72 227.47 88.72 c +226.99 88.72 226.61 88.33 226.61 87.85 c +226.61 87.38 226.99 86.99 227.47 86.99 c +227.95 86.99 228.34 87.38 228.34 87.85 c +f +0.13 g /a0 gs +[] 0 d +227.91 87.85 m 227.91 88.10 227.71 88.29 227.47 88.29 c +227.23 88.29 227.03 88.10 227.03 87.85 c +227.03 87.61 227.23 87.42 227.47 87.42 c +227.71 87.42 227.91 87.61 227.91 87.85 c +f +0.75 g /a0 gs +[] 0 d +219.83 87.85 m 219.83 88.33 219.45 88.72 218.97 88.72 c +218.49 88.72 218.10 88.33 218.10 87.85 c +218.10 87.38 218.49 86.99 218.97 86.99 c +219.45 86.99 219.83 87.38 219.83 87.85 c +f +0.13 g /a0 gs +[] 0 d +219.41 87.85 m 219.41 88.10 219.21 88.29 218.97 88.29 c +218.73 88.29 218.53 88.10 218.53 87.85 c +218.53 87.61 218.73 87.42 218.97 87.42 c +219.21 87.42 219.41 87.61 219.41 87.85 c +f +0.75 g /a0 gs +[] 0 d +211.33 87.85 m 211.33 88.33 210.94 88.72 210.46 88.72 c +209.99 88.72 209.60 88.33 209.60 87.85 c +209.60 87.38 209.99 86.99 210.46 86.99 c +210.94 86.99 211.33 87.38 211.33 87.85 c +f +0.13 g /a0 gs +[] 0 d +210.90 87.85 m 210.90 88.10 210.71 88.29 210.46 88.29 c +210.22 88.29 210.02 88.10 210.02 87.85 c +210.02 87.61 210.22 87.42 210.46 87.42 c +210.71 87.42 210.90 87.61 210.90 87.85 c +f +0.75 g /a0 gs +[] 0 d +202.82 87.85 m 202.82 88.33 202.44 88.72 201.96 88.72 c +201.48 88.72 201.10 88.33 201.10 87.85 c +201.10 87.38 201.48 86.99 201.96 86.99 c +202.44 86.99 202.82 87.38 202.82 87.85 c +f +0.13 g /a0 gs +[] 0 d +202.40 87.85 m 202.40 88.10 202.20 88.29 201.96 88.29 c +201.72 88.29 201.52 88.10 201.52 87.85 c +201.52 87.61 201.72 87.42 201.96 87.42 c +202.20 87.42 202.40 87.61 202.40 87.85 c +f +0.75 g /a0 gs +[] 0 d +279.36 73.68 m 279.36 74.16 278.97 74.55 278.50 74.55 c +278.02 74.55 277.63 74.16 277.63 73.68 c +277.63 73.20 278.02 72.82 278.50 72.82 c +278.97 72.82 279.36 73.20 279.36 73.68 c +f +0.13 g /a0 gs +[] 0 d +278.93 73.68 m 278.93 73.92 278.74 74.12 278.50 74.12 c +278.25 74.12 278.06 73.92 278.06 73.68 c +278.06 73.44 278.25 73.24 278.50 73.24 c +278.74 73.24 278.93 73.44 278.93 73.68 c +f +0.75 g /a0 gs +[] 0 d +270.86 73.68 m 270.86 74.16 270.47 74.55 269.99 74.55 c +269.51 74.55 269.13 74.16 269.13 73.68 c +269.13 73.20 269.51 72.82 269.99 72.82 c +270.47 72.82 270.86 73.20 270.86 73.68 c +f +0.13 g /a0 gs +[] 0 d +270.43 73.68 m 270.43 73.92 270.23 74.12 269.99 74.12 c +269.75 74.12 269.55 73.92 269.55 73.68 c +269.55 73.44 269.75 73.24 269.99 73.24 c +270.23 73.24 270.43 73.44 270.43 73.68 c +f +0.75 g /a0 gs +[] 0 d +262.35 73.68 m 262.35 74.16 261.96 74.55 261.49 74.55 c +261.01 74.55 260.62 74.16 260.62 73.68 c +260.62 73.20 261.01 72.82 261.49 72.82 c +261.96 72.82 262.35 73.20 262.35 73.68 c +f +0.13 g /a0 gs +[] 0 d +261.93 73.68 m 261.93 73.92 261.73 74.12 261.49 74.12 c +261.24 74.12 261.05 73.92 261.05 73.68 c +261.05 73.44 261.24 73.24 261.49 73.24 c +261.73 73.24 261.93 73.44 261.93 73.68 c +f +0.75 g /a0 gs +[] 0 d +253.85 73.68 m 253.85 74.16 253.46 74.55 252.98 74.55 c +252.51 74.55 252.12 74.16 252.12 73.68 c +252.12 73.20 252.51 72.82 252.98 72.82 c +253.46 72.82 253.85 73.20 253.85 73.68 c +f +0.13 g /a0 gs +[] 0 d +253.42 73.68 m 253.42 73.92 253.23 74.12 252.98 74.12 c +252.74 74.12 252.54 73.92 252.54 73.68 c +252.54 73.44 252.74 73.24 252.98 73.24 c +253.23 73.24 253.42 73.44 253.42 73.68 c +f +0.75 g /a0 gs +[] 0 d +245.34 73.68 m 245.34 74.16 244.96 74.55 244.48 74.55 c +244.00 74.55 243.62 74.16 243.62 73.68 c +243.62 73.20 244.00 72.82 244.48 72.82 c +244.96 72.82 245.34 73.20 245.34 73.68 c +f +0.13 g /a0 gs +[] 0 d +244.92 73.68 m 244.92 73.92 244.72 74.12 244.48 74.12 c +244.24 74.12 244.04 73.92 244.04 73.68 c +244.04 73.44 244.24 73.24 244.48 73.24 c +244.72 73.24 244.92 73.44 244.92 73.68 c +f +0.75 g /a0 gs +[] 0 d +236.84 73.68 m 236.84 74.16 236.45 74.55 235.98 74.55 c +235.50 74.55 235.11 74.16 235.11 73.68 c +235.11 73.20 235.50 72.82 235.98 72.82 c +236.45 72.82 236.84 73.20 236.84 73.68 c +f +0.13 g /a0 gs +[] 0 d +236.42 73.68 m 236.42 73.92 236.22 74.12 235.98 74.12 c +235.73 74.12 235.54 73.92 235.54 73.68 c +235.54 73.44 235.73 73.24 235.98 73.24 c +236.22 73.24 236.42 73.44 236.42 73.68 c +f +0.75 g /a0 gs +[] 0 d +228.34 73.68 m 228.34 74.16 227.95 74.55 227.47 74.55 c +226.99 74.55 226.61 74.16 226.61 73.68 c +226.61 73.20 226.99 72.82 227.47 72.82 c +227.95 72.82 228.34 73.20 228.34 73.68 c +f +0.13 g /a0 gs +[] 0 d +227.91 73.68 m 227.91 73.92 227.71 74.12 227.47 74.12 c +227.23 74.12 227.03 73.92 227.03 73.68 c +227.03 73.44 227.23 73.24 227.47 73.24 c +227.71 73.24 227.91 73.44 227.91 73.68 c +f +0.75 g /a0 gs +[] 0 d +219.83 73.68 m 219.83 74.16 219.45 74.55 218.97 74.55 c +218.49 74.55 218.10 74.16 218.10 73.68 c +218.10 73.20 218.49 72.82 218.97 72.82 c +219.45 72.82 219.83 73.20 219.83 73.68 c +f +0.13 g /a0 gs +[] 0 d +219.41 73.68 m 219.41 73.92 219.21 74.12 218.97 74.12 c +218.73 74.12 218.53 73.92 218.53 73.68 c +218.53 73.44 218.73 73.24 218.97 73.24 c +219.21 73.24 219.41 73.44 219.41 73.68 c +f +0.75 g /a0 gs +[] 0 d +211.33 73.68 m 211.33 74.16 210.94 74.55 210.46 74.55 c +209.99 74.55 209.60 74.16 209.60 73.68 c +209.60 73.20 209.99 72.82 210.46 72.82 c +210.94 72.82 211.33 73.20 211.33 73.68 c +f +0.13 g /a0 gs +[] 0 d +210.90 73.68 m 210.90 73.92 210.71 74.12 210.46 74.12 c +210.22 74.12 210.02 73.92 210.02 73.68 c +210.02 73.44 210.22 73.24 210.46 73.24 c +210.71 73.24 210.90 73.44 210.90 73.68 c +f +0.75 g /a0 gs +[] 0 d +202.82 73.68 m 202.82 74.16 202.44 74.55 201.96 74.55 c +201.48 74.55 201.10 74.16 201.10 73.68 c +201.10 73.20 201.48 72.82 201.96 72.82 c +202.44 72.82 202.82 73.20 202.82 73.68 c +f +0.13 g /a0 gs +[] 0 d +202.40 73.68 m 202.40 73.92 202.20 74.12 201.96 74.12 c +201.72 74.12 201.52 73.92 201.52 73.68 c +201.52 73.44 201.72 73.24 201.96 73.24 c +202.20 73.24 202.40 73.44 202.40 73.68 c +f +0.75 g /a0 gs +[] 0 d +287.86 45.33 m 287.86 45.81 287.48 46.20 287.00 46.20 c +286.52 46.20 286.13 45.81 286.13 45.33 c +286.13 44.86 286.52 44.47 287.00 44.47 c +287.48 44.47 287.86 44.86 287.86 45.33 c +f +0.13 g /a0 gs +[] 0 d +287.44 45.33 m 287.44 45.58 287.24 45.77 287.00 45.77 c +286.76 45.77 286.56 45.58 286.56 45.33 c +286.56 45.09 286.76 44.90 287.00 44.90 c +287.24 44.90 287.44 45.09 287.44 45.33 c +f +0.75 g /a0 gs +[] 0 d +279.36 45.33 m 279.36 45.81 278.97 46.20 278.50 46.20 c +278.02 46.20 277.63 45.81 277.63 45.33 c +277.63 44.86 278.02 44.47 278.50 44.47 c +278.97 44.47 279.36 44.86 279.36 45.33 c +f +0.13 g /a0 gs +[] 0 d +278.93 45.33 m 278.93 45.58 278.74 45.77 278.50 45.77 c +278.25 45.77 278.06 45.58 278.06 45.33 c +278.06 45.09 278.25 44.90 278.50 44.90 c +278.74 44.90 278.93 45.09 278.93 45.33 c +f +0.75 g /a0 gs +[] 0 d +270.86 45.33 m 270.86 45.81 270.47 46.20 269.99 46.20 c +269.51 46.20 269.13 45.81 269.13 45.33 c +269.13 44.86 269.51 44.47 269.99 44.47 c +270.47 44.47 270.86 44.86 270.86 45.33 c +f +0.13 g /a0 gs +[] 0 d +270.43 45.33 m 270.43 45.58 270.23 45.77 269.99 45.77 c +269.75 45.77 269.55 45.58 269.55 45.33 c +269.55 45.09 269.75 44.90 269.99 44.90 c +270.23 44.90 270.43 45.09 270.43 45.33 c +f +0.75 g /a0 gs +[] 0 d +262.35 45.33 m 262.35 45.81 261.96 46.20 261.49 46.20 c +261.01 46.20 260.62 45.81 260.62 45.33 c +260.62 44.86 261.01 44.47 261.49 44.47 c +261.96 44.47 262.35 44.86 262.35 45.33 c +f +0.13 g /a0 gs +[] 0 d +261.93 45.33 m 261.93 45.58 261.73 45.77 261.49 45.77 c +261.24 45.77 261.05 45.58 261.05 45.33 c +261.05 45.09 261.24 44.90 261.49 44.90 c +261.73 44.90 261.93 45.09 261.93 45.33 c +f +0.75 g /a0 gs +[] 0 d +253.85 45.33 m 253.85 45.81 253.46 46.20 252.98 46.20 c +252.51 46.20 252.12 45.81 252.12 45.33 c +252.12 44.86 252.51 44.47 252.98 44.47 c +253.46 44.47 253.85 44.86 253.85 45.33 c +f +0.13 g /a0 gs +[] 0 d +253.42 45.33 m 253.42 45.58 253.23 45.77 252.98 45.77 c +252.74 45.77 252.54 45.58 252.54 45.33 c +252.54 45.09 252.74 44.90 252.98 44.90 c +253.23 44.90 253.42 45.09 253.42 45.33 c +f +0.75 g /a0 gs +[] 0 d +245.34 45.33 m 245.34 45.81 244.96 46.20 244.48 46.20 c +244.00 46.20 243.62 45.81 243.62 45.33 c +243.62 44.86 244.00 44.47 244.48 44.47 c +244.96 44.47 245.34 44.86 245.34 45.33 c +f +0.13 g /a0 gs +[] 0 d +244.92 45.33 m 244.92 45.58 244.72 45.77 244.48 45.77 c +244.24 45.77 244.04 45.58 244.04 45.33 c +244.04 45.09 244.24 44.90 244.48 44.90 c +244.72 44.90 244.92 45.09 244.92 45.33 c +f +0.75 g /a0 gs +[] 0 d +236.84 45.33 m 236.84 45.81 236.45 46.20 235.98 46.20 c +235.50 46.20 235.11 45.81 235.11 45.33 c +235.11 44.86 235.50 44.47 235.98 44.47 c +236.45 44.47 236.84 44.86 236.84 45.33 c +f +0.13 g /a0 gs +[] 0 d +236.42 45.33 m 236.42 45.58 236.22 45.77 235.98 45.77 c +235.73 45.77 235.54 45.58 235.54 45.33 c +235.54 45.09 235.73 44.90 235.98 44.90 c +236.22 44.90 236.42 45.09 236.42 45.33 c +f +0.75 g /a0 gs +[] 0 d +228.34 45.33 m 228.34 45.81 227.95 46.20 227.47 46.20 c +226.99 46.20 226.61 45.81 226.61 45.33 c +226.61 44.86 226.99 44.47 227.47 44.47 c +227.95 44.47 228.34 44.86 228.34 45.33 c +f +0.13 g /a0 gs +[] 0 d +227.91 45.33 m 227.91 45.58 227.71 45.77 227.47 45.77 c +227.23 45.77 227.03 45.58 227.03 45.33 c +227.03 45.09 227.23 44.90 227.47 44.90 c +227.71 44.90 227.91 45.09 227.91 45.33 c +f +0.75 g /a0 gs +[] 0 d +219.83 45.33 m 219.83 45.81 219.45 46.20 218.97 46.20 c +218.49 46.20 218.10 45.81 218.10 45.33 c +218.10 44.86 218.49 44.47 218.97 44.47 c +219.45 44.47 219.83 44.86 219.83 45.33 c +f +0.13 g /a0 gs +[] 0 d +219.41 45.33 m 219.41 45.58 219.21 45.77 218.97 45.77 c +218.73 45.77 218.53 45.58 218.53 45.33 c +218.53 45.09 218.73 44.90 218.97 44.90 c +219.21 44.90 219.41 45.09 219.41 45.33 c +f +0.75 g /a0 gs +[] 0 d +211.33 45.33 m 211.33 45.81 210.94 46.20 210.46 46.20 c +209.99 46.20 209.60 45.81 209.60 45.33 c +209.60 44.86 209.99 44.47 210.46 44.47 c +210.94 44.47 211.33 44.86 211.33 45.33 c +f +0.13 g /a0 gs +[] 0 d +210.90 45.33 m 210.90 45.58 210.71 45.77 210.46 45.77 c +210.22 45.77 210.02 45.58 210.02 45.33 c +210.02 45.09 210.22 44.90 210.46 44.90 c +210.71 44.90 210.90 45.09 210.90 45.33 c +f +0.75 g /a0 gs +[] 0 d +202.82 45.33 m 202.82 45.81 202.44 46.20 201.96 46.20 c +201.48 46.20 201.10 45.81 201.10 45.33 c +201.10 44.86 201.48 44.47 201.96 44.47 c +202.44 44.47 202.82 44.86 202.82 45.33 c +f +0.13 g /a0 gs +[] 0 d +202.40 45.33 m 202.40 45.58 202.20 45.77 201.96 45.77 c +201.72 45.77 201.52 45.58 201.52 45.33 c +201.52 45.09 201.72 44.90 201.96 44.90 c +202.20 44.90 202.40 45.09 202.40 45.33 c +f +0.75 g /a0 gs +[] 0 d +152.78 111.24 m 152.78 111.72 152.40 112.10 151.92 112.10 c +151.44 112.10 151.06 111.72 151.06 111.24 c +151.06 110.76 151.44 110.38 151.92 110.38 c +152.40 110.38 152.78 110.76 152.78 111.24 c +f +0.13 g /a0 gs +[] 0 d +152.36 111.24 m 152.36 111.48 152.16 111.68 151.92 111.68 c +151.68 111.68 151.48 111.48 151.48 111.24 c +151.48 111.00 151.68 110.80 151.92 110.80 c +152.16 110.80 152.36 111.00 152.36 111.24 c +f +0.75 g /a0 gs +[] 0 d +187.34 133.20 m 187.34 133.68 186.96 134.06 186.48 134.06 c +186.00 134.06 185.62 133.68 185.62 133.20 c +185.62 132.72 186.00 132.34 186.48 132.34 c +186.96 132.34 187.34 132.72 187.34 133.20 c +f +0.13 g /a0 gs +[] 0 d +186.92 133.20 m 186.92 133.44 186.72 133.64 186.48 133.64 c +186.24 133.64 186.04 133.44 186.04 133.20 c +186.04 132.96 186.24 132.76 186.48 132.76 c +186.72 132.76 186.92 132.96 186.92 133.20 c +f +0.75 g /a0 gs +[] 0 d +195.85 133.20 m 195.85 133.68 195.46 134.06 194.98 134.06 c +194.51 134.06 194.12 133.68 194.12 133.20 c +194.12 132.72 194.51 132.34 194.98 132.34 c +195.46 132.34 195.85 132.72 195.85 133.20 c +f +0.13 g /a0 gs +[] 0 d +195.42 133.20 m 195.42 133.44 195.23 133.64 194.98 133.64 c +194.74 133.64 194.54 133.44 194.54 133.20 c +194.54 132.96 194.74 132.76 194.98 132.76 c +195.23 132.76 195.42 132.96 195.42 133.20 c +f +0.75 g /a0 gs +[] 0 d +203.57 133.20 m 203.57 133.68 203.19 134.06 202.71 134.06 c +202.23 134.06 201.84 133.68 201.84 133.20 c +201.84 132.72 202.23 132.34 202.71 132.34 c +203.19 132.34 203.57 132.72 203.57 133.20 c +f +0.13 g /a0 gs +[] 0 d +203.15 133.20 m 203.15 133.44 202.95 133.64 202.71 133.64 c +202.47 133.64 202.27 133.44 202.27 133.20 c +202.27 132.96 202.47 132.76 202.71 132.76 c +202.95 132.76 203.15 132.96 203.15 133.20 c +f +0.75 g /a0 gs +[] 0 d +212.86 133.20 m 212.86 133.68 212.47 134.06 211.99 134.06 c +211.51 134.06 211.13 133.68 211.13 133.20 c +211.13 132.72 211.51 132.34 211.99 132.34 c +212.47 132.34 212.86 132.72 212.86 133.20 c +f +0.13 g /a0 gs +[] 0 d +212.43 133.20 m 212.43 133.44 212.23 133.64 211.99 133.64 c +211.75 133.64 211.55 133.44 211.55 133.20 c +211.55 132.96 211.75 132.76 211.99 132.76 c +212.23 132.76 212.43 132.96 212.43 133.20 c +f +0.75 g /a0 gs +[] 0 d +221.36 133.20 m 221.36 133.68 220.97 134.06 220.50 134.06 c +220.02 134.06 219.63 133.68 219.63 133.20 c +219.63 132.72 220.02 132.34 220.50 132.34 c +220.97 132.34 221.36 132.72 221.36 133.20 c +f +0.13 g /a0 gs +[] 0 d +220.94 133.20 m 220.94 133.44 220.74 133.64 220.50 133.64 c +220.25 133.64 220.06 133.44 220.06 133.20 c +220.06 132.96 220.25 132.76 220.50 132.76 c +220.74 132.76 220.94 132.96 220.94 133.20 c +f +0.75 g /a0 gs +[] 0 d +238.37 133.20 m 238.37 133.68 237.98 134.06 237.50 134.06 c +237.03 134.06 236.64 133.68 236.64 133.20 c +236.64 132.72 237.03 132.34 237.50 132.34 c +237.98 132.34 238.37 132.72 238.37 133.20 c +f +0.13 g /a0 gs +[] 0 d +237.94 133.20 m 237.94 133.44 237.75 133.64 237.50 133.64 c +237.26 133.64 237.06 133.44 237.06 133.20 c +237.06 132.96 237.26 132.76 237.50 132.76 c +237.75 132.76 237.94 132.96 237.94 133.20 c +f +0.75 g /a0 gs +[] 0 d +246.87 133.20 m 246.87 133.68 246.48 134.06 246.01 134.06 c +245.53 134.06 245.14 133.68 245.14 133.20 c +245.14 132.72 245.53 132.34 246.01 132.34 c +246.48 132.34 246.87 132.72 246.87 133.20 c +f +0.13 g /a0 gs +[] 0 d +246.45 133.20 m 246.45 133.44 246.25 133.64 246.01 133.64 c +245.76 133.64 245.57 133.44 245.57 133.20 c +245.57 132.96 245.76 132.76 246.01 132.76 c +246.25 132.76 246.45 132.96 246.45 133.20 c +f +0.75 g /a0 gs +[] 0 d +139.10 138.96 m 139.10 139.44 138.72 139.82 138.24 139.82 c +137.76 139.82 137.38 139.44 137.38 138.96 c +137.38 138.48 137.76 138.10 138.24 138.10 c +138.72 138.10 139.10 138.48 139.10 138.96 c +f +0.13 g /a0 gs +[] 0 d +138.68 138.96 m 138.68 139.20 138.48 139.40 138.24 139.40 c +138.00 139.40 137.80 139.20 137.80 138.96 c +137.80 138.72 138.00 138.52 138.24 138.52 c +138.48 138.52 138.68 138.72 138.68 138.96 c +f +0.75 g /a0 gs +[] 0 d +147.61 138.96 m 147.61 139.44 147.22 139.82 146.74 139.82 c +146.27 139.82 145.88 139.44 145.88 138.96 c +145.88 138.48 146.27 138.10 146.74 138.10 c +147.22 138.10 147.61 138.48 147.61 138.96 c +f +0.13 g /a0 gs +[] 0 d +147.18 138.96 m 147.18 139.20 146.99 139.40 146.74 139.40 c +146.50 139.40 146.30 139.20 146.30 138.96 c +146.30 138.72 146.50 138.52 146.74 138.52 c +146.99 138.52 147.18 138.72 147.18 138.96 c +f +0.75 g /a0 gs +[] 0 d +156.11 138.96 m 156.11 139.44 155.73 139.82 155.25 139.82 c +154.77 139.82 154.38 139.44 154.38 138.96 c +154.38 138.48 154.77 138.10 155.25 138.10 c +155.73 138.10 156.11 138.48 156.11 138.96 c +f +0.13 g /a0 gs +[] 0 d +155.69 138.96 m 155.69 139.20 155.49 139.40 155.25 139.40 c +155.01 139.40 154.81 139.20 154.81 138.96 c +154.81 138.72 155.01 138.52 155.25 138.52 c +155.49 138.52 155.69 138.72 155.69 138.96 c +f +0.75 g /a0 gs +[] 0 d +164.62 138.96 m 164.62 139.44 164.23 139.82 163.75 139.82 c +163.27 139.82 162.89 139.44 162.89 138.96 c +162.89 138.48 163.27 138.10 163.75 138.10 c +164.23 138.10 164.62 138.48 164.62 138.96 c +f +0.13 g /a0 gs +[] 0 d +164.19 138.96 m 164.19 139.20 163.99 139.40 163.75 139.40 c +163.51 139.40 163.31 139.20 163.31 138.96 c +163.31 138.72 163.51 138.52 163.75 138.52 c +163.99 138.52 164.19 138.72 164.19 138.96 c +f +0.75 g /a0 gs +[] 0 d +139.10 134.28 m 139.10 134.76 138.72 135.14 138.24 135.14 c +137.76 135.14 137.38 134.76 137.38 134.28 c +137.38 133.80 137.76 133.42 138.24 133.42 c +138.72 133.42 139.10 133.80 139.10 134.28 c +f +0.13 g /a0 gs +[] 0 d +138.68 134.28 m 138.68 134.52 138.48 134.72 138.24 134.72 c +138.00 134.72 137.80 134.52 137.80 134.28 c +137.80 134.04 138.00 133.84 138.24 133.84 c +138.48 133.84 138.68 134.04 138.68 134.28 c +f +0.75 g /a0 gs +[] 0 d +147.61 134.28 m 147.61 134.76 147.22 135.14 146.74 135.14 c +146.27 135.14 145.88 134.76 145.88 134.28 c +145.88 133.80 146.27 133.42 146.74 133.42 c +147.22 133.42 147.61 133.80 147.61 134.28 c +f +0.13 g /a0 gs +[] 0 d +147.18 134.28 m 147.18 134.52 146.99 134.72 146.74 134.72 c +146.50 134.72 146.30 134.52 146.30 134.28 c +146.30 134.04 146.50 133.84 146.74 133.84 c +146.99 133.84 147.18 134.04 147.18 134.28 c +f +0.75 g /a0 gs +[] 0 d +156.11 134.28 m 156.11 134.76 155.73 135.14 155.25 135.14 c +154.77 135.14 154.38 134.76 154.38 134.28 c +154.38 133.80 154.77 133.42 155.25 133.42 c +155.73 133.42 156.11 133.80 156.11 134.28 c +f +0.13 g /a0 gs +[] 0 d +155.69 134.28 m 155.69 134.52 155.49 134.72 155.25 134.72 c +155.01 134.72 154.81 134.52 154.81 134.28 c +154.81 134.04 155.01 133.84 155.25 133.84 c +155.49 133.84 155.69 134.04 155.69 134.28 c +f +0.75 g /a0 gs +[] 0 d +164.62 134.28 m 164.62 134.76 164.23 135.14 163.75 135.14 c +163.27 135.14 162.89 134.76 162.89 134.28 c +162.89 133.80 163.27 133.42 163.75 133.42 c +164.23 133.42 164.62 133.80 164.62 134.28 c +f +0.13 g /a0 gs +[] 0 d +164.19 134.28 m 164.19 134.52 163.99 134.72 163.75 134.72 c +163.51 134.72 163.31 134.52 163.31 134.28 c +163.31 134.04 163.51 133.84 163.75 133.84 c +163.99 133.84 164.19 134.04 164.19 134.28 c +f +0.75 g /a0 gs +[] 0 d +139.10 129.24 m 139.10 129.72 138.72 130.10 138.24 130.10 c +137.76 130.10 137.38 129.72 137.38 129.24 c +137.38 128.76 137.76 128.38 138.24 128.38 c +138.72 128.38 139.10 128.76 139.10 129.24 c +f +0.13 g /a0 gs +[] 0 d +138.68 129.24 m 138.68 129.48 138.48 129.68 138.24 129.68 c +138.00 129.68 137.80 129.48 137.80 129.24 c +137.80 129.00 138.00 128.80 138.24 128.80 c +138.48 128.80 138.68 129.00 138.68 129.24 c +f +0.75 g /a0 gs +[] 0 d +147.61 129.24 m 147.61 129.72 147.22 130.10 146.74 130.10 c +146.27 130.10 145.88 129.72 145.88 129.24 c +145.88 128.76 146.27 128.38 146.74 128.38 c +147.22 128.38 147.61 128.76 147.61 129.24 c +f +0.13 g /a0 gs +[] 0 d +147.18 129.24 m 147.18 129.48 146.99 129.68 146.74 129.68 c +146.50 129.68 146.30 129.48 146.30 129.24 c +146.30 129.00 146.50 128.80 146.74 128.80 c +146.99 128.80 147.18 129.00 147.18 129.24 c +f +0.75 g /a0 gs +[] 0 d +156.11 129.24 m 156.11 129.72 155.73 130.10 155.25 130.10 c +154.77 130.10 154.38 129.72 154.38 129.24 c +154.38 128.76 154.77 128.38 155.25 128.38 c +155.73 128.38 156.11 128.76 156.11 129.24 c +f +0.13 g /a0 gs +[] 0 d +155.69 129.24 m 155.69 129.48 155.49 129.68 155.25 129.68 c +155.01 129.68 154.81 129.48 154.81 129.24 c +154.81 129.00 155.01 128.80 155.25 128.80 c +155.49 128.80 155.69 129.00 155.69 129.24 c +f +0.75 g /a0 gs +[] 0 d +164.62 129.24 m 164.62 129.72 164.23 130.10 163.75 130.10 c +163.27 130.10 162.89 129.72 162.89 129.24 c +162.89 128.76 163.27 128.38 163.75 128.38 c +164.23 128.38 164.62 128.76 164.62 129.24 c +f +0.13 g /a0 gs +[] 0 d +164.19 129.24 m 164.19 129.48 163.99 129.68 163.75 129.68 c +163.51 129.68 163.31 129.48 163.31 129.24 c +163.31 129.00 163.51 128.80 163.75 128.80 c +163.99 128.80 164.19 129.00 164.19 129.24 c +f +0.13 g +[] 0 d +171.61 136.04 m 171.61 137.63 170.32 138.92 168.73 138.92 c +167.14 138.92 165.85 137.63 165.85 136.04 c +165.85 134.45 167.14 133.16 168.73 133.16 c +170.32 133.16 171.61 134.45 171.61 136.04 c +f +0.13 g +[] 0 d +39.76 194.15 m 39.76 195.72 38.49 196.99 36.92 196.99 c +35.36 196.99 34.09 195.72 34.09 194.15 c +34.09 192.59 35.36 191.32 36.92 191.32 c +38.49 191.32 39.76 192.59 39.76 194.15 c +f +0.13 g +[] 0 d +46.84 124.70 m 46.84 126.27 45.57 127.54 44.01 127.54 c +42.44 127.54 41.17 126.27 41.17 124.70 c +41.17 123.14 42.44 121.87 44.01 121.87 c +45.57 121.87 46.84 123.14 46.84 124.70 c +f +0.13 g +[] 0 d +296.29 124.70 m 296.29 126.27 295.02 127.54 293.46 127.54 c +291.89 127.54 290.62 126.27 290.62 124.70 c +290.62 123.14 291.89 121.87 293.46 121.87 c +295.02 121.87 296.29 123.14 296.29 124.70 c +f +0.13 g +[] 0 d +289.20 194.15 m 289.20 195.72 287.94 196.99 286.37 196.99 c +284.80 196.99 283.54 195.72 283.54 194.15 c +283.54 192.59 284.80 191.32 286.37 191.32 c +287.94 191.32 289.20 192.59 289.20 194.15 c +f +0.13 g +[] 0 d +51.79 63.76 m 51.79 65.33 50.53 66.59 48.96 66.59 c +47.39 66.59 46.13 65.33 46.13 63.76 c +46.13 62.19 47.39 60.92 48.96 60.92 c +50.53 60.92 51.79 62.19 51.79 63.76 c +f +0.13 g +[] 0 d +37.01 102.28 m 37.01 103.87 35.72 105.16 34.13 105.16 c +32.54 105.16 31.25 103.87 31.25 102.28 c +31.25 100.69 32.54 99.40 34.13 99.40 c +35.72 99.40 37.01 100.69 37.01 102.28 c +f +0.13 g +[] 0 d +37.37 25.24 m 37.37 26.83 36.08 28.12 34.49 28.12 c +32.90 28.12 31.61 26.83 31.61 25.24 c +31.61 23.65 32.90 22.36 34.49 22.36 c +36.08 22.36 37.37 23.65 37.37 25.24 c +f +0.13 g +[] 0 d +306.29 25.24 m 306.29 26.83 305.00 28.12 303.41 28.12 c +301.82 28.12 300.53 26.83 300.53 25.24 c +300.53 23.65 301.82 22.36 303.41 22.36 c +305.00 22.36 306.29 23.65 306.29 25.24 c +f +0.13 g +[] 0 d +306.29 102.28 m 306.29 103.87 305.00 105.16 303.41 105.16 c +301.82 105.16 300.53 103.87 300.53 102.28 c +300.53 100.69 301.82 99.40 303.41 99.40 c +305.00 99.40 306.29 100.69 306.29 102.28 c +f +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +87.055 172.368 m +87.055 176.184 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +88.855 174.312 m +85.327 174.312 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +269.609 180.865 m +269.609 189.935 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +269.609 189.935 m +274.711 189.935 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +274.711 189.935 m +274.711 180.865 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +274.711 180.865 m +269.609 180.865 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +284.040 136.800 m +284.040 151.200 l +288.317 151.200 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +294.163 151.200 m +298.440 151.200 l +298.440 136.800 l +294.163 136.800 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +288.317 136.800 m +284.040 136.800 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +300.232 136.630 m +300.232 151.370 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +300.232 151.370 m +308.168 151.370 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +308.168 136.630 m +308.168 151.370 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +300.232 136.630 m +308.168 136.630 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +300.232 139.349 m +308.168 139.349 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +307.292 187.988 m +296.068 187.988 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +150.307 223.075 m +187.157 223.075 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +168.732 157.878 m +168.732 194.501 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +150.307 223.075 m +150.307 195.658 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +150.307 163.734 m +150.307 157.878 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +187.157 223.075 m +187.157 195.658 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +187.157 163.769 m +187.157 157.878 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +150.307 157.878 m +152.768 157.878 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +184.703 157.878 m +187.157 157.878 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +186.840 119.880 m +186.840 112.680 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +186.840 112.680 m +179.640 112.680 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +179.640 112.680 m +172.440 112.680 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +172.440 112.680 m +172.440 119.880 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +172.440 119.880 m +179.640 119.880 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +179.640 119.880 m +186.840 119.880 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +179.640 119.880 m +179.640 112.680 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +199.800 113.040 m +279.000 113.040 l +279.000 170.640 l +199.800 170.640 l +199.800 113.040 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +69.985 187.231 m +79.055 187.231 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +79.055 187.231 m +79.055 182.129 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +79.055 182.129 m +69.985 182.129 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +69.985 182.129 m +69.985 187.231 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +225.935 192.209 m +216.865 192.209 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +216.865 192.209 m +216.865 197.311 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +216.865 197.311 m +225.935 197.311 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +225.935 197.311 m +225.935 192.209 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +60.840 129.739 m +52.200 129.739 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +60.840 163.256 m +60.840 129.722 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +60.840 163.255 m +52.200 163.255 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +52.200 163.255 m +52.200 129.724 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +33.206 180.094 m +33.206 172.894 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +33.206 172.894 m +33.206 165.694 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +33.206 165.694 m +40.406 165.694 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +40.406 165.694 m +54.806 165.694 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +54.806 165.694 m +54.806 180.094 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +54.806 180.094 m +33.206 180.094 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +40.406 172.894 m +33.206 172.894 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +40.406 172.894 m +40.406 165.694 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +282.658 180.094 m +282.658 172.894 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +282.658 172.894 m +282.658 165.694 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +282.658 165.694 m +289.858 165.694 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +289.858 165.694 m +304.258 165.694 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +304.258 165.694 m +304.258 180.094 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +304.258 180.094 m +282.658 180.094 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +289.858 172.894 m +282.658 172.894 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +289.858 172.894 m +289.858 165.694 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +197.935 56.570 m +195.840 51.077 l +197.935 56.570 m +200.030 51.077 l +196.625 52.906 m +199.246 52.906 l +201.758 56.570 m +202.018 56.311 l +202.284 56.570 l +202.018 56.837 l +201.758 56.570 l +202.018 54.742 m +202.018 51.077 l +204.012 54.742 m +204.012 51.077 l +204.012 53.172 m +204.271 53.957 l +204.797 54.475 l +205.315 54.742 l +206.100 54.742 l +210.708 53.957 m +210.449 54.475 l +209.664 54.742 l +208.879 54.742 l +208.094 54.475 l +207.828 53.957 l +208.094 53.431 l +208.620 53.172 l +209.923 52.906 l +210.449 52.646 l +210.708 52.121 l +210.708 51.862 l +210.449 51.336 l +209.664 51.077 l +208.879 51.077 l +208.094 51.336 l +207.828 51.862 l +213.746 54.742 m +213.228 54.475 l +212.702 53.957 l +212.436 53.172 l +212.436 52.646 l +212.702 51.862 l +213.228 51.336 l +213.746 51.077 l +214.531 51.077 l +215.057 51.336 l +215.582 51.862 l +215.842 52.646 l +215.842 53.172 l +215.582 53.957 l +215.057 54.475 l +214.531 54.742 l +213.746 54.742 l +219.665 56.570 m +219.139 56.570 l +218.621 56.311 l +218.354 55.526 l +218.354 51.077 l +217.570 54.742 m +219.406 54.742 l +222.178 56.570 m +222.178 52.121 l +222.444 51.336 l +222.962 51.077 l +223.488 51.077 l +221.393 54.742 m +223.229 54.742 l +231.084 56.570 m +231.084 51.077 l +229.248 56.570 m +232.913 56.570 l +234.641 54.742 m +234.641 51.077 l +234.641 53.172 m +234.900 53.957 l +235.426 54.475 l +235.951 54.742 l +236.736 54.742 l +241.603 54.742 m +241.603 51.077 l +241.603 53.957 m +241.085 54.475 l +240.559 54.742 l +239.774 54.742 l +239.249 54.475 l +238.723 53.957 l +238.464 53.172 l +238.464 52.646 l +238.723 51.862 l +239.249 51.336 l +239.774 51.077 l +240.559 51.077 l +241.085 51.336 l +241.603 51.862 l +246.478 53.957 m +245.952 54.475 l +245.426 54.742 l +244.642 54.742 l +244.116 54.475 l +243.598 53.957 l +243.331 53.172 l +243.331 52.646 l +243.598 51.862 l +244.116 51.336 l +244.642 51.077 l +245.426 51.077 l +245.952 51.336 l +246.478 51.862 l +248.206 56.570 m +248.206 51.077 l +250.819 54.742 m +248.206 52.121 l +249.250 53.172 m +251.086 51.077 l +252.814 53.172 m +255.953 53.172 l +255.953 53.690 l +255.694 54.216 l +255.427 54.475 l +254.909 54.742 l +254.124 54.742 l +253.598 54.475 l +253.073 53.957 l +252.814 53.172 l +252.814 52.646 l +253.073 51.862 l +253.598 51.336 l +254.124 51.077 l +254.909 51.077 l +255.427 51.336 l +255.953 51.862 l +257.681 54.742 m +257.681 51.077 l +257.681 53.172 m +257.940 53.957 l +258.466 54.475 l +258.991 54.742 l +259.776 54.742 l +265.536 56.570 m +265.536 51.077 l +265.536 56.570 m +267.890 56.570 l +268.675 56.311 l +268.942 56.052 l +269.201 55.526 l +269.201 55.001 l +268.942 54.475 l +268.675 54.216 l +267.890 53.957 l +265.536 53.957 m +267.890 53.957 l +268.675 53.690 l +268.942 53.431 l +269.201 52.906 l +269.201 52.121 l +268.942 51.595 l +268.675 51.336 l +267.890 51.077 l +265.536 51.077 l +272.239 54.742 m +271.714 54.475 l +271.188 53.957 l +270.929 53.172 l +270.929 52.646 l +271.188 51.862 l +271.714 51.336 l +272.239 51.077 l +273.024 51.077 l +273.550 51.336 l +274.068 51.862 l +274.334 52.646 l +274.334 53.172 l +274.068 53.957 l +273.550 54.475 l +273.024 54.742 l +272.239 54.742 l +279.202 54.742 m +279.202 51.077 l +279.202 53.957 m +278.676 54.475 l +278.158 54.742 l +277.373 54.742 l +276.847 54.475 l +276.322 53.957 l +276.062 53.172 l +276.062 52.646 l +276.322 51.862 l +276.847 51.336 l +277.373 51.077 l +278.158 51.077 l +278.676 51.336 l +279.202 51.862 l +280.930 54.742 m +280.930 51.077 l +280.930 53.172 m +281.196 53.957 l +281.714 54.475 l +282.240 54.742 l +283.025 54.742 l +287.892 56.570 m +287.892 51.077 l +287.892 53.957 m +287.374 54.475 l +286.848 54.742 l +286.063 54.742 l +285.538 54.475 l +285.012 53.957 l +284.753 53.172 l +284.753 52.646 l +285.012 51.862 l +285.538 51.336 l +286.063 51.077 l +286.848 51.077 l +287.374 51.336 l +287.892 51.862 l +293.652 55.526 m +294.178 55.786 l +294.962 56.570 l +294.962 51.077 l +296.957 52.380 m +296.690 52.121 l +296.957 51.862 l +297.216 52.121 l +296.957 52.380 l +299.470 56.570 m +302.350 56.570 l +300.780 54.475 l +301.565 54.475 l +302.083 54.216 l +302.350 53.957 l +302.609 53.172 l +302.609 52.646 l +302.350 51.862 l +301.824 51.336 l +301.039 51.077 l +300.254 51.077 l +299.470 51.336 l +299.203 51.595 l +298.944 52.121 l +304.596 55.260 m +304.596 55.526 l +304.862 56.052 l +305.122 56.311 l +305.647 56.570 l +306.691 56.570 l +307.217 56.311 l +307.476 56.052 l +307.742 55.526 l +307.742 55.001 l +307.476 54.475 l +306.958 53.690 l +304.337 51.077 l +308.002 51.077 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +200.124 45.180 m +199.865 45.706 l +199.339 46.231 l +198.821 46.490 l +197.770 46.490 l +197.244 46.231 l +196.726 45.706 l +196.459 45.180 l +196.200 44.395 l +196.200 43.092 l +196.459 42.300 l +196.726 41.782 l +197.244 41.256 l +197.770 40.997 l +198.821 40.997 l +199.339 41.256 l +199.865 41.782 l +200.124 42.300 l +203.162 44.662 m +202.644 44.395 l +202.118 43.877 l +201.852 43.092 l +201.852 42.566 l +202.118 41.782 l +202.644 41.256 l +203.162 40.997 l +203.947 40.997 l +204.473 41.256 l +204.998 41.782 l +205.258 42.566 l +205.258 43.092 l +204.998 43.877 l +204.473 44.395 l +203.947 44.662 l +203.162 44.662 l +206.986 44.662 m +206.986 39.161 l +206.986 43.877 m +207.511 44.395 l +208.037 44.662 l +208.822 44.662 l +209.340 44.395 l +209.866 43.877 l +210.132 43.092 l +210.132 42.566 l +209.866 41.782 l +209.340 41.256 l +208.822 40.997 l +208.037 40.997 l +207.511 41.256 l +206.986 41.782 l +212.119 44.662 m +213.689 40.997 l +215.258 44.662 m +213.689 40.997 l +213.163 39.946 l +212.645 39.420 l +212.119 39.161 l +211.860 39.161 l +216.986 44.662 m +216.986 40.997 l +216.986 43.092 m +217.253 43.877 l +217.771 44.395 l +218.297 44.662 l +219.082 44.662 l +220.810 46.490 m +221.076 46.231 l +221.335 46.490 l +221.076 46.757 l +220.810 46.490 l +221.076 44.662 m +221.076 40.997 l +226.202 44.662 m +226.202 40.471 l +225.943 39.686 l +225.684 39.420 l +225.158 39.161 l +224.374 39.161 l +223.848 39.420 l +226.202 43.877 m +225.684 44.395 l +225.158 44.662 l +224.374 44.662 l +223.848 44.395 l +223.322 43.877 l +223.063 43.092 l +223.063 42.566 l +223.322 41.782 l +223.848 41.256 l +224.374 40.997 l +225.158 40.997 l +225.684 41.256 l +226.202 41.782 l +227.930 46.490 m +227.930 40.997 l +227.930 43.610 m +228.715 44.395 l +229.241 44.662 l +230.026 44.662 l +230.551 44.395 l +230.810 43.610 l +230.810 40.997 l +233.323 46.490 m +233.323 42.041 l +233.590 41.256 l +234.108 40.997 l +234.634 40.997 l +232.538 44.662 m +234.374 44.662 l +242.230 47.542 m +241.704 47.016 l +241.178 46.231 l +240.660 45.180 l +240.394 43.877 l +240.394 42.826 l +240.660 41.515 l +241.178 40.471 l +241.704 39.686 l +242.230 39.161 l +247.097 43.877 m +246.571 44.395 l +246.053 44.662 l +245.268 44.662 l +244.742 44.395 l +244.217 43.877 l +243.958 43.092 l +243.958 42.566 l +244.217 41.782 l +244.742 41.256 l +245.268 40.997 l +246.053 40.997 l +246.571 41.256 l +247.097 41.782 l +248.825 47.542 m +249.350 47.016 l +249.876 46.231 l +250.394 45.180 l +250.661 43.877 l +250.661 42.826 l +250.394 41.515 l +249.876 40.471 l +249.350 39.686 l +248.825 39.161 l +256.680 45.180 m +256.680 45.446 l +256.939 45.972 l +257.206 46.231 l +257.724 46.490 l +258.775 46.490 l +259.301 46.231 l +259.560 45.972 l +259.819 45.446 l +259.819 44.921 l +259.560 44.395 l +259.034 43.610 l +256.421 40.997 l +260.086 40.997 l +263.383 46.490 m +262.598 46.231 l +262.073 45.446 l +261.814 44.136 l +261.814 43.351 l +262.073 42.041 l +262.598 41.256 l +263.383 40.997 l +263.909 40.997 l +264.694 41.256 l +265.212 42.041 l +265.478 43.351 l +265.478 44.136 l +265.212 45.446 l +264.694 46.231 l +263.909 46.490 l +263.383 46.490 l +267.466 45.180 m +267.466 45.446 l +267.732 45.972 l +267.991 46.231 l +268.517 46.490 l +269.561 46.490 l +270.086 46.231 l +270.346 45.972 l +270.612 45.446 l +270.612 44.921 l +270.346 44.395 l +269.820 43.610 l +267.206 40.997 l +270.871 40.997 l +272.858 45.180 m +272.858 45.446 l +273.125 45.972 l +273.384 46.231 l +273.910 46.490 l +274.954 46.490 l +275.479 46.231 l +275.738 45.972 l +276.005 45.446 l +276.005 44.921 l +275.738 44.395 l +275.220 43.610 l +272.599 40.997 l +276.264 40.997 l +282.024 46.490 m +282.024 40.997 l +282.024 46.490 m +283.860 46.490 l +284.645 46.231 l +285.163 45.706 l +285.430 45.180 l +285.689 44.395 l +285.689 43.092 l +285.430 42.300 l +285.163 41.782 l +284.645 41.256 l +283.860 40.997 l +282.024 40.997 l +287.417 46.490 m +287.417 40.997 l +287.417 46.490 m +289.253 46.490 l +290.038 46.231 l +290.556 45.706 l +290.822 45.180 l +291.082 44.395 l +291.082 43.092 l +290.822 42.300 l +290.556 41.782 l +290.038 41.256 l +289.253 40.997 l +287.417 40.997 l +292.810 46.490 m +294.905 40.997 l +297.000 46.490 m +294.905 40.997 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +94.730 176.774 m +94.579 177.070 l +94.284 177.365 l +93.996 177.509 l +93.406 177.509 l +93.110 177.365 l +92.815 177.070 l +92.664 176.774 l +92.520 176.328 l +92.520 175.594 l +92.664 175.154 l +92.815 174.859 l +93.110 174.564 l +93.406 174.420 l +93.996 174.420 l +94.284 174.564 l +94.579 174.859 l +94.730 175.154 l +95.998 177.509 m +97.618 177.509 l +96.732 176.328 l +97.171 176.328 l +97.466 176.184 l +97.618 176.040 l +97.762 175.594 l +97.762 175.298 l +97.618 174.859 l +97.322 174.564 l +96.876 174.420 l +96.437 174.420 l +95.998 174.564 l +95.846 174.708 l +95.702 175.003 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +264.240 185.789 m +264.240 182.700 l +264.240 185.789 m +265.565 185.789 l +266.004 185.645 l +266.155 185.494 l +266.299 185.198 l +266.299 184.903 l +266.155 184.608 l +266.004 184.464 l +265.565 184.320 l +264.240 184.320 l +265.270 184.320 m +266.299 182.700 l +267.271 185.198 m +267.566 185.350 l +268.013 185.789 l +268.013 182.700 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +291.290 145.814 m +291.139 146.110 l +290.844 146.405 l +290.556 146.549 l +289.966 146.549 l +289.670 146.405 l +289.375 146.110 l +289.224 145.814 l +289.080 145.368 l +289.080 144.634 l +289.224 144.194 l +289.375 143.899 l +289.670 143.604 l +289.966 143.460 l +290.556 143.460 l +290.844 143.604 l +291.139 143.899 l +291.290 144.194 l +292.262 145.958 m +292.558 146.110 l +292.997 146.549 l +292.997 143.460 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +302.400 146.549 m +302.400 143.460 l +302.400 146.549 m +303.430 146.549 l +303.876 146.405 l +304.164 146.110 l +304.315 145.814 l +304.459 145.368 l +304.459 144.634 l +304.315 144.194 l +304.164 143.899 l +303.876 143.604 l +303.430 143.460 l +302.400 143.460 l +305.431 145.958 m +305.726 146.110 l +306.173 146.549 l +306.173 143.460 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +305.446 186.149 m +305.150 186.005 l +304.855 185.710 l +304.704 185.414 l +304.560 184.968 l +304.560 184.234 l +304.704 183.794 l +304.855 183.499 l +305.150 183.204 l +305.446 183.060 l +306.036 183.060 l +306.324 183.204 l +306.619 183.499 l +306.770 183.794 l +306.914 184.234 l +306.914 184.968 l +306.770 185.414 l +306.619 185.710 l +306.324 186.005 l +306.036 186.149 l +305.446 186.149 l +305.885 183.643 m +306.770 182.765 l +307.886 185.558 m +308.182 185.710 l +308.628 186.149 l +308.628 183.060 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +166.212 195.197 m +166.212 192.987 l +166.356 192.547 l +166.651 192.252 l +167.098 192.108 l +167.393 192.108 l +167.832 192.252 l +168.127 192.547 l +168.271 192.987 l +168.271 195.197 l +171.015 195.197 m +169.539 195.197 l +169.395 193.872 l +169.539 194.016 l +169.985 194.167 l +170.424 194.167 l +170.863 194.016 l +171.159 193.728 l +171.310 193.282 l +171.310 192.987 l +171.159 192.547 l +170.863 192.252 l +170.424 192.108 l +169.985 192.108 l +169.539 192.252 l +169.395 192.396 l +169.243 192.691 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +178.956 125.309 m +178.956 122.954 l +178.805 122.508 l +178.661 122.364 l +178.366 122.220 l +178.070 122.220 l +177.775 122.364 l +177.624 122.508 l +177.480 122.954 l +177.480 123.250 l +181.397 125.309 m +179.928 123.250 l +182.131 123.250 l +181.397 125.309 m +181.397 122.220 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +177.409 64.868 m +177.409 62.658 l +177.553 62.219 l +177.848 61.924 l +178.295 61.780 l +178.590 61.780 l +179.029 61.924 l +179.324 62.219 l +179.468 62.658 l +179.468 64.868 l +180.440 64.278 m +180.736 64.429 l +181.182 64.868 l +181.182 61.780 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +239.760 137.909 m +239.760 135.698 l +239.904 135.259 l +240.199 134.964 l +240.646 134.820 l +240.941 134.820 l +241.380 134.964 l +241.675 135.259 l +241.819 135.698 l +241.819 137.909 l +243.086 137.909 m +244.706 137.909 l +243.828 136.728 l +244.267 136.728 l +244.562 136.584 l +244.706 136.440 l +244.858 135.994 l +244.858 135.698 l +244.706 135.259 l +244.411 134.964 l +243.972 134.820 l +243.533 134.820 l +243.086 134.964 l +242.942 135.108 l +242.791 135.403 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +219.852 121.270 m +222.559 120.240 l +219.852 121.270 m +222.559 122.299 l +221.659 120.629 m +221.659 121.918 l +219.852 123.926 m +219.982 123.538 l +220.370 123.278 l +221.011 123.149 l +221.400 123.149 l +222.041 123.278 l +222.430 123.538 l +222.559 123.926 l +222.559 124.186 l +222.430 124.567 l +222.041 124.826 l +221.400 124.956 l +221.011 124.956 l +220.370 124.826 l +219.982 124.567 l +219.852 124.186 l +219.852 123.926 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +212.652 121.270 m +215.359 120.240 l +212.652 121.270 m +215.359 122.299 l +214.459 120.629 m +214.459 121.918 l +213.170 123.149 m +213.041 123.408 l +212.652 123.797 l +215.359 123.797 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +205.452 121.270 m +208.159 120.240 l +205.452 121.270 m +208.159 122.299 l +207.259 120.629 m +207.259 121.918 l +206.100 123.278 m +205.970 123.278 l +205.711 123.408 l +205.582 123.538 l +205.452 123.797 l +205.452 124.308 l +205.582 124.567 l +205.711 124.697 l +205.970 124.826 l +206.230 124.826 l +206.482 124.697 l +206.870 124.438 l +208.159 123.149 l +208.159 124.956 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +227.052 120.240 m +229.759 120.240 l +227.052 120.240 m +227.052 121.399 l +227.182 121.788 l +227.311 121.918 l +227.570 122.047 l +227.830 122.047 l +228.082 121.918 l +228.211 121.788 l +228.341 121.399 l +228.341 120.240 l +228.341 121.140 m +229.759 122.047 l +228.730 122.897 m +228.730 124.438 l +228.470 124.438 l +228.211 124.308 l +228.082 124.186 l +227.959 123.926 l +227.959 123.538 l +228.082 123.278 l +228.341 123.026 l +228.730 122.897 l +228.989 122.897 l +229.370 123.026 l +229.630 123.278 l +229.759 123.538 l +229.759 123.926 l +229.630 124.186 l +229.370 124.438 l +228.341 126.706 m +228.082 126.576 l +227.959 126.194 l +227.959 125.806 l +228.082 125.417 l +228.341 125.294 l +228.600 125.417 l +228.730 125.676 l +228.859 126.324 l +228.989 126.576 l +229.241 126.706 l +229.370 126.706 l +229.630 126.576 l +229.759 126.194 l +229.759 125.806 l +229.630 125.417 l +229.370 125.294 l +228.730 127.555 m +228.730 129.103 l +228.470 129.103 l +228.211 128.974 l +228.082 128.844 l +227.959 128.592 l +227.959 128.203 l +228.082 127.944 l +228.341 127.685 l +228.730 127.555 l +228.989 127.555 l +229.370 127.685 l +229.630 127.944 l +229.759 128.203 l +229.759 128.592 l +229.630 128.844 l +229.370 129.103 l +227.052 130.342 m +229.241 130.342 l +229.630 130.471 l +229.759 130.730 l +229.759 130.982 l +227.959 129.953 m +227.959 130.860 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +234.641 122.047 m +234.382 121.788 l +234.252 121.399 l +234.252 120.881 l +234.382 120.499 l +234.641 120.240 l +234.900 120.240 l +235.159 120.370 l +235.282 120.499 l +235.411 120.758 l +235.670 121.529 l +235.800 121.788 l +235.930 121.918 l +236.189 122.047 l +236.570 122.047 l +236.830 121.788 l +236.959 121.399 l +236.959 120.881 l +236.830 120.499 l +236.570 120.240 l +234.252 123.667 m +234.382 123.408 l +234.641 123.149 l +234.900 123.026 l +235.282 122.897 l +235.930 122.897 l +236.318 123.026 l +236.570 123.149 l +236.830 123.408 l +236.959 123.667 l +236.959 124.186 l +236.830 124.438 l +236.570 124.697 l +236.318 124.826 l +235.930 124.956 l +235.282 124.956 l +234.900 124.826 l +234.641 124.697 l +234.382 124.438 l +234.252 124.186 l +234.252 123.667 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +242.100 122.170 m +241.841 122.047 l +241.582 121.788 l +241.452 121.529 l +241.452 121.010 l +241.582 120.758 l +241.841 120.499 l +242.100 120.370 l +242.482 120.240 l +243.130 120.240 l +243.518 120.370 l +243.770 120.499 l +244.030 120.758 l +244.159 121.010 l +244.159 121.529 l +244.030 121.788 l +243.770 122.047 l +243.518 122.170 l +241.841 124.826 m +241.582 124.567 l +241.452 124.186 l +241.452 123.667 l +241.582 123.278 l +241.841 123.026 l +242.100 123.026 l +242.359 123.149 l +242.482 123.278 l +242.611 123.538 l +242.870 124.308 l +243.000 124.567 l +243.130 124.697 l +243.389 124.826 l +243.770 124.826 l +244.030 124.567 l +244.159 124.186 l +244.159 123.667 l +244.030 123.278 l +243.770 123.026 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +249.041 122.047 m +248.782 121.788 l +248.652 121.399 l +248.652 120.881 l +248.782 120.499 l +249.041 120.240 l +249.300 120.240 l +249.559 120.370 l +249.682 120.499 l +249.811 120.758 l +250.070 121.529 l +250.200 121.788 l +250.330 121.918 l +250.589 122.047 l +250.970 122.047 l +251.230 121.788 l +251.359 121.399 l +251.359 120.881 l +251.230 120.499 l +250.970 120.240 l +248.652 122.897 m +251.359 122.897 l +248.652 122.897 m +248.652 123.797 l +248.782 124.186 l +249.041 124.438 l +249.300 124.567 l +249.682 124.697 l +250.330 124.697 l +250.718 124.567 l +250.970 124.438 l +251.230 124.186 l +251.359 123.797 l +251.359 122.897 l +248.652 126.576 m +251.359 125.546 l +248.652 126.576 m +251.359 127.613 l +250.459 125.935 m +250.459 127.224 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +256.241 122.047 m +255.982 121.788 l +255.852 121.399 l +255.852 120.881 l +255.982 120.499 l +256.241 120.240 l +256.500 120.240 l +256.759 120.370 l +256.882 120.499 l +257.011 120.758 l +257.270 121.529 l +257.400 121.788 l +257.530 121.918 l +257.789 122.047 l +258.170 122.047 l +258.430 121.788 l +258.559 121.399 l +258.559 120.881 l +258.430 120.499 l +258.170 120.240 l +256.500 124.826 m +256.241 124.697 l +255.982 124.438 l +255.852 124.186 l +255.852 123.667 l +255.982 123.408 l +256.241 123.149 l +256.500 123.026 l +256.882 122.897 l +257.530 122.897 l +257.918 123.026 l +258.170 123.149 l +258.430 123.408 l +258.559 123.667 l +258.559 124.186 l +258.430 124.438 l +258.170 124.697 l +257.918 124.826 l +255.852 125.676 m +258.559 125.676 l +258.559 125.676 m +258.559 127.224 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +263.700 122.170 m +263.441 122.047 l +263.182 121.788 l +263.052 121.529 l +263.052 121.010 l +263.182 120.758 l +263.441 120.499 l +263.700 120.370 l +264.082 120.240 l +264.730 120.240 l +265.118 120.370 l +265.370 120.499 l +265.630 120.758 l +265.759 121.010 l +265.759 121.529 l +265.630 121.788 l +265.370 122.047 l +265.118 122.170 l +264.730 122.170 l +264.730 121.529 m +264.730 122.170 l +263.052 123.026 m +265.759 123.026 l +263.052 123.026 m +265.759 124.826 l +263.052 124.826 m +265.759 124.826 l +263.052 125.676 m +265.759 125.676 l +263.052 125.676 m +263.052 126.576 l +263.182 126.965 l +263.441 127.224 l +263.700 127.354 l +264.082 127.483 l +264.730 127.483 l +265.118 127.354 l +265.370 127.224 l +265.630 126.965 l +265.759 126.576 l +265.759 125.676 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +270.252 120.240 m +272.959 121.270 l +270.252 122.299 m +272.959 121.270 l +270.900 125.086 m +270.641 124.956 l +270.382 124.697 l +270.252 124.438 l +270.252 123.926 l +270.382 123.667 l +270.641 123.408 l +270.900 123.278 l +271.282 123.149 l +271.930 123.149 l +272.318 123.278 l +272.570 123.408 l +272.830 123.667 l +272.959 123.926 l +272.959 124.438 l +272.830 124.697 l +272.570 124.956 l +272.318 125.086 l +270.900 127.865 m +270.641 127.742 l +270.382 127.483 l +270.252 127.224 l +270.252 126.706 l +270.382 126.454 l +270.641 126.194 l +270.900 126.065 l +271.282 125.935 l +271.930 125.935 l +272.318 126.065 l +272.570 126.194 l +272.830 126.454 l +272.959 126.706 l +272.959 127.224 l +272.830 127.483 l +272.570 127.742 l +272.318 127.865 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +205.452 138.240 m +208.159 139.270 l +205.452 140.299 m +208.159 139.270 l +206.100 143.086 m +205.841 142.956 l +205.582 142.697 l +205.452 142.438 l +205.452 141.926 l +205.582 141.667 l +205.841 141.408 l +206.100 141.278 l +206.482 141.149 l +207.130 141.149 l +207.518 141.278 l +207.770 141.408 l +208.030 141.667 l +208.159 141.926 l +208.159 142.438 l +208.030 142.697 l +207.770 142.956 l +207.518 143.086 l +206.100 145.865 m +205.841 145.742 l +205.582 145.483 l +205.452 145.224 l +205.452 144.706 l +205.582 144.454 l +205.841 144.194 l +206.100 144.065 l +206.482 143.935 l +207.130 143.935 l +207.518 144.065 l +207.770 144.194 l +208.030 144.454 l +208.159 144.706 l +208.159 145.224 l +208.030 145.483 l +207.770 145.742 l +207.518 145.865 l +204.941 149.040 m +209.059 146.722 l +206.100 151.819 m +205.841 151.690 l +205.582 151.430 l +205.452 151.178 l +205.452 150.660 l +205.582 150.401 l +205.841 150.149 l +206.100 150.019 l +206.482 149.890 l +207.130 149.890 l +207.518 150.019 l +207.770 150.149 l +208.030 150.401 l +208.159 150.660 l +208.159 151.178 l +208.030 151.430 l +207.770 151.690 l +207.518 151.819 l +207.130 151.819 l +207.130 151.178 m +207.130 151.819 l +205.452 152.669 m +208.159 152.669 l +205.452 152.669 m +208.159 154.476 l +205.452 154.476 m +208.159 154.476 l +205.452 155.326 m +208.159 155.326 l +205.452 155.326 m +205.452 156.226 l +205.582 156.614 l +205.841 156.874 l +206.100 157.003 l +206.482 157.126 l +207.130 157.126 l +207.518 157.003 l +207.770 156.874 l +208.030 156.614 l +208.159 156.226 l +208.159 155.326 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +212.652 141.840 m +215.359 141.840 l +212.652 143.590 m +215.359 143.590 l +212.652 142.690 m +212.652 144.497 l +212.652 145.346 m +215.359 145.346 l +212.652 145.346 m +212.652 146.506 l +212.782 146.894 l +212.911 147.017 l +213.170 147.146 l +213.430 147.146 l +213.682 147.017 l +213.811 146.894 l +213.941 146.506 l +213.941 145.346 m +213.941 146.506 l +214.070 146.894 l +214.200 147.017 l +214.459 147.146 l +214.841 147.146 l +215.100 147.017 l +215.230 146.894 l +215.359 146.506 l +215.359 145.346 l +212.141 150.322 m +216.259 147.996 l +212.652 151.171 m +215.359 151.171 l +212.652 152.921 m +215.359 152.921 l +212.652 152.021 m +212.652 153.821 l +212.652 155.707 m +215.359 154.670 l +212.652 155.707 m +215.359 156.737 l +214.459 155.059 m +214.459 156.348 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +219.852 141.840 m +222.559 141.840 l +219.852 141.840 m +219.852 142.999 l +219.982 143.388 l +220.111 143.518 l +220.370 143.647 l +220.630 143.647 l +220.882 143.518 l +221.011 143.388 l +221.141 142.999 l +221.141 141.840 m +221.141 142.999 l +221.270 143.388 l +221.400 143.518 l +221.659 143.647 l +222.041 143.647 l +222.300 143.518 l +222.430 143.388 l +222.559 142.999 l +222.559 141.840 l +219.852 145.267 m +219.982 145.008 l +220.241 144.749 l +220.500 144.626 l +220.882 144.497 l +221.530 144.497 l +221.918 144.626 l +222.170 144.749 l +222.430 145.008 l +222.559 145.267 l +222.559 145.786 l +222.430 146.038 l +222.170 146.297 l +221.918 146.426 l +221.530 146.556 l +220.882 146.556 l +220.500 146.426 l +220.241 146.297 l +219.982 146.038 l +219.852 145.786 l +219.852 145.267 l +219.341 149.724 m +223.459 147.406 l +219.852 151.603 m +222.559 150.574 l +219.852 151.603 m +222.559 152.640 l +221.659 150.962 m +221.659 152.251 l +219.852 154.260 m +219.982 153.871 l +220.370 153.619 l +221.011 153.490 l +221.400 153.490 l +222.041 153.619 l +222.430 153.871 l +222.559 154.260 l +222.559 154.519 l +222.430 154.908 l +222.041 155.160 l +221.400 155.290 l +221.011 155.290 l +220.370 155.160 l +219.982 154.908 l +219.852 154.519 l +219.852 154.260 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +227.052 141.840 m +229.759 141.840 l +227.052 141.840 m +227.052 142.999 l +227.182 143.388 l +227.311 143.518 l +227.570 143.647 l +227.830 143.647 l +228.082 143.518 l +228.211 143.388 l +228.341 142.999 l +228.341 141.840 m +228.341 142.999 l +228.470 143.388 l +228.600 143.518 l +228.859 143.647 l +229.241 143.647 l +229.500 143.518 l +229.630 143.388 l +229.759 142.999 l +229.759 141.840 l +227.570 144.497 m +227.441 144.749 l +227.052 145.138 l +229.759 145.138 l +226.541 148.306 m +230.659 145.987 l +227.052 150.192 m +229.759 149.155 l +227.052 150.192 m +229.759 151.222 l +228.859 149.544 m +228.859 150.833 l +227.570 152.071 m +227.441 152.330 l +227.052 152.712 l +229.759 152.712 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +234.252 141.840 m +236.959 141.840 l +234.252 141.840 m +234.252 142.999 l +234.382 143.388 l +234.511 143.518 l +234.770 143.647 l +235.030 143.647 l +235.282 143.518 l +235.411 143.388 l +235.541 142.999 l +235.541 141.840 m +235.541 142.999 l +235.670 143.388 l +235.800 143.518 l +236.059 143.647 l +236.441 143.647 l +236.700 143.518 l +236.830 143.388 l +236.959 142.999 l +236.959 141.840 l +234.900 144.626 m +234.770 144.626 l +234.511 144.749 l +234.382 144.878 l +234.252 145.138 l +234.252 145.656 l +234.382 145.908 l +234.511 146.038 l +234.770 146.167 l +235.030 146.167 l +235.282 146.038 l +235.670 145.786 l +236.959 144.497 l +236.959 146.297 l +233.741 149.465 m +237.859 147.146 l +234.252 151.351 m +236.959 150.322 l +234.252 151.351 m +236.959 152.381 l +236.059 150.703 m +236.059 151.992 l +234.900 153.360 m +234.770 153.360 l +234.511 153.490 l +234.382 153.619 l +234.252 153.871 l +234.252 154.390 l +234.382 154.649 l +234.511 154.778 l +234.770 154.908 l +235.030 154.908 l +235.282 154.778 l +235.670 154.519 l +236.959 153.230 l +236.959 155.030 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +241.452 141.840 m +244.159 141.840 l +241.452 141.840 m +241.452 142.999 l +241.582 143.388 l +241.711 143.518 l +241.970 143.647 l +242.230 143.647 l +242.482 143.518 l +242.611 143.388 l +242.741 142.999 l +242.741 141.840 m +242.741 142.999 l +242.870 143.388 l +243.000 143.518 l +243.259 143.647 l +243.641 143.647 l +243.900 143.518 l +244.030 143.388 l +244.159 142.999 l +244.159 141.840 l +241.452 144.749 m +241.452 146.167 l +242.482 145.397 l +242.482 145.786 l +242.611 146.038 l +242.741 146.167 l +243.130 146.297 l +243.389 146.297 l +243.770 146.167 l +244.030 145.908 l +244.159 145.526 l +244.159 145.138 l +244.030 144.749 l +243.900 144.626 l +243.641 144.497 l +240.941 149.465 m +245.059 147.146 l +241.452 151.351 m +244.159 150.322 l +241.452 151.351 m +244.159 152.381 l +243.259 150.703 m +243.259 151.992 l +241.452 153.490 m +241.452 154.908 l +242.482 154.130 l +242.482 154.519 l +242.611 154.778 l +242.741 154.908 l +243.130 155.030 l +243.389 155.030 l +243.770 154.908 l +244.030 154.649 l +244.159 154.260 l +244.159 153.871 l +244.030 153.490 l +243.900 153.360 l +243.641 153.230 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +248.652 141.840 m +251.359 141.840 l +248.652 141.840 m +248.652 142.999 l +248.782 143.388 l +248.911 143.518 l +249.170 143.647 l +249.430 143.647 l +249.682 143.518 l +249.811 143.388 l +249.941 142.999 l +249.941 141.840 m +249.941 142.999 l +250.070 143.388 l +250.200 143.518 l +250.459 143.647 l +250.841 143.647 l +251.100 143.518 l +251.230 143.388 l +251.359 142.999 l +251.359 141.840 l +248.652 145.786 m +250.459 144.497 l +250.459 146.426 l +248.652 145.786 m +251.359 145.786 l +248.141 149.594 m +252.259 147.276 l +248.652 151.481 m +251.359 150.444 l +248.652 151.481 m +251.359 152.510 l +250.459 150.833 m +250.459 152.122 l +248.652 154.649 m +250.459 153.360 l +250.459 155.290 l +248.652 154.649 m +251.359 154.649 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +255.852 141.840 m +258.559 141.840 l +255.852 141.840 m +255.852 142.999 l +255.982 143.388 l +256.111 143.518 l +256.370 143.647 l +256.630 143.647 l +256.882 143.518 l +257.011 143.388 l +257.141 142.999 l +257.141 141.840 m +257.141 142.999 l +257.270 143.388 l +257.400 143.518 l +257.659 143.647 l +258.041 143.647 l +258.300 143.518 l +258.430 143.388 l +258.559 142.999 l +258.559 141.840 l +255.852 146.038 m +255.852 144.749 l +257.011 144.626 l +256.882 144.749 l +256.759 145.138 l +256.759 145.526 l +256.882 145.908 l +257.141 146.167 l +257.530 146.297 l +257.789 146.297 l +258.170 146.167 l +258.430 145.908 l +258.559 145.526 l +258.559 145.138 l +258.430 144.749 l +258.300 144.626 l +258.041 144.497 l +255.341 149.465 m +259.459 147.146 l +255.852 151.351 m +258.559 150.322 l +255.852 151.351 m +258.559 152.381 l +257.659 150.703 m +257.659 151.992 l +255.852 154.778 m +255.852 153.490 l +257.011 153.360 l +256.882 153.490 l +256.759 153.871 l +256.759 154.260 l +256.882 154.649 l +257.141 154.908 l +257.530 155.030 l +257.789 155.030 l +258.170 154.908 l +258.430 154.649 l +258.559 154.260 l +258.559 153.871 l +258.430 153.490 l +258.300 153.360 l +258.041 153.230 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +263.052 141.840 m +265.759 141.840 l +263.052 141.840 m +263.052 142.999 l +263.182 143.388 l +263.311 143.518 l +263.570 143.647 l +263.830 143.647 l +264.082 143.518 l +264.211 143.388 l +264.341 142.999 l +264.341 141.840 m +264.341 142.999 l +264.470 143.388 l +264.600 143.518 l +264.859 143.647 l +265.241 143.647 l +265.500 143.518 l +265.630 143.388 l +265.759 142.999 l +265.759 141.840 l +263.441 146.038 m +263.182 145.908 l +263.052 145.526 l +263.052 145.267 l +263.182 144.878 l +263.570 144.626 l +264.211 144.497 l +264.859 144.497 l +265.370 144.626 l +265.630 144.878 l +265.759 145.267 l +265.759 145.397 l +265.630 145.786 l +265.370 146.038 l +264.989 146.167 l +264.859 146.167 l +264.470 146.038 l +264.211 145.786 l +264.082 145.397 l +264.082 145.267 l +264.211 144.878 l +264.470 144.626 l +264.859 144.497 l +262.541 149.342 m +266.659 147.017 l +263.052 151.222 m +265.759 150.192 l +263.052 151.222 m +265.759 152.251 l +264.859 150.574 m +264.859 151.862 l +263.441 154.649 m +263.182 154.519 l +263.052 154.130 l +263.052 153.871 l +263.182 153.490 l +263.570 153.230 l +264.211 153.101 l +264.859 153.101 l +265.370 153.230 l +265.630 153.490 l +265.759 153.871 l +265.759 154.001 l +265.630 154.390 l +265.370 154.649 l +264.989 154.778 l +264.859 154.778 l +264.470 154.649 l +264.211 154.390 l +264.082 154.001 l +264.082 153.871 l +264.211 153.490 l +264.470 153.230 l +264.859 153.101 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +270.252 141.840 m +272.959 141.840 l +270.252 141.840 m +270.252 142.999 l +270.382 143.388 l +270.511 143.518 l +270.770 143.647 l +271.030 143.647 l +271.282 143.518 l +271.411 143.388 l +271.541 142.999 l +271.541 141.840 m +271.541 142.999 l +271.670 143.388 l +271.800 143.518 l +272.059 143.647 l +272.441 143.647 l +272.700 143.518 l +272.830 143.388 l +272.959 142.999 l +272.959 141.840 l +270.252 146.297 m +272.959 145.008 l +270.252 144.497 m +270.252 146.297 l +269.741 149.465 m +273.859 147.146 l +270.252 151.351 m +272.959 150.322 l +270.252 151.351 m +272.959 152.381 l +272.059 150.703 m +272.059 151.992 l +270.252 155.030 m +272.959 153.749 l +270.252 153.230 m +270.252 155.030 l +S +1 J +1 j +0.58 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +275.399 127.440 m +278.107 127.440 l +275.399 127.440 m +278.107 128.470 l +275.399 129.499 m +278.107 128.470 l +275.399 129.499 m +278.107 129.499 l +276.047 132.286 m +275.788 132.156 l +275.529 131.897 l +275.399 131.638 l +275.399 131.126 l +275.529 130.867 l +275.788 130.608 l +276.047 130.478 l +276.429 130.349 l +277.077 130.349 l +277.466 130.478 l +277.718 130.608 l +277.977 130.867 l +278.107 131.126 l +278.107 131.638 l +277.977 131.897 l +277.718 132.156 l +277.466 132.286 l +275.399 133.135 m +278.107 133.135 l +275.399 133.135 m +275.399 134.294 l +275.529 134.683 l +275.659 134.813 l +275.918 134.942 l +276.299 134.942 l +276.559 134.813 l +276.688 134.683 l +276.818 134.294 l +276.818 133.135 l +276.047 135.922 m +275.918 135.922 l +275.659 136.044 l +275.529 136.174 l +275.399 136.433 l +275.399 136.951 l +275.529 137.203 l +275.659 137.333 l +275.918 137.462 l +276.177 137.462 l +276.429 137.333 l +276.818 137.081 l +278.107 135.792 l +278.107 137.592 l +275.399 138.701 m +275.399 140.119 l +276.429 139.349 l +276.429 139.730 l +276.559 139.990 l +276.688 140.119 l +277.077 140.249 l +277.336 140.249 l +277.718 140.119 l +277.977 139.860 l +278.107 139.471 l +278.107 139.090 l +277.977 138.701 l +277.847 138.571 l +277.588 138.442 l +275.399 141.869 m +275.529 141.487 l +275.918 141.228 l +276.559 141.098 l +276.947 141.098 l +277.588 141.228 l +277.977 141.487 l +278.107 141.869 l +278.107 142.128 l +277.977 142.517 l +277.588 142.776 l +276.947 142.898 l +276.559 142.898 l +275.918 142.776 l +275.529 142.517 l +275.399 142.128 l +275.399 141.869 l +275.918 143.755 m +275.788 144.007 l +275.399 144.396 l +278.107 144.396 l +275.399 147.053 m +278.107 145.764 l +275.399 145.246 m +275.399 147.053 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +72.000 192.269 m +72.000 189.180 l +72.000 192.269 m +73.325 192.269 l +73.764 192.125 l +73.915 191.974 l +74.059 191.678 l +74.059 191.383 l +73.915 191.088 l +73.764 190.944 l +73.325 190.800 l +72.000 190.800 l +73.030 190.800 m +74.059 189.180 l +75.182 191.534 m +75.182 191.678 l +75.326 191.974 l +75.478 192.125 l +75.773 192.269 l +76.356 192.269 l +76.651 192.125 l +76.802 191.974 l +76.946 191.678 l +76.946 191.383 l +76.802 191.088 l +76.507 190.649 l +75.031 189.180 l +77.098 189.180 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +219.240 189.749 m +219.240 186.660 l +219.240 189.749 m +220.565 189.749 l +221.004 189.605 l +221.155 189.454 l +221.299 189.158 l +221.299 188.863 l +221.155 188.568 l +221.004 188.424 l +220.565 188.280 l +219.240 188.280 l +220.270 188.280 m +221.299 186.660 l +222.566 189.749 m +224.186 189.749 l +223.308 188.568 l +223.747 188.568 l +224.042 188.424 l +224.186 188.280 l +224.338 187.834 l +224.338 187.538 l +224.186 187.099 l +223.891 186.804 l +223.452 186.660 l +223.013 186.660 l +222.566 186.804 l +222.422 186.948 l +222.271 187.243 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +64.829 145.543 m +62.474 145.543 l +62.028 145.694 l +61.884 145.838 l +61.740 146.133 l +61.740 146.428 l +61.884 146.724 l +62.028 146.875 l +62.474 147.019 l +62.770 147.019 l +64.829 144.283 m +64.829 142.663 l +63.648 143.541 l +63.648 143.102 l +63.504 142.807 l +63.360 142.663 l +62.914 142.512 l +62.618 142.512 l +62.179 142.663 l +61.884 142.951 l +61.740 143.397 l +61.740 143.836 l +61.884 144.283 l +62.028 144.427 l +62.323 144.571 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +43.594 185.789 m +43.594 183.434 l +43.443 182.988 l +43.299 182.844 l +43.004 182.700 l +42.709 182.700 l +42.414 182.844 l +42.270 182.988 l +42.118 183.434 l +42.118 183.730 l +44.566 185.198 m +44.862 185.350 l +45.301 185.789 l +45.301 182.700 l +S +1 J +1 j +0.43 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +285.510 185.789 m +285.510 183.435 l +285.366 182.988 l +285.222 182.844 l +284.926 182.700 l +284.631 182.700 l +284.336 182.844 l +284.185 182.988 l +284.041 183.435 l +284.041 183.730 l +286.633 185.055 m +286.633 185.199 l +286.777 185.494 l +286.928 185.645 l +287.223 185.789 l +287.814 185.789 l +288.102 185.645 l +288.253 185.494 l +288.397 185.199 l +288.397 184.903 l +288.253 184.608 l +287.958 184.169 l +286.482 182.700 l +288.548 182.700 l +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +95.047 181.620 m +88.79 181.56 83.75 176.44 83.81 170.18 c +83.87 163.92 88.99 158.89 95.25 158.94 c +101.51 159.00 106.54 164.12 106.49 170.38 c +106.43 176.57 101.43 181.57 95.25 181.62 c +S +1 J +1 j +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +307.296 187.985 m +309.64 191.09 309.03 195.50 305.93 197.85 c +302.83 200.19 298.41 199.58 296.06 196.48 c +294.16 193.97 294.16 190.50 296.06 187.98 c +S +0.72 w +1.00 0.80 0.00 RG /a0 gs +[] 0 d +156.83 196.15 m 156.83 196.61 156.44 196.99 155.98 196.99 c +155.51 196.99 155.13 196.61 155.13 196.15 c +155.13 195.68 155.51 195.30 155.98 195.30 c +156.44 195.30 156.83 195.68 156.83 196.15 c +S +1.00 0.80 0.00 rg /a0 gs +[] 0 d +102.835 161.776 m +107.37 166.54 107.37 174.02 102.84 178.78 c +h +f +1 J +1 j +0.72 w +1.00 0.00 1.00 RG /a0 gs +27.000 201.240 m +310.465 201.240 l +310.465 19.823 l +27.000 19.823 l +27.000 201.240 l +S +endstream +endobj +1 0 obj +<> +endobj +2 0 obj +<< +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << +>> +/XObject << +>> +/ExtGState << + /a0 << /CA 1.00 /ca 1.00 >> +>> +>> +endobj +5 0 obj +<< +/Producer (jsPDF 0.0.0) +/CreationDate (D:20230811000431-04'00') +>> +endobj +6 0 obj +<< +/Type /Catalog +/Pages 1 0 R +/OpenAction [3 0 R /FitH null] +/PageLayout /OneColumn +>> +endobj +xref +0 7 +0000000000 65535 f +0000356975 00000 n +0000357032 00000 n +0000000015 00000 n +0000000124 00000 n +0000357172 00000 n +0000357257 00000 n +trailer +<< +/Size 7 +/Root 6 0 R +/Info 5 0 R +/ID [ ] +>> +startxref +357360 +%%EOF \ No newline at end of file diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..069c366 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,76 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[platformio] +default_envs = tbeam-v101 ; Note: the github actions CI test build can't yet build NRF52 targets + +[env] +build_unflags = -O2 +build_flags = -Wno-missing-field-initializers -Isrc -Ofast +monitor_speed = 115200 +extra_scripts = + pre:platformio_version_increment/version_increment_pre.py + post:platformio_version_increment/version_increment_post.py +lib_extra_dirs = + ./libs +lib_deps = + 1260 ; OneButton library for non-blocking button debounce + Wire + FS + SPI + ArduinoJson + CayenneLPP +; https://github.com/meshtastic/SparkFun_Ublox_Arduino_Library.git + https://github.com/meshtastic/RadioLib.git#8657380241bce681c33aab46598bbf13b11f876c + https://github.com/lvgl/lv_port_esp32.git + adafruit/Adafruit MCP23017 Arduino Library + + +[esp32_base] +monitor_filters = esp32_exception_decoder +board_build.partitions = partition-table.csv +framework = arduino +board_build.filesystem = spiffs +src_filter = + ${env.src_filter} +upload_speed = 921600 +build_flags = ${env.build_flags} -Wall -Wextra -mfix-esp32-psram-cache-issue -Wno-format-truncation -DLV_LVGL_H_INCLUDE_SIMPLE -DRADIOLIB_GODMODE -DARDUINOJSON_USE_DOUBLE=1 -Wwrite-strings +# -flto -Wl,-flto + +platform = espressif32 +#platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-upstream +#platform_packages = +# framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#2.0.0 +# toolchain-xtensa-esp32 @ 8.4.0+2021r1 + +[tbeam] +monitor_filters = esp32_exception_decoder +extends = esp32_base +board = ttgo-t-beam +lib_deps = + ${env.lib_deps} + +[env:tbeam-v100] +extends = tbeam +build_flags = ${esp32_base.build_flags} -D AD_V100 + +[env:tbeam-v101] +extends = tbeam +build_flags = ${esp32_base.build_flags} -D AD_V101 + + +[env:tbeam-v101-noscreen] +extends = tbeam +build_flags = ${esp32_base.build_flags} -D AD_V101 -D AD_NOSCREEN + +[env:lora32-noscreen] +extends = esp32_base +board = ttgo-lora32-v1 +build_flags = ${esp32_base.build_flags} -D AD_LORA32_V1 -D AD_NOSCREEN diff --git a/platformio_version_increment/version_increment_post.py b/platformio_version_increment/version_increment_post.py new file mode 100644 index 0000000..ac0eb1a --- /dev/null +++ b/platformio_version_increment/version_increment_post.py @@ -0,0 +1,31 @@ +""" Remove version increment guard file if present """ +import os + +Import("env") + +## DO NOT EDIT THIS FILE, edit version file if you want to start from a different version +# +# version_increment_post.py - Simple versioning script for Platformio +# +# Copyright (C) 2020 Davide Perini +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# You should have received a copy of the MIT License along with this program. +# If not, see . +# + +def remove_guard_file(source, target, env): + """ Remove version increment guard file if present """ + if os.path.exists(".version_no_increment"): + os.remove(".version_no_increment") + +env.AddPostAction("upload", remove_guard_file) diff --git a/platformio_version_increment/version_increment_pre.py b/platformio_version_increment/version_increment_pre.py new file mode 100644 index 0000000..64ae177 --- /dev/null +++ b/platformio_version_increment/version_increment_pre.py @@ -0,0 +1,74 @@ +""" Create version header and tracker file if missing """ +import datetime +import os + +Import("env") + +## DO NOT EDIT THIS FILE, edit version file if you want to start from a different version +# +# version_increment_pre.py - Simple versioning script for Platformio +# +# Copyright (C) 2020 Davide Perini +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# You should have received a copy of the MIT License along with this program. +# If not, see . +# + +VERSION_FILE = 'version' +VERSION_HEADER = 'version.h' +VERSION_PREFIX = '1.0.' +VERSION_PATCH_NUMBER = 0 + +if not os.path.exists(".version_no_increment"): + try: + with open(VERSION_FILE) as FILE: + VERSION_PATCH_NUMBER = FILE.readline() + VERSION_PREFIX = VERSION_PATCH_NUMBER[0:VERSION_PATCH_NUMBER.rindex('.')+1] + VERSION_PATCH_NUMBER = int(VERSION_PATCH_NUMBER[VERSION_PATCH_NUMBER.rindex('.')+1:]) + 1 + except: + print('No version file found or incorrect data in it. Starting from 0.1.0') + VERSION_PATCH_NUMBER = 0 + with open(VERSION_FILE, 'w+') as FILE: + FILE.write(VERSION_PREFIX + str(VERSION_PATCH_NUMBER)) + print('Build number: {}'.format(VERSION_PREFIX + str(VERSION_PATCH_NUMBER))) + + HEADER_FILE = """ + // AUTO GENERATED FILE, DO NOT EDIT + #ifndef VERSION + #define VERSION "{}" + #endif + #ifndef BUILD_TIMESTAMP + #define BUILD_TIMESTAMP "{}" + #endif + """.format(VERSION_PREFIX + str(VERSION_PATCH_NUMBER), datetime.datetime.now()) + + if os.environ.get('PLATFORMIO_INCLUDE_DIR') is not None: + VERSION_HEADER = os.environ.get('PLATFORMIO_INCLUDE_DIR') + os.sep + VERSION_HEADER + elif os.path.exists("include"): + VERSION_HEADER = "include" + os.sep + VERSION_HEADER + else: + PROJECT_DIR = env.subst("$PROJECT_DIR") + os.mkdir(PROJECT_DIR + os.sep + "include") + VERSION_HEADER = "include" + os.sep + VERSION_HEADER + + with open(VERSION_HEADER, 'w+') as FILE: + FILE.write(HEADER_FILE) + + open('.version_no_increment', 'a').close() +else: + if os.path.exists("version"): + FILE = open(VERSION_FILE) + VERSION_NUMBER = FILE.readline() + print('Build number: {} (waiting for upload before next increment)'.format(str(VERSION_NUMBER))) + else: + print('No version file found or incorrect data in it!!') diff --git a/screens/cprj/app.c b/screens/cprj/app.c new file mode 100644 index 0000000..a477eaf --- /dev/null +++ b/screens/cprj/app.c @@ -0,0 +1,32 @@ +#include "app.h" + +/********************** + * WIDGETS + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + + +void app_create(lv_obj_t *parent) +{ + + static lv_style_t toplabel_s0; + lv_style_init(&toplabel_s0); + lv_style_set_text_font(&toplabel_s0,LV_STATE_DEFAULT,&Roboto 16); + lv_style_set_text_font(&toplabel_s0,LV_STATE_CHECKED,&Roboto 16); + lv_style_set_text_font(&toplabel_s0,LV_STATE_FOCUSED,&Roboto 16); + lv_style_set_text_font(&toplabel_s0,LV_STATE_EDITED,&Roboto 16); + lv_style_set_text_font(&toplabel_s0,LV_STATE_HOVERED,&Roboto 16); + lv_style_set_text_font(&toplabel_s0,LV_STATE_PRESSED,&Roboto 16); + lv_style_set_text_font(&toplabel_s0,LV_STATE_DISABLED,&Roboto 16); + lv_obj_t *toplabel = lv_label_create(parent, NULL); + lv_label_set(toplabel,"Main Menu") + lv_label_set_align(toplabel, LV_LABEL_ALIGN_CENTER); + lv_label_set_long_mode(toplabel, LV_LABEL_LONG_DOT); + lv_obj_set_pos(toplabel, 0, 2); + lv_obj_set_size(toplabel, 320, 19); + lv_obj_add_style(toplabel, 0, &toplabel_s0); + +} diff --git a/screens/cprj/app.h b/screens/cprj/app.h new file mode 100644 index 0000000..3842ea8 --- /dev/null +++ b/screens/cprj/app.h @@ -0,0 +1,28 @@ +#ifndef APP_H +#define APP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************** + * INCLUDES + **********************/ + +#include "lvgl/lvgl.h" + +/********************** + * WIDGETS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void app_create(lv_obj_t *parent); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*APP_H*/ \ No newline at end of file diff --git a/screens/mainmenu.lvgl b/screens/mainmenu.lvgl new file mode 100644 index 0000000..fa8b13d --- /dev/null +++ b/screens/mainmenu.lvgl @@ -0,0 +1,84 @@ +{ + "fonts": [ + ], + "images": [ + ], + "lvgl": { + "name": "App", + "resolution": { + "height": 240, + "width": 320 + }, + "screen color": "#ffffff", + "widgets": [ + { + "accessible": false, + "align": "Center", + "class": "lv_label", + "geometry": { + "height": 19, + "width": 320, + "x": 0, + "y": 2 + }, + "locked": false, + "long mode": "Dot", + "name": "topLabel", + "recolor": false, + "styles": [ + { + "Text": { + "text_font": "Roboto 16" + }, + "part": 0, + "state": 0 + }, + { + "Text": { + "text_font": "Roboto 16" + }, + "part": 0, + "state": 1 + }, + { + "Text": { + "text_font": "Roboto 16" + }, + "part": 0, + "state": 2 + }, + { + "Text": { + "text_font": "Roboto 16" + }, + "part": 0, + "state": 3 + }, + { + "Text": { + "text_font": "Roboto 16" + }, + "part": 0, + "state": 4 + }, + { + "Text": { + "text_font": "Roboto 16" + }, + "part": 0, + "state": 5 + }, + { + "Text": { + "text_font": "Roboto 16" + }, + "part": 0, + "state": 6 + } + ], + "text": "Main Menu", + "widget": "Label" + } + ] + } +} diff --git a/screens/mainscreen/content/calibri_6_L8.bin b/screens/mainscreen/content/calibri_6_L8.bin new file mode 100644 index 0000000..ae8fadc Binary files /dev/null and b/screens/mainscreen/content/calibri_6_L8.bin differ diff --git a/screens/mainscreen/content/calibri_6_L8.binh b/screens/mainscreen/content/calibri_6_L8.binh new file mode 100644 index 0000000..dd109c2 --- /dev/null +++ b/screens/mainscreen/content/calibri_6_L8.binh @@ -0,0 +1,105 @@ +0x78, 0xda, 0xdd, 0x9a, 0x7, 0x5c, 0x14, 0x47, 0x17, 0xc0, 0x7, 0xee, 0x38, 0xe, 0x8e, 0x22, 0x20, 0x28, 0xa, 0x88, 0x28, 0xa, 0x76, 0xd, 0x96, 0xf8, 0xa1, 0x12, 0x3b, 0x6a, 0x62, 0x43, +0x41, 0xa3, 0x46, 0xec, 0x6, 0x5b, 0x54, 0x4, 0x3b, 0x26, 0xd8, 0x3b, 0x6a, 0xa2, 0x44, 0x8d, 0x60, 0x2f, 0x8, 0x4, 0x62, 0x43, 0x51, 0x8a, 0x80, 0x68, 0x22, 0x82, 0x20, 0xc5, 0x42, 0x6f, +0x7a, 0x70, 0xe0, 0x89, 0x46, 0x89, 0xfb, 0xed, 0xde, 0xce, 0xce, 0x5b, 0x13, 0x8, 0xb7, 0x7a, 0x29, 0xdf, 0x37, 0xbf, 0x1f, 0xc7, 0x7f, 0x77, 0x67, 0x67, 0xdf, 0xbe, 0x99, 0x79, 0xf3, 0xde, +0x9b, 0x45, 0xe8, 0xcf, 0x8b, 0x48, 0xac, 0x23, 0x91, 0xe8, 0x49, 0x45, 0x62, 0xb1, 0x44, 0x22, 0x12, 0x8b, 0xe8, 0x3, 0xae, 0x88, 0x44, 0xcc, 0xaf, 0x4c, 0x97, 0x2e, 0x12, 0x89, 0x54, 0x57, +0x24, 0x96, 0xe8, 0xe8, 0x4b, 0xa5, 0x12, 0x3d, 0xd5, 0x91, 0x8c, 0xbe, 0x24, 0xd6, 0x11, 0x4b, 0x74, 0xe9, 0xdb, 0xe8, 0x7b, 0x54, 0x37, 0x4b, 0x44, 0xfa, 0x12, 0x7c, 0x5a, 0xa2, 0xa7, 0x23, +0xa1, 0xff, 0x89, 0x25, 0x48, 0x44, 0x3f, 0xc3, 0x0, 0xff, 0xc9, 0xe8, 0xbf, 0x55, 0x62, 0xf4, 0xaf, 0x2b, 0xe3, 0xce, 0x2, 0xbb, 0x9f, 0x7, 0x1e, 0x7b, 0x6, 0xf8, 0xb3, 0xe3, 0xc0, 0xc3, +0x82, 0x80, 0x7, 0x4, 0xd6, 0xdd, 0xe6, 0xe7, 0x3f, 0xa, 0x93, 0xa1, 0x6d, 0x52, 0xe3, 0x2c, 0x8e, 0x6d, 0x62, 0xf4, 0xd3, 0x38, 0x36, 0xe, 0x47, 0xd7, 0xff, 0x36, 0x45, 0xc, 0xdc, 0x83, +0x12, 0x4d, 0x31, 0xcf, 0xf1, 0x46, 0x4f, 0x30, 0x7a, 0x51, 0x74, 0xb9, 0x88, 0xf, 0x8e, 0x38, 0xb7, 0xbc, 0xca, 0xd5, 0xbf, 0x66, 0xe3, 0x72, 0x98, 0x43, 0xa6, 0xce, 0x74, 0x96, 0xb5, 0x1e, +0xa3, 0x15, 0x18, 0x91, 0x65, 0xc, 0x3a, 0xf0, 0x49, 0x83, 0xf, 0x96, 0x92, 0x26, 0x91, 0x6f, 0xd9, 0x6f, 0x3f, 0x63, 0x74, 0xc8, 0x6b, 0x41, 0x4e, 0x77, 0xca, 0xd7, 0x87, 0xea, 0x47, 0x9f, +0x2c, 0x33, 0x21, 0x7, 0x3d, 0x8f, 0x15, 0x5b, 0xc2, 0xa5, 0xc8, 0x99, 0xec, 0xff, 0x99, 0xf3, 0xc, 0xed, 0x32, 0xfb, 0xb3, 0xec, 0x98, 0xfc, 0xb6, 0x60, 0x39, 0xa9, 0x71, 0xb3, 0x41, 0x69, +0xec, 0x32, 0x4b, 0x3e, 0x46, 0x5a, 0x61, 0x8e, 0xc, 0x7f, 0x3d, 0xc3, 0x35, 0x8, 0xcd, 0xf7, 0x55, 0x9d, 0x5f, 0xef, 0x39, 0xf0, 0xa0, 0xe3, 0x65, 0x6d, 0x15, 0xb7, 0xcb, 0x2f, 0xec, 0x75, +0xdd, 0x96, 0xdc, 0xb2, 0x61, 0xca, 0xd6, 0x6a, 0xac, 0xa, 0xe7, 0x53, 0x6, 0x69, 0x86, 0xb7, 0x55, 0x22, 0x19, 0xc6, 0x9b, 0x1a, 0xa5, 0xca, 0x12, 0xcc, 0x19, 0xde, 0x37, 0x18, 0xa1, 0x40, +0xe5, 0xb7, 0x6a, 0xf7, 0x85, 0x7d, 0x42, 0x4d, 0x46, 0x17, 0xcc, 0xfb, 0xb7, 0x49, 0x3, 0x76, 0x62, 0xf6, 0xdb, 0x63, 0x1a, 0xe3, 0x8a, 0xd9, 0x54, 0x91, 0x36, 0x8, 0xa3, 0xf8, 0xca, 0xd6, +0xe2, 0x1e, 0xa8, 0x54, 0xc5, 0xae, 0xd7, 0x51, 0x9f, 0xc2, 0xa5, 0xb1, 0x2a, 0x76, 0x29, 0xeb, 0xa0, 0xeb, 0x43, 0x5, 0x48, 0x54, 0xfd, 0xb2, 0xfe, 0xe9, 0xcb, 0x28, 0xd7, 0x4b, 0xc7, 0xd4, +0x1e, 0x93, 0xc9, 0xc0, 0x36, 0x71, 0xc0, 0xc6, 0x91, 0x7f, 0xe3, 0xe4, 0x6c, 0x11, 0xd, 0xbc, 0x79, 0x3a, 0x70, 0x4e, 0x53, 0x82, 0x66, 0xa5, 0x70, 0xba, 0x73, 0x2a, 0x70, 0xd7, 0x34, 0xe0, +0x26, 0x4f, 0x79, 0x6d, 0x16, 0xc2, 0xb8, 0x42, 0xbb, 0x97, 0xf2, 0x3a, 0x3e, 0xae, 0x4e, 0x11, 0x5a, 0x5d, 0xe1, 0x1d, 0xc4, 0x74, 0x0, 0xf6, 0x5d, 0xb, 0x3c, 0xe4, 0x22, 0x4f, 0x8, 0xde, +0x83, 0xbb, 0xf0, 0x4, 0x1a, 0x7a, 0x1, 0x78, 0xb9, 0x1f, 0x70, 0x6c, 0x17, 0x10, 0x21, 0xba, 0x1e, 0x3d, 0xd8, 0x7c, 0xe9, 0x61, 0x85, 0x51, 0xfb, 0xf0, 0x8d, 0xa8, 0x3d, 0x1c, 0x7f, 0x1f, +0x13, 0xb5, 0x9b, 0xab, 0x63, 0xeb, 0x35, 0xa1, 0xc5, 0x3f, 0x62, 0x41, 0xe7, 0xcd, 0x1, 0x5e, 0x34, 0x8f, 0xa3, 0x6d, 0x8c, 0x4d, 0xf0, 0xff, 0xe3, 0xf9, 0x77, 0xeb, 0xff, 0xb, 0x4a, 0xa9, +0x1d, 0x41, 0xeb, 0x6c, 0x1d, 0xc2, 0xdb, 0x5d, 0x34, 0xd3, 0x3c, 0xad, 0x87, 0x5e, 0xe8, 0x7f, 0xa0, 0xe8, 0x15, 0x19, 0xa9, 0x53, 0x6d, 0xc5, 0x42, 0xe0, 0xfb, 0xa0, 0xb9, 0xe, 0x3c, 0x6b, +0xf1, 0xcd, 0x12, 0xe0, 0x4c, 0x6b, 0x98, 0x90, 0xf1, 0xbc, 0xb9, 0x3c, 0x1f, 0xf8, 0x21, 0x18, 0xf0, 0x9e, 0xbc, 0xd5, 0x6e, 0x7, 0x6f, 0x94, 0x64, 0x98, 0xd7, 0x23, 0xcd, 0xe7, 0x25, 0xca, +0x0, 0x2d, 0x3c, 0xfc, 0xcb, 0xbb, 0x36, 0xcf, 0xc1, 0x6, 0x71, 0xfe, 0x77, 0x8, 0xad, 0xdb, 0x8e, 0x1f, 0xb5, 0x2, 0xa1, 0x69, 0xc1, 0x2c, 0x6f, 0x5d, 0x89, 0x90, 0xe7, 0x11, 0x96, 0x97, +0xd1, 0xd6, 0xf8, 0xeb, 0xf5, 0x2c, 0x77, 0x2b, 0x6d, 0xdb, 0xe2, 0x89, 0x13, 0x6e, 0x73, 0x65, 0x49, 0xc5, 0x42, 0x1, 0x7a, 0x93, 0x7e, 0x7, 0xf3, 0x3d, 0xe1, 0x60, 0x26, 0x98, 0x70, 0x7, +0x60, 0x24, 0x90, 0xcb, 0x60, 0x39, 0x55, 0xab, 0xe8, 0xec, 0x56, 0xe4, 0xb9, 0x61, 0x6e, 0xbf, 0xdb, 0xc4, 0x53, 0xa1, 0x45, 0x2e, 0x35, 0x7b, 0x2b, 0x21, 0x3c, 0x1d, 0xcc, 0x8b, 0xf9, 0xa3, +0xce, 0x1c, 0xca, 0x62, 0x27, 0x72, 0xa8, 0x7f, 0x63, 0x36, 0xa9, 0x31, 0x9c, 0x99, 0xbf, 0x53, 0xd5, 0x97, 0x41, 0x1c, 0x50, 0x55, 0x3a, 0x7, 0x64, 0x18, 0x59, 0x45, 0xae, 0xe8, 0x7a, 0xc5, +0x72, 0xb8, 0x8f, 0xaa, 0x1c, 0xa, 0x9a, 0x73, 0x53, 0xf2, 0xc, 0x56, 0xca, 0x28, 0xf6, 0xff, 0x84, 0x85, 0x46, 0x7d, 0x95, 0x2d, 0xb1, 0xd9, 0x8b, 0x7e, 0xf9, 0x78, 0x8a, 0xa0, 0x51, 0xdc, +0xa4, 0xec, 0x7, 0xc2, 0xc1, 0x47, 0x4e, 0x71, 0xe8, 0x1c, 0x39, 0x8a, 0x63, 0x51, 0x52, 0x2b, 0xc2, 0x5e, 0xeb, 0x10, 0xe1, 0x70, 0xe6, 0x7d, 0xcf, 0x91, 0x9b, 0xc9, 0x79, 0xba, 0x8c, 0x38, +0x2a, 0x40, 0x2, 0xed, 0x57, 0x14, 0x95, 0xcd, 0xe9, 0xe4, 0x21, 0x4f, 0x3f, 0x3c, 0xd6, 0xae, 0x7d, 0x93, 0xef, 0x4d, 0xd4, 0x20, 0xe9, 0xad, 0xe8, 0x6, 0xd7, 0xae, 0x8d, 0x21, 0xde, 0xb9, +0xcb, 0x33, 0x1b, 0x96, 0x6, 0x17, 0xbf, 0xce, 0x18, 0x29, 0x44, 0xd, 0xd6, 0x11, 0xd5, 0x5, 0xad, 0xb8, 0x41, 0xe9, 0x6b, 0xdc, 0xc2, 0x10, 0xf7, 0x4b, 0xa, 0xcf, 0xef, 0x7d, 0x94, 0x55, +0x13, 0x65, 0xc6, 0xf2, 0xa4, 0x5b, 0xb6, 0x46, 0x11, 0x2b, 0x71, 0xbf, 0xd3, 0xde, 0xd8, 0xe2, 0x5d, 0x58, 0x9b, 0x4a, 0x27, 0x8b, 0xe4, 0xf1, 0xf8, 0x86, 0x2f, 0x9f, 0x95, 0x6d, 0xd6, 0x52, +0x5f, 0x84, 0x2f, 0x18, 0x7d, 0xae, 0x86, 0xe3, 0xc4, 0x41, 0x4, 0x9d, 0xb2, 0xa0, 0x9d, 0x60, 0x98, 0x6b, 0x16, 0x72, 0x63, 0xc2, 0xab, 0xf, 0x80, 0xe2, 0x8a, 0xc8, 0x50, 0x45, 0xa3, 0x5, +0xba, 0xc3, 0x2b, 0x4b, 0x15, 0xdf, 0x6b, 0xe3, 0xe9, 0x55, 0x64, 0x65, 0x99, 0x8d, 0x9d, 0x51, 0xbb, 0x3c, 0x3, 0x49, 0xaa, 0x3d, 0x37, 0x8, 0xb2, 0xee, 0x70, 0x13, 0x40, 0x7c, 0x38, 0x20, +0x30, 0x1e, 0x3b, 0x97, 0xd3, 0x68, 0x8f, 0x6e, 0x17, 0x5e, 0xe2, 0xbd, 0x62, 0xcc, 0x1b, 0x85, 0x63, 0x57, 0x41, 0xff, 0x74, 0x95, 0xe2, 0x84, 0xbe, 0x0, 0x19, 0xfc, 0x8a, 0x9f, 0x71, 0xef, +0x38, 0x38, 0xc3, 0xa6, 0xb3, 0x2, 0xf7, 0xcb, 0x8a, 0x8d, 0x8, 0x9d, 0xf2, 0xc4, 0xcf, 0xba, 0x69, 0x6a, 0x79, 0x9, 0xb7, 0xaf, 0x77, 0x5e, 0x99, 0x97, 0x35, 0x17, 0x6e, 0xbf, 0xd8, 0xf, +0xbb, 0x7b, 0x56, 0x6, 0x33, 0xef, 0xe3, 0x77, 0xe9, 0x54, 0xa2, 0xbc, 0xdc, 0x4a, 0x3, 0x36, 0xff, 0x97, 0x3e, 0xff, 0xcc, 0xbd, 0x1a, 0x6b, 0x34, 0x1a, 0xac, 0x89, 0x24, 0x1b, 0x7c, 0xc2, +0xe9, 0xb3, 0xd4, 0xba, 0xdb, 0xf6, 0x98, 0x7, 0xe7, 0x44, 0xee, 0xc8, 0x9a, 0x82, 0x75, 0x3b, 0x3e, 0x7b, 0x21, 0xb1, 0x98, 0x6e, 0xe9, 0xb3, 0x21, 0x62, 0x35, 0xdb, 0x71, 0xdf, 0x3, 0xc6, +0xad, 0xed, 0xf1, 0x9, 0xbc, 0x96, 0xb4, 0x34, 0xab, 0x86, 0x99, 0xcc, 0xdc, 0x99, 0xa4, 0xfe, 0x79, 0xa1, 0x85, 0x2f, 0xee, 0xd4, 0x20, 0x1b, 0xb0, 0x4b, 0x93, 0xee, 0x6f, 0x69, 0x4, 0xab, +0xca, 0x9c, 0x34, 0x62, 0x74, 0x74, 0x97, 0x3c, 0x1c, 0x8d, 0xeb, 0x4c, 0xcd, 0xde, 0xc6, 0xc5, 0x5f, 0x53, 0x8f, 0xda, 0xbc, 0xb7, 0xa, 0x5a, 0x64, 0xfc, 0x9a, 0x35, 0xc, 0x26, 0xf9, 0xa7, +0xe0, 0xc6, 0x6b, 0xf, 0x28, 0x27, 0x5c, 0x5e, 0x30, 0x96, 0xb0, 0x9c, 0x77, 0x77, 0x76, 0x3d, 0x8b, 0xb1, 0xbc, 0x89, 0x20, 0x21, 0xb4, 0xe7, 0x26, 0x57, 0xc9, 0x63, 0xd8, 0x48, 0xf1, 0x74, +0x58, 0x2f, 0x99, 0x81, 0x7b, 0x9, 0x63, 0x8a, 0x27, 0x84, 0x9b, 0xc7, 0x55, 0x6, 0xb9, 0xcf, 0x66, 0x7c, 0xeb, 0x2b, 0x5d, 0x3, 0x36, 0x58, 0x66, 0x7d, 0xf4, 0x31, 0x93, 0x1a, 0xc8, 0x43, +0x99, 0x66, 0x28, 0x55, 0xea, 0x46, 0xbb, 0x17, 0xa8, 0x8, 0x15, 0xdb, 0x79, 0xc8, 0x1b, 0x5f, 0x1d, 0xce, 0x78, 0x39, 0x2d, 0x77, 0xbf, 0xdc, 0x17, 0xf4, 0x5c, 0xe5, 0x8a, 0x2f, 0x48, 0x71, +0xd1, 0x23, 0xcd, 0x7f, 0x75, 0x9f, 0x5e, 0xd, 0x7a, 0x36, 0x20, 0xc4, 0xb0, 0x37, 0xff, 0x21, 0x7c, 0xe2, 0x2c, 0x9, 0x12, 0xf5, 0x1e, 0x37, 0x2f, 0x11, 0x71, 0xc6, 0xfa, 0x0, 0xba, 0x31, +0x18, 0x73, 0xc8, 0x20, 0xe4, 0x85, 0xa3, 0x4d, 0xc3, 0x97, 0xf4, 0x78, 0x50, 0xb0, 0xc3, 0x75, 0x12, 0x23, 0x60, 0xa, 0xdb, 0x61, 0x21, 0x8c, 0xd2, 0x96, 0x1c, 0x51, 0x5b, 0xd, 0x55, 0x94, +0xf2, 0xa, 0x5e, 0xa, 0x50, 0x2d, 0x32, 0xbe, 0xe0, 0x4d, 0xd8, 0x28, 0x8a, 0xf3, 0x2b, 0x6a, 0x29, 0x2a, 0xaf, 0x35, 0x39, 0x2f, 0xf3, 0x4b, 0x20, 0x8c, 0x9a, 0xd4, 0x10, 0xd6, 0xf1, 0xbe, +0x4d, 0xda, 0x7c, 0x93, 0xdc, 0x51, 0x48, 0x5f, 0x18, 0x5, 0x2b, 0xb, 0x38, 0x7, 0xe2, 0xe2, 0x21, 0x8b, 0x56, 0x91, 0xac, 0x2f, 0xde, 0xb1, 0x4c, 0x97, 0x54, 0x99, 0x78, 0x9, 0xaa, 0x4f, +0xfb, 0x9, 0xb8, 0x5f, 0x21, 0x4c, 0x53, 0xed, 0xd4, 0x3d, 0xe6, 0x2d, 0x43, 0xd, 0xb0, 0x3, 0x11, 0xa9, 0xc8, 0xf3, 0x42, 0x2, 0xf4, 0xf0, 0xf2, 0x16, 0xd7, 0x17, 0xb5, 0x62, 0xfd, 0xa9, +0xd5, 0xed, 0x38, 0x46, 0x68, 0xe3, 0x21, 0xe0, 0x21, 0x49, 0xc0, 0xc3, 0xef, 0x0, 0xfb, 0x1f, 0xe4, 0xd8, 0xe4, 0x73, 0xb9, 0x3d, 0xd7, 0x66, 0xd, 0x6f, 0xe9, 0x53, 0x47, 0x6, 0x8a, 0xb2, +0x47, 0xd0, 0x26, 0xaa, 0x8b, 0x29, 0xea, 0x32, 0x6a, 0xa8, 0x8e, 0xf8, 0xdd, 0x36, 0xbb, 0x8, 0x93, 0x41, 0x89, 0x1a, 0x96, 0xe1, 0x67, 0x21, 0x32, 0x28, 0x45, 0x2, 0xd, 0x84, 0xc4, 0xbf, +0xb8, 0xe6, 0x46, 0x57, 0x96, 0xcf, 0x5c, 0x6e, 0x6f, 0xe8, 0xc6, 0x46, 0xbd, 0x4e, 0x65, 0x6, 0x10, 0x49, 0x82, 0xbf, 0x86, 0x66, 0x9f, 0x45, 0x7d, 0x28, 0xea, 0xa4, 0x8a, 0x7b, 0x17, 0xd3, +0xb, 0xb4, 0x5b, 0x18, 0x7b, 0x21, 0x2a, 0xdc, 0x5e, 0x77, 0x11, 0x66, 0x83, 0x80, 0xa7, 0x6f, 0xd2, 0xd5, 0x37, 0xa0, 0x8c, 0xcc, 0xfe, 0x8b, 0xe1, 0x5d, 0x36, 0xf9, 0xd6, 0xc1, 0x8c, 0x4d, +0xf6, 0x6d, 0xa0, 0xe, 0x8f, 0x55, 0x6d, 0x2e, 0x51, 0x5f, 0xd, 0xd5, 0xa2, 0x86, 0x75, 0x2b, 0x94, 0x5, 0xf7, 0x85, 0xc3, 0x3d, 0xe0, 0xe, 0x99, 0x2, 0xf9, 0x1, 0xf0, 0x28, 0x88, 0x1, +0xe5, 0x95, 0xe3, 0x4, 0x89, 0xf0, 0x5c, 0x84, 0xbe, 0x9, 0x24, 0xef, 0x32, 0xfc, 0xbe, 0x21, 0xc7, 0xad, 0x1e, 0xd9, 0x93, 0x77, 0xbc, 0xed, 0x1, 0xef, 0xbb, 0x19, 0x12, 0xb8, 0xb5, 0x7a, +0xb7, 0xa7, 0x83, 0x1e, 0xda, 0x94, 0xb5, 0x1, 0x3d, 0xcc, 0x88, 0x11, 0x26, 0x83, 0xc6, 0xfb, 0x82, 0x9e, 0x6b, 0x45, 0x42, 0xf4, 0x50, 0x71, 0x4b, 0x95, 0x7c, 0xfa, 0xad, 0x3b, 0xfd, 0xfb, +0xea, 0x26, 0x6d, 0xad, 0x44, 0x39, 0x89, 0x4c, 0xaa, 0xe2, 0xd5, 0x2c, 0xda, 0x40, 0x8d, 0xc, 0xbe, 0xa4, 0x62, 0xe3, 0x72, 0x19, 0x8a, 0xec, 0xcb, 0x32, 0xed, 0x65, 0x5a, 0x3f, 0x40, 0x98, +0x5d, 0xe3, 0xfc, 0x7c, 0x38, 0x16, 0x15, 0x97, 0x36, 0x65, 0xb9, 0x92, 0x1e, 0x9e, 0xf4, 0xf2, 0x11, 0xe1, 0xac, 0xae, 0xc, 0x41, 0xf4, 0x3c, 0xc4, 0xe9, 0x2c, 0x45, 0xae, 0x13, 0xea, 0x85, +0x33, 0xb8, 0x55, 0x33, 0xaf, 0x10, 0x56, 0x8a, 0xb3, 0x3f, 0x21, 0x8c, 0xdc, 0x13, 0x81, 0xb5, 0x7e, 0x59, 0x47, 0x18, 0xb9, 0x56, 0x62, 0x66, 0x52, 0x74, 0x17, 0xc3, 0x5, 0x28, 0xa2, 0x51, +0x50, 0xd5, 0x8b, 0xf3, 0x78, 0xb9, 0x8f, 0xf9, 0xae, 0xb9, 0xd5, 0xc1, 0x44, 0x36, 0xcd, 0x50, 0x44, 0x77, 0x92, 0xe4, 0xa9, 0x6a, 0xe9, 0x99, 0xa8, 0x6a, 0xef, 0xfa, 0x67, 0xcc, 0xef, 0x94, +0x50, 0xe6, 0x37, 0x4e, 0xe5, 0x30, 0x3a, 0x3f, 0xa6, 0xbd, 0x15, 0xbd, 0x4a, 0x55, 0x94, 0xa9, 0x9d, 0xb1, 0xd1, 0xc2, 0x3a, 0x38, 0x84, 0x6d, 0xa7, 0xe5, 0x85, 0xa, 0xc5, 0x41, 0x99, 0xda, +0x22, 0x28, 0x28, 0xe5, 0x71, 0x3, 0xd2, 0xa7, 0x16, 0x37, 0x56, 0x43, 0xff, 0x2e, 0x3a, 0x42, 0xb8, 0x79, 0xd2, 0x2c, 0x62, 0x33, 0x4b, 0xb7, 0x69, 0x6b, 0x7a, 0x6e, 0xd2, 0x7a, 0x50, 0x9e, +0xb1, 0xe0, 0xe9, 0x21, 0x8e, 0xaf, 0x7, 0x47, 0x9e, 0x1e, 0x3e, 0xe5, 0xe9, 0x61, 0x34, 0xe8, 0x41, 0xd1, 0x16, 0xf4, 0x10, 0x4d, 0xf4, 0x20, 0x8f, 0xcc, 0x1e, 0xc, 0xf, 0xe9, 0x73, 0xdb, +0xe5, 0x4f, 0xd7, 0x8b, 0x9a, 0xa3, 0xfa, 0xe4, 0x5d, 0xcc, 0x13, 0xbf, 0x82, 0xf7, 0xf2, 0xb, 0x20, 0xdc, 0xec, 0x8e, 0x3b, 0xac, 0x1d, 0x7b, 0xc9, 0xbb, 0x4b, 0x6, 0x95, 0x34, 0x86, 0xfa, +0x7, 0xd6, 0x81, 0x1e, 0x1c, 0x4b, 0x4, 0xe8, 0x42, 0x6b, 0x4f, 0xe5, 0x3, 0x2e, 0x85, 0x33, 0xe4, 0x67, 0xb3, 0xde, 0x1b, 0x30, 0x7f, 0x9a, 0xa, 0xfe, 0x83, 0x38, 0x32, 0x67, 0x32, 0xf8, +0xa9, 0x9f, 0x3d, 0xf8, 0x81, 0x97, 0x38, 0xa8, 0xc5, 0xd5, 0xd6, 0x7a, 0xc8, 0xc6, 0xe6, 0x73, 0x66, 0x2f, 0xfe, 0x65, 0xca, 0xc7, 0x2, 0xba, 0xe2, 0x31, 0xb3, 0x16, 0x90, 0x95, 0x79, 0x2f, +0x2f, 0xe7, 0xf9, 0x21, 0xbc, 0x6b, 0xb6, 0x90, 0xe1, 0xc0, 0xf8, 0x62, 0x43, 0xf0, 0x3e, 0x16, 0xc5, 0x24, 0x2f, 0x22, 0xd5, 0xe0, 0x8, 0x96, 0x2b, 0x9b, 0xb0, 0x71, 0x2f, 0x53, 0x42, 0xf, +0x19, 0xdb, 0xa5, 0x60, 0x73, 0x6a, 0x19, 0x56, 0x9d, 0xbf, 0x5a, 0x80, 0xc, 0xa1, 0x93, 0x99, 0xb8, 0x97, 0xbd, 0x63, 0x1a, 0xd3, 0x76, 0x3a, 0x1b, 0xc2, 0x9b, 0x54, 0x1b, 0xa1, 0x36, 0xdc, +0x4e, 0xd7, 0x4f, 0x13, 0xd1, 0xf2, 0x6f, 0xb8, 0x64, 0x41, 0x8, 0x22, 0xce, 0xa2, 0x71, 0x45, 0xdb, 0xc, 0xd2, 0xd2, 0x8f, 0x31, 0xeb, 0x8, 0x7b, 0xd4, 0xb6, 0x13, 0x20, 0x3, 0x93, 0xeb, +0x1b, 0x51, 0x46, 0xcf, 0xb6, 0xd8, 0xde, 0x68, 0xc4, 0x75, 0x84, 0x76, 0xbe, 0xee, 0x8e, 0x64, 0x95, 0x12, 0x24, 0xab, 0x96, 0xa2, 0x3b, 0x81, 0xcb, 0xd1, 0x10, 0xc6, 0x7f, 0xbc, 0x31, 0xc0, +0x28, 0xf5, 0x93, 0xab, 0x68, 0xd3, 0x2, 0x26, 0x20, 0xf7, 0x1f, 0xf6, 0xad, 0x44, 0x2e, 0x4d, 0x62, 0x66, 0x43, 0xf7, 0x84, 0x4d, 0xee, 0xe8, 0xf2, 0xa8, 0x47, 0xaa, 0x89, 0x51, 0x72, 0xcf, +0x12, 0x79, 0xdf, 0x65, 0xd7, 0x9e, 0xa3, 0xe9, 0x74, 0xf4, 0xfd, 0x46, 0xdd, 0x5c, 0xcc, 0x22, 0x7a, 0xae, 0xcd, 0x3c, 0x8d, 0x43, 0x93, 0xdc, 0x7e, 0xb2, 0x7c, 0x7, 0xce, 0x91, 0x4d, 0x5e, +0x43, 0x26, 0x80, 0x56, 0xb2, 0xbc, 0x31, 0x9, 0xb9, 0x32, 0xca, 0x49, 0x4e, 0x75, 0xe1, 0x51, 0x6f, 0x6e, 0x6b, 0xd2, 0xb4, 0xd8, 0x56, 0x9a, 0x8f, 0x8d, 0xf3, 0xc6, 0xed, 0x8, 0x79, 0xa, +0x58, 0xb4, 0x4e, 0xd2, 0xfe, 0xef, 0x56, 0xbc, 0xdd, 0xd0, 0xfd, 0x89, 0xb8, 0x51, 0x19, 0x36, 0x15, 0xe8, 0x8a, 0x87, 0x2f, 0xd9, 0x3b, 0xe8, 0x9b, 0x94, 0x6d, 0x45, 0xee, 0x88, 0xfb, 0x5e, +0xd3, 0x63, 0x72, 0xb, 0x3d, 0x2d, 0xde, 0x42, 0xe7, 0xf5, 0xc8, 0x96, 0x92, 0x19, 0x99, 0x2, 0xbe, 0xf1, 0x32, 0xd8, 0x65, 0xb5, 0x2d, 0xb0, 0x20, 0x7c, 0x61, 0x6, 0x41, 0xf7, 0x38, 0x98, +0xbd, 0x87, 0x98, 0xb9, 0x36, 0x56, 0x7d, 0x19, 0x1e, 0x50, 0x10, 0xab, 0xe6, 0x4a, 0xd1, 0x5f, 0xca, 0x99, 0xbc, 0x67, 0xdd, 0x69, 0xd, 0xe7, 0xd7, 0xac, 0x0, 0x6e, 0xcb, 0x73, 0xa9, 0x50, +0x8a, 0x3, 0x2f, 0x67, 0xc5, 0xdb, 0x57, 0x6a, 0x9d, 0xc1, 0x4f, 0x8e, 0xf0, 0xc2, 0x29, 0x5f, 0x7f, 0xe0, 0x96, 0x59, 0xbc, 0x4a, 0xb7, 0xbb, 0x2, 0x2f, 0xfe, 0xba, 0xae, 0x31, 0x49, 0x6d, +0x84, 0x3, 0x8f, 0x5d, 0x7f, 0x29, 0xbf, 0xf3, 0xac, 0x77, 0xca, 0x4d, 0xd8, 0x21, 0x77, 0x3d, 0x12, 0xc7, 0xd9, 0x6d, 0x14, 0xdb, 0x6d, 0x24, 0x77, 0xa1, 0x57, 0xc, 0xd2, 0x4a, 0x6f, 0x8f, +0xfe, 0x2f, 0x8a, 0xf8, 0x35, 0x33, 0x58, 0xd9, 0x90, 0xca, 0xf4, 0x1e, 0x64, 0x39, 0xd1, 0x98, 0xf5, 0xff, 0x5a, 0x99, 0xdb, 0xbe, 0xa5, 0xf2, 0x5c, 0x61, 0x75, 0xed, 0x7b, 0x8b, 0xcb, 0x4a, +0x7, 0x94, 0x51, 0xdc, 0xb7, 0x1, 0xe3, 0x62, 0x9b, 0x34, 0xcd, 0xe5, 0x72, 0x6e, 0x97, 0xcd, 0x56, 0x71, 0x6c, 0x1c, 0xaf, 0x3c, 0x95, 0x26, 0xe0, 0x59, 0x96, 0xbc, 0x61, 0x6e, 0xc5, 0xcb, +0x93, 0x5b, 0xe5, 0x1f, 0x7e, 0x71, 0x19, 0x27, 0xa4, 0xac, 0x5e, 0x4f, 0x36, 0xa, 0x5f, 0xb, 0x75, 0xc6, 0x44, 0x0, 0x8f, 0xc5, 0xeb, 0x9d, 0xd5, 0xaf, 0x53, 0x4c, 0x2f, 0xe1, 0xe4, 0x45, +0xb3, 0xc4, 0xb0, 0x9a, 0x30, 0x3, 0xd, 0x28, 0x62, 0x7e, 0x29, 0x85, 0xb7, 0x8f, 0x50, 0xbb, 0x2, 0x98, 0xcc, 0x33, 0x78, 0xbb, 0xf9, 0x5f, 0xee, 0x3, 0xee, 0x5e, 0xc4, 0x9b, 0xf0, 0x7e, +0x15, 0xd4, 0x69, 0x81, 0x8f, 0xdb, 0xc6, 0xb3, 0xac, 0xbb, 0x38, 0x8b, 0xbb, 0xb4, 0xfc, 0xce, 0x5, 0xcc, 0xe, 0x65, 0x6d, 0x7a, 0x3c, 0xc6, 0x3c, 0xf5, 0x30, 0xd4, 0x99, 0x79, 0x8, 0xd8, +0xa9, 0xa4, 0x65, 0x67, 0xae, 0xe, 0xda, 0x54, 0x11, 0xbf, 0x67, 0xae, 0x6, 0xf4, 0x30, 0x35, 0xb7, 0x9c, 0x1b, 0xad, 0xf6, 0x49, 0xcd, 0x4d, 0x6f, 0xe2, 0x5d, 0xcd, 0x69, 0xcc, 0xd0, 0xc6, +0x7b, 0x4, 0x33, 0xe, 0xf1, 0xc2, 0xbe, 0x72, 0x27, 0x30, 0xd6, 0xb, 0xa, 0x28, 0x4a, 0x48, 0xc2, 0xfa, 0xab, 0xe7, 0x10, 0xd9, 0xa7, 0xf6, 0x20, 0x9f, 0x7b, 0x5c, 0xa7, 0x28, 0x88, 0x9c, +0x33, 0x6d, 0x91, 0x20, 0x4e, 0xb5, 0xd6, 0xc8, 0xbc, 0xd0, 0x3a, 0xfc, 0x82, 0xa2, 0x70, 0x4e, 0x7e, 0x60, 0xb4, 0xc1, 0x3c, 0xae, 0xeb, 0x5d, 0xaf, 0x98, 0x2d, 0xe2, 0xbe, 0x87, 0xe9, 0x52, +0x58, 0x73, 0x8f, 0x8b, 0x31, 0x67, 0x81, 0x3, 0x83, 0xfa, 0xbf, 0x7d, 0x53, 0x71, 0x16, 0xaf, 0x13, 0xc7, 0x56, 0xea, 0xb6, 0xcd, 0xed, 0x84, 0x97, 0xdf, 0xfb, 0xaf, 0x4a, 0x36, 0x8, 0x99, +0x17, 0x79, 0x7b, 0x2b, 0xc3, 0x71, 0x96, 0xda, 0xea, 0xed, 0x3c, 0x93, 0x5f, 0x46, 0x43, 0x9d, 0xed, 0xf3, 0x81, 0x37, 0x2d, 0xfa, 0x23, 0x37, 0xa3, 0xc3, 0x71, 0xff, 0x6, 0x72, 0x62, 0x22, +0xde, 0x72, 0xd4, 0x3a, 0xa7, 0x9e, 0x39, 0x9b, 0x5e, 0x8f, 0x6c, 0x6a, 0x30, 0xff, 0xbd, 0xea, 0x2f, 0xbc, 0x6f, 0x2d, 0xc, 0xe4, 0xd2, 0x7a, 0x22, 0x51, 0x1e, 0xbf, 0x7a, 0x7f, 0x6e, 0xfe, +0xc, 0xe6, 0x6f, 0xcd, 0x46, 0x61, 0x36, 0xea, 0x21, 0xf2, 0x4c, 0x20, 0xdc, 0x3f, 0x95, 0xdb, 0xaa, 0xb6, 0x2a, 0x91, 0x3b, 0x40, 0x9d, 0x9d, 0x41, 0xc0, 0xba, 0x77, 0xb9, 0xc, 0x14, 0xdd, +0x17, 0x8e, 0xc5, 0x16, 0x1a, 0xb0, 0x93, 0x1f, 0xc0, 0xcd, 0x32, 0x35, 0xb3, 0x5e, 0x58, 0xde, 0x3a, 0xfe, 0xfc, 0xac, 0x47, 0x69, 0x96, 0xa3, 0x6a, 0x4c, 0xce, 0x6e, 0x5a, 0x18, 0x67, 0xb1, +0x25, 0x10, 0x3f, 0x2b, 0x74, 0x4, 0x1a, 0x70, 0x1, 0xf3, 0xb9, 0x11, 0xc8, 0xe5, 0xd2, 0xef, 0x98, 0x79, 0xaf, 0x93, 0x43, 0x90, 0x73, 0xc4, 0x7, 0xcb, 0x10, 0xac, 0x78, 0xdf, 0x79, 0xc1, +0xc8, 0xe0, 0xef, 0xa5, 0x1, 0x45, 0x4c, 0xce, 0x51, 0x9c, 0xc0, 0xc9, 0xa9, 0x36, 0x65, 0x1f, 0x99, 0x46, 0x60, 0x27, 0x6c, 0xd6, 0x41, 0x3a, 0x2e, 0xbb, 0xc6, 0xf2, 0xdc, 0x40, 0xf8, 0x64, +0xa8, 0x6b, 0x49, 0x7, 0xd3, 0xb, 0x38, 0xc7, 0x88, 0x96, 0x14, 0xc9, 0xf7, 0xeb, 0x6a, 0xa0, 0x2f, 0x62, 0xf, 0x2b, 0x61, 0xdd, 0xfc, 0xa2, 0xfe, 0x75, 0x33, 0x84, 0xab, 0xe3, 0x69, 0x16, +0x85, 0xf7, 0x1f, 0xad, 0xa, 0x43, 0x5f, 0x9c, 0x95, 0xbd, 0xef, 0x9c, 0xe5, 0x95, 0xa5, 0xe5, 0x69, 0x7, 0xe7, 0xbc, 0xe7, 0x9a, 0xb5, 0x45, 0x71, 0x3b, 0x62, 0x5e, 0x1d, 0xeb, 0xe0, 0xef, +0xd6, 0xc7, 0x6, 0xf5, 0x90, 0x70, 0x91, 0x6c, 0x2b, 0x59, 0x51, 0x53, 0x88, 0xe3, 0x65, 0xf5, 0x48, 0x53, 0x36, 0xaa, 0xe1, 0x62, 0x14, 0xf5, 0x2b, 0x91, 0xc1, 0xe3, 0x24, 0x24, 0x34, 0xec, +0xa, 0x56, 0x99, 0x91, 0x3, 0xf3, 0x35, 0x79, 0x86, 0x60, 0xec, 0x72, 0xb8, 0xa5, 0x72, 0x2d, 0xf5, 0x7c, 0xe7, 0x7b, 0x3f, 0x38, 0x7, 0xc, 0xcb, 0x4d, 0x8a, 0xda, 0xf, 0x81, 0x4a, 0x53, +0xd4, 0x20, 0x3f, 0xe8, 0xd, 0xe2, 0x78, 0xd7, 0x6c, 0xd2, 0x84, 0x1e, 0xac, 0x53, 0xa1, 0xef, 0x6c, 0x33, 0xa1, 0x4f, 0xf9, 0x6c, 0xfd, 0x10, 0x58, 0xaa, 0xec, 0xd8, 0x8d, 0x8c, 0x87, 0x65, +0x95, 0x89, 0x81, 0xb3, 0x3f, 0x5c, 0x86, 0x50, 0xda, 0x1e, 0x3c, 0xc0, 0xdf, 0x9c, 0x4c, 0x3b, 0x81, 0x3a, 0x71, 0x9f, 0x43, 0x98, 0x3c, 0x93, 0xac, 0x25, 0xa1, 0xd9, 0xc5, 0x61, 0x29, 0xc4, +0x83, 0x9b, 0x76, 0x8d, 0xec, 0x71, 0x20, 0x93, 0x17, 0x4b, 0x35, 0xa1, 0x87, 0xfd, 0x33, 0xd0, 0x50, 0x7a, 0xe9, 0x8c, 0x67, 0x82, 0xb9, 0xf1, 0xe7, 0xd0, 0xe6, 0x78, 0x6b, 0xe3, 0x42, 0xc6, +0x51, 0x32, 0x2e, 0xd3, 0x8e, 0x98, 0xe5, 0x39, 0x8a, 0x4d, 0x49, 0xc5, 0xba, 0x9c, 0x77, 0x38, 0xbe, 0x87, 0xdd, 0x7a, 0xf3, 0x89, 0x5e, 0x85, 0xd2, 0x52, 0xd9, 0xb1, 0xdb, 0xbe, 0xd6, 0x5, +0x9d, 0xba, 0xfa, 0xc1, 0x32, 0xf8, 0xfc, 0x80, 0xc6, 0x73, 0x7e, 0xa9, 0xde, 0x13, 0x97, 0x6c, 0xe2, 0x9a, 0xb9, 0xd5, 0x40, 0x5c, 0x39, 0xa3, 0x94, 0x7c, 0xdd, 0x6c, 0xfa, 0xc4, 0x2e, 0xf7, +0x23, 0x6e, 0x2e, 0x2e, 0x47, 0x13, 0xa3, 0x35, 0xa0, 0x87, 0xd0, 0x31, 0xd0, 0x17, 0x5f, 0x9c, 0x41, 0x1d, 0xb9, 0xbe, 0x30, 0x92, 0xeb, 0xaf, 0x21, 0xdf, 0xeb, 0x86, 0x8c, 0xbf, 0xb, 0xb2, +0x25, 0xdf, 0x21, 0x37, 0x4b, 0x15, 0x3e, 0x84, 0x75, 0xa, 0x20, 0x75, 0x31, 0x26, 0x4c, 0x98, 0xa9, 0xa6, 0xa8, 0xb7, 0x8d, 0xc1, 0x3b, 0x83, 0xcd, 0x9, 0x69, 0x3a, 0x38, 0x1f, 0x1b, 0x20, +0x46, 0x6b, 0x9f, 0x1, 0x6e, 0xc8, 0x62, 0xda, 0xed, 0xed, 0x21, 0xe4, 0x61, 0x5d, 0xe4, 0xe4, 0x3b, 0x2b, 0xb4, 0x90, 0xe7, 0xed, 0x79, 0x2f, 0x2, 0xbf, 0xeb, 0xc, 0x7c, 0x54, 0xe0, 0x93, +0xe, 0xdf, 0x22, 0xea, 0xfc, 0xc8, 0xcb, 0x38, 0xf9, 0x2c, 0x0, 0x5e, 0x2, 0xf7, 0x22, 0x2f, 0x5e, 0x2c, 0xe9, 0x50, 0x3e, 0xb1, 0x2e, 0x11, 0xce, 0x39, 0x1, 0x87, 0xf5, 0xfa, 0x6b, 0x39, +0xa4, 0x7b, 0xdd, 0x6a, 0x18, 0x58, 0xdd, 0x9f, 0x17, 0x38, 0x6d, 0x6, 0x76, 0xe3, 0xe5, 0x10, 0x86, 0x44, 0xc2, 0xcb, 0x8b, 0x63, 0x76, 0x10, 0x6e, 0x77, 0x17, 0xbe, 0xbc, 0x19, 0xb5, 0x17, +0xea, 0x8f, 0xe3, 0x99, 0xc9, 0x5, 0x30, 0x84, 0x7, 0x28, 0x7a, 0xa, 0x1a, 0xf, 0xce, 0xe5, 0xb9, 0x3, 0xfb, 0x62, 0x87, 0x7e, 0x7f, 0xdf, 0xa1, 0xf9, 0xa5, 0x3d, 0x90, 0x46, 0xcb, 0x7f, +0x1, 0xad, 0x36, 0x1b, 0x90, \ No newline at end of file diff --git a/screens/mainscreen/content/calibri_6_L8.meta b/screens/mainscreen/content/calibri_6_L8.meta new file mode 100644 index 0000000..2184305 --- /dev/null +++ b/screens/mainscreen/content/calibri_6_L8.meta @@ -0,0 +1,6 @@ +{ + "converter": "Raw", + "rawLength": 0, + "rawStart": 0, + "sourcePath": "D:/Projects/Embedded/AirsoftTracker/fonts/calibri_12/L8/calibri_12_L8.raw" +} diff --git a/screens/mainscreen/content/calibri_6_L8.raw b/screens/mainscreen/content/calibri_6_L8.raw new file mode 100644 index 0000000..bd7f0ab Binary files /dev/null and b/screens/mainscreen/content/calibri_6_L8.raw differ diff --git a/screens/mainscreen/content/calibri_6_L8.rawh b/screens/mainscreen/content/calibri_6_L8.rawh new file mode 100644 index 0000000..eb3fec9 --- /dev/null +++ b/screens/mainscreen/content/calibri_6_L8.rawh @@ -0,0 +1,398 @@ +/*('file properties: ', 'total size ', 0)*/ +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x3, 0x4, 0x5, 0x6, 0x6, 0x9, 0x8, 0x3, 0x4, 0x4, 0x6, 0x6, 0x3, 0x4, 0x3, 0x5, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x3, 0x3, 0x6, 0x6, 0x6, 0x6, +0xb, 0x7, 0x7, 0x7, 0x7, 0x6, 0x6, 0x8, 0x7, 0x3, 0x4, 0x6, 0x5, 0xa, 0x8, 0x8, 0x6, 0x9, 0x7, 0x6, 0x6, 0x8, 0x7, 0xb, 0x6, 0x6, 0x6, 0x4, 0x5, 0x4, 0x6, 0x7, +0x4, 0x6, 0x6, 0x5, 0x6, 0x6, 0x4, 0x6, 0x6, 0x3, 0x4, 0x6, 0x3, 0xa, 0x6, 0x6, 0x6, 0x6, 0x4, 0x5, 0x4, 0x6, 0x6, 0x9, 0x5, 0x6, 0x5, 0x4, 0x6, 0x4, 0x6, 0x0, +0x3, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x7c, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x55, 0xab, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0xae, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x53, 0xaa, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x43, 0x9a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xc8, 0x14, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xc1, 0xa, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xf, 0xb1, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x93, 0x0, 0xc7, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x75, 0x0, 0xdf, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa0, 0x3c, 0x21, 0xbc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbd, 0x1e, 0x40, +0x9e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbd, 0xff, 0xff, 0xff, 0xff, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xde, 0x0, 0x7a, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x19, 0xc1, 0x0, 0x99, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xbc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0xe9, 0xfd, 0xcd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xe1, 0x1f, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xe2, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, 0xdf, 0x76, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x37, 0xa4, 0xe6, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb4, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x6c, 0xd, 0x22, 0xd8, 0x42, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x29, 0xca, 0xfe, 0xe3, 0x79, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0xd8, 0xe7, 0x39, 0x0, 0x1, 0xb0, 0x29, 0x0, 0x0, 0x0, 0x0, +0x82, 0x64, 0x49, 0xa1, 0x0, 0x6d, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x85, 0x61, 0x44, 0x9c, 0x29, 0xb9, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xe2, 0xe4, 0x38, 0xbf, 0x20, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x86, 0x5e, 0x8b, 0xf2, 0x9e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xa8, 0xc, 0xd3, 0xd, 0xcb, 0x19, 0x0, 0x0, 0x0, 0x0, 0xd, 0xc4, 0x12, +0xe, 0xd2, 0xb, 0xc6, 0x15, 0x0, 0x0, 0x0, 0x0, 0x95, 0x46, 0x0, 0x0, 0x9a, 0xf4, 0x96, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0xc6, 0xf6, 0xd6, 0x30, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x98, 0x8c, 0x8, 0x92, 0x8f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x93, 0x12, 0xc1, 0x49, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0xf0, 0xd3, +0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xba, 0x8b, 0xe6, 0x36, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xbf, 0x0, 0x3d, 0xe4, 0x74, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, +0x40, 0xe9, 0x2c, 0x7, 0x77, 0xff, 0x92, 0x6, 0x0, 0x0, 0x0, 0x0, 0x1, 0x85, 0xeb, 0xf7, 0xbb, 0x49, 0xb8, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xca, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1f, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdb, 0x18, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x13, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0xd3, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xeb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x91, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x23, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x7f, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x30, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x79, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xc2, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x6a, 0x58, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9e, 0xc0, 0xbb, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x2, 0x9b, 0xc1, 0xbb, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x6b, 0x59, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c, 0xff, 0xff, 0xff, +0xff, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xda, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x40, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x8c, 0xff, 0xff, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xe5, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7a, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd4, +0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x83, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xd8, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x6d, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xdc, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xbf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0x68, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd6, 0x15, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x5b, 0xe7, 0xf4, 0x92, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0xea, 0x31, 0x1b, 0xdb, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0x97, 0x0, 0x0, 0x81, 0x8d, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x89, 0x7a, 0x0, 0x0, 0x62, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8b, 0x7b, 0x0, 0x0, 0x61, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x76, 0x96, 0x0, 0x0, +0x82, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0xe8, 0x27, 0x1f, 0xdf, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0xe7, 0xee, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x8, 0x97, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc6, 0x9c, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x28, 0xd8, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x28, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe9, 0xff, 0xff, 0xff, 0x63, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x91, 0xf0, 0xe1, 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x91, 0x11, 0x61, 0xf0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x1a, 0xfe, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x63, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xdd, 0x2f, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xc2, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xc0, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, +0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x92, 0xf1, 0xe8, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x91, 0x11, 0x4f, 0xf1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x6b, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x95, 0xff, 0xef, 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x54, +0xf4, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0x6f, 0xe, 0x3e, 0xf4, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x1e, 0xbe, 0xf7, 0xde, 0x5e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xe9, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa2, 0xa0, +0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xb4, 0x50, 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xc8, 0x23, 0x50, 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x6b, 0x81, 0x0, 0x50, 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb1, 0xff, 0xff, 0xff, 0xff, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0xa8, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf8, 0xff, 0xff, 0xda, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x4, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xfc, 0xfb, 0xe2, 0x75, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x6, 0x3a, 0xf0, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbd, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x40, +0xec, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xe6, 0xfa, 0xd6, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xb3, 0xf2, 0xe3, 0x23, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xc6, 0x78, 0xf, 0x1f, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0xdd, 0xd9, 0xf6, +0xbb, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xc9, 0x20, 0xe, 0xb3, 0x7b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xbc, 0x0, 0x0, 0x72, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x17, 0xf4, 0x34, 0x16, 0xca, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0xec, 0xe9, 0x89, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, +0xff, 0x7d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc7, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0xd9, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0xa2, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xed, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0x99, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xe5, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, 0xbf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x7b, 0xe8, 0xf0, 0x9b, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xe5, 0x1c, 0x19, 0xda, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0xe1, 0xc, 0x6, 0xd2, 0x25, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0xd9, 0xcc, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, 0x92, 0x9a, 0xc4, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0x9e, 0x0, 0x0, +0x90, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0xc1, 0x15, 0x10, 0xb1, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xa9, 0xf1, 0xf0, 0xa6, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0xe6, 0xec, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xd6, 0x1e, 0x2f, 0xf0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7a, 0x87, 0x0, 0x0, +0xa8, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0xc5, 0x12, 0x19, 0xb8, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xae, 0xf4, 0xe1, 0xd9, 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xb7, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x1c, 0xc, 0x65, 0xd4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xe7, 0xf4, 0xb9, 0x23, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xce, 0x3d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xce, 0x3d, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xce, 0x3d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0xbe, 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xda, 0x18, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x63, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, +0xa4, 0x58, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x8e, 0xd9, 0x5e, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, 0xda, 0x6f, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x54, 0xd5, 0x67, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x8e, 0xd4, 0x58, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0xa5, 0x59, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x60, 0xa1, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5c, 0xd4, 0x8a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x68, +0xd3, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x73, 0xdc, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x60, 0xda, 0x8c, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x60, 0xa3, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xd6, 0xf9, 0xd9, +0x4a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x4d, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x43, 0xea, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xea, 0xe3, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xed, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xda, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xed, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x2, 0x69, 0xca, 0xf1, 0xed, 0xc1, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa9, 0xb0, 0x38, 0xb, 0xc, 0x57, 0xe7, 0x32, 0x0, 0x0, 0x0, 0x59, 0xb1, 0x15, 0xc3, 0xef, 0xa1, 0x57, 0x67, +0x91, 0x0, 0x0, 0x0, 0xba, 0x31, 0x92, 0x86, 0x19, 0xd9, 0x33, 0x39, 0xae, 0x0, 0x0, 0x0, 0xe1, 0x0, 0xd8, 0x13, 0x0, 0xd2, 0x8, 0x54, 0x97, 0x0, 0x0, 0x0, 0xe5, 0x0, 0xe6, 0x22, +0x58, 0xed, 0x14, 0xbc, 0x4b, 0x0, 0x0, 0x0, 0xd8, 0x21, 0x91, 0xf7, 0x95, 0xa1, 0xf3, 0x91, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xd0, 0x40, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x2, 0x71, 0xd4, 0xf8, 0xff, 0xff, 0x37, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xfb, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, 0xab, 0x96, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xde, 0x1b, +0xe7, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x99, 0x0, 0xc0, 0x46, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0x45, 0x0, 0x6b, 0x9e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xd, 0xf7, 0xff, 0xff, 0xff, 0xf0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xae, 0x0, 0x0, 0x0, 0xd0, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0x53, 0x0, 0x0, 0x0, 0x73, 0xa0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf1, 0xff, 0xf4, 0xba, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, 0xf, 0xb6, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xfc, 0x0, 0xe, 0xbb, 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0xff, 0xe1, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, 0xb, 0x80, 0xc6, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0x17, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x5, 0x75, 0xcb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf1, 0xff, 0xfb, 0xca, +0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xa2, 0xf4, 0xe3, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb7, 0x9d, 0x16, 0x23, 0xb4, 0x5, 0x0, +0x0, 0x0, 0x0, 0x0, 0x2d, 0xe9, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0xb5, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xe4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xd2, 0x93, 0x15, 0x21, 0xaf, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1e, 0xb4, 0xf0, 0xe1, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf1, 0xff, 0xf7, 0xc9, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0xa, 0x60, +0xf2, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x87, 0x9d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x47, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xfc, 0x4, 0x0, 0x0, 0x4b, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x84, 0x9c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x11, 0x5b, 0xed, 0x25, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xf1, 0xff, 0xf6, 0xc7, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf1, 0xff, 0xff, 0xff, 0x25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0xff, 0xb9, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf1, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf1, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0xff, 0xcd, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf4, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x84, 0xe6, +0xf6, 0xc0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaa, 0xb9, 0x2b, 0xd, 0x54, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0xe9, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x6c, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0xab, 0x0, 0x3d, 0xff, 0xff, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xe6, 0xa, 0x0, 0x0, 0x54, 0xb0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xbb, 0xb1, 0x25, 0x7, 0x70, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x92, 0xeb, 0xfb, 0xd5, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xf4, 0x3, 0x0, 0x0, 0x84, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x88, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x88, 0x78, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x88, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, +0x88, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x88, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf4, 0x3, 0x0, 0x0, 0x84, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xf2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf4, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x2c, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xed, 0xef, 0x55, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0x3, 0x0, 0x83, 0x9a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x4b, 0xd4, 0xd, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xfc, 0x23, 0xdd, 0x25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xcb, 0x58, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x89, 0xaa, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x9, 0xcb, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x26, 0xe9, 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xf4, 0x3, 0x0, 0x64, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xf1, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xee, 0xc9, 0x0, 0x0, 0x0, 0x0, 0x78, 0xfd, 0x35, 0x0, 0x0, 0x0, +0xf8, 0xc5, 0x3b, 0x0, 0x0, 0x3, 0xdb, 0xc7, 0x40, 0x0, 0x0, 0x0, 0xf8, 0x66, 0x9d, 0x0, 0x0, 0x4f, 0xa2, 0xb8, 0x40, 0x0, 0x0, 0x0, 0xf8, 0xf, 0xea, 0xb, 0x0, 0xb4, 0x3e, 0xb8, +0x40, 0x0, 0x0, 0x0, 0xf8, 0x0, 0xa8, 0x61, 0x1d, 0xd7, 0x0, 0xb8, 0x40, 0x0, 0x0, 0x0, 0xf8, 0x0, 0x49, 0xc3, 0x80, 0x77, 0x0, 0xb8, 0x40, 0x0, 0x0, 0x0, 0xf8, 0x0, 0x3, 0xe6, +0xe8, 0x18, 0x0, 0xb8, 0x40, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, 0x88, 0xae, 0x0, 0x0, 0xb3, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xee, 0xa1, 0x0, 0x0, 0x34, 0xb6, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xf0, 0xe0, 0x34, 0x0, 0x38, 0xbc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf1, 0x65, 0xba, 0x0, 0x38, 0xbc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf4, 0x4, 0xda, 0x41, +0x38, 0xbc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf4, 0x0, 0x57, 0xc7, 0x38, 0xbc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf4, 0x0, 0x1, 0xce, 0x81, 0xbc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xf4, 0x0, 0x0, 0x49, 0xef, 0xbc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x0, 0xb7, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0xa1, 0xf1, +0xf5, 0xae, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x97, 0x1b, 0x1c, 0x9c, 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0xe5, 0x3, 0x0, 0x0, 0x6, 0xeb, 0x2d, 0x0, 0x0, 0x0, 0x0, +0x5a, 0xb1, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xaf, 0x0, 0x0, 0x0, 0x0, 0xc3, 0x48, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xde, 0x1, 0x0, 0x0, 0x9, 0xef, 0x21, +0x0, 0x0, 0x0, 0x0, 0x2, 0xd6, 0x87, 0x16, 0x1d, 0xa2, 0xad, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0xb6, 0xee, 0xf0, 0x9c, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xf0, 0xff, 0xf4, 0xa5, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x16, 0xc0, 0x7d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x70, 0xa0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x1b, 0xc8, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0xe8, 0x8c, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf4, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0xa1, 0xf1, 0xf4, 0xaa, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc1, 0x97, 0x1b, 0x1c, 0x9c, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0xe5, 0x3, 0x0, +0x0, 0x6, 0xeb, 0x29, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xb1, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xaf, 0x0, 0x0, 0x0, 0x0, 0xc3, 0x51, 0x0, 0x0, 0x0, 0x0, +0x3c, 0xde, 0x1, 0x0, 0x0, 0x9, 0xf0, 0x27, 0x0, 0x0, 0x0, 0x0, 0x2, 0xd6, 0x87, 0x16, 0x1d, 0xa2, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0xb6, 0xee, 0xed, 0xb4, 0xda, 0x46, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xcb, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf1, 0xff, 0xf6, 0xa3, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x15, 0xc7, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xfc, 0x4, 0x0, 0x80, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x1a, 0xcc, 0x57, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xff, 0xff, 0x94, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xfc, 0x6, 0x45, 0xe7, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x0, 0x99, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf4, 0x3, 0x0, 0x29, +0xe7, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x93, 0xef, 0xd7, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, 0xcd, 0x13, 0x3a, 0x86, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x4d, 0xd2, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xb4, 0xdb, 0x5d, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xd7, +0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xfc, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x58, 0xb, 0x53, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x28, 0xc4, 0xf7, 0xd0, 0x39, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xde, 0xff, 0xff, 0xff, 0xff, 0xb9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x94, 0x6c, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x94, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x94, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x94, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x94, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x94, 0x6c, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x90, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf6, 0x0, 0x0, 0x0, 0x47, 0xae, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xff, 0x0, 0x0, 0x0, 0x4c, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x4c, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x4c, 0xb4, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x4c, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x17, 0x0, 0x0, 0x62, 0x9e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x9d, 0xf, 0x22, +0xd0, 0x58, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xb0, 0xf2, 0xe2, 0x7d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x5d, 0x0, 0x0, 0x0, 0x80, 0x7d, 0x0, +0x0, 0x0, 0x0, 0x0, 0x62, 0xb3, 0x0, 0x0, 0x0, 0xd5, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0xf2, 0xe, 0x0, 0x26, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb5, 0x5a, 0x0, +0x79, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xad, 0x0, 0xca, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xee, 0x27, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xb2, 0xc1, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0xfc, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8b, 0x7b, 0x0, 0x0, +0x4c, 0xe9, 0x2, 0x0, 0x0, 0xc2, 0x3a, 0x0, 0x4c, 0xbf, 0x0, 0x0, 0x8f, 0xfa, 0x35, 0x0, 0xb, 0xef, 0x6, 0x0, 0xb, 0xf2, 0x8, 0x0, 0xcc, 0x9a, 0x79, 0x0, 0x47, 0xb5, 0x0, 0x0, +0x0, 0xc0, 0x43, 0xe, 0xd2, 0x41, 0xbc, 0x0, 0x88, 0x6e, 0x0, 0x0, 0x0, 0x7a, 0x84, 0x4a, 0x96, 0x6, 0xed, 0x8, 0xc8, 0x27, 0x0, 0x0, 0x0, 0x35, 0xc6, 0x88, 0x57, 0x0, 0xb9, 0x50, +0xdd, 0x0, 0x0, 0x0, 0x0, 0x2, 0xe7, 0xd1, 0x19, 0x0, 0x75, 0xcf, 0x9a, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, 0xd5, 0x0, 0x0, 0x2e, 0xfb, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x70, 0xaf, 0x0, 0x0, 0x65, 0xa9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x3f, 0xb, 0xe2, 0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xca, 0x7e, 0x94, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xca, 0xed, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xd6, 0xea, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xa3, 0x75, +0xab, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0xe6, 0x20, 0x8, 0xe2, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x87, 0x8d, 0x0, 0x0, 0x61, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xa7, 0x6b, 0x0, 0x0, 0x8b, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0xdf, 0x4, 0x10, 0xe9, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xba, 0x58, 0x78, +0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xc8, 0xda, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc3, 0x9b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x94, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x94, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x90, 0x67, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0xff, 0xff, 0xff, 0xfe, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0xda, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x4, 0xd0, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x76, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0xe3, 0x16, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xb6, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0xc3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9d, 0xff, 0xff, 0xff, +0xff, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd7, 0xff, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xe0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x8, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xe0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0xff, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xcc, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xd1, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x24, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xce, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x84, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcb, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x72, +0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x70, 0xff, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x58, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x90, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x70, 0xff, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, 0xb2, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xa0, 0xc3, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc2, 0x32, 0x4f, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xc1, 0x0, 0x1, +0xd5, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0xd1, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x52, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xfe, 0xff, 0xe1, +0x49, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x3e, 0xc9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x92, 0xe9, 0xff, 0xdf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x55, 0xc2, 0x17, 0x18, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x63, 0xb9, 0x13, 0x7c, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xc4, 0xf4, 0xa8, 0xd3, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x1c, 0xe2, 0x9e, 0xf5, 0xb9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xfa, 0x5d, 0xe, 0xb1, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x52, 0xb3, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x53, 0xae, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xf9, 0x5e, 0x12, 0xb8, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xc7, 0xb0, 0xf6, +0xb0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xe8, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xe3, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x96, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0xe5, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x80, 0xee, 0xff, 0xa9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x90, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x74, 0xea, 0xcc, 0xb6, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xe9, 0x26, 0x36, 0xde, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x60, 0x9e, 0x0, 0x0, 0x90, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x9d, 0x0, 0x0, 0x90, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0xe7, 0x21, 0x2f, 0xde, 0x6c, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x88, 0xee, 0xc4, 0x93, 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0xe0, 0xea, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0xc8, 0x1b, 0x12, 0xc5, 0x38, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x62, 0xff, 0xff, 0xff, 0xff, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x9d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xea, 0x34, 0x1, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xe3, 0xff, 0xff, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x71, 0xf3, 0xac, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xd2, 0x36, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x20, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd2, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, 0xf5, 0xff, 0xff, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x44, 0xbe, 0xc, 0x6c, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xba, 0x13, 0x70, 0x9e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0xe4, 0xf6, 0xd1, 0x26, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x66, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0xfe, 0xfb, 0xee, 0xab, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x7b, 0x7, 0x27, +0xe0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xd4, 0xf8, 0xe7, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x19, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xe1, 0x94, 0xef, 0xb1, 0x6, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x1c, 0xfe, 0x6c, 0x11, 0xce, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x8d, 0x6d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, +0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xd7, 0x0, 0x0, 0x84, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x24, 0xdb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xd5, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x1c, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xed, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xee, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xec, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0xf6, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x61, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x42, 0xd2, 0x15, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xe7, 0xed, 0x28, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x8f, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x7, 0xcf, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x1a, 0xd7, 0x0, 0x29, 0xe6, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x1c, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x1a, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xc9, 0xa5, 0xf3, 0xab, 0x58, 0xe8, 0xd9, 0x29, 0x0, 0x0, 0x0, 0x1c, 0xfe, 0x67, 0x18, 0xe4, 0xc3, 0x16, 0x8a, +0x9a, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0xaf, 0x4c, 0x0, 0x43, 0xb6, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0xac, 0x4c, 0x0, 0x40, 0xb8, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, +0xac, 0x4c, 0x0, 0x40, 0xb8, 0x0, 0x0, 0x0, 0x19, 0xd6, 0x0, 0x0, 0xa7, 0x47, 0x0, 0x3c, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xc9, 0xa2, 0xf0, 0xb1, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xfe, 0x6c, 0x11, +0xce, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x8d, 0x6d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x1c, 0xdc, 0x0, 0x0, 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xd6, 0x0, 0x0, 0x84, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0xdb, 0xf0, 0xa6, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x26, 0xe9, 0x33, 0x12, 0xb3, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x66, 0x9c, 0x0, 0x0, 0x47, 0xbd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x69, 0x9a, 0x0, 0x0, 0x47, 0xb7, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x31, 0xe7, 0x2c, 0x12, 0xb6, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x73, 0xe5, 0xed, 0x98, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xc2, 0x9e, 0xf4, 0xb9, 0x10, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x1c, 0xfa, 0x5f, 0xe, 0xb1, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x52, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, +0x53, 0xad, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xfa, 0x61, 0x13, 0xbb, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xe4, 0xaf, 0xf5, 0xab, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x1c, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x74, 0xea, 0xd3, +0x9c, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xe9, 0x26, 0x36, 0xde, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x9e, 0x0, 0x0, 0x90, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x65, 0x9d, 0x0, 0x0, 0x90, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0xe7, 0x21, 0x2f, 0xde, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0xf0, 0xcb, 0xb3, 0x6c, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x90, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x19, 0xc6, 0xb7, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x5e, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xd6, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xe, 0xbb, 0xf9, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0xa7, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0xe3, 0x7c, 0x13, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x7e, 0xe1, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xdb, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x7f, 0xff, 0xf3, 0x8f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdb, 0x16, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, 0xff, 0xff, 0x98, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0xe0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd7, 0x3a, 0xd, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x75, 0xf6, 0x88, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xd2, 0x0, 0x0, 0x8c, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0xd8, 0x0, 0x0, 0x90, 0x6c, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x20, 0xd8, 0x0, 0x0, 0x90, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xdc, 0x0, 0x0, 0x90, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf4, 0x2d, 0x32, +0xde, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x76, 0xef, 0xc7, 0x9a, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x51, 0x0, 0x0, 0xd7, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0xa6, 0x0, 0x2e, +0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0xec, 0x6, 0x7f, 0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb7, 0x4a, 0xd0, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x62, 0xbd, 0xcd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0xf5, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x98, 0x64, 0x0, 0x48, 0xd5, 0x0, 0x0, 0xc4, 0x2d, 0x0, 0x0, 0x0, +0x56, 0xac, 0x0, 0x89, 0xc4, 0x1d, 0xf, 0xe4, 0x1, 0x0, 0x0, 0x0, 0xf, 0xe9, 0x2, 0xb3, 0x66, 0x61, 0x50, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc2, 0x40, 0xae, 0x28, 0xa5, 0x93, 0x54, +0x0, 0x0, 0x0, 0x0, 0x0, 0x77, 0xbe, 0x7c, 0x0, 0xd3, 0xd2, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xfc, 0x40, 0x0, 0xa8, 0xbc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, 0x9f, 0x0, 0x56, 0xa9, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x9, 0xdf, 0x40, 0xda, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x54, 0xf6, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0xe8, 0x9a, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0xdf, 0x22, 0xe0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x90, 0x79, 0x0, 0x5a, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x52, 0x0, 0x0, +0xd7, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xaa, 0x0, 0x2d, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xed, 0xa, 0x7e, 0x79, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0xad, 0x56, 0xcf, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x54, 0xca, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x77, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xe3, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x5d, 0xff, 0xff, 0xfe, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xd5, 0x2c, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x86, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xd6, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x72, 0xff, 0xff, 0xff, +0x36, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0xed, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x75, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaa, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, 0xd5, 0x5, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb2, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, 0x6e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x73, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xea, 0x5a, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xac, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x38, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xb0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xb0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0x35, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0xf2, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x6a, 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x54, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, 0xb4, 0x5, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xc1, 0x8e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xcf, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x94, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x8f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x43, 0xf0, 0x37, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xea, 0xe0, 0x44, 0x3e, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x98, 0x3e, 0x48, 0xe2, +0xe8, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, \ No newline at end of file diff --git a/screens/mainscreen/fonts/calibri.bin b/screens/mainscreen/fonts/calibri.bin new file mode 100644 index 0000000..fcd9f5e Binary files /dev/null and b/screens/mainscreen/fonts/calibri.bin differ diff --git a/screens/mainscreen/fonts/calibri.binh b/screens/mainscreen/fonts/calibri.binh new file mode 100644 index 0000000..64c1aa3 --- /dev/null +++ b/screens/mainscreen/fonts/calibri.binh @@ -0,0 +1,2 @@ +120, 218, 237, 204, 33, 10, 0, 48, 12, 4, 193, 131, 216, 254, 255, 189, 165, 42, 85, 113, 113, 51, 176, 118, 147, 89, 101, 215, 251, 159, 47, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 5, 254, 36, 0, 43, \ No newline at end of file diff --git a/screens/mainscreen/fonts/calibri.meta b/screens/mainscreen/fonts/calibri.meta new file mode 100644 index 0000000..1252ec7 --- /dev/null +++ b/screens/mainscreen/fonts/calibri.meta @@ -0,0 +1,8 @@ +{ + "converter": "Font", + "fontCharSet": " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~", + "fontOffset": 32, + "fontSize": 12, + "imageFormat": 3, + "sourcePath": "resources/calibri.ttf" +} diff --git a/screens/mainscreen/fonts/calibri.raw b/screens/mainscreen/fonts/calibri.raw new file mode 100644 index 0000000..0440d18 Binary files /dev/null and b/screens/mainscreen/fonts/calibri.raw differ diff --git a/screens/mainscreen/fonts/calibri.rawh b/screens/mainscreen/fonts/calibri.rawh new file mode 100644 index 0000000..fed7eb4 --- /dev/null +++ b/screens/mainscreen/fonts/calibri.rawh @@ -0,0 +1,434 @@ +/*('file properties: ', 'resolution ', 12, 'x', 12, 'format ', 'L8', 'stride ', 12)*/ +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +3, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, \ No newline at end of file diff --git a/screens/mainscreen/fonts/calibri_2.bin b/screens/mainscreen/fonts/calibri_2.bin new file mode 100644 index 0000000..68a1884 Binary files /dev/null and b/screens/mainscreen/fonts/calibri_2.bin differ diff --git a/screens/mainscreen/fonts/calibri_2.binh b/screens/mainscreen/fonts/calibri_2.binh new file mode 100644 index 0000000..a091127 --- /dev/null +++ b/screens/mainscreen/fonts/calibri_2.binh @@ -0,0 +1,75 @@ +120, 218, 213, 90, 95, 80, 92, 87, 25, 63, 119, 239, 221, 123, 239, 46, 176, 224, 116, 234, 104, 254, 129, 250, 228, 164, 4, 102, 124, 179, 144, 174, +99, 31, 116, 18, 8, 175, 106, 66, 241, 193, 135, 90, 106, 209, 7, 71, 141, 166, 244, 169, 153, 140, 195, 172, 157, 169, 77, 154, 218, 18, 167, 182, +65, 173, 172, 181, 134, 170, 51, 102, 53, 208, 38, 99, 167, 217, 38, 44, 73, 70, 203, 174, 75, 128, 210, 177, 233, 178, 11, 9, 129, 37, 215, 123, +206, 247, 59, 132, 123, 203, 178, 220, 155, 165, 198, 195, 192, 111, 15, 231, 222, 251, 157, 239, 207, 249, 254, 221, 101, 108, 253, 161, 6, 117, 195, 8, +135, 85, 77, 51, 12, 77, 211, 130, 198, 202, 224, 255, 49, 244, 26, 211, 52, 66, 134, 30, 10, 217, 83, 189, 58, 20, 50, 66, 166, 110, 255, 86, +243, 11, 130, 252, 30, 251, 26, 241, 87, 85, 117, 181, 138, 223, 23, 12, 6, 13, 61, 172, 235, 186, 166, 107, 6, 11, 216, 52, 76, 251, 183, 206, +254, 173, 101, 119, 217, 168, 111, 32, 172, 149, 88, 87, 6, 75, 220, 47, 113, 163, 99, 246, 40, 240, 25, 194, 220, 147, 132, 201, 239, 127, 60, 124, +215, 42, 25, 129, 141, 106, 130, 67, 208, 178, 22, 197, 252, 97, 163, 87, 224, 147, 225, 46, 14, 85, 150, 53, 39, 230, 103, 106, 136, 193, 44, 4, +144, 139, 108, 144, 144, 228, 231, 105, 130, 150, 91, 61, 2, 167, 212, 126, 14, 202, 44, 150, 223, 138, 18, 126, 234, 131, 14, 250, 96, 228, 177, 50, +201, 255, 104, 63, 11, 138, 43, 149, 211, 69, 186, 48, 132, 203, 194, 209, 141, 109, 227, 116, 140, 253, 138, 243, 121, 226, 130, 206, 9, 27, 61, 47, +54, 114, 141, 234, 253, 23, 206, 208, 250, 225, 31, 44, 137, 15, 123, 26, 183, 112, 206, 149, 119, 246, 24, 124, 167, 85, 29, 141, 97, 78, 234, 97, +22, 90, 242, 34, 95, 243, 195, 184, 192, 246, 207, 92, 18, 216, 205, 222, 20, 216, 244, 213, 36, 237, 155, 196, 205, 126, 242, 15, 150, 229, 228, 242, +219, 79, 228, 248, 89, 204, 41, 227, 49, 62, 95, 80, 6, 255, 198, 215, 247, 222, 122, 226, 121, 79, 118, 229, 194, 28, 48, 185, 201, 246, 84, 5, +61, 236, 194, 252, 71, 192, 83, 192, 9, 32, 180, 186, 162, 119, 169, 229, 2, 240, 13, 215, 253, 187, 92, 207, 119, 143, 12, 240, 143, 192, 71, 128, +77, 204, 121, 174, 35, 184, 191, 166, 195, 57, 151, 235, 77, 174, 251, 79, 185, 158, 95, 138, 240, 235, 103, 251, 105, 127, 139, 206, 121, 233, 27, 55, +105, 228, 214, 68, 195, 178, 110, 172, 183, 254, 177, 141, 33, 167, 126, 3, 16, 143, 217, 81, 89, 50, 134, 149, 184, 59, 226, 202, 152, 11, 55, 60, +106, 154, 9, 219, 48, 63, 234, 60, 40, 65, 240, 87, 213, 133, 184, 83, 231, 60, 47, 35, 46, 249, 198, 156, 79, 45, 59, 90, 150, 73, 35, 211, +65, 65, 80, 203, 144, 198, 244, 56, 59, 41, 228, 27, 103, 199, 86, 207, 131, 25, 80, 188, 17, 36, 131, 106, 91, 142, 250, 146, 87, 112, 154, 240, +56, 185, 73, 214, 48, 228, 50, 156, 50, 120, 26, 113, 202, 235, 120, 116, 137, 28, 192, 171, 219, 226, 176, 32, 120, 202, 16, 230, 245, 224, 231, 44, +228, 142, 227, 253, 103, 200, 217, 242, 75, 183, 232, 166, 11, 197, 54, 146, 98, 31, 42, 66, 177, 159, 134, 38, 149, 2, 197, 65, 83, 204, 149, 223, +21, 155, 253, 25, 230, 227, 244, 124, 229, 63, 20, 135, 195, 143, 16, 182, 86, 17, 14, 19, 234, 113, 194, 176, 101, 221, 4, 227, 61, 8, 184, 93, +190, 200, 166, 45, 18, 220, 5, 204, 37, 166, 37, 31, 146, 79, 25, 9, 20, 178, 191, 39, 182, 36, 40, 238, 191, 95, 231, 207, 33, 164, 73, 159, +63, 110, 32, 58, 255, 134, 222, 150, 110, 137, 60, 71, 157, 87, 133, 254, 212, 28, 217, 115, 96, 22, 158, 255, 10, 229, 27, 246, 121, 240, 101, 207, +154, 101, 93, 95, 173, 183, 219, 250, 141, 192, 227, 117, 226, 74, 216, 187, 138, 128, 24, 134, 125, 213, 251, 84, 239, 222, 101, 210, 207, 188, 54, 139, +56, 75, 15, 126, 110, 15, 229, 117, 213, 203, 100, 119, 151, 140, 172, 208, 115, 130, 14, 144, 86, 80, 175, 138, 255, 31, 90, 238, 241, 69, 247, 0, +233, 49, 48, 103, 100, 240, 220, 9, 60, 87, 228, 111, 172, 175, 56, 137, 43, 175, 130, 97, 242, 23, 13, 141, 98, 95, 74, 250, 82, 101, 252, 238, +49, 23, 222, 233, 117, 149, 166, 127, 196, 181, 158, 133, 251, 235, 245, 74, 40, 240, 7, 50, 175, 87, 132, 61, 41, 125, 164, 54, 19, 207, 83, 250, +112, 76, 149, 87, 162, 142, 235, 43, 60, 180, 18, 254, 79, 243, 235, 23, 203, 209, 27, 198, 135, 251, 17, 232, 216, 231, 71, 9, 191, 72, 184, 39, +229, 188, 206, 235, 232, 35, 63, 163, 156, 216, 138, 200, 169, 227, 220, 110, 165, 131, 25, 90, 34, 63, 20, 194, 49, 9, 185, 220, 97, 56, 230, 68, +31, 14, 75, 156, 64, 229, 74, 179, 118, 142, 159, 215, 30, 138, 241, 123, 181, 241, 163, 213, 182, 42, 159, 137, 124, 105, 140, 227, 240, 94, 118, 145, +215, 164, 23, 187, 245, 217, 131, 60, 255, 221, 190, 240, 194, 223, 87, 217, 215, 142, 167, 160, 255, 231, 165, 35, 42, 51, 198, 113, 44, 223, 37, 123, +49, 15, 19, 191, 145, 47, 208, 57, 109, 167, 58, 204, 182, 219, 227, 2, 45, 203, 170, 163, 248, 31, 225, 18, 8, 247, 50, 51, 238, 135, 221, 243, +168, 7, 83, 228, 135, 89, 10, 25, 98, 74, 205, 35, 110, 252, 158, 230, 202, 95, 176, 190, 15, 243, 223, 210, 253, 88, 247, 58, 244, 52, 25, 202, +161, 104, 139, 192, 235, 78, 55, 140, 108, 134, 105, 64, 101, 94, 218, 71, 244, 126, 212, 119, 99, 204, 31, 191, 191, 196, 254, 95, 104, 32, 126, 40, +163, 72, 49, 61, 67, 72, 36, 111, 207, 177, 142, 235, 229, 253, 158, 233, 90, 57, 200, 143, 173, 137, 105, 171, 119, 221, 117, 121, 191, 119, 186, 137, +50, 116, 99, 235, 174, 143, 248, 117, 20, 167, 151, 68, 64, 122, 168, 235, 94, 33, 191, 41, 167, 62, 131, 153, 144, 216, 152, 61, 23, 7, 92, 185, +142, 131, 254, 248, 55, 77, 106, 136, 156, 47, 250, 42, 77, 70, 88, 168, 151, 246, 31, 94, 19, 211, 150, 181, 238, 186, 188, 223, 59, 93, 182, 174, +28, 203, 161, 95, 57, 215, 184, 234, 234, 178, 24, 117, 228, 55, 145, 69, 159, 116, 71, 216, 159, 104, 255, 38, 236, 171, 147, 252, 242, 101, 52, 26, +222, 69, 26, 63, 118, 14, 124, 238, 160, 13, 164, 168, 174, 177, 239, 127, 142, 253, 47, 228, 124, 222, 138, 251, 59, 71, 81, 166, 242, 6, 212, 191, +226, 44, 252, 22, 231, 107, 150, 237, 232, 230, 207, 29, 98, 63, 220, 207, 241, 0, 155, 16, 24, 121, 48, 41, 208, 252, 77, 151, 192, 128, 197, 56, +14, 179, 115, 2, 189, 142, 183, 235, 84, 33, 201, 241, 152, 38, 112, 44, 79, 56, 122, 28, 88, 255, 32, 161, 57, 76, 200, 102, 128, 143, 9, 28, +102, 213, 9, 127, 254, 153, 2, 241, 161, 232, 206, 36, 117, 1, 149, 57, 100, 141, 111, 226, 28, 15, 172, 154, 219, 139, 148, 104, 255, 162, 249, 62, +33, 96, 227, 195, 25, 159, 254, 153, 2, 122, 74, 147, 241, 232, 117, 224, 144, 195, 126, 210, 232, 67, 86, 234, 28, 233, 233, 25, 201, 111, 194, 35, +191, 9, 138, 71, 239, 163, 130, 102, 59, 99, 158, 248, 133, 223, 87, 231, 157, 252, 106, 5, 248, 103, 156, 155, 45, 113, 196, 173, 2, 174, 27, 0, +191, 237, 254, 234, 133, 69, 202, 179, 230, 140, 174, 85, 213, 128, 109, 223, 168, 123, 182, 44, 162, 222, 187, 15, 5, 81, 80, 152, 129, 241, 93, 202, +203, 148, 193, 25, 95, 245, 96, 141, 236, 115, 7, 64, 208, 47, 122, 29, 163, 232, 220, 164, 192, 72, 57, 28, 98, 166, 96, 252, 59, 209, 221, 81, +74, 11, 83, 126, 200, 218, 65, 37, 20, 67, 158, 38, 158, 51, 199, 118, 139, 133, 1, 84, 32, 237, 232, 204, 70, 190, 76, 245, 119, 232, 24, 217, +131, 118, 13, 141, 209, 15, 252, 101, 177, 113, 118, 136, 169, 25, 174, 215, 243, 205, 246, 196, 166, 187, 212, 195, 123, 86, 39, 181, 55, 226, 60, 111, +237, 54, 191, 151, 227, 45, 174, 250, 109, 205, 163, 135, 185, 98, 30, 99, 71, 121, 206, 110, 254, 147, 29, 16, 141, 240, 27, 172, 182, 223, 199, 49, +202, 176, 103, 41, 14, 4, 232, 156, 238, 219, 74, 252, 132, 145, 223, 106, 104, 103, 84, 15, 146, 253, 28, 64, 67, 103, 50, 80, 64, 149, 126, 220, +151, 156, 99, 84, 200, 7, 242, 26, 201, 113, 0, 253, 146, 7, 112, 60, 194, 211, 206, 4, 68, 117, 161, 79, 187, 50, 44, 153, 151, 33, 14, 178, +166, 6, 71, 191, 74, 79, 58, 219, 88, 191, 198, 54, 208, 7, 49, 45, 171, 224, 137, 224, 96, 191, 179, 63, 94, 41, 28, 92, 95, 217, 213, 216, +190, 129, 203, 86, 222, 31, 200, 251, 187, 129, 178, 159, 31, 70, 125, 166, 201, 23, 31, 19, 174, 194, 123, 183, 43, 129, 41, 209, 150, 180, 240, 161, +190, 178, 184, 242, 220, 178, 125, 81, 148, 209, 53, 48, 203, 182, 8, 57, 200, 83, 228, 30, 2, 179, 129, 89, 246, 127, 52, 106, 237, 186, 113, 205, +5, 89, 175, 111, 187, 75, 54, 218, 134, 58, 255, 85, 248, 15, 105, 121, 143, 82, 254, 166, 78, 24, 2, 181, 44, 165, 27, 108, 240, 138, 55, 111, +133, 62, 205, 202, 251, 47, 137, 215, 211, 68, 175, 248, 185, 73, 116, 67, 143, 97, 253, 136, 99, 94, 188, 135, 12, 99, 234, 90, 79, 69, 248, 109, +1, 191, 211, 186, 136, 199, 240, 98, 8, 70, 183, 231, 108, 138, 214, 87, 228, 179, 241, 49, 188, 102, 70, 220, 250, 30, 225, 180, 57, 15, 119, 152, +2, 93, 129, 118, 8, 161, 245, 41, 90, 103, 237, 11, 47, 86, 132, 223, 157, 203, 116, 142, 46, 81, 153, 109, 211, 153, 160, 115, 73, 254, 80, 149, +252, 202, 164, 170, 197, 99, 253, 219, 136, 134, 193, 17, 133, 240, 101, 116, 209, 229, 99, 48, 223, 48, 222, 233, 232, 180, 242, 212, 141, 222, 46, 252, +157, 154, 164, 6, 150, 156, 7, 198, 223, 35, 125, 163, 58, 81, 44, 234, 35, 27, 113, 10, 88, 161, 19, 36, 39, 229, 175, 37, 222, 59, 148, 180, +231, 241, 30, 216, 115, 30, 246, 59, 138, 245, 145, 53, 49, 235, 49, 131, 150, 187, 41, 108, 112, 63, 165, 48, 235, 81, 158, 13, 46, 107, 118, 91, +249, 168, 63, 84, 176, 159, 7, 98, 30, 253, 70, 30, 47, 14, 242, 40, 107, 111, 226, 224, 46, 33, 45, 40, 92, 198, 117, 77, 20, 239, 178, 122, +166, 34, 254, 42, 191, 201, 114, 46, 53, 38, 175, 125, 235, 26, 175, 76, 138, 159, 44, 222, 155, 19, 250, 47, 8, 26, 121, 241, 243, 81, 204, 218, +63, 249, 74, 208, 221, 100, 123, 46, 237, 175, 136, 238, 229, 123, 38, 225, 143, 159, 133, 159, 60, 136, 57, 197, 133, 105, 149, 18, 29, 249, 30, 247, +78, 199, 213, 52, 89, 98, 241, 179, 165, 226, 209, 128, 35, 30, 45, 32, 30, 221, 169, 222, 91, 110, 190, 230, 49, 46, 148, 234, 184, 120, 123, 19, +48, 133, 250, 160, 248, 9, 167, 95, 217, 108, 123, 238, 91, 160, 114, 64, 190, 159, 148, 111, 79, 58, 207, 224, 195, 79, 29, 137, 174, 110, 93, 244, +71, 231, 37, 224, 144, 140, 71, 5, 199, 252, 35, 248, 178, 59, 109, 206, 87, 134, 223, 60, 244, 146, 135, 158, 74, 225, 89, 232, 183, 117, 230, 181, +74, 144, 13, 247, 82, 161, 165, 39, 41, 127, 83, 242, 213, 116, 78, 134, 144, 152, 239, 199, 23, 128, 106, 97, 62, 225, 202, 124, 79, 198, 140, 133, +98, 252, 187, 24, 90, 50, 146, 17, 181, 76, 126, 123, 86, 80, 60, 245, 181, 151, 190, 193, 241, 219, 79, 127, 253, 231, 28, 119, 189, 179, 67, 188, +26, 175, 73, 84, 87, 226, 43, 91, 122, 18, 133, 208, 24, 234, 208, 118, 240, 21, 1, 95, 251, 241, 222, 245, 234, 62, 145, 207, 153, 253, 85, 177, +74, 202, 57, 8, 57, 179, 2, 228, 124, 18, 114, 110, 131, 156, 35, 120, 45, 28, 202, 173, 52, 14, 168, 222, 233, 66, 189, 228, 45, 205, 212, 172, +37, 167, 1, 203, 4, 86, 150, 121, 7, 17, 103, 229, 123, 87, 235, 150, 55, 198, 170, 16, 54, 229, 247, 210, 26, 129, 173, 64, 124, 15, 71, 151, +126, 225, 136, 107, 189, 213, 117, 223, 46, 215, 115, 75, 50, 6, 185, 200, 239, 255, 84, 26, 181, 181, 219, 210, 129, 5, 215, 62, 101, 29, 43, 191, +7, 91, 139, 4, 12, 109, 81, 6, 53, 223, 94, 119, 221, 135, 178, 59, 112, 195, 155, 216, 149, 183, 59, 190, 34, 228, 250, 84, 86, 28, 19, 51, +218, 25, 175, 132, 157, 254, 23, 205, 30, 211, 218, \ No newline at end of file diff --git a/screens/mainscreen/fonts/calibri_2.meta b/screens/mainscreen/fonts/calibri_2.meta new file mode 100644 index 0000000..e3a801e --- /dev/null +++ b/screens/mainscreen/fonts/calibri_2.meta @@ -0,0 +1,8 @@ +{ + "converter": "Font", + "fontCharSet": " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~", + "fontOffset": 32, + "fontSize": 14, + "imageFormat": 2, + "sourcePath": "Q:/fonts/calibri.ttf" +} diff --git a/screens/mainscreen/fonts/calibri_2.raw b/screens/mainscreen/fonts/calibri_2.raw new file mode 100644 index 0000000..3629adf Binary files /dev/null and b/screens/mainscreen/fonts/calibri_2.raw differ diff --git a/screens/mainscreen/fonts/calibri_2.rawh b/screens/mainscreen/fonts/calibri_2.rawh new file mode 100644 index 0000000..cc7e99a --- /dev/null +++ b/screens/mainscreen/fonts/calibri_2.rawh @@ -0,0 +1,362 @@ +/*('file properties: ', 'resolution ', 16, 'x', 15, 'format ', 'L4', 'stride ', 8)*/ +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +3, 5, 6, 7, 7, 10, 10, 3, 4, 4, 7, 7, 4, 4, 4, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 7, 7, 7, 6, +13, 8, 8, 7, 9, 7, 6, 9, 9, 4, 4, 7, 6, 12, 9, 9, 7, 9, 8, 6, 7, 9, 8, 12, 7, 7, 7, 4, 5, 4, 7, 7, +4, 7, 7, 6, 7, 7, 4, 7, 7, 3, 3, 6, 3, 11, 7, 7, 7, 7, 5, 5, 5, 7, 6, 10, 6, 6, 6, 4, 6, 4, 7, 0, +2, 0, 0, 0, 8, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 0, +0, 0, 0, 0, 0, 15, 32, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, 0, 0, 0, 15, 16, 0, +0, 0, 0, 0, 0, 15, 16, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 0, +0, 0, 0, 0, 0, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 152, 0, 0, 0, 0, 0, 0, 241, 151, 0, +0, 0, 0, 0, 0, 240, 135, 0, 0, 0, 0, 0, 0, 208, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 1, 224, 0, 0, 0, 0, 0, 45, 3, 192, +0, 0, 0, 0, 5, 255, 255, 250, 0, 0, 0, 0, 0, 105, 7, 128, 0, 0, 0, 0, 0, 135, 10, 96, 0, 0, 0, 0, 11, 255, 255, 244, +0, 0, 0, 0, 0, 195, 13, 32, 0, 0, 0, 0, 0, 226, 15, 0, 0, 0, 0, 0, 0, 240, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, +0, 0, 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 60, 254, 112, 0, 0, 0, 0, 0, 230, 3, 160, 0, 0, 0, 0, 1, 241, 0, 0, +0, 0, 0, 0, 0, 204, 64, 0, 0, 0, 0, 0, 0, 24, 237, 80, 0, 0, 0, 0, 0, 0, 7, 242, 0, 0, 0, 0, 0, 0, 0, 229, +0, 0, 0, 0, 4, 145, 5, 241, 0, 0, 0, 0, 1, 191, 252, 64, 0, 0, 0, 0, 0, 9, 80, 0, 0, 0, 0, 0, 0, 10, 64, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 191, 144, 0, 165, 0, 0, 0, 5, 161, 210, 6, 160, 0, 0, 0, 7, 112, 164, 45, 16, 0, 0, 0, 6, 160, 210, 195, +0, 0, 0, 0, 0, 191, 136, 120, 251, 0, 0, 0, 0, 0, 75, 45, 26, 96, 0, 0, 0, 1, 209, 75, 7, 112, 0, 0, 0, 11, 80, 45, +10, 80, 0, 0, 0, 105, 0, 9, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 239, 176, 0, 0, 0, 0, 0, 78, 33, 215, +0, 0, 0, 0, 0, 108, 0, 199, 0, 0, 0, 0, 0, 47, 73, 208, 0, 0, 0, 0, 0, 10, 250, 0, 0, 0, 0, 0, 0, 125, 203, 0, +226, 0, 0, 0, 1, 242, 29, 161, 240, 0, 0, 0, 3, 240, 1, 222, 144, 0, 0, 0, 1, 248, 1, 175, 193, 0, 0, 0, 0, 76, 254, 129, +158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, +0, 0, 0, 0, 0, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 11, 64, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, +0, 0, 0, 0, 0, 227, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 1, 241, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, +0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, +0, 0, 0, 0, 0, 11, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 0, 0, +0, 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 15, 32, 0, +0, 0, 0, 0, 0, 14, 64, 0, 0, 0, 0, 0, 0, 13, 80, 0, 0, 0, 0, 0, 0, 14, 64, 0, 0, 0, 0, 0, 0, 15, 32, 0, +0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 224, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, 184, 200, 160, +0, 0, 0, 0, 0, 11, 250, 0, 0, 0, 0, 0, 0, 184, 200, 160, 0, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 7, 255, 255, 247, +0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 2, 224, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 214, 0, 0, 0, 0, 0, 0, 0, 214, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 48, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 152, 0, +0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 5, 192, 0, 0, 0, 0, 0, 0, 11, 96, 0, 0, 0, 0, 0, 0, 31, 16, 0, +0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 2, 224, 0, 0, 0, 0, 0, 0, 8, 144, 0, 0, +0, 0, 0, 0, 13, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 253, 80, 0, 0, 0, 0, 0, 231, 5, 242, 0, 0, 0, 0, 4, 224, 0, 198, +0, 0, 0, 0, 6, 176, 0, 168, 0, 0, 0, 0, 7, 176, 0, 153, 0, 0, 0, 0, 6, 176, 0, 168, 0, 0, 0, 0, 5, 224, 0, 197, +0, 0, 0, 0, 0, 247, 5, 240, 0, 0, 0, 0, 0, 77, 253, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 5, 231, 0, 0, 0, 0, 0, 0, 155, 199, 0, 0, 0, 0, 0, 0, 32, 183, 0, 0, 0, 0, 0, 0, 0, 183, 0, +0, 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 183, 0, +0, 0, 0, 0, 0, 191, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 251, 32, +0, 0, 0, 0, 0, 178, 28, 176, 0, 0, 0, 0, 0, 0, 7, 208, 0, 0, 0, 0, 0, 0, 9, 176, 0, 0, 0, 0, 0, 0, 31, 64, +0, 0, 0, 0, 0, 0, 200, 0, 0, 0, 0, 0, 0, 11, 160, 0, 0, 0, 0, 0, 0, 186, 0, 0, 0, 0, 0, 0, 2, 255, 255, 244, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 252, 32, 0, 0, 0, 0, 0, 178, 28, 176, +0, 0, 0, 0, 0, 0, 7, 192, 0, 0, 0, 0, 0, 0, 45, 96, 0, 0, 0, 0, 0, 95, 252, 16, 0, 0, 0, 0, 0, 0, 25, 224, +0, 0, 0, 0, 0, 0, 1, 243, 0, 0, 0, 0, 4, 145, 8, 224, 0, 0, 0, 0, 1, 174, 252, 48, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 96, 0, 0, 0, 0, 0, 1, 236, 112, 0, 0, 0, 0, 0, 10, 107, 112, +0, 0, 0, 0, 0, 61, 11, 112, 0, 0, 0, 0, 0, 196, 11, 112, 0, 0, 0, 0, 6, 176, 11, 112, 0, 0, 0, 0, 10, 255, 255, 249, +0, 0, 0, 0, 0, 0, 11, 112, 0, 0, 0, 0, 0, 0, 10, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 223, 255, 160, 0, 0, 0, 0, 0, 210, 0, 0, 0, 0, 0, 0, 0, 210, 0, 0, 0, 0, 0, 0, 0, 223, 252, 48, +0, 0, 0, 0, 0, 0, 25, 224, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 1, 242, 0, 0, 0, 0, 4, 129, 26, 192, +0, 0, 0, 0, 1, 191, 234, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 223, 208, +0, 0, 0, 0, 0, 124, 32, 48, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 2, 251, 254, 128, 0, 0, 0, 0, 3, 245, 3, 244, +0, 0, 0, 0, 3, 240, 0, 168, 0, 0, 0, 0, 2, 241, 0, 182, 0, 0, 0, 0, 0, 217, 5, 241, 0, 0, 0, 0, 0, 60, 253, 64, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 246, 0, 0, 0, 0, 0, 0, 1, 243, +0, 0, 0, 0, 0, 0, 7, 192, 0, 0, 0, 0, 0, 0, 14, 80, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 199, 0, +0, 0, 0, 0, 0, 3, 241, 0, 0, 0, 0, 0, 0, 10, 160, 0, 0, 0, 0, 0, 0, 31, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 253, 96, 0, 0, 0, 0, 0, 245, 4, 241, 0, 0, 0, 0, 1, 241, 0, 241, +0, 0, 0, 0, 0, 156, 75, 128, 0, 0, 0, 0, 0, 12, 253, 32, 0, 0, 0, 0, 0, 215, 7, 226, 0, 0, 0, 0, 6, 192, 0, 183, +0, 0, 0, 0, 4, 243, 3, 228, 0, 0, 0, 0, 0, 126, 253, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 93, 252, 48, 0, 0, 0, 0, 2, 244, 7, 224, 0, 0, 0, 0, 6, 192, 0, 227, 0, 0, 0, 0, 4, 243, 3, 229, +0, 0, 0, 0, 0, 142, 252, 229, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 3, 240, 0, 0, 0, 0, 0, 32, 45, 128, +0, 0, 0, 0, 1, 223, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 226, 0, 0, +0, 0, 0, 0, 5, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 179, 0, 0, 0, 0, 0, 1, 173, 80, +0, 0, 0, 0, 1, 142, 112, 0, 0, 0, 0, 0, 8, 226, 0, 0, 0, 0, 0, 0, 1, 142, 96, 0, 0, 0, 0, 0, 0, 1, 173, 64, +0, 0, 0, 0, 0, 0, 2, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 244, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 255, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 196, 0, 0, 0, 0, 0, 0, 0, 59, 197, 0, 0, 0, 0, 0, 0, 0, 41, 212, +0, 0, 0, 0, 0, 0, 58, 212, 0, 0, 0, 0, 0, 75, 213, 0, 0, 0, 0, 0, 4, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 234, 16, 0, 0, 0, 0, 1, 161, 27, 144, 0, 0, 0, 0, 0, 0, 6, 192, +0, 0, 0, 0, 0, 0, 27, 160, 0, 0, 0, 0, 0, 9, 251, 16, 0, 0, 0, 0, 0, 9, 112, 0, 0, 0, 0, 0, 0, 9, 96, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 144, 0, 0, 0, 0, 0, 0, 10, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 223, 253, 112, 0, 0, 0, 1, 217, 48, 4, 201, 0, 0, 0, 12, 112, 0, +0, 31, 16, 0, 0, 76, 4, 222, 152, 12, 64, 0, 0, 151, 14, 65, 214, 12, 64, 0, 0, 196, 76, 0, 211, 15, 16, 0, 0, 211, 108, 6, +241, 123, 0, 0, 0, 181, 29, 248, 159, 194, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 30, 146, 0, 0, 0, 0, 0, 0, 1, 158, 255, +246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 3, 221, 64, 0, 0, 0, 0, 0, 8, 136, 160, 0, 0, 0, 0, 0, 14, 51, 240, +0, 0, 0, 0, 0, 78, 0, 229, 0, 0, 0, 0, 0, 153, 0, 155, 0, 0, 0, 0, 0, 255, 255, 255, 16, 0, 0, 0, 5, 224, 0, 14, +96, 0, 0, 0, 10, 128, 0, 8, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 254, 112, +0, 0, 0, 0, 0, 213, 3, 244, 0, 0, 0, 0, 0, 213, 0, 198, 0, 0, 0, 0, 0, 213, 3, 242, 0, 0, 0, 0, 0, 223, 255, 177, +0, 0, 0, 0, 0, 213, 1, 187, 0, 0, 0, 0, 0, 213, 0, 79, 0, 0, 0, 0, 0, 213, 1, 172, 0, 0, 0, 0, 0, 207, 255, 177, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 223, 213, 0, 0, 0, 0, 0, 126, 64, 60, +0, 0, 0, 0, 0, 246, 0, 0, 0, 0, 0, 0, 3, 241, 0, 0, 0, 0, 0, 0, 5, 240, 0, 0, 0, 0, 0, 0, 4, 240, 0, 0, +0, 0, 0, 0, 1, 245, 0, 0, 0, 0, 0, 0, 0, 142, 64, 59, 0, 0, 0, 0, 0, 8, 239, 214, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 254, 162, 0, 0, 0, 0, 0, 213, 1, 159, 32, 0, 0, 0, 0, 213, 0, 11, +160, 0, 0, 0, 0, 213, 0, 6, 224, 0, 0, 0, 0, 213, 0, 4, 240, 0, 0, 0, 0, 213, 0, 6, 224, 0, 0, 0, 0, 213, 0, 11, +160, 0, 0, 0, 0, 213, 1, 159, 32, 0, 0, 0, 0, 207, 254, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 207, 255, 240, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, +0, 0, 0, 0, 0, 223, 255, 128, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, +0, 0, 0, 0, 0, 207, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 255, 192, +0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 223, 255, 144, +0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 191, 251, 48, 0, 0, 0, 0, 95, 96, 21, +160, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, 4, 240, 0, 0, 0, 0, 0, 0, 5, 224, 9, 255, 192, 0, 0, 0, 4, 240, 0, 6, +192, 0, 0, 0, 1, 246, 0, 6, 192, 0, 0, 0, 0, 127, 97, 8, 192, 0, 0, 0, 0, 5, 207, 252, 80, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, 9, 128, 0, 0, 0, 0, 213, 0, 10, 128, 0, 0, 0, 0, 213, 0, 10, +128, 0, 0, 0, 0, 213, 0, 10, 128, 0, 0, 0, 0, 223, 255, 255, 128, 0, 0, 0, 0, 213, 0, 10, 128, 0, 0, 0, 0, 213, 0, 10, +128, 0, 0, 0, 0, 213, 0, 10, 128, 0, 0, 0, 0, 197, 0, 9, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, +0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, +0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 64, 0, +0, 0, 0, 0, 0, 13, 80, 0, 0, 0, 0, 0, 0, 13, 80, 0, 0, 0, 0, 0, 0, 13, 80, 0, 0, 0, 0, 0, 0, 13, 80, 0, +0, 0, 0, 0, 0, 13, 80, 0, 0, 0, 0, 0, 0, 13, 64, 0, 0, 0, 0, 0, 0, 31, 48, 0, 0, 0, 0, 0, 14, 250, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, 185, 0, 0, 0, 0, 0, 213, 8, 192, +0, 0, 0, 0, 0, 213, 94, 16, 0, 0, 0, 0, 0, 216, 227, 0, 0, 0, 0, 0, 0, 221, 208, 0, 0, 0, 0, 0, 0, 214, 201, 0, +0, 0, 0, 0, 0, 213, 30, 80, 0, 0, 0, 0, 0, 213, 5, 242, 0, 0, 0, 0, 0, 197, 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, +0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, +0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 207, 255, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 207, 64, 0, 3, 251, 0, 0, 0, 220, 176, 0, 10, 204, 0, 0, 0, 214, 241, 0, 30, 108, 0, 0, 0, 213, 183, 0, +121, 92, 0, 0, 0, 213, 93, 0, 227, 92, 0, 0, 0, 213, 14, 68, 208, 92, 0, 0, 0, 213, 8, 171, 96, 92, 0, 0, 0, 213, 2, 255, +0, 92, 0, 0, 0, 196, 0, 201, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 16, 3, +208, 0, 0, 0, 0, 222, 144, 4, 208, 0, 0, 0, 0, 214, 242, 4, 208, 0, 0, 0, 0, 212, 155, 4, 208, 0, 0, 0, 0, 212, 31, 68, +208, 0, 0, 0, 0, 212, 8, 196, 208, 0, 0, 0, 0, 212, 0, 233, 208, 0, 0, 0, 0, 212, 0, 111, 208, 0, 0, 0, 0, 196, 0, 12, +192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 223, 234, 16, 0, 0, 0, 0, 126, 64, 43, +208, 0, 0, 0, 0, 229, 0, 1, 244, 0, 0, 0, 3, 240, 0, 0, 199, 0, 0, 0, 4, 240, 0, 0, 169, 0, 0, 0, 3, 240, 0, 0, +199, 0, 0, 0, 1, 244, 0, 1, 243, 0, 0, 0, 0, 157, 48, 44, 176, 0, 0, 0, 0, 7, 239, 233, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 254, 96, 0, 0, 0, 0, 0, 213, 4, 244, 0, 0, 0, 0, 0, 213, 0, 184, +0, 0, 0, 0, 0, 213, 0, 183, 0, 0, 0, 0, 0, 213, 5, 242, 0, 0, 0, 0, 0, 223, 252, 64, 0, 0, 0, 0, 0, 213, 0, 0, +0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 6, 223, 233, 16, 0, 0, 0, 0, 126, 64, 43, 192, 0, 0, 0, 0, 229, 0, 1, 244, 0, 0, 0, 3, 240, 0, 0, +199, 0, 0, 0, 4, 240, 0, 0, 169, 0, 0, 0, 3, 240, 0, 0, 199, 0, 0, 0, 1, 244, 0, 1, 243, 0, 0, 0, 0, 157, 48, 44, +192, 0, 0, 0, 0, 8, 239, 234, 231, 0, 0, 0, 0, 0, 0, 0, 43, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 254, 128, +0, 0, 0, 0, 0, 213, 3, 245, 0, 0, 0, 0, 0, 213, 0, 184, 0, 0, 0, 0, 0, 213, 4, 243, 0, 0, 0, 0, 0, 223, 255, 80, +0, 0, 0, 0, 0, 213, 26, 176, 0, 0, 0, 0, 0, 213, 1, 243, 0, 0, 0, 0, 0, 213, 0, 169, 0, 0, 0, 0, 0, 197, 0, 78, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 250, 16, 0, 0, 0, 0, 1, 244, 7, 96, +0, 0, 0, 0, 3, 240, 0, 0, 0, 0, 0, 0, 0, 220, 48, 0, 0, 0, 0, 0, 0, 26, 250, 16, 0, 0, 0, 0, 0, 0, 44, 160, +0, 0, 0, 0, 0, 0, 5, 208, 0, 0, 0, 0, 7, 113, 27, 144, 0, 0, 0, 0, 1, 175, 233, 16, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 255, 255, 250, 0, 0, 0, 0, 0, 2, 240, 0, 0, 0, 0, 0, 0, 2, 240, 0, +0, 0, 0, 0, 0, 2, 240, 0, 0, 0, 0, 0, 0, 2, 240, 0, 0, 0, 0, 0, 0, 2, 240, 0, 0, 0, 0, 0, 0, 2, 240, 0, +0, 0, 0, 0, 0, 2, 240, 0, 0, 0, 0, 0, 0, 2, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 212, 0, 5, 192, 0, 0, 0, 0, 213, 0, 5, 208, 0, 0, 0, 0, 213, 0, 5, 208, 0, 0, 0, 0, 213, 0, 5, +208, 0, 0, 0, 0, 213, 0, 5, 208, 0, 0, 0, 0, 213, 0, 5, 208, 0, 0, 0, 0, 183, 0, 8, 160, 0, 0, 0, 0, 110, 64, 62, +64, 0, 0, 0, 0, 7, 223, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 128, 0, 9, +144, 0, 0, 0, 5, 224, 0, 14, 64, 0, 0, 0, 0, 244, 0, 62, 0, 0, 0, 0, 0, 169, 0, 153, 0, 0, 0, 0, 0, 78, 0, 227, +0, 0, 0, 0, 0, 14, 67, 224, 0, 0, 0, 0, 0, 9, 153, 128, 0, 0, 0, 0, 0, 4, 238, 32, 0, 0, 0, 0, 0, 0, 237, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 176, 0, 126, 0, 3, 224, 0, 3, 240, 0, 207, +48, 7, 176, 0, 0, 244, 0, 251, 112, 11, 96, 0, 0, 168, 4, 198, 176, 15, 16, 0, 0, 108, 8, 114, 240, 77, 0, 0, 0, 31, 28, 48, +212, 136, 0, 0, 0, 13, 111, 0, 152, 196, 0, 0, 0, 8, 219, 0, 93, 240, 0, 0, 0, 3, 247, 0, 15, 160, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 224, 0, 154, 0, 0, 0, 0, 0, 216, 2, 242, 0, 0, 0, 0, 0, 79, 27, 128, +0, 0, 0, 0, 0, 10, 222, 0, 0, 0, 0, 0, 0, 4, 249, 0, 0, 0, 0, 0, 0, 12, 175, 16, 0, 0, 0, 0, 0, 93, 11, 160, +0, 0, 0, 0, 0, 229, 2, 243, 0, 0, 0, 0, 7, 192, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 10, 144, 0, 199, 0, 0, 0, 0, 2, 242, 4, 224, 0, 0, 0, 0, 0, 169, 11, 112, 0, 0, 0, 0, 0, 63, 78, 0, +0, 0, 0, 0, 0, 10, 231, 0, 0, 0, 0, 0, 0, 4, 240, 0, 0, 0, 0, 0, 0, 3, 240, 0, 0, 0, 0, 0, 0, 3, 240, 0, +0, 0, 0, 0, 0, 2, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 240, +0, 0, 0, 0, 0, 0, 8, 192, 0, 0, 0, 0, 0, 0, 47, 32, 0, 0, 0, 0, 0, 0, 200, 0, 0, 0, 0, 0, 0, 6, 208, 0, +0, 0, 0, 0, 0, 31, 64, 0, 0, 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 0, 4, 225, 0, 0, 0, 0, 0, 0, 8, 255, 255, 243, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 160, 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, +0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, +0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, +0, 0, 0, 0, 0, 175, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 12, 64, 0, 0, 0, 0, 0, 0, 7, 160, 0, 0, 0, 0, 0, 0, 1, 241, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, +0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 15, 32, 0, 0, 0, 0, 0, 0, 10, 112, 0, 0, 0, 0, 0, 0, 4, 208, 0, +0, 0, 0, 0, 0, 0, 227, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 13, 64, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 255, 0, 0, +0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, +0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, +0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 5, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 244, 0, +0, 0, 0, 0, 0, 13, 155, 0, 0, 0, 0, 0, 0, 77, 14, 48, 0, 0, 0, 0, 0, 182, 8, 160, 0, 0, 0, 0, 2, 241, 2, 241, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 251, 16, 0, 0, 0, 0, 0, 178, 27, 128, +0, 0, 0, 0, 0, 0, 7, 160, 0, 0, 0, 0, 0, 109, 255, 176, 0, 0, 0, 0, 3, 227, 7, 176, 0, 0, 0, 0, 4, 226, 44, 176, +0, 0, 0, 0, 0, 175, 217, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, +0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 246, 223, 128, 0, 0, 0, 0, 0, 252, 35, 229, 0, 0, 0, 0, 0, 243, 0, 153, +0, 0, 0, 0, 0, 242, 0, 138, 0, 0, 0, 0, 0, 243, 0, 153, 0, 0, 0, 0, 0, 252, 19, 244, 0, 0, 0, 0, 0, 230, 238, 112, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 60, 251, 16, 0, 0, 0, 0, 0, 231, 6, 96, 0, 0, 0, 0, 4, 224, 0, 0, 0, 0, 0, 0, 5, 208, 0, 0, +0, 0, 0, 0, 4, 224, 0, 0, 0, 0, 0, 0, 0, 230, 6, 96, 0, 0, 0, 0, 0, 77, 251, 16, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 61, 232, 213, +0, 0, 0, 0, 0, 231, 8, 245, 0, 0, 0, 0, 3, 240, 0, 213, 0, 0, 0, 0, 5, 208, 0, 213, 0, 0, 0, 0, 3, 224, 0, 213, +0, 0, 0, 0, 0, 230, 8, 245, 0, 0, 0, 0, 0, 78, 248, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 253, 48, 0, 0, 0, 0, 0, 215, 6, 224, +0, 0, 0, 0, 3, 224, 0, 227, 0, 0, 0, 0, 5, 255, 255, 243, 0, 0, 0, 0, 3, 224, 0, 0, 0, 0, 0, 0, 0, 231, 0, 0, +0, 0, 0, 0, 0, 60, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 245, 0, 0, 0, 0, 0, 0, 138, 1, 0, +0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 11, 255, 240, 0, 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 167, 0, 0, +0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 167, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 94, 255, 242, 0, 0, 0, 0, 1, 243, 29, 64, 0, 0, 0, 0, 3, 208, 9, 112, 0, 0, 0, 0, 1, 243, 29, 64, +0, 0, 0, 0, 2, 222, 232, 0, 0, 0, 0, 0, 5, 176, 0, 0, 0, 0, 0, 0, 1, 255, 253, 96, 0, 0, 0, 0, 7, 176, 4, 240, +0, 0, 0, 0, 9, 161, 6, 224, 0, 0, 0, 0, 1, 190, 252, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 246, 222, 112, +0, 0, 0, 0, 0, 252, 35, 242, 0, 0, 0, 0, 0, 243, 0, 212, 0, 0, 0, 0, 0, 242, 0, 197, 0, 0, 0, 0, 0, 242, 0, 197, +0, 0, 0, 0, 0, 242, 0, 197, 0, 0, 0, 0, 0, 226, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, +0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, +0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, +0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 212, 0, 0, +0, 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 212, 0, 0, +0, 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 1, 242, 0, 0, 0, 0, 0, 0, 63, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, +0, 0, 0, 0, 0, 242, 10, 160, 0, 0, 0, 0, 0, 242, 156, 0, 0, 0, 0, 0, 0, 249, 208, 0, 0, 0, 0, 0, 0, 251, 192, 0, +0, 0, 0, 0, 0, 243, 216, 0, 0, 0, 0, 0, 0, 242, 47, 64, 0, 0, 0, 0, 0, 226, 6, 224, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, +0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, +0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 238, 101, 238, 80, 0, 0, 0, 252, 22, 252, +21, 240, 0, 0, 0, 243, 0, 243, 0, 242, 0, 0, 0, 242, 0, 242, 0, 242, 0, 0, 0, 242, 0, 242, 0, 242, 0, 0, 0, 242, 0, 242, +0, 242, 0, 0, 0, 226, 0, 226, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 222, 112, 0, 0, 0, 0, 0, 252, 35, 242, 0, 0, 0, 0, 0, 243, 0, 212, +0, 0, 0, 0, 0, 242, 0, 197, 0, 0, 0, 0, 0, 242, 0, 197, 0, 0, 0, 0, 0, 242, 0, 197, 0, 0, 0, 0, 0, 226, 0, 197, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 43, 253, 112, 0, 0, 0, 0, 0, 216, 19, 229, 0, 0, 0, 0, 4, 224, 0, 154, 0, 0, 0, 0, 5, 208, 0, 123, +0, 0, 0, 0, 4, 224, 0, 153, 0, 0, 0, 0, 0, 231, 3, 227, 0, 0, 0, 0, 0, 60, 253, 80, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 223, 144, +0, 0, 0, 0, 0, 252, 34, 229, 0, 0, 0, 0, 0, 243, 0, 153, 0, 0, 0, 0, 0, 242, 0, 138, 0, 0, 0, 0, 0, 243, 0, 169, +0, 0, 0, 0, 0, 252, 19, 244, 0, 0, 0, 0, 0, 248, 238, 112, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, +0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 249, 180, 0, 0, 0, 0, 0, 231, 8, 245, +0, 0, 0, 0, 3, 240, 0, 213, 0, 0, 0, 0, 5, 208, 0, 213, 0, 0, 0, 0, 3, 224, 0, 213, 0, 0, 0, 0, 0, 230, 8, 245, +0, 0, 0, 0, 0, 78, 248, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 196, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 249, 0, 0, 0, 0, 0, 0, 252, 17, 0, 0, 0, 0, 0, 0, 243, 0, 0, +0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 226, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 142, 248, 0, 0, 0, 0, 0, 3, 225, 0, 0, 0, 0, 0, 0, 2, 244, 0, 0, 0, 0, 0, 0, 0, 94, 195, 0, +0, 0, 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 6, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 11, 255, 243, 0, +0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 167, 0, 0, +0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 62, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 196, 0, 0, 0, 0, 0, 242, 0, 213, +0, 0, 0, 0, 0, 242, 0, 213, 0, 0, 0, 0, 0, 242, 0, 213, 0, 0, 0, 0, 0, 242, 0, 213, 0, 0, 0, 0, 0, 200, 8, 245, +0, 0, 0, 0, 0, 61, 233, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 128, 2, 240, 0, 0, 0, 0, 6, 208, 7, 176, 0, 0, 0, 0, 1, 242, 12, 80, +0, 0, 0, 0, 0, 183, 31, 0, 0, 0, 0, 0, 0, 92, 107, 0, 0, 0, 0, 0, 0, 15, 213, 0, 0, 0, 0, 0, 0, 10, 240, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 8, 144, 9, 144, 8, 144, 0, 0, 4, 208, 14, 224, 12, 64, 0, 0, 0, 242, 29, 226, 31, 0, 0, 0, 0, 182, 89, 166, +91, 0, 0, 0, 0, 106, 149, 90, 150, 0, 0, 0, 0, 46, 209, 30, 210, 0, 0, 0, 0, 13, 192, 12, 208, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 208, 10, 112, +0, 0, 0, 0, 0, 214, 78, 0, 0, 0, 0, 0, 0, 78, 213, 0, 0, 0, 0, 0, 0, 14, 240, 0, 0, 0, 0, 0, 0, 92, 215, 0, +0, 0, 0, 0, 0, 228, 79, 16, 0, 0, 0, 0, 8, 160, 11, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 128, 2, 240, 0, 0, 0, 0, 5, 208, 7, 176, +0, 0, 0, 0, 0, 243, 12, 80, 0, 0, 0, 0, 0, 168, 31, 0, 0, 0, 0, 0, 0, 77, 107, 0, 0, 0, 0, 0, 0, 14, 229, 0, +0, 0, 0, 0, 0, 9, 240, 0, 0, 0, 0, 0, 0, 7, 176, 0, 0, 0, 0, 0, 0, 13, 96, 0, 0, 0, 0, 0, 0, 31, 16, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 255, 251, 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 5, 208, 0, +0, 0, 0, 0, 0, 13, 64, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 1, 226, 0, 0, 0, 0, 0, 0, 5, 255, 254, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 224, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, +0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 6, 226, 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, +0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, +0, 0, 0, 0, 0, 11, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 4, 176, 0, 0, 0, 0, 0, 0, 5, 192, 0, 0, 0, 0, 0, 0, 5, 192, 0, 0, 0, 0, 0, 0, 5, 192, 0, +0, 0, 0, 0, 0, 5, 192, 0, 0, 0, 0, 0, 0, 5, 192, 0, 0, 0, 0, 0, 0, 5, 192, 0, 0, 0, 0, 0, 0, 5, 192, 0, +0, 0, 0, 0, 0, 5, 192, 0, 0, 0, 0, 0, 0, 5, 192, 0, 0, 0, 0, 0, 0, 5, 192, 0, 0, 0, 0, 0, 0, 5, 192, 0, +0, 0, 0, 0, 0, 4, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 248, 0, 0, +0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 48, 0, +0, 0, 0, 0, 0, 5, 242, 0, 0, 0, 0, 0, 0, 12, 80, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, +0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 2, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 206, 80, 72, 0, 0, 0, 0, 6, 146, 226, 150, 0, 0, 0, 0, 8, 64, 94, 176, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ No newline at end of file diff --git a/screens/mainscreen/fonts/calibri_2_converted.png b/screens/mainscreen/fonts/calibri_2_converted.png new file mode 100644 index 0000000..d12dbda Binary files /dev/null and b/screens/mainscreen/fonts/calibri_2_converted.png differ diff --git a/screens/mainscreen/fonts/calibri_converted.png b/screens/mainscreen/fonts/calibri_converted.png new file mode 100644 index 0000000..09512ee Binary files /dev/null and b/screens/mainscreen/fonts/calibri_converted.png differ diff --git a/screens/mainscreen/fonts/verdana.bin b/screens/mainscreen/fonts/verdana.bin new file mode 100644 index 0000000..7379185 Binary files /dev/null and b/screens/mainscreen/fonts/verdana.bin differ diff --git a/screens/mainscreen/fonts/verdana.binh b/screens/mainscreen/fonts/verdana.binh new file mode 100644 index 0000000..17429f5 --- /dev/null +++ b/screens/mainscreen/fonts/verdana.binh @@ -0,0 +1,73 @@ +120, 218, 213, 90, 125, 140, 84, 87, 21, 191, 243, 222, 155, 247, 222, 124, 237, 142, 255, 144, 194, 66, 89, 255, 170, 17, 232, 142, 241, 15, 19, 41, +48, 137, 255, 117, 129, 93, 99, 76, 140, 161, 236, 198, 164, 126, 165, 44, 163, 86, 83, 109, 75, 167, 49, 77, 163, 150, 205, 72, 92, 168, 73, 217, +78, 213, 70, 107, 52, 140, 21, 133, 6, 205, 206, 26, 48, 216, 216, 50, 32, 31, 105, 26, 203, 48, 75, 187, 64, 12, 204, 238, 44, 208, 178, 11, +207, 247, 238, 239, 119, 167, 59, 11, 187, 204, 188, 25, 176, 222, 100, 242, 155, 251, 121, 222, 185, 231, 220, 115, 206, 61, 239, 9, 177, 112, 209, 117, +195, 178, 34, 182, 102, 24, 65, 75, 55, 116, 221, 170, 22, 252, 143, 218, 118, 40, 100, 91, 161, 144, 110, 218, 86, 216, 253, 43, 107, 118, 196, 182, +221, 1, 186, 105, 185, 179, 77, 119, 172, 55, 220, 212, 195, 222, 12, 195, 212, 45, 51, 100, 154, 166, 225, 46, 45, 52, 151, 134, 237, 254, 226, 238, +175, 93, 124, 68, 203, 207, 231, 193, 231, 137, 207, 18, 191, 74, 252, 226, 60, 243, 27, 44, 214, 179, 105, 137, 230, 247, 82, 18, 131, 15, 247, 223, +29, 126, 181, 92, 1, 132, 191, 147, 145, 24, 254, 76, 175, 108, 118, 156, 15, 100, 125, 117, 76, 66, 155, 227, 96, 220, 171, 207, 96, 94, 97, 20, +58, 243, 82, 222, 39, 97, 240, 43, 6, 103, 18, 146, 223, 209, 161, 162, 196, 191, 101, 216, 62, 157, 192, 159, 157, 178, 61, 148, 202, 148, 100, 255, +177, 161, 50, 231, 37, 107, 214, 105, 176, 4, 70, 178, 194, 163, 100, 165, 134, 236, 78, 79, 47, 83, 67, 247, 177, 157, 15, 96, 124, 225, 29, 41, +138, 80, 228, 83, 146, 213, 111, 3, 3, 105, 29, 237, 13, 150, 240, 76, 92, 226, 166, 112, 138, 8, 1, 199, 254, 137, 254, 129, 10, 246, 179, 180, +113, 189, 212, 135, 172, 117, 85, 62, 69, 201, 130, 28, 6, 175, 221, 219, 235, 135, 209, 50, 177, 64, 204, 223, 165, 115, 100, 81, 60, 43, 89, 223, +73, 44, 113, 255, 249, 92, 90, 185, 182, 46, 142, 205, 25, 191, 114, 206, 122, 183, 41, 65, 117, 108, 70, 137, 143, 17, 87, 17, 149, 225, 105, 143, +215, 214, 85, 255, 215, 107, 231, 7, 111, 43, 107, 172, 99, 58, 69, 84, 183, 178, 121, 63, 165, 245, 116, 234, 46, 27, 176, 51, 183, 68, 203, 113, +174, 45, 212, 127, 215, 203, 20, 241, 135, 196, 92, 107, 151, 183, 157, 148, 248, 72, 149, 41, 159, 243, 76, 242, 17, 233, 4, 198, 216, 254, 37, 226, +175, 106, 207, 183, 158, 37, 255, 189, 181, 195, 125, 151, 135, 166, 165, 130, 7, 166, 22, 75, 9, 89, 57, 156, 216, 80, 90, 76, 18, 39, 96, 175, +208, 174, 85, 150, 192, 126, 110, 158, 142, 55, 71, 120, 47, 96, 17, 55, 238, 180, 218, 192, 179, 117, 162, 95, 126, 225, 143, 180, 41, 11, 254, 40, +7, 254, 92, 14, 177, 195, 250, 1, 240, 181, 29, 246, 200, 200, 43, 125, 115, 38, 155, 162, 59, 60, 35, 5, 108, 142, 218, 60, 9, 118, 150, 134, +133, 134, 15, 207, 227, 122, 143, 9, 248, 65, 187, 64, 63, 217, 217, 28, 195, 61, 52, 192, 167, 129, 81, 214, 119, 193, 48, 154, 89, 96, 196, 113, +166, 230, 24, 208, 230, 200, 30, 113, 192, 39, 205, 102, 224, 63, 224, 67, 31, 91, 172, 60, 213, 196, 108, 207, 96, 141, 66, 255, 196, 240, 133, 230, +244, 234, 129, 235, 216, 207, 241, 32, 228, 75, 106, 214, 1, 180, 219, 21, 19, 244, 114, 208, 111, 237, 172, 137, 39, 220, 48, 211, 212, 62, 135, 170, +251, 23, 164, 124, 239, 37, 31, 191, 166, 35, 228, 70, 132, 25, 207, 180, 147, 220, 218, 38, 207, 239, 0, 158, 91, 47, 217, 82, 83, 181, 49, 234, +215, 139, 14, 226, 174, 18, 244, 42, 148, 161, 94, 149, 76, 236, 200, 182, 230, 248, 21, 219, 112, 254, 141, 82, 72, 234, 177, 157, 129, 125, 8, 30, +11, 65, 174, 131, 231, 232, 241, 13, 73, 47, 120, 116, 37, 60, 247, 240, 185, 214, 216, 219, 87, 238, 240, 248, 86, 211, 253, 4, 113, 135, 111, 202, +155, 0, 79, 254, 81, 202, 121, 24, 11, 197, 24, 79, 169, 186, 219, 255, 203, 218, 241, 45, 14, 251, 170, 113, 70, 125, 237, 126, 11, 163, 103, 151, +175, 167, 105, 38, 182, 41, 190, 70, 102, 215, 85, 127, 216, 239, 117, 170, 227, 58, 238, 33, 251, 104, 7, 202, 202, 46, 41, 203, 177, 150, 247, 148, +19, 115, 2, 110, 117, 209, 152, 240, 73, 248, 179, 151, 46, 120, 39, 208, 60, 17, 95, 228, 201, 112, 149, 246, 230, 55, 30, 116, 241, 153, 232, 183, +14, 70, 93, 252, 197, 42, 145, 239, 112, 241, 103, 247, 47, 58, 250, 178, 139, 235, 195, 87, 135, 189, 80, 33, 116, 48, 126, 159, 52, 33, 155, 156, +67, 190, 232, 190, 201, 141, 189, 8, 59, 105, 61, 15, 127, 30, 251, 52, 248, 95, 35, 142, 211, 126, 92, 99, 60, 223, 197, 83, 28, 235, 133, 249, +10, 101, 253, 220, 199, 28, 231, 95, 180, 246, 219, 136, 203, 227, 192, 231, 216, 127, 133, 237, 107, 147, 192, 72, 106, 118, 221, 113, 222, 243, 167, 176, +167, 79, 193, 159, 39, 214, 200, 245, 42, 66, 47, 206, 246, 11, 244, 239, 180, 138, 66, 155, 228, 149, 101, 119, 98, 77, 26, 243, 79, 250, 162, 235, +56, 80, 152, 73, 209, 151, 4, 194, 64, 79, 10, 189, 12, 212, 202, 181, 117, 43, 199, 241, 137, 217, 243, 27, 167, 235, 144, 158, 16, 183, 66, 199, +185, 33, 22, 238, 119, 250, 125, 210, 149, 88, 97, 125, 46, 82, 190, 243, 246, 87, 252, 198, 207, 167, 207, 195, 31, 37, 87, 228, 100, 28, 11, 86, +140, 162, 146, 107, 208, 241, 46, 218, 94, 52, 176, 15, 242, 23, 227, 144, 239, 138, 113, 202, 247, 107, 126, 244, 121, 82, 152, 249, 133, 208, 221, 143, +124, 29, 227, 26, 46, 39, 90, 132, 13, 23, 21, 176, 212, 135, 209, 36, 46, 224, 225, 204, 0, 206, 213, 145, 227, 254, 242, 56, 101, 209, 211, 47, +209, 160, 125, 232, 73, 225, 190, 242, 62, 237, 10, 242, 43, 129, 43, 177, 52, 250, 245, 10, 231, 237, 38, 198, 50, 126, 232, 78, 52, 137, 142, 84, +187, 198, 233, 78, 11, 177, 167, 211, 155, 31, 23, 151, 60, 188, 214, 27, 28, 241, 240, 114, 46, 220, 231, 97, 185, 220, 182, 92, 226, 159, 186, 219, +37, 126, 115, 39, 112, 249, 25, 96, 36, 223, 238, 35, 178, 11, 124, 32, 130, 82, 47, 175, 119, 2, 167, 114, 192, 242, 94, 226, 74, 162, 253, 48, +48, 112, 18, 40, 6, 136, 177, 188, 63, 251, 44, 221, 160, 24, 76, 126, 242, 12, 207, 231, 97, 218, 227, 199, 189, 184, 210, 61, 212, 15, 209, 78, +63, 14, 251, 44, 164, 65, 254, 125, 114, 113, 30, 243, 207, 199, 253, 217, 171, 113, 218, 157, 117, 9, 96, 180, 127, 118, 253, 195, 254, 214, 218, 43, +197, 239, 118, 242, 59, 73, 126, 201, 159, 69, 126, 205, 15, 249, 253, 138, 228, 119, 119, 114, 107, 129, 252, 42, 135, 164, 53, 198, 47, 46, 96, 21, +177, 36, 7, 132, 11, 172, 136, 142, 12, 253, 66, 28, 245, 165, 25, 160, 197, 113, 166, 26, 239, 139, 229, 21, 23, 95, 146, 120, 42, 240, 2, 207, +35, 12, 195, 219, 159, 71, 255, 61, 71, 20, 59, 50, 208, 114, 149, 44, 34, 207, 251, 248, 199, 250, 228, 243, 174, 190, 180, 215, 15, 217, 152, 107, +127, 59, 27, 202, 39, 180, 40, 207, 80, 161, 93, 175, 3, 115, 176, 199, 182, 220, 239, 45, 137, 141, 82, 239, 204, 55, 124, 241, 235, 6, 23, 97, +47, 46, 211, 38, 68, 187, 244, 255, 167, 196, 102, 217, 241, 4, 111, 32, 93, 157, 16, 95, 244, 187, 240, 140, 230, 219, 105, 26, 42, 198, 183, 127, +245, 23, 167, 103, 2, 87, 197, 58, 239, 188, 154, 211, 46, 45, 151, 126, 248, 69, 177, 223, 219, 190, 182, 53, 73, 111, 11, 127, 179, 214, 222, 225, +5, 56, 143, 252, 192, 144, 6, 163, 235, 144, 152, 241, 40, 183, 77, 136, 17, 239, 65, 195, 5, 241, 148, 15, 186, 174, 149, 71, 190, 124, 183, 248, +45, 4, 254, 40, 18, 157, 198, 13, 102, 198, 222, 97, 0, 240, 111, 240, 217, 245, 57, 240, 255, 154, 144, 122, 104, 158, 17, 109, 126, 50, 136, 86, +65, 68, 178, 216, 223, 62, 169, 199, 125, 113, 196, 151, 209, 93, 216, 87, 221, 33, 253, 223, 113, 198, 143, 231, 193, 198, 74, 80, 197, 87, 66, 188, +78, 137, 51, 98, 237, 129, 252, 2, 12, 143, 163, 140, 206, 183, 243, 246, 205, 184, 46, 226, 206, 247, 99, 39, 13, 82, 85, 121, 176, 166, 209, 169, +143, 238, 106, 117, 142, 249, 208, 22, 133, 21, 80, 78, 230, 213, 57, 121, 82, 149, 8, 13, 49, 157, 102, 100, 125, 237, 115, 228, 125, 254, 121, 172, +53, 88, 93, 175, 14, 197, 2, 31, 7, 129, 221, 221, 204, 255, 98, 7, 2, 5, 51, 45, 254, 15, 74, 123, 157, 121, 128, 106, 240, 59, 244, 63, +126, 96, 230, 193, 2, 147, 204, 199, 106, 221, 210, 44, 7, 222, 120, 69, 162, 153, 131, 153, 54, 243, 171, 144, 87, 27, 57, 232, 235, 30, 170, 178, +130, 85, 124, 29, 116, 131, 151, 113, 45, 116, 253, 30, 242, 115, 89, 188, 65, 171, 214, 47, 35, 159, 23, 60, 208, 100, 190, 174, 154, 255, 70, 222, +78, 171, 132, 51, 200, 219, 241, 216, 240, 124, 169, 186, 62, 198, 68, 229, 128, 223, 180, 142, 74, 120, 18, 7, 206, 21, 65, 183, 163, 8, 58, 58, +243, 221, 129, 154, 186, 62, 214, 193, 241, 239, 21, 91, 194, 239, 3, 124, 191, 113, 246, 30, 200, 49, 139, 4, 142, 202, 231, 91, 52, 19, 218, 24, +51, 0, 126, 243, 192, 123, 58, 107, 238, 209, 49, 70, 31, 42, 155, 84, 55, 54, 91, 54, 143, 23, 192, 79, 7, 194, 197, 140, 94, 128, 124, 53, +96, 26, 249, 88, 163, 180, 148, 121, 224, 115, 133, 217, 22, 58, 120, 180, 3, 154, 48, 184, 176, 220, 245, 194, 28, 124, 11, 121, 52, 253, 42, 244, +85, 47, 82, 158, 133, 133, 177, 97, 191, 95, 184, 205, 115, 212, 137, 126, 203, 220, 249, 90, 198, 31, 125, 67, 101, 23, 111, 19, 132, 220, 236, 71, +151, 245, 2, 255, 142, 250, 63, 160, 192, 198, 76, 145, 235, 30, 230, 184, 117, 200, 207, 231, 195, 217, 102, 248, 108, 22, 155, 45, 250, 91, 51, 27, +188, 139, 152, 126, 37, 90, 234, 138, 123, 122, 101, 103, 218, 18, 222, 250, 118, 122, 33, 108, 154, 238, 225, 27, 73, 234, 115, 254, 78, 234, 243, 77, +101, 3, 237, 51, 237, 149, 205, 247, 54, 174, 125, 46, 161, 142, 247, 101, 250, 216, 98, 200, 117, 160, 217, 247, 176, 244, 71, 175, 41, 127, 132, 140, +168, 123, 57, 156, 160, 191, 26, 171, 169, 95, 14, 229, 107, 252, 23, 245, 114, 46, 214, 93, 6, 198, 139, 180, 87, 69, 218, 171, 34, 237, 21, 253, +2, 50, 121, 122, 169, 163, 198, 143, 220, 228, 95, 170, 88, 175, 94, 241, 117, 47, 179, 52, 74, 122, 119, 90, 159, 213, 251, 47, 247, 28, 75, 253, +10, 190, 203, 246, 71, 148, 28, 97, 127, 173, 63, 116, 32, 13, 187, 231, 188, 63, 58, 229, 90, 140, 57, 183, 110, 191, 9, 85, 30, 120, 164, 53, +236, 26, 5, 88, 174, 249, 80, 47, 64, 99, 180, 202, 82, 104, 206, 224, 169, 124, 43, 232, 70, 83, 38, 191, 103, 136, 244, 34, 239, 176, 28, 29, +135, 190, 12, 252, 254, 203, 192, 251, 139, 181, 247, 166, 102, 233, 246, 111, 149, 95, 54, 216, 153, 61, 137, 178, 228, 239, 194, 163, 146, 161, 169, 19, +251, 101, 64, 245, 151, 159, 226, 195, 182, 167, 122, 241, 66, 126, 93, 231, 11, 173, 160, 107, 23, 98, 208, 151, 147, 79, 160, 97, 227, 24, 5, 207, +237, 220, 130, 124, 70, 224, 236, 22, 220, 219, 115, 177, 150, 220, 39, 34, 41, 139, 113, 178, 76, 219, 8, 173, 204, 15, 175, 142, 175, 199, 128, 31, +237, 162, 93, 227, 135, 97, 109, 60, 72, 252, 76, 78, 44, 195, 112, 163, 193, 108, 169, 89, 125, 77, 177, 57, 78, 198, 40, 0, 178, 245, 28, 207, +45, 245, 57, 236, 56, 25, 95, 12, 46, 97, 192, 254, 19, 30, 79, 170, 141, 250, 46, 199, 224, 231, 85, 61, 189, 181, 245, 234, 119, 59, 106, 188, +154, 191, 164, 190, 15, 161, 180, 66, 107, 176, 241, 124, 14, 239, 217, 251, 216, 192, 227, 34, 30, 36, 46, 163, 115, 13, 78, 213, 214, 187, 107, 199, +7, 254, 204, 245, 90, 124, 107, 213, 47, 238, 88, 42, 245, 238, 227, 79, 190, 219, 200, 188, 255, 2, 114, 81, 171, 234, \ No newline at end of file diff --git a/screens/mainscreen/fonts/verdana.meta b/screens/mainscreen/fonts/verdana.meta new file mode 100644 index 0000000..8fe6e18 --- /dev/null +++ b/screens/mainscreen/fonts/verdana.meta @@ -0,0 +1,8 @@ +{ + "converter": "Font", + "fontCharSet": " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~", + "fontOffset": 32, + "fontSize": 12, + "imageFormat": 2, + "sourcePath": "Q:/fonts/Helvetica.ttf" +} diff --git a/screens/mainscreen/fonts/verdana.raw b/screens/mainscreen/fonts/verdana.raw new file mode 100644 index 0000000..d9bb8de Binary files /dev/null and b/screens/mainscreen/fonts/verdana.raw differ diff --git a/screens/mainscreen/fonts/verdana.rawh b/screens/mainscreen/fonts/verdana.rawh new file mode 100644 index 0000000..6356f5f --- /dev/null +++ b/screens/mainscreen/fonts/verdana.rawh @@ -0,0 +1,362 @@ +/*('file properties: ', 'resolution ', 16, 'x', 15, 'format ', 'L4', 'stride ', 8)*/ +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +3, 3, 4, 7, 7, 11, 8, 2, 4, 4, 5, 7, 3, 4, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 7, 7, 7, 7, +12, 8, 8, 9, 9, 8, 7, 9, 9, 3, 6, 8, 7, 10, 9, 9, 8, 9, 9, 8, 7, 9, 8, 11, 8, 8, 7, 3, 3, 3, 6, 7, +4, 7, 7, 6, 7, 7, 3, 7, 7, 3, 3, 6, 3, 10, 7, 7, 7, 7, 4, 6, 3, 7, 6, 9, 6, 6, 6, 4, 3, 4, 7, 0, +2, 0, 0, 0, 8, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, +0, 0, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 135, 128, 0, +0, 0, 0, 0, 6, 118, 112, 0, 0, 0, 0, 0, 5, 101, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 176, 208, 0, 0, 0, 0, 0, 6, 115, 144, +0, 0, 0, 0, 0, 10, 55, 80, 0, 0, 0, 0, 2, 255, 255, 249, 0, 0, 0, 0, 0, 59, 13, 0, 0, 0, 0, 0, 14, 255, 255, 208, +0, 0, 0, 0, 0, 178, 133, 0, 0, 0, 0, 0, 0, 208, 193, 0, 0, 0, 0, 0, 3, 161, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 142, 252, 48, 0, 0, 0, 0, 5, 193, 149, 224, +0, 0, 0, 0, 5, 194, 144, 0, 0, 0, 0, 0, 0, 142, 251, 48, 0, 0, 0, 0, 0, 0, 150, 224, 0, 0, 0, 0, 9, 112, 144, 226, +0, 0, 0, 0, 5, 210, 149, 240, 0, 0, 0, 0, 0, 142, 252, 64, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 191, 160, 0, 144, 0, 0, 0, 7, 112, 149, 8, 32, 0, 0, 0, 8, 112, 149, 39, +0, 0, 0, 0, 1, 191, 160, 144, 0, 0, 0, 0, 0, 0, 4, 83, 222, 112, 0, 0, 0, 0, 9, 11, 49, 193, 0, 0, 0, 0, 114, 11, +49, 193, 0, 0, 0, 1, 128, 3, 222, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 252, 16, +0, 0, 0, 0, 0, 92, 10, 112, 0, 0, 0, 0, 0, 92, 10, 96, 0, 0, 0, 0, 0, 13, 204, 0, 0, 0, 0, 0, 0, 110, 243, 0, +0, 0, 0, 0, 3, 226, 78, 76, 0, 0, 0, 0, 7, 160, 7, 247, 0, 0, 0, 0, 4, 226, 7, 249, 0, 0, 0, 0, 0, 142, 250, 30, +80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 208, 0, 0, +0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 64, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 150, 0, 0, +0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 240, 0, 0, 0, 0, 0, 0, 2, 240, 0, 0, 0, 0, 0, 0, 1, 240, 0, 0, +0, 0, 0, 0, 0, 210, 0, 0, 0, 0, 0, 0, 0, 150, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 7, 64, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 5, 96, 0, 0, 0, 0, 0, 0, 0, 193, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, +0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, +0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 193, 0, 0, 0, 0, 0, 0, 5, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 6, 255, 224, 0, +0, 0, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 184, 80, 0, 0, 0, 0, 0, 0, 129, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 7, 255, 255, 250, +0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 112, 0, 0, 0, 0, 0, 0, 11, 32, 0, +0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, 208, 0, 0, +0, 0, 0, 0, 3, 160, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 251, 16, 0, 0, 0, 0, 1, 244, 25, 176, +0, 0, 0, 0, 7, 176, 2, 240, 0, 0, 0, 0, 9, 128, 0, 242, 0, 0, 0, 0, 9, 128, 0, 241, 0, 0, 0, 0, 7, 160, 2, 240, +0, 0, 0, 0, 2, 243, 26, 144, 0, 0, 0, 0, 0, 94, 251, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, 22, 244, 0, 0, 0, 0, 0, 0, 223, 244, 0, +0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 228, 0, +0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 93, 252, 48, 0, 0, 0, 0, 2, 244, 7, 224, 0, 0, 0, 0, 5, 176, 0, 241, 0, 0, 0, 0, 0, 0, 7, 208, +0, 0, 0, 0, 0, 3, 187, 16, 0, 0, 0, 0, 0, 141, 64, 0, 0, 0, 0, 0, 4, 192, 0, 0, 0, 0, 0, 0, 8, 255, 255, 242, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158, 252, 32, +0, 0, 0, 0, 6, 193, 8, 176, 0, 0, 0, 0, 0, 0, 8, 160, 0, 0, 0, 0, 0, 6, 255, 64, 0, 0, 0, 0, 0, 0, 7, 224, +0, 0, 0, 0, 10, 112, 0, 241, 0, 0, 0, 0, 5, 210, 8, 208, 0, 0, 0, 0, 0, 142, 251, 32, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 1, 223, 0, +0, 0, 0, 0, 0, 12, 79, 0, 0, 0, 0, 0, 0, 151, 15, 0, 0, 0, 0, 0, 6, 160, 15, 0, 0, 0, 0, 0, 11, 255, 255, 244, +0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 255, 176, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, 1, 236, 251, 32, +0, 0, 0, 0, 3, 227, 25, 208, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 1, 240, 0, 0, 0, 0, 7, 193, 25, 176, +0, 0, 0, 0, 0, 158, 234, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 60, 253, 64, 0, 0, 0, 0, 0, 231, 5, 224, 0, 0, 0, 0, 5, 208, 0, 0, 0, 0, 0, 0, 7, 187, 253, 64, +0, 0, 0, 0, 8, 243, 6, 240, 0, 0, 0, 0, 7, 176, 0, 242, 0, 0, 0, 0, 2, 228, 6, 224, 0, 0, 0, 0, 0, 77, 252, 32, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 255, 255, 244, +0, 0, 0, 0, 0, 0, 5, 176, 0, 0, 0, 0, 0, 0, 30, 16, 0, 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 2, 224, 0, +0, 0, 0, 0, 0, 10, 128, 0, 0, 0, 0, 0, 0, 15, 32, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 252, 32, 0, 0, 0, 0, 3, 226, 8, 192, +0, 0, 0, 0, 2, 227, 8, 176, 0, 0, 0, 0, 0, 159, 255, 48, 0, 0, 0, 0, 5, 226, 7, 224, 0, 0, 0, 0, 9, 144, 0, 241, +0, 0, 0, 0, 5, 226, 6, 208, 0, 0, 0, 0, 0, 126, 252, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 251, 16, 0, 0, 0, 0, 4, 226, 9, 160, 0, 0, 0, 0, 8, 144, 2, 240, +0, 0, 0, 0, 5, 210, 9, 241, 0, 0, 0, 0, 0, 142, 232, 240, 0, 0, 0, 0, 0, 0, 4, 208, 0, 0, 0, 0, 5, 209, 44, 96, +0, 0, 0, 0, 0, 158, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, +0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, +0, 0, 0, 0, 0, 0, 125, 179, 0, 0, 0, 0, 2, 158, 146, 0, 0, 0, 0, 0, 13, 210, 0, 0, 0, 0, 0, 0, 2, 158, 146, 0, +0, 0, 0, 0, 0, 0, 125, 163, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 7, 255, 255, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 255, 250, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 96, 0, 0, 0, 0, 0, 0, 2, 158, 129, 0, 0, 0, 0, 0, 0, 1, 126, 163, +0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 1, 126, 163, 0, 0, 0, 0, 2, 158, 129, 0, 0, 0, 0, 0, 10, 96, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 253, 48, 0, 0, 0, 0, 0, 183, 6, 224, +0, 0, 0, 0, 0, 240, 0, 241, 0, 0, 0, 0, 0, 0, 5, 208, 0, 0, 0, 0, 0, 0, 62, 48, 0, 0, 0, 0, 0, 0, 213, 0, +0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 239, 234, 32, 0, 0, 0, 6, 213, 16, 22, 210, 0, 0, 0, 45, 2, 206, +105, 74, 0, 0, 0, 133, 12, 113, 196, 12, 0, 0, 0, 162, 45, 0, 192, 27, 0, 0, 0, 148, 46, 22, 209, 165, 0, 0, 0, 76, 10, 247, +158, 112, 0, 0, 0, 9, 196, 16, 39, 128, 0, 0, 0, 0, 92, 255, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 206, 0, 0, 0, 0, 0, 0, 2, 238, 64, 0, 0, 0, 0, 0, 7, 152, 144, 0, 0, 0, 0, 0, 13, 51, 224, +0, 0, 0, 0, 0, 61, 0, 212, 0, 0, 0, 0, 0, 159, 255, 250, 0, 0, 0, 0, 0, 226, 0, 47, 0, 0, 0, 0, 4, 208, 0, 13, +80, 0, 0, 0, 10, 128, 0, 9, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 255, 255, 211, +0, 0, 0, 0, 1, 240, 0, 126, 0, 0, 0, 0, 1, 240, 0, 31, 16, 0, 0, 0, 1, 240, 0, 140, 0, 0, 0, 0, 1, 255, 255, 246, +0, 0, 0, 0, 1, 240, 0, 62, 64, 0, 0, 0, 1, 240, 0, 11, 112, 0, 0, 0, 1, 240, 0, 62, 64, 0, 0, 0, 1, 255, 255, 230, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 223, 215, 0, 0, 0, 0, 0, 141, 48, 61, +112, 0, 0, 0, 1, 243, 0, 3, 224, 0, 0, 0, 5, 208, 0, 0, 0, 0, 0, 0, 7, 192, 0, 0, 0, 0, 0, 0, 6, 208, 0, 0, +0, 0, 0, 0, 2, 242, 0, 2, 240, 0, 0, 0, 0, 157, 48, 61, 128, 0, 0, 0, 0, 7, 223, 214, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 213, 0, 0, 0, 0, 0, 242, 0, 95, 64, 0, 0, 0, 0, 242, 0, 8, +192, 0, 0, 0, 0, 242, 0, 3, 240, 0, 0, 0, 0, 242, 0, 2, 240, 0, 0, 0, 0, 242, 0, 3, 240, 0, 0, 0, 0, 242, 0, 7, +176, 0, 0, 0, 0, 242, 0, 95, 48, 0, 0, 0, 0, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 255, 255, 255, 64, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, +0, 0, 0, 0, 0, 255, 255, 254, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, +0, 0, 0, 0, 0, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, +0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 255, 255, 246, +0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 223, 233, 0, 0, 0, 0, 0, 126, 64, 43, +176, 0, 0, 0, 1, 244, 0, 0, 242, 0, 0, 0, 4, 224, 0, 0, 0, 0, 0, 0, 6, 208, 5, 255, 247, 0, 0, 0, 5, 224, 0, 0, +183, 0, 0, 0, 1, 243, 0, 0, 231, 0, 0, 0, 0, 157, 48, 43, 231, 0, 0, 0, 0, 7, 223, 214, 103, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 242, 0, 6, 192, 0, 0, 0, 1, 242, 0, 6, 192, 0, 0, 0, 1, 242, 0, 6, +192, 0, 0, 0, 1, 242, 0, 6, 192, 0, 0, 0, 1, 255, 255, 255, 192, 0, 0, 0, 1, 242, 0, 6, 192, 0, 0, 0, 1, 242, 0, 6, +192, 0, 0, 0, 1, 242, 0, 6, 192, 0, 0, 0, 1, 242, 0, 6, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, +0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, +0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 32, +0, 0, 0, 0, 0, 0, 15, 32, 0, 0, 0, 0, 0, 0, 15, 32, 0, 0, 0, 0, 0, 0, 15, 32, 0, 0, 0, 0, 0, 0, 15, 32, +0, 0, 0, 0, 0, 0, 15, 32, 0, 0, 0, 0, 12, 64, 15, 16, 0, 0, 0, 0, 10, 144, 110, 0, 0, 0, 0, 0, 2, 207, 212, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 240, 0, 79, 96, 0, 0, 0, 1, 240, 4, 246, +0, 0, 0, 0, 1, 240, 79, 112, 0, 0, 0, 0, 1, 244, 248, 0, 0, 0, 0, 0, 1, 255, 204, 0, 0, 0, 0, 0, 1, 246, 13, 128, +0, 0, 0, 0, 1, 240, 3, 243, 0, 0, 0, 0, 1, 240, 0, 157, 0, 0, 0, 0, 1, 240, 0, 13, 144, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 241, 0, 0, 0, 0, 0, 0, 1, 241, 0, 0, 0, 0, 0, 0, 1, 241, 0, 0, +0, 0, 0, 0, 1, 241, 0, 0, 0, 0, 0, 0, 1, 241, 0, 0, 0, 0, 0, 0, 1, 241, 0, 0, 0, 0, 0, 0, 1, 241, 0, 0, +0, 0, 0, 0, 1, 241, 0, 0, 0, 0, 0, 0, 1, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 1, 251, 0, 0, 175, 32, 0, 0, 1, 255, 16, 0, 239, 32, 0, 0, 1, 250, 80, 5, 191, 32, 0, 0, 1, 245, 176, 10, +95, 32, 0, 0, 1, 240, 240, 14, 31, 32, 0, 0, 1, 240, 181, 75, 15, 32, 0, 0, 1, 240, 106, 150, 15, 32, 0, 0, 1, 240, 31, 225, +15, 32, 0, 0, 1, 240, 11, 192, 15, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 249, 0, 5, +192, 0, 0, 0, 1, 253, 32, 5, 192, 0, 0, 0, 1, 244, 176, 5, 192, 0, 0, 0, 1, 240, 180, 5, 192, 0, 0, 0, 1, 240, 44, 5, +192, 0, 0, 0, 1, 240, 8, 101, 192, 0, 0, 0, 1, 240, 1, 214, 192, 0, 0, 0, 1, 240, 0, 110, 192, 0, 0, 0, 1, 240, 0, 13, +192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 223, 234, 32, 0, 0, 0, 0, 142, 64, 42, +225, 0, 0, 0, 1, 243, 0, 0, 200, 0, 0, 0, 6, 208, 0, 0, 123, 0, 0, 0, 8, 176, 0, 0, 93, 0, 0, 0, 7, 192, 0, 0, +123, 0, 0, 0, 2, 242, 0, 0, 214, 0, 0, 0, 0, 173, 64, 25, 192, 0, 0, 0, 0, 7, 223, 233, 16, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 231, 0, 0, 0, 0, 0, 243, 0, 63, 48, 0, 0, 0, 0, 243, 0, 12, +96, 0, 0, 0, 0, 243, 0, 63, 48, 0, 0, 0, 0, 255, 255, 231, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, +0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 7, 223, 234, 32, 0, 0, 0, 0, 141, 64, 42, 225, 0, 0, 0, 1, 242, 0, 0, 200, 0, 0, 0, 6, 192, 0, 0, +123, 0, 0, 0, 7, 176, 0, 0, 93, 0, 0, 0, 6, 192, 0, 0, 123, 0, 0, 0, 2, 242, 0, 98, 214, 0, 0, 0, 0, 157, 64, 111, +208, 0, 0, 0, 0, 7, 223, 233, 214, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 251, +32, 0, 0, 0, 0, 243, 0, 26, 176, 0, 0, 0, 0, 243, 0, 5, 208, 0, 0, 0, 0, 243, 0, 27, 144, 0, 0, 0, 0, 255, 255, 254, +16, 0, 0, 0, 0, 243, 0, 28, 144, 0, 0, 0, 0, 243, 0, 7, 176, 0, 0, 0, 0, 243, 0, 6, 176, 0, 0, 0, 0, 243, 0, 5, +243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 238, 161, 0, 0, 0, 0, 0, 215, 1, 156, +0, 0, 0, 0, 1, 240, 0, 15, 16, 0, 0, 0, 0, 219, 81, 0, 0, 0, 0, 0, 0, 24, 207, 214, 0, 0, 0, 0, 0, 0, 0, 62, +48, 0, 0, 0, 5, 192, 0, 11, 96, 0, 0, 0, 1, 231, 17, 95, 32, 0, 0, 0, 0, 59, 239, 180, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 255, 255, 255, 32, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 228, 0, +0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 228, 0, +0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 243, 0, 6, 192, 0, 0, 0, 0, 243, 0, 6, 192, 0, 0, 0, 0, 243, 0, 6, 192, 0, 0, 0, 0, 243, 0, 6, +192, 0, 0, 0, 0, 243, 0, 6, 192, 0, 0, 0, 0, 243, 0, 6, 176, 0, 0, 0, 0, 213, 0, 8, 144, 0, 0, 0, 0, 109, 48, 78, +48, 0, 0, 0, 0, 6, 205, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 192, 0, 10, +160, 0, 0, 0, 2, 241, 0, 15, 64, 0, 0, 0, 0, 215, 0, 94, 0, 0, 0, 0, 0, 124, 0, 169, 0, 0, 0, 0, 0, 47, 32, 243, +0, 0, 0, 0, 0, 12, 117, 224, 0, 0, 0, 0, 0, 6, 219, 128, 0, 0, 0, 0, 0, 1, 255, 48, 0, 0, 0, 0, 0, 0, 189, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 144, 1, 247, 0, 63, 0, 0, 6, 208, 6, 251, +0, 124, 0, 0, 2, 241, 10, 159, 0, 184, 0, 0, 0, 228, 14, 61, 64, 228, 0, 0, 0, 168, 62, 8, 146, 240, 0, 0, 0, 108, 122, 4, +214, 192, 0, 0, 0, 47, 197, 0, 252, 128, 0, 0, 0, 14, 241, 0, 191, 64, 0, 0, 0, 10, 208, 0, 127, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 243, 0, 30, 80, 0, 0, 0, 0, 157, 0, 170, 0, 0, 0, 0, 0, 13, 116, 225, +0, 0, 0, 0, 0, 4, 254, 80, 0, 0, 0, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 6, 221, 128, 0, 0, 0, 0, 0, 47, 67, 243, +0, 0, 0, 0, 0, 185, 0, 156, 0, 0, 0, 0, 6, 225, 0, 14, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 7, 208, 0, 11, 160, 0, 0, 0, 0, 215, 0, 95, 16, 0, 0, 0, 0, 95, 16, 215, 0, 0, 0, 0, 0, 12, 151, 224, +0, 0, 0, 0, 0, 3, 255, 80, 0, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 138, 0, +0, 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 255, 255, 255, +0, 0, 0, 0, 0, 0, 0, 202, 0, 0, 0, 0, 0, 0, 8, 208, 0, 0, 0, 0, 0, 0, 79, 48, 0, 0, 0, 0, 0, 1, 230, 0, +0, 0, 0, 0, 0, 12, 160, 0, 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 4, 242, 0, 0, 0, 0, 0, 0, 11, 255, 255, 255, +16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 255, 0, 0, 0, 0, 0, 0, 4, 192, 0, 0, +0, 0, 0, 0, 4, 192, 0, 0, 0, 0, 0, 0, 4, 192, 0, 0, 0, 0, 0, 0, 4, 192, 0, 0, 0, 0, 0, 0, 4, 192, 0, 0, +0, 0, 0, 0, 4, 192, 0, 0, 0, 0, 0, 0, 4, 192, 0, 0, 0, 0, 0, 0, 4, 192, 0, 0, 0, 0, 0, 0, 4, 192, 0, 0, +0, 0, 0, 0, 4, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 13, 16, 0, 0, 0, 0, 0, 0, 7, 112, 0, 0, +0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, +0, 0, 0, 0, 0, 9, 64, 0, 0, 0, 0, 0, 0, 4, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 11, 248, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, +0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, +0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 11, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 208, 0, +0, 0, 0, 0, 0, 13, 196, 0, 0, 0, 0, 0, 0, 75, 75, 0, 0, 0, 0, 0, 0, 164, 13, 16, 0, 0, 0, 0, 1, 208, 6, 128, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 15, 255, 255, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 192, 0, 0, 0, 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 252, 32, 0, 0, 0, 0, 1, 242, 8, 160, +0, 0, 0, 0, 0, 2, 75, 176, 0, 0, 0, 0, 1, 205, 169, 176, 0, 0, 0, 0, 6, 176, 6, 176, 0, 0, 0, 0, 6, 192, 45, 176, +0, 0, 0, 0, 0, 191, 196, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 176, 0, 0, +0, 0, 0, 0, 5, 176, 0, 0, 0, 0, 0, 0, 5, 202, 252, 32, 0, 0, 0, 0, 5, 245, 8, 192, 0, 0, 0, 0, 5, 192, 0, 241, +0, 0, 0, 0, 5, 160, 0, 226, 0, 0, 0, 0, 5, 192, 0, 241, 0, 0, 0, 0, 5, 245, 8, 176, 0, 0, 0, 0, 5, 187, 252, 32, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 93, 251, 16, 0, 0, 0, 0, 2, 243, 10, 144, 0, 0, 0, 0, 8, 144, 0, 0, 0, 0, 0, 0, 9, 112, 0, 0, +0, 0, 0, 0, 8, 144, 0, 0, 0, 0, 0, 0, 3, 227, 10, 128, 0, 0, 0, 0, 0, 110, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 224, 0, 0, 0, 0, 0, 0, 2, 224, 0, 0, 0, 0, 0, 110, 232, 224, +0, 0, 0, 0, 2, 243, 27, 224, 0, 0, 0, 0, 8, 144, 3, 224, 0, 0, 0, 0, 10, 112, 1, 224, 0, 0, 0, 0, 8, 144, 3, 224, +0, 0, 0, 0, 3, 227, 27, 224, 0, 0, 0, 0, 0, 110, 230, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 251, 16, 0, 0, 0, 0, 1, 228, 24, 176, +0, 0, 0, 0, 6, 160, 0, 240, 0, 0, 0, 0, 8, 255, 255, 242, 0, 0, 0, 0, 7, 160, 0, 0, 0, 0, 0, 0, 2, 227, 6, 208, +0, 0, 0, 0, 0, 77, 252, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 32, 0, +0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 13, 255, 32, 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, +0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 94, 231, 208, 0, 0, 0, 0, 2, 227, 27, 208, 0, 0, 0, 0, 7, 144, 3, 208, 0, 0, 0, 0, 9, 112, 2, 208, +0, 0, 0, 0, 9, 128, 4, 208, 0, 0, 0, 0, 4, 226, 28, 208, 0, 0, 0, 0, 0, 126, 232, 208, 0, 0, 0, 0, 0, 0, 4, 192, +0, 0, 0, 0, 5, 209, 27, 112, 0, 0, 0, 0, 0, 142, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 217, 253, 48, +0, 0, 0, 0, 3, 247, 8, 176, 0, 0, 0, 0, 3, 224, 3, 224, 0, 0, 0, 0, 3, 208, 3, 224, 0, 0, 0, 0, 3, 208, 3, 224, +0, 0, 0, 0, 3, 208, 3, 224, 0, 0, 0, 0, 3, 208, 3, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, +0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, +0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 144, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, +0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, +0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 4, 208, 0, 0, 0, 0, 0, 0, 62, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 192, 0, 0, 0, 0, 0, 0, 4, 192, 0, 0, +0, 0, 0, 0, 4, 192, 29, 80, 0, 0, 0, 0, 4, 192, 198, 0, 0, 0, 0, 0, 4, 201, 160, 0, 0, 0, 0, 0, 4, 252, 224, 0, +0, 0, 0, 0, 4, 208, 200, 0, 0, 0, 0, 0, 4, 192, 63, 16, 0, 0, 0, 0, 4, 192, 10, 160, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, +0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, +0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 217, 252, 77, 231, 0, 0, 0, 3, 246, 12, 226, +47, 16, 0, 0, 3, 224, 8, 144, 14, 48, 0, 0, 3, 208, 8, 128, 14, 48, 0, 0, 3, 208, 8, 128, 14, 48, 0, 0, 3, 208, 8, 128, +14, 48, 0, 0, 3, 208, 8, 128, 14, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 200, 254, 64, 0, 0, 0, 0, 3, 247, 8, 192, 0, 0, 0, 0, 3, 224, 3, 224, +0, 0, 0, 0, 3, 208, 3, 224, 0, 0, 0, 0, 3, 208, 3, 224, 0, 0, 0, 0, 3, 208, 3, 224, 0, 0, 0, 0, 3, 208, 3, 224, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 77, 251, 16, 0, 0, 0, 0, 2, 228, 24, 176, 0, 0, 0, 0, 8, 144, 0, 241, 0, 0, 0, 0, 9, 112, 0, 226, +0, 0, 0, 0, 8, 144, 1, 240, 0, 0, 0, 0, 3, 227, 25, 160, 0, 0, 0, 0, 0, 110, 251, 16, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 185, 252, 32, +0, 0, 0, 0, 5, 245, 7, 192, 0, 0, 0, 0, 5, 208, 0, 241, 0, 0, 0, 0, 5, 176, 0, 227, 0, 0, 0, 0, 5, 208, 0, 241, +0, 0, 0, 0, 5, 245, 9, 192, 0, 0, 0, 0, 5, 202, 252, 32, 0, 0, 0, 0, 5, 192, 0, 0, 0, 0, 0, 0, 5, 192, 0, 0, +0, 0, 0, 0, 5, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 231, 224, 0, 0, 0, 0, 2, 227, 27, 224, +0, 0, 0, 0, 7, 144, 3, 224, 0, 0, 0, 0, 9, 112, 2, 224, 0, 0, 0, 0, 8, 144, 4, 224, 0, 0, 0, 0, 3, 226, 27, 224, +0, 0, 0, 0, 0, 110, 232, 224, 0, 0, 0, 0, 0, 0, 2, 224, 0, 0, 0, 0, 0, 0, 2, 224, 0, 0, 0, 0, 0, 0, 2, 224, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 217, 208, 0, 0, 0, 0, 0, 3, 247, 0, 0, 0, 0, 0, 0, 3, 224, 0, 0, +0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, 0, 0, 0, 0, 3, 208, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 158, 232, 0, 0, 0, 0, 0, 4, 192, 29, 64, 0, 0, 0, 0, 5, 229, 0, 0, 0, 0, 0, 0, 0, 108, 251, 16, +0, 0, 0, 0, 0, 0, 27, 112, 0, 0, 0, 0, 7, 177, 27, 96, 0, 0, 0, 0, 0, 175, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 13, 255, 0, 0, +0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, +0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 208, 4, 192, 0, 0, 0, 0, 4, 208, 4, 192, +0, 0, 0, 0, 4, 208, 4, 192, 0, 0, 0, 0, 4, 208, 4, 192, 0, 0, 0, 0, 3, 208, 5, 192, 0, 0, 0, 0, 2, 243, 28, 192, +0, 0, 0, 0, 0, 142, 215, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 112, 6, 176, 0, 0, 0, 0, 7, 176, 11, 80, 0, 0, 0, 0, 1, 240, 31, 0, +0, 0, 0, 0, 0, 197, 90, 0, 0, 0, 0, 0, 0, 121, 165, 0, 0, 0, 0, 0, 0, 46, 224, 0, 0, 0, 0, 0, 0, 12, 160, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 12, 96, 111, 0, 180, 0, 0, 0, 8, 144, 175, 48, 240, 0, 0, 0, 3, 208, 234, 116, 192, 0, 0, 0, 0, 244, 213, 184, +128, 0, 0, 0, 0, 188, 145, 252, 64, 0, 0, 0, 0, 127, 80, 223, 0, 0, 0, 0, 0, 63, 32, 156, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 208, 13, 96, +0, 0, 0, 0, 0, 214, 124, 0, 0, 0, 0, 0, 0, 78, 227, 0, 0, 0, 0, 0, 0, 13, 192, 0, 0, 0, 0, 0, 0, 109, 228, 0, +0, 0, 0, 0, 1, 228, 109, 0, 0, 0, 0, 0, 10, 176, 13, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 112, 7, 176, 0, 0, 0, 0, 6, 176, 11, 96, +0, 0, 0, 0, 2, 240, 15, 16, 0, 0, 0, 0, 0, 212, 76, 0, 0, 0, 0, 0, 0, 137, 151, 0, 0, 0, 0, 0, 0, 77, 226, 0, +0, 0, 0, 0, 0, 14, 208, 0, 0, 0, 0, 0, 0, 10, 112, 0, 0, 0, 0, 0, 0, 29, 16, 0, 0, 0, 0, 0, 4, 247, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 255, 255, 96, 0, 0, 0, 0, 0, 0, 94, 16, 0, 0, 0, 0, 0, 1, 228, 0, +0, 0, 0, 0, 0, 12, 128, 0, 0, 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 3, 242, 0, 0, 0, 0, 0, 0, 10, 255, 255, 144, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 176, 0, 0, 0, 0, 0, 0, 139, 16, 0, +0, 0, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 4, 225, 0, 0, 0, 0, 0, 0, 79, 80, 0, 0, +0, 0, 0, 0, 4, 225, 0, 0, 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, 0, 139, 16, 0, +0, 0, 0, 0, 0, 26, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 208, 0, 0, 0, 0, 0, 0, 2, 208, 0, 0, 0, 0, 0, 0, 2, 208, 0, 0, +0, 0, 0, 0, 2, 208, 0, 0, 0, 0, 0, 0, 2, 208, 0, 0, 0, 0, 0, 0, 2, 208, 0, 0, 0, 0, 0, 0, 2, 208, 0, 0, +0, 0, 0, 0, 2, 208, 0, 0, 0, 0, 0, 0, 2, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 10, 144, 0, 0, 0, 0, 0, 0, 1, 183, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, +0, 0, 0, 0, 0, 29, 48, 0, 0, 0, 0, 0, 0, 5, 244, 0, 0, 0, 0, 0, 0, 29, 48, 0, 0, 0, 0, 0, 0, 75, 0, 0, +0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 1, 182, 0, 0, 0, 0, 0, 0, 10, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 3, 238, 146, 28, 0, 0, 0, 0, 11, 33, 125, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ No newline at end of file diff --git a/screens/mainscreen/fonts/verdana_converted.png b/screens/mainscreen/fonts/verdana_converted.png new file mode 100644 index 0000000..90a7805 Binary files /dev/null and b/screens/mainscreen/fonts/verdana_converted.png differ diff --git a/screens/mainscreen/images/0.bin b/screens/mainscreen/images/0.bin new file mode 100644 index 0000000..ac54e68 Binary files /dev/null and b/screens/mainscreen/images/0.bin differ diff --git a/screens/mainscreen/images/0.binh b/screens/mainscreen/images/0.binh new file mode 100644 index 0000000..133176a --- /dev/null +++ b/screens/mainscreen/images/0.binh @@ -0,0 +1,2 @@ +/*('file properties: ', 'resolution ', 240, 'x', 240, 'format ', 'COMPRESSED_RGBA_ASTC_8x8_KHR', 'stride ', 480, ' total size ', 14400)*/ +120,156,29,90,9,60,147,255,31,127,30,51,230,86,41,148,51,215,16,58,86,146,28,21,57,74,174,205,125,203,77,114,204,173,141,8,33,231,156,201,185,156,75,174,92,49,146,46,63,41,37,201,77,114,19,98,134,109,255,199,255,121,237,181,215,235,121,61,219,158,239,190,207,231,125,125,191,31,221,238,123,207,43,61,175,49,29,223,237,207,255,203,241,133,9,1,59,214,236,225,204,106,183,75,244,1,30,71,63,186,139,148,141,208,60,101,106,217,66,9,29,225,8,119,63,158,160,149,204,253,95,251,56,181,252,129,25,54,106,186,219,1,68,192,100,212,34,77,63,19,14,90,131,236,94,59,43,17,144,160,68,138,128,118,65,91,52,18,133,231,169,170,136,161,3,181,87,238,189,99,18,212,116,94,169,252,177,116,138,252,13,108,40,51,208,102,170,215,189,94,100,98,186,11,24,59,81,93,187,124,239,161,199,211,227,175,77,31,213,93,250,64,239,122,250,77,38,229,206,115,204,180,73,152,229,139,208,199,232,158,151,19,41,0,0,112,89,196,22,141,57,118,36,184,2,94,149,139,138,45,209,143,151,190,128,229,17,122,185,155,32,140,187,41,115,240,121,202,144,153,158,251,77,182,161,77,176,212,166,141,37,26,245,82,9,95,174,112,181,40,30,5,227,9,93,184,195,85,4,178,225,245,85,206,113,53,163,96,190,35,139,250,105,203,71,192,30,124,185,149,195,18,250,99,99,12,153,94,3,6,68,218,40,59,139,158,171,66,130,172,181,22,68,169,55,149,188,39,244,183,225,17,236,232,30,105,210,81,133,151,64,1,32,132,88,81,216,194,162,97,134,243,166,222,17,190,26,5,118,216,247,139,177,5,179,160,14,209,242,142,183,93,224,241,46,129,27,154,211,30,232,158,251,19,79,184,106,196,109,139,3,108,103,25,129,94,161,200,180,205,206,166,72,120,255,92,129,243,168,95,174,231,44,152,56,87,127,238,75,38,140,105,111,224,181,86,29,19,18,84,74,186,76,25,142,236,152,247,232,56,193,122,87,246,171,224,246,239,239,213,46,247,218,181,29,188,11,13,59,34,102,65,214,140,208,118,162,222,146,74,5,214,127,142,254,194,23,112,230,219,238,31,177,143,56,213,145,65,33,147,135,17,48,30,97,13,162,28,177,170,170,124,3,62,62,190,79,7,50,238,164,221,81,9,246,92,53,181,254,206,39,165,77,251,160,176,114,16,185,220,33,88,240,179,56,98,244,216,123,62,184,117,153,252,126,128,25,29,135,11,11,107,103,224,180,18,189,87,20,154,52,58,172,40,235,243,59,87,11,232,147,93,158,67,42,59,10,203,237,43,180,39,77,251,109,205,168,94,36,9,19,28,128,195,250,146,201,231,131,25,56,1,144,191,86,253,125,184,175,6,238,217,212,175,173,173,189,77,176,90,113,136,251,79,97,228,162,58,227,199,190,162,142,86,194,209,135,48,179,117,122,118,84,225,250,251,217,214,215,46,8,238,219,15,219,217,246,41,75,51,7,7,239,138,180,81,96,90,180,11,204,171,84,193,167,34,77,251,61,213,127,154,173,78,54,223,231,67,89,188,220,41,113,163,174,88,110,44,66,208,123,124,185,176,193,247,41,159,148,98,69,44,137,79,54,170,190,14,181,58,207,68,18,42,168,246,212,238,133,230,235,133,202,182,12,253,52,249,13,133,193,232,99,112,130,0,46,212,110,194,186,195,203,69,129,252,118,143,51,12,16,10,150,93,116,252,241,133,39,120,124,146,98,187,135,236,158,72,113,5,43,240,169,188,197,78,39,225,77,149,124,10,14,83,63,95,56,36,83,253,29,88,149,20,31,150,111,130,217,34,166,223,143,102,79,70,213,42,141,68,206,68,76,2,165,73,6,67,175,188,70,137,63,217,59,202,68,220,17,176,184,100,85,194,30,199,83,64,212,95,158,254,60,114,92,119,223,241,75,215,144,30,12,179,97,24,102,142,11,214,50,168,31,220,191,55,195,195,88,95,103,48,24,9,167,244,145,7,111,199,119,2,18,9,205,230,70,94,62,87,213,29,55,92,251,191,100,185,37,26,220,208,81,232,18,251,228,183,26,255,65,239,148,216,70,209,220,243,5,60,158,87,236,166,0,40,255,202,167,148,23,224,139,78,172,74,252,149,190,126,189,114,69,220,229,227,39,222,186,163,97,219,184,73,57,105,91,102,134,111,167,115,50,98,210,247,215,205,143,126,29,187,204,23,238,212,52,175,49,112,123,193,95,157,161,130,179,64,245,86,53,25,147,253,84,154,29,36,22,185,109,30,237,110,130,28,114,29,124,101,34,70,202,198,21,91,173,17,203,2,32,171,200,213,0,163,150,35,140,233,111,39,43,188,175,162,123,150,250,211,222,96,64,21,180,56,10,92,115,127,143,128,201,167,8,178,198,139,9,220,82,137,255,246,234,110,10,26,12,222,155,78,102,75,34,97,100,112,213,70,172,63,55,193,237,12,67,66,219,152,49,74,202,123,193,51,155,226,10,200,231,150,159,143,132,55,135,243,184,95,215,240,228,122,163,23,142,193,30,147,89,228,116,184,33,230,157,216,201,134,74,16,221,144,89,27,183,230,84,169,112,166,190,169,244,68,193,228,45,115,93,223,20,220,181,0,47,3,60,93,0,170,183,36,41,83,252,140,246,227,13,206,226,219,196,115,60,216,120,77,111,70,193,120,105,205,153,51,117,62,3,77,216,25,189,12,173,194,207,145,167,255,108,122,194,79,203,26,61,135,198,219,123,4,9,17,0,2,200,4,119,253,62,34,60,118,54,207,54,8,244,223,18,110,35,181,29,127,138,223,96,19,234,57,221,123,59,59,133,106,3,122,39,211,36,55,193,148,203,63,254,123,87,69,101,199,33,229,239,203,130,155,186,94,103,38,62,215,116,12,250,246,31,189,187,29,57,137,4,161,231,107,110,33,77,152,139,38,254,69,184,3,8,248,253,121,41,183,25,149,123,145,47,154,151,162,138,42,81,95,141,240,67,113,243,196,234,254,28,93,23,206,46,34,22,57,188,25,74,219,133,75,45,89,152,21,118,116,68,161,150,213,128,137,32,217,23,224,88,69,242,214,64,196,7,4,236,66,146,160,57,188,228,201,253,157,102,187,16,56,6,194,75,83,102,134,247,248,234,74,139,125,58,195,10,134,234,253,83,131,113,57,142,189,58,158,180,100,125,105,110,210,19,88,44,174,58,239,36,252,19,44,28,228,136,239,98,70,244,214,151,178,97,174,97,140,42,135,44,148,237,230,247,17,48,229,102,174,109,158,206,248,12,182,29,124,186,88,214,215,214,127,127,47,41,97,244,251,225,43,23,60,78,23,62,148,140,188,208,85,221,185,191,237,147,226,19,30,241,224,193,3,68,79,213,80,232,198,251,157,107,7,173,246,227,181,27,46,232,158,179,159,179,73,53,206,36,53,82,241,170,67,77,20,10,110,61,107,74,33,223,63,8,76,236,72,19,93,185,134,6,195,43,76,71,43,45,98,169,129,174,202,1,225,56,73,217,192,158,236,39,75,41,83,234,18,204,76,0,62,154,15,110,217,157,209,119,124,41,171,215,167,166,154,68,170,69,203,166,213,23,98,43,163,224,14,34,23,95,252,217,174,161,85,68,149,41,207,146,131,19,203,42,171,107,158,222,35,57,158,187,227,109,27,142,93,127,93,179,111,163,214,99,121,110,182,59,108,126,149,225,234,187,181,183,182,162,92,61,110,71,239,250,181,20,112,146,23,145,226,49,155,89,113,151,221,230,30,114,216,63,203,113,52,6,108,196,63,242,124,114,84,0,1,15,114,22,206,174,214,173,168,244,51,131,255,64,232,32,122,74,26,60,211,105,211,134,59,26,41,193,55,24,223,13,152,214,95,95,184,145,145,84,127,217,121,125,198,242,79,173,214,197,48,135,91,147,63,78,28,180,90,111,57,115,28,187,176,217,221,104,121,239,212,204,213,173,218,116,119,11,171,92,19,8,239,181,151,76,198,135,186,155,60,204,177,132,107,102,136,158,63,13,45,123,12,219,129,253,113,202,16,131,54,185,217,221,57,121,246,215,189,223,39,89,105,147,37,230,98,235,104,216,153,216,168,154,228,130,138,93,35,158,215,175,125,187,38,1,165,2,21,140,131,132,100,20,239,233,131,209,102,198,33,63,171,196,253,205,216,126,95,251,47,28,66,184,103,252,177,41,133,252,155,121,215,89,202,42,175,84,201,167,174,3,172,196,43,86,89,123,39,98,174,195,44,16,30,46,40,120,223,118,54,243,27,49,110,123,107,26,246,128,97,30,234,30,251,91,190,124,47,133,68,34,46,55,249,248,136,163,96,134,88,143,91,23,76,89,197,139,20,196,29,109,113,104,240,84,184,120,223,8,15,173,139,88,196,171,93,107,131,4,101,212,133,182,43,155,20,167,46,225,225,146,57,197,116,64,41,44,52,243,37,59,65,242,118,125,21,187,236,45,1,80,89,228,170,179,126,211,155,187,205,31,106,37,165,210,144,160,148,154,221,17,188,30,192,26,45,149,151,87,229,143,232,217,27,221,147,137,118,244,76,203,215,13,253,43,101,129,132,62,111,3,55,5,255,49,25,177,255,69,224,197,249,228,245,141,113,205,30,108,209,53,236,207,50,61,215,34,16,48,13,197,136,237,82,141,157,150,248,152,211,236,121,44,168,222,223,101,233,25,222,196,62,108,185,160,162,227,24,192,183,136,229,252,164,23,48,193,85,114,151,67,88,94,67,1,209,51,177,28,19,39,231,137,122,82,140,71,184,127,137,135,244,190,89,151,128,253,197,46,229,160,159,16,8,36,35,65,30,110,159,226,7,9,133,33,229,65,158,49,207,107,33,61,85,80,9,240,202,122,234,88,25,234,47,69,216,228,236,254,85,32,233,152,113,135,18,212,193,225,117,237,134,207,27,102,9,107,235,71,56,243,147,254,217,18,140,230,244,199,136,197,2,201,236,224,148,143,178,190,153,240,116,197,86,29,84,111,77,19,255,127,39,12,48,79,6,228,11,92,18,35,175,203,158,114,30,12,162,173,144,162,236,154,180,143,91,77,32,193,140,198,66,86,116,116,70,203,145,118,236,72,174,45,74,143,186,217,65,239,116,168,32,73,213,26,250,150,172,34,65,53,14,59,83,243,245,2,97,204,98,14,179,103,5,2,38,170,166,90,94,65,106,75,179,170,74,200,117,239,158,168,136,146,244,148,173,118,158,152,255,176,232,52,239,183,167,117,75,206,123,180,253,128,97,209,121,80,200,176,175,53,215,218,126,247,230,223,106,33,123,68,8,117,141,92,72,63,16,0,57,164,188,148,151,24,19,61,76,21,36,253,220,116,73,217,208,149,15,141,55,223,255,14,24,101,48,40,3,144,62,106,235,254,157,97,124,253,195,223,205,65,19,121,109,143,234,189,255,57,51,185,86,216,226,50,174,46,192,252,224,215,33,62,5,158,230,65,202,129,179,39,7,168,225,80,189,103,63,155,243,201,22,103,144,170,9,4,97,159,106,87,96,189,109,245,38,6,131,25,50,24,122,40,229,129,17,0,47,156,184,7,30,133,155,69,159,188,204,179,11,64,252,165,84,32,194,42,52,10,107,244,96,36,51,202,105,208,252,138,168,14,41,122,150,120,233,189,120,107,15,209,213,225,249,240,48,181,48,32,59,56,212,60,240,17,31,220,188,45,63,177,206,81,202,218,66,71,54,70,113,19,7,232,100,156,172,203,59,80,166,140,83,214,146,155,245,17,61,89,164,242,220,139,52,147,155,31,171,191,102,234,124,130,252,131,133,229,247,211,234,93,242,245,29,107,147,141,237,158,93,87,110,244,21,222,212,187,52,87,71,26,30,178,29,177,7,150,169,117,250,118,221,75,244,241,206,183,132,149,203,179,221,127,155,142,222,199,165,170,29,249,87,75,81,166,253,18,232,22,25,88,12,171,218,10,57,72,161,228,183,1,163,78,178,105,155,145,35,233,129,198,214,152,73,124,169,116,21,196,135,153,252,203,126,137,237,13,57,81,74,43,147,88,78,240,211,227,208,253,73,159,176,143,141,214,207,93,38,46,249,125,116,89,161,92,28,246,254,216,95,82,42,83,221,110,237,12,242,183,12,25,68,62,239,204,250,114,221,246,241,228,168,51,120,10,77,248,163,219,47,47,123,142,72,124,154,157,190,225,113,237,198,13,29,175,224,92,220,178,154,74,125,109,41,14,96,205,176,74,50,203,101,87,151,106,63,186,210,163,136,130,241,211,22,222,91,18,87,167,110,24,54,189,49,119,115,5,206,21,199,93,97,36,50,162,22,196,229,14,216,255,161,96,110,247,223,58,223,170,79,119,75,102,37,92,76,122,242,38,65,19,166,253,209,51,56,185,207,49,200,243,97,237,3,36,216,94,102,192,74,191,177,220,120,237,154,149,83,108,30,10,158,72,185,229,167,67,11,136,88,171,95,25,51,111,135,234,93,68,200,197,108,209,60,82,84,48,79,60,168,228,208,31,102,212,20,25,139,245,24,129,2,197,181,171,158,128,111,101,197,165,19,169,169,76,233,69,89,206,181,4,154,59,215,13,56,219,173,230,140,188,54,218,219,213,167,146,146,105,103,123,70,238,110,141,175,5,85,8,153,199,73,139,32,193,141,233,6,162,171,162,135,140,71,231,66,98,112,32,26,244,13,59,149,168,167,22,160,226,32,125,22,1,47,146,244,138,237,102,122,95,179,32,205,115,226,97,79,153,109,10,2,198,170,166,218,75,68,193,195,52,57,66,162,109,156,214,187,94,78,200,125,145,28,52,17,249,133,182,114,18,243,160,3,60,87,134,208,255,229,26,41,12,166,38,74,74,29,67,193,52,54,66,123,106,140,185,110,217,192,238,115,42,58,162,123,126,215,100,112,213,38,203,195,47,22,61,20,71,44,125,126,217,251,166,51,220,204,135,227,205,87,6,76,158,175,10,154,31,245,167,65,164,148,165,21,67,123,223,234,231,240,25,144,255,157,174,218,22,186,242,184,231,102,186,161,85,32,18,188,144,212,201,63,148,129,27,50,143,132,94,29,168,115,204,83,67,195,185,68,79,193,156,4,9,186,178,21,162,231,113,111,143,117,133,240,94,44,110,106,146,66,27,223,4,51,110,231,114,47,111,69,238,53,219,124,57,91,161,191,14,200,114,202,120,40,69,24,180,16,202,6,181,190,33,249,168,166,0,229,67,117,176,181,42,89,99,179,237,252,40,18,148,63,174,24,192,128,49,216,233,236,227,172,116,5,4,44,49,187,154,66,102,172,49,168,162,255,162,20,52,181,142,159,152,58,67,105,226,217,36,107,208,233,148,0,28,228,103,154,83,2,244,24,127,101,38,184,86,255,248,210,145,32,38,132,122,218,76,216,40,178,139,242,87,35,2,6,249,203,109,178,112,31,51,50,21,228,90,208,188,236,131,229,245,21,43,240,250,43,45,182,235,53,16,62,19,126,129,79,62,223,63,171,138,144,106,91,169,91,84,66,43,12,130,158,127,147,6,229,246,60,131,222,65,167,152,143,121,204,124,61,163,185,150,50,113,80,237,123,41,147,209,104,190,141,134,61,220,58,130,135,187,184,179,36,87,84,147,170,73,119,116,47,96,9,107,176,188,8,166,209,97,245,240,159,131,8,216,169,148,203,172,52,7,219,183,26,153,92,246,25,36,230,106,239,47,28,25,243,85,194,213,252,1,136,89,94,60,31,60,216,63,63,223,203,187,169,15,123,164,229,237,145,11,8,24,191,154,181,51,209,78,102,228,61,109,196,60,162,23,5,179,255,71,116,246,183,164,226,112,228,128,44,13,44,148,103,168,63,157,228,124,100,236,3,19,151,159,101,159,241,5,204,27,9,253,199,237,223,181,155,46,30,203,9,253,142,234,117,122,122,212,184,37,224,231,110,128,27,217,138,142,243,4,150,139,136,138,182,187,78,165,55,99,69,223,29,121,70,7,56,60,199,147,198,20,119,111,76,164,106,236,224,34,61,187,244,7,76,137,145,99,230,157,91,4,131,240,157,113,168,158,11,47,15,221,234,230,57,61,206,68,99,59,96,53,96,90,173,120,47,125,113,204,254,44,73,58,255,118,105,2,170,215,187,201,162,61,192,182,117,59,231,99,225,104,51,238,171,236,153,38,179,246,213,74,89,101,224,172,131,49,220,10,1,131,240,162,3,191,178,109,139,53,195,48,193,167,30,0,133,37,63,141,156,107,208,1,252,229,216,88,181,118,190,190,168,183,175,170,105,241,103,148,173,3,221,141,111,94,22,128,244,66,104,24,190,241,176,70,243,188,197,63,190,159,124,242,15,253,63,211,108,138,75,21,114,210,42,138,146,159,96,42,78,223,216,228,24,190,208,140,188,223,160,218,55,21,42,0,102,36,249,16,143,126,214,186,46,209,29,235,31,125,67,183,251,121,105,66,197,143,193,34,7,142,163,26,114,172,0,29,168,246,52,121,244,248,215,57,156,190,38,220,236,8,52,222,179,239,210,243,87,90,177,241,113,21,179,122,60,69,78,9,230,126,171,149,29,170,130,78,17,127,113,134,134,227,200,238,243,77,172,229,209,143,7,93,61,30,53,191,141,45,15,234,50,25,254,91,83,181,128,249,51,245,77,210,142,221,30,210,55,5,27,169,70,36,162,10,95,84,20,241,160,12,194,155,186,205,118,206,123,1,174,130,151,250,160,237,39,95,160,247,191,19,166,69,71,191,140,69,159,100,103,210,146,66,192,26,50,239,177,30,157,97,75,67,109,133,244,179,170,65,254,176,156,75,230,184,38,161,176,168,218,93,170,136,13,213,91,86,118,236,252,175,108,191,245,222,107,226,49,98,28,155,160,242,189,175,223,39,134,124,59,100,200,187,46,76,135,243,47,114,21,219,30,25,186,211,244,68,74,58,111,23,139,192,122,143,127,104,207,80,211,248,224,87,102,4,247,218,4,249,109,206,179,0,82,188,216,41,217,179,71,19,98,5,192,83,205,130,115,150,17,112,181,46,189,84,49,150,84,58,16,103,97,114,39,132,96,213,100,151,109,51,155,229,251,102,225,130,115,216,38,185,211,167,54,89,148,190,191,62,137,130,113,12,229,172,213,7,150,219,123,217,5,183,51,130,60,129,218,170,154,235,235,193,171,4,91,109,169,92,147,231,51,241,50,222,65,35,121,152,161,147,54,33,118,152,223,86,216,248,248,77,92,199,158,112,163,82,36,182,185,31,183,141,130,41,5,141,207,4,12,188,234,197,217,51,130,148,3,66,191,212,184,247,81,242,163,242,87,158,181,109,146,59,34,93,129,197,220,74,117,179,163,154,4,24,102,219,199,210,28,209,91,213,38,87,92,82,21,47,87,178,87,161,110,149,178,22,63,84,175,181,194,126,123,235,192,154,113,48,105,187,77,7,96,28,89,63,222,141,204,117,10,138,126,97,221,57,187,166,187,127,94,171,69,182,229,151,179,242,240,170,105,156,153,150,23,71,13,169,227,137,202,83,222,4,174,87,223,246,29,116,187,235,27,76,24,44,45,131,76,255,10,109,25,219,140,67,189,94,243,121,209,52,166,166,30,154,167,102,95,59,163,123,76,162,98,112,245,250,243,89,30,30,233,223,243,5,190,64,198,241,207,191,231,62,226,71,190,120,105,122,121,41,104,37,202,215,120,16,115,73,253,12,178,141,208,179,216,56,20,108,171,129,188,87,205,32,99,141,74,119,63,213,27,243,193,75,255,237,84,106,43,189,78,252,52,243,31,239,61,63,116,207,203,166,19,122,237,254,118,227,55,3,204,178,46,251,163,65,183,237,205,143,242,56,63,114,131,127,106,67,20,14,9,30,75,17,192,78,134,70,190,140,124,227,18,93,197,196,7,151,81,10,93,6,57,88,111,245,168,14,96,45,34,160,115,73,231,196,139,184,101,90,144,209,229,158,28,77,116,207,159,26,19,184,63,28,195,234,251,194,163,184,209,81,0,20,189,106,221,48,191,60,210,60,246,147,123,54,155,74,7,178,145,150,143,166,100,151,122,38,190,200,71,16,255,243,4,164,210,30,93,162,153,212,82,102,72,145,187,253,193,158,128,91,154,219,37,250,124,138,218,112,37,191,217,180,2,132,103,239,33,244,137,130,94,55,74,107,228,121,223,1,20,76,52,50,97,54,240,38,57,160,85,3,171,227,239,128,130,157,178,205,245,196,171,172,18,94,154,210,27,194,215,61,129,186,214,133,243,214,194,216,159,46,161,15,229,67,174,67,254,34,91,192,252,207,118,203,85,209,223,250,173,37,58,80,125,115,157,106,98,47,95,232,201,117,8,169,122,118,55,116,193,249,246,250,235,246,141,76,102,102,230,162,227,115,100,52,40,90,63,253,177,27,171,50,42,127,106,158,81,220,195,217,221,214,129,255,113,58,157,224,250,181,197,84,179,82,17,13,106,84,142,218,105,195,139,64,6,41,185,162,194,222,128,105,255,131,174,82,26,94,172,235,194,216,147,168,149,75,72,80,84,201,6,99,46,41,157,171,203,150,93,44,111,11,225,243,199,147,139,181,181,207,114,224,242,222,105,113,125,72,80,181,92,32,14,51,189,26,162,189,202,19,239,86,139,3,60,206,100,127,163,122,28,109,136,79,122,5,174,200,161,123,220,155,76,236,81,129,215,112,37,22,42,65,171,26,8,152,18,73,101,174,18,59,127,80,149,108,11,32,138,144,32,127,237,229,38,4,187,210,47,208,243,140,251,252,59,84,175,39,233,168,67,202,147,143,146,31,181,139,132,159,70,67,124,44,108,67,204,138,18,20,112,58,77,155,145,129,240,41,165,166,90,250,147,93,97,87,192,30,79,94,242,130,240,122,226,206,181,220,16,148,154,97,158,254,53,185,10,129,110,187,218,119,195,198,54,29,106,246,180,145,200,226,194,73,224,130,164,42,124,66,83,75,147,153,45,74,10,29,179,25,15,123,168,95,158,159,252,37,60,165,94,250,69,196,121,58,32,35,111,197,29,209,96,56,60,48,191,77,107,60,17,186,123,71,44,123,72,216,146,124,65,210,231,89,206,130,166,0,216,144,41,200,250,251,116,75,237,196,220,152,74,100,40,18,60,245,228,178,27,38,8,62,185,109,63,73,209,179,69,193,172,173,10,118,172,71,122,107,68,11,72,53,171,10,190,64,240,149,69,167,200,245,253,173,7,167,214,88,183,111,217,3,172,159,231,116,35,195,95,170,45,55,63,232,248,174,47,41,127,198,239,129,37,221,199,218,26,127,22,95,154,115,6,1,139,123,214,41,53,197,158,229,94,197,95,224,242,124,20,5,51,159,160,62,240,199,244,145,189,199,87,122,236,179,4,186,103,26,42,118,184,59,112,54,34,187,88,245,115,246,40,216,173,176,164,53,191,128,27,184,151,203,104,123,11,41,52,236,253,118,70,197,106,40,217,170,144,202,168,12,245,225,131,23,140,42,189,8,240,179,13,198,81,34,168,100,63,40,175,84,207,142,98,253,112,182,150,180,251,104,70,190,52,239,219,63,223,69,26,30,22,42,50,155,127,43,240,173,134,244,186,192,222,156,49,28,76,219,75,241,251,197,107,78,67,60,19,231,77,136,163,176,7,230,220,119,212,81,217,237,65,92,188,168,85,211,21,51,43,22,119,201,8,89,86,215,237,83,234,79,206,154,188,34,205,56,60,14,120,180,250,167,239,62,89,187,90,128,219,215,80,103,172,51,24,204,67,12,57,162,80,198,10,33,158,49,31,78,103,48,180,56,166,202,80,87,158,44,38,12,76,50,24,255,70,199,144,224,173,161,23,46,140,106,70,116,7,211,139,226,199,143,13,254,227,151,168,108,108,53,249,83,198,208,80,215,96,28,104,97,190,158,158,167,110,34,10,7,230,254,78,117,199,137,242,193,89,47,133,143,98,195,125,67,90,15,86,233,23,35,181,72,202,222,99,77,185,151,15,168,123,31,70,158,170,110,105,249,196,150,125,110,95,138,197,225,218,41,62,66,234,15,16,176,140,36,141,102,198,15,37,134,150,66,196,240,118,33,170,55,240,51,97,46,169,242,120,181,208,142,72,130,76,141,100,110,193,110,78,42,38,195,92,24,73,218,216,102,80,33,190,107,32,88,202,105,167,43,214,89,36,183,58,115,35,65,3,171,127,142,14,113,214,238,153,42,62,190,166,229,145,200,225,110,23,29,121,25,61,142,6,43,191,144,221,101,1,40,95,10,204,159,250,27,124,64,57,176,149,36,70,65,249,162,153,107,200,203,92,99,245,210,194,158,217,107,184,39,176,88,68,60,95,176,111,57,127,142,31,243,189,142,8,213,123,146,96,182,205,227,218,41,24,251,132,38,207,203,113,247,120,199,128,209,191,239,74,25,71,234,86,207,179,51,205,130,172,196,54,230,24,22,62,179,111,38,155,175,69,234,104,241,8,103,231,132,62,238,140,4,153,43,7,237,166,5,80,62,224,22,194,150,73,178,111,252,82,146,209,228,216,69,192,36,184,133,98,25,127,121,190,179,21,224,85,23,196,161,188,120,241,148,233,105,194,38,50,115,80,225,131,199,240,161,126,169,12,251,75,105,113,0,76,50,209,149,78,124,240,11,119,47,228,59,195,99,65,14,222,178,165,34,0,170,95,158,171,46,39,254,177,127,253,88,218,98,35,229,252,134,57,249,124,208,163,24,57,31,224,104,188,88,47,163,10,221,51,83,118,4,168,137,10,228,45,187,112,237,57,177,150,207,43,113,179,96,95,29,128,215,104,77,143,46,27,33,54,65,9,17,19,190,26,122,129,171,124,21,137,89,38,21,229,1,93,15,83,79,5,100,16,45,231,217,184,22,80,189,210,77,105,187,228,49,244,213,229,178,40,82,13,151,95,90,193,159,95,235,67,59,117,72,141,87,2,172,242,238,90,6,131,131,157,110,59,92,201,108,48,206,83,14,188,231,208,32,15,237,44,213,171,160,163,109,213,135,244,240,84,42,170,250,132,131,83,118,47,51,107,92,158,172,83,76,92,13,159,215,247,250,166,60,187,34,209,21,238,236,129,135,109,203,146,185,132,63,103,135,105,60,23,51,222,108,248,229,188,240,162,3,161,207,167,140,189,37,121,122,157,211,44,78,155,233,133,34,15,234,239,109,237,9,22,23,167,46,156,245,11,14,144,92,214,52,158,12,205,93,223,183,83,95,165,10,211,105,179,221,97,20,165,70,241,23,111,190,25,154,45,92,140,28,19,232,86,28,90,146,49,14,56,120,45,191,62,187,190,111,6,249,7,30,161,224,54,179,18,243,4,123,172,237,241,237,207,238,90,53,107,82,235,196,176,193,113,29,114,68,36,29,226,131,166,78,172,26,246,78,154,213,70,85,61,96,140,4,227,146,68,203,169,130,84,63,217,33,191,81,28,70,107,153,171,41,56,215,192,224,200,85,156,14,232,165,140,71,192,242,159,106,52,119,9,55,135,56,169,16,95,255,202,135,252,237,232,223,12,108,147,61,227,219,182,57,157,85,68,114,131,207,251,119,217,55,171,2,165,247,98,73,115,75,179,204,117,29,143,166,39,206,61,10,73,137,154,97,216,59,35,37,101,111,59,167,233,132,93,122,188,49,227,40,240,4,199,208,143,231,174,233,239,173,178,98,80,182,71,126,51,75,90,105,245,245,254,182,21,120,212,27,79,219,158,159,179,99,208,215,16,207,234,251,9,74,7,147,175,113,123,41,235,2,49,158,128,106,123,146,250,150,61,110,171,189,144,54,113,36,56,18,105,142,165,136,240,185,255,100,238,11,180,185,121,121,151,15,62,251,251,82,59,54,152,65,198,225,112,247,221,46,163,96,201,46,97,147,62,171,216,218,176,11,254,143,200,70,40,189,253,205,167,97,5,169,90,187,247,239,180,227,112,144,159,61,150,254,52,228,60,46,208,60,84,3,202,196,144,127,231,96,61,35,147,195,254,42,186,246,175,60,195,42,156,25,251,126,70,200,205,180,68,150,125,146,161,49,223,222,167,229,85,122,126,211,130,191,15,177,50,192,96,104,104,116,234,130,39,110,254,159,58,246,25,179,208,123,161,246,194,158,248,102,93,146,212,120,232,103,75,232,148,225,119,174,208,245,135,104,174,73,254,153,150,144,80,6,14,55,35,251,73,11,147,226,65,103,208,112,7,181,123,206,163,136,202,127,101,57,24,194,253,20,138,193,100,7,131,230,182,161,231,209,163,35,235,147,155,54,175,210,136,116,229,193,65,126,75,100,40,83,69,195,79,148,143,81,107,133,163,240,193,134,133,87,19,216,77,91,84,118,187,173,63,189,52,130,244,82,88,181,65,143,20,110,20,91,225,65,93,135,242,120,246,153,171,229,228,223,20,195,247,149,150,114,46,209,145,241,79,166,175,207,215,60,76,224,234,210,205,247,125,20,139,128,97,66,54,152,240,79,126,38,138,205,200,186,87,165,63,88,136,242,183,15,51,224,243,206,52,28,237,79,149,139,71,192,84,227,238,185,229,174,94,227,31,60,141,96,113,231,21,0,89,83,184,164,152,196,83,17,131,117,5,129,216,66,45,31,248,202,152,16,86,216,191,59,95,189,38,67,220,70,0,228,23,190,234,124,213,121,101,177,152,221,67,235,4,194,19,152,79,117,61,79,229,252,234,16,107,32,106,254,26,11,253,158,244,29,113,167,211,153,78,177,50,58,14,108,239,248,228,19,54,39,52,78,128,42,40,98,160,163,108,76,46,228,7,55,126,186,162,158,86,71,188,141,75,177,152,187,11,249,113,5,85,9,51,103,22,111,63,246,85,212,51,2,29,72,185,178,115,211,200,243,134,131,214,105,22,111,158,14,36,168,61,250,5,166,207,244,239,186,93,36,130,206,196,39,112,184,158,58,204,26,121,172,211,154,194,190,95,13,232,130,103,75,9,178,82,67,122,65,27,162,29,79,127,248,160,188,56,138,70,66,73,156,138,197,154,204,177,244,60,63,104,190,32,60,208,134,222,15,189,162,176,154,155,176,162,188,140,186,166,205,86,39,173,20,85,102,26,49,203,190,47,114,190,221,204,54,196,82,76,158,93,207,253,222,131,249,190,9,102,219,156,55,147,59,222,71,68,182,202,151,239,82,248,206,77,56,25,146,11,140,163,251,165,216,81,231,167,42,249,26,28,139,130,178,134,78,56,249,175,4,219,47,103,203,99,117,75,235,171,231,22,216,140,57,31,71,125,154,109,15,164,3,67,37,30,223,80,199,111,189,219,80,25,55,46,28,59,92,111,87,250,214,249,148,102,242,172,237,76,24,216,7,249,31,126,161,249,131,71,242,189,36,118,51,247,216,188,67,253,63,53,111,169,102,86,61,255,205,220,197,194,22,26,175,200,85,86,251,153,242,93,217,171,121,9,181,43,104,88,202,124,198,125,223,245,79,198,12,178,123,100,3,73,171,218,27,131,57,190,40,119,4,15,123,100,241,242,203,226,38,120,12,57,206,61,133,28,93,119,125,135,241,171,178,188,190,216,83,76,44,247,203,28,60,106,191,201,170,212,120,31,186,31,234,10,255,125,80,255,19,209,53,101,57,50,76,82,246,212,217,142,171,35,79,195,58,126,76,111,135,11,61,97,78,204,168,116,125,191,88,34,229,213,205,96,144,11,239,73,18,90,221,203,12,47,204,68,237,237,183,143,238,67,250,7,91,244,89,76,88,172,6,255,95,244,3,235,136,158,119,165,27,111,215,253,125,14,222,79,110,15,71,70,242,245,115,59,36,40,255,14,206,123,6,21,59,3,23,204,60,42,52,85,211,188,252,245,254,254,4,195,101,127,183,243,86,23,203,195,186,187,236,139,178,226,164,249,206,9,245,193,55,30,240,51,122,117,22,68,43,134,50,149,252,139,194,129,77,61,87,196,238,181,192,138,59,60,168,56,123,45,174,103,254,181,145,22,71,24,12,218,192,228,214,195,40,129,238,59,181,139,97,159,94,75,140,63,91,90,125,78,208,113,6,147,187,229,195,63,248,42,108,157,83,106,223,17,203,102,206,120,169,111,93,229,193,176,113,59,205,173,70,127,178,101,5,40,159,180,110,221,218,165,62,152,120,247,94,67,249,227,76,60,247,75,186,58,217,77,214,112,138,251,221,223,46,37,8,239,195,53,230,218,67,71,112,180,201,195,127,52,195,219,225,109,88,91,248,83,214,157,182,33,131,251,58,236,151,112,217,249,83,122,255,126,205,35,149,11,125,114,129,129,78,204,195,35,23,184,141,190,215,255,104,55,105,205,111,165,160,96,202,86,45,75,222,225,100,156,113,132,202,121,11,205,200,248,248,105,166,249,36,23,189,35,191,111,235,219,152,96,157,193,83,63,155,222,47,170,71,159,17,68,152,120,95,84,135,252,31,20,184,18,158,45,220,4,144,131,8,119,77,167,197,83,206,84,135,81,134,197,53,133,186,144,147,150,183,32,255,88,120,121,54,43,38,141,214,244,75,39,193,179,72,0,84,70,134,99,81,9,239,179,74,232,92,1,191,131,249,224,170,85,249,249,125,152,87,113,238,55,181,196,241,16,94,47,100,43,96,180,84,124,226,214,102,224,88,171,246,217,110,247,166,213,185,69,94,117,167,38,34,174,244,129,54,2,198,195,35,228,226,214,180,104,120,240,83,105,26,61,5,229,249,136,185,158,79,245,22,196,146,4,249,244,121,173,128,238,75,235,143,117,63,157,244,80,90,57,191,151,252,157,69,18,51,54,195,88,34,175,176,101,90,223,253,210,121,3,224,147,55,63,231,214,176,152,80,170,84,33,213,60,29,135,240,79,200,209,154,123,139,206,74,117,41,250,242,160,6,17,135,128,29,123,114,153,248,108,36,37,159,169,112,243,186,146,17,228,31,71,42,93,65,169,248,14,76,97,199,179,91,253,80,189,110,31,45,6,72,58,74,215,216,202,120,101,121,92,129,249,220,138,75,198,236,143,83,4,34,96,230,0,19,42,237,174,195,143,24,97,230,254,213,163,163,53,148,35,252,146,52,221,169,133,63,244,113,155,125,187,247,236,143,38,49,18,9,130,18,74,163,158,17,103,173,148,147,183,194,197,189,37,183,255,252,30,98,12,253,119,122,118,107,154,242,96,121,126,11,48,55,24,255,53,56,168,116,139,197,133,189,228,76,60,31,220,80,189,97,190,88,158,84,57,231,83,211,210,48,230,10,200,228,85,93,199,208,48,140,141,73,140,21,198,2,1,19,37,171,191,199,96,48,230,206,88,59,13,10,14,202,63,234,234,91,55,131,205,235,107,247,87,233,17,17,168,94,167,50,12,217,159,161,97,173,10,213,116,128,173,63,136,81,166,68,27,18,62,192,125,255,214,82,127,77,30,174,143,171,7,188,182,125,28,153,61,100,52,22,250,11,242,59,91,150,158,104,143,41,21,119,167,229,69,15,55,36,152,95,54,144,205,195,39,76,94,247,61,175,122,192,17,186,192,229,189,218,187,22,184,253,208,214,220,201,231,174,197,58,192,57,80,172,167,24,106,168,103,102,109,187,40,53,7,225,155,251,234,48,133,106,16,209,169,52,57,197,147,57,205,100,96,241,151,233,231,202,163,113,159,252,130,184,59,234,190,192,141,215,101,78,222,19,130,134,157,61,47,150,94,252,71,7,248,173,90,248,60,19,175,136,41,125,168,29,243,95,95,139,127,114,215,237,21,122,240,220,228,150,61,131,58,201,64,130,23,142,27,184,120,58,71,71,143,48,81,97,52,86,102,121,110,137,165,214,228,222,58,156,51,245,96,114,50,178,164,210,220,75,87,254,87,168,165,115,25,54,152,150,156,19,89,33,230,125,254,115,131,171,42,161,48,188,157,209,48,237,31,207,79,88,239,111,159,80,221,210,173,203,179,226,191,141,4,31,62,247,85,182,157,198,154,40,99,39,41,214,12,201,100,84,79,223,64,83,123,218,193,255,15,58,39,248,114,31,219,183,234,211,209,209,76,217,153,152,24,230,131,187,133,35,231,2,24,100,127,115,106,176,205,13,141,80,228,147,187,73,205,138,79,232,52,255,96,72,94,113,90,199,45,28,10,125,141,110,224,200,195,3,116,232,208,34,153,215,160,137,79,77,237,83,10,113,212,203,183,249,16,240,19,58,228,127,249,91,230,12,134,33,132,249,224,208,179,167,167,18,67,175,74,220,15,8,137,140,180,30,11,148,188,21,46,241,124,197,207,140,161,73,165,126,220,96,108,67,124,231,25,194,217,179,225,23,225,128,27,162,61,216,117,5,84,71,229,111,96,142,160,181,135,191,6,221,61,33,5,249,205,103,2,68,189,236,162,42,58,91,99,180,116,9,10,22,220,209,178,132,136,191,99,195,250,144,228,111,124,217,19,32,213,33,148,209,63,85,250,143,92,250,36,38,118,237,255,126,84,198,1,143,120,9,164,236,134,112,67,245,125,74,241,42,38,233,184,229,99,201,147,143,18,223,32,160,124,187,189,240,94,239,249,234,194,67,173,138,231,211,108,124,139,238,48,171,173,17,70,17,30,100,122,41,151,53,16,214,133,30,182,176,247,17,181,145,72,81,182,246,57,33,136,234,149,36,101,200,16,23,166,128,135,149,11,82,42,13,179,32,241,76,240,236,100,40,238,254,177,176,147,88,61,200,79,159,186,228,131,33,154,165,195,239,0,152,91,252,86,80,94,54,249,224,20,47,203,77,100,238,9,100,81,211,250,255,122,24,150,16,82,230,91,160,114,242,244,39,54,129,238,137,68,83,142,19,0,186,55,99,73,112,42,106,76,43,145,251,34,22,43,43,207,163,126,176,55,223,153,35,6,249,243,167,151,135,174,53,89,185,141,120,217,153,15,107,31,234,133,73,43,198,149,250,134,248,216,45,39,89,1,221,131,108,58,190,98,196,37,199,201,46,20,163,205,74,117,5,234,42,222,158,143,244,90,146,146,73,102,12,90,84,124,101,82,0,79,154,223,64,28,151,240,143,22,244,55,218,65,192,228,107,85,230,242,52,54,121,254,9,128,143,210,37,54,65,86,43,181,255,142,86,178,219,206,253,202,68,118,156,208,202,104,157,41,204,235,136,96,99,48,68,59,190,41,41,31,238,63,230,120,73,53,172,250,198,52,165,183,134,123,104,113,216,212,188,144,186,90,62,222,245,33,7,181,251,119,30,5,203,32,15,132,25,84,188,237,11,178,198,217,189,238,219,208,59,183,18,74,171,232,200,183,76,189,211,178,43,132,67,131,145,223,102,251,70,113,43,187,205,84,44,25,167,225,10,204,166,85,94,127,153,56,105,91,110,189,109,102,107,41,0,22,190,38,83,244,95,245,141,152,77,117,80,27,59,161,60,175,166,90,126,159,205,237,11,215,248,184,139,173,169,86,66,122,84,101,245,214,140,36,15,78,52,37,229,243,111,73,46,155,21,117,183,73,175,208,149,122,20,183,136,63,111,247,87,222,222,252,252,164,28,187,117,159,234,93,10,238,25,132,247,154,148,2,159,42,223,90,97,31,98,95,65,45,26,84,246,118,166,42,20,129,98,69,0,47,224,200,137,4,149,72,151,41,211,205,15,250,248,55,45,9,191,170,14,247,227,68,100,88,238,34,37,228,78,86,96,48,88,40,47,29,247,154,87,108,203,118,218,126,38,252,37,90,31,213,187,214,155,177,234,147,188,114,173,191,230,90,149,197,59,20,204,77,141,186,57,126,93,41,184,173,117,68,5,235,58,35,251,68,43,171,205,215,12,212,81,86,147,14,60,89,47,73,40,44,217,158,152,252,132,200,158,157,159,167,173,78,211,187,102,182,219,111,51,73,103,118,73,162,37,231,165,107,15,247,139,5,89,209,115,70,246,230,147,96,97,116,129,100,211,171,21,202,254,114,99,113,136,195,249,196,207,159,185,249,252,230,79,99,223,223,202,136,254,220,220,92,218,87,241,11,242,91,89,2,172,164,235,217,35,82,223,75,84,190,200,204,184,195,177,4,122,234,92,122,183,104,164,30,101,183,86,75,94,242,161,143,79,93,110,129,136,253,222,228,242,6,149,15,46,95,156,55,255,112,23,231,111,231,22,9,73,246,38,152,97,217,246,68,10,251,185,55,3,134,73,61,69,69,192,12,220,155,238,98,202,88,202,192,61,188,198,95,30,191,74,209,30,201,1,81,211,231,143,200,254,56,28,125,23,161,231,40,118,69,151,101,108,152,178,67,102,76,50,22,57,193,215,43,197,83,63,134,126,87,71,18,251,51,115,211,125,1,175,241,159,158,146,228,188,55,132,182,120,103,74,146,214,86,202,66,156,18,198,43,106,57,184,253,219,244,223,93,20,76,199,228,131,43,188,203,193,38,172,30,135,123,54,249,185,226,110,77,13,109,167,92,61,175,184,170,170,180,242,6,164,95,144,255,100,79,95,56,13,200,188,252,247,222,23,9,102,52,121,176,146,156,178,130,240,140,211,34,114,57,124,183,194,253,218,24,147,183,30,163,136,132,248,154,166,123,124,28,113,155,19,213,63,140,104,244,149,187,92,68,67,241,195,253,19,133,236,123,225,202,23,236,246,143,224,229,240,200,238,31,253,104,235,146,159,213,128,220,235,93,156,150,33,10,110,56,159,97,109,183,123,193,136,181,79,87,250,215,31,4,76,219,106,199,233,241,139,147,143,164,236,175,177,232,199,187,2,229,69,229,231,75,139,82,241,136,5,89,251,16,13,232,121,214,143,185,148,185,53,245,220,127,180,235,153,53,7,241,109,182,130,91,108,196,158,52,115,8,251,148,132,3,18,164,206,124,221,178,7,113,71,207,144,169,109,102,213,16,126,133,175,126,11,157,46,119,173,42,73,23,168,250,198,215,95,58,88,136,53,166,212,105,201,55,250,60,153,69,65,252,196,37,68,120,44,109,63,147,101,251,92,21,67,133,242,239,139,144,111,205,43,205,133,203,229,97,149,22,11,90,6,223,7,55,201,47,133,37,216,30,50,227,241,48,71,20,236,198,133,149,109,54,223,23,26,141,58,237,104,194,219,160,174,182,113,196,241,183,199,13,93,138,208,226,156,192,89,232,186,201,174,231,184,75,210,192,2,32,93,85,161,130,69,222,94,25,139,232,104,183,20,93,74,45,168,93,143,93,139,31,219,60,80,240,117,175,104,13,21,186,7,84,19,156,65,175,145,223,75,7,191,94,179,92,101,63,184,158,101,134,6,237,87,228,247,111,84,210,240,177,21,46,139,237,74,40,152,207,246,239,181,70,92,70,107,131,28,217,199,208,31,194,231,254,116,31,38,128,236,23,103,79,13,98,4,32,192,73,139,148,9,155,129,230,193,99,191,63,225,60,108,93,1,210,75,184,170,189,2,171,155,19,198,136,96,230,130,4,229,155,239,152,67,122,59,152,70,247,161,162,89,156,65,66,165,242,5,159,196,218,40,141,61,173,157,42,69,116,79,227,132,217,69,241,229,0,21,203,121,223,230,128,118,1,48,131,104,88,206,41,63,254,168,244,75,99,248,3,3,73,131,99,53,30,225,59,229,87,153,163,197,206,34,174,119,251,2,202,117,68,143,255,30,80,25,225,178,17,143,203,242,16,96,112,160,243,152,16,15,138,97,55,36,49,121,63,111,19,148,87,28,124,183,233,115,64,30,40,204,90,88,193,75,158,26,253,27,248,111,77,145,95,147,213,124,114,157,193,64,245,122,54,25,227,200,184,32,92,56,173,254,86,208,93,173,254,229,250,53,23,138,48,131,145,162,164,140,163,29,28,238,159,29,131,185,179,244,104,2,156,14,135,122,149,209,250,193,172,214,246,221,67,32,170,71,71,112,125,128,79,86,63,105,240,83,211,132,145,117,102,83,8,249,168,48,2,54,253,105,147,56,37,166,176,215,21,92,136,59,112,141,172,120,56,221,235,150,230,60,207,217,62,190,80,20,95,36,201,241,172,184,178,239,156,148,14,215,85,33,135,144,8,59,90,206,235,248,242,131,102,117,177,131,234,51,10,36,222,251,135,251,21,42,240,5,252,227,34,246,48,54,225,235,229,116,32,219,46,247,59,122,33,131,244,91,81,124,96,229,12,74,182,50,230,179,6,5,97,43,6,147,3,96,22,108,116,32,78,110,226,142,113,189,169,55,211,90,215,248,183,32,4,44,35,89,125,155,109,254,172,21,46,120,126,188,137,178,9,150,203,77,124,71,71,49,222,52,76,140,237,48,180,81,189,11,101,166,243,143,144,176,128,188,218,220,197,252,38,20,76,194,116,129,94,214,99,213,23,62,214,142,195,50,16,122,85,101,175,130,51,10,22,175,151,183,182,56,62,255,231,10,40,212,125,184,20,194,112,176,159,154,164,55,211,72,235,0,172,148,10,239,40,250,250,37,187,34,61,160,227,50,164,143,92,66,91,131,134,190,158,166,41,123,250,74,208,253,249,133,85,137,51,143,79,252,69,188,0,138,216,171,160,235,41,2,68,225,18,182,237,163,154,37,204,181,211,2,224,177,139,6,110,23,131,178,70,103,76,190,162,147,152,145,224,177,66,1,101,224,105,177,200,109,11,119,36,158,137,175,63,138,121,223,151,196,115,60,198,171,49,76,217,80,241,255,122,77,9,81,140,137,198,3,175,187,205,205,4,64,75,189,134,231,69,192,107,22,95,203,49,245,215,25,72,80,226,217,101,138,194,14,19,111,254,95,214,32,169,97,200,207,189,16,208,254,19,45,215,242,31,15,237,191,125,79,103,80,222,120,228,99,221,171,79,169,73,154,147,91,158,229,90,10,71,206,4,215,76,98,113,60,230,140,191,83,159,33,255,173,124,81,104,182,32,158,45,26,193,20,83,117,58,225,27,228,151,132,190,13,93,58,118,67,115,144,119,129,170,13,141,183,217,221,237,174,82,88,238,209,42,93,185,182,163,16,255,112,223,59,130,221,91,123,254,175,157,206,233,156,128,130,223,154,207,144,175,114,96,249,143,131,108,12,87,91,128,252,91,173,138,243,94,252,131,12,170,240,43,62,151,4,58,192,113,239,236,109,187,23,246,25,86,245,69,47,242,172,17,176,196,231,235,15,31,121,86,74,252,88,148,242,70,128,208,231,21,108,202,93,73,214,61,67,71,181,31,21,158,15,189,255,67,55,156,146,255,48,137,164,176,184,190,93,93,10,221,79,200,224,219,64,189,72,24,187,20,198,137,72,152,73,224,246,118,221,215,83,117,203,41,20,217,46,212,180,135,190,47,164,90,218,97,165,252,83,193,108,90,202,45,8,13,106,108,21,47,147,170,207,85,75,85,121,144,20,106,36,19,116,191,32,178,231,89,184,5,63,95,29,248,195,160,35,65,24,191,226,55,198,50,197,163,240,142,163,106,99,244,38,56,253,165,159,67,30,205,93,110,221,58,229,153,101,45,0,38,198,86,185,45,62,222,213,126,114,244,41,250,162,0,26,246,190,71,56,21,144,254,224,206,178,164,169,98,113,4,9,38,102,190,144,250,247,32,155,182,236,56,92,81,157,190,217,221,53,211,104,250,159,232,215,8,83,3,204,61,219,246,175,105,103,189,87,231,62,190,16,12,7,228,6,168,94,127,181,218,189,167,86,233,11,179,87,100,52,206,237,23,214,4,57,131,219,85,250,223,20,202,98,207,166,149,189,105,252,53,200,7,23,109,155,206,199,132,219,171,49,118,105,40,148,5,18,210,207,91,193,76,87,241,160,0,158,45,39,42,87,0,116,212,253,146,138,146,195,220,236,81,171,59,202,9,114,130,169,131,219,148,126,141,48,243,200,62,174,60,237,77,84,101,178,127,82,196,247,162,64,194,201,155,189,147,87,186,157,65,29,155,76,207,21,159,12,223,35,116,160,213,241,131,39,80,89,244,72,142,252,44,236,96,243,255,9,149,47,33,67,171,169,212,179,252,46,14,55,25,241,198,198,8,202,43,23,111,29,47,226,249,11,99,24,85,84,85,85,205,124,204,169,199,170,104,188,62,168,216,41,93,74,124,158,124,216,95,113,11,126,22,110,228,175,169,127,214,100,129,68,7,66,75,28,186,93,189,109,247,211,12,2,97,162,93,168,94,105,146,209,213,6,35,123,114,64,104,248,246,110,48,148,31,165,110,105,91,242,178,220,5,91,53,229,138,216,215,190,104,226,63,215,14,191,206,106,16,30,57,105,224,118,155,15,174,236,145,145,239,135,107,192,173,220,228,88,74,141,245,4,26,190,186,93,144,171,40,33,77,180,45,147,78,85,249,49,111,124,8,27,230,124,98,69,183,98,57,201,118,146,237,48,159,132,148,234,151,231,24,177,73,252,251,68,48,15,189,127,5,111,72,251,120,146,165,170,162,242,204,25,133,66,148,236,199,223,153,213,147,238,249,198,181,108,252,121,230,117,155,96,179,141,58,31,250,18,247,156,88,114,138,123,28,26,1,15,156,160,91,60,106,247,23,191,104,162,96,196,241,3,170,151,148,203,152,240,159,41,187,192,205,101,188,225,203,91,128,242,69,111,9,162,100,38,223,191,146,228,187,38,238,80,189,191,184,60,244,109,56,181,105,70,126,247,102,211,43,20,91,202,230,78,189,186,120,2,178,50,134,235,77,61,202,41,225,168,4,245,65,59,227,3,171,136,89,104,180,204,51,72,239,164,238,93,115,43,253,199,110,79,101,213,118,172,22,0,37,46,122,149,174,217,62,104,17,80,184,125,109,45,101,182,251,222,59,69,150,223,248,244,153,52,185,4,221,143,86,135,235,185,62,68,198,31,165,85,199,37,55,143,202,54,8,31,34,35,232,146,172,219,236,25,70,204,204,138,98,190,128,169,200,128,199,217,68,124,242,167,163,132,62,14,222,255,247,179,205,135,219,76,142,72,56,40,185,88,91,67,255,207,162,147,229,190,18,190,249,196,141,127,121,209,118,255,95,63,134,133,128,230,86,85,182,163,68,115,31,8,47,92,138,81,200,18,177,251,81,163,233,23,127,133,73,230,102,54,126,249,251,227,251,217,99,51,58,243,66,8,94,206,238,44,42,178,73,74,122,232,188,162,123,211,117,42,2,171,91,57,216,185,30,0,119,32,212,16,19,133,171,133,16,189,174,207,231,70,233,1,162,116,57,156,158,91,189,160,39,224,85,89,165,104,97,220,54,231,114,241,199,79,189,81,4,204,177,239,139,105,136,40,214,192,14,233,149,16,28,162,143,16,244,166,127,108,175,107,192,160,115,86,158,12,75,133,117,5,82,139,82,175,100,158,191,93,237,108,63,50,43,237,10,40,85,125,60,207,230,121,189,23,203,167,64,43,249,78,139,119,239,145,145,245,197,102,224,236,174,61,225,122,201,143,238,89,233,55,6,101,129,255,222,50,103,125,100,175,143,17,0,97,39,228,223,79,110,61,164,3,60,101,58,31,19,248,170,159,150,149,229,109,197,231,155,216,6,135,134,211,52,208,48,243,30,225,5,176,24,63,137,247,194,231,255,148,134,240,74,168,158,31,254,224,167,106,23,63,176,25,188,139,130,67,215,157,68,198,66,130,19,201,198,226,236,183,37,91,43,6,199,85,24,187,70,4,49,1,131,27,47,255,205,84,240,205,150,100,189,91,45,156,87,178,15,145,171,92,64,131,134,251,21,239,65,49,80,12,239,251,106,187,182,126,19,84,85,28,103,97,230,211,18,78,48,156,223,138,188,226,184,113,250,253,233,222,255,152,122,87,24,199,30,137,23,66,252,45,79,148,197,156,97,73,197,71,233,166,76,207,6,210,226,143,158,233,91,108,238,108,91,214,208,232,141,103,138,209,5,3,191,225,65,35,135,227,63,225,77,149,47,228,158,67,245,192,37,68,244,230,248,201,52,92,109,169,119,146,66,7,18,189,127,221,220,99,114,115,192,211,186,69,218,50,56,193,156,120,234,21,154,245,96,251,64,115,200,193,196,30,132,71,73,207,237,199,60,45,241,160,84,174,153,165,182,47,64,40,230,191,178,250,10,151,81,211,229,243,225,98,37,10,38,115,149,224,200,92,131,239,95,136,187,239,207,8,246,4,46,190,97,87,142,129,201,25,77,203,206,155,121,135,162,96,94,95,227,215,252,161,200,126,83,57,144,165,199,2,209,147,151,28,59,207,120,112,186,58,106,226,175,20,154,9,1,15,177,175,51,146,146,50,29,193,228,18,174,19,44,4,64,99,255,140,160,43,26,253,235,191,175,125,188,177,185,19,42,192,234,240,68,177,35,216,40,171,26,117,118,220,83,53,8,88,138,184,246,79,152,248,115,85,138,58,30,80,62,225,12,6,159,75,120,231,243,40,130,233,238,13,76,5,236,235,154,123,199,93,219,231,232,71,174,130,101,207,141,242,209,185,211,76,199,46,222,153,238,12,247,179,6,20,196,2,111,243,65,124,38,125,199,56,240,248,131,79,132,198,88,75,2,6,242,227,229,30,68,7,128,133,247,77,57,53,199,131,136,146,77,27,180,247,237,196,167,68,216,50,159,201,252,41,116,216,223,156,150,36,232,222,114,138,57,252,85,71,67,208,225,126,186,174,148,81,52,76,172,251,155,120,249,73,2,170,87,36,134,48,223,47,244,162,35,73,213,145,39,167,136,175,63,171,190,48,8,207,41,171,107,105,162,96,236,17,122,216,143,165,178,253,234,224,113,54,233,1,15,77,124,2,154,143,250,214,69,27,61,170,31,82,27,134,244,102,66,245,250,127,206,96,61,111,90,189,72,34,9,215,16,42,102,193,91,229,163,49,186,60,154,201,192,1,111,213,151,219,174,128,124,229,159,243,4,179,237,159,194,223,165,190,72,125,65,113,136,104,126,12,169,164,218,222,131,249,98,28,81,74,179,221,138,159,83,49,214,181,109,213,156,163,79,60,173,124,81,203,182,93,35,15,125,234,203,87,199,251,117,151,158,107,160,123,20,63,27,106,88,63,239,111,175,239,233,120,202,85,11,229,89,30,33,29,202,131,33,142,200,92,97,131,189,173,77,48,219,115,208,140,183,45,90,139,99,247,243,29,130,59,90,22,127,222,222,181,194,197,61,201,211,245,194,135,216,100,72,207,11,45,9,116,209,192,2,188,116,17,242,59,130,14,52,91,152,60,153,193,216,188,254,196,192,60,145,195,29,250,243,99,179,161,158,149,177,156,210,236,5,164,213,67,254,77,47,32,205,37,47,121,164,189,60,254,24,202,231,202,194,54,15,245,156,55,117,53,22,191,86,138,66,254,174,232,105,154,10,91,163,158,84,17,211,148,24,183,227,27,61,137,255,130,215,95,180,71,122,184,149,200,73,94,85,57,92,127,187,109,154,154,0,247,184,30,47,252,171,240,7,22,105,185,114,115,185,176,201,184,22,209,16,183,171,157,32,0,242,60,187,124,196,248,245,46,155,213,125,225,163,146,152,217,238,170,142,164,219,196,98,244,53,110,202,143,160,97,105,218,253,71,255,185,82,58,112,197,93,173,167,86,111,30,33,67,126,96,238,104,114,177,80,77,139,101,5,181,192,188,29,217,173,222,225,205,90,72,147,98,48,126,20,142,50,198,81,48,107,139,222,153,28,230,218,82,34,18,20,231,172,225,243,217,148,28,182,131,23,141,140,137,100,255,115,174,221,132,244,166,220,61,238,50,147,137,67,192,183,200,215,200,106,136,175,11,47,235,128,47,206,50,177,59,32,48,213,157,206,32,63,138,232,113,22,6,188,204,239,18,152,17,211,166,33,97,23,49,219,0,156,11,193,201,158,115,63,240,234,12,242,118,79,113,198,189,53,243,153,140,99,21,129,250,209,126,178,167,156,191,94,220,74,30,127,84,12,104,198,93,45,21,60,123,205,43,246,99,82,168,224,137,64,129,156,73,64,12,1,127,41,154,39,93,238,148,115,95,18,94,253,211,170,201,10,176,143,73,126,119,155,162,241,64,93,251,101,233,117,245,77,112,110,202,0,222,197,7,68,118,1,88,211,150,116,26,82,191,148,169,55,169,53,174,87,94,129,43,177,191,7,1,147,207,228,26,130,241,116,225,43,205,179,48,185,24,1,80,85,90,104,171,174,101,253,79,237,140,176,103,225,117,190,234,151,111,107,201,193,238,17,170,163,94,58,252,75,102,135,253,40,2,230,21,202,158,41,22,48,202,109,140,209,97,30,82,221,118,29,226,152,148,139,100,125,192,246,111,29,96,205,16,220,101,249,197,114,242,84,133,213,66,23,3,242,147,181,22,240,3,57,218,12,131,42,115,0,199,65,120,184,232,243,237,129,211,196,155,117,208,155,197,38,232,30,82,191,174,169,3,179,212,154,88,149,83,213,230,157,8,141,231,149,130,212,23,38,233,10,159,91,189,104,34,102,18,56,118,81,168,206,50,177,69,159,112,166,244,136,215,198,26,50,237,109,121,191,173,89,153,163,201,52,246,18,255,179,153,203,149,169,99,40,10,47,127,17,73,219,106,21,198,129,4,181,45,135,153,133,162,149,241,55,164,150,98,245,75,32,254,106,118,63,126,83,214,134,234,216,2,186,131,152,195,60,159,74,182,104,189,184,28,156,221,115,203,8,60,92,143,81,153,147,208,4,226,62,41,87,129,21,154,159,145,118,179,76,239,207,96,19,155,53,214,223,199,5,5,64,254,183,57,4,35,231,85,196,38,119,47,90,58,143,221,78,151,227,70,86,99,122,110,74,186,246,197,225,224,132,112,40,207,147,108,182,13,127,233,39,196,92,47,114,143,63,45,121,44,230,246,240,211,220,214,118,35,164,0,243,135,255,62,64,124,58,201,2,20,138,249,84,166,89,23,187,49,221,68,130,170,4,133,88,116,194,79,100,185,145,12,105,168,16,194,39,224,25,52,138,91,251,124,86,179,183,205,59,138,47,227,30,254,79,214,184,78,109,202,238,191,51,111,37,114,208,160,239,85,143,220,126,160,167,168,152,3,119,95,7,135,236,54,73,156,27,117,56,158,39,79,252,90,107,11,55,67,192,239,47,73,7,59,143,155,4,15,143,99,29,133,233,144,126,42,218,96,254,178,68,70,114,136,232,207,204,211,80,240,63,49,32,51,62,231,238,118,85,161,45,169,186,2,1,127,53,33,64,252,20,59,19,109,85,36,197,251,22,64,203,158,154,178,126,113,26,142,41,14,183,12,187,220,242,12,226,247,123,231,208,11,9,137,191,63,90,246,122,181,117,162,60,234,223,126,111,198,185,199,208,52,92,111,209,104,79,145,160,199,70,236,6,1,91,57,20,249,152,160,95,105,2,213,67,153,1,28,209,5,142,199,123,29,97,116,25,28,238,175,26,81,124,170,158,229,42,173,141,61,119,103,133,244,230,185,59,81,247,72,87,41,109,62,77,72,196,22,226,3,187,14,180,187,248,137,249,157,216,136,43,77,30,232,158,154,14,83,120,13,62,249,233,235,70,157,57,165,24,20,76,20,155,243,25,211,128,69,147,113,140,115,9,108,135,253,236,251,145,17,252,214,9,124,241,250,226,130,185,136,158,103,164,44,153,164,170,154,55,11,167,213,190,167,108,160,122,239,255,48,236,153,140,83,198,228,70,243,60,141,130,173,3,58,165,173,228,215,172,93,153,238,233,199,6,165,34,80,9,9,111,83,52,130,43,223,26,127,108,140,85,177,16,159,5,117,102,253,59,85,7,149,175,133,88,112,226,170,21,255,159,231,51,254,150,255,149,125,78,149,203,180,146,119,210,59,151,150,171,100,187,227,1,112,116,166,126,136,6,199,145,159,162,228,245,135,56,99,77,4,63,250,156,146,77,230,236,254,213,241,27,94,201,18,147,154,81,113,132,32,123,225,158,187,68,90,155,239,133,153,68,5,198,3,134,35,107,38,148,143,95,121,96,60,89,0,36,30,184,155,84,85,56,0,240,56,56,233,125,47,136,28,127,242,242,141,211,196,251,195,126,152,171,240,235,136,36,124,124,60,83,23,124,71,171,207,133,240,233,89,6,150,107,138,23,193,202,197,194,228,180,81,31,189,100,145,147,247,55,69,99,184,138,91,36,12,226,247,12,21,180,207,111,24,74,158,92,246,118,140,221,23,208,25,250,217,31,33,89,24,152,102,149,231,164,145,252,127,125,209,94,1,60,28,52,126,243,32,196,83,199,23,244,97,112,229,159,97,70,118,204,43,159,78,146,33,252,41,21,92,158,99,123,138,215,135,71,126,25,247,26,191,158,144,116,237,134,84,245,204,91,78,220,238,233,104,134,38,29,96,181,57,247,14,108,212,212,116,210,247,64,95,50,208,234,47,79,191,16,164,38,236,237,39,193,35,170,30,190,177,222,181,214,43,39,72,59,57,185,35,106,151,242,96,181,141,19,12,138,33,190,62,248,136,51,9,178,10,146,32,168,10,128,74,79,85,134,102,100,91,244,250,20,23,120,54,11,81,240,247,91,71,43,250,124,72,120,184,64,17,203,114,6,29,104,87,28,122,39,69,39,15,7,252,103,115,113,124,87,0,194,231,63,113,19,14,210,91,159,7,122,150,226,201,40,216,41,76,239,12,94,222,51,72,143,231,243,153,226,178,255,247,11,97,159,231,146,77,20,203,171,43,5,171,60,1,151,180,248,243,180,42,121,145,41,94,231,189,145,130,25,182,185,183,59,116,191,78,170,70,38,219,57,66,241,14,2,22,247,84,208,173,204,62,236,186,140,81,225,53,75,45,148,158,213,70,196,248,74,66,75,112,153,107,141,202,41,224,51,242,136,247,104,226,165,53,149,153,183,233,247,55,204,125,54,65,86,143,97,190,123,137,225,108,183,240,94,153,111,225,124,137,155,155,157,12,187,84,9,191,39,221,149,10,143,161,60,81,250,244,178,57,49,59,168,32,171,89,42,209,56,122,182,187,241,71,197,166,164,200,90,216,13,27,141,102,53,202,255,243,176,118,101,228,151,91,202,207,7,31,93,115,130,252,107,161,10,156,16,245,235,113,199,117,217,166,98,198,33,30,174,16,97,151,52,139,196,238,150,32,78,179,243,45,31,108,118,106,152,21,197,252,92,12,247,207,115,98,71,201,187,117,205,5,22,156,153,57,59,112,195,99,206,250,30,178,251,215,170,214,126,156,157,216,11,38,106,142,226,2,132,39,85,130,160,203,159,199,162,14,10,18,182,154,50,158,135,126,159,139,96,99,166,115,126,79,9,158,90,249,81,50,242,100,151,247,206,203,109,111,0,193,109,239,116,230,132,46,248,183,196,153,205,15,124,48,197,245,192,76,20,51,12,241,193,159,55,133,139,148,136,225,125,251,70,118,2,30,217,237,52,192,50,92,37,178,157,166,237,225,126,51,145,26,90,1,241,57,197,167,208,219,40,213,111,126,125,139,12,229,247,102,46,183,80,99,123,253,201,25,165,119,30,236,179,221,247,127,200,142,249,46,5,60,120,248,47,162,81,173,22,202,59,1,213,249,126,102,116,170,127,130,202,167,151,238,16,94,68,175,54,109,107,140,30,147,202,193,195,231,76,14,251,207,140,15,154,169,154,229,141,42,205,49,151,177,144,126,100,41,28,67,159,214,211,84,142,143,60,57,248,15,221,179,214,203,187,10,68,206,244,132,241,140,23,127,68,162,96,242,198,223,87,109,202,155,53,62,182,220,40,88,208,70,193,12,141,135,62,93,216,206,117,247,32,253,44,78,38,253,15,61,247,211,11, \ No newline at end of file diff --git a/screens/mainscreen/images/0.json b/screens/mainscreen/images/0.json new file mode 100644 index 0000000..72cb0da --- /dev/null +++ b/screens/mainscreen/images/0.json @@ -0,0 +1 @@ +{"name": "0", "type": "bitmap", "format": "COMPRESSED_RGBA_ASTC_8x8_KHR", "astcCompressionSpeed": "thorough", "width": 240, "height": 240, "compressed": 1} \ No newline at end of file diff --git a/screens/mainscreen/images/0.meta b/screens/mainscreen/images/0.meta new file mode 100644 index 0000000..df2b1dd --- /dev/null +++ b/screens/mainscreen/images/0.meta @@ -0,0 +1,5 @@ +{ + "converter": "Image", + "imageFormat": 37815, + "sourcePath": "D:/Projects/Embedded/AirsoftTracker/1/0.png" +} diff --git a/screens/mainscreen/images/0.raw b/screens/mainscreen/images/0.raw new file mode 100644 index 0000000..fdf5fb0 Binary files /dev/null and b/screens/mainscreen/images/0.raw differ diff --git a/screens/mainscreen/images/0.rawh b/screens/mainscreen/images/0.rawh new file mode 100644 index 0000000..3a3cc12 --- /dev/null +++ b/screens/mainscreen/images/0.rawh @@ -0,0 +1,31 @@ +/*('file properties: ', 'resolution ', 240, 'x', 240, 'format ', 'COMPRESSED_RGBA_ASTC_8x8_KHR', 'stride ', 480, ' total size ', 14400)*/ +72,193,110,166,169,106,65,2,21,248,205,155,240,11,208,2,8,3,19,183,105,99,7,94,248,165,109,0,138,130,134,100,40,41,124,64,27,83,89,184,247,121,217,11,123,104,21,137,68,141,14,204,187,221,249,167,126,86,117,129,225,193,96,1,8,3,39,61,125,83,206,149,252,185,118,94,188,99,47,149,40,1,35,143,24,69,157,186,130,40,52,128,15,170,168,132,254,0,175,58,110,198,2,25,64,99,236,169,214,234,27,191,211,1,179,164,77,69,2,178,72,66,160,82,83,248,0,81,98,249,102,192,111,110,84,221,146,136,65,225,18,72,234,200,254,192,156,211,39,143,78,166,85,225,82,122,89,174,121,138,84,195,176,222,143,0,0,0,13,88,133,160,220,97,189,137,102,0,107,169,233,46,184,130,138,234,208,1,167,124,73,153,242,1,3,14,181,148,210,166,143,213,86,73,104,70,9,213,242,1,163,92,186,6,130,52,176,47,128,167,45,60,160,136,52,3,15,121,232,78,13,160,1,9,128,74,57,49,13,183,52,3,111,217,233,74,145,235,17,1,195,128,167,90,96,234,84,201,180,132,191,254,172,1,115,125,92,55,99,31,49,170,40,1,7,175,88,165,37,194,169,16,22,74,245,5,124,10,84,195,38,173,18,45,176,0,157,0,28,8,236,45,243,117,84,3,79,231,83,108,124,111,63,157,94,117,199,233,133,157,227,1,71,165,89,78,108,94,116,21,192,24,67,64,225,105,84,195,112,222,142,13,172,33,93,161,115,93,227,255,116,107,121,40,145,242,190,181,125,5,205,229,157,99,219,113,153,106,227,1,139,229,178,49,208,148,3,2,250,207,188,68,177,2,40,1,47,140,56,247,215,125,189,231,105,189,22,7,100,41,209,25,245,228,212,171,101,110,187,69,96,108,159,79,189,124,227,1,7,147,121,187,165,73,234,57,168,117,114,229,254,174,111,0,99,20,245,205,217,95,124,27,189,147,247,191,191,215,8,3,15,29,63,165,42,165,170,170,167,241,5,221,221,251,254,0,147,78,145,78,57,119,106,237,83,91,212,20,37,69, +253,200,45,236,252,125,235,189,25,157,216,161,124,219,19,199,20,5,91,164,43,251,115,86,254,127,127,122,122,187,255,127,68,139,108,236,45,181,63,189,90,247,239,231,246,60,157,254,223,192,106,213,57,246,45,235,187,236,253,142,181,251,186,183,52,197,40,173,85,119,115,127,117,111,191,191,50,119,255,127,24,1,23,175,62,199,123,111,63,127,158,224,218,243,243,250,242,1,171,46,213,14,230,159,125,233,62,255,214,251,46,71,68,137,18,131,3,86,239,254,151,129,159,239,199,227,185,188,101,8,14,76,131,187,9,251,247,234,226,252,252,198,160,69,52,1,145,130,101,3,107,163,45,109,168,145,69,199,249,114,225,9,177,41,155,109,200,164,136,42,27,33,80,192,133,14,117,8,25,108,221,235,159,179,111,156,20,37,46,168,133,173,20,41,129,178,177,52,237,231,2,173,28,157,171,106,69,197,40,1,47,174,57,245,39,254,34,191,194,247,255,255,203,255,12,1,0,127,121,94,222,91,189,107,101,45,191,196,250,12,122,0,28,119,41,233,97,214,208,15,119,221,223,247,93,250,40,193,222,143,102,1,168,128,144,16,161,98,26,5,181,169,20,45,96,224,216,174,96,141,249,114,96,7,47,46,131,167,242,1,151,30,83,212,18,151,223,129,175,47,217,125,226,124,223,0,163,140,77,213,182,107,219,165,216,10,189,164,30,104,8,3,135,141,59,149,250,11,156,0,31,114,43,254,166,125,221,72,251,97,208,192,213,73,3,85,241,79,122,87,127,119,68,77,178,210,251,110,226,15,255,239,239,255,255,255,137,27,74,40,252,196,221,246,115,139,149,183,87,80,107,109,60,62,97,241,102,205,208,150,103,139,77,67,71,45,192,32,202,113,237,136,200,73,27,32,241,160,229,166,232,128,128,16,32,70,24,1,43,182,109,163,16,0,20,130,139,170,139,218,146,239,66,169,236,33,101,201,202,16,177,18,122,245,127,223,42,38,93,4,255,111,190,99,141,8,223,111,218,70,201,113,189,248,4,51,78,172,183,238,255,127,250,119,209,99,24,67,64,88, +52,197,170,181,81,191,113,57,183,96,35,233,14,92,134,248,242,1,11,42,189,20,164,30,80,55,81,168,243,185,124,235,24,1,7,30,60,115,80,184,17,255,225,211,26,168,108,60,84,195,234,205,145,194,85,1,57,84,33,52,1,238,104,199,8,3,43,143,25,7,136,32,24,75,57,136,211,182,100,143,84,1,119,250,225,141,9,140,173,85,39,127,171,80,7,216,242,1,245,147,79,149,186,220,81,52,37,108,232,106,151,247,102,0,43,153,167,50,125,5,183,123,15,104,66,63,106,13,194,73,123,85,117,19,39,233,12,96,67,32,108,139,190,9,52,137,31,241,39,238,221,91,12,57,168,99,249,194,169,106,52,3,43,89,153,102,194,157,100,88,1,56,0,15,192,0,52,197,162,140,148,33,44,69,138,241,12,161,76,165,49,15,117,136,64,108,255,157,221,163,172,44,44,177,109,207,181,117,226,73,147,68,159,206,125,34,230,242,106,5,34,41,80,166,84,195,234,197,17,40,0,0,0,8,0,148,1,248,113,201,8,105,246,242,48,179,24,205,75,29,186,173,186,21,156,128,241,9,28,195,34,197,76,151,143,249,92,1,108,141,253,36,242,1,143,56,214,204,198,170,249,10,127,40,43,112,41,1,242,72,107,44,222,206,172,189,210,111,205,18,100,245,125,223,40,1,163,140,77,87,88,38,149,229,130,165,240,8,104,0,8,5,112,231,37,103,226,57,110,125,174,183,234,129,160,169,52,209,80,128,213,135,231,165,171,205,152,72,101,12,192,165,117,40,215,242,121,253,248,5,37,234,88,86,159,189,189,129,52,235,61,0,222,118,41,174,1,220,168,141,243,207,124,200,8,3,51,140,25,87,5,162,142,112,246,183,94,120,5,85,52,197,40,181,148,147,108,221,237,236,184,95,146,255,90,3,52,197,230,172,85,101,21,117,60,221,140,234,91,54,229,223,106,0,233,161,170,50,98,29,216,1,159,210,11,136,192,4,8,197,178,163,9,85,65,85,80,169,213,88,55,94,231,251,8,3,55,183,13,245,15,190,136,147,9,246,128,146,32,150, +209,185,244,240,54,47,85,74,205,5,236,51,105,34,159,131,36,125,51,192,171,190,251,245,109,143,109,123,124,126,126,126,8,195,170,213,121,241,199,246,65,252,185,95,221,175,241,101,84,195,48,206,151,173,172,99,173,61,173,161,237,96,172,129,52,5,91,227,83,247,191,112,252,116,139,189,145,31,236,65,84,1,123,168,83,219,169,88,133,249,116,102,55,115,123,127,36,41,116,195,151,142,234,143,224,62,35,4,2,0,128,130,20,5,89,193,147,203,21,234,150,197,109,172,171,173,173,175,84,41,145,178,159,117,169,129,5,96,30,53,174,230,245,172,253,168,129,164,55,227,191,119,139,164,169,171,172,156,110,173,97,49,78,108,93,123,117,239,188,172,251,92,61,195,89,49,227,193,122,231,237,255,102,111,243,250,238,236,55,171,221,94,254,192,218,234,115,26,16,8,143,105,227,148,168,100,10,92,110,40,215,114,150,97,219,132,1,180,128,134,106,142,18,24,8,5,118,99,29,151,171,72,168,169,113,86,5,214,8,71,8,195,162,179,106,146,253,225,79,246,63,143,119,67,255,212,77,2,239,188,51,67,147,140,178,56,99,239,226,89,230,175,68,53,122,96,75,223,214,22,252,185,91,243,99,11,19,51,242,193,180,89,110,27,226,60,243,175,146,104,88,90,153,82,40,193,222,175,54,82,221,213,193,181,105,87,117,149,65,86,8,195,230,179,184,250,255,93,207,251,221,247,213,255,253,223,242,193,190,223,48,218,110,228,26,7,253,223,162,87,32,239,84,3,44,133,129,172,141,157,168,248,80,15,188,188,111,192,223,0,47,157,57,85,96,35,36,129,16,34,252,219,183,255,40,1,47,140,57,135,240,147,245,199,175,244,123,255,255,255,106,136,19,224,45,155,70,154,66,6,164,169,58,170,43,144,239,0,7,165,58,90,150,250,22,132,66,3,88,8,105,101,52,5,203,245,151,4,194,32,14,95,91,253,117,252,255,87,121,104,133,228,43,167,250,143,173,173,165,235,181,109,109,33,52,3,79,117,105,75,51,83,7,33,160,45,33,97,93,127, +84,1,27,123,33,203,217,15,253,192,165,160,16,69,175,92,40,1,39,62,28,245,169,181,46,224,54,128,5,36,152,161,254,0,47,122,121,148,176,10,149,36,76,178,170,10,41,75,24,1,55,30,60,99,74,181,194,100,183,200,175,36,37,145,40,1,37,61,94,17,128,73,0,7,130,37,154,154,170,114,8,195,250,219,250,39,130,97,106,145,155,72,121,240,37,88,40,1,55,30,92,5,83,1,244,2,80,10,240,8,128,33,20,43,74,81,127,183,105,9,130,172,10,158,148,106,238,124,8,3,63,46,124,245,163,63,246,184,136,132,34,10,154,6,52,197,228,164,146,147,108,165,203,117,167,25,46,97,220,0,20,233,117,12,202,73,115,222,13,162,100,11,29,43,63,45,8,195,222,235,132,135,42,106,52,142,161,128,8,104,208,136,40,1,35,183,72,149,117,218,10,37,96,74,137,116,0,141,40,1,15,14,109,161,126,137,159,120,167,118,106,132,166,175,40,1,7,45,57,115,107,150,156,97,169,121,114,37,149,242,12,193,218,157,36,97,147,78,247,118,189,11,107,65,67,109,194,4,35,91,91,134,127,87,26,114,151,35,255,183,146,138,8,233,157,36,151,119,143,201,41,111,148,5,146,46,185,71,52,197,172,181,23,204,22,77,85,142,207,43,157,101,139,125,66,41,27,99,210,118,253,236,173,129,94,181,69,21,90,222,40,1,147,180,159,7,84,130,147,184,17,187,117,217,153,93,52,73,249,242,189,254,190,96,168,173,37,175,79,111,162,237,40,1,61,11,94,83,87,239,157,29,85,233,152,4,106,168,8,3,31,61,59,167,168,173,186,145,90,170,137,153,104,193,222,168,129,36,106,41,171,99,222,231,200,233,98,231,113,250,68,75,42,108,219,187,252,255,88,190,252,159,255,95,175,87,68,245,198,194,244,237,159,10,124,120,249,238,191,159,254,252,24,1,11,37,107,55,234,255,222,195,2,168,173,74,153,146,36,41,121,236,200,180,70,199,228,115,219,255,255,247,207,127,24,1,69,72,240,226,255,209,230,23,193,11,253,30,188,95, +52,197,112,206,148,141,175,29,88,56,127,177,115,87,252,218,84,195,48,206,24,156,154,87,127,119,127,95,191,115,61,127,52,197,48,206,87,20,41,161,147,173,171,149,149,29,109,171,102,0,239,186,237,70,85,85,85,213,77,213,131,37,105,85,24,1,51,22,110,1,18,5,86,130,26,56,15,248,0,223,40,1,47,157,30,7,28,219,3,180,105,255,141,255,167,253,40,1,7,30,59,213,46,106,162,107,73,174,196,95,165,117,40,1,7,30,59,215,215,249,159,115,151,119,121,87,116,134,20,5,87,186,155,139,177,97,37,91,88,71,41,132,46,242,127,0,71,147,26,177,154,252,55,247,221,247,238,141,183,74,8,195,150,173,167,153,53,253,82,70,201,171,209,148,71,202,254,0,147,88,89,212,34,62,192,43,178,189,238,223,180,187,106,192,58,67,203,159,70,73,54,229,177,173,215,213,93,217,95,0,235,249,177,74,94,193,234,254,221,190,196,149,236,56,227,193,240,181,18,112,127,144,61,17,244,175,247,55,253,218,24,193,30,207,233,122,170,243,120,252,143,247,155,186,0,219,98,41,145,242,125,217,146,116,81,91,85,223,128,163,38,170,52,197,230,148,23,235,113,139,187,179,152,129,47,236,223,117,12,1,202,138,121,251,223,109,122,201,180,91,166,101,222,54,113,201,101,236,247,53,215,108,201,205,162,163,39,171,187,91,99,1,23,184,213,77,125,166,190,150,208,66,93,138,223,219,99,1,27,84,149,230,72,205,43,41,49,165,165,156,151,146,241,105,65,67,67,71,107,119,153,127,235,61,57,178,175,163,127,0,7,147,90,140,86,153,10,62,37,187,18,236,195,46,52,3,23,253,232,199,89,165,237,224,67,79,181,194,87,103,102,0,49,161,135,58,255,139,255,129,232,33,42,252,10,244,52,3,103,112,196,99,75,178,146,103,141,7,149,53,140,142,194,137,64,3,69,201,106,119,141,203,97,118,106,131,175,126,40,1,187,164,77,7,254,67,235,180,65,65,90,98,133,154,52,5,139,247,75,113,71,253,115,124,238,178,236,220,87,187, +40,1,15,30,28,101,86,233,87,125,31,25,154,33,118,162,84,3,79,231,147,172,160,81,32,195,80,1,24,161,175,237,106,0,111,169,168,54,22,144,144,2,146,160,150,99,175,149,253,104,13,67,5,9,75,183,147,154,186,253,196,237,156,36,36,145,48,195,217,100,243,221,238,118,168,28,87,135,38,30,40,1,241,225,179,165,102,46,105,39,105,190,232,139,119,116,84,1,111,122,27,139,73,61,115,57,96,38,48,8,5,160,36,107,133,193,2,199,172,232,38,15,22,131,195,164,93,143,8,3,7,61,59,197,165,52,5,122,64,11,120,130,92,98,239,192,176,222,42,208,36,210,82,30,218,84,90,98,32,105,254,0,15,58,213,84,204,153,80,45,210,144,139,36,37,19,52,3,63,241,121,195,172,81,13,75,92,3,112,12,46,97,84,195,228,172,147,13,175,141,43,5,53,160,131,33,8,234,206,176,197,194,190,123,86,109,11,194,209,255,3,43,20,170,52,3,103,62,156,118,173,143,234,236,79,95,111,171,166,5,226,1,23,198,72,61,243,84,169,21,106,242,146,79,90,116,40,1,51,140,190,23,213,147,127,213,87,125,213,87,125,189,52,49,4,224,213,215,153,165,106,25,152,137,35,254,55,90,8,195,138,197,195,91,168,29,250,133,127,224,223,247,253,221,242,1,147,76,153,14,235,243,125,250,183,92,208,48,168,74,239,0,41,12,39,105,47,124,77,184,149,164,210,68,211,40,20,249,83,0,247,200,171,119,91,59,191,63,242,186,50,219,40,1,43,21,46,115,255,3,255,10,254,10,221,7,254,45,8,3,139,151,171,247,191,255,238,255,249,31,244,129,45,64,68,21,22,224,44,247,181,15,242,191,63,254,254,247,115,127,8,3,43,183,143,115,73,255,240,39,222,13,237,230,111,254,40,1,85,120,249,34,86,29,80,125,192,247,240,63,124,3,117,8,25,245,191,29,203,4,40,144,1,13,232,64,56,109,117,16,111,32,157,107,240,38,32,248,107,207,123,226,123,51,20,43,155,114,150,170,149,144,93,169,72,160,162,253,159,118, +40,1,187,181,63,247,76,231,255,254,189,254,247,87,220,105,226,209,44,64,238,143,222,252,171,111,54,148,255,180,87,245,84,3,131,243,17,128,5,101,104,6,141,168,171,173,171,173,78,72,51,117,149,238,3,154,124,2,219,215,62,123,216,210,8,3,27,143,56,7,253,96,93,196,63,148,13,95,147,173,4,171,108,208,11,147,231,170,29,171,23,115,8,227,16,128,20,5,119,114,155,155,107,108,181,203,117,17,184,196,17,51,8,3,23,61,91,99,165,94,39,217,199,253,217,87,124,197,52,3,95,244,165,99,114,89,249,127,127,191,115,150,63,117,52,3,15,249,216,98,42,109,39,95,116,139,235,158,151,44,111,0,87,180,149,205,21,95,198,187,83,233,19,152,121,212,52,197,98,156,18,81,184,115,216,248,115,103,191,90,254,127,106,0,235,160,165,46,93,248,98,163,70,133,31,198,17,158,254,0,11,106,221,140,220,46,248,67,222,144,63,246,127,125,106,192,74,207,83,165,125,220,87,190,243,149,77,123,246,221,40,1,15,159,56,213,75,193,15,34,221,2,253,9,252,7,77,2,237,168,199,38,53,220,95,48,173,38,155,76,163,137,52,197,108,181,88,187,115,93,185,245,152,201,159,219,183,127,209,41,44,181,86,187,237,169,41,55,0,48,96,81,5,90,8,3,187,164,77,71,5,58,245,93,117,86,85,2,5,224,126,0,159,162,216,80,99,172,84,115,23,167,117,133,61,187,20,203,129,196,182,171,253,136,44,55,91,116,104,81,70,56,24,1,15,14,28,215,5,241,131,172,64,50,88,244,20,216,20,43,131,114,206,253,92,161,163,45,152,145,168,160,141,142,85,168,34,67,242,11,215,51,183,40,112,179,59,203,224,121,24,1,147,140,109,165,18,206,68,66,35,193,133,114,130,67,72,193,166,163,137,168,214,210,160,96,11,18,63,42,7,0,254,0,171,106,82,134,138,218,49,127,74,64,5,86,17,137,52,197,48,198,146,155,236,185,117,136,135,168,227,73,15,160,98,137,87,113,237,169,189,59,25,98,124,240,127,79,79,221, +40,193,50,181,7,167,130,138,210,102,105,134,183,196,133,167,118,192,82,215,240,172,170,232,85,230,224,211,36,94,10,95,40,1,35,45,92,37,180,40,8,170,128,160,160,124,126,164,8,3,7,62,92,245,152,199,24,13,157,176,74,1,93,202,111,0,197,204,22,83,160,18,208,220,130,26,10,2,68,37,8,3,179,148,110,7,18,226,9,145,52,243,120,205,7,61,8,3,51,167,13,39,21,64,149,159,160,171,104,37,160,9,52,197,164,164,19,50,218,151,113,239,197,65,33,132,32,11,242,1,55,110,209,212,222,213,111,189,39,191,248,101,2,221,40,1,15,30,60,117,187,125,121,246,181,142,37,38,154,248,117,8,117,108,221,200,187,147,61,63,200,113,164,80,5,107,242,1,23,92,50,6,0,37,16,117,224,41,48,18,137,133,24,1,27,183,25,229,89,124,5,61,192,73,144,32,6,144,254,0,135,88,82,78,120,149,90,181,94,151,92,227,150,111,194,232,51,99,122,242,191,190,109,175,141,31,254,251,239,223,52,3,11,213,152,238,178,116,167,95,107,94,119,187,255,118,106,0,175,170,172,66,239,119,237,149,93,69,37,153,82,166,226,136,39,108,118,217,154,85,213,26,92,120,94,85,228,90,117,136,136,242,127,189,250,29,180,47,125,117,183,205,127,245,52,3,47,118,221,226,115,207,182,197,127,95,255,118,55,115,121,208,172,104,203,247,155,129,155,236,158,186,242,191,189,125,102,0,233,153,169,62,86,18,64,149,3,85,245,109,89,87,8,197,170,186,42,161,162,170,136,42,162,250,168,62,90,143,238,136,213,178,68,236,10,76,243,252,91,255,252,223,93,245,254,0,3,11,150,214,198,217,229,190,25,31,208,7,246,48,238,72,251,50,68,184,41,184,218,99,55,215,237,83,135,86,68,107,11,172,173,189,142,57,156,16,137,13,182,211,251,96,72,193,178,179,82,255,6,184,210,2,244,159,93,255,245,255,68,75,42,108,238,109,174,181,220,61,62,121,154,61,95,175,226,72,19,35,168,210,237,66,166,227,15,15,38,228,231,157, +111,0,147,21,206,228,229,201,128,217,208,107,64,107,107,45,68,139,43,172,105,165,153,173,205,255,191,92,28,158,133,135,52,3,243,179,191,250,171,255,191,117,80,163,248,202,178,81,20,5,163,244,246,169,69,47,188,139,202,226,204,16,110,113,84,195,176,181,22,73,187,114,94,221,70,115,86,150,56,114,84,1,103,245,242,201,43,127,113,191,179,114,144,179,129,127,40,1,19,143,24,117,223,121,125,176,125,194,101,130,170,2,20,5,39,47,121,235,1,11,7,75,195,59,207,117,88,124,20,5,39,36,99,139,53,127,235,253,118,80,56,195,152,64,84,195,230,172,82,5,114,5,85,7,111,174,105,161,180,97,24,1,31,60,91,179,231,235,217,183,220,216,14,227,151,249,254,0,151,40,89,134,224,41,234,195,222,208,43,124,165,204,106,0,37,145,134,54,253,82,175,247,226,173,125,248,205,119,106,0,103,145,103,54,254,231,143,61,215,169,23,86,225,45,254,0,11,108,213,84,22,157,197,103,247,185,125,50,111,207,52,3,31,125,137,227,116,70,191,115,185,63,117,71,114,96,52,3,27,93,153,106,128,57,237,149,176,83,254,179,123,239,106,0,177,185,232,50,91,29,117,216,101,121,131,43,120,66,24,1,51,151,24,87,230,245,184,60,31,228,74,185,162,71,8,3,7,13,27,181,10,167,232,195,153,96,120,170,158,100,121,232,99,76,239,188,187,241,148,4,4,4,160,21,229,191,84,1,31,178,225,201,193,117,57,219,43,27,231,255,161,195,12,193,186,189,128,214,34,146,149,102,209,184,83,64,169,46,84,1,63,169,219,94,69,5,160,1,255,173,141,168,168,95,77,2,251,200,72,47,145,128,32,192,51,220,142,129,236,54,40,1,31,47,92,85,87,36,38,153,72,9,151,161,43,93,52,197,48,214,142,53,175,175,158,152,5,43,108,145,135,203,40,1,59,167,24,135,85,225,237,120,69,237,15,136,103,175,127,0,105,44,151,211,249,105,18,179,136,140,182,1,236,42,84,195,104,181,82,95,52,116,65,127,162,88,57,118,237,63, +8,3,47,173,57,229,169,117,231,252,170,141,93,0,8,160,40,1,23,175,56,181,8,10,47,218,1,106,44,104,231,198,52,197,106,173,18,96,143,142,201,36,201,69,160,29,156,130,8,3,27,29,92,165,150,129,25,24,98,34,253,226,39,61,8,3,37,61,59,163,216,10,45,248,24,95,128,191,234,107,8,3,51,22,78,65,153,120,52,61,79,154,74,65,42,168,24,193,94,175,198,215,81,92,189,61,95,253,217,125,161,159,223,0,51,36,59,5,222,64,68,64,4,9,129,37,84,132,242,136,3,131,74,167,155,141,208,123,143,178,38,174,124,50,254,0,39,43,90,14,124,179,79,215,207,231,245,253,180,22,121,248,78,32,151,213,29,89,191,51,36,109,158,152,232,64,24,1,179,148,25,7,228,34,184,175,222,229,220,57,125,121,40,1,27,142,56,103,85,118,5,223,245,95,223,247,73,93,52,3,91,90,157,246,91,217,197,172,31,157,173,172,237,45,111,0,119,58,233,98,125,239,251,243,126,27,238,7,245,75,95,0,7,206,229,72,125,123,176,61,235,183,126,189,212,74,36,43,44,113,126,89,254,109,91,91,128,48,128,163,152,44,8,3,135,158,190,37,224,10,150,104,170,23,157,101,166,219,52,3,87,222,249,126,114,85,203,191,108,221,236,195,95,150,24,193,226,179,168,246,14,189,127,92,30,248,117,62,49,95,52,3,75,122,140,238,113,115,67,127,176,235,84,95,88,37,84,3,199,245,147,168,237,121,191,90,159,249,255,169,121,109,20,5,157,219,47,174,115,113,93,119,127,247,124,249,191,113,84,1,27,171,227,219,117,113,127,93,89,253,112,84,255,155,38,16,196,230,212,30,179,131,159,46,4,87,211,157,111,171,40,1,43,157,95,87,255,215,119,253,250,143,113,218,16,87,253,8,158,33,16,137,135,247,10,116,152,112,97,71,57,248,195,8,53,53,68,172,192,132,227,32,135,54,80,40,164,177,193,109,163,114,191,150,223,58,38,255,255,255,255,255,252,15,68,205,225,100,142,238,60,157,127,251,63,62,255,239,255,255, +4,213,255,42,165,28,147,236,149,136,255,231,123,254,255,255,68,11,224,164,52,58,142,233,137,207,223,255,255,244,219,220,40,1,75,213,174,101,255,171,255,130,189,2,174,161,138,138,77,204,23,35,169,180,185,82,230,164,255,63,62,63,255,252,68,85,209,34,231,249,242,8,159,207,229,240,224,193,135,31,20,5,7,54,123,219,117,123,111,120,185,252,237,254,53,125,68,173,55,108,220,181,153,56,252,249,250,200,217,156,59,243,68,109,133,164,206,187,234,133,127,127,187,247,109,28,62,126,8,3,147,140,63,183,255,214,47,255,68,45,124,215,245,159,52,197,116,206,149,229,140,169,21,171,28,246,30,137,39,172,36,153,157,248,152,144,85,147,87,29,40,173,241,245,255,249,8,197,170,179,149,89,42,69,146,46,177,88,141,185,99,14,40,1,77,90,244,97,96,135,91,104,148,57,109,111,83,167,125,40,215,193,101,71,43,39,73,11,179,90,113,120,248,235,24,1,47,140,24,231,27,240,119,252,247,252,93,36,165,129,24,1,11,183,13,213,107,87,63,237,54,232,250,86,188,5,106,0,233,160,165,50,157,251,89,231,49,23,85,212,177,165,8,3,47,140,25,151,92,138,175,224,3,10,222,64,15,176,221,104,136,97,115,219,240,198,163,255,17,177,237,50,10,2,227,1,7,165,186,4,132,6,20,86,211,82,242,188,30,177,253,136,8,99,99,137,203,14,147,137,39,58,252,187,83,157,40,1,7,14,28,117,164,36,10,241,218,47,39,64,11,248,8,3,35,14,28,133,255,240,15,212,9,157,128,59,232,33,40,1,55,53,27,83,34,149,242,40,148,210,45,200,105,215,8,3,51,167,57,215,114,37,68,11,0,2,39,130,169,98,20,5,51,100,51,155,99,5,133,1,11,16,164,234,160,0,40,1,27,15,60,101,22,244,10,209,201,163,184,92,37,99,194,4,141,50,118,134,132,42,109,0,18,136,32,197,255,170,84,195,226,164,17,0,172,129,116,16,164,51,65,166,165,175,20,107,139,242,157,251,62,0,5,172,68,225,219,235,80,8, +242,1,35,30,82,20,172,254,157,102,43,170,173,4,39,144,52,105,139,242,157,122,62,144,0,39,8,184,50,9,13,232,52,197,38,181,145,248,191,220,84,60,235,164,129,173,172,13,113,145,157,230,218,239,213,246,177,40,63,182,24,7,43,104,68,77,210,210,190,103,246,13,141,9,3,12,27,96,16,49,84,1,15,253,48,249,107,157,189,186,237,109,173,131,27,144,52,171,22,96,98,151,197,4,7,135,154,41,98,132,135,172,20,107,212,178,181,154,94,160,31,236,14,151,207,131,186,235,36,153,149,230,48,215,253,15,53,147,194,241,113,152,174,107,254,0,121,166,224,81,108,36,15,197,99,145,88,34,86,73,121,40,252,178,110,243,250,25,161,161,144,232,48,113,119,115,36,235,64,81,223,121,153,239,251,94,62,237,249,29,254,253,227,193,122,247,47,180,33,174,194,211,79,86,232,53,125,220,24,193,46,213,234,39,81,115,252,188,43,239,227,239,251,86,40,1,35,15,28,119,186,86,162,87,137,95,117,93,21,245,206,104,68,172,238,37,239,165,122,210,221,71,191,124,125,254,24,1,179,181,190,117,61,117,78,145,90,241,170,178,0,81,40,1,135,140,31,167,249,25,249,113,41,213,113,219,127,85,68,235,13,181,119,153,77,77,17,60,127,71,1,107,55,128,8,3,155,156,63,183,192,29,183,120,98,57,165,188,218,155,40,1,85,219,240,147,117,181,95,255,211,245,87,254,7,30,36,241,20,108,228,164,211,90,157,47,199,32,140,229,234,227,4,177,189,134,225,222,49,134,120,143,129,226,255,95,99,40,36,41,76,99,145,71,122,54,138,241,226,97,24,142,127,255,74,136,14,172,205,197,170,90,255,247,245,217,228,4,36,90,68,203,197,228,93,24,134,197,136,253,245,231,229,94,255,254,238,8,158,178,205,149,47,252,223,188,127,250,143,239,24,132,106,0,59,187,140,62,243,95,127,243,187,159,253,222,17,119,125,40,87,117,247,30,20,104,216,4,203,116,92,70,56,248,20,5,227,228,54,187,117,119,255,191,127,127,127,112,103,56, +52,3,141,101,122,223,109,237,117,175,122,51,114,134,191,80,52,73,251,242,156,122,157,144,68,248,112,78,187,127,127,117,52,3,19,146,156,120,50,127,116,87,121,63,127,119,127,127,8,3,11,7,44,39,152,10,182,130,175,240,43,255,90,123,4,117,199,226,28,103,83,162,41,10,223,255,63,231,187,203,68,107,163,50,242,88,23,203,8,236,207,255,255,63,63,190,72,1,22,70,255,255,255,255,255,251,255,227,255,255,255,159,69,232,250,33,242,177,140,37,221,121,206,89,255,255,159,255,113,49,159,102,214,31,153,82,155,44,184,120,121,255,127,127,226,41,202,68,85,143,105,254,255,253,127,252,175,250,99,219,8,169,244,164,152,85,149,112,143,247,77,223,189,255,253,103,241,73,105,195,71,41,109,153,145,231,57,180,40,102,15,127,242,1,23,30,213,148,57,63,113,31,20,255,175,90,127,247,20,3,215,29,237,137,10,83,184,57,248,193,91,202,176,80,8,3,7,29,59,179,73,173,123,80,133,168,105,249,239,253,40,1,151,44,60,167,191,228,247,79,199,169,89,42,101,130,125,136,142,225,66,231,172,131,137,13,192,72,155,111,134,133,8,3,85,120,241,2,128,142,216,139,32,226,41,104,170,146,126,232,129,114,95,122,77,20,108,148,79,219,205,144,42,136,8,3,59,135,110,103,153,237,65,23,210,34,8,6,104,16,24,1,7,143,13,37,2,33,144,8,210,177,157,116,117,159,68,109,5,236,220,28,117,29,114,193,155,62,172,147,33,92,24,1,23,29,60,99,60,99,236,233,161,10,105,68,22,8,106,0,231,144,102,50,249,12,209,96,133,77,31,87,188,117,8,3,59,38,78,33,98,34,148,98,133,39,71,96,9,198,20,43,137,242,222,63,22,1,57,52,165,116,97,41,132,153,52,3,11,241,216,102,52,156,171,124,196,135,143,88,229,100,24,1,15,45,59,35,86,99,6,108,113,10,237,52,158,149,254,0,143,58,246,70,80,106,67,96,68,34,6,108,15,189,40,1,69,219,208,3,74,2,244,66,94,125,8,254,2,20, +24,1,163,140,77,215,7,125,19,190,91,247,10,251,171,0,72,1,48,163,149,41,37,213,73,118,241,31,189,156,214,109,52,107,11,160,217,121,173,12,46,161,64,4,133,254,154,113,8,3,7,15,28,119,253,213,199,213,182,247,7,87,82,7,52,107,80,192,225,86,237,223,90,46,57,226,180,85,235,111,174,152,211,70,151,79,117,247,82,158,66,153,212,195,85,212,242,1,151,92,50,86,42,21,203,165,40,185,43,167,248,247,20,49,222,98,79,191,157,81,130,205,37,10,52,50,224,169,20,179,97,160,118,150,213,22,98,114,236,119,95,235,151,43,117,72,163,178,171,229,232,9,81,12,138,129,202,227,187,116,254,0,213,162,105,211,52,21,75,198,241,57,221,81,159,220,24,1,43,182,47,211,190,156,253,82,158,186,44,122,1,203,24,1,51,23,28,231,252,134,43,197,173,10,86,104,133,154,8,3,51,22,27,231,89,61,86,171,231,211,87,101,88,93,8,3,7,30,60,7,95,226,167,248,41,60,154,137,175,236,84,3,143,231,147,112,111,239,202,81,255,191,104,125,179,173,68,171,108,85,85,21,233,42,17,128,3,134,88,176,208,233,242,1,19,40,221,14,224,40,219,239,102,198,85,113,170,89,66,233,195,161,165,167,113,148,210,18,95,242,7,47,180,112,24,1,51,52,58,23,112,1,74,202,165,102,143,235,125,122,36,41,27,48,189,60,217,156,122,189,214,225,245,123,28,142,4,139,147,169,102,199,233,162,37,107,193,255,255,191,159,110,36,149,185,104,164,79,51,226,129,250,251,187,219,251,255,255,68,3,233,109,233,137,233,171,1,255,255,255,255,255,207,239,8,195,198,163,241,196,239,114,109,252,199,223,245,215,125,125,20,205,14,96,137,55,228,119,154,158,255,127,127,255,127,119,4,219,28,224,172,183,235,209,112,251,222,255,101,251,248,190,75,192,6,131,177,100,10,233,41,33,173,231,190,222,62,210,194,105,5,44,73,177,88,165,90,255,55,249,191,218,247,11,117,144,49,160,10,107,232,7,127,127,127,127,127,249,127,95, +68,13,158,114,175,125,88,17,255,255,253,207,223,243,131,129,24,193,78,175,233,122,202,188,35,221,158,234,237,166,149,71,99,1,141,193,43,123,200,111,45,243,49,47,187,246,32,151,4,147,176,74,91,170,105,255,92,103,34,14,61,254,142,243,90,0,55,26,91,185,243,248,249,126,222,198,199,63,55,201,226,136,14,176,254,62,191,103,41,79,224,14,198,240,192,47,8,3,11,215,172,87,69,213,17,127,253,223,255,255,255,255,226,16,189,108,79,175,159,216,41,104,253,241,39,127,209,215,113,137,56,99,202,146,205,251,172,134,57,51,203,42,116,116,98,4,215,217,51,14,80,212,178,214,187,82,185,155,185,247,52,3,55,90,184,234,108,123,191,127,81,124,57,50,88,64,125,136,136,225,2,231,140,101,73,17,228,76,74,92,82,117,99,1,27,216,181,199,233,62,130,44,25,8,82,108,53,62,8,3,27,55,110,209,137,158,232,70,0,40,210,8,104,64,98,233,27,99,249,96,219,255,88,65,45,177,120,26,89,75,40,1,23,159,56,227,150,132,145,253,181,218,71,137,106,160,24,1,55,40,123,117,52,137,199,150,162,254,13,115,228,119,20,5,59,170,155,155,203,85,182,135,104,70,68,33,128,136,8,3,51,151,45,85,68,57,109,135,238,226,5,117,90,187,227,193,104,181,237,229,233,16,62,98,181,165,127,163,126,69,8,3,15,15,28,101,103,181,233,79,252,216,47,225,84,224,52,3,95,124,229,195,202,178,88,165,162,137,43,146,231,68,115,193,54,239,138,72,202,26,105,47,236,50,250,141,212,6,36,85,220,226,255,234,191,236,9,148,91,100,208,190,67,0,20,43,87,49,103,179,233,137,163,47,168,37,183,225,135,8,114,137,152,68,229,196,84,150,144,101,160,208,126,172,8,135,8,3,19,142,56,165,158,217,143,155,2,159,242,66,47,80,52,3,91,217,169,102,1,37,136,189,85,159,189,158,75,205,84,3,143,245,18,161,0,173,71,47,65,9,164,16,41,15,102,0,231,153,168,54,81,10,138,143,24,124,3,87,0,2, +52,145,100,96,214,132,29,4,205,237,18,219,172,247,17,23,36,253,72,224,232,230,254,221,92,251,94,199,10,134,223,85,35,137,25,35,47,219,106,124,48,90,55,141,243,123,33,108,36,245,230,228,213,255,213,204,34,227,243,225,247,126,235,231,243,0,87,77,221,218,210,210,47,75,6,101,10,162,44,136,20,5,79,62,179,231,161,43,173,169,229,109,172,184,179,220,102,0,39,154,170,66,85,253,85,255,241,223,85,90,85,88,8,3,31,191,62,199,85,85,85,87,99,117,94,63,247,127,24,1,31,62,62,243,70,119,87,178,175,251,237,254,124,124,52,197,98,164,85,191,114,255,63,91,59,114,109,252,115,93,114,1,85,55,247,130,79,149,200,5,111,240,175,249,218,223,40,1,39,62,62,115,188,93,138,125,151,213,80,220,121,218,227,1,7,243,89,106,84,105,224,57,104,98,235,233,105,103,40,1,155,164,207,151,15,20,29,191,239,111,50,59,252,11,121,232,13,108,237,197,238,116,245,131,93,87,98,109,100,88,239,0,12,207,161,73,46,121,79,73,86,91,93,233,37,229,8,3,7,14,60,215,247,249,77,124,190,47,223,224,15,148,225,2,77,88,240,2,216,236,134,221,109,155,157,135,78,62,111,0,67,188,164,98,108,222,25,79,190,195,174,234,174,204,254,0,23,90,184,20,106,139,58,32,47,200,175,220,114,239,238,136,142,100,103,182,84,210,49,223,243,95,255,249,223,255,40,1,51,21,77,101,106,99,130,130,217,2,249,3,253,7,4,43,14,35,234,185,141,197,177,127,99,249,252,223,223,125,162,169,87,107,72,43,218,121,89,99,164,117,119,253,141,152,125,168,32,108,50,206,179,102,59,149,159,123,187,255,179,225,114,136,23,149,239,205,187,222,59,243,72,177,154,90,23,76,40,1,131,166,111,55,93,225,117,82,55,117,223,247,91,255,36,141,52,195,203,207,181,187,145,252,252,252,252,252,252,254,12,1,176,251,117,203,237,109,189,189,183,247,246,222,222,215,20,5,103,123,40,229,115,255,191,114,87,249,119,92,67,63, +121,40,142,100,140,183,46,142,254,253,114,119,119,127,127,127,68,21,88,96,159,111,80,67,127,191,215,207,254,254,254,254,68,173,87,172,84,165,156,83,95,143,159,127,249,56,76,20,8,5,22,71,191,244,155,243,87,255,255,79,255,255,253,119,121,48,34,224,139,121,60,35,112,115,120,125,125,91,220,116,36,75,123,35,166,236,113,86,255,64,249,249,201,241,255,245,242,1,19,106,120,12,195,241,113,124,96,127,213,253,126,248,102,0,59,219,43,67,85,17,84,69,215,209,118,100,22,37,40,1,7,158,24,165,73,151,160,170,254,9,180,130,38,162,52,3,119,189,184,234,8,136,78,92,7,131,173,114,81,56,106,0,173,177,8,55,84,216,57,205,17,54,202,32,32,65,8,3,35,14,28,39,96,128,8,176,0,143,248,120,14,135,8,3,27,46,60,85,140,21,89,138,36,26,134,139,194,8,52,3,31,245,232,199,73,166,237,232,131,68,168,166,225,9,20,233,104,3,90,243,217,255,160,128,1,2,176,42,150,207,122,192,84,215,88,95,109,31,92,35,143,55,91,109,22,25,52,197,36,173,147,39,165,232,224,0,131,169,232,37,57,179,227,1,165,44,119,227,223,121,127,112,19,122,26,117,73,165,8,3,27,54,109,85,165,86,146,5,78,0,85,75,23,90,52,3,27,82,200,98,136,41,14,165,4,195,116,6,61,68,40,1,15,159,56,117,149,120,164,111,157,57,26,34,202,9,24,193,222,139,83,11,22,0,84,197,147,234,25,224,129,220,68,139,14,53,117,117,41,43,15,62,252,250,231,190,152,32,8,3,47,156,56,213,65,181,90,103,217,107,94,87,215,69,84,3,143,231,82,185,85,102,249,194,165,138,103,152,141,45,84,195,40,181,21,236,80,13,42,12,10,28,132,69,7,249,102,0,177,168,196,50,125,107,234,37,39,141,255,210,88,168,209,2,45,1,26,87,67,8,21,35,114,130,25,114,80,246,8,3,43,175,57,229,154,63,242,15,244,24,1,134,146,35,242,1,7,90,61,204,18,169,10,93,229,218,148,40,189,22, +68,147,185,226,159,154,189,124,9,255,255,31,189,211,47,55,52,197,40,181,152,107,37,179,237,111,132,181,146,185,123,105,68,11,92,172,174,37,60,167,221,192,200,152,52,248,240,231,52,3,147,191,207,122,77,168,196,203,118,91,127,94,188,203,241,73,49,236,121,253,168,189,155,89,144,78,184,248,28,127,84,1,125,211,227,203,219,127,236,248,183,249,117,191,127,63,102,0,227,145,169,66,176,139,223,93,167,91,245,86,93,89,24,1,159,188,191,247,74,182,203,217,86,224,189,249,180,190,40,1,31,61,59,167,112,9,103,208,13,221,221,101,93,83,68,137,146,129,169,171,243,226,36,15,127,31,143,143,206,228,36,13,92,236,62,103,223,107,121,236,178,52,14,30,114,16,193,209,16,197,155,155,140,152,94,239,109,171,248,247,127,158,52,197,98,172,143,157,109,170,111,175,29,109,165,203,157,175,84,1,55,108,99,249,45,160,1,32,160,0,16,0,97,12,40,1,47,173,56,247,225,183,126,203,23,242,89,149,218,170,40,1,47,140,30,39,6,100,40,35,42,26,168,85,85,117,24,1,11,21,107,231,46,186,151,98,245,158,29,208,130,74,52,197,238,197,147,237,109,141,236,65,205,172,65,170,88,198,52,3,103,61,249,242,221,66,47,119,186,185,217,57,117,102,226,41,142,68,150,186,111,86,1,71,55,61,38,116,26,178,36,149,159,162,245,222,223,202,8,151,227,231,231,253,237,225,254,192,226,245,187,76,2,38,148,192,36,84,36,231,38,175,40,1,163,140,25,7,84,229,80,95,87,223,1,159,130,157,36,181,182,236,247,251,235,180,161,120,96,50,139,206,206,14,20,113,231,34,117,199,75,147,130,206,183,183,163,203,168,218,8,3,59,150,24,7,173,66,151,217,37,212,162,57,208,39,226,104,5,117,149,254,144,229,146,193,31,125,73,247,248,175,68,43,36,131,109,109,177,153,157,30,95,250,223,235,241,249,20,5,43,161,154,231,131,248,127,114,94,103,125,255,127,127,242,1,147,89,186,142,37,117,206,197,147,3,85,144,27,249, +8,3,77,104,181,100,85,164,6,164,1,250,128,63,240,15,113,169,31,195,36,207,31,83,166,134,191,114,127,127,254,248,8,73,97,32,58,72,6,220,215,247,246,191,255,223,255,233,12,1,188,236,161,224,214,213,228,171,125,165,205,148,153,146,111,0,107,221,216,106,36,191,154,194,149,186,136,99,247,140,68,243,143,232,135,47,85,107,129,235,119,187,211,225,240,248,52,3,71,82,200,102,5,192,96,92,122,178,127,127,158,223,206,168,100,172,172,253,246,167,62,154,161,170,170,163,169,67,8,3,15,143,13,37,10,146,232,34,0,39,176,244,199,111,40,1,147,181,105,7,173,98,150,118,128,255,34,30,42,152,20,75,123,113,186,255,223,75,138,52,165,149,136,172,181,110,20,11,135,242,222,171,214,80,253,254,236,100,13,165,79,33,40,1,187,164,45,151,110,123,55,51,94,251,17,128,42,128,40,193,214,205,84,91,162,216,171,0,42,188,248,127,68,79,52,5,79,231,147,91,94,248,51,80,7,203,72,38,218,230,8,3,69,90,246,98,138,174,26,134,37,95,65,6,74,136,102,0,167,160,167,50,163,160,144,128,8,232,41,95,120,63,52,3,103,178,220,101,164,103,181,195,112,134,248,106,150,229,40,1,51,151,45,103,133,124,250,38,4,120,10,224,35,96,40,1,249,226,209,243,95,1,127,18,44,191,249,186,86,171,40,1,15,29,60,211,121,225,167,102,170,162,146,24,170,211,20,205,163,210,159,117,81,247,177,68,43,180,109,142,227,52,40,1,7,13,28,149,138,38,95,226,150,93,166,59,85,249,40,1,55,174,120,211,183,236,183,159,235,167,122,169,88,232,68,77,212,210,242,191,176,29,35,9,131,4,128,128,3,97,52,3,67,51,236,245,9,111,174,63,180,71,187,84,149,196,118,192,186,221,8,21,196,21,79,101,160,84,33,12,0,48,52,3,67,82,248,106,221,101,140,207,232,0,38,170,168,57,117,40,76,236,220,124,189,187,89,31,234,144,157,175,239,133,238,136,220,242,252,45,111,104,168,185,121,28,110,0,171,149, +99,1,107,217,228,234,252,218,188,6,60,10,252,66,150,86,84,1,95,236,43,251,67,169,253,128,133,168,101,233,187,47,52,3,109,245,228,238,180,127,147,185,179,42,191,109,79,114,84,1,125,251,225,203,85,115,191,113,135,95,249,118,255,115,8,1,223,88,143,222,92,207,183,210,19,228,202,127,105,93,102,0,173,176,5,59,95,45,7,103,98,85,80,149,86,101,40,1,43,183,78,87,85,85,85,210,145,254,109,249,84,6,99,1,149,169,55,51,109,139,175,129,63,250,68,246,170,46,84,195,180,222,86,53,33,235,115,57,89,231,111,183,115,187,24,1,147,165,79,167,12,43,221,134,163,208,180,123,126,77,36,77,19,172,105,123,246,167,60,4,130,32,48,8,66,193,111,0,55,177,165,105,204,126,249,255,123,41,124,138,164,154,8,1,119,116,99,220,28,15,52,255,94,213,35,223,112,154,242,1,43,46,210,198,242,109,252,191,207,159,150,232,236,128,36,27,219,240,116,244,238,46,23,64,7,87,223,239,255,255,52,197,106,181,81,127,191,127,118,127,123,253,178,75,118,100,68,205,235,178,238,101,247,29,255,255,143,47,55,127,253,252,84,3,79,231,19,3,104,6,195,64,0,12,96,127,127,127,68,147,185,200,86,175,93,198,131,0,129,195,71,25,239,207,20,41,74,140,210,202,181,222,80,91,148,181,120,191,18,29,8,3,225,202,242,165,224,32,45,250,192,119,159,127,252,102,125,168,131,225,197,103,145,99,231,12,187,221,232,160,136,160,36,11,158,161,169,203,49,37,71,13,60,28,96,120,124,94,253,152,188,136,167,252,183,62,32,252,171,44,45,173,16,112,8,3,187,164,57,5,232,128,138,160,10,122,9,29,66,167,254,0,151,94,153,212,84,232,147,173,228,46,33,207,236,44,52,41,169,132,206,63,247,8,93,32,3,42,0,3,88,9,254,0,135,42,222,78,81,178,83,108,2,238,192,221,211,118,8,3,147,141,62,245,9,231,48,90,127,119,231,221,181,247,242,1,167,42,222,212,84,129,255,194,179,222,220,246,255,69, +52,197,232,164,83,231,134,40,3,115,154,175,153,233,155,181,52,3,35,83,232,254,164,195,90,203,123,220,187,127,117,255,8,73,170,164,182,119,147,157,233,66,167,185,184,97,166,244,102,0,45,177,200,54,120,255,96,95,224,223,254,183,253,173,239,0,3,163,249,5,189,160,209,208,151,168,146,115,189,56,8,3,35,13,28,243,210,79,111,106,83,143,250,74,47,118,8,3,23,29,59,165,226,138,22,240,8,174,0,160,10,170,8,3,35,143,24,165,29,162,9,245,18,64,162,4,175,225,24,1,19,53,77,103,53,118,150,219,226,82,209,84,140,4,40,1,19,159,24,55,0,156,161,30,76,88,104,40,128,2,20,205,129,4,251,111,173,15,21,132,107,180,122,55,79,46,40,1,7,158,24,247,120,46,132,130,128,0,188,193,87,86,24,1,89,73,179,166,160,0,188,6,111,89,220,62,188,147,40,1,35,158,56,247,45,246,2,16,155,240,7,118,37,215,8,3,31,174,24,69,230,130,42,184,204,15,253,204,251,106,99,1,43,81,217,201,177,182,202,144,140,64,223,243,106,167,68,45,17,44,119,172,223,117,127,15,87,255,240,224,206,62,8,3,55,53,28,227,157,136,9,130,8,2,132,170,34,137,211,1,51,21,28,211,213,54,19,67,64,210,16,232,249,69,24,1,19,183,104,103,100,47,122,153,18,170,72,42,186,18,8,3,15,14,110,17,117,250,238,166,244,187,254,12,99,137,52,5,75,231,147,43,170,96,6,204,11,191,81,5,61,232,8,3,7,175,57,99,250,136,126,147,249,29,182,20,101,137,254,0,11,110,48,76,94,174,95,147,90,178,160,174,154,91,8,3,139,166,239,131,134,106,169,35,214,233,37,108,8,1,8,3,7,45,92,167,102,173,91,195,213,18,69,134,159,50,121,112,214,72,123,247,155,131,140,173,45,233,239,245,171,163,8,3,15,28,77,211,207,178,30,122,10,37,85,98,165,149,226,137,14,108,102,251,73,59,103,152,159,30,245,159,64,95,8,3,7,28,59,163,189,90,55,216,45,86,225,37,103,118, +84,1,63,243,161,235,173,171,49,171,37,170,105,173,45,172,36,137,72,208,8,151,231,6,14,25,206,60,207,230,255,254,40,1,3,23,46,211,255,235,247,105,159,78,97,59,180,130,242,1,225,208,205,11,43,84,14,167,91,185,224,106,150,91,24,1,139,133,170,103,233,138,248,69,142,18,156,84,53,24,84,3,199,195,29,144,0,38,200,104,6,234,64,57,88,17,40,1,139,148,174,37,244,126,151,253,235,97,215,168,171,146,242,193,192,226,180,83,204,31,209,124,83,77,85,110,93,187,209,145,48,108,237,229,201,174,25,123,0,42,207,249,107,240,68,187,108,224,237,254,232,227,58,39,63,49,251,159,172,118,99,1,245,170,74,211,45,164,133,48,145,164,194,180,218,210,20,5,31,186,225,155,85,123,95,61,255,248,253,52,52,88,40,1,11,21,75,119,2,60,128,1,24,128,9,152,129,153,24,1,97,72,208,144,52,42,85,70,195,61,177,18,12,1,12,1,144,210,245,247,205,63,122,87,125,203,13,154,69,242,52,169,141,114,140,124,212,160,116,149,26,70,197,223,58,193,99,1,71,92,148,106,236,109,147,111,17,254,0,185,97,200,106,0,169,160,134,42,191,158,122,252,242,255,255,255,255,255,20,137,147,68,181,163,106,167,100,127,127,223,124,194,92,80,8,3,19,53,75,21,160,15,240,3,255,80,168,170,170,170,226,201,152,178,117,57,63,188,252,168,246,163,234,139,166,141,24,1,11,37,75,5,48,5,80,114,64,74,48,82,232,173,254,0,121,162,96,193,102,108,93,251,145,77,116,3,31,192,52,197,38,173,80,60,179,80,95,191,115,121,123,245,248,119,8,3,11,37,75,69,89,16,6,100,1,185,64,42,160,10,238,208,64,128,206,175,215,188,150,179,29,217,26,77,103,76,20,5,55,105,147,155,113,127,179,127,236,70,11,234,144,133,106,0,179,209,103,51,42,168,162,173,222,186,235,173,27,170,113,4,241,200,122,215,12,142,90,254,90,6,26,9,26,9,8,3,31,191,120,163,74,167,152,80,9,35,244,202,149,87, +121,112,58,128,79,253,201,26,6,170,168,169,44,44,45,159,52,41,201,228,148,171,223,104,155,81,175,9,23,154,87,177,242,1,183,92,62,20,84,54,14,229,32,141,143,104,135,84,8,5,116,222,254,88,134,187,114,33,53,82,45,80,11,214,8,3,7,143,56,85,123,216,143,248,0,70,235,128,79,176,75,0,55,53,108,35,165,36,148,20,244,162,141,100,82,104,24,1,19,174,56,213,211,215,144,181,226,43,248,70,181,182,52,9,143,242,246,178,62,33,137,40,169,132,13,194,178,52,98,137,18,35,249,126,187,255,200,7,30,86,121,130,39,158,40,1,51,37,110,65,103,163,244,10,95,249,7,69,97,171,24,1,35,53,107,163,238,93,126,184,24,45,76,65,238,143,227,193,110,198,46,6,228,128,146,226,145,42,137,72,201,90,40,1,55,53,109,165,255,230,47,237,97,234,103,105,169,186,254,0,11,30,217,84,162,150,76,10,147,80,4,4,46,32,111,0,83,30,207,105,48,139,128,141,202,18,149,203,11,16,8,3,51,140,25,231,123,92,223,217,35,96,47,101,91,91,242,1,183,88,190,6,112,47,128,183,22,67,244,154,130,94,40,1,7,14,28,3,120,1,87,90,170,93,219,165,87,109,8,3,15,13,46,129,40,162,32,112,129,219,146,53,218,122,36,153,148,180,208,240,214,212,48,19,226,71,231,28,8,16,12,193,150,249,40,181,37,38,213,50,46,104,181,66,249,8,117,72,169,210,190,239,115,5,96,149,172,165,139,29,171,28,8,197,102,166,229,219,254,115,31,254,42,127,73,103,178,25,106,0,107,169,170,46,88,81,186,229,101,53,214,216,73,219,8,3,97,203,208,83,120,31,117,77,94,40,107,137,119,120,74,8,25,108,254,201,187,177,179,85,84,152,236,142,215,37,122,192,116,249,160,144,58,148,50,76,171,99,95,217,227,38,102,0,47,170,201,50,9,106,66,197,117,20,45,253,162,212,253,136,104,195,39,41,111,117,147,127,94,65,142,13,176,23,84,195,236,205,81,1,41,0,204,196,4,150,201,10,178,132, +24,1,3,22,43,199,223,243,131,254,0,15,164,71,201,137,20,171,156,164,164,154,243,136,155,82,93,119,121,123,253,63,84,3,87,195,29,232,1,161,128,223,128,107,128,155,216,38,24,1,139,149,171,231,215,200,113,59,94,136,207,242,119,248,52,5,87,195,29,98,30,220,120,119,139,191,81,33,10,76,36,185,168,210,221,57,255,248,80,149,32,24,77,67,176,244,226,168,20,227,162,150,198,237,159,231,47,95,120,42,169,232,84,1,79,251,168,199,1,32,1,32,128,111,182,245,175,178,242,1,59,46,221,6,4,20,68,29,137,79,231,243,125,58,97,241,34,199,34,197,204,2,197,236,255,19,134,33,159,225,24,1,43,165,41,85,44,6,144,128,129,72,143,225,227,116,253,136,18,44,203,233,183,190,186,235,63,63,197,136,2,132,72,1,116,211,128,1,80,96,21,216,5,181,169,174,42,166,24,1,35,13,28,165,108,11,216,2,215,171,89,73,26,247,254,0,139,108,218,70,250,2,103,96,128,253,193,30,186,147,12,1,152,136,249,58,253,91,210,187,207,183,120,252,222,250,8,3,19,36,106,245,138,15,184,136,1,37,153,86,89,69,111,0,149,161,23,58,237,182,127,147,172,192,109,200,53,169,52,3,39,60,149,97,4,172,128,205,232,135,112,114,255,119,106,0,53,194,10,55,132,3,42,80,225,41,231,86,108,121,52,3,107,209,136,238,114,85,191,114,70,55,116,6,195,88,8,195,154,141,133,231,255,126,34,171,129,222,240,37,84,2,8,5,120,95,177,80,37,37,83,217,85,153,149,66,149,88,24,1,81,114,147,118,58,63,205,239,228,65,201,67,242,246,121,24,7,96,142,46,189,119,80,150,171,52,48,221,106,59,118,0,234,124,65,244,29,165,216,237,37,249,221,115,167,222,99,1,119,49,137,198,109,134,124,2,100,67,85,168,3,209,238,104,189,100,93,166,84,134,102,25,164,166,80,155,84,153,225,2,19,53,78,225,190,123,113,91,0,45,32,116,76,20,40,1,11,38,78,81,116,21,126,202,149,180,133,89,149,85, +8,3,59,167,105,165,96,0,6,16,194,167,249,152,105,165,52,41,145,210,95,111,190,128,143,124,93,4,44,148,216,28,52,197,40,173,145,140,25,104,184,27,4,123,182,189,179,118,24,1,27,183,72,37,80,130,3,32,193,211,33,167,26,149,52,197,30,132,149,231,205,28,174,189,140,59,97,15,152,160,20,205,150,178,159,118,128,12,41,72,89,82,45,81,105,121,40,1,47,157,57,245,182,252,138,151,173,126,15,253,33,222,52,3,107,178,185,233,92,73,249,113,40,69,3,40,108,2,52,197,114,206,147,7,50,83,171,233,173,173,29,172,149,168,227,1,75,167,219,132,72,15,64,141,0,252,16,170,208,76,102,0,43,169,230,50,149,86,245,216,29,212,37,208,37,208,52,11,30,64,201,120,169,249,93,110,3,111,85,97,52,47,227,193,46,206,144,85,91,175,186,171,12,219,142,106,90,111,52,235,93,192,217,131,109,178,167,237,221,205,72,234,166,63,84,195,46,206,79,63,91,166,205,187,178,195,189,156,13,175,8,3,27,15,28,71,247,126,213,11,125,153,29,77,250,243,242,1,151,106,210,86,16,186,130,68,11,248,206,78,149,104,84,41,128,50,95,102,168,101,104,140,106,102,51,200,133,141,40,1,35,159,89,149,254,31,116,157,128,38,160,40,212,8,254,0,183,88,82,142,226,85,92,188,202,255,85,142,42,127,52,5,79,231,19,227,121,106,169,133,12,38,10,157,173,237,52,197,38,173,146,157,173,229,141,234,105,145,176,21,138,135,8,3,55,29,92,131,73,99,242,72,63,233,209,169,31,255,52,197,160,156,145,57,9,180,73,37,160,2,224,32,14,97,194,73,35,204,119,239,174,187,125,105,103,162,42,36,60,57,8,3,27,55,76,83,144,137,5,105,66,136,29,218,159,214,117,40,89,236,70,235,159,181,81,175,8,179,135,248,69,137,24,1,15,158,56,17,81,188,248,9,90,112,29,18,36,85,227,193,170,189,140,76,165,161,84,65,14,247,214,118,215,38,253,112,134,204,102,247,189,127,161,192,185,27,237,70,17,191, +52,5,75,229,18,141,161,28,172,184,89,168,249,157,87,187,40,193,62,189,108,7,159,253,37,255,255,214,159,219,255,221,52,3,91,88,197,226,152,4,175,163,165,40,1,33,12,172,20,109,242,36,215,94,5,160,217,220,30,151,244,99,175,242,24,1,11,167,104,135,56,2,82,96,115,211,125,188,40,171,8,3,7,159,56,71,1,174,48,2,10,96,8,85,171,190,99,1,23,52,165,105,48,3,0,176,155,192,24,226,32,69,253,40,3,53,85,245,0,5,13,8,12,10,152,112,116,60,226,40,76,195,161,147,110,238,87,226,147,19,168,116,74,130,113,41,27,99,209,53,243,141,221,134,161,0,64,135,60,163,25,48,65,107,133,201,140,121,25,22,116,24,152,223,0,32,8,5,176,31,154,38,167,98,152,112,36,5,171,216,90,181,90,0,95,132,141,198,76,247,63,126,62,69,176,163,66,62,242,1,229,224,77,5,192,20,0,125,192,0,117,83,184,146,253,40,74,163,2,197,140,185,135,197,43,45,13,139,205,195,8,3,43,148,13,213,3,15,192,128,169,87,150,85,153,85,24,1,59,38,28,243,177,184,239,230,175,226,29,106,159,66,20,171,176,196,175,191,119,104,124,59,219,107,71,23,234,86,8,3,179,148,24,87,168,55,106,143,88,3,247,76,85,80,40,1,15,29,59,245,102,213,11,223,42,125,7,126,9,244,239,0,7,147,25,248,6,218,6,26,27,168,90,232,192,255,8,3,23,175,88,5,252,42,253,226,255,249,39,252,5,127,24,1,27,53,109,211,126,98,222,194,239,1,108,6,92,118,110,40,74,177,181,189,85,234,185,139,170,152,170,186,108,139,8,3,43,182,45,37,208,2,38,168,109,75,197,84,165,85,223,0,19,53,28,177,89,139,184,74,149,44,163,17,107,241,238,40,145,196,167,205,93,86,164,97,82,225,117,54,23,158,226,56,169,144,220,52,247,16,23,160,173,69,90,237,3,11,40,1,69,89,215,4,28,130,55,128,67,37,234,133,74,162,24,1,35,183,104,21,70,41,92,249,97,184,1,104,1,85, +52,197,238,197,144,191,88,185,53,235,119,151,195,75,80,1,40,1,15,159,57,229,35,64,0,135,202,55,170,1,168,64,206,40,94,227,2,199,44,117,139,183,63,239,199,135,118,115,8,3,35,183,120,85,42,107,160,9,42,110,130,38,154,10,94,72,11,67,150,180,146,153,143,146,69,53,215,119,137,123,40,1,163,173,92,245,79,218,74,137,132,66,160,104,136,34,36,19,132,76,215,156,153,185,187,80,40,24,4,200,204,200,72,1,116,223,6,0,159,32,109,169,145,91,161,103,2,70,40,1,59,149,45,133,84,137,216,40,167,80,39,173,213,159,52,11,30,0,106,118,219,127,238,206,48,64,197,186,108,129,20,147,110,128,230,150,221,71,175,143,248,244,44,196,35,152,84,1,111,60,105,153,205,0,195,160,161,11,127,112,71,127,40,193,82,139,229,219,96,21,154,43,165,209,175,93,5,86,8,5,112,234,38,119,99,221,82,119,215,221,117,97,29,254,8,3,15,46,92,85,240,6,125,125,11,30,74,226,231,253,52,5,230,132,1,4,128,152,100,245,170,159,93,173,171,168,8,5,182,222,24,165,202,133,226,130,90,160,37,16,196,0,84,41,27,224,91,174,34,5,85,161,123,89,122,56,184,158,254,0,139,110,49,84,232,137,139,228,201,89,197,107,186,190,52,105,178,196,212,183,127,104,132,253,63,102,75,253,253,156,40,1,105,241,133,241,149,117,169,213,125,138,149,74,169,82,8,3,179,164,77,5,8,192,1,221,136,107,17,255,192,77,52,197,38,181,80,247,109,170,158,153,47,238,220,166,104,7,24,1,43,166,104,165,72,17,192,163,253,231,145,28,30,93,254,0,183,94,189,84,104,33,22,231,246,133,124,58,181,105,84,195,172,189,83,5,172,128,141,156,188,180,71,229,47,132,52,3,31,117,152,206,85,179,117,84,191,127,255,49,137,9,8,197,178,163,251,125,124,23,91,137,20,136,74,33,25,153,8,195,158,173,150,39,140,170,172,194,232,34,61,212,143,241,52,197,112,214,79,195,223,135,55,85,153,130,15,156,129,3, +239,0,71,163,185,191,188,7,192,148,104,146,19,210,37,124,52,137,137,196,143,63,119,169,196,81,201,180,133,57,88,33,227,1,71,227,114,190,59,210,55,65,120,88,12,127,171,46,40,1,15,29,60,147,240,167,240,41,166,249,42,148,90,43,98,73,49,145,153,47,93,246,105,0,11,190,144,200,130,1,221,40,202,129,43,74,213,12,133,82,25,201,109,27,41,141,12,193,218,189,228,5,169,6,132,144,147,168,17,149,41,51,110,104,35,145,186,111,51,226,139,45,255,126,255,97,7,148,40,1,43,182,105,85,106,6,0,40,128,0,100,140,170,159,207,0,15,96,98,73,212,157,125,221,142,176,194,98,222,199,8,3,7,13,60,5,66,8,140,128,136,136,2,192,5,246,68,203,101,149,202,158,147,117,13,224,16,8,7,13,6,2,98,241,178,130,234,88,152,154,240,143,63,215,170,14,30,122,227,1,75,147,57,84,109,228,3,52,43,191,164,196,220,10,111,0,71,213,216,205,124,36,159,116,145,90,154,98,63,141,24,1,27,183,72,69,236,0,105,96,63,228,15,8,33,144,221,232,74,3,5,55,216,122,80,94,4,236,202,26,191,255,8,3,47,157,56,229,9,156,128,74,5,125,208,221,107,221,66,137,140,65,67,37,171,226,196,12,127,248,34,130,255,64,254,0,7,92,49,198,1,180,64,64,98,74,105,84,54,77,68,205,167,146,51,118,61,29,108,113,35,15,31,62,123,241,239,192,238,197,42,25,253,26,223,246,31,94,143,126,237,186,12,1,118,132,165,188,252,201,127,82,118,90,118,35,149,59,24,1,47,156,57,213,226,41,184,73,203,46,232,15,242,159,52,5,199,243,18,168,203,109,173,128,5,24,160,6,235,147,254,0,187,46,213,198,37,254,191,215,115,204,92,53,221,248,24,1,69,89,244,33,82,11,173,196,109,126,73,89,33,141,52,3,27,85,197,226,128,43,106,118,73,15,206,44,161,164,8,3,7,13,27,117,166,153,191,82,46,167,171,169,25,170,106,0,101,145,136,50,253,170,43,30,224,16,99,250,217,157, +226,9,229,196,246,254,113,190,249,63,148,9,49,149,161,246,8,3,135,156,25,103,164,95,122,66,39,80,159,65,89,68,52,73,90,241,124,221,236,137,184,119,164,102,172,57,27,0,206,40,17,108,219,139,54,238,57,226,196,146,112,241,87,109,242,1,7,105,215,20,110,139,123,9,75,128,107,148,196,5,20,139,242,242,190,255,94,144,35,113,142,193,169,45,138,80,8,3,163,156,56,87,165,151,118,157,150,183,37,139,81,130,227,193,180,214,168,242,36,30,238,122,67,92,63,183,61,247,8,3,35,143,24,69,169,125,208,75,55,166,210,134,65,98,40,1,7,159,57,5,149,129,218,138,189,66,41,181,161,255,8,3,179,164,58,165,3,54,64,160,32,100,162,8,34,10,20,235,252,242,190,63,86,160,132,216,233,123,114,154,98,10,52,43,103,192,229,116,157,44,226,48,207,67,105,229,91,110,40,193,218,237,68,251,135,94,32,174,2,249,152,46,232,82,8,3,59,149,25,101,230,138,31,96,45,35,93,64,39,106,8,3,7,143,13,149,92,86,71,50,250,47,5,144,169,201,36,125,26,192,108,246,176,245,108,0,8,14,95,98,44,22,72,1,240,162,99,9,113,1,126,224,13,126,86,31,85,215,8,5,112,230,194,159,233,247,124,215,251,95,180,10,149,128,40,193,98,207,6,215,170,30,245,145,69,105,104,70,139,249,121,168,176,196,175,247,109,159,108,80,144,113,231,239,243,191,40,1,19,183,13,103,121,81,95,74,223,226,47,198,105,10,227,193,112,214,41,220,111,234,115,126,131,244,124,180,61,175,20,5,55,115,171,155,113,86,254,249,114,137,57,202,176,104,40,1,15,31,60,181,245,63,219,19,37,152,128,5,229,82,84,195,230,172,81,252,183,249,64,167,180,57,183,132,56,117,24,1,59,150,45,19,84,34,73,64,55,136,125,26,210,244,84,195,238,197,16,237,0,125,226,195,122,15,221,161,201,40,52,3,43,81,212,237,92,167,183,63,201,184,67,157,232,69,52,3,79,81,213,202,51,245,153,104,105,173,216,161,141,173, diff --git a/screens/mainscreen/images/0_Converted.png b/screens/mainscreen/images/0_Converted.png new file mode 100644 index 0000000..ba9bf28 Binary files /dev/null and b/screens/mainscreen/images/0_Converted.png differ diff --git a/screens/mainscreen/images/Untitled-2-fs8.png b/screens/mainscreen/images/Untitled-2-fs8.png new file mode 100644 index 0000000..8648b5d Binary files /dev/null and b/screens/mainscreen/images/Untitled-2-fs8.png differ diff --git a/screens/mainscreen/images/Untitled-2.bin b/screens/mainscreen/images/Untitled-2.bin new file mode 100644 index 0000000..700428b Binary files /dev/null and b/screens/mainscreen/images/Untitled-2.bin differ diff --git a/screens/mainscreen/images/Untitled-2.binh b/screens/mainscreen/images/Untitled-2.binh new file mode 100644 index 0000000..1ca0400 --- /dev/null +++ b/screens/mainscreen/images/Untitled-2.binh @@ -0,0 +1,2 @@ +/*('file properties: ', 'resolution ', 240, 'x', 240, 'format ', 'COMPRESSED_RGBA_ASTC_4x4_KHR', 'stride ', 960, ' total size ', 57600)*/ +120,156,68,156,121,60,84,223,255,199,103,174,157,100,79,72,24,99,39,203,88,146,44,51,151,172,209,220,155,157,236,251,150,108,73,98,164,26,91,33,100,223,66,246,37,217,146,72,18,89,91,180,16,35,251,46,36,165,228,119,125,62,191,190,159,71,127,157,199,185,247,204,57,231,190,207,251,245,122,190,239,21,216,121,206,220,163,143,228,93,165,32,57,104,100,141,97,195,97,185,247,25,90,249,48,14,131,236,246,103,34,222,104,195,128,91,254,139,19,235,43,119,255,180,145,139,253,104,122,64,192,112,242,244,4,195,142,86,42,158,184,121,73,52,27,4,96,172,207,68,194,125,52,219,254,52,189,181,202,109,16,16,193,88,15,26,105,70,191,206,148,155,156,38,114,192,128,95,139,152,10,45,135,5,125,215,115,14,53,215,55,68,64,93,76,93,204,199,28,47,255,229,145,21,168,7,128,192,107,89,154,241,187,141,5,33,146,219,94,77,18,179,48,224,148,62,45,73,42,241,147,120,20,11,174,28,165,7,129,15,247,125,108,140,217,5,19,58,220,71,245,118,124,65,224,45,36,99,7,23,214,68,142,60,183,163,15,118,129,128,233,65,139,221,43,22,193,50,63,108,233,165,208,23,135,244,51,191,164,221,170,54,107,151,12,177,196,102,86,57,65,152,69,175,170,215,74,139,12,151,182,34,63,208,155,153,224,88,29,227,149,78,86,180,249,215,137,249,87,159,73,254,6,97,66,77,214,126,54,97,113,54,143,134,239,221,136,224,3,49,184,95,157,154,60,148,108,159,173,20,238,122,154,10,8,147,32,143,93,123,111,159,152,219,229,78,217,119,190,93,69,231,161,227,68,12,113,97,56,119,17,58,245,197,244,15,220,57,216,215,217,72,211,220,110,222,190,211,22,182,222,6,145,47,120,135,212,60,205,54,230,145,130,136,147,61,226,16,57,42,70,100,176,41,46,144,135,86,252,153,98,134,41,212,101,227,228,191,234,63,227,182,248,240,130,139,160,82,60,12,148,149,209,202,206,229,38,244,143,117,124,190,254,114,20,236,161,3,79,21,61,74,152,191,134,93,57,185,117,61,153,64,45,31,175,113,75,252,166,45,230,156,44,227,118,126,57,12,244,41,219,132,162,12,141,244,188,252,127,115,89,113,195,64,77,175,59,78,94,212,157,112,104,96,177,35,247,57,12,236,125,157,149,146,195,138,65,92,46,79,143,191,114,5,129,179,95,180,173,14,177,81,15,63,239,57,25,54,159,11,2,191,106,89,34,56,200,92,83,242,178,210,25,181,88,24,112,73,154,87,240,170,57,182,102,167,157,83,1,156,4,23,66,188,13,152,239,223,127,189,194,167,178,24,24,206,0,146,197,87,120,26,186,139,207,215,102,236,72,39,57,200,195,64,221,235,7,184,247,140,47,100,104,10,117,160,183,85,196,37,98,255,175,118,213,157,35,253,226,31,226,123,176,120,168,211,202,58,96,4,173,21,94,176,146,183,243,242,54,0,30,180,151,241,172,183,19,62,41,253,169,194,185,8,139,3,73,35,92,42,17,35,166,230,185,210,35,33,253,16,198,69,202,243,203,3,122,181,67,14,39,104,181,56,228,41,34,121,252,187,42,185,233,127,234,255,80,86,159,126,157,135,201,128,119,146,88,125,248,192,149,203,217,31,197,20,35,33,113,182,149,109,117,245,175,158,38,124,153,218,12,251,210,148,178,100,15,45,118,225,219,120,198,254,200,235,248,67,113,112,207,209,212,141,95,113,105,190,128,177,125,108,249,245,71,32,249,240,72,109,205,239,114,231,17,173,96,54,93,32,213,174,175,250,75,172,249,106,121,176,12,11,167,111,243,180,13,36,126,216,219,167,205,166,103,171,149,225,50,161,143,95,30,188,120,41,254,87,197,248,247,26,158,91,221,173,206,15,38,9,122,153,5,37,9,19,247,110,159,82,7,101,222,197,10,226,1,85,97,77,41,47,107,244,209,146,225,147,99,3,162,16,198,20,12,38,179,252,52,107,238,243,251,153,131,15,161,136,136,252,40,83,202,212,106,183,182,108,106,244,217,170,6,59,141,136,94,45,232,48,142,220,96,23,67,190,138,85,2,224,245,107,254,215,188,185,82,107,246,62,99,118,87,41,76,230,168,124,237,125,221,199,176,223,111,230,165,94,176,35,1,112,219,114,85,125,112,36,224,134,226,128,224,56,253,10,216,169,173,99,87,79,250,67,73,204,124,190,56,173,98,139,127,197,80,185,26,210,250,254,170,51,221,116,140,227,9,100,221,84,210,237,178,33,235,245,146,128,153,231,79,230,119,144,59,205,202,118,184,109,179,175,190,76,143,211,32,156,8,2,59,189,37,107,135,126,236,82,52,237,40,225,77,59,132,97,105,39,121,152,107,126,226,225,242,253,96,253,190,7,16,117,69,218,179,188,231,223,53,57,204,51,90,78,0,73,19,189,233,14,143,110,169,54,60,12,44,230,73,106,110,212,71,246,51,104,157,63,231,231,15,180,76,91,144,49,157,1,49,145,163,50,247,113,43,178,155,79,159,240,166,44,56,10,209,174,231,15,50,87,206,58,163,204,142,139,182,204,231,13,208,129,22,45,180,77,245,54,21,101,154,210,46,185,180,66,229,236,211,199,175,110,244,57,156,185,93,154,182,123,15,5,81,127,200,104,127,58,251,222,54,244,140,118,88,151,15,9,210,163,85,250,54,22,205,184,44,197,28,57,181,49,207,2,211,243,94,199,92,55,49,55,185,201,54,185,223,117,98,18,6,60,106,49,184,120,60,147,188,2,32,168,138,21,2,169,213,160,198,196,93,76,228,55,205,87,31,101,212,235,64,32,201,34,163,152,207,151,238,220,86,88,229,13,95,93,16,208,237,192,142,50,188,19,61,119,170,34,45,148,165,116,168,140,174,239,152,3,155,223,96,174,121,84,82,243,197,47,16,112,239,73,74,88,96,113,171,71,240,202,71,29,58,11,133,139,143,202,205,114,94,18,31,153,153,188,252,209,246,227,59,14,91,160,185,219,98,115,238,177,180,53,31,159,181,100,26,30,192,203,226,101,61,204,209,39,243,252,174,253,36,12,194,40,29,21,117,121,15,107,52,42,241,214,202,196,135,54,34,0,202,130,82,94,230,164,132,240,208,139,87,190,78,224,176,252,191,235,148,178,15,207,22,161,82,131,206,62,222,129,129,138,218,233,19,23,179,115,40,86,126,235,161,59,153,96,167,141,173,255,16,250,151,195,192,11,126,168,53,175,13,201,111,133,58,142,113,244,153,145,15,52,98,248,220,38,96,114,134,16,97,198,192,45,134,121,252,13,13,179,169,35,1,203,246,76,177,13,123,43,201,181,176,68,239,155,246,119,97,234,4,78,137,228,83,31,250,151,183,246,93,198,207,219,27,139,157,237,189,184,161,112,246,231,243,167,15,142,112,127,177,107,19,123,173,119,49,175,80,36,178,173,199,100,187,56,244,24,12,108,116,56,203,254,225,106,86,198,223,17,146,70,119,10,83,243,100,240,179,94,61,74,92,241,169,158,201,185,167,11,3,242,189,55,113,111,62,231,187,138,133,226,190,210,68,66,228,140,197,230,205,135,37,126,119,184,126,252,249,85,133,37,2,247,34,171,211,53,36,208,63,191,146,172,44,77,226,137,137,210,253,191,206,181,110,13,135,31,123,155,231,36,31,11,117,77,172,40,44,123,228,249,155,136,94,110,9,108,31,36,0,175,59,198,75,86,79,117,49,22,17,202,245,186,243,33,192,5,136,187,58,22,217,169,170,199,177,44,58,158,138,244,171,143,59,175,219,36,177,37,29,191,152,154,124,15,6,36,234,92,213,206,120,205,70,43,126,88,254,166,65,3,3,186,98,199,67,157,164,190,41,116,89,242,78,103,135,192,64,200,82,133,97,127,181,110,105,15,43,158,32,119,6,183,64,211,16,238,183,147,186,212,243,112,246,60,202,132,149,8,100,68,54,22,33,243,91,176,126,178,145,106,115,6,194,8,15,211,74,10,188,208,238,225,125,251,7,223,178,78,4,238,223,236,46,53,144,192,139,171,205,154,235,16,132,112,216,62,89,145,236,99,180,3,114,81,125,181,154,157,205,194,212,166,250,95,42,107,212,110,68,235,209,251,36,43,210,64,93,159,215,78,108,36,217,62,21,210,41,59,175,168,43,165,64,157,147,216,88,170,40,129,142,62,199,89,171,190,187,5,147,243,28,162,166,220,227,18,108,208,63,208,157,224,105,24,0,89,114,46,39,182,104,161,222,143,9,62,177,43,4,129,58,29,167,243,183,205,118,155,174,248,88,7,85,54,130,192,117,5,185,59,230,46,3,203,27,162,73,193,140,90,48,160,195,157,19,232,39,117,110,125,168,56,193,220,26,209,51,19,97,157,9,166,200,252,27,43,93,60,60,184,110,68,111,211,167,36,103,215,158,173,180,48,102,136,177,138,131,100,142,212,185,198,186,55,239,94,70,101,236,8,231,164,66,228,249,103,203,240,234,200,98,19,211,162,171,101,67,34,12,204,166,191,84,216,249,28,54,244,233,203,26,141,165,42,146,159,159,137,170,132,123,78,100,161,171,204,76,61,171,8,0,197,119,66,101,154,171,255,8,99,81,183,141,68,16,18,143,101,116,184,128,28,85,187,44,49,84,166,68,20,72,158,192,111,198,5,164,103,170,159,99,231,40,116,104,69,174,247,163,236,76,43,1,177,101,162,115,37,175,114,9,192,152,215,216,246,23,197,18,130,116,127,105,103,63,50,255,178,252,89,133,128,92,25,139,147,71,169,36,84,9,200,252,105,83,173,76,250,99,46,47,235,159,166,154,59,14,119,26,27,119,198,125,161,125,169,58,255,217,179,191,37,1,185,127,217,74,105,154,171,42,251,217,104,127,168,253,91,28,86,94,173,190,41,71,59,200,124,50,151,60,32,153,1,98,164,248,238,182,101,153,43,191,125,238,112,111,70,99,159,242,194,209,201,239,11,169,240,71,162,241,161,53,229,109,38,2,61,131,124,234,136,185,77,42,151,121,238,91,243,146,227,16,80,179,27,203,61,59,99,115,72,57,40,113,225,62,114,158,107,158,196,169,172,98,63,206,148,198,84,13,13,188,3,129,197,2,209,221,91,57,53,117,157,186,44,23,204,203,64,192,103,46,248,50,227,55,205,70,142,175,116,79,127,229,65,128,223,152,215,214,4,138,228,29,189,242,198,114,213,11,212,163,107,168,112,9,90,224,24,161,178,43,206,63,150,2,46,168,123,75,190,24,237,155,85,76,95,148,213,167,98,130,1,159,186,51,178,105,145,54,65,86,94,53,213,59,188,112,41,221,116,7,135,87,250,222,141,100,62,194,98,98,42,4,60,32,103,254,134,202,50,10,126,27,124,185,244,17,209,243,251,49,84,178,139,178,183,102,174,146,29,101,185,144,120,150,73,158,86,48,176,191,170,174,107,173,176,217,10,192,128,87,190,176,236,247,236,200,55,173,145,31,25,121,110,128,0,197,217,247,18,83,13,231,10,246,202,157,251,75,220,120,73,129,254,233,136,236,183,69,115,38,225,143,206,250,125,61,120,30,7,251,127,44,85,240,152,224,76,105,225,16,141,219,178,219,214,180,146,26,197,98,37,100,206,209,126,136,198,105,201,41,104,246,124,103,178,53,69,107,233,60,30,135,229,121,250,5,119,124,96,71,117,131,151,234,236,111,34,216,121,222,212,103,28,255,118,249,206,53,249,179,98,191,17,61,177,176,12,248,130,143,18,248,117,76,43,226,133,90,55,97,33,65,223,72,250,103,28,253,76,189,165,218,167,201,55,136,31,19,82,191,192,248,99,64,186,201,181,210,122,10,217,207,246,2,163,185,184,28,216,40,76,242,219,235,27,95,97,224,65,41,181,44,45,193,88,208,93,172,193,124,127,28,209,175,231,247,185,125,232,41,36,70,144,66,35,128,26,144,210,225,50,223,123,81,124,199,134,49,217,85,152,242,2,241,31,4,211,41,102,245,37,238,77,128,191,134,232,14,2,173,14,54,147,44,116,156,218,9,205,193,134,223,249,96,160,170,217,89,74,34,148,185,143,39,242,54,131,72,10,8,112,213,19,165,204,88,111,73,70,75,70,231,119,176,18,128,112,250,45,86,1,115,137,51,28,49,45,36,173,183,4,32,148,38,34,222,67,41,218,70,155,182,40,86,128,252,111,60,210,160,126,43,208,206,27,227,118,194,97,96,177,148,70,246,215,147,122,167,147,25,90,188,114,209,120,64,73,88,93,202,199,26,77,22,125,214,91,81,144,128,172,223,54,164,129,52,78,126,82,113,141,146,198,12,64,24,126,17,183,82,102,124,247,64,127,205,240,184,6,226,255,138,173,30,183,241,105,112,133,201,142,25,180,69,68,224,1,29,156,14,46,200,9,221,213,155,161,206,157,36,72,0,166,47,77,169,206,30,25,177,28,79,229,25,137,84,34,2,50,2,74,194,78,38,120,119,147,55,77,123,243,50,48,74,85,74,85,234,64,31,94,29,87,83,210,142,5,59,207,17,61,198,240,211,237,3,62,231,183,30,103,95,34,198,115,120,143,135,164,239,20,73,82,108,40,123,58,63,64,96,68,231,172,35,195,96,21,209,53,205,13,166,94,130,81,154,242,154,242,110,150,104,20,91,250,168,49,6,0,187,222,143,140,100,68,22,150,198,89,60,8,222,200,202,195,199,82,73,159,189,27,86,93,193,216,175,169,224,175,78,132,1,245,207,126,184,111,63,154,43,186,196,192,102,51,25,252,171,24,109,209,151,174,109,254,146,173,190,180,178,217,121,136,63,124,230,38,213,243,193,85,175,159,231,232,225,13,41,216,61,76,120,90,199,112,170,43,234,253,243,142,194,216,167,48,226,247,218,5,78,232,4,104,248,186,197,229,146,172,96,160,117,105,89,83,141,119,120,218,83,104,221,176,234,54,12,172,55,11,75,133,223,174,127,111,149,17,109,20,89,4,3,121,145,247,79,24,176,109,114,224,183,229,196,23,30,29,232,11,6,23,94,169,97,158,21,112,233,148,76,34,1,48,159,54,223,160,156,63,228,40,237,72,184,202,56,243,63,253,44,154,11,224,11,189,149,0,97,68,232,46,23,49,103,56,29,122,48,156,188,151,252,20,196,8,156,42,84,226,219,147,203,56,75,121,181,45,26,77,0,156,54,237,154,30,28,73,28,111,52,93,91,149,20,31,120,89,4,87,241,254,248,19,203,28,226,70,90,142,91,130,59,223,155,191,138,59,115,153,229,146,192,116,67,195,123,62,130,222,80,65,224,203,114,93,19,133,45,248,119,5,83,28,226,23,242,167,78,80,11,221,33,249,70,110,235,116,171,227,186,162,210,38,139,240,99,153,143,199,238,249,70,188,77,4,221,153,83,243,175,61,153,74,124,65,50,145,86,85,72,20,166,102,206,40,126,115,185,69,203,254,201,149,118,159,150,155,10,212,242,226,167,181,87,134,181,40,71,79,89,114,106,103,11,149,163,131,172,97,123,108,215,89,61,93,168,100,253,173,2,181,170,130,182,214,228,112,100,98,132,36,181,61,35,76,112,103,218,190,146,118,193,80,129,196,69,208,181,254,248,13,4,166,49,26,193,134,73,31,94,148,41,203,86,20,160,193,5,154,74,87,220,102,64,155,152,237,252,183,141,123,32,4,188,29,228,180,186,150,78,102,101,63,214,63,43,33,2,119,6,94,118,226,216,251,246,201,172,166,126,238,220,4,154,0,12,60,57,208,79,61,172,59,166,148,224,237,72,4,98,46,149,38,159,20,198,87,89,238,101,242,236,10,65,11,212,253,102,33,26,228,183,121,252,158,174,237,153,187,72,255,149,252,76,57,49,210,248,221,111,237,220,119,211,15,218,165,185,202,98,36,214,182,217,111,239,116,233,64,12,172,159,38,106,41,17,112,187,63,108,222,231,218,58,4,40,9,154,28,133,45,131,195,251,5,44,84,216,214,17,125,93,40,148,98,116,106,147,161,141,16,185,248,94,11,18,55,168,16,20,243,200,92,151,225,99,247,119,166,35,99,60,69,87,126,86,125,8,165,175,173,105,21,231,221,213,1,129,128,20,187,176,116,253,99,144,212,103,67,238,218,70,144,158,111,69,44,58,55,7,58,145,237,119,40,240,5,132,228,199,149,29,233,226,26,19,209,56,91,161,197,169,163,4,224,83,199,170,123,153,101,110,179,167,186,187,229,76,1,1,235,87,103,98,20,26,99,238,150,177,157,63,130,218,134,48,33,163,150,134,252,5,111,248,27,100,141,226,217,232,65,76,111,108,85,190,213,207,185,113,77,183,53,247,96,42,8,83,255,254,163,164,76,209,169,47,63,87,213,86,27,59,133,197,133,217,14,15,5,140,51,179,192,185,193,15,12,40,16,86,237,196,70,48,33,202,128,144,158,188,61,153,203,9,163,226,174,86,231,43,136,160,81,67,198,31,206,59,206,16,129,212,203,205,217,167,133,208,55,52,206,13,174,86,250,32,251,177,60,34,104,19,193,249,147,156,60,68,219,56,13,119,26,24,104,88,143,14,84,180,5,117,120,85,164,231,195,157,135,15,71,85,41,152,121,237,150,6,7,106,27,209,34,241,236,103,213,112,223,172,64,75,217,235,247,243,80,35,36,127,23,116,43,132,213,252,252,176,176,61,72,77,246,195,47,209,74,219,66,3,159,100,157,189,62,178,59,244,180,33,249,250,202,68,219,125,115,223,137,106,207,130,67,20,201,191,122,234,133,93,2,4,29,187,180,192,78,61,125,167,6,146,107,249,72,240,247,172,105,217,25,36,159,4,76,255,156,85,158,174,166,157,115,152,74,19,34,0,243,126,243,59,243,74,173,191,222,156,53,150,161,160,240,128,186,212,63,249,171,25,251,45,223,65,41,228,127,237,210,138,198,101,213,25,83,168,211,222,33,132,132,182,31,40,219,85,9,241,164,139,135,144,252,238,247,5,253,49,107,110,125,191,222,107,141,130,235,58,111,234,177,77,90,103,127,233,153,69,158,240,99,251,199,127,126,193,127,162,220,176,12,23,238,182,54,32,96,121,250,226,77,140,147,162,186,238,245,248,143,186,236,193,11,252,222,45,15,238,185,244,222,180,255,118,175,154,221,10,238,225,235,223,243,173,127,218,155,250,202,231,200,155,24,132,55,237,98,186,21,70,27,238,114,198,220,16,92,96,96,70,242,195,179,82,53,49,207,185,235,68,64,97,85,124,26,241,3,226,197,51,172,190,61,51,184,146,194,192,45,20,12,4,189,233,85,97,234,113,182,247,239,87,225,181,178,135,0,190,93,83,59,95,249,184,139,245,93,204,172,191,121,225,78,222,44,150,50,178,66,140,126,207,176,147,110,148,58,220,121,162,70,184,224,203,169,14,184,37,254,103,7,215,44,194,111,136,30,175,85,125,168,178,189,206,80,17,235,128,156,239,130,5,229,176,170,220,15,107,122,3,18,242,11,32,160,47,154,48,99,44,53,37,17,125,242,15,254,62,19,216,195,32,205,59,254,170,12,174,58,254,96,253,151,125,98,155,216,248,237,219,154,123,195,146,151,206,26,6,62,255,73,133,232,121,159,167,225,179,91,28,207,79,203,151,80,203,193,248,21,218,56,64,234,34,223,64,242,94,65,105,228,215,199,16,182,142,225,197,105,118,247,223,137,204,15,152,194,143,79,29,228,99,93,213,16,15,52,170,65,255,124,20,24,137,248,25,207,247,56,10,71,36,89,203,72,178,75,92,122,136,198,110,121,58,224,62,206,35,161,220,134,213,5,229,65,4,212,118,78,109,95,82,34,101,48,233,231,156,184,151,9,1,184,236,120,1,31,98,253,235,252,197,60,184,63,135,242,2,121,62,203,164,200,31,99,41,50,175,30,114,197,17,201,28,166,167,70,230,44,99,44,181,63,1,216,197,13,184,84,206,187,213,239,153,79,239,121,51,1,86,151,39,155,248,114,140,183,37,244,233,125,32,88,118,62,183,65,81,19,217,143,212,128,117,205,133,187,3,232,102,188,114,33,194,175,231,89,147,221,37,235,23,21,78,51,60,155,142,229,128,1,169,90,97,169,183,150,34,160,93,243,19,42,3,196,63,200,239,107,135,110,154,81,219,235,17,58,1,205,67,72,60,74,188,202,100,49,175,206,97,27,221,41,229,182,7,129,188,11,75,117,118,206,215,154,6,106,239,117,124,12,131,1,213,215,37,106,58,161,83,109,128,165,251,94,185,51,76,230,145,206,17,217,242,200,76,243,105,231,185,61,137,232,127,219,100,17,78,98,132,143,240,234,189,251,16,186,19,234,58,7,251,172,178,69,253,212,54,199,72,16,48,117,96,207,217,67,113,179,155,117,22,53,57,181,107,223,47,106,195,157,131,38,79,147,126,80,156,28,215,206,208,215,84,77,67,93,72,252,255,100,51,238,214,155,123,87,102,3,248,67,93,103,244,237,182,190,124,253,45,242,135,229,124,73,12,4,117,25,156,117,154,77,218,166,219,27,108,50,173,222,30,4,1,142,64,253,226,35,201,49,212,11,135,48,242,247,179,41,34,121,159,209,234,153,113,34,85,236,13,110,29,239,69,40,34,89,121,27,106,57,190,251,125,30,98,167,212,105,154,65,160,111,74,219,230,16,70,71,64,175,215,152,218,241,29,194,239,95,166,239,120,219,181,97,107,45,185,183,55,9,68,106,53,156,170,140,147,45,218,221,170,164,45,223,79,8,201,231,242,170,242,14,150,36,7,183,59,114,180,40,123,132,191,151,92,131,30,40,102,40,247,218,247,166,29,82,134,80,74,50,74,50,46,182,104,20,234,199,170,166,166,17,1,43,180,255,213,207,144,91,219,228,155,73,136,9,238,50,162,87,126,110,77,15,76,27,205,39,115,112,57,56,187,127,245,219,207,1,141,138,165,25,139,47,230,21,234,174,54,91,227,39,20,37,205,6,115,232,57,90,43,130,24,254,150,130,6,222,145,165,63,252,25,161,60,39,163,145,243,34,51,251,153,24,208,58,134,255,68,117,166,26,15,185,139,122,7,109,7,190,187,160,238,49,121,217,158,203,29,194,216,202,60,120,33,147,225,36,179,113,53,143,245,29,47,14,251,32,231,141,74,214,208,214,205,160,241,171,141,62,84,4,192,110,109,98,103,86,89,47,52,223,50,109,132,45,0,201,39,223,157,246,166,185,53,104,39,60,230,234,125,131,144,248,123,146,173,226,135,110,25,175,200,123,80,109,75,25,88,54,95,89,178,226,171,248,224,246,146,41,118,88,36,15,38,211,123,55,149,32,168,74,167,117,147,245,169,77,48,225,156,236,202,201,240,146,111,23,230,221,249,178,69,110,142,17,74,163,24,162,120,123,111,62,63,163,122,228,91,96,10,194,39,14,137,93,10,71,71,239,124,204,113,95,229,25,122,10,97,37,140,253,111,152,70,60,173,154,250,137,173,157,144,128,186,162,146,39,222,200,223,27,75,207,221,11,231,217,252,33,76,45,148,42,49,124,229,113,224,174,75,165,115,34,63,195,16,77,70,188,196,237,83,86,30,218,205,168,76,79,123,6,252,202,225,100,255,20,227,200,237,81,59,206,223,77,164,72,16,112,161,86,190,20,231,192,119,132,163,19,219,163,173,69,32,103,244,70,211,217,215,139,190,228,23,104,72,101,234,36,32,231,9,23,111,120,178,60,116,73,246,218,225,187,145,208,2,13,196,231,67,142,118,160,45,250,57,170,122,75,24,215,53,185,169,245,5,31,45,209,149,164,163,45,136,221,135,48,91,239,63,138,138,200,177,108,42,207,176,152,70,90,34,188,186,118,114,17,141,170,50,152,45,41,233,12,223,36,2,119,46,31,240,45,254,183,206,146,234,45,11,231,191,109,244,192,215,232,172,32,170,23,68,224,214,197,146,68,101,33,52,158,127,252,123,99,218,58,1,56,251,196,102,110,213,10,75,192,26,232,105,27,9,226,129,152,224,210,244,147,98,104,242,28,225,212,220,91,47,2,208,219,252,169,104,93,173,56,254,85,188,145,81,252,191,253,105,72,127,228,36,163,200,221,1,9,8,211,186,107,176,204,89,215,191,53,40,26,240,241,78,24,132,105,31,205,122,121,228,226,184,159,198,162,128,152,221,35,60,112,35,176,242,96,188,25,240,112,209,195,143,71,8,128,126,179,141,235,58,223,160,182,36,10,229,124,8,105,19,91,156,93,151,249,200,6,165,192,26,89,211,24,225,233,211,147,115,21,86,62,244,109,250,150,20,205,173,191,191,175,229,122,244,102,178,40,73,28,194,212,188,187,39,42,82,203,112,209,105,14,98,94,67,226,195,242,133,247,210,162,5,173,187,241,202,131,41,138,43,132,185,255,230,124,172,18,118,215,173,154,178,185,196,138,248,137,122,242,251,74,43,121,146,67,178,76,253,92,243,2,17,104,33,143,150,58,170,226,219,191,95,157,168,119,168,70,244,211,32,87,60,179,46,142,156,253,32,210,151,6,131,232,117,229,139,227,182,228,189,46,245,80,119,3,73,100,61,245,223,123,36,69,78,54,91,223,219,61,234,95,176,4,98,70,22,114,114,173,90,202,143,75,21,175,253,102,96,61,88,63,3,19,63,126,231,251,189,190,247,52,124,78,4,192,240,170,129,70,150,181,195,220,151,242,209,87,127,152,145,243,35,163,34,235,100,138,70,45,166,201,52,58,51,18,1,85,62,85,62,23,125,124,213,158,252,210,11,21,68,159,7,7,9,197,13,239,249,239,51,190,16,82,245,100,60,240,247,74,194,46,48,122,65,55,48,127,52,7,121,222,14,110,63,74,5,102,2,205,26,62,209,126,166,71,252,135,211,252,244,214,44,60,14,48,99,248,129,113,153,191,60,44,145,228,224,89,30,109,68,79,4,52,37,52,37,252,44,209,253,97,141,221,73,70,102,80,23,4,123,109,203,103,25,204,254,170,56,207,88,100,4,97,132,68,74,139,18,138,116,76,20,195,80,225,36,252,223,251,203,95,73,75,107,73,210,59,18,176,92,215,87,252,174,198,248,92,88,45,45,171,186,183,141,195,230,212,162,27,114,240,112,195,8,183,146,114,28,35,8,188,149,108,184,192,58,87,121,250,225,77,176,37,177,7,6,196,10,23,78,29,47,231,216,27,221,201,13,95,251,132,156,127,177,240,201,179,31,36,175,203,167,157,251,170,125,7,2,118,30,102,179,135,9,169,121,171,48,102,12,213,35,188,184,252,80,26,156,214,120,111,192,250,209,244,150,80,195,63,250,236,26,179,51,134,21,220,38,199,117,220,67,246,111,219,240,105,150,106,93,130,47,202,73,235,57,45,226,111,251,175,204,78,180,77,226,142,146,95,123,136,112,80,117,95,112,8,232,115,136,112,90,225,41,115,232,58,81,12,1,211,187,122,31,174,54,255,241,107,242,121,191,19,221,9,2,243,9,115,223,216,56,148,10,95,179,70,12,60,13,196,97,89,118,46,11,167,24,110,133,215,115,169,68,166,124,132,74,89,42,27,246,108,62,174,62,201,141,28,137,96,169,135,59,115,243,110,183,4,143,207,13,97,27,131,237,207,222,254,47,223,213,89,50,196,125,20,59,240,27,62,235,164,66,109,104,163,189,187,202,133,227,64,47,71,149,190,112,210,107,247,119,22,72,38,33,126,200,105,206,49,160,24,183,69,187,213,187,229,129,187,73,232,33,36,165,114,237,92,107,48,85,201,179,244,15,240,71,27,156,224,138,219,238,38,118,166,70,40,31,218,228,252,140,248,93,105,37,245,148,102,99,25,129,133,91,188,60,15,145,124,232,85,58,160,212,113,214,219,147,195,185,124,16,225,239,214,31,9,240,14,181,28,111,91,105,24,126,118,116,72,2,243,58,112,251,200,5,197,160,123,247,24,230,229,17,158,52,100,26,184,64,236,106,123,148,183,119,43,210,209,156,0,248,205,206,43,83,212,246,14,59,31,210,46,174,202,38,0,31,182,251,34,238,157,82,55,106,167,117,90,57,210,2,2,159,94,53,44,28,142,46,250,19,110,109,69,241,216,134,129,128,225,78,41,108,149,73,76,89,60,123,247,81,26,8,8,232,234,231,180,148,231,232,88,252,240,68,210,51,5,22,103,168,164,136,237,61,206,156,51,139,208,247,161,102,34,124,69,247,203,183,239,63,189,48,95,197,71,183,237,103,3,119,74,74,230,169,104,68,123,230,168,148,152,18,39,168,97,160,79,35,204,127,107,38,209,211,226,227,139,248,200,67,160,222,177,134,202,79,75,79,112,179,81,59,202,86,61,45,56,108,134,63,79,91,102,232,210,40,165,36,210,39,147,29,7,232,255,34,252,12,84,99,163,140,11,254,126,254,249,24,37,134,106,67,177,237,234,57,201,189,120,250,45,252,242,119,36,126,152,26,108,136,183,138,126,87,189,91,176,156,170,3,201,28,135,24,199,59,147,94,150,231,68,124,171,119,64,35,252,45,158,99,207,226,212,102,44,73,99,53,144,41,14,1,33,213,204,199,253,39,163,134,42,63,180,123,217,221,128,129,249,130,133,83,241,223,88,70,36,139,139,175,184,202,32,241,89,38,138,35,82,53,88,125,111,244,147,93,81,69,246,55,145,153,55,162,197,241,36,53,175,149,254,117,6,16,120,89,236,61,201,172,34,252,154,23,31,99,41,142,236,239,72,135,210,28,211,124,165,96,155,168,208,53,34,43,178,223,180,62,19,103,101,4,95,39,172,255,18,16,171,2,1,162,225,11,251,196,249,169,162,61,78,255,116,181,90,8,240,91,136,149,247,255,186,223,152,35,188,122,216,89,18,236,116,118,34,181,145,82,97,165,214,90,183,15,63,17,255,104,234,207,53,205,201,246,50,246,221,13,255,252,126,70,16,147,247,51,163,201,74,115,190,33,198,125,137,102,250,51,68,166,242,246,105,56,63,236,169,201,48,124,79,38,236,204,95,255,28,153,20,75,228,31,105,170,71,206,179,176,166,176,31,140,30,250,236,98,39,37,246,135,242,194,216,196,109,21,31,214,232,179,42,218,144,156,130,248,105,53,49,85,49,132,71,221,137,43,87,29,141,151,135,104,254,213,123,116,162,197,100,123,10,195,62,17,192,35,253,62,230,248,138,107,117,186,166,198,174,20,145,156,236,79,184,220,185,188,187,223,219,171,153,135,31,17,1,121,62,25,110,23,19,146,173,250,216,163,75,125,253,32,134,231,114,65,189,165,110,127,225,165,154,151,126,126,203,56,241,243,13,138,31,50,95,188,25,80,71,231,159,43,87,132,128,58,193,220,203,150,52,188,202,108,10,180,194,238,217,48,224,146,241,242,84,190,246,188,181,129,204,187,101,66,59,69,130,132,103,247,188,196,33,164,158,247,78,8,159,81,74,17,193,9,99,221,1,6,165,12,231,111,98,179,251,116,16,86,38,1,71,116,218,225,250,30,237,153,127,94,50,149,72,205,194,168,173,181,50,129,162,23,46,107,211,44,200,130,176,62,116,120,34,46,213,111,182,173,232,112,36,3,205,80,239,245,47,231,110,88,28,161,98,111,56,246,104,243,249,52,12,212,13,119,201,154,141,121,125,62,89,30,238,80,67,7,185,51,57,61,195,157,178,179,105,165,187,114,158,73,67,3,2,4,106,205,131,3,51,80,236,192,133,72,161,163,204,96,41,106,165,209,107,46,232,169,24,95,30,173,110,48,55,14,171,115,118,60,155,63,127,70,175,200,231,68,157,51,178,63,183,2,75,83,78,139,224,153,232,190,165,177,217,253,249,171,55,131,216,40,140,52,161,82,18,233,15,46,79,211,16,195,123,43,141,225,233,142,227,241,192,245,139,133,137,10,66,104,108,243,159,170,95,10,121,68,32,33,184,50,237,180,24,90,70,251,155,221,114,41,35,140,186,117,185,36,93,89,2,141,186,170,80,159,196,204,251,87,111,73,3,199,229,204,5,215,211,255,242,47,122,164,139,241,231,243,171,236,127,251,241,67,231,176,153,3,38,213,255,211,87,214,102,131,136,143,225,116,4,224,89,51,177,104,75,173,90,203,219,149,160,128,15,38,2,55,254,229,103,15,245,159,114,28,80,224,223,249,26,232,9,70,247,3,135,48,127,219,177,217,177,71,94,221,62,143,232,73,68,112,97,10,194,143,181,63,234,204,61,15,33,247,223,9,174,206,212,144,32,105,157,86,188,49,219,207,252,63,127,96,30,73,167,96,67,123,230,175,31,136,215,138,213,163,207,143,148,134,0,7,87,171,140,0,162,25,163,140,121,144,111,87,10,12,76,103,196,232,162,88,169,241,133,244,51,186,130,239,145,249,6,150,167,40,138,160,75,63,168,54,29,246,87,62,152,127,101,166,156,0,186,22,103,193,168,18,248,29,209,211,210,132,236,163,109,44,156,53,118,103,185,202,7,32,76,68,166,225,115,172,197,203,190,248,22,143,53,139,219,48,96,106,127,93,178,50,129,7,63,86,241,116,111,95,13,2,54,196,170,62,211,124,221,195,79,227,140,62,39,49,252,243,126,48,188,147,151,41,186,254,176,66,56,31,30,225,129,22,87,220,26,173,226,53,170,146,234,26,194,19,2,176,42,29,154,233,99,179,21,252,107,50,233,156,227,167,127,222,103,200,30,212,171,130,202,125,189,153,84,193,206,64,255,152,231,36,250,41,176,135,202,158,22,13,129,157,231,97,143,49,146,17,183,197,165,179,199,248,112,19,48,74,77,70,77,230,64,159,199,158,190,240,23,97,64,242,249,178,83,195,188,169,166,234,248,219,217,197,48,70,5,106,29,85,77,121,15,39,252,36,76,124,182,94,220,76,32,187,200,111,167,164,237,127,11,76,203,187,199,19,49,249,87,15,80,61,218,218,24,163,114,35,8,209,11,175,29,249,44,206,42,191,199,19,184,172,56,68,127,137,30,91,250,63,194,197,92,230,77,255,228,198,10,149,203,85,62,61,34,16,163,99,45,198,209,85,9,154,33,249,218,245,61,238,11,167,22,166,31,211,47,221,117,192,31,103,221,118,98,126,54,229,141,78,156,103,16,175,58,208,111,143,101,137,221,75,152,146,207,69,140,188,70,184,46,200,196,109,145,52,118,66,205,39,25,21,39,146,142,240,179,140,210,193,249,95,216,247,228,248,190,74,75,137,225,48,20,226,99,207,30,168,79,149,40,59,99,100,132,33,199,44,110,100,105,46,23,231,116,202,218,61,240,211,23,46,197,176,125,55,229,62,62,242,238,72,246,121,136,254,15,146,159,12,26,156,89,37,71,233,141,14,191,254,188,255,141,0,152,127,54,83,184,111,155,128,194,71,182,70,213,91,195,226,87,189,235,68,154,246,109,7,63,49,6,101,225,34,241,177,60,222,99,151,214,40,213,246,99,26,36,73,199,235,24,242,8,126,251,92,173,122,198,235,69,37,219,59,35,81,4,122,82,12,15,246,18,126,95,178,142,120,203,37,39,123,136,198,218,109,186,126,150,51,84,88,131,46,72,19,54,70,242,167,212,192,4,123,104,124,220,231,219,133,202,250,47,65,0,54,94,181,226,96,77,112,157,127,159,29,182,211,134,240,13,67,166,227,60,113,79,250,146,190,250,87,123,20,226,55,164,70,46,36,175,209,62,126,9,137,16,212,172,192,78,51,83,191,89,252,189,55,181,76,148,95,77,18,197,127,253,16,27,255,48,32,136,66,163,224,30,130,119,195,156,249,142,207,187,101,217,89,58,223,221,127,246,115,21,45,62,174,53,51,102,233,153,167,129,232,71,89,209,199,115,51,233,129,115,212,15,234,158,33,249,59,228,97,54,111,208,179,44,146,74,233,104,173,109,31,72,207,213,80,46,114,222,84,237,91,114,134,247,102,153,173,176,156,177,247,5,167,165,182,222,157,117,62,174,72,114,61,18,127,133,75,26,78,141,183,95,134,159,107,167,250,157,133,55,96,242,182,222,172,107,122,4,180,106,196,92,85,204,2,1,127,221,91,215,140,2,52,110,157,94,191,123,44,23,225,249,246,210,34,199,115,28,138,46,57,161,90,175,121,127,227,61,153,87,74,95,190,127,239,125,171,215,154,125,70,173,11,4,182,201,237,87,89,130,105,146,4,70,89,186,62,77,193,192,222,207,46,92,65,3,187,163,154,241,88,37,195,36,4,220,201,16,214,52,139,164,23,6,176,90,97,170,92,148,23,246,118,65,95,72,3,116,138,121,41,149,190,99,165,224,2,205,202,152,200,80,213,251,213,227,126,193,31,68,174,227,1,67,85,67,213,0,7,244,229,178,43,220,143,204,144,124,96,61,109,189,53,205,1,224,132,88,253,28,41,227,67,52,99,211,214,117,5,41,151,126,125,147,53,8,99,84,36,144,57,228,149,26,148,35,76,77,205,115,250,114,175,254,129,75,209,149,159,170,73,46,250,156,100,215,72,78,33,228,60,188,124,221,231,155,101,125,232,244,148,233,164,37,171,41,146,239,211,169,101,141,230,157,200,223,82,217,179,80,195,48,224,85,70,171,114,196,83,243,87,174,71,205,151,247,158,8,79,145,169,164,78,172,104,58,139,39,233,58,39,19,96,192,173,206,93,37,223,239,120,95,93,195,225,154,183,188,48,224,81,38,166,18,58,232,59,159,238,84,252,71,245,28,8,12,144,171,46,178,82,79,229,201,191,127,185,151,109,8,211,27,74,103,228,37,40,170,167,253,244,11,81,98,34,33,215,215,233,200,74,29,29,182,121,222,64,29,26,140,248,27,202,198,216,73,138,117,184,78,157,10,207,30,183,28,220,249,20,60,241,56,172,110,179,109,233,197,172,149,6,13,216,233,233,151,96,135,214,165,202,245,29,177,221,41,25,129,59,79,84,231,54,189,96,106,10,155,92,150,214,116,165,129,59,27,85,74,248,82,28,13,51,220,83,118,227,208,68,196,15,187,137,127,121,144,158,45,242,100,188,191,152,71,235,175,31,118,173,94,114,245,36,20,104,225,186,206,153,184,109,147,4,221,53,90,156,78,247,97,186,20,168,113,178,200,121,51,33,125,127,232,197,124,42,230,51,226,223,92,130,35,89,138,127,244,73,133,8,65,47,182,17,126,157,159,222,158,85,84,63,79,227,124,152,211,243,8,18,239,12,85,54,172,205,25,110,83,107,71,249,20,186,33,224,231,36,229,180,71,100,169,116,106,222,165,144,239,55,17,255,240,102,76,217,135,231,203,41,154,183,206,37,239,43,33,192,199,190,63,221,131,158,65,58,145,45,221,239,76,60,69,159,126,59,166,121,220,243,212,156,109,209,201,141,213,233,33,143,143,250,193,159,123,142,60,122,103,125,161,242,50,45,97,34,230,67,204,37,69,77,180,126,126,173,253,204,131,47,217,66,221,103,36,236,120,139,100,111,174,0,118,52,215,241,162,16,214,227,140,124,45,107,91,232,170,239,226,222,164,54,13,8,240,252,89,172,177,155,63,118,25,238,16,46,165,34,8,117,235,73,229,31,141,220,241,210,77,80,28,93,42,52,135,128,177,210,231,242,158,5,163,226,87,110,121,161,195,143,194,226,36,82,197,0,238,108,130,197,167,15,12,76,182,27,68,32,53,240,97,154,150,20,105,146,245,134,37,233,100,61,241,43,123,252,214,96,206,214,43,27,233,17,238,169,106,131,127,245,235,180,20,186,84,235,149,241,90,52,7,17,32,185,23,30,232,91,205,233,118,199,140,205,121,16,96,81,107,17,201,105,210,73,128,181,132,151,168,36,65,64,32,218,209,232,118,76,52,207,148,17,15,46,56,126,176,14,31,99,118,44,235,174,58,213,225,110,239,173,208,17,16,240,90,184,29,120,187,43,65,110,238,91,153,201,107,42,88,92,96,37,112,192,127,200,214,172,87,128,249,136,244,39,226,63,250,115,74,4,221,165,180,221,249,166,127,231,127,250,108,159,124,109,81,243,163,10,17,136,187,116,208,143,207,23,151,238,177,234,151,195,3,97,190,133,241,39,248,209,147,21,203,245,247,219,252,17,62,189,84,148,172,40,140,238,48,131,47,66,96,40,17,136,8,44,73,81,22,33,221,139,84,186,252,238,148,22,132,105,203,206,122,126,120,131,65,47,255,40,249,213,28,245,193,248,229,233,167,36,208,29,74,213,43,24,83,103,24,21,113,241,95,189,215,23,148,16,229,11,70,244,237,177,213,60,39,249,161,242,254,64,115,70,165,7,194,195,187,140,203,199,220,119,231,83,158,132,184,61,206,37,0,58,138,150,133,27,167,177,73,238,139,236,139,199,125,97,84,184,111,73,154,156,48,26,197,204,22,227,207,249,0,210,59,22,127,164,73,67,251,121,187,20,170,114,98,192,102,232,69,255,4,102,25,141,242,152,60,225,23,62,196,77,198,3,225,190,217,183,229,248,208,206,137,19,201,134,214,50,16,240,5,51,218,108,73,180,173,240,216,153,58,241,49,1,4,122,133,109,47,30,102,195,116,31,18,10,89,60,116,12,153,95,96,110,58,178,94,148,175,130,90,19,35,17,196,232,122,15,100,102,171,153,143,219,181,22,242,146,174,131,152,190,222,156,220,12,245,136,218,28,63,5,140,239,220,127,245,102,125,26,33,70,9,252,129,63,41,79,57,193,131,215,247,81,255,117,253,162,2,68,102,232,55,107,191,70,158,206,81,167,118,231,29,126,133,196,235,153,9,98,64,239,31,234,71,2,80,196,115,3,34,160,43,171,41,230,5,147,2,218,244,171,10,63,159,134,48,197,30,226,189,98,58,226,49,185,9,110,71,174,117,67,40,67,16,84,243,115,67,163,80,22,247,143,57,199,33,249,105,142,210,112,95,73,253,173,154,237,219,212,69,106,68,79,231,237,148,102,57,7,203,203,63,229,103,228,103,81,22,249,253,93,218,108,82,46,200,242,156,250,22,224,242,225,192,31,59,170,206,30,177,111,57,145,216,70,192,173,67,40,117,85,37,121,15,23,100,60,20,35,89,171,16,236,180,48,247,107,195,191,29,59,213,84,93,101,42,215,5,119,154,153,25,196,133,210,90,120,213,136,174,25,93,229,37,0,243,107,174,77,243,92,185,203,107,57,89,213,95,171,8,128,215,134,239,201,69,27,249,253,181,63,253,210,212,244,16,80,63,106,163,182,94,91,190,30,222,189,213,49,96,6,1,184,207,217,42,235,29,65,109,188,219,102,178,249,175,224,206,87,67,154,2,66,69,148,194,188,50,179,49,79,90,130,184,128,60,71,253,187,112,211,160,198,92,129,109,43,189,127,231,227,112,80,95,43,234,168,49,21,39,2,160,148,154,176,151,37,126,160,227,207,169,157,156,44,60,128,87,81,149,245,177,67,15,255,132,174,165,162,236,113,93,22,166,62,179,36,78,23,53,108,226,104,82,122,48,216,233,104,27,122,3,207,242,106,119,107,176,53,180,113,16,201,39,83,211,245,197,138,111,166,134,143,111,78,0,237,48,74,95,13,143,67,238,71,53,62,49,126,198,241,4,201,103,106,21,220,217,28,61,52,93,233,122,49,101,63,97,148,161,58,168,116,80,223,21,117,34,108,138,91,225,129,179,160,142,154,191,7,250,135,231,76,163,65,231,15,161,238,90,243,19,199,125,34,50,246,215,246,216,5,35,211,96,113,192,187,126,246,153,79,239,25,234,117,241,35,9,125,144,59,151,119,120,213,233,111,158,18,97,163,101,157,45,179,80,215,65,125,23,191,155,69,255,22,67,111,150,106,133,195,10,180,126,105,224,207,247,209,25,120,223,221,183,191,142,172,79,70,77,196,207,146,196,195,48,203,185,229,17,15,118,158,59,235,49,134,175,158,153,43,51,105,85,11,25,129,176,9,61,93,87,181,196,117,51,133,146,205,119,196,25,112,122,180,254,46,62,191,47,27,240,216,233,49,103,124,82,68,248,69,2,39,228,101,137,158,100,250,204,34,124,79,16,201,223,30,49,17,232,46,246,159,247,172,151,243,16,97,239,236,54,120,92,240,166,216,190,138,249,199,153,165,63,168,131,247,241,96,158,179,114,222,181,117,167,128,183,186,104,196,15,152,7,180,225,135,114,170,165,158,194,45,103,60,65,113,3,166,107,83,223,150,175,180,57,80,249,146,93,211,161,78,27,235,160,44,180,189,206,195,203,119,34,54,171,41,85,116,134,178,186,184,0,183,103,103,105,93,90,103,221,208,48,80,255,42,78,83,190,132,245,97,64,139,132,28,229,13,17,48,81,213,149,15,176,69,239,52,253,156,154,187,201,0,161,206,234,232,168,35,251,135,66,93,92,48,226,179,83,160,214,85,215,84,9,240,34,213,182,215,53,25,125,2,145,231,101,23,250,128,212,253,89,107,90,35,207,18,183,10,119,14,26,131,15,182,118,130,196,236,221,86,253,215,90,136,238,162,201,236,5,225,211,57,137,104,245,227,101,125,87,97,113,3,239,122,231,144,117,235,234,214,2,213,31,38,141,136,191,113,187,49,101,12,200,81,17,243,54,85,21,186,225,5,53,239,214,146,7,1,173,185,159,165,142,114,43,77,226,37,175,122,123,37,135,189,217,228,121,199,76,205,112,67,10,38,83,73,215,127,142,43,204,44,242,90,201,71,209,37,226,99,57,164,245,7,159,54,214,63,11,105,186,237,245,188,13,225,221,2,90,220,175,246,207,47,121,198,201,165,218,145,48,32,91,75,45,139,42,22,18,148,141,254,232,105,99,1,2,207,49,46,158,135,126,163,115,58,196,117,1,29,132,103,95,159,185,49,99,116,108,50,231,19,195,85,19,215,122,16,160,136,165,125,61,60,219,104,139,163,6,51,72,95,97,64,166,69,23,39,239,252,139,243,181,91,232,240,58,11,220,121,152,227,166,79,164,5,221,139,37,189,189,40,125,63,24,216,126,85,161,219,251,106,84,138,230,131,253,196,35,54,144,158,175,223,106,246,205,216,74,168,53,31,179,61,148,129,156,215,101,183,157,7,166,174,72,38,97,103,159,46,21,166,158,158,159,15,154,55,157,166,5,0,67,198,152,214,127,251,139,207,175,57,228,248,243,3,57,7,245,42,19,183,121,34,58,198,26,150,253,201,83,254,24,44,101,175,52,24,153,184,165,237,118,124,102,100,73,130,1,241,107,228,4,213,128,36,20,59,71,54,173,151,123,209,96,239,117,244,163,238,120,126,17,59,64,6,234,111,193,66,192,78,148,13,191,23,137,164,204,89,110,227,35,117,147,8,56,29,142,63,117,104,44,146,26,19,117,251,168,110,165,2,53,199,161,51,90,163,253,145,191,65,200,50,183,108,2,2,120,180,24,94,59,37,29,149,119,112,142,62,207,22,5,97,25,142,212,143,44,255,96,250,13,254,104,60,92,108,139,240,112,252,253,232,116,87,195,225,78,253,232,78,20,47,4,188,246,81,194,243,119,100,152,58,210,107,199,103,32,126,129,135,92,55,24,206,55,114,55,40,65,93,171,47,18,20,103,75,157,191,70,81,152,89,164,102,177,57,124,228,46,12,4,77,78,203,158,105,41,247,86,21,181,181,243,165,133,176,33,171,181,193,10,209,79,240,105,199,55,112,191,65,24,192,141,190,210,77,71,129,130,170,244,115,119,158,55,129,24,115,250,92,81,62,54,57,19,61,169,141,43,12,35,7,250,80,148,166,40,134,70,41,2,37,95,187,18,160,82,246,120,218,166,227,238,111,243,152,93,207,180,185,140,35,250,22,136,240,169,4,201,158,149,148,216,69,227,64,0,94,60,58,224,63,108,236,20,32,100,212,173,135,7,72,190,255,240,164,118,74,146,60,42,106,142,160,71,238,109,16,16,125,221,56,240,218,114,56,208,219,14,2,18,78,165,208,185,56,232,240,88,112,41,150,231,84,64,0,27,232,114,136,166,244,215,197,254,2,151,184,207,241,194,244,252,175,7,14,7,104,248,28,230,200,157,81,115,58,73,16,55,244,175,58,17,48,177,234,91,159,19,187,228,223,56,196,16,181,184,53,62,242,218,57,207,143,91,223,136,57,251,160,190,107,49,179,110,221,47,174,39,73,125,20,216,132,48,173,223,201,180,178,206,77,239,110,44,36,228,84,132,17,129,235,238,213,217,136,30,107,137,38,125,234,91,249,246,175,158,42,139,160,63,178,56,149,180,45,58,31,240,238,72,201,134,149,76,117,73,111,114,172,253,43,68,63,155,173,230,143,53,135,174,223,174,120,16,16,244,30,70,145,46,149,102,30,236,135,135,51,83,33,54,13,241,23,158,255,240,116,204,177,155,169,15,72,214,20,42,146,103,110,226,9,161,47,134,61,6,87,197,222,223,128,48,225,63,178,106,142,204,84,232,189,222,176,22,51,78,193,97,95,24,13,240,242,111,200,246,49,235,19,143,72,160,15,244,251,224,122,52,138,85,39,147,145,240,235,127,254,225,220,85,143,249,2,119,65,97,234,103,109,231,74,154,212,87,239,162,76,62,126,168,250,122,160,231,134,125,156,100,3,233,189,214,251,27,103,151,254,187,223,139,59,228,182,35,254,96,191,243,111,35,252,123,52,133,226,179,56,191,252,191,118,109,196,184,76,109,202,155,161,24,170,164,170,19,28,127,188,111,39,231,165,124,103,231,192,3,183,46,149,39,159,16,64,203,5,31,238,79,109,59,115,80,63,40,207,62,24,79,58,71,171,4,124,12,117,189,91,144,92,22,58,98,216,6,169,13,91,153,237,82,68,116,6,143,113,242,145,30,156,49,248,254,220,182,34,16,162,103,237,55,107,186,166,247,178,157,63,202,43,183,86,142,8,232,227,240,82,62,230,248,180,177,245,39,33,232,88,24,69,4,245,213,130,16,189,173,114,17,107,244,249,135,15,64,249,16,23,116,243,126,67,30,133,110,6,194,204,122,136,63,19,96,88,30,188,121,92,51,199,197,14,209,99,87,187,237,105,197,47,120,13,165,100,10,189,210,1,223,94,216,41,224,108,177,77,203,98,12,46,143,68,244,115,197,45,120,246,88,228,210,0,102,71,163,117,255,239,247,84,168,162,46,105,111,81,214,19,16,134,71,95,52,70,68,194,148,193,180,126,124,221,52,20,194,220,144,151,239,52,194,239,85,50,90,221,87,249,92,12,97,248,245,197,202,68,244,109,194,154,199,163,234,129,97,100,188,144,249,95,243,42,78,177,118,84,251,148,157,136,131,252,127,163,5,173,90,218,23,142,51,233,102,97,68,198,247,189,240,179,192,148,80,58,117,104,9,115,225,10,50,191,101,187,166,105,46,239,78,119,201,78,246,72,61,68,31,151,166,155,238,43,245,208,247,72,59,20,217,75,226,1,85,49,121,1,23,24,45,104,94,177,41,187,67,133,3,64,17,53,126,63,34,27,32,244,202,253,177,18,128,240,63,209,107,17,207,31,209,190,119,223,255,19,9,217,15,77,41,21,97,55,115,244,164,91,209,245,93,143,94,2,0,79,155,215,127,225,236,52,194,116,34,255,168,97,148,46,194,255,94,136,158,23,183,241,100,61,234,33,0,38,20,184,142,130,211,211,35,107,147,245,200,145,255,234,237,65,189,184,113,229,253,197,67,175,254,234,7,169,170,255,126,35,252,244,236,223,241,162,181,8,152,126,73,44,226,119,77,22,180,71,153,128,88,106,250,248,139,73,229,241,118,49,253,12,152,226,156,101,249,93,182,118,27,170,33,125,8,219,0,220,240,21,47,57,165,247,22,36,174,237,188,26,239,107,117,88,188,251,54,204,176,91,168,144,182,160,184,130,184,144,84,160,159,153,107,29,232,64,10,61,199,241,156,10,194,190,126,53,232,29,85,252,234,233,181,242,61,126,96,28,2,214,139,152,216,172,209,144,1,127,208,226,137,129,20,24,88,204,159,81,112,91,15,219,209,216,254,204,220,175,9,2,134,207,20,47,196,185,145,193,213,120,86,99,20,4,2,35,194,166,147,135,0,246,164,36,173,102,213,128,148,1,169,195,125,228,254,223,131,59,53,36,39,147,60,126,27,24,240,239,184,47,203,224,120,236,98,242,160,45,209,208,149,131,190,47,102,87,132,77,248,193,222,70,147,221,29,227,231,136,254,194,62,45,104,223,221,15,127,116,6,89,182,120,240,128,174,146,166,12,194,159,22,184,9,15,69,170,133,131,239,141,212,165,252,237,208,165,67,197,71,158,221,106,20,238,50,131,61,54,208,168,58,246,71,69,131,119,179,239,66,72,219,103,59,105,155,34,147,27,46,88,94,202,9,117,217,88,250,109,108,144,179,105,80,165,85,129,237,38,4,172,200,203,53,141,1,122,239,118,17,30,59,211,253,241,129,10,58,239,43,127,78,39,152,8,191,138,211,62,255,113,26,194,214,113,223,186,22,137,127,164,206,93,30,166,161,110,136,240,98,250,140,2,170,48,37,240,218,252,126,235,68,43,194,151,95,78,219,196,123,197,76,137,99,235,46,63,59,168,23,119,50,111,56,126,66,215,226,59,98,227,175,226,241,6,188,222,227,67,119,223,254,114,102,217,227,251,242,76,10,71,190,203,224,95,196,95,82,202,251,249,220,163,136,91,253,16,176,92,249,138,109,113,225,55,237,73,243,41,215,33,196,95,191,237,60,251,157,169,145,213,255,213,66,124,254,169,80,132,79,12,211,214,18,40,237,57,106,237,75,69,24,1,216,157,214,187,101,94,41,53,128,54,69,184,67,150,172,9,147,221,42,21,186,63,133,15,153,118,174,107,124,138,42,130,196,1,105,101,95,83,139,44,91,159,203,158,254,166,156,96,207,209,109,85,159,252,30,56,39,154,197,224,208,22,19,44,126,95,72,39,198,68,198,132,227,172,90,234,214,48,128,195,178,201,161,213,178,233,1,48,22,195,145,60,188,50,68,227,182,229,25,84,102,170,165,102,117,95,226,151,151,4,1,155,3,46,153,24,242,12,250,14,54,173,73,106,23,227,186,12,116,172,41,164,148,177,182,174,15,216,229,246,6,136,94,56,46,222,231,235,90,187,12,213,205,159,98,133,72,60,72,228,211,168,208,227,105,81,199,210,238,133,116,63,37,144,175,199,176,72,42,90,238,99,46,90,142,249,11,9,33,241,9,152,218,220,206,79,70,125,165,126,174,170,126,135,64,206,208,151,239,54,184,201,113,230,234,241,72,122,222,129,234,151,87,50,87,106,73,212,73,153,229,73,60,107,133,118,16,150,134,174,165,150,19,229,111,16,64,149,195,239,50,141,7,220,130,163,19,7,63,163,78,206,65,86,14,229,171,4,64,94,167,99,225,146,186,95,217,113,252,235,126,25,123,136,222,144,189,170,251,183,130,81,85,62,233,229,254,76,8,132,217,168,30,26,57,217,113,175,187,164,36,147,84,200,134,43,77,46,171,237,238,60,177,172,248,253,98,144,123,123,30,8,184,60,211,248,102,212,162,234,171,97,207,68,15,107,17,87,104,251,253,199,106,235,113,244,13,230,240,29,94,86,24,168,25,46,194,157,41,145,29,15,217,21,149,83,38,128,93,79,228,26,208,222,174,220,161,85,187,3,91,49,109,8,191,92,122,148,38,39,64,98,156,18,109,229,123,114,11,225,59,239,146,20,5,17,82,130,99,187,149,0,85,52,1,80,175,53,117,222,82,19,231,168,117,193,13,230,61,37,2,161,222,249,105,114,98,232,155,102,143,242,34,206,112,31,232,85,249,237,83,194,248,80,183,171,10,67,193,174,255,233,113,204,72,122,217,112,16,17,57,173,7,245,95,124,217,137,205,11,97,143,105,255,235,15,13,179,235,45,16,39,0,109,143,94,23,109,169,1,195,198,111,56,199,191,141,253,199,139,79,191,50,164,234,159,3,49,134,75,197,162,153,146,34,140,175,211,177,162,35,15,255,234,247,33,135,162,51,201,241,46,145,255,211,115,237,254,126,131,74,113,79,132,255,60,255,225,213,203,63,166,49,167,220,21,145,249,94,204,79,151,19,193,223,84,172,37,124,115,124,126,112,253,199,162,58,235,57,222,114,13,199,23,136,162,1,207,148,62,33,122,44,225,232,202,232,29,235,41,9,163,66,220,203,179,15,126,255,225,33,207,119,125,169,7,227,213,230,30,188,239,189,114,77,226,30,39,39,194,175,63,122,24,249,105,50,47,14,11,90,17,147,158,83,68,64,233,217,163,199,131,215,139,51,30,246,25,16,222,32,252,140,240,60,194,147,31,229,63,205,120,172,223,249,175,221,210,12,173,10,103,40,80,251,56,231,167,75,11,161,53,59,36,23,165,142,100,128,24,117,159,23,188,54,161,11,69,193,30,158,198,251,139,68,119,218,190,166,235,115,39,118,221,71,126,139,157,190,76,13,98,94,47,228,96,121,111,79,187,241,103,157,143,206,198,67,93,239,23,196,231,229,77,72,98,46,134,101,246,104,61,28,57,131,65,99,215,160,102,177,250,196,235,208,103,226,78,56,164,95,110,140,180,42,240,34,75,162,183,68,28,201,215,234,13,103,11,183,109,124,93,139,35,83,61,39,218,15,252,195,193,126,11,46,111,174,78,96,165,16,158,108,83,29,112,222,182,78,115,237,77,188,171,234,225,132,7,34,46,229,167,72,242,163,89,79,94,89,241,154,222,31,98,224,102,171,26,132,114,17,79,147,107,92,31,46,122,160,183,210,95,10,110,26,208,125,79,113,22,120,98,2,97,126,53,143,149,139,138,91,243,171,101,8,63,254,189,133,247,100,62,244,108,124,40,251,79,228,239,143,236,113,178,75,194,228,124,146,67,202,149,220,151,156,171,199,47,54,132,55,193,40,88,199,80,253,128,191,12,74,186,141,135,201,4,192,124,204,186,230,190,66,34,173,253,247,67,63,93,17,63,108,190,52,214,84,160,204,74,84,29,73,166,120,166,18,196,1,127,165,212,180,246,32,174,123,121,158,239,62,126,132,186,28,237,66,230,229,169,82,63,20,45,153,250,134,79,32,60,45,175,41,225,101,138,167,252,66,135,80,237,82,19,1,88,221,80,41,196,1,125,12,60,178,17,178,203,3,211,243,87,190,173,218,150,238,51,62,123,23,59,201,164,1,97,28,12,221,11,196,244,181,95,101,77,56,93,91,209,133,81,38,120,93,213,0,132,143,119,189,131,73,236,189,255,207,227,189,58,76,167,149,12,66,119,127,129,226,192,129,191,46,59,47,99,183,213,123,100,65,31,241,3,18,151,7,68,110,72,57,21,95,50,19,34,35,109,91,177,239,209,220,117,193,62,167,90,27,196,246,145,249,232,240,169,115,248,235,146,156,126,168,168,124,127,250,153,8,40,9,200,112,59,24,146,204,203,110,57,226,191,186,33,235,169,11,124,151,42,48,18,168,156,71,185,5,253,243,189,145,138,196,65,125,61,72,246,85,109,207,77,24,5,42,169,201,28,124,15,90,214,146,89,209,194,251,143,223,223,150,87,161,209,129,61,253,21,12,127,255,87,191,175,154,238,50,96,199,18,0,202,188,147,210,252,121,39,215,94,85,90,85,167,236,131,122,166,93,253,44,231,228,151,41,130,54,74,11,233,55,159,26,171,47,64,252,135,52,70,58,90,186,235,191,241,131,243,79,235,11,127,66,120,92,73,73,198,1,105,163,190,198,30,79,75,174,145,136,234,253,194,205,54,45,16,38,84,127,65,111,56,157,18,115,183,247,55,80,112,237,101,210,99,193,83,195,103,141,40,52,207,110,210,184,50,190,222,229,233,184,130,158,113,78,162,136,240,112,27,136,152,61,58,107,152,102,17,215,37,107,8,97,71,216,198,43,237,249,12,51,138,175,143,28,205,184,12,138,19,26,230,124,107,246,4,7,162,67,130,19,19,75,112,216,186,150,197,118,171,247,56,115,251,207,62,24,65,21,68,159,222,24,123,99,194,47,76,237,8,44,70,115,189,1,59,189,61,72,237,164,182,243,13,215,190,206,63,200,88,134,48,159,34,66,222,201,102,28,101,151,203,143,163,127,162,134,172,175,223,110,169,192,38,36,36,172,169,181,93,135,85,129,218,80,95,7,31,234,66,170,254,104,86,44,201,192,134,195,138,93,24,109,202,213,156,10,173,67,46,174,151,70,226,67,69,93,222,223,9,223,210,18,238,180,249,142,229,223,250,192,129,223,83,8,194,197,2,30,255,213,3,238,128,119,153,217,174,35,126,1,125,195,23,186,112,121,102,218,97,182,245,235,5,176,203,108,100,252,211,224,47,213,79,127,18,142,46,49,237,67,64,69,103,214,55,171,244,90,198,130,237,43,37,253,136,31,40,212,143,80,87,121,177,232,202,252,76,158,61,47,19,225,153,143,83,82,145,183,220,89,207,215,179,254,176,51,199,27,160,43,79,56,217,245,201,211,149,157,147,196,232,177,131,93,111,82,198,51,122,68,223,230,239,151,74,93,93,203,2,129,109,191,157,223,201,238,150,135,149,89,151,23,56,31,82,104,172,79,208,88,114,248,208,6,254,154,240,246,106,173,58,248,190,117,90,114,190,242,231,250,5,151,137,23,145,146,242,75,180,117,23,98,4,20,153,249,122,126,106,139,188,53,166,136,8,255,42,144,201,114,248,198,150,37,19,220,241,75,12,194,136,152,52,222,168,233,152,105,226,33,205,167,61,110,2,1,174,17,162,20,183,239,192,133,250,155,81,159,110,188,2,129,101,130,249,149,88,165,192,0,238,142,181,216,221,247,16,182,234,249,145,171,83,23,30,139,121,13,156,167,11,204,195,208,71,149,161,249,254,76,241,216,108,212,92,88,29,61,10,33,207,239,232,75,15,195,75,238,28,179,223,239,127,241,165,188,48,208,55,159,39,117,183,43,135,253,146,88,149,85,33,136,39,197,28,61,85,204,166,129,221,6,239,78,217,91,32,254,42,74,255,245,87,20,25,229,8,157,169,105,222,195,124,229,52,154,238,17,208,249,112,205,101,150,207,135,104,69,32,243,244,121,236,116,177,93,240,115,75,138,156,180,120,69,192,134,62,179,125,38,28,163,215,37,184,127,201,60,116,30,90,136,232,191,107,211,36,126,102,59,198,53,8,151,76,32,96,95,132,7,78,68,153,57,123,222,222,244,205,26,191,39,76,173,170,213,37,122,114,156,81,54,11,234,61,45,107,129,7,184,169,13,78,110,78,162,80,193,95,21,95,230,180,97,226,153,83,253,135,94,201,232,58,93,225,166,100,178,60,198,97,107,102,192,153,168,113,55,243,10,237,207,12,206,178,16,153,254,77,101,119,164,110,79,113,77,254,155,215,206,81,32,192,253,179,78,54,199,155,107,88,187,25,69,64,89,192,128,223,232,43,48,27,213,47,119,155,243,87,220,12,12,1,78,29,180,182,158,170,227,15,91,168,207,106,71,202,129,128,229,252,141,64,214,76,88,43,137,151,227,52,91,30,40,142,222,254,173,190,94,116,9,203,217,193,43,163,45,0,98,116,227,27,178,173,222,182,92,156,155,79,87,143,42,7,129,42,17,175,55,183,125,185,171,42,212,124,127,105,190,192,97,225,242,170,99,188,241,142,251,140,57,163,213,134,104,66,233,173,222,237,113,225,79,66,185,21,44,18,124,14,174,96,231,199,77,141,62,180,95,156,31,46,218,36,245,227,52,162,159,158,15,211,79,139,144,164,46,62,233,125,128,189,7,145,93,250,111,106,106,216,207,223,81,235,209,208,83,172,34,2,33,246,37,137,26,18,104,74,45,118,234,89,227,8,30,240,115,206,77,70,244,75,174,237,35,207,185,188,219,196,158,163,242,85,183,225,107,85,198,28,2,130,83,138,215,255,167,143,249,1,31,37,205,248,255,121,191,250,207,251,205,14,180,230,87,240,156,220,1,47,150,36,158,150,32,189,124,87,164,247,145,222,1,249,125,239,202,20,164,173,119,132,68,243,211,229,52,226,15,124,11,145,54,254,211,35,150,47,204,142,10,120,32,212,53,59,22,209,71,231,218,223,63,244,111,251,32,124,232,91,153,114,74,10,173,77,229,211,149,17,30,124,80,63,174,204,60,45,133,238,33,48,136,160,184,58,17,191,224,89,158,134,240,173,176,137,247,135,63,19,59,120,32,198,183,60,27,233,143,188,148,121,182,228,253,27,68,175,29,43,211,78,10,147,200,134,115,186,25,198,230,48,42,200,245,95,158,245,148,210,47,97,181,68,214,119,224,79,132,208,244,115,250,71,222,39,183,17,244,232,229,125,14,227,158,26,85,67,121,245,229,199,243,255,227,223,100,145,249,254,40,90,100,190,238,37,137,10,252,164,58,74,187,218,35,207,35,56,236,51,163,145,163,23,202,150,13,252,223,6,22,138,255,65,120,245,7,194,171,30,87,19,74,66,243,54,230,173,254,242,185,182,54,57,154,140,69,21,34,243,191,88,152,140,252,158,214,68,104,149,140,178,3,174,107,116,73,241,3,62,3,115,55,198,135,45,102,187,27,57,95,131,27,181,28,130,177,211,5,71,98,50,10,39,96,128,65,246,180,191,38,221,136,47,109,33,129,83,189,0,135,5,153,103,121,115,78,105,87,63,108,96,253,222,158,12,117,125,94,82,28,47,56,206,246,29,146,39,31,226,189,14,2,33,250,121,193,231,206,102,68,214,82,71,94,232,98,133,128,89,194,232,19,7,82,255,210,229,212,7,162,38,197,136,94,36,201,28,190,52,177,114,150,61,183,65,127,233,45,40,206,182,153,169,162,160,40,207,71,171,117,185,198,246,43,12,244,202,168,120,176,176,189,18,42,136,100,197,139,55,32,126,187,67,244,7,25,117,119,234,17,150,113,189,136,22,164,71,59,221,0,99,109,132,171,11,68,4,142,115,189,38,0,31,190,155,135,221,183,88,237,208,148,8,105,13,8,27,144,50,172,220,84,80,235,155,45,167,99,114,40,46,232,64,120,108,15,110,187,111,65,47,40,100,100,27,213,198,53,240,178,218,172,42,91,125,172,223,174,245,247,196,177,252,42,66,169,10,49,205,52,228,154,82,208,145,220,26,234,138,20,16,83,113,229,161,146,77,183,17,219,149,185,189,155,15,118,144,251,39,224,141,105,165,216,53,12,181,116,188,231,125,184,243,205,27,67,230,63,234,153,47,123,107,162,46,79,144,33,113,97,111,159,189,243,233,6,252,178,249,196,167,91,202,80,151,133,169,219,226,198,113,248,30,46,217,197,238,116,244,127,188,168,212,204,94,212,112,243,63,125,182,43,173,60,114,36,235,160,190,249,156,249,249,205,107,86,171,79,187,81,13,131,255,212,23,87,241,97,52,223,199,18,111,121,220,187,5,118,58,59,132,83,72,225,17,233,253,77,90,198,227,53,16,166,192,67,236,133,24,169,215,234,171,114,40,215,135,9,16,35,244,171,78,197,70,135,251,242,250,151,67,159,78,140,64,128,223,211,49,14,191,116,19,222,14,72,79,79,211,30,225,13,105,198,217,180,178,183,62,199,121,190,191,125,224,5,137,51,121,135,175,218,124,244,61,171,239,62,119,56,248,7,1,152,118,155,175,127,160,204,149,63,210,185,60,120,151,13,236,132,76,188,122,73,166,57,207,3,226,117,95,191,174,135,48,66,186,243,165,197,69,133,156,147,63,142,239,253,234,62,224,105,143,113,60,249,229,136,64,95,213,56,238,233,127,250,27,241,213,199,118,189,26,15,128,242,106,18,110,166,104,234,197,209,44,82,29,29,76,6,164,115,68,239,187,180,168,226,26,176,93,241,231,65,119,166,126,171,237,204,138,119,149,199,251,83,236,92,244,33,96,58,214,226,117,143,133,247,228,96,142,60,206,21,137,63,127,81,191,223,76,84,211,245,201,4,55,9,166,227,16,240,114,204,159,239,243,176,137,207,21,54,64,138,161,119,136,102,204,137,34,179,202,105,8,154,81,229,121,188,231,195,117,65,103,221,22,241,251,121,164,253,60,55,237,122,83,72,143,119,69,161,254,113,157,175,166,196,229,55,110,169,71,64,148,174,186,166,146,23,178,255,90,77,235,237,95,14,67,24,23,143,147,101,98,189,46,79,247,121,59,44,168,44,32,140,135,207,226,11,217,217,239,89,57,2,62,131,231,95,252,203,179,94,150,104,247,28,217,136,149,206,1,196,111,184,89,55,220,87,114,93,227,194,168,83,239,197,98,122,72,250,64,193,197,101,137,115,140,234,23,182,219,1,225,30,170,134,79,178,42,247,85,194,125,244,233,229,12,208,3,47,43,63,248,228,124,132,150,77,250,2,159,156,150,142,33,0,59,209,190,172,98,71,127,237,176,238,163,148,187,180,16,62,2,159,9,111,158,237,167,143,166,175,102,111,173,135,201,183,99,18,143,89,130,55,152,229,243,111,228,211,137,131,100,0,44,30,117,249,176,229,135,137,10,184,62,23,2,211,3,222,117,69,35,65,38,149,175,183,133,236,18,215,40,189,172,194,227,198,183,69,70,222,141,88,134,191,146,55,134,1,67,37,83,219,63,159,111,253,110,165,111,160,90,137,35,184,151,196,244,56,95,98,218,151,219,128,191,127,116,116,131,1,175,58,17,169,170,180,35,214,101,231,139,131,105,200,136,94,10,202,94,187,181,117,6,213,96,199,82,245,80,7,4,236,252,15,111,156,127,89,52,57,195,146,127,58,154,17,6,50,220,38,194,187,45,151,221,128,101,159,160,106,54,196,15,122,40,199,136,89,186,220,171,64,79,179,140,55,130,152,156,214,178,6,107,56,219,132,119,34,108,250,177,11,162,183,67,103,188,229,222,254,78,216,18,247,246,248,120,245,224,123,5,143,105,82,199,166,72,202,136,162,129,172,24,136,145,202,42,111,226,91,115,135,254,116,240,218,95,63,5,117,157,1,173,215,235,244,46,39,222,203,113,171,15,111,199,84,98,166,115,34,172,215,63,20,191,113,165,28,246,65,129,244,49,207,166,167,112,166,167,246,88,5,119,151,174,59,13,209,40,17,117,54,27,53,158,111,9,236,223,117,201,255,138,95,162,49,154,255,227,227,191,95,154,80,217,121,21,35,67,17,81,18,150,246,188,222,238,44,102,70,8,126,88,24,64,4,252,162,201,185,159,55,181,34,126,90,43,243,158,151,195,185,87,46,22,53,106,29,70,181,13,6,150,104,113,248,64,100,158,67,253,41,247,250,229,95,171,15,79,215,125,42,1,49,74,180,54,238,180,253,218,155,68,127,237,234,67,94,16,25,232,27,126,36,233,103,163,201,145,121,166,122,204,23,6,182,134,95,170,245,103,231,155,128,62,240,101,46,212,68,239,245,103,15,120,175,241,179,141,206,76,179,138,89,247,192,192,250,112,177,138,21,18,208,233,146,225,30,118,55,9,128,67,237,170,213,162,29,176,40,161,109,43,194,31,12,98,244,251,26,142,219,132,141,61,224,191,254,246,78,243,29,16,16,161,11,48,75,108,237,30,47,59,206,203,111,36,1,1,65,190,252,10,59,226,54,138,123,119,18,241,137,86,10,212,25,190,213,201,218,98,104,70,135,138,119,70,155,33,184,174,119,107,202,243,232,113,79,205,253,198,119,137,111,175,33,122,227,90,146,121,82,140,52,41,138,99,60,234,241,24,241,15,114,196,185,245,83,169,209,214,143,25,47,249,120,19,176,219,167,205,141,191,235,149,166,38,228,251,72,186,215,28,232,69,117,250,25,121,146,182,200,44,7,15,175,50,132,217,203,180,162,74,213,222,125,217,240,32,117,172,41,12,15,4,57,22,37,35,122,197,218,125,253,247,196,45,191,3,125,42,74,59,45,139,70,57,97,117,18,14,93,33,2,97,222,149,153,103,228,209,90,244,245,4,11,148,16,142,12,36,153,105,154,185,191,205,99,33,103,70,80,135,253,79,15,47,107,251,184,60,65,203,253,239,125,41,245,221,110,23,5,75,2,132,138,8,46,201,85,150,61,120,95,119,223,179,169,245,128,159,203,15,244,54,70,117,148,2,91,176,18,1,132,159,147,21,165,208,199,213,109,63,89,123,179,255,229,223,204,234,97,151,55,199,249,231,20,168,93,156,147,145,241,72,131,5,1,62,217,13,146,4,236,79,85,243,179,122,49,229,246,169,30,229,53,228,4,132,223,86,20,215,217,190,134,173,95,216,91,168,176,29,67,120,113,83,121,132,148,134,253,116,68,194,135,240,75,5,15,132,56,255,83,111,166,214,205,93,192,166,83,195,168,0,231,146,244,131,247,157,130,250,111,10,129,93,228,247,47,84,166,156,20,192,211,171,152,188,201,29,246,129,81,161,158,149,217,138,8,47,215,105,25,42,187,109,254,203,207,7,215,231,71,125,246,220,59,55,68,163,218,48,34,90,175,86,202,244,132,78,63,108,205,70,161,244,230,226,108,166,87,39,37,252,13,47,13,150,127,149,128,149,127,102,121,174,155,167,166,34,51,140,183,64,129,106,144,77,119,133,207,206,123,217,136,255,246,58,151,80,169,233,4,77,72,224,237,244,83,66,248,223,81,252,86,102,216,20,97,242,133,235,183,249,12,214,92,30,159,141,217,174,226,30,69,242,215,165,188,240,232,4,252,205,122,182,75,195,23,46,64,238,92,35,33,86,55,104,142,125,163,255,49,126,124,3,137,23,34,88,44,152,170,117,175,128,142,192,65,255,78,13,70,206,75,111,111,194,221,215,150,195,177,188,12,137,172,136,95,239,185,46,203,122,142,84,123,142,44,161,227,178,11,2,28,54,189,197,252,198,132,45,208,157,85,156,134,0,149,162,70,8,63,170,105,110,54,30,211,154,216,200,84,135,128,215,98,179,130,204,197,93,143,120,105,22,81,222,71,225,206,204,52,58,239,88,42,145,150,11,54,253,47,167,91,64,224,25,181,55,164,31,53,43,104,113,179,230,94,201,83,24,144,111,118,20,51,176,190,197,246,158,62,10,64,255,33,0,33,248,95,185,82,86,147,123,26,112,88,72,68,8,8,244,122,61,178,96,237,30,255,132,247,213,103,119,78,129,129,7,25,221,10,85,3,182,203,191,195,7,119,69,181,14,254,191,134,23,10,154,224,233,171,193,207,26,234,92,199,225,78,3,147,206,123,4,9,145,71,187,73,160,105,185,253,64,156,117,101,163,134,106,235,103,81,179,87,139,230,44,135,9,192,114,132,231,254,188,133,134,215,241,109,199,201,27,88,16,195,198,237,207,119,239,2,39,81,101,62,126,227,82,60,17,48,84,215,85,13,177,35,217,205,139,209,38,96,81,8,207,76,140,113,187,213,165,15,67,103,246,217,222,37,40,144,221,228,191,55,132,60,13,26,57,34,112,84,219,56,238,111,125,86,188,83,26,107,223,43,125,226,47,79,98,186,36,181,70,141,223,47,18,176,66,157,183,229,174,166,159,139,56,23,193,98,101,119,142,8,16,213,244,113,65,118,232,72,118,117,15,40,77,25,185,158,50,182,49,141,219,38,240,8,114,209,194,84,4,172,68,231,195,139,67,137,150,197,230,171,20,227,77,50,162,47,52,205,253,92,207,78,188,57,25,55,45,102,116,147,128,45,160,74,180,247,37,173,49,206,84,185,218,238,35,188,181,158,201,183,31,220,165,45,33,131,235,154,229,61,7,1,53,163,54,56,159,186,163,169,42,246,18,134,231,115,64,113,67,163,172,213,247,173,214,155,102,90,150,204,190,93,4,224,109,208,135,203,211,54,170,77,37,245,119,151,112,204,7,252,236,50,47,111,182,2,52,94,24,62,197,37,117,240,247,137,170,98,46,48,186,227,61,163,122,163,88,219,255,17,117,214,113,77,252,111,0,223,142,26,160,8,72,9,82,99,116,9,35,164,132,109,168,116,220,8,105,144,238,82,16,17,97,138,10,8,8,210,221,41,33,45,32,225,68,66,202,0,37,4,84,186,5,4,20,68,126,183,239,247,167,223,63,239,181,221,237,110,251,236,222,207,251,243,121,158,231,240,196,75,218,23,140,181,180,108,45,13,44,221,116,239,93,251,119,254,124,158,101,227,253,192,91,160,52,170,235,223,245,91,103,67,184,48,128,162,173,20,82,193,69,88,71,107,24,5,148,189,247,200,158,228,44,179,55,31,236,39,243,104,103,225,206,50,185,218,255,35,46,105,152,17,139,218,210,251,118,250,23,226,254,245,234,162,41,202,169,251,56,160,65,245,176,57,71,41,112,40,205,189,213,173,150,10,92,162,164,141,241,233,42,153,77,132,23,47,238,151,83,66,190,201,22,122,171,211,37,200,41,248,72,197,183,163,1,250,124,251,171,232,2,60,26,29,68,233,89,54,8,253,63,248,137,113,231,66,82,149,168,235,242,235,192,58,106,67,114,140,138,130,172,167,43,252,74,71,174,130,37,225,37,22,176,113,250,186,91,128,119,120,203,211,120,213,208,152,249,207,252,63,10,134,173,240,114,179,62,67,202,183,177,111,152,103,162,159,81,171,145,248,205,53,5,93,191,184,2,191,171,25,60,76,125,204,65,230,90,198,159,245,129,141,59,87,69,58,89,80,164,124,237,29,231,214,69,86,42,133,69,48,193,72,105,20,139,154,122,48,192,160,27,95,44,98,100,147,123,44,152,132,3,240,84,158,159,78,116,199,248,111,235,165,158,33,159,193,67,241,82,51,170,206,177,47,86,190,94,171,55,191,9,167,65,87,161,184,94,91,109,82,197,145,219,23,18,113,25,140,96,19,11,145,189,213,96,46,174,63,102,147,237,88,131,211,64,172,185,77,17,43,71,171,56,12,24,125,94,239,207,240,151,153,165,55,164,31,187,213,123,171,183,75,242,92,32,229,35,104,63,234,43,89,183,202,238,102,229,190,169,14,34,237,92,229,203,4,237,190,127,14,220,25,251,10,187,66,202,255,23,231,176,211,135,255,72,89,203,165,113,8,194,0,104,97,81,94,27,99,248,210,49,81,72,223,139,116,61,94,78,63,11,140,249,43,238,135,33,53,242,145,164,252,69,52,63,41,222,202,213,152,247,99,126,128,69,205,15,199,161,116,211,142,168,127,243,20,151,151,167,97,17,233,145,39,126,73,151,200,244,84,51,87,60,124,225,3,150,82,49,143,206,140,85,50,11,114,47,153,251,189,16,194,120,200,191,49,49,249,189,176,144,37,150,84,83,81,221,97,184,116,239,133,188,82,250,133,119,190,116,108,244,187,226,70,184,94,178,151,166,73,57,57,206,213,60,145,99,235,237,59,32,96,118,202,37,230,36,1,47,20,103,134,64,80,51,12,83,48,199,72,189,83,182,212,222,53,82,178,222,162,251,54,76,17,131,224,143,83,102,23,245,81,187,153,126,180,252,30,4,140,77,46,187,123,19,126,178,190,232,237,26,59,11,226,75,25,79,20,60,235,127,146,237,73,101,121,73,55,43,20,11,100,221,59,31,29,108,206,101,220,80,114,29,158,160,14,2,204,39,133,98,152,207,207,215,186,83,142,234,60,62,131,43,165,88,149,229,76,113,63,83,131,154,226,86,81,162,199,11,17,169,121,171,21,221,31,154,179,184,207,143,20,100,163,35,210,52,21,15,227,26,117,95,90,199,83,197,240,124,198,117,157,63,53,74,157,203,148,204,152,202,76,204,30,217,25,90,39,215,89,213,186,189,170,147,125,252,78,132,60,210,7,187,68,193,48,164,87,23,90,41,113,58,39,165,168,59,30,11,24,63,117,204,93,182,42,174,98,41,75,207,240,165,0,187,222,173,73,111,198,151,169,86,199,222,63,118,104,83,194,162,66,20,140,111,7,24,184,109,228,2,198,54,213,187,120,88,176,71,85,174,162,56,20,191,127,65,196,48,41,253,195,135,236,243,162,112,88,192,236,181,129,232,212,127,231,83,33,254,133,59,119,8,53,97,228,32,62,123,52,230,98,197,225,252,23,80,20,205,106,167,72,252,173,205,188,32,76,240,110,175,158,201,68,240,145,182,159,146,182,131,108,11,217,250,36,135,64,228,225,132,25,45,115,92,185,148,94,244,141,235,149,210,88,224,133,194,200,194,150,57,172,16,155,123,41,0,217,96,8,68,6,60,203,86,151,132,151,242,80,125,131,177,195,112,176,96,191,194,76,136,151,176,48,14,180,78,72,38,201,111,235,179,213,68,49,93,103,175,62,8,206,101,193,2,23,101,237,132,214,21,129,1,152,58,130,60,66,253,191,249,223,92,157,160,61,228,199,191,60,236,252,24,244,163,234,130,42,201,119,43,160,120,2,254,70,38,65,163,200,119,17,250,252,167,102,11,213,74,214,98,22,249,221,58,85,228,36,95,127,150,141,21,198,132,221,130,191,9,215,41,250,59,127,220,53,188,162,62,73,182,135,6,66,109,107,19,47,112,190,189,183,149,170,230,149,120,21,68,134,76,104,173,38,134,109,159,87,73,17,59,158,221,24,142,36,147,26,212,59,125,193,115,227,93,78,87,198,192,37,210,122,168,238,48,94,217,147,46,33,187,106,177,245,38,6,32,4,20,39,66,188,53,96,157,126,37,232,32,15,125,126,243,128,192,142,82,56,27,121,13,227,140,223,199,127,215,179,33,191,39,231,243,190,152,24,38,64,250,126,203,19,229,120,225,125,96,221,149,56,84,29,8,140,222,76,126,176,88,104,76,109,237,239,34,208,83,15,46,133,68,95,242,14,208,121,159,161,154,107,38,147,62,142,3,104,135,97,57,76,31,123,203,191,83,62,230,72,46,35,249,172,213,117,73,233,243,33,4,119,90,38,149,78,200,87,163,74,110,24,108,12,220,216,151,104,97,54,176,199,3,205,95,138,149,140,92,52,111,156,228,81,93,216,176,198,1,167,196,94,160,226,206,45,46,152,61,239,57,228,252,132,3,84,1,25,243,19,244,139,221,147,237,65,149,199,155,82,90,116,124,182,132,135,122,52,18,17,121,151,118,86,99,240,128,194,231,47,124,30,83,113,211,119,246,105,126,1,60,120,64,252,153,157,104,34,163,150,48,33,211,254,9,34,4,138,191,103,173,127,68,222,121,64,171,83,168,214,81,41,128,3,106,22,159,116,106,158,218,191,173,114,107,231,155,187,47,246,156,85,244,181,246,189,153,234,145,218,147,81,146,45,99,56,226,26,205,204,99,66,8,123,87,253,129,240,82,135,5,190,148,42,122,93,58,176,103,127,234,104,124,212,211,241,27,228,143,239,177,250,34,65,58,206,17,175,227,215,21,228,112,68,115,211,235,109,4,191,79,162,63,140,5,4,156,204,112,68,61,93,215,23,132,53,174,15,200,11,74,120,209,209,25,106,178,173,221,221,204,239,110,42,170,207,130,150,19,114,113,8,64,140,166,109,58,79,95,204,90,178,78,199,216,133,183,187,208,208,35,251,186,159,251,235,105,85,191,123,48,118,12,32,201,33,201,106,163,15,183,157,244,12,58,142,227,193,2,254,123,254,71,171,242,171,76,220,152,169,182,35,56,136,140,167,154,179,229,252,102,253,252,232,204,206,97,148,175,33,32,117,70,138,217,78,23,19,166,84,243,26,129,18,64,119,41,43,153,174,195,45,68,249,195,71,101,76,234,170,32,223,12,88,108,155,55,205,47,199,230,111,118,134,190,2,145,252,39,75,43,197,205,4,159,106,40,149,229,15,182,225,136,26,151,109,198,49,188,142,177,234,145,198,39,104,160,241,100,39,42,31,83,34,68,159,100,210,157,55,241,169,240,191,249,226,111,43,93,131,19,183,32,30,47,90,52,204,50,135,229,171,35,95,228,243,150,255,217,214,24,208,225,241,208,226,17,25,236,41,125,239,97,93,36,125,58,112,51,141,135,12,166,14,249,72,218,157,230,116,149,192,177,223,222,165,73,1,167,33,255,179,119,173,96,125,17,154,54,160,123,76,70,48,128,248,217,223,158,112,197,245,98,110,226,20,181,148,247,85,28,209,203,157,80,68,160,147,207,95,184,151,93,87,222,6,29,223,221,92,190,136,217,77,73,45,200,73,101,167,3,11,76,110,218,40,204,155,180,6,250,169,162,142,168,29,64,228,188,246,141,87,213,93,183,111,248,254,126,47,111,157,98,8,24,171,234,202,7,217,99,142,118,166,13,182,16,35,127,206,143,119,133,131,6,79,200,119,37,205,255,251,47,26,38,105,11,165,63,255,78,19,197,68,242,253,192,89,66,202,70,162,105,211,120,225,207,99,92,196,105,177,135,71,11,213,31,125,147,193,51,111,17,22,195,194,241,154,183,196,154,235,76,116,167,40,93,232,175,219,13,199,243,204,126,93,245,229,189,61,188,88,80,244,192,242,49,40,164,229,147,110,230,21,124,255,68,111,184,126,115,16,37,30,240,188,249,82,26,30,185,16,77,181,226,245,246,129,188,97,196,162,221,86,71,188,178,167,249,240,153,184,7,183,188,249,16,119,34,135,20,235,210,134,87,252,52,105,22,95,213,145,124,179,110,33,65,90,212,74,246,249,90,200,219,108,67,64,83,10,35,236,105,1,71,113,108,117,69,8,160,73,245,102,242,188,238,198,132,153,239,171,143,20,120,191,224,136,150,102,215,91,225,15,11,6,123,143,62,60,191,237,15,253,94,194,242,149,130,17,61,63,220,215,171,155,220,30,225,144,73,108,145,162,102,254,189,228,223,110,37,41,200,101,146,198,167,239,36,33,163,81,47,160,102,124,35,101,22,135,228,76,207,107,72,31,200,234,88,182,126,123,101,166,6,26,31,161,139,237,37,103,28,201,211,230,63,168,248,215,145,250,145,117,72,114,141,185,137,91,240,60,124,50,70,3,197,75,123,153,92,251,169,210,39,95,120,89,251,210,63,135,248,125,162,193,18,156,10,25,85,124,51,101,143,94,71,106,132,185,126,97,206,222,102,232,64,52,88,52,158,122,143,70,157,254,189,36,149,157,207,131,153,89,176,183,158,62,36,213,179,207,254,156,149,69,138,136,137,136,144,151,135,131,72,51,92,67,216,41,95,7,239,166,223,119,67,62,237,131,168,173,137,33,15,191,132,228,170,244,31,149,159,185,96,56,64,59,95,231,147,94,216,253,220,220,66,132,127,65,226,48,197,226,226,236,110,14,147,2,56,199,230,134,9,130,227,129,202,167,20,74,108,132,176,60,243,136,129,123,7,214,32,202,85,191,198,86,164,188,20,57,219,18,50,63,105,143,5,24,40,206,197,42,95,73,107,200,84,113,121,63,19,8,253,95,2,180,37,101,224,117,146,149,239,131,183,193,108,28,144,240,70,74,50,133,44,206,237,199,221,209,215,207,144,56,128,249,67,100,53,71,158,26,130,41,130,69,118,42,30,141,0,140,107,149,3,243,184,68,15,195,110,31,29,115,227,1,77,185,224,160,76,222,238,115,241,76,55,41,119,99,120,203,225,13,171,38,60,23,239,62,99,143,83,212,233,142,196,2,77,17,104,3,77,214,114,252,4,237,207,232,77,13,80,8,174,51,236,205,69,216,121,164,176,114,36,139,145,193,3,232,49,162,168,73,134,231,245,12,1,155,133,106,160,58,50,173,47,218,156,102,194,19,67,69,131,191,147,97,1,221,111,61,72,126,9,255,65,245,99,137,117,225,53,137,23,165,36,95,34,207,118,249,206,182,63,63,195,223,0,155,98,207,86,216,46,157,168,64,222,127,208,251,47,63,160,251,179,195,200,11,191,5,90,139,97,138,102,153,55,11,117,173,66,244,27,90,154,218,54,109,56,160,160,19,57,18,21,145,158,247,197,235,57,71,221,255,243,121,72,252,140,81,96,104,116,121,200,71,174,210,108,228,84,103,46,66,29,182,176,95,181,172,194,251,154,205,254,241,19,250,107,51,187,247,182,127,95,231,81,2,35,232,162,245,66,229,60,22,51,188,207,199,13,111,23,147,214,91,159,230,147,252,244,218,69,77,70,126,134,255,120,188,111,105,250,228,27,22,236,26,219,86,94,151,210,138,69,166,76,148,172,165,130,36,127,62,191,138,57,220,104,41,228,235,55,65,73,252,225,49,188,204,197,244,228,58,198,155,84,159,243,52,93,77,20,30,156,28,159,17,13,240,145,120,83,158,171,44,14,167,255,122,231,122,247,156,41,22,213,208,198,108,29,72,29,148,75,21,39,252,24,89,51,77,65,8,40,207,85,148,132,35,242,223,142,132,219,221,248,47,62,240,137,206,104,25,143,48,4,252,93,10,83,229,196,9,223,47,222,14,103,166,141,33,229,19,167,147,37,209,191,19,167,227,43,143,71,26,254,199,99,190,81,91,105,126,196,95,254,254,152,126,125,206,142,120,22,139,82,81,150,247,14,96,11,76,19,76,177,65,120,222,199,2,42,245,70,133,117,74,2,99,88,63,148,85,161,205,127,251,251,100,18,56,28,5,255,204,47,99,74,117,82,198,97,94,223,113,200,23,30,131,217,153,118,140,31,38,94,128,43,148,138,144,191,187,85,60,150,227,134,247,93,10,163,141,59,117,31,27,129,136,95,247,242,159,242,168,2,115,38,228,148,173,112,200,151,30,109,103,207,38,242,181,27,63,157,89,205,90,37,213,243,210,246,103,127,238,158,148,172,156,229,238,58,198,18,191,238,169,245,195,97,209,0,242,117,149,200,85,251,191,249,91,108,177,186,161,11,154,18,120,32,82,220,212,117,134,247,54,207,7,166,40,181,180,125,200,55,189,126,22,227,245,62,217,160,41,11,210,192,60,44,192,23,195,125,255,178,28,79,121,234,157,102,92,104,14,30,80,90,89,82,13,14,56,79,247,126,236,14,182,204,0,7,44,230,178,220,208,9,203,69,106,80,191,188,100,38,140,119,137,163,86,11,115,181,43,160,45,145,148,112,137,215,34,241,184,72,242,195,90,201,78,240,23,101,213,97,114,44,192,153,128,186,92,200,23,26,205,173,118,87,253,142,58,30,144,31,47,16,45,74,45,175,15,142,72,60,101,20,132,143,64,87,140,202,55,28,156,95,227,117,51,187,178,117,218,240,169,202,128,152,62,104,108,104,225,168,107,194,21,196,37,77,207,177,182,106,81,114,173,218,239,211,160,218,105,183,85,16,216,89,211,60,120,255,227,178,37,190,219,60,252,194,121,60,2,190,118,220,210,115,188,101,34,255,133,242,246,137,53,28,81,6,195,103,12,71,250,244,210,71,18,43,17,234,124,228,199,142,155,191,3,208,173,146,178,6,106,159,203,47,252,187,94,235,111,133,153,154,220,44,110,125,77,129,39,130,239,46,199,248,199,202,23,239,74,221,253,108,117,5,71,180,182,240,255,130,249,161,58,195,121,197,253,213,134,23,158,56,244,30,151,18,156,179,220,115,166,187,216,146,41,238,159,252,226,71,136,58,24,57,37,242,74,90,236,214,63,60,105,42,98,73,231,124,59,121,118,199,246,159,250,247,104,165,245,56,127,157,143,237,7,156,14,195,134,0,154,19,205,105,175,139,201,110,110,158,149,120,189,14,118,105,105,218,239,24,142,185,242,59,22,81,141,23,221,192,35,200,42,222,138,141,54,218,24,143,156,24,161,220,58,32,245,239,113,127,73,152,114,138,225,251,97,243,115,15,242,117,231,192,85,149,69,214,134,153,181,253,176,11,175,93,248,34,28,227,253,253,153,115,18,208,187,217,11,223,249,72,235,187,28,146,16,191,9,135,35,63,146,131,47,191,194,195,196,57,249,89,205,116,161,120,87,2,89,120,194,124,152,194,63,112,191,117,213,116,149,47,176,37,208,214,15,69,226,115,96,76,117,132,212,174,52,93,19,253,194,101,67,64,248,140,40,171,197,69,140,216,76,3,123,188,57,128,39,154,79,234,23,117,86,111,28,100,6,15,30,205,220,6,93,104,61,26,248,85,110,233,113,107,95,181,171,5,31,99,128,139,42,242,104,79,67,248,103,191,28,187,62,155,119,164,126,19,153,232,192,241,202,120,23,111,71,145,169,34,18,95,252,39,9,140,175,38,135,46,142,169,191,217,135,248,104,19,244,0,254,177,127,47,103,149,86,93,235,43,196,83,39,243,221,60,163,121,88,112,159,241,12,139,20,116,127,119,158,189,62,47,51,149,149,86,182,17,43,168,241,199,239,49,93,28,39,208,125,10,9,24,0,143,209,86,8,116,132,47,85,123,53,14,172,155,97,123,201,106,26,26,146,103,146,118,147,115,142,71,205,152,135,41,76,39,204,189,11,164,21,206,84,133,14,183,45,233,97,81,69,61,79,165,134,12,108,118,13,118,205,119,173,2,135,41,44,62,124,220,156,79,204,13,194,108,142,46,85,222,135,124,215,230,178,71,133,199,108,186,116,124,188,94,145,14,22,192,47,216,144,234,133,221,116,238,132,139,149,103,131,72,94,62,231,46,86,225,34,217,106,7,35,6,161,224,127,242,157,190,104,10,37,106,135,21,230,128,5,16,143,62,110,78,6,22,152,164,156,25,159,49,153,82,187,77,202,175,155,217,159,101,118,29,16,33,199,68,20,168,227,136,87,140,189,39,225,213,95,91,155,54,42,83,190,36,66,241,73,183,82,146,98,248,74,165,31,1,55,87,15,251,119,60,165,147,13,135,112,75,52,10,254,90,130,248,233,187,24,80,194,37,187,63,30,156,113,93,240,13,14,201,59,30,47,203,126,237,52,253,234,114,91,67,101,59,41,159,126,49,184,196,36,177,76,177,106,32,63,156,6,68,158,57,89,68,144,213,248,20,161,145,208,182,143,60,7,189,127,34,79,214,146,241,29,239,179,19,78,242,107,246,232,174,11,74,198,203,132,153,38,137,156,71,226,253,2,167,177,192,102,128,255,209,178,201,151,136,87,189,121,191,34,102,64,23,177,181,35,21,171,111,55,117,197,87,110,136,75,60,69,163,56,131,107,234,50,67,181,250,68,233,77,104,146,52,12,159,58,233,24,91,112,189,239,12,213,29,183,94,28,102,65,163,56,2,20,202,24,110,39,95,105,166,145,166,65,240,225,133,226,203,178,107,153,200,156,79,189,233,187,252,240,218,11,82,61,105,74,204,47,90,117,2,161,8,137,113,64,227,144,167,214,211,195,216,183,91,11,203,175,167,251,239,36,162,151,238,17,8,114,75,72,251,182,225,145,35,155,167,91,124,228,49,12,101,201,23,38,195,212,62,139,108,238,155,28,161,81,178,228,202,110,225,115,90,6,8,135,132,138,141,223,104,141,15,154,209,228,231,249,190,196,141,209,47,53,203,242,98,75,181,153,171,127,240,221,49,148,42,208,231,179,93,249,0,34,191,24,100,75,180,63,179,254,225,209,193,79,181,72,143,113,163,93,19,89,124,50,210,177,28,175,195,4,102,196,128,165,15,150,95,82,202,164,235,62,98,190,177,239,143,45,130,248,249,230,165,100,185,124,170,60,210,148,103,5,230,8,249,232,50,3,59,227,144,155,36,119,252,32,45,131,31,136,178,241,66,187,208,231,154,164,215,221,251,120,96,237,65,202,111,81,220,138,47,139,190,228,28,102,68,198,16,142,69,53,43,200,122,106,80,11,251,81,31,228,91,129,191,73,249,42,111,157,118,204,119,186,143,51,109,61,156,6,32,158,120,101,63,38,241,36,76,219,225,14,149,25,136,0,162,173,157,173,213,95,102,112,59,4,233,184,26,243,145,183,213,24,44,212,41,173,188,27,219,123,239,158,187,109,8,92,119,128,120,202,7,95,190,176,56,57,115,11,3,241,208,165,226,31,62,116,137,8,200,37,189,25,166,80,169,127,83,92,99,97,17,186,105,30,140,49,226,129,226,141,167,194,149,201,51,45,95,170,179,190,152,96,203,65,32,134,162,16,113,202,183,48,63,130,140,87,90,125,244,244,27,205,213,165,178,219,66,230,61,29,224,213,227,158,151,131,180,203,47,52,156,143,178,117,10,240,213,41,124,67,26,131,218,38,179,141,229,10,102,251,155,15,74,62,203,87,212,66,254,188,113,126,89,179,161,181,187,171,198,178,44,244,7,90,195,36,190,41,116,52,98,39,88,247,217,49,245,9,106,195,94,234,209,110,255,131,224,214,39,85,117,41,213,5,38,36,126,21,167,94,144,130,195,76,60,25,56,153,208,208,249,122,148,230,67,188,133,229,139,136,60,38,59,39,77,126,221,169,34,87,89,10,211,91,75,56,250,206,98,12,241,218,161,52,251,188,20,252,210,87,120,159,142,135,15,72,154,15,95,151,98,82,193,236,237,23,6,182,61,38,241,179,52,89,77,18,238,96,108,89,46,211,9,249,225,35,159,198,212,75,162,24,77,151,45,186,160,57,254,191,235,193,39,2,152,127,140,211,92,131,246,95,145,219,226,173,0,175,98,38,169,215,40,125,254,245,73,69,126,248,61,249,75,119,90,30,86,254,93,79,14,151,183,192,20,127,34,146,230,171,255,169,215,237,180,152,154,216,62,112,252,51,63,77,236,210,81,215,136,208,80,35,249,242,104,254,150,178,80,69,88,128,155,85,38,39,26,117,249,196,84,42,103,7,74,91,32,73,49,86,236,46,14,40,129,113,140,208,164,86,12,73,111,4,7,231,183,225,144,125,189,49,249,87,190,99,154,109,190,244,108,206,236,64,60,245,43,79,149,230,133,23,222,26,12,38,155,232,194,47,205,125,249,138,162,165,114,101,56,140,239,66,106,198,227,144,175,188,7,89,174,108,176,42,108,90,184,255,20,189,71,202,255,174,74,149,230,36,204,137,228,189,126,224,194,128,67,246,68,38,177,167,153,236,239,132,222,155,190,29,122,140,3,26,114,249,62,156,128,125,224,153,163,224,206,169,128,120,204,96,217,87,146,165,126,250,13,217,87,250,8,114,26,136,159,30,121,207,22,206,240,92,205,191,89,236,235,118,12,241,91,240,66,208,78,251,216,140,250,33,205,13,50,104,124,248,159,90,188,17,143,244,17,54,64,97,234,198,162,113,17,192,9,247,209,228,18,80,136,133,221,213,112,249,158,33,205,29,233,36,193,180,107,151,214,2,5,191,193,133,90,12,163,238,206,125,156,91,86,177,255,114,178,54,185,164,163,19,79,36,246,104,123,83,236,127,118,129,165,226,67,26,210,240,68,154,71,236,74,214,176,124,166,249,113,244,5,26,71,76,20,217,154,206,94,80,44,154,87,74,158,124,128,160,131,23,162,22,203,42,106,106,15,229,95,157,100,96,69,131,56,96,139,73,223,57,62,53,54,236,86,226,75,235,35,111,60,177,187,31,180,129,27,152,217,54,240,163,2,109,234,112,128,205,224,232,8,141,131,244,204,41,224,131,126,18,228,155,166,170,250,242,193,246,132,227,223,183,172,159,192,99,254,204,239,174,195,222,3,83,12,89,13,255,229,103,77,191,147,193,61,190,129,35,250,120,222,123,133,81,172,70,253,44,89,184,245,3,218,255,178,130,18,218,221,10,30,220,96,83,41,225,70,5,249,160,243,207,94,110,245,13,205,224,157,55,252,25,90,134,192,69,73,21,65,95,11,130,210,211,40,134,156,171,14,56,36,127,115,115,83,250,207,172,39,21,153,35,22,150,144,255,89,92,179,185,53,171,20,207,96,183,177,232,242,66,237,159,245,197,62,193,248,159,23,18,146,232,57,105,206,147,242,157,87,67,202,76,223,215,101,25,155,143,135,77,67,190,161,25,64,16,116,140,122,122,33,206,127,196,163,159,84,127,120,245,103,129,177,64,188,107,149,200,6,12,5,221,207,241,47,89,195,154,60,146,252,27,20,173,181,246,255,204,103,54,83,196,231,21,99,140,161,241,168,192,143,230,116,54,36,52,174,49,255,26,190,74,234,31,176,243,245,231,188,220,244,151,220,118,45,147,206,23,24,64,85,92,158,223,221,12,238,112,124,104,189,7,4,64,254,175,237,56,5,95,139,178,154,141,97,145,31,213,196,0,162,172,194,172,102,151,225,133,254,19,215,31,104,5,96,1,247,189,213,224,69,211,211,200,101,167,78,118,36,29,216,165,174,106,181,42,85,120,1,35,247,76,168,73,196,0,139,0,24,152,234,27,166,253,19,100,115,86,74,183,73,245,146,254,179,205,243,114,97,209,226,2,74,188,13,71,88,212,20,113,237,156,46,155,211,61,227,221,242,3,227,34,156,6,124,96,185,112,187,228,125,133,53,245,240,231,244,7,120,24,14,253,239,250,112,172,93,206,96,67,0,8,195,41,41,161,157,109,72,253,136,62,133,246,255,205,191,70,116,69,168,185,106,188,31,250,119,126,183,196,72,140,27,193,192,15,122,53,226,137,31,38,181,51,116,239,140,113,246,59,199,236,206,180,145,214,199,175,175,18,132,230,29,12,79,19,227,181,11,166,151,237,165,152,27,246,166,147,118,3,184,110,112,183,169,98,81,95,122,214,212,6,83,103,128,79,146,136,148,38,51,190,210,199,154,193,138,223,86,187,47,151,81,230,254,234,179,195,186,200,75,53,124,223,181,102,110,248,144,109,255,85,187,26,250,253,22,103,118,191,200,2,14,43,174,123,73,92,92,120,192,189,148,12,77,238,247,38,243,177,127,21,186,59,147,212,127,201,33,167,218,244,44,82,202,144,125,153,213,134,84,239,228,254,128,160,51,21,112,215,95,114,67,113,230,255,235,163,252,64,143,209,213,96,245,239,43,88,192,126,99,177,185,72,206,64,55,128,99,126,138,142,9,135,32,27,160,206,90,201,211,23,181,238,31,235,227,130,254,207,188,173,47,154,207,156,11,121,225,159,112,105,255,84,16,196,83,127,191,230,50,214,85,1,239,168,77,128,223,1,139,138,191,187,160,175,173,105,27,58,150,186,215,56,213,40,77,142,227,85,57,237,169,9,17,184,47,208,150,53,14,221,117,9,99,63,75,80,186,88,152,251,243,87,226,123,1,190,210,147,190,178,13,1,214,178,187,31,50,229,142,42,104,209,66,241,4,246,155,85,218,194,101,204,53,87,119,75,188,209,17,22,241,58,187,57,98,224,79,111,141,160,109,189,147,120,160,36,119,78,145,13,30,203,147,70,158,72,251,105,18,141,82,8,151,249,22,206,3,180,210,85,172,187,126,12,66,163,106,212,101,150,200,2,152,100,147,155,111,169,215,253,6,129,120,153,15,94,161,26,29,137,223,17,81,12,162,56,67,192,38,202,39,183,119,47,108,67,125,143,114,63,168,29,226,73,121,115,69,156,141,64,203,201,99,195,164,200,28,232,255,124,162,228,135,160,165,191,39,121,204,238,84,123,22,244,122,240,11,254,108,165,254,1,231,237,101,64,210,0,164,87,92,155,254,149,224,199,84,198,122,47,33,205,84,148,212,159,164,75,210,100,213,201,72,121,194,198,49,0,134,133,120,234,63,202,219,92,56,104,128,217,190,210,222,3,249,153,207,211,84,53,113,194,224,217,173,123,235,43,202,124,26,176,173,74,73,163,118,61,159,250,76,221,91,76,148,104,212,197,152,193,220,204,248,51,61,118,39,199,242,146,126,145,238,223,185,177,164,122,84,59,149,24,61,17,85,116,215,216,218,249,121,130,209,193,69,16,57,82,251,254,23,186,235,211,6,118,150,0,27,45,158,235,232,74,243,236,30,162,184,238,149,254,88,70,18,30,118,191,210,248,32,215,248,63,63,93,79,125,37,106,140,129,252,233,106,105,178,28,31,28,201,254,165,103,54,166,21,141,82,209,27,61,107,237,84,183,103,242,189,57,94,56,236,175,127,181,191,32,100,140,15,231,144,242,99,171,50,21,133,225,225,237,19,55,231,134,79,66,62,186,38,183,185,117,208,254,187,189,165,93,23,72,64,163,48,39,119,185,178,152,52,128,25,145,212,157,144,97,44,234,72,217,76,95,35,18,22,54,225,244,1,60,106,130,226,133,21,153,101,169,173,83,243,77,34,101,138,194,3,255,157,207,227,101,86,207,27,241,32,50,112,164,87,128,187,140,222,23,79,100,165,174,132,226,135,65,101,135,242,213,43,234,157,197,90,227,158,217,187,56,36,238,73,101,126,186,207,241,70,206,106,168,183,36,52,190,53,235,237,150,158,40,182,77,166,105,179,68,36,219,146,124,247,121,177,6,26,227,171,178,151,20,71,102,8,118,77,108,40,111,230,105,185,180,123,167,45,114,231,65,62,19,31,214,152,173,129,38,20,44,123,55,76,217,59,162,129,152,91,21,217,106,82,132,112,6,68,29,165,230,12,6,218,191,60,29,139,134,119,174,220,116,56,168,84,199,0,15,174,85,101,94,16,135,63,187,58,40,158,72,232,254,91,127,68,95,209,50,17,186,159,243,119,219,86,238,148,163,96,226,213,63,252,68,148,134,199,69,199,171,113,253,217,206,20,72,239,186,19,142,37,255,55,191,24,226,97,120,45,205,141,171,122,164,124,238,127,248,11,111,232,22,19,205,162,225,193,0,161,255,214,215,56,32,71,41,26,123,63,97,75,211,151,247,6,223,251,134,143,95,52,117,146,163,203,128,226,47,103,165,0,145,51,120,234,60,134,123,138,76,174,120,0,111,123,71,162,109,159,161,199,229,220,48,124,101,13,4,24,84,139,36,141,195,174,102,190,152,120,245,139,144,129,71,104,123,212,56,206,216,166,15,138,196,193,44,14,142,240,192,43,238,227,91,31,132,241,15,114,247,245,158,235,145,227,132,224,124,241,154,58,122,14,123,60,141,242,173,235,203,120,96,80,53,52,4,214,20,243,107,138,184,87,80,20,141,47,21,49,246,147,36,43,161,163,26,190,236,61,246,86,23,15,244,73,170,134,220,206,26,217,235,90,68,220,64,243,24,70,165,213,78,202,23,121,95,122,254,182,61,247,133,101,24,214,231,124,197,138,103,66,58,141,194,67,218,206,95,45,203,184,46,189,211,13,145,176,205,120,241,166,149,144,157,147,39,33,255,244,168,89,127,80,108,102,189,51,74,21,117,178,25,4,102,142,150,2,221,95,220,213,73,202,70,182,91,187,26,186,197,248,93,57,107,227,248,160,129,69,197,106,13,62,141,39,234,189,179,207,235,187,187,254,68,210,60,87,183,254,33,8,216,31,150,6,239,32,210,174,135,134,76,19,4,124,113,128,35,154,107,92,255,19,204,0,255,185,223,250,148,27,14,152,53,164,180,136,157,98,221,187,251,212,155,198,6,141,39,22,63,145,20,13,58,202,39,10,171,213,223,189,119,140,35,214,86,22,244,193,107,93,85,106,39,63,93,187,165,142,39,86,213,202,229,5,181,241,109,127,98,90,122,69,253,154,52,63,170,95,182,217,32,15,70,43,104,51,162,190,85,82,105,227,240,194,238,120,179,76,181,215,14,175,90,46,24,70,27,175,41,122,103,165,120,184,200,172,84,84,196,68,131,72,79,209,155,203,220,12,59,74,24,13,45,245,8,97,28,82,244,86,139,138,149,48,243,56,181,154,87,120,245,60,228,91,54,147,53,179,160,253,219,210,92,118,91,106,56,78,3,33,150,177,62,93,109,34,193,165,230,191,51,143,198,2,218,246,67,53,95,140,89,129,211,188,95,216,221,12,65,33,192,163,30,149,121,75,139,90,159,254,89,211,8,12,4,220,143,39,184,23,111,152,246,198,189,149,223,249,221,141,69,176,26,202,201,125,252,61,154,148,156,83,235,194,122,132,67,214,252,184,163,194,254,105,101,115,247,246,253,250,86,142,127,231,95,243,100,64,83,198,248,176,46,117,136,215,118,238,129,101,146,23,63,29,156,77,219,87,117,25,2,187,140,12,93,215,125,119,213,133,55,141,227,110,103,77,254,155,207,228,109,5,31,91,31,231,108,164,143,131,248,180,99,223,90,36,111,145,189,177,162,231,16,10,255,255,54,235,171,56,21,215,209,25,230,16,200,255,193,203,166,10,41,95,159,107,39,182,82,230,166,225,144,124,108,119,20,204,164,246,7,187,86,44,97,72,241,153,87,87,140,61,151,9,76,227,66,201,73,191,239,56,84,67,241,4,71,185,66,102,87,91,195,113,199,100,72,231,42,30,16,45,71,160,165,190,87,169,89,180,86,54,236,41,32,13,212,163,103,137,33,86,51,22,198,22,220,210,163,245,51,175,116,180,29,199,9,126,219,253,157,78,9,44,194,212,16,255,55,190,6,46,26,79,196,30,104,114,69,83,66,223,135,255,216,89,238,208,87,158,159,79,236,111,9,56,197,226,137,19,147,175,57,120,231,216,164,2,11,230,158,238,151,146,248,229,60,11,31,176,182,113,15,235,175,88,49,131,252,244,100,73,158,56,236,243,193,94,123,219,104,87,22,105,62,182,185,193,34,27,182,77,185,244,164,208,172,6,226,217,13,167,131,34,101,170,61,213,67,149,96,188,25,72,212,209,116,140,135,119,222,106,19,14,12,114,70,245,226,186,140,26,166,168,183,10,59,233,212,48,100,113,214,158,134,128,170,160,60,175,187,38,134,119,33,177,177,121,245,0,23,225,60,96,62,58,93,100,184,198,169,82,17,104,171,49,19,153,176,124,107,135,59,219,158,241,57,207,57,172,133,50,78,232,214,44,193,180,52,211,217,219,161,228,13,211,87,127,252,146,176,71,91,201,108,229,248,144,118,35,211,38,62,12,39,4,52,172,203,170,126,247,89,191,147,249,112,223,40,23,143,32,107,24,88,166,124,36,65,70,187,149,248,11,119,5,79,84,84,149,200,9,71,234,35,110,48,49,96,210,190,66,241,204,77,175,227,50,182,12,179,54,134,241,229,34,106,28,17,212,117,237,135,127,103,14,29,69,207,7,247,253,6,17,220,107,235,226,198,108,15,173,68,115,103,180,47,200,144,206,127,80,83,143,238,121,142,154,41,86,52,95,108,198,245,161,93,172,185,15,154,49,164,233,158,197,251,46,14,190,136,52,234,59,103,97,253,151,77,151,233,150,19,239,61,4,17,145,47,16,166,139,227,59,37,204,12,221,18,174,140,216,165,14,205,45,38,170,159,41,186,56,155,177,239,1,107,122,130,212,157,126,161,223,226,239,172,161,24,212,150,231,246,193,174,91,201,27,159,93,9,195,178,129,241,63,172,19,33,222,199,220,43,52,80,85,238,42,47,92,224,73,246,144,131,190,127,3,125,58,177,23,17,244,62,17,225,189,212,46,56,128,185,191,79,132,49,63,221,86,165,122,39,150,219,30,253,141,105,173,237,103,130,159,207,170,196,22,89,145,252,49,47,13,123,255,92,26,82,223,82,233,97,68,144,38,229,50,14,136,87,44,43,202,12,118,209,109,177,229,136,186,163,133,21,34,216,45,188,212,221,236,154,226,211,206,146,116,255,138,67,106,186,15,242,112,190,65,181,205,172,110,127,99,123,48,228,43,19,125,168,167,146,189,57,67,166,203,158,169,52,131,35,46,252,210,232,195,68,162,37,166,30,47,174,225,83,32,94,173,156,95,175,185,52,125,177,202,64,88,15,169,12,118,77,111,171,125,97,136,136,46,71,210,155,242,176,134,161,33,94,200,45,18,84,227,2,50,92,44,118,88,154,32,63,243,41,76,190,32,74,80,99,100,76,188,177,25,240,167,62,147,224,6,242,69,29,13,219,224,97,33,62,255,214,199,24,14,243,239,60,230,36,249,88,61,196,115,248,119,250,164,45,152,30,11,184,228,16,173,23,120,219,118,49,146,59,119,190,114,54,76,154,252,94,64,121,250,121,73,120,89,184,19,37,83,254,125,200,143,207,25,11,212,41,233,152,245,215,114,7,113,52,128,200,142,15,227,148,252,115,251,199,33,15,15,244,149,123,255,155,255,213,254,40,251,112,148,237,191,249,225,251,47,59,172,246,133,72,245,55,249,137,36,223,108,226,28,35,215,125,7,241,220,47,59,249,2,154,192,235,113,46,70,216,213,12,139,82,81,49,213,235,137,48,73,59,126,28,90,195,195,0,150,146,157,120,180,111,229,242,62,135,22,145,86,49,193,6,194,8,55,74,115,33,255,132,193,74,27,67,216,12,254,171,231,241,234,224,247,164,93,132,120,189,33,183,12,47,239,168,198,119,108,30,186,196,242,145,55,203,66,62,207,241,245,166,167,90,134,83,98,221,127,231,243,122,245,94,149,1,61,196,87,159,174,66,3,41,12,249,87,114,151,203,35,159,160,251,153,206,98,71,82,231,161,183,138,72,69,230,190,15,137,247,245,197,106,104,56,140,194,152,58,50,75,8,68,54,53,126,188,196,79,29,102,224,183,241,193,183,149,8,162,84,47,40,184,8,17,200,127,153,151,69,167,113,12,255,225,231,192,0,49,92,29,73,110,14,197,3,207,190,20,175,42,34,4,248,250,114,42,116,122,255,171,79,154,19,9,70,97,254,242,87,227,166,154,87,233,107,118,34,22,184,88,79,202,15,230,235,210,226,9,71,34,53,160,207,35,245,63,140,107,86,221,46,76,196,164,159,1,145,199,19,22,253,76,63,136,161,199,235,243,79,134,103,254,244,163,34,196,92,18,228,42,250,114,19,226,177,67,118,132,24,39,20,47,53,181,47,219,175,162,123,201,222,210,117,220,214,232,169,86,29,147,139,146,108,7,129,51,183,62,62,180,129,227,206,114,252,228,175,115,236,225,237,246,80,18,180,154,16,72,130,145,63,86,103,49,138,192,2,82,235,109,45,181,102,97,223,17,187,159,91,15,208,188,229,140,163,234,33,248,56,115,42,46,114,21,135,79,29,120,98,108,2,85,203,227,113,241,159,191,120,219,92,15,200,160,120,20,35,171,65,241,121,254,177,185,195,93,242,187,244,56,96,87,98,243,71,92,185,129,48,185,224,103,95,182,100,156,134,212,154,139,67,113,154,142,208,217,111,149,83,139,172,224,183,133,226,85,243,144,77,229,154,202,115,167,38,46,62,70,147,15,14,127,31,137,51,18,164,81,225,105,191,51,126,5,255,180,119,33,71,123,127,184,69,146,235,190,52,229,205,93,124,47,182,226,227,237,190,235,155,211,13,246,165,5,141,249,152,215,212,30,155,22,181,31,5,139,102,2,195,132,47,196,146,158,231,210,186,247,177,49,244,211,192,195,115,209,1,246,56,224,163,1,133,110,140,72,113,75,222,204,157,12,236,42,62,130,204,163,110,175,4,101,145,57,56,86,213,32,163,134,3,188,119,4,150,79,125,90,171,84,73,168,187,79,14,253,191,157,77,46,153,25,30,31,227,91,90,109,248,68,93,240,68,22,142,130,20,73,145,188,112,211,8,151,48,99,35,28,176,26,24,224,152,52,180,145,49,189,52,173,175,116,25,79,20,16,173,78,80,126,198,210,130,22,199,129,207,173,112,196,150,186,39,205,24,214,78,174,51,223,55,31,142,161,113,192,230,147,226,21,29,54,12,170,107,91,50,223,143,12,79,196,94,82,69,59,123,227,253,17,58,238,119,25,224,120,33,237,138,125,217,197,107,154,18,123,7,207,128,93,24,78,136,86,39,120,234,67,205,7,113,19,214,198,212,141,199,195,194,191,250,210,101,2,52,143,164,139,204,162,62,235,190,195,2,184,117,253,82,123,78,209,207,161,103,66,85,91,131,177,192,101,39,109,217,60,147,141,134,114,41,117,115,24,140,212,79,203,238,45,161,131,117,210,219,253,60,195,215,87,88,96,120,81,79,118,214,72,226,68,194,29,11,47,102,102,116,151,214,101,139,121,66,101,229,156,182,110,215,113,71,35,22,120,191,106,26,152,39,171,126,130,129,6,125,73,190,8,71,244,242,12,46,193,124,168,176,112,143,213,106,216,233,0,145,149,180,238,235,130,205,135,85,207,181,158,178,228,87,225,144,149,169,119,84,211,6,104,149,247,67,160,128,182,251,207,122,41,203,87,45,228,84,88,154,46,228,227,242,42,146,190,102,152,82,93,42,115,139,181,223,255,240,134,219,94,159,224,255,100,204,235,110,112,2,20,111,184,42,46,11,250,134,144,171,120,107,133,32,212,64,232,247,106,152,183,124,110,45,42,190,240,152,159,93,139,79,200,43,254,218,247,93,149,93,38,185,236,47,234,156,77,56,232,247,82,124,53,93,54,90,117,182,54,195,108,158,106,112,245,82,69,11,151,82,255,52,223,206,12,200,126,50,14,15,240,63,94,82,196,68,207,215,184,213,241,255,24,150,198,45,169,172,221,60,34,230,24,136,155,204,247,109,158,225,193,33,51,210,210,100,205,189,6,2,229,41,85,39,79,80,97,133,248,124,141,234,89,66,174,49,201,229,208,156,12,152,28,218,98,89,83,31,231,186,104,124,164,254,241,236,241,112,63,158,104,110,49,156,224,93,153,62,217,30,97,184,224,102,51,216,83,8,138,165,137,61,102,131,159,43,126,172,93,187,9,2,170,159,7,233,241,101,159,21,237,25,245,92,45,51,33,63,154,28,210,254,45,145,61,205,105,201,159,219,236,128,3,204,92,147,230,162,201,235,7,67,84,158,52,236,20,253,211,31,43,141,112,105,160,209,237,218,98,76,43,7,158,120,1,87,155,242,230,137,62,79,0,120,206,238,185,221,159,126,43,115,177,7,194,211,198,176,199,255,248,251,97,137,105,178,138,151,64,65,238,177,23,169,62,233,94,7,60,255,242,139,58,81,175,221,232,67,176,203,64,219,113,217,144,231,19,79,10,227,222,74,182,54,228,223,22,253,15,131,153,56,178,232,173,233,139,224,101,51,175,212,49,86,243,24,186,55,90,31,36,181,196,213,63,130,93,202,74,198,91,134,119,27,212,54,167,138,190,50,143,241,145,91,56,189,223,93,52,45,139,178,252,113,220,146,207,70,122,190,65,151,34,91,193,125,187,3,181,142,254,233,54,108,239,93,205,165,150,57,125,58,7,41,179,95,29,29,130,164,126,246,37,222,146,229,197,59,234,214,212,24,165,49,44,138,225,40,96,56,238,62,210,47,62,208,108,244,103,76,37,21,51,185,198,133,239,19,136,241,131,233,28,23,213,24,190,37,176,38,66,107,248,119,169,150,79,38,232,10,198,15,83,80,16,242,6,110,158,125,117,168,221,98,240,67,245,17,136,108,216,24,74,107,81,47,34,160,186,251,187,82,17,188,229,240,221,99,19,177,107,230,28,167,16,254,110,181,125,80,252,207,211,61,178,58,247,169,147,13,155,112,130,78,17,83,206,168,99,55,29,188,226,203,247,153,200,242,246,93,7,30,216,125,83,40,105,222,252,100,164,162,252,44,61,55,5,22,209,191,124,255,164,224,120,109,143,189,225,235,235,170,146,184,37,144,47,160,143,186,231,247,124,174,228,198,241,56,39,216,245,245,224,210,148,29,181,142,48,33,243,71,150,241,111,62,68,100,31,228,35,91,215,166,70,53,227,95,13,210,252,205,143,253,38,77,107,203,18,175,254,79,253,104,170,178,32,225,139,58,218,104,174,243,2,169,126,227,85,102,214,118,246,235,99,74,69,111,79,77,16,48,188,249,138,111,49,236,103,159,142,84,158,136,113,17,14,192,21,71,59,48,248,8,93,54,139,11,199,194,205,249,200,85,234,117,23,170,149,8,224,51,208,213,163,236,39,228,119,13,115,78,79,204,187,182,7,40,197,16,68,24,228,63,183,253,75,233,83,175,170,37,25,186,26,8,157,39,213,187,142,162,170,21,89,66,44,157,191,19,28,61,32,31,222,184,48,11,239,88,123,173,190,134,253,232,32,1,246,82,15,88,171,38,59,188,127,36,14,94,60,219,157,63,243,234,205,154,220,44,230,24,121,220,88,199,111,181,32,130,69,0,241,235,94,104,213,245,88,124,206,252,231,235,108,164,243,29,204,180,90,237,24,95,119,42,169,97,107,197,195,130,253,254,229,33,51,179,154,217,243,66,200,63,33,31,183,188,236,205,152,98,247,173,235,4,47,26,8,117,41,140,86,19,126,225,121,205,36,106,142,156,237,63,30,163,60,58,220,90,48,144,239,93,203,78,87,148,133,127,166,34,59,241,148,176,64,154,143,45,142,195,138,99,28,108,198,217,229,158,223,34,249,95,213,99,172,36,188,224,55,129,227,140,150,58,233,249,54,202,235,82,197,150,101,95,79,111,89,151,239,131,75,246,3,177,199,215,117,62,230,80,111,91,27,28,249,128,200,182,22,109,90,86,225,116,211,164,150,196,119,254,14,164,122,209,113,212,186,162,139,142,83,183,240,64,87,62,20,175,56,213,38,67,199,83,147,185,67,255,86,178,225,223,124,166,11,80,252,112,206,92,224,144,237,9,216,53,180,116,110,147,119,47,122,190,201,176,108,185,192,133,148,207,68,179,202,146,167,192,213,240,72,46,99,8,132,174,215,173,244,159,120,35,210,86,11,137,160,254,179,126,140,201,144,27,56,181,46,118,131,196,83,18,95,95,169,209,168,97,213,133,7,120,187,175,181,187,88,62,116,156,109,251,45,97,250,173,122,21,68,133,10,42,4,248,217,180,220,110,247,150,240,43,66,64,188,28,237,14,210,227,121,144,16,111,216,159,155,81,143,7,46,158,221,190,98,180,65,61,199,69,232,190,77,37,63,228,123,134,218,254,147,123,155,95,191,88,176,87,8,146,22,7,84,115,239,188,176,118,24,56,117,138,170,203,171,203,96,56,210,121,246,190,99,106,191,239,13,171,88,2,221,243,73,60,48,124,57,39,8,6,192,195,34,232,31,156,188,214,134,47,189,171,233,17,91,246,100,144,161,227,39,63,149,247,30,206,69,197,152,47,160,32,236,229,131,240,37,219,131,196,108,28,224,203,35,121,67,243,109,159,85,129,221,0,252,43,2,218,62,245,241,199,163,120,53,65,248,233,60,166,123,217,144,95,220,90,85,244,180,48,200,190,42,101,18,146,93,135,39,202,181,74,75,142,153,17,159,83,98,237,115,201,159,225,93,152,215,110,91,79,238,185,198,204,9,51,32,168,151,64,32,231,64,67,105,18,117,160,95,183,70,112,84,252,5,249,232,241,88,176,189,235,3,219,114,101,164,219,170,17,70,164,201,143,198,209,41,201,82,221,63,187,146,200,129,0,17,240,181,93,113,214,163,253,197,202,109,134,119,218,124,208,253,113,198,191,172,57,229,64,52,162,68,96,198,162,0,19,133,240,48,155,252,120,32,24,89,117,241,49,249,44,116,60,142,204,203,77,24,194,144,174,66,142,99,192,181,99,190,232,0,169,211,166,178,102,20,113,14,54,154,111,203,221,240,68,17,121,165,150,192,117,229,253,150,194,74,201,48,40,126,16,168,150,246,86,9,71,155,179,250,95,136,11,174,7,129,225,143,223,107,157,150,5,58,207,59,249,178,57,120,227,137,229,85,210,145,110,151,242,171,124,47,220,101,75,71,224,137,72,1,145,132,55,32,89,219,135,10,115,222,168,23,56,98,114,204,189,23,152,144,223,207,57,58,188,229,149,33,30,241,245,139,174,166,177,46,100,157,229,200,157,185,26,140,7,90,191,17,69,103,174,26,194,88,17,120,125,157,1,60,208,246,99,86,114,191,109,123,122,126,83,193,231,212,11,28,16,252,104,241,166,65,250,187,92,101,38,193,183,194,153,56,64,180,99,187,206,198,52,141,107,237,23,235,156,37,21,14,24,215,109,48,127,52,159,58,47,47,103,204,98,228,3,2,147,105,2,251,159,28,10,27,114,34,210,94,158,195,227,128,47,111,118,167,13,61,203,163,119,238,205,61,125,251,3,15,212,180,80,163,223,176,101,60,59,225,111,46,243,97,16,52,232,114,242,52,201,78,241,168,106,61,127,16,165,34,6,2,79,234,117,184,150,63,111,8,203,199,106,73,237,66,241,135,153,118,145,101,204,136,20,195,190,109,133,148,127,23,201,135,236,223,98,130,58,99,31,254,186,189,203,181,9,34,93,93,21,94,241,51,32,25,103,243,51,152,187,104,64,164,212,169,242,60,78,225,75,90,243,129,221,183,82,121,177,165,79,53,117,164,165,12,105,253,206,105,190,107,224,17,133,120,237,126,115,89,242,85,6,33,83,35,120,191,251,16,13,216,168,226,209,161,54,118,153,81,106,26,199,124,246,144,223,91,180,180,90,54,211,53,206,116,78,0,126,27,131,61,181,99,27,89,74,55,233,101,184,53,251,62,89,111,224,97,86,146,134,130,65,102,112,152,247,99,249,37,253,5,220,18,249,137,224,249,15,79,140,60,185,158,190,94,113,14,135,226,133,175,120,244,44,75,167,93,120,217,153,245,21,85,176,148,113,237,151,195,243,68,61,241,51,219,129,10,178,137,255,212,155,150,125,191,201,215,216,76,127,242,234,35,119,62,114,247,192,85,133,101,57,113,133,39,191,27,23,174,35,160,235,113,15,234,147,116,185,232,170,237,11,108,229,210,147,248,103,209,52,203,214,182,191,113,166,188,83,36,31,139,26,189,180,98,123,136,136,243,205,13,154,18,241,180,225,139,152,126,145,104,179,78,215,142,108,179,96,56,103,39,15,141,247,109,231,230,50,147,223,254,66,87,7,210,233,74,161,241,56,161,29,163,241,136,17,249,192,93,165,173,71,1,15,8,231,241,75,58,14,68,58,154,49,3,74,141,247,241,64,240,215,215,170,2,66,230,161,130,139,100,6,74,209,120,226,180,181,126,138,33,250,227,57,33,149,253,41,108,11,86,8,27,111,44,27,248,169,126,68,54,135,145,178,207,254,31,255,126,65,240,82,188,210,98,251,250,87,149,183,52,57,70,138,23,99,111,72,16,193,30,36,185,42,253,194,162,242,250,43,236,14,97,2,118,87,74,38,138,167,188,176,165,143,169,131,87,142,50,40,44,91,88,110,53,8,80,163,81,156,190,240,134,244,102,224,198,137,212,158,245,142,1,200,71,9,216,211,139,243,253,79,105,9,253,194,252,52,188,229,15,150,9,123,101,103,173,43,233,210,120,249,190,53,84,82,241,35,116,44,41,191,32,82,27,31,175,181,27,54,131,40,241,88,248,83,48,177,28,185,223,119,192,55,46,45,77,126,134,209,86,107,99,26,6,75,130,143,223,106,187,129,141,32,139,95,116,173,106,127,160,57,148,109,115,164,181,130,38,79,121,253,162,34,222,235,195,186,90,203,100,0,227,36,182,244,131,166,83,247,139,211,13,228,81,122,77,77,108,72,176,212,68,199,104,48,244,245,227,190,182,92,245,22,111,83,60,32,217,123,87,112,143,233,141,252,157,156,171,115,17,182,184,136,52,215,126,151,232,98,97,123,66,219,243,177,190,37,28,96,159,39,247,131,38,225,136,95,242,138,194,213,88,13,100,156,67,224,129,66,25,149,190,212,140,77,92,109,170,56,228,155,223,149,191,248,114,224,47,214,17,140,154,189,93,254,242,115,12,21,175,252,45,199,131,212,111,240,105,182,154,36,188,211,56,244,85,125,216,213,191,175,107,32,35,53,11,77,58,255,214,159,68,200,225,172,2,18,154,64,128,23,203,158,180,218,165,155,225,138,94,93,184,2,141,47,254,173,167,207,87,216,114,3,11,59,130,155,142,91,65,224,45,69,131,216,169,222,107,69,83,212,15,79,220,177,197,71,156,190,203,119,255,242,222,125,194,145,100,32,207,47,114,60,32,63,81,118,153,73,42,42,247,45,44,231,209,182,10,94,136,172,194,32,122,159,191,195,113,102,207,163,115,186,0,47,132,245,136,79,62,57,236,205,100,93,163,89,125,251,52,14,169,223,223,32,114,102,247,55,91,251,245,243,51,66,76,164,254,123,243,165,236,205,143,162,66,138,11,175,94,212,130,182,7,6,11,57,200,48,21,12,113,27,217,70,57,134,64,136,211,211,116,101,65,140,153,246,16,182,246,171,19,169,30,181,150,212,175,183,75,253,177,29,217,99,75,136,167,3,131,249,150,63,111,126,69,237,117,255,156,116,253,47,255,231,30,99,100,205,219,46,28,236,58,196,35,82,62,176,218,153,245,99,153,119,32,82,161,221,124,149,169,179,101,177,114,243,249,209,1,248,119,125,180,107,47,138,227,221,72,40,137,119,21,233,234,104,120,56,153,67,101,24,61,150,143,188,237,220,232,66,181,34,248,248,177,69,167,215,203,4,233,8,192,112,48,246,116,104,165,4,158,123,108,221,43,246,63,223,141,23,186,139,188,250,237,239,124,46,236,83,212,77,241,95,25,255,244,247,95,88,55,207,15,207,215,10,211,210,8,255,183,62,85,142,23,174,123,82,151,242,120,242,195,12,25,193,186,244,254,121,86,95,66,214,64,165,131,118,205,127,62,202,40,86,70,164,146,196,252,211,159,131,148,143,236,222,240,40,205,202,233,159,122,218,199,138,124,240,24,229,122,235,115,151,15,73,253,59,170,72,253,28,51,190,37,249,135,33,121,32,127,109,24,157,171,182,232,189,163,67,236,44,21,91,250,91,95,171,122,60,84,39,243,141,201,16,248,231,251,16,38,104,27,213,244,116,206,180,98,123,177,134,235,122,120,107,207,13,191,108,219,119,214,183,13,201,161,235,73,151,22,133,199,9,247,219,62,124,232,2,2,174,106,153,87,44,124,3,55,170,218,20,148,110,124,130,198,11,34,42,235,48,204,104,128,13,93,189,109,185,134,71,176,15,220,87,60,57,189,122,235,115,212,222,120,203,1,137,175,217,33,48,106,120,218,103,117,109,129,203,119,193,37,186,81,117,203,224,229,40,186,19,234,42,123,251,183,65,224,116,174,209,13,181,162,87,63,105,244,75,200,70,120,241,75,246,30,173,94,117,141,155,137,46,11,86,143,206,216,146,214,87,103,110,210,243,150,136,72,145,171,166,241,159,133,142,95,241,118,125,116,195,93,79,109,232,249,192,215,76,67,26,66,97,78,85,204,17,138,252,169,132,224,225,197,24,200,47,189,79,106,158,144,12,124,148,75,97,88,227,145,133,115,9,208,174,122,118,186,195,181,173,192,235,148,193,11,0,11,244,236,233,171,160,207,70,199,82,208,165,187,60,223,194,151,50,86,140,134,40,12,251,71,211,236,158,75,123,83,100,248,58,149,60,73,126,202,169,136,56,116,243,238,65,213,30,38,138,173,194,245,118,83,147,4,85,187,118,158,226,115,43,140,8,131,135,197,65,243,182,172,189,172,38,89,151,26,228,167,118,49,243,31,180,215,162,19,93,149,59,239,71,169,97,129,146,67,129,32,65,203,199,54,134,145,233,112,250,101,204,202,25,15,205,143,117,201,71,66,112,101,158,61,152,25,158,88,213,168,88,213,156,216,119,233,76,191,246,205,0,56,14,112,245,101,153,138,113,88,218,78,239,248,142,184,203,131,23,2,214,110,58,23,161,251,50,119,188,111,96,135,110,226,137,233,146,213,109,97,46,37,190,154,125,251,19,175,155,121,187,39,220,174,113,88,88,59,115,73,119,80,124,167,195,66,252,70,203,165,24,28,21,45,184,111,89,115,123,217,66,241,134,42,150,83,245,208,199,115,36,114,142,110,236,44,142,88,156,149,240,8,254,227,112,160,170,46,120,216,47,16,7,28,151,132,254,210,9,61,158,58,12,165,197,58,159,148,38,183,179,211,183,185,235,72,232,78,244,165,62,27,124,48,76,209,255,110,248,73,1,24,82,173,18,241,208,115,252,33,158,168,248,178,61,230,131,5,95,102,202,174,129,132,220,53,144,152,249,40,197,19,94,232,125,178,32,73,206,127,99,23,71,12,240,15,153,36,76,121,13,112,43,129,202,92,181,120,98,190,64,118,157,236,171,210,75,209,157,205,17,33,223,241,68,226,37,220,35,63,111,43,61,205,234,198,55,74,87,112,196,251,161,143,8,240,99,214,95,155,57,27,129,113,41,56,98,120,104,164,5,102,181,140,201,127,202,213,116,131,130,244,124,166,158,162,208,235,231,122,206,58,199,40,29,95,192,3,213,181,212,242,188,195,57,33,103,45,125,122,194,6,160,223,87,43,203,242,36,236,56,3,166,191,204,139,140,70,138,240,173,93,179,137,148,233,240,108,141,255,234,11,163,193,71,88,139,101,8,220,221,116,247,168,142,186,149,18,202,6,249,182,247,251,195,2,211,247,100,163,91,101,102,67,201,255,228,255,112,203,135,229,152,43,84,214,79,95,174,196,19,187,245,91,91,59,240,111,54,147,27,167,70,9,208,120,94,29,225,96,95,85,51,46,77,199,184,155,124,202,196,33,5,205,162,154,211,31,126,30,205,124,57,168,255,53,4,139,154,127,253,24,171,23,73,65,179,107,236,98,229,228,132,39,154,88,232,61,68,204,199,219,127,247,50,218,249,0,241,212,241,242,143,94,238,230,220,248,223,148,206,167,6,166,113,68,39,251,160,62,140,213,245,61,253,203,239,85,66,49,164,250,232,143,53,57,232,195,211,160,169,30,227,96,28,196,239,69,83,217,60,188,35,226,203,198,252,151,148,5,44,160,63,241,190,58,75,250,78,47,17,38,230,164,254,5,3,24,227,116,149,130,156,225,189,61,113,186,115,9,59,208,241,221,111,148,9,126,158,247,84,53,139,182,191,218,136,67,10,155,231,43,101,156,127,93,165,100,131,72,144,158,50,4,148,184,209,172,246,218,152,34,41,43,158,124,191,97,60,17,52,237,126,100,82,73,238,176,253,150,106,235,187,15,14,249,168,241,70,150,177,73,229,158,180,215,102,210,52,7,105,62,119,148,129,49,174,74,37,253,247,241,242,129,30,233,249,148,142,182,167,242,213,220,12,100,140,207,200,125,64,163,178,124,24,208,103,127,108,190,49,112,73,245,54,190,48,173,25,251,162,137,43,57,244,251,172,238,36,249,135,77,50,222,21,202,126,202,103,162,238,51,13,4,249,119,107,61,62,124,228,105,209,50,31,84,84,19,153,126,171,149,81,237,182,128,17,105,154,124,148,244,170,42,25,204,234,155,139,101,144,223,136,179,187,153,31,172,192,212,123,13,139,121,137,7,24,64,240,172,155,229,175,53,88,152,109,156,209,57,214,115,88,160,40,236,85,156,172,197,36,207,229,129,215,88,29,34,22,213,167,96,116,84,115,223,204,243,167,211,189,15,78,83,184,82,178,19,225,95,199,141,165,190,166,255,146,226,46,71,97,94,147,85,84,217,151,52,55,206,86,93,97,21,208,219,128,252,191,243,142,228,244,210,215,107,191,187,67,55,245,200,72,190,186,120,236,191,225,118,62,215,178,222,68,251,33,232,114,114,212,223,34,190,254,238,48,231,15,1,111,151,188,97,10,221,139,87,42,214,149,241,117,83,121,247,118,55,112,24,224,65,64,85,38,228,91,17,23,119,132,238,197,49,130,93,159,191,43,146,252,233,235,199,132,239,227,119,37,176,192,224,249,207,78,149,28,136,115,228,77,133,132,114,34,169,127,82,69,58,86,148,16,173,46,176,61,206,83,255,103,126,208,173,170,208,170,113,179,142,242,79,190,82,119,154,7,186,179,47,153,242,207,253,95,67,67,195,77,227,78,196,9,210,253,251,105,242,5,65,248,29,39,25,50,78,47,71,200,191,20,174,20,111,41,186,142,216,109,125,117,246,32,252,233,159,4,231,156,187,103,31,14,4,96,123,137,203,223,123,70,107,22,18,146,49,165,48,194,48,14,249,74,7,226,163,251,109,211,244,205,236,42,26,136,151,163,154,201,229,236,53,192,177,101,103,134,171,104,33,111,119,248,37,177,180,208,253,223,130,183,157,126,143,3,44,88,84,112,3,62,164,55,46,101,87,180,156,218,188,172,8,135,196,107,55,138,101,34,194,80,70,77,122,41,183,158,180,9,6,203,224,117,52,199,23,46,134,102,241,226,110,178,162,187,54,0,252,36,1,102,27,21,123,86,126,104,186,155,212,63,159,244,188,58,91,129,13,71,9,171,112,167,191,249,66,172,49,98,197,181,61,144,111,24,42,191,18,180,129,227,20,174,212,124,17,25,172,199,10,81,215,172,123,225,67,197,171,253,179,171,150,48,213,51,252,152,193,87,249,103,145,12,218,49,137,191,182,188,239,226,128,45,30,201,3,218,129,149,189,213,56,107,98,180,48,78,131,221,222,241,101,196,199,109,231,171,145,107,113,49,239,72,235,173,23,230,9,63,89,210,82,90,172,100,228,63,65,62,251,77,121,113,75,25,174,252,187,44,68,47,219,98,138,86,59,126,182,25,255,124,63,32,162,125,127,72,102,228,255,243,177,231,148,244,18,175,76,24,195,204,255,156,239,138,199,25,84,100,88,56,226,111,252,243,38,159,160,115,7,30,6,189,174,48,229,180,110,254,156,200,141,136,137,232,46,252,243,126,183,10,49,13,114,182,112,200,167,31,122,65,254,43,72,208,21,247,162,253,104,14,252,153,15,174,42,23,214,99,188,207,227,70,202,7,30,228,178,124,214,177,158,199,241,122,230,250,33,201,199,75,19,229,248,8,92,246,81,102,15,70,72,253,157,161,109,210,243,252,110,95,55,174,91,163,149,38,39,56,21,38,74,240,195,211,82,166,230,55,29,240,208,254,218,69,103,217,109,122,134,36,200,95,100,75,30,131,128,153,101,239,35,231,48,13,234,19,91,107,94,115,149,144,95,207,9,109,45,115,73,82,197,106,231,181,11,182,129,192,23,216,68,166,29,61,66,44,94,182,83,34,168,30,235,66,107,175,67,215,157,218,100,251,43,74,251,237,141,79,56,32,80,187,228,224,36,125,114,87,105,225,163,241,45,20,14,56,101,243,179,32,103,136,131,193,84,67,174,244,146,26,94,8,46,198,114,105,249,250,204,167,172,183,128,161,168,35,78,8,120,178,127,114,34,95,57,164,192,241,167,246,11,16,242,177,149,114,249,28,30,250,120,216,39,114,254,6,41,28,178,96,60,178,40,61,80,74,64,163,122,155,59,114,14,231,211,26,190,115,45,166,228,183,83,4,171,193,197,75,84,24,136,151,101,222,216,148,43,233,81,156,245,132,175,242,120,192,183,175,87,224,4,143,110,196,247,174,196,207,199,253,184,174,33,255,240,190,40,202,215,22,25,219,2,219,71,77,248,184,223,229,251,215,3,126,143,199,228,54,124,250,194,92,138,3,76,237,84,172,17,3,148,85,159,107,231,180,40,252,112,128,119,89,178,83,180,231,167,36,167,205,254,220,88,0,4,30,70,225,140,177,133,71,47,162,35,127,94,230,116,133,252,112,120,193,77,95,232,156,215,88,2,107,209,51,79,28,176,89,228,228,22,113,235,73,147,55,29,51,87,180,155,161,86,230,246,181,145,201,138,251,24,107,115,153,130,118,106,76,148,208,218,5,173,235,155,202,190,196,225,207,187,28,99,88,250,25,143,144,101,179,105,215,150,233,60,59,93,25,25,44,32,250,178,174,32,11,223,161,26,188,37,252,150,204,20,11,112,183,22,228,125,100,76,54,95,139,43,158,96,62,4,137,181,79,114,58,224,111,62,69,60,89,229,235,136,135,238,167,18,210,141,25,108,75,158,241,65,148,41,79,230,184,33,254,74,72,115,174,178,77,223,167,210,140,93,10,91,37,173,15,87,37,208,105,175,242,171,69,49,218,179,217,224,137,210,141,45,25,193,27,65,11,106,135,116,138,177,52,88,160,255,189,190,232,60,94,129,242,103,223,94,14,250,37,14,88,148,152,118,49,244,165,254,20,186,99,62,165,180,249,15,79,95,192,63,178,60,104,106,15,93,151,248,141,135,185,90,216,225,73,253,138,250,196,62,70,68,123,224,97,158,54,142,166,65,238,112,216,245,199,211,183,227,52,64,100,141,171,104,159,224,151,7,137,110,39,191,92,29,133,198,175,246,176,126,217,172,52,47,143,56,146,129,129,158,19,15,115,183,178,55,38,229,115,5,36,212,123,70,237,225,150,56,197,6,78,6,246,125,173,205,100,61,145,142,208,228,235,10,240,13,221,132,135,101,238,115,193,64,209,54,59,112,169,187,207,241,17,171,168,105,54,203,83,83,81,158,59,248,94,178,138,169,185,69,190,230,169,165,131,11,33,219,148,200,115,252,184,68,112,154,120,99,88,65,178,72,198,196,22,15,236,127,238,146,28,153,95,57,115,106,134,94,17,150,103,184,18,19,158,18,158,183,148,235,23,102,144,143,204,136,2,1,218,114,172,130,129,154,122,203,249,80,213,135,215,120,240,128,202,234,107,37,243,195,242,103,103,227,198,4,97,126,88,64,222,173,189,57,231,204,153,248,52,51,230,235,182,28,80,60,36,222,238,16,55,57,62,247,68,124,239,214,9,52,20,127,224,106,159,167,191,106,65,190,241,103,81,236,201,38,229,135,251,118,16,148,210,143,88,207,206,94,33,220,5,129,205,189,104,105,87,234,3,113,22,165,211,207,71,5,177,26,236,53,210,219,59,50,187,137,201,217,156,139,15,34,49,128,2,135,212,105,123,28,252,217,214,208,186,194,15,238,63,245,177,60,119,28,250,60,245,62,210,129,72,94,90,185,34,193,101,75,246,134,235,58,63,235,94,227,137,19,214,239,98,84,243,159,150,159,42,136,217,254,152,246,79,126,113,96,145,113,70,248,12,66,41,89,53,4,138,79,94,171,62,188,195,231,164,156,48,238,86,117,245,17,6,184,40,251,79,255,142,48,246,212,87,116,118,178,255,239,31,214,76,48,8,40,76,201,250,190,249,111,62,117,14,90,75,172,43,63,140,49,188,16,4,170,35,162,25,118,28,140,17,148,178,207,156,186,147,144,30,20,30,198,147,217,86,51,156,82,148,140,167,108,222,224,128,73,245,235,182,143,54,166,174,53,81,150,152,133,229,67,254,153,67,240,155,251,221,176,247,126,226,195,220,13,47,67,64,225,156,159,45,27,53,161,130,178,158,42,205,249,62,62,34,86,24,83,32,200,239,124,234,155,183,136,197,183,142,74,42,180,136,165,27,205,236,183,246,83,181,53,42,248,71,32,50,233,86,63,223,9,225,96,145,143,204,140,173,185,51,56,36,135,78,107,88,134,255,235,39,2,204,138,73,101,11,210,228,42,66,126,38,191,230,96,43,254,239,111,101,241,74,14,83,136,135,201,14,133,176,119,130,55,105,86,61,238,78,96,1,225,56,140,137,194,89,219,32,163,51,111,181,131,232,240,128,236,219,34,244,135,153,171,47,187,3,104,83,85,120,112,46,20,47,41,173,203,110,155,53,23,138,111,213,57,188,199,247,166,218,61,28,68,211,106,159,94,34,95,240,161,155,64,163,156,93,218,139,211,147,71,246,236,18,191,87,95,36,14,246,92,107,91,180,146,17,122,107,52,141,187,127,101,237,57,136,226,80,113,119,2,205,111,105,188,191,107,225,237,89,241,215,71,159,38,79,241,212,204,95,51,4,30,93,171,205,196,138,195,213,228,144,167,198,200,89,241,176,187,215,202,51,73,249,190,18,163,32,154,201,240,15,79,213,10,35,144,26,81,93,228,127,120,68,24,127,19,235,170,1,160,255,30,47,140,49,193,163,160,123,132,148,15,83,69,170,63,117,152,182,19,228,157,163,39,245,223,47,205,61,47,10,159,82,69,153,108,89,60,194,33,53,69,138,133,216,217,111,47,139,197,111,134,167,105,254,173,87,125,202,100,100,23,147,83,135,70,117,136,206,35,57,177,87,27,146,27,142,47,29,125,4,145,232,56,202,216,182,206,136,183,188,78,26,209,169,80,252,231,254,148,188,88,245,76,88,136,223,244,244,121,30,89,28,80,121,63,195,156,113,156,150,235,180,198,157,94,45,200,15,70,85,150,133,22,21,50,129,1,174,110,183,170,107,56,228,32,77,113,121,218,232,218,35,213,128,7,94,217,10,32,210,191,177,87,171,68,189,125,125,45,87,236,102,123,55,228,191,101,73,165,108,158,89,83,148,191,7,222,54,78,253,159,111,223,238,126,238,113,57,50,219,132,248,131,167,206,22,97,247,142,200,10,232,152,56,214,245,33,245,39,212,162,229,143,211,78,207,162,219,26,253,120,128,3,4,63,51,26,105,121,13,50,249,143,40,157,62,219,13,2,12,20,215,78,60,250,156,94,52,136,221,236,188,104,2,162,76,175,109,149,50,161,116,181,102,107,10,155,115,163,12,129,18,151,55,209,6,167,224,51,11,123,151,74,242,185,241,128,194,74,31,206,200,182,235,92,45,121,196,93,159,99,28,242,226,195,162,194,52,103,141,87,200,91,238,204,254,206,56,228,108,73,64,172,105,221,241,230,140,202,135,167,231,185,255,240,115,173,114,108,49,206,75,163,243,111,190,176,251,231,246,12,230,201,141,63,175,191,206,29,224,10,203,226,201,251,235,199,99,199,239,187,232,92,18,254,242,89,237,218,219,115,248,135,165,127,222,143,202,5,120,120,123,37,138,33,254,202,142,56,108,157,101,248,122,81,74,43,158,244,124,157,248,155,255,236,79,158,17,34,203,25,113,17,138,15,150,206,237,124,97,210,205,48,167,232,62,110,82,53,4,98,188,234,147,21,69,49,49,20,183,35,223,187,120,146,214,159,47,204,194,39,38,55,241,243,66,96,120,4,159,6,236,229,208,21,137,128,253,195,195,8,53,117,29,19,220,83,150,232,211,161,198,1,37,58,15,149,54,216,125,10,209,165,38,73,135,111,190,135,177,104,29,192,248,163,51,126,225,129,72,249,11,65,237,85,204,251,1,254,166,62,242,148,80,252,82,114,219,227,164,208,34,241,40,211,228,61,103,50,14,85,243,238,19,91,22,61,118,247,172,46,43,123,81,26,30,168,105,94,148,163,7,30,193,30,33,20,79,213,183,225,17,212,209,195,191,189,173,66,99,175,20,209,113,240,93,2,1,253,8,50,89,16,35,70,160,187,116,49,58,129,26,79,164,121,64,101,56,58,2,132,8,139,149,176,107,77,145,252,57,52,196,57,167,113,152,101,81,49,128,42,151,196,231,126,85,219,46,19,176,101,112,157,99,59,24,7,44,23,87,109,107,159,169,159,63,17,94,119,230,249,115,195,111,231,61,212,117,175,159,214,52,69,27,94,137,201,71,99,202,41,215,142,15,147,107,175,189,167,140,168,60,95,112,140,7,14,223,8,240,45,38,61,213,155,240,174,255,161,15,195,159,187,223,157,165,109,85,60,41,98,112,106,102,181,70,21,7,120,58,5,76,211,122,2,138,213,184,231,134,254,35,120,98,108,10,75,205,5,246,184,114,255,219,211,146,30,125,56,98,103,93,89,16,166,158,226,149,85,182,69,243,25,110,28,177,188,40,173,9,67,121,58,249,209,241,79,79,118,118,200,111,235,228,82,226,234,159,88,102,150,37,141,59,65,227,129,15,39,81,146,193,130,14,158,149,250,122,198,140,2,71,108,172,41,233,195,164,94,189,19,205,234,60,96,230,142,39,214,202,181,216,216,138,185,235,95,63,174,12,234,49,135,182,155,90,184,27,78,24,52,198,170,244,222,82,103,35,205,55,215,166,153,252,36,186,166,199,85,175,245,84,66,62,155,147,214,3,111,120,217,206,189,81,69,43,202,140,35,62,45,201,235,199,40,124,18,218,76,95,239,212,243,3,145,51,235,75,13,252,142,155,111,114,224,33,84,77,211,208,254,146,117,15,69,127,152,224,215,95,86,231,25,68,144,158,167,119,133,165,231,124,108,236,80,133,199,49,229,89,236,74,108,161,69,155,72,246,55,130,59,200,14,31,202,1,1,231,251,52,204,227,106,169,126,11,110,203,2,70,77,248,37,242,181,219,214,47,101,134,245,46,20,174,187,166,156,34,249,163,86,76,230,6,97,172,146,39,91,226,10,196,251,251,148,119,159,12,204,12,215,156,64,240,210,192,120,65,100,37,69,75,175,160,161,196,72,150,72,250,8,129,11,68,110,185,187,191,144,252,249,244,229,7,158,217,225,1,82,191,147,251,169,244,67,6,158,94,74,122,10,151,154,214,13,1,59,156,153,138,167,49,198,181,153,89,158,163,222,236,63,94,199,151,177,149,141,186,128,93,126,158,129,59,190,57,54,107,251,126,1,126,251,22,32,42,205,250,168,227,92,202,80,153,76,228,149,3,27,183,127,227,137,89,48,193,201,149,210,53,141,228,135,187,184,91,115,167,150,85,77,135,30,252,144,148,150,1,137,247,9,15,75,224,93,206,131,21,10,141,183,109,200,32,222,206,170,238,103,152,222,150,178,50,153,165,89,142,130,182,223,43,61,201,96,114,240,170,200,239,23,249,44,129,39,54,182,74,243,6,21,179,85,207,160,127,24,220,165,132,226,23,121,121,251,183,56,163,231,39,94,247,32,177,183,112,128,187,215,180,27,195,113,249,96,93,202,6,103,170,47,8,228,252,72,219,182,237,59,106,63,113,211,126,115,234,30,233,248,47,119,103,228,237,182,184,234,210,115,124,190,128,192,98,106,212,193,246,13,103,229,18,246,233,20,129,29,176,151,77,204,89,181,49,219,77,88,191,235,29,178,127,26,7,216,244,221,155,142,209,29,108,175,202,190,205,61,182,142,17,225,171,8,222,203,110,170,8,106,187,251,145,166,148,3,135,44,59,120,33,207,33,155,153,33,18,50,220,74,237,130,69,241,70,173,129,147,169,241,51,176,93,115,99,99,155,25,77,246,235,23,45,228,50,152,125,222,39,225,178,56,174,204,240,167,249,108,181,165,170,166,202,219,122,245,209,197,243,147,250,111,57,79,97,158,121,158,178,198,30,86,89,111,225,74,25,61,68,218,38,10,222,174,159,173,186,240,118,247,29,94,227,62,230,226,61,207,215,75,218,172,44,66,97,148,141,224,83,141,232,119,218,25,15,241,226,46,243,130,89,215,79,163,81,41,73,10,37,143,95,251,49,179,71,85,180,181,28,87,247,37,44,159,121,162,20,125,58,197,80,20,212,162,83,0,81,241,125,183,43,124,68,125,223,26,108,126,45,107,184,1,118,93,193,219,175,74,101,128,101,177,125,63,158,22,147,227,128,193,89,7,75,61,157,180,192,171,209,146,82,176,101,82,126,244,72,206,166,53,110,72,231,210,10,5,167,205,112,100,66,100,219,92,209,230,72,78,53,23,156,210,52,14,15,184,231,206,201,185,101,159,12,186,192,134,121,72,125,169,77,48,73,252,218,41,159,199,193,117,51,6,13,15,63,173,226,128,44,41,197,230,84,152,1,46,236,25,220,54,7,134,69,13,194,193,23,185,247,204,52,226,71,25,204,146,66,103,40,18,74,107,36,232,87,223,75,232,115,244,172,82,201,224,128,52,150,59,77,22,172,244,211,57,224,116,72,237,60,190,212,86,204,87,111,188,184,117,170,237,149,17,185,62,128,7,78,170,215,90,177,217,130,40,181,230,160,109,247,39,56,0,83,24,238,1,242,49,213,209,214,54,159,124,155,8,2,63,233,244,185,54,195,9,52,5,58,234,111,168,165,192,37,242,19,151,3,147,93,222,231,72,146,203,24,113,41,226,128,158,210,204,13,195,167,101,8,205,216,66,224,34,27,182,107,122,67,113,25,30,166,59,66,97,144,22,215,44,72,242,55,200,159,123,245,212,186,62,24,137,220,165,148,38,15,118,43,79,151,19,133,47,111,40,150,20,19,44,48,64,36,196,231,243,194,112,53,22,216,181,90,189,160,191,188,22,146,148,89,102,25,183,197,195,2,61,160,247,11,195,97,140,39,47,213,158,62,4,81,86,1,53,55,176,14,214,185,114,111,158,132,49,199,253,205,167,213,160,204,240,4,44,194,254,110,35,170,34,111,182,30,217,227,144,134,81,217,18,230,4,134,109,134,37,75,108,243,17,22,120,251,108,190,120,89,177,130,33,250,27,240,88,36,10,68,74,110,155,184,201,94,33,43,80,239,174,211,185,201,206,27,117,58,250,208,95,97,241,71,181,222,59,29,255,105,83,52,74,123,125,84,128,179,158,22,246,208,81,219,70,76,19,68,202,143,153,137,38,185,72,119,15,137,237,59,78,229,64,241,66,244,20,146,83,241,176,67,143,184,162,173,231,94,37,168,173,61,143,180,202,211,211,154,5,196,60,239,135,226,144,125,110,163,40,139,142,244,170,221,122,97,223,31,93,216,136,216,62,204,20,223,214,119,78,99,195,79,69,162,48,16,25,216,2,29,175,52,77,231,185,199,51,205,75,236,80,60,163,98,183,180,106,38,142,26,234,114,2,144,81,54,174,247,150,91,223,85,49,188,112,123,149,109,105,131,154,130,142,87,222,240,63,158,206,59,30,171,255,255,255,215,117,236,81,200,86,246,200,202,186,66,161,184,174,35,35,243,58,199,72,118,178,87,8,73,86,169,204,100,101,19,178,66,178,247,232,10,145,149,36,33,174,178,183,144,145,249,59,222,191,219,247,243,231,185,157,227,92,94,175,243,122,61,239,143,199,107,60,95,57,28,77,27,155,22,38,145,187,203,157,255,231,71,153,31,221,174,57,123,179,218,5,209,75,158,53,169,106,98,104,171,215,141,117,187,238,3,88,32,230,81,205,27,53,89,244,143,115,225,134,83,192,205,255,255,124,153,226,203,212,59,191,167,216,99,77,112,11,157,139,151,39,152,77,238,62,139,208,62,58,248,181,11,1,225,96,21,234,76,55,240,108,25,231,71,17,200,200,168,143,123,174,120,211,116,209,185,158,104,17,39,190,237,134,91,8,93,220,156,72,88,174,152,72,52,161,16,252,94,5,3,202,75,69,96,112,77,12,161,85,127,53,6,213,15,1,131,74,79,157,109,131,69,152,66,205,38,121,57,50,240,133,231,134,89,75,8,210,111,99,138,89,72,11,132,1,112,225,172,33,127,141,75,29,253,71,116,81,108,167,197,109,184,16,37,59,119,5,50,172,4,126,100,197,248,191,127,194,75,29,254,65,44,110,253,188,108,38,11,164,134,233,27,71,248,250,135,124,59,46,236,147,211,4,109,92,154,52,23,168,129,74,156,119,59,222,255,222,135,62,79,253,187,2,105,159,156,119,71,171,192,16,200,181,63,203,38,232,175,37,226,127,239,168,31,134,107,239,65,53,26,221,40,55,21,184,240,156,118,199,94,90,5,91,221,115,209,249,31,203,239,112,11,79,179,191,25,74,184,52,243,247,155,12,255,216,35,231,47,60,39,102,20,93,121,53,234,249,198,83,7,76,161,3,8,180,182,76,87,155,163,121,38,244,253,236,170,14,158,226,156,34,43,150,2,196,24,60,188,41,91,27,228,55,43,65,96,85,103,103,140,118,110,204,179,213,88,43,140,82,10,2,98,234,59,21,157,243,36,254,36,146,92,205,209,137,193,83,83,209,118,142,174,85,195,164,153,133,204,151,77,138,241,162,135,51,94,199,141,179,217,117,116,214,179,233,222,229,32,125,115,196,135,61,226,35,41,92,206,21,218,210,243,127,192,151,241,162,34,73,246,134,145,174,57,246,12,67,212,252,112,24,251,19,171,175,118,183,125,159,188,52,8,94,200,126,4,3,139,133,121,18,164,27,207,232,239,2,250,87,248,120,65,96,150,204,194,42,226,57,224,191,254,249,170,95,206,36,223,131,157,177,35,81,75,202,131,157,57,177,28,178,125,21,144,144,147,18,25,16,226,113,70,183,12,115,184,92,241,253,116,61,84,165,187,255,156,130,29,205,100,53,237,68,42,114,63,45,54,17,251,168,5,233,191,90,38,143,220,64,66,97,70,98,49,22,67,204,244,42,175,111,91,90,128,4,146,198,90,91,42,28,28,7,33,205,216,192,210,155,136,191,125,135,73,18,41,250,242,60,227,226,84,194,33,57,200,103,202,145,209,115,43,110,190,150,12,230,98,106,120,5,126,153,20,240,75,76,170,180,160,165,52,231,150,233,18,192,46,177,136,211,218,72,207,255,154,163,244,94,138,178,11,197,190,69,137,135,225,204,99,108,80,239,60,95,151,163,125,160,63,44,226,69,190,27,205,143,116,197,252,228,108,84,122,16,255,56,250,28,99,137,197,219,220,108,160,160,76,143,63,205,151,187,92,123,126,206,42,237,199,135,159,108,26,25,136,95,220,152,149,199,171,221,87,164,88,231,185,39,216,6,23,146,136,159,83,27,90,106,98,185,201,80,247,32,13,169,31,175,122,114,12,246,57,221,230,35,187,147,230,181,64,8,200,125,102,28,112,167,16,120,130,155,235,66,133,225,145,247,15,58,96,232,191,64,230,194,149,73,120,39,87,172,232,217,149,6,221,60,89,9,250,112,6,116,229,45,25,112,225,69,145,119,231,82,63,26,70,139,207,189,98,106,133,129,128,141,142,139,39,122,63,106,73,5,159,166,122,113,65,237,247,156,189,103,55,238,87,146,142,233,254,89,20,211,225,23,230,198,191,26,222,33,250,176,212,102,210,38,102,164,78,94,122,33,147,104,255,164,65,200,51,228,231,173,6,142,38,132,151,50,101,241,244,176,142,176,74,148,205,231,43,157,255,199,231,63,31,165,78,210,227,51,16,125,95,111,91,186,64,199,203,102,80,245,243,86,208,213,111,48,202,222,196,18,127,154,223,82,99,165,214,226,102,1,210,94,197,227,133,182,148,250,236,212,15,38,233,57,191,130,97,140,81,141,171,107,159,126,111,164,171,104,106,70,39,32,250,72,94,34,94,157,106,137,223,94,180,242,54,234,91,223,167,154,49,183,140,37,139,202,22,146,213,26,11,76,41,220,69,177,146,110,150,43,208,163,246,74,88,67,105,163,16,187,116,89,124,194,203,35,222,255,74,40,254,103,132,147,37,228,16,249,65,203,120,253,86,185,28,5,150,182,138,232,15,254,161,143,242,48,157,59,236,55,127,226,43,60,223,198,0,2,187,119,141,31,106,115,78,84,24,99,29,72,114,72,96,64,113,113,86,178,12,165,196,163,146,170,233,152,190,5,2,146,173,75,213,220,27,97,217,123,66,216,252,51,244,32,16,52,196,237,23,47,109,215,121,38,223,144,129,45,20,6,92,223,118,203,249,173,101,225,110,41,125,138,186,187,133,93,98,112,25,247,68,120,126,32,91,97,211,155,19,13,118,145,131,158,237,21,89,246,235,60,111,177,149,33,101,120,81,55,23,93,49,177,234,115,111,90,153,68,21,198,10,113,82,52,37,111,93,221,75,217,59,247,41,216,220,220,191,129,0,243,136,135,24,155,225,225,213,90,199,21,170,101,10,16,48,196,221,176,162,33,181,230,78,159,76,243,171,156,0,129,216,192,197,60,75,18,219,186,110,92,198,29,11,21,228,255,247,228,246,51,224,249,197,159,32,164,207,160,83,141,3,196,166,37,101,19,89,205,212,195,182,41,131,85,67,79,247,155,237,134,114,255,113,91,176,219,55,245,91,127,117,154,15,166,51,210,130,161,142,22,59,76,217,145,112,15,106,55,210,179,89,69,3,193,154,91,35,14,13,44,9,184,176,73,77,75,153,203,33,103,21,164,241,139,83,234,233,167,235,179,102,229,252,179,74,59,175,171,68,71,163,168,6,200,136,147,150,229,243,178,43,143,191,137,133,224,153,165,48,194,159,69,62,144,14,191,9,101,249,73,255,241,0,37,75,212,76,253,77,166,177,112,142,159,172,140,169,228,247,228,42,46,140,138,57,119,15,27,135,173,224,215,115,117,109,13,37,134,191,208,172,161,170,200,206,203,92,14,214,117,120,50,140,7,248,153,110,107,111,254,84,105,244,146,251,250,87,235,59,4,152,220,254,81,108,158,156,194,195,151,67,17,101,200,15,1,141,109,23,204,61,5,0,171,157,80,76,159,182,30,18,191,195,227,45,204,9,47,45,82,161,147,253,189,33,16,96,223,188,138,97,139,80,73,8,118,24,211,112,154,5,129,129,176,234,189,115,222,231,8,98,145,250,70,164,40,72,128,245,175,147,195,38,151,149,183,224,185,88,38,74,20,8,76,168,229,239,197,21,163,6,35,227,122,41,12,43,113,93,201,217,152,97,157,90,187,248,111,216,61,245,58,43,140,128,186,83,95,206,133,215,119,47,85,220,61,122,245,222,4,106,255,181,131,27,151,86,138,159,15,201,39,191,44,70,134,248,199,99,81,187,251,161,56,155,144,172,123,113,110,212,24,129,143,203,137,60,230,131,175,186,90,73,186,162,47,193,248,5,197,205,229,239,125,139,87,223,205,92,120,105,47,129,240,83,49,185,75,244,226,155,17,23,29,173,37,61,51,12,36,140,162,29,56,49,116,216,141,17,161,182,70,165,142,129,124,58,203,205,249,231,35,62,77,221,39,163,104,84,58,129,40,73,180,63,205,95,11,155,142,185,180,100,145,116,83,19,225,95,113,159,64,122,132,180,38,25,211,166,148,89,62,6,72,242,105,201,212,149,252,125,193,234,182,213,51,122,212,233,121,179,85,153,170,146,88,82,150,56,214,63,216,7,120,32,222,179,33,231,166,52,246,229,151,51,127,80,194,124,255,255,188,245,211,241,223,41,21,111,138,152,224,255,229,179,136,141,21,148,25,214,182,251,223,124,185,192,245,0,157,199,169,127,112,64,95,211,239,194,229,171,170,186,108,84,77,33,236,4,44,16,249,160,226,53,78,26,253,203,36,221,42,145,236,248,116,127,233,127,227,19,119,169,63,141,85,100,173,253,207,191,214,241,152,207,114,146,53,35,229,89,42,21,78,45,207,143,138,170,125,103,21,252,15,228,235,112,238,120,109,26,80,227,1,246,184,94,124,119,252,127,252,150,176,142,189,154,169,159,191,132,248,93,202,159,253,151,174,254,82,54,80,244,199,40,55,194,97,140,189,7,171,101,74,245,18,227,223,221,212,228,172,64,192,27,37,127,255,12,74,218,74,35,68,223,76,35,30,167,47,217,177,144,53,215,238,168,249,51,156,241,220,229,126,16,240,83,119,223,139,172,76,127,206,223,68,185,43,68,62,121,85,187,196,192,69,45,64,184,169,217,178,130,51,64,20,7,228,14,102,205,169,95,123,237,194,39,35,244,111,197,23,209,123,115,206,253,218,193,161,128,206,27,6,246,107,189,3,229,118,189,39,29,75,213,148,157,255,206,16,186,165,12,193,66,138,68,57,119,233,175,204,68,156,153,246,45,240,23,150,26,45,126,129,175,140,125,55,219,82,181,90,250,113,20,20,150,226,56,195,118,181,66,77,135,169,43,71,149,147,27,2,212,99,239,200,25,73,223,122,168,55,84,36,100,80,13,181,207,205,47,175,198,138,140,62,28,177,213,8,204,94,3,129,3,79,214,127,47,12,91,143,197,72,99,226,11,19,64,66,255,135,90,214,144,245,18,147,120,187,107,23,166,181,64,96,155,137,194,70,247,100,178,84,156,206,222,155,61,9,4,254,85,28,207,68,23,188,170,238,10,202,89,98,93,64,252,235,79,58,197,143,52,117,241,122,190,223,111,113,242,32,239,251,203,98,73,71,188,243,5,107,61,198,199,77,13,1,145,49,213,59,119,223,183,8,234,63,252,210,58,226,2,135,113,187,52,186,207,111,94,249,190,159,193,178,78,117,19,2,224,103,228,12,248,217,159,87,170,229,213,12,24,28,96,66,166,168,76,19,103,201,246,103,151,221,40,109,41,26,16,240,200,243,153,209,212,14,135,114,238,71,156,55,144,193,138,2,46,166,95,35,241,59,158,127,195,180,231,214,71,97,64,126,240,134,216,252,79,47,93,235,3,213,247,180,56,88,227,66,201,3,206,178,233,166,190,245,147,192,232,55,172,16,159,253,106,203,182,188,199,222,55,241,106,150,183,143,119,16,254,138,86,102,77,14,83,171,36,107,63,231,118,137,130,9,18,242,141,105,138,148,187,101,207,107,162,153,156,149,120,111,146,175,120,200,233,5,181,23,232,162,244,29,113,141,72,188,183,17,43,45,241,29,247,202,185,117,248,157,121,12,41,239,224,69,249,47,25,36,15,184,223,198,212,140,164,34,60,107,19,196,48,145,8,80,169,41,10,150,239,6,33,254,31,39,55,67,221,159,66,199,127,246,47,38,88,24,190,247,59,127,247,154,234,209,176,104,25,221,251,176,190,71,167,60,251,132,185,36,85,55,210,221,56,217,186,99,134,188,239,79,187,228,226,201,238,49,113,218,178,166,129,2,6,174,46,206,136,125,180,26,10,201,143,234,71,205,17,33,160,39,14,207,226,20,162,218,67,201,204,43,116,227,12,246,230,37,23,46,92,99,173,118,1,62,202,251,79,103,24,46,226,201,76,68,179,88,76,102,51,143,231,5,148,124,39,82,255,111,140,3,195,181,57,206,177,58,200,31,26,244,192,4,128,238,241,59,182,157,50,167,69,183,201,115,102,105,200,239,253,254,36,41,68,170,252,222,195,157,111,234,188,42,12,148,183,221,185,56,2,207,139,28,176,172,211,252,221,133,129,230,205,69,204,88,223,179,194,90,174,167,155,192,95,228,247,43,32,46,43,125,238,39,70,81,31,22,203,147,16,254,108,46,96,172,200,99,215,46,173,55,109,79,110,193,132,184,115,49,249,246,102,187,49,228,130,197,201,206,7,48,112,180,177,32,249,163,149,162,255,104,182,89,158,56,14,3,254,139,29,252,39,71,71,39,152,19,219,247,172,209,48,129,131,155,35,47,238,227,69,65,15,136,134,183,170,28,70,217,192,230,122,30,54,104,212,143,149,7,38,233,125,48,225,197,11,138,116,229,39,223,74,78,242,170,140,181,36,32,97,238,146,28,167,56,143,235,151,68,30,126,181,31,122,113,58,30,31,18,19,98,228,106,176,108,20,109,252,164,6,90,32,115,169,190,118,237,178,232,249,171,111,111,12,201,62,129,218,93,236,189,54,240,28,225,228,51,15,3,207,166,154,241,107,160,25,70,140,118,51,125,88,88,179,194,90,182,111,19,5,43,143,247,235,51,250,90,229,61,78,92,205,231,165,17,61,160,162,151,110,109,236,235,187,235,235,29,244,37,8,15,216,155,88,27,122,59,134,140,187,31,155,13,151,95,70,252,142,141,141,161,151,61,26,85,147,240,204,205,252,62,164,223,56,215,63,112,37,255,94,101,171,6,243,80,123,32,76,200,151,44,8,98,120,31,135,125,151,87,133,119,230,6,9,47,159,68,103,97,119,131,182,77,198,99,140,73,227,241,127,232,104,125,136,105,182,150,22,58,134,23,148,105,109,192,5,69,113,90,174,158,143,196,245,116,158,198,16,49,7,24,16,203,158,145,232,138,94,30,168,151,30,102,244,236,194,71,177,47,147,63,191,225,205,152,170,126,81,54,234,41,30,14,35,1,57,42,118,38,119,159,235,47,112,250,210,191,128,129,217,176,92,161,27,78,183,111,118,149,255,3,44,12,97,192,119,170,27,99,193,251,203,147,126,54,104,252,214,50,238,37,207,74,203,145,223,142,216,124,32,213,133,203,223,172,17,255,154,51,47,113,110,233,11,230,151,179,80,205,14,199,105,254,98,195,245,144,230,56,59,11,92,10,11,123,61,63,169,189,179,115,237,178,49,9,234,120,53,47,233,219,56,184,64,234,66,157,55,86,0,45,115,218,174,59,90,180,227,128,105,247,249,250,34,57,181,45,242,115,75,26,169,118,160,6,101,148,66,243,92,174,254,50,215,245,213,180,126,223,211,252,86,205,219,74,117,110,154,87,243,191,60,244,251,137,1,52,121,175,49,216,107,102,39,84,183,61,148,181,249,5,241,241,82,236,132,177,98,133,98,163,58,255,77,232,13,12,144,89,78,90,122,45,86,139,134,66,3,183,157,158,22,226,28,200,241,204,204,59,22,158,208,223,172,2,119,230,19,140,64,238,196,160,108,230,57,171,14,41,77,124,234,215,33,180,40,176,125,187,111,14,62,78,32,254,21,79,248,163,126,122,30,148,234,237,51,186,97,207,242,163,190,120,220,184,130,23,63,75,11,31,206,164,95,84,233,120,241,60,184,111,2,10,203,250,192,203,58,127,191,59,151,117,212,248,159,108,21,194,219,15,218,183,116,222,103,160,19,158,242,242,145,82,14,144,93,234,86,89,146,225,244,179,145,104,62,153,120,61,137,240,92,105,161,216,156,61,153,196,218,46,137,212,64,66,134,52,40,34,63,249,215,78,48,239,92,183,139,151,165,58,95,97,14,21,136,123,34,199,39,30,74,107,114,248,87,11,6,250,212,154,252,140,248,232,75,236,20,21,97,55,164,191,56,55,68,106,85,154,104,247,74,82,198,145,241,168,34,188,103,246,172,78,1,176,45,161,123,106,148,75,30,32,96,170,81,115,31,226,38,243,234,137,187,32,217,30,15,9,120,149,10,23,234,115,220,83,137,231,138,181,120,147,6,181,175,29,107,247,160,45,206,166,54,46,188,17,56,79,10,107,112,120,15,164,23,215,22,130,17,146,12,119,117,5,32,190,178,63,234,162,5,201,125,123,75,78,141,196,8,103,132,87,81,125,92,230,104,207,79,103,98,43,39,19,159,255,143,175,237,151,131,226,51,235,238,253,151,255,234,116,61,82,251,224,184,67,193,242,22,70,224,67,41,242,252,185,65,219,239,39,221,227,66,221,167,243,215,21,153,215,69,66,246,141,222,211,143,186,237,158,174,79,174,201,65,120,203,123,182,192,236,239,180,6,31,169,191,231,219,124,25,73,52,74,132,207,21,69,134,58,61,175,246,125,58,114,223,74,128,239,149,64,247,30,140,122,234,83,146,121,186,31,104,161,250,71,140,129,233,255,198,139,85,190,71,218,12,125,106,145,41,148,138,237,115,243,154,60,19,195,200,181,48,165,48,8,241,53,143,105,45,179,88,43,122,119,226,198,82,164,42,113,192,141,106,147,211,253,62,115,83,188,21,106,139,194,136,95,47,233,200,73,127,96,244,149,206,163,38,52,129,253,116,63,205,85,165,205,91,193,158,97,1,244,173,155,190,208,123,150,222,215,106,19,105,208,114,139,213,65,178,93,253,0,131,116,239,209,145,81,251,195,126,197,243,127,24,38,71,120,223,162,188,217,166,196,100,68,82,40,156,26,111,189,23,68,226,231,212,18,134,222,170,183,222,41,110,150,223,224,26,8,232,117,207,124,165,141,212,253,113,188,158,158,88,243,13,119,239,185,118,245,32,220,129,103,236,200,54,186,68,51,136,189,73,185,114,242,125,172,33,32,216,147,34,234,237,208,15,24,224,15,127,38,147,124,239,25,59,53,233,178,158,113,16,244,254,172,54,36,54,155,80,213,124,75,58,112,175,143,27,225,173,75,79,92,89,157,124,129,141,38,29,35,85,62,46,226,197,140,246,110,125,204,75,31,77,218,86,39,95,83,228,123,247,173,246,83,203,51,38,182,15,134,182,188,248,0,19,174,19,190,86,23,161,108,210,206,141,158,151,22,219,5,129,0,31,61,191,184,52,210,119,65,39,253,117,122,207,113,0,163,188,80,118,154,49,27,51,27,134,108,183,97,23,7,68,126,207,146,62,207,29,168,98,43,80,4,205,96,64,194,155,120,15,76,200,238,70,244,73,166,120,226,235,119,56,32,109,40,191,116,218,98,235,3,51,218,196,171,113,18,7,36,13,72,174,207,91,206,144,134,8,40,119,94,91,69,252,40,163,144,222,217,224,146,59,38,196,244,72,123,109,132,191,147,6,7,144,199,204,66,151,227,236,199,0,63,16,168,62,106,184,148,246,244,56,91,150,187,251,146,215,54,76,96,201,201,111,177,41,149,61,72,115,214,149,250,25,113,58,222,215,162,107,18,227,60,118,231,253,153,144,79,249,16,48,16,83,253,213,2,93,56,65,228,94,126,104,208,121,122,126,207,163,140,242,205,43,58,114,174,83,84,97,104,16,240,170,185,110,195,80,247,121,106,202,174,217,239,226,119,16,216,170,81,155,198,111,123,150,237,21,203,251,211,182,128,128,43,179,132,49,221,189,213,121,27,78,31,249,45,87,8,208,43,223,97,217,173,163,184,147,85,34,189,118,144,9,2,238,151,185,38,98,72,188,30,157,113,189,54,58,61,137,252,125,130,132,165,222,142,251,123,148,21,95,161,162,31,20,70,34,94,172,120,63,97,116,65,252,117,164,214,44,226,135,92,13,133,44,245,123,93,125,109,238,95,126,246,1,133,248,59,5,130,137,255,110,108,231,5,149,79,34,218,231,79,207,151,109,177,149,24,65,143,41,181,68,115,127,63,68,252,217,117,48,169,120,172,169,52,88,146,167,156,163,27,118,72,148,81,168,103,203,24,97,99,250,149,226,223,198,133,15,227,158,246,101,8,204,175,44,97,105,42,200,211,192,67,124,174,182,15,219,184,177,135,35,71,60,48,179,203,28,70,160,244,120,172,57,61,92,224,118,148,243,248,201,110,19,8,56,231,25,253,189,105,222,216,93,39,143,39,185,160,132,248,27,199,164,67,186,7,120,229,135,55,133,253,248,238,226,132,63,119,83,205,85,174,231,100,173,177,144,20,152,221,66,120,186,248,73,82,246,13,116,169,74,81,235,47,241,61,8,240,158,108,20,88,106,47,98,150,186,196,181,89,199,240,17,25,158,50,103,10,48,228,170,194,42,170,100,29,154,120,122,75,218,214,213,113,111,34,151,143,37,215,230,109,29,88,24,181,146,252,51,87,92,43,175,183,216,151,248,10,169,111,98,79,233,84,244,220,208,149,98,242,134,33,146,112,164,254,41,159,63,136,104,40,134,98,63,37,172,161,95,192,11,164,37,35,243,141,151,149,237,52,184,172,178,71,118,64,224,247,188,183,29,245,13,234,39,190,134,222,126,128,19,162,167,4,140,15,195,67,198,94,111,9,172,40,217,184,32,122,238,137,222,161,102,175,59,148,175,199,70,37,68,130,95,154,190,235,119,246,201,94,54,59,225,238,31,62,124,54,210,158,168,243,167,116,190,103,55,6,24,165,110,201,117,34,122,130,156,164,128,146,230,204,21,14,253,57,146,108,101,136,175,85,44,104,91,240,233,111,17,125,137,151,47,83,110,195,132,22,92,75,172,198,58,239,106,236,154,9,187,169,221,233,249,13,43,219,132,90,19,55,11,124,60,147,84,19,142,224,96,235,186,140,70,25,46,111,133,143,244,188,72,65,120,237,232,177,45,93,82,120,148,212,96,199,147,4,225,4,54,58,255,74,31,211,167,161,208,121,228,251,121,148,68,65,204,241,87,197,204,50,199,0,185,209,213,254,204,60,168,221,205,217,123,215,163,53,2,117,55,228,239,100,241,231,73,42,177,141,26,35,214,32,249,157,239,92,15,174,9,198,76,146,89,218,90,155,4,185,134,252,122,156,89,168,215,178,67,20,148,189,62,116,45,125,131,248,120,45,226,143,105,127,53,184,160,38,190,114,52,89,107,42,109,10,185,156,167,97,32,138,132,99,13,238,208,113,149,84,49,109,16,11,139,76,48,97,89,217,124,145,247,109,50,189,139,152,95,150,134,244,17,55,88,72,236,73,93,189,157,19,25,35,88,130,138,232,32,82,175,193,8,203,217,150,87,215,158,218,218,75,137,124,196,37,195,81,93,23,36,45,47,249,122,49,182,244,135,93,130,72,93,233,105,50,108,88,53,156,50,81,133,0,170,28,4,10,120,64,221,232,136,45,158,34,126,103,205,92,44,194,47,126,237,239,52,127,153,183,41,28,156,50,178,91,33,160,44,245,133,133,227,159,107,220,30,183,228,245,13,41,96,13,154,149,237,82,19,109,175,75,117,159,14,176,134,193,248,155,28,43,205,34,139,85,250,113,248,107,79,19,140,115,65,13,14,23,77,179,192,188,129,183,230,242,37,35,210,9,167,249,32,231,15,102,229,168,133,194,24,84,75,238,168,66,128,243,187,113,6,252,198,251,210,61,21,215,253,246,102,162,96,153,73,78,115,138,178,131,96,156,64,92,185,198,45,24,37,47,114,145,221,18,143,70,161,50,242,254,125,141,192,1,150,203,246,245,243,134,119,200,253,242,147,116,58,186,65,130,54,104,93,128,93,163,172,20,155,57,191,37,209,15,19,160,17,221,200,207,182,238,37,24,94,143,191,169,134,167,249,196,111,72,90,107,133,156,220,207,43,26,9,244,134,4,134,217,213,69,113,108,161,185,60,157,209,21,98,20,24,97,192,163,116,54,189,202,77,83,107,159,254,133,65,25,78,192,150,34,74,242,224,101,82,82,210,69,147,167,19,110,50,72,253,90,55,196,27,31,50,198,92,34,253,43,103,129,232,11,102,187,31,23,21,43,79,12,252,81,53,148,42,80,59,164,105,249,91,115,127,242,215,78,193,238,234,181,30,16,232,203,53,184,165,163,26,142,201,87,18,103,208,79,36,138,156,165,33,237,252,96,46,39,113,248,111,102,126,242,8,241,231,0,116,101,237,103,112,202,162,227,132,162,122,22,8,124,224,213,190,21,125,37,25,109,64,46,203,215,70,9,9,220,80,175,140,55,252,225,201,51,118,249,7,199,43,196,191,164,208,139,98,140,121,110,0,109,158,100,86,158,136,191,56,47,255,184,214,140,129,129,104,242,121,172,53,167,133,24,206,205,159,194,182,76,205,169,209,184,40,40,114,50,13,3,145,74,9,182,76,168,31,204,164,94,106,251,234,209,48,192,155,234,164,229,231,79,253,237,60,105,121,76,184,33,70,192,149,92,143,41,254,143,122,172,152,237,184,16,47,61,24,118,182,218,57,119,134,48,60,139,99,175,89,53,8,133,128,160,56,157,134,149,151,30,87,212,196,219,73,209,12,144,192,121,183,3,31,28,239,123,242,223,60,161,103,25,20,136,130,234,218,19,23,56,31,255,139,215,188,232,93,145,241,153,127,129,116,227,133,123,229,97,180,132,87,230,135,18,137,80,156,128,255,63,111,9,181,112,198,89,49,186,237,188,109,190,211,249,246,252,100,81,78,52,74,140,81,225,241,133,113,44,16,253,224,253,105,126,97,54,150,49,252,166,46,37,4,204,170,140,223,183,65,47,10,51,179,23,76,217,175,224,10,41,134,31,223,51,214,82,137,139,166,217,81,26,32,34,126,150,108,244,172,235,213,95,227,85,19,19,19,35,19,152,194,184,144,55,21,231,74,102,94,245,221,251,98,165,122,0,2,52,7,117,105,230,175,195,166,5,138,127,78,109,169,64,26,228,247,196,191,190,112,182,21,173,93,16,163,118,167,6,129,161,54,217,21,117,6,21,119,44,211,151,171,76,170,112,24,101,212,65,3,107,167,247,59,195,244,200,191,116,87,176,212,36,81,94,71,31,154,118,23,233,77,201,178,122,191,201,208,159,239,253,71,252,96,222,178,73,52,149,18,24,224,134,133,181,162,14,20,216,119,255,25,44,25,19,219,112,127,241,78,66,43,29,148,227,145,9,84,151,14,26,98,89,7,97,96,185,252,173,68,61,63,75,92,98,237,253,86,44,19,8,232,12,28,117,106,169,219,229,245,252,83,235,10,179,194,189,191,214,123,184,27,184,106,185,182,69,214,246,219,72,30,137,79,151,142,191,104,113,122,13,159,223,92,200,147,100,199,190,165,112,49,217,31,76,147,100,111,204,161,63,46,150,130,128,243,141,5,190,139,161,222,55,130,79,52,106,196,190,225,128,139,235,149,242,34,166,243,87,37,103,168,66,223,34,122,205,187,146,139,168,163,86,218,164,60,233,107,119,0,32,241,188,82,130,120,246,138,218,119,142,49,247,129,160,71,167,254,186,123,199,188,108,43,158,78,230,18,83,86,9,8,204,175,207,142,105,255,10,127,32,111,151,193,122,114,15,241,35,174,234,116,33,147,251,205,10,95,130,220,70,158,224,0,154,158,243,246,179,92,175,242,154,47,141,232,114,146,66,124,196,98,39,172,242,194,247,247,37,100,246,108,122,227,176,48,223,74,242,234,244,150,89,84,127,5,221,102,115,55,194,195,232,57,118,91,41,224,89,135,248,86,210,132,39,162,223,93,196,175,101,228,197,84,42,179,87,118,184,133,35,122,60,87,32,201,251,209,152,173,213,19,170,102,101,5,48,140,210,197,245,184,97,104,198,221,92,220,182,193,62,17,36,100,134,123,36,133,200,31,90,252,248,52,16,111,33,3,2,171,198,106,38,177,223,128,73,162,173,241,145,242,33,14,224,255,84,89,54,107,250,176,149,139,196,85,211,85,2,185,127,89,104,66,207,43,72,249,128,85,18,159,60,141,240,224,129,5,17,82,229,175,4,39,160,8,234,139,200,243,4,185,226,60,83,76,177,72,202,224,239,0,42,176,11,23,117,56,219,255,201,170,44,115,249,175,164,61,63,168,129,166,189,116,220,210,55,253,199,252,99,167,145,225,21,60,80,150,146,246,52,210,27,109,244,209,245,140,228,129,10,200,103,178,31,245,41,217,79,255,48,198,241,211,221,126,63,196,127,207,95,154,229,54,177,205,164,166,177,254,195,154,5,242,17,199,210,59,216,57,221,230,189,163,45,118,71,223,130,124,152,243,197,205,25,67,235,18,238,207,231,26,187,203,33,129,109,244,64,224,38,23,153,38,179,223,141,18,89,73,168,253,174,181,251,22,214,238,230,234,211,35,51,142,132,101,60,96,172,7,107,185,219,96,63,118,5,91,132,114,232,243,45,116,46,78,93,10,92,190,132,39,105,54,117,140,98,133,4,6,185,79,2,61,3,189,100,117,5,69,12,174,162,112,2,139,31,191,50,12,36,39,37,165,52,138,214,78,60,131,4,254,165,124,10,188,191,72,114,124,33,111,114,69,105,244,52,95,126,162,125,249,180,82,130,190,216,206,61,64,153,183,179,198,84,50,83,203,49,167,100,246,7,197,175,166,70,132,7,88,14,191,66,211,7,214,172,195,222,134,116,71,8,79,9,134,119,116,95,246,190,206,75,143,142,149,249,6,3,245,11,211,152,32,204,95,218,54,170,59,81,188,217,136,31,251,221,41,159,252,244,66,225,102,15,227,94,25,25,162,103,108,140,3,169,123,13,191,96,225,236,100,213,103,32,224,95,232,254,136,102,47,69,34,103,230,45,254,226,17,246,51,155,56,23,191,105,207,178,140,228,111,21,134,168,64,24,80,254,55,195,223,54,249,105,215,127,187,197,119,233,39,12,12,233,5,5,76,55,55,124,14,45,198,208,231,108,34,237,253,108,167,21,195,192,15,69,209,126,103,49,103,164,189,18,139,243,166,116,220,138,171,112,110,159,183,228,16,61,229,175,211,186,127,150,251,87,198,201,183,249,99,75,47,60,245,147,77,125,61,5,101,210,244,121,211,26,105,15,36,158,93,253,170,161,200,243,93,100,76,52,111,219,204,238,5,162,71,237,124,247,105,201,245,39,186,252,220,137,173,243,200,255,251,196,253,144,246,174,50,125,133,138,137,131,194,2,194,123,10,138,2,253,28,65,149,125,213,159,36,171,255,96,13,189,18,179,222,145,251,221,157,194,39,140,22,241,111,48,237,14,182,238,235,33,47,226,68,136,206,12,227,187,79,79,245,151,92,162,148,139,142,225,189,219,142,185,121,95,113,97,103,203,125,118,88,90,229,124,228,178,234,56,216,57,65,130,147,189,71,125,136,106,51,99,141,46,191,194,59,68,255,126,26,82,115,38,50,118,118,57,72,144,103,91,10,97,40,73,60,170,46,43,221,18,229,150,92,48,220,75,122,10,18,30,120,133,36,133,232,245,241,84,24,69,143,75,116,158,174,135,115,39,114,209,201,138,158,125,159,80,169,22,75,36,185,250,248,70,112,116,130,199,90,202,73,159,254,37,122,144,112,223,195,127,24,109,180,150,217,58,117,194,234,100,131,232,213,149,163,149,221,45,133,104,190,132,84,75,175,80,220,23,241,168,249,160,218,157,228,244,74,198,79,236,52,191,113,192,68,212,226,89,73,118,201,81,141,115,193,34,51,136,190,154,39,247,89,209,110,238,25,122,69,146,213,201,196,7,134,177,211,174,144,13,181,78,200,36,46,125,41,233,72,129,23,56,101,59,211,243,34,73,41,30,147,106,240,255,96,7,1,88,93,103,76,203,53,186,250,122,245,60,59,37,17,2,214,75,122,216,166,233,165,168,249,153,175,8,193,121,160,131,238,23,176,163,63,85,217,149,37,207,59,211,89,29,6,46,166,118,72,132,214,223,18,89,95,87,191,183,142,240,205,184,39,193,44,90,237,81,216,252,223,233,171,91,0,4,72,246,115,154,116,91,237,210,61,27,7,165,219,101,96,160,40,181,75,166,12,122,208,15,219,151,5,245,183,156,158,7,49,127,180,120,139,51,40,62,155,1,93,221,135,92,111,218,95,43,186,133,50,55,193,91,152,19,19,161,118,109,208,116,214,81,94,113,206,125,223,213,244,113,43,72,208,0,77,102,177,121,207,42,162,108,105,147,86,149,79,215,219,77,251,230,201,133,209,150,208,10,133,100,243,66,237,186,154,166,235,12,6,15,59,124,246,183,242,3,90,17,30,175,207,251,21,201,191,30,166,110,88,94,138,29,71,222,239,188,252,175,200,232,46,137,173,135,177,220,240,136,12,169,162,180,36,175,169,97,72,79,13,179,227,207,34,121,126,82,120,113,185,110,150,125,217,104,126,221,131,238,184,5,228,139,76,186,199,202,186,182,158,246,246,169,128,105,71,11,54,106,146,247,221,168,203,229,150,189,89,236,95,226,113,9,12,216,38,207,200,85,101,158,25,158,160,76,165,162,127,13,9,24,18,24,213,207,37,184,190,126,51,57,110,28,112,58,190,145,220,33,119,212,74,243,83,129,126,144,156,135,20,212,32,27,62,58,186,71,136,63,207,68,221,146,145,2,66,0,243,131,87,206,243,109,5,100,207,132,250,105,217,24,32,192,240,209,238,115,195,48,134,115,124,60,12,168,187,194,56,160,220,92,233,126,149,197,228,200,154,161,40,35,208,139,3,74,127,42,85,253,81,116,114,226,123,171,82,242,73,24,6,180,174,213,186,14,194,250,208,183,178,130,244,53,17,152,112,19,204,116,207,187,209,189,205,77,59,141,226,69,67,0,251,53,225,130,107,34,244,241,238,86,130,231,181,191,195,64,65,93,135,188,154,127,80,220,110,182,58,5,42,6,2,74,173,34,31,216,36,163,25,103,20,107,150,110,182,12,116,19,186,241,22,105,95,125,89,205,111,126,241,231,156,132,128,36,130,234,21,141,54,243,116,254,244,8,218,20,105,196,47,160,37,31,105,132,37,89,149,134,190,40,119,169,130,1,26,121,115,63,71,186,111,146,79,70,208,76,232,78,172,40,186,164,176,32,247,86,160,52,25,19,118,246,249,6,72,138,191,255,194,225,68,142,94,57,173,229,254,248,183,59,88,39,250,146,213,159,59,65,243,126,239,143,56,199,194,123,241,244,124,189,52,152,61,126,89,165,203,31,89,172,122,149,17,158,174,140,43,210,172,111,7,104,159,61,178,156,160,199,189,167,95,105,108,149,31,224,58,190,127,254,240,235,243,1,136,244,234,248,121,61,239,239,90,13,18,237,169,129,156,74,8,207,162,188,3,231,38,119,175,22,178,89,42,173,220,128,72,165,207,153,102,121,228,197,77,65,79,12,38,147,125,97,74,42,237,79,123,84,137,255,18,23,138,171,163,221,68,79,231,235,212,37,215,51,78,38,119,119,245,238,73,146,65,127,192,222,177,136,113,231,128,82,223,27,81,34,28,188,167,126,152,184,159,177,51,247,43,113,7,212,46,69,252,136,239,142,174,163,254,112,159,132,253,5,251,216,224,47,152,66,41,105,219,234,227,191,236,90,89,26,59,109,207,236,33,128,241,224,141,178,227,158,124,131,253,254,30,227,130,37,18,207,164,142,191,106,13,181,52,119,189,90,15,104,122,135,196,159,42,57,91,253,159,37,152,181,190,198,23,28,87,64,96,227,135,207,34,227,199,229,207,115,20,143,45,153,233,17,126,121,10,13,105,187,88,120,40,88,253,88,148,71,218,51,107,89,113,86,158,137,241,227,161,30,197,117,202,34,196,31,55,94,180,205,83,240,96,152,52,177,107,65,191,70,252,161,162,86,12,167,35,49,86,210,62,234,213,174,28,196,103,186,250,54,175,121,193,245,112,96,132,169,56,100,6,2,38,200,174,90,183,6,91,137,153,39,249,108,186,119,34,229,237,90,16,61,88,75,26,243,255,49,161,174,178,7,3,178,132,121,33,231,221,39,156,191,126,59,86,21,188,2,129,109,172,221,237,8,237,179,155,35,93,180,86,105,183,64,224,196,224,226,178,94,237,7,206,43,151,115,70,51,108,16,61,177,62,121,151,102,125,188,195,63,233,197,135,26,24,2,158,143,39,140,59,253,86,156,34,85,243,111,159,24,0,41,133,92,126,246,77,245,221,121,151,94,38,28,174,107,1,22,146,172,136,239,76,13,205,254,225,204,188,63,248,251,28,40,12,68,209,126,159,234,155,94,207,64,253,158,162,217,135,248,156,35,91,126,55,11,236,130,19,198,187,53,170,63,161,176,179,46,203,94,9,239,87,207,234,253,122,93,206,41,140,7,170,83,98,189,3,172,209,148,147,78,157,29,31,212,97,194,91,249,198,68,114,134,243,58,248,230,170,95,77,155,16,159,77,248,209,223,2,84,178,173,117,214,179,216,151,210,200,253,90,249,24,62,145,197,44,121,62,43,78,190,176,255,120,35,230,106,217,168,21,44,102,195,209,28,13,189,12,23,15,95,247,46,16,38,127,162,128,221,121,23,132,19,216,74,58,150,57,78,169,244,48,137,137,248,81,116,130,232,27,163,184,141,112,67,183,111,226,247,67,85,84,163,120,59,235,76,215,51,82,5,125,181,80,168,217,185,72,85,236,18,105,137,132,144,239,187,226,5,171,51,76,181,232,53,56,108,56,84,246,74,173,81,82,198,0,243,215,154,223,55,17,158,219,120,252,195,235,94,60,84,50,217,248,168,203,129,17,40,75,255,218,156,113,33,9,117,208,26,71,37,220,195,79,58,52,6,75,102,193,134,228,39,133,135,18,75,215,240,128,185,142,177,166,187,53,182,232,240,41,3,107,206,44,70,64,146,184,212,200,25,42,18,90,174,90,243,183,245,8,143,248,137,65,214,180,192,188,226,15,105,47,99,171,203,113,132,59,214,206,91,104,148,163,25,149,81,252,43,226,111,156,64,41,201,43,169,128,228,2,106,67,195,119,219,194,113,48,240,111,180,11,115,53,239,13,216,175,233,121,208,128,66,190,167,160,113,224,205,248,249,58,29,27,213,47,237,79,65,96,34,44,122,234,236,131,94,133,77,187,102,83,215,40,132,239,139,159,48,223,252,116,165,172,76,232,119,162,89,96,224,96,113,78,44,118,141,122,204,127,174,181,246,36,8,225,67,84,235,122,164,115,69,186,69,94,30,213,42,18,143,104,10,1,134,46,253,136,141,138,51,53,66,112,40,8,28,20,4,29,210,220,8,199,231,127,163,53,94,163,56,61,95,50,230,129,118,160,126,255,195,119,48,158,169,0,38,144,63,127,124,109,84,223,198,30,8,108,74,49,17,134,9,169,153,220,101,109,251,43,58,18,69,41,220,166,63,78,215,127,53,48,251,68,233,99,111,83,98,138,195,103,64,194,227,128,160,102,116,184,242,108,86,192,206,167,171,153,80,215,249,146,233,131,180,203,162,146,58,124,243,15,100,155,96,130,68,37,38,41,252,241,45,182,159,10,57,103,108,16,127,216,56,116,93,44,11,254,252,24,39,14,212,133,109,67,128,241,240,206,247,239,148,78,202,173,15,212,22,131,127,159,238,239,82,215,236,202,123,85,151,38,201,166,236,236,139,3,6,140,190,22,79,51,234,120,164,220,78,48,148,202,198,1,90,166,122,235,217,6,204,12,19,236,193,12,206,170,56,160,103,92,183,236,55,147,233,89,127,216,203,155,97,24,15,248,217,184,155,62,117,15,25,213,41,232,255,69,98,7,18,60,61,252,71,176,172,173,195,204,31,51,36,61,67,145,231,251,181,138,126,203,48,241,200,173,141,214,79,196,65,124,222,182,77,93,172,26,247,77,254,13,49,53,100,157,128,124,181,87,227,149,83,205,164,217,184,7,205,100,215,171,120,59,27,204,164,50,75,125,57,171,70,236,171,68,209,147,252,164,160,214,192,98,198,57,6,31,179,234,19,157,147,109,140,64,35,87,177,186,73,207,216,229,70,217,145,4,199,166,126,105,147,220,51,208,152,167,132,154,179,71,222,182,148,46,239,103,42,151,141,250,40,255,27,153,186,183,126,159,128,45,176,48,195,74,102,198,71,129,102,206,50,167,133,41,130,1,94,234,6,173,157,185,105,73,203,195,153,246,140,32,57,16,6,92,203,103,229,130,87,35,231,77,234,75,89,113,215,224,133,233,144,28,114,87,199,112,186,197,133,96,90,113,39,16,40,123,108,122,75,231,53,120,135,219,175,231,110,32,226,95,30,125,196,142,216,246,179,62,191,100,13,220,103,189,139,240,126,45,227,154,13,253,189,68,3,237,34,26,195,55,32,128,37,185,252,35,66,84,128,47,120,19,110,243,67,238,203,191,123,113,109,180,240,4,195,98,173,167,100,32,10,18,32,45,155,20,236,184,112,240,223,71,150,213,239,38,241,128,188,160,36,187,233,13,116,23,119,213,209,104,154,59,172,193,177,178,120,253,200,91,135,197,35,248,110,213,243,42,132,199,123,206,10,165,156,190,172,7,20,149,31,106,153,137,36,242,12,98,100,198,210,27,190,171,163,190,191,26,207,130,8,191,44,135,176,225,219,235,163,67,87,101,119,119,32,129,210,199,47,30,222,147,87,230,78,75,82,163,100,146,4,219,141,18,59,68,116,132,130,227,62,67,131,138,235,222,50,97,143,187,35,28,11,193,153,20,146,35,166,155,130,74,196,112,18,217,107,134,220,71,223,117,142,121,94,133,173,170,65,237,136,94,88,244,200,0,236,111,251,9,222,52,121,129,17,224,204,218,40,205,184,252,136,21,229,32,126,157,46,164,44,150,81,92,103,152,211,208,252,80,213,152,219,132,227,27,81,164,39,188,23,72,123,38,144,58,102,117,167,83,249,205,105,190,87,155,127,139,242,166,78,211,78,156,230,42,131,167,249,73,45,171,151,111,77,253,235,29,3,244,239,150,64,64,229,148,246,53,199,46,237,207,90,134,237,74,12,232,62,49,32,55,87,49,214,251,194,213,167,130,252,69,209,97,167,251,213,225,216,178,26,64,79,3,243,249,214,227,239,32,160,71,147,49,166,221,178,203,118,254,203,133,218,205,73,34,89,1,31,60,22,17,156,30,78,90,159,162,186,153,134,248,121,206,169,114,110,152,121,36,226,131,191,120,133,36,4,212,118,154,203,218,48,240,80,90,195,135,18,31,45,49,64,174,116,178,250,203,102,122,185,142,200,59,237,148,228,48,144,251,114,90,34,157,95,85,68,32,10,21,37,245,144,151,188,244,138,69,20,125,112,33,103,224,99,225,88,6,0,127,243,66,148,209,193,92,212,57,226,211,213,61,122,244,83,104,129,172,122,61,32,32,213,191,149,67,224,36,208,157,12,214,48,90,25,223,55,62,153,53,83,254,18,207,49,58,131,251,226,184,242,240,122,201,182,249,122,11,231,72,35,239,253,211,245,34,173,85,29,143,28,191,213,149,206,172,49,50,96,223,162,92,198,101,26,107,171,127,161,6,47,76,145,219,130,11,138,185,124,137,142,59,87,220,239,140,144,144,50,243,192,128,119,183,154,164,51,133,231,197,156,44,107,46,212,44,54,130,114,165,110,211,115,205,134,166,2,219,34,243,158,14,225,25,161,172,128,200,126,149,250,234,122,51,38,32,150,63,44,163,200,239,146,123,209,181,163,71,90,80,155,98,28,72,40,73,139,254,24,2,233,73,215,184,59,30,136,62,131,128,152,24,193,177,239,250,236,25,85,111,255,226,214,144,254,101,201,145,168,153,210,219,151,42,211,117,55,221,194,29,38,84,40,168,39,218,89,242,199,5,101,238,139,125,184,126,186,127,239,26,121,235,136,189,23,87,141,13,249,193,119,144,111,90,177,121,56,101,189,46,241,93,165,187,161,146,32,28,70,82,2,113,207,110,105,27,253,245,121,148,147,196,15,82,162,87,148,214,114,70,28,239,155,223,56,248,117,232,134,240,183,182,192,250,55,59,154,16,47,201,104,59,250,10,36,20,38,186,22,160,119,41,134,29,117,181,18,83,61,96,194,59,5,245,164,182,19,78,29,54,240,95,249,195,18,152,144,47,161,28,207,213,126,55,78,190,159,226,154,182,33,18,47,87,47,127,159,43,76,83,255,122,150,126,87,40,5,228,43,101,121,152,148,100,125,225,17,177,205,44,200,167,12,137,207,245,129,243,137,67,117,107,146,10,115,157,55,164,79,231,107,113,198,131,6,242,223,169,117,59,73,155,52,33,96,96,93,118,114,82,191,119,194,169,49,77,147,228,220,36,213,117,124,42,251,213,235,28,245,201,92,148,149,199,179,144,198,77,241,226,45,211,186,213,67,5,97,230,222,107,46,136,158,144,158,251,117,70,247,18,228,245,67,149,146,149,29,44,164,44,161,221,169,25,152,122,151,145,27,94,96,235,11,22,74,173,40,177,124,36,58,237,69,44,118,91,243,190,65,250,99,9,100,60,203,223,173,253,221,163,76,143,6,41,175,88,171,178,227,52,59,231,46,39,187,13,122,168,0,7,92,4,175,23,231,26,251,14,179,167,27,201,4,223,70,174,213,229,46,102,27,202,243,218,191,46,74,96,68,226,101,238,71,249,98,162,81,181,252,224,201,156,69,91,62,196,87,208,125,125,81,144,33,245,215,153,21,158,232,175,202,176,3,217,202,189,111,211,13,239,162,71,215,102,88,103,81,72,249,36,133,68,184,218,137,138,82,7,103,174,175,155,130,132,87,73,5,30,104,255,100,231,75,226,191,146,91,107,97,192,171,219,86,242,100,98,122,43,32,56,89,44,195,242,116,61,214,199,139,91,173,149,147,202,121,150,71,13,20,120,209,30,153,36,251,225,38,210,222,179,187,36,21,209,183,79,243,129,221,78,234,8,208,19,34,6,7,148,117,51,32,126,46,146,162,44,88,186,179,142,250,235,130,115,105,23,194,239,241,119,105,85,45,212,87,130,246,246,23,131,194,17,222,141,62,147,156,37,219,185,196,147,152,98,160,166,137,148,223,229,178,110,252,229,62,237,77,253,99,134,59,35,50,133,82,120,185,29,22,101,22,150,93,110,202,173,75,111,33,62,87,27,167,118,86,118,131,195,230,221,228,147,19,45,76,123,112,80,244,167,144,88,157,30,110,199,248,96,129,81,140,128,200,189,253,230,140,43,141,209,215,19,74,162,114,31,96,218,237,108,221,183,66,182,205,229,89,6,111,103,177,69,194,192,122,61,57,102,185,37,96,237,182,235,42,217,148,9,174,139,42,54,105,36,105,178,198,135,53,139,227,110,164,212,64,248,100,182,215,132,59,177,91,226,58,40,109,45,161,15,2,126,79,141,15,169,95,174,231,43,20,164,5,253,86,58,61,95,163,67,82,80,144,162,174,50,196,99,151,2,139,244,183,149,58,183,196,173,21,149,177,206,225,201,8,42,162,96,135,66,194,199,180,96,50,72,96,59,210,7,62,143,240,184,242,226,17,83,182,250,155,11,82,57,163,43,233,224,130,26,237,79,178,143,229,38,146,76,163,65,215,108,127,224,128,2,45,153,229,52,166,148,222,108,244,97,97,119,232,105,123,147,73,20,23,112,156,125,254,238,70,172,172,60,72,200,76,76,201,198,178,60,95,79,46,77,163,144,226,61,205,47,42,19,111,129,65,123,219,211,91,146,130,191,32,190,102,138,235,219,165,250,101,182,181,18,28,230,220,61,48,225,122,139,98,164,153,195,51,222,141,48,37,205,190,99,126,210,158,1,61,145,105,216,252,162,251,186,252,159,102,18,92,59,226,135,119,209,42,141,118,5,223,255,236,220,222,65,223,180,141,220,73,58,114,188,185,182,83,60,82,74,79,10,118,145,172,204,54,52,55,79,220,187,80,216,178,126,210,2,119,61,17,248,206,178,235,179,155,89,231,53,254,130,50,28,123,243,108,73,97,143,121,76,3,253,101,61,201,122,21,28,94,244,81,201,238,186,103,127,186,234,25,61,154,115,60,164,216,155,169,119,163,46,6,125,112,143,27,149,3,158,74,151,246,245,176,149,108,255,187,18,57,144,243,249,189,35,137,31,163,165,38,229,160,143,143,188,37,107,109,18,103,176,199,189,234,190,200,179,43,219,71,218,174,202,22,95,73,95,75,200,237,192,132,78,173,143,207,219,158,56,167,135,228,221,151,86,143,6,9,62,238,33,245,216,181,62,214,186,57,26,69,207,78,108,196,100,251,179,89,183,102,223,134,229,203,172,46,36,125,120,192,217,208,82,211,223,54,132,179,77,41,103,188,214,7,209,3,238,126,205,232,144,210,140,18,219,230,113,183,23,32,165,88,84,227,234,220,7,11,25,174,63,181,205,214,52,160,240,163,220,141,97,177,1,31,251,55,187,232,44,30,114,60,224,104,98,163,231,107,29,146,229,35,217,51,76,59,8,2,182,179,230,86,145,107,189,136,134,212,49,13,75,194,70,24,138,247,233,13,164,219,243,7,103,250,98,251,251,79,253,34,169,164,248,196,108,138,227,5,122,52,101,54,8,44,230,5,30,70,165,191,150,165,21,108,179,120,137,240,189,180,45,79,236,234,248,43,165,215,214,204,45,199,86,72,123,171,123,35,230,77,115,89,88,31,219,176,100,179,113,218,254,238,94,148,254,107,173,115,248,131,109,90,248,47,76,9,148,140,215,116,216,118,11,242,188,108,235,243,90,7,1,252,83,213,254,40,182,214,55,142,85,75,177,230,25,136,31,238,240,154,20,51,70,25,38,9,156,72,158,156,192,128,239,168,157,36,207,221,152,219,55,247,219,19,188,16,61,205,159,50,43,19,12,4,215,169,116,115,207,219,221,61,205,95,55,36,97,26,237,55,247,161,144,217,21,144,68,244,198,123,64,44,84,198,41,155,143,87,163,229,184,236,191,239,167,85,243,234,46,131,235,189,141,104,191,229,211,120,176,45,23,109,157,233,157,243,29,130,81,227,136,159,16,246,221,163,13,251,149,65,251,168,166,110,116,25,35,192,29,176,33,150,81,105,205,195,164,61,26,196,242,148,159,212,198,105,174,182,136,101,117,128,192,69,243,71,185,4,12,83,20,167,174,158,44,250,42,150,38,244,82,53,171,150,24,46,35,237,22,120,116,248,194,212,252,246,186,201,225,111,140,64,238,97,253,165,140,196,141,111,196,90,63,171,84,239,211,253,242,3,49,87,80,211,77,220,188,243,223,188,222,195,97,108,46,213,5,179,121,163,218,165,141,151,29,131,113,32,208,253,65,213,236,76,24,158,95,53,26,47,131,138,6,1,227,27,174,99,180,175,39,84,43,107,138,210,46,116,242,191,55,233,45,87,182,249,182,20,181,195,252,229,217,136,177,204,31,186,232,133,115,113,155,247,109,158,70,255,130,43,174,67,164,198,15,157,171,5,31,237,235,105,249,235,94,225,125,124,234,127,175,7,240,244,255,138,160,27,17,219,140,107,195,139,106,185,232,210,248,207,235,47,208,135,96,53,108,114,96,96,187,91,88,254,100,210,80,114,254,51,154,231,66,54,94,148,208,222,106,156,180,197,147,182,108,121,37,231,211,91,222,184,28,187,137,210,162,109,243,99,225,29,214,205,251,166,32,194,167,200,167,57,181,198,34,233,223,124,157,189,200,65,224,159,177,177,43,227,244,106,51,123,43,255,89,125,25,132,135,177,62,251,6,30,187,174,146,44,63,211,195,172,249,68,1,241,248,185,14,241,198,205,249,225,225,103,246,42,32,33,61,254,169,30,182,191,184,137,236,10,99,231,226,22,72,120,157,24,83,141,173,178,30,126,233,101,121,182,137,6,225,107,110,202,13,180,213,146,81,153,133,110,245,114,11,14,168,28,105,40,157,231,108,246,31,30,230,36,83,254,12,242,13,254,172,250,144,92,201,52,241,208,212,229,105,141,18,194,183,50,76,181,189,207,23,39,18,215,170,91,254,58,16,48,84,110,251,245,251,47,223,66,19,197,98,146,97,234,211,245,191,152,164,14,177,127,70,229,173,236,95,162,101,78,247,203,228,70,162,219,51,54,228,45,190,72,59,189,66,120,109,90,141,103,207,222,253,213,28,159,102,226,62,132,240,42,229,153,189,33,192,178,176,215,240,77,34,188,6,185,174,15,92,54,80,158,35,154,177,168,179,211,118,96,72,189,83,3,167,227,7,27,78,194,249,5,69,80,47,193,118,187,189,190,197,99,59,26,185,19,227,155,245,45,5,16,31,119,183,120,189,160,237,126,64,246,182,169,100,114,244,233,120,175,238,116,252,238,122,244,223,170,217,191,95,208,136,63,236,57,58,186,118,163,33,156,157,107,157,250,147,27,242,251,105,233,55,82,56,156,214,239,9,122,200,210,111,130,124,179,117,161,31,217,220,156,27,76,121,72,31,151,7,156,206,47,122,102,12,79,53,69,83,175,73,53,167,42,159,190,79,109,22,230,247,157,127,127,230,201,174,98,13,28,102,191,242,48,111,75,113,60,33,231,29,44,178,185,132,248,151,30,189,164,65,21,254,199,52,115,229,142,209,3,68,178,13,121,53,27,198,96,219,238,87,85,181,223,38,243,176,162,84,43,117,235,230,49,184,121,189,243,133,212,191,171,48,194,225,214,35,98,206,46,151,77,238,39,110,63,111,210,194,58,37,202,68,95,111,141,52,13,182,163,12,179,115,13,134,9,44,175,226,174,73,2,242,106,230,234,101,211,211,239,144,254,42,30,155,159,151,243,54,193,196,250,232,87,253,51,152,160,208,162,204,188,59,177,213,223,155,231,198,226,68,142,232,157,214,235,204,193,149,42,54,138,114,101,75,21,72,123,127,167,168,192,172,175,207,165,68,34,200,247,173,36,13,185,22,205,45,43,89,245,219,89,59,200,36,153,171,135,29,200,87,60,19,108,204,109,200,3,26,143,246,69,171,64,192,113,144,203,157,217,188,127,71,110,126,5,229,47,14,1,150,173,243,241,118,108,159,190,189,191,182,161,61,99,128,180,151,188,242,200,144,187,92,62,152,140,57,255,4,106,8,72,107,233,76,91,209,184,39,66,103,108,192,39,151,6,18,8,29,3,31,67,202,159,151,92,73,39,104,252,228,133,8,249,165,181,145,232,123,187,93,223,196,229,67,205,196,32,160,167,124,227,106,213,251,176,156,127,228,246,175,110,136,131,124,61,13,189,134,102,231,131,120,39,228,147,106,158,198,32,253,161,203,14,179,190,214,188,54,38,222,71,54,106,134,240,79,35,105,243,76,221,122,239,65,208,201,22,49,255,244,252,182,105,9,22,15,242,208,57,143,181,227,147,102,80,227,66,226,124,75,244,101,153,13,146,106,37,169,189,13,112,193,70,246,69,54,27,111,248,114,236,123,141,39,232,125,16,112,237,122,230,25,69,145,149,192,184,241,121,122,173,26,106,183,179,246,154,247,88,118,204,74,10,29,145,108,38,162,33,170,40,91,98,171,171,121,166,237,236,31,253,73,73,44,96,162,110,168,231,97,141,14,107,107,13,179,204,233,195,180,187,217,251,173,162,249,172,198,85,47,116,180,130,141,144,112,160,203,86,227,56,61,199,153,171,40,52,147,92,215,233,252,185,83,201,153,122,33,146,154,207,181,204,237,122,136,159,36,194,171,185,112,161,202,29,55,27,6,214,81,144,146,195,37,109,117,179,246,214,26,151,22,238,252,166,39,200,39,40,127,91,196,168,242,216,252,209,150,49,243,126,53,22,176,214,50,215,243,182,65,255,144,35,160,27,71,222,96,4,42,15,198,20,51,115,172,18,94,55,127,107,237,189,251,223,254,167,88,94,222,199,247,93,162,186,122,234,122,33,224,226,228,103,238,93,21,195,219,164,204,77,57,99,175,16,254,234,184,15,95,98,96,16,184,71,62,118,159,234,45,70,32,45,201,227,82,98,112,113,81,107,132,84,230,82,62,4,204,55,215,239,78,222,179,148,8,14,171,30,178,159,35,118,63,249,205,238,43,228,124,213,35,140,236,193,96,109,41,223,10,59,232,215,242,215,41,233,77,57,224,183,127,50,9,119,37,99,223,111,254,157,178,163,201,104,107,138,123,54,9,118,177,125,12,213,187,101,55,94,204,123,55,199,139,18,209,99,91,31,52,48,217,100,192,141,178,219,177,155,126,29,167,235,229,199,223,249,126,46,98,231,121,227,236,66,253,19,251,25,231,98,18,151,58,212,228,48,49,201,69,191,192,130,255,156,188,249,224,213,228,53,82,14,153,163,228,181,149,58,164,63,137,39,17,71,55,27,140,200,91,103,73,47,40,194,128,72,145,144,100,84,173,59,153,126,180,245,26,15,116,122,222,230,141,165,200,73,195,173,15,144,174,202,244,49,180,64,250,117,155,44,229,174,175,137,81,72,122,170,120,23,242,61,49,215,109,153,139,210,238,98,207,231,230,39,243,66,2,213,6,174,15,111,132,199,189,156,36,121,5,252,56,131,212,255,216,87,201,105,102,158,88,23,102,134,236,68,81,98,135,167,171,31,17,91,76,86,82,206,33,255,110,251,34,136,114,180,180,54,246,118,70,163,130,35,32,87,107,107,164,255,40,200,179,182,104,24,164,218,72,147,179,62,162,132,11,195,120,249,159,227,213,29,233,172,206,190,126,249,228,16,71,153,27,254,72,168,220,196,229,141,156,97,186,191,131,21,8,192,23,159,90,197,240,229,156,155,126,196,113,30,76,130,22,50,126,191,77,114,150,189,170,198,136,183,139,233,105,5,129,2,180,214,215,168,100,142,94,74,139,120,245,65,95,16,176,166,206,119,163,99,70,229,239,199,172,29,254,72,196,138,210,68,217,31,79,102,174,118,215,115,243,42,190,228,129,133,249,180,251,154,217,59,143,4,179,239,47,160,232,26,65,64,154,228,190,106,248,163,233,134,144,45,7,113,204,6,4,120,147,78,236,89,83,158,71,131,119,200,205,179,159,33,188,161,253,240,96,231,160,213,163,159,19,159,125,29,105,15,87,251,251,143,135,254,216,73,173,254,226,251,9,179,98,157,206,184,136,223,92,191,62,178,69,227,58,229,210,58,128,141,0,86,28,137,83,15,106,167,174,73,11,89,251,70,193,64,118,136,157,40,186,205,95,212,216,93,176,204,92,12,90,17,251,197,125,184,121,153,244,6,182,187,139,24,222,8,19,228,106,47,190,179,3,194,37,207,149,220,112,10,208,131,128,106,23,218,102,211,123,186,254,156,236,229,19,20,183,225,5,113,241,74,129,113,140,14,211,147,115,221,29,231,80,32,48,212,157,112,139,246,152,132,188,133,227,251,170,178,59,12,20,167,204,136,10,12,47,201,61,111,20,241,248,222,130,91,32,243,30,189,100,179,197,28,232,162,185,237,51,7,32,60,229,55,252,121,6,245,249,245,229,179,58,141,219,253,147,165,70,218,253,251,113,15,95,161,36,174,24,106,125,127,0,23,82,120,175,154,60,231,50,34,239,147,232,255,187,17,113,186,95,206,224,171,73,143,141,55,221,96,199,95,139,33,236,18,153,184,150,187,87,63,38,164,105,44,245,118,139,31,222,233,76,148,187,196,86,51,158,122,173,176,190,49,43,249,52,31,145,68,181,86,240,109,167,129,230,218,154,219,206,248,207,225,111,178,250,18,223,242,1,80,6,201,5,161,122,88,227,69,187,140,124,195,63,147,140,231,150,231,72,13,52,112,75,175,222,232,228,113,71,221,100,61,27,97,161,82,78,128,53,40,75,160,196,39,21,18,186,67,91,5,128,236,47,144,208,82,91,94,137,29,239,26,176,53,49,94,26,229,128,9,28,89,252,248,43,15,139,134,255,112,125,182,109,71,250,179,141,226,179,9,54,97,181,137,125,37,131,202,224,3,136,143,184,216,152,192,204,48,173,216,121,48,225,52,144,15,2,190,251,62,206,198,196,235,233,78,182,159,54,20,246,96,135,51,37,22,134,195,251,13,134,65,77,182,164,110,217,176,48,127,137,79,250,147,205,186,40,25,157,108,13,159,3,16,112,39,183,176,163,226,73,253,208,190,173,3,87,132,130,132,183,105,105,227,193,51,37,47,157,92,60,76,155,155,32,62,203,129,165,196,139,42,151,236,79,154,183,220,24,33,24,144,255,2,94,204,68,55,53,8,237,102,250,17,155,17,30,178,181,56,106,113,63,2,36,242,106,18,38,71,96,13,242,18,139,145,143,251,10,209,209,203,163,14,228,159,65,96,221,47,112,158,185,225,160,160,139,100,90,233,95,34,162,247,21,21,98,67,234,83,173,148,191,134,218,26,33,250,93,78,161,53,158,137,220,176,158,117,4,190,181,44,3,242,17,77,59,58,110,29,150,40,200,157,92,249,136,227,131,195,108,75,124,204,134,166,154,58,99,159,136,41,225,212,97,13,244,202,189,137,167,211,74,58,217,214,159,29,106,108,145,247,53,54,20,244,183,37,147,253,189,248,195,71,205,244,116,254,243,205,167,20,197,129,104,87,170,39,101,195,165,48,225,109,141,98,204,245,139,198,28,223,159,123,177,242,222,67,252,254,91,204,244,56,227,116,44,46,150,220,174,228,45,72,120,243,60,228,35,122,230,240,155,155,172,127,232,50,59,162,23,226,163,59,66,204,233,93,199,89,93,135,75,142,17,255,253,81,98,61,235,246,212,241,235,242,165,241,76,101,132,223,23,242,186,217,151,31,8,150,41,158,44,107,179,130,124,198,254,233,141,28,170,37,81,10,126,102,220,238,158,56,32,171,181,117,121,250,118,233,34,247,226,228,34,207,51,176,253,78,109,71,108,190,222,180,104,160,94,192,143,85,109,216,33,82,181,100,136,237,193,110,154,67,132,193,60,208,2,19,34,200,73,74,206,143,13,45,236,180,232,168,224,152,160,63,9,2,44,140,79,26,253,220,82,172,218,190,166,42,192,4,62,49,161,43,220,49,44,223,200,92,123,164,246,111,33,250,251,115,203,166,78,108,217,185,176,128,129,199,130,57,56,160,108,176,192,225,12,71,22,133,95,183,226,61,177,9,80,131,67,59,90,237,73,183,101,153,153,24,149,207,117,27,92,152,33,190,225,161,105,32,187,130,105,214,156,233,121,182,211,253,189,22,218,203,126,201,233,11,49,63,194,227,103,96,64,113,121,69,121,250,246,61,234,45,173,80,55,87,119,164,62,69,249,11,126,181,196,19,27,125,51,26,231,50,121,157,206,148,188,87,210,117,174,253,42,138,5,175,185,62,37,146,140,196,143,196,111,165,132,72,163,181,239,177,188,100,131,17,255,52,232,158,213,32,209,251,122,83,244,211,91,73,144,80,209,248,177,21,61,121,60,171,252,124,107,162,249,41,40,12,172,164,251,140,244,45,84,91,36,251,188,255,237,138,196,219,25,139,7,17,217,6,229,100,42,123,130,190,9,48,33,149,133,142,189,41,0,80,189,5,121,92,170,78,64,234,191,182,167,27,45,45,180,150,206,63,173,251,233,10,72,248,58,190,92,134,69,91,136,26,198,51,232,114,32,250,142,131,35,206,158,103,173,205,206,119,229,153,192,148,40,12,72,119,63,149,124,155,248,184,110,224,28,131,55,27,26,6,254,253,234,196,208,222,33,163,76,9,93,176,214,105,56,93,15,62,35,105,159,229,221,255,202,81,81,234,76,28,12,196,168,7,5,144,83,133,65,192,239,201,247,3,1,48,33,142,241,153,111,121,201,52,142,231,251,237,215,213,175,112,0,227,29,186,141,15,151,195,146,41,133,40,97,74,25,28,229,245,193,97,230,164,172,234,234,87,89,207,254,140,68,227,128,145,105,227,141,108,8,85,211,91,30,245,243,109,27,177,227,150,169,251,52,186,104,252,216,249,224,19,241,230,35,28,96,58,53,178,49,13,83,191,94,249,240,22,111,104,1,163,244,176,120,236,233,254,230,215,212,61,78,43,255,229,167,190,161,232,106,29,178,109,183,117,201,117,35,18,106,55,50,182,217,165,98,135,11,84,99,19,71,183,29,49,237,102,150,206,243,33,47,248,101,195,207,8,152,143,63,154,92,236,164,162,243,104,7,155,127,193,1,85,242,153,46,96,215,147,15,229,149,242,67,175,154,24,94,31,239,31,181,192,64,159,188,101,128,76,166,147,215,240,183,153,96,149,40,98,81,156,35,150,121,216,123,234,76,81,240,230,183,142,88,136,146,228,125,215,101,238,196,144,23,197,2,127,206,232,98,33,7,233,143,95,74,62,31,214,174,159,141,48,162,151,160,63,245,75,130,152,79,212,135,226,184,32,71,171,163,94,168,139,237,30,218,193,9,147,188,177,64,6,207,132,158,131,190,112,139,111,89,96,58,211,191,166,14,178,40,22,133,64,127,64,113,17,223,233,170,111,183,127,126,145,187,194,44,132,248,41,218,50,255,2,89,101,185,252,188,63,35,47,134,97,128,65,221,60,224,229,30,41,255,224,190,208,151,218,156,211,252,236,36,158,219,74,206,61,98,163,20,193,56,57,8,136,236,122,44,123,123,79,121,112,196,124,196,204,91,1,20,198,121,115,213,243,97,91,55,99,87,207,208,208,172,130,128,121,152,247,79,173,254,244,119,151,59,81,53,75,104,152,112,142,145,174,152,22,108,163,108,143,154,19,115,232,57,205,103,109,93,137,14,56,190,234,126,163,39,224,185,43,212,126,27,111,187,190,200,50,46,153,81,214,159,203,249,31,143,245,220,115,13,222,210,50,106,239,222,113,136,133,248,164,213,197,23,11,28,118,163,92,101,185,39,150,216,32,132,175,106,147,53,18,65,162,116,175,229,138,107,122,96,192,189,94,77,82,241,102,230,192,164,89,111,10,147,3,8,196,39,103,23,92,248,37,149,241,17,99,251,74,227,55,8,244,189,214,241,140,170,112,68,165,251,145,10,56,232,159,198,235,242,244,113,107,218,122,116,47,165,174,210,125,24,208,146,51,245,166,204,167,248,214,26,220,188,134,150,3,129,216,200,209,66,6,162,81,190,77,194,221,203,101,0,238,143,84,239,73,53,223,207,180,84,25,154,35,149,7,222,112,216,147,236,54,156,214,180,16,77,107,61,10,112,88,32,146,217,11,71,127,214,178,34,62,241,183,191,72,133,125,137,141,160,210,246,54,251,116,173,108,51,214,96,244,10,191,29,244,39,68,109,122,175,79,105,126,243,221,21,201,172,180,11,32,41,21,237,251,133,227,172,17,49,42,250,93,98,249,0,12,24,222,186,35,193,113,123,91,225,211,239,71,172,133,139,136,159,237,52,114,208,166,166,55,215,176,117,226,180,175,58,29,175,184,221,43,148,193,62,74,250,251,12,221,224,28,162,111,18,109,14,190,71,119,190,96,250,64,34,165,249,12,94,176,17,175,125,51,126,98,41,239,90,151,194,106,240,8,127,19,37,62,29,101,157,64,167,33,178,26,65,254,90,31,4,6,59,239,127,209,252,23,206,251,35,74,165,137,202,250,116,189,138,66,53,225,41,152,115,225,245,194,133,204,126,16,248,200,255,168,139,202,165,148,83,230,108,45,123,91,3,248,254,90,73,230,177,207,0,220,24,143,147,163,38,27,5,129,196,166,250,162,244,64,126,5,173,54,58,43,80,5,209,15,124,22,131,96,240,3,14,181,199,175,72,5,70,17,253,221,38,200,207,226,249,32,130,124,254,210,181,145,6,196,95,202,73,186,199,179,243,207,107,70,90,166,190,136,61,229,151,126,210,191,45,165,186,56,94,186,195,162,34,72,160,117,84,175,228,139,3,87,105,140,217,143,81,126,68,15,172,215,26,173,26,24,201,196,38,45,156,127,125,137,23,36,132,249,134,176,162,135,163,178,126,24,249,112,5,238,33,241,36,183,76,7,155,207,255,156,147,106,233,70,126,1,226,15,223,138,102,184,158,48,17,50,198,82,206,161,12,97,194,99,186,179,142,253,254,79,154,107,199,68,229,46,34,126,230,28,119,86,64,144,230,159,40,35,115,97,133,237,53,144,208,94,94,214,19,242,82,77,35,131,35,80,145,74,27,225,199,59,76,65,26,148,99,117,78,54,115,123,35,8,7,228,138,214,112,143,235,237,208,60,72,74,31,11,10,134,10,1,113,231,74,197,7,221,63,197,31,88,209,154,59,158,242,240,182,197,135,253,134,103,151,237,85,42,183,41,241,64,117,70,180,119,180,47,150,228,175,156,152,98,92,4,8,120,229,219,45,208,188,204,224,235,77,116,190,110,223,142,11,155,204,150,234,227,46,59,60,89,209,226,121,156,43,14,3,203,133,36,98,205,111,177,63,143,41,203,195,121,66,240,47,239,70,229,40,92,248,168,98,196,212,147,85,249,112,3,6,86,187,66,37,19,206,125,150,18,250,132,105,11,222,130,0,226,107,205,195,155,33,108,246,188,118,71,93,237,247,65,253,240,168,59,25,91,239,88,48,133,134,207,93,3,135,65,128,142,163,40,235,252,63,126,113,12,69,142,52,217,29,16,136,97,11,207,102,143,48,86,98,208,120,120,167,210,13,106,15,245,15,250,141,69,169,22,253,26,113,150,212,216,7,9,57,225,145,254,33,133,54,104,246,135,253,142,21,129,24,225,179,185,58,163,50,215,165,123,15,70,23,190,232,141,131,124,125,163,197,202,102,119,21,233,125,252,30,146,204,123,35,60,50,253,232,55,109,118,82,171,140,57,127,3,45,14,59,80,175,60,20,252,56,221,79,107,197,111,71,81,54,135,125,251,222,243,194,241,247,44,115,210,207,70,14,38,95,210,79,253,70,101,145,162,34,131,96,244,173,84,148,112,37,226,191,33,150,223,12,97,91,205,187,106,58,236,118,205,167,250,64,57,35,19,77,223,68,227,149,17,208,175,120,154,127,170,50,215,230,104,66,173,44,55,233,23,213,115,228,123,98,228,117,252,87,191,152,6,127,87,236,112,213,196,1,197,10,215,103,179,153,78,198,103,81,203,130,140,185,32,33,238,169,191,38,214,127,44,221,167,166,241,188,89,2,82,223,190,70,211,208,68,250,49,55,247,87,174,182,121,108,196,228,155,118,129,39,141,119,157,186,203,124,149,89,208,56,234,36,207,51,245,111,200,200,95,61,215,247,93,176,217,3,1,249,172,173,102,110,242,155,198,127,174,76,158,52,23,64,95,38,243,217,236,131,54,197,61,139,127,24,135,122,60,70,252,70,40,94,111,250,193,197,85,162,193,47,249,10,36,222,157,165,126,226,211,156,152,253,81,34,226,223,140,216,23,196,255,150,165,182,142,140,127,183,106,210,238,39,249,140,232,109,71,225,192,63,212,91,93,54,229,231,151,10,132,156,33,128,53,234,70,64,219,94,46,129,21,37,98,122,163,10,225,81,60,99,117,245,250,144,211,129,78,187,180,51,26,27,241,164,189,215,167,117,218,237,45,151,62,58,37,28,131,3,196,246,10,20,6,205,172,82,126,156,180,4,96,154,33,160,178,174,239,225,86,219,207,146,116,178,127,202,77,255,16,61,71,149,244,87,43,173,34,250,82,186,45,59,83,63,212,174,164,172,55,28,59,154,68,230,91,180,98,186,73,109,65,225,63,176,213,229,159,179,186,120,160,36,18,117,67,250,116,127,18,169,228,229,191,79,139,150,195,96,50,54,77,196,255,218,63,127,24,133,154,45,251,185,108,191,82,161,5,125,38,127,237,229,182,99,194,36,117,69,53,52,33,108,6,7,36,165,68,24,97,141,114,41,91,159,157,100,157,124,2,1,29,226,225,32,247,234,199,162,237,168,139,30,216,72,24,168,252,64,129,169,31,97,85,43,251,18,253,236,208,1,6,252,254,204,136,181,201,220,97,224,147,231,243,148,229,193,126,166,90,241,243,201,26,90,217,139,113,125,241,84,236,55,46,44,37,60,66,201,3,159,229,89,110,18,28,54,174,136,3,98,150,72,182,158,202,82,70,88,53,122,158,84,31,244,125,122,107,88,154,241,198,197,237,32,169,133,229,23,166,17,10,35,41,41,181,149,173,179,80,20,219,107,40,126,200,203,235,36,84,242,238,186,100,139,145,125,143,28,37,207,65,24,166,221,192,220,99,17,91,243,114,165,103,92,74,115,85,138,159,212,114,217,178,188,224,242,67,238,224,230,252,214,203,8,223,72,86,154,109,255,214,233,94,146,180,34,58,119,228,157,250,193,57,9,38,250,57,248,236,73,51,102,253,186,12,41,246,6,86,207,213,36,228,31,175,16,197,145,252,214,105,126,55,59,177,3,246,204,155,133,249,187,212,48,242,189,98,10,113,178,26,87,213,30,38,177,11,12,224,196,65,192,67,171,245,240,133,186,130,165,147,44,81,156,246,60,8,56,147,232,237,105,164,157,52,159,161,81,61,243,178,29,233,111,114,214,188,108,77,233,105,33,166,61,111,155,214,240,159,159,203,120,36,153,149,225,86,169,40,250,117,50,31,193,128,233,131,80,137,94,233,126,37,86,242,224,63,161,140,32,48,156,173,106,16,117,59,26,40,63,235,189,173,13,193,194,90,218,29,190,19,235,227,51,185,188,77,134,143,207,195,128,229,131,39,162,68,207,204,32,193,224,50,86,145,62,184,144,210,165,94,210,235,196,177,206,52,144,114,246,232,16,6,4,95,78,139,182,62,187,251,232,5,170,34,234,106,30,184,112,165,250,237,165,181,153,154,35,32,222,128,33,154,148,95,227,166,135,236,112,245,209,229,234,196,76,183,101,116,55,162,87,124,76,21,103,77,77,19,11,82,208,38,239,216,49,2,156,39,139,151,56,171,108,34,149,93,70,94,220,164,0,249,42,127,228,52,166,204,158,83,52,86,121,58,197,114,123,32,220,54,215,198,231,71,143,158,125,247,75,135,90,1,114,196,159,242,219,78,190,8,99,152,235,139,57,35,45,21,138,125,139,46,113,135,94,86,8,240,46,55,191,190,176,184,140,248,179,66,50,201,130,194,151,147,215,133,75,72,142,44,64,96,246,181,218,142,14,53,126,146,153,224,128,219,68,226,119,10,215,82,169,37,135,164,152,253,155,183,30,250,149,144,240,13,195,93,211,227,188,201,21,106,250,120,202,53,78,24,232,185,102,226,154,46,120,227,239,110,242,131,179,14,34,56,160,200,243,170,228,18,196,123,72,250,38,56,184,77,21,36,213,137,123,145,124,88,164,127,237,201,186,247,151,0,74,156,240,48,85,53,169,249,179,54,181,106,114,146,137,195,194,211,243,160,50,214,232,178,124,200,131,55,151,150,135,16,253,102,77,230,21,199,207,28,202,65,200,10,1,66,17,127,157,135,214,234,138,124,172,162,212,182,23,80,18,187,2,107,20,97,231,85,139,23,133,233,130,41,46,62,202,95,133,129,139,41,36,98,102,84,61,22,149,189,230,60,151,65,220,75,158,168,121,33,161,185,180,168,77,118,244,234,239,45,176,80,180,55,97,169,212,166,146,247,85,72,178,144,185,11,4,240,90,153,236,217,212,57,141,237,38,25,192,69,72,249,29,147,167,36,46,66,66,12,214,23,80,161,121,157,32,48,14,26,78,106,25,140,73,87,204,179,145,84,34,122,213,57,245,179,28,109,251,122,233,53,205,138,87,113,239,96,74,238,146,137,245,196,102,205,119,249,151,72,15,142,245,96,160,180,136,66,146,37,181,80,152,78,104,238,206,92,225,169,31,26,95,123,190,238,220,235,28,41,196,99,250,0,38,184,109,89,166,141,119,121,21,111,29,215,144,193,201,125,159,34,192,124,142,67,98,35,131,128,41,109,240,145,26,8,12,180,255,191,142,206,60,30,138,255,143,227,187,147,99,221,247,85,228,206,181,18,155,136,148,221,249,186,137,157,105,177,228,74,104,89,9,161,195,25,177,142,220,138,156,17,214,21,146,35,87,18,34,74,169,200,29,146,114,231,172,144,223,248,253,57,143,207,99,30,51,143,153,247,188,95,175,231,188,63,159,207,251,242,96,244,216,237,38,220,206,190,157,225,28,4,120,52,155,90,249,25,205,22,246,80,10,204,60,29,9,52,62,19,145,60,191,227,246,202,127,162,53,50,43,145,248,241,108,152,61,172,181,20,123,195,58,75,215,69,190,235,224,255,152,172,28,55,138,142,2,53,78,84,89,57,67,192,66,4,89,29,108,32,177,106,144,80,139,44,78,255,223,15,91,80,127,107,57,146,199,47,186,42,232,34,62,134,84,158,30,101,83,90,96,77,110,210,8,4,117,97,249,192,242,27,147,41,249,229,252,171,185,154,247,227,46,66,85,230,236,14,37,85,133,230,110,125,179,175,229,228,117,136,200,243,140,159,154,240,159,12,138,28,23,179,74,144,62,168,15,248,28,240,158,190,164,36,88,43,186,15,211,15,149,7,127,78,89,107,76,149,107,169,58,175,244,3,254,33,74,173,86,70,248,207,133,181,74,167,63,120,15,236,248,174,249,46,73,176,37,4,94,99,38,172,19,48,8,79,20,231,167,9,26,11,240,47,248,69,165,219,202,193,237,71,203,20,225,39,43,49,36,44,67,85,158,48,194,23,205,101,149,31,240,247,204,69,18,241,26,76,206,32,116,37,118,170,199,202,108,231,190,2,159,228,167,130,22,36,62,3,248,196,61,82,92,119,119,220,205,27,130,78,166,194,128,206,207,111,74,168,205,123,78,35,60,175,232,234,120,188,177,232,98,115,76,111,75,109,82,67,186,185,92,91,55,8,104,227,177,54,198,106,188,186,61,188,23,252,31,26,194,192,207,42,61,21,126,54,76,159,9,251,47,60,230,37,12,12,93,235,60,126,133,220,39,32,20,119,34,94,130,132,196,251,148,234,25,86,119,14,209,41,183,163,191,61,244,14,246,155,171,125,23,40,172,207,67,63,211,79,185,230,74,0,148,49,58,111,206,90,42,240,13,255,43,201,118,236,67,252,117,154,170,87,69,153,63,224,193,245,130,105,29,5,73,21,170,217,107,17,104,6,190,137,159,54,178,20,14,234,173,206,103,47,179,110,243,9,243,185,139,235,214,152,131,52,109,63,172,236,88,125,107,211,29,217,59,140,19,31,97,26,128,77,114,73,107,33,155,21,151,63,212,76,140,129,105,156,139,215,114,138,17,61,238,109,140,166,162,76,16,255,228,205,57,203,123,181,15,46,115,93,114,105,2,16,62,243,17,116,73,121,44,176,133,249,50,40,185,112,136,8,204,22,191,10,175,14,193,59,65,50,34,5,253,127,33,121,0,59,51,131,11,252,249,197,148,246,113,210,199,18,241,67,101,184,169,33,238,203,63,80,87,200,50,222,125,160,148,239,72,26,233,136,132,207,121,134,169,249,152,165,171,136,255,202,206,152,66,215,230,85,166,108,14,157,48,141,67,206,47,191,229,145,98,49,222,109,106,56,184,38,0,17,128,35,56,53,231,7,68,43,78,79,158,113,81,50,5,110,47,82,123,106,210,217,57,245,106,97,96,150,181,33,137,0,72,215,104,20,140,243,78,236,117,233,180,37,57,79,35,227,184,154,123,204,107,54,65,243,207,31,72,205,217,128,237,244,132,216,98,124,84,243,139,155,76,103,224,238,183,144,204,206,84,194,213,75,133,222,15,10,181,220,190,62,11,2,129,205,79,167,126,65,41,23,162,222,176,188,58,204,144,3,211,220,102,232,67,122,67,79,34,5,190,44,24,187,18,14,252,193,221,90,188,122,242,216,89,54,167,8,149,16,16,112,233,173,248,26,247,142,118,95,107,98,94,252,6,14,110,39,16,180,91,213,238,81,156,132,213,81,105,23,32,184,155,153,90,239,245,249,178,145,125,2,151,99,117,179,43,162,127,63,179,44,227,243,47,113,42,201,134,195,141,136,95,32,199,86,56,158,191,206,53,118,116,60,248,249,147,219,72,254,193,102,170,60,56,99,46,96,81,146,169,210,242,30,2,86,18,109,120,201,60,244,191,89,81,37,77,91,157,176,60,11,181,250,113,161,167,29,251,186,85,195,189,13,78,98,233,87,181,148,239,155,42,204,106,47,223,250,190,122,171,7,1,42,79,142,216,144,63,152,210,141,62,124,47,10,53,129,229,9,216,250,111,31,47,27,157,191,35,96,59,143,95,6,165,116,254,52,54,61,148,100,236,68,53,172,213,142,81,225,118,32,10,240,127,119,122,161,252,169,183,81,149,23,7,216,126,209,206,109,14,237,225,111,110,126,238,69,31,103,194,65,191,99,34,222,153,132,70,93,98,173,245,73,182,70,244,146,228,176,132,166,140,5,134,192,177,37,204,74,56,26,224,173,179,116,241,211,85,7,150,27,38,81,66,138,80,7,68,114,90,34,62,182,74,190,21,91,72,21,99,132,81,6,167,77,180,15,214,183,132,164,179,168,219,117,77,202,22,135,28,86,134,75,47,5,63,106,96,152,86,33,66,134,104,170,223,94,214,51,99,29,113,250,222,132,0,47,226,79,104,182,167,157,194,174,117,179,250,150,43,66,136,222,46,180,185,224,182,188,241,215,151,120,171,1,110,36,159,231,86,199,79,160,207,136,49,236,83,182,39,159,58,32,241,136,87,217,101,225,214,198,242,247,228,187,191,54,134,0,85,252,153,62,198,31,129,137,198,228,194,82,210,93,24,216,158,162,171,204,184,185,25,31,78,205,168,19,69,17,99,50,212,50,139,254,96,9,183,109,253,26,206,253,141,39,26,27,155,174,255,11,220,22,48,83,191,212,118,113,216,9,31,147,1,121,116,198,87,82,127,247,126,229,110,218,14,61,216,207,210,128,252,78,41,253,25,24,160,39,62,25,75,0,122,47,189,91,159,209,224,45,48,108,69,73,24,119,19,128,185,12,55,65,5,171,253,250,189,23,95,183,81,103,254,223,159,72,209,171,34,19,157,202,205,39,131,41,56,152,255,28,244,60,44,73,186,168,187,26,140,148,224,251,127,127,202,202,18,210,204,167,134,253,247,155,97,145,16,77,4,235,183,119,129,251,232,100,3,100,123,129,41,3,215,1,17,109,151,208,11,127,131,108,155,247,20,102,31,79,202,22,142,243,212,103,221,77,104,57,58,228,78,47,85,149,84,188,51,21,123,204,133,82,85,76,226,238,187,194,246,31,212,97,77,114,254,85,141,10,109,185,16,229,17,199,26,129,240,151,236,93,27,243,222,244,208,41,246,15,196,182,55,32,48,156,167,103,207,161,9,209,181,19,98,214,79,196,131,128,136,163,154,241,189,74,84,223,106,118,224,190,227,6,40,37,253,38,147,33,227,105,246,219,43,166,190,207,49,217,32,112,68,141,160,46,114,197,32,226,108,248,215,171,161,134,210,239,15,153,74,159,146,30,163,118,237,177,73,48,203,159,146,178,96,41,20,253,28,171,69,237,236,124,24,95,213,182,134,240,218,71,138,138,13,234,16,240,223,151,40,71,190,211,160,60,42,124,168,223,43,78,182,46,191,93,152,162,22,39,85,126,2,116,74,214,223,29,47,40,85,225,168,250,247,156,200,138,46,183,17,181,11,76,2,6,92,139,158,53,90,225,99,128,184,219,55,183,50,139,156,206,221,117,57,245,10,225,185,88,126,114,129,8,79,227,59,108,106,77,60,134,23,4,248,224,211,101,66,53,9,145,28,33,210,191,79,135,33,215,123,47,169,36,180,169,230,114,41,204,194,33,66,23,146,90,58,111,175,131,99,8,157,42,188,158,185,84,50,63,41,171,116,204,195,50,106,203,124,52,131,249,189,59,128,63,88,79,115,226,99,106,132,244,195,70,139,247,177,143,98,8,220,238,125,235,42,55,42,223,214,186,179,133,190,28,208,6,1,135,60,177,75,38,223,47,170,115,94,203,205,183,52,158,236,52,214,32,190,64,47,73,29,171,100,167,109,184,222,198,151,158,192,142,15,44,143,213,229,73,172,9,89,156,175,35,116,11,87,115,39,62,213,241,241,246,205,25,21,100,14,68,244,242,50,245,83,172,93,217,216,126,139,171,0,127,4,1,8,25,190,233,170,108,23,57,79,119,92,75,194,213,72,205,107,150,111,150,103,44,15,167,121,60,177,118,192,32,252,246,121,169,111,48,113,185,57,117,249,179,77,127,8,51,194,211,229,227,149,133,43,158,23,207,61,91,21,186,236,41,217,69,31,112,207,177,224,144,123,43,132,10,251,226,202,9,117,88,24,17,127,170,254,218,219,109,161,51,200,212,179,66,82,21,94,127,156,52,238,250,120,30,209,248,161,118,165,3,236,24,188,62,206,152,62,73,47,171,116,88,185,63,158,43,141,73,52,226,184,53,7,150,230,147,236,8,212,236,17,176,61,216,43,204,19,127,254,194,38,112,203,114,126,39,4,110,127,218,164,84,247,162,199,186,142,165,214,32,209,215,4,6,126,181,201,136,251,110,204,15,252,72,252,203,40,81,141,159,183,196,246,158,11,72,49,11,223,42,249,176,116,150,3,6,234,63,122,43,185,71,2,63,158,96,210,195,84,217,32,6,245,63,78,156,235,23,253,4,108,83,191,77,134,93,4,129,117,66,240,37,26,11,119,195,43,67,67,147,239,29,111,23,120,176,199,254,229,136,230,38,200,221,156,17,251,162,122,80,207,103,85,209,37,98,69,128,81,167,27,87,81,248,210,227,139,13,87,63,238,188,59,205,166,197,186,147,179,138,127,195,188,216,188,156,145,226,241,18,87,78,251,97,230,131,240,154,74,101,6,100,80,33,115,229,195,112,179,135,5,136,97,25,56,85,230,79,29,169,229,59,71,210,109,89,125,251,122,112,122,245,240,241,251,152,213,123,182,47,118,191,167,32,254,153,81,255,178,177,233,216,173,99,71,49,60,95,34,64,26,169,64,72,12,155,229,212,42,21,195,84,157,55,136,143,57,84,222,168,152,47,224,245,177,241,65,86,52,249,1,4,36,65,105,250,183,67,167,23,126,37,174,55,143,24,64,0,201,209,242,199,104,40,69,150,187,238,181,240,134,238,129,158,106,190,9,20,8,124,77,61,23,126,171,197,17,6,88,148,213,157,136,92,247,121,82,211,36,242,5,58,9,0,25,101,23,225,135,83,32,255,14,243,145,24,106,135,174,176,9,188,34,23,168,10,154,9,59,29,217,118,42,192,207,51,80,61,7,43,255,188,254,25,42,172,188,185,244,0,6,110,127,113,86,137,68,105,234,160,157,13,70,230,122,8,50,53,6,217,181,94,201,250,45,179,91,100,107,70,27,88,30,77,173,118,121,179,214,172,222,51,226,73,6,68,96,224,79,31,151,182,122,246,18,63,69,5,21,188,85,133,51,140,82,8,102,30,141,168,35,91,234,149,28,155,24,34,0,124,149,56,202,248,169,125,145,68,171,233,22,129,65,8,96,251,181,57,96,73,86,73,92,12,15,200,92,166,34,249,81,165,126,102,84,149,148,248,121,252,59,159,240,20,36,111,130,85,108,90,183,24,30,185,8,20,122,111,168,34,250,31,160,63,71,68,77,87,174,212,30,30,61,247,22,146,202,76,216,205,214,144,221,79,200,244,184,217,55,216,15,183,11,74,203,89,253,167,77,111,240,158,192,236,41,34,122,181,238,119,214,45,65,88,183,124,120,231,141,142,92,45,8,252,92,23,131,239,217,169,124,210,96,159,214,40,153,68,198,111,184,186,241,133,94,246,24,62,107,114,100,166,8,57,246,21,116,230,138,217,226,234,155,179,23,210,70,242,209,2,255,49,91,243,125,203,161,63,222,57,143,52,207,31,204,63,107,45,112,227,119,208,247,149,176,116,30,101,5,219,219,74,10,74,240,15,143,205,83,184,42,83,12,3,96,96,111,53,95,78,161,62,219,95,94,137,124,18,77,192,207,107,151,99,61,146,147,23,158,14,25,120,219,16,104,240,106,131,251,147,234,250,16,175,24,215,96,168,152,218,6,98,164,77,23,55,7,90,198,85,196,168,91,75,140,57,72,62,193,154,248,214,109,47,74,138,251,10,132,235,143,227,99,56,23,181,230,147,43,123,40,55,230,164,194,200,223,96,160,233,203,127,42,10,75,246,62,37,69,223,216,245,186,97,192,247,203,140,18,0,55,49,58,197,114,31,67,63,194,199,168,81,49,135,248,194,243,52,107,130,248,108,128,96,68,95,164,29,2,77,180,246,209,134,86,128,227,52,194,91,185,246,127,43,114,47,48,142,236,214,136,255,170,141,35,0,179,81,148,151,13,40,139,0,160,85,177,251,209,49,2,208,191,58,208,60,117,118,9,32,241,13,63,31,254,140,240,181,105,229,95,51,157,185,99,111,101,86,223,223,115,148,174,250,105,108,71,206,105,113,22,46,138,94,54,56,163,140,124,223,68,187,149,36,79,179,224,130,220,202,252,225,148,131,126,6,196,115,46,48,186,77,252,74,215,207,189,17,2,48,58,99,89,57,39,240,109,2,216,64,63,21,107,194,201,100,190,103,57,157,21,80,10,53,21,126,208,66,253,150,150,231,230,17,168,245,179,87,255,172,158,107,76,122,253,19,215,97,73,118,94,71,99,126,127,178,92,51,49,74,70,77,118,186,186,5,244,135,57,240,237,229,185,128,62,28,10,72,254,172,15,43,17,145,136,255,175,83,93,54,184,243,3,136,81,50,237,229,232,15,104,205,183,70,5,74,197,24,29,252,31,186,43,23,243,119,253,164,208,43,207,197,0,166,131,122,246,101,37,126,103,225,19,18,77,222,132,191,91,8,143,124,247,219,98,147,146,98,201,58,175,200,212,74,70,190,239,238,8,105,141,180,156,65,119,139,161,21,121,22,24,136,213,56,23,148,202,123,232,241,49,159,165,19,203,156,68,160,83,245,171,217,191,71,168,228,176,152,146,151,88,196,143,113,70,2,205,244,102,33,252,141,122,30,255,125,94,162,98,187,207,48,182,89,39,212,178,98,164,153,215,49,239,96,61,109,255,246,76,237,232,147,204,172,59,186,87,208,7,243,177,1,92,222,69,202,196,215,173,100,2,85,11,108,119,116,160,84,160,61,197,108,106,22,68,51,159,254,59,232,79,216,74,178,33,74,48,18,120,248,172,69,139,33,169,77,79,106,133,120,117,190,96,205,241,54,77,190,17,136,206,132,85,222,59,147,101,111,38,126,35,246,184,103,18,78,70,225,31,139,186,104,170,197,235,158,53,125,114,93,241,4,163,137,129,1,232,96,21,214,152,141,66,161,168,58,56,153,178,93,133,90,209,153,213,141,120,10,57,93,76,79,181,180,170,167,240,204,206,61,231,174,176,196,111,82,102,179,7,250,254,77,13,99,108,68,127,218,181,13,79,62,63,56,238,210,50,253,30,123,109,56,157,219,60,29,3,1,2,40,150,234,169,213,208,208,222,242,19,196,157,94,2,160,186,168,211,88,165,205,123,201,255,106,162,118,168,22,36,207,243,42,82,189,250,102,215,57,150,75,115,186,28,245,200,251,40,155,42,229,237,185,29,147,206,60,219,218,166,133,99,192,161,245,58,162,179,177,209,20,247,67,148,166,86,136,142,250,188,224,16,227,52,164,117,184,97,197,119,12,0,229,129,240,40,171,150,141,192,122,201,163,155,205,165,172,32,13,120,149,214,191,249,233,197,138,100,249,237,175,107,218,200,56,105,168,188,110,237,242,16,74,246,59,183,116,62,196,224,50,44,204,73,122,204,61,45,133,177,26,105,65,120,140,4,189,214,223,63,145,131,23,116,53,166,69,112,131,63,24,63,255,234,231,213,141,122,112,200,170,98,170,6,133,220,255,209,239,6,86,213,155,234,68,146,61,122,6,241,183,66,189,31,142,39,211,241,229,31,53,11,66,142,223,1,1,98,216,201,11,236,203,134,39,143,180,157,99,122,128,129,24,60,219,98,204,107,36,210,186,31,3,37,103,99,198,38,127,129,229,131,74,41,62,163,150,101,213,42,32,231,238,56,27,218,219,50,90,218,215,115,144,85,249,93,121,5,194,183,133,209,69,106,37,105,39,51,118,197,158,142,103,121,72,118,37,27,82,50,106,131,101,174,68,23,61,238,57,191,13,1,251,236,253,65,51,221,231,105,154,100,74,133,178,35,220,254,125,101,68,68,132,93,239,166,231,206,102,210,208,59,8,168,108,102,183,218,182,46,140,170,48,198,245,40,106,194,63,244,23,55,253,93,162,66,226,243,32,147,68,237,21,16,48,80,136,251,20,247,56,158,11,43,190,97,182,236,1,210,228,169,138,181,203,197,3,30,217,222,253,83,25,180,73,217,178,209,97,101,241,144,241,33,252,191,144,235,252,161,4,12,80,189,193,151,230,192,191,113,50,119,220,101,129,133,8,56,232,24,41,144,241,232,173,7,99,236,217,93,86,80,135,141,57,105,225,215,218,94,229,236,60,196,139,3,192,246,59,222,225,218,104,171,23,245,40,146,153,224,145,63,7,253,232,140,197,247,13,67,59,113,203,55,71,119,44,97,12,75,249,245,172,66,156,201,99,69,181,219,148,148,195,32,240,103,117,235,27,79,195,110,184,122,252,139,250,210,32,80,158,56,227,146,123,102,101,199,75,226,214,145,153,215,15,97,192,187,17,131,83,157,165,207,133,112,47,92,144,148,65,242,51,115,194,6,91,184,204,223,120,31,229,21,251,72,216,144,25,235,29,217,95,16,19,88,83,117,87,76,225,14,76,63,65,77,73,227,154,179,219,125,111,178,195,31,17,139,119,231,72,107,234,237,255,200,166,251,238,206,205,187,182,18,32,208,226,18,215,102,36,229,22,145,216,180,196,41,223,10,1,37,238,236,211,163,214,225,53,226,211,220,121,188,120,132,31,226,94,106,221,190,31,144,42,196,91,192,114,106,142,0,80,210,255,220,215,225,225,29,34,84,115,10,31,161,129,128,183,113,221,68,44,23,79,67,196,215,44,151,153,93,132,39,227,126,222,34,165,57,171,4,183,69,89,63,12,68,252,244,123,38,57,6,148,40,35,67,192,205,27,255,226,33,250,241,129,153,18,167,156,241,151,178,213,206,193,6,241,56,90,138,83,64,156,95,161,203,253,135,220,250,185,209,158,160,133,100,223,223,222,106,255,197,108,189,250,170,119,117,60,112,55,161,54,245,47,179,206,5,166,202,103,146,187,236,155,68,227,195,84,143,127,162,207,216,209,198,15,190,154,119,200,33,241,25,228,111,98,246,40,92,226,110,81,124,144,183,40,146,79,212,45,157,254,53,115,4,109,11,115,208,81,78,4,160,154,246,18,115,22,110,102,234,41,94,105,188,53,77,0,106,35,116,140,67,78,25,70,129,3,193,121,138,183,33,6,74,247,27,135,245,208,145,217,160,176,199,26,209,215,16,189,183,20,80,10,8,35,45,213,108,157,22,187,173,15,1,210,211,180,85,195,151,151,31,159,255,54,65,67,17,16,61,115,20,156,142,97,37,110,180,117,95,196,20,187,30,212,59,211,199,10,181,141,58,38,171,150,118,146,174,67,0,60,222,217,52,102,237,240,176,71,100,233,144,203,81,8,232,127,123,242,126,7,38,253,84,42,151,125,25,42,23,148,55,97,55,59,62,250,113,198,59,39,223,168,230,17,51,140,240,170,127,86,202,154,150,32,207,31,235,229,67,126,4,160,184,81,171,112,146,79,242,189,87,221,36,148,73,132,0,147,157,205,143,107,12,152,189,66,117,47,53,189,84,2,192,229,86,22,116,196,102,113,27,83,39,63,21,145,3,73,81,204,235,117,12,51,108,206,56,236,238,191,238,88,4,129,153,254,61,11,19,145,204,174,247,193,210,241,13,59,4,67,212,231,37,220,250,184,237,217,86,214,141,137,57,21,228,254,121,4,251,217,10,248,26,78,123,216,97,253,165,255,191,127,135,93,124,51,126,194,150,24,187,57,223,2,2,126,222,76,195,166,85,66,146,102,106,201,76,33,82,96,251,147,140,32,189,48,52,79,116,183,132,211,220,233,241,131,245,71,218,105,146,249,22,69,175,23,204,86,224,188,255,1,23,5,102,89, \ No newline at end of file diff --git a/screens/mainscreen/images/Untitled-2.json b/screens/mainscreen/images/Untitled-2.json new file mode 100644 index 0000000..bc2ddff --- /dev/null +++ b/screens/mainscreen/images/Untitled-2.json @@ -0,0 +1 @@ +{"name": "Untitled-2", "type": "bitmap", "format": "COMPRESSED_RGBA_ASTC_4x4_KHR", "astcCompressionSpeed": "thorough", "width": 240, "height": 240, "compressed": 1} \ No newline at end of file diff --git a/screens/mainscreen/images/Untitled-2.lut.bin b/screens/mainscreen/images/Untitled-2.lut.bin new file mode 100644 index 0000000..cab8db9 Binary files /dev/null and b/screens/mainscreen/images/Untitled-2.lut.bin differ diff --git a/screens/mainscreen/images/Untitled-2.lut.binh b/screens/mainscreen/images/Untitled-2.lut.binh new file mode 100644 index 0000000..455b0a3 --- /dev/null +++ b/screens/mainscreen/images/Untitled-2.lut.binh @@ -0,0 +1,12 @@ +120,156,61,79,237,113,219,48,12,253,211,145,210,13,42,79,16,209,11,132,82,6,168,73,101,0,201,84,23,136,232,9, +98,165,11,56,238,4,109,58,65,47,35,244,143,69,16,0,105,251,10,59,74,15,135,227,227,1,239,3,119,159,86,81, +10,175,21,231,250,192,56,247,92,122,254,141,233,255,68,218,204,27,239,111,45,111,43,104,195,45,26,52,215,249,5,45, +66,125,225,197,22,139,169,132,158,46,76,79,142,20,20,147,79,142,110,14,13,122,46,131,2,19,157,160,37,52,162,86, +76,53,168,48,166,247,217,42,54,248,32,200,145,232,68,71,58,246,84,76,75,168,36,135,137,23,151,22,203,171,143,22, +135,125,246,146,193,226,237,84,129,130,151,243,152,246,185,138,85,180,146,113,45,188,13,171,176,8,101,176,168,193,209,34, +120,174,96,204,61,122,50,164,197,93,67,139,10,44,86,48,72,202,197,180,79,58,148,240,121,250,114,208,80,132,145,215, +216,225,189,232,233,224,184,33,35,42,86,220,87,224,249,37,175,228,138,125,222,166,34,116,212,176,193,221,73,116,226,50, +216,104,196,189,147,189,31,89,46,131,90,248,27,118,124,115,216,138,250,179,236,55,52,164,65,114,90,170,229,166,30,37, +45,170,120,23,126,158,59,106,233,54,248,52,176,79,150,182,249,53,143,217,242,87,88,243,35,185,164,66,143,15,241,41, +119,244,122,28,242,99,218,208,238,84,97,199,191,142,219,227,223,243,144,106,126,59,62,165,239,248,13,20,62,243,46,255, +230,251,233,237,244,231,244,15,24,62,114,131, \ No newline at end of file diff --git a/screens/mainscreen/images/Untitled-2.lut.raw b/screens/mainscreen/images/Untitled-2.lut.raw new file mode 100644 index 0000000..14fa0f8 --- /dev/null +++ b/screens/mainscreen/images/Untitled-2.lut.raw @@ -0,0 +1 @@ +duöuöu÷u÷u÷uöuöuöuöu÷u÷uöuöu÷uöu÷uöuöuöuöuöeöu÷uöuöĒúu÷uöu÷uöu÷uöv÷uöuöuöv÷uöuögöv÷…÷uöšų…÷v÷v÷uöv÷…÷v÷FôgöĒúuö…÷EķUõ‰øu÷uö™øˆøVõEķ™úˆø4ōx÷™ųUôVõvöˆ÷™ųWõxöuöEķgõVôĒúx÷™ųUôuöx÷y÷™ųˆøuö…öˆøeö‰øEķWõföu÷vö…÷v÷…÷UôgöĒúeõ‰øģû™ų…÷w÷TķfõVõēūĒúģûföföwögö‡øEķšųVôFôUôw÷eõˆøFô™ųfõĒû‰÷™øvøeõxöeõ…÷Võw÷fõ˜øVõFķģúeôUõ5ķDōeõEôĒų‡÷†÷höföeôˆųxøv÷eõw÷Uôuõ™ųēûuõvöģûŠúEô†øxųv÷šũw÷föWôwövögö†÷UôŧûgõVõgöföšųˆų4ōŠúeôĢúEôxø˜ú˜ûföwøg÷vö‰÷wög÷VödôĘū†ø…øTô™ú˜ų™úwøŠûĖûĒûwųtõ‡ų—øˆúVô‰÷yö¨û†øĖü˜û—úšøšũf÷†ųËüŠüíū˜úgųŨü¨úŦ÷ŠõV÷ĢųšûÍųhķŨũÛũ \ No newline at end of file diff --git a/screens/mainscreen/images/Untitled-2.lut.rawh b/screens/mainscreen/images/Untitled-2.lut.rawh new file mode 100644 index 0000000..e72fbe8 --- /dev/null +++ b/screens/mainscreen/images/Untitled-2.lut.rawh @@ -0,0 +1,8 @@ +100,4,117,246,117,246,117,247,117,247,117,247,117,246,117,246,117,246,117,246,117,247,117,247,117,246,117,246,117,247,117,246,117,247,117,246,117,246,117,246,117,246,117,246,101,246,117,247,117,246,117,246,170,250,117,247,117,246,117,247,117,246,117,247, +117,246,118,247,117,246,117,246,117,246,118,247,117,246,117,246,103,246,118,247,133,247,117,246,154,249,133,247,118,247,118,247,117,246,118,247,133,247,118,247,70,244,103,246,170,250,117,246,133,247,69,243,85,245,137,248,117,247,117,246,153,248,136,248, +86,245,69,243,153,250,136,248,52,242,120,247,153,249,85,244,86,245,118,246,136,247,153,249,87,245,120,246,117,246,69,243,103,245,86,244,170,250,120,247,153,249,85,244,117,246,120,247,121,247,153,249,136,248,117,246,133,246,136,248,101,246,137,248, +69,243,87,245,102,246,117,247,118,246,133,247,118,247,133,247,85,244,103,246,170,250,101,245,137,248,187,251,153,249,133,247,119,247,84,243,102,245,86,245,186,254,170,250,187,251,102,246,102,246,119,246,103,246,135,248,69,243,154,249,86,244,70,244, +85,244,119,247,101,245,136,248,70,244,153,249,102,245,170,251,137,247,153,248,118,248,101,245,120,246,101,245,133,247,86,245,119,247,102,245,152,248,86,245,70,243,187,250,101,244,85,245,53,243,68,242,101,245,69,244,170,249,135,247,134,247,104,246, +102,246,101,244,136,249,120,248,118,247,101,245,119,247,85,244,117,245,153,249,186,251,117,245,118,246,187,251,169,250,69,244,134,248,120,249,118,247,185,253,119,247,102,246,87,244,119,246,118,246,103,246,134,247,85,244,188,251,103,245,86,245,103,246, +102,246,154,249,136,249,52,242,169,250,101,244,171,250,69,244,120,248,152,250,152,251,102,246,119,248,103,247,118,246,137,247,119,246,103,247,86,246,100,244,202,254,134,248,133,248,84,244,153,250,152,249,153,250,119,248,169,251,204,251,170,251,119,249, +116,245,135,249,151,248,136,250,86,244,137,247,121,246,168,251,134,248,204,252,152,251,151,250,154,248,185,253,102,247,134,249,203,252,169,252,237,254,152,250,103,249,221,252,168,250,172,247,138,245,86,247,171,249,185,251,205,249,104,243,221,253,219,253, diff --git a/screens/mainscreen/images/Untitled-2.meta b/screens/mainscreen/images/Untitled-2.meta new file mode 100644 index 0000000..2475552 --- /dev/null +++ b/screens/mainscreen/images/Untitled-2.meta @@ -0,0 +1,5 @@ +{ + "converter": "Image", + "imageFormat": 37808, + "sourcePath": "D:/Projects/Embedded/AirsoftTracker/maps/home/tiles/2/1/0.png" +} diff --git a/screens/mainscreen/images/Untitled-2.raw b/screens/mainscreen/images/Untitled-2.raw new file mode 100644 index 0000000..4cce11f Binary files /dev/null and b/screens/mainscreen/images/Untitled-2.raw differ diff --git a/screens/mainscreen/images/Untitled-2.rawh b/screens/mainscreen/images/Untitled-2.rawh new file mode 100644 index 0000000..4bc255a --- /dev/null +++ b/screens/mainscreen/images/Untitled-2.rawh @@ -0,0 +1,61 @@ +/*('file properties: ', 'resolution ', 240, 'x', 240, 'format ', 'COMPRESSED_RGBA_ASTC_4x4_KHR', 'stride ', 960, ' total size ', 57600)*/ +67,194,80,87,105,203,129,108,173,50,42,206,76,91,34,17,51,36,23,255,9,187,27,34,97,206,18,96,70,127,210,68,83,2,103,160,197,46,239,236,147,254,189,136,165,111,5,200,67,2,75,224,60,222,9,247,64,149,65,81,242,114,38,156,67,2,83,36,109,222,141,163,1,17,255,227,8,91,55,142,67,2,37,34,91,206,76,63,132,209,154,48,224,227,81,19,83,2,111,185,39,55,6,19,88,8,196,195,19,59,102,210,81,2,61,39,61,39,109,87,65,49,225,180,90,67,72,2,67,2,209,47,5,221,147,182,161,119,42,245,107,183,41,229,83,2,99,152,227,42,129,166,111,41,180,138,67,236,24,8,67,2,215,163,109,92,78,18,32,141,192,104,218,72,247,110,67,2,211,82,45,95,83,162,175,128,213,195,95,8,118,101,82,2,227,206,88,250,122,88,118,45,248,93,8,43,1,112,207,73,154,225,150,135,174,86,191,42,119,89,36,154,173,99,82,34,233,107,173,209,53,233,9,114,243,128,215,8,86,79,51,16,98,140,53,56,171,189,113,177,39,113,174,70,146,244,82,34,121,79,238,249,183,36,51,92,180,208,151,133,127,27,67,34,51,251,194,63,25,223,156,109,243,148,23,179,5,171,82,34,141,49,36,238,214,96,144,158,196,104,223,255,100,142,173,7,105,69,99,81,119,101,9,80,112,82,58,225,85,254,83,194,206,203,194,182,5,184,191,87,191,247,189,123,239,189,82,136,94,108,119,175,190,156,78,25,43,82,81,224,200,40,82,136,130,137,37,206,183,139,116,25,6,40,193,52,153,85,82,196,92,99,113,237,113,228,103,233,178,94,101,32,53,140,83,2,169,169,6,47,230,158,141,204,219,192,220,131,199,218,67,200,7,67,58,164,180,141,231,126,36,236,56,243,131,146,66,4,49,140,62,135,40,134,93,34,80,47,10,245,160,170,83,2,203,54,92,121,0,75,76,72,107,113,252,21,90,23,83,2,175,201,104,51,49,38,104,66,12,205,233,192,158,195,83,2,253,240,229,43,48,36,39,82,21,101,190,30,202,102,67,2,77,225,68,90,12,17,4,208,195,200,56,123,231,158,67,2,251,176,15,127,19,136,21,226,49,47,44,153,176,36,83,2,101,145,231,50,107,175,28,238,95,68,157,171,2,56,67,232,119,108,74,13,163,163,209,236,27,55,233,116,125,9,67,136,40,236,25,181,198,165,84,176,153,247,44,145,97,49,83,2,177,209,167,51,214,10,197,45,5,162,69,82,211,173,81,234,81,204,251,191,57,247,22,204,40,215,140,200,36,65,82,194,90,91,115,213,1,64,125,161,236,159,247,199,142,2,67,194,90,91,115,235,65,16,142,141,217,53,254,173,51,101,35,40,2,145,213,21,55,127,213,85,87,158,44,213,119,204,82,34,101,43,106,225,167,8,59,12,97,46,6,64,19,49,223,37,159,29,250,55,158,152,254,179,254,223,237,190,240,231,83,136,2,108,145,39,179,125,205,122,120,156,216,39,52,128,82,40,17,236,245,61,61,240,106,79,27,154,68,9,255,44,223,169,146,105,64,18,35,142,65,10,204,128,131,65,12,139,83,200,24,149,241,251,139,150,110,2,78,96,138,170,131,180,67,136,14,213,176,175,252,170,100,213,64,118,17,71,2,149,95,203,174,225,138,87,237,170,118,45,15,20,110,184,227,92,82,40,14,108,109,189,92,200,243,187,9,120,66,203,29,49,67,112,114,140,251,171,221,246,175,25,135,198,187,100,167,224,66,72,154,161,166,141,222,151,142,58,61,67,45,212,138,32,65,2,57,35,63,43,107,91,1,24,166,208,56,219,205,38,82,34,85,67,118,136,15,249,86,184,203,111,249,157,65,119,223,37,37,248,169,53,154,64,191,91,89,183,182,109,243,174,67,194,76,81,107,185,1,123,19,158,118,101,75,27,171,237,66,2,107,251,231,251,231,87,53,187,156,255,10,156,196,168,83,136,19,172,209,108,131,109,75,204,111,228,199,72,118,98,66,2,103,243,102,57,167,22,115,133,52,205,32,221,8,236,67,194,68,69,95,179,129,254,223,144,154,195,233,227,55,93,65,202,9,172,237,119,187,214,124,100,7,227,137,98,46,142, +65,10,3,44,191,47,119,239,179,42,2,86,106,249,13,212,82,104,5,236,245,125,93,184,110,73,45,200,99,206,83,144,67,2,247,201,166,238,12,248,250,223,63,95,223,125,183,247,66,208,44,99,49,83,21,231,222,178,235,163,118,73,203,167,82,4,171,150,193,159,195,246,63,19,87,153,185,46,2,145,222,201,152,97,180,135,57,181,178,116,165,25,145,184,182,73,83,200,24,117,239,29,157,249,248,1,45,189,117,78,7,74,81,144,19,172,158,186,187,213,64,118,190,188,26,148,232,98,33,6,239,160,206,13,172,229,100,0,86,30,38,185,231,159,205,7,67,88,185,6,183,179,92,171,169,63,44,101,158,6,33,170,18,227,30,124,241,203,97,70,142,168,150,250,151,0,82,4,215,153,191,190,229,214,93,121,70,68,123,196,109,129,82,72,6,53,244,219,132,10,235,43,13,128,226,241,231,15,83,8,26,131,34,131,79,87,79,134,17,224,255,196,46,224,83,2,105,176,34,51,140,65,11,49,50,2,32,57,36,33,67,4,59,82,182,144,250,34,128,244,63,202,216,45,61,177,67,2,145,88,153,165,27,110,7,80,243,123,172,133,110,71,67,2,71,192,36,218,9,212,38,80,58,171,150,121,15,168,207,169,7,203,28,97,17,111,206,158,87,130,145,184,112,225,82,2,151,188,148,123,116,165,187,105,118,236,216,69,7,88,50,112,180,170,86,157,199,81,180,86,79,199,248,189,248,246,51,36,161,63,250,185,92,80,186,44,91,27,27,91,42,150,65,2,65,47,65,47,105,87,1,56,159,111,126,249,66,206,83,0,69,55,61,49,105,91,1,0,144,135,236,222,215,189,81,2,67,47,67,43,107,87,129,141,125,121,112,122,240,222,51,36,29,252,177,53,156,14,229,164,0,149,117,77,186,247,83,2,171,176,227,46,112,156,157,223,90,111,239,121,247,154,67,194,92,93,113,207,1,251,97,205,197,29,82,187,159,189,67,2,215,162,69,98,139,8,154,128,167,62,137,27,103,222,83,136,153,33,66,228,74,103,137,13,221,210,5,13,85,98,66,36,17,193,52,189,36,135,145,102,162,166,72,244,68,246,35,4,141,20,41,146,58,215,204,235,243,255,101,221,84,96,78,39,77,201,112,241,50,77,249,195,190,167,22,23,225,95,189,39,209,72,112,159,162,37,128,189,200,79,245,165,121,28,83,2,241,192,100,47,254,21,184,54,65,143,33,44,1,194,35,4,25,153,29,16,124,24,81,236,109,174,228,157,151,71,83,2,49,201,134,51,210,220,160,102,39,121,51,240,5,128,82,136,153,233,184,242,178,166,111,143,21,248,254,251,173,36,81,2,151,128,174,152,62,41,1,249,240,129,90,89,79,140,81,144,44,204,251,80,187,243,208,125,28,211,159,99,49,138,82,196,222,236,50,235,105,159,113,79,38,120,185,116,191,206,66,2,209,192,221,166,237,58,196,10,164,66,170,72,198,160,82,2,101,2,139,124,219,128,194,57,72,19,235,38,221,149,66,2,209,61,221,100,239,92,145,17,145,30,112,149,146,151,83,2,41,177,102,59,70,107,229,132,52,215,235,244,62,5,83,2,71,39,30,121,99,43,244,50,196,89,26,227,156,119,83,2,119,234,171,75,204,174,71,168,200,16,65,66,48,70,51,232,5,181,125,111,247,149,234,200,178,229,84,0,79,16,81,2,153,128,182,164,62,41,1,232,91,188,241,149,92,70,82,34,35,208,6,42,31,197,68,200,26,211,254,65,185,239,81,2,163,134,198,168,74,41,65,40,59,229,87,69,66,33,51,36,203,47,37,156,28,6,205,48,130,203,176,63,194,184,35,4,85,73,225,172,175,59,133,132,72,8,109,146,52,5,82,196,220,238,46,241,145,93,190,33,69,169,84,52,71,43,50,4,157,144,182,168,52,41,1,132,80,20,176,61,250,243,83,136,159,97,130,226,104,139,141,92,1,248,1,194,67,60,83,2,67,15,157,120,144,185,64,0,214,219,32,188,95,162,67,2,177,69,99,84,142,86,250,183,122,109,91,117,172,182,67,2,131,50,48,143,87,101,205,235,241,38,145,118,10,64,83,2,69,23,157,116,111,43,80,239,207,165,141,87,91,110, +67,2,79,35,69,222,11,128,160,133,236,196,25,25,51,198,83,2,103,152,226,42,229,238,193,236,185,10,153,39,16,40,67,136,19,149,230,182,177,210,212,199,130,153,247,35,157,149,82,136,231,193,235,83,237,213,233,183,11,233,102,89,181,144,83,2,229,152,199,50,247,220,123,207,217,225,238,5,89,57,83,2,177,193,38,55,125,106,222,155,1,173,86,85,106,173,66,2,223,110,222,55,227,21,204,22,10,164,198,92,41,117,83,2,171,169,7,51,115,157,57,95,155,39,0,154,41,130,67,136,222,65,242,139,115,152,154,61,80,18,19,162,97,187,66,2,223,111,223,247,227,53,2,138,169,38,230,166,202,158,66,2,219,107,219,245,225,52,166,66,44,204,168,194,204,64,83,2,169,160,229,50,115,158,45,88,56,24,3,41,57,66,67,2,79,6,149,90,79,204,137,120,235,73,60,3,230,30,83,194,78,78,194,139,225,6,199,57,231,220,106,204,185,141,66,2,219,235,90,53,227,21,173,156,193,218,204,121,96,211,51,36,49,59,179,183,157,68,117,87,224,158,136,205,42,153,67,34,43,27,147,189,155,87,54,211,195,97,151,228,62,255,223,197,98,99,111,225,129,162,248,144,78,12,238,54,245,11,66,8,9,49,149,213,87,92,149,21,87,158,211,87,166,30,82,2,175,250,138,23,229,228,92,12,54,117,144,232,163,225,82,2,175,188,139,55,237,36,216,228,168,137,173,207,205,212,67,2,233,161,38,250,135,157,175,177,194,71,15,94,87,169,67,2,109,230,118,120,10,244,63,182,19,240,7,190,251,159,82,2,111,219,107,243,222,0,129,108,132,236,210,89,237,107,67,72,7,181,171,101,117,232,19,213,3,95,165,160,28,148,67,232,61,108,42,197,218,203,229,52,152,233,47,73,3,11,83,2,109,177,70,47,150,128,92,117,90,107,175,174,247,26,83,168,7,227,192,19,107,152,253,133,146,27,66,233,144,149,82,2,167,136,154,252,82,169,153,161,252,74,225,114,216,140,83,2,163,137,3,47,233,47,135,228,124,136,98,47,21,5,83,2,45,146,227,50,74,96,124,61,71,91,50,242,187,2,83,2,107,160,35,47,246,156,128,210,187,128,216,10,25,133,67,2,223,100,110,114,11,175,20,236,36,122,143,163,234,23,65,42,31,204,227,127,156,211,164,230,79,125,180,77,111,240,66,2,223,111,219,245,225,52,28,149,32,28,32,228,168,162,207,5,103,235,103,243,227,53,59,223,88,236,119,230,98,96,207,5,99,234,99,117,229,84,194,146,91,223,64,234,84,65,51,36,25,190,225,51,30,205,247,57,241,26,3,77,252,81,67,194,84,85,109,221,65,211,235,143,126,49,77,39,252,236,67,194,88,89,115,225,65,130,31,251,28,64,127,197,59,198,66,232,141,73,76,44,249,139,8,228,179,89,59,217,224,210,67,2,209,33,61,94,10,248,205,44,183,102,172,91,226,212,67,2,191,161,76,230,139,157,83,76,123,42,244,209,133,240,83,2,167,168,4,47,6,66,78,32,104,39,181,87,255,221,83,136,19,195,163,23,109,8,223,129,10,67,223,5,31,0,205,43,69,21,87,253,197,165,143,92,10,146,102,35,223,197,67,2,77,66,85,226,13,61,234,23,242,2,29,175,81,104,67,2,187,97,92,224,15,7,20,68,141,184,118,75,246,27,83,2,173,184,100,43,41,121,13,203,25,128,142,9,37,148,67,2,21,179,81,43,86,16,135,42,132,42,132,160,192,16,66,2,125,8,243,16,31,87,41,70,19,137,185,129,64,211,66,2,121,5,127,140,105,53,132,92,68,6,164,138,31,136,83,2,169,160,229,50,5,0,252,50,6,231,78,51,247,125,83,2,233,168,5,47,251,188,179,99,56,153,64,26,48,132,65,2,53,35,61,43,109,91,1,136,38,193,201,171,161,141,67,194,88,93,119,181,129,221,136,188,171,126,223,150,13,2,82,34,29,37,103,168,13,65,198,205,204,175,208,221,62,27,67,34,165,90,186,189,27,62,21,123,47,219,74,189,127,127,65,2,69,51,69,51,117,99,1,196,201,153,61,23,145,32,66,2,227,114,226,57,229,22,213,89,221,149,25,213,128,53, +81,2,45,31,53,35,99,79,65,104,79,210,183,253,231,45,83,0,57,43,57,43,105,91,1,0,202,30,59,53,68,138,67,194,80,81,105,219,65,227,191,205,109,84,243,186,156,114,81,140,19,108,221,119,152,247,164,42,223,92,223,253,69,248,67,2,213,69,77,98,9,206,173,81,102,150,103,83,4,234,83,0,63,49,63,49,103,89,1,0,17,152,218,78,34,2,67,196,214,213,213,153,128,162,168,139,88,167,118,241,155,159,65,138,3,44,77,147,123,174,171,10,204,63,50,113,61,81,83,2,61,220,111,51,244,248,184,171,196,39,67,184,86,45,65,202,137,68,38,199,102,189,113,42,187,110,6,47,156,159,83,2,175,193,103,43,200,215,102,72,204,25,24,14,241,43,83,104,123,35,227,69,75,226,196,130,214,195,192,162,138,190,83,232,119,108,191,31,46,69,115,62,110,103,139,158,129,90,83,2,187,234,235,63,59,26,208,227,106,33,239,75,173,142,83,2,239,184,35,43,125,142,179,214,90,153,132,76,128,164,83,2,159,128,163,46,74,17,242,19,65,245,48,40,232,180,83,2,241,192,34,51,125,172,62,87,155,115,114,58,45,144,66,2,87,227,87,241,223,84,12,98,44,98,66,124,10,228,65,2,65,47,65,47,105,87,1,164,230,115,27,121,135,141,82,34,37,7,120,164,13,153,99,12,167,208,146,253,146,190,67,34,31,58,162,53,27,253,48,153,77,223,202,245,38,132,66,2,99,242,95,183,167,22,144,221,182,85,238,237,42,40,205,199,164,83,173,26,248,254,138,13,119,103,129,235,139,234,83,194,214,87,202,139,70,120,15,114,31,227,181,181,214,27,66,72,207,161,116,199,170,71,79,50,243,83,252,171,11,139,83,2,105,160,226,46,4,33,143,129,110,128,245,69,198,61,51,196,130,150,224,164,65,219,154,186,219,151,110,127,211,144,67,104,13,149,160,126,188,226,144,197,129,79,44,57,50,144,35,4,13,153,165,210,120,185,64,96,188,122,191,109,185,134,50,4,49,40,60,68,236,208,64,223,24,58,89,20,68,156,33,170,1,117,91,83,96,36,196,77,72,71,82,166,239,211,50,4,57,50,68,64,224,208,128,144,127,42,4,96,10,83,66,104,11,245,122,150,94,75,50,129,21,66,71,91,216,244,67,2,227,34,62,118,75,145,215,197,169,54,47,171,161,1,67,232,5,172,102,51,242,115,189,39,93,231,244,241,151,67,82,2,211,206,20,90,126,152,136,16,18,28,204,229,41,37,83,194,116,120,99,19,253,244,217,86,175,179,230,80,222,1,66,2,205,188,221,166,237,58,72,36,104,34,168,66,108,98,81,2,137,114,168,146,56,35,65,173,89,253,154,25,250,33,82,232,4,204,86,119,62,136,211,159,29,106,102,191,154,250,81,2,137,122,160,154,48,39,129,221,147,244,191,23,147,152,81,2,137,122,168,158,54,39,129,16,189,229,244,212,71,7,67,34,83,73,150,38,89,41,115,142,204,123,231,109,126,239,82,2,53,32,79,24,83,89,118,125,204,31,88,55,17,239,83,2,119,232,162,43,10,99,189,45,6,127,37,112,214,64,82,40,74,171,32,39,105,154,239,45,27,18,113,100,7,136,34,106,38,236,249,173,215,121,8,176,175,187,40,26,250,69,67,2,115,148,95,123,152,73,28,82,43,220,75,23,176,182,67,8,27,236,39,132,158,157,82,46,156,111,12,116,197,82,83,168,7,236,247,44,165,175,79,38,139,93,33,233,226,24,66,2,217,192,237,104,169,89,158,184,106,61,104,89,228,161,66,36,111,177,79,76,121,137,87,103,153,245,160,213,0,245,82,34,119,218,89,75,29,161,210,29,181,47,76,140,17,8,67,34,201,138,173,160,90,249,230,221,63,103,238,104,118,3,82,34,179,214,216,42,45,164,58,225,249,237,59,237,182,194,35,40,35,17,14,207,115,221,13,15,83,158,118,167,74,223,82,36,59,46,241,118,66,130,74,66,152,146,245,224,158,20,83,0,139,124,174,160,50,37,1,0,207,78,215,84,98,228,81,2,149,120,184,156,60,33,1,133,62,80,206,237,172,109,67,34,83,235,213,32,92,127,20,249,136,146,207,6,182,227, +83,194,74,74,62,91,218,205,171,189,117,192,107,171,152,160,83,194,14,14,130,173,50,86,107,250,168,118,116,68,76,6,66,2,87,111,90,181,163,86,161,64,54,107,252,195,121,76,83,2,107,161,198,50,123,175,249,215,232,245,206,4,136,111,65,234,6,44,93,82,205,217,47,100,107,216,18,97,200,189,66,2,223,122,222,189,163,87,110,222,174,106,161,12,223,42,66,2,223,111,223,247,227,53,107,36,234,2,32,98,196,64,67,194,72,73,99,181,129,102,170,213,118,246,155,227,47,228,66,2,227,115,227,249,229,54,227,174,6,230,97,226,150,33,66,2,231,111,231,247,231,53,187,251,210,77,78,45,223,0,65,2,61,43,61,43,109,91,1,184,36,244,160,97,53,119,65,2,61,43,61,43,109,91,1,168,171,182,235,57,228,85,82,194,96,97,119,129,1,96,205,169,250,55,119,106,7,140,82,194,88,89,111,225,1,216,155,230,239,255,179,107,238,223,51,196,84,85,105,245,129,239,18,199,106,155,136,222,111,17,67,194,92,93,113,225,65,217,223,133,89,125,35,198,91,74,66,36,25,203,140,79,78,145,130,196,151,200,113,218,101,253,83,232,29,108,185,167,151,101,201,134,96,244,151,174,18,90,83,200,27,204,253,110,179,190,201,149,202,109,22,210,137,23,83,2,95,137,198,50,218,181,147,20,137,133,32,232,9,13,83,2,239,193,168,59,39,106,230,131,81,2,50,237,40,227,67,2,79,40,165,228,16,110,200,228,51,166,162,116,243,0,83,2,117,210,201,55,11,200,100,96,113,204,55,26,90,96,82,2,27,250,85,95,110,49,139,112,179,196,13,16,252,26,83,194,26,155,15,169,136,50,137,73,200,208,99,71,130,61,83,194,46,175,35,161,225,58,192,83,185,140,249,192,21,229,67,136,14,108,42,197,238,173,215,173,93,131,9,171,138,97,83,2,105,161,232,54,123,173,158,215,238,72,205,41,49,232,67,2,73,38,141,228,78,43,226,41,132,56,254,65,163,11,67,200,9,44,26,221,202,169,83,173,30,167,239,251,96,144,189,39,221,142,142,63,253,208,42,114,77,75,116,195,249,3,83,2,109,203,106,75,193,135,19,195,60,49,166,4,48,83,65,236,6,139,2,43,112,27,205,146,253,161,168,128,240,186,82,36,177,9,197,60,18,104,252,144,13,167,11,125,30,226,83,0,63,49,71,57,119,105,1,0,181,73,84,130,67,128,66,2,219,106,214,51,223,19,128,136,64,76,42,196,40,44,207,5,95,235,227,115,163,51,105,141,170,92,16,101,0,105,81,2,59,247,58,245,114,53,129,153,11,73,157,46,151,154,82,2,51,156,140,31,109,81,179,209,160,233,159,83,204,157,223,197,88,89,111,235,129,128,248,219,148,45,202,178,21,139,81,136,19,85,58,213,230,89,137,89,68,217,2,36,233,241,83,168,48,108,187,111,193,109,201,84,86,31,16,101,188,242,65,170,34,108,89,82,217,214,116,67,169,84,158,181,52,63,67,136,14,149,115,239,63,232,147,205,1,184,65,54,162,92,82,40,84,16,146,104,42,179,233,50,60,9,193,227,138,19,83,2,43,176,35,43,211,89,37,67,95,184,188,3,74,240,66,2,49,255,68,121,242,86,4,96,72,66,194,2,63,12,66,2,223,41,202,154,15,87,174,157,17,218,247,168,23,96,67,2,159,94,234,177,95,100,126,183,205,176,151,192,216,123,83,2,57,209,166,59,69,121,226,189,2,89,104,253,170,100,83,136,25,44,157,37,243,105,154,150,109,191,25,142,224,240,83,2,189,224,164,51,41,213,27,66,202,214,104,207,1,194,82,196,80,83,109,237,17,130,249,68,87,34,41,66,34,177,67,200,77,12,139,229,242,177,88,175,157,176,238,246,112,68,83,194,206,79,190,145,248,223,99,98,238,70,8,175,173,227,82,196,72,73,99,249,17,78,198,72,230,212,169,92,2,113,82,196,70,73,95,243,225,240,252,37,254,15,84,166,137,82,82,196,74,77,99,229,145,245,7,253,206,183,85,174,245,206,67,2,19,116,73,165,22,146,137,4,232,12,34,49,163,156,223,37,159,220,1,61,154,139,37,173,18,181,103,192,214,37, +223,37,155,159,241,59,157,110,255,203,105,39,58,61,5,184,67,2,203,226,68,92,12,34,69,31,72,201,78,4,98,212,66,72,154,225,227,143,108,95,189,36,176,89,23,245,242,66,81,4,59,51,57,45,99,93,1,104,90,166,189,160,111,33,50,4,57,49,57,49,97,89,129,97,103,143,48,6,0,96,66,2,103,234,102,117,167,52,153,54,201,96,201,150,12,54,82,0,53,45,53,45,101,93,1,0,0,248,237,63,63,76,66,36,33,255,240,111,75,23,68,79,244,79,119,79,51,120,66,2,99,111,103,183,167,85,182,87,224,157,51,157,51,95,83,0,63,49,63,49,111,97,1,0,138,5,219,140,165,26,33,198,174,86,238,29,66,164,145,229,118,19,72,98,91,52,67,34,29,185,161,181,26,213,234,254,29,153,121,25,56,132,67,2,79,45,229,220,81,115,187,219,65,217,3,70,174,65,82,104,38,108,117,245,116,212,94,61,105,224,120,96,21,104,82,34,93,45,167,197,45,153,99,45,241,124,159,16,212,26,51,36,167,157,210,55,155,207,243,134,117,221,124,182,109,3,66,2,95,238,222,247,229,54,72,121,160,89,150,213,17,115,66,2,227,246,99,253,227,23,62,6,222,105,230,179,110,117,82,2,51,188,156,55,111,1,185,221,171,159,167,174,93,223,205,235,87,236,234,90,27,171,215,103,199,11,138,208,37,159,83,136,8,108,183,166,149,117,77,7,64,134,16,190,92,118,66,80,47,236,56,125,166,244,94,231,104,27,156,37,134,219,66,168,130,9,130,26,201,134,195,70,57,22,244,116,148,198,83,2,97,144,196,50,24,218,143,216,157,104,237,25,207,190,82,36,41,78,113,133,85,127,190,173,226,249,36,176,222,41,82,196,130,146,222,210,49,151,219,152,158,253,125,25,242,248,35,4,33,149,41,208,122,186,116,250,101,172,100,144,29,9,207,5,153,140,41,142,58,90,105,68,184,0,154,106,96,9,65,236,14,146,113,148,78,128,245,218,95,20,252,183,129,128,67,2,101,4,54,114,139,97,27,22,19,194,36,200,68,64,66,136,153,201,132,7,96,179,38,199,29,31,181,149,11,194,66,2,51,156,51,140,75,56,170,121,234,47,126,14,147,128,82,232,5,82,27,109,136,132,97,6,164,249,218,57,135,35,51,196,224,242,64,225,65,132,41,196,145,69,68,32,36,255,82,34,243,214,216,38,37,48,15,242,54,228,15,85,128,89,82,196,222,238,56,233,1,0,173,74,229,166,166,194,125,242,81,2,143,120,174,152,62,41,65,252,69,234,57,135,88,100,81,2,143,120,174,152,62,41,1,205,240,132,155,117,3,197,81,2,135,112,166,144,54,33,1,65,29,221,246,182,150,239,66,2,77,188,92,230,237,90,36,66,36,74,72,68,76,32,65,2,137,118,168,152,56,39,1,136,230,66,58,230,211,107,66,2,201,184,217,164,239,59,165,140,202,140,76,76,140,32,65,2,137,118,168,150,56,39,1,128,224,10,37,147,205,41,82,34,187,250,74,235,20,177,204,243,206,38,115,216,143,123,82,34,191,218,155,199,22,112,221,111,62,233,31,39,95,180,65,2,133,116,172,152,56,39,1,228,67,14,164,178,216,22,66,2,73,184,92,102,239,27,206,68,42,0,0,100,12,22,66,2,81,185,100,102,235,27,136,74,168,2,238,136,63,78,66,2,209,60,224,230,171,90,109,8,189,73,89,223,63,243,66,2,201,184,217,164,239,59,64,102,24,134,146,38,129,40,82,34,175,212,151,38,37,176,9,112,99,230,82,13,238,115,66,2,89,197,108,234,233,88,6,104,78,236,167,226,223,102,82,34,163,210,84,138,53,36,250,103,174,223,242,234,16,250,81,2,179,136,214,172,90,49,129,97,146,45,179,230,184,232,81,2,185,136,218,168,98,57,65,191,246,124,222,179,97,174,67,34,83,74,158,40,154,177,139,136,156,167,128,110,5,34,67,34,201,172,197,30,93,136,253,196,61,121,104,74,42,123,82,34,179,246,200,42,37,56,184,91,151,250,24,113,161,234,67,34,213,232,157,158,90,185,170,30,43,165,238,252,9,16,82,34,187,250,9,11,29,65,247,246,151,203,214,5,27,99, +66,2,75,124,74,62,155,91,97,230,225,170,218,202,254,13,83,0,63,45,55,47,99,85,1,0,233,150,45,182,100,10,81,2,57,27,57,27,101,73,65,173,253,49,234,197,55,160,83,194,206,206,66,165,181,214,29,163,10,197,33,57,106,10,65,2,53,35,53,35,101,83,1,232,71,116,160,218,157,255,82,34,97,103,248,168,31,228,116,86,181,217,6,220,8,24,66,2,99,231,227,243,229,83,221,2,13,34,29,2,221,45,66,2,223,110,222,55,227,21,41,145,97,106,170,132,76,8,81,2,63,41,63,41,111,89,1,204,123,182,198,145,76,86,82,196,82,83,107,245,49,155,74,229,251,171,84,10,164,76,82,34,33,37,168,164,141,164,69,79,52,123,0,125,129,65,66,2,223,110,222,55,227,21,170,202,44,44,64,42,8,98,66,36,21,131,236,111,124,137,109,94,237,168,169,173,151,245,51,36,157,176,1,181,157,65,83,181,213,23,53,54,139,10,67,2,211,42,181,94,16,230,172,60,178,134,67,185,144,200,83,2,39,162,232,58,30,170,19,253,218,247,158,125,238,217,67,2,79,39,125,224,77,215,42,131,49,150,80,240,68,143,82,2,247,178,156,18,123,33,59,108,55,10,153,207,179,2,83,2,235,178,44,67,227,62,214,74,16,216,85,135,33,181,83,232,29,108,185,102,137,247,219,36,32,245,136,139,192,151,66,2,75,245,75,190,155,57,177,141,110,0,99,64,195,6,67,104,13,204,122,229,222,189,224,51,24,136,209,105,37,19,3,198,94,97,115,203,97,127,99,236,25,169,97,196,46,165,82,2,227,250,72,215,124,184,254,111,183,109,214,247,132,194,67,2,231,141,230,244,17,19,53,162,209,16,127,205,190,116,51,36,15,247,120,35,148,75,243,125,179,21,55,128,148,216,82,168,15,172,181,253,92,216,237,188,158,128,213,127,15,179,83,194,158,159,142,185,118,221,230,207,36,182,118,96,77,142,83,0,63,49,63,49,111,97,1,0,177,89,9,139,216,39,51,196,84,85,109,239,129,162,68,82,241,191,198,173,101,19,66,2,219,106,218,53,225,20,8,68,204,194,161,42,145,42,66,2,99,230,98,115,165,51,243,6,243,201,243,105,51,134,66,200,66,145,149,21,247,126,181,85,55,159,89,113,115,113,1,74,46,21,139,245,198,81,194,149,127,54,12,242,20,220,82,232,4,44,53,61,148,184,78,45,31,232,135,26,25,178,82,34,93,107,168,205,53,192,77,108,106,19,100,170,206,149,82,2,187,248,141,83,247,4,48,26,189,168,123,65,229,218,207,41,34,209,116,245,22,94,52,117,151,151,9,231,49,148,67,2,75,11,205,94,81,196,189,180,159,253,135,128,98,87,66,2,111,229,231,54,223,59,253,14,100,12,68,165,173,156,66,2,215,245,203,127,151,58,61,76,191,6,99,236,22,185,67,2,217,202,181,232,14,132,164,254,125,91,90,223,105,245,83,2,115,208,194,43,36,173,79,137,169,140,18,198,24,5,82,2,115,196,204,20,89,49,19,192,233,215,188,42,106,148,83,40,9,172,223,39,253,186,154,230,86,127,73,109,4,11,66,240,1,204,49,191,255,190,94,231,173,27,7,245,111,92,83,194,42,42,159,55,62,132,106,157,55,166,85,81,222,4,83,2,203,62,123,113,243,228,144,106,88,216,197,140,128,12,67,72,28,181,172,217,234,188,51,229,130,247,54,90,200,185,51,36,153,113,25,189,154,121,234,218,223,166,128,109,154,18,51,2,73,251,66,249,116,59,17,223,221,32,252,195,220,28,223,137,3,241,52,189,124,80,42,253,140,8,243,65,235,246,67,2,79,11,181,92,81,135,164,252,173,212,232,89,226,177,67,136,19,12,10,221,194,145,199,170,157,127,244,179,97,1,67,2,77,40,157,96,15,99,189,78,42,5,90,205,154,40,82,2,119,174,13,30,113,224,130,207,172,215,191,107,95,133,83,2,231,161,232,58,140,244,15,213,42,165,165,122,102,45,83,2,39,169,38,51,81,3,181,90,246,182,111,47,236,57,82,2,187,144,13,26,127,185,98,56,4,26,90,73,131,9,67,2,199,165,108,224,13,55,35,209,26,65,137,89,40,148, +67,2,213,192,53,230,11,231,172,32,189,38,33,126,81,16,67,2,75,6,109,222,77,45,32,209,141,239,251,31,39,173,67,2,81,75,197,96,144,231,226,164,253,20,113,152,59,176,82,2,111,232,138,49,113,240,255,182,157,35,237,14,100,42,67,194,100,99,129,189,129,149,83,53,187,176,103,215,249,227,67,2,85,113,21,227,20,17,199,138,212,133,113,160,204,10,67,34,159,249,153,183,90,63,231,181,137,104,234,5,227,220,82,136,3,108,109,181,84,208,106,63,9,208,151,45,123,70,66,2,227,115,227,249,229,54,128,145,138,81,29,213,183,179,81,2,63,35,63,35,111,83,1,207,220,101,95,43,39,254,223,197,78,79,103,237,65,123,182,109,237,38,181,146,148,0,65,2,59,39,57,39,105,87,1,104,81,236,124,98,78,235,207,5,103,234,102,117,167,52,1,144,88,224,191,148,9,255,81,2,65,39,57,39,109,87,65,171,126,177,71,85,78,102,223,37,157,156,217,51,158,230,159,147,246,191,174,13,208,180,81,2,49,27,45,23,101,79,129,93,61,219,180,114,203,204,67,34,25,120,161,179,89,71,204,162,114,175,199,111,111,235,51,40,84,181,52,215,154,197,210,205,61,1,160,80,170,52,82,2,177,32,158,120,89,5,26,54,17,50,6,35,104,156,83,2,101,153,199,58,160,68,231,91,74,45,212,235,66,191,223,41,129,65,18,106,114,19,33,61,159,212,33,65,153,168,223,37,51,35,36,104,2,9,53,153,100,244,39,229,255,7,82,36,45,141,51,81,99,247,21,246,132,106,160,84,42,149,81,4,15,10,68,64,236,222,0,8,35,169,189,63,161,155,82,36,109,7,65,81,51,149,111,229,189,164,14,128,9,5,207,201,131,225,80,133,88,22,3,18,181,28,180,242,195,227,83,2,177,208,196,47,86,219,107,220,56,170,125,97,175,7,82,104,11,99,193,51,58,95,92,187,7,122,84,11,62,62,82,2,31,176,87,118,116,153,0,18,2,94,128,33,24,13,67,168,0,236,182,107,230,117,190,39,27,159,6,71,118,23,51,36,69,77,221,156,29,160,228,72,164,109,46,177,100,255,81,2,135,116,168,148,60,37,65,11,7,244,150,17,95,254,66,2,201,184,217,164,239,59,206,36,130,34,44,66,172,42,81,2,135,118,170,150,62,39,65,108,53,219,65,7,30,65,65,2,131,112,162,144,50,33,1,36,184,254,173,251,50,159,81,2,141,118,172,150,60,39,1,45,68,244,95,235,168,10,83,0,135,120,166,152,54,41,1,0,124,50,179,145,13,26,81,2,135,112,166,144,54,33,129,205,30,48,87,32,239,152,81,2,137,114,168,146,56,35,1,213,196,10,249,195,124,18,81,2,135,112,166,144,54,33,65,207,80,36,154,205,79,174,65,2,137,118,168,150,56,39,1,16,184,74,127,216,125,7,66,2,193,184,81,164,243,59,174,64,108,102,66,50,65,118,81,2,133,114,168,146,56,35,65,105,61,249,48,19,82,116,66,2,201,184,217,164,239,59,74,72,32,132,204,2,12,34,66,2,201,184,217,164,239,59,138,156,138,22,202,142,84,10,65,2,127,118,162,148,50,37,1,176,248,177,87,106,12,118,81,2,143,118,174,154,62,41,129,64,60,52,133,229,204,13,81,2,143,120,174,152,62,41,1,87,128,7,50,92,6,70,66,2,77,188,92,230,237,90,140,64,138,72,8,160,128,44,82,2,97,102,90,153,115,81,86,10,45,87,117,110,196,148,83,2,227,153,137,71,0,16,4,65,162,8,228,71,32,214,65,2,137,116,170,148,52,37,1,168,215,57,183,14,113,54,65,2,137,118,172,154,48,31,1,176,51,88,10,55,116,246,67,34,201,168,141,156,24,189,15,20,175,95,77,21,170,205,82,34,127,154,75,195,36,88,199,203,140,185,105,238,88,142,83,2,85,96,131,42,172,141,25,65,219,171,190,253,255,59,82,2,241,39,173,220,5,240,253,65,227,51,76,220,145,9,83,2,203,54,92,125,194,26,11,132,179,14,50,125,27,65,83,2,43,185,102,51,238,6,52,126,3,166,174,175,66,188,66,2,237,44,121,154,109,92,243,118,251,224,145,80,98,217, +83,0,69,55,61,47,105,91,1,0,117,170,110,108,11,57,67,194,116,113,137,195,129,8,226,67,200,3,96,6,1,82,67,194,84,83,105,219,129,76,23,88,114,77,28,27,51,222,83,0,59,45,59,45,99,85,1,0,219,190,197,113,37,9,66,2,99,235,99,181,231,85,63,57,221,211,229,233,123,10,50,4,69,57,63,49,105,99,65,224,83,81,193,239,165,184,66,136,101,49,245,148,150,255,244,116,150,159,151,25,127,224,66,2,219,106,218,53,225,20,0,200,68,68,34,76,170,76,82,196,84,85,107,247,49,155,20,173,111,186,222,51,155,139,82,196,82,81,105,243,73,248,125,39,101,231,85,254,158,138,33,170,48,172,190,22,31,137,69,91,39,19,196,172,67,86,66,2,215,102,214,51,225,20,64,34,204,34,204,44,196,194,82,196,80,77,103,247,137,249,183,159,218,222,84,9,40,173,82,196,82,83,105,235,41,250,114,34,166,220,164,10,26,76,51,196,82,79,103,233,129,219,46,59,109,146,0,139,37,152,65,2,61,45,53,39,105,87,1,232,255,106,19,246,237,6,223,137,19,75,33,27,18,156,205,179,149,41,169,70,76,76,34,136,137,233,241,155,63,235,165,157,194,47,95,167,111,73,35,168,34,17,246,85,23,30,213,212,22,156,84,82,8,254,67,2,85,74,181,100,16,42,218,8,76,14,209,220,255,244,66,2,87,220,86,50,163,93,141,0,65,128,187,130,179,91,83,40,124,108,177,37,183,255,93,206,217,10,117,155,51,128,65,138,25,108,219,114,238,223,174,96,219,62,129,42,98,131,34,136,213,65,245,80,176,61,153,209,233,53,93,143,213,130,66,8,129,137,25,36,114,65,255,42,177,81,135,101,157,156,207,5,91,103,227,179,229,20,121,35,62,7,117,63,83,78,67,2,81,43,205,222,18,121,140,139,220,142,162,54,73,199,67,2,83,78,237,90,19,16,141,102,231,214,156,123,247,189,66,72,154,9,154,98,231,81,253,44,114,73,61,240,96,0,67,2,211,43,213,94,146,238,6,186,199,82,37,66,59,90,67,194,86,85,111,229,65,151,210,176,11,223,251,183,41,165,66,2,99,231,227,243,229,83,17,29,208,2,32,0,1,0,83,200,66,108,181,230,87,247,109,212,235,47,229,7,110,250,82,196,80,77,103,237,1,40,221,64,228,219,89,106,159,62,67,2,77,169,164,216,80,228,152,116,230,4,167,177,193,176,82,2,119,178,156,26,117,193,155,129,55,168,218,176,93,203,67,8,21,181,170,37,84,85,59,244,146,153,108,242,169,93,35,48,78,108,94,99,234,189,201,247,239,27,21,128,136,179,83,2,43,162,234,62,99,182,142,199,125,80,191,3,252,155,65,74,11,108,91,242,177,183,180,2,187,62,137,124,52,155,67,2,113,71,135,126,76,115,62,135,60,239,147,28,158,232,67,2,191,168,164,98,80,19,52,101,157,121,64,209,26,252,65,106,13,236,168,199,214,214,108,135,201,91,18,228,59,196,67,2,245,136,191,124,15,118,5,145,31,218,15,196,217,226,83,2,253,249,196,51,161,181,18,98,59,78,219,172,9,224,82,2,143,153,35,63,86,128,8,35,2,36,64,123,57,21,223,197,96,95,117,225,129,205,7,52,159,148,172,110,219,168,67,232,5,236,219,37,207,173,214,237,30,111,118,215,37,131,65,2,75,57,75,57,115,97,1,120,169,122,23,180,86,34,66,2,91,227,91,243,227,19,2,51,33,16,111,98,223,221,207,5,219,227,91,177,161,148,114,251,244,47,74,123,10,52,66,136,19,49,53,181,54,127,85,85,87,157,203,158,124,254,83,168,1,172,217,174,129,101,73,20,136,102,128,20,33,9,66,2,199,209,203,110,155,91,12,60,226,85,224,89,16,85,83,2,101,152,4,47,76,231,99,136,244,149,18,155,0,208,83,2,107,169,6,55,22,106,63,251,158,105,175,225,214,106,83,2,97,136,3,43,46,236,63,100,40,145,71,100,146,66,83,2,103,177,104,55,160,111,30,203,177,181,14,175,211,26,83,2,105,169,39,55,121,206,110,231,152,99,165,254,57,80,67,2,205,136,173,112,16,4,226,159,49,214,199,253,156,75, +83,8,75,44,153,159,141,52,61,150,249,111,119,53,11,129,83,2,105,177,69,47,43,24,208,92,195,181,4,121,118,156,66,2,223,241,219,56,223,91,125,69,177,55,25,253,23,48,83,194,190,67,46,186,123,177,242,189,234,197,229,90,62,5,67,194,106,111,141,95,1,71,3,158,110,213,93,247,166,213,83,194,46,174,158,183,197,11,183,123,224,235,44,63,102,5,83,194,182,55,166,27,148,98,75,153,104,148,250,139,1,81,82,34,33,103,40,225,167,152,156,37,188,221,204,165,25,64,66,2,223,110,222,55,227,21,102,174,234,102,106,66,161,64,51,196,80,79,103,245,129,32,104,62,185,99,60,203,34,196,50,4,51,47,53,39,105,79,129,246,178,107,13,58,137,220,82,34,93,101,118,128,15,165,248,203,43,119,33,82,197,245,66,2,95,231,227,245,229,52,61,84,5,100,14,20,106,22,67,2,81,9,173,92,16,184,153,103,226,238,24,27,50,198,82,2,249,224,223,60,105,128,168,44,149,159,114,119,246,134,82,2,111,210,219,54,109,25,225,58,5,211,100,166,214,172,82,2,109,96,204,152,105,8,9,44,144,17,152,111,70,140,223,73,8,245,137,184,221,106,58,230,93,164,56,241,237,227,207,105,216,73,118,220,200,22,180,212,91,94,172,120,6,66,222,137,215,137,114,52,63,1,73,160,176,96,228,167,225,156,33,198,70,41,95,26,164,47,134,236,2,95,5,131,65,38,82,36,105,70,49,176,16,189,121,237,110,233,253,224,68,5,67,2,25,254,233,175,95,231,28,120,83,192,35,168,3,66,33,198,72,43,160,24,128,247,107,71,141,52,218,234,162,87,82,2,219,168,195,49,106,161,218,40,122,135,107,1,125,24,83,40,129,129,171,205,51,77,141,88,217,215,9,11,93,241,81,2,149,116,178,150,64,43,129,224,16,133,89,129,56,179,81,240,18,140,243,206,157,243,202,92,44,213,23,226,174,74,65,2,137,118,168,150,60,43,1,168,64,202,78,238,132,19,81,2,129,104,162,144,54,33,65,175,60,191,98,153,242,231,67,2,15,59,185,37,157,183,69,141,83,64,35,234,3,42,67,2,31,132,98,76,142,137,132,25,226,76,25,51,118,140,206,177,65,137,86,28,155,147,61,3,14,198,108,243,121,213,67,2,107,232,142,116,142,196,141,48,230,244,169,79,209,3,83,40,31,236,116,205,113,207,93,86,201,31,13,22,44,217,81,2,137,116,170,148,58,37,1,196,53,245,194,210,204,247,65,2,131,112,162,144,50,33,1,96,146,126,233,63,216,55,81,2,139,114,170,148,58,37,65,160,40,44,200,90,204,48,65,2,123,110,162,140,46,29,1,224,171,235,179,163,189,113,65,2,133,114,164,146,52,35,1,192,86,83,112,82,67,121,81,2,127,116,166,148,54,37,129,151,128,53,120,212,58,64,82,34,189,156,155,195,14,241,9,72,160,24,136,202,230,4,65,2,131,112,170,152,58,41,1,192,53,174,236,34,85,100,83,0,127,112,166,152,54,41,1,0,73,32,41,38,27,118,82,34,127,186,90,231,20,136,178,54,255,205,184,153,172,105,82,34,191,250,10,235,28,104,250,231,148,188,119,103,186,158,66,2,69,52,89,162,241,60,36,145,104,233,18,233,30,110,83,0,125,110,166,150,48,35,1,0,13,17,137,113,20,167,82,72,28,140,22,183,62,68,195,191,43,0,172,222,205,92,207,197,204,222,34,235,1,0,105,224,46,111,125,207,23,136,65,2,125,110,156,142,48,27,1,100,144,222,146,75,91,45,82,2,225,34,218,184,89,81,93,171,105,247,226,46,216,141,67,2,201,35,93,112,14,17,34,198,12,33,119,233,12,28,83,0,127,116,158,152,46,29,1,0,110,50,59,183,10,81,67,34,71,108,205,154,156,59,87,221,95,187,162,26,129,131,67,34,203,201,157,158,153,61,127,176,157,111,50,34,110,230,83,0,139,124,174,160,50,37,1,0,73,5,33,10,41,65,81,2,135,112,170,148,46,25,65,73,109,61,251,131,112,50,82,136,9,204,86,191,126,136,227,157,61,4,104,26,208,202,82,2,109,70,222,81,115,201,254,4,180,31,82,127,195,74, +81,2,71,47,63,39,107,83,129,115,189,73,173,162,220,60,82,34,165,105,40,201,39,69,40,137,158,141,103,22,126,198,82,0,75,67,67,59,111,103,1,0,0,88,163,28,100,139,66,2,91,230,223,181,163,53,61,211,59,93,211,149,233,4,66,2,219,231,95,53,229,20,206,170,170,217,160,153,160,155,223,233,29,113,101,189,92,148,94,47,25,58,244,115,101,215,66,2,227,115,98,57,229,22,96,185,46,144,189,66,51,239,82,0,61,57,53,49,105,101,1,0,0,0,10,136,64,162,67,194,88,87,111,189,65,211,219,58,183,174,173,85,48,196,83,194,86,86,74,139,121,6,88,107,175,38,238,76,124,26,66,2,231,238,102,183,231,21,158,235,238,157,155,174,240,173,66,2,107,241,110,56,233,92,49,255,238,254,204,44,4,8,82,2,179,218,92,59,239,176,170,239,125,198,243,192,205,86,82,2,51,220,156,55,239,192,117,189,26,245,86,47,160,202,83,194,202,207,63,31,33,164,223,162,159,169,86,219,106,6,66,40,31,49,19,179,212,125,85,117,182,158,31,245,90,72,82,0,61,57,53,49,97,93,1,0,0,164,192,175,85,40,81,2,67,43,59,35,107,89,65,205,192,254,58,247,157,155,65,2,65,55,57,47,109,95,1,208,249,82,126,149,0,96,51,196,88,85,109,229,129,20,101,59,36,144,218,145,152,118,67,194,98,93,121,133,65,15,202,250,243,206,187,121,182,206,66,2,95,226,227,179,165,52,210,226,208,30,242,222,2,191,83,0,73,59,65,51,109,95,1,0,182,188,78,193,19,188,83,194,182,59,171,23,156,19,200,5,196,152,72,137,169,249,83,0,75,61,67,53,119,105,1,0,38,99,66,242,40,90,65,2,77,67,69,59,113,105,1,248,106,228,182,74,194,248,33,198,176,87,46,30,109,127,153,255,238,253,18,32,128,150,83,40,2,108,179,229,193,109,201,70,4,239,40,22,141,203,82,104,21,108,125,173,60,244,106,41,123,218,169,194,185,229,82,196,88,89,111,235,65,250,155,8,211,34,8,86,149,90,51,36,31,187,225,181,29,160,109,69,205,214,198,203,255,239,81,2,67,45,59,37,111,89,129,25,9,229,20,243,105,140,67,194,80,77,105,219,65,174,228,230,169,79,187,59,119,213,82,36,141,200,196,124,64,40,71,154,33,146,87,247,40,9,51,72,6,113,101,109,252,120,74,25,95,72,13,153,217,52,65,2,59,41,51,33,107,89,1,224,11,220,15,35,151,32,67,194,106,105,137,127,1,196,18,249,151,91,235,159,243,229,83,194,198,74,186,161,210,165,96,173,13,248,70,234,254,0,83,194,78,78,67,159,100,54,159,126,239,99,115,211,71,1,67,194,86,87,115,189,65,207,157,174,43,190,83,185,70,106,67,40,74,11,126,226,244,235,122,189,97,3,110,136,102,152,82,194,92,91,117,155,1,96,69,178,120,143,127,242,174,223,173,7,75,47,71,51,115,103,193,77,6,101,187,229,103,1,83,2,179,202,139,63,49,166,16,178,115,185,41,48,223,210,81,2,79,57,71,49,115,93,1,247,183,249,226,230,134,9,82,0,77,69,69,61,113,105,1,0,0,112,232,76,27,95,50,4,71,61,63,55,115,107,129,176,191,177,183,76,217,67,67,194,98,95,121,167,129,198,220,64,227,62,159,89,51,237,83,194,206,78,67,167,243,247,117,39,96,103,237,113,238,185,81,104,38,146,18,161,125,227,157,144,1,61,30,169,203,124,83,40,74,108,179,100,119,239,91,174,187,161,57,248,79,182,67,2,211,103,133,226,78,2,48,3,81,159,242,57,50,198,83,232,59,108,187,166,167,115,187,158,220,43,24,23,53,224,65,42,124,108,107,146,123,210,242,25,212,13,4,9,133,43,83,136,3,44,179,220,139,162,154,164,107,236,160,0,7,144,65,138,19,44,73,206,190,182,179,193,119,183,142,107,195,189,83,2,39,161,6,51,251,191,220,199,25,221,136,168,68,128,83,2,47,176,4,47,0,165,33,32,47,132,216,106,92,88,67,2,195,34,101,106,12,252,1,157,192,40,71,2,69,173,67,2,209,70,133,228,76,28,224,157,217,9,124,79,102,179, +67,2,223,39,150,240,14,229,182,93,51,4,67,153,129,240,83,2,45,185,71,51,49,100,251,20,209,103,121,208,239,15,83,194,14,19,134,109,128,88,7,197,234,72,253,130,73,111,83,2,245,202,171,71,201,202,218,43,5,215,96,222,180,17,67,8,27,204,90,229,210,219,236,121,91,27,13,96,82,153,66,2,227,235,103,247,167,85,102,65,81,2,18,18,227,168,35,4,227,231,231,117,231,85,227,6,2,2,75,10,137,187,66,2,227,235,103,247,165,84,238,97,157,113,29,2,157,86,82,196,82,79,103,231,81,1,137,91,83,47,249,25,170,186,67,168,18,172,74,213,222,135,68,103,30,228,213,234,41,9,82,2,119,136,141,57,115,145,0,18,19,156,6,107,104,164,206,201,131,1,180,198,140,29,37,95,2,45,82,204,185,36,82,2,247,130,92,29,107,129,129,54,20,170,92,109,43,134,81,2,99,14,140,58,12,219,128,4,34,130,142,24,71,172,50,4,19,12,70,64,218,204,128,252,67,82,89,158,169,222,82,2,25,64,9,209,99,145,24,49,97,100,132,84,17,130,82,36,9,22,179,213,235,248,11,252,67,248,182,14,165,93,67,34,25,140,163,132,152,102,75,208,194,73,132,194,0,26,82,2,209,109,53,65,29,192,153,85,98,8,68,140,153,64,66,2,25,136,177,206,125,27,213,147,117,141,61,64,203,128,67,40,17,149,231,126,223,50,228,233,4,15,92,14,22,147,83,2,117,224,227,47,70,185,170,108,57,38,93,95,110,6,82,36,119,237,176,118,50,132,188,65,150,30,241,51,252,67,83,2,51,218,202,71,152,0,67,32,57,8,230,143,195,183,67,34,87,8,158,38,27,17,48,79,72,43,241,122,9,213,83,0,125,110,164,150,52,39,1,0,52,2,166,240,196,141,82,168,18,140,6,183,30,104,211,159,13,102,70,189,101,221,81,2,139,116,170,150,62,41,129,96,16,129,144,196,5,97,66,2,197,180,217,164,239,59,36,138,226,2,33,76,198,72,65,2,129,110,168,150,56,39,1,68,148,145,49,0,130,230,66,72,136,201,181,31,38,209,182,205,209,89,208,116,108,95,82,2,141,58,148,7,101,97,69,25,88,21,52,170,157,171,82,2,17,67,101,12,5,168,251,112,204,161,101,139,220,140,35,8,29,209,205,14,115,62,109,14,19,158,228,59,99,56,66,40,75,113,173,46,115,222,237,110,179,157,138,234,113,182,207,9,130,233,243,221,213,209,100,159,111,23,73,76,13,156,66,2,73,184,88,228,239,91,204,40,72,42,4,24,2,242,82,34,187,246,136,6,47,100,183,212,133,232,141,157,171,123,81,2,131,104,174,156,58,37,65,64,38,145,217,203,236,244,65,2,131,112,170,152,54,37,1,216,15,99,166,189,233,100,66,2,193,184,213,166,241,90,45,174,166,201,146,138,96,202,82,34,191,184,90,231,28,184,121,239,142,171,167,115,117,214,83,0,129,114,168,154,52,39,1,0,105,100,11,162,36,150,81,2,129,106,168,146,56,35,1,137,28,134,149,167,129,91,223,3,129,106,158,144,46,33,225,75,200,74,124,39,214,133,82,34,125,248,155,175,22,228,171,72,209,241,91,39,78,148,51,36,197,76,205,26,29,241,47,203,13,73,81,22,41,1,83,0,127,112,158,144,46,33,1,0,16,69,154,10,66,251,65,2,131,112,162,144,50,33,1,80,124,105,231,161,104,32,35,4,193,189,80,166,183,61,237,147,0,79,216,215,173,240,82,34,191,250,75,203,20,136,74,44,253,187,163,241,77,234,83,0,127,112,158,144,46,33,1,0,107,23,119,142,98,65,65,2,129,110,160,142,48,31,1,24,148,223,109,233,231,235,65,2,129,110,160,142,48,31,1,176,127,221,45,176,148,210,207,137,3,145,173,46,19,254,108,142,146,159,148,246,18,19,65,2,135,114,170,146,46,31,1,48,118,14,204,149,189,70,83,0,135,120,170,156,46,33,1,0,44,157,64,166,67,186,82,196,212,232,42,235,33,22,75,189,82,59,208,90,86,250,223,37,69,206,28,20,27,129,167,70,74,246,195,93,171,116,82,8,16,204,86,183,126,72,199,191,29,130,107,158,176,48, +81,2,73,51,65,43,109,87,65,150,219,239,188,119,1,138,83,0,81,67,73,59,117,103,1,0,173,101,39,182,109,131,65,2,75,57,67,49,119,101,1,184,255,181,159,223,7,228,82,34,229,105,40,193,31,9,235,206,134,30,63,157,101,95,66,2,91,102,95,245,227,52,225,65,62,53,146,223,8,53,66,2,219,106,94,247,161,20,185,93,150,155,10,118,170,128,66,2,231,236,103,118,229,28,128,234,205,34,247,62,187,255,66,2,219,107,219,245,225,52,0,164,196,44,108,38,16,46,82,34,25,73,38,137,37,41,85,9,85,179,221,239,85,121,82,34,133,49,49,194,76,65,253,172,10,90,163,55,220,165,82,34,29,73,39,169,37,73,92,123,184,221,130,179,2,208,66,2,231,119,231,251,231,55,99,138,95,3,255,223,247,127,67,194,106,105,133,185,1,57,168,203,125,51,79,198,15,10,66,2,219,110,94,249,161,85,66,168,226,12,234,34,94,122,66,2,91,235,95,183,227,21,108,194,104,42,194,18,128,72,66,2,95,234,227,183,163,53,200,8,200,44,97,164,96,42,65,2,57,39,49,31,101,83,1,32,87,171,242,47,247,3,51,2,67,37,59,29,111,81,17,2,33,202,104,186,53,2,67,194,84,81,107,233,65,29,127,191,253,163,113,217,129,131,65,2,63,43,55,35,103,87,1,224,103,164,131,250,105,201,66,2,83,227,87,179,225,20,194,76,34,194,34,194,34,4,83,0,71,57,63,49,107,93,1,0,165,189,25,155,180,200,66,2,79,223,83,177,223,51,72,72,136,68,136,72,136,128,83,0,75,61,67,53,111,97,1,0,182,236,214,112,12,202,81,2,79,57,71,49,115,93,129,173,204,163,182,83,190,77,66,2,83,227,87,179,225,20,132,64,66,34,204,42,36,42,67,2,79,232,68,218,11,2,138,4,8,140,112,145,170,140,95,137,204,9,34,165,157,235,49,250,17,191,92,3,207,73,82,36,181,2,133,110,40,166,58,72,211,67,81,238,247,202,221,203,187,97,233,147,211,123,75,198,33,162,6,161,165,171,81,232,145,161,73,154,158,91,116,97,129,121,80,19,195,3,82,36,209,202,206,108,130,165,202,190,126,170,253,29,2,221,82,2,239,164,11,17,91,1,82,74,29,117,233,46,205,148,83,2,233,160,228,50,103,239,123,247,62,245,220,13,204,63,67,2,75,193,52,94,139,103,136,67,237,140,16,78,0,82,67,2,213,35,85,224,12,2,18,145,145,64,184,57,115,148,205,43,14,203,136,204,252,206,247,175,129,99,79,159,29,92,83,2,113,192,163,47,9,98,28,112,146,206,93,81,75,102,19,8,203,137,250,37,17,35,167,253,241,183,95,143,78,195,67,194,86,83,109,185,1,110,250,215,254,69,206,15,243,25,65,2,71,53,63,45,115,97,1,88,51,222,105,52,3,232,65,2,69,51,61,43,113,95,1,168,207,165,22,193,135,182,35,196,86,83,105,241,1,0,177,18,180,164,206,147,156,147,82,196,86,83,109,245,145,245,223,45,158,125,32,170,168,20,82,196,92,89,111,241,241,136,156,5,0,168,173,116,191,79,66,36,37,199,238,62,205,8,108,191,37,25,95,85,255,221,205,171,7,108,122,254,60,141,79,35,202,139,68,84,216,227,82,36,177,23,135,126,128,65,180,61,23,170,123,62,61,75,83,2,105,152,228,50,0,162,148,116,126,231,255,187,222,187,67,2,205,225,60,92,140,107,137,226,40,36,177,120,193,40,82,2,119,194,13,241,98,217,1,176,65,192,138,140,124,65,65,74,26,108,221,207,147,211,251,100,15,253,27,225,193,43,51,136,147,9,113,164,29,166,168,26,220,80,180,127,135,204,82,2,235,172,202,17,233,232,252,6,56,87,226,102,207,141,67,2,211,194,77,246,11,182,16,113,202,232,140,160,58,121,67,2,107,75,150,238,141,223,191,157,59,191,234,164,34,31,83,104,6,108,185,231,53,149,115,6,148,35,192,47,136,63,83,136,103,172,50,198,217,125,207,85,194,239,62,217,130,164,82,40,2,44,54,110,85,88,155,93,109,120,106,113,85,20,67,200,24,245,57,109,160,200,83,157,132,15,74,12,243,11, +83,40,163,33,69,137,79,45,79,19,77,59,149,243,208,2,51,36,17,48,1,59,156,8,2,67,138,34,19,146,208,236,207,5,103,243,106,117,169,85,64,59,90,163,41,251,107,41,66,36,157,67,234,79,75,25,206,110,206,183,238,42,68,165,51,196,74,69,91,223,129,148,219,189,196,215,36,235,191,181,82,8,35,139,140,109,240,238,191,45,3,134,249,39,162,148,83,2,41,160,5,55,8,65,6,0,28,150,151,119,198,190,66,136,131,137,15,42,52,89,255,34,112,89,219,113,33,33,67,2,79,2,85,92,142,160,146,0,240,4,195,57,61,143,66,136,153,73,49,198,74,134,19,70,124,30,128,8,26,205,174,199,122,154,236,176,129,4,145,154,170,145,25,238,162,95,82,36,5,7,185,176,20,0,113,74,115,3,157,29,101,227,65,2,103,118,132,144,206,220,0,56,230,82,90,97,170,237,66,2,49,69,192,232,114,61,111,169,30,65,209,204,45,96,82,8,75,18,173,198,252,50,76,173,160,129,199,255,228,119,82,34,241,174,207,213,56,192,151,198,166,166,154,129,162,17,51,168,146,169,176,198,194,46,235,52,246,112,117,104,191,159,67,2,101,193,62,244,76,185,57,110,62,96,11,8,83,64,81,236,6,204,113,219,176,179,51,8,181,87,83,143,26,16,83,2,175,208,164,51,70,166,47,221,119,250,38,48,54,66,67,196,188,48,181,1,108,102,23,121,173,250,205,243,137,189,81,2,135,114,180,150,48,31,129,10,226,38,187,27,188,135,81,2,127,108,166,148,50,37,129,141,98,191,90,31,3,132,66,2,61,176,85,100,243,59,40,19,176,101,51,206,159,190,81,2,121,108,160,150,48,39,1,134,86,180,159,127,70,23,81,2,131,104,170,142,58,35,65,121,103,124,50,207,118,102,83,0,125,110,164,150,52,39,1,0,137,213,152,169,208,117,81,2,133,110,172,150,60,39,65,169,46,242,94,123,186,6,83,0,125,110,164,150,52,39,1,0,121,123,95,201,161,40,66,2,189,180,209,164,243,59,2,208,78,210,20,221,244,219,83,0,127,112,166,152,54,41,1,0,190,240,9,149,73,80,67,34,75,234,165,38,154,42,37,10,209,152,36,38,213,178,66,2,197,180,217,164,239,59,12,97,164,70,146,140,101,128,66,2,197,180,217,164,239,59,36,68,204,204,74,172,40,106,65,2,125,106,164,146,52,35,1,120,248,227,34,58,104,52,81,2,121,112,160,152,48,37,65,134,52,176,66,244,98,195,66,2,197,180,216,164,177,91,230,26,170,62,98,197,154,10,66,2,193,53,217,228,239,91,41,98,102,10,108,138,106,42,83,0,119,104,170,156,54,41,1,0,178,12,106,212,203,149,65,2,125,106,176,158,56,39,1,136,122,126,41,151,20,20,82,34,127,248,200,10,29,5,154,112,208,32,90,81,145,195,223,37,67,44,229,24,30,118,239,165,153,178,203,74,66,210,65,2,123,104,162,144,46,29,1,216,49,217,228,105,239,143,65,2,123,104,162,144,46,29,1,216,185,184,82,237,35,153,50,4,109,100,160,152,44,33,1,63,192,42,233,43,22,153,67,34,61,109,197,26,92,121,232,164,118,105,106,78,255,233,81,104,6,203,183,131,230,46,250,104,213,252,39,60,120,4,67,34,209,232,157,36,26,142,227,103,29,155,84,132,156,65,82,196,214,232,40,231,49,79,129,39,101,75,169,96,1,72,51,136,153,9,62,250,74,175,233,174,46,209,121,193,40,99,51,196,214,232,48,219,129,237,31,197,155,41,201,166,40,201,66,2,61,181,77,162,245,92,110,102,165,128,149,106,222,191,66,2,193,184,209,164,243,59,32,235,242,237,222,36,43,4,66,2,189,57,205,100,245,91,150,102,201,144,147,57,105,99,65,2,127,114,160,148,42,29,1,16,56,122,236,107,227,255,207,9,23,17,173,206,82,158,173,46,115,158,78,179,125,38,82,196,212,232,44,225,161,134,74,7,246,148,100,31,188,79,82,34,251,184,219,170,38,40,91,29,59,153,35,186,252,243,65,106,13,12,193,221,207,156,254,128,252,216,18,139,47,234,35,136,160,129,97,148,122,158,199,20,237,30,112,181,125,183, +83,0,83,69,75,61,119,105,1,0,74,166,198,78,208,136,66,2,87,219,91,175,163,50,144,6,96,246,12,249,102,153,66,2,87,234,219,183,161,54,16,81,57,213,146,223,106,149,66,40,2,113,53,149,150,191,117,21,151,159,106,212,216,216,82,196,98,95,119,231,49,3,149,215,164,234,85,110,125,222,81,2,71,49,63,41,107,85,65,223,251,1,119,3,250,4,81,2,83,61,75,53,119,97,1,28,67,22,241,119,250,25,83,8,29,172,211,173,245,44,203,78,77,147,36,224,11,62,82,34,97,75,104,161,39,73,68,202,155,222,99,126,236,71,83,0,79,65,71,57,115,101,1,0,250,108,118,129,18,201,82,34,165,105,40,201,39,201,69,11,60,53,74,121,250,251,67,40,2,172,74,213,222,169,84,45,95,243,201,22,232,73,82,34,229,41,120,205,37,133,43,99,165,114,86,33,136,73,82,34,93,39,246,132,23,177,118,109,58,187,181,39,255,222,81,2,69,27,61,19,113,71,129,99,248,55,55,246,190,220,81,2,53,31,45,23,97,75,129,87,169,135,98,65,240,103,66,40,2,177,116,212,149,31,213,116,54,159,223,135,82,226,83,0,63,49,55,41,99,85,1,0,117,47,202,176,200,134,83,0,67,53,59,45,103,89,1,0,169,185,154,171,185,26,82,196,82,79,103,245,49,55,5,69,83,106,113,50,75,252,83,0,69,55,61,47,105,91,1,0,173,227,196,74,18,36,66,2,223,231,99,53,231,84,99,102,201,57,6,57,99,156,66,2,91,227,95,179,229,20,224,225,226,66,68,0,64,36,66,2,87,226,219,179,161,52,0,164,44,34,44,132,44,196,83,0,67,53,59,45,103,89,1,0,118,160,60,73,35,217,82,0,61,53,53,45,97,89,1,0,0,240,138,30,150,146,175,41,130,201,225,23,17,227,31,123,33,179,94,72,208,152,223,137,147,201,252,2,161,126,199,145,186,32,58,208,77,76,223,5,193,134,5,102,10,209,250,25,192,122,1,228,100,145,223,37,25,23,74,37,86,180,77,75,150,88,139,196,47,75,82,36,213,17,221,172,96,27,75,153,165,131,213,24,153,120,67,40,66,181,230,110,175,253,32,205,132,119,118,144,144,166,51,36,177,185,233,191,90,214,51,87,96,220,109,34,32,55,82,36,177,210,78,108,34,125,94,226,247,31,233,132,21,210,67,194,108,105,129,191,129,189,84,181,126,240,231,167,153,235,82,34,217,127,119,212,47,153,24,18,48,160,139,8,188,59,66,2,91,204,95,234,161,92,119,119,123,183,187,191,69,16,50,4,75,73,69,65,121,101,129,174,216,86,165,42,9,17,51,36,39,94,218,183,158,63,226,121,177,188,59,66,179,44,81,2,71,55,61,49,113,99,65,185,185,125,99,242,212,15,83,0,73,59,65,51,117,103,1,0,50,117,51,138,2,105,83,0,75,61,67,53,119,105,1,0,143,67,147,13,17,131,82,36,209,1,133,110,82,94,120,228,227,97,229,187,240,94,67,196,86,213,221,217,206,251,57,217,254,141,24,234,11,255,82,2,171,194,155,244,90,152,176,10,161,245,122,166,204,148,205,43,162,73,127,61,55,197,233,102,13,193,49,18,159,154,83,2,117,216,226,43,128,135,104,16,84,179,16,248,95,87,65,74,1,172,46,99,95,203,49,7,169,80,42,34,72,18,67,196,210,148,221,153,200,38,211,160,255,168,43,124,238,155,67,2,245,111,247,252,146,104,89,14,54,16,235,232,20,178,223,5,91,46,5,89,19,109,6,116,251,222,108,107,187,173,83,2,105,160,227,42,231,172,249,239,94,101,222,197,128,42,49,234,6,177,94,137,31,52,13,27,200,249,68,37,211,78,223,37,35,251,161,45,155,97,244,17,155,45,118,192,251,39,82,34,37,79,182,133,175,192,228,183,25,129,231,150,186,183,67,2,21,213,81,43,23,110,205,94,179,134,130,217,133,202,67,2,235,66,87,122,138,53,116,115,23,192,238,138,250,214,82,36,173,195,22,124,226,94,186,39,107,205,84,7,116,159,34,8,130,169,1,27,254,226,25,92,241,175,94,237,218,24,82,40,66,181,24,199,105,75,114,104,19,229,246,163,225,110, +223,197,74,73,87,231,129,198,191,54,123,251,41,237,47,55,66,40,145,137,24,58,165,17,62,36,245,67,147,226,96,88,82,2,239,130,73,209,240,0,136,0,98,82,70,175,184,253,34,240,20,76,227,200,31,69,215,126,101,229,27,109,81,90,66,136,25,203,105,247,196,17,94,111,103,145,128,224,88,202,66,36,121,193,93,193,35,137,72,196,32,255,114,87,121,231,82,232,127,204,147,92,183,40,70,245,137,102,117,51,146,66,66,36,197,125,116,222,130,86,100,106,142,242,110,155,221,151,35,4,57,64,196,38,56,221,10,47,155,82,201,60,47,88,65,2,23,4,74,56,242,224,0,0,118,240,52,199,157,189,34,140,13,149,113,207,202,45,71,99,122,23,223,154,15,186,51,36,175,228,67,228,130,221,103,87,171,68,220,9,100,47,82,136,8,210,172,198,128,71,200,165,175,160,210,209,100,130,67,2,23,249,177,47,157,108,21,208,68,184,0,66,0,88,83,2,111,218,202,67,156,0,204,48,142,20,251,139,228,83,82,2,99,192,6,93,106,57,221,178,185,4,77,68,128,48,67,2,89,231,133,116,16,154,83,64,145,26,19,60,17,159,67,40,1,245,252,61,239,164,114,36,20,192,26,45,68,31,67,34,71,140,181,156,90,211,185,112,230,231,152,61,130,170,67,2,173,37,107,210,142,110,23,173,171,59,110,251,63,197,51,36,83,170,173,28,26,140,98,255,10,157,218,174,75,1,66,168,135,201,245,221,35,217,33,158,171,15,41,27,97,102,67,194,216,242,62,203,1,111,139,111,51,132,79,149,216,227,81,2,133,106,178,152,60,37,129,43,112,188,201,167,36,151,82,136,101,204,134,63,62,96,231,143,59,200,62,72,52,173,81,2,119,96,166,144,62,41,1,223,176,36,226,193,182,213,65,2,111,100,158,146,54,41,1,48,189,216,25,80,159,142,81,200,24,49,173,142,83,126,173,78,19,31,32,226,52,131,65,2,125,106,164,146,52,35,1,160,115,216,42,86,29,18,81,2,135,112,174,152,62,41,1,192,1,63,240,67,80,48,81,2,129,106,166,144,60,41,129,199,212,164,72,216,8,97,81,2,133,108,172,148,60,41,129,72,22,129,5,249,101,60,81,2,127,110,162,148,60,41,65,217,180,15,225,13,98,50,65,2,121,102,156,138,56,39,1,100,176,252,248,73,142,109,65,2,131,110,172,148,58,43,1,68,3,109,196,153,125,118,65,2,133,114,172,154,60,43,1,200,66,9,37,0,21,194,81,2,131,106,170,150,58,37,65,35,79,108,215,254,222,247,65,2,137,110,170,156,60,43,1,128,114,154,77,166,214,210,81,2,121,98,172,150,56,35,129,136,75,230,71,153,78,87,83,0,117,102,168,154,52,39,1,0,106,43,73,166,16,89,65,2,111,108,166,148,50,33,1,8,230,73,22,214,146,189,66,72,8,49,109,14,51,190,76,174,82,159,179,170,30,160,83,0,129,114,168,154,52,39,1,0,146,37,231,204,130,6,81,2,127,104,166,144,50,29,129,177,223,191,59,180,106,22,51,36,193,76,213,24,94,169,235,74,113,211,116,162,40,254,82,34,191,248,75,203,20,105,124,141,166,121,159,241,231,90,66,2,73,184,88,228,239,91,68,68,136,132,136,36,0,162,65,2,133,112,162,146,50,33,1,64,222,121,173,45,54,97,51,196,218,234,52,215,65,153,34,147,137,109,17,137,245,198,67,2,21,206,241,176,19,32,138,227,161,22,137,153,162,222,83,2,9,47,60,113,63,7,213,110,6,162,66,20,61,161,51,36,67,13,229,26,157,58,68,174,178,181,16,246,191,146,82,196,220,234,52,221,161,30,17,246,82,49,136,12,26,131,67,2,119,73,159,118,80,77,153,128,176,4,128,94,196,16,82,2,229,66,218,188,97,129,204,234,120,149,167,38,79,165,66,40,2,145,45,14,114,222,236,77,18,158,181,73,234,211,67,40,17,242,154,55,50,52,49,27,6,64,120,175,93,240,83,2,201,45,55,105,15,17,202,33,161,128,16,65,40,181,67,2,107,192,38,248,136,0,147,226,180,36,10,239,164,6,67,8,1,99,133,67,138,92,35,174,161,37,31,30,21,209, +66,2,215,246,87,123,163,88,237,192,63,41,119,187,115,123,205,43,75,172,242,50,59,203,229,170,7,11,97,165,161,192,66,2,83,253,83,189,163,88,8,32,33,76,93,130,189,21,205,199,174,86,173,156,61,219,204,95,187,252,222,28,160,173,66,168,55,81,150,85,119,126,53,117,22,158,175,4,171,148,67,34,171,122,178,53,92,198,76,17,122,230,253,134,167,247,66,2,83,222,83,241,227,53,138,238,34,4,44,140,106,163,83,194,210,210,75,13,254,61,154,199,201,175,130,120,222,136,82,40,35,108,109,253,84,152,74,29,47,160,81,190,243,54,82,196,88,85,103,233,241,30,83,151,51,146,101,95,60,132,83,0,75,61,67,53,111,97,1,0,53,184,18,164,181,134,83,0,79,65,71,57,115,101,1,0,95,168,172,22,22,155,83,194,78,78,195,13,195,134,126,90,237,190,198,0,181,206,67,194,98,95,121,237,65,123,5,246,219,144,135,105,151,135,67,194,100,97,125,223,129,125,127,152,204,183,64,78,221,175,82,34,161,105,39,197,39,129,201,90,240,54,121,21,215,222,67,34,33,251,177,55,92,69,23,120,239,225,12,217,46,213,82,2,111,190,219,19,111,152,79,26,192,82,72,72,63,96,67,200,24,44,10,229,150,169,211,109,30,25,246,211,167,107,82,40,11,108,125,237,92,216,110,77,73,104,230,14,118,248,66,2,227,103,231,179,167,54,21,160,213,194,235,206,147,17,67,194,82,79,107,201,129,85,157,195,115,140,71,209,209,179,82,34,33,71,231,168,165,164,162,20,224,248,30,253,251,198,67,194,84,81,105,221,65,136,199,213,31,203,173,221,51,190,83,0,67,53,59,45,103,89,1,0,127,240,109,93,239,174,65,2,67,49,59,41,103,85,1,4,233,218,155,129,177,7,83,136,2,44,157,38,163,101,185,57,51,181,36,196,140,84,67,104,11,204,90,245,154,171,212,172,30,204,148,95,101,73,82,2,227,138,88,209,200,88,108,224,206,157,49,51,102,198,67,2,113,38,111,252,11,3,227,179,146,66,103,41,11,30,82,2,199,219,113,27,220,208,79,109,122,17,2,43,9,201,207,5,219,99,223,45,237,20,75,67,86,3,159,105,214,27,51,196,82,77,103,233,65,255,159,129,255,159,103,68,179,85,82,72,26,236,50,179,186,177,110,63,41,120,210,103,149,22,67,0,71,61,63,53,107,97,1,0,64,183,239,191,225,14,82,34,101,105,56,169,39,201,101,190,255,26,192,88,3,88,82,34,105,109,233,197,47,229,246,155,157,31,109,206,84,197,65,2,71,53,63,45,107,89,1,104,157,47,127,236,194,205,66,2,87,103,91,181,163,53,102,238,21,34,61,4,253,138,34,200,129,73,2,161,112,235,41,80,10,61,94,245,191,2,35,200,3,181,217,47,55,163,55,125,109,73,8,48,74,1,205,199,172,215,109,157,216,82,235,79,203,116,188,60,44,137,66,2,247,132,110,16,39,24,251,247,16,255,0,54,196,64,66,2,49,67,193,35,242,77,204,8,132,8,174,18,187,179,83,136,142,137,144,28,89,67,133,13,49,160,133,160,7,40,67,136,2,67,165,218,101,215,243,111,34,130,115,131,230,119,83,8,2,108,177,164,213,117,79,172,209,245,33,95,144,238,223,201,16,35,221,78,142,37,213,212,213,89,125,202,49,78,83,2,75,53,85,93,254,220,135,252,187,8,181,3,236,139,66,104,166,137,200,100,114,11,255,48,241,83,246,216,98,103,83,2,107,177,37,43,173,150,22,91,169,84,165,118,5,136,67,2,235,32,47,126,135,243,70,0,181,95,15,173,178,69,67,2,95,113,14,241,84,199,164,224,228,15,160,60,132,10,83,2,153,103,222,125,198,89,235,103,2,235,109,117,174,17,82,34,93,105,54,137,39,89,101,151,171,1,227,15,221,182,67,34,157,187,169,181,91,83,156,79,26,222,123,227,186,101,82,36,173,207,70,108,48,211,252,141,243,40,108,105,216,124,51,196,82,79,105,227,129,192,242,37,148,213,52,74,47,39,67,34,43,155,170,183,27,238,104,82,254,192,26,96,131,58,82,196,70,67,91,239,177,72,120,144,151,157,103,179,125,191, +34,172,34,227,157,127,91,239,215,165,210,102,223,14,109,0,67,8,137,193,227,226,51,85,58,253,16,32,250,234,131,99,207,5,53,81,69,242,182,62,195,243,31,255,147,101,160,240,65,234,5,76,231,254,109,113,255,168,141,172,194,124,34,45,223,37,53,35,44,106,131,191,100,39,86,66,118,178,162,115,81,2,111,132,136,158,220,242,64,127,249,91,54,26,84,48,51,104,172,233,164,182,64,14,0,189,206,116,166,64,19,109,82,136,25,12,204,148,151,204,49,209,61,208,227,177,217,166,67,34,53,6,92,104,6,204,68,242,81,113,68,174,12,107,82,136,2,203,208,180,42,111,92,63,19,154,70,174,219,110,83,2,243,208,199,59,204,156,160,79,67,109,83,120,21,0,222,201,131,193,167,26,126,29,17,218,228,227,16,39,91,200,83,2,239,208,165,55,90,154,171,212,152,42,125,105,95,134,66,2,97,176,237,90,233,95,2,233,41,68,93,37,29,118,67,34,73,203,181,30,92,123,219,167,29,131,211,143,184,143,67,2,37,7,115,86,144,187,198,221,169,30,26,29,76,41,82,2,117,110,29,50,247,40,92,52,253,143,144,65,144,90,50,4,153,110,174,146,68,39,1,10,97,171,212,76,242,119,51,196,212,238,54,231,1,221,106,63,255,182,212,144,211,126,81,2,131,102,166,154,56,39,129,224,38,51,10,24,105,186,35,4,57,48,81,230,239,58,149,132,91,186,10,114,109,108,66,36,245,60,87,78,246,72,168,149,141,160,109,42,104,175,81,2,127,104,174,152,70,49,129,68,37,229,19,25,26,54,82,34,253,154,90,3,149,68,250,199,181,167,149,219,183,123,65,2,117,98,164,146,60,43,1,16,198,131,252,222,135,111,83,0,117,102,164,150,60,47,1,0,99,36,69,141,12,122,81,2,123,108,172,154,70,49,1,64,8,179,66,88,0,33,51,136,2,145,86,63,86,104,211,159,15,136,154,127,4,123,65,2,133,114,172,154,60,43,1,120,68,109,101,188,1,48,65,2,131,112,170,152,58,41,1,4,147,198,101,50,89,66,82,0,127,118,166,158,54,47,1,0,0,0,163,106,183,187,81,2,133,110,170,148,60,41,65,137,57,218,223,83,88,16,81,2,125,110,164,146,52,43,1,30,61,93,217,91,108,18,66,2,197,180,217,164,239,59,154,174,208,101,210,30,29,230,50,4,101,100,146,152,58,41,129,206,161,115,109,156,181,42,66,36,249,57,87,77,72,137,170,96,149,105,170,175,136,141,82,196,212,236,52,239,17,240,123,239,94,253,232,171,93,219,51,196,214,242,54,213,129,150,36,217,22,41,109,66,251,55,65,2,119,100,170,152,54,37,1,4,71,158,232,36,152,4,83,0,115,100,166,152,50,37,1,0,32,73,210,162,2,250,81,2,125,94,172,148,56,31,65,8,55,79,210,158,208,109,83,0,121,106,172,156,52,41,1,0,177,64,75,54,103,242,83,0,119,104,170,156,50,37,1,0,160,130,220,106,253,80,207,5,57,181,213,38,179,59,168,11,188,7,73,123,238,92,50,168,134,233,229,154,107,194,223,125,210,26,5,36,29,237,66,36,49,193,89,80,198,25,175,171,154,123,26,161,50,3,206,17,71,236,27,95,108,235,76,29,142,239,21,33,168,85,222,5,119,116,142,152,58,33,65,252,130,29,90,86,36,148,35,136,94,131,142,27,74,238,101,186,77,137,245,173,23,218,82,72,26,114,159,125,132,141,65,134,179,17,114,208,94,94,82,104,21,213,119,90,133,5,28,244,8,248,221,30,241,41,82,2,81,67,165,32,149,64,151,161,7,66,19,8,212,59,83,8,137,193,201,201,141,147,209,89,208,138,26,9,144,16,83,2,117,200,131,47,16,80,129,176,80,136,41,69,101,250,67,2,19,92,201,165,29,78,66,243,67,104,16,40,5,66,82,168,0,213,66,248,174,5,134,182,28,64,222,241,154,61,82,2,209,39,229,32,13,165,196,180,26,5,233,0,108,24,83,194,154,150,7,108,138,3,37,185,94,92,204,199,227,185,67,2,193,4,108,82,73,130,229,32,88,134,175,151,166,190,83,2,49,184,98,39,74,91,135,17,214,8,130,2,1,254, +66,2,119,65,251,158,43,90,224,253,62,83,123,119,127,119,67,2,201,107,180,88,16,198,221,217,65,110,73,18,100,148,83,2,167,153,198,50,173,205,93,235,252,125,206,250,38,64,83,2,101,145,197,50,63,67,60,124,118,193,181,177,102,221,83,194,74,79,194,151,66,41,37,180,250,145,67,85,170,96,205,139,91,172,182,62,57,187,220,38,86,202,233,87,15,14,66,2,235,127,106,255,231,88,62,107,30,245,98,224,133,36,67,34,17,23,113,27,151,94,20,81,55,231,140,241,114,140,81,2,75,61,71,57,119,95,129,95,231,39,6,141,36,0,82,2,171,222,219,23,103,177,152,208,82,70,255,17,212,141,50,136,103,49,246,181,119,190,117,213,22,31,24,68,78,139,66,2,83,227,87,179,225,20,40,194,44,36,96,201,44,46,66,2,87,226,219,179,161,52,34,196,42,64,218,78,214,233,66,36,33,194,142,48,124,152,80,127,80,127,15,90,95,80,81,2,81,59,73,51,117,95,1,128,18,61,105,82,150,54,66,2,87,223,219,241,227,51,245,66,25,32,21,6,83,3,66,36,41,194,178,112,207,144,89,165,87,237,223,78,242,136,82,34,101,5,184,204,21,193,46,210,56,139,227,39,76,134,66,36,161,3,144,96,110,129,238,10,228,173,102,93,255,255,82,2,239,154,27,255,118,196,68,41,45,51,196,229,26,80,82,2,175,218,92,51,109,177,24,149,55,96,41,75,84,157,67,40,75,76,155,237,214,187,91,242,86,64,89,13,110,196,66,2,211,117,215,120,227,92,57,183,166,179,147,234,51,13,82,196,82,79,101,231,49,86,236,2,182,94,208,58,21,43,65,2,65,47,57,39,101,83,1,192,214,10,61,182,39,189,83,194,70,75,62,85,74,74,96,92,80,92,106,77,133,116,66,2,91,235,95,183,229,22,238,211,204,209,2,168,138,196,81,2,67,45,59,37,103,81,1,41,2,36,11,173,40,61,67,136,94,140,72,84,118,169,211,108,158,219,29,169,99,90,205,203,3,108,190,22,31,157,86,98,203,248,144,149,207,18,66,36,241,78,240,19,252,8,134,117,175,165,221,6,221,134,67,2,181,63,251,185,159,59,119,206,153,107,187,106,178,7,82,232,6,11,141,112,196,167,227,148,1,166,231,247,170,6,82,36,209,24,127,124,192,104,121,102,123,253,61,113,191,181,66,2,91,99,98,51,163,83,51,51,121,6,109,169,205,237,66,36,37,194,144,48,125,152,59,9,179,162,179,82,179,9,81,4,65,61,57,53,109,105,1,88,191,160,57,92,129,195,66,2,95,102,226,245,163,83,100,209,32,182,98,81,85,21,66,2,91,235,95,183,227,21,36,0,66,172,110,106,94,25,66,2,95,231,99,181,229,20,16,223,64,177,46,254,30,221,65,2,65,45,57,37,105,89,1,128,68,216,100,52,116,155,66,2,95,234,227,183,163,53,238,130,98,42,192,22,36,42,66,2,99,243,103,187,231,23,7,57,231,82,147,84,59,213,66,36,221,135,204,17,77,145,166,42,84,95,160,255,39,149,67,2,83,7,109,220,12,198,141,115,242,78,152,25,4,223,83,200,24,44,185,36,179,101,201,142,55,180,74,200,162,183,67,72,14,172,58,237,178,175,86,174,27,160,201,125,136,71,82,136,24,44,125,53,124,181,90,45,79,216,95,158,101,177,67,72,8,236,106,221,194,173,213,174,27,80,18,112,202,247,223,37,169,89,154,181,154,255,106,180,111,68,190,47,32,62,83,194,86,86,75,143,201,167,237,93,158,198,23,31,122,68,82,34,97,105,55,169,39,97,244,224,119,243,216,226,0,88,65,2,53,35,45,27,97,79,1,248,151,236,160,10,100,121,65,2,51,41,43,33,95,85,1,232,255,194,40,79,110,155,66,2,95,110,102,249,163,85,37,172,134,128,34,72,162,34,83,0,59,45,51,37,103,89,1,0,160,72,229,114,21,135,66,36,229,207,144,36,77,153,253,9,254,32,166,170,170,153,66,8,154,137,12,252,50,167,52,199,175,21,172,139,193,112,82,168,7,21,213,223,216,173,21,39,31,232,90,114,193,40,65,108,55,208,86,86,254,230,230,157,44,149,177,172,175,191, +81,232,133,193,55,59,154,62,210,113,14,24,16,245,45,84,67,200,3,195,87,149,159,159,103,175,32,137,216,237,190,243,82,2,89,15,104,141,13,129,83,40,144,89,8,8,9,17,207,5,21,141,49,210,60,92,75,245,84,59,94,241,14,240,207,5,141,8,37,144,60,26,43,112,64,122,154,253,233,211,82,2,85,86,71,107,111,129,249,23,193,200,196,216,28,82,83,168,18,12,163,184,203,171,158,109,7,92,70,77,157,127,66,2,157,133,56,140,123,90,30,85,181,167,117,1,147,68,82,2,21,13,40,141,21,56,229,178,107,6,213,76,146,25,67,168,5,235,53,29,151,107,25,177,36,221,31,61,59,16,83,40,194,9,33,175,58,107,139,90,22,107,229,212,163,158,51,136,153,73,58,251,144,182,77,195,94,145,7,141,32,224,67,196,56,15,213,9,160,20,150,18,152,21,194,158,212,243,206,237,4,76,235,74,126,235,76,158,255,210,42,4,137,112,66,232,5,17,206,78,179,127,173,46,19,159,151,165,198,145,66,2,85,176,101,160,233,93,166,174,22,169,154,155,113,5,82,196,210,236,50,239,145,169,63,175,142,134,255,100,189,59,66,36,125,57,85,126,118,80,106,238,160,2,85,95,175,245,83,0,123,108,174,160,58,45,1,0,53,225,8,141,20,59,83,0,121,106,172,158,56,43,1,0,118,227,116,204,140,152,65,2,125,106,176,158,60,43,1,132,103,191,40,183,65,54,81,2,131,108,182,160,66,45,1,37,62,36,5,185,64,15,81,2,127,104,178,156,62,41,129,111,190,175,223,156,8,35,81,2,127,104,176,156,62,41,129,121,96,164,24,201,47,206,82,34,251,218,89,11,21,144,170,49,78,140,120,117,173,50,66,2,193,57,212,230,241,90,0,164,66,160,70,118,34,181,81,2,137,118,184,158,68,47,1,168,32,7,240,0,26,0,67,0,123,114,164,156,52,43,1,0,128,27,51,76,125,156,81,2,129,106,180,158,64,43,65,196,28,98,135,123,160,22,66,2,69,53,97,40,237,58,2,204,0,68,8,4,136,68,83,0,119,104,170,156,54,41,1,0,160,76,121,246,34,215,65,2,119,100,170,152,54,37,1,192,215,121,248,174,62,63,65,2,121,102,172,154,56,39,1,208,52,147,72,165,113,231,66,2,193,176,89,230,175,59,94,44,91,162,198,76,174,4,81,2,133,106,184,158,66,41,65,128,124,1,208,132,76,165,65,2,125,106,176,158,56,39,1,196,207,234,68,219,3,246,51,2,127,96,178,148,62,29,209,133,241,152,64,110,148,98,82,34,125,218,74,235,148,128,242,56,61,151,44,255,227,238,207,137,3,49,205,78,19,62,109,238,210,159,196,155,204,70,207,137,3,145,77,207,83,60,109,14,147,158,174,231,187,122,65,2,129,118,166,148,52,41,1,80,23,222,197,39,100,55,66,2,193,185,204,38,243,59,132,24,4,177,18,223,114,215,65,2,129,110,168,150,52,35,1,4,35,111,69,148,128,38,81,2,131,108,170,148,54,33,1,201,82,179,88,144,36,179,82,2,213,122,150,135,231,164,85,9,94,115,104,38,199,180,82,232,125,140,70,111,118,76,211,155,63,160,89,52,154,217,67,2,11,207,0,159,20,215,200,170,244,6,146,27,150,169,83,2,9,47,93,117,47,50,56,125,129,107,11,20,61,192,67,2,119,138,167,120,80,238,204,120,247,46,186,21,80,99,83,2,185,225,166,59,84,104,73,120,13,32,63,230,238,94,67,2,15,44,193,36,144,48,231,230,89,188,199,251,29,220,67,2,63,2,52,90,12,16,231,198,219,190,121,173,255,239,49,74,14,35,96,129,139,78,10,46,136,161,70,243,235,141,83,2,57,224,225,35,108,221,144,222,130,247,10,252,2,32,83,2,45,184,97,43,148,18,74,41,129,156,99,171,8,125,67,2,235,227,94,248,137,130,135,11,76,164,64,191,173,38,67,2,177,231,171,192,73,15,247,126,61,124,243,240,107,113,66,48,93,140,116,190,246,223,175,212,178,13,138,47,186,216,67,194,236,10,223,146,129,125,26,196,180,250,41,232,191,91,83,168,7,140,237,50,119,199,247,221,253,217,213,109,101,240, +83,194,78,211,66,79,42,121,76,103,136,202,145,237,57,54,67,194,90,87,117,189,129,114,220,43,248,85,38,38,102,89,67,194,78,77,105,193,129,236,30,214,34,62,59,83,43,213,223,9,3,241,245,245,156,244,106,61,63,184,121,233,147,160,67,8,2,44,10,189,222,161,79,44,94,47,179,76,85,104,33,198,164,81,108,158,117,114,107,202,222,63,114,133,0,26,65,2,47,27,47,23,95,79,1,96,219,109,121,255,144,32,66,2,115,246,115,253,235,55,235,20,31,65,221,189,253,1,82,34,145,7,228,96,29,240,94,188,253,25,243,251,138,113,81,2,49,25,49,21,97,77,65,128,59,177,202,8,36,38,51,196,60,59,87,237,1,91,43,37,132,213,52,86,179,174,66,2,227,118,231,189,229,87,162,170,66,162,239,192,127,197,82,34,37,13,168,173,45,89,39,176,72,59,169,162,205,189,67,194,72,71,95,217,65,33,101,142,68,137,85,12,10,98,82,34,97,43,55,141,167,40,16,149,86,198,161,218,220,164,83,0,69,55,61,47,105,91,1,0,240,234,196,205,218,124,66,2,87,231,91,181,227,21,128,162,68,34,193,162,33,170,66,2,87,231,91,181,227,21,72,204,76,32,108,74,32,42,205,199,168,211,108,94,165,50,19,119,239,153,32,3,0,68,67,34,43,153,130,185,154,61,119,216,254,111,168,149,118,19,82,34,105,99,105,172,23,193,127,153,204,77,255,3,129,80,83,194,70,203,190,147,88,105,69,160,148,221,9,49,111,98,67,194,110,107,129,165,129,14,55,162,230,133,158,179,170,189,66,2,87,107,90,55,165,21,106,59,64,121,102,61,243,191,66,2,219,239,95,57,229,86,187,119,114,63,36,253,9,100,82,34,229,75,120,197,175,196,126,120,113,254,211,55,94,151,81,2,85,63,77,55,121,99,65,253,243,222,80,241,8,212,66,2,87,231,91,181,227,21,33,234,27,10,83,129,162,105,82,196,98,95,115,231,81,149,75,40,154,188,244,10,138,20,67,194,100,97,119,227,129,151,238,148,87,183,217,164,249,255,67,136,19,44,139,253,230,175,215,113,150,82,25,209,8,91,207,41,145,73,124,44,185,179,86,77,221,6,104,16,117,97,207,145,32,227,226,235,113,33,126,207,231,163,165,135,92,146,82,40,74,112,154,89,110,123,134,12,200,132,79,185,121,6,83,2,109,122,195,50,1,137,230,140,7,234,110,209,135,55,81,136,231,97,241,191,145,60,109,90,207,25,144,135,124,111,35,8,130,137,206,58,179,153,207,234,114,73,10,231,197,179,83,8,2,108,179,230,147,50,43,93,53,188,236,125,209,158,81,2,73,49,65,41,109,91,1,36,27,241,196,136,38,51,81,2,63,41,55,33,107,85,129,223,244,235,143,57,33,225,67,194,92,89,117,187,1,139,163,205,200,253,214,188,126,115,82,34,97,41,55,173,39,136,199,248,107,237,175,183,106,143,67,34,149,24,137,43,89,115,200,4,240,124,149,57,54,156,67,194,90,87,113,219,129,155,182,78,118,177,217,238,151,227,67,34,29,154,161,181,154,204,157,191,233,94,209,88,223,177,66,2,227,127,231,190,167,25,101,4,153,229,214,61,115,179,82,136,94,108,191,47,30,216,106,45,91,32,139,171,216,10,82,2,175,246,156,30,247,152,50,13,193,110,94,113,16,188,67,2,83,12,181,92,82,221,125,213,58,208,221,99,51,237,34,72,128,105,225,21,158,242,17,191,8,181,91,182,15,211,51,36,19,254,232,49,158,162,32,65,223,230,99,94,222,251,66,2,223,111,227,249,227,53,34,42,44,42,42,4,170,132,82,34,89,67,181,128,15,113,100,111,183,254,131,125,220,247,82,36,241,218,206,108,114,147,150,174,154,248,173,224,30,0,67,2,75,162,76,220,78,128,134,160,160,164,8,115,163,148,207,5,231,231,227,245,159,20,57,82,228,24,106,65,121,1,83,2,173,176,5,59,24,129,128,161,90,136,204,133,250,94,82,36,105,79,177,96,42,170,168,34,227,186,125,229,219,99,66,2,17,5,48,142,60,88,153,181,156,61,104,211,223,119,82,34,145,118,75,47,52,1,179,47,173,211,123,242,82,158, +67,2,147,208,49,47,151,3,144,106,248,131,213,202,184,34,67,2,21,214,137,175,27,161,64,8,20,136,22,53,221,145,51,8,2,85,178,60,119,161,30,43,251,128,126,253,255,31,83,2,73,54,123,121,156,33,198,48,145,20,122,6,245,141,33,170,1,181,235,86,32,69,131,184,26,144,58,76,198,137,66,2,183,136,51,80,73,23,170,83,218,11,249,140,239,72,82,40,1,76,207,111,30,129,243,143,57,234,253,53,65,52,83,2,51,216,194,43,86,155,109,117,155,38,95,230,175,2,175,137,153,201,140,90,10,218,109,65,7,10,83,130,155,91,65,2,129,108,166,154,56,39,1,248,7,248,232,23,230,202,65,2,119,100,168,152,50,37,1,4,158,104,244,24,247,229,223,37,181,0,221,26,158,57,242,168,218,172,34,134,135,200,65,2,121,102,172,154,52,35,1,100,212,193,114,230,11,91,207,5,185,52,208,230,179,187,40,16,238,74,73,75,95,189,67,2,163,192,34,212,138,136,154,161,225,110,188,27,179,214,83,0,129,114,168,154,56,43,1,0,141,57,17,182,104,139,35,4,61,185,84,102,179,90,42,9,128,230,247,174,233,61,33,202,24,99,146,171,16,116,223,245,133,242,254,117,32,59,82,136,14,140,78,127,54,108,231,155,111,56,144,207,242,166,83,0,125,110,176,162,60,47,1,0,116,69,73,18,37,17,83,0,121,106,172,158,56,43,1,0,247,92,87,171,240,66,82,196,216,242,60,237,49,74,142,34,151,218,167,236,152,82,51,196,212,238,56,235,65,251,238,186,164,35,203,86,36,46,81,2,127,104,178,156,62,41,1,169,104,87,13,237,65,111,81,2,137,114,176,154,64,43,1,123,150,145,155,140,2,35,65,2,129,110,170,160,60,45,1,16,226,130,117,198,228,87,66,36,181,189,21,94,119,9,121,160,7,144,41,146,34,177,222,5,129,118,170,160,58,47,1,8,162,209,212,132,97,120,83,0,123,108,174,160,58,45,1,0,112,140,155,186,217,136,81,2,115,104,164,152,54,45,129,244,69,126,132,21,11,141,82,34,189,156,154,3,149,16,210,45,14,35,170,145,34,81,83,0,119,104,170,156,54,41,1,0,35,213,96,50,37,8,65,2,121,102,172,154,56,39,1,248,222,202,48,97,194,28,66,36,61,60,55,111,118,24,119,153,39,151,95,8,109,134,66,2,61,180,84,164,179,59,38,216,66,114,36,93,164,95,83,0,119,104,170,156,54,41,1,0,112,156,129,27,101,39,81,2,121,98,172,150,56,35,65,168,76,151,217,0,110,244,67,34,193,108,205,158,156,97,18,214,218,193,82,234,6,58,81,2,123,106,172,146,54,31,1,201,70,128,11,144,15,134,66,136,8,145,237,110,115,221,108,174,82,159,218,54,60,93,67,34,195,108,189,28,28,148,35,190,85,176,223,235,157,235,82,34,191,218,11,203,158,224,198,219,47,173,227,31,196,255,66,194,226,246,64,203,1,0,140,2,34,202,174,42,98,99,65,2,131,112,170,152,54,37,1,24,142,77,127,230,73,46,83,2,137,45,87,105,223,33,126,32,214,20,138,64,153,247,67,2,19,110,249,166,83,78,220,95,51,6,163,153,82,161,66,2,35,141,31,134,71,54,32,170,152,130,185,67,127,159,83,2,59,234,232,63,123,118,56,14,211,216,130,66,169,80,67,2,231,160,22,120,76,128,160,34,72,9,195,70,89,41,83,104,144,9,64,128,105,97,163,11,167,47,46,104,145,74,83,2,185,225,165,47,214,236,167,243,123,225,60,63,207,4,66,2,29,147,36,71,164,35,127,140,31,64,131,68,130,68,83,2,55,217,163,43,165,152,170,180,123,136,148,15,84,121,83,136,51,172,213,55,181,250,56,236,33,106,89,88,241,19,81,176,61,204,44,79,82,85,81,91,101,77,86,30,121,30,50,16,27,236,235,91,167,116,175,114,220,205,64,19,106,235,82,2,243,236,73,250,211,248,71,92,83,198,90,132,62,56,83,8,1,236,255,186,199,255,241,86,55,225,6,126,12,236,67,194,52,65,35,85,1,34,112,200,16,137,194,173,8,68,35,4,255,101,239,254,118,51,187,47,53,80,64,224,170,62, +81,2,71,49,63,41,115,93,65,221,219,239,166,187,202,5,83,194,82,210,71,141,115,142,55,166,245,49,131,224,93,88,67,194,94,91,115,225,65,248,63,223,29,88,107,197,238,110,83,194,206,211,67,151,123,159,233,199,25,198,166,92,20,144,83,194,202,207,63,143,8,179,0,4,6,34,88,153,142,241,66,2,219,239,95,183,165,22,154,29,209,219,28,243,96,117,82,2,51,188,140,59,237,144,115,76,215,190,250,29,100,207,81,2,51,29,51,29,99,77,65,158,185,185,227,46,202,237,82,196,74,73,99,243,81,216,105,37,101,165,7,217,165,120,83,8,3,172,209,44,213,182,95,85,212,12,212,6,241,250,67,194,80,81,107,195,129,221,102,141,35,248,95,249,246,254,66,2,103,119,235,61,231,23,181,223,236,247,128,62,202,104,35,136,101,145,115,115,21,159,147,51,245,158,230,244,35,220,81,2,53,27,47,21,97,77,129,251,212,248,150,123,71,197,83,0,45,29,37,23,89,77,1,0,118,46,34,164,12,90,207,5,115,119,247,187,235,87,235,35,119,186,119,96,114,36,82,34,97,43,119,141,175,136,49,245,50,14,183,16,230,71,81,2,41,25,43,23,91,69,65,44,223,181,26,145,90,2,83,194,90,219,79,165,192,175,238,250,156,123,205,253,223,126,82,104,11,108,181,37,61,124,78,31,75,98,97,178,82,146,65,2,69,61,55,51,109,81,1,224,114,159,97,201,95,210,82,2,51,156,156,51,119,217,173,145,104,111,101,42,221,165,67,194,92,89,115,219,129,18,197,219,206,69,216,68,208,247,67,194,100,95,121,135,1,215,203,246,159,235,11,68,74,226,66,2,87,102,90,245,161,84,229,0,123,201,85,223,22,49,66,2,223,103,227,117,229,52,221,157,153,169,238,142,39,72,66,2,87,226,219,179,161,52,65,196,27,12,51,201,57,147,65,2,83,65,75,57,119,101,1,232,175,110,182,204,237,89,66,200,3,177,181,181,150,223,149,245,150,159,255,213,89,21,207,5,87,218,90,111,163,50,57,25,174,127,207,189,232,78,66,36,165,199,176,49,206,80,95,245,80,245,90,245,93,119,207,5,91,214,215,239,229,148,160,121,65,239,213,232,173,134,82,36,209,95,71,108,172,108,227,154,50,145,145,78,165,76,66,2,83,230,95,53,225,20,8,106,76,130,132,44,170,158,82,34,33,35,103,196,23,41,165,53,175,100,84,17,40,123,82,196,92,89,111,225,73,40,148,75,128,164,159,82,163,251,66,2,215,239,219,119,163,86,151,25,217,223,86,221,64,126,66,2,219,107,223,247,227,21,105,204,42,4,65,136,163,68,67,194,88,85,111,219,1,175,226,187,183,238,173,151,225,148,83,194,70,198,59,149,58,132,234,173,114,129,67,228,180,0,83,194,206,211,67,151,154,3,207,125,31,46,182,39,252,232,66,2,227,113,231,118,167,30,53,247,217,123,155,117,39,208,67,34,33,217,145,53,26,116,19,16,235,233,189,181,173,190,66,2,227,115,231,123,167,86,148,169,58,174,204,162,132,10,82,34,25,13,165,129,53,72,220,136,72,147,189,247,34,48,67,34,33,218,161,53,92,18,210,33,184,12,102,55,236,99,51,196,62,59,85,233,129,223,183,46,159,143,45,203,38,19,66,2,239,118,115,253,233,86,225,136,197,200,161,252,136,223,82,104,44,236,253,61,93,240,122,77,45,234,120,45,46,176,51,36,29,123,177,179,156,127,74,201,43,16,86,10,149,72,81,176,102,76,85,91,30,211,192,127,77,217,94,231,207,22,51,36,27,118,57,169,17,126,150,88,185,10,50,10,8,35,83,40,145,169,158,178,20,3,103,15,208,201,71,139,116,193,223,41,129,65,151,141,252,11,68,129,129,165,34,65,100,51,67,34,15,237,154,128,26,242,187,164,170,117,154,115,243,148,51,232,133,129,129,54,232,34,99,189,207,212,253,95,176,241,35,4,141,17,169,150,62,219,128,64,224,42,239,247,86,253,51,36,53,4,60,106,132,228,74,80,8,100,147,172,238,254,51,72,214,73,140,4,56,35,225,144,216,16,232,185,53,33,66,168,75,21,175,248,35,130,81,49,163,79,35,96,234,214, +82,34,225,80,158,46,190,184,94,248,108,191,37,7,231,16,65,106,11,236,42,231,171,212,191,233,145,76,20,82,155,141,82,168,135,233,195,6,52,154,77,143,21,120,247,115,66,165,83,2,51,208,195,47,170,55,152,55,34,87,32,234,0,101,51,136,153,233,17,26,18,206,106,47,31,145,205,11,17,114,82,36,95,110,51,104,16,160,86,154,179,133,215,250,94,108,82,196,214,232,58,241,145,169,140,70,103,128,84,3,17,132,66,36,185,57,53,109,72,9,41,114,9,250,162,93,82,254,66,2,189,57,209,102,243,90,243,198,255,156,96,108,102,204,83,0,123,110,158,146,58,45,1,0,128,75,100,130,7,89,82,8,2,140,94,103,94,68,195,155,31,100,121,76,105,85,35,4,189,177,80,230,179,59,234,210,216,246,211,107,160,242,81,2,117,100,168,154,56,35,1,233,62,231,219,223,124,65,83,0,121,104,172,156,54,41,1,0,196,42,38,54,149,208,207,5,61,180,208,166,177,91,91,127,239,90,123,65,84,32,67,2,147,176,41,173,150,223,186,225,175,157,225,86,66,170,82,2,141,5,164,8,15,113,164,162,136,3,33,50,68,213,19,208,73,235,232,169,126,40,90,199,191,82,98,255,199,195,205,11,233,193,72,103,253,158,76,163,83,175,151,35,206,72,205,75,86,227,182,170,57,89,247,239,135,167,224,55,172,178,82,196,210,238,56,233,73,181,187,198,196,177,92,169,127,248,51,72,86,145,183,127,213,136,243,123,77,184,255,9,12,9,81,200,9,213,198,115,250,123,187,171,174,179,151,175,163,86,83,0,119,104,166,152,62,49,1,0,86,109,17,29,20,51,83,0,121,108,168,162,60,45,1,0,162,42,42,146,3,48,50,4,117,102,172,160,60,49,65,200,178,129,253,244,22,85,81,2,127,100,168,158,56,49,1,70,226,1,201,76,108,112,82,196,212,238,54,237,49,20,61,65,246,247,164,119,189,146,65,2,121,102,168,150,64,47,1,100,85,92,170,52,192,38,81,2,143,112,182,152,70,43,65,73,104,241,14,121,228,37,81,2,135,112,174,152,62,41,1,12,118,21,248,217,10,116,82,196,212,234,54,241,33,172,82,98,65,219,9,236,6,112,81,2,131,108,170,148,58,37,1,133,55,70,130,186,139,173,65,2,125,106,164,146,52,35,1,132,55,91,65,166,220,194,81,2,133,110,166,144,54,33,65,192,91,221,218,242,250,101,66,2,197,180,217,164,239,59,194,196,76,68,72,136,72,64,66,2,193,176,213,162,241,60,40,172,128,118,106,93,156,29,51,36,71,12,221,152,29,191,36,75,38,149,58,142,44,131,67,2,167,0,27,212,10,152,172,206,50,238,123,123,162,189,67,34,201,200,141,162,88,244,65,185,95,225,199,239,223,243,65,2,131,114,170,152,50,33,1,164,124,205,123,3,218,196,83,232,228,225,226,36,11,7,105,17,251,145,196,34,73,145,67,34,197,111,205,22,88,238,23,57,239,91,107,249,43,133,81,2,139,116,174,152,50,29,129,228,42,161,202,135,104,17,67,34,199,137,149,26,153,86,247,243,127,133,222,126,127,255,67,2,181,160,35,214,12,0,214,32,228,5,31,159,172,247,67,2,17,92,201,167,157,68,19,208,3,226,16,136,4,10,66,2,29,108,161,184,230,25,32,98,162,122,166,113,106,255,83,2,137,39,62,121,243,190,216,223,68,251,10,120,3,32,67,2,115,15,231,120,145,34,112,41,80,36,65,179,216,140,67,136,2,12,107,213,150,167,82,40,22,26,105,81,233,133,81,10,130,50,149,39,153,116,70,236,119,39,240,1,40,186,81,138,131,228,215,228,233,61,99,225,13,178,150,167,191,192,83,194,194,199,75,111,5,247,224,104,0,152,83,125,181,153,83,194,10,143,26,59,94,0,162,20,229,217,51,62,10,101,65,138,3,236,76,246,121,142,51,33,49,55,4,204,129,76,83,40,9,44,157,165,183,190,127,37,235,219,17,23,51,82,67,2,241,20,79,103,145,152,142,128,124,148,195,94,253,111,83,194,198,203,82,95,1,80,89,96,181,37,36,119,95,179,67,2,95,205,213,212,10,100,50,223,15,2,214,79,149,113, +81,2,87,63,79,55,123,99,129,255,254,124,94,171,1,141,66,2,83,227,87,179,225,20,237,0,211,2,221,17,157,181,83,0,83,69,75,61,119,105,1,0,222,210,52,67,146,120,67,194,112,109,133,197,65,58,175,36,249,167,230,124,248,113,81,2,71,57,59,51,107,93,1,123,181,95,173,46,106,7,82,34,105,103,249,200,31,68,238,73,123,243,208,37,155,74,81,2,69,47,61,39,113,91,129,59,176,138,17,159,98,100,67,34,37,185,185,183,154,249,157,171,172,156,212,91,92,191,66,2,91,116,95,124,227,59,145,17,97,238,231,104,193,64,82,34,101,105,56,201,39,145,249,62,147,149,16,29,10,56,66,2,231,119,235,125,169,87,211,179,157,85,90,217,128,222,82,34,89,73,118,129,39,101,138,176,62,144,115,212,108,203,66,2,223,110,98,249,163,85,38,145,105,174,42,238,0,36,83,194,206,83,195,23,128,183,108,149,115,181,58,94,74,247,66,2,95,234,227,183,163,53,185,5,145,161,166,65,85,194,81,2,57,37,51,29,103,81,129,182,236,21,252,207,98,70,66,2,227,243,226,249,229,54,222,225,160,190,74,86,192,193,65,2,63,45,55,37,107,89,1,100,255,251,94,246,2,118,67,194,78,75,101,221,1,236,138,93,227,141,22,55,213,73,65,2,43,23,41,23,89,71,1,164,115,218,117,135,74,118,66,2,107,246,235,123,231,87,19,34,233,102,192,26,34,14,82,196,68,63,93,235,49,164,62,65,54,184,40,183,42,80,66,8,2,17,20,180,181,222,115,147,53,159,234,168,242,64,66,2,223,115,227,185,229,54,128,140,45,38,59,33,181,253,66,36,221,194,236,48,77,24,102,133,85,245,170,250,85,165,67,72,1,204,233,164,242,167,211,172,94,9,207,224,154,135,83,0,67,51,59,45,103,89,1,0,142,97,159,205,181,118,82,0,67,59,59,51,103,95,1,0,0,248,220,127,203,201,66,2,83,227,87,179,225,20,8,196,136,64,105,72,211,206,66,2,95,231,99,181,167,84,44,31,8,17,37,82,110,182,83,194,214,219,75,155,77,130,216,29,203,103,141,245,223,189,67,194,98,95,117,235,129,40,229,100,81,19,194,145,75,163,222,233,99,49,21,181,246,222,149,245,118,30,120,31,189,63,66,36,225,199,236,64,205,152,223,2,220,47,8,151,183,89,35,168,146,73,123,58,240,235,198,71,169,6,160,252,201,97,66,104,55,49,181,244,245,94,21,181,214,158,99,226,75,175,66,2,91,231,223,245,225,53,2,100,234,105,246,149,30,30,83,2,107,168,3,51,4,114,208,156,146,115,174,51,198,156,66,72,154,225,100,159,175,87,28,34,49,81,26,233,23,95,67,194,80,77,107,135,129,76,221,118,131,115,47,238,58,223,82,34,93,105,54,137,39,37,2,199,84,98,123,68,244,234,66,2,99,238,231,185,165,54,80,77,118,27,229,221,14,20,67,8,3,204,9,157,234,161,79,43,94,203,216,201,30,145,67,34,33,187,193,185,25,48,125,193,115,147,70,247,15,121,66,2,239,115,114,185,169,23,235,38,111,138,239,2,37,100,66,36,145,131,230,79,75,73,96,127,216,152,246,182,221,182,50,4,67,33,61,19,109,73,129,223,183,201,119,96,23,144,51,196,70,65,99,227,129,59,69,164,160,249,252,148,211,38,35,168,13,113,53,181,118,94,53,245,214,156,54,253,172,11,51,40,145,129,26,122,174,75,41,169,21,177,98,245,167,111,51,136,91,145,76,245,159,44,82,249,111,72,121,242,78,13,83,2,167,160,228,58,24,1,142,32,153,4,148,11,220,219,51,36,57,132,52,240,132,32,2,187,14,172,237,105,215,121,51,36,177,68,52,232,3,118,20,53,150,185,124,68,179,254,82,2,145,52,214,110,127,72,191,148,244,8,138,17,43,67,81,2,95,138,112,160,200,246,128,238,68,246,6,247,121,190,67,2,147,170,185,172,144,95,38,186,13,255,81,149,137,159,83,40,9,12,167,248,39,92,115,109,4,141,245,221,190,157,67,2,147,123,193,37,158,59,203,204,103,242,233,2,47,80,82,16,58,236,222,252,147,114,20,169,23,133,147,153,87,43, +83,2,115,208,196,47,86,235,102,84,60,218,95,101,118,0,66,136,153,233,115,213,33,185,164,205,80,65,242,88,190,199,81,2,137,112,176,152,64,45,129,205,28,241,133,237,234,60,35,72,0,241,173,47,84,190,78,112,180,156,77,124,20,6,51,36,69,141,205,160,156,145,25,199,97,13,216,161,149,252,65,2,125,106,160,142,60,43,1,168,97,61,141,78,42,63,51,196,216,236,56,229,129,84,250,69,82,34,212,178,211,252,51,196,220,238,66,227,129,0,213,166,228,191,196,153,109,198,206,5,117,110,154,146,52,47,1,128,134,173,85,250,160,85,83,0,129,114,168,154,56,43,1,0,237,152,197,43,85,65,81,2,123,98,168,150,54,35,1,34,26,225,199,227,141,187,51,36,61,78,213,28,94,102,179,246,86,244,185,145,41,128,81,2,121,98,172,150,56,35,65,190,193,129,155,217,207,159,65,2,123,104,174,156,58,41,1,132,190,218,122,228,207,13,82,196,216,236,54,239,241,250,190,254,190,186,190,77,2,147,51,36,65,13,245,30,157,20,72,2,223,42,152,243,125,207,66,36,253,60,89,79,72,137,0,128,218,102,214,82,253,183,82,196,214,234,52,233,49,241,15,229,183,42,169,58,41,204,83,0,129,114,168,154,56,43,1,0,146,233,23,109,120,145,82,34,119,212,200,38,31,169,16,113,83,194,23,9,173,254,66,2,205,60,100,170,235,88,68,192,166,74,217,109,158,245,67,34,67,171,173,162,154,112,255,238,159,235,127,111,47,175,66,2,73,180,97,232,171,58,189,219,153,75,22,136,150,96,81,2,137,114,188,166,72,51,65,113,61,246,149,144,3,81,82,196,218,238,60,239,161,74,104,190,111,153,231,31,161,62,81,2,145,128,182,158,72,51,129,163,233,111,181,221,99,101,51,2,141,124,172,158,64,49,129,132,17,8,179,6,73,223,65,2,137,114,170,154,66,51,1,192,234,122,100,250,173,68,65,2,135,116,174,156,62,45,1,184,98,205,45,148,129,198,65,2,129,110,168,150,56,39,1,16,172,186,218,127,247,159,65,2,129,110,168,150,56,39,1,96,54,15,101,39,148,98,66,2,197,180,217,164,239,59,8,168,132,144,140,145,64,30,66,2,197,180,217,164,239,59,156,38,154,196,130,132,66,4,65,2,123,104,162,144,50,33,1,132,178,10,120,98,78,189,81,2,135,110,166,144,54,33,1,181,198,44,43,157,10,32,65,2,127,110,160,142,48,31,1,100,34,213,5,182,200,220,66,168,154,233,246,205,211,113,132,217,69,87,102,54,14,155,82,36,95,103,59,118,42,25,83,9,161,17,133,58,20,105,83,2,83,96,130,46,189,247,17,199,104,48,207,1,234,236,82,2,17,63,165,47,85,128,98,156,193,218,197,252,129,155,83,8,75,108,177,101,223,96,154,205,42,144,0,91,250,253,83,2,197,31,255,124,214,41,83,135,160,247,78,188,78,4,67,40,1,35,145,73,76,78,100,246,32,182,55,187,237,233,83,2,205,63,127,125,0,183,141,252,221,194,246,163,165,140,83,168,42,85,114,47,3,167,14,7,207,71,111,216,209,77,83,2,201,47,63,125,126,157,212,246,196,231,8,120,51,32,81,138,153,178,219,55,165,111,70,188,209,190,160,193,92,128,66,112,56,172,234,109,147,154,10,57,139,11,192,252,186,233,67,196,78,19,181,137,0,239,145,45,183,234,125,243,13,13,83,8,1,108,177,237,135,166,89,94,243,213,7,138,13,185,82,2,223,253,232,119,107,193,131,76,149,158,34,190,94,105,81,106,141,114,88,28,95,101,135,181,22,61,93,236,1,222,83,194,78,210,99,161,201,131,237,171,47,90,160,77,180,139,82,2,99,251,168,123,243,8,153,117,127,125,222,129,38,113,67,2,101,51,30,217,79,220,0,80,83,224,203,94,15,106,67,2,227,81,6,91,142,221,23,246,131,176,111,10,95,51,83,194,166,171,47,43,121,253,162,194,41,64,180,131,133,255,67,194,178,173,163,201,1,178,105,61,178,219,220,116,124,68,83,194,174,178,54,161,121,189,35,242,220,20,232,197,9,202,83,194,70,203,79,169,239,181,55,82,140,57,75,18,36,240, +173,7,75,67,83,41,107,83,89,156,64,202,100,197,186,62,81,140,85,236,58,111,157,151,108,104,52,234,172,172,141,140,82,34,109,43,122,233,31,17,243,59,65,72,74,68,136,41,67,34,43,124,186,61,93,41,21,217,9,64,110,132,175,229,207,5,87,95,219,177,227,82,99,209,168,160,26,96,9,1,67,72,8,44,155,237,222,175,86,46,30,64,115,243,229,51,66,2,75,99,206,177,225,85,23,2,19,33,225,26,106,81,82,40,2,108,180,36,156,124,74,9,79,16,184,183,212,0,82,2,107,255,218,31,231,120,87,200,144,209,55,243,254,198,66,8,23,81,54,54,215,254,213,149,150,159,178,104,23,253,67,34,177,248,130,61,26,220,234,239,245,126,134,180,187,27,66,2,87,231,91,181,161,52,82,87,18,145,128,196,68,64,82,34,97,107,119,169,47,69,220,250,28,153,247,63,104,206,82,196,84,81,105,237,113,245,68,41,239,85,144,126,157,219,65,2,67,49,59,41,111,93,1,216,237,217,29,182,16,144,66,2,95,243,99,187,165,55,91,158,238,234,78,100,127,1,66,2,95,243,99,187,165,23,197,144,61,105,213,223,21,125,83,194,82,82,71,87,57,151,226,188,75,148,187,6,160,153,67,34,35,24,130,57,89,49,247,205,196,234,92,0,34,45,223,197,88,85,109,233,129,20,217,40,150,149,254,130,100,175,67,34,37,27,170,57,156,196,189,181,255,191,219,125,192,235,83,2,43,170,8,51,49,244,174,64,91,187,173,181,246,57,34,80,68,140,227,194,125,93,223,91,85,91,31,50,213,180,223,197,76,75,101,217,129,114,242,203,192,102,147,22,41,9,66,2,227,238,226,119,231,85,218,142,250,73,30,140,6,0,82,2,115,216,28,31,127,197,109,224,12,247,241,38,102,142,83,194,218,219,202,27,33,228,24,49,119,163,228,176,247,168,67,194,80,77,103,227,1,204,94,95,107,128,203,172,234,89,82,34,33,13,167,161,45,0,224,250,246,190,189,213,196,157,67,34,29,154,185,181,91,158,0,242,6,232,171,164,89,177,66,2,99,120,102,250,165,60,7,246,63,251,61,123,83,89,82,194,76,73,101,145,1,192,124,189,41,119,121,103,36,200,67,196,84,181,221,9,241,164,192,14,64,65,3,144,94,109,81,2,63,39,55,33,107,73,65,33,230,148,182,185,235,250,67,136,103,204,90,213,222,165,81,236,29,61,172,119,96,72,223,137,147,233,124,243,31,158,99,18,188,32,48,66,91,60,67,40,124,227,129,87,168,156,103,111,100,167,208,20,226,115,83,232,41,108,189,167,227,173,217,206,75,182,20,239,83,128,67,40,2,181,237,53,63,244,112,237,130,156,139,247,84,160,83,8,3,181,204,233,6,143,46,3,11,241,148,252,67,88,83,194,58,63,46,159,132,34,79,8,120,20,17,65,153,226,66,2,107,122,110,255,169,24,155,89,189,17,217,233,165,9,67,194,82,77,105,203,1,244,21,127,213,51,229,123,201,254,82,8,31,236,237,45,85,24,139,93,43,160,223,75,62,52,67,196,84,181,205,73,78,14,188,159,64,87,66,43,162,44,223,105,139,97,142,90,112,51,18,125,183,133,91,211,196,27,35,136,153,9,130,28,0,203,71,87,233,14,233,148,133,139,82,8,137,193,8,87,231,217,243,167,21,17,198,46,105,18,66,232,191,73,241,20,7,249,151,77,67,95,216,244,118,236,78,39,9,192,114,127,240,145,130,236,36,17,64,233,228,247,82,196,124,150,238,224,105,129,207,53,119,145,248,94,148,121,66,2,141,133,164,80,63,60,196,170,164,230,32,150,108,54,82,34,33,80,79,14,44,193,136,16,112,136,132,200,9,104,67,2,21,203,201,42,18,162,154,96,61,175,243,142,31,99,51,240,20,236,189,249,147,114,112,235,46,241,3,165,55,255,33,10,26,203,228,153,34,79,92,59,139,136,121,73,6,233,67,2,145,58,169,165,156,123,104,77,186,96,27,138,130,74,66,40,129,97,230,195,77,239,196,221,35,75,157,47,107,226,67,34,73,107,205,32,29,208,36,189,223,235,242,240,24,135,206,113,52,140,251,78,61,158,239,223,3,77,26,156,59,223, +67,194,230,252,72,201,65,137,51,46,221,146,231,236,83,151,82,196,216,234,56,237,177,70,222,69,174,80,41,78,34,60,82,196,222,242,64,225,17,136,140,170,34,16,87,32,23,128,51,196,218,238,54,231,129,63,144,118,155,104,91,243,22,183,81,2,127,112,164,150,62,43,129,64,18,18,148,120,239,118,81,2,129,106,168,146,56,35,129,106,82,35,138,253,207,95,83,0,125,112,164,150,52,39,1,0,81,207,37,243,146,29,81,2,135,112,180,152,64,45,1,244,16,149,241,0,78,22,82,232,100,140,78,119,126,96,231,137,31,160,229,173,227,128,50,4,133,118,170,154,56,47,1,169,132,102,6,20,162,134,66,2,189,48,85,38,179,59,76,89,203,178,31,121,27,181,82,34,191,214,217,6,37,228,247,255,125,139,250,79,60,200,83,0,121,106,172,158,56,43,1,0,75,215,53,139,213,24,83,0,125,110,176,162,60,47,1,0,134,195,191,93,247,40,83,0,127,112,162,148,62,49,1,0,183,29,216,4,77,210,81,2,123,114,158,150,62,51,129,33,108,48,141,41,105,89,66,36,61,61,87,78,199,136,86,153,255,146,127,177,32,17,82,168,3,12,143,247,93,104,211,159,11,8,153,172,218,24,82,0,129,120,168,160,56,49,1,0,0,168,182,125,24,80,83,0,127,112,166,152,54,41,1,0,110,191,37,109,11,231,82,196,214,238,54,233,1,170,191,175,83,191,239,251,104,142,35,4,185,53,209,102,243,27,226,122,109,64,155,102,148,179,83,0,125,110,176,162,60,47,1,0,202,235,133,174,80,16,81,2,145,112,196,164,80,49,65,4,226,4,104,71,212,220,82,40,2,76,231,191,149,192,251,111,61,42,172,156,247,112,83,0,129,114,180,166,64,51,1,0,5,85,9,137,157,40,82,34,183,182,215,70,37,9,128,80,114,238,214,113,187,194,82,36,63,62,57,104,40,129,4,252,90,169,140,153,27,207,66,2,197,180,217,164,239,59,204,204,194,132,68,34,4,90,66,2,205,184,225,166,235,58,8,38,35,201,159,172,76,200,83,0,125,110,164,150,52,39,1,0,228,42,123,36,65,98,66,2,197,180,217,164,239,59,72,122,64,110,168,202,26,194,66,2,69,180,88,228,239,91,35,196,74,32,132,34,34,72,82,34,183,246,200,42,37,144,185,63,242,164,148,65,154,25,82,34,255,218,91,203,20,248,194,127,255,237,229,171,207,223,81,2,133,114,168,146,56,35,129,141,70,39,30,165,225,122,65,2,127,100,158,136,44,29,1,0,237,183,190,233,99,235,51,200,3,209,14,191,126,72,199,175,63,216,54,138,47,190,82,2,25,124,215,139,95,1,67,28,27,249,37,179,101,199,33,198,108,59,39,93,218,38,149,0,4,146,68,22,84,136,66,2,49,237,189,186,178,89,128,244,8,245,224,187,250,51,33,170,18,213,68,125,83,144,90,7,30,4,61,100,220,191,83,194,142,147,7,186,146,217,45,249,252,33,189,105,250,3,82,2,145,65,53,72,5,224,229,146,90,100,131,4,131,16,67,2,245,46,239,248,144,170,80,41,4,39,224,113,24,150,67,72,49,236,104,100,166,153,76,40,28,240,173,221,231,23,82,240,230,166,235,90,125,239,60,177,173,48,15,218,69,146,51,4,205,207,244,212,144,84,39,10,61,32,190,130,217,88,83,176,200,230,159,75,247,207,186,47,30,134,50,6,122,245,83,200,66,172,215,126,201,117,239,222,181,99,168,163,182,162,65,202,9,108,239,91,178,215,39,165,223,119,128,41,62,142,83,136,2,108,187,246,215,182,127,220,204,139,48,140,118,99,67,2,215,80,5,77,141,42,166,186,161,223,130,155,66,235,83,136,3,108,179,246,167,36,91,156,205,216,174,181,52,64,67,2,111,243,38,233,15,220,236,173,61,147,179,134,4,104,67,2,103,86,70,89,81,255,255,83,186,187,95,35,43,104,83,194,22,27,163,151,47,42,161,132,87,136,104,128,85,84,67,2,235,119,118,101,149,206,238,155,222,232,222,79,59,71,83,194,38,43,175,147,60,184,22,186,51,45,67,82,188,93,67,194,186,179,171,185,65,23,192,30,25,244,239,139,216,51, +67,2,239,171,166,234,76,24,65,36,196,242,47,162,114,3,83,194,66,70,63,51,103,111,83,115,8,76,107,131,17,1,83,40,75,172,247,53,231,116,73,46,246,250,184,2,245,0,67,40,11,76,123,221,214,177,214,45,86,23,182,152,238,146,207,41,252,201,154,52,118,73,253,50,165,89,138,224,77,210,66,2,67,237,79,168,99,29,43,224,127,25,127,63,187,123,66,2,71,102,75,53,161,86,238,181,170,49,68,90,0,0,67,194,84,83,97,209,129,191,23,219,111,107,56,17,226,197,66,2,207,231,78,53,227,84,46,12,147,130,91,110,21,21,51,196,74,71,91,229,129,173,173,228,75,77,196,255,191,182,66,2,211,235,87,119,161,53,68,12,17,10,51,70,55,165,67,194,110,109,123,167,65,214,172,91,107,142,74,181,243,191,82,34,173,11,107,237,39,185,251,174,188,74,176,22,162,174,67,34,173,152,130,63,153,204,11,60,247,125,74,217,109,198,66,2,87,231,91,181,227,21,22,226,74,34,221,128,153,77,81,2,69,55,61,47,113,89,65,168,77,7,90,91,236,254,81,2,63,39,55,31,99,79,129,115,171,216,110,131,123,147,82,34,109,105,58,233,39,113,125,4,61,111,74,125,8,64,82,136,2,108,181,229,92,188,94,43,45,230,146,37,26,74,35,40,110,145,116,244,245,61,245,20,54,158,225,68,29,183,67,136,3,108,58,197,222,169,213,174,28,178,155,89,229,7,205,235,70,172,186,30,59,203,222,35,243,223,82,26,13,144,83,2,37,146,232,58,65,140,229,177,106,179,37,248,207,50,67,232,61,236,122,253,194,159,80,45,86,229,201,239,25,32,67,34,155,153,153,53,90,110,204,119,55,6,63,219,12,7,66,40,35,113,84,180,22,125,116,20,54,159,10,13,118,219,206,241,22,236,68,217,30,69,85,253,68,215,28,255,207,203,83,194,90,91,207,147,111,173,154,219,190,136,81,230,106,95,205,199,164,82,44,153,44,146,24,1,48,166,146,75,178,239,82,2,63,224,205,16,83,169,224,58,99,18,78,105,92,156,83,2,115,219,206,75,254,46,158,222,29,92,37,160,185,100,67,2,89,105,149,228,140,4,180,205,125,61,171,181,243,165,67,194,86,85,111,153,129,70,204,182,106,116,231,141,187,27,83,194,62,67,178,151,208,171,79,32,118,82,48,97,188,97,66,2,91,230,223,181,163,53,228,142,250,41,222,85,0,146,66,2,223,115,227,251,167,87,150,61,110,38,163,160,255,110,67,194,108,105,133,191,1,162,71,193,179,43,110,245,140,251,82,196,80,75,101,233,81,32,220,32,151,18,246,234,158,75,83,194,214,91,203,139,123,20,27,157,16,94,16,165,1,169,223,197,68,65,93,229,65,14,208,74,214,47,74,45,68,215,82,196,60,59,85,241,81,131,181,64,239,221,165,226,21,216,35,4,91,102,211,245,231,87,169,138,92,248,255,186,162,24,83,2,169,160,196,58,24,163,134,97,250,64,191,203,222,189,66,200,131,73,232,186,228,79,14,100,49,89,252,191,191,39,67,104,13,149,167,111,47,170,166,243,68,94,9,65,59,216,66,36,17,253,118,207,144,134,34,114,145,119,89,213,249,141,173,7,21,4,72,62,244,218,8,217,250,222,159,104,63,141,35,232,82,177,136,74,207,254,168,74,112,156,82,105,82,145,207,5,5,129,161,204,122,28,197,251,75,186,80,248,63,143,82,34,181,238,206,153,186,68,165,129,36,198,203,196,152,8,33,170,1,245,255,86,44,116,90,27,15,8,115,106,178,201,82,2,17,32,198,212,235,228,220,192,24,66,147,12,14,58,65,170,18,76,97,222,123,234,113,35,224,194,22,209,210,191,83,2,245,208,164,47,90,185,171,212,172,170,28,16,31,5,66,8,203,233,134,13,39,217,178,199,99,81,202,117,63,47,67,232,82,35,118,201,9,199,254,229,160,47,238,255,217,29,82,196,226,250,70,221,97,9,76,41,129,156,248,157,85,254,35,8,137,201,246,205,211,241,116,221,213,73,145,197,205,10,65,2,133,114,172,154,60,43,1,240,50,11,96,22,145,68,81,2,133,110,172,152,60,39,129,225,68,51,84,228,192,62, +51,36,193,76,197,156,157,242,158,202,255,6,58,111,109,73,82,2,81,122,197,35,231,128,249,201,76,49,161,42,85,165,67,2,67,166,140,100,17,112,40,71,89,144,132,66,1,90,35,4,61,180,77,230,175,59,129,82,184,82,105,108,169,249,66,2,73,181,228,102,171,90,196,242,204,6,44,8,194,0,82,36,95,126,115,168,16,152,98,64,149,81,105,80,40,56,66,2,61,176,213,36,175,58,22,125,92,103,244,129,101,108,51,196,216,238,62,227,1,191,236,202,68,236,66,215,100,46,82,200,9,204,94,63,150,100,211,143,45,82,69,28,198,162,223,197,208,236,54,227,65,255,34,255,182,179,37,93,230,42,66,8,2,145,237,110,51,63,237,142,83,159,229,224,117,24,51,36,193,76,205,156,93,235,191,217,237,102,167,177,24,187,83,0,123,114,166,152,54,41,1,0,21,21,64,89,188,164,67,34,67,141,205,160,92,71,111,18,151,97,240,196,12,33,51,2,127,104,164,140,64,41,193,109,116,86,138,228,4,24,83,0,127,112,162,148,62,49,1,0,36,108,191,106,186,65,65,2,123,116,158,154,58,53,1,224,7,3,12,176,129,230,81,2,131,108,166,144,66,45,65,100,95,217,26,54,188,124,81,2,135,110,174,146,66,47,1,163,254,129,27,25,74,68,82,196,220,238,60,237,49,166,92,169,226,19,241,94,170,247,82,232,99,204,142,255,117,76,215,159,9,242,94,80,253,112,82,34,189,186,75,11,23,41,154,87,149,186,148,210,115,100,66,2,61,181,217,36,237,58,104,76,102,198,41,204,196,162,81,2,127,102,178,150,66,47,1,64,52,130,16,209,47,181,65,2,125,106,176,158,62,43,1,0,48,90,38,251,24,171,82,196,206,232,48,239,33,246,140,229,183,81,169,233,163,104,82,34,125,218,10,235,22,161,57,30,181,143,54,155,206,82,83,0,123,106,168,158,56,43,1,0,137,96,74,34,8,9,81,2,137,114,176,154,64,43,65,155,54,204,15,237,44,120,66,2,69,180,217,164,239,59,197,64,10,64,66,68,41,204,33,198,116,190,104,92,139,101,227,189,254,46,87,240,175,235,82,36,127,39,57,118,114,95,186,126,190,111,46,114,165,8,51,200,3,213,198,121,78,32,135,147,145,81,203,160,155,180,83,2,69,28,242,88,84,238,9,228,30,129,198,126,7,55,206,113,25,9,99,220,107,189,114,203,44,123,110,125,34,11,67,2,175,31,243,193,94,100,204,15,15,7,196,110,196,80,207,137,103,227,134,101,152,203,113,120,93,142,129,14,188,219,83,2,207,71,159,121,0,2,1,128,136,16,135,13,116,189,83,168,131,73,108,142,169,171,205,17,191,249,37,7,111,246,67,104,61,85,35,118,163,128,195,135,132,232,96,250,148,158,67,2,113,32,47,120,73,209,201,93,163,97,204,1,226,8,67,2,113,15,215,248,143,145,64,39,1,19,161,20,133,158,66,2,227,124,235,58,109,91,80,158,98,49,86,125,158,179,83,194,54,187,50,47,216,89,194,188,6,66,99,160,4,184,83,104,21,236,126,94,219,246,105,141,228,41,17,8,9,232,82,2,159,250,72,59,219,36,250,79,179,236,129,101,58,252,82,2,99,255,216,123,99,105,135,96,170,60,34,106,235,84,65,42,183,114,10,101,102,149,92,68,115,158,173,194,27,8,82,8,1,236,245,45,23,253,247,231,173,242,17,210,75,35,83,194,90,223,115,169,185,151,250,43,136,167,38,223,91,163,65,138,8,108,89,219,215,250,39,137,174,69,146,4,227,252,82,2,27,156,71,183,65,129,206,77,57,159,101,118,116,255,35,140,118,49,19,87,53,89,5,144,100,95,73,209,170,106,83,194,42,55,59,186,119,237,60,247,186,164,173,47,128,191,83,194,38,175,50,111,61,132,51,90,23,115,62,144,123,180,82,2,207,215,244,178,102,233,38,192,56,102,113,24,100,111,83,194,170,174,50,137,106,70,162,174,113,62,131,24,154,8,83,194,34,38,42,147,208,82,3,189,214,172,90,33,138,193,67,194,150,141,133,193,65,125,254,188,27,191,111,55,60,198,66,2,35,203,43,235,153,23,230,157,28,27,160,223,98,123, +83,2,187,240,194,43,223,98,81,0,23,8,83,79,76,204,83,2,189,248,227,47,247,189,242,222,229,239,57,112,15,193,67,2,123,143,231,122,80,154,210,160,60,20,39,209,41,156,67,2,43,191,242,179,95,87,153,30,236,252,23,228,92,7,67,2,217,77,181,90,143,229,152,229,55,54,85,22,84,112,82,2,219,153,38,247,220,100,164,181,159,136,153,195,48,83,67,2,225,208,245,222,81,109,170,140,243,133,228,176,209,248,83,2,177,186,9,51,208,24,155,184,12,115,90,52,214,205,82,80,196,102,109,86,158,151,108,174,187,56,250,138,61,44,82,2,171,180,76,30,233,224,238,41,55,142,74,49,245,64,67,2,89,75,165,92,141,212,49,17,247,96,172,49,115,196,67,194,82,77,99,209,65,121,192,142,139,252,126,245,30,239,82,34,105,105,57,197,37,17,34,18,227,162,155,21,196,10,82,34,49,15,170,161,29,41,70,74,229,119,198,124,152,33,66,168,176,73,76,50,49,81,11,114,48,73,210,181,32,43,82,34,173,107,122,233,47,197,155,129,156,72,123,247,198,251,51,2,95,63,83,51,127,95,97,156,138,64,72,255,35,99,67,34,43,91,186,187,92,185,14,182,223,192,218,2,114,238,205,199,178,216,238,157,59,122,16,52,31,73,201,220,94,238,83,0,93,47,81,39,121,89,1,0,111,146,55,232,79,230,67,232,4,12,123,229,214,171,84,109,30,176,202,234,103,132,66,2,211,226,83,51,227,22,192,97,132,169,25,237,234,63,82,168,18,236,252,100,188,148,78,45,25,242,119,57,53,148,67,196,210,148,221,169,244,122,35,182,185,16,13,98,143,107,35,4,107,119,235,57,233,54,45,57,171,254,182,230,117,8,82,34,105,107,121,201,47,104,69,105,75,113,2,241,160,16,66,2,91,230,91,183,227,24,189,247,238,25,170,192,42,162,66,36,213,70,234,96,251,8,144,113,160,121,221,42,109,95,35,136,222,193,148,95,237,14,190,34,189,91,17,48,97,55,66,2,227,242,103,185,169,86,254,115,40,98,204,154,14,168,83,194,90,218,75,141,72,143,18,34,135,107,61,189,199,57,83,2,41,161,37,47,101,204,137,101,89,21,2,59,182,134,83,2,123,226,202,63,38,40,90,127,39,231,3,80,59,140,83,194,222,94,79,151,81,51,215,48,40,61,247,221,66,186,66,40,66,145,85,53,119,220,180,212,53,159,18,6,201,99,67,194,80,77,103,193,129,110,58,88,186,96,202,252,174,111,50,4,65,49,33,65,99,81,129,42,66,250,149,105,59,252,66,36,161,203,172,97,251,0,38,97,88,167,218,166,221,110,66,168,146,9,123,234,253,155,5,92,186,22,124,181,38,9,51,36,29,113,1,181,154,185,2,120,12,152,199,237,191,204,82,8,137,129,66,19,231,229,203,176,11,129,203,41,37,10,33,170,135,233,129,246,169,28,94,173,14,153,33,35,240,181,173,7,37,8,76,92,6,225,8,152,182,146,236,190,81,185,82,36,45,142,1,176,82,148,170,34,247,201,250,35,217,50,50,4,25,18,96,74,238,222,0,0,149,1,217,124,189,120,66,136,3,145,231,105,174,190,135,73,206,158,95,253,74,234,51,4,151,202,193,172,145,110,214,237,64,186,219,118,18,219,66,168,214,73,102,198,193,19,181,4,138,78,183,183,24,34,82,168,86,76,84,205,127,202,146,201,189,160,68,186,111,87,83,2,47,200,131,39,246,20,208,55,130,159,98,228,136,96,67,136,153,105,203,104,140,166,41,99,129,189,188,216,201,232,67,2,99,161,54,248,10,147,253,37,47,88,57,98,142,72,34,144,100,119,250,57,169,7,79,49,223,95,144,178,152,45,82,196,222,244,60,225,113,27,83,69,179,129,84,185,111,104,65,2,133,114,172,154,60,43,1,216,36,145,60,240,159,108,65,2,137,118,176,158,64,47,1,192,85,127,197,180,128,98,65,2,133,114,172,154,60,43,1,72,34,137,73,164,86,192,65,2,131,112,170,152,58,41,1,136,54,67,93,118,147,183,82,2,33,66,26,149,235,196,77,155,105,51,235,230,88,132,66,2,37,241,176,188,234,24,160,119,164,191,123,183,255,187, +82,2,209,5,181,44,15,200,116,165,221,9,139,12,130,96,83,136,19,131,35,134,71,246,134,129,253,47,119,32,252,4,83,2,55,218,169,71,20,49,138,160,209,0,159,143,242,61,83,40,3,172,80,140,247,37,191,101,223,246,108,192,222,163,83,40,66,108,145,150,13,207,111,20,94,177,73,175,126,19,67,34,79,203,181,42,25,245,254,24,190,117,56,223,40,20,67,34,71,108,229,168,26,185,143,138,125,166,164,98,69,74,67,34,71,204,205,164,27,3,65,172,17,144,238,158,84,159,81,2,125,102,176,154,60,39,65,89,75,206,66,178,226,102,81,2,127,110,178,154,62,41,129,196,68,146,97,3,146,92,67,34,67,204,205,162,92,249,122,226,36,246,198,249,219,105,83,0,119,104,170,156,54,41,1,0,133,18,137,177,209,196,67,0,117,106,168,158,52,43,1,0,64,25,237,255,52,210,82,34,57,190,90,235,20,192,186,231,173,239,188,253,250,82,65,2,121,102,168,150,64,47,1,196,246,138,27,210,212,127,65,2,125,106,172,154,68,51,1,132,3,100,173,128,16,66,35,4,189,48,213,230,175,58,82,146,146,91,192,110,195,147,50,136,2,81,205,142,19,127,173,46,83,31,216,237,110,142,83,0,127,112,166,152,54,41,1,0,145,40,131,34,98,240,65,2,129,110,168,150,56,39,1,0,220,138,122,45,252,155,66,2,73,184,92,230,237,90,162,132,162,74,128,74,72,132,81,2,127,104,166,144,54,33,1,77,13,77,6,255,219,214,223,3,129,94,168,134,56,23,113,129,157,204,173,100,75,177,83,0,125,110,164,150,52,39,1,0,18,44,169,194,7,47,65,2,127,108,166,148,54,37,1,192,107,181,143,153,93,102,81,2,131,106,170,146,58,35,1,141,60,180,94,48,71,251,81,2,127,108,174,148,58,37,65,155,240,149,115,128,34,32,66,2,197,181,213,228,175,91,200,130,76,194,192,168,44,232,81,2,121,98,172,150,56,35,129,63,255,206,179,52,240,20,81,2,117,106,168,158,52,41,129,75,84,177,199,192,223,187,66,200,66,81,237,78,83,94,109,238,114,158,96,210,94,126,81,4,127,112,166,154,50,43,1,144,41,203,96,139,139,104,82,2,105,64,156,88,91,113,119,238,174,189,57,59,120,220,82,2,33,8,138,157,251,128,84,204,24,51,175,242,92,236,83,8,26,204,134,58,13,222,235,124,224,138,246,217,186,250,83,2,207,71,158,125,0,9,1,153,224,68,75,38,71,131,82,232,14,213,68,92,123,233,138,14,12,68,61,246,247,126,82,2,19,160,84,120,64,165,197,249,10,79,167,3,212,33,83,232,99,108,187,110,179,182,239,148,104,230,93,143,25,96,67,2,115,15,223,122,16,33,167,42,49,4,63,153,37,28,83,8,26,172,209,237,213,238,107,78,64,206,188,204,226,156,81,10,129,164,159,174,141,253,36,4,176,46,39,251,69,141,67,2,215,111,13,73,12,47,119,143,160,5,81,177,108,157,67,104,118,75,174,184,19,191,105,189,163,110,15,80,193,2,66,2,199,246,79,61,51,28,140,142,5,14,154,104,188,241,83,168,18,172,213,125,57,207,115,140,10,245,48,153,208,165,81,202,152,4,149,55,221,102,165,194,206,122,131,250,174,246,65,138,24,172,105,126,183,183,46,7,190,75,161,58,188,93,65,42,17,108,91,250,185,242,53,99,53,73,3,196,64,104,67,2,97,141,229,214,75,236,140,148,105,60,192,134,138,64,66,2,167,251,38,121,39,92,146,95,81,137,154,1,16,233,65,234,25,108,73,215,179,150,253,40,1,60,32,246,0,89,83,194,174,182,58,174,185,148,201,70,25,203,75,122,118,1,67,2,105,113,22,221,141,100,232,242,154,191,244,8,131,32,83,40,2,236,122,103,165,51,201,156,243,111,120,66,206,122,83,194,154,47,175,189,128,104,167,113,73,201,247,218,202,185,33,198,218,106,116,27,91,94,103,30,50,191,5,244,14,66,83,194,42,51,54,151,80,253,165,230,107,241,94,31,110,96,83,194,54,63,66,29,63,251,112,109,212,137,228,14,216,28,67,194,166,157,147,143,1,248,251,204,174,179,123,207,114,119, +67,2,255,167,127,252,76,127,255,221,251,127,11,66,103,13,50,4,97,97,79,95,131,101,129,198,148,113,9,28,123,250,207,5,203,210,207,171,163,82,125,175,61,136,139,109,217,139,83,194,58,195,190,141,214,91,35,156,151,245,80,46,54,116,82,194,156,143,151,109,1,164,111,13,163,149,54,115,238,245,67,194,118,115,125,219,129,221,110,204,31,59,82,60,30,178,83,194,162,38,158,179,53,197,168,70,140,192,185,136,125,244,83,194,194,70,67,143,114,111,93,78,73,175,182,208,59,88,67,194,134,127,143,129,1,255,23,252,239,159,238,119,144,151,67,194,132,127,137,91,65,235,169,20,115,221,105,87,238,5,83,194,74,74,199,165,127,117,48,199,28,103,141,59,255,62,83,2,175,178,9,55,33,207,159,125,28,92,112,199,128,204,67,2,215,74,157,92,13,0,255,155,0,79,233,33,34,140,34,42,35,236,116,95,137,52,191,109,187,145,226,113,0,10,83,136,94,44,155,38,131,239,107,108,175,138,124,151,127,24,66,2,207,111,211,251,163,87,211,3,213,241,169,89,206,150,83,194,206,211,67,31,55,128,159,90,57,173,180,222,71,173,83,194,198,79,187,187,191,83,208,239,150,182,221,213,129,220,82,2,235,212,27,26,235,64,85,168,154,65,107,86,220,156,67,34,39,89,138,185,154,139,224,213,156,195,205,79,226,125,66,36,229,202,146,66,78,137,5,10,245,85,104,93,102,102,83,194,86,91,78,139,8,229,145,99,244,110,84,243,214,8,82,34,101,71,248,200,31,185,160,145,254,6,103,15,204,222,67,194,102,99,121,201,65,93,117,246,79,71,211,61,127,65,66,2,83,222,215,177,159,51,251,19,82,87,78,18,205,144,66,2,211,231,87,53,161,83,101,8,225,238,229,225,151,230,66,2,79,218,211,175,157,50,130,200,194,0,44,102,68,225,65,2,85,67,77,59,121,103,1,200,199,144,77,228,147,243,82,34,101,107,120,169,39,224,229,109,63,89,140,99,98,182,67,34,41,90,162,59,155,56,202,174,59,95,8,147,50,221,81,2,59,31,51,23,99,75,65,165,49,93,32,162,114,207,83,194,82,87,198,143,86,173,4,100,242,209,7,241,244,112,67,34,143,182,120,157,85,86,173,246,50,110,239,149,222,27,67,196,84,181,213,17,18,144,174,61,154,254,255,233,250,78,67,2,79,35,101,96,15,162,64,106,80,52,85,25,54,214,51,36,157,112,17,51,28,248,239,208,80,104,152,111,85,62,222,73,142,193,183,30,150,127,244,227,77,219,4,214,239,3,33,234,6,203,6,184,43,107,223,181,129,55,210,236,199,112,35,4,153,140,52,214,61,63,148,20,254,64,169,7,245,186,82,136,153,73,35,6,16,63,61,155,21,68,239,231,169,33,51,2,45,26,106,90,250,234,0,68,200,81,166,33,194,250,65,2,39,28,106,92,252,236,0,128,96,144,84,48,23,48,66,2,165,128,197,144,53,91,219,32,71,204,202,66,76,194,66,36,201,57,84,253,177,134,89,109,249,102,133,214,102,221,67,168,3,12,132,226,217,85,49,226,154,252,49,31,170,36,65,202,3,172,174,99,167,185,182,227,174,88,23,38,78,238,83,2,115,192,130,47,222,232,226,116,254,198,127,239,78,3,65,170,18,76,231,255,115,238,106,56,160,92,180,86,75,139,82,104,13,213,115,91,145,180,131,207,29,248,38,111,104,161,207,5,77,69,88,172,237,60,83,179,221,161,133,245,238,67,65,2,135,118,174,156,62,49,1,136,69,243,40,133,144,18,82,196,224,244,58,237,49,166,92,226,215,147,244,217,131,46,66,2,205,56,224,102,173,27,8,48,4,183,164,129,170,194,81,2,135,114,172,154,66,43,129,140,68,38,242,217,32,180,66,2,69,180,88,228,239,91,106,174,164,93,182,239,179,6,66,2,189,57,209,102,243,90,198,153,108,51,192,201,150,6,66,2,73,184,92,230,237,90,72,72,72,106,72,130,136,12,81,2,131,106,176,150,62,39,1,130,102,52,3,29,110,101,66,2,61,57,88,166,241,58,105,212,97,241,226,103,108,129,81,2,133,110,172,150,60,39,1,29,228,133,99,132,2,118, +66,200,194,233,244,199,213,177,230,147,150,65,168,0,129,207,67,34,197,76,205,164,27,107,126,87,154,239,158,174,10,74,67,34,213,73,150,170,26,177,2,255,92,192,155,105,43,164,33,198,132,70,44,153,127,247,254,39,126,102,254,217,2,22,66,36,123,181,83,125,200,144,151,245,43,170,9,90,169,165,67,34,83,75,182,44,156,8,128,36,84,183,78,151,124,171,189,39,123,52,83,76,73,217,230,69,127,157,33,67,122,23,51,196,238,2,83,219,129,0,96,138,142,28,55,206,222,198,66,2,201,184,221,166,237,58,96,38,238,101,46,93,132,102,81,2,135,112,174,152,62,41,1,23,141,44,166,178,199,252,82,2,81,60,197,39,95,1,67,57,88,177,225,42,205,180,66,40,9,177,237,110,83,127,45,175,115,158,174,232,65,175,223,37,65,205,197,162,28,34,17,75,141,148,252,241,111,131,67,2,241,32,47,250,11,204,234,246,235,144,94,194,140,41,67,72,26,99,101,195,136,215,242,103,98,137,236,144,141,210,82,196,218,238,62,229,129,249,22,153,151,186,93,52,55,220,82,196,220,240,60,231,241,60,1,60,254,169,125,78,158,91,221,11,75,145,227,185,83,188,247,118,136,190,247,206,52,212,82,34,183,246,200,42,37,48,59,78,148,88,218,85,0,90,66,2,201,184,221,166,237,58,234,108,25,36,137,128,132,8,65,2,133,114,172,154,60,43,1,208,162,129,76,130,1,128,66,2,201,57,221,102,237,90,188,194,31,8,141,136,198,164,66,2,201,184,221,166,237,58,106,172,44,72,4,24,132,124,81,2,139,110,178,150,66,39,129,77,45,110,11,215,90,2,66,2,197,180,217,164,239,59,174,170,41,78,18,134,32,106,67,34,195,108,205,30,92,184,191,237,161,27,202,223,117,251,81,2,131,108,168,148,54,35,129,30,99,138,89,135,212,19,81,2,129,108,168,148,56,35,65,173,126,117,85,179,236,11,50,4,129,102,164,148,46,37,1,153,151,221,229,239,100,83,67,34,195,75,165,28,26,95,199,206,46,4,193,158,47,255,82,2,89,92,200,143,103,128,72,9,12,241,236,110,228,173,82,196,206,228,40,241,233,30,47,7,142,75,161,190,39,189,82,2,225,0,218,156,97,16,8,44,145,53,192,46,121,180,66,104,11,99,76,14,198,152,183,96,252,138,75,209,120,220,67,2,119,75,167,250,13,16,150,196,168,164,143,217,241,36,67,2,15,95,249,163,159,206,27,17,87,72,54,168,70,64,83,40,1,44,22,70,233,117,223,220,157,209,2,81,43,101,67,40,2,171,247,13,218,162,60,125,163,101,249,75,193,82,83,2,189,234,170,55,159,32,16,145,0,220,4,37,181,49,67,34,163,217,137,165,154,119,49,38,72,175,242,31,137,228,67,112,187,132,243,116,141,167,254,102,136,23,80,69,70,7,65,202,152,4,169,111,66,151,88,154,138,29,180,129,226,55,83,2,113,201,200,38,12,32,77,136,244,196,148,224,255,203,67,196,206,115,132,201,138,6,202,91,155,242,38,242,253,183,83,144,254,170,247,117,118,254,217,141,160,181,220,225,21,168,67,2,87,97,61,94,8,204,6,174,224,178,228,74,5,114,67,2,111,169,150,102,140,109,220,149,102,239,203,160,142,2,82,2,139,138,67,85,66,164,253,193,140,137,249,71,29,105,67,2,123,207,230,106,79,40,48,110,216,147,23,165,184,109,67,2,239,165,102,106,136,124,171,183,111,14,21,30,140,106,81,74,156,242,116,212,219,172,134,65,94,90,52,163,190,9,65,138,40,236,62,74,117,239,60,113,194,207,224,245,27,216,66,16,223,108,125,233,89,222,105,186,222,161,97,77,52,52,66,2,43,195,179,163,157,83,191,63,123,241,41,209,3,87,66,2,31,187,163,161,215,18,150,90,236,144,166,218,21,251,82,194,178,171,159,191,1,208,220,136,171,235,35,191,145,207,83,194,46,50,182,155,24,232,109,145,121,6,151,171,228,31,83,194,42,46,50,29,235,24,222,134,7,73,142,232,128,235,83,194,166,171,174,147,14,75,235,37,64,138,18,99,24,95,83,194,50,182,186,155,123,238,121,230,64,251,14,58,142,10, +66,2,203,211,79,43,229,83,57,6,249,201,246,159,51,195,67,2,231,46,222,104,81,113,9,220,127,243,90,221,59,239,67,194,118,115,125,193,1,215,22,135,183,190,127,237,46,254,83,0,105,91,97,83,117,103,1,0,201,44,215,136,140,108,83,0,109,95,101,87,121,107,1,0,117,146,222,126,144,72,82,34,177,105,43,201,39,225,135,148,106,13,225,98,213,164,66,2,75,207,79,169,227,50,33,32,45,34,17,17,16,29,83,0,107,93,99,85,119,105,1,0,118,147,180,109,138,246,67,232,29,44,204,13,119,201,226,178,156,23,12,154,8,73,35,196,118,113,127,239,1,128,156,247,30,0,82,43,189,97,82,232,198,201,101,143,23,43,87,158,22,176,87,43,32,130,83,200,3,172,221,228,231,35,185,221,232,250,62,125,242,6,34,48,37,67,148,82,222,194,120,207,57,47,165,52,86,96,83,2,247,224,196,47,212,229,234,25,15,223,16,58,0,161,81,234,141,132,151,132,161,232,160,114,128,80,162,34,155,138,82,2,11,170,66,57,80,64,68,186,56,127,63,139,116,32,83,2,61,235,202,59,90,251,170,184,28,144,216,39,0,114,66,2,55,106,190,185,159,25,25,145,153,89,21,117,96,27,67,2,105,45,190,100,144,219,217,228,171,45,246,124,12,51,83,194,58,67,178,188,154,197,186,34,208,115,22,58,199,158,67,194,94,91,113,191,129,59,154,253,23,28,227,88,129,131,82,2,239,246,140,50,105,9,250,45,22,59,19,188,213,39,66,72,26,177,50,242,243,52,245,148,150,158,29,231,135,137,65,2,57,27,49,19,99,67,1,184,241,206,237,57,248,31,66,2,91,235,95,183,227,21,32,130,100,201,109,78,215,14,82,34,33,11,54,165,39,233,92,26,181,117,76,249,179,202,83,194,218,94,210,141,63,162,176,170,15,163,141,242,215,153,66,2,219,107,223,119,165,85,155,132,223,8,59,150,63,125,83,194,74,202,63,139,130,35,102,60,147,217,106,174,98,143,65,2,69,53,59,41,103,85,1,128,26,152,197,14,97,53,82,34,165,105,40,201,39,185,129,80,118,164,151,157,244,239,66,2,87,226,219,179,159,51,74,44,196,162,128,18,132,164,82,2,175,136,140,17,243,100,85,8,6,53,184,102,198,149,34,108,5,108,85,219,158,93,223,29,49,6,18,15,95,208,67,2,219,68,117,96,143,238,221,116,183,6,167,89,128,162,82,36,45,159,129,114,228,254,181,246,211,218,214,228,120,110,81,2,57,48,114,96,24,9,129,172,6,180,7,153,103,134,83,136,142,41,65,163,39,37,103,15,240,111,42,91,240,191,173,7,51,42,92,106,10,227,240,190,15,178,177,61,83,143,82,34,149,124,203,35,12,41,123,42,215,21,18,187,160,223,67,34,27,76,187,128,155,115,202,171,38,21,58,149,169,230,50,4,61,40,114,86,252,228,0,234,115,211,124,157,33,47,207,5,45,128,53,206,125,26,192,82,122,10,235,108,131,218,66,2,41,144,65,86,57,28,96,121,84,25,209,75,121,14,83,2,53,209,165,51,214,223,98,195,198,118,11,152,61,32,67,104,5,195,6,94,169,126,89,185,164,45,241,179,100,211,83,200,152,97,139,205,51,11,75,19,232,4,230,112,14,218,51,36,103,104,190,166,154,150,212,246,97,148,244,175,69,194,205,199,116,189,231,93,52,40,209,84,222,67,134,88,236,188,82,36,27,61,107,102,82,90,124,72,211,131,91,111,109,172,65,2,131,112,170,152,58,41,1,176,150,221,32,177,229,116,81,2,143,116,178,156,66,45,1,64,54,34,15,216,4,23,83,0,131,116,170,156,58,45,1,0,46,213,82,51,20,81,66,2,73,184,92,230,237,90,64,164,136,34,72,138,196,4,81,2,135,112,174,152,62,41,129,217,208,142,105,72,2,51,65,2,131,112,170,152,58,41,1,128,18,147,108,163,198,212,65,2,127,110,174,158,60,43,1,100,222,97,39,33,228,16,81,2,129,104,168,160,56,43,1,221,63,36,86,241,91,143,67,34,73,42,166,40,26,26,126,233,44,145,239,132,153,73,65,2,125,106,176,158,60,43,1,176,20,84,97,141,159,179, +51,36,191,43,229,34,29,66,98,181,150,181,255,70,253,215,82,34,51,144,6,142,189,192,136,209,33,102,72,140,152,8,82,34,107,176,4,166,63,25,128,125,114,222,222,56,32,53,67,2,173,134,155,90,18,217,11,30,19,72,130,200,74,64,66,2,213,61,233,40,231,57,156,2,204,30,198,106,174,116,67,34,205,10,166,170,153,213,236,143,63,118,135,110,158,57,82,34,115,182,200,74,167,68,190,237,236,160,44,122,190,198,67,34,71,169,149,168,24,109,157,221,6,254,204,209,182,221,82,34,183,246,200,42,37,240,131,224,199,104,253,89,239,106,67,34,83,9,158,42,26,111,136,157,118,191,218,255,77,112,82,34,127,248,74,11,37,144,75,154,157,14,241,213,215,250,67,2,39,224,18,84,74,110,205,20,115,212,59,19,28,198,82,2,17,5,116,12,143,224,154,165,205,66,239,192,69,86,82,36,87,116,241,168,20,36,77,74,227,177,164,185,160,138,81,2,167,104,208,140,80,15,1,223,230,246,70,167,162,31,83,2,57,234,201,67,84,96,196,48,178,4,136,131,112,255,67,34,69,139,165,164,153,103,72,197,34,124,107,21,115,103,67,34,227,167,118,142,87,179,255,239,223,61,214,176,56,31,66,2,201,184,221,166,237,58,236,173,216,231,144,110,72,192,81,2,131,108,170,148,58,37,1,107,224,190,155,21,219,238,66,2,201,184,221,166,237,58,202,160,204,30,128,157,32,161,65,2,129,110,168,150,56,39,1,216,255,211,196,14,104,147,65,2,133,114,172,154,60,43,1,64,116,209,48,83,139,168,66,2,201,184,221,166,237,58,36,160,2,32,33,200,46,166,66,2,197,53,212,100,241,28,17,226,69,49,74,145,32,214,65,2,145,122,168,150,56,39,1,4,155,125,53,29,136,69,82,196,220,232,48,243,225,20,77,155,90,5,198,255,183,63,81,2,141,110,180,150,58,43,65,141,5,126,137,211,104,109,82,196,214,238,62,227,1,218,219,239,83,229,40,82,132,136,35,72,0,195,206,88,46,118,247,251,251,136,64,68,76,86,67,176,22,140,19,127,85,118,167,76,139,59,238,26,112,164,51,168,86,149,251,208,244,128,22,74,250,0,37,140,155,252,83,2,137,55,62,121,190,174,21,247,118,115,87,112,55,6,67,2,241,167,126,108,13,40,231,194,253,156,86,211,29,150,67,36,177,210,220,24,157,16,66,245,28,77,23,26,165,153,83,2,177,185,231,54,16,2,143,0,143,8,58,15,180,189,83,8,9,140,207,254,111,93,127,142,88,165,14,27,35,70,82,2,79,136,3,53,82,65,44,129,14,70,69,140,147,9,83,194,10,135,7,81,213,212,2,125,41,44,167,26,74,221,83,2,207,71,127,125,103,159,182,207,22,231,58,118,7,160,83,2,189,234,203,63,96,196,86,82,186,205,237,27,242,123,67,2,233,166,174,242,75,25,180,229,12,132,179,25,188,188,81,240,56,108,68,77,117,19,73,87,51,81,88,141,162,51,65,170,6,236,255,251,150,178,116,211,6,136,173,56,163,255,83,2,251,208,38,35,231,149,176,78,218,111,180,248,79,0,83,48,134,198,157,75,93,166,219,42,80,15,223,235,177,63,67,2,109,102,118,222,11,109,2,58,175,67,188,81,115,212,83,194,142,151,22,177,62,26,144,170,115,126,222,47,108,201,67,194,192,179,169,121,65,180,5,197,93,158,91,185,25,31,67,194,170,165,153,183,65,6,19,150,143,255,249,109,26,26,83,194,174,179,54,151,144,180,171,92,156,169,149,217,102,31,66,2,35,67,46,167,155,22,51,123,227,49,226,25,89,5,67,194,182,177,167,201,65,152,98,130,140,23,103,204,89,107,83,194,178,54,186,95,96,44,107,79,117,255,173,121,199,90,83,194,178,183,186,31,181,12,80,182,142,61,200,124,68,24,83,194,170,174,178,153,86,249,194,105,154,144,175,236,199,173,67,194,166,159,153,199,1,181,195,190,31,238,174,11,43,21,67,194,176,167,161,203,65,57,220,40,239,154,237,192,78,114,82,34,223,237,232,181,37,101,239,208,159,1,125,7,183,222,83,194,170,47,179,139,43,248,86,83,237,195,175,161,80,136, +83,232,29,108,88,22,199,56,142,142,206,172,108,255,6,28,66,234,142,164,91,189,42,158,240,129,107,82,26,1,206,159,82,2,103,134,10,21,217,64,152,114,230,106,233,38,84,183,83,232,4,236,126,94,195,52,207,78,62,164,237,105,151,15,83,194,206,211,74,141,156,238,129,216,173,32,158,46,88,235,83,194,134,6,131,171,204,223,207,177,12,8,33,10,0,33,82,34,173,5,186,200,39,81,46,212,157,42,154,212,129,30,82,34,241,107,107,193,47,249,176,195,214,32,227,207,204,237,66,36,49,134,152,16,206,80,109,110,59,78,57,70,183,237,81,2,97,67,89,61,109,85,65,105,185,21,55,27,180,89,83,0,107,93,99,85,119,105,1,0,145,169,24,169,213,104,82,196,114,109,119,243,113,159,95,236,247,114,118,114,247,91,82,36,153,94,253,191,48,151,206,169,52,137,88,250,95,106,66,2,203,211,79,43,227,82,147,102,105,6,105,153,147,243,82,34,245,67,124,228,15,233,63,87,206,135,248,47,50,52,82,194,134,129,139,167,1,196,103,205,172,57,182,126,95,3,66,2,55,227,63,247,155,87,126,49,93,86,227,10,233,138,66,2,55,211,59,171,155,20,100,110,172,162,203,42,224,46,83,194,182,187,50,33,121,166,24,175,223,51,248,80,131,6,83,194,50,55,55,99,209,67,84,188,12,202,199,34,66,124,67,2,107,110,222,106,17,255,170,205,179,151,238,29,152,113,82,2,159,248,153,242,96,201,253,190,12,122,99,239,221,133,66,2,55,227,195,245,223,55,97,241,30,179,154,159,112,225,82,2,231,152,138,250,242,120,103,60,167,26,222,151,38,243,82,200,24,44,103,63,182,158,106,41,79,196,210,34,203,222,67,2,95,201,133,222,141,77,205,190,174,158,126,31,216,237,65,42,35,172,123,246,158,183,172,121,189,131,215,10,168,27,67,34,169,250,193,55,27,53,156,155,42,125,207,187,9,104,66,36,33,138,236,82,219,152,145,223,0,245,90,85,85,95,223,73,26,117,69,91,54,155,21,112,211,149,67,157,27,88,223,37,153,112,241,189,152,63,152,55,96,110,201,14,145,37,67,194,84,81,103,221,65,184,109,15,94,66,251,174,94,241,67,168,18,108,42,189,218,163,209,237,28,174,62,209,245,210,83,72,134,65,69,133,109,202,232,75,23,22,40,128,6,182,82,176,72,140,210,75,155,139,83,45,104,229,39,157,117,19,51,36,151,149,57,167,146,202,114,21,26,138,172,189,186,255,175,201,147,233,25,171,59,140,19,151,81,43,82,74,14,57,82,36,145,201,126,172,112,43,113,209,80,239,226,169,181,120,82,196,88,83,99,235,49,155,82,169,142,201,248,176,166,4,67,2,205,227,100,92,78,76,153,119,98,140,47,49,0,233,66,72,154,225,212,159,239,94,67,206,76,70,234,5,29,95,207,137,147,137,189,228,165,239,212,159,175,30,1,6,87,144,83,2,107,160,228,54,106,158,13,121,62,24,65,139,9,70,189,39,149,45,116,15,112,146,123,179,223,80,181,139,220,235,67,2,157,49,58,185,152,0,80,67,128,184,1,96,159,0,66,36,205,1,82,193,160,133,89,72,145,213,17,89,149,127,223,5,147,168,177,46,16,235,211,46,79,27,199,235,7,52,67,2,153,22,130,183,91,23,16,222,159,82,222,125,178,229,83,168,96,44,113,78,217,166,187,221,189,197,84,4,79,2,83,2,13,68,178,93,24,96,82,36,64,185,121,242,107,171,67,2,65,164,132,108,82,35,20,179,11,178,185,13,209,148,82,2,249,14,79,30,239,132,129,10,163,76,68,208,9,49,82,232,4,12,71,119,150,104,211,159,47,4,52,84,30,58,67,2,199,168,156,238,81,176,169,8,73,142,164,2,69,24,66,196,222,238,58,233,1,128,77,212,5,80,153,144,185,39,82,196,218,238,58,237,49,200,78,64,196,214,84,42,131,6,50,4,123,106,170,154,54,43,1,233,238,58,167,166,129,91,65,2,137,112,170,152,56,41,1,64,22,0,116,178,78,121,65,2,131,112,170,152,58,41,1,40,47,52,233,22,217,96,83,0,119,108,170,154,54,41,1,0,18,13,70,178,19,251, +82,36,93,118,177,120,66,100,94,160,54,208,171,128,21,144,65,2,135,116,174,156,62,45,1,72,6,155,109,2,91,128,65,2,135,116,174,156,62,45,1,8,174,137,122,187,253,99,67,34,81,138,158,46,90,129,17,242,17,232,92,66,185,253,66,2,209,184,229,166,233,58,172,17,140,240,2,146,42,138,82,34,47,242,86,106,53,88,3,163,68,198,179,76,122,26,33,138,19,140,251,115,57,231,248,175,78,210,76,115,222,87,51,36,75,237,213,38,29,180,11,0,139,101,75,95,44,73,82,34,55,216,89,43,149,104,50,198,206,44,247,101,221,159,67,34,73,140,221,34,29,58,251,191,78,194,234,75,78,107,174,39,75,75,229,34,93,161,78,74,227,2,44,109,134,127,67,34,201,106,213,36,91,191,154,174,245,180,41,113,248,196,66,136,142,201,65,221,35,241,244,29,85,81,220,165,43,0,82,34,119,186,89,43,149,168,153,76,188,108,184,73,70,26,66,2,73,61,97,232,235,89,45,36,206,196,102,2,34,138,95,105,133,233,187,210,174,17,193,106,197,158,92,95,36,221,67,34,201,170,181,162,26,188,241,242,94,89,139,247,235,198,66,2,197,180,217,164,239,59,21,124,90,182,14,74,181,108,81,2,143,114,182,154,70,43,1,96,160,187,184,247,111,207,65,2,143,124,182,164,70,53,1,216,18,137,85,226,2,74,66,2,197,180,217,164,175,59,144,154,98,225,226,25,145,89,66,232,198,233,52,221,21,89,100,134,138,76,253,251,224,247,82,2,137,67,180,0,13,201,2,134,235,66,121,7,126,19,19,80,66,135,59,74,91,233,107,185,223,94,146,44,245,110,66,232,132,233,242,221,148,235,178,221,149,89,7,37,214,180,83,2,63,234,169,67,128,182,143,194,191,80,237,143,0,206,82,2,209,60,133,107,101,128,41,20,132,92,222,33,26,157,81,168,18,213,23,172,194,49,170,143,171,22,4,167,40,2,67,232,14,85,35,182,108,184,16,195,1,169,145,198,94,90,83,168,0,53,230,56,82,85,179,2,216,159,143,123,176,131,33,10,137,193,43,146,239,27,53,158,22,82,70,51,205,219,67,2,241,240,6,245,146,136,199,106,221,12,146,155,49,30,67,72,0,149,231,110,254,250,214,205,1,27,10,225,178,148,82,2,29,100,217,180,67,129,82,109,206,159,99,127,244,95,67,2,119,98,71,252,137,76,248,82,182,72,201,0,110,64,83,168,18,76,197,248,155,178,24,184,135,42,231,216,235,174,66,232,133,161,212,85,46,108,189,35,206,89,213,216,248,6,35,168,18,43,86,141,179,57,140,135,241,133,104,51,168,104,67,2,191,190,227,181,93,1,32,221,80,121,102,180,251,133,66,106,139,178,234,125,43,17,113,117,8,191,186,55,242,179,67,2,237,77,246,218,12,230,218,114,191,87,75,136,8,48,82,2,143,185,198,59,107,165,46,240,149,3,57,162,77,143,81,10,9,12,198,217,238,181,83,4,158,168,21,52,89,171,81,42,252,228,115,254,187,229,161,184,15,97,229,156,117,177,67,16,189,138,193,248,223,124,48,66,162,56,12,173,27,240,67,144,147,42,41,151,103,85,139,109,162,103,17,211,10,35,83,136,25,131,96,210,102,90,119,131,144,84,128,232,161,124,83,2,233,168,165,46,4,241,134,16,100,2,80,56,34,33,67,2,229,5,94,96,138,135,2,123,239,202,57,121,162,222,34,120,246,218,253,42,95,8,251,246,230,43,162,5,250,64,67,194,162,153,139,125,129,113,13,78,175,51,252,235,178,214,83,194,38,43,179,111,123,230,58,102,11,222,181,12,221,154,67,194,162,155,145,149,65,124,190,159,47,4,75,89,124,110,67,194,168,157,149,171,65,51,223,158,115,177,185,192,234,232,82,36,151,218,191,190,178,104,105,209,82,73,145,126,173,74,83,194,42,174,51,151,41,169,208,135,157,39,226,148,252,6,67,34,91,26,157,203,88,146,231,183,5,83,30,20,186,150,67,208,222,36,121,149,151,179,94,12,8,93,31,50,200,36,65,234,22,44,12,99,49,231,224,230,8,117,234,140,102,132,65,170,0,44,136,66,93,143,99,0,174,114,160,177,1,118, +82,240,22,44,169,119,241,189,124,78,43,121,54,99,64,203,83,2,247,217,135,51,95,65,81,99,74,186,7,8,156,147,65,74,1,172,235,183,27,230,96,155,216,193,220,24,72,157,83,2,61,241,229,55,81,70,116,59,7,239,32,112,37,192,83,168,3,44,18,70,211,234,188,22,74,17,184,120,155,124,83,2,115,185,6,51,65,135,15,242,124,102,255,189,238,126,82,2,163,134,87,125,98,168,2,131,66,230,200,0,136,81,83,2,247,209,104,51,16,208,82,93,40,179,151,81,106,109,65,42,14,236,186,78,165,53,46,16,137,17,1,179,88,50,67,232,142,169,117,198,234,206,1,83,1,44,230,150,20,191,83,2,125,241,197,39,255,79,216,183,4,37,133,154,115,30,82,196,112,107,117,229,241,116,179,4,218,78,240,233,43,77,35,40,31,81,150,213,246,223,118,22,183,158,12,149,157,154,222,45,142,50,149,103,131,186,38,114,129,220,88,186,26,188,83,194,50,50,175,147,16,83,77,40,64,140,99,202,56,198,66,2,203,211,79,43,227,82,240,195,48,255,156,147,157,57,82,34,185,101,173,232,15,33,24,84,180,220,88,127,57,212,83,0,103,89,95,81,115,101,1,0,72,236,183,94,74,167,83,168,18,44,147,38,243,60,205,102,71,251,222,16,29,210,67,136,19,140,187,237,238,199,225,241,156,64,73,73,141,148,83,194,178,55,46,147,71,9,234,35,103,42,179,90,0,212,205,199,182,218,110,157,234,94,179,190,3,237,182,94,51,173,83,200,7,236,156,92,163,36,203,70,150,40,72,60,241,168,65,234,52,44,221,115,113,147,123,56,132,81,220,138,106,95,82,104,139,193,75,87,239,88,177,54,7,65,12,180,223,123,67,240,16,140,113,91,230,252,206,93,131,119,40,231,192,17,67,2,247,100,87,122,76,29,221,178,87,65,104,3,162,3,83,2,59,233,229,47,175,0,60,32,64,154,73,105,156,243,67,2,47,191,234,181,31,241,136,161,248,38,65,166,13,16,67,2,127,211,31,121,147,49,102,198,13,166,85,17,24,132,83,2,109,170,201,54,121,238,159,66,88,60,199,140,100,243,65,234,17,108,219,114,158,183,172,251,53,178,99,204,162,141,67,200,6,67,114,196,178,159,103,239,32,170,65,179,129,175,81,42,110,108,78,43,43,181,18,164,191,20,42,58,218,168,66,48,11,172,170,109,111,173,25,198,250,7,24,110,111,212,67,2,21,215,113,43,24,85,252,57,183,105,236,9,235,7,67,2,85,66,69,96,11,4,97,31,156,222,155,121,179,221,67,2,145,126,233,165,95,3,101,184,201,66,157,98,94,64,67,2,247,114,31,121,84,32,224,35,148,38,80,17,77,181,66,2,43,227,47,53,149,23,92,71,136,245,8,128,68,132,82,34,101,105,247,132,31,240,110,232,102,250,91,121,239,150,83,194,78,211,198,139,94,17,184,12,65,213,8,197,148,112,82,196,86,79,99,237,1,2,128,73,243,215,104,186,22,148,66,136,222,73,95,50,52,129,14,58,49,81,233,226,71,156,83,2,169,160,229,54,123,159,173,198,62,64,141,141,0,9,207,5,223,222,95,177,231,53,236,130,212,43,129,81,21,48,51,40,202,41,193,4,213,164,132,22,220,16,195,251,0,53,223,73,154,225,5,72,232,18,35,5,175,20,172,225,222,237,66,136,9,21,163,248,65,146,65,178,35,79,109,109,191,132,223,137,142,73,182,9,178,161,165,158,235,128,78,104,131,213,81,2,35,20,90,76,242,220,64,187,115,54,210,244,75,214,82,2,89,90,216,171,93,152,153,32,34,162,7,140,85,35,82,2,187,192,28,93,114,36,2,96,246,132,51,205,76,79,66,232,198,137,147,94,93,194,144,94,154,82,255,250,248,211,67,2,25,242,57,51,24,138,64,148,128,104,218,72,106,229,67,2,207,136,181,248,18,117,18,194,43,139,80,86,4,0,82,36,23,244,106,104,242,30,96,117,37,18,145,20,8,0,67,2,221,70,166,248,146,171,0,209,139,146,204,7,85,179,66,200,152,161,51,213,77,183,102,147,212,65,248,71,184,96,51,36,71,106,205,162,28,160,100,45,178,100,253,150,176,89, +82,196,224,246,66,219,49,60,147,231,129,166,6,52,43,5,82,36,87,254,42,102,116,132,66,99,129,159,112,146,110,10,51,36,195,235,149,32,93,209,150,200,191,3,200,141,45,83,81,232,59,242,235,214,205,233,57,174,228,28,144,103,46,73,82,34,59,152,200,42,39,164,215,108,77,75,234,79,92,51,82,40,0,12,207,255,85,104,247,143,41,10,97,0,154,218,67,34,77,235,189,166,27,138,199,226,116,5,7,187,60,255,82,8,3,76,199,231,61,136,227,143,45,234,94,151,74,73,67,34,201,171,205,36,156,138,49,73,5,20,242,48,92,166,51,2,151,118,190,158,78,47,225,28,96,90,96,134,16,0,81,2,141,118,180,158,68,47,65,4,22,146,23,240,65,120,81,2,147,114,186,162,74,49,65,144,208,13,240,0,40,34,65,2,133,116,172,152,60,43,1,208,226,64,117,7,143,128,81,2,137,114,176,154,64,43,1,145,145,37,50,213,76,102,65,2,137,118,176,158,64,47,1,36,62,125,77,130,154,240,66,2,205,188,225,168,235,57,68,78,24,9,188,129,25,194,65,2,139,120,178,160,66,49,1,224,89,156,96,149,5,254,81,2,139,116,178,156,66,45,1,100,10,199,218,178,159,238,65,2,133,114,172,154,60,43,1,184,32,93,229,29,5,189,67,34,77,234,173,40,154,177,166,140,140,183,174,96,128,249,67,34,197,107,197,160,91,125,182,113,67,203,109,39,174,254,66,2,197,180,217,164,239,59,46,97,145,57,158,80,166,234,66,2,201,8,220,206,45,57,224,63,84,59,123,51,63,187,83,136,19,204,251,237,175,60,185,46,219,214,110,70,54,96,67,2,117,0,55,116,13,0,49,96,72,129,80,92,72,147,66,80,47,197,232,159,230,196,105,73,220,137,19,18,52,206,67,2,121,71,111,248,139,179,156,135,35,188,8,247,38,6,222,57,76,172,84,108,70,125,40,188,189,95,178,29,125,42,66,2,163,209,159,230,71,61,160,108,34,50,38,249,236,119,67,2,65,230,107,206,76,128,132,2,77,164,17,25,61,204,207,177,102,204,255,197,234,181,8,198,249,13,194,201,48,85,67,168,7,149,54,111,49,210,21,223,66,92,76,88,67,224,65,10,1,44,28,34,175,25,247,161,95,68,181,49,130,140,82,136,153,105,228,24,57,178,70,77,20,200,162,68,29,31,82,2,71,145,98,54,86,49,88,122,79,211,169,38,84,181,82,196,230,231,235,237,145,41,217,122,215,101,72,126,161,238,67,2,251,114,23,249,142,85,191,254,43,4,143,147,168,148,67,194,206,193,183,23,129,239,172,89,147,102,61,28,227,75,67,2,245,20,7,99,78,255,222,173,44,15,103,117,25,151,67,2,249,178,254,228,141,167,150,181,200,127,162,234,23,232,83,2,251,220,15,59,195,11,184,147,79,119,214,88,29,32,67,2,251,244,22,95,15,223,98,208,65,97,218,34,31,10,82,2,139,143,181,246,100,176,190,37,80,122,208,191,215,108,83,136,31,108,187,111,231,242,56,214,250,157,22,239,9,74,82,2,83,134,6,17,81,229,220,56,181,55,70,84,17,104,83,194,158,42,50,188,29,172,245,202,108,247,140,76,48,11,67,2,113,165,118,228,73,76,137,82,162,116,138,27,84,50,65,42,2,108,91,210,139,81,246,114,244,136,76,230,239,217,83,2,55,209,69,43,231,220,115,78,97,251,68,176,12,66,83,72,28,172,120,29,175,227,188,205,239,255,126,141,164,23,82,34,103,237,190,245,55,113,248,212,44,181,22,170,130,246,83,194,38,42,179,159,222,213,10,64,152,76,135,31,108,140,83,194,46,55,187,155,59,8,247,175,135,182,141,20,107,60,33,74,6,236,113,54,79,127,196,167,78,0,80,105,66,187,67,136,19,99,43,173,172,119,219,115,162,88,252,214,21,218,83,2,251,209,39,55,208,157,3,120,31,170,143,182,215,154,83,2,247,192,37,51,20,3,36,9,70,59,37,177,247,127,67,2,233,66,54,228,10,206,153,15,35,14,244,51,128,40,83,112,225,166,247,61,68,253,213,42,175,15,176,136,205,124,83,2,125,241,199,51,45,48,184,215,201,187,222,191,246,92, +83,2,251,240,196,47,233,255,247,254,223,227,95,182,186,7,83,2,57,233,228,43,195,96,211,129,166,140,206,0,230,223,82,2,203,146,81,22,106,129,68,203,8,21,33,38,69,13,65,74,45,108,30,66,187,183,76,167,81,140,117,240,198,136,66,138,131,228,138,189,43,143,158,189,32,114,28,0,55,198,67,2,251,164,87,126,137,76,26,18,23,104,55,252,84,203,83,194,2,15,130,174,24,246,175,106,233,110,222,18,92,155,83,2,251,225,199,47,38,4,63,176,113,111,34,226,27,68,83,2,177,192,98,39,215,83,231,41,251,22,239,11,244,247,83,2,189,242,233,51,218,205,134,168,183,30,133,242,2,244,82,2,203,178,82,30,96,80,31,131,86,140,193,233,177,151,83,2,59,242,232,51,96,6,145,238,45,239,188,245,222,243,83,194,146,18,143,166,103,92,247,143,6,37,171,152,107,251,83,2,253,241,232,47,216,191,7,206,253,229,189,55,223,219,83,2,123,233,197,35,255,253,253,255,51,255,101,176,23,141,83,194,26,31,26,165,146,195,39,37,113,82,11,33,180,177,83,0,99,83,93,79,113,99,1,0,216,236,120,89,156,205,83,194,142,142,7,156,63,131,212,172,255,165,180,87,75,46,82,40,31,172,162,106,146,113,62,45,41,122,210,103,211,142,67,194,118,115,129,143,129,86,109,84,235,86,141,87,131,182,82,232,5,108,181,61,61,52,42,27,57,170,69,211,53,131,82,196,108,103,115,241,81,26,137,6,228,122,126,14,154,92,35,72,1,17,215,86,247,158,118,22,23,159,136,190,245,90,223,37,179,254,250,185,157,205,191,55,113,255,109,93,231,49,66,2,203,64,79,156,97,87,119,119,247,119,117,127,208,127,81,2,103,89,97,85,117,105,129,219,111,254,92,213,177,52,83,0,119,99,99,85,115,103,1,0,182,148,134,110,93,116,82,80,187,230,206,207,56,166,112,179,191,72,21,211,196,126,83,194,166,47,167,127,17,176,146,65,174,165,180,81,107,31,67,194,144,131,141,159,65,247,127,245,89,219,143,87,4,147,81,240,15,12,118,223,155,101,95,94,77,85,28,63,12,99,67,232,59,44,12,30,203,195,223,239,156,32,187,129,43,104,83,2,43,161,228,46,200,141,235,207,185,49,213,19,114,200,81,140,25,235,6,135,69,117,19,154,71,39,53,140,133,81,83,136,3,67,26,178,246,222,247,135,80,232,29,119,16,142,83,2,229,136,163,38,69,106,90,74,200,177,249,2,94,85,83,2,119,226,201,51,94,33,224,114,16,229,127,219,88,235,66,144,32,236,190,253,121,246,43,231,126,9,28,52,212,97,83,2,107,162,231,46,18,234,208,51,224,107,38,182,246,26,82,196,70,67,85,239,129,189,146,102,94,66,153,22,25,185,35,4,103,107,107,183,235,87,3,0,254,237,165,151,212,219,67,232,4,108,10,165,218,167,82,235,29,101,239,105,94,196,66,2,227,111,231,185,169,54,70,243,6,18,234,72,154,102,67,72,8,140,58,189,230,163,80,235,30,62,237,155,206,119,82,136,94,108,189,245,60,184,110,73,57,166,208,122,121,220,51,2,73,33,61,17,103,73,161,148,181,192,122,53,99,224,82,34,33,7,246,136,23,65,38,145,140,198,249,221,79,207,207,5,95,222,95,115,233,181,42,132,82,207,90,106,133,168,66,104,6,81,21,21,246,94,114,82,244,159,167,111,21,255,51,36,163,221,209,53,158,18,96,197,48,73,81,154,210,211,1,42,2,245,90,205,230,83,254,148,223,244,44,148,240,71,67,2,75,193,68,90,13,78,136,134,166,140,208,113,69,56,81,44,14,12,83,252,228,156,39,64,197,142,135,128,205,221,82,136,159,193,33,23,231,116,201,163,23,217,87,249,53,180,67,2,207,193,76,88,77,176,157,1,148,133,33,34,4,8,207,5,45,201,64,234,50,29,121,99,46,189,255,221,160,222,82,2,89,60,232,171,93,25,152,3,97,102,151,4,84,46,50,4,127,138,166,152,224,246,128,33,230,201,108,115,95,71,34,168,162,9,67,66,131,54,34,44,132,12,89,252,244,75,83,2,205,70,188,121,86,34,16,172,102,59,59,83,110,247, +83,2,107,186,139,75,179,89,76,204,47,8,146,5,32,68,67,2,25,21,114,181,153,2,65,190,132,248,70,8,234,113,67,2,91,72,182,116,82,31,5,115,203,146,28,47,196,147,82,36,115,173,40,168,80,26,112,64,147,30,145,94,164,155,82,196,238,254,76,203,1,94,14,154,187,232,164,36,27,4,83,72,26,117,207,156,171,183,168,67,138,47,17,100,78,36,82,34,175,240,71,42,167,152,205,248,234,106,187,223,138,107,67,34,197,140,205,30,93,1,114,199,13,145,179,222,149,135,81,2,141,118,180,158,68,47,65,196,52,127,147,158,184,112,65,2,129,108,166,148,54,37,1,196,209,219,104,167,235,243,51,36,193,173,205,30,93,18,209,101,214,255,201,219,38,201,81,2,133,110,178,158,62,41,129,250,86,176,16,217,110,247,81,2,135,110,182,162,64,43,1,33,14,167,92,244,227,72,34,4,123,114,170,166,50,47,1,0,41,34,109,0,5,0,81,2,137,116,176,156,64,43,1,96,36,34,150,36,201,248,83,0,133,118,172,158,60,47,1,0,232,181,216,143,84,91,65,2,129,110,168,150,56,39,1,64,214,139,99,211,199,190,50,168,48,145,205,110,115,222,13,143,19,30,232,226,58,209,82,34,189,218,75,235,22,97,59,117,198,66,218,153,48,179,66,2,69,181,89,164,239,59,204,230,226,33,178,70,233,40,67,34,73,172,197,162,156,120,86,210,15,113,182,132,148,25,66,2,49,237,57,60,242,88,128,114,136,125,16,191,242,119,82,176,22,204,160,70,221,155,82,235,190,96,251,152,102,185,207,17,49,204,253,253,86,196,122,206,59,27,240,17,222,215,33,170,0,117,24,226,43,50,41,153,7,106,187,88,176,37,83,2,57,226,234,51,16,96,204,185,106,146,229,35,84,61,67,2,79,201,228,210,12,139,78,216,254,239,156,149,182,212,66,112,135,76,181,209,83,197,81,19,197,161,86,45,11,209,65,74,8,236,255,214,218,186,125,128,114,7,140,170,211,216,83,2,35,137,134,50,152,112,134,25,10,4,235,79,87,127,82,176,14,76,82,43,229,148,180,189,88,49,126,248,205,31,65,10,1,108,203,146,175,184,55,167,99,73,15,19,9,166,66,138,142,228,76,247,185,143,144,118,73,12,191,106,119,91,67,2,91,205,237,206,10,55,19,149,196,209,132,190,142,193,83,194,62,194,210,181,169,0,99,155,18,217,27,49,43,247,67,2,125,118,79,121,146,155,4,174,127,255,206,184,79,135,66,2,19,55,38,161,155,87,24,21,24,51,5,247,186,247,66,2,139,214,159,49,27,31,126,64,101,36,169,82,228,51,67,194,164,147,113,51,129,247,241,141,255,158,44,149,160,174,66,2,155,211,166,173,227,94,243,193,21,1,89,115,187,222,66,2,151,207,47,239,231,95,228,4,129,36,63,198,61,237,67,2,229,19,38,79,14,128,172,98,89,223,156,139,103,76,82,2,139,222,84,251,82,113,228,232,200,105,229,195,125,121,67,2,181,253,186,45,155,133,254,161,53,31,201,45,115,245,83,194,22,162,166,190,99,173,53,251,155,107,78,48,220,138,65,42,35,172,190,78,89,143,107,218,98,176,13,129,199,166,82,2,207,143,181,210,94,1,168,221,223,31,235,122,84,198,83,8,29,172,124,157,177,242,56,77,54,109,226,9,136,1,67,2,115,182,62,99,17,184,202,226,226,102,189,121,39,214,67,2,243,182,70,227,81,245,114,175,248,171,55,123,12,190,67,2,109,21,46,87,15,112,237,231,99,29,118,55,243,109,82,2,79,177,246,22,247,184,7,98,159,172,49,238,251,158,67,2,111,52,30,221,143,3,115,124,13,109,61,217,227,222,67,2,243,148,46,95,79,246,111,176,0,96,34,168,59,121,82,136,3,44,171,59,116,148,217,232,44,160,139,75,229,17,67,2,109,85,38,95,80,204,109,119,99,116,52,134,193,0,83,194,50,58,194,89,123,247,145,198,28,64,199,41,76,27,83,194,182,59,190,101,46,215,1,218,60,190,141,31,214,252,83,194,178,62,67,151,171,218,188,173,128,47,32,177,26,201,83,104,149,50,58,185,24,157,215,24,20,224,153,123,192,30, +81,136,31,227,119,17,126,166,179,172,22,188,167,165,72,81,82,34,109,101,122,192,31,65,252,215,253,32,83,21,108,230,51,36,173,254,218,189,156,137,36,90,140,107,219,255,247,188,67,2,107,165,86,244,74,93,187,201,184,55,81,3,28,60,67,2,247,105,151,252,15,120,81,63,122,74,40,121,34,100,66,40,202,201,9,230,179,239,162,159,238,22,3,167,92,88,83,2,189,233,199,47,53,164,82,45,180,59,75,244,223,176,67,2,33,255,241,167,95,76,233,51,234,200,44,76,23,218,81,138,157,114,50,13,167,51,6,68,40,64,68,5,197,73,81,16,95,12,191,237,219,117,223,30,118,95,30,242,90,77,83,40,0,236,152,220,163,44,75,165,204,171,119,223,150,1,67,2,223,203,173,226,141,230,211,56,171,6,186,211,3,137,67,2,115,8,135,120,138,186,171,82,145,199,148,238,1,142,83,232,4,172,215,231,187,52,63,102,72,30,96,161,215,246,67,2,225,231,117,102,10,69,10,131,119,85,117,121,2,106,67,2,113,36,87,252,137,129,218,160,243,36,236,60,99,108,67,2,249,131,79,252,73,204,111,82,166,79,24,9,38,3,81,234,227,100,121,14,131,248,161,25,194,100,240,34,81,161,67,2,229,10,166,226,77,214,161,187,125,86,154,243,54,198,83,194,2,6,3,167,8,11,13,56,26,80,230,3,161,63,82,34,191,43,127,245,37,133,225,41,80,46,144,144,153,90,83,194,190,66,190,145,72,239,33,237,145,238,89,25,91,102,67,200,24,44,236,245,194,183,89,110,94,81,147,20,48,188,66,194,104,101,109,235,1,0,85,235,243,137,215,203,142,153,82,196,108,105,113,245,49,172,168,253,151,186,102,32,151,82,66,36,241,198,244,49,254,16,155,0,1,165,6,250,165,8,223,37,51,254,210,59,158,175,105,125,54,217,237,206,158,165,82,196,110,107,117,247,113,191,138,0,100,129,244,222,171,202,222,9,43,241,182,86,23,127,55,246,214,30,120,61,37,143,222,5,95,101,97,89,127,109,129,224,130,158,168,79,190,246,223,37,53,62,211,61,156,241,223,130,238,138,240,91,206,181,67,232,70,44,236,253,222,183,91,49,91,82,108,27,11,17,223,41,137,65,84,98,15,30,172,180,20,241,223,168,169,89,51,136,159,161,34,139,116,99,158,117,169,21,144,173,129,205,223,241,22,3,103,4,109,117,107,149,19,138,22,127,169,15,82,4,115,209,138,95,229,190,150,61,133,101,103,48,41,195,66,152,83,140,200,28,47,95,45,119,115,19,190,206,136,45,82,4,109,16,11,157,99,23,72,106,158,0,168,2,0,177,67,2,167,32,67,78,141,138,243,32,169,35,107,73,163,65,67,2,75,35,76,214,11,244,21,245,7,104,106,157,161,191,82,2,175,154,142,94,105,240,61,31,113,88,55,80,85,7,83,72,11,236,245,173,89,76,115,45,184,199,251,65,85,128,81,74,26,236,189,41,233,180,80,146,81,61,133,148,87,163,67,72,26,108,73,92,126,165,207,170,93,55,172,215,49,148,66,2,223,111,231,251,229,54,10,38,136,17,68,172,98,68,82,2,107,174,219,17,81,241,176,173,248,64,109,250,196,189,223,37,175,89,162,189,153,63,104,37,146,36,146,177,72,88,83,0,55,41,39,25,95,81,1,0,0,157,165,249,210,138,66,2,95,235,103,185,231,85,98,6,121,166,151,77,197,201,67,194,76,67,97,167,65,238,8,179,43,228,27,243,46,206,83,194,82,215,78,139,202,101,111,172,51,33,113,244,154,85,81,2,81,59,69,47,97,75,129,255,116,165,169,215,126,117,82,36,213,25,71,42,66,24,132,163,32,198,141,178,43,7,51,40,2,113,173,229,156,180,110,73,75,250,16,142,84,175,66,36,101,7,140,47,251,144,151,151,151,39,89,133,221,110,50,136,159,161,97,186,147,87,252,19,143,45,4,244,54,94,66,2,227,21,102,216,39,59,179,255,84,123,0,182,8,64,82,196,82,73,95,225,73,250,222,224,246,167,247,237,61,203,67,2,205,163,84,88,77,68,137,51,166,60,44,17,80,149,223,41,14,11,4,198,193,93,54,46,252,249,228,231,222,253, +81,2,35,2,82,56,238,220,128,153,233,105,221,59,71,159,67,2,193,33,76,88,141,56,152,1,84,6,53,34,192,8,82,36,69,71,179,147,85,216,114,32,218,52,216,26,150,151,67,2,153,16,42,51,87,32,69,2,192,114,5,96,114,11,67,2,27,55,130,183,92,17,17,223,89,202,218,191,162,190,223,137,31,35,153,24,235,10,29,72,187,233,37,41,255,227,83,2,139,60,148,101,20,0,216,21,4,115,70,250,71,141,83,2,33,154,106,75,121,123,10,212,27,4,177,143,137,85,51,36,109,6,79,20,147,240,71,145,43,101,219,38,33,16,67,136,14,181,107,163,228,194,213,229,66,25,182,237,84,132,82,2,127,146,77,186,236,144,113,56,70,44,196,4,1,17,82,36,27,110,251,118,66,33,176,6,225,32,132,14,17,58,223,37,71,76,221,28,29,130,249,147,73,39,117,178,157,202,35,232,4,241,142,111,179,252,141,46,115,158,193,172,46,132,66,36,123,249,117,46,70,137,19,229,43,15,245,165,245,34,83,0,131,116,166,152,42,29,1,0,43,19,58,130,28,219,65,2,141,120,176,150,52,35,1,24,22,218,81,242,78,8,82,2,229,64,219,116,99,1,233,40,21,25,167,226,103,236,66,168,7,213,130,112,87,75,64,146,141,11,246,60,207,223,66,2,201,5,217,14,109,57,224,219,180,221,221,221,215,221,51,168,146,129,164,178,18,172,228,150,205,112,208,96,68,251,67,2,11,251,184,155,93,160,136,227,36,171,220,226,243,64,82,72,6,112,44,210,142,107,101,42,183,232,43,10,111,10,67,2,211,192,53,236,71,17,64,111,65,20,208,57,20,68,83,136,8,140,251,186,23,198,117,174,85,156,139,244,15,56,65,10,3,140,115,253,193,188,247,233,16,91,5,159,204,212,50,16,27,204,249,223,193,93,190,242,223,91,48,36,207,31,83,40,75,140,251,58,25,247,249,84,234,87,223,192,66,244,81,106,38,236,197,8,219,139,148,9,45,251,186,145,23,209,83,2,235,177,170,46,185,35,22,146,149,183,116,191,65,20,67,2,77,207,253,198,75,71,102,165,203,249,70,200,136,96,66,176,61,204,252,247,126,237,95,238,243,5,192,225,86,55,67,2,229,45,254,208,75,29,115,213,27,242,232,165,47,25,65,170,7,108,89,250,209,155,47,25,187,162,16,254,171,48,82,2,27,187,167,119,233,132,117,69,128,255,72,182,43,212,66,2,39,239,179,55,41,91,231,57,47,228,9,132,170,68,67,2,117,179,30,223,77,70,173,188,63,222,119,102,251,2,67,2,247,179,46,223,14,56,70,214,26,218,111,207,127,124,65,10,1,44,201,246,93,175,243,147,15,50,45,20,159,172,67,2,231,239,229,218,76,224,137,120,55,102,157,23,255,112,67,194,118,109,71,15,129,222,250,189,58,208,127,110,215,131,66,2,11,203,27,103,229,30,150,165,189,45,215,78,29,4,82,34,223,171,106,65,63,232,214,176,172,5,103,24,79,219,83,40,34,236,152,237,227,243,92,140,206,178,15,242,189,201,82,2,79,141,230,25,101,48,2,134,197,44,243,151,221,114,66,144,32,108,44,61,157,165,143,179,63,25,179,197,110,137,67,232,4,163,36,151,117,124,218,101,96,131,9,189,63,58,67,136,8,108,109,254,186,211,228,111,93,44,101,186,103,149,67,194,158,137,113,151,129,55,252,94,216,199,207,147,94,50,67,2,237,87,70,89,145,212,2,222,223,101,87,253,63,252,66,2,35,199,179,175,229,91,122,191,30,3,109,73,109,46,67,2,237,52,38,221,79,115,127,63,251,23,47,81,152,227,67,2,113,120,94,223,82,68,35,179,67,221,82,138,10,39,66,2,35,194,54,171,165,91,51,171,41,153,209,225,125,9,67,200,66,140,252,229,206,199,96,175,158,235,244,47,103,35,67,72,1,12,45,254,190,205,227,240,93,195,198,86,85,56,81,2,175,153,155,133,139,117,1,86,195,109,13,47,251,64,67,34,89,250,140,199,152,121,80,252,143,105,199,100,206,121,82,34,103,231,45,229,31,89,101,158,10,11,97,240,23,159,67,34,223,218,156,197,25,29,110,231,117,141,94,247,217,170, +67,34,51,27,171,189,157,211,239,46,111,135,230,187,201,177,82,36,245,1,207,126,242,30,5,73,21,121,69,172,53,47,82,196,100,97,111,243,65,102,74,237,133,253,92,26,148,235,81,2,87,79,83,75,111,99,65,195,200,128,94,132,26,80,34,232,198,233,226,45,126,235,45,81,3,189,91,105,140,23,82,36,209,31,255,126,114,126,115,53,78,37,41,84,57,0,66,36,233,195,210,17,207,152,151,151,153,187,42,183,221,134,82,36,249,153,199,126,116,233,3,254,28,165,222,236,60,217,83,200,24,44,149,103,177,227,60,148,80,43,246,112,2,63,33,198,182,91,47,158,75,105,162,172,229,216,7,224,188,187,51,136,159,65,26,121,168,91,120,97,23,213,117,85,15,253,67,2,225,194,85,98,78,144,204,160,165,156,141,145,50,212,83,2,185,232,227,51,127,51,244,12,192,9,98,140,33,161,83,2,119,225,198,55,152,133,28,168,242,203,19,248,175,5,67,2,243,99,87,126,10,204,85,208,65,83,161,152,68,134,67,2,123,168,111,124,11,248,153,46,162,228,170,81,39,253,65,202,24,44,30,35,91,203,235,50,47,225,64,17,140,126,83,2,63,249,228,35,192,222,199,247,123,245,190,119,234,220,83,2,211,79,127,125,227,189,186,202,132,171,51,16,162,242,67,2,229,14,198,96,17,207,216,59,42,206,107,43,107,2,67,2,223,171,165,226,77,110,171,180,66,110,202,243,54,158,67,2,123,77,191,250,14,31,224,157,255,212,231,254,95,115,81,10,131,242,80,79,58,63,4,156,231,91,182,49,113,227,83,2,57,210,72,59,32,214,41,218,42,165,245,92,102,142,67,2,125,102,119,250,12,6,80,221,200,121,111,223,191,231,67,2,243,131,111,252,12,100,63,16,178,64,89,104,58,232,83,194,2,7,7,167,80,162,37,64,250,68,220,3,237,249,83,72,79,172,92,204,215,116,201,198,40,255,19,94,147,164,51,196,104,101,111,239,129,142,146,41,223,107,17,219,247,133,83,194,182,59,54,149,48,108,77,85,112,90,105,163,165,210,66,136,14,177,118,246,22,191,54,118,54,159,184,26,25,29,67,194,106,103,113,185,129,68,189,19,182,78,35,58,174,135,66,2,199,211,70,107,223,19,198,200,104,46,6,161,95,38,51,8,3,113,180,52,60,88,42,31,47,232,85,248,151,133,67,194,120,115,129,151,129,79,205,32,178,86,141,219,46,198,82,232,198,201,111,223,30,15,53,42,14,176,148,179,70,145,223,3,57,130,69,128,141,148,113,238,153,255,205,80,45,16,67,194,116,113,123,213,1,86,238,158,191,226,255,23,106,99,83,8,29,236,253,236,247,243,58,141,34,148,154,95,115,132,66,208,44,140,231,127,183,246,152,156,179,19,199,25,11,225,66,2,221,140,233,14,47,25,47,217,72,18,128,41,228,1,67,2,231,6,118,236,76,189,203,211,150,3,159,198,20,34,67,136,25,12,236,5,211,191,221,50,149,234,208,172,197,153,83,232,29,53,198,156,165,139,4,7,130,4,72,35,216,25,67,2,83,71,77,218,75,109,141,181,62,181,231,25,8,223,82,2,239,172,203,24,227,16,48,10,35,21,56,38,83,165,67,104,78,208,67,197,206,154,63,109,22,165,117,158,107,71,83,2,39,154,197,46,132,185,88,41,239,239,71,112,239,203,67,2,87,203,148,92,141,70,124,136,231,244,227,57,243,2,82,2,47,206,29,89,201,96,247,15,134,219,67,49,196,50,83,2,169,154,200,50,175,82,120,206,83,103,175,127,206,190,66,2,99,243,231,253,233,88,29,127,147,161,17,1,181,205,66,2,99,242,103,61,169,88,0,93,89,81,94,93,223,149,82,196,76,67,91,229,105,55,59,230,111,250,109,91,130,191,67,194,72,67,89,229,65,165,134,178,140,101,12,151,237,63,66,2,91,235,227,119,165,54,136,12,172,12,38,129,161,33,82,196,78,73,91,239,17,84,122,197,118,250,243,166,125,191,66,2,227,239,231,121,169,55,160,213,10,186,235,234,145,219,66,2,99,107,235,249,169,86,100,3,101,113,87,54,213,215,50,4,59,49,47,33,91,85,129,203,182,21,105,220,169,55, +35,4,83,233,235,184,229,25,235,86,231,239,113,15,254,190,67,34,139,151,112,23,23,238,239,155,170,133,36,91,197,190,65,140,222,33,174,217,108,52,190,248,229,65,244,223,254,172,83,2,101,152,228,54,180,158,13,213,221,8,154,9,16,160,82,36,85,194,19,71,18,148,109,160,164,222,219,87,125,142,83,2,229,152,197,54,253,191,11,220,58,16,209,6,32,4,67,72,5,213,253,253,112,194,147,27,20,10,190,157,153,67,82,2,21,120,150,107,231,192,167,5,134,38,206,12,24,17,82,2,85,124,247,135,85,136,17,18,34,32,17,0,100,40,66,2,177,93,60,116,180,94,222,215,238,85,42,19,2,204,66,2,173,220,60,180,240,59,106,106,34,170,64,172,199,40,83,2,75,61,183,109,209,83,80,82,212,175,167,156,238,41,83,194,74,67,158,111,165,69,201,245,31,12,227,0,33,1,82,2,25,61,40,167,61,41,16,147,111,96,37,27,76,214,83,2,167,184,197,55,70,123,127,146,247,161,71,7,0,143,82,2,173,96,139,120,99,152,1,19,228,59,182,234,74,190,207,201,194,201,81,94,155,210,119,23,93,74,208,123,29,222,82,2,151,194,68,56,72,192,93,156,35,156,138,12,153,49,67,2,107,1,47,124,72,136,151,96,173,132,142,177,108,180,83,2,11,55,93,121,105,15,212,47,131,215,1,20,1,198,65,42,1,172,168,167,163,88,126,49,5,20,65,229,135,241,67,4,81,116,142,104,255,54,16,63,155,190,116,219,212,98,65,106,16,172,237,220,246,127,231,121,176,253,29,218,137,204,81,16,34,204,11,51,248,35,53,60,52,195,22,96,204,63,83,40,75,236,219,59,11,239,245,125,76,14,253,95,221,16,66,176,16,236,187,191,55,207,30,254,116,27,252,210,135,207,82,4,57,219,27,79,117,214,75,186,46,196,154,126,29,60,65,10,1,140,117,126,230,222,247,57,168,24,95,60,236,69,82,4,49,18,91,159,113,165,146,226,82,131,84,222,152,119,83,8,9,76,199,248,9,149,249,149,232,171,181,141,110,42,83,2,247,209,71,47,239,157,255,222,247,247,79,112,47,5,82,240,67,204,218,138,219,107,125,173,119,69,140,41,26,33,65,10,1,108,223,250,157,246,230,224,149,246,67,76,173,137,67,2,119,246,78,105,80,213,205,46,103,28,103,145,128,208,51,168,48,49,101,181,254,244,25,75,159,72,246,192,134,103,82,2,19,251,164,63,105,248,55,186,103,250,248,19,232,95,67,2,229,48,254,210,75,211,190,189,200,150,239,125,188,174,67,2,243,180,54,101,80,220,172,51,238,205,187,142,26,56,67,2,241,216,118,233,19,195,235,202,230,7,130,95,21,16,67,2,237,114,38,211,76,108,94,113,58,96,216,233,55,63,66,2,23,175,171,159,165,89,87,130,211,203,59,239,8,169,66,2,155,187,39,101,165,58,113,17,222,89,102,190,1,160,83,194,50,59,75,143,29,105,223,145,47,103,140,150,247,54,82,34,91,237,170,165,189,232,109,252,207,215,20,171,129,228,82,2,221,5,57,97,191,128,96,43,93,151,118,242,111,198,83,2,247,200,232,42,251,238,151,218,123,216,221,71,64,248,83,2,53,194,231,38,107,247,131,29,224,225,105,180,167,150,67,2,245,65,102,90,138,76,14,242,215,200,12,96,155,88,67,2,255,84,39,235,79,183,193,29,56,52,162,217,157,99,67,2,117,239,222,100,11,239,219,197,123,151,142,193,182,83,82,2,135,219,148,219,106,225,59,226,4,70,123,196,221,207,67,8,38,108,220,205,226,205,98,174,156,175,40,137,78,94,67,168,3,236,44,246,226,211,229,240,29,158,116,209,225,18,67,40,2,140,12,214,226,205,227,239,157,0,225,226,11,250,82,34,107,139,190,225,189,36,247,67,221,87,247,182,68,220,82,136,14,108,235,115,148,176,237,14,79,224,160,177,29,40,81,2,181,153,145,117,125,97,1,8,222,106,198,197,193,71,83,194,170,55,187,149,6,17,27,77,81,189,180,224,188,242,82,34,99,137,253,244,167,0,152,101,97,159,134,145,144,49,83,194,170,183,55,143,34,41,233,159,55,34,96,29,34,136, +83,2,63,249,228,43,109,95,187,75,128,43,99,26,189,141,82,144,137,44,137,239,117,167,40,6,131,58,65,246,174,127,66,36,243,151,254,50,254,153,179,113,89,143,138,216,169,255,66,2,11,86,146,241,137,85,110,212,44,116,132,64,68,140,33,198,184,91,239,157,154,37,119,75,0,0,229,230,139,68,65,234,4,172,46,38,119,174,171,232,96,13,20,183,1,238,83,136,213,132,53,56,183,86,151,157,207,21,210,182,225,74,82,196,100,99,113,249,81,78,39,252,60,89,241,195,78,26,51,36,175,156,210,189,157,28,151,0,251,191,146,9,40,203,35,4,211,218,83,47,159,83,85,6,255,168,252,46,234,61,81,2,93,77,87,73,111,97,65,169,252,133,17,23,162,229,51,36,47,223,234,187,29,132,41,132,177,68,182,244,191,253,81,136,159,161,209,23,155,126,165,171,193,155,144,145,181,177,66,194,98,97,107,243,1,0,105,92,9,86,147,150,223,225,66,36,173,3,150,48,125,152,167,10,85,85,174,245,40,146,83,2,249,217,200,51,57,165,164,67,206,73,114,251,186,0,67,2,245,37,87,126,74,147,231,184,77,99,68,208,196,133,67,2,221,136,141,226,14,120,204,58,242,102,189,91,109,140,83,2,185,233,199,51,212,121,78,48,96,89,16,246,141,22,83,2,251,233,230,43,145,238,10,218,123,230,191,183,255,127,67,136,25,140,191,239,139,107,178,156,94,165,165,9,237,17,82,2,11,168,2,17,200,80,138,241,178,13,182,38,83,132,67,2,251,167,127,252,11,69,137,81,166,212,12,87,238,7,67,2,119,73,143,120,76,126,80,206,122,174,83,81,20,167,83,194,6,135,130,61,217,80,99,103,2,126,188,153,89,40,83,194,154,158,31,175,192,250,236,77,46,169,153,31,91,216,83,194,182,187,186,21,118,140,80,65,90,8,51,171,137,228,67,194,130,125,127,189,1,137,63,229,159,125,246,199,57,158,82,200,27,172,227,251,155,52,42,47,77,34,231,120,53,188,83,194,46,179,51,151,137,130,88,24,220,58,162,13,99,148,66,2,187,211,62,43,159,83,202,130,66,44,2,184,136,245,82,2,87,213,246,214,214,8,106,63,191,120,70,233,128,225,83,194,74,74,71,73,200,165,150,184,155,47,24,63,107,119,66,2,207,86,210,171,227,19,77,113,153,90,148,85,48,161,66,2,75,91,79,239,161,84,21,17,221,25,128,17,107,68,66,2,203,219,78,175,225,20,91,14,123,83,115,117,17,213,81,2,121,99,111,91,133,111,129,217,77,167,206,224,3,102,67,194,114,113,123,215,65,23,191,213,21,195,157,47,114,132,66,2,203,206,75,169,225,50,20,32,54,238,217,185,221,146,82,34,117,101,188,200,23,72,116,89,249,211,20,186,159,255,67,34,183,57,147,63,154,92,49,24,31,209,92,53,239,180,33,198,186,92,48,158,173,119,29,180,215,103,180,42,1,222,35,4,67,75,207,233,157,18,17,118,92,181,255,77,255,245,51,36,187,30,171,71,89,203,218,52,187,53,215,148,105,188,206,49,89,163,13,82,218,114,46,70,107,113,165,245,48,78,33,202,9,108,241,185,140,123,69,158,78,88,225,255,67,190,83,40,17,236,158,157,195,36,189,29,175,106,232,226,194,84,81,48,69,12,102,93,91,172,190,122,228,196,157,127,54,67,83,2,109,177,229,54,128,237,139,231,89,185,173,23,66,61,83,232,227,129,162,6,109,105,137,15,233,232,128,12,44,106,67,2,175,130,91,88,77,160,67,98,31,121,203,100,126,31,83,40,124,195,65,215,101,206,23,135,45,97,2,116,23,100,82,2,239,238,157,61,99,16,112,149,84,76,169,11,85,164,67,2,65,3,52,216,138,42,36,34,128,242,83,192,121,100,82,2,55,174,142,61,217,168,255,51,22,97,79,60,84,42,67,194,82,75,99,153,65,219,40,128,244,124,95,181,174,222,81,2,55,37,47,25,91,69,1,200,31,180,253,217,155,111,83,72,26,236,233,62,253,117,77,22,113,128,100,180,135,180,66,2,227,248,107,58,173,29,119,23,251,7,179,193,183,21,223,3,55,17,43,5,87,49,241,119,237,217,119,224,187,14, +67,194,74,67,95,211,65,137,245,239,217,211,57,53,247,246,82,36,173,130,142,122,112,55,63,31,155,151,70,8,20,47,67,196,86,149,197,41,77,38,128,146,202,82,209,59,239,117,50,136,130,201,138,105,168,67,228,153,3,253,20,74,37,60,223,137,3,53,61,85,31,253,214,77,254,32,150,136,237,70,82,196,72,67,89,233,113,157,2,103,90,121,37,74,89,142,51,36,29,159,241,173,157,52,124,23,0,104,44,62,15,129,175,145,19,44,77,213,29,85,93,252,68,87,31,89,26,212,223,41,203,137,204,2,155,134,36,154,218,96,98,198,63,164,66,2,95,234,99,249,233,55,91,106,227,106,29,93,64,209,66,2,91,231,95,181,235,88,226,249,204,218,2,80,100,172,82,2,179,226,76,61,105,200,76,202,75,85,196,60,17,1,205,43,2,163,163,59,145,117,28,57,133,37,35,169,141,136,83,194,90,218,83,145,175,182,2,79,72,51,202,88,130,214,67,2,79,11,157,218,76,190,247,24,27,208,28,183,242,222,223,5,167,34,83,218,138,128,156,137,4,185,153,68,242,155,67,2,153,29,226,177,31,83,21,215,138,193,123,44,178,47,82,2,183,198,93,53,99,17,32,8,97,83,252,46,195,95,51,2,163,49,152,71,144,189,16,54,197,139,98,196,8,6,83,2,163,144,227,46,156,35,68,41,36,140,0,140,48,122,33,6,173,56,94,140,16,128,168,29,126,130,40,145,17,2,81,74,28,140,86,251,230,140,18,223,133,237,248,16,1,133,82,232,5,181,239,125,125,154,123,191,26,36,255,126,111,5,83,72,86,236,219,250,87,255,229,92,63,208,147,26,217,228,66,208,105,236,122,62,172,245,93,239,190,29,215,187,33,116,83,168,18,44,191,180,197,124,105,212,184,173,228,238,19,17,65,170,0,108,219,50,187,183,181,224,0,209,28,226,6,101,67,232,59,163,34,149,105,246,56,111,98,215,3,4,21,32,83,2,117,201,70,47,107,7,114,39,162,159,97,30,0,229,65,138,8,236,184,242,114,238,99,11,178,65,190,50,176,15,66,2,155,194,175,167,223,25,57,10,57,239,189,51,125,145,35,136,157,169,121,45,111,169,61,253,124,75,82,192,59,146,67,194,172,155,141,195,129,82,79,49,182,111,105,251,42,134,82,2,143,143,37,218,214,80,25,157,180,170,244,66,238,255,67,34,95,26,149,73,153,204,205,154,50,200,100,156,94,111,83,194,178,58,71,149,102,95,35,146,127,158,250,43,193,62,67,168,3,12,61,6,191,215,103,115,30,182,99,6,251,214,67,34,227,59,189,213,153,239,184,149,174,179,111,85,60,37,83,136,3,172,82,31,229,243,76,86,244,118,124,162,151,35,67,8,1,236,60,238,162,215,105,116,93,69,251,224,252,110,66,2,23,183,167,97,225,25,1,194,147,47,19,101,217,150,67,194,168,149,109,167,1,247,7,213,105,78,75,149,154,113,83,194,174,58,71,151,192,255,29,77,24,67,249,177,122,172,83,194,166,46,63,147,30,196,100,146,55,206,7,61,76,85,82,2,11,237,52,214,230,168,155,71,210,14,16,247,38,153,67,34,173,22,122,151,151,97,28,124,223,192,92,127,118,175,67,2,245,185,126,231,149,211,184,238,47,58,230,198,69,49,83,194,46,55,66,87,209,84,55,214,10,78,198,4,188,73,82,2,207,239,53,222,222,80,204,221,106,187,155,73,3,18,222,9,62,81,154,25,57,62,26,185,152,30,8,179,254,229,82,72,74,44,171,243,91,184,237,252,58,40,21,204,61,108,67,2,241,49,230,224,13,78,45,82,115,216,68,8,23,25,67,168,8,172,12,246,182,207,226,174,157,163,137,167,101,119,67,168,48,236,60,22,195,223,106,248,138,233,201,97,33,164,83,72,26,172,82,87,229,35,201,76,214,113,175,79,11,110,66,2,43,191,63,105,227,25,29,247,29,25,99,1,211,167,66,2,39,67,62,171,163,87,119,213,25,156,86,50,128,90,66,2,39,71,54,39,161,85,55,33,103,160,169,148,19,68,66,2,163,195,55,171,223,86,181,55,209,255,230,94,192,166,82,34,167,201,62,233,37,17,154,224,13,236,32,141,210,63, +83,104,5,236,112,212,227,186,174,141,217,238,228,23,229,0,83,194,46,47,38,41,30,196,223,59,48,251,13,62,239,91,67,194,150,151,167,113,1,123,152,107,45,44,224,152,191,183,83,2,115,201,101,47,255,221,227,243,125,128,152,43,157,95,83,2,61,241,195,39,243,191,179,222,63,165,95,253,186,7,81,42,203,50,151,103,213,188,4,204,14,247,3,178,141,90,83,200,66,172,90,151,197,125,79,38,223,128,125,175,201,17,83,194,2,139,7,175,128,49,198,184,10,210,232,107,173,200,33,198,184,219,174,155,180,190,10,56,127,248,250,233,127,137,83,2,185,217,134,47,229,5,246,45,32,149,153,84,70,73,83,72,26,108,52,78,147,52,205,76,242,80,254,17,98,215,50,168,48,81,54,246,22,63,22,22,247,31,8,243,45,170,82,34,109,99,106,196,23,25,84,252,189,247,152,255,255,75,51,196,128,127,141,199,129,145,77,203,31,105,147,128,36,217,51,36,41,112,250,189,157,56,187,141,62,148,172,140,163,120,51,196,102,101,111,243,129,245,93,55,22,209,90,159,24,139,83,2,239,185,6,51,235,190,125,238,90,109,237,5,226,89,66,200,9,145,151,215,151,222,182,118,23,159,26,100,139,48,207,137,222,161,115,221,111,223,201,46,62,67,49,97,46,80,67,2,121,133,87,252,10,144,239,166,58,167,155,127,225,60,83,2,185,225,197,47,37,37,7,184,179,129,113,247,7,65,65,170,0,236,184,110,149,243,236,64,218,198,213,222,138,9,223,37,197,58,148,195,155,128,5,82,36,245,139,118,83,27,67,2,251,179,39,253,20,161,71,164,28,48,162,217,236,156,67,232,70,12,220,5,195,177,89,47,20,217,127,61,101,216,66,2,167,75,50,235,155,20,153,204,161,1,252,168,201,132,83,194,46,55,50,149,44,36,105,229,135,174,69,145,53,55,67,194,158,149,153,161,65,22,135,239,152,173,155,7,48,33,83,194,174,178,50,147,94,51,1,117,103,16,95,4,67,224,82,34,189,7,62,245,173,80,175,101,183,46,26,93,31,203,83,194,62,190,59,139,92,104,134,33,241,136,60,73,205,254,35,4,203,207,79,41,227,83,93,39,111,239,55,240,189,3,66,196,106,103,113,247,1,64,187,102,167,214,240,246,90,246,1,74,101,139,246,151,253,105,74,238,246,171,215,173,16,4,67,200,3,236,229,186,189,189,221,112,28,168,190,239,255,190,83,200,131,36,214,22,247,118,247,158,184,115,219,142,8,137,65,74,14,172,168,203,93,143,186,16,52,79,47,185,64,66,81,42,124,172,247,239,114,206,156,68,13,79,11,18,32,4,65,74,154,100,140,39,127,193,111,146,217,54,2,133,49,173,205,203,24,172,245,249,56,139,207,162,202,176,105,3,121,19,95,73,8,209,118,118,55,95,23,183,151,29,128,113,112,181,205,139,14,236,245,253,76,109,63,94,210,4,160,46,54,246,83,194,198,75,195,135,192,131,107,156,129,165,116,49,71,141,67,194,118,111,129,185,65,238,205,23,184,230,11,59,114,198,65,138,222,196,134,229,110,189,119,186,235,52,23,108,3,205,81,2,107,85,95,73,123,101,129,29,192,60,162,219,183,118,67,194,114,111,121,189,1,129,173,157,172,101,189,219,110,142,67,8,43,140,187,237,230,193,94,50,30,240,183,189,97,11,67,40,124,163,241,213,43,207,118,103,164,247,1,159,32,6,81,2,105,89,99,79,119,97,129,159,118,47,203,213,12,209,67,2,101,229,93,96,139,238,204,56,183,86,77,91,136,151,65,138,85,44,205,79,207,156,103,35,128,158,119,65,206,206,83,2,229,152,4,47,44,221,229,153,105,28,16,1,8,161,67,2,233,165,126,252,140,156,160,53,12,37,192,94,144,67,83,2,173,192,165,43,57,219,150,60,160,97,21,190,254,96,83,2,239,184,164,43,117,11,52,40,80,65,186,234,99,241,83,2,239,185,100,39,49,244,97,77,252,216,24,227,40,244,83,8,2,172,219,182,197,101,201,37,32,144,192,205,115,239,67,2,81,133,68,206,140,24,191,164,105,180,234,145,93,157,66,2,99,197,115,222,43,87,0,85,151,36,255,47,255,255, +83,2,119,217,102,47,32,100,143,90,74,250,196,148,115,136,83,2,35,153,229,50,128,2,128,184,64,201,31,231,102,100,83,40,75,172,211,46,91,141,121,230,193,168,21,109,2,47,83,2,109,176,2,43,132,50,106,161,34,33,72,190,254,175,65,74,14,172,168,75,182,150,100,17,109,112,241,141,121,235,83,104,5,236,245,54,141,97,158,117,162,214,82,83,0,219,67,2,117,40,119,248,12,136,224,157,12,124,182,184,217,235,51,36,31,125,241,43,157,179,97,32,20,76,217,127,22,133,35,4,99,106,230,183,169,22,237,207,194,30,11,240,63,172,67,136,59,44,10,181,222,169,210,43,155,38,144,68,159,183,223,137,50,49,110,126,253,252,142,91,93,90,239,89,252,225,51,36,163,252,185,45,157,149,241,212,223,183,121,96,154,117,83,194,86,91,207,143,56,0,227,188,31,33,231,212,115,176,83,136,24,108,181,167,229,165,217,76,173,187,52,105,128,66,67,2,201,193,68,92,13,136,81,35,68,141,81,50,0,141,67,2,87,69,109,218,12,160,221,68,179,182,169,155,28,198,35,176,89,204,177,63,99,212,234,140,246,21,208,134,215,87,50,240,15,141,232,18,146,242,116,99,133,141,224,83,178,62,82,4,87,122,107,181,37,124,250,79,75,123,78,56,33,130,83,2,11,55,62,125,32,206,224,138,15,215,43,242,146,192,81,42,75,108,78,11,123,231,80,232,16,129,65,72,99,162,83,2,245,201,40,55,255,222,85,47,231,202,1,32,28,161,81,42,194,196,191,87,151,243,32,155,235,95,56,162,199,170,33,146,162,102,221,173,169,245,93,254,40,246,23,242,116,91,67,136,3,172,139,133,162,183,87,41,156,212,119,107,115,6,67,2,249,87,87,109,19,227,237,189,25,191,35,14,80,50,82,2,143,145,118,250,84,113,247,109,47,22,220,156,136,97,34,42,2,44,147,230,197,44,187,242,231,213,213,134,103,64,67,194,156,147,133,79,65,206,171,188,5,56,19,198,233,243,67,194,160,149,143,181,65,180,97,213,144,115,95,14,188,11,67,194,172,163,153,69,1,96,234,86,175,94,78,181,235,190,66,2,179,215,186,173,231,29,189,123,213,213,29,5,63,202,67,34,209,220,180,193,152,179,20,221,122,91,108,133,182,60,83,194,166,175,51,181,103,118,208,106,3,109,180,88,123,77,82,2,211,177,101,210,214,224,119,168,89,59,171,3,213,10,83,194,38,43,51,151,197,43,249,86,177,191,25,208,141,50,67,194,176,167,163,139,1,196,157,241,55,94,208,49,106,150,67,34,95,91,181,81,25,161,247,224,189,147,155,89,111,211,67,2,241,153,134,103,85,2,22,232,248,186,212,46,137,182,67,2,241,185,126,235,84,63,230,223,92,22,71,25,12,197,51,4,117,154,126,227,147,209,186,255,137,35,37,41,0,144,67,196,102,248,205,233,254,102,11,54,255,87,74,185,190,167,82,34,31,201,44,185,37,101,250,125,161,245,91,47,152,141,67,2,113,120,78,227,147,247,239,141,244,180,229,244,208,1,82,34,99,203,253,253,61,69,186,137,25,30,239,10,199,110,67,34,95,155,156,69,153,26,106,239,112,37,113,53,16,242,67,34,229,184,132,195,24,110,107,186,91,32,4,130,177,125,83,232,4,172,114,157,213,226,188,141,10,238,48,189,154,63,67,2,113,120,70,229,83,35,119,231,176,13,131,247,59,182,83,136,103,236,122,165,243,59,219,148,162,174,83,41,242,234,83,194,182,203,79,151,209,64,35,130,11,230,177,105,141,207,223,5,241,55,70,99,19,128,101,201,150,180,183,212,222,165,65,42,9,236,184,239,93,143,66,231,79,27,168,10,225,180,51,40,137,97,215,43,107,108,52,89,116,149,245,135,188,75,65,106,149,50,141,62,191,139,91,128,102,8,136,102,109,128,83,194,22,150,146,61,47,2,55,70,93,71,175,227,227,174,83,8,2,44,145,166,165,162,170,148,89,97,253,224,185,134,83,194,58,190,63,21,247,221,243,206,204,165,110,22,106,6,83,194,178,191,62,21,128,179,64,99,59,54,175,234,178,117,83,194,174,59,58,21,80,80,30,60,3,37,34,212,172,155, +83,194,174,42,163,175,172,237,121,246,238,251,158,3,230,185,83,104,6,236,114,148,99,93,99,6,125,187,253,250,42,180,67,2,105,209,30,111,21,93,206,246,54,231,236,0,123,44,82,2,95,191,231,147,102,24,199,212,176,61,241,76,228,84,67,194,160,165,177,139,129,100,30,118,51,157,230,123,148,10,82,2,155,190,198,155,236,72,112,41,15,87,84,34,54,155,67,194,194,197,207,195,129,177,135,172,56,156,194,72,220,33,82,194,166,173,183,139,1,112,247,200,212,44,55,132,92,43,82,2,203,177,241,57,180,176,136,162,249,6,103,150,69,44,67,34,203,186,204,85,92,27,127,33,221,55,151,182,133,143,83,2,245,200,102,51,239,238,189,238,218,44,205,5,217,92,67,2,121,72,151,242,13,184,239,204,251,127,255,243,223,166,83,2,173,176,227,46,22,113,6,132,230,113,238,254,255,189,67,72,28,149,231,190,141,52,50,241,3,181,60,48,248,241,67,232,99,53,142,161,24,33,137,235,145,176,72,131,1,250,67,2,109,200,134,114,140,7,159,148,19,241,202,227,238,181,82,196,102,97,115,231,113,235,105,159,151,132,215,47,189,223,1,82,9,140,101,223,191,109,93,158,101,229,240,80,222,47,65,2,89,71,85,79,113,97,1,136,192,191,136,95,162,205,51,196,110,103,121,237,1,34,96,219,68,28,197,191,67,187,82,40,126,108,243,187,219,16,26,13,57,0,1,20,54,200,82,34,109,101,106,172,13,185,38,3,182,202,183,21,196,79,66,2,207,223,83,237,163,83,168,64,98,110,99,17,23,217,67,8,26,108,155,237,242,183,88,238,30,75,66,27,242,114,67,34,37,55,90,41,86,179,254,93,124,243,87,21,250,181,65,2,97,75,93,79,117,99,1,216,54,194,1,187,215,164,51,36,179,251,218,59,158,162,96,148,160,189,212,191,204,100,83,194,50,55,55,145,33,33,130,116,108,140,200,203,184,204,82,2,39,222,202,31,247,64,85,90,4,21,188,162,218,150,82,34,189,77,111,213,45,17,17,36,112,6,218,116,9,170,51,36,155,151,113,45,149,128,171,169,191,138,48,158,234,166,82,2,231,189,185,247,222,112,95,46,128,136,181,211,103,230,223,201,131,225,25,119,38,107,57,113,136,5,120,209,183,173,34,236,25,67,121,190,244,106,151,164,177,2,121,250,255,222,83,200,152,65,176,242,244,226,102,11,157,192,188,146,134,222,67,200,24,195,132,79,88,102,219,171,33,100,162,115,8,183,83,2,243,193,72,51,161,5,2,69,175,90,145,242,121,197,65,74,1,172,219,174,119,202,169,25,32,164,107,108,10,220,65,202,66,108,89,146,154,211,188,104,221,222,30,16,232,22,81,202,152,242,120,150,222,61,4,26,50,253,152,238,236,184,83,232,4,44,151,223,217,242,186,86,6,191,229,4,28,59,83,2,41,169,38,47,140,183,111,5,80,141,97,238,32,82,67,2,235,227,69,234,139,222,85,243,193,82,78,64,227,254,82,232,4,210,245,5,153,100,119,89,86,129,156,154,44,200,67,2,109,51,62,101,21,169,155,100,65,27,163,166,152,33,82,36,181,84,109,122,69,137,146,144,222,3,150,2,216,13,66,2,207,218,210,47,227,21,32,145,108,21,17,161,149,42,223,197,114,109,121,223,65,171,5,172,177,26,55,174,245,39,67,0,105,95,97,87,117,107,1,0,128,138,82,109,97,97,83,194,58,58,55,23,190,72,84,154,99,49,6,23,124,8,83,168,136,33,35,135,81,71,105,15,96,14,160,144,131,252,66,8,163,137,124,38,177,89,108,164,54,85,156,123,104,96,67,2,83,39,133,96,143,34,162,18,227,124,26,27,67,151,82,232,157,225,170,151,107,53,57,70,19,81,102,143,203,191,67,2,167,1,75,210,140,152,26,204,8,94,147,71,209,119,67,2,97,10,166,110,15,21,0,166,250,143,238,252,216,149,65,42,11,140,103,254,222,158,237,201,185,31,33,59,144,32,83,40,34,76,205,189,25,198,253,37,161,116,232,0,15,187,67,2,49,3,116,68,137,124,227,186,129,243,104,44,51,241,82,2,117,4,221,248,97,8,27,1,67,98,6,93,161,134, +50,240,15,12,193,120,246,251,191,113,206,29,81,161,62,204,82,2,57,206,206,254,211,240,102,48,237,224,34,220,83,23,65,106,13,108,44,74,239,62,215,243,11,109,226,108,191,207,65,138,2,236,105,223,226,120,183,226,61,49,38,97,119,140,83,2,161,129,102,42,1,192,123,42,87,111,37,175,93,43,82,236,43,224,31,252,242,52,4,69,65,201,200,223,137,187,83,194,54,183,39,174,102,2,137,47,18,172,69,106,125,79,82,2,181,108,12,189,91,112,78,123,29,25,177,221,7,90,83,232,44,44,179,36,219,51,77,20,131,18,201,197,18,0,67,2,211,201,148,88,12,254,3,6,190,26,214,237,63,111,83,2,171,153,228,42,36,213,234,54,135,187,41,113,214,190,66,232,5,117,217,45,99,243,21,126,108,73,245,118,230,2,67,2,87,35,85,220,13,0,202,160,52,14,77,187,245,206,222,173,86,76,206,250,146,122,150,0,46,56,85,75,214,120,83,168,7,117,237,89,135,30,86,6,205,46,206,244,241,138,67,168,18,108,84,210,89,203,99,117,15,209,197,244,94,211,65,234,5,44,75,111,115,206,51,129,188,218,154,90,190,121,81,106,13,140,111,46,243,189,81,10,238,168,185,187,159,152,83,194,42,51,46,181,75,128,90,106,207,189,183,182,90,107,81,202,137,164,159,205,149,170,34,2,82,157,3,28,38,185,83,72,142,196,50,55,186,249,89,157,135,95,18,4,84,72,66,234,150,164,77,165,31,140,74,23,14,138,94,64,177,194,83,72,8,172,82,149,131,178,46,78,211,243,167,2,53,224,67,194,190,183,177,179,65,219,200,207,101,89,87,234,217,26,83,194,26,159,35,81,56,122,169,213,240,30,202,101,196,114,67,34,99,59,134,221,24,40,70,221,250,60,84,179,128,251,82,34,223,233,187,148,21,17,227,59,198,251,221,106,207,166,67,2,119,250,118,107,87,223,62,156,106,101,199,241,58,248,83,104,13,172,94,85,213,250,186,85,127,188,101,4,110,161,83,40,35,172,118,156,131,242,184,140,50,77,161,72,118,251,67,2,111,6,94,102,9,32,154,193,196,245,77,83,178,132,67,194,170,155,155,219,128,228,172,144,106,108,113,91,189,188,82,34,95,207,234,149,39,64,45,103,255,189,243,110,19,82,83,2,55,208,67,39,158,1,188,186,38,247,158,121,223,189,67,196,102,24,190,105,75,31,124,2,46,165,182,148,222,215,83,72,6,172,94,215,195,250,58,141,141,235,217,104,6,202,67,2,239,121,126,231,21,186,251,167,200,3,227,60,249,149,83,194,46,59,58,145,129,185,154,96,63,210,132,101,86,203,83,194,54,58,191,147,20,6,85,185,23,215,83,88,235,50,67,34,223,91,197,197,88,252,172,58,54,255,56,195,66,34,83,136,101,172,118,92,211,226,188,198,145,131,43,60,66,71,83,72,1,236,112,221,133,227,60,77,161,97,202,104,182,101,83,194,46,187,186,167,206,192,152,5,244,39,216,118,70,91,67,34,223,218,164,199,153,59,207,141,109,9,131,175,213,173,83,194,170,182,59,143,62,39,87,26,214,135,115,23,33,112,66,2,155,170,51,227,219,19,227,145,66,145,6,102,172,170,67,194,164,135,129,195,1,228,252,212,110,53,123,132,235,25,67,194,176,147,141,197,129,93,16,109,219,23,109,213,172,254,66,2,23,195,46,239,159,90,226,254,160,177,234,219,158,63,67,34,95,28,165,201,25,235,120,37,175,59,255,235,76,23,67,34,87,123,156,187,26,68,172,140,58,121,92,31,111,114,66,2,159,191,191,235,227,90,173,233,31,233,222,233,32,134,67,196,98,183,197,145,166,79,227,42,126,79,125,216,237,76,83,104,139,68,172,211,24,120,247,155,104,138,84,231,2,190,83,194,138,6,3,172,27,218,211,232,246,190,77,64,66,20,82,240,148,36,22,19,131,187,121,110,153,96,192,210,154,58,83,194,34,43,38,56,31,143,22,212,5,109,203,48,250,88,67,2,233,202,190,242,77,145,175,18,136,125,207,130,37,162,66,2,175,209,167,104,13,26,159,7,121,201,59,112,43,221,67,72,26,76,141,70,131,201,95,175,92,43,9,118,62,99, +66,136,85,81,186,122,91,126,25,58,91,159,230,91,27,24,83,232,4,236,94,76,235,121,152,156,232,143,216,137,147,228,83,2,59,235,236,63,227,90,112,10,243,75,132,110,109,111,83,194,46,42,35,167,224,190,147,223,187,119,157,187,230,158,33,106,13,172,176,60,78,107,183,210,42,65,67,61,109,133,223,3,215,147,215,147,243,153,129,49,1,76,112,22,144,24,83,200,3,236,209,111,159,186,46,204,160,242,42,199,170,47,67,194,178,187,195,191,1,222,254,229,63,135,243,221,189,133,67,40,2,236,156,118,215,205,232,181,94,152,118,176,225,109,67,2,235,228,94,120,138,161,84,177,5,64,248,37,119,148,83,194,154,22,15,25,188,125,2,68,88,82,113,45,181,148,67,194,176,183,203,201,1,49,38,238,156,35,227,78,199,56,67,194,210,219,235,175,65,1,94,42,85,147,17,78,26,10,83,194,26,26,146,103,32,238,192,102,119,236,134,36,226,42,83,2,49,201,133,47,170,149,130,184,207,18,17,117,24,1,83,2,249,224,198,51,12,98,5,8,153,132,232,97,77,186,83,2,125,241,228,47,103,159,117,206,150,105,59,48,13,146,83,2,143,71,127,125,6,9,136,82,2,225,222,176,207,125,83,194,146,19,134,119,177,172,227,66,32,214,90,160,181,150,66,2,19,98,15,241,193,52,136,152,8,38,8,83,8,50,66,8,62,209,213,21,151,159,181,181,150,159,134,240,215,141,66,2,215,227,87,241,161,82,0,182,204,177,140,220,170,192,223,197,88,91,111,227,1,169,219,254,107,251,199,223,74,124,66,2,91,226,215,241,227,83,10,160,236,193,170,81,85,94,83,0,79,65,81,65,119,105,1,0,160,10,203,106,236,77,81,2,69,55,69,59,109,97,129,245,102,243,45,109,241,139,82,196,86,87,99,247,9,25,83,167,68,145,149,217,245,105,51,196,92,95,107,231,129,142,35,53,137,13,36,93,219,124,222,233,198,9,15,113,196,67,189,224,83,125,180,55,158,108,67,200,131,193,177,179,55,211,150,188,17,160,254,250,253,190,83,2,205,55,95,125,50,158,106,115,213,212,228,128,64,140,223,169,146,105,65,21,213,117,226,13,169,128,242,212,197,145,82,8,3,176,200,52,31,149,129,142,171,36,240,13,78,65,82,104,49,195,208,172,202,252,183,239,14,138,86,16,46,16,83,2,109,176,37,51,199,10,252,44,66,127,105,96,253,204,82,200,24,112,1,104,106,51,152,241,232,5,83,228,132,18,82,208,31,44,243,94,51,198,156,210,154,209,22,59,169,129,82,240,67,44,41,119,227,180,212,90,220,208,54,56,21,38,83,104,5,12,175,123,167,53,63,54,166,165,240,215,142,213,83,2,17,71,93,125,144,248,4,35,209,250,38,208,183,162,83,194,142,147,3,114,245,60,107,203,43,217,7,128,66,54,82,2,139,200,130,53,90,248,63,209,215,93,215,92,117,58,67,40,66,117,30,185,34,65,191,242,145,237,13,11,11,237,67,2,93,136,117,220,75,206,156,174,52,198,0,182,234,1,83,194,18,19,15,171,12,67,192,8,196,140,230,43,104,203,67,194,86,85,97,179,1,125,254,57,111,69,203,125,135,109,82,196,90,81,101,239,233,22,219,47,157,175,206,163,29,13,66,2,207,218,79,111,163,84,170,12,19,76,247,98,104,145,82,34,49,71,44,233,167,104,247,140,109,53,31,221,234,24,82,8,163,137,70,222,182,46,127,42,15,160,54,171,182,203,83,2,111,185,70,47,59,74,158,207,222,92,204,153,20,104,67,2,147,152,161,167,28,224,48,157,195,51,101,150,72,225,67,2,205,160,77,114,140,178,105,0,156,121,4,36,104,80,83,72,8,172,177,156,219,97,12,185,1,204,8,78,60,116,83,2,75,54,91,117,8,166,7,212,191,128,189,238,1,54,67,2,145,139,217,168,17,223,86,166,99,148,100,52,175,2,66,240,48,204,255,181,34,220,155,154,50,11,253,64,120,117,83,136,131,161,192,66,75,227,38,11,191,185,0,2,104,232,223,5,103,40,141,202,75,96,223,131,123,103,39,9,65,144,65,138,9,76,117,92,199,61,175,242,145,84,217,56,35,102, +82,240,129,70,227,248,205,60,231,242,174,56,47,159,155,28,67,4,9,12,176,232,254,159,215,43,9,16,247,223,177,207,83,2,85,88,98,46,26,90,245,58,199,225,124,23,168,233,67,2,117,198,86,104,76,10,16,93,72,101,106,29,103,180,81,42,124,172,90,204,38,157,25,217,4,225,13,15,209,230,82,232,4,149,99,251,214,141,198,142,20,193,3,48,73,134,83,232,99,44,183,164,219,255,95,55,109,184,153,23,84,124,81,74,0,44,227,140,97,148,15,72,41,237,138,6,160,80,67,2,209,198,116,208,73,249,137,33,216,140,64,188,9,97,67,200,66,140,58,181,194,133,67,162,28,160,232,28,158,206,67,2,195,35,124,200,9,108,173,29,50,14,183,25,192,186,67,176,61,172,158,254,118,207,83,187,147,66,54,10,5,217,67,2,149,188,185,169,156,126,35,58,75,192,15,96,67,64,82,2,57,34,94,209,67,128,120,26,70,130,150,4,36,217,83,2,245,192,37,35,22,114,120,138,6,231,45,61,215,186,67,2,249,54,47,111,147,25,35,231,73,139,95,154,142,145,83,104,13,172,80,151,249,243,60,184,146,33,15,252,169,169,82,36,191,217,79,172,208,104,30,173,143,92,216,217,35,0,67,2,239,183,86,237,84,86,50,145,151,232,27,160,45,33,67,194,136,119,129,23,1,213,140,159,216,86,118,30,126,248,67,194,176,163,175,77,65,166,35,135,29,9,234,69,166,167,83,194,38,170,42,157,109,255,20,194,157,218,153,18,0,85,83,194,130,15,14,105,206,123,131,189,183,218,42,54,39,6,83,194,18,31,159,125,127,73,240,140,86,93,40,58,245,238,67,194,196,177,175,203,129,144,70,72,157,26,126,59,9,76,66,2,155,174,51,167,155,82,162,96,18,53,158,245,241,127,66,2,163,42,182,31,219,79,246,11,120,151,156,218,127,128,82,168,2,44,107,179,59,120,201,220,44,120,96,12,93,105,83,72,6,172,90,94,193,250,186,134,52,103,64,179,245,8,81,2,181,157,141,117,141,119,65,3,244,54,43,59,146,138,67,2,115,166,102,232,11,144,157,34,204,149,107,62,103,196,66,136,222,161,48,205,31,175,252,255,236,75,32,130,163,44,83,2,235,168,3,43,189,170,65,220,254,8,177,137,32,129,81,144,100,140,162,58,28,195,64,86,20,203,159,179,122,241,83,2,237,200,132,47,148,18,202,48,38,199,51,192,128,243,82,2,223,160,73,252,74,129,24,103,33,102,253,200,196,116,67,80,137,140,98,157,243,174,22,51,168,85,135,109,126,213,67,2,15,26,169,159,27,249,35,44,51,7,162,49,5,98,67,2,143,24,137,161,25,138,87,60,17,72,122,98,179,110,82,196,132,123,127,225,65,0,68,169,224,215,107,47,72,250,67,194,162,137,139,123,129,168,99,1,25,122,206,105,178,126,51,40,14,163,77,217,50,62,49,204,251,217,232,208,79,219,67,34,205,217,171,63,92,100,59,16,118,121,122,3,231,117,66,2,175,91,195,121,227,92,255,183,63,51,27,69,1,44,83,104,10,236,122,37,195,227,206,12,96,35,102,7,175,230,65,170,176,114,28,254,214,159,93,4,202,86,104,89,208,156,83,194,50,55,179,169,59,59,17,37,141,88,154,0,40,179,67,2,241,82,22,225,17,136,243,189,247,70,77,25,102,189,83,194,54,58,63,157,158,1,16,188,11,115,157,125,206,59,83,194,42,46,179,163,99,253,221,70,175,163,151,224,9,135,83,194,38,51,55,77,123,237,208,91,128,214,59,197,109,73,66,2,171,58,62,229,161,20,255,219,229,0,235,37,19,163,67,194,146,133,123,73,65,123,218,156,118,182,187,27,92,148,67,2,115,119,86,227,82,221,156,254,31,31,210,30,192,231,65,138,222,164,196,36,131,187,100,106,201,175,119,63,22,1,66,10,151,114,13,185,164,5,6,150,135,80,119,232,99,248,67,2,55,159,243,189,31,6,74,87,240,56,222,255,189,167,82,208,222,166,24,103,127,242,44,114,171,216,87,132,113,130,81,202,152,132,81,79,227,120,39,237,223,84,224,55,178,162,83,194,14,10,131,118,189,149,161,195,46,138,249,228,43,208, +83,194,174,175,154,191,215,219,214,96,188,76,206,3,202,187,67,2,105,40,126,240,10,243,200,99,177,27,234,167,38,107,82,2,23,140,69,125,192,248,163,194,23,0,41,91,69,180,83,194,146,147,19,181,181,239,211,106,251,77,196,49,107,1,65,138,131,196,204,118,191,227,110,170,30,80,1,153,137,51,66,2,43,248,167,58,209,92,96,153,216,255,190,125,51,189,82,2,179,184,205,122,243,192,220,172,156,5,249,63,188,249,67,2,111,9,151,244,75,155,178,141,45,156,101,25,20,206,82,196,60,63,79,213,145,217,151,5,119,169,236,91,242,10,94,7,123,207,243,200,123,162,237,233,251,60,41,140,69,49,83,2,177,192,4,47,52,244,133,169,235,136,83,5,24,73,67,2,121,103,135,122,140,0,229,175,220,235,103,236,178,75,82,202,6,160,115,110,246,89,20,48,56,68,132,148,136,228,66,2,151,153,138,86,65,86,163,8,191,134,255,159,255,199,67,2,77,223,252,209,31,237,195,169,245,140,39,113,65,139,83,2,179,193,7,51,185,215,23,70,175,208,141,134,252,104,83,2,121,240,228,43,192,50,98,17,34,55,34,114,53,32,65,202,9,236,121,118,159,211,236,248,143,109,142,133,43,225,66,136,153,137,138,60,113,81,159,114,177,89,128,136,219,59,66,2,143,234,3,243,133,53,8,138,96,187,114,255,181,251,205,199,170,85,173,157,164,108,110,251,151,190,22,224,51,187,82,136,3,172,173,101,53,184,94,59,43,248,186,171,122,33,33,106,38,172,174,62,47,190,86,103,203,54,8,32,251,136,51,196,84,93,113,233,65,182,144,236,203,219,48,73,237,48,35,4,95,235,95,177,167,52,122,31,128,189,166,191,52,204,82,200,3,236,189,101,244,184,78,45,47,96,223,107,197,165,83,2,41,169,230,46,20,16,230,83,14,255,189,51,239,62,50,4,65,69,65,79,109,89,129,249,33,38,7,253,55,243,83,2,113,201,102,43,251,25,158,74,168,166,247,10,83,107,82,2,143,168,66,53,72,57,70,122,151,25,36,207,66,44,67,2,113,75,191,252,142,71,58,95,106,53,223,44,12,27,67,2,107,3,79,248,72,155,255,189,13,11,68,13,144,196,67,2,15,54,97,33,24,188,156,155,129,91,203,170,188,238,81,202,135,50,113,151,92,175,66,237,9,7,206,77,158,124,83,2,91,120,132,46,204,49,206,60,23,6,128,240,132,19,67,2,213,161,68,84,140,90,141,2,177,14,117,245,76,82,83,40,75,76,197,119,221,239,219,228,163,33,188,85,130,27,83,2,95,120,131,42,223,114,158,127,37,128,175,23,41,205,83,168,8,108,185,47,115,255,105,184,91,126,8,229,253,252,83,2,37,144,227,42,191,134,100,124,142,0,178,140,57,165,67,232,56,181,170,45,238,228,182,253,2,147,84,17,141,4,35,72,74,113,53,213,181,253,52,181,149,158,110,235,1,201,66,2,91,118,91,59,229,91,91,149,167,153,1,89,174,25,51,36,29,255,233,45,29,180,99,139,63,108,215,142,74,7,67,34,179,216,162,187,153,229,18,59,87,64,133,226,22,90,207,137,101,163,99,118,216,203,79,103,201,144,104,183,36,6,67,2,83,35,101,222,142,136,17,230,205,143,13,49,48,132,65,170,1,172,111,82,144,178,36,33,235,189,160,28,233,235,83,2,171,168,5,47,167,168,144,222,62,40,172,3,253,94,67,2,229,160,70,246,77,10,81,222,21,194,104,66,242,0,67,2,153,30,234,173,95,26,47,43,103,164,170,113,80,179,82,40,69,85,247,91,254,165,222,236,10,16,147,8,238,29,83,2,203,61,89,109,156,37,69,244,247,152,120,14,104,41,66,2,169,114,57,47,234,82,33,252,4,164,128,128,192,68,67,4,77,146,142,152,252,169,80,61,131,239,117,208,125,8,66,40,213,9,181,4,93,134,192,70,181,6,3,221,252,168,83,8,3,181,157,238,15,159,118,6,128,242,234,235,211,141,66,2,97,5,115,146,35,21,132,26,194,159,129,2,132,96,67,2,165,1,75,200,139,130,64,60,192,248,125,172,145,236,83,72,169,65,231,68,171,233,40,15,128,7,39,124,166,237, +83,2,39,153,3,43,92,9,203,94,179,204,93,32,52,67,66,144,32,140,231,38,38,230,155,140,242,25,1,237,225,243,67,168,42,204,148,234,173,99,179,33,150,129,152,38,93,108,82,2,33,96,89,248,99,184,106,218,247,151,84,83,169,235,83,2,105,152,226,46,39,82,38,17,97,28,0,132,165,198,67,2,219,67,85,222,75,84,218,49,178,231,24,3,179,1,83,2,107,154,202,54,12,196,239,173,61,73,178,150,146,174,83,8,31,172,221,239,149,189,73,174,166,45,4,251,254,79,83,2,173,169,7,47,22,154,168,40,15,38,230,98,230,168,83,136,101,172,219,238,135,239,107,204,107,139,38,32,91,120,83,194,110,243,95,155,219,200,115,171,243,254,182,5,83,152,205,199,138,67,166,26,252,223,187,17,36,91,12,128,253,70,67,2,207,196,100,214,137,220,123,187,51,251,255,93,72,231,82,2,107,188,76,87,117,73,229,165,201,105,163,77,109,96,66,136,19,75,25,160,117,46,94,45,249,137,55,155,175,252,83,2,109,184,229,26,58,237,139,120,88,156,64,101,40,198,83,2,245,200,37,39,16,0,168,0,67,55,48,176,87,99,82,2,235,132,89,53,67,184,85,10,55,85,0,236,9,97,83,136,19,131,35,22,70,246,238,134,17,117,137,176,125,92,65,138,85,172,152,135,90,170,163,88,89,187,55,124,67,64,83,40,124,172,120,223,147,162,172,20,240,159,56,150,140,92,82,176,79,12,95,169,176,165,79,103,204,229,199,39,40,61,81,144,32,140,142,225,222,118,223,125,134,221,29,87,143,35,83,8,2,172,114,92,211,226,188,70,33,33,67,181,28,255,83,168,3,172,126,213,147,242,186,148,39,189,176,78,43,232,83,232,28,108,177,45,133,227,60,101,10,176,61,207,126,253,67,196,230,56,206,145,22,189,127,83,242,7,66,243,66,8,83,194,154,167,162,149,22,74,21,20,235,117,135,152,91,39,83,194,30,171,42,83,174,239,138,85,44,4,176,160,24,148,67,194,188,171,175,209,65,141,79,25,144,65,55,6,99,67,82,104,139,225,201,87,77,251,150,41,19,33,212,163,189,94,67,2,119,19,31,107,147,102,252,251,106,79,184,125,52,148,83,2,61,233,228,43,0,245,141,97,218,17,195,168,53,65,65,74,28,236,188,138,203,189,181,145,184,152,79,39,192,200,67,2,59,65,44,90,74,50,18,64,201,18,84,118,154,72,83,2,233,176,69,47,20,11,8,204,75,12,241,65,8,193,83,2,215,112,197,46,104,89,204,21,23,140,48,142,32,85,67,2,153,225,49,60,10,106,13,28,225,103,30,248,107,69,66,2,41,144,181,206,124,24,70,17,168,60,207,105,112,102,66,2,45,8,61,202,62,86,41,19,217,254,169,157,96,204,83,104,5,149,49,111,173,171,118,2,107,15,191,6,243,0,82,34,165,50,94,58,66,136,71,115,144,212,244,156,41,108,67,2,241,99,62,100,10,247,19,24,19,106,31,64,179,79,67,136,59,117,44,37,220,183,190,187,130,37,130,5,222,211,83,136,2,44,145,101,149,189,89,77,167,172,154,56,144,138,83,136,14,236,112,158,167,227,206,12,203,186,137,108,0,75,67,2,239,113,14,229,18,110,204,83,171,102,237,101,187,2,67,2,235,114,22,101,147,164,21,246,8,216,214,33,235,3,81,2,229,167,195,131,177,127,65,97,82,36,25,163,207,250,82,40,2,44,227,227,51,124,233,216,76,136,211,223,114,86,66,2,155,171,51,225,215,16,100,232,0,104,89,36,113,204,67,34,115,218,149,85,27,32,114,78,4,225,234,138,237,110,67,194,176,157,153,225,1,181,160,175,147,245,215,48,76,140,82,40,2,172,122,107,147,80,221,200,76,72,214,242,21,82,66,2,27,51,50,99,151,81,87,14,109,17,221,28,89,105,83,194,166,50,178,75,197,197,225,195,235,210,229,10,184,145,66,2,35,179,55,163,221,18,222,253,198,61,192,145,99,226,83,194,166,51,179,141,7,242,90,125,234,185,151,34,231,90,67,194,168,143,139,167,65,135,188,191,121,6,60,83,200,205,82,36,251,225,143,110,98,165,113,151,165,58,103,224,180,125, +67,2,245,212,54,241,82,147,84,135,202,9,195,26,4,158,83,136,103,227,168,215,69,215,174,134,21,216,235,74,102,66,67,194,146,133,133,181,65,53,146,220,62,11,97,132,47,127,67,2,101,203,173,224,140,206,136,150,58,222,234,31,120,51,83,194,66,66,59,190,50,141,105,97,24,53,0,149,84,82,83,200,7,108,183,111,213,100,73,94,143,15,96,177,188,102,67,2,77,233,156,86,142,162,98,14,43,37,131,83,186,248,67,2,89,139,173,96,78,116,15,220,30,221,126,185,174,123,83,8,3,44,155,47,151,60,79,21,80,169,155,47,189,208,82,2,239,144,90,18,89,17,168,250,156,135,169,187,246,197,83,40,9,108,177,164,165,109,93,12,243,87,184,141,244,14,81,170,224,50,147,230,245,47,7,50,193,205,115,195,205,69,82,2,47,174,27,90,89,209,76,168,73,209,230,166,128,75,83,40,66,44,183,228,211,100,73,78,130,21,91,234,65,238,67,34,61,249,186,187,154,33,5,197,0,184,242,181,220,108,83,194,2,135,2,118,206,57,235,172,178,113,73,176,111,13,67,194,92,93,103,231,1,107,118,79,79,63,191,204,14,143,83,0,83,69,81,65,99,85,1,0,98,10,181,114,146,88,51,196,84,85,95,237,1,105,220,124,127,83,139,169,7,43,51,136,2,113,61,237,92,212,110,95,9,120,75,135,23,42,82,196,82,85,97,237,81,164,87,146,122,139,165,108,29,5,83,0,71,57,75,59,95,81,1,0,127,152,9,53,93,198,223,37,167,127,26,45,83,170,98,126,161,184,4,226,47,81,82,72,1,108,117,253,156,180,74,61,31,168,253,222,21,18,82,2,179,136,91,57,97,129,112,200,10,115,172,42,82,165,83,2,235,192,101,51,246,113,65,116,237,18,177,2,16,41,66,2,159,177,142,222,1,60,29,4,255,105,247,223,178,95,67,2,239,65,47,252,9,16,59,44,20,201,162,106,199,74,82,2,49,65,60,204,5,232,124,144,74,89,165,170,85,133,83,2,247,225,168,47,227,103,103,74,26,148,153,182,28,0,81,138,153,50,155,166,249,44,66,123,91,117,184,63,250,142,81,74,74,76,243,254,124,247,21,77,53,98,192,92,217,97,65,138,153,82,107,197,142,175,108,248,203,224,16,187,247,128,83,194,74,202,71,89,206,43,152,180,67,119,69,31,223,139,66,2,203,98,206,243,227,55,18,163,72,190,0,32,74,200,66,2,231,153,103,22,41,87,255,183,253,191,224,247,0,60,83,2,169,160,196,42,111,173,155,1,148,16,19,36,8,163,67,194,116,113,125,185,129,145,35,166,200,177,67,134,32,19,207,5,87,95,219,175,169,85,227,212,184,255,208,245,129,134,82,136,25,44,117,253,84,16,30,223,184,82,91,84,6,153,51,196,82,81,91,237,1,235,250,125,91,188,253,41,229,164,223,37,165,221,17,183,156,133,143,189,30,215,106,168,170,49,33,42,130,225,139,38,101,105,176,167,85,16,204,104,11,68,82,196,88,85,99,241,177,0,128,189,84,135,107,140,10,132,67,2,209,37,133,90,79,203,152,128,225,12,209,81,192,202,67,2,217,160,69,94,13,56,82,168,59,143,138,243,48,142,67,2,25,96,50,74,141,175,0,204,240,157,124,255,96,244,67,34,35,202,155,4,153,178,157,205,104,76,115,185,8,157,67,2,27,50,66,53,25,104,71,132,62,131,224,110,128,72,35,208,3,76,35,54,35,220,108,198,253,11,32,7,40,54,34,80,9,165,28,213,139,58,108,197,197,154,142,176,192,242,67,2,149,211,105,47,90,0,3,2,68,216,135,96,19,57,67,40,0,131,215,207,111,140,37,182,162,194,24,105,50,140,34,172,48,67,97,146,70,252,221,163,170,47,13,176,254,185,81,10,1,172,90,28,93,124,145,2,210,102,166,180,186,87,65,138,2,140,123,121,246,155,166,97,63,133,101,54,195,186,67,2,139,20,89,163,25,17,186,206,44,148,179,142,8,18,67,2,19,83,57,171,23,179,143,134,13,127,35,248,57,129,67,2,149,208,33,43,23,245,50,101,98,129,80,95,132,64,82,34,237,78,94,61,51,4,128,225,165,116,155,237,169,234, +223,37,43,38,107,86,135,246,79,219,153,7,208,106,2,65,51,168,146,129,48,211,148,132,35,154,186,80,208,139,161,138,66,16,106,204,243,47,120,175,205,181,106,11,128,193,210,59,67,2,95,160,29,98,75,230,92,53,14,112,159,162,86,74,223,197,74,55,81,191,1,237,34,38,175,12,136,244,102,123,65,170,48,44,221,210,238,220,182,160,32,242,23,80,78,182,66,200,24,177,16,144,178,61,114,113,115,158,219,22,7,124,67,2,207,100,108,212,139,93,171,220,255,189,102,21,20,132,66,2,127,217,121,102,45,93,134,234,168,96,242,145,51,179,34,234,56,172,245,172,153,238,217,149,107,174,88,95,8,138,67,2,213,237,204,214,144,238,188,148,238,213,90,207,127,7,83,232,99,172,221,175,165,239,109,92,63,180,240,23,100,109,33,198,168,210,106,158,80,13,39,205,23,0,129,216,102,14,82,196,80,73,81,233,49,241,253,252,189,168,4,36,183,10,82,34,173,111,249,97,55,133,114,109,27,55,232,50,104,196,67,196,214,116,221,5,152,223,168,171,175,95,239,150,221,159,35,8,144,73,13,122,231,67,170,162,85,93,66,108,157,218,67,194,126,111,129,109,65,78,84,245,2,122,86,234,251,127,83,194,178,187,43,182,191,201,88,182,9,181,71,144,115,75,83,2,241,192,36,31,115,244,234,210,232,144,250,5,32,177,65,234,86,44,203,63,119,147,77,131,246,169,209,237,62,13,83,2,183,211,113,43,106,134,2,232,174,8,152,129,49,11,82,4,53,249,97,14,243,92,117,21,91,148,228,223,129,92,67,2,243,66,126,98,136,9,16,184,195,72,72,75,230,196,205,235,17,44,38,254,158,28,159,143,39,121,227,29,216,49,83,2,239,185,10,47,64,81,44,25,2,219,97,120,110,0,65,170,46,236,184,110,211,251,206,57,11,58,10,251,158,240,65,202,7,236,188,238,153,147,107,193,51,172,136,232,77,114,83,194,42,47,175,153,82,71,173,36,104,209,217,188,107,80,67,8,9,210,54,171,118,108,218,181,19,63,85,64,189,240,205,199,214,226,240,26,46,150,8,240,141,91,191,252,230,147,67,2,107,5,70,100,74,76,220,122,38,30,8,17,216,132,67,136,85,163,23,29,44,156,97,190,34,138,6,177,160,214,65,138,3,172,186,42,162,21,111,211,186,151,156,137,89,151,82,2,145,82,149,70,123,128,226,235,241,144,243,188,218,71,82,2,85,96,86,232,219,128,105,37,16,182,199,24,244,64,66,2,45,8,56,202,124,21,124,199,108,63,131,122,189,96,83,2,9,45,53,97,81,15,150,17,148,149,32,162,21,197,66,2,89,0,93,132,117,51,41,89,248,129,114,32,215,194,82,104,11,21,195,89,163,49,22,77,24,97,27,247,97,163,65,234,4,108,109,214,175,249,199,233,128,24,45,245,237,151,83,2,123,216,99,47,134,0,56,61,1,99,71,218,231,201,66,36,179,71,157,181,111,146,70,189,229,246,89,88,5,90,83,40,1,108,177,101,202,242,188,53,201,218,109,89,2,25,83,2,249,204,15,59,53,157,237,20,105,47,0,126,246,176,51,72,135,41,126,7,219,132,182,89,86,69,169,38,222,215,66,2,19,175,51,105,221,54,255,25,144,87,226,189,21,214,82,2,11,241,245,210,86,89,47,144,236,131,119,155,238,108,66,2,159,47,183,227,219,49,85,144,213,221,230,19,24,225,82,40,75,44,42,187,243,80,217,218,92,2,165,113,244,49,67,2,241,119,70,231,81,0,226,175,239,181,26,219,63,205,82,34,155,143,252,157,55,37,255,143,155,107,121,204,214,207,83,194,22,35,39,87,68,59,168,184,113,222,8,253,42,102,67,2,243,117,62,103,143,24,64,172,217,251,202,61,39,181,67,2,233,243,29,83,141,93,47,212,55,12,226,55,169,223,67,2,243,120,102,103,19,128,100,107,217,62,75,27,227,166,67,2,243,115,22,99,15,138,246,15,204,231,94,23,59,132,67,2,235,20,38,91,79,255,86,215,249,113,158,161,56,78,83,194,174,58,190,163,103,20,95,70,115,32,86,99,219,10,67,194,192,169,163,169,65,154,38,234,105,15,175,147,72,119, +83,2,253,240,162,39,41,183,157,118,40,43,89,52,1,66,65,234,59,172,44,107,146,146,235,178,215,71,113,90,66,136,83,240,184,106,174,177,183,127,111,138,102,126,82,167,108,192,67,8,35,76,236,245,210,189,221,47,29,108,246,237,5,158,65,138,2,44,75,115,182,247,236,33,31,115,21,131,70,221,65,138,14,236,58,234,146,175,201,105,120,231,34,129,89,228,83,2,187,216,68,47,41,237,94,114,169,166,228,12,69,200,83,2,115,216,227,43,2,83,187,5,97,139,16,38,1,161,65,138,50,108,8,3,19,131,160,56,179,125,19,90,2,126,67,2,239,35,95,124,75,58,255,1,72,87,2,96,226,19,67,2,159,94,250,173,159,84,5,218,252,179,31,241,181,140,66,2,229,135,105,193,184,0,80,119,2,190,42,200,161,38,66,2,207,240,210,188,225,62,237,2,85,19,217,185,217,213,67,2,111,76,175,250,77,61,231,38,205,36,240,208,141,96,35,176,233,74,93,89,158,189,99,24,166,137,238,71,60,45,82,196,80,81,93,239,145,109,77,126,163,159,175,162,217,147,65,2,85,67,81,63,101,83,1,192,31,104,198,233,253,218,66,2,219,227,86,175,231,21,228,222,2,244,1,178,29,187,51,36,155,208,9,57,156,119,170,82,187,165,209,58,0,248,35,40,16,17,21,181,117,94,53,213,53,159,74,85,199,233,51,196,86,89,99,243,1,8,248,212,86,242,75,73,146,0,223,197,102,103,119,207,129,95,19,253,160,101,67,114,13,41,67,2,149,183,129,169,25,32,142,68,197,53,37,126,197,209,67,8,43,76,203,13,207,119,190,162,88,0,124,34,138,73,83,2,237,200,133,39,138,250,243,52,23,195,109,236,119,6,83,2,173,176,100,43,20,99,24,48,32,187,113,66,250,246,67,2,219,230,117,246,11,34,34,9,156,78,42,6,190,89,83,2,239,200,132,35,55,149,158,214,106,80,215,239,40,9,83,2,139,55,63,125,148,18,3,164,38,114,237,48,238,14,81,2,197,49,224,77,254,161,0,146,129,138,169,193,44,226,83,194,14,134,2,188,168,188,23,65,120,183,17,118,255,18,81,42,194,114,217,44,188,61,128,86,173,218,188,18,96,160,67,72,26,108,207,247,227,181,219,174,155,156,130,64,104,1,83,194,6,135,2,51,160,92,105,222,224,246,146,66,108,58,67,194,96,95,105,173,1,109,29,90,179,235,28,155,178,254,83,194,62,67,190,85,90,81,32,5,66,17,19,88,28,167,82,34,245,109,108,173,31,177,162,22,179,46,192,56,19,218,82,168,6,44,45,253,60,156,94,77,31,120,139,46,109,145,51,36,41,254,9,53,28,148,80,199,201,242,70,89,182,167,222,5,75,71,71,67,95,87,129,186,157,0,0,0,108,61,51,36,171,252,41,181,28,227,240,244,142,105,89,152,29,69,49,170,176,201,165,60,251,141,99,198,129,144,228,34,77,229,83,2,169,160,228,50,8,74,73,168,178,198,247,83,223,185,83,2,169,160,198,58,76,230,139,112,217,152,16,79,152,8,82,2,21,0,9,177,225,240,128,128,203,172,48,81,251,203,66,2,49,236,61,186,176,59,18,98,118,110,144,59,128,58,82,40,17,195,134,53,177,121,198,63,9,98,231,64,13,183,67,2,149,171,225,170,18,201,123,138,152,7,229,190,192,58,51,4,51,1,69,196,137,157,44,137,105,106,3,105,187,190,82,168,0,213,235,95,138,97,215,58,26,184,239,115,220,2,67,40,2,131,135,87,189,244,124,183,33,30,245,188,170,10,67,136,2,195,149,207,245,212,191,239,33,172,123,224,242,59,67,40,2,85,215,172,182,242,100,215,0,37,230,16,35,162,82,4,101,217,24,14,85,164,16,226,34,8,87,218,189,99,82,2,85,82,199,70,255,48,158,65,22,102,74,136,132,16,67,232,5,213,241,207,18,64,135,151,3,87,173,225,179,0,82,2,21,30,230,71,87,177,245,53,81,85,94,1,227,127,67,2,23,203,209,46,146,168,65,172,211,56,163,127,46,130,67,2,81,129,52,84,12,238,72,52,27,192,63,6,151,8,82,4,109,192,138,79,179,32,149,200,164,2,169,62,138,220, +223,241,67,172,214,43,147,114,219,86,171,177,47,67,14,252,221,11,1,113,86,137,35,115,109,214,10,45,206,172,173,235,83,2,165,137,166,50,169,149,52,153,252,29,178,221,156,107,33,198,146,72,105,153,181,126,36,104,137,166,164,201,78,247,82,2,255,12,207,125,227,200,78,136,56,89,105,173,45,96,83,194,230,239,218,25,25,12,69,121,109,251,245,145,215,206,82,2,175,188,12,87,247,88,165,135,173,74,51,201,42,56,83,232,70,236,245,118,101,135,127,142,160,82,75,144,59,239,67,2,71,41,140,212,140,164,142,15,44,31,244,77,238,107,67,136,40,108,42,181,238,167,210,107,157,113,207,225,153,136,223,37,171,219,217,45,31,127,221,215,65,254,127,116,20,128,66,8,2,177,244,19,149,95,20,244,52,159,221,101,235,9,81,2,95,61,73,41,89,65,1,246,151,220,12,157,198,87,82,196,90,79,85,235,241,242,253,175,229,234,82,18,51,2,67,194,130,113,131,59,1,87,191,183,0,85,77,22,27,249,82,2,99,255,74,31,255,72,128,197,51,238,121,219,251,86,83,8,9,172,116,156,165,51,75,164,42,50,123,105,147,26,67,2,249,240,246,228,17,184,252,131,53,142,191,183,170,125,67,40,81,227,101,159,60,239,251,111,32,122,27,227,199,154,83,2,113,186,8,51,49,229,168,231,127,16,235,84,33,36,67,2,241,7,143,244,11,131,36,250,142,114,45,239,94,134,83,72,7,44,113,134,207,163,138,124,179,176,133,29,41,130,83,168,48,108,147,149,15,231,93,252,208,75,251,20,132,139,65,106,13,149,187,203,207,211,11,64,206,130,121,133,91,32,67,2,189,101,140,192,73,34,103,132,144,187,237,14,40,190,82,2,169,106,12,226,219,88,131,179,31,226,16,160,18,65,83,40,9,140,193,58,123,150,119,148,23,18,163,9,54,231,66,2,105,152,249,150,61,17,18,215,66,177,14,24,27,136,67,2,113,74,182,222,139,15,17,184,132,224,156,101,227,252,83,104,5,140,233,122,85,149,99,47,126,192,135,88,154,124,83,2,247,208,6,39,4,0,28,5,4,119,121,120,254,142,82,168,46,210,227,169,97,158,221,193,37,177,99,126,71,142,51,136,147,97,119,140,117,165,101,150,154,16,70,159,137,109,67,80,33,204,250,203,177,118,236,157,69,183,176,206,182,17,83,200,66,181,148,250,7,61,84,6,175,180,33,252,12,245,81,74,26,108,107,254,28,180,12,1,74,151,224,79,196,39,82,2,85,125,118,75,77,161,131,32,133,166,142,125,113,28,83,2,139,53,86,97,254,188,13,125,247,24,13,168,0,97,66,2,177,136,193,8,62,83,188,6,201,167,239,186,122,226,66,2,181,132,61,74,127,54,72,135,67,210,126,160,42,123,82,4,105,200,202,95,243,128,218,229,125,129,164,55,137,112,82,2,145,86,21,43,119,129,85,237,179,246,57,29,123,70,82,2,35,226,136,240,72,193,100,164,78,228,222,136,0,66,67,2,233,96,22,226,138,10,81,244,192,200,92,8,167,102,83,232,4,236,152,220,165,59,73,196,223,176,237,251,145,116,82,2,83,221,197,187,220,88,95,154,201,25,237,3,101,30,82,2,207,205,52,150,196,8,152,54,148,15,94,171,0,159,67,40,75,12,77,46,219,211,227,113,158,162,73,179,161,7,83,40,2,172,118,156,147,242,58,22,17,249,88,238,3,117,66,2,167,186,58,165,223,19,33,208,111,182,223,82,155,81,82,2,75,251,245,211,242,4,8,253,165,53,111,50,69,148,66,2,15,103,171,125,27,90,236,247,8,182,40,225,132,158,82,34,105,79,183,61,72,153,90,60,95,252,255,199,196,236,67,2,227,207,253,80,75,25,155,198,208,126,35,142,184,251,66,72,0,213,237,51,243,221,91,62,190,10,244,222,231,47,67,2,233,17,22,207,11,163,19,184,57,107,93,44,118,35,67,2,111,52,30,93,142,188,65,222,91,81,139,245,234,189,67,2,117,113,6,217,76,176,23,33,77,50,146,6,127,34,67,194,174,153,125,69,129,1,17,137,200,32,97,231,57,221,83,194,170,183,59,149,33,162,80,166,199,235,77,239,83,160, diff --git a/screens/mainscreen/images/Untitled-2_Converted.png b/screens/mainscreen/images/Untitled-2_Converted.png new file mode 100644 index 0000000..d2a49d3 Binary files /dev/null and b/screens/mainscreen/images/Untitled-2_Converted.png differ diff --git a/screens/mainscreen/images/pink.bin b/screens/mainscreen/images/pink.bin new file mode 100644 index 0000000..06cb17b Binary files /dev/null and b/screens/mainscreen/images/pink.bin differ diff --git a/screens/mainscreen/images/pink.binh b/screens/mainscreen/images/pink.binh new file mode 100644 index 0000000..e1162d2 --- /dev/null +++ b/screens/mainscreen/images/pink.binh @@ -0,0 +1,2 @@ +/*('file properties: ', 'resolution ', 162, 'x', 146, 'format ', 'RGB565', 'stride ', 324, ' total size ', 47304)*/ +120,156,237,214,65,14,131,32,16,5,208,163,112,20,143,226,209,60,154,215,176,209,58,45,65,91,168,161,203,38,77,30,111,51,32,171,159,1,73,75,2,0,0,0,0,0,0,0,0,0,0,0,0,254,94,52,35,45,243,126,214,211,150,150,113,45,245,176,94,119,82,155,111,17,113,59,234,61,231,85,196,115,125,92,203,234,117,39,181,156,204,124,36,19,31,25,182,137,213,59,169,213,221,85,103,152,103,209,164,168,15,123,162,201,48,142,81,230,243,61,215,175,46,149,97,71,116,251,176,152,182,243,123,56,203,29,237,125,56,94,50,124,39,235,62,236,233,253,83,166,45,191,111,210,50,228,23,142,62,252,170,205,48,142,145,243,59,103,238,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,223,120,0,161,91,25,185, \ No newline at end of file diff --git a/screens/mainscreen/images/pink.json b/screens/mainscreen/images/pink.json new file mode 100644 index 0000000..ff3b18d --- /dev/null +++ b/screens/mainscreen/images/pink.json @@ -0,0 +1 @@ +{"name": "pink", "type": "bitmap", "format": "RGB565", "width": 162, "height": 146, "compressed": 1} \ No newline at end of file diff --git a/screens/mainscreen/images/pink.meta b/screens/mainscreen/images/pink.meta new file mode 100644 index 0000000..72b456c --- /dev/null +++ b/screens/mainscreen/images/pink.meta @@ -0,0 +1,5 @@ +{ + "converter": "Image", + "imageFormat": 7, + "sourcePath": "Q:/pink.png" +} diff --git a/screens/mainscreen/images/pink.raw b/screens/mainscreen/images/pink.raw new file mode 100644 index 0000000..5be4ffa --- /dev/null +++ b/screens/mainscreen/images/pink.raw @@ -0,0 +1 @@ +øøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøø˙˙˙˙˙˙˙˙˙˙˙˙˙˙øßū˙˙˙˙˙˙˙˙Ÿüø_û˙˙˙˙˙˙?ûø˙˙˙˙˙˙˙˙˙˙˙˙˙˙øøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøßų˙˙˙ųøøøßū?ûøøøø˙ų˙˙_ûøøßūøøøßų˙˙˙ųøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøßų˙˙ßųøøø˙ū?ûøøøø˙ų˙˙˙ųøøøøøøßų˙˙ßųøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøßų˙˙˙ųøøø˙ū?ûøøøøø˙ū˙˙˙ųøøøøøßų˙˙˙ųøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøø˙ų˙˙˙ųøøø˙ū˙˙˙˙˙˙˙˙øøøßũ˙˙˙˙ßųøøø˙ų˙˙˙ųøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøø˙ų˙˙˙ųøøø˙ū?ûøøøøøøøøŸü˙˙˙ųøø˙ų˙˙ßųøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøßų˙˙ßųøøø˙ū_ûøøøøøøøøø˙ū?ûøøßų˙˙ßųøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøßų˙˙ßųøøø˙ū?ûøøøøŸüŸüøø?û˙˙˙ųøø˙ų˙˙ßųøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøßų˙˙ßųøøø˙ū˙˙˙˙˙˙˙˙Ÿüø˙ū˙˙˙˙˙˙ßųøøø˙ų˙˙˙ųøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøø \ No newline at end of file diff --git a/screens/mainscreen/images/pink.rawh b/screens/mainscreen/images/pink.rawh new file mode 100644 index 0000000..4e1c4ac --- /dev/null +++ b/screens/mainscreen/images/pink.rawh @@ -0,0 +1,741 @@ +/*('file properties: ', 'resolution ', 162, 'x', 146, 'format ', 'RGB565', 'stride ', 324, ' total size ', 47304)*/ +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,248,223,254,255,255,255,255, +255,255,255,255,159,252,31,248,95,251,255,255,255,255,255,255,63,251,31,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,223,249,255,255,255,249,31,248,31,248,31,248,223,254, +63,251,31,248,31,248,31,248,31,248,255,249,255,255,95,251,31,248,31,248,223,254,31,248,31,248,31,248,223,249,255,255,255,249,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,223,249,255,255,223,249,31,248,31,248, +31,248,255,254,63,251,31,248,31,248,31,248,31,248,255,249,255,255,255,249,31,248,31,248,31,248,31,248,31,248,31,248,223,249,255,255,223,249,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,223,249,255,255,255,249, +31,248,31,248,31,248,255,254,63,251,31,248,31,248,31,248,31,248,31,248,255,254,255,255,255,249,31,248,31,248,31,248,31,248,31,248,223,249,255,255,255,249,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,255,249, +255,255,255,249,31,248,31,248,31,248,255,254,255,255,255,255,255,255,255,255,31,248,31,248,31,248,223,253,255,255,255,255,223,249,31,248,31,248,31,248,255,249,255,255,255,249,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,255,249,255,255,255,249,31,248,31,248,31,248,255,254,63,251,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,159,252,255,255,255,249,31,248,31,248,255,249,255,255,223,249,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,223,249,255,255,223,249,31,248,31,248,31,248,255,254,95,251,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,255,254,63,251,31,248,31,248,223,249,255,255,223,249,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,223,249,255,255,223,249,31,248,31,248,31,248,255,254,63,251,31,248,31,248,31,248,31,248,159,252,159,252,31,248,31,248,63,251,255,255,255,249,31,248,31,248,255,249,255,255,223,249,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,223,249,255,255,223,249,31,248,31,248,31,248,255,254,255,255,255,255,255,255,255,255,159,252,31,248,255,254,255,255,255,255,255,255,223,249,31,248,31,248,31,248,255,249,255,255,255,249,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248,31,248, +31,248,31,248,31,248,31,248, \ No newline at end of file diff --git a/screens/mainscreen/images/pink_Converted.png b/screens/mainscreen/images/pink_Converted.png new file mode 100644 index 0000000..331dafc Binary files /dev/null and b/screens/mainscreen/images/pink_Converted.png differ diff --git a/screens/mainscreen/mainscreen.ese b/screens/mainscreen/mainscreen.ese new file mode 100644 index 0000000..2986353 --- /dev/null +++ b/screens/mainscreen/mainscreen.ese @@ -0,0 +1,62 @@ +{ + "content": [ + { + "converter": "Image", + "dataCompressed": true, + "dataStorage": "Embedded", + "destName": "images/pink", + "imageFormat": 7, + "memoryAddress": 0, + "memoryLoaded": true, + "sourcePath": "Q:/pink.png" + }, + { + "converter": "Font", + "dataCompressed": false, + "dataStorage": "Embedded", + "destName": "fonts/verdana", + "fontCharSet": " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~", + "fontOffset": 32, + "fontSize": 12, + "imageFormat": 2, + "memoryAddress": 100000, + "memoryLoaded": true, + "sourcePath": "Q:/fonts/Helvetica.ttf" + } + ], + "coprocessor": [ + "CLEAR_COLOR_RGB(40, 0, 0)", + "CLEAR(1, 1, 1)", + "COLOR_RGB(116, 116, 116)", + "COLOR_A(100)", + "BEGIN(RECTS)", + "LINE_WIDTH(80)", + "VERTEX2II(97, 154, 0, 0)", + "VERTEX2II(222, 85, 0, 0)", + "END()", + "COLOR_RGB(255,255,255)", + "COLOR_A(255)", + "CMD_SETFONT2(15, 100000, 32)", + "", + "CMD_TEXT(160, 120, 29, OPT_CENTER, \"Change to\\nALIVE?d\")", + "", + "", + "DISPLAY()", + "", + "", + "" + ], + "displayList": [ + "" + ], + "project": { + "device": 2069 + }, + "registers": { + "hSize": 320, + "macro": [ + "" + ], + "vSize": 240 + } +} diff --git a/screens/mainscreen/resources/0.png b/screens/mainscreen/resources/0.png new file mode 100644 index 0000000..c776c9f Binary files /dev/null and b/screens/mainscreen/resources/0.png differ diff --git a/screens/mainscreen/resources/Untitled-2.jpg b/screens/mainscreen/resources/Untitled-2.jpg new file mode 100644 index 0000000..988b33a Binary files /dev/null and b/screens/mainscreen/resources/Untitled-2.jpg differ diff --git a/screens/mainscreen/resources/calibri.ttf b/screens/mainscreen/resources/calibri.ttf new file mode 100644 index 0000000..aac4726 Binary files /dev/null and b/screens/mainscreen/resources/calibri.ttf differ diff --git a/screens/mainscreen/resources/calibri_2.ttf b/screens/mainscreen/resources/calibri_2.ttf new file mode 100644 index 0000000..aac4726 Binary files /dev/null and b/screens/mainscreen/resources/calibri_2.ttf differ diff --git a/screens/mainscreen/resources/calibri_6_L8.raw b/screens/mainscreen/resources/calibri_6_L8.raw new file mode 100644 index 0000000..5b2a61e Binary files /dev/null and b/screens/mainscreen/resources/calibri_6_L8.raw differ diff --git a/screens/mainscreen/resources/pink.png b/screens/mainscreen/resources/pink.png new file mode 100644 index 0000000..107eaa8 Binary files /dev/null and b/screens/mainscreen/resources/pink.png differ diff --git a/screens/mainscreen/resources/verdana.ttf b/screens/mainscreen/resources/verdana.ttf new file mode 100644 index 0000000..9a34997 Binary files /dev/null and b/screens/mainscreen/resources/verdana.ttf differ diff --git a/screens/ms2/images/0.bin b/screens/ms2/images/0.bin new file mode 100644 index 0000000..74e1a32 Binary files /dev/null and b/screens/ms2/images/0.bin differ diff --git a/screens/ms2/images/0.binh b/screens/ms2/images/0.binh new file mode 100644 index 0000000..4557888 --- /dev/null +++ b/screens/ms2/images/0.binh @@ -0,0 +1,2 @@ +/*('file properties: ', 'resolution ', 244, 'x', 244, 'format ', 'COMPRESSED_RGBA_ASTC_4x4_KHR', 'stride ', 976, ' total size ', 59536)*/ +120,156,44,122,119,60,86,239,255,255,113,220,184,109,146,85,217,202,204,12,73,196,125,100,103,156,147,157,77,246,202,10,41,162,50,179,119,118,246,202,46,146,140,144,172,236,17,55,217,123,133,36,249,157,247,231,251,251,243,122,156,115,174,215,117,94,175,215,245,28,231,58,179,229,196,164,192,231,227,91,57,149,242,67,156,187,0,128,96,193,216,128,25,26,0,144,7,20,72,31,112,144,67,171,178,131,165,72,223,78,150,227,235,75,164,211,115,177,72,55,41,37,0,148,167,11,18,238,71,4,168,96,1,206,222,255,198,5,205,172,87,15,207,103,248,3,203,117,200,194,48,181,158,223,18,184,6,51,211,88,22,51,214,112,106,61,113,243,253,241,108,119,106,99,69,254,17,29,207,112,106,171,196,103,24,20,1,0,240,229,74,18,195,202,23,116,62,82,0,96,23,84,78,138,46,162,228,36,3,96,21,42,43,46,198,79,143,7,78,72,64,135,223,191,238,64,24,173,71,35,69,156,153,213,23,210,222,171,253,228,45,227,250,95,252,93,98,163,239,21,84,186,196,205,58,240,46,107,235,211,233,167,174,132,64,182,97,212,159,1,0,23,74,37,96,197,90,175,254,88,14,255,162,81,141,156,20,178,187,214,126,63,235,93,197,147,74,235,105,182,249,247,105,184,65,83,102,32,240,220,167,139,228,21,103,22,99,4,0,239,102,174,7,224,135,4,208,53,216,183,105,156,1,80,12,123,89,102,197,182,243,152,12,194,30,233,19,72,132,128,254,67,188,82,122,49,139,129,225,202,6,153,220,15,97,109,1,122,64,158,79,96,203,147,217,40,62,148,19,248,191,245,3,73,142,209,169,177,88,10,82,64,193,65,212,205,237,145,192,107,91,218,237,84,201,27,108,214,176,202,21,183,220,212,213,96,165,146,206,162,31,97,127,115,33,109,29,90,52,126,243,45,87,190,187,202,180,62,192,255,229,83,184,132,129,144,158,237,215,58,57,128,128,149,173,106,226,255,116,238,63,195,112,60,98,226,206,131,85,128,152,202,198,107,78,130,98,235,138,214,199,176,239,44,45,125,251,240,248,142,150,15,9,0,28,197,70,134,208,197,208,89,69,233,79,129,0,192,180,146,40,236,187,166,80,66,248,206,205,219,88,110,224,237,120,46,114,195,152,6,42,34,12,126,174,39,245,247,83,101,238,104,10,84,102,244,191,120,159,191,144,251,16,70,205,245,114,145,0,176,182,14,51,96,158,44,170,186,241,250,166,116,20,7,0,129,227,118,95,230,94,199,18,25,86,214,92,54,11,255,134,128,194,173,157,98,178,95,30,169,213,16,184,37,115,210,42,244,160,207,7,134,69,80,115,55,78,167,18,49,252,255,245,23,54,222,32,185,126,193,54,0,157,15,227,255,244,228,171,104,106,191,170,248,242,213,163,99,26,40,212,226,221,215,133,165,250,228,59,202,62,139,187,92,100,56,237,246,32,19,249,240,195,184,102,111,108,122,12,53,128,27,196,66,195,98,250,22,153,173,242,236,211,137,60,104,252,13,220,195,159,234,182,55,163,43,162,14,197,67,246,16,240,250,7,101,41,87,191,236,210,151,113,110,189,162,4,184,208,162,214,248,164,83,151,82,22,32,136,210,244,12,64,84,200,137,46,98,73,162,245,8,91,246,158,243,16,161,249,19,254,64,44,19,18,198,16,163,125,108,228,165,28,140,128,85,141,235,114,61,41,145,214,247,20,75,92,226,206,185,220,28,57,108,77,8,128,185,41,199,212,234,66,47,129,255,213,195,237,195,113,133,115,209,39,190,68,102,52,190,225,195,0,189,104,13,179,247,96,205,202,39,186,103,226,24,91,17,98,147,120,236,189,112,42,2,39,204,46,4,105,127,191,4,0,63,50,106,52,205,175,221,92,176,0,56,105,232,115,248,119,18,107,14,208,10,216,61,191,40,10,99,118,142,188,139,17,206,73,197,250,216,114,179,219,201,72,209,171,156,194,98,45,239,4,163,245,54,93,62,146,52,180,126,92,105,135,206,254,163,4,0,160,244,107,15,16,143,161,105,207,123,229,172,203,2,0,15,213,102,178,170,16,94,169,200,53,111,227,200,249,47,198,31,76,210,171,246,33,149,80,139,175,235,211,173,81,187,58,164,198,27,135,187,56,187,38,210,178,220,209,174,3,54,32,136,205,117,6,128,254,151,255,155,5,181,135,193,51,46,205,222,0,14,52,190,55,93,82,44,203,152,237,15,53,121,212,52,65,224,0,54,99,140,90,51,149,150,243,71,170,199,147,76,177,24,162,121,191,128,141,102,102,0,8,60,226,53,249,255,245,235,98,59,36,73,14,44,219,32,70,159,183,245,183,244,45,214,123,215,34,65,119,234,34,236,12,129,58,130,51,83,113,122,66,67,179,183,40,21,207,186,68,255,171,63,176,154,243,21,7,204,202,242,235,126,164,211,86,156,247,55,122,127,252,246,191,247,39,191,196,8,129,90,100,249,83,218,206,189,172,182,29,97,206,30,132,8,104,155,218,45,183,83,242,233,238,143,225,111,20,68,188,255,215,127,119,111,29,146,128,13,158,51,196,255,63,62,79,233,13,194,233,101,167,32,18,52,255,186,14,205,15,98,75,127,90,202,234,58,142,239,179,208,97,51,114,182,126,244,95,103,252,247,181,202,196,132,210,27,30,148,66,251,85,56,245,170,114,244,103,87,155,75,0,231,187,235,232,171,56,212,249,139,79,188,229,190,152,184,131,128,246,217,29,146,4,57,42,217,233,242,149,237,157,147,184,208,84,123,61,218,132,172,207,138,18,84,128,188,219,141,255,245,47,64,120,151,114,209,157,241,134,27,21,32,254,191,248,230,54,166,118,84,57,65,111,85,114,112,161,179,246,63,195,44,247,234,251,70,13,201,192,210,50,100,149,179,247,220,133,164,107,167,247,246,162,236,158,107,195,255,173,247,222,165,99,18,64,58,216,152,0,192,117,147,114,0,236,128,188,174,4,67,150,183,68,210,57,132,241,74,24,193,230,127,142,165,121,96,244,252,207,136,35,36,178,226,100,164,86,26,117,193,210,78,236,58,93,72,58,231,127,248,1,216,189,221,87,147,230,123,97,116,255,13,151,182,76,142,94,9,218,143,10,201,169,223,61,31,210,32,109,114,119,238,48,143,157,153,251,28,74,3,8,83,36,212,22,24,16,252,69,225,166,228,231,228,24,51,193,180,53,133,158,48,50,20,111,222,152,243,142,186,155,137,82,0,136,157,12,237,203,5,102,166,32,182,56,151,158,199,232,126,2,239,152,65,59,120,9,58,86,31,75,57,199,24,81,4,75,56,250,207,49,159,140,145,4,31,237,114,205,41,22,126,28,233,36,4,4,54,72,73,198,6,202,58,145,1,98,187,172,54,149,215,125,135,70,137,129,64,107,246,135,5,232,250,107,199,82,56,129,183,47,181,7,180,211,228,74,97,10,251,185,162,22,49,62,48,149,197,98,187,240,110,0,204,251,205,226,157,132,205,214,101,128,160,45,234,95,15,65,191,142,34,145,102,168,248,9,230,14,0,24,244,125,39,192,9,134,89,235,145,228,229,135,253,218,239,39,166,199,20,227,137,190,114,191,188,17,17,19,80,31,62,95,44,145,92,140,227,253,166,58,249,204,113,176,153,10,8,210,243,52,6,240,95,255,151,127,69,35,229,154,221,235,44,28,52,179,124,61,170,69,248,212,249,239,132,91,230,135,131,222,210,240,170,117,245,37,231,178,193,47,116,130,214,46,43,70,126,72,76,252,178,25,26,107,144,117,134,248,181,50,57,138,183,50,123,79,235,1,106,172,193,159,179,120,66,16,152,13,43,226,131,79,82,63,167,41,46,38,140,232,6,137,192,69,4,186,22,15,98,66,83,77,89,83,219,255,152,250,209,209,208,183,250,254,94,188,227,141,38,209,142,120,98,149,227,127,253,64,115,230,144,76,33,28,4,12,2,10,252,118,186,82,223,243,195,40,177,242,83,187,3,133,246,112,17,177,54,206,144,207,138,144,179,128,134,214,243,31,47,76,67,79,72,45,30,149,202,8,4,42,172,223,80,35,152,253,223,250,63,167,58,22,172,217,239,222,188,77,128,83,9,42,30,185,91,169,77,249,243,181,82,163,132,86,27,140,145,197,159,206,184,159,200,221,102,123,181,50,23,37,134,226,197,146,236,228,97,187,14,15,0,168,52,38,113,247,211,154,209,162,75,1,152,228,42,211,99,104,212,1,116,76,218,182,74,0,100,91,135,72,27,98,180,218,250,41,193,188,170,229,141,255,248,152,250,152,158,122,10,218,181,110,45,234,106,62,0,128,75,180,214,110,32,33,238,34,125,182,65,195,126,98,76,117,70,195,236,62,117,32,210,173,91,151,84,93,201,239,79,236,166,92,45,180,44,137,104,7,247,204,62,211,59,243,127,189,186,101,130,139,153,215,233,33,21,116,188,126,60,134,236,155,79,62,121,80,76,140,196,252,115,136,230,109,216,206,10,15,2,59,177,109,24,220,122,83,72,249,143,119,47,164,132,8,118,149,83,196,101,17,21,96,161,77,223,217,193,231,149,47,171,189,2,63,19,174,44,216,250,39,175,77,62,193,213,108,246,223,137,229,194,144,10,149,219,73,253,217,77,38,217,139,95,45,62,64,170,208,42,239,96,219,184,243,199,7,222,196,236,59,141,63,55,20,214,173,54,237,207,215,126,248,4,1,58,171,109,185,120,24,35,157,150,154,169,163,246,99,180,77,212,21,39,147,12,131,31,74,168,43,166,221,94,12,135,171,4,236,28,150,67,69,230,135,31,27,142,247,23,198,2,91,182,253,196,1,142,240,154,249,170,3,151,112,161,12,109,147,36,114,115,103,36,148,104,243,44,64,255,56,32,159,123,239,194,212,245,45,100,85,166,247,212,79,119,39,192,249,8,47,207,225,249,29,26,44,11,239,119,184,28,178,103,97,105,80,85,213,26,132,128,13,147,97,2,246,18,231,167,110,177,151,149,3,187,197,54,25,23,126,155,167,159,101,87,122,211,205,55,76,79,43,56,16,109,110,33,89,251,11,131,56,251,222,57,34,12,212,113,255,152,133,239,76,248,61,248,224,189,36,153,190,157,2,25,40,40,221,223,82,153,118,181,202,72,36,167,7,128,48,233,105,83,115,245,212,69,120,163,79,223,102,91,132,20,200,46,5,43,59,82,38,210,225,142,204,137,165,210,104,144,110,18,171,152,156,141,217,179,151,215,121,167,119,175,202,225,137,186,58,223,152,70,96,70,26,172,107,156,113,167,17,120,162,187,185,158,157,225,220,215,99,18,38,224,35,106,25,8,203,114,120,94,247,238,119,220,44,32,60,223,206,32,12,99,92,55,114,211,15,254,48,36,51,6,222,167,90,85,135,85,152,118,163,30,91,171,183,210,119,118,92,112,11,196,244,145,148,10,238,43,197,44,214,49,28,255,129,31,242,16,224,118,169,173,242,38,60,202,211,142,103,179,71,158,112,146,112,16,103,53,79,37,100,241,112,179,79,51,229,76,42,19,225,54,107,21,141,164,215,242,247,203,179,221,127,243,231,59,160,122,104,151,140,75,147,250,153,192,253,71,242,228,223,236,97,12,219,71,251,168,131,219,47,132,211,190,47,78,19,146,66,19,43,29,70,7,119,156,241,36,160,157,221,148,152,19,4,58,47,185,252,34,247,102,191,120,86,165,121,232,185,140,216,189,32,32,225,139,122,85,76,251,145,202,63,250,128,14,1,165,166,74,164,58,213,231,156,217,190,103,108,14,177,34,160,215,176,43,50,167,55,212,96,219,114,240,84,73,23,2,125,66,163,143,52,99,125,94,146,230,181,93,10,28,134,65,143,145,31,166,1,88,166,168,197,38,79,143,245,151,8,120,240,97,77,46,127,51,193,63,118,193,214,205,187,26,2,91,175,133,244,107,82,132,191,103,30,107,150,112,114,230,220,36,58,196,11,29,174,55,112,93,155,202,165,158,210,134,185,51,210,51,252,196,192,118,37,21,238,11,29,69,41,48,134,78,234,252,68,92,240,251,153,167,180,174,92,144,61,204,125,150,174,255,231,226,75,245,216,203,91,6,75,222,148,72,232,237,186,177,141,62,148,111,30,59,173,30,142,109,65,160,21,217,39,75,205,115,250,25,161,7,183,166,87,22,17,176,102,208,70,234,92,231,183,240,221,1,156,41,199,152,2,25,215,102,163,235,203,27,60,92,132,17,0,29,254,55,2,186,183,146,200,228,191,94,81,115,214,78,46,16,113,128,192,149,56,57,87,189,95,162,126,212,203,14,116,35,9,16,184,213,183,236,162,51,16,86,126,93,238,248,73,130,7,164,162,181,144,151,188,137,223,119,125,27,120,173,105,118,26,2,245,31,38,142,197,246,43,125,9,97,23,125,174,200,4,129,211,78,75,70,241,174,189,209,71,71,14,163,165,24,8,28,166,58,156,130,83,250,58,202,55,78,175,44,239,32,216,203,78,53,75,7,182,90,122,211,211,115,117,177,23,33,78,14,166,231,226,198,94,13,73,254,79,20,144,227,89,152,115,201,217,46,140,237,123,126,112,68,211,210,163,245,114,152,243,170,42,111,14,75,254,45,7,226,206,143,248,131,126,28,136,63,153,125,82,40,93,59,253,108,218,191,38,85,132,147,159,42,111,184,224,172,178,37,48,170,230,192,131,110,24,229,215,216,195,217,56,179,141,143,150,102,248,29,63,18,24,20,31,185,114,231,112,162,247,27,213,208,239,223,79,178,16,112,163,120,85,206,173,76,247,56,211,38,163,122,44,26,94,101,84,159,82,180,60,46,220,97,108,164,181,42,117,68,192,242,162,46,185,200,10,210,174,7,14,21,186,62,107,56,112,244,133,245,144,171,204,12,225,89,56,35,150,252,51,58,223,28,185,196,6,54,144,10,241,176,228,215,122,129,3,103,136,236,96,103,35,221,58,93,129,67,226,97,21,49,222,160,226,239,12,142,156,12,101,179,161,29,13,148,226,56,110,233,223,62,46,94,128,241,161,182,174,145,190,63,173,14,86,63,241,216,241,167,59,241,114,101,174,126,203,229,37,28,40,91,123,143,251,240,118,114,210,242,228,195,19,237,120,92,55,225,225,65,153,77,151,171,239,162,246,238,193,223,191,104,255,190,221,8,163,229,8,35,142,15,228,78,45,254,161,83,196,89,61,172,65,30,251,253,165,243,163,23,251,254,207,32,17,233,94,252,157,241,103,51,149,209,90,151,44,201,70,102,212,223,204,247,151,35,25,113,178,68,169,119,232,139,137,80,190,220,80,254,128,103,97,254,64,43,147,89,249,137,10,2,241,253,68,22,175,183,167,246,183,71,213,206,100,72,160,182,208,87,81,77,10,82,215,154,41,153,71,96,138,6,164,173,191,95,61,61,64,60,44,164,78,251,171,116,151,35,212,230,237,225,27,171,160,65,215,20,96,228,24,93,57,2,181,61,241,125,54,169,112,166,44,241,199,253,140,77,84,22,229,239,103,193,45,65,180,141,5,183,27,207,131,155,174,195,88,125,167,191,139,158,55,88,89,84,237,44,210,226,26,32,78,153,15,17,178,198,76,215,94,201,133,239,212,183,164,34,161,108,101,79,238,191,18,84,167,248,156,59,226,241,162,3,1,197,219,169,32,155,58,170,246,217,193,177,37,62,45,152,179,220,94,166,152,39,255,18,61,225,167,76,250,195,116,180,31,177,21,115,209,51,141,126,27,119,26,25,31,140,194,24,153,178,189,8,186,183,190,64,142,72,32,204,21,10,99,124,158,236,133,33,92,129,249,18,47,241,251,123,127,112,145,43,152,169,35,246,2,206,99,110,125,187,63,206,188,125,36,209,183,244,94,90,220,227,38,228,174,100,182,110,140,197,9,246,96,244,72,172,242,255,9,143,158,157,143,177,235,42,68,174,228,84,76,217,57,57,52,118,177,239,209,181,149,192,155,62,115,27,133,177,95,249,150,23,56,18,228,200,112,56,193,231,33,150,170,60,249,100,69,38,129,188,167,161,186,226,188,84,27,12,175,63,73,148,108,253,225,115,229,230,38,131,193,166,183,42,207,13,13,228,42,238,105,74,187,205,148,247,145,188,50,186,147,64,16,247,251,74,207,55,149,216,239,214,92,188,65,57,10,119,121,53,21,149,68,136,71,166,95,206,115,169,20,115,40,170,243,29,113,12,243,80,117,231,155,142,192,24,230,159,86,154,53,76,31,251,3,221,174,94,144,96,134,121,105,119,89,122,166,158,107,43,241,228,51,183,91,135,66,171,84,98,63,137,196,6,35,0,202,27,214,248,204,122,168,72,100,55,174,94,233,188,249,41,177,205,196,236,26,39,92,132,173,11,152,218,253,88,127,231,10,175,197,229,96,34,120,21,19,231,41,214,74,252,167,114,216,102,177,242,222,87,60,81,171,152,224,247,215,237,52,158,123,24,43,130,64,172,142,6,241,133,248,190,56,203,108,44,18,230,102,160,117,161,146,214,108,77,246,3,42,214,113,216,153,43,52,226,9,149,123,23,80,190,254,49,213,92,127,38,144,45,159,114,81,231,157,63,61,240,153,167,84,82,186,153,248,237,123,81,118,88,196,139,22,248,172,59,253,207,47,222,207,86,185,255,33,158,104,250,97,198,108,228,198,63,186,0,181,192,10,10,72,148,216,182,65,98,131,243,102,247,219,62,195,14,231,154,51,148,111,198,174,242,85,197,204,14,146,233,2,49,44,28,16,198,61,110,8,155,63,76,195,210,73,79,231,145,43,1,131,133,155,76,73,6,243,79,130,141,30,210,171,44,41,64,34,62,155,153,66,38,15,147,211,136,238,142,125,222,46,192,9,174,95,80,242,227,186,150,125,30,94,46,76,70,109,128,96,105,70,3,4,250,35,52,73,222,190,176,77,113,61,134,84,212,223,189,91,246,79,150,171,32,6,74,14,137,205,32,145,153,101,83,217,173,132,73,75,50,204,213,84,250,191,8,111,30,7,209,138,198,221,87,212,229,98,92,68,212,42,136,93,111,208,93,62,97,193,114,202,27,65,117,222,215,134,16,208,35,251,133,208,74,33,190,66,8,175,86,149,29,7,241,2,237,157,122,123,21,149,7,214,221,235,87,246,216,97,12,75,59,87,52,109,154,189,138,2,204,167,118,85,7,9,37,180,74,63,10,216,25,15,230,81,106,24,161,46,130,67,117,15,29,125,22,20,241,213,151,176,116,214,206,155,80,183,228,97,211,179,82,191,145,203,241,68,242,137,71,196,80,40,85,251,197,228,250,191,127,159,229,209,111,203,238,46,65,88,129,246,183,89,245,189,199,5,217,44,165,18,158,94,72,155,165,153,213,19,33,29,253,123,130,139,142,124,57,161,16,22,25,108,103,116,253,196,224,174,244,105,227,37,195,15,168,155,48,113,206,59,171,172,97,26,148,215,104,90,145,65,245,214,150,187,41,162,240,119,28,105,60,226,127,138,199,69,102,117,244,145,152,21,228,46,19,143,186,21,103,165,42,144,17,122,249,208,17,241,80,22,101,32,93,111,101,63,227,249,194,90,47,248,173,94,230,43,255,160,221,251,119,36,75,148,255,126,59,169,129,121,13,131,122,168,4,51,227,47,17,5,126,245,205,162,210,13,54,31,233,193,216,163,67,249,15,8,47,223,225,39,215,215,175,253,136,29,15,77,163,68,177,253,134,170,155,189,164,46,174,117,153,227,149,60,46,170,234,10,100,2,193,121,175,74,107,25,65,118,102,34,230,27,142,8,111,67,43,119,23,5,33,37,157,255,36,179,6,200,10,117,155,237,158,200,224,163,47,53,82,197,124,95,34,206,128,222,201,110,206,148,186,12,248,123,208,197,39,147,12,201,195,42,129,243,123,13,91,212,122,25,12,95,188,205,34,105,144,213,175,28,60,247,36,248,84,169,131,72,206,102,26,132,97,166,63,24,75,146,233,167,52,122,236,42,113,193,155,127,113,14,47,67,156,34,107,131,24,100,136,171,75,126,86,190,134,120,213,243,222,118,85,60,101,205,231,252,187,155,105,10,234,240,191,238,168,249,201,47,201,206,60,113,215,151,39,67,10,234,232,28,82,84,173,63,109,160,129,27,62,254,29,193,33,42,106,11,197,201,182,234,135,207,79,26,21,168,247,115,17,94,181,178,153,205,211,128,153,139,33,1,11,85,103,237,48,70,156,199,255,131,132,52,193,182,107,213,225,250,29,125,142,112,74,137,62,125,207,42,197,21,182,242,244,136,211,104,152,187,56,161,192,186,170,98,243,244,156,203,93,242,88,22,234,166,181,58,223,96,45,20,42,228,116,178,125,63,148,170,163,214,179,248,236,73,203,83,142,31,151,163,68,94,176,215,35,118,68,94,219,197,209,149,146,36,160,235,245,162,47,17,16,168,250,176,12,142,72,75,226,85,228,101,159,211,161,65,192,157,119,157,66,145,19,159,249,58,134,253,167,143,153,17,80,180,122,67,172,15,28,52,30,243,43,11,203,46,70,159,31,253,183,83,142,246,55,125,239,215,206,253,54,20,255,10,94,111,83,253,147,55,20,184,201,87,183,63,163,16,78,87,102,56,126,60,157,223,250,126,244,241,7,246,247,10,225,204,130,247,14,30,69,91,218,27,86,140,171,243,70,35,118,215,4,227,31,140,251,178,38,110,111,140,51,197,84,226,86,119,115,86,34,207,149,111,231,234,154,24,16,116,153,137,217,17,147,75,136,91,174,255,88,113,37,100,186,52,237,139,206,47,216,249,51,250,109,230,215,162,115,197,151,254,0,196,201,99,24,39,113,185,131,209,200,50,192,177,70,182,25,230,100,113,125,24,150,223,225,242,251,222,81,117,205,210,52,196,25,61,254,152,81,223,107,94,167,114,135,169,161,36,9,229,239,137,98,241,55,43,97,178,87,222,182,207,250,47,194,220,117,136,137,147,24,159,201,14,80,160,247,235,147,25,14,28,119,50,218,95,186,178,62,35,235,31,239,191,224,134,250,237,205,31,99,240,195,79,183,126,194,15,88,38,10,16,208,49,251,203,45,2,64,9,216,6,10,72,123,211,160,34,130,196,21,161,24,117,195,219,23,118,214,63,205,164,192,224,157,57,86,105,199,37,226,65,130,2,149,119,76,21,48,216,146,203,202,114,160,93,61,154,252,59,105,248,209,45,28,168,90,101,248,246,224,150,229,31,238,169,146,222,10,92,127,24,179,186,148,199,178,208,239,55,149,134,175,158,245,201,224,86,95,180,62,140,222,220,169,29,77,212,185,46,57,7,52,243,200,94,247,114,62,2,250,10,245,171,54,56,166,159,194,118,228,34,105,143,87,61,86,174,242,19,177,223,37,12,84,0,61,236,10,98,196,56,8,186,167,12,220,190,119,109,224,98,72,123,229,108,101,10,53,59,27,233,52,12,15,126,64,88,185,221,143,231,206,89,79,101,25,6,47,241,184,208,65,224,154,135,164,69,204,166,222,5,153,159,104,39,95,70,86,233,156,26,234,79,55,122,110,156,13,63,56,186,199,174,128,250,141,84,250,87,45,142,196,171,147,41,17,57,15,160,182,180,196,176,74,130,224,172,135,41,79,14,144,219,214,10,235,157,113,165,95,26,11,141,30,179,213,122,83,6,167,34,109,61,3,61,244,87,139,133,148,246,152,138,92,202,72,145,54,205,225,254,44,245,201,155,56,202,235,178,174,185,16,210,214,249,77,217,228,251,171,210,32,106,79,59,41,167,45,164,13,215,118,39,189,149,237,43,183,219,141,199,36,79,212,145,54,53,181,46,150,230,17,105,189,22,145,140,11,205,23,21,194,151,222,174,44,186,52,89,62,58,83,222,12,22,169,129,57,247,174,55,181,182,12,154,109,173,42,20,102,106,156,35,109,109,184,150,196,207,209,15,117,92,149,62,172,203,126,71,120,95,195,12,245,99,51,3,212,97,128,8,187,192,33,212,102,160,111,49,25,116,87,89,238,252,89,231,159,89,9,180,158,182,99,18,133,250,45,210,51,51,166,82,49,126,80,155,139,163,79,107,16,101,254,108,128,120,92,15,19,129,14,168,37,173,42,108,162,30,244,70,90,202,172,42,254,27,210,246,9,106,74,255,110,56,87,54,202,195,164,14,55,160,253,164,35,73,220,247,59,33,144,113,51,209,68,18,70,218,110,53,74,50,118,146,110,94,124,222,159,114,195,139,23,193,178,108,30,255,77,228,254,224,124,58,237,162,230,71,131,43,11,189,96,85,118,245,42,81,238,225,249,181,41,101,98,28,216,50,46,87,58,141,204,125,190,165,150,177,67,37,137,15,99,91,24,157,19,58,155,168,43,15,155,145,222,118,132,35,205,178,167,27,104,217,205,179,164,195,121,20,27,24,225,205,167,115,21,206,226,92,81,71,57,127,48,141,39,190,48,38,250,223,175,15,117,252,38,250,4,139,63,204,179,18,96,76,141,80,67,241,222,170,254,150,63,221,234,154,128,8,100,71,228,182,74,191,241,73,207,251,101,93,139,134,7,192,65,204,118,235,36,225,185,221,98,132,146,211,81,95,167,69,31,9,185,195,232,203,218,79,188,134,153,242,157,84,216,50,174,213,16,210,190,253,174,136,174,87,82,87,138,222,56,187,65,69,36,187,185,73,154,119,158,4,16,219,201,187,157,13,65,188,79,246,187,97,34,247,208,203,154,226,81,6,241,86,48,40,97,61,16,165,83,245,250,126,251,187,63,205,79,53,33,240,30,113,221,205,72,107,98,69,74,50,162,208,94,94,28,182,165,245,168,191,246,60,46,250,248,98,184,1,41,222,204,157,150,25,0,50,223,28,188,14,221,231,84,180,159,238,139,32,180,138,149,218,150,64,13,115,118,91,16,195,125,56,229,197,175,153,140,230,116,0,96,255,178,7,245,17,160,126,46,248,85,4,106,217,215,8,40,205,185,7,73,16,149,75,135,111,88,41,50,36,9,217,73,58,119,115,235,32,112,166,138,101,158,158,144,86,148,137,139,255,7,233,109,220,32,91,89,137,141,240,22,254,95,211,101,214,237,191,145,48,150,133,166,158,183,80,61,135,182,224,177,251,230,190,13,178,27,182,217,112,62,179,157,149,87,57,152,44,165,78,142,240,134,17,16,173,105,216,190,162,124,73,241,75,173,189,18,194,52,87,239,27,180,95,115,74,119,97,174,112,106,255,7,133,18,186,21,113,110,213,63,121,122,223,64,213,53,121,169,143,132,250,217,88,194,144,249,183,29,197,183,79,71,56,149,117,104,204,250,40,46,43,219,16,125,33,166,84,26,0,229,225,80,34,109,230,206,217,52,229,2,166,156,44,47,135,139,16,47,184,96,149,92,209,112,59,192,242,122,117,252,239,45,184,27,7,21,38,158,220,84,108,98,174,126,126,59,222,18,213,175,11,186,70,81,128,15,16,69,183,114,219,229,0,46,18,17,201,77,41,80,207,165,239,154,248,108,235,211,129,3,45,50,78,127,120,234,243,171,217,188,46,156,119,166,194,209,96,122,15,37,255,173,132,31,213,19,241,80,123,153,43,56,8,56,105,185,228,221,47,252,249,172,150,236,198,69,188,2,255,19,183,223,23,61,132,70,181,123,98,78,243,61,221,21,248,9,173,44,174,94,247,162,123,190,54,17,5,94,79,66,243,181,224,252,144,60,218,147,224,58,145,141,113,76,49,140,241,109,91,208,168,115,162,28,179,217,229,14,76,12,69,245,95,45,235,41,18,246,59,80,203,137,135,241,243,16,172,98,67,19,247,248,74,83,127,231,183,142,87,71,47,217,224,34,66,47,124,195,192,221,241,122,170,236,205,239,137,108,80,71,239,240,125,82,39,182,193,44,131,15,246,78,242,118,40,126,216,100,58,81,92,186,219,161,235,64,66,182,65,3,169,0,135,254,59,251,19,201,227,207,201,158,95,191,175,11,135,154,38,30,155,101,246,78,47,130,238,115,220,146,191,255,251,126,206,43,229,237,239,229,10,181,48,215,114,50,33,224,245,247,24,97,3,155,232,212,90,96,62,42,240,49,172,210,211,138,229,177,205,188,113,29,43,253,254,30,95,35,2,242,196,85,8,217,102,254,154,237,57,103,48,173,150,23,199,8,131,79,62,135,183,104,16,20,229,194,183,74,213,116,68,238,58,233,26,154,222,104,255,125,123,56,109,71,141,0,79,26,166,112,253,106,122,197,235,79,183,68,249,217,155,62,162,126,127,179,201,154,250,89,70,249,179,248,171,129,68,82,104,254,75,235,76,181,148,43,198,43,76,140,235,232,138,32,237,194,2,189,116,251,230,11,70,100,183,6,43,62,252,128,192,81,190,190,9,114,151,211,155,209,118,27,128,37,41,140,25,144,122,118,34,250,231,85,214,199,14,111,161,134,8,156,90,113,117,69,190,40,125,131,248,116,108,148,80,42,25,172,97,59,55,245,79,219,254,209,92,252,247,197,201,224,70,8,51,253,155,129,239,99,210,206,72,58,208,115,158,120,6,131,241,219,74,251,143,72,67,197,128,215,167,205,234,103,72,17,137,96,252,204,113,192,86,82,214,208,181,49,82,90,180,63,220,88,139,55,211,29,37,27,223,26,155,220,12,66,253,168,198,204,15,173,125,242,239,164,159,236,214,152,59,33,112,96,237,163,129,118,83,216,49,91,230,154,147,246,98,255,158,233,230,237,97,198,233,78,252,13,132,85,231,216,29,106,195,221,53,244,37,112,158,8,18,51,205,107,130,250,209,231,149,19,127,68,137,255,205,87,13,88,250,236,2,161,251,97,212,235,223,222,59,229,45,214,185,238,59,231,21,16,232,72,146,100,77,121,234,99,70,21,143,119,34,226,69,223,247,90,198,125,10,96,65,45,198,242,219,219,107,219,8,104,21,250,66,242,249,218,58,212,252,112,134,240,71,42,194,251,55,167,176,212,85,89,149,124,38,146,33,73,20,229,11,68,165,252,190,198,71,194,18,183,66,249,169,180,75,176,221,53,47,51,120,248,157,222,33,117,200,0,201,226,164,2,63,91,175,251,121,106,156,184,192,43,219,37,211,173,29,28,168,126,170,117,154,39,53,27,240,53,149,178,113,78,244,191,253,75,111,114,241,91,206,24,126,59,67,58,211,11,6,173,206,86,25,87,58,54,163,233,100,105,22,128,29,8,92,160,92,182,164,221,243,53,216,89,158,105,175,64,247,187,21,245,209,28,60,147,126,188,94,215,227,245,177,14,7,14,251,140,159,47,73,219,249,187,136,196,135,73,109,161,126,153,211,102,130,250,104,32,124,225,245,219,3,207,76,24,20,232,239,17,61,8,180,48,168,190,161,155,39,145,134,128,165,217,249,183,108,165,60,6,50,183,223,16,26,180,192,160,23,198,212,240,96,142,224,223,234,162,251,215,167,76,48,55,219,83,241,107,138,160,5,37,32,130,253,76,0,224,66,87,230,115,6,86,179,218,53,215,24,118,45,174,123,225,64,195,152,181,36,62,185,239,132,177,39,169,169,169,186,98,218,140,189,123,250,51,77,215,127,87,48,15,94,90,253,58,64,154,183,230,221,55,236,78,67,155,172,255,115,126,186,14,229,227,5,136,181,69,122,204,135,17,76,72,91,63,81,88,183,42,227,119,61,104,124,120,151,253,123,126,145,92,16,186,63,172,204,131,47,205,238,185,114,13,19,113,221,250,2,131,233,9,36,140,142,68,217,153,93,34,182,115,60,8,238,157,98,89,165,236,78,254,166,135,0,57,15,213,43,113,8,171,95,183,115,245,141,77,217,82,144,207,217,251,133,239,16,150,107,243,1,195,194,146,251,239,43,65,117,159,119,216,6,190,198,124,117,172,247,108,136,118,62,65,90,73,223,156,65,156,38,183,162,84,153,102,148,106,204,112,225,236,102,143,32,206,209,211,4,101,38,172,100,62,254,206,191,225,179,113,28,200,163,46,89,152,195,56,105,82,210,242,124,22,176,131,138,132,202,154,70,135,154,141,157,174,188,92,186,102,42,135,180,53,202,117,233,75,39,109,35,197,239,150,163,135,153,80,255,61,11,85,45,201,1,73,109,171,172,253,177,16,46,60,235,173,96,221,250,139,251,167,196,49,91,247,167,187,81,124,22,204,184,254,229,84,142,126,39,231,111,189,192,101,180,190,53,18,198,218,141,150,229,108,239,247,49,114,143,33,208,236,151,172,13,76,46,50,145,54,88,116,230,154,4,115,86,9,60,233,171,124,175,155,34,113,232,197,101,222,0,181,217,217,186,87,42,252,248,74,39,238,18,42,145,203,138,180,201,125,186,149,30,179,221,170,122,43,246,3,172,38,128,214,255,162,156,141,110,19,203,235,127,19,51,228,167,30,56,80,121,227,155,79,150,193,180,140,46,66,51,223,3,67,109,33,65,17,94,10,45,17,205,59,79,179,114,170,80,255,45,109,47,187,196,115,247,33,101,134,137,246,251,188,9,84,127,104,126,51,244,56,173,53,37,92,169,255,91,98,132,3,181,240,195,194,121,18,198,164,62,51,226,241,198,243,255,211,27,247,76,227,141,152,46,141,174,52,121,176,161,254,53,47,135,177,250,137,201,9,61,110,197,141,201,30,234,248,68,99,173,202,137,241,211,139,27,50,50,47,22,65,236,164,122,207,125,142,111,107,37,126,118,106,176,235,172,131,66,137,188,102,61,74,91,252,191,4,43,140,139,247,115,34,216,160,176,164,177,7,170,247,200,255,226,251,179,214,46,67,69,132,239,138,11,206,228,238,220,162,162,219,188,34,122,0,119,211,170,59,255,234,41,184,189,68,206,201,73,104,122,10,133,90,215,185,6,188,182,253,176,36,127,109,33,223,219,7,229,143,118,61,77,153,167,25,249,185,204,78,124,89,228,16,166,105,130,193,158,17,144,143,72,211,110,41,107,154,70,253,152,91,147,215,97,129,150,140,254,71,162,17,34,60,158,148,80,194,164,43,65,243,231,106,243,174,126,19,61,136,226,149,100,221,7,221,60,141,98,137,238,148,159,25,145,168,30,176,58,57,117,44,44,243,201,51,186,20,232,57,202,41,66,236,220,242,162,97,207,133,49,235,3,217,113,68,150,25,173,153,170,90,10,1,144,77,232,234,109,124,153,216,164,178,138,42,47,54,229,7,8,4,222,156,79,140,225,228,64,176,160,168,238,12,35,74,215,138,177,180,6,49,52,200,110,208,37,0,152,253,123,246,92,1,32,147,50,103,69,86,255,229,64,119,163,138,139,169,211,71,66,179,49,97,200,234,197,195,51,45,238,34,57,194,249,213,38,25,243,191,58,37,23,41,218,164,227,29,152,107,84,36,33,237,47,67,144,157,154,91,245,195,128,10,211,146,151,37,221,253,17,156,8,184,146,242,69,236,187,241,66,185,254,16,9,185,188,159,56,134,177,239,68,48,150,44,163,251,29,39,97,83,238,32,212,161,226,121,198,155,31,210,115,63,252,157,150,107,238,137,142,8,241,133,235,59,234,21,21,223,136,109,9,215,73,107,33,176,6,184,47,71,238,75,87,54,212,150,244,247,218,58,140,113,87,159,55,147,112,220,190,214,254,157,153,155,184,27,166,145,117,170,59,178,8,209,211,20,224,187,171,219,35,4,99,12,167,215,178,220,133,239,227,82,8,204,191,202,120,32,161,108,135,179,194,90,175,13,9,129,212,184,79,210,138,255,157,103,42,137,151,74,123,14,44,175,49,20,189,57,130,66,197,70,255,174,20,166,140,227,229,19,200,217,96,224,63,253,112,117,133,2,101,255,253,51,195,53,224,2,12,250,44,154,100,76,171,88,127,190,85,144,245,38,143,15,79,84,254,37,94,94,163,10,107,0,164,196,156,104,253,250,239,124,251,66,178,207,230,39,161,183,204,84,118,218,113,72,55,225,225,249,20,215,45,31,226,81,181,134,88,110,90,88,163,39,164,197,85,231,154,208,157,35,134,236,84,2,0,245,63,135,35,27,165,17,23,9,49,142,203,149,183,131,16,240,160,91,73,188,201,237,29,104,77,56,185,60,122,5,121,87,223,171,117,254,201,213,167,144,80,97,109,176,1,66,192,242,207,54,226,107,219,34,207,109,103,212,105,88,232,209,253,198,105,186,30,17,159,207,253,38,100,79,236,139,29,170,103,130,233,50,159,245,158,87,112,100,221,35,228,181,68,66,233,242,210,235,252,253,206,158,55,213,93,18,142,106,69,208,126,203,211,183,117,240,121,69,123,123,129,252,189,190,66,79,144,152,1,198,207,86,239,125,249,142,5,75,194,16,68,211,240,80,162,179,60,159,214,148,172,129,199,30,156,67,64,215,234,45,28,159,219,68,176,158,143,117,243,191,50,212,207,89,217,59,126,119,163,191,85,10,27,137,180,160,254,159,112,52,160,220,181,58,247,80,177,186,213,39,5,213,195,105,246,60,12,137,115,15,105,5,68,18,117,132,217,33,140,251,54,19,179,135,28,23,247,165,199,89,86,175,153,113,152,225,227,173,94,191,104,219,38,154,244,15,233,77,164,144,29,101,158,231,202,230,64,133,21,187,84,1,34,58,140,235,142,13,115,126,187,98,33,189,228,194,34,41,76,78,0,97,82,235,127,77,252,221,56,126,150,79,242,235,227,155,41,244,122,142,215,161,96,165,101,198,45,54,131,91,63,142,33,187,27,117,21,18,25,13,239,151,0,114,7,82,154,20,4,172,122,191,36,118,101,151,56,230,172,187,140,91,127,7,198,232,24,95,158,17,205,52,78,157,58,1,5,131,80,61,166,107,109,243,64,235,6,148,69,73,179,188,170,178,6,23,1,131,57,201,15,239,135,164,78,4,242,75,127,169,85,80,195,90,89,221,165,212,161,39,147,54,90,64,125,53,12,150,14,26,75,250,242,17,62,228,26,194,94,46,102,69,64,129,106,172,12,155,111,95,132,39,108,104,21,133,192,187,199,14,211,30,75,82,231,178,2,67,17,29,106,62,16,216,247,181,76,143,198,245,43,245,3,239,170,49,135,99,4,148,26,82,21,94,217,188,252,230,240,30,146,98,228,13,217,61,26,221,181,117,42,168,63,37,168,243,163,198,58,194,49,68,249,20,204,146,158,23,68,125,192,84,143,125,86,8,92,130,92,30,70,43,178,185,171,173,178,133,96,138,80,63,56,31,31,93,121,126,89,106,203,208,81,119,140,152,107,245,206,94,10,179,17,155,47,115,99,166,80,139,205,44,234,47,140,27,132,199,111,172,61,105,10,244,241,144,65,253,81,189,56,127,216,7,238,196,241,72,249,232,127,185,89,72,91,181,144,128,9,123,249,210,193,27,169,46,233,206,95,80,91,82,70,113,101,80,176,195,149,134,101,190,15,118,145,232,56,189,208,149,192,53,195,245,209,83,154,186,147,5,116,190,69,168,22,127,101,230,100,70,54,118,134,112,24,229,171,191,95,154,54,173,67,137,210,235,79,133,200,71,33,94,182,58,7,27,209,248,215,215,232,104,226,142,247,166,17,94,218,205,39,172,201,27,31,95,115,63,15,251,198,48,133,39,12,78,246,172,244,163,117,95,158,60,216,172,251,156,9,133,218,140,30,250,148,215,122,30,18,100,91,121,199,239,67,160,161,243,146,81,156,223,83,151,22,159,0,142,220,55,40,190,183,14,204,89,177,250,250,220,244,41,17,45,38,130,193,202,254,43,166,254,33,143,66,78,57,156,27,245,18,17,149,64,2,34,146,45,80,153,178,186,200,141,139,126,25,2,181,186,19,180,169,90,180,20,247,30,47,121,114,72,65,42,246,239,122,22,206,4,31,72,83,29,127,122,168,7,64,24,241,71,35,118,154,149,213,63,210,223,164,93,3,92,17,208,119,72,64,202,195,246,221,74,183,79,215,35,31,106,24,28,95,213,59,116,8,84,181,203,19,245,224,250,146,143,172,18,69,238,124,172,91,208,88,52,219,79,220,208,2,161,182,130,244,23,162,65,247,38,140,23,14,169,39,59,203,32,240,176,227,225,156,198,3,170,73,177,157,123,190,203,153,10,252,164,155,114,46,238,3,53,150,97,222,31,227,59,137,225,80,170,184,163,110,150,87,255,236,147,57,210,84,45,103,117,220,20,196,46,79,254,30,252,244,166,122,240,1,96,225,134,242,111,139,212,202,140,254,240,244,232,180,105,6,24,7,217,73,149,165,103,252,252,98,230,194,242,228,253,67,214,123,144,10,251,190,210,192,199,243,244,27,132,198,186,115,197,255,116,192,44,179,88,101,31,30,2,167,173,147,10,252,4,30,230,172,233,18,254,34,81,108,103,21,189,69,111,37,92,1,131,102,255,186,141,173,72,107,200,11,36,212,184,114,219,209,250,140,223,52,246,170,154,215,28,137,29,228,96,79,135,64,147,215,135,67,17,164,111,235,183,198,101,50,92,122,209,124,78,253,56,54,84,125,242,182,123,33,145,148,48,2,89,213,114,170,147,90,8,112,52,17,82,22,103,117,0,113,160,254,193,236,137,7,27,61,134,146,166,125,83,244,41,14,132,252,149,155,89,216,48,129,65,189,229,26,167,44,40,191,151,207,152,83,60,128,70,8,134,94,116,198,138,161,250,206,106,64,116,254,50,51,109,230,7,27,119,58,42,136,151,106,99,234,153,223,198,77,225,108,202,85,21,237,124,244,250,198,128,111,142,145,90,21,97,115,147,207,177,15,210,205,182,233,157,53,234,100,76,193,237,75,90,177,103,135,3,219,215,186,110,230,24,78,182,204,52,223,104,18,241,135,57,63,8,184,156,21,198,124,123,146,213,226,41,37,160,14,131,60,155,151,196,14,220,56,191,216,123,109,240,191,15,225,32,38,119,154,124,89,187,118,14,179,107,83,60,7,112,48,198,227,250,105,114,124,192,233,218,191,210,131,27,45,36,56,26,250,178,226,171,155,205,111,102,37,137,136,254,125,225,130,157,104,178,5,43,247,254,224,226,226,147,84,58,232,73,80,253,223,102,98,20,25,20,23,254,38,216,35,36,85,26,225,253,54,175,165,37,202,167,74,237,252,243,117,44,193,109,78,17,219,98,105,95,150,4,9,2,93,118,129,81,129,53,157,146,32,235,102,233,109,111,174,139,194,83,31,111,143,211,195,24,173,154,249,105,104,204,126,107,92,2,184,15,190,128,120,105,181,159,254,123,90,248,160,249,229,66,135,32,67,58,188,107,74,209,121,107,230,163,153,102,184,141,1,145,112,61,212,205,212,190,210,47,214,82,114,200,25,58,186,211,62,5,133,242,122,109,185,78,151,113,143,227,198,159,73,164,136,193,171,86,239,210,82,175,45,148,171,77,198,192,67,241,207,241,68,22,235,51,99,145,129,241,146,238,141,231,27,77,174,58,235,11,224,28,129,142,45,17,64,96,14,134,144,188,134,119,219,201,30,43,252,184,52,246,140,14,4,83,191,6,225,120,195,98,231,168,128,214,225,172,35,10,217,91,252,116,120,82,208,74,176,55,184,15,0,128,139,252,65,199,78,16,150,32,166,125,220,170,226,118,57,213,128,43,133,167,10,210,157,51,191,249,203,192,179,246,194,91,65,6,218,42,89,104,149,104,247,243,66,128,236,173,186,251,170,174,211,249,251,98,42,105,10,116,205,25,87,48,191,159,235,238,109,68,184,226,236,10,130,58,245,170,151,87,198,125,89,205,7,63,163,248,41,241,124,58,195,125,67,127,141,35,238,109,69,115,11,98,71,190,57,93,193,216,229,234,244,184,250,206,4,81,42,204,171,190,203,92,100,100,252,37,117,98,209,141,136,228,28,238,152,221,189,20,171,3,180,173,201,22,140,67,123,231,125,223,82,114,214,126,58,39,170,22,82,169,188,168,216,242,134,192,228,173,19,65,205,48,55,110,82,209,111,73,166,209,168,94,79,201,23,170,161,175,180,28,6,166,158,3,146,48,230,122,216,101,205,123,141,79,200,18,213,116,204,167,9,97,80,66,9,63,137,180,166,37,206,10,38,177,5,199,225,86,155,214,116,239,153,172,230,70,111,19,207,95,46,170,133,67,101,234,28,189,7,22,7,252,46,173,190,91,151,187,173,208,67,231,132,31,218,102,107,208,78,11,150,89,157,23,65,84,130,56,148,201,5,174,42,83,198,11,180,136,215,190,64,84,10,8,136,148,203,127,42,81,26,87,49,242,75,172,193,24,113,137,166,8,100,61,234,89,142,161,189,219,11,12,140,97,30,178,200,240,40,85,18,230,90,76,156,187,125,19,94,165,19,145,234,21,82,172,144,237,249,252,92,83,212,2,125,95,154,164,148,75,211,42,226,155,129,133,219,186,32,2,238,181,242,9,72,241,137,220,142,152,78,89,252,176,139,236,198,20,108,239,234,62,156,226,147,39,110,191,2,13,32,216,48,2,18,114,103,251,40,218,114,255,208,151,133,139,232,253,131,54,194,23,47,220,83,185,248,174,98,174,127,29,1,151,2,109,132,4,174,53,243,20,154,242,93,185,56,200,25,190,206,193,5,57,10,240,81,95,206,45,19,233,247,197,129,43,25,71,49,162,82,134,135,211,28,107,252,5,100,48,70,198,165,116,154,107,86,59,198,242,222,247,60,150,96,72,68,179,236,87,90,192,159,55,165,175,190,134,175,223,100,82,8,103,23,252,134,76,53,213,113,69,213,126,226,47,115,71,241,233,240,182,107,64,213,149,124,10,243,239,250,214,97,255,125,63,146,106,208,33,39,88,87,164,221,155,12,66,249,52,61,140,183,145,211,231,244,84,134,196,252,198,117,18,216,137,252,179,96,203,197,143,189,255,122,193,4,177,100,55,180,255,133,155,154,232,203,237,1,131,209,233,0,179,74,120,19,19,40,211,160,253,224,79,42,203,178,166,57,31,61,12,46,108,51,49,156,50,197,74,253,42,26,97,159,75,68,253,123,106,129,156,153,104,142,238,32,107,207,106,249,35,180,223,234,138,109,38,60,243,253,226,168,75,40,148,18,97,44,215,163,130,180,206,204,151,105,215,67,64,223,103,120,148,79,14,159,201,206,56,61,124,20,183,34,53,189,242,22,7,122,169,254,190,86,101,250,3,57,221,166,147,215,228,133,49,94,184,216,232,120,93,185,173,157,244,227,15,129,63,112,224,179,230,0,235,61,179,105,122,182,165,49,161,53,82,5,126,205,205,181,113,247,74,43,43,43,223,95,242,35,73,184,238,224,249,159,93,69,231,221,194,254,170,42,228,223,207,117,28,162,172,245,127,149,151,95,77,143,253,244,72,97,244,28,79,202,117,88,239,236,231,208,46,126,237,123,109,68,60,59,2,54,12,107,105,29,43,185,207,94,63,126,211,60,47,135,242,245,119,94,101,222,102,234,179,211,131,173,155,253,205,8,120,190,166,10,213,52,12,47,59,189,235,37,82,120,240,223,255,119,87,165,176,175,154,136,220,206,121,246,255,153,65,221,36,121,244,47,204,250,119,93,185,22,130,149,47,156,66,160,127,161,143,55,165,98,168,158,229,175,215,175,42,8,113,188,84,180,190,204,70,102,7,200,81,214,86,9,202,87,224,60,34,100,79,255,176,87,44,247,47,227,129,98,135,2,63,109,153,224,70,64,255,162,252,243,37,66,67,168,84,129,236,193,230,39,101,255,215,143,46,123,147,125,33,40,166,68,176,132,130,89,60,199,121,21,163,59,253,183,73,10,243,32,112,178,108,233,1,109,93,107,194,39,252,20,225,37,97,136,23,247,205,229,188,180,70,216,223,210,238,155,202,237,12,100,181,65,65,253,94,108,66,130,222,159,12,133,88,207,88,20,255,135,46,235,123,165,218,27,177,143,214,149,124,13,65,192,195,33,141,59,157,201,180,11,117,28,33,221,10,111,16,44,113,222,160,152,23,190,238,57,214,232,109,170,163,39,196,75,224,101,84,186,177,171,51,16,84,132,99,55,140,68,120,99,57,184,148,169,149,11,181,204,159,185,201,11,109,67,221,180,131,242,250,174,153,166,21,47,149,133,12,238,98,33,208,152,67,86,79,195,250,124,255,159,173,113,151,16,27,12,26,255,74,97,240,253,125,215,249,248,242,227,26,151,49,84,63,189,209,240,63,180,251,242,37,221,78,60,228,162,129,78,248,210,208,113,131,128,171,66,36,86,141,232,253,240,1,170,199,174,69,77,68,1,203,198,226,173,25,241,196,98,168,127,169,219,182,201,51,24,153,13,52,116,130,104,116,33,240,32,216,116,78,61,86,187,251,217,243,28,125,160,11,1,79,6,137,196,55,52,154,42,95,250,251,248,249,40,162,120,27,99,57,164,201,200,232,170,148,2,222,122,174,135,172,202,212,213,154,242,176,177,16,54,237,114,253,126,253,11,6,145,15,245,231,143,230,138,54,137,34,189,12,87,242,225,142,16,127,247,239,58,101,211,222,75,173,7,220,169,3,16,184,48,114,221,152,214,112,250,240,205,206,86,246,222,15,24,76,62,60,102,245,33,112,127,88,115,59,94,69,233,18,14,172,252,214,36,144,199,162,51,46,99,24,123,129,236,54,14,172,233,106,178,95,185,37,205,120,193,56,134,85,48,14,2,55,124,76,231,227,166,169,190,228,38,119,30,252,69,253,106,105,163,248,82,150,20,191,134,204,130,248,189,55,24,28,216,240,235,206,199,235,70,31,78,227,62,177,143,101,187,163,235,43,155,110,121,85,255,44,82,241,211,147,15,163,88,132,247,137,96,188,208,112,249,218,85,17,131,227,77,106,127,52,159,209,103,166,247,250,203,46,29,104,109,8,8,99,145,182,177,233,159,197,90,23,210,13,238,201,139,15,172,168,192,224,10,254,132,113,109,226,71,241,227,84,139,163,81,18,8,107,191,233,215,183,254,97,202,229,205,149,227,189,214,121,168,205,200,208,162,89,97,166,164,193,103,140,188,126,59,4,1,76,212,77,148,109,140,9,0,149,126,103,181,196,20,46,208,85,225,161,135,211,10,16,40,234,18,42,243,51,83,220,110,63,44,191,8,200,180,206,109,148,151,99,47,220,132,67,109,234,38,189,79,195,58,23,89,175,214,174,30,21,34,49,217,101,62,77,62,70,135,133,224,227,103,96,78,58,220,139,157,227,243,174,121,162,201,144,57,35,176,70,250,13,183,249,90,209,8,155,95,240,216,154,253,173,42,145,243,26,2,250,160,245,41,248,163,232,100,34,255,131,192,254,13,4,218,128,166,70,26,216,69,2,237,150,69,186,220,14,8,227,155,48,244,89,14,216,76,8,220,95,118,229,63,64,236,154,56,190,98,163,23,48,228,102,187,44,170,123,113,176,157,134,54,79,33,251,244,230,151,213,207,26,225,127,31,227,137,188,148,50,6,41,248,170,54,129,61,159,197,22,23,196,46,170,53,34,170,60,233,221,131,185,245,20,99,181,109,8,108,93,120,82,173,22,220,159,57,35,125,106,113,242,17,193,254,105,5,187,248,29,7,200,6,157,248,85,211,208,251,141,15,63,201,88,133,235,147,220,230,112,164,17,46,130,48,62,98,140,58,29,66,189,228,210,226,65,12,33,58,80,17,145,219,135,63,142,111,204,10,245,62,18,186,180,51,224,64,1,137,134,101,227,219,236,51,67,241,163,46,229,236,176,10,193,238,181,73,203,188,151,185,235,220,238,247,43,120,103,34,8,243,70,16,67,34,0,80,236,44,26,186,31,131,15,35,92,160,48,88,172,67,249,55,132,153,131,35,23,194,130,237,93,47,31,95,1,0,109,178,216,188,124,183,62,114,208,170,93,50,222,0,53,212,255,234,238,17,234,225,212,94,84,111,230,31,145,23,165,63,9,160,103,37,0,209,249,105,200,244,83,252,31,22,80,228,164,111,170,197,41,172,115,58,125,117,60,154,118,186,203,236,121,78,106,128,226,175,76,77,94,20,34,163,22,154,173,166,61,57,121,1,31,246,194,66,146,56,63,239,75,198,135,221,42,173,91,239,33,21,189,67,191,194,247,239,19,94,135,92,253,211,97,1,224,64,95,140,31,236,173,71,241,9,19,24,168,102,183,0,239,202,68,142,157,26,69,140,181,46,127,249,183,157,157,35,38,120,87,163,220,32,255,45,157,90,229,3,28,57,96,34,230,54,102,81,36,100,114,101,230,107,173,4,187,98,97,2,174,59,197,222,250,123,223,15,157,151,191,89,35,96,207,22,24,99,143,29,54,163,15,181,167,74,180,250,50,98,127,160,163,130,141,177,170,181,30,145,124,88,246,158,60,95,31,245,71,135,196,166,186,107,188,59,153,31,75,206,105,39,4,16,149,38,5,200,230,222,2,47,249,22,97,179,39,66,14,97,60,30,29,1,127,73,226,92,63,23,146,136,119,80,34,96,126,246,162,208,191,123,17,186,150,192,30,32,226,133,142,99,148,132,82,56,212,136,24,184,72,191,63,19,130,192,129,252,16,21,114,31,249,123,38,68,47,71,173,243,17,94,78,8,98,80,58,155,121,94,89,196,170,226,30,10,129,119,213,122,219,200,121,36,106,9,219,28,62,142,239,33,69,23,131,57,245,53,119,90,94,44,211,242,216,199,144,163,120,87,146,97,106,104,113,89,123,72,197,255,222,33,170,255,140,67,235,238,107,208,241,116,97,252,171,177,113,0,110,245,121,107,114,242,117,57,133,85,13,35,2,41,252,4,138,255,131,138,226,247,201,10,1,137,139,213,154,10,114,232,253,197,47,230,40,83,228,181,62,77,154,16,153,200,35,42,217,65,189,106,149,119,149,169,189,45,199,233,48,193,16,150,244,80,216,153,165,118,121,11,67,74,166,34,146,130,172,158,181,122,104,185,171,170,82,183,61,47,191,145,131,133,139,8,223,181,21,47,55,13,42,201,232,84,183,170,14,137,99,86,220,133,204,98,91,108,95,86,208,42,89,88,19,64,171,84,110,205,1,94,245,90,149,201,52,202,119,89,118,97,204,206,185,119,177,206,39,239,129,124,55,94,210,48,180,127,195,130,108,249,92,93,117,232,118,223,126,107,208,218,70,138,30,230,109,196,61,179,90,126,217,82,39,18,175,73,129,3,73,158,145,156,126,145,242,17,141,247,178,242,209,158,129,65,129,237,75,151,220,131,238,250,182,25,27,200,89,213,227,137,26,66,60,186,163,184,127,95,160,52,16,214,108,118,130,192,147,176,66,239,24,197,84,226,60,238,65,186,255,190,255,158,132,55,120,107,99,179,135,1,109,19,40,247,7,2,182,252,238,144,218,153,57,52,229,118,101,23,97,206,134,192,211,136,174,199,113,74,169,253,156,152,159,238,192,35,24,124,117,32,122,75,46,208,40,206,136,78,130,75,35,4,9,205,186,112,114,243,22,243,19,214,243,161,6,5,182,219,16,168,31,241,101,142,150,32,89,48,54,53,223,28,123,1,221,255,195,247,148,143,103,253,199,140,60,52,26,152,136,145,110,115,39,145,142,244,234,138,196,187,102,188,248,154,115,136,211,44,45,31,201,112,77,11,170,120,189,222,226,115,8,129,142,177,172,246,137,15,98,105,6,53,155,47,47,204,192,88,18,237,241,43,226,229,221,37,20,47,240,169,123,222,40,95,13,242,40,135,150,4,171,124,96,79,181,254,87,130,128,103,187,133,202,59,2,187,116,242,228,28,130,28,215,32,112,205,210,123,153,54,84,215,156,30,60,188,69,147,137,242,239,139,87,222,58,138,171,110,37,242,197,192,37,26,164,123,72,76,206,244,233,199,12,214,89,135,243,174,100,42,244,250,152,150,47,195,238,251,128,229,94,127,228,103,164,2,184,81,186,81,181,210,68,0,220,227,73,122,242,243,149,142,195,75,107,70,241,7,82,236,24,127,205,196,71,162,101,10,100,105,98,111,250,146,226,189,129,215,6,122,77,245,123,10,225,116,130,95,247,75,152,119,178,127,61,201,56,144,183,65,192,202,170,85,73,234,234,81,247,20,62,127,41,91,97,20,63,188,249,27,198,153,94,176,150,80,91,150,228,150,252,167,31,194,197,59,250,190,199,20,101,178,207,145,211,34,96,243,188,189,76,224,37,173,199,143,63,23,112,192,130,248,171,194,77,67,162,153,171,251,39,223,249,9,213,255,118,66,224,168,130,137,1,57,246,90,123,66,166,85,221,197,40,56,212,127,48,53,41,87,198,50,177,251,241,211,137,237,175,48,184,241,254,155,223,89,199,204,226,198,213,150,80,65,17,4,44,12,181,22,107,97,24,70,94,20,63,226,182,212,66,235,113,213,107,132,66,39,3,244,90,20,114,178,165,135,192,113,165,168,177,200,127,189,158,4,243,221,211,75,29,72,55,180,208,58,236,236,87,247,188,174,220,105,142,12,143,132,134,42,112,41,71,135,57,82,190,195,146,125,61,150,68,86,97,138,226,198,147,194,173,242,126,237,118,205,129,109,8,131,60,26,98,42,94,190,94,127,71,119,234,144,214,21,2,213,109,172,53,95,119,94,190,81,218,169,226,159,251,86,71,173,123,255,160,118,195,86,161,166,211,64,52,129,129,70,39,156,141,66,41,188,188,57,206,49,134,55,219,213,106,23,2,239,189,244,28,212,208,40,191,235,129,201,152,60,201,65,64,199,226,78,161,208,212,184,186,164,103,246,186,179,120,148,31,22,76,38,212,69,222,0,178,178,18,100,89,6,168,63,175,72,145,51,180,39,156,111,249,226,95,109,130,234,73,199,162,47,252,75,206,121,48,254,202,159,226,23,130,248,88,246,77,211,141,148,120,109,77,62,14,167,145,158,190,255,254,175,238,255,176,38,219,100,44,230,19,46,43,193,174,16,110,235,52,233,19,16,191,185,152,239,103,179,252,84,27,89,197,56,85,57,189,242,52,188,242,108,183,229,132,202,27,213,171,39,190,119,2,22,127,156,92,123,114,53,100,123,8,213,63,130,25,75,93,94,59,99,33,67,10,166,241,182,80,199,143,164,114,85,18,165,128,253,202,227,163,235,14,149,72,91,15,50,144,245,253,149,77,144,79,148,27,223,83,212,159,102,165,218,157,186,172,62,25,57,151,19,139,44,5,32,21,98,138,191,68,237,149,247,29,174,100,60,123,96,207,12,131,133,99,70,119,124,38,243,171,5,188,202,11,250,106,17,44,137,83,243,226,194,67,124,239,78,166,111,18,135,21,158,104,210,230,197,131,72,118,243,160,144,187,70,215,171,156,33,112,152,40,96,44,90,59,236,51,55,133,112,141,77,2,170,119,227,243,204,234,104,40,66,20,221,248,56,29,255,226,138,2,115,126,157,109,100,50,104,222,32,214,26,240,96,69,86,27,139,107,71,30,59,58,211,94,184,53,101,60,95,50,123,157,128,66,41,180,188,46,109,142,185,98,152,234,10,61,110,51,106,95,161,56,255,234,142,145,206,249,209,212,53,53,68,37,101,30,228,41,111,187,70,217,41,82,10,218,250,161,126,35,103,77,238,156,229,88,83,223,51,37,36,123,12,10,197,30,54,187,230,165,140,100,41,150,246,233,6,171,35,96,121,152,157,216,249,216,149,177,110,165,134,84,233,20,156,8,177,253,140,87,75,70,176,114,166,192,111,89,22,51,24,99,242,209,35,122,143,172,152,215,166,201,46,247,171,46,66,147,187,220,82,58,106,60,37,252,218,2,191,42,220,9,239,62,45,222,188,36,126,192,221,85,178,106,97,254,66,13,10,181,219,205,10,56,109,185,239,255,242,109,44,145,131,38,2,6,76,58,8,136,154,94,125,98,174,141,45,1,150,144,213,220,32,231,216,62,144,132,60,226,147,24,57,59,19,18,74,87,230,157,145,183,175,22,146,254,101,214,115,134,26,2,93,21,95,254,36,11,95,76,15,90,183,227,251,57,34,94,20,23,164,127,207,189,79,120,160,49,144,250,220,143,7,197,175,41,138,59,77,239,68,211,143,171,182,73,20,39,251,69,77,172,132,55,93,8,129,192,101,211,228,219,95,192,202,255,157,71,155,70,154,240,156,185,112,26,224,194,32,172,107,124,14,49,144,99,95,199,109,239,33,146,77,33,78,3,216,120,233,115,217,80,2,129,33,12,39,217,0,82,244,173,245,39,113,85,135,18,229,185,60,61,64,10,162,250,130,235,193,125,138,88,96,140,242,223,153,172,80,39,20,42,179,112,103,107,179,243,239,10,135,201,175,83,201,77,4,155,67,64,114,175,244,231,50,89,65,58,144,113,34,4,99,100,167,44,162,188,78,95,121,231,181,113,99,158,71,192,69,220,135,154,7,248,17,173,99,214,238,122,102,22,98,136,151,111,247,233,233,172,48,107,6,49,174,187,105,69,18,90,245,25,52,71,86,120,253,188,148,172,168,217,60,223,34,160,237,99,107,161,11,247,167,153,69,191,26,111,207,218,163,250,116,238,198,144,122,151,131,24,190,71,83,94,216,30,213,199,239,54,16,91,38,38,105,226,27,211,97,38,154,8,54,40,71,93,32,90,235,30,173,244,223,146,169,112,74,8,60,207,209,29,35,187,219,83,214,72,144,207,201,132,250,69,223,181,203,154,244,222,113,217,122,224,11,210,39,142,58,34,38,67,69,185,81,223,202,169,149,131,130,105,231,158,193,171,50,239,194,244,167,226,120,10,38,223,58,88,217,50,192,24,233,33,171,12,90,78,160,55,241,96,248,239,197,113,24,99,86,146,158,30,79,160,44,47,17,100,178,249,103,182,255,58,21,164,48,164,101,220,151,109,52,106,38,180,158,13,133,82,13,18,50,218,222,124,224,149,240,147,129,136,110,158,195,129,18,202,127,63,58,241,105,39,209,46,92,192,207,16,213,231,135,126,205,251,63,135,147,48,145,76,63,71,167,209,245,7,211,41,121,111,250,237,112,176,184,151,211,119,66,69,192,232,147,149,236,65,125,188,252,82,193,53,250,77,5,53,166,222,103,79,199,198,156,187,120,229,14,164,110,128,8,150,101,97,170,197,187,63,227,149,250,156,70,188,103,59,14,84,239,128,28,214,76,125,230,33,39,167,207,138,189,56,80,249,180,189,105,154,169,13,180,231,222,156,230,156,134,66,253,35,253,182,158,183,90,86,24,87,219,124,246,78,133,66,111,91,213,78,111,54,108,74,112,95,127,101,239,103,129,242,169,87,255,212,221,210,113,146,246,25,185,216,189,119,112,17,64,195,249,149,53,61,148,159,92,39,156,187,230,3,164,2,228,213,141,110,30,251,53,112,148,56,4,56,49,32,118,44,121,171,22,62,227,219,207,147,124,86,229,131,245,32,208,39,78,249,152,65,242,91,229,62,197,237,61,78,12,140,17,190,46,190,166,35,121,143,44,193,2,91,98,158,132,250,237,152,243,89,25,239,43,235,6,243,12,219,213,168,158,63,173,213,247,73,233,153,200,42,237,165,102,176,228,134,65,146,147,61,49,13,5,155,108,53,81,91,135,191,168,223,165,222,187,240,55,66,250,14,94,231,88,251,24,63,133,235,201,146,127,50,59,113,197,191,191,1,24,64,118,199,17,80,246,160,76,185,230,141,143,109,203,163,102,34,121,25,8,244,181,207,250,21,157,61,99,161,232,76,47,255,136,78,39,148,78,34,171,107,97,184,80,92,109,139,240,236,67,43,4,122,169,188,122,68,157,22,170,146,80,142,105,139,5,97,176,253,232,179,216,211,181,171,49,246,90,174,142,186,249,144,200,23,75,131,196,67,1,65,93,220,215,186,148,166,44,4,244,95,183,191,67,37,82,112,53,91,212,247,242,230,19,4,155,65,122,127,232,129,140,140,113,95,114,98,64,124,11,202,231,67,2,234,49,175,10,249,89,130,82,78,114,101,184,86,95,7,17,41,109,222,225,14,238,99,84,188,171,35,136,250,189,151,99,85,222,118,138,55,151,232,123,254,102,136,194,96,112,69,172,145,245,18,144,61,33,159,15,235,126,68,245,195,182,206,45,111,5,221,34,117,29,209,167,29,68,56,144,188,146,92,255,21,127,253,49,249,177,207,241,129,0,170,71,18,216,142,225,236,90,245,0,98,225,212,197,55,8,88,83,18,126,107,124,57,103,21,118,155,90,238,249,131,20,1,155,73,43,117,55,169,242,223,181,222,74,151,172,135,48,167,191,46,42,204,102,175,99,36,105,92,9,213,50,208,120,71,99,114,254,107,138,233,188,174,75,105,26,36,208,42,207,194,229,103,31,189,202,2,56,171,15,70,24,155,112,118,19,170,107,235,113,210,124,77,165,44,13,244,100,156,72,145,72,217,99,158,124,46,117,205,109,85,219,63,100,248,89,223,49,138,169,39,215,251,234,77,13,131,218,78,7,206,161,110,210,200,178,230,161,1,163,18,22,146,127,153,146,9,16,104,223,102,50,22,49,150,210,90,77,188,104,24,105,15,131,7,47,223,152,204,79,16,188,156,52,247,192,23,222,65,192,166,214,66,201,147,51,173,182,211,142,46,170,156,13,8,180,232,202,127,64,129,61,138,142,213,156,197,150,110,35,160,104,77,175,220,200,228,81,82,52,213,8,25,132,226,223,214,187,78,49,189,10,162,223,159,2,87,20,35,70,17,144,39,173,68,204,203,128,66,127,237,211,89,86,251,57,132,209,114,169,54,232,63,77,220,247,149,159,78,48,205,71,249,179,248,77,111,196,131,75,141,38,248,169,84,86,12,20,202,22,217,195,114,39,171,175,200,112,165,130,33,0,128,66,109,19,37,93,110,111,87,175,224,148,37,127,44,79,163,247,71,126,212,140,233,157,64,184,150,153,104,173,251,33,80,231,173,245,32,229,247,238,207,219,201,115,222,120,50,148,111,126,106,12,81,72,185,75,53,13,58,203,136,53,35,96,105,234,75,177,167,145,116,247,103,38,70,181,178,61,32,176,11,186,175,169,81,114,212,24,56,240,219,188,116,4,157,47,52,114,144,234,176,7,227,211,204,66,247,230,53,12,94,14,159,216,51,98,246,167,124,251,111,50,178,153,246,191,243,188,23,66,180,121,157,230,15,180,119,114,6,100,81,190,206,41,16,90,200,76,234,49,250,193,56,122,251,5,98,247,66,65,89,245,91,27,134,82,106,79,255,247,43,239,62,18,234,219,51,9,242,145,69,218,24,25,172,249,20,199,127,255,183,119,139,37,17,140,114,191,218,178,86,155,118,134,67,73,99,168,28,248,29,23,115,58,119,213,195,237,31,66,161,43,22,61,198,186,211,105,178,180,172,148,159,182,154,96,21,226,205,219,103,63,180,133,132,181,120,119,23,151,32,156,118,199,195,198,143,39,138,3,116,186,124,109,228,45,27,80,155,131,189,123,98,208,51,146,153,167,195,215,103,36,63,253,247,63,120,192,183,160,26,79,44,105,233,151,219,12,98,200,170,210,166,95,150,205,128,163,110,118,173,202,238,149,15,72,55,161,83,93,217,43,175,153,94,192,163,115,179,98,7,122,183,174,102,251,134,235,169,246,83,206,91,91,41,25,45,184,148,132,95,207,30,213,251,233,212,208,133,206,109,105,184,34,69,145,246,222,73,15,212,181,40,73,79,70,241,118,76,112,17,86,155,53,204,110,218,189,235,22,1,239,25,27,234,119,219,57,238,107,80,46,114,26,78,205,105,242,95,107,65,138,210,20,238,42,83,230,99,169,17,211,197,2,199,118,132,247,57,7,189,0,53,33,15,229,133,73,99,13,234,1,84,15,56,54,79,81,11,152,159,151,95,140,85,53,167,65,249,120,1,206,120,244,16,95,154,243,66,64,217,244,62,140,185,147,151,147,122,149,193,172,80,243,252,237,252,36,9,140,97,14,154,54,161,7,101,49,13,183,39,250,155,156,32,44,227,96,4,151,166,176,190,56,113,75,109,253,67,14,88,229,198,232,217,147,180,238,203,38,20,111,37,183,170,46,163,122,122,97,156,97,99,228,184,142,50,151,96,163,118,171,47,98,97,190,166,96,155,250,169,52,69,187,215,162,79,42,188,123,33,82,90,58,213,131,169,243,213,135,58,127,7,82,180,63,171,214,112,254,146,55,143,204,55,252,114,154,44,145,208,154,214,237,254,145,197,107,212,74,143,190,113,104,95,68,118,63,174,227,229,228,28,147,95,59,213,219,216,19,254,22,43,122,101,113,84,40,149,138,100,220,242,221,115,208,162,131,48,201,245,99,42,219,91,77,194,45,88,87,62,125,84,47,58,219,205,206,133,107,61,254,247,164,54,155,226,43,9,39,141,25,159,90,24,1,96,158,153,186,122,249,207,173,245,190,8,194,118,131,239,61,122,168,63,102,191,198,76,100,135,96,193,133,175,92,91,232,208,239,51,41,39,251,133,126,81,47,122,0,200,78,233,42,73,253,240,162,54,89,20,198,130,34,151,26,88,145,220,196,247,242,242,251,62,209,8,56,31,67,36,174,39,210,25,164,133,217,233,115,24,128,121,105,70,159,157,159,68,81,217,94,201,38,188,60,43,15,21,129,193,95,244,142,255,158,21,154,55,94,34,18,143,133,192,73,140,134,26,101,197,23,170,27,245,59,94,46,247,20,214,101,54,215,254,116,78,52,196,222,86,200,33,95,219,130,192,165,159,186,83,81,141,31,2,61,154,150,103,222,136,32,171,77,4,11,220,125,247,4,168,7,73,4,223,86,46,226,137,186,8,157,63,70,164,146,111,86,167,140,253,228,97,64,120,237,70,211,241,207,73,229,8,201,20,205,194,92,57,33,176,42,91,253,38,185,158,79,211,37,104,195,42,119,7,90,189,189,176,183,83,182,221,84,152,103,88,59,79,196,142,168,12,4,69,184,138,43,147,80,10,167,244,24,186,118,163,126,164,192,230,254,61,90,5,197,80,240,145,243,219,31,136,138,232,97,115,169,179,96,0,73,151,171,220,236,123,146,254,212,250,138,22,254,105,191,6,151,157,203,252,150,122,106,80,17,33,87,172,174,76,197,237,230,28,122,13,230,234,88,148,95,221,222,123,184,242,93,170,187,152,107,113,215,152,29,135,13,106,237,212,108,170,24,54,126,163,221,101,223,88,11,219,145,75,200,12,196,102,100,108,81,199,148,169,203,134,32,69,159,45,226,198,126,131,60,148,128,70,147,182,102,51,130,37,212,248,250,236,228,169,150,112,6,65,222,120,193,50,4,54,101,223,157,80,111,188,200,255,47,190,223,224,107,133,56,152,204,253,195,109,162,118,23,122,36,10,127,207,32,134,118,19,202,198,84,55,58,222,59,240,118,206,54,182,235,207,174,133,180,126,97,61,152,192,87,28,97,234,78,103,14,113,20,223,48,122,145,59,5,177,247,199,217,29,64,3,30,156,83,148,88,143,61,223,53,243,227,140,103,39,147,124,74,80,17,86,100,191,126,169,190,175,146,68,184,79,173,142,6,198,92,126,178,113,146,248,225,164,192,168,184,146,253,20,197,83,225,198,111,183,114,166,73,55,223,235,156,198,180,49,161,248,230,164,254,98,59,79,187,248,193,173,215,13,44,5,40,62,107,124,77,136,43,28,42,102,62,44,120,89,203,41,182,123,236,208,244,77,205,48,106,231,44,226,125,105,252,91,252,85,234,113,59,198,248,144,139,233,74,247,83,135,109,53,21,212,210,184,39,60,229,138,45,45,131,138,73,190,246,151,32,188,164,11,223,91,108,103,235,94,190,47,187,20,208,228,131,216,17,47,236,218,30,174,140,5,26,111,148,207,29,207,233,244,224,184,178,61,203,235,45,250,123,57,127,239,85,133,67,160,33,95,249,125,29,47,239,228,150,117,147,128,39,101,168,126,221,47,129,6,13,88,104,164,92,61,104,102,163,81,62,255,206,33,87,251,78,179,81,15,35,74,122,95,3,213,143,23,88,76,102,154,155,89,169,117,178,215,10,182,81,190,126,125,254,56,161,83,229,70,229,102,18,195,79,66,156,74,154,197,135,13,195,235,223,164,251,12,101,148,207,207,160,182,237,173,181,102,2,165,73,179,203,1,3,151,126,163,252,225,235,88,249,40,230,110,36,167,45,70,0,233,136,159,213,9,238,8,120,250,148,149,245,78,38,107,91,176,106,59,2,166,218,254,243,58,30,19,115,253,116,51,154,48,240,205,127,231,203,188,119,174,112,109,139,146,84,90,62,133,146,102,85,211,56,204,95,202,157,123,10,213,156,222,56,12,71,245,243,177,106,178,75,180,122,116,216,231,188,139,0,27,204,245,62,169,247,181,28,99,255,168,35,37,111,247,213,16,148,47,156,195,234,23,97,141,148,203,30,35,178,238,6,227,144,138,96,222,238,128,191,143,240,1,59,185,221,141,127,255,80,191,218,20,41,199,99,62,41,187,252,253,148,230,158,60,212,177,40,145,175,163,181,70,203,238,197,184,125,45,236,20,7,6,219,183,120,151,155,156,248,31,155,53,17,165,207,195,160,179,170,64,197,61,162,153,15,130,85,60,252,42,31,33,12,11,35,189,234,207,202,247,167,59,246,135,182,27,133,248,53,34,175,215,86,15,52,178,124,44,70,245,100,255,61,128,49,142,159,126,143,230,127,82,91,185,242,155,226,81,112,36,170,183,202,252,22,95,189,231,63,4,242,36,93,210,106,97,76,222,89,237,105,240,137,175,150,149,3,59,103,176,17,82,20,245,85,231,242,135,203,211,70,167,64,42,49,249,125,24,236,58,31,19,247,249,254,43,243,74,120,188,194,162,47,28,83,180,222,61,246,131,110,182,89,130,216,107,195,253,55,234,159,15,223,187,152,142,140,28,83,76,28,111,147,162,253,214,252,21,47,167,144,132,207,62,242,58,113,104,33,25,32,77,14,98,171,221,149,88,109,218,164,127,248,125,93,5,23,185,178,56,186,156,157,127,62,152,157,95,2,23,19,195,118,162,86,191,135,106,198,196,51,200,31,118,158,239,202,12,84,105,91,237,205,95,220,241,217,232,207,142,212,155,104,71,245,108,251,120,146,223,182,111,97,14,179,147,188,224,139,255,252,11,126,243,242,203,67,150,108,97,131,30,175,64,148,63,187,18,96,138,192,246,31,128,97,248,198,245,191,136,10,226,84,183,180,86,57,93,150,65,227,19,30,38,143,3,245,223,224,25,28,153,93,138,95,92,64,72,197,55,96,176,114,208,228,169,255,164,77,140,35,189,235,246,108,66,95,233,88,43,233,184,203,255,227,232,188,227,169,250,255,56,126,29,215,222,100,37,178,247,150,149,10,247,168,204,112,78,8,25,101,103,43,132,172,36,123,207,140,16,113,109,18,178,85,100,101,127,237,113,147,189,87,246,184,191,235,119,239,95,231,113,238,61,247,156,207,120,191,94,207,207,120,223,162,55,133,148,143,108,20,179,117,65,224,33,234,113,31,233,83,149,47,72,227,10,106,154,96,20,96,211,182,189,225,204,96,212,114,234,243,220,87,29,247,124,138,123,233,49,186,205,33,241,156,11,236,159,120,240,112,122,191,222,248,31,229,104,189,238,209,221,34,159,206,45,8,41,107,229,58,69,131,198,144,90,198,249,72,146,210,64,192,246,218,180,235,89,91,202,92,76,88,149,66,239,40,238,247,43,76,252,246,7,252,48,79,26,158,115,174,52,245,18,9,221,54,73,156,50,223,52,82,82,244,25,58,221,198,157,111,204,244,63,8,96,41,176,10,205,213,86,192,241,251,8,127,233,184,230,73,185,117,27,118,193,249,47,62,12,236,183,18,138,213,106,240,252,210,124,90,77,16,27,131,139,55,202,186,90,131,17,142,52,143,241,5,2,154,132,97,64,126,82,93,118,130,203,77,58,64,218,75,232,21,26,66,42,20,26,71,209,4,76,19,127,231,9,105,61,89,134,1,199,47,27,146,103,186,111,188,245,222,134,168,115,148,40,175,221,220,168,127,233,181,181,30,218,215,234,231,218,193,1,1,140,101,247,175,239,30,223,174,88,237,23,227,173,204,208,189,21,17,58,249,228,67,144,209,147,250,199,83,188,190,119,193,206,215,177,28,116,78,205,250,2,209,68,55,191,157,48,128,252,111,42,6,101,124,75,217,68,245,243,59,31,14,83,193,128,217,135,206,123,153,92,30,47,137,134,167,173,203,26,193,80,139,138,110,94,171,40,86,161,228,242,109,53,9,4,132,228,59,183,155,81,246,240,5,2,86,255,102,63,118,68,57,20,127,209,79,223,36,252,52,14,16,59,71,237,24,130,104,217,159,9,25,245,125,231,181,156,157,144,223,253,82,156,191,251,65,46,69,110,30,73,192,247,110,164,112,243,28,199,75,249,103,233,122,150,199,15,202,5,71,73,105,3,174,230,55,223,11,78,112,154,223,176,249,77,82,96,86,134,227,165,32,194,7,117,163,213,45,217,149,50,251,209,148,32,82,247,213,208,120,56,97,27,164,106,184,82,226,178,12,134,226,239,252,77,216,190,45,45,22,178,72,248,166,83,9,85,161,234,48,243,121,189,9,131,189,71,82,112,151,90,8,230,87,223,112,155,241,63,218,150,174,76,102,54,37,114,71,9,118,187,153,13,238,16,153,23,222,153,17,175,186,150,10,137,47,111,24,110,199,249,96,188,82,8,159,5,117,1,48,80,89,71,42,86,112,52,233,73,54,241,36,86,42,4,230,31,196,227,177,137,177,177,163,224,123,238,162,242,239,22,72,76,125,208,88,176,86,176,217,139,172,9,76,250,56,138,113,165,161,65,32,176,17,229,153,148,225,248,212,76,37,179,52,102,115,231,45,248,8,68,129,80,58,201,207,34,30,148,248,149,30,243,116,172,79,219,4,221,185,119,83,24,226,15,27,52,36,162,110,190,83,70,168,68,137,71,148,143,26,128,35,231,60,68,154,204,154,182,232,167,176,200,78,148,237,94,225,8,60,17,222,241,180,246,90,150,218,15,234,43,191,71,42,150,172,123,74,192,21,13,49,229,181,234,2,237,228,167,79,200,43,149,30,89,95,99,69,80,41,129,128,208,91,139,111,234,103,73,223,180,172,84,103,136,2,97,160,46,219,74,18,168,75,242,34,118,118,145,32,123,14,163,3,2,163,202,71,52,132,168,140,119,98,233,9,23,116,73,241,55,76,223,44,150,208,72,210,191,8,240,156,181,86,22,36,17,119,149,187,123,15,34,153,126,45,60,227,170,173,172,94,173,226,243,235,69,135,226,167,249,55,76,120,241,42,48,32,245,157,79,44,35,36,4,97,151,70,77,203,31,12,2,115,159,221,245,169,103,181,233,90,116,49,136,23,158,48,32,221,58,47,168,147,90,120,122,44,250,175,239,235,87,16,80,11,142,124,172,233,177,231,181,102,199,234,121,167,13,68,166,143,143,18,223,26,75,118,241,171,227,125,97,102,203,245,251,207,187,250,130,45,13,189,147,160,11,107,183,98,115,8,73,117,190,51,177,251,49,34,101,172,112,74,251,206,53,8,105,50,196,149,46,37,19,162,84,213,192,251,103,156,17,2,156,35,89,104,125,212,132,6,14,249,46,67,156,167,80,194,237,67,77,182,203,60,102,177,148,71,148,88,232,51,167,28,75,73,53,153,137,81,75,241,166,31,193,121,177,44,12,172,162,137,196,158,86,220,175,56,38,94,139,102,255,167,92,68,203,197,167,225,104,192,202,233,224,90,196,97,139,224,32,76,201,106,8,65,88,85,2,226,2,191,139,127,170,64,43,119,42,154,139,133,219,40,193,235,202,43,185,215,70,80,228,97,180,234,225,54,188,169,38,164,47,62,107,67,72,28,207,220,79,126,172,245,138,144,126,125,44,221,100,218,4,167,55,165,20,195,218,138,178,227,166,223,39,252,95,32,192,54,75,153,145,46,35,33,185,137,22,131,11,222,147,61,41,96,17,243,234,236,209,240,206,165,207,209,133,239,35,124,12,207,34,75,73,37,11,131,213,215,100,45,108,77,21,55,212,22,111,165,55,31,184,170,119,121,223,255,196,144,150,28,133,254,212,101,91,162,31,114,155,251,19,188,243,239,27,140,227,97,90,175,175,140,250,7,58,82,19,111,94,207,83,66,128,80,115,177,177,63,187,138,195,27,250,64,193,143,13,240,143,7,26,26,89,50,252,169,222,127,158,47,171,123,70,161,0,179,233,229,111,60,38,177,34,3,34,131,122,131,210,160,45,189,70,166,91,94,238,198,93,174,80,37,209,91,129,16,250,221,92,234,254,197,151,183,124,36,193,175,171,222,156,114,144,2,243,29,89,67,205,71,181,73,50,1,182,156,81,32,208,101,97,9,81,154,77,3,2,31,25,70,77,250,113,191,151,56,165,239,123,226,161,45,207,236,38,181,208,1,134,210,229,230,197,108,241,69,20,114,212,254,5,14,237,113,229,155,211,117,15,214,170,80,145,204,205,214,49,58,3,109,43,73,40,76,79,173,138,157,149,245,251,127,9,124,195,149,79,88,237,161,206,27,118,154,154,83,114,230,245,72,152,152,69,248,6,121,216,157,38,86,89,111,98,39,204,5,76,156,50,183,61,168,167,166,65,211,166,96,110,182,235,8,135,62,115,184,211,22,44,71,73,149,94,167,25,21,114,138,211,167,116,23,248,241,196,131,99,210,93,223,101,97,67,104,103,74,144,188,35,181,234,25,131,244,223,112,123,13,64,87,48,142,155,229,90,181,61,47,43,182,34,159,153,53,148,131,240,162,230,28,31,207,206,237,154,156,21,246,240,188,11,238,84,112,184,213,223,255,183,113,244,95,244,54,68,225,138,211,235,152,246,33,109,108,43,197,211,105,0,217,45,15,3,238,57,86,50,215,6,3,227,234,66,55,185,53,68,97,98,18,233,207,211,133,249,50,248,138,199,161,210,174,9,16,50,228,78,117,3,125,181,118,169,27,124,114,253,241,218,213,122,148,53,155,189,204,75,97,218,161,178,184,140,235,48,112,247,178,95,225,108,198,121,212,71,39,50,136,217,17,66,198,204,251,117,241,240,126,187,111,207,233,245,232,196,152,179,66,219,193,207,216,216,90,175,197,73,143,141,138,222,6,87,63,249,246,92,71,183,84,197,227,239,250,55,52,52,128,109,166,30,159,7,139,48,109,220,86,202,83,41,236,26,112,232,157,141,248,197,15,146,83,148,15,82,28,55,207,190,163,144,218,98,219,31,39,25,157,217,243,179,76,78,245,220,161,206,56,187,204,41,217,49,103,51,42,4,123,134,197,153,212,74,67,96,237,212,154,79,70,251,253,3,198,202,160,11,144,255,5,151,107,251,102,193,154,35,87,38,250,48,133,148,163,59,142,227,203,162,5,156,82,76,255,142,150,35,36,18,87,191,70,14,29,122,222,25,139,75,239,67,191,75,232,226,238,87,86,225,132,0,232,21,152,78,28,17,58,104,80,46,18,220,80,31,186,152,221,250,197,229,135,86,227,37,6,1,79,202,203,81,109,110,43,183,16,37,254,40,190,72,8,208,8,125,98,56,167,170,114,251,158,110,34,39,83,41,52,160,47,108,214,179,219,212,60,42,20,23,156,95,25,4,1,96,178,170,190,235,128,239,55,111,250,70,65,185,36,16,248,254,211,226,1,153,196,36,73,88,225,35,32,23,87,254,122,15,130,141,200,131,144,95,91,42,75,141,231,103,96,160,250,59,191,212,88,193,231,195,10,226,182,40,185,95,16,32,27,62,109,50,197,157,90,206,134,240,242,185,223,14,3,165,149,157,183,109,14,24,220,196,248,213,241,57,208,16,224,153,199,246,97,61,181,184,150,92,115,78,241,191,119,48,80,240,1,45,179,108,66,179,110,194,57,139,223,216,5,2,253,4,190,143,41,79,199,222,162,71,8,194,5,53,80,192,188,235,250,113,249,93,67,32,203,40,125,56,177,5,228,231,220,25,168,181,41,148,115,127,255,185,228,41,27,126,127,216,242,220,47,109,249,7,44,47,216,13,173,10,133,245,65,64,187,248,247,64,180,102,183,7,111,137,16,141,114,8,8,244,228,61,125,164,121,50,25,238,176,28,20,206,203,10,163,105,115,139,245,29,173,107,223,126,171,228,213,30,146,134,128,169,178,39,12,198,223,133,220,240,187,53,63,40,154,193,252,113,207,236,236,37,30,174,147,243,195,2,124,179,56,62,178,16,238,127,84,51,218,116,12,91,117,206,18,7,128,200,186,113,134,15,14,179,52,3,181,168,213,195,209,97,24,232,185,235,169,247,78,227,173,74,117,98,245,231,168,70,92,249,188,143,90,136,206,188,166,176,38,87,147,131,7,65,157,68,177,101,225,69,22,111,147,198,109,181,53,117,20,175,242,255,172,200,244,40,255,202,224,27,59,17,199,16,67,177,156,14,18,169,86,25,53,70,79,231,246,66,244,103,33,238,187,197,198,97,110,140,73,219,4,161,250,150,215,7,192,78,112,128,116,222,38,237,149,128,62,208,233,163,183,175,76,74,50,178,37,199,167,70,145,170,196,18,58,40,218,5,34,69,156,202,198,121,121,255,206,152,126,222,90,247,209,195,172,102,206,17,91,77,167,181,243,118,32,144,81,179,124,112,104,104,224,143,37,7,13,17,10,36,130,246,140,159,18,162,238,248,181,235,211,115,238,188,219,212,166,237,165,75,40,133,188,203,233,160,25,254,69,133,58,89,21,192,76,62,129,129,197,184,8,81,42,208,84,0,252,247,251,198,223,235,112,40,193,124,247,178,213,209,239,32,197,68,230,178,40,105,16,88,23,217,154,165,216,142,34,177,93,160,163,28,147,134,129,163,46,82,41,249,94,189,198,30,30,29,113,76,55,8,96,10,50,159,198,141,71,33,164,146,110,96,108,154,112,253,107,142,79,65,211,171,53,224,240,71,47,221,197,29,56,212,234,103,241,240,134,246,72,200,95,188,16,117,191,122,152,248,109,32,15,143,163,213,67,42,159,74,82,10,146,109,24,120,153,22,42,227,88,118,224,190,49,11,48,36,130,179,81,55,53,31,25,175,231,49,241,33,20,17,194,235,119,103,255,191,223,153,213,202,161,201,140,66,144,243,249,179,171,253,85,173,180,31,111,224,128,89,60,168,196,42,182,143,2,152,71,91,56,35,16,230,254,4,63,208,239,9,113,188,204,181,91,149,98,140,64,32,36,92,149,137,136,33,29,80,243,145,151,64,233,177,178,87,97,131,156,114,131,50,169,193,129,184,212,67,50,178,119,199,9,252,217,43,204,32,176,139,242,213,209,80,33,135,103,87,132,5,89,196,65,164,118,244,16,191,182,182,15,217,155,229,244,51,69,43,72,21,161,55,63,235,93,241,64,246,6,147,28,17,187,48,168,170,239,146,229,119,84,244,212,59,49,155,148,207,136,31,215,62,7,114,24,157,202,238,221,35,68,175,228,255,171,133,0,223,247,166,172,134,193,35,38,47,178,138,20,92,30,128,0,87,128,194,237,136,20,247,7,25,82,70,86,162,158,28,110,34,37,81,217,213,181,23,81,140,99,57,175,127,123,192,0,95,54,190,20,226,139,122,101,153,161,148,87,194,115,152,152,43,40,151,209,105,54,51,120,57,94,248,11,177,6,8,48,110,12,10,83,22,133,16,140,200,87,240,95,24,128,170,55,42,10,121,23,111,60,113,125,108,237,44,9,84,224,252,247,79,145,226,75,179,131,144,242,216,218,29,159,54,56,52,168,139,240,225,34,97,15,105,190,161,97,142,135,9,24,74,92,109,87,234,53,141,125,175,194,40,195,34,160,32,133,220,238,59,215,167,184,166,118,235,67,1,194,180,140,31,2,248,176,43,88,107,4,98,190,242,210,153,86,67,11,66,246,243,121,22,211,175,100,157,90,160,147,13,131,155,64,100,102,253,127,196,137,212,107,63,50,90,90,154,255,77,65,200,136,131,141,58,169,140,7,235,213,142,153,156,197,76,56,158,105,241,171,219,101,75,142,121,198,73,44,137,175,133,139,207,93,107,146,201,74,215,235,190,120,77,235,155,221,132,144,235,75,30,197,85,249,196,190,160,165,89,208,106,16,204,15,84,167,108,125,190,174,71,132,141,45,216,17,181,132,168,5,74,134,10,151,19,89,126,121,5,119,136,183,31,67,64,255,199,100,41,247,174,172,28,150,155,139,162,51,37,32,167,177,127,162,252,135,246,180,254,163,105,139,9,154,90,152,159,75,56,221,161,154,203,228,247,102,10,125,28,13,29,10,96,249,162,88,188,42,119,116,228,79,56,198,97,50,1,113,94,208,21,137,110,7,120,220,75,242,110,209,61,48,66,169,46,117,77,188,202,158,176,251,202,245,48,156,107,252,7,166,11,213,147,124,127,234,116,241,232,115,87,75,185,115,5,184,66,168,81,84,52,188,124,162,104,126,243,105,197,110,52,8,216,111,143,60,137,37,180,48,78,115,18,60,42,219,70,217,18,174,251,191,176,112,252,227,227,16,224,181,148,154,0,1,54,231,83,82,216,10,141,245,232,234,179,74,249,155,160,42,98,167,112,222,234,166,191,226,251,130,31,11,230,248,16,80,252,111,74,209,2,49,117,186,39,39,175,53,227,8,2,19,47,218,199,117,154,207,253,94,254,218,60,81,114,1,137,157,127,242,165,56,111,249,223,229,132,38,159,110,56,163,0,227,5,131,175,5,79,77,213,30,39,25,165,237,6,64,192,242,142,250,61,175,111,17,155,142,113,142,188,58,231,48,32,86,136,190,103,97,170,8,21,113,33,76,181,16,168,208,170,57,151,142,245,109,198,152,123,12,188,225,51,254,16,247,162,138,112,77,14,123,93,233,80,215,227,165,3,23,93,23,55,77,45,131,11,149,177,41,205,41,147,55,49,100,82,43,153,57,69,245,47,184,175,125,255,101,53,30,49,30,54,27,149,32,25,247,244,131,36,82,131,158,63,140,93,217,26,70,11,150,24,101,180,187,126,108,14,120,46,211,185,109,13,2,86,237,38,79,40,67,7,148,18,223,43,125,144,195,241,81,71,184,146,252,11,101,205,160,112,118,86,4,192,1,118,226,185,124,177,113,78,215,47,165,4,124,166,166,34,97,192,119,183,93,22,171,227,205,243,142,18,8,96,207,214,13,101,118,111,193,156,245,202,186,239,81,60,240,233,98,68,1,68,17,33,237,63,81,52,28,156,0,7,59,59,192,181,66,104,127,170,185,205,161,89,160,22,176,52,242,215,190,223,53,145,251,228,155,206,107,98,126,97,246,133,136,157,112,101,96,123,108,123,106,27,131,23,80,120,107,88,83,178,11,197,29,241,227,115,249,243,15,51,254,23,216,11,172,249,49,108,75,40,204,22,146,43,165,77,104,220,114,57,113,153,13,2,47,253,20,15,168,37,162,195,239,48,36,126,36,193,131,112,60,250,45,91,231,78,83,31,121,7,102,86,230,57,4,132,204,205,25,189,174,235,151,79,100,232,203,160,37,198,245,215,220,39,229,39,190,37,190,28,247,63,255,186,17,143,226,119,60,168,40,253,80,58,93,176,78,56,227,155,40,32,133,78,195,91,179,229,41,189,95,212,185,227,249,71,219,25,199,111,245,165,183,177,88,215,62,15,31,250,127,249,145,96,39,137,240,100,98,114,203,104,161,97,161,232,251,35,106,84,201,31,183,81,123,27,66,162,134,25,96,132,34,141,20,21,154,208,181,126,158,99,230,240,229,215,125,67,34,226,167,176,106,104,160,189,253,160,171,54,205,160,159,67,43,249,230,21,207,196,91,141,185,43,88,171,191,88,32,2,187,192,149,91,22,119,123,215,91,156,26,114,125,132,19,51,104,97,151,134,23,155,142,6,70,165,209,86,253,100,35,51,127,117,119,216,34,223,99,38,28,49,199,249,118,41,37,179,156,240,138,101,137,78,74,230,203,41,97,79,6,110,157,219,127,149,201,211,87,31,212,229,44,93,251,193,140,215,78,63,162,3,119,74,91,196,243,58,218,212,190,189,254,208,242,199,199,13,56,212,230,106,62,129,11,147,184,56,69,233,191,235,15,3,77,117,104,209,134,11,179,126,236,155,76,237,236,9,156,63,239,254,237,110,136,252,226,241,252,119,62,222,227,73,20,63,231,65,154,195,79,164,189,109,41,209,118,255,50,174,188,212,45,244,162,252,206,29,47,62,29,172,80,196,89,128,192,32,81,233,104,84,31,25,141,27,230,142,188,53,174,191,12,34,29,71,201,239,135,109,140,179,46,46,189,221,193,233,57,97,146,190,38,143,210,217,199,31,252,138,95,218,64,96,145,191,204,252,209,86,167,219,23,61,13,250,208,61,28,63,243,4,67,145,44,158,103,43,212,111,86,61,243,193,54,253,81,71,187,71,19,98,2,61,217,168,56,54,4,42,178,1,122,20,46,192,235,124,57,87,196,25,175,111,38,133,76,218,38,17,73,184,11,110,222,35,194,175,200,175,1,137,129,129,226,97,231,100,209,34,253,70,37,188,251,119,224,206,15,129,63,144,90,86,97,20,255,116,4,42,159,35,164,118,168,201,109,28,139,219,77,251,140,148,147,200,254,250,162,82,87,15,197,153,37,78,30,211,49,135,159,255,251,201,120,181,63,101,102,42,47,202,15,63,99,119,32,198,176,3,10,37,56,184,227,44,89,17,229,204,22,240,99,240,214,125,140,174,145,150,115,84,229,106,188,104,173,57,202,150,212,31,199,87,46,39,175,88,238,61,32,200,143,149,125,196,197,2,2,149,57,198,74,26,109,163,247,149,152,130,242,206,78,80,43,13,93,67,218,101,3,54,152,38,194,181,231,253,232,171,252,41,152,146,147,133,102,253,19,1,34,125,68,51,8,24,6,233,205,70,236,132,42,61,97,64,116,210,19,195,232,247,28,68,36,165,106,2,84,132,187,209,13,161,195,56,191,150,99,53,16,110,221,245,171,52,239,115,100,34,53,164,42,64,77,105,63,46,121,125,226,254,106,5,119,218,111,8,169,216,80,168,165,119,163,223,131,38,205,134,255,120,25,82,165,116,201,175,227,124,247,240,75,39,187,208,125,246,0,120,133,50,119,61,126,115,11,243,54,176,82,4,58,123,196,65,216,114,111,47,209,0,47,91,62,133,196,40,236,195,109,156,255,183,176,202,188,44,219,56,203,19,89,82,249,120,149,223,35,118,84,181,38,49,97,231,128,137,99,183,41,25,230,127,227,94,42,159,43,232,139,127,65,84,202,243,143,5,38,190,91,157,178,10,47,137,17,85,15,144,78,12,98,149,215,88,185,192,229,23,158,52,63,242,200,208,100,213,255,224,216,60,235,106,54,127,204,164,232,113,84,143,115,174,75,159,132,250,156,215,41,1,2,113,171,180,39,245,142,144,90,223,255,231,159,175,191,252,72,99,48,201,137,8,7,149,95,144,18,80,250,217,132,81,252,185,243,216,194,37,20,184,26,239,46,178,113,196,201,55,158,4,128,247,236,6,188,226,59,95,180,252,176,191,58,164,245,161,191,151,77,3,220,25,248,204,198,78,43,98,157,28,161,106,180,53,174,133,107,79,107,95,187,41,20,137,222,203,114,12,143,166,145,192,170,55,34,123,228,199,170,87,157,30,250,38,252,206,250,9,139,55,255,93,245,232,185,222,79,22,139,49,127,246,70,5,86,37,152,95,31,222,210,206,12,33,74,103,124,102,47,164,28,174,39,44,191,63,121,120,30,248,159,105,118,245,67,111,16,120,182,156,244,68,51,101,109,31,79,183,89,105,16,231,231,100,187,8,21,178,167,223,122,41,222,175,148,36,174,237,39,41,11,4,216,94,61,106,222,147,101,237,139,20,229,2,113,122,37,80,37,252,245,168,39,96,74,172,174,219,226,106,61,236,125,169,102,35,185,195,237,166,114,76,4,43,238,121,54,188,49,181,119,154,54,229,93,37,37,156,157,96,64,162,114,73,180,37,166,106,203,248,246,54,65,108,154,114,17,177,187,167,39,23,9,25,255,250,61,150,156,12,160,159,36,77,205,190,222,218,93,172,138,159,72,41,52,117,23,210,164,252,35,90,64,125,156,172,40,19,56,47,206,76,139,178,141,82,43,174,127,190,107,61,179,70,72,209,227,38,12,33,197,248,234,138,171,82,27,54,14,99,74,21,39,59,96,126,61,139,226,69,43,120,233,61,21,115,207,113,49,35,12,96,252,111,250,45,102,8,24,227,197,219,11,226,145,67,128,65,116,200,225,95,254,125,249,199,51,67,172,212,164,208,14,155,195,163,110,199,210,39,125,134,117,58,28,207,40,97,224,160,149,72,129,57,92,191,222,66,226,144,201,98,26,167,87,167,31,110,58,239,110,173,97,139,126,178,38,187,65,109,146,178,26,203,186,252,79,72,33,43,211,182,156,120,40,148,68,167,172,78,176,68,235,11,201,46,153,169,11,178,87,72,42,215,34,189,182,1,115,55,240,235,176,82,90,41,8,76,173,87,155,82,141,53,124,248,119,241,243,112,64,14,4,246,237,127,61,141,101,68,140,176,173,125,163,88,26,133,84,111,184,25,62,30,124,204,180,216,70,128,208,141,241,130,248,117,37,167,117,194,184,147,255,163,203,33,243,208,120,135,139,7,221,141,3,58,44,212,205,161,94,22,121,44,81,16,50,193,191,165,65,239,237,237,213,63,253,255,100,143,34,80,161,229,207,246,70,110,27,188,150,27,213,61,157,202,123,140,2,108,212,182,29,42,239,222,140,181,240,110,80,240,108,0,249,53,92,50,47,125,107,244,20,13,34,110,30,19,75,193,128,84,85,241,189,200,252,61,224,111,57,125,197,150,3,142,255,43,8,38,226,31,204,244,215,32,45,88,53,171,64,126,106,151,10,222,77,183,106,197,16,180,173,226,1,142,207,155,200,20,79,245,42,191,103,78,42,230,82,57,182,194,232,208,192,135,106,218,250,175,30,215,178,169,191,137,149,233,181,87,168,158,62,109,211,240,243,33,51,158,60,90,146,231,234,76,229,224,95,44,197,30,47,220,127,216,249,241,26,191,178,160,128,195,170,183,251,168,40,87,140,116,162,67,125,37,200,255,230,231,135,178,253,130,205,11,243,195,80,143,73,6,220,253,116,19,201,174,65,227,197,157,242,109,79,221,194,81,252,234,26,9,26,10,223,28,253,47,194,54,255,141,146,129,104,34,247,117,155,222,252,63,35,248,75,115,163,255,136,116,93,68,98,53,52,196,4,52,92,211,19,232,40,35,222,160,66,163,87,63,133,32,184,62,103,202,179,13,40,145,252,197,213,231,70,95,161,115,233,100,183,60,65,167,202,230,109,152,63,247,187,128,192,230,2,55,133,27,106,43,207,141,20,84,189,158,180,204,171,46,235,85,249,86,153,59,229,223,23,221,141,119,80,86,199,209,129,15,80,241,30,189,219,226,9,1,68,69,1,119,95,40,243,4,60,82,242,213,232,141,130,109,139,134,46,63,178,205,50,179,5,54,123,152,237,89,192,252,209,220,108,55,235,188,78,179,56,155,107,236,214,28,161,80,189,18,244,31,185,39,194,162,215,143,123,10,40,206,65,224,98,44,235,228,131,53,214,53,183,175,16,245,55,18,197,127,96,231,127,34,116,151,69,162,79,13,251,239,252,82,130,240,247,54,94,101,184,202,115,218,66,245,70,239,106,60,92,124,20,32,221,253,45,144,46,223,167,22,113,121,143,72,121,77,96,254,158,255,205,106,150,47,189,162,213,15,87,110,160,184,137,176,185,173,110,97,227,35,47,46,254,59,48,241,190,210,247,107,191,190,239,221,38,156,154,116,114,48,178,4,67,41,221,87,109,212,228,39,42,17,127,96,235,236,16,169,21,151,249,105,184,165,201,55,171,54,204,225,132,16,231,159,98,148,200,216,213,88,176,54,183,216,16,245,1,252,168,21,164,251,148,71,151,249,237,154,117,58,50,42,127,44,138,152,107,189,69,200,121,83,108,182,235,93,198,196,248,56,8,156,116,215,122,80,253,30,171,216,127,196,138,159,75,4,218,18,72,135,187,178,149,187,207,168,224,194,239,117,218,171,241,156,162,243,156,22,153,25,47,182,107,54,197,193,80,236,43,242,249,167,55,35,177,250,105,139,58,9,156,195,40,32,98,72,177,170,208,16,123,244,210,95,50,33,246,5,108,75,176,241,177,96,108,201,144,207,173,255,43,71,252,79,24,168,171,47,186,119,45,254,229,124,227,118,70,245,152,130,114,55,42,247,161,90,249,20,93,120,134,162,151,248,223,3,120,37,46,199,89,59,174,128,71,167,37,182,91,40,244,38,184,3,58,84,139,54,232,151,151,81,104,11,223,96,117,81,86,167,220,80,117,147,207,207,9,44,101,6,165,123,94,193,43,10,92,51,123,142,29,101,111,219,44,250,240,206,43,64,126,124,247,98,95,45,235,156,169,183,205,164,109,215,170,112,241,185,196,208,160,42,77,90,119,60,160,239,32,183,177,95,45,80,128,210,217,74,74,108,125,149,202,86,124,226,4,230,31,193,195,231,19,17,16,161,104,161,66,33,68,196,113,124,54,73,162,224,117,199,228,108,231,179,232,227,16,27,56,84,200,98,141,99,121,180,236,125,173,140,217,235,224,1,208,150,52,183,98,115,173,198,174,212,28,141,29,104,139,7,129,101,148,233,40,121,248,139,191,183,174,101,61,41,206,132,87,200,28,106,23,13,127,249,58,92,138,26,224,5,27,131,128,177,181,163,190,150,85,73,175,231,6,175,58,150,15,6,132,138,86,110,23,202,37,152,229,255,167,208,67,112,142,226,255,239,217,80,122,106,141,121,202,61,170,172,44,182,199,32,50,229,235,127,76,141,177,239,144,76,136,216,127,244,23,202,47,120,127,254,37,236,209,161,249,37,29,136,88,77,12,83,126,65,96,129,47,224,232,73,55,20,253,228,43,211,83,70,28,255,30,136,123,129,68,100,182,220,117,6,18,203,236,16,192,202,78,209,62,165,67,23,108,240,232,32,16,227,1,2,51,203,189,214,148,60,52,117,129,170,118,207,62,177,130,104,68,69,188,181,149,208,157,38,66,49,222,79,171,193,184,251,183,235,91,209,122,30,110,145,46,145,235,248,178,13,182,141,152,3,248,236,93,19,104,142,151,157,223,218,91,150,17,61,92,184,213,169,225,179,74,254,172,27,81,246,0,139,139,223,93,252,98,212,236,120,217,186,63,50,130,246,26,102,136,18,184,100,15,238,199,26,27,65,224,141,166,135,72,56,52,248,251,95,94,10,34,17,138,113,109,62,97,157,56,104,192,78,19,122,45,213,92,37,255,68,173,149,8,25,129,2,166,242,12,102,133,88,254,40,190,93,16,192,107,158,130,0,87,160,247,155,33,255,166,149,239,193,203,74,114,115,140,0,37,62,167,104,240,194,239,161,243,66,54,202,235,234,16,183,239,193,243,251,213,137,95,123,71,10,245,101,100,199,225,80,150,131,76,167,82,49,69,252,107,212,44,123,46,107,176,42,97,245,71,231,242,155,198,248,111,23,40,114,229,186,80,128,99,226,81,170,140,190,42,86,73,234,163,4,205,7,88,117,85,153,135,79,140,136,132,34,49,182,101,71,239,11,180,34,79,93,79,92,108,207,147,86,103,89,99,211,171,50,75,99,214,85,95,142,64,60,249,87,31,25,72,67,86,57,27,133,191,155,89,131,195,101,4,183,37,149,224,91,28,143,0,65,191,12,42,40,17,136,88,106,154,159,15,92,112,254,164,114,3,7,26,174,20,167,74,244,79,118,111,194,192,69,93,183,228,99,39,17,65,176,218,237,214,93,110,144,24,207,101,224,179,149,128,105,245,251,253,239,243,4,210,16,82,195,222,174,240,165,64,39,73,34,140,46,175,222,235,237,136,239,23,137,211,64,94,211,73,148,225,80,206,247,128,6,76,35,135,210,230,35,158,58,179,133,81,117,185,113,131,43,158,7,34,165,121,63,244,48,168,58,91,69,186,158,43,222,73,51,53,252,46,77,103,193,30,162,58,170,8,182,221,137,181,100,230,201,235,211,81,245,203,202,48,186,128,59,153,126,207,95,22,188,49,188,53,174,160,103,170,123,12,81,7,254,218,157,61,248,120,175,161,80,181,112,92,13,167,231,102,11,122,179,145,91,98,255,62,217,79,29,82,32,64,126,188,131,123,77,69,53,7,155,74,219,63,75,242,138,81,14,17,144,186,247,103,30,189,75,109,78,29,230,216,15,40,160,234,141,66,75,150,220,143,133,188,186,18,198,70,2,136,156,241,143,104,139,91,160,35,117,58,127,41,229,39,99,212,70,84,124,117,231,51,30,170,81,0,251,244,36,217,4,199,55,39,29,138,219,119,91,102,57,151,73,119,128,54,221,53,247,249,149,215,165,135,57,225,175,105,218,29,122,140,97,160,97,183,75,177,116,198,127,171,5,235,127,226,135,192,197,151,42,155,179,212,133,157,113,199,119,149,195,152,20,46,52,131,110,243,236,236,205,102,182,172,76,142,241,112,54,20,64,53,68,148,243,83,196,19,191,182,161,193,179,178,22,21,62,187,231,231,190,70,179,116,228,116,148,93,73,197,4,135,18,111,188,201,58,17,160,44,101,23,174,115,242,187,68,197,214,229,59,154,248,36,99,234,84,4,110,7,201,158,67,43,200,92,243,98,63,204,157,69,250,120,186,51,116,189,20,55,139,66,184,88,186,153,61,62,230,163,227,230,33,142,55,199,108,74,141,116,204,162,179,75,155,140,164,157,63,235,110,236,44,124,75,84,47,246,122,241,173,116,188,220,197,31,92,161,136,127,26,94,179,153,246,57,48,153,189,53,224,25,206,127,138,244,61,214,189,239,80,40,78,48,234,148,177,41,201,223,221,53,174,25,52,217,244,181,110,102,231,229,14,8,217,18,112,201,245,215,140,230,203,210,189,8,179,27,160,4,1,141,136,198,62,157,141,15,11,181,28,63,255,180,34,80,128,167,213,217,191,221,187,125,3,100,40,58,164,194,6,132,124,105,93,121,38,213,180,231,108,86,88,42,79,255,4,6,246,11,209,183,61,45,229,26,15,105,87,255,60,158,132,0,248,95,170,204,25,226,40,241,141,24,15,108,178,4,1,165,36,235,223,219,159,88,245,127,203,149,110,20,91,131,86,152,7,230,215,139,166,186,62,173,61,161,207,242,240,6,109,101,29,132,146,194,199,102,28,88,118,15,107,110,117,66,64,142,154,215,39,61,215,142,201,182,145,214,111,161,253,16,63,253,193,236,97,220,236,199,90,54,166,252,21,166,55,32,192,101,236,45,157,140,168,205,45,97,75,27,148,201,192,197,187,221,60,169,22,154,70,1,229,183,212,157,2,207,65,85,9,46,207,164,58,191,13,95,46,68,99,125,228,17,132,22,63,24,159,212,73,88,88,188,233,114,125,105,121,80,121,173,229,93,179,77,238,224,51,239,176,163,235,150,57,175,113,122,46,254,121,67,119,189,249,94,72,77,235,87,121,22,112,133,70,120,221,161,111,80,31,253,212,253,226,26,219,9,142,39,74,14,94,157,72,97,184,61,131,82,205,240,249,192,80,18,46,158,94,231,178,194,210,79,159,67,19,141,239,65,200,2,145,218,6,46,250,10,173,218,210,242,63,78,248,189,68,9,2,179,12,121,167,234,146,213,54,251,148,150,141,112,103,234,156,205,195,242,207,29,84,3,148,21,128,23,62,167,3,225,111,191,137,187,255,126,220,52,212,142,43,66,0,16,206,223,172,217,114,37,61,252,180,22,218,63,241,18,137,211,223,246,144,227,152,115,132,142,147,18,147,113,205,59,41,160,9,219,117,209,177,171,27,40,54,63,106,170,137,198,93,47,71,141,47,166,160,131,10,241,48,128,254,235,50,8,96,87,178,142,41,251,72,161,252,251,242,174,159,112,188,118,49,236,124,198,244,59,205,181,234,55,169,247,167,143,56,253,37,250,156,61,148,218,182,243,232,64,147,255,193,8,216,118,250,113,91,96,59,234,194,14,172,253,186,228,58,0,2,85,152,179,30,211,198,42,250,55,137,12,251,187,145,32,231,197,183,2,87,150,39,19,117,203,137,108,82,92,25,32,112,191,101,99,196,228,13,114,252,218,209,32,157,73,34,132,70,11,148,78,87,166,196,196,80,44,252,42,232,34,236,21,162,20,22,102,18,53,228,161,194,95,252,122,105,67,166,188,161,40,121,42,16,149,91,82,237,68,133,197,158,43,194,177,11,194,239,137,13,151,146,179,161,231,47,116,23,104,81,161,179,133,153,60,31,5,166,188,122,96,220,249,115,20,183,6,248,57,27,74,197,98,176,189,102,222,102,60,184,227,7,255,63,54,193,234,29,97,93,130,149,195,19,44,27,196,94,86,251,72,134,73,64,58,156,177,48,98,123,123,123,115,123,19,15,209,129,197,98,203,47,57,234,135,63,61,58,241,89,190,231,6,236,177,188,6,79,97,213,63,2,152,175,163,174,186,116,246,205,9,120,161,151,208,78,252,210,236,161,123,74,105,73,93,222,43,230,48,75,41,228,250,132,168,59,245,215,245,203,184,164,111,186,200,39,16,240,243,76,45,193,149,166,215,112,28,195,33,167,23,130,82,205,224,48,58,216,84,212,246,91,50,20,44,58,81,236,219,125,176,185,17,114,80,168,40,101,249,66,253,167,234,34,132,38,22,143,55,28,95,43,253,178,202,253,250,218,197,57,84,1,151,200,215,150,151,122,60,10,247,58,61,80,126,11,163,131,86,137,75,53,212,52,40,188,180,228,16,24,44,132,164,179,150,95,165,143,141,55,203,234,146,149,222,63,132,109,99,159,61,20,232,109,35,37,43,143,63,122,171,89,15,161,41,42,162,172,23,210,212,100,186,243,14,185,2,241,117,5,227,22,62,28,99,46,120,35,7,220,173,134,117,157,97,224,100,80,64,177,79,48,35,104,80,130,165,211,235,30,4,164,135,143,179,218,211,12,153,198,250,164,45,150,17,163,0,171,32,199,144,70,30,43,246,6,181,73,209,12,81,28,239,12,147,131,155,53,230,174,169,186,16,83,230,53,16,169,27,59,192,148,237,69,143,122,225,154,78,190,112,10,34,235,254,99,48,156,173,46,18,240,223,242,180,69,139,246,18,241,9,55,69,99,204,235,50,251,242,227,211,157,111,194,170,253,115,212,251,143,65,62,178,99,49,30,110,43,58,80,149,178,90,232,96,127,237,89,95,192,183,227,48,75,85,24,112,252,254,80,161,57,81,233,181,168,118,208,157,206,91,240,202,243,145,89,69,199,101,17,124,172,189,152,18,165,57,132,148,72,77,48,59,96,24,90,141,143,95,52,214,63,229,28,96,159,71,62,184,110,65,213,45,183,158,127,169,46,173,27,203,46,92,36,147,129,15,166,10,195,198,66,171,157,56,255,4,130,54,189,91,12,191,208,226,233,91,218,58,168,208,160,174,96,3,254,206,33,204,49,225,45,1,142,6,176,147,200,34,46,34,179,175,165,150,157,150,38,246,118,11,87,44,251,111,108,121,238,180,216,24,150,164,132,127,71,19,254,241,69,48,183,134,73,205,234,198,159,77,45,63,172,2,206,79,114,113,102,110,250,77,175,231,52,226,15,30,227,248,84,246,96,167,190,254,240,90,171,154,33,227,28,80,193,89,34,56,192,187,94,82,236,28,231,182,64,118,169,130,139,231,203,63,181,38,181,228,223,48,199,102,86,232,199,217,96,186,210,115,100,72,236,26,136,203,38,42,222,138,169,6,128,182,20,226,107,156,54,172,166,18,215,12,44,235,159,239,64,128,136,157,79,159,153,165,73,243,139,35,185,242,183,221,82,58,96,129,139,135,132,220,52,214,0,237,180,144,229,11,2,190,57,90,58,145,195,31,58,229,74,120,30,196,81,247,237,82,227,120,153,214,226,34,211,78,248,217,45,16,213,23,133,63,63,151,160,133,135,48,55,71,16,234,16,78,206,214,173,82,34,6,190,101,205,40,204,38,160,78,169,110,192,182,83,187,148,120,166,26,49,100,220,230,180,45,59,56,254,219,31,176,146,50,69,137,132,62,185,214,143,255,215,68,153,148,49,104,155,86,75,143,14,136,113,163,160,5,59,193,182,123,146,119,241,84,12,31,52,6,49,67,85,173,248,96,27,116,112,193,31,176,77,39,214,180,135,181,19,188,3,182,245,189,98,85,235,54,190,167,243,141,94,245,185,163,26,10,152,207,179,251,228,99,184,169,244,178,192,19,235,239,9,85,200,104,162,10,203,155,228,186,237,8,166,134,229,149,149,5,41,131,236,28,105,106,111,74,6,190,153,139,200,58,131,144,61,75,30,118,35,236,52,170,42,180,28,134,74,184,248,130,9,137,50,162,88,60,150,167,82,134,208,39,248,16,114,61,255,159,93,181,36,137,241,125,113,5,110,21,35,28,223,137,30,213,210,112,232,170,166,38,179,138,72,51,64,109,239,130,124,252,105,222,196,172,88,124,214,191,125,24,13,33,99,14,15,79,36,158,148,161,151,176,175,238,229,173,129,200,177,195,107,19,27,118,35,98,124,206,23,166,92,139,168,255,136,255,136,249,86,103,78,18,67,24,193,211,25,47,220,245,248,252,167,220,131,208,235,61,97,46,107,159,159,194,161,55,165,223,201,61,100,195,226,159,147,109,72,215,7,130,170,105,28,106,167,231,255,141,8,234,190,58,106,158,253,9,1,41,95,71,15,207,83,63,253,222,90,154,188,113,151,157,51,245,114,210,144,76,22,59,118,57,134,255,73,137,88,9,4,220,35,199,188,117,131,186,43,246,28,20,6,249,222,93,141,87,28,251,91,253,138,124,59,245,196,38,24,17,9,2,90,157,211,67,154,154,104,169,211,214,19,1,206,70,174,157,196,95,103,157,102,122,6,77,42,2,111,127,151,19,130,192,48,217,226,40,149,101,189,132,212,86,67,148,7,61,76,60,166,150,252,229,203,183,73,35,196,243,215,103,26,189,16,80,254,94,203,221,158,123,222,194,228,145,9,247,116,18,212,201,196,53,220,80,147,245,234,51,189,53,199,104,253,17,8,24,218,111,154,106,57,213,165,53,78,127,127,101,114,128,2,198,252,199,26,10,229,142,116,188,124,126,204,136,64,48,32,221,69,164,112,16,153,56,228,48,145,58,123,87,28,226,167,113,41,155,120,145,33,40,74,194,147,27,52,174,8,135,210,57,84,137,44,42,96,200,63,36,92,239,121,138,243,71,7,130,101,79,180,245,22,19,254,187,151,199,76,222,11,161,57,231,71,107,38,207,221,197,24,243,67,180,188,200,161,21,139,106,185,125,175,131,167,203,108,227,29,6,120,36,32,240,114,209,113,148,162,177,120,112,212,143,46,143,81,85,217,65,65,178,95,209,77,32,210,58,135,110,231,178,162,10,2,130,106,66,112,250,237,63,165,93,201,242,60,191,4,215,254,7,52,12,150,255,122,150,51,194,212,160,110,44,10,72,57,7,107,10,20,169,43,191,187,57,149,197,75,130,104,253,157,148,250,3,180,120,53,101,2,35,31,7,5,10,160,227,160,98,32,82,192,122,250,59,98,40,89,113,253,11,59,81,123,102,108,242,219,176,118,75,236,49,81,19,12,12,27,180,248,30,205,214,108,171,218,60,244,136,33,128,196,39,80,229,29,251,131,187,181,247,168,239,204,229,157,160,0,178,152,240,144,118,158,91,113,204,242,52,195,127,48,202,130,49,42,111,48,235,251,175,138,250,239,58,136,184,164,67,109,59,155,139,243,174,71,218,231,71,203,103,166,244,227,186,130,231,150,116,99,31,206,45,147,41,62,223,181,76,105,68,1,33,5,68,218,33,124,179,19,54,70,138,58,62,178,56,127,227,78,220,33,19,34,200,202,98,185,68,213,35,129,34,206,204,217,77,121,115,185,185,180,108,32,214,180,3,195,43,158,37,137,34,223,133,180,102,249,159,235,39,122,136,235,198,138,71,58,233,93,214,172,250,123,140,25,75,124,49,67,117,146,184,122,39,127,109,185,238,41,157,117,96,24,206,198,65,202,34,124,215,212,56,221,108,31,85,253,105,237,85,132,100,104,214,51,20,227,208,5,143,248,119,111,238,26,173,38,136,27,171,165,184,34,241,175,153,198,180,197,209,172,97,20,5,216,20,251,44,55,49,18,59,17,42,79,49,237,24,227,120,116,128,170,236,50,68,197,148,241,155,18,97,208,115,72,85,125,64,219,95,193,218,250,211,6,255,192,81,252,9,142,55,185,6,56,151,27,51,223,79,130,91,220,10,212,176,109,240,179,37,149,205,213,97,250,170,119,193,243,123,174,16,0,30,187,40,62,80,30,77,36,173,69,191,213,147,68,173,236,172,10,52,161,249,140,36,126,235,30,41,42,126,68,1,68,117,33,181,237,76,88,10,172,34,102,255,12,171,235,242,21,105,150,197,214,114,137,189,119,83,181,126,21,5,2,103,213,49,103,215,85,82,197,21,126,215,27,229,57,224,226,85,255,195,51,198,236,40,166,2,77,1,99,235,18,174,80,211,221,233,139,11,83,51,51,255,172,176,135,73,97,184,250,32,37,109,15,194,215,187,122,209,235,81,66,156,100,193,159,116,174,41,107,198,203,209,151,23,180,37,194,136,221,249,171,55,30,194,184,254,251,75,99,119,16,29,72,59,229,115,102,118,201,134,40,70,23,212,164,247,18,249,214,88,146,204,4,22,111,148,41,205,70,160,163,224,206,32,187,244,184,137,25,140,113,128,223,194,196,205,173,171,124,114,198,255,213,10,220,184,129,240,74,87,104,220,151,66,10,157,237,85,51,143,220,233,183,150,30,163,29,200,131,208,136,216,36,155,233,120,85,182,110,203,75,118,115,1,152,56,232,25,17,129,86,82,28,221,143,71,23,182,179,10,87,249,151,157,245,215,218,178,196,201,95,127,220,183,126,143,90,185,201,245,125,41,58,90,59,207,46,12,163,32,251,254,42,95,202,170,12,103,19,10,18,106,61,232,50,68,95,229,223,249,143,56,32,254,199,36,91,109,94,198,199,73,169,149,254,64,122,3,235,226,48,206,53,132,226,115,202,67,16,232,249,171,249,52,226,193,237,35,167,63,25,217,101,202,48,176,249,133,84,161,2,179,164,215,77,159,96,91,168,4,33,25,71,185,112,95,129,203,19,215,46,178,99,113,215,119,70,7,75,254,215,136,175,42,138,232,142,124,227,15,29,39,110,212,96,166,61,135,155,178,149,250,46,174,151,193,170,120,213,73,167,239,179,94,19,18,163,51,49,47,137,112,122,29,182,149,40,41,107,65,153,14,140,145,31,137,65,182,188,177,244,182,236,17,54,130,44,193,38,93,47,213,65,192,32,91,203,82,235,31,48,25,175,4,106,246,120,193,192,203,33,123,133,226,52,125,117,177,233,50,146,74,38,142,112,75,124,189,204,151,77,45,102,153,140,173,119,218,216,49,187,179,107,246,251,19,167,214,203,65,161,84,93,1,233,186,69,173,239,234,154,155,22,158,5,168,51,132,158,149,218,67,252,122,46,129,15,254,120,19,213,124,203,94,25,48,58,6,1,27,181,143,127,40,200,104,182,48,235,182,94,166,185,32,176,251,43,217,54,102,222,125,228,226,228,167,74,6,94,111,196,200,247,63,240,131,226,55,133,132,24,11,188,21,52,104,75,153,36,235,177,118,106,57,22,72,251,117,167,134,15,66,95,23,79,126,157,215,64,82,182,194,239,34,101,197,3,171,22,60,227,225,139,178,9,161,112,207,250,181,71,243,86,185,136,152,139,128,79,75,138,17,21,74,18,98,203,40,4,135,70,229,60,122,73,193,71,70,118,139,137,73,202,164,5,6,68,178,243,68,111,101,225,87,55,197,190,11,242,21,133,84,245,105,37,194,188,227,137,249,98,115,170,216,145,88,16,77,52,48,55,252,104,53,43,253,225,208,56,55,82,31,4,230,44,244,166,201,93,188,214,157,164,166,52,158,224,129,21,58,86,71,158,79,155,122,147,158,227,89,200,253,34,68,197,178,111,156,56,255,187,156,196,54,211,171,222,197,220,192,241,97,210,95,191,243,79,220,209,239,110,58,140,215,71,129,252,182,3,123,13,206,114,114,213,15,62,187,210,71,17,67,72,227,6,150,44,41,146,225,148,34,86,93,49,135,183,156,59,87,250,204,153,196,64,107,199,201,245,135,26,113,197,211,175,211,17,136,215,223,6,162,56,222,187,242,72,142,7,26,213,141,101,93,28,33,16,236,214,41,27,9,51,100,128,69,66,201,87,0,129,80,185,70,117,142,190,184,90,127,83,177,104,106,227,32,146,39,182,16,220,88,3,19,55,231,132,217,211,44,254,162,60,73,46,77,20,148,4,129,38,11,203,39,145,49,251,245,202,146,175,166,175,37,67,0,81,108,194,208,107,243,230,173,230,150,175,54,82,46,168,181,172,61,57,95,127,186,218,83,190,133,4,19,165,48,152,24,111,195,59,171,86,164,133,119,95,248,150,81,18,18,2,88,46,199,24,173,22,57,157,107,119,198,195,38,241,174,246,139,247,59,75,240,61,164,114,40,37,104,170,203,133,194,13,216,147,133,227,39,130,15,216,46,158,111,50,244,195,196,36,238,71,39,39,135,181,132,191,99,238,154,22,38,64,191,21,90,125,106,37,38,52,96,75,161,174,179,15,141,160,42,236,110,56,143,246,78,16,79,16,39,91,248,105,138,235,223,202,49,249,97,166,82,133,195,115,24,60,127,98,84,201,39,218,95,97,142,124,216,183,236,111,203,119,86,120,65,91,122,174,180,202,152,166,59,219,207,242,186,200,233,98,112,124,49,158,114,118,125,4,21,64,86,107,236,230,255,9,210,41,223,184,145,113,148,191,55,29,252,92,150,244,204,2,199,155,165,135,230,180,143,194,202,150,19,243,171,16,185,32,154,219,165,209,215,160,128,94,76,123,85,214,133,48,82,183,232,157,165,60,219,81,85,190,77,215,237,31,69,132,209,184,248,236,194,215,36,217,70,86,203,92,8,159,81,151,73,133,102,41,211,122,79,86,229,177,157,182,110,153,215,134,235,134,75,106,14,9,150,150,62,214,157,34,24,36,250,129,193,241,79,88,98,98,70,88,4,77,171,48,23,89,18,78,111,44,228,109,102,133,88,7,62,171,237,78,198,23,69,129,170,136,159,180,166,62,53,91,159,159,17,61,246,183,161,133,1,129,162,213,123,67,175,245,54,225,180,84,113,254,251,189,61,127,230,212,185,156,133,244,202,24,111,92,15,250,45,140,2,224,82,248,15,223,141,47,55,47,40,176,116,254,155,92,196,53,57,141,45,222,210,188,65,179,68,142,76,248,236,32,224,24,241,203,82,39,176,232,175,162,255,169,201,122,233,85,126,202,40,125,109,254,63,96,5,251,84,70,75,16,142,151,67,19,31,197,210,33,134,194,248,47,183,245,22,184,136,233,221,49,37,115,163,27,236,197,100,234,228,118,184,242,170,188,238,211,162,199,128,252,166,245,103,114,105,77,26,5,216,43,159,114,122,42,110,158,173,26,225,109,148,242,131,0,11,243,115,105,61,98,9,187,255,110,14,37,150,36,234,18,227,245,252,215,123,71,94,163,70,182,152,207,80,215,5,180,141,82,75,47,28,200,93,31,11,204,238,218,27,74,133,0,43,60,193,86,42,254,165,120,123,238,56,85,128,70,87,56,26,89,238,217,177,232,111,232,236,111,127,254,242,228,106,253,189,243,49,165,202,10,181,160,82,36,138,129,122,182,55,232,11,20,25,36,192,139,169,13,37,244,91,31,134,218,182,182,183,79,4,74,99,213,143,138,23,252,25,84,33,196,230,226,230,242,230,34,30,2,241,109,218,180,250,29,72,204,226,208,50,182,220,181,92,157,37,91,51,53,177,15,171,134,44,204,92,206,126,108,254,184,102,237,76,55,68,40,249,24,101,126,231,70,199,253,176,212,184,198,199,236,73,218,202,234,71,109,153,152,229,237,87,63,78,218,119,56,215,247,116,129,221,169,205,153,249,65,101,163,61,247,25,162,185,99,76,251,198,230,234,118,224,20,81,77,214,158,123,244,110,16,78,63,138,159,187,231,169,182,191,39,65,90,89,232,45,235,2,56,158,219,221,158,11,132,98,158,20,109,241,154,40,171,191,231,46,195,108,239,251,66,223,12,111,106,2,135,48,49,190,131,209,199,35,241,235,220,216,71,139,128,245,41,23,146,40,34,36,184,93,165,221,165,122,163,224,190,87,9,142,223,162,178,141,172,213,238,63,209,142,27,16,98,90,233,237,152,52,43,185,129,53,159,109,192,23,57,155,92,223,238,219,53,4,215,108,121,122,71,140,28,5,10,252,169,122,224,21,93,135,167,172,213,146,26,55,119,174,119,11,125,117,164,27,184,17,233,49,209,98,61,56,225,161,199,122,22,106,137,139,215,27,241,206,85,246,19,73,106,73,12,163,218,156,56,190,151,194,174,91,189,167,230,115,238,110,247,79,9,129,128,109,123,167,95,152,138,62,245,175,213,55,94,145,26,193,182,132,37,31,157,106,59,60,9,47,103,168,78,246,196,80,64,111,249,128,253,241,245,19,236,83,127,149,102,226,5,48,244,166,120,215,55,175,175,175,75,31,153,8,255,136,249,11,173,120,186,112,21,89,38,22,100,46,15,132,124,80,139,187,218,95,199,70,94,235,171,202,182,206,189,67,176,47,128,82,77,251,62,48,83,94,109,183,254,225,33,221,182,63,22,94,121,55,116,239,230,77,140,233,205,246,71,69,111,73,23,112,245,219,193,232,195,192,187,227,26,173,196,236,204,155,129,2,34,122,201,10,218,141,70,220,255,236,79,96,15,176,229,31,126,89,202,241,71,60,52,23,79,4,137,187,211,127,234,18,147,236,108,47,211,30,120,167,117,156,165,66,11,166,87,251,45,211,75,26,140,90,234,9,14,113,212,58,8,33,67,44,197,38,120,62,90,218,219,180,27,122,58,145,130,232,235,37,153,238,63,122,31,89,24,87,151,46,212,176,227,158,71,108,112,115,199,40,210,91,169,41,91,177,242,76,153,148,196,221,51,165,254,63,218,108,155,247,183,232,111,254,128,109,41,122,8,91,30,91,39,5,147,121,254,243,232,167,132,248,185,168,203,199,185,127,246,222,38,187,143,13,121,251,30,86,29,14,116,212,118,182,178,161,216,161,92,49,255,184,113,181,94,117,89,210,104,178,93,89,65,169,224,173,219,30,12,84,182,242,200,110,83,236,151,59,73,210,62,226,176,64,9,247,124,145,247,202,225,209,3,252,195,39,2,142,16,202,221,76,191,207,198,6,107,214,139,137,158,112,237,188,81,2,145,206,177,95,248,185,169,135,135,172,191,189,138,157,190,3,174,88,252,100,136,146,137,180,114,226,72,193,188,84,40,4,85,137,118,34,254,106,181,164,136,17,94,71,216,90,238,193,43,250,145,189,103,124,191,94,62,174,177,155,123,244,97,254,106,126,86,96,213,233,161,26,133,17,201,109,47,170,60,16,152,201,190,255,148,92,239,209,108,95,104,173,195,181,48,24,40,255,182,40,26,224,23,83,185,192,20,30,106,199,10,3,171,217,203,50,250,208,159,40,26,155,7,134,209,68,184,207,127,46,53,210,0,39,90,87,177,215,222,142,209,194,58,229,191,123,207,164,71,251,62,21,253,249,245,94,166,78,183,40,96,193,211,161,238,140,183,150,202,129,69,161,72,23,167,103,243,42,6,114,101,219,238,121,195,165,247,233,159,225,202,71,156,179,80,240,29,23,219,68,91,10,37,45,0,34,181,227,43,58,175,223,234,140,123,109,224,179,168,95,12,33,21,235,210,181,171,154,247,215,142,20,11,213,158,49,72,168,103,124,207,150,28,251,253,249,44,231,188,42,112,53,72,183,232,38,121,247,233,86,187,206,111,187,38,41,201,10,82,24,189,164,204,167,22,101,87,78,65,248,13,69,193,104,141,233,82,208,75,182,219,143,212,84,59,48,207,168,151,145,83,142,175,3,212,175,179,150,42,176,51,153,240,17,5,168,161,116,220,93,26,49,178,189,83,148,29,210,164,227,74,219,32,177,70,16,131,86,230,150,119,19,183,213,215,92,137,119,112,104,116,142,21,159,8,159,26,77,12,252,233,61,165,17,8,248,175,102,142,70,245,118,222,18,186,217,175,173,100,127,245,255,13,26,26,219,49,186,244,81,28,124,111,86,182,97,254,183,56,189,235,7,218,201,243,40,69,48,149,239,65,164,150,211,151,212,195,188,199,67,75,212,186,26,139,15,174,242,233,205,40,70,52,27,31,108,219,60,204,214,12,252,63,223,200,18,62,107,9,67,242,32,147,139,97,84,232,242,247,91,152,226,173,209,200,187,12,230,83,229,143,80,226,132,37,101,86,18,91,98,255,29,210,173,179,255,173,239,141,192,231,42,160,210,125,140,64,40,125,11,10,139,127,222,75,103,54,231,44,138,64,124,24,78,101,231,0,168,137,175,242,109,91,217,81,33,16,171,82,111,90,61,34,159,112,82,115,46,111,108,124,236,136,232,184,218,129,117,135,234,106,255,235,222,133,83,254,138,239,39,214,251,36,192,16,174,253,253,88,187,189,90,234,242,145,144,7,43,51,213,170,220,141,183,33,247,200,171,220,237,131,87,119,251,211,241,18,20,183,222,223,34,146,95,25,191,4,75,128,100,245,15,49,168,162,160,47,133,77,53,172,199,250,42,223,42,100,31,203,67,220,19,198,51,27,16,243,246,240,199,59,41,16,217,4,87,73,72,155,98,67,33,76,127,226,175,157,58,147,145,175,171,206,66,190,124,206,150,145,26,240,92,174,42,77,73,69,57,156,185,100,98,191,207,183,252,155,207,121,125,196,51,18,200,225,110,54,166,96,239,48,145,227,58,117,254,39,129,65,220,253,116,241,41,198,118,108,4,104,117,184,249,240,244,226,120,212,161,73,56,200,183,231,119,207,128,193,22,169,205,213,252,162,154,34,199,187,212,76,42,124,13,44,157,57,4,68,100,114,25,60,176,82,116,57,200,220,29,59,180,6,129,213,1,194,109,90,166,62,116,243,191,159,251,130,153,87,235,51,87,238,13,36,254,125,25,95,184,102,106,224,3,3,213,93,36,224,231,145,233,23,183,74,9,30,183,16,192,128,226,110,190,236,162,205,235,22,43,69,11,197,202,112,24,152,143,49,243,70,8,169,229,233,160,186,187,239,203,129,192,212,59,19,163,71,140,205,217,162,205,218,113,91,209,48,240,44,44,244,94,33,215,98,14,89,221,54,229,154,98,47,17,163,105,83,116,119,78,58,190,117,157,229,161,88,57,234,26,226,143,64,217,97,132,115,18,231,9,63,176,152,6,33,53,246,158,79,233,102,24,179,207,159,32,3,36,174,161,52,241,52,245,226,62,36,29,136,24,149,10,158,230,239,225,206,47,55,174,87,249,149,219,7,198,213,251,133,161,65,192,130,172,204,84,167,169,146,237,240,160,234,200,27,31,231,7,196,127,222,88,205,176,248,184,198,109,110,160,208,8,243,23,114,240,168,149,255,34,165,136,116,254,179,124,107,8,2,132,208,233,122,47,249,35,220,110,109,17,11,176,100,128,0,38,52,73,95,59,178,56,208,35,236,247,243,64,24,68,35,196,211,60,108,132,244,138,163,153,23,123,74,187,161,208,133,176,91,242,110,197,119,21,24,149,184,152,25,130,33,32,165,204,200,3,43,39,120,119,80,167,245,63,60,118,8,224,123,119,35,201,14,239,59,233,36,214,57,73,207,0,70,199,207,253,69,110,34,237,104,136,152,57,145,164,199,16,63,222,0,141,93,197,186,179,118,230,226,248,122,101,14,174,124,56,238,57,81,56,92,147,107,79,101,103,71,234,192,196,247,28,196,163,146,22,210,28,29,121,101,37,136,174,247,118,108,185,215,101,158,11,254,196,198,251,11,224,163,149,117,129,197,177,177,158,174,90,188,201,144,232,155,101,189,235,56,190,184,220,24,203,156,155,34,110,236,195,127,197,73,4,197,86,32,203,21,69,11,252,125,62,90,94,114,122,206,130,192,253,172,141,97,86,199,153,159,135,126,173,198,162,43,16,240,176,37,71,241,119,43,119,0,9,133,216,115,205,119,32,242,207,58,30,250,210,48,240,43,243,78,205,121,98,60,188,82,220,150,209,220,108,234,151,53,255,113,107,242,209,6,206,159,85,59,123,62,193,143,150,147,209,148,127,201,251,14,231,55,211,6,141,45,7,223,55,172,208,229,136,170,228,193,157,63,243,124,253,252,46,103,62,98,177,238,10,17,53,202,225,161,80,121,75,203,148,87,236,251,239,191,63,125,194,135,126,236,108,174,247,226,117,182,127,90,53,178,113,234,109,84,86,15,54,159,109,158,97,67,176,199,191,63,203,231,68,224,244,118,51,91,66,84,201,242,19,177,1,159,224,253,60,140,192,167,174,151,229,242,91,229,63,239,5,178,158,213,110,99,120,220,221,176,71,79,77,106,47,166,70,123,89,168,177,82,220,158,46,84,71,153,88,163,178,168,216,55,149,20,100,87,227,211,102,158,76,109,117,222,188,74,242,172,156,239,112,254,89,179,188,229,103,211,224,242,141,207,111,145,215,222,206,146,8,21,31,11,181,172,30,190,250,168,113,60,183,218,137,59,47,173,230,186,141,17,201,139,47,168,252,74,56,11,134,234,113,165,158,104,249,175,218,112,38,80,186,168,55,75,34,139,235,204,156,101,213,2,249,94,164,219,24,160,241,165,116,72,52,231,35,170,63,55,29,57,85,206,33,101,114,36,85,211,236,34,70,156,79,155,94,222,140,250,87,209,43,15,17,227,57,40,88,85,75,203,123,249,18,190,77,147,158,130,0,127,1,209,181,153,241,35,219,177,166,73,184,206,25,5,92,100,57,206,159,202,72,249,140,54,147,76,39,37,244,135,217,84,167,109,239,215,220,119,183,212,152,99,176,250,5,2,66,13,207,235,18,126,119,38,111,209,39,57,41,43,73,197,178,147,175,139,190,252,124,164,223,243,199,251,41,123,57,199,175,241,81,190,180,181,148,72,147,250,218,33,46,151,40,156,222,206,103,94,186,99,189,55,45,154,99,217,226,1,184,147,201,33,233,102,127,177,160,72,127,197,210,84,133,63,167,106,40,94,176,233,246,251,187,113,183,48,198,186,22,121,48,154,152,107,149,86,251,40,242,237,192,22,97,101,47,206,15,33,132,187,220,10,244,150,197,59,190,94,130,212,201,202,107,22,22,247,249,52,82,152,127,89,146,81,223,189,215,139,90,209,62,72,181,26,158,210,126,93,76,213,144,187,40,2,241,211,28,104,238,149,114,207,150,81,230,61,146,111,156,149,66,42,222,127,167,19,249,14,127,242,22,23,29,187,200,5,136,244,196,241,111,160,142,254,80,35,244,181,241,50,254,106,189,113,5,58,153,253,203,80,218,145,221,197,92,60,12,248,180,6,139,202,219,166,58,241,61,149,106,227,9,192,149,183,75,81,242,246,45,38,247,199,233,125,93,65,32,8,204,183,249,154,107,80,115,61,136,26,118,82,89,218,230,20,182,60,200,220,14,73,243,230,132,222,121,18,85,28,41,147,226,239,252,147,181,143,236,87,226,110,88,30,252,102,12,135,6,5,138,39,57,90,169,81,32,86,153,167,52,188,36,169,3,93,229,158,40,148,141,246,221,151,26,16,164,162,130,144,38,93,198,89,171,183,144,237,8,113,68,27,107,29,28,74,249,243,121,202,242,249,200,91,115,254,61,161,3,173,153,117,228,72,147,109,225,107,21,65,132,9,90,49,51,9,215,30,118,212,150,151,75,158,22,49,80,228,240,36,127,135,209,20,243,225,140,78,70,238,65,180,81,64,228,254,63,41,106,125,7,136,108,57,79,87,160,160,50,76,123,80,12,86,141,158,3,150,5,5,52,168,46,144,104,215,203,230,171,241,48,195,177,204,193,200,218,27,43,193,86,133,28,224,10,231,207,107,102,101,249,69,7,28,223,91,29,159,166,64,72,223,110,195,40,9,231,135,222,84,214,58,47,82,110,227,234,195,33,206,42,108,65,56,121,113,206,223,47,116,24,167,119,202,118,97,155,63,84,200,186,68,43,168,170,137,65,100,249,208,49,98,246,96,20,73,78,252,131,164,180,14,247,60,255,20,34,114,238,212,81,168,160,72,174,249,39,192,232,111,115,27,3,241,17,81,84,162,15,52,40,230,178,112,223,255,254,57,140,138,128,140,204,135,166,107,147,249,62,7,33,35,219,151,196,217,77,167,37,201,88,21,174,164,91,96,197,0,239,112,93,237,172,244,163,240,4,45,41,166,200,62,230,101,167,177,104,230,47,77,235,195,66,130,4,120,242,189,68,124,108,19,209,183,102,229,95,101,26,20,118,29,74,192,161,119,74,26,68,50,185,53,156,244,134,1,2,183,69,120,101,158,131,79,173,60,34,142,226,193,115,58,199,9,119,8,200,45,34,217,123,146,131,24,173,190,183,184,215,113,0,3,197,57,157,247,246,255,173,104,119,247,76,32,227,90,96,244,208,247,191,200,94,238,135,84,22,201,106,52,70,104,221,23,193,110,77,153,44,124,160,109,246,97,146,118,171,38,28,58,146,19,17,85,185,192,75,193,240,218,182,174,114,18,180,21,218,41,226,117,44,127,211,244,96,48,245,168,205,108,86,194,100,238,78,19,14,135,155,74,66,194,244,52,190,93,173,223,206,141,142,187,202,15,70,108,30,38,195,132,218,145,91,188,124,8,147,12,44,90,22,73,81,147,203,194,170,250,120,212,129,138,209,115,41,12,28,164,151,28,55,64,238,210,168,98,187,85,150,40,69,5,170,111,202,85,122,40,135,12,21,125,129,103,249,101,97,73,59,133,148,97,49,32,119,76,105,84,225,109,179,233,151,118,85,234,135,207,136,192,80,179,138,185,120,199,116,105,197,135,217,63,142,230,211,96,224,100,34,76,140,67,117,37,232,199,108,255,92,143,54,234,218,163,214,59,229,84,97,8,103,60,117,161,127,69,68,48,154,104,99,247,214,72,179,163,227,204,20,189,143,194,2,10,48,118,199,52,174,202,251,177,124,42,82,231,14,111,133,85,61,75,48,98,187,205,83,90,158,177,229,30,228,188,24,158,253,222,114,222,12,201,133,234,216,243,158,87,61,227,32,241,205,146,137,146,181,20,173,245,116,85,157,55,135,67,16,39,209,33,2,159,241,243,178,97,210,23,3,230,255,94,128,192,79,190,140,1,157,165,70,120,254,226,26,140,247,29,2,60,43,50,245,125,7,156,163,4,241,114,120,181,174,246,51,142,88,84,20,176,110,29,141,122,142,84,197,222,133,128,170,157,167,50,190,52,232,127,211,147,238,54,158,41,32,160,200,27,57,20,253,107,226,186,7,33,235,203,219,145,32,48,38,216,251,132,246,27,231,178,163,162,232,148,77,27,4,40,162,217,220,124,219,67,226,21,178,74,69,203,35,97,128,175,112,233,54,109,247,66,147,224,195,134,17,18,25,208,86,118,228,82,228,98,131,239,0,25,116,30,123,103,18,2,46,208,125,94,94,134,83,147,177,38,139,221,50,40,16,232,8,126,55,26,83,147,47,1,28,127,239,159,140,6,1,173,191,79,71,41,117,126,147,191,116,208,114,95,55,0,129,76,227,110,89,214,223,218,226,99,173,132,63,126,201,193,64,213,119,98,69,210,34,116,206,142,126,144,139,81,54,68,172,49,32,216,227,52,45,213,175,97,53,76,121,73,139,235,127,92,155,149,209,47,63,188,204,59,90,33,188,46,6,57,92,255,99,98,35,17,209,120,57,81,52,252,56,239,30,28,154,16,150,252,245,124,129,151,10,57,138,56,10,56,133,249,35,158,217,217,151,7,11,80,172,95,150,10,50,209,65,200,24,172,76,173,68,190,23,239,162,84,38,116,157,8,84,77,235,42,17,41,230,42,112,198,187,67,16,98,47,9,118,50,85,84,230,59,114,201,20,82,86,64,4,110,56,63,154,240,253,7,119,169,144,8,125,62,68,83,172,147,10,134,82,238,68,192,219,130,238,78,209,203,175,58,9,203,112,241,117,39,151,209,185,72,198,136,161,8,193,28,160,222,87,199,85,146,65,214,240,224,136,217,126,236,49,197,242,12,10,32,250,78,181,212,107,186,28,235,25,230,57,230,233,9,2,203,65,214,14,209,191,137,116,164,60,67,171,54,127,193,192,221,181,240,135,204,169,238,44,177,71,238,167,219,51,56,189,158,26,233,233,106,193,243,102,211,222,181,106,161,83,6,150,167,48,189,61,117,120,220,195,17,118,89,129,47,161,182,201,145,254,253,103,41,195,24,203,181,255,182,153,190,41,227,62,63,215,51,216,130,151,247,60,61,75,47,190,166,175,110,88,174,199,130,202,142,184,218,140,36,187,255,207,60,8,28,233,59,187,166,182,101,138,75,53,37,179,166,142,64,109,255,245,119,29,225,233,211,121,24,180,36,153,6,158,65,220,197,223,126,91,221,162,123,123,153,244,89,49,120,162,31,215,158,90,254,141,101,90,207,184,215,82,62,58,11,88,6,1,223,110,204,107,189,224,33,183,144,110,102,178,79,184,250,87,88,139,130,143,154,60,177,62,115,141,84,211,190,56,61,30,160,86,92,10,120,221,160,194,182,74,162,114,192,133,36,139,32,11,106,71,126,23,199,52,91,127,28,237,3,43,162,91,47,77,47,63,94,178,41,249,210,32,206,214,102,5,178,10,187,252,14,107,57,200,159,17,143,84,116,97,97,116,207,208,229,199,230,150,75,54,164,254,107,44,22,171,12,108,175,94,189,241,196,195,120,47,253,142,137,36,145,187,87,19,174,152,192,153,126,221,229,215,97,39,253,2,113,2,23,18,93,242,245,187,225,172,42,67,171,31,112,245,129,211,111,204,190,247,221,244,242,107,211,132,245,146,104,254,221,75,83,63,204,101,115,51,155,170,106,245,107,20,16,244,23,127,61,76,156,165,236,156,176,44,243,200,7,23,143,130,108,255,37,7,24,51,43,210,47,114,140,104,73,133,154,174,187,233,14,110,158,125,196,156,80,173,111,57,131,157,210,226,255,50,36,244,107,238,208,124,250,204,75,223,169,171,122,61,168,165,192,115,108,64,214,32,173,96,213,208,16,14,85,176,136,50,149,133,151,130,167,98,54,216,31,157,67,109,21,86,119,151,159,241,117,173,110,183,180,101,125,176,131,144,85,47,108,28,57,50,74,203,47,236,205,213,19,211,224,78,142,141,10,143,32,123,99,211,129,23,150,182,11,242,16,255,155,18,73,233,228,91,225,165,62,11,220,46,172,56,255,201,113,29,146,128,165,62,8,189,36,255,196,114,173,128,131,176,247,239,139,16,37,243,245,180,170,106,31,19,169,8,41,116,0,30,131,215,211,117,149,228,142,157,80,2,178,133,171,252,8,39,197,86,83,210,248,219,245,135,124,114,200,171,253,67,255,61,89,77,164,45,46,32,46,69,114,220,225,32,196,103,86,124,127,190,55,236,83,252,234,114,118,10,1,2,19,129,90,79,162,128,33,188,139,119,9,187,90,153,255,239,127,211,26,143,239,197,146,62,19,125,160,101,129,243,175,75,193,150,143,124,58,53,167,173,216,90,95,121,192,192,122,229,138,168,254,226,60,123,174,168,0,249,59,105,212,14,248,51,22,52,224,191,142,197,228,52,49,147,156,93,237,239,91,17,53,124,97,241,220,135,182,187,88,142,236,42,191,74,133,170,198,35,22,249,163,236,110,36,191,13,212,73,123,96,103,182,180,65,84,73,142,112,216,124,119,75,183,130,81,231,63,25,89,241,164,49,228,50,233,57,155,6,104,43,17,203,206,232,68,169,239,248,94,135,137,95,120,18,66,154,173,75,104,193,215,99,213,63,215,243,191,59,192,93,207,198,222,121,162,134,87,167,184,163,116,106,196,150,11,6,44,82,145,178,236,70,33,222,238,25,193,173,145,16,212,137,39,30,110,247,180,97,89,148,37,216,217,224,182,50,172,154,49,71,72,230,232,145,252,248,104,81,247,223,2,158,238,14,67,9,190,252,157,47,53,103,127,191,25,19,105,22,112,109,140,46,164,150,191,209,107,7,100,244,116,92,201,148,112,122,252,253,143,10,5,62,15,153,172,145,27,131,123,79,111,68,116,14,154,211,177,133,209,158,94,102,241,232,179,132,114,56,241,111,236,240,216,217,231,158,104,228,173,92,154,143,186,47,8,200,151,239,190,252,149,152,156,211,213,91,78,68,143,2,48,210,70,220,118,38,125,52,113,117,45,117,71,196,144,170,157,142,200,216,139,170,130,252,110,68,225,134,187,171,114,184,85,228,145,175,123,217,194,252,198,147,107,185,142,199,40,114,33,114,41,233,148,20,42,127,148,191,25,105,118,0,106,67,104,67,199,83,143,185,1,81,203,121,168,151,181,137,243,99,92,31,14,55,253,183,223,15,48,120,217,15,240,226,202,191,78,80,177,233,152,236,190,28,49,233,187,47,180,202,107,15,64,1,13,87,61,150,23,146,95,3,184,84,229,97,254,23,243,187,124,54,222,229,65,12,239,48,163,78,10,112,39,13,238,216,215,179,255,173,103,38,145,117,107,26,108,171,32,156,105,118,177,175,105,73,105,155,240,199,234,28,4,12,45,76,166,201,93,234,130,164,249,106,163,177,171,202,47,60,28,140,135,186,51,106,234,180,165,59,223,189,150,188,154,159,154,130,224,200,17,25,242,84,107,129,63,132,48,112,134,14,22,61,98,29,62,28,174,231,83,69,198,192,170,253,57,32,207,230,2,63,217,211,217,10,186,227,84,24,29,18,24,17,177,109,175,70,69,154,65,116,3,127,93,57,28,192,39,224,211,146,166,127,206,1,113,44,5,206,226,238,63,251,151,168,196,147,113,237,33,231,82,154,175,97,152,48,252,32,9,86,58,16,239,106,192,154,76,47,17,119,108,145,60,42,210,142,192,29,211,215,242,27,161,84,3,194,110,151,44,173,222,99,69,4,210,94,191,35,213,87,233,195,138,24,216,113,216,239,46,190,192,179,178,196,61,95,92,78,97,233,75,27,1,170,209,144,222,102,170,13,20,121,174,202,40,209,114,62,85,226,170,129,240,222,7,51,16,89,59,250,223,74,52,195,241,33,55,226,199,203,255,112,252,210,159,159,55,164,209,150,41,193,107,149,65,192,199,12,117,154,75,234,221,26,54,99,114,204,95,164,117,99,193,213,159,141,214,122,145,24,91,149,66,101,21,205,240,54,49,12,212,14,105,40,202,2,119,79,63,213,125,141,125,65,2,133,222,116,51,207,161,121,120,97,249,57,24,123,152,146,13,3,7,221,194,160,209,18,53,16,121,207,99,254,205,37,4,100,53,119,178,44,50,229,146,38,222,85,173,139,37,238,95,125,160,235,230,150,56,163,179,91,149,190,197,52,154,12,113,70,73,72,253,232,179,125,208,119,251,132,209,39,225,37,8,12,46,231,141,234,186,23,87,191,184,81,196,252,231,43,4,200,198,154,24,121,181,183,109,253,110,151,15,218,26,133,128,150,95,89,238,174,187,154,107,2,113,133,146,199,56,125,246,137,166,52,194,138,59,95,82,214,84,219,120,46,227,244,182,104,233,118,245,98,2,172,110,210,145,138,247,10,5,120,9,248,223,112,100,99,222,164,42,98,121,214,208,129,2,124,245,188,43,138,141,101,117,143,76,106,12,9,105,64,0,4,29,160,24,229,122,99,177,159,147,138,127,113,122,202,21,250,78,70,212,156,86,130,129,182,50,80,245,4,199,127,115,150,70,84,169,191,239,182,116,24,255,71,155,2,3,206,173,220,178,15,153,229,164,119,217,86,222,171,148,193,128,244,228,11,48,2,255,117,74,160,141,219,53,214,119,48,32,191,49,8,39,166,78,242,187,216,179,52,164,64,48,63,224,94,106,215,115,212,78,232,71,208,143,221,167,130,128,152,177,92,253,7,1,6,198,214,51,254,123,143,171,33,128,238,178,202,248,41,115,192,87,95,9,145,231,59,56,254,179,153,238,162,115,172,164,187,31,76,125,237,153,235,91,24,56,250,91,2,74,38,34,227,43,126,159,150,204,120,235,170,135,236,29,121,88,29,5,180,122,7,242,206,164,157,130,0,44,220,251,132,198,221,19,235,63,140,165,11,21,199,93,111,118,33,193,58,44,213,220,146,151,238,119,59,17,20,105,99,222,91,32,161,228,193,193,148,77,205,252,133,28,66,210,201,156,21,186,251,152,125,208,8,250,111,254,204,140,195,45,143,55,122,110,182,65,139,71,248,246,51,105,237,231,48,250,79,225,215,175,222,247,237,168,102,166,1,55,164,10,136,124,25,187,71,204,209,35,245,86,105,180,214,97,110,84,121,205,51,233,195,200,15,110,138,214,255,145,116,222,241,84,190,255,31,63,110,7,199,222,73,101,151,77,34,244,177,207,185,201,30,231,190,201,202,222,155,10,149,132,68,199,222,74,168,100,29,123,100,36,161,162,178,201,222,35,123,147,16,146,223,237,251,251,243,126,56,206,185,239,235,190,222,175,215,235,121,143,247,37,171,50,19,204,67,6,106,160,230,110,25,63,170,89,219,227,41,239,107,20,165,130,5,255,98,175,80,196,32,31,48,165,41,65,41,160,96,32,112,59,71,74,201,90,194,223,209,183,70,184,195,29,241,239,245,4,248,160,212,251,92,250,86,235,253,233,16,16,8,120,171,238,71,123,5,203,68,175,113,91,224,103,13,212,50,244,163,99,207,199,255,49,49,71,105,91,252,162,60,248,101,98,176,167,135,196,161,1,85,53,17,117,92,218,9,17,152,221,43,86,254,43,191,237,124,62,209,56,38,240,11,252,37,150,249,185,230,148,200,56,92,46,69,22,101,182,131,3,162,82,233,233,99,52,198,46,146,251,8,174,62,41,196,93,54,6,187,222,56,38,28,58,89,31,160,76,169,92,145,239,27,255,241,131,228,143,231,75,173,209,142,46,165,106,8,253,253,225,148,20,95,180,134,136,131,254,96,90,202,3,16,120,64,120,101,109,96,59,226,40,25,126,243,199,102,50,162,191,18,11,130,253,225,98,230,250,63,163,46,51,238,34,254,29,107,160,244,143,192,235,111,125,169,86,69,237,28,14,72,215,72,119,237,183,58,45,59,165,56,96,243,13,131,129,250,21,87,245,165,9,234,223,15,89,119,119,228,178,65,224,184,104,248,62,211,2,230,252,152,154,38,35,239,83,201,248,121,119,5,206,111,88,91,133,100,64,216,171,76,125,186,237,60,200,191,154,79,126,220,216,243,96,126,179,231,20,171,21,254,180,100,122,109,235,193,7,69,34,63,243,133,232,73,138,145,93,18,146,238,238,4,153,136,173,249,95,77,233,96,203,209,227,38,205,118,77,49,101,233,218,26,71,142,42,28,32,255,164,6,59,10,64,99,239,40,235,251,235,165,112,192,51,145,103,9,95,49,65,29,152,3,252,233,241,233,116,1,73,117,205,86,208,214,193,235,166,189,146,158,238,73,36,159,140,230,7,164,171,210,224,23,135,206,75,221,136,133,0,138,50,155,107,151,85,84,49,152,97,1,73,163,42,208,217,196,221,178,118,248,240,111,32,215,175,153,182,119,171,88,97,45,81,170,239,119,246,29,185,35,36,36,111,23,110,130,26,214,222,237,188,14,115,123,101,250,239,90,222,133,200,32,252,18,162,173,253,99,119,144,157,94,162,242,229,214,10,190,157,116,221,242,200,183,155,45,163,201,247,117,208,33,53,162,127,159,139,162,122,188,196,232,39,71,164,104,45,255,192,196,80,27,117,151,107,32,5,237,60,255,59,42,166,121,16,152,253,169,107,18,203,208,212,98,254,142,157,145,229,89,119,12,107,243,12,236,57,53,252,86,248,199,133,224,222,104,30,114,101,87,223,100,126,83,210,23,215,211,22,94,107,94,199,10,63,18,213,134,119,199,127,135,69,24,48,239,121,48,67,12,120,154,185,104,198,187,202,55,31,132,113,20,62,63,226,21,229,74,121,63,253,132,96,198,23,185,45,72,157,122,120,214,31,181,85,242,182,205,179,169,139,18,83,74,205,150,96,235,197,193,227,166,153,86,56,245,169,166,42,119,136,235,52,153,88,203,221,111,81,65,250,128,16,229,123,166,13,45,16,176,10,119,83,141,213,57,183,59,214,78,213,242,8,226,105,143,153,253,52,188,165,124,78,136,14,219,27,194,62,0,3,66,5,20,87,239,52,138,16,235,45,73,168,94,216,246,68,196,206,254,176,16,125,92,61,220,200,85,65,36,101,130,1,135,180,8,113,129,195,6,52,186,76,210,251,95,47,140,9,106,46,178,243,116,173,13,255,15,103,144,16,79,5,59,211,218,149,239,237,30,87,61,227,53,129,171,211,46,192,192,210,155,37,37,131,104,54,66,228,39,189,152,6,81,156,132,69,103,121,80,205,240,165,127,167,204,15,155,129,63,103,253,51,132,165,88,30,62,123,111,208,154,38,173,218,8,3,213,63,52,101,3,206,61,127,200,100,192,178,44,81,6,58,7,148,143,30,185,53,220,126,76,142,25,248,52,119,11,183,154,220,178,185,245,32,110,211,235,211,240,205,91,159,254,129,104,223,170,33,12,163,62,35,42,18,240,248,112,48,14,3,59,159,242,133,117,30,254,228,78,34,239,176,46,120,120,214,79,22,57,63,141,252,227,169,250,49,242,186,0,8,56,81,85,67,113,247,212,202,177,54,179,249,161,13,176,70,184,141,78,220,6,57,37,237,171,167,47,90,209,153,176,115,189,141,186,102,220,21,33,90,243,99,25,220,61,102,88,176,35,139,90,172,167,196,131,254,141,160,111,18,27,194,11,250,39,229,227,62,163,228,53,158,9,131,65,5,206,32,186,126,255,119,252,101,235,128,11,233,123,155,110,25,239,96,65,220,250,125,135,184,70,243,235,198,245,243,180,134,204,8,223,18,91,36,139,27,72,246,185,30,47,44,219,106,192,26,59,36,87,156,196,240,9,140,211,85,49,13,220,23,207,250,35,147,73,165,190,111,14,246,106,109,41,4,105,145,60,253,67,64,121,171,115,234,128,216,73,243,53,203,1,91,8,185,107,110,249,199,206,133,220,121,22,31,122,205,5,38,146,103,127,134,151,98,70,195,31,205,17,242,120,151,207,252,176,163,163,103,198,145,30,232,27,169,91,218,236,162,16,187,127,24,125,81,113,207,242,225,154,208,30,29,1,153,143,103,253,186,151,48,180,52,140,206,78,225,101,32,193,73,162,159,127,41,85,218,237,156,244,98,35,75,227,217,251,164,82,124,91,165,10,37,55,3,148,250,58,49,136,31,55,47,116,83,147,33,254,140,102,38,225,93,63,227,103,92,148,239,127,8,63,151,171,95,72,131,96,134,183,197,177,155,153,40,148,117,228,53,210,165,89,6,208,59,228,28,10,85,220,96,228,170,113,21,131,106,102,66,120,214,193,178,114,133,67,126,184,126,252,142,60,221,93,68,47,86,163,148,205,72,115,99,112,102,161,142,111,30,72,17,81,118,85,205,178,183,123,164,186,234,164,233,47,55,128,130,90,217,87,194,196,61,133,61,222,180,41,185,254,43,229,67,147,42,191,19,89,178,32,61,71,147,171,153,56,48,14,11,242,22,223,201,175,118,31,53,92,185,185,129,171,253,142,55,160,212,81,195,103,90,140,254,179,128,47,253,30,109,133,137,76,197,15,175,178,247,4,164,40,92,146,176,21,95,224,137,76,155,77,88,242,136,83,104,160,107,25,49,243,110,6,5,25,230,248,94,111,214,172,250,102,51,22,180,103,140,129,64,191,80,137,25,195,65,251,240,190,165,86,144,39,57,226,175,169,156,1,91,246,135,127,154,134,131,130,236,243,32,160,126,93,239,78,224,206,66,92,228,3,161,58,190,242,41,82,202,20,186,18,29,86,18,20,85,224,21,175,133,20,16,80,36,183,239,165,107,121,241,153,55,58,200,71,41,2,241,235,66,46,191,7,59,119,167,114,20,132,110,12,32,245,174,134,213,49,164,195,124,65,237,61,21,73,90,250,10,161,45,54,124,138,28,58,76,213,22,136,201,139,74,22,8,79,89,171,14,232,70,73,8,38,147,219,51,31,62,133,8,236,69,239,100,165,133,84,235,88,191,45,205,29,57,64,64,81,119,59,251,131,52,76,2,31,128,69,71,48,224,4,73,72,169,93,127,191,158,219,217,10,190,48,232,33,47,117,89,91,175,250,169,85,248,106,81,22,213,72,83,242,69,8,241,31,250,212,64,202,235,204,193,15,48,85,17,220,136,159,47,184,223,166,75,144,35,114,240,220,84,61,167,113,246,190,108,158,108,180,181,245,121,213,9,145,11,199,237,88,215,71,235,10,94,141,195,10,216,159,127,92,27,217,9,200,255,175,247,36,248,228,132,46,16,115,111,111,100,221,194,83,137,184,235,153,79,102,36,255,135,147,193,97,36,254,235,46,33,25,60,164,190,96,244,203,30,122,107,253,246,220,48,82,159,237,58,224,162,196,140,240,76,183,27,107,116,34,68,144,216,147,91,221,217,81,223,163,71,37,37,24,228,156,245,39,90,84,58,217,202,59,118,51,212,227,40,80,65,246,231,139,125,95,44,227,21,103,67,50,166,255,118,146,97,65,190,185,168,68,135,239,209,161,110,167,186,143,80,73,200,252,88,14,87,166,196,142,81,9,100,137,177,226,130,64,192,87,156,98,135,133,172,197,116,162,251,21,219,245,191,184,1,187,55,49,251,39,49,226,191,154,110,93,69,27,189,129,150,253,123,43,199,46,79,64,218,102,248,234,225,43,35,112,111,156,107,77,225,171,181,38,194,178,215,130,32,52,217,245,189,241,246,70,170,210,165,126,17,255,133,161,99,217,116,16,88,163,72,53,211,115,207,248,181,165,164,212,200,122,3,4,60,136,97,67,177,41,81,114,141,177,199,30,168,59,93,20,178,102,248,240,224,74,225,195,166,191,53,34,10,13,48,33,148,103,69,180,235,39,154,86,244,26,82,249,129,200,248,173,132,201,178,120,7,93,207,89,122,112,125,234,42,14,160,238,103,114,137,195,187,24,197,87,87,140,215,6,193,4,99,223,232,81,30,217,171,164,75,214,74,19,181,86,80,75,99,126,230,143,217,212,198,158,238,103,78,86,3,118,120,134,139,209,225,86,230,61,59,105,175,92,204,88,156,252,33,116,243,252,186,128,81,3,217,38,218,203,155,227,198,9,8,248,123,124,179,102,244,14,173,249,121,169,161,194,175,24,27,73,87,44,190,42,25,87,113,135,182,120,108,236,30,53,194,235,93,83,182,76,235,2,38,164,14,159,2,162,95,33,126,156,119,49,165,95,175,69,85,165,80,179,255,56,31,226,229,106,115,174,224,32,83,205,56,230,226,25,27,74,135,49,164,131,39,171,54,149,91,228,189,158,247,234,246,125,32,160,163,60,241,185,30,170,247,208,204,72,72,88,45,23,36,4,240,85,239,180,159,60,202,189,28,118,137,222,183,21,6,82,156,56,253,150,28,188,123,60,182,54,127,117,227,241,192,218,198,194,214,224,22,201,157,166,122,187,154,9,122,28,129,79,154,243,89,255,74,145,130,191,250,107,171,233,107,146,130,237,46,15,151,204,255,205,62,245,23,254,76,207,152,131,35,18,91,148,184,184,78,57,185,80,193,220,152,72,71,136,96,233,46,249,203,84,225,188,168,224,242,168,214,141,35,136,40,232,134,185,121,61,210,133,134,52,111,119,78,243,49,194,15,76,202,202,92,211,156,92,219,228,65,255,78,79,65,12,101,118,70,67,161,64,164,15,207,100,202,85,251,68,24,67,226,91,150,105,243,129,141,148,74,254,62,150,186,21,201,59,6,81,235,100,86,111,206,235,248,241,30,124,60,133,1,159,15,43,74,199,25,123,214,148,93,92,223,228,16,63,167,14,53,247,108,8,156,22,185,124,73,205,220,81,7,183,254,244,78,197,80,214,21,29,137,96,95,199,196,189,81,68,175,101,27,234,146,14,61,148,198,233,39,31,255,184,15,9,162,236,164,100,95,141,74,45,112,144,39,31,221,116,153,38,51,110,45,113,166,31,212,105,97,68,161,62,209,199,99,93,105,139,63,118,251,175,62,252,252,234,215,79,247,235,109,8,143,173,223,227,148,159,246,114,104,245,114,19,169,140,67,248,116,194,165,11,44,158,126,113,16,58,207,181,189,15,50,224,215,27,3,88,237,6,60,213,201,239,133,122,38,67,4,35,111,177,245,253,116,181,115,109,42,204,42,52,68,188,4,85,219,148,178,231,36,195,219,110,206,200,143,146,20,48,32,82,192,47,53,204,248,56,105,46,221,143,19,53,135,236,223,55,161,158,168,234,39,91,70,185,123,12,132,228,179,223,75,118,24,221,21,173,59,214,184,16,76,80,64,234,233,135,147,236,191,233,201,77,83,147,238,108,74,2,168,161,85,254,78,214,139,215,75,156,205,253,131,189,108,26,206,155,177,216,197,227,126,217,90,190,18,237,30,41,147,224,255,214,135,184,90,56,17,171,179,26,252,66,45,129,10,6,186,212,158,91,160,31,80,150,88,215,83,236,168,175,193,206,212,213,235,39,226,226,202,164,79,124,35,191,50,251,157,61,79,45,156,235,183,205,29,139,102,155,25,203,90,130,5,237,231,234,2,60,134,74,195,95,27,145,186,141,40,35,251,227,219,157,153,127,33,144,116,229,196,198,173,246,11,76,72,178,241,240,98,20,42,162,209,126,226,129,243,15,6,157,101,203,87,107,224,139,190,226,108,252,124,43,6,43,103,247,247,168,100,79,143,226,169,5,6,65,180,78,28,15,249,222,15,253,176,52,103,115,104,143,225,115,201,192,119,8,205,250,211,52,206,135,39,252,111,238,34,213,47,254,8,16,109,156,58,112,126,82,59,228,141,18,240,196,211,199,121,178,227,235,231,99,157,233,111,98,55,109,194,81,197,111,92,121,190,229,141,123,177,42,200,133,144,48,29,119,238,107,164,34,199,247,99,69,146,60,249,156,111,205,102,41,198,254,5,86,152,164,216,116,252,227,190,232,51,239,22,235,172,78,81,16,176,200,246,24,137,162,238,195,20,63,125,214,84,81,10,19,1,247,186,165,103,77,211,85,15,28,180,243,79,80,176,134,244,224,73,100,238,133,3,210,166,114,64,160,251,58,146,231,67,196,196,244,213,156,232,79,75,187,243,124,64,248,203,203,139,169,21,91,182,222,122,16,31,155,162,155,62,226,255,159,203,202,18,242,219,232,199,113,101,225,31,144,241,60,89,33,94,125,113,72,165,86,164,242,119,206,45,29,75,69,238,142,105,30,254,101,167,109,189,195,33,75,223,141,43,36,19,245,255,56,61,71,107,27,116,193,188,244,33,6,66,115,125,113,211,79,145,110,46,224,110,179,190,222,2,129,128,195,44,216,30,173,200,187,223,104,219,46,32,197,5,51,164,175,167,120,238,13,109,190,105,221,197,89,144,223,232,249,209,82,152,183,228,127,105,77,78,54,2,178,101,246,1,209,163,85,191,173,159,88,157,187,87,122,212,159,224,135,1,37,212,72,20,238,85,100,86,231,11,205,4,163,188,13,254,255,253,103,215,6,179,17,188,190,61,13,74,101,138,145,55,107,243,202,106,67,59,10,21,156,90,135,103,2,49,64,182,212,100,33,61,10,21,47,171,231,157,127,17,225,225,182,143,134,120,73,229,225,125,247,215,70,31,187,112,0,108,2,21,231,42,123,15,125,157,128,109,21,145,252,60,168,183,96,146,216,245,104,175,230,86,64,192,159,6,16,48,214,174,54,139,111,43,249,233,107,9,221,144,129,207,214,207,205,24,209,31,228,146,241,159,42,73,43,12,195,45,47,219,236,78,6,24,59,191,29,212,135,52,41,14,64,141,75,118,131,153,202,255,30,4,242,253,218,14,26,73,6,49,34,34,9,203,189,61,39,78,220,185,85,44,231,16,190,216,141,189,40,115,156,243,143,198,75,184,178,64,9,3,2,250,107,45,183,32,138,202,226,81,165,165,166,233,34,152,240,218,37,206,77,238,198,203,219,229,55,212,173,75,242,17,127,94,238,198,239,58,31,215,142,217,84,232,219,126,67,252,85,163,216,144,233,91,65,194,106,183,247,159,177,36,136,23,188,94,161,118,213,244,102,21,230,138,239,201,137,43,4,212,254,228,196,251,132,140,176,235,236,186,109,238,53,33,126,207,173,54,21,91,53,67,127,155,220,151,29,221,132,240,217,175,66,109,177,174,106,115,253,192,91,189,7,2,32,16,244,83,255,72,183,251,82,224,57,65,62,222,16,141,105,82,161,64,149,160,251,199,193,43,124,26,128,150,132,26,12,60,88,45,4,11,143,88,85,229,42,55,73,239,167,193,192,149,183,203,74,3,138,94,4,12,3,99,4,35,207,217,122,133,203,74,231,236,90,128,142,228,210,80,202,69,36,15,244,114,61,12,34,73,245,240,251,162,22,157,114,13,4,186,150,163,199,226,8,11,25,164,9,101,150,45,151,249,90,67,11,108,194,190,173,92,235,9,199,23,231,85,39,65,192,197,248,115,99,247,25,25,73,110,6,47,51,48,154,32,251,31,157,105,122,247,71,182,111,13,17,96,71,57,35,227,239,28,118,203,192,115,115,76,88,127,250,170,60,169,164,251,157,245,207,47,220,170,83,255,54,17,13,56,73,255,131,49,217,88,17,237,132,220,5,93,245,161,43,141,152,151,16,224,181,25,121,107,205,25,45,189,39,146,144,182,160,130,228,137,170,49,206,187,179,158,25,177,242,217,171,86,162,248,72,46,209,110,179,173,175,144,203,244,54,125,152,177,42,8,236,174,52,46,198,9,49,52,114,173,100,148,22,109,64,0,91,241,185,95,71,222,134,30,143,164,46,217,145,92,195,109,115,102,31,117,30,215,202,110,222,124,139,83,54,238,130,208,249,75,74,117,123,141,137,105,255,180,13,30,231,213,159,173,31,113,83,57,188,125,4,205,187,38,247,103,159,22,36,242,251,158,183,51,125,124,248,14,176,177,24,234,245,56,227,69,162,50,154,145,63,58,86,147,228,78,217,2,44,72,178,151,113,212,17,105,65,90,100,79,194,47,232,10,19,95,102,149,148,120,105,174,209,60,209,94,127,179,117,123,154,204,194,91,204,52,154,131,150,31,85,62,142,251,16,40,133,118,216,62,49,139,94,236,187,190,54,6,5,209,244,158,233,255,146,220,186,200,141,91,108,69,249,181,75,183,97,66,44,9,133,80,89,242,128,89,38,225,245,128,250,60,4,48,71,158,155,178,190,150,68,110,55,163,166,162,123,3,91,56,19,145,61,27,183,196,140,206,100,101,10,193,33,245,187,83,16,33,195,144,96,103,70,236,191,88,245,234,39,194,139,139,143,151,117,3,40,190,222,157,77,147,93,252,142,240,98,116,234,127,59,219,22,116,86,28,237,213,84,111,97,141,151,88,122,198,178,212,68,131,8,252,98,236,199,84,16,56,81,115,28,137,237,108,85,200,163,203,171,87,111,199,1,207,43,250,199,244,111,91,5,7,209,157,54,157,158,226,117,244,215,219,187,149,218,109,201,239,229,153,231,238,82,129,192,86,123,201,80,156,241,243,218,135,91,164,57,120,13,220,114,130,141,248,174,160,126,105,121,162,122,226,169,19,17,153,95,63,200,101,121,242,24,236,118,42,223,83,174,223,71,244,149,132,76,160,167,171,135,117,158,238,13,202,39,17,4,42,20,235,155,76,3,38,99,2,63,46,92,32,216,128,104,163,228,115,105,221,10,20,193,50,40,212,31,20,10,2,132,72,20,254,146,253,32,127,123,65,189,64,92,55,23,38,134,244,77,189,250,167,204,201,117,218,248,216,109,108,22,2,158,197,50,154,121,23,136,204,68,168,184,164,170,134,65,241,117,171,173,67,105,223,255,94,18,193,77,173,88,219,131,219,201,63,95,120,133,8,221,142,1,174,201,139,93,156,2,151,185,202,203,243,54,164,174,22,158,107,69,93,157,122,201,91,76,49,120,56,173,41,18,196,119,92,210,30,204,189,13,161,101,125,229,59,24,121,89,159,62,45,183,187,106,149,10,9,242,237,157,6,53,116,25,109,209,199,83,219,119,20,131,206,242,219,189,251,155,23,239,185,196,18,47,122,218,111,159,173,15,43,244,186,130,60,5,184,83,187,169,31,170,5,161,149,11,146,94,249,92,161,20,192,150,250,186,103,9,227,24,80,109,77,39,117,129,237,150,25,194,29,120,74,82,8,13,7,73,29,206,94,39,109,124,121,101,231,71,25,26,175,197,234,126,139,218,37,51,117,158,229,73,240,195,15,150,147,81,11,54,51,21,119,143,42,247,184,85,31,149,108,49,224,220,99,238,216,210,57,145,7,83,141,88,29,7,162,82,176,90,152,234,250,56,135,21,26,13,94,162,253,127,46,38,88,45,167,245,83,191,197,191,143,213,168,40,170,202,214,175,131,203,215,7,253,242,133,247,183,79,0,214,177,82,22,52,44,88,203,243,149,124,35,184,136,89,115,66,137,62,99,6,212,112,217,102,152,91,138,84,42,33,47,169,167,219,161,70,248,172,157,74,54,247,174,113,25,250,228,161,15,95,54,4,88,197,191,56,119,106,112,107,253,168,33,47,244,222,115,16,152,254,154,50,160,205,177,175,51,104,82,201,173,132,232,251,48,95,216,24,141,119,100,225,253,228,65,43,190,111,103,121,120,94,198,82,211,235,197,138,71,227,179,177,173,51,63,61,88,41,122,205,73,193,102,19,17,247,155,158,249,125,110,233,111,170,205,211,61,215,83,97,97,47,194,54,220,250,37,228,138,144,174,155,7,35,254,95,219,53,105,21,16,205,30,63,32,120,131,77,189,119,211,188,70,127,37,81,170,53,157,231,229,48,183,118,51,199,247,79,109,173,130,161,48,17,53,247,233,138,155,86,87,40,80,252,231,3,191,55,254,60,166,243,40,168,206,183,201,179,196,29,100,199,140,192,26,97,179,188,106,186,54,234,212,199,239,217,95,182,69,130,192,15,172,174,153,14,49,218,54,190,64,63,178,118,239,172,31,234,75,25,223,209,208,97,220,132,118,210,77,250,179,247,167,38,131,116,229,140,41,248,109,31,44,251,30,77,147,117,124,246,253,18,201,101,39,36,65,217,143,166,101,130,5,35,176,218,250,27,128,0,237,191,53,177,56,22,12,232,236,183,247,40,63,167,245,214,112,136,160,238,247,129,215,96,203,151,221,75,66,172,189,169,125,31,169,30,81,254,109,130,136,132,207,88,99,253,38,63,139,115,14,181,95,247,55,144,252,50,7,89,30,231,41,149,240,252,51,29,222,97,227,113,141,201,186,38,176,245,222,204,151,101,224,13,245,167,2,68,47,234,242,37,113,123,182,201,53,1,66,219,195,194,144,51,77,124,225,202,188,107,75,86,126,171,109,154,154,13,132,54,250,50,170,43,237,176,170,159,82,52,151,193,163,14,150,159,56,246,173,174,230,52,169,81,121,167,192,115,47,145,250,184,51,208,187,72,14,73,186,153,235,122,174,52,156,189,207,123,34,43,208,125,108,63,107,25,250,122,103,2,66,123,41,172,141,134,81,106,158,36,213,153,207,80,197,131,192,30,194,3,58,85,164,213,50,211,105,236,127,187,113,215,133,103,44,246,253,94,29,17,182,189,80,132,155,244,16,144,148,252,237,215,227,92,222,123,20,127,89,236,36,131,96,160,132,248,77,28,245,143,126,99,122,245,149,140,191,27,162,103,162,117,162,207,29,52,51,120,76,153,184,213,106,38,163,72,231,168,204,221,73,81,40,85,111,170,239,82,29,221,140,86,148,184,17,18,212,204,171,162,123,23,47,129,42,86,212,128,29,207,243,76,5,132,167,111,107,12,125,162,197,105,132,252,16,160,67,101,165,152,171,24,203,72,72,159,3,1,77,98,242,45,134,106,108,250,211,135,215,112,175,24,32,96,171,50,234,86,224,103,247,96,13,83,30,222,33,67,16,192,47,62,26,138,219,136,221,151,185,253,193,103,123,0,4,218,158,62,186,21,39,61,65,77,228,212,14,16,232,1,1,44,159,61,68,55,52,33,89,131,117,225,203,78,70,252,243,119,151,140,255,21,151,169,10,46,193,143,207,13,176,194,116,197,30,7,95,71,174,190,152,42,251,124,91,166,4,2,14,54,39,174,61,240,249,74,175,32,69,46,37,247,8,249,125,231,104,136,62,218,49,239,253,31,7,10,55,159,105,50,172,80,177,97,226,49,157,127,128,192,201,197,114,15,8,29,180,177,178,22,182,115,120,84,163,40,68,3,116,193,128,87,249,188,140,202,48,191,246,197,186,189,190,177,29,120,249,67,200,39,85,15,151,24,230,173,163,215,204,14,73,32,112,81,90,171,150,53,180,31,216,136,245,172,183,143,3,157,105,125,185,30,200,191,135,250,193,229,136,174,103,84,224,151,154,250,182,4,44,186,242,26,181,166,214,86,224,30,226,39,227,113,250,145,239,253,143,148,108,198,60,88,126,67,64,255,235,93,43,71,159,101,98,208,3,105,175,137,28,16,112,235,37,223,129,181,27,254,59,248,152,249,128,248,21,225,185,237,127,222,73,86,114,67,247,163,156,62,109,241,35,227,179,49,127,43,209,255,229,70,154,226,55,213,81,107,196,95,127,221,74,252,19,31,193,205,200,249,241,167,105,39,8,212,133,154,235,208,82,144,103,192,224,100,1,207,60,14,152,171,88,154,114,187,212,80,223,36,207,54,200,27,12,2,70,194,213,183,12,138,254,17,183,6,55,156,242,201,144,122,89,142,30,210,239,84,140,239,246,168,249,18,197,128,248,177,214,215,145,184,71,131,183,156,99,75,251,239,85,65,192,210,31,83,230,160,209,201,247,110,242,87,67,39,77,112,128,254,64,95,229,130,197,65,201,129,181,191,127,160,63,50,62,117,75,50,246,25,27,54,37,233,76,239,216,102,65,13,253,189,27,129,9,70,107,191,25,104,35,197,43,90,64,192,110,165,228,54,189,215,100,222,53,75,167,23,223,16,255,207,30,75,227,242,119,254,118,104,154,191,16,226,57,35,133,54,210,153,52,75,244,168,247,85,113,251,30,185,235,5,2,78,110,223,236,227,131,78,11,3,244,231,48,27,18,60,223,10,7,220,50,199,121,146,237,215,2,187,38,121,139,32,96,237,67,186,241,158,253,84,90,134,201,138,237,104,21,188,236,239,91,146,217,241,161,150,130,92,98,173,187,95,17,4,150,158,101,78,196,228,247,241,58,63,53,162,9,115,147,66,255,152,207,233,139,109,57,14,156,158,62,49,167,66,244,139,157,89,82,154,53,75,213,86,243,109,242,190,70,40,142,248,108,246,193,214,230,169,247,247,61,58,223,133,16,82,28,80,59,217,36,145,101,33,117,161,140,129,145,51,149,17,6,178,131,195,228,178,110,26,80,171,102,26,244,90,14,224,105,248,72,233,175,150,140,115,69,142,188,219,18,19,232,194,186,146,137,234,67,115,77,123,33,56,18,142,235,99,47,96,103,254,230,142,165,155,1,181,225,36,91,106,252,143,174,129,4,230,57,217,141,146,161,114,63,158,120,0,69,4,64,160,163,217,190,145,58,242,211,164,218,154,54,206,111,11,114,38,235,109,188,32,210,65,145,191,50,239,248,253,175,2,188,156,22,98,39,176,133,94,161,217,190,154,91,182,173,15,45,203,111,87,174,17,67,5,242,190,109,31,44,68,254,197,69,199,246,53,188,176,187,178,149,247,176,151,223,101,200,236,172,159,135,144,135,235,188,195,240,19,213,142,246,231,114,144,160,26,95,247,230,135,151,14,30,20,194,23,12,154,254,235,162,72,55,25,162,155,36,155,145,247,19,147,25,172,220,0,129,141,210,133,1,124,120,45,198,64,235,148,131,119,29,6,234,234,139,149,220,166,250,253,211,27,75,115,130,117,96,12,155,232,107,135,225,217,247,22,111,52,195,157,62,46,225,128,80,237,119,190,185,23,167,118,25,230,150,167,190,77,129,128,116,192,221,207,172,193,101,167,69,205,27,26,121,167,96,203,242,173,134,207,174,228,196,241,140,189,141,223,21,145,32,209,209,251,233,6,220,191,39,255,140,90,188,156,46,15,38,122,216,21,36,45,249,13,134,245,54,63,97,206,90,130,36,186,219,119,38,119,224,87,1,210,121,54,217,122,106,32,1,211,187,58,188,73,225,91,122,142,131,98,81,210,14,18,37,249,116,84,198,208,96,188,160,87,75,171,128,65,99,87,105,221,53,251,19,19,221,69,40,193,33,211,119,49,200,124,250,154,114,91,231,55,79,29,41,113,137,46,218,5,66,91,172,185,89,24,9,198,8,135,94,74,152,42,186,15,161,25,53,216,95,227,179,208,223,18,242,55,231,149,191,195,192,90,57,133,172,206,215,173,160,148,143,255,72,131,253,32,180,24,225,199,237,20,142,18,93,187,127,116,126,34,140,16,144,11,92,156,28,189,76,125,217,137,171,211,243,95,40,8,20,124,210,254,16,53,49,122,24,57,251,92,37,221,85,82,130,186,45,80,100,120,159,93,114,56,31,88,175,226,128,5,113,131,163,69,160,156,49,169,205,159,11,87,73,55,166,201,172,190,6,106,69,201,110,119,249,138,138,250,56,143,33,245,73,230,49,161,167,80,183,161,250,222,238,203,40,15,86,24,152,115,211,245,122,206,60,214,0,191,164,122,239,129,165,34,1,249,212,202,210,153,191,216,106,188,105,228,230,192,11,227,162,161,116,223,111,201,198,66,223,23,104,9,66,72,94,26,211,84,30,188,112,222,232,252,88,141,221,207,18,152,176,144,53,191,170,3,170,211,163,30,113,110,253,149,133,129,255,222,231,72,6,72,91,24,219,15,124,67,185,60,2,5,25,203,223,189,221,80,124,232,203,82,236,201,86,247,3,68,223,189,55,162,177,38,226,158,30,15,185,232,114,79,128,130,64,121,226,238,130,130,66,230,115,130,120,66,184,25,178,221,27,10,235,209,251,137,221,42,194,210,245,199,128,68,38,239,4,254,141,75,150,133,108,95,216,170,179,196,17,253,107,203,78,99,4,24,48,106,40,161,87,148,93,16,241,92,60,109,196,216,19,220,203,246,22,109,211,2,86,28,177,163,0,28,183,124,18,114,171,134,165,147,159,78,3,66,179,255,228,211,103,69,245,126,139,34,157,215,127,241,28,169,23,34,249,85,52,240,226,134,61,159,32,252,209,10,11,152,190,241,235,171,108,71,205,248,170,46,144,229,162,96,2,105,244,65,64,173,111,91,238,174,42,121,248,6,226,223,168,117,191,188,19,69,83,119,63,235,229,252,215,65,184,245,215,79,199,254,91,201,123,32,116,106,138,143,8,35,32,250,4,232,154,208,60,201,113,214,101,163,102,149,202,1,9,146,131,167,37,61,85,215,78,84,95,202,52,107,62,69,120,109,70,199,128,70,60,139,130,36,118,247,220,175,124,16,24,253,105,120,75,123,160,246,171,56,245,143,125,230,109,136,40,225,205,91,231,216,17,219,62,138,162,152,208,105,132,53,248,179,203,23,61,130,6,159,49,100,36,31,69,217,75,161,7,9,25,6,49,12,151,241,58,53,36,39,83,215,177,125,4,71,255,141,228,193,154,79,238,123,110,49,46,72,62,49,245,238,51,120,72,174,82,233,96,188,178,104,61,5,45,163,183,121,11,47,103,83,242,175,216,255,11,231,24,3,53,46,108,107,61,223,122,47,167,168,87,113,221,250,11,22,66,203,55,216,141,147,254,217,253,39,229,234,176,46,243,4,110,157,11,209,191,86,228,165,207,168,211,223,119,122,18,113,214,239,115,5,39,106,238,85,181,27,124,104,109,241,8,110,101,88,247,30,42,249,213,232,209,87,56,192,41,161,142,3,250,47,13,189,180,51,49,128,239,224,21,141,140,7,65,131,189,98,60,70,224,99,202,45,98,25,17,107,191,51,237,18,150,245,137,57,37,96,158,189,61,158,99,53,235,53,172,49,67,194,39,16,21,230,68,95,97,13,23,82,60,236,222,97,224,64,5,55,247,108,208,191,206,64,159,167,146,176,138,34,205,174,189,240,191,254,158,140,171,125,139,92,221,62,36,172,40,212,207,200,104,173,165,203,207,106,10,159,33,252,236,54,168,29,202,129,66,25,136,24,124,122,130,212,67,64,49,157,82,128,205,223,191,101,33,7,233,249,167,8,223,181,230,140,197,23,56,165,94,62,236,142,27,255,3,1,13,191,122,252,246,122,147,210,111,114,206,58,26,85,131,128,58,33,99,136,193,182,38,91,121,104,129,192,193,14,2,159,29,16,255,182,60,62,162,214,84,118,220,93,64,120,177,188,199,210,119,182,203,4,78,210,186,122,111,22,4,180,155,237,77,98,135,56,235,122,230,110,146,238,27,159,173,23,178,140,163,239,53,192,69,155,134,157,135,246,97,224,112,196,81,89,247,147,3,74,140,65,132,130,184,7,2,223,237,239,25,210,155,100,4,46,118,70,220,45,108,135,129,107,173,170,178,7,15,126,139,220,140,129,154,179,58,144,252,217,166,165,254,110,144,213,194,130,211,47,112,151,4,209,255,130,210,205,248,160,173,146,66,138,56,83,143,104,8,120,254,106,47,125,42,120,95,83,233,237,30,227,248,99,8,112,219,167,60,246,52,21,237,43,45,254,23,176,24,11,2,46,49,139,238,137,31,234,54,35,47,214,228,80,94,68,242,173,246,87,228,120,193,239,132,70,82,201,1,91,36,31,143,62,147,101,34,126,76,210,88,58,215,191,106,14,127,225,229,189,144,139,138,12,246,153,234,141,229,237,115,199,19,4,251,106,131,255,30,198,93,200,226,201,204,145,238,128,0,255,47,22,70,119,37,158,89,149,167,253,45,157,74,158,190,146,100,18,146,157,238,53,126,125,139,43,98,242,24,217,63,144,199,208,128,118,37,102,102,62,218,96,100,36,28,68,195,149,3,26,171,228,206,84,42,108,73,165,173,141,56,231,88,77,45,185,197,52,179,123,14,248,215,135,15,201,192,101,142,234,66,49,153,86,167,33,149,55,143,154,249,248,17,255,181,26,222,201,149,230,13,55,147,51,98,79,178,0,151,209,197,102,153,47,43,76,74,50,179,0,70,65,18,28,208,60,121,83,114,193,50,30,86,123,215,55,57,54,9,127,233,238,215,102,15,30,24,250,126,222,109,227,238,105,16,226,231,209,154,50,167,193,239,95,152,27,111,136,119,37,227,128,201,8,151,1,255,75,4,116,240,122,11,36,186,7,98,40,189,143,125,198,21,111,4,210,209,148,167,135,162,144,223,107,131,139,87,44,133,48,178,239,252,143,235,131,112,44,204,159,2,242,20,82,194,227,167,123,127,89,64,47,177,174,119,214,197,23,183,154,174,48,74,120,43,123,97,173,187,61,200,138,150,19,138,204,106,243,30,217,113,122,137,35,254,161,222,171,191,185,96,225,184,107,20,99,68,58,58,137,212,107,246,189,1,189,181,180,103,53,247,46,249,124,124,202,211,151,83,60,45,148,81,91,152,155,229,44,210,232,54,51,77,166,139,53,212,139,122,181,136,47,164,55,248,143,178,10,241,183,148,252,178,138,159,67,93,96,194,251,184,174,124,24,176,112,14,19,79,190,243,239,252,211,57,244,250,247,65,228,248,183,7,228,183,216,229,238,144,75,215,108,115,187,129,192,93,62,171,125,26,20,55,70,197,68,202,246,39,51,4,232,143,145,154,187,27,24,166,138,27,59,156,83,165,128,1,217,249,94,249,192,204,241,238,180,235,175,104,19,148,65,224,235,83,195,9,221,32,182,84,171,99,175,104,225,103,176,160,182,221,182,195,206,191,204,176,168,44,110,91,237,191,93,20,92,74,135,201,110,175,34,245,35,226,197,196,24,251,32,160,158,216,221,101,138,50,255,147,87,220,92,183,212,61,73,209,93,67,2,190,52,100,93,232,163,254,140,225,198,77,147,41,131,247,20,162,84,158,71,5,107,163,138,196,186,64,65,173,230,164,215,149,121,91,190,118,38,122,228,195,79,64,96,118,206,87,47,70,39,176,71,42,108,167,98,112,22,38,112,85,31,108,138,115,62,32,191,226,44,179,170,240,5,66,95,61,85,136,185,123,5,245,151,12,125,32,174,115,191,203,141,44,219,238,67,109,38,159,67,68,198,151,121,148,3,194,159,217,85,195,202,65,110,190,89,154,178,153,106,73,144,198,173,222,198,163,229,100,82,206,17,130,221,106,251,67,152,176,196,115,101,169,88,91,132,126,158,106,227,248,113,61,236,44,181,126,124,240,213,161,203,193,250,253,61,141,167,255,193,26,193,33,30,30,21,218,154,244,156,57,12,161,122,185,72,222,47,92,151,171,151,46,207,188,85,102,217,176,110,15,17,73,165,187,224,141,249,225,82,186,79,101,231,141,132,64,2,119,181,139,131,149,251,239,19,213,146,127,227,57,151,192,101,251,242,254,253,3,192,137,51,245,188,231,174,173,47,226,167,38,9,150,172,47,246,129,55,14,101,123,114,46,200,252,42,164,100,179,203,34,252,224,83,105,168,87,75,1,129,57,242,212,197,104,147,54,48,122,147,19,39,142,66,142,95,160,102,57,234,23,167,253,93,254,171,62,134,95,207,238,143,10,73,41,181,159,59,197,196,50,82,72,180,240,74,56,57,84,152,56,68,174,87,252,183,22,163,94,197,129,240,250,118,196,146,231,199,71,143,195,201,196,95,136,99,96,65,70,80,126,103,157,56,25,214,196,2,177,190,158,239,162,136,241,126,16,94,188,234,180,11,243,223,253,149,148,136,19,221,252,245,185,224,10,255,233,52,97,143,254,141,33,37,50,127,230,134,111,42,76,253,242,226,150,222,215,117,64,193,173,140,190,169,171,17,145,183,40,182,11,41,82,253,255,194,128,111,235,188,140,230,161,74,150,6,67,123,236,159,14,120,185,142,132,66,59,14,221,70,19,26,250,84,135,149,177,187,235,60,205,28,110,95,97,56,109,255,201,105,25,247,216,89,63,194,60,73,186,129,26,209,27,148,35,216,52,63,8,24,39,164,164,153,57,232,54,70,212,229,177,9,222,68,120,89,197,162,155,58,132,81,8,117,248,42,50,79,65,10,253,224,55,135,49,147,117,253,183,241,97,42,55,144,1,209,147,15,157,74,189,166,107,49,123,58,117,154,106,13,83,66,79,72,146,154,186,6,111,86,151,222,101,152,164,154,68,252,57,158,119,88,247,191,128,160,112,39,217,185,39,26,32,134,109,123,91,70,159,158,163,136,78,216,224,129,228,91,24,240,159,109,187,26,88,86,108,230,175,43,197,66,75,14,197,115,235,120,61,206,202,56,252,41,255,57,102,79,247,8,6,142,87,92,175,118,163,103,69,197,21,115,169,195,144,122,115,112,122,181,78,35,56,175,83,168,89,176,235,217,1,58,71,21,0,143,254,181,185,245,4,19,179,15,151,249,64,65,242,234,117,143,178,143,123,95,73,252,31,217,62,68,131,192,214,211,112,91,253,172,121,186,75,165,212,167,209,200,249,149,117,10,234,144,206,168,79,24,254,26,244,37,19,141,156,223,156,231,63,108,125,220,127,4,242,127,25,32,93,1,151,217,125,95,101,127,172,180,95,0,215,128,186,217,115,221,163,53,31,214,75,234,61,75,138,74,206,189,85,77,182,193,25,152,117,126,244,149,174,173,43,243,164,181,163,151,30,130,58,35,114,154,188,240,24,107,129,144,145,215,76,129,155,112,43,73,117,241,94,200,179,115,20,122,191,173,136,52,33,136,222,171,218,119,211,112,180,154,192,181,109,186,175,207,67,104,125,121,187,182,107,36,168,252,196,105,87,173,75,136,223,131,207,146,77,226,54,157,54,247,82,159,151,118,144,194,128,226,156,40,40,109,82,170,96,157,164,29,47,202,143,248,113,117,81,245,249,160,211,93,20,177,245,205,228,7,216,57,44,43,206,167,223,75,159,246,245,193,104,52,9,0,18,216,247,130,26,44,62,86,246,168,44,254,123,16,252,24,4,198,67,116,167,162,189,63,58,184,42,154,85,159,148,128,241,255,69,31,187,173,235,86,189,82,191,127,238,188,118,2,54,18,131,228,149,225,241,189,39,35,231,63,90,220,107,67,244,35,43,92,146,86,229,136,255,139,191,223,47,17,62,24,147,205,163,238,226,69,231,65,175,254,251,170,22,230,34,62,158,59,183,202,85,207,99,186,160,154,235,237,68,134,4,36,168,213,59,46,178,150,227,44,252,253,60,117,210,245,154,158,179,235,217,193,167,123,47,92,6,120,158,148,11,107,118,95,179,32,125,85,203,141,240,180,192,90,18,170,245,71,247,142,253,59,103,143,191,33,222,174,40,148,117,255,233,89,127,214,185,225,112,101,46,196,159,5,100,52,80,108,16,112,186,206,33,19,192,248,251,183,91,200,65,220,193,63,16,80,36,115,55,140,179,170,31,177,176,96,59,199,173,6,2,106,109,209,38,241,108,19,221,251,150,135,110,178,8,223,125,118,201,185,197,88,190,120,26,4,143,134,45,197,97,169,248,248,248,28,74,140,216,120,113,94,49,57,212,229,48,96,67,200,145,137,175,10,215,149,15,236,169,53,230,130,129,187,189,246,242,67,138,23,141,191,217,73,220,99,233,197,71,38,205,51,109,21,93,206,78,157,115,115,22,249,14,34,250,234,246,253,55,147,100,84,78,103,83,210,140,38,0,1,118,67,198,195,235,151,139,12,44,105,216,80,39,114,32,48,185,205,225,100,20,65,241,116,185,102,101,79,184,6,4,172,174,146,175,176,252,189,53,148,87,71,103,216,37,137,228,179,130,106,107,250,247,239,159,237,60,106,170,94,69,252,121,110,234,160,222,146,228,61,86,121,253,198,247,238,0,196,191,182,229,111,164,115,114,146,207,114,230,49,210,200,34,60,26,217,112,219,0,253,176,225,200,74,127,169,204,3,4,76,123,89,167,147,222,189,238,254,35,233,147,19,115,3,4,244,69,7,135,24,167,252,94,182,15,223,124,169,250,19,4,116,201,60,76,232,13,34,50,222,13,4,85,127,88,130,128,178,78,115,165,187,46,199,55,12,254,8,172,153,133,65,192,187,214,75,150,115,35,58,77,231,47,174,236,43,156,135,129,215,193,142,226,119,229,109,139,217,245,122,159,150,62,150,194,52,186,76,64,244,41,14,133,237,111,70,170,95,80,33,223,55,123,219,48,22,53,4,252,142,142,57,158,75,133,137,137,46,157,157,5,69,93,140,20,124,149,90,55,27,176,84,148,41,171,50,87,52,233,25,210,87,42,236,205,34,32,65,60,67,118,70,85,0,55,83,237,253,26,62,235,82,36,207,47,103,75,149,188,90,114,255,48,52,70,188,23,140,45,100,42,22,116,124,55,190,4,140,26,202,24,26,214,227,93,195,126,153,37,127,119,84,127,100,174,246,136,246,41,26,7,128,9,61,169,46,230,240,104,159,116,235,46,102,30,175,21,114,103,186,42,194,73,77,50,225,225,74,247,231,143,83,140,193,145,174,195,76,83,57,183,244,179,151,111,234,35,121,178,232,205,188,36,138,151,154,187,229,21,206,176,73,5,4,74,126,106,105,196,56,80,103,216,77,62,172,23,247,45,165,88,154,213,109,143,212,10,110,138,166,81,101,187,25,125,182,254,113,139,20,200,237,93,11,46,77,84,217,70,242,18,166,72,124,117,156,68,58,194,159,14,49,68,9,159,61,15,40,221,53,188,97,113,90,65,187,29,42,199,224,4,1,253,67,204,1,238,219,22,194,223,241,157,235,193,21,16,134,180,186,48,106,45,240,64,254,226,123,119,165,228,48,152,224,32,250,188,52,194,193,77,64,81,69,161,198,19,150,210,184,192,202,210,117,168,211,3,211,254,216,56,109,162,133,5,83,177,106,154,180,100,95,105,208,99,91,221,77,229,16,193,201,119,18,138,211,251,189,204,188,48,115,51,3,132,129,171,21,223,36,179,107,31,26,45,223,151,166,48,176,68,230,195,188,38,135,13,106,153,10,21,137,9,46,66,33,252,70,204,149,220,156,72,31,83,172,125,70,125,60,9,3,110,111,90,196,111,112,144,36,108,158,231,97,196,60,61,59,127,217,146,82,214,6,1,51,98,135,219,13,7,103,247,19,157,149,109,166,132,60,100,113,112,107,55,194,183,181,35,79,165,72,72,182,47,144,58,208,151,126,249,15,6,222,245,233,104,159,183,121,74,41,122,62,44,14,175,15,173,203,7,159,248,239,104,253,193,239,175,125,49,175,58,66,120,131,207,87,70,187,60,13,179,44,35,253,151,154,97,154,172,186,135,26,31,51,248,145,176,11,92,160,14,190,8,182,86,23,24,252,9,255,46,114,59,100,102,88,135,46,71,10,93,125,37,67,38,234,86,58,131,124,168,201,241,75,71,8,200,175,105,123,109,99,122,49,88,6,229,51,248,95,11,9,21,169,196,150,163,228,208,182,70,119,99,199,95,54,0,186,188,209,121,249,33,227,147,7,42,73,159,115,168,164,140,160,98,212,27,241,26,41,134,70,30,148,151,63,20,69,193,187,250,112,175,170,161,153,130,150,148,37,13,163,148,182,112,214,175,231,28,101,242,56,220,190,183,119,229,160,170,6,116,14,104,238,127,181,179,255,176,150,135,226,158,174,207,8,78,226,63,205,250,154,244,251,118,223,226,68,150,120,16,222,3,44,120,29,93,169,117,34,54,29,209,42,44,193,236,136,191,182,58,72,157,71,17,110,224,30,211,63,236,41,5,53,50,102,191,28,238,180,61,163,54,208,121,239,140,140,31,81,162,249,231,45,207,33,247,208,16,245,151,17,21,26,255,123,31,65,246,133,22,133,162,128,3,159,55,141,40,132,230,250,197,23,23,145,201,186,154,183,156,162,26,18,141,232,235,96,101,208,244,193,194,146,42,15,163,95,176,53,178,127,149,191,63,189,170,122,228,175,114,152,224,17,217,7,45,251,111,11,183,206,79,16,249,169,19,188,198,120,16,191,37,173,174,186,240,223,183,50,82,147,143,166,82,120,36,143,117,16,154,235,156,201,178,165,73,191,209,25,126,72,66,252,220,183,228,68,252,227,35,210,198,168,115,190,169,73,16,218,170,194,60,134,249,188,249,183,154,247,121,79,71,205,97,34,197,220,167,33,183,135,195,225,34,247,25,67,104,254,33,126,61,30,171,174,178,225,178,91,176,185,241,199,19,57,223,119,219,52,100,55,172,34,109,73,56,87,37,175,20,194,128,244,15,39,41,52,10,109,193,162,146,25,246,205,2,6,28,94,228,74,126,222,143,168,56,122,10,211,241,12,129,130,106,205,125,207,223,45,6,248,95,214,43,173,39,85,130,8,100,125,18,181,229,81,75,156,183,85,232,106,240,205,48,134,84,20,111,213,115,213,226,81,125,93,196,85,12,19,140,161,92,191,183,120,184,97,41,26,212,26,163,226,77,5,1,124,53,181,233,230,220,18,194,27,206,241,242,124,119,186,40,158,105,249,37,107,187,4,24,182,198,172,204,238,0,56,247,46,72,207,108,246,202,81,28,42,37,60,209,42,81,10,173,217,254,123,32,242,180,38,23,123,249,115,151,222,143,179,245,98,233,30,204,84,182,75,82,147,228,173,232,184,130,203,250,157,148,37,99,181,150,165,231,141,244,84,228,49,144,32,192,240,50,205,186,126,163,81,100,231,201,111,70,36,207,173,243,232,222,221,0,212,169,121,19,210,131,6,145,250,52,55,218,61,181,85,249,94,126,161,156,87,199,32,25,169,255,114,114,217,187,206,12,61,104,127,173,68,82,7,236,157,132,86,139,40,129,106,102,92,185,117,16,65,192,165,139,66,126,107,58,25,163,241,70,69,21,188,242,205,170,11,187,74,199,103,247,125,85,130,85,110,64,149,211,105,226,42,158,33,53,33,252,123,237,138,31,127,130,36,3,107,97,34,136,214,143,239,195,60,141,187,143,22,246,56,127,135,55,1,94,38,95,191,151,204,158,25,68,174,61,192,31,65,114,112,118,255,123,69,188,167,168,0,44,163,249,195,39,201,127,118,125,107,166,231,106,89,193,6,207,85,195,50,210,15,72,254,105,255,58,18,75,136,123,41,163,196,29,31,103,140,45,68,21,175,29,120,119,187,185,157,163,14,42,248,164,120,182,62,136,151,23,243,2,134,54,166,68,57,152,16,9,17,133,163,52,92,34,135,20,114,41,93,101,96,212,13,228,252,125,94,146,252,118,227,123,88,93,103,38,186,229,23,4,248,216,235,249,218,169,80,71,167,191,61,233,154,71,129,45,55,97,223,130,205,14,178,173,113,212,126,170,203,71,24,240,168,227,151,165,237,147,200,103,222,210,159,222,170,135,208,176,92,250,115,181,198,7,42,25,150,248,136,92,115,16,112,18,25,250,169,35,136,90,118,143,200,246,249,111,18,34,24,149,179,250,103,68,9,10,83,81,10,14,111,220,2,157,133,247,74,22,174,20,153,187,161,236,43,118,203,105,167,119,152,88,81,159,154,191,187,29,179,18,152,25,13,131,207,174,119,71,154,223,1,80,40,150,133,120,50,58,13,30,42,160,89,74,169,210,2,225,105,197,153,7,170,244,101,120,82,70,20,106,226,195,194,71,47,237,44,198,164,255,32,141,107,146,21,249,79,26,221,5,154,67,172,186,55,74,17,62,94,249,104,201,196,32,240,180,173,98,158,156,163,25,2,120,120,254,43,142,209,96,194,223,213,33,176,191,48,3,129,227,183,198,127,116,85,163,31,230,105,255,153,147,188,128,108,119,44,221,55,108,75,179,221,224,248,65,191,113,129,135,252,193,91,119,202,246,131,127,188,92,93,45,155,58,136,30,54,253,138,129,25,184,209,60,151,203,119,111,159,154,32,122,85,56,105,203,162,205,10,206,242,241,200,25,156,173,87,19,57,253,155,37,88,241,203,212,140,60,202,149,9,4,14,162,166,253,146,239,209,51,40,89,155,112,87,23,35,249,112,183,28,174,106,164,189,175,192,45,92,198,202,10,3,13,171,165,240,41,3,195,53,84,191,129,108,89,45,142,106,99,62,238,84,46,228,48,32,104,248,180,150,12,225,237,195,159,209,234,108,152,0,116,182,165,107,97,226,115,228,251,16,255,143,127,25,93,90,182,75,235,248,220,22,217,223,74,217,7,134,193,217,124,186,252,198,172,143,50,192,86,101,106,215,183,205,185,165,11,220,210,98,28,21,9,32,241,150,104,253,228,195,215,63,132,47,238,87,191,232,253,131,240,223,218,188,161,129,142,183,129,240,167,213,71,250,63,16,127,157,127,100,72,127,63,90,224,206,188,160,20,127,52,76,72,211,44,237,22,17,210,102,12,166,24,210,88,70,252,28,198,25,221,162,227,30,123,91,173,244,136,93,36,22,36,148,99,227,241,254,30,158,125,12,73,99,217,90,33,56,96,39,230,94,175,24,91,67,146,226,179,187,232,50,132,47,240,2,49,214,12,137,151,115,146,216,21,28,219,125,144,109,172,226,124,212,223,211,173,191,242,3,64,35,0,3,7,235,8,148,173,103,119,187,156,124,172,27,190,1,107,160,248,250,247,60,160,197,80,114,21,134,74,162,3,146,15,237,238,31,123,53,108,4,217,69,38,233,223,99,238,114,83,156,147,230,154,123,113,148,26,59,200,156,227,254,29,116,166,45,214,170,94,108,179,189,154,234,97,188,208,116,167,135,50,219,134,92,77,88,111,255,215,117,242,111,147,147,227,200,249,184,28,8,233,40,240,143,25,65,100,206,119,162,113,196,228,8,205,203,14,248,130,202,203,198,171,203,218,48,222,53,188,37,233,231,5,113,238,12,221,238,184,119,215,118,166,93,200,125,28,20,125,123,15,26,104,95,36,39,173,183,225,12,193,79,1,101,255,98,78,79,83,126,13,221,113,230,66,244,240,199,184,37,115,242,49,206,240,28,79,213,217,243,238,43,182,122,222,58,84,168,92,180,201,136,38,111,213,89,222,21,23,56,249,211,151,250,52,37,30,197,164,2,3,245,35,57,82,24,148,53,15,170,199,110,38,38,15,6,228,87,114,229,227,53,55,89,237,100,225,35,0,6,129,93,208,235,72,187,51,32,168,146,188,134,153,4,25,127,31,141,184,123,12,62,212,5,222,156,84,199,149,247,16,125,78,100,228,186,223,86,156,212,49,191,57,196,240,10,22,164,110,142,154,243,52,75,121,150,231,245,68,118,148,1,201,255,191,35,149,119,71,6,42,210,29,54,108,39,82,240,171,7,246,210,83,181,31,249,114,52,19,237,176,111,104,65,65,46,95,81,15,235,76,143,223,76,23,34,69,125,16,63,217,169,91,145,203,62,224,212,242,58,95,195,217,151,13,3,101,229,95,37,31,148,145,236,21,161,34,98,120,62,65,136,126,69,221,58,214,48,42,164,98,125,239,168,23,6,59,147,85,39,191,12,173,145,33,103,169,148,107,199,24,64,64,197,101,142,204,81,6,198,36,25,141,133,46,163,223,32,81,123,240,183,178,228,152,77,15,250,202,66,70,184,36,36,72,237,157,250,96,162,189,133,169,61,184,175,52,155,25,225,131,121,119,57,237,223,74,19,70,191,88,222,226,153,192,101,187,109,66,82,119,211,109,185,216,96,210,198,249,26,171,10,197,43,237,67,39,63,175,150,153,149,196,98,189,75,176,90,176,187,197,81,229,129,3,239,162,135,234,157,19,164,190,222,181,175,203,204,26,83,255,161,249,178,76,229,42,44,133,30,255,165,104,147,152,55,67,121,209,253,230,191,74,25,36,159,108,155,236,207,120,135,188,91,137,204,150,220,253,138,35,44,204,150,191,58,221,207,126,254,251,156,0,89,28,39,190,16,209,172,115,93,7,225,95,28,127,148,179,79,80,194,152,98,172,29,69,76,84,12,189,38,91,222,54,205,27,100,188,115,194,103,116,30,52,92,20,79,112,5,208,152,105,210,50,175,228,220,151,29,6,250,237,39,163,10,42,194,32,26,78,172,34,254,209,77,185,245,194,12,39,20,224,14,161,47,6,172,89,249,254,114,83,81,115,190,106,43,196,192,171,21,252,249,107,91,15,47,25,245,27,85,197,152,5,30,144,72,154,50,251,248,250,79,251,84,85,88,155,157,169,11,66,27,29,206,90,178,74,60,201,163,141,80,223,174,66,234,119,139,216,42,14,250,120,7,202,76,167,52,185,34,249,188,174,177,95,237,18,35,111,120,114,10,250,143,201,6,76,124,74,66,38,68,77,141,167,103,176,87,63,173,162,239,162,200,126,116,104,88,18,240,163,150,196,49,200,222,47,8,209,215,130,85,241,104,225,8,18,33,160,46,109,171,0,18,164,100,72,116,53,203,110,21,167,169,147,95,135,252,144,124,160,216,100,101,100,230,215,146,195,75,43,71,210,193,71,51,60,239,185,117,104,84,71,170,101,32,156,194,130,66,252,180,115,77,233,235,156,224,191,183,0,119,220,210,30,196,160,218,105,169,80,244,213,167,109,252,176,229,19,150,5,38,132,98,177,11,58,106,78,180,87,37,5,111,30,159,224,0,89,103,169,27,207,149,238,215,218,79,10,65,152,203,32,145,172,121,248,185,87,247,78,62,207,240,17,77,2,50,30,94,39,174,109,215,88,35,254,214,127,250,251,235,252,83,88,176,61,43,193,135,89,157,146,246,145,106,15,205,141,179,245,35,219,40,149,231,200,131,26,106,199,46,188,9,213,62,187,255,48,17,104,161,93,29,174,66,17,191,76,134,240,254,181,102,90,117,37,15,107,215,242,6,51,41,14,41,236,42,87,74,154,191,3,37,45,90,245,149,161,76,80,0,54,210,161,243,240,248,195,190,123,18,129,84,90,200,103,239,108,189,137,64,203,168,133,226,37,153,112,131,251,42,51,120,192,233,220,128,65,111,185,74,192,237,148,159,244,53,210,56,32,48,101,141,243,174,145,215,23,75,91,12,123,240,67,158,66,9,59,217,119,75,213,151,151,50,177,141,19,31,121,161,203,22,119,211,162,182,175,107,252,168,174,92,47,168,254,128,248,107,121,169,70,192,116,226,137,242,24,76,120,72,137,139,231,46,22,234,82,242,120,188,185,69,201,64,22,150,55,249,61,214,76,209,195,66,156,253,68,63,100,204,134,207,126,186,226,90,241,148,54,135,251,244,103,231,138,172,32,186,109,88,16,93,93,189,121,149,206,152,52,199,211,206,164,74,13,38,170,86,15,255,227,231,52,37,157,114,10,189,39,134,240,130,180,251,151,7,46,213,204,31,39,239,149,241,29,173,195,4,76,246,31,191,192,197,238,103,6,185,232,151,120,23,28,32,101,33,95,245,218,252,13,157,169,120,18,175,24,47,226,231,173,243,194,54,55,179,140,130,200,23,191,190,143,3,151,253,249,172,51,111,56,174,56,189,17,185,169,180,236,5,18,206,111,19,147,54,40,56,3,201,111,176,93,107,13,134,128,164,210,103,67,214,222,39,223,205,235,31,9,196,111,97,169,46,218,105,106,198,72,115,132,19,166,43,43,255,35,5,9,14,189,17,195,11,212,198,165,122,145,233,179,225,108,112,239,73,231,189,250,231,65,131,249,82,102,159,226,63,103,66,104,182,42,161,81,18,212,228,63,230,206,50,67,126,18,8,163,108,192,75,88,12,168,235,18,168,83,39,247,138,224,35,132,205,218,134,43,214,60,122,253,152,190,51,255,115,37,190,253,124,177,222,75,129,134,132,121,146,161,226,65,111,240,172,63,73,182,148,153,17,226,191,23,66,200,229,138,187,152,167,59,39,81,40,238,75,217,201,33,133,252,90,63,39,169,1,210,68,231,85,132,167,209,166,167,251,187,177,103,253,38,65,182,37,228,227,14,222,192,91,18,14,72,227,214,246,134,163,205,198,212,218,171,133,245,128,49,199,179,254,136,211,15,14,110,220,151,124,242,157,68,66,34,7,252,178,184,178,50,28,210,121,167,95,205,41,214,65,170,19,2,158,149,101,253,87,74,128,5,49,70,89,50,95,89,17,127,117,223,242,99,49,84,97,9,251,175,252,86,239,52,14,120,246,232,137,124,51,171,202,157,161,7,119,252,3,106,17,253,28,233,179,186,173,242,215,187,96,6,8,32,253,129,248,245,113,47,204,93,74,173,34,63,53,93,179,249,11,4,2,186,182,254,192,91,104,124,229,221,130,187,241,175,65,192,173,125,202,51,249,202,124,20,85,164,129,199,211,16,16,56,41,92,242,99,25,217,124,78,98,45,204,45,204,120,118,253,217,89,158,193,135,244,253,43,133,26,245,111,30,188,241,204,29,189,124,7,138,39,43,51,71,151,141,4,198,96,98,107,86,73,9,254,138,62,227,234,108,250,57,245,223,248,129,33,251,33,54,167,84,195,183,170,205,93,6,127,239,72,57,143,144,60,143,206,171,239,254,34,76,130,209,88,67,252,192,233,69,152,12,64,170,106,16,221,251,145,255,159,23,228,60,146,213,39,179,231,187,146,72,225,34,169,229,227,4,2,233,44,80,117,10,198,80,251,179,192,158,119,230,55,68,175,120,244,247,105,236,73,36,73,24,36,0,85,3,132,255,189,185,14,89,187,9,38,124,183,133,153,147,201,145,252,221,106,47,197,195,122,79,57,12,139,19,36,249,2,2,14,206,175,92,25,147,239,150,83,239,36,19,58,111,156,61,255,90,190,181,230,71,91,199,243,235,173,242,37,16,209,171,242,244,202,37,217,171,226,207,239,75,212,19,8,56,98,112,150,226,51,165,77,219,215,171,92,115,121,95,67,65,137,58,215,181,140,252,106,95,203,183,248,248,245,121,62,40,218,233,83,67,25,163,115,46,160,210,99,40,124,206,6,169,223,15,107,146,101,181,196,102,103,204,183,246,67,103,196,63,254,70,194,123,151,227,75,211,212,203,10,117,140,64,130,66,121,199,226,130,18,91,37,57,107,206,67,99,2,46,254,113,244,210,227,7,101,25,213,27,212,191,1,50,58,136,200,212,113,141,211,226,235,91,29,74,242,217,110,57,125,136,40,232,107,5,237,148,235,53,112,170,216,8,127,117,135,58,101,222,136,151,178,200,196,76,135,61,157,206,23,98,61,203,255,7,165,7,15,94,60,222,39,119,216,166,74,133,5,129,232,158,192,180,235,186,87,85,60,31,202,58,147,33,188,21,213,48,100,112,33,77,110,122,100,66,108,247,27,118,253,102,162,158,92,22,123,253,79,40,253,244,228,20,241,55,145,98,106,120,212,68,244,77,172,206,146,155,94,53,4,92,157,143,178,240,49,80,123,175,85,97,47,236,157,139,240,176,196,43,226,162,20,237,127,139,26,73,170,114,215,65,194,235,44,219,159,215,137,171,99,248,239,27,243,223,93,225,214,23,60,66,218,101,63,23,105,254,157,70,73,51,50,35,126,92,157,172,84,116,65,145,84,250,14,179,246,253,39,48,160,124,216,34,37,4,247,246,48,220,237,106,40,196,195,4,246,245,228,220,168,227,98,251,182,231,94,212,174,63,113,203,155,148,31,62,27,167,173,174,191,177,66,161,188,219,123,10,18,179,190,27,109,85,57,117,29,209,133,188,78,72,192,1,240,62,92,183,194,30,63,217,223,47,111,190,43,113,246,252,78,170,107,23,245,1,133,124,197,235,139,53,14,48,32,86,216,37,30,176,85,227,191,93,132,247,46,82,129,5,247,108,212,133,182,254,140,220,102,15,14,229,86,121,50,29,65,83,225,32,221,240,222,76,91,158,208,63,85,207,13,2,131,124,30,183,104,30,70,47,23,23,67,204,12,195,103,254,191,42,126,119,88,226,53,249,221,131,11,110,92,147,110,81,89,154,69,123,100,29,221,120,19,57,58,81,16,66,123,152,178,235,193,246,31,112,187,244,190,98,198,30,176,96,72,214,207,69,97,167,46,170,42,23,122,142,195,158,105,178,31,170,185,90,81,21,127,69,84,208,33,188,180,189,48,145,52,251,176,84,109,169,244,89,210,191,152,166,16,102,104,91,48,84,132,86,108,239,79,239,75,215,251,78,42,222,160,6,137,119,158,210,73,173,116,17,27,131,205,47,119,2,150,138,146,148,111,41,58,141,81,171,46,196,0,173,107,130,117,165,118,247,26,26,237,43,14,85,191,252,101,151,100,10,215,139,89,111,240,23,43,41,9,152,34,153,203,228,178,197,174,250,175,127,212,171,61,16,103,159,105,133,84,243,211,65,2,221,94,192,158,220,234,224,193,83,157,164,154,23,58,211,5,207,62,199,220,159,72,180,127,75,29,210,140,29,240,132,9,116,162,207,243,15,253,188,114,207,77,146,157,148,210,225,171,90,208,208,34,231,43,35,104,107,230,154,10,50,11,8,116,190,230,251,139,197,234,62,52,220,69,89,38,235,80,177,202,39,175,50,239,38,157,148,6,192,95,235,163,27,136,150,245,27,16,116,241,48,186,235,123,190,143,12,115,69,114,155,114,99,211,68,39,182,251,114,71,228,155,60,50,121,222,123,191,86,39,232,130,202,30,71,199,4,189,60,120,139,129,151,51,73,40,169,187,22,85,213,66,234,140,221,139,7,145,122,242,22,132,189,10,47,149,176,144,182,181,125,68,248,107,46,212,210,149,250,253,200,19,89,122,47,253,9,35,16,176,90,235,178,164,255,229,49,35,203,254,205,233,198,71,36,111,207,25,222,166,209,21,101,188,219,106,1,108,26,240,45,103,102,41,125,21,153,102,86,111,32,199,114,7,107,129,128,57,49,215,150,254,212,134,171,21,140,84,242,83,129,208,199,181,181,29,204,219,165,47,221,50,131,76,61,71,225,237,184,197,12,55,127,215,76,225,48,252,143,32,122,127,44,21,95,104,76,66,73,231,37,57,107,35,233,135,125,17,103,253,159,118,39,221,243,139,26,120,65,134,203,122,76,32,134,207,59,189,194,183,248,246,7,242,226,171,149,109,110,48,70,219,142,144,184,177,31,29,106,190,16,161,34,127,31,4,54,178,29,151,181,41,250,222,122,113,50,103,238,123,192,64,93,29,81,238,176,81,108,82,144,177,82,142,98,1,199,32,203,215,221,178,54,81,177,217,157,245,155,37,168,151,231,91,134,137,15,125,176,83,254,214,101,1,206,120,158,34,132,47,25,212,231,132,98,188,240,206,236,74,215,184,158,116,81,208,62,222,72,118,43,203,225,36,223,210,241,235,57,227,159,16,221,78,45,29,197,82,179,23,60,182,100,231,193,109,250,245,76,121,227,128,122,101,117,147,71,241,116,55,207,214,67,234,52,164,142,48,202,215,221,62,201,82,92,194,38,254,254,130,117,225,185,39,61,131,186,67,82,254,198,4,31,57,40,25,144,73,237,171,158,110,254,251,21,169,181,25,94,120,227,215,248,117,129,32,50,30,195,96,158,190,88,14,200,192,87,84,43,74,168,228,72,77,147,177,47,12,67,131,228,161,127,1,29,215,236,245,18,106,195,134,102,44,157,36,137,161,33,108,77,59,143,104,255,25,58,248,124,12,255,133,228,167,237,8,231,177,72,244,171,81,148,204,155,92,47,156,96,193,103,85,253,242,111,225,250,114,228,98,47,127,255,131,129,7,179,225,82,249,222,191,167,37,30,40,103,190,37,195,22,178,184,123,236,111,254,147,145,239,226,229,132,78,131,17,189,146,136,187,127,185,89,24,20,195,134,177,159,23,69,230,167,93,162,174,146,104,79,150,109,188,203,131,16,119,92,241,179,190,207,207,248,174,184,92,113,36,19,219,126,78,5,45,251,27,92,122,95,105,254,173,164,182,165,198,150,135,234,108,189,195,36,223,126,229,75,37,122,68,205,147,222,22,16,88,10,11,255,173,125,108,210,52,74,168,33,160,37,187,162,98,63,123,122,157,10,115,148,210,201,157,83,57,247,26,22,100,205,222,117,60,153,122,29,110,189,29,47,85,188,135,117,205,72,116,93,184,19,129,127,143,159,47,180,139,229,198,49,160,10,252,91,166,247,132,186,75,133,73,168,79,250,167,124,170,46,160,80,40,223,141,199,250,250,152,22,32,164,251,154,150,11,116,129,4,165,82,216,198,127,169,178,184,29,139,240,243,215,54,4,153,121,168,115,66,72,114,80,93,212,128,79,207,82,63,9,98,208,202,211,252,99,98,16,160,254,231,135,236,109,212,31,114,222,138,163,183,26,25,48,49,132,73,254,248,216,170,129,115,11,125,167,232,224,60,12,156,252,234,210,63,111,227,193,24,45,154,216,254,251,49,226,71,226,20,119,141,36,42,141,23,98,142,176,45,8,223,237,244,121,232,7,251,69,134,104,199,1,55,136,161,16,160,61,241,19,54,60,92,130,235,63,204,210,13,80,156,245,67,210,63,126,46,207,61,239,185,26,145,238,147,131,141,156,101,234,16,51,46,242,70,113,10,69,158,130,17,176,32,206,189,105,65,106,104,203,125,32,244,197,75,235,21,16,216,83,243,247,166,195,12,1,43,10,177,21,2,254,160,70,56,118,55,226,174,110,40,51,131,248,59,65,250,118,60,144,207,192,132,255,242,17,229,249,36,198,90,139,19,225,99,240,123,151,4,117,247,41,94,60,206,148,222,69,12,4,114,103,180,107,168,25,70,57,216,57,231,43,248,38,65,231,20,155,95,130,131,159,105,59,18,176,250,146,186,108,136,63,246,206,194,142,156,65,119,89,222,16,166,112,88,144,40,28,207,211,239,89,204,233,23,142,98,224,165,121,1,19,6,63,95,110,115,167,42,208,189,44,227,76,245,123,12,169,143,229,28,169,45,253,163,205,105,161,199,211,183,200,166,133,186,67,34,110,152,140,235,40,247,112,227,26,82,46,98,93,105,231,128,149,226,113,250,183,191,167,157,243,40,122,17,191,243,125,233,52,72,99,124,64,243,169,38,97,39,80,10,115,33,251,145,78,87,191,181,44,191,38,137,0,163,205,89,191,60,159,239,37,211,190,143,173,231,103,78,58,105,32,111,50,26,161,124,155,12,243,234,154,180,140,40,15,1,196,95,55,47,220,10,152,213,229,55,245,239,20,12,121,214,189,225,191,119,194,245,157,94,158,47,77,159,191,27,20,195,191,216,223,207,188,24,132,76,208,161,103,182,252,113,53,32,26,159,216,135,169,242,110,102,185,132,42,221,55,157,134,128,178,129,137,128,81,19,206,44,17,21,62,46,195,26,8,112,106,121,105,116,183,215,111,173,149,99,96,51,190,0,225,243,214,78,40,90,140,165,254,249,39,46,21,127,164,254,223,125,34,151,170,174,101,58,122,69,40,161,181,86,128,0,227,159,67,241,214,40,12,39,174,229,59,77,203,127,48,112,56,243,84,202,73,200,123,211,103,173,177,104,188,17,6,174,150,183,136,19,126,199,48,68,2,224,17,237,19,16,112,178,85,114,143,78,71,209,77,223,151,203,100,124,133,108,19,243,54,227,159,180,51,29,204,191,112,186,1,128,192,154,99,141,123,212,207,2,149,141,167,210,177,186,12,72,94,17,136,93,214,103,230,254,202,144,206,36,63,187,126,214,15,186,63,199,165,231,36,204,20,52,70,255,119,118,191,146,56,57,22,125,155,241,101,122,235,34,183,236,6,14,24,246,29,255,184,38,231,111,224,127,16,16,192,93,127,86,127,123,227,197,7,141,126,54,166,119,230,170,214,145,191,191,31,254,233,162,232,63,238,79,233,255,220,223,31,214,120,134,85,215,190,170,47,66,191,235,233,45,179,123,15,225,9,31,86,115,250,198,25,185,166,101,29,69,145,92,80,144,183,252,135,223,201,5,233,198,212,131,109,206,209,41,16,24,198,95,25,142,11,105,127,25,106,163,195,115,103,0,110,165,92,31,247,157,116,55,181,31,175,241,149,146,204,66,244,253,167,195,24,205,251,9,197,90,207,6,121,217,210,51,126,186,162,222,69,238,132,101,187,251,73,234,195,33,236,253,235,155,169,149,177,213,180,56,135,101,185,190,52,9,132,254,175,47,75,127,71,48,233,102,142,1,119,101,213,131,50,70,43,74,171,113,183,234,140,70,97,17,145,114,86,95,168,60,85,88,119,183,188,182,208,82,232,3,158,65,240,19,228,124,167,55,193,233,114,135,148,242,95,9,218,110,153,117,168,19,59,35,94,197,252,166,79,165,223,55,248,139,133,11,182,157,177,120,124,215,63,118,237,10,101,0,177,82,158,1,138,255,111,253,167,232,214,96,175,94,218,231,171,51,218,191,97,103,249,142,130,231,100,110,213,207,154,238,62,73,213,217,6,91,76,14,196,40,23,154,84,2,50,15,54,103,7,234,17,62,107,215,147,221,179,57,159,248,229,2,68,121,45,23,38,84,242,8,136,117,161,87,168,82,172,41,25,127,44,128,64,151,141,131,165,78,101,241,140,191,136,42,133,220,46,220,42,223,60,219,239,185,95,28,154,254,0,11,57,90,119,81,164,123,94,139,53,137,166,70,17,130,197,152,190,242,119,137,132,204,62,97,118,248,32,158,105,192,36,202,204,241,12,2,118,171,168,107,205,189,67,129,219,79,213,99,130,83,165,208,245,185,201,215,163,220,46,9,7,210,116,182,140,91,98,11,73,116,126,220,238,77,95,204,126,84,79,47,227,119,125,170,139,84,116,173,36,59,35,110,43,185,253,239,220,37,29,16,88,192,188,254,69,231,208,217,234,199,191,115,148,166,1,19,29,179,9,73,91,251,157,225,137,24,246,131,57,26,16,48,214,57,49,137,141,29,222,109,55,41,236,218,73,134,53,46,116,30,55,12,238,42,77,112,92,182,75,213,32,157,38,219,216,89,116,101,10,210,113,215,164,182,103,73,105,157,164,160,16,144,170,107,83,203,55,174,19,122,247,154,28,192,174,118,216,83,78,121,150,221,178,237,151,227,98,123,21,143,31,40,254,50,54,230,84,61,130,242,168,145,94,30,29,1,157,239,123,31,214,25,167,251,137,177,252,212,202,191,157,194,67,254,212,132,36,248,232,63,152,186,252,36,172,135,92,18,212,112,44,127,39,243,93,94,218,75,157,142,115,155,236,236,126,91,225,160,189,174,227,70,138,112,144,201,155,50,118,132,247,191,136,130,52,206,166,12,56,211,247,247,237,239,224,183,41,139,21,76,235,74,221,134,2,23,94,132,161,208,103,207,23,130,2,93,81,49,244,178,82,213,102,36,211,160,1,233,250,107,51,139,128,127,202,70,20,194,202,166,238,224,242,163,108,66,174,101,190,120,189,173,231,71,41,33,44,146,111,124,75,92,64,97,46,10,231,160,47,175,15,187,176,194,148,41,105,253,46,30,244,151,185,223,21,175,246,213,159,241,95,168,19,173,239,197,155,143,255,176,28,181,148,32,249,47,231,17,68,47,114,189,52,194,166,125,198,65,9,66,95,92,51,31,231,43,146,163,74,60,29,212,126,60,132,212,215,222,84,145,77,212,41,233,52,249,61,169,90,35,152,136,169,174,242,84,167,59,160,208,56,188,78,191,61,130,21,102,44,22,119,173,172,45,70,221,38,250,245,88,88,195,206,35,148,13,137,149,30,94,244,250,44,147,159,72,206,67,24,202,109,86,130,99,118,180,82,59,202,177,233,45,12,1,75,79,9,59,38,236,57,27,7,245,42,213,241,171,176,96,240,236,77,205,171,164,148,180,223,26,123,179,84,47,75,46,207,103,241,93,120,117,255,251,233,227,192,207,149,10,220,215,92,153,124,197,110,22,189,184,41,172,146,233,92,74,186,9,3,60,21,223,197,21,62,118,105,94,188,148,200,194,72,133,211,120,17,194,98,37,59,224,216,45,75,195,35,222,119,2,182,50,196,171,192,223,94,115,214,39,19,173,217,143,45,97,65,45,80,106,79,181,103,48,92,191,50,237,205,60,140,165,74,255,149,114,44,237,4,94,246,154,120,39,61,194,208,69,81,162,16,20,93,228,193,54,125,231,178,51,111,38,4,98,68,182,87,156,212,185,122,44,181,33,157,126,140,75,23,69,211,5,73,22,38,235,43,36,156,137,173,90,75,125,120,42,145,226,49,234,172,167,233,213,193,38,226,239,72,16,189,188,152,199,6,245,191,31,58,114,16,213,187,29,210,6,10,202,54,227,159,75,62,154,168,127,59,51,104,170,24,138,143,127,188,174,58,120,251,250,247,90,82,117,99,158,111,201,48,81,120,174,96,105,227,36,61,44,28,168,249,187,191,133,140,223,186,215,195,252,235,2,34,153,217,168,74,253,58,88,240,171,141,182,7,94,141,146,182,158,24,160,1,14,117,199,144,218,181,166,232,34,134,140,34,203,247,70,229,158,241,244,19,166,234,235,136,255,90,183,211,69,138,158,249,243,231,175,180,40,84,2,57,45,86,241,35,229,25,63,23,8,120,32,159,135,18,168,41,131,209,32,16,216,236,244,48,246,60,232,60,224,2,80,241,93,132,0,182,140,129,231,183,103,65,138,8,2,220,199,250,25,241,223,118,61,253,171,42,121,111,23,34,215,87,235,221,255,199,215,129,123,247,37,54,138,187,75,242,114,96,132,159,133,243,55,245,46,42,117,10,134,107,225,21,171,32,160,249,79,188,178,101,218,221,249,130,230,84,59,74,15,28,112,113,229,245,141,158,11,139,1,150,81,135,151,189,233,112,64,209,159,178,227,30,75,170,121,21,63,107,211,85,44,72,16,217,19,243,61,254,147,48,29,218,202,224,144,60,140,109,167,212,89,176,168,62,184,178,147,162,123,163,124,181,124,82,164,221,102,246,203,93,253,158,255,107,233,202,3,161,250,190,248,155,103,48,246,93,161,197,216,26,99,55,33,169,48,143,12,82,102,94,246,200,154,125,223,146,202,190,101,39,33,18,145,93,148,36,217,163,80,104,82,81,100,75,118,34,178,148,240,123,243,235,251,231,153,251,238,155,187,156,123,63,159,115,223,185,231,92,44,24,118,147,45,69,159,103,156,122,47,183,35,144,100,141,153,99,229,15,87,25,33,146,194,38,127,206,206,141,117,153,156,228,199,29,74,161,82,56,133,164,37,235,47,251,93,27,184,91,192,51,91,198,3,145,114,109,214,44,200,239,88,24,201,74,50,5,92,89,68,80,18,152,76,83,54,57,220,254,32,244,38,139,50,7,236,20,143,18,117,100,113,136,129,232,181,245,220,12,7,40,160,205,131,11,5,22,154,126,247,191,44,243,190,74,3,40,171,207,43,45,255,206,38,59,248,103,19,107,103,89,4,40,156,54,75,223,216,108,138,130,40,204,95,146,27,34,191,35,246,133,116,131,231,221,39,85,228,38,202,95,177,48,100,191,176,153,73,52,77,236,172,54,93,108,173,115,103,169,167,128,181,15,46,5,217,8,112,98,189,139,167,139,47,62,212,196,131,254,38,74,162,199,216,98,201,44,18,190,71,52,136,177,165,243,253,210,220,141,183,99,110,178,130,18,247,164,32,52,33,109,128,196,143,46,55,55,236,45,22,195,109,16,72,169,97,195,102,139,139,178,93,35,212,54,247,103,104,74,172,67,196,195,166,209,231,4,7,38,16,69,118,190,131,232,71,132,3,99,85,35,159,45,125,23,118,239,250,91,200,137,222,78,174,246,209,202,153,27,194,95,190,143,31,217,128,65,215,130,82,69,223,234,3,93,45,7,119,226,80,236,196,242,9,159,131,59,155,76,224,169,105,141,59,97,87,20,68,152,239,133,37,241,71,197,56,115,152,237,26,102,188,201,133,99,167,177,244,76,50,50,23,216,208,183,154,202,182,239,66,78,12,133,211,179,149,73,223,148,243,57,54,71,143,236,244,49,10,121,124,185,237,234,252,16,69,177,176,158,125,194,55,30,151,228,108,19,197,87,237,245,134,165,128,66,103,39,6,129,70,40,237,143,44,195,217,118,95,35,21,94,71,97,96,112,103,174,144,32,136,170,161,99,112,53,121,49,44,15,131,146,249,17,178,59,247,226,59,198,57,99,98,176,25,48,120,207,201,94,22,45,156,138,1,92,157,188,246,124,17,60,239,206,243,74,73,19,139,12,229,25,191,189,209,79,33,57,80,219,25,133,154,167,238,124,189,234,125,228,180,33,5,244,150,29,205,8,250,236,30,122,66,189,48,184,247,16,5,29,148,168,144,152,161,189,125,38,175,101,57,221,191,145,178,20,48,49,218,194,123,210,20,198,198,42,43,69,47,82,88,69,39,228,246,82,181,109,167,181,222,251,69,54,235,81,208,114,178,191,51,249,156,146,128,130,171,201,242,167,35,224,110,198,186,205,31,114,45,23,233,132,81,109,85,123,33,20,208,117,112,248,76,240,220,215,145,160,250,231,199,34,158,33,246,24,85,115,104,165,149,63,32,218,236,176,0,220,163,153,150,47,54,131,187,156,119,231,57,251,74,224,172,134,33,165,242,230,68,165,35,47,239,109,240,161,132,156,192,109,58,34,56,242,123,72,213,89,48,248,192,150,187,202,217,149,80,24,84,253,130,145,210,152,75,168,90,126,25,115,221,164,10,66,7,221,249,76,90,0,154,88,222,232,180,185,91,59,195,164,187,243,77,105,79,69,197,217,242,217,243,184,183,76,70,227,179,219,159,30,30,103,153,234,72,249,93,133,158,206,135,75,35,10,116,37,223,73,51,153,246,50,16,191,95,223,31,119,206,40,56,254,221,56,135,36,178,144,82,58,57,59,1,199,206,161,102,89,13,116,116,217,240,113,220,240,182,101,181,228,194,36,161,95,167,227,210,3,247,215,108,70,126,38,80,39,213,159,77,32,146,87,221,76,176,206,212,198,217,1,193,251,41,17,71,247,108,46,80,204,84,71,39,252,7,5,108,40,102,79,178,177,190,20,143,51,169,24,31,21,164,204,157,228,76,115,186,226,42,33,241,218,222,38,79,33,133,130,65,109,56,239,207,44,29,93,103,38,221,166,87,249,3,57,73,185,14,145,135,87,79,6,22,5,107,79,188,1,104,249,4,179,11,103,143,132,248,48,76,123,95,129,79,16,73,10,239,101,169,203,65,43,158,23,114,222,217,29,25,34,223,18,232,181,58,108,19,41,104,149,95,249,225,164,176,42,140,227,172,203,40,55,56,115,152,113,53,93,133,100,219,221,183,136,134,68,91,218,183,61,252,179,229,48,199,141,186,52,245,24,150,78,190,73,255,224,199,72,13,112,176,235,157,135,86,185,151,134,87,106,135,118,66,80,47,60,84,39,65,40,246,220,212,199,228,181,71,248,105,172,110,117,8,220,141,240,57,253,49,55,14,7,163,5,217,182,8,91,65,38,154,255,70,67,70,70,60,215,213,19,182,15,14,77,28,39,150,63,247,49,159,42,167,107,107,101,247,191,242,178,51,145,82,243,172,56,75,231,241,90,211,78,73,27,64,60,243,14,2,93,93,90,156,216,47,254,81,253,225,178,40,167,230,4,173,14,187,217,186,174,20,251,223,44,237,203,102,101,174,36,186,61,78,27,120,51,43,222,27,20,46,19,248,110,75,146,136,47,91,11,105,126,74,159,31,196,236,101,182,249,115,151,136,187,95,80,216,53,103,236,244,192,136,140,123,203,59,241,255,239,35,202,50,37,98,249,239,48,57,116,165,71,97,220,117,233,6,217,198,111,77,211,161,127,187,153,214,209,20,180,212,198,246,91,242,199,241,204,153,68,7,150,208,70,242,2,79,229,105,85,199,42,88,135,119,88,253,6,47,194,103,47,119,250,91,157,227,212,158,96,10,28,94,175,109,162,241,191,189,114,203,43,59,50,171,175,113,130,192,93,164,189,44,67,155,6,37,188,202,144,126,215,145,152,64,120,206,112,41,32,163,239,133,116,174,198,121,207,155,15,75,32,240,119,116,201,223,68,163,31,155,71,210,246,133,13,145,245,167,242,134,69,165,229,207,43,148,179,231,86,205,184,130,102,121,104,218,252,211,129,56,243,20,107,102,181,239,250,28,240,28,87,221,179,150,234,228,227,116,90,236,78,215,115,234,97,80,161,29,163,198,190,157,98,137,25,140,62,66,188,6,131,238,143,103,101,7,9,22,177,77,76,121,186,47,149,97,176,177,189,71,241,131,104,203,208,132,171,73,138,26,61,162,159,97,238,23,150,181,186,88,37,172,86,114,2,232,198,37,255,182,75,141,109,174,191,145,93,152,152,92,62,210,4,131,85,109,103,229,90,154,52,202,44,15,218,134,149,241,81,208,22,215,85,51,53,55,209,37,135,158,63,4,90,210,160,206,215,62,218,5,75,193,141,201,66,152,61,166,138,191,48,38,204,70,91,167,207,217,147,237,34,43,75,107,54,6,38,13,96,95,49,36,234,234,115,236,14,140,16,109,53,105,254,11,101,203,244,36,23,91,147,179,234,15,102,4,176,120,107,165,183,181,179,163,245,74,130,210,161,159,171,179,33,18,195,20,118,116,187,88,54,88,212,226,51,203,39,87,120,174,4,69,119,76,95,55,145,165,79,228,42,192,42,66,4,199,119,135,118,39,79,164,245,120,159,19,232,208,56,142,232,203,146,243,248,151,205,102,221,22,195,44,175,133,56,164,125,79,230,227,83,127,187,182,28,60,17,103,88,106,71,65,171,168,90,228,112,29,108,166,199,2,177,156,34,231,104,249,47,207,18,62,76,120,201,49,158,6,84,15,30,129,65,239,55,110,132,214,143,82,179,122,130,37,55,232,120,17,249,37,94,173,145,95,208,162,234,204,51,214,75,131,180,120,36,60,130,117,100,90,52,237,66,105,241,243,163,241,116,17,95,125,211,233,1,64,107,213,144,204,253,139,24,91,251,62,224,40,96,67,53,59,96,116,88,153,91,13,193,231,14,194,58,45,255,51,3,89,104,241,49,27,212,217,201,21,245,197,237,196,153,223,235,91,69,236,46,84,10,184,225,115,254,78,112,168,196,245,110,198,178,138,175,115,10,229,197,54,31,30,111,224,229,231,209,62,194,63,50,175,16,193,223,137,55,110,203,153,101,112,41,5,214,181,166,212,211,252,109,74,20,191,253,48,53,136,183,240,158,172,66,247,197,111,183,235,151,56,98,40,205,12,124,97,5,126,163,52,127,163,18,197,126,110,175,106,135,125,220,77,71,121,10,90,33,60,59,153,79,148,139,57,50,87,88,175,136,179,79,159,189,238,139,241,159,110,131,70,214,179,225,117,247,116,32,180,239,147,95,7,15,220,222,105,172,199,39,179,130,41,227,244,170,83,133,212,132,206,149,128,156,119,26,204,225,41,48,232,152,95,164,172,44,96,55,59,146,53,206,52,189,70,153,59,77,45,234,48,181,107,231,155,23,14,94,50,230,135,75,141,63,93,181,136,174,60,66,199,203,212,54,1,221,164,160,101,178,190,36,232,58,110,103,4,78,239,124,223,4,33,39,182,213,56,120,26,115,210,251,162,187,231,201,180,108,132,143,60,187,232,123,37,148,19,107,139,198,184,170,222,131,64,231,2,227,53,189,197,110,190,99,65,75,225,163,166,20,18,227,154,186,28,195,43,215,218,143,97,23,158,253,110,165,160,135,90,155,19,249,106,255,152,142,213,28,247,190,80,67,1,85,138,71,16,60,191,148,53,114,128,57,18,197,68,41,5,228,217,157,15,53,198,63,145,228,194,185,232,108,66,152,195,117,139,129,33,171,19,131,26,220,186,195,121,177,20,170,88,229,233,33,133,22,147,186,215,81,195,66,20,60,68,2,34,58,173,124,103,84,3,69,169,26,26,115,148,241,247,198,210,179,106,102,17,86,174,135,38,39,233,221,13,137,165,143,226,148,191,222,189,19,125,201,159,127,174,34,209,242,29,125,3,219,228,71,63,19,81,6,9,78,61,76,175,140,34,238,129,102,102,110,187,145,213,147,95,239,189,238,217,239,193,224,214,231,72,194,21,134,238,81,119,155,166,154,21,13,104,46,144,106,90,63,91,108,112,153,163,208,190,139,113,27,142,77,178,137,175,34,136,235,176,29,234,62,210,90,139,216,171,142,183,30,253,224,44,231,141,63,152,95,196,207,27,131,240,141,74,105,215,180,90,135,136,91,7,18,57,66,153,16,123,151,249,209,165,11,70,78,77,178,104,143,64,211,89,138,19,125,199,207,220,197,23,210,114,66,3,201,123,102,1,88,60,211,198,25,143,161,233,188,31,135,174,132,146,34,178,41,41,230,75,223,78,73,222,11,24,192,115,109,101,233,97,160,88,71,170,83,186,199,73,163,138,204,115,231,243,182,115,16,124,119,123,31,173,159,137,115,174,82,83,18,253,168,208,199,216,232,102,21,45,160,69,125,41,111,95,234,41,218,135,236,183,15,140,62,179,120,52,43,5,36,29,8,2,16,126,88,146,82,36,203,25,167,131,21,139,211,52,229,142,65,202,11,29,76,19,174,200,154,214,247,149,6,117,127,236,99,44,52,29,189,205,148,198,220,217,195,132,181,56,128,166,125,175,214,185,202,74,64,71,185,167,170,103,91,110,208,226,47,205,241,27,116,117,198,80,19,120,191,86,86,254,159,31,91,61,171,84,11,44,160,99,88,247,11,39,160,63,144,94,13,198,135,232,193,33,37,41,199,73,32,17,151,58,255,81,199,3,39,226,146,119,158,32,122,103,138,236,178,86,244,120,58,174,202,134,39,60,11,159,195,121,156,146,32,26,170,86,77,110,146,246,49,124,53,196,118,177,15,34,29,170,251,177,236,253,38,99,40,226,38,25,61,149,1,205,137,216,125,202,89,184,57,94,152,143,30,214,230,205,209,188,165,216,187,191,53,182,227,160,48,46,45,248,94,216,22,66,123,167,125,140,253,115,239,248,190,213,225,184,237,67,98,228,133,129,72,223,128,198,38,27,225,9,177,253,82,187,71,200,126,246,92,130,144,245,135,65,193,136,211,130,197,122,23,6,237,98,143,201,22,255,197,159,227,186,195,253,136,30,5,117,163,106,82,139,29,130,151,143,100,184,31,203,32,48,81,64,187,23,67,235,215,10,140,48,218,3,101,208,197,135,52,251,218,234,212,151,224,145,225,156,158,163,223,238,148,244,49,114,200,54,39,164,217,223,235,137,213,108,207,189,104,76,139,239,31,163,124,8,136,86,40,234,254,12,104,237,208,252,119,168,7,167,46,213,101,29,123,29,240,64,201,26,114,114,152,250,20,227,55,19,28,34,202,120,188,67,124,137,130,190,60,211,152,152,46,30,233,195,121,50,153,149,212,71,187,175,90,187,191,92,44,217,40,58,93,218,22,165,15,149,98,168,133,67,231,51,101,44,50,83,148,210,60,206,104,222,98,95,50,31,105,184,187,129,123,123,42,247,143,3,11,81,90,207,205,72,213,159,171,60,144,57,168,250,26,131,9,132,227,248,244,55,100,228,143,119,151,198,81,252,147,164,251,196,207,183,79,169,248,243,101,134,100,242,148,50,170,117,144,96,106,229,204,184,231,222,194,103,73,225,119,228,103,28,220,239,184,78,191,122,145,57,224,186,216,56,28,55,157,165,163,140,216,83,118,131,55,214,175,12,69,246,74,60,103,76,65,248,15,225,113,156,172,41,201,160,238,227,155,47,149,212,38,168,84,222,255,110,197,92,209,84,23,234,249,139,71,167,16,252,94,214,237,183,63,111,197,222,240,227,67,69,171,64,50,45,62,216,162,226,65,13,253,84,141,209,96,159,189,227,16,232,254,192,200,52,161,19,190,249,214,218,179,119,8,217,15,44,94,199,252,246,81,253,205,172,163,50,33,241,58,1,198,133,97,117,156,147,51,107,121,172,60,167,159,1,81,68,252,94,167,144,107,94,148,15,195,15,251,33,116,227,1,34,62,182,243,242,74,89,152,16,39,157,237,21,91,169,23,68,189,9,31,252,178,207,225,251,235,239,91,65,115,1,0,194,233,215,57,59,184,53,61,92,161,227,120,112,237,176,57,185,156,91,218,81,58,39,66,240,163,228,229,83,98,206,78,48,117,106,102,55,121,52,100,20,79,245,78,107,112,171,130,49,251,154,218,186,250,198,1,151,36,25,122,147,121,80,80,231,215,59,150,206,227,31,94,75,53,155,127,97,176,61,135,172,231,58,220,67,46,163,121,49,30,17,246,34,137,216,241,184,79,101,231,8,228,214,21,226,185,246,150,78,54,101,200,137,165,174,194,253,114,213,137,105,116,109,78,186,232,71,8,199,197,34,249,220,164,74,210,193,238,251,112,225,132,36,37,22,83,88,216,50,217,112,202,129,169,216,35,129,107,29,66,55,36,81,181,246,196,154,134,131,146,205,67,14,115,104,226,69,228,189,79,72,157,28,202,122,102,84,245,144,177,31,38,97,34,108,7,206,54,238,70,109,199,183,91,203,99,33,146,181,255,229,69,153,53,187,46,20,73,41,85,124,96,156,75,178,43,184,249,72,94,191,178,148,41,209,157,153,78,196,235,184,133,203,221,139,43,230,183,149,216,108,211,21,203,225,185,236,73,49,221,42,103,119,182,3,22,90,102,109,156,20,47,64,155,96,225,232,44,231,175,16,206,146,102,30,77,190,133,241,159,81,113,41,66,105,201,215,188,116,127,92,10,99,190,34,227,237,238,232,202,99,105,114,181,130,55,7,78,217,248,110,105,114,109,164,88,56,123,1,101,165,229,7,99,232,234,6,199,160,98,37,58,166,159,39,6,37,254,34,250,87,243,196,113,69,72,197,149,3,192,198,141,110,140,199,9,68,52,157,191,181,171,247,209,45,206,255,237,58,3,25,127,116,169,61,200,185,14,14,213,44,187,65,105,126,1,227,194,109,28,162,100,196,153,88,246,179,132,230,228,16,62,243,201,193,127,44,129,55,13,110,177,61,180,91,75,15,131,43,53,175,20,207,76,75,251,10,135,223,7,125,92,17,60,126,163,171,22,162,112,253,71,143,77,53,120,117,22,6,67,214,22,9,89,79,217,181,251,211,20,115,36,67,161,206,129,0,241,236,252,111,153,105,68,243,31,110,29,233,148,115,164,54,245,27,138,2,234,238,151,233,138,25,237,243,250,21,44,203,134,89,80,64,168,252,7,126,33,233,142,182,177,159,220,92,0,112,98,247,234,235,102,250,91,47,159,160,16,251,89,161,247,39,26,0,204,0,131,118,102,0,221,79,166,19,0,128,252,92,103,230,183,249,216,174,128,49,132,159,104,106,31,123,255,93,130,109,133,195,1,208,35,194,96,29,213,65,37,118,135,193,254,119,219,115,116,66,45,52,135,222,184,86,98,215,13,15,2,116,223,63,132,51,67,36,133,194,129,140,234,189,198,106,187,135,56,209,151,206,132,238,56,205,164,32,233,224,124,246,65,121,248,40,87,0,5,244,236,140,63,61,15,28,20,120,153,53,120,147,98,60,78,175,221,153,251,230,150,186,150,71,141,67,122,129,214,65,10,58,216,54,59,135,76,234,183,181,138,191,50,43,16,65,153,99,231,27,218,107,71,231,253,98,69,227,252,240,190,148,82,58,67,252,188,139,235,203,140,121,128,46,41,193,3,2,133,84,174,213,29,92,226,36,132,101,165,216,118,98,40,96,114,49,100,228,98,214,91,167,235,239,40,184,39,4,151,166,73,42,153,124,74,185,109,220,180,166,238,220,196,7,129,158,244,129,107,73,223,99,91,183,248,55,130,72,210,180,120,25,246,132,182,145,43,149,143,213,133,174,213,26,35,120,248,118,230,158,233,149,225,183,98,48,172,186,157,65,64,171,92,233,125,30,175,238,148,209,35,40,84,198,167,67,155,239,199,91,43,7,60,143,36,115,185,29,53,146,28,167,159,244,115,215,73,224,197,166,60,56,71,121,198,186,75,32,189,155,28,176,168,232,88,124,249,58,212,41,254,125,116,159,254,79,236,158,187,157,224,1,95,6,219,103,138,119,122,40,160,73,195,204,160,203,65,233,85,33,235,84,13,16,64,218,87,144,238,251,238,219,12,235,246,0,251,25,255,159,227,146,97,237,57,45,107,182,115,143,251,180,164,98,236,188,17,124,140,176,242,96,157,185,106,161,238,164,22,10,30,132,64,114,152,65,119,124,156,6,177,45,156,75,76,43,27,2,31,219,218,13,176,44,245,233,4,10,185,96,57,65,10,40,244,140,62,196,195,75,171,212,201,100,186,213,79,30,203,28,22,134,53,57,91,47,19,207,32,193,102,219,223,75,36,221,45,152,25,201,187,31,102,28,192,59,205,178,56,74,196,84,204,167,25,72,101,145,115,149,24,184,179,74,125,41,98,135,167,178,227,133,249,154,171,211,95,120,134,90,142,80,192,2,141,177,82,11,211,77,63,105,19,99,187,148,116,98,108,146,179,74,118,198,219,139,151,71,77,187,205,140,110,82,64,127,89,246,187,33,169,150,204,2,190,50,132,126,198,127,246,46,43,151,241,241,232,50,116,86,23,199,255,253,189,149,87,196,121,20,46,166,58,87,85,13,17,208,211,122,143,122,19,52,85,5,82,56,191,230,200,68,67,78,236,254,151,119,158,244,36,41,107,209,73,218,221,168,18,73,241,83,179,17,33,45,243,24,103,246,139,38,210,197,144,203,39,20,211,31,9,169,67,249,207,25,79,158,252,123,139,230,79,253,80,113,39,247,221,95,213,148,200,8,85,15,10,250,192,117,215,28,50,179,174,238,195,153,196,208,211,104,196,62,121,220,115,210,33,183,122,198,116,44,49,44,204,141,130,190,177,51,146,4,139,222,99,111,47,53,126,84,116,146,152,48,171,168,23,87,34,190,29,110,180,118,207,236,87,57,178,191,184,213,23,239,7,61,186,246,118,64,230,145,109,40,22,47,234,111,97,110,254,59,231,30,199,118,152,126,251,115,24,12,254,194,72,40,81,173,119,116,230,245,113,145,215,38,178,182,106,25,111,217,22,91,7,1,191,101,239,143,246,193,160,111,91,135,98,52,133,191,104,240,68,49,253,210,95,168,251,160,87,138,237,178,180,149,115,116,19,107,93,185,19,217,133,165,178,225,196,242,171,244,130,81,99,119,41,157,183,48,70,180,114,244,88,163,191,190,108,132,90,28,151,125,54,52,199,83,145,1,143,172,170,150,216,125,144,124,181,172,72,116,217,92,115,111,222,21,106,210,21,251,115,181,30,232,133,193,201,148,25,229,193,224,236,196,43,106,186,242,1,223,97,140,9,116,115,161,62,36,35,102,213,89,35,82,242,48,20,123,180,14,183,94,182,55,57,139,230,57,199,50,57,71,212,139,234,172,42,145,206,75,78,157,89,207,87,104,127,9,129,67,122,163,99,231,191,110,214,246,125,206,108,219,57,70,139,135,175,71,232,239,139,84,240,179,34,180,58,154,141,198,223,215,28,248,176,209,95,214,85,176,176,167,246,194,144,22,95,237,172,10,125,204,66,254,252,237,77,91,189,62,8,119,221,110,99,221,188,110,193,191,232,215,220,79,251,126,218,125,187,96,229,155,141,42,193,209,217,210,94,47,89,17,188,205,200,254,244,156,158,155,172,221,51,123,237,140,25,76,26,195,154,24,164,58,56,179,108,200,109,145,68,232,40,177,82,134,229,191,199,108,197,69,158,125,7,197,109,205,41,165,184,169,3,207,166,63,149,212,11,60,144,249,202,133,128,172,92,79,69,221,238,184,206,145,135,248,246,203,100,90,124,72,55,247,39,57,131,75,51,114,95,243,118,88,77,225,216,40,27,163,11,222,6,50,92,23,30,255,84,104,99,232,151,209,158,242,54,113,95,248,20,30,119,173,244,254,118,152,166,79,12,81,175,226,126,162,74,103,219,129,92,131,24,50,220,205,88,57,170,20,35,246,86,186,51,184,117,121,163,0,198,161,62,125,25,103,83,187,12,174,202,204,74,184,166,34,243,213,206,68,224,117,101,180,172,12,223,150,45,24,35,160,245,103,123,219,226,7,229,234,89,181,64,97,141,91,180,243,155,105,25,43,166,220,107,84,159,31,54,111,244,97,82,146,102,96,58,65,156,145,173,45,50,43,233,163,54,194,71,190,43,92,168,59,65,23,41,108,56,255,157,201,8,238,238,40,112,247,150,145,50,96,3,53,194,254,220,190,73,219,191,157,240,131,59,214,244,3,70,60,219,14,4,132,127,173,206,95,61,156,232,235,205,232,240,176,86,238,61,69,250,226,68,214,15,107,153,27,12,90,251,50,179,252,41,100,67,103,209,145,226,192,230,102,153,42,9,167,96,6,111,216,169,56,172,172,226,157,171,20,199,124,114,177,226,47,38,17,67,169,168,254,158,156,32,230,242,19,14,137,67,82,57,180,251,231,250,179,30,15,148,30,221,153,128,250,110,217,80,86,83,92,204,214,114,121,246,131,85,206,62,178,219,63,11,129,22,51,81,223,226,195,196,167,84,91,207,102,22,111,32,248,223,145,215,228,91,114,120,25,187,249,247,83,20,64,76,152,254,78,118,245,44,78,166,110,237,227,254,144,196,33,156,158,215,250,244,238,233,171,254,236,124,243,70,57,77,196,165,7,79,140,93,30,138,27,30,99,78,52,99,219,223,32,158,139,250,110,224,42,85,34,153,44,28,56,201,23,56,131,204,183,155,133,197,202,158,103,217,239,46,235,240,2,196,222,137,192,50,74,86,69,197,115,236,244,247,130,103,175,192,36,65,183,199,74,29,13,165,98,103,109,236,18,27,180,53,93,36,150,90,86,190,141,203,118,140,14,200,115,218,225,105,124,77,42,125,86,144,239,254,133,53,107,181,112,27,104,78,205,107,187,222,255,216,5,11,14,177,10,24,162,18,82,242,139,143,136,204,94,94,217,142,251,118,71,3,93,69,203,207,183,168,88,211,50,227,217,227,122,162,198,149,159,152,80,42,102,142,147,124,152,205,97,206,145,246,231,150,143,230,45,1,55,51,159,63,35,43,47,19,245,134,200,103,205,160,20,225,202,186,242,115,238,227,158,81,170,90,2,194,143,177,46,244,254,227,107,59,108,252,251,172,135,142,160,11,31,208,242,129,113,222,222,106,170,220,21,189,231,104,27,212,14,119,31,220,104,114,173,202,145,166,235,53,33,222,95,29,165,96,152,168,207,102,197,58,226,68,134,243,199,166,191,255,133,231,84,54,242,86,146,243,174,49,160,94,202,88,227,71,201,248,112,197,58,233,196,106,80,56,198,181,94,86,167,148,120,162,108,201,99,255,204,94,253,19,126,156,116,1,238,55,220,157,142,18,61,166,207,124,129,227,102,70,154,74,152,46,45,127,215,19,210,152,159,142,79,75,202,150,167,122,9,84,138,159,74,139,249,57,243,227,173,72,77,119,220,141,68,196,126,158,58,160,184,76,59,207,54,213,164,63,176,64,179,167,35,78,62,230,67,100,82,24,154,149,31,177,151,237,42,176,180,243,111,106,27,186,220,144,17,138,173,37,103,209,197,226,150,225,48,148,236,72,140,0,28,43,236,95,117,131,35,249,36,93,163,85,41,61,39,61,212,29,199,116,216,170,212,192,224,178,38,55,91,13,179,94,31,99,124,149,69,50,234,244,241,184,148,97,172,237,76,0,236,68,239,95,213,60,93,124,159,177,172,77,86,75,185,131,210,157,206,196,187,148,118,216,252,52,187,152,23,138,84,0,205,89,214,84,72,56,220,170,247,60,191,244,130,73,64,99,172,236,78,59,149,179,195,242,114,192,140,13,64,180,149,38,204,149,98,81,70,51,68,84,218,43,192,186,78,158,160,112,43,61,76,82,127,157,158,229,236,68,119,140,164,201,29,34,232,28,251,211,80,198,132,135,33,68,110,159,73,61,22,193,163,109,163,224,75,170,70,205,183,180,29,128,105,4,239,98,11,190,189,190,21,87,194,150,92,195,188,81,190,7,149,222,117,158,172,217,116,88,28,68,173,119,75,163,220,17,251,184,112,48,99,35,224,110,133,53,8,223,205,201,208,212,3,34,226,156,47,40,9,44,128,51,28,230,175,176,154,46,166,75,158,1,207,182,170,78,140,50,188,191,238,198,136,172,23,172,148,1,7,246,161,193,190,68,231,177,45,17,90,62,182,18,101,76,219,21,255,144,149,123,45,230,7,224,185,200,2,226,195,254,42,79,46,63,87,102,203,1,105,132,15,98,33,237,62,98,23,235,42,135,152,198,57,113,162,216,105,67,179,232,210,56,23,85,131,208,21,243,79,130,180,251,63,208,236,57,216,136,237,54,218,165,45,105,2,6,253,169,246,114,251,26,207,241,225,241,194,98,156,8,255,241,71,236,91,99,47,97,38,224,38,169,166,154,145,22,31,55,90,174,109,65,236,77,239,164,150,186,135,55,252,82,162,80,40,221,187,215,82,7,95,101,157,199,226,69,243,47,43,246,74,0,234,236,84,101,143,52,22,230,18,113,47,219,83,206,191,248,123,60,253,254,121,127,182,236,113,2,38,172,189,252,13,222,15,167,92,95,147,40,23,214,141,236,143,134,15,230,15,85,120,156,197,132,61,173,118,57,67,161,194,149,198,130,146,85,245,170,177,81,251,139,187,220,125,21,225,5,5,252,238,39,130,8,124,154,248,83,139,115,227,244,58,81,215,41,9,33,28,199,30,125,35,218,179,115,17,123,59,6,78,95,197,138,51,108,88,110,149,110,49,152,83,98,217,13,153,205,4,107,159,14,244,116,22,178,177,106,84,147,229,227,148,98,37,171,118,42,95,255,113,249,150,222,70,68,99,217,174,25,87,102,140,54,12,22,237,221,229,120,64,193,233,25,70,41,9,238,44,30,219,55,204,21,43,205,68,214,95,1,61,65,194,92,152,184,170,22,245,52,224,26,5,67,183,202,101,242,205,197,150,255,89,209,59,43,191,112,24,195,36,221,16,184,51,180,56,35,153,203,182,178,179,172,185,112,92,250,221,143,181,225,229,91,126,51,58,22,47,251,104,247,61,29,165,29,115,253,21,98,4,78,185,133,179,67,115,199,11,77,44,55,43,157,154,177,140,97,210,151,49,48,73,210,173,117,250,85,139,115,49,227,253,181,244,167,32,89,79,98,201,234,92,208,120,146,254,132,248,207,153,11,134,196,132,252,1,243,183,163,98,38,119,194,185,31,49,87,186,195,24,217,169,210,41,7,139,250,240,189,73,25,251,99,246,100,67,255,165,83,31,174,47,190,254,172,53,146,67,252,169,10,205,1,53,139,105,238,71,67,84,207,255,129,24,248,106,136,184,55,146,131,16,199,85,247,87,21,71,51,93,69,30,193,56,46,183,15,110,137,34,125,226,94,123,15,165,44,88,40,134,114,172,67,122,25,62,150,103,227,166,207,150,222,108,130,192,130,123,105,50,89,95,62,119,206,138,167,49,68,98,161,78,34,229,240,151,202,128,142,224,136,122,150,97,93,55,24,167,50,85,150,190,172,183,21,153,252,84,251,18,211,79,90,190,193,154,44,183,11,25,183,207,96,244,237,222,6,194,36,173,169,158,244,229,254,221,208,148,186,190,174,192,96,205,114,76,165,103,160,111,181,111,35,139,196,235,57,174,54,218,247,117,93,131,101,244,49,182,221,206,168,92,106,2,194,87,122,244,9,129,58,222,207,208,237,162,214,170,32,12,138,103,199,40,22,245,50,216,237,27,211,143,210,9,65,160,89,207,61,219,164,239,221,167,164,4,140,233,82,197,105,246,128,30,65,248,7,79,209,124,107,156,215,187,167,148,85,229,115,167,241,235,63,100,170,50,219,227,46,126,29,133,56,133,122,183,199,212,76,234,100,141,194,158,142,218,241,80,208,124,97,243,241,92,60,185,145,19,103,36,245,74,212,41,184,212,249,55,119,220,43,118,27,121,59,115,216,93,217,137,224,129,201,11,242,222,130,42,121,33,139,167,13,70,217,40,242,44,110,20,179,209,136,45,171,235,237,18,158,19,148,209,248,163,117,3,122,143,123,211,212,133,231,242,61,199,20,53,153,165,164,205,6,139,141,60,106,132,141,239,41,36,168,194,160,92,249,146,108,127,217,112,179,174,56,233,105,116,56,121,33,181,179,238,114,151,189,205,47,77,252,58,61,175,31,25,31,29,249,33,96,183,88,226,234,108,198,217,41,222,10,218,247,127,73,25,25,81,29,54,148,176,242,106,161,167,2,67,252,20,121,187,50,164,89,48,231,100,206,167,75,242,180,124,142,193,35,131,155,27,118,116,129,85,205,231,126,143,247,100,217,20,151,21,187,18,5,159,183,5,95,36,177,32,251,201,35,198,61,235,178,254,115,30,50,202,182,88,115,40,86,170,174,188,89,114,205,40,89,139,204,101,246,249,139,102,185,214,210,226,88,90,250,247,41,48,146,111,92,251,52,241,234,198,76,111,3,97,83,77,157,143,121,252,171,57,0,119,11,44,101,21,207,31,127,119,37,226,21,115,106,186,53,17,124,149,243,222,226,199,5,141,96,67,248,246,168,251,23,34,88,111,243,68,57,243,18,251,4,157,125,235,45,21,186,255,199,191,150,75,10,119,139,168,38,53,205,126,221,33,206,189,176,225,137,114,149,184,62,149,125,56,92,56,229,23,140,145,42,92,176,93,254,251,37,108,126,70,112,132,125,159,22,191,165,83,22,125,63,202,141,67,217,32,24,86,167,160,45,214,36,47,27,241,193,108,169,47,18,138,81,77,8,126,74,171,122,174,15,215,49,174,156,73,14,201,210,132,99,141,234,150,188,3,23,15,211,137,17,237,243,75,222,19,74,99,218,249,175,203,239,212,156,21,40,40,142,193,86,67,160,229,124,213,21,142,124,75,77,209,0,213,108,199,143,68,233,247,98,230,91,249,15,205,199,247,47,252,94,144,67,244,65,230,201,188,114,230,170,181,115,172,176,147,64,174,31,205,127,126,22,223,179,243,221,61,192,144,223,174,161,65,19,47,97,164,178,254,54,145,195,73,197,169,67,168,201,7,234,102,218,144,169,198,63,221,220,65,13,167,238,58,148,195,224,227,231,175,241,156,62,73,156,159,210,162,132,62,92,160,136,37,118,34,40,161,119,53,210,183,187,172,143,239,57,209,45,197,126,88,87,166,88,146,228,35,206,185,117,47,145,130,211,247,18,124,129,127,43,223,133,23,175,17,61,230,65,238,101,90,59,197,249,243,90,21,137,180,198,188,192,155,209,199,120,244,212,64,2,197,157,247,227,89,238,101,166,154,56,100,126,168,215,26,173,178,175,158,78,242,138,125,253,149,27,166,54,68,7,11,237,91,53,202,126,190,59,205,21,20,170,169,39,104,100,164,164,227,204,150,31,153,73,159,217,126,7,246,202,232,61,208,56,148,48,94,160,193,190,239,242,222,18,225,95,54,174,222,176,163,20,203,161,216,156,56,252,111,24,103,228,159,236,100,32,104,194,24,247,85,43,164,6,193,63,158,194,20,91,135,31,35,81,223,6,157,119,34,57,200,94,152,69,137,183,172,10,117,226,92,124,36,190,159,101,112,172,90,71,5,183,131,94,70,180,57,250,135,97,241,33,218,249,107,252,157,233,195,166,254,12,28,120,193,237,76,178,30,105,201,202,173,226,21,15,231,248,231,119,238,150,84,24,156,154,160,87,241,190,54,225,66,120,173,116,145,37,157,136,43,156,44,234,171,24,218,60,2,132,201,231,123,173,246,63,102,47,56,229,129,1,0,123,85,169,108,86,70,152,224,36,193,134,96,245,245,254,132,102,32,13,235,149,70,137,45,77,229,97,72,137,207,188,207,14,0,161,218,239,21,240,32,82,174,248,130,85,74,152,51,149,137,10,17,112,52,89,120,122,160,95,73,19,216,166,164,255,147,1,73,129,116,188,38,248,75,103,225,159,156,79,33,49,87,8,167,100,53,88,241,80,57,32,182,172,65,16,8,61,48,154,169,242,228,50,17,23,89,240,172,111,113,252,39,59,16,6,0,95,215,69,169,28,118,147,79,124,129,208,81,203,84,162,173,72,237,152,192,135,63,173,209,205,187,57,147,154,194,32,32,173,252,223,251,116,177,74,22,40,0,56,55,141,250,127,123,128,147,12,99,98,91,182,54,225,135,120,12,161,8,254,224,39,116,64,104,174,82,230,223,178,163,68,78,54,62,96,194,78,114,101,107,48,2,0,168,94,255,61,159,148,63,235,186,249,224,252,29,10,207,191,246,230,21,20,39,44,128,166,219,92,34,210,52,89,182,233,208,49,228,33,102,244,42,17,163,238,95,239,33,222,229,8,106,132,2,192,213,190,255,234,159,8,29,160,59,33,90,99,252,250,223,120,52,253,92,32,8,3,92,118,104,81,90,255,202,231,15,33,255,95,52,152,185,114,67,3,251,255,242,220,208,123,1,152,56,49,241,238,6,30,78,54,1,0,248,158,96,116,247,238,176,72,227,9,186,127,245,103,178,98,101,57,65,13,95,253,68,145,20,30,218,121,197,237,0,240,218,166,45,224,21,246,175,92,56,174,88,17,0,176,138,41,60,255,234,111,142,41,228,36,4,136,122,113,136,19,157,182,127,94,59,12,76,26,25,233,105,0,192,200,79,212,0,71,225,220,183,27,40,0,183,1,114,103,253,68,143,205,103,191,191,161,14,124,251,118,44,196,25,0,12,253,254,189,239,228,55,18,1,249,191,199,21,215,198,145,114,43,214,182,161,164,22,1,100,60,247,215,255,27,15,42,255,198,236,105,58,251,56,15,50,109,60,242,245,122,152,24,144,95,25,56,241,60,255,175,79,125,186,85,207,204,132,186,126,226,229,191,254,93,90,234,124,36,24,143,249,226,217,48,38,249,255,250,77,119,171,215,164,1,32,139,78,17,31,206,140,200,171,211,0,40,225,255,242,222,127,253,161,158,207,52,66,148,196,88,75,133,39,133,135,11,145,115,150,95,236,159,206,255,91,157,12,145,244,58,140,243,148,24,158,11,35,181,106,38,92,255,189,127,181,115,232,169,32,103,155,207,218,52,50,255,40,12,128,249,122,55,56,113,123,159,163,135,79,4,15,50,33,250,154,52,153,170,245,102,139,154,71,123,30,145,129,202,207,143,50,129,80,125,125,35,10,70,29,42,105,24,189,33,140,66,186,103,237,43,140,140,207,100,171,63,26,0,198,148,81,233,122,81,3,255,245,247,238,221,18,93,9,58,104,253,0,153,244,134,105,175,83,136,111,208,27,192,8,3,109,125,253,92,180,241,150,237,255,168,180,116,93,20,176,70,255,107,79,155,210,144,191,32,23,96,31,29,87,77,134,58,184,227,39,16,125,118,169,184,77,228,85,250,215,63,167,2,103,60,192,153,31,207,35,250,95,123,169,95,94,140,109,239,63,183,214,37,146,222,196,205,253,122,255,170,254,8,77,223,97,70,17,67,200,249,124,16,10,152,224,186,106,42,4,176,254,55,63,69,249,211,18,0,247,28,221,165,251,255,173,47,131,241,106,126,20,176,38,165,69,158,203,246,30,85,4,192,254,39,159,237,80,0,233,47,52,39,64,127,85,56,37,153,41,132,23,25,134,216,191,34,177,2,180,254,12,106,212,214,188,69,148,80,254,127,233,41,240,169, \ No newline at end of file diff --git a/screens/ms2/images/0.json b/screens/ms2/images/0.json new file mode 100644 index 0000000..f340923 --- /dev/null +++ b/screens/ms2/images/0.json @@ -0,0 +1 @@ +{"name": "0", "type": "bitmap", "format": "COMPRESSED_RGBA_ASTC_4x4_KHR", "astcCompressionSpeed": "thorough", "width": 244, "height": 244, "compressed": 1} \ No newline at end of file diff --git a/screens/ms2/images/0.meta b/screens/ms2/images/0.meta new file mode 100644 index 0000000..8ee46e3 --- /dev/null +++ b/screens/ms2/images/0.meta @@ -0,0 +1,5 @@ +{ + "converter": "Image", + "imageFormat": 37808, + "sourcePath": "D:/Projects/Embedded/AirsoftTracker/maps/home/tiles_ready/2/0/0.png.png" +} diff --git a/screens/ms2/images/0.raw b/screens/ms2/images/0.raw new file mode 100644 index 0000000..dbe336e Binary files /dev/null and b/screens/ms2/images/0.raw differ diff --git a/screens/ms2/images/0.rawh b/screens/ms2/images/0.rawh new file mode 100644 index 0000000..15f1c39 --- /dev/null +++ b/screens/ms2/images/0.rawh @@ -0,0 +1,62 @@ +/*('file properties: ', 'resolution ', 244, 'x', 244, 'format ', 'COMPRESSED_RGBA_ASTC_4x4_KHR', 'stride ', 976, ' total size ', 59536)*/ +222,173,6,9,0,192,247,58,161,175,64,210,34,240,0,0,83,8,2,145,125,221,16,0,0,64,0,65,9,92,33,11,67,232,61,208,171,83,205,239,159,107,142,26,9,219,224,145,83,200,9,13,0,0,173,155,44,3,242,139,125,72,8,0,34,204,9,13,0,0,166,189,30,37,245,255,221,42,128,173,81,10,137,4,180,116,203,148,35,208,158,154,29,228,157,233,66,74,202,146,225,206,147,31,63,180,145,48,254,5,247,221,34,80,72,147,157,88,168,0,0,0,197,28,150,22,231,197,83,200,9,9,0,0,32,44,71,150,143,168,13,34,10,0,82,72,14,99,35,23,190,120,207,249,7,2,106,248,244,63,67,4,79,114,212,168,34,158,178,18,154,184,74,226,40,172,35,200,9,13,0,0,240,6,90,209,174,14,85,6,189,81,82,240,30,193,126,219,126,111,3,0,160,89,141,250,207,0,66,136,14,43,99,30,182,75,120,62,223,133,186,74,11,9,67,104,38,195,84,159,176,174,124,175,100,219,31,225,184,154,66,208,94,25,0,128,255,119,199,7,135,34,159,23,139,0,82,240,158,234,125,223,210,43,0,0,32,105,194,76,253,0,67,144,32,172,158,174,238,109,214,59,83,32,140,119,128,5,83,2,123,210,40,55,86,144,228,128,138,71,88,158,36,102,82,80,43,21,0,64,41,43,237,116,25,90,147,136,34,0,83,200,9,9,0,0,0,150,107,143,153,145,8,12,9,0,65,106,49,112,112,114,43,142,103,17,238,153,54,52,31,100,82,72,28,112,162,153,232,131,70,170,198,168,220,137,252,162,67,80,81,17,0,128,255,189,58,111,41,69,71,17,119,0,83,200,9,13,0,0,47,170,22,3,21,31,244,234,11,0,83,2,175,193,74,51,254,81,84,127,4,33,114,24,36,163,82,72,0,144,175,186,38,108,44,50,234,68,100,247,82,121,222,17,21,195,211,215,239,79,119,7,0,0,246,145,140,132,19,144,19,99,141,87,218,2,0,0,24,231,149,47,121,233,65,170,3,176,112,118,91,62,207,164,215,162,83,52,91,16,67,168,3,131,130,86,55,252,190,175,162,213,152,67,172,90,83,200,9,13,0,192,197,11,119,3,141,224,204,35,7,0,82,80,81,25,0,96,151,49,73,235,142,56,57,141,33,0,67,2,215,104,197,224,142,145,5,89,175,179,27,95,138,203,83,2,47,193,198,50,61,197,114,74,179,1,112,151,34,17,65,202,9,13,0,128,137,139,15,36,186,219,153,5,22,0,83,200,9,13,0,0,167,186,52,7,45,18,103,125,7,0,82,4,123,126,249,201,49,153,206,73,51,230,37,246,247,16,67,136,97,176,201,227,229,182,151,63,71,119,228,240,35,10,66,80,195,129,93,64,138,245,146,189,118,8,155,144,15,0,66,208,8,67,211,50,87,97,158,193,64,32,219,149,39,0,67,2,235,66,102,226,75,103,56,143,174,141,245,51,132,241,83,2,45,185,71,55,111,122,160,171,134,146,112,204,49,1,66,136,168,193,147,150,251,110,171,29,0,129,13,94,253,0,83,72,11,5,20,8,7,143,86,3,191,241,130,39,5,0,83,2,47,185,6,59,132,137,22,144,80,247,90,117,71,131,83,2,177,186,234,62,202,152,140,100,77,68,170,110,146,255,35,112,107,33,103,93,1,0,224,218,107,153,178,167,117,43,67,80,81,17,0,112,185,247,174,109,168,190,41,149,25,0,67,2,89,102,125,86,143,76,95,184,2,179,231,190,19,127,51,4,103,48,6,93,147,8,77,138,14,1,108,4,240,67,67,80,209,26,0,0,220,157,179,78,96,38,56,227,97,0,34,16,21,161,42,239,149,179,243,2,0,0,104,130,20,49,82,4,239,246,118,169,83,34,217,68,182,145,173,95,60,151,83,168,135,161,167,169,79,118,148,90,234,194,85,41,7,154,222,17,21,35,154,245,109,123,213,1,0,0,70,244,241,0,51,144,16,195,163,135,109,85,29,0,0,102,74,221,159,177,83,40,55,140,233,118,91,140,225,197,91,185,93,155,177,242,67,72,136,97,201,234,219,193,141,240,81,9,91,235,245,240,66,104,187,9,172,162,213,199,243,31,0,129,31,111,221,0,67,200,9,13,0,0,56,166,180,245,131,221,110,189,118,0, +66,2,91,77,219,170,169,61,23,160,123,67,187,115,179,187,67,2,207,8,157,214,15,78,153,17,34,220,153,115,124,158,50,144,5,225,122,125,235,189,25,0,0,128,246,40,93,0,83,200,9,13,0,0,199,31,245,7,151,128,172,235,6,0,66,2,103,123,98,121,169,86,176,191,53,19,251,110,47,109,67,2,81,44,221,218,146,86,46,210,222,58,13,68,253,199,49,202,9,13,0,0,232,161,201,66,0,222,61,42,85,188,19,80,68,225,123,90,184,247,164,2,0,0,104,11,26,23,67,2,79,10,165,218,80,109,204,30,103,196,137,109,115,3,83,2,103,153,200,62,239,170,190,69,220,211,203,12,5,40,83,200,9,13,0,192,69,58,245,7,2,183,116,221,6,0,83,200,9,13,0,0,39,171,52,3,219,230,108,129,7,0,67,2,85,106,189,92,145,171,226,98,61,85,107,215,242,29,19,8,157,161,237,220,206,45,23,254,201,177,93,93,13,118,82,208,55,25,0,96,47,153,37,71,143,192,111,101,26,0,34,176,45,25,0,0,106,181,123,51,216,164,36,20,149,239,83,2,105,160,196,54,1,161,72,160,155,64,175,195,198,217,66,136,153,105,86,17,148,159,192,68,53,14,0,64,112,52,65,202,9,13,0,0,3,69,13,228,113,23,52,112,14,0,51,200,9,13,0,0,96,101,94,104,14,161,129,164,72,161,66,136,222,105,226,137,98,241,182,205,213,89,10,2,171,172,83,232,34,204,255,110,7,199,239,204,60,228,61,241,111,183,83,200,9,13,0,0,77,26,247,7,0,57,131,91,1,0,66,200,9,33,0,32,0,64,85,53,22,159,118,53,150,255,67,4,117,148,212,8,165,192,145,16,92,90,130,250,212,107,67,48,231,108,90,74,171,141,18,98,104,50,45,19,132,155,34,80,43,21,0,0,104,164,242,74,57,41,133,90,84,156,35,80,59,161,86,170,1,0,224,65,151,153,209,116,102,16,83,194,62,63,63,25,214,253,96,119,245,57,0,83,24,140,67,194,128,125,131,197,65,56,54,192,151,144,95,44,154,233,65,202,137,10,0,0,0,156,96,40,213,113,95,49,12,0,83,104,59,17,134,227,25,24,129,31,146,110,202,120,15,0,66,2,63,95,67,239,223,53,19,30,119,98,62,107,144,49,83,8,3,213,254,107,165,10,23,7,223,143,110,38,108,145,82,120,140,108,46,0,128,183,55,54,145,128,61,108,10,0,50,240,30,101,175,45,121,210,213,6,0,128,100,32,102,166,67,4,117,180,214,152,34,0,164,134,80,207,80,154,62,171,82,12,105,224,168,191,50,41,2,153,29,97,238,167,69,125,82,40,203,97,176,53,101,237,27,0,1,194,141,254,202,1,206,81,68,5,78,136,51,249,4,63,0,0,88,205,209,1,66,44,137,100,86,7,163,165,137,244,242,206,6,21,4,169,223,5,201,36,134,52,139,144,125,182,138,225,169,53,151,169,66,40,203,73,217,127,107,208,189,14,0,129,86,116,91,0,223,201,9,13,0,0,96,68,90,71,179,240,45,29,33,16,222,41,202,73,168,223,153,225,209,3,237,96,245,208,118,57,82,232,100,178,26,109,172,208,197,19,44,100,110,231,90,122,83,144,147,230,95,63,0,0,208,30,221,6,142,71,11,0,65,106,59,241,126,182,0,15,8,88,250,253,147,3,2,0,222,137,168,41,82,249,153,192,154,68,228,148,212,85,129,48,82,168,1,85,97,92,144,136,153,94,30,153,195,250,94,122,19,16,21,193,121,248,228,63,118,0,0,0,104,6,216,232,33,202,9,13,0,0,16,253,106,151,12,47,129,0,208,0,65,42,104,85,55,209,165,137,13,8,64,218,240,207,167,105,82,168,6,80,66,89,41,99,3,34,166,16,17,116,254,40,82,16,21,3,15,51,141,153,23,0,128,65,234,52,74,1,222,201,9,13,0,0,192,153,107,166,233,105,240,56,60,1,66,72,129,169,212,69,175,80,13,226,142,70,186,53,79,194,82,4,61,223,251,221,113,249,62,60,31,135,231,224,141,50,34,16,21,229,61,217,245,195,81,39,0,0,72,186,150,36,206,17,95,17,0,0,0,0,24,62,175,155,144,16,75,0,206,17,95,9,194,232,1,0,160,100,132,57,89,4,79,194, +206,13,2,163,177,230,235,0,0,64,0,15,247,21,15,218,67,240,100,193,168,199,189,243,0,0,26,17,100,112,2,3,66,20,21,160,88,183,242,149,144,178,157,183,222,242,15,128,83,200,85,181,150,178,175,42,123,6,112,71,178,46,230,54,83,80,131,202,222,127,86,253,123,142,232,237,93,66,144,225,81,202,9,44,107,45,247,214,83,242,96,217,124,92,169,6,83,144,254,106,143,40,183,238,159,138,129,2,198,8,194,4,66,234,187,132,173,220,176,133,55,46,1,240,71,152,51,61,83,72,0,227,194,87,109,106,119,135,121,30,105,65,42,24,66,172,131,100,226,40,101,165,1,37,160,32,248,149,173,47,67,72,14,112,249,182,253,56,24,61,20,201,97,185,67,73,67,232,40,208,194,215,109,188,92,118,6,32,239,186,226,235,65,234,99,236,105,255,233,220,119,129,0,81,232,194,162,223,82,4,57,154,153,158,81,74,220,213,194,49,111,66,59,151,82,2,185,170,15,174,219,112,133,211,138,72,125,239,245,173,67,168,96,245,188,183,247,242,227,214,128,191,238,122,51,0,33,138,179,225,177,243,110,138,46,157,80,93,150,11,96,109,83,136,5,236,253,125,87,247,125,165,36,241,18,218,45,237,83,232,59,204,251,122,85,239,125,109,246,223,64,33,116,209,67,208,172,138,206,106,27,132,241,97,98,88,177,177,193,129,83,2,183,217,137,43,105,53,255,251,112,145,27,71,128,200,50,236,23,227,248,96,155,253,160,175,118,19,225,183,219,219,65,106,5,236,237,83,159,242,227,208,66,105,204,224,5,4,67,196,84,247,29,41,253,47,184,2,92,184,54,10,87,104,65,10,2,44,57,206,191,175,154,37,177,90,48,161,202,0,67,4,155,154,218,224,182,15,168,223,90,190,203,222,191,46,65,10,26,131,71,107,13,149,19,66,246,96,6,55,154,16,83,200,7,99,144,161,235,222,253,134,45,40,219,240,37,62,223,5,199,198,156,94,139,4,212,183,100,179,109,66,251,139,223,5,69,162,116,198,138,36,45,144,148,216,82,246,15,59,67,8,29,245,255,181,176,248,146,222,0,47,225,195,22,47,82,4,111,235,162,155,243,250,22,151,23,128,84,14,232,75,82,72,24,240,141,120,100,75,193,21,198,196,18,112,128,4,205,7,171,44,242,70,144,228,181,22,247,250,82,102,39,1,66,240,15,99,163,216,115,173,154,247,222,160,212,124,34,7,33,6,159,189,218,148,159,39,36,32,219,24,161,217,71,5,66,236,180,68,90,57,233,165,242,173,160,113,248,42,165,106,67,104,38,240,10,35,78,15,127,43,84,114,64,11,203,105,82,4,31,188,105,141,243,60,133,47,154,209,228,219,3,9,67,216,231,196,90,243,63,109,223,7,2,104,104,218,50,108,67,2,109,229,110,244,11,118,32,20,253,177,78,245,116,230,83,104,133,1,7,41,141,135,169,17,188,14,123,143,243,19,83,2,55,218,170,55,198,75,224,109,31,209,157,236,210,30,83,2,117,211,111,83,224,86,210,183,103,191,243,126,70,85,67,2,119,136,143,246,78,145,119,134,9,163,194,26,128,211,82,2,115,212,220,94,125,8,24,141,228,187,116,115,234,134,83,2,243,185,233,62,165,236,148,123,145,227,103,112,118,178,67,2,193,38,132,206,78,12,138,184,25,214,189,53,108,109,34,236,5,245,223,46,245,234,183,35,38,218,162,15,218,80,82,36,157,155,157,122,50,2,195,70,72,36,18,196,168,152,82,4,19,55,255,249,51,44,209,253,116,57,85,62,129,105,82,36,253,155,87,250,20,134,75,145,27,237,88,229,118,13,83,136,60,181,214,235,205,58,245,7,120,108,232,245,214,237,67,2,99,10,190,98,78,255,21,221,46,92,58,219,231,228,83,2,179,208,101,55,255,81,248,47,69,207,66,94,33,214,65,10,35,236,186,111,134,52,39,35,3,139,0,19,223,248,83,2,113,193,7,59,165,142,231,74,109,80,151,166,48,106,67,2,231,146,62,111,86,244,49,122,15,230,106,19,212,148,67,2,237,205,230,110,81,207,137,173,45,62,247,124,148,115,67,72,79,227,163,151,236,223,242,111,164,128,38,187,222,219,67,2,87,102,149,214,145,206,70,197,132,32,49,130,68,24, +67,2,219,108,229,90,147,111,204,143,246,246,106,213,171,4,67,2,211,14,245,218,82,152,205,196,173,235,251,28,230,239,83,8,27,108,179,229,243,103,79,86,219,219,224,181,145,20,67,34,33,24,130,51,91,117,183,150,123,124,65,83,247,222,82,34,229,109,104,137,31,209,165,131,139,187,229,114,234,173,82,34,37,73,40,161,29,165,58,106,6,198,188,223,243,206,66,2,223,249,222,124,167,57,180,219,127,219,123,179,153,48,34,42,14,163,211,166,253,175,191,128,141,179,243,115,19,211,67,2,85,145,245,222,146,95,235,188,98,95,223,239,122,7,82,2,51,212,28,63,245,216,204,203,14,210,248,248,124,159,83,2,235,169,232,62,112,172,85,247,158,101,157,178,214,143,82,232,23,75,218,68,98,247,167,239,23,186,17,99,171,107,83,2,173,168,199,62,140,174,9,199,92,106,174,85,119,233,66,2,213,133,100,210,111,59,221,3,253,138,23,8,11,192,82,2,51,224,11,53,235,8,128,14,83,115,98,42,79,133,66,2,221,5,104,82,109,90,85,181,85,43,245,6,211,72,50,40,129,169,209,22,107,34,22,172,222,136,196,183,13,51,66,36,57,248,119,110,117,0,91,245,80,85,90,87,123,17,81,8,87,149,247,107,226,113,6,230,175,162,87,191,27,229,66,2,61,180,77,36,245,60,151,150,230,217,102,249,80,147,66,200,3,245,243,172,101,199,111,121,228,80,240,243,252,252,82,4,31,164,235,137,17,33,137,6,147,128,36,153,169,220,81,168,34,178,211,76,11,145,209,134,109,114,133,242,123,127,67,48,57,204,223,63,215,127,221,175,143,79,26,98,10,212,221,75,156,225,206,173,83,157,146,61,5,153,63,21,169,5,66,2,63,235,71,185,223,29,25,185,17,59,158,175,190,14,67,2,223,206,5,97,142,238,218,242,238,213,74,253,59,7,67,194,136,135,141,187,65,55,38,189,13,25,212,82,12,183,83,194,206,206,75,155,125,51,137,132,181,80,201,57,199,107,67,194,118,115,121,145,65,76,19,187,125,90,107,143,175,212,67,194,124,121,127,217,65,253,71,53,250,113,253,31,49,61,67,194,128,127,131,191,129,17,186,166,60,186,255,131,187,45,82,8,87,108,252,228,116,52,30,29,73,104,97,154,146,183,67,34,59,185,139,61,91,24,38,135,62,138,239,182,191,153,83,136,31,172,124,84,135,44,75,12,192,162,212,115,133,196,83,2,51,195,14,67,101,181,14,195,222,208,214,229,41,79,82,34,173,105,59,169,39,165,26,21,3,190,158,21,245,155,67,2,231,8,174,224,143,221,186,122,235,63,186,23,92,213,82,4,59,172,241,139,19,164,121,0,161,48,128,82,35,136,82,4,119,124,241,137,83,35,128,165,53,134,223,242,241,250,66,140,231,4,218,246,32,166,34,247,36,87,104,250,109,40,205,7,143,58,86,134,97,77,36,3,36,175,25,100,186,145,66,44,202,4,86,7,99,165,254,47,213,253,255,214,32,85,65,140,231,161,174,218,104,108,106,186,199,32,241,19,194,170,82,236,119,224,235,167,145,201,41,230,227,33,148,62,10,66,66,44,130,132,98,73,39,165,10,168,93,128,40,251,136,85,51,40,14,235,22,142,190,53,170,237,250,41,111,36,36,10,82,2,187,164,72,130,89,88,62,174,77,78,57,112,221,173,205,7,135,90,63,148,1,146,248,28,202,203,72,145,209,100,35,40,129,161,65,69,40,78,68,70,48,6,212,219,134,225,35,72,169,33,68,75,41,246,33,211,39,14,200,165,94,212,82,4,25,226,99,78,179,24,188,206,128,112,37,18,53,25,82,40,17,240,29,202,218,130,80,70,39,165,25,195,100,136,67,232,14,50,226,5,50,208,139,0,13,52,100,223,158,182,67,168,48,240,146,182,70,255,189,126,6,101,216,222,233,34,82,168,8,181,125,218,240,188,182,63,28,40,97,27,131,5,82,232,4,146,116,50,193,6,250,175,211,101,228,175,77,201,223,5,193,50,44,209,142,195,16,116,241,4,99,1,128,8,81,76,6,18,147,205,146,98,160,8,83,137,112,88,79,18,175,17,95,233,61,185,1,0,0,66,8,221,28,16,51,148,175,241,18,17,0,0,220,218,189,182,253,43,160,64,152,20, +81,176,123,21,0,192,39,171,54,57,189,6,164,184,49,32,82,48,117,17,0,192,85,219,254,122,147,122,103,71,206,102,223,5,219,102,157,222,140,235,254,19,125,74,128,174,12,67,49,6,103,183,53,235,34,56,200,164,205,89,196,109,179,253,67,196,84,214,37,41,177,144,222,208,10,85,0,144,29,33,67,4,113,146,210,8,165,211,16,29,198,21,19,115,162,53,82,2,167,236,24,150,88,225,124,131,90,102,21,72,229,65,67,48,119,236,158,46,93,102,151,154,5,69,214,192,238,166,66,44,234,18,70,122,35,38,160,255,138,173,47,10,15,88,83,8,16,213,125,43,206,139,78,7,164,133,103,152,111,247,67,72,75,176,176,230,123,151,62,174,6,0,170,245,6,95,67,48,221,230,94,61,237,148,217,98,10,4,37,153,21,252,83,40,163,33,5,231,76,69,135,15,173,50,35,5,15,72,83,104,204,129,69,41,47,44,173,13,52,129,181,118,38,210,83,2,115,160,133,46,231,167,223,174,46,223,74,177,160,146,67,40,0,195,198,86,241,174,175,243,100,200,234,28,241,32,82,4,29,195,35,143,17,154,105,72,65,82,41,74,37,81,83,136,3,99,155,246,125,239,215,131,39,70,183,212,15,168,82,136,85,245,107,119,227,68,223,178,26,8,19,100,109,236,67,200,54,245,187,127,171,122,212,27,147,5,64,149,246,6,67,136,14,195,20,151,182,252,252,127,163,21,238,61,240,229,67,8,43,195,164,159,182,204,247,166,160,29,171,53,116,117,83,194,98,95,99,124,46,81,87,77,44,228,107,41,161,136,67,8,83,208,195,23,111,190,22,113,70,190,235,134,22,220,67,200,3,149,224,118,159,172,183,219,2,64,76,187,231,59,82,4,61,237,113,94,83,65,252,215,83,186,246,42,126,223,66,140,159,196,205,7,95,166,162,230,6,213,112,169,159,153,65,10,3,117,119,19,5,39,13,168,157,83,199,164,61,192,223,41,137,193,18,122,232,27,41,173,185,80,204,252,212,159,49,42,84,195,9,88,96,179,22,75,136,53,25,23,244,48,65,42,75,236,168,171,235,31,119,57,208,145,246,245,64,185,83,40,41,245,190,111,142,142,122,6,107,245,94,141,49,8,206,89,73,236,204,9,110,111,181,158,215,175,39,110,73,75,65,10,43,131,163,135,171,180,23,2,32,25,5,25,52,107,83,40,183,193,36,199,12,3,13,19,123,217,25,76,2,30,67,200,95,240,249,59,223,143,26,186,14,144,209,229,6,157,67,176,61,236,221,171,110,207,123,115,19,147,151,7,210,64,82,72,128,225,241,183,237,15,86,157,22,197,118,95,140,16,83,232,201,33,39,77,53,41,73,15,129,7,253,221,183,47,82,24,250,4,98,7,219,126,16,86,32,72,146,131,236,252,66,106,134,132,108,140,180,129,22,59,6,178,170,226,175,142,67,40,75,163,164,199,174,126,30,165,34,252,240,158,94,2,81,42,142,196,179,226,42,54,32,25,216,69,121,39,157,55,67,196,198,210,68,73,182,251,183,16,82,183,188,252,212,66,83,72,74,227,169,151,103,75,245,130,249,186,65,15,242,162,83,40,74,172,221,236,251,125,221,20,132,125,227,177,253,195,82,4,51,39,123,185,53,57,1,238,111,177,245,234,63,87,33,138,13,53,205,87,116,177,68,231,31,173,155,139,251,143,82,36,169,148,166,100,177,174,236,251,255,35,113,54,247,61,67,200,17,99,255,235,30,167,46,167,34,108,103,184,210,153,81,74,202,228,127,124,191,126,33,220,27,141,48,133,32,182,83,104,5,117,238,169,143,175,54,7,2,111,45,168,197,139,67,2,73,102,172,82,139,154,150,40,68,40,32,224,81,16,83,2,239,176,198,46,140,216,192,41,196,211,123,219,247,25,83,2,49,178,235,50,205,2,208,91,214,122,172,137,160,169,83,104,5,213,254,239,173,139,78,7,21,204,201,198,242,194,67,2,231,166,142,238,14,254,64,89,43,56,41,181,242,221,65,138,19,172,89,215,247,219,165,193,184,213,120,185,32,184,65,138,25,44,77,243,114,143,98,105,89,174,215,75,40,143,83,104,38,44,147,92,215,121,30,149,238,235,215,24,144,175,66,232,240,161,231,140,255,71,60,162,85,93,88,1,199,95, +50,104,6,11,53,51,98,234,220,231,111,3,24,26,219,121,67,2,231,44,198,226,143,164,158,201,168,255,68,134,123,0,67,34,39,89,146,53,27,196,23,90,98,125,107,179,61,189,82,34,29,111,102,137,165,196,110,248,77,246,178,179,229,219,67,34,143,215,120,23,87,117,225,81,175,239,24,183,170,150,67,34,33,216,169,51,156,231,137,61,28,164,195,222,123,228,82,36,181,83,93,108,50,41,93,239,0,166,86,244,190,95,66,2,215,108,90,242,229,28,234,221,61,123,147,123,227,112,67,2,81,236,220,214,82,102,190,58,226,82,92,29,216,166,83,2,107,160,197,58,1,0,70,0,238,0,166,9,204,154,67,168,1,149,231,46,144,75,89,60,18,239,234,190,221,152,82,2,63,224,30,57,107,229,6,208,1,166,72,176,24,174,82,2,191,162,30,29,243,80,178,213,151,248,150,211,114,58,66,2,73,177,89,164,243,58,98,250,36,218,170,204,174,66,206,137,25,75,55,115,230,46,248,156,175,89,135,127,205,59,66,232,133,193,102,143,236,239,180,213,149,81,45,54,224,0,189,39,61,45,117,109,246,0,205,167,87,177,235,33,219,126,82,104,11,48,154,120,232,115,231,37,42,5,32,69,3,128,65,2,115,104,166,144,50,33,1,200,218,88,112,209,199,235,66,144,9,204,62,103,59,167,78,198,186,19,76,89,243,220,67,8,62,240,188,255,109,159,126,61,22,208,26,39,110,19,67,2,233,115,54,97,144,236,86,18,59,226,201,33,39,27,83,232,19,108,183,182,251,235,202,52,253,211,92,246,77,32,65,234,187,132,153,21,135,191,107,6,232,217,152,139,161,92,67,194,154,149,137,175,1,131,159,102,152,124,243,83,60,100,65,234,198,146,171,197,186,167,90,120,31,180,118,13,131,153,83,194,202,207,202,21,37,169,46,70,241,24,168,110,172,9,83,194,78,211,206,159,75,217,56,66,13,45,61,111,162,67,83,194,198,203,71,93,209,135,171,129,15,116,104,55,108,237,83,194,66,194,63,155,193,31,201,36,112,52,120,7,124,75,83,194,74,74,199,29,189,212,57,86,191,48,157,18,189,20,65,138,229,164,231,228,110,187,98,114,253,71,236,131,48,179,82,34,241,45,187,193,191,208,95,237,232,65,167,158,76,255,83,194,194,66,191,149,192,143,102,81,111,70,185,234,61,209,83,40,142,82,22,182,214,221,207,15,137,0,48,32,43,245,67,194,88,87,97,217,129,69,71,62,255,127,198,250,222,53,66,2,215,103,214,53,167,87,191,57,221,221,94,55,144,122,67,194,110,107,119,193,129,13,165,222,125,51,146,202,24,1,81,2,79,57,73,47,93,75,129,156,57,55,95,177,147,203,83,194,190,67,187,155,209,89,224,172,213,39,24,75,82,183,82,34,29,81,54,6,205,248,148,128,23,236,149,93,54,82,83,194,58,186,54,23,198,9,236,20,130,206,152,52,117,40,83,8,29,236,247,252,149,36,185,109,251,219,110,74,122,16,66,172,136,18,99,172,37,37,5,162,245,255,38,218,71,6,66,2,191,215,62,171,219,83,224,192,58,74,157,239,14,54,223,137,31,227,213,224,46,253,216,181,173,137,221,57,238,107,82,140,95,160,219,183,17,32,96,159,57,138,39,68,183,23,82,236,126,224,174,109,51,35,141,246,161,250,4,186,249,121,82,4,143,254,244,185,181,42,93,87,1,228,220,96,159,148,82,4,179,46,183,169,241,232,87,237,123,19,232,233,43,48,67,104,5,112,232,21,235,190,86,118,134,181,191,76,115,0,33,6,31,58,249,148,130,104,228,139,70,108,246,205,198,97,205,7,11,106,213,134,180,190,40,89,158,64,198,14,8,172,35,232,132,9,205,242,199,139,199,135,55,28,168,156,109,112,67,168,7,240,162,150,78,63,124,125,6,104,64,112,253,210,67,40,124,242,200,82,5,113,136,27,78,51,141,88,147,99,82,2,53,100,207,141,81,177,142,84,195,176,250,189,126,78,67,2,77,6,181,56,140,100,6,68,13,10,5,136,204,40,66,8,191,193,246,206,180,255,146,143,247,20,138,88,9,223,95,113,17,25,0,0,158,156,243,142,136,242,34,68,105,219,205,139,3,99,145,55,238,53,0,0,64,160,194,129,22,84, +82,152,133,244,221,157,189,155,0,0,32,197,241,67,205,1,65,10,2,131,135,139,13,0,0,233,1,13,96,36,208,7,83,72,26,245,156,30,12,157,54,3,32,7,198,240,162,181,67,2,221,177,29,225,21,3,17,49,24,35,42,220,9,60,66,208,31,172,170,101,47,237,223,254,187,27,30,238,252,140,82,8,29,16,182,40,167,75,161,17,166,120,113,236,242,101,83,240,137,236,183,255,221,238,159,163,175,208,151,55,75,11,83,40,137,1,5,233,76,103,135,13,134,12,244,74,195,175,67,4,189,178,242,88,195,38,108,155,110,25,174,108,195,254,67,136,3,112,168,34,237,182,124,126,84,88,73,111,151,229,205,7,15,127,214,148,210,96,203,239,68,164,126,212,34,71,81,16,95,205,12,27,71,101,5,197,6,13,70,207,2,64,82,136,5,80,25,198,222,154,71,166,24,161,159,117,106,20,67,40,2,227,99,151,174,183,60,125,98,45,178,147,248,237,82,200,66,67,167,149,249,56,68,187,25,178,130,60,147,98,67,2,223,227,85,90,141,0,119,0,141,19,231,60,110,243,82,168,48,48,162,152,166,75,162,21,199,216,192,103,119,196,66,2,97,157,251,220,116,87,42,74,101,142,167,225,109,14,66,16,4,204,245,54,254,231,138,246,182,5,39,15,117,96,65,106,43,108,79,110,163,84,167,226,127,180,10,52,20,223,65,42,124,112,248,20,115,46,213,80,202,144,251,165,116,113,65,42,3,99,97,37,45,117,19,130,233,216,141,2,45,150,67,2,221,227,109,102,11,143,116,1,45,5,101,91,144,169,82,4,121,194,227,76,181,108,13,214,101,240,36,128,149,136,82,2,187,180,30,251,83,137,248,128,79,108,39,23,192,210,82,72,101,16,146,120,28,187,206,198,203,196,135,246,134,31,82,168,3,117,223,183,207,69,215,182,14,160,236,209,149,31,67,196,204,211,84,9,108,31,208,159,88,185,105,108,64,104,67,2,233,101,158,108,12,26,69,196,85,106,7,10,235,16,67,72,0,245,123,239,242,216,151,215,130,10,130,45,84,85,82,136,94,149,247,95,158,204,219,228,2,113,224,36,54,248,83,2,175,193,40,55,118,123,117,111,67,191,25,180,34,24,83,2,45,184,4,47,88,101,143,153,180,0,225,141,128,120,82,72,202,193,8,39,103,158,52,45,8,57,184,77,41,186,83,2,39,146,174,46,103,158,244,222,202,255,22,94,178,64,51,4,47,2,124,192,138,191,76,1,168,162,82,58,171,74,81,48,69,108,85,89,94,52,195,248,60,211,154,239,74,1,223,9,137,65,45,37,155,174,142,190,58,49,42,32,187,188,83,200,7,236,187,100,15,127,157,173,127,147,37,128,5,55,67,2,223,171,181,94,79,71,174,215,174,93,91,181,19,168,67,80,167,166,86,155,105,189,18,90,10,58,208,174,185,220,67,2,213,41,205,216,11,110,251,56,143,104,235,0,98,9,82,4,207,55,127,249,49,250,135,159,188,196,118,46,183,139,66,74,169,178,174,165,49,21,183,51,219,145,141,46,153,10,82,76,103,224,218,254,80,105,114,224,147,209,228,217,131,186,67,4,219,248,22,41,188,150,239,212,155,0,202,255,149,253,82,2,147,238,70,242,114,9,136,50,0,142,251,189,75,253,83,168,7,44,147,221,247,125,237,150,159,210,38,214,9,17,82,200,66,112,30,169,236,155,107,54,186,164,91,93,56,129,67,2,87,76,221,220,79,242,11,209,9,190,104,233,25,198,67,2,207,233,188,88,80,187,137,247,31,158,233,108,80,228,206,241,94,236,60,211,23,219,198,223,52,83,30,81,247,113,67,194,66,69,89,121,1,109,216,129,50,94,163,187,67,206,67,2,87,71,149,220,141,51,252,165,73,125,229,192,110,67,82,8,29,213,117,254,241,176,71,237,30,224,200,63,255,174,67,2,107,7,150,100,13,251,119,95,14,147,223,108,5,40,67,2,213,38,157,84,12,0,227,74,144,98,203,164,38,238,83,2,99,136,133,54,130,233,234,67,189,102,221,3,220,153,83,40,252,161,167,171,111,71,73,11,221,140,22,150,49,19,67,2,83,72,173,84,76,188,3,170,112,167,64,218,154,26,82,104,38,117,95,82,211,176,86,245,15,132,207,7,228,217, +65,42,31,204,113,255,153,146,51,43,135,103,229,94,237,239,66,2,75,251,79,251,163,55,222,125,201,153,13,186,224,49,67,2,221,177,21,93,20,203,161,214,223,238,157,57,158,117,82,2,99,253,232,23,231,196,236,143,19,61,16,227,0,239,67,2,227,13,230,98,17,241,121,88,239,230,221,195,174,181,67,2,99,15,246,224,82,221,155,247,234,181,202,117,188,181,66,2,211,119,215,255,229,57,104,123,110,48,147,137,55,237,67,2,85,34,101,216,15,246,207,138,227,142,164,243,116,158,82,2,43,206,202,49,243,128,97,88,178,52,85,163,53,154,83,2,171,160,165,58,103,55,115,207,158,238,156,3,88,191,82,2,117,4,94,89,243,224,1,254,232,228,113,201,126,24,82,36,31,126,51,38,68,2,97,13,0,48,8,192,1,0,66,136,231,225,161,207,232,159,195,78,233,22,240,97,45,117,66,2,89,144,233,150,41,62,209,3,145,249,153,153,153,85,50,80,23,204,241,87,221,187,45,248,174,25,208,26,232,201,207,9,163,233,118,205,211,113,16,17,151,87,226,225,219,181,82,104,11,227,67,30,191,57,214,119,23,2,148,154,234,249,65,234,99,172,42,111,243,186,102,69,32,209,165,168,62,129,67,72,0,99,96,131,26,222,241,111,35,211,5,35,58,197,82,2,155,148,7,23,107,5,160,158,199,48,103,224,39,83,66,176,68,172,175,61,239,165,236,115,43,11,39,14,135,51,67,8,87,181,239,37,156,101,172,229,129,119,253,184,227,209,67,8,35,236,92,22,227,229,113,248,28,129,181,192,239,31,207,201,144,201,107,182,116,183,143,109,249,83,193,9,156,253,67,34,93,58,141,73,24,221,70,179,95,66,138,32,95,114,67,34,213,251,148,71,24,8,54,165,223,63,254,211,253,215,66,2,39,75,54,167,161,23,217,93,170,191,130,222,0,104,67,168,46,172,187,213,210,189,91,108,28,134,229,38,94,62,83,194,186,62,199,87,57,150,238,83,169,176,230,143,211,24,66,2,63,222,67,177,229,62,0,150,194,232,30,206,145,67,66,138,159,164,44,181,234,133,84,251,6,144,237,84,219,200,83,72,26,44,157,45,197,251,62,21,239,161,252,182,43,27,67,2,221,179,53,91,80,186,98,173,31,184,242,4,62,120,67,2,95,244,61,101,82,11,48,216,154,208,168,253,111,150,82,34,177,43,124,205,175,184,85,152,53,245,117,35,96,183,67,194,104,103,113,175,65,220,201,19,51,110,136,53,162,30,83,194,62,190,58,155,144,238,193,73,58,145,185,82,74,43,67,2,99,20,62,101,85,187,29,142,254,216,221,11,251,115,66,2,71,235,203,119,159,88,219,59,85,83,16,225,202,82,67,194,132,129,139,117,65,191,139,189,239,126,159,161,177,79,82,34,57,105,61,229,39,69,102,13,157,93,80,184,163,216,83,194,78,78,203,89,115,251,180,94,3,231,182,252,170,90,66,2,79,223,211,47,163,53,91,9,119,221,51,147,91,225,83,194,74,74,199,77,94,147,90,24,26,213,231,187,115,31,82,40,17,163,161,23,178,124,93,249,21,66,231,112,24,105,67,196,190,16,100,73,34,4,122,86,146,210,90,96,169,48,83,104,55,204,255,119,247,60,79,149,192,108,183,104,198,181,67,136,5,117,222,115,171,191,123,197,131,65,215,51,206,34,83,8,129,137,150,214,92,73,77,11,252,223,206,159,233,27,67,168,3,176,169,166,253,62,63,58,14,19,236,28,49,243,82,200,17,75,109,244,202,166,60,229,11,34,34,3,94,251,67,136,100,181,111,125,142,103,185,229,64,38,227,165,118,119,67,40,2,195,86,78,59,126,157,165,162,25,108,41,159,11,67,4,187,216,22,105,23,0,64,139,154,80,191,172,187,219,67,136,14,112,187,117,245,166,79,59,87,188,5,212,5,223,223,9,3,53,93,199,148,78,226,232,189,240,87,187,21,2,82,4,207,54,181,185,85,163,76,169,53,200,152,226,157,140,67,104,5,99,249,251,107,167,172,119,163,90,26,128,116,213,34,48,6,109,191,133,183,241,110,23,159,185,10,247,139,159,95,17,95,73,74,152,1,0,160,3,111,118,91,27,6,93,175,177,14,163,145,152,220,2,0,128,56,225,149,144,34,33, +83,8,2,49,85,221,23,0,0,64,68,145,17,88,144,16,83,240,129,26,0,0,222,252,253,130,65,0,10,55,96,30,83,232,254,161,67,69,141,169,169,15,155,212,136,160,4,137,83,232,20,245,253,79,36,168,62,3,225,232,187,59,96,252,81,170,20,12,194,57,147,106,25,179,72,54,67,80,197,210,67,104,74,112,178,102,125,174,94,170,134,170,200,206,139,34,83,2,231,152,197,50,209,91,227,173,87,210,7,11,64,122,51,4,23,205,249,44,145,10,157,200,176,34,3,187,162,208,67,196,72,116,253,40,165,132,202,84,138,176,79,111,162,249,81,48,6,18,45,239,75,174,174,203,6,103,3,234,9,180,67,2,179,0,84,62,11,121,19,172,210,194,150,252,38,234,82,4,113,75,225,95,53,107,238,38,195,209,25,36,6,200,82,16,61,108,181,246,97,132,86,78,43,41,69,85,202,46,82,4,89,219,233,159,113,47,84,66,152,1,96,201,59,115,83,136,31,245,222,47,79,142,89,3,0,153,146,190,57,68,83,2,45,185,70,51,171,57,116,207,230,233,22,168,156,246,67,136,50,213,252,231,167,152,215,223,64,148,11,31,82,0,83,40,137,1,37,231,12,197,6,13,242,253,89,233,0,18,82,2,119,228,93,157,219,72,100,192,58,166,159,156,163,41,223,5,173,197,147,64,76,177,8,88,0,152,144,249,79,244,67,104,38,195,18,151,119,236,190,46,164,25,14,104,80,146,83,200,3,245,255,218,35,58,119,6,213,74,183,145,36,17,82,76,202,132,191,111,81,38,46,63,246,22,160,153,1,0,83,104,38,245,212,235,171,139,20,3,4,107,230,175,60,129,83,2,243,200,70,51,187,112,176,2,100,3,217,230,213,28,83,176,182,204,79,255,190,111,119,167,3,65,233,208,183,67,83,2,173,192,101,51,233,238,48,130,103,221,75,16,29,21,67,2,95,34,94,234,139,147,165,36,156,132,241,50,197,104,67,136,3,131,19,158,127,204,255,174,33,159,77,3,40,98,83,136,19,163,155,181,123,122,253,130,187,181,26,47,141,193,83,40,2,195,163,87,103,106,119,135,17,60,227,11,184,87,65,202,129,50,88,4,122,103,86,184,173,239,97,29,148,210,67,16,183,102,53,198,173,165,17,94,10,183,39,105,2,224,83,2,111,178,237,66,41,112,216,131,86,119,100,189,254,172,65,138,19,99,105,107,209,112,21,58,171,82,90,48,191,136,67,8,3,213,125,173,111,178,162,245,68,178,193,119,152,40,83,8,154,105,39,22,149,224,102,17,43,48,149,81,47,32,67,4,113,238,24,25,115,62,35,36,26,120,159,99,142,25,66,4,211,247,237,204,122,143,103,187,16,155,185,155,187,9,67,104,13,163,116,231,236,207,174,99,32,55,166,83,49,211,66,200,145,137,109,164,231,97,57,229,110,29,54,47,11,1,67,4,153,182,244,216,252,235,247,127,165,7,244,188,156,218,66,200,145,161,117,245,44,175,98,157,58,31,88,58,220,247,67,104,52,181,174,53,157,183,184,229,0,11,106,9,16,152,83,2,177,184,229,50,28,240,6,144,253,200,172,36,87,239,82,4,81,91,27,221,49,158,91,153,218,249,2,44,129,98,67,2,85,100,101,92,79,52,67,159,13,16,230,232,72,233,82,168,0,208,161,151,102,84,132,153,216,128,42,57,197,180,65,74,8,99,99,69,13,81,21,10,57,90,227,87,116,177,82,2,171,208,91,54,121,41,3,102,35,210,8,27,169,30,83,2,43,178,8,59,31,121,205,139,116,82,89,99,141,83,82,240,247,106,219,115,229,55,255,61,43,210,139,196,74,119,67,2,205,201,172,86,16,111,201,15,92,118,177,214,106,247,83,2,55,210,73,47,231,236,27,156,245,77,83,152,90,118,67,104,114,213,240,103,108,166,182,251,1,181,122,15,8,107,82,144,5,165,12,25,54,116,18,49,119,2,153,115,242,30,67,2,229,67,110,102,143,68,31,113,74,232,31,132,4,168,66,232,133,225,147,143,175,255,27,55,237,89,107,85,214,6,35,232,63,241,152,25,90,31,121,25,186,158,46,191,101,222,66,2,191,91,183,47,215,52,233,124,187,128,119,115,59,255,83,194,182,51,42,137,185,36,149,215,140,64,143,254,162,159, +83,194,178,46,43,93,32,173,229,243,156,55,199,57,198,244,67,194,150,157,169,175,129,131,106,28,183,230,41,185,104,140,67,194,150,155,167,111,1,111,157,111,114,126,16,181,249,227,66,2,191,228,67,180,223,28,221,249,221,61,145,221,3,211,82,2,155,252,197,187,236,100,136,5,155,182,251,46,11,213,67,40,31,181,106,101,49,147,142,38,19,16,146,247,241,219,83,40,17,236,124,30,151,235,188,142,36,130,137,203,22,218,223,3,131,151,116,175,122,17,113,230,217,243,236,181,192,158,67,136,101,213,245,119,173,180,116,245,1,160,99,118,147,242,67,2,89,109,229,90,146,122,126,110,191,119,125,33,162,156,66,2,71,193,207,224,99,30,121,119,56,119,170,49,169,5,82,2,175,206,28,94,123,132,114,132,251,33,109,186,86,149,83,72,128,1,5,7,237,2,71,13,178,168,112,35,21,230,67,2,79,200,148,80,14,191,79,68,241,120,229,116,33,55,67,72,105,176,202,227,253,44,92,57,14,247,190,102,86,0,67,4,51,114,212,104,78,175,178,220,155,156,154,38,0,111,83,2,121,210,43,55,115,103,176,231,200,119,199,114,119,15,82,2,215,232,86,245,106,128,73,104,163,49,115,35,197,165,83,232,5,140,239,188,181,227,76,228,95,242,149,235,79,2,67,194,166,155,133,49,129,77,216,91,227,245,15,217,198,172,67,2,245,196,102,224,76,92,14,217,50,239,77,121,230,158,65,42,9,236,62,110,113,207,179,98,137,118,188,147,198,6,82,136,14,146,246,200,29,135,254,105,151,33,154,73,98,222,81,112,65,50,27,217,248,208,190,156,178,208,92,0,97,112,66,2,39,191,55,231,221,87,211,219,213,219,94,157,2,146,67,104,55,172,155,157,226,197,95,110,29,124,184,102,30,77,67,72,32,242,70,207,188,255,155,52,3,91,85,224,169,254,81,2,159,95,145,71,119,39,1,108,237,249,174,223,216,223,82,34,179,199,47,197,53,169,104,99,143,237,21,99,47,174,82,2,95,254,200,91,99,9,179,11,166,53,74,35,162,195,82,2,155,215,56,91,117,177,225,78,212,145,208,33,32,155,67,2,93,142,245,210,139,9,164,182,237,215,59,157,110,204,82,2,175,218,220,247,89,73,124,164,200,227,149,9,3,139,83,232,79,108,181,55,227,125,107,93,46,71,51,30,106,2,66,2,87,243,222,249,115,31,21,4,13,16,195,236,49,126,66,2,67,123,71,189,29,31,4,128,129,204,173,76,251,29,67,2,221,173,221,96,12,92,67,212,1,210,133,198,145,50,66,2,75,99,207,49,225,27,25,17,158,185,101,113,19,14,67,40,14,235,218,127,122,235,56,47,160,13,232,72,80,165,66,2,75,235,207,121,161,90,74,177,3,189,187,119,247,119,83,200,31,236,118,159,213,108,91,12,36,121,9,174,241,104,66,2,195,233,199,56,161,89,217,191,221,189,52,187,48,123,82,34,185,43,110,253,167,144,203,124,159,191,116,55,43,75,82,2,39,236,26,50,243,112,34,197,105,117,235,42,184,132,33,6,11,108,217,134,180,233,255,82,32,80,12,130,0,66,82,4,115,45,251,151,147,125,251,233,254,171,243,52,191,7,66,16,21,172,169,37,236,189,156,222,54,5,5,254,197,35,82,108,16,160,44,175,241,250,66,146,147,150,72,196,21,7,67,2,223,194,93,90,140,129,146,138,156,131,115,132,153,57,83,40,203,225,79,79,49,41,73,15,109,226,142,145,1,60,34,48,103,169,57,121,29,148,53,1,85,32,43,213,43,233,81,170,129,100,189,57,238,118,35,20,47,218,188,60,215,21,82,4,79,179,225,219,67,214,105,237,215,53,0,84,2,133,67,40,17,80,126,254,126,167,92,189,134,227,196,44,22,155,82,240,94,12,198,58,221,188,95,78,138,101,88,5,47,182,67,200,24,195,231,206,50,191,170,245,34,136,213,239,195,218,67,136,40,117,237,111,219,172,36,215,66,215,127,53,152,50,82,232,99,176,154,153,38,227,173,74,217,144,82,210,147,130,223,5,97,234,221,214,140,128,147,54,113,186,255,235,187,111,81,234,227,2,224,1,81,103,5,0,1,96,2,132,7,142,82,240,195,10,120,65,220,26,214,127,19,2,2,153,201,129, +66,40,137,145,224,14,0,193,211,159,246,12,61,58,42,19,223,9,2,99,44,204,131,205,0,0,0,20,42,129,247,108,67,8,1,144,195,215,99,174,60,173,14,207,111,12,116,72,83,200,161,225,236,244,88,116,180,18,164,44,22,17,177,61,67,232,5,240,192,227,125,61,58,181,84,73,111,219,165,242,50,72,154,65,19,189,157,28,4,248,130,85,241,235,139,111,66,104,166,129,198,86,178,230,231,215,121,30,96,208,192,239,82,4,53,130,219,157,113,235,87,233,33,146,164,174,189,191,83,104,11,236,219,174,23,199,111,108,120,178,63,216,5,153,82,40,75,240,25,168,90,91,197,153,216,228,112,5,7,255,82,196,222,240,26,145,81,0,194,233,61,166,215,67,241,255,205,203,152,161,233,226,109,149,73,167,14,72,133,174,237,118,67,2,151,237,249,44,78,137,112,36,9,49,203,150,94,143,83,2,171,152,165,46,179,21,175,98,211,0,218,130,0,54,82,4,45,137,27,78,77,186,124,10,149,74,81,96,219,3,82,2,53,70,223,217,83,193,154,149,222,44,150,31,131,146,66,232,187,233,85,77,93,232,162,143,238,6,225,27,168,180,82,136,59,181,107,118,207,228,207,122,26,232,176,234,62,60,65,202,19,108,223,210,238,31,183,80,154,131,59,232,225,48,83,72,129,33,71,11,43,37,71,13,147,43,191,51,180,133,83,72,166,1,5,71,173,226,70,13,91,177,23,42,53,233,82,4,51,53,187,139,83,234,141,127,161,89,105,112,133,4,82,4,25,210,97,157,115,171,70,47,35,228,149,224,60,56,82,232,19,48,55,204,46,68,174,61,202,192,130,78,49,97,82,40,75,16,150,152,26,219,72,51,236,128,167,238,85,2,83,2,241,193,41,43,55,41,48,60,139,219,152,228,185,240,83,240,144,166,238,240,85,102,218,41,64,6,195,28,67,207,83,8,137,1,7,11,109,105,141,17,173,123,136,134,167,228,83,2,241,208,101,47,20,18,77,72,20,176,174,224,206,234,83,2,229,128,101,46,43,38,189,39,167,94,41,28,20,208,34,138,234,33,35,67,107,43,41,15,27,162,172,48,206,121,66,2,231,157,246,144,49,55,89,245,219,33,233,42,166,10,82,4,59,110,171,219,35,222,80,144,98,77,209,163,29,131,67,48,78,172,244,154,125,250,156,171,135,201,138,234,56,24,65,138,32,44,203,83,218,187,181,35,141,180,190,42,172,113,82,136,14,245,60,111,125,177,28,165,12,96,209,87,100,137,82,4,179,46,55,183,81,11,1,234,68,17,241,217,129,218,66,200,155,137,40,186,34,119,251,251,59,7,96,52,45,7,82,108,11,192,44,191,20,188,204,254,204,2,148,50,151,112,82,4,79,47,187,187,21,173,105,0,88,213,219,125,95,175,82,236,4,128,59,183,80,92,250,153,29,230,78,96,41,21,82,2,227,238,24,22,251,24,145,55,244,168,212,32,224,149,83,2,39,153,166,62,95,49,161,85,208,30,202,232,173,114,67,232,5,181,169,101,216,116,165,122,146,15,170,12,70,149,82,8,35,114,166,154,198,158,134,154,45,132,2,121,127,223,67,40,31,245,127,61,221,108,102,114,146,231,55,219,231,164,66,2,117,73,248,38,177,94,220,83,251,238,19,64,78,40,82,4,117,66,145,143,147,85,62,237,239,155,247,185,128,220,66,2,127,189,125,100,241,95,219,21,31,229,214,46,233,9,65,42,78,236,233,215,113,175,99,99,99,121,244,64,212,150,66,200,131,225,226,199,168,255,200,47,123,73,72,11,209,255,81,106,141,100,87,244,173,173,37,155,145,190,114,65,213,255,223,9,35,245,182,109,122,106,195,51,38,209,180,139,147,32,83,2,183,211,79,79,247,70,113,222,45,247,156,189,225,62,83,2,55,209,40,71,40,189,15,253,251,243,237,56,206,189,83,2,255,233,73,67,179,183,211,230,108,176,204,5,65,92,83,2,47,193,37,55,8,135,187,5,112,255,39,242,254,95,67,200,7,163,21,133,95,206,240,111,35,227,131,71,18,251,67,2,123,167,119,118,13,68,136,86,98,244,142,135,174,3,66,40,14,17,121,25,90,95,243,83,246,159,237,170,33,55,67,2,225,83,46,105,21,102,204,50,162,252,23,243,68,196, +65,42,17,172,44,235,125,206,228,64,130,229,3,89,67,171,65,10,92,236,190,71,123,142,114,27,118,10,197,1,169,13,83,8,3,44,159,39,247,163,174,213,239,206,60,7,167,163,67,2,217,172,229,92,17,181,193,148,190,223,218,3,26,47,67,40,66,203,110,255,171,179,47,123,98,104,203,72,60,157,83,232,183,65,75,77,145,148,148,86,250,157,65,145,116,145,82,2,175,210,27,87,117,153,105,90,32,213,181,170,201,132,83,2,245,210,76,63,198,151,17,227,181,33,132,200,65,156,83,8,6,163,208,50,117,223,181,130,8,90,164,153,107,116,67,40,1,117,90,171,235,240,81,207,129,168,66,32,89,140,83,40,145,33,35,71,15,71,167,79,96,127,112,64,46,238,67,200,17,208,64,87,111,158,94,174,134,71,46,88,69,8,67,2,91,33,61,86,76,100,255,242,254,103,91,199,46,31,82,2,91,244,152,22,121,248,69,109,247,27,120,179,110,214,82,2,171,156,76,123,245,104,197,197,155,104,51,132,20,88,81,138,229,210,247,183,43,111,65,140,8,74,5,184,211,243,67,2,85,38,141,216,141,0,230,91,51,193,157,147,6,50,67,104,5,181,238,101,163,88,212,222,128,89,108,67,16,85,67,2,243,131,94,224,75,145,80,200,127,130,161,87,0,199,83,2,249,208,5,51,235,76,187,175,134,123,119,122,119,68,67,200,24,144,98,210,78,23,23,111,70,152,2,58,130,86,83,232,59,181,180,94,39,31,29,3,187,240,35,248,142,244,82,2,83,185,182,255,114,224,168,236,5,140,117,89,231,165,82,196,132,123,113,209,81,172,219,118,229,193,243,36,153,207,67,2,227,212,45,91,17,89,219,245,156,239,237,160,241,220,82,2,151,245,247,30,119,1,113,102,179,60,147,72,70,26,66,2,175,203,187,43,163,29,81,215,59,89,145,18,10,60,66,2,179,199,187,105,231,58,57,23,18,91,144,30,44,146,67,2,235,119,94,225,146,219,14,197,162,151,198,243,252,115,66,2,171,186,51,229,159,55,42,76,59,227,51,77,156,4,66,2,183,244,63,188,45,90,185,251,146,190,32,214,160,113,83,232,59,172,219,191,135,182,127,140,68,190,124,185,213,8,83,40,124,44,147,46,211,173,233,37,48,88,247,236,15,123,67,2,91,143,253,94,77,206,172,26,243,79,235,43,47,8,83,194,214,219,226,169,79,18,155,88,77,64,51,207,231,72,82,2,231,223,249,23,233,216,220,169,120,153,97,246,213,7,67,8,105,236,122,205,234,185,218,110,156,28,247,241,193,225,67,194,90,89,97,189,65,221,170,183,119,214,11,182,238,132,83,0,93,75,93,71,101,91,1,0,72,206,109,74,149,152,35,2,111,65,102,115,108,231,0,128,49,110,136,59,226,158,51,104,242,137,165,168,0,158,100,162,186,64,62,32,167,236,82,136,101,181,217,118,251,137,198,228,30,37,180,232,246,167,83,144,160,172,119,187,119,90,245,167,2,120,127,2,161,155,82,204,8,224,41,118,179,124,78,22,158,221,43,233,9,203,66,236,142,68,90,8,165,166,120,100,32,164,73,5,109,233,83,2,119,208,5,51,166,250,68,108,93,64,220,1,105,156,67,2,101,2,94,90,76,8,228,1,80,191,228,19,162,196,67,4,121,148,210,192,62,0,236,148,128,242,230,111,42,243,83,104,187,33,201,8,143,227,4,11,95,240,29,73,241,146,82,104,76,80,39,167,32,219,236,197,232,192,76,138,252,120,223,5,117,70,157,208,12,41,177,236,0,241,119,228,191,110,83,104,141,193,139,141,173,150,176,92,224,234,152,91,74,238,67,2,193,227,124,178,74,131,206,158,221,57,251,97,249,188,83,8,250,193,2,199,42,107,207,10,208,108,42,73,154,110,83,104,91,245,190,59,99,138,87,7,60,33,107,16,47,168,67,4,119,50,23,81,196,46,204,11,57,51,129,22,132,81,67,168,5,112,185,250,107,156,95,167,86,188,3,110,195,22,66,2,43,53,183,230,91,60,32,221,210,147,213,110,173,32,82,72,1,240,38,217,98,163,134,162,234,36,113,84,174,40,221,139,3,163,212,83,89,5,0,0,68,198,168,210,84,144,223,137,3,227,12,88,228,181,0,0,0,132,25,33,33,162, +67,8,2,195,199,134,120,28,0,0,80,10,145,163,165,112,205,11,2,99,195,54,147,88,0,0,64,254,181,77,3,86,66,74,133,178,236,165,246,11,168,155,124,125,21,30,1,2,82,72,1,16,10,87,152,123,102,166,12,161,155,236,74,146,65,234,34,108,201,107,246,219,108,69,25,116,255,9,88,112,82,4,59,179,163,141,83,59,74,136,160,74,80,217,217,18,223,137,133,97,54,6,165,163,197,157,185,240,177,79,58,184,67,72,86,245,122,167,184,184,148,142,132,37,250,196,97,0,66,2,121,4,122,82,118,86,12,190,4,128,128,74,104,227,82,240,59,140,214,251,90,139,214,193,230,197,254,238,160,161,50,44,69,76,173,88,165,164,19,74,175,92,66,11,0,93,50,112,214,97,168,46,93,28,221,201,180,53,32,68,167,148,66,200,152,105,100,209,205,220,81,134,248,30,139,82,116,191,82,4,105,8,211,95,21,136,105,14,149,99,197,212,105,243,81,72,8,144,99,180,100,212,54,102,172,184,11,165,87,177,82,2,245,6,94,85,233,40,239,158,188,170,255,17,216,43,83,72,187,65,67,101,77,227,40,11,237,3,189,116,83,11,67,4,115,114,246,0,252,7,146,111,192,167,7,51,196,13,83,2,165,160,228,46,254,77,139,85,98,0,241,0,48,117,83,2,165,144,70,46,152,33,74,5,22,35,9,209,127,46,67,2,207,165,132,72,11,119,64,77,93,5,134,213,100,165,83,40,34,67,67,22,70,253,221,130,175,168,30,72,113,136,67,2,69,74,204,194,11,39,53,180,3,194,106,188,215,241,83,168,20,131,34,87,78,239,191,133,230,17,39,105,144,11,82,2,175,170,157,94,89,97,27,80,210,72,123,77,245,7,67,2,91,136,181,84,76,19,39,199,4,123,178,8,146,0,66,232,130,193,151,151,45,62,65,232,76,90,1,55,223,216,83,2,183,208,68,51,84,10,167,0,53,20,178,78,65,62,67,2,91,169,133,224,13,152,64,79,190,217,93,5,93,64,83,72,160,129,204,74,175,69,71,15,118,98,215,19,4,131,67,8,9,245,47,109,29,180,230,237,4,9,10,72,48,152,83,232,253,193,115,79,113,73,73,15,194,130,173,52,161,8,82,168,3,176,194,169,230,187,208,70,59,81,178,193,73,210,51,4,231,113,46,95,145,191,103,134,174,17,70,97,100,1,67,232,14,112,189,125,117,182,79,175,151,16,71,69,29,240,82,4,239,255,118,169,81,190,118,207,165,112,40,9,137,188,83,8,137,129,103,41,111,111,81,19,240,164,203,183,79,238,83,168,102,163,235,146,127,99,230,134,191,181,48,147,78,12,66,2,7,127,7,251,197,55,119,49,147,117,99,119,80,221,82,2,43,238,26,26,113,129,69,121,194,91,88,62,99,182,223,5,183,132,115,200,141,36,248,18,13,88,47,78,189,108,67,2,249,137,167,118,144,68,153,6,163,36,208,19,5,40,67,2,249,138,183,118,80,8,160,211,0,80,93,67,162,220,83,2,191,248,196,55,239,221,245,94,36,111,32,48,25,160,67,2,251,139,199,120,146,70,153,206,34,4,226,113,0,114,82,2,135,243,49,58,62,128,90,146,90,19,53,35,76,132,83,136,159,18,249,56,58,25,124,30,255,210,183,65,31,60,67,2,87,139,197,224,17,1,151,44,145,153,165,96,8,18,83,2,119,211,77,71,247,222,123,214,90,115,76,183,24,6,83,200,96,108,48,196,155,178,174,149,69,95,40,223,179,255,67,34,95,154,165,83,157,111,154,129,174,142,234,191,119,245,67,2,107,145,30,105,149,92,145,16,208,78,189,27,227,221,82,8,7,80,215,28,51,173,200,170,12,133,223,153,241,118,83,2,245,208,39,71,136,170,131,72,185,32,153,100,254,170,83,2,253,240,167,71,239,43,240,19,64,11,33,44,33,38,67,2,233,98,118,230,17,136,85,96,21,2,245,58,16,158,67,2,123,133,135,118,81,68,232,112,170,64,169,0,26,16,83,200,210,50,62,94,126,188,157,30,222,106,255,199,151,14,67,2,123,214,79,121,22,240,184,125,230,204,123,83,226,140,65,2,235,171,235,177,231,187,1,0,77,39,150,124,226,135,81,106,134,100,23,51,92,55,32,4,123,78,149,114,49,172, +65,10,154,50,156,205,150,147,118,0,142,88,86,187,182,241,65,138,19,44,201,242,170,25,239,160,244,124,157,243,64,101,83,2,175,177,232,54,15,178,213,113,152,41,123,55,103,47,66,2,43,118,42,183,215,24,133,30,170,15,98,170,162,170,83,2,255,233,138,51,196,205,209,144,168,158,32,224,11,17,83,2,189,225,105,59,128,26,79,120,120,192,166,33,82,44,223,37,47,187,210,49,158,232,242,249,209,42,3,75,252,198,67,2,213,65,93,88,11,8,38,195,148,158,99,181,20,141,82,136,123,208,153,150,162,59,98,149,200,120,126,216,238,201,82,2,235,184,203,122,253,196,221,228,235,37,191,136,44,48,83,2,167,136,100,50,191,22,211,83,133,169,114,36,98,79,67,2,87,37,117,212,12,81,157,2,117,228,46,108,103,21,67,2,215,70,141,214,140,254,204,116,1,225,200,219,229,196,83,200,67,227,193,211,109,122,181,130,181,173,108,224,10,223,83,136,136,65,35,71,143,137,107,13,176,8,10,201,247,54,83,232,82,12,169,186,249,167,237,173,206,80,195,78,207,238,67,4,83,114,210,24,169,230,45,182,63,85,218,245,17,111,67,2,75,101,100,78,142,198,27,52,171,198,72,123,162,164,81,74,200,242,243,180,235,103,65,179,198,88,49,148,22,16,81,138,31,12,70,138,173,189,146,107,144,40,160,111,99,240,67,2,77,134,116,208,76,76,173,69,115,4,157,217,249,161,83,2,107,169,198,46,136,153,146,181,150,127,105,85,222,223,67,2,101,227,93,216,75,48,156,0,61,61,53,10,159,88,82,2,215,174,152,62,89,105,3,225,191,197,123,178,93,149,83,2,107,168,197,42,229,109,163,82,223,28,250,169,133,44,223,145,32,236,94,235,152,147,80,78,41,33,108,212,202,205,66,2,63,95,206,185,233,61,187,91,50,119,138,61,53,32,65,138,103,108,217,119,125,147,236,228,165,122,101,230,126,80,83,232,4,108,177,108,135,116,89,28,127,240,191,249,14,118,82,2,227,249,121,63,125,228,220,249,38,124,37,132,238,210,83,8,6,44,157,229,199,117,239,214,132,210,65,94,147,103,67,196,220,150,173,73,7,70,125,242,175,247,246,45,106,175,83,194,202,83,207,159,209,135,101,129,119,141,112,41,126,75,82,2,159,153,104,251,110,232,124,212,255,62,50,140,171,0,67,72,6,12,252,5,195,175,84,106,28,157,127,92,105,25,82,2,167,214,90,63,119,217,165,178,43,117,173,166,205,180,83,8,7,108,189,228,227,102,223,204,239,158,121,150,33,99,223,5,217,101,133,92,140,32,96,129,132,69,90,45,177,109,67,2,211,5,125,214,143,80,137,192,36,12,47,179,101,148,82,4,117,147,163,95,181,16,12,132,68,112,41,34,107,252,66,168,128,161,244,253,235,158,22,78,52,6,79,207,115,30,83,232,186,169,180,212,120,107,109,17,18,58,218,91,225,170,222,45,1,12,70,136,173,181,154,224,25,174,211,14,28,21,66,236,141,242,65,169,165,37,239,90,81,255,246,218,38,74,83,72,152,225,2,39,173,194,38,13,198,48,171,2,103,122,83,2,229,161,233,62,255,29,247,78,87,116,152,132,160,214,67,136,8,245,189,111,163,152,212,159,68,171,205,85,131,75,83,2,173,137,104,50,255,214,28,214,200,70,183,153,57,152,66,48,6,105,221,117,191,157,131,71,158,43,248,61,29,95,82,4,93,188,115,143,241,10,169,40,101,187,104,162,201,85,83,16,162,230,191,171,213,91,218,47,142,97,223,232,47,198,82,240,126,169,236,26,51,243,36,199,170,232,97,96,133,74,67,136,104,240,159,125,251,191,84,123,134,164,145,5,106,78,83,2,125,217,106,43,49,94,37,124,96,80,8,170,0,229,83,232,162,129,109,145,205,2,7,11,139,190,50,11,32,24,83,136,19,172,118,157,163,242,74,132,155,197,222,116,221,15,67,2,111,68,134,226,10,138,228,155,129,234,104,41,226,212,51,168,146,129,87,77,113,205,47,207,186,128,15,255,122,39,83,2,191,218,12,63,187,176,49,155,247,177,238,7,68,217,206,49,93,99,47,236,110,3,0,128,230,94,151,60,197,2,175,113,17,25,0,0,94,140,93,39,253,110,34,88,66,137, +67,8,111,147,161,6,0,161,105,181,36,105,115,48,160,12,51,16,0,101,117,87,35,101,13,0,128,132,22,249,160,0,83,168,203,193,226,6,177,196,70,13,255,64,21,0,9,2,67,2,193,35,92,84,12,145,0,214,13,254,253,61,46,198,67,136,59,227,63,237,236,198,252,231,33,93,244,251,54,236,83,8,161,1,7,77,171,226,230,10,166,155,0,157,249,46,82,4,61,218,97,141,117,251,135,118,163,194,36,4,130,139,82,168,36,245,78,243,223,212,79,247,30,200,182,25,29,6,67,40,41,240,126,251,222,47,30,157,6,66,200,187,231,54,67,232,119,208,96,83,231,40,122,117,70,99,15,31,116,164,83,2,103,120,100,46,18,84,219,25,49,201,91,238,222,105,67,2,227,224,52,210,75,199,106,50,223,202,78,64,47,105,67,104,5,176,235,83,103,24,24,57,6,52,219,137,93,78,83,8,129,161,75,43,143,79,77,17,57,252,170,218,138,13,67,2,255,161,85,214,10,69,202,172,186,1,165,34,24,10,82,4,121,233,27,78,21,118,146,160,86,2,133,9,124,107,81,48,93,210,168,162,141,203,173,15,71,129,131,17,224,127,82,232,59,176,137,87,218,146,39,166,217,164,106,99,103,22,82,4,57,210,99,157,17,34,0,204,149,243,211,252,20,215,82,4,95,170,155,155,147,1,71,64,53,129,93,236,250,222,206,45,14,67,65,210,79,91,205,160,90,213,95,46,234,160,67,136,14,208,3,23,103,56,92,117,148,226,22,5,19,225,33,106,13,67,165,184,213,216,190,239,149,104,138,43,122,89,67,200,24,245,122,189,242,226,211,150,4,140,24,226,213,219,67,104,5,131,19,70,118,236,122,239,33,29,113,173,21,198,67,168,0,213,124,231,160,208,87,223,64,229,166,38,21,236,65,74,24,204,127,126,214,214,109,199,40,62,243,55,52,2,83,8,29,227,218,191,118,206,157,135,75,224,76,147,116,195,66,2,75,196,67,106,233,94,119,225,67,108,108,192,68,204,66,2,71,251,195,187,219,24,194,2,105,36,236,219,34,219,67,136,123,140,122,237,130,193,98,174,91,178,101,192,118,153,67,136,60,99,180,219,236,183,236,53,36,45,135,105,122,97,83,168,102,117,206,218,69,171,215,7,195,221,62,145,241,176,82,168,0,16,34,201,30,155,136,42,11,81,138,36,179,185,67,72,0,163,181,213,236,247,122,183,33,170,106,125,108,22,83,104,29,163,232,97,119,215,238,130,150,119,232,64,131,86,67,2,119,146,71,247,22,54,203,175,242,12,60,241,34,4,82,4,47,45,51,233,81,54,77,10,148,97,8,170,96,150,82,136,14,144,255,222,59,118,28,234,88,225,22,238,178,123,67,2,251,180,87,119,152,202,216,159,171,204,15,22,98,36,82,2,7,249,241,50,76,65,101,160,74,49,103,106,252,164,66,2,15,241,18,252,139,57,63,223,81,247,80,247,223,218,66,202,159,64,124,222,216,28,123,206,183,0,207,83,240,215,83,2,61,243,172,71,179,156,119,103,191,114,189,5,64,59,67,2,121,105,159,244,143,160,221,97,68,109,21,64,114,19,81,136,19,53,159,199,227,211,167,51,74,237,3,253,185,193,67,2,117,72,135,114,15,154,136,72,148,173,4,194,145,2,82,2,195,246,192,50,126,233,37,144,105,79,111,107,85,165,67,48,197,98,88,149,245,43,44,85,66,201,181,152,187,159,83,2,123,234,105,63,14,48,166,37,160,49,121,27,236,124,83,8,157,9,84,210,92,59,59,91,205,151,149,125,147,191,83,2,119,210,43,75,144,135,167,42,29,129,152,249,162,59,35,232,142,129,5,70,236,63,36,131,205,23,68,69,81,44,82,2,91,134,214,177,118,104,68,56,229,21,202,252,157,49,82,2,131,174,145,90,100,229,0,160,216,64,165,82,85,188,82,2,135,238,81,58,118,65,85,168,75,81,49,126,196,5,66,2,11,175,11,87,135,42,182,247,11,247,119,247,243,43,67,2,249,148,31,247,82,160,180,75,125,6,47,153,228,156,83,2,179,170,138,58,215,230,161,232,82,112,218,230,202,250,83,168,0,236,150,231,181,56,14,165,176,193,58,155,54,182,67,4,251,244,20,65,222,160,234,4,54,16,111,3,74,157, +82,2,131,246,214,62,123,233,68,155,40,111,229,154,76,7,67,232,39,227,27,127,188,117,172,125,34,178,243,212,23,187,66,104,216,73,233,234,146,57,41,187,171,29,183,21,10,34,83,168,48,172,120,39,165,35,75,78,238,73,103,250,10,223,222,121,214,12,218,124,45,205,182,94,89,129,194,251,207,255,67,200,9,140,172,189,210,207,90,170,29,7,254,158,54,148,67,2,105,194,93,214,139,214,152,193,178,6,228,89,140,105,82,2,243,134,156,93,225,216,1,134,217,96,115,223,167,63,83,2,187,193,167,54,249,253,79,194,251,196,199,14,161,235,67,2,97,199,165,92,12,8,246,143,145,78,222,8,171,238,83,2,49,179,204,62,212,217,246,150,143,14,212,10,67,78,83,2,237,176,198,50,86,174,5,248,190,128,231,68,139,213,83,2,39,154,170,50,117,88,12,87,233,190,253,159,195,255,67,4,79,110,178,88,206,251,149,242,121,64,219,148,94,165,67,2,77,169,156,204,139,92,26,186,93,223,218,153,30,4,67,136,31,140,202,29,63,159,205,168,89,231,174,22,125,0,67,136,103,149,54,110,60,238,178,231,66,71,54,220,230,219,67,2,77,140,188,78,144,204,216,83,35,230,24,17,100,206,67,2,81,164,100,208,13,209,200,192,238,151,224,118,223,10,67,2,211,226,76,210,12,55,113,55,187,208,109,59,50,189,83,2,171,153,134,50,126,140,19,84,221,216,213,79,160,115,67,2,199,67,84,78,76,170,246,186,128,207,248,96,171,212,67,2,77,136,140,208,14,245,202,4,119,189,29,19,156,142,82,2,27,138,216,241,90,25,123,13,164,254,217,140,189,17,83,2,231,152,133,46,17,163,198,96,92,80,239,161,207,61,83,2,107,161,166,46,227,158,150,202,90,220,23,213,60,133,83,104,133,65,71,73,203,194,4,13,55,241,87,248,135,118,205,7,15,60,221,148,64,140,168,80,4,59,8,96,218,33,83,2,235,169,200,50,150,1,213,36,135,237,100,74,219,109,82,136,9,144,14,106,42,107,228,161,198,240,75,138,105,102,67,136,231,97,202,91,85,219,154,61,17,30,13,190,237,187,82,72,6,236,60,253,220,80,46,47,79,40,240,228,229,67,66,80,196,102,186,188,249,68,207,19,85,41,194,11,191,235,67,194,106,105,113,149,129,127,7,221,126,211,45,221,54,190,67,194,118,115,125,203,129,179,116,8,9,171,197,60,22,50,83,232,70,236,122,159,101,207,107,85,160,180,72,240,28,185,83,200,3,108,181,172,135,117,221,204,0,115,198,236,174,239,67,176,234,74,103,156,35,126,80,126,34,58,237,152,157,191,66,152,148,244,127,114,182,122,81,179,19,136,224,237,76,111,83,168,140,105,118,150,92,75,79,13,9,249,213,223,104,24,82,168,8,80,30,137,104,219,113,199,58,1,40,253,31,156,67,2,195,33,84,76,13,228,34,89,218,224,78,42,38,191,83,168,154,65,69,71,13,165,8,15,83,94,228,166,107,195,83,40,130,33,21,43,15,3,39,13,18,217,91,76,15,207,223,5,217,107,189,218,15,43,96,255,173,20,145,73,96,16,67,136,8,227,82,157,114,102,223,171,161,133,43,71,94,84,82,4,63,163,161,153,37,22,95,167,78,255,164,225,217,7,82,4,25,129,219,93,21,2,61,4,183,60,216,206,187,108,67,8,23,208,139,35,78,47,87,51,6,191,180,182,102,33,82,72,52,213,253,124,154,200,27,93,12,164,54,237,177,27,82,8,7,227,215,22,235,212,247,181,13,162,1,235,180,237,205,139,227,225,179,166,238,15,126,57,12,195,117,228,119,153,82,240,18,140,57,57,153,115,24,198,135,185,181,123,106,9,83,2,237,177,233,66,123,54,56,246,96,235,122,161,187,98,83,136,179,193,238,206,212,228,38,15,70,114,203,33,80,20,83,240,188,234,223,62,62,107,151,142,108,182,101,105,3,248,50,168,135,97,246,167,55,153,83,157,58,121,241,106,79,19,67,4,151,182,214,72,238,237,187,47,191,8,111,41,87,111,67,2,109,104,222,224,138,79,120,254,124,180,160,12,201,7,34,16,95,41,74,137,1,0,96,158,153,232,27,250,58,234,205,139,3,195,88,209,202,86,0,0,64,32,38,25,5,104, +83,8,2,227,201,35,237,0,0,64,122,192,9,34,32,18,206,49,117,21,0,0,160,152,199,170,153,185,133,180,151,49,82,8,2,48,26,183,30,83,162,149,184,64,64,242,119,143,83,2,225,144,5,51,86,48,198,129,79,4,239,205,106,207,82,40,16,213,127,255,249,141,14,103,28,160,3,27,222,64,67,168,2,131,197,86,247,252,253,167,96,186,26,5,51,145,67,2,217,4,76,74,13,174,197,14,52,182,239,117,110,77,65,234,59,236,233,250,198,216,183,145,60,65,161,11,233,237,67,2,229,226,85,218,141,186,185,128,115,187,230,221,156,48,83,232,187,1,227,36,205,77,43,15,208,7,44,164,175,228,223,5,199,3,109,188,139,153,11,236,178,152,214,226,39,22,83,40,104,213,155,223,130,9,62,3,10,68,95,137,111,34,67,2,177,160,75,56,11,86,119,187,26,67,235,99,162,239,67,232,60,227,241,239,172,238,187,167,163,89,180,225,5,32,83,72,207,129,139,111,51,71,7,13,47,152,202,89,111,200,67,2,123,166,101,84,77,17,65,68,136,2,114,109,164,220,83,72,49,245,189,171,109,44,125,7,199,111,62,222,184,7,206,153,182,174,191,42,219,122,183,110,239,27,42,98,86,74,67,168,3,35,145,85,59,174,60,189,161,21,76,25,178,145,67,200,24,112,184,115,111,41,26,181,20,162,97,69,91,32,66,8,129,193,198,78,187,174,211,91,156,80,199,105,186,180,82,104,11,53,59,207,145,157,157,237,15,144,172,75,61,132,83,168,192,97,146,214,248,2,39,13,0,76,187,80,78,189,83,8,3,76,201,127,249,126,79,47,157,1,163,215,166,230,67,2,187,160,69,216,75,186,20,42,254,147,206,88,201,174,51,2,151,36,220,112,216,180,240,67,114,49,82,209,157,6,67,240,148,172,214,73,235,196,184,106,40,198,222,186,195,87,222,233,132,193,197,30,243,216,223,174,246,4,181,251,221,245,66,12,203,4,86,140,239,166,145,84,215,32,106,2,88,39,66,108,141,50,202,105,41,38,96,247,157,127,249,217,41,70,67,168,8,48,242,182,229,182,205,175,7,47,205,74,181,16,82,4,27,124,235,249,149,185,249,166,90,169,175,32,251,63,83,2,47,186,203,58,161,219,9,236,184,81,251,144,194,24,67,136,103,108,75,133,238,163,80,169,92,58,142,183,29,166,67,200,9,76,201,148,146,167,210,169,25,245,166,134,180,34,50,240,247,106,187,203,74,89,141,239,253,139,184,171,147,164,223,37,15,215,104,23,147,132,20,155,70,84,153,211,103,78,65,74,154,36,216,116,62,169,98,98,129,169,7,201,206,170,83,40,9,227,209,191,103,222,181,134,184,172,26,125,187,119,83,104,6,227,240,103,245,231,214,128,91,235,173,224,247,224,81,202,66,35,160,116,173,182,97,206,204,34,248,241,177,138,67,2,89,41,173,84,81,117,118,151,191,234,93,125,124,172,83,2,125,242,170,67,208,88,29,16,55,111,115,16,222,143,82,2,7,209,33,62,180,176,78,186,86,4,49,9,84,76,83,168,203,18,29,93,221,189,189,30,15,81,160,233,166,238,67,2,121,142,255,120,148,198,72,52,175,236,150,22,226,3,66,72,154,97,185,235,89,45,203,57,205,89,59,71,255,253,67,194,238,237,233,189,1,70,217,95,27,125,207,26,248,235,67,2,121,107,175,114,144,69,140,34,103,4,43,83,196,147,222,81,131,196,125,126,126,30,30,63,158,30,194,131,73,195,83,2,153,103,254,117,247,214,50,111,190,56,143,3,128,156,83,2,55,210,40,63,28,35,238,49,7,175,98,126,67,150,222,73,154,33,96,134,62,255,116,46,179,251,52,245,138,15,67,2,247,73,151,110,143,75,143,137,192,163,20,0,31,82,35,184,150,204,142,62,23,206,213,107,13,40,200,37,132,219,67,2,109,137,182,228,82,76,152,27,115,212,61,113,88,215,67,72,44,163,240,207,123,119,47,243,32,11,104,52,254,254,83,2,189,187,140,62,39,96,217,61,230,209,251,16,77,64,67,196,228,53,165,81,79,233,17,32,117,23,238,38,137,251,66,2,131,105,191,118,173,93,249,123,247,95,187,5,155,225,82,2,109,73,43,174,77,5,221,185,44,177,39,42,72,188, +67,4,29,23,21,73,226,175,184,251,239,105,245,103,235,167,223,233,5,117,142,99,92,76,159,119,97,213,86,61,254,92,82,4,107,190,248,213,165,190,74,231,28,248,12,114,131,140,83,104,29,172,122,228,135,184,42,245,0,163,54,110,154,180,82,4,163,253,180,251,131,249,121,79,99,106,32,34,131,90,83,168,141,201,81,27,185,27,219,90,251,0,153,6,11,84,82,2,199,255,214,51,119,209,244,158,28,138,147,65,228,121,82,144,168,234,200,214,220,19,222,189,53,6,117,235,113,248,82,136,123,245,184,110,94,212,212,247,12,216,247,238,9,16,82,4,189,201,223,62,65,150,223,160,246,117,249,106,191,7,207,9,151,129,31,180,240,53,232,187,236,21,102,209,234,72,66,140,231,228,213,230,160,165,255,208,160,165,170,82,169,6,82,104,49,99,248,210,179,214,51,157,11,102,198,255,240,59,207,177,80,99,241,225,20,239,119,235,206,160,140,86,216,195,67,104,5,195,215,150,122,238,121,167,161,25,108,64,44,133,83,136,19,172,223,236,27,134,245,29,160,47,88,202,117,128,67,2,77,199,148,82,12,128,195,220,0,89,138,235,45,252,83,72,83,108,181,229,233,175,219,172,157,16,119,138,137,64,66,2,87,156,223,22,107,25,110,169,133,18,83,9,51,235,82,2,175,208,93,126,123,217,101,144,107,21,111,238,222,148,205,171,214,193,9,215,110,170,124,169,14,78,103,63,160,81,67,2,71,66,84,206,10,92,68,178,4,91,176,16,17,133,66,2,103,196,239,236,111,22,90,191,250,123,98,125,74,16,82,4,63,242,155,143,81,190,135,146,34,228,32,162,37,1,67,2,211,235,188,212,14,214,186,81,247,61,170,123,200,238,82,4,55,101,113,219,17,168,223,10,100,145,123,50,10,17,82,2,239,234,220,113,251,196,151,225,143,137,179,59,205,214,82,2,175,176,93,126,243,208,126,223,88,187,98,34,232,189,205,7,43,58,93,148,219,96,237,90,64,63,123,210,250,239,82,2,175,188,157,127,245,128,27,167,101,136,163,79,59,223,67,2,213,40,173,216,76,249,175,102,196,255,228,111,226,3,83,2,243,192,6,47,183,75,37,198,76,92,181,5,144,143,83,168,192,65,81,77,209,139,109,17,84,3,41,128,189,44,83,2,57,218,74,55,217,35,114,53,128,53,121,43,116,168,82,4,59,169,91,141,17,128,220,8,193,37,135,192,249,231,83,2,109,178,236,50,251,81,124,122,85,130,135,74,33,172,65,234,31,236,186,115,121,238,235,136,206,192,126,113,199,33,82,2,23,174,69,26,241,248,58,176,233,207,47,38,177,156,81,52,139,136,218,88,153,131,90,88,186,84,219,38,125,61,67,200,120,144,33,19,110,190,86,41,142,7,31,184,249,22,67,40,124,176,209,54,125,173,30,46,86,166,200,71,211,15,83,2,95,153,200,62,157,35,118,115,7,211,220,102,174,188,67,136,99,176,202,38,101,141,29,43,150,175,239,73,49,0,82,4,39,252,105,221,65,118,125,2,128,233,226,160,84,109,66,108,171,178,86,155,237,6,162,216,2,8,111,141,240,89,67,168,55,195,147,156,186,206,252,183,34,200,82,126,69,173,83,2,49,194,12,51,12,96,140,5,39,132,213,169,237,252,82,4,95,166,251,155,85,100,248,70,175,42,214,10,18,128,83,2,171,152,134,42,217,34,96,28,103,204,9,167,95,174,67,136,14,131,6,70,185,214,181,191,160,177,54,243,142,14,67,4,81,116,210,216,138,6,196,82,72,89,232,172,112,231,67,136,3,240,226,147,239,58,53,47,135,229,6,124,200,64,66,176,72,108,221,165,235,189,223,255,62,9,167,61,16,43,83,40,74,236,114,221,127,247,239,53,177,150,25,94,7,117,66,42,202,114,95,209,240,7,96,169,60,221,48,179,20,152,82,48,231,236,89,239,145,123,223,121,151,6,97,131,201,2,83,2,177,185,10,47,167,247,218,119,11,217,88,144,51,135,83,40,209,1,37,103,143,103,105,13,39,98,112,68,244,52,67,8,16,245,188,167,234,167,237,205,4,182,129,149,158,214,223,113,17,17,0,0,255,139,175,157,14,138,3,16,24,172,222,17,95,225,252,191,3,0,0,167,43,155,9,195,170,37, +66,48,117,21,0,0,37,199,235,220,103,131,60,62,31,44,82,40,137,209,89,7,16,190,60,174,6,64,14,1,7,166,66,208,83,140,225,118,45,189,95,189,238,21,219,255,4,200,66,104,242,169,213,83,217,138,199,92,183,20,159,73,194,16,83,2,235,169,10,47,150,81,250,5,35,142,82,24,164,192,81,2,197,12,250,88,12,177,64,78,102,20,29,0,15,64,67,2,43,130,99,184,74,251,149,184,77,101,72,221,7,129,83,2,185,160,101,50,2,185,149,121,8,111,112,49,11,98,83,168,128,129,141,175,213,75,43,15,91,240,144,21,6,228,81,10,3,236,94,124,229,172,17,50,21,106,128,119,222,102,65,42,9,48,113,56,61,62,82,9,220,120,44,221,113,79,65,74,181,68,123,198,106,199,63,162,227,124,24,1,146,68,83,2,51,193,39,47,156,135,135,0,105,154,16,18,40,133,67,2,225,165,117,86,16,222,79,19,191,81,223,0,106,119,83,2,53,192,227,42,80,152,169,250,248,46,244,206,180,180,67,2,73,133,140,84,76,118,242,121,234,105,29,119,60,196,67,4,155,216,214,8,52,215,150,112,126,185,38,106,95,104,35,204,224,132,186,167,238,75,85,249,131,253,102,114,171,96,82,4,15,252,240,217,241,158,139,151,215,169,219,79,60,20,82,4,93,210,35,155,51,54,135,64,179,187,38,224,216,23,82,2,111,140,27,18,123,73,43,208,246,39,254,135,111,219,66,44,197,210,189,104,231,37,95,144,14,247,14,255,82,165,34,56,27,172,181,11,93,90,191,171,237,126,5,252,171,55,83,2,233,168,7,47,92,176,69,176,248,8,234,142,32,244,65,170,18,35,39,75,109,87,29,34,108,113,170,33,104,0,33,6,151,159,187,135,0,101,177,2,48,41,204,171,195,68,82,232,60,176,190,171,44,196,14,67,26,65,232,163,20,213,66,12,137,18,74,138,103,38,152,93,10,106,165,79,82,4,67,2,105,69,150,84,77,116,6,21,235,215,155,93,220,93,67,2,121,173,13,211,79,63,55,216,94,193,217,127,106,0,67,196,100,54,213,201,90,43,56,217,191,87,253,38,249,242,51,2,229,223,116,251,78,211,240,254,123,247,253,125,78,3,223,37,229,27,172,177,27,22,101,180,150,77,255,182,179,36,82,196,146,101,85,227,129,233,85,254,69,127,249,89,18,12,66,168,162,201,104,172,86,135,58,36,162,83,240,244,184,83,82,136,14,18,121,180,23,86,245,80,51,217,124,120,227,14,82,2,43,190,171,91,127,32,68,108,124,21,129,42,158,187,83,194,70,75,75,159,54,40,152,122,224,98,231,74,119,141,66,2,95,220,231,184,37,93,144,45,208,45,209,85,209,53,67,104,21,75,157,114,164,163,236,61,35,136,64,46,52,129,82,168,132,225,152,243,253,178,130,39,9,133,120,179,124,250,33,10,2,227,199,159,210,190,247,183,149,54,128,104,34,141,67,2,201,99,100,82,14,95,220,2,41,158,22,214,93,207,82,2,43,148,219,86,125,249,118,79,57,25,114,51,228,199,67,136,19,163,164,143,238,39,139,169,33,183,226,2,246,107,83,2,233,161,201,62,83,77,176,68,50,163,160,80,90,251,67,104,177,9,13,94,250,101,171,111,65,86,207,198,41,184,67,2,121,137,183,246,80,124,32,17,182,250,12,25,235,140,83,8,27,44,28,12,137,60,189,29,55,122,8,110,223,253,83,8,151,225,239,209,85,73,75,17,196,59,96,95,241,109,83,136,97,108,60,196,133,56,14,15,155,185,76,141,135,250,82,2,199,155,112,83,84,217,70,248,10,241,125,231,44,89,82,240,219,42,12,199,152,179,97,22,53,226,138,107,75,2,81,42,145,36,27,20,181,107,38,29,255,176,166,25,29,136,33,6,253,182,252,3,1,105,114,20,56,101,255,246,252,201,83,200,59,108,52,207,207,226,188,214,244,142,239,82,13,113,67,2,109,143,197,210,79,255,192,13,92,220,2,4,202,57,83,2,117,161,101,54,20,209,129,145,185,136,237,36,75,46,83,8,9,53,165,220,169,166,54,3,63,248,136,53,113,147,82,4,135,60,181,187,21,181,79,173,114,83,249,26,84,234,67,136,40,117,234,103,242,157,254,44,18,210,174,145,156,26, +83,2,61,254,207,59,251,221,111,214,123,80,140,131,25,109,82,4,143,227,126,201,37,38,184,69,107,34,121,78,249,91,34,176,79,108,126,91,91,102,85,191,110,85,30,15,21,103,66,2,95,166,107,35,247,52,72,48,146,61,127,187,187,187,67,196,94,118,165,209,170,223,196,36,101,65,219,151,32,75,83,136,60,236,146,229,153,50,219,14,70,151,109,237,251,193,66,4,79,47,239,158,218,23,111,32,166,159,93,250,85,117,82,200,145,105,157,219,55,215,111,95,15,0,32,156,99,251,51,232,187,129,183,219,234,123,156,197,69,245,23,177,131,253,67,40,106,35,113,197,237,167,234,109,35,157,168,246,151,10,33,202,145,33,178,229,99,83,151,171,21,132,18,33,135,140,67,2,201,90,108,199,85,122,156,229,230,134,136,193,49,81,82,4,143,55,59,249,5,2,205,41,220,148,213,43,245,187,65,170,42,236,74,210,253,222,238,198,35,126,168,73,38,8,67,2,119,14,254,214,79,36,101,114,135,64,40,141,39,140,82,2,75,136,88,89,225,72,68,58,62,81,148,34,24,173,82,208,86,44,95,203,241,189,190,214,43,145,133,166,177,131,82,2,67,150,72,86,113,208,125,184,122,21,188,42,56,149,67,2,193,195,99,70,11,49,218,9,137,169,78,2,163,113,67,2,85,70,133,90,12,131,4,180,191,177,173,91,227,221,83,2,181,193,40,51,215,167,165,246,176,8,196,141,56,198,82,2,55,138,220,93,219,36,152,175,30,0,121,123,69,197,83,2,173,177,200,58,103,245,22,114,47,40,74,3,33,168,82,2,119,164,30,153,235,152,171,183,12,76,225,63,212,132,83,2,167,153,168,54,231,93,17,235,93,34,222,3,188,201,67,2,207,5,125,84,14,250,215,130,168,213,5,138,42,75,66,2,227,113,235,248,175,61,89,2,159,90,155,211,148,191,67,40,34,240,208,183,103,169,56,117,134,165,172,92,30,3,207,137,231,225,198,79,57,70,27,106,32,89,101,169,44,86,67,2,79,171,204,208,142,76,202,118,38,172,43,17,65,135,67,2,203,164,92,78,76,249,218,138,108,231,131,138,38,29,83,168,18,163,171,86,109,102,183,130,184,177,38,79,210,53,82,2,219,174,88,22,91,193,43,114,3,202,76,153,63,95,83,40,145,97,105,107,49,71,235,12,40,83,41,39,222,77,65,234,99,44,207,78,182,214,189,248,83,101,200,222,8,128,67,4,185,216,22,153,108,222,17,208,183,66,233,246,214,211,83,2,203,61,119,85,132,75,130,68,181,148,181,165,141,188,67,2,85,134,141,228,142,157,20,59,234,56,182,161,1,82,82,200,7,144,174,138,170,99,130,149,216,104,79,76,80,63,83,2,177,186,232,54,203,65,198,156,39,215,249,48,223,8,82,144,34,108,49,152,101,156,182,90,92,225,242,135,86,222,82,36,61,171,91,137,114,23,149,239,5,136,86,100,26,208,67,200,67,208,10,227,103,154,116,41,86,2,200,123,85,243,65,10,9,213,238,56,39,73,13,152,64,27,136,209,46,201,67,4,45,110,174,216,38,38,226,221,94,165,238,235,123,85,223,233,157,225,8,101,220,154,197,38,199,0,4,141,222,39,83,136,136,129,194,230,108,75,45,13,4,0,18,251,40,14,82,16,199,198,241,123,203,252,111,241,189,196,79,121,81,6,51,4,61,34,108,76,138,178,68,16,150,72,2,223,218,88,83,2,229,145,139,46,15,67,94,41,67,244,204,28,226,26,83,136,5,227,202,231,101,247,204,131,63,148,25,174,141,53,67,2,235,45,238,222,13,239,141,9,104,228,19,14,215,53,83,2,247,201,10,51,57,205,85,188,203,37,80,48,223,202,67,2,223,167,157,92,145,216,141,0,51,149,28,223,103,189,83,2,61,225,39,59,76,121,192,128,246,194,205,19,253,60,83,136,101,195,171,211,236,79,213,135,226,1,135,74,126,186,83,8,130,129,37,37,109,101,71,15,123,177,10,13,9,239,83,2,115,154,136,54,109,174,245,117,236,222,2,22,148,67,222,141,31,76,78,91,235,164,24,39,0,63,0,44,235,61,222,241,18,17,0,0,29,101,108,189,95,13,42,34,98,97,205,139,3,99,192,18,158,28,0,0,64,48,131,172,101,144, +206,13,2,227,168,99,111,0,0,96,127,5,194,168,134,6,82,8,2,35,241,179,151,91,0,0,0,49,113,65,7,8,82,80,67,76,78,121,41,173,248,65,121,169,187,56,65,187,65,10,87,245,48,51,71,11,11,132,248,147,40,160,232,25,67,2,241,66,125,80,75,68,12,83,222,232,44,42,27,48,67,4,79,142,210,40,79,79,123,11,124,231,155,251,63,101,82,72,0,85,227,222,122,176,70,55,28,24,56,7,32,44,67,72,86,112,159,126,247,170,92,122,148,160,10,39,90,40,67,40,34,208,161,23,110,174,62,62,6,168,232,166,244,183,82,2,125,134,94,29,89,133,213,93,106,159,170,59,112,70,67,2,35,128,59,58,139,151,117,70,156,51,90,101,46,119,33,114,45,172,141,160,181,183,253,141,23,215,161,120,204,118,83,2,39,160,3,51,0,178,74,177,174,89,51,121,147,98,83,8,35,131,163,23,110,222,157,133,231,146,44,178,8,75,67,2,23,236,209,44,14,170,135,5,213,57,176,40,253,87,67,72,28,176,169,38,229,28,88,113,84,102,111,50,2,176,83,136,19,195,45,171,254,95,245,135,175,144,183,240,123,196,83,136,131,201,6,71,229,6,203,10,166,89,89,161,118,93,67,136,8,181,105,173,121,220,255,134,68,23,54,27,41,59,51,4,239,206,252,86,13,20,73,52,153,167,0,94,174,40,82,2,39,255,232,255,102,0,0,227,177,254,111,18,75,77,82,4,207,39,119,171,21,232,159,250,99,168,150,89,133,189,67,4,157,186,212,8,148,16,234,194,156,191,191,190,244,219,82,4,139,245,236,185,51,156,70,235,181,109,157,34,171,24,82,4,107,191,126,185,241,30,150,143,97,34,8,50,3,77,83,2,117,201,234,50,150,64,26,185,178,121,220,86,95,31,82,4,235,230,118,171,179,166,8,125,67,100,95,131,233,131,83,40,2,181,151,238,165,26,85,7,255,144,167,240,46,100,82,16,41,172,210,169,231,148,27,198,121,133,199,48,197,248,82,2,207,158,150,51,117,201,159,161,27,31,229,46,221,172,67,34,91,127,148,57,153,197,154,207,247,220,99,217,17,183,83,40,35,44,155,108,181,35,93,204,237,151,21,145,17,19,66,2,27,178,63,171,233,56,247,247,127,6,215,33,93,217,82,34,253,19,170,46,239,128,118,62,149,122,191,81,245,90,66,72,230,201,217,116,160,217,105,180,35,71,138,35,216,194,223,201,66,203,150,69,219,250,229,247,165,201,191,175,111,176,67,232,6,75,170,170,211,231,249,63,96,31,92,176,241,142,67,2,107,239,213,88,144,6,99,91,154,110,42,247,174,239,66,104,6,235,127,106,99,109,224,123,108,128,121,230,152,147,82,2,103,252,219,51,255,176,75,235,142,181,251,177,57,31,67,72,0,240,169,227,101,31,127,63,134,167,194,228,96,3,82,2,171,244,219,63,99,0,219,250,242,56,57,77,221,109,67,2,217,106,197,216,80,190,252,126,115,198,237,249,64,112,67,8,111,195,39,151,111,238,127,61,34,82,218,92,236,111,66,2,91,228,87,180,167,92,94,73,84,149,90,154,241,128,82,2,231,240,74,62,121,184,139,237,109,145,109,38,80,252,83,2,47,169,168,62,99,94,63,82,170,35,0,94,77,0,66,136,179,225,112,199,235,239,23,143,62,22,38,138,221,127,82,36,229,68,44,182,161,32,185,173,210,201,84,230,245,112,81,112,114,76,77,87,253,68,215,219,76,219,93,124,143,11,51,232,157,161,170,186,106,36,20,193,198,101,216,139,216,137,222,141,147,50,145,92,153,50,4,75,21,40,137,32,65,102,83,168,42,172,90,156,197,113,158,190,128,98,54,200,239,102,67,2,101,197,93,88,14,136,208,64,148,134,64,153,56,214,82,2,199,138,64,57,106,65,76,131,138,32,29,0,2,33,67,200,1,112,178,103,111,155,86,173,14,2,123,219,219,140,83,2,125,241,197,55,255,80,122,37,132,14,2,128,32,160,81,136,25,117,191,223,251,205,55,117,242,13,70,123,201,23,66,2,7,139,135,197,195,66,17,33,34,2,33,32,32,2,35,232,6,107,250,76,239,33,76,167,73,128,230,213,226,107,207,113,148,36,249,184,80,120,8,40,44,32,228,139,240,138, +65,2,239,215,239,219,239,223,1,128,169,52,211,76,50,201,66,36,139,194,165,175,98,153,221,127,253,255,253,255,96,248,83,104,6,44,30,135,163,51,79,6,91,191,254,217,254,160,67,2,115,126,63,245,16,49,142,138,60,22,148,158,9,1,82,136,19,172,184,160,80,60,189,206,12,199,223,222,54,98,82,2,135,225,225,90,120,185,207,57,148,22,206,156,18,8,67,40,34,163,88,175,249,125,172,125,33,69,165,198,28,146,66,40,109,245,176,173,153,173,220,167,235,6,221,125,148,41,51,168,154,1,234,104,37,173,69,170,200,240,119,224,79,111,83,2,57,186,173,58,255,255,113,206,118,123,21,244,166,140,67,200,9,44,218,148,150,191,214,169,89,169,46,134,247,16,66,172,224,114,214,107,103,6,7,187,221,2,213,13,154,10,66,136,147,201,235,252,161,95,108,178,198,69,89,7,8,92,83,72,136,129,107,107,209,113,79,17,209,126,108,192,12,237,83,40,74,236,146,101,215,117,59,102,74,106,228,7,67,201,67,232,52,99,61,205,235,191,110,187,163,123,44,148,156,18,83,112,187,106,237,109,87,90,173,142,101,207,11,213,221,226,81,240,30,140,134,223,217,109,223,248,166,105,151,172,222,34,83,232,100,172,80,151,157,115,219,44,119,22,36,80,58,226,65,12,155,233,70,185,161,230,20,194,25,1,197,21,213,80,83,200,53,99,146,38,109,103,183,130,26,71,100,194,158,236,83,136,103,236,150,231,181,35,223,148,229,219,14,127,241,127,83,2,189,185,168,46,187,253,95,207,255,124,157,79,160,217,82,2,111,202,204,117,89,4,178,118,98,204,166,1,84,218,66,40,34,245,154,108,195,4,107,104,173,7,239,207,231,8,67,40,74,99,85,141,126,252,109,253,162,245,232,13,145,99,67,2,209,7,173,214,141,206,11,17,114,223,60,57,102,142,67,2,209,4,109,214,12,69,137,236,216,29,229,230,130,240,67,2,207,6,149,86,76,37,64,251,158,194,40,63,178,196,67,2,229,40,174,96,78,238,200,114,178,85,75,21,136,242,67,2,213,37,133,82,140,27,119,251,232,16,124,233,119,166,67,196,86,214,109,105,78,217,47,41,203,160,66,145,30,0,66,140,187,82,78,138,41,38,111,254,225,170,34,146,86,95,51,4,149,239,9,45,147,61,67,237,62,7,3,176,166,182,67,8,2,208,171,211,111,150,46,170,86,188,64,1,69,60,83,200,153,129,194,4,77,101,137,13,244,80,41,177,98,0,51,240,16,12,103,109,171,197,94,206,90,65,149,11,226,125,66,152,233,246,48,25,49,249,84,19,25,138,252,244,195,23,83,200,3,245,221,219,164,141,126,3,156,241,208,143,89,199,82,136,5,245,60,111,50,176,141,111,30,128,194,209,52,69,223,81,90,77,111,141,177,233,146,46,183,96,66,104,10,127,65,42,9,112,249,116,27,62,70,5,166,144,55,78,35,27,67,2,177,161,91,64,75,196,214,69,64,24,131,164,251,249,66,232,187,201,210,79,174,208,103,223,189,6,234,98,207,168,83,136,31,172,223,172,249,228,190,86,249,41,7,86,0,190,67,2,89,131,85,222,139,240,136,64,88,22,0,200,21,8,83,168,134,33,7,9,173,73,41,15,6,241,142,187,136,211,67,2,119,161,101,208,138,102,201,198,173,164,165,140,148,16,82,72,41,16,14,107,216,50,26,217,69,233,176,36,154,204,82,4,63,187,169,77,85,28,207,118,17,154,103,40,248,231,82,72,14,112,166,185,34,132,71,178,200,32,43,69,32,128,83,232,14,163,235,146,237,238,223,130,129,177,45,82,251,78,33,6,191,62,242,148,87,1,160,57,151,9,90,137,153,58,67,136,19,99,101,157,254,174,236,251,164,45,230,68,158,33,67,4,113,144,214,72,182,148,147,240,245,24,33,241,189,150,83,40,124,117,173,57,163,42,125,3,253,7,173,37,244,27,83,8,61,181,151,233,83,230,47,7,181,208,10,217,209,255,65,234,29,35,67,231,106,119,17,194,164,11,168,11,181,244,83,144,164,102,181,30,127,223,218,46,248,141,203,111,163,112,206,49,74,225,121,250,5,0,0,52,173,203,152,60,43,73,206,113,17,25,0,0,26,115,158,17,87,218,34,0,138,67, +65,106,10,5,14,126,103,137,13,224,60,84,99,112,136,2,83,8,2,227,170,103,109,0,0,64,1,49,2,1,97,28,83,232,125,227,170,231,71,207,181,135,192,71,127,121,103,187,83,200,129,97,103,105,77,139,235,12,0,72,90,238,216,77,67,2,207,234,180,202,13,63,7,134,55,33,211,214,154,9,83,72,28,140,203,57,215,181,233,110,71,125,147,204,159,195,83,48,190,226,233,118,203,26,207,11,144,223,96,97,124,68,83,72,5,227,235,211,238,79,157,135,7,155,23,97,107,43,65,138,85,44,57,243,218,246,252,129,212,94,160,181,71,122,67,2,97,231,149,88,76,151,234,243,1,81,190,64,209,211,83,2,55,201,6,59,160,220,130,121,63,69,177,50,8,183,207,9,174,129,2,30,116,78,190,242,55,29,206,140,46,35,67,40,2,181,41,179,44,180,247,203,128,219,47,185,202,99,83,2,47,193,69,51,190,90,56,246,239,189,175,223,139,29,83,8,2,236,122,223,183,60,189,237,57,113,50,49,111,110,83,2,49,177,230,46,191,143,179,238,91,58,239,5,144,154,65,170,8,117,119,119,35,9,11,40,235,62,27,161,156,2,207,9,154,73,107,186,102,117,47,179,40,7,64,136,152,241,82,76,14,224,46,167,16,248,150,63,54,129,227,48,25,18,66,104,141,73,171,186,98,241,102,221,234,6,13,203,114,44,82,4,47,39,185,171,179,152,187,236,246,143,173,63,218,199,83,40,85,99,171,229,101,83,230,134,15,25,203,248,171,23,83,2,223,127,31,126,229,156,41,91,1,146,107,42,1,12,82,2,87,142,135,246,226,40,243,57,84,221,210,29,16,10,82,240,30,108,78,202,109,173,88,206,89,185,80,33,97,14,83,2,245,192,7,59,25,138,86,186,99,49,246,24,99,220,82,2,171,250,153,31,111,241,238,234,255,170,195,29,150,114,82,196,50,55,75,231,81,40,88,10,82,101,94,196,161,146,82,136,9,80,174,185,42,172,77,178,9,241,11,94,112,4,205,43,51,163,99,155,183,187,223,61,129,180,211,64,154,173,67,2,219,235,181,94,15,215,187,153,244,253,195,246,208,56,67,2,243,107,198,92,144,23,0,213,30,234,184,13,230,214,82,72,28,114,89,84,209,84,24,229,196,5,0,81,143,121,82,40,81,50,220,80,137,36,150,212,19,161,11,118,75,132,67,2,213,202,188,208,80,27,16,190,136,121,99,164,27,141,82,4,147,127,191,187,85,130,58,233,224,207,244,55,247,139,66,136,175,97,242,213,58,87,120,56,214,81,250,219,164,84,66,2,103,73,239,108,177,61,31,144,99,122,187,59,119,187,67,40,75,112,157,254,125,182,85,63,87,139,31,248,8,51,83,2,51,179,171,62,140,166,242,2,226,175,21,176,238,108,67,2,105,176,5,217,146,70,221,207,182,4,99,29,76,179,67,40,16,112,176,38,237,114,181,63,135,168,104,63,245,14,82,2,189,11,63,250,85,177,193,157,218,63,163,15,109,192,83,168,136,129,71,73,79,86,116,84,183,30,74,124,144,54,205,107,59,181,220,250,196,75,126,123,11,91,218,247,230,57,35,200,152,33,40,229,173,255,248,228,69,71,200,158,20,40,65,42,41,108,233,122,117,214,46,35,143,53,148,108,186,177,67,40,124,195,153,174,243,167,237,253,96,246,136,118,218,22,83,2,51,202,7,55,234,82,216,171,200,57,196,92,114,138,66,40,74,75,147,75,59,184,109,127,253,137,237,244,214,11,67,168,7,117,235,103,205,166,224,213,3,230,225,214,244,7,81,112,45,144,75,75,47,41,75,113,155,147,19,14,139,124,66,136,142,233,162,135,0,35,165,157,57,30,208,64,9,226,82,240,30,236,206,169,111,173,218,202,57,5,200,68,237,58,83,40,163,193,41,41,237,228,36,13,114,66,238,164,114,10,67,72,26,149,231,38,74,55,121,177,130,65,36,151,244,178,81,236,132,82,159,199,247,245,123,2,176,134,168,241,191,119,82,2,7,170,128,61,106,65,37,128,78,64,125,75,205,141,83,104,170,210,254,158,30,222,25,30,129,190,118,95,242,99,83,40,142,36,30,31,185,121,250,159,34,190,182,105,234,109,82,136,85,172,168,224,56,88,44,46,26,248,203,167,13,252, +67,2,253,215,159,249,153,102,255,113,163,206,169,66,226,140,66,40,245,105,127,249,43,61,27,49,206,73,255,244,252,254,49,6,204,239,1,177,138,68,98,18,169,74,188,122,181,1,66,232,187,41,10,241,204,41,155,57,206,73,139,254,62,7,65,234,41,227,62,127,31,181,27,178,205,46,181,71,232,28,66,36,7,255,163,192,114,137,216,213,106,253,212,245,93,122,83,104,6,44,20,198,193,242,58,6,219,218,110,108,90,100,67,136,14,117,233,103,73,57,217,177,0,224,83,102,160,135,51,232,112,227,220,83,191,189,125,159,183,137,108,249,6,111,66,2,143,64,11,32,73,27,255,103,52,30,0,186,128,40,66,232,4,117,219,118,201,96,58,182,235,19,11,15,127,255,66,8,35,235,191,43,111,237,47,222,201,132,156,217,216,216,67,2,249,202,183,118,15,204,215,176,243,78,29,3,163,7,67,104,5,53,138,113,30,175,117,221,68,165,140,148,26,18,66,168,162,201,170,252,161,191,54,221,121,30,20,103,171,133,82,144,116,12,227,92,31,140,255,86,154,229,80,147,34,211,66,2,139,210,63,179,169,89,255,247,115,127,50,147,144,106,83,104,5,236,158,167,215,230,89,39,114,207,180,33,146,195,83,2,185,186,170,62,20,146,115,227,188,239,156,181,215,59,65,202,66,163,71,73,175,219,19,138,156,63,121,48,226,245,83,232,145,161,111,79,145,167,37,80,191,144,202,43,136,31,67,240,67,108,181,46,187,86,175,174,13,79,44,28,29,112,65,74,14,236,72,114,57,166,161,129,173,25,67,53,203,116,83,232,59,35,221,242,109,199,174,130,196,99,206,1,252,176,67,40,3,117,171,125,77,102,161,219,130,190,10,196,20,179,65,234,29,172,89,87,179,154,53,81,216,128,206,245,163,188,207,73,129,41,14,111,101,51,47,235,233,15,104,48,217,249,83,40,213,1,3,39,45,41,45,13,191,15,66,0,45,48,83,2,61,218,9,59,121,60,93,251,240,165,46,84,135,103,83,136,43,99,234,33,231,214,174,134,183,54,95,120,133,208,67,104,10,163,176,237,234,182,105,173,96,168,255,208,196,146,67,2,231,66,94,214,12,138,106,226,52,20,159,88,171,157,83,232,11,108,183,229,89,198,125,108,254,46,87,1,133,91,67,2,91,102,109,86,77,101,172,205,119,236,38,74,255,39,83,2,43,170,232,58,169,56,147,95,166,212,59,203,5,252,66,40,212,97,210,155,152,182,96,151,62,15,159,159,30,84,67,4,151,180,212,24,188,144,132,4,24,0,144,244,21,253,65,106,38,195,226,6,203,80,17,198,53,129,0,233,148,137,65,106,5,99,3,41,109,119,19,210,142,88,180,24,92,23,65,10,9,245,48,121,67,7,11,104,36,185,87,49,231,32,82,2,29,32,13,197,219,80,19,133,87,78,245,129,223,118,67,2,221,231,205,102,14,37,17,185,129,72,105,97,162,29,67,168,0,176,146,102,101,43,60,189,6,47,38,162,233,133,67,2,231,105,206,232,77,98,138,99,155,49,163,109,115,196,83,104,139,225,2,39,107,113,147,17,248,231,111,130,107,100,174,7,71,228,52,200,75,123,233,12,97,202,0,174,70,255,83,2,49,201,40,47,16,32,1,160,81,194,156,131,242,187,221,7,147,35,55,245,69,144,91,90,82,67,28,189,71,4,83,136,133,193,226,38,13,7,45,13,216,79,39,44,80,145,82,208,105,76,82,120,51,190,179,57,88,73,192,7,4,139,66,2,219,164,87,222,43,27,224,63,130,228,41,1,190,219,82,2,113,2,205,184,89,40,237,101,125,245,115,177,12,96,223,41,14,3,34,46,133,228,204,210,252,169,30,14,26,74,82,36,125,245,98,69,181,148,180,205,213,169,86,54,55,216,83,136,27,245,157,110,173,47,63,3,20,16,27,242,112,234,83,72,6,181,158,111,175,31,91,3,130,228,13,163,56,201,66,2,109,148,247,152,54,86,72,255,64,51,158,49,17,153,83,72,233,65,37,39,47,7,9,13,148,144,191,240,85,178,82,232,57,16,186,8,171,107,37,154,185,100,182,103,205,68,222,17,95,201,186,175,0,0,88,244,186,140,129,17,11,177,222,141,3,241,157,182,0,0,96,0,36,100,15,42,130,112, +67,8,2,131,198,87,176,14,0,0,144,16,17,195,70,112,83,168,134,177,236,0,94,77,113,13,250,64,21,88,241,31,83,2,253,185,202,50,84,110,45,42,67,181,114,52,61,36,67,8,1,112,208,165,101,41,94,181,134,243,193,227,5,53,82,4,75,107,105,169,115,41,200,9,148,83,168,175,181,242,205,199,146,207,45,145,75,4,20,80,148,54,33,65,166,118,82,208,94,140,210,154,227,139,92,111,30,137,15,201,114,36,67,232,119,245,45,173,164,194,85,223,66,185,104,63,19,203,82,2,231,240,154,94,89,193,53,19,99,32,135,72,214,63,67,196,60,144,100,25,37,164,206,80,72,126,159,156,90,253,83,200,24,204,227,254,167,124,89,52,216,59,85,94,81,248,82,16,129,198,241,222,245,158,62,187,169,72,169,216,73,122,67,2,95,228,85,222,140,238,47,244,162,107,219,246,13,0,67,40,1,245,62,189,170,182,245,237,64,239,195,172,164,171,66,108,139,82,74,122,165,37,85,254,79,34,80,25,144,153,66,2,179,124,59,191,159,56,194,228,164,185,172,23,188,5,82,12,23,224,46,191,114,129,109,16,155,40,173,14,162,91,66,236,141,146,181,200,97,37,15,214,2,255,92,249,150,93,83,2,125,249,199,63,239,61,191,222,34,231,10,240,2,196,81,234,117,227,232,120,173,246,161,138,120,17,197,108,203,91,83,2,187,241,201,63,173,221,127,238,191,255,127,249,126,0,67,2,249,179,103,251,152,228,240,216,109,132,177,211,223,151,35,168,22,81,190,222,222,31,190,30,159,157,33,216,138,30,66,2,15,210,7,161,195,45,119,3,183,187,187,119,177,183,66,138,222,242,126,117,234,17,230,247,110,247,160,177,15,24,83,136,8,236,124,159,249,41,14,173,32,44,185,110,126,254,66,144,185,166,109,93,123,150,223,185,68,41,58,131,55,252,82,232,4,163,96,171,126,223,60,229,21,146,19,251,168,186,51,36,27,59,138,47,155,95,107,3,223,158,109,237,246,109,67,2,215,103,173,90,80,95,142,160,173,189,90,53,111,165,81,236,240,228,184,148,74,171,121,106,184,173,216,175,112,127,67,232,13,146,92,138,182,237,154,165,129,150,32,192,128,97,67,2,119,45,206,84,81,69,108,169,48,5,214,110,156,237,50,40,202,201,216,76,131,218,189,180,185,221,240,115,240,67,82,104,5,35,56,207,182,214,166,55,19,106,137,105,208,14,67,2,75,139,188,206,80,236,153,228,183,33,195,224,192,0,66,2,119,101,251,244,241,61,206,208,11,66,19,4,59,236,82,4,115,102,177,251,51,189,242,111,95,169,173,57,21,88,83,2,243,169,168,58,119,100,56,188,246,18,233,224,84,218,82,2,83,244,152,54,251,0,247,148,124,47,37,83,93,230,82,2,173,9,235,193,197,88,101,207,184,163,53,188,47,234,82,232,25,208,227,235,170,219,201,162,234,88,21,159,118,122,67,104,55,108,43,149,138,215,221,108,27,241,246,182,52,200,82,2,161,73,121,162,85,113,199,218,196,213,192,184,136,207,82,40,21,245,222,246,145,222,158,183,30,24,166,232,24,124,67,2,35,91,122,53,150,0,183,163,172,30,154,209,54,156,83,2,61,241,164,51,191,17,188,41,65,130,16,200,41,98,67,72,49,35,119,149,185,126,236,125,35,0,188,186,140,247,82,168,48,245,216,218,80,147,228,229,31,112,26,230,231,209,65,234,191,132,190,103,163,209,97,122,137,247,26,100,161,120,67,40,124,48,165,236,81,235,190,62,135,182,192,180,57,27,67,232,17,44,235,108,206,209,86,168,92,117,253,20,30,249,83,200,3,172,245,116,249,51,223,36,119,131,152,95,3,39,67,136,9,35,37,205,111,174,169,173,162,165,136,148,91,62,82,4,167,45,183,187,35,21,176,77,183,173,175,224,110,3,205,7,147,41,222,22,164,250,74,50,181,103,243,14,100,188,83,200,152,225,103,71,175,165,199,15,208,14,176,2,121,3,34,108,6,204,126,217,61,244,194,31,89,79,145,170,0,2,82,40,75,112,234,104,35,149,71,162,234,136,207,217,115,4,67,2,253,197,135,248,143,252,0,80,110,64,24,91,182,132,51,2,189,255,201,253,199,241,81,129,47,227,214,94,76,168, +83,200,152,161,73,39,143,167,199,15,0,71,128,21,180,231,67,2,255,232,159,248,14,206,10,82,166,69,57,113,162,142,67,2,253,211,111,251,24,204,154,113,179,204,10,122,162,158,66,36,7,7,165,160,210,152,196,240,78,245,76,40,70,213,67,196,250,158,239,41,239,141,253,105,67,183,180,230,113,208,67,2,179,223,251,203,94,188,179,21,124,148,22,243,241,140,67,34,253,184,167,113,27,88,217,185,231,148,30,51,35,156,67,2,69,191,236,213,93,124,4,216,20,247,209,19,93,148,82,168,168,41,173,220,177,151,143,143,13,228,198,167,201,6,205,43,14,44,44,24,46,89,37,15,3,229,180,254,103,11,65,236,63,50,250,41,141,163,172,181,110,15,255,255,252,63,83,144,228,44,134,8,89,230,150,160,82,98,106,81,228,18,66,136,222,169,157,37,158,41,219,121,203,83,255,255,252,252,66,36,75,67,165,160,82,152,255,223,255,205,95,122,95,37,66,36,75,70,165,160,82,152,255,93,255,85,247,255,112,133,65,138,147,100,187,47,115,181,123,50,137,49,82,80,34,144,83,0,239,239,239,237,239,237,1,0,199,255,255,255,175,254,33,186,211,162,78,249,123,231,62,114,2,242,27,120,67,250,83,72,224,41,223,180,214,113,81,19,107,190,147,1,136,254,82,240,146,230,222,246,117,151,173,172,185,164,116,25,137,100,51,4,235,217,46,117,16,180,235,254,145,149,184,81,4,88,82,2,195,251,73,147,113,17,205,89,216,223,33,56,85,135,66,72,156,33,90,245,237,63,79,126,230,89,42,170,249,63,206,241,70,237,236,135,245,169,63,51,100,106,74,195,72,229,82,168,8,48,146,89,216,234,173,178,233,36,120,20,253,252,82,176,83,172,57,183,175,173,118,78,138,121,250,245,65,130,83,168,131,233,8,173,75,73,75,13,121,77,56,0,223,255,82,4,19,102,57,233,21,144,146,95,159,201,55,53,243,246,83,104,144,97,71,41,205,196,10,11,175,146,247,130,76,186,82,168,13,176,141,102,228,154,73,54,202,164,246,35,129,3,81,42,145,228,153,248,223,253,38,140,208,117,101,211,81,111,83,2,249,209,41,63,206,42,156,131,209,49,27,200,121,62,82,2,155,138,216,29,107,17,210,94,144,123,154,229,174,8,66,2,101,131,109,135,188,37,101,32,187,73,218,46,156,46,83,2,55,211,12,67,237,182,96,113,152,81,82,24,157,20,67,4,81,144,208,24,160,121,21,66,106,113,155,12,228,250,67,4,185,212,22,89,222,181,170,41,127,238,119,104,168,46,205,7,39,44,189,142,223,96,185,157,206,166,146,155,111,31,83,72,207,225,16,243,84,67,39,11,248,47,37,36,101,19,67,72,14,181,43,245,243,234,97,206,128,184,248,137,100,72,83,2,109,193,71,59,190,148,64,120,46,79,131,60,200,52,83,232,98,213,222,63,109,231,45,3,255,107,47,64,14,96,82,4,49,152,147,95,245,22,210,233,146,146,229,91,86,250,34,208,32,227,4,70,26,99,15,202,56,235,166,254,74,53,81,144,32,44,170,54,156,3,67,152,44,83,91,43,233,200,65,202,66,67,67,103,205,238,22,198,168,48,155,238,79,80,66,136,131,201,133,87,40,200,210,223,248,6,52,41,33,187,67,200,7,99,145,139,157,206,191,183,32,18,17,144,58,191,35,144,32,204,255,175,163,220,47,215,255,9,172,40,240,76,83,194,178,42,163,182,24,73,101,28,224,237,77,126,255,59,67,136,14,35,34,157,237,126,220,235,161,188,3,209,248,67,65,106,55,245,240,186,186,246,20,192,73,89,23,225,2,176,34,172,42,208,38,235,172,171,111,145,114,228,11,254,68,0,67,2,231,195,77,218,77,57,124,25,144,157,176,86,145,103,223,201,155,161,54,9,105,187,8,174,217,176,130,47,72,128,67,104,13,48,234,34,103,29,94,49,20,87,100,186,98,240,82,2,45,105,123,206,95,100,93,190,106,247,56,175,130,202,51,80,67,167,112,118,49,56,220,255,87,168,110,228,159,125,67,2,125,161,77,80,140,211,153,200,56,172,37,70,145,16,206,241,16,25,0,0,18,99,253,157,105,44,97,52,67,66,206,141,3,227,225,147,77,1,0,96,96,0,6,80,6,218, +222,185,233,14,0,208,184,159,221,59,222,147,66,250,15,28,83,104,219,241,14,1,94,75,143,11,36,96,18,191,240,23,83,2,243,208,101,51,94,66,45,136,88,20,207,3,226,93,65,10,23,131,239,18,77,85,19,2,143,114,13,18,67,200,67,196,62,50,61,1,68,89,70,188,131,25,82,179,192,3,67,196,82,245,253,40,128,239,19,47,189,242,255,105,42,60,67,196,206,116,29,73,202,91,62,80,184,21,72,98,109,73,66,2,227,164,105,162,123,89,237,64,115,167,119,255,127,119,82,176,54,76,66,169,175,189,56,202,105,5,219,211,57,65,65,42,14,131,105,109,17,183,31,50,129,124,225,139,159,251,82,4,203,230,118,105,213,32,17,72,68,18,33,89,64,142,67,2,223,135,141,90,13,229,248,57,15,65,82,168,249,3,82,4,235,166,244,105,181,50,9,91,69,48,59,36,68,90,82,4,147,46,247,183,17,33,81,72,152,150,29,45,53,22,82,196,132,131,123,127,17,124,143,232,99,165,86,58,246,142,82,4,143,246,246,249,49,88,174,168,230,255,116,62,164,234,67,4,215,246,20,217,236,105,213,47,39,111,253,94,35,229,66,212,8,224,47,125,181,157,218,8,82,223,42,250,221,121,82,4,147,39,127,219,117,131,168,235,203,137,112,234,165,92,83,136,31,53,132,56,71,30,255,3,252,11,236,53,186,129,67,72,154,33,73,250,252,212,213,42,81,116,247,190,222,195,82,2,151,180,214,246,252,152,162,204,238,230,218,28,61,32,34,152,254,218,89,11,55,255,215,254,215,3,162,64,8,64,67,2,117,140,215,122,81,131,202,176,242,108,59,209,39,132,83,8,2,227,248,127,101,198,140,130,219,88,103,133,0,140,67,2,77,200,220,210,76,76,168,51,250,192,249,41,34,188,35,240,148,198,251,200,95,85,87,189,68,41,130,204,175,6,67,2,211,11,229,214,15,100,186,49,51,238,187,141,118,21,83,8,215,73,150,178,178,184,218,90,0,98,120,251,75,205,82,2,175,134,77,117,107,36,227,99,93,78,93,36,220,149,82,200,24,35,211,187,182,159,116,165,21,102,33,214,186,247,67,2,89,107,237,94,77,110,185,154,188,220,193,116,93,245,66,2,215,127,215,187,169,56,247,80,121,123,194,221,45,82,83,2,53,201,7,59,245,140,148,210,108,217,152,222,61,48,82,40,17,112,174,217,106,156,42,46,9,37,163,131,216,63,83,136,19,108,179,45,229,59,223,12,153,147,26,203,92,122,67,2,245,42,174,88,79,85,229,147,212,62,164,25,12,205,82,168,34,227,214,182,218,252,117,47,23,166,135,77,121,12,82,232,99,181,56,243,121,245,92,231,30,216,199,87,1,9,67,2,115,229,109,214,13,188,171,209,214,126,19,164,23,72,65,108,59,50,207,63,114,41,140,102,161,19,240,254,176,179,82,2,131,182,135,54,251,0,127,219,79,177,27,98,166,172,67,104,13,208,75,87,231,226,119,175,23,83,16,67,81,144,66,2,151,252,67,182,167,63,16,177,193,114,110,174,146,50,67,168,86,240,151,186,245,168,48,181,14,147,23,39,33,13,66,2,19,33,15,22,7,59,255,119,127,109,223,14,29,0,67,2,255,217,183,251,91,93,204,89,183,238,47,84,7,189,83,2,211,87,191,125,247,222,182,239,72,103,71,118,143,5,82,48,217,66,175,199,243,209,241,183,62,16,60,225,164,249,66,2,11,143,138,135,197,37,52,145,25,57,17,211,224,223,65,42,143,68,124,223,235,243,116,170,207,61,108,45,112,155,82,196,240,237,229,227,113,247,79,252,247,231,251,94,21,216,81,42,252,100,19,215,153,252,100,150,13,165,61,100,151,188,66,2,135,167,7,79,135,39,222,217,103,90,63,80,123,55,82,104,5,117,8,199,54,135,42,29,27,100,230,15,203,49,66,8,157,161,241,151,124,254,237,230,231,87,47,189,240,83,83,232,119,172,148,45,193,43,77,222,40,98,86,148,118,48,81,144,48,140,110,85,254,182,233,127,118,215,91,49,178,95,66,200,9,113,122,150,180,191,26,119,53,159,245,89,138,30,33,10,27,44,61,94,91,155,95,243,66,181,162,234,116,139,50,136,159,97,66,23,210,253,37,48,193,122,36,182,77,189, +82,36,255,77,63,232,49,244,190,17,94,191,109,95,187,214,66,2,103,171,123,231,189,23,8,110,6,65,219,24,240,91,67,104,5,208,15,174,254,135,68,94,23,184,64,6,131,98,82,72,74,208,79,127,59,102,102,162,236,40,208,247,146,249,83,104,5,35,208,34,231,188,157,134,218,67,238,36,59,16,83,104,133,97,230,68,237,233,211,21,179,132,133,227,242,113,82,2,67,248,112,63,70,65,214,148,10,183,168,130,85,50,66,232,240,233,41,189,168,39,90,49,204,81,247,63,63,158,66,2,7,185,135,183,197,24,255,13,255,63,223,243,251,255,81,112,180,4,95,159,30,191,254,255,62,31,72,186,233,66,67,2,251,181,143,251,26,68,152,48,59,204,186,90,164,108,67,2,125,207,71,251,23,160,141,24,167,76,41,91,102,172,35,136,94,241,220,253,253,94,95,95,127,159,137,71,149,137,66,2,11,10,10,197,131,3,85,85,85,85,85,21,85,14,82,34,11,133,162,80,20,65,76,146,56,21,175,167,196,148,83,0,241,227,241,227,241,227,1,0,91,186,193,115,91,117,67,168,129,18,219,123,251,95,254,30,0,171,168,167,182,155,205,7,125,182,100,9,221,129,171,236,174,64,222,139,168,141,83,200,131,105,155,145,217,221,223,91,128,126,228,217,31,238,83,168,7,44,91,212,183,41,28,28,0,121,155,59,188,243,51,4,43,251,242,181,25,213,60,207,102,53,215,18,208,164,82,168,0,144,149,103,220,146,72,30,202,100,254,32,96,41,83,8,131,97,7,5,77,149,145,19,194,78,253,104,222,59,82,168,8,181,111,86,234,196,159,48,12,120,158,243,102,134,66,232,31,35,193,230,142,142,79,164,105,137,223,59,55,134,83,2,121,210,233,54,34,189,66,82,43,192,245,201,89,168,67,4,153,182,212,8,128,146,194,218,30,183,164,156,158,218,51,232,207,129,21,87,102,171,137,34,234,0,63,98,14,246,67,2,203,226,76,92,139,70,58,247,110,224,156,160,174,65,83,2,237,178,10,59,176,223,230,85,202,21,147,104,169,64,82,4,23,214,35,207,129,21,83,175,148,234,253,160,144,134,83,2,111,168,133,50,212,188,3,72,46,0,202,140,124,127,82,248,148,236,182,223,220,119,211,189,160,64,206,253,26,174,83,72,1,181,149,250,134,159,120,6,8,168,157,223,115,7,66,2,101,137,238,148,50,55,99,14,155,2,215,12,247,47,82,104,38,144,21,104,32,139,103,42,27,133,93,201,115,74,67,2,87,160,77,100,77,244,2,218,146,64,67,76,203,121,83,2,115,210,107,59,171,154,86,74,47,220,174,9,177,24,33,138,100,3,85,157,115,189,191,95,157,23,192,60,196,32,223,241,222,234,107,243,217,250,102,231,131,136,15,201,128,155,81,170,192,132,185,190,189,228,97,128,74,22,136,251,173,107,82,40,85,112,129,70,224,122,7,182,184,160,232,208,90,248,67,2,103,73,158,224,13,11,17,238,223,235,104,121,94,163,67,2,241,198,150,104,143,227,117,213,253,249,195,68,156,1,205,139,213,193,224,83,70,171,124,169,6,223,99,1,232,168,67,104,14,149,55,118,234,250,100,215,129,18,180,240,182,39,82,168,26,48,150,120,164,187,9,174,232,40,112,51,101,37,83,72,167,97,37,39,141,103,135,13,117,159,198,242,17,130,65,170,8,35,5,39,77,51,23,66,136,9,135,104,23,43,83,136,141,161,78,115,13,39,11,11,52,24,24,51,93,191,83,2,45,160,164,46,52,159,3,181,189,144,132,131,125,46,82,72,86,18,49,137,122,146,8,39,144,161,179,32,4,255,67,168,7,208,225,211,78,233,159,155,71,210,216,36,4,86,67,2,225,99,85,220,12,112,121,235,110,51,219,75,88,1,67,176,80,101,247,119,92,189,205,149,98,1,99,56,198,6,66,144,32,236,249,111,244,254,218,255,190,21,72,61,223,28,67,40,1,149,226,126,252,162,36,142,132,31,108,216,186,141,67,40,104,208,242,187,111,56,56,181,70,165,113,21,141,8,82,4,91,187,27,159,51,9,211,151,170,29,81,47,108,130,34,240,16,25,0,0,34,149,22,18,105,34,35,224,16,0,222,17,95,201,120,155,0,0,120,184,208,141,33,134,113,37, +50,216,129,90,185,215,159,253,247,0,0,32,102,151,236,147,221,11,2,99,147,172,180,2,0,0,68,20,15,252,168,253,67,136,19,163,176,229,94,103,108,45,164,47,228,133,188,182,83,8,190,161,137,107,17,229,198,14,249,150,173,148,42,50,67,2,189,99,100,88,140,143,243,186,65,50,116,220,20,150,82,2,7,144,147,210,120,96,190,238,190,191,180,103,51,112,66,234,159,242,56,125,127,19,183,250,39,228,147,93,64,137,83,8,1,236,122,159,183,45,191,38,243,44,52,90,149,4,82,2,27,254,215,23,101,229,34,111,183,240,216,137,218,1,83,104,141,193,207,111,49,39,71,15,108,173,5,189,185,163,82,138,87,32,150,44,146,217,133,245,30,253,98,237,22,207,83,8,9,117,247,249,249,246,183,6,204,143,61,94,169,147,82,204,59,192,123,183,49,217,75,83,100,43,201,251,153,188,67,72,83,117,89,227,168,122,147,48,147,48,11,228,195,94,66,2,11,65,143,166,137,94,51,169,211,225,223,1,127,8,66,172,162,18,198,137,109,39,255,130,32,130,175,240,232,38,67,104,21,35,154,177,143,189,60,239,97,164,201,12,19,143,67,2,253,216,151,251,26,213,66,128,11,183,91,114,127,162,82,80,175,236,28,156,247,166,242,220,133,98,55,10,251,99,67,2,119,173,246,96,18,78,137,174,231,148,166,179,0,163,67,168,36,112,188,125,87,167,21,47,79,233,55,112,6,140,81,170,132,100,57,30,247,179,166,103,201,58,194,170,6,142,82,104,5,112,39,189,50,196,11,183,25,169,83,251,16,174,51,136,159,65,18,122,218,179,164,30,250,192,238,96,183,138,81,138,50,76,210,42,173,173,84,81,219,5,209,7,194,223,83,200,152,137,148,148,156,137,139,17,192,44,35,11,149,13,66,2,99,57,103,222,43,29,208,165,73,241,218,146,170,141,67,72,0,195,18,94,123,182,238,165,97,7,84,127,103,18,83,2,41,170,233,62,210,120,85,237,83,154,152,48,40,69,205,203,224,225,74,35,111,43,85,174,23,28,26,131,204,44,66,2,83,173,83,224,39,28,178,31,253,13,255,19,127,237,35,8,182,161,188,191,122,53,38,131,222,7,109,24,3,32,67,2,109,139,198,100,80,129,170,226,63,127,250,93,235,173,67,2,87,71,141,86,79,40,224,67,176,32,219,156,191,131,67,2,75,136,148,78,144,19,0,210,137,40,254,239,85,228,35,8,21,117,223,172,225,214,236,32,171,11,74,12,105,143,67,2,177,26,123,191,85,22,4,184,77,224,218,230,234,53,66,2,107,65,250,34,119,63,237,251,233,90,1,236,173,40,67,2,27,25,98,53,85,8,49,105,212,31,210,148,172,148,81,8,1,203,212,205,60,57,75,182,55,171,39,89,81,112,67,104,141,73,155,169,208,163,235,215,129,160,201,242,210,152,82,2,101,1,42,192,15,40,230,146,107,36,145,72,2,17,81,44,142,4,175,119,199,229,127,89,111,127,107,252,115,249,67,2,123,166,111,248,14,68,232,16,42,64,140,66,22,16,222,205,131,178,82,140,131,41,38,223,183,136,6,126,235,211,82,196,238,239,239,249,41,173,144,74,247,171,228,127,22,72,82,0,237,229,237,231,237,229,1,0,0,184,220,94,181,132,67,8,27,108,191,215,231,201,231,181,159,55,182,219,217,243,83,72,135,228,221,254,222,158,190,158,234,102,111,19,210,6,50,84,66,96,60,28,199,69,137,152,145,188,84,32,149,79,65,74,247,196,157,223,231,239,116,194,249,197,240,34,235,242,81,2,241,219,237,221,227,209,65,90,242,117,221,7,225,248,223,197,236,237,233,239,129,219,7,182,159,242,117,142,241,131,82,34,11,171,98,117,164,72,197,134,9,4,101,99,85,231,81,2,239,239,239,241,239,225,129,82,143,88,170,238,38,93,65,74,134,36,174,223,239,243,125,82,184,89,31,76,2,246,83,8,3,108,90,158,247,48,26,36,255,78,229,2,102,250,35,4,7,139,135,133,197,68,197,112,181,236,167,69,121,172,82,2,195,141,160,90,102,73,69,88,79,145,208,43,24,232,205,199,218,95,172,28,255,96,222,187,3,45,251,218,235,239,206,241,89,67,234,104,37,205,213,90,109,41,167,127,15,203, +83,232,81,108,92,29,181,50,75,31,240,26,202,43,180,109,19,208,28,140,118,217,191,102,209,217,118,85,29,251,136,100,83,72,1,236,146,111,179,107,217,149,73,149,22,214,79,34,82,4,167,51,255,235,101,134,16,39,111,202,197,127,151,135,82,2,239,107,110,198,223,176,206,74,180,181,28,116,10,90,83,104,6,172,158,110,183,199,119,6,254,221,15,249,242,47,66,2,205,175,208,107,248,26,249,255,92,127,68,190,8,228,67,136,31,48,201,184,121,180,120,173,78,93,44,194,143,226,82,232,119,112,35,170,100,148,167,157,231,208,135,153,73,145,82,136,14,144,30,12,183,125,72,30,235,36,240,5,243,41,66,72,154,193,208,221,175,181,105,235,153,71,19,239,127,255,83,232,132,210,62,31,31,223,94,31,197,78,170,130,10,228,67,2,123,199,23,123,22,38,240,113,142,64,25,111,38,156,66,2,139,205,11,167,197,90,213,117,224,243,217,255,245,255,175,153,198,100,56,40,139,71,96,48,148,67,8,202,155,195,81,8,9,240,239,231,18,245,122,154,199,251,152,82,228,94,67,104,5,176,155,172,187,90,191,186,5,246,175,173,118,209,82,4,135,100,47,217,37,158,100,107,103,197,89,119,110,10,67,168,26,172,157,117,194,205,78,99,91,181,173,228,182,32,66,2,205,47,209,237,240,90,140,122,64,189,160,63,177,251,65,10,9,117,119,151,186,212,18,160,103,134,52,21,31,194,83,104,13,203,6,191,84,102,149,133,11,119,244,118,207,14,82,40,35,16,175,216,36,195,205,58,11,69,255,135,130,134,83,72,211,129,109,79,111,101,103,13,240,14,232,96,158,236,83,2,51,193,231,50,90,218,197,65,59,64,167,130,114,242,83,2,177,192,37,55,239,13,243,175,110,50,18,78,33,99,66,44,203,178,57,121,161,37,85,2,127,138,217,128,247,0,65,202,24,204,251,215,209,182,235,171,7,88,35,240,124,64,67,4,111,144,178,40,36,16,211,210,102,184,116,144,220,60,67,232,99,195,22,141,54,140,101,110,33,151,223,115,59,169,67,72,7,240,139,226,77,191,151,47,6,26,0,104,100,242,83,232,86,140,205,251,39,198,115,84,182,105,225,78,153,227,83,168,134,33,41,233,110,71,73,13,90,9,58,121,15,164,67,2,221,160,69,92,12,85,78,222,206,136,183,108,20,137,83,2,175,184,229,46,128,126,143,177,228,24,138,136,105,29,83,2,233,160,231,54,86,82,224,141,17,103,70,89,142,7,67,2,221,165,173,90,75,67,217,192,233,255,20,130,215,18,83,80,175,204,205,251,53,214,206,162,170,224,198,134,54,185,81,170,128,228,119,108,185,251,38,183,15,108,27,59,170,81,67,168,7,227,68,87,56,174,239,117,164,211,173,69,21,97,82,40,35,48,34,169,42,132,35,30,217,196,151,14,18,2,67,4,79,146,176,200,26,52,200,145,120,87,123,229,86,171,82,4,63,185,155,79,179,190,243,234,247,63,169,73,97,22,49,74,156,193,160,50,215,204,165,251,161,252,179,129,233,131,81,170,31,12,202,250,238,197,80,204,105,189,51,50,176,10,83,168,230,65,39,73,141,105,175,13,6,184,66,13,23,102,223,201,59,85,150,105,243,140,76,73,245,96,156,186,54,56,65,146,185,2,74,26,29,173,59,32,24,93,39,7,128,73,66,80,117,112,188,223,55,205,219,14,199,53,10,216,64,239,67,8,75,131,22,77,157,238,122,189,36,101,180,163,49,132,83,136,142,161,101,39,45,39,73,17,143,83,162,134,14,90,67,2,127,233,157,214,141,205,200,52,43,31,207,79,64,107,83,104,204,129,75,75,239,143,81,21,141,33,39,124,232,239,83,40,130,161,137,107,207,2,197,12,164,14,45,223,177,134,67,4,77,110,178,152,246,164,84,210,230,16,81,75,229,70,83,40,17,236,221,63,139,190,91,245,239,103,71,160,76,129,83,2,53,201,7,55,6,97,191,137,4,37,4,150,171,83,66,136,231,193,52,223,171,238,214,140,61,22,96,219,175,78,66,48,6,172,174,101,49,238,47,212,246,19,235,32,226,186,205,139,3,35,167,15,81,84,0,0,64,184,131,137,146,98,205,19,95,225,111,46,0,0,153,211,152,32,33,2,16,8, +65,10,2,131,101,105,15,0,0,233,51,124,192,118,140,88,34,16,34,231,236,236,158,199,139,199,0,0,64,32,60,15,67,72,0,163,242,253,110,166,232,125,162,29,69,9,2,210,83,2,51,194,234,58,233,173,112,158,6,37,255,54,219,192,65,202,1,236,56,78,121,175,114,153,121,202,197,92,216,172,66,36,85,226,170,9,198,156,198,42,172,2,150,74,153,143,66,170,131,178,169,189,182,29,248,86,68,184,176,55,84,57,82,36,217,91,221,236,82,25,239,211,158,60,151,82,11,217,35,172,135,196,63,187,169,83,21,249,127,79,152,221,156,166,81,74,27,12,231,252,30,156,152,128,98,56,179,154,64,68,65,138,25,172,217,243,206,125,175,184,123,252,186,139,97,9,82,108,61,160,223,167,242,246,148,33,26,16,166,162,41,209,83,2,51,201,39,63,144,199,236,128,77,199,114,123,37,205,83,8,2,108,189,44,131,125,203,204,203,208,87,238,10,103,83,2,51,202,73,63,33,132,152,157,15,3,75,255,19,96,82,2,139,157,35,87,70,101,63,112,245,157,241,215,246,102,67,2,233,208,6,239,18,24,206,168,190,244,195,243,42,157,83,2,173,177,232,62,208,148,226,115,146,169,234,94,87,123,83,2,181,201,9,67,165,213,220,106,52,173,5,84,191,5,83,2,63,241,166,55,229,103,120,191,101,63,99,63,177,138,83,2,227,143,95,122,0,43,73,164,80,66,202,202,69,56,67,2,219,132,93,90,78,23,190,160,46,190,79,145,238,142,83,2,97,137,136,62,169,35,229,161,11,185,239,14,234,63,205,7,23,94,189,142,202,161,155,3,102,185,100,246,47,175,66,20,0,224,41,174,246,139,111,149,34,249,40,2,229,154,82,4,75,242,98,219,81,156,91,32,227,249,4,128,49,20,66,76,1,76,85,145,153,149,245,45,90,173,42,250,166,242,82,4,75,231,188,235,179,126,175,107,129,145,186,126,137,168,67,2,99,11,174,94,80,189,177,30,246,245,179,247,122,3,82,104,5,48,195,28,233,156,99,158,234,36,96,87,59,188,83,40,169,33,37,73,175,198,10,13,140,111,224,231,52,210,82,2,43,168,155,85,115,40,139,114,52,238,8,41,27,156,67,2,223,136,149,86,79,140,171,129,118,137,204,98,129,83,67,168,0,48,154,118,103,43,85,171,142,25,229,203,173,202,82,136,228,137,52,57,114,171,61,59,23,64,35,25,22,133,82,2,151,174,90,118,255,56,42,61,209,80,192,212,1,32,82,2,39,132,28,149,105,1,193,10,218,255,111,149,85,87,83,168,146,225,226,4,237,4,105,17,7,25,34,4,10,248,82,40,1,208,17,105,176,235,111,79,157,229,216,235,177,161,67,2,219,33,62,110,13,108,20,56,197,152,32,32,4,80,83,8,62,108,48,141,149,228,154,109,109,38,55,49,7,26,205,199,238,117,185,157,252,42,195,255,146,127,41,3,168,65,81,2,229,215,215,203,201,183,1,218,135,142,31,174,205,235,67,2,203,254,236,215,157,225,219,8,188,206,3,116,34,7,82,144,176,4,175,63,46,167,127,123,158,100,254,34,119,222,67,2,69,159,236,211,29,109,221,195,246,126,192,91,46,232,82,2,71,191,161,63,204,192,36,128,9,13,47,98,76,132,67,4,224,235,1,168,254,89,129,180,25,240,182,252,148,146,83,232,171,196,156,190,190,94,126,159,227,158,238,218,78,236,67,2,253,181,111,119,88,3,142,56,54,76,57,115,38,132,82,2,7,154,209,91,100,209,134,187,232,19,161,46,68,164,83,200,195,164,125,126,126,254,221,158,255,255,117,59,139,182,65,138,136,82,175,191,191,219,121,144,134,193,204,162,162,3,82,194,240,237,235,205,1,200,197,162,233,90,103,110,205,188,65,74,133,96,222,190,221,30,0,32,146,134,251,166,34,0,82,2,195,237,160,49,46,64,100,162,8,87,39,42,69,164,223,41,162,201,115,175,57,238,175,195,62,129,29,251,183,239,223,37,117,114,255,247,92,93,183,253,219,214,205,27,16,255,51,36,119,112,15,247,157,255,90,174,141,144,124,177,13,11,67,2,253,211,95,119,24,196,185,122,38,64,57,29,34,132,67,136,19,76,175,191,195,189,209,231,28,165,130,4,20,130, +222,9,43,171,248,43,191,233,246,116,158,75,248,225,233,200,67,136,19,53,73,113,239,223,45,164,146,167,177,180,6,222,67,136,85,35,152,249,77,127,233,103,34,147,14,112,74,190,50,4,171,185,95,111,55,73,129,39,106,155,103,87,168,3,51,80,9,76,227,139,181,165,189,247,110,177,225,4,54,161,50,72,154,105,139,213,111,250,189,115,31,141,244,176,205,57,82,8,1,108,59,101,181,53,57,121,125,6,130,154,53,219,82,2,127,41,46,234,221,216,247,104,215,189,218,83,185,111,66,2,253,159,109,227,250,54,51,123,214,190,9,220,149,147,207,137,103,181,154,239,243,182,69,117,100,75,225,22,101,198,67,2,43,187,98,185,147,204,200,150,238,21,149,110,65,64,51,144,32,12,235,46,115,165,247,86,203,224,122,92,32,175,33,198,216,214,39,154,234,151,140,93,186,183,210,35,112,141,67,104,5,227,157,254,117,255,122,237,99,190,144,30,146,2,83,200,24,108,149,31,207,171,42,45,207,176,230,219,176,127,34,72,136,1,133,94,239,134,61,145,52,223,91,81,99,164,83,168,8,35,233,18,79,247,140,130,208,238,6,177,205,93,65,74,0,44,201,114,167,85,231,48,199,180,254,67,16,150,65,234,99,99,69,39,75,151,25,198,100,11,16,61,62,205,66,232,79,245,152,101,211,219,79,120,171,15,187,163,229,45,82,40,17,245,76,242,173,36,222,174,14,164,78,57,188,222,51,4,63,69,132,80,140,132,3,218,52,35,19,32,45,253,67,4,119,182,212,8,129,80,86,210,188,82,180,188,254,146,67,4,45,110,176,168,150,32,178,210,154,247,105,253,225,146,83,2,123,192,133,46,57,104,152,110,39,92,51,196,37,128,67,136,85,112,170,150,239,52,24,117,84,155,206,201,131,67,67,2,227,196,125,96,75,16,35,70,141,211,110,68,230,239,34,44,100,245,157,239,135,154,122,34,82,132,119,7,176,247,65,10,3,240,244,55,107,140,207,64,36,187,231,209,184,91,83,136,131,129,48,149,109,101,73,13,0,233,25,219,75,121,50,16,129,113,56,88,59,174,214,206,69,51,208,42,15,15,82,4,93,201,91,159,233,52,4,197,0,48,0,196,29,185,83,136,14,195,98,151,231,252,213,130,96,40,242,43,245,77,221,235,4,213,189,104,169,120,68,42,0,93,168,63,157,149,67,136,19,240,73,231,231,172,92,170,22,13,161,37,150,193,83,168,13,227,138,23,110,90,117,131,18,141,2,140,243,244,51,16,86,108,82,11,231,164,81,41,167,177,137,79,209,47,83,72,142,225,2,231,42,41,75,15,253,4,168,113,254,190,82,232,99,181,89,215,157,209,140,183,28,232,133,101,169,33,67,232,34,195,20,95,174,166,170,245,33,193,192,109,92,151,82,4,125,202,89,141,49,111,71,122,15,102,80,106,151,58,83,168,8,108,145,101,137,228,44,150,229,225,127,126,136,211,83,40,130,65,105,137,237,194,68,11,201,46,176,15,181,8,67,4,175,210,248,0,222,245,214,4,12,8,194,9,173,185,82,4,93,244,59,139,161,60,185,13,68,66,9,20,127,147,83,168,184,225,236,208,146,139,141,15,46,70,75,13,225,159,83,40,130,193,165,137,15,5,11,11,123,17,201,237,25,69,33,6,23,30,178,148,222,237,110,230,50,144,68,35,149,52,67,176,208,38,211,185,183,222,53,78,138,147,77,51,24,140,206,25,231,110,215,142,25,178,189,235,211,43,42,5,1,57,205,7,39,30,217,142,52,222,57,116,157,87,169,201,246,49,83,136,60,172,187,45,157,36,75,110,85,211,2,5,114,229,83,232,227,33,39,73,175,139,145,13,70,98,19,109,217,117,82,2,163,170,9,242,88,161,0,214,181,62,229,242,199,245,83,2,171,161,200,62,243,244,232,79,202,203,217,4,145,191,83,168,210,193,226,4,205,36,71,15,99,150,73,17,90,168,81,106,133,114,189,157,27,39,67,104,160,246,149,79,192,76,83,136,213,161,139,141,177,228,38,13,22,120,104,185,177,218,67,104,43,240,170,38,109,175,124,189,70,209,152,247,196,95,222,49,93,225,60,189,2,0,0,189,172,135,137,85,75,184,205,139,3,99,163,142,145,88,0,0,64,8,96,137,54,24, +66,240,56,229,254,71,83,9,208,229,100,170,51,16,12,55,83,72,86,1,16,129,63,142,225,151,22,33,10,254,33,28,67,36,173,141,171,105,233,27,141,63,59,15,184,65,179,85,66,108,156,68,86,41,97,166,174,137,149,240,169,14,137,143,67,36,143,173,141,169,58,95,220,115,105,179,74,246,97,7,67,136,95,176,225,146,109,155,53,63,71,160,194,247,227,154,83,2,249,217,137,47,33,72,232,131,194,222,207,225,203,79,66,20,78,192,60,175,15,137,0,111,1,74,43,244,170,7,83,168,7,236,241,52,213,190,109,109,221,219,21,123,59,228,66,2,91,117,223,188,233,57,126,27,162,170,74,36,138,192,83,72,119,172,223,47,241,190,219,77,119,144,175,118,12,38,223,37,243,205,175,38,156,50,228,181,144,252,203,116,203,216,67,8,31,172,217,172,234,151,77,235,155,72,80,124,246,210,82,34,7,246,0,3,23,165,231,89,149,178,87,25,212,106,67,2,195,39,156,208,80,230,188,83,227,253,20,83,1,193,82,2,119,176,157,86,125,208,111,141,42,1,161,38,77,133,66,2,103,213,99,176,167,29,238,247,214,119,213,179,144,61,82,2,179,240,92,54,125,17,168,244,220,218,117,103,119,151,67,2,63,38,140,210,142,198,217,26,118,6,29,115,58,140,67,2,215,42,205,88,18,184,34,231,109,63,46,219,103,196,82,2,63,168,30,114,125,197,135,146,59,159,173,46,175,140,83,2,39,169,230,58,18,202,228,189,42,71,187,213,9,54,67,104,55,213,254,45,253,236,39,245,4,131,252,144,60,218,82,2,253,168,206,121,121,89,219,218,144,93,229,202,54,66,67,2,199,133,132,214,143,182,166,49,2,248,193,207,218,142,67,2,77,226,92,214,14,80,204,12,115,108,77,117,235,87,67,2,157,91,202,55,29,204,79,48,215,192,6,194,198,56,83,2,179,193,8,63,10,170,168,161,240,86,131,112,90,160,82,8,75,208,42,203,110,220,51,207,75,101,211,14,254,18,67,136,19,35,237,177,142,115,153,115,164,247,232,6,26,47,82,108,26,224,93,103,49,139,188,254,217,170,211,84,164,62,83,136,147,137,150,180,252,228,38,15,4,214,0,247,128,250,83,40,139,97,105,107,175,133,41,13,235,254,173,42,24,19,82,4,143,255,54,183,49,166,121,38,229,51,157,82,26,7,67,72,154,201,172,45,171,35,167,111,1,60,5,135,107,50,67,200,24,176,177,166,109,35,54,169,14,176,82,5,114,132,83,136,147,193,194,36,173,43,45,21,166,82,17,171,80,152,67,136,14,240,139,83,239,42,117,110,142,231,116,200,6,174,67,104,5,240,163,23,111,170,54,90,22,170,0,25,128,74,206,185,35,172,156,11,187,70,247,25,107,215,84,13,231,221,66,2,7,193,15,230,205,94,231,144,119,137,119,215,119,119,67,2,231,131,102,108,142,204,7,80,51,119,136,179,237,198,83,2,61,234,138,71,25,152,117,27,144,247,117,250,239,221,81,2,229,219,213,203,201,191,1,122,30,79,241,101,191,19,65,2,231,219,223,205,203,185,1,36,211,139,105,159,129,115,82,196,218,213,207,243,97,151,211,223,100,234,212,239,24,184,65,2,229,219,225,203,209,191,1,164,98,155,159,85,146,182,206,185,211,56,203,99,15,105,8,181,95,9,160,207,224,227,67,2,247,86,111,113,152,196,157,48,51,189,150,29,152,213,82,196,212,207,201,247,1,86,19,118,87,191,149,94,129,251,82,36,171,184,204,101,52,19,130,254,149,165,63,133,217,207,67,2,195,191,244,215,157,102,221,117,183,14,78,251,128,231,67,2,125,202,223,120,85,133,210,114,135,202,25,11,162,140,83,2,59,234,141,83,247,189,119,255,123,225,188,15,220,125,82,2,195,208,16,63,230,128,120,187,68,30,233,9,68,245,35,4,11,139,11,131,197,4,193,48,223,190,102,158,214,206,67,176,142,192,254,94,254,158,254,30,64,125,17,0,251,234,222,41,159,169,201,126,246,183,33,12,97,8,213,176,201,255,83,168,203,210,254,158,190,191,254,30,4,86,120,255,255,255,65,2,239,233,239,233,239,233,1,48,137,38,254,126,248,7,50,4,241,239,239,239,237,223,129,221,207,81,231,120,137,249, +207,41,145,41,253,49,201,57,186,241,138,29,68,210,233,153,67,136,14,76,175,191,223,243,122,61,155,175,20,220,6,186,50,168,40,241,254,94,126,223,254,190,190,30,72,72,181,120,66,2,131,226,3,235,137,48,27,174,252,6,174,157,247,123,82,2,163,131,104,244,150,128,91,25,63,21,229,33,213,77,51,136,94,235,114,81,209,237,251,158,223,249,15,235,238,111,67,200,53,48,244,156,49,86,182,60,17,162,165,38,21,200,81,72,26,131,191,167,119,215,208,55,87,154,167,233,89,89,83,136,59,99,141,94,55,83,230,133,219,143,236,32,78,252,82,196,176,101,61,231,97,39,201,233,239,191,196,159,153,105,82,4,179,106,103,109,33,156,173,175,253,107,96,74,148,154,83,200,33,236,176,118,131,107,91,94,208,106,100,104,228,57,82,40,124,172,50,53,150,52,138,173,123,228,36,112,29,168,67,2,33,26,82,49,83,51,153,43,115,12,162,27,20,167,33,6,205,226,106,135,64,96,235,154,179,181,123,93,51,139,51,168,128,1,22,121,92,235,68,150,199,240,136,5,11,228,83,40,104,213,249,171,101,219,53,3,239,186,246,39,56,4,67,4,185,216,212,88,233,148,18,171,167,8,173,4,33,60,33,6,3,25,63,134,252,242,211,123,171,116,254,222,219,0,67,2,217,129,77,88,141,2,210,1,253,132,147,241,77,157,67,2,77,226,92,220,75,84,62,144,10,97,46,70,77,99,67,2,223,230,133,100,78,123,200,76,220,101,30,192,116,118,83,2,235,177,232,46,86,229,227,32,163,46,41,12,132,53,66,240,67,195,144,67,87,40,26,255,223,161,189,25,9,251,83,2,233,161,232,46,89,106,99,98,123,18,202,171,56,11,67,4,79,110,176,72,75,78,27,57,247,160,202,4,40,103,82,200,18,245,105,95,230,236,7,177,12,0,108,237,132,52,81,176,23,80,212,54,55,48,149,215,4,231,10,252,30,75,67,104,49,144,32,23,110,14,86,109,134,80,24,40,44,218,82,4,95,235,49,77,83,26,144,74,165,186,40,132,245,11,67,4,103,107,111,217,182,38,80,171,199,173,219,213,104,35,83,2,99,152,4,55,32,90,135,122,117,156,133,192,140,82,82,200,1,48,138,105,92,187,231,46,27,133,111,87,58,65,83,72,156,225,6,11,109,118,150,84,247,229,81,244,228,1,81,240,22,172,3,57,60,178,182,251,226,184,91,7,76,167,35,236,214,228,152,175,124,85,197,2,54,85,80,113,11,64,83,72,142,193,224,68,13,3,37,11,55,90,114,22,117,203,205,139,142,161,168,34,109,191,23,107,21,54,229,247,165,49,65,138,8,204,255,211,215,251,165,203,142,4,52,163,17,158,81,106,5,12,231,61,115,198,148,150,161,201,205,175,7,21,66,2,223,53,90,36,105,93,206,17,145,185,191,185,247,8,82,72,105,80,45,215,106,179,167,166,202,0,169,236,117,113,65,138,101,140,247,125,117,174,228,227,236,88,20,163,109,248,66,12,43,12,51,53,151,151,15,127,66,127,95,10,160,128,66,236,43,236,80,119,85,25,187,0,183,34,246,85,159,237,83,200,24,35,153,246,237,127,239,134,208,22,121,107,208,38,83,2,235,185,42,63,189,248,11,69,56,8,10,132,178,18,65,234,70,67,41,75,113,85,27,106,50,180,128,35,72,57,83,40,106,227,241,39,103,122,175,131,22,132,223,214,110,59,83,200,17,227,241,39,125,119,207,130,119,157,7,102,192,154,83,104,59,44,157,95,253,243,76,100,14,104,147,224,101,252,67,2,89,99,93,220,12,112,185,131,53,39,183,142,255,233,65,106,118,108,91,210,202,156,182,185,79,53,200,132,120,50,82,104,5,117,219,82,83,140,213,54,12,152,102,41,224,6,83,2,251,168,133,46,247,29,211,246,211,186,39,72,4,143,83,72,207,161,67,37,237,228,40,11,92,222,176,19,248,152,83,168,135,129,139,139,239,107,73,15,10,156,7,28,3,235,65,138,2,3,5,39,77,53,21,98,33,82,33,230,129,222,83,2,235,160,198,46,49,88,216,79,210,111,173,17,180,137,223,137,3,131,49,29,19,67,1,0,0,68,20,11,85,148,223,137,3,99,150,214,45,197,0,0,0,68,21,183,40,90, +66,72,128,137,58,172,230,233,62,29,0,129,18,26,60,51,206,177,123,29,0,208,240,108,243,202,171,253,1,101,100,59,83,200,145,161,169,173,115,103,41,15,214,135,205,190,15,236,66,12,163,68,214,7,231,166,15,148,233,87,44,242,153,95,67,4,183,214,212,232,142,22,248,246,36,0,194,115,212,222,67,2,207,166,164,210,75,196,157,49,38,101,156,5,39,25,82,200,96,50,85,52,211,95,24,109,166,229,18,114,27,21,66,2,103,77,235,170,47,30,179,59,177,179,17,211,239,8,83,2,183,210,75,63,55,2,61,250,162,185,180,144,106,9,82,136,31,114,96,161,17,71,253,100,165,133,255,246,151,160,83,2,245,202,44,67,90,230,16,2,140,62,118,227,124,254,82,2,159,190,200,27,229,24,163,10,148,61,72,185,144,8,207,233,70,81,114,114,148,221,80,241,179,155,238,24,214,150,82,34,141,49,51,194,206,104,70,206,58,249,23,123,147,115,67,2,209,231,164,214,81,117,171,181,106,28,170,25,224,180,82,2,55,144,93,90,121,197,196,238,204,197,57,131,238,214,82,2,191,198,159,117,113,241,76,234,41,145,169,50,248,61,82,2,123,142,14,90,255,48,111,254,14,182,181,103,119,231,83,2,39,170,230,58,181,229,147,83,74,93,199,152,1,116,66,2,121,41,127,28,109,30,25,237,15,170,27,97,187,199,66,2,125,85,122,176,171,91,55,81,247,93,182,89,6,17,67,2,67,67,108,82,143,65,186,91,47,195,218,63,226,56,83,2,35,136,132,54,46,96,18,49,22,18,177,129,72,249,67,2,203,225,100,90,15,152,204,61,191,199,91,212,18,151,83,2,111,192,36,55,71,25,56,53,241,30,232,134,68,174,83,2,53,218,106,67,139,3,120,151,129,103,114,20,29,132,83,2,57,236,209,83,148,152,218,40,112,107,27,187,151,82,83,40,2,117,173,105,203,247,197,6,126,5,207,255,243,15,82,2,143,215,163,86,70,128,87,91,102,221,127,242,84,181,82,2,19,254,179,91,92,25,128,180,125,49,45,98,240,132,82,2,103,220,201,19,109,177,19,69,133,16,20,97,113,130,83,2,247,226,172,67,50,148,4,146,176,204,250,172,221,122,81,74,135,242,247,118,101,247,128,192,122,129,38,221,154,250,67,2,83,44,205,88,17,117,119,255,127,211,255,19,136,48,82,2,19,222,228,147,102,137,152,96,100,38,19,204,197,7,82,140,103,96,205,167,49,64,118,33,24,160,16,25,178,12,82,4,19,54,251,169,117,123,95,153,75,131,212,227,251,95,33,114,164,38,142,225,222,187,77,37,44,58,97,53,79,98,83,168,224,169,180,180,122,69,105,15,221,220,2,114,4,68,67,4,115,144,242,8,33,203,51,130,64,214,183,108,225,214,65,234,119,149,153,213,194,36,13,192,55,64,224,128,33,5,67,72,0,227,86,87,124,182,235,245,33,176,210,190,44,10,83,40,252,65,37,7,141,194,36,13,89,12,173,0,60,0,83,2,125,240,164,51,62,96,48,119,102,117,182,42,203,108,83,2,61,236,145,83,247,174,112,22,155,239,200,120,223,129,67,2,123,162,71,118,13,37,65,18,15,72,92,39,226,182,82,196,214,209,203,245,113,119,126,168,164,62,240,46,27,59,67,194,220,213,207,207,1,101,189,0,180,220,139,251,174,204,82,136,19,108,177,233,57,176,92,104,24,146,87,141,125,194,83,194,142,19,151,73,222,43,219,83,176,51,5,139,90,241,66,2,139,150,15,15,141,72,218,27,6,113,40,234,130,170,66,36,87,67,205,160,102,145,249,103,96,247,0,89,10,106,67,194,220,219,209,209,1,248,110,154,74,217,203,205,62,181,82,4,199,122,222,51,35,140,72,43,101,79,213,153,149,121,67,2,121,136,158,96,80,98,216,102,50,134,70,209,238,148,67,104,49,48,229,40,211,134,45,91,79,226,139,36,17,243,82,2,195,142,80,62,254,136,34,119,96,28,183,64,69,22,66,2,155,72,155,106,211,95,255,175,255,7,247,23,117,133,83,2,187,233,106,71,231,220,11,244,122,21,243,241,58,163,67,2,251,171,215,120,18,229,8,24,218,69,73,17,34,132,50,144,228,108,60,30,198,65,98,60,148,2,42,111,175,71, +223,201,24,67,38,234,167,6,251,190,207,121,228,238,207,255,65,74,134,132,173,223,235,239,121,186,61,168,38,19,26,140,221,7,216,243,1,1,206,206,145,54,137,239,228,242,191,155,67,196,250,126,191,73,202,73,45,63,53,183,182,102,29,180,66,2,59,130,182,65,217,2,82,218,179,9,187,211,187,51,66,2,135,43,135,145,197,8,127,203,8,247,81,255,251,255,223,169,1,181,182,239,127,239,247,159,191,245,173,207,206,221,67,2,125,217,167,123,155,68,12,81,230,214,24,51,56,142,82,2,7,175,97,49,36,64,68,8,8,215,39,50,85,180,67,104,88,108,94,183,215,249,252,125,31,242,224,201,179,234,65,42,74,44,10,199,114,246,102,32,137,48,50,92,170,238,67,72,96,112,202,34,101,227,245,175,79,179,196,179,129,54,83,232,227,129,75,75,209,243,213,25,15,48,178,154,239,233,81,202,3,236,94,250,117,206,23,156,191,117,159,127,249,11,83,168,135,193,171,139,207,111,45,15,221,216,51,13,94,248,83,168,131,97,71,105,49,67,7,13,228,38,179,10,18,228,67,2,225,226,77,88,142,16,191,196,91,179,25,17,20,135,206,141,21,195,224,83,110,222,215,162,42,209,26,128,208,140,33,6,63,106,117,148,38,89,3,152,52,153,229,159,73,52,65,42,124,44,75,83,243,219,244,133,137,80,19,245,109,19,82,16,81,12,227,140,17,115,63,70,121,133,29,170,151,250,34,44,31,149,184,223,130,136,90,35,138,240,40,11,150,249,83,2,175,177,200,50,92,97,135,222,27,48,222,62,195,94,67,200,27,213,251,191,224,200,83,150,132,73,68,32,129,106,223,5,45,196,115,198,139,127,79,2,41,9,184,18,237,74,67,2,95,134,107,68,142,76,22,243,218,202,10,196,124,82,33,202,141,225,192,215,239,63,22,41,14,65,208,129,25,212,83,2,41,169,7,47,114,190,43,168,187,94,1,10,152,98,207,137,142,225,209,93,44,126,181,215,190,31,177,168,3,18,83,2,101,153,137,46,39,249,189,4,4,175,50,112,254,208,83,8,127,195,171,99,110,106,183,134,57,66,80,145,144,10,83,104,13,99,176,245,243,251,180,135,34,88,83,181,153,26,83,2,231,160,231,62,80,140,23,136,138,192,78,141,189,44,66,48,93,204,176,127,182,215,28,254,255,19,122,195,2,248,83,2,177,185,42,51,20,122,135,184,80,200,153,53,68,190,83,2,181,209,73,55,123,22,151,122,18,80,20,232,48,175,67,104,123,176,217,250,107,189,92,126,6,8,212,192,227,86,66,234,148,196,238,239,121,143,238,111,192,215,70,86,192,254,67,4,117,180,214,8,17,79,17,0,138,2,109,186,247,219,83,2,241,192,167,42,76,122,226,32,147,6,203,96,169,122,65,138,19,44,171,139,207,190,38,219,150,79,141,59,77,2,67,2,103,10,181,82,143,116,69,176,65,97,225,167,131,189,83,72,134,97,76,143,237,6,9,13,158,132,152,200,4,157,83,104,187,97,71,73,143,37,41,13,91,251,54,66,116,19,83,40,203,161,11,45,207,173,109,15,160,40,117,147,23,19,82,4,79,253,176,219,113,217,6,182,110,145,213,127,169,104,67,4,187,246,244,144,36,96,123,26,155,245,238,107,156,179,83,40,66,236,120,101,143,190,91,52,87,187,228,13,84,19,83,2,171,168,196,50,172,189,1,246,31,126,229,232,98,72,83,72,241,1,37,103,45,81,145,17,223,180,141,189,32,27,83,2,183,208,5,51,150,184,195,128,111,200,196,170,67,13,83,2,59,209,39,63,239,204,222,247,168,204,12,197,161,101,65,170,82,108,73,239,119,142,227,129,114,135,144,131,49,105,83,168,6,163,193,83,231,141,217,134,124,227,136,166,34,232,83,200,145,161,203,203,207,224,102,15,2,210,216,185,231,238,205,7,45,120,249,140,27,61,245,94,122,235,41,245,14,136,83,168,131,193,2,199,42,231,8,13,12,17,104,103,134,175,67,136,103,48,211,38,231,150,53,107,22,53,230,190,20,190,67,72,0,240,51,35,239,174,60,173,70,123,62,210,204,8,223,137,3,195,229,206,11,5,1,0,0,4,19,1,34,236,205,139,3,99,66,139,117,57,0,0,64,176,71,26,153,82, +83,16,162,172,142,238,157,0,0,96,138,49,3,231,225,16,67,112,129,22,0,0,172,189,85,106,72,47,8,0,195,18,66,2,91,101,94,178,233,29,59,215,187,219,114,59,14,115,83,2,187,234,139,63,90,3,165,141,66,90,131,102,160,121,51,168,0,99,180,195,55,92,207,51,205,185,53,15,36,189,67,40,74,163,37,133,46,110,42,109,160,201,62,106,254,174,35,4,3,63,179,43,231,93,3,22,12,165,73,146,212,219,83,40,34,172,114,167,181,108,217,84,233,70,237,66,183,199,81,80,9,76,69,81,157,93,217,254,93,83,28,244,217,200,83,168,18,172,122,47,25,207,123,149,60,28,48,98,46,229,33,138,153,225,145,231,109,143,60,189,14,196,216,90,112,195,67,40,16,227,35,159,238,182,234,117,163,17,169,202,156,218,67,2,211,41,173,90,16,247,202,215,246,94,74,127,110,6,82,2,123,150,30,123,239,100,249,248,191,215,127,127,100,166,82,2,187,236,78,114,125,241,229,143,138,121,41,185,35,176,222,3,9,149,14,173,76,21,1,0,10,125,37,111,229,149,67,2,61,6,100,208,14,196,152,193,34,140,127,113,62,137,82,2,191,170,31,118,121,241,115,222,164,60,41,56,212,228,67,2,69,65,76,84,14,8,194,0,245,132,43,147,231,197,82,4,93,237,113,171,101,203,89,69,229,168,148,230,62,93,67,2,195,96,68,212,77,139,48,40,148,6,100,19,249,132,82,136,25,171,179,55,53,41,68,185,21,198,231,227,250,101,82,2,171,206,202,25,121,153,8,145,35,2,65,4,137,16,66,40,1,3,11,106,244,159,227,241,239,128,26,213,109,59,51,36,75,78,181,132,95,134,234,171,161,10,216,191,148,27,82,2,125,240,15,150,125,9,52,19,128,121,8,180,137,32,67,2,203,229,108,92,14,145,58,168,29,33,70,68,22,72,83,2,125,241,166,55,140,96,96,24,68,220,43,26,251,202,65,106,124,236,60,111,190,215,60,65,226,248,106,190,25,136,82,2,125,236,207,145,113,164,131,229,168,165,92,237,161,86,81,10,43,108,78,91,221,156,148,57,66,54,66,8,48,57,206,173,1,213,249,11,26,85,242,100,82,162,96,162,22,215,83,2,181,202,76,67,230,48,224,42,224,206,107,21,140,146,82,136,48,245,58,234,241,241,71,245,15,0,147,145,80,164,83,2,243,192,230,62,253,239,166,251,107,84,78,29,169,64,67,2,203,194,100,210,142,17,37,104,84,5,18,57,241,148,83,40,35,227,139,146,101,199,140,131,107,255,77,124,0,147,83,2,187,232,134,63,9,65,218,10,39,161,45,21,66,127,67,2,117,46,7,241,20,5,196,89,220,206,158,23,52,252,66,212,99,160,141,246,253,141,46,242,191,86,47,4,85,160,82,232,119,208,178,218,36,220,82,75,90,81,181,215,37,216,83,208,143,106,182,170,158,235,191,136,232,111,229,40,82,221,205,199,190,92,237,150,62,28,211,43,119,229,214,251,55,155,67,2,235,7,150,90,78,108,156,242,239,62,62,190,21,56,67,2,109,168,133,214,142,149,139,58,190,142,251,109,0,114,205,7,55,90,81,134,128,178,42,249,191,252,182,43,60,189,83,136,131,33,233,44,205,226,4,13,44,49,203,161,11,125,83,2,125,233,133,55,20,112,127,52,164,231,121,52,222,47,66,2,11,211,18,105,143,81,105,85,144,181,177,219,183,127,83,136,87,117,140,217,33,55,47,3,231,96,62,220,183,95,82,196,190,167,157,209,225,150,190,207,206,135,103,95,212,99,81,16,27,140,134,95,91,207,241,153,158,105,90,20,103,119,82,4,195,228,236,39,85,189,5,238,4,111,112,29,56,253,67,2,119,109,198,96,17,112,131,182,226,28,189,177,118,172,65,138,14,172,46,234,50,143,177,114,13,172,218,218,116,11,67,2,247,205,222,98,18,236,39,88,3,101,192,123,140,158,66,2,155,166,27,149,211,78,196,68,64,170,73,211,251,167,82,34,31,201,104,177,29,5,68,156,251,31,33,218,214,155,83,8,3,213,253,234,97,178,239,6,208,110,116,185,246,113,82,2,203,176,146,151,78,0,208,249,90,85,41,42,69,165,67,136,123,35,181,241,202,253,124,165,36,133,28,15,117,200, +83,2,149,103,30,118,231,101,112,207,109,239,238,242,206,81,81,2,235,237,229,239,213,239,1,114,191,187,99,182,220,15,66,136,35,53,30,135,211,233,171,60,119,71,159,95,223,49,50,40,202,105,122,231,91,254,225,132,119,42,193,15,17,164,66,168,168,196,62,31,31,255,30,31,0,128,32,8,138,102,82,136,94,108,50,242,89,60,24,44,40,232,217,74,56,250,82,168,40,107,8,70,52,138,105,12,3,166,243,227,73,126,83,72,207,18,63,63,31,223,30,31,240,6,127,254,255,255,67,8,9,163,156,189,170,39,138,113,33,221,149,47,100,146,83,8,1,117,175,157,97,186,23,3,10,59,120,65,11,200,66,2,139,80,139,236,5,95,160,24,76,118,34,247,188,255,83,2,113,186,233,62,251,156,245,96,9,205,31,198,58,180,67,104,11,131,91,110,189,125,223,43,36,28,69,91,102,76,66,236,132,114,177,214,161,37,76,48,128,117,102,146,245,217,82,4,79,55,189,185,147,249,109,62,219,15,221,126,209,120,82,40,0,99,51,55,158,217,51,229,29,6,148,250,70,105,223,5,87,200,173,104,15,213,76,196,17,0,0,192,15,144,65,106,13,172,188,206,119,234,122,193,158,242,226,108,52,201,83,200,24,236,116,30,59,223,111,101,200,111,107,43,178,143,82,4,95,220,105,205,67,172,223,152,247,131,228,31,240,246,67,16,81,236,190,123,21,99,212,110,71,6,116,131,110,148,82,136,85,112,45,236,246,155,69,22,201,64,19,64,12,168,81,48,10,201,222,63,110,221,16,162,206,30,138,188,50,7,83,2,43,169,38,51,215,17,126,147,227,155,118,30,0,227,82,4,79,198,41,207,139,181,130,239,85,165,245,16,136,148,83,200,24,236,148,101,217,243,44,185,251,72,26,128,136,60,83,2,243,209,103,55,254,223,221,238,89,88,206,163,9,136,67,72,74,176,179,55,111,34,111,46,23,108,186,100,55,153,66,112,17,172,105,109,120,175,235,167,62,13,245,3,18,40,83,2,119,208,5,47,170,220,142,76,234,128,152,69,145,10,83,2,205,69,151,93,4,121,9,173,96,187,7,241,71,235,83,104,11,181,236,253,46,46,63,3,130,117,138,197,19,118,67,72,14,181,42,165,118,240,32,142,4,23,224,218,161,231,83,40,100,227,185,123,109,214,174,134,159,85,3,107,216,63,83,200,24,117,206,157,167,26,125,3,233,253,97,107,183,194,83,136,147,97,109,111,17,41,171,12,75,130,109,66,119,128,67,104,55,176,234,182,83,27,117,46,23,38,35,233,80,233,83,2,181,201,10,55,255,250,144,11,39,213,67,4,76,143,33,6,245,209,79,133,153,104,91,82,245,16,193,173,212,199,82,4,21,226,89,143,113,33,134,252,165,230,10,242,38,137,67,4,87,150,212,24,221,75,129,160,62,2,130,110,113,104,221,203,197,193,251,76,223,198,45,70,97,134,0,172,160,106,33,198,166,219,111,21,60,58,129,1,18,251,204,246,72,150,83,2,119,209,233,50,6,148,22,117,182,238,174,8,100,152,65,42,1,172,89,219,188,246,44,135,112,196,96,161,204,44,67,2,93,163,109,216,139,11,210,8,172,132,135,191,177,174,83,168,2,108,185,231,135,191,223,180,121,101,75,167,253,0,83,72,53,213,253,138,165,26,247,3,191,176,2,39,206,52,83,40,252,129,45,45,79,69,103,15,255,174,206,166,113,67,83,194,154,27,150,177,239,98,112,78,82,35,23,61,107,79,83,40,203,193,175,175,145,167,201,15,219,66,175,134,186,10,83,2,253,233,168,47,152,249,10,69,171,64,252,227,107,155,65,10,6,108,8,195,215,242,99,75,96,241,29,55,15,206,66,170,5,44,119,188,223,227,13,98,127,26,91,174,122,8,82,4,31,194,107,79,149,53,195,169,32,201,96,52,196,82,67,2,101,225,67,202,140,61,34,246,190,98,202,39,51,31,83,16,155,236,149,110,245,214,238,160,200,243,66,93,6,56,207,209,196,170,166,231,119,28,235,58,55,137,82,98,19,113,67,4,217,180,244,96,130,95,22,116,174,250,211,145,118,8,67,48,69,1,60,116,177,157,181,167,41,224,128,0,112,80,206,113,17,25,0,0,106,189,90,216,81,79,100,12,0,64, +222,17,34,161,238,37,234,189,202,0,0,128,150,185,81,18,67,8,2,163,51,221,170,15,0,0,144,55,78,112,167,27,67,2,207,201,188,84,81,50,63,215,246,108,159,85,188,205,66,2,83,88,82,172,165,63,112,214,197,220,83,98,61,221,67,2,213,78,229,88,146,205,124,245,182,86,123,123,248,189,67,2,87,75,181,90,144,201,173,226,117,94,82,56,54,83,67,2,207,233,156,216,79,213,31,54,119,222,173,153,170,133,66,232,232,97,243,221,123,87,104,162,213,79,82,73,7,247,67,72,28,99,213,157,63,254,121,125,35,242,240,127,216,148,67,8,43,43,145,232,208,207,253,103,32,165,180,20,22,243,82,2,243,142,27,54,251,164,254,12,111,42,178,169,62,8,67,2,79,235,196,86,82,7,178,172,217,62,231,191,223,171,83,136,159,105,143,107,58,56,154,92,176,56,71,96,173,167,82,2,123,232,206,81,243,104,251,183,218,97,177,79,98,198,67,2,69,72,172,84,18,198,169,145,234,206,112,248,218,147,82,34,67,52,177,69,47,89,70,180,8,37,117,253,253,106,82,2,183,226,30,81,113,129,216,25,76,243,107,238,245,191,67,2,211,32,69,222,142,180,224,15,92,6,117,25,4,191,83,2,61,242,170,75,45,205,181,91,79,125,86,208,247,39,67,2,127,226,79,250,77,206,28,125,22,40,35,34,129,72,223,3,41,125,64,127,120,251,128,233,35,72,2,74,48,69,83,2,121,234,170,67,170,250,21,68,58,178,238,3,120,153,83,2,37,162,232,62,212,61,111,136,8,16,17,137,17,33,83,2,43,178,232,62,22,99,196,2,203,148,174,131,9,230,82,2,191,208,31,122,127,1,150,109,118,194,69,140,149,49,67,2,205,232,140,218,143,136,229,156,3,145,175,94,196,36,35,200,131,169,97,133,198,233,49,207,134,81,172,166,181,147,82,2,27,144,22,218,120,17,17,1,70,128,232,16,17,88,82,2,183,140,157,89,115,209,163,117,182,168,2,25,0,104,67,2,87,104,133,86,80,110,238,218,42,79,223,47,59,3,50,108,114,236,193,152,107,181,150,252,191,168,80,30,3,57,83,8,163,65,43,75,145,165,229,77,71,214,37,190,8,154,82,2,111,238,138,86,235,104,4,53,245,43,145,153,229,64,82,2,171,180,218,30,115,225,110,156,142,59,163,234,95,44,81,138,31,44,206,90,239,197,82,105,223,240,15,133,87,68,67,2,243,233,190,230,143,41,16,190,31,233,156,174,171,237,82,2,23,172,22,242,250,112,84,109,124,51,28,99,1,49,66,240,30,163,250,204,251,183,55,238,70,162,66,63,87,205,82,4,167,231,62,185,245,190,146,153,254,75,80,126,166,187,83,2,245,208,70,63,134,202,216,4,34,235,58,248,246,13,67,168,38,117,24,99,89,126,249,179,2,97,93,214,208,109,83,2,187,233,168,63,4,17,38,140,142,73,1,114,175,229,83,40,1,245,156,250,203,138,93,3,171,100,1,38,40,106,83,168,154,161,173,173,111,73,235,12,130,75,236,160,239,92,223,5,93,112,45,89,140,29,13,38,0,176,219,66,186,125,51,4,101,240,253,90,140,230,210,52,235,218,82,127,12,208,83,2,113,186,231,58,236,43,56,86,23,171,167,183,231,92,83,136,142,1,7,41,175,148,212,90,157,136,159,212,71,228,82,2,19,138,22,222,96,49,147,6,99,224,69,64,77,56,65,170,224,137,163,225,143,231,19,4,157,21,18,129,66,10,83,2,241,169,137,54,16,145,99,90,168,211,27,180,158,226,67,2,125,230,126,232,77,123,7,197,115,225,153,55,230,199,82,2,7,140,150,57,241,240,93,14,95,29,202,181,10,162,83,72,154,65,15,17,175,150,146,80,137,81,230,142,188,150,67,2,253,69,102,216,142,204,200,60,166,14,166,187,71,202,66,2,151,177,211,218,79,92,95,128,127,14,255,191,255,255,81,76,79,236,202,206,62,202,98,6,116,166,91,165,243,10,67,2,239,202,173,214,143,87,151,183,122,239,3,164,81,72,66,232,145,97,46,243,40,79,174,176,146,71,146,255,103,168,83,2,121,209,6,55,33,166,16,99,241,178,184,9,236,120,83,136,147,1,5,39,207,205,207,21,228,14,160,0,113,146, +67,2,177,61,187,191,89,123,221,141,125,188,229,26,136,97,67,4,85,148,22,153,206,60,7,128,54,0,0,248,0,0,82,2,41,1,60,252,5,209,6,162,26,71,169,46,77,165,83,168,129,210,222,158,254,63,30,31,255,190,126,107,218,225,82,2,135,142,17,90,112,169,43,224,137,64,105,150,68,133,82,144,185,234,200,214,153,199,252,28,43,66,222,233,96,100,67,240,148,226,152,111,129,41,92,141,2,49,59,45,27,222,67,232,31,176,176,166,237,51,47,170,22,200,0,47,222,154,34,172,7,213,249,223,73,43,127,35,251,173,202,128,32,240,82,4,55,117,59,203,17,34,21,132,132,176,99,47,95,150,82,40,35,245,255,127,189,205,85,239,15,144,11,100,203,172,67,104,59,240,208,246,238,27,116,105,142,168,27,110,100,240,82,4,89,219,41,159,177,6,149,2,114,183,238,79,131,74,82,4,63,169,147,158,113,37,9,39,65,174,117,108,161,42,66,16,0,201,191,253,185,125,202,94,156,42,203,81,9,3,82,4,83,127,51,249,225,52,3,190,154,37,241,209,175,4,81,74,21,108,86,11,105,157,150,228,20,130,128,122,186,94,221,139,229,97,224,177,115,250,178,245,32,68,124,173,239,16,66,108,141,114,98,14,103,6,128,10,216,95,251,125,0,149,65,74,8,181,187,143,101,233,12,72,34,168,100,57,105,88,65,74,103,236,255,118,230,252,126,69,10,7,180,175,236,52,67,232,52,213,118,167,42,246,240,253,2,21,218,174,20,4,83,40,183,33,197,6,237,128,171,19,73,220,62,15,156,224,67,72,105,240,16,227,231,138,62,173,6,173,187,14,241,11,83,2,183,202,10,55,165,115,87,175,4,253,122,113,35,163,82,2,95,144,152,22,255,80,86,236,250,189,166,131,116,151,67,2,223,197,149,212,75,29,246,76,213,88,178,32,62,82,67,2,215,35,133,218,12,112,138,170,120,148,213,95,35,198,83,2,243,192,228,54,94,73,111,152,233,109,190,135,218,239,83,200,24,117,247,233,171,159,30,7,23,97,137,143,244,15,19,184,165,174,244,10,238,255,245,106,255,42,42,111,136,240,83,200,194,129,37,41,77,107,109,17,81,254,201,49,53,64,67,4,25,144,212,40,56,23,71,208,238,91,182,79,233,146,51,200,155,33,154,215,32,75,195,29,199,192,201,200,40,131,83,168,0,227,192,37,107,74,205,131,2,172,248,186,38,112,81,24,8,204,250,127,185,117,191,110,173,108,67,25,8,216,83,72,133,225,34,69,77,97,71,11,251,184,25,154,201,138,67,2,209,65,77,90,76,168,140,98,144,169,79,138,183,245,82,2,175,208,154,54,117,217,131,215,66,220,75,147,70,15,83,232,98,213,221,127,77,58,87,7,38,98,121,232,117,250,223,5,203,193,117,194,138,31,99,41,48,9,211,4,13,18,83,40,137,65,75,79,237,2,39,13,254,235,45,143,20,8,67,104,118,245,124,167,164,200,86,215,129,40,77,199,212,159,67,196,194,243,28,41,21,208,150,210,188,10,124,9,252,191,82,168,136,193,65,87,79,191,118,93,22,101,183,197,246,237,67,72,74,227,82,94,251,166,62,173,33,254,89,215,241,23,33,106,141,161,49,39,239,184,90,117,20,212,160,11,192,169,83,2,187,185,167,50,66,245,98,148,182,123,41,240,215,42,82,104,12,144,170,233,228,106,196,161,167,200,98,153,69,97,82,4,85,194,217,77,53,101,234,79,149,171,227,156,33,71,67,176,253,102,210,234,234,164,191,69,10,112,149,83,227,154,67,4,85,114,212,208,230,6,82,50,107,91,77,110,233,189,83,200,24,204,253,55,39,206,251,100,225,94,131,159,241,220,82,4,111,60,235,217,133,9,73,253,147,185,91,224,10,144,67,2,245,168,133,214,76,180,3,181,54,223,153,25,252,206,66,52,42,224,93,246,118,158,250,136,240,111,0,136,70,15,82,2,147,148,198,242,126,165,34,116,7,252,20,99,50,127,83,2,173,168,198,46,0,254,15,237,223,234,158,54,119,107,83,40,1,44,185,44,151,101,73,156,33,89,18,32,69,182,221,139,3,227,10,91,108,3,0,0,68,112,10,199,51,203,206,17,95,9,66,216,1,0,224,158,171,116,27,28,67,64, +95,11,2,99,33,151,157,60,0,0,64,92,72,214,192,13,66,72,129,209,39,14,0,161,149,91,64,87,54,48,53,22,67,2,73,168,148,86,16,181,65,155,132,122,49,66,158,16,82,2,239,178,139,86,125,193,108,128,72,89,33,34,214,84,67,2,81,230,124,214,143,237,142,246,54,92,186,113,240,212,67,2,201,132,124,86,143,53,220,11,168,30,75,123,39,207,67,2,65,35,100,82,14,214,220,50,182,65,105,35,163,148,82,2,123,244,205,54,119,37,105,222,177,31,40,188,151,80,65,42,14,172,109,247,197,216,47,152,222,175,193,92,54,173,82,2,247,238,220,49,121,113,197,15,60,51,6,51,58,124,67,2,73,104,140,82,15,140,102,166,184,248,101,7,107,113,223,5,65,41,172,84,146,251,14,119,123,39,253,27,176,109,82,4,127,237,233,235,133,241,249,250,182,61,41,12,2,205,83,2,111,176,228,54,64,215,38,75,27,185,245,210,218,241,83,232,186,129,192,68,109,105,141,19,239,250,159,19,101,147,67,2,27,53,74,183,21,131,211,2,237,142,110,187,100,143,67,104,13,117,31,121,59,184,82,211,67,232,137,205,135,10,67,194,182,187,201,145,65,4,178,49,11,73,74,239,125,245,83,2,245,219,143,79,138,184,119,250,62,97,218,109,20,244,82,2,211,159,243,95,102,113,232,168,127,121,53,111,220,164,67,2,107,208,6,241,83,75,189,57,247,188,157,121,168,197,67,2,109,240,254,112,147,95,58,214,120,139,103,192,239,38,67,2,81,237,228,86,146,119,154,237,153,61,198,68,217,96,82,2,27,242,86,146,248,144,137,32,17,30,188,226,89,204,67,2,185,131,91,76,13,7,6,156,83,67,221,169,33,228,66,2,227,177,231,222,107,28,189,187,191,59,23,213,34,128,67,2,85,42,181,86,80,171,254,168,239,213,237,103,167,5,67,2,209,232,140,214,79,204,61,144,206,109,182,194,139,16,67,2,87,74,197,216,143,124,213,86,104,142,174,211,116,180,82,2,231,248,89,19,127,217,221,184,107,59,47,131,221,88,66,2,79,212,210,178,229,93,247,173,247,96,119,119,125,119,83,2,111,185,231,54,100,156,237,97,173,155,18,179,23,225,67,72,79,245,56,125,145,85,235,244,16,13,138,46,177,196,67,2,99,233,173,92,15,111,221,166,49,94,103,152,198,88,82,2,163,218,153,31,119,104,198,249,89,167,229,129,110,224,51,4,85,76,221,90,146,109,187,117,64,107,199,138,243,111,67,2,103,107,198,100,144,127,255,170,123,79,227,8,237,48,33,198,170,212,107,157,219,33,148,100,235,125,205,221,34,171,82,2,235,186,155,87,245,100,222,153,156,88,233,98,217,180,83,232,119,117,173,157,203,186,183,7,6,48,235,206,211,61,67,2,231,135,157,220,141,167,210,34,104,132,85,12,133,107,51,4,209,228,164,210,142,196,251,125,223,223,253,91,10,82,67,2,25,19,50,53,21,161,68,98,73,162,148,246,72,131,66,168,135,225,121,239,238,255,112,199,245,14,117,229,129,3,66,2,183,221,191,48,161,93,51,26,175,16,17,30,150,17,83,2,163,128,133,58,161,70,80,11,68,157,80,208,94,212,81,12,35,3,15,47,173,219,31,138,216,179,239,45,39,205,65,106,5,44,79,82,227,191,245,129,66,1,29,52,218,152,83,104,38,195,203,231,70,123,183,134,1,239,69,38,124,49,67,136,19,227,55,237,173,214,176,118,33,144,2,0,168,2,67,2,203,195,100,190,11,138,192,221,69,235,75,66,118,239,82,104,5,208,190,26,43,203,7,167,233,228,102,199,252,60,83,232,153,129,99,39,239,4,233,12,240,47,165,175,240,79,82,232,59,240,178,235,168,131,39,166,198,240,247,229,138,252,66,140,142,210,189,152,99,37,239,166,122,208,38,105,214,90,67,136,14,117,41,109,106,228,101,215,130,68,203,202,151,58,82,40,69,35,206,238,186,154,101,109,7,42,26,80,191,57,205,7,155,88,214,14,221,5,224,59,118,45,54,213,178,237,67,2,237,174,229,212,81,134,183,8,80,74,255,29,34,236,83,2,185,187,172,62,107,222,211,119,155,190,174,164,128,76,83,8,23,44,159,101,215,225,184,93,160,73,134,103,188,231, +66,2,131,75,179,117,165,27,222,243,16,227,232,222,198,222,67,2,53,123,115,193,21,128,175,255,171,195,237,72,166,255,67,196,232,86,189,193,106,6,168,219,156,245,237,244,177,138,67,168,102,112,132,237,83,211,245,59,135,11,46,176,14,166,83,168,109,99,169,147,231,118,213,133,208,195,130,19,161,231,82,48,206,202,241,221,241,83,158,123,53,166,97,163,78,69,67,136,8,208,234,215,238,7,117,174,22,29,7,230,50,99,82,44,1,192,250,175,16,189,87,229,78,183,13,60,8,4,65,234,13,108,73,211,146,146,108,43,9,67,214,89,179,141,67,2,99,197,149,92,76,244,33,185,3,168,231,14,140,105,82,4,93,235,107,93,85,40,141,42,131,28,145,222,171,120,82,4,17,72,25,159,81,161,4,198,145,167,238,228,63,199,83,2,235,176,7,55,76,197,239,127,149,188,254,3,128,118,82,4,45,136,209,92,149,29,173,77,99,254,14,118,43,17,82,2,165,2,27,221,217,36,11,36,103,31,204,110,254,131,67,2,169,192,75,186,139,220,217,249,138,225,151,64,155,106,50,48,11,201,125,43,215,246,25,50,215,167,2,236,180,29,83,40,66,213,217,171,67,58,87,3,97,248,26,47,3,237,223,5,95,197,125,74,139,55,240,205,117,44,44,113,104,218,67,2,81,5,109,220,78,60,185,237,68,184,99,194,217,33,65,42,2,227,107,77,111,151,19,218,189,83,154,10,184,109,65,10,1,67,35,69,175,155,19,194,98,72,160,190,32,29,81,42,66,140,82,155,117,198,148,87,41,199,229,13,136,41,83,2,121,218,73,63,213,26,24,85,24,218,182,99,226,173,83,136,229,161,228,234,76,67,71,15,0,124,30,239,252,55,83,2,57,184,164,50,123,53,93,87,100,212,198,0,105,124,67,40,17,176,179,162,237,61,122,117,20,172,110,23,185,209,67,4,115,116,216,72,235,43,108,155,144,82,105,77,32,220,67,40,2,176,146,243,229,60,60,157,151,136,46,145,134,90,67,40,2,208,131,83,78,15,118,45,86,171,65,14,211,141,67,168,18,112,145,38,237,28,94,170,23,194,23,181,161,46,82,4,127,201,163,153,17,2,16,8,69,0,41,158,9,205,82,168,22,144,13,137,218,130,66,154,202,196,75,89,169,21,66,168,203,169,67,219,94,130,129,86,182,20,204,38,14,72,82,4,25,226,35,79,21,0,208,198,139,3,228,79,152,151,83,2,163,168,6,47,4,2,152,56,100,35,40,83,188,95,65,2,89,160,118,210,178,202,0,224,117,68,229,5,165,0,83,136,3,140,247,123,183,117,201,165,243,68,6,134,237,216,83,72,0,236,118,166,253,61,89,108,118,96,232,167,159,127,66,236,159,132,218,57,233,166,121,41,255,89,81,137,133,136,67,2,209,2,77,88,12,130,164,104,77,23,11,21,51,164,67,136,50,213,255,173,207,180,49,253,68,154,54,195,73,132,67,2,207,224,76,80,12,46,161,7,1,142,243,22,242,167,67,2,217,226,84,86,75,212,183,197,46,11,209,246,19,240,82,168,48,112,34,185,102,203,142,202,217,0,7,220,76,190,83,72,38,163,176,230,109,127,213,135,16,156,148,250,139,100,51,4,213,136,156,80,141,16,36,81,76,182,1,253,222,52,65,210,136,102,119,237,148,213,182,192,108,245,107,141,105,64,67,4,89,112,210,80,122,6,64,178,101,87,233,230,96,222,82,232,4,240,34,170,36,163,9,38,233,100,254,134,29,218,67,72,26,240,74,151,239,184,58,61,78,177,52,96,194,65,82,4,59,189,99,219,3,248,243,254,51,106,101,236,54,130,83,200,227,129,79,49,171,111,79,17,76,211,210,255,253,137,83,2,247,201,233,66,44,91,111,180,243,128,249,96,93,124,83,200,16,236,112,214,173,242,190,109,210,170,212,30,48,71,66,2,211,28,214,154,99,88,80,83,114,81,61,85,87,213,67,80,245,172,81,8,39,188,149,86,168,175,168,65,100,241,223,105,133,161,192,19,149,123,228,25,202,144,29,234,161,159,83,72,224,1,35,39,139,133,103,15,177,96,83,170,7,122,206,241,16,29,0,128,195,207,237,15,159,156,4,24,10,48,95,139,3,163,183,26,158,28,0,0,64,17,234,210,230,31, +206,113,1,21,0,0,226,138,140,74,231,36,135,182,170,135,67,8,2,107,213,75,131,29,0,0,80,43,80,192,130,17,82,2,123,172,14,62,123,97,252,252,175,129,247,155,167,255,67,2,205,200,164,218,144,169,103,150,36,249,206,143,219,248,82,2,189,242,207,118,245,208,147,155,70,30,225,102,85,181,67,2,71,136,156,214,16,98,182,163,63,214,229,136,29,25,67,2,193,101,124,214,143,94,251,250,11,73,63,102,243,229,82,2,191,176,207,94,117,225,205,88,83,147,74,47,116,225,67,2,75,195,100,88,142,214,30,185,207,227,70,3,246,87,83,2,237,177,232,66,15,208,80,66,140,89,133,24,82,246,83,2,249,216,102,63,77,192,101,0,45,16,43,7,168,245,67,2,199,100,116,84,15,88,156,125,230,204,137,115,170,202,83,2,49,200,68,55,247,121,244,43,70,141,82,195,161,203,83,2,243,201,74,71,179,213,21,93,93,30,118,125,243,1,67,2,231,169,174,238,144,127,239,173,170,7,143,89,109,140,82,2,151,158,245,155,222,128,246,73,62,162,245,17,219,126,82,2,107,246,9,251,110,89,44,210,174,172,254,123,230,142,67,2,105,141,230,108,146,186,185,238,138,27,182,164,9,27,67,2,215,75,197,218,144,169,67,199,136,190,3,50,212,98,83,2,183,217,135,55,18,168,188,147,72,231,22,211,234,91,83,194,34,34,26,165,0,138,128,113,222,208,142,34,210,108,81,136,40,210,183,128,252,249,143,26,161,33,157,164,53,203,82,2,119,194,93,85,115,48,135,95,176,153,252,174,222,148,223,37,147,88,129,163,155,111,219,52,239,31,137,221,251,1,67,2,67,33,84,80,13,233,141,224,228,140,80,216,216,134,67,4,83,178,212,72,234,6,104,10,64,23,147,174,200,190,66,104,142,73,74,58,230,153,90,116,101,81,159,249,122,5,67,232,29,181,170,45,54,200,103,214,64,160,124,195,35,38,66,2,79,95,215,241,165,53,34,134,90,58,85,25,147,93,67,232,4,172,90,157,154,177,88,173,157,161,2,17,40,1,66,2,195,221,70,50,229,94,144,83,69,179,210,221,218,221,83,194,206,211,75,25,128,212,214,199,24,107,237,115,255,127,82,2,231,140,73,54,255,128,184,152,91,87,237,46,205,148,66,2,221,137,105,212,119,28,136,4,128,236,196,82,44,245,67,8,9,112,251,113,219,61,56,125,14,12,176,155,131,0,66,2,79,201,83,172,233,94,41,8,55,179,119,251,187,127,66,20,19,192,123,166,60,149,134,144,223,208,242,93,82,154,65,106,114,236,46,230,239,191,37,17,48,112,63,111,65,96,206,109,5,171,232,145,171,90,183,166,124,99,30,111,46,231,66,2,71,208,79,238,229,93,102,243,85,141,85,3,217,221,67,2,207,163,116,212,78,235,153,135,182,116,28,113,188,132,33,210,164,172,223,41,156,183,170,165,161,104,43,190,107,224,223,5,77,65,84,78,139,158,230,81,170,15,80,57,9,180,67,136,14,149,167,175,177,226,214,205,67,145,184,143,205,167,83,2,93,104,133,46,148,114,254,24,132,227,4,236,199,213,67,232,4,240,212,59,239,25,58,114,6,53,182,240,32,107,67,2,115,35,95,246,12,0,32,8,64,88,51,98,226,19,82,2,79,218,3,91,108,80,84,150,46,87,101,22,68,7,83,2,55,228,208,59,125,157,219,206,153,52,158,13,145,63,67,2,197,132,84,220,77,127,23,150,95,251,111,140,42,135,83,40,75,99,240,101,241,254,157,133,139,161,32,98,75,252,205,7,31,62,249,148,107,158,138,79,137,144,45,45,17,210,82,2,187,168,206,205,89,0,91,248,166,172,195,185,231,206,221,7,206,182,1,67,154,84,21,229,210,11,193,8,32,66,223,5,63,67,116,60,139,64,151,139,128,75,0,171,45,205,67,40,74,195,147,159,178,166,239,117,99,88,78,6,215,130,67,2,225,227,117,78,141,76,125,207,51,133,241,177,213,225,83,136,31,181,247,238,46,30,121,6,37,104,54,234,60,194,82,4,47,255,60,141,115,37,0,252,5,4,247,46,76,120,205,107,5,163,99,186,183,157,35,101,137,156,194,228,0,101,67,104,59,163,180,215,63,127,107,117,161,73,55,157,69,147, +82,72,86,208,190,250,232,148,3,30,216,136,99,234,202,122,83,136,231,33,37,231,172,75,43,15,228,10,237,251,126,187,83,104,51,236,251,247,197,101,205,101,96,184,116,72,132,57,83,72,128,129,109,109,177,75,73,15,30,164,16,131,78,165,83,2,173,170,236,58,187,53,176,157,86,175,94,189,236,100,82,168,3,53,205,83,237,228,215,174,14,192,175,24,85,41,67,136,32,181,105,101,95,108,244,253,68,173,254,219,164,28,67,232,100,176,211,246,247,2,103,30,150,24,110,243,98,117,82,4,45,88,145,94,21,152,246,2,160,101,175,245,58,105,82,2,231,170,9,23,99,161,136,209,35,64,189,187,69,149,67,2,227,6,150,230,140,88,201,67,140,238,30,66,46,0,67,2,225,39,182,232,139,242,30,100,115,38,47,113,84,197,83,2,177,185,41,51,62,202,22,255,8,142,17,7,48,196,34,48,103,101,177,88,101,138,236,177,57,235,141,71,180,29,67,232,31,240,137,231,110,188,124,126,134,5,46,152,46,8,83,40,17,67,59,241,236,168,221,133,191,20,82,21,159,228,205,7,141,112,121,134,172,234,103,243,83,38,115,242,147,146,66,44,238,242,193,169,37,38,255,223,136,245,15,160,84,9,67,136,14,227,215,70,60,222,242,111,32,53,246,77,101,0,83,200,17,117,150,234,137,138,86,7,240,170,7,150,119,252,83,2,117,200,228,54,73,249,64,161,72,16,202,142,248,203,83,232,185,1,7,75,143,4,201,12,131,131,132,76,21,17,206,205,24,12,227,66,246,60,215,153,246,130,255,175,32,218,83,2,49,177,166,50,14,212,182,44,56,9,216,65,153,118,82,2,219,136,149,153,90,101,77,190,137,185,166,23,40,70,67,2,223,64,93,206,11,129,17,41,0,249,158,138,166,60,51,4,121,244,29,87,18,96,187,198,219,215,10,107,67,16,83,2,183,186,204,62,208,89,235,141,245,76,185,73,69,189,222,41,130,1,147,191,205,213,70,181,174,115,16,221,10,221,67,40,2,144,34,215,77,57,123,127,134,103,55,227,130,72,67,8,23,240,240,54,79,15,29,171,14,42,80,121,50,162,83,2,119,225,201,47,125,175,172,90,119,77,51,20,13,6,82,144,32,76,111,126,161,156,249,226,59,193,141,245,77,250,83,2,251,233,106,47,206,4,225,44,46,61,165,11,133,221,67,2,101,103,158,236,12,40,228,76,170,73,169,243,110,203,67,104,139,169,2,124,254,201,107,207,128,168,163,249,232,35,67,40,6,181,236,109,175,188,245,197,1,119,124,98,122,4,67,2,239,132,134,98,79,161,228,14,28,174,11,255,140,117,82,4,55,103,127,203,53,156,187,145,215,197,127,194,157,4,82,2,231,164,151,209,98,113,108,209,125,38,194,212,3,233,67,232,25,117,158,163,188,178,100,229,67,235,2,185,225,22,206,217,182,186,236,173,187,110,173,171,173,22,162,68,148,97,66,80,90,204,188,117,53,183,185,175,110,13,99,15,53,214,82,204,137,164,191,111,81,8,96,39,129,216,159,18,125,238,83,200,1,181,172,245,129,135,22,7,78,244,95,168,12,129,67,2,199,68,100,206,12,29,200,88,83,183,201,77,159,24,82,4,79,59,99,201,49,1,0,167,146,223,106,74,28,132,67,2,67,135,148,88,143,238,103,238,245,150,151,174,203,3,83,2,61,227,44,67,53,88,174,60,96,147,75,144,44,38,67,72,26,181,171,181,24,127,255,243,0,168,200,160,221,186,83,104,133,161,143,113,211,111,79,13,159,247,217,140,1,2,67,136,25,245,127,189,93,188,178,207,64,230,254,121,128,126,67,2,219,129,77,222,140,112,188,101,106,61,90,181,253,173,67,144,57,140,251,107,236,77,180,158,71,120,22,24,75,145,65,138,8,140,247,123,215,219,245,130,216,24,188,93,116,201,83,2,55,161,134,50,13,64,250,38,194,119,118,242,43,35,83,8,163,33,71,105,111,14,109,15,71,244,47,74,8,27,81,144,32,165,180,106,78,109,223,169,181,31,162,220,156,48,82,40,74,208,219,43,235,164,104,42,199,24,11,147,52,182,207,113,17,25,0,128,255,245,152,105,212,33,130,176,42,73,206,49,93,3,158,183,32,3,0,0,39,235,147,0,200,209, +206,241,100,179,104,109,252,129,112,106,0,0,96,211,255,182,67,8,2,227,215,134,63,31,0,0,80,39,54,72,0,23,82,2,255,236,29,54,123,17,244,244,107,129,247,143,247,254,67,2,61,5,108,84,143,95,187,216,93,93,23,22,32,69,67,2,69,201,140,88,144,23,220,206,246,94,249,107,55,5,67,2,193,105,164,86,17,176,230,255,127,83,217,133,231,143,65,10,35,35,35,101,173,85,23,34,66,111,141,164,11,176,83,2,97,136,164,54,144,180,134,77,59,125,207,183,87,31,83,2,115,208,100,59,214,61,27,87,198,99,48,116,20,208,81,138,147,228,18,239,171,36,163,150,227,107,104,43,199,67,67,2,115,107,199,244,18,50,139,164,204,191,147,224,73,2,82,2,99,214,87,215,236,36,171,80,94,12,23,0,253,58,67,2,221,240,29,103,85,137,7,132,232,182,233,245,42,182,67,2,95,47,6,233,20,252,86,214,166,185,14,84,205,50,67,2,217,169,181,96,15,184,184,135,241,124,191,181,234,140,82,2,227,222,247,187,94,1,184,65,63,236,56,199,206,123,66,2,195,240,59,56,155,30,30,6,225,30,166,17,12,55,67,2,87,138,189,92,80,4,122,189,250,95,79,231,175,109,67,2,89,208,21,223,147,179,159,206,248,50,113,164,141,56,67,2,79,44,213,214,17,222,118,154,202,215,70,154,68,226,67,2,77,5,109,88,15,80,137,156,179,212,127,181,186,231,82,2,175,204,91,62,115,105,251,56,80,248,39,235,90,133,82,2,179,200,28,94,227,216,76,191,24,27,233,246,60,24,83,2,159,128,102,46,115,59,98,172,25,78,208,132,174,126,51,8,190,105,220,82,15,149,101,170,202,160,216,181,152,10,67,2,77,225,92,84,142,0,214,2,244,140,141,251,227,150,83,168,146,105,204,204,169,171,205,17,7,35,178,74,70,189,65,10,9,149,234,54,37,73,15,16,155,233,177,100,90,137,82,40,81,16,163,156,180,123,32,18,183,120,182,35,96,174,83,2,121,232,163,51,173,158,231,108,186,214,218,168,116,128,65,170,18,172,40,102,179,219,231,2,217,84,54,84,84,187,81,106,133,242,90,148,199,102,71,124,91,69,124,13,132,4,66,2,67,145,207,150,105,91,83,217,210,53,200,243,8,228,81,74,129,114,223,180,137,103,69,50,145,122,233,206,193,188,222,17,128,138,106,215,18,222,164,86,79,163,232,70,79,137,83,2,171,160,228,50,0,34,11,32,196,158,66,84,191,64,67,2,173,226,74,72,141,101,11,156,99,221,122,187,46,117,174,7,231,225,77,202,138,74,128,191,140,12,68,23,70,140,83,2,253,240,196,51,67,32,112,183,67,231,220,180,98,138,34,136,222,1,117,76,103,43,203,134,132,214,16,139,42,9,82,136,31,53,205,215,237,93,255,177,13,240,131,58,16,103,82,2,211,214,19,123,108,240,93,42,199,81,204,236,128,177,82,8,3,181,170,139,235,125,247,59,27,184,108,62,148,133,83,136,101,44,151,174,137,101,107,39,61,64,60,182,110,83,51,72,26,21,20,205,249,76,207,83,13,209,237,255,191,13,83,40,150,65,69,73,13,5,197,12,4,218,239,206,191,176,82,136,103,117,221,82,143,78,244,232,19,229,224,70,156,67,83,2,47,177,198,50,163,183,122,85,232,120,53,7,80,94,82,2,227,228,73,29,97,0,232,10,0,138,8,128,171,0,83,2,235,168,165,50,238,220,155,218,61,183,135,11,251,221,83,2,107,160,196,46,56,29,1,145,238,24,33,17,8,132,83,2,159,128,163,50,51,96,80,123,224,45,249,240,189,247,83,2,243,209,104,63,97,222,41,109,55,66,83,200,206,236,83,2,183,216,132,51,1,1,240,26,3,101,15,174,194,57,83,2,179,210,76,75,24,97,132,9,44,24,133,143,81,79,82,236,59,128,253,119,241,74,248,81,246,235,194,91,180,250,67,2,209,35,117,54,75,176,153,8,232,54,53,252,11,16,223,5,181,207,11,81,141,213,188,136,243,2,26,11,128,27,67,200,181,169,80,248,134,199,43,92,129,224,215,76,14,164,51,4,181,37,156,54,139,86,155,16,59,131,88,251,154,102,82,2,167,182,201,159,97,89,27,128,54,0,113,213,57,196, +1,10,3,48,239,102,50,214,240,72,206,190,203,252,23,2,82,36,237,204,36,122,17,130,121,64,147,193,164,10,51,85,82,172,0,160,46,182,51,16,190,33,0,111,119,82,139,7,34,234,122,245,180,189,195,7,13,3,20,153,8,62,153,229,67,4,215,246,22,9,148,219,83,202,245,245,37,247,180,182,67,104,123,195,211,158,241,246,122,183,33,7,116,77,113,216,66,48,57,73,187,182,155,120,99,198,143,43,231,33,32,220,67,2,93,34,102,106,11,76,137,238,102,4,64,20,128,25,83,2,177,200,101,51,24,0,136,56,66,126,15,122,207,174,67,72,156,225,194,249,241,201,135,11,80,76,184,104,8,132,83,168,48,195,226,86,110,214,108,131,129,71,154,137,177,72,83,2,179,193,8,55,152,74,7,61,39,101,35,112,12,44,82,4,31,242,35,143,137,157,21,234,166,232,149,68,129,140,67,72,26,213,178,127,223,247,229,231,68,33,17,118,128,96,67,4,215,178,244,192,158,180,124,119,64,249,145,109,138,210,82,232,119,240,42,200,228,220,168,38,11,145,111,218,33,0,83,200,3,181,180,26,57,198,175,3,88,188,89,51,81,19,82,2,203,136,195,185,104,5,163,53,3,198,14,84,186,147,83,40,17,117,173,253,46,188,124,3,190,139,22,117,150,147,82,4,95,177,91,141,19,24,91,198,182,184,166,132,217,91,83,168,7,227,192,214,107,122,215,134,43,120,17,129,12,254,83,2,117,219,142,71,64,237,105,243,169,238,237,248,110,247,83,2,115,201,72,55,237,95,138,98,1,30,234,50,37,170,83,2,53,209,103,51,4,0,4,93,20,64,157,133,198,93,83,2,101,152,165,50,193,246,137,177,250,132,83,14,33,214,67,40,69,195,210,151,179,230,123,119,36,78,174,187,3,62,82,136,5,210,48,183,176,139,231,30,92,64,14,182,81,195,83,8,3,44,81,95,207,47,93,124,187,185,137,47,8,18,83,8,9,236,116,230,249,237,94,44,127,200,141,64,112,10,82,2,35,182,183,155,91,32,48,42,237,104,144,59,35,114,205,7,135,74,118,148,75,105,123,84,200,141,233,225,241,2,66,108,205,82,78,90,225,37,250,143,0,149,134,146,95,146,51,4,73,202,244,212,138,255,182,165,65,36,193,205,78,209,82,168,0,16,14,121,224,178,202,50,11,1,166,233,76,106,67,232,79,204,9,173,218,183,94,174,24,85,78,64,59,8,82,40,2,16,154,153,96,187,237,190,43,241,130,244,17,122,83,136,236,33,77,115,237,2,71,11,34,145,155,127,213,9,82,136,91,85,243,255,98,64,199,176,26,176,34,76,80,148,83,2,171,176,6,55,115,104,16,207,4,119,74,146,3,101,65,114,145,200,93,139,39,181,19,66,176,96,127,136,39,105,205,7,59,239,223,148,8,72,160,64,68,67,37,198,95,205,65,234,14,35,99,199,234,48,21,58,212,68,30,103,220,47,81,16,150,145,134,199,183,233,118,38,145,50,16,21,170,146,67,4,79,144,210,8,132,143,120,4,42,109,24,114,34,145,83,232,6,236,116,148,25,157,127,6,75,212,38,137,1,247,83,2,181,201,233,46,207,171,169,67,175,12,248,35,50,38,67,136,19,227,224,207,47,175,169,237,33,47,84,175,3,186,67,2,223,202,197,216,142,136,143,154,54,62,32,144,143,87,65,170,0,172,235,247,112,206,107,107,22,11,127,169,192,61,83,40,145,97,111,111,19,229,8,13,141,173,63,128,136,138,82,168,42,139,72,105,138,214,60,165,9,106,54,83,0,56,83,2,53,193,231,50,198,56,199,133,185,204,157,4,196,242,82,2,113,100,78,117,99,64,11,140,155,162,253,205,228,0,67,196,70,83,117,169,238,203,5,239,219,0,246,150,105,188,83,2,109,185,38,55,13,210,48,167,19,239,79,223,239,187,82,4,83,58,155,151,69,190,121,64,156,94,81,137,165,91,67,2,103,43,214,226,76,40,0,232,108,137,163,113,57,221,82,136,85,176,21,119,156,139,40,42,10,9,40,215,237,86,67,104,42,245,173,229,37,171,91,107,0,100,177,243,176,13,223,241,18,21,0,192,195,199,107,251,21,136,19,17,84,128,221,139,3,227,138,91,114,2,0,0,20,229,144,5,14,72, +33,10,2,195,51,62,178,93,0,0,64,61,224,121,68,15,175,81,3,17,0,0,220,186,229,188,111,75,161,17,147,57,82,72,49,50,177,167,130,190,108,39,195,129,95,206,237,174,67,2,71,233,188,94,18,16,39,132,201,177,228,6,29,195,82,2,33,33,57,172,141,72,18,81,115,76,136,25,152,90,67,2,251,162,87,248,77,68,140,122,166,75,248,227,50,26,67,2,251,203,231,120,84,201,153,98,237,29,209,15,237,26,33,6,121,162,108,9,202,247,254,34,31,205,196,238,76,0,83,2,191,242,141,83,16,32,4,33,36,176,243,92,255,88,67,2,209,170,221,98,20,75,21,67,225,35,33,58,80,8,67,2,119,138,223,244,20,128,61,194,222,224,59,0,106,18,67,2,247,139,223,118,148,116,15,16,62,96,88,32,181,172,83,2,251,243,176,83,180,190,13,120,60,32,42,175,21,21,83,2,189,234,174,83,255,16,16,49,0,211,80,55,175,183,66,10,237,228,143,255,58,129,249,123,127,215,255,183,5,202,83,2,249,226,140,71,23,8,123,4,163,94,106,170,146,151,67,2,247,107,199,244,144,154,140,174,175,243,13,102,151,98,67,2,251,178,55,121,84,128,163,35,77,38,87,21,124,156,67,200,63,11,106,162,195,165,174,229,32,53,45,29,177,145,67,168,86,44,187,221,122,159,209,42,27,246,181,152,208,248,67,2,207,235,228,84,80,76,112,80,42,192,234,124,79,209,67,2,77,228,124,84,15,120,140,39,114,228,40,51,38,140,83,136,153,73,174,206,43,41,75,17,128,7,214,72,232,226,67,2,83,66,85,86,14,32,218,162,181,62,124,25,43,142,67,136,176,65,144,81,119,109,110,210,16,147,218,163,74,129,66,2,241,141,116,208,45,23,189,147,61,135,115,4,175,0,67,2,81,39,141,96,16,146,36,164,147,25,60,102,202,113,67,2,81,65,61,228,139,252,255,239,252,59,212,2,190,2,83,2,247,236,205,67,40,236,163,206,105,253,188,185,215,56,83,72,0,35,211,245,109,82,230,131,6,64,16,178,168,101,67,136,25,99,120,251,111,189,237,127,99,138,147,79,116,19,205,107,61,227,53,31,227,152,250,150,142,213,19,164,108,199,67,104,13,172,74,181,230,201,98,47,150,109,87,229,191,114,207,9,163,97,6,69,42,78,246,242,52,6,198,221,221,219,67,2,209,36,125,82,76,60,38,218,85,82,5,104,114,140,66,168,148,137,73,36,101,81,169,178,36,87,234,232,75,83,81,106,134,196,147,226,26,46,32,156,77,206,143,179,49,241,223,105,6,113,101,61,117,208,247,189,13,152,148,147,236,201,66,84,67,192,123,175,254,141,255,255,149,242,214,114,104,31,82,4,95,209,219,94,19,148,251,66,84,22,33,180,6,17,67,2,233,98,78,112,76,10,0,165,4,88,216,73,34,180,67,72,26,181,46,39,253,248,210,150,132,149,144,0,18,64,83,2,187,216,164,51,8,0,96,33,0,207,99,224,141,166,83,2,59,233,165,59,144,73,238,21,99,55,83,250,2,83,67,2,243,67,111,250,75,204,123,127,178,6,182,19,1,209,67,2,113,72,143,116,16,113,11,169,112,30,10,251,178,116,82,2,203,146,17,31,120,201,172,147,203,228,238,214,16,158,83,40,11,195,139,227,110,90,149,135,166,111,130,55,217,16,82,2,231,244,138,63,243,216,212,177,155,101,237,98,220,149,81,234,247,100,53,222,183,188,35,164,73,146,99,65,160,13,67,40,31,117,44,109,96,157,109,244,18,26,138,44,113,72,83,2,241,185,233,58,163,247,30,74,111,24,182,30,210,163,83,2,175,176,197,50,121,175,1,245,171,0,137,141,33,192,82,2,171,176,139,86,251,72,85,170,10,21,184,102,78,133,83,104,5,181,148,154,131,182,54,6,20,178,58,202,8,80,82,2,177,36,29,157,217,16,17,147,54,72,229,205,85,244,67,168,75,213,244,63,50,218,97,207,4,37,229,156,134,50,82,40,11,112,150,121,220,202,196,18,202,128,210,174,163,19,67,2,67,228,108,58,75,244,62,220,85,242,20,162,81,18,67,232,99,240,136,147,206,191,92,58,142,128,3,190,228,182,95,177,61,37,202,214,253,226,47,175,90,173,142,65,112,173, +65,74,83,108,93,250,178,247,101,34,230,109,68,114,253,0,83,2,179,202,236,54,225,87,11,248,12,194,232,10,106,42,51,4,219,242,61,97,146,166,224,9,27,108,70,254,178,54,82,2,227,240,88,246,224,112,129,179,233,138,163,50,243,197,66,136,229,225,176,158,255,246,163,151,244,22,39,5,143,30,81,170,196,242,82,22,205,247,134,194,102,209,176,25,220,9,83,8,172,65,99,7,141,139,141,15,73,23,166,240,12,160,67,2,113,164,134,224,76,121,189,27,46,145,106,2,4,8,223,3,175,111,148,165,154,203,80,79,202,253,217,60,64,42,67,4,83,146,180,168,248,77,149,86,152,90,66,41,123,108,82,4,27,123,235,95,117,242,107,64,69,104,47,98,41,16,34,74,128,193,197,201,207,34,5,11,160,68,61,141,229,33,67,168,3,149,225,126,52,226,100,150,68,83,75,25,18,205,82,4,85,249,225,94,21,48,130,166,13,137,71,240,180,202,83,2,239,168,200,46,67,113,112,125,54,223,149,191,106,58,67,2,185,190,211,69,28,17,34,134,148,149,4,248,88,237,83,168,132,1,5,41,11,11,81,15,16,100,71,255,180,15,205,7,163,124,249,84,173,123,209,183,1,102,127,100,118,127,83,2,109,169,234,46,140,42,137,1,41,2,185,153,239,169,82,40,9,16,146,106,90,163,200,46,12,185,59,236,82,118,82,4,31,61,191,95,85,90,118,196,164,34,13,58,1,203,35,12,215,228,110,239,249,85,185,3,74,80,42,149,20,0,83,8,3,204,235,62,197,227,40,254,162,2,32,143,231,245,82,16,68,204,94,60,171,197,113,201,219,249,196,192,65,20,83,136,131,65,65,229,76,69,103,13,47,50,40,70,251,253,66,2,55,104,51,56,151,62,120,183,100,221,41,82,8,36,67,168,5,195,215,151,111,206,241,167,33,215,250,12,145,108,82,4,111,253,106,201,49,21,137,252,187,192,252,242,24,132,83,40,202,161,145,113,19,71,9,13,124,68,207,12,56,3,83,2,243,201,9,63,227,6,127,189,183,218,26,160,131,75,83,168,109,99,220,125,93,75,181,134,64,7,144,232,5,252,83,2,49,195,13,71,62,109,96,106,176,189,90,51,29,51,65,234,31,149,153,119,101,9,13,4,68,158,84,54,127,123,65,138,101,204,249,251,186,246,108,147,136,3,53,41,113,245,67,2,89,131,125,94,139,229,172,231,54,134,80,120,64,224,81,2,103,22,212,80,208,176,64,123,92,149,226,15,182,53,66,2,125,149,235,30,115,85,111,194,94,98,8,25,128,122,33,170,48,99,55,179,231,181,36,231,157,65,190,220,188,34,82,36,93,115,153,139,240,52,72,209,181,178,236,169,181,186,67,4,79,176,174,72,123,223,146,253,63,218,83,136,122,9,66,144,32,172,41,205,62,109,126,238,239,9,16,5,133,166,221,199,142,90,61,109,93,46,25,253,79,129,218,97,35,100,223,177,49,172,222,75,29,108,223,193,104,177,161,127,14,240,83,40,4,181,181,238,47,14,87,3,164,110,99,88,180,69,83,168,68,181,215,254,38,30,89,3,222,103,131,116,45,228,81,74,53,108,194,121,105,181,19,188,221,116,175,35,250,236,83,136,8,163,248,118,125,230,206,135,80,165,4,154,81,105,66,2,51,93,59,180,159,91,160,14,89,46,147,34,45,34,83,2,181,200,228,42,97,70,161,85,127,6,230,197,184,143,67,232,119,35,96,157,56,102,233,103,160,43,70,62,232,111,67,136,24,240,168,147,237,7,30,125,6,56,23,49,200,128,82,2,147,174,135,214,96,112,253,199,91,187,124,39,144,239,65,10,27,99,73,73,141,53,29,134,136,223,178,178,57,3,67,136,101,208,137,215,229,11,87,174,78,138,155,225,134,23,83,208,253,204,116,187,151,127,213,167,51,90,192,144,193,157,82,4,23,180,41,217,1,0,221,254,19,204,175,84,38,1,82,8,63,80,34,136,230,123,185,205,39,185,71,6,111,137,35,136,133,225,98,134,61,182,124,159,126,15,204,167,193,178,81,202,24,172,78,154,39,189,145,228,1,214,172,213,112,67,205,139,3,35,163,51,90,85,0,0,64,26,129,6,58,172,205,19,223,204,221,0,0,32,28,163,148,129,170,38,74,226, +221,11,2,3,146,104,234,3,0,0,4,89,255,246,243,142,83,8,2,227,67,23,231,0,0,64,101,112,2,162,1,29,82,72,86,240,237,102,97,237,222,235,158,229,236,123,218,102,83,2,211,87,223,121,247,56,120,50,130,199,1,48,48,164,67,194,230,233,233,215,129,204,114,211,69,103,142,101,51,204,82,2,135,175,161,57,174,136,83,40,8,85,161,54,197,21,67,2,119,108,239,118,20,84,64,20,133,57,176,86,208,223,66,2,135,124,130,59,195,21,64,114,214,121,114,119,123,183,82,2,203,216,210,95,92,64,252,112,169,224,2,123,3,209,83,2,191,251,208,83,32,174,11,64,59,222,223,182,238,242,67,2,123,205,239,248,83,239,4,81,178,115,169,115,144,159,67,2,107,202,222,110,148,37,228,139,10,138,80,109,132,129,67,2,253,170,231,118,20,216,238,151,1,96,42,32,42,17,83,2,183,217,104,59,16,113,3,184,158,60,182,71,198,109,34,144,19,203,208,35,247,61,253,233,224,250,36,85,39,218,83,168,200,161,173,173,81,37,79,17,234,225,155,22,71,244,81,212,214,100,214,23,103,150,84,162,68,195,205,80,252,114,51,104,216,1,151,140,166,187,206,194,42,1,8,72,235,166,83,2,103,152,133,54,2,3,68,80,140,208,188,38,254,111,82,104,216,161,210,54,245,117,233,146,7,105,50,74,113,103,67,2,155,20,82,181,149,8,84,75,193,39,245,112,157,198,67,2,113,33,79,246,12,100,1,50,1,16,48,2,68,80,67,2,115,112,31,249,21,206,136,88,35,92,42,19,148,6,83,2,115,200,100,51,33,21,116,63,133,65,66,40,1,194,67,2,101,104,158,106,17,148,115,176,11,241,148,136,204,56,67,8,9,163,176,239,235,118,13,185,33,242,162,63,28,67,67,168,3,176,155,178,231,55,47,46,151,120,48,187,136,136,66,168,128,161,61,135,62,238,98,159,234,31,227,166,197,131,67,48,185,106,235,156,167,181,117,94,162,81,144,236,228,35,82,140,103,192,189,175,17,104,165,2,64,207,84,42,22,97,83,2,49,186,235,50,175,183,168,195,104,8,198,202,249,104,82,2,171,252,138,83,245,36,144,174,153,71,175,170,76,85,67,136,60,176,203,230,229,62,23,178,6,21,164,122,87,136,66,144,126,140,231,126,121,175,156,181,237,11,244,2,5,14,82,168,18,203,49,30,93,197,162,76,9,6,225,206,58,79,82,168,40,117,95,82,241,176,78,189,30,64,97,42,197,108,82,204,54,160,46,174,20,54,141,223,133,132,223,167,41,21,83,8,9,236,247,174,247,121,152,126,246,6,101,240,10,150,83,40,2,140,207,125,153,52,77,47,64,110,122,55,104,5,67,2,93,139,189,214,80,26,153,58,223,216,220,45,243,198,65,236,70,146,78,58,161,25,187,226,82,155,255,253,255,192,82,2,43,172,11,83,217,88,44,160,142,76,231,107,78,181,82,2,47,228,139,93,113,80,69,184,74,177,100,42,112,165,82,136,103,48,158,168,230,51,13,57,230,72,147,68,58,52,67,136,159,161,98,226,52,168,234,218,81,199,237,228,199,106,83,200,152,33,41,75,175,226,230,12,254,255,139,53,17,19,83,40,11,181,148,62,171,26,61,3,53,114,19,75,120,130,83,2,63,249,196,51,41,83,208,207,16,115,205,189,170,81,83,136,25,236,148,165,139,251,172,100,201,151,111,11,106,226,66,232,238,9,186,193,87,153,234,236,160,95,0,0,112,202,207,169,146,161,199,85,239,180,103,205,250,14,129,159,145,145,66,2,83,246,83,185,233,25,144,221,211,211,59,91,243,48,83,200,24,117,150,106,205,11,247,7,59,177,159,27,182,101,83,2,45,170,205,46,123,239,182,119,240,171,81,112,171,64,83,40,245,97,71,41,239,248,216,92,25,128,131,32,64,130,223,137,12,177,101,53,189,184,90,75,59,136,211,222,187,32,67,2,213,35,109,86,12,122,140,232,172,172,82,19,16,215,83,2,241,185,234,46,115,215,48,159,6,115,247,26,107,31,221,107,139,161,73,171,245,5,203,206,81,88,58,14,44,67,82,4,109,89,25,78,83,100,186,66,243,15,117,45,87,109,83,40,129,161,226,230,42,103,205,10,180,105,15,29,249,207, +223,5,209,68,165,74,139,177,252,43,64,4,129,34,13,208,83,168,3,163,249,174,69,231,174,135,147,254,141,191,129,19,82,240,40,131,43,13,45,245,248,208,154,106,120,103,64,112,67,72,1,112,166,62,253,183,53,171,23,16,97,242,108,136,65,10,9,3,35,231,140,153,17,74,185,129,80,4,77,88,65,106,11,108,111,214,217,210,172,131,71,36,194,243,1,222,66,208,8,236,189,119,45,173,173,123,222,1,227,157,31,98,65,234,119,236,188,78,183,247,46,25,224,200,82,68,167,155,67,136,14,245,123,245,58,234,213,247,132,76,147,182,152,76,223,169,135,193,141,120,220,146,100,162,11,129,195,65,212,110,83,136,14,44,151,167,249,118,111,165,22,221,5,253,174,14,81,180,196,4,82,230,30,158,85,82,239,224,49,64,187,226,82,136,14,117,91,246,230,172,71,113,12,32,171,161,88,236,82,172,64,192,111,175,112,191,76,149,189,2,119,74,188,107,67,4,55,118,212,40,105,109,85,115,117,24,210,5,8,37,50,240,9,237,238,88,76,142,206,36,203,138,160,166,5,59,34,116,242,234,220,14,127,175,126,140,141,127,154,247,162,8,83,232,157,1,9,11,205,230,68,69,129,185,87,108,172,213,67,168,3,112,40,83,111,170,28,173,20,3,201,201,188,186,67,2,227,131,94,106,11,184,216,130,55,15,111,79,220,85,67,2,95,235,205,94,15,242,109,224,55,25,198,103,56,188,67,2,77,227,84,92,12,77,44,17,115,200,93,2,238,80,35,232,157,161,62,197,43,223,19,71,189,6,65,32,128,74,67,2,91,168,165,98,15,255,97,31,200,67,138,62,118,64,82,4,251,183,183,203,19,240,174,154,107,157,127,89,110,217,83,240,143,230,156,107,119,106,157,42,133,81,209,127,15,119,65,10,35,131,141,145,173,204,28,58,96,85,53,122,210,137,67,72,0,163,243,221,108,167,171,189,34,67,16,36,78,18,67,8,35,112,155,177,117,172,92,186,6,172,47,178,201,107,83,8,75,99,136,146,237,246,140,131,91,229,137,64,59,120,67,2,237,163,102,232,75,7,210,162,111,30,19,157,246,109,83,2,185,185,168,58,249,190,45,221,40,17,178,58,7,229,66,16,55,35,206,196,235,220,177,238,206,161,244,20,127,208,33,198,156,88,113,15,128,103,167,239,36,39,30,144,33,171,65,170,0,16,71,227,41,141,111,81,104,25,62,49,31,130,205,7,13,126,237,148,107,175,164,30,6,239,76,118,207,18,67,2,247,129,77,204,74,76,61,174,90,152,33,98,5,24,67,240,15,236,157,59,87,123,187,63,71,88,124,144,14,70,67,2,207,234,204,84,11,137,85,167,77,240,253,161,61,231,65,146,244,194,65,105,33,116,53,224,0,114,1,176,160,88,81,138,213,50,123,157,11,117,71,155,91,244,158,3,96,90,81,42,237,242,219,52,39,127,5,33,84,128,33,210,142,29,82,80,117,44,74,139,41,173,250,69,73,17,210,133,8,12,82,4,31,254,123,203,49,100,78,145,183,133,214,224,94,103,50,168,131,129,23,191,241,124,13,254,84,101,113,188,134,242,82,40,9,240,137,104,218,138,4,158,217,0,54,160,165,111,66,40,169,193,68,79,176,198,134,79,58,6,45,154,244,254,83,2,121,225,134,51,167,112,244,223,48,121,63,157,162,5,65,170,20,108,109,246,238,254,54,59,205,34,30,82,255,128,82,168,40,48,143,120,36,195,42,67,45,65,133,25,24,44,67,136,14,99,146,77,62,44,207,161,98,144,105,121,129,108,66,172,135,210,193,135,35,37,105,37,102,5,45,240,151,10,82,232,119,80,28,184,178,91,198,173,183,196,182,98,33,10,67,72,28,176,147,117,211,63,28,173,78,168,73,253,208,196,67,2,231,133,134,244,75,251,88,191,217,136,182,136,4,50,205,139,142,193,110,111,255,42,29,174,14,58,22,64,22,159,83,40,21,163,243,102,253,222,159,134,96,240,144,51,172,245,65,106,156,146,106,229,114,137,81,184,81,228,170,99,142,32,66,16,0,169,119,196,223,245,41,206,174,42,1,11,253,211,222,113,180,26,0,0,0,117,237,126,79,79,8,196,2,129,206,49,74,105,82,26,1,0,64,170,201,38,28,178,172,202, +65,10,2,195,197,201,17,0,0,33,11,164,129,1,164,0,205,11,2,113,207,231,211,1,0,0,64,63,223,38,218,45,82,2,71,248,209,55,92,0,248,6,34,177,250,162,72,156,83,168,129,18,59,251,251,95,189,30,239,4,114,171,247,24,83,2,253,242,205,79,24,97,109,17,140,44,146,202,244,126,67,2,115,46,7,115,85,48,178,87,229,141,250,65,196,2,83,2,241,210,109,79,128,118,138,129,75,143,2,56,168,131,82,2,75,220,226,83,84,249,231,83,187,186,225,14,212,7,67,2,253,211,79,251,151,59,32,228,110,234,137,155,113,164,65,138,225,18,203,45,87,171,112,0,30,41,138,255,67,137,83,40,66,108,191,229,51,214,239,108,212,131,152,154,96,233,67,2,245,69,119,112,14,8,214,2,233,60,142,177,39,119,67,72,134,65,243,137,115,77,131,19,16,46,179,40,15,202,81,2,167,16,18,81,194,188,0,110,130,141,96,74,30,151,67,2,67,199,205,48,11,206,255,81,46,143,89,15,105,45,67,2,165,224,75,182,11,16,217,29,25,30,228,177,35,221,67,104,149,97,242,40,213,193,13,203,145,65,79,50,77,23,67,8,9,208,225,83,102,30,127,115,20,160,136,222,66,65,67,168,42,144,33,211,110,172,30,118,134,0,16,34,12,152,83,136,213,193,36,201,108,10,169,77,36,54,104,10,244,218,83,2,185,232,164,51,239,79,250,238,223,41,126,223,86,5,223,41,206,129,137,56,88,219,76,63,207,32,66,189,149,27,65,106,13,227,2,233,172,219,15,162,244,223,104,166,7,208,82,168,18,117,154,103,213,12,87,247,12,192,182,145,241,125,51,8,26,163,124,76,205,211,96,55,38,73,1,39,17,97,67,168,7,227,113,199,173,223,117,126,96,228,224,253,204,12,82,112,5,12,41,167,97,156,91,181,182,153,156,139,109,39,82,2,171,238,26,86,123,225,77,38,89,119,204,40,129,135,206,237,119,245,253,31,199,15,59,35,153,79,38,206,67,45,81,152,246,246,157,27,127,238,254,54,214,135,98,38,143,182,67,4,81,146,210,8,180,112,195,20,28,0,174,246,89,223,82,2,175,212,220,123,217,88,30,161,43,64,35,31,84,182,82,2,103,196,154,85,115,208,118,235,200,29,212,238,144,169,67,2,81,200,204,82,140,45,20,187,151,192,31,64,119,109,83,2,179,192,6,51,181,183,18,250,158,136,173,13,96,60,82,2,87,226,214,144,96,0,8,30,66,196,199,12,196,57,83,2,249,224,132,51,103,41,112,238,113,235,190,171,219,190,83,2,47,176,196,46,136,244,141,16,138,2,67,250,13,130,67,2,103,98,62,108,140,155,0,14,223,120,58,157,17,158,67,2,103,168,166,238,144,130,202,18,247,228,152,103,56,2,67,2,235,102,182,108,139,226,169,64,237,132,53,142,77,16,67,2,101,39,142,232,79,19,32,197,16,155,18,59,225,236,83,104,5,35,211,164,105,207,253,133,89,67,87,4,57,0,67,2,225,168,221,218,140,92,17,154,155,200,230,32,55,237,66,2,215,117,219,188,235,58,119,80,119,247,123,123,32,187,67,136,14,99,245,219,172,247,190,118,97,89,114,227,180,236,66,2,215,184,215,226,105,61,119,219,119,9,119,151,119,119,83,72,135,65,71,75,47,79,43,15,243,110,112,54,243,116,67,2,89,113,21,91,15,190,224,58,191,232,76,61,43,165,67,40,34,176,209,118,253,26,53,190,150,247,240,30,217,222,67,2,215,81,37,215,143,129,202,154,131,97,76,33,114,212,83,200,9,236,219,117,221,108,89,100,219,182,117,51,50,161,67,2,227,226,101,218,12,184,220,61,183,110,189,59,55,174,83,136,131,65,37,71,205,6,103,65,23,115,192,51,186,249,83,112,242,198,89,95,87,95,223,46,29,94,176,79,53,1,82,4,57,210,161,79,241,40,147,70,164,80,32,178,180,121,175,17,95,9,95,219,107,181,156,190,42,43,43,176,21,117,82,176,150,42,77,243,176,183,170,94,41,186,81,16,40,192,82,104,114,208,145,103,36,203,51,63,252,48,13,206,54,236,82,204,65,224,46,180,19,160,210,64,211,117,128,194,93,105,65,202,17,172,219,243,119,142,235,37,9,123,168,178,59,16, +82,144,57,236,226,44,239,213,208,78,153,193,47,224,75,244,83,104,59,203,169,151,5,107,181,135,191,115,130,150,76,240,67,196,88,247,45,9,229,191,64,123,157,247,238,225,212,187,83,2,243,202,78,55,245,97,24,146,194,26,82,9,49,165,83,136,178,33,39,45,205,4,233,10,149,96,9,17,209,229,67,2,205,97,101,94,76,178,172,224,119,43,68,7,58,243,83,200,59,195,225,211,110,246,172,131,155,121,65,82,102,96,205,7,155,110,49,142,88,140,11,0,136,128,45,18,197,38,205,43,129,225,130,19,101,186,46,157,80,18,44,19,29,135,82,2,243,180,11,183,91,112,131,2,92,132,71,141,128,150,51,4,187,165,148,52,139,107,28,42,125,12,204,196,219,94,65,170,1,76,209,92,208,155,230,163,124,187,15,54,118,52,222,205,3,44,235,173,163,156,143,239,148,202,252,227,28,76,67,2,229,8,159,242,14,101,204,200,118,38,241,250,153,72,83,168,102,163,136,147,239,246,204,134,146,8,25,247,227,12,67,2,87,76,253,88,142,142,215,243,202,88,170,205,241,148,83,72,26,204,251,189,213,243,62,220,29,36,99,150,72,3,223,5,237,241,230,106,18,127,76,108,73,11,100,20,149,200,221,7,7,39,51,185,201,69,167,87,185,41,179,159,6,2,65,234,203,100,9,222,110,175,86,98,211,58,31,23,158,144,81,212,172,194,218,218,103,181,216,0,109,182,53,232,217,216,67,104,120,112,249,185,87,155,118,45,20,226,74,167,92,149,33,6,132,88,1,128,250,57,83,11,176,253,133,207,6,50,67,72,102,176,179,54,199,59,53,111,71,14,30,240,5,58,67,2,221,170,213,100,77,102,237,149,42,127,88,160,175,25,83,2,239,194,44,67,12,104,89,16,66,89,184,120,100,114,81,240,9,172,60,89,185,174,107,214,125,229,152,133,0,4,83,232,153,129,67,39,205,139,141,15,55,51,181,90,1,223,67,80,3,236,159,90,93,123,254,63,85,7,42,63,89,108,67,232,124,163,136,165,94,167,46,187,98,110,188,51,41,65,83,136,14,117,173,105,67,42,31,7,104,127,194,159,249,205,65,42,9,149,153,211,105,109,15,36,32,179,172,234,210,187,65,10,27,99,131,103,13,117,27,70,126,248,20,250,196,173,67,2,213,164,124,82,15,43,52,174,137,97,202,224,101,62,82,4,27,235,91,219,35,171,58,10,146,255,213,75,126,214,83,104,5,245,222,171,97,139,255,3,223,6,116,51,183,85,83,168,8,181,180,110,71,14,247,7,72,249,52,15,240,216,65,42,17,172,46,106,178,183,172,0,92,168,118,207,93,96,83,104,216,9,189,146,178,109,111,15,79,20,221,192,1,24,82,8,9,240,21,136,102,163,140,62,202,0,102,191,162,83,82,2,231,132,136,241,88,25,164,237,247,187,64,181,144,234,83,40,128,225,70,73,47,3,9,13,198,190,208,161,68,36,50,232,228,161,35,26,158,120,199,255,126,125,193,178,60,32,49,106,18,117,45,70,171,152,70,42,64,157,104,174,3,238,83,2,33,177,199,46,60,188,205,73,27,28,146,20,17,10,66,72,152,129,20,95,55,212,102,206,55,12,33,46,210,253,67,200,16,144,64,83,198,159,30,187,148,168,96,25,251,94,83,40,74,67,51,245,68,207,213,134,79,178,153,160,228,83,65,10,155,242,149,251,53,103,67,36,111,220,179,53,216,16,205,7,173,60,127,140,171,109,23,223,114,36,104,34,157,82,67,8,43,240,233,103,71,31,207,94,75,82,76,211,8,105,205,7,191,26,50,20,18,96,37,1,30,146,200,74,231,210,81,10,43,172,218,11,161,132,155,181,128,88,46,179,1,223,82,2,27,166,23,82,211,184,214,250,101,44,78,92,129,201,67,40,55,195,81,151,50,124,220,187,162,224,213,89,61,131,81,144,126,236,68,213,92,52,199,183,3,71,87,33,198,148,83,168,42,227,169,231,237,253,155,133,134,2,182,252,246,239,65,42,17,236,111,122,167,52,39,43,157,163,0,178,79,185,83,40,197,97,75,109,81,69,9,13,187,168,123,72,67,214,206,141,3,99,200,149,77,1,0,64,0,5,167,112,0,165,205,139,3,35,130,18,181,52,0,0,64,96,202,14,138,44, +65,10,2,195,193,197,13,0,0,145,6,13,65,61,188,9,83,8,2,227,169,39,109,1,0,64,82,145,11,9,128,4,67,2,125,195,103,122,142,24,67,104,212,105,2,10,35,27,82,2,23,156,212,151,92,225,67,7,137,136,83,210,21,193,83,2,241,202,78,79,47,64,166,162,229,138,236,234,187,108,83,2,211,87,223,125,245,120,48,237,172,206,173,166,164,83,67,2,119,42,167,238,78,27,62,204,40,134,74,81,61,180,82,2,195,248,144,63,94,153,115,228,169,195,150,99,9,109,66,2,27,233,159,56,207,26,230,123,94,139,249,36,112,14,66,2,171,248,175,251,207,94,10,228,64,118,96,89,234,65,67,136,43,245,45,117,251,248,145,223,131,200,16,101,148,215,65,202,9,76,229,93,181,247,37,241,149,77,56,176,234,176,221,43,202,97,225,194,115,79,207,84,161,218,108,46,168,4,78,7,227,209,47,251,25,142,96,8,232,12,22,130,55,219,66,72,129,225,241,231,232,222,199,87,58,22,40,28,144,208,82,16,27,44,41,183,95,116,122,210,154,161,19,231,169,19,67,72,156,97,242,91,81,207,11,7,81,53,45,161,17,152,66,2,41,0,225,146,54,87,29,193,162,128,126,11,54,15,83,104,139,1,35,103,11,101,135,67,5,69,74,108,80,210,82,2,97,162,79,161,91,65,116,159,217,237,20,197,146,0,82,240,184,172,93,252,231,143,101,117,153,66,179,231,11,25,82,16,97,236,226,13,97,164,121,82,10,217,143,185,132,228,65,234,119,44,185,111,154,178,173,81,188,82,252,36,129,3,223,5,97,230,141,88,141,196,175,88,235,191,181,109,11,183,82,2,179,162,92,121,97,25,16,33,113,166,229,166,84,165,65,42,2,117,87,53,35,39,13,136,81,11,38,115,30,64,66,136,168,233,206,44,18,187,148,135,126,12,2,38,157,43,67,4,51,146,210,72,22,4,170,90,80,204,166,36,40,245,51,72,145,129,218,89,235,235,46,199,219,208,192,109,182,4,82,136,101,131,165,188,221,184,51,101,9,2,1,81,105,150,65,42,17,131,101,7,173,187,21,98,5,199,33,254,124,203,67,104,5,99,47,179,174,239,62,125,32,217,228,223,30,245,83,2,107,161,168,50,115,175,23,199,190,24,251,137,1,14,66,170,224,114,24,251,246,9,2,60,229,64,150,129,102,49,34,10,157,129,142,22,133,135,105,15,89,253,80,149,202,156,83,136,229,33,5,9,45,45,79,13,4,138,188,169,248,154,67,104,6,163,229,231,172,142,226,54,160,15,246,221,30,251,205,7,27,110,217,148,107,105,165,1,82,91,96,231,178,21,223,137,142,105,97,133,21,175,112,202,11,161,82,3,99,36,67,2,85,1,69,212,11,218,153,99,220,132,49,198,133,8,83,2,251,232,163,51,26,1,176,3,6,107,87,186,218,48,83,2,41,160,131,46,251,157,139,195,223,16,135,135,33,149,83,2,157,104,100,46,4,32,145,8,0,107,104,112,254,115,67,2,235,200,158,112,144,146,36,132,128,19,223,148,245,206,82,72,101,208,193,7,27,189,227,150,220,120,113,30,61,80,82,2,113,46,221,149,121,216,109,128,56,63,163,123,204,28,82,4,121,141,49,141,149,69,248,62,158,190,237,147,117,187,82,236,118,224,221,190,20,58,88,83,33,136,54,53,134,235,82,12,35,224,47,254,145,69,98,229,68,209,116,132,189,74,82,4,47,46,249,151,21,104,142,0,161,120,143,48,61,131,83,200,7,181,246,238,47,190,84,3,32,1,192,173,254,127,82,2,107,214,218,62,123,232,220,219,121,183,184,39,131,182,67,168,3,208,65,215,239,191,22,118,134,89,29,25,83,201,65,146,160,36,230,40,95,158,150,184,14,239,119,231,64,80,82,172,126,224,172,103,20,20,148,2,165,38,47,25,148,3,66,2,219,249,215,57,105,26,123,23,247,109,55,70,239,128,83,2,57,217,8,43,64,232,140,173,237,194,135,124,87,173,67,4,121,150,216,72,234,0,188,11,202,71,192,109,96,105,83,72,154,233,188,146,180,35,37,13,160,14,158,18,247,87,221,139,153,193,180,29,223,11,227,195,144,249,173,4,229,160,83,168,131,161,73,41,207,44,9,88,204,6,66,228,124,255, +223,105,149,161,52,228,86,155,72,34,234,144,168,225,231,224,83,136,232,1,231,12,77,71,73,13,42,137,18,83,248,93,175,41,234,225,51,206,71,195,92,162,109,198,13,85,116,87,67,196,208,117,13,25,132,20,63,89,26,181,88,97,105,101,65,202,17,227,34,103,109,153,17,2,36,88,71,71,130,238,82,2,185,166,14,142,97,96,92,139,40,87,171,223,221,26,82,232,58,16,146,104,102,107,38,38,198,100,97,158,49,144,82,8,1,245,105,255,230,236,31,243,10,72,148,5,55,250,67,104,43,107,215,81,218,240,58,119,164,123,69,224,202,0,67,168,0,176,153,163,231,30,127,114,6,229,113,102,83,56,66,72,49,209,46,208,237,121,239,111,79,155,207,99,30,215,81,138,25,204,94,29,97,132,26,94,160,172,211,58,32,57,83,40,16,181,149,170,77,62,29,7,240,147,55,72,98,200,205,235,4,67,35,190,193,248,110,117,153,47,8,52,85,199,65,74,6,236,58,202,147,211,116,7,208,118,101,99,204,233,67,240,18,236,218,239,179,215,251,127,1,186,110,57,225,2,67,136,76,227,212,143,242,174,42,229,33,73,175,127,83,200,67,2,225,75,222,108,15,101,85,234,46,192,131,98,26,9,65,10,9,149,185,149,149,139,17,120,56,98,162,28,224,52,66,170,184,114,90,227,170,3,192,191,14,117,102,194,196,141,82,176,182,166,152,71,177,242,188,251,167,192,0,66,62,207,67,2,107,106,190,104,14,84,250,57,238,106,235,47,59,104,67,240,218,108,98,107,239,166,117,126,168,205,153,12,10,172,66,108,177,146,210,202,231,37,204,121,130,45,119,207,247,41,66,42,169,242,127,189,180,5,160,121,10,112,89,246,241,253,66,40,159,161,163,199,232,86,104,162,85,81,40,203,20,224,83,2,241,185,233,54,45,167,36,160,207,8,155,3,168,31,83,40,124,44,185,46,187,226,188,229,128,252,200,9,243,4,82,4,43,245,248,203,81,212,223,151,230,141,101,11,128,187,81,234,19,172,61,57,103,173,83,71,20,218,63,125,20,2,67,2,95,196,117,94,76,16,69,224,9,119,218,243,179,188,83,112,242,198,254,170,93,102,251,45,240,198,40,26,0,154,67,2,107,11,215,246,77,167,20,54,67,75,199,30,135,119,83,232,80,236,118,149,205,186,44,156,64,78,111,126,165,167,67,2,249,134,167,252,141,85,238,246,30,146,255,32,80,8,83,2,55,202,11,55,190,250,197,1,105,111,247,176,223,49,65,170,128,146,233,180,210,137,90,144,96,10,59,228,75,15,83,232,17,181,182,190,175,143,52,3,68,14,104,124,155,183,83,2,49,193,8,59,14,248,144,93,8,214,134,30,66,122,83,2,109,177,231,46,214,51,91,136,188,9,158,73,194,54,83,2,187,193,201,50,211,35,190,215,224,107,87,144,59,5,83,168,131,129,109,79,237,68,199,12,38,94,239,155,118,3,223,41,252,193,43,222,246,243,202,46,234,224,225,237,30,188,83,2,173,192,70,47,190,188,64,169,93,24,98,129,169,21,82,4,91,124,57,151,65,246,4,167,28,184,165,0,190,146,67,196,198,114,69,161,236,123,187,143,27,8,254,9,171,252,83,8,129,97,69,71,205,105,111,13,84,12,11,191,153,8,83,72,210,33,197,6,141,73,75,15,253,210,219,66,98,65,82,4,31,242,169,237,5,72,106,98,87,70,63,162,230,25,33,42,96,53,203,179,231,221,183,53,26,44,128,216,175,153,67,72,6,227,33,221,248,166,46,123,35,91,216,11,213,107,83,232,167,1,3,39,75,73,141,11,205,34,120,0,12,34,66,2,223,253,215,253,225,56,146,201,113,76,25,195,64,52,65,10,9,236,105,223,217,246,189,73,190,80,152,112,234,137,82,4,91,178,233,139,145,249,107,190,24,56,137,80,168,99,82,4,55,57,91,155,17,24,189,5,33,0,136,16,34,76,83,2,49,201,70,51,211,224,112,47,7,61,0,57,24,30,83,2,113,202,108,51,191,212,43,231,74,26,167,125,3,20,83,2,113,194,42,59,187,22,26,91,173,62,182,12,92,214,205,139,3,99,19,26,181,81,0,0,64,32,163,44,37,78,221,139,3,131,220,115,147,5,0,0,68,240,80,81,18,244, +66,136,179,209,118,31,0,97,208,89,23,85,29,54,18,59,83,8,2,195,51,243,109,0,0,64,6,81,27,235,177,13,67,196,196,17,133,217,108,56,62,249,243,247,164,14,106,208,82,2,245,114,78,150,123,128,38,124,200,7,169,171,220,232,49,170,166,97,211,177,245,42,48,233,4,114,32,238,151,102,66,2,249,141,125,148,47,89,149,17,53,119,181,191,144,183,83,2,235,168,167,50,226,238,88,77,139,91,113,225,173,4,205,139,248,193,75,167,103,8,82,189,6,21,129,161,116,221,83,2,171,160,167,50,206,18,112,175,101,255,40,126,103,48,82,4,49,130,153,143,21,35,17,10,132,156,32,74,164,16,205,75,14,181,217,86,250,200,77,187,12,70,130,181,157,71,67,4,115,178,244,24,23,148,251,187,183,42,143,12,2,144,223,5,57,227,163,208,140,196,239,118,155,207,64,10,130,144,83,2,103,160,164,54,54,25,99,231,219,152,223,9,229,242,82,232,61,208,164,195,88,99,193,21,233,32,123,236,86,22,83,168,86,213,120,91,134,172,30,3,20,9,192,224,67,126,82,4,45,152,217,140,73,103,248,149,119,229,251,228,246,2,67,104,13,240,137,83,229,8,58,113,84,109,111,58,146,153,82,2,23,182,84,115,102,128,16,33,98,4,8,107,57,157,67,2,105,161,86,242,74,235,200,21,39,121,236,130,221,88,82,72,7,242,63,47,6,197,107,179,212,129,79,182,249,191,82,4,215,191,189,141,21,179,250,88,222,176,52,113,79,176,82,2,55,166,219,161,91,65,92,152,219,23,10,132,1,9,82,168,0,48,14,105,28,187,139,178,41,17,40,106,71,246,67,8,29,181,235,119,127,240,224,214,64,18,73,218,158,136,82,208,36,172,61,215,49,190,87,181,198,133,218,27,82,42,67,72,0,131,196,94,115,230,57,119,35,208,64,64,232,82,223,209,86,44,231,59,89,131,94,107,28,225,225,5,109,80,66,168,174,137,54,220,154,150,134,92,117,22,232,171,141,93,207,5,185,13,225,212,116,87,35,6,38,16,74,8,204,45,50,40,162,65,151,156,193,85,94,178,244,209,112,157,100,254,83,2,247,216,132,51,102,6,200,221,109,97,188,176,239,64,67,232,119,208,88,183,231,166,77,95,15,163,100,199,7,248,83,136,142,97,139,173,51,37,71,13,28,200,30,191,179,0,67,2,103,138,174,238,16,170,20,139,24,160,164,22,20,135,65,234,119,172,44,107,146,179,101,131,138,23,141,15,128,9,67,2,101,10,174,92,79,85,104,188,46,4,110,119,88,231,82,104,5,195,241,156,235,186,44,47,27,210,143,254,89,118,33,42,9,245,62,110,215,229,158,238,28,102,128,72,131,153,82,144,90,236,226,60,41,157,118,210,42,17,247,152,74,8,67,136,103,208,104,147,110,58,85,171,151,76,78,158,248,155,205,7,27,108,209,134,75,151,40,105,173,59,53,35,212,49,205,7,187,108,94,134,25,68,208,194,48,100,168,111,35,205,67,2,225,162,85,216,11,110,189,53,118,142,23,121,0,193,83,2,167,144,164,46,16,137,71,33,36,137,65,88,18,135,67,2,225,163,101,88,140,102,46,88,183,205,168,121,200,212,205,7,163,88,221,148,9,146,10,196,201,9,33,91,23,4,67,2,243,67,71,120,12,51,4,133,109,145,63,153,93,245,83,104,13,99,232,22,77,199,196,135,208,140,20,220,172,172,67,40,55,195,81,94,182,172,59,119,161,3,6,243,116,130,51,4,211,72,197,214,139,127,74,83,127,167,144,52,72,2,66,40,145,233,212,71,110,40,34,106,158,78,51,35,150,227,81,106,242,164,177,229,137,173,97,19,130,152,42,155,16,52,82,140,35,128,59,175,81,188,44,114,80,197,215,13,84,205,67,72,28,181,238,237,113,202,149,215,131,126,81,4,227,149,67,232,34,99,213,155,234,126,223,163,160,4,218,69,20,155,65,138,50,204,255,247,222,251,101,49,223,44,26,209,32,98,67,4,113,146,212,136,250,157,52,255,94,29,137,248,28,36,81,234,210,132,115,118,187,188,97,32,224,36,255,168,99,174,83,2,173,184,38,51,152,250,6,49,85,16,91,11,96,253,83,2,99,136,39,46,166,252,42,76,17,150,18,174,5,1, +67,200,1,176,145,166,101,123,237,30,149,109,39,149,51,9,82,2,99,186,215,243,122,161,85,8,69,210,169,67,84,165,82,144,57,236,94,60,217,123,219,218,155,201,31,226,150,167,205,7,15,46,189,140,146,100,157,201,136,65,193,156,84,86,83,2,53,201,135,54,28,0,134,49,164,200,216,0,68,251,67,4,79,144,208,24,227,92,181,152,39,198,118,162,53,96,67,104,101,227,213,135,116,230,123,127,35,7,52,195,37,236,82,4,95,230,187,141,147,37,132,114,16,58,143,12,72,205,67,72,74,227,179,255,237,166,41,187,35,229,168,192,133,75,67,168,8,208,163,215,78,151,45,91,151,144,53,146,110,62,65,138,14,236,90,219,185,154,245,40,203,60,156,250,101,11,66,44,74,108,85,57,117,17,170,119,10,121,175,122,6,87,67,40,15,213,252,127,219,250,113,199,64,31,42,178,142,159,66,216,148,60,55,117,21,151,127,151,19,168,7,59,195,72,83,208,172,230,223,111,254,234,216,41,32,207,81,182,15,18,207,17,61,197,186,151,210,107,235,187,218,137,229,152,71,54,83,40,74,99,214,125,243,102,215,132,204,38,184,7,144,128,83,2,51,177,137,46,88,72,77,181,212,202,217,172,208,188,67,168,48,117,154,171,232,164,227,199,1,184,186,174,60,200,67,2,237,73,206,100,78,94,14,185,238,211,171,191,25,143,83,2,175,177,235,50,24,64,75,145,64,221,123,114,254,52,67,2,109,162,85,88,140,196,83,126,203,96,111,204,215,153,82,2,91,198,135,249,114,57,249,10,71,55,224,38,198,140,83,40,129,33,71,105,143,151,179,19,94,111,229,182,0,133,66,42,254,196,27,107,158,133,114,6,238,100,215,4,187,23,66,42,136,196,95,239,169,129,27,16,3,98,102,98,43,186,66,74,224,114,42,237,114,29,159,243,209,191,2,90,25,0,67,40,75,181,105,101,108,188,165,239,3,15,162,122,29,90,81,170,18,44,103,44,155,131,26,212,41,95,60,36,105,104,83,208,227,230,253,143,221,127,221,42,208,113,146,185,108,173,83,8,255,65,69,73,75,86,118,92,41,6,204,143,19,1,67,196,220,150,93,105,223,211,198,43,189,90,217,6,98,76,67,232,119,181,40,165,17,85,233,36,19,34,14,164,38,136,223,137,213,169,76,51,81,191,239,66,76,193,190,196,13,54,67,104,11,181,171,109,95,173,56,229,4,179,155,147,35,212,67,40,17,11,41,184,87,173,41,101,99,228,218,163,224,41,82,136,8,163,163,190,225,185,60,101,9,166,110,140,17,243,67,4,185,142,208,68,254,36,188,218,121,143,90,127,29,15,65,42,34,48,113,56,43,58,215,152,182,85,173,165,7,206,83,72,8,131,98,210,70,187,253,133,248,139,193,96,48,33,67,72,96,117,95,235,45,242,99,199,1,72,53,145,37,210,223,17,41,199,123,189,30,158,206,54,43,88,66,109,10,3,34,112,52,91,106,154,84,239,90,148,53,13,98,147,50,170,83,232,153,225,36,73,173,105,109,13,23,91,68,89,192,16,82,112,0,69,51,91,103,105,47,117,49,130,11,146,90,134,81,138,8,117,230,55,106,164,1,68,48,176,194,109,177,168,83,8,220,33,71,105,109,103,107,19,93,87,120,171,20,155,83,144,245,228,93,87,122,219,166,32,153,234,1,94,68,116,83,8,3,181,214,222,67,166,53,3,9,241,56,214,38,252,67,168,8,176,178,103,239,27,55,107,15,0,33,137,221,245,223,137,25,131,188,78,138,253,74,212,108,137,117,203,243,6,81,42,31,236,193,121,105,181,83,128,65,169,125,82,189,186,83,40,130,97,101,133,45,37,9,11,255,152,27,232,47,167,67,2,213,101,117,222,140,20,146,83,190,98,28,253,179,5,83,2,239,176,197,50,62,229,44,115,32,130,159,2,114,107,83,2,49,202,73,59,127,49,124,238,201,97,175,2,120,231,83,2,127,242,235,51,152,180,14,69,206,146,50,155,41,128,67,196,210,118,37,153,160,226,151,146,66,90,238,108,195,147,82,76,72,192,63,125,50,25,63,109,95,3,166,7,100,158,206,49,93,169,218,11,1,0,128,48,211,22,27,44,195,192,222,241,18,17,0,0,56,253,120,198,189,5,138,194,178,1, +65,10,2,49,204,241,4,0,0,89,0,77,193,10,0,4,206,81,3,25,0,0,160,156,105,10,203,160,33,199,118,222,83,72,210,65,69,39,209,228,38,13,239,15,101,0,74,66,83,2,181,208,101,55,136,251,6,100,249,192,184,4,140,179,67,232,4,245,122,167,99,200,83,214,0,3,228,211,130,10,67,72,49,163,210,149,175,254,187,175,99,165,40,35,194,105,51,200,137,65,142,121,44,123,160,14,214,48,83,31,17,118,82,2,111,196,139,61,233,0,24,25,194,152,214,126,82,86,223,5,69,196,156,202,138,63,68,110,176,101,147,161,68,24,82,4,123,98,153,155,81,72,206,98,94,139,102,231,25,131,82,232,14,21,215,254,193,4,158,244,12,4,40,116,42,115,82,168,3,80,42,233,106,107,194,149,233,0,3,142,140,110,67,2,27,55,122,181,24,236,16,51,129,152,144,98,196,8,82,2,143,166,67,85,106,89,204,181,73,117,103,26,254,27,83,168,146,41,53,87,213,144,148,86,188,242,63,105,188,21,67,2,111,5,119,242,142,228,136,191,247,22,245,121,72,44,83,2,245,208,100,51,192,219,102,172,177,63,27,122,179,86,67,72,0,203,230,157,88,102,218,203,36,83,83,57,248,149,51,4,55,102,204,184,139,63,104,149,201,26,27,169,21,71,67,168,8,176,177,247,239,23,111,30,143,17,108,31,85,41,223,5,225,116,109,71,140,20,33,144,162,76,82,182,12,253,51,72,207,225,210,91,171,195,235,194,198,128,104,139,209,134,205,75,241,33,254,109,99,26,23,115,6,98,182,50,150,201,82,2,87,185,230,214,106,24,44,240,27,96,145,64,2,0,83,168,146,161,147,115,207,226,230,12,248,210,14,62,117,241,223,41,129,193,155,190,242,98,232,177,205,68,43,135,99,113,67,2,103,131,94,110,12,230,120,91,63,104,59,128,2,24,67,2,81,129,77,200,139,137,64,66,192,130,17,36,68,153,67,2,177,98,99,210,11,236,205,71,119,27,106,33,16,2,82,2,27,182,5,127,110,112,68,168,104,87,229,191,116,48,33,10,129,129,33,87,70,183,45,139,6,38,13,98,206,204,66,72,154,161,230,219,158,159,129,86,118,20,229,11,235,221,66,8,171,233,146,77,43,152,81,156,53,6,18,152,168,115,82,36,29,227,153,139,32,21,189,175,147,186,111,128,93,219,82,2,161,64,222,168,91,88,246,116,44,87,86,99,144,147,66,136,142,105,55,153,149,203,84,95,221,88,200,89,85,126,82,2,117,46,14,154,127,145,93,10,25,115,45,51,206,7,83,2,157,104,100,46,12,17,86,52,134,169,4,152,199,15,83,2,171,160,228,54,239,37,19,49,84,145,105,173,173,215,51,4,229,74,174,204,140,65,57,25,144,16,220,155,45,134,67,104,14,117,95,251,178,201,142,54,68,3,41,99,125,173,34,144,116,59,97,34,72,237,19,86,151,206,35,141,3,135,81,170,224,50,147,174,27,63,67,160,184,7,58,58,252,138,83,2,107,160,165,50,251,156,207,252,57,144,132,131,57,110,82,4,23,124,107,155,81,10,73,73,165,230,141,128,61,4,83,2,241,177,201,58,101,156,175,230,88,222,141,129,129,108,82,4,125,251,219,142,83,35,157,14,193,168,86,174,164,58,66,140,231,50,74,137,167,37,248,130,85,242,157,89,244,170,83,72,8,108,183,166,255,121,174,122,203,210,45,174,98,128,33,42,35,117,91,90,90,249,155,157,15,248,129,75,193,184,83,2,123,217,7,51,167,57,183,103,105,20,114,106,48,69,66,12,191,68,86,247,98,166,96,121,0,249,46,159,221,205,83,2,115,192,195,50,134,82,22,164,214,56,166,5,236,252,67,200,24,112,144,98,237,44,94,105,134,188,12,181,170,104,81,106,11,172,185,56,237,197,147,161,221,86,109,43,71,203,83,8,35,172,221,39,187,117,75,46,131,59,137,17,100,153,67,232,19,171,149,83,219,240,57,167,99,211,41,197,237,50,66,106,246,242,109,189,253,27,188,73,36,250,120,183,0,204,83,2,225,144,230,54,214,123,153,141,102,59,73,48,118,228,83,8,87,67,126,234,183,127,149,135,240,105,64,132,41,29,67,136,31,181,40,243,169,254,225,231,4,19,76,11,225,232, +66,74,133,196,173,167,44,158,143,145,230,243,160,49,193,194,67,2,215,74,221,222,78,220,246,179,205,216,151,192,251,39,83,2,249,217,74,51,206,205,132,49,116,94,51,191,103,89,221,139,159,65,210,211,245,206,169,199,161,234,254,59,186,80,83,2,125,233,70,55,5,135,234,160,233,148,246,98,74,205,67,40,124,99,245,243,90,181,234,117,164,244,232,241,100,206,67,8,9,112,123,54,126,187,55,123,134,153,44,112,194,12,65,138,14,149,153,213,184,5,18,81,69,201,231,122,62,89,83,72,222,33,87,77,145,101,105,11,245,47,247,72,34,3,82,136,43,80,170,249,222,98,37,34,182,228,2,37,98,90,82,168,40,227,23,182,229,213,167,183,25,162,45,220,17,32,207,81,47,201,171,181,253,223,71,30,165,42,193,95,81,122,65,138,19,108,109,178,155,214,236,230,47,220,158,251,12,88,83,136,133,97,85,79,113,77,45,17,79,177,241,49,192,6,206,45,69,227,113,87,109,234,213,130,137,122,168,159,248,129,65,114,135,66,74,171,159,141,55,196,192,23,156,77,135,81,83,200,7,172,221,53,135,36,203,44,196,123,191,237,245,161,83,40,1,213,217,223,13,59,95,2,240,45,231,38,107,145,83,2,115,193,9,51,20,107,7,93,172,130,248,46,161,222,51,4,75,231,204,192,139,214,47,183,12,68,2,32,64,138,83,2,41,160,229,45,94,9,156,122,208,114,238,97,202,75,83,72,142,65,119,147,51,37,7,13,192,132,152,142,212,69,82,4,95,228,49,79,181,56,3,132,32,80,233,228,9,85,83,200,195,161,109,113,45,43,77,13,2,64,129,250,148,126,83,2,239,176,104,42,214,251,96,5,210,85,19,248,101,51,65,138,50,240,233,120,29,141,115,113,7,101,165,179,47,209,82,44,84,224,152,238,96,45,125,6,68,255,45,231,22,144,81,80,105,35,219,166,119,189,189,45,173,38,104,123,6,113,83,104,166,129,169,171,207,107,43,15,233,143,166,50,244,9,34,80,43,133,206,201,155,121,10,170,56,101,141,215,43,155,67,136,8,208,75,231,110,162,53,174,150,224,67,205,138,97,82,240,144,106,89,242,156,19,255,123,55,70,174,99,255,70,67,2,91,230,133,226,139,129,37,227,57,191,70,151,166,245,67,40,75,195,158,188,115,167,29,237,33,246,252,213,133,0,66,140,229,228,81,107,111,166,143,208,247,255,40,250,72,37,67,40,74,112,243,229,253,61,120,117,14,21,233,85,155,188,66,236,162,178,86,106,165,37,80,39,10,141,89,13,255,245,66,76,133,228,77,107,43,167,41,143,32,119,225,21,119,230,65,138,14,108,91,91,239,254,111,169,249,199,96,130,161,22,83,168,131,33,7,41,173,133,139,15,251,206,204,2,70,102,83,72,26,108,177,53,195,185,168,36,70,97,99,141,185,69,65,106,38,236,190,239,226,223,46,195,221,210,48,16,99,42,67,168,8,208,43,147,231,26,21,159,79,242,96,59,130,97,67,232,59,112,248,183,117,39,79,91,15,36,171,83,67,208,51,144,160,166,30,34,231,95,239,248,137,226,150,64,4,173,83,2,41,170,235,50,176,190,230,111,201,107,56,176,107,22,66,140,168,36,90,40,41,165,153,15,90,15,146,250,138,114,65,138,25,108,89,114,250,219,239,194,141,74,215,81,70,89,67,144,32,172,181,170,76,109,223,111,133,57,68,25,32,177,33,106,5,117,223,242,251,13,22,255,12,28,30,4,163,162,67,232,99,195,16,148,247,188,172,253,35,157,103,98,121,193,83,200,24,245,188,107,173,155,44,3,204,87,66,159,240,221,82,8,9,208,182,231,36,195,137,34,218,160,222,229,228,252,83,232,55,245,158,239,143,158,122,6,1,194,45,96,42,221,81,42,130,50,181,44,141,175,2,32,135,107,183,46,71,168,66,56,169,236,110,255,62,254,183,178,22,40,44,161,40,249,83,200,147,1,35,39,75,10,79,15,126,149,146,55,129,73,67,4,79,146,178,72,222,116,71,114,190,144,247,111,63,167,67,168,42,227,146,135,241,230,238,203,34,176,200,137,125,141,205,139,3,227,23,50,237,52,0,0,64,88,65,5,23,234,205,139,3,99,131,58,177,21,0,0,64,72,129,4,12,22, +83,8,2,99,171,33,77,1,0,64,208,192,4,170,80,7,67,136,179,81,152,3,136,40,237,83,129,1,46,219,135,25,83,136,32,117,173,125,15,143,58,3,187,94,168,5,16,5,67,200,137,9,29,94,168,77,77,95,65,18,13,176,10,74,205,7,139,173,91,143,1,61,52,137,144,218,33,98,230,118,83,104,5,117,173,189,229,166,159,7,169,192,46,68,54,195,82,200,147,9,20,236,146,29,90,61,14,36,112,1,72,161,67,232,93,176,171,38,101,138,183,111,78,236,186,9,25,64,222,169,150,193,208,16,195,93,95,118,230,97,0,66,98,44,51,232,168,33,1,85,230,66,1,146,197,0,96,181,48,51,49,138,147,129,41,75,243,5,11,70,224,200,135,41,87,150,66,2,105,136,241,80,45,87,19,6,127,47,255,9,63,136,82,2,27,248,85,123,92,57,85,189,138,69,101,0,229,0,83,168,136,161,226,198,138,137,167,13,143,176,10,245,170,254,67,168,154,105,225,176,246,101,235,214,1,243,200,44,1,109,67,104,13,163,214,149,245,118,154,171,96,2,83,154,155,149,65,74,0,131,137,105,79,53,25,234,2,230,15,90,197,33,65,106,88,236,111,118,182,247,173,56,221,6,209,124,108,7,83,104,166,33,43,77,15,33,165,77,255,38,196,39,247,34,83,2,233,160,167,54,8,192,102,117,127,239,157,190,90,23,83,232,132,161,66,165,206,173,111,17,116,107,10,93,210,44,83,232,153,33,67,69,205,66,199,12,240,15,36,64,76,37,66,36,61,80,89,134,168,137,106,57,77,128,239,90,213,26,83,40,150,65,67,231,76,83,85,13,148,4,106,192,142,224,83,2,117,208,100,47,255,64,184,42,130,139,32,36,16,66,83,2,117,216,132,51,86,112,32,9,0,126,72,176,175,7,83,2,181,209,134,47,192,234,36,202,204,225,68,63,110,113,83,194,38,163,27,147,113,204,93,71,42,173,96,158,11,112,67,2,101,104,166,112,140,0,181,99,57,46,30,187,163,156,66,40,194,193,144,78,186,252,52,147,159,78,117,13,153,223,51,8,129,193,170,202,42,116,40,54,183,176,141,47,129,200,82,168,40,80,162,233,28,171,110,70,8,129,180,175,106,62,82,208,83,172,86,26,41,173,183,57,136,133,255,235,253,18,205,171,130,161,161,22,109,56,121,51,21,65,42,60,235,232,223,5,71,133,124,82,140,127,15,39,174,226,66,100,14,17,66,204,195,210,61,120,33,37,6,245,93,247,168,247,6,90,82,136,14,80,10,89,26,179,180,210,201,196,163,13,12,64,175,81,48,137,53,136,41,173,251,172,198,250,106,226,147,192,66,4,33,13,122,86,172,149,221,185,214,164,254,154,15,162,82,40,74,80,133,53,26,251,235,39,255,80,156,36,168,151,83,2,41,161,5,51,38,90,32,66,240,59,133,180,118,122,82,8,3,240,17,87,226,106,98,22,182,164,207,94,116,130,83,8,9,44,185,119,251,215,235,230,41,156,13,239,251,237,65,234,52,44,207,238,242,218,237,138,116,230,71,91,194,205,82,144,32,76,103,44,103,156,117,49,135,25,60,108,130,14,67,232,52,163,87,93,246,172,104,189,33,7,129,44,95,8,83,72,41,108,191,229,197,190,105,166,7,159,242,147,180,2,81,74,38,236,94,76,121,223,142,75,224,37,241,230,79,80,66,140,160,210,90,203,221,36,87,150,130,18,174,10,172,109,83,8,46,227,168,227,101,91,183,130,254,225,45,100,39,100,81,80,117,236,60,211,124,235,198,216,68,219,155,66,241,57,67,232,0,176,235,146,109,31,127,57,78,250,67,6,21,176,66,40,202,41,214,67,15,120,109,197,171,31,151,107,34,174,83,40,17,108,211,108,141,34,205,37,112,254,165,43,91,11,82,80,47,12,215,74,149,114,93,70,137,229,70,168,126,188,67,2,161,157,146,45,152,217,216,196,231,37,146,6,132,33,67,196,66,82,29,217,172,118,195,123,131,183,11,218,73,108,83,40,55,227,169,147,237,74,247,132,143,180,69,92,9,241,67,4,111,144,176,152,108,79,149,148,62,8,75,99,203,119,83,72,68,227,201,147,237,206,253,128,144,181,205,199,119,123,65,170,8,172,111,119,115,175,115,187,11,38,198,232,17,192, +83,72,135,65,73,77,237,4,39,13,253,196,133,156,208,140,83,2,241,201,75,51,119,71,113,182,4,193,35,96,57,2,83,2,37,153,135,50,164,204,6,99,255,86,5,221,3,27,67,2,89,201,157,98,142,228,200,60,43,25,86,3,145,37,83,2,49,202,74,51,32,238,19,164,233,191,137,112,207,180,82,240,54,76,61,42,243,238,45,173,151,193,137,84,220,221,67,16,27,204,248,222,59,87,181,46,85,129,180,221,99,19,82,4,21,129,233,139,17,19,156,132,224,62,41,74,167,63,82,40,145,233,202,150,109,171,253,187,20,196,155,14,107,14,66,2,23,225,79,48,113,26,55,158,127,235,61,77,221,13,82,48,11,108,82,89,221,131,247,94,124,193,38,111,224,82,221,139,31,181,210,74,177,204,146,63,32,232,160,111,222,50,65,10,43,44,89,214,166,85,110,176,32,86,157,49,140,57,83,2,47,170,236,46,206,169,218,189,73,37,72,180,134,130,81,234,145,196,181,95,199,100,97,244,65,42,243,5,20,116,81,42,134,132,211,118,253,166,38,120,231,149,70,227,20,171,83,136,131,65,41,45,45,35,71,13,1,32,54,240,163,111,49,6,139,227,81,248,172,127,189,26,155,58,155,213,92,48,65,202,24,204,123,219,214,246,245,99,3,119,173,189,76,249,223,201,152,97,166,169,166,107,66,26,184,192,123,84,72,11,82,2,27,174,7,254,96,169,206,76,110,45,54,98,33,90,67,136,43,181,170,189,41,242,85,143,68,81,17,89,216,217,65,170,68,236,235,222,146,147,228,227,2,132,21,223,69,61,66,120,245,230,204,185,51,246,59,63,21,10,223,220,90,0,83,200,25,236,152,166,233,52,207,102,131,197,10,145,147,96,66,2,197,155,209,91,238,79,64,123,80,83,148,221,109,217,66,2,183,97,178,54,151,92,14,224,3,100,191,138,55,3,83,2,181,209,73,47,142,130,108,131,175,72,188,231,220,251,66,232,186,97,19,133,107,38,124,227,153,29,130,32,144,244,83,8,43,163,234,98,237,252,217,129,233,230,26,219,14,255,83,2,235,176,196,46,4,159,133,108,15,54,77,123,83,63,82,4,91,242,41,95,85,21,83,13,145,186,140,166,1,188,65,138,14,44,57,111,243,218,181,7,239,62,143,127,152,65,83,136,85,181,236,113,119,235,29,3,36,66,100,160,167,209,51,168,135,193,22,124,48,251,176,70,25,161,166,135,33,175,67,2,93,233,173,102,15,160,93,65,35,118,57,153,103,212,66,44,209,36,90,247,160,165,90,223,255,79,249,234,47,37,83,2,45,178,233,54,151,240,96,105,136,32,104,25,156,116,83,2,239,168,231,42,201,251,228,109,118,80,22,99,185,185,65,42,38,85,55,243,203,141,15,104,55,104,195,27,188,114,67,200,9,245,45,175,42,180,246,251,1,218,145,253,101,170,83,2,177,184,198,42,16,114,142,16,213,146,133,27,211,79,82,36,141,196,230,118,83,74,120,132,115,200,169,205,21,184,66,108,144,100,218,73,45,166,41,72,114,37,16,247,157,141,82,40,75,112,26,186,42,203,48,199,42,37,176,35,39,110,81,204,9,242,60,16,241,122,173,72,72,242,10,234,20,149,205,7,31,60,210,140,82,109,20,212,70,18,237,9,176,137,67,136,43,208,122,187,94,153,120,61,142,112,136,198,220,18,83,208,185,134,123,27,255,94,187,46,216,154,229,17,121,128,65,74,26,85,85,53,71,105,13,160,132,151,5,151,193,150,83,112,149,204,23,187,215,140,223,161,64,14,255,106,209,93,83,72,142,97,107,113,83,103,43,11,28,136,155,137,42,249,83,40,85,117,143,104,77,26,87,7,137,220,68,127,176,25,83,136,19,163,144,98,101,238,219,133,226,214,105,251,132,15,81,112,8,235,38,203,12,49,181,37,17,21,72,21,241,169,83,136,59,195,171,18,101,74,149,134,90,4,238,80,166,28,67,104,13,240,139,150,229,29,88,117,6,15,42,26,248,151,81,74,72,236,94,108,171,197,19,16,223,216,207,109,93,208,83,2,227,224,5,55,113,122,224,106,51,198,53,84,11,147,66,40,163,225,164,205,171,215,246,30,0,129,48,160,112,240,206,177,14,161,60,110,8,0,0,100,57,43,153,12,7,83, +51,104,38,13,0,0,64,124,206,140,189,0,146,33,112,146,82,136,168,145,19,6,144,139,151,159,14,0,0,128,69,209,49,42,2,13,0,0,50,186,12,43,32,16,145,9,208,67,51,40,2,13,0,0,32,229,210,206,53,65,0,248,82,147,51,40,2,13,0,0,0,41,25,147,42,65,2,244,71,234,51,40,2,13,0,0,160,82,72,10,171,32,144,152,185,94,19,208,15,67,13,152,214,2,0,128,23,221,151,55,178,95,66,40,132,161,182,205,235,223,241,14,0,129,0,0,220,243,35,208,15,99,225,178,115,0,128,221,93,145,66,98,34,179,222,25,211,250,191,134,189,253,155,225,65,32,2,0,44,54,51,40,2,13,0,0,160,73,33,53,91,1,0,0,76,229,1,42,2,13,0,0,0,58,6,222,36,247,98,97,130,28,19,80,67,131,22,123,178,3,0,128,156,53,151,252,169,31,66,16,13,21,0,224,99,41,239,247,214,131,0,0,208,112,1,42,2,13,0,0,0,142,160,231,107,246,162,78,150,82,19,40,2,13,0,0,0,158,161,166,140,234,2,88,248,17,34,44,2,13,0,0,46,188,28,39,0,0,142,10,4,240,66,8,63,117,183,110,37,199,103,2,64,128,0,0,120,205,1,42,2,13,0,0,0,56,128,210,3,56,35,176,86,198,49,42,2,13,0,0,188,241,234,51,32,0,17,99,4,35,19,208,15,67,170,233,28,3,0,128,164,214,151,239,125,64,33,42,2,13,0,0,156,128,157,118,8,137,36,37,200,185,19,16,13,25,0,0,228,140,85,154,154,218,34,187,56,3,49,42,2,13,0,0,230,152,136,46,16,2,64,115,75,141,34,144,19,25,0,0,160,148,118,2,122,246,98,0,112,129,49,42,2,13,0,0,32,137,166,50,0,0,33,50,144,19,19,16,13,25,0,0,246,222,49,155,140,118,35,112,15,37,66,104,248,241,122,29,0,225,85,85,74,64,0,0,219,241,1,210,15,163,232,226,125,1,0,40,245,2,18,152,241,4,222,233,153,209,125,63,0,226,226,39,127,105,0,0,80,116,49,42,2,13,0,0,58,226,72,51,16,2,64,177,171,122,223,233,153,209,94,12,192,215,142,190,25,1,0,0,255,243,19,40,2,13,0,0,0,208,22,245,231,61,3,100,137,110,81,44,2,13,0,160,74,201,9,6,0,0,0,6,16,42,19,42,2,13,0,0,208,180,247,183,10,9,1,124,56,194,33,42,2,13,0,0,92,236,196,174,26,139,8,217,111,185,222,41,2,13,0,0,0,188,154,175,242,44,0,0,152,3,50,42,130,10,0,0,0,240,229,0,2,38,117,194,157,129,49,42,2,13,0,0,208,78,151,85,0,0,41,86,68,55,19,144,19,17,0,0,208,155,237,186,255,61,160,252,175,143,67,72,74,195,86,158,53,6,184,32,0,0,0,176,224,107,33,42,2,13,0,0,240,196,215,180,26,16,192,114,242,229,51,40,2,1,8,0,8,220,154,123,141,248,255,15,201,21,34,42,2,9,0,0,64,142,225,145,68,202,247,208,158,107,33,42,2,9,0,0,0,172,216,174,151,0,128,75,75,85,82,8,63,67,167,185,221,125,32,1,1,0,0,96,115,32,1,210,15,225,191,117,4,0,0,222,54,1,147,74,133,210,19,40,2,13,0,0,0,154,154,167,73,38,3,67,243,23,81,72,202,9,254,196,27,21,214,113,0,8,32,0,192,205,206,17,13,25,0,0,46,206,212,53,236,124,35,0,96,4,33,42,2,13,0,0,192,53,215,117,26,17,0,100,134,137,175,81,67,195,18,139,224,2,0,128,106,171,148,66,20,53,49,42,2,13,0,0,104,161,105,42,0,16,160,139,19,35,51,40,2,1,8,0,8,208,217,186,222,248,255,184,96,73,66,72,202,137,232,244,209,197,183,30,0,129,0,0,83,7,34,80,67,105,78,121,1,0,224,17,120,88,27,0,12,116,49,42,2,13,0,0,164,160,229,38,0,18,232,3,92,159,51,40,2,13,0,0,32,77,223,175,22,1,0,242,43,68,81,232,153,113,221,50,0,2,206,178,216,99,1,0,72,252,67,232,25,5,120,32,144,143,9,127,20,0,0,64,136,252,34,136,25,13,0,0,0,214,64,179,176,203,3,0,128,48, diff --git a/screens/ms2/images/0_converted.png b/screens/ms2/images/0_converted.png new file mode 100644 index 0000000..48021be Binary files /dev/null and b/screens/ms2/images/0_converted.png differ diff --git a/screens/ms2/images/Untitled-2-fs8.png b/screens/ms2/images/Untitled-2-fs8.png new file mode 100644 index 0000000..552427d Binary files /dev/null and b/screens/ms2/images/Untitled-2-fs8.png differ diff --git a/screens/ms2/images/Untitled-2.bin b/screens/ms2/images/Untitled-2.bin new file mode 100644 index 0000000..3cfa3e9 Binary files /dev/null and b/screens/ms2/images/Untitled-2.bin differ diff --git a/screens/ms2/images/Untitled-2.binh b/screens/ms2/images/Untitled-2.binh new file mode 100644 index 0000000..4996f89 --- /dev/null +++ b/screens/ms2/images/Untitled-2.binh @@ -0,0 +1,2 @@ +/*('file properties: ', 'resolution ', 244, 'x', 244, 'format ', 'COMPRESSED_RGBA_ASTC_4x4_KHR', 'stride ', 976, ' total size ', 59536)*/ +120,156,52,91,117,92,83,237,223,30,99,163,65,186,212,71,98,180,40,108,132,136,8,108,116,111,163,17,16,105,144,22,16,21,105,233,110,16,80,164,145,148,144,86,66,74,152,128,180,108,210,13,210,210,239,225,121,126,239,159,231,179,115,215,183,174,235,250,222,103,152,30,114,114,16,8,116,116,230,165,12,198,86,81,129,144,97,137,228,50,247,162,95,32,70,38,110,61,166,40,220,197,130,95,174,57,160,252,233,58,249,3,147,56,194,201,76,177,61,228,212,32,144,98,230,1,233,239,160,44,25,114,16,247,191,207,254,137,197,171,11,10,239,134,218,7,48,174,32,13,209,80,206,183,227,95,67,233,250,154,31,202,162,84,138,87,81,179,117,189,124,186,68,127,254,140,141,61,226,162,101,178,36,81,159,10,140,215,2,129,30,11,204,221,71,218,53,217,143,168,79,197,213,144,128,2,118,245,151,65,242,37,100,27,126,99,187,217,119,221,140,250,185,56,163,68,48,16,147,77,209,28,196,199,90,229,229,215,249,229,180,88,212,191,235,81,195,219,41,233,101,189,200,200,64,131,104,21,15,134,135,15,136,65,32,54,243,212,27,175,136,48,144,91,11,31,114,152,254,154,172,174,53,77,109,183,60,69,241,147,87,198,115,111,127,171,109,75,185,45,255,249,152,11,249,223,126,131,140,42,9,12,164,68,254,32,174,31,102,108,32,144,115,178,212,241,110,147,133,202,234,87,36,12,97,112,72,143,54,126,145,123,248,228,252,143,238,31,36,184,194,124,234,64,198,68,70,117,146,34,171,211,58,15,241,239,120,208,199,91,178,149,122,213,234,15,159,113,246,93,61,63,194,183,180,220,0,203,112,177,188,193,172,88,238,174,36,31,236,125,187,38,179,208,156,99,33,74,80,237,237,93,225,22,71,61,223,249,165,64,122,239,252,47,94,128,242,96,124,244,219,165,54,37,8,92,84,213,14,194,252,59,223,99,193,131,28,26,162,241,221,126,34,12,44,60,240,90,175,219,155,40,69,101,140,41,179,225,95,76,231,28,109,211,66,188,239,121,134,153,239,103,152,169,9,154,86,146,14,4,250,237,119,231,158,57,181,189,140,45,17,209,191,235,131,198,146,190,234,101,82,230,90,185,32,249,145,163,231,107,156,22,186,93,225,218,130,99,18,134,40,176,137,139,226,87,74,186,191,202,3,116,137,237,100,180,255,27,255,80,252,126,14,185,253,99,21,16,190,247,223,241,223,233,153,121,165,116,155,180,136,144,48,180,210,238,78,158,86,2,87,102,254,73,234,198,33,190,183,221,62,69,238,21,143,229,90,133,21,148,106,212,245,63,251,185,114,86,251,66,181,255,22,233,128,24,254,179,199,66,112,251,197,180,28,72,165,144,192,179,147,187,50,77,76,192,23,12,112,61,162,212,27,67,194,226,113,251,179,5,41,6,99,70,97,66,129,66,28,232,31,68,255,174,207,123,18,27,110,231,159,66,194,165,35,196,4,2,41,200,234,72,146,78,166,86,230,53,99,192,142,4,161,237,89,214,204,31,156,96,52,136,147,2,67,118,61,178,232,207,171,153,101,31,186,8,191,192,23,3,132,94,114,34,50,16,217,111,66,161,73,216,84,237,183,203,255,226,239,177,125,221,195,84,229,252,145,57,52,6,182,218,78,211,45,20,241,177,100,204,113,161,161,240,17,114,229,166,219,143,248,205,95,91,21,84,57,123,5,19,84,131,255,157,247,159,189,239,112,39,84,74,12,209,32,90,8,216,207,198,235,59,205,177,215,223,237,218,131,240,80,69,106,61,237,209,106,57,181,140,246,36,133,92,77,156,106,167,170,185,88,150,254,224,190,144,190,221,252,29,233,255,206,15,202,211,61,11,69,165,120,173,128,184,254,123,166,88,27,253,227,136,154,90,195,14,170,102,244,14,169,27,83,223,96,59,53,215,86,182,8,64,194,70,99,206,114,139,149,149,206,65,71,25,245,122,124,240,255,222,95,219,77,28,124,165,171,80,33,251,159,253,191,40,209,17,186,125,158,105,223,0,97,96,155,1,138,225,194,38,39,42,93,232,184,103,201,159,128,243,68,12,244,90,143,25,17,92,6,188,194,189,219,254,91,95,39,247,231,121,184,178,161,206,115,16,250,191,249,24,143,12,115,250,19,157,72,137,144,96,151,3,245,226,59,122,230,190,60,14,3,143,219,97,128,253,187,235,114,211,148,139,232,223,101,153,122,233,8,255,111,125,1,226,253,1,170,36,152,98,53,48,31,39,136,3,244,14,231,170,145,29,234,165,126,137,233,220,165,232,216,232,173,49,150,211,103,247,174,254,103,130,200,129,38,33,92,232,23,148,93,10,60,187,121,8,15,255,207,222,160,154,159,201,133,234,125,78,91,9,255,59,255,70,128,127,171,163,92,160,99,36,55,4,251,82,187,236,217,216,61,125,99,164,53,212,65,30,9,83,237,75,153,227,55,200,222,53,61,166,169,142,74,199,9,244,11,4,127,125,58,113,6,228,187,98,68,48,8,200,159,171,250,227,255,109,50,243,173,176,197,35,79,76,231,95,154,254,223,232,212,74,147,249,245,68,127,54,42,12,108,135,162,173,123,22,164,87,193,152,87,118,210,170,129,251,207,127,11,63,130,89,176,229,181,108,255,31,191,27,113,9,173,82,193,234,66,68,56,40,193,123,236,0,94,207,94,51,121,52,30,191,21,15,216,147,56,164,183,148,36,64,251,233,147,176,73,21,101,96,252,213,121,191,104,235,220,206,238,60,2,229,252,255,115,172,206,199,172,209,95,18,9,112,136,208,37,70,178,173,90,14,108,165,109,207,47,131,64,130,151,253,166,43,92,153,233,242,219,3,147,157,221,24,80,255,214,203,47,166,218,30,185,106,79,51,173,64,255,139,199,184,254,247,178,105,95,151,18,47,113,170,125,2,137,242,206,134,90,54,134,74,58,138,54,47,49,157,28,60,132,31,239,255,33,82,79,27,178,202,190,14,193,252,87,111,55,247,197,212,94,156,229,106,18,253,207,31,39,129,23,249,158,251,157,115,11,72,152,168,86,218,7,38,229,119,143,201,252,109,146,55,51,112,197,32,183,161,248,205,179,63,127,52,178,87,26,140,8,255,213,159,199,222,160,61,153,159,91,3,74,39,131,116,76,179,167,127,255,220,114,6,38,177,75,147,1,99,96,101,200,216,113,199,8,84,188,245,180,233,166,180,47,6,22,98,56,48,78,196,20,146,145,91,124,74,21,223,250,63,255,157,124,105,169,87,214,81,120,24,104,254,159,253,24,93,30,101,158,162,14,165,128,241,139,137,44,189,216,36,135,176,103,199,27,130,122,90,220,42,97,246,200,175,31,89,211,30,56,107,73,156,48,207,252,207,94,254,90,162,26,89,41,65,77,255,239,255,97,127,217,107,165,114,249,60,119,113,80,31,39,188,164,187,193,123,100,227,90,250,78,201,42,18,166,254,55,110,182,48,229,221,104,174,205,234,89,151,217,255,252,21,192,116,191,83,170,166,204,6,132,228,167,28,221,67,88,224,177,96,57,255,117,193,19,16,166,19,79,210,178,64,103,107,103,140,143,247,93,108,221,196,192,186,34,70,83,133,89,162,39,117,215,176,186,226,65,104,87,232,87,55,35,8,8,244,87,59,218,230,239,20,201,255,230,179,27,110,105,185,151,119,227,140,8,94,244,37,92,240,103,210,227,82,227,10,43,221,221,126,6,140,10,201,240,83,136,199,245,7,110,103,172,231,51,7,140,255,157,255,79,0,5,37,159,142,253,159,131,234,255,229,115,137,88,87,170,242,196,217,31,32,255,22,123,181,198,251,195,12,59,21,249,125,181,82,92,1,251,77,147,164,14,20,220,57,240,10,250,41,88,130,249,95,253,128,236,107,225,251,81,243,153,32,188,128,122,242,94,119,191,31,14,168,231,172,27,171,64,253,196,214,70,253,174,143,9,217,154,25,37,132,180,173,97,96,220,163,205,161,8,118,232,97,94,35,222,195,28,63,208,127,53,254,109,115,115,62,21,109,200,19,56,104,144,206,28,192,31,16,136,163,67,218,131,129,76,157,136,16,78,140,58,192,36,118,94,173,65,11,211,138,194,64,110,226,78,7,220,126,242,158,197,214,19,82,125,202,8,80,69,133,103,58,209,79,167,134,167,73,94,177,237,84,113,221,86,236,136,224,85,58,111,120,159,149,16,12,210,23,65,144,5,5,80,152,216,121,12,116,245,186,114,252,25,252,136,129,248,158,92,215,98,98,188,155,223,191,62,87,46,198,128,130,160,221,135,211,188,216,228,119,79,111,234,88,203,109,96,237,40,63,172,113,45,154,212,191,81,60,109,245,219,101,197,244,208,85,38,123,226,75,40,171,39,23,78,23,3,3,68,75,232,185,165,155,255,120,220,121,161,178,82,112,52,40,134,2,111,151,148,219,208,233,66,78,58,63,112,42,248,23,161,192,46,223,151,182,52,253,235,222,149,214,176,39,219,154,98,192,230,53,169,83,94,95,169,191,16,113,144,145,17,129,228,119,147,243,106,199,254,113,78,165,29,83,101,76,34,47,64,21,129,132,70,86,210,231,164,42,158,96,166,166,3,3,6,203,244,15,114,166,155,13,121,45,19,216,43,236,161,251,220,118,209,22,15,106,61,105,4,85,73,52,139,246,191,209,99,32,56,89,241,108,74,113,166,129,47,50,62,70,190,207,81,43,98,24,26,205,213,4,200,77,125,166,56,7,230,23,136,176,180,222,32,89,175,245,249,84,170,125,47,66,3,8,3,158,110,19,58,178,96,99,99,102,58,231,173,86,28,68,144,5,132,199,106,139,168,176,13,204,236,99,196,52,23,17,176,227,144,123,230,129,45,74,33,211,247,105,170,232,98,16,144,85,221,55,245,145,73,137,2,84,89,173,188,242,105,220,16,71,111,92,133,152,193,226,202,249,112,139,195,59,54,66,215,22,107,239,175,128,243,233,174,33,158,97,93,34,17,2,143,247,55,17,243,64,237,60,24,133,227,253,114,14,24,14,106,251,178,163,16,126,79,141,91,126,25,116,130,202,231,134,28,249,246,59,193,13,236,175,159,19,12,250,141,136,209,96,197,99,87,237,209,70,57,89,191,139,201,104,50,122,160,158,248,42,173,195,89,211,55,199,253,155,212,154,234,145,96,147,75,53,167,103,70,18,233,238,12,43,5,252,236,4,1,242,3,134,218,243,215,175,137,109,58,31,28,114,223,197,247,166,169,70,252,48,121,14,119,168,178,130,254,212,81,25,212,100,223,184,46,142,167,172,53,27,122,81,234,100,91,128,225,210,118,254,77,47,37,23,160,60,252,148,162,151,140,28,216,255,41,214,5,62,241,234,210,196,119,65,243,21,144,79,251,52,184,63,228,186,155,188,101,56,150,61,145,40,12,172,151,184,123,116,22,44,165,30,76,129,118,72,142,192,192,148,5,213,88,4,217,30,144,39,252,163,83,113,248,8,168,183,72,237,209,157,167,116,158,169,149,53,186,140,193,0,254,80,132,132,122,102,36,116,63,102,90,109,50,125,1,140,103,11,193,50,209,5,247,36,221,152,96,123,231,13,228,167,138,226,120,239,161,111,60,77,121,222,121,198,43,76,231,6,9,110,197,254,20,159,210,129,28,101,24,2,222,127,207,74,26,146,44,16,62,153,251,69,159,62,61,10,224,151,170,211,175,111,149,159,148,157,209,24,8,7,7,97,96,85,147,33,161,122,5,26,51,171,190,111,153,159,108,99,122,144,244,179,5,59,234,166,138,51,254,119,189,20,233,113,80,131,37,172,176,196,231,140,47,237,14,236,139,239,50,145,48,11,210,179,63,44,169,116,239,118,23,223,45,189,123,199,13,177,221,86,47,132,235,123,174,63,197,188,216,196,196,98,200,192,187,11,169,219,38,199,214,103,69,218,170,69,140,120,168,36,203,75,203,182,92,255,146,162,93,195,239,76,238,24,88,116,68,87,104,178,239,93,38,243,196,9,246,136,52,28,212,241,212,160,216,149,121,221,98,139,124,193,25,143,2,126,79,15,77,21,231,37,186,8,30,126,192,148,49,6,224,135,145,114,234,128,85,83,185,199,200,51,159,114,42,60,148,143,69,93,179,191,209,63,141,85,228,18,101,6,109,33,37,236,213,223,47,55,125,66,249,123,235,197,249,83,101,160,254,170,118,165,110,62,242,148,242,238,126,225,28,204,138,135,138,179,105,90,118,213,248,147,95,192,147,217,3,131,144,64,60,26,237,79,210,172,174,76,27,174,153,81,16,93,249,203,192,5,62,246,219,40,78,187,99,222,1,168,215,155,72,237,80,4,255,116,241,92,214,161,129,96,18,192,7,201,67,198,69,21,216,249,159,112,217,53,223,83,130,243,131,71,199,187,35,237,250,101,36,30,44,240,157,203,96,96,249,134,161,227,67,247,184,166,24,29,236,187,87,171,145,48,182,193,164,189,66,109,33,65,58,176,94,134,192,1,224,47,227,208,208,178,148,115,206,209,238,244,219,17,26,24,216,1,74,177,91,160,31,90,102,104,155,7,231,36,195,216,241,14,39,106,139,240,27,30,172,235,4,207,29,149,115,242,206,46,49,80,13,175,137,111,102,210,135,127,38,82,0,230,39,130,38,35,108,147,191,101,112,241,64,24,30,3,246,62,49,119,129,75,6,67,94,171,161,247,110,1,207,46,222,38,21,112,131,14,102,29,19,100,72,71,21,6,86,12,238,30,183,31,29,76,94,239,206,145,40,108,198,168,176,71,109,19,196,55,78,131,238,246,148,230,145,36,226,160,150,91,35,155,174,18,62,158,86,142,207,156,132,155,113,2,185,225,3,18,191,82,50,157,5,85,122,92,202,68,16,176,205,124,101,99,228,86,91,147,103,127,37,175,188,32,80,143,217,187,67,107,243,12,203,192,43,168,74,230,46,4,108,7,166,108,38,127,121,225,119,144,253,42,96,162,19,3,27,194,142,38,107,102,224,85,229,27,88,97,214,111,145,48,35,92,218,34,63,217,231,131,12,199,166,244,84,114,32,190,232,90,66,23,255,142,231,39,12,233,82,17,5,113,67,8,142,243,123,18,108,13,228,236,198,171,235,236,142,72,216,140,218,214,14,79,42,94,112,251,64,231,39,104,16,9,227,233,75,248,34,145,90,117,126,228,105,74,225,4,70,130,177,219,216,79,98,134,130,17,57,229,77,137,139,126,101,164,202,2,82,210,132,47,127,79,206,7,247,174,117,130,49,157,20,76,147,63,85,201,20,102,57,27,243,189,15,128,103,26,166,209,9,78,110,40,73,176,142,0,91,145,29,18,102,138,73,170,98,214,22,56,18,56,226,178,21,240,7,226,131,61,185,91,216,236,226,221,209,196,76,107,193,49,14,186,231,57,182,7,31,87,184,238,52,21,243,118,60,7,14,185,117,110,172,216,241,89,78,158,186,76,69,133,95,19,7,245,112,235,175,18,209,103,67,76,55,224,45,114,11,0,127,96,6,66,196,135,182,40,146,137,136,0,222,4,140,191,92,118,122,198,98,191,251,214,153,210,24,12,193,67,73,9,74,50,29,159,253,181,79,119,35,157,19,152,144,176,222,169,132,93,126,218,79,166,153,194,51,14,206,143,129,124,30,102,238,94,125,70,32,84,108,155,182,142,177,194,33,226,196,146,76,163,157,114,46,153,14,80,181,192,70,192,127,38,57,227,148,122,39,41,219,249,181,189,111,42,145,48,186,145,234,32,22,109,83,229,90,213,38,46,78,56,96,239,246,139,81,139,250,61,250,204,210,165,7,116,0,94,86,129,7,186,86,167,206,174,247,119,77,190,248,187,14,252,142,194,133,168,75,204,23,48,118,197,249,127,163,69,146,5,170,146,237,154,232,223,16,75,211,167,92,235,190,129,39,15,237,189,175,227,246,232,37,123,203,240,207,35,47,125,12,44,190,47,170,139,60,219,71,216,56,65,47,151,4,240,87,248,20,73,178,102,253,186,74,70,105,94,99,100,51,38,140,6,190,210,177,115,189,233,108,35,140,226,198,152,29,86,5,244,253,224,211,200,165,237,181,22,31,147,106,42,31,12,44,160,67,11,203,192,1,7,37,97,195,85,82,142,209,97,203,179,179,83,151,233,67,67,151,251,58,25,119,244,144,176,208,63,187,73,124,177,203,37,131,41,10,229,79,158,97,96,142,97,74,161,136,66,19,65,151,53,171,59,202,145,152,206,159,23,237,75,241,231,225,219,25,58,163,141,172,225,104,200,234,148,156,112,203,103,80,218,114,66,58,13,156,200,60,156,120,253,215,144,101,29,20,0,100,185,55,162,102,200,48,226,42,106,215,239,50,0,7,2,17,98,205,205,145,43,77,2,29,70,138,137,140,41,222,84,188,111,193,164,3,164,177,175,15,147,120,246,28,10,25,124,77,59,251,192,0,126,79,115,14,140,40,116,167,60,170,53,229,72,78,192,242,247,19,9,11,187,37,38,83,147,124,102,103,40,163,64,117,78,121,233,177,137,165,224,155,164,150,251,246,237,159,14,144,230,72,31,197,200,177,69,137,21,78,150,183,75,105,33,127,152,111,220,243,107,222,182,247,200,190,201,149,253,88,155,16,206,145,60,223,249,171,110,163,148,100,199,106,234,83,7,150,140,188,182,174,212,242,77,25,105,123,172,139,129,1,41,210,46,90,117,160,177,175,64,114,250,1,205,159,26,225,126,32,222,38,162,147,245,164,113,74,38,250,185,212,198,31,176,100,234,181,227,15,195,63,241,42,185,52,27,50,243,207,1,245,70,173,37,25,13,242,175,160,63,217,95,202,202,4,252,55,127,179,123,103,95,157,102,121,200,80,237,93,2,18,54,169,124,18,159,255,38,115,166,194,56,215,225,242,13,192,175,119,199,157,238,179,245,107,140,26,100,159,93,238,162,138,156,224,72,170,252,92,18,83,185,62,214,210,119,25,72,88,116,119,82,37,147,121,128,79,192,193,116,88,228,33,2,230,221,117,143,16,64,103,207,220,171,68,157,194,154,142,233,60,227,234,223,18,205,108,205,118,119,142,36,57,166,68,146,5,245,178,75,102,133,25,201,226,181,32,89,47,235,1,124,205,23,177,8,244,227,242,73,25,38,115,189,78,203,13,233,95,150,180,132,179,248,103,28,228,215,101,39,141,112,67,234,181,235,102,220,89,21,147,152,115,93,136,142,184,184,33,6,235,178,179,240,123,29,159,44,232,133,143,214,254,194,33,38,82,201,47,251,219,253,7,120,223,165,120,47,253,66,175,188,138,28,213,194,119,183,113,33,234,108,75,243,42,113,208,233,45,233,69,184,161,83,241,181,230,52,206,247,156,72,176,249,105,199,170,187,126,138,207,218,228,109,163,164,69,28,116,100,73,146,219,221,64,52,99,103,80,96,134,107,146,192,115,186,32,98,30,64,23,97,252,148,189,247,183,34,128,223,150,231,234,246,207,244,202,45,242,231,198,163,62,21,3,245,112,79,221,81,204,240,229,131,197,139,14,6,194,67,36,152,112,142,20,122,198,2,185,17,184,193,176,49,227,137,132,233,225,206,62,164,40,219,147,89,59,185,140,217,143,34,200,178,122,55,32,77,83,144,239,103,11,27,113,47,226,17,69,61,225,57,180,59,67,59,195,189,160,184,9,129,31,128,254,186,49,128,167,227,210,37,177,30,73,27,94,182,0,242,209,40,122,220,190,133,202,33,181,2,127,145,36,1,135,240,93,147,145,156,254,38,183,57,119,95,95,73,138,8,211,9,162,198,109,13,145,80,13,12,53,12,182,125,6,248,114,184,1,117,183,40,171,231,7,106,182,211,218,88,117,28,244,224,213,203,54,17,163,62,169,160,104,185,104,36,15,26,114,247,186,147,105,239,23,16,132,227,252,67,0,216,14,168,135,123,29,214,238,250,66,62,89,95,166,79,75,120,0,252,239,208,28,23,224,82,176,8,105,120,225,62,157,200,13,177,92,147,126,239,202,178,105,99,106,49,218,40,209,138,228,71,138,138,96,158,94,186,192,55,178,189,246,71,1,252,217,92,27,232,174,250,179,214,181,59,109,248,130,247,23,48,223,86,107,190,72,253,66,10,50,133,97,47,5,200,239,157,99,234,222,81,155,119,201,12,118,224,121,249,171,245,118,149,173,225,6,66,106,59,223,201,218,15,1,126,69,197,210,187,22,96,95,31,41,249,106,230,15,117,15,128,79,129,126,227,232,48,21,114,152,160,230,163,157,87,248,240,160,222,27,19,126,15,62,173,93,186,194,168,198,78,0,190,229,101,80,225,206,234,67,37,57,250,117,71,190,18,192,87,22,52,106,168,85,174,86,29,163,160,198,206,8,172,119,189,59,153,154,63,156,119,158,211,167,193,160,21,25,22,164,58,0,96,75,182,139,163,156,107,198,63,64,60,238,145,242,19,130,24,229,116,32,116,221,109,84,242,168,48,54,140,139,214,250,204,238,173,55,187,35,182,119,230,8,60,139,249,178,198,129,202,121,102,250,119,63,68,181,151,224,122,251,102,101,55,255,210,180,157,12,40,69,36,144,83,3,246,157,12,238,182,103,97,212,84,118,54,165,243,204,193,67,165,174,27,136,142,183,203,181,187,175,222,196,159,146,0,249,198,166,216,45,47,169,156,245,32,72,47,219,28,127,165,199,112,227,60,181,235,47,242,10,109,12,137,181,144,48,106,212,223,157,66,51,151,239,158,3,108,7,233,185,0,94,27,236,239,214,233,103,208,189,72,40,106,136,174,198,242,171,125,63,174,98,184,180,236,204,189,253,181,45,242,152,27,178,252,28,187,231,202,66,31,28,241,242,232,193,251,7,72,240,200,137,201,1,252,30,211,237,3,154,131,235,171,51,64,252,123,155,85,136,213,255,206,205,167,23,114,185,246,17,1,179,183,149,157,10,130,19,125,213,202,144,51,31,183,5,248,12,152,52,244,64,12,23,13,95,13,44,121,218,132,135,162,24,180,21,251,63,203,17,92,165,146,171,121,227,129,245,187,247,227,82,67,11,117,56,254,36,247,250,229,2,245,60,131,165,123,243,65,220,97,94,195,243,234,55,97,104,8,74,214,194,182,187,17,196,239,255,42,139,189,42,3,215,75,138,166,21,221,120,232,90,165,145,125,71,178,44,10,9,179,198,165,36,241,129,200,173,108,236,172,125,205,147,225,16,148,144,1,122,168,217,127,80,65,240,218,162,184,32,28,226,134,86,151,159,255,46,55,160,240,52,231,247,5,49,160,135,224,17,6,9,59,202,21,8,235,159,252,73,99,72,176,180,159,121,237,243,123,173,123,95,90,52,110,240,106,160,193,233,164,88,129,205,111,160,78,169,35,198,194,204,82,196,10,227,142,228,53,217,197,203,15,178,19,108,113,43,0,62,12,244,125,27,117,187,9,89,132,15,159,82,123,142,1,248,75,57,190,96,97,25,227,146,58,163,190,208,50,136,128,121,118,223,253,29,148,194,67,78,24,78,211,124,123,155,27,50,62,63,87,245,92,42,8,83,30,215,116,54,214,136,135,234,137,203,163,102,190,249,159,87,84,135,188,160,148,193,240,171,209,207,126,218,67,156,245,204,84,18,239,214,246,225,161,6,194,168,187,179,131,254,216,249,142,34,175,72,87,84,39,210,117,132,72,69,21,93,156,175,244,37,228,57,10,169,146,65,174,37,24,76,137,187,111,164,47,49,84,50,7,196,227,249,92,173,196,132,131,143,228,133,47,252,224,6,138,95,242,163,202,247,1,63,249,204,91,68,110,123,204,126,0,190,13,41,132,136,7,249,20,107,117,127,56,55,27,1,246,223,254,109,52,178,249,99,246,226,194,71,52,50,1,195,79,55,108,55,82,139,77,255,187,9,131,223,226,109,34,240,188,12,149,156,35,118,32,44,53,77,123,215,36,34,49,176,218,41,146,68,205,52,45,101,235,187,5,24,219,232,22,190,29,66,201,46,67,93,166,67,244,211,6,207,11,32,255,233,41,103,54,228,255,9,113,152,111,36,58,206,212,231,134,140,108,91,74,122,73,37,5,95,7,15,100,137,171,95,225,117,243,232,123,222,4,249,106,180,81,185,144,52,80,207,47,99,226,120,148,159,106,233,204,84,111,54,109,227,160,230,219,75,222,94,70,118,212,205,21,66,147,70,221,72,176,129,205,90,237,61,41,57,207,106,158,70,252,195,85,2,143,7,9,171,5,113,228,143,139,119,242,241,241,188,229,72,254,248,240,52,56,27,13,21,204,88,127,221,65,231,39,192,39,192,3,201,76,72,167,92,247,233,231,175,179,146,48,61,28,9,26,93,123,210,230,170,3,157,181,138,255,252,0,248,222,25,16,191,105,97,21,35,13,254,127,185,96,152,206,57,146,254,185,33,86,61,86,227,75,66,131,0,156,27,226,187,50,34,126,199,48,162,171,47,162,226,17,165,34,30,122,107,222,76,8,215,232,255,67,204,35,218,129,39,29,224,127,198,215,198,221,4,17,45,12,188,246,63,73,76,145,48,156,252,96,21,75,206,118,178,90,250,28,45,69,50,128,199,162,209,46,223,31,94,225,113,197,118,197,37,146,159,123,116,199,195,18,111,11,146,243,255,241,56,78,100,80,24,92,13,173,113,50,164,101,55,228,125,33,168,83,216,66,58,112,18,243,224,4,119,112,139,156,232,79,198,102,10,10,44,202,249,180,134,66,187,140,40,63,121,246,112,72,4,189,1,193,88,75,204,63,87,51,218,17,250,230,241,32,147,0,213,94,175,185,175,113,105,59,113,168,141,130,11,123,163,84,2,190,38,162,106,231,154,135,117,220,135,44,71,19,1,190,117,172,143,26,105,247,15,38,67,117,60,104,250,64,128,154,59,117,181,106,232,205,52,183,213,6,62,134,96,80,118,50,24,23,109,203,222,202,24,93,135,5,139,159,169,128,61,188,149,109,197,12,175,131,130,85,192,82,40,89,28,116,251,104,184,84,194,72,120,239,182,168,62,133,105,32,166,19,194,51,176,84,117,242,156,239,131,95,204,119,86,87,224,125,219,14,62,137,123,148,179,99,234,197,124,240,18,60,84,128,212,64,145,48,232,175,170,129,124,197,117,100,2,240,15,213,193,5,51,45,237,181,27,102,50,119,168,10,180,248,76,233,207,82,106,98,110,221,114,156,254,230,235,188,131,81,33,249,126,55,213,171,7,151,122,107,162,31,215,194,143,134,32,110,6,216,247,247,129,32,121,133,88,167,142,46,76,231,95,46,28,158,46,207,132,45,35,118,172,150,165,123,208,137,242,59,131,56,225,58,34,219,162,229,147,132,142,62,134,255,213,112,144,136,167,186,212,214,198,95,215,3,253,8,60,244,58,212,84,125,188,213,31,205,131,246,23,115,108,3,240,225,168,123,213,85,194,87,251,97,178,113,154,153,61,30,138,190,21,238,50,212,40,71,198,211,19,252,152,219,13,168,231,31,102,66,245,2,31,117,61,105,100,126,211,146,201,13,49,89,111,181,132,75,12,140,48,55,22,208,132,156,99,96,124,168,125,213,184,244,44,77,121,222,80,255,218,20,110,8,238,73,29,167,59,139,227,164,252,153,205,166,76,10,16,223,119,187,230,232,38,94,45,165,92,122,106,248,173,1,124,224,73,189,185,187,1,42,65,40,154,247,200,39,27,197,229,97,163,50,35,159,73,59,32,125,153,81,181,222,133,131,106,207,35,110,185,26,144,39,140,215,62,197,13,180,115,243,127,16,96,44,186,77,70,195,59,161,197,59,119,189,1,195,245,126,192,229,192,78,64,233,68,245,211,131,66,10,53,32,126,229,67,83,29,79,207,23,61,74,130,239,240,26,1,250,149,185,107,237,189,224,228,118,105,201,216,250,223,148,43,61,6,29,143,36,42,115,92,158,225,196,190,127,143,132,13,117,167,229,166,42,59,23,141,189,33,208,28,114,1,245,53,94,115,124,125,165,159,197,188,97,224,229,46,112,62,151,203,193,50,215,212,219,21,214,142,235,151,76,186,128,190,59,50,40,115,79,221,112,121,227,183,29,152,37,67,224,217,131,178,18,144,79,106,51,142,184,149,22,111,80,1,245,128,66,57,212,9,28,178,222,190,196,244,181,197,4,9,187,217,183,63,203,171,125,153,145,211,240,222,0,188,4,232,95,175,190,109,247,52,176,57,118,138,88,142,71,145,27,50,239,61,34,236,94,15,242,127,84,98,203,118,4,236,47,92,5,55,94,26,99,74,64,149,92,136,214,151,112,171,132,170,70,156,77,233,227,238,226,149,4,143,84,120,129,253,245,104,142,11,197,82,228,77,203,143,13,85,125,70,194,6,72,119,171,152,205,195,96,114,143,75,21,154,46,145,48,78,253,191,121,169,230,244,17,178,156,231,92,4,97,12,108,116,58,153,220,138,135,252,53,241,231,28,46,233,72,28,116,220,251,126,169,179,33,200,138,238,130,44,135,187,13,192,135,76,22,82,164,14,126,217,177,101,251,126,211,83,96,126,134,216,110,161,117,161,252,164,229,180,18,138,52,204,10,125,2,3,199,39,105,54,159,138,31,143,233,100,238,19,120,54,33,252,214,215,76,31,92,162,117,205,243,12,85,174,250,219,132,110,97,73,162,59,200,213,213,182,81,71,224,153,254,90,183,106,213,73,24,133,139,125,118,121,36,30,122,151,206,77,29,208,63,114,153,96,146,103,145,17,24,152,58,241,3,163,154,87,161,163,60,141,97,63,72,252,145,176,197,233,154,78,158,208,23,156,185,133,97,231,134,90,0,63,66,166,118,151,138,117,12,228,47,229,137,133,125,71,194,146,35,247,227,243,99,56,140,41,114,11,124,198,216,129,248,166,26,88,19,245,46,29,47,27,100,113,157,156,199,67,185,89,244,180,71,90,229,184,34,185,163,216,28,148,240,208,249,93,154,203,154,239,32,43,70,121,97,39,35,243,171,126,128,249,167,103,105,254,30,180,190,13,4,83,224,188,197,189,74,221,110,211,148,51,99,213,205,204,234,145,220,16,239,3,3,15,247,113,215,221,132,164,203,69,201,2,192,158,223,182,218,83,148,79,133,140,11,156,157,87,108,8,60,203,93,44,143,192,59,109,47,76,132,95,182,17,29,193,33,199,251,247,37,135,106,252,151,14,61,230,213,192,243,4,30,199,124,237,199,200,170,39,151,84,194,63,68,4,116,144,176,110,249,141,54,150,208,180,241,184,98,24,124,9,192,83,166,225,132,4,62,115,14,54,151,23,51,25,91,201,0,191,35,239,222,154,61,241,124,205,218,102,230,47,206,64,224,89,45,80,54,68,81,145,21,49,78,170,62,30,251,10,216,3,55,92,149,76,243,146,52,53,53,199,91,207,15,208,175,106,41,151,5,217,110,151,22,101,241,198,224,18,36,44,61,180,230,61,115,232,155,75,135,242,146,2,86,99,130,192,217,106,166,182,136,252,195,174,179,96,147,232,59,191,1,125,55,181,255,137,55,118,92,79,47,130,193,110,199,22,1,49,17,145,145,142,82,96,72,120,162,130,201,234,255,82,78,58,227,44,44,165,97,209,9,98,86,9,190,253,197,131,219,110,244,253,209,226,103,27,12,249,180,138,235,200,25,37,138,95,61,225,118,255,188,79,90,186,28,243,157,160,155,33,64,253,162,27,90,32,10,50,93,184,115,121,90,166,77,10,240,97,63,179,3,47,67,223,242,198,235,36,75,125,121,104,136,44,183,60,106,188,15,196,33,243,72,161,187,58,236,42,254,181,147,153,24,176,107,215,194,135,46,160,22,192,251,23,243,71,94,70,179,28,197,246,120,83,111,6,12,87,190,186,196,243,199,1,133,156,23,5,46,184,101,141,171,120,27,15,25,224,40,158,204,255,252,212,78,28,208,55,67,244,215,66,168,121,191,164,192,138,102,136,77,9,0,31,33,141,250,253,137,196,51,228,64,233,192,197,21,168,71,146,215,132,89,198,219,253,87,36,200,82,23,178,77,1,126,24,248,189,139,243,56,245,44,131,79,249,21,247,8,178,147,132,120,116,133,8,228,151,12,173,211,171,60,240,68,241,19,29,180,242,46,98,99,135,208,246,46,13,254,163,56,168,186,165,13,226,57,187,255,110,255,156,247,101,125,61,166,147,150,124,102,137,40,217,228,91,202,93,111,216,94,43,144,15,9,175,187,228,195,166,149,198,2,42,69,79,50,1,127,196,126,159,133,25,248,95,52,172,36,207,89,151,0,248,63,172,52,74,68,22,109,131,103,248,218,86,154,13,240,185,151,54,199,98,159,95,52,229,27,69,60,186,108,1,244,16,184,119,1,125,125,96,115,44,137,127,161,188,10,163,34,252,241,40,180,245,247,94,226,221,47,118,107,171,83,87,248,173,52,138,166,195,80,112,22,61,215,200,181,135,67,100,111,73,9,15,53,203,145,47,148,252,178,63,61,1,236,215,241,38,148,9,166,80,252,115,121,250,181,249,41,58,74,99,227,212,231,204,252,14,69,40,121,237,166,120,27,26,162,136,48,149,29,248,6,202,187,97,149,11,85,161,2,248,223,117,89,1,220,23,57,144,156,125,155,240,158,30,48,126,216,57,116,17,143,181,117,103,64,103,7,52,163,111,131,191,159,27,110,248,221,97,166,145,169,20,108,40,193,116,30,178,246,226,69,109,220,213,22,227,243,152,65,40,64,159,17,203,205,83,235,60,203,171,144,63,162,202,178,195,116,254,161,237,159,171,146,152,99,54,214,117,107,168,104,186,186,111,208,28,23,117,50,222,88,238,127,243,152,197,19,31,78,236,104,77,67,85,69,10,232,231,206,144,175,111,129,103,202,153,130,190,107,87,61,239,96,207,82,61,172,78,100,207,244,197,174,73,189,63,135,157,110,118,160,15,138,31,220,65,107,118,122,113,175,48,183,103,95,169,234,20,213,41,135,126,74,14,131,233,28,38,110,23,191,202,153,226,218,184,127,144,229,82,254,80,154,215,253,229,152,161,115,4,18,236,18,223,135,119,213,231,5,205,246,248,181,248,173,162,122,88,15,124,234,219,86,108,179,136,249,102,29,204,228,25,104,37,85,165,188,245,94,86,231,78,22,9,234,146,168,161,192,234,93,181,34,145,244,164,236,46,142,205,136,163,40,248,74,188,128,36,73,50,143,107,201,65,240,194,242,107,192,95,136,210,180,116,221,67,198,165,79,112,136,162,20,160,119,143,156,212,234,93,245,165,133,159,136,121,236,103,3,241,69,151,176,155,192,99,206,117,4,178,41,201,48,105,224,134,120,28,153,84,121,165,119,230,101,196,68,78,143,99,0,189,199,146,209,201,79,180,105,102,189,21,174,79,92,141,228,15,80,205,126,149,69,171,241,80,72,206,111,217,37,14,192,27,213,216,174,226,55,113,119,120,190,242,14,208,42,35,193,38,47,167,29,159,27,134,77,222,78,252,118,126,187,10,9,11,239,62,188,100,73,37,235,12,195,239,207,120,26,1,250,210,91,125,29,46,169,184,231,175,46,100,212,44,129,84,33,162,187,91,117,91,182,34,62,42,91,202,232,194,12,3,235,69,66,147,213,235,29,73,245,53,51,235,157,223,2,249,65,222,21,50,96,118,227,229,118,246,185,234,78,14,18,102,74,121,88,149,162,76,145,49,230,53,89,97,79,2,232,75,198,254,165,217,49,214,22,43,63,163,251,218,189,220,69,185,225,217,183,89,105,90,239,205,232,208,220,211,188,234,151,33,187,70,5,54,52,159,160,166,94,62,57,102,4,243,26,233,167,12,23,152,153,161,103,87,9,178,123,167,92,81,12,145,194,177,235,91,233,241,228,11,141,14,166,62,87,253,210,144,241,170,195,135,197,238,140,1,84,172,227,220,128,222,98,183,17,210,9,63,73,215,18,155,98,219,131,135,77,9,48,91,188,226,177,100,47,179,26,197,255,130,92,173,223,177,69,94,58,140,198,172,86,44,111,53,200,111,48,209,107,136,221,49,83,147,192,191,17,56,248,115,10,204,199,170,56,238,88,144,92,97,200,126,232,175,149,135,132,197,71,238,87,241,231,176,233,25,249,38,164,138,124,0,243,142,142,164,116,178,152,15,130,123,166,100,77,152,28,81,43,74,81,146,193,179,47,145,172,102,113,167,202,169,199,72,88,215,229,32,46,85,73,171,68,179,97,73,160,152,11,211,185,79,210,177,101,95,200,120,46,223,248,87,80,223,23,7,157,63,212,175,128,143,185,255,243,240,31,151,77,177,159,72,187,72,213,176,147,25,179,1,49,83,179,184,105,147,81,56,132,19,170,42,254,245,179,127,71,210,117,185,116,134,61,0,239,251,98,42,88,66,115,232,111,149,164,191,75,17,224,134,236,157,154,123,184,178,204,95,254,76,50,139,148,6,240,161,23,220,157,74,189,71,152,49,40,43,208,47,43,5,242,5,220,181,38,144,213,192,124,138,96,173,46,2,242,171,108,24,18,170,103,21,152,14,239,245,52,77,33,112,67,182,79,141,171,224,169,157,81,2,42,46,186,11,7,24,178,155,26,151,230,255,124,188,12,186,203,250,211,225,212,23,152,255,124,125,211,85,34,56,233,158,11,127,78,118,33,28,114,157,92,242,238,64,157,156,230,58,191,253,146,56,160,167,55,167,30,134,240,48,65,53,185,27,15,52,178,113,87,253,120,229,174,213,253,148,124,109,116,50,69,9,53,146,63,153,252,244,62,94,2,252,53,91,142,36,227,130,5,240,39,160,55,228,217,116,71,111,172,220,200,151,1,244,199,16,152,58,36,159,215,255,34,175,228,15,21,40,8,224,251,123,150,85,18,134,216,83,163,201,92,244,155,143,112,136,50,143,180,248,116,143,191,188,255,82,173,216,180,108,11,31,231,88,92,245,135,55,95,4,30,91,91,130,135,93,0,255,76,182,142,18,113,217,115,88,182,175,220,61,202,2,240,113,88,171,155,152,27,61,24,47,186,240,78,96,20,15,229,59,85,16,194,181,203,201,123,26,67,245,201,63,3,124,255,172,111,141,46,80,80,184,112,41,175,195,243,5,6,166,76,249,44,85,78,16,148,75,211,83,234,210,22,133,128,185,88,254,54,130,4,245,46,229,82,149,214,12,191,6,252,247,109,235,55,79,74,49,191,158,224,210,205,239,7,0,222,238,79,213,139,72,61,226,72,97,197,78,140,15,3,245,134,249,235,47,58,158,116,130,213,73,209,253,247,24,110,136,211,193,105,235,109,35,187,50,72,97,88,218,253,7,24,88,87,239,97,247,135,207,119,5,43,24,50,86,202,20,8,170,81,228,79,71,62,49,100,255,24,128,224,22,193,71,0,223,246,178,244,148,72,95,75,180,113,246,32,15,122,136,128,173,219,72,226,81,129,19,175,244,62,149,91,122,74,34,193,182,127,204,107,37,12,4,33,20,61,106,140,157,13,64,190,246,83,133,98,85,202,19,182,155,76,243,178,162,0,255,29,175,239,185,223,235,201,50,33,19,162,208,171,64,194,122,71,190,239,48,103,147,253,17,156,138,1,41,128,48,176,247,129,157,227,2,38,39,182,151,141,190,121,119,44,80,157,141,215,166,187,254,38,248,44,75,29,123,85,182,222,29,112,148,113,172,11,76,131,93,138,6,81,89,163,169,244,48,96,91,130,227,135,105,178,0,57,34,10,10,11,145,102,128,207,81,104,135,162,89,49,72,235,197,236,195,148,36,192,127,211,84,161,101,83,224,135,126,108,203,126,5,77,0,190,178,13,13,114,230,27,39,87,164,233,255,22,75,4,236,143,141,13,21,151,238,14,118,211,215,109,85,87,3,248,248,46,214,13,206,130,73,192,252,83,2,99,183,187,186,255,233,90,66,51,11,23,240,244,62,218,218,123,13,212,103,164,118,55,93,211,27,42,69,7,243,142,87,30,128,94,103,177,212,236,111,246,159,100,18,241,131,27,180,2,245,45,50,165,146,37,39,29,44,68,145,224,185,101,142,132,81,71,30,86,241,134,130,24,108,248,244,203,198,58,145,176,247,177,141,137,245,230,30,233,174,70,63,245,22,182,145,48,52,115,210,183,252,236,193,239,78,11,62,202,148,138,64,124,202,227,186,17,1,229,147,203,173,102,250,7,79,145,118,33,225,209,75,119,98,216,109,76,85,90,124,157,107,174,250,17,154,221,234,142,173,152,118,120,178,82,3,11,202,142,87,131,181,102,49,252,171,73,182,169,23,86,92,19,192,75,98,92,178,102,82,27,9,22,103,243,253,30,22,192,235,94,173,238,226,60,86,131,194,1,191,227,71,127,49,176,244,246,206,68,38,174,68,69,140,40,71,49,103,60,160,143,251,20,66,160,105,17,249,186,199,51,199,43,246,128,30,8,229,51,11,58,61,90,250,27,189,151,208,27,138,128,109,42,74,26,7,118,41,10,129,117,164,209,231,109,87,250,251,77,168,120,202,96,234,225,232,84,69,242,57,114,37,93,245,237,139,155,114,234,240,52,179,50,191,191,109,120,168,240,185,200,205,238,207,114,43,33,199,47,52,77,13,224,16,4,57,55,27,96,159,173,27,121,206,26,41,237,128,61,66,215,118,88,82,185,122,185,108,13,39,127,77,2,254,162,141,238,101,72,14,207,218,40,55,21,56,188,15,135,72,49,241,8,119,87,130,54,183,93,176,217,2,113,87,122,96,30,113,71,220,82,170,254,50,20,164,166,11,228,195,73,221,2,93,148,46,153,69,164,237,201,161,47,129,135,92,70,138,16,13,33,138,16,179,198,244,237,238,163,85,216,19,18,202,206,14,32,51,68,6,177,184,242,104,36,216,227,194,188,234,142,56,47,198,172,235,230,183,83,18,128,255,255,197,123,192,245,6,18,65,56,163,132,177,135,96,222,247,211,213,139,41,250,111,28,248,111,155,74,250,1,245,51,255,235,89,42,3,72,78,33,0,158,44,124,242,20,216,239,155,132,89,126,101,5,231,205,215,122,60,37,64,188,210,169,165,236,214,107,149,68,248,32,83,151,26,166,209,43,150,136,229,32,128,255,204,232,188,225,3,19,89,152,3,248,172,81,117,189,132,228,170,223,61,189,46,128,2,155,228,106,26,107,134,191,225,22,143,89,48,142,235,67,129,9,92,54,43,26,175,100,225,177,118,15,35,218,255,96,193,165,159,33,119,13,139,131,233,100,200,142,181,55,47,81,128,30,221,251,93,21,105,219,31,112,166,20,215,174,140,10,179,237,96,12,245,62,107,170,231,18,22,108,208,89,71,217,81,187,238,238,88,150,58,123,146,176,138,222,123,79,42,47,120,43,202,219,111,98,204,151,71,89,249,89,249,229,41,80,207,55,200,147,157,45,234,56,76,144,164,167,182,39,56,232,40,163,149,217,107,4,150,39,168,193,240,147,131,56,170,199,239,192,199,101,171,104,100,28,249,190,182,235,214,42,50,174,65,169,250,94,122,123,115,250,117,1,31,205,53,48,6,220,80,240,200,25,43,202,106,53,209,89,241,85,215,22,167,26,240,53,185,91,226,85,146,145,185,22,173,150,249,52,42,140,63,217,187,126,185,199,42,134,152,98,74,137,135,15,3,97,59,17,208,240,96,3,173,88,220,79,243,143,47,35,172,6,171,222,210,174,188,55,41,191,177,63,159,35,112,29,15,85,37,183,181,28,170,145,155,81,47,12,238,3,71,161,192,56,235,150,26,10,25,165,198,216,222,11,139,2,107,110,136,193,158,65,133,87,26,228,231,196,233,77,236,194,24,18,108,254,98,170,84,204,192,248,18,246,73,129,235,54,8,211,185,69,245,117,119,104,44,51,148,49,239,83,215,129,41,38,76,131,222,250,167,247,58,199,95,105,43,35,248,52,227,224,38,132,138,74,92,150,170,54,219,239,15,120,172,253,232,170,127,120,153,76,217,224,16,166,211,152,241,184,248,17,144,79,68,161,227,145,138,214,47,40,212,237,93,214,125,1,189,166,84,61,207,100,206,68,24,27,61,178,97,0,244,188,170,36,74,116,230,7,200,238,43,19,238,17,68,3,206,31,104,95,192,229,6,42,121,60,31,108,245,79,82,34,176,191,163,117,79,9,41,159,115,153,218,107,252,22,114,220,16,194,220,252,39,9,35,223,236,131,239,159,238,72,243,98,248,189,158,214,223,242,251,115,250,225,214,132,6,197,27,16,210,174,32,156,21,110,104,118,99,1,175,245,243,199,179,102,32,126,143,76,92,224,169,31,47,223,11,104,8,150,54,32,97,163,223,226,102,153,13,158,108,25,43,248,44,125,122,194,29,246,142,60,234,100,90,159,90,236,182,220,224,146,27,144,143,93,228,184,113,236,242,29,5,198,67,235,52,202,62,110,200,250,107,243,29,87,22,19,93,7,65,21,73,43,39,56,132,133,65,91,182,163,81,46,216,47,143,206,234,61,14,211,185,66,210,178,219,171,245,236,245,107,68,23,33,89,2,168,175,94,38,21,174,245,175,76,84,20,14,54,201,56,129,252,162,215,236,29,32,113,149,255,157,18,222,224,247,252,234,253,182,21,209,250,245,165,189,113,31,131,240,38,0,159,181,127,84,241,153,11,198,95,208,85,95,39,162,199,67,47,65,146,210,253,149,254,125,205,34,180,240,169,240,171,253,116,167,106,174,189,229,47,19,57,76,209,147,197,67,41,161,178,82,29,229,114,215,113,83,137,94,22,172,4,158,75,208,174,121,244,219,164,247,206,21,211,142,198,201,56,168,211,193,249,131,167,134,113,100,143,222,154,29,238,84,195,33,80,98,69,229,150,18,255,136,74,123,216,195,227,82,52,152,141,72,85,166,225,163,156,113,136,68,226,47,53,91,96,127,116,202,189,234,220,3,158,150,187,201,189,191,95,96,200,136,53,198,89,204,242,46,189,239,26,86,212,215,61,130,67,68,153,238,222,237,111,148,131,155,13,41,222,79,52,0,206,231,49,87,229,62,198,222,213,39,200,36,117,249,6,24,207,170,60,46,202,230,248,254,93,68,82,153,51,230,170,159,44,37,61,80,231,79,230,47,255,227,213,129,61,80,191,1,252,172,42,71,240,209,47,78,189,155,116,2,206,211,211,156,58,80,80,233,99,57,157,116,254,84,25,152,239,210,229,0,126,111,254,13,168,65,205,115,181,4,201,79,39,138,219,166,202,137,137,125,154,243,106,138,231,16,136,191,179,239,43,68,48,8,7,207,218,75,227,233,50,128,95,170,47,109,243,198,198,47,253,49,51,181,42,123,7,212,139,240,87,221,104,186,104,176,251,228,239,233,212,239,24,216,87,16,110,92,192,192,186,17,62,222,216,18,9,240,139,247,228,3,227,85,236,146,203,176,205,209,151,45,207,48,176,128,158,152,208,228,111,209,246,182,238,209,186,244,79,0,253,122,188,49,203,151,122,202,40,85,44,229,147,233,141,135,146,207,222,227,4,244,137,82,238,141,137,140,250,53,68,79,90,64,163,32,129,2,255,253,23,108,77,229,166,45,94,160,207,254,177,230,243,155,127,127,92,6,238,215,101,109,1,248,58,253,125,148,104,37,104,27,166,74,196,33,8,226,134,92,238,152,215,195,245,45,78,94,59,238,188,218,156,70,246,180,9,60,182,34,44,121,31,52,145,12,91,198,167,192,87,66,4,246,191,100,46,16,197,243,184,45,250,217,87,97,96,164,131,26,189,194,181,190,80,139,99,211,58,93,102,204,10,244,192,30,79,43,98,185,68,115,92,228,98,148,15,87,137,85,45,90,245,62,111,15,121,28,95,243,32,218,147,75,37,198,222,235,144,199,230,153,227,164,185,156,166,31,144,111,197,12,161,221,1,190,39,219,245,75,38,69,91,68,232,141,91,223,125,143,23,30,241,58,124,88,243,159,126,71,129,131,58,250,205,87,60,211,239,31,78,220,9,250,75,1,187,250,30,141,52,68,181,118,141,55,251,171,143,110,112,28,18,60,253,103,218,227,185,126,129,209,163,235,95,244,130,159,226,160,151,251,150,110,34,122,88,183,4,175,215,201,146,227,0,254,145,255,3,55,53,235,133,9,201,133,127,244,28,199,192,184,9,15,83,177,28,246,20,193,61,62,98,17,107,248,240,24,213,176,77,131,201,246,33,89,183,224,254,90,40,14,234,178,133,173,112,213,151,89,82,227,118,120,233,52,142,135,114,147,155,168,227,62,250,231,49,8,234,193,38,175,238,131,79,241,235,238,226,93,130,168,114,228,34,7,128,103,171,228,109,189,59,217,134,169,52,97,11,255,218,239,244,216,188,202,93,111,209,216,78,67,254,244,232,33,80,79,194,7,82,153,222,211,14,91,86,250,9,216,190,64,194,66,80,49,109,117,217,152,144,163,165,248,24,254,64,28,244,220,103,190,30,206,50,111,113,151,95,218,90,47,130,136,130,104,216,249,213,60,83,65,250,200,140,182,104,93,49,112,94,44,203,184,128,57,116,213,187,224,121,235,248,125,2,15,139,97,174,117,244,208,15,146,1,236,193,254,248,52,192,127,186,195,222,179,132,110,100,44,248,24,249,186,243,1,235,17,27,116,115,82,196,241,17,17,226,74,202,213,145,176,153,107,31,119,234,148,170,115,115,51,194,54,173,55,129,122,54,73,50,94,5,26,162,182,194,22,115,165,188,7,248,242,89,243,22,185,152,15,138,62,118,65,8,233,128,129,81,58,168,176,81,113,97,186,18,23,246,88,18,140,1,251,159,204,31,187,74,44,106,176,86,126,45,210,86,196,116,254,5,117,224,69,111,247,219,19,127,106,120,39,0,194,172,40,245,55,106,196,159,249,182,64,233,201,139,214,124,48,100,119,232,55,231,92,228,166,158,157,133,57,86,133,48,32,193,199,215,142,211,183,24,189,253,94,110,123,211,104,129,224,252,52,66,13,155,167,187,206,116,230,196,134,37,6,2,72,240,245,107,74,211,85,98,231,166,227,113,245,82,77,77,200,158,112,251,44,89,133,210,123,23,99,166,126,124,241,251,168,48,154,15,50,231,222,15,50,60,57,254,252,230,163,201,71,128,199,151,150,147,170,244,137,118,95,175,252,138,221,106,224,82,57,234,173,79,121,11,245,63,174,210,147,75,77,54,39,240,248,149,173,154,70,103,72,91,174,45,188,84,173,88,196,65,253,206,231,119,156,153,152,20,194,210,244,98,72,86,203,72,201,183,239,9,55,20,76,36,32,22,33,133,104,15,204,10,228,123,10,78,38,236,200,150,173,64,162,230,37,9,144,223,116,154,189,104,182,224,37,88,73,5,119,230,117,116,24,177,250,157,223,71,53,87,120,76,75,65,10,66,134,17,187,197,92,251,175,223,157,211,166,29,203,73,177,109,145,40,106,93,162,47,72,226,79,39,34,137,66,198,185,160,138,113,227,245,211,210,223,222,215,210,211,244,162,86,32,29,214,248,229,86,129,124,203,202,78,203,81,23,12,196,67,166,106,122,231,16,156,195,185,48,97,150,100,137,5,187,84,245,72,20,216,7,52,223,2,205,132,187,174,160,200,200,69,18,36,188,35,25,157,168,196,109,62,212,236,202,175,65,244,16,227,133,246,215,190,132,249,40,218,160,216,81,224,77,148,237,33,213,16,146,209,165,219,41,90,226,22,160,183,63,12,41,254,170,179,47,227,240,228,237,48,242,70,151,208,83,217,222,28,117,191,113,207,63,153,246,97,234,47,44,120,111,50,66,218,211,202,205,120,177,212,49,44,23,129,181,155,176,224,17,40,139,118,161,251,129,179,209,186,203,73,128,26,40,68,235,70,8,171,28,174,58,220,151,230,84,145,143,208,216,104,117,217,206,169,155,93,206,24,33,255,8,193,105,102,236,222,171,255,172,103,55,53,145,207,53,237,169,140,237,41,39,130,170,58,89,11,80,94,210,56,194,200,2,81,118,103,170,243,95,222,91,242,105,7,92,40,222,143,169,64,70,229,228,61,49,118,44,152,72,207,45,48,180,159,112,157,33,189,46,36,201,9,78,252,85,204,84,87,129,92,56,66,64,164,139,55,234,34,236,73,158,165,127,194,191,78,17,199,65,95,238,44,29,185,79,124,169,188,209,114,233,249,243,2,9,62,79,123,146,45,198,68,81,30,168,242,237,41,34,177,140,84,56,84,23,247,179,188,103,93,244,182,236,126,233,213,253,42,88,123,52,190,152,241,99,238,99,197,167,178,243,24,187,27,27,133,4,175,31,132,252,91,95,126,69,213,186,19,120,150,109,100,127,7,122,249,214,142,156,215,187,141,119,19,4,138,201,103,243,17,43,157,215,168,25,185,102,199,90,128,124,120,83,211,206,19,107,255,113,155,253,80,58,53,19,224,163,67,111,186,226,197,163,239,42,158,50,202,180,1,245,117,104,50,184,11,145,23,149,187,75,173,124,154,151,112,117,191,53,189,229,150,119,1,177,201,170,187,191,110,141,233,164,161,158,89,66,31,236,26,167,92,88,79,167,2,250,187,106,42,56,36,127,234,69,221,218,241,51,154,36,19,28,116,122,201,182,234,158,209,102,162,4,110,198,171,21,140,131,18,60,150,107,189,140,44,117,214,230,79,127,166,95,221,239,19,15,140,10,28,203,42,238,73,162,5,33,209,64,190,78,182,38,67,227,236,32,123,40,69,42,126,16,247,202,188,234,141,251,134,217,25,79,179,205,162,111,203,220,185,250,30,146,102,92,160,76,182,117,88,111,178,130,105,134,27,226,225,103,82,33,82,247,174,103,86,78,234,110,108,57,192,47,49,9,195,172,180,228,162,21,198,132,77,2,129,192,227,20,114,215,24,44,29,39,13,43,142,99,164,30,66,131,73,231,41,11,59,158,18,209,71,170,240,9,166,136,97,192,6,231,203,75,147,95,114,185,221,158,40,64,104,57,7,87,131,103,83,29,39,54,146,154,215,204,181,127,37,3,122,125,169,216,105,175,248,54,209,197,98,211,53,175,28,3,20,88,250,159,188,178,20,181,240,64,94,170,16,6,80,111,25,169,246,229,99,229,175,37,127,247,195,2,182,160,1,24,224,253,139,198,21,123,61,175,37,246,207,230,111,124,179,129,122,56,245,48,84,143,34,156,236,139,128,117,111,237,29,252,106,122,56,171,91,210,35,126,246,203,103,98,60,186,145,87,247,183,175,199,69,83,192,179,184,0,163,226,138,8,28,116,221,123,94,20,174,255,178,175,28,115,247,169,190,237,191,253,95,23,87,137,14,184,137,203,15,201,244,251,128,94,73,56,12,85,36,75,214,36,90,217,216,159,136,69,22,49,15,209,208,70,101,95,115,165,202,49,182,90,155,187,250,222,73,177,23,241,254,87,94,210,223,71,115,19,218,0,158,246,92,140,139,166,46,169,214,203,66,37,154,92,145,48,205,238,173,74,62,101,227,28,253,10,188,41,254,0,224,43,106,91,191,121,67,55,249,77,173,82,146,51,95,182,240,13,141,124,220,73,25,155,94,39,87,44,177,81,43,65,194,200,191,69,197,73,196,218,40,85,108,190,244,126,73,192,175,54,169,150,219,61,123,229,48,177,227,154,135,11,3,244,238,203,115,219,35,184,129,145,223,17,90,218,234,175,44,18,22,116,252,109,150,57,181,243,114,229,167,156,115,174,29,14,234,253,202,249,200,221,32,78,48,190,79,152,163,111,27,19,70,172,209,125,203,235,203,105,168,212,82,33,137,179,58,128,223,147,90,221,116,158,132,147,209,197,103,238,57,181,104,8,233,206,125,201,238,102,144,33,95,70,237,199,239,224,43,251,80,117,247,138,16,235,229,180,56,63,42,97,194,65,247,92,151,107,197,234,251,36,168,115,187,214,53,197,185,139,194,4,68,172,248,249,127,223,159,210,167,190,120,61,133,233,196,95,180,175,136,222,48,225,142,187,25,70,203,113,3,7,245,117,93,170,114,151,228,190,127,222,186,178,112,207,18,208,155,224,208,208,79,205,234,122,102,189,99,27,140,0,31,254,117,209,254,43,252,32,201,155,137,50,156,44,201,0,19,198,64,159,168,85,185,87,113,214,26,124,249,143,224,18,80,223,89,187,167,134,120,135,139,223,245,78,164,191,31,44,231,115,10,149,53,86,218,98,226,26,165,27,188,156,229,227,46,42,9,79,219,207,212,250,117,194,166,244,172,47,244,33,18,140,61,33,236,188,184,7,134,219,120,101,177,175,222,198,128,151,47,110,47,91,198,165,113,200,67,72,142,227,154,80,92,203,33,202,191,2,246,73,226,205,218,113,90,173,142,120,168,58,157,178,234,76,179,63,8,226,79,198,33,104,129,1,35,206,164,11,77,12,7,86,183,123,171,111,146,1,122,179,140,46,36,68,175,246,155,28,251,39,238,91,230,146,128,255,175,147,38,31,48,39,229,39,20,152,255,67,214,143,6,179,140,220,23,192,125,246,95,48,242,55,15,131,73,96,96,179,125,131,227,162,97,137,126,115,132,148,132,231,167,64,61,116,239,11,230,249,82,45,192,220,227,168,87,53,138,129,161,198,20,82,61,130,33,226,12,107,159,74,106,180,241,171,209,225,183,71,95,249,190,120,44,186,83,195,159,48,130,239,218,34,235,88,32,2,201,241,97,10,149,78,3,51,48,97,182,84,71,169,175,123,214,131,100,65,83,95,186,128,124,246,254,179,44,229,46,41,170,246,216,236,185,128,111,28,10,60,62,200,52,20,9,82,24,252,210,30,216,3,53,38,144,131,75,31,186,67,182,84,24,95,53,12,17,59,89,0,250,46,38,10,199,23,58,163,112,190,84,32,23,163,127,245,125,150,118,106,217,163,160,45,189,61,83,118,162,176,127,251,83,99,162,68,125,249,117,173,78,8,191,106,52,68,224,166,36,226,107,13,200,48,99,131,140,122,253,41,112,254,0,165,80,225,98,123,161,225,204,73,161,168,100,128,255,159,216,158,186,234,123,190,93,188,20,36,117,42,7,248,230,214,250,129,171,62,37,226,8,229,168,75,192,161,195,110,97,86,111,14,111,210,152,173,18,174,21,49,154,94,245,235,182,230,249,83,223,56,233,216,124,189,231,72,251,239,253,73,234,39,21,101,19,238,18,243,118,25,106,100,79,187,42,181,149,35,217,163,123,4,173,212,194,199,61,88,21,162,141,157,231,169,179,191,110,147,196,81,153,239,95,98,58,207,64,221,191,233,192,210,42,41,151,105,27,97,69,168,30,242,219,210,55,11,130,218,141,30,25,210,254,157,179,195,182,83,212,99,5,20,136,22,81,142,167,217,123,23,77,40,112,125,203,75,97,70,144,24,71,51,117,33,219,103,128,79,119,117,4,135,31,232,191,226,153,214,255,169,86,210,84,65,30,104,95,116,235,17,15,69,230,44,65,179,156,225,21,160,183,179,136,38,99,226,165,19,159,25,127,113,244,185,129,132,125,85,138,137,23,136,45,213,203,127,99,206,59,90,6,240,221,222,224,73,196,177,147,152,73,96,61,236,0,168,15,222,62,102,158,183,245,140,217,158,175,207,176,201,158,161,33,212,80,105,68,83,37,200,46,239,25,119,242,62,35,46,156,88,253,6,93,86,34,41,32,151,57,176,92,48,124,56,113,191,171,238,195,10,154,171,254,54,7,102,18,5,70,147,36,255,140,49,236,133,204,245,219,41,231,54,33,32,104,176,47,38,50,170,250,146,3,218,89,213,108,140,10,187,219,241,213,172,108,171,249,192,146,8,214,143,179,192,218,49,117,204,98,149,95,142,6,10,193,126,232,95,251,141,1,147,142,145,103,58,42,4,85,150,218,110,58,12,136,161,58,251,16,194,228,68,189,232,153,27,115,222,35,29,151,216,158,32,34,97,113,31,123,106,202,88,5,178,224,155,75,168,202,58,10,131,41,238,66,67,217,92,249,143,39,222,23,242,14,106,81,71,175,122,241,155,1,129,174,104,90,22,57,44,255,173,209,102,193,232,198,215,36,67,54,116,156,78,34,0,191,17,105,244,218,230,189,245,144,102,36,47,145,145,7,1,185,43,175,251,37,146,22,106,76,251,140,124,205,59,18,11,150,156,251,142,24,70,136,32,130,76,44,89,5,72,176,252,125,22,138,148,145,33,182,212,226,187,127,78,99,181,176,42,55,14,178,218,98,219,116,137,199,34,15,181,46,200,81,42,116,243,216,208,218,102,129,77,139,106,22,137,31,73,72,138,15,213,55,155,254,144,186,194,121,73,116,239,210,211,99,195,94,214,30,53,92,187,102,68,114,243,81,159,124,205,164,188,32,241,109,213,173,212,17,235,217,243,254,186,184,45,210,25,210,208,55,146,85,13,203,115,94,82,237,194,196,84,165,152,30,214,31,244,47,173,76,136,255,169,3,177,216,89,232,99,54,32,95,202,218,226,5,122,192,11,159,12,211,155,140,7,72,11,9,132,20,201,152,139,123,233,54,151,177,197,174,40,240,128,101,72,141,250,79,136,200,11,139,219,153,187,173,24,50,238,82,94,46,55,185,111,59,116,223,114,241,124,212,24,136,207,36,155,57,83,177,43,213,60,210,46,155,72,12,5,70,129,61,107,194,149,157,90,142,104,134,63,190,82,71,113,205,146,26,204,33,131,80,217,210,230,219,50,229,203,72,176,137,207,213,125,212,29,133,247,193,167,246,35,38,8,149,163,175,76,105,25,9,142,237,117,127,158,102,86,77,16,84,99,86,31,231,187,241,79,189,154,233,36,54,201,40,3,240,118,203,198,243,249,125,233,73,7,150,169,2,174,66,32,159,122,21,70,63,37,221,47,152,111,98,156,29,138,65,130,9,222,120,41,47,246,13,36,19,149,223,55,147,45,60,84,15,33,47,62,217,227,63,187,177,152,191,197,61,133,132,101,169,151,15,137,197,110,152,105,164,225,171,27,221,254,253,190,101,13,205,17,132,46,29,125,36,253,247,228,234,190,104,100,139,104,34,214,169,141,213,176,58,176,142,27,98,190,103,130,112,31,103,223,163,120,185,101,176,156,10,216,139,222,186,203,3,49,249,101,163,210,148,255,250,119,20,151,75,183,178,113,8,45,55,183,222,9,39,87,4,152,27,226,237,71,216,17,97,65,199,144,225,200,88,172,103,49,224,99,110,191,112,205,231,20,239,30,128,78,41,7,196,17,100,129,246,29,108,163,73,230,206,161,179,217,19,165,158,72,48,75,132,164,222,166,232,168,197,77,136,83,32,3,4,187,2,217,72,58,26,253,173,194,162,116,141,30,125,116,137,5,95,247,123,174,71,203,69,237,118,175,231,66,81,223,15,3,174,159,127,93,140,243,247,20,52,66,11,230,202,5,115,119,206,129,91,150,136,252,87,218,106,174,133,87,144,117,34,97,170,221,53,191,249,175,249,249,95,190,183,46,208,180,194,116,254,161,106,216,8,55,221,48,189,224,238,50,111,33,195,21,135,169,154,221,22,208,159,186,45,96,70,45,0,147,5,244,47,69,211,156,155,87,245,118,205,206,194,161,144,33,128,207,47,6,69,239,212,129,97,221,83,142,219,231,46,0,94,201,183,77,50,164,211,119,94,91,250,117,24,251,16,208,187,100,45,43,170,79,241,234,9,82,254,14,107,190,64,253,209,9,237,117,11,37,59,143,14,177,58,47,123,195,13,217,59,25,223,118,78,145,219,113,190,196,53,152,236,1,227,127,212,164,66,165,148,106,164,30,103,253,248,172,134,131,30,121,19,16,112,201,240,120,243,98,101,222,173,167,152,206,13,112,215,154,232,120,237,194,137,112,151,118,94,227,149,126,138,242,103,14,165,238,201,136,16,188,171,183,139,132,77,98,119,171,89,204,137,228,226,109,50,205,115,245,0,124,199,197,229,178,152,155,71,232,81,228,144,251,114,225,161,194,164,154,146,184,102,127,29,197,186,60,181,32,35,96,63,152,241,110,209,28,198,250,93,105,167,86,195,204,171,250,120,17,130,224,82,42,78,91,155,203,53,53,192,168,128,220,207,224,226,66,247,157,54,22,246,26,111,1,248,235,120,102,91,251,140,245,134,132,181,10,238,160,249,35,128,71,189,74,221,225,91,19,146,131,85,63,215,154,247,144,48,61,202,173,47,204,161,19,131,75,157,99,54,151,24,32,222,218,105,146,81,169,90,73,120,121,79,150,247,26,72,240,246,185,99,149,132,193,235,244,12,233,206,177,158,39,0,63,234,11,238,150,175,117,10,134,87,191,86,107,3,244,99,120,251,69,50,195,240,95,94,108,123,22,24,76,77,232,109,183,15,250,189,126,239,249,230,47,133,186,177,211,77,20,44,188,183,197,138,187,16,66,104,164,248,74,220,197,8,240,27,58,229,80,161,55,137,183,2,242,188,170,223,169,33,96,59,36,247,8,10,140,160,111,244,139,37,85,233,0,126,108,178,107,119,245,246,165,48,176,179,22,222,109,5,246,19,194,22,29,90,203,59,162,134,30,141,83,11,139,188,186,15,30,174,240,50,140,178,58,95,157,178,140,154,67,192,22,67,100,141,145,98,89,47,172,110,218,58,159,94,94,125,79,164,61,142,88,63,62,193,86,216,34,12,40,174,244,100,104,232,40,133,174,250,187,252,201,109,211,87,56,232,169,175,87,139,87,218,131,73,47,233,184,23,145,30,112,8,57,1,198,52,89,35,215,23,67,73,244,180,118,29,3,179,149,238,11,37,211,93,163,240,192,22,47,37,63,66,130,61,156,108,189,159,25,4,110,180,247,109,197,111,28,195,33,12,243,42,2,189,159,253,5,62,148,220,214,126,148,129,41,34,174,70,140,84,117,132,80,10,61,183,184,45,54,3,47,170,23,24,83,124,62,35,143,157,125,150,148,158,222,71,224,177,181,185,133,15,200,18,188,68,252,185,13,19,187,186,239,24,10,190,210,211,94,31,254,62,179,241,203,70,132,109,216,91,19,215,98,39,207,54,172,200,53,105,161,112,136,34,155,178,204,215,58,255,165,237,59,78,218,37,84,56,251,144,240,204,147,12,165,27,115,19,90,53,183,180,175,1,252,227,186,52,231,192,23,185,44,196,95,143,251,126,15,113,208,249,237,121,55,119,125,84,227,205,74,34,203,171,254,217,208,164,66,168,240,219,225,190,58,153,187,63,30,104,226,161,210,124,210,146,221,117,114,113,44,171,215,153,44,17,128,125,217,180,67,197,157,62,10,27,56,161,4,94,58,226,160,150,54,6,101,34,122,62,55,90,205,236,46,177,102,220,16,147,61,108,173,72,106,115,150,113,194,39,109,74,126,76,231,9,228,235,84,149,225,243,193,58,180,143,86,152,49,48,127,143,102,248,104,220,219,252,71,17,73,92,10,205,112,136,178,128,163,118,125,165,156,64,48,94,87,199,116,28,1,203,159,74,52,213,86,75,41,173,161,24,42,227,8,0,246,231,98,86,37,82,199,101,243,92,164,25,205,224,203,13,113,124,57,245,73,36,69,45,163,52,102,117,131,246,202,95,83,157,169,212,107,172,130,171,51,207,213,152,225,64,124,246,5,143,19,213,60,42,209,175,232,168,200,122,132,132,161,41,99,112,172,161,5,149,148,105,6,135,233,126,104,200,242,220,214,97,205,23,144,93,233,175,107,183,232,124,129,122,64,186,245,155,53,214,103,137,45,132,171,71,165,19,200,95,112,203,138,219,12,219,199,199,218,202,38,173,21,64,62,94,24,84,57,143,102,72,154,180,209,167,56,134,18,120,34,101,238,155,208,208,246,254,227,143,205,208,186,81,11,240,247,227,190,61,65,73,86,195,241,15,93,147,129,127,128,248,56,179,220,115,102,50,162,78,14,103,255,244,88,202,60,156,248,131,254,250,42,230,206,85,63,219,133,88,126,48,156,120,221,245,242,93,61,241,213,243,189,152,0,180,32,88,195,101,80,164,46,241,48,142,230,69,59,161,79,62,130,102,227,225,250,116,125,30,127,120,3,170,198,197,13,5,94,46,169,219,138,122,227,222,112,62,33,36,229,156,52,64,90,207,94,157,52,145,205,175,215,198,174,71,250,131,17,85,196,248,167,239,195,96,147,115,201,155,61,76,11,153,46,114,163,10,62,168,186,205,155,126,242,227,216,230,93,222,37,234,143,247,247,73,217,165,1,188,52,234,161,236,72,224,28,6,114,171,181,37,93,222,249,173,170,141,13,249,187,27,32,32,254,68,184,194,108,74,191,87,173,168,60,247,206,22,197,246,144,90,246,242,104,158,103,133,124,89,209,142,121,41,133,5,203,204,46,195,227,116,58,141,177,43,23,25,125,105,40,126,174,202,68,75,151,2,70,7,221,199,253,219,135,39,216,34,226,249,98,75,156,95,109,32,37,227,192,55,117,121,172,206,175,181,182,251,227,89,199,81,34,106,15,186,131,116,177,100,31,3,242,139,93,80,202,212,117,220,124,80,62,43,44,120,181,168,224,142,255,63,29,54,7,175,83,215,251,216,208,106,49,121,169,18,77,207,248,30,227,162,51,106,36,152,6,250,165,185,177,177,216,233,220,168,116,174,40,183,189,108,204,138,170,136,80,159,77,169,99,221,103,127,170,213,134,56,116,156,11,41,31,121,44,29,181,182,39,11,135,113,167,37,176,255,131,167,39,147,27,223,202,105,58,111,28,79,24,202,15,127,12,156,58,51,124,10,191,167,129,250,201,178,242,21,3,22,42,234,25,250,243,35,36,149,249,140,92,200,227,45,90,45,4,158,156,37,237,29,240,124,6,110,197,116,99,11,5,118,11,121,141,215,96,105,111,174,120,214,207,162,91,139,2,91,62,29,92,163,228,15,95,121,146,151,219,52,210,136,161,82,255,242,160,194,109,198,255,44,63,146,131,229,56,6,7,237,254,168,94,36,108,32,83,33,94,31,209,44,103,137,5,175,23,217,10,182,229,245,87,110,145,113,180,19,113,97,96,7,196,201,27,187,121,246,49,54,42,179,139,133,113,200,159,246,191,39,234,23,114,170,252,143,64,9,130,83,127,81,61,217,170,123,95,130,230,235,13,252,135,81,15,204,137,48,43,144,225,12,205,221,38,155,68,181,133,111,161,154,103,24,136,38,122,218,12,91,212,4,250,106,65,29,76,11,193,128,37,59,167,2,176,214,148,213,6,160,121,182,159,73,87,247,3,137,15,171,165,167,94,109,238,75,5,142,52,95,221,135,190,73,118,202,204,44,216,22,242,188,159,176,78,224,89,183,85,198,7,186,222,254,130,171,168,201,186,33,132,87,13,85,125,173,27,255,40,151,99,231,153,56,244,19,63,144,63,94,235,246,238,250,58,251,133,106,45,203,194,128,126,54,128,112,182,21,179,10,94,255,233,59,113,97,2,228,151,207,129,237,142,8,115,242,227,217,149,189,239,207,223,32,201,218,236,145,189,31,105,123,109,138,84,132,203,56,66,25,248,35,139,153,65,173,55,215,186,239,78,40,82,136,4,224,123,201,107,235,231,99,31,179,226,91,196,25,249,155,153,1,125,69,82,191,17,238,91,250,202,216,142,179,146,159,19,208,39,172,221,227,171,97,55,134,245,68,184,186,254,73,6,244,188,81,87,42,83,99,196,176,158,133,10,38,12,192,147,247,102,212,147,136,198,231,141,238,73,246,141,139,81,152,206,5,146,182,221,112,34,177,92,206,143,47,151,186,43,129,250,109,16,26,94,198,107,127,172,59,205,164,21,98,10,228,219,43,229,10,231,148,57,221,133,48,155,237,186,219,4,30,54,233,14,19,109,235,6,214,17,131,1,217,161,243,65,39,201,81,179,126,86,13,102,219,99,153,160,248,52,27,64,63,158,246,57,58,235,89,218,53,63,149,51,18,51,133,67,110,146,154,106,55,148,251,215,112,247,201,210,169,3,248,157,47,31,58,249,73,98,153,39,51,249,209,110,80,32,50,12,28,169,239,250,245,215,145,172,113,216,90,208,187,199,200,48,154,170,24,145,219,175,183,180,55,178,151,200,55,25,17,0,159,232,152,11,104,17,62,221,219,243,95,117,20,189,194,231,238,53,209,233,26,232,81,113,130,191,148,60,78,224,140,60,227,169,160,220,132,213,132,89,109,72,40,160,223,86,217,175,117,11,177,144,147,29,137,199,61,244,182,3,206,243,227,217,248,44,158,237,60,119,113,97,35,219,14,215,27,42,64,204,111,111,168,121,242,203,204,102,155,235,30,160,151,212,89,186,233,106,223,144,235,69,132,139,140,69,1,120,30,81,249,167,48,123,231,220,167,238,60,46,69,15,240,223,225,244,182,43,75,102,73,98,179,224,11,143,21,64,111,169,87,87,166,102,243,213,179,184,157,91,255,76,191,250,63,197,104,119,180,158,135,181,137,106,156,26,100,232,234,255,16,127,222,215,101,23,45,89,111,57,205,48,165,94,125,159,182,21,207,107,14,50,167,171,166,204,120,114,245,127,175,14,165,113,203,73,210,109,5,212,227,169,240,59,200,158,38,213,233,7,51,255,168,157,76,104,57,24,63,151,193,132,89,239,174,44,124,226,78,95,61,125,174,197,159,227,3,224,53,155,98,234,30,227,204,93,84,73,131,141,65,53,166,135,11,126,93,118,131,227,92,97,230,121,181,243,192,231,171,251,136,182,80,108,178,19,82,111,196,67,230,48,240,234,255,247,187,239,89,66,83,64,166,21,89,133,54,5,128,255,59,20,66,153,184,230,200,126,238,193,30,175,67,129,247,25,88,198,137,248,7,72,208,8,39,193,182,83,192,62,244,177,189,136,61,66,242,29,77,215,9,10,59,188,0,25,229,91,127,134,138,101,194,14,152,140,98,43,230,234,190,119,229,55,76,31,45,25,203,150,76,207,207,134,132,41,226,150,222,243,40,55,125,34,127,241,56,111,202,9,195,21,77,109,151,102,28,63,109,29,60,200,18,156,250,28,240,239,52,73,200,188,96,143,234,81,192,25,91,250,115,4,108,150,68,214,44,24,178,248,188,22,18,216,219,246,13,5,30,213,160,238,142,164,232,8,188,13,233,84,209,145,35,240,16,25,78,174,70,58,76,33,234,50,141,221,109,240,112,200,45,82,105,217,254,106,255,114,206,202,15,10,1,100,220,144,163,125,231,99,119,22,196,175,182,250,242,204,58,11,110,200,233,107,151,90,87,22,199,204,147,188,225,176,119,53,192,249,38,190,143,163,155,158,109,139,87,228,109,90,235,227,160,182,187,4,132,123,61,23,161,85,223,68,153,147,243,234,255,240,107,67,204,177,11,121,14,89,57,233,169,169,4,158,29,94,229,95,72,109,214,230,247,149,10,232,230,9,12,172,151,188,123,92,85,168,83,53,95,218,255,139,40,96,63,123,202,132,42,222,91,156,66,116,228,187,148,39,33,152,78,50,114,220,132,91,139,47,87,50,193,142,138,213,4,9,99,234,222,168,226,85,54,206,245,153,122,239,192,105,15,39,187,57,186,220,133,154,184,254,176,206,115,127,82,178,18,191,250,182,152,86,176,129,35,111,110,231,89,103,19,87,38,14,186,188,55,237,118,71,98,147,225,193,147,15,135,67,223,48,176,129,240,144,244,218,164,138,187,150,231,186,125,113,178,72,88,122,247,238,14,127,78,9,139,97,14,73,220,71,127,60,148,135,91,83,178,163,220,159,165,224,248,247,13,85,62,110,136,229,250,72,177,179,158,147,174,200,136,7,165,204,85,255,14,53,48,62,116,167,19,233,157,52,193,154,23,116,117,127,216,22,234,209,70,118,241,114,177,204,149,10,13,172,231,109,92,229,154,130,25,254,154,113,185,125,94,120,213,175,186,54,185,90,249,220,196,188,225,245,88,18,35,156,127,161,183,252,32,11,234,48,39,234,102,85,191,157,116,197,47,100,83,247,120,3,4,50,166,244,100,234,98,184,33,182,126,46,66,112,241,23,77,109,99,246,155,252,228,0,255,237,175,78,72,39,253,63,146,174,60,30,170,239,127,143,107,134,177,147,45,164,44,99,223,98,62,136,22,102,174,93,150,185,147,45,33,251,190,39,41,66,138,177,134,178,39,187,236,91,150,100,75,246,61,9,33,166,44,217,215,66,246,223,248,254,230,191,251,186,119,102,206,57,247,220,247,243,60,231,188,223,207,189,16,80,228,147,105,240,144,116,255,201,34,226,179,10,213,21,123,159,205,4,187,197,77,203,192,153,118,21,165,218,138,148,217,141,118,149,28,250,238,97,9,41,154,22,59,211,134,38,179,105,106,78,255,246,238,227,8,228,94,151,79,221,184,163,158,28,78,196,180,81,125,38,225,179,179,75,171,212,91,154,115,60,142,155,244,57,175,183,242,111,21,43,248,223,113,84,64,8,86,252,20,114,191,181,128,176,168,216,17,125,65,111,49,138,71,134,252,26,30,25,117,117,102,248,73,225,250,254,222,231,153,97,235,226,208,193,7,62,35,133,165,76,23,14,38,118,49,189,100,37,19,35,183,86,179,223,91,244,254,20,127,235,5,34,149,244,249,240,246,161,146,111,233,27,1,165,42,12,232,64,183,181,197,239,46,164,247,86,239,53,153,166,3,129,151,34,204,223,135,226,144,232,124,25,182,49,222,132,183,131,10,174,86,68,135,11,223,3,18,191,171,108,183,189,88,195,137,251,139,235,65,187,83,117,194,55,50,91,76,40,175,15,116,229,26,190,139,247,17,25,199,10,158,234,204,81,158,145,244,38,34,193,48,26,168,19,73,208,219,171,206,171,134,0,161,208,112,3,239,10,107,186,164,106,250,53,178,28,8,112,142,48,110,54,238,73,218,194,62,70,42,51,33,65,192,96,193,214,238,118,234,195,135,209,96,191,26,31,2,167,69,65,107,239,186,217,193,92,160,254,93,92,82,189,0,218,186,214,127,51,172,102,227,170,218,227,44,186,7,48,10,244,109,100,230,155,172,36,157,169,14,62,101,173,89,187,169,129,85,247,221,233,145,171,219,192,52,53,19,42,190,115,16,132,75,199,86,57,244,94,245,103,129,78,167,220,179,135,176,180,177,243,191,40,173,243,183,109,118,2,50,61,144,153,24,81,109,107,251,72,41,52,7,159,118,237,79,179,244,80,188,240,113,176,182,152,123,100,41,147,127,150,13,255,63,85,8,96,47,75,168,53,78,102,188,143,41,3,115,78,159,99,122,45,74,146,187,70,198,30,96,26,149,37,231,235,76,113,17,60,37,134,138,210,131,73,42,100,191,247,24,69,130,72,237,71,185,78,70,81,179,125,10,228,47,190,41,89,10,193,13,158,165,89,224,237,181,7,46,205,91,61,224,152,194,150,144,187,248,178,163,19,178,249,78,160,195,119,7,84,152,162,171,226,10,127,230,136,27,33,229,23,230,243,246,75,101,214,172,250,111,62,90,168,78,52,225,252,92,76,153,92,7,86,56,186,148,138,108,108,100,60,161,212,148,14,117,165,192,59,228,91,170,59,59,187,74,49,51,12,35,165,214,202,241,64,221,151,92,57,203,154,24,149,117,198,157,152,171,154,248,207,162,66,66,239,85,230,74,168,126,244,54,240,10,92,5,11,114,195,185,45,138,98,122,6,131,143,239,204,81,190,128,224,18,154,28,230,232,4,143,118,27,15,4,156,63,22,2,26,126,79,5,227,120,201,238,63,207,247,198,116,60,225,139,178,207,217,201,62,19,57,202,99,56,22,121,98,19,135,134,191,11,54,189,21,17,36,220,148,137,37,75,213,2,249,162,200,231,94,121,169,157,164,100,49,240,44,86,204,156,205,32,16,71,42,234,61,37,65,66,119,63,136,61,124,166,73,68,52,205,151,84,69,40,137,175,209,198,181,217,52,151,242,195,221,79,244,74,101,228,204,200,158,226,195,221,120,47,66,194,87,250,55,174,60,12,90,245,189,46,227,106,83,8,135,218,127,34,27,54,60,167,192,230,226,97,158,183,246,131,88,20,6,187,243,133,61,41,123,75,63,29,185,86,250,123,8,17,248,200,176,210,69,158,182,182,57,231,105,141,97,215,57,31,222,219,22,182,136,127,151,2,20,220,141,73,132,80,29,154,97,61,145,47,106,78,127,7,37,223,129,245,241,19,94,80,113,73,58,61,149,21,94,50,118,155,21,123,79,20,96,226,108,155,166,183,179,159,40,123,101,247,109,188,157,244,252,62,123,49,241,106,218,24,57,18,251,147,26,25,73,194,71,150,166,217,66,158,31,29,202,207,147,248,44,79,207,243,17,26,230,43,99,152,108,139,183,12,86,252,253,177,40,186,182,189,214,119,161,82,217,41,78,99,207,127,111,16,5,210,31,143,152,233,6,142,52,218,186,42,189,50,232,129,144,252,85,107,47,54,185,146,244,205,224,15,7,86,149,32,224,102,72,160,173,158,254,232,27,109,9,129,200,5,178,243,253,179,230,164,117,104,220,219,121,2,177,52,202,13,46,193,101,127,220,28,226,75,100,142,183,171,71,104,217,158,251,59,28,121,133,204,41,109,198,92,248,87,248,6,6,1,7,150,238,174,234,121,3,78,92,120,127,193,216,36,82,123,1,157,36,86,66,129,100,215,73,222,200,155,26,52,106,179,67,233,222,179,116,91,106,30,1,248,5,30,70,44,160,103,167,87,236,37,223,63,156,89,248,233,101,190,40,63,124,220,123,164,84,198,144,99,236,153,41,218,118,230,60,126,146,244,168,0,16,148,214,164,16,94,153,68,194,215,233,161,175,241,73,234,167,69,70,143,227,11,121,183,160,246,127,200,142,13,233,190,233,46,253,154,224,249,165,5,8,181,13,12,141,59,39,37,55,26,13,148,139,242,77,99,151,78,168,154,81,34,230,166,255,73,234,18,14,77,141,206,227,231,139,113,28,185,126,117,67,209,27,243,194,219,164,251,235,111,84,234,33,55,55,184,0,91,161,44,252,119,190,126,96,94,126,213,208,199,166,61,207,245,221,99,171,243,252,138,17,49,175,218,71,16,1,130,97,49,174,51,8,145,3,125,176,173,58,104,225,99,206,15,142,218,43,88,192,194,107,68,66,134,93,0,150,35,94,42,239,100,74,58,222,55,44,245,50,204,228,228,105,254,252,231,230,185,63,9,208,21,246,103,79,207,217,58,238,139,82,208,1,132,138,3,135,198,201,31,196,228,207,174,254,48,23,27,144,17,62,14,231,28,125,13,155,117,16,216,254,43,88,20,70,186,158,70,39,140,117,82,93,35,1,147,2,19,101,153,41,12,9,79,246,240,55,113,76,253,243,160,195,153,187,16,42,64,197,175,145,123,139,25,187,174,125,88,148,189,141,38,241,175,117,35,223,135,99,202,119,64,173,11,59,28,103,216,165,24,205,12,197,169,91,157,154,34,26,251,1,1,85,36,126,24,215,28,38,43,203,151,218,212,102,160,85,16,1,241,93,137,122,118,45,7,206,183,62,190,230,75,215,104,50,131,96,70,160,165,73,248,187,51,56,252,230,89,122,3,22,69,165,190,245,139,93,175,124,54,115,70,56,29,37,66,106,207,231,27,73,222,84,172,69,179,133,39,146,62,199,67,136,205,163,41,79,143,68,90,170,151,29,209,37,79,93,177,40,19,154,248,108,33,61,86,191,164,162,47,25,249,62,36,124,101,10,235,65,247,21,36,60,171,47,95,54,122,196,79,120,166,25,179,99,102,200,33,99,102,62,31,232,169,126,62,30,227,93,52,153,141,249,185,5,244,250,174,227,231,249,165,141,227,210,73,200,209,218,167,30,51,140,90,36,62,22,19,147,41,20,86,228,57,99,55,115,39,64,72,6,249,172,208,101,218,109,15,181,177,219,199,163,229,202,13,1,103,188,129,174,122,223,109,227,92,159,19,96,76,188,68,114,246,69,166,132,182,187,158,131,211,155,93,23,24,97,56,96,124,33,48,65,221,52,88,109,113,146,6,77,33,7,58,80,208,42,149,77,78,255,92,188,114,26,119,98,70,228,239,78,254,213,227,235,125,243,241,251,61,218,10,21,38,101,126,248,234,161,233,123,201,218,55,93,54,205,167,35,22,11,229,203,99,61,151,143,221,36,118,22,229,141,85,191,111,9,151,82,142,174,156,174,20,181,51,10,168,129,58,121,131,174,88,100,48,85,132,77,129,62,135,162,153,57,161,208,116,28,231,32,24,191,244,106,103,225,226,189,207,166,100,43,7,212,36,126,130,12,11,119,142,9,226,114,205,59,16,190,36,132,17,231,135,162,37,55,205,195,255,115,52,191,37,67,193,46,3,151,229,50,197,52,148,40,219,35,218,23,7,24,125,248,225,68,223,57,247,255,216,240,140,118,13,70,94,128,176,76,119,91,79,178,142,127,192,175,145,179,191,44,65,3,150,231,124,69,61,201,32,49,145,234,205,205,147,59,223,72,252,126,185,149,126,92,211,85,135,136,167,220,87,172,189,37,227,240,175,167,241,246,3,227,185,159,210,158,223,122,81,119,100,224,66,236,104,244,208,7,101,230,226,107,177,108,129,105,231,245,107,115,53,87,199,82,119,117,15,112,73,69,111,113,14,226,241,173,117,119,233,182,120,127,142,3,187,204,121,36,189,44,38,189,153,220,164,116,142,199,194,47,70,248,8,228,125,247,41,107,42,255,87,15,237,241,133,7,143,140,205,146,243,245,85,215,164,195,238,119,214,135,40,64,112,124,31,71,122,248,77,68,66,142,48,143,161,40,1,44,208,222,106,124,178,206,103,246,145,62,181,44,205,231,16,132,115,197,236,240,28,104,162,127,155,28,217,239,211,189,196,47,193,71,211,202,59,46,115,147,195,164,190,187,163,235,102,6,36,125,236,148,20,202,121,69,50,46,221,217,215,170,2,53,180,70,79,203,155,103,249,187,148,231,127,158,69,210,227,29,94,240,138,72,245,189,176,167,147,11,238,61,46,43,227,239,127,196,132,31,165,55,232,56,184,201,206,68,195,246,3,95,16,138,209,20,115,85,167,161,1,234,239,76,124,138,196,23,164,90,82,138,68,174,105,209,41,93,250,42,20,207,4,2,115,57,134,91,81,101,202,177,244,216,198,130,203,36,60,118,44,30,115,163,187,214,31,241,160,122,179,34,67,11,90,186,201,40,52,89,240,121,229,150,54,38,243,238,74,11,190,224,3,175,38,141,24,216,69,189,68,121,41,55,189,23,167,143,91,248,251,182,244,29,219,163,26,73,193,16,174,72,52,188,112,206,74,45,34,142,7,247,201,46,252,173,122,4,4,87,56,72,209,125,127,47,190,84,160,192,165,68,244,27,4,103,141,72,209,67,115,9,149,223,73,124,116,199,230,24,239,32,61,154,230,142,104,240,39,31,172,103,162,246,204,32,225,91,101,184,76,50,18,27,180,239,113,220,95,103,129,134,219,243,61,252,17,169,179,35,36,3,3,100,16,100,32,48,1,250,220,139,130,125,139,122,211,25,209,242,33,16,130,251,77,114,165,51,137,27,8,37,48,113,176,242,121,158,227,221,176,57,51,204,187,183,90,58,239,86,154,3,4,191,121,228,104,134,55,216,80,126,161,200,91,31,169,8,1,187,226,58,241,115,237,148,65,46,52,197,86,219,9,36,188,78,205,202,96,146,78,24,102,201,181,11,186,121,29,90,186,174,207,87,200,83,156,207,247,99,190,8,46,48,134,117,202,223,105,88,172,96,166,62,234,62,229,25,148,9,228,21,213,10,185,59,144,77,220,141,122,211,195,250,215,150,25,252,55,214,75,187,123,205,231,79,60,82,197,170,243,7,27,223,74,97,86,222,187,245,149,11,236,58,159,158,15,101,125,33,34,76,150,7,102,162,86,33,211,140,9,151,32,205,32,60,240,167,199,73,106,230,55,173,191,254,215,235,196,13,73,76,47,229,90,163,30,84,92,201,103,89,59,135,131,53,128,237,51,227,1,142,125,197,23,42,242,168,97,46,38,58,96,1,121,141,211,137,98,110,238,40,86,94,201,187,92,145,212,127,135,82,227,216,160,206,239,210,186,14,35,13,175,241,128,251,135,92,201,39,63,184,219,92,222,124,167,128,229,99,73,207,171,208,192,50,81,93,183,250,18,190,49,49,15,132,79,253,99,91,222,160,139,23,108,153,113,119,118,150,28,160,84,77,234,141,174,25,249,81,244,114,41,183,152,236,26,8,24,241,185,85,80,83,233,147,197,238,108,158,73,254,134,80,238,79,46,154,254,119,234,166,64,147,235,227,100,86,6,106,112,142,30,151,183,124,176,138,33,15,195,146,245,54,161,81,83,148,22,250,161,106,255,206,124,92,200,221,46,188,58,207,175,25,171,244,48,244,17,12,191,108,250,36,155,85,6,142,160,193,203,55,148,41,127,63,148,159,104,94,73,230,135,63,89,54,170,147,252,144,27,250,189,70,96,237,227,171,243,252,231,198,53,166,160,141,119,113,2,249,52,173,217,36,253,18,56,88,42,41,107,154,59,131,156,171,227,248,65,138,167,161,91,173,5,234,39,34,151,217,147,43,57,61,113,112,154,35,25,116,107,45,140,241,95,124,211,170,146,48,22,213,163,187,22,151,255,54,9,182,43,108,23,83,228,112,190,254,54,245,231,170,33,249,239,123,142,76,175,180,156,65,0,115,235,13,58,81,133,3,253,251,147,184,107,213,60,8,212,77,58,151,191,66,146,113,35,190,8,194,106,153,113,43,240,146,49,135,39,181,9,124,23,158,237,236,86,21,65,72,174,53,225,185,123,175,63,220,160,154,60,243,249,34,3,1,71,89,110,29,234,193,43,98,22,73,91,130,35,141,160,198,37,31,201,0,145,230,198,153,32,253,160,124,213,215,231,254,47,236,61,235,111,185,78,12,79,141,159,203,146,243,195,189,3,172,223,123,177,231,4,132,126,242,115,17,139,61,207,231,109,233,137,59,120,148,60,179,250,224,119,115,6,206,229,122,255,137,223,188,185,160,214,119,50,178,66,86,125,18,222,70,176,79,224,107,36,147,221,71,98,69,111,159,175,95,99,25,122,104,168,241,235,205,241,246,87,152,245,134,16,171,123,70,229,87,107,159,27,124,213,211,166,156,192,98,81,28,67,201,85,215,146,78,137,105,17,204,133,188,201,164,248,166,169,215,227,249,164,237,93,66,139,83,204,158,211,16,85,176,38,151,255,21,73,22,42,23,229,251,142,106,231,126,17,154,58,61,225,203,232,27,79,251,78,154,68,228,177,26,149,154,125,127,211,117,77,252,221,204,251,252,2,155,206,253,108,6,146,214,223,68,38,152,23,153,21,54,25,241,195,231,246,198,72,250,221,175,56,165,151,33,104,92,12,226,179,117,109,248,230,244,168,217,231,193,186,234,84,104,223,16,98,202,233,238,170,140,92,233,214,172,150,159,155,178,51,132,218,133,194,198,61,69,251,201,246,66,28,150,86,12,64,62,233,228,195,101,154,106,251,6,237,229,211,198,125,82,60,143,35,233,113,214,220,94,202,111,175,124,234,203,27,113,112,117,1,19,213,174,70,88,129,207,212,84,41,156,128,3,52,249,13,192,190,143,202,131,46,113,186,100,110,108,160,176,13,237,181,215,19,129,173,41,151,185,94,126,162,46,145,129,75,113,168,42,145,206,107,183,42,240,86,29,169,67,124,11,174,142,95,28,112,237,7,199,45,141,56,59,225,33,4,113,111,92,218,171,110,165,2,239,120,247,81,8,133,12,92,130,75,15,236,171,13,194,232,218,82,37,94,249,142,69,33,62,175,157,229,39,174,184,10,100,10,81,223,61,56,159,47,177,89,242,73,126,135,142,58,154,99,19,190,88,84,7,101,209,182,144,17,44,115,47,111,143,149,227,194,16,226,201,193,226,174,71,82,182,181,247,79,71,143,89,99,28,28,65,38,34,210,211,8,19,182,33,62,167,76,238,192,193,201,119,69,185,219,154,97,23,151,200,54,142,13,202,160,246,149,127,221,243,150,84,113,170,70,121,51,82,13,166,36,62,26,215,153,224,67,53,146,174,56,114,251,162,34,22,66,137,89,117,119,9,252,59,221,180,18,230,224,227,64,224,224,87,16,66,220,125,205,176,2,219,164,244,162,15,155,16,224,67,243,212,205,54,150,138,137,23,30,129,44,225,129,0,5,76,139,171,145,3,123,124,31,143,237,231,123,182,232,2,109,217,192,225,38,54,37,180,140,170,176,212,191,84,144,32,156,163,180,190,239,95,104,159,197,217,123,168,187,134,141,101,92,59,150,252,145,183,225,184,65,151,249,76,205,1,252,252,35,12,231,23,252,175,236,150,172,191,210,176,224,27,82,188,244,84,173,139,128,241,170,228,223,111,12,98,146,195,106,188,161,234,59,20,191,76,123,163,220,252,159,183,195,39,52,138,223,47,109,130,126,154,152,103,186,249,181,12,32,35,241,221,174,215,219,133,230,105,225,149,103,166,102,133,169,164,249,124,102,180,41,254,159,196,4,90,10,127,236,124,31,139,226,142,249,184,45,146,81,101,1,91,240,91,247,101,32,246,68,59,210,232,173,161,77,253,126,204,87,247,217,180,146,244,51,83,77,184,192,197,222,164,253,253,117,247,12,150,255,213,243,76,244,253,30,146,179,56,122,85,195,49,139,214,8,13,127,244,159,52,215,73,119,163,138,102,191,250,181,243,122,158,152,22,118,243,119,92,5,104,67,69,247,84,168,125,139,162,99,76,51,173,72,99,81,71,228,86,158,7,63,124,147,244,60,123,212,106,33,10,68,114,3,170,157,49,81,228,37,244,177,218,129,110,140,206,25,71,167,146,119,72,207,139,73,211,132,103,116,164,108,240,146,248,29,131,200,115,254,208,50,193,59,249,248,202,105,82,249,217,141,239,124,194,57,84,87,96,45,220,114,155,64,80,6,108,203,131,24,78,62,108,207,254,22,9,135,1,30,135,221,109,122,16,129,254,75,176,202,229,39,179,172,43,176,156,71,142,107,32,35,221,90,243,147,223,230,45,206,58,216,26,81,138,87,16,92,246,115,138,69,66,211,42,206,198,211,26,134,166,0,53,96,91,113,15,117,197,110,41,220,97,212,253,24,94,133,69,134,100,85,143,62,169,59,125,95,79,65,163,234,160,136,41,34,197,239,63,127,76,23,25,235,110,231,244,96,154,192,88,155,254,15,229,53,236,68,121,76,97,43,219,17,3,126,41,154,23,68,184,218,59,50,108,233,93,101,249,58,70,68,244,88,63,80,139,114,255,227,175,173,210,34,72,75,194,67,142,54,203,116,131,63,45,249,251,126,12,167,141,0,132,76,253,85,180,104,247,105,219,150,201,214,79,140,30,70,194,183,1,5,109,131,220,128,229,199,139,182,14,187,161,96,187,214,174,172,73,54,220,193,207,189,230,84,226,237,8,62,54,182,147,120,107,92,235,80,172,142,249,30,207,32,55,31,117,201,47,10,42,41,140,45,221,19,179,123,25,34,94,131,58,100,140,84,62,82,66,84,145,66,239,184,191,208,171,129,95,196,215,118,21,126,63,29,119,162,148,164,253,241,121,22,119,149,102,141,92,155,75,103,132,243,146,18,151,133,178,27,228,64,87,99,234,91,89,253,77,150,222,33,81,234,123,48,196,104,33,222,89,39,148,238,53,102,138,187,125,100,43,13,194,125,170,191,33,131,211,88,2,250,14,220,226,79,199,49,90,88,113,157,175,135,31,75,201,95,79,115,183,188,252,1,34,37,125,138,155,28,62,142,38,192,69,2,87,165,104,241,132,52,94,1,33,119,114,74,154,114,155,197,121,138,7,88,192,232,182,214,60,135,177,209,167,35,161,154,179,68,60,158,64,176,228,21,26,208,150,160,227,209,40,58,100,247,1,151,68,66,186,238,61,60,14,60,225,241,225,160,186,23,131,103,28,235,61,156,250,246,228,36,220,217,97,43,236,174,190,244,138,117,155,162,221,98,149,220,117,99,55,45,132,85,39,175,168,54,191,64,234,196,65,231,217,139,177,23,124,21,56,60,97,1,99,191,26,97,171,206,48,200,176,152,239,132,33,226,200,251,59,58,45,114,227,103,56,61,183,88,224,24,60,99,197,202,183,13,139,166,244,24,152,60,56,179,45,11,182,15,222,17,72,209,40,99,169,245,185,180,238,184,253,17,187,37,183,166,112,98,108,221,82,83,66,115,85,224,249,8,212,207,243,233,90,224,159,136,94,117,116,17,249,167,0,63,8,200,168,69,158,61,13,146,216,44,189,101,100,186,212,139,7,138,11,123,228,154,187,99,231,252,169,254,54,125,237,199,3,98,133,249,114,77,131,153,118,95,244,231,201,166,82,240,128,196,199,21,108,163,207,189,144,48,69,191,208,147,117,60,80,254,161,67,238,153,246,18,42,238,70,210,7,211,61,16,48,80,117,29,211,37,239,160,103,226,121,238,192,164,133,7,242,146,115,101,148,89,6,166,6,139,107,30,63,173,129,8,228,140,57,197,107,35,140,234,10,100,89,200,230,1,72,3,17,43,57,41,218,206,208,166,153,226,203,74,252,4,197,242,144,139,73,12,75,50,215,165,80,68,118,106,173,225,42,164,92,125,211,232,227,244,12,19,47,199,47,12,122,64,112,239,133,199,209,184,127,143,86,126,235,25,112,192,238,64,240,192,7,215,117,209,117,235,56,12,218,182,151,163,15,36,92,249,82,180,232,46,167,115,253,165,84,65,158,9,51,190,59,217,18,84,47,157,237,164,46,191,14,86,254,209,226,135,159,253,180,58,242,48,136,148,103,43,221,31,156,172,227,23,126,230,248,154,195,233,162,14,202,221,176,50,181,238,31,94,67,123,183,69,140,254,138,31,192,147,36,107,250,228,62,86,35,117,121,196,108,19,153,122,206,249,59,40,197,176,168,182,237,136,202,139,22,102,59,230,7,27,46,237,167,164,120,113,97,40,73,150,25,158,63,91,53,197,239,179,70,20,72,184,155,54,29,93,120,245,225,195,231,85,37,47,69,137,2,92,230,171,102,49,152,141,36,150,7,240,103,87,18,135,16,206,251,166,219,87,229,178,20,3,57,232,180,27,185,207,247,191,91,151,182,39,47,60,46,22,227,151,170,121,139,35,0,210,47,183,196,206,134,60,92,46,223,239,146,92,254,31,190,117,225,146,222,140,215,59,156,84,101,191,36,225,167,86,98,101,178,250,191,245,132,131,140,248,10,49,108,251,241,133,214,37,178,32,202,147,236,59,177,249,185,92,144,48,28,90,127,231,170,159,230,243,99,43,254,111,132,26,41,222,133,28,102,94,84,175,42,10,83,116,76,54,236,226,135,7,28,238,5,136,95,99,9,157,213,48,83,219,85,135,218,15,47,212,173,84,70,120,46,110,37,118,172,172,58,146,244,141,166,214,154,89,98,143,156,168,185,105,177,108,193,12,66,154,65,79,187,167,54,136,119,166,42,87,229,220,47,44,58,34,122,66,250,242,212,59,183,213,31,219,70,3,51,84,33,84,77,143,2,110,30,85,201,122,191,80,201,47,198,162,6,34,98,91,132,194,8,169,196,196,194,60,106,39,18,158,209,128,152,174,42,101,255,167,61,175,123,198,224,36,188,215,122,17,46,27,103,206,115,183,229,233,246,193,35,136,143,189,191,245,70,202,252,59,229,51,190,81,98,221,33,105,60,169,212,123,44,139,31,237,121,175,148,6,78,133,97,129,213,253,201,202,171,134,236,73,195,10,14,122,191,2,112,194,192,240,75,143,168,183,140,158,37,151,121,24,222,221,135,218,79,105,219,126,72,23,49,107,6,255,126,238,31,184,50,131,80,18,48,2,187,62,4,245,211,96,48,176,100,230,115,255,30,83,41,15,195,54,103,199,126,17,122,222,194,25,132,14,151,158,102,71,53,236,83,48,217,29,234,123,122,88,212,175,248,157,95,249,137,207,179,41,56,13,18,78,94,200,192,213,133,236,213,235,154,97,63,179,191,100,200,176,50,157,223,159,150,89,156,198,199,205,193,253,209,27,53,83,88,84,10,77,252,91,249,43,190,18,196,139,25,94,196,93,162,192,242,11,41,67,48,255,167,202,158,158,162,164,134,16,169,255,186,241,21,41,234,201,145,65,147,197,91,100,191,248,225,139,135,218,171,46,172,245,127,58,27,133,21,231,239,65,237,63,15,63,253,116,124,91,90,100,27,236,79,151,189,130,70,209,220,32,179,142,10,76,5,157,223,75,122,95,76,38,253,63,179,183,94,91,153,178,170,85,104,32,92,22,192,10,247,105,94,146,20,51,55,19,151,52,92,197,249,237,13,45,103,107,26,203,136,105,76,61,54,214,29,132,180,48,50,112,174,19,25,222,161,15,65,78,51,213,37,124,245,241,51,34,207,122,154,141,83,120,103,127,238,238,192,241,29,186,16,42,235,179,218,184,181,92,176,30,89,6,163,159,218,26,9,239,143,59,231,53,93,254,197,63,19,149,245,209,60,247,195,187,171,215,133,214,99,223,193,231,151,7,45,159,231,3,238,78,201,94,53,140,182,142,66,43,125,159,182,31,212,76,229,133,15,92,168,166,189,121,56,173,135,230,31,32,93,79,118,150,36,251,175,38,243,119,25,228,86,43,137,3,100,25,76,244,26,138,96,86,237,191,217,220,7,78,207,253,18,77,37,60,12,28,167,62,74,57,123,121,82,97,1,231,167,99,235,110,178,183,239,103,179,221,108,9,200,56,159,111,245,179,113,110,27,171,99,145,99,217,182,148,231,245,139,58,61,76,17,28,237,139,4,67,145,183,231,126,12,119,213,195,214,89,232,154,71,34,238,56,241,105,67,194,192,5,91,89,111,244,209,250,234,167,16,71,29,243,243,253,184,232,137,56,87,189,228,87,64,229,195,181,104,44,42,186,239,223,167,15,230,129,190,102,117,230,60,69,4,162,64,210,135,182,105,61,101,171,137,128,254,121,231,195,22,64,48,109,226,211,90,90,248,89,220,109,90,206,187,134,111,101,224,220,12,214,154,109,101,65,81,254,255,165,212,71,178,16,5,174,112,210,88,68,87,235,244,80,197,249,88,21,253,24,66,224,189,27,178,196,241,92,98,67,191,16,138,121,126,80,251,18,99,205,18,19,106,86,85,96,94,241,107,226,115,210,255,183,165,211,192,83,87,63,213,190,218,189,85,248,145,121,201,250,207,152,41,25,44,208,140,49,52,236,19,57,161,124,155,241,220,255,216,188,230,159,94,90,230,151,217,100,18,63,250,77,95,54,177,213,252,118,3,22,160,233,174,5,193,185,172,82,244,18,20,200,203,89,25,135,77,9,142,16,220,19,51,149,177,29,36,167,91,126,131,39,220,250,33,4,151,14,159,208,99,126,173,29,171,106,111,191,226,46,133,239,206,251,197,179,88,84,192,72,35,35,144,66,21,110,143,46,32,96,216,82,69,197,214,149,71,245,231,247,133,252,241,192,230,39,77,41,216,90,136,103,250,69,48,28,169,134,21,14,9,78,124,125,188,209,102,180,66,79,198,110,65,7,2,38,5,163,247,233,121,172,71,145,68,250,164,67,123,124,55,243,237,229,131,186,22,83,183,166,99,188,10,226,62,88,0,247,8,73,220,188,230,85,115,71,194,49,30,116,197,127,22,5,128,34,90,30,21,225,223,169,132,74,214,61,40,150,145,159,146,106,125,235,240,106,202,36,179,186,164,52,8,44,247,86,15,234,110,82,176,61,237,91,214,83,216,195,172,176,139,15,120,27,149,161,4,84,127,63,171,57,128,131,4,250,154,181,210,190,220,197,233,144,19,135,177,96,121,176,0,185,53,25,184,200,201,126,157,226,236,82,172,232,43,60,50,132,140,82,59,218,209,149,201,6,174,145,94,177,140,215,40,13,86,23,25,128,119,81,203,255,205,126,245,207,12,15,172,87,174,200,109,125,43,202,227,28,26,52,86,139,1,129,95,214,15,93,232,236,24,174,181,117,163,67,59,115,240,14,8,254,247,191,214,239,186,134,157,116,85,35,254,80,65,75,220,109,114,111,18,118,255,154,83,61,238,84,191,237,8,126,142,77,47,103,38,107,237,190,146,15,127,134,215,216,2,225,238,49,21,5,191,227,197,169,32,115,95,151,229,196,1,202,150,91,79,95,163,108,216,83,148,168,49,161,223,124,160,173,27,253,77,198,171,185,215,181,76,164,31,122,99,144,96,247,69,143,202,28,251,140,203,94,44,63,79,137,63,232,241,5,97,24,17,237,161,249,78,234,100,38,19,50,102,171,65,29,206,221,31,196,142,34,146,62,55,231,136,61,136,197,136,242,139,107,26,78,166,237,90,134,201,254,26,96,54,196,56,33,74,220,13,247,62,74,97,220,68,30,234,75,178,67,5,228,21,249,125,14,175,180,202,168,127,5,174,222,188,132,47,40,34,163,212,100,16,160,164,169,144,178,82,107,9,0,133,13,98,169,199,245,34,253,3,40,100,94,84,68,15,64,192,149,10,13,78,199,133,66,204,69,240,227,81,213,41,158,176,200,139,160,44,157,21,164,11,158,137,115,255,23,143,5,58,164,6,236,183,12,125,251,142,148,234,107,50,39,160,146,251,65,199,205,50,73,196,130,134,19,137,207,187,72,144,0,236,62,45,117,204,223,90,32,47,61,148,32,10,227,151,186,127,109,92,149,16,210,164,3,228,210,174,7,250,65,5,87,106,86,103,14,186,233,61,57,255,125,15,60,227,195,233,131,97,206,174,76,228,93,37,107,23,121,218,240,237,32,48,244,235,246,88,212,32,99,140,50,71,166,92,187,51,198,137,126,52,222,32,56,146,117,105,211,230,40,88,0,134,71,50,206,21,87,201,158,148,135,208,120,254,240,61,49,198,80,179,123,92,155,113,205,247,190,136,141,52,210,166,46,196,25,167,187,109,152,61,29,106,158,89,47,163,174,186,99,136,39,72,213,212,62,157,207,112,167,236,246,173,88,49,118,195,172,112,187,232,121,125,44,87,216,30,178,73,114,125,77,131,211,151,90,11,152,154,232,109,246,183,157,230,84,106,232,131,224,236,174,158,171,187,230,43,163,236,95,32,137,4,87,76,47,214,218,94,179,156,150,57,52,198,87,150,59,118,23,42,65,125,82,244,133,50,253,14,45,227,13,47,48,54,65,192,212,243,208,0,203,238,5,27,11,246,24,9,38,101,52,188,146,207,191,42,252,14,179,121,5,138,179,126,209,24,66,249,22,199,155,86,139,178,180,200,106,140,79,58,12,17,17,195,2,165,189,17,195,71,204,101,42,173,60,136,96,8,174,176,98,125,155,153,144,183,146,155,171,187,188,117,114,158,95,231,210,38,117,109,98,129,83,133,81,166,176,249,255,243,203,196,102,88,221,127,55,213,15,187,76,145,248,64,43,127,215,175,7,204,38,194,230,215,248,68,50,72,120,166,253,178,71,218,49,55,31,82,216,88,187,221,69,194,35,250,182,217,237,100,163,205,253,225,93,117,247,11,252,112,35,103,221,119,50,181,16,54,159,153,94,83,68,10,66,149,66,97,61,222,39,240,204,11,43,127,21,199,29,73,248,110,170,222,229,201,74,215,236,254,209,214,226,166,74,121,97,145,102,145,210,155,221,203,205,239,205,244,138,4,94,145,226,161,105,87,152,193,243,6,190,186,166,137,195,196,78,162,128,123,135,252,61,88,26,207,137,97,35,115,41,173,41,86,24,59,135,187,225,251,144,251,146,118,148,193,153,31,53,4,28,32,202,45,141,62,253,231,229,173,12,131,193,120,203,113,84,180,73,6,31,105,42,211,51,76,46,87,84,168,200,192,199,23,226,210,245,44,201,202,227,243,255,68,223,68,64,26,200,185,199,248,197,209,95,107,100,191,219,44,142,157,32,96,91,243,212,209,22,230,39,140,85,139,33,16,24,33,212,112,8,93,248,238,100,90,169,101,1,13,170,172,20,11,152,30,235,109,95,53,116,187,157,21,53,5,236,98,72,231,227,195,194,125,222,197,107,236,199,45,93,143,208,33,197,127,111,163,117,55,182,56,105,237,194,154,9,226,121,189,47,149,111,120,199,69,248,196,69,156,156,142,143,215,16,194,218,91,207,209,109,212,107,179,254,238,13,153,187,247,33,212,192,93,186,30,42,66,148,172,239,164,201,132,0,105,124,162,57,41,199,29,93,142,231,236,62,166,251,177,79,14,33,230,206,206,243,17,84,210,239,170,105,108,98,203,207,215,155,143,223,139,100,104,189,86,249,16,163,152,146,48,132,88,124,168,187,236,198,106,74,97,60,121,188,86,55,88,74,169,192,238,137,175,203,239,246,35,211,253,110,84,40,124,238,151,250,166,74,225,165,97,209,40,227,65,189,52,19,105,252,83,89,39,188,13,30,41,75,17,39,150,89,241,164,251,171,169,218,19,156,112,167,90,49,235,245,237,137,4,18,62,210,190,255,233,249,239,214,207,191,137,163,15,164,72,237,143,126,246,98,130,233,194,251,242,220,92,33,158,28,82,252,47,12,215,153,208,78,234,157,14,252,50,194,223,76,206,15,183,56,194,75,61,24,83,230,75,169,2,239,111,154,163,81,73,151,142,136,49,24,27,14,233,225,70,142,111,7,104,212,106,142,188,57,67,34,121,67,230,188,157,215,233,25,22,21,55,94,149,197,254,210,190,108,12,190,73,161,87,4,21,240,137,213,21,165,231,62,61,161,10,181,191,214,167,52,132,240,177,217,60,240,50,186,121,185,60,6,81,122,197,13,235,16,249,75,48,125,229,233,246,18,181,74,28,29,57,25,8,140,74,208,77,68,245,135,67,50,131,23,117,248,184,65,192,44,244,197,93,6,214,95,143,241,189,215,56,208,157,3,145,230,163,71,38,143,58,218,5,47,213,109,92,118,121,11,194,95,126,169,184,232,190,90,123,99,56,81,52,226,110,49,22,104,203,235,189,108,107,218,64,250,224,27,200,89,32,184,188,119,177,41,218,238,159,230,6,102,151,158,169,151,40,144,102,210,48,29,189,97,244,53,18,161,69,167,241,31,105,188,180,85,213,85,69,25,243,242,254,217,180,179,38,224,52,82,179,236,247,70,100,45,173,164,61,25,167,227,22,32,62,3,169,13,38,71,166,217,155,191,75,20,152,126,216,13,8,133,61,31,193,114,235,121,215,42,169,158,197,157,52,98,1,239,93,189,226,171,108,27,71,76,187,244,183,52,57,177,200,31,154,166,123,211,186,223,159,58,154,179,148,74,237,202,16,10,122,202,102,94,115,251,85,240,251,188,144,123,20,140,70,217,11,10,27,61,99,52,49,23,53,8,15,208,142,67,163,242,56,191,77,71,171,252,237,143,156,254,128,74,217,5,249,44,66,213,245,177,193,255,81,247,100,60,157,66,39,226,0,246,5,43,92,93,166,114,115,77,203,63,102,209,5,162,0,7,231,27,147,24,120,205,152,150,105,189,105,253,58,159,48,255,46,133,203,186,51,134,21,182,21,198,227,113,181,60,156,60,146,44,113,162,242,250,249,250,118,114,106,22,4,55,171,178,214,51,32,120,208,39,86,157,170,184,146,131,112,77,151,47,221,119,99,7,88,114,184,121,116,184,222,206,224,164,250,143,124,155,198,243,142,3,184,200,150,53,153,137,136,190,89,27,253,104,72,188,23,118,18,233,160,157,141,163,230,239,159,164,65,231,113,86,12,251,191,107,254,29,1,46,113,235,167,122,59,179,177,187,233,178,200,56,178,10,66,200,43,214,130,239,135,239,116,181,80,81,40,171,76,222,194,47,205,91,106,138,73,128,234,52,227,220,31,42,111,11,226,42,244,122,78,69,111,38,89,220,172,226,73,237,98,126,136,39,160,75,26,114,175,204,184,255,7,119,166,169,60,48,61,175,159,246,121,50,54,182,128,161,88,254,170,229,52,193,175,17,28,204,108,190,211,57,185,119,243,74,240,232,30,5,40,204,223,54,83,86,189,249,120,211,58,164,77,206,224,22,4,216,255,78,9,176,14,94,18,167,104,202,201,113,150,194,80,83,149,88,236,143,212,174,197,49,190,69,44,120,111,130,5,148,91,61,57,174,13,255,21,133,150,43,217,96,11,32,13,50,198,183,5,130,46,179,41,117,240,11,189,206,79,241,194,225,173,112,42,177,69,10,186,236,113,141,52,229,39,88,96,90,108,218,113,239,162,131,32,32,142,71,42,185,14,56,95,15,41,157,88,249,72,60,73,105,94,36,151,108,199,23,176,184,212,200,54,241,155,93,138,87,137,143,218,190,12,2,35,132,234,65,237,87,8,110,56,185,239,234,151,23,88,23,175,53,73,188,1,211,59,95,170,83,106,227,66,106,188,199,139,168,221,163,233,241,254,60,6,13,240,209,243,55,248,130,144,86,71,215,210,119,197,76,153,93,185,18,55,201,177,132,12,203,119,209,27,27,111,154,255,82,226,194,210,171,72,227,193,95,36,184,184,215,31,194,96,119,36,150,194,76,210,235,241,108,41,27,108,101,233,156,119,105,50,29,6,73,122,176,70,113,66,245,144,254,39,60,54,197,218,181,26,4,136,249,9,119,99,46,226,50,192,41,173,45,215,19,76,47,153,248,208,206,239,31,101,92,128,241,149,189,178,24,156,56,147,203,180,225,58,209,205,113,61,171,178,248,106,16,212,253,48,150,202,136,39,45,52,155,198,175,44,93,85,19,15,44,127,128,163,213,188,203,88,194,140,196,206,212,245,65,96,10,89,118,159,158,78,154,29,46,225,131,78,8,199,2,6,84,142,183,101,47,246,44,225,168,27,138,50,84,241,26,136,181,228,133,85,159,158,211,41,254,155,44,228,193,36,62,86,185,172,232,79,223,255,139,169,219,41,129,152,6,193,149,246,3,34,153,18,137,118,51,113,187,216,166,123,216,149,225,29,133,19,31,14,25,242,92,229,118,173,236,124,92,68,198,215,147,107,232,167,148,236,76,110,239,224,125,202,216,40,242,181,173,107,62,204,48,63,45,158,140,64,95,191,1,74,110,47,159,40,26,88,90,16,219,206,64,224,215,34,98,33,172,77,91,57,60,247,243,246,43,63,255,215,14,140,160,6,236,11,50,105,147,154,213,226,117,118,112,137,47,45,126,201,164,127,181,54,186,121,186,230,251,192,38,69,206,103,222,136,197,86,30,35,181,226,59,138,44,249,69,136,44,5,188,240,49,25,66,168,84,185,144,201,104,97,140,110,75,5,175,225,187,182,255,95,195,13,157,141,123,239,107,148,182,54,33,160,146,239,74,130,9,217,31,250,236,171,112,180,243,52,72,32,255,74,147,36,241,150,205,53,214,185,203,91,227,0,15,200,78,132,201,95,196,199,94,66,233,1,25,89,37,32,224,216,221,252,144,150,29,150,20,251,199,135,185,105,134,184,173,22,37,187,159,18,249,181,195,30,71,110,216,31,10,33,169,24,123,133,39,158,83,100,31,124,234,21,84,163,199,172,92,179,86,23,121,153,194,96,167,226,178,219,119,132,6,225,130,97,100,23,151,51,230,249,155,191,199,59,96,215,112,23,211,142,19,87,70,55,166,107,135,248,138,46,246,245,67,253,84,63,87,155,24,237,98,172,238,62,19,224,252,50,131,39,152,39,112,114,209,21,95,166,236,102,216,109,50,186,74,68,228,96,77,229,34,168,61,240,202,240,184,215,155,171,68,4,177,85,231,107,228,73,154,224,145,253,4,55,146,64,68,12,180,218,168,68,228,30,224,63,137,7,203,169,226,32,160,105,235,135,149,73,44,135,178,188,205,28,104,48,136,3,152,251,244,79,106,107,97,45,153,199,101,78,53,245,36,252,204,213,121,49,188,148,182,109,148,239,109,98,214,137,6,4,124,173,10,155,171,98,1,50,129,119,31,212,134,112,192,149,51,232,102,75,21,236,235,159,223,222,193,99,231,254,136,24,189,30,102,205,69,78,51,112,251,70,216,13,25,56,239,178,57,186,174,36,232,171,77,227,194,79,159,3,62,135,124,145,224,194,73,196,45,46,127,41,22,39,245,77,144,96,48,247,163,69,90,106,234,102,14,111,110,252,27,153,153,101,120,101,0,135,193,89,122,138,207,149,238,167,171,94,16,80,35,162,100,101,129,132,253,100,42,58,18,48,168,38,233,7,161,51,29,11,70,38,64,25,251,156,149,41,29,4,234,79,94,21,179,26,247,35,139,197,185,135,81,111,254,135,159,225,178,207,222,48,180,231,38,217,229,93,58,247,3,215,233,225,21,97,222,123,149,156,111,255,238,53,70,156,234,246,102,133,243,21,6,105,231,43,117,242,176,207,231,126,118,47,38,10,199,166,120,225,45,34,15,74,33,12,112,157,206,213,168,174,4,6,179,153,44,171,17,73,39,125,63,133,46,37,33,101,117,208,115,255,219,199,23,90,16,223,180,212,153,129,159,234,157,41,135,209,187,71,197,231,249,191,195,58,19,76,145,151,76,22,196,29,251,34,180,208,40,254,201,17,179,152,129,163,211,236,121,111,148,165,209,12,66,129,215,217,172,169,36,232,104,190,72,130,218,112,7,141,218,22,186,54,18,162,211,132,119,159,130,57,131,23,177,192,200,94,151,189,155,129,133,74,14,48,255,92,45,104,6,97,125,221,215,157,164,199,78,101,183,74,68,5,153,32,160,225,69,179,171,133,190,65,180,147,253,17,140,137,7,234,166,146,181,8,8,80,180,127,197,85,200,50,43,224,14,161,70,135,25,122,156,147,62,136,236,67,7,116,212,9,88,0,252,211,251,206,139,237,204,55,225,38,159,21,160,66,210,155,17,238,227,59,44,213,13,54,79,158,203,32,97,16,144,115,178,92,52,149,76,224,177,122,252,201,145,16,50,132,48,58,213,43,151,169,13,66,145,175,24,43,104,92,59,207,167,163,76,26,189,168,62,8,203,151,170,102,211,38,233,245,179,161,77,183,209,32,216,61,198,65,187,221,180,115,63,31,61,103,55,214,74,173,240,25,79,227,106,65,236,210,254,175,143,239,78,31,92,96,18,87,166,151,187,227,12,193,245,36,174,167,49,241,60,199,242,254,78,254,251,214,20,139,10,31,175,154,103,15,155,31,104,87,67,56,61,44,128,186,153,25,47,23,141,165,69,119,246,38,83,174,254,33,233,39,35,129,23,223,163,253,57,161,34,15,17,239,190,196,243,245,181,78,185,119,25,83,174,235,251,34,127,167,180,120,87,174,251,88,124,245,127,51,175,115,9,155,117,240,226,58,137,63,78,26,149,47,39,40,175,98,136,232,186,111,145,32,48,113,123,218,152,73,45,197,218,62,87,112,68,44,6,19,97,190,187,149,24,98,207,224,80,92,122,22,51,146,131,69,45,63,251,123,255,9,33,137,233,160,126,183,37,243,12,106,55,52,50,221,142,219,62,80,125,117,246,160,90,124,2,20,246,207,169,93,223,252,209,34,158,149,31,52,110,47,11,161,22,176,122,19,24,127,167,162,178,123,223,116,47,152,98,129,241,19,195,77,33,67,95,95,31,223,251,79,130,238,144,248,110,214,201,137,4,155,185,127,145,249,111,206,221,25,168,27,172,178,249,93,74,163,224,179,90,177,116,248,99,23,141,162,188,86,60,17,109,97,69,118,194,16,123,251,246,103,162,38,235,112,109,198,110,193,102,152,210,197,66,193,72,134,25,205,228,194,10,203,87,182,94,217,55,189,255,210,0,0,118,73,113,219,213,163,175,217,245,75,209,91,249,192,87,29,231,245,207,176,168,225,66,178,243,250,103,36,96,72,12,39,119,126,248,24,148,32,29,170,196,50,186,221,32,141,79,189,10,122,181,54,245,80,179,219,94,156,103,252,188,62,201,217,177,188,184,148,249,208,81,67,200,152,132,7,166,213,123,72,178,186,164,135,13,60,197,112,199,70,204,10,243,218,141,161,205,183,77,193,207,175,245,31,168,68,65,240,39,79,43,195,17,48,56,13,76,208,242,184,184,23,95,128,28,77,203,208,78,51,32,191,28,244,192,165,135,29,47,60,143,225,87,47,183,87,167,99,223,22,180,72,137,3,53,200,42,94,217,45,38,27,43,132,30,179,86,71,184,145,240,60,150,140,221,237,154,127,41,61,251,203,1,246,47,160,6,165,71,101,246,250,77,69,207,208,200,215,87,174,217,162,29,96,187,183,71,222,207,235,226,250,183,228,153,121,130,32,160,37,130,46,123,234,209,236,61,247,77,75,202,135,12,96,187,218,159,219,41,65,74,234,228,4,35,80,225,20,36,253,222,213,87,124,155,25,151,111,177,167,13,240,152,116,225,190,144,133,60,177,119,237,59,51,241,190,236,176,20,68,141,113,146,103,197,203,171,139,208,93,85,205,183,196,48,221,193,19,120,70,39,206,10,95,69,168,216,79,141,158,80,208,128,177,185,130,131,69,34,53,204,78,17,221,53,142,157,235,208,85,93,218,94,199,41,231,180,250,71,210,87,157,20,174,224,151,172,162,150,91,250,202,221,203,50,60,22,99,197,213,65,100,224,92,124,88,83,163,83,41,63,66,126,111,129,94,102,41,187,144,237,103,172,192,216,41,97,152,241,233,78,220,121,62,124,115,239,217,211,242,100,73,215,119,232,102,74,60,32,81,37,130,110,161,52,16,219,49,228,13,10,207,196,137,106,245,223,21,147,78,55,173,21,54,80,231,168,24,197,111,53,206,43,189,158,5,220,248,61,142,186,148,141,142,65,7,154,209,163,22,201,138,184,14,0,4,29,87,98,120,157,116,124,204,246,119,150,198,154,105,223,232,223,207,237,194,19,8,193,225,58,98,34,218,76,75,206,173,73,247,255,195,19,184,106,146,14,196,98,46,147,31,32,104,82,123,110,156,239,31,171,203,23,243,254,27,52,92,156,17,56,220,134,182,124,93,164,29,150,223,220,212,122,44,178,98,237,193,13,22,92,8,49,188,19,248,112,38,135,207,113,246,107,135,54,8,4,136,181,252,102,240,56,204,105,34,250,185,58,81,15,80,38,93,174,141,33,168,6,25,195,169,121,94,13,71,225,68,153,162,254,208,165,69,166,86,115,121,186,84,8,232,241,61,80,20,247,217,101,100,246,201,240,17,91,100,200,254,141,21,37,47,177,93,137,113,178,36,176,103,157,45,79,211,98,122,175,251,76,175,98,187,104,141,231,122,241,114,12,142,50,21,82,209,180,242,206,126,129,49,21,81,247,213,60,216,64,97,147,221,91,190,143,63,206,15,194,110,20,113,121,198,225,133,159,241,10,168,235,184,85,208,19,178,110,237,244,61,37,34,212,1,219,91,81,75,166,78,84,89,247,4,100,67,33,184,132,49,94,215,59,35,178,32,23,82,158,23,147,133,98,109,208,246,246,109,244,28,248,12,167,68,65,197,71,16,35,101,212,152,226,194,243,186,155,157,89,191,75,179,221,65,184,132,71,69,193,223,100,178,196,139,247,128,229,251,177,252,72,114,254,179,188,6,157,63,45,110,33,202,239,78,238,129,112,217,7,85,4,158,32,67,67,225,197,92,113,134,105,176,128,162,45,84,231,191,227,141,147,251,65,55,40,235,215,240,26,65,173,238,18,122,182,29,218,111,85,25,109,199,142,241,200,224,172,201,111,213,179,243,212,204,214,158,177,109,177,96,1,93,78,86,250,199,141,167,190,54,68,169,23,40,175,161,237,11,37,194,165,166,13,220,11,143,200,44,107,175,97,134,36,126,238,40,110,126,52,243,15,148,135,150,199,185,171,33,66,78,86,229,67,213,133,212,219,180,210,8,70,158,251,188,90,118,62,196,157,182,71,97,171,87,114,159,69,204,169,227,180,164,75,38,111,120,143,177,73,62,151,126,185,171,70,7,17,232,175,198,56,252,252,42,165,62,157,27,162,129,36,224,11,194,200,4,150,181,212,29,233,42,42,122,153,62,206,227,53,66,121,245,60,163,29,197,232,34,174,50,229,234,79,65,72,178,173,183,201,247,115,194,203,14,225,165,134,227,11,96,55,229,174,132,239,241,209,173,141,103,63,9,100,216,95,32,60,161,250,175,131,81,96,147,132,115,89,45,69,86,198,0,165,152,226,244,235,210,87,5,103,13,140,247,243,130,176,152,21,95,23,147,187,13,251,182,83,21,47,94,105,62,72,3,29,164,115,98,163,111,157,186,15,160,124,27,5,217,214,120,41,10,61,150,163,252,42,213,6,147,76,174,103,204,200,66,75,5,191,86,248,58,19,5,29,145,225,221,42,151,58,112,183,57,93,166,246,114,31,45,38,51,36,214,103,145,255,196,2,56,110,31,115,73,86,165,136,35,10,159,175,238,1,68,1,230,137,175,22,49,59,78,60,111,196,188,11,222,243,15,33,246,207,204,151,37,101,219,245,171,161,91,27,205,17,104,120,11,34,189,34,34,74,37,214,239,109,153,194,160,24,63,220,61,80,187,92,210,192,153,35,35,53,18,83,104,114,190,159,174,222,35,242,45,170,22,120,30,200,159,112,7,66,189,192,168,134,143,178,4,245,27,24,132,245,105,95,63,247,247,117,214,174,47,9,98,229,150,25,69,115,146,157,191,223,3,145,34,251,122,170,232,171,156,202,8,135,204,12,2,148,8,116,175,203,13,2,242,171,150,189,30,144,226,121,2,67,234,79,142,36,1,216,203,84,29,53,139,77,98,199,44,109,229,79,140,126,177,98,141,139,252,250,229,167,80,251,111,234,186,239,142,242,100,25,143,235,251,202,247,207,253,100,88,234,127,72,143,105,39,204,129,30,61,41,212,88,20,83,103,242,150,72,82,172,85,94,68,190,123,139,213,185,191,78,195,124,220,168,73,222,188,116,7,87,192,209,140,99,184,38,189,107,146,241,99,171,109,27,159,109,126,4,4,188,108,170,29,196,31,48,62,179,133,77,132,231,115,97,1,118,234,235,227,229,16,253,74,239,87,236,219,254,84,44,224,249,210,207,180,130,237,50,210,148,58,16,17,152,1,46,193,251,167,3,198,182,237,86,222,10,173,244,40,125,195,0,35,115,225,105,74,120,50,248,183,253,35,29,102,37,44,1,240,241,218,176,148,149,118,203,209,49,158,232,178,192,2,7,137,255,44,182,228,51,167,127,248,201,121,127,220,39,225,241,217,248,182,71,173,126,152,214,5,99,81,137,97,18,126,165,30,183,23,88,240,77,154,56,101,7,1,65,16,42,174,47,97,162,50,118,38,102,115,202,78,134,131,233,220,47,63,44,204,0,89,175,137,105,5,145,210,95,161,246,121,234,250,37,166,183,180,130,96,217,93,61,156,191,12,28,77,233,108,89,147,27,84,179,151,184,85,194,59,133,69,13,244,213,102,115,88,24,152,80,92,40,175,32,214,98,81,172,189,137,67,194,97,229,158,6,41,105,23,222,241,128,72,242,57,118,3,175,31,199,130,252,227,190,61,52,228,104,120,151,102,199,127,145,65,197,50,25,161,7,50,109,94,120,164,246,92,183,144,91,231,96,136,233,39,100,117,120,61,94,63,188,255,135,201,106,233,81,86,91,75,136,201,214,40,126,9,81,51,182,234,124,116,29,8,44,85,187,160,188,114,190,126,120,248,88,125,104,212,153,141,160,58,54,59,201,188,244,156,151,219,192,231,36,247,198,74,169,217,217,150,18,41,126,4,235,253,209,210,195,211,76,168,201,11,30,92,128,0,169,153,235,74,83,42,64,86,10,88,152,127,231,5,196,39,161,186,26,20,125,149,112,243,191,159,45,91,11,54,24,192,90,199,90,199,217,136,76,31,162,162,168,12,142,135,248,10,169,14,159,179,231,237,119,157,113,85,254,57,73,195,162,68,180,255,66,206,201,239,10,52,82,31,220,249,107,33,67,152,201,242,52,26,121,36,187,130,163,179,173,100,125,12,2,163,58,18,19,90,58,41,115,255,69,49,249,195,96,88,84,97,91,181,199,147,160,154,186,88,33,216,33,28,6,2,6,82,18,6,52,183,9,76,124,40,49,38,88,36,17,49,172,115,83,58,130,206,67,33,241,139,201,236,153,230,80,56,121,177,93,231,115,85,56,73,46,107,121,61,107,45,103,178,232,105,29,37,131,5,137,82,23,115,164,242,226,120,41,104,92,154,217,198,254,112,251,245,124,190,196,33,181,143,134,155,168,248,220,165,231,214,4,6,18,215,176,117,215,137,136,93,141,68,99,250,39,46,239,90,144,101,172,91,201,160,70,175,99,219,253,94,122,74,34,198,197,41,4,174,6,193,165,49,113,47,19,68,100,78,229,91,249,125,197,200,241,192,254,207,80,249,32,30,251,18,208,241,109,240,90,9,30,64,127,150,144,186,140,211,191,48,167,164,106,104,35,135,47,128,185,212,44,208,145,16,126,59,38,237,62,11,6,34,136,205,205,255,73,58,121,231,203,149,63,232,142,108,37,225,197,28,139,209,102,231,81,32,138,106,189,43,41,12,130,7,188,55,157,38,11,114,8,100,85,10,23,55,79,196,107,196,96,40,69,164,197,180,153,190,144,183,44,141,8,225,9,81,89,66,84,238,142,206,76,181,140,228,140,210,187,3,98,254,57,94,114,227,63,22,75,211,254,91,115,66,233,224,254,241,247,23,188,155,102,174,147,27,39,6,167,174,61,196,125,185,197,127,122,184,56,86,38,249,132,83,56,74,31,194,3,187,245,43,146,112,167,204,16,171,193,31,153,159,27,32,248,205,149,57,243,247,161,142,86,47,235,215,239,80,61,135,224,242,31,127,37,25,20,249,105,8,8,135,242,92,127,14,9,83,213,76,24,109,172,81,84,210,194,58,57,87,223,226,187,147,91,53,69,94,234,161,233,158,252,66,220,39,195,226,129,250,130,80,25,70,71,42,17,26,33,175,163,135,137,120,225,184,214,240,232,210,118,65,6,68,16,121,159,179,51,70,20,112,153,126,114,120,229,20,30,149,180,107,82,78,14,125,8,254,183,217,57,109,90,214,18,52,59,86,76,157,75,210,211,100,8,245,117,10,26,26,54,229,214,36,238,0,188,198,75,203,232,53,93,109,77,58,244,14,215,165,76,114,124,1,93,205,223,91,130,141,151,200,87,53,154,162,164,50,241,14,136,221,73,41,103,122,110,74,139,96,119,181,93,28,190,251,167,101,93,228,203,232,72,134,255,226,112,99,174,202,80,172,66,155,152,136,158,207,132,100,146,12,219,189,187,40,136,112,157,31,43,215,124,34,182,192,65,97,67,118,43,22,91,77,254,211,61,160,50,97,7,118,150,132,220,63,20,0,129,51,192,245,43,53,227,6,114,148,191,206,140,46,26,203,88,199,212,153,146,146,179,106,92,160,143,80,126,240,31,73,15,151,108,155,51,21,57,103,127,21,41,148,111,97,38,106,86,90,210,133,165,22,9,165,93,127,240,231,89,103,19,126,41,253,23,92,93,76,115,128,218,222,116,104,137,220,26,116,64,108,125,102,30,200,246,41,74,44,50,96,109,181,68,23,196,99,16,70,147,135,93,175,120,124,32,89,234,64,16,56,249,237,122,39,202,236,71,67,220,98,127,248,38,2,11,168,22,15,207,109,177,170,40,107,124,132,251,92,56,193,35,201,70,159,166,9,137,113,83,198,107,93,252,239,131,31,8,108,218,191,53,167,247,157,253,209,82,109,111,56,0,195,244,98,93,166,31,150,127,247,29,214,215,240,242,121,197,205,183,197,38,208,89,40,213,86,94,73,249,43,42,249,101,208,208,65,225,99,239,202,255,240,105,190,12,217,170,115,58,220,16,220,162,106,217,130,57,181,133,58,79,57,104,231,42,128,71,198,90,38,68,226,236,195,233,208,127,16,13,193,250,160,48,213,220,88,88,237,218,227,119,150,105,253,133,252,112,16,46,159,60,70,200,212,193,21,231,241,52,186,240,138,227,9,244,252,113,249,246,51,187,97,48,230,89,134,19,29,176,91,171,141,221,232,180,100,179,6,117,101,39,222,185,11,68,2,53,142,174,59,59,217,131,176,7,242,117,5,173,32,188,126,175,186,160,127,57,78,70,128,113,211,167,249,24,87,116,193,229,43,39,186,243,117,21,213,19,78,235,100,4,184,68,119,245,180,202,61,77,78,145,5,195,66,85,89,15,106,208,123,76,62,94,77,188,169,20,3,147,236,45,165,133,0,189,118,211,148,17,198,159,162,207,30,5,121,255,121,141,71,10,182,185,72,157,77,149,132,44,9,62,113,64,186,227,9,139,24,247,132,62,77,26,58,160,212,38,71,54,152,25,89,220,243,192,220,78,192,171,167,169,136,177,185,181,19,210,7,215,58,86,236,106,54,103,46,101,25,116,116,112,65,14,116,95,98,156,196,77,83,134,5,112,153,60,144,56,244,189,246,247,25,61,126,250,207,174,8,28,152,236,51,194,3,74,7,29,232,80,103,38,217,103,121,215,175,114,145,99,34,158,169,44,231,155,247,221,113,170,136,213,221,195,86,227,9,204,214,7,39,171,199,77,207,212,214,92,12,229,148,33,194,21,126,180,204,88,35,42,157,114,214,237,7,80,139,7,164,91,133,164,144,176,110,158,196,177,73,227,174,29,230,88,159,129,134,244,109,177,51,54,134,12,170,194,10,101,176,59,153,138,193,76,248,5,189,5,25,173,173,14,14,3,106,136,204,101,13,93,255,225,115,198,147,215,3,215,160,2,225,190,181,59,26,206,116,101,133,165,7,249,244,127,95,65,75,190,91,124,13,194,214,157,121,203,159,40,56,4,245,65,248,203,170,50,97,233,173,7,111,190,190,182,124,9,21,161,225,120,58,182,202,136,84,83,174,139,157,239,69,123,101,136,8,105,248,243,143,17,30,215,134,63,209,182,74,190,123,143,118,200,39,99,75,77,252,108,151,209,200,2,214,252,217,29,66,76,157,181,56,187,176,6,28,154,237,178,239,96,43,134,16,206,126,227,165,110,172,165,67,47,187,66,14,177,226,68,170,244,229,159,121,165,221,121,236,71,44,152,74,175,179,255,189,127,172,212,205,160,201,196,134,229,85,35,189,10,81,128,242,238,202,148,206,198,204,67,167,215,237,202,134,55,73,250,115,216,63,204,250,114,130,147,249,176,13,227,127,48,18,190,125,62,13,51,168,9,104,98,41,135,243,176,197,154,11,73,117,242,232,9,0,115,146,94,76,106,239,147,55,73,120,54,242,181,170,32,44,54,146,80,21,234,181,103,195,79,152,249,101,81,231,169,62,53,159,174,139,139,93,190,122,158,143,208,149,84,243,229,247,155,75,87,253,96,192,249,239,49,81,134,175,198,234,193,231,28,89,103,119,210,160,47,230,180,70,133,87,108,26,199,140,135,249,83,243,5,249,150,154,150,43,178,142,17,147,30,170,10,52,8,236,36,63,220,122,111,170,242,234,152,40,54,66,135,131,58,154,101,8,161,231,101,241,254,161,124,128,166,205,230,67,71,106,58,126,184,243,83,123,180,151,236,92,41,55,236,179,152,147,20,63,220,34,208,252,189,23,155,196,84,44,181,30,140,23,126,94,159,174,22,134,206,245,84,181,150,202,51,39,59,127,31,214,164,74,151,102,115,104,118,84,203,159,223,53,45,231,254,230,87,12,159,59,167,149,6,206,25,199,193,227,249,225,115,103,22,219,30,137,143,90,242,176,174,129,107,87,113,128,38,13,238,220,31,79,5,10,109,77,155,76,27,66,172,30,19,61,61,228,192,45,242,122,253,185,233,243,247,105,200,252,234,168,244,126,236,51,157,57,71,73,22,140,5,70,14,240,187,50,236,159,102,222,84,214,160,121,202,136,2,100,199,203,196,104,187,72,66,237,77,180,83,206,2,132,162,228,230,166,121,158,94,61,174,162,64,249,243,70,2,17,177,90,122,179,53,130,7,19,132,90,190,182,67,236,193,2,242,7,70,18,143,12,206,253,170,47,39,42,60,129,80,191,238,50,244,104,54,196,151,39,22,33,219,111,38,96,81,224,131,215,85,28,97,223,54,55,220,95,3,185,189,50,132,130,229,215,130,53,141,233,246,233,56,203,183,34,34,36,252,212,149,24,143,64,50,221,132,117,187,96,179,215,32,84,176,134,94,138,207,81,159,253,251,41,131,84,209,69,44,9,143,79,23,220,37,5,20,167,117,11,172,236,115,136,228,150,191,244,175,184,142,86,200,25,219,151,212,236,189,69,183,27,27,89,172,7,39,170,118,31,29,118,77,212,201,129,0,142,94,98,84,75,128,236,42,167,134,48,187,224,115,136,79,4,244,35,176,43,100,219,189,111,60,27,181,29,36,118,220,51,179,94,15,94,229,244,241,226,83,16,81,86,192,9,243,143,222,237,216,41,30,21,129,109,9,181,195,25,73,120,29,231,195,58,246,63,255,48,218,197,198,68,60,48,23,20,42,3,159,155,133,24,76,211,12,171,73,120,120,189,161,48,218,51,73,209,222,124,245,53,45,1,130,224,102,59,150,122,53,255,204,85,230,204,8,63,139,190,130,21,142,37,181,43,103,143,79,148,94,113,207,127,183,54,6,225,174,177,85,198,118,60,185,108,185,179,83,110,39,77,3,171,115,191,142,206,214,175,211,251,177,72,224,143,232,224,231,245,191,41,210,150,100,188,34,138,71,203,114,3,123,56,81,50,113,232,81,113,19,212,92,115,34,79,39,129,198,3,235,21,157,50,175,119,244,22,44,140,247,201,109,182,64,184,193,237,47,247,159,94,113,163,33,205,47,43,173,183,208,151,43,37,189,225,206,121,175,106,124,91,245,34,205,0,112,201,119,245,171,122,198,247,138,150,204,244,218,87,27,236,120,13,178,93,98,153,102,164,44,229,167,128,158,226,122,70,44,105,252,19,85,157,63,124,77,88,101,99,63,48,254,0,2,214,191,238,245,106,201,179,220,74,168,20,109,89,242,39,225,239,220,199,5,1,54,170,194,79,172,193,245,47,42,240,128,88,171,154,188,38,124,143,157,151,255,254,101,216,3,60,33,198,210,49,90,122,149,150,97,94,158,55,61,248,50,166,168,253,171,152,164,88,130,249,207,8,109,230,10,250,187,131,133,217,193,11,230,158,134,163,183,23,244,47,28,251,123,144,248,200,132,48,218,48,138,211,202,89,9,147,241,154,29,11,60,49,126,184,85,172,116,3,237,5,80,34,157,82,49,212,228,226,218,127,54,90,78,158,75,106,180,248,95,10,195,147,248,199,150,189,207,102,203,11,0,127,231,104,240,241,0,37,165,248,119,90,37,197,248,133,205,205,238,139,6,86,120,32,160,42,92,114,35,67,178,253,174,146,229,77,223,48,176,0,197,239,125,114,125,79,226,4,5,104,237,38,52,147,250,91,146,102,75,68,105,63,120,91,169,183,65,241,27,132,75,123,125,227,249,111,49,236,219,127,153,110,218,175,253,240,200,124,50,112,81,212,58,140,230,25,189,237,87,121,87,18,127,8,94,70,190,20,209,166,139,76,65,166,197,81,131,194,100,163,21,229,54,253,124,29,112,179,189,221,25,102,236,119,84,201,26,11,131,169,15,171,55,87,91,238,70,51,150,81,100,225,244,44,207,221,121,223,42,252,216,29,131,229,91,123,148,179,204,175,30,61,145,119,240,85,144,206,152,72,106,207,86,17,191,174,144,252,147,24,38,143,144,82,45,60,240,190,71,29,237,235,80,177,120,187,150,29,74,32,241,189,48,139,175,244,146,51,245,165,171,183,78,83,201,84,176,162,113,85,34,39,10,172,3,56,242,71,63,219,129,11,80,108,189,218,162,241,239,153,82,197,226,239,180,5,222,62,16,156,251,208,210,130,181,145,57,241,141,192,21,31,118,35,60,33,4,163,233,170,19,22,134,121,246,41,167,84,74,133,132,167,71,197,116,178,92,9,143,115,231,197,126,190,37,205,199,155,235,127,50,42,5,173,251,104,201,230,96,140,74,36,254,54,103,105,246,62,211,67,109,196,83,68,133,60,1,132,123,198,87,33,95,168,213,92,184,161,166,85,224,160,10,194,113,15,42,144,6,61,152,103,69,90,202,62,84,60,32,1,248,210,59,231,22,111,251,146,18,166,27,248,209,8,239,144,130,81,85,239,123,23,201,172,127,199,52,242,251,223,161,210,186,175,103,249,123,170,141,84,169,26,203,181,39,85,184,162,104,153,36,123,251,128,176,110,218,47,181,30,245,79,64,130,76,69,21,218,125,54,90,140,149,145,144,91,195,67,194,163,250,69,209,110,7,186,71,83,63,74,92,167,157,32,135,235,95,172,157,11,71,74,170,14,30,109,251,108,250,226,187,47,250,188,46,19,248,104,72,161,65,173,16,196,25,135,233,165,244,241,149,199,216,210,24,27,184,80,115,43,131,120,13,195,154,132,143,49,69,250,228,153,146,121,105,149,25,124,37,146,33,191,240,131,190,168,28,125,24,167,123,85,33,26,46,181,144,246,57,98,74,43,232,106,204,176,98,104,208,144,72,200,175,11,166,139,213,172,175,2,47,185,61,252,44,60,228,105,217,113,116,211,247,196,126,243,101,120,251,130,148,0,164,65,214,150,115,249,51,235,224,62,71,106,78,189,9,5,36,172,188,235,184,99,20,23,146,206,133,26,104,232,143,199,3,71,91,237,82,209,184,202,68,68,64,116,129,181,43,214,41,161,253,238,126,97,186,149,247,239,3,235,76,239,79,16,48,222,157,196,237,45,208,69,223,63,114,239,29,77,20,47,197,203,107,59,81,213,170,163,152,7,216,204,201,150,70,60,80,89,191,40,119,183,198,254,211,106,125,198,197,153,71,208,210,127,21,28,97,63,62,11,242,125,127,212,114,171,151,9,130,51,187,138,244,97,86,18,174,152,214,216,94,250,1,35,221,207,224,108,184,14,165,16,29,218,180,85,90,252,53,94,35,40,171,29,69,183,240,155,26,34,240,202,62,36,224,129,186,175,203,138,42,143,120,51,103,71,208,111,86,214,64,194,141,154,245,166,166,118,155,33,64,245,219,166,226,53,60,32,223,179,32,115,113,75,215,152,187,62,122,123,19,9,173,93,255,233,222,178,229,111,175,25,227,15,187,3,99,129,132,253,245,219,46,45,218,228,112,247,60,122,225,56,221,10,2,235,132,80,115,186,160,11,244,229,195,13,163,110,109,32,124,247,175,156,227,97,75,86,4,231,167,71,154,202,179,16,220,244,48,71,199,192,230,17,207,164,94,193,5,62,24,4,60,201,159,176,197,195,207,146,78,84,114,70,6,22,72,252,44,231,106,71,105,82,222,211,220,247,247,143,41,25,209,26,156,9,193,146,108,41,23,93,170,190,252,165,217,217,195,18,98,52,181,230,205,246,178,71,23,105,5,188,58,100,73,248,116,100,90,46,99,152,245,54,120,71,136,108,250,12,4,250,84,18,202,180,222,51,189,97,194,156,232,89,185,13,246,132,133,79,188,27,222,253,73,34,165,202,65,71,238,67,8,119,127,139,247,30,108,235,220,109,117,46,91,153,202,88,96,241,196,98,247,170,108,186,107,217,170,91,225,41,3,177,227,152,182,173,17,179,110,113,93,19,212,143,182,154,130,80,219,228,236,73,218,64,120,105,110,196,152,74,51,73,175,226,134,98,179,132,213,247,15,82,178,144,153,207,139,206,235,155,173,42,61,216,204,50,57,168,29,169,79,168,101,144,207,52,139,52,252,185,87,173,22,108,108,225,89,126,16,234,69,60,60,201,39,144,178,249,227,193,29,173,68,45,52,106,61,84,126,50,4,46,114,225,130,138,200,68,185,12,233,251,103,139,127,188,12,113,15,240,217,163,206,47,78,134,16,129,129,206,117,50,114,150,179,21,15,230,124,42,235,33,212,2,135,78,207,200,29,235,175,138,189,147,17,49,17,16,42,250,107,115,24,90,216,8,67,98,156,159,39,206,253,244,152,6,198,153,38,138,103,158,88,9,220,101,214,134,186,233,100,28,9,155,104,78,204,15,24,221,109,64,157,116,254,174,65,138,44,60,74,108,52,197,70,233,173,171,12,114,156,170,204,245,205,253,143,14,178,127,230,21,212,77,160,246,201,127,181,243,210,34,82,172,151,131,243,2,199,72,237,57,242,25,121,239,38,235,184,236,102,200,110,73,46,66,194,75,170,176,158,97,57,215,46,93,77,130,93,33,13,22,69,83,191,242,73,56,204,98,211,160,195,164,63,211,134,196,151,184,138,77,99,60,227,171,143,114,108,101,71,72,250,53,242,120,35,238,162,250,254,180,217,81,174,105,179,55,132,18,26,211,237,81,245,93,53,29,57,72,146,255,86,67,234,223,250,204,129,164,65,95,32,205,149,140,101,32,152,40,112,228,146,74,140,166,245,244,254,149,43,198,90,134,135,218,191,195,235,190,15,55,22,148,205,155,21,138,96,75,176,26,189,154,19,79,55,47,119,223,40,55,52,127,192,193,126,94,239,126,184,32,250,114,195,124,253,68,253,71,206,35,52,138,56,111,110,204,144,184,112,44,103,169,32,167,73,26,223,5,80,233,46,125,144,241,84,92,202,151,252,133,99,52,202,222,78,233,123,200,19,33,178,231,200,9,30,100,60,40,172,69,211,173,168,243,247,241,59,62,24,226,226,231,29,98,56,57,249,168,62,148,119,110,23,198,120,229,233,241,121,253,51,211,239,111,61,82,231,251,207,77,220,56,72,3,169,159,255,193,188,45,70,134,218,86,225,185,160,2,4,36,109,32,47,79,32,59,20,98,31,48,26,120,7,226,29,232,218,172,94,217,219,239,62,91,183,191,28,235,16,128,19,229,95,51,23,219,236,184,232,193,85,248,149,233,129,29,4,228,212,94,60,218,115,200,25,89,42,75,175,171,251,131,89,129,211,182,29,180,79,151,129,23,131,197,188,237,82,176,14,249,173,73,47,235,254,214,238,30,209,171,255,137,254,7,2,211,159,117,238,70,110,17,53,47,229,50,50,182,214,241,82,36,61,242,161,16,98,38,231,41,60,174,37,62,150,7,1,215,200,153,217,40,69,10,145,225,213,235,72,65,41,124,1,121,219,236,92,215,218,84,40,206,63,66,80,124,129,132,95,219,5,232,59,23,138,117,95,235,39,81,39,63,192,46,53,4,27,37,250,30,231,12,200,209,238,102,203,92,7,11,200,191,252,217,177,19,191,219,116,231,165,112,168,182,48,4,88,20,176,239,124,87,97,15,226,92,207,242,146,246,39,241,255,185,95,137,186,45,77,161,154,246,248,160,166,88,188,134,244,238,155,169,194,203,6,228,88,7,142,170,233,187,120,224,224,23,149,148,249,253,53,14,218,54,158,157,124,210,243,91,254,117,234,214,209,252,89,61,79,131,132,60,206,29,183,50,87,213,98,35,38,23,214,252,202,60,113,77,247,19,169,63,109,1,63,162,234,28,184,55,4,247,15,48,190,16,96,255,217,68,118,245,126,178,50,246,174,46,111,133,15,8,76,21,62,191,163,67,12,207,56,216,35,230,142,179,131,128,246,188,205,119,218,177,111,38,15,195,174,183,96,241,3,145,49,188,223,14,79,222,94,114,101,161,226,108,229,176,0,245,133,214,254,30,238,185,156,4,82,93,118,231,191,17,135,37,225,235,115,35,116,190,96,87,0,189,242,10,219,119,112,139,167,36,225,52,240,112,244,58,83,72,111,24,222,10,13,31,120,246,240,86,68,248,92,99,204,220,127,172,63,109,6,196,142,49,215,106,214,36,207,26,88,122,83,45,214,43,65,13,228,86,193,136,107,179,121,229,29,173,239,170,127,7,33,70,46,85,3,131,46,234,129,65,69,10,138,122,107,67,60,240,100,82,91,74,138,57,192,253,115,238,34,237,35,77,16,120,226,228,115,135,46,209,170,81,181,98,40,243,165,35,72,176,29,173,105,73,125,122,54,242,236,119,232,1,12,226,165,160,185,204,29,67,237,96,22,175,66,109,147,8,83,6,225,62,85,127,133,97,44,20,127,107,136,251,171,6,186,88,100,106,240,157,152,107,51,236,111,159,178,48,186,172,14,19,29,155,200,242,123,38,179,23,248,190,199,242,187,63,71,98,68,153,60,28,174,25,148,245,103,74,171,208,254,253,220,130,7,20,10,213,37,231,80,98,67,162,199,242,193,120,50,60,225,25,70,111,219,197,64,158,174,38,147,133,113,139,25,172,120,178,118,234,190,246,244,224,9,190,78,240,169,37,25,4,52,180,39,91,78,41,203,199,207,216,250,180,205,131,248,110,236,92,129,85,103,32,107,88,136,127,97,200,101,5,146,190,191,238,23,206,154,200,94,106,85,133,218,128,37,128,5,118,57,158,11,235,101,78,174,54,196,191,30,255,193,48,69,228,37,37,90,167,83,238,246,18,195,23,205,217,68,241,5,65,150,142,206,56,77,9,154,241,152,26,205,122,174,1,202,52,151,201,215,177,243,87,190,247,15,39,254,107,234,193,3,127,190,216,201,63,199,85,192,23,247,57,77,199,88,240,75,62,37,239,223,113,204,172,155,13,188,188,249,66,28,5,50,202,151,84,59,55,116,142,190,213,147,32,216,190,162,231,141,127,213,127,249,212,109,65,194,39,71,84,9,63,216,142,133,175,247,4,170,137,191,72,170,66,196,151,250,149,86,77,175,62,111,29,225,151,29,121,248,32,56,145,195,35,173,24,191,212,192,43,176,188,162,54,64,173,251,97,162,108,255,231,249,250,137,117,71,239,103,20,141,210,4,32,32,238,7,2,182,93,209,247,94,30,179,29,28,93,123,127,95,83,31,15,100,17,242,69,117,4,143,106,47,108,62,60,102,127,129,223,250,208,57,115,197,119,114,74,212,130,184,105,25,136,133,128,140,146,100,8,63,209,241,100,239,1,236,123,166,30,30,88,206,42,146,75,222,214,14,170,106,214,149,216,160,6,1,239,200,65,115,198,179,180,211,28,120,140,209,79,89,16,48,82,125,113,79,39,118,175,232,38,221,253,173,79,249,16,112,48,207,144,50,17,187,63,198,163,97,112,47,113,17,18,166,177,246,254,248,62,176,75,137,206,238,3,43,236,17,38,130,131,124,78,48,114,133,141,162,83,178,213,229,228,5,47,117,200,242,114,252,139,150,27,69,244,204,148,159,173,218,241,26,165,100,66,61,46,116,76,52,227,220,217,49,212,22,216,219,201,23,212,76,108,5,120,182,99,161,125,59,247,92,208,1,49,122,210,44,123,136,26,135,49,184,190,143,233,6,129,95,239,162,191,221,78,225,43,23,123,218,28,71,65,234,63,161,213,83,74,154,74,132,142,193,137,252,182,209,50,232,32,93,83,84,58,152,107,219,245,124,204,149,215,86,22,13,248,202,38,170,127,168,201,156,54,140,224,255,116,149,26,23,81,208,222,114,216,92,206,31,90,254,127,28,157,121,60,84,223,27,199,199,53,198,216,183,72,245,45,251,190,70,40,132,153,155,140,157,123,179,70,200,154,61,146,144,61,123,178,147,100,223,119,202,46,91,100,95,147,61,134,144,61,82,214,44,191,241,251,115,94,247,53,175,185,247,206,121,158,207,231,125,206,121,158,147,198,110,175,116,142,9,215,107,175,116,117,115,103,132,254,107,125,1,225,229,96,96,230,69,176,216,29,114,71,178,246,255,30,107,22,120,97,200,57,4,251,190,158,166,75,18,245,153,38,57,180,240,225,73,102,67,74,13,95,251,17,135,155,78,132,121,125,45,7,59,238,139,123,43,59,78,188,116,109,69,104,246,93,33,196,131,53,255,224,35,170,107,200,193,177,184,159,13,13,99,3,164,20,252,179,241,18,199,191,100,7,176,101,104,58,8,10,181,22,141,180,52,125,248,35,57,151,22,96,85,167,38,228,207,213,113,55,143,249,141,168,187,255,157,185,36,215,66,221,204,28,226,98,95,141,239,253,35,11,200,51,150,214,230,64,250,210,78,188,19,134,49,150,131,143,231,70,183,8,249,97,44,183,180,130,156,131,118,102,220,102,64,232,96,28,66,170,251,199,169,253,225,173,164,242,119,25,219,20,85,2,129,158,123,165,194,225,31,49,81,209,211,51,168,197,95,4,189,131,24,123,148,223,33,51,106,154,141,34,141,55,76,194,100,236,232,59,251,123,36,223,151,231,134,56,93,34,193,162,203,158,64,116,182,180,134,156,118,186,215,200,148,47,206,187,185,162,52,241,17,23,52,145,185,46,192,26,3,65,156,61,20,215,67,116,148,134,6,43,217,10,12,46,250,121,31,156,63,114,19,213,245,230,201,31,28,47,94,188,2,112,39,227,99,127,212,38,122,159,186,203,228,114,149,93,193,114,170,83,196,182,50,167,103,172,102,89,103,250,23,4,136,33,175,16,97,238,180,84,249,145,112,80,121,217,72,8,96,121,35,248,42,164,133,153,6,110,217,41,212,89,29,14,139,33,143,230,110,223,109,42,242,43,167,123,202,124,148,38,207,129,244,122,102,94,237,172,235,186,69,118,218,243,207,1,7,113,154,119,106,244,84,254,141,208,177,118,161,162,103,135,135,72,92,159,105,84,59,94,254,225,37,178,125,106,117,74,44,134,156,154,63,59,172,249,140,176,93,118,137,77,85,46,33,232,247,73,235,175,152,122,123,161,146,63,51,127,240,27,16,103,38,209,151,144,106,84,100,102,244,76,255,241,53,7,44,208,245,91,73,92,70,170,130,102,158,26,23,138,123,37,182,90,194,167,235,240,214,168,69,26,124,183,52,117,82,37,134,92,238,23,190,211,94,229,183,229,89,252,226,74,104,145,88,104,32,31,244,192,187,137,161,211,49,230,27,178,90,67,156,211,188,67,106,82,211,139,129,188,89,240,190,55,113,216,16,201,182,67,231,71,91,41,125,212,167,71,62,92,58,28,80,199,14,125,227,220,205,38,138,147,209,227,162,245,91,170,120,174,13,36,193,156,204,220,183,126,254,25,77,198,217,45,206,105,102,165,247,13,243,42,245,151,69,172,85,116,214,109,44,96,183,167,84,234,248,192,236,199,163,203,111,175,175,158,226,185,98,244,127,44,170,229,189,80,210,251,107,188,224,27,34,142,196,59,114,213,170,168,95,191,58,75,79,190,113,141,168,60,140,184,56,157,136,179,253,226,192,42,5,214,183,188,236,171,139,79,255,8,35,14,195,166,201,150,213,68,21,134,33,103,28,165,185,87,105,147,116,103,152,162,100,96,81,54,166,40,22,146,158,45,170,182,68,83,230,20,176,85,94,130,128,197,238,164,41,231,48,151,23,187,105,254,151,194,214,224,213,84,12,7,143,186,186,19,131,159,161,137,83,178,31,129,15,170,107,61,4,95,223,38,158,140,76,190,68,19,13,105,137,244,63,146,117,27,148,176,30,48,179,218,211,105,2,187,137,134,23,25,58,133,164,155,30,236,193,234,158,126,32,82,221,185,12,253,138,53,222,98,184,89,121,231,161,26,220,77,91,210,36,167,124,112,234,230,135,153,122,124,164,4,174,242,238,132,230,107,150,235,74,94,106,223,143,11,69,129,161,212,125,223,148,108,109,5,183,204,91,76,125,17,74,96,199,189,209,103,107,21,200,23,65,15,157,70,144,136,156,1,82,25,91,151,120,207,19,66,34,230,82,132,40,30,19,62,59,76,4,231,88,42,101,41,30,203,251,125,209,129,144,73,242,7,19,18,105,120,190,172,217,195,89,62,63,176,128,123,39,124,69,41,251,64,230,190,108,90,89,29,39,198,150,145,152,71,153,70,156,129,62,185,226,167,89,21,41,8,192,22,110,186,145,104,197,220,251,154,131,195,82,159,64,64,211,220,65,63,130,223,194,238,253,4,137,61,55,33,191,233,96,140,39,41,198,181,195,67,217,243,79,45,59,65,96,59,208,120,82,237,64,172,124,102,245,70,6,185,62,38,220,176,100,235,32,238,107,73,31,217,226,13,251,148,55,112,119,47,6,228,19,89,19,164,98,87,254,126,143,195,30,2,240,45,250,255,246,157,3,205,135,122,184,206,143,211,8,124,97,166,126,83,40,176,139,252,250,172,226,28,240,3,92,101,89,100,141,242,217,148,175,101,165,123,169,76,172,12,242,154,130,175,238,215,254,253,117,202,254,75,79,236,91,7,212,141,117,14,178,153,22,35,173,87,36,34,118,46,180,211,222,97,18,252,32,220,20,86,113,173,232,214,67,25,127,107,204,250,125,14,14,69,85,241,43,228,178,64,12,217,3,9,184,32,170,205,82,105,96,123,72,9,81,200,57,63,72,132,89,191,94,98,178,91,108,80,182,83,226,102,227,246,26,4,181,180,237,199,29,127,58,166,203,144,70,3,233,1,230,4,253,125,116,26,239,248,221,94,213,197,15,7,188,210,0,113,136,246,174,251,245,191,28,182,77,155,126,8,82,254,119,193,67,14,154,3,75,220,84,204,117,41,207,151,207,197,145,77,126,240,112,196,160,112,15,43,89,7,45,31,33,223,207,32,141,167,41,118,34,216,88,214,124,130,124,40,8,250,95,25,36,236,86,245,87,37,223,146,185,130,30,61,96,247,218,236,227,211,129,188,150,198,75,106,55,164,134,49,112,116,250,102,109,89,173,74,117,198,205,52,204,176,196,103,208,153,169,100,175,232,158,205,95,71,18,83,17,23,218,239,216,10,45,203,254,156,101,174,21,171,193,208,27,203,170,135,120,18,197,246,103,147,17,136,223,196,247,98,21,28,129,97,16,120,218,145,182,20,222,68,114,105,168,59,244,212,93,136,224,151,242,191,204,171,170,117,63,179,182,152,245,226,39,190,185,62,190,240,163,176,182,205,188,211,76,25,249,66,177,12,4,140,59,171,31,145,239,164,52,187,202,10,53,62,117,4,145,78,31,234,112,235,51,101,94,129,191,84,217,108,6,65,52,89,54,91,164,237,217,218,76,182,88,86,224,201,52,12,8,213,163,196,247,55,111,58,186,185,113,225,34,93,176,180,136,47,197,190,102,139,13,62,248,136,62,12,21,25,27,170,133,119,238,181,140,58,237,119,81,63,11,179,34,107,54,212,151,164,174,40,65,229,26,106,139,221,185,38,43,41,12,57,177,196,77,61,243,16,26,222,194,204,93,95,163,15,96,183,169,115,68,252,134,144,103,211,131,47,74,148,163,24,24,23,100,102,25,162,78,33,64,179,110,92,182,202,99,10,219,144,152,247,240,56,65,86,129,63,251,111,101,44,146,193,64,121,225,58,191,195,79,22,9,6,46,83,222,164,56,16,77,44,26,155,251,69,94,214,225,146,150,193,187,126,60,28,138,206,222,136,221,82,73,8,52,205,84,52,249,43,7,2,35,159,239,125,165,44,151,248,218,105,67,178,25,50,3,3,226,149,95,132,119,203,80,237,37,239,223,241,199,127,133,128,218,162,212,167,79,130,50,21,137,52,208,92,119,94,97,135,89,250,157,125,93,206,122,231,124,40,30,251,85,166,131,188,1,107,191,219,178,185,68,198,49,236,33,183,3,80,16,82,198,77,198,152,97,247,121,81,34,206,76,239,93,20,132,188,182,40,96,204,96,80,142,155,147,215,57,234,142,33,232,149,208,195,248,78,215,248,41,118,180,101,72,12,2,94,21,172,222,123,206,35,175,71,202,179,19,72,114,121,14,211,203,156,144,172,71,136,48,68,161,237,127,18,44,57,112,119,35,134,10,238,67,71,170,234,189,167,187,84,65,3,69,179,82,234,121,226,3,107,116,159,16,229,45,171,29,95,236,103,84,215,155,155,145,184,137,246,41,234,211,73,131,11,16,139,225,43,110,170,9,193,75,212,205,255,126,48,98,200,137,236,31,126,53,89,239,243,186,28,212,79,159,170,13,3,118,133,171,98,207,189,50,158,221,122,53,22,210,83,12,242,2,21,216,9,205,226,91,169,247,37,196,27,231,117,225,110,153,197,12,122,197,45,124,32,123,155,212,224,89,177,118,56,177,68,177,167,112,13,166,166,85,77,35,73,4,1,2,242,88,251,111,228,1,223,122,152,47,191,232,122,188,12,218,112,87,140,62,95,166,242,244,86,19,226,28,86,229,197,190,94,177,24,191,156,157,235,242,245,56,36,183,156,212,102,40,44,176,45,64,147,43,152,225,254,9,83,197,46,149,10,134,255,101,137,96,94,203,62,183,199,181,134,199,98,3,121,48,224,212,198,35,30,4,165,220,209,69,133,246,184,120,93,220,223,79,177,248,135,91,108,14,111,14,25,10,158,225,73,30,150,108,233,191,150,81,228,244,251,38,249,172,161,250,162,190,48,72,236,96,69,119,40,89,225,0,68,84,131,29,195,183,188,149,3,198,132,119,228,232,101,135,129,41,16,56,85,12,249,174,30,55,119,218,87,179,225,59,185,124,81,239,247,172,234,47,123,62,185,22,207,8,197,176,22,8,180,45,24,9,171,32,136,136,168,156,149,94,90,165,93,204,255,249,33,85,149,5,232,240,249,127,115,48,173,16,231,211,95,79,73,224,66,103,74,63,103,199,215,118,4,63,160,105,149,91,70,206,12,156,71,170,156,104,102,205,53,145,10,112,73,120,95,43,117,39,107,157,179,96,255,152,12,1,119,139,140,29,71,111,163,199,170,122,147,166,140,237,240,92,99,247,159,143,251,147,107,101,150,12,84,138,214,182,112,32,245,188,39,92,69,19,21,226,21,236,98,109,218,15,197,10,190,242,153,254,78,73,37,238,148,11,178,72,55,140,29,34,57,221,49,169,21,101,138,211,144,155,102,90,6,215,47,250,197,170,247,84,238,210,52,233,29,198,223,76,168,37,240,56,34,164,71,28,233,132,161,168,223,116,153,112,34,240,61,93,84,207,70,213,145,122,220,247,236,27,47,139,176,156,145,20,177,113,60,81,86,9,223,147,30,197,36,20,137,115,174,4,73,233,7,168,183,56,197,10,114,180,233,223,33,232,123,90,231,132,248,24,191,16,67,37,173,105,126,32,4,152,55,188,104,153,161,189,194,198,206,254,181,79,153,107,136,196,99,233,199,145,163,174,253,227,237,92,167,38,190,90,60,215,130,165,136,97,64,218,253,83,222,165,17,38,14,125,49,228,249,180,216,149,246,58,5,94,187,173,92,87,71,74,44,65,175,119,249,175,63,162,146,21,209,61,102,104,12,156,43,172,80,254,111,228,165,108,214,252,221,167,75,145,86,41,16,103,27,145,102,143,184,220,208,88,163,193,229,12,209,8,8,135,216,53,13,181,99,53,220,250,103,177,35,51,101,76,240,75,177,3,83,138,62,79,62,155,63,40,124,96,77,135,69,251,23,142,107,175,163,213,158,23,226,234,174,223,109,2,129,129,193,91,154,20,253,215,159,142,43,112,176,134,48,95,204,239,207,39,8,49,79,189,24,120,37,120,245,170,208,108,4,113,160,52,127,33,128,64,32,123,50,137,57,56,181,87,205,71,67,5,1,196,249,138,120,47,15,160,132,128,1,129,130,14,177,160,190,94,255,27,210,99,3,248,119,112,55,91,251,58,199,138,103,84,0,62,46,233,68,27,128,209,231,254,97,133,34,100,2,84,22,53,1,97,149,19,48,176,93,175,44,83,153,22,8,126,103,19,167,227,140,134,144,94,249,245,201,58,147,140,25,251,152,132,71,122,12,112,129,106,117,63,149,0,207,101,82,218,71,175,190,149,89,64,209,100,139,63,56,133,104,142,118,18,239,215,164,152,41,130,56,171,138,127,13,150,194,18,146,76,194,22,163,117,239,97,192,181,32,87,88,205,64,221,249,54,211,215,67,74,23,16,119,117,239,174,83,162,218,74,199,189,247,144,237,241,123,14,228,108,164,143,225,139,203,110,198,62,36,87,119,92,189,9,227,19,195,65,26,145,156,192,144,110,147,234,131,88,129,121,99,252,237,156,132,184,148,168,16,223,164,156,230,176,240,78,114,191,175,175,239,233,81,174,115,163,131,117,67,54,12,240,100,118,243,135,209,237,8,97,210,216,62,243,230,129,171,84,237,15,210,126,255,244,200,103,159,87,103,206,235,98,67,69,217,74,190,198,206,217,92,71,188,243,230,9,101,2,1,60,103,176,45,101,93,147,36,238,254,64,86,222,201,128,192,210,66,193,79,245,187,47,51,47,209,133,202,150,243,13,116,217,72,103,198,218,57,47,120,145,220,170,169,207,46,36,240,207,2,231,90,47,202,82,113,167,109,198,224,79,151,56,103,97,151,171,86,8,167,226,114,56,46,32,250,187,62,22,176,166,253,204,46,173,163,199,157,138,137,163,206,237,132,180,238,8,142,95,155,10,28,111,11,81,92,96,60,28,1,129,150,236,215,117,225,186,131,21,119,27,71,210,214,210,8,254,198,126,220,32,230,241,81,143,117,80,148,33,73,0,132,116,32,187,166,41,97,121,76,127,70,151,169,135,246,135,144,44,230,230,143,18,222,104,197,36,18,79,190,219,35,228,95,179,208,118,97,74,98,254,170,207,189,227,184,83,77,8,121,125,135,65,67,34,174,40,146,117,181,196,226,26,21,214,102,119,225,238,138,87,205,8,60,169,159,71,221,120,103,128,148,69,118,43,190,220,205,193,218,50,239,197,229,115,18,16,153,84,243,181,27,181,165,42,80,44,238,126,211,123,27,68,78,253,253,198,60,88,167,245,200,15,119,165,130,77,144,13,69,106,66,31,207,172,158,213,19,42,233,207,97,209,4,3,197,245,188,50,50,8,159,109,179,243,71,74,125,76,152,112,106,123,245,33,169,16,231,152,247,226,22,215,120,239,93,244,199,160,178,147,43,114,30,71,236,254,75,170,27,198,244,10,247,159,122,157,29,68,180,13,115,221,144,74,229,198,240,115,12,255,222,85,151,27,162,69,140,114,119,33,34,96,155,200,54,224,75,175,50,31,85,164,77,24,251,213,123,108,40,33,159,163,248,60,65,228,176,115,56,87,140,63,22,19,142,14,12,90,177,247,160,235,197,188,37,57,24,54,96,67,137,200,55,198,99,116,217,21,145,136,249,23,211,36,112,116,70,191,187,88,162,111,83,86,164,7,37,255,206,30,65,143,166,172,196,121,221,108,7,187,221,37,197,242,130,161,195,119,187,167,74,45,245,45,63,201,122,169,133,77,247,176,171,7,153,31,79,101,211,140,28,171,64,209,55,47,244,8,254,82,48,238,123,216,198,167,134,192,172,47,177,20,22,216,104,214,146,226,92,209,253,180,111,79,41,16,231,76,117,48,154,182,221,116,98,219,183,54,240,223,136,176,23,197,57,140,251,175,186,90,90,64,74,130,56,131,230,174,243,194,28,4,112,188,210,113,51,53,16,105,45,219,73,63,225,65,139,245,251,47,25,59,29,85,229,22,112,85,156,248,252,163,134,209,164,217,117,210,154,67,167,1,249,54,17,47,41,127,16,244,180,186,198,151,139,91,136,24,121,175,225,40,221,9,95,169,89,184,185,79,91,237,16,23,17,139,117,232,33,129,0,167,213,107,134,139,104,141,35,222,61,143,239,151,17,48,109,89,231,145,128,177,231,136,64,115,37,158,141,12,0,163,83,123,239,230,155,88,246,123,179,167,19,85,86,165,95,232,177,250,18,229,146,197,141,168,12,240,210,228,29,120,21,217,127,234,145,82,211,179,255,165,228,115,133,132,225,192,40,107,201,54,231,216,250,129,1,217,124,40,215,85,122,24,221,135,225,80,44,238,232,36,87,57,215,181,243,147,133,128,223,220,248,72,109,173,244,50,143,249,166,87,1,171,23,250,255,246,241,10,183,148,221,165,199,210,163,189,20,218,59,183,237,132,24,138,245,24,196,247,73,223,38,63,53,128,109,130,48,202,91,225,97,165,52,208,125,105,123,63,146,33,18,69,182,49,35,119,105,239,240,231,199,75,78,71,20,48,90,213,188,39,187,139,224,23,106,14,22,188,215,200,32,202,171,243,252,101,183,100,99,238,26,10,76,205,90,6,98,84,136,54,79,143,159,15,89,92,51,125,212,116,174,25,6,57,163,250,167,251,196,155,19,32,129,5,163,147,207,25,23,254,87,125,90,37,20,52,103,76,2,135,109,130,225,208,184,182,252,48,26,25,113,61,166,74,218,198,167,183,176,225,175,191,250,228,139,146,232,133,177,32,188,244,235,220,96,94,160,58,201,163,60,210,136,24,135,53,166,248,160,11,118,140,235,9,19,125,74,186,20,89,99,242,228,89,198,111,120,245,74,59,31,207,246,96,122,240,173,99,68,90,76,35,193,95,18,145,240,20,63,209,164,80,197,191,66,113,250,65,246,174,243,2,121,207,250,98,178,116,99,75,127,132,5,99,138,208,253,222,255,210,62,156,176,33,70,89,93,74,89,64,96,194,110,214,144,6,120,46,74,218,228,217,113,24,15,135,94,105,95,227,88,49,172,13,222,233,37,102,184,157,6,163,201,170,247,222,41,241,187,147,86,187,127,247,104,211,130,129,234,94,126,153,220,215,173,185,66,52,176,41,61,7,12,236,13,91,136,180,122,149,102,185,141,132,235,228,200,193,188,89,254,17,17,219,86,97,116,122,103,183,222,80,41,64,171,90,162,156,9,63,3,56,111,172,251,25,117,187,169,17,242,191,196,128,75,54,215,248,201,213,183,247,73,184,110,19,226,125,125,33,44,176,48,150,36,135,127,74,185,80,133,240,124,251,119,249,78,146,236,255,77,255,167,12,62,37,130,144,52,251,158,107,58,110,207,17,81,55,90,135,18,32,24,56,232,33,151,97,154,55,125,34,96,55,88,141,39,35,240,191,64,217,28,245,239,252,227,253,129,100,245,146,239,216,215,233,46,18,161,108,92,9,248,249,203,124,142,90,229,80,247,219,204,214,88,235,82,31,7,116,33,189,155,234,125,72,237,97,171,99,190,168,63,164,18,37,203,167,146,113,12,242,158,132,81,153,20,172,200,235,97,30,4,156,88,7,129,188,44,9,25,86,127,143,99,174,107,71,114,205,4,216,139,115,194,203,110,186,1,141,141,98,202,1,8,193,222,155,112,232,202,19,173,248,219,202,3,228,95,210,231,188,223,181,14,241,165,175,141,168,151,218,198,40,151,233,87,0,228,8,136,147,230,113,248,21,242,34,21,77,243,78,189,165,195,168,11,190,15,73,146,184,244,122,65,99,108,76,102,210,19,203,73,55,88,179,92,104,178,151,190,83,237,123,37,21,128,56,215,40,198,38,180,11,226,209,116,88,220,39,235,11,254,87,73,234,97,184,79,121,98,255,203,133,253,207,58,81,17,186,15,208,40,108,186,107,180,227,150,68,164,248,134,195,38,239,9,100,96,163,240,78,112,238,254,64,74,15,49,158,139,229,93,49,62,50,64,91,110,120,102,63,34,79,136,3,105,238,117,113,126,216,242,137,245,147,120,57,254,255,247,199,33,13,171,182,24,80,108,47,242,38,203,107,28,236,241,239,105,187,217,68,181,106,161,57,169,89,240,229,28,79,162,217,179,44,28,190,189,56,169,74,92,181,85,236,131,229,28,249,186,91,193,108,146,113,80,233,86,111,19,84,141,229,141,121,194,164,236,116,118,184,82,135,138,240,255,118,44,142,28,24,81,27,10,63,63,176,60,159,192,152,144,210,130,5,196,139,119,182,69,6,155,173,88,229,4,58,228,167,192,110,186,61,185,187,210,7,30,99,196,142,240,206,225,245,185,223,177,76,4,116,62,211,75,241,113,205,138,53,53,211,174,160,110,115,247,64,35,16,183,211,174,113,183,162,204,96,64,98,196,82,60,246,202,118,14,52,138,240,180,226,132,1,142,176,60,201,78,1,122,133,235,115,155,230,157,51,23,235,207,41,41,113,71,164,159,26,179,40,169,179,98,177,183,52,90,189,190,249,168,38,7,184,16,113,211,24,30,51,84,232,13,252,90,247,31,176,110,151,77,166,16,185,221,8,243,158,96,148,158,56,5,173,82,110,231,82,196,30,19,120,85,117,239,36,191,36,92,119,14,17,160,128,246,216,33,228,71,179,189,239,119,241,1,143,234,80,171,87,135,85,8,247,95,97,10,59,165,201,54,199,3,236,17,151,240,32,208,254,249,229,167,240,247,127,88,198,202,21,80,241,228,160,205,245,177,131,21,151,222,111,157,126,124,231,178,223,93,33,228,221,158,25,147,4,9,218,253,172,245,67,184,48,150,192,219,123,30,229,103,235,102,137,192,42,185,103,216,27,2,223,183,89,243,56,60,217,38,63,63,149,177,165,52,4,187,137,221,102,63,62,218,204,24,2,234,40,155,6,228,6,4,6,253,1,93,13,10,35,105,202,229,242,255,44,77,33,36,99,107,140,38,221,85,7,149,200,81,203,255,94,238,106,243,199,188,122,122,11,95,246,56,175,112,145,170,3,92,35,240,251,98,155,162,84,213,118,83,214,161,25,31,106,138,3,57,150,224,251,72,90,215,63,182,144,133,103,202,140,15,66,122,212,39,27,197,17,133,142,140,26,143,95,169,111,134,144,79,163,227,212,24,254,6,79,45,196,146,142,211,22,64,54,212,162,34,71,57,46,75,87,186,113,101,159,5,107,8,207,199,85,122,75,229,244,83,179,236,192,29,180,149,29,199,106,66,230,131,132,201,57,209,78,119,70,146,216,123,20,96,104,96,91,198,135,131,226,69,82,58,64,172,253,252,26,33,31,44,254,147,180,42,168,15,138,152,141,145,83,222,1,121,233,198,118,86,118,143,115,222,188,194,235,144,218,240,194,206,95,127,166,167,204,122,38,139,176,104,145,190,246,15,131,187,13,23,195,146,52,15,254,134,176,38,14,66,241,6,32,160,200,101,175,165,118,207,99,133,39,120,158,113,112,21,180,113,89,124,96,226,250,83,174,41,243,51,84,181,75,45,182,41,216,15,217,230,231,92,50,126,148,143,206,225,35,1,87,95,86,175,55,121,29,179,227,253,180,220,162,47,206,119,217,98,85,239,143,8,67,88,232,4,46,106,8,109,106,243,171,170,45,82,22,39,232,236,72,109,127,253,246,36,154,253,54,176,252,203,96,137,105,163,70,146,38,79,129,194,31,10,229,173,8,211,123,203,191,81,240,165,206,61,71,197,22,238,190,182,215,156,46,84,251,76,193,255,134,29,248,138,17,26,86,86,147,176,214,41,241,253,170,76,116,231,33,175,51,108,179,207,198,65,74,65,115,147,42,235,199,89,26,76,193,86,196,159,189,144,56,52,230,86,26,105,235,199,157,123,11,236,208,173,9,82,86,217,26,225,115,90,247,33,210,113,192,147,224,11,191,12,70,204,183,96,75,150,90,91,105,2,49,69,194,155,27,177,31,107,74,72,223,167,21,250,91,114,194,56,63,51,14,62,1,62,85,26,118,145,171,98,167,115,16,175,74,96,230,251,181,91,7,219,215,33,165,77,183,78,24,176,204,228,22,31,1,148,111,27,127,223,44,221,255,13,34,53,223,124,99,190,169,233,192,127,165,194,1,171,64,198,30,62,103,246,75,148,97,145,147,108,77,197,166,63,240,24,6,78,43,44,249,1,186,237,119,24,39,17,223,193,53,140,10,202,205,61,134,96,39,90,155,195,163,103,183,137,177,90,123,247,206,207,230,92,202,71,157,216,208,101,187,93,216,240,183,29,5,103,127,83,221,151,141,58,215,105,227,209,160,141,84,224,179,193,252,178,237,92,182,159,228,67,42,156,80,193,165,197,142,216,154,185,252,22,170,44,5,201,61,59,140,45,57,168,248,100,136,154,161,23,201,204,11,233,116,105,243,247,189,154,189,221,44,101,126,208,243,120,249,42,109,22,136,212,118,25,127,155,215,50,150,248,151,92,223,246,191,42,144,87,123,207,119,244,108,105,101,153,24,63,199,223,5,192,188,125,153,133,125,81,234,154,84,15,43,20,5,30,84,192,192,86,97,167,36,80,72,100,102,194,186,105,244,8,134,108,184,157,153,244,243,102,198,196,200,51,15,158,155,185,96,5,201,236,117,24,97,186,216,119,25,59,229,71,42,145,32,96,134,144,179,80,189,166,244,158,226,240,172,172,48,17,94,93,196,40,133,149,91,90,83,124,15,250,164,64,204,14,33,77,234,12,174,235,92,67,12,34,156,45,126,213,53,128,209,207,236,207,104,28,141,222,23,235,124,28,187,212,29,9,14,199,254,156,38,127,82,157,96,70,126,83,160,110,231,55,97,188,88,189,177,208,168,59,105,157,204,120,116,5,223,14,3,34,133,185,194,211,79,253,232,30,17,4,32,218,151,224,127,139,199,230,169,2,215,55,248,184,185,101,42,221,9,207,231,252,97,50,209,54,69,183,24,4,13,64,62,24,240,174,15,17,30,52,159,249,117,111,173,191,213,188,23,94,149,49,143,201,219,34,107,12,146,179,65,9,252,70,128,200,152,15,227,54,227,156,46,227,147,155,12,196,158,72,48,212,171,186,56,247,207,174,69,23,0,122,54,191,35,248,97,30,229,134,157,135,134,15,225,187,58,239,36,16,63,97,156,202,98,120,156,229,254,102,136,139,45,171,124,69,12,12,172,85,144,136,116,154,221,168,248,20,157,26,78,171,73,184,223,46,171,159,170,11,81,251,125,94,53,89,84,204,32,90,164,34,28,94,225,86,127,72,170,101,200,247,241,55,134,92,79,176,239,235,159,134,101,3,121,102,26,146,192,247,152,34,210,246,39,202,91,180,140,88,138,106,255,176,234,97,188,199,148,237,150,166,60,219,85,11,182,31,138,35,149,219,112,129,168,249,238,227,237,185,166,64,218,251,185,137,12,246,160,13,109,244,227,36,181,243,89,39,84,99,126,59,212,2,1,44,189,204,76,139,147,110,26,234,19,26,34,1,197,218,235,6,175,199,85,150,75,104,51,84,179,98,180,239,212,193,159,53,84,218,63,133,21,180,199,164,187,24,146,125,83,195,134,175,116,108,151,154,188,9,216,183,33,63,190,183,166,128,45,249,249,106,32,103,58,88,62,219,217,249,149,175,46,193,159,21,179,63,24,84,53,8,193,87,253,211,99,43,114,129,120,185,135,101,81,217,239,131,249,255,189,141,40,211,238,185,232,7,196,39,115,208,181,191,113,73,225,242,43,206,167,24,21,68,201,212,193,113,138,80,238,239,118,236,170,40,49,132,148,41,54,75,165,115,123,147,40,83,129,20,78,126,33,142,156,41,61,253,22,145,99,227,131,224,85,98,173,14,6,113,112,69,113,236,64,162,142,204,101,26,76,69,43,31,38,252,90,201,140,94,109,210,216,29,171,91,254,49,55,165,192,213,131,133,227,22,247,151,85,57,209,104,202,178,96,127,16,120,90,250,107,83,221,37,124,118,197,231,91,80,7,4,217,95,157,183,171,249,235,183,225,75,84,192,203,95,175,130,229,237,205,252,148,255,235,39,215,152,251,165,243,191,75,255,129,171,236,59,127,196,238,15,157,123,94,10,119,187,250,142,149,224,63,116,140,13,126,109,212,111,57,157,110,42,217,222,6,1,248,247,131,137,240,39,83,42,119,185,3,144,209,202,67,36,230,47,52,170,237,245,236,197,124,131,162,38,56,190,95,244,83,87,235,129,17,98,249,162,99,249,67,82,67,248,39,181,109,225,17,70,89,145,95,243,252,146,223,9,42,67,64,253,252,107,7,101,92,45,253,75,215,23,236,54,9,216,2,34,198,98,126,127,116,181,241,157,123,41,133,99,7,226,171,49,97,137,70,182,232,195,191,27,183,0,247,6,31,24,71,189,215,34,32,124,3,70,145,14,126,166,217,187,12,161,175,86,111,24,126,251,94,93,75,121,120,16,151,148,43,142,52,14,219,210,8,223,230,25,77,103,135,169,73,180,32,94,109,115,135,135,45,117,121,165,196,159,123,43,45,58,217,43,36,21,7,239,164,134,222,207,221,103,138,18,9,90,132,120,145,98,47,111,74,112,200,60,17,232,62,240,81,160,196,148,0,20,231,47,22,174,43,56,143,102,98,112,204,223,76,158,222,186,232,71,114,87,184,46,237,122,134,76,45,108,18,70,92,92,54,185,209,202,112,49,223,29,160,47,3,23,32,171,255,202,209,148,203,17,199,110,127,71,80,249,113,244,27,186,113,36,12,16,191,5,222,146,8,200,180,120,128,171,238,162,111,93,157,178,39,228,227,151,167,212,205,112,16,18,150,177,51,216,35,215,210,100,131,112,25,140,247,224,225,197,77,183,115,252,254,235,236,155,69,68,138,176,12,54,244,205,194,242,68,233,62,103,200,51,212,215,145,242,51,200,134,68,52,111,114,53,203,252,221,122,29,30,188,91,5,243,82,244,31,57,148,90,213,55,69,43,6,239,162,60,176,128,87,157,59,239,221,7,243,35,242,28,239,19,57,62,64,161,212,180,193,184,249,94,74,41,193,24,114,215,8,13,112,245,202,176,29,211,74,164,236,243,7,85,166,246,155,110,112,55,85,123,161,117,231,191,146,144,143,77,236,108,214,126,248,223,183,95,171,172,109,127,169,52,20,108,51,185,49,143,0,129,61,140,222,177,10,2,193,139,20,237,250,33,91,10,243,6,180,177,175,173,35,249,168,24,158,198,80,28,185,129,200,166,241,111,111,171,196,58,196,230,214,195,109,198,99,65,192,75,96,101,151,60,156,75,143,232,115,65,70,131,7,132,84,101,75,73,101,168,14,188,46,247,225,20,17,83,76,240,3,75,79,77,24,89,163,169,130,162,115,86,80,68,32,210,235,237,62,171,255,37,84,107,110,64,190,32,190,17,68,10,185,84,33,140,214,68,126,122,92,161,183,103,149,5,129,187,22,230,159,41,163,82,162,81,152,79,0,255,26,8,44,119,121,143,191,222,135,122,60,100,70,125,111,227,64,94,100,69,220,162,111,173,228,29,106,171,104,150,197,251,240,170,249,230,136,28,95,240,159,180,28,13,133,35,205,2,184,0,16,140,251,89,122,176,161,227,181,47,189,172,74,73,248,253,35,3,77,198,39,242,161,85,178,58,26,28,166,152,112,235,254,63,38,205,53,194,196,171,179,29,228,11,207,48,42,56,103,231,27,119,229,38,156,167,5,191,135,184,198,195,188,131,24,56,206,201,58,140,42,165,82,200,0,125,133,112,253,245,193,185,113,223,227,184,92,172,133,57,230,37,12,252,233,181,149,57,78,45,221,157,125,187,230,79,245,10,162,53,233,191,211,205,16,200,36,103,19,163,85,251,48,27,2,206,17,239,15,181,235,199,151,191,44,176,66,217,3,16,210,247,247,181,84,237,59,122,221,110,160,126,50,71,61,132,84,199,133,105,48,154,23,141,231,117,167,207,231,24,193,104,226,146,166,3,131,57,183,111,51,187,249,159,53,17,96,199,61,200,62,153,125,168,101,119,106,251,185,192,3,101,168,31,244,123,185,255,251,13,109,172,180,116,71,235,149,120,241,213,157,54,225,25,139,215,214,121,181,8,206,192,27,103,16,238,229,48,255,204,244,227,209,222,1,206,4,136,213,243,226,188,146,184,131,13,123,179,23,193,54,47,108,15,138,65,244,147,61,161,242,188,60,239,13,208,148,86,83,133,11,234,39,106,45,217,20,189,246,148,132,217,55,233,231,17,19,140,67,244,255,150,57,250,216,220,144,166,175,199,100,104,3,174,82,183,91,13,72,254,21,58,103,109,204,229,183,186,1,135,190,201,204,254,66,193,179,70,201,201,36,26,249,94,23,99,43,165,227,198,104,222,69,78,251,112,247,198,72,192,111,168,27,27,29,163,203,90,188,145,59,153,193,147,21,196,168,77,78,182,249,37,233,233,184,70,7,96,163,193,73,244,25,68,214,143,127,155,124,148,90,214,162,173,202,9,44,83,128,188,100,99,127,106,151,123,71,131,95,213,203,139,119,175,67,59,157,228,99,250,243,255,28,229,101,58,95,181,93,185,60,64,218,104,63,247,90,221,127,149,92,242,154,58,39,162,134,192,167,86,70,169,218,133,206,171,15,154,221,174,57,58,226,73,250,62,219,119,132,247,81,46,169,150,126,150,199,214,104,243,247,126,24,109,242,114,12,233,141,116,201,119,219,33,198,172,123,111,202,253,90,153,93,9,40,22,63,31,33,95,7,145,112,236,7,220,156,232,7,20,63,4,205,158,198,17,120,121,235,187,22,141,174,25,32,223,64,7,151,245,193,188,42,213,127,37,57,154,95,2,51,70,183,80,50,158,32,47,247,230,11,163,175,237,248,157,119,172,253,237,149,95,32,74,97,63,71,235,75,57,51,91,230,88,55,245,2,57,56,52,148,136,195,50,82,73,153,42,70,74,12,32,189,117,193,127,213,197,139,19,91,64,71,118,199,76,252,101,204,186,180,96,223,243,164,143,22,197,3,14,232,255,250,213,224,208,107,217,21,146,110,245,51,254,10,44,217,59,249,26,16,242,178,173,121,4,227,161,198,137,94,254,126,15,3,142,160,55,175,152,239,44,48,223,161,66,233,13,111,177,173,194,54,36,217,224,196,246,92,117,136,215,71,166,242,186,54,237,245,165,37,223,234,210,178,76,115,128,108,154,111,251,46,8,96,218,85,135,41,250,238,44,53,239,186,71,165,93,27,32,21,241,153,138,231,36,97,197,63,251,103,25,27,163,11,226,84,118,194,146,182,14,162,4,72,187,46,239,70,16,67,56,62,81,246,158,27,125,228,60,27,161,89,111,83,20,8,254,113,241,178,78,243,95,130,191,76,155,55,10,180,1,1,119,192,215,138,22,253,1,141,107,47,76,224,206,101,67,53,137,250,196,255,190,162,251,243,150,95,83,167,217,185,182,10,172,166,33,45,210,9,225,89,215,154,125,98,202,8,124,219,131,150,1,173,179,114,95,101,119,137,123,246,129,132,247,247,196,97,165,59,38,234,30,85,98,190,163,24,184,202,18,45,237,187,197,36,156,26,111,204,132,233,85,131,181,246,54,19,207,247,60,247,242,98,206,48,127,137,115,65,64,155,196,97,60,50,58,50,204,224,63,43,243,63,242,132,252,70,43,51,189,228,69,86,147,215,113,26,131,44,188,232,95,183,140,82,119,187,76,151,116,159,253,217,3,3,76,17,98,211,104,255,104,78,210,140,212,162,154,129,103,24,90,149,161,101,159,42,121,199,85,84,23,74,220,128,65,130,64,223,130,133,33,5,218,55,171,60,102,179,236,109,50,188,83,211,107,128,199,251,214,70,89,201,20,243,48,33,32,164,119,223,90,4,44,115,119,76,147,77,191,135,168,30,19,174,243,250,247,241,254,244,243,47,165,21,217,101,47,138,225,157,197,206,20,188,206,195,17,17,7,63,33,123,201,247,96,1,218,156,51,169,185,106,179,137,77,231,178,38,53,14,195,255,37,7,149,48,242,194,241,184,45,201,105,109,158,246,255,245,157,82,239,85,26,57,194,5,72,223,63,18,130,11,248,75,42,243,167,22,5,7,77,204,211,124,252,114,8,255,223,230,169,124,143,172,76,238,151,165,3,69,252,31,109,224,102,160,108,238,11,34,76,231,99,41,8,52,121,5,3,226,189,56,113,129,77,11,220,166,252,241,177,11,49,12,184,246,170,130,127,112,59,197,242,112,2,211,252,119,56,148,218,109,240,244,63,181,73,196,189,9,161,223,29,104,120,21,177,247,173,33,59,234,63,82,53,106,190,201,80,85,66,254,105,35,19,144,195,72,198,243,15,86,165,47,30,131,59,9,69,77,135,185,65,55,117,179,116,41,217,160,40,24,112,202,120,197,111,175,200,160,84,237,228,53,253,1,5,85,104,149,232,202,172,196,255,237,33,55,152,83,52,179,2,109,232,247,124,155,202,242,78,186,136,174,47,101,198,199,13,57,4,45,173,31,28,42,245,161,229,102,122,124,89,109,241,36,19,170,179,147,111,50,212,16,209,127,121,158,53,75,64,171,238,110,179,186,1,146,174,217,12,36,69,84,207,136,64,94,197,157,245,172,206,244,84,153,224,208,159,151,174,219,92,240,109,237,233,249,167,95,92,22,127,67,21,20,30,207,61,77,204,123,20,54,58,146,115,227,121,217,46,64,29,12,2,163,52,92,218,20,155,146,198,116,236,183,76,71,14,177,37,129,247,52,152,141,243,94,252,14,101,222,191,124,42,3,114,134,20,54,126,251,101,176,253,47,70,38,194,87,68,226,98,62,167,90,142,84,64,6,181,129,186,13,88,91,226,73,198,104,117,218,194,98,235,194,178,148,194,50,4,233,6,149,15,194,10,249,162,25,29,217,134,245,176,17,191,223,179,239,208,51,34,16,247,121,46,137,28,232,39,217,74,31,95,232,179,220,164,124,157,244,133,62,231,55,177,67,195,47,45,147,134,244,43,233,224,155,134,103,202,26,92,48,240,180,13,39,30,59,221,143,88,158,193,186,60,255,2,175,210,187,13,58,180,39,14,144,38,196,228,4,73,5,178,241,3,139,136,143,239,119,236,36,146,126,191,251,175,68,15,70,19,149,140,218,71,10,246,148,206,212,180,28,249,57,19,158,71,41,114,250,13,117,193,68,145,145,145,215,116,20,38,118,59,103,235,246,150,107,242,189,178,235,155,183,136,248,193,80,116,246,88,66,227,47,33,183,108,20,203,167,103,15,64,100,82,252,215,156,110,26,23,163,230,207,12,54,123,146,24,91,18,193,1,199,148,241,60,20,139,194,123,50,34,117,8,201,227,118,156,172,202,175,190,60,122,201,242,42,109,0,166,87,98,103,210,211,235,198,16,46,124,78,242,112,246,26,4,8,205,223,240,31,157,31,186,226,155,112,181,91,238,54,150,86,213,249,59,247,195,242,241,126,37,241,79,172,151,71,193,85,162,246,111,19,238,39,94,181,89,110,8,202,186,2,8,73,215,195,166,1,51,152,142,185,242,145,118,48,147,16,244,211,246,215,186,218,95,242,51,26,230,234,94,109,90,40,84,70,66,211,41,251,55,85,58,165,62,107,209,180,23,216,205,92,241,39,203,155,71,247,110,240,10,189,196,60,57,220,29,67,196,161,164,74,33,66,37,101,184,155,131,250,12,3,141,245,249,146,127,207,10,207,7,63,141,161,23,163,97,220,251,158,154,216,15,97,118,84,111,227,120,250,30,127,194,172,35,251,61,102,62,126,253,68,215,25,160,2,59,141,178,161,4,236,221,226,115,36,220,31,60,35,55,43,251,70,136,79,124,182,131,46,121,221,100,223,199,205,72,137,252,111,112,55,243,216,35,19,129,154,91,196,111,90,207,166,137,133,102,35,222,176,41,127,124,208,30,165,75,215,12,252,248,241,226,162,254,239,67,246,10,190,165,37,88,106,87,133,94,1,19,254,72,199,141,129,163,139,124,248,147,255,148,4,199,87,66,190,54,175,180,114,56,169,247,39,122,188,164,255,238,19,108,19,148,169,44,48,128,236,162,236,247,253,213,36,72,73,200,207,11,157,168,72,85,77,10,94,162,112,255,23,199,32,14,53,246,161,165,98,215,226,205,43,22,123,152,145,18,68,186,197,127,67,127,191,94,174,254,208,136,158,21,77,240,59,107,150,193,134,148,158,212,143,247,18,102,245,248,157,224,2,171,146,177,79,61,14,51,14,235,223,46,123,85,17,226,221,169,190,75,24,19,175,81,112,228,119,210,255,23,134,113,183,204,195,227,182,59,127,5,255,163,163,151,250,173,64,136,247,18,231,212,136,115,59,7,44,213,126,218,241,91,40,116,98,173,65,146,190,240,69,61,170,67,168,32,128,5,79,178,182,185,245,35,178,149,73,166,69,25,23,188,28,10,175,158,98,4,168,162,236,28,232,168,101,201,162,20,15,224,2,210,197,176,197,101,207,212,224,26,214,84,154,151,242,240,42,131,249,7,49,239,135,165,129,251,197,44,101,202,223,64,218,4,21,141,127,204,33,244,134,89,121,171,52,198,132,239,71,18,241,144,137,240,216,209,213,87,34,53,216,87,46,246,183,87,224,28,147,15,40,222,182,62,20,176,33,140,39,42,204,149,71,35,22,17,83,151,10,114,212,118,54,176,54,20,123,248,83,203,164,99,246,215,212,113,169,241,44,176,13,85,118,197,254,214,175,217,224,245,68,193,31,161,244,23,243,209,73,194,249,13,70,196,57,79,27,15,83,37,64,52,113,118,82,228,121,45,223,22,171,197,70,211,185,59,184,115,187,127,202,68,231,103,173,12,131,50,35,199,102,2,134,31,112,211,75,80,22,160,201,88,175,250,84,235,132,129,118,152,54,191,188,21,111,190,220,89,27,20,208,239,167,69,208,251,170,191,195,40,43,39,32,64,239,10,206,214,18,19,174,150,205,35,224,144,196,96,69,215,6,211,182,191,24,186,50,241,188,254,60,158,70,10,102,8,47,136,190,61,132,9,103,73,72,74,248,130,162,218,33,45,227,199,39,179,129,64,37,246,161,90,228,76,120,164,162,228,177,89,57,5,68,219,212,121,250,112,126,182,76,172,244,158,145,192,166,217,160,250,213,234,179,40,33,25,41,238,40,211,253,231,134,4,222,185,34,216,243,181,105,191,12,163,119,86,240,209,144,28,12,213,169,230,221,19,172,150,107,68,222,32,105,254,96,72,224,231,205,101,83,109,191,253,7,143,83,191,255,41,26,128,1,203,232,92,126,102,54,245,183,212,136,66,176,210,27,198,173,144,89,43,113,41,10,80,68,156,198,247,207,203,129,72,61,232,131,150,111,154,222,190,53,203,198,190,66,201,69,191,156,10,228,123,252,87,25,213,150,159,233,53,19,32,50,121,178,230,109,43,62,228,223,67,6,90,52,226,162,126,170,34,148,91,73,254,50,127,146,244,219,12,71,93,152,182,108,253,84,248,145,237,65,148,207,142,161,193,111,127,76,175,140,179,141,203,149,166,251,209,200,47,175,195,75,195,8,252,25,216,158,116,223,174,54,80,232,185,96,250,71,114,200,185,78,80,232,123,121,160,183,67,4,54,237,18,209,40,136,131,204,107,54,138,78,188,14,204,220,3,238,73,163,97,222,152,5,228,138,109,72,33,213,101,207,213,87,33,106,152,34,206,205,6,205,216,143,127,12,148,37,56,49,60,227,80,52,103,127,155,242,98,206,159,71,47,233,168,16,33,132,124,145,223,219,61,53,191,19,112,240,172,226,164,232,112,25,236,184,207,160,248,100,84,69,209,208,178,126,123,204,241,30,8,76,244,140,253,164,252,53,198,50,28,120,19,5,169,98,119,130,239,59,152,223,218,184,167,127,137,175,236,151,2,43,193,47,255,190,102,34,238,118,210,105,38,22,233,119,71,29,6,22,67,185,248,223,155,203,231,186,17,95,119,118,161,2,1,117,75,239,71,170,207,242,135,175,170,63,75,36,117,6,181,218,251,117,110,139,164,238,61,178,241,63,183,161,247,199,134,207,125,248,117,247,25,137,70,89,206,107,73,94,10,74,120,21,87,93,123,135,71,94,30,229,159,196,23,103,248,130,192,59,63,156,160,14,150,125,50,1,207,123,178,202,57,132,248,187,255,230,145,178,7,247,252,55,190,161,217,229,187,112,168,151,219,47,143,62,233,235,164,87,206,138,218,213,26,224,208,117,140,162,146,29,5,25,21,151,224,60,123,209,123,172,150,72,191,104,77,81,190,209,202,9,5,56,71,19,7,218,200,84,244,60,222,96,241,108,122,112,122,248,153,46,153,160,223,206,31,31,91,83,27,52,95,246,172,139,13,32,130,87,101,246,154,106,121,26,168,177,145,153,164,66,46,238,16,96,222,31,122,172,245,187,127,250,148,5,70,188,71,92,172,23,113,139,115,199,19,85,93,165,157,204,223,147,193,190,253,84,87,179,209,184,143,247,34,206,24,161,188,86,137,177,229,222,59,183,123,63,126,9,125,166,176,153,197,245,147,48,30,190,85,49,95,182,254,27,60,89,126,53,37,49,246,98,191,127,151,216,159,239,215,247,61,76,171,19,234,168,48,225,12,237,74,124,14,110,140,143,73,111,165,107,114,188,230,152,212,160,20,55,113,115,117,191,89,79,97,74,196,116,7,195,79,230,236,236,226,155,3,17,133,91,166,26,85,144,94,172,167,174,201,89,138,87,72,172,236,110,208,177,247,96,122,153,75,166,246,63,254,81,93,48,37,9,18,126,42,0,243,114,108,62,31,139,19,31,40,73,200,50,89,167,162,196,126,163,111,221,44,63,75,125,180,103,44,226,206,94,184,3,2,230,196,193,186,42,228,67,232,238,154,37,218,218,120,72,144,117,190,220,237,18,43,41,226,123,177,85,237,251,36,60,137,9,3,247,98,28,45,111,31,245,206,204,243,6,105,54,84,246,148,215,235,107,210,53,83,5,157,102,110,127,215,64,222,151,139,193,74,85,85,69,77,172,89,37,223,118,196,224,225,113,11,245,233,241,184,45,118,129,202,254,12,164,22,12,108,101,143,113,71,31,118,209,46,96,216,110,169,132,178,107,185,45,207,53,154,21,70,240,217,21,191,185,66,227,10,3,191,27,247,248,23,210,200,12,142,16,8,144,200,111,160,239,109,230,164,99,215,244,152,12,234,94,76,165,112,240,64,4,241,162,141,75,203,3,130,26,155,18,83,211,34,230,194,136,57,214,83,55,24,47,206,199,64,34,105,235,180,123,27,197,92,39,126,109,33,20,118,167,15,55,6,134,64,224,79,241,248,99,186,183,193,5,21,151,69,182,111,17,238,143,110,145,46,170,252,229,76,46,187,246,223,161,255,142,8,255,87,15,143,84,107,183,30,200,204,151,176,178,177,123,19,117,45,66,156,216,210,248,63,203,141,65,158,188,163,30,184,32,61,51,34,134,138,131,139,74,135,69,156,94,147,30,11,24,215,155,253,144,50,46,62,206,197,196,62,32,43,133,128,163,14,150,100,187,2,249,159,7,126,137,234,39,239,180,195,3,63,76,44,59,248,222,231,229,20,157,143,174,197,225,249,194,252,19,172,56,27,149,202,122,16,216,211,99,121,168,224,30,199,216,135,137,7,157,50,151,175,190,70,242,182,65,56,119,90,126,244,178,231,99,246,60,90,102,159,175,131,96,168,76,118,123,252,254,247,127,205,22,130,126,86,169,181,236,130,166,139,127,228,52,79,155,178,143,11,3,242,156,200,65,180,156,243,238,227,149,27,119,107,80,185,39,121,200,87,16,218,83,235,234,139,27,240,210,149,154,214,1,178,179,135,32,175,106,246,65,226,217,254,113,121,166,175,69,68,240,131,139,249,141,230,127,118,252,215,73,119,176,152,176,155,74,48,32,51,133,22,120,244,52,246,147,255,218,155,205,227,57,2,143,97,20,173,29,248,4,168,216,223,176,159,238,157,95,212,135,229,243,227,238,116,135,43,180,229,155,109,122,192,192,233,234,125,145,120,1,170,37,151,183,255,238,101,102,104,211,34,98,131,66,136,13,137,15,81,214,224,34,153,10,24,237,219,111,128,223,247,253,215,168,243,133,242,23,121,24,84,128,118,155,241,218,139,159,115,37,159,87,249,155,205,0,22,72,13,63,30,213,104,122,40,131,154,252,234,61,162,11,118,116,195,22,201,235,25,63,92,82,35,251,124,125,171,33,228,211,135,108,81,55,123,137,78,178,151,132,143,255,62,192,23,146,130,145,53,74,223,27,134,78,234,158,142,124,202,2,67,121,43,98,242,186,90,140,26,80,238,44,55,231,41,240,124,171,11,87,139,185,139,223,52,243,19,161,124,107,206,32,81,141,18,40,156,175,116,84,35,252,139,60,59,199,71,24,40,175,92,19,195,172,152,143,202,210,87,81,213,11,193,192,70,197,178,176,188,190,152,108,187,49,102,163,122,240,162,158,168,39,113,57,253,165,79,124,106,194,210,179,41,8,135,219,65,43,46,5,112,179,247,222,222,237,240,7,9,250,79,240,43,78,60,124,84,154,135,51,225,167,128,246,166,185,61,222,101,225,211,129,126,50,13,151,190,254,17,188,42,93,93,82,213,118,249,50,177,64,29,36,142,18,133,1,169,250,124,97,68,30,53,110,168,123,105,81,109,13,66,106,7,112,24,75,204,4,98,25,1,156,194,61,7,16,71,228,220,243,120,139,204,240,46,234,195,131,185,85,106,8,233,190,190,174,202,192,78,119,127,49,119,197,171,216,8,2,158,112,227,155,236,90,189,119,52,247,202,77,28,88,64,94,237,192,155,131,47,131,197,155,179,51,252,28,152,26,96,94,58,243,221,26,7,207,189,87,184,155,241,155,42,17,24,126,155,132,228,234,92,107,170,58,162,66,190,254,173,167,112,40,129,247,229,35,220,102,210,118,166,130,114,159,70,12,68,88,238,61,20,241,218,66,10,253,135,250,239,135,247,117,176,0,53,140,30,29,146,114,247,97,154,93,138,245,55,199,50,175,56,74,92,249,45,237,246,143,158,127,71,69,66,10,107,79,66,9,195,116,201,127,221,51,60,68,142,79,73,193,2,81,231,239,141,190,245,7,34,241,47,105,153,244,170,9,252,36,56,168,191,149,43,182,237,77,146,21,125,213,4,68,122,196,127,197,253,202,89,143,160,86,40,165,54,181,132,144,52,121,77,198,58,204,129,42,112,220,219,57,75,67,44,96,253,73,111,137,205,160,104,33,197,168,150,117,232,29,200,251,11,147,93,233,30,213,133,138,110,83,162,182,219,131,144,190,159,158,106,140,209,34,223,176,190,112,124,230,181,9,1,139,95,245,118,31,183,153,244,11,72,220,112,66,252,190,89,68,12,118,149,216,127,220,183,181,25,72,21,104,125,134,181,253,220,193,119,46,157,138,200,152,91,156,227,104,188,11,33,13,166,12,52,110,2,252,201,10,58,68,83,254,54,132,241,90,208,37,134,176,33,191,82,166,53,36,213,41,47,142,156,109,15,150,13,99,103,165,79,124,66,247,138,77,22,198,249,145,41,41,45,34,149,64,19,111,173,69,3,50,2,95,140,157,58,202,252,72,138,2,138,131,28,214,80,4,127,56,118,210,124,183,33,134,145,225,154,133,126,14,242,162,94,185,106,210,49,57,233,65,179,62,194,102,85,147,224,15,57,102,143,29,84,170,67,30,118,57,102,253,3,48,228,169,95,243,196,53,44,31,239,176,186,221,31,185,250,30,182,113,169,174,61,146,245,168,39,165,109,77,177,187,107,2,163,185,179,35,226,52,31,30,4,158,237,142,121,144,44,65,72,87,161,141,3,69,239,55,200,90,163,163,75,137,140,218,235,12,253,143,212,22,171,30,180,135,222,187,113,158,187,14,135,242,110,78,148,183,112,221,109,158,150,121,193,232,79,136,79,190,122,62,241,97,15,171,128,185,169,153,149,229,45,236,235,192,123,235,151,185,114,141,125,143,185,244,202,201,46,214,179,57,221,244,85,187,238,47,38,71,214,166,218,110,17,248,163,113,75,174,13,195,252,137,195,221,234,251,217,69,255,0,193,24,203,25,203,190,211,85,141,83,220,177,23,28,202,208,110,115,217,233,108,54,88,130,42,156,174,205,24,91,148,211,33,212,249,59,202,67,143,48,48,186,230,242,64,94,178,157,245,203,78,178,62,165,168,77,233,195,189,203,240,78,123,81,141,231,89,228,121,120,69,207,127,114,87,22,9,239,103,79,100,224,199,228,248,235,87,127,165,170,253,76,97,192,238,3,181,184,58,187,11,18,48,126,74,43,140,5,87,81,237,80,186,211,107,89,153,12,22,173,80,199,29,24,112,232,190,39,34,85,177,203,196,212,37,230,144,65,224,9,109,29,115,217,133,105,247,244,87,204,1,72,217,51,140,202,127,140,9,127,0,62,138,183,8,26,54,97,27,59,236,139,248,31,14,19,91,70,251,77,100,64,117,251,28,45,6,218,123,53,66,106,105,28,91,135,22,185,241,162,38,25,14,165,116,27,108,34,109,188,69,26,47,108,57,70,117,29,6,68,26,55,165,89,253,94,150,239,237,189,208,240,104,195,134,7,118,24,55,77,165,71,249,229,231,218,142,206,255,33,92,239,85,22,167,106,112,248,43,151,249,253,78,103,217,133,30,174,75,231,206,30,235,110,178,83,20,114,146,194,5,188,217,245,13,27,3,233,129,136,209,219,248,233,61,2,207,4,191,89,167,138,97,178,215,87,250,225,172,17,133,33,191,106,94,179,91,49,67,131,101,186,95,154,245,247,51,216,49,88,189,247,22,151,204,239,75,20,27,65,201,250,155,253,181,216,88,138,136,247,180,20,233,222,126,52,23,107,10,20,77,146,187,57,173,78,17,229,126,231,234,207,194,63,215,224,85,119,65,239,164,198,197,134,71,255,86,116,92,136,111,99,163,239,216,207,120,21,56,200,84,127,162,160,126,10,200,19,244,117,173,105,252,205,253,48,22,171,79,117,12,47,246,65,27,198,234,39,165,141,187,172,3,152,41,9,239,99,114,56,180,56,179,88,147,224,199,41,16,234,35,183,98,155,240,36,154,68,110,221,161,10,7,125,42,106,35,76,234,92,16,154,168,34,19,253,80,5,72,75,168,107,24,69,124,16,231,45,242,15,122,110,196,190,217,90,69,43,217,234,232,1,227,208,123,242,41,101,52,48,202,224,239,85,47,75,57,8,8,105,144,98,232,195,13,164,55,42,91,71,74,242,106,163,139,249,228,95,70,242,39,237,77,239,33,74,117,124,33,28,162,61,169,166,52,161,166,254,114,108,8,17,128,132,144,234,209,215,254,27,99,165,213,78,112,177,236,112,8,25,216,136,89,232,57,24,20,148,109,66,66,232,35,198,98,104,85,102,56,117,226,125,86,25,84,176,228,116,159,150,48,30,142,70,4,57,98,158,120,113,240,204,138,85,164,196,97,121,57,170,161,177,47,7,127,16,10,126,243,8,86,209,65,70,124,63,23,2,113,254,60,126,135,8,109,138,166,1,129,169,39,77,223,53,35,206,62,148,225,79,76,254,117,129,161,150,237,33,154,181,127,239,228,103,228,86,228,216,132,64,5,40,81,50,197,185,105,129,212,9,206,73,25,208,134,160,39,9,123,134,134,167,211,151,175,31,34,37,102,81,132,235,59,236,201,121,27,46,114,188,71,229,55,144,101,32,218,215,185,128,195,41,220,163,145,186,149,228,94,224,227,161,74,215,254,10,73,159,237,242,143,219,36,100,166,155,187,218,252,0,229,195,135,43,37,140,130,165,213,205,220,157,220,48,58,160,7,165,244,165,3,77,117,70,118,70,199,71,114,177,127,150,107,134,101,104,199,199,252,48,168,160,213,236,162,190,150,91,92,226,243,106,178,49,242,13,197,205,63,16,82,34,89,91,131,106,199,51,33,109,105,230,207,13,3,184,192,207,159,140,52,114,126,158,188,246,8,19,235,250,111,128,52,68,240,43,117,206,214,185,30,226,187,37,253,23,96,192,149,62,127,250,87,192,159,175,169,129,198,248,122,36,193,31,123,89,122,15,83,132,246,1,161,153,126,205,69,102,16,242,206,162,192,35,55,25,184,140,145,55,159,245,33,61,52,60,254,211,206,100,125,214,231,83,113,135,70,53,124,9,46,32,206,222,24,223,58,73,13,110,57,162,16,69,224,33,164,124,78,113,42,131,161,39,18,6,245,119,212,136,8,124,181,55,39,240,166,249,17,202,139,85,70,225,254,111,66,188,125,32,151,191,113,70,71,21,252,136,249,215,173,44,168,174,89,237,215,251,107,27,239,154,50,253,136,23,246,142,225,2,250,236,100,235,149,65,252,43,235,98,157,104,76,44,132,100,249,179,246,144,49,185,87,225,237,247,73,150,34,53,136,83,213,21,154,18,203,139,83,54,229,35,235,148,184,2,175,102,153,105,58,9,88,135,168,179,232,230,251,4,233,131,5,89,124,87,198,158,77,203,194,209,62,133,199,145,193,176,243,234,231,83,131,14,249,26,10,117,13,180,236,131,22,109,254,177,156,228,178,25,55,75,81,81,11,233,12,182,67,172,154,168,159,136,139,122,244,116,40,123,228,121,6,66,71,59,156,215,94,227,206,245,215,80,219,192,140,111,249,66,205,255,247,11,240,168,63,177,163,43,208,204,45,219,97,4,129,135,86,9,90,106,191,31,147,55,229,34,94,78,62,7,105,239,170,193,212,122,27,30,242,145,222,56,132,114,13,198,22,177,185,22,59,49,94,114,116,221,167,243,230,42,193,95,187,207,91,72,249,155,189,189,165,157,111,145,228,34,129,177,165,218,92,115,89,156,43,109,115,182,235,216,122,70,42,142,212,227,125,165,65,85,56,171,159,104,73,180,175,233,1,118,203,236,28,122,46,203,189,124,122,41,68,32,87,123,26,4,134,144,246,42,106,123,60,117,114,210,70,24,180,3,134,156,219,190,39,206,181,204,21,19,253,237,155,215,161,10,216,241,192,205,33,25,185,165,84,213,148,191,21,47,55,7,242,2,213,27,77,25,135,186,253,126,60,158,147,63,40,224,208,64,54,33,109,42,18,30,170,126,13,167,95,97,84,23,245,51,154,174,43,115,214,108,180,15,214,156,38,138,47,214,223,54,36,137,198,76,239,236,20,241,165,63,34,134,129,187,71,43,34,236,36,151,147,243,63,186,200,230,147,18,198,3,119,136,61,5,179,79,84,81,117,222,159,132,30,2,79,180,103,193,26,91,7,33,160,157,167,22,101,18,204,203,190,56,159,216,53,190,25,160,253,131,57,133,75,31,6,234,43,139,248,37,93,120,131,159,102,149,63,154,240,36,248,129,205,211,151,51,66,242,242,33,60,111,171,180,254,193,128,215,215,117,233,57,241,31,165,241,106,113,36,149,190,132,251,53,191,175,248,171,100,114,212,252,39,250,87,219,7,109,126,21,74,235,235,91,239,223,194,124,19,156,175,62,114,192,232,64,51,75,165,1,39,109,42,115,136,213,133,52,15,162,188,235,39,237,27,127,87,157,38,183,192,252,129,90,16,12,220,108,216,224,86,168,97,179,247,202,42,75,90,55,1,113,42,217,140,41,39,159,120,45,57,28,133,10,138,205,224,213,74,140,18,69,95,113,182,82,9,233,22,146,253,241,69,189,174,155,153,192,119,149,223,197,243,45,186,191,71,176,180,140,79,182,28,245,102,248,230,242,248,43,14,191,10,129,64,238,29,85,62,104,104,171,75,136,105,145,114,88,230,38,121,88,166,235,231,145,144,16,117,196,50,95,248,129,24,118,199,109,243,223,129,216,89,105,231,57,21,61,156,52,2,2,38,220,111,76,223,132,90,205,167,206,110,93,22,150,128,67,211,205,20,149,35,34,157,24,138,71,74,103,67,62,193,4,127,57,248,142,162,241,63,20,218,29,199,242,219,4,4,172,127,24,127,167,136,126,158,232,173,82,184,205,253,26,222,73,200,75,29,114,223,72,17,46,54,43,182,120,101,14,175,158,176,173,173,150,168,82,209,181,104,243,213,39,198,105,171,12,185,140,214,170,174,248,105,152,189,114,81,74,240,25,26,56,223,125,209,36,75,124,245,43,203,170,130,173,191,36,216,49,44,174,163,237,187,36,178,155,166,164,17,77,214,132,177,37,217,84,131,82,63,110,196,232,205,126,37,98,19,190,232,183,154,47,174,174,32,25,16,34,145,5,85,73,195,59,105,161,27,123,235,45,142,129,114,121,54,59,164,75,80,116,125,167,43,126,183,161,244,119,121,197,173,56,210,114,204,250,77,251,89,40,101,144,3,132,95,208,137,147,43,64,64,139,85,84,245,20,115,52,226,75,176,172,212,181,20,136,151,35,154,191,119,181,143,56,173,246,94,117,255,77,34,130,95,228,88,238,58,28,252,180,205,158,174,172,65,116,5,170,96,80,171,220,99,123,93,125,231,133,246,251,216,254,61,104,167,65,205,35,126,176,120,41,49,29,171,250,35,219,4,194,161,220,84,225,40,146,193,154,255,112,216,143,40,25,168,2,39,184,65,197,242,62,249,78,152,135,3,181,48,17,198,246,79,78,254,127,76,145,6,193,215,191,55,16,217,232,17,198,79,117,181,39,120,149,133,152,104,47,180,175,128,24,27,190,242,193,241,207,115,198,182,29,91,15,149,109,218,54,104,103,241,231,247,233,165,217,21,155,198,195,22,148,193,79,184,155,148,163,152,75,221,61,53,192,107,111,138,142,91,1,164,101,218,76,45,222,87,193,151,39,9,175,238,245,71,131,221,68,28,55,199,238,236,55,87,155,211,59,255,171,191,3,2,226,126,170,221,97,64,27,34,30,169,213,242,223,198,192,6,197,222,214,110,122,12,201,54,117,197,41,150,142,24,66,106,242,111,36,51,122,39,38,102,23,228,188,106,82,1,187,201,246,164,87,184,14,23,223,4,154,59,253,193,104,93,204,63,85,77,190,78,140,141,223,135,194,79,158,98,102,187,138,198,41,171,173,92,133,63,156,238,57,162,122,79,8,254,163,94,73,92,179,0,162,220,249,207,50,16,20,0,11,174,86,132,37,110,21,213,138,160,152,212,99,149,143,177,252,111,150,4,198,171,252,155,207,19,42,85,51,218,243,9,249,98,241,13,200,90,248,62,48,207,201,182,161,161,19,182,249,121,207,213,163,246,32,33,33,90,108,162,147,165,135,192,155,173,185,252,159,55,41,122,103,78,230,56,14,54,176,192,26,213,232,91,209,91,180,94,163,235,9,148,218,56,2,47,58,23,143,56,52,51,185,168,49,47,240,72,196,193,161,81,153,236,249,228,138,27,228,108,26,195,85,237,95,192,80,180,243,225,47,7,222,27,185,148,226,19,204,14,11,131,234,68,110,9,142,138,249,38,28,206,110,188,24,198,3,24,247,198,44,76,64,83,145,130,66,159,52,142,75,148,136,16,159,90,0,215,96,34,83,89,112,70,52,229,252,4,88,64,58,156,197,49,24,46,233,160,177,141,37,69,35,192,2,250,138,202,166,126,147,49,207,96,26,155,70,118,51,208,70,102,39,182,166,63,49,73,30,37,149,247,7,245,118,128,180,212,211,240,245,9,163,89,159,169,188,66,162,63,2,2,138,27,189,174,194,138,238,229,51,193,7,95,156,132,65,0,223,183,60,25,61,48,85,202,46,183,146,44,73,122,225,7,93,77,102,188,183,251,117,107,62,187,225,89,9,252,156,45,73,238,115,157,192,207,47,126,8,231,96,231,232,240,63,93,10,137,17,8,74,221,188,54,45,21,78,109,126,138,236,195,103,141,120,214,253,162,25,79,23,4,53,8,120,116,71,126,163,180,176,103,144,146,247,110,35,187,172,125,107,80,237,174,155,135,14,35,121,101,79,5,106,245,35,140,235,54,83,213,188,56,95,73,63,74,224,21,179,159,56,82,201,230,89,131,170,2,172,215,247,239,129,73,149,15,220,157,129,81,178,139,4,249,40,38,120,68,30,80,135,177,161,62,170,200,197,95,37,185,151,34,62,200,247,195,24,9,173,222,22,101,74,154,247,228,46,234,20,77,175,187,41,11,85,72,218,143,255,51,170,250,211,22,118,165,130,97,242,244,226,124,98,107,101,42,174,30,74,190,182,205,217,16,38,24,45,152,93,240,211,123,123,34,228,195,104,40,77,37,193,15,150,54,144,131,24,109,134,136,204,62,110,87,166,121,109,254,152,28,215,151,3,214,249,50,100,104,168,206,114,12,11,80,44,37,213,76,25,149,113,124,134,170,145,94,28,67,165,227,166,81,127,92,245,226,223,71,159,77,39,202,189,197,147,24,188,138,212,143,56,79,242,86,142,197,85,82,118,128,209,25,221,77,194,82,9,94,86,25,227,8,126,178,35,8,201,179,160,149,226,122,64,124,186,204,71,102,176,175,2,3,181,117,36,34,195,123,52,245,123,225,100,44,236,93,16,210,251,100,45,37,33,245,181,226,226,84,190,105,210,87,184,32,214,63,50,178,242,146,251,149,186,201,160,52,202,102,182,94,178,61,187,153,222,140,224,130,171,205,33,199,77,49,108,40,33,233,181,215,17,178,69,12,63,217,220,246,238,247,128,200,169,75,31,121,115,180,162,233,81,244,113,150,225,211,226,72,205,172,32,177,112,113,214,208,55,37,182,91,51,108,132,241,181,247,169,133,235,248,193,117,6,201,40,45,164,33,182,36,145,190,51,36,155,203,23,72,136,13,102,221,39,7,187,175,56,127,248,96,25,149,238,21,44,116,150,220,121,141,16,223,28,149,123,118,39,77,129,107,146,47,56,193,86,194,251,169,71,139,156,123,186,227,171,23,45,252,192,191,218,42,121,31,90,172,240,219,10,213,154,22,33,70,125,10,48,238,106,255,222,246,140,108,227,221,150,202,165,201,251,67,152,221,134,238,145,231,197,95,168,129,162,119,110,210,247,110,106,107,217,83,112,88,170,186,123,81,81,208,132,90,207,223,128,180,140,178,63,141,95,98,24,161,142,187,90,74,153,73,12,2,163,188,169,253,42,229,92,121,110,244,59,115,38,207,65,100,253,100,149,62,199,131,145,150,228,249,89,171,246,29,16,199,151,125,180,85,176,223,120,158,209,78,233,198,169,6,227,84,4,189,44,11,57,235,37,6,56,106,111,243,54,96,138,46,149,108,63,135,135,178,45,195,75,255,8,215,33,96,155,25,140,178,128,128,144,38,149,215,159,35,129,225,119,132,231,177,175,22,54,120,112,240,95,126,215,95,173,224,57,24,200,245,179,20,246,146,60,122,196,179,124,117,254,245,34,4,56,173,167,120,204,136,58,179,152,61,205,249,169,247,233,98,190,204,90,121,64,244,114,214,246,113,162,158,236,173,33,229,247,108,146,113,91,207,239,254,121,68,138,51,102,249,64,224,131,54,30,241,4,196,130,144,153,110,133,70,225,57,212,77,183,83,243,79,216,72,243,126,125,70,118,167,130,12,136,116,40,251,160,63,87,94,100,96,152,168,255,171,184,26,14,213,145,88,94,141,42,191,65,90,193,66,253,173,231,162,94,233,126,130,81,148,209,3,209,237,165,228,39,130,186,218,69,44,130,189,250,79,190,104,229,135,150,122,48,80,19,248,204,204,113,127,93,163,123,82,175,54,205,101,207,207,25,46,32,201,110,75,180,126,152,20,60,71,33,20,187,48,71,240,127,199,11,198,213,195,158,75,201,188,122,57,85,73,112,104,88,102,204,211,155,58,52,52,53,188,165,163,76,223,48,69,177,22,204,168,27,222,22,1,113,126,46,255,170,69,46,244,190,229,153,211,182,147,92,101,236,253,104,254,172,185,158,144,133,155,239,118,171,105,228,139,92,71,62,75,230,96,163,157,74,54,203,165,155,142,170,75,175,163,27,219,177,80,197,159,240,189,211,177,193,127,70,82,236,5,103,71,155,144,26,171,223,110,158,253,76,105,130,175,207,206,61,133,99,8,248,24,251,125,218,128,46,180,228,113,232,98,196,225,197,252,235,189,103,247,149,143,122,240,197,243,167,25,229,182,115,35,186,203,127,207,222,156,167,167,149,166,48,115,9,190,194,147,140,216,126,153,14,215,253,217,225,103,63,29,95,161,13,119,199,176,109,160,169,72,249,104,190,143,116,165,105,12,128,128,114,142,69,183,122,61,223,27,46,153,165,102,165,16,184,155,120,239,148,66,184,249,1,113,254,239,184,107,148,183,97,222,66,34,92,62,21,17,9,197,46,213,204,87,151,120,8,80,13,190,230,3,7,197,64,207,91,175,244,103,7,195,21,107,86,165,213,51,199,21,252,243,155,76,84,159,200,8,250,218,75,38,210,136,122,184,63,56,60,40,96,80,10,14,155,247,207,137,84,175,180,120,69,74,112,46,188,77,208,230,127,115,175,137,215,80,142,85,158,204,109,125,4,87,172,29,94,254,97,170,148,197,135,184,77,70,156,100,109,221,30,75,203,254,228,108,214,109,54,203,120,147,127,64,245,38,53,24,189,189,217,19,241,241,153,166,97,65,18,234,122,0,234,162,190,35,44,98,72,145,143,138,6,178,253,97,114,128,13,127,211,81,234,170,158,180,236,150,85,226,9,204,163,180,109,131,145,83,85,78,60,166,123,248,243,127,50,206,111,193,213,255,42,138,56,172,179,47,151,107,248,213,14,94,154,133,250,153,253,246,127,106,29,55,38,164,250,70,155,246,196,128,29,173,116,14,100,106,89,140,71,13,43,212,195,62,172,96,55,91,182,162,222,167,50,190,25,14,174,143,41,222,155,48,47,176,119,150,82,74,174,73,74,253,239,18,199,113,138,118,17,253,235,233,127,89,94,233,113,21,196,41,175,4,43,48,225,136,77,105,149,131,127,203,12,119,111,179,81,46,179,130,171,210,99,191,91,182,202,14,254,17,81,86,51,254,71,15,2,6,20,101,86,212,250,47,145,199,218,85,171,242,87,96,96,175,219,134,199,191,147,225,69,109,240,227,47,162,209,176,77,109,38,235,23,21,37,85,26,138,155,51,51,141,50,4,126,105,163,16,145,146,98,209,147,26,30,12,74,94,0,129,127,28,190,75,212,232,68,127,231,231,111,240,207,29,176,64,173,127,227,87,22,102,1,86,135,222,3,120,153,224,31,143,234,186,185,231,198,240,41,31,242,85,127,114,205,99,1,88,240,115,150,241,173,238,167,204,190,195,122,75,88,16,88,232,112,51,84,111,47,86,57,69,46,24,81,122,95,212,191,117,190,152,77,73,28,247,12,154,194,60,36,248,211,194,2,110,17,127,108,214,123,255,93,47,155,44,18,24,56,232,254,41,109,23,233,97,93,40,165,228,222,24,12,227,40,220,6,167,5,184,221,128,111,69,211,17,11,36,108,182,77,152,23,149,47,25,28,249,40,99,117,186,130,255,177,161,164,88,154,19,17,185,167,86,163,242,127,190,91,173,12,144,146,26,205,197,211,42,68,239,109,225,34,69,198,14,177,64,110,207,157,191,86,204,251,95,164,128,203,225,50,247,176,188,189,61,19,198,91,111,45,206,63,94,226,74,131,142,47,252,243,226,72,255,175,217,128,145,76,197,29,212,47,60,31,150,241,115,65,122,238,143,216,56,86,122,155,213,118,168,128,106,56,121,250,173,173,31,123,66,69,24,223,123,83,144,247,165,22,184,210,241,94,55,255,181,235,137,105,236,55,60,73,87,208,192,167,48,65,170,194,34,1,203,162,157,61,56,180,141,72,253,143,202,64,144,106,32,243,247,206,87,111,33,92,85,219,198,207,142,6,110,65,90,143,91,5,182,121,226,188,1,68,82,50,249,177,90,95,143,181,136,77,70,58,33,192,245,88,224,161,246,151,217,1,138,211,167,215,206,0,60,201,67,109,9,157,88,31,225,253,216,225,47,10,255,194,32,206,210,254,77,23,29,196,131,162,154,116,119,13,111,22,16,137,150,33,122,155,151,24,50,219,88,190,209,50,151,14,238,4,118,36,229,71,184,57,58,226,12,238,163,154,230,230,194,136,179,247,34,26,92,47,54,113,119,124,185,170,62,119,211,56,243,73,53,17,2,145,91,26,216,243,57,124,18,4,78,3,29,77,85,51,143,53,79,53,233,173,202,137,160,29,211,215,119,108,120,114,199,126,216,115,153,42,234,205,98,194,137,237,31,238,190,171,149,200,38,90,143,52,95,153,196,136,29,88,148,218,90,59,188,167,189,36,122,68,36,37,135,81,161,219,220,240,73,139,90,127,248,84,59,148,157,195,240,98,61,52,169,190,208,142,138,86,90,11,254,192,144,0,227,16,18,185,162,212,165,55,72,83,106,73,28,145,4,63,60,121,251,108,242,85,86,239,3,195,31,10,124,228,185,23,235,165,13,77,139,191,210,3,55,81,251,252,187,68,88,149,247,46,233,35,31,25,228,158,210,78,209,162,125,250,224,2,168,186,186,44,59,68,131,244,97,227,219,60,42,36,28,90,238,111,174,164,169,44,64,69,123,185,194,201,213,29,142,254,188,142,199,207,93,105,12,21,61,71,167,157,220,134,86,111,209,94,77,190,17,103,206,212,104,113,242,167,81,9,14,181,222,251,118,150,31,249,136,184,221,167,208,247,80,253,98,254,38,95,120,154,174,245,125,238,253,242,129,177,67,152,151,194,252,93,190,211,121,106,96,179,217,51,96,87,15,66,234,237,127,76,101,212,199,183,210,56,157,47,247,209,97,121,253,215,18,140,159,252,72,122,184,137,211,191,187,213,6,163,195,50,145,133,246,74,170,84,82,187,1,187,189,39,3,164,77,182,235,175,139,157,101,41,186,248,234,139,198,72,65,164,80,108,9,142,3,193,143,13,191,39,145,175,31,64,248,253,205,81,223,182,252,153,227,51,178,116,199,170,119,32,154,172,218,118,235,184,225,233,123,98,131,129,31,214,101,32,175,77,187,246,163,227,178,226,61,179,95,249,7,87,233,96,222,65,51,101,161,141,207,63,201,37,43,208,143,188,15,216,80,71,89,235,164,235,108,141,34,32,98,109,208,228,249,69,191,180,244,227,204,56,36,169,233,21,207,210,58,114,216,134,98,204,231,97,95,226,22,177,244,194,203,86,22,83,16,77,92,145,210,172,148,226,227,141,106,249,141,116,70,192,171,195,102,65,107,252,150,61,148,211,52,207,252,212,149,192,80,106,231,216,199,14,2,58,50,241,244,97,225,151,222,65,54,36,90,76,54,22,27,149,146,100,11,17,211,89,100,32,82,59,250,219,228,27,201,165,127,239,234,98,237,236,114,225,2,196,255,90,186,234,176,168,190,38,124,185,44,221,37,18,18,11,194,210,165,162,63,3,118,47,40,41,112,175,96,34,32,32,45,24,160,148,148,194,82,130,32,221,41,44,173,46,8,8,138,32,210,221,72,73,119,73,215,183,232,247,231,121,206,236,217,153,57,51,103,222,119,159,179,103,72,245,181,57,135,207,69,77,253,130,115,74,1,108,201,176,146,152,123,230,221,56,199,231,237,231,22,97,24,56,11,208,141,116,230,171,150,185,214,12,220,217,249,142,57,190,111,92,136,137,239,36,143,19,214,177,17,207,169,29,161,16,52,13,172,244,207,22,42,187,158,59,144,194,228,70,194,147,117,221,195,129,175,29,186,178,45,236,60,82,39,113,1,195,29,37,87,182,232,20,91,206,42,142,30,172,36,66,120,243,180,242,3,194,230,127,5,232,47,52,4,207,71,199,254,27,252,242,81,82,83,120,104,11,236,255,181,9,131,76,248,136,3,227,140,173,138,142,195,183,106,197,0,66,173,73,220,146,162,44,224,35,119,168,251,53,187,170,128,96,60,5,69,197,236,172,108,152,122,164,147,219,174,110,67,117,204,213,237,145,59,149,11,68,179,87,202,223,242,27,96,106,178,227,251,138,42,166,17,117,233,60,6,84,181,208,12,63,81,218,245,23,161,243,39,128,61,81,145,177,143,100,53,154,88,72,132,248,7,179,25,21,189,14,33,126,215,35,248,60,185,197,23,39,66,241,106,51,87,108,52,170,21,193,184,229,222,235,25,52,215,158,52,180,248,52,122,163,30,39,91,26,228,222,75,28,26,43,33,166,100,173,98,58,145,194,9,75,157,151,187,101,103,189,0,123,48,40,103,131,196,7,218,204,37,160,89,135,72,115,87,61,89,214,110,8,212,55,115,255,165,121,93,244,247,13,95,189,143,182,19,72,221,247,170,9,53,169,27,239,224,104,238,248,229,118,18,159,31,19,171,157,9,12,72,19,136,54,171,9,13,246,35,197,235,103,74,153,200,242,57,52,235,253,84,140,215,161,222,156,97,144,193,221,161,112,132,94,162,8,53,168,123,6,2,33,203,79,202,26,62,51,76,68,37,254,170,213,30,4,79,145,219,190,48,56,109,39,243,131,234,171,11,253,15,200,146,162,26,107,228,176,239,81,145,98,200,229,28,227,5,129,131,105,175,71,53,140,48,211,255,177,162,209,111,117,143,251,193,126,214,25,142,125,78,118,66,52,227,167,58,227,241,251,89,93,33,75,233,75,141,102,252,210,7,125,175,97,80,232,67,84,143,139,28,170,62,245,36,245,214,126,48,4,142,255,48,31,160,175,141,62,68,7,109,242,232,78,34,152,192,42,43,245,197,166,21,86,186,63,148,10,170,151,112,186,130,11,135,74,89,68,233,114,12,91,74,134,226,56,182,1,231,248,124,203,78,138,169,174,65,101,181,240,141,39,54,128,145,156,92,44,48,134,9,93,59,236,28,166,143,131,168,69,28,230,222,79,211,106,223,53,216,231,152,165,231,134,192,188,126,152,200,54,112,143,111,176,138,177,163,121,8,177,4,114,251,151,250,109,53,165,10,148,80,229,241,44,8,184,222,97,173,72,41,6,117,217,38,231,98,92,88,32,230,198,218,210,146,217,248,77,117,141,233,87,15,201,55,32,60,205,202,12,186,121,92,177,224,4,75,137,143,183,16,84,115,163,88,59,123,97,189,151,45,253,228,230,212,144,6,4,46,218,245,12,95,111,101,78,107,246,218,170,198,202,195,161,223,167,220,141,190,39,200,60,175,120,101,156,106,118,29,219,17,82,215,76,17,126,135,31,205,103,19,89,21,144,12,161,30,135,22,206,156,177,191,208,163,193,202,106,114,101,29,71,235,85,19,59,109,31,236,249,214,101,241,64,245,6,45,118,173,58,203,112,35,57,157,53,140,225,105,25,249,228,129,30,161,227,67,183,36,131,61,133,139,185,212,192,235,107,79,72,245,173,105,32,48,37,125,189,39,0,123,190,247,116,61,46,32,188,230,252,48,49,156,255,183,23,163,177,181,209,12,82,167,177,208,105,219,250,33,250,178,239,23,48,252,172,8,169,222,126,151,84,60,217,211,81,177,152,231,248,62,112,16,2,141,102,242,6,180,77,42,26,251,79,131,42,182,178,130,26,148,227,110,203,200,151,247,5,254,122,44,43,184,160,102,170,177,206,234,16,105,147,136,208,196,95,75,205,75,77,56,18,95,46,14,21,52,152,153,162,39,72,120,138,2,16,104,101,114,229,129,230,32,163,212,211,13,177,78,55,95,8,156,85,121,244,128,62,38,161,57,109,35,27,250,192,69,138,55,234,200,225,16,1,21,172,39,222,147,146,73,23,1,231,179,106,228,55,102,117,115,168,144,184,116,250,40,18,95,208,117,117,92,248,202,75,56,177,255,160,52,214,179,121,222,211,164,168,184,241,191,27,118,244,191,6,51,15,152,33,148,194,147,14,252,187,7,167,55,79,227,212,214,207,90,193,120,198,142,83,119,196,111,83,241,221,209,77,166,233,113,67,212,2,171,132,155,27,132,231,105,217,244,189,111,126,51,196,89,150,143,77,111,20,7,253,124,227,192,251,172,98,191,11,162,230,129,200,175,62,121,183,158,111,92,214,174,2,240,193,106,188,43,40,199,123,214,233,210,153,219,221,66,172,178,35,98,62,98,17,207,31,26,163,69,222,43,27,49,195,135,122,106,220,14,220,95,252,210,48,53,159,10,3,36,178,234,70,40,164,200,94,75,250,247,28,21,211,168,51,63,229,32,197,171,33,138,41,0,73,238,50,228,116,47,148,124,114,19,6,19,4,70,188,234,147,121,118,86,56,154,69,253,10,97,208,60,149,241,186,58,25,222,140,223,85,52,246,79,51,156,69,217,193,113,119,14,161,136,21,67,73,40,79,124,133,193,12,223,4,111,205,20,233,234,242,156,173,8,57,42,28,120,186,169,170,88,88,49,137,102,241,74,74,113,101,140,2,74,251,123,198,103,255,119,16,171,172,24,217,87,241,65,5,84,123,237,66,83,128,60,57,224,158,41,112,55,106,3,161,150,168,206,145,175,221,223,123,245,38,15,19,189,1,33,212,249,38,54,122,243,148,82,52,148,59,204,30,101,21,144,37,67,90,106,55,97,203,185,32,85,149,169,172,175,71,15,147,166,62,232,96,159,40,252,30,160,22,160,197,234,26,253,237,47,169,219,122,169,123,195,37,217,196,251,50,66,45,51,62,22,117,77,147,232,227,187,167,94,98,54,6,89,62,221,200,43,217,156,137,138,84,169,11,185,122,78,27,177,124,35,40,164,218,216,247,135,61,245,49,27,209,108,21,75,160,206,221,219,123,242,33,247,174,190,214,41,140,51,0,83,147,51,199,62,127,216,232,80,73,243,195,254,237,215,87,114,226,98,28,55,27,206,150,253,148,247,172,99,232,21,61,165,128,250,56,97,243,57,192,104,221,61,150,150,218,125,46,26,146,117,201,237,173,80,120,240,181,36,28,104,73,169,44,135,29,206,7,117,148,157,174,80,154,190,123,186,157,69,129,1,107,253,68,82,147,245,107,148,19,153,175,110,192,37,7,114,196,97,102,238,190,206,97,111,203,155,23,148,167,88,78,54,193,51,12,178,172,207,83,27,89,27,53,127,60,12,90,120,9,131,171,180,205,9,171,102,7,177,4,43,25,31,206,35,4,175,101,250,187,71,251,238,150,119,29,195,98,228,220,121,88,173,97,172,188,100,250,11,95,30,179,234,211,112,72,80,47,58,186,73,230,240,89,245,134,210,14,103,128,193,240,99,4,227,141,165,163,211,150,88,166,117,23,54,77,55,83,130,49,110,43,92,141,61,29,182,101,125,19,61,32,207,162,2,234,154,160,225,245,0,163,14,249,76,149,206,115,52,161,35,20,5,201,55,10,253,207,58,252,252,77,251,136,187,251,41,4,34,38,118,87,253,91,231,66,142,172,124,83,53,149,225,26,102,81,174,199,122,216,196,252,113,237,91,39,162,45,96,93,85,73,141,190,229,31,206,215,239,220,110,98,107,255,163,128,82,37,116,105,4,126,232,61,16,96,240,246,22,181,128,45,31,174,248,171,113,127,76,143,157,77,183,215,2,41,144,44,242,220,222,37,137,136,131,204,136,3,107,172,78,42,84,40,101,238,97,255,34,218,48,62,117,242,122,87,29,149,66,155,164,150,205,210,131,92,22,35,155,42,95,200,34,6,77,240,51,49,23,205,203,206,99,251,54,47,247,68,234,27,140,58,181,54,22,162,199,58,239,145,156,129,177,13,56,238,191,156,154,125,229,171,132,131,80,187,1,77,150,216,20,132,71,145,240,128,91,237,74,137,240,21,159,221,215,162,122,226,237,53,30,238,71,205,166,43,148,67,252,114,23,20,112,226,222,19,253,229,210,9,255,249,52,244,252,54,35,82,64,160,57,195,240,125,150,190,239,123,229,20,87,249,87,127,66,224,180,248,210,125,198,145,77,167,113,221,97,155,98,102,4,116,239,19,150,105,95,238,115,162,251,50,65,166,139,65,192,130,194,26,249,77,148,244,187,59,62,107,54,163,110,8,232,90,250,94,126,145,98,251,200,154,216,42,8,205,67,53,183,118,42,219,134,127,42,142,36,238,106,174,105,28,247,163,195,19,31,232,132,124,136,162,178,114,157,45,153,108,206,161,18,50,147,41,223,254,51,156,180,154,220,214,123,10,70,41,77,88,25,109,4,132,18,2,249,250,158,149,151,33,117,84,11,209,210,131,118,205,21,97,134,19,15,55,189,177,79,98,132,175,95,156,14,137,166,166,168,42,186,160,18,130,204,176,53,205,30,246,30,217,127,114,228,231,98,45,188,15,7,113,37,27,21,179,43,223,207,120,14,222,206,166,57,143,155,91,90,83,114,127,201,182,250,38,171,157,113,89,16,64,116,23,154,156,74,148,52,74,82,168,91,181,36,130,72,124,111,100,100,107,107,1,37,18,250,133,48,144,147,19,2,129,157,88,253,1,218,212,223,96,140,239,183,21,222,4,40,11,36,90,153,191,252,35,219,139,10,92,254,33,60,77,194,91,133,13,191,231,249,220,203,216,175,157,112,44,217,110,182,201,172,34,76,53,93,92,230,161,124,57,168,31,116,91,144,82,202,197,49,72,137,34,12,58,131,187,147,19,138,31,126,43,144,219,63,24,213,146,35,17,196,35,176,106,105,0,227,5,218,56,162,127,197,118,148,237,155,93,64,223,241,70,48,94,85,11,249,133,239,235,25,60,187,61,239,22,158,128,116,239,53,109,187,122,24,85,124,165,19,83,186,155,145,128,11,152,156,136,117,141,11,161,255,200,245,156,229,190,177,29,2,42,182,139,40,228,6,11,133,214,71,2,118,165,242,122,115,229,53,174,159,149,42,83,119,88,4,205,170,118,91,33,112,200,60,226,78,160,170,135,87,69,166,156,173,90,48,140,210,243,124,107,168,175,191,141,138,66,103,209,162,207,67,120,176,90,168,85,118,223,163,68,224,205,203,202,229,19,72,22,229,198,200,114,48,225,4,165,222,97,40,231,40,128,96,46,155,6,32,22,155,185,62,39,158,188,24,85,160,68,212,196,76,27,76,237,239,68,249,6,220,34,219,122,91,129,109,96,144,28,236,189,80,32,124,251,62,121,21,179,137,49,162,251,171,41,162,127,126,104,47,133,234,149,110,233,231,47,144,165,132,238,195,196,174,14,162,171,254,173,151,3,167,45,32,240,104,42,114,66,187,60,169,231,241,159,101,238,75,121,72,104,80,83,60,129,211,133,152,54,147,230,244,158,27,196,206,93,148,28,218,10,139,45,126,43,86,4,129,190,55,32,60,191,15,219,253,253,169,67,11,97,191,66,43,86,113,36,235,161,80,233,217,197,235,81,126,178,44,93,207,234,30,67,224,221,233,132,97,250,63,119,66,30,147,63,248,250,3,211,210,76,179,81,57,40,205,239,42,146,59,77,235,222,46,131,204,108,153,92,107,38,152,139,209,169,104,236,171,128,172,205,84,81,39,159,4,177,158,6,235,158,168,39,114,61,227,17,98,6,196,84,250,22,186,52,25,223,139,233,13,65,217,72,150,240,248,183,241,218,65,122,63,253,110,201,204,138,239,232,6,150,220,118,247,254,189,47,231,190,5,85,197,255,231,168,55,183,37,255,152,255,82,166,31,127,206,143,200,43,85,43,164,113,205,221,75,121,21,162,7,0,203,173,196,18,110,8,3,142,163,253,22,43,173,242,204,208,235,133,59,198,8,248,180,106,78,124,122,35,243,247,144,103,177,223,40,55,140,151,13,21,233,67,187,78,11,206,122,250,149,13,189,132,241,152,80,150,178,232,0,241,43,101,231,95,124,74,149,37,229,111,174,59,47,145,249,160,133,249,67,150,36,37,203,113,191,19,6,103,113,27,79,238,140,111,172,46,204,237,36,126,94,61,102,208,52,181,228,167,59,32,76,217,166,1,131,70,249,125,107,3,53,53,203,174,86,110,235,180,43,88,113,198,220,147,22,83,35,210,178,129,151,126,106,26,204,34,24,254,133,23,61,68,225,198,119,75,69,115,47,217,62,99,53,90,85,104,78,163,211,212,189,187,218,107,46,10,43,33,117,228,196,222,71,170,129,27,228,212,46,243,245,62,120,65,74,9,235,238,119,204,2,112,152,136,233,83,249,98,18,95,97,169,227,209,146,59,141,201,248,54,141,50,35,47,66,44,43,212,155,222,216,152,138,210,169,92,239,109,91,222,129,192,28,101,183,207,254,16,161,151,253,8,34,196,241,224,132,75,13,21,138,197,3,236,162,173,9,221,167,87,244,73,124,184,13,123,30,195,85,66,76,42,111,116,103,148,132,80,18,161,249,236,20,161,184,27,194,186,179,15,221,165,72,243,67,95,174,136,220,182,251,158,13,92,125,192,190,42,132,202,48,185,116,100,118,199,198,221,99,73,198,114,71,17,135,241,247,194,37,157,238,66,180,179,111,173,104,4,243,226,64,169,96,199,100,249,51,161,54,11,135,54,221,130,130,144,165,72,196,198,35,253,153,19,190,224,202,29,231,243,22,48,202,110,85,130,254,172,129,123,203,166,243,145,143,59,137,143,159,174,87,117,178,212,55,112,92,112,74,238,109,178,134,192,112,73,240,125,144,247,141,120,255,167,179,145,155,86,56,48,161,253,204,11,225,155,165,131,209,27,152,34,207,115,48,74,187,223,138,183,219,140,165,46,221,210,120,226,139,17,206,146,66,127,44,11,82,57,68,199,130,50,91,207,250,112,160,160,118,233,182,153,98,61,135,148,167,20,37,167,58,58,244,130,228,158,248,253,142,220,237,93,105,238,243,154,189,176,229,218,108,150,190,223,249,51,15,232,85,220,207,223,160,29,182,42,247,186,154,27,34,27,117,238,62,132,237,196,159,65,240,222,98,126,162,80,208,27,122,21,90,121,3,143,219,35,254,228,66,69,137,82,31,142,175,131,145,177,185,44,176,49,27,205,102,77,144,1,163,167,36,167,110,121,146,197,195,51,110,62,170,255,77,189,240,173,160,67,151,10,225,43,73,120,8,238,80,91,242,198,148,122,101,208,204,58,75,34,96,197,152,186,140,121,247,168,11,19,108,49,46,73,126,252,190,128,61,156,180,110,186,103,169,228,186,218,74,67,194,103,146,45,195,140,158,235,92,92,205,215,71,36,84,32,181,231,68,194,226,217,6,131,159,228,37,5,87,189,121,133,154,170,107,108,143,206,235,188,70,197,131,177,87,103,168,112,4,191,87,18,54,35,113,161,200,57,150,155,47,12,71,73,248,122,161,236,233,252,200,185,167,84,162,50,103,24,51,225,149,243,182,45,49,38,241,143,225,139,167,23,126,158,154,128,234,4,10,27,55,127,156,127,81,20,196,125,75,167,235,104,232,103,226,115,241,31,187,222,17,187,84,232,35,193,217,110,108,3,141,227,243,82,85,9,58,93,1,117,43,75,78,136,196,127,21,178,53,245,239,81,198,157,158,192,11,136,189,26,162,10,156,147,195,10,120,182,9,63,145,102,139,41,49,132,103,80,14,13,46,82,129,19,153,25,163,243,79,69,217,142,251,151,238,20,184,110,62,92,159,66,13,142,252,57,133,83,3,28,139,38,54,38,71,108,47,147,231,183,32,104,18,255,169,163,144,113,20,185,74,164,227,181,244,51,211,133,102,254,91,193,143,79,50,234,187,178,119,144,117,174,254,71,226,67,62,230,3,65,143,193,58,91,109,50,93,220,40,2,154,196,76,255,119,145,236,10,56,166,212,111,224,212,134,37,24,44,28,245,190,8,89,163,184,105,207,191,115,7,5,129,147,15,157,172,3,23,25,57,158,123,124,41,63,213,13,101,137,251,40,107,173,126,201,111,20,198,233,154,219,173,144,252,107,171,189,62,126,248,35,238,130,160,248,62,0,32,106,22,62,12,210,61,251,21,62,205,169,231,138,168,216,96,148,161,179,224,245,199,92,239,54,217,28,50,62,220,10,132,218,44,155,62,203,28,233,56,123,80,81,140,213,206,113,195,89,154,142,203,91,193,106,205,135,244,194,109,66,137,106,72,22,149,99,94,194,15,158,8,42,102,107,194,90,21,15,132,234,239,249,163,108,237,59,103,111,120,211,126,208,157,140,84,95,198,209,33,11,149,86,118,38,232,228,131,142,53,8,147,58,182,189,51,88,91,15,177,188,253,114,135,136,87,96,190,156,221,116,95,177,104,140,50,16,189,7,174,60,65,48,111,201,200,79,231,208,209,48,40,222,232,72,78,203,67,48,52,166,243,156,211,119,154,95,183,92,121,17,71,100,130,49,224,89,67,131,143,132,131,69,38,234,51,63,177,40,24,101,35,153,93,47,196,215,79,182,25,153,206,231,185,135,100,41,47,56,37,237,56,25,78,186,150,44,127,187,42,134,48,71,136,44,111,59,45,238,138,191,186,228,105,71,21,130,213,48,94,88,186,121,110,186,157,238,226,80,43,211,4,41,222,212,22,102,59,34,194,215,160,109,214,75,34,13,161,8,216,169,147,228,28,26,28,132,45,243,6,155,185,84,176,1,108,144,168,168,182,62,151,184,222,39,38,35,69,2,110,198,52,109,37,169,245,143,115,165,182,175,225,16,172,126,252,251,169,184,34,247,103,156,86,243,227,224,147,46,8,226,224,155,217,35,209,107,51,40,125,244,133,143,70,32,1,7,94,187,160,153,46,120,139,230,12,229,134,189,146,65,56,162,246,120,163,34,135,49,225,37,37,155,28,177,96,103,12,201,98,53,45,123,114,224,17,225,7,217,113,220,251,84,135,224,25,23,70,38,15,206,52,218,122,218,153,139,87,171,194,40,231,201,175,70,108,119,182,169,107,100,80,236,172,126,122,26,177,29,243,135,116,162,94,224,64,194,254,234,209,22,137,47,77,252,106,81,120,59,87,153,155,162,197,45,235,137,224,201,199,127,247,52,45,37,249,117,123,236,41,112,207,32,248,55,85,191,69,232,164,228,232,104,79,174,170,48,30,34,248,61,50,213,122,107,27,41,6,74,222,245,206,0,37,136,132,23,103,166,90,147,220,174,176,63,137,37,110,208,161,87,28,7,215,198,21,246,94,254,156,174,20,252,42,87,6,69,111,82,174,14,44,197,202,70,121,171,203,249,36,140,98,63,84,212,232,97,78,25,134,22,18,146,151,152,156,188,160,154,174,119,12,234,247,69,63,243,188,216,226,17,207,18,37,225,27,98,211,218,106,142,7,249,68,195,35,229,207,209,8,40,83,58,35,130,5,42,61,194,30,15,179,171,254,39,71,192,167,168,239,254,9,146,232,249,22,92,198,46,200,70,194,3,31,10,236,254,80,56,80,124,95,189,92,252,206,15,43,238,157,62,73,113,34,237,198,85,2,115,120,224,24,5,140,97,89,137,192,39,134,153,199,18,80,15,102,226,35,21,44,41,136,146,218,236,87,38,40,146,60,159,125,87,244,66,64,251,239,154,23,135,113,163,24,6,214,2,178,223,151,145,58,174,133,161,229,188,117,204,225,97,42,191,136,26,45,82,199,34,52,255,214,220,160,215,151,92,82,108,74,163,21,198,243,235,134,89,8,60,69,197,150,10,43,158,106,151,135,80,79,223,117,41,47,27,92,67,115,99,116,36,116,24,32,112,103,198,93,87,139,243,241,181,183,244,202,229,248,105,8,28,201,38,14,168,133,199,29,26,230,228,75,254,88,63,190,223,103,61,62,93,121,255,242,27,198,221,78,127,58,164,238,228,120,189,168,189,230,134,119,129,238,11,5,123,107,132,218,71,112,122,70,82,74,134,238,186,146,34,13,64,194,67,44,227,85,156,173,5,35,175,111,143,50,159,185,244,29,1,139,62,255,16,31,219,247,27,58,8,245,203,99,216,128,81,252,105,49,9,38,30,154,73,66,159,203,214,122,40,72,251,29,100,147,196,98,30,62,210,223,13,254,142,186,130,128,86,69,212,10,47,57,54,99,138,25,162,81,170,141,164,124,114,216,181,88,206,189,227,114,213,119,63,68,245,30,140,231,114,28,114,61,12,190,182,193,152,117,213,121,35,21,70,113,186,73,76,179,17,193,37,211,199,212,171,111,119,16,112,189,154,89,33,138,78,174,36,197,165,2,116,216,70,178,124,4,201,169,52,205,253,24,10,21,52,68,159,237,64,24,126,162,184,107,130,123,222,188,151,192,228,4,223,30,84,216,38,82,235,23,231,122,251,129,70,174,100,154,24,165,66,168,0,21,207,44,111,194,13,69,228,243,134,208,23,63,28,33,107,162,63,67,38,120,154,101,233,194,245,70,63,13,68,205,55,197,95,59,216,220,130,78,153,105,211,140,182,181,117,149,194,118,216,60,59,175,212,117,132,188,234,194,120,60,41,30,211,124,58,236,240,165,190,198,87,189,105,103,58,245,152,141,96,245,156,224,9,244,36,202,34,36,194,99,21,171,5,116,100,84,15,199,87,157,184,20,234,157,234,161,132,171,203,247,234,234,217,186,231,99,48,201,158,37,229,82,5,225,205,59,178,194,253,42,156,236,168,187,206,175,249,144,234,185,220,231,65,110,196,114,151,70,135,112,112,99,39,7,2,203,211,242,100,105,249,20,153,18,168,190,61,214,142,58,174,159,105,244,250,89,238,163,31,75,93,15,119,135,97,225,219,79,99,18,28,34,119,149,52,99,143,126,175,148,192,168,179,132,167,247,88,12,172,53,58,15,24,25,201,7,97,240,178,247,157,235,154,125,67,49,11,145,22,15,173,199,112,96,51,217,220,240,35,246,214,68,46,67,205,68,242,97,210,122,125,119,105,207,94,150,161,211,80,95,125,153,125,229,120,189,56,195,48,236,188,64,37,109,61,97,247,33,140,226,74,219,161,85,152,96,17,92,234,115,80,183,48,108,145,163,67,98,94,100,221,178,55,164,236,205,220,214,43,134,65,247,209,147,87,59,5,100,165,63,118,15,46,122,239,192,96,251,139,58,9,83,21,54,31,235,209,204,238,52,49,88,173,163,234,67,101,237,137,206,60,198,201,128,114,83,210,254,95,112,45,231,214,143,99,109,143,112,79,103,230,96,32,197,199,233,18,110,182,240,235,46,157,73,177,6,233,120,88,152,39,71,151,233,1,231,141,229,152,178,161,133,221,105,24,92,255,84,170,131,213,235,122,182,237,26,89,237,197,13,11,75,240,170,38,40,100,218,184,26,151,134,202,95,167,70,147,248,115,119,242,11,222,100,77,208,51,73,121,116,133,84,175,199,93,111,233,6,28,215,107,122,69,173,147,199,239,85,55,60,88,244,149,74,226,148,218,91,188,135,135,64,71,86,153,233,240,6,6,3,197,70,173,203,75,114,199,255,23,196,40,2,106,175,79,23,190,234,255,229,86,134,115,208,178,29,50,95,206,224,177,25,96,201,75,169,42,62,62,191,98,159,108,184,110,189,198,30,162,117,62,138,226,104,51,63,12,247,175,144,151,123,119,231,198,51,124,179,34,229,103,181,20,244,61,175,130,92,101,139,189,235,249,36,98,201,104,27,103,182,115,249,235,129,11,51,119,200,121,89,61,113,254,166,138,254,143,195,161,237,235,187,250,115,216,124,24,127,233,108,171,189,193,34,187,12,239,43,242,24,237,136,191,252,169,249,49,141,63,122,252,251,226,221,245,41,82,60,127,251,41,190,224,154,31,40,130,34,199,202,169,8,82,94,56,103,24,196,173,130,110,127,0,26,63,188,210,8,11,115,229,154,178,177,92,96,233,7,66,159,107,185,110,194,168,203,243,18,70,103,133,46,161,66,4,245,149,235,41,32,106,114,98,238,116,101,89,7,67,152,76,145,229,67,106,28,193,123,66,226,168,34,46,75,134,26,224,229,214,116,68,212,96,199,188,203,87,19,248,201,215,143,226,88,169,185,90,180,201,210,94,92,180,95,26,73,117,166,227,160,78,166,198,73,250,155,85,88,23,100,234,46,102,216,27,157,190,243,1,81,163,150,140,146,9,153,207,114,108,41,203,51,101,253,118,252,222,74,127,165,121,177,211,75,246,112,54,1,240,37,130,1,186,63,31,9,210,221,164,10,239,197,40,115,188,69,240,92,182,9,9,77,194,131,75,233,178,72,212,35,236,200,108,120,74,151,66,111,238,79,17,122,65,238,116,14,37,152,217,40,168,180,36,37,119,237,135,203,164,217,181,201,104,184,77,50,200,224,174,96,252,222,128,235,142,111,203,43,37,136,249,114,144,28,83,175,205,22,65,83,113,154,115,222,27,103,221,86,51,44,200,155,32,149,226,47,93,0,216,83,67,117,39,125,132,106,143,190,88,101,8,143,134,246,132,184,32,89,64,181,77,248,114,79,139,15,21,240,73,107,242,50,14,228,113,147,241,136,185,183,31,19,75,107,108,18,223,78,138,207,185,150,179,119,219,169,136,115,239,203,58,61,96,68,205,43,229,253,251,70,29,109,166,89,249,139,113,175,169,113,133,82,11,251,22,66,191,250,167,203,25,82,127,138,126,27,94,164,19,178,43,171,24,73,17,141,188,61,102,228,185,13,75,146,141,90,78,201,107,184,176,84,150,153,169,233,92,64,102,60,5,69,233,154,39,48,116,58,223,34,115,71,47,64,164,243,231,158,154,118,185,126,197,41,181,71,244,143,4,32,252,69,89,37,209,229,175,87,220,125,217,57,75,71,109,113,43,166,86,67,93,241,23,29,155,151,37,48,207,250,116,4,41,253,248,42,233,149,62,84,50,156,127,232,65,156,184,15,205,48,16,23,28,93,118,5,146,84,50,76,147,209,88,8,28,23,201,52,163,3,129,224,8,203,231,82,211,105,176,108,131,245,221,181,196,165,189,248,11,214,101,161,255,229,194,43,137,83,30,123,107,131,121,142,217,186,90,47,136,188,36,60,36,154,56,21,152,106,26,123,194,248,246,88,118,186,32,37,157,120,209,187,254,92,91,80,121,231,166,247,66,163,32,229,69,91,195,119,234,31,239,158,91,182,159,116,142,0,176,26,162,146,58,45,101,229,196,246,152,27,107,249,124,39,16,135,14,116,253,230,111,214,68,154,103,91,16,155,237,40,162,6,216,134,143,12,95,108,116,151,145,13,152,162,115,34,197,191,164,171,33,205,240,206,212,14,213,167,230,7,109,48,200,191,198,89,62,0,208,172,11,89,107,150,114,188,67,10,139,30,22,39,110,232,236,74,17,86,190,63,149,222,71,66,75,9,91,247,43,157,14,2,182,131,24,196,111,109,232,137,55,214,124,124,89,49,101,194,237,91,186,69,160,40,132,45,41,210,146,63,16,119,206,200,240,192,158,226,187,118,56,241,136,26,233,165,202,96,250,248,66,215,8,62,199,49,56,200,236,219,220,31,133,171,47,40,110,41,245,170,248,180,32,152,212,20,127,137,249,218,58,122,235,172,87,202,229,153,216,6,54,219,254,30,151,124,97,81,169,175,225,249,245,114,88,113,203,133,202,130,241,35,39,72,224,209,234,89,202,0,88,77,67,22,93,42,254,41,139,48,0,76,167,186,61,130,106,52,214,109,99,34,121,190,179,122,107,136,27,119,65,232,92,217,141,4,251,252,96,94,17,134,33,227,237,247,37,136,90,157,224,56,170,241,154,4,211,192,117,39,87,13,58,132,154,166,187,95,66,253,34,39,21,231,249,182,31,3,63,161,154,22,68,53,198,115,246,107,182,125,72,227,164,198,1,18,154,156,121,180,52,49,84,38,225,25,147,68,227,182,14,163,20,63,196,36,85,191,1,156,95,53,80,167,86,12,96,3,194,205,182,46,113,199,56,82,82,63,246,167,60,119,93,142,50,220,87,225,237,80,249,175,97,42,242,23,215,64,35,156,120,210,218,179,43,83,20,92,43,183,241,169,92,203,111,33,106,230,136,140,226,133,221,81,63,220,31,232,38,90,248,152,191,151,149,105,187,158,245,73,102,220,253,179,68,196,5,37,135,149,90,196,157,22,16,155,49,55,182,143,218,69,102,24,54,14,61,50,165,221,201,199,130,2,75,110,177,144,234,225,211,249,132,34,183,74,166,95,122,198,11,224,107,24,156,158,9,184,172,55,41,174,236,235,189,201,54,249,8,177,188,76,124,103,221,120,241,57,121,50,199,237,215,219,83,80,77,29,171,190,58,232,121,196,166,11,85,63,67,175,147,252,139,85,181,208,145,144,96,194,133,188,28,132,107,33,208,62,120,106,138,113,67,181,246,17,5,172,200,97,69,194,163,142,253,78,47,251,116,190,242,214,177,122,46,189,60,198,103,59,207,111,139,250,129,175,239,98,230,194,63,195,106,84,109,242,60,118,54,20,232,250,80,42,46,102,41,200,242,98,247,234,86,223,190,92,43,54,73,90,254,193,42,140,209,32,23,61,179,219,246,80,134,167,33,233,240,241,38,86,131,183,105,111,207,185,53,93,140,142,148,163,103,168,142,255,159,222,115,84,29,224,72,181,74,120,175,172,99,143,128,142,245,180,18,25,60,3,167,140,93,87,87,175,125,20,164,140,147,238,124,213,119,232,209,9,224,102,172,159,248,35,14,97,83,74,203,67,123,123,50,74,115,151,70,219,10,72,251,103,181,208,98,101,101,195,114,153,234,220,159,40,110,152,254,142,231,151,146,181,202,114,37,149,159,239,151,14,46,147,240,89,33,165,132,44,145,209,255,37,144,172,12,160,113,160,69,132,145,173,34,226,173,246,29,37,77,24,169,108,14,156,196,58,20,105,41,74,187,179,83,58,174,68,44,147,240,130,62,250,140,69,219,244,59,239,130,182,121,243,3,88,248,66,218,237,96,86,238,243,26,169,178,41,90,217,191,255,190,47,39,147,131,206,166,142,113,184,156,248,198,17,70,113,124,30,231,126,74,126,241,170,201,94,162,85,68,46,169,254,150,173,115,127,12,208,154,95,175,175,190,88,127,27,6,57,158,69,75,220,205,254,198,244,58,176,44,238,94,11,130,191,175,255,36,160,249,199,185,107,216,228,22,74,119,94,24,212,187,53,35,138,100,155,59,211,175,15,71,176,1,48,202,49,75,136,87,159,140,57,178,92,217,28,182,209,33,249,63,236,148,139,72,81,58,211,28,243,83,102,223,79,48,184,152,126,79,3,178,202,80,227,40,95,19,241,159,196,129,99,94,8,159,165,194,252,20,223,210,168,249,201,135,48,184,227,125,247,161,38,217,244,57,247,114,124,127,78,24,142,218,199,139,173,119,236,93,231,181,69,53,32,151,72,226,63,92,133,41,180,111,111,140,20,38,246,37,65,59,233,164,243,244,3,129,195,34,73,171,194,224,215,206,179,47,172,176,176,169,190,31,23,194,66,215,160,19,246,236,244,110,37,4,54,67,45,89,248,75,35,47,13,169,58,43,251,198,161,153,171,105,155,31,127,47,28,74,154,210,174,52,251,48,194,194,254,157,218,134,28,242,173,181,97,9,15,77,239,39,11,138,191,77,217,125,164,82,105,235,174,156,207,94,108,225,162,167,230,149,45,234,219,102,24,111,2,80,11,124,199,234,146,234,179,102,225,199,132,224,227,250,76,39,162,117,9,45,190,143,6,4,128,209,124,238,163,163,150,109,3,31,5,93,8,186,21,125,18,72,46,231,84,215,184,136,113,148,199,128,12,36,217,152,228,71,197,24,160,198,252,143,194,223,241,183,224,89,118,37,50,208,180,225,19,14,243,42,229,92,179,245,244,14,63,224,5,0,251,91,70,111,233,185,0,32,236,193,215,132,247,188,66,128,195,179,127,242,158,151,90,40,62,1,64,4,191,55,91,27,211,152,205,17,29,0,252,41,167,137,150,185,160,41,40,126,60,127,111,59,140,147,137,57,133,153,53,105,152,165,151,54,153,226,251,201,77,167,155,119,168,129,21,134,127,243,110,133,42,239,121,65,49,106,245,143,48,102,255,173,44,85,104,57,159,59,37,0,140,106,232,8,133,178,177,0,0,95,250,137,239,254,41,202,177,43,119,229,196,65,26,146,190,122,194,191,37,4,173,170,136,70,45,253,241,191,238,23,134,234,16,197,51,56,147,1,217,67,161,80,146,126,186,204,28,63,57,67,208,128,108,180,37,90,23,26,79,204,158,33,7,60,221,86,35,196,191,37,224,168,191,122,233,93,87,248,245,236,196,177,61,62,213,242,204,12,164,245,101,107,115,123,182,24,2,222,25,60,145,111,11,201,28,137,179,6,0,122,167,50,50,79,73,221,127,246,37,191,127,150,93,43,0,23,150,170,146,117,48,9,17,198,76,201,128,228,90,242,48,7,255,253,127,243,192,69,249,171,93,0,115,156,130,2,52,195,21,62,73,9,140,237,63,71,3,0,117,124,63,233,24,32,231,207,93,3,1,192,198,46,34,184,144,75,254,175,254,14,33,29,92,232,116,215,105,147,201,127,159,31,77,111,10,206,5,88,223,163,53,72,242,80,73,125,38,57,0,208,154,68,126,201,87,36,251,235,31,64,133,237,70,230,118,234,210,248,109,146,61,10,81,118,219,36,151,91,23,133,3,231,50,255,249,175,48,251,148,221,73,160,70,203,56,70,238,239,216,54,187,78,158,100,149,189,121,45,73,222,212,206,145,139,2,240,212,152,143,0,232,201,254,201,243,150,237,19,249,1,124,31,115,30,154,153,225,20,96,236,246,229,1,191,72,14,138,118,211,128,228,15,210,254,218,47,184,37,239,210,163,219,46,61,253,39,239,208,174,186,204,7,24,107,244,122,160,255,206,63,8,250,244,230,246,48,26,56,155,254,111,62,212,255,215,35,106,22,154,5,23,62,244,223,177,80,38,59,37,94,88,145,17,185,135,195,236,23,89,114,0,99,206,91,101,140,0,208,239,243,207,94,229,75,181,162,147,0,176,196,189,242,79,95,145,236,159,231,148,89,189,118,61,244,71,196,142,199,2,195,247,11,78,145,1,202,62,218,48,181,210,217,198,39,171,101,76,0,25,201,135,135,118,232,191,254,243,204,239,14,86,9,202,63,47,109,43,132,1,5,73,241,157,28,225,120,34,42,253,221,10,39,219,223,245,4,216,196,77,185,190,117,214,62,85,250,167,159,228,141,106,65,70,96,150,254,177,1,219,191,253,82,243,123,48,243,10,84,118,226,65,135,178,113,0,64,164,115,190,216,137,184,87,192,19,81,180,228,95,125,174,220,22,1,128,181,235,192,210,255,253,239,192,42,161,69,252,29,236,120,6,221,198,196,198,231,54,65,82,225,99,87,20,80,146,254,207,30,129,126,1,189,84,32,52,80,111,240,255,249,99,58,96,23,38,0,187,8,230,8,253,203,143,145,58,56,228,26,16,187,164,250,79,159,38,207,218,212,147,172,88,247,218,223,255,223,255,160,41,89,18,164,22,89,241,213,83,211,136,160,100,31,187,38,203,4,172,136,2,51,245,45,254,92,199,223,15,60,26,136,179,84,38,16,26,254,7,17,27,158,59, \ No newline at end of file diff --git a/screens/ms2/images/Untitled-2.json b/screens/ms2/images/Untitled-2.json new file mode 100644 index 0000000..ac82b14 --- /dev/null +++ b/screens/ms2/images/Untitled-2.json @@ -0,0 +1 @@ +{"name": "Untitled-2", "type": "bitmap", "format": "COMPRESSED_RGBA_ASTC_4x4_KHR", "astcCompressionSpeed": "thorough", "width": 244, "height": 244, "compressed": 1} \ No newline at end of file diff --git a/screens/ms2/images/Untitled-2.lut.bin b/screens/ms2/images/Untitled-2.lut.bin new file mode 100644 index 0000000..27e1ab7 --- /dev/null +++ b/screens/ms2/images/Untitled-2.lut.bin @@ -0,0 +1,4 @@ +xœ “ëO›Æ˙ŋcb˛D‡ˇE`n0d”RzoßļĐûũ~{éÛŌ ”ļ+R°´lĐjĮ +âˆJĶ-ķFšĖÄÆ~1ū?ßO''9ĪÉīÉyŽ.b>ëA“ņŖN†P%ũhNTY'sIē„Ų¤Cî嚨k&…!EqŖŊ!Ė™ęđs9?š„ s2†&ÔObNxQKalu$€ALaĖÄx0 MEš-:d­͒ŸA¯"bĮ,‰Ė$-˜Š4RƒĐņĸ_‰33z‡˜G+ĖĐj4˜/ÅØ¨V˜•"(BŸcÄOwcƒEa…r”vc2ÅâėĨ°¨Å@īî R”x"BÔ)Ķ+ŅxŒl}´‰J7FŋŨbŪŽbÉ%PŦŅGŖ¨ĻŪA{í +։w ¨? *kĩË>D›Sʎĸāãčč!‚Cƒ5äd­ēÂB2J%+{ŽØ¨ÉŧŽéëŦKi,š<Ũf õĢܞA̜@[ĖR/˜×M‘r98ņĪžÍmÅ­žeęÍW<û—/ONÆŪĀoRãČgø´c-ƒÛĄĮët˛ˇMĄ^ÅĸŊ‰˜I“øąĮ}XËiļvvčÖJ´Ę´ĶŖ˜4 +N?;d÷^KĀ„(3¤Ē%Å>1ÂŖĶ3šrŨ"ƃ(„)‚Á Ņ€ƒŊÁ>…x Ýe”ŽI6š›Ô7× Ë;tãט{ëUt~;’TĀđāņ[&oōũã¯QĒŽōíŲ q™oJÅ`Vc•3°ēÜĀ-Ŧ˛d-JœR…[͝1ŠabüeN†}ĒĄEļ{“ ;¸8>ĀuëmÚ˛ˇi’˛|CKi™Ÿž=a÷ņ?LGÔčŦ׊u:n†ŸŸX,.‘Ûéˇj¸dŽĨČ2ãî ÎĪ/8ēüãŗ'TåˆÚäŊi*™"ÍŪ'lí#Ęy“ rš-’ÚInŒŧÄfĢĪڝûč}*ΟūHĨÔ%ž+â-7XĢwŲ;˙UP?˙_YO˙_Š‚˙“Šˆ˙\`R˙om˙ŗ¯¯˙tXL˙iph˙p]X˙R@1˙ĢĘī˙ŧšš˙fI=˙td]˙m‡˙˛¨¤˙c’˙pma˙rnn˙­Ŗž˙ˆ“˙g_N˙ƒ€˙€ut˙l|s˙hŒ€˙œĸĸ˙Ą’‹˙šŒˆ˙_TH˙d^W˙ģ´ą˙Ĩ¤¨˙gud˙ƒŠ‚˙‹˙fWI˙sƒy˙ˇģŋ˙–ƒy˙­¯ą˙ƒ|v˙WfR˙vvv˙zum˙ĻĢ­˙ˆ|{˙b•‰˙YoP˙™–›˙“›—˙xŠ‚˙`JE˙ZA3˙`tl˙††ˆ˙ouq˙qtg˙fPN˙ĖÄž˙Y[>˙Æŋš˙|€˙RfH˙be]˙h„t˙‰”˙pff˙ˆ‚˙‚gY˙n†˙QT6˙P]?˙OJ/˙š¯¨˙wk˙Ÿ§Š˙‚xm˙ø°˙oQB˙žŒ€˙TqY˙Œqc˙g‹‰˙ĪĘĮ˙ĨÄę˙Ty]˙`hK˙’  ˙v}p˙¯ļģ˙vfm˙ggf˙o^c˙˜žĩ˙¨š’˙o€˙„y‰˙JpO˙ÂÂÃ˙ŗĐņ˙¸ŋĮ˙~q˙zlx˙€r€˙Š˙–§Ē˙œĻÂ˙ƒ†y˙†}”˙……œ˙~_P˙M?(˙›š¨˙‘•Ŧ˙as[˙ÂČÎ˙‹Ą˙|…Š˙rŒ”˙‘“Ą˙Ļą¸˙†š—˙rމ˙ĄĨˇ˙ąŸ“˙ĩ§œ˙ÕĐË˙Ģ–†˙}“ ˙§ąČ˙Œ”š˙hV_˙G|a˙š°ą˙ÜØÔ˙ ŊÜ˙yv€˙›~l˙ŸÃ˙ÍŌ×˙§‹x˙…‡­˙{uŒ˙qaz˙p–š˙™¯Đ˙ƒžŽ˙|iš˙æäā˙¯Å˙° ˙Ã̆˙ēšp˙Ŧ‡T˙“k<˙Ųŋ˙ŨŌ­˙ \ No newline at end of file diff --git a/screens/ms2/images/Untitled-2.lut.rawh b/screens/ms2/images/Untitled-2.lut.rawh new file mode 100644 index 0000000..65af59c --- /dev/null +++ b/screens/ms2/images/Untitled-2.lut.rawh @@ -0,0 +1,8 @@ +96,130,119,255,92,130,113,255,94,129,116,255,93,126,119,255,91,126,116,255,95,125,110,255,91,130,110,255,90,126,113,255,96,125,115,255,88,126,109,255,91,130,119,255,92,122,110,255,104,129,127,255,98,133,122,255,96,121,112,255,87,131,114,255,99,125,119,255,101,129,119,255,93,120,106,255,90,133,116,255,94,125,105,255,101,126,123,255,94,130,123,255,100,135,126,255,101,125,114,255,93,134,120,255,105,129,131,255,93,121,117,255,98,131,127,255,99,129,123,255,174,171,171,255,95,127,122,255, +85,131,109,255,93,120,101,255,94,132,116,255,171,167,168,255,87,121,108,255,101,134,131,255,86,126,103,255,100,138,121,255,94,134,125,255,98,134,118,255,98,129,114,255,97,142,124,255,86,72,57,255,109,131,135,255,95,102,86,255,154,148,148,255,92,139,123,255,153,144,141,255,88,134,121,255,87,119,102,255,136,115,109,255,99,121,116,255,161,153,153,255,107,102,88,255,87,89,72,255,162,158,160,255,99,126,127,255,107,88,82,255,139,120,115,255,122,103,98,255,167,163,162,255,106,134,122,255, +124,125,121,255,122,110,102,255,123,97,89,255,94,113,99,255,156,157,155,255,91,96,73,255,168,158,154,255,92,108,91,255,132,111,102,255,138,141,138,255,97,122,122,255,91,82,67,255,95,69,57,255,104,79,68,255,117,93,83,255,144,125,121,255,95,137,115,255,131,105,96,255,100,127,108,255,87,136,115,255,179,179,181,255,102,109,94,255,104,119,110,255,145,144,142,255,106,126,122,255,141,130,127,255,99,121,105,255,146,148,148,255,109,84,75,255,151,134,128,255,103,133,135,255,161,150,146,255, +93,77,62,255,85,80,63,255,95,89,79,255,95,138,130,255,147,138,136,255,92,96,82,255,127,111,109,255,179,175,175,255,116,88,76,255,105,112,104,255,112,93,88,255,82,64,49,255,171,202,239,255,188,185,185,255,102,73,61,255,116,100,93,255,109,135,129,255,178,168,164,255,99,146,129,255,112,109,97,255,114,110,110,255,173,163,158,255,136,147,144,255,103,95,78,255,131,129,128,255,128,117,116,255,108,124,115,255,104,140,128,255,156,162,162,255,161,146,139,255,154,140,136,255,95,84,72,255, +100,94,87,255,187,180,177,255,165,164,168,255,103,117,100,255,131,138,130,255,127,144,139,255,102,87,73,255,115,131,121,255,183,187,191,255,150,131,121,255,173,175,177,255,131,124,118,255,87,102,82,255,118,118,118,255,122,117,109,255,166,171,173,255,136,124,123,255,98,149,137,255,89,111,80,255,153,150,155,255,147,155,151,255,120,138,130,255,96,74,69,255,90,65,51,255,96,116,108,255,134,134,136,255,111,117,113,255,113,116,103,255,102,80,78,255,204,196,190,255,89,91,62,255,198,191,185,255, +124,129,128,255,82,102,72,255,98,101,93,255,104,132,116,255,143,137,148,255,112,102,102,255,143,136,130,255,130,103,89,255,110,134,141,255,81,84,54,255,80,93,63,255,79,74,47,255,185,175,168,255,144,119,107,255,159,167,169,255,130,120,109,255,195,184,176,255,111,81,66,255,158,140,128,255,84,113,89,255,140,113,99,255,103,139,137,255,207,202,199,255,165,196,234,255,84,121,93,255,96,104,75,255,146,160,160,255,118,125,112,255,175,182,187,255,118,102,109,255,103,103,102,255,111,94,99,255, +152,158,181,255,168,154,146,255,111,129,128,255,132,121,137,255,74,112,79,255,194,194,195,255,179,208,241,255,184,191,199,255,144,126,113,255,122,108,120,255,128,114,128,255,141,129,138,255,150,167,170,255,156,166,194,255,131,134,121,255,134,125,148,255,133,133,156,255,126,95,80,255,77,63,40,255,155,154,168,255,145,149,172,255,97,115,91,255,194,200,206,255,141,139,161,255,124,133,138,255,114,140,148,255,145,147,161,255,166,177,184,255,134,154,151,255,114,142,137,255,161,165,183,255,177,159,147,255, +181,167,156,255,213,208,203,255,171,150,134,255,125,147,160,255,167,177,200,255,140,148,185,255,104,86,95,255,71,124,97,255,154,176,177,255,220,216,212,255,160,189,220,255,121,118,128,255,155,126,108,255,144,159,195,255,205,210,215,255,167,139,120,255,133,135,173,255,123,117,140,255,113,97,122,255,112,150,154,255,153,175,208,255,131,158,174,255,124,105,154,255,230,228,224,255,143,175,197,255,194,176,160,255,195,171,134,255,186,154,112,255,172,135,84,255,147,107,60,255,217,191,144,255,221,210,173,255, diff --git a/screens/ms2/images/Untitled-2.meta b/screens/ms2/images/Untitled-2.meta new file mode 100644 index 0000000..7994270 --- /dev/null +++ b/screens/ms2/images/Untitled-2.meta @@ -0,0 +1,5 @@ +{ + "converter": "Image", + "imageFormat": 37808, + "sourcePath": "D:/Projects/Embedded/AirsoftTracker/maps/home/tiles_ready/2/1/0.png.png" +} diff --git a/screens/ms2/images/Untitled-2.raw b/screens/ms2/images/Untitled-2.raw new file mode 100644 index 0000000..924be92 Binary files /dev/null and b/screens/ms2/images/Untitled-2.raw differ diff --git a/screens/ms2/images/Untitled-2.rawh b/screens/ms2/images/Untitled-2.rawh new file mode 100644 index 0000000..ab33498 --- /dev/null +++ b/screens/ms2/images/Untitled-2.rawh @@ -0,0 +1,62 @@ +/*('file properties: ', 'resolution ', 244, 'x', 244, 'format ', 'COMPRESSED_RGBA_ASTC_4x4_KHR', 'stride ', 976, ' total size ', 59536)*/ +82,200,9,9,0,0,0,247,252,118,71,2,83,177,12,0,66,136,147,9,61,56,141,122,51,211,216,31,96,10,167,242,83,2,123,234,106,67,128,17,196,40,130,148,32,137,8,93,83,200,9,13,0,0,69,155,245,7,224,131,157,61,9,0,35,200,9,13,0,0,128,147,169,233,228,68,160,209,194,205,82,112,0,76,49,135,33,156,215,193,135,17,202,188,62,63,67,72,169,233,67,225,182,201,39,84,1,240,240,214,214,92,34,16,21,99,6,75,218,130,145,78,0,0,96,41,226,58,66,104,187,105,211,75,218,144,180,6,0,129,242,86,231,0,65,170,8,236,127,214,242,158,47,113,89,203,34,33,140,48,82,4,91,237,49,159,51,172,181,71,231,126,165,174,16,83,67,200,9,13,0,0,13,50,194,11,18,63,118,8,8,0,206,81,72,115,19,62,60,3,0,0,25,95,151,28,124,1,82,4,31,228,163,159,21,248,91,233,234,187,218,239,189,108,67,40,9,176,145,35,239,198,181,191,150,44,65,184,249,34,66,200,9,13,0,0,128,131,89,176,223,19,7,1,128,0,34,208,94,25,0,0,110,149,57,249,242,187,97,72,233,193,66,36,51,87,246,18,81,90,122,162,246,98,253,240,84,240,66,2,175,95,218,245,61,91,61,73,217,10,157,196,101,164,51,200,9,13,0,0,0,172,31,63,176,85,178,75,62,116,33,202,9,13,0,0,92,222,189,189,28,2,61,34,23,134,82,232,99,242,232,149,245,243,198,15,61,228,188,159,97,49,223,73,201,201,232,35,53,67,120,241,220,68,7,56,253,248,222,41,11,245,215,213,198,255,79,11,0,2,168,177,194,0,82,200,9,13,0,0,96,42,245,159,14,1,215,242,203,1,82,36,137,130,15,201,113,134,140,69,71,82,93,22,88,248,82,196,226,16,187,228,145,125,253,154,94,125,184,36,93,91,81,16,55,17,0,0,224,127,46,56,95,13,105,61,103,1,1,202,9,13,0,0,0,214,148,193,85,155,11,162,100,111,66,40,66,213,253,234,33,97,84,197,137,79,42,214,54,88,67,2,91,111,69,193,11,17,248,71,205,17,147,194,8,16,81,16,55,17,0,0,224,62,53,58,159,9,105,96,72,0,222,201,9,13,0,0,0,204,18,22,38,57,84,187,78,1,66,36,81,70,242,241,164,78,146,34,155,165,250,151,236,246,222,201,194,105,150,64,124,37,99,234,175,100,5,12,213,112,66,200,9,13,0,0,112,33,178,125,5,79,248,168,80,0,19,200,9,13,0,0,0,228,132,194,254,219,64,0,72,167,223,37,241,162,232,219,3,223,222,166,205,34,92,11,85,214,66,36,145,207,244,225,166,150,87,214,89,136,43,130,43,32,81,208,1,17,0,0,224,62,38,250,143,137,104,128,150,6,34,80,43,21,0,0,68,63,80,55,7,217,151,176,164,188,82,2,107,223,43,239,225,24,155,208,33,2,81,0,33,10,82,8,27,139,168,240,124,221,231,121,17,138,127,130,122,205,223,201,9,1,8,0,8,224,223,167,91,136,218,181,198,255,35,200,9,13,0,0,96,105,182,62,151,71,165,211,226,81,82,36,233,194,14,199,43,138,172,170,214,107,228,185,167,92,66,232,29,113,208,145,237,220,238,175,12,159,243,166,216,12,206,201,9,13,0,0,0,30,243,204,50,109,67,150,142,1,206,81,43,17,0,0,236,126,46,188,143,27,160,242,105,0,222,5,69,13,85,79,213,178,64,74,154,194,148,68,162,77,207,73,196,73,95,52,157,86,206,244,43,86,104,227,46,59,66,200,9,13,0,0,0,164,84,252,135,67,150,118,232,0,34,200,9,13,0,0,0,10,234,213,240,107,67,218,234,83,206,73,154,201,209,75,90,13,28,25,251,95,79,71,97,129,66,36,213,142,252,162,169,71,70,253,0,247,154,183,85,39,50,200,9,13,0,0,0,234,242,147,206,124,84,68,175,63,222,201,9,13,0,0,192,70,17,223,199,121,116,79,28,0,82,36,237,129,69,137,45,91,250,72,197,81,144,116,149,179,82,36,233,138,205,201,101,214,89,223,111,205,118,137,119,191,66,200,9,13,0,0,80,162,212,253,137,71,88,80,120,0,81,200,9,13,0,0,0,20,247,88,159,203,147,109,7,1, +66,2,111,245,75,169,46,85,95,125,37,106,205,96,194,36,66,36,145,199,182,162,152,71,168,18,160,157,93,118,80,45,50,200,9,13,0,0,0,41,3,244,205,12,148,36,69,178,66,200,9,33,0,32,0,160,207,112,76,158,135,118,75,255,82,196,242,10,195,236,201,180,90,64,86,26,119,178,30,216,1,106,14,146,137,43,220,5,26,57,2,225,237,246,50,137,35,200,9,13,0,0,0,180,212,149,167,75,202,109,238,146,34,200,9,13,0,0,0,236,129,128,190,107,64,130,107,139,35,4,83,123,79,173,116,214,56,86,90,66,101,5,106,65,66,36,73,202,150,226,40,87,158,242,93,249,14,178,140,153,207,41,203,41,132,193,108,216,252,6,0,129,69,138,132,0,33,202,9,9,0,0,0,128,198,217,155,156,45,97,92,117,82,196,248,14,203,224,81,151,176,91,227,235,147,128,25,12,82,36,241,10,191,199,225,0,85,175,20,164,173,250,190,76,207,201,9,13,0,0,0,228,208,132,23,83,174,181,25,0,222,201,9,13,0,0,0,236,144,146,190,57,132,75,43,1,207,5,223,119,214,245,50,183,26,180,217,247,215,145,238,145,82,36,237,3,133,201,171,6,129,79,108,98,136,217,72,71,207,201,9,33,0,32,0,192,79,80,44,158,196,247,0,159,207,201,9,33,0,32,0,192,143,80,172,157,213,220,54,146,50,4,43,255,82,55,191,178,64,2,100,79,105,40,61,51,66,2,231,127,219,175,112,22,17,165,194,130,149,110,113,19,67,200,9,9,0,0,192,93,79,115,162,74,108,155,100,0,223,201,9,1,8,0,8,144,203,161,63,152,193,230,147,255,207,73,202,41,147,65,110,88,78,102,88,70,80,69,102,123,82,196,32,37,223,208,161,30,1,75,152,209,100,158,27,4,82,200,9,9,0,0,0,237,244,52,74,122,252,162,77,1,50,200,9,13,0,0,0,250,130,254,165,117,244,196,226,228,66,36,49,78,152,163,21,71,160,96,8,128,102,149,237,154,207,169,0,113,209,145,237,252,240,240,76,158,232,185,89,223,51,200,9,13,0,0,96,119,0,243,61,212,238,205,70,250,206,17,21,225,251,248,240,31,110,0,0,0,104,152,61,2,82,36,173,66,143,215,107,138,67,145,101,219,93,237,59,125,82,36,133,88,205,215,1,21,133,154,162,169,251,12,145,190,35,200,9,13,0,0,0,250,192,189,183,71,80,68,62,130,95,201,9,13,0,0,0,20,111,92,155,251,67,246,57,2,82,36,229,147,23,201,83,148,106,136,116,249,236,42,85,78,35,72,136,105,66,193,172,24,152,60,110,78,54,250,22,221,207,201,9,33,0,32,0,128,78,49,76,157,150,131,187,146,34,200,9,13,0,0,0,210,128,63,15,171,64,165,37,47,207,5,121,109,222,55,114,87,161,66,186,234,153,241,170,233,66,36,75,248,144,225,167,150,160,213,162,102,233,252,197,94,222,201,9,13,0,0,0,129,21,58,196,57,180,173,102,0,66,40,11,213,243,51,97,222,83,2,64,128,235,42,250,0,82,196,222,6,189,228,17,103,104,90,222,145,125,229,190,237,82,36,197,138,213,151,45,23,141,217,84,234,83,84,53,131,81,112,5,193,113,89,4,0,0,248,79,141,102,248,218,6,222,201,9,13,0,0,0,104,210,189,189,56,164,28,252,1,50,168,192,137,42,212,148,96,171,90,175,100,84,242,203,19,82,72,6,210,108,4,115,27,60,113,252,24,253,221,245,20,35,200,9,13,0,0,240,129,10,11,39,80,105,240,245,178,66,200,9,13,0,0,0,170,52,197,151,71,216,252,240,0,82,36,229,201,78,215,203,136,88,196,69,40,125,78,150,112,82,36,133,219,6,151,205,166,46,245,118,131,212,42,170,82,206,201,9,13,0,0,0,4,244,78,222,203,67,227,155,0,222,41,75,149,243,199,203,127,207,11,0,2,24,236,233,1,66,36,83,181,140,224,183,142,133,238,221,213,223,133,191,234,82,36,35,213,188,135,51,26,5,246,164,186,222,115,95,222,205,203,9,13,0,0,156,188,188,165,12,16,133,98,50,0,206,17,95,25,0,0,0,0,32,195,59,115,19,8,75,1,223,137,3,67,245,82,147,196,0,0,0,4,16,36,78,140, +82,4,29,207,251,205,113,212,38,252,143,183,223,151,121,173,223,5,69,68,116,80,141,108,218,210,219,6,124,25,241,177,34,44,69,195,138,38,70,253,185,161,157,146,132,0,86,48,51,8,131,129,10,91,104,115,205,197,201,112,32,240,206,172,82,4,125,250,27,78,21,20,47,165,203,235,226,174,52,19,67,4,81,114,210,152,118,25,65,242,251,29,80,101,64,236,83,104,11,163,234,34,229,91,183,134,69,251,190,127,242,24,82,200,17,176,149,117,222,170,11,178,217,228,251,229,130,129,49,170,18,35,59,188,240,115,46,122,72,232,166,247,206,52,67,2,239,170,174,102,17,84,4,250,196,163,33,68,128,168,67,2,111,204,230,238,77,128,182,160,171,180,26,149,103,93,82,2,95,180,151,218,118,193,13,192,1,32,8,8,1,0,65,242,149,164,181,214,30,110,151,16,214,73,20,148,9,166,67,168,0,43,211,232,153,226,57,175,98,82,218,219,130,129,206,173,86,245,159,219,188,88,38,99,146,26,175,105,5,244,35,104,141,97,60,181,117,14,42,73,6,77,168,244,198,18,82,4,207,63,53,158,11,53,21,205,192,61,121,89,125,120,67,232,52,82,14,77,233,146,4,29,86,21,144,106,22,122,51,136,152,201,131,63,118,235,227,151,12,244,118,223,185,0,82,2,219,191,43,247,97,25,25,22,21,253,38,178,69,206,51,8,129,137,143,79,48,72,25,205,221,244,82,52,77,229,51,36,249,133,56,95,130,189,70,133,219,58,14,177,17,142,51,4,233,84,134,183,139,148,147,41,12,157,190,38,65,152,35,4,107,119,207,175,52,87,229,232,253,210,189,106,160,25,223,197,238,24,201,220,129,253,219,197,209,37,210,84,1,48,223,37,119,198,48,95,130,79,164,36,10,107,58,174,32,36,207,5,103,123,195,167,50,56,74,35,65,231,0,250,67,165,35,4,247,125,203,109,50,87,105,27,253,223,87,203,89,3,81,2,69,249,112,79,213,186,64,63,127,254,217,141,8,18,66,2,231,125,70,235,50,24,153,237,215,128,187,74,187,183,66,2,91,255,74,109,116,89,54,153,114,19,232,166,40,26,223,41,9,245,19,181,253,126,126,3,102,196,60,246,35,47,222,201,152,73,138,208,91,120,50,106,177,100,5,212,80,72,206,77,26,236,27,53,222,11,181,94,209,122,171,109,103,166,82,34,79,110,224,18,57,64,129,71,210,108,10,201,8,9,35,4,107,251,83,111,50,216,124,255,91,125,228,77,124,0,82,196,244,14,207,240,9,84,237,38,173,207,23,243,48,140,82,36,201,3,199,213,225,2,57,75,132,10,81,106,149,138,82,36,71,42,74,23,42,25,60,9,146,30,80,175,246,92,82,36,241,66,79,213,241,108,17,117,151,176,180,84,20,132,82,36,233,10,133,135,117,154,146,199,96,21,233,187,93,122,82,36,201,25,133,83,21,17,132,200,148,28,216,25,160,119,82,36,197,72,69,215,201,246,125,145,14,174,164,253,154,124,82,196,236,6,207,232,105,251,222,150,195,66,213,19,209,122,82,36,161,24,7,133,149,41,137,217,162,192,86,18,153,140,66,136,147,73,219,126,31,174,250,173,252,14,87,45,132,131,82,36,177,217,133,135,85,166,76,221,233,125,156,22,98,239,82,200,66,18,225,166,241,75,93,69,221,128,47,118,69,18,207,5,87,230,83,45,54,184,154,192,194,106,26,229,160,155,66,36,97,7,252,240,23,151,17,160,242,229,160,230,160,160,35,4,103,239,75,167,50,86,117,235,108,82,122,237,82,143,82,8,2,242,228,151,239,91,249,101,252,168,79,73,168,20,222,5,55,23,123,99,191,162,128,170,168,242,88,204,21,114,82,36,141,138,197,135,149,125,47,21,95,147,216,26,138,152,207,5,107,251,87,169,112,22,235,97,238,9,228,110,222,67,82,36,141,153,135,151,53,38,1,254,132,210,60,21,154,214,82,36,237,89,71,151,205,100,187,174,115,211,116,121,174,12,222,5,39,23,75,77,203,186,128,152,24,48,255,67,94,5,189,7,223,243,183,58,174,93,98,11,224,238,122,253,108,71,82,36,173,73,197,151,237,92,117,57,119,199,122,110,132,24,222,5,53,25,77,99,197,180,128,9,254,50,149,26,130,131, +66,8,129,137,89,244,217,14,233,232,219,88,234,94,10,1,35,4,107,251,87,111,50,214,224,89,144,79,195,227,106,125,82,36,237,66,79,135,51,40,219,169,226,157,246,87,42,148,82,36,137,9,133,215,49,68,26,40,98,34,104,188,56,70,50,40,2,213,215,199,139,104,203,61,54,60,228,39,253,61,82,36,165,88,135,215,209,56,34,218,20,106,105,199,233,178,66,36,25,206,148,243,167,79,43,42,17,2,85,154,41,245,82,36,201,90,135,135,173,150,253,33,213,199,153,44,138,76,82,36,245,67,69,199,41,203,5,173,88,103,164,50,33,8,82,104,38,210,147,79,48,40,88,245,235,80,132,226,247,174,33,38,225,230,19,12,210,234,53,237,155,18,137,184,1,68,82,36,165,1,5,149,51,103,149,198,154,34,37,4,19,96,35,4,103,250,95,111,50,55,132,4,126,74,81,243,31,96,35,4,111,119,91,175,50,87,195,22,80,91,66,133,195,177,82,36,169,2,199,215,105,213,206,149,235,199,159,54,167,188,82,72,26,140,239,223,53,236,251,131,47,200,171,164,6,147,207,5,99,238,211,237,112,54,121,117,100,107,116,109,45,188,207,41,162,137,205,54,220,150,155,110,42,72,200,111,173,48,51,36,237,165,71,90,66,238,191,187,117,203,176,38,65,42,82,36,229,26,199,135,181,164,88,173,2,232,67,176,22,197,51,36,241,36,71,94,65,255,254,127,245,158,124,129,216,196,82,36,209,83,213,149,77,154,222,73,65,185,24,36,101,156,66,36,89,207,152,229,40,8,184,245,154,107,187,153,151,9,82,36,177,17,189,135,229,248,215,165,146,209,84,12,1,131,35,4,223,107,227,243,54,25,185,9,26,90,233,235,26,107,66,36,221,74,238,241,37,151,222,42,239,245,80,212,0,206,66,36,37,202,146,192,54,151,177,253,247,117,93,10,109,2,66,2,83,239,83,179,52,88,42,138,159,174,187,147,229,127,173,7,71,41,57,59,223,192,248,250,253,206,243,15,196,2,82,196,10,21,217,212,73,8,68,225,33,186,165,119,245,2,82,196,14,21,213,216,33,35,5,6,132,80,41,25,168,104,66,36,93,82,148,177,22,79,41,247,41,247,34,103,41,128,82,36,173,26,149,199,45,94,254,160,247,216,221,190,166,249,207,5,243,117,214,243,50,215,68,27,109,218,142,156,215,159,50,4,31,253,90,69,195,184,64,65,13,173,72,72,40,77,207,5,115,113,203,177,48,86,25,51,219,185,222,97,162,166,82,36,165,82,205,133,53,209,238,10,149,1,1,0,0,128,207,5,243,255,231,109,116,23,105,242,156,110,11,90,2,4,222,5,7,223,70,61,195,184,128,79,251,242,139,110,146,21,66,36,201,218,146,242,40,16,179,93,155,45,221,106,110,96,82,36,233,210,22,199,233,116,223,223,175,239,93,190,214,24,50,4,53,3,55,21,213,196,64,111,155,106,5,74,130,186,82,36,169,91,159,215,11,85,250,150,239,165,181,201,134,176,66,36,17,211,178,131,23,79,93,71,181,73,187,34,33,50,82,36,209,194,254,213,97,183,243,18,155,171,230,60,17,0,82,36,177,2,205,197,233,218,252,27,203,197,217,122,248,235,82,36,209,67,207,133,75,54,227,166,20,197,144,128,198,16,66,8,130,73,8,242,91,86,28,52,152,86,11,234,199,28,222,9,135,201,58,80,113,92,123,26,189,210,212,247,118,86,82,36,145,202,140,197,9,158,121,45,90,146,85,162,6,9,82,36,137,218,6,149,77,183,235,72,154,171,164,186,139,188,82,136,14,50,232,195,241,27,187,252,236,136,10,28,214,104,83,72,0,204,245,179,211,255,103,15,189,121,91,178,12,121,82,36,129,195,78,83,19,32,50,0,148,83,137,72,150,249,81,136,231,225,225,218,255,153,209,209,255,244,80,154,46,85,66,36,135,240,242,148,39,143,231,170,206,150,68,174,98,116,82,36,107,136,70,135,51,167,91,42,111,234,100,46,71,139,82,196,212,254,194,230,145,253,137,239,154,80,213,186,24,137,81,4,233,218,64,45,189,184,0,152,231,146,153,14,50,1,95,137,3,235,220,209,99,182,5,0,0,0,64,134,49,94,66,136,3,177,13,112,204,61,0,32,0,0,223,143,95,95, +66,232,187,41,195,89,69,147,20,150,119,12,38,156,2,7,205,7,143,126,246,148,37,243,106,167,19,125,93,196,202,2,82,4,29,219,33,205,211,68,199,150,92,181,93,32,149,146,83,40,203,1,45,45,113,147,149,13,6,184,26,19,173,10,67,196,218,118,85,25,52,150,222,187,57,231,202,244,105,108,205,7,159,59,247,142,64,25,140,52,167,217,174,194,57,78,66,208,95,236,56,127,188,239,105,115,158,29,34,158,96,79,223,137,32,149,227,196,220,182,236,171,6,241,100,218,179,195,83,8,9,181,182,171,99,134,173,7,194,143,111,87,87,7,66,104,141,73,205,186,202,166,55,219,60,14,240,180,45,203,82,36,173,216,141,149,85,59,207,70,91,86,162,13,90,163,83,8,75,181,215,62,137,179,38,70,111,188,88,22,40,226,82,36,237,74,189,149,81,0,128,175,18,250,244,230,157,155,82,36,209,227,29,199,241,244,75,14,231,209,88,74,160,146,66,36,217,71,250,145,165,134,155,221,175,90,162,106,255,134,207,5,223,242,215,109,58,25,203,76,213,87,158,252,255,242,67,168,109,50,66,12,165,162,6,93,64,202,24,171,160,154,66,36,141,199,148,176,21,95,129,121,129,245,219,136,139,246,51,36,119,197,56,223,129,17,105,22,201,70,13,150,24,153,82,196,252,34,203,238,49,155,190,158,114,110,139,6,249,11,66,8,131,201,26,55,157,136,89,63,222,78,4,157,123,183,223,37,119,165,48,97,130,127,34,121,150,210,8,112,27,16,35,4,203,231,55,99,50,23,128,154,245,165,182,158,148,211,35,4,183,79,182,221,114,24,69,148,22,162,111,1,247,34,35,4,87,235,63,225,50,56,195,179,97,18,45,247,234,248,50,4,91,57,149,123,203,194,128,205,38,160,150,119,230,220,81,232,124,139,213,78,222,199,191,34,51,182,103,171,164,176,207,5,219,238,59,229,50,88,109,169,15,188,152,33,161,33,66,2,95,251,195,233,114,86,150,121,234,217,44,89,148,229,207,5,211,230,55,35,114,87,49,154,241,206,41,221,34,217,223,37,251,228,48,95,129,17,138,90,108,26,201,224,69,18,66,2,99,253,75,105,116,85,174,97,165,226,215,140,179,169,35,4,103,243,75,107,52,88,123,60,229,254,195,19,223,62,66,2,223,253,66,43,116,23,4,28,130,236,19,236,221,117,66,36,85,207,252,163,150,71,105,8,101,109,111,214,105,213,51,8,157,201,236,4,187,218,4,204,252,228,236,144,122,145,51,168,200,137,159,16,241,209,241,210,201,0,144,216,41,208,82,196,242,28,205,222,17,34,84,6,101,211,152,210,231,97,82,36,169,89,141,215,105,189,12,106,151,175,222,254,148,54,50,4,39,15,61,55,219,198,64,237,226,58,86,70,57,1,82,196,0,13,207,238,209,6,12,205,209,185,206,191,184,237,82,36,137,87,13,199,49,24,117,163,13,25,251,181,143,75,207,5,245,124,123,191,48,89,202,57,131,141,64,141,66,37,81,4,47,27,109,93,201,192,0,4,32,253,163,129,2,104,35,4,223,243,195,101,114,86,43,121,157,192,219,251,170,37,82,36,241,195,77,215,41,34,68,97,133,185,122,114,219,147,35,4,99,234,59,161,112,23,237,102,93,97,213,186,54,190,66,40,66,49,48,82,108,255,111,50,236,158,118,244,213,61,82,36,237,234,205,199,177,240,234,197,242,219,88,122,38,220,35,4,223,238,190,165,48,183,228,150,66,150,19,243,150,86,82,36,241,249,13,201,213,102,160,149,19,104,2,227,65,104,35,4,223,242,71,101,50,87,43,74,241,204,8,194,246,25,223,197,12,23,201,234,129,105,183,139,55,124,221,240,13,200,82,36,245,130,127,215,81,136,72,9,36,42,77,92,241,124,222,137,131,201,28,216,127,60,179,234,255,112,36,12,214,250,207,5,103,118,87,175,114,24,121,12,55,213,193,241,65,176,222,5,53,23,81,67,209,190,64,181,75,82,68,74,26,20,82,36,241,27,199,149,13,40,137,38,227,33,121,185,87,190,66,136,131,73,205,110,42,72,158,111,107,64,112,154,30,246,51,36,243,7,40,223,131,20,64,80,4,17,199,191,12,65,67,136,25,82,111,78,235,221,242,31,134,242,211,103,46,226, +223,37,229,165,63,90,130,71,164,94,86,47,163,140,194,170,207,201,202,225,63,237,248,14,191,250,205,70,138,146,9,13,82,36,137,217,132,199,105,23,20,77,71,110,93,17,117,159,222,5,57,27,87,49,215,194,64,194,114,233,29,222,251,6,82,36,173,25,69,199,65,55,71,157,60,131,85,158,95,222,82,36,173,66,207,215,37,181,235,122,164,167,102,88,3,78,66,36,13,67,248,241,167,94,111,204,117,205,25,245,153,162,66,36,25,87,244,242,182,86,154,17,122,146,168,185,141,178,83,40,74,204,249,177,19,255,99,196,162,44,193,191,139,249,35,4,231,120,83,243,112,23,18,132,138,123,247,60,161,60,66,2,211,250,91,245,50,56,21,44,245,14,245,27,233,221,35,4,87,119,94,175,52,183,224,162,165,18,43,111,15,172,51,36,105,103,63,218,131,50,1,193,78,154,64,95,215,103,82,36,141,2,7,135,245,52,207,141,50,233,130,170,108,187,222,5,67,19,79,69,203,184,64,223,112,57,149,178,38,145,66,36,25,199,244,144,151,135,167,80,32,240,149,201,127,162,82,36,177,154,23,199,237,60,144,246,164,185,120,178,134,136,81,4,67,63,97,103,199,186,0,40,128,124,157,26,177,154,207,201,7,81,16,49,236,62,112,177,76,158,46,55,173,140,66,36,101,207,150,148,39,0,9,100,102,104,101,125,95,149,50,4,67,43,87,81,209,188,128,206,68,42,15,229,53,42,50,4,113,81,75,65,227,204,64,205,68,108,159,224,254,3,82,36,35,50,138,87,146,241,71,175,51,101,212,40,148,214,66,2,59,127,95,181,120,56,190,243,192,189,76,28,38,76,81,2,153,7,83,41,237,198,0,196,57,247,20,167,155,171,51,232,20,241,55,15,63,229,255,163,63,216,25,144,232,9,82,36,205,202,198,213,113,29,4,229,50,210,251,13,117,214,82,196,10,11,215,228,97,99,142,111,151,221,75,228,189,206,51,36,117,199,47,224,131,150,37,9,223,210,152,77,156,44,35,4,215,227,226,177,120,57,131,82,174,144,187,252,214,186,222,5,85,53,65,67,221,198,128,253,175,178,133,122,11,61,82,40,74,18,225,179,243,51,252,200,221,176,3,242,181,202,222,5,87,45,67,47,225,206,128,83,227,195,168,118,139,112,67,196,66,112,211,1,72,73,81,169,165,70,192,133,120,67,66,72,154,9,78,42,132,11,207,58,89,86,54,209,170,226,207,5,103,253,226,181,54,216,106,121,55,254,125,50,245,28,67,40,55,172,72,204,205,127,65,155,31,1,113,243,22,127,82,36,145,209,68,133,53,131,121,169,78,199,163,253,94,211,82,36,205,194,198,213,139,188,172,158,229,228,172,81,66,146,82,40,17,210,104,211,181,83,153,248,237,36,50,31,38,187,223,37,123,135,55,226,3,106,223,230,187,219,119,180,147,66,82,36,181,218,6,147,77,152,78,71,101,47,166,82,103,141,189,39,241,223,170,242,19,182,155,106,141,108,185,117,254,1,82,196,18,11,221,236,65,30,133,106,227,186,1,249,155,86,35,4,211,239,99,55,118,57,148,132,27,2,205,157,53,75,82,36,209,194,188,213,161,38,146,65,178,81,89,174,43,59,66,36,217,255,142,144,37,71,108,78,80,221,178,237,187,239,207,5,95,239,230,119,118,89,104,13,188,175,43,217,89,199,66,2,87,102,234,181,56,57,64,117,178,37,186,222,62,233,223,37,115,6,24,97,3,139,208,254,160,65,145,145,38,174,66,40,145,137,152,50,25,14,12,36,90,86,235,106,80,212,82,36,233,2,205,149,21,66,109,162,114,219,120,126,157,148,82,200,32,146,76,197,243,59,95,73,205,196,181,69,30,208,207,5,99,252,83,243,112,152,136,175,211,185,128,248,34,36,82,196,226,6,203,226,209,24,85,24,90,255,223,185,41,50,35,4,125,232,211,53,46,88,138,197,202,138,175,92,11,69,222,5,31,227,94,43,207,186,128,208,52,115,141,106,37,153,82,36,229,90,15,215,113,42,51,189,19,38,105,212,6,93,66,36,207,65,206,177,23,159,239,149,74,153,226,16,10,149,66,136,3,49,141,111,204,62,0,32,0,0,175,239,175,255,66,40,35,213,241,115,99,222,103,0,64,128,208,96,144,48, +206,45,2,178,5,180,109,88,16,26,88,38,122,42,80,167,189,7,205,250,142,60,250,207,245,31,9,1,240,154,237,150,67,2,49,33,108,180,10,79,173,1,165,149,225,246,209,48,81,236,4,82,101,54,227,120,74,89,241,43,198,115,60,155,223,5,79,235,180,58,76,255,103,216,246,79,67,50,45,119,67,72,129,193,147,67,181,226,188,210,80,114,209,99,213,147,222,5,7,249,86,67,211,194,128,132,8,67,195,60,187,163,223,5,95,109,197,190,76,85,221,188,191,181,130,96,4,82,67,104,61,82,111,79,99,201,176,142,84,106,228,97,212,151,207,5,99,119,71,103,52,88,27,0,132,72,2,57,67,63,207,5,239,247,210,171,54,89,45,243,44,49,86,10,93,130,82,196,4,37,205,230,177,250,120,39,163,127,142,204,24,112,207,5,99,103,195,39,54,56,11,225,214,75,169,39,50,170,222,5,41,7,87,69,223,206,128,73,76,66,124,34,247,91,66,232,187,73,206,228,94,78,79,234,28,94,61,46,12,166,78,39,93,18,252,150,180,142,31,31,107,219,198,125,110,241,82,72,6,204,47,151,118,200,207,151,31,216,203,207,189,40,81,4,51,29,129,105,203,202,0,4,164,167,83,109,195,197,82,196,248,34,207,222,17,164,91,25,154,143,214,181,23,199,206,109,11,204,19,53,223,27,51,158,97,189,179,54,80,86,82,40,124,210,131,48,117,75,57,238,236,248,112,245,86,138,222,5,27,5,93,75,215,190,128,81,37,81,128,52,107,191,35,4,99,247,199,233,112,54,125,79,62,149,90,152,94,105,222,5,81,31,137,111,209,186,64,8,37,200,132,96,35,113,82,36,245,163,221,135,85,130,92,197,98,186,22,134,189,155,35,4,91,235,190,99,50,54,205,211,22,186,166,14,133,253,82,36,39,67,244,73,144,153,157,77,65,38,135,128,181,150,35,4,207,98,182,33,114,23,107,217,65,252,102,237,61,150,82,196,18,47,197,226,17,216,124,230,150,255,117,76,127,234,35,4,203,98,183,95,114,87,67,146,43,141,38,247,121,158,67,34,115,102,72,221,65,155,16,205,59,255,154,177,235,197,207,5,79,227,51,31,112,87,9,146,215,181,108,207,205,194,35,40,163,41,20,168,44,8,14,38,216,78,38,226,27,185,82,34,161,205,111,245,104,41,70,250,73,179,60,167,10,74,82,36,233,65,135,151,107,251,253,229,115,170,132,46,38,89,82,196,236,22,197,234,161,42,217,239,171,170,214,235,248,150,82,36,237,66,5,215,139,1,173,107,231,221,33,83,161,161,66,36,209,199,152,162,151,71,110,168,214,134,223,14,246,34,82,36,141,145,77,215,235,232,203,23,95,185,205,123,242,155,35,4,111,255,206,173,112,151,44,175,101,107,235,255,21,84,35,4,107,247,87,173,114,151,236,111,134,127,239,130,157,61,223,37,243,5,24,223,66,98,181,154,247,35,70,229,28,12,82,36,205,10,71,135,109,2,133,235,194,230,21,193,189,91,66,36,29,202,244,225,38,79,255,154,159,185,161,87,2,230,207,5,87,118,202,239,114,152,2,95,83,218,3,64,37,69,35,4,227,119,211,45,114,183,0,128,92,170,103,25,247,150,82,36,137,72,207,215,171,142,93,223,67,170,254,49,183,170,35,72,135,73,138,252,218,86,207,47,222,70,42,247,72,38,82,36,141,200,77,215,43,143,10,164,219,65,214,209,177,184,66,36,205,7,242,177,22,95,136,36,64,96,171,68,187,255,66,36,33,86,248,164,151,95,18,138,63,33,253,34,223,45,82,36,213,219,149,9,100,37,9,126,3,184,159,34,59,139,207,5,215,119,58,171,110,88,0,100,17,254,8,159,35,191,82,36,177,155,23,7,66,80,222,231,107,189,239,58,187,108,82,36,141,19,143,199,43,235,43,165,148,231,152,170,10,152,82,232,18,146,19,32,179,59,25,121,175,208,96,17,61,58,223,37,237,4,40,101,15,93,60,255,81,84,95,164,88,72,82,36,237,129,223,199,45,55,1,46,66,233,233,191,213,107,82,36,237,18,15,199,73,177,250,136,10,111,105,158,174,139,222,5,47,17,113,75,195,184,64,64,155,2,6,116,139,138,82,36,75,3,60,89,180,124,135,213,37,186,136,208,6,128, +66,36,229,219,180,196,37,135,122,33,162,167,136,253,88,78,82,36,169,66,151,199,171,52,195,205,165,230,164,52,136,204,66,36,149,139,244,145,165,142,32,90,10,162,166,121,214,26,82,196,248,12,205,234,49,119,171,215,173,206,23,112,217,227,222,5,35,23,85,79,211,190,64,34,139,35,140,25,106,70,222,5,227,242,14,255,180,204,0,100,20,65,45,109,89,95,207,5,107,251,95,179,116,152,128,115,16,125,185,223,93,191,82,36,169,201,70,199,113,219,11,221,214,178,188,22,75,139,35,4,119,245,87,115,114,215,112,242,146,148,255,229,55,166,66,36,205,198,238,194,150,71,251,43,90,166,110,110,232,102,223,37,231,197,23,92,2,241,191,122,91,45,123,191,1,247,50,4,249,244,58,55,209,180,128,230,246,115,227,74,2,227,223,37,107,165,79,96,66,177,98,255,12,45,208,48,41,80,66,36,199,65,236,191,23,135,152,215,144,169,36,50,230,140,66,36,21,210,146,146,39,95,32,25,111,122,221,154,238,149,82,196,0,9,199,238,225,250,117,126,24,191,94,128,53,19,223,37,233,166,71,88,67,12,8,168,20,217,73,96,214,193,66,36,229,207,210,177,149,14,123,7,151,151,159,119,85,127,66,36,37,74,150,255,166,158,113,255,97,173,145,90,2,170,66,36,153,135,180,161,22,135,134,255,106,174,170,166,24,90,223,41,252,233,155,79,48,65,62,197,252,132,91,141,46,224,66,36,17,218,244,179,38,143,215,85,85,138,19,104,241,103,51,4,91,48,61,59,140,68,19,146,98,72,82,157,203,192,174,7,221,110,45,57,76,97,196,0,22,72,132,44,192,115,35,104,213,161,247,229,184,102,82,9,219,72,112,211,252,11,67,40,75,146,44,203,227,121,152,153,64,22,46,131,29,133,82,196,4,17,209,228,1,131,93,228,46,255,251,173,79,7,66,2,223,127,94,245,118,88,125,174,186,27,6,230,202,164,81,4,63,35,65,67,215,202,0,32,61,92,68,199,178,136,82,36,205,10,79,149,21,19,83,234,15,137,209,254,5,97,66,2,223,254,227,247,118,89,225,32,169,105,222,93,119,19,82,34,165,75,54,120,96,129,167,33,254,166,111,207,231,76,82,36,141,19,215,133,205,32,169,217,165,184,108,104,53,203,82,36,209,18,15,133,13,38,192,150,36,168,221,3,93,223,66,36,101,7,140,224,179,6,117,133,245,70,245,111,112,105,222,5,55,15,45,23,215,194,128,232,54,8,151,228,158,93,82,36,241,130,204,197,33,249,151,252,154,39,71,124,35,211,66,196,6,3,213,232,1,0,127,149,5,182,85,176,245,117,67,40,1,245,190,38,229,83,143,209,81,105,111,185,128,213,207,5,75,99,102,51,120,26,128,242,203,226,119,255,183,183,82,196,16,9,221,230,1,149,91,198,150,47,119,36,243,190,82,36,177,146,126,197,65,136,219,70,214,129,176,49,250,155,66,36,229,143,204,225,36,87,128,254,185,232,149,226,101,170,82,36,145,210,70,213,1,8,141,102,222,19,193,191,171,158,35,4,231,123,102,249,52,184,122,187,165,89,138,92,255,189,82,196,252,2,201,228,81,27,205,237,214,148,40,228,174,177,82,72,45,172,247,135,190,224,243,147,47,192,104,234,233,218,82,36,209,194,70,213,81,17,82,10,33,168,120,76,162,105,50,4,63,31,57,45,209,188,64,9,228,170,220,105,251,250,82,36,205,195,134,135,21,36,68,169,212,231,219,126,95,251,81,140,76,236,251,121,252,95,46,10,135,9,181,237,53,191,81,4,69,51,93,63,205,198,0,164,28,100,162,5,72,12,222,5,67,27,63,41,207,192,64,0,64,105,191,45,243,85,82,36,205,210,110,135,229,222,83,103,114,19,81,158,129,188,81,44,2,204,253,88,236,127,46,22,14,61,176,42,185,170,82,196,246,24,201,222,49,102,114,74,229,145,164,22,0,67,223,37,119,3,64,227,13,80,116,164,175,65,247,12,157,104,82,196,240,16,203,226,177,54,226,22,90,84,113,185,175,187,82,36,133,88,77,215,49,109,90,236,231,203,134,96,23,117,222,137,3,107,101,14,12,177,7,0,0,0,196,133,193,156,222,137,3,11,221,166,202,15,0,0,0,0,132,117,171,85, +83,80,139,200,219,254,242,91,183,128,32,104,84,158,130,121,67,40,2,195,16,94,251,254,56,167,162,200,244,70,177,251,67,196,64,81,108,9,36,36,80,246,147,239,169,124,159,218,34,236,58,245,157,111,174,62,59,38,114,123,214,88,110,138,66,2,111,145,202,222,112,86,38,0,225,200,127,189,127,233,67,200,24,245,121,183,191,232,103,157,3,39,225,106,94,65,19,16,55,73,57,119,85,123,178,162,217,168,42,84,6,74,67,2,75,197,181,48,139,18,7,26,111,107,188,51,247,140,50,232,145,41,55,6,149,37,112,170,245,132,228,231,126,170,82,36,51,171,152,153,84,246,20,230,179,50,4,69,57,134,207,5,247,109,74,183,112,86,59,45,98,52,115,244,158,223,66,36,17,146,242,146,37,95,34,247,0,102,170,154,91,185,35,4,115,247,91,177,118,153,196,164,154,142,139,219,215,82,66,36,85,23,154,196,40,1,237,94,101,238,137,86,3,178,66,40,129,73,158,124,157,16,76,62,43,64,127,231,111,144,82,36,233,73,143,197,169,134,144,46,37,193,38,205,16,71,66,2,91,123,219,107,120,88,136,217,44,147,198,253,44,177,66,36,137,199,246,255,23,151,8,196,136,222,244,221,117,89,35,4,103,119,75,235,50,55,69,243,128,75,43,89,188,54,66,72,1,17,47,177,44,63,175,145,140,158,57,89,254,94,82,36,201,66,5,149,75,183,107,7,86,77,155,183,110,156,82,36,141,9,197,133,205,94,28,123,239,158,253,73,241,159,66,36,93,11,246,177,150,71,10,154,214,118,217,175,105,6,82,196,242,20,203,230,225,214,24,189,100,127,89,58,79,201,35,168,162,137,158,44,24,14,190,56,221,80,14,56,77,9,82,36,177,66,197,213,41,236,77,98,67,218,123,98,249,20,2,38,89,86,150,210,166,94,94,81,225,233,223,63,243,251,34,140,19,139,45,143,235,238,153,145,9,228,186,106,93,121,82,36,141,153,133,215,177,246,62,169,114,20,129,12,24,215,35,136,131,73,26,102,43,80,137,250,153,78,52,218,25,243,50,136,218,41,22,97,124,37,99,26,173,100,213,222,220,4,82,196,242,20,195,238,9,171,210,81,82,233,175,231,238,185,65,236,21,18,76,52,46,94,74,54,222,134,41,245,240,251,82,36,141,24,69,215,107,166,149,175,88,26,246,128,78,164,66,36,145,139,244,177,40,159,25,85,89,125,146,151,48,163,2,38,213,211,150,196,23,95,206,2,200,218,63,91,21,107,67,232,70,140,55,132,225,123,66,24,94,144,251,71,151,249,66,36,197,255,206,207,151,70,78,170,77,185,230,41,169,34,82,196,244,6,195,238,105,167,20,253,65,186,248,42,86,125,207,5,227,246,86,175,50,214,114,30,62,30,111,237,52,212,66,104,139,73,136,250,221,94,205,52,93,94,144,219,91,213,50,4,33,5,73,53,193,184,128,195,148,27,64,153,19,243,66,36,209,202,142,175,23,135,159,18,31,170,153,160,150,41,35,4,243,251,95,115,112,23,227,255,212,148,94,139,59,191,82,36,201,2,199,151,13,243,223,221,87,173,166,86,173,171,82,196,246,2,197,234,41,157,185,22,251,51,24,178,168,85,82,36,173,210,4,135,85,100,130,153,50,201,117,93,150,223,35,4,239,251,90,177,50,151,196,140,41,72,111,84,228,245,82,8,29,76,255,95,30,172,255,131,47,24,212,106,251,125,35,4,243,253,235,237,112,54,132,148,56,111,40,159,158,167,50,4,27,9,55,47,205,182,64,77,235,40,105,230,53,86,82,36,237,218,62,133,37,21,5,77,35,186,245,76,158,207,82,36,201,25,71,197,233,244,150,165,79,81,149,10,170,13,66,40,149,9,251,58,222,54,2,193,158,64,6,154,254,23,82,36,177,194,198,213,65,25,84,213,28,232,28,165,61,211,82,36,209,2,13,133,165,38,128,254,164,170,240,12,0,131,66,2,87,243,99,177,54,88,83,251,89,217,162,81,134,172,50,4,71,37,59,53,219,200,128,65,128,230,181,52,219,63,189,39,33,214,144,178,163,134,192,41,96,101,99,2,210,111,82,36,141,217,190,213,1,34,105,32,99,194,232,47,247,157,82,36,169,210,78,199,3,35,81,206,145,49,228,160,41,213, +222,5,39,251,68,43,207,194,64,65,117,90,5,86,9,184,82,196,226,252,202,234,17,130,42,45,167,230,164,195,117,122,82,36,71,11,116,151,64,42,0,162,14,200,171,111,191,140,51,36,111,99,224,89,4,131,201,230,162,12,171,180,210,126,66,36,197,198,238,224,37,150,169,40,85,42,230,29,204,245,35,4,119,244,218,183,48,57,92,32,150,24,83,216,215,210,82,196,240,22,193,220,17,37,153,223,100,250,168,58,161,82,35,4,109,245,251,190,44,89,104,173,4,167,136,152,58,60,82,36,197,201,246,199,163,184,47,42,175,19,154,232,173,68,223,73,140,9,108,211,179,19,158,208,205,4,207,229,2,247,207,5,239,118,99,117,54,153,234,147,102,110,115,9,131,62,51,36,235,102,55,222,67,130,216,124,85,179,174,99,117,55,66,2,103,240,95,181,54,87,42,4,10,200,74,20,196,185,82,36,233,203,12,135,83,72,174,146,239,187,93,164,157,140,35,4,239,249,235,243,114,56,200,157,91,8,43,10,85,175,66,36,201,211,204,241,22,158,8,240,42,218,142,0,68,0,82,36,161,130,196,215,41,91,250,103,255,186,125,164,46,97,67,196,186,15,219,197,248,146,121,231,57,249,118,176,190,47,205,107,61,107,182,130,152,36,255,49,131,12,101,81,12,85,82,2,103,223,107,163,219,8,129,64,1,10,10,97,48,188,82,36,137,10,79,135,81,24,82,66,101,229,158,246,150,148,82,36,177,219,12,135,173,218,2,62,127,25,231,127,166,187,82,196,4,25,209,206,33,165,90,149,175,152,86,224,52,147,82,36,169,83,143,135,53,59,199,132,113,86,84,190,75,74,35,4,99,242,83,113,50,23,82,146,82,30,170,36,26,104,82,196,244,14,197,230,81,22,45,166,37,201,92,238,243,126,82,36,133,66,79,199,17,187,134,12,69,106,95,195,124,115,50,4,67,23,99,77,203,188,128,217,21,48,127,50,87,190,66,36,17,139,150,176,23,159,153,2,43,10,146,117,238,95,66,36,13,139,246,177,38,135,0,19,102,39,86,173,214,196,66,36,161,143,186,147,183,95,115,153,112,89,212,85,228,239,66,36,81,22,148,198,165,158,206,204,109,228,121,71,11,69,82,36,237,65,207,199,51,129,174,217,231,190,94,86,245,108,66,104,133,137,141,230,46,142,26,102,93,72,189,125,110,180,82,36,141,2,77,199,75,107,190,82,194,50,149,70,185,23,67,104,38,76,24,180,229,137,193,91,158,93,118,83,53,77,82,36,145,3,207,149,77,148,191,6,83,207,102,204,56,83,82,36,241,201,78,199,169,164,24,87,167,205,127,249,92,248,82,36,153,194,196,147,21,34,147,69,82,49,32,169,33,145,82,36,181,202,68,133,5,152,138,165,84,249,221,249,232,105,67,34,115,135,39,94,131,251,247,230,248,141,243,146,201,135,51,36,237,69,55,90,130,197,69,43,2,80,59,81,253,191,82,36,205,194,134,135,53,150,206,151,246,213,218,175,149,253,66,232,153,73,156,122,29,64,75,50,152,94,173,127,248,191,222,5,45,253,48,29,199,184,64,232,133,249,122,77,93,87,50,4,51,9,35,25,203,188,128,238,28,164,110,76,150,194,66,36,13,135,234,241,23,151,34,201,34,103,88,217,220,217,82,36,137,16,141,201,19,149,137,157,236,174,93,41,246,58,50,4,57,21,37,45,199,176,0,237,239,111,83,158,41,144,35,4,111,255,227,51,46,53,99,57,183,255,135,0,74,84,82,196,226,250,182,228,17,140,84,8,97,139,103,250,246,125,223,37,9,61,57,223,141,4,1,138,52,101,82,202,242,244,81,72,26,146,146,173,252,245,4,221,1,87,143,207,174,141,66,2,115,254,95,177,46,53,38,82,94,197,29,198,251,6,35,4,227,248,222,115,50,85,205,147,0,207,89,146,214,62,2,38,161,219,178,229,150,86,134,106,40,44,93,55,127,251,82,36,165,193,252,151,19,0,64,68,129,50,149,45,250,108,66,36,13,134,146,225,40,71,68,110,237,126,85,37,170,175,66,36,17,74,150,242,183,78,170,138,121,66,151,230,185,219,81,232,99,51,231,131,1,0,127,221,80,134,39,2,1,97,95,137,3,11,76,177,27,170,6,0,0,0,64,219,235,41, +67,2,91,162,77,90,77,137,134,35,53,142,228,90,144,202,67,2,223,34,102,232,76,124,63,50,143,104,62,138,194,240,83,2,171,184,4,47,88,169,132,17,61,8,249,79,237,255,67,232,187,73,243,224,177,139,103,203,129,252,70,144,194,71,67,136,103,195,20,135,119,252,187,183,34,45,42,185,80,235,67,104,13,112,242,241,99,171,110,117,6,24,49,56,161,7,65,42,31,140,119,127,216,214,125,37,71,71,116,174,255,251,67,232,70,236,9,149,110,97,182,32,91,66,7,251,103,250,207,5,213,20,100,94,126,51,83,37,131,185,88,179,106,53,67,200,127,245,121,111,238,168,211,215,66,161,181,197,31,233,66,144,185,70,178,56,153,194,188,153,27,41,121,77,234,2,82,2,185,166,92,110,83,49,24,100,216,196,175,193,84,103,207,73,129,193,149,199,54,124,148,89,95,78,16,78,95,219,67,136,40,149,119,183,231,200,100,142,3,10,218,70,37,39,82,4,25,250,41,76,115,25,0,232,97,58,152,128,145,173,223,233,132,73,31,79,176,56,217,65,236,244,227,159,41,27,222,5,73,9,103,99,209,180,64,221,75,167,132,202,2,140,67,2,207,101,189,180,10,61,70,186,143,201,254,97,166,101,35,4,87,243,87,175,118,152,4,212,216,251,29,83,228,214,66,2,95,122,218,171,52,87,90,255,36,179,68,34,44,0,82,196,238,12,193,242,209,214,155,135,20,164,179,197,245,93,82,136,76,18,101,212,119,235,32,248,59,100,89,50,219,20,206,237,4,12,12,53,63,12,181,158,127,240,2,214,194,247,82,36,173,25,255,149,11,185,106,136,80,186,154,96,169,92,82,36,237,1,135,215,139,69,101,122,10,75,105,111,235,125,66,36,33,70,178,227,21,95,21,223,214,213,247,102,19,40,81,4,73,55,67,49,221,208,0,104,193,21,207,92,4,76,50,40,130,105,166,34,113,0,170,96,227,132,100,30,148,147,35,4,87,247,235,117,54,57,121,253,61,181,15,40,97,64,35,4,223,226,227,179,54,89,125,158,245,204,179,46,59,38,82,40,118,108,183,31,127,240,251,163,31,216,76,10,134,0,66,104,166,137,24,50,88,94,28,228,222,78,212,208,116,188,35,4,111,247,91,111,50,151,172,255,161,41,76,42,171,185,66,36,213,198,144,225,22,87,98,238,90,68,121,230,179,98,35,136,160,9,140,250,219,86,13,52,44,64,206,230,113,145,82,36,197,9,207,215,83,231,46,68,20,246,101,152,11,202,35,4,235,126,95,241,112,23,91,84,106,42,72,55,100,109,50,4,23,19,79,63,195,186,64,132,127,164,17,100,161,207,82,196,232,6,189,242,201,78,116,126,126,51,197,223,149,54,35,4,239,118,91,175,112,183,124,91,72,68,245,237,8,33,82,36,137,18,77,201,205,6,112,65,224,150,137,185,127,120,82,196,232,6,191,232,49,183,235,230,243,215,121,87,137,187,66,36,209,79,208,177,39,95,42,145,254,17,178,27,1,18,222,5,255,0,55,59,203,176,128,202,188,48,16,50,218,137,82,36,197,9,199,151,77,234,156,40,173,48,246,150,85,63,222,5,11,5,63,57,195,174,64,27,207,218,147,118,97,24,223,37,255,0,242,95,141,156,148,161,110,175,219,107,90,149,207,5,109,245,253,60,108,88,144,8,92,156,94,246,241,178,50,4,5,3,69,71,189,170,128,138,176,105,36,62,249,171,81,2,25,1,73,61,185,172,64,90,133,54,147,220,74,103,82,36,137,17,71,201,75,35,205,117,99,242,149,201,224,122,82,8,3,76,215,23,94,164,255,119,47,88,175,183,182,92,50,4,49,21,47,47,203,186,64,50,94,209,69,58,147,87,35,4,239,115,226,177,114,214,26,197,202,42,21,57,255,134,82,36,137,24,71,215,49,25,107,161,160,138,148,173,110,82,222,5,57,27,57,59,205,182,128,8,128,65,208,124,245,105,82,196,244,252,202,234,177,174,51,39,18,229,218,160,217,109,82,36,197,200,188,151,205,166,176,121,99,219,148,253,108,71,35,4,239,255,111,245,50,56,227,134,0,185,74,117,233,170,66,40,17,49,207,239,12,159,142,143,108,159,124,218,37,246,82,196,238,252,204,232,1,36,4,32,37,234,123,90,219,173, +66,36,137,75,230,239,38,143,145,230,240,94,93,100,173,160,82,36,165,137,124,199,81,17,141,2,114,217,224,219,151,204,82,36,193,0,207,215,41,87,101,186,50,215,186,189,139,207,82,36,161,9,205,215,177,26,55,231,36,237,213,123,189,116,82,36,129,200,142,135,149,198,141,105,103,114,141,84,18,98,66,36,199,249,236,225,39,151,251,20,57,169,57,121,155,119,222,5,9,225,56,33,209,188,64,70,162,28,216,154,183,234,51,200,152,129,186,42,223,10,222,204,220,36,234,72,29,103,222,41,202,105,96,77,120,29,248,208,255,130,244,182,157,238,82,36,233,219,204,213,1,232,131,239,36,73,1,32,42,0,35,4,255,241,95,183,50,86,97,250,126,107,241,124,237,219,66,200,191,41,96,100,223,230,119,245,187,6,210,99,145,150,50,232,133,41,244,192,155,228,1,145,37,113,229,127,105,177,82,36,7,206,76,201,45,181,125,5,97,249,93,182,84,22,82,232,5,245,105,222,16,48,99,230,14,249,168,111,89,165,50,72,143,73,168,233,119,253,194,133,96,145,180,60,141,117,34,72,142,105,118,246,37,102,116,107,217,95,64,77,127,247,82,36,169,19,135,199,129,125,250,239,183,230,91,168,238,1,81,236,31,204,125,249,228,92,38,106,163,234,128,219,160,10,207,5,107,127,227,175,116,86,203,210,147,241,131,248,10,36,82,36,241,10,7,133,73,181,234,38,158,193,121,84,132,144,66,2,219,240,219,115,120,86,166,89,92,27,192,85,132,108,207,5,255,244,99,113,48,85,83,113,146,118,126,149,55,215,66,104,133,9,30,50,93,94,201,36,43,64,137,172,117,215,82,36,35,223,62,151,83,32,105,10,132,200,121,52,138,234,222,137,142,73,136,237,87,217,194,209,63,113,132,203,181,5,207,5,111,238,83,175,112,86,61,230,74,35,106,123,109,215,222,5,35,9,91,75,207,172,128,164,19,42,85,36,217,77,207,5,115,251,222,235,114,53,197,42,67,174,66,229,32,191,82,36,233,9,191,201,241,158,88,151,14,136,228,32,42,0,35,4,251,249,95,177,114,85,229,90,104,76,65,251,247,62,82,36,173,137,205,151,21,161,16,210,99,176,127,41,103,122,66,36,133,67,142,191,182,158,82,133,247,230,145,142,40,130,207,5,253,121,227,183,50,23,227,97,47,40,59,101,85,138,1,10,1,210,110,124,227,21,166,153,211,221,79,49,182,169,82,36,241,83,23,215,41,95,5,233,119,166,120,190,215,58,223,37,23,88,162,101,141,209,208,6,205,83,245,244,215,219,66,36,201,199,136,161,23,135,236,154,228,121,89,125,114,39,82,36,173,3,87,199,33,10,144,39,1,223,144,170,174,75,66,36,221,15,172,241,182,70,178,162,162,154,136,237,101,237,82,36,237,217,6,215,177,0,209,13,100,83,169,34,150,161,82,196,246,252,188,238,9,52,121,67,18,143,228,43,66,106,82,36,11,106,72,25,12,34,82,197,147,228,243,23,146,90,207,5,107,250,227,249,112,54,229,76,24,176,193,168,79,69,82,196,248,0,195,222,49,44,203,105,3,179,185,160,41,0,82,232,70,203,186,76,145,252,125,189,5,18,9,168,234,121,82,8,46,18,237,226,111,64,218,116,252,136,107,177,133,19,66,2,249,15,249,153,238,20,119,127,123,239,119,14,78,0,50,40,14,43,185,237,251,242,110,17,95,3,88,170,87,41,66,2,27,15,70,219,177,52,253,93,215,144,183,57,187,187,66,200,137,105,157,63,68,171,56,254,214,93,127,39,145,244,67,136,14,163,61,253,119,60,154,117,32,240,224,39,14,165,51,2,215,230,231,148,177,86,1,242,126,232,220,143,238,185,34,72,247,201,183,150,156,5,128,249,177,85,64,151,149,95,223,37,127,173,233,93,141,154,59,99,234,228,123,73,175,229,207,5,127,253,227,241,110,21,21,68,136,152,85,142,6,233,173,7,9,239,56,45,185,166,216,146,51,229,4,167,81,115,82,232,4,204,150,207,61,136,247,103,25,166,54,180,123,6,82,36,197,17,77,201,81,25,132,230,36,170,175,35,155,27,81,136,3,75,46,224,247,180,6,0,0,0,16,10,7,0,66,136,3,113,142,15,204,62,0,32,0,0,159,191,79,143, +33,10,239,97,147,49,101,170,86,42,6,128,17,48,55,67,66,144,111,67,169,207,215,183,219,59,198,161,181,18,14,201,67,232,4,195,101,222,231,190,41,165,99,176,196,99,213,111,82,4,115,61,177,219,241,246,2,159,33,228,216,94,148,99,83,2,111,177,200,54,166,105,129,188,31,0,221,137,112,232,67,8,9,48,146,54,119,139,20,109,12,53,102,163,180,242,65,234,4,85,51,215,167,105,15,192,136,121,69,102,67,26,67,2,237,67,103,246,12,209,66,20,111,199,109,141,54,31,67,200,24,163,209,69,220,182,105,173,32,117,38,195,89,119,81,170,18,12,103,29,213,114,28,56,128,149,16,62,151,220,83,2,243,217,138,59,117,100,113,90,229,171,107,136,162,51,83,104,216,97,37,41,173,141,111,17,208,207,102,78,47,33,223,5,87,68,141,84,138,45,72,246,233,106,58,59,33,72,65,138,76,236,190,111,239,159,182,225,231,154,211,9,172,4,207,77,154,242,56,183,184,85,104,218,216,165,34,219,117,71,83,200,174,1,5,73,109,101,41,11,255,14,107,36,8,130,67,104,252,73,227,192,161,99,39,79,129,254,69,58,142,175,66,140,159,164,98,90,107,166,216,153,162,166,88,105,216,112,221,7,27,43,55,33,2,147,220,169,21,182,175,66,228,247,51,4,59,169,236,182,138,105,6,116,153,179,222,126,150,53,207,5,123,241,230,247,114,216,192,176,28,189,255,117,212,254,66,2,253,152,98,158,52,21,10,174,130,72,198,108,51,147,173,7,45,135,84,207,212,174,200,235,49,44,63,244,171,237,82,36,137,2,79,213,145,169,20,172,162,96,69,108,63,227,82,104,28,236,167,223,118,208,223,165,31,192,220,140,181,114,223,37,231,102,63,224,130,118,125,181,211,253,183,113,215,199,223,41,169,9,225,165,51,232,196,15,13,20,34,225,214,189,66,36,221,134,180,194,37,143,105,172,239,26,246,59,151,155,82,36,205,209,134,197,145,53,141,47,69,251,20,61,191,116,82,36,209,217,132,197,51,164,140,162,242,13,71,251,164,146,82,196,10,11,219,238,113,164,254,4,102,157,182,58,235,101,82,196,14,13,221,230,81,245,242,90,150,254,101,219,151,121,82,36,177,218,132,133,165,218,122,182,234,249,116,14,148,91,207,5,219,230,103,177,56,89,237,147,54,207,221,118,190,2,207,5,223,115,231,181,118,89,99,80,234,227,251,212,153,155,82,36,209,3,205,213,41,249,63,69,243,55,81,42,4,141,82,36,173,217,190,149,5,144,104,4,243,67,69,12,40,0,35,232,227,73,28,58,88,158,154,108,158,94,141,44,61,46,82,36,229,201,14,215,41,173,63,190,210,85,217,175,21,221,35,4,115,127,91,175,48,182,160,200,225,64,57,47,143,174,66,36,13,82,146,210,24,16,9,49,175,90,223,237,223,223,223,37,109,133,47,90,2,59,144,59,36,169,144,20,13,209,81,2,7,227,11,167,195,108,1,18,139,72,39,42,150,52,82,2,87,253,231,230,217,192,162,35,113,98,68,4,16,33,206,233,132,225,151,107,216,236,148,188,234,95,79,220,149,34,82,196,230,169,109,243,169,44,1,254,229,187,15,118,159,87,67,2,59,30,164,173,150,74,137,130,38,12,133,19,0,201,173,7,79,255,96,71,193,170,248,244,136,129,238,5,129,82,82,196,230,254,186,232,105,85,118,230,26,184,95,134,125,158,82,36,233,218,62,135,85,10,137,8,192,41,101,201,181,46,222,233,153,137,24,113,148,92,40,26,255,116,52,37,84,139,82,36,137,217,126,215,49,150,2,225,207,129,89,169,175,138,207,5,235,119,227,49,50,86,123,202,174,82,47,108,86,103,207,5,107,251,95,111,112,54,195,50,91,111,208,55,153,58,82,36,141,146,246,135,69,8,149,77,1,232,236,244,216,143,66,168,22,209,14,16,140,158,15,112,12,159,90,100,234,226,82,36,169,2,69,201,51,161,220,164,148,248,92,226,216,79,82,36,165,200,254,215,49,151,230,73,183,63,5,54,187,112,66,36,77,199,238,176,39,71,90,159,86,175,222,93,222,245,66,36,209,74,238,224,38,135,237,40,93,100,150,149,155,123,189,39,209,211,172,241,150,214,219,235,9,69,170,102,74,170, +66,36,9,198,140,144,54,143,102,70,175,237,123,119,123,223,222,233,187,73,174,104,116,124,106,216,241,112,164,207,136,82,35,4,123,253,103,247,50,87,89,127,247,81,59,100,248,63,66,36,131,249,198,225,22,151,196,255,232,212,64,110,162,104,207,5,119,124,110,247,114,87,144,42,145,202,45,32,202,239,82,136,3,76,199,31,118,192,251,135,57,230,167,6,110,75,82,36,129,217,78,199,17,117,223,250,213,229,116,114,159,181,81,4,7,241,58,55,199,188,0,88,39,154,181,172,204,2,82,36,137,217,12,199,201,48,3,85,159,189,110,92,170,21,207,5,243,112,231,181,52,183,202,54,13,162,197,235,77,53,35,168,136,41,48,100,40,40,224,58,218,86,13,254,126,218,82,196,222,254,194,232,49,28,91,35,144,29,136,16,32,28,207,5,125,112,230,177,114,55,35,58,253,190,232,228,56,99,82,36,133,2,135,135,179,188,75,85,94,201,214,236,20,0,82,196,220,254,194,220,137,245,148,119,21,11,137,8,148,87,82,136,19,18,147,78,176,243,175,252,190,132,255,30,42,230,82,196,248,24,199,218,209,38,210,169,160,201,216,153,161,206,174,39,109,135,63,90,70,238,21,34,213,17,206,255,225,39,35,168,170,137,152,244,155,78,220,250,25,70,116,202,135,62,66,2,83,250,223,241,122,56,2,50,102,118,157,26,233,44,82,2,231,254,44,231,99,144,152,32,65,4,6,249,144,187,67,34,231,133,71,220,129,244,6,145,94,194,207,78,190,107,222,5,75,17,71,73,221,188,128,0,4,128,8,32,42,97,82,2,51,252,59,167,91,88,205,233,239,201,178,29,8,83,82,36,173,17,133,133,85,181,198,64,26,179,35,31,95,55,82,36,141,27,7,149,245,22,148,165,146,166,95,30,8,203,81,2,23,211,58,41,207,184,128,228,89,128,95,136,36,54,82,36,225,202,206,215,49,136,147,127,226,223,150,146,120,251,67,200,24,114,202,132,37,192,178,41,22,200,107,85,177,213,82,36,67,214,68,151,115,132,4,53,19,234,179,170,180,79,222,233,141,137,44,213,124,125,122,96,49,241,180,40,146,211,222,197,238,8,195,228,1,0,64,39,82,167,70,251,130,154,82,136,103,12,247,151,126,200,235,131,63,0,218,192,197,91,207,5,119,240,231,57,114,55,49,74,96,94,120,41,125,144,67,2,215,206,21,209,139,0,68,206,192,194,130,200,5,90,223,9,2,171,62,114,4,238,72,20,124,185,209,3,109,97,66,36,17,142,140,207,39,135,221,68,253,230,166,64,142,86,82,36,177,2,79,151,173,92,131,238,85,243,93,26,1,136,82,196,246,2,197,214,49,1,202,165,182,190,109,51,127,178,81,4,41,29,55,51,193,180,0,88,154,236,8,13,235,108,82,36,173,129,70,135,45,169,105,43,210,155,217,43,140,149,35,4,111,250,103,251,112,86,117,156,229,255,42,7,109,174,35,4,239,238,235,245,112,86,11,51,247,67,107,84,223,207,81,136,31,82,233,29,210,237,14,94,233,223,15,168,20,93,66,36,145,139,238,227,40,151,134,109,80,102,193,56,107,16,82,36,169,201,70,151,179,72,71,91,35,170,95,194,61,13,66,200,194,73,13,100,107,8,92,56,223,78,151,167,96,200,83,72,1,236,241,120,151,225,220,44,6,144,12,95,244,255,82,196,252,0,199,224,17,2,59,72,150,255,152,236,136,168,67,200,9,44,59,29,166,131,194,89,92,88,16,248,226,104,83,194,10,183,83,41,68,1,229,67,107,251,158,243,254,187,67,2,183,189,123,45,20,0,52,32,188,13,167,25,184,134,82,36,197,195,132,137,245,86,124,37,219,86,212,74,170,187,175,9,130,105,168,31,92,37,10,155,225,223,77,174,19,124,223,37,9,157,1,217,142,145,59,147,116,90,192,107,121,28,66,36,193,70,142,145,41,143,171,85,165,134,95,38,213,173,82,36,161,201,132,217,51,249,109,52,91,130,183,36,245,138,207,5,119,121,94,117,44,85,90,25,120,235,221,25,63,252,81,4,13,5,59,51,187,176,0,104,164,116,35,149,244,20,207,137,3,75,28,17,157,147,7,0,0,64,32,83,34,36,222,137,3,203,112,84,62,175,14,0,0,0,132,32,82,217, +67,2,81,6,149,212,142,88,201,4,226,203,104,71,162,187,51,4,81,2,125,82,139,140,178,255,32,5,196,177,188,90,67,136,47,195,193,94,173,238,188,245,99,1,36,203,207,97,83,104,21,195,225,83,71,123,213,130,43,36,208,86,15,224,82,2,7,214,9,155,107,68,131,176,171,103,237,106,205,52,67,196,202,51,45,9,1,201,81,221,28,226,119,211,195,255,83,200,131,1,45,53,121,105,13,11,143,68,8,132,29,230,67,176,182,10,87,218,35,167,88,63,162,65,172,250,119,254,65,106,74,140,247,124,201,222,237,129,130,112,81,16,23,64,83,40,31,213,188,42,141,186,126,6,209,102,17,33,109,48,67,136,14,48,186,118,239,38,31,62,14,211,164,147,20,37,51,4,47,65,84,192,139,16,5,90,16,116,9,234,119,139,83,2,55,226,204,51,210,51,48,51,131,91,99,24,41,6,83,40,202,97,69,11,139,133,103,13,53,242,240,251,143,78,83,72,28,245,157,191,143,191,84,3,214,139,246,78,254,9,67,72,17,227,83,135,181,188,41,237,97,178,23,54,208,148,66,10,163,178,29,187,240,7,112,50,38,6,84,47,18,18,83,136,123,181,247,185,15,15,89,6,29,92,202,65,180,217,65,42,3,44,73,238,151,211,101,225,253,203,182,144,238,7,221,7,135,134,55,177,185,231,226,118,57,194,45,3,12,171,82,200,24,208,18,123,100,91,3,30,182,0,23,104,97,86,82,236,4,192,173,191,145,41,200,2,228,179,88,153,187,90,205,7,167,223,223,150,55,142,254,56,153,102,255,143,169,112,67,2,205,99,133,180,75,212,4,48,122,97,44,155,242,190,82,8,35,171,38,34,113,64,198,241,17,198,162,222,39,13,82,4,121,217,25,95,21,169,112,12,227,66,104,158,1,52,67,2,67,2,117,180,137,71,109,189,247,14,210,172,124,75,67,34,225,7,87,226,66,131,67,158,59,95,239,61,174,231,66,2,91,121,227,247,118,89,46,68,161,132,251,105,211,91,51,72,247,193,21,152,154,146,107,194,182,240,108,155,177,216,223,73,142,233,96,165,113,40,218,124,221,196,3,91,154,173,207,5,223,238,102,117,120,58,59,217,106,23,218,166,34,167,82,36,173,201,68,213,179,148,58,166,227,187,20,225,209,142,66,2,223,119,222,57,118,26,236,66,21,12,127,198,91,238,222,5,85,51,65,53,217,200,128,225,236,229,165,238,35,218,66,36,157,75,174,209,52,143,236,94,76,152,222,178,186,113,82,196,10,11,215,234,81,32,131,81,171,213,92,59,248,250,82,196,252,2,211,238,1,216,143,109,191,24,88,178,130,182,35,4,95,243,91,51,114,215,26,243,10,123,238,87,231,151,82,200,24,18,101,197,115,51,217,192,236,176,93,40,27,204,67,34,111,199,71,90,133,16,35,35,85,250,33,34,138,2,35,4,119,127,223,241,48,23,81,142,8,207,8,23,101,225,82,2,249,35,127,137,77,120,10,160,60,0,251,11,205,53,51,8,130,105,195,25,213,148,95,110,135,225,158,216,171,117,66,2,23,138,55,85,237,49,213,97,29,4,109,130,19,4,83,232,4,236,148,247,213,224,72,23,70,15,18,81,247,255,83,2,27,127,120,85,16,34,13,113,56,200,254,69,86,127,82,2,183,227,126,169,207,128,117,42,89,81,42,162,64,132,35,196,226,2,189,230,1,128,232,191,180,15,137,175,8,196,66,36,73,199,180,224,40,15,127,128,255,161,101,166,77,100,82,196,240,12,185,236,137,93,236,93,254,35,197,95,189,8,207,169,136,73,94,44,41,86,218,44,41,94,13,41,36,63,82,196,244,10,187,226,113,118,178,239,180,241,228,246,43,88,207,5,107,122,206,49,46,182,2,36,199,218,107,239,253,111,82,36,137,65,191,217,19,153,18,196,15,230,220,246,143,62,82,196,238,8,189,232,73,108,222,75,146,57,128,106,234,125,82,36,169,80,135,201,113,135,8,253,141,133,100,253,173,134,35,4,243,250,215,239,110,150,64,241,110,255,207,185,91,243,82,36,137,208,180,151,5,57,70,180,57,96,157,208,184,74,207,5,247,119,223,51,50,55,137,145,95,169,71,38,238,108,82,196,236,2,197,234,49,215,181,228,250,45,197,79,164,186, +66,36,133,67,140,128,22,135,13,200,154,138,42,47,85,242,66,36,217,83,242,178,23,95,1,64,145,102,155,95,162,85,66,36,209,207,144,162,23,95,95,138,85,10,159,9,125,34,222,5,45,7,77,55,207,188,128,80,69,182,164,74,131,89,82,36,169,82,215,199,49,159,20,183,242,59,109,190,88,155,82,36,169,201,254,133,51,34,70,169,152,234,226,162,93,87,82,72,0,114,252,50,53,43,58,109,236,228,243,186,31,21,207,5,107,252,103,181,116,24,28,54,101,72,207,245,188,172,82,36,141,201,70,199,137,238,216,55,206,177,212,234,188,243,66,36,85,11,238,192,22,135,216,206,230,196,214,102,255,82,82,36,173,194,14,149,67,151,78,148,222,65,117,23,161,76,66,2,239,253,107,177,54,87,126,153,154,59,196,214,200,98,82,36,233,202,132,199,65,181,109,132,50,178,126,74,191,191,82,36,137,194,254,149,19,210,248,38,83,194,157,2,2,13,223,201,194,105,131,224,235,56,120,237,220,68,182,214,251,237,67,36,137,201,189,100,35,167,4,223,186,10,193,3,197,20,82,36,165,17,71,135,43,134,147,31,129,164,118,178,160,74,51,36,241,6,56,223,68,20,0,198,18,229,170,177,153,108,82,36,237,26,79,197,201,202,150,19,26,24,167,47,190,82,82,36,133,25,141,135,181,38,211,74,81,213,144,74,136,139,66,2,223,127,210,175,118,88,140,100,253,233,218,99,140,226,51,36,229,133,63,90,66,52,157,122,100,29,103,110,251,255,82,36,233,2,79,215,51,235,249,250,83,175,103,51,87,10,82,36,173,3,135,135,213,10,84,75,160,165,217,239,93,124,207,5,251,125,118,189,118,152,60,217,118,59,144,122,139,115,50,4,9,223,36,21,217,180,64,202,142,11,1,108,181,235,82,36,103,59,202,135,8,84,234,10,115,83,169,230,149,92,66,2,115,109,103,119,116,87,130,236,194,202,238,145,236,249,50,4,19,227,72,41,201,184,128,41,163,170,44,79,92,154,82,168,3,178,51,211,177,195,133,11,43,120,97,44,52,221,50,168,183,41,214,69,120,221,65,83,225,116,148,153,153,202,223,37,103,102,31,222,129,157,42,255,51,240,44,36,52,157,82,36,169,209,132,151,21,161,16,118,163,248,116,102,127,158,51,136,236,105,101,3,181,83,217,252,236,100,9,77,16,5,50,4,69,25,71,61,193,182,128,230,239,46,109,79,170,12,207,105,133,137,155,250,154,70,28,226,216,78,180,31,79,15,222,5,75,27,59,33,205,192,64,157,51,248,115,58,127,62,207,5,227,239,227,113,114,86,67,186,29,176,1,99,113,145,82,36,209,217,68,135,45,156,210,202,182,61,47,208,60,77,222,5,59,39,59,55,199,182,64,144,23,233,27,21,99,51,82,36,237,25,79,135,53,109,172,45,87,109,67,41,123,107,207,5,99,102,87,173,48,85,121,28,190,94,104,255,83,94,35,4,91,243,83,181,48,151,188,157,90,146,179,79,11,40,82,196,250,4,193,218,177,88,120,206,182,81,121,78,136,90,82,36,209,200,77,137,213,144,156,165,92,138,148,34,68,188,50,4,71,41,107,79,183,176,64,41,132,222,84,80,93,215,51,36,165,218,147,93,79,74,150,171,180,10,209,173,32,129,207,5,227,111,94,177,48,182,34,102,120,48,188,81,19,125,35,4,107,123,218,179,48,150,74,154,171,142,233,236,16,255,82,36,233,218,196,151,13,234,24,42,233,221,120,74,22,50,82,36,141,202,132,215,1,180,92,170,86,175,195,175,157,92,66,36,81,11,142,207,24,135,166,176,11,152,87,246,153,127,81,4,231,226,238,246,180,192,0,104,171,220,15,31,17,125,66,36,73,7,238,224,24,143,121,230,25,133,34,200,72,196,82,196,238,2,189,232,113,221,25,172,96,79,71,91,190,175,207,5,247,254,87,177,110,213,154,55,91,191,18,150,107,135,223,37,139,61,58,91,14,16,201,30,128,83,154,78,28,181,207,5,235,249,202,243,42,55,24,88,215,163,197,217,130,240,207,5,251,252,99,243,110,21,89,13,149,137,26,179,96,57,95,137,3,163,86,235,233,82,46,0,0,0,64,111,3,65,206,137,3,235,112,255,160,183,3,0,0,0,64,56,142,129, +81,42,2,76,111,206,48,182,147,246,144,14,122,194,223,202,65,138,14,236,62,235,219,183,164,40,137,185,67,180,111,113,67,2,231,170,182,238,140,134,114,185,253,216,43,57,110,148,205,7,183,26,178,148,216,158,40,85,191,26,85,7,208,20,67,168,20,240,202,163,206,187,110,170,134,243,82,189,8,84,66,236,177,50,206,73,239,38,153,250,208,249,102,160,164,255,67,240,119,204,217,63,230,205,222,59,67,62,63,211,130,226,82,4,31,190,189,153,65,110,156,73,102,102,9,160,28,0,82,168,3,48,34,136,102,171,204,177,232,72,120,119,158,49,83,200,7,99,201,37,77,253,157,133,192,232,79,142,123,57,83,2,61,225,231,50,144,80,196,90,83,232,254,154,202,152,67,40,34,176,147,99,111,166,20,106,84,96,203,239,246,250,83,168,3,227,169,99,207,127,181,130,11,20,205,198,75,65,83,80,220,234,191,58,215,157,249,140,48,74,60,199,131,84,83,8,172,129,165,169,111,67,71,13,182,35,39,5,39,100,83,2,233,168,166,46,128,30,195,102,245,126,151,235,202,25,81,74,142,164,151,54,187,116,39,96,207,141,154,180,54,21,205,203,59,35,83,143,83,219,162,140,153,34,140,113,243,158,82,232,73,48,43,202,102,171,107,182,184,128,12,233,185,144,81,144,111,7,39,9,143,17,13,79,117,23,32,90,196,99,82,168,3,245,108,250,217,236,198,174,14,196,28,249,216,88,65,210,172,130,218,252,88,108,50,56,76,67,212,23,232,193,82,2,43,168,200,209,240,208,133,151,22,252,9,43,115,156,81,74,133,50,149,157,59,119,129,120,221,50,100,21,28,238,67,2,113,133,126,222,76,23,194,188,175,116,203,23,84,181,67,2,99,108,206,234,11,40,137,232,98,164,162,187,211,186,82,12,75,192,60,175,113,221,128,252,165,139,32,23,249,142,207,5,199,172,75,168,45,87,61,175,53,183,138,188,64,99,83,2,235,168,103,42,191,164,203,176,238,8,32,194,1,34,82,36,245,3,149,236,242,164,105,142,102,72,225,229,167,144,66,212,105,224,216,183,228,159,177,128,247,0,146,42,218,248,67,200,158,73,243,192,131,227,183,87,128,210,67,60,95,1,82,232,4,210,154,77,242,187,102,147,74,228,198,135,77,252,82,4,77,81,219,94,83,168,187,0,193,97,13,132,16,4,82,2,55,196,218,129,83,101,11,178,87,0,227,25,212,148,223,233,132,73,147,62,178,59,218,124,237,244,57,130,211,188,82,36,141,217,134,149,109,155,155,166,239,43,117,58,146,235,223,37,235,103,71,222,130,112,44,192,207,175,180,157,28,43,222,73,135,73,126,84,145,92,162,32,241,116,53,5,179,40,35,4,107,118,235,105,114,86,80,244,167,74,189,231,45,174,66,36,87,4,33,191,169,24,42,27,212,125,216,254,91,125,35,4,121,245,103,241,48,22,149,96,225,232,243,204,120,134,66,8,191,105,66,201,172,16,201,102,168,72,45,173,32,135,19,40,139,169,22,0,190,29,234,199,47,216,69,10,48,129,222,201,9,181,183,227,143,96,24,222,189,53,20,40,188,22,82,196,220,6,183,236,137,125,171,124,90,104,33,176,40,33,82,36,225,24,199,215,233,136,28,210,85,48,34,197,30,149,82,36,229,89,197,151,21,186,138,210,85,97,72,82,136,172,82,36,161,94,13,217,51,186,120,186,114,148,105,186,229,140,82,196,228,6,191,242,137,1,52,162,33,172,123,230,199,176,82,36,133,87,135,137,173,38,105,249,84,219,21,78,133,93,207,5,235,124,71,175,110,150,226,84,228,136,102,239,182,44,223,37,25,59,195,91,79,101,185,24,211,87,205,63,209,253,206,109,55,213,94,203,24,76,22,103,249,61,131,145,152,102,207,5,243,251,202,107,110,85,99,104,188,108,64,89,52,93,50,4,29,7,93,79,185,174,128,180,35,202,63,17,75,111,82,36,165,65,135,217,179,54,231,37,155,149,92,242,131,130,66,136,2,139,86,112,193,220,247,63,90,136,234,131,160,96,66,136,14,177,142,48,44,126,238,79,236,158,230,9,237,20,51,196,226,2,195,226,129,189,45,251,243,243,128,233,107,49,82,196,236,2,199,234,49,219,180,5,247,169,146,128,57,65, +207,41,252,9,154,108,42,64,216,100,216,94,181,133,135,55,82,36,233,26,15,199,43,23,9,8,247,53,144,62,119,104,82,36,133,208,116,215,225,222,25,253,162,229,228,236,158,104,207,201,135,41,3,40,105,88,77,250,220,94,102,239,34,56,82,36,177,75,23,199,17,181,134,9,85,138,137,48,214,140,66,36,209,138,176,240,167,158,241,253,121,182,253,144,150,85,35,4,107,246,219,239,112,23,155,170,147,188,42,122,115,232,66,36,17,75,178,176,151,158,39,183,23,113,253,101,212,153,82,36,237,74,213,199,141,85,115,101,91,73,144,74,4,209,66,36,141,199,240,161,182,158,168,230,101,238,109,221,21,151,66,36,149,139,238,145,38,95,0,95,17,178,11,154,98,125,82,36,237,195,70,215,99,217,7,239,68,67,96,218,137,46,66,200,187,73,219,60,221,30,74,250,216,78,106,90,120,61,82,136,101,242,232,228,179,35,153,233,251,120,78,40,159,121,82,36,137,25,69,151,243,20,221,47,67,170,185,102,87,178,82,200,34,50,27,63,236,32,253,68,221,120,178,110,205,184,82,36,137,17,191,135,83,149,109,66,85,211,115,61,246,130,66,36,145,207,242,161,23,135,150,0,93,175,157,167,102,166,82,36,229,195,68,135,21,34,226,8,212,243,36,96,235,5,82,36,137,19,23,215,1,40,205,6,81,51,109,42,191,251,82,36,133,18,143,201,51,243,223,149,46,77,112,216,10,104,222,41,8,11,156,128,19,175,231,223,241,2,8,10,238,142,66,36,81,22,232,224,36,86,81,55,143,25,149,18,40,25,66,36,69,207,230,161,37,71,187,179,9,122,96,164,218,109,82,34,141,13,104,152,90,145,219,101,132,206,23,132,151,120,82,36,165,219,6,133,227,42,200,73,247,129,252,25,153,120,51,36,225,6,63,94,132,4,229,120,181,4,130,201,191,198,67,2,213,76,13,199,139,10,195,130,44,4,196,72,80,64,223,37,1,88,217,233,139,106,218,51,182,155,90,114,102,222,50,4,31,7,59,63,203,178,128,174,33,176,163,68,129,8,35,4,247,244,110,249,114,23,51,220,191,183,174,155,182,97,35,4,251,126,111,181,112,23,107,155,250,164,210,136,160,180,82,36,229,216,204,215,81,187,116,239,53,175,164,237,101,86,207,5,103,242,223,51,114,183,34,223,190,86,91,71,33,33,66,36,145,199,234,209,22,143,228,164,106,157,159,153,151,151,223,37,241,38,71,220,66,79,24,188,161,176,68,81,188,216,82,36,201,9,199,215,73,43,196,73,165,59,128,192,49,130,66,36,105,11,146,177,38,31,33,43,17,9,242,11,250,133,82,196,8,9,207,216,113,189,125,34,149,223,104,12,24,91,66,36,21,199,236,177,38,71,90,162,121,218,161,106,33,105,50,8,29,213,231,197,67,216,27,62,182,117,244,217,55,176,222,233,156,169,16,42,185,32,164,226,241,116,196,187,34,155,207,5,231,243,219,113,46,54,237,19,60,98,163,246,209,198,82,36,205,137,133,153,181,148,175,47,99,253,84,202,144,63,66,36,153,199,242,241,40,159,170,23,88,159,6,144,172,128,222,5,37,35,77,55,195,174,128,23,166,249,224,28,73,39,35,4,99,235,211,169,110,85,109,84,48,211,115,11,61,141,82,36,173,67,205,215,209,46,196,66,119,148,216,24,164,131,82,36,173,25,191,135,115,191,8,254,123,229,173,112,12,81,207,5,231,119,90,177,112,150,82,210,193,154,255,239,253,167,82,36,169,2,15,217,233,176,120,91,95,185,126,214,148,20,50,40,228,201,174,245,157,5,106,226,49,113,100,183,239,148,82,36,237,25,63,151,243,38,129,41,154,218,85,61,182,142,35,4,103,127,111,43,50,53,122,187,191,214,105,237,40,9,66,36,133,203,178,146,153,7,18,125,170,117,160,85,118,25,66,36,1,138,146,161,169,71,58,202,130,222,129,110,145,221,50,4,17,245,58,47,195,170,64,23,87,245,63,104,203,92,66,136,153,73,95,242,221,86,89,226,155,70,106,248,246,96,81,136,3,114,30,254,110,29,140,123,250,217,142,195,9,194,95,137,3,107,108,193,47,158,11,0,0,0,64,145,218,117,95,137,3,235,124,193,43,168,11,0,0,0,64,140,125,131, +66,44,254,82,111,62,229,5,95,176,242,42,133,14,95,213,83,8,131,225,209,211,213,109,107,15,224,6,109,179,92,194,222,209,99,171,134,206,116,117,211,169,173,17,18,249,217,245,65,202,1,172,217,211,62,235,162,179,95,202,224,44,158,114,67,8,63,80,34,83,103,134,46,158,14,188,2,63,178,65,67,104,13,240,240,35,111,39,79,158,79,148,1,73,104,136,33,6,135,124,117,6,250,223,107,30,0,238,215,189,83,102,82,168,48,176,141,137,40,92,2,150,216,68,241,195,133,236,81,44,124,44,79,82,245,219,183,40,60,160,191,89,7,59,205,199,164,86,167,146,117,41,215,66,38,254,77,227,7,255,67,2,205,5,149,86,141,2,183,41,149,79,246,180,165,180,82,2,39,134,137,85,115,176,99,13,151,180,14,236,1,163,82,2,107,138,88,190,88,201,151,240,66,122,8,64,17,8,67,2,85,229,101,102,76,154,118,118,141,67,204,70,34,5,81,74,6,12,103,109,239,197,19,168,71,216,44,46,71,168,82,240,56,204,61,135,181,238,48,70,122,161,13,116,0,6,51,76,8,160,156,161,151,77,219,197,34,64,74,226,102,219,205,235,111,245,221,211,48,241,2,221,10,17,36,146,198,206,67,4,49,144,178,104,202,48,124,20,82,254,219,111,162,207,66,12,144,228,225,7,99,166,241,100,242,125,160,112,8,160,65,42,75,99,103,139,47,51,25,34,75,182,224,93,157,134,83,40,252,129,75,43,111,139,173,17,124,161,100,35,248,69,82,2,23,174,149,182,88,152,16,96,65,174,67,163,254,132,65,202,95,172,152,199,211,214,116,65,188,64,46,228,183,91,81,138,32,172,86,58,49,206,151,68,1,230,246,16,41,128,67,2,85,36,109,218,140,10,22,192,127,35,171,61,46,173,82,4,85,130,155,95,83,103,75,205,28,228,98,116,25,219,66,172,3,108,119,23,51,149,162,34,253,82,250,167,249,9,65,170,48,44,57,243,227,223,238,131,175,18,228,165,247,173,50,236,98,204,61,120,229,180,150,89,26,194,171,7,152,183,67,176,105,108,173,41,238,238,159,123,7,73,49,134,109,6,83,104,166,97,71,107,107,109,47,19,15,209,8,47,236,175,83,2,183,208,164,54,97,181,142,68,237,16,242,142,48,73,83,194,42,39,39,179,68,227,172,9,220,202,187,33,37,48,67,168,164,137,29,95,170,142,201,206,129,252,84,227,7,133,82,4,45,73,25,94,51,149,112,196,100,112,5,4,35,144,82,2,187,230,219,129,81,33,1,96,132,166,115,65,197,123,34,140,103,163,242,162,255,41,251,165,15,252,41,123,100,145,51,4,167,129,91,62,138,128,40,189,160,66,1,154,74,67,34,140,3,227,147,114,70,253,153,161,15,32,231,176,222,255,222,5,5,251,68,71,201,172,128,39,90,184,43,118,130,73,223,5,189,228,172,178,138,63,44,236,12,145,195,100,190,173,35,4,111,253,79,173,50,54,93,1,126,83,137,110,33,24,82,40,31,204,238,31,118,128,235,119,59,50,109,100,169,4,82,196,224,8,187,238,113,219,67,190,171,209,32,158,103,206,66,36,65,66,242,208,23,151,162,240,80,157,8,236,173,230,207,5,127,120,86,177,108,55,12,182,190,163,126,181,86,199,66,36,73,7,246,241,40,95,146,167,153,2,168,90,142,150,82,36,197,73,135,201,139,133,181,254,230,128,152,84,0,203,35,136,133,9,27,46,106,126,53,40,232,88,110,226,43,179,223,37,17,26,195,221,14,102,103,217,174,147,102,212,215,196,82,36,237,130,133,217,147,221,88,8,211,144,224,10,8,139,82,196,236,20,189,226,169,32,220,197,64,132,151,34,97,254,82,196,238,12,187,228,177,142,17,101,171,240,85,234,124,124,66,36,13,195,246,193,167,134,47,162,153,106,214,132,230,238,223,37,157,122,211,93,78,127,211,188,101,109,63,147,85,201,82,8,35,178,236,133,239,27,151,80,93,4,118,205,235,63,82,2,61,131,127,101,79,80,213,156,75,45,37,139,229,1,66,2,27,15,190,151,237,82,215,115,107,217,5,232,213,29,67,232,4,53,220,61,207,34,150,19,146,102,185,5,74,101,66,40,11,213,251,114,131,227,63,239,142,18,248,169,156,0, +82,2,249,97,111,109,71,165,205,106,27,83,124,38,144,151,82,36,237,2,77,151,21,136,168,46,199,253,165,211,156,181,51,36,239,197,63,92,130,157,101,10,32,37,4,18,32,16,66,2,79,102,79,171,114,55,204,209,160,169,192,143,166,42,35,4,215,115,211,173,50,86,25,214,130,91,51,101,222,198,82,36,205,17,71,135,37,2,128,155,189,57,137,177,151,151,66,36,221,207,210,146,151,71,254,170,87,122,146,169,33,240,82,196,248,8,197,238,49,203,221,199,80,181,129,228,232,229,82,36,241,2,207,215,107,151,152,188,87,205,175,42,34,221,66,232,253,9,190,36,41,94,91,52,46,78,136,250,91,87,82,36,173,25,133,215,81,3,80,180,187,170,156,94,169,76,35,4,111,124,87,173,112,54,227,206,229,0,234,7,169,248,35,4,243,250,94,175,48,86,117,100,196,165,109,167,122,98,35,4,87,247,211,43,114,182,120,82,136,82,0,66,65,109,222,5,41,249,80,67,195,180,128,229,186,163,220,25,182,31,66,2,95,114,211,45,50,23,37,0,163,44,173,55,106,91,66,2,95,247,86,173,114,86,160,26,32,190,194,243,61,145,82,36,237,2,199,135,243,246,79,107,99,145,208,63,128,249,82,36,145,67,207,215,3,116,142,166,226,235,220,94,43,205,50,40,252,137,26,213,148,0,226,104,37,241,244,38,170,135,82,36,237,11,77,135,21,218,71,72,149,65,153,0,42,20,222,169,131,137,152,112,124,89,105,154,243,116,197,107,29,169,82,168,36,146,236,3,115,43,88,109,236,184,231,53,76,51,207,5,243,237,87,119,118,214,64,84,67,74,18,242,25,255,66,232,142,73,159,58,219,62,198,73,41,72,247,125,125,178,82,36,225,145,190,135,53,53,34,154,189,195,85,74,168,138,82,34,31,140,130,56,163,4,34,237,215,236,119,13,188,89,222,5,19,5,51,49,203,178,128,242,206,209,156,130,157,187,66,36,9,71,240,225,23,79,175,226,160,222,40,157,36,41,82,36,237,194,60,151,115,9,21,170,226,169,253,46,117,252,207,5,239,251,219,113,112,150,12,9,143,197,141,172,126,109,66,36,89,11,146,162,39,79,21,121,151,170,208,159,166,117,82,36,201,17,135,201,51,203,168,149,130,185,175,233,87,120,35,136,130,73,142,242,93,86,25,50,93,94,228,127,113,71,82,36,237,2,215,199,11,160,188,166,164,168,14,80,109,215,82,36,141,153,188,215,49,151,8,213,182,126,112,222,16,74,66,36,209,142,142,160,39,135,170,113,222,102,222,84,125,39,50,8,130,169,108,221,110,246,36,238,245,203,32,74,109,29,82,2,255,33,127,109,79,216,101,145,109,132,136,0,17,33,223,3,23,231,17,149,195,90,113,206,221,239,199,18,16,0,81,2,215,229,127,149,71,91,129,70,231,218,11,51,6,54,67,104,6,12,63,174,218,221,224,231,31,254,145,253,93,223,35,200,152,225,201,119,115,61,122,179,246,12,176,68,17,64,35,4,235,250,91,179,46,182,156,199,100,190,254,211,95,229,175,233,214,201,30,252,110,45,242,231,55,88,69,216,240,40,173,7,213,234,254,234,170,196,16,37,70,67,77,165,206,109,66,8,129,9,138,100,168,80,25,58,93,94,136,169,91,215,81,104,38,146,232,147,242,229,24,92,194,91,1,234,249,10,82,36,229,8,135,137,107,142,128,27,109,165,249,40,28,39,65,44,35,82,141,46,239,94,137,52,105,94,62,50,6,23,50,4,53,27,91,65,187,172,64,103,5,196,231,205,16,117,35,4,223,119,227,111,52,22,83,16,102,187,87,114,2,40,50,200,195,201,152,77,124,125,225,211,255,244,20,128,205,97,82,36,201,9,71,151,85,150,150,9,156,61,253,84,212,149,82,36,233,193,14,215,73,109,77,223,83,7,247,58,182,62,50,104,248,201,188,76,116,88,227,224,49,113,212,202,36,84,50,4,39,23,51,51,207,184,64,19,171,56,144,22,127,155,207,5,103,253,227,181,48,214,154,245,78,249,81,151,170,158,81,104,44,146,193,183,90,13,240,33,224,215,2,245,19,165,206,137,3,43,49,239,152,189,63,0,0,0,64,40,133,211,34,136,3,203,96,7,181,177,5,0,0,0,64,112,208,32, +83,8,144,161,54,119,119,71,73,13,66,247,198,185,131,57,82,4,83,203,25,157,137,61,5,149,163,40,32,86,42,136,67,168,75,240,188,123,237,34,93,186,14,154,174,155,117,250,67,4,27,142,242,32,249,73,51,230,89,251,103,247,13,143,83,232,4,213,155,175,197,30,29,3,0,47,216,111,51,183,222,205,46,117,102,63,57,175,33,41,159,28,84,247,74,178,67,72,74,213,254,175,190,226,35,199,64,228,224,255,139,14,83,104,133,33,41,47,203,133,103,13,54,129,202,252,174,174,35,204,120,17,83,213,14,85,197,249,61,23,17,11,22,220,83,168,134,65,73,43,109,71,11,11,2,185,84,217,192,139,83,168,154,97,7,41,139,236,74,13,63,28,210,39,146,17,67,2,227,163,86,240,140,174,64,144,14,66,188,168,30,8,67,2,105,171,214,110,13,56,204,138,116,180,239,176,159,74,82,232,61,16,39,218,168,194,234,62,75,65,160,90,234,191,83,168,184,33,73,11,43,67,199,10,232,7,28,164,157,202,81,80,81,229,244,158,173,167,22,120,181,46,38,131,27,139,51,4,169,227,98,70,138,145,32,81,192,102,137,158,71,138,82,4,57,249,153,78,179,92,146,173,37,168,108,172,42,212,82,4,21,138,153,79,51,27,39,175,84,150,120,84,100,252,83,104,49,213,155,111,5,187,124,3,206,185,17,10,113,159,83,2,183,177,137,50,152,8,66,128,247,112,252,204,183,95,51,4,103,34,118,220,139,77,242,39,50,0,2,50,5,1,67,2,217,67,117,92,140,0,212,140,156,198,138,191,184,127,82,4,121,218,27,157,17,44,85,39,149,17,25,21,34,113,82,4,45,73,209,94,19,0,115,202,180,49,165,62,155,104,82,4,61,251,105,93,83,85,238,64,133,58,33,185,139,58,82,2,245,44,77,146,227,196,7,128,108,11,171,98,241,149,82,4,85,154,161,159,17,49,149,209,20,164,102,128,61,59,82,232,59,80,34,169,32,171,166,34,220,228,170,4,37,214,66,106,166,242,187,231,176,19,10,251,200,254,32,206,50,127,33,42,74,131,90,205,162,223,245,140,156,201,21,244,101,19,67,248,214,202,12,245,56,117,243,146,8,68,98,198,220,22,34,234,169,161,165,167,237,234,18,23,77,192,132,207,161,208,223,5,89,233,205,222,140,235,82,91,159,217,108,128,73,128,83,2,243,201,106,47,222,230,12,124,80,210,59,223,238,46,65,202,7,236,188,79,82,171,177,34,97,182,227,81,0,187,67,196,222,215,125,105,203,171,18,176,165,10,0,108,89,77,67,168,3,181,106,253,58,164,164,213,66,55,63,115,175,58,67,2,217,104,173,88,144,128,198,216,49,78,104,211,187,148,83,2,111,184,164,46,123,220,29,195,108,156,216,6,0,166,66,200,152,225,39,205,233,223,71,78,180,28,83,188,150,165,67,4,219,248,22,233,238,13,146,38,191,222,111,107,107,46,205,7,69,151,202,141,181,211,220,170,143,232,164,171,1,56,67,2,87,34,110,176,10,9,80,1,144,242,239,255,46,230,82,36,111,123,24,91,52,254,110,57,11,164,117,106,93,174,67,72,26,213,252,175,191,184,98,142,3,135,66,1,202,189,51,36,219,7,95,80,134,70,248,255,117,108,3,110,18,147,35,4,251,249,214,177,112,86,117,38,137,30,91,123,162,21,50,4,5,11,83,55,187,174,64,216,250,55,217,190,234,152,35,4,123,233,87,183,46,184,164,134,216,181,37,236,186,147,82,196,226,252,188,236,17,128,238,167,145,37,166,11,193,162,35,4,247,127,206,173,46,53,91,164,222,8,227,183,25,220,66,36,9,134,240,193,168,71,253,41,30,23,152,177,26,113,81,4,11,251,50,51,193,182,0,16,248,146,189,235,63,40,66,36,201,78,236,145,166,158,151,0,245,40,102,142,170,104,35,4,107,123,219,243,48,86,3,230,92,105,17,147,74,107,67,2,65,62,156,51,150,68,25,51,230,192,44,109,178,228,67,2,183,218,107,175,147,8,1,29,5,208,38,0,182,19,81,234,4,172,214,104,123,182,149,34,18,130,242,245,178,170,82,8,27,236,40,227,92,148,184,60,9,218,255,117,208,50,82,2,251,161,110,197,71,129,234,43,95,151,240,38,211,188, +67,72,28,117,46,125,41,190,188,222,128,80,128,166,69,148,82,36,233,10,23,201,237,158,27,253,86,254,88,132,53,3,35,4,115,125,99,179,114,23,163,125,134,192,121,108,43,144,82,36,141,2,191,201,145,249,120,152,222,235,116,230,190,159,81,108,59,204,253,121,228,94,38,74,216,1,1,169,21,80,82,36,241,138,23,217,83,181,46,152,111,211,144,42,76,172,82,36,141,66,15,201,11,10,83,237,190,146,103,31,19,79,207,5,235,246,87,175,48,182,132,85,210,79,75,7,217,66,66,36,25,207,152,178,56,151,254,223,155,138,19,169,33,152,82,36,201,73,79,201,113,123,195,167,149,191,106,142,246,106,207,9,129,73,27,124,31,46,20,9,108,64,96,105,70,9,82,36,137,73,77,201,137,233,51,60,126,203,253,189,41,55,66,72,177,73,203,244,157,78,89,124,110,94,203,121,127,189,82,36,241,66,205,151,237,156,139,149,94,170,93,169,189,87,35,4,227,246,214,239,112,23,121,171,153,202,15,128,215,43,82,34,101,109,187,212,106,120,190,117,116,237,69,219,134,203,207,5,219,106,90,235,50,54,173,240,226,74,121,110,64,107,82,36,245,82,135,215,113,42,204,1,246,131,104,232,234,85,67,34,49,152,250,233,11,180,103,187,75,233,254,188,247,10,82,36,145,25,69,151,21,164,202,7,212,147,117,185,175,188,81,4,71,37,89,69,199,188,0,168,117,219,219,173,4,136,81,2,73,35,85,67,203,186,64,206,108,145,78,1,110,22,67,40,100,12,56,148,217,127,193,153,30,27,143,192,10,172,50,4,47,25,69,63,203,186,64,75,193,57,33,178,251,71,82,34,229,109,105,208,104,81,196,249,252,191,188,81,102,40,207,5,223,246,215,49,114,183,234,176,83,105,90,120,131,6,50,4,45,27,79,67,203,182,128,65,78,101,9,150,31,216,66,36,5,194,236,255,166,150,234,109,37,160,39,10,90,249,66,36,201,78,144,161,55,151,121,250,105,77,73,214,217,119,66,36,197,7,170,241,39,87,0,160,246,165,246,21,25,18,207,5,123,249,231,245,112,151,162,99,115,224,105,112,226,88,81,4,5,1,41,41,201,188,0,40,100,223,132,7,152,197,81,4,3,245,42,29,195,190,0,24,232,1,238,252,85,174,82,196,234,248,200,228,97,9,145,69,87,165,222,47,187,91,82,36,197,145,198,149,117,9,211,157,58,211,76,24,58,66,82,36,43,98,200,199,37,248,254,239,98,40,25,34,25,5,81,4,31,5,39,29,203,190,0,168,101,151,157,170,184,239,82,2,117,11,126,110,101,144,9,17,33,4,138,8,172,32,82,2,57,65,191,109,87,104,23,146,203,32,101,194,92,101,51,168,75,53,127,209,189,22,63,51,50,69,40,47,248,154,67,136,40,163,63,237,247,124,169,103,161,26,202,250,78,236,66,144,16,236,252,46,220,165,238,105,238,13,160,130,70,104,67,194,220,135,81,121,129,248,174,62,53,124,63,209,38,156,51,4,103,113,69,183,138,0,33,68,166,96,188,128,17,54,66,72,156,9,203,250,44,30,12,60,175,94,248,115,104,192,51,36,35,121,155,217,14,221,223,165,91,239,210,174,2,1,66,36,13,199,148,241,169,94,155,137,177,255,91,93,169,154,35,4,115,255,87,239,44,52,45,217,51,47,83,252,107,96,66,36,29,142,186,241,41,159,178,95,0,229,121,237,119,15,223,201,141,105,11,79,236,51,91,121,220,228,180,203,100,193,82,36,169,17,181,137,37,24,202,151,247,247,237,111,159,20,82,36,233,73,143,217,203,230,207,54,95,251,147,181,25,226,51,72,134,137,120,52,49,27,253,200,188,68,73,204,71,56,66,36,137,199,142,191,23,94,167,27,168,51,86,58,111,154,82,196,240,6,197,214,73,155,170,72,231,77,41,62,165,112,35,4,239,123,219,243,112,182,74,5,168,41,164,125,180,107,65,140,3,172,14,144,75,127,110,16,107,159,251,254,46,84,82,36,141,89,189,217,113,141,139,53,129,232,44,84,85,139,82,36,229,8,191,217,33,218,122,31,254,151,175,255,60,216,34,40,163,9,31,0,191,29,54,239,2,128,159,0,240,112,223,137,3,209,103,23,158,8,4,0,2,112,250,200,195,79, +82,136,14,208,129,68,30,123,226,21,234,0,163,120,105,236,67,16,13,236,190,123,230,94,191,107,77,66,181,42,6,147,82,4,53,194,153,95,149,189,235,81,100,113,99,0,51,6,67,72,0,240,145,118,78,43,62,57,84,16,78,186,137,178,66,8,131,161,180,213,123,183,254,179,185,6,11,69,104,58,65,170,7,236,188,243,243,91,231,16,183,76,163,201,65,189,67,144,100,204,184,175,181,23,223,55,65,169,193,22,251,15,83,232,141,33,67,5,109,103,105,15,240,79,48,20,210,214,223,5,201,99,116,70,140,111,243,124,75,68,191,38,12,212,82,4,25,195,97,157,85,243,191,166,247,121,15,254,188,2,82,8,154,225,170,231,102,192,241,101,17,101,121,43,14,0,82,4,121,205,57,75,85,164,125,233,122,231,101,104,245,134,67,196,74,245,53,89,162,4,104,121,111,181,254,45,158,211,83,144,144,198,223,62,215,74,250,43,183,19,92,32,206,29,34,10,172,225,6,9,47,65,101,13,123,93,92,159,41,114,206,77,1,16,9,117,47,39,9,139,39,167,29,208,14,70,67,208,44,236,245,57,230,126,215,106,7,46,12,220,194,226,81,48,11,236,3,75,27,77,211,26,28,63,27,95,64,110,82,104,13,181,91,119,177,180,212,53,14,104,150,47,216,129,82,16,95,44,198,183,39,157,114,214,91,81,76,251,101,49,67,4,117,180,212,8,129,155,20,125,203,249,110,146,254,215,65,74,66,44,77,210,250,186,173,3,148,221,29,191,143,220,67,8,46,117,171,189,104,186,213,149,4,41,127,235,47,12,83,136,155,33,37,39,111,3,7,11,175,100,231,228,6,116,66,2,87,76,74,228,25,88,87,192,251,39,181,255,150,83,83,136,136,97,33,39,205,75,45,13,32,72,170,250,23,117,67,232,41,131,199,92,118,252,127,253,32,117,25,9,92,142,83,16,214,202,250,219,212,123,253,137,107,104,240,135,90,80,49,234,99,195,58,102,231,178,54,59,88,110,74,5,98,198,33,42,75,35,37,154,217,249,198,255,133,214,133,34,176,81,83,136,229,65,103,235,138,101,71,15,206,15,231,166,106,65,223,81,3,204,197,198,95,164,146,222,26,113,240,20,4,65,83,16,176,234,212,238,95,189,157,142,0,55,67,222,241,53,67,196,206,84,37,153,72,174,20,182,117,28,237,105,241,186,66,240,54,236,57,253,88,99,191,181,172,11,48,37,132,211,82,204,32,192,56,127,243,138,202,71,51,170,3,192,125,121,82,2,159,182,8,255,126,128,45,239,173,62,87,91,232,202,83,2,171,169,201,54,190,200,144,227,124,9,244,189,210,204,83,2,43,169,166,54,189,206,160,102,208,80,228,1,219,153,83,2,45,186,234,66,188,117,92,131,135,58,121,134,253,237,83,2,175,184,197,54,130,75,232,36,145,60,151,184,91,246,67,2,85,69,109,214,78,3,197,14,17,32,132,104,17,74,83,2,165,152,164,50,64,20,205,219,206,171,181,122,126,181,82,136,3,16,163,171,236,211,16,71,57,1,161,8,190,205,82,72,5,144,46,218,42,196,15,195,73,153,119,21,223,192,82,144,32,3,43,45,209,46,19,183,153,6,139,198,74,236,81,176,47,109,119,155,14,145,79,86,150,30,146,229,206,112,82,4,115,229,122,141,81,248,120,234,230,79,85,25,0,84,82,4,127,116,59,78,51,183,237,81,65,51,101,202,25,203,67,136,31,208,170,231,111,54,77,59,143,47,168,165,89,19,83,200,152,97,67,71,173,226,198,10,175,59,67,177,243,74,35,4,255,224,98,251,112,85,139,55,22,173,247,206,218,183,35,40,130,105,148,25,106,24,77,36,111,86,177,154,183,248,83,72,75,245,191,43,14,31,121,2,32,151,53,91,123,96,66,72,154,233,211,93,239,8,154,100,168,80,25,197,7,43,66,36,195,241,138,177,24,95,93,242,94,249,238,108,196,254,82,36,169,18,207,151,53,19,4,166,226,178,219,35,117,236,223,37,149,90,155,221,141,169,48,118,118,132,178,172,143,42,223,37,27,94,235,93,142,65,238,151,20,116,4,130,31,150,207,5,107,247,91,241,48,54,161,58,127,25,13,75,188,29,82,196,244,10,193,232,241,218,18,122,171,43,35,47,181,158, +81,136,2,49,143,240,43,255,207,112,108,30,96,199,46,233,82,36,241,66,205,199,81,151,156,215,185,104,253,178,162,143,66,36,25,74,150,177,152,71,248,237,149,249,159,146,176,43,66,196,252,18,193,232,1,128,7,253,162,84,144,166,164,27,82,40,4,82,237,167,109,80,155,117,220,240,146,244,138,70,66,36,29,131,250,160,24,71,178,170,135,58,105,152,86,199,35,4,125,250,246,125,44,56,20,134,226,72,93,70,245,71,82,196,250,18,183,234,177,138,113,231,240,150,197,234,235,105,66,8,129,73,74,236,93,150,201,54,42,94,91,171,53,168,222,5,49,15,79,75,201,182,128,33,222,178,164,68,1,68,82,36,141,138,141,217,49,30,219,167,110,235,220,241,87,205,222,9,131,9,189,120,125,61,251,178,53,115,133,68,166,171,66,36,205,138,144,191,39,135,136,154,223,150,169,165,10,106,50,4,45,11,67,65,199,178,64,124,126,201,148,201,214,4,82,36,201,74,133,137,53,145,94,32,90,191,126,241,249,120,82,34,23,204,193,60,153,228,167,64,255,34,213,223,183,250,82,36,169,9,71,201,97,171,120,246,115,234,173,127,219,135,66,2,235,247,218,177,48,86,23,151,209,57,104,79,225,125,81,40,2,209,143,112,140,158,16,113,172,30,32,15,167,96,82,196,254,12,195,220,49,170,19,73,129,230,132,124,127,234,222,5,63,37,87,67,199,184,128,204,11,65,65,0,152,19,35,4,103,243,91,47,112,86,195,107,105,204,41,14,33,169,222,5,77,27,79,73,197,180,0,192,129,1,84,10,92,79,66,36,225,146,242,225,166,150,132,162,6,26,85,149,253,133,50,4,71,39,103,71,183,190,0,224,162,208,159,50,21,17,82,196,244,10,191,226,81,72,186,239,206,247,213,60,181,219,66,36,153,11,146,158,55,31,119,45,223,24,159,114,223,245,223,37,233,133,47,86,67,166,224,68,246,79,58,46,72,39,66,36,205,78,146,176,153,71,152,139,128,218,171,240,1,225,35,4,231,250,75,235,108,21,185,243,198,188,40,58,228,92,82,196,224,250,192,224,105,158,173,170,101,129,124,13,162,234,51,36,11,60,1,99,140,127,154,67,107,179,46,115,24,152,50,4,71,19,115,79,195,174,64,69,98,134,127,4,53,2,66,40,203,73,28,46,43,94,93,44,46,86,235,81,121,246,207,233,162,73,88,50,43,72,219,122,88,78,206,82,74,65,50,4,27,253,50,33,207,184,128,106,222,180,172,34,185,146,222,41,130,201,190,88,153,33,226,224,245,242,4,83,197,78,82,36,161,194,70,215,99,54,129,79,1,159,16,121,70,236,82,196,234,252,198,228,73,108,248,146,130,42,53,117,73,67,82,36,141,90,79,199,51,79,23,242,83,166,175,128,233,21,207,5,243,245,219,53,48,86,141,99,140,51,63,216,221,103,206,73,154,33,4,205,18,180,12,61,250,221,79,51,35,205,82,36,141,1,255,151,53,248,181,160,230,174,82,110,182,46,81,2,53,15,89,79,187,170,0,98,196,230,22,111,205,254,207,5,103,123,91,45,112,85,105,219,186,47,107,114,113,9,66,2,107,126,214,237,110,53,76,96,162,22,61,191,125,159,82,196,250,18,185,226,145,110,238,235,214,139,214,162,101,7,82,36,177,194,77,201,17,138,25,196,231,136,86,41,158,150,82,36,237,90,71,135,237,20,13,190,211,138,84,106,34,75,82,40,2,18,101,53,115,51,251,237,235,192,131,105,77,94,82,36,141,217,141,217,145,109,79,152,147,2,177,118,236,141,66,36,141,203,248,192,184,94,127,119,93,183,94,32,170,136,223,37,151,184,195,221,79,64,98,217,125,204,228,107,250,191,2,38,155,217,192,236,155,137,255,145,76,12,26,90,86,158,50,4,29,15,99,73,195,174,128,140,124,52,153,185,139,20,223,37,31,26,11,95,141,180,77,201,9,145,117,98,170,220,207,5,83,115,187,161,44,83,27,43,207,225,5,58,165,121,82,196,232,16,181,232,17,36,226,69,37,228,58,210,150,132,82,36,141,195,157,11,4,154,235,192,182,147,245,62,169,186,19,232,99,243,214,91,1,0,127,93,16,134,135,192,3,136,175,241,16,17,0,0,224,94,181,248,79,155,160,208,226,152, +82,2,117,230,14,174,217,240,190,158,238,0,125,73,111,74,82,4,27,98,153,79,149,57,3,175,21,16,209,91,136,105,82,4,113,65,219,159,241,128,54,78,175,60,32,137,99,118,82,4,49,137,217,79,19,148,75,144,69,103,103,234,111,47,83,200,165,225,32,231,170,168,16,11,50,37,153,9,137,103,51,168,136,65,22,154,42,43,237,64,213,80,228,247,39,124,83,2,239,192,73,47,0,236,131,113,157,24,67,137,8,70,66,40,131,129,150,148,252,238,195,87,234,14,1,23,95,13,67,2,89,168,213,96,14,32,99,213,8,223,14,151,250,103,83,200,19,76,233,249,183,191,91,110,189,252,83,68,5,96,67,168,4,112,131,150,239,56,114,181,84,45,105,146,67,109,83,194,42,2,2,170,12,32,68,40,230,154,136,177,21,246,82,144,16,35,7,9,237,240,250,48,153,218,19,71,46,49,67,2,233,202,180,206,78,239,6,22,126,203,233,79,57,246,65,234,23,44,205,115,87,174,36,37,69,230,130,181,249,4,67,136,14,181,236,173,203,164,231,221,131,253,104,214,129,55,67,168,8,240,218,127,231,26,23,59,6,255,28,144,42,147,83,8,131,1,7,75,141,105,109,17,100,4,72,157,176,233,83,72,173,129,71,41,205,4,199,10,55,244,162,147,248,93,83,2,237,177,234,54,240,212,170,165,26,207,206,88,70,142,67,2,225,99,118,108,13,102,15,56,195,200,51,134,198,163,83,104,5,35,179,225,237,90,109,135,253,199,180,5,243,9,82,232,29,195,54,156,149,245,244,94,9,122,198,71,76,105,67,194,144,157,175,19,1,193,200,31,166,4,130,83,72,240,67,4,111,142,176,168,230,146,44,9,82,94,119,108,233,150,205,7,191,62,126,148,36,100,23,153,63,10,65,134,212,117,82,240,60,204,189,88,235,164,59,74,89,49,118,115,65,8,67,200,24,112,177,163,103,159,30,114,20,224,254,223,220,14,83,168,135,65,41,75,207,228,198,10,152,17,89,1,19,98,206,77,26,245,220,223,197,170,85,39,149,94,25,144,249,144,65,42,35,44,73,86,218,155,245,97,135,53,225,205,19,86,65,106,5,172,111,86,246,186,47,65,110,41,118,80,46,23,82,168,3,176,166,203,104,147,74,174,10,225,127,235,61,28,83,168,170,1,7,73,15,37,7,11,176,47,98,70,191,125,67,40,85,144,10,215,79,139,124,125,6,50,133,176,141,205,82,2,31,176,72,26,105,229,169,65,24,67,186,251,178,254,83,136,231,33,5,7,173,226,38,13,129,222,145,111,248,146,66,2,197,47,205,103,240,86,119,203,251,63,185,181,160,217,82,172,96,128,252,190,50,151,223,168,187,253,45,194,245,8,67,136,2,245,126,173,105,166,240,229,3,173,250,45,223,40,83,232,200,225,238,48,45,39,73,13,2,54,155,59,127,121,82,168,31,181,235,222,249,200,14,113,26,248,216,127,255,34,81,80,67,135,107,109,17,3,199,172,236,24,32,195,83,196,67,2,207,225,76,214,140,206,16,142,64,25,160,54,196,107,65,106,14,213,146,85,129,139,21,232,239,100,251,129,37,0,83,8,16,227,171,178,53,253,175,131,11,113,220,119,253,88,65,10,23,112,56,222,109,166,115,24,66,139,87,75,10,169,81,88,157,110,238,93,126,207,190,222,237,174,10,178,84,86,83,136,47,181,182,126,228,159,111,7,200,119,176,234,88,110,65,234,29,108,79,114,186,175,57,241,207,100,151,109,148,11,81,80,47,236,125,219,217,202,190,124,101,221,26,63,187,203,82,4,23,109,113,235,245,94,234,213,23,208,82,45,149,109,65,202,66,99,103,73,175,12,19,134,142,119,53,29,144,245,82,172,36,192,58,119,82,160,121,250,97,146,86,18,16,189,82,2,219,132,134,125,97,200,229,100,95,23,142,45,17,64,51,4,177,34,124,178,137,84,19,94,176,36,26,185,231,88,82,36,119,171,146,91,180,42,20,191,53,72,215,218,104,207,223,5,209,37,173,202,138,209,251,19,174,68,193,32,5,129,82,4,57,234,99,76,19,136,165,234,164,164,78,233,240,253,82,200,24,18,108,195,47,56,217,229,26,68,16,50,169,190,82,36,169,80,135,201,43,222,21,111,230,189,185,209,108,219, +66,72,154,193,35,199,225,116,19,89,40,94,56,34,41,159,82,36,201,75,143,201,49,105,164,166,82,57,238,236,76,199,82,196,254,14,195,226,241,152,87,239,247,209,245,71,111,18,35,4,87,107,78,167,50,182,82,66,166,19,14,73,41,47,82,36,173,82,135,201,115,253,4,160,18,234,244,58,215,105,82,36,241,91,71,199,113,21,13,190,111,186,101,95,61,68,175,169,170,73,170,63,156,245,30,190,179,93,79,170,37,147,82,36,237,91,199,135,85,132,187,34,183,189,217,250,150,198,223,37,111,197,55,92,0,155,32,253,86,188,19,173,12,91,66,40,66,227,81,60,119,118,29,28,75,140,85,255,121,10,82,2,249,5,175,97,87,192,52,114,115,64,0,0,0,33,175,81,9,12,151,85,186,11,177,157,159,89,30,176,176,68,50,4,215,229,145,157,79,97,1,175,146,166,243,141,61,5,82,72,8,227,122,83,231,213,225,236,1,230,195,95,252,106,82,2,241,73,254,105,101,0,121,40,66,70,142,136,136,16,82,36,209,131,13,137,245,218,155,173,97,168,11,36,174,173,66,2,91,252,79,241,48,86,110,76,161,140,219,2,245,65,82,36,209,146,135,137,117,167,146,72,247,145,232,59,138,77,207,5,103,115,87,237,110,22,145,49,75,169,181,217,223,77,82,36,145,9,119,137,197,24,4,217,24,81,54,77,117,114,207,5,99,115,79,105,110,213,114,239,185,90,60,50,90,96,82,36,205,90,13,201,9,136,140,53,119,218,89,217,37,47,82,36,141,26,7,215,105,108,252,227,102,186,157,121,23,218,207,5,227,255,71,175,110,150,68,157,90,70,72,239,66,175,66,36,89,11,252,179,41,159,74,148,68,184,142,58,153,149,207,5,231,118,78,233,110,21,91,6,88,218,252,236,183,206,173,7,57,23,113,83,183,166,200,121,1,78,216,87,169,40,66,36,25,206,156,178,57,143,86,170,213,16,249,185,49,17,82,36,173,154,21,217,115,85,120,64,47,223,217,233,21,83,82,36,169,73,69,201,129,149,84,180,58,161,148,76,217,149,82,196,234,12,179,224,113,248,62,224,244,150,213,116,47,77,82,36,141,130,133,217,17,18,179,175,164,164,39,32,163,132,82,36,169,137,77,217,75,151,202,221,127,208,211,35,190,3,35,4,95,251,83,47,116,214,64,34,153,178,67,96,239,94,51,36,151,28,251,223,142,65,100,25,49,209,188,25,212,249,51,36,235,163,55,94,15,150,3,187,160,228,102,114,254,255,66,36,145,215,178,161,23,143,103,174,214,4,239,6,79,170,82,168,34,43,183,170,157,164,126,253,9,134,103,56,203,63,207,5,117,100,239,249,114,87,61,30,175,142,5,173,31,110,66,104,139,225,38,157,234,126,241,232,10,68,145,13,3,1,67,2,213,45,13,217,140,204,137,82,50,206,24,77,34,29,67,2,93,134,133,90,15,21,225,122,83,202,56,25,51,198,205,139,94,213,251,89,120,197,196,38,28,183,238,30,108,158,67,4,143,208,176,24,111,235,182,60,209,150,42,138,90,171,66,2,195,165,202,30,101,91,187,187,187,187,83,187,3,20,82,4,55,115,171,91,51,102,248,73,238,65,245,14,17,202,223,37,155,89,187,221,141,238,87,210,139,5,74,13,72,52,82,36,173,75,69,71,69,42,16,165,165,248,100,196,21,149,81,72,154,161,103,246,211,53,97,98,49,113,16,221,145,229,82,34,85,47,238,17,105,17,226,61,230,172,57,17,220,102,205,39,135,132,211,66,29,79,115,182,63,69,255,145,253,188,66,2,115,245,79,171,48,22,238,251,17,245,14,62,73,26,66,8,220,73,91,246,221,78,216,126,105,94,20,173,47,245,50,136,168,201,174,222,148,29,121,176,35,117,133,54,120,129,51,36,103,38,40,87,130,16,89,94,42,85,137,125,75,145,51,36,165,26,212,221,141,68,244,204,139,221,184,36,153,245,67,34,95,134,71,80,66,129,52,10,201,159,126,219,51,150,81,2,23,229,98,81,183,160,64,190,181,191,248,19,42,229,223,37,25,26,156,89,142,4,181,214,74,91,185,91,185,237,34,40,35,245,6,108,237,107,65,21,0,240,135,32,112,48,175,137,3,139,1,150,217,177,59,0,0,0,64,152,154,161, +82,4,93,178,99,79,85,136,112,14,150,178,254,68,109,3,67,4,73,108,208,200,90,144,205,20,163,29,32,77,27,158,222,81,47,204,251,119,189,215,165,252,125,27,1,233,73,19,223,5,203,226,100,80,141,82,44,202,0,253,139,104,75,162,81,10,35,204,218,11,51,165,26,176,209,124,167,190,230,138,67,232,29,80,154,115,107,22,23,110,78,20,50,105,21,38,82,8,31,99,38,179,209,84,199,191,9,6,64,68,218,62,83,232,228,97,73,43,45,67,71,11,215,29,184,177,76,38,81,176,79,201,254,42,61,151,95,61,178,32,154,199,19,118,83,136,51,172,187,164,31,222,111,52,4,107,11,177,249,91,65,42,31,140,117,123,214,214,229,65,6,233,210,74,106,217,35,72,129,129,19,94,242,198,218,246,61,31,129,213,246,6,67,40,35,195,222,174,180,239,122,239,99,131,195,54,85,62,82,2,103,230,153,125,99,129,232,44,6,189,163,163,107,47,65,10,9,172,95,247,211,182,236,145,16,158,5,229,115,239,67,168,7,240,201,163,109,187,52,170,134,175,63,100,66,168,82,72,1,16,158,168,38,108,226,153,183,4,18,202,107,126,83,40,137,193,4,9,43,231,6,13,162,215,72,155,64,123,66,2,221,43,221,105,246,24,104,38,2,44,83,8,63,109,205,107,59,131,173,217,234,186,223,253,153,190,231,3,46,196,83,168,20,108,181,53,189,35,93,28,146,68,146,140,241,30,67,2,211,136,180,206,75,147,5,29,4,3,119,235,208,133,66,108,114,236,46,83,85,17,167,119,9,254,10,88,169,10,83,112,133,140,245,251,221,215,204,165,15,72,67,120,132,156,83,168,131,193,105,109,173,167,171,17,160,199,164,45,61,3,66,136,159,97,167,141,238,238,156,190,244,7,81,135,157,178,83,136,51,35,170,38,231,246,204,131,15,102,251,43,153,19,67,4,117,146,22,153,238,22,174,157,26,90,11,160,104,206,82,4,115,181,58,217,69,250,14,224,4,144,153,99,109,180,67,2,223,166,149,90,142,24,81,159,67,219,74,240,109,253,65,202,1,44,207,242,230,220,174,27,2,88,31,246,174,142,81,44,17,108,221,86,237,223,110,105,237,161,177,171,48,128,82,200,118,144,9,87,32,155,134,162,11,121,174,157,69,73,83,2,233,184,4,51,70,115,174,20,135,87,43,255,71,80,67,2,219,8,174,96,14,13,49,23,4,45,117,51,149,137,66,2,85,9,105,76,53,24,201,232,81,10,187,170,159,69,83,72,5,236,152,229,235,117,201,254,219,35,61,20,3,129,83,2,239,177,233,58,124,14,204,225,17,200,106,149,223,155,82,4,63,247,125,139,17,150,223,102,222,145,245,66,189,92,66,234,209,242,57,253,117,25,50,3,164,64,196,74,162,166,81,138,159,210,253,56,51,126,7,23,17,110,167,4,203,64,66,140,3,236,240,56,117,19,0,121,74,32,159,127,119,121,205,7,29,114,117,140,11,0,155,128,22,242,205,127,210,170,223,169,0,195,75,64,137,164,194,241,147,121,124,148,104,16,67,72,0,208,8,151,239,10,21,95,148,162,129,172,119,12,83,232,89,204,235,182,141,190,221,181,216,205,239,6,163,194,33,138,231,193,32,87,70,171,84,58,20,166,170,5,161,57,83,40,252,1,5,39,173,64,169,17,87,229,214,13,240,68,83,72,119,236,247,52,187,60,77,238,92,179,181,63,240,239,82,2,177,34,31,149,89,1,243,14,162,48,4,51,107,221,67,136,3,210,11,151,45,158,22,109,144,107,199,115,72,249,83,2,53,217,135,55,24,83,144,28,36,79,2,159,161,172,67,2,105,200,190,118,12,23,0,151,144,243,117,19,189,222,223,241,70,140,53,247,153,139,210,197,103,81,3,86,204,134,82,8,9,16,202,40,217,132,6,162,249,192,202,38,70,14,65,234,56,99,71,41,143,153,15,102,68,108,245,203,251,51,67,4,38,135,1,24,233,159,228,35,190,216,146,104,66,236,81,24,155,252,150,234,213,238,221,182,207,34,170,24,203,204,82,204,9,224,235,189,16,102,142,98,90,130,37,26,208,222,83,136,94,149,26,27,13,171,30,7,200,15,245,189,87,48,223,5,163,66,91,54,138,10,112,83,64,4,145,148,239,235, +223,5,223,193,77,210,139,253,155,38,251,103,217,29,8,136,223,5,205,193,100,68,138,164,249,83,192,44,129,54,69,81,82,2,189,240,220,98,89,144,25,64,55,100,227,67,85,206,81,2,19,203,80,253,182,182,0,191,160,252,174,106,181,185,82,2,249,164,77,133,209,232,155,241,87,166,115,89,93,198,51,2,37,119,98,169,190,178,144,2,1,37,167,184,70,207,81,2,31,255,82,61,191,178,0,210,243,230,115,129,214,212,82,36,233,65,79,201,19,73,231,26,93,67,241,60,135,60,50,4,33,233,94,51,183,172,128,210,100,188,229,224,117,249,34,104,166,41,129,169,218,5,62,27,124,47,20,106,71,239,67,136,85,227,220,191,49,47,219,61,163,33,164,146,156,50,222,233,4,177,125,25,85,255,157,153,117,31,200,126,235,114,82,2,181,41,63,98,95,8,0,224,17,170,251,37,85,180,82,2,117,39,255,77,95,16,17,2,64,66,132,21,17,157,67,2,185,253,147,171,21,88,204,8,171,44,29,209,36,156,82,36,205,90,13,137,53,130,156,15,196,164,151,102,165,28,82,36,201,90,77,201,33,41,19,246,147,152,166,103,167,148,65,44,9,76,239,176,107,31,15,49,107,31,183,55,0,194,82,36,141,145,133,217,169,214,219,33,4,191,41,116,173,82,65,2,59,13,109,87,183,172,0,0,100,218,174,181,41,157,82,36,201,153,13,153,149,153,235,206,113,247,212,186,133,74,82,34,221,47,255,85,121,69,84,219,104,213,90,251,171,50,82,36,141,209,77,217,17,139,28,89,229,44,105,203,138,74,51,36,35,218,211,93,142,205,251,254,162,228,115,36,97,87,222,5,57,33,107,93,189,172,128,251,228,170,45,10,86,242,51,36,241,39,56,211,131,77,189,83,111,219,0,107,67,24,66,2,211,246,199,103,110,85,95,68,163,2,228,132,70,128,222,5,99,59,119,111,195,174,128,254,53,240,172,42,38,17,82,2,187,133,190,109,95,80,85,141,106,103,251,0,17,32,82,200,9,53,95,125,125,58,103,147,27,169,20,226,37,111,82,36,213,209,15,201,107,151,184,41,247,82,249,13,10,149,66,2,67,243,202,167,114,22,255,119,149,61,34,98,2,68,66,2,107,138,111,215,242,20,180,187,100,123,132,50,8,0,82,2,163,253,233,170,219,152,136,32,98,122,192,105,136,131,207,5,87,254,79,175,50,182,128,36,3,234,88,57,72,56,82,36,137,17,7,151,213,24,71,206,0,166,47,180,22,75,35,4,231,255,207,239,110,213,128,0,92,16,206,102,245,155,35,4,239,251,79,107,110,21,177,74,137,222,113,88,180,38,66,232,247,225,186,167,254,116,18,17,44,64,14,54,84,107,82,4,79,45,59,155,17,32,132,66,33,230,152,244,158,91,66,36,137,215,178,228,23,135,228,205,196,70,5,106,118,168,82,200,19,16,30,170,214,155,141,198,202,152,7,235,243,49,67,2,87,37,133,216,141,124,26,82,170,112,41,115,203,150,83,2,43,169,198,54,167,159,219,109,237,247,41,244,219,74,33,234,59,117,95,210,124,156,228,77,28,66,161,249,133,59,35,4,87,218,87,175,233,149,64,235,65,223,51,183,212,139,67,2,217,76,221,88,17,70,153,99,103,164,38,211,43,142,65,138,94,245,240,150,131,103,15,104,171,173,255,142,211,163,66,36,233,130,244,96,123,136,151,17,249,185,245,191,160,255,82,196,86,87,91,241,145,241,249,69,147,255,116,180,44,217,67,40,124,163,182,237,239,220,191,44,161,166,128,215,103,53,82,36,229,66,79,217,65,124,106,170,174,92,212,78,18,91,66,2,215,253,86,239,39,86,119,119,117,119,96,123,128,84,66,72,154,161,253,253,45,22,94,124,170,94,230,26,245,222,82,200,67,178,100,230,173,11,57,117,235,176,232,250,220,245,51,36,7,56,171,217,141,95,98,1,253,15,144,76,76,194,223,73,21,209,182,159,245,168,239,135,63,24,169,38,139,15,222,73,152,169,176,97,147,101,114,162,61,115,244,11,2,2,66,232,58,241,109,112,203,190,109,208,170,158,55,127,147,197,81,136,3,75,0,140,209,169,1,0,0,0,16,8,2,86,223,137,3,107,118,122,67,45,0,0,0,68,144,16,110,60, +83,2,43,185,68,51,235,182,154,250,73,200,103,44,32,215,83,40,202,97,107,105,175,171,173,19,250,105,72,39,88,19,67,4,91,180,246,8,1,183,151,118,187,32,171,4,105,188,65,234,19,236,60,207,239,158,189,129,132,56,204,249,68,140,82,4,123,126,177,137,5,0,4,11,0,38,97,252,171,202,83,168,8,213,155,159,75,155,85,3,30,128,116,108,201,23,83,40,228,65,35,71,175,103,71,13,23,241,38,95,153,145,67,72,1,176,147,102,231,152,88,57,134,252,21,180,138,110,67,232,29,144,1,23,110,56,124,173,14,23,143,205,23,208,67,72,7,112,177,162,237,61,58,113,134,139,148,31,56,101,51,104,0,245,76,211,179,228,78,81,204,240,55,19,32,128,82,2,191,138,13,162,219,120,226,92,111,239,97,7,118,15,67,196,70,243,76,153,128,63,71,3,136,87,67,57,254,67,67,232,29,48,147,34,239,159,30,62,23,155,205,32,89,199,81,208,1,131,123,103,109,203,255,89,115,30,104,232,128,10,65,106,55,21,83,55,71,41,13,48,69,166,97,65,17,84,83,136,32,213,217,255,169,147,138,68,103,219,213,253,6,11,67,144,164,38,206,170,41,181,19,106,138,200,181,105,198,237,82,48,78,12,202,105,219,107,155,185,120,49,48,106,57,31,83,232,98,140,233,191,203,175,111,174,159,112,231,144,44,71,67,8,127,227,146,135,189,188,106,173,35,5,55,246,229,14,50,232,162,169,22,224,144,37,214,254,136,209,16,126,242,145,65,138,14,236,190,202,255,126,175,152,46,109,167,51,190,7,83,2,45,178,41,51,191,7,85,43,242,86,33,128,137,160,81,42,74,204,90,43,49,157,91,182,40,85,71,25,176,213,83,240,188,228,63,148,226,2,110,35,112,251,199,64,87,252,67,104,11,213,251,191,46,176,145,197,2,67,67,105,234,142,33,106,77,117,93,247,242,232,214,190,12,156,80,96,164,199,83,136,136,129,137,77,43,41,75,17,232,107,193,151,96,52,83,136,27,181,151,249,43,142,30,3,249,5,11,154,201,60,83,2,243,201,71,55,171,33,248,206,86,231,222,37,250,241,82,240,119,108,49,104,233,156,61,74,122,41,234,99,112,29,67,168,18,131,86,84,127,118,222,163,34,105,226,210,197,75,67,2,125,43,191,230,15,112,250,163,189,223,121,109,106,10,205,7,151,30,182,142,136,69,128,88,4,10,32,147,209,140,81,42,17,140,243,13,155,139,154,180,27,113,108,176,37,79,34,116,58,44,117,245,16,19,117,159,117,43,231,15,162,230,66,42,3,172,101,234,142,106,97,136,23,161,255,233,221,12,65,202,59,117,221,235,66,199,12,88,227,202,83,54,15,105,50,176,47,141,12,55,107,121,127,142,176,140,96,70,112,22,67,40,89,245,62,119,122,186,228,206,0,60,170,27,113,145,83,40,130,33,37,71,77,110,176,14,136,161,62,242,203,126,223,5,71,2,101,62,140,232,91,106,9,161,92,37,53,134,82,4,45,88,83,78,115,159,139,168,164,82,64,228,43,53,82,144,100,51,103,103,195,14,25,83,159,106,150,38,58,120,82,16,7,140,214,58,229,132,183,61,198,161,230,173,162,111,67,4,45,112,176,168,244,152,1,150,24,92,2,233,96,144,35,8,3,35,255,165,187,77,243,191,110,131,64,167,253,92,67,4,53,116,178,136,32,128,86,86,40,231,164,44,15,221,67,168,6,195,134,77,52,252,238,253,96,128,60,7,185,236,83,72,128,193,111,45,79,101,197,75,158,69,16,101,214,252,83,8,129,161,218,212,180,226,228,10,19,99,113,144,195,144,67,168,13,163,161,157,186,238,126,119,100,223,47,133,36,114,207,241,18,172,40,173,91,187,29,229,120,1,97,182,56,65,207,45,224,242,58,239,186,93,124,127,55,82,233,215,29,180,82,136,163,161,177,118,69,229,154,76,12,49,5,16,32,96,33,74,102,117,223,242,195,120,135,235,31,164,130,138,227,71,81,74,49,172,218,60,115,214,22,46,132,49,143,245,70,13,82,136,14,48,142,104,224,210,47,71,221,164,131,72,8,136,83,168,135,1,37,233,74,71,105,13,176,176,202,17,186,228,83,72,134,33,79,113,141,105,43,13,138,48,17,164,80,219, +82,8,1,240,158,152,96,163,137,174,250,4,173,86,215,229,67,200,7,245,45,119,252,251,62,238,130,224,136,1,66,225,67,4,149,180,244,104,87,127,189,45,107,174,182,6,161,159,205,7,43,58,221,148,173,147,168,255,187,16,96,165,128,66,65,234,119,108,89,90,187,247,101,219,176,133,147,73,116,155,67,104,49,163,144,141,62,254,111,205,36,119,188,38,22,236,33,6,169,112,233,140,121,177,70,206,151,89,59,159,222,53,82,232,168,225,234,34,198,150,38,105,8,137,200,68,28,197,81,76,26,108,219,246,164,120,231,152,15,150,185,161,3,224,66,2,81,29,117,94,46,21,63,138,251,6,117,210,111,125,223,37,19,217,210,95,142,242,106,32,156,43,115,168,179,35,207,5,247,255,94,233,46,53,196,80,180,82,62,238,190,138,51,4,191,5,157,176,138,140,68,144,121,158,174,57,206,43,35,4,111,127,75,175,46,85,107,25,159,154,139,65,169,89,82,36,233,10,71,201,41,212,140,182,2,132,127,35,149,84,82,36,133,65,69,137,213,20,128,204,85,85,135,203,75,59,222,5,41,7,107,75,185,172,128,21,29,50,213,51,26,1,82,36,165,88,5,153,53,148,219,170,210,54,68,211,25,50,222,5,67,45,127,111,183,164,128,2,166,178,233,114,116,163,66,36,149,15,154,224,25,151,37,0,143,154,77,70,95,239,223,197,226,12,177,224,65,80,171,58,181,108,55,237,30,126,82,196,230,10,183,216,105,55,1,159,122,185,203,175,247,105,82,196,244,20,185,220,49,214,75,149,227,67,112,201,153,10,66,36,17,198,152,240,41,151,144,98,165,138,166,111,191,98,82,196,232,6,187,228,145,213,89,165,228,49,197,27,125,251,222,105,137,73,14,109,151,88,122,98,241,100,117,241,35,5,82,2,143,189,182,206,83,249,16,130,101,0,217,137,166,27,66,2,23,10,59,215,175,82,14,234,202,210,66,158,204,154,66,2,113,143,121,91,176,22,30,8,91,10,127,5,127,159,67,232,4,204,221,125,214,241,102,234,158,39,234,201,63,212,65,2,211,227,137,155,63,83,1,4,212,247,251,77,19,63,66,136,2,117,114,238,97,53,49,110,163,77,88,217,199,95,66,2,249,150,248,95,240,55,160,221,220,121,54,115,186,247,207,5,87,255,215,241,112,182,80,135,74,18,88,42,45,209,66,36,233,154,252,196,168,95,34,218,89,106,162,128,2,128,82,36,145,203,149,217,177,144,222,142,239,219,102,50,25,17,82,36,169,89,135,135,85,8,185,73,65,193,67,8,49,210,82,196,228,10,185,232,17,158,12,38,67,174,90,79,81,124,50,4,51,7,107,97,181,164,128,181,246,150,240,172,33,219,66,36,205,203,182,162,25,95,85,89,6,18,175,176,223,182,66,36,21,202,150,207,40,135,175,113,85,153,155,18,167,32,67,8,3,227,23,85,114,220,252,38,35,215,119,201,11,3,51,4,199,73,197,52,139,128,171,50,159,134,249,50,195,114,83,8,75,227,200,39,110,198,206,131,91,192,8,180,137,185,83,80,137,204,220,89,235,173,251,161,195,191,131,89,240,213,83,232,5,181,214,235,107,251,59,2,127,173,70,18,64,234,67,200,24,112,250,122,71,207,213,107,22,136,69,214,226,218,19,232,132,33,29,85,117,253,164,60,234,173,93,255,240,63,83,40,130,129,79,243,74,79,83,11,217,70,55,38,249,18,82,2,47,222,59,63,219,68,2,161,153,67,169,166,84,133,82,34,45,69,235,128,141,48,136,61,52,224,191,240,229,100,65,2,99,77,99,77,107,87,1,80,82,9,6,177,129,146,82,34,169,9,250,132,23,165,247,199,255,27,177,243,253,155,66,36,41,75,244,82,107,152,167,168,72,154,116,84,244,95,50,136,222,161,113,87,211,120,53,234,81,13,101,177,21,122,67,2,213,77,45,217,74,77,153,227,52,140,17,124,0,0,66,36,169,195,180,112,123,128,181,183,144,39,0,250,4,0,67,2,85,47,45,85,11,76,136,17,34,36,43,17,0,139,223,5,209,77,61,49,138,13,112,57,150,208,89,226,255,73,207,137,3,171,102,198,132,69,4,0,0,64,74,114,130,193,175,17,95,201,193,213,1,0,128,42,10,171,25,154,33,81, +33,6,11,108,190,22,214,243,29,121,201,194,28,25,47,247,51,4,89,68,117,90,14,29,73,2,205,150,236,66,183,59,223,5,245,72,150,88,14,123,108,167,191,8,174,21,240,152,67,72,202,105,195,96,202,14,7,223,65,108,106,131,4,70,82,4,49,65,145,143,149,41,50,254,55,193,35,119,43,3,83,2,247,224,134,55,128,32,103,172,67,105,158,129,236,172,83,2,51,194,45,47,30,81,80,18,227,63,69,86,100,54,83,168,0,108,181,229,13,207,239,158,241,142,155,96,20,65,82,136,43,227,228,243,151,253,167,119,27,166,206,111,8,193,67,168,18,227,20,87,239,198,251,127,36,9,237,199,151,135,82,4,125,179,91,221,1,128,104,127,21,63,137,44,94,150,83,72,142,65,7,41,49,43,75,17,208,3,191,232,211,39,83,136,140,161,39,9,111,105,107,17,182,16,3,16,49,245,205,43,124,163,114,54,215,220,231,173,155,52,236,106,36,77,81,248,35,204,168,167,221,19,183,54,215,223,129,154,236,118,81,208,62,35,254,250,231,214,174,46,123,26,40,140,80,82,83,2,245,185,234,46,4,106,160,131,98,206,220,160,194,187,82,4,61,234,227,94,179,134,105,98,143,185,237,84,9,132,82,4,55,186,225,151,85,170,121,72,37,40,134,32,59,132,82,40,9,181,217,87,238,236,6,177,12,0,198,26,235,158,83,200,152,193,73,41,143,79,51,13,123,225,5,96,1,66,83,2,185,168,134,50,16,105,9,41,11,39,114,251,118,150,83,40,145,193,137,141,173,196,38,15,5,128,3,203,107,107,65,42,2,108,221,123,250,31,254,4,140,151,245,89,175,3,82,184,129,248,239,198,221,91,174,191,128,226,214,171,10,164,83,168,131,1,5,71,237,6,11,11,22,64,193,151,29,125,83,72,143,97,141,236,78,75,73,13,51,242,27,28,160,3,83,168,13,181,244,62,38,188,28,3,235,72,189,140,47,160,83,104,5,245,218,47,107,14,29,7,95,129,111,70,245,81,83,200,224,97,183,139,143,141,139,15,52,145,81,214,109,64,82,144,57,195,43,41,79,117,217,46,151,50,22,92,90,36,82,136,59,35,66,54,190,253,43,229,25,6,100,1,62,144,66,180,3,224,111,125,177,149,242,0,255,151,8,247,250,37,67,2,255,2,109,210,10,16,238,8,213,35,183,93,13,141,66,16,183,17,198,153,153,163,235,88,168,80,5,64,116,52,82,4,63,172,241,94,17,170,107,162,210,41,169,55,191,19,223,73,177,97,13,135,154,170,39,155,59,116,243,130,198,189,83,232,157,225,4,71,43,73,205,10,103,91,207,232,3,99,67,104,5,240,194,19,205,162,117,170,150,170,85,21,193,97,51,168,146,65,5,87,218,250,199,147,32,117,82,53,10,127,67,2,253,230,109,84,140,93,220,187,145,231,204,137,239,5,66,2,69,171,209,227,240,21,68,64,72,186,4,117,18,253,83,8,1,213,126,155,39,43,29,7,146,74,24,52,184,121,67,2,239,103,158,94,14,119,226,220,191,180,103,86,205,0,65,202,66,108,221,118,175,216,119,209,80,72,114,117,147,29,34,240,22,37,198,169,47,195,175,177,7,225,140,152,143,128,207,249,169,122,115,177,52,83,155,119,15,162,69,227,77,29,82,4,95,178,233,95,19,154,191,10,165,64,128,242,48,2,83,8,144,97,149,139,81,103,137,13,51,243,5,187,129,80,67,40,9,227,214,135,182,236,122,167,97,155,204,169,35,4,67,4,55,152,214,136,160,77,81,171,165,32,188,108,33,44,83,136,14,35,145,166,103,222,245,135,0,19,226,15,253,77,67,200,74,195,23,87,254,172,239,181,36,31,242,146,107,199,67,8,2,181,105,109,242,242,162,206,0,116,55,183,168,193,67,4,185,246,180,168,204,233,145,50,37,16,239,117,190,252,81,170,18,108,210,26,51,198,148,178,9,123,26,99,152,5,67,232,13,48,254,178,111,155,54,58,20,65,20,9,177,185,67,72,14,112,218,122,235,150,61,63,142,0,46,202,173,12,82,2,79,196,91,153,211,16,224,42,130,120,128,115,243,148,83,8,38,195,108,47,255,219,172,131,232,38,123,104,8,111,83,136,231,65,111,149,203,73,11,13,2,173,100,163,53,129, +19,8,171,201,116,94,102,37,114,201,189,170,16,190,193,198,82,80,67,236,197,234,102,181,239,222,28,161,85,197,197,27,82,104,13,208,142,106,44,91,153,209,37,81,160,32,82,44,82,216,182,230,255,14,83,221,243,245,41,4,2,218,203,87,83,2,63,249,197,51,134,107,17,53,130,165,59,48,27,3,65,138,130,68,233,166,94,203,84,106,176,144,78,246,66,180,83,136,19,99,249,253,235,252,189,130,70,236,108,86,54,64,82,136,31,35,51,50,214,188,36,157,7,226,110,220,2,182,83,2,49,193,39,47,8,0,200,32,150,214,218,88,199,242,19,144,117,205,187,157,241,43,255,22,15,159,9,169,176,64,67,200,152,9,15,93,40,133,14,95,1,12,101,77,81,65,67,72,41,227,161,207,59,220,117,255,32,165,201,4,72,9,67,4,119,182,242,72,107,13,174,169,173,249,166,14,244,147,82,232,119,240,34,187,40,99,198,165,233,192,6,25,38,80,67,4,143,178,174,40,49,240,116,156,210,148,97,143,82,170,51,4,83,13,22,177,138,154,91,27,24,198,179,42,202,50,223,5,49,4,132,186,138,112,56,209,192,12,193,46,167,179,51,104,166,1,22,154,150,194,102,159,188,20,67,181,243,245,207,5,219,255,191,107,108,21,125,250,93,245,23,242,66,176,207,5,107,121,215,173,110,21,173,207,143,199,131,250,66,44,223,9,157,233,224,165,173,200,165,23,251,20,65,177,114,255,207,5,107,251,87,173,110,85,189,89,100,20,147,188,14,68,223,37,7,90,234,219,77,238,222,118,106,148,196,64,86,61,82,36,137,209,124,135,99,30,149,106,94,209,100,16,52,0,82,36,169,194,254,135,85,181,125,189,20,175,4,32,22,144,94,39,47,198,32,79,37,2,227,46,114,17,70,179,152,239,66,36,205,211,210,178,168,135,144,139,136,178,134,114,246,100,35,136,222,225,95,183,113,71,219,228,157,78,81,144,233,48,82,36,169,18,199,151,181,208,230,156,28,48,121,0,2,0,82,36,169,17,7,137,235,144,79,4,227,105,21,226,242,155,82,208,94,12,87,169,31,100,188,214,88,209,35,154,166,38,34,232,189,233,176,161,252,5,218,112,69,57,11,5,66,218,35,4,99,246,219,177,48,214,42,66,138,77,25,10,141,20,207,5,79,114,95,179,118,55,125,73,100,239,118,105,10,13,35,4,107,126,103,51,114,53,227,173,29,0,194,43,106,47,35,4,95,127,94,179,114,22,45,219,144,10,79,0,33,4,82,36,173,194,70,135,51,164,113,69,99,47,165,94,1,128,82,36,173,218,68,199,73,190,134,162,140,191,243,230,181,191,223,37,233,166,31,86,132,107,155,173,127,227,88,145,4,146,35,4,227,255,95,241,112,150,120,191,165,66,109,127,236,48,81,2,73,11,81,59,205,182,128,68,82,134,193,155,218,155,207,5,235,252,223,113,112,54,67,240,3,185,80,227,221,146,82,40,17,50,225,197,177,115,122,117,221,160,227,7,1,129,66,2,211,249,83,245,50,23,192,222,156,177,181,51,32,174,223,37,1,252,233,223,141,102,139,136,182,61,51,106,163,229,82,36,7,29,29,11,132,157,180,215,68,57,7,224,60,149,223,5,235,173,61,193,138,32,65,128,36,233,56,242,223,201,66,2,55,249,87,45,120,85,0,0,0,0,30,150,57,123,82,36,225,90,15,201,73,187,146,175,150,170,8,196,61,149,66,36,67,116,148,178,25,135,212,239,238,111,148,2,164,202,50,136,168,233,148,38,181,188,157,103,157,81,97,158,41,41,67,2,85,78,45,215,138,8,17,61,0,200,108,66,162,236,82,36,129,72,79,153,117,251,203,103,179,219,85,154,42,231,66,136,222,161,254,229,111,46,37,58,221,78,168,98,103,163,223,3,97,225,80,31,109,213,176,54,88,103,172,181,246,158,51,196,88,87,95,237,129,150,69,200,251,250,199,217,183,54,67,2,81,14,45,213,74,37,1,48,26,72,40,23,38,132,82,34,41,67,121,136,23,57,162,102,179,188,255,213,101,206,223,197,92,93,99,237,129,235,26,117,114,34,57,41,64,57,81,40,35,213,90,197,242,171,213,41,0,240,39,196,4,16,207,137,3,145,117,21,214,62,0,32,0,0,12,231,188,150, +83,2,227,128,134,50,4,227,226,82,15,91,155,86,180,135,82,4,59,187,169,141,113,151,58,103,94,235,148,12,136,82,82,4,93,242,97,79,181,248,94,68,227,93,136,224,170,210,67,176,105,172,182,234,255,122,253,63,147,29,228,216,99,88,67,4,109,144,178,88,102,32,164,22,164,226,219,110,253,189,205,235,227,225,251,255,237,59,14,121,20,45,83,251,13,4,82,2,43,168,153,49,97,1,33,41,58,251,233,54,205,246,81,42,1,44,82,120,171,189,82,190,181,253,55,13,45,51,83,2,237,176,198,50,148,242,79,229,95,88,247,3,100,240,67,4,85,76,208,96,126,31,110,11,138,77,25,98,74,158,82,208,31,172,202,137,107,165,147,181,119,193,79,139,93,2,67,232,119,235,210,71,159,216,176,191,160,157,182,147,238,23,83,72,1,245,223,174,73,139,53,7,192,125,201,171,185,16,66,136,168,233,150,69,107,184,210,149,235,22,23,249,88,184,67,2,99,225,92,202,74,55,20,62,149,177,42,191,232,124,82,4,61,227,186,229,37,22,9,169,192,21,129,185,133,176,83,2,43,193,70,55,73,4,246,23,33,35,96,30,0,116,83,136,142,97,105,141,49,235,12,15,228,55,33,157,129,30,65,170,196,210,43,46,43,149,94,224,138,75,19,176,14,90,206,169,162,129,229,94,113,86,213,76,229,80,18,252,124,112,83,2,247,217,40,51,86,140,26,98,107,63,65,159,148,23,66,2,123,88,118,240,171,63,60,51,114,2,7,8,106,154,65,10,3,44,75,243,238,191,253,132,46,72,191,124,28,135,83,168,18,227,240,103,117,239,191,133,2,83,84,251,206,122,205,7,7,44,216,12,63,58,146,229,239,239,200,24,85,98,83,2,125,178,137,46,238,159,46,196,90,63,97,61,119,135,67,168,36,35,115,253,59,246,45,253,36,2,74,245,149,190,83,72,1,172,155,101,223,36,75,116,158,177,79,238,6,230,67,4,49,114,212,32,52,231,135,212,52,160,110,75,148,121,83,8,166,1,67,231,42,99,135,11,130,14,101,210,55,109,83,200,152,129,233,8,143,41,75,13,139,153,8,155,145,10,67,40,1,213,176,175,100,204,34,197,4,93,246,245,222,19,66,216,36,172,236,20,15,91,117,21,115,27,195,164,238,190,66,16,41,229,254,255,165,111,107,247,98,137,252,111,65,66,34,236,120,163,233,35,71,141,217,165,249,210,38,13,88,223,67,168,36,240,170,35,78,39,55,123,142,17,112,131,173,74,83,2,179,201,71,51,119,104,176,231,76,182,23,82,149,81,33,6,135,95,210,14,46,222,185,173,235,62,254,154,1,68,66,42,145,178,41,253,57,21,205,81,3,120,224,196,2,18,82,144,185,70,231,88,230,222,173,58,171,216,12,168,115,117,82,4,29,250,97,95,21,188,19,150,156,37,31,117,23,87,83,136,131,65,73,109,77,135,135,65,130,192,163,173,47,68,82,4,95,251,171,13,53,27,149,122,164,228,43,224,158,82,82,4,61,237,243,159,177,38,99,203,12,1,227,0,16,63,82,4,125,227,97,93,179,160,112,70,211,113,41,68,3,149,67,4,113,146,178,8,133,70,181,18,60,70,74,168,104,69,67,4,81,116,176,8,85,201,65,130,170,74,64,117,9,32,67,136,2,208,202,227,110,146,101,143,7,0,78,127,186,87,83,104,153,65,69,71,203,167,139,19,80,84,91,139,216,244,207,173,183,210,255,166,246,69,188,9,154,72,233,182,253,178,81,170,141,50,151,103,103,125,135,200,12,208,182,112,185,123,67,136,50,176,178,51,111,226,141,43,21,16,136,164,181,32,83,2,49,185,231,42,200,104,13,120,219,220,172,109,221,106,82,104,59,208,99,107,169,211,172,178,249,120,241,117,239,119,83,200,24,117,148,174,37,186,86,6,72,10,57,128,26,145,65,202,7,117,119,55,65,101,11,88,85,108,10,29,64,67,83,72,86,181,149,186,142,170,80,3,160,46,165,155,177,159,34,172,46,131,225,83,206,119,36,163,80,0,26,111,178,169,51,4,47,229,155,194,138,219,74,128,48,142,209,58,134,128,207,41,131,225,18,91,231,180,21,147,127,28,110,118,194,40,207,113,97,197,251,61,119,253,103,239,143,137,196,229,47,37, +82,72,1,195,163,30,194,21,206,247,25,154,163,185,89,6,82,40,64,245,105,242,87,145,131,157,27,36,205,187,204,146,83,2,251,240,196,47,141,81,177,150,5,125,141,168,99,109,66,106,149,196,90,247,169,157,98,115,230,249,99,160,115,192,82,2,215,200,151,29,115,37,199,14,204,211,92,167,11,140,33,6,143,56,242,140,180,69,213,65,116,66,160,218,191,188,83,2,177,185,231,54,90,181,103,192,235,185,159,24,222,120,82,232,52,176,25,135,220,194,38,34,216,120,191,62,202,17,82,4,19,109,41,203,65,234,149,31,91,181,101,28,220,0,83,136,131,129,162,4,77,7,39,13,51,91,193,49,44,148,83,72,128,161,196,36,13,229,230,10,82,136,33,53,118,136,83,2,183,210,233,58,68,120,33,160,226,211,51,156,234,236,67,136,60,181,237,189,189,196,100,207,2,69,212,239,58,56,83,2,55,201,229,50,24,240,78,88,29,185,141,241,239,8,82,236,59,224,111,191,240,124,103,73,142,124,0,84,0,20,82,40,124,80,195,28,231,100,163,29,201,120,133,105,221,193,67,2,237,136,134,94,13,128,18,14,175,209,187,213,110,195,67,4,245,244,54,105,250,191,161,138,26,192,120,73,64,226,82,4,91,250,163,77,85,100,120,32,218,79,168,18,34,0,82,2,123,166,217,101,83,4,255,151,253,68,163,211,205,229,67,40,9,163,48,197,173,151,165,126,164,179,96,252,7,16,51,72,26,149,129,46,22,153,24,108,178,208,244,11,242,246,66,136,142,73,74,228,93,246,162,213,231,12,37,114,197,53,35,4,227,251,91,175,50,86,161,158,129,242,39,1,221,255,67,2,203,68,149,174,74,179,17,156,17,65,253,79,98,110,206,201,135,137,217,167,209,245,224,5,87,218,64,128,251,111,207,5,111,124,95,179,112,22,237,29,195,183,108,240,160,64,66,2,231,253,95,245,48,53,157,109,174,235,110,169,254,15,223,197,252,12,195,188,65,237,95,59,73,67,80,141,98,219,82,36,241,3,23,151,75,2,137,173,164,138,214,68,190,219,66,36,81,207,144,161,40,71,247,249,153,161,8,160,132,170,207,5,103,242,98,177,112,22,93,160,25,10,105,10,253,10,50,8,130,73,170,72,124,29,235,98,229,100,101,4,161,121,82,36,133,146,4,151,117,127,7,190,186,249,84,74,150,74,51,36,237,134,55,218,131,4,41,18,18,68,41,217,175,50,207,5,103,255,231,243,114,86,81,116,83,162,213,107,133,253,207,5,127,127,107,183,50,54,97,226,176,116,227,117,177,185,82,36,229,25,77,201,211,84,99,210,58,202,218,138,142,138,82,36,141,210,190,135,51,40,87,65,145,50,37,194,217,139,82,36,137,17,205,215,17,217,171,222,123,98,37,90,19,75,82,200,13,50,105,136,239,51,26,65,220,0,13,76,2,71,82,36,137,90,85,153,53,4,140,43,213,153,100,63,158,109,50,8,215,9,174,109,156,96,186,104,53,243,228,57,71,89,82,196,218,248,182,228,49,41,47,21,30,129,165,127,214,50,207,5,251,117,211,179,110,53,105,233,110,86,23,97,3,41,82,36,129,9,135,201,209,54,109,199,78,73,136,102,169,11,66,36,11,185,234,192,40,135,95,239,85,197,89,204,160,100,223,37,7,27,171,91,142,113,146,180,251,163,101,53,211,0,66,36,139,252,238,145,24,71,247,221,93,251,164,91,190,115,82,36,39,214,78,201,69,119,235,91,211,249,151,55,212,181,207,5,127,237,222,249,46,85,203,127,11,31,159,233,2,129,223,37,251,108,154,223,141,12,113,115,225,164,43,21,174,83,82,196,216,4,183,216,209,188,168,174,228,93,169,41,66,172,66,72,202,73,217,126,239,30,200,60,175,86,94,116,25,23,66,36,69,207,250,229,42,143,238,94,237,253,71,220,163,120,51,36,223,228,94,88,15,150,229,252,54,97,57,54,73,74,51,36,229,67,63,90,14,128,88,219,145,153,208,166,229,252,51,36,103,102,63,216,131,123,39,1,132,8,217,32,8,146,67,40,74,11,200,58,77,244,122,167,34,0,5,24,194,242,223,137,3,3,213,80,82,165,0,0,0,132,16,31,126,252,95,137,3,235,17,230,212,201,47,0,0,0,64,189,29,81, +82,72,8,80,166,184,94,195,142,50,10,101,57,132,38,57,82,2,151,238,8,30,217,8,197,57,144,116,16,85,115,127,83,104,13,195,98,147,103,103,245,130,237,103,30,144,104,125,81,42,35,236,94,43,239,197,24,112,27,169,210,17,116,102,82,2,163,182,24,251,246,104,163,211,232,174,157,183,183,243,65,234,4,12,195,249,196,221,174,67,24,129,43,115,102,153,66,104,166,193,151,143,183,244,182,245,251,14,71,243,141,248,67,2,221,194,77,90,139,240,223,73,28,164,16,16,193,183,33,6,151,120,117,6,39,19,3,32,169,252,182,223,122,55,67,2,109,139,222,226,140,58,6,41,209,235,59,8,38,47,83,168,3,195,226,227,199,236,219,134,81,124,138,38,44,229,83,2,125,241,168,51,84,18,171,78,148,80,151,10,152,116,66,232,187,129,87,150,119,252,163,205,54,12,245,162,50,59,67,168,3,208,243,242,102,44,90,189,84,143,40,134,75,40,82,2,95,168,23,242,216,68,23,128,26,237,161,114,49,124,83,136,19,227,225,150,78,191,189,134,73,103,83,128,189,144,83,72,49,245,156,219,169,30,85,3,66,104,25,178,221,90,83,2,249,225,9,47,94,96,236,25,12,195,32,242,166,0,82,2,175,210,219,62,251,228,255,185,32,187,45,55,81,111,81,234,227,178,191,100,43,54,135,190,147,94,150,236,78,192,67,2,221,195,125,220,140,183,104,29,238,38,247,249,65,119,82,2,103,194,89,53,235,96,152,64,66,90,78,33,176,117,67,2,219,169,132,84,77,223,137,159,249,246,223,164,215,23,67,2,75,228,100,216,12,214,212,89,118,135,59,191,66,83,205,139,142,33,212,250,253,158,28,109,20,9,26,193,25,95,67,80,39,236,244,250,246,108,253,127,9,30,111,35,60,145,66,200,152,129,132,87,51,166,38,199,125,14,64,234,22,216,67,240,32,172,149,254,127,250,213,59,17,131,202,135,83,98,51,4,205,130,118,62,138,137,227,188,142,227,52,21,224,100,205,43,252,65,56,181,236,46,255,187,20,202,154,95,237,177,67,72,8,240,168,211,109,190,94,177,84,74,216,69,244,206,82,16,27,69,85,85,199,10,205,206,58,6,6,185,99,86,83,2,123,218,75,47,47,19,125,111,194,164,231,12,120,73,67,2,123,106,117,84,13,150,98,188,69,176,207,160,143,105,67,136,101,213,181,191,154,126,255,211,130,230,134,249,0,82,33,6,11,30,29,142,10,104,93,146,68,10,100,150,0,64,67,4,117,178,244,40,0,20,6,244,181,223,247,235,85,78,66,8,154,129,84,142,56,222,23,158,126,20,16,108,235,209,223,105,189,1,166,201,218,162,229,34,216,144,35,111,132,8,65,42,17,112,104,56,85,174,204,160,49,68,12,244,194,191,83,2,57,169,71,46,227,36,43,207,42,252,55,129,83,1,83,136,130,65,79,241,108,85,55,13,181,160,20,16,240,19,67,176,123,236,254,111,236,126,249,123,83,183,38,126,97,1,82,2,187,196,152,97,219,64,55,146,222,101,117,195,228,67,83,200,66,227,168,98,198,127,21,135,131,124,169,131,30,57,82,4,63,59,121,137,21,150,23,173,98,178,36,238,0,149,67,168,102,163,113,229,237,174,106,109,100,223,244,112,52,0,65,170,3,172,172,74,254,219,111,103,45,209,24,94,22,42,83,168,128,97,105,107,81,73,45,11,215,142,181,73,185,27,205,7,155,108,218,148,144,228,31,216,204,209,150,248,189,201,83,2,243,208,102,55,132,81,176,4,231,247,26,91,214,20,83,232,117,172,179,167,25,222,237,93,205,143,61,133,44,36,67,16,55,172,180,107,187,198,213,158,79,45,136,101,147,14,33,146,147,204,30,254,110,229,45,117,163,42,63,83,206,196,66,4,237,201,127,70,44,133,151,178,5,146,173,121,173,178,221,235,132,193,211,35,53,211,118,116,129,150,25,112,155,171,83,232,187,33,37,233,234,70,205,10,78,184,217,174,247,224,83,168,131,1,99,197,202,194,36,11,63,217,2,37,44,121,67,2,101,199,141,92,143,252,22,249,251,56,179,96,73,80,83,2,161,136,166,42,77,38,251,182,18,239,118,252,23,133,83,240,184,198,222,31,119,218,219,42,95,223,239,97,127,66, +82,2,159,172,152,82,83,217,197,123,246,116,0,216,160,79,83,2,233,161,170,54,152,241,75,128,178,190,78,45,238,10,67,2,115,139,206,94,16,255,155,254,163,4,142,87,224,53,67,2,87,69,133,92,77,144,246,170,61,13,96,240,192,166,82,2,249,228,15,153,217,144,247,214,32,72,85,92,150,231,82,40,11,99,115,186,179,127,199,63,13,102,184,21,0,120,65,138,25,3,227,38,139,234,22,6,198,46,193,108,253,133,33,10,131,233,233,146,133,191,60,170,14,19,7,194,98,196,83,72,173,1,39,201,108,13,17,11,215,29,162,142,10,95,66,76,152,18,70,89,101,37,32,241,144,82,247,102,111,164,67,104,5,213,253,190,53,250,36,215,0,15,109,179,142,200,67,2,225,167,141,212,76,153,34,175,43,126,190,145,6,224,83,168,136,193,113,47,49,9,41,13,15,106,3,76,87,233,67,104,49,181,170,173,206,164,101,199,132,214,109,33,101,53,51,2,119,53,150,71,184,181,160,221,86,138,35,192,48,10,81,138,168,196,191,250,190,175,35,134,175,158,34,108,71,255,65,138,87,195,177,115,117,119,21,82,28,192,120,82,223,62,83,2,219,120,134,50,57,10,110,9,195,28,98,79,168,123,65,10,35,44,203,210,253,159,54,1,203,96,151,109,191,41,223,5,221,135,173,90,140,128,3,138,96,215,137,123,210,175,67,196,70,51,125,73,110,215,124,115,192,0,79,203,25,73,67,2,103,42,206,94,13,27,4,206,213,147,230,186,186,213,205,7,11,42,221,148,53,250,238,60,205,66,174,8,17,82,82,136,103,48,141,101,96,91,226,153,165,16,2,32,77,14,82,2,151,232,214,117,121,224,235,143,61,28,254,114,153,183,82,200,24,35,51,50,210,93,68,251,9,130,166,93,58,81,35,4,127,16,215,154,46,83,65,101,206,98,222,211,237,117,67,2,213,165,173,176,10,35,16,219,214,104,205,45,247,214,82,4,77,129,147,76,243,40,177,13,129,114,213,236,48,71,67,2,201,68,173,46,138,179,65,143,144,218,219,6,227,238,82,36,137,82,21,201,73,154,4,160,182,190,92,141,93,235,95,137,59,107,18,198,204,201,54,156,175,165,135,111,20,5,66,8,174,105,82,17,106,16,90,36,107,86,27,9,73,251,82,36,141,25,71,215,179,72,133,215,161,234,43,32,145,82,82,36,201,11,29,135,85,71,207,206,177,33,168,89,42,0,35,4,247,255,94,117,48,86,125,39,167,206,214,171,227,25,2,38,153,223,146,226,183,150,125,253,119,59,165,37,174,25,66,36,77,11,146,192,24,159,160,232,162,103,161,129,168,130,50,4,25,1,65,57,191,180,128,5,35,13,123,104,53,43,66,40,139,41,176,58,46,22,205,52,107,64,184,102,248,208,50,4,249,222,56,61,189,170,128,175,17,113,24,249,158,63,35,4,123,116,99,181,112,86,115,237,9,253,201,251,109,72,82,36,99,198,78,201,177,244,139,85,103,114,13,18,34,83,207,5,115,116,78,181,110,23,226,123,47,239,253,102,253,3,50,4,217,224,254,248,182,194,0,106,229,114,146,157,73,172,82,196,218,252,192,238,145,185,108,45,172,243,219,243,223,235,82,36,161,1,197,135,181,6,141,161,144,219,204,250,27,109,66,2,199,241,71,51,59,55,176,15,224,14,72,136,72,132,50,232,172,41,86,109,152,92,191,58,67,154,228,217,252,180,50,4,229,204,46,57,195,180,128,237,122,171,120,25,136,170,50,136,131,41,82,84,125,189,19,198,110,145,212,4,181,78,51,36,99,196,55,216,79,123,19,10,190,44,70,125,3,137,207,5,239,109,198,179,106,55,88,6,188,94,126,37,85,35,82,196,240,18,187,222,49,189,11,252,211,250,170,234,52,75,223,37,235,4,40,87,65,219,70,103,118,194,8,9,36,200,51,36,97,102,87,212,65,132,157,238,100,146,102,144,162,56,66,2,107,245,71,173,110,84,97,226,94,23,152,29,232,253,223,37,145,88,226,227,76,166,120,71,87,244,93,225,127,135,51,4,223,110,37,183,74,77,29,26,221,18,10,235,27,1,175,137,3,171,159,1,36,195,15,0,0,0,64,32,152,40,34,232,227,113,243,46,0,248,137,218,9,229,76,48,64,208, +82,112,72,12,99,123,173,189,58,198,137,69,54,131,170,163,65,170,146,82,58,221,170,181,101,8,12,164,168,33,177,20,82,2,227,200,151,217,112,137,114,120,242,158,129,20,137,233,83,232,157,65,35,39,77,77,111,19,128,90,95,111,153,128,83,200,24,181,183,121,44,140,56,3,216,141,153,20,15,144,82,80,47,204,94,60,117,206,53,103,205,97,102,245,85,189,67,200,1,208,227,19,198,45,58,189,84,245,83,77,122,128,67,4,77,112,174,8,132,32,148,100,208,190,73,240,91,76,83,200,16,172,189,62,73,247,253,117,128,65,217,98,249,71,67,232,40,240,136,167,79,175,86,54,20,195,246,147,136,6,67,136,14,203,212,71,106,106,44,237,99,191,96,127,0,71,67,196,68,211,116,233,176,4,120,133,91,111,209,4,0,164,205,7,59,106,114,148,122,252,149,67,168,37,69,82,11,98,205,7,59,109,215,134,164,101,71,162,69,250,63,128,197,85,82,4,151,63,247,215,53,158,223,41,162,221,248,221,41,128,67,168,38,240,138,231,71,163,247,59,70,60,158,174,184,36,65,106,21,3,39,73,15,51,19,18,153,176,230,97,180,7,67,2,83,100,117,86,141,8,69,165,70,79,206,208,55,188,67,2,79,99,109,88,139,42,100,107,156,215,5,108,38,10,67,2,85,65,93,216,11,214,81,138,136,34,167,253,101,198,67,2,239,131,93,216,76,247,50,175,219,232,30,160,10,88,65,138,90,172,237,247,147,210,172,203,9,227,30,108,155,142,83,200,202,65,67,41,47,233,44,13,34,73,220,68,35,108,82,2,223,191,88,251,246,112,131,99,207,201,37,255,250,158,83,136,131,97,77,49,45,131,199,10,29,221,69,222,2,226,67,232,31,227,32,143,126,236,63,183,32,17,124,73,3,73,67,40,96,67,132,70,183,244,238,253,34,238,87,50,212,196,82,200,66,112,133,104,218,50,7,185,69,1,3,112,169,107,81,240,22,44,178,46,189,137,176,27,170,52,91,59,129,103,65,234,70,35,35,69,75,51,25,10,60,2,145,9,84,53,83,168,143,193,101,71,205,239,207,71,0,169,36,224,206,1,65,234,29,172,95,242,171,89,174,240,172,117,104,117,140,67,67,80,81,108,214,110,230,110,159,59,7,144,2,159,130,99,33,6,11,94,253,148,110,220,108,75,114,128,72,2,132,78,67,72,0,195,199,70,185,238,109,239,96,189,226,44,12,28,83,136,131,129,109,79,205,228,38,13,24,184,155,118,229,255,51,4,189,128,83,208,139,206,46,201,32,9,196,16,41,53,67,2,219,4,93,218,11,240,139,33,31,233,126,133,126,11,83,2,123,177,133,46,117,180,244,74,167,101,24,176,18,8,205,107,140,97,179,113,205,166,191,187,20,76,30,55,208,65,83,144,159,236,183,174,183,74,181,160,49,158,65,208,53,194,67,112,22,172,245,170,68,104,244,110,5,96,47,114,16,220,66,176,80,101,204,164,229,37,231,102,206,136,30,229,75,248,223,5,69,195,116,216,139,0,241,3,68,146,64,110,2,208,67,2,113,196,158,228,138,189,5,20,207,200,136,253,119,45,67,2,221,167,197,224,75,76,200,116,103,100,221,123,42,3,49,234,214,225,226,169,183,193,99,198,97,73,4,120,69,174,67,2,93,198,181,94,10,240,155,190,115,60,45,187,113,110,67,4,111,178,184,72,234,219,174,123,131,238,75,33,104,206,67,8,9,163,33,141,106,254,233,219,163,50,162,131,252,218,83,2,45,185,6,51,246,236,49,110,117,117,37,72,141,114,66,16,0,197,171,127,97,227,186,126,223,139,203,65,13,9,33,6,191,40,222,140,59,77,16,220,48,128,100,97,170,103,33,6,197,151,199,143,44,73,182,14,100,242,222,189,102,55,65,10,3,53,49,87,99,135,15,40,169,161,242,127,92,178,67,200,96,112,139,148,235,45,122,189,84,197,71,12,211,65,83,72,133,97,101,135,77,11,43,15,234,93,174,232,39,96,83,104,5,99,201,39,111,82,102,131,230,204,52,160,227,9,83,2,175,169,234,42,109,230,31,53,19,37,96,40,151,147,67,8,3,48,146,165,197,63,60,109,20,80,89,154,204,223,83,136,8,163,235,146,237,74,149,131,96,161,69,95,244,62, +67,2,209,194,68,210,12,175,53,210,198,104,5,236,135,219,83,2,51,177,197,46,242,174,6,195,172,156,154,42,148,210,82,2,183,170,157,113,105,133,161,69,1,78,8,37,57,132,66,208,31,204,112,127,114,254,202,222,126,11,98,128,177,159,67,40,130,233,241,193,163,37,47,214,65,34,135,56,130,6,82,4,59,117,59,93,19,242,118,170,150,72,97,87,154,143,82,4,27,227,43,93,19,89,175,72,222,63,85,249,200,145,205,7,11,45,91,148,198,115,148,217,34,8,101,135,145,0,83,232,44,181,245,118,39,63,87,7,39,240,131,5,23,222,65,202,24,149,153,87,39,73,15,0,169,106,28,53,31,164,83,200,187,65,13,83,203,8,141,75,87,156,17,20,176,15,82,144,32,12,87,122,223,131,182,86,105,1,166,229,76,250,65,202,1,44,77,87,222,219,53,49,8,126,170,203,85,158,83,168,0,227,138,231,117,75,149,134,228,14,190,251,226,21,65,10,1,108,91,210,95,234,203,123,23,133,204,18,157,81,83,2,107,169,232,50,118,123,160,116,52,132,213,135,201,171,67,40,2,176,66,215,79,171,52,157,70,53,51,187,224,86,83,200,59,227,160,18,69,237,223,131,34,193,55,206,254,171,81,138,3,53,171,122,46,182,65,182,192,76,78,151,47,0,67,2,63,66,108,212,10,130,212,201,24,23,120,199,98,229,67,104,38,176,211,118,229,13,122,125,76,45,36,208,75,40,66,140,231,100,214,23,163,165,114,210,250,135,165,175,7,104,207,137,131,193,130,79,37,134,19,70,252,22,176,242,13,74,65,42,124,172,44,166,191,246,38,121,27,186,98,50,205,166,83,2,111,193,39,51,133,82,155,57,86,6,136,201,114,123,83,2,107,169,230,50,148,91,237,33,109,142,248,19,168,116,223,5,91,172,237,88,140,59,69,36,128,212,54,116,186,181,83,2,175,184,133,50,247,231,86,207,153,64,247,67,0,181,67,196,208,52,125,73,130,213,46,240,62,18,60,208,2,217,67,2,253,69,135,220,77,147,222,253,203,182,235,127,216,229,83,200,152,97,116,180,244,34,167,10,80,39,209,11,208,80,67,2,193,225,92,46,74,0,1,1,13,112,71,124,102,158,83,136,142,97,128,4,75,73,43,17,223,167,244,164,65,192,82,36,113,238,113,5,83,169,112,12,128,112,110,140,107,117,67,2,79,102,165,174,10,24,2,255,141,74,252,79,162,222,189,7,43,37,53,125,27,173,119,9,192,222,100,34,179,153,82,2,61,170,93,110,211,56,8,213,180,202,151,217,93,107,223,37,213,70,118,214,129,10,80,161,172,205,177,48,183,191,35,4,87,125,215,115,48,150,64,148,64,107,146,104,195,248,50,168,210,41,96,241,155,157,3,198,62,133,100,159,90,146,207,5,253,240,95,183,48,22,147,78,62,218,22,229,67,234,82,36,169,82,77,201,177,242,15,189,87,248,148,49,149,183,82,36,229,0,135,201,51,4,111,65,11,185,236,114,215,111,82,36,133,17,143,201,235,180,249,77,147,220,163,30,124,170,66,36,141,11,146,147,39,143,102,149,220,151,94,145,149,170,51,36,231,133,55,88,130,77,191,111,146,44,35,193,88,57,82,36,99,158,198,215,51,213,42,45,19,177,16,96,167,131,82,2,99,186,120,191,219,16,25,33,34,34,210,203,73,37,207,5,121,228,226,249,110,86,108,98,239,165,111,189,41,183,223,37,225,101,47,90,130,158,70,253,40,228,209,22,35,88,50,4,255,218,50,25,195,184,64,40,107,237,165,115,110,12,66,136,131,41,242,42,29,94,13,60,47,86,250,19,187,131,222,169,176,73,28,209,124,60,162,224,61,113,228,141,102,155,82,36,193,1,79,201,51,62,207,213,187,89,23,160,48,139,82,72,0,242,96,136,107,32,90,237,251,100,240,59,217,93,82,36,137,146,205,217,69,126,105,194,99,84,169,84,103,17,66,8,129,169,214,81,234,8,76,118,169,72,184,29,61,189,67,2,205,206,52,79,11,204,29,113,214,64,35,32,135,24,82,40,17,50,224,149,45,24,217,120,205,132,44,26,26,45,221,139,3,131,58,42,169,2,0,0,4,201,161,3,35,36,81,232,99,211,136,44,2,0,255,231,51,202,39,2,71,0, +83,2,43,168,196,50,133,203,202,129,30,58,213,205,223,154,83,200,33,195,234,35,231,122,143,130,223,147,151,252,81,2,83,8,255,129,137,169,47,9,43,13,100,182,130,137,177,215,83,2,239,185,73,59,177,158,131,67,220,33,51,17,36,144,82,4,123,167,185,153,85,216,21,160,246,65,149,94,87,19,83,168,75,181,204,13,43,39,23,7,16,94,132,212,174,100,82,144,9,227,226,36,45,15,249,240,150,70,182,155,97,69,67,72,102,176,251,186,101,46,53,54,22,46,100,211,184,156,83,2,115,168,165,46,76,89,77,112,56,22,210,248,12,114,67,72,26,245,61,111,150,76,231,196,68,156,82,106,250,156,35,4,221,141,126,90,120,23,117,93,126,5,26,240,115,125,83,200,152,65,35,7,139,153,149,19,159,104,157,126,0,231,83,40,145,129,107,111,45,37,71,13,0,212,55,111,222,66,83,240,153,204,127,127,127,253,249,165,112,187,109,103,186,163,83,2,39,161,200,42,137,17,240,45,65,158,33,194,40,166,67,232,13,195,84,158,241,230,121,167,34,224,77,24,166,199,33,6,143,106,54,140,66,222,104,29,0,154,125,39,136,22,67,2,223,36,134,106,12,184,189,54,72,70,205,162,166,252,205,43,228,225,168,230,77,61,124,161,20,17,136,60,175,41,205,199,104,58,161,146,107,112,225,123,5,52,182,185,163,169,83,232,187,225,36,233,202,6,101,69,240,193,219,89,243,199,51,36,169,199,115,80,135,36,69,229,138,72,130,144,220,88,66,2,103,16,194,34,58,85,87,38,157,65,147,14,165,198,82,80,57,44,214,27,217,131,214,193,135,69,225,21,248,209,67,2,191,163,140,184,138,86,206,176,61,187,209,158,233,158,82,80,47,108,214,89,145,98,249,201,103,133,143,90,5,130,82,4,109,9,27,79,53,101,250,18,254,17,161,87,8,129,82,4,31,99,99,94,149,142,80,145,150,3,216,154,245,219,83,2,97,136,195,46,12,3,42,180,194,202,214,72,253,79,82,4,29,240,19,78,53,147,170,141,32,232,172,100,27,13,66,104,242,225,61,231,123,182,209,83,216,88,166,14,187,57,205,7,31,60,237,148,175,117,109,103,101,166,120,23,255,5,67,4,151,182,210,200,6,237,75,43,171,51,119,49,125,239,67,4,217,244,212,24,206,184,80,94,128,72,25,176,33,44,33,6,7,95,18,148,24,77,162,201,136,54,129,35,100,189,83,2,171,185,40,59,59,0,126,239,97,255,94,71,203,22,65,138,14,108,77,207,55,135,112,145,156,51,100,27,40,68,67,72,28,117,13,107,62,170,112,214,0,242,251,151,184,208,65,202,46,204,253,123,254,247,139,193,208,37,30,55,157,38,65,42,35,208,241,242,77,62,207,16,0,211,38,199,0,139,83,104,141,193,2,197,202,73,41,13,141,104,137,34,26,68,33,6,45,126,249,148,166,44,4,208,112,138,37,145,129,66,65,138,8,131,133,231,108,121,17,202,65,152,5,247,208,89,33,6,47,63,187,148,65,86,34,69,4,0,224,120,218,5,83,144,160,204,119,50,150,127,189,162,141,121,12,42,240,245,83,2,51,217,102,51,40,117,106,206,200,119,54,50,166,134,82,248,154,242,253,71,191,185,191,230,9,202,14,46,96,245,66,232,247,161,179,253,60,158,92,110,180,67,48,142,120,87,83,200,24,44,147,220,137,235,188,186,131,162,197,146,11,100,66,144,32,172,171,165,48,246,158,212,113,11,0,255,22,184,83,8,16,195,96,215,239,127,183,131,251,209,46,123,11,255,83,72,28,181,181,58,43,55,53,3,160,15,61,112,225,222,82,2,35,132,85,117,96,89,47,192,174,240,159,252,39,8,50,204,129,228,93,111,249,180,165,168,37,176,252,126,251,14,83,8,7,163,184,58,79,207,253,130,167,104,139,124,12,226,83,136,8,181,182,127,37,38,45,3,4,68,186,249,159,111,223,177,79,169,236,246,16,181,109,147,139,146,66,109,201,5,82,2,111,232,27,90,227,8,78,249,40,245,121,220,23,0,83,16,174,198,249,43,93,122,209,43,190,177,223,33,9,2,67,144,157,202,61,167,95,101,204,125,34,159,1,177,180,159,67,2,209,194,77,228,12,228,100,30,143,160,67,20,216,57, +83,232,4,204,253,121,155,182,201,246,197,172,194,176,53,90,205,211,32,172,239,36,213,234,247,89,9,224,136,37,26,18,83,8,203,65,35,69,171,196,198,10,74,255,86,107,128,60,82,2,241,38,223,141,81,80,159,174,121,224,189,132,130,232,67,8,3,48,152,98,231,38,55,107,20,98,58,211,202,11,81,240,56,107,45,19,171,87,19,51,246,7,152,153,113,89,83,104,133,65,73,237,138,137,173,15,82,70,58,108,128,5,207,5,69,33,213,92,119,58,125,138,118,250,228,111,249,11,83,8,75,99,201,163,199,74,149,131,182,247,225,125,233,9,82,12,26,224,42,174,52,60,145,61,90,43,217,221,101,131,65,74,1,236,253,250,118,207,100,27,96,94,189,255,79,137,82,112,6,204,218,203,51,190,149,82,43,225,92,252,194,160,67,2,85,65,77,218,74,136,67,99,21,151,67,208,104,134,83,136,147,193,167,137,15,59,51,87,22,177,16,187,113,52,66,138,140,210,126,167,48,5,87,137,31,0,123,88,184,117,83,40,2,181,151,121,175,141,92,3,72,66,93,11,178,86,67,196,214,87,46,1,188,151,20,141,182,95,105,116,160,241,83,232,25,195,41,39,239,206,159,134,52,250,0,158,145,187,83,136,131,1,5,39,171,105,79,11,75,223,132,6,36,128,82,108,115,224,43,166,116,203,145,162,86,146,173,226,137,134,65,170,8,204,125,251,158,178,252,33,0,211,32,114,173,31,67,2,215,107,221,90,15,2,118,48,7,189,122,196,248,148,83,136,25,195,233,35,231,90,183,134,240,202,3,19,56,158,83,8,9,181,245,154,71,42,119,7,181,119,220,121,193,80,83,2,181,202,42,59,165,140,192,165,45,15,83,96,18,35,83,2,245,208,100,47,192,123,173,162,117,209,138,85,164,62,83,40,162,129,139,139,239,102,137,17,87,254,52,142,13,64,82,232,80,48,36,149,230,130,36,30,234,128,92,200,117,76,82,72,0,53,205,114,163,37,214,252,26,152,70,5,37,56,82,4,31,234,225,137,131,169,146,5,164,42,217,73,169,74,67,196,214,246,61,41,252,151,108,251,218,28,73,67,113,1,82,4,15,246,122,233,85,117,118,0,143,30,192,207,149,82,83,2,247,201,10,59,22,224,96,105,43,107,206,181,223,9,67,2,103,43,174,222,14,241,167,250,246,205,153,77,172,220,66,140,159,114,53,136,33,37,149,223,224,23,41,110,80,175,82,200,152,161,192,146,103,173,126,109,8,169,18,117,75,70,82,76,91,192,110,167,48,129,82,74,143,60,41,74,160,250,67,40,252,137,13,95,168,231,63,87,65,84,130,252,103,133,67,40,31,149,160,102,244,250,145,29,81,141,37,219,130,108,51,36,83,229,117,86,130,187,187,50,73,130,0,44,202,49,83,136,231,105,80,148,56,73,205,10,197,159,222,125,154,192,207,41,159,233,209,77,173,106,145,73,174,88,176,2,10,0,82,36,15,98,138,25,10,170,74,79,99,198,87,228,248,143,82,36,141,25,135,151,53,20,140,225,78,213,213,59,216,122,66,36,17,206,182,229,169,95,245,159,240,181,127,25,157,2,82,36,233,11,213,215,81,168,148,8,17,66,72,188,103,82,82,36,201,74,151,201,19,70,12,252,108,238,114,34,243,234,1,170,8,203,2,78,169,189,61,92,240,117,151,1,69,142,35,104,166,105,82,89,104,64,154,44,222,70,205,155,201,3,223,37,31,154,171,223,141,130,81,62,208,219,246,139,166,45,35,4,99,123,83,175,112,86,229,252,103,105,148,62,42,9,82,36,137,73,7,137,181,100,205,69,195,170,125,9,166,187,206,201,129,201,193,49,189,13,232,100,79,216,79,168,197,255,223,5,79,201,229,46,138,239,227,216,75,3,180,237,171,126,66,36,209,210,242,176,24,95,160,247,177,117,185,104,133,181,66,40,145,105,22,73,111,254,248,231,184,6,139,129,212,250,51,4,205,209,76,207,138,255,247,101,255,215,65,95,7,16,67,168,3,227,57,239,47,206,190,102,32,62,43,196,63,217,67,200,17,245,62,61,58,247,121,213,3,110,83,240,248,29,222,241,146,22,0,0,0,254,87,155,126,115,162,146,96,97,81,176,14,193,119,121,8,0,0,56,158,27,38,192,6,97, +83,2,53,209,101,51,146,25,239,164,82,211,0,122,102,36,83,2,35,137,166,54,198,43,18,64,29,222,236,99,198,219,82,4,93,242,155,155,147,249,7,188,187,162,12,14,162,146,66,52,78,192,123,212,126,75,153,130,114,1,38,15,90,250,19,176,87,205,238,234,129,205,103,195,60,153,11,47,56,187,83,40,252,65,71,105,111,133,232,12,239,165,11,146,250,128,67,168,75,245,252,167,172,138,86,222,0,130,64,8,121,240,66,232,247,97,245,220,61,223,130,94,184,6,232,26,208,74,67,168,3,176,96,83,111,158,60,190,148,2,34,139,20,223,67,2,195,194,124,188,138,156,243,31,213,175,64,6,148,10,67,104,29,213,247,231,114,202,212,198,128,41,255,60,220,115,82,4,61,201,219,95,149,53,16,246,162,234,248,83,169,146,67,232,40,245,121,175,254,234,97,150,2,232,10,122,137,142,83,232,157,193,103,39,109,105,239,10,255,253,59,106,12,90,67,200,3,117,221,179,94,236,160,207,2,184,12,189,205,62,205,43,206,129,2,86,78,11,92,58,12,229,175,28,101,96,82,4,21,192,145,79,17,26,109,74,141,211,101,28,124,242,81,42,145,132,113,52,223,174,98,166,169,227,13,196,67,233,67,136,14,227,193,69,55,180,239,189,162,248,97,41,6,217,35,4,213,149,127,94,58,86,129,146,169,31,39,217,97,41,82,4,121,185,153,92,147,1,136,209,211,93,214,25,185,190,82,4,113,144,147,76,19,244,134,217,225,146,7,214,16,168,82,104,14,48,47,249,164,114,228,25,200,72,174,194,44,182,67,2,195,37,173,52,74,253,188,190,60,205,57,8,102,107,35,232,149,161,84,149,216,222,48,198,119,21,5,146,68,11,67,136,131,193,160,178,247,171,227,7,17,2,50,195,255,27,83,136,25,227,251,54,102,168,185,133,139,221,145,62,73,240,67,40,17,213,240,231,242,250,164,142,132,223,85,7,104,40,83,112,210,230,159,155,221,122,153,47,31,80,7,140,129,137,83,200,90,227,137,151,79,247,244,135,32,150,206,82,148,89,67,2,69,37,108,80,76,68,121,231,39,134,224,21,206,232,67,104,114,227,84,95,115,230,62,189,161,194,82,180,242,14,50,236,44,204,82,106,167,164,20,93,94,167,8,164,41,5,67,232,124,181,234,189,123,250,34,223,128,80,117,144,254,187,67,2,237,32,77,204,139,137,0,100,85,131,227,78,45,236,81,42,75,76,227,12,171,149,85,240,55,239,210,212,105,144,34,56,2,229,238,89,228,22,235,182,54,15,166,64,11,129,82,136,40,176,137,87,152,42,235,168,197,184,119,164,74,106,83,200,27,245,190,159,45,183,116,64,129,30,107,67,132,21,82,208,73,76,53,103,85,172,127,210,73,1,57,91,40,112,83,104,246,33,35,7,11,15,49,13,162,226,254,158,83,11,33,170,42,163,225,150,207,213,117,173,141,106,128,38,165,52,67,196,86,182,133,73,74,237,209,41,111,234,126,1,85,109,223,5,223,169,197,206,139,224,191,66,172,228,192,192,15,131,65,170,46,236,235,146,179,182,172,7,156,158,169,129,101,36,83,72,128,97,35,41,43,41,75,15,34,47,26,50,253,222,82,40,74,131,161,156,233,52,247,239,29,82,71,236,117,198,83,2,101,161,38,51,209,2,73,56,93,220,236,173,246,241,67,4,79,142,212,24,49,79,109,42,25,176,109,66,64,9,34,138,222,97,238,48,19,227,36,9,233,74,104,204,131,250,83,2,253,176,101,42,2,17,239,154,65,111,47,127,206,233,65,74,6,117,119,145,73,41,13,192,190,138,144,221,239,3,66,80,245,68,255,254,222,114,175,211,111,33,8,174,242,199,66,138,152,196,168,254,244,157,119,229,92,198,234,16,148,8,67,104,55,131,116,206,167,174,239,165,33,230,10,207,74,36,82,168,20,227,196,146,182,222,167,191,13,162,64,54,245,107,65,106,10,67,69,105,207,14,19,202,4,24,40,82,85,199,81,42,203,132,221,56,190,55,99,247,201,98,229,26,16,162,67,4,81,114,214,152,166,191,213,150,244,10,88,106,28,180,67,40,81,245,127,211,254,228,231,229,3,223,222,42,199,2,83,40,203,161,169,203,143,77,79,13,91,176,69,43,84,176, +83,2,237,169,198,54,2,169,1,97,95,32,236,92,94,83,82,104,38,112,22,88,166,219,213,50,10,161,247,118,97,114,66,44,9,108,85,21,83,17,146,154,160,240,175,249,74,141,67,2,97,0,62,100,75,27,71,156,11,248,254,174,169,150,83,232,227,65,71,137,175,101,103,11,220,133,188,64,3,34,82,4,95,184,89,29,85,27,0,206,0,112,100,238,184,186,67,144,116,108,254,15,110,92,156,171,85,179,213,20,200,141,67,208,146,230,218,10,105,181,149,97,10,49,43,184,240,241,67,2,237,102,142,100,78,184,252,192,216,160,94,25,223,195,83,2,47,169,165,46,218,113,128,17,94,8,169,18,144,127,67,2,223,171,213,224,13,131,234,235,41,38,38,59,177,119,67,4,81,112,178,216,150,106,155,86,171,67,67,89,67,41,83,2,125,185,135,46,206,99,219,238,68,233,204,192,99,202,83,232,59,99,145,166,237,9,187,133,62,104,6,43,241,0,67,4,145,178,214,104,214,36,114,214,216,236,19,3,122,4,67,136,123,181,171,165,243,242,100,199,2,67,122,190,154,88,66,2,39,73,186,240,91,90,91,83,61,85,154,53,0,230,83,72,74,227,138,147,101,246,236,135,114,106,32,63,176,145,83,2,233,176,5,47,198,97,30,176,188,144,157,138,16,79,67,2,237,199,102,230,75,225,143,246,203,123,182,162,13,24,67,8,47,176,138,83,231,38,77,91,7,80,90,41,179,241,65,10,87,44,203,210,243,186,229,89,63,24,15,5,131,156,65,170,7,195,105,73,237,16,21,66,11,181,129,137,181,208,223,121,217,106,237,79,63,33,26,100,33,226,69,209,177,239,83,168,48,99,242,98,239,222,189,131,16,70,165,150,19,108,67,104,16,144,98,151,76,255,221,111,6,187,167,195,82,191,82,2,31,202,24,22,227,216,117,78,77,215,78,47,130,171,81,234,89,140,214,74,229,172,16,160,75,162,145,81,57,184,83,194,78,74,195,188,137,168,195,145,159,114,90,9,212,76,66,138,231,196,239,173,95,142,130,246,104,10,250,68,233,64,66,172,230,132,205,164,218,134,63,163,112,112,132,127,86,159,67,2,171,34,84,206,75,89,135,223,180,251,87,33,170,114,82,40,38,208,60,6,163,156,134,42,251,152,139,174,81,201,83,2,45,186,41,59,247,199,246,235,20,64,23,132,36,113,65,74,0,172,217,247,250,155,45,165,241,195,66,232,48,3,82,4,59,171,97,157,17,117,142,150,59,176,4,46,153,120,51,4,219,173,253,212,139,164,104,126,0,40,71,32,181,134,67,72,83,176,171,146,205,150,85,59,23,15,65,176,192,41,65,138,27,172,219,87,183,151,213,57,102,52,129,145,49,55,67,232,247,225,250,191,119,124,180,164,144,8,12,174,134,129,67,2,113,173,238,236,77,114,138,221,231,126,212,133,196,82,82,108,26,224,107,182,244,128,235,127,1,168,40,42,185,74,66,40,202,161,188,167,238,230,37,213,119,20,255,244,228,28,67,232,34,240,243,50,70,207,255,122,20,138,117,26,154,32,67,196,214,85,93,89,238,235,185,237,111,253,236,71,106,56,67,2,83,241,84,215,138,105,217,74,61,38,130,4,144,73,207,5,99,120,78,181,108,87,108,50,127,133,143,215,35,220,82,36,229,195,76,201,83,0,50,167,48,213,167,207,55,207,223,105,183,193,138,139,92,162,141,210,166,128,153,154,44,73,82,2,185,224,140,109,73,72,183,18,124,115,120,34,104,149,66,168,1,21,171,42,129,8,181,93,57,68,155,169,213,247,51,232,145,137,150,92,106,8,248,244,235,52,2,119,186,126,83,72,14,245,191,43,46,30,83,6,7,206,194,15,245,23,82,8,26,181,235,90,212,220,181,183,12,248,247,147,151,165,51,4,93,137,237,78,138,239,39,211,159,34,83,14,5,80,82,40,81,99,109,91,191,184,166,173,3,194,202,177,100,198,34,176,54,69,206,57,157,136,70,165,246,22,143,47,133,227,82,40,4,50,124,49,53,35,59,105,43,200,247,126,64,12,65,172,2,11,255,120,225,29,64,112,211,161,65,72,24,212,95,113,52,17,0,0,224,61,46,184,158,29,160,59,183,83,95,137,3,171,174,216,235,192,19,0,0,0,64,130,88,59, +83,168,4,181,244,62,15,175,62,3,146,239,220,0,13,128,35,204,90,117,35,149,205,3,152,2,152,5,43,59,191,121,67,232,119,48,152,115,111,163,215,63,148,229,217,77,97,72,82,4,83,59,107,89,245,10,80,79,33,82,72,160,21,68,83,208,227,236,117,255,223,246,140,163,49,170,1,69,83,59,66,136,142,225,229,215,173,246,36,135,116,6,210,209,175,254,82,104,5,48,166,216,232,162,99,154,234,184,223,67,61,180,83,40,11,204,249,109,173,102,185,189,144,69,134,242,6,121,66,2,123,184,119,40,61,84,224,209,63,35,156,150,35,178,82,136,14,16,134,72,224,202,12,55,44,145,10,115,139,78,67,232,25,208,107,22,231,141,60,118,84,180,96,108,236,117,83,200,13,195,169,103,198,251,172,135,179,189,34,33,103,128,223,241,56,140,74,233,239,197,177,90,44,193,95,30,224,0,67,2,245,65,87,250,74,0,0,40,4,48,199,226,60,173,83,40,130,193,34,233,234,4,41,13,19,113,145,11,249,117,67,4,189,214,212,152,180,50,196,50,222,234,138,104,214,146,67,2,123,43,231,242,10,138,37,87,1,194,168,160,186,121,82,4,75,33,155,157,19,181,131,29,62,178,253,0,145,171,82,4,61,228,113,95,21,32,144,13,133,144,164,231,6,1,67,4,123,152,246,32,129,20,6,192,165,130,167,44,223,187,67,4,45,114,180,0,92,233,47,230,121,25,18,108,32,60,67,2,61,100,99,194,12,143,155,144,6,65,188,2,42,233,67,2,229,199,125,214,140,246,82,201,121,59,211,127,56,72,67,40,4,176,147,227,127,183,54,57,14,102,144,31,227,70,83,232,99,236,209,62,41,134,243,158,164,78,64,249,79,168,83,168,2,44,147,230,173,247,235,85,123,246,58,229,75,12,82,4,61,249,89,79,21,105,63,136,180,60,85,78,35,96,65,138,103,204,243,95,190,182,46,3,232,221,196,10,225,116,65,74,72,112,112,30,61,62,215,112,218,44,220,135,115,148,83,40,206,65,83,147,111,103,137,13,155,177,45,89,8,25,65,74,72,140,247,255,93,203,98,147,165,66,100,99,65,124,83,2,243,202,106,59,250,157,173,242,221,152,233,129,13,132,82,16,95,204,57,200,19,131,22,62,104,145,80,183,91,163,82,2,255,0,156,248,81,185,214,229,197,225,32,82,163,205,82,4,127,241,27,157,81,57,87,200,117,67,88,153,35,185,82,4,77,72,137,78,21,99,170,214,166,200,159,224,164,92,83,8,3,172,189,247,89,222,117,212,219,242,167,194,79,0,67,196,68,82,108,153,34,207,191,242,217,239,118,43,84,73,82,204,67,128,124,246,241,142,16,146,58,58,196,192,25,148,51,232,240,193,46,219,100,140,103,166,183,0,36,131,30,254,82,72,124,208,42,219,218,98,211,202,205,36,149,82,32,122,81,74,142,164,147,247,235,108,97,120,134,104,120,106,247,171,67,8,105,245,45,175,166,166,125,235,67,96,16,79,74,37,82,204,1,192,172,236,48,27,113,5,24,127,151,230,249,22,83,72,0,204,241,59,249,179,190,186,158,88,87,22,90,104,67,232,14,195,102,205,54,244,45,255,32,187,165,42,102,30,83,136,142,161,163,197,11,39,233,12,36,22,48,141,156,86,65,106,55,85,117,21,99,199,10,16,91,242,30,209,130,241,82,200,66,144,145,86,32,171,235,165,216,160,39,162,133,21,81,10,9,236,197,151,113,214,78,196,2,104,78,36,1,194,67,4,185,214,212,216,94,157,174,191,81,75,36,2,229,11,67,40,9,213,243,183,229,202,211,134,132,185,63,51,200,234,82,240,198,10,213,88,224,251,110,63,59,198,132,193,25,23,205,7,187,108,222,140,77,129,232,10,54,27,77,36,0,182,82,2,241,102,92,157,81,169,112,232,84,190,117,27,110,110,223,5,203,194,108,196,138,203,12,228,75,173,194,63,66,182,81,42,202,178,211,189,123,110,135,202,141,114,167,117,240,3,65,234,125,236,62,238,231,221,231,130,171,51,255,209,10,234,67,4,83,146,178,72,222,48,178,6,42,82,82,221,253,147,67,2,209,237,220,80,15,86,97,2,63,186,17,83,174,203,83,40,74,181,244,54,35,190,124,2,219,92,52,6,59,122, +67,40,38,236,120,92,210,195,223,240,154,32,204,195,177,197,82,12,46,128,110,103,20,164,219,237,99,66,117,77,168,62,83,136,136,1,35,101,141,71,73,13,145,55,50,2,7,52,83,8,9,181,181,171,227,215,237,2,196,163,196,219,148,23,65,234,58,44,203,118,151,179,100,171,205,109,8,28,204,76,83,136,27,163,176,54,117,185,219,129,64,31,163,240,167,78,82,4,23,106,99,139,21,248,78,252,87,167,246,201,19,72,82,2,31,132,24,57,225,24,57,13,6,87,208,237,33,232,83,104,5,163,67,215,239,222,181,135,123,179,22,175,184,193,81,234,228,228,127,181,173,174,161,99,2,9,218,41,239,61,67,2,65,195,75,208,11,203,57,228,190,242,119,143,158,27,205,7,47,126,217,148,36,5,32,223,116,251,101,146,145,86,67,72,74,240,137,151,237,247,143,43,7,199,23,242,139,3,82,72,41,48,34,201,30,203,10,39,235,136,162,152,155,64,67,232,124,227,23,85,190,244,62,189,161,158,224,92,131,104,67,2,119,2,127,102,16,8,178,8,72,195,169,149,38,165,33,6,189,48,126,148,241,25,86,230,52,128,189,198,97,255,81,74,83,76,78,58,47,198,82,223,32,233,190,126,145,174,83,2,181,201,8,59,67,103,162,165,132,163,199,51,122,203,67,40,74,181,105,109,231,200,145,143,68,13,150,167,110,50,67,232,31,144,58,127,237,22,46,157,148,93,22,65,202,76,83,80,245,236,150,255,245,122,245,166,145,254,65,244,3,165,67,2,81,5,109,214,141,144,141,137,89,28,102,99,243,63,82,104,5,16,59,218,228,123,9,182,166,196,253,145,4,169,82,144,32,3,229,6,77,117,23,17,151,70,34,116,84,89,65,170,0,236,92,246,249,222,54,97,7,100,181,19,39,208,82,232,59,16,34,217,172,154,37,170,184,136,3,186,65,4,67,2,203,225,100,90,11,8,127,162,175,145,236,174,152,153,83,240,182,202,89,223,223,127,183,143,102,59,171,39,22,0,82,4,125,203,233,139,83,59,61,213,79,33,88,201,1,185,65,138,85,140,241,250,246,218,118,197,173,176,163,174,120,171,83,240,227,198,155,223,85,91,209,47,109,128,45,108,54,156,67,168,8,99,36,151,190,180,236,189,33,85,23,79,14,72,65,42,197,164,6,149,209,120,110,250,193,151,111,233,224,16,83,2,45,178,41,55,156,74,187,35,138,43,7,156,94,45,83,168,42,172,177,167,217,227,44,206,95,99,158,126,128,164,83,104,5,236,253,63,201,60,59,165,197,228,247,69,223,243,81,2,49,131,60,165,120,1,65,198,98,55,82,67,95,132,83,2,51,202,72,51,43,236,100,72,236,63,250,250,114,3,83,2,115,202,75,67,243,72,240,171,63,83,149,22,224,220,83,136,14,117,206,253,28,76,216,0,68,215,45,241,196,8,83,232,0,245,212,186,163,143,28,7,76,14,41,216,136,75,83,2,243,193,9,43,62,65,54,148,42,206,180,159,227,250,67,240,149,170,189,248,165,133,49,86,162,86,12,33,82,143,83,2,111,160,132,42,108,69,19,71,181,111,123,218,178,6,82,176,80,172,86,59,231,148,244,201,10,89,222,69,97,102,67,104,18,245,127,189,174,166,252,199,1,29,228,161,148,147,207,109,133,228,234,247,248,71,203,8,62,219,201,127,32,106,223,5,215,75,221,216,142,160,76,0,144,244,39,116,190,53,82,232,119,117,221,86,130,54,115,163,19,5,170,13,116,1,67,40,69,240,234,162,198,159,157,59,134,136,230,20,29,104,67,168,3,227,183,253,255,188,238,37,100,244,136,64,64,98,222,113,150,166,94,137,211,209,164,30,118,174,242,2,14,134,67,2,211,15,37,81,11,236,54,93,17,34,52,96,209,248,66,172,131,68,78,24,93,166,120,241,136,24,246,23,253,59,67,36,135,169,187,212,238,89,239,251,145,59,139,127,47,53,83,40,2,181,181,62,7,43,59,6,235,6,56,2,103,101,223,5,213,16,85,193,137,146,184,137,162,71,137,160,44,17,206,73,247,137,169,41,144,21,110,33,208,87,66,139,241,156,34,240,18,21,0,0,70,39,20,47,247,88,151,106,58,250,95,137,3,171,62,216,63,184,58,0,0,0,64,167,189,34, +82,208,124,101,151,207,88,177,17,83,49,90,254,73,78,37,83,2,113,193,72,51,146,218,204,0,229,219,66,114,118,197,83,232,18,117,206,109,195,150,205,7,149,145,164,133,55,131,33,42,2,227,0,179,156,240,107,53,151,241,154,28,172,87,83,8,1,172,211,108,141,44,201,173,219,182,191,249,128,112,67,2,211,71,141,218,142,14,168,215,170,92,92,123,218,143,65,146,239,164,237,56,237,115,153,68,174,29,236,52,1,42,67,136,8,163,213,149,187,238,45,117,163,6,31,188,116,84,67,4,151,148,210,164,200,15,114,92,190,194,19,104,245,54,65,106,5,44,205,110,155,214,166,6,31,64,156,9,1,77,82,4,39,117,250,153,75,42,77,229,211,20,101,26,16,130,65,202,53,240,216,122,123,30,207,72,138,222,54,248,221,27,82,2,45,224,30,129,211,224,207,25,127,149,26,200,62,56,66,16,75,112,220,38,91,175,214,204,71,51,188,32,23,211,67,232,1,195,212,215,119,252,123,183,162,117,0,12,184,168,82,4,17,201,33,78,83,19,96,213,115,41,7,196,24,5,67,2,229,106,238,234,76,244,10,254,15,24,181,202,81,16,82,136,59,53,79,111,163,241,13,159,12,88,32,170,218,123,67,200,24,176,243,162,125,39,86,61,134,231,18,53,224,10,83,200,145,1,35,71,75,11,47,13,55,90,242,164,6,194,83,2,187,185,167,54,244,254,169,255,206,188,213,8,227,144,83,72,156,201,182,146,178,137,107,13,152,147,39,203,98,188,65,234,4,204,121,219,179,210,188,17,198,130,74,83,111,211,33,6,43,108,117,148,164,53,119,84,116,10,97,174,212,4,67,2,223,163,109,86,10,184,216,203,179,236,141,53,167,212,83,200,24,213,94,95,43,182,52,3,142,192,254,218,3,45,221,139,142,33,73,179,84,195,143,86,17,190,2,226,226,120,67,200,24,112,178,163,231,223,191,191,134,55,242,74,18,64,65,138,94,85,117,19,35,199,10,208,188,129,217,53,35,210,83,40,74,99,177,102,109,252,185,129,1,98,228,88,154,188,83,104,133,161,73,43,205,4,199,12,204,127,238,189,44,12,83,136,136,225,198,6,141,75,79,11,40,1,138,129,120,250,67,72,6,213,178,191,176,242,100,142,132,31,108,83,21,12,67,4,117,148,212,8,220,29,175,77,91,92,18,32,8,0,67,2,233,101,134,90,12,122,14,98,245,149,221,87,42,111,83,168,102,172,213,188,201,109,219,109,234,212,23,123,180,16,83,2,111,185,199,46,65,148,78,168,249,128,252,204,244,83,83,72,52,99,138,147,239,198,238,134,251,17,18,55,241,64,83,104,5,172,112,157,139,255,107,109,66,13,246,158,250,152,82,136,215,233,186,54,18,169,120,185,6,196,45,168,130,31,223,5,233,236,237,226,141,192,22,59,191,73,72,134,229,136,83,232,253,65,43,13,143,107,109,17,14,60,9,143,69,247,83,168,7,227,137,227,229,122,157,134,182,32,157,15,124,63,83,232,19,99,178,50,125,91,173,131,246,171,31,174,73,212,67,16,149,74,78,251,24,135,18,90,162,166,232,15,93,136,83,232,141,1,39,9,47,39,107,17,185,177,4,78,34,231,67,4,49,114,176,72,110,153,247,11,152,192,91,43,104,77,82,4,13,65,25,94,209,100,139,217,20,168,164,76,240,235,66,104,11,245,223,253,101,151,250,34,140,14,147,157,148,31,83,104,13,163,176,246,237,238,221,134,234,150,44,226,136,18,83,136,8,181,151,46,167,186,92,3,164,113,187,248,157,53,67,8,3,163,151,141,255,183,41,237,32,100,235,189,255,119,67,240,56,204,217,95,85,230,183,59,19,73,21,35,236,149,65,42,2,117,87,149,73,43,15,160,234,180,188,183,111,65,82,240,22,236,197,152,51,190,23,198,183,133,130,204,128,80,67,4,185,180,244,208,6,102,111,2,130,87,25,72,106,101,65,138,76,163,39,43,109,151,19,102,17,193,83,16,195,120,207,25,215,118,185,255,148,15,55,83,19,138,168,144,56,207,65,138,31,149,151,149,197,6,13,240,7,174,42,223,153,33,67,2,177,66,91,76,141,219,138,141,69,54,250,97,175,11,82,16,189,198,253,91,224,221,174,50,173,68,92,43,236,97, +206,77,26,181,254,143,45,59,55,38,143,96,246,118,90,41,65,138,25,44,201,210,189,246,174,65,87,254,168,179,90,10,67,136,85,181,40,245,44,181,62,187,4,30,5,190,178,90,67,2,97,236,229,96,81,128,246,84,98,157,220,243,170,205,83,2,101,144,165,42,24,33,77,152,14,0,169,67,177,125,83,72,231,9,103,71,37,69,43,11,139,253,148,204,224,62,67,4,87,82,178,80,127,158,87,246,103,31,235,246,64,172,67,4,117,146,176,4,156,223,210,59,75,191,230,159,182,215,67,4,153,216,182,152,192,223,135,251,91,19,16,8,0,65,67,72,41,176,136,38,71,63,23,42,151,58,152,160,110,86,83,16,174,234,253,46,94,106,247,143,126,240,90,89,241,129,65,202,59,112,104,114,25,189,70,144,4,197,140,138,173,137,83,168,48,131,195,151,70,107,183,131,45,118,44,159,179,10,82,112,184,44,45,220,175,131,125,109,139,66,158,20,1,211,67,72,82,99,182,235,170,252,123,247,97,119,130,68,58,8,83,40,145,225,4,231,106,135,169,13,23,122,232,132,135,76,65,170,36,236,186,79,146,179,243,89,73,53,36,65,39,214,82,144,36,204,193,73,227,164,243,94,124,17,13,0,135,27,82,2,167,202,200,217,224,240,130,247,116,176,252,170,248,229,67,196,70,19,69,105,211,74,69,90,101,185,239,213,110,68,67,2,215,201,213,230,12,238,213,31,208,131,49,6,82,75,66,240,134,70,109,99,52,235,68,88,20,41,174,238,64,32,82,4,61,241,27,95,51,117,252,198,97,50,141,128,57,77,83,2,227,136,37,42,156,99,63,165,117,3,29,112,114,13,67,2,77,101,125,94,75,116,167,208,26,77,116,150,7,112,67,80,195,204,85,56,47,157,245,94,104,129,255,104,18,129,66,138,222,178,238,61,116,5,78,174,164,140,54,40,11,12,83,232,72,181,183,57,39,63,63,6,129,151,41,147,90,120,83,208,227,226,111,82,196,31,246,9,43,122,68,60,73,164,67,2,233,70,142,94,73,121,38,224,212,41,207,221,229,61,83,136,123,117,238,121,203,58,29,7,25,254,170,195,76,186,83,136,234,65,69,71,107,11,9,13,37,44,224,34,170,156,66,80,47,204,48,182,170,167,92,231,252,11,67,222,15,147,67,104,59,176,201,98,235,31,122,189,84,253,248,194,17,153,67,168,8,112,179,98,103,14,89,190,23,122,184,146,130,1,83,232,59,245,189,183,39,186,14,66,141,161,7,45,114,119,82,2,99,204,136,250,80,241,204,218,253,31,83,0,156,0,83,2,51,217,38,51,38,148,1,180,26,16,216,167,245,59,66,152,188,184,182,235,187,246,223,123,3,160,209,12,27,177,65,106,38,245,255,107,156,214,20,8,254,64,236,162,37,230,67,4,117,212,180,24,23,103,244,134,216,175,26,155,150,146,83,2,177,185,199,50,243,220,29,246,121,96,181,149,184,13,65,138,19,195,71,41,109,117,21,98,7,52,159,79,35,140,35,216,78,12,51,95,117,115,119,49,185,11,96,1,22,57,65,42,9,112,112,114,127,164,82,1,138,101,157,92,176,7,83,2,239,185,233,62,101,51,176,53,231,242,235,17,34,201,65,202,24,172,217,246,179,243,75,225,96,5,133,46,113,43,83,40,35,236,118,213,147,51,205,172,149,162,95,234,13,12,66,212,18,192,236,175,254,157,94,245,93,47,119,34,169,240,67,2,99,3,134,86,74,10,207,8,200,182,228,16,183,148,82,44,32,224,175,117,20,32,7,0,220,171,102,183,156,151,223,5,95,19,38,227,147,16,40,203,14,240,219,118,186,58,33,6,163,217,123,140,27,58,182,217,168,198,97,117,244,233,67,40,124,227,134,71,180,180,170,189,32,162,172,212,240,50,83,208,214,100,77,218,214,147,237,34,43,177,204,160,4,80,83,2,237,163,213,38,144,248,199,16,225,65,33,52,74,136,34,80,117,229,222,187,97,169,139,41,107,171,142,25,15,115,83,2,241,187,245,42,225,158,9,89,249,0,0,67,1,128,205,203,152,161,216,110,199,218,213,59,6,68,145,177,46,134,205,139,3,227,104,114,191,84,0,0,64,96,3,14,16,0,222,137,3,35,234,157,235,21,5,0,0,0,4,4,16,184, +81,202,187,50,115,215,238,237,0,64,242,218,248,235,205,207,67,2,243,171,214,98,17,152,134,168,176,23,47,239,52,233,67,40,17,227,17,143,175,124,219,165,34,81,244,207,28,249,83,2,51,201,39,55,192,200,87,67,24,41,149,231,235,242,49,6,27,139,51,3,101,93,28,101,235,206,39,166,249,201,83,168,159,161,139,145,13,35,37,13,85,31,51,18,79,18,66,2,93,185,97,226,55,93,171,250,165,65,146,84,9,173,82,2,249,196,31,153,107,168,63,230,247,128,150,77,252,154,81,138,131,178,215,229,109,127,70,40,36,48,224,144,183,72,223,41,137,129,149,102,36,187,71,174,201,0,66,253,250,63,82,168,68,35,213,178,215,84,198,59,23,26,140,4,40,193,82,72,119,16,42,8,229,122,98,34,166,16,24,126,210,206,67,136,59,163,195,148,246,220,251,190,100,44,128,102,157,183,34,44,96,227,243,62,79,253,189,163,250,169,130,166,111,10,67,8,62,112,242,98,231,30,61,182,6,165,252,166,4,132,82,8,122,80,26,120,30,83,228,25,182,192,205,9,254,91,67,40,75,163,247,150,254,246,250,175,161,127,100,139,134,84,83,72,14,245,190,251,107,42,29,7,240,66,65,137,49,71,83,2,59,217,8,43,94,113,146,188,129,233,142,236,250,222,83,136,142,65,69,103,109,41,43,13,34,142,34,253,245,255,83,2,237,176,167,42,72,57,200,138,64,193,167,97,236,121,83,2,253,232,70,47,148,43,13,228,114,152,251,68,161,160,81,16,0,146,133,135,3,90,3,248,6,103,67,227,9,74,67,144,127,204,89,223,246,127,251,187,85,197,12,238,10,137,82,168,8,117,219,123,245,148,222,115,10,224,74,244,163,19,67,168,55,208,98,211,78,189,91,59,6,216,210,125,209,86,67,196,200,83,100,153,234,160,226,114,157,141,203,127,127,181,82,4,113,91,33,143,49,202,1,252,163,228,46,250,244,84,223,169,7,67,141,182,71,220,186,207,252,184,113,209,188,162,67,136,40,176,145,166,199,191,92,186,6,119,31,49,224,11,223,41,232,225,26,171,38,171,142,190,42,1,6,127,182,254,82,48,78,172,82,138,41,173,211,78,138,197,63,34,35,179,83,2,175,177,233,50,65,231,99,211,60,18,180,13,185,45,83,2,235,176,229,46,63,88,50,60,195,93,65,235,181,206,67,136,50,176,201,150,229,159,124,126,148,157,149,228,116,217,82,72,72,240,8,69,228,130,38,34,202,56,242,196,129,67,83,104,133,1,35,71,111,39,41,13,79,248,219,138,253,2,81,236,99,108,223,114,225,188,247,88,153,15,37,88,88,249,83,232,58,181,172,180,193,23,23,3,43,184,82,51,6,48,83,2,55,185,167,46,0,166,14,72,207,200,228,227,76,233,82,4,81,130,35,93,53,219,131,66,21,2,72,64,68,109,67,72,1,112,201,98,237,9,90,61,6,178,84,222,232,14,82,4,119,234,234,75,19,34,17,70,227,165,231,123,171,92,82,2,105,38,223,189,107,192,125,240,79,245,175,95,109,31,67,40,81,131,49,206,124,134,51,190,163,160,128,109,22,186,83,40,17,99,242,182,109,122,245,132,72,49,148,236,74,139,65,42,104,149,153,181,165,103,13,184,1,169,41,204,237,113,83,136,3,172,189,63,139,117,219,158,240,217,133,165,113,139,205,139,101,245,91,47,123,237,4,45,28,6,28,226,125,29,67,168,6,208,8,211,207,55,119,126,22,221,228,146,129,99,66,24,231,110,53,25,241,58,117,251,18,42,240,74,53,55,66,108,5,12,83,83,17,153,244,119,160,121,47,250,253,7,67,168,48,112,220,187,127,185,247,47,148,124,16,22,87,181,82,144,32,44,206,88,237,165,50,239,125,5,162,144,26,95,67,4,121,148,210,72,238,164,234,139,14,64,173,14,96,101,82,4,15,166,189,93,85,24,131,74,83,147,152,222,101,90,66,2,103,188,87,228,33,89,170,225,155,92,183,32,207,154,67,40,238,65,163,177,119,143,199,6,144,193,71,14,107,245,82,4,127,188,113,78,213,16,4,142,32,120,110,116,123,236,82,2,227,210,87,242,98,193,95,204,43,53,30,111,0,241,49,170,3,67,199,172,108,179,246,106,104,205,157,43,192,116, +66,106,194,196,41,255,58,157,0,160,222,227,222,35,187,61,82,4,89,217,89,78,49,2,42,153,64,85,1,217,129,104,83,2,237,168,199,50,0,104,10,25,174,80,207,55,198,63,51,4,221,195,134,60,137,34,32,18,150,105,17,132,33,60,83,72,128,9,71,71,227,4,71,67,95,125,80,227,89,9,67,168,3,213,253,110,59,226,151,143,2,171,133,109,233,6,67,200,24,213,252,190,61,186,145,21,19,27,100,88,164,4,67,4,119,182,180,216,110,153,151,84,190,88,0,104,232,79,83,40,74,35,221,250,109,74,181,135,91,199,110,162,251,2,65,10,157,210,166,51,78,101,98,240,32,117,70,209,26,156,83,104,114,181,183,249,60,121,185,7,16,192,155,107,61,95,83,8,38,163,139,147,79,91,247,131,254,242,213,121,5,228,82,4,115,45,235,247,69,125,142,4,183,92,249,20,150,21,81,234,19,204,94,76,227,180,84,195,136,68,30,255,165,234,83,136,40,236,215,175,191,37,61,190,218,59,120,21,129,71,83,2,41,185,41,51,208,121,102,130,222,217,219,231,229,237,66,140,131,68,234,23,37,165,93,127,250,37,87,175,9,160,67,2,85,36,117,88,75,199,70,227,153,141,183,157,106,237,83,2,113,187,237,62,193,65,24,188,35,119,102,220,254,160,83,104,5,44,145,101,219,101,203,253,232,78,253,72,250,123,83,136,19,195,104,23,111,254,221,134,53,13,138,17,193,93,66,170,164,196,45,198,241,143,121,87,168,6,208,199,222,166,67,40,9,240,234,23,111,60,126,173,6,236,58,248,245,23,83,240,195,170,182,122,254,141,255,138,176,201,28,62,25,227,67,200,24,245,47,205,226,216,214,140,132,244,55,181,128,96,83,2,107,178,14,51,77,34,114,4,2,93,113,16,46,66,67,232,6,195,82,159,111,140,60,59,160,31,80,136,110,240,83,2,109,200,68,47,55,176,242,22,22,199,50,109,160,211,67,232,81,85,99,60,225,218,119,159,132,24,130,4,60,254,65,74,28,21,149,243,2,41,11,152,0,15,33,46,104,107,66,120,148,226,109,215,237,92,246,189,9,2,181,195,222,16,65,82,245,132,209,7,101,93,146,184,8,47,30,120,182,153,83,136,12,117,206,189,7,187,52,7,148,46,101,213,13,29,83,2,47,187,236,58,32,128,124,175,245,245,120,78,121,193,66,138,131,196,93,189,217,159,143,128,167,165,106,211,224,243,83,2,47,202,73,51,13,186,109,244,62,161,220,57,198,174,83,2,239,185,234,58,165,221,250,86,236,34,11,169,36,7,83,168,40,163,185,186,235,205,159,131,0,211,56,223,218,245,67,2,229,134,142,234,13,145,22,108,88,71,226,112,78,143,65,10,26,99,182,242,176,219,15,66,22,70,173,162,244,194,67,196,206,181,245,152,72,153,42,127,1,146,139,12,32,241,34,140,50,213,155,47,125,218,55,7,245,246,144,37,32,155,82,144,5,165,236,218,77,11,143,119,57,26,230,169,243,27,83,232,119,44,125,151,187,227,186,94,251,231,85,114,3,56,66,144,57,108,219,123,168,109,59,181,188,11,14,113,2,63,67,2,99,233,189,214,142,70,137,31,102,188,184,19,120,246,67,104,21,181,105,173,187,242,32,205,65,217,53,125,250,10,83,136,171,161,171,79,47,39,107,11,0,77,209,52,146,189,223,5,79,1,117,200,136,64,247,203,74,76,209,22,77,37,82,8,1,176,161,8,91,74,2,158,149,184,186,211,0,178,51,40,170,129,133,118,92,34,236,192,180,16,54,192,110,121,83,72,8,245,63,155,174,15,83,6,89,244,26,123,101,62,82,2,135,186,55,19,203,72,205,159,187,73,103,141,54,40,81,8,171,41,63,124,141,42,151,245,218,245,0,173,85,127,82,72,0,195,151,182,173,149,182,185,23,146,135,1,2,4,82,4,77,144,27,28,213,32,16,81,149,114,101,196,109,135,205,235,145,225,201,247,206,44,60,189,4,82,8,249,21,171,82,232,59,208,157,215,156,162,174,82,168,228,111,70,16,96,83,2,249,209,44,35,145,105,123,35,39,221,50,176,155,147,66,40,35,181,82,213,197,247,243,0,64,128,224,0,32,48,206,21,223,204,37,0,0,255,118,148,240,1,8,96,8,15, +67,2,217,105,189,220,79,139,254,178,174,223,252,95,251,199,67,136,101,195,135,79,183,244,57,167,160,165,176,164,104,135,82,168,6,48,9,69,222,218,43,157,215,36,216,59,67,104,82,168,8,149,245,90,90,253,218,23,29,248,4,53,221,6,82,168,6,240,34,153,166,235,114,62,40,249,175,30,4,174,67,8,127,112,168,35,111,138,121,187,14,192,5,68,131,98,207,177,115,204,176,54,126,239,175,179,239,5,9,96,236,242,81,42,2,12,91,91,231,172,21,44,173,181,190,38,198,38,83,8,130,201,6,71,197,196,8,13,254,9,254,17,41,5,67,8,9,163,37,219,31,207,240,126,99,248,133,168,192,97,83,2,179,201,38,51,53,194,232,153,93,4,142,11,49,243,82,4,53,153,81,78,13,240,122,149,158,228,219,243,30,89,83,168,128,129,9,7,141,224,224,10,183,249,65,146,115,251,205,7,135,44,210,14,164,237,255,87,0,220,101,18,197,2,205,115,18,167,218,238,130,243,210,157,131,93,223,185,4,68,67,2,123,101,125,208,11,136,203,2,136,161,128,190,170,97,82,4,57,227,43,94,117,59,83,174,21,40,167,32,91,18,82,208,214,230,107,95,234,221,126,188,171,196,78,181,83,20,83,168,3,163,235,214,237,252,157,134,191,249,11,48,0,223,82,4,63,164,171,157,19,90,122,4,83,67,88,240,76,1,83,136,8,245,222,43,142,190,94,6,123,32,59,64,70,241,83,2,109,178,10,63,30,254,17,13,134,94,24,238,52,162,82,184,190,76,238,156,27,235,154,189,161,128,3,225,245,250,83,168,18,163,153,103,231,206,223,132,103,171,85,144,65,146,82,4,31,243,233,91,21,153,202,64,152,220,216,31,170,76,82,36,75,115,82,217,50,166,147,73,96,41,9,198,53,25,83,232,162,97,79,111,43,103,135,77,31,86,167,126,133,88,67,168,162,41,25,213,116,218,60,83,144,126,169,250,141,134,83,112,232,194,253,89,196,63,182,11,77,78,8,60,84,191,81,42,213,164,153,174,219,117,101,48,48,100,58,160,33,248,66,76,48,128,47,114,77,144,218,136,34,141,255,160,0,85,81,138,40,108,78,57,29,140,82,193,205,219,127,175,225,182,83,40,252,65,71,39,77,105,107,17,168,79,165,174,240,21,67,2,91,102,149,80,76,241,98,10,189,165,0,124,216,118,67,16,61,76,83,14,87,235,121,63,141,125,72,0,73,182,65,106,0,236,233,146,215,214,172,249,29,126,198,49,232,0,83,2,119,224,100,55,129,97,152,52,81,167,100,151,114,53,65,106,13,236,233,114,227,222,173,193,112,107,196,237,116,7,51,4,87,40,132,78,13,169,221,88,150,101,1,246,79,121,67,200,59,240,248,122,229,62,124,113,20,135,43,165,81,218,67,2,207,4,108,74,76,245,39,184,62,58,92,65,8,109,65,10,38,108,201,147,115,174,115,65,144,212,212,123,248,74,67,196,84,117,109,153,4,237,71,180,189,167,237,148,62,222,67,40,2,181,235,189,160,248,86,204,128,39,122,216,226,11,83,136,131,33,45,81,13,5,39,13,204,78,111,238,137,13,65,10,35,44,79,115,231,222,103,33,16,84,233,111,215,171,83,2,45,186,235,54,1,213,96,57,240,170,41,159,94,3,83,2,61,249,231,47,34,5,23,153,167,179,114,60,167,7,67,2,123,38,135,108,11,24,126,143,170,181,166,243,149,201,83,232,59,195,162,83,78,237,247,135,67,107,122,80,12,151,83,40,34,227,224,150,199,214,236,130,81,226,24,155,37,88,83,2,185,177,170,42,54,114,40,134,113,162,175,94,215,122,83,40,17,236,253,124,219,45,63,63,135,39,152,180,80,251,83,2,123,210,234,58,222,51,226,173,148,76,147,5,177,127,67,40,2,99,70,69,238,172,216,211,99,230,8,238,193,178,81,42,74,12,103,29,237,156,152,83,41,215,36,132,179,35,83,8,131,97,101,71,205,111,81,13,99,82,32,114,7,166,82,12,61,128,58,127,148,61,77,15,165,168,99,84,76,133,83,2,49,186,235,38,64,182,33,108,123,162,174,151,234,95,67,72,74,163,21,155,252,188,40,101,35,110,45,168,171,97,83,232,177,65,71,11,203,171,163,71,172,7,237,4,34,98, +51,72,26,149,117,97,43,220,74,241,171,224,191,86,241,209,66,16,21,105,237,110,87,219,41,222,166,42,176,248,210,45,67,2,165,57,75,41,82,207,237,199,45,22,227,12,208,59,49,10,137,161,115,194,209,135,135,77,0,229,41,138,247,50,66,240,117,236,251,247,50,254,173,198,255,13,18,83,151,209,67,2,95,38,142,96,142,136,102,224,157,221,237,23,46,53,83,136,159,97,69,73,139,141,111,19,171,209,173,221,135,188,83,168,8,117,206,154,11,187,28,6,8,119,72,31,241,95,67,2,103,226,93,220,11,144,118,150,125,74,169,239,38,140,83,240,149,166,157,207,119,235,155,46,171,97,171,100,132,99,83,232,252,33,233,232,172,75,13,17,191,81,41,185,150,147,81,74,207,114,211,183,75,231,128,78,97,132,114,71,149,126,207,205,255,242,120,189,60,3,26,210,31,232,64,106,129,54,67,196,208,51,85,81,127,228,47,242,158,71,78,144,9,189,65,106,5,236,76,82,157,179,235,145,87,221,210,1,33,46,83,2,53,217,167,51,77,64,54,130,135,53,162,82,180,58,83,240,158,136,235,245,234,191,110,131,62,166,104,240,7,228,82,144,185,198,115,223,242,186,173,241,175,176,52,147,7,175,65,234,49,108,221,82,155,206,35,67,83,120,17,51,10,64,82,2,191,102,143,181,217,24,144,0,197,134,60,55,27,155,82,40,35,144,42,202,232,203,3,158,183,68,181,204,49,1,67,72,1,35,229,199,248,206,188,239,34,159,73,78,1,25,82,176,19,76,177,245,33,140,181,57,120,81,156,146,204,245,82,240,186,76,121,148,206,171,228,150,159,66,75,226,163,95,82,72,6,117,75,83,143,5,206,182,28,72,66,179,6,59,82,176,72,44,235,13,31,156,153,57,137,121,109,14,46,1,65,106,243,164,167,28,22,141,89,134,29,220,186,1,104,87,83,40,17,181,181,122,67,26,31,3,1,245,136,203,168,3,66,138,231,178,110,243,118,21,193,240,106,121,74,239,16,193,82,240,227,230,220,218,228,221,231,104,187,248,191,6,89,230,83,200,7,35,171,37,77,119,157,130,123,245,217,17,38,64,67,16,22,236,157,171,246,74,223,175,151,46,232,245,204,144,67,200,1,35,49,213,57,246,190,181,99,18,112,251,185,57,67,2,51,128,75,200,137,2,193,0,148,4,80,191,28,235,205,235,11,245,237,242,159,145,5,239,14,176,253,66,17,3,82,4,79,42,235,153,21,125,150,150,163,168,164,132,189,74,67,200,9,245,58,231,37,248,227,142,131,99,111,243,65,80,67,4,49,114,180,216,140,150,146,148,246,82,138,252,113,65,221,199,170,214,12,181,102,115,46,178,253,245,110,6,202,252,83,2,107,185,71,51,79,168,82,12,240,28,101,131,67,43,67,168,26,176,137,150,237,170,183,47,6,22,77,146,73,250,66,42,142,228,43,214,180,129,190,255,149,177,75,160,195,167,83,2,119,227,142,67,32,169,156,131,166,111,106,186,186,198,83,104,230,68,115,121,183,247,149,149,144,50,215,198,31,201,83,2,241,192,165,42,194,236,11,202,219,252,222,35,247,235,66,2,233,13,211,152,48,52,16,123,211,234,149,12,81,72,67,40,17,112,171,209,109,190,22,114,76,24,225,39,53,147,83,136,143,161,34,167,10,69,235,10,33,78,208,180,195,197,67,136,8,112,248,238,109,40,30,165,12,51,215,24,109,225,206,77,1,117,149,110,69,167,95,35,112,117,40,65,21,247,83,72,142,97,137,43,79,69,11,11,88,7,147,37,48,1,67,40,2,80,2,37,206,150,22,174,134,160,144,12,224,215,67,168,7,208,162,35,206,138,54,109,78,239,66,7,8,0,67,168,18,176,177,189,204,95,213,122,134,15,104,187,34,97,67,104,59,240,146,182,204,150,151,63,6,55,166,243,6,152,205,7,173,122,90,140,252,21,97,203,96,63,64,150,129,0,82,2,171,187,123,26,83,69,119,175,219,134,247,197,111,46,67,2,223,203,229,216,144,205,217,173,34,62,231,153,54,7,83,104,5,44,115,95,219,125,239,204,86,182,194,117,223,32,205,139,3,163,54,10,126,29,0,0,64,120,226,46,164,66,222,17,223,230,114,169,3,0,0,12,86,166,193,80,74,36, +81,42,11,163,248,116,187,223,32,246,170,219,122,114,0,14,67,2,121,200,141,212,12,100,108,19,55,63,125,193,9,23,81,52,206,76,61,117,121,85,21,10,177,201,176,6,232,179,83,72,200,97,75,79,205,75,45,13,88,143,43,132,24,128,51,4,71,104,116,186,75,64,83,87,203,251,84,95,180,126,83,200,160,65,71,107,141,67,41,11,215,39,47,84,14,137,33,6,179,74,62,148,26,5,68,155,51,206,41,226,93,4,82,232,56,48,22,151,224,122,38,170,198,48,159,184,49,60,82,176,54,108,214,251,92,180,243,193,137,25,176,19,216,253,83,104,166,97,103,73,13,37,201,12,41,193,236,221,135,22,83,8,44,163,168,230,125,239,215,135,178,211,136,15,177,29,83,2,173,186,10,67,65,81,19,139,161,203,38,115,22,224,81,42,145,164,115,124,205,103,167,59,9,8,82,184,101,213,66,2,11,228,151,182,217,92,174,35,194,82,181,4,123,35,207,173,214,96,143,243,115,87,148,156,144,254,218,150,62,152,223,5,89,132,141,88,139,255,151,125,73,146,72,177,12,196,67,144,160,200,189,46,55,149,123,102,160,214,0,42,9,249,82,4,39,225,80,155,115,247,3,253,229,41,9,89,246,74,83,2,183,184,5,47,208,245,15,185,245,138,9,31,34,199,82,4,125,252,233,155,149,157,140,69,227,217,167,96,151,210,83,168,146,129,141,141,177,20,119,25,184,216,133,158,12,190,33,202,9,245,107,219,202,160,134,168,26,190,135,250,189,145,33,6,45,58,233,140,139,60,170,19,230,33,117,245,70,201,67,4,217,20,179,40,164,80,144,18,6,18,147,101,138,218,51,4,79,162,133,50,138,51,32,136,142,172,106,237,219,33,67,136,8,245,188,191,37,250,84,29,19,54,143,80,4,90,66,172,150,18,198,135,163,37,127,2,149,146,134,32,246,10,67,200,25,112,178,178,101,143,159,123,134,45,254,153,198,27,83,40,17,35,177,245,107,252,189,131,233,54,120,36,67,192,83,2,173,185,8,47,255,122,119,223,181,227,100,128,67,244,81,74,166,178,191,102,223,239,64,181,79,100,135,92,203,64,83,72,26,204,245,239,219,60,187,61,191,177,228,216,70,207,65,242,186,200,209,118,171,197,14,2,170,154,117,58,68,49,81,80,108,11,35,101,75,119,123,13,11,15,136,103,224,30,82,80,92,163,188,214,20,19,209,14,147,26,173,12,161,3,67,2,211,40,157,204,74,175,37,166,117,18,240,222,95,118,67,4,185,216,180,88,35,84,209,191,153,224,221,102,195,240,67,72,41,163,249,237,168,246,187,255,160,195,12,117,36,76,83,72,74,44,123,101,169,36,185,53,205,35,183,56,40,186,65,170,20,172,239,118,83,207,163,101,138,173,243,46,184,0,83,104,219,65,73,43,43,45,79,13,123,243,249,43,208,154,83,40,17,108,181,46,89,84,247,28,167,199,244,80,134,222,83,2,165,128,101,46,123,54,249,94,39,229,26,224,140,227,82,2,111,234,155,121,219,48,112,31,97,113,164,230,87,188,65,138,19,195,103,73,205,48,23,162,239,250,150,87,60,52,207,73,156,33,54,147,237,118,61,243,94,7,72,93,31,178,83,2,47,193,39,51,149,0,225,45,97,86,176,78,169,255,82,200,17,240,182,251,46,92,79,70,185,160,163,198,64,59,67,4,109,174,178,88,222,175,170,89,90,150,88,238,171,181,83,136,85,53,229,232,143,175,30,7,176,31,14,212,201,62,67,2,209,70,149,92,143,92,84,48,239,228,153,105,44,86,81,170,31,44,202,88,105,197,80,167,136,173,121,19,14,160,67,2,97,110,246,234,78,200,216,87,183,158,114,245,128,112,83,168,5,163,193,150,103,91,151,134,222,11,45,146,225,222,82,4,57,250,225,93,181,208,122,228,153,40,87,164,180,151,83,136,137,161,145,113,49,85,15,15,182,40,173,211,22,212,65,170,146,100,24,6,30,125,100,130,147,128,114,251,181,47,83,40,17,236,191,116,111,239,111,62,177,146,70,144,42,162,222,201,135,225,49,154,242,181,15,63,170,115,209,194,54,164,66,144,111,172,236,175,58,189,249,181,173,29,8,187,195,66,82,176,243,138,245,253,213,206,251,92,55,34,168,254,249,236, +82,76,32,128,242,166,108,219,173,149,127,126,240,68,64,250,82,2,179,146,220,218,89,17,136,172,98,136,227,139,248,13,67,2,77,68,116,70,73,249,201,223,171,224,253,160,175,106,222,209,86,229,244,254,142,255,159,158,173,155,24,37,44,132,223,5,209,106,197,218,138,86,230,196,128,108,218,148,176,81,83,200,145,33,235,8,13,7,41,15,220,209,199,158,78,205,67,2,73,164,100,200,77,185,41,142,37,59,228,190,71,135,83,200,3,245,253,11,46,190,84,3,167,241,147,27,12,56,83,40,169,1,72,167,13,1,5,11,242,13,219,210,114,148,82,2,75,134,27,126,83,133,145,82,118,192,25,204,163,134,83,176,233,102,173,181,219,250,176,42,224,236,22,13,188,9,83,2,53,202,9,47,187,6,91,246,206,208,206,43,89,173,67,208,99,204,222,47,181,231,191,123,141,53,36,225,152,149,81,42,142,68,189,40,90,62,32,63,9,117,234,209,72,171,81,138,175,178,217,173,31,126,3,193,59,51,5,233,234,108,66,16,34,105,254,221,117,221,162,93,236,42,205,75,49,14,67,144,239,236,201,139,179,116,79,90,168,151,6,29,130,6,83,40,145,129,137,139,207,69,41,13,15,82,106,226,95,247,66,138,142,196,173,115,77,151,229,117,162,172,122,2,224,6,81,106,134,4,217,180,111,39,96,245,223,255,251,59,112,152,67,232,28,176,170,35,103,163,23,175,78,128,183,206,20,221,82,204,24,128,246,230,80,250,187,149,157,127,144,96,201,145,67,196,192,17,109,9,76,162,21,249,186,231,14,208,126,32,67,200,33,163,69,87,188,174,41,219,35,37,179,155,125,236,83,40,2,245,254,155,173,10,79,7,14,251,20,35,250,155,81,170,18,140,218,251,162,123,159,147,176,3,155,132,44,176,65,138,0,236,58,74,247,251,229,19,61,56,33,12,229,32,67,232,58,213,241,191,237,174,247,251,1,12,181,21,28,18,67,2,89,11,174,102,14,88,124,4,250,81,180,232,63,25,83,2,245,200,104,39,129,198,19,120,183,134,98,197,48,144,83,104,183,161,32,197,74,71,75,15,11,49,219,219,187,59,83,2,179,193,11,47,55,55,31,87,55,208,206,133,153,225,67,2,251,35,127,228,14,8,150,129,112,118,142,223,118,109,66,2,183,129,187,210,31,24,43,32,109,202,247,83,229,251,83,2,249,184,200,38,222,213,223,155,178,167,75,230,37,224,66,2,83,44,194,162,93,52,200,113,24,127,208,87,228,66,67,2,225,196,117,90,77,195,171,74,253,4,225,92,12,125,82,144,32,12,198,120,221,155,150,214,122,133,217,65,91,88,83,2,169,168,38,47,129,66,162,156,129,242,123,104,162,5,83,2,247,200,230,58,107,141,121,103,169,55,71,119,187,134,83,72,11,117,206,218,43,38,117,2,212,170,218,139,225,5,33,106,189,65,120,177,124,19,110,41,12,146,85,199,134,251,33,6,55,31,190,150,0,165,253,102,211,63,243,220,102,231,205,7,7,92,222,148,16,64,144,245,237,72,141,47,213,248,66,2,165,201,57,244,102,24,246,197,55,2,23,138,59,68,66,40,202,201,215,93,237,152,100,255,179,20,37,158,82,250,83,232,59,195,227,209,204,238,221,130,209,161,69,240,6,238,223,41,66,21,194,168,159,165,226,146,147,32,18,104,232,195,82,168,13,208,153,218,152,106,128,34,149,176,137,41,156,96,67,40,124,80,67,231,196,156,86,167,140,115,252,96,146,212,223,5,199,133,205,188,137,44,13,169,170,43,101,170,240,245,83,136,193,1,77,243,74,205,133,75,131,24,220,198,132,152,82,72,180,193,235,230,196,186,38,44,16,121,52,168,106,166,51,40,130,1,55,59,167,146,80,210,250,80,3,95,209,198,82,2,115,250,43,91,81,197,221,205,11,253,113,27,254,2,223,5,91,81,53,85,146,126,46,246,146,208,197,64,251,137,82,36,173,204,236,114,85,0,84,170,182,159,119,78,125,31,67,4,8,59,1,152,166,150,135,221,187,175,235,191,222,159,67,240,131,196,151,167,139,117,110,110,72,89,70,6,189,222,222,137,3,163,245,139,186,115,22,0,0,0,196,197,26,77,222,49,93,161,105,181,1,0,0,165,173,131,201,194,138,216, +67,2,253,131,110,96,75,161,250,79,253,79,18,102,175,1,82,240,96,140,57,104,39,165,213,226,108,37,96,69,87,221,65,138,3,108,91,242,154,183,53,163,1,234,141,99,231,216,65,50,247,100,173,106,103,109,156,16,20,48,249,1,55,62,65,74,17,236,235,126,158,143,234,91,113,81,136,34,35,90,65,138,94,85,151,185,169,107,13,16,58,80,83,178,19,149,83,72,0,53,165,48,14,173,30,7,155,183,5,110,4,54,67,196,216,56,254,216,132,162,202,84,90,226,64,41,10,165,83,40,74,99,186,189,227,238,159,131,236,6,246,42,242,1,66,74,156,114,159,209,179,19,62,113,16,217,16,8,126,203,83,168,82,181,181,174,163,135,78,7,91,187,152,166,13,4,83,136,175,129,99,71,79,73,43,13,16,23,176,111,115,119,83,144,194,234,223,223,222,25,187,136,48,255,8,158,252,56,82,232,52,16,26,153,30,147,99,22,187,100,252,243,187,71,83,136,103,245,212,254,167,141,94,3,195,126,169,127,248,77,83,2,239,185,167,46,218,17,192,156,165,70,175,205,213,248,83,40,11,99,154,167,111,255,157,131,190,97,116,2,242,87,82,4,87,246,179,157,21,88,223,192,15,111,255,229,203,17,66,40,129,233,149,93,105,226,151,91,236,72,88,61,237,193,83,8,137,161,4,169,108,71,75,13,55,242,130,242,202,252,205,7,189,106,234,140,171,112,60,11,199,41,185,170,213,7,67,4,45,146,172,72,35,0,42,66,138,68,53,167,88,130,83,136,103,236,211,127,193,167,219,250,254,9,159,110,180,154,67,8,9,181,106,237,250,186,113,156,3,89,205,226,103,174,67,40,104,195,81,94,250,174,171,245,97,238,167,247,26,17,83,40,206,97,73,45,235,194,230,10,54,176,8,94,125,247,33,6,249,162,234,7,234,33,187,47,67,0,233,206,95,118,83,72,1,245,159,250,161,147,4,7,96,25,122,173,184,10,83,104,11,213,126,91,203,150,237,3,58,225,124,192,31,96,67,8,3,176,155,190,71,155,126,125,6,191,241,4,112,0,83,232,208,97,133,233,42,101,201,12,218,15,116,128,77,71,67,136,14,112,146,98,109,43,85,59,148,18,137,138,20,154,82,104,5,80,22,104,100,235,177,54,9,225,139,218,162,9,67,4,81,144,212,216,142,54,228,251,154,184,146,107,107,165,83,168,0,44,123,101,205,171,30,122,72,73,57,121,161,175,82,104,13,240,158,172,52,148,227,21,184,248,119,103,146,40,82,168,0,80,150,121,30,195,47,71,205,0,90,249,194,40,67,4,81,114,176,40,156,211,3,155,36,79,107,42,171,198,223,5,33,99,139,190,137,169,35,186,78,172,218,161,15,124,67,2,223,200,213,222,139,133,112,212,169,103,109,127,162,229,66,138,222,210,183,62,247,11,55,206,53,55,224,253,240,158,67,136,101,163,187,253,170,246,58,175,34,188,9,170,128,110,83,136,103,236,219,188,179,44,75,36,221,247,2,217,220,246,82,2,15,136,149,253,96,165,247,189,210,254,145,72,182,0,83,8,75,181,247,45,6,175,30,3,112,200,220,233,241,51,83,40,128,33,39,41,109,105,107,15,214,46,160,208,70,248,67,200,16,195,209,150,249,190,236,181,100,132,64,192,174,202,82,8,1,48,166,216,232,68,99,149,200,164,27,86,7,198,67,232,31,181,46,123,220,170,211,199,0,65,22,189,165,252,83,168,203,97,103,43,143,137,141,19,95,177,133,143,181,194,81,170,131,114,88,30,155,38,5,132,246,172,41,224,151,207,83,40,124,172,92,214,219,101,77,229,93,103,180,224,84,201,66,48,185,140,125,215,181,221,225,183,181,161,168,241,40,211,83,176,228,104,79,126,250,186,53,129,0,111,2,140,171,245,83,2,241,208,101,43,67,233,112,150,101,123,81,48,18,213,67,2,85,100,125,220,75,78,39,226,84,134,81,179,108,228,83,200,194,193,228,72,45,84,148,82,152,26,156,239,209,7,67,2,225,41,198,232,139,138,163,32,152,100,196,144,141,135,83,2,239,184,6,47,150,187,234,34,18,94,162,40,129,254,81,234,93,140,86,91,221,147,83,12,43,177,4,219,80,52,67,2,67,104,180,64,74,131,232,15,181,63,31,193,241,214, +83,136,5,172,209,236,219,231,109,47,197,7,191,122,12,197,67,104,5,195,65,95,112,252,127,189,161,93,25,121,153,129,67,2,219,163,133,224,74,95,40,231,58,18,34,34,145,80,65,170,7,236,184,79,222,154,119,1,22,39,165,199,73,14,67,40,9,163,212,143,238,164,238,203,100,31,46,253,216,133,82,2,35,178,151,214,122,49,4,201,162,24,8,247,252,141,67,2,227,197,101,218,12,198,152,254,34,140,246,27,80,229,83,40,139,193,105,73,237,204,240,18,11,244,6,51,69,60,66,80,33,236,254,63,168,181,46,187,40,19,161,165,55,227,65,202,66,117,119,247,109,45,15,200,202,68,241,176,142,128,65,138,14,3,3,41,139,153,15,34,198,222,121,146,85,66,67,8,38,112,234,167,231,10,77,91,86,252,21,233,12,26,67,2,173,217,82,181,19,218,92,30,219,193,14,210,205,221,83,104,0,172,217,238,217,108,75,45,175,63,4,187,156,17,83,2,243,210,106,55,6,41,67,212,108,160,172,40,122,17,67,16,203,198,185,183,233,156,246,73,74,231,132,102,3,245,67,136,9,240,232,34,205,227,55,175,22,17,183,131,130,35,67,196,84,182,77,169,236,243,215,19,164,24,246,230,221,74,67,2,237,109,214,222,78,207,16,163,205,129,247,195,65,50,82,144,194,230,125,95,194,157,47,119,189,132,96,162,100,78,65,210,143,200,205,5,147,90,31,34,30,107,150,193,138,160,67,4,113,144,176,232,52,111,57,214,74,18,18,97,62,243,66,10,129,196,154,231,111,141,128,145,122,237,253,69,84,10,65,242,195,168,93,245,160,164,18,146,13,115,186,3,229,253,81,170,210,178,213,44,13,111,5,122,101,45,218,133,71,114,82,144,32,204,218,139,161,164,243,214,138,65,56,215,37,201,66,138,147,196,56,222,181,147,31,226,129,14,96,106,95,232,83,200,74,236,211,108,207,178,152,61,134,188,2,147,53,38,83,2,179,194,44,55,24,214,210,189,237,173,117,167,139,219,67,2,95,232,173,218,77,97,189,203,217,37,2,68,108,48,33,74,6,227,124,239,83,188,167,175,137,81,17,240,66,140,205,7,225,211,195,143,46,97,149,144,158,220,238,205,238,204,66,2,51,128,182,144,33,86,232,230,12,170,43,128,39,0,67,2,105,97,62,98,75,219,14,45,115,245,41,211,124,134,67,2,233,68,110,98,12,153,157,205,163,245,169,67,178,25,67,2,225,8,150,222,143,32,68,65,128,136,128,6,15,80,83,2,235,168,196,50,245,233,80,171,7,83,155,164,12,151,67,136,8,80,123,117,236,191,28,170,22,252,98,185,154,128,205,235,128,97,177,182,203,58,84,109,12,220,219,166,253,16,67,4,51,114,210,136,148,98,37,246,37,66,72,243,53,105,82,136,14,210,29,90,42,89,7,30,90,80,160,9,214,124,83,72,139,193,36,205,202,36,235,10,19,85,130,87,192,93,66,104,187,225,231,245,182,140,199,142,112,28,116,189,252,212,67,8,27,67,3,70,114,148,243,174,96,186,209,68,0,30,82,72,28,240,4,117,92,106,164,46,166,248,213,35,18,48,223,41,131,41,149,119,102,96,34,38,167,64,95,16,82,254,81,72,26,112,26,188,135,163,40,196,180,176,138,43,168,200,223,5,45,1,133,44,137,214,255,182,9,73,16,115,21,133,82,2,93,4,15,138,83,160,212,93,23,125,176,44,114,87,82,2,157,32,223,129,201,160,27,249,240,21,205,39,135,176,82,2,101,162,14,78,73,1,136,100,31,123,39,154,244,205,82,168,6,210,21,91,234,83,5,154,41,4,43,64,228,191,82,2,165,134,157,130,75,161,46,195,187,171,247,149,49,7,66,2,37,204,193,182,36,55,159,9,237,62,161,182,190,153,51,4,77,194,165,184,137,148,67,18,48,41,1,191,42,219,51,4,209,198,236,204,138,50,3,0,125,166,32,91,151,245,83,8,43,195,171,50,198,252,251,132,142,173,40,152,245,67,83,8,174,97,107,81,235,6,45,9,6,249,16,127,186,189,67,104,13,163,162,213,170,247,121,175,162,69,15,186,216,214,81,40,163,73,219,112,111,158,36,167,0,8,32,10,65,80,95,241,16,17,0,0,80,207,60,213,245,122,160,97,130,61, +83,8,47,227,225,151,71,75,181,131,134,251,73,183,100,225,67,104,115,245,173,183,246,232,151,150,68,200,143,70,54,77,83,104,142,33,35,69,203,216,244,20,162,113,19,181,100,241,65,170,8,172,251,251,114,178,172,91,85,76,29,40,121,0,82,8,3,16,154,119,102,203,112,190,9,197,111,145,191,132,49,42,41,21,87,202,53,186,199,50,128,200,13,215,39,29,51,4,179,228,107,184,138,95,243,125,154,10,8,125,234,152,67,48,122,172,215,189,51,98,191,183,147,0,206,161,190,187,82,112,56,140,210,186,37,189,63,231,91,37,209,17,51,13,65,106,114,44,75,18,191,151,118,1,134,80,138,60,112,3,83,112,232,234,94,79,254,215,206,142,120,6,29,17,24,204,82,232,13,48,18,119,162,203,18,203,75,197,102,140,236,126,82,2,241,10,205,157,241,100,253,154,170,105,47,131,23,255,83,136,76,99,226,214,77,91,247,130,200,13,237,150,234,56,82,72,202,225,187,183,231,188,30,173,16,69,115,147,67,33,81,152,152,204,47,254,116,195,245,63,249,23,138,86,222,113,83,40,130,65,11,11,77,43,239,10,125,36,99,164,100,63,82,40,124,240,25,203,214,210,108,186,216,228,214,2,27,237,51,4,71,33,93,78,138,95,210,50,166,68,211,54,9,144,223,5,175,160,84,176,137,53,112,199,226,10,110,26,213,115,67,2,83,97,109,70,137,207,234,143,255,105,134,162,75,64,82,196,16,39,25,113,81,65,158,174,227,77,88,22,152,103,82,80,69,44,74,216,239,197,121,78,90,89,204,19,209,244,51,4,69,170,212,74,139,178,215,253,32,13,130,130,39,103,82,104,102,240,137,72,26,179,164,154,233,164,111,76,2,5,83,168,3,172,215,238,43,149,253,166,149,253,106,65,79,162,67,176,45,101,127,111,120,152,93,156,162,229,78,212,200,7,51,208,44,76,107,238,98,172,17,95,107,193,134,67,103,153,34,170,135,97,101,39,173,169,173,19,192,235,49,114,45,192,82,4,29,242,225,143,81,18,235,127,160,165,40,108,138,204,83,2,43,162,169,62,191,43,112,35,209,86,9,168,41,230,67,136,4,195,81,94,124,198,240,183,36,62,131,250,133,39,81,42,209,196,127,125,255,205,99,240,6,221,31,49,57,51,66,42,130,228,217,187,46,157,58,131,202,214,226,100,181,5,67,2,101,13,222,94,17,216,194,251,187,5,70,31,241,199,67,2,231,42,238,94,14,223,246,118,227,80,222,107,182,16,83,2,125,216,36,47,209,239,216,118,11,188,228,1,80,40,83,2,175,176,196,50,246,4,46,148,90,131,242,107,224,124,83,2,123,185,167,50,237,5,248,255,106,181,207,33,67,235,67,196,88,249,190,208,222,199,55,223,158,250,75,242,74,1,67,2,213,136,181,98,79,143,178,151,7,105,123,233,183,229,205,171,7,35,100,47,187,248,244,222,159,241,160,208,215,29,82,4,63,228,105,95,245,138,144,170,139,30,216,116,187,186,83,200,7,236,152,46,219,109,205,189,146,93,228,102,246,130,65,114,153,36,78,59,231,143,152,8,5,193,177,57,68,143,83,232,19,204,233,254,215,255,111,180,117,31,25,18,176,94,82,140,25,160,95,182,20,64,94,165,119,2,89,169,9,56,66,234,238,242,63,125,126,19,241,142,168,209,14,239,33,0,83,80,236,204,118,183,63,74,183,161,8,207,76,43,140,148,82,2,223,223,247,247,236,4,38,144,188,170,218,171,171,143,67,2,211,65,85,218,10,162,226,2,153,134,192,240,28,157,67,168,2,181,105,101,126,244,48,215,4,139,239,197,36,231,67,8,9,176,202,226,235,30,125,186,20,71,22,117,183,248,205,107,166,193,170,230,204,59,239,27,6,126,219,85,140,89,33,6,45,122,117,140,63,5,146,67,52,66,90,171,144,136,222,145,32,172,217,219,151,206,171,43,140,27,32,241,104,86,82,136,32,208,21,152,220,154,210,186,252,100,57,34,90,130,83,40,129,193,236,174,176,167,201,13,128,213,128,91,176,22,67,80,92,204,248,123,127,95,189,191,11,41,63,91,165,157,66,138,229,228,154,123,155,143,12,179,25,119,17,94,96,109,83,2,55,209,38,51,172,141,35,144,201,150,0,109,185,50, +81,234,187,196,123,184,63,190,162,249,17,33,100,193,250,207,67,2,221,101,149,90,139,69,127,129,189,166,49,108,72,141,82,4,81,128,145,93,85,85,248,4,151,34,168,10,34,56,67,136,2,195,35,207,48,252,127,183,32,142,126,190,239,22,83,168,6,245,223,239,141,170,22,6,81,254,144,23,224,0,83,40,61,99,138,83,103,246,172,131,22,114,120,224,51,6,83,72,41,99,202,99,111,90,151,134,138,88,1,247,145,189,65,202,13,44,219,215,57,175,36,89,94,3,193,16,97,96,83,80,220,204,149,217,235,221,251,161,7,132,80,185,184,188,67,104,43,80,102,158,212,210,181,123,85,88,126,218,37,103,67,2,255,230,150,228,77,187,159,214,113,244,239,26,60,173,83,144,140,204,156,170,23,122,181,163,232,163,118,167,26,2,65,234,59,44,221,247,146,154,182,145,41,177,67,2,134,84,67,136,31,131,19,94,252,230,254,103,36,135,176,105,18,42,83,168,102,35,185,53,237,78,151,135,48,17,212,116,200,113,67,2,91,231,157,222,12,244,90,143,113,3,98,191,197,40,206,205,9,245,190,219,46,31,123,38,172,231,10,125,209,47,83,232,247,97,71,205,170,101,41,11,68,74,252,68,2,18,205,7,151,24,114,140,18,37,2,200,114,73,158,25,116,27,35,16,0,41,68,216,236,212,75,14,167,41,81,221,67,169,83,168,36,227,192,227,198,219,12,135,85,213,44,166,189,194,34,202,17,172,209,125,217,251,188,54,192,140,193,156,58,117,81,234,247,50,113,31,60,166,135,31,171,197,150,62,193,240,81,234,247,196,91,60,173,189,39,253,0,17,88,158,183,26,67,40,2,227,34,135,237,190,105,173,100,34,243,176,249,96,83,2,115,193,234,42,231,245,166,226,221,128,182,135,224,26,82,136,48,144,38,216,34,123,231,33,233,128,135,186,221,126,82,136,40,144,17,186,152,138,42,62,186,56,120,180,162,48,82,4,29,172,125,28,181,16,253,206,16,178,168,44,6,17,82,8,1,240,13,121,42,107,128,26,165,192,18,122,16,209,83,40,2,195,225,86,204,230,238,135,80,218,36,6,208,74,82,2,95,174,216,242,218,196,196,239,123,105,124,243,10,240,65,42,14,172,24,103,230,223,46,48,139,60,199,75,86,233,83,40,31,236,120,214,181,36,203,148,238,177,234,126,19,184,65,74,207,68,9,37,34,163,73,130,212,209,196,59,36,63,83,200,3,181,215,110,69,139,245,3,8,122,235,201,131,136,33,6,43,106,213,148,16,32,82,146,38,99,115,50,182,87,82,4,17,200,27,76,49,37,40,165,192,231,4,100,3,177,83,104,189,73,204,142,107,99,39,11,68,78,215,208,239,249,67,2,171,64,124,184,137,67,170,215,20,255,67,170,155,27,66,36,185,93,51,182,42,138,109,152,106,170,213,37,240,85,66,2,165,208,65,56,40,25,183,181,159,187,203,125,14,44,67,4,43,144,174,20,5,144,66,84,36,80,233,102,125,45,66,2,165,221,188,62,38,89,109,194,169,0,70,98,20,241,35,4,165,97,60,255,100,90,107,125,127,238,47,104,249,55,66,40,137,129,66,159,37,212,83,77,169,88,240,74,141,28,66,2,45,141,117,160,50,52,144,107,236,254,107,213,33,33,67,104,38,149,245,110,85,232,22,134,2,240,90,121,56,103,82,4,109,241,43,12,53,86,125,206,246,121,255,131,125,248,66,2,37,201,69,118,104,85,86,117,236,118,160,215,204,106,67,2,147,44,2,167,140,130,84,156,137,115,233,150,246,105,66,2,157,209,52,120,36,87,185,219,152,245,40,177,128,54,82,4,77,217,105,28,213,100,17,200,164,104,96,228,188,95,66,104,5,85,225,168,67,68,254,34,154,2,47,247,116,216,66,2,33,77,185,248,100,55,201,21,45,128,45,6,23,73,34,144,57,44,251,42,94,210,172,248,250,46,26,56,75,215,82,104,242,233,168,85,135,56,52,98,12,68,125,56,84,10,222,105,187,129,70,172,143,48,151,54,94,67,65,211,136,52,83,136,130,41,135,39,67,140,142,12,68,10,50,86,127,89,223,137,3,35,177,158,45,178,0,0,0,4,1,19,122,236,19,16,95,233,168,228,1,0,224,29,44,230,88,128,1,156, +82,232,124,131,69,58,230,120,134,189,11,34,185,35,136,190,67,4,51,82,210,72,238,130,40,185,129,165,9,233,121,44,83,2,189,225,73,47,101,213,224,122,15,82,103,227,44,3,65,74,1,236,111,82,159,243,99,251,104,63,123,241,207,9,67,2,105,44,206,222,14,128,243,25,25,205,78,223,43,68,67,72,119,181,170,237,53,202,86,199,3,183,175,70,130,28,35,204,195,196,108,255,56,79,133,4,156,2,154,70,232,7,66,170,135,132,43,107,223,155,144,83,54,17,87,120,93,224,65,202,66,236,186,115,235,223,54,115,7,39,47,52,14,166,82,240,56,108,206,153,97,156,113,82,59,37,236,199,29,228,67,200,32,176,203,246,197,56,120,177,140,26,88,79,212,255,221,199,158,119,42,197,250,130,149,250,7,34,255,33,233,213,65,202,9,117,119,185,69,43,11,80,32,73,105,104,23,67,82,4,87,51,169,75,85,92,6,155,37,228,136,32,41,132,221,7,139,234,49,65,32,128,208,36,114,46,19,153,183,93,82,232,4,112,202,122,45,139,228,166,165,224,235,115,39,19,66,104,139,225,249,175,123,246,102,243,230,4,219,223,244,29,66,72,0,117,177,228,245,229,223,108,61,3,174,206,83,34,83,2,241,200,5,47,117,38,70,181,11,28,104,135,100,80,67,232,58,240,136,227,229,14,85,123,20,210,1,211,241,58,67,2,85,131,101,218,140,113,2,200,108,77,1,80,66,224,83,2,97,153,231,58,59,1,62,2,225,63,217,86,118,208,65,170,86,236,255,215,120,143,242,5,87,111,31,249,90,4,67,2,229,102,118,106,139,237,14,21,119,127,188,187,29,213,67,168,42,131,64,76,241,188,174,203,36,66,80,101,109,240,65,74,1,108,77,243,227,254,197,155,57,33,42,252,0,0,83,72,103,131,13,46,214,252,189,131,205,162,54,177,7,19,82,4,93,121,33,78,113,25,148,246,19,112,165,178,88,139,67,208,104,204,184,47,255,79,121,127,7,5,225,198,234,26,82,168,75,117,239,247,141,72,205,254,12,36,208,35,158,72,83,168,7,117,173,157,197,27,149,7,16,106,170,242,193,27,67,4,217,214,244,64,106,134,234,111,93,87,111,219,125,1,67,8,9,227,34,143,236,190,105,109,97,34,160,253,210,242,67,40,162,225,248,249,219,198,201,67,17,145,188,90,181,136,51,16,61,169,204,94,55,177,225,6,139,34,251,2,240,114,83,40,145,1,3,37,171,11,9,13,55,84,210,160,163,173,83,40,9,99,235,23,231,90,205,133,206,62,120,155,181,15,82,40,2,53,93,86,179,170,253,237,15,8,52,199,65,4,82,4,107,44,169,201,35,30,217,1,246,150,164,30,128,251,83,168,64,236,118,159,249,118,93,229,123,183,239,192,70,41,83,16,149,38,239,248,118,237,250,42,132,60,128,109,7,143,65,74,96,236,238,87,54,231,209,11,59,221,207,15,228,3,65,74,72,236,233,210,149,147,242,67,248,18,60,38,202,144,83,2,211,79,159,121,144,141,140,65,186,130,2,205,25,68,65,138,19,67,39,39,77,85,25,42,81,180,15,95,55,170,66,232,99,163,240,159,207,244,121,190,77,134,93,221,82,73,83,2,53,202,42,55,26,184,66,76,205,113,141,24,122,83,83,112,134,166,214,43,215,107,219,46,255,188,30,9,32,157,66,2,71,57,75,164,33,88,9,52,6,245,111,63,86,147,83,72,113,245,189,171,14,157,126,6,19,49,181,175,249,225,83,168,18,99,186,114,253,127,149,135,67,109,21,92,180,200,83,136,14,236,223,229,253,52,203,108,128,109,101,42,195,69,82,4,121,229,191,95,19,90,248,8,196,47,4,20,18,135,81,74,154,210,235,254,11,39,129,2,218,157,252,241,255,247,66,138,147,228,220,206,51,145,234,190,172,161,76,26,48,128,83,136,3,227,226,214,204,238,159,135,213,127,251,51,26,232,83,136,142,193,226,38,11,45,49,11,10,24,241,68,14,254,83,136,251,1,69,201,106,107,45,13,6,28,243,211,138,63,67,40,124,240,232,230,207,159,124,62,20,114,154,181,245,11,34,240,117,219,242,227,51,251,126,199,231,190,33,191,49,186,67,152,246,6,241,218,238,154,48,151,130,73,49,131,157,224, +65,178,189,196,81,40,29,93,144,176,170,160,238,15,118,129,67,196,212,148,13,73,94,39,184,27,120,247,27,42,168,39,83,200,7,181,204,242,241,171,127,3,228,202,110,64,184,152,83,2,47,185,232,38,65,0,190,127,146,113,222,20,69,58,49,170,136,161,73,250,244,140,43,214,192,141,186,20,33,19,66,138,229,178,175,109,244,5,112,5,194,241,61,182,148,135,65,42,130,164,229,5,22,163,84,70,170,16,147,139,225,5,82,40,17,240,149,136,158,146,101,154,170,4,98,232,156,150,51,104,5,181,44,77,20,62,228,5,159,128,116,194,55,129,83,2,111,194,75,59,222,66,224,40,13,18,175,1,226,61,83,200,25,236,221,239,173,243,40,254,254,162,31,38,72,10,83,200,17,35,235,145,101,86,215,134,3,44,41,230,74,207,82,136,31,80,146,103,32,115,4,154,185,36,55,29,209,50,67,4,115,148,212,64,239,86,71,34,26,40,79,43,79,13,67,2,249,232,125,80,76,23,113,71,145,12,64,187,136,231,67,2,223,169,181,218,72,147,155,254,93,171,174,44,197,243,67,168,6,208,106,227,231,190,94,61,142,14,250,211,137,11,83,200,24,227,201,39,111,75,245,130,175,80,120,51,111,106,83,8,131,33,231,232,44,45,47,11,78,63,55,9,0,130,83,40,17,227,193,23,207,175,223,133,89,224,16,52,60,194,83,2,177,184,197,42,225,252,135,221,253,144,135,173,13,245,82,4,31,163,153,157,97,127,75,159,35,184,186,242,214,5,82,4,121,140,107,159,17,101,147,223,217,213,2,226,151,62,83,2,105,177,8,51,126,21,246,153,182,13,152,4,69,203,67,8,9,112,250,103,239,172,90,122,70,134,252,143,69,92,82,136,25,117,221,123,254,141,71,245,14,168,70,121,245,162,82,4,23,124,43,231,19,181,2,238,99,113,8,241,145,249,83,2,243,195,16,51,151,11,49,183,161,122,189,2,112,248,83,168,131,33,3,7,75,101,135,13,176,51,74,39,116,249,67,40,31,181,42,123,157,125,173,235,129,32,229,228,30,251,67,176,208,38,198,135,155,123,89,98,74,172,44,163,41,6,51,144,32,7,27,233,28,157,84,55,83,184,245,35,188,135,66,170,168,228,217,165,47,141,231,17,238,57,78,203,135,74,83,72,134,161,137,77,141,101,103,11,64,15,246,100,10,207,207,241,5,108,222,101,169,173,185,123,223,3,193,57,227,156,83,136,3,163,131,210,109,136,185,134,96,70,130,10,232,211,81,16,95,82,73,171,141,228,34,229,4,103,143,149,127,241,65,76,0,210,165,195,222,156,193,22,60,144,130,162,127,63,66,200,174,129,212,214,247,92,131,86,229,20,168,45,122,193,67,136,101,210,168,147,135,189,118,109,8,212,56,242,131,87,82,4,49,184,219,26,83,104,250,9,79,170,253,84,249,171,67,2,187,163,173,48,10,30,55,15,157,7,192,113,77,151,82,4,109,241,163,12,85,168,125,224,179,185,123,254,250,222,82,36,89,115,153,157,112,150,250,63,75,154,255,226,240,183,82,4,53,170,115,92,17,86,106,74,211,253,14,14,3,219,82,2,61,130,90,78,75,216,221,153,236,150,103,102,106,225,66,2,205,1,234,222,110,20,207,158,25,93,75,158,3,222,82,4,109,216,91,10,53,61,47,11,74,73,241,126,169,62,82,36,89,115,155,93,146,65,235,32,190,10,201,170,250,102,82,4,25,163,249,10,51,228,17,33,238,216,112,73,103,93,206,49,11,83,153,120,168,88,111,93,6,215,166,248,81,182,82,2,125,224,24,70,211,32,48,46,179,213,219,237,130,249,82,2,209,120,200,43,99,68,19,131,106,224,166,213,163,41,82,72,210,193,178,190,198,22,211,173,14,229,138,187,99,5,82,4,57,123,187,26,85,155,18,209,149,125,164,16,21,13,82,4,31,37,183,26,19,147,78,122,211,159,154,86,164,136,82,36,27,171,80,15,98,23,84,239,153,186,221,236,250,231,82,2,243,180,185,79,65,81,212,116,248,123,150,195,129,26,82,36,43,28,69,157,51,166,107,123,96,185,144,50,78,8,34,40,163,73,213,160,120,28,160,75,2,128,159,64,224,240,223,137,3,227,123,88,80,138,0,0,0,4,12,55,76,24, +67,168,3,208,202,98,237,134,45,159,23,45,251,237,92,136,67,2,117,18,47,231,147,202,13,86,55,203,76,61,238,49,83,2,181,201,40,55,0,72,133,37,176,132,217,220,124,186,66,112,76,108,221,101,239,165,27,107,218,17,173,161,193,182,83,168,18,99,154,114,245,123,247,133,65,254,34,79,179,39,66,10,166,178,222,217,240,3,187,130,213,172,156,13,192,105,83,2,111,195,45,67,194,173,189,3,68,247,20,212,119,229,83,104,14,108,155,100,249,61,191,253,122,16,26,143,56,48,81,42,31,204,189,217,179,222,144,209,243,250,85,234,65,174,82,136,60,53,207,111,86,237,20,47,28,132,3,153,77,149,82,4,63,228,105,205,113,9,137,34,227,194,237,91,243,230,83,2,243,192,199,42,236,123,174,139,38,4,3,65,49,68,33,6,57,54,93,140,26,68,34,209,98,2,96,102,62,203,82,36,25,172,99,19,17,57,17,217,0,144,119,76,123,246,82,4,61,235,43,95,53,35,60,4,143,33,85,64,201,5,67,8,3,181,172,231,190,186,210,13,146,47,177,104,102,8,66,170,130,228,43,255,189,155,168,47,8,0,28,26,75,117,83,72,82,117,173,61,70,157,31,3,243,255,155,18,8,25,206,77,1,163,120,59,111,238,223,162,121,11,21,8,160,8,66,44,137,100,189,106,175,166,80,237,165,111,95,37,90,178,83,72,8,44,151,47,143,235,168,117,206,186,173,99,18,192,67,168,3,176,217,190,101,182,118,126,20,147,19,32,2,126,83,40,0,213,184,255,33,11,87,7,147,215,40,64,21,145,83,136,25,108,157,157,204,36,219,238,164,48,83,151,110,65,223,233,147,161,212,51,215,172,199,38,12,33,26,164,21,63,82,16,95,140,185,183,161,172,242,197,122,229,100,71,229,152,82,208,44,140,86,91,33,156,251,218,123,249,134,206,132,63,67,16,61,140,49,15,215,107,247,170,75,55,231,23,235,130,66,106,208,196,222,33,28,157,45,161,137,46,175,0,111,8,67,200,24,131,35,198,255,188,105,165,36,224,144,214,143,122,83,168,0,195,107,147,239,214,206,131,7,0,180,76,229,61,66,2,27,124,47,127,153,92,252,153,154,10,96,97,156,209,82,2,125,234,206,53,91,209,7,181,234,167,186,211,127,82,83,72,129,161,167,167,203,79,77,15,233,50,59,155,133,8,66,176,45,236,252,103,35,220,217,231,187,13,162,199,39,192,222,237,11,35,109,186,189,223,161,39,150,89,225,95,128,248,82,44,1,224,104,230,50,74,122,17,190,186,100,72,79,57,83,232,128,33,39,11,205,228,40,11,79,192,150,172,224,57,67,2,243,195,92,72,77,187,85,189,29,72,110,12,110,32,67,136,59,48,63,39,239,191,62,125,134,20,23,185,224,108,66,240,99,105,221,212,156,59,117,205,239,43,40,116,216,79,33,6,135,30,190,12,63,178,190,13,56,102,127,181,228,94,67,232,13,181,236,117,122,250,32,159,68,165,99,160,34,65,67,2,227,38,166,100,11,2,0,141,149,104,119,45,231,163,82,48,202,106,91,242,158,238,251,156,57,106,186,144,58,172,82,240,158,230,127,251,242,219,173,117,169,80,76,120,181,28,67,2,229,39,158,230,139,162,99,154,22,96,89,225,169,164,33,6,11,42,177,148,217,172,108,2,64,249,87,130,236,203,33,6,59,108,93,148,73,179,91,54,239,111,229,121,149,0,65,74,39,44,79,206,186,187,181,209,153,84,242,174,30,22,83,112,210,34,201,246,226,18,158,9,116,247,67,19,108,224,83,72,0,108,147,223,222,59,203,125,47,48,138,230,11,118,83,168,18,44,123,93,9,222,249,230,249,7,180,205,98,208,82,2,31,242,23,187,218,0,9,243,35,106,75,185,21,148,83,176,177,102,182,158,245,79,250,45,170,240,194,115,46,252,83,144,185,170,247,94,190,118,253,138,248,140,13,42,88,245,81,42,203,196,179,126,189,230,97,26,134,185,247,170,5,176,82,104,5,163,160,178,181,249,52,47,27,82,128,42,250,109,66,42,149,196,46,238,190,141,12,156,176,123,149,30,117,225,82,140,100,192,234,244,51,70,120,5,88,63,215,68,131,206,83,40,162,161,137,43,235,198,200,12,106,168,132,64,187,166, +65,202,19,108,217,214,122,174,36,39,45,191,147,174,201,49,65,42,104,236,190,175,227,255,118,67,32,110,241,53,6,138,82,72,74,48,34,185,42,180,168,170,218,0,231,162,124,110,67,196,74,243,108,153,150,27,194,18,130,74,42,96,212,67,34,172,48,245,157,111,174,141,28,38,13,221,96,248,167,183,83,72,200,33,227,4,203,71,43,15,218,78,118,123,74,11,83,8,9,213,217,43,73,59,23,7,23,56,208,197,218,199,67,196,206,83,69,153,128,233,191,169,111,143,203,229,74,253,83,144,160,166,255,238,228,221,186,43,128,153,159,9,124,243,82,4,55,178,153,159,195,142,0,121,132,202,8,162,189,218,65,138,147,100,247,60,26,153,117,6,8,113,137,6,54,78,49,6,147,134,51,145,221,187,220,222,7,3,120,71,2,95,66,42,159,242,116,62,230,5,25,240,89,136,162,25,239,145,67,8,16,149,165,182,236,250,224,135,66,244,67,87,34,36,83,72,41,99,186,186,77,123,53,131,160,14,250,244,238,181,66,140,160,146,185,103,155,37,32,41,232,101,96,111,151,250,83,232,13,245,254,127,166,46,125,3,225,140,139,183,88,17,82,4,23,115,235,157,177,124,190,15,220,81,96,236,2,133,82,2,231,232,138,61,81,229,42,64,134,130,246,19,229,110,83,104,61,181,148,106,203,59,119,3,160,21,89,133,248,230,67,196,200,18,85,73,2,128,255,19,80,67,195,116,34,243,83,40,162,65,69,103,79,43,43,15,66,143,126,219,82,198,67,2,111,141,230,230,14,245,69,198,110,5,82,55,21,105,82,40,2,117,217,118,126,216,79,191,28,200,18,128,238,126,81,74,154,210,249,119,89,39,135,2,133,91,40,234,147,184,82,72,7,208,50,27,109,107,5,34,201,144,7,25,16,45,67,104,59,213,241,247,216,252,49,207,65,159,46,50,98,241,82,40,74,3,39,52,250,208,102,47,27,202,159,254,113,246,65,74,28,204,251,251,121,207,164,41,11,92,252,153,52,7,83,8,9,181,214,255,195,138,117,7,241,170,167,64,79,111,83,2,117,201,10,43,165,27,218,29,96,123,241,241,71,179,33,6,155,46,211,132,216,254,127,211,0,66,232,106,114,137,83,112,146,230,63,239,221,251,251,47,63,234,60,224,208,175,83,72,200,105,236,206,105,105,107,17,61,7,54,244,151,26,82,12,90,128,188,183,242,190,187,63,68,199,167,238,253,61,83,2,47,176,6,43,48,181,14,137,126,0,160,64,0,34,66,2,103,149,95,108,55,83,130,72,194,4,46,170,223,190,205,139,229,65,112,177,76,55,46,125,20,6,117,240,149,239,67,40,31,85,34,52,103,208,231,148,130,175,208,235,101,253,82,36,57,163,89,141,18,26,56,74,162,48,161,76,169,226,83,104,133,65,73,47,171,34,169,8,153,112,61,158,142,117,82,4,21,184,227,26,115,3,59,70,97,251,158,105,149,172,82,4,53,186,243,26,179,138,76,235,243,201,195,59,201,89,82,2,21,116,152,43,91,169,192,15,133,139,186,155,92,206,83,136,94,85,114,138,205,197,54,71,65,160,206,6,125,28,82,2,81,88,232,39,83,169,101,121,12,243,222,149,19,0,82,4,117,168,35,28,85,1,16,150,187,64,101,82,107,79,82,40,2,146,29,122,38,177,164,15,234,16,115,16,134,180,82,2,237,164,92,74,67,105,165,72,21,187,242,38,137,229,66,2,225,129,83,30,104,51,235,230,30,238,224,101,24,102,82,2,249,130,91,102,75,1,231,54,125,187,136,217,171,146,66,8,131,129,19,215,225,148,211,71,237,72,0,172,181,19,82,4,25,176,161,10,145,84,223,176,158,216,159,67,249,164,67,200,24,178,170,21,103,159,76,189,86,220,249,116,188,18,82,36,99,85,135,25,83,17,11,202,79,146,116,37,250,190,67,2,205,67,206,168,136,60,223,126,93,7,211,190,216,227,67,232,70,163,246,179,226,236,254,44,99,10,240,205,131,14,82,36,137,211,77,93,21,50,207,198,146,157,102,99,94,160,33,42,145,161,250,110,68,190,108,125,64,174,20,182,103,122,81,72,129,169,39,134,208,93,156,97,0,8,32,194,65,80,223,137,3,75,176,179,157,141,0,0,0,4,11,38,76,60, +34,42,252,34,0,32,0,224,174,26,255,255,206,248,86,131,51,80,67,67,88,152,24,0,160,187,23,73,74,59,40,117,50,40,2,13,0,0,0,153,160,110,182,40,0,196,101,244,51,40,2,13,0,0,192,141,233,20,63,1,2,99,202,180,66,40,132,161,54,205,106,231,249,31,0,129,0,0,252,247,95,145,12,25,0,0,146,98,191,157,167,28,35,0,112,116,51,40,2,13,0,0,128,60,206,5,180,0,0,149,31,130,19,208,15,225,107,255,11,0,0,244,187,9,152,47,57,75,33,42,2,13,0,0,92,248,146,23,15,16,161,16,18,159,222,17,215,10,160,5,194,24,246,118,87,90,8,0,240,13,33,42,2,13,0,0,124,176,68,167,28,2,41,8,73,179,82,40,252,145,48,7,144,187,30,125,6,0,0,224,74,79,35,144,19,17,0,0,30,164,22,194,137,161,64,154,240,91,49,42,2,9,0,0,0,81,36,226,43,33,105,193,181,95,206,217,156,220,94,176,144,79,181,42,165,23,160,0,48,254,35,144,12,25,0,80,16,21,199,23,143,34,0,48,152,104,34,80,67,227,158,169,232,3,0,128,124,241,149,42,192,157,66,8,191,129,81,78,51,220,116,22,0,129,0,0,131,195,50,16,13,17,0,0,48,198,172,214,247,13,138,148,86,114,50,208,143,166,223,155,106,0,0,12,118,186,1,128,44,80,51,40,2,13,0,0,160,167,116,169,198,32,82,176,185,69,1,210,15,35,170,225,99,1,0,160,198,3,146,112,137,252,51,40,2,13,0,0,0,59,50,70,212,0,16,155,51,51,67,232,25,147,229,6,0,225,252,119,34,0,0,8,156,217,19,80,67,3,31,172,242,2,0,0,107,109,149,141,176,25,50,42,2,9,0,0,112,143,210,25,34,164,123,231,97,229,51,40,2,13,0,0,224,164,204,141,172,0,18,167,34,74,19,80,67,67,183,201,166,3,0,0,10,97,150,188,174,55,1,42,2,13,0,0,0,68,19,84,166,248,162,238,227,89,34,80,67,51,151,109,248,0,0,128,106,177,147,0,54,166,33,42,2,13,0,0,176,169,29,109,24,0,196,76,96,153,49,42,2,13,0,0,108,169,200,50,0,0,48,111,101,198,34,80,67,99,109,117,25,5,0,128,74,235,149,0,12,1,33,42,2,13,0,0,28,186,252,181,31,0,136,216,16,173,34,16,13,29,0,96,124,188,98,31,38,171,4,10,246,86,50,16,13,25,0,0,111,236,124,160,250,12,34,208,60,115,33,42,2,13,0,0,112,209,69,239,30,0,96,74,215,127,34,16,13,25,0,0,98,140,180,142,89,222,34,0,53,164,33,42,2,13,0,0,144,137,220,110,8,17,9,236,122,30,34,42,2,13,0,0,35,166,20,6,136,36,55,14,83,92,66,40,252,177,104,21,0,225,121,247,186,14,0,0,217,131,51,40,2,13,0,0,64,60,198,39,229,0,0,238,26,240,49,42,2,13,0,0,38,169,199,54,64,18,129,250,127,85,223,41,2,13,0,0,32,222,94,175,29,1,0,64,131,77,82,8,63,53,203,114,241,186,15,0,1,2,0,0,254,109,34,42,2,9,0,0,128,174,213,141,68,140,174,56,46,108,35,40,2,33,0,32,0,160,149,117,22,151,164,148,240,23,19,42,2,13,0,0,32,19,42,99,25,192,211,198,115,63,33,42,2,13,0,0,44,84,195,33,14,0,233,12,113,86,19,40,2,13,0,0,0,72,135,98,232,132,2,64,118,27,34,144,19,21,0,0,150,121,174,41,22,155,132,0,114,39,34,44,2,13,0,0,38,62,89,38,0,0,242,78,0,238,1,42,2,13,0,0,0,112,18,43,76,181,226,141,117,52,34,208,15,19,30,124,228,0,0,128,179,212,151,0,183,164,51,40,2,13,0,0,32,217,32,81,162,0,144,139,81,219,51,40,2,13,0,0,192,99,218,109,146,32,82,122,33,171,35,40,2,13,0,0,128,223,200,82,143,71,0,154,238,69,33,42,2,13,0,0,204,128,198,162,24,18,65,125,198,226,51,40,2,13,0,0,224,140,230,48,138,0,0,38,240,134,81,72,74,149,6,20,225,71,48,15,0,240,39,0,232,201,206,137,25,13,0,0,0,0,110,218,155,104,64,170,170,202, diff --git a/screens/ms2/images/Untitled-2_converted.png b/screens/ms2/images/Untitled-2_converted.png new file mode 100644 index 0000000..02b4425 Binary files /dev/null and b/screens/ms2/images/Untitled-2_converted.png differ diff --git a/screens/ms2/ms2.ese b/screens/ms2/ms2.ese new file mode 100644 index 0000000..fe94917 --- /dev/null +++ b/screens/ms2/ms2.ese @@ -0,0 +1,74 @@ +{ + "content": [ + { + "converter": "Image", + "dataCompressed": false, + "dataStorage": "Embedded", + "destName": "images/Untitled-2", + "imageFormat": 37808, + "memoryAddress": 0, + "memoryLoaded": true, + "sourcePath": "D:/Projects/Embedded/AirsoftTracker/maps/home/tiles_ready/2/1/0.png.png" + }, + { + "converter": "Image", + "dataCompressed": false, + "dataStorage": "Embedded", + "destName": "images/0", + "imageFormat": 37808, + "memoryAddress": 157600, + "memoryLoaded": true, + "sourcePath": "D:/Projects/Embedded/AirsoftTracker/maps/home/tiles_ready/2/0/0.png.png" + } + ], + "coprocessor": [ + "CLEAR_COLOR_RGB(0, 0, 0)", + "CLEAR(1, 1, 1)", + "", + "", + "--ALPHA_FUNC(GEQUAL, 248)", + "CMD_SETBITMAP(157600, COMPRESSED_RGBA_ASTC_4x4_KHR, 242, 242)", + "BITMAP_SIZE(BILINEAR, BORDER, BORDER, 242, 242)", + "CMD_LOADIDENTITY()", + "CMD_SCALE(196608, 196608)", + "CMD_TRANSLATE(-13959168, 0)", + "CMD_SETMATRIX()", + "BEGIN(BITMAPS)", + "VERTEX2II(40, 0, 0, 0)", + "", + "CMD_SETBITMAP(0, COMPRESSED_RGBA_ASTC_4x4_KHR, 242, 242)", + "BITMAP_SIZE(BILINEAR, BORDER, BORDER, 242, 242)", + "CMD_LOADIDENTITY()", + "CMD_SCALE(196608, 196608)", + "CMD_TRANSLATE(1769472, 0)", + "CMD_SETMATRIX()", + "BEGIN(BITMAPS)", + "VERTEX2II(40, 0, 0, 0)", + "", + "BEGIN(POINTS)", + "COLOR_RGB(200,255,200)", + "COLOR_A(64\t)", + "POINT_SIZE(300)", + "VERTEX2II(162, 119, 0, 0)", + "END()", + "", + "", + "DISPLAY()", + "", + "", + "" + ], + "displayList": [ + "" + ], + "project": { + "device": 2069 + }, + "registers": { + "hSize": 320, + "macro": [ + "" + ], + "vSize": 240 + } +} diff --git a/screens/ms2/resources/0.png b/screens/ms2/resources/0.png new file mode 100644 index 0000000..c776c9f Binary files /dev/null and b/screens/ms2/resources/0.png differ diff --git a/screens/ms2/resources/Untitled-2.jpg b/screens/ms2/resources/Untitled-2.jpg new file mode 100644 index 0000000..988b33a Binary files /dev/null and b/screens/ms2/resources/Untitled-2.jpg differ diff --git a/scripts/config/agdnet.json b/scripts/config/agdnet.json new file mode 100644 index 0000000..6a75fe6 --- /dev/null +++ b/scripts/config/agdnet.json @@ -0,0 +1 @@ +{"freq":915,"bw":125,"sf":10,"cr":7,"preambleLength":8,"syncWord":49,"updateTimeout":10000} \ No newline at end of file diff --git a/scripts/config/main.json b/scripts/config/main.json new file mode 100644 index 0000000..3adb8ac --- /dev/null +++ b/scripts/config/main.json @@ -0,0 +1 @@ +{"id":1,"symbol":68,"radius":50,"name":"Player 1","units":0,"tz":"EST5EDT,M3.2.0,M11.1.0","screenIdleTimeout":90000,"reportInterval":500,"useVibration":true,"vibrationTime":200,"maxPeerTimeout":600,"t1":10000,"t2":150000,"t3":120000,"t4":0} \ No newline at end of file diff --git a/scripts/config/network.json b/scripts/config/network.json new file mode 100644 index 0000000..b62c157 --- /dev/null +++ b/scripts/config/network.json @@ -0,0 +1 @@ +{"freq":912,"bw":500,"sf":8,"cr":7,"preambleLength":8,"syncWord":100,"networkId":25,"password":"pwd"} \ No newline at end of file diff --git a/scripts/create_spiffs.bat b/scripts/create_spiffs.bat new file mode 100644 index 0000000..263c784 --- /dev/null +++ b/scripts/create_spiffs.bat @@ -0,0 +1 @@ +mkspiffs.exe -c .\config -a -s 61440 config.img \ No newline at end of file diff --git a/scripts/download_configs.bat b/scripts/download_configs.bat new file mode 100644 index 0000000..d01f500 --- /dev/null +++ b/scripts/download_configs.bat @@ -0,0 +1,2 @@ +esptool.exe -b 921600 read_flash 0x330000 61440 config.img +mkspiffs.exe -u config config.img \ No newline at end of file diff --git a/scripts/download_spiffs.bat b/scripts/download_spiffs.bat new file mode 100644 index 0000000..4791f15 --- /dev/null +++ b/scripts/download_spiffs.bat @@ -0,0 +1,2 @@ +esptool.exe -b 921600 read_flash 0x33F000 0x0C1000 spiffs.img +mkspiffs.exe -u spiffs spiffs.img \ No newline at end of file diff --git a/scripts/flash.bat b/scripts/flash.bat new file mode 100644 index 0000000..4dd375f --- /dev/null +++ b/scripts/flash.bat @@ -0,0 +1 @@ +esptool.exe -b 921600 write_flash 0x10000 ../.pio/build/tbeam-v101/firmware.bin \ No newline at end of file diff --git a/scripts/spiffs/at.png b/scripts/spiffs/at.png new file mode 100644 index 0000000..e2120d9 Binary files /dev/null and b/scripts/spiffs/at.png differ diff --git a/scripts/spiffs/gps.png b/scripts/spiffs/gps.png new file mode 100644 index 0000000..32fd7f0 Binary files /dev/null and b/scripts/spiffs/gps.png differ diff --git a/scripts/upload_config.bat b/scripts/upload_config.bat new file mode 100644 index 0000000..66ba1ee --- /dev/null +++ b/scripts/upload_config.bat @@ -0,0 +1,2 @@ +mkspiffs.exe -c .\config -a -s 61440 config.img +esptool.exe -b 921600 write_flash 0x330000 config.img \ No newline at end of file diff --git a/scripts/upload_spiff.bat b/scripts/upload_spiff.bat new file mode 100644 index 0000000..73f6c5c --- /dev/null +++ b/scripts/upload_spiff.bat @@ -0,0 +1,2 @@ +mkspiffs.exe -c .\spiffs -a -s 0x0C1000 spiffs.img +esptool.exe -b 921600 write_flash 0x33F000 spiffs.img \ No newline at end of file diff --git a/src/AHRS/Adafruit_AHRS_FusionInterface.h b/src/AHRS/Adafruit_AHRS_FusionInterface.h new file mode 100644 index 0000000..83dd1d2 --- /dev/null +++ b/src/AHRS/Adafruit_AHRS_FusionInterface.h @@ -0,0 +1,105 @@ +/*! + * @file Adafruit_AHRS_FusionInterface.h + * + * @section license License + * + * The MIT License (MIT) + * + * Copyright (c) 2020 Ha Thach (tinyusb.org) for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef ADAFRUIT_AHRS_FUSIONINTERFACE_H_ +#define ADAFRUIT_AHRS_FUSIONINTERFACE_H_ + +/*! + * @brief The common interface for the fusion algorithms. + */ +class Adafruit_AHRS_FusionInterface { +public: + /**************************************************************************/ + /*! + * @brief Initializes the sensor fusion filter. + * + * @param sampleFrequency The sensor sample rate in herz(samples per second). + */ + /**************************************************************************/ + virtual void begin(float sampleFrequency) = 0; + + /**************************************************************************/ + /*! + * @brief Updates the filter with new gyroscope, accelerometer, and + * magnetometer data. + * + * @param gx The gyroscope x axis. In DPS. + * @param gy The gyroscope y axis. In DPS. + * @param gz The gyroscope z axis. In DPS. + * @param ax The accelerometer x axis. In g. + * @param ay The accelerometer y axis. In g. + * @param az The accelerometer z axis. In g. + * @param mx The magnetometer x axis. In uT. + * @param my The magnetometer y axis. In uT. + * @param mz The magnetometer z axis. In uT. + */ + /**************************************************************************/ + virtual void update(float gx, float gy, float gz, float ax, float ay, + float az, float mx, float my, float mz, float dt) = 0; + + /**************************************************************************/ + /*! + * @brief Gets the current roll of the sensors. + * + * @return The current sensor roll. + */ + /**************************************************************************/ + virtual float getRoll() = 0; + + /**************************************************************************/ + /*! + * @brief Gets the current pitch of the sensors. + * + * @return The current sensor pitch. + */ + /**************************************************************************/ + virtual float getPitch() = 0; + + /**************************************************************************/ + /*! + * @brief Gets the current yaw of the sensors. + * + * @return The current sensor yaw. + */ + /**************************************************************************/ + virtual float getYaw() = 0; + virtual void getQuaternion(float *w, float *x, float *y, float *z) = 0; + virtual void setQuaternion(float w, float x, float y, float z) = 0; + + /**************************************************************************/ + /*! + * @brief Gets the current gravity vector of the sensor. + * + * @param x A float pointer to write the gravity vector x component to. In g. + * @param y A float pointer to write the gravity vector y component to. In g. + * @param z A float pointer to write the gravity vector z component to. In g. + */ + virtual void getGravityVector(float *x, float *y, float *z) = 0; +}; + +#endif /* ADAFRUIT_AHRS_FUSIONINTERFACE_H_ */ diff --git a/src/AHRS/Adafruit_AHRS_Madgwick.cpp b/src/AHRS/Adafruit_AHRS_Madgwick.cpp new file mode 100644 index 0000000..8ed72ed --- /dev/null +++ b/src/AHRS/Adafruit_AHRS_Madgwick.cpp @@ -0,0 +1,296 @@ +//============================================================================================= +// Madgwick.c +//============================================================================================= +// +// Implementation of Madgwick's IMU and AHRS algorithms. +// See: http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms/ +// +// From the x-io website "Open-source resources available on this website are +// provided under the GNU General Public Licence unless an alternative licence +// is provided in source." +// +// Date Author Notes +// 29/09/2011 SOH Madgwick Initial release +// 02/10/2011 SOH Madgwick Optimised for reduced CPU load +// 19/02/2012 SOH Madgwick Magnetometer measurement is normalised +// +//============================================================================================= + +//------------------------------------------------------------------------------------------- +// Header files + +#include "Adafruit_AHRS_Madgwick.h" +#include + +//------------------------------------------------------------------------------------------- +// Definitions + +#define sampleFreqDef 100.0f // sample frequency in Hz +#define betaDef 0.5f // 2 * proportional gain + +//============================================================================================ +// Functions + +//------------------------------------------------------------------------------------------- +// AHRS algorithm update + +Adafruit_Madgwick::Adafruit_Madgwick() : Adafruit_Madgwick(betaDef) {} + +Adafruit_Madgwick::Adafruit_Madgwick(float gain) { + beta = gain; + q0 = 1.0f; + q1 = 0.0f; + q2 = 0.0f; + q3 = 0.0f; + invSampleFreq = 1.0f / sampleFreqDef; + anglesComputed = false; +} + +void Adafruit_Madgwick::update(float gx, float gy, float gz, float ax, float ay, + float az, float mx, float my, float mz, + float dt) { + float recipNorm; + float s0, s1, s2, s3; + float qDot1, qDot2, qDot3, qDot4; + float hx, hy; + float _2q0mx, _2q0my, _2q0mz, _2q1mx, _2bx, _2bz, _4bx, _4bz, _2q0, _2q1, + _2q2, _2q3, _2q0q2, _2q2q3, q0q0, q0q1, q0q2, q0q3, q1q1, q1q2, q1q3, + q2q2, q2q3, q3q3; + + // Use IMU algorithm if magnetometer measurement invalid (avoids NaN in + // magnetometer normalisation) + if ((mx == 0.0f) && (my == 0.0f) && (mz == 0.0f)) { + updateIMU(gx, gy, gz, ax, ay, az, dt); + return; + } + + // Convert gyroscope degrees/sec to radians/sec + //gx *= 0.0174533f; + //gy *= 0.0174533f; + //gz *= 0.0174533f; + + // Rate of change of quaternion from gyroscope + qDot1 = 0.5f * (-q1 * gx - q2 * gy - q3 * gz); + qDot2 = 0.5f * (q0 * gx + q2 * gz - q3 * gy); + qDot3 = 0.5f * (q0 * gy - q1 * gz + q3 * gx); + qDot4 = 0.5f * (q0 * gz + q1 * gy - q2 * gx); + + // Compute feedback only if accelerometer measurement valid (avoids NaN in + // accelerometer normalisation) + if (!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) { + + // Normalise accelerometer measurement + recipNorm = invSqrt(ax * ax + ay * ay + az * az); + ax *= recipNorm; + ay *= recipNorm; + az *= recipNorm; + + // Normalise magnetometer measurement + recipNorm = invSqrt(mx * mx + my * my + mz * mz); + mx *= recipNorm; + my *= recipNorm; + mz *= recipNorm; + + // Auxiliary variables to avoid repeated arithmetic + _2q0mx = 2.0f * q0 * mx; + _2q0my = 2.0f * q0 * my; + _2q0mz = 2.0f * q0 * mz; + _2q1mx = 2.0f * q1 * mx; + _2q0 = 2.0f * q0; + _2q1 = 2.0f * q1; + _2q2 = 2.0f * q2; + _2q3 = 2.0f * q3; + _2q0q2 = 2.0f * q0 * q2; + _2q2q3 = 2.0f * q2 * q3; + q0q0 = q0 * q0; + q0q1 = q0 * q1; + q0q2 = q0 * q2; + q0q3 = q0 * q3; + q1q1 = q1 * q1; + q1q2 = q1 * q2; + q1q3 = q1 * q3; + q2q2 = q2 * q2; + q2q3 = q2 * q3; + q3q3 = q3 * q3; + + // Reference direction of Earth's magnetic field + hx = mx * q0q0 - _2q0my * q3 + _2q0mz * q2 + mx * q1q1 + _2q1 * my * q2 + + _2q1 * mz * q3 - mx * q2q2 - mx * q3q3; + hy = _2q0mx * q3 + my * q0q0 - _2q0mz * q1 + _2q1mx * q2 - my * q1q1 + + my * q2q2 + _2q2 * mz * q3 - my * q3q3; + _2bx = sqrtf(hx * hx + hy * hy); + _2bz = -_2q0mx * q2 + _2q0my * q1 + mz * q0q0 + _2q1mx * q3 - mz * q1q1 + + _2q2 * my * q3 - mz * q2q2 + mz * q3q3; + _4bx = 2.0f * _2bx; + _4bz = 2.0f * _2bz; + + // Gradient decent algorithm corrective step + s0 = -_2q2 * (2.0f * q1q3 - _2q0q2 - ax) + + _2q1 * (2.0f * q0q1 + _2q2q3 - ay) - + _2bz * q2 * (_2bx * (0.5f - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + + (-_2bx * q3 + _2bz * q1) * + (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + + _2bx * q2 * (_2bx * (q0q2 + q1q3) + _2bz * (0.5f - q1q1 - q2q2) - mz); + s1 = _2q3 * (2.0f * q1q3 - _2q0q2 - ax) + + _2q0 * (2.0f * q0q1 + _2q2q3 - ay) - + 4.0f * q1 * (1 - 2.0f * q1q1 - 2.0f * q2q2 - az) + + _2bz * q3 * (_2bx * (0.5f - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + + (_2bx * q2 + _2bz * q0) * + (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + + (_2bx * q3 - _4bz * q1) * + (_2bx * (q0q2 + q1q3) + _2bz * (0.5f - q1q1 - q2q2) - mz); + s2 = -_2q0 * (2.0f * q1q3 - _2q0q2 - ax) + + _2q3 * (2.0f * q0q1 + _2q2q3 - ay) - + 4.0f * q2 * (1 - 2.0f * q1q1 - 2.0f * q2q2 - az) + + (-_4bx * q2 - _2bz * q0) * + (_2bx * (0.5f - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + + (_2bx * q1 + _2bz * q3) * + (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + + (_2bx * q0 - _4bz * q2) * + (_2bx * (q0q2 + q1q3) + _2bz * (0.5f - q1q1 - q2q2) - mz); + s3 = _2q1 * (2.0f * q1q3 - _2q0q2 - ax) + + _2q2 * (2.0f * q0q1 + _2q2q3 - ay) + + (-_4bx * q3 + _2bz * q1) * + (_2bx * (0.5f - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + + (-_2bx * q0 + _2bz * q2) * + (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + + _2bx * q1 * (_2bx * (q0q2 + q1q3) + _2bz * (0.5f - q1q1 - q2q2) - mz); + recipNorm = invSqrt(s0 * s0 + s1 * s1 + s2 * s2 + + s3 * s3); // normalise step magnitude + s0 *= recipNorm; + s1 *= recipNorm; + s2 *= recipNorm; + s3 *= recipNorm; + + // Apply feedback step + qDot1 -= beta * s0; + qDot2 -= beta * s1; + qDot3 -= beta * s2; + qDot4 -= beta * s3; + } + + // Integrate rate of change of quaternion to yield quaternion + q0 += qDot1 * dt; + q1 += qDot2 * dt; + q2 += qDot3 * dt; + q3 += qDot4 * dt; + + // Normalise quaternion + recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3); + q0 *= recipNorm; + q1 *= recipNorm; + q2 *= recipNorm; + q3 *= recipNorm; + anglesComputed = 0; +} + +//------------------------------------------------------------------------------------------- +// IMU algorithm update + +void Adafruit_Madgwick::updateIMU(float gx, float gy, float gz, float ax, + float ay, float az, float dt) { + float recipNorm; + float s0, s1, s2, s3; + float qDot1, qDot2, qDot3, qDot4; + float _2q0, _2q1, _2q2, _2q3, _4q0, _4q1, _4q2, _8q1, _8q2, q0q0, q1q1, q2q2, + q3q3; + + // Convert gyroscope degrees/sec to radians/sec + //gx *= 0.0174533f; + //gy *= 0.0174533f; + //gz *= 0.0174533f; + + // Rate of change of quaternion from gyroscope + qDot1 = 0.5f * (-q1 * gx - q2 * gy - q3 * gz); + qDot2 = 0.5f * (q0 * gx + q2 * gz - q3 * gy); + qDot3 = 0.5f * (q0 * gy - q1 * gz + q3 * gx); + qDot4 = 0.5f * (q0 * gz + q1 * gy - q2 * gx); + + // Compute feedback only if accelerometer measurement valid (avoids NaN in + // accelerometer normalisation) + if (!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) { + + // Normalise accelerometer measurement + recipNorm = invSqrt(ax * ax + ay * ay + az * az); + ax *= recipNorm; + ay *= recipNorm; + az *= recipNorm; + + // Auxiliary variables to avoid repeated arithmetic + _2q0 = 2.0f * q0; + _2q1 = 2.0f * q1; + _2q2 = 2.0f * q2; + _2q3 = 2.0f * q3; + _4q0 = 4.0f * q0; + _4q1 = 4.0f * q1; + _4q2 = 4.0f * q2; + _8q1 = 8.0f * q1; + _8q2 = 8.0f * q2; + q0q0 = q0 * q0; + q1q1 = q1 * q1; + q2q2 = q2 * q2; + q3q3 = q3 * q3; + + // Gradient decent algorithm corrective step + s0 = _4q0 * q2q2 + _2q2 * ax + _4q0 * q1q1 - _2q1 * ay; + s1 = _4q1 * q3q3 - _2q3 * ax + 4.0f * q0q0 * q1 - _2q0 * ay - _4q1 + + _8q1 * q1q1 + _8q1 * q2q2 + _4q1 * az; + s2 = 4.0f * q0q0 * q2 + _2q0 * ax + _4q2 * q3q3 - _2q3 * ay - _4q2 + + _8q2 * q1q1 + _8q2 * q2q2 + _4q2 * az; + s3 = 4.0f * q1q1 * q3 - _2q1 * ax + 4.0f * q2q2 * q3 - _2q2 * ay; + recipNorm = invSqrt(s0 * s0 + s1 * s1 + s2 * s2 + + s3 * s3); // normalise step magnitude + s0 *= recipNorm; + s1 *= recipNorm; + s2 *= recipNorm; + s3 *= recipNorm; + + // Apply feedback step + qDot1 -= beta * s0; + qDot2 -= beta * s1; + qDot3 -= beta * s2; + qDot4 -= beta * s3; + } + + // Integrate rate of change of quaternion to yield quaternion + q0 += qDot1 * dt; + q1 += qDot2 * dt; + q2 += qDot3 * dt; + q3 += qDot4 * dt; + + // Normalise quaternion + recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3); + q0 *= recipNorm; + q1 *= recipNorm; + q2 *= recipNorm; + q3 *= recipNorm; + anglesComputed = 0; +} + + +//------------------------------------------------------------------------------------------- +// Fast inverse square-root +// See: http://en.wikipedia.org/wiki/Fast_inverse_square_root + +float Adafruit_Madgwick::invSqrt(float x) { + float halfx = 0.5f * x; + float y = x; + long i = *(long *)&y; + i = 0x5f3759df - (i >> 1); + y = *(float *)&i; + y = y * (1.5f - (halfx * y * y)); + y = y * (1.5f - (halfx * y * y)); + return y; +} + +//------------------------------------------------------------------------------------------- + +void Adafruit_Madgwick::computeAngles() { + roll = atan2f(q0 * q1 + q2 * q3, 0.5f - q1 * q1 - q2 * q2); + pitch = asinf(-2.0f * (q1 * q3 - q0 * q2)); + yaw = atan2f(q1 * q2 + q0 * q3, 0.5f - q2 * q2 - q3 * q3); + grav[0] = 2.0f * (q1 * q3 - q0 * q2); + grav[1] = 2.0f * (q0 * q1 + q2 * q3); + grav[2] = 2.0f * (q1 * q0 - 0.5f + q3 * q3); + anglesComputed = 1; +} diff --git a/src/AHRS/Adafruit_AHRS_Madgwick.h b/src/AHRS/Adafruit_AHRS_Madgwick.h new file mode 100644 index 0000000..7c30fac --- /dev/null +++ b/src/AHRS/Adafruit_AHRS_Madgwick.h @@ -0,0 +1,105 @@ +//============================================================================================= +// Madgwick.h +//============================================================================================= +// +// Implementation of Madgwick's IMU and AHRS algorithms. +// See: http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms/ +// +// From the x-io website "Open-source resources available on this website are +// provided under the GNU General Public Licence unless an alternative licence +// is provided in source." +// +// Date Author Notes +// 29/09/2011 SOH Madgwick Initial release +// 02/10/2011 SOH Madgwick Optimised for reduced CPU load +// +//============================================================================================= +#ifndef __Adafruit_Madgwick_h__ +#define __Adafruit_Madgwick_h__ + +#include "Adafruit_AHRS_FusionInterface.h" +#include + +//-------------------------------------------------------------------------------------------- +// Variable declaration +class Adafruit_Madgwick : public Adafruit_AHRS_FusionInterface { +private: + static float invSqrt(float x); + float beta; // algorithm gain + float q0; + float q1; + float q2; + float q3; // quaternion of sensor frame relative to auxiliary frame + float invSampleFreq; + float roll, pitch, yaw; + float grav[3]; + bool anglesComputed = false; + void computeAngles(); + + //------------------------------------------------------------------------------------------- + // Function declarations +public: + Adafruit_Madgwick(); + Adafruit_Madgwick(float gain); + void begin(float sampleFrequency) { invSampleFreq = 1.0f / sampleFrequency; } + void update(float gx, float gy, float gz, float ax, float ay, float az, + float mx, float my, float mz, float dt); + void updateIMU(float gx, float gy, float gz, float ax, float ay, float az, + float dt); + // float getPitch(){return atan2f(2.0f * q2 * q3 - 2.0f * q0 * q1, 2.0f * q0 * + // q0 + 2.0f * q3 * q3 - 1.0f);}; float getRoll(){return -1.0f * asinf(2.0f * + // q1 * q3 + 2.0f * q0 * q2);}; float getYaw(){return atan2f(2.0f * q1 * q2 + // - 2.0f * q0 * q3, 2.0f * q0 * q0 + 2.0f * q1 * q1 - 1.0f);}; + float getBeta() { return beta; } + void setBeta(float beta) { this->beta = beta; } + float getRoll() { + if (!anglesComputed) + computeAngles(); + return roll * 57.29578f; + } + float getPitch() { + if (!anglesComputed) + computeAngles(); + return pitch * 57.29578f; + } + float getYaw() { + if (!anglesComputed) + computeAngles(); + return yaw * 57.29578f + 180.0f; + } + float getRollRadians() { + if (!anglesComputed) + computeAngles(); + return roll; + } + float getPitchRadians() { + if (!anglesComputed) + computeAngles(); + return pitch; + } + float getYawRadians() { + if (!anglesComputed) + computeAngles(); + return yaw; + } + void getQuaternion(float *w, float *x, float *y, float *z) { + *w = q0; + *x = q1; + *y = q2; + *z = q3; + } + void setQuaternion(float w, float x, float y, float z) { + q0 = w; + q1 = x; + q2 = y; + q3 = z; + } + void getGravityVector(float *x, float *y, float *z) { + if (!anglesComputed) + computeAngles(); + *x = grav[0]; + *y = grav[1]; + *z = grav[2]; + } +}; +#endif diff --git a/src/AHRS/Adafruit_AHRS_Mahony.cpp b/src/AHRS/Adafruit_AHRS_Mahony.cpp new file mode 100644 index 0000000..1a00be6 --- /dev/null +++ b/src/AHRS/Adafruit_AHRS_Mahony.cpp @@ -0,0 +1,277 @@ +//============================================================================================= +// Adafruit_Mahony.c +//============================================================================================= +// +// Madgwick's implementation of Mayhony's AHRS algorithm. +// See: http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms/ +// +// From the x-io website "Open-source resources available on this website are +// provided under the GNU General Public Licence unless an alternative licence +// is provided in source." +// +// Date Author Notes +// 29/09/2011 SOH Madgwick Initial release +// 02/10/2011 SOH Madgwick Optimised for reduced CPU load +// +// Algorithm paper: +// http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=4608934&url=http%3A%2F%2Fieeexplore.ieee.org%2Fstamp%2Fstamp.jsp%3Ftp%3D%26arnumber%3D4608934 +// +//============================================================================================= + +//------------------------------------------------------------------------------------------- +// Header files + +#include "Adafruit_AHRS_Mahony.h" +#include + +//------------------------------------------------------------------------------------------- +// Definitions + +#define DEFAULT_SAMPLE_FREQ 100.0f // sample frequency in Hz +#define twoKpDef (2.0f * 12.5f) // 2 * proportional gain +#define twoKiDef (2.0f * 0.0f) // 2 * integral gain + +//============================================================================================ +// Functions + +//------------------------------------------------------------------------------------------- +// AHRS algorithm update + +Adafruit_Mahony::Adafruit_Mahony() : Adafruit_Mahony(twoKpDef, twoKiDef) {} + +Adafruit_Mahony::Adafruit_Mahony(float prop_gain, float int_gain) { + twoKp = prop_gain; // 2 * proportional gain (Kp) + twoKi = int_gain; // 2 * integral gain (Ki) + q0 = 1.0f; + q1 = 0.0f; + q2 = 0.0f; + q3 = 0.0f; + integralFBx = 0.0f; + integralFBy = 0.0f; + integralFBz = 0.0f; + anglesComputed = false; + invSampleFreq = 1.0f / DEFAULT_SAMPLE_FREQ; +} + +void Adafruit_Mahony::update(float gx, float gy, float gz, float ax, float ay, + float az, float mx, float my, float mz, float dt) { + float recipNorm; + float q0q0, q0q1, q0q2, q0q3, q1q1, q1q2, q1q3, q2q2, q2q3, q3q3; + float hx, hy, bx, bz; + float halfvx, halfvy, halfvz, halfwx, halfwy, halfwz; + float halfex, halfey, halfez; + float qa, qb, qc; + + // Use IMU algorithm if magnetometer measurement invalid + // (avoids NaN in magnetometer normalisation) + if ((mx == 0.0f) && (my == 0.0f) && (mz == 0.0f)) { + updateIMU(gx, gy, gz, ax, ay, az, dt); + return; + } + + // Convert gyroscope degrees/sec to radians/sec + //gx *= 0.0174533f; + //gy *= 0.0174533f; + //gz *= 0.0174533f; + + // Compute feedback only if accelerometer measurement valid + // (avoids NaN in accelerometer normalisation) + if (!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) { + + // Normalise accelerometer measurement + recipNorm = invSqrt(ax * ax + ay * ay + az * az); + ax *= recipNorm; + ay *= recipNorm; + az *= recipNorm; + + // Normalise magnetometer measurement + recipNorm = invSqrt(mx * mx + my * my + mz * mz); + mx *= recipNorm; + my *= recipNorm; + mz *= recipNorm; + + // Auxiliary variables to avoid repeated arithmetic + q0q0 = q0 * q0; + q0q1 = q0 * q1; + q0q2 = q0 * q2; + q0q3 = q0 * q3; + q1q1 = q1 * q1; + q1q2 = q1 * q2; + q1q3 = q1 * q3; + q2q2 = q2 * q2; + q2q3 = q2 * q3; + q3q3 = q3 * q3; + + // Reference direction of Earth's magnetic field + hx = 2.0f * + (mx * (0.5f - q2q2 - q3q3) + my * (q1q2 - q0q3) + mz * (q1q3 + q0q2)); + hy = 2.0f * + (mx * (q1q2 + q0q3) + my * (0.5f - q1q1 - q3q3) + mz * (q2q3 - q0q1)); + bx = sqrtf(hx * hx + hy * hy); + bz = 2.0f * + (mx * (q1q3 - q0q2) + my * (q2q3 + q0q1) + mz * (0.5f - q1q1 - q2q2)); + + // Estimated direction of gravity and magnetic field + halfvx = q1q3 - q0q2; + halfvy = q0q1 + q2q3; + halfvz = q0q0 - 0.5f + q3q3; + halfwx = bx * (0.5f - q2q2 - q3q3) + bz * (q1q3 - q0q2); + halfwy = bx * (q1q2 - q0q3) + bz * (q0q1 + q2q3); + halfwz = bx * (q0q2 + q1q3) + bz * (0.5f - q1q1 - q2q2); + + // Error is sum of cross product between estimated direction + // and measured direction of field vectors + halfex = (ay * halfvz - az * halfvy) + (my * halfwz - mz * halfwy); + halfey = (az * halfvx - ax * halfvz) + (mz * halfwx - mx * halfwz); + halfez = (ax * halfvy - ay * halfvx) + (mx * halfwy - my * halfwx); + + // Compute and apply integral feedback if enabled + if (twoKi > 0.0f) { + // integral error scaled by Ki + integralFBx += twoKi * halfex * dt; + integralFBy += twoKi * halfey * dt; + integralFBz += twoKi * halfez * dt; + gx += integralFBx; // apply integral feedback + gy += integralFBy; + gz += integralFBz; + } else { + integralFBx = 0.0f; // prevent integral windup + integralFBy = 0.0f; + integralFBz = 0.0f; + } + + // Apply proportional feedback + gx += twoKp * halfex; + gy += twoKp * halfey; + gz += twoKp * halfez; + } + + // Integrate rate of change of quaternion + gx *= (0.5f * dt); // pre-multiply common factors + gy *= (0.5f * dt); + gz *= (0.5f * dt); + qa = q0; + qb = q1; + qc = q2; + q0 += (-qb * gx - qc * gy - q3 * gz); + q1 += (qa * gx + qc * gz - q3 * gy); + q2 += (qa * gy - qb * gz + q3 * gx); + q3 += (qa * gz + qb * gy - qc * gx); + + // Normalise quaternion + recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3); + q0 *= recipNorm; + q1 *= recipNorm; + q2 *= recipNorm; + q3 *= recipNorm; + anglesComputed = 0; +} + +//------------------------------------------------------------------------------------------- +// IMU algorithm update + +void Adafruit_Mahony::updateIMU(float gx, float gy, float gz, float ax, + float ay, float az, float dt) { + float recipNorm; + float halfvx, halfvy, halfvz; + float halfex, halfey, halfez; + float qa, qb, qc; + + // Convert gyroscope degrees/sec to radians/sec + //gx *= 0.0174533f; + //gy *= 0.0174533f; + //gz *= 0.0174533f; + + // Compute feedback only if accelerometer measurement valid + // (avoids NaN in accelerometer normalisation) + if (!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) { + + // Normalise accelerometer measurement + recipNorm = invSqrt(ax * ax + ay * ay + az * az); + ax *= recipNorm; + ay *= recipNorm; + az *= recipNorm; + + // Estimated direction of gravity + halfvx = q1 * q3 - q0 * q2; + halfvy = q0 * q1 + q2 * q3; + halfvz = q0 * q0 - 0.5f + q3 * q3; + + // Error is sum of cross product between estimated + // and measured direction of gravity + halfex = (ay * halfvz - az * halfvy); + halfey = (az * halfvx - ax * halfvz); + halfez = (ax * halfvy - ay * halfvx); + + // Compute and apply integral feedback if enabled + if (twoKi > 0.0f) { + // integral error scaled by Ki + integralFBx += twoKi * halfex * dt; + integralFBy += twoKi * halfey * dt; + integralFBz += twoKi * halfez * dt; + gx += integralFBx; // apply integral feedback + gy += integralFBy; + gz += integralFBz; + } else { + integralFBx = 0.0f; // prevent integral windup + integralFBy = 0.0f; + integralFBz = 0.0f; + } + + // Apply proportional feedback + gx += twoKp * halfex; + gy += twoKp * halfey; + gz += twoKp * halfez; + } + + // Integrate rate of change of quaternion + gx *= (0.5f * dt); // pre-multiply common factors + gy *= (0.5f * dt); + gz *= (0.5f * dt); + qa = q0; + qb = q1; + qc = q2; + q0 += (-qb * gx - qc * gy - q3 * gz); + q1 += (qa * gx + qc * gz - q3 * gy); + q2 += (qa * gy - qb * gz + q3 * gx); + q3 += (qa * gz + qb * gy - qc * gx); + + // Normalise quaternion + recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3); + q0 *= recipNorm; + q1 *= recipNorm; + q2 *= recipNorm; + q3 *= recipNorm; + anglesComputed = 0; +} + +//------------------------------------------------------------------------------------------- +// Fast inverse square-root +// See: http://en.wikipedia.org/wiki/Fast_inverse_square_root + +float Adafruit_Mahony::invSqrt(float x) { + float halfx = 0.5f * x; + float y = x; + long i = *(long *)&y; + i = 0x5f3759df - (i >> 1); + y = *(float *)&i; + y = y * (1.5f - (halfx * y * y)); + y = y * (1.5f - (halfx * y * y)); + return y; +} + +//------------------------------------------------------------------------------------------- + +void Adafruit_Mahony::computeAngles() { + roll = atan2f(q0 * q1 + q2 * q3, 0.5f - q1 * q1 - q2 * q2); + pitch = asinf(-2.0f * (q1 * q3 - q0 * q2)); + yaw = atan2f(q1 * q2 + q0 * q3, 0.5f - q2 * q2 - q3 * q3); + grav[0] = 2.0f * (q1 * q3 - q0 * q2); + grav[1] = 2.0f * (q0 * q1 + q2 * q3); + grav[2] = 2.0f * (q1 * q0 - 0.5f + q3 * q3); + anglesComputed = 1; +} + +//============================================================================================ +// END OF CODE +//============================================================================================ diff --git a/src/AHRS/Adafruit_AHRS_Mahony.h b/src/AHRS/Adafruit_AHRS_Mahony.h new file mode 100644 index 0000000..86c28c4 --- /dev/null +++ b/src/AHRS/Adafruit_AHRS_Mahony.h @@ -0,0 +1,103 @@ +//============================================================================================= +// Adafruit_AHRS_Mahony.h +//============================================================================================= +// +// Madgwick's implementation of Mayhony's AHRS algorithm. +// See: http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms/ +// +// Date Author Notes +// 29/09/2011 SOH Madgwick Initial release +// 02/10/2011 SOH Madgwick Optimised for reduced CPU load +// +//============================================================================================= +#ifndef __Adafruit_Mahony_h__ +#define __Adafruit_Mahony_h__ + +#include "Adafruit_AHRS_FusionInterface.h" +#include + +//-------------------------------------------------------------------------------------------- +// Variable declaration + +class Adafruit_Mahony : public Adafruit_AHRS_FusionInterface { +private: + float twoKp; // 2 * proportional gain (Kp) + float twoKi; // 2 * integral gain (Ki) + float q0, q1, q2, + q3; // quaternion of sensor frame relative to auxiliary frame + float integralFBx, integralFBy, + integralFBz; // integral error terms scaled by Ki + float invSampleFreq; + float roll, pitch, yaw; + float grav[3]; + bool anglesComputed = false; + static float invSqrt(float x); + void computeAngles(); + + //------------------------------------------------------------------------------------------- + // Function declarations + +public: + Adafruit_Mahony(); + Adafruit_Mahony(float prop_gain, float int_gain); + void begin(float sampleFrequency) { invSampleFreq = 1.0f / sampleFrequency; } + void update(float gx, float gy, float gz, float ax, float ay, float az, + float mx, float my, float mz, float dt); + void updateIMU(float gx, float gy, float gz, float ax, float ay, float az, + float dt); + float getKp() { return twoKp / 2.0f; } + void setKp(float Kp) { twoKp = 2.0f * Kp; } + float getKi() { return twoKi / 2.0f; } + void setKi(float Ki) { twoKi = 2.0f * Ki; } + float getRoll() { + if (!anglesComputed) + computeAngles(); + return roll * 57.29578f; + } + float getPitch() { + if (!anglesComputed) + computeAngles(); + return pitch * 57.29578f; + } + float getYaw() { + if (!anglesComputed) + computeAngles(); + return yaw * 57.29578f + 180.0f; + } + float getRollRadians() { + if (!anglesComputed) + computeAngles(); + return roll; + } + float getPitchRadians() { + if (!anglesComputed) + computeAngles(); + return pitch; + } + float getYawRadians() { + if (!anglesComputed) + computeAngles(); + return yaw; + } + void getQuaternion(float *w, float *x, float *y, float *z) { + *w = q0; + *x = q1; + *y = q2; + *z = q3; + } + void setQuaternion(float w, float x, float y, float z) { + q0 = w; + q1 = x; + q2 = y; + q3 = z; + } + void getGravityVector(float *x, float *y, float *z) { + if (!anglesComputed) + computeAngles(); + *x = grav[0]; + *y = grav[1]; + *z = grav[2]; + } +}; + +#endif diff --git a/src/AHRS/MadgwickAHRS.cpp b/src/AHRS/MadgwickAHRS.cpp new file mode 100644 index 0000000..1631b42 --- /dev/null +++ b/src/AHRS/MadgwickAHRS.cpp @@ -0,0 +1,251 @@ +//============================================================================================= +// MadgwickAHRS.c +//============================================================================================= +// +// Implementation of Madgwick's IMU and AHRS algorithms. +// See: http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms/ +// +// From the x-io website "Open-source resources available on this website are +// provided under the GNU General Public Licence unless an alternative licence +// is provided in source." +// +// Date Author Notes +// 29/09/2011 SOH Madgwick Initial release +// 02/10/2011 SOH Madgwick Optimised for reduced CPU load +// 19/02/2012 SOH Madgwick Magnetometer measurement is normalised +// +//============================================================================================= + +//------------------------------------------------------------------------------------------- +// Header files + +#include "MadgwickAHRS.h" +#include + +//------------------------------------------------------------------------------------------- +// Definitions + +#define sampleFreqDef 100.0f // sample frequency in Hz +#define betaDef 0.5f // 2 * proportional gain + + +//============================================================================================ +// Functions + +//------------------------------------------------------------------------------------------- +// AHRS algorithm update + +Madgwick::Madgwick() { + beta = betaDef; + q0 = 1.0f; + q1 = 0.0f; + q2 = 0.0f; + q3 = 0.0f; + invSampleFreq = 1.0f / sampleFreqDef; + anglesComputed = 0; +} + +void Madgwick::update(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz, float deltat) { + float recipNorm; + float s0, s1, s2, s3; + float qDot1, qDot2, qDot3, qDot4; + float hx, hy; + float _2q0mx, _2q0my, _2q0mz, _2q1mx, _2bx, _2bz, _4bx, _4bz, _2q0, _2q1, _2q2, _2q3, _2q0q2, _2q2q3, q0q0, q0q1, q0q2, q0q3, q1q1, q1q2, q1q3, q2q2, q2q3, q3q3; + + // Use IMU algorithm if magnetometer measurement invalid (avoids NaN in magnetometer normalisation) + if((mx == 0.0f) && (my == 0.0f) && (mz == 0.0f)) { + updateIMU(gx, gy, gz, ax, ay, az); + return; + } + + // Convert gyroscope degrees/sec to radians/sec + //gx *= 0.0174533f; + //gy *= 0.0174533f; + //gz *= 0.0174533f; + + // Rate of change of quaternion from gyroscope + qDot1 = 0.5f * (-q1 * gx - q2 * gy - q3 * gz); + qDot2 = 0.5f * (q0 * gx + q2 * gz - q3 * gy); + qDot3 = 0.5f * (q0 * gy - q1 * gz + q3 * gx); + qDot4 = 0.5f * (q0 * gz + q1 * gy - q2 * gx); + + // Compute feedback only if accelerometer measurement valid (avoids NaN in accelerometer normalisation) + if(!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) { + + // Normalise accelerometer measurement + recipNorm = invSqrt(ax * ax + ay * ay + az * az); + ax *= recipNorm; + ay *= recipNorm; + az *= recipNorm; + + // Normalise magnetometer measurement + recipNorm = invSqrt(mx * mx + my * my + mz * mz); + mx *= recipNorm; + my *= recipNorm; + mz *= recipNorm; + + // Auxiliary variables to avoid repeated arithmetic + _2q0mx = 2.0f * q0 * mx; + _2q0my = 2.0f * q0 * my; + _2q0mz = 2.0f * q0 * mz; + _2q1mx = 2.0f * q1 * mx; + _2q0 = 2.0f * q0; + _2q1 = 2.0f * q1; + _2q2 = 2.0f * q2; + _2q3 = 2.0f * q3; + _2q0q2 = 2.0f * q0 * q2; + _2q2q3 = 2.0f * q2 * q3; + q0q0 = q0 * q0; + q0q1 = q0 * q1; + q0q2 = q0 * q2; + q0q3 = q0 * q3; + q1q1 = q1 * q1; + q1q2 = q1 * q2; + q1q3 = q1 * q3; + q2q2 = q2 * q2; + q2q3 = q2 * q3; + q3q3 = q3 * q3; + + // Reference direction of Earth's magnetic field + hx = mx * q0q0 - _2q0my * q3 + _2q0mz * q2 + mx * q1q1 + _2q1 * my * q2 + _2q1 * mz * q3 - mx * q2q2 - mx * q3q3; + hy = _2q0mx * q3 + my * q0q0 - _2q0mz * q1 + _2q1mx * q2 - my * q1q1 + my * q2q2 + _2q2 * mz * q3 - my * q3q3; + _2bx = sqrtf(hx * hx + hy * hy); + _2bz = -_2q0mx * q2 + _2q0my * q1 + mz * q0q0 + _2q1mx * q3 - mz * q1q1 + _2q2 * my * q3 - mz * q2q2 + mz * q3q3; + _4bx = 2.0f * _2bx; + _4bz = 2.0f * _2bz; + + // Gradient decent algorithm corrective step + s0 = -_2q2 * (2.0f * q1q3 - _2q0q2 - ax) + _2q1 * (2.0f * q0q1 + _2q2q3 - ay) - _2bz * q2 * (_2bx * (0.5f - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + (-_2bx * q3 + _2bz * q1) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + _2bx * q2 * (_2bx * (q0q2 + q1q3) + _2bz * (0.5f - q1q1 - q2q2) - mz); + s1 = _2q3 * (2.0f * q1q3 - _2q0q2 - ax) + _2q0 * (2.0f * q0q1 + _2q2q3 - ay) - 4.0f * q1 * (1 - 2.0f * q1q1 - 2.0f * q2q2 - az) + _2bz * q3 * (_2bx * (0.5f - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + (_2bx * q2 + _2bz * q0) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + (_2bx * q3 - _4bz * q1) * (_2bx * (q0q2 + q1q3) + _2bz * (0.5f - q1q1 - q2q2) - mz); + s2 = -_2q0 * (2.0f * q1q3 - _2q0q2 - ax) + _2q3 * (2.0f * q0q1 + _2q2q3 - ay) - 4.0f * q2 * (1 - 2.0f * q1q1 - 2.0f * q2q2 - az) + (-_4bx * q2 - _2bz * q0) * (_2bx * (0.5f - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + (_2bx * q1 + _2bz * q3) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + (_2bx * q0 - _4bz * q2) * (_2bx * (q0q2 + q1q3) + _2bz * (0.5f - q1q1 - q2q2) - mz); + s3 = _2q1 * (2.0f * q1q3 - _2q0q2 - ax) + _2q2 * (2.0f * q0q1 + _2q2q3 - ay) + (-_4bx * q3 + _2bz * q1) * (_2bx * (0.5f - q2q2 - q3q3) + _2bz * (q1q3 - q0q2) - mx) + (-_2bx * q0 + _2bz * q2) * (_2bx * (q1q2 - q0q3) + _2bz * (q0q1 + q2q3) - my) + _2bx * q1 * (_2bx * (q0q2 + q1q3) + _2bz * (0.5f - q1q1 - q2q2) - mz); + recipNorm = invSqrt(s0 * s0 + s1 * s1 + s2 * s2 + s3 * s3); // normalise step magnitude + s0 *= recipNorm; + s1 *= recipNorm; + s2 *= recipNorm; + s3 *= recipNorm; + + // Apply feedback step + qDot1 -= beta * s0; + qDot2 -= beta * s1; + qDot3 -= beta * s2; + qDot4 -= beta * s3; + } + + // Integrate rate of change of quaternion to yield quaternion + q0 += qDot1 * deltat; + q1 += qDot2 * deltat; + q2 += qDot3 * deltat; + q3 += qDot4 * deltat; + + // Normalise quaternion + recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3); + q0 *= recipNorm; + q1 *= recipNorm; + q2 *= recipNorm; + q3 *= recipNorm; + anglesComputed = 0; +} + +//------------------------------------------------------------------------------------------- +// IMU algorithm update + +void Madgwick::updateIMU(float gx, float gy, float gz, float ax, float ay, float az) { + float recipNorm; + float s0, s1, s2, s3; + float qDot1, qDot2, qDot3, qDot4; + float _2q0, _2q1, _2q2, _2q3, _4q0, _4q1, _4q2 ,_8q1, _8q2, q0q0, q1q1, q2q2, q3q3; + + // Convert gyroscope degrees/sec to radians/sec + //gx *= 0.0174533f; + //gy *= 0.0174533f; + //gz *= 0.0174533f; + + // Rate of change of quaternion from gyroscope + qDot1 = 0.5f * (-q1 * gx - q2 * gy - q3 * gz); + qDot2 = 0.5f * (q0 * gx + q2 * gz - q3 * gy); + qDot3 = 0.5f * (q0 * gy - q1 * gz + q3 * gx); + qDot4 = 0.5f * (q0 * gz + q1 * gy - q2 * gx); + + // Compute feedback only if accelerometer measurement valid (avoids NaN in accelerometer normalisation) + if(!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) { + + // Normalise accelerometer measurement + recipNorm = invSqrt(ax * ax + ay * ay + az * az); + ax *= recipNorm; + ay *= recipNorm; + az *= recipNorm; + + // Auxiliary variables to avoid repeated arithmetic + _2q0 = 2.0f * q0; + _2q1 = 2.0f * q1; + _2q2 = 2.0f * q2; + _2q3 = 2.0f * q3; + _4q0 = 4.0f * q0; + _4q1 = 4.0f * q1; + _4q2 = 4.0f * q2; + _8q1 = 8.0f * q1; + _8q2 = 8.0f * q2; + q0q0 = q0 * q0; + q1q1 = q1 * q1; + q2q2 = q2 * q2; + q3q3 = q3 * q3; + + // Gradient decent algorithm corrective step + s0 = _4q0 * q2q2 + _2q2 * ax + _4q0 * q1q1 - _2q1 * ay; + s1 = _4q1 * q3q3 - _2q3 * ax + 4.0f * q0q0 * q1 - _2q0 * ay - _4q1 + _8q1 * q1q1 + _8q1 * q2q2 + _4q1 * az; + s2 = 4.0f * q0q0 * q2 + _2q0 * ax + _4q2 * q3q3 - _2q3 * ay - _4q2 + _8q2 * q1q1 + _8q2 * q2q2 + _4q2 * az; + s3 = 4.0f * q1q1 * q3 - _2q1 * ax + 4.0f * q2q2 * q3 - _2q2 * ay; + recipNorm = invSqrt(s0 * s0 + s1 * s1 + s2 * s2 + s3 * s3); // normalise step magnitude + s0 *= recipNorm; + s1 *= recipNorm; + s2 *= recipNorm; + s3 *= recipNorm; + + // Apply feedback step + qDot1 -= beta * s0; + qDot2 -= beta * s1; + qDot3 -= beta * s2; + qDot4 -= beta * s3; + } + + // Integrate rate of change of quaternion to yield quaternion + q0 += qDot1 * invSampleFreq; + q1 += qDot2 * invSampleFreq; + q2 += qDot3 * invSampleFreq; + q3 += qDot4 * invSampleFreq; + + // Normalise quaternion + recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3); + q0 *= recipNorm; + q1 *= recipNorm; + q2 *= recipNorm; + q3 *= recipNorm; + anglesComputed = 0; +} + +//------------------------------------------------------------------------------------------- +// Fast inverse square-root +// See: http://en.wikipedia.org/wiki/Fast_inverse_square_root + +float Madgwick::invSqrt(float x) { + float halfx = 0.5f * x; + float y = x; + long i = *(long*)&y; + i = 0x5f3759df - (i>>1); + y = *(float*)&i; + y = y * (1.5f - (halfx * y * y)); + y = y * (1.5f - (halfx * y * y)); + return y; +} + +//------------------------------------------------------------------------------------------- + +void Madgwick::computeAngles() +{ + roll = atan2f(q0*q1 + q2*q3, 0.5f - q1*q1 - q2*q2); + pitch = asinf(-2.0f * (q1*q3 - q0*q2)); + yaw = atan2f(q1*q2 + q0*q3, 0.5f - q2*q2 - q3*q3); + anglesComputed = 1; +} + diff --git a/src/AHRS/MadgwickAHRS.h b/src/AHRS/MadgwickAHRS.h new file mode 100644 index 0000000..3bcb406 --- /dev/null +++ b/src/AHRS/MadgwickAHRS.h @@ -0,0 +1,74 @@ +//============================================================================================= +// MadgwickAHRS.h +//============================================================================================= +// +// Implementation of Madgwick's IMU and AHRS algorithms. +// See: http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms/ +// +// From the x-io website "Open-source resources available on this website are +// provided under the GNU General Public Licence unless an alternative licence +// is provided in source." +// +// Date Author Notes +// 29/09/2011 SOH Madgwick Initial release +// 02/10/2011 SOH Madgwick Optimised for reduced CPU load +// +//============================================================================================= +#ifndef MadgwickAHRS_h +#define MadgwickAHRS_h +#include + +//-------------------------------------------------------------------------------------------- +// Variable declaration +class Madgwick{ +private: + static float invSqrt(float x); + float beta; // algorithm gain + float q0; + float q1; + float q2; + float q3; // quaternion of sensor frame relative to auxiliary frame + float invSampleFreq; + float roll; + float pitch; + float yaw; + char anglesComputed; + void computeAngles(); + +//------------------------------------------------------------------------------------------- +// Function declarations +public: + Madgwick(void); + void begin(float sampleFrequency) { invSampleFreq = 1.0f / sampleFrequency; } + void update(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz, float deltat); + void updateIMU(float gx, float gy, float gz, float ax, float ay, float az); + //float getPitch(){return atan2f(2.0f * q2 * q3 - 2.0f * q0 * q1, 2.0f * q0 * q0 + 2.0f * q3 * q3 - 1.0f);}; + //float getRoll(){return -1.0f * asinf(2.0f * q1 * q3 + 2.0f * q0 * q2);}; + //float getYaw(){return atan2f(2.0f * q1 * q2 - 2.0f * q0 * q3, 2.0f * q0 * q0 + 2.0f * q1 * q1 - 1.0f);}; + float getRoll() { + if (!anglesComputed) computeAngles(); + return roll * 57.29578f; + } + float getPitch() { + if (!anglesComputed) computeAngles(); + return pitch * 57.29578f; + } + float getYaw() { + if (!anglesComputed) computeAngles(); + return yaw * 57.29578f + 180.0f; + } + float getRollRadians() { + if (!anglesComputed) computeAngles(); + return roll; + } + float getPitchRadians() { + if (!anglesComputed) computeAngles(); + return pitch; + } + float getYawRadians() { + if (!anglesComputed) computeAngles(); + return yaw; + } +}; +#endif + diff --git a/src/AP_Declination/AP_Declination.cpp b/src/AP_Declination/AP_Declination.cpp new file mode 100644 index 0000000..5414eb7 --- /dev/null +++ b/src/AP_Declination/AP_Declination.cpp @@ -0,0 +1,101 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +/* + * Adam M Rivera + * With direction from: Andrew Tridgell, Jason Short, Justin Beech + * + * Adapted from: http://www.societyofrobots.com/robotforum/index.php?topic=11855.0 + * Scott Ferguson + * scottfromscott@gmail.com + * + */ +#include "AP_Declination.h" + +#include +#include + +/* + calculate magnetic field intensity and orientation +*/ +bool AP_Declination::get_mag_field_ef(float latitude_deg, float longitude_deg, float &declination_deg) +{ + bool valid_input_data = true; + + /* round down to nearest sampling resolution */ + int32_t min_lat = static_cast(static_cast(latitude_deg / SAMPLING_RES) * SAMPLING_RES); + int32_t min_lon = static_cast(static_cast(longitude_deg / SAMPLING_RES) * SAMPLING_RES); + + /* for the rare case of hitting the bounds exactly + * the rounding logic wouldn't fit, so enforce it. + */ + + /* limit to table bounds - required for maxima even when table spans full globe range */ + if (latitude_deg <= SAMPLING_MIN_LAT) { + min_lat = static_cast(SAMPLING_MIN_LAT); + valid_input_data = false; + } + + if (latitude_deg >= SAMPLING_MAX_LAT) { + min_lat = static_cast(static_cast(latitude_deg / SAMPLING_RES) * SAMPLING_RES - SAMPLING_RES); + valid_input_data = false; + } + + if (longitude_deg <= SAMPLING_MIN_LON) { + min_lon = static_cast(SAMPLING_MIN_LON); + valid_input_data = false; + } + + if (longitude_deg >= SAMPLING_MAX_LON) { + min_lon = static_cast(static_cast(longitude_deg / SAMPLING_RES) * SAMPLING_RES - SAMPLING_RES); + valid_input_data = false; + } + if(valid_input_data) + { + /* find index of nearest low sampling point */ + uint32_t min_lat_index = static_cast((-(SAMPLING_MIN_LAT) + min_lat) / SAMPLING_RES); + uint32_t min_lon_index = static_cast((-(SAMPLING_MIN_LON) + min_lon) / SAMPLING_RES); + + /* calculate declination */ + + float data_sw = declination_table[min_lat_index][min_lon_index]; + float data_se = declination_table[min_lat_index][min_lon_index + 1];; + float data_ne = declination_table[min_lat_index + 1][min_lon_index + 1]; + float data_nw = declination_table[min_lat_index + 1][min_lon_index]; + + /* perform bilinear interpolation on the four grid corners */ + + float data_min = ((longitude_deg - min_lon) / SAMPLING_RES) * (data_se - data_sw) + data_sw; + float data_max = ((longitude_deg - min_lon) / SAMPLING_RES) * (data_ne - data_nw) + data_nw; + + declination_deg = ((latitude_deg - min_lat) / SAMPLING_RES) * (data_max - data_min) + data_min; + } + return valid_input_data; +} + + +/* + calculate magnetic field intensity and orientation +*/ +float AP_Declination::get_declination(float latitude_deg, float longitude_deg) +{ + float declination_deg=0; + + if(get_mag_field_ef(latitude_deg, longitude_deg, declination_deg)) + return declination_deg; + else + return 0; +} + diff --git a/src/AP_Declination/AP_Declination.h b/src/AP_Declination/AP_Declination.h new file mode 100644 index 0000000..ab1afa7 --- /dev/null +++ b/src/AP_Declination/AP_Declination.h @@ -0,0 +1,32 @@ +#pragma once + +/* + magnetic data derived from WMM + */ +class AP_Declination +{ +public: + /* + * Calculates the magnetic intensity, declination and inclination at a given WGS-84 latitude and longitude. + * Assumes a WGS-84 height of zero + * latitude and longitude have units of degrees + * declination and inclination are returned in degrees + * intensity is returned in Gauss + * Boolean returns false if latitude and longitude are outside the valid input range of +-60 latitude and +-180 longitude + */ + static bool get_mag_field_ef(float latitude_deg, float longitude_deg, float &declination_deg); + + /* + get declination in degrees for a given latitude_deg and longitude_deg + */ + static float get_declination(float latitude_deg, float longitude_deg); + +private: + static const float SAMPLING_RES; + static const float SAMPLING_MIN_LAT; + static const float SAMPLING_MAX_LAT; + static const float SAMPLING_MIN_LON; + static const float SAMPLING_MAX_LON; + + static const float declination_table[37][73]; +}; diff --git a/src/AP_Declination/gen12.py b/src/AP_Declination/gen12.py new file mode 100644 index 0000000..e6382bb --- /dev/null +++ b/src/AP_Declination/gen12.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python3 +''' +generate field tables from IGRF12. Note that this requires python3 +''' + +import igrf12 as igrf +import numpy as np +import datetime +from pathlib import Path +from pymavlink.rotmat import Vector3, Matrix3 +import math + +import argparse +parser = argparse.ArgumentParser(description='generate mag tables') +parser.add_argument('--sampling-res', type=int, default=5, help='sampling resolution, degrees') +parser.add_argument('--check-error', action='store_true', help='check max error') +parser.add_argument('--filename', type=str, default='tables.cpp', help='tables file') + +args = parser.parse_args() + +if not Path("AP_Declination.h").is_file(): + raise OSError("Please run this tool from the AP_Declination directory") + + +def write_table(f,name, table): + '''write one table''' + f.write("const float AP_Declination::%s[%u][%u] = {\n" % + (name, NUM_LAT, NUM_LON)) + for i in range(NUM_LAT): + f.write(" {") + for j in range(NUM_LON): + f.write("%.5ff" % table[i][j]) + if j != NUM_LON-1: + f.write(",") + f.write("}") + if i != NUM_LAT-1: + f.write(",") + f.write("\n") + f.write("};\n\n") + +date = datetime.datetime.now() + +SAMPLING_RES = args.sampling_res +SAMPLING_MIN_LAT = -90 +SAMPLING_MAX_LAT = 90 +SAMPLING_MIN_LON = -180 +SAMPLING_MAX_LON = 180 + +lats = np.arange(SAMPLING_MIN_LAT, SAMPLING_MAX_LAT+SAMPLING_RES, SAMPLING_RES) +lons = np.arange(SAMPLING_MIN_LON, SAMPLING_MAX_LON+SAMPLING_RES, SAMPLING_RES) + +NUM_LAT = lats.size +NUM_LON = lons.size + +intensity_table = np.empty((NUM_LAT, NUM_LON)) +inclination_table = np.empty((NUM_LAT, NUM_LON)) +declination_table = np.empty((NUM_LAT, NUM_LON)) + +max_error = 0 +max_error_pos = None +max_error_field = None + +def get_igrf(lat, lon): + '''return field as [declination_deg, inclination_deg, intensity_gauss]''' + mag = igrf.igrf(date, glat=lat, glon=lon, alt_km=0., isv=0, itype=1) + intensity = float(mag.total/1e5) + inclination = float(mag.incl) + declination = float(mag.decl) + return [declination, inclination, intensity] + +def interpolate_table(table, latitude_deg, longitude_deg): + '''interpolate inside a table for a given lat/lon in degrees''' + # round down to nearest sampling resolution + min_lat = int(math.floor(latitude_deg / SAMPLING_RES) * SAMPLING_RES) + min_lon = int(math.floor(longitude_deg / SAMPLING_RES) * SAMPLING_RES) + + # find index of nearest low sampling point + min_lat_index = int(math.floor(-(SAMPLING_MIN_LAT) + min_lat) / SAMPLING_RES) + min_lon_index = int(math.floor(-(SAMPLING_MIN_LON) + min_lon) / SAMPLING_RES) + + # calculate intensity + data_sw = table[min_lat_index][min_lon_index] + data_se = table[min_lat_index][min_lon_index + 1] + data_ne = table[min_lat_index + 1][min_lon_index + 1] + data_nw = table[min_lat_index + 1][min_lon_index] + + # perform bilinear interpolation on the four grid corners + data_min = ((longitude_deg - min_lon) / SAMPLING_RES) * (data_se - data_sw) + data_sw + data_max = ((longitude_deg - min_lon) / SAMPLING_RES) * (data_ne - data_nw) + data_nw + + value = ((latitude_deg - min_lat) / SAMPLING_RES) * (data_max - data_min) + data_min + return value + + +''' +calculate magnetic field intensity and orientation, interpolating in tables + +returns array [declination_deg, inclination_deg, intensity] or None +''' +def interpolate_field(latitude_deg, longitude_deg): + # limit to table bounds + if latitude_deg < SAMPLING_MIN_LAT: + return None + if latitude_deg >= SAMPLING_MAX_LAT: + return None + if longitude_deg < SAMPLING_MIN_LON: + return None + if longitude_deg >= SAMPLING_MAX_LON: + return None + + intensity_gauss = interpolate_table(intensity_table, latitude_deg, longitude_deg) + declination_deg = interpolate_table(declination_table, latitude_deg, longitude_deg) + inclination_deg = interpolate_table(inclination_table, latitude_deg, longitude_deg) + + return [declination_deg, inclination_deg, intensity_gauss] + +def field_to_Vector3(mag): + '''return mGauss field from dec, inc and intensity''' + R = Matrix3() + mag_ef = Vector3(mag[2]*1000.0, 0.0, 0.0) + R.from_euler(0.0, -math.radians(mag[1]), math.radians(mag[0])) + return R * mag_ef + +def test_error(lat, lon): + '''check for error from lat,lon''' + global max_error, max_error_pos, max_error_field + mag1 = get_igrf(lat, lon) + mag2 = interpolate_field(lat, lon) + ef1 = field_to_Vector3(mag1) + ef2 = field_to_Vector3(mag2) + err = (ef1 - ef2).length() + if err > max_error or err > 100: + print(lat, lon, err, ef1, ef2) + max_error = err + max_error_pos = (lat, lon) + max_error_field = ef1 - ef2 + +def test_max_error(lat, lon): + '''check for maximum error from lat,lon over SAMPLING_RES range''' + steps = 3 + delta = SAMPLING_RES/steps + for i in range(steps): + for j in range(steps): + lat2 = lat + i * delta + lon2 = lon + j * delta + if lat2 >= SAMPLING_MAX_LAT or lon2 >= SAMPLING_MAX_LON: + continue + if lat2 <= SAMPLING_MIN_LAT or lon2 <= SAMPLING_MIN_LON: + continue + test_error(lat2, lon2) + +for i,lat in enumerate(lats): + for j,lon in enumerate(lons): + mag = get_igrf(lat, lon) + declination_table[i][j] = mag[0] + inclination_table[i][j] = mag[1] + intensity_table[i][j] = mag[2] + +with open(args.filename, 'w') as f: + f.write('''// this is an auto-generated file from the IGRF tables. Do not edit +// To re-generate run generate/generate.py + +#include "AP_Declination.h" + +''') + + f.write('''const float AP_Declination::SAMPLING_RES = %u; +const float AP_Declination::SAMPLING_MIN_LAT = %u; +const float AP_Declination::SAMPLING_MAX_LAT = %u; +const float AP_Declination::SAMPLING_MIN_LON = %u; +const float AP_Declination::SAMPLING_MAX_LON = %u; + +''' % (SAMPLING_RES, + SAMPLING_MIN_LAT, + SAMPLING_MAX_LAT, + SAMPLING_MIN_LON, + SAMPLING_MAX_LON)) + + + write_table(f,'declination_table', declination_table) +# write_table(f,'inclination_table', inclination_table) +# write_table(f,'intensity_table', intensity_table) + +if args.check_error: + print("Checking for maximum error") + for lat in range(-60,60,1): + for lon in range(-180,180,1): + test_max_error(lat, lon) + print("Generated with max error %.2f %s at (%.2f,%.2f)" % ( + max_error, max_error_field, max_error_pos[0], max_error_pos[1])) + +print("Table generated in %s" % args.filename) diff --git a/src/AP_Declination/gen13.py b/src/AP_Declination/gen13.py new file mode 100644 index 0000000..fce5ff7 --- /dev/null +++ b/src/AP_Declination/gen13.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python3 +''' +generate field tables from IGRF12. Note that this requires python3 +''' + +import igrf +import numpy as np +import datetime +from pathlib import Path +from pymavlink.rotmat import Vector3, Matrix3 +import math + +import argparse +parser = argparse.ArgumentParser(description='generate mag tables') +parser.add_argument('--sampling-res', type=int, default=5, help='sampling resolution, degrees') +parser.add_argument('--check-error', action='store_true', help='check max error') +parser.add_argument('--filename', type=str, default='tables.cpp', help='tables file') + +args = parser.parse_args() + +if not Path("AP_Declination.h").is_file(): + raise OSError("Please run this tool from the AP_Declination directory") + + +def write_table(f,name, table): + '''write one table''' + f.write("const float AP_Declination::%s[%u][%u] = {\n" % + (name, NUM_LAT, NUM_LON)) + for i in range(NUM_LAT): + f.write(" {") + for j in range(NUM_LON): + f.write("%.5ff" % table[i][j]) + if j != NUM_LON-1: + f.write(",") + f.write("}") + if i != NUM_LAT-1: + f.write(",") + f.write("\n") + f.write("};\n\n") + +date = datetime.datetime.now() + +SAMPLING_RES = args.sampling_res +SAMPLING_MIN_LAT = -90 +SAMPLING_MAX_LAT = 90 +SAMPLING_MIN_LON = -180 +SAMPLING_MAX_LON = 180 + +lats = np.arange(SAMPLING_MIN_LAT, SAMPLING_MAX_LAT+SAMPLING_RES, SAMPLING_RES) +lons = np.arange(SAMPLING_MIN_LON, SAMPLING_MAX_LON+SAMPLING_RES, SAMPLING_RES) + +NUM_LAT = lats.size +NUM_LON = lons.size + +intensity_table = np.empty((NUM_LAT, NUM_LON)) +inclination_table = np.empty((NUM_LAT, NUM_LON)) +declination_table = np.empty((NUM_LAT, NUM_LON)) + +max_error = 0 +max_error_pos = None +max_error_field = None + +def get_igrf(lat, lon): + '''return field as [declination_deg, inclination_deg, intensity_gauss]''' + mag = igrf.igrf(date, glat=lat, glon=lon, alt_km=0., isv=0, itype=1) + intensity = float(mag.total/1e5) + inclination = float(mag.incl) + declination = float(mag.decl) + return [declination, inclination, intensity] + +def interpolate_table(table, latitude_deg, longitude_deg): + '''interpolate inside a table for a given lat/lon in degrees''' + # round down to nearest sampling resolution + min_lat = int(math.floor(latitude_deg / SAMPLING_RES) * SAMPLING_RES) + min_lon = int(math.floor(longitude_deg / SAMPLING_RES) * SAMPLING_RES) + + # find index of nearest low sampling point + min_lat_index = int(math.floor(-(SAMPLING_MIN_LAT) + min_lat) / SAMPLING_RES) + min_lon_index = int(math.floor(-(SAMPLING_MIN_LON) + min_lon) / SAMPLING_RES) + + # calculate intensity + data_sw = table[min_lat_index][min_lon_index] + data_se = table[min_lat_index][min_lon_index + 1] + data_ne = table[min_lat_index + 1][min_lon_index + 1] + data_nw = table[min_lat_index + 1][min_lon_index] + + # perform bilinear interpolation on the four grid corners + data_min = ((longitude_deg - min_lon) / SAMPLING_RES) * (data_se - data_sw) + data_sw + data_max = ((longitude_deg - min_lon) / SAMPLING_RES) * (data_ne - data_nw) + data_nw + + value = ((latitude_deg - min_lat) / SAMPLING_RES) * (data_max - data_min) + data_min + return value + + +''' +calculate magnetic field intensity and orientation, interpolating in tables + +returns array [declination_deg, inclination_deg, intensity] or None +''' +def interpolate_field(latitude_deg, longitude_deg): + # limit to table bounds + if latitude_deg < SAMPLING_MIN_LAT: + return None + if latitude_deg >= SAMPLING_MAX_LAT: + return None + if longitude_deg < SAMPLING_MIN_LON: + return None + if longitude_deg >= SAMPLING_MAX_LON: + return None + + intensity_gauss = interpolate_table(intensity_table, latitude_deg, longitude_deg) + declination_deg = interpolate_table(declination_table, latitude_deg, longitude_deg) + inclination_deg = interpolate_table(inclination_table, latitude_deg, longitude_deg) + + return [declination_deg, inclination_deg, intensity_gauss] + +def field_to_Vector3(mag): + '''return mGauss field from dec, inc and intensity''' + R = Matrix3() + mag_ef = Vector3(mag[2]*1000.0, 0.0, 0.0) + R.from_euler(0.0, -math.radians(mag[1]), math.radians(mag[0])) + return R * mag_ef + +def test_error(lat, lon): + '''check for error from lat,lon''' + global max_error, max_error_pos, max_error_field + mag1 = get_igrf(lat, lon) + mag2 = interpolate_field(lat, lon) + ef1 = field_to_Vector3(mag1) + ef2 = field_to_Vector3(mag2) + err = (ef1 - ef2).length() + if err > max_error or err > 100: + print(lat, lon, err, ef1, ef2) + max_error = err + max_error_pos = (lat, lon) + max_error_field = ef1 - ef2 + +def test_max_error(lat, lon): + '''check for maximum error from lat,lon over SAMPLING_RES range''' + steps = 3 + delta = SAMPLING_RES/steps + for i in range(steps): + for j in range(steps): + lat2 = lat + i * delta + lon2 = lon + j * delta + if lat2 >= SAMPLING_MAX_LAT or lon2 >= SAMPLING_MAX_LON: + continue + if lat2 <= SAMPLING_MIN_LAT or lon2 <= SAMPLING_MIN_LON: + continue + test_error(lat2, lon2) + +for i,lat in enumerate(lats): + for j,lon in enumerate(lons): + mag = get_igrf(lat, lon) + declination_table[i][j] = mag[0] + inclination_table[i][j] = mag[1] + intensity_table[i][j] = mag[2] + +with open(args.filename, 'w') as f: + f.write('''// this is an auto-generated file from the IGRF tables. Do not edit +// To re-generate run generate/generate.py + +#include "AP_Declination.h" + +''') + + f.write('''const float AP_Declination::SAMPLING_RES = %u; +const float AP_Declination::SAMPLING_MIN_LAT = %u; +const float AP_Declination::SAMPLING_MAX_LAT = %u; +const float AP_Declination::SAMPLING_MIN_LON = %u; +const float AP_Declination::SAMPLING_MAX_LON = %u; + +''' % (SAMPLING_RES, + SAMPLING_MIN_LAT, + SAMPLING_MAX_LAT, + SAMPLING_MIN_LON, + SAMPLING_MAX_LON)) + + + write_table(f,'declination_table', declination_table) +# write_table(f,'inclination_table', inclination_table) +# write_table(f,'intensity_table', intensity_table) + +if args.check_error: + print("Checking for maximum error") + for lat in range(-60,60,1): + for lon in range(-180,180,1): + test_max_error(lat, lon) + print("Generated with max error %.2f %s at (%.2f,%.2f)" % ( + max_error, max_error_field, max_error_pos[0], max_error_pos[1])) + +print("Table generated in %s" % args.filename) diff --git a/src/AP_Declination/tables.cpp b/src/AP_Declination/tables.cpp new file mode 100644 index 0000000..c35d8af --- /dev/null +++ b/src/AP_Declination/tables.cpp @@ -0,0 +1,51 @@ +// this is an auto-generated file from the IGRF tables. Do not edit +// To re-generate run generate/generate.py + +#include "AP_Declination.h" + +const float AP_Declination::SAMPLING_RES = 5; +const float AP_Declination::SAMPLING_MIN_LAT = -90; +const float AP_Declination::SAMPLING_MAX_LAT = 90; +const float AP_Declination::SAMPLING_MIN_LON = -180; +const float AP_Declination::SAMPLING_MAX_LON = 180; + +const float AP_Declination::declination_table[37][73] = { + {149.03407f,144.03407f,139.03406f,134.03407f,129.03407f,124.03407f,119.03407f,114.03407f,109.03407f,104.03407f,99.03407f,94.03407f,89.03407f,84.03407f,79.03407f,74.03407f,69.03407f,64.03407f,59.03407f,54.03407f,49.03407f,44.03407f,39.03407f,34.03407f,29.03407f,24.03407f,19.03407f,14.03407f,9.03407f,4.03407f,-0.96593f,-5.96593f,-10.96593f,-15.96593f,-20.96593f,-25.96593f,-30.96593f,-35.96593f,-40.96593f,-45.96593f,-50.96593f,-55.96593f,-60.96593f,-65.96593f,-70.96593f,-75.96593f,-80.96593f,-85.96593f,-90.96593f,-95.96593f,-100.96593f,-105.96593f,-110.96593f,-115.96593f,-120.96593f,-125.96593f,-130.96593f,-135.96593f,-140.96593f,-145.96593f,-150.96593f,-155.96593f,-160.96593f,-165.96593f,-170.96593f,-175.96593f,179.03407f,174.03407f,169.03407f,164.03407f,159.03407f,154.03407f,149.03407f}, + {141.51289f,135.86793f,130.30584f,124.83080f,119.44524f,114.14996f,108.94426f,103.82624f,98.79295f,93.84061f,88.96488f,84.16095f,79.42378f,74.74820f,70.12900f,65.56103f,61.03928f,56.55886f,52.11505f,47.70332f,43.31927f,38.95864f,34.61732f,30.29126f,25.97650f,21.66913f,17.36530f,13.06118f,8.75303f,4.43715f,0.10991f,-4.23218f,-8.59252f,-12.97431f,-17.38060f,-21.81426f,-26.27793f,-30.77408f,-35.30500f,-39.87280f,-44.47949f,-49.12697f,-53.81710f,-58.55174f,-63.33279f,-68.16223f,-73.04212f,-77.97468f,-82.96221f,-88.00713f,-93.11192f,-98.27905f,-103.51089f,-108.80960f,-114.17698f,-119.61431f,-125.12214f,-130.70013f,-136.34680f,-142.05937f,-147.83358f,-153.66357f,-159.54185f,-165.45931f,-171.40534f,-177.36808f,176.66527f,170.70806f,164.77375f,158.87542f,153.02536f,147.23465f,141.51289f}, + {129.30529f,123.04797f,117.07812f,111.38491f,105.95127f,100.75625f,95.77688f,90.98956f,86.37108f,81.89932f,77.55367f,73.31535f,69.16756f,65.09554f,61.08654f,57.12978f,53.21631f,49.33881f,45.49142f,41.66942f,37.86901f,34.08694f,30.32023f,26.56590f,22.82063f,19.08063f,15.34145f,11.59791f,7.84418f,4.07382f,0.28004f,-3.54407f,-7.40526f,-11.30984f,-15.26336f,-19.27045f,-23.33467f,-27.45845f,-31.64311f,-35.88907f,-40.19599f,-44.56309f,-48.98945f,-53.47437f,-58.01768f,-62.62012f,-67.28359f,-72.01144f,-76.80870f,-81.68223f,-86.64085f,-91.69542f,-96.85886f,-102.14600f,-107.57345f,-113.15916f,-118.92185f,-124.88005f,-131.05078f,-137.44774f,-144.07903f,-150.94447f,-158.03286f,-165.31961f,-172.76553f,179.68260f,172.08924f,164.52508f,157.06086f,149.76098f,142.67847f,135.85203f,129.30530f}, + {110.25505f,104.17460f,98.66441f,93.63327f,88.99997f,84.69384f,80.65388f,76.82752f,73.16943f,69.64048f,66.20704f,62.84045f,59.51673f,56.21635f,52.92405f,49.62874f,46.32321f,43.00388f,39.67033f,36.32482f,32.97161f,29.61614f,26.26424f,22.92114f,19.59060f,16.27413f,12.97028f,9.67439f,6.37844f,3.07147f,-0.25981f,-3.63001f,-7.05394f,-10.54543f,-14.11625f,-17.77518f,-21.52749f,-25.37470f,-29.31471f,-33.34230f,-37.44981f,-41.62809f,-45.86746f,-50.15868f,-54.49391f,-58.86750f,-63.27664f,-67.72194f,-72.20787f,-76.74318f,-81.34129f,-86.02075f,-90.80586f,-95.72746f,-100.82390f,-106.14225f,-111.73969f,-117.68467f,-124.05749f,-130.94884f,-138.45456f,-146.66322f,-155.63318f,-165.35821f,-175.72937f,173.48623f,162.62307f,152.04575f,142.06085f,132.86000f,124.51417f,117.00338f,110.25505f}, + {85.76021f,81.52735f,77.79070f,74.43416f,71.37193f,68.53750f,65.87661f,63.34292f,60.89542f,58.49697f,56.11379f,53.71552f,51.27574f,48.77254f,46.18931f,43.51519f,40.74548f,37.88166f,34.93116f,31.90679f,28.82578f,25.70857f,22.57709f,19.45288f,16.35486f,13.29723f,10.28748f,7.32498f,4.40043f,1.49621f,-1.41215f,-4.35362f,-7.35868f,-10.45619f,-13.67038f,-17.01862f,-20.50988f,-24.14424f,-27.91339f,-31.80187f,-35.78895f,-39.85088f,-43.96312f,-48.10247f,-52.24874f,-56.38605f,-60.50365f,-64.59643f,-68.66507f,-72.71624f,-76.76272f,-80.82387f,-84.92649f,-89.10641f,-93.41127f,-97.90497f,-102.67492f,-107.84353f,-113.58678f,-120.16345f,-127.95920f,-137.54085f,-149.67212f,-165.09730f,176.27330f,156.41262f,138.33488f,123.68413f,112.33089f,103.49538f,96.44591f,90.65322f,85.76021f}, + {63.49063f,61.53268f,59.70157f,57.98263f,56.36269f,54.82753f,53.36027f,51.94025f,50.54250f,49.13776f,47.69331f,46.17455f,44.54727f,42.78015f,40.84742f,38.73085f,36.42148f,33.92045f,31.23933f,28.39991f,25.43322f,22.37797f,19.27812f,16.17948f,13.12567f,10.15346f,7.28821f,4.54010f,1.90186f,-0.65133f,-3.15956f,-5.67358f,-8.24878f,-10.93849f,-13.78779f,-16.82860f,-20.07661f,-23.53033f,-27.17213f,-30.97101f,-34.88671f,-38.87435f,-42.88883f,-46.88860f,-50.83823f,-54.70981f,-58.48343f,-62.14677f,-65.69440f,-69.12673f,-72.44904f,-75.67052f,-78.80366f,-81.86412f,-84.87128f,-87.85003f,-90.83455f,-93.87592f,-97.05823f,-100.53633f,-104.63927f,-110.22502f,-120.43804f,-157.26638f,111.32321f,89.31102f,81.43675f,76.75453f,73.28001f,70.40353f,67.88022f,65.59556f,63.49063f}, + {48.02742f,47.38464f,46.65758f,45.89153f,45.11833f,44.35876f,43.62354f,42.91339f,42.21835f,41.51709f,40.77709f,39.95632f,39.00664f,37.87857f,36.52647f,34.91338f,33.01482f,30.82138f,28.34023f,25.59577f,22.62934f,19.49783f,16.27080f,13.02555f,9.84030f,6.78585f,3.91665f,1.26296f,-1.17444f,-3.42572f,-5.54885f,-7.62229f,-9.73470f,-11.97351f,-14.41415f,-17.11133f,-20.09307f,-23.35827f,-26.87804f,-30.60072f,-34.45961f,-38.38184f,-42.29652f,-46.14062f,-49.86226f,-53.42145f,-56.78910f,-59.94509f,-62.87577f,-65.57122f,-68.02220f,-70.21645f,-72.13432f,-73.74302f,-74.98855f,-75.78285f,-75.98080f,-75.33518f,-73.40197f,-69.32885f,-61.37994f,-46.16169f,-20.32594f,8.41772f,27.60663f,37.97792f,43.51550f,46.49369f,48.02544f,48.68241f,48.78368f,48.52307f,48.02742f}, + {38.02510f,37.95792f,37.73497f,37.41456f,37.04227f,36.65341f,36.27445f,35.92281f,35.60472f,35.31207f,35.01947f,34.68350f,34.24514f,33.63540f,32.78320f,31.62363f,30.10536f,28.19618f,25.88705f,23.19480f,20.16366f,16.86521f,13.39569f,9.86956f,6.40899f,3.12978f,0.12611f,-2.54307f,-4.86312f,-6.86630f,-8.62717f,-10.25201f,-11.86455f,-13.59071f,-15.54422f,-17.81359f,-20.45089f,-23.46424f,-26.81646f,-30.43193f,-34.21032f,-38.04311f,-41.82809f,-45.47842f,-48.92573f,-52.11873f,-55.01953f,-57.59932f,-59.83411f,-61.70043f,-63.17020f,-64.20414f,-64.74344f,-64.69915f,-63.93902f,-62.27080f,-59.42157f,-55.01852f,-48.59713f,-39.71493f,-28.30159f,-15.18866f,-2.13379f,9.17958f,18.04877f,24.61647f,29.33790f,32.66390f,34.94945f,36.45643f,37.37842f,37.86274f,38.02510f}, + {31.27326f,31.45631f,31.46505f,31.35356f,31.16598f,30.93929f,30.70590f,30.49422f,30.32590f,30.21035f,30.13820f,30.07626f,29.96635f,29.72894f,29.27146f,28.49916f,27.32664f,25.68808f,23.54579f,20.89697f,17.77899f,14.27223f,10.49883f,6.61468f,2.79343f,-0.79613f,-4.01459f,-6.77252f,-9.04210f,-10.85792f,-12.30759f,-13.51606f,-14.62889f,-15.79881f,-17.17497f,-18.89010f,-21.04162f,-23.66988f,-26.74447f,-30.16844f,-33.80096f,-37.48828f,-41.09001f,-44.49284f,-47.61215f,-50.38612f,-52.76791f,-54.71886f,-56.20341f,-57.18453f,-57.61810f,-57.44541f,-56.58460f,-54.92446f,-52.32546f,-48.63487f,-43.72300f,-37.54431f,-30.21313f,-22.05560f,-13.58090f,-5.35314f,2.16813f,8.71933f,14.22506f,18.73400f,22.35164f,25.19521f,27.37356f,28.98370f,30.11459f,30.85085f,31.27326f}, + {26.36786f,26.66604f,26.79441f,26.79796f,26.71209f,26.56667f,26.39096f,26.21608f,26.07315f,25.98705f,25.96761f,26.00071f,26.04227f,26.01707f,25.82354f,25.34414f,24.45955f,23.06449f,21.08311f,18.48260f,15.28457f,11.57281f,7.49449f,3.25012f,-0.93058f,-4.82388f,-8.24909f,-11.09616f,-13.33660f,-15.01667f,-16.23676f,-17.12582f,-17.82207f,-18.46870f,-19.22186f,-20.25387f,-21.73172f,-23.76952f,-26.38065f,-29.46427f,-32.83736f,-36.29065f,-39.63654f,-42.73095f,-45.47164f,-47.78552f,-49.61560f,-50.91277f,-51.63194f,-51.72970f,-51.16052f,-49.87079f,-47.79505f,-44.86273f,-41.02406f,-36.29488f,-30.80107f,-24.78755f,-18.56808f,-12.43986f,-6.61997f,-1.23543f,3.65142f,8.01587f,11.85648f,15.18803f,18.03396f,20.41861f,22.36396f,23.89345f,25.03898f,25.84526f,26.36786f}, + {22.56366f,22.90784f,23.10037f,23.17771f,23.16431f,23.07834f,22.93915f,22.77223f,22.60923f,22.48299f,22.41865f,22.42306f,22.47451f,22.51543f,22.45039f,22.15168f,21.47314f,20.27092f,18.42743f,15.87477f,12.61470f,8.73294f,4.40295f,-0.12806f,-4.57495f,-8.66629f,-12.19482f,-15.04947f,-17.22075f,-18.78121f,-19.84870f,-20.54584f,-20.97449f,-21.22186f,-21.39810f,-21.67766f,-22.29853f,-23.49197f,-25.37615f,-27.89268f,-30.83411f,-33.93295f,-36.94491f,-39.68626f,-42.03008f,-43.88606f,-45.18341f,-45.86344f,-45.87958f,-45.19889f,-43.79984f,-41.66647f,-38.78692f,-35.16910f,-30.87803f,-26.07520f,-21.01921f,-16.00229f,-11.25498f,-6.88718f,-2.90022f,0.75638f,4.13078f,7.24498f,10.09921f,12.68564f,14.99541f,17.01707f,18.73549f,20.13796f,21.22534f,22.01993f,22.56366f}, + {19.49262f,19.83667f,20.05379f,20.17527f,20.21649f,20.18386f,20.08413f,19.93130f,19.74919f,19.56928f,19.42437f,19.33850f,19.31400f,19.31803f,19.27228f,19.05075f,18.49032f,17.41469f,15.66762f,13.14805f,9.84083f,5.83792f,1.34298f,-3.35039f,-7.91048f,-12.03590f,-15.51510f,-18.25608f,-20.28181f,-21.69740f,-22.63861f,-23.21706f,-23.48665f,-23.45490f,-23.14501f,-22.68034f,-22.32882f,-22.44219f,-23.29750f,-24.95324f,-27.23460f,-29.83995f,-32.46585f,-34.87275f,-36.88902f,-38.39021f,-39.28263f,-39.49980f,-39.00659f,-37.80142f,-35.90945f,-33.36829f,-30.22080f,-26.53208f,-22.42894f,-18.12682f,-13.89950f,-9.99029f,-6.52460f,-3.48752f,-0.77184f,1.74639f,4.15087f,6.46808f,8.68408f,10.77078f,12.70017f,14.44314f,15.96584f,17.23560f,18.23538f,18.97548f,19.49262f}, + {16.97883f,17.28956f,17.49736f,17.63270f,17.70634f,17.71651f,17.65855f,17.53276f,17.34953f,17.13148f,16.91161f,16.72537f,16.59606f,16.51570f,16.42639f,16.21007f,15.69455f,14.67963f,12.97884f,10.46657f,7.11982f,3.04546f,-1.51809f,-6.23618f,-10.74800f,-14.74718f,-18.03985f,-20.56352f,-22.37111f,-23.58964f,-24.36165f,-24.78315f,-24.86525f,-24.54807f,-23.77488f,-22.60092f,-21.27530f,-20.21522f,-19.84302f,-20.38356f,-21.77840f,-23.76039f,-25.99255f,-28.16627f,-30.03382f,-31.40672f,-32.15138f,-32.19178f,-31.51307f,-30.15554f,-28.19296f,-25.70283f,-22.75199f,-19.41794f,-15.83548f,-12.22185f,-8.83494f,-5.87650f,-3.41043f,-1.35484f,0.45563f,2.18421f,3.92991f,5.71280f,7.50009f,9.24384f,10.90154f,12.43396f,13.79691f,14.94542f,15.85090f,16.51678f,16.97883f}, + {14.93100f,15.18635f,15.35662f,15.47564f,15.55491f,15.58961f,15.56703f,15.47431f,15.30624f,15.07283f,14.80278f,14.53815f,14.31797f,14.15367f,14.00355f,13.75659f,13.23581f,12.22632f,10.52389f,7.99180f,4.61181f,0.51478f,-4.02546f,-8.64514f,-12.97740f,-16.73466f,-19.75345f,-21.99705f,-23.53093f,-24.48178f,-24.98225f,-25.11094f,-24.85499f,-24.12625f,-22.83827f,-21.01546f,-18.87808f,-16.83573f,-15.35794f,-14.78584f,-15.21092f,-16.48364f,-18.30551f,-20.32696f,-22.21443f,-23.69113f,-24.56305f,-24.73343f,-24.20144f,-23.03963f,-21.35203f,-19.23024f,-16.73747f,-13.93871f,-10.95723f,-8.00232f,-5.32287f,-3.10447f,-1.38474f,-0.04693f,1.11102f,2.28032f,3.57005f,4.99114f,6.49051f,8.00055f,9.46670f,10.84386f,12.08259f,13.13004f,13.94893f,14.53733f,14.93100f}, + {13.28884f,13.47634f,13.58779f,13.66435f,13.72339f,13.76191f,13.76240f,13.70032f,13.55523f,13.32445f,13.03181f,12.72354f,12.44868f,12.22913f,12.02987f,11.74116f,11.18301f,10.13578f,8.39265f,5.82183f,2.42246f,-1.64568f,-6.07995f,-10.50575f,-14.57210f,-18.02426f,-20.72791f,-22.65695f,-23.86739f,-24.46549f,-24.56529f,-24.23837f,-23.48116f,-22.23069f,-20.43350f,-18.13422f,-15.53294f,-12.97246f,-10.85242f,-9.51146f,-9.13413f,-9.71333f,-11.06429f,-12.87374f,-14.77095f,-16.40698f,-17.52234f,-17.98440f,-17.78613f,-17.00868f,-15.76235f,-14.13365f,-12.17100f,-9.92237f,-7.49803f,-5.10053f,-2.97708f,-1.31256f,-0.13817f,0.67997f,1.36924f,2.14363f,3.12084f,4.30256f,5.61549f,6.97286f,8.30960f,9.57771f,10.72621f,11.69738f,12.44649f,12.96552f,13.28884f}, + {12.00282f,12.11837f,12.15757f,12.17280f,12.19200f,12.21760f,12.22925f,12.19160f,12.07031f,11.85230f,11.55870f,11.23943f,10.94829f,10.70784f,10.47867f,10.14549f,9.52682f,8.40876f,6.59772f,3.98239f,0.58868f,-3.39652f,-7.65593f,-11.82437f,-15.58129f,-18.70505f,-21.07796f,-22.66697f,-23.50437f,-23.67076f,-23.26901f,-22.38660f,-21.06689f,-19.31693f,-17.15424f,-14.65992f,-12.00100f,-9.41297f,-7.16151f,-5.50215f,-4.63707f,-4.66326f,-5.52593f,-7.00714f,-8.76960f,-10.44558f,-11.73428f,-12.46586f,-12.61021f,-12.23504f,-11.43824f,-10.29086f,-8.82422f,-7.07057f,-5.12746f,-3.18888f,-1.49978f,-0.24872f,0.52992f,0.97589f,1.33296f,1.83313f,2.60175f,3.63251f,4.83366f,6.10049f,7.35848f,8.55851f,9.65054f,10.57405f,11.27692f,11.74307f,12.00282f}, + {11.02739f,11.07622f,11.03933f,10.98421f,10.95339f,10.95728f,10.97332f,10.95552f,10.85678f,10.65621f,10.37470f,10.06586f,9.78388f,9.54402f,9.29421f,8.90939f,8.20943f,6.99576f,5.10152f,2.44783f,-0.90855f,-4.76162f,-8.79704f,-12.67530f,-16.11016f,-18.90310f,-20.93772f,-22.16415f,-22.59233f,-22.28944f,-21.36612f,-19.94707f,-18.14186f,-16.03876f,-13.72227f,-11.29101f,-8.85774f,-6.54187f,-4.47450f,-2.81373f,-1.73949f,-1.40345f,-1.85076f,-2.96503f,-4.47910f,-6.05292f,-7.37991f,-8.26855f,-8.66438f,-8.61274f,-8.19097f,-7.45133f,-6.40875f,-5.08083f,-3.55055f,-1.99810f,-0.66017f,0.27351f,0.76201f,0.94296f,1.06764f,1.38006f,2.01197f,2.95171f,4.09310f,5.31622f,6.53807f,7.70883f,8.78033f,9.68993f,10.37726f,10.81542f,11.02739f}, + {10.31472f,10.31453f,10.21064f,10.08863f,10.00885f,9.99151f,10.01233f,10.01480f,9.93992f,9.76023f,9.49687f,9.20560f,8.93764f,8.69695f,8.41641f,7.96184f,7.15858f,5.83066f,3.84646f,1.16583f,-2.12473f,-5.81072f,-9.59542f,-13.17310f,-16.28734f,-18.75062f,-20.43922f,-21.28955f,-21.30455f,-20.55871f,-19.18683f,-17.35463f,-15.22699f,-12.95067f,-10.64994f,-8.42037f,-6.31911f,-4.37056f,-2.60134f,-1.08831f,0.02271f,0.55979f,0.41503f,-0.37545f,-1.61611f,-3.01321f,-4.27793f,-5.21498f,-5.75467f,-5.92327f,-5.77955f,-5.35984f,-4.66555f,-3.70057f,-2.53081f,-1.31665f,-0.27875f,0.39794f,0.66647f,0.65655f,0.61794f,0.79941f,1.33742f,2.21923f,3.33090f,4.54215f,5.76289f,6.94188f,8.03189f,8.96743f,9.67821f,10.12326f,10.31472f}, + {9.80548f,9.79028f,9.64547f,9.47571f,9.36084f,9.33236f,9.36559f,9.39496f,9.35049f,9.19753f,8.95471f,8.67610f,8.40722f,8.14125f,7.79987f,7.24526f,6.31330f,4.85459f,2.77572f,0.07573f,-3.13325f,-6.63665f,-10.16260f,-13.43910f,-16.23268f,-18.36079f,-19.69530f,-20.17293f,-19.80955f,-18.70301f,-17.01472f,-14.93600f,-12.65708f,-10.34921f,-8.15147f,-6.15117f,-4.36707f,-2.76097f,-1.28854f,0.03431f,1.09685f,1.72693f,1.78209f,1.24223f,0.24367f,-0.96603f,-2.12362f,-3.04027f,-3.64042f,-3.93935f,-3.98483f,-3.80402f,-3.38988f,-2.73468f,-1.88594f,-0.97956f,-0.21314f,0.24019f,0.33045f,0.17587f,0.01620f,0.09717f,0.55809f,1.39034f,2.48092f,3.69622f,4.94135f,6.16231f,7.31051f,8.31580f,9.09607f,9.59342f,9.80548f}, + {9.42061f,9.44269f,9.30332f,9.12372f,9.00240f,8.98309f,9.04347f,9.11226f,9.11026f,8.99373f,8.77341f,8.49585f,8.19865f,7.86787f,7.42197f,6.72779f,5.63702f,4.02821f,1.84470f,-0.87850f,-4.00778f,-7.33151f,-10.60178f,-13.57573f,-16.03952f,-17.81956f,-18.79634f,-18.92464f,-18.24753f,-16.88942f,-15.02701f,-12.85350f,-10.55488f,-8.30042f,-6.23006f,-4.42721f,-2.89364f,-1.55859f,-0.33464f,0.80608f,1.78575f,2.44363f,2.62210f,2.26394f,1.45958f,0.41666f,-0.62651f,-1.49054f,-2.09912f,-2.46332f,-2.62771f,-2.61823f,-2.42568f,-2.03452f,-1.47479f,-0.85584f,-0.34717f,-0.10352f,-0.17336f,-0.45104f,-0.71330f,-0.72444f,-0.34439f,0.42720f,1.48729f,2.70684f,3.98949f,5.27733f,6.51771f,7.63398f,8.53135f,9.13351f,9.42061f}, + {9.06167f,9.18888f,9.12145f,8.99011f,8.90745f,8.92905f,9.03842f,9.16380f,9.21986f,9.15208f,8.95740f,8.66861f,8.31352f,7.87545f,7.27827f,6.40186f,5.11835f,3.33424f,1.02632f,-1.73833f,-4.80645f,-7.96686f,-10.98954f,-13.65607f,-15.77517f,-17.19456f,-17.82061f,-17.64000f,-16.72654f,-15.22262f,-13.30303f,-11.14274f,-8.90508f,-6.74344f,-4.79255f,-3.13707f,-1.77821f,-0.63553f,0.39969f,1.38495f,2.27215f,2.91947f,3.16817f,2.93852f,2.28580f,1.38356f,0.44726f,-0.35315f,-0.94224f,-1.33011f,-1.56318f,-1.67227f,-1.65234f,-1.48524f,-1.18690f,-0.84095f,-0.58630f,-0.55399f,-0.78557f,-1.18630f,-1.55248f,-1.66345f,-1.38052f,-0.69135f,0.31782f,1.52948f,2.84936f,4.21519f,5.56830f,6.82494f,7.87909f,8.63751f,9.06167f}, + {8.62618f,8.93281f,9.01770f,9.00969f,9.02653f,9.13240f,9.31934f,9.52089f,9.65030f,9.64274f,9.47763f,9.16936f,8.73421f,8.15557f,7.36859f,6.27213f,4.76201f,2.77242f,0.31104f,-2.52526f,-5.56242f,-8.58411f,-11.37133f,-13.72824f,-15.49367f,-16.55163f,-16.84874f,-16.40943f,-15.33257f,-13.76490f,-11.86461f,-9.77763f,-7.63798f,-5.57870f,-3.72678f,-2.17026f,-0.91907f,0.10149f,1.00480f,1.86583f,2.66250f,3.27711f,3.56090f,3.42364f,2.89396f,2.11484f,1.27906f,0.54622f,-0.00961f,-0.39793f,-0.66810f,-0.85870f,-0.97354f,-0.99760f,-0.93791f,-0.85565f,-0.85902f,-1.05158f,-1.46225f,-2.00284f,-2.48854f,-2.71585f,-2.54958f,-1.96518f,-1.02907f,0.15686f,1.50304f,2.94303f,4.41141f,5.81867f,7.05190f,8.00611f,8.62618f}, + {8.03598f,8.58889f,8.90722f,9.10460f,9.29148f,9.53362f,9.83144f,10.12834f,10.34195f,10.40095f,10.26805f,9.93790f,9.41372f,8.67870f,7.68051f,6.33877f,4.57424f,2.34883f,-0.29949f,-3.24365f,-6.28574f,-9.19890f,-11.77071f,-13.82904f,-15.25085f,-15.96729f,-15.97208f,-15.32534f,-14.14138f,-12.55967f,-10.71423f,-8.72028f,-6.68390f,-4.71835f,-2.94131f,-1.44306f,-0.24548f,0.71138f,1.53327f,2.30225f,3.01804f,3.59034f,3.88945f,3.82508f,3.40637f,2.74729f,2.01530f,1.35615f,0.84103f,0.46213f,0.16922f,-0.08321f,-0.30987f,-0.50356f,-0.66827f,-0.84729f,-1.11973f,-1.55925f,-2.17664f,-2.88418f,-3.51211f,-3.87370f,-3.83930f,-3.37449f,-2.52699f,-1.38270f,-0.02562f,1.47393f,3.04430f,4.59297f,6.00644f,7.17616f,8.03598f}, + {7.26404f,8.10965f,8.72719f,9.20363f,9.62912f,10.06111f,10.50424f,10.91333f,11.21567f,11.34011f,11.23825f,10.88772f,10.27813f,9.38958f,8.17873f,6.58333f,4.54783f,2.06192f,-0.80497f,-3.89324f,-6.97776f,-9.81797f,-12.20704f,-13.99879f,-15.11266f,-15.52991f,-15.28958f,-14.48074f,-13.22442f,-11.64711f,-9.85865f,-7.94820f,-5.99936f,-4.10802f,-2.38106f,-0.90774f,0.27922f,1.22103f,2.00764f,2.71959f,3.37356f,3.90798f,4.21895f,4.22501f,3.92204f,3.39553f,2.78286f,2.20986f,1.74142f,1.37229f,1.05518f,0.74140f,0.40656f,0.04769f,-0.34062f,-0.78836f,-1.34780f,-2.06152f,-2.91742f,-3.82180f,-4.61460f,-5.12394f,-5.22760f,-4.88549f,-4.13094f,-3.03660f,-1.68184f,-0.14054f,1.51063f,3.17937f,4.75791f,6.14267f,7.26404f}, + {6.34227f,7.49980f,8.45427f,9.25999f,9.97710f,10.64486f,11.26504f,11.80143f,12.19363f,12.37738f,12.30115f,11.93159f,11.24603f,10.21813f,8.80747f,6.96409f,4.65257f,1.88967f,-1.22203f,-4.48748f,-7.65190f,-10.46036f,-12.71276f,-14.29025f,-15.15384f,-15.33028f,-14.89618f,-13.96132f,-12.64812f,-11.07016f,-9.31841f,-7.46382f,-5.57411f,-3.73068f,-2.02814f,-0.55067f,0.66167f,1.63144f,2.42842f,3.12502f,3.74960f,4.26821f,4.60649f,4.69831f,4.53154f,4.16345f,3.69621f,3.22841f,2.81353f,2.44841f,2.09234f,1.69868f,1.23732f,0.69634f,0.06726f,-0.66937f,-1.54107f,-2.55884f,-3.68421f,-4.81193f,-5.78656f,-6.44890f,-6.68609f,-6.45751f,-5.78812f,-4.74191f,-3.39558f,-1.82633f,-0.11412f,1.65171f,3.37355f,4.95911f,6.34227f}, + {5.34603f,6.80801f,8.10430f,9.25699f,10.29292f,11.22674f,12.05003f,12.72994f,13.21683f,13.45645f,13.40063f,13.01148f,12.25724f,11.10344f,9.50726f,7.42475f,4.83602f,1.78342f,-1.59607f,-5.06954f,-8.35132f,-11.17309f,-13.34331f,-14.77010f,-15.45135f,-15.45050f,-14.87171f,-13.83788f,-12.47064f,-10.87411f,-9.12779f,-7.29256f,-5.42650f,-3.59932f,-1.89257f,-0.38187f,0.88983f,1.92927f,2.78537f,3.51820f,4.16232f,4.70759f,5.10911f,5.31921f,5.32149f,5.14594f,4.85608f,4.51693f,4.16472f,3.79586f,3.37783f,2.87062f,2.24401f,1.48161f,0.57414f,-0.48708f,-1.70528f,-3.05949f,-4.48253f,-5.85376f,-7.01874f,-7.82967f,-8.18534f,-8.05000f,-7.44677f,-6.43620f,-5.09470f,-3.50236f,-1.74074f,0.10559f,1.95098f,3.71728f,5.34602f}, + {4.36709f,6.10488f,7.71807f,9.20246f,10.55497f,11.76498f,12.80925f,13.65183f,14.24831f,14.55221f,14.52007f,14.11282f,13.29243f,12.01646f,10.23708f,7.91232f,5.03471f,1.67141f,-2.00440f,-5.71963f,-9.15722f,-12.03748f,-14.17954f,-15.51759f,-16.08076f,-15.96010f,-15.27810f,-14.16492f,-12.74067f,-11.10407f,-9.32963f,-7.47469f,-5.59264f,-3.74422f,-1.99849f,-0.42053f,0.94775f,2.10162f,3.07144f,3.90327f,4.63269f,5.26717f,5.78686f,6.16168f,6.37295f,6.42579f,6.34523f,6.15957f,5.88255f,5.50540f,5.00183f,4.34036f,3.49569f,2.45339f,1.20932f,-0.23035f,-1.84210f,-3.57115f,-5.31961f,-6.94925f,-8.30504f,-9.25096f,-9.70058f,-9.62856f,-9.06263f,-8.06501f,-6.71413f,-5.09269f,-3.28245f,-1.36256f,0.59288f,2.51929f,4.36709f}, + {3.48737f,5.45970f,7.34454f,9.11998f,10.76124f,12.23717f,13.50952f,14.53448f,15.26589f,15.65824f,15.66825f,15.25358f,14.36932f,12.96465f,10.98567f,8.39137f,5.18696f,1.46745f,-2.55250f,-6.55480f,-10.19002f,-13.17005f,-15.32853f,-16.62638f,-17.12030f,-16.92228f,-16.16643f,-14.98607f,-13.49940f,-11.80230f,-9.96824f,-8.05483f,-6.11394f,-4.20003f,-2.37140f,-0.68273f,0.82764f,2.14800f,3.29410f,4.29846f,5.19322f,5.99555f,6.70272f,7.29764f,7.75970f,8.07335f,8.22969f,8.22157f,8.03688f,7.65536f,7.05088f,6.19784f,5.07787f,3.68463f,2.02710f,0.13435f,-1.93649f,-4.09162f,-6.19897f,-8.10123f,-9.64329f,-10.70357f,-11.21502f,-11.16885f,-10.60359f,-9.58792f,-8.20440f,-6.53817f,-4.67039f,-2.67498f,-0.61648f,1.45157f,3.48737f}, + {2.75808f,4.92150f,7.02575f,9.03975f,10.92660f,12.64250f,14.13788f,15.35986f,16.25497f,16.77081f,16.85591f,16.45736f,15.51755f,13.97287f,11.76046f,8.83973f,5.23237f,1.07075f,-3.37550f,-7.73185f,-11.61289f,-14.72687f,-16.92941f,-18.21294f,-18.66191f,-18.40634f,-17.58827f,-16.34172f,-14.78238f,-13.00400f,-11.08009f,-9.06954f,-7.02398f,-4.99357f,-3.02836f,-1.17413f,0.53514f,2.08423f,3.47831f,4.73777f,5.88765f,6.94645f,7.91880f,8.79384f,9.54832f,10.15131f,10.56789f,10.76100f,10.69226f,10.32337f,9.61907f,8.55160f,7.10615f,5.28689f,3.12374f,0.67999f,-1.94104f,-4.59536f,-7.10950f,-9.30500f,-11.02932f,-12.18080f,-12.71873f,-12.65788f,-12.05373f,-10.98552f,-9.54170f,-7.80971f,-5.86969f,-3.79108f,-1.63131f,0.56380f,2.75808f}, + {2.18511f,4.50396f,6.78193f,8.98511f,11.07254f,12.99554f,14.69879f,16.12226f,17.20311f,17.87639f,18.07415f,17.72311f,16.74237f,15.04512f,12.55069f,9.21484f,5.08111f,0.33741f,-4.66447f,-9.46997f,-13.65027f,-16.91840f,-19.16613f,-20.42842f,-20.82260f,-20.49754f,-19.60237f,-18.27083f,-16.61550f,-14.72741f,-12.67917f,-10.52984f,-8.33033f,-6.12736f,-3.96470f,-1.88120f,0.09329f,1.94189f,3.66217f,5.26356f,6.76108f,8.16726f,9.48488f,10.70242f,11.79287f,12.71521f,13.41758f,13.84105f,13.92351f,13.60388f,12.82695f,11.54972f,9.74994f,7.43733f,4.66650f,1.54813f,-1.74846f,-5.00873f,-8.00386f,-10.53041f,-12.44318f,-13.66949f,-14.20444f,-14.09440f,-13.41755f,-12.26697f,-10.73807f,-8.92042f,-6.89286f,-4.72127f,-2.45833f,-0.14526f,2.18511f}, + {1.72053f,4.17297f,6.59438f,8.95134f,11.20364f,13.30308f,15.19344f,16.81081f,18.08389f,18.93317f,19.26896f,18.98863f,17.97530f,16.10272f,13.25527f,9.37362f,4.52871f,-1.00461f,-6.74269f,-12.11065f,-16.62809f,-20.03220f,-22.27725f,-23.45977f,-23.73964f,-23.28809f,-22.26206f,-20.79488f,-18.99544f,-16.95096f,-14.73125f,-12.39338f,-9.98585f,-7.55149f,-5.12863f,-2.75055f,-0.44367f,1.77430f,3.89494f,5.91760f,7.84559f,9.68075f,11.41785f,13.03988f,14.51531f,15.79744f,16.82551f,17.52703f,17.82085f,17.62109f,16.84267f,15.41052f,13.27453f,10.43204f,6.95518f,3.01260f,-1.13218f,-5.15905f,-8.75773f,-11.69139f,-13.82848f,-15.13789f,-15.66248f,-15.48890f,-14.72326f,-13.47499f,-11.84717f,-9.93137f,-7.80527f,-5.53214f,-3.16198f,-0.73388f,1.72053f}, + {1.25648f,3.83346f,6.38361f,8.87461f,11.26836f,13.51909f,15.57188f,17.36120f,18.80886f,19.82102f,20.28386f,20.05887f,18.98034f,16.86251f,13.53001f,8.89097f,3.05679f,-3.54903f,-10.22329f,-16.21814f,-21.01624f,-24.43081f,-26.52507f,-27.48288f,-27.51630f,-26.82066f,-25.55979f,-23.86524f,-21.84075f,-19.56791f,-17.11151f,-14.52415f,-11.84978f,-9.12619f,-6.38628f,-3.65838f,-0.96593f,1.67288f,4.24497f,6.74115f,9.15377f,11.47351f,13.68563f,15.76654f,17.68097f,19.38009f,20.80043f,21.86327f,22.47451f,22.52518f,21.89433f,20.45753f,18.10673f,14.78776f,10.55570f,5.62879f,0.39675f,-4.65483f,-9.08010f,-12.58457f,-15.05374f,-16.51320f,-17.06846f,-16.85678f,-16.01828f,-14.68187f,-12.95989f,-10.94687f,-8.72027f,-6.34224f,-3.86191f,-1.31827f,1.25648f}, + {0.61274f,3.30609f,5.97339f,8.58191f,11.09408f,13.46503f,15.63979f,17.55005f,19.10974f,20.20899f,20.70620f,20.41900f,19.11786f,16.53390f,12.40662f,6.61050f,-0.63393f,-8.60491f,-16.24674f,-22.64559f,-27.36876f,-30.42378f,-32.04157f,-32.50592f,-32.07420f,-30.95517f,-29.31063f,-27.26407f,-24.90971f,-22.32016f,-19.55232f,-16.65182f,-13.65621f,-10.59718f,-7.50200f,-4.39430f,-1.29461f,1.77927f,4.81167f,7.78814f,10.69402f,13.51268f,16.22331f,18.79876f,21.20313f,23.38945f,25.29705f,26.84843f,27.94548f,28.46508f,28.25526f,27.13565f,24.91066f,21.41082f,16.57999f,10.60085f,3.97961f,-2.54106f,-8.24894f,-12.70524f,-15.79057f,-17.60170f,-18.32929f,-18.17960f,-17.33926f,-15.96496f,-14.18379f,-12.09725f,-9.78580f,-7.31305f,-4.72954f,-2.07615f,0.61273f}, + {-0.51780f,2.25318f,4.99425f,7.66865f,10.23485f,12.64332f,14.83254f,16.72371f,18.21347f,19.16381f,19.38869f,18.63855f,16.59029f,12.86697f,7.14422f,-0.58466f,-9.65920f,-18.74956f,-26.50752f,-32.23849f,-35.92738f,-37.89259f,-38.51301f,-38.11560f,-36.95302f,-35.21298f,-33.03368f,-30.51738f,-27.74077f,-24.76235f,-21.62771f,-18.37317f,-15.02848f,-11.61858f,-8.16494f,-4.68647f,-1.20023f,2.27799f,5.73306f,9.14986f,12.51243f,15.80303f,19.00093f,22.08101f,25.01199f,27.75429f,30.25706f,32.45424f,34.25895f,35.55571f,36.19006f,35.95632f,34.58787f,31.76497f,27.17577f,20.68735f,12.62891f,3.95837f,-4.05513f,-10.47137f,-14.98139f,-17.73202f,-19.04365f,-19.24250f,-18.60128f,-17.33187f,-15.59484f,-13.51153f,-11.17436f,-8.65479f,-6.00927f,-3.28385f,-0.51781f}, + {-2.94630f,-0.27015f,2.35392f,4.87475f,7.23381f,9.35996f,11.16265f,12.52250f,13.27822f,13.20942f,12.01747f,9.31709f,4.67824f,-2.19503f,-11.07895f,-20.88160f,-29.97238f,-37.12710f,-41.99746f,-44.82656f,-46.03905f,-46.03089f,-45.11248f,-43.51276f,-41.39774f,-38.88807f,-36.07244f,-33.01710f,-29.77243f,-26.37748f,-22.86313f,-19.25438f,-15.57188f,-11.83313f,-8.05336f,-4.24613f,-0.42389f,3.40158f,7.21877f,11.01604f,14.78119f,18.50092f,22.16027f,25.74181f,29.22467f,32.58313f,35.78478f,38.78779f,41.53690f,43.95751f,45.94660f,47.35884f,47.98567f,47.52511f,45.54571f,41.47140f,34.68705f,24.97739f,13.30733f,1.91060f,-7.18982f,-13.36551f,-16.99104f,-18.69892f,-19.03825f,-18.41248f,-17.10439f,-15.31181f,-13.17571f,-10.79953f,-8.26212f,-5.62654f,-2.94631f}, + {-15.37669f,-14.26728f,-13.44233f,-13.07088f,-13.34672f,-14.49663f,-16.77455f,-20.42235f,-25.56851f,-32.05942f,-39.32137f,-46.45545f,-52.60312f,-57.27376f,-60.37929f,-62.07479f,-62.59922f,-62.18728f,-61.03725f,-59.30634f,-57.11599f,-54.55931f,-51.70786f,-48.61705f,-45.33014f,-41.88134f,-38.29801f,-34.60230f,-30.81233f,-26.94317f,-23.00747f,-19.01601f,-14.97808f,-10.90183f,-6.79450f,-2.66261f,1.48783f,5.65122f,9.82224f,13.99568f,18.16641f,22.32918f,26.47854f,30.60867f,34.71317f,38.78489f,42.81557f,46.79548f,50.71283f,54.55307f,58.29770f,61.92271f,65.39604f,68.67369f,71.69330f,74.36332f,76.54363f,78.00924f,78.37835f,76.96295f,72.45838f,62.44065f,43.87018f,19.37226f,-0.18356f,-11.16707f,-16.48422f,-18.69494f,-19.20397f,-18.76390f,-17.80785f,-16.61220f,-15.37669f}, + {-172.49255f,-167.49255f,-162.49255f,-157.49255f,-152.49255f,-147.49255f,-142.49256f,-137.49255f,-132.49255f,-127.49255f,-122.49255f,-117.49255f,-112.49255f,-107.49255f,-102.49255f,-97.49255f,-92.49255f,-87.49255f,-82.49255f,-77.49255f,-72.49256f,-67.49255f,-62.49256f,-57.49255f,-52.49256f,-47.49255f,-42.49255f,-37.49255f,-32.49255f,-27.49256f,-22.49255f,-17.49256f,-12.49255f,-7.49256f,-2.49256f,2.50744f,7.50745f,12.50745f,17.50744f,22.50744f,27.50744f,32.50744f,37.50744f,42.50744f,47.50744f,52.50745f,57.50744f,62.50744f,67.50744f,72.50744f,77.50744f,82.50744f,87.50744f,92.50744f,97.50744f,102.50744f,107.50744f,112.50744f,117.50744f,122.50744f,127.50744f,132.50744f,137.50744f,142.50744f,147.50744f,152.50744f,157.50744f,162.50744f,167.50744f,172.50744f,177.50744f,-177.49256f,-172.49256f} +}; + diff --git a/src/AP_Declination/test.py b/src/AP_Declination/test.py new file mode 100644 index 0000000..4f7d8e9 --- /dev/null +++ b/src/AP_Declination/test.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +''' +generate field tables from IGRF12. Note that this requires python3 +''' + +import igrf as igrf +import numpy as np +import datetime +from pathlib import Path +from pymavlink.rotmat import Vector3, Matrix3 +import math + +import argparse +parser = argparse.ArgumentParser(description='generate mag tables') +parser.add_argument('--sampling-res', type=int, default=5, help='sampling resolution, degrees') +parser.add_argument('--check-error', action='store_true', help='check max error') +parser.add_argument('--filename', type=str, default='tables.cpp', help='tables file') + +args = parser.parse_args() + +if not Path("AP_Declination.h").is_file(): + raise OSError("Please run this tool from the AP_Declination directory") + + +def write_table(f,name, table): + '''write one table''' + f.write("const float AP_Declination::%s[%u][%u] = {\n" % + (name, NUM_LAT, NUM_LON)) + for i in range(NUM_LAT): + f.write(" {") + for j in range(NUM_LON): + f.write("%.5ff" % table[i][j]) + if j != NUM_LON-1: + f.write(",") + f.write("}") + if i != NUM_LAT-1: + f.write(",") + f.write("\n") + f.write("};\n\n") + +date = datetime.datetime.now() + +SAMPLING_RES = args.sampling_res +SAMPLING_MIN_LAT = -90 +SAMPLING_MAX_LAT = 90 +SAMPLING_MIN_LON = -180 +SAMPLING_MAX_LON = 180 + +lats = np.arange(SAMPLING_MIN_LAT, SAMPLING_MAX_LAT+SAMPLING_RES, SAMPLING_RES) +lons = np.arange(SAMPLING_MIN_LON, SAMPLING_MAX_LON+SAMPLING_RES, SAMPLING_RES) + +NUM_LAT = lats.size +NUM_LON = lons.size + +intensity_table = np.empty((NUM_LAT, NUM_LON)) +inclination_table = np.empty((NUM_LAT, NUM_LON)) +declination_table = np.empty((NUM_LAT, NUM_LON)) + +max_error = 0 +max_error_pos = None +max_error_field = None + +def get_igrf(lat, lon): + '''return field as [declination_deg, inclination_deg, intensity_gauss]''' + mag = igrf.igrf(date, glat=lat, glon=lon, alt_km=0., isv=0, itype=1) + intensity = float(mag.total/1e5) + inclination = float(mag.incl) + declination = float(mag.decl) + return [declination, inclination, intensity] + + +print("%f" % get_igrf(40.5795,-74.1502)[0]) diff --git a/src/BLE/atBLEAdvertisedDevice.cpp b/src/BLE/atBLEAdvertisedDevice.cpp new file mode 100644 index 0000000..1ada00c --- /dev/null +++ b/src/BLE/atBLEAdvertisedDevice.cpp @@ -0,0 +1,544 @@ +#include "sdkconfig.h" +#if defined(CONFIG_BLUEDROID_ENABLED) +#include +#include "atBLEAdvertisedDevice.h" +#include "BLEUtils.h" +#include "esp32-hal-log.h" + +atBLEAdvertisedDevice::atBLEAdvertisedDevice() { + m_adFlag = 0; + m_appearance = 0; + m_deviceType = 0; + m_manufacturerData = ""; + m_name = ""; + m_rssi = -9999; + m_serviceData = {}; + m_serviceDataUUIDs = {}; + m_txPower = 0; + + m_haveAppearance = false; + m_haveManufacturerData = false; + m_haveName = false; + m_haveRSSI = false; + m_haveServiceData = false; + m_haveServiceUUID = false; + m_haveTXPower = false; + +} // atBLEAdvertisedDevice + + +/** + * @brief Get the address. + * + * Every %BLE device exposes an address that is used to identify it and subsequently connect to it. + * Call this function to obtain the address of the advertised device. + * + * @return The address of the advertised device. + */ +BLEAddress atBLEAdvertisedDevice::getAddress() { + return m_address; +} // getAddress + + +/** + * @brief Get the appearance. + * + * A %BLE device can declare its own appearance. The appearance is how it would like to be shown to an end user + * typcially in the form of an icon. + * + * @return The appearance of the advertised device. + */ +uint16_t atBLEAdvertisedDevice::getAppearance() { + return m_appearance; +} // getAppearance + + +/** + * @brief Get the manufacturer data. + * @return The manufacturer data of the advertised device. + */ +std::string atBLEAdvertisedDevice::getManufacturerData() { + return m_manufacturerData; +} // getManufacturerData + + +/** + * @brief Get the name. + * @return The name of the advertised device. + */ +std::string atBLEAdvertisedDevice::getName() { + return m_name; +} // getName + + +/** + * @brief Get the RSSI. + * @return The RSSI of the advertised device. + */ +int atBLEAdvertisedDevice::getRSSI() { + return m_rssi; +} // getRSSI + + +/** + * @brief Get the number of service data. + * @return Number of service data discovered. + */ +int atBLEAdvertisedDevice::getServiceDataCount() { + if (m_haveServiceData) + return m_serviceData.size(); + else + return 0; + +} //getServiceDataCount + +/** + * @brief Get the service data. + * @return The ServiceData of the advertised device. + */ +std::string atBLEAdvertisedDevice::getServiceData() { + return m_serviceData[0]; +} //getServiceData + +/** + * @brief Get the service data. + * @return The ServiceData of the advertised device. + */ +std::string atBLEAdvertisedDevice::getServiceData(int i) { + return m_serviceData[i]; +} //getServiceData + +/** + * @brief Get the service data UUID. + * @return The service data UUID. + */ +BLEUUID atBLEAdvertisedDevice::getServiceDataUUID() { + return m_serviceDataUUIDs[0]; +} // getServiceDataUUID + +/** + * @brief Get the service data UUID. + * @return The service data UUID. + */ +BLEUUID atBLEAdvertisedDevice::getServiceDataUUID(int i) { + return m_serviceDataUUIDs[i]; +} // getServiceDataUUID + +/** + * @brief Get the Service UUID. + * @return The Service UUID of the advertised device. + */ +BLEUUID atBLEAdvertisedDevice::getServiceUUID() { + return m_serviceUUIDs[0]; +} // getServiceUUID + +/** + * @brief Get the Service UUID. + * @return The Service UUID of the advertised device. + */ +BLEUUID atBLEAdvertisedDevice::getServiceUUID(int i) { + return m_serviceUUIDs[i]; +} // getServiceUUID + +/** + * @brief Check advertised serviced for existence required UUID + * @return Return true if service is advertised + */ +bool atBLEAdvertisedDevice::isAdvertisingService(BLEUUID uuid){ + for (int i = 0; i < m_serviceUUIDs.size(); i++) { + if (m_serviceUUIDs[i].equals(uuid)) return true; + } + return false; +} + +/** + * @brief Get the TX Power. + * @return The TX Power of the advertised device. + */ +int8_t atBLEAdvertisedDevice::getTXPower() { + return m_txPower; +} // getTXPower + + + +/** + * @brief Does this advertisement have an appearance value? + * @return True if there is an appearance value present. + */ +bool atBLEAdvertisedDevice::haveAppearance() { + return m_haveAppearance; +} // haveAppearance + + +/** + * @brief Does this advertisement have manufacturer data? + * @return True if there is manufacturer data present. + */ +bool atBLEAdvertisedDevice::haveManufacturerData() { + return m_haveManufacturerData; +} // haveManufacturerData + + +/** + * @brief Does this advertisement have a name value? + * @return True if there is a name value present. + */ +bool atBLEAdvertisedDevice::haveName() { + return m_haveName; +} // haveName + + +/** + * @brief Does this advertisement have a signal strength value? + * @return True if there is a signal strength value present. + */ +bool atBLEAdvertisedDevice::haveRSSI() { + return m_haveRSSI; +} // haveRSSI + + +/** + * @brief Does this advertisement have a service data value? + * @return True if there is a service data value present. + */ +bool atBLEAdvertisedDevice::haveServiceData() { + return m_haveServiceData; +} // haveServiceData + + +/** + * @brief Does this advertisement have a service UUID value? + * @return True if there is a service UUID value present. + */ +bool atBLEAdvertisedDevice::haveServiceUUID() { + return m_haveServiceUUID; +} // haveServiceUUID + + +/** + * @brief Does this advertisement have a transmission power value? + * @return True if there is a transmission power value present. + */ +bool atBLEAdvertisedDevice::haveTXPower() { + return m_haveTXPower; +} // haveTXPower + + +/** + * @brief Parse the advertising pay load. + * + * The pay load is a buffer of bytes that is either 31 bytes long or terminated by + * a 0 length value. Each entry in the buffer has the format: + * [length][type][data...] + * + * The length does not include itself but does include everything after it until the next record. A record + * with a length value of 0 indicates a terminator. + * + * https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile + */ +void atBLEAdvertisedDevice::parseAdvertisement(uint8_t* payload, size_t total_len) { + uint8_t length; + uint8_t ad_type; + uint8_t sizeConsumed = 0; + bool finished = false; + m_payload = payload; + m_payloadLength = total_len; + + while(!finished) { + length = *payload; // Retrieve the length of the record. + payload++; // Skip to type + sizeConsumed += 1 + length; // increase the size consumed. + + if (length != 0) { // A length of 0 indicates that we have reached the end. + ad_type = *payload; + payload++; + length--; + + char* pHex = BLEUtils::buildHexData(nullptr, payload, length); + log_d("Type: 0x%.2x (%s), length: %d, data: %s", + ad_type, BLEUtils::advTypeToString(ad_type), length, pHex); + free(pHex); + + switch(ad_type) { + case ESP_BLE_AD_TYPE_NAME_CMPL: { // Adv Data Type: 0x09 + setName(std::string(reinterpret_cast(payload), length)); + break; + } // ESP_BLE_AD_TYPE_NAME_CMPL + + case ESP_BLE_AD_TYPE_TX_PWR: { // Adv Data Type: 0x0A + setTXPower(*payload); + break; + } // ESP_BLE_AD_TYPE_TX_PWR + + case ESP_BLE_AD_TYPE_APPEARANCE: { // Adv Data Type: 0x19 + setAppearance(*reinterpret_cast(payload)); + break; + } // ESP_BLE_AD_TYPE_APPEARANCE + + case ESP_BLE_AD_TYPE_FLAG: { // Adv Data Type: 0x01 + setAdFlag(*payload); + break; + } // ESP_BLE_AD_TYPE_FLAG + + case ESP_BLE_AD_TYPE_16SRV_CMPL: + case ESP_BLE_AD_TYPE_16SRV_PART: { // Adv Data Type: 0x02 + for (int var = 0; var < length/2; ++var) { + setServiceUUID(BLEUUID(*reinterpret_cast(payload + var * 2))); + } + break; + } // ESP_BLE_AD_TYPE_16SRV_PART + + case ESP_BLE_AD_TYPE_32SRV_CMPL: + case ESP_BLE_AD_TYPE_32SRV_PART: { // Adv Data Type: 0x04 + for (int var = 0; var < length/4; ++var) { + setServiceUUID(BLEUUID(*reinterpret_cast(payload + var * 4))); + } + break; + } // ESP_BLE_AD_TYPE_32SRV_PART + + case ESP_BLE_AD_TYPE_128SRV_CMPL: { // Adv Data Type: 0x07 + setServiceUUID(BLEUUID(payload, 16, false)); + break; + } // ESP_BLE_AD_TYPE_128SRV_CMPL + + case ESP_BLE_AD_TYPE_128SRV_PART: { // Adv Data Type: 0x06 + setServiceUUID(BLEUUID(payload, 16, false)); + break; + } // ESP_BLE_AD_TYPE_128SRV_PART + + // See CSS Part A 1.4 Manufacturer Specific Data + case ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE: { + setManufacturerData(std::string(reinterpret_cast(payload), length)); + break; + } // ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE + + case ESP_BLE_AD_TYPE_SERVICE_DATA: { // Adv Data Type: 0x16 (Service Data) - 2 byte UUID + if (length < 2) { + log_e("Length too small for ESP_BLE_AD_TYPE_SERVICE_DATA"); + break; + } + uint16_t uuid = *(uint16_t*)payload; + setServiceDataUUID(BLEUUID(uuid)); + if (length > 2) { + setServiceData(std::string(reinterpret_cast(payload + 2), length - 2)); + } + break; + } //ESP_BLE_AD_TYPE_SERVICE_DATA + + case ESP_BLE_AD_TYPE_32SERVICE_DATA: { // Adv Data Type: 0x20 (Service Data) - 4 byte UUID + if (length < 4) { + log_e("Length too small for ESP_BLE_AD_TYPE_32SERVICE_DATA"); + break; + } + uint32_t uuid = *(uint32_t*) payload; + setServiceDataUUID(BLEUUID(uuid)); + if (length > 4) { + setServiceData(std::string(reinterpret_cast(payload + 4), length - 4)); + } + break; + } //ESP_BLE_AD_TYPE_32SERVICE_DATA + + case ESP_BLE_AD_TYPE_128SERVICE_DATA: { // Adv Data Type: 0x21 (Service Data) - 16 byte UUID + if (length < 16) { + log_e("Length too small for ESP_BLE_AD_TYPE_128SERVICE_DATA"); + break; + } + + setServiceDataUUID(BLEUUID(payload, (size_t)16, false)); + if (length > 16) { + setServiceData(std::string(reinterpret_cast(payload + 16), length - 16)); + } + break; + } //ESP_BLE_AD_TYPE_32SERVICE_DATA + + default: { + log_d("Unhandled type: adType: %d - 0x%.2x", ad_type, ad_type); + break; + } + } // switch + payload += length; + } // Length <> 0 + + + if (sizeConsumed >= total_len) + finished = true; + + } // !finished +} // parseAdvertisement + +/** + * @brief Parse the advertising payload. + * @param [in] payload The payload of the advertised device. + * @param [in] total_len The length of payload + */ +void atBLEAdvertisedDevice::setPayload(uint8_t* payload, size_t total_len) { + m_payload = payload; + m_payloadLength = total_len; +} // setPayload + +/** + * @brief Set the address of the advertised device. + * @param [in] address The address of the advertised device. + */ +void atBLEAdvertisedDevice::setAddress(BLEAddress address) { + m_address = address; +} // setAddress + + +/** + * @brief Set the adFlag for this device. + * @param [in] The discovered adFlag. + */ +void atBLEAdvertisedDevice::setAdFlag(uint8_t adFlag) { + m_adFlag = adFlag; +} // setAdFlag + + +/** + * @brief Set the appearance for this device. + * @param [in] The discovered appearance. + */ +void atBLEAdvertisedDevice::setAppearance(uint16_t appearance) { + m_appearance = appearance; + m_haveAppearance = true; + log_d("- appearance: %d", m_appearance); +} // setAppearance + + +/** + * @brief Set the manufacturer data for this device. + * @param [in] The discovered manufacturer data. + */ +void atBLEAdvertisedDevice::setManufacturerData(std::string manufacturerData) { + m_manufacturerData = manufacturerData; + m_haveManufacturerData = true; + char* pHex = BLEUtils::buildHexData(nullptr, (uint8_t*) m_manufacturerData.data(), (uint8_t) m_manufacturerData.length()); + log_d("- manufacturer data: %s", pHex); + free(pHex); +} // setManufacturerData + + +/** + * @brief Set the name for this device. + * @param [in] name The discovered name. + */ +void atBLEAdvertisedDevice::setName(std::string name) { + m_name = name; + m_haveName = true; + log_d("- setName(): name: %s", m_name.c_str()); +} // setName + + +/** + * @brief Set the RSSI for this device. + * @param [in] rssi The discovered RSSI. + */ +void atBLEAdvertisedDevice::setRSSI(int rssi) { + m_rssi = rssi; + m_haveRSSI = true; + log_d("- setRSSI(): rssi: %d", m_rssi); +} // setRSSI + + +/** + * @brief Set the Service UUID for this device. + * @param [in] serviceUUID The discovered serviceUUID + */ +void atBLEAdvertisedDevice::setServiceUUID(const char* serviceUUID) { + return setServiceUUID(BLEUUID(serviceUUID)); +} // setServiceUUID + + +/** + * @brief Set the Service UUID for this device. + * @param [in] serviceUUID The discovered serviceUUID + */ +void atBLEAdvertisedDevice::setServiceUUID(BLEUUID serviceUUID) { + m_serviceUUIDs.push_back(serviceUUID); + m_haveServiceUUID = true; + log_d("- addServiceUUID(): serviceUUID: %s", serviceUUID.toString().c_str()); +} // setServiceUUID + + +/** + * @brief Set the ServiceData value. + * @param [in] data ServiceData value. + */ +void atBLEAdvertisedDevice::setServiceData(std::string serviceData) { + m_haveServiceData = true; // Set the flag that indicates we have service data. + m_serviceData.push_back(serviceData); // Save the service data that we received. +} //setServiceData + + +/** + * @brief Set the ServiceDataUUID value. + * @param [in] data ServiceDataUUID value. + */ +void atBLEAdvertisedDevice::setServiceDataUUID(BLEUUID uuid) { + m_haveServiceData = true; // Set the flag that indicates we have service data. + m_serviceDataUUIDs.push_back(uuid); + log_d("- addServiceDataUUID(): serviceDataUUID: %s", uuid.toString().c_str()); +} // setServiceDataUUID + + +/** + * @brief Set the power level for this device. + * @param [in] txPower The discovered power level. + */ +void atBLEAdvertisedDevice::setTXPower(int8_t txPower) { + m_txPower = txPower; + m_haveTXPower = true; + log_d("- txPower: %d", m_txPower); +} // setTXPower + + +/** + * @brief Create a string representation of this device. + * @return A string representation of this device. + */ +std::string atBLEAdvertisedDevice::toString() { + std::string res = "Name: " + getName() + ", Address: " + getAddress().toString(); + if (haveAppearance()) { + char val[6]; + snprintf(val, sizeof(val), "%d", getAppearance()); + res += ", appearance: "; + res += val; + } + if (haveManufacturerData()) { + char *pHex = BLEUtils::buildHexData(nullptr, (uint8_t*)getManufacturerData().data(), getManufacturerData().length()); + res += ", manufacturer data: "; + res += pHex; + free(pHex); + } + if (haveServiceUUID()) { + for (int i=0; i < m_serviceUUIDs.size(); i++) { + res += ", serviceUUID: " + getServiceUUID(i).toString(); + } + } + if (haveTXPower()) { + char val[6]; + snprintf(val, sizeof(val), "%d", getTXPower()); + res += ", txPower: "; + res += val; + } + return res; +} // toString + +uint8_t* atBLEAdvertisedDevice::getPayload() { + return m_payload; +} + +esp_ble_addr_type_t atBLEAdvertisedDevice::getAddressType() { + return m_addressType; +} + +void atBLEAdvertisedDevice::setAddressType(esp_ble_addr_type_t type) { + m_addressType = type; +} + +size_t atBLEAdvertisedDevice::getPayloadLength() { + return m_payloadLength; +} + +#endif /* CONFIG_BLUEDROID_ENABLED */ + diff --git a/src/BLE/atBLEAdvertisedDevice.h b/src/BLE/atBLEAdvertisedDevice.h new file mode 100644 index 0000000..fffd2df --- /dev/null +++ b/src/BLE/atBLEAdvertisedDevice.h @@ -0,0 +1,89 @@ +#ifndef ATCOMPONENTS_CPP_UTILS_BLEADVERTISEDDEVICE_H_ +#define ATCOMPONENTS_CPP_UTILS_BLEADVERTISEDDEVICE_H_ +#include "sdkconfig.h" +#if defined(CONFIG_BLUEDROID_ENABLED) +#include + +#include +#include + +#include "BLEAddress.h" +#include "BLEUUID.h" + + +class atBLEAdvertisedDevice { +public: + atBLEAdvertisedDevice(); + + BLEAddress getAddress(); + uint16_t getAppearance(); + std::string getManufacturerData(); + std::string getName(); + int getRSSI(); + std::string getServiceData(); + std::string getServiceData(int i); + BLEUUID getServiceDataUUID(); + BLEUUID getServiceDataUUID(int i); + BLEUUID getServiceUUID(); + BLEUUID getServiceUUID(int i); + int getServiceDataCount(); + int8_t getTXPower(); + uint8_t* getPayload(); + size_t getPayloadLength(); + esp_ble_addr_type_t getAddressType(); + void setAddressType(esp_ble_addr_type_t type); + + + bool isAdvertisingService(BLEUUID uuid); + bool haveAppearance(); + bool haveManufacturerData(); + bool haveName(); + bool haveRSSI(); + bool haveServiceData(); + bool haveServiceUUID(); + bool haveTXPower(); + + std::string toString(); + + void parseAdvertisement(uint8_t* payload, size_t total_len=62); + void setPayload(uint8_t* payload, size_t total_len=62); + void setAddress(BLEAddress address); + void setAdFlag(uint8_t adFlag); + void setAdvertizementResult(uint8_t* payload); + void setAppearance(uint16_t appearance); + void setManufacturerData(std::string manufacturerData); + void setName(std::string name); + void setRSSI(int rssi); + void setServiceData(std::string data); + void setServiceDataUUID(BLEUUID uuid); + void setServiceUUID(const char* serviceUUID); + void setServiceUUID(BLEUUID serviceUUID); + void setTXPower(int8_t txPower); + +protected: + bool m_haveAppearance; + bool m_haveManufacturerData; + bool m_haveName; + bool m_haveRSSI; + bool m_haveServiceData; + bool m_haveServiceUUID; + bool m_haveTXPower; + + + BLEAddress m_address = BLEAddress((uint8_t*)"\0\0\0\0\0\0"); + uint8_t m_adFlag; + uint16_t m_appearance; + int m_deviceType; + std::string m_manufacturerData; + std::string m_name; + int m_rssi; + std::vector m_serviceUUIDs; + int8_t m_txPower; + std::vector m_serviceData; + std::vector m_serviceDataUUIDs; + uint8_t* m_payload; + size_t m_payloadLength = 0; + esp_ble_addr_type_t m_addressType; +}; +#endif +#endif diff --git a/src/FastTrig.h b/src/FastTrig.h new file mode 100644 index 0000000..5a80729 --- /dev/null +++ b/src/FastTrig.h @@ -0,0 +1,219 @@ +#pragma once +// +// FILE: FastTrig.h +// AUTHOR: Rob Tillaart +// VERSION: 0.1.6 +// PURPOSE: Arduino library for a faster approximation of sin() and cos() +// DATE: 2011-08-18 +// URL: https://github.com/RobTillaart/FastTrig +// https://forum.arduino.cc/index.php?topic=69723.0 +// +// HISTORY: +// 0.1.00 2011-08-18 initial version +// 0.1.01 2011-08-18 improved tables a bit + changed param to float +// 0.1.02 2011-08-20 added interpolation +// eons passed +// 0.1.1 2020-08-30 refactor, create a library out of it. +// itan() approximation is bad. +// 0.1.2 2020-09-06 optimize 16 bit table with example sketch +// 0.1.3 2020-09-07 initial release. +// 0.1.4 2020-09-08 rewrite itan() + cleanup + examples +// 0.1.5 2020-09-11 fixed optimize, new table, added iasin() and iacos() +// 0.1.6 2020-12-23 arduino-CI + unit tests + +#include "Arduino.h" +#define Pi 3.14159265359 +// 91 x 2 bytes ==> 182 bytes +// use 65535.0 as divider +static uint16_t isinTable16[] = { + 0, +1145, 2289, 3435, 4572, 5716, 6853, 7989, 9125, 10255, 11385, +12508, 13631, 14745, 15859, 16963, 18067, 19165, 20253, 21342, 22417, +23489, 24553, 25610, 26659, 27703, 28731, 29755, 30773, 31777, 32772, +33756, 34734, 35697, 36649, 37594, 38523, 39445, 40350, 41247, 42131, +42998, 43856, 44701, 45528, 46344, 47147, 47931, 48708, 49461, 50205, +50933, 51646, 52342, 53022, 53686, 54334, 54969, 55579, 56180, 56760, +57322, 57866, 58394, 58908, 59399, 59871, 60327, 60768, 61184, 61584, +61969, 62330, 62677, 63000, 63304, 63593, 63858, 64108, 64334, 64545, +64731, 64903, 65049, 65177, 65289, 65377, 65449, 65501, 65527, 65535, +65535 +}; + + +/* 0.1.4 table +uint16_t isinTable16[] = { + 0, + 1145, 2289, 3435, 4571, 5715, 6852, 7988, 9125, 10254, 11385, + 12508, 13630, 14745, 15859, 16963, 18067, 19165, 20253, 21342, 22416, + 23488, 24553, 25610, 26659, 27699, 28730, 29754, 30773, 31777, 32771, + 33755, 34734, 35697, 36649, 37594, 38523, 39445, 40350, 41247, 42127, + 42998, 43856, 44697, 45527, 46344, 47146, 47931, 48708, 49461, 50205, + 50933, 51645, 52341, 53022, 53686, 54333, 54969, 55578, 56180, 56759, + 57322, 57866, 58394, 58908, 59399, 59871, 60327, 60767, 61184, 61584, + 61969, 62330, 62677, 63000, 63304, 63592, 63857, 64108, 64333, 64544, + 64731, 64902, 65049, 65177, 65289, 65376, 65449, 65501, 65527, 65535, + 65535 +}; +*/ + + +// use 255.0 as divider +static uint8_t isinTable8[] = { + 0, 4, 9, 13, 18, 22, 27, 31, 35, 40, 44, + 49, 53, 57, 62, 66, 70, 75, 79, 83, 87, + 91, 96, 100, 104, 108, 112, 116, 120, 124, 128, + 131, 135, 139, 143, 146, 150, 153, 157, 160, 164, + 167, 171, 174, 177, 180, 183, 186, 190, 192, 195, + 198, 201, 204, 206, 209, 211, 214, 216, 219, 221, + 223, 225, 227, 229, 231, 233, 235, 236, 238, 240, + 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 253, 254, 254, 254, 255, 255, 255, 255, + 255 +}; + +/////////////////////////////////////////////////////// +// +// GONIO LOOKUP +// +static float isin(float f) +{ + boolean pos = true; // positive + if (f < 0) + { + f = -f; + pos = !pos; + } + + long x = f; + uint8_t r = (f - x) * 256; + + if (x >= 360) x %= 360; + + int y = x; // 16 bit math is faster than 32 bit + + if (y >= 180) + { + y -= 180; + pos = !pos; + } + + if (y >= 90) + { + y = 180 - y; + if (r != 0) + { + r = 255 - r; + y--; + } + } + + // float v improves ~4% on avg error for ~60 bytes. + uint16_t v = isinTable16[y]; + + // interpolate if needed + if (r > 0) + { + v = v + ((isinTable16[y + 1] - v) / 8 * r) /32; // == * r / 256 + } + float g = v * 0.0000152590219; // = /65535.0 + if (pos) return g; + return -g; +} + +static float icos(float x) +{ + // prevent modulo math if x in 0..360 + return isin(x - 270.0); // better than x + 90; +} + +static float itan(float f) +{ + // reference + // return isin(f)/icos(f); + + // idea is to divide two (interpolated) values from the table + // so no divide by 65535 + + // FOLDING + bool neg = (f < 0); + bool mir = false; + if (neg) f = -f; + + long x = f; + float rem = f - x; + float v = x % 180 + rem; // normalised value 0..179.9999 + if (v > 90) + { + v = 180 - v; + neg = !neg; + mir = true; + } + uint8_t d = v; + if (d == 90) return 0; + + // COS FIRST + uint8_t p = 90 - d; + float co = isinTable16[p]; + if (rem != 0) + { + float delta = (isinTable16[p] - isinTable16[p - 1]); + if (mir) co = isinTable16[p - 1] + rem * delta; + else co = isinTable16[p] - rem * delta; + } + if (co == 0) return 0; + + float si = isinTable16[d]; + if (rem != 0) si += rem * (isinTable16[d + 1] - isinTable16[d]); + + float ta = si/co; + if (neg) return -ta; + return ta; +} + + +/////////////////////////////////////////////////////// +// +// INVERSE GONIO LOOKUP +// +static float iasin(float f) +{ + bool neg = (f < 0); + if (neg) + { + f = -f; + neg = true; + } + uint16_t val = round(f * 65535); + uint8_t lo = 0; + uint8_t hi = 90; + + while (hi - lo > 1) + { + uint8_t mi = (lo + hi) / 2; + if (isinTable16[mi] == val) + { + if (neg) return -mi; + return mi; + } + if (isinTable16[mi] < val) lo = mi; + else hi = mi; + } + float delta = val - isinTable16[lo]; + uint16_t range = isinTable16[hi] - isinTable16[lo]; + delta /= range; + if (neg) return -(lo + delta); + return (lo + delta); +} + +static float iacos(float f) +{ + return 90 - iasin(f); +} + +// PLACEHOLDER +static float iatan(float f) +{ + return 0 * f; +} + +// -- END OF FILE -- diff --git a/src/GPSStatus.h b/src/GPSStatus.h new file mode 100644 index 0000000..f437fe2 --- /dev/null +++ b/src/GPSStatus.h @@ -0,0 +1,167 @@ +#pragma once +#include +#include "Status.h" +#include "config.h" +#include "atcommon.h" +#include "AP_Declination/AP_Declination.h" + +class GPSStatus : public Status +{ + +private: + CallbackObserver statusObserver = CallbackObserver(this, &GPSStatus::updateStatus); + + bool hasLock = false; // default to false, until we complete our first read + bool isConnected = false; // Do we have a GPS we are talking to + int32_t latitude = 0, longitude = 0; // as an int mult by 1e-7 to get value as double + int32_t altitude = 0; + uint32_t hacc = 0; + uint32_t dop = 0; // Diminution of position; PDOP where possible (UBlox), HDOP otherwise (TinyGPS) in 10^2 units (needs scaling before use) + uint32_t heading = 0; + uint32_t numSatellites = 0; + uint32_t sequence = 0; + double x = 0; + double y = 0; + float magDec = 0; + +public: + GPSStatus() + { + statusType = STATUS_TYPE_GPS; + } + GPSStatus(bool hasLock, bool isConnected, int32_t latitude, int32_t longitude, int32_t altitude, uint32_t dop, uint32_t hacc, uint32_t heading, uint32_t numSatellites) : Status() + { + this->hasLock = hasLock; + this->isConnected = isConnected; + this->latitude = latitude; + this->longitude = longitude; + this->altitude = altitude; + this->dop = dop; + this->heading = heading; + this->numSatellites = numSatellites; + this->hacc = hacc; + if(hasLock) + { + magDec = AP_Declination::get_declination(latitude*1e-7,longitude*1e-7); + //DEBUG_MSG("D %f\n",magDec); + } + this->updateXY(); + } + + GPSStatus(const GPSStatus &); + GPSStatus &operator=(const GPSStatus &); + + float getMagDec() + { + return magDec; + } + void updateXY() + { + convertDegreeToMeter(longitude*1e-07,latitude*1e-07,x,y); + } + + void observe(Observable *source) + { + statusObserver.observe(source); + } + + bool getHasLock() const + { + return hasLock; + } + + bool getIsConnected() const + { + return isConnected; + } + + int32_t getLatitude() const + { + return latitude; + } + + int32_t getLongitude() const + { + return longitude; + } + + int32_t getAltitude() const + { + return altitude; + } + + uint32_t getDOP() const + { + return dop; + } + + uint32_t getHAcc() const + { + return hacc; + } + + uint32_t getHeading() const + { + return heading; + } + + uint32_t getNumSatellites() const + { + return numSatellites; + } + + uint32_t getSequence() const + { + return sequence; + } + + double getX() const + { + return x; + } + + double getY() const + { + return y; + } + + bool matches(const GPSStatus *newStatus) const + { + return ( + newStatus->hasLock != hasLock || + newStatus->isConnected != isConnected || + newStatus->latitude != latitude || + newStatus->longitude != longitude || + newStatus->altitude != altitude || + newStatus->dop != dop || + newStatus->hacc != hacc || + newStatus->heading != heading || + newStatus->numSatellites != numSatellites); + } + int updateStatus(const GPSStatus *newStatus) + { + // Only update the status if values have actually changed + bool isDirty; + { + isDirty = matches(newStatus); + initialized = true; + hasLock = newStatus->hasLock; + isConnected = newStatus->isConnected; + latitude = newStatus->latitude; + longitude = newStatus->longitude; + altitude = newStatus->altitude; + dop = newStatus->dop; + hacc = newStatus->hacc; + heading = newStatus->heading; + numSatellites = newStatus->numSatellites; + } + if (isDirty) + { + //DEBUG_MSG("New GPS pos lat=%f, lon=%f, alt=%d, pdop=%f, heading=%f, sats=%d\n", latitude * 1e-7, longitude * 1e-7, altitude, dop * 1e-2, heading * 1e-5, numSatellites); + updateXY(); + sequence++; + onNewStatus.notifyObservers(this); + } + return 0; + } +}; diff --git a/src/IMUStatus.h b/src/IMUStatus.h new file mode 100644 index 0000000..6451714 --- /dev/null +++ b/src/IMUStatus.h @@ -0,0 +1,65 @@ +#pragma once +#include +#include "Status.h" +#include "config.h" + +class IMUStatus : public Status +{ + +private: + CallbackObserver statusObserver = CallbackObserver(this, &IMUStatus::updateStatus); + + bool isConnected = false; // Do we have a GPS we are talking to + int32_t heading; + +public: + IMUStatus() + { + statusType = STATUS_TYPE_GPS; + } + IMUStatus(bool isConnected,int32_t heading) : Status() + { + this->isConnected = isConnected; + this->heading = heading; + } + IMUStatus(const IMUStatus &); + IMUStatus &operator=(const IMUStatus &); + + void observe(Observable *source) + { + statusObserver.observe(source); + } + + bool getIsConnected() const + { + return isConnected; + } + + int32_t getHeading() const + { + return heading; + } + + bool matches(const IMUStatus *newStatus) const + { + return ( + newStatus->isConnected != isConnected || + newStatus->heading != heading); + } + int updateStatus(const IMUStatus *newStatus) + { + // Only update the status if values have actually changed + bool isDirty; + { + isDirty = matches(newStatus); + initialized = true; + isConnected = newStatus->isConnected; + heading = newStatus->heading; + } + if (isDirty) + { + onNewStatus.notifyObservers(this); + } + return 0; + } +}; diff --git a/src/MPU9250/MPU9250.cpp b/src/MPU9250/MPU9250.cpp new file mode 100644 index 0000000..ab03142 --- /dev/null +++ b/src/MPU9250/MPU9250.cpp @@ -0,0 +1,1192 @@ +/* + MPU9250.cpp + Brian R Taylor + brian.taylor@bolderflight.com + + Copyright (c) 2017 Bolder Flight Systems + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "Arduino.h" +#include "MPU9250.h" + +/* MPU9250 object, input the I2C bus and address */ +MPU9250::MPU9250(TwoWire &bus,uint8_t address){ + _i2c = &bus; // I2C bus + _address = address; // I2C address + _useSPI = false; // set to use I2C +} + +/* MPU9250 object, input the SPI bus and chip select pin */ +MPU9250::MPU9250(SPIClass &bus,uint8_t csPin){ + _spi = &bus; // SPI bus + _csPin = csPin; // chip select pin + _useSPI = true; // set to use SPI +} + +/* starts communication with the MPU-9250 */ +int MPU9250::begin(){ + if( _useSPI ) { // using SPI for communication + // use low speed SPI for register setting + _useSPIHS = false; + // setting CS pin to output + pinMode(_csPin,OUTPUT); + // setting CS pin high + digitalWrite(_csPin,HIGH); + // begin SPI communication + _spi->begin(); + } else { // using I2C for communication + // starting the I2C bus + _i2c->begin(); + // setting the I2C clock + _i2c->setClock(_i2cRate); + } + // select clock source to gyro + if(writeRegister(PWR_MGMNT_1,CLOCK_SEL_PLL) < 0){ + return -1; + } + // enable I2C master mode + if(writeRegister(USER_CTRL,I2C_MST_EN) < 0){ + return -2; + } + // set the I2C bus speed to 400 kHz + if(writeRegister(I2C_MST_CTRL,I2C_MST_CLK) < 0){ + return -3; + } + // set AK8963 to Power Down + writeAK8963Register(AK8963_CNTL1,AK8963_PWR_DOWN); + // reset the MPU9250 + writeRegister(PWR_MGMNT_1,PWR_RESET); + // wait for MPU-9250 to come back up + delay(1); + // reset the AK8963 + writeAK8963Register(AK8963_CNTL2,AK8963_RESET); + // select clock source to gyro + if(writeRegister(PWR_MGMNT_1,CLOCK_SEL_PLL) < 0){ + return -4; + } + // check the WHO AM I byte, expected value is 0x71 (decimal 113) or 0x73 (decimal 115) + if((whoAmI() != 113)&&(whoAmI() != 115)){ + return -5; + } + // enable accelerometer and gyro + if(writeRegister(PWR_MGMNT_2,SEN_ENABLE) < 0){ + return -6; + } + // setting accel range to 16G as default + if(writeRegister(ACCEL_CONFIG,ACCEL_FS_SEL_16G) < 0){ + return -7; + } + _accelScale = G * 16.0f/32767.5f; // setting the accel scale to 16G + _accelRange = ACCEL_RANGE_16G; + // setting the gyro range to 2000DPS as default + if(writeRegister(GYRO_CONFIG,GYRO_FS_SEL_2000DPS) < 0){ + return -8; + } + _gyroScale = 2000.0f/32767.5f * _d2r; // setting the gyro scale to 2000DPS + _gyroRange = GYRO_RANGE_2000DPS; + // setting bandwidth to 184Hz as default + if(writeRegister(ACCEL_CONFIG2,ACCEL_DLPF_184) < 0){ + return -9; + } + if(writeRegister(CONFIG,GYRO_DLPF_184) < 0){ // setting gyro bandwidth to 184Hz + return -10; + } + _bandwidth = DLPF_BANDWIDTH_184HZ; + // setting the sample rate divider to 0 as default + if(writeRegister(SMPDIV,0x00) < 0){ + return -11; + } + _srd = 0; + // enable I2C master mode + if(writeRegister(USER_CTRL,I2C_MST_EN) < 0){ + return -12; + } + // set the I2C bus speed to 400 kHz + if( writeRegister(I2C_MST_CTRL,I2C_MST_CLK) < 0){ + return -13; + } + // check AK8963 WHO AM I register, expected value is 0x48 (decimal 72) + if( whoAmIAK8963() != 72 ){ + return -14; + } + /* get the magnetometer calibration */ + // set AK8963 to Power Down + if(writeAK8963Register(AK8963_CNTL1,AK8963_PWR_DOWN) < 0){ + return -15; + } + delay(100); // long wait between AK8963 mode changes + // set AK8963 to FUSE ROM access + if(writeAK8963Register(AK8963_CNTL1,AK8963_FUSE_ROM) < 0){ + return -16; + } + delay(100); // long wait between AK8963 mode changes + // read the AK8963 ASA registers and compute magnetometer scale factors + readAK8963Registers(AK8963_ASA,3,_buffer); + _magScaleX = ((((float)_buffer[0]) - 128.0f)/(256.0f) + 1.0f) * 4912.0f / 32760.0f; // micro Tesla + _magScaleY = ((((float)_buffer[1]) - 128.0f)/(256.0f) + 1.0f) * 4912.0f / 32760.0f; // micro Tesla + _magScaleZ = ((((float)_buffer[2]) - 128.0f)/(256.0f) + 1.0f) * 4912.0f / 32760.0f; // micro Tesla + // set AK8963 to Power Down + if(writeAK8963Register(AK8963_CNTL1,AK8963_PWR_DOWN) < 0){ + return -17; + } + delay(100); // long wait between AK8963 mode changes + // set AK8963 to 16 bit resolution, 100 Hz update rate + if(writeAK8963Register(AK8963_CNTL1,AK8963_CNT_MEAS2) < 0){ + return -18; + } + delay(100); // long wait between AK8963 mode changes + // select clock source to gyro + if(writeRegister(PWR_MGMNT_1,CLOCK_SEL_PLL) < 0){ + return -19; + } + // instruct the MPU9250 to get 7 bytes of data from the AK8963 at the sample rate + readAK8963Registers(AK8963_HXL,7,_buffer); + // estimate gyro bias +// if (calibrateGyro() < 0) { +// return -20; +// } + // successful init, return 1 + return 1; +} + +/* sets the accelerometer full scale range to values other than default */ +int MPU9250::setAccelRange(AccelRange range) { + // use low speed SPI for register setting + _useSPIHS = false; + switch(range) { + case ACCEL_RANGE_2G: { + // setting the accel range to 2G + if(writeRegister(ACCEL_CONFIG,ACCEL_FS_SEL_2G) < 0){ + return -1; + } + _accelScale = G * 2.0f/32767.5f; // setting the accel scale to 2G + break; + } + case ACCEL_RANGE_4G: { + // setting the accel range to 4G + if(writeRegister(ACCEL_CONFIG,ACCEL_FS_SEL_4G) < 0){ + return -1; + } + _accelScale = G * 4.0f/32767.5f; // setting the accel scale to 4G + break; + } + case ACCEL_RANGE_8G: { + // setting the accel range to 8G + if(writeRegister(ACCEL_CONFIG,ACCEL_FS_SEL_8G) < 0){ + return -1; + } + _accelScale = G * 8.0f/32767.5f; // setting the accel scale to 8G + break; + } + case ACCEL_RANGE_16G: { + // setting the accel range to 16G + if(writeRegister(ACCEL_CONFIG,ACCEL_FS_SEL_16G) < 0){ + return -1; + } + _accelScale = G * 16.0f/32767.5f; // setting the accel scale to 16G + break; + } + } + _accelRange = range; + return 1; +} + +/* sets the gyro full scale range to values other than default */ +int MPU9250::setGyroRange(GyroRange range) { + // use low speed SPI for register setting + _useSPIHS = false; + switch(range) { + case GYRO_RANGE_250DPS: { + // setting the gyro range to 250DPS + if(writeRegister(GYRO_CONFIG,GYRO_FS_SEL_250DPS) < 0){ + return -1; + } + _gyroScale = 250.0f/32767.5f * _d2r; // setting the gyro scale to 250DPS + break; + } + case GYRO_RANGE_500DPS: { + // setting the gyro range to 500DPS + if(writeRegister(GYRO_CONFIG,GYRO_FS_SEL_500DPS) < 0){ + return -1; + } + _gyroScale = 500.0f/32767.5f * _d2r; // setting the gyro scale to 500DPS + break; + } + case GYRO_RANGE_1000DPS: { + // setting the gyro range to 1000DPS + if(writeRegister(GYRO_CONFIG,GYRO_FS_SEL_1000DPS) < 0){ + return -1; + } + _gyroScale = 1000.0f/32767.5f * _d2r; // setting the gyro scale to 1000DPS + break; + } + case GYRO_RANGE_2000DPS: { + // setting the gyro range to 2000DPS + if(writeRegister(GYRO_CONFIG,GYRO_FS_SEL_2000DPS) < 0){ + return -1; + } + _gyroScale = 2000.0f/32767.5f * _d2r; // setting the gyro scale to 2000DPS + break; + } + } + _gyroRange = range; + return 1; +} + +/* sets the DLPF bandwidth to values other than default */ +int MPU9250::setDlpfBandwidth(DlpfBandwidth bandwidth) { + // use low speed SPI for register setting + _useSPIHS = false; + switch(bandwidth) { + case DLPF_BANDWIDTH_184HZ: { + if(writeRegister(ACCEL_CONFIG2,ACCEL_DLPF_184) < 0){ // setting accel bandwidth to 184Hz + return -1; + } + if(writeRegister(CONFIG,GYRO_DLPF_184) < 0){ // setting gyro bandwidth to 184Hz + return -2; + } + break; + } + case DLPF_BANDWIDTH_92HZ: { + if(writeRegister(ACCEL_CONFIG2,ACCEL_DLPF_92) < 0){ // setting accel bandwidth to 92Hz + return -1; + } + if(writeRegister(CONFIG,GYRO_DLPF_92) < 0){ // setting gyro bandwidth to 92Hz + return -2; + } + break; + } + case DLPF_BANDWIDTH_41HZ: { + if(writeRegister(ACCEL_CONFIG2,ACCEL_DLPF_41) < 0){ // setting accel bandwidth to 41Hz + return -1; + } + if(writeRegister(CONFIG,GYRO_DLPF_41) < 0){ // setting gyro bandwidth to 41Hz + return -2; + } + break; + } + case DLPF_BANDWIDTH_20HZ: { + if(writeRegister(ACCEL_CONFIG2,ACCEL_DLPF_20) < 0){ // setting accel bandwidth to 20Hz + return -1; + } + if(writeRegister(CONFIG,GYRO_DLPF_20) < 0){ // setting gyro bandwidth to 20Hz + return -2; + } + break; + } + case DLPF_BANDWIDTH_10HZ: { + if(writeRegister(ACCEL_CONFIG2,ACCEL_DLPF_10) < 0){ // setting accel bandwidth to 10Hz + return -1; + } + if(writeRegister(CONFIG,GYRO_DLPF_10) < 0){ // setting gyro bandwidth to 10Hz + return -2; + } + break; + } + case DLPF_BANDWIDTH_5HZ: { + if(writeRegister(ACCEL_CONFIG2,ACCEL_DLPF_5) < 0){ // setting accel bandwidth to 5Hz + return -1; + } + if(writeRegister(CONFIG,GYRO_DLPF_5) < 0){ // setting gyro bandwidth to 5Hz + return -2; + } + break; + } + } + _bandwidth = bandwidth; + return 1; +} + +/* sets the sample rate divider to values other than default */ +int MPU9250::setSrd(uint8_t srd) { + // use low speed SPI for register setting + _useSPIHS = false; + /* setting the sample rate divider to 19 to facilitate setting up magnetometer */ + if(writeRegister(SMPDIV,19) < 0){ // setting the sample rate divider + return -1; + } + if(srd > 9){ + // set AK8963 to Power Down + if(writeAK8963Register(AK8963_CNTL1,AK8963_PWR_DOWN) < 0){ + return -2; + } + delay(100); // long wait between AK8963 mode changes + // set AK8963 to 16 bit resolution, 8 Hz update rate + if(writeAK8963Register(AK8963_CNTL1,AK8963_CNT_MEAS1) < 0){ + return -3; + } + delay(100); // long wait between AK8963 mode changes + // instruct the MPU9250 to get 7 bytes of data from the AK8963 at the sample rate + readAK8963Registers(AK8963_HXL,7,_buffer); + } else { + // set AK8963 to Power Down + if(writeAK8963Register(AK8963_CNTL1,AK8963_PWR_DOWN) < 0){ + return -2; + } + delay(100); // long wait between AK8963 mode changes + // set AK8963 to 16 bit resolution, 100 Hz update rate + if(writeAK8963Register(AK8963_CNTL1,AK8963_CNT_MEAS2) < 0){ + return -3; + } + delay(100); // long wait between AK8963 mode changes + // instruct the MPU9250 to get 7 bytes of data from the AK8963 at the sample rate + readAK8963Registers(AK8963_HXL,7,_buffer); + } + /* setting the sample rate divider */ + if(writeRegister(SMPDIV,srd) < 0){ // setting the sample rate divider + return -4; + } + _srd = srd; + return 1; +} + +/* enables the data ready interrupt */ +int MPU9250::enableDataReadyInterrupt() { + // use low speed SPI for register setting + _useSPIHS = false; + /* setting the interrupt */ + if (writeRegister(INT_PIN_CFG,INT_PULSE_50US) < 0){ // setup interrupt, 50 us pulse + return -1; + } + if (writeRegister(INT_ENABLE,INT_RAW_RDY_EN) < 0){ // set to data ready + return -2; + } + return 1; +} + +/* disables the data ready interrupt */ +int MPU9250::disableDataReadyInterrupt() { + // use low speed SPI for register setting + _useSPIHS = false; + if(writeRegister(INT_ENABLE,INT_DISABLE) < 0){ // disable interrupt + return -1; + } + return 1; +} + +/* configures and enables wake on motion, low power mode */ +int MPU9250::enableWakeOnMotion(float womThresh_mg,LpAccelOdr odr) { + // use low speed SPI for register setting + _useSPIHS = false; + // set AK8963 to Power Down + writeAK8963Register(AK8963_CNTL1,AK8963_PWR_DOWN); + // reset the MPU9250 + writeRegister(PWR_MGMNT_1,PWR_RESET); + // wait for MPU-9250 to come back up + delay(1); + if(writeRegister(PWR_MGMNT_1,0x00) < 0){ // cycle 0, sleep 0, standby 0 + return -1; + } + if(writeRegister(PWR_MGMNT_2,DIS_GYRO) < 0){ // disable gyro measurements + return -2; + } + if(writeRegister(ACCEL_CONFIG2,ACCEL_DLPF_184) < 0){ // setting accel bandwidth to 184Hz + return -3; + } + if(writeRegister(INT_ENABLE,INT_WOM_EN) < 0){ // enabling interrupt to wake on motion + return -4; + } + if(writeRegister(MOT_DETECT_CTRL,(ACCEL_INTEL_EN | ACCEL_INTEL_MODE)) < 0){ // enabling accel hardware intelligence + return -5; + } + _womThreshold = map(womThresh_mg, 0, 1020, 0, 255); + if(writeRegister(WOM_THR,_womThreshold) < 0){ // setting wake on motion threshold + return -6; + } + if(writeRegister(LP_ACCEL_ODR,(uint8_t)odr) < 0){ // set frequency of wakeup + return -7; + } + if(writeRegister(PWR_MGMNT_1,PWR_CYCLE) < 0){ // switch to accel low power mode + return -8; + } + return 1; +} + +/* configures and enables the FIFO buffer */ +int MPU9250FIFO::enableFifo(bool accel,bool gyro,bool mag,bool temp) { + // use low speed SPI for register setting + _useSPIHS = false; + if(writeRegister(USER_CTRL, (0x40 | I2C_MST_EN)) < 0){ + return -1; + } + if(writeRegister(FIFO_EN,(accel*FIFO_ACCEL)|(gyro*FIFO_GYRO)|(mag*FIFO_MAG)|(temp*FIFO_TEMP)) < 0){ + return -2; + } + _enFifoAccel = accel; + _enFifoGyro = gyro; + _enFifoMag = mag; + _enFifoTemp = temp; + _fifoFrameSize = accel*6 + gyro*6 + mag*7 + temp*2; + return 1; +} + +/* reads the most current data from MPU9250 and stores in buffer */ +int MPU9250::readSensor() { + _useSPIHS = true; // use the high speed SPI for data readout + // grab the data from the MPU9250 + if (readRegisters(ACCEL_OUT, 21, _buffer) < 0) { + return -1; + } + // combine into 16 bit values + _axcounts = (((int16_t)_buffer[0]) << 8) | _buffer[1]; + _aycounts = (((int16_t)_buffer[2]) << 8) | _buffer[3]; + _azcounts = (((int16_t)_buffer[4]) << 8) | _buffer[5]; + _tcounts = (((int16_t)_buffer[6]) << 8) | _buffer[7]; + _gxcounts = (((int16_t)_buffer[8]) << 8) | _buffer[9]; + _gycounts = (((int16_t)_buffer[10]) << 8) | _buffer[11]; + _gzcounts = (((int16_t)_buffer[12]) << 8) | _buffer[13]; + _hxcounts = (((int16_t)_buffer[15]) << 8) | _buffer[14]; + _hycounts = (((int16_t)_buffer[17]) << 8) | _buffer[16]; + _hzcounts = (((int16_t)_buffer[19]) << 8) | _buffer[18]; + // transform and convert to float values + _ax = (((float)(tX[0]*_axcounts + tX[1]*_aycounts + tX[2]*_azcounts) * _accelScale) - _axb)*_axs; + _ay = (((float)(tY[0]*_axcounts + tY[1]*_aycounts + tY[2]*_azcounts) * _accelScale) - _ayb)*_ays; + _az = (((float)(tZ[0]*_axcounts + tZ[1]*_aycounts + tZ[2]*_azcounts) * _accelScale) - _azb)*_azs; + _gx = ((float)(tX[0]*_gxcounts + tX[1]*_gycounts + tX[2]*_gzcounts) * _gyroScale) - _gxb; + _gy = ((float)(tY[0]*_gxcounts + tY[1]*_gycounts + tY[2]*_gzcounts) * _gyroScale) - _gyb; + _gz = ((float)(tZ[0]*_gxcounts + tZ[1]*_gycounts + tZ[2]*_gzcounts) * _gyroScale) - _gzb; + _hrx = ((float)(_hxcounts) * _magScaleX); + _hry = ((float)(_hycounts) * _magScaleY); + _hrz = ((float)(_hzcounts) * _magScaleZ); + + _hrax = (_hrax*((float)_coeff-1)+_hrx)/((float)_coeff); + _hray = (_hray*((float)_coeff-1)+_hry)/((float)_coeff); + _hraz = (_hraz*((float)_coeff-1)+_hrz)/((float)_coeff); + + if(_autoMag) + { + updateMagMinMax(_hrax,_hray,_hraz); + recalibrateMag(); + } + + _hx = (((float)(_hxcounts) * _magScaleX) - _hxb)*_hxs; + _hy = (((float)(_hycounts) * _magScaleY) - _hyb)*_hys; + _hz = (((float)(_hzcounts) * _magScaleZ) - _hzb)*_hzs; + _t = ((((float) _tcounts) - _tempOffset)/_tempScale) + _tempOffset; + return 1; +} + +/* returns the accelerometer measurement in the x direction, m/s/s */ +float MPU9250::getAccelX_mss() { + return _ax; +} + +/* returns the accelerometer measurement in the y direction, m/s/s */ +float MPU9250::getAccelY_mss() { + return _ay; +} + +/* returns the accelerometer measurement in the z direction, m/s/s */ +float MPU9250::getAccelZ_mss() { + return _az; +} + +/* returns the gyroscope measurement in the x direction, rad/s */ +float MPU9250::getGyroX_rads() { + return _gx; +} + +/* returns the gyroscope measurement in the y direction, rad/s */ +float MPU9250::getGyroY_rads() { + return _gy; +} + +/* returns the gyroscope measurement in the z direction, rad/s */ +float MPU9250::getGyroZ_rads() { + return _gz; +} + +/* returns the magnetometer measurement in the x direction, uT */ +float MPU9250::getMagX_uT() { + return _hx; +} + +/* returns the magnetometer measurement in the y direction, uT */ +float MPU9250::getMagY_uT() { + return _hy; +} + +/* returns the magnetometer measurement in the z direction, uT */ +float MPU9250::getMagZ_uT() { + return _hz; +} + + +float MPU9250::getRawMagX_uT() { + return _hrx; +} + +float MPU9250::getRawMagY_uT() { + return _hry; +} + +float MPU9250::getRawMagZ_uT() { + return _hrz; +} + +/* returns the die temperature, C */ +float MPU9250::getTemperature_C() { + return _t; +} + +/* reads data from the MPU9250 FIFO and stores in buffer */ +int MPU9250FIFO::readFifo() { + _useSPIHS = true; // use the high speed SPI for data readout + // get the fifo size + readRegisters(FIFO_COUNT, 2, _buffer); + _fifoSize = (((uint16_t) (_buffer[0]&0x0F)) <<8) + (((uint16_t) _buffer[1])); + // read and parse the buffer + for (size_t i=0; i < _fifoSize/_fifoFrameSize; i++) { + // grab the data from the MPU9250 + if (readRegisters(FIFO_READ,_fifoFrameSize,_buffer) < 0) { + return -1; + } + if (_enFifoAccel) { + // combine into 16 bit values + _axcounts = (((int16_t)_buffer[0]) << 8) | _buffer[1]; + _aycounts = (((int16_t)_buffer[2]) << 8) | _buffer[3]; + _azcounts = (((int16_t)_buffer[4]) << 8) | _buffer[5]; + // transform and convert to float values + _axFifo[i] = (((float)(tX[0]*_axcounts + tX[1]*_aycounts + tX[2]*_azcounts) * _accelScale)-_axb)*_axs; + _ayFifo[i] = (((float)(tY[0]*_axcounts + tY[1]*_aycounts + tY[2]*_azcounts) * _accelScale)-_ayb)*_ays; + _azFifo[i] = (((float)(tZ[0]*_axcounts + tZ[1]*_aycounts + tZ[2]*_azcounts) * _accelScale)-_azb)*_azs; + _aSize = _fifoSize/_fifoFrameSize; + } + if (_enFifoTemp) { + // combine into 16 bit values + _tcounts = (((int16_t)_buffer[0 + _enFifoAccel*6]) << 8) | _buffer[1 + _enFifoAccel*6]; + // transform and convert to float values + _tFifo[i] = ((((float) _tcounts) - _tempOffset)/_tempScale) + _tempOffset; + _tSize = _fifoSize/_fifoFrameSize; + } + if (_enFifoGyro) { + // combine into 16 bit values + _gxcounts = (((int16_t)_buffer[0 + _enFifoAccel*6 + _enFifoTemp*2]) << 8) | _buffer[1 + _enFifoAccel*6 + _enFifoTemp*2]; + _gycounts = (((int16_t)_buffer[2 + _enFifoAccel*6 + _enFifoTemp*2]) << 8) | _buffer[3 + _enFifoAccel*6 + _enFifoTemp*2]; + _gzcounts = (((int16_t)_buffer[4 + _enFifoAccel*6 + _enFifoTemp*2]) << 8) | _buffer[5 + _enFifoAccel*6 + _enFifoTemp*2]; + // transform and convert to float values + _gxFifo[i] = ((float)(tX[0]*_gxcounts + tX[1]*_gycounts + tX[2]*_gzcounts) * _gyroScale) - _gxb; + _gyFifo[i] = ((float)(tY[0]*_gxcounts + tY[1]*_gycounts + tY[2]*_gzcounts) * _gyroScale) - _gyb; + _gzFifo[i] = ((float)(tZ[0]*_gxcounts + tZ[1]*_gycounts + tZ[2]*_gzcounts) * _gyroScale) - _gzb; + _gSize = _fifoSize/_fifoFrameSize; + } + if (_enFifoMag) { + // combine into 16 bit values + _hxcounts = (((int16_t)_buffer[1 + _enFifoAccel*6 + _enFifoTemp*2 + _enFifoGyro*6]) << 8) | _buffer[0 + _enFifoAccel*6 + _enFifoTemp*2 + _enFifoGyro*6]; + _hycounts = (((int16_t)_buffer[3 + _enFifoAccel*6 + _enFifoTemp*2 + _enFifoGyro*6]) << 8) | _buffer[2 + _enFifoAccel*6 + _enFifoTemp*2 + _enFifoGyro*6]; + _hzcounts = (((int16_t)_buffer[5 + _enFifoAccel*6 + _enFifoTemp*2 + _enFifoGyro*6]) << 8) | _buffer[4 + _enFifoAccel*6 + _enFifoTemp*2 + _enFifoGyro*6]; + // transform and convert to float values + _hxFifo[i] = (((float)(_hxcounts) * _magScaleX) - _hxb)*_hxs; + _hyFifo[i] = (((float)(_hycounts) * _magScaleY) - _hyb)*_hys; + _hzFifo[i] = (((float)(_hzcounts) * _magScaleZ) - _hzb)*_hzs; + _hSize = _fifoSize/_fifoFrameSize; + } + } + return _fifoSize/_fifoFrameSize; +} + +/* returns the accelerometer FIFO size and data in the x direction, m/s/s */ +void MPU9250FIFO::getFifoAccelX_mss(size_t *size,float* data) { + *size = _aSize; + memcpy(data,_axFifo,_aSize*sizeof(float)); +} + +/* returns the accelerometer FIFO size and data in the y direction, m/s/s */ +void MPU9250FIFO::getFifoAccelY_mss(size_t *size,float* data) { + *size = _aSize; + memcpy(data,_ayFifo,_aSize*sizeof(float)); +} + +/* returns the accelerometer FIFO size and data in the z direction, m/s/s */ +void MPU9250FIFO::getFifoAccelZ_mss(size_t *size,float* data) { + *size = _aSize; + memcpy(data,_azFifo,_aSize*sizeof(float)); +} + +/* returns the gyroscope FIFO size and data in the x direction, rad/s */ +void MPU9250FIFO::getFifoGyroX_rads(size_t *size,float* data) { + *size = _gSize; + memcpy(data,_gxFifo,_gSize*sizeof(float)); +} + +/* returns the gyroscope FIFO size and data in the y direction, rad/s */ +void MPU9250FIFO::getFifoGyroY_rads(size_t *size,float* data) { + *size = _gSize; + memcpy(data,_gyFifo,_gSize*sizeof(float)); +} + +/* returns the gyroscope FIFO size and data in the z direction, rad/s */ +void MPU9250FIFO::getFifoGyroZ_rads(size_t *size,float* data) { + *size = _gSize; + memcpy(data,_gzFifo,_gSize*sizeof(float)); +} + +/* returns the magnetometer FIFO size and data in the x direction, uT */ +void MPU9250FIFO::getFifoMagX_uT(size_t *size,float* data) { + *size = _hSize; + memcpy(data,_hxFifo,_hSize*sizeof(float)); +} + +/* returns the magnetometer FIFO size and data in the y direction, uT */ +void MPU9250FIFO::getFifoMagY_uT(size_t *size,float* data) { + *size = _hSize; + memcpy(data,_hyFifo,_hSize*sizeof(float)); +} + +/* returns the magnetometer FIFO size and data in the z direction, uT */ +void MPU9250FIFO::getFifoMagZ_uT(size_t *size,float* data) { + *size = _hSize; + memcpy(data,_hzFifo,_hSize*sizeof(float)); +} + +/* returns the die temperature FIFO size and data, C */ +void MPU9250FIFO::getFifoTemperature_C(size_t *size,float* data) { + *size = _tSize; + memcpy(data,_tFifo,_tSize*sizeof(float)); +} + +/* estimates the gyro biases */ +int MPU9250::calibrateGyro() { + // set the range, bandwidth, and srd + if (setGyroRange(GYRO_RANGE_250DPS) < 0) { + return -1; + } + if (setDlpfBandwidth(DLPF_BANDWIDTH_20HZ) < 0) { + return -2; + } + if (setSrd(19) < 0) { + return -3; + } + + // take samples and find bias + _gxbD = 0; + _gybD = 0; + _gzbD = 0; + for (size_t i=0; i < _numSamples; i++) { + readSensor(); + _gxbD += (getGyroX_rads() + _gxb)/((double)_numSamples); + _gybD += (getGyroY_rads() + _gyb)/((double)_numSamples); + _gzbD += (getGyroZ_rads() + _gzb)/((double)_numSamples); + delay(20); + } + _gxb = (float)_gxbD; + _gyb = (float)_gybD; + _gzb = (float)_gzbD; + + // set the range, bandwidth, and srd back to what they were + if (setGyroRange(_gyroRange) < 0) { + return -4; + } + if (setDlpfBandwidth(_bandwidth) < 0) { + return -5; + } + if (setSrd(_srd) < 0) { + return -6; + } + return 1; +} + +/* returns the gyro bias in the X direction, rad/s */ +float MPU9250::getGyroBiasX_rads() { + return _gxb; +} + +/* returns the gyro bias in the Y direction, rad/s */ +float MPU9250::getGyroBiasY_rads() { + return _gyb; +} + +/* returns the gyro bias in the Z direction, rad/s */ +float MPU9250::getGyroBiasZ_rads() { + return _gzb; +} + +/* sets the gyro bias in the X direction to bias, rad/s */ +void MPU9250::setGyroBiasX_rads(float bias) { + _gxb = bias; +} + +/* sets the gyro bias in the Y direction to bias, rad/s */ +void MPU9250::setGyroBiasY_rads(float bias) { + _gyb = bias; +} + +/* sets the gyro bias in the Z direction to bias, rad/s */ +void MPU9250::setGyroBiasZ_rads(float bias) { + _gzb = bias; +} + +/* finds bias and scale factor calibration for the accelerometer, +this should be run for each axis in each direction (6 total) to find +the min and max values along each */ +int MPU9250::calibrateAccel() { + // set the range, bandwidth, and srd + if (setAccelRange(ACCEL_RANGE_2G) < 0) { + return -1; + } + if (setDlpfBandwidth(DLPF_BANDWIDTH_20HZ) < 0) { + return -2; + } + if (setSrd(19) < 0) { + return -3; + } + + // take samples and find min / max + _axbD = 0; + _aybD = 0; + _azbD = 0; + for (size_t i=0; i < _numSamples; i++) { + readSensor(); + _axbD += (getAccelX_mss()/_axs + _axb)/((double)_numSamples); + _aybD += (getAccelY_mss()/_ays + _ayb)/((double)_numSamples); + _azbD += (getAccelZ_mss()/_azs + _azb)/((double)_numSamples); + delay(20); + } + if (_axbD > 9.0f) { + _axmax = (float)_axbD; + } + if (_aybD > 9.0f) { + _aymax = (float)_aybD; + } + if (_azbD > 9.0f) { + _azmax = (float)_azbD; + } + if (_axbD < -9.0f) { + _axmin = (float)_axbD; + } + if (_aybD < -9.0f) { + _aymin = (float)_aybD; + } + if (_azbD < -9.0f) { + _azmin = (float)_azbD; + } + + // find bias and scale factor + if ((abs(_axmin) > 9.0f) && (abs(_axmax) > 9.0f)) { + _axb = (_axmin + _axmax) / 2.0f; + _axs = G/((abs(_axmin) + abs(_axmax)) / 2.0f); + } + if ((abs(_aymin) > 9.0f) && (abs(_aymax) > 9.0f)) { + _ayb = (_aymin + _aymax) / 2.0f; + _ays = G/((abs(_aymin) + abs(_aymax)) / 2.0f); + } + if ((abs(_azmin) > 9.0f) && (abs(_azmax) > 9.0f)) { + _azb = (_azmin + _azmax) / 2.0f; + _azs = G/((abs(_azmin) + abs(_azmax)) / 2.0f); + } + + // set the range, bandwidth, and srd back to what they were + if (setAccelRange(_accelRange) < 0) { + return -4; + } + if (setDlpfBandwidth(_bandwidth) < 0) { + return -5; + } + if (setSrd(_srd) < 0) { + return -6; + } + return 1; +} + +/* returns the accelerometer bias in the X direction, m/s/s */ +float MPU9250::getAccelBiasX_mss() { + return _axb; +} + +/* returns the accelerometer scale factor in the X direction */ +float MPU9250::getAccelScaleFactorX() { + return _axs; +} + +/* returns the accelerometer bias in the Y direction, m/s/s */ +float MPU9250::getAccelBiasY_mss() { + return _ayb; +} + +/* returns the accelerometer scale factor in the Y direction */ +float MPU9250::getAccelScaleFactorY() { + return _ays; +} + +/* returns the accelerometer bias in the Z direction, m/s/s */ +float MPU9250::getAccelBiasZ_mss() { + return _azb; +} + +/* returns the accelerometer scale factor in the Z direction */ +float MPU9250::getAccelScaleFactorZ() { + return _azs; +} + +/* sets the accelerometer bias (m/s/s) and scale factor in the X direction */ +void MPU9250::setAccelCalX(float bias,float scaleFactor) { + _axb = bias; + _axs = scaleFactor; +} + +/* sets the accelerometer bias (m/s/s) and scale factor in the Y direction */ +void MPU9250::setAccelCalY(float bias,float scaleFactor) { + _ayb = bias; + _ays = scaleFactor; +} + +/* sets the accelerometer bias (m/s/s) and scale factor in the Z direction */ +void MPU9250::setAccelCalZ(float bias,float scaleFactor) { + _azb = bias; + _azs = scaleFactor; +} + +/* finds bias and scale factor calibration for the magnetometer, +the sensor should be rotated in a figure 8 motion until complete */ +int MPU9250::calibrateMag() { + // set the srd + if (setSrd(19) < 0) { + return -1; + } + + // get a starting set of data + readSensor(); + _hxmax = getRawMagX_uT(); + _hxmin = getRawMagX_uT(); + _hymax = getRawMagY_uT(); + _hymin = getRawMagY_uT(); + _hzmax = getRawMagZ_uT(); + _hzmin = getRawMagZ_uT(); + + // collect data to find max / min in each channel + _counter = 0; + while (_counter < _maxCounts) { + _delta = 0.0f; + _framedelta = 0.0f; + readSensor(); + _hxfilt = (_hxfilt*((float)_coeff-1)+getRawMagX_uT())/((float)_coeff); + _hyfilt = (_hyfilt*((float)_coeff-1)+getRawMagY_uT())/((float)_coeff); + _hzfilt = (_hzfilt*((float)_coeff-1)+getRawMagZ_uT())/((float)_coeff); + + if (_hxfilt > _hxmax) { + _delta = _hxfilt - _hxmax; + _hxmax = _hxfilt; + } + if (_delta > _framedelta) { + _framedelta = _delta; + } + if (_hyfilt > _hymax) { + _delta = _hyfilt - _hymax; + _hymax = _hyfilt; + } + if (_delta > _framedelta) { + _framedelta = _delta; + } + if (_hzfilt > _hzmax) { + _delta = _hzfilt - _hzmax; + _hzmax = _hzfilt; + } + if (_delta > _framedelta) { + _framedelta = _delta; + } + if (_hxfilt < _hxmin) { + _delta = abs(_hxfilt - _hxmin); + _hxmin = _hxfilt; + } + if (_delta > _framedelta) { + _framedelta = _delta; + } + if (_hyfilt < _hymin) { + _delta = abs(_hyfilt - _hymin); + _hymin = _hyfilt; + } + if (_delta > _framedelta) { + _framedelta = _delta; + } + if (_hzfilt < _hzmin) { + _delta = abs(_hzfilt - _hzmin); + _hzmin = _hzfilt; + } + if (_delta > _framedelta) { + _framedelta = _delta; + } + if (_framedelta > _deltaThresh) { + _counter = 0; + } else { + _counter++; + } + delay(20); + } + + recalibrateMag(); + + // set the srd back to what it was + if (setSrd(_srd) < 0) { + return -2; + } + return 1; +} + +/* returns the magnetometer bias in the X direction, uT */ +float MPU9250::getMagBiasX_uT() { + return _hxb; +} + +/* returns the magnetometer scale factor in the X direction */ +float MPU9250::getMagScaleFactorX() { + return _hxs; +} + +/* returns the magnetometer bias in the Y direction, uT */ +float MPU9250::getMagBiasY_uT() { + return _hyb; +} + +/* returns the magnetometer scale factor in the Y direction */ +float MPU9250::getMagScaleFactorY() { + return _hys; +} + +/* returns the magnetometer bias in the Z direction, uT */ +float MPU9250::getMagBiasZ_uT() { + return _hzb; +} + +/* returns the magnetometer scale factor in the Z direction */ +float MPU9250::getMagScaleFactorZ() { + return _hzs; +} + +/* sets the magnetometer bias (uT) and scale factor in the X direction */ +void MPU9250::setMagCalX(float bias,float scaleFactor) { + _hxb = bias; + _hxs = scaleFactor; +} + +/* sets the magnetometer bias (uT) and scale factor in the Y direction */ +void MPU9250::setMagCalY(float bias,float scaleFactor) { + _hyb = bias; + _hys = scaleFactor; +} + +/* sets the magnetometer bias (uT) and scale factor in the Z direction */ +void MPU9250::setMagCalZ(float bias,float scaleFactor) { + _hzb = bias; + _hzs = scaleFactor; +} + +/* writes a byte to MPU9250 register given a register address and data */ +int MPU9250::writeRegister(uint8_t subAddress, uint8_t data){ + /* write data to device */ + if( _useSPI ){ + _spi->beginTransaction(SPISettings(SPI_LS_CLOCK, MSBFIRST, SPI_MODE3)); // begin the transaction + digitalWrite(_csPin,LOW); // select the MPU9250 chip + _spi->transfer(subAddress); // write the register address + _spi->transfer(data); // write the data + digitalWrite(_csPin,HIGH); // deselect the MPU9250 chip + _spi->endTransaction(); // end the transaction + } + else{ + _i2c->beginTransmission(_address); // open the device + _i2c->write(subAddress); // write the register address + _i2c->write(data); // write the data + _i2c->endTransmission(); + } + + delay(10); + + /* read back the register */ + readRegisters(subAddress,1,_buffer); + /* check the read back register against the written register */ + if(_buffer[0] == data) { + return 1; + } + else{ + return -1; + } +} + +/* reads registers from MPU9250 given a starting register address, number of bytes, and a pointer to store data */ +int MPU9250::readRegisters(uint8_t subAddress, uint8_t count, uint8_t* dest){ + if( _useSPI ){ + // begin the transaction + if(_useSPIHS){ + _spi->beginTransaction(SPISettings(SPI_HS_CLOCK, MSBFIRST, SPI_MODE3)); + } + else{ + _spi->beginTransaction(SPISettings(SPI_LS_CLOCK, MSBFIRST, SPI_MODE3)); + } + digitalWrite(_csPin,LOW); // select the MPU9250 chip + _spi->transfer(subAddress | SPI_READ); // specify the starting register address + for(uint8_t i = 0; i < count; i++){ + dest[i] = _spi->transfer(0x00); // read the data + } + digitalWrite(_csPin,HIGH); // deselect the MPU9250 chip + _spi->endTransaction(); // end the transaction + return 1; + } + else{ + _i2c->beginTransmission(_address); // open the device + _i2c->write(subAddress); // specify the starting register address + _i2c->endTransmission(false); + _numBytes = _i2c->requestFrom(_address, count); // specify the number of bytes to receive + if (_numBytes == count) { + for(uint8_t i = 0; i < count; i++){ + dest[i] = _i2c->read(); + } + return 1; + } else { + return -1; + } + } +} + +/* writes a register to the AK8963 given a register address and data */ +int MPU9250::writeAK8963Register(uint8_t subAddress, uint8_t data){ + // set slave 0 to the AK8963 and set for write + if (writeRegister(I2C_SLV0_ADDR,AK8963_I2C_ADDR) < 0) { + return -1; + } + // set the register to the desired AK8963 sub address + if (writeRegister(I2C_SLV0_REG,subAddress) < 0) { + return -2; + } + // store the data for write + if (writeRegister(I2C_SLV0_DO,data) < 0) { + return -3; + } + // enable I2C and send 1 byte + if (writeRegister(I2C_SLV0_CTRL,I2C_SLV0_EN | (uint8_t)1) < 0) { + return -4; + } + // read the register and confirm + if (readAK8963Registers(subAddress,1,_buffer) < 0) { + return -5; + } + if(_buffer[0] == data) { + return 1; + } else{ + return -6; + } +} + +/* reads registers from the AK8963 */ +int MPU9250::readAK8963Registers(uint8_t subAddress, uint8_t count, uint8_t* dest){ + // set slave 0 to the AK8963 and set for read + if (writeRegister(I2C_SLV0_ADDR,AK8963_I2C_ADDR | I2C_READ_FLAG) < 0) { + return -1; + } + // set the register to the desired AK8963 sub address + if (writeRegister(I2C_SLV0_REG,subAddress) < 0) { + return -2; + } + // enable I2C and request the bytes + if (writeRegister(I2C_SLV0_CTRL,I2C_SLV0_EN | count) < 0) { + return -3; + } + delay(1); // takes some time for these registers to fill + // read the bytes off the MPU9250 EXT_SENS_DATA registers + _status = readRegisters(EXT_SENS_DATA_00,count,dest); + return _status; +} + +/* gets the MPU9250 WHO_AM_I register value, expected to be 0x71 */ +int MPU9250::whoAmI(){ + // read the WHO AM I register + if (readRegisters(WHO_AM_I,1,_buffer) < 0) { + return -1; + } + // return the register value + return _buffer[0]; +} + +/* gets the AK8963 WHO_AM_I register value, expected to be 0x48 */ +int MPU9250::whoAmIAK8963(){ + // read the WHO AM I register + if (readAK8963Registers(AK8963_WHO_AM_I,1,_buffer) < 0) { + return -1; + } + // return the register value + return _buffer[0]; +} + +void MPU9250::getMagMinMax(float &minX, float &maxX, float &minY, float &maxY, float &minZ, float &maxZ) +{ + minX = _hxmin; + maxX = _hxmax; + + minY = _hymin; + maxY = _hymax; + + minZ = _hzmin; + maxZ = _hzmax; +} + +void MPU9250::setMagMinMax(float minX, float maxX, float minY, float maxY, float minZ, float maxZ) +{ + _hxmin = minX; + _hxmax = maxX; + + _hymin = minY; + _hymax = maxY; + + _hzmin = minZ; + _hzmax = maxZ; +} + +void MPU9250::recalibrateMagByBias() +{ + _hxs = max(_hxmax-_hxb,_hxb-_hxmin); + _hys = max(_hymax-_hyb,_hyb-_hymin); + _hzs = max(_hzmax-_hzb,_hzb-_hzmin); + float _avgs = (_hxs + _hys + _hzs) / 3.0f; + _hxs = _avgs/_hxs; + _hys = _avgs/_hys; + _hzs = _avgs/_hzs; +} + +void MPU9250::recalibrateMag() +{ + _hxb = (_hxmax + _hxmin) / 2.0f; + _hyb = (_hymax + _hymin) / 2.0f; + _hzb = (_hzmax + _hzmin) / 2.0f; + + // find the magnetometer scale factor + _hxs = (_hxmax - _hxmin) / 2.0f; + _hys = (_hymax - _hymin) / 2.0f; + _hzs = (_hzmax - _hzmin) / 2.0f; + float _avgs = (_hxs + _hys + _hzs) / 3.0f; + _hxs = _avgs/_hxs; + _hys = _avgs/_hys; + _hzs = _avgs/_hzs; +} + +void MPU9250::updateMagMinMax(float mx, float my, float mz) +{ + if (mx > _hxmax) { + _hxmax = mx; + } + if (my > _hymax) { + _hymax = my; + } + if (mz > _hzmax) { + _hzmax = mz; + } + if (mx < _hxmin) { + _hxmin = mx; + } + if (my < _hymin) { + _hymin = my; + } + if (mz < _hzmin) { + _hzmin = mz; + } +} \ No newline at end of file diff --git a/src/MPU9250/MPU9250.h b/src/MPU9250/MPU9250.h new file mode 100644 index 0000000..58935e5 --- /dev/null +++ b/src/MPU9250/MPU9250.h @@ -0,0 +1,322 @@ +/* + MPU9250.h + Brian R Taylor + brian.taylor@bolderflight.com + + Copyright (c) 2017 Bolder Flight Systems + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef MPU9250_h +#define MPU9250_h + +#include "Arduino.h" +#include "Wire.h" // I2C library +#include "SPI.h" // SPI library + +class MPU9250{ + public: + enum GyroRange + { + GYRO_RANGE_250DPS, + GYRO_RANGE_500DPS, + GYRO_RANGE_1000DPS, + GYRO_RANGE_2000DPS + }; + enum AccelRange + { + ACCEL_RANGE_2G, + ACCEL_RANGE_4G, + ACCEL_RANGE_8G, + ACCEL_RANGE_16G + }; + enum DlpfBandwidth + { + DLPF_BANDWIDTH_184HZ, + DLPF_BANDWIDTH_92HZ, + DLPF_BANDWIDTH_41HZ, + DLPF_BANDWIDTH_20HZ, + DLPF_BANDWIDTH_10HZ, + DLPF_BANDWIDTH_5HZ + }; + enum LpAccelOdr + { + LP_ACCEL_ODR_0_24HZ = 0, + LP_ACCEL_ODR_0_49HZ = 1, + LP_ACCEL_ODR_0_98HZ = 2, + LP_ACCEL_ODR_1_95HZ = 3, + LP_ACCEL_ODR_3_91HZ = 4, + LP_ACCEL_ODR_7_81HZ = 5, + LP_ACCEL_ODR_15_63HZ = 6, + LP_ACCEL_ODR_31_25HZ = 7, + LP_ACCEL_ODR_62_50HZ = 8, + LP_ACCEL_ODR_125HZ = 9, + LP_ACCEL_ODR_250HZ = 10, + LP_ACCEL_ODR_500HZ = 11 + }; + MPU9250(TwoWire &bus,uint8_t address); + MPU9250(SPIClass &bus,uint8_t csPin); + int begin(); + int setAccelRange(AccelRange range); + int setGyroRange(GyroRange range); + int setDlpfBandwidth(DlpfBandwidth bandwidth); + int setSrd(uint8_t srd); + int enableDataReadyInterrupt(); + int disableDataReadyInterrupt(); + int enableWakeOnMotion(float womThresh_mg,LpAccelOdr odr); + int readSensor(); + float getAccelX_mss(); + float getAccelY_mss(); + float getAccelZ_mss(); + float getGyroX_rads(); + float getGyroY_rads(); + float getGyroZ_rads(); + float getMagX_uT(); + float getMagY_uT(); + float getMagZ_uT(); + float getTemperature_C(); + + int calibrateGyro(); + float getGyroBiasX_rads(); + float getGyroBiasY_rads(); + float getGyroBiasZ_rads(); + void setGyroBiasX_rads(float bias); + void setGyroBiasY_rads(float bias); + void setGyroBiasZ_rads(float bias); + int calibrateAccel(); + float getAccelBiasX_mss(); + float getAccelScaleFactorX(); + float getAccelBiasY_mss(); + float getAccelScaleFactorY(); + float getAccelBiasZ_mss(); + float getAccelScaleFactorZ(); + void setAccelCalX(float bias,float scaleFactor); + void setAccelCalY(float bias,float scaleFactor); + void setAccelCalZ(float bias,float scaleFactor); + int calibrateMag(); + float getMagBiasX_uT(); + float getMagScaleFactorX(); + float getMagBiasY_uT(); + float getMagScaleFactorY(); + float getMagBiasZ_uT(); + float getMagScaleFactorZ(); + void setMagCalX(float bias,float scaleFactor); + void setMagCalY(float bias,float scaleFactor); + void setMagCalZ(float bias,float scaleFactor); + void getMagMinMax(float &minX, float &maxX, float &minY, float &maxY, float &minZ, float &maxZ); + void setMagMinMax(float minX, float maxX, float minY, float maxY, float minZ, float maxZ); + void recalibrateMag(); + void recalibrateMagByBias(); + void updateMagMinMax(float mx, float my, float mz); + float getRawMagX_uT(); + float getRawMagY_uT(); + float getRawMagZ_uT(); + void setAutoMag(bool v) { _autoMag = v; } + bool getAutoMag() { return _autoMag; } + protected: + bool _autoMag = false; + // i2c + uint8_t _address; + TwoWire *_i2c; + const uint32_t _i2cRate = 400000; // 400 kHz + size_t _numBytes; // number of bytes received from I2C + // spi + SPIClass *_spi; + uint8_t _csPin; + bool _useSPI; + bool _useSPIHS; + const uint8_t SPI_READ = 0x80; + const uint32_t SPI_LS_CLOCK = 1000000; // 1 MHz + const uint32_t SPI_HS_CLOCK = 15000000; // 15 MHz + // track success of interacting with sensor + int _status; + // buffer for reading from sensor + uint8_t _buffer[21]; + // data counts + int16_t _axcounts,_aycounts,_azcounts; + int16_t _gxcounts,_gycounts,_gzcounts; + int16_t _hxcounts,_hycounts,_hzcounts; + int16_t _tcounts; + // data buffer + float _ax, _ay, _az; + float _gx, _gy, _gz; + float _hx, _hy, _hz; + float _hrx, _hry, _hrz; + float _hrax, _hray, _hraz; + float _t; + // wake on motion + uint8_t _womThreshold; + // scale factors + float _accelScale; + float _gyroScale; + float _magScaleX, _magScaleY, _magScaleZ; + const float _tempScale = 333.87f; + const float _tempOffset = 21.0f; + // configuration + AccelRange _accelRange; + GyroRange _gyroRange; + DlpfBandwidth _bandwidth; + uint8_t _srd; + // gyro bias estimation + size_t _numSamples = 100; + double _gxbD, _gybD, _gzbD; + float _gxb, _gyb, _gzb; + // accel bias and scale factor estimation + double _axbD, _aybD, _azbD; + float _axmax, _aymax, _azmax; + float _axmin, _aymin, _azmin; + float _axb, _ayb, _azb; + float _axs = 1.0f; + float _ays = 1.0f; + float _azs = 1.0f; + // magnetometer bias and scale factor estimation + uint16_t _maxCounts = 1000; + float _deltaThresh = 0.3f; + uint8_t _coeff = 8; + uint16_t _counter; + float _framedelta, _delta; + float _hxfilt, _hyfilt, _hzfilt; + float _hxmax, _hymax, _hzmax; + float _hxmin, _hymin, _hzmin; + float _hxb, _hyb, _hzb; + float _hxs = 1.0f; + float _hys = 1.0f; + float _hzs = 1.0f; + float _avgs; + // transformation matrix + /* transform the accel and gyro axes to match the magnetometer axes */ + const int16_t tX[3] = {0, 1, 0}; + const int16_t tY[3] = {1, 0, 0}; + const int16_t tZ[3] = {0, 0, -1}; + // constants + const float G = 9.807f; + const float _d2r = 3.14159265359f/180.0f; + // MPU9250 registers + const uint8_t ACCEL_OUT = 0x3B; + const uint8_t GYRO_OUT = 0x43; + const uint8_t TEMP_OUT = 0x41; + const uint8_t EXT_SENS_DATA_00 = 0x49; + const uint8_t ACCEL_CONFIG = 0x1C; + const uint8_t ACCEL_FS_SEL_2G = 0x00; + const uint8_t ACCEL_FS_SEL_4G = 0x08; + const uint8_t ACCEL_FS_SEL_8G = 0x10; + const uint8_t ACCEL_FS_SEL_16G = 0x18; + const uint8_t GYRO_CONFIG = 0x1B; + const uint8_t GYRO_FS_SEL_250DPS = 0x00; + const uint8_t GYRO_FS_SEL_500DPS = 0x08; + const uint8_t GYRO_FS_SEL_1000DPS = 0x10; + const uint8_t GYRO_FS_SEL_2000DPS = 0x18; + const uint8_t ACCEL_CONFIG2 = 0x1D; + const uint8_t ACCEL_DLPF_184 = 0x01; + const uint8_t ACCEL_DLPF_92 = 0x02; + const uint8_t ACCEL_DLPF_41 = 0x03; + const uint8_t ACCEL_DLPF_20 = 0x04; + const uint8_t ACCEL_DLPF_10 = 0x05; + const uint8_t ACCEL_DLPF_5 = 0x06; + const uint8_t CONFIG = 0x1A; + const uint8_t GYRO_DLPF_184 = 0x01; + const uint8_t GYRO_DLPF_92 = 0x02; + const uint8_t GYRO_DLPF_41 = 0x03; + const uint8_t GYRO_DLPF_20 = 0x04; + const uint8_t GYRO_DLPF_10 = 0x05; + const uint8_t GYRO_DLPF_5 = 0x06; + const uint8_t SMPDIV = 0x19; + const uint8_t INT_PIN_CFG = 0x37; + const uint8_t INT_ENABLE = 0x38; + const uint8_t INT_DISABLE = 0x00; + const uint8_t INT_PULSE_50US = 0x00; + const uint8_t INT_WOM_EN = 0x40; + const uint8_t INT_RAW_RDY_EN = 0x01; + const uint8_t PWR_MGMNT_1 = 0x6B; + const uint8_t PWR_CYCLE = 0x20; + const uint8_t PWR_RESET = 0x80; + const uint8_t CLOCK_SEL_PLL = 0x01; + const uint8_t PWR_MGMNT_2 = 0x6C; + const uint8_t SEN_ENABLE = 0x00; + const uint8_t DIS_GYRO = 0x07; + const uint8_t USER_CTRL = 0x6A; + const uint8_t I2C_MST_EN = 0x20; + const uint8_t I2C_MST_CLK = 0x0D; + const uint8_t I2C_MST_CTRL = 0x24; + const uint8_t I2C_SLV0_ADDR = 0x25; + const uint8_t I2C_SLV0_REG = 0x26; + const uint8_t I2C_SLV0_DO = 0x63; + const uint8_t I2C_SLV0_CTRL = 0x27; + const uint8_t I2C_SLV0_EN = 0x80; + const uint8_t I2C_READ_FLAG = 0x80; + const uint8_t MOT_DETECT_CTRL = 0x69; + const uint8_t ACCEL_INTEL_EN = 0x80; + const uint8_t ACCEL_INTEL_MODE = 0x40; + const uint8_t LP_ACCEL_ODR = 0x1E; + const uint8_t WOM_THR = 0x1F; + const uint8_t WHO_AM_I = 0x75; + const uint8_t FIFO_EN = 0x23; + const uint8_t FIFO_TEMP = 0x80; + const uint8_t FIFO_GYRO = 0x70; + const uint8_t FIFO_ACCEL = 0x08; + const uint8_t FIFO_MAG = 0x01; + const uint8_t FIFO_COUNT = 0x72; + const uint8_t FIFO_READ = 0x74; + // AK8963 registers + const uint8_t AK8963_I2C_ADDR = 0x0C; + const uint8_t AK8963_HXL = 0x03; + const uint8_t AK8963_CNTL1 = 0x0A; + const uint8_t AK8963_PWR_DOWN = 0x00; + const uint8_t AK8963_CNT_MEAS1 = 0x12; + const uint8_t AK8963_CNT_MEAS2 = 0x16; + const uint8_t AK8963_FUSE_ROM = 0x0F; + const uint8_t AK8963_CNTL2 = 0x0B; + const uint8_t AK8963_RESET = 0x01; + const uint8_t AK8963_ASA = 0x10; + const uint8_t AK8963_WHO_AM_I = 0x00; + // private functions + int writeRegister(uint8_t subAddress, uint8_t data); + int readRegisters(uint8_t subAddress, uint8_t count, uint8_t* dest); + int writeAK8963Register(uint8_t subAddress, uint8_t data); + int readAK8963Registers(uint8_t subAddress, uint8_t count, uint8_t* dest); + int whoAmI(); + int whoAmIAK8963(); +}; + +class MPU9250FIFO: public MPU9250 { + public: + using MPU9250::MPU9250; + int enableFifo(bool accel,bool gyro,bool mag,bool temp); + int readFifo(); + void getFifoAccelX_mss(size_t *size,float* data); + void getFifoAccelY_mss(size_t *size,float* data); + void getFifoAccelZ_mss(size_t *size,float* data); + void getFifoGyroX_rads(size_t *size,float* data); + void getFifoGyroY_rads(size_t *size,float* data); + void getFifoGyroZ_rads(size_t *size,float* data); + void getFifoMagX_uT(size_t *size,float* data); + void getFifoMagY_uT(size_t *size,float* data); + void getFifoMagZ_uT(size_t *size,float* data); + void getFifoTemperature_C(size_t *size,float* data); + protected: + // fifo + bool _enFifoAccel,_enFifoGyro,_enFifoMag,_enFifoTemp; + size_t _fifoSize,_fifoFrameSize; + float _axFifo[85], _ayFifo[85], _azFifo[85]; + size_t _aSize; + float _gxFifo[85], _gyFifo[85], _gzFifo[85]; + size_t _gSize; + float _hxFifo[73], _hyFifo[73], _hzFifo[73]; + size_t _hSize; + float _tFifo[256]; + size_t _tSize; +}; + +#endif diff --git a/src/Observer.h b/src/Observer.h new file mode 100644 index 0000000..701495b --- /dev/null +++ b/src/Observer.h @@ -0,0 +1,98 @@ +#pragma once + +#include +#include +#include + +template class Observable; + +/** + * An observer which can be mixed in as a baseclass. Implement onNotify as a method in your class. + */ +template class Observer +{ + Observable *observed = NULL; + + public: + virtual ~Observer(); + + void observe(Observable *o); + + private: + friend class Observable; + + protected: + /** + * returns 0 if other observers should continue to be called + * returns !0 if the observe calls should be aborted and this result code returned for notifyObservers + **/ + virtual int onNotify(T arg) = 0; +}; + +/** + * An observer that calls an arbitrary method + */ +template class CallbackObserver : public Observer +{ + typedef int (Callback::*ObserverCallback)(T arg); + + Callback *objPtr; + ObserverCallback method; + + public: + CallbackObserver(Callback *_objPtr, ObserverCallback _method) : objPtr(_objPtr), method(_method) {} + + protected: + virtual int onNotify(T arg) { return (objPtr->*method)(arg); } +}; + +/** + * An observable class that will notify observers anytime notifyObservers is called. Argument type T can be any type, but for + * performance reasons a pointer or word sized object is recommended. + */ +template class Observable +{ + std::list *> observers; + + public: + /** + * Tell all observers about a change, observers can process arg as they wish + * + * returns !0 if an observer chose to abort processing by returning this code + */ + int notifyObservers(T arg) + { + for (typename std::list *>::const_iterator iterator = observers.begin(); iterator != observers.end(); + ++iterator) { + int result = (*iterator)->onNotify(arg); + if (result != 0) + return result; + } + + return 0; + } + + private: + friend class Observer; + + // Not called directly, instead call observer.observe + void addObserver(Observer *o) { observers.push_back(o); } + + void removeObserver(Observer *o) { observers.remove(o); } +}; + +template Observer::~Observer() +{ + if (observed) + observed->removeObserver(this); + observed = NULL; +} + +template void Observer::observe(Observable *o) +{ + // We can only watch one thing at a time + assert(!observed); + + observed = o; + o->addObserver(this); +} \ No newline at end of file diff --git a/src/Power.cpp b/src/Power.cpp new file mode 100644 index 0000000..6f82109 --- /dev/null +++ b/src/Power.cpp @@ -0,0 +1,238 @@ +#include "power.h" +#include "utils.h" + +#ifdef HAS_AXP20X +bool pmu_irq = false; +#endif +bool Power::setup() +{ +#ifdef HAS_AXP20X + axp192Init(); +#endif + concurrency::PeriodicTask::setup(); // We don't start our periodic task unless we actually found the device + setPeriod(1); + + return true; +} +#ifdef BATTERY_PIN +static float read_battery() { + uint16_t v = analogRead(BATTERY_PIN); + //float battery_voltage = (float)v/4095*2*3.3*1.1; + float battery_voltage = (float)v*0.00246*1.19; + + return battery_voltage; +} +#endif + +/// Reads power status to powerStatus singleton. +// +// TODO(girts): move this and other axp stuff to power.h/power.cpp. +void Power::readPowerStatus() +{ +#ifdef HAS_AXP20X + bool hasBattery = axp.isBatteryConnect(); + int batteryVoltageMv = 0; + uint8_t batteryChargePercent = 0; + if (hasBattery) + { + batteryVoltageMv = axp.getBattVoltage(); + // If the AXP192 returns a valid battery percentage, use it + if (axp.getBattPercentage() >= 0) + { + batteryChargePercent = axp.getBattPercentage(); + } + else + { + // If the AXP192 returns a percentage less than 0, the feature is either not supported or there is an error + // In that case, we compute an estimate of the charge percent based on maximum and minimum voltages defined in power.h + batteryChargePercent = clamp((int)(((batteryVoltageMv - BAT_MILLIVOLTS_EMPTY) * 1e2) / (BAT_MILLIVOLTS_FULL - BAT_MILLIVOLTS_EMPTY)), 0, 100); + } + } + + // Notify any status instances that are observing us + const PowerStatus powerStatus = PowerStatus(hasBattery, axp.isVBUSPlug(), axp.isChargeing(), batteryVoltageMv, batteryChargePercent); + newStatus.notifyObservers(&powerStatus); + + // If we have a battery at all and it is less than 10% full, force deep sleep + if (powerStatus.getHasBattery() && !powerStatus.getHasUSB() && + axp.getBattVoltage() < MIN_BAT_MILLIVOLTS) + { + //powerFSM.trigger(EVENT_LOW_BATTERY); + } +#else + int batteryVoltageMv = read_battery()*1000; + uint8_t batteryChargePercent = clamp((int)(((batteryVoltageMv - BAT_MILLIVOLTS_EMPTY) * 1e2) / (BAT_MILLIVOLTS_FULL - BAT_MILLIVOLTS_EMPTY)), 0, 100); + const PowerStatus powerStatus = PowerStatus(true, false, batteryVoltageMv>4200, batteryVoltageMv, batteryChargePercent); + newStatus.notifyObservers(&powerStatus); +#endif +} + +void Power::doTask() +{ + readPowerStatus(); + + // Only read once every 20 seconds once the power status for the app has been initialized + if (statusHandler && statusHandler->isInitialized()) + setPeriod(1000 * 20); +} + +void Power::gpsOff() +{ +#ifdef HAS_AXP20X + axp.setPowerOutPut(AXP192_LDO3, AXP202_OFF); +#endif +} + +void Power::shutdown() +{ +#ifdef HAS_AXP20X + axp.shutdown(); +#endif +} + +void Power::gpsOn() +{ +#ifdef HAS_AXP20X + axp.setPowerOutPut(AXP192_LDO3, AXP202_ON); +#endif +} + +#ifdef AXP192_SLAVE_ADDRESS +/** + * Init the power manager chip + * + * axp192 power + DCDC1 0.7-3.5V @ 1200mA max -> OLED // If you turn this off you'll lose comms to the axp192 because the OLED and the axp192 + share the same i2c bus, instead use ssd1306 sleep mode DCDC2 -> unused DCDC3 0.7-3.5V @ 700mA max -> ESP32 (keep this on!) LDO1 + 30mA -> charges GPS backup battery // charges the tiny J13 battery by the GPS to power the GPS ram (for a couple of days), can + not be turned off LDO2 200mA -> LORA LDO3 200mA -> GPS + */ + +#ifdef HAS_AXP20X +void Power::axp192Init() +{ + if (!axp.begin(Wire, AXP192_SLAVE_ADDRESS)) + { + DEBUG_MSG("AXP192 Begin PASS\n"); + + // axp.setChgLEDMode(LED_BLINK_4HZ); + axp.setChgLEDModeCharging(); + DEBUG_MSG("DCDC1: %s\n", axp.isDCDC1Enable() ? "ENABLE" : "DISABLE"); + DEBUG_MSG("DCDC2: %s\n", axp.isDCDC2Enable() ? "ENABLE" : "DISABLE"); + DEBUG_MSG("LDO2: %s\n", axp.isLDO2Enable() ? "ENABLE" : "DISABLE"); + DEBUG_MSG("LDO3: %s\n", axp.isLDO3Enable() ? "ENABLE" : "DISABLE"); + DEBUG_MSG("DCDC3: %s\n", axp.isDCDC3Enable() ? "ENABLE" : "DISABLE"); + DEBUG_MSG("Exten: %s\n", axp.isExtenEnable() ? "ENABLE" : "DISABLE"); + DEBUG_MSG("----------------------------------------\n"); + axp.setDCDC1Voltage(3300); // for the OLED power + axp.setPowerOutPut(AXP192_LDO2, AXP202_ON); // LORA radio + axp.setPowerOutPut(AXP192_LDO3, AXP202_ON); // GPS main power + axp.setPowerOutPut(AXP192_DCDC2, AXP202_ON); + axp.setPowerOutPut(AXP192_EXTEN, AXP202_ON); + axp.setPowerOutPut(AXP192_DCDC1, AXP202_ON); + axp.setDCDC1Voltage(3300); // for the OLED power + + DEBUG_MSG("DCDC1: %s\n", axp.isDCDC1Enable() ? "ENABLE" : "DISABLE"); + DEBUG_MSG("DCDC2: %s\n", axp.isDCDC2Enable() ? "ENABLE" : "DISABLE"); + DEBUG_MSG("LDO2: %s\n", axp.isLDO2Enable() ? "ENABLE" : "DISABLE"); + DEBUG_MSG("LDO3: %s\n", axp.isLDO3Enable() ? "ENABLE" : "DISABLE"); + DEBUG_MSG("DCDC3: %s\n", axp.isDCDC3Enable() ? "ENABLE" : "DISABLE"); + DEBUG_MSG("Exten: %s\n", axp.isExtenEnable() ? "ENABLE" : "DISABLE"); + + axp.setChargingTargetVoltage(AXP202_TARGET_VOL_4_2V); + axp.setChargeControlCur(AXP1XX_CHARGE_CUR_1320MA); // actual limit (in HW) on the tbeam is 450mA + axp.setStartupTime(2); + axp.setShutdownTime(0); + axp.EnableCoulombcounter(); +#if 0 + + // Not connected + //val = 0xfc; + //axp._writeByte(AXP202_VHTF_CHGSET, 1, &val); // Set temperature protection + + //not used + //val = 0x46; + //axp._writeByte(AXP202_OFF_CTL, 1, &val); // enable bat detection +#endif + axp.debugCharging(); + +#ifdef PMU_IRQ + pinMode(PMU_IRQ, INPUT); + attachInterrupt( + PMU_IRQ, [] { pmu_irq = true; }, FALLING); + + axp.adc1Enable(AXP202_BATT_CUR_ADC1, 1); + axp.enableIRQ(AXP202_BATT_REMOVED_IRQ | AXP202_BATT_CONNECT_IRQ | AXP202_CHARGING_FINISHED_IRQ | AXP202_CHARGING_IRQ | + AXP202_VBUS_REMOVED_IRQ | AXP202_VBUS_CONNECT_IRQ | AXP202_PEK_SHORTPRESS_IRQ | AXP202_PEK_LONGPRESS_IRQ, + 1); + + axp.clearIRQ(); +#endif + readPowerStatus(); + } + else + { + DEBUG_MSG("AXP192 Begin FAIL\n"); + delay(1000); + abort(); + } +} +#endif +#endif + +int Power::loop() +{ + int result = 0; +#ifdef HAS_AXP20X +#ifdef PMU_IRQ + if (pmu_irq) + { + pmu_irq = false; + axp.readIRQ(); + + DEBUG_MSG("pmu irq!\n"); + + if (axp.isChargingIRQ()) + { + DEBUG_MSG("Battery start charging\n"); + } + if (axp.isChargingDoneIRQ()) + { + DEBUG_MSG("Battery fully charged\n"); + } + if (axp.isVbusRemoveIRQ()) + { + DEBUG_MSG("USB unplugged\n"); + } + if (axp.isVbusPlugInIRQ()) + { + DEBUG_MSG("USB plugged In\n"); + } + if (axp.isBattPlugInIRQ()) + { + DEBUG_MSG("Battery inserted\n"); + } + if (axp.isBattRemoveIRQ()) + { + DEBUG_MSG("Battery removed\n"); + } + if (axp.isPEKShortPressIRQ()) + { + DEBUG_MSG("PEK short button press\n"); + result |= 1; + } + if (axp.isPEKLongtPressIRQ()) + { + DEBUG_MSG("PEK long button press\n"); + result |= 2; + } + + readPowerStatus(); + axp.clearIRQ(); + } +#endif +#else +// readPowerStatus(); +#endif + return result; +} diff --git a/src/PowerStatus.h b/src/PowerStatus.h new file mode 100644 index 0000000..601eb91 --- /dev/null +++ b/src/PowerStatus.h @@ -0,0 +1,96 @@ +#pragma once +#include +#include "Status.h" +#include "config.h" + +class PowerStatus : public Status +{ + +private: + CallbackObserver statusObserver = CallbackObserver(this, &PowerStatus::updateStatus); + + /// Whether we have a battery connected + bool hasBattery; + /// Battery voltage in mV, valid if haveBattery is true + int batteryVoltageMv; + /// Battery charge percentage, either read directly or estimated + uint8_t batteryChargePercent; + /// Whether USB is connected + bool hasUSB; + /// Whether we are charging the battery + bool isCharging; + +public: + PowerStatus() + { + statusType = STATUS_TYPE_POWER; + } + PowerStatus(bool hasBattery, bool hasUSB, bool isCharging, int batteryVoltageMv, uint8_t batteryChargePercent) : Status() + { + this->hasBattery = hasBattery; + this->hasUSB = hasUSB; + this->isCharging = isCharging; + this->batteryVoltageMv = batteryVoltageMv; + this->batteryChargePercent = batteryChargePercent; + } + PowerStatus(const PowerStatus &); + PowerStatus &operator=(const PowerStatus &); + + void observe(Observable *source) + { + statusObserver.observe(source); + } + + bool getHasBattery() const + { + return hasBattery; + } + + bool getHasUSB() const + { + return hasUSB; + } + + bool getIsCharging() const + { + return isCharging; + } + + int getBatteryVoltageMv() const + { + return batteryVoltageMv; + } + + uint8_t getBatteryChargePercent() const + { + return batteryChargePercent; + } + + bool matches(const PowerStatus *newStatus) const + { + return ( + newStatus->getHasBattery() != hasBattery || + newStatus->getHasUSB() != hasUSB || + newStatus->getBatteryVoltageMv() != batteryVoltageMv); + } + int updateStatus(const PowerStatus *newStatus) + { + // Only update the status if values have actually changed + bool isDirty; + { + isDirty = matches(newStatus); + initialized = true; + hasBattery = newStatus->getHasBattery(); + batteryVoltageMv = newStatus->getBatteryVoltageMv(); + batteryChargePercent = newStatus->getBatteryChargePercent(); + hasUSB = newStatus->getHasUSB(); + isCharging = newStatus->getIsCharging(); + } + if (isDirty) + { + DEBUG_MSG("Battery %dmV %d%%\n", batteryVoltageMv, batteryChargePercent); + onNewStatus.notifyObservers(this); + } + return 0; + } +}; diff --git a/src/Status.h b/src/Status.h new file mode 100644 index 0000000..8a638e0 --- /dev/null +++ b/src/Status.h @@ -0,0 +1,66 @@ +#pragma once + +#include "Observer.h" + +// Constants for the various status types, so we can tell subclass instances apart +#define STATUS_TYPE_BASE 0 +#define STATUS_TYPE_POWER 1 +#define STATUS_TYPE_GPS 2 + +// A base class for observable status +class Status +{ +protected: + // Allows us to observe an Observable + CallbackObserver statusObserver = CallbackObserver(this, &Status::updateStatus); + bool initialized = false; + // Workaround for no typeid support + int statusType; + +public: + // Allows us to generate observable events + Observable onNewStatus; + + // Enable polymorphism ? + virtual ~Status() = default; + + Status() + { + if (!statusType) + { + statusType = STATUS_TYPE_BASE; + } + } + + // Prevent object copy/move + Status(const Status &) = delete; + Status &operator=(const Status &) = delete; + + // Start observing a source of data + void observe(Observable *source) + { + statusObserver.observe(source); + } + + // Determines whether or not existing data matches the data in another Status instance + bool matches(const Status *otherStatus) const + { + return true; + } + + bool isInitialized() const + { + return initialized; + } + + int getStatusType() const + { + return statusType; + } + + // Called when the Observable we're observing generates a new notification + int updateStatus(const Status *newStatus) + { + return 0; + } +}; diff --git a/src/TypedQueue.h b/src/TypedQueue.h new file mode 100644 index 0000000..90ed07f --- /dev/null +++ b/src/TypedQueue.h @@ -0,0 +1,81 @@ +#pragma once + +#include +#include + +#include "freertosinc.h" + +#ifdef HAS_FREE_RTOS + +/** + * A wrapper for freertos queues. Note: each element object should be small + * and POD (Plain Old Data type) as elements are memcpied by value. + */ +template class TypedQueue +{ + static_assert(std::is_pod::value, "T must be pod"); + QueueHandle_t h; + + public: + TypedQueue(int maxElements) + { + h = xQueueCreate(maxElements, sizeof(T)); + assert(h); + } + + ~TypedQueue() { vQueueDelete(h); } + + int numFree() { return uxQueueSpacesAvailable(h); } + + bool isEmpty() { return uxQueueMessagesWaiting(h) == 0; } + + bool enqueue(T x, TickType_t maxWait = portMAX_DELAY) { return xQueueSendToBack(h, &x, maxWait) == pdTRUE; } + + bool enqueueFromISR(T x, BaseType_t *higherPriWoken) { return xQueueSendToBackFromISR(h, &x, higherPriWoken) == pdTRUE; } + + bool dequeue(T *p, TickType_t maxWait = portMAX_DELAY) { return xQueueReceive(h, p, maxWait) == pdTRUE; } + + bool dequeueFromISR(T *p, BaseType_t *higherPriWoken) { return xQueueReceiveFromISR(h, p, higherPriWoken); } +}; + +#else + +#include + +/** + * A wrapper for freertos queues. Note: each element object should be small + * and POD (Plain Old Data type) as elements are memcpied by value. + */ +template class TypedQueue +{ + std::queue q; + + public: + TypedQueue(int maxElements) {} + + // int numFree() { return uxQueueSpacesAvailable(h); } + + bool isEmpty() { return q.empty(); } + + bool enqueue(T x, TickType_t maxWait = portMAX_DELAY) + { + q.push(x); + return true; + } + + // bool enqueueFromISR(T x, BaseType_t *higherPriWoken) { return xQueueSendToBackFromISR(h, &x, higherPriWoken) == pdTRUE; } + + bool dequeue(T *p, TickType_t maxWait = portMAX_DELAY) + { + if (isEmpty()) + return false; + else { + *p = q.front(); + q.pop(); + return true; + } + } + + // bool dequeueFromISR(T *p, BaseType_t *higherPriWoken) { return xQueueReceiveFromISR(h, p, higherPriWoken); } +}; +#endif diff --git a/src/adcBLECommon.h b/src/adcBLECommon.h new file mode 100644 index 0000000..2cd7fc9 --- /dev/null +++ b/src/adcBLECommon.h @@ -0,0 +1,22 @@ +#pragma once + +#define SERVICE_UUID_ADC "e9f2ee69-ee2e-49d2-a763-458db734b546" +#define CHARACTERISTIC_UUID_ADC_POSITION_REPORT "697f4ebc-4a7e-4782-b15e-31dbee61b3e2" + + +#pragma pack(push, 1) +struct sADCPositionReport +{ + unsigned long now; + float latitude; + float longitude; + float altitude; + bool hasLock; + int sat; + unsigned long lastSeen; + float SNR; + float RSSI; + char status[32]; + uint32_t hacc; +}; +#pragma pack(pop) \ No newline at end of file diff --git a/src/agd/abcommon.h b/src/agd/abcommon.h new file mode 100644 index 0000000..4c86684 --- /dev/null +++ b/src/agd/abcommon.h @@ -0,0 +1,13 @@ +#pragma once + +#define LORA_TAG 0x93 +#define LORA_SCREEN_TAG 0x94 +#define LSID_GPS 1 +#define LSID_HASLOCK 2 +#define LSID_NSATS 3 +#define LSID_TIMER1 4 +#define LSID_TIMER2 5 +#define LSID_SWITCH 6 +#define LSID_TIMERS_MODE 7 +#define LSID_HACC 8 + diff --git a/src/atLVEvents.cpp b/src/atLVEvents.cpp new file mode 100644 index 0000000..b8c0f3d --- /dev/null +++ b/src/atLVEvents.cpp @@ -0,0 +1,88 @@ +#include "atLVEvents.h" +#include "config.h" +#include "atscreen.h" + +static uint32_t keycode_to_ascii(uint32_t key); + +static uint32_t last_key = 0; +static lv_indev_state_t state ; +void atlve_init(void) +{ + /*Nothing to init*/ +} + +bool atlve_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) +{ + (void) indev_drv; /*Unused*/ + data->state = state; + data->key = keycode_to_ascii(last_key); + lv_indev_t * indev = (lv_indev_t *)indev_drv->user_data; + if(indev) + { + if(!lv_group_get_editing(indev->group)) + { + switch(data->key) + { + case LV_KEY_UP: + { + data->key = LV_KEY_LEFT; + break; + } + case LV_KEY_DOWN: + { + data->key = LV_KEY_RIGHT; + break; + } + } + } + } + return false; +} + +/** + * It is called periodically from the SDL thread to check a key is pressed/released + * @param event describes the event + */ +void atlve_handler(uint8_t event, uint32_t param1, uint32_t param2) +{ + /* We only care about SDL_KEYDOWN and SDL_KEYUP events */ + switch(event) { + case EV_BTN_ON: /*Button press*/ + last_key = param1; /*Save the pressed key*/ + state = LV_INDEV_STATE_PR; /*Save the key is pressed now*/ + break; + case EV_BTN_OFF: /*Button release*/ + last_key = param1; /*Save the pressed key*/ + state = LV_INDEV_STATE_REL; /*Save the key is released but keep the last key*/ + break; + default: + break; + + } +} + +static uint32_t keycode_to_ascii(uint32_t key) +{ + switch(key) { + case 0: + return LV_KEY_UP; + + case 1: + return LV_KEY_DOWN; + + case 2: + return LV_KEY_ESC; + + case 3: + return LV_KEY_LEFT; + + case 4: + return LV_KEY_ENTER; + + case 5: + return LV_KEY_RIGHT; + + default: + return 0; + } +} diff --git a/src/atLVEvents.h b/src/atLVEvents.h new file mode 100644 index 0000000..703eadb --- /dev/null +++ b/src/atLVEvents.h @@ -0,0 +1,24 @@ +#ifndef ATLVE_H +#define ATLVE_H + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +void atlve_init(void); +bool atlve_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data); +void atlve_handler(uint8_t event, uint32_t param1, uint32_t param2); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/src/atNetworkProcessor.cpp b/src/atNetworkProcessor.cpp new file mode 100644 index 0000000..ad2e239 --- /dev/null +++ b/src/atNetworkProcessor.cpp @@ -0,0 +1,1054 @@ +#include "atNetworkProcessor.h" +#include "mbedtls/md.h" +#include +#include +#include +cPeer::cPeer() +{ + m_id = 0; + m_lastPacketTime = 0; + m_lastRequestInfo = 0; + m_lastRetransmit = 0; +} + +void cPeer::init(const char *key, uint8_t size, uint8_t id, uint8_t netId) +{ + memset(m_timeslots,0,sizeof(m_timeslots)); + type = POIT_PEER; + m_id = id; + if(m_id>128) + type = POIT_ENEMY; + m_cryptoEngine.initWithKey(key,size,id,netId); +} + +bool cPeer::needRequestInfo(int64_t now, int64_t interval) +{ + if(!name.empty()) + return false; + return (now-m_lastRequestInfo)>=interval; +} + +uint16_t cPeer::getTimeslotOffset(uint8_t timeslot, uint16_t timeslotDuration) +{ + return timeslot*timeslotDuration; +} + +void cPeer::updateTimeslot(int64_t packetTime, uint16_t timeslotDuration, uint8_t timeslot, uint8_t timeslotNext, int64_t now) +{ + if(packetTime>0) + m_peerTimeOffset = (packetTime/TIMESLOTS_PERIOD)*TIMESLOTS_PERIOD+getTimeslotOffset(timeslot,timeslotDuration)-packetTime-1; + if(m_peerTimeOffset<0) + m_peerTimeOffset += TIMESLOTS_PERIOD; + updateTimeslot(timeslot,now); + if(timeslotNext=TIMESLOTS_MAX) + return; + bool found = false; + for(int i=0; i=TIMESLOT_TIMEOUT) + { + m_timeslots[i].inUse = 0; + } + } +} + +cCryptoEngine::cCryptoEngine() +{ + memset(m_key,0x55,sizeof(m_key)); +} + +void cCryptoEngine::initWithKey(const char *key, uint8_t size, uint8_t id, uint8_t netId) +{ + memset(m_key,0x55,sizeof(m_key)); + mbedtls_md_context_t ctx; + mbedtls_md_type_t md_type = MBEDTLS_MD_SHA256; + mbedtls_md_init(&ctx); + mbedtls_md_setup(&ctx, mbedtls_md_info_from_type(md_type), 0); + mbedtls_md_starts(&ctx); + mbedtls_md_update(&ctx, (const unsigned char *) &netId, 1); + mbedtls_md_update(&ctx, (const unsigned char *) key, size); + mbedtls_md_update(&ctx, (const unsigned char *) &id, 1); + mbedtls_md_finish(&ctx, m_key); + mbedtls_md_free(&ctx); +} + +void cCryptoEngine::encode(uint8_t *data, uint16_t size) +{ + uint8_t keyPosition = 0; + for(int i=0; igetId(),header->type); + switch(header->type) + { + case PT_REPORT_REMOTE_D1: + case PT_REPORT_REMOTE: + { + if(size>=sizeof(sNpReportRemoteHeader)) + { + const sNpReportRemoteHeader *rheader = (sNpReportRemoteHeader *)data; + if(rheader->src!=m_global.getConfig().id) + { + cPeer *remotePeer = NULL; + auto itr = m_peers.find(rheader->src); + if(itr!=m_peers.end()) + { + remotePeer = & itr->second; + } + else + { + atNetworkConfig &netConfig = m_global.getNetworkConfig(); + cPeer newPeer; + m_peers[rheader->src] = newPeer; + remotePeer = & m_peers[rheader->src]; + remotePeer->init(netConfig.password.c_str(),netConfig.password.length(),rheader->src,netConfig.networkId); + } + remotePeer->RSSI = 0; + remotePeer->SNR = 0; + std::list tsList; + if(rheader->ts.d4.flag) //D3 + { + if(rheader->ts.d3.t0<(TIMESLOTS_MAX-1)) + { + int lastTS = rheader->ts.d3.t0; + tsList.push_back(lastTS); + for(int i=1; i<=rheader->ts.d3.size(); i++) + { + int ts = rheader->ts.d3.get(i); + if(ts>0) + { + lastTS += ts; + tsList.push_back(lastTS); + } + else + break; + } + } + } + else //D4 + { + if(rheader->ts.d4.t0<(TIMESLOTS_MAX-1)) + { + int lastTS = rheader->ts.d4.t0; + tsList.push_back(lastTS); + for(int i=1; i<=rheader->ts.d4.size(); i++) + { + int ts = rheader->ts.d4.get(i); + if(ts>0) + { + lastTS += ts; + tsList.push_back(lastTS); + } + else + break; + } + } + } + if(tsList.size()>0) + { + int64_t now = millis(); + //DEBUG_MSG("Remote Update %02X, Timeslots",rheader->src); + for(auto itr=tsList.begin(); itr!=tsList.end(); itr++) + { + remotePeer->updateTimeslot(*itr,now); + //DEBUG_MSG(" %d",(int)*itr); + } + //DEBUG_MSG("\n"); + if(rheader->srctype==PT_REPORT_REMOTE_D1) + { + if(size>=sizeof(sNpReportItemD1) && m_lastPeerReport) + { + sNpReportItemD1 *reportD1 = (sNpReportItemD1 *)data; + sNpReportItem report; + report.hacc = reportD1->hacc; + report.heading = reportD1->heading; + report.status = reportD1->status; + report.options = reportD1->options; + report.lat = reportD1->lat+m_lastPeerReport->lat; + report.lng = reportD1->lng+m_lastPeerReport->lng; + report.alt = reportD1->alt+m_lastPeerReport->alt; + remotePeer->updateReport(&report); + DEBUG_MSG("Get %02X position %f, %f\n",remotePeer->getId(),remotePeer->getReport().lat*1e-6,remotePeer->getReport().lng*1e-6); + } + } + else + { + if(size>=sizeof(sNpReportItem)) + { + sNpReportItem * report = (sNpReportItem *)data; + remotePeer->updateReport(report); + } + } + remotePeer->updateLastPacketTime(); + remotePeer->updateLastRetransmit(); + } + } + break; + } + + case PT_REPORT: + { + if(size>=sizeof(sNpReportItem)) + { + m_lastPeerReport = (sNpReportItem *)data; + peer->updateReport(m_lastPeerReport); + //DEBUG_MSG("Get %02X position %f, %f\n",(int)m_lastPeerReport->getId(),m_lastPeerReport->getReport().lat*1e-6,m_lastPeerReport->getReport().lng*1e-6); + } + else + DEBUG_MSG("Wrong packet size %d %d\n",(int)sizeof(sNpReportItem),size); + + break; + } + + case PT_INFO_REQUEST: + { + if(size>=sizeof(sNpInfoRequest)) + { + sNpInfoRequest *ir = (sNpInfoRequest *)data; + if(size==(sizeof(sNpInfoRequest)+ir->count*sizeof(sNpInfoRequestItem))) + { + uint8_t id = m_global.getConfig().id; + data += sizeof(sNpInfoRequest); + for(int i=0; icount; i++) + { + sNpInfoRequestItem *iri = (sNpInfoRequestItem *)data; + if(iri->id==id) + { + DEBUG_MSG("Request info\n"); + m_infoRequested = true; + break; + } + data += sizeof(sNpInfoRequestItem); + } + } + else + DEBUG_MSG("Wrong packet size %d %d\n",(int)(sizeof(sNpInfoRequest)+ir->count*sizeof(sNpInfoRequestItem)),size); + } + break; + } + + case PT_INFO_RESPONSE: + { + if(size==sizeof(sNpInfoResponse)) + { + peer->updateInfo((sNpInfoResponse *)data); + } + else + { + DEBUG_MSG("Wrong packet size %d %d\n",(int)sizeof(sNpInfoResponse),size); + } + + break; + } + } +} + +void cNetworkProcessor::processPacket(const sNetworkPacket &packet, float RSSI, float SNR) +{ + const sNetworkPacketHeader *ph; + m_lastPeerReport = NULL; + if(packet.data.size()>=sizeof(sNetworkPacketHeader)) + { + uint8_t *data = (uint8_t *)packet.data.data(); + ph = (const sNetworkPacketHeader *)data; + if(ph->netId==(m_global.getNetworkConfig().networkId&0xF) && ph->src!=m_global.getConfig().id) + { + int64_t packetTime = packet.preambleTime; + if(packetTime<10) + { + packetTime = packet.packetTime-getTimeOnAir(packet.data.size())/1000-5; + if(packetTime<0) + packetTime = 0; + } + else + packetTime -= 10; + cPeer *peer = NULL; + auto itr = m_peers.find(ph->src); + if(itr!=m_peers.end()) + { + peer = & itr->second; + } + else + { + atNetworkConfig &netConfig = m_global.getNetworkConfig(); + cPeer newPeer; + m_peers[ph->src] = newPeer; + peer = & m_peers[ph->src]; + peer->init(netConfig.password.c_str(),netConfig.password.length(),ph->src,netConfig.networkId); + } + peer->RSSI = RSSI; + peer->SNR = SNR; + int16_t size = packet.data.size()-sizeof(sNetworkPacketHeader); + data += sizeof(sNetworkPacketHeader); + if(size && peer->geCryptoEngine().decode(data,size)) + { + uint8_t crc = esp_crc8_le(0,data,size); + //for(int i=0; icrc) + { + int64_t now = millis(); + //DEBUG_MSG("TS %02X, %d %d\n",ph->src, ph->timeslot,ph->timeslotNext); + peer->updateTimeslot(packetTime,m_timeslotDuration,ph->timeslot,ph->timeslotNext,now); + if(ph->srctimeslot || m_timeslots[i].timeslot==ph->timeslotNext)) + { + rebuildTimeslotsMap(); + m_timeslots[i].timeslot = findTimeslotAround(m_timeslots[i].timeslot); + if(m_timeslots[i].timeslot==TIMESLOTS_MAX) + m_timeslots[i].inUse = 0; + } + } + } + + while(size>=sizeof(sNetworkPackeItemHeader)) + { + sNetworkPackeItemHeader *pih = (sNetworkPackeItemHeader *)data; + if(pih->size==0) + { + DEBUG_MSG("Zero packet item size\n"); + break; + } + if(pih->size<=size) + { + processPacketItem(peer, pih,&data[sizeof(sNetworkPackeItemHeader)],pih->size-sizeof(sNetworkPackeItemHeader)); + } + else + { + DEBUG_MSG("Bad packet item size %d %d\n",size,pih->size); + break; + } + data += pih->size; + size -= pih->size; + } + } + else + { + DEBUG_MSG("CRC does not match %02X %02X\n",(int)crc,(int)ph->crc); + } + } + peer->updateLastPacketTime(); + } + } + m_lastPeerReport = NULL; +} + +void cNetworkProcessor::updateConfig() +{ + atNetworkConfig &netConfig = m_global.getNetworkConfig(); + m_cryptoEngine.initWithKey(netConfig.password.c_str(),netConfig.password.length(), m_global.getConfig().id,netConfig.networkId); + m_reportInterval = m_global.getConfig().reportInterval; + for(auto itr=m_peers.begin(); itr!=m_peers.end(); itr++) + { + itr->second.init(netConfig.password.c_str(),netConfig.password.length(),itr->first,netConfig.networkId); + } + m_maxPacketDuration = getTimeOnAir(TIMESLOT_MAX_SYMBOLS_LEN)/1000; + m_timeslotDuration = ((int32_t)(getTimeOnAir(TIMESLOT_MAX_SYMBOLS_LEN)*1.2)/10000)*10+30; + if(m_timeslotDurationTIMESLOTS_PER_PEER_MAX) + result = TIMESLOTS_PER_PEER_MAX; + return result; +} + +uint8_t cNetworkProcessor::getTimeslotsCount() +{ + uint8_t result = 0; + for(int i=0; i=128; + + int16_t ts; + if(s) + ts = (targetTimeslot+distance)%maxTimeslots; + else + ts = (targetTimeslot-distance+maxTimeslots)%maxTimeslots; + if(m_timeslotsMap[ts]==NETWORK_NODE_ID_MAX && !isTimeslotExist(ts)) + return ts; + + if(!s) + ts = (targetTimeslot+distance)%maxTimeslots; + else + ts = (targetTimeslot-distance+maxTimeslots)%maxTimeslots; + if(m_timeslotsMap[ts]==NETWORK_NODE_ID_MAX && !isTimeslotExist(ts)) + return ts; + if(distance & 0x1) + distance += 2; + else + distance--; + } + return TIMESLOTS_MAX; +} + +void cNetworkProcessor::rebuildTimeslotsMap() +{ + memset(m_timeslotsMap,NETWORK_NODE_ID_MAX,sizeof(m_timeslotsMap)); + for(auto itr=m_peers.begin(); itr!=m_peers.end(); itr++) + { + sPeerTimeslot *peerTimeslots = itr->second.getTimeslots(); + for(int i=0; iitr->first) + m_timeslotsMap[peerTimeslots[i].timeslot]=itr->first; + } + } +} + +void cNetworkProcessor::rebuildTimeslots() +{ + uint8_t needTimeslots = calcMaxTimeslotsToUse(); + if(needTimeslots!=m_lastNeedTimeslots && needTimeslots>0) + { + m_lastNeedTimeslots = needTimeslots; + uint8_t maxTimeslots = TIMESLOTS_PERIOD/m_timeslotDuration; + rebuildTimeslotsMap(); + + int32_t interval = TIMESLOTS_PERIOD/needTimeslots; + double intervalInTimeslots = TIMESLOTS_PERIOD/(double)needTimeslots/m_timeslotDuration; + //DEBUG_MSG("rebuildTS %d %d %f\n",(int)needTimeslots,interval,intervalInTimeslots); + memset(m_timeslots,0,sizeof(m_timeslots)); + uint8_t ts = findTimeslotAround((esp_random()+(int)(m_global.getConfig().id*intervalInTimeslots/4)) %(int)intervalInTimeslots); + //DEBUG_MSG("FTS %d\n",(int)ts); + uint8_t firstTs = ts; + int tsPos = 0; + while(ts!=TIMESLOTS_MAX && needTimeslots>0 && (ts>=firstTs || (ts+(int)intervalInTimeslots)<=firstTs)) + { + m_timeslots[tsPos].inUse = 1; + m_timeslots[tsPos].timeslot = ts; + m_timeslots[tsPos].lastTime = m_lastSendTime; + tsPos++; + needTimeslots--; + if(needTimeslots>0) + { + ts = findTimeslotAround(((int)(firstTs+tsPos*intervalInTimeslots))%maxTimeslots); + //DEBUG_MSG("TS %d\n",(int)ts); + } + } + } +} + +void cNetworkProcessor::sendPacket(uint8_t timeslot) +{ + sNetworkPacket packet; + sNetworkPacketHeader *ph; + packet.data.resize(m_bufferSize+sizeof(sNetworkPacketHeader)); + uint8_t *p = packet.data.data(); + ph = (sNetworkPacketHeader *)p; + ph->src = m_global.getConfig().id; + ph->netId = m_global.getNetworkConfig().networkId; + ph->timeslot = timeslot; + ph->timeslotNext = getTimeslotNext(timeslot); + ph->crc = m_bufferCRC; + memcpy(&p[sizeof(sNetworkPacketHeader)],m_buffer,m_bufferSize); + m_lastSendTime = millis(); + //DEBUG_MSG("%d Send ts %d %d\n",millis(), (int)ph->timeslot, (int)ph->timeslotNext); + if(m_interface) + m_interface->sendPacket(packet); +} + +bool cNetworkProcessor::needRequestInfo(int64_t now) +{ + for(auto itr=m_peers.begin(); itr!=m_peers.end(); itr++) + { + if(itr->second.needRequestInfo(now,m_global.getNetworkConfig().requestInfoInterval)) + return true; + } + + return false; +} + +void cNetworkProcessor::buildRequestInfoPacket(int64_t now) +{ + sNetworkPackeItemHeader itemHeader; + memset(&itemHeader,0,sizeof(itemHeader)); + itemHeader.type = PT_INFO_REQUEST; + startPacketItem(itemHeader); + + int32_t requestPosition = m_bufferSize; + sNpInfoRequest data; + memset(&data,0,sizeof(data)); + putPacketData(&data,sizeof(data)); + int cnt=0; + for(auto itr=m_peers.begin(); itr!=m_peers.end(); itr++) + { + if(itr->second.needRequestInfo(now,m_global.getNetworkConfig().requestInfoInterval)) + { + sNpInfoRequestItem ri; + ri.id = itr->first; + if(putPacketData(&ri,sizeof(ri))) + { + cnt++; + itr->second.updateLastRequestInfo(now); + } + else + break; + } + } + + sNpInfoRequest *pData =(sNpInfoRequest *)&m_buffer[requestPosition]; + pData->count = cnt; + + endPacketItem(); +} + +void cNetworkProcessor::sendReport(uint8_t timeslot) +{ + startPacket(); + sNpReportItem report = buildReportPacket(); + if(m_infoRequested) + { + m_infoRequested = false; + buildInfoPacket(); + } + else + { + int64_t now = millis(); + if(needRequestInfo(now)) + { + buildRequestInfoPacket(now); + } + else + { + m_retransmitCounter++; + if(m_retransmitCounter&0x1) + { + cPeer *retransmitPeer = NULL; + int64_t retransmitTime = now; + for(auto itr=m_peers.begin(); itr!=m_peers.end(); itr++) + { + if(itr->second.retransmitRating>0 && (now-itr->second.getLastPacketTime())<10000 && (itr->second.getLastPacketTime()>itr->second.getLastRetransmit()) && (now-itr->second.getLastRetransmit())>=1000 && itr->second.isValidLocation()) + //if(itr->second.retransmitRating>0 && (now-itr->second.getLastPacketTime())<10000 && (now-itr->second.getLastRetransmit())>=1000 && itr->second.isValidLocation()) + { + if(retransmitTime>itr->second.getLastRetransmit()) + { + retransmitTime = itr->second.getLastRetransmit(); + retransmitPeer = &itr->second; + } + } + } + if(retransmitPeer && (now-retransmitTime)>=1000) + { + //DEBUG_MSG("Send remote %02X\n",retransmitPeer->getId()); + retransmitPeer->updateLastRetransmit(); + buildRemoteReportPacket(report,*retransmitPeer); + } + } + } + } + endPacket(); + sendPacket(timeslot); +} +//int yyy=0; +uint8_t cNetworkProcessor::getCurrentTimeslot(int64_t now) +{ + int64_t offset = 0; + uint8_t offsetId = m_global.getConfig().id; + for(auto itr=m_peers.begin(); itr!=m_peers.end(); itr++) + { + if(itr->firstsecond.getPeerTimeOffset()!=INVALID_TIME_OFFSET) + { + offsetId = itr->first; + offset = itr->second.getPeerTimeOffset(); + } + } + now += offset; + //if(yyy++%20==0) + // DEBUG_MSG("Offset %d %d\n",(int)offset,(int)(now%TIMESLOTS_PERIOD)/m_timeslotDuration); + return (now%TIMESLOTS_PERIOD)/m_timeslotDuration; +} + +uint8_t cNetworkProcessor::getTimeslotNext(uint8_t timeslot) +{ + uint8_t result = TIMESLOTS_MAX; + for(int i=0; itimeslot && m_timeslots[i].timeslotm_timeslotDuration*2) + { + m_timeslots[i].lastTime = now; + return true; + } + break; + } + } + return false; +} + +void cNetworkProcessor::loop() +{ + int64_t now = millis(); + if(m_timeBase<=0) + m_timeBase = now; + if((now-m_timeBase)>=TIMESLOT_LEARNING_TIME) + { + if((now-m_lastRebuildTimeslots)>=TIMESLOTS_PERIOD) + { + m_lastRebuildTimeslots = now; + rebuildTimeslots(); + } + if((now-m_lastInfoTime)>=60000) + { + m_infoRequested = true; + } + uint8_t timeslot = getCurrentTimeslot(now); + if(checkTimeslot(now,timeslot)) + { + if(m_infoRequested) + m_lastInfoTime = now; + m_lastReportTime = now; + sendReport(timeslot); + } + } +} + +void cNetworkProcessor::startPacket() +{ + m_packetItemHeaderPosition = 0; + m_bufferSize = 0; +} + +void cNetworkProcessor::endPacket() +{ + m_bufferCRC = esp_crc8_le(0, m_buffer,m_bufferSize); + m_cryptoEngine.encode(m_buffer,m_bufferSize); +} + +void cNetworkProcessor::startPacketItem(sNetworkPackeItemHeader &itemHeader) +{ + m_packetItemHeaderPosition = m_bufferSize; + putPacketData(&itemHeader,sizeof(itemHeader)); +} + +void cNetworkProcessor::endPacketItem() +{ + sNetworkPackeItemHeader *itemHeader = (sNetworkPackeItemHeader *) &m_buffer[m_packetItemHeaderPosition]; + itemHeader->size = m_bufferSize-m_packetItemHeaderPosition; +} + +bool cNetworkProcessor::putPacketData(void *data,uint16_t size) +{ + auto pos = m_bufferSize; + if((pos+size) tsList; + for(int i=0; i1) + { + int maxTSDiff = 0; + int lastTS = -1; + for(auto itr=tsList.begin(); itr!=tsList.end(); itr++) + { + if(lastTS==-1) + { + lastTS = *itr; + } + else + { + int diff = *itr - lastTS; + lastTS = *itr; + if(diff>maxTSDiff) + maxTSDiff = diff; + } + } + if(maxTSDiff>=getBitsSize(3)) + { + header.ts.d4.flag = 0; + lastTS = -1; + int cnt = 0; + for(auto itr=tsList.begin(); itr!=tsList.end(); itr++) + { + if(lastTS==-1) + { + lastTS = *itr; + header.ts.d4.t0 = lastTS; + } + else + { + int diff = *itr - lastTS; + lastTS = *itr; + cnt++; + if(diff=header.ts.d4.size()) + break; + } + } + else + { + header.ts.d3.flag = 1; + lastTS = -1; + int cnt = 0; + for(auto itr=tsList.begin(); itr!=tsList.end(); itr++) + { + if(lastTS==-1) + { + lastTS = *itr; + header.ts.d3.t0 = lastTS; + } + else + { + int diff = *itr - lastTS; + lastTS = *itr; + cnt++; + if(diff=header.ts.d3.size()) + break; + } + } + } + else + { + header.ts.d4.flag = 0; + if(tsList.size()==1) + header.ts.d4.t0 = tsList.front(); + else + header.ts.d4.t0 = TIMESLOTS_MAX-1; + } + + //D1 report + if(abs(peerLat - report.lat)getLatitude()/10; + report.lng = m_global.m_gpsStatus->getLongitude()/10; + report.alt = m_global.m_gpsStatus->getAltitude(); + report.heading = m_global.m_imuStatus->getHeading()/100; + report.status = m_global.m_playerStatus.status; + report.options = m_global.m_playerStatus.options; + report.hacc = std::min(m_global.m_gpsStatus->getHAcc()/100,255U); + + putPacketData(&report,sizeof(report)); + + endPacketItem(); + return report; +} + +void cPeer::updateReport(const sNpReportItem * report) +{ + memcpy(&m_report,report,sizeof(sNpReportItem)); + lat = m_report.lat*1e-6; + lng = m_report.lng*1e-6; + alt = m_report.alt; + heading = m_report.heading; + status = m_report.status; + options = m_report.options; + positionChanged = true; + hacc = m_report.hacc; + updateXY(); +} + + +uint32_t cNetworkProcessor::getTimeOnAir(size_t len) { + cLoraChannelCondfig &channelConfig = m_global.getNetworkConfig().channelConfig; + // everything is in microseconds to allow integer arithmetic + // some constants have .25, these are multiplied by 4, and have _x4 postfix to indicate that fact + uint32_t symbolLength_us = ((uint32_t)(1000 * 10) << channelConfig.sf) / (channelConfig.bw * 10) ; + uint8_t sfCoeff1_x4 = 17; // (4.25 * 4) + uint8_t sfCoeff2 = 8; + if(channelConfig.sf == 5 || channelConfig.sf == 6) { + sfCoeff1_x4 = 25; // 6.25 * 4 + sfCoeff2 = 0; + } + uint8_t sfDivisor = 4*channelConfig.sf; + if(symbolLength_us >= 16000) { + sfDivisor = 4*(channelConfig.sf - 2); + } + const int8_t bitsPerCrc = 16; + const int8_t N_symbol_header = 20; + + // numerator of equation in section 6.1.4 of SX1268 datasheet v1.1 (might not actually be bitcount, but it has len * 8) + int16_t bitCount = (int16_t) 8 * len + 1 * bitsPerCrc - 4 * channelConfig.sf + sfCoeff2 + N_symbol_header; + if(bitCount < 0) { + bitCount = 0; + } + // add (sfDivisor) - 1 to the numerator to give integer CEIL(...) + uint16_t nPreCodedSymbols = (bitCount + (sfDivisor - 1)) / (sfDivisor); + + // preamble can be 65k, therefore nSymbol_x4 needs to be 32 bit + uint32_t nSymbol_x4 = (channelConfig.preambleLength + 8) * 4 + sfCoeff1_x4 + nPreCodedSymbols * channelConfig.cr * 4; + + return((symbolLength_us * nSymbol_x4) / 4); +} + diff --git a/src/atNetworkProcessor.h b/src/atNetworkProcessor.h new file mode 100644 index 0000000..294d235 --- /dev/null +++ b/src/atNetworkProcessor.h @@ -0,0 +1,189 @@ +#pragma once +#include +#include "config.h" +#include "atNetworkStructs.h" +#include "atglobal.h" +#include +#include + +#pragma pack(push, 1) +struct sPeerTimeslot +{ + uint8_t timeslot:7; + uint8_t inUse:1; + int64_t lastTime; +}; +#pragma pack(pop) + +struct sNetworkPacket +{ + int64_t packetTime; + int64_t preambleTime; + std::vector data; +}; + +class cNetworkProcessorInterface +{ +public: + virtual void sendPacket(const sNetworkPacket &packet)=0; +}; +#define INVALID_TIME_OFFSET 0xFFFFFFFF +#define CK_SIZE 32 +#define MAX_NETWORK_PACKET_SIZE 64 +class cCryptoEngine +{ +protected: + uint8_t m_key[CK_SIZE]; +public: + cCryptoEngine(); + void initWithKey(const char *key, uint8_t size, uint8_t id, uint8_t netId); + void encode(uint8_t *data, uint16_t size); + bool decode(uint8_t *data, uint16_t size); +}; + +class cPeer:public sPOI +{ +protected: + uint8_t m_id; + cCryptoEngine m_cryptoEngine; + int64_t m_lastPacketTime; + int64_t m_lastRequestInfo; + int64_t m_lastRetransmit; + sNpReportItem m_report; + sPeerTimeslot m_timeslots[TIMESLOTS_PER_PEER_MAX]; + int64_t m_peerTimeOffset=INVALID_TIME_OFFSET; +public: + cPeer(); + void init(const char *key, uint8_t size, uint8_t id, uint8_t netId); + const char * getName() + { + return name.c_str(); + } + + char getSymbol() + { + return symbol; + } + + void updateInfo(const sNpInfoResponse *info) + { + name = info->name; + symbol = info->symbol; + } + + void updateLastPacketTime() + { + lastUpdate = m_lastPacketTime = millis(); + } + + void updateLastRetransmit() + { + m_lastRetransmit = millis(); + } + + int64_t getLastRetransmit() + { + return m_lastRetransmit; + } + + int64_t getLastPacketTime() + { + return m_lastPacketTime; + } + + uint8_t getId() const + { + return m_id; + } + + sNpReportItem & getReport() + { + return m_report; + } + + void updateReport(const sNpReportItem * report); + + cCryptoEngine & geCryptoEngine() + { + return m_cryptoEngine; + } + + bool needRequestInfo(int64_t now, int64_t interval); + + void updateLastRequestInfo(int64_t now) + { + m_lastRequestInfo = now; + } + + void updateTimeslot(uint8_t timeslot, int64_t now); + void updateTimeslot(int64_t packetTime, uint16_t timeslotDuration, uint8_t timeslot,uint8_t timeslotNext, int64_t now); + uint16_t getTimeslotOffset(uint8_t timeslot, uint16_t timeslotDuration); + sPeerTimeslot *getTimeslots() { return m_timeslots; } + int64_t getPeerTimeOffset() { return m_peerTimeOffset; } +}; + +typedef std::map cPeers; + +class cNetworkProcessor +{ +protected: + atGlobal &m_global; + cNetworkProcessorInterface *m_interface; + cCryptoEngine m_cryptoEngine; + int64_t m_lastReportTime; + int64_t m_lastInfoTime; + uint16_t m_reportInterval; + uint8_t m_buffer[MAX_NETWORK_PACKET_SIZE]; + uint16_t m_bufferSize; + uint16_t m_packetItemHeaderPosition; + bool m_infoRequested; + cPeers m_peers; + uint8_t m_bufferCRC; + uint16_t m_timeslotDuration=0; + uint16_t m_maxPacketDuration=0; + uint8_t m_timeslotsMap[TIMESLOTS_MAX]; + sPeerTimeslot m_timeslots[TIMESLOTS_PER_PEER_MAX]; + int64_t m_timeBase=0; + int64_t m_lastRebuildTimeslots = 0; + int64_t m_lastSendTime = 0; + uint8_t m_lastNeedTimeslots=0; + uint32_t m_retransmitCounter = 0; + sNpReportItem *m_lastPeerReport = NULL; + + void startPacket(); + void endPacket(); + void startPacketItem(sNetworkPackeItemHeader &itemHeader); + void endPacketItem(); + bool putPacketData(void *data,uint16_t size); + + bool needRequestInfo(int64_t now); + sNpReportItem buildReportPacket(); + void buildRemoteReportPacket(const sNpReportItem &report, cPeer &peer); + void buildInfoPacket(); + void buildRequestInfoPacket(int64_t now); + void sendPacket(uint8_t timeslot); + void processPacketItem(cPeer *peer, const sNetworkPackeItemHeader *header, const uint8_t *data, uint16_t size); + uint8_t getActivePeersCount(); + uint8_t calcMaxTimeslotsToUse(); + uint8_t getTimeslotsCount(); + void rebuildTimeslotsMap(); + void rebuildTimeslots(); + bool isTimeslotExist(uint8_t timeslot); + bool checkTimeslot(int64_t now,uint8_t timeslot); + uint8_t findTimeslotAround(uint8_t targetTimeslot); + uint8_t getCurrentTimeslot(int64_t now); + uint8_t getTimeslotNext(uint8_t timeslot); +public: + cNetworkProcessor(atGlobal &global, cNetworkProcessorInterface *interface); + void updateConfig(); + void processPacket(const sNetworkPacket &packet, float RSSI, float SNR); + void loop(); + void sendReport(uint8_t timeslot); + uint16_t getTimeslotDuration() { return m_timeslotDuration; } + uint16_t getMaxPacketDuration() { return m_maxPacketDuration; } + uint32_t getTimeOnAir(size_t len); + cPeers &getPeers() + { + return m_peers; + } +}; \ No newline at end of file diff --git a/src/atNetworkStructs.h b/src/atNetworkStructs.h new file mode 100644 index 0000000..c550041 --- /dev/null +++ b/src/atNetworkStructs.h @@ -0,0 +1,192 @@ +#pragma once +#include + +#pragma pack(push, 1) + +#define NETWORK_NODE_ID_MAX 255 +#define TIMESLOTS_PERIOD 5000 +#define TIMESLOTS_MAX 64 +#define TIMESLOTS_PER_PEER_MAX 20 +#define TIMESLOT_MIN_DURATION (TIMESLOTS_PERIOD/TIMESLOTS_MAX) +#define TIMESLOT_TIMEOUT 30000 +#define TIMESLOT_LEARNING_TIME (TIMESLOTS_PERIOD+100) +#define TIMESLOT_MAX_SYMBOLS_LEN 40 + +//Packet types +#define PT_REPORT 0 +#define PT_INFO_REQUEST 1 +#define PT_INFO_RESPONSE 2 +#define PT_REPORT_REMOTE 3 +#define PT_REPORT_REMOTE_D1 4 + +// 4 bytes +struct sNetworkPacketHeader +{ + uint8_t src; + uint16_t netId:4; + uint16_t timeslot:6; + uint16_t timeslotNext:6; + uint8_t crc; +}; + +// 1 byte +struct sNetworkPackeItemHeader +{ + uint8_t type:3; + uint8_t size:5; +}; + +#define MAX_NETWORK_USER_NAME 16 + +struct sNpInfoRequest +{ + uint8_t count; //count of sNpInfoRequestItem +}; + +struct sNpInfoRequestItem +{ + uint8_t id; // src id +}; + + +struct sNpInfoResponse +{ + char name[MAX_NETWORK_USER_NAME]; + char symbol; +}; + + +// 12 bytes +struct sNpReportItem +{ + int32_t lat:28; + int32_t lng:28; + int32_t alt:15; + uint32_t heading:9; + uint32_t status:4; + uint32_t options:4; + uint8_t hacc; +}; + +#define RID1SL 16 +#define RID1SA 8 +// 9 bytes +struct sNpReportItemD1 +{ + int32_t lat:RID1SL; + int32_t lng:RID1SL; + int32_t alt:RID1SA; + uint32_t heading:9; + uint32_t status:4; + uint32_t options:4; + uint8_t hacc; +}; + +// 6 bytes +struct sNpReportRemoteHeader +{ + uint8_t src; + union + { + // 5 bytes + struct + { + uint8_t flag:1; // 0 - d4, 1 - d3 + uint8_t t0:6; + uint8_t reserved:1; + uint8_t t1:4; + uint8_t t2:4; + uint8_t t3:4; + uint8_t t4:4; + uint8_t t5:4; + uint8_t t6:4; + uint8_t t7:4; + uint8_t t8:4; + void set(uint8_t idx,uint8_t value) + { + switch(idx) + { + case 1: t1 = value;break; + case 2: t2 = value;break; + case 3: t3 = value;break; + case 4: t4 = value;break; + case 5: t5 = value;break; + case 6: t6 = value;break; + case 7: t7 = value;break; + case 8: t8 = value;break; + } + } + uint8_t get(uint8_t idx) const + { + switch(idx) + { + case 1: return t1; + case 2: return t2; + case 3: return t3; + case 4: return t4; + case 5: return t5; + case 6: return t6; + case 7: return t7; + case 8: return t8; + } + return 0; + } + uint8_t size() const { return 8; } + }d4; + struct + { + uint8_t flag:1; + uint8_t t0:6; + uint8_t t1:3; + uint8_t t2:3; + uint8_t t3:3; + uint8_t t4:3; + uint8_t t5:3; + uint8_t t6:3; + uint8_t t7:3; + uint8_t t8:3; + uint8_t t9:3; + uint8_t t10:3; + uint8_t t11:3; + void set(uint8_t idx,uint8_t value) + { + switch(idx) + { + case 1: t1 = value;break; + case 2: t2 = value;break; + case 3: t3 = value;break; + case 4: t4 = value;break; + case 5: t5 = value;break; + case 6: t6 = value;break; + case 7: t7 = value;break; + case 8: t8 = value;break; + case 9: t9 = value;break; + case 10: t10 = value;break; + case 11: t11 = value;break; + } + } + uint8_t get(uint8_t idx) const + { + switch(idx) + { + case 1: return t1; + case 2: return t2; + case 3: return t3; + case 4: return t4; + case 5: return t5; + case 6: return t6; + case 7: return t7; + case 8: return t8; + case 9: return t9; + case 10: return t10; + case 11: return t11; + } + return 0; + } + uint8_t size() const { return 11; } + }d3; + }ts; +}; + + +#pragma pack(pop) diff --git a/src/atScreen.cpp b/src/atScreen.cpp new file mode 100644 index 0000000..b00bfa0 --- /dev/null +++ b/src/atScreen.cpp @@ -0,0 +1,16 @@ +#include "atscreen.h" + +cATScreen::cATScreen(atGlobal &global):m_global(global) +{ + m_screenState = SS_BOOT; +} + +cATScreen::~cATScreen() +{ + +} + +bool cATScreen::init() +{ + return true; +} \ No newline at end of file diff --git a/src/atScreenEVE.cpp b/src/atScreenEVE.cpp new file mode 100644 index 0000000..9912e01 --- /dev/null +++ b/src/atScreenEVE.cpp @@ -0,0 +1,1052 @@ +#include +#include "config.h" +#ifdef USE_SCREEN_EVE +#include "atScreenEVE.h" +#include "gps/GPS.h" +#include "../include/version.h" +#include + +#define EO_BATT 40 +#define EO_STAT_Y 14 +#define EO_STAT_FONT 20 +#define EO_BOOT_FONT 20 +#define EO_SIDE_BTN_FONT 26 +#define EO_SPACE 5 +#define EO_POI_FONT 15 +#define EO_TIMERS_FONT 26 +#define EO_TIMERS_FONT_SIZE 16 + + +static const uint8_t PROGMEM eveFont14[] = +#include "calibri_14_L4.rawh" +; + + +cATScreenEVE::cATScreenEVE(atGlobal &global):cATScreenLVGL(global),m_mapsMemory(MAPS_MEMORY_ITEMS) +{ + m_pointer = 0; + m_backlight = 0x20; +} + +cATScreenEVE::~cATScreenEVE() +{ + +} + +bool cATScreenEVE::init() +{ + if(cATScreenLVGL::init()) + { + DEBUG_MSG("EVE frequency %dMhz\n",EVE_memRead32(REG_FREQUENCY)/1000000); + if(EVE_memRead32(REG_FREQUENCY)==0) + return false; + EVE_cmd_flashattach(); + EVE_cmd_flashfast(); + m_pointer = EVE_HSIZE*EVE_VSIZE*2; + EVE_memWrite_buffer(m_pointer,eveFont14,sizeof(eveFont14),false); + EVE_cmd_execute(); + m_pointer += sizeof(eveFont14)+32; + m_pointer = (m_pointer/32)*32; + EVE_memWrite32(REG_PWM_HZ, 2000); + setBacklight(100); + return true; + } + else + { + return false; + } +} + +void cATScreenEVE::beginDraw() +{ + EVE_cmd_dl(CMD_DLSTART); +} + +void cATScreenEVE::endDraw() +{ + EVE_cmd_dl(DL_DISPLAY); + EVE_cmd_dl(CMD_SWAP); + EVE_cmd_execute(); +} + +void cATScreenEVE::loadAllImages() +{ + m_pointer = m_gpsImage.load("/spiffs/gps.png",EVE_RAM_G+m_pointer); +} + +void cATScreenEVE::screenOn() +{ + EVE_cmdWrite(EVE_ACTIVE, 0); + delay(10); + EVE_memWrite8(REG_PWM_DUTY, m_backlight); +} + +void cATScreenEVE::screenOff() +{ + EVE_memWrite8(REG_PWM_DUTY, 0); + EVE_cmdWrite(EVE_SLEEP, 0); +} + +#define BUILD_YEAR (__DATE__ + 7) + +void cATScreenEVE::showBootScreen(const char * msg1,const char * msg2) +{ + char buffer[64]; + beginDraw(); + EVE_cmd_dl(DL_CLEAR_RGB | 0x000000UL); + EVE_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); + EVE_loadImage("/spiffs/at.png",EVE_RAM_G+m_pointer,0); + EVE_cmd_dl(BEGIN(EVE_BITMAPS)); + EVE_cmd_dl(VERTEX2II(0, 0, 0, 0)); + EVE_cmd_dl(COLOR_RGB(m_theme.bootTextColor.r,m_theme.bootTextColor.g,m_theme.bootTextColor.b)); + snprintf(buffer,sizeof(buffer),"Version %s (%s), Copyright DDV %s",VERSION,__DATE__,BUILD_YEAR); + EVE_cmd_text(EVE_HSIZE,EVE_VSIZE-EO_BOOT_FONT-2,EO_BOOT_FONT,EVE_OPT_RIGHTX,buffer); + if(msg1) + { + EVE_cmd_text(EVE_HSIZE/2,EVE_VSIZE-EO_BOOT_FONT*3-2,EO_BOOT_FONT,EVE_OPT_CENTERX,msg1); + } + if(msg2) + { + EVE_cmd_text(EVE_HSIZE/2,EVE_VSIZE-EO_BOOT_FONT*1.5-2,EO_BOOT_FONT,EVE_OPT_CENTERX,msg2); + } + EVE_cmd_spinner(EVE_HSIZE/2,EVE_VSIZE/2,0,0); + endDraw(); +} + +void cATScreenEVE::closeBootScreen() +{ + beginDraw(); + EVE_cmd_dl(DL_CLEAR_RGB | 0x000000UL); + EVE_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); + endDraw(); + loadAllImages(); +} + +void cATScreenEVE::drawInfo() +{ + char buffer[32]; + snprintf(buffer,sizeof(buffer),"ID #%d, %s",(int)m_global.getConfig().id,m_global.getConfig().name.c_str()); + EVE_cmd_text(EVE_HSIZE-EO_SPACE,EO_STAT_Y,EO_STAT_FONT,EVE_OPT_RIGHTX,buffer); + snprintf(buffer,sizeof(buffer),"Status: %s",m_global.m_playerStatus.status==PS_NORMAL?ATS_ALIVE:ATS_DEAD); + EVE_cmd_text(EVE_HSIZE-EO_SPACE,EO_STAT_Y*2,EO_STAT_FONT,EVE_OPT_RIGHTX,buffer); +} + +void cATScreenEVE::drawDateTime() +{ + char buffer[32]; + if(getValidTime()>0) + { + time_t now; + struct tm timeinfo; + time(&now); + localtime_r(&now, &timeinfo); + + snprintf(buffer,sizeof(buffer),"%02d:%02d:%02d %02d/%02d/%04d",timeinfo.tm_hour,timeinfo.tm_min,timeinfo.tm_sec,timeinfo.tm_mon+1,timeinfo.tm_mday,timeinfo.tm_year+1900); + } + else + snprintf(buffer,sizeof(buffer),"--:--:--"); + EVE_cmd_text(EO_SPACE,0,EO_STAT_FONT,0,buffer); +} + +void cATScreenEVE::drawBattery() +{ + char buffer[32]; + snprintf(buffer,sizeof(buffer),"%d%% (%0.2fV)",m_global.m_powerStatus->getBatteryChargePercent(),m_global.m_powerStatus->getBatteryVoltageMv()/1000.0); + EVE_cmd_text(EVE_HSIZE-EO_BATT,0,EO_STAT_FONT,EVE_OPT_RIGHTX,buffer); + //snprintf(buffer,sizeof(buffer),"%0.0f mA /%0.0f / %d",m_global.getPower()->getAXP().isChargeing()?m_global.getPower()->getAXP().getBattChargeCurrent():m_global.getPower()->getAXP().getBattDischargeCurrent(),m_global.getPower()->getAXP().getCoulombData(),m_backlight); + //EVE_cmd_text(EVE_HSIZE-EO_SPACE,EVE_VSIZE-EO_STAT_Y,EO_STAT_FONT,EVE_OPT_RIGHTX,buffer); +} + +void cATScreenEVE::drawGPS() +{ + char buffer[32]; + snprintf(buffer,sizeof(buffer),"%d",m_global.m_gpsStatus->getNumSatellites()); + EVE_cmd_text(EVE_HSIZE-EO_BATT+EO_SPACE*3+m_gpsImage.w,0,EO_STAT_FONT,0,buffer); + m_gpsImage.setImage(); + EVE_cmd_dl(BEGIN(EVE_BITMAPS)); + EVE_cmd_dl(VERTEX2II(EVE_HSIZE-EO_BATT+EO_SPACE*2, 0, 0, 0)); + if(m_global.m_gpsStatus->getHasLock()) + { + double lat; + double lng; + double x = m_global.m_mapCenterX==0?m_global.m_gpsStatus->getX():m_global.m_mapCenterX; + double y = m_global.m_mapCenterY==0?m_global.m_gpsStatus->getY():m_global.m_mapCenterY; + convertMeterToDegree(x,y,lng,lat); + + snprintf(buffer,sizeof(buffer),"%010.7f",lat); + EVE_cmd_text(EO_SPACE,EO_STAT_Y,EO_STAT_FONT,0,buffer); + snprintf(buffer,sizeof(buffer),"%010.7f",lng); + EVE_cmd_text(EO_SPACE,EO_STAT_Y*2,EO_STAT_FONT,0,buffer); + } +} + + +void cATScreenEVE::setBacklight(uint8_t level) +{ + m_backlight = level/2+1; + EVE_memWrite8(REG_PWM_DUTY, m_backlight); +} + +inline static void calcCirclePoint(double angle, int32_t radius, int32_t &x,int32_t &y) +{ + if(angle<0) + angle += 2*PI; + else + if(angle>2*PI) + angle -= 2*PI; + x = radius*cos(angle); + y = radius*sin(angle); +} + +#define R1 (EVE_VSIZE/2) +#define HEADING_R (EVE_VSIZE/2-12) +//#define HEADING_A (10*PI/180) +#define HEADING_A 0 +void cATScreenEVE::beginMainScreen() +{ + cMapTilesList tiles; + double radius = m_global.getConfig().radius; + + double xx = m_global.m_mapCenterX==0?m_global.m_gpsStatus->getX():m_global.m_mapCenterX; + double yy = m_global.m_mapCenterY==0?m_global.m_gpsStatus->getY():m_global.m_mapCenterY; + + if(m_global.m_gpsStatus->getHasLock()) + { + m_distanceC = m_global.m_mapsProcessor.calcDistanceC(xx,yy); + radius *= m_distanceC; + tiles = m_global.m_mapsProcessor.getTilesToRender(xx,yy,radius); + } + else + m_distanceC = 1.0; + m_heading = (18000-m_global.m_imuStatus->getHeading()+m_global.m_gpsStatus->getMagDec()*100)*PI/18000.0; + int32_t cx = EVE_HSIZE/2-1; + int32_t cy = EVE_VSIZE/2-1; + beginDraw(); + EVE_cmd_dl(DL_CLEAR_RGB | m_theme.bgColor.getRGB()); + EVE_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); + + EVE_cmd_dl(STENCIL_OP(EVE_REPLACE,EVE_REPLACE)); + EVE_cmd_dl(STENCIL_FUNC(EVE_ALWAYS,1,255)); + EVE_cmd_dl(BEGIN(EVE_POINTS)); + EVE_cmd_dl(POINT_SIZE(R1*16)); + EVE_cmd_dl(m_theme.circleOuterColor.getEVEColor()); + EVE_cmd_dl(VERTEX2II(cx, cy, 0, 0)); + + EVE_cmd_dl(POINT_SIZE(1888)); + EVE_cmd_dl(m_theme.circleBackgroundColor.getEVEColor()); + EVE_cmd_dl(VERTEX2II(cx, cy, 0, 0)); + + EVE_cmd_dl(POINT_SIZE(960)); + EVE_cmd_dl(m_theme.circleLineColor.getEVEColor()); + EVE_cmd_dl(VERTEX2II(cx, cy, 0, 0)); + + EVE_cmd_dl(POINT_SIZE(928)); + EVE_cmd_dl(m_theme.circleBackgroundColor.getEVEColor()); + EVE_cmd_dl(VERTEX2II(cx, cy, 0, 0)); + EVE_cmd_dl(END()); + EVE_cmd_dl(STENCIL_OP(EVE_KEEP,EVE_KEEP)); + + bool hasTiles = tiles.size(); + if(hasTiles) + { + EVE_cmd_dl(SAVE_CONTEXT()); + EVE_cmd_dl(STENCIL_FUNC(EVE_EQUAL,1,1)); + EVE_cmd_dl(ALPHA_FUNC(EVE_GEQUAL, 198)); + EVE_cmd_dl(COLOR_A(255)); + EVE_cmd_dl(COLOR_RGB(255,255,255)); + m_mapsMemory.clearCurrent(); + for(auto itr=tiles.begin();itr!=tiles.end();itr++) + m_mapsMemory.markCurrent(*itr); + + int64_t now=millis(); + double x = xx-radius; + double y = yy+radius; + int ii=0; + for(auto itr=tiles.begin();itr!=tiles.end();itr++) + { + ii++; + uint32_t address; + bool needLoad; + sMapTile &tile=*itr; + if(m_mapsMemory.allocItem(tile,now,address,needLoad)) + { + if(needLoad) + { + //DEBUG_MSG("Load %X %X %d\n",MAPS_MEMORY_BASE+address,tile.address+4096,tile.size); + EVE_cmd_flashread(MAPS_MEMORY_BASE+address,tile.address+4096,tile.size); + } + EVE_cmd_setbitmap(MAPS_MEMORY_BASE+address,tile.fmt,tile.sizeX,tile.sizeY); + EVE_cmd_dl(BITMAP_SIZE(EVE_BILINEAR,EVE_BORDER,EVE_BORDER,tile.sizeX,tile.sizeY)); + //EVE_cmd_dl(BITMAP_SIZE(EVE_NEAREST,EVE_BORDER,EVE_BORDER,tile.sizeX,tile.sizeY)); + + double scaleX,scaleY; + double tx,ty; + m_global.m_mapsProcessor.calcTile(x,y,tile,radius,(18000-m_global.m_imuStatus->getHeading())/100,scaleX,scaleY,tx,ty); + EVE_cmd_dl(CMD_LOADIDENTITY); + EVE_cmd_scale(65536*scaleX, 65536*scaleY); + EVE_cmd_translate(7864320/scaleX, 7864320/scaleY); + EVE_cmd_rotate((m_global.m_gpsStatus->getMagDec()*100-m_global.m_imuStatus->getHeading())/100*182); + EVE_cmd_translate(-7864320/scaleX, -7864320/scaleY); + EVE_cmd_translate(65536*tx, 65536*ty); + EVE_cmd_dl(CMD_SETMATRIX); + + EVE_cmd_dl(BEGIN(EVE_BITMAPS)); + EVE_cmd_dl(VERTEX2II(40, 0, 0, 0)); + } + } + EVE_cmd_dl(RESTORE_CONTEXT()); + EVE_cmd_dl(COLOR_A(255)); + } + int32_t x,y; + EVE_cmd_dl(BEGIN(EVE_LINES)); + EVE_cmd_dl(m_theme.circleLineColor.getEVEColor()); + calcCirclePoint(m_heading-PI,R1,x,y); + EVE_cmd_dl(VERTEX2II(x+cx,y+cy, 0, 0)); + calcCirclePoint(m_heading,R1,x,y); + EVE_cmd_dl(VERTEX2II(x+cx,y+cy, 0, 0)); + EVE_cmd_dl(END()); + + EVE_cmd_dl(BEGIN(EVE_LINES)); + calcCirclePoint(m_heading+PI/2,R1,x,y); + EVE_cmd_dl(VERTEX2II(x+cx,y+cy, 0, 0)); + calcCirclePoint(m_heading-PI/2,R1,x,y); + EVE_cmd_dl(VERTEX2II(x+cx,y+cy, 0, 0)); + EVE_cmd_dl(END()); + + EVE_cmd_dl(BEGIN(EVE_POINTS)); + EVE_cmd_dl(POINT_SIZE(64)); + EVE_cmd_dl(m_theme.circleLineColor.getEVEColor()); + EVE_cmd_dl(VERTEX2II(cx, cy, 0, 0)); + + EVE_cmd_dl(POINT_SIZE(32)); + EVE_cmd_dl(COLOR_RGB(255, 255, 255)); + EVE_cmd_dl(VERTEX2II(cx, cy, 0, 0)); + EVE_cmd_dl(END()); + + EVE_cmd_dl(m_theme.circleHeadingColor.getEVEColor()); + calcCirclePoint(m_heading-HEADING_A+PI/2,HEADING_R,x,y); + EVE_cmd_text(x+cx,y+cy,28,EVE_OPT_CENTERX | EVE_OPT_CENTERY,"N"); + + calcCirclePoint(m_heading-HEADING_A-PI/2,HEADING_R,x,y); + EVE_cmd_text(x+cx,y+cy,28,EVE_OPT_CENTERX | EVE_OPT_CENTERY,"S"); + + calcCirclePoint(m_heading-HEADING_A-PI,HEADING_R,x,y); + EVE_cmd_text(x+cx,y+cy,28,EVE_OPT_CENTERX | EVE_OPT_CENTERY,"E"); + + calcCirclePoint(m_heading-HEADING_A,HEADING_R,x,y); + EVE_cmd_text(x+cx,y+cy,28,EVE_OPT_CENTERX | EVE_OPT_CENTERY,"W"); + + char buffer[16]; + snprintf(buffer,sizeof(buffer),"%dm",m_global.getConfig().radius); + EVE_cmd_text(cx+R1+1,cy,26,EVE_OPT_CENTERY,buffer); + + snprintf(buffer,sizeof(buffer),"%03d",(int)m_global.getDirectionDeg()); + EVE_cmd_text(EO_SPACE*2,cy,26,EVE_OPT_CENTERY,buffer); + + if(hasTiles) + { +// EVE_cmd_dl(CLEAR_STENCIL(1)); +// EVE_cmd_dl(CLEAR(0,1,0)); + EVE_cmd_dl(STENCIL_OP(EVE_REPLACE,EVE_REPLACE)); + EVE_cmd_dl(STENCIL_MASK(2)); + EVE_cmd_dl(STENCIL_FUNC(EVE_ALWAYS,2,2)); + EVE_cmd_dl(COLOR_A(0)); + + EVE_cmd_dl(BEGIN(EVE_POINTS)); + EVE_cmd_dl(POINT_SIZE(930)); + EVE_cmd_dl(VERTEX2II(cx, cy, 0, 0)); + + EVE_cmd_dl(STENCIL_OP(EVE_KEEP,EVE_KEEP)); + EVE_cmd_dl(STENCIL_FUNC(EVE_NOTEQUAL,2,2)); + EVE_cmd_dl(POINT_SIZE(970)); + EVE_cmd_dl(COLOR_A(255)); + EVE_cmd_dl(m_theme.circleLineColor.getEVEColor()); + EVE_cmd_dl(VERTEX2II(cx, cy, 0, 0)); + EVE_cmd_dl(END()); + EVE_cmd_dl(STENCIL_FUNC(EVE_ALWAYS,0,255)); + EVE_cmd_dl(STENCIL_MASK(255)); + EVE_cmd_dl(STENCIL_OP(EVE_KEEP,EVE_KEEP)); + } + EVE_cmd_setfont2(15,EVE_HSIZE*EVE_VSIZE*2,32); + EVE_cmd_dl(BITMAP_HANDLE(0)); +} + +void cATScreenEVE::endMainScreen() +{ + m_labels.clear(); + EVE_cmd_dl(COLOR_RGB(m_theme.textColor.r,m_theme.textColor.g,m_theme.textColor.b)); + drawBattery(); + drawGPS(); + drawDateTime(); + drawInfo(); + drawSideButtons(); + endDraw(); +} + +int overlappingArea(const sLabelsRect &r1, + const sLabelsRect &r2) +{ + // Area of 1st Rectangle + //int area1 = abs(r1.x1 - r1.x2) * abs(r1.y1 - r1.y2); + + // Area of 2nd Rectangle + //int area2 = abs(r2.x1 - r2.x2) * abs(r2.y1 - r2.y2); + + int x_dist = min(r1.x2, r2.x2) + - max(r1.x1, r2.x1); + int y_dist = (min(r1.y2, r2.y2) + - max(r1.y1, r2.y1)); + int areaI = 0; + if( x_dist > 0 && y_dist > 0 ) + { + areaI = x_dist * y_dist; + } + + return areaI; +} +#define LABEL_SP_X 9 +#define LABEL_SP_Y -6 +#define LABEL_MAX_IDX 7 + +sLabelsRect getLabelPos(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t idx) +{ + sLabelsRect result; + switch(idx) + { + case 1: + { + result.x1 = x+LABEL_SP_X; + result.y1 = y+LABEL_SP_Y-h/2; + break; + } + + case 2: + { + result.x1 = x+LABEL_SP_X; + result.y1 = y+LABEL_SP_Y+h/2; + break; + } + + case 3: + { + result.x1 = x-w/2; + result.y1 = y+LABEL_SP_Y-h/2; + break; + } + + case 4: + { + result.x1 = x-w/2; + result.y1 = y+LABEL_SP_Y+h/2; + break; + } + + case 5: + { + result.x1 = x-w-LABEL_SP_X; + result.y1 = y+LABEL_SP_Y-h/2; + break; + } + + case 6: + { + result.x1 = x-w-LABEL_SP_X; + result.y1 = y+LABEL_SP_Y+h/2; + break; + } + + case 7: + { + result.x1 = x-w-LABEL_SP_X; + result.y1 = y+LABEL_SP_Y; + break; + } + + default: + { + result.x1 = x+LABEL_SP_X; + result.y1 = y+LABEL_SP_Y; + break; + } + } + bool bc = false; + if(result.x1<20) + result.x1 = 20; + if((result.x1+w)>(EVE_HSIZE/2+R1+20)) + { + result.x1 -= (result.x1+w) - (EVE_HSIZE/2+R1+20); + result.y1 = y+LABEL_SP_Y+h/2; + bc = true; + } + + if(result.y1EVE_VSIZE) + { + result.y1 = EVE_VSIZE-(bc?h:h/2); + } + + result.x2 = result.x1+w; + result.y2 = result.y1+h; + return result; +} + + +int32_t cATScreenEVE::getMaxLabelOverlap(sLabelsRect r) +{ + int32_t result = 0; + for(auto itr=m_labels.begin(); itr!=m_labels.end(); itr++) + { + int32_t i = overlappingArea(r,*itr); + if(i>result) + result = i; + } + return result; +} + +extern "C" { extern volatile uint16_t cmdOffset; } + +uint16_t cATScreenEVE::getRadius() +{ + return m_global.getConfig().radius*m_distanceC; +} + +void cATScreenEVE::drawPOI(sPOI &poi,int16_t count) +{ + uint16_t radius = m_global.getConfig().radius*m_distanceC; + if(poi.isValidLocation() && poi.distance!=0) + { + double distance = poi.distance; + bool drawAccuracy = distance<=radius; + if(distance>radius) + { + if(poi.type==POIT_STATIC) + return; + distance = radius; + } + + //if(poi.type==POIT_PEER) + { + int32_t cx = EVE_HSIZE/2-1; + int32_t cy = EVE_VSIZE/2-1; + + int32_t x,y; + int32_t tx,ty; + sColor color(0,0,0); + switch(poi.type) + { + case POIT_SELF: + case POIT_PEER: + { + switch(poi.status) + { + case POIS_NORMAL: + { + color = m_theme.peerNormalColor; + break; + } + case POIS_DEAD: + { + color = m_theme.peerDeadColor; + break; + } + default: + { + color = sColor(255,255,255); + break; + } + } + break; + } + case POIT_DYNAMIC: + { + color = m_theme.peerDynamicColor; + break; + } + case POIT_STATIC: + { + if(poi.color) + color = poi.color; + else + color = m_theme.peerStaticColor; + break; + } + case POIT_ENEMY: + { + color = m_theme.peerEnemyColor; + break; + } + } + EVE_cmd_dl(color.getEVEColor()); + double courseTo = m_heading+poi.courseTo*PI/180.0+PI/2; + //DEBUG_MSG("%f %f %f\n",courseTo,m_heading,poi.courseTo*PI/180.0); + calcCirclePoint(courseTo,R1*distance/radius,x,y); + EVE_cmd_dl(BEGIN(EVE_POINTS)); + if(drawAccuracy && poi.hacc>0) + { + int32_t ps = R1*poi.hacc/(radius*10)*16; + + + EVE_cmd_dl(STENCIL_OP(EVE_REPLACE,EVE_REPLACE)); + EVE_cmd_dl(STENCIL_MASK(4)); + EVE_cmd_dl(STENCIL_FUNC(EVE_ALWAYS,4,4)); + EVE_cmd_dl(COLOR_A(0)); + EVE_cmd_dl(POINT_SIZE(ps)); + EVE_cmd_dl(VERTEX2II(x+cx,y+cy, 0, 0)); + + EVE_cmd_dl(STENCIL_OP(EVE_KEEP,EVE_KEEP)); + EVE_cmd_dl(STENCIL_MASK(255)); + + EVE_cmd_dl(STENCIL_FUNC(EVE_EQUAL,1,1)); + EVE_cmd_dl((color+m_theme.peerAccuracyMask).getEVEColor()); + EVE_cmd_dl(COLOR_A(m_theme.peerAccuracyA)); + EVE_cmd_dl(POINT_SIZE(ps)); + EVE_cmd_dl(VERTEX2II(x+cx,y+cy, 0, 0)); + + + EVE_cmd_dl(STENCIL_FUNC(EVE_EQUAL,1,5)); + EVE_cmd_dl(COLOR_A(m_theme.peerAccuracyA*2)); + EVE_cmd_dl(POINT_SIZE(ps+32)); + EVE_cmd_dl(VERTEX2II(x+cx,y+cy, 0, 0)); + + EVE_cmd_dl(COLOR_A(255)); + EVE_cmd_dl(STENCIL_FUNC(EVE_ALWAYS,0,255)); + } + EVE_cmd_dl(POINT_SIZE(80)); + EVE_cmd_dl(VERTEX2II(x+cx,y+cy, 0, 0)); + EVE_cmd_dl(COLOR_RGB(0,0,0)); + char buffer[32]; + if(poi.symbol>0) + { + if(poi.symbol<30) + buffer[0] = poi.symbol+0x30; + else + buffer[0] = poi.symbol; + } + else + if(poi.name.c_str()[0]) + buffer[0] = poi.name.c_str()[0]; + else + buffer[0] = ' '; + buffer[1] = 0; + if(poi.type!=POIT_SELF) + EVE_cmd_text(x+cx+1,y+cy+1,EO_POI_FONT,EVE_OPT_CENTERX | EVE_OPT_CENTERY,buffer); + + if(count<=10) + { + tx = cx+x; + ty = cy+y; + + int64_t delta = millis()-poi.lastUpdate; + if(poi.type==POIT_SELF) + { + snprintf(buffer,sizeof(buffer),"%dm",(int)poi.realDistance); + } + else + if(poi.type==POIT_STATIC) + { + snprintf(buffer,sizeof(buffer),"%dm",(int)poi.realDistance); + } + else + { + if(delta>10000) + snprintf(buffer,sizeof(buffer),"%dm, %d%%, %ds",(int)poi.realDistance,(int)clamp((int)((poi.SNR + 10) * 5), 0, 100),(int)delta/1000); + else + snprintf(buffer,sizeof(buffer),"%dm, %d%%",(int)poi.realDistance,(int)clamp((int)((poi.SNR + 10) * 5), 0, 100)); + } + int32_t w = max(strnlen(buffer,sizeof(buffer)),poi.name.size())*7; + int32_t h = 30; + sLabelsRect lr; + sLabelsRect lrtmp = getLabelPos(tx,ty,w,h,0); + lr = lrtmp; + int32_t threshold = lrtmp.getArea()/10+5; + int32_t minOverlap = getMaxLabelOverlap(lrtmp); + if(poi.lastLabelIdx == 0) + minOverlap -= threshold; + uint8_t activeLabelIdx = 0; + uint8_t labelIdx = 1; + while(minOverlap>0 && labelIdx<=LABEL_MAX_IDX) + { + lrtmp = getLabelPos(tx,ty,w,h,labelIdx); + int32_t overlap = getMaxLabelOverlap(lrtmp); + if(labelIdx==poi.lastLabelIdx) + overlap -= threshold; + if(overlap0) + { + EVE_cmd_loadimage(ptr,options,eve_buffer,n); + } + while(n>0) + { + n = fread(eve_buffer,1,sizeof(eve_buffer),imgfile); + if(n>0) + block_transfer(eve_buffer,n); + } + fclose(imgfile); + return true; + } + else + { + return false; + } + +} + +bool EVE_inflateImage(const char* filename, uint32_t ptr) +{ + FILE *imgfile = fopen(filename,"r"); + if(imgfile) + { + size_t n = fread(eve_buffer,1,sizeof(eve_buffer),imgfile); + if(n>0) + { + EVE_cmd_inflate(ptr,eve_buffer,n); + } + while(n>0) + { + n = fread(eve_buffer,1,sizeof(eve_buffer),imgfile); + if(n>0) + block_transfer(eve_buffer,n); + } + fclose(imgfile); + return true; + } + else + { + return false; + } +} + +void cATScreenEVE::drawSideButtons() +{ + sSideButton *sb = m_global.m_sideButtons.getButtons(); + auto drawCaption = [=](uint16_t x,uint16_t y, uint8_t idx, uint16_t options) { + EVE_cmd_dl(COLOR_RGB(0, 0, 0)); + EVE_cmd_text(x+1,y+1,EO_SIDE_BTN_FONT,options,sb[idx].caption.c_str()); + EVE_cmd_dl(m_theme.sideButtonsTextColor.getEVEColor()); + EVE_cmd_text(x,y,EO_SIDE_BTN_FONT,options,sb[idx].caption.c_str()); + }; + if(!sb[0].caption.empty()) + drawCaption(EO_SPACE,72,0,EVE_OPT_CENTERY); + + if(!sb[1].caption.empty()) + drawCaption(EO_SPACE,150,1,EVE_OPT_CENTERY); + + if(!sb[2].caption.empty()) + drawCaption(EO_SPACE,226,2,EVE_OPT_CENTERY); + + if(!sb[3].caption.empty()) + drawCaption(EVE_HSIZE-EO_SPACE,72,3,EVE_OPT_CENTERY|EVE_OPT_RIGHTX); + + if(!sb[4].caption.empty()) + drawCaption(EVE_HSIZE-EO_SPACE,150,4,EVE_OPT_CENTERY|EVE_OPT_RIGHTX); + + if(!sb[5].caption.empty()) + drawCaption(EVE_HSIZE-EO_SPACE,226,5,EVE_OPT_CENTERY|EVE_OPT_RIGHTX); +} + +uint32_t cATScreenEVE::flashProgrammStart() +{ + EVE_cmd_flashattach(); + return EVE_cmd_flashfast(); +} + +void cATScreenEVE::flashProgrammEnd() +{ +} + +#define RAMG_BUFFER (512*1024) +void cATScreenEVE::flashWrite(uint32_t address,uint16_t size, uint8_t *data) +{ + EVE_memWrite_buffer(RAMG_BUFFER,data,size,false); + EVE_cmd_flashupdate(address,RAMG_BUFFER,size); +} + +void cATScreenEVE::flashRead(uint32_t address,uint16_t size, uint8_t *data) +{ + EVE_cmd_flashread(RAMG_BUFFER,address,size); + for(int i=0; i timersLines; + std::stringstream ss; + std::list timers; + int maxLineSize = 0; + for(auto itr = m_global.m_timersChains.begin(); itr!=m_global.m_timersChains.end(); itr++) + { + auto timersList = (*itr)->getTimers(); + if((forceAll||(*itr)->isStarted())&&(*itr)->isEnabled()) + { + int lineSize=0; + for(auto titr=timersList.begin();titr!=timersList.end();titr++) + { + cTimer *t = (*titr); + if(titr!=timersList.begin()) + { + ss<<" / "; + lineSize += 3; + } + lineSize += t->getName().length()+3; + ss << t->getName() << " "; + int duration = t->getDuration()-t->getCurrentDuration(now); + ss << std::setfill('0') << std::setw(2) << duration/60000 << ":"; + ss << std::setfill('0') << std::setw(2) << duration%60000/1000; + } + if(lineSize>maxLineSize) + maxLineSize = lineSize; + sEveTimerLine line; + line.str = ss.str(); + ss.str(""); + line.finished = (*itr)->isFinished(now); + timersLines.push_back(line); + } + timers.insert(timers.end(),timersList.begin(),timersList.end()); + } + timers.unique(); + for(auto itr=m_global.m_timers.begin();itr!=m_global.m_timers.end();itr++) + { + cTimer *t = itr->second; + if(std::find(timers.begin(),timers.end(),t)==timers.end() && t->isEnabled()) + { + if(forceAll||t->isStarted()) + { + int lineSize = t->getName().length()+4; + ss << t->getName() << " "; + int duration = t->getDuration()-t->getCurrentDuration(now); + ss << std::setfill('0') << std::setw(2) << duration/60000 << ":"; + ss << std::setfill('0') << std::setw(2) << duration%60000/1000; + if(lineSize>maxLineSize) + maxLineSize = lineSize; + sEveTimerLine line; + line.str = ss.str(); + ss.str(""); + line.finished = t->isFinished(now); + timersLines.push_back(line); + } + } + } + if(timersLines.size()>0) + { + int x,y; + y = EVE_VSIZE-EO_SPACE-EO_TIMERS_FONT_SIZE*timersLines.size(); + x = EVE_HSIZE-EO_SPACE*2-maxLineSize*10; + EVE_cmd_dl(m_theme.timerRectColor.getEVEColor()); + EVE_cmd_dl(COLOR_A(128)); + + EVE_cmd_dl(BEGIN(EVE_RECTS)); + EVE_cmd_dl(VERTEX2II(x,y,0,0)); + EVE_cmd_dl(VERTEX2II(EVE_HSIZE,EVE_VSIZE,0,0)); + EVE_cmd_dl(END()); + EVE_cmd_dl(m_theme.timerTextColor.getEVEColor()); + EVE_cmd_dl(COLOR_A(255)); + x = x+EO_SPACE; + y = y+EO_SPACE; + for(auto itr = timersLines.begin(); itr!=timersLines.end(); itr++) + { + if(!(*itr).finished || (now%500)<=250) + { + EVE_cmd_text(x,y,EO_TIMERS_FONT,0,(*itr).str.c_str()); + if((*itr).finished) + EVE_cmd_text(x+1,y,EO_TIMERS_FONT,0,(*itr).str.c_str()); + } + y += EO_TIMERS_FONT_SIZE; + } + } +} + +///////////////////////////////////////////////////////////// +cMapsMemory::cMapsMemory(uint8_t count):m_count(count) +{ + m_memory = (sMapsMemoryItem*)calloc(m_count,sizeof(sMapsMemoryItem)); + for(uint8_t i=0; i=0) + m_memory[idx].inCurrentList = 1; +} + +bool cMapsMemory::allocItem(const sMapTile &tile,int64_t now, uint32_t &address, bool &needLoad) +{ + int8_t idx = findItem(tile); + if(idx>=0) + { + m_memory[idx].lastUsed = now; + needLoad = false; + address = m_memory[idx].memoryaddress; + return true; + } + for(uint8_t i=0; i=0) + { + m_memory[idx].address = tile.address; + m_memory[idx].inUse = 1; + m_memory[idx].inCurrentList = 1; + m_memory[idx].lastUsed = now; + needLoad = true; + address = m_memory[idx].memoryaddress; + return true; + } + return false; +} +#endif \ No newline at end of file diff --git a/src/atScreenEVE.h b/src/atScreenEVE.h new file mode 100644 index 0000000..8f574d5 --- /dev/null +++ b/src/atScreenEVE.h @@ -0,0 +1,133 @@ +#pragma once +#include +#include "atScreenLVGL.h" +extern "C" +{ + #include +} + +bool EVE_loadImage(const char* filename, uint32_t ptr, uint32_t options); +bool EVE_inflateImage(const char* filename, uint32_t ptr); + +struct sEVEImage +{ + uint32_t ptr; + uint16_t w; + uint16_t h; + uint16_t fmt; + sEVEImage() + { + ptr = 0; + w = h = fmt = 0; + } + + uint32_t load(const char * filename,uint32_t _ptr) + { + uint32_t result=0; + uint32_t _w, _h; + ptr = _ptr; + EVE_loadImage(filename,_ptr,EVE_OPT_NODL); + EVE_LIB_GetProps(&result,&_w,&_h); + fmt = EVE_ARGB4; + w = _w; + h = _h; + return result; + } + + void setImage() + { + EVE_cmd_setbitmap(ptr,fmt, w, h); + } +}__attribute__((packed)); + +struct sMapsMemoryItem +{ + uint32_t address; + uint32_t memoryaddress; + uint32_t size; + int64_t lastUsed; + uint32_t usageCounter; + uint8_t inUse:1; + uint8_t inCurrentList:1; +}; + +#define MAX_MAP_IMAGE_SIZE 59536 +#define MAPS_MEMORY_ITEMS 9 +#define MAPS_MEMORY_BASE (EVE_RAM_G_SIZE-(MAPS_MEMORY_ITEMS*MAX_MAP_IMAGE_SIZE)) +class cMapsMemory +{ +protected: + sMapsMemoryItem *m_memory; + uint8_t m_count; + int8_t findItem(const sMapTile &tile); +public: + cMapsMemory(uint8_t count); + ~cMapsMemory(); + + void clearCurrent(); + void markCurrent(const sMapTile &tile); + bool allocItem(const sMapTile &tile,int64_t now, uint32_t &address, bool &needLoad); +}; + + +struct sLabelsRect +{ + int32_t x1; + int32_t y1; + int32_t x2; + int32_t y2; + + int32_t getArea() + { + return abs((x2-x1)*(y2-y1)); + } +}; + +class cATScreenEVE:public cATScreenLVGL +{ +protected: + sEVEImage m_gpsImage; + uint32_t m_pointer; + uint8_t m_backlight; + double m_heading; + cMapsMemory m_mapsMemory; + std::list m_labels; + double m_distanceC = 1.0; + + void loadAllImages(); + void beginDraw(); + void endDraw(); + void drawBattery(); + void drawGPS(); + void drawDateTime(); + void drawInfo(); + int32_t getMaxLabelOverlap(sLabelsRect r); +public: + cATScreenEVE(atGlobal &global); + virtual ~cATScreenEVE(); + + virtual bool init(); + virtual void showBootScreen(const char * msg1,const char * msg2); + virtual void closeBootScreen(); + virtual void beginMainScreen(); + virtual void drawPOI(sPOI &poi,int16_t count=0); + virtual void endMainScreen(); + virtual void setBacklight(uint8_t level); + virtual void screenOn(); + virtual void screenOff(); + virtual void drawSideButtons(); + virtual void showProgramMode(); + virtual uint32_t getFramesCount(); + virtual void showMenu(); + virtual void loop(); + virtual void setScreenState(uint8_t value); + virtual void showShutdownScreen(); + virtual void drawTimers(bool forceAll); + virtual uint16_t getRadius(); + + + virtual uint32_t flashProgrammStart(); + virtual void flashProgrammEnd(); + virtual void flashWrite(uint32_t address,uint16_t size, uint8_t *data); + virtual void flashRead(uint32_t address,uint16_t size, uint8_t *data); +}; diff --git a/src/atScreenLVGL.cpp b/src/atScreenLVGL.cpp new file mode 100644 index 0000000..ab4669a --- /dev/null +++ b/src/atScreenLVGL.cpp @@ -0,0 +1,991 @@ +#include "atScreenLVGL.h" +#include +#include "atLVEvents.h" +#include "lv_settings/lv_settings.h" +#include "global.h" + +#define LV_SIDE_WIDTH 40 +#define LV_TOP_HEIGHT 10 + +void *lvgl_malloc(size_t size) +{ + return heap_caps_malloc(size,MALLOC_CAP_SPIRAM); +} + +void lvgl_free(void *ptr) +{ + heap_caps_free(ptr); +} + +#pragma GCC diagnostic ignored "-Wwrite-strings" +static void lvIScreenEventCb(struct _lv_obj_t * obj, lv_event_t event) +{ + void *userData = lv_obj_get_user_data(obj); + if(userData) + ((cLVGLScreen*)userData)->lvIScreenEvent(obj,event); +} + +void cLVGLScreen::setEventHandler(lv_obj_t *obj) +{ + lv_obj_set_user_data(obj,this); + lv_obj_set_event_cb(obj,lvIScreenEventCb); +} + +class cLVGLScreenMainMenu:public cLVGLScreen +{ +protected: + lv_settings_item_t m_rootItem = {.name = "Main Menu", .value = ""}; + + lv_settings_item_t m_mainMenuItems[2] = + { + {.id = 10,.type = LV_SETTINGS_TYPE_LIST_BTN, .name="Settings", .value=""}, + {.type = LV_SETTINGS_TYPE_INV}, /*Mark the last item*/ + }; + + lv_settings_item_t m_mainSettingsItems[5] = + { + {.id = 4,.type = LV_SETTINGS_TYPE_LIST_BTN, .name="Timers settings", .value="Timers durations"}, + {.id = 1,.type = LV_SETTINGS_TYPE_LIST_BTN, .name="User settings", .value="ID, name, brightness, etc."}, + {.id = 2,.type = LV_SETTINGS_TYPE_LIST_BTN, .name="Network settings", .value="Frequency, bandwidth etc."}, + {.id = 3,.type = LV_SETTINGS_TYPE_LIST_BTN, .name="IMU settings", .value="Calibration, Settings"}, + {.type = LV_SETTINGS_TYPE_INV}, /*Mark the last item*/ + }; + + char imAutoCal[16]; + lv_settings_item_t m_mainIMUItems[5] = + { + {.id = 1,.type = LV_SETTINGS_TYPE_LIST_BTN, .name="Mag Calibration", .value=""}, + {.id = 2,.type = LV_SETTINGS_TYPE_SW, .name="Mag Auto Calibration", .value=imAutoCal}, + {.id = 3,.type = LV_SETTINGS_TYPE_LIST_BTN, .name="Save Calibration", .value=""}, + {.id = 4,.type = LV_SETTINGS_TYPE_LIST_BTN, .name="Reset Calibration", .value=""}, + {.type = LV_SETTINGS_TYPE_INV}, /*Mark the last item*/ + }; + + char nmName[16]; + char nmUserId[4]; + char nmSymbol[2]; + lv_settings_item_t m_userMenuItems[4] = + { + {.id = 1,.type = LV_SETTINGS_TYPE_EDIT, .name="Name", .value=nmName, .param1=sizeof(nmName)}, + {.id = 2,.type = LV_SETTINGS_TYPE_EDIT, .name="Symbol", .value=nmSymbol, .param1=sizeof(nmSymbol)}, + {.id = 3,.type = LV_SETTINGS_TYPE_NUMSET, .name="ID", .value=nmUserId}, + {.type = LV_SETTINGS_TYPE_INV}, /*Mark the last item*/ + }; + + char nmFrequency[16]; + char nmNetworkId[4]; + char nmSF[4]; + char nmCR[4]; + char nmPreamble[4]; + char nmSync[6]; + char nmPassword[16]; + lv_settings_item_t m_networkMenuItems[10] = + { + {.id = 1,.type = LV_SETTINGS_TYPE_NUMSET, .name="Frequency", .value=nmFrequency}, + {.id = 2,.type = LV_SETTINGS_TYPE_DDLIST, .name="Bandwidth", .value="500Mhz\n250Mhz"}, + {.id = 3,.type = LV_SETTINGS_TYPE_NUMSET, .name="Spreading Factor", .value=nmSF}, + {.id = 4,.type = LV_SETTINGS_TYPE_NUMSET, .name="Coding Rate", .value=nmCR}, + {.id = 5,.type = LV_SETTINGS_TYPE_NUMSET, .name="Preamble", .value=nmPreamble}, + {.id = 6,.type = LV_SETTINGS_TYPE_NUMSET, .name="Sync Word", .value=nmSync}, + {.id = 10,.type = LV_SETTINGS_TYPE_NUMSET, .name="Network ID", .value=nmNetworkId}, + {.id = 11,.type = LV_SETTINGS_TYPE_EDIT, .name="Password", .value=nmPassword, .param1=sizeof(nmPassword),.param2=LV_SETTINGS_EDIT_PWD}, + {.id = 20,.type = LV_SETTINGS_TYPE_LIST_BTN, .name="Save", .value="Save network settings"}, + {.type = LV_SETTINGS_TYPE_INV}, /*Mark the last item*/ + }; + + char nmTimers[AT_MAX_TIMERS][10]; + lv_settings_item_t m_timersSettings[5] = + { + {.id = 0,.type = LV_SETTINGS_TYPE_NUMSET, .name="Timer 1", .value=nmTimers[0], .param1 = 10}, + {.id = 1,.type = LV_SETTINGS_TYPE_NUMSET, .name="Timer 2", .value=nmTimers[1], .param1 = 10}, + {.id = 2,.type = LV_SETTINGS_TYPE_NUMSET, .name="Timer 3", .value=nmTimers[2], .param1 = 10}, + {.id = 3,.type = LV_SETTINGS_TYPE_NUMSET, .name="Timer 4", .value=nmTimers[3], .param1 = 10}, + {.type = LV_SETTINGS_TYPE_INV}, /*Mark the last item*/ + }; + + lv_obj_t *m_root; + bool m_isMainPage = true; + virtual void internalInit(); + virtual void internalDeinit(); + void updateIMUSettings(); + void updateNetworkSettings(); + void updateTimersSettings(); + void updateUserSettings(); +public: + cLVGLScreenMainMenu(cATScreenLVGL *owner):cLVGLScreen(owner){}; + void mainMenuEvent(lv_settings_item_t * act_item, lv_obj_t * obj, lv_event_t e); + void settingsMenuEvent(lv_settings_item_t * act_item, lv_obj_t * obj, lv_event_t e); + void networkMenuEvent(lv_settings_item_t * act_item, lv_obj_t * obj, lv_event_t e); + void userMenuEvent(lv_settings_item_t * act_item, lv_obj_t * obj, lv_event_t e); + void timersMenuEvent(lv_settings_item_t * act_item, lv_obj_t * obj, lv_event_t e); + void imuMenuEvent(lv_settings_item_t * act_item, lv_obj_t * obj, lv_event_t e); + virtual void back() + { + lv_settings_back(); + } + virtual bool isMainPage() { return m_isMainPage; } +}; + +struct lv_mcal_axis_s +{ + lv_obj_t* page; + lv_obj_t* label; + lv_obj_t* btnP; + lv_obj_t* btnM; +}; +class cLVGLScreenIMUCalibration:public cLVGLScreen +{ +protected: + int64_t m_updateTime; + lv_obj_t *m_root; + lv_style_t text48Style; + lv_style_t text16Style; + lv_style_t text14Style; + lv_mcal_axis_s m_axisX; + lv_mcal_axis_s m_axisY; + lv_mcal_axis_s m_axisZ; + lv_obj_t* m_headingLabel; + lv_obj_t* m_autoButton; + virtual void internalInit(); + virtual void internalDeinit(); + lv_obj_t* lv_button_create(lv_obj_t* parent, const char* caption); + lv_mcal_axis_s lv_mcal_axis_create(lv_obj_t* parent); + void updateIMU(); +public: + cLVGLScreenIMUCalibration(cATScreenLVGL *owner):cLVGLScreen(owner){}; + virtual void back() + { + m_owner->setLVGLScreen(LVS_MAINMENU); + } + virtual void loop(); + virtual bool isMainPage() { return false; } + virtual void lvIScreenEvent(struct _lv_obj_t * obj, lv_event_t event); +}; + +cATScreenLVGL::cATScreenLVGL(atGlobal &global):cATScreen(global) +{ + m_lvState = LVS_NULL; + m_screen = NULL; + m_keypadGroup = NULL; + memset(m_screens,0,sizeof(m_screens)); +} + +cATScreenLVGL::~cATScreenLVGL() +{ + +} + +bool cATScreenLVGL::init() +{ + if(cATScreen::init()) + { + lv_init(); + lvgl_driver_init(); + + static lv_color_t m_buffer1[DISP_BUF_SIZE]; + uint32_t size_in_px = DISP_BUF_SIZE; + lv_disp_buf_init(&m_display_buffer, m_buffer1, NULL, size_in_px); + + lv_disp_drv_t disp_drv; + lv_disp_drv_init(&disp_drv); + disp_drv.flush_cb = disp_driver_flush; + + disp_drv.buffer = &m_display_buffer; + lv_disp_drv_register(&disp_drv); + + m_keypadGroup = lv_group_create(); + + lv_indev_drv_t kb_drv; + lv_indev_drv_init(&kb_drv); + kb_drv.type = LV_INDEV_TYPE_ENCODER; + kb_drv.read_cb = atlve_read; + lv_indev_t * kb_indev = lv_indev_drv_register(&kb_drv); + kb_indev->driver.user_data = kb_indev; + lv_indev_set_group(kb_indev, m_keypadGroup); + + return true; + } + else + { + return false; + } +} + +void cATScreenLVGL::showMenu() +{ + +} + +void cATScreenLVGL::loop() +{ + lv_task_handler(); + if(m_screen) + m_screen->loop(); +} + +void cATScreenLVGL::setLVGLScreen(uint8_t value) +{ + if(value!=m_lvState) + { + m_lvState = value; + if(m_screen) + { + m_screen->deinit(); + m_screen = NULL; + } + } + if(m_screen==NULL) + { + m_screen = createScreen(m_lvState); + if(m_screen) + m_screen->init(); + } +} + +void cATScreenLVGL::setScreenState(uint8_t value) +{ + if(value!=m_screenState) + { + cATScreen::setScreenState(value); + switch(m_screenState) + { + case SS_MENU: + { + setLVGLScreen(LVS_MAINMENU); + break; + } + } + m_global.onScreenStateChange(); + } +} + +cLVGLScreen * cATScreenLVGL::createScreen(uint8_t lvState) +{ + cLVGLScreen *result = m_screens[lvState-1]; + if(result) + return result; + switch(lvState) + { + case LVS_MAINMENU: + { + result = new cLVGLScreenMainMenu(this); + break; + } + + case LVS_IMUCAL: + { + result = new cLVGLScreenIMUCalibration(this); + break; + } + } + m_screens[lvState-1] = result; + return result; +} + +void cATScreenLVGL::processEvent(uint8_t event, uint32_t param1, uint32_t param2) +{ + switch(event) + { + case EV_BTN_ON: + { + if(param1==2) + { + if(m_lvState > LVS_NULL) + { + if(m_screen) + { + if(m_screen->isMainPage()) + setScreenState(SS_MAIN); + else + m_screen->back(); + } + else + setScreenState(SS_MAIN); + } + } + break; + } + + }; + atlve_handler(event,param1,param2); +} + +cLVGLScreen::cLVGLScreen(cATScreenLVGL *owner):m_owner(owner) +{ + m_initialized = false; + m_scr = NULL; + m_mainCont = NULL; + m_leftCont = NULL; + m_rightCont = NULL; +} + +cLVGLScreen::~cLVGLScreen() +{ + +} + +void cLVGLScreen::createRoots() +{ + lv_style_init(&m_styleCont); + lv_style_set_radius(&m_styleCont,LV_STATE_DEFAULT,0); + lv_style_set_border_width(&m_styleCont, LV_STATE_DEFAULT, 0); + + m_scr = lv_obj_create(NULL, NULL); + lv_scr_load(m_scr); + m_leftCont = lv_cont_create(lv_scr_act(), NULL); + lv_obj_add_style(m_leftCont,LV_CONT_PART_MAIN, &m_styleCont); + lv_obj_set_size(m_leftCont, LV_SIDE_WIDTH, lv_obj_get_height(lv_scr_act())); + lv_obj_set_pos(m_leftCont,0,0); + + m_mainCont = lv_cont_create(lv_scr_act(), NULL); + lv_obj_add_style(m_mainCont,LV_CONT_PART_MAIN, &m_styleCont); + lv_obj_set_size(m_mainCont, lv_obj_get_width(lv_scr_act())-LV_SIDE_WIDTH*2, lv_obj_get_height(lv_scr_act())-LV_TOP_HEIGHT); + lv_obj_set_pos(m_mainCont,LV_SIDE_WIDTH,LV_TOP_HEIGHT); + + m_rightCont = lv_cont_create(lv_scr_act(), NULL); + lv_obj_add_style(m_rightCont,LV_CONT_PART_MAIN, &m_styleCont); + lv_obj_set_size(m_rightCont, LV_SIDE_WIDTH, lv_obj_get_height(lv_scr_act())); + lv_obj_set_pos(m_rightCont,lv_obj_get_width(lv_scr_act())-LV_SIDE_WIDTH,0); +} + +void cLVGLScreen::init() +{ + if(!m_initialized) + { + internalInit(); + m_initialized = true; + } +} + +void cLVGLScreen::deinit() +{ + if(m_initialized) + { + internalDeinit(); + m_initialized = false; + } +} + +//////////////////////////////////////////// +static cLVGLScreenMainMenu *menuObject=NULL; + +#define DEF_SETTINGS_CB(name) \ +static void name##Cb(lv_obj_t * obj, lv_event_t e) \ +{\ + lv_settings_item_t * act_item = (lv_settings_item_t *)lv_event_get_data();\ + if(menuObject)\ + menuObject->name(act_item,obj,e);\ +}\ + +DEF_SETTINGS_CB(mainMenuEvent) +DEF_SETTINGS_CB(settingsMenuEvent) +DEF_SETTINGS_CB(networkMenuEvent) +DEF_SETTINGS_CB(userMenuEvent) +DEF_SETTINGS_CB(timersMenuEvent) +DEF_SETTINGS_CB(imuMenuEvent) + + +void cLVGLScreenMainMenu::internalInit() +{ + if(m_scr) + { + lv_scr_load(m_scr); + if(!lv_settings_reopen_last()) + lv_settings_open_page(&m_rootItem, mainMenuEventCb); + } + else + { + menuObject = this; + + lv_settings_set_group(m_owner->getKeypadGroup()); + + createRoots(); + m_root = lv_settings_create(&m_rootItem, NULL); + lv_obj_set_hidden(m_root,true); + lv_settings_set_parent(m_mainCont); + lv_settings_set_max_width(lv_obj_get_width(lv_scr_act())-LV_SIDE_WIDTH*2); + lv_settings_open_page(&m_rootItem, mainMenuEventCb); + } +} + +void cLVGLScreenMainMenu::internalDeinit() +{ +} + +void cLVGLScreenMainMenu::mainMenuEvent(lv_settings_item_t * act_item, lv_obj_t * obj, lv_event_t e) +{ + if(e == LV_EVENT_REFRESH) + { + m_isMainPage = true; + for(uint32_t i = 0; m_mainMenuItems[i].type != LV_SETTINGS_TYPE_INV; i++) { + lv_settings_add(&m_mainMenuItems[i]); + } + } + else if(e == LV_EVENT_CLICKED) { + lv_settings_item_t * act_item = (lv_settings_item_t *)lv_event_get_data(); + switch(act_item->id) + { + case 10: //Settings + { + lv_settings_open_page(act_item, settingsMenuEventCb); + break; + } + } + } + +} + +void cLVGLScreenMainMenu::settingsMenuEvent(lv_settings_item_t * act_item, lv_obj_t * obj, lv_event_t e) +{ + if(e == LV_EVENT_REFRESH) + { + global->updateTimers(); + m_isMainPage = false; + for(uint32_t i = 0; m_mainSettingsItems[i].type != LV_SETTINGS_TYPE_INV; i++) { + lv_settings_add(&m_mainSettingsItems[i]); + } + } + else if(e == LV_EVENT_CLICKED) { + lv_settings_item_t * act_item = (lv_settings_item_t *)lv_event_get_data(); + switch(act_item->id) + { + case 1: //User settings + { + lv_settings_open_page(act_item, userMenuEventCb); + break; + } + case 2: //Network settings + { + lv_settings_open_page(act_item, networkMenuEventCb); + break; + } + case 3: //IMU settings + { + lv_settings_open_page(act_item, imuMenuEventCb); + break; + } + + case 4: //Timers settings + { + lv_settings_open_page(act_item, timersMenuEventCb); + break; + } + + } + } +} + +void cLVGLScreenMainMenu::updateIMUSettings() +{ + snprintf(imAutoCal,sizeof(imAutoCal),"%s",global->getIMU()->getAutoMag()?"Enabled":"Disabled"); + m_mainIMUItems[1].state = global->getIMU()->getAutoMag()?1:0; +} + +void cLVGLScreenMainMenu::imuMenuEvent(lv_settings_item_t * act_item, lv_obj_t * obj, lv_event_t e) +{ + if(e == LV_EVENT_REFRESH) + { + updateIMUSettings(); + m_isMainPage = false; + for(uint32_t i = 0; m_mainIMUItems[i].type != LV_SETTINGS_TYPE_INV; i++) { + lv_settings_add(&m_mainIMUItems[i]); + } + } + else if(e == LV_EVENT_CLICKED) { + lv_settings_item_t * act_item = (lv_settings_item_t *)lv_event_get_data(); + switch(act_item->id) + { + case 1: //IMU Calibration + { + m_owner->setLVGLScreen(LVS_IMUCAL); + break; + } + case 3: //Save + { + global->getIMU()->saveCalibration(); + break; + } + + case 4: //Reset + { + global->getIMU()->loadCalibration(); + break; + } + + } + } + else if(e == LV_EVENT_VALUE_CHANGED) + { + lv_settings_item_t * act_item = (lv_settings_item_t *)lv_event_get_data(); + switch(act_item->id) + { + case 2: //Auto + { + global->getIMU()->setAutoMag(act_item->state); + updateIMUSettings(); + lv_settings_refr(act_item); + break; + } + } + + } +} + +void cLVGLScreenMainMenu::networkMenuEvent(lv_settings_item_t * act_item, lv_obj_t * obj, lv_event_t e) +{ + if(e == LV_EVENT_REFRESH) + { + m_isMainPage = false; + updateNetworkSettings(); + for(uint32_t i = 0; m_networkMenuItems[i].type != LV_SETTINGS_TYPE_INV; i++) { + lv_settings_add(&m_networkMenuItems[i]); + } + } + else if(e == LV_EVENT_CLICKED) { + lv_settings_item_t * act_item = (lv_settings_item_t *)lv_event_get_data(); + switch(act_item->id) + { + case 20: //Save + { + global->getNetworkConfig().saveConfig(NET_CONFIG_FILENAME); + break; + } + } + } + else if(e == LV_EVENT_VALUE_CHANGED) { + lv_settings_item_t * act_item = (lv_settings_item_t *)lv_event_get_data(); + switch(act_item->id) + { + case 1: //Frequency + { + if(act_item->state>9300) + act_item->state=9300; + else + if(act_item->state<8800) + act_item->state=8800; + global->getNetworkConfig().channelConfig.freq = act_item->state/10.0; + updateNetworkSettings(); + break; + } + case 2: //BW + { + switch(act_item->state) + { + case 0: + { + global->getNetworkConfig().channelConfig.bw = 500.0; + break; + } + case 1: + { + global->getNetworkConfig().channelConfig.bw = 250.0; + break; + } + } + updateNetworkSettings(); + break; + } + case 3: //SF + { + if(act_item->state>10) + act_item->state=10; + else + if(act_item->state<7) + act_item->state=7; + global->getNetworkConfig().channelConfig.sf = act_item->state; + updateNetworkSettings(); + break; + } + + case 4: //CR + { + if(act_item->state>8) + act_item->state=8; + else + if(act_item->state<5) + act_item->state=5; + global->getNetworkConfig().channelConfig.cr = act_item->state; + updateNetworkSettings(); + break; + } + + case 5: //Preamble + { + if(act_item->state>16) + act_item->state=16; + else + if(act_item->state<4) + act_item->state=4; + global->getNetworkConfig().channelConfig.preambleLength = act_item->state; + updateNetworkSettings(); + break; + } + + case 6: //Sync + { + if(act_item->state>255) + act_item->state=255; + else + if(act_item->state<1) + act_item->state=1; + global->getNetworkConfig().channelConfig.syncWord = act_item->state; + updateNetworkSettings(); + break; + } + + case 10: //ID + { + if(act_item->state<0) + act_item->state=0; + if(act_item->state>=128) + act_item->state=127; + global->getNetworkConfig().networkId = act_item->state; + updateNetworkSettings(); + break; + } + + case 11: //Password + { + global->getNetworkConfig().password = act_item->value; + updateNetworkSettings(); + break; + } + } + } +} + +void cLVGLScreenMainMenu::userMenuEvent(lv_settings_item_t * act_item, lv_obj_t * obj, lv_event_t e) +{ + if(e == LV_EVENT_REFRESH) + { + m_isMainPage = false; + updateUserSettings(); + for(uint32_t i = 0; m_userMenuItems[i].type != LV_SETTINGS_TYPE_INV; i++) { + lv_settings_add(&m_userMenuItems[i]); + } + } + else if(e == LV_EVENT_VALUE_CHANGED) { + lv_settings_item_t * act_item = (lv_settings_item_t *)lv_event_get_data(); + switch(act_item->id) + { + case 1: //Name + { + global->getConfig().name = act_item->value; + updateUserSettings(); + break; + } + case 2: //Symbol + { + int len = strnlen(act_item->value,act_item->param1); + if(len>0) + { + if(global->getConfig().symbol!=act_item->value[len-1]) + { + global->getConfig().symbol = act_item->value[len-1]; + } + else + if(len==1) + break; + } + updateUserSettings(); + lv_settings_refr(act_item); + break; + } + case 3: //ID + { + if(act_item->state<1) + act_item->state=1; + if(act_item->state>=128) + act_item->state=127; + global->getConfig().id = act_item->state; + updateUserSettings(); + break; + } + } + } +} + +#define LVGL_HOFFSET 40 +#define LVGL_VOFFSET 14 +#define LVGL_HPAD 10 +#define LVGL_VPAD 6 + +void cLVGLScreenIMUCalibration::internalInit() +{ + int16_t width = LV_HOR_RES_MAX - LVGL_HOFFSET * 2; + int16_t height = LV_VER_RES_MAX - LVGL_VOFFSET * 2; + + m_updateTime = millis(); + createRoots(); + lv_group_remove_all_objs(m_owner->getKeypadGroup()); + lv_obj_t* mainPage = lv_cont_create(lv_scr_act(), NULL); + m_root = mainPage; + lv_obj_set_pos(mainPage, LVGL_HOFFSET, LVGL_VOFFSET); + lv_obj_set_size(mainPage, width,height); + + width = lv_obj_get_width(mainPage)-LVGL_HPAD * 2; + height = lv_obj_get_height(mainPage) - LVGL_VPAD * 2; + + lv_style_init(&text48Style); + lv_style_set_text_font(&text48Style, LV_STATE_DEFAULT, &lv_font_montserrat_48); + + lv_style_init(&text16Style); + lv_style_set_text_font(&text16Style, LV_STATE_DEFAULT, &lv_font_montserrat_16); + + lv_style_init(&text14Style); + lv_style_set_text_font(&text14Style, LV_STATE_DEFAULT, &lv_font_montserrat_14); + + lv_obj_t* captionLabel = lv_label_create(mainPage, NULL); + lv_label_set_text(captionLabel, "Magnetometer Calibration"); + lv_label_set_align(captionLabel, LV_LABEL_ALIGN_CENTER); + lv_obj_add_style(captionLabel, 0, &text16Style); + lv_obj_align(captionLabel, mainPage, LV_ALIGN_IN_TOP_MID,0, LVGL_VPAD); + + m_axisX = lv_mcal_axis_create(mainPage); + lv_obj_set_pos(m_axisX.page, 4, LVGL_VPAD + 20); + + m_axisY = lv_mcal_axis_create(mainPage); + lv_obj_set_pos(m_axisY.page, 80, LVGL_VPAD + 20); + + m_axisZ = lv_mcal_axis_create(mainPage); + lv_obj_set_pos(m_axisZ.page, 156, LVGL_VPAD + 20); + +// lv_obj_t* s90Button = lv_button_create(mainPage, "90°"); +// lv_obj_set_pos(s90Button, 20, 100); +// lv_obj_set_size(s90Button, 60, 26); + + m_autoButton = lv_button_create(mainPage, "Auto"); + lv_btn_set_checkable(m_autoButton, true); + lv_obj_set_pos(m_autoButton, 90, 100); + lv_obj_set_size(m_autoButton, 60, 26); + setEventHandler(m_autoButton); + +// lv_obj_t* s0Button = lv_button_create(mainPage, "0°"); +// lv_obj_set_pos(s0Button, 160, 100); +// lv_obj_set_size(s0Button, 60, 26); + + lv_obj_t* o = lv_cont_create(mainPage, NULL); + lv_obj_set_pos(o, LVGL_HPAD, 130); + lv_obj_set_size(o, width, 76); + + m_headingLabel = lv_label_create(o, NULL); + lv_label_set_text(m_headingLabel, "000°"); + lv_obj_add_style(m_headingLabel, 0, &text48Style); + lv_obj_align(m_headingLabel, o, LV_ALIGN_CENTER, 0, 0); + updateIMU(); +} + +void cLVGLScreenIMUCalibration::internalDeinit() +{ + lv_obj_del(m_scr); + m_scr = NULL; +} + +lv_obj_t* cLVGLScreenIMUCalibration::lv_button_create(lv_obj_t* parent, const char* caption) +{ + lv_obj_t* result = lv_btn_create(parent, NULL); + lv_btn_set_fit(result, LV_FIT_NONE); + lv_obj_t* label = lv_label_create(result, NULL); + lv_label_set_text(label, caption); + lv_obj_add_style(label, 0, &text14Style); + lv_obj_align(label, result, LV_ALIGN_CENTER, 0, 0); + lv_group_add_obj(m_owner->getKeypadGroup(),result); + + return result; +} +lv_mcal_axis_s cLVGLScreenIMUCalibration::lv_mcal_axis_create(lv_obj_t* parent) +{ + lv_obj_t* axisPage = lv_cont_create(parent, NULL); + lv_obj_set_size(axisPage, 80, 65); + + lv_obj_t* axislabel = lv_label_create(axisPage, NULL); + lv_label_set_text(axislabel, "-00.00"); + lv_obj_align(axislabel, axisPage, LV_ALIGN_IN_TOP_MID, 0, 5); + + lv_obj_t* axisPBtn = lv_btn_create(axisPage, NULL); + lv_obj_set_pos(axisPBtn, 6, 30); + lv_obj_set_size(axisPBtn, 30, 26); + lv_btn_set_fit(axisPBtn, LV_FIT_NONE); + setEventHandler(axisPBtn); + lv_obj_t* label = lv_label_create(axisPBtn, NULL); + lv_label_set_text(label, "+"); + lv_obj_add_style(label, 0, &text14Style); + lv_obj_align(label, axisPBtn, LV_ALIGN_CENTER, 0, 0); + lv_group_add_obj(m_owner->getKeypadGroup(),axisPBtn); + + lv_obj_t* axisMBtn = lv_btn_create(axisPage, NULL); + lv_obj_set_pos(axisMBtn, 42, 30); + lv_obj_set_size(axisMBtn, 30, 26); + lv_btn_set_fit(axisMBtn, LV_FIT_NONE); + lv_obj_set_user_data(axisMBtn,this); + setEventHandler(axisMBtn); + label = lv_label_create(axisMBtn, NULL); + lv_label_set_text(label, "-"); + lv_obj_add_style(label, 0, &text14Style); + lv_obj_align(label, axisMBtn, LV_ALIGN_CENTER, 0, 0); + lv_group_add_obj(m_owner->getKeypadGroup(),axisMBtn); + + lv_mcal_axis_s result; + result.page = axisPage; + result.label = axislabel; + result.btnP = axisPBtn; + result.btnM = axisMBtn; + return result; +} + + +void cLVGLScreenIMUCalibration::updateIMU() +{ + if(global->m_imuStatus) + { + char buffer[32]; + snprintf(buffer,sizeof(buffer),"%d°",(int)(global->m_imuStatus->getHeading()/100+global->m_gpsStatus->getMagDec())); + lv_label_set_text(m_headingLabel,buffer); + lv_obj_align(m_headingLabel, lv_obj_get_parent(m_headingLabel), LV_ALIGN_CENTER, 0, 0); + + global->getIMU()->updateCalibration(); + sIMUCalibration &calibration = global->getIMU()->getCalibration(); + snprintf(buffer,sizeof(buffer),"X: %0.2f",calibration.magBiasX); + lv_label_set_text(m_axisX.label,buffer); + lv_obj_align(m_axisX.label, lv_obj_get_parent(m_axisX.label), LV_ALIGN_IN_TOP_MID, 0, 5); + + snprintf(buffer,sizeof(buffer),"Y: %0.2f",calibration.magBiasY); + lv_label_set_text(m_axisY.label,buffer); + lv_obj_align(m_axisY.label, lv_obj_get_parent(m_axisY.label), LV_ALIGN_IN_TOP_MID, 0, 5); + + snprintf(buffer,sizeof(buffer),"Z: %0.2f",calibration.magBiasZ); + lv_label_set_text(m_axisZ.label,buffer); + lv_obj_align(m_axisZ.label, lv_obj_get_parent(m_axisZ.label), LV_ALIGN_IN_TOP_MID, 0, 5); + + if(global->getIMU()->getAutoMag()) + lv_obj_add_state(m_autoButton, LV_STATE_CHECKED); + else + lv_obj_clear_state(m_autoButton, LV_STATE_CHECKED); + } +} + +void cLVGLScreenIMUCalibration::loop() +{ + if((millis()-m_updateTime)>=150) + { + updateIMU(); + m_updateTime = millis(); + } +} + +#define MAG_ADJ_VAL 0.1 + +void cLVGLScreenIMUCalibration::lvIScreenEvent(struct _lv_obj_t * obj, lv_event_t event) +{ + switch(event) + { + case LV_EVENT_CLICKED: + { + if(obj==m_autoButton) + { + global->getIMU()->setAutoMag(lv_obj_get_state(m_autoButton,LV_OBJ_PART_MAIN) & LV_STATE_CHECKED); + } + else + if(obj==m_axisX.btnM) + { + global->getIMU()->adjustMagCalibrationBias(-MAG_ADJ_VAL,0); + } + else + if(obj==m_axisX.btnP) + { + global->getIMU()->adjustMagCalibrationBias(MAG_ADJ_VAL,0); + } + else + if(obj==m_axisY.btnM) + { + global->getIMU()->adjustMagCalibrationBias(-MAG_ADJ_VAL,1); + } + else + if(obj==m_axisY.btnP) + { + global->getIMU()->adjustMagCalibrationBias(MAG_ADJ_VAL,1); + } + else + if(obj==m_axisZ.btnM) + { + global->getIMU()->adjustMagCalibrationBias(-MAG_ADJ_VAL,2); + } + else + if(obj==m_axisZ.btnP) + { + global->getIMU()->adjustMagCalibrationBias(MAG_ADJ_VAL,2); + } + updateIMU(); + break; + } + } +} + +void cLVGLScreenMainMenu::updateTimersSettings() +{ + atMainConfig &c = global->getConfig(); + for(int i=0; igetNetworkConfig(); + m_networkMenuItems[0].state = nc.channelConfig.freq*10; + snprintf(nmFrequency,sizeof(nmFrequency),"%03.1f Mhz",m_networkMenuItems[0].state/10.0); + m_networkMenuItems[1].state = 0; + if(nc.channelConfig.bw==250) + m_networkMenuItems[1].state = 1; + + m_networkMenuItems[2].state = nc.channelConfig.sf; + snprintf(nmSF,sizeof(nmSF),"%d",nc.channelConfig.sf); + + m_networkMenuItems[3].state = nc.channelConfig.cr; + snprintf(nmCR,sizeof(nmCR),"%d",nc.channelConfig.cr); + + m_networkMenuItems[4].state = nc.channelConfig.preambleLength; + snprintf(nmPreamble,sizeof(nmPreamble),"%d",nc.channelConfig.preambleLength); + + m_networkMenuItems[5].state = nc.channelConfig.syncWord; + snprintf(nmSync,sizeof(nmSync),"0x%0X",nc.channelConfig.syncWord); + + m_networkMenuItems[6].state = nc.networkId; + snprintf(nmNetworkId,sizeof(nmNetworkId),"%d",nc.networkId); + + snprintf(nmPassword,sizeof(nmPassword),"%s",nc.password.c_str()); +} + + +void cLVGLScreenMainMenu::updateUserSettings() +{ + atMainConfig &c = global->getConfig(); + snprintf(nmName,sizeof(nmName),"%s",c.name.c_str()); + snprintf(nmSymbol,sizeof(nmSymbol),"%c",c.symbol); + m_userMenuItems[1].state = c.id; + snprintf(nmUserId,sizeof(nmUserId),"%d",c.id); +} + +void cLVGLScreenMainMenu::timersMenuEvent(lv_settings_item_t * act_item, lv_obj_t * obj, lv_event_t e) +{ + if(e == LV_EVENT_REFRESH) + { + m_isMainPage = false; + updateTimersSettings(); + for(uint32_t i = 0; m_timersSettings[i].type != LV_SETTINGS_TYPE_INV; i++) { + lv_settings_add(&m_timersSettings[i]); + } + } + else if(e == LV_EVENT_VALUE_CHANGED) { + lv_settings_item_t * act_item = (lv_settings_item_t *)lv_event_get_data(); + if(act_item->idstate<0) + act_item->state = 0; + global->getConfig().timers[act_item->id] = act_item->state*1000; + updateTimersSettings(); + } + } +} diff --git a/src/atScreenLVGL.h b/src/atScreenLVGL.h new file mode 100644 index 0000000..fff5f38 --- /dev/null +++ b/src/atScreenLVGL.h @@ -0,0 +1,62 @@ +#pragma once +#include "atscreen.h" +#include +#include "lvgl_mem.h" + +#define LVS_NULL 0 +#define LVS_MAINMENU 1 +#define LVS_IMUCAL 2 + +#define LVS_MAX 2 + +class cATScreenLVGL; +class cLVGLScreen +{ +friend cATScreenLVGL; +protected: + cATScreenLVGL *m_owner; + lv_obj_t *m_scr; + lv_obj_t *m_mainCont; + lv_obj_t *m_leftCont; + lv_obj_t *m_rightCont; + lv_style_t m_styleCont; + + bool m_initialized; + virtual void createRoots(); + virtual void internalInit() = 0; + virtual void internalDeinit() = 0; + void setEventHandler(lv_obj_t *obj); +public: + cLVGLScreen(cATScreenLVGL *owner); + virtual ~cLVGLScreen(); + virtual void init(); + virtual void deinit(); + virtual void back()=0; + virtual bool isMainPage()=0; + virtual void loop(){}; + virtual void lvIScreenEvent(struct _lv_obj_t * obj, lv_event_t event) {} +}; + +class cATScreenLVGL:public cATScreen +{ +friend cLVGLScreen; +protected: + uint8_t m_lvState; + lv_disp_buf_t m_display_buffer; + cLVGLScreen *m_screen; + lv_group_t *m_keypadGroup; + cLVGLScreen *m_screens[LVS_MAX]; + + virtual cLVGLScreen * createScreen(uint8_t lvState); + public: + cATScreenLVGL(atGlobal &global); + virtual ~cATScreenLVGL(); + + virtual bool init(); + virtual void showMenu(); + virtual void loop(); + virtual void setScreenState(uint8_t value); + virtual void processEvent(uint8_t event, uint32_t param1, uint32_t param2); + virtual void setLVGLScreen(uint8_t value); + lv_group_t *getKeypadGroup() { return m_keypadGroup; } +}; diff --git a/src/atble.cpp b/src/atble.cpp new file mode 100644 index 0000000..55fd7a1 --- /dev/null +++ b/src/atble.cpp @@ -0,0 +1,596 @@ +#include "atble.h" +#include "BLEDevice.h" +#include "global.h" +#include + +static BLEUUID adcServiceUUID(SERVICE_UUID_ADC); +static BLEUUID adcCharasteristicUUID(CHARACTERISTIC_UUID_ADC_POSITION_REPORT); + +#define PROFILE_A_APP_ID 0 + +atBLE *bleDevice = NULL; + +#define BS_IDLE 0 +#define BS_SCANING 1 +#define BS_CONNECTING 2 +#define BS_CONNECTING2 3 +#define BS_DISCOVER_SERVICES 4 +#define BS_CONNECTED 5 +#define BS_DICONNECTED 100 +#define BS_ERROR 101 + +#ifndef AD_BLE_NO_CLIENT +static void _gattc_profile_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param) +{ + if(bleDevice) + bleDevice->gattc_profile_event_handler(event,gattc_if,param); +}; + +void atBLE::gattc_profile_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param) +{ + m_lock.lock(); + esp_ble_gattc_cb_param_t *p_data = (esp_ble_gattc_cb_param_t *)param; + switch (event) { + case ESP_GATTC_REG_EVT: + { +// DEBUG_MSG("REG_EVT\n"); + static esp_ble_scan_params_t ble_scan_params = { + .scan_type = BLE_SCAN_TYPE_ACTIVE, + .own_addr_type = BLE_ADDR_TYPE_PUBLIC, + .scan_filter_policy = BLE_SCAN_FILTER_ALLOW_ALL, + .scan_interval = 0x4000, + .scan_window = 312, + .scan_duplicate = BLE_SCAN_DUPLICATE_DISABLE + }; + esp_err_t scan_ret = esp_ble_gap_set_scan_params(&ble_scan_params); + if (scan_ret){ + DEBUG_MSG("set scan params error, error code = %x\n", scan_ret); + } + break; + } + case ESP_GATTC_CONNECT_EVT:{ + if(m_bleState==BS_CONNECTING) + { + //DEBUG_MSG("ESP_GATTC_CONNECT_EVT conn_id %d, if %d\n", p_data->connect.conn_id, gattc_if); + m_glProfileTab[PROFILE_A_APP_ID].conn_id = p_data->connect.conn_id; + memcpy(m_glProfileTab[PROFILE_A_APP_ID].remote_bda, p_data->connect.remote_bda, sizeof(esp_bd_addr_t)); + esp_err_t mtu_ret = esp_ble_gattc_send_mtu_req (gattc_if, p_data->connect.conn_id); + if (mtu_ret){ + DEBUG_MSG("config MTU error, error code = %x\n", mtu_ret); + } + m_bleState = BS_CONNECTING2; + } + break; + } + + case ESP_GATTC_CFG_MTU_EVT: + { + //DEBUG_MSG("ESP_GATTC_CFG_MTU_EVT\n"); + if(m_bleState==BS_CONNECTING2) + { + m_bleState = BS_DISCOVER_SERVICES; + esp_ble_gattc_search_service(gattc_if, param->open.conn_id, adcServiceUUID.getNative()); + } + else + DEBUG_MSG("BLE Wrong State\n"); + break; + } + + case ESP_GATTC_OPEN_EVT: + if(m_bleState==BS_CONNECTING2) + { + if (param->open.status != ESP_GATT_OK){ + DEBUG_MSG("open failed, status %d\n", p_data->open.status); + m_bleState = BS_ERROR; + break; + } + //DEBUG_MSG("open success\n"); + } + break; + + case ESP_GATTC_SEARCH_RES_EVT: { + //DEBUG_MSG("SEARCH RES: conn_id = %x is primary service %d\n", p_data->search_res.conn_id, p_data->search_res.is_primary); + //DEBUG_MSG("start handle %d end handle %d current handle value %d\n", p_data->search_res.start_handle, p_data->search_res.end_handle, p_data->search_res.srvc_id.inst_id); + BLEUUID remoteService(p_data->search_res.srvc_id); + if (remoteService.equals(adcServiceUUID)) { + //DEBUG_MSG("service found\n"); + m_hasServer = true; + m_glProfileTab[PROFILE_A_APP_ID].service_start_handle = p_data->search_res.start_handle; + m_glProfileTab[PROFILE_A_APP_ID].service_end_handle = p_data->search_res.end_handle; + } + break; + } + + case ESP_GATTC_SEARCH_CMPL_EVT: + { + if (p_data->search_cmpl.status != ESP_GATT_OK){ + DEBUG_MSG("search service failed, error status = %x\n", p_data->search_cmpl.status); + m_bleState = BS_ERROR; + break; + } + if (m_hasServer){ + uint16_t count = 0; + esp_gatt_status_t status = esp_ble_gattc_get_attr_count( gattc_if, + p_data->search_cmpl.conn_id, + ESP_GATT_DB_CHARACTERISTIC, + m_glProfileTab[PROFILE_A_APP_ID].service_start_handle, + m_glProfileTab[PROFILE_A_APP_ID].service_end_handle, + 0, + &count); + if (status != ESP_GATT_OK){ + DEBUG_MSG("esp_ble_gattc_get_attr_count error\n"); + } + + if (count > 0) + { + esp_gattc_char_elem_t *char_elem_result = (esp_gattc_char_elem_t *)malloc(sizeof(esp_gattc_char_elem_t) * count); + if (char_elem_result) + { + status = esp_ble_gattc_get_char_by_uuid( gattc_if, + p_data->search_cmpl.conn_id, + m_glProfileTab[PROFILE_A_APP_ID].service_start_handle, + m_glProfileTab[PROFILE_A_APP_ID].service_end_handle, + *adcCharasteristicUUID.getNative(), + char_elem_result, + &count); + if (status != ESP_GATT_OK){ + DEBUG_MSG("esp_ble_gattc_get_char_by_uuid error\n"); + } + + if(count>0) + { + m_glProfileTab[PROFILE_A_APP_ID].char_handle = char_elem_result[0].char_handle; + if (char_elem_result[0].properties & ESP_GATT_CHAR_PROP_BIT_NOTIFY){ + esp_ble_gattc_register_for_notify(gattc_if, m_glProfileTab[PROFILE_A_APP_ID].remote_bda, char_elem_result[0].char_handle); + } + m_bleState = BS_CONNECTED; + } + else + { + m_bleState = BS_ERROR; + } + free(char_elem_result); + } + else + m_bleState = BS_ERROR; + }else{ + DEBUG_MSG("no char found\n"); + m_bleState = BS_ERROR; + } + } + break; + } + + case ESP_GATTC_WRITE_DESCR_EVT: + { + if (p_data->write.status != ESP_GATT_OK){ + DEBUG_MSG("write descr failed, error status = %x\n", p_data->write.status); + break; + } + //DEBUG_MSG("write descr success\n"); + uint8_t write_char_data[35]; + for (int i = 0; i < sizeof(write_char_data); ++i) + { + write_char_data[i] = i % 256; + } + esp_ble_gattc_write_char( gattc_if, + m_glProfileTab[PROFILE_A_APP_ID].conn_id, + m_glProfileTab[PROFILE_A_APP_ID].char_handle, + sizeof(write_char_data), + write_char_data, + ESP_GATT_WRITE_TYPE_RSP, + ESP_GATT_AUTH_REQ_NONE); + break; + } + + case ESP_GATTC_REG_FOR_NOTIFY_EVT: + { + //DEBUG_MSG("ESP_GATTC_REG_FOR_NOTIFY_EVT\n"); + if (p_data->reg_for_notify.status != ESP_GATT_OK){ + DEBUG_MSG("REG FOR NOTIFY failed: error status = %d\n", p_data->reg_for_notify.status); + }else{ + uint16_t count = 0; + uint16_t notify_en = 1; + esp_gatt_status_t ret_status = esp_ble_gattc_get_attr_count( gattc_if, + m_glProfileTab[PROFILE_A_APP_ID].conn_id, + ESP_GATT_DB_DESCRIPTOR, + m_glProfileTab[PROFILE_A_APP_ID].service_start_handle, + m_glProfileTab[PROFILE_A_APP_ID].service_end_handle, + m_glProfileTab[PROFILE_A_APP_ID].char_handle, + &count); + if (ret_status != ESP_GATT_OK){ + DEBUG_MSG("esp_ble_gattc_get_attr_count error\n"); + } + if (count > 0){ + esp_gattc_descr_elem_t *descr_elem_result = (esp_gattc_descr_elem_t *)malloc(sizeof(esp_gattc_descr_elem_t) * count); + if (descr_elem_result) + { + esp_bt_uuid_t notify_descr_uuid = { + .len = ESP_UUID_LEN_16, + .uuid = {.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG,}, + }; + ret_status = esp_ble_gattc_get_descr_by_char_handle( gattc_if, + m_glProfileTab[PROFILE_A_APP_ID].conn_id, + p_data->reg_for_notify.handle, + notify_descr_uuid, + descr_elem_result, + &count); + if (ret_status != ESP_GATT_OK){ + DEBUG_MSG("esp_ble_gattc_get_descr_by_char_handle error\n"); + } + if (count > 0 && descr_elem_result[0].uuid.len == ESP_UUID_LEN_16 && descr_elem_result[0].uuid.uuid.uuid16 == ESP_GATT_UUID_CHAR_CLIENT_CONFIG){ + esp_err_t errRc = esp_ble_gattc_write_char_descr( gattc_if, + m_glProfileTab[PROFILE_A_APP_ID].conn_id, + descr_elem_result[0].handle, + sizeof(notify_en), + (uint8_t *)¬ify_en, + ESP_GATT_WRITE_TYPE_RSP, + ESP_GATT_AUTH_REQ_NONE); + if (errRc != ESP_OK) + DEBUG_MSG("esp_ble_gattc_write_char_descr error\n"); + } + free(descr_elem_result); + } + } + else{ + DEBUG_MSG("decsr not found\n"); + } + } + break; + } + + case ESP_GATTC_NOTIFY_EVT: + { + //DEBUG_MSG("ESP_GATTC_NOTIFY_EVT LEN %d\n", (int)p_data->notify.value_len); + if (p_data->notify.handle != m_glProfileTab[PROFILE_A_APP_ID].char_handle) break; + m_newDataAvailable = true; + m_data.resize(param->notify.value_len); + memcpy(m_data.data(), param->notify.value, param->notify.value_len); + break; + } + + case ESP_GATTC_READ_CHAR_EVT: + { + //DEBUG_MSG("ESP_GATTC_READ_CHAR_EVT %d %d\n",p_data->read.status,param->read.value_len); + if (p_data->read.handle != m_glProfileTab[PROFILE_A_APP_ID].char_handle) break; + + // At this point, we have determined that the event is for us, so now we save the value + // and unlock the semaphore to ensure that the requestor of the data can continue. + if (p_data->read.status == ESP_GATT_OK) { + m_lastReadRequest = 0; + m_data.resize(param->read.value_len); + memcpy(m_data.data(), param->read.value, param->read.value_len); + } + else + m_bleState = BS_ERROR; + break; + } + + + case ESP_GATTC_DISCONNECT_EVT: + if(p_data->disconnect.conn_id==m_glProfileTab[PROFILE_A_APP_ID].conn_id) + { + m_hasServer = false; + m_bleState = BS_DICONNECTED; + } + + //DEBUG_MSG("ESP_GATTC_DISCONNECT_EVT, reason = %d\n", p_data->disconnect.reason); + break; + + default: + break; + }; + m_lock.unlock(); +} +#endif + +static void _esp_gap_cb(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) +{ + if(bleDevice) + bleDevice->esp_gap_cb(event,param); +} +#ifndef AD_BLE_NO_CLIENT +static void _esp_gattc_cb(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param) +{ + if(bleDevice) + bleDevice->esp_gattc_cb(event,gattc_if,param); +} + +void atBLE::onDeviceFound(atBLEAdvertisedDevice &device) +{ + if (device.haveServiceUUID() && device.isAdvertisingService(adcServiceUUID)) + { + DEBUG_MSG("BLE device found. Connecting...\n"); + m_lastDeviceFound = millis(); + ::esp_ble_gap_stop_scanning(); + m_bleState = BS_CONNECTING; + esp_ble_gattc_open(m_glProfileTab[PROFILE_A_APP_ID].gattc_if, (uint8_t*) device.getAddress().getNative(), device.getAddressType(), true); + } +} +#endif +void atBLE::esp_gap_cb(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) +{ + m_lock.lock(); + switch (event) { +#ifndef AD_BLE_NO_CLIENT + case ESP_GAP_BLE_SCAN_RESULT_EVT: { + esp_ble_gap_cb_param_t *scan_result = (esp_ble_gap_cb_param_t *)param; + switch (scan_result->scan_rst.search_evt) { + case ESP_GAP_SEARCH_INQ_RES_EVT: + { + if(m_bleState == BS_SCANING) + { + BLEAddress advertisedAddress(param->scan_rst.bda); + atBLEAdvertisedDevice advertisedDevice; + advertisedDevice.setAddress(advertisedAddress); + advertisedDevice.setRSSI(scan_result->scan_rst.rssi); + advertisedDevice.setAdFlag(scan_result->scan_rst.flag); + advertisedDevice.parseAdvertisement((uint8_t*)scan_result->scan_rst.ble_adv, scan_result->scan_rst.adv_data_len + scan_result->scan_rst.scan_rsp_len); + advertisedDevice.setAddressType(scan_result->scan_rst.ble_addr_type); + + onDeviceFound(advertisedDevice); + } + break; + } + default: + break; + } + break; + } +#endif + default: + break; + } + m_lock.unlock(); +} +#ifndef AD_BLE_NO_CLIENT +void atBLE::esp_gattc_cb(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param) +{ + /* If event is register event, store the gattc_if for each profile */ + if (event == ESP_GATTC_REG_EVT) { + if (param->reg.status == ESP_GATT_OK) { + m_glProfileTab[param->reg.app_id].gattc_if = gattc_if; + } else { + DEBUG_MSG("reg app failed, app_id %04x, status %d\n", + param->reg.app_id, + param->reg.status); + return; + } + } + + /* If the gattc_if equal to profile A, call profile A cb handler, + * so here call each profile's callback */ + do { + int idx; + for (idx = 0; idx < PROFILE_NUM; idx++) { + if (gattc_if == ESP_GATT_IF_NONE || /* ESP_GATT_IF_NONE, not specify a certain gatt_if, need to call every profile cb function */ + gattc_if == m_glProfileTab[idx].gattc_if) { + if (m_glProfileTab[idx].gattc_cb) { + m_glProfileTab[idx].gattc_cb(event, gattc_if, param); + } + } + } + } while (0); +} +#endif + +atBLE::atBLE() +{ + m_enableScan = false; +#ifndef AD_BLE_NO_CLIENT + m_glProfileTab[PROFILE_A_APP_ID] = { + .gattc_cb = _gattc_profile_event_handler, + .gattc_if = ESP_GATT_IF_NONE, /* Not get the gatt_if, so initial is ESP_GATT_IF_NONE */ + }; +#endif +} + +void atBLE::begin(uint16_t poi) +{ + m_lastReadRequest = 0; + m_lastDeviceFound = 0; + m_lastDisconnect = 0; + m_hasServer = false; + m_bleState = BS_IDLE; + bleDevice = this; + m_lastUpdate = 0; + m_poi = poi; + esp_err_t ret; +/* + +#ifdef ARDUINO_ARCH_ESP32 + if (!btStart()) { + DEBUG_MSG("BLE Start failed\n"); + return; + } +#else + ret = ::nvs_flash_init(); + if (ret != ESP_OK) { + DEBUG_MSG("nvs_flash_init: rc=%d\n", ret); + return; + } + + esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); + ret = esp_bt_controller_init(&bt_cfg); + if (ret) { + DEBUG_MSG("%s initialize controller failed, error code = %x\n", __func__, ret); + return; + } + + ret = esp_bt_controller_enable(ESP_BT_MODE_BLE); + if (ret) { + DEBUG_MSG("%s enable controller failed, error code = %x\n", __func__, ret); + return; + } +#endif + ret = esp_bluedroid_init(); + if (ret) { + DEBUG_MSG("%s init bluetooth failed, error code = %x\n", __func__, ret); + return; + } + + ret = esp_bluedroid_enable(); + if (ret) { + DEBUG_MSG("%s enable bluetooth failed, error code = %x\n", __func__, ret); + return; + } + + //register the callback function to the gap module + ret = esp_ble_gap_register_callback(_esp_gap_cb); + if (ret){ + DEBUG_MSG("%s gap register failed, error code = %x\n", __func__, ret); + return; + } + + //register the callback function to the gattc module + ret = esp_ble_gattc_register_callback(_esp_gattc_cb); + if(ret){ + DEBUG_MSG("%s gattc register failed, error code = %x\n", __func__, ret); + return; + } +*/ + char bleName[32]; + snprintf(bleName,sizeof(bleName),"TTracker %0X (%s)",global->getConfig().id,global->getConfig().name.c_str()); + BLEDevice::init(bleName); + BLEDevice::setCustomGapHandler(_esp_gap_cb); +#ifndef AD_BLE_NO_CLIENT + BLEDevice::setCustomGattcHandler(_esp_gattc_cb); + ret = esp_ble_gattc_app_register(PROFILE_A_APP_ID); + if (ret){ + DEBUG_MSG("%s gattc app register failed, error code = %x\n", __func__, ret); + } +#endif + esp_err_t local_mtu_ret = esp_ble_gatt_set_local_mtu(500); + if (local_mtu_ret){ + DEBUG_MSG("set local MTU failed, error code = %x\n", local_mtu_ret); + } +} +#ifndef AD_BLE_NO_CLIENT +void atBLE::internalEnableScan() +{ + m_lock.lock(); + static esp_ble_scan_params_t ble_scan_params = { + .scan_type = BLE_SCAN_TYPE_ACTIVE, + .own_addr_type = BLE_ADDR_TYPE_PUBLIC, + .scan_filter_policy = BLE_SCAN_FILTER_ALLOW_ALL, + .scan_interval = 0x4000, + .scan_window = 312, + .scan_duplicate = BLE_SCAN_DUPLICATE_DISABLE + }; + esp_err_t scan_ret = esp_ble_gap_set_scan_params(&ble_scan_params); + if (scan_ret){ + DEBUG_MSG("set scan params error, error code = %x\n", scan_ret); + } + ::esp_ble_gap_start_scanning(0); + if(m_bleState == BS_IDLE) + m_bleState = BS_SCANING; + m_lock.unlock(); +} + +void atBLE::enableScan(bool en) +{ + if(m_enableScan!=en) + { + m_enableScan = en; + if(m_enableScan) + { + internalEnableScan(); + } + else + { + ::esp_ble_gap_stop_scanning(); + } + } +} +#endif + +void atBLE::loop() +{ +#ifndef AD_BLE_NO_CLIENT + m_lock.lock(); + + if(m_bleState==BS_IDLE && m_enableScan && (millis()-m_lastDisconnect)>5000) + { + m_bleState=BS_SCANING; + m_lock.unlock(); + internalEnableScan(); + m_lock.lock(); + } + + if(m_bleState==BS_DICONNECTED || m_bleState==BS_ERROR) + { + //DEBUG_MSG("BLE Deleting %d\n",m_bleState); + m_data.clear(); + m_lastReadRequest = 0; + m_lastDeviceFound = 0; + //global->removePOI(m_poi); + auto conn_id = m_glProfileTab[PROFILE_A_APP_ID].conn_id; + m_glProfileTab[PROFILE_A_APP_ID].conn_id = 0xFFFF; + m_lock.unlock(); + if(conn_id!=0xFFFF) + ::esp_ble_gattc_close(m_glProfileTab[PROFILE_A_APP_ID].gattc_if, conn_id); + m_lock.lock(); + delay(10); + m_bleState=BS_IDLE; + m_lastDisconnect = millis(); + } + else + if(m_bleState==BS_CONNECTED) + { + if(m_data.size()>0) + { + if(m_data.size()==sizeof(sADCPositionReport)) + { + m_lastUpdate = millis(); + m_newDataAvailable = false; + sADCPositionReport *report = (sADCPositionReport *)m_data.data(); + sPOI poi; + poi.lng = report->longitude; + poi.lat = report->latitude; + poi.alt = report->altitude; + poi.lastUpdate = (int64_t)millis() - ((int64_t)report->now - (int64_t) report->lastSeen); + //DEBUG_MSG("R %d %d %d\n",(int)poi.lastUpdate,(int)report->now,(int)report->lastSeen); + poi.RSSI = report->RSSI; + poi.SNR = report->SNR; + poi.updateXY(); + poi.name = report->status; + poi.symbol = 'D'; + poi.type = POIT_DYNAMIC; + poi.positionChanged = true; + poi.hacc = report->hacc; + global->setPOI(m_poi,poi); + } + m_data.clear(); + } + else + if(m_lastReadRequest==0 && (m_newDataAvailable || (millis()-m_lastUpdate)>5500)) + { + m_newDataAvailable = false; + m_lastUpdate = millis(); + m_lastReadRequest = millis(); + esp_err_t errRc = ::esp_ble_gattc_read_char( + m_glProfileTab[PROFILE_A_APP_ID].gattc_if, + m_glProfileTab[PROFILE_A_APP_ID].conn_id, + m_glProfileTab[PROFILE_A_APP_ID].char_handle, + ESP_GATT_AUTH_REQ_NONE); // Security + + if (errRc != ESP_OK) { + DEBUG_MSG("esp_ble_gattc_read_char: rc=%d\n", errRc); + } + } + if(m_lastReadRequest!=0 && (millis()-m_lastReadRequest)>5000) + { + m_bleState = BS_ERROR; + m_lastReadRequest = 0; + DEBUG_MSG("BLE read timeout\n"); + } + } + if(m_lastDeviceFound!=0 && m_bleStateBS_SCANING && (millis()-m_lastDeviceFound)>10000) + { + m_bleState = BS_ERROR; + m_lastDeviceFound = 0; + DEBUG_MSG("BLE connect timeout\n"); + } + m_lock.unlock(); +#endif +} \ No newline at end of file diff --git a/src/atble.h b/src/atble.h new file mode 100644 index 0000000..65f35e0 --- /dev/null +++ b/src/atble.h @@ -0,0 +1,64 @@ +#pragma once +#include + +#include +#include +#include +#include +#include "adcBLECommon.h" +#include "config.h" +#include "concurrency/Lock.h" +#include "esp_gap_ble_api.h" +#include "esp_gattc_api.h" +#include "esp_gatt_defs.h" +#include "esp_bt_main.h" +#include "esp_gatt_common_api.h" +#include "BLE/atBLEAdvertisedDevice.h" + +#define PROFILE_NUM 1 + +struct sGattcProfile { + esp_gattc_cb_t gattc_cb; + uint16_t gattc_if; + uint16_t app_id; + uint16_t conn_id; + uint16_t service_start_handle; + uint16_t service_end_handle; + uint16_t char_handle; + esp_bd_addr_t remote_bda; +}; + +class atBLE +{ +protected: + struct sGattcProfile m_glProfileTab[PROFILE_NUM]; + bool m_enableScan; + bool m_newDataAvailable; + uint16_t m_poi; + int64_t m_lastUpdate; + concurrency::Lock m_lock; + int m_bleState; + bool m_hasServer; + std::vector m_data; + int64_t m_lastDisconnect; + int64_t m_lastReadRequest; + int64_t m_lastDeviceFound; +#ifndef AD_BLE_NO_CLIENT + void internalEnableScan(); + void onDeviceFound(atBLEAdvertisedDevice &device); +#endif +public: + atBLE(); + void begin(uint16_t poi); +#ifndef AD_BLE_NO_CLIENT + void enableScan(bool en); + bool getEnableScan() { return m_enableScan; } +#endif + void loop(); + + void esp_gap_cb(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); +#ifndef AD_BLE_NO_CLIENT + void esp_gattc_cb(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param); + void gattc_profile_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param); +#endif +}; \ No newline at end of file diff --git a/src/atcommon.cpp b/src/atcommon.cpp new file mode 100644 index 0000000..f4ba2be --- /dev/null +++ b/src/atcommon.cpp @@ -0,0 +1,73 @@ +#include "atcommon.h" +#include +#include + +void convertDegreeToMeter(double lng, double lat, double &x,double &y) +{ + x = DEGREE_TO_METER_X(lng); + y = DEGREE_TO_METER_Y(lat); +} + +void convertMeterToDegree(double x, double y, double &lng,double &lat) +{ + lng = DEGREE_TO_METER_REVERSE_X(x); + lat = DEGREE_TO_METER_REVERSE_Y(y); +} + +double distanceXYBetween(double x1, double y1, double x2, double y2) +{ + return sqrt(pow(x2 - x1, 2) +pow(y2 - y1, 2)); +} + +double courseXYTo(double x1, double y1, double x2, double y2) +{ + double result = 270-degrees(atan2(y1 - y2, x1 - x2)); + if(result<0) + result += 360; + return result; +} + +double distanceBetween(double lat1, double long1, double lat2, double long2) +{ + // returns distance in meters between two positions, both specified + // as signed decimal-degrees latitude and longitude. Uses great-circle + // distance computation for hypothetical sphere of radius 6372795 meters. + // Because Earth is no exact sphere, rounding errors may be up to 0.5%. + // Courtesy of Maarten Lamers + double delta = radians(long1-long2); + double sdlong = sin(delta); + double cdlong = cos(delta); + lat1 = radians(lat1); + lat2 = radians(lat2); + double slat1 = sin(lat1); + double clat1 = cos(lat1); + double slat2 = sin(lat2); + double clat2 = cos(lat2); + delta = (clat1 * slat2) - (slat1 * clat2 * cdlong); + delta = sq(delta); + delta += sq(clat2 * sdlong); + delta = sqrt(delta); + double denom = (slat1 * slat2) + (clat1 * clat2 * cdlong); + delta = atan2(delta, denom); + return delta * 6372795; +} + +double courseTo(double lat1, double long1, double lat2, double long2) +{ + // returns course in degrees (North=0, West=270) from position 1 to position 2, + // both specified as signed decimal-degrees latitude and longitude. + // Because Earth is no exact sphere, calculated course may be off by a tiny fraction. + // Courtesy of Maarten Lamers + double dlon = radians(long2-long1); + lat1 = radians(lat1); + lat2 = radians(lat2); + double a1 = sin(dlon) * cos(lat2); + double a2 = sin(lat1) * cos(lat2) * cos(dlon); + a2 = cos(lat1) * sin(lat2) - a2; + a2 = atan2(a1, a2); + if (a2 < 0.0) + { + a2 += TWO_PI; + } + return degrees(a2); +} diff --git a/src/atcommon.h b/src/atcommon.h new file mode 100644 index 0000000..3ce7e92 --- /dev/null +++ b/src/atcommon.h @@ -0,0 +1,14 @@ +#pragma once + +#define Pi M_PI + +#define DEGREE_TO_METER_X(X) X*111319.490778 +#define DEGREE_TO_METER_Y(Y) (log(tan((90.0 + (Y)) * M_PI / 360.0)) / (M_PI / 180.0))*111319.490778 +#define DEGREE_TO_METER_REVERSE_Y(Y) (atan(pow(M_E, ((Y)/111319.490778)*M_PI/180.0))*360.0/M_PI-90.0) +#define DEGREE_TO_METER_REVERSE_X(X) X/111319.490778 +void convertDegreeToMeter(double lng, double lat, double &x,double &y); +void convertMeterToDegree(double x, double y, double &lng,double &lat); +double distanceXYBetween(double x1, double y1, double x2, double y2); +double courseXYTo(double x1, double y1, double x2, double y2); +double distanceBetween(double lat1, double long1, double lat2, double long2); +double courseTo(double lat1, double long1, double lat2, double long2); diff --git a/src/atglobal.cpp b/src/atglobal.cpp new file mode 100644 index 0000000..dd29b70 --- /dev/null +++ b/src/atglobal.cpp @@ -0,0 +1,417 @@ +#include "atglobal.h" +#include +#include +#include + + +struct PSRAMAllocator { + void* allocate(size_t size) { + return heap_caps_malloc(size,MALLOC_CAP_SPIRAM); + } + + void deallocate(void* ptr) { + heap_caps_free(ptr); + } + + void* reallocate(void* ptr, size_t new_size) { + return heap_caps_realloc(ptr, new_size,MALLOC_CAP_SPIRAM); + } +}; + +typedef BasicJsonDocument PSRAMJsonDocument; + +void atGlobal::onMapLoad(cMap *map) +{ + m_poiMapStatic.clear(); + if(map) + { + char fileName[32]; + std::string mapName = map->getMap().name; + for(auto& c : mapName) + { + c = tolower(c); + } + snprintf(fileName,sizeof(fileName),AT_POINTS_FILE_TEMPLATE,mapName.c_str()); + std::ifstream file(fileName,std::ifstream::binary); + if(file.good()) + { + DEBUG_MSG("Loading points from %s\n",fileName); + PSRAMJsonDocument json(64*1024); + DeserializationError error = deserializeJson(json,file); + if(!error) + { + const JsonVariant &points = json.getMember("points"); + for(int i=0; i(); + switch(_t==0) + { + case 0: + type = POIT_STATIC; + break; + default: + type = POIT_STATIC; + break; + } + color = json["color"].as(); + lat = json["coordinates"][1].as(); + lng = json["coordinates"][0].as(); + positionChanged = true; + return true; + } + return false; +} + +cConfig::cConfig() +{ +} + +bool cConfig::loadConfig(std::istream &stream,bool binary) +{ + try{ + StaticJsonDocument<1024> json; + DeserializationError error; + if(binary) + error = deserializeMsgPack(json,stream); + else + error = deserializeJson(json,stream); + if(error) + { + DEBUG_MSG("cConfig loading error %s\n",error.c_str()); + return false; + } + else + { + initDefaults(); + loadConfigValues(json); + } + }catch(...) + { + return false; + } + return true; +} + +void cConfig::saveConfig(std::ostream &stream,bool binary) +{ + StaticJsonDocument<1024> json; + saveConfigValues(json); + + try{ + if(binary) + serializeMsgPack(json,stream); + else + serializeJson(json,stream); + }catch(...) + { + } +} + + +void cConfig::loadConfig(const char * filename) +{ + try{ + std::ifstream file(filename,std::ifstream::binary); + if(!loadConfig(file)) + saveConfig(filename); + }catch(...) + { + saveConfig(filename); + } + if(checkConfig()) + saveConfig(filename); +} + +void cConfig::saveConfig(const char * filename) +{ + try{ + std::ofstream file(filename,std::ofstream::binary); + saveConfig(file); + }catch(...) + { + } +} + + +atMainConfig::atMainConfig() +{ + initDefaults(); +} + +void atMainConfig::initDefaults() +{ + symbol = 0; + id = MAX_CONFIG_ID; + radius = 250; + units = U_METRIC; + reportInterval = 500; + timeZone = DEFAULT_TZ; + screenIdleTimeout = 90000; + useVibration = true; + vibrationTime = 200; + maxPeerTimeout = 600; + memset(&timers,0,sizeof(timers)); + checkConfig(); +} + +bool atMainConfig::checkConfig() +{ + bool changed = false; + if(id==MAX_CONFIG_ID) + { + uint8_t mac[6]; + changed = true; + esp_read_mac(mac, ESP_MAC_BT); + id = mac[5]; + if(id==0) + id = rand() & 0xFF; + } + if(name.empty()) + { + changed = true; + char buffer[16]; + snprintf(buffer,sizeof(buffer),"Dev%02X",(int)id); + name = buffer; + } + if(reportInterval<200) + { + changed = true; + reportInterval = 500; + } + if(reportInterval>30000) + { + changed = true; + reportInterval = 30000; + } + if(timeZone.empty()) + { + changed = true; + timeZone = DEFAULT_TZ; + } + + if(screenIdleTimeout<10000 && screenIdleTimeout!=0) + { + screenIdleTimeout=10000; + changed = true; + } + + if(vibrationTime<50) + { + vibrationTime = 50; + changed = true; + } + else + if(vibrationTime>2000) + { + vibrationTime = 2000; + changed = true; + } + + if(maxPeerTimeout>86400) + { + maxPeerTimeout = 86400; + changed = true; + } + return changed; +} + +void atMainConfig::loadConfigValues(JsonDocument &json) +{ + const char * c = (const char*) json["tz"]; + testLat = json["testLat"]; + testLng = json["testLng"]; + id = json["id"]; + radius = json["radius"]; + symbol = json["symbol"]; + reportInterval = json["reportInterval"]; + screenIdleTimeout = json["screenIdleTimeout"]; + for(int i=0; i60000) + { + updateTimeout = 60000; + changed = true; + } + + return changed; +} + +void atAGDNetworkConfig::saveConfigValues(JsonDocument &json) +{ + json["freq"] = channelConfig.freq; + json["bw"] = channelConfig.bw; + json["sf"] = channelConfig.sf; + json["cr"] = channelConfig.cr; + json["preambleLength"] = channelConfig.preambleLength; + json["syncWord"] = channelConfig.syncWord; + json["updateTimeout"] = updateTimeout; +} + +void atAGDNetworkConfig::loadConfigValues(JsonDocument &json) +{ + channelConfig.freq = json["freq"]; + channelConfig.bw = json["bw"]; + channelConfig.sf = json["sf"]; + channelConfig.cr = json["cr"]; + channelConfig.preambleLength = json["preambleLength"]; + channelConfig.syncWord = json["syncWord"]; + updateTimeout = json["updateTimeout"]; +} + +atAGDNetworkConfig::atAGDNetworkConfig() +{ + initDefaults(); +} + +cSideButtons::cSideButtons() +{ + for(int i=0; i +#include +#include +#include +#include "power.h" +#include "GPSStatus.h" +#include "IMUStatus.h" +#include +#include "radio/LoraRadio.h" +#include "mapTiles.h" +#include "atstrings.h" +#include + +#define MAX_CONFIG_ID 0xFFFF +#define U_METRIC 0 +#define U_US 1 + +#define POIT_PEER 0 +#define POIT_STATIC 1 +#define POIT_DYNAMIC 2 +#define POIT_ENEMY 3 +#define POIT_SELF 10 + +#define POIS_NORMAL 0 +#define POIS_DEAD 1 + +struct sPOI +{ + bool positionChanged=false; + uint8_t type=POIT_PEER; + char symbol=0; + std::string name; + uint8_t status=0; + uint8_t options=0; + double lat=0; + double lng=0; + uint32_t hacc=0; + double x=0; + double y=0; + int32_t alt=0; + int16_t heading=0; + double distance=0; + double realDistance=0; + double courseTo=0; + double RSSI=0; + double SNR=0; + int32_t retransmitRating = 0; + int64_t lastUpdate=0; + uint8_t lastLabelIdx=0; + uint32_t color=0; + + sPOI() + { + } + + bool isValidLocation() const + { + return (lat != 0) && (lng != 0) && (lat <= 90 && lat >= -90); + } + + void updateXY() + { + if(isValidLocation()) + { + convertDegreeToMeter(lng,lat,x,y); + } + else + { + x = y = 0; + } + } + bool loadFromJson(const JsonVariant &json); +}; + +struct sSideButton +{ + uint8_t idx=0; + std::string caption; + uint8_t action=0; + uint8_t actionLong=0; +}; + +class cSideButtons +{ +protected: + sSideButton m_buttons[SIDE_BUTTONS_COUNT]; + +public: + cSideButtons(); + sSideButton *getButtons() + { + return m_buttons; + } + + uint8_t getButtonsCount() + { + return SIDE_BUTTONS_COUNT; + } +}; + +#define AT_MAX_TIMERS 4 +class cConfig +{ +protected: + virtual void initDefaults()=0; + virtual bool checkConfig()=0; + virtual void saveConfigValues(JsonDocument &json)=0; + virtual void loadConfigValues(JsonDocument &json)=0; +public: + cConfig(); + virtual bool loadConfig(std::istream &stream,bool binary=false); + virtual void saveConfig(std::ostream &stream,bool binary=false); + + virtual void loadConfig(const char * filename); + virtual void saveConfig(const char * filename); +}; + +class atMainConfig:public cConfig +{ +public: + uint16_t id; + std::string name; + char symbol; + uint16_t radius; + uint8_t units; + uint16_t reportInterval; + std::string timeZone; + uint32_t screenIdleTimeout; + bool useVibration; + uint32_t vibrationTime; + uint32_t maxPeerTimeout; + uint32_t timers[AT_MAX_TIMERS]; + int32_t testLat; + int32_t testLng; +protected: + virtual void initDefaults(); + virtual bool checkConfig(); + virtual void saveConfigValues(JsonDocument &json); + virtual void loadConfigValues(JsonDocument &json); +public: + atMainConfig(); +}; + +class atNetworkConfig:public cConfig +{ +public: + cLoraChannelCondfig channelConfig; + uint8_t networkId; + std::string password; + int32_t requestInfoInterval; +protected: + virtual void initDefaults(); + virtual bool checkConfig(); + virtual void saveConfigValues(JsonDocument &json); + virtual void loadConfigValues(JsonDocument &json); +public: + atNetworkConfig(); +}; + +class atAGDNetworkConfig:public cConfig +{ +public: + cLoraChannelCondfig channelConfig; + uint32_t updateTimeout; +protected: + virtual void initDefaults(); + virtual bool checkConfig(); + virtual void saveConfigValues(JsonDocument &json); + virtual void loadConfigValues(JsonDocument &json); +public: + atAGDNetworkConfig(); +}; +//Player Status +#define PS_NORMAL 0 +#define PS_DEAD 1 + +struct sPlayerStatus +{ + uint8_t status; + uint8_t options; + + sPlayerStatus() + { + status = PS_NORMAL; + options = 0; + } +}; + +typedef std::map cPOIMap; +typedef std::list cPOIList; +class cTimersChain; +class cTimer +{ +friend cTimersChain; +protected: + int32_t m_duration; + int64_t m_startTime; + int64_t m_pauseTime; + std::string m_name; +public: + cTimer():m_duration(0),m_startTime(0),m_pauseTime(0) + { + } + ~cTimer(){} + int32_t getDuration() { return m_duration; } + void setDuration(uint32_t value) { m_duration = value; } + std::string getName() { return m_name; } + void setName(const char *name) { m_name = name; } + bool isEnabled() { return m_duration>0; } + bool isStarted() { return m_startTime>0; } + bool isPaused() { return isStarted() && m_pauseTime>0; } + void start(int64_t now) { m_startTime = now; m_pauseTime = 0; } + void reset() { m_startTime = m_pauseTime = 0; } + void pause(int64_t now) { if(isStarted() && m_pauseTime==0) m_pauseTime = now; } + void resume(int64_t now) { + if(isPaused()) + { + m_startTime = now-(m_pauseTime-m_startTime); + m_pauseTime = 0; + } + } + int64_t getCurrentDuration(int64_t now) + { + if(isStarted()) + { + int64_t duration; + if(m_pauseTime>0) + duration = m_pauseTime-m_startTime; + else + duration = now-m_startTime; + if(duration>=m_duration) + return m_duration; + else + return duration; + } + else + return 0; + } + + bool isFinished(int64_t now) { + if(isStarted()) + return getCurrentDuration(now)>=m_duration; + else + return false; + } +}; + +typedef std::vector cTimersVector; +typedef std::map cTimersMap; + +class cTimersChain +{ +protected: + cTimersVector m_timers; + uint8_t m_currentIdx; + std::string m_name; + + void processTimers(int64_t now) + { + while(m_currentIdxisFinished(now)) + { + int64_t nowNew = m_timers[m_currentIdx]->m_startTime+m_timers[m_currentIdx]->m_duration; + m_currentIdx++; + if(m_currentIdxstart(nowNew); + } + } + else + break; + } + else + break; + } + } +public: + cTimersChain():m_currentIdx(0){}; + ~cTimersChain(){} + std::string getName() { return m_name; } + void setName(const char *name) { m_name = name; } + cTimersVector &getTimers() { return m_timers; } + void addTimer(cTimer* timer) { + m_timers.push_back(timer); + } + + bool isEnabled() + { + for(auto itr=m_timers.begin(); itr!=m_timers.end(); itr++) + if(!(*itr)->isEnabled()) + return false; + return m_timers.size(); + } + + bool isStarted() + { + if(m_currentIdxisStarted(); + } + return true; + } + + bool isPaused() + { + if(m_currentIdxisPaused(); + } + return false; + } + + void reset() + { + m_currentIdx = 0; + for(auto itr=m_timers.begin(); itr!=m_timers.end(); itr++) + (*itr)->reset(); + } + + void start(int64_t now) + { + reset(); + if(m_timers.size()) + m_timers.front()->start(now); + } + + void pause(int64_t now) + { + processTimers(now); + if(m_currentIdxpause(now); + } + } + + void resume(int64_t now) + { + if(m_currentIdxresume(now); + } + } + + bool isFinished(int64_t now) + { + processTimers(now); + return m_currentIdx>=m_timers.size(); + } + + void loop(int64_t now) + { + processTimers(now); + } + + uint8_t getCurrentIdx() { return m_currentIdx; } +}; + +typedef std::list cTimersChains; + +class atGlobal:public cMapProcessorCallbacks +{ +protected: + atMainConfig m_config; + atNetworkConfig m_networkConfig; + atAGDNetworkConfig m_agdNetworkConfig; + Power *m_power; + + virtual void initPower() + { + m_mapCenterX = m_mapCenterY = 0; + m_power = new Power(); + m_power->setup(); + m_power->setStatusHandler(m_powerStatus); + m_powerStatus->observe(&m_power->newStatus); + } + uint16_t m_lastPOIID; +public: + bool m_has_axp192; + bool m_has_oled; + PowerStatus *m_powerStatus; + GPSStatus *m_gpsStatus; + IMUStatus *m_imuStatus; + sPlayerStatus m_playerStatus; + cSideButtons m_sideButtons; + cMaps m_maps; + cMapProcessor m_mapsProcessor; + cPOIMap m_poiMap; + cPOIList m_poiMapStatic; + double m_mapCenterX,m_mapCenterY; + cTimersMap m_timers; + cTimersChains m_timersChains; + + atGlobal():m_mapsProcessor(m_maps.getMaps(),this) + { + m_lastPOIID = 0; + m_has_axp192 = m_has_oled = false; + m_powerStatus = new PowerStatus(); + m_power = NULL; + m_gpsStatus = new GPSStatus(); + m_imuStatus = new IMUStatus(); + m_config.loadConfig(MAIN_CONFIG_FILENAME); + m_networkConfig.loadConfig(NET_CONFIG_FILENAME); + m_agdNetworkConfig.loadConfig(AGD_NET_CONFIG_FILENAME); + for(int i=0; isetDuration(m_config.timers[i]); + snprintf(buf,sizeof(buf),"T%d",i+1); + m_timers[i]->setName(buf); + } + cTimersChain *tc = new cTimersChain(); + tc->setName("T1->T2"); + tc->addTimer(m_timers[0]); + tc->addTimer(m_timers[1]); + m_timersChains.push_back(tc); + +#ifndef AD_NOSCREEN + m_maps.loadFromBinary(SCREEN_FLASH_META_BINARY_FILE); +#endif + } + + virtual ~atGlobal() + { + delete m_imuStatus; + delete m_gpsStatus; + delete m_powerStatus; + if(m_power) + delete m_power; + } + + virtual void onMapLoad(cMap *map); + + void updateTimers() + { + for(int i=0; isetDuration(m_config.timers[i]); + } + } + + float getDirection() + { + return (18000-m_imuStatus->getHeading()+m_gpsStatus->getMagDec()*100)*PI/18000.0; + } + + float getDirectionDeg() + { + float result = m_imuStatus->getHeading()/100.0+m_gpsStatus->getMagDec(); + if(result<0) + result += 360; + if(result>=360) + result -= 360; + return result; + } + + uint16_t createPOI() + { + return ++m_lastPOIID; + } + + void setPOI(uint16_t id,const sPOI &poi) + { + m_poiMap[id] = poi; + } + + void removePOI(uint16_t id) + { + m_poiMap.erase(id); + } + + virtual void init() + { + initPower(); + } + + virtual void loop() + { + concurrency::periodicScheduler.loop(); + } + + Power *getPower() { + return m_power; + } + + atMainConfig &getConfig() + { + return m_config; + } + + atNetworkConfig &getNetworkConfig() + { + return m_networkConfig; + } + + virtual void onScreenStateChange(){}; + + void processTimers(int64_t now) + { + for(auto itr=m_timersChains.begin(); itr!= m_timersChains.end(); itr++) + (*itr)->loop(now); + } +}; diff --git a/src/atracker.cpp b/src/atracker.cpp new file mode 100644 index 0000000..0d0c58e --- /dev/null +++ b/src/atracker.cpp @@ -0,0 +1,1785 @@ +#include "atracker.h" +#include +#include +#include "radio/LoraDevRF95.h" +#include "radio/LoraDevSX1262.h" +#include "dwm1000/DW1000Ng.hpp" +#include "progCommon.h" +#ifdef USE_SCREEN_EVE +#include "atScreenEVE.h" +#else +#include "atscreendummy.h" +#endif +#include "agd/abcommon.h" + + +StaticEventGroup_t loraInterruptEventBuffer; +EventGroupHandle_t loraInterruptEvent = xEventGroupCreateStatic( &loraInterruptEventBuffer ); +void IRAM_ATTR loraRINT(void); + +#ifdef DEBUG_USAGE +class cCPUUsage +{ +protected: + int64_t m_periodStart; + int64_t m_idleStart; + int64_t m_workStart; + int64_t m_idleTime; + int64_t m_workTime; + int64_t m_workMaxTime; + float m_workUsage; + float m_idleUsage; + int m_usageCount; +public: + cCPUUsage() + { + m_workMaxTime = m_periodStart = m_idleStart = m_workStart = m_idleTime = m_workTime = 0; + m_workUsage = 0; + m_idleUsage = 0; + m_usageCount = 0; + } + + void periodStart() + { + m_periodStart = esp_timer_get_time(); + m_idleStart = m_workStart = m_idleTime = m_workTime = 0; + } + + void idleStart() + { + m_idleStart = esp_timer_get_time(); + } + + void idleStop() + { + m_idleTime += (esp_timer_get_time()-m_idleStart); + m_idleStart = 0; + } + + void workStart() + { + m_workStart = esp_timer_get_time(); + } + + void workStop() + { + int64_t workTime = (esp_timer_get_time()-m_workStart); + m_workTime += workTime; + if(m_workMaxTime0) + { + m_workUsage += 100*m_workTime/period; + m_idleUsage += 100*m_idleTime/period; + m_usageCount++; + if(m_usageCount>100) + { + DEBUG_MSG("%s work %0.1f%% (%0.2f ms), idle %0.1f%%\n",msg,m_workUsage/m_usageCount, m_workMaxTime/1000.0, m_idleUsage/m_usageCount); + m_usageCount = 0; + m_workUsage = m_idleUsage = 0; + m_workMaxTime = 0; + } + } + } + +}; +#endif + +void printHeap(const char *msg) +{ + multi_heap_info_t info; + heap_caps_get_info(&info, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); + + DEBUG_MSG("%sHeap: %u/%uKB/%uKB\n", msg, info.total_allocated_bytes / 1024, info.total_free_bytes / 1024, info.largest_free_block / 1024); +} + +cAirsoftTracker::cAirsoftTracker():m_loraPackets(20),m_loraPacketsToSend(20),m_screen(NULL),m_commands(100),m_networkProcessor(*this,this) +{ + m_core0Thread = NULL; + m_core0ThreadReady = false; + m_loraThread = NULL; + m_imu = NULL; + m_expander = NULL; + m_vmotor = NULL; + memset(m_buttonsTime,0,sizeof(m_buttonsTime)); + m_buttonsIdx[0] = BTN1_PIN; + m_buttonsIdx[1] = BTN2_PIN; + m_buttonsIdx[2] = BTN3_PIN; + m_buttonsIdx[3] = BTN4_PIN; + m_buttonsIdx[4] = BTN5_PIN; + m_buttonsIdx[5] = BTN6_PIN; +} + +void cAirsoftTracker::onScreenStateChange() +{ + updateSideButtons(); +} + +bool compare_poi_distance (const sPOI& first, const sPOI& second) +{ + return ( first.distance > second.distance ); +} + +int32_t tes = 0; +void cAirsoftTracker::mainLoop() +{ + int64_t now = millis(); + atGlobal::loop(); + int powerState = m_power->loop(); + if(powerState & 2) //Longpress + { + if(!m_displaySleep) + m_screen->showShutdownScreen(); + m_config.saveConfig(MAIN_CONFIG_FILENAME); + m_imu->shutdown(); + DEBUG_MSG("Backup GNSS database\n"); + m_gps.backupDatabase(GNSS_DBD_FILENAME); + delay(10); + m_gps.shutdown(); + delay(100); + DEBUG_MSG("Shutdown\n"); + m_power->shutdown(); + } + if(powerState & 1) + { + m_idleTimer = millis(); + } + if(isAGDUpdate()) + { + if((now-m_agdUpdateTimer)>=m_agdNetworkConfig.updateTimeout) + { + stopAGDUpdate(); + } + } + switch(m_screen->getScreenState()) + { + case SS_BOOT: + { + if(timing::millis() > 1000) + { + m_screen->closeBootScreen(); + m_screen->setScreenState(SS_MAIN); + } + break; + } + + case SS_MAIN: + { + m_screen->loop(); + if((now-m_screenTimer)>=50 && !m_displaySleep) + { + processTimers(now); + m_screenTimer = now; + updateDistances(); + m_screen->beginMainScreen(); + if(m_gpsStatus->getHasLock()) + { + int64_t now = millis(); + + int32_t poiCnt = 0; +/* + uint16_t radius = m_screen->getRadius(); + + for(auto itr=m_poiMapStatic.begin(); itr!=m_poiMapStatic.end(); itr++) + { + if(itr->isValidLocation() && itr->distance<=radius) + { + poiCnt++; + } + } +*/ + m_poiMapStatic.sort(compare_poi_distance); + + + for(auto itr=m_poiMapStatic.begin(); itr!=m_poiMapStatic.end(); itr++) + { + if(itr->isValidLocation()) + { + m_screen->drawPOI((*itr),m_poiMapStatic.size()-poiCnt); + } + poiCnt++; + } + + cPeers& peers = m_networkProcessor.getPeers(); + for(auto itr=peers.begin(); itr!=peers.end(); itr++) + { + if(itr->second.isValidLocation()) + { + if(m_config.maxPeerTimeout==0) + m_screen->drawPOI(itr->second); + else + { + int64_t delta = (now-itr->second.lastUpdate)/1000; + if(delta<=m_config.maxPeerTimeout) + m_screen->drawPOI(itr->second); + } + } + } + + for(auto itr=m_poiMap.begin(); itr!=m_poiMap.end(); itr++) + { + if(itr->second.isValidLocation()) + { + if(m_config.maxPeerTimeout==0) + m_screen->drawPOI(itr->second); + else + { + int64_t delta = (now-itr->second.lastUpdate)/1000; + if(delta<=m_config.maxPeerTimeout) + m_screen->drawPOI(itr->second); + } + + } + } + + if(m_mapCenterX!=0 && m_mapCenterY!=0) + { + sPOI self; + self.type = POIT_SELF; + self.status = (uint8_t)m_playerStatus.status; + self.lat = m_gpsStatus->getLatitude()*1e-7; + self.lng = m_gpsStatus->getLongitude()*1e-7; + self.x = m_gpsStatus->getX(); + self.y = m_gpsStatus->getY(); + self.name = "Me"; + self.symbol = 0; + + double lat; + double lng; + double x = m_mapCenterX; + double y = m_mapCenterY; + convertMeterToDegree(x,y,lng,lat); + + self.realDistance = distanceBetween(lat,lng,self.lat,self.lng); + self.distance = distanceXYBetween(x,y,self.x,self.y); + self.courseTo = courseXYTo(x,y,self.x,self.y); + self.hacc = m_gpsStatus->getHAcc()/100; + m_screen->drawPOI(self); + } + } + m_screen->drawTimers(m_sideButtonsState==ATSBS_TIMERS); + m_screen->endMainScreen(); + } + break; + } + + case SS_MENU: + { + if(!m_displaySleep) + { + m_screen->loop(); + if((now-m_screenTimer)>=50) + { + m_screenTimer = now; + m_screen->showMenu(); + } + } + break; + } + } + if(!m_displaySleep) + { + int32_t bk = map(m_ps,0,3000,2,255); + if(bk>255) + bk=255; + m_screen->setBacklight(bk); + } + if(!m_displaySleep && ((m_config.screenIdleTimeout>10000 && (now-m_idleTimer)>=m_config.screenIdleTimeout) || m_idleTimer==0)) + { + m_displaySleep = true; + m_screen->screenOff(); + } + if(m_displaySleep && ((now-m_idleTimer)screenOn(); + } + + if((now-m_timer1)>=50) + { + if(tes++%120 == 0) + { + printHeap(""); + } + m_timer1 = now; +#ifdef HAS_GPS + m_gps.loop(); +#endif + processExpander(); + m_vmotor->loop(); + LOCK_DEBUG_PORT(); + while(SERIAL_PROG.available()) + { + uint8_t byte = SERIAL_PROG.read(); + switch(m_serialSignatureState) + { + case 0: + { + if(byte==SERIAL_PROG_MODE_SIG1) + m_serialSignatureState++; + break; + } + case 1: + { + m_serialSignatureState=0; + if(byte==SERIAL_PROG_MODE_SIG2) + { + int64_t serialTime=now; + serialTime = now; + while(SERIAL_PROG.available()) SERIAL_PROG.read(); + delay(100); + SERIAL_PROG.write(SERIAL_PROG_MODE_RESP); + while((millis()-serialTime)<10000) + { + if(SERIAL_PROG.available()) + { + byte = SERIAL_PROG.read(); + if(byte==SERIAL_PROG_MODE_RESP) + { + SERIAL_PROG.flush(); + SERIAL_PROG.updateBaudRate(921600); + if(m_displaySleep) + { + m_displaySleep = false; + m_screen->screenOn(); + delay(200); + } + m_screen->showProgramMode(); + programMode(); + SERIAL_PROG.updateBaudRate(115200); + } + break; + } + else + delay(1); + } + } + break; + } + } + } + UNLOCK_DEBUG_PORT(); + } + + m_imu->loop(); + + if(!isAGDUpdate()) + { + processLoraPackets(); + } + else + { + processLoraAGDPackets(); + if((now-m_sideButtonsUpdateTime)>=1000) + { + updateSideButtons(); + m_sideButtonsUpdateTime = now; + } + } + + m_bleClient.loop(); +} + +void cAirsoftTracker::processLoraPackets() +{ + m_loraPackets.lock(); + while (m_loraPackets.size() > 0) + { + auto packet = m_loraPackets.front(); + m_loraPackets.pop(); + sNetworkPacket netPacket; + netPacket.data = packet.data; + netPacket.packetTime = packet.time; + netPacket.preambleTime = packet.preambleTime; + m_networkProcessor.processPacket(netPacket,packet.RSSI,packet.SNR); + } + m_loraPackets.unlock(); + m_networkProcessor.loop(); +} + +static SPISettings spiSettings(4000000, MSBFIRST, SPI_MODE0); + +void cAirsoftTracker::updateBootScreen() +{ + m_screen->showBootScreen(m_bootMsg1.empty()?NULL:m_bootMsg1.c_str(),m_bootMsg2.empty()?NULL:m_bootMsg2.c_str()); +} + +void cAirsoftTracker::init() +{ + auto mainThread = new cThreadFunction(*this, &cAirsoftTracker::mainThread); + mainThread->start("MainThread", 8192*2, tskIDLE_PRIORITY+1, 1); +} + +void cAirsoftTracker::mainThread(cThreadFunction *thread) +{ + mainInit(); + esp_task_wdt_init(APP_WATCHDOG_SECS_WORK, true); + auto res = esp_task_wdt_add(NULL); + assert(res == ESP_OK); +#ifdef DEBUG_USAGE + cCPUUsage usage; +#endif +#ifdef AT_CAN_SLEEP + int32_t loopCounter = 0; + pinMode(LED_PIN,OUTPUT); + digitalWrite(LED_PIN,LOW); +#endif + while(true) + { +#ifdef DEBUG_USAGE + usage.periodStart(); + usage.workStart(); +#endif + unsigned long now = millis(); + mainLoop(); +#ifdef DEBUG_USAGE + usage.workStop(); + usage.idleStart(); +#endif + esp_task_wdt_reset(); + int64_t workTime = ((int64_t)millis())-now; + if(workTime<0) + workTime = 0; + if(workTime<10) + delay(10-workTime); + else + delay(1); + +#ifdef AT_CAN_SLEEP + if(loopCounter++>2) + { + bool canSleep = true; + m_loraPackets.lock(); + canSleep = m_loraPackets.size()==0; + m_loraPackets.unlock(); + if(canSleep) + { + m_loraPacketsToSend.lock(); + canSleep = m_loraPacketsToSend.size()==0; + m_loraPacketsToSend.unlock(); + } +#ifdef HAS_GPS + if(canSleep) + canSleep = m_gps.canSleep(); +#endif + if(canSleep) + { + m_gps.getSerial().flush(); + digitalWrite(LED_PIN,HIGH); + detachInterrupt(LORA_IRQ); + gpio_wakeup_enable((gpio_num_t)LORA_IRQ,GPIO_INTR_HIGH_LEVEL); + esp_sleep_enable_gpio_wakeup(); + esp_sleep_enable_uart_wakeup(GPS_SERIAL_NUM); + esp_sleep_enable_timer_wakeup(m_networkProcessor.getTimeslotDuration()*2000/3); + esp_light_sleep_start(); + digitalWrite(LED_PIN,LOW); + attachInterrupt(LORA_IRQ, &loraRINT,RISING); + esp_task_wdt_reset(); + delay(10); + loopCounter = 0; + } + }; +#endif + +#ifdef DEBUG_USAGE + usage.idleStop(); + usage.periodStop("Main Loop usage"); +#endif + } +} + +void cAirsoftTracker::mainInit() +{ + DEBUG_MSG("Main Thread on core %d\n", xPortGetCoreID()); + Wire.begin(I2C_SDA, I2C_SCL,400000); + scanI2Cdevice(Wire); + + atGlobal::init(); + + setenv("TZ", m_config.timeZone.c_str(), 1); + tzset(); + + DEBUG_MSG("Set TZ %s\n",m_config.timeZone.c_str()); + + m_power->gpsOff(); + delay(50); + m_power->gpsOn(); + + sRFModuleConfig loraModule; + +#ifdef USE_SX1262 + loraModule.cs = NSS_GPIO; + loraModule.irq = SX1262_IRQ; + loraModule.rst = SX1262_RST; + loraModule.busy = SX1262_BUSY; +#else + loraModule.cs = LORA_CS; + loraModule.irq = LORA_IRQ; + loraModule.rst = LORA_RST; + loraModule.busy = 0; +#endif + m_expander = new Adafruit_MCP23017(); + m_expander->begin(&Wire); + for(int i=0; i<16; i++) + if(i!=VIBRO_PIN && i!=VIBRO_PIN2) + m_expander->pullUp(i,1); + + + m_expander->pinMode(BTN1_PIN,INPUT); + m_expander->pullUp(BTN1_PIN,1); + + m_expander->pinMode(BTN2_PIN,INPUT); + m_expander->pullUp(BTN2_PIN,1); + + m_expander->pinMode(BTN3_PIN,INPUT); + m_expander->pullUp(BTN3_PIN,1); + + m_expander->pinMode(BTN4_PIN,INPUT); + m_expander->pullUp(BTN4_PIN,1); + + m_expander->pinMode(BTN5_PIN,INPUT); + m_expander->pullUp(BTN5_PIN,1); + + m_expander->pinMode(BTN6_PIN,INPUT); + m_expander->pullUp(BTN6_PIN,1); + + m_expander->pinMode(VIBRO_PIN,OUTPUT); + m_expander->digitalWrite(VIBRO_PIN,LOW); + + m_expander->pinMode(VIBRO_PIN2,OUTPUT); + m_expander->digitalWrite(VIBRO_PIN2,LOW); + + m_vmotor = new cVMotor(VIBRO_PIN,VIBRO_PIN2, m_expander); + vibration(); + + DEBUG_MSG("Starting screen\n"); +#ifdef USE_SCREEN_EVE + m_screen = new cATScreenEVE(*this); +#else + m_screen = new cATScreenDummy(*this); +#endif + m_expander->pinMode(DW1000_CS,OUTPUT); + m_expander->digitalWrite(DW1000_CS,HIGH); + m_vmotor->loop(); +#ifndef AD_NOSCREEN + if(m_maps.getMaps().size()) + { + cMapsList &maps = m_maps.getMaps(); + DEBUG_MSG("Maps loaded. Count %d\n",maps.size()); + for(auto mitr=maps.begin(); mitr!=maps.end();mitr++) + { + cMap &map = *mitr; + //DEBUG_MSG(" Map %s, zoom levels %d\n",map.getMap().name.c_str(),map.getMapZoomLevels().size()); + DEBUG_MSG(" Map %s\n",map.getMap().name); + } + } + else + DEBUG_MSG("No maps\n"); +#endif + m_vmotor->loop(); + randomSeed(m_networkConfig.networkId*m_config.id*esp_random()); + m_screen->init(); + m_bootMsg1 = "Initializing DWM1000"; + updateBootScreen(); +#if 0 + pinMode(SPI_DISP_CS,OUTPUT); + digitalWrite(SPI_DISP_CS,HIGH); + char buffer[128]=""; + DEBUG_MSG("DWM1000\n"); + DW1000Ng::initialize(DW1000_CS,DW1000_IRQ,DW1000_RST,HSPI_HOST,m_expander); + + DW1000Ng::setDeviceAddress(6); + DW1000Ng::setNetworkId(11); + + DW1000Ng::getPrintableDeviceIdentifier(buffer); + DEBUG_MSG("DWM1000 OK %s\n",buffer); + DW1000Ng::getPrintableExtendedUniqueIdentifier(buffer); + DEBUG_MSG("DWM1000 ID %s\n",buffer); + DW1000Ng::getPrintableNetworkIdAndShortAddress(buffer); + DEBUG_MSG("DWM1000 NET %s\n",buffer); +#endif + + SPIClass *SPI2 = new SPIClass(VSPI); + + SPI2->begin(SCK_GPIO, MISO_GPIO, MOSI_GPIO, NSS_GPIO); + SPI2->setFrequency(4000000); + + loraModule.spi = SPI2; + loraModule.spiSettings = &spiSettings; + + m_core0Thread = new cThreadFunction(*this, &cAirsoftTracker::core0Thread); + m_core0Thread->start("Core0", 4096, tskIDLE_PRIORITY+10, 0); + + m_vmotor->loop(); + m_bootMsg1 = "Initializing IMU"; + updateBootScreen(); + + m_imu = new cIMU(); + + if(m_imu->setup()) + m_imuStatus->observe(&m_imu->newStatus); + + if(m_expander->digitalRead(BTN1_PIN)==LOW) + { + m_bootMsg1 = "Calibrating IMU"; + updateBootScreen(); + m_vmotor->stop(); + m_imu->calibrate(); + } + m_vmotor->loop(); + m_bootMsg1 = "Initializing GNSS"; + updateBootScreen(); +#ifdef HAS_GPS + if(!m_gps.setup()) + { + for(int i=0; i<5; i++) + { + DEBUG_MSG("Restart GPS\n"); + m_bootMsg2 = "Restarting GNSS"; + updateBootScreen(); + m_power->gpsOff(); + delay(50+10*i); + m_power->gpsOn(); + delay(1000+100*i); + if(m_gps.setup()) + break; + } + } + m_gps.startLock(); + m_gpsStatus->observe(&m_gps.newStatus); +#endif + m_vmotor->stop(); + m_bootMsg1 = "Waiting core 0"; + m_bootMsg2 = ""; + updateBootScreen(); + while(!m_core0ThreadReady) + { + delay(1); + } + + m_bootMsg1 = "Initializing LORA"; + updateBootScreen(); + +#ifdef USE_SX1262 + m_lora = new cLoraDeviceSX1262(loraModule, m_networkConfig.channelConfig); + int16_t status = m_lora->applyConfig(); + DEBUG_MSG("Lora SX1262 device status %d\n", status); +#else + m_lora = new cLoraDeviceRF95(loraModule, m_networkConfig.channelConfig); + int16_t status = m_lora->applyConfig(); + DEBUG_MSG("Lora RF95 device status %d\n", status); +#endif + + if (status == 0) + { + m_loraThread = new cThreadFunction(*this, &cAirsoftTracker::loraThread); + m_loraThread->start("Lora", 4096, tskIDLE_PRIORITY+1, 1); + } + m_agdPOI = createPOI(); + m_bootMsg1 = "Initializing BLE"; + updateBootScreen(); + m_bleClient.begin(m_agdPOI); + m_bootMsg1 = "Initializing complete"; + updateBootScreen(); + DEBUG_MSG("Setup completed\n"); + m_idleTimer = millis(); + m_displaySleep = false; + m_serialSignatureState=0; + while(SERIAL_PROG.available()) SERIAL_PROG.read(); +} + +volatile bool loraEnableInterrupt; +volatile bool loraReceived; +const TickType_t ticks5ms = 5/portTICK_PERIOD_MS; +const TickType_t ticks1ms = 1/portTICK_PERIOD_MS; + +void IRAM_ATTR loraRINT(void) +{ + if (!loraEnableInterrupt) + { + return; + } + loraReceived = true; + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + xEventGroupSetBitsFromISR(loraInterruptEvent,1,&xHigherPriorityTaskWoken); +} + +void cAirsoftTracker::loraThread(cThreadFunction *thread) +{ + DEBUG_MSG("Lora Thread on core %d\n", xPortGetCoreID()); + int16_t configID = 0; + loraEnableInterrupt = true; + xEventGroupClearBits(loraInterruptEvent,1); + loraReceived = false; + m_lora->setDio0Action(loraRINT); + int status = m_lora->startReceive(); + int64_t lastPreamble = 0; + DEBUG_MSG("Lora startReceive status %d\n", status); + while (true) + { + if (loraReceived) + { + loraReceived = false; + auto irq = m_lora->getIrqStatus(); + //DEBUG_MSG("%d Lora recv %X\n",millis(),irq); + if(m_lora->isRxDoneIrq(irq)) + { + lastPreamble = millis()-m_networkProcessor.getMaxPacketDuration()+(esp_random()%15)+10; + loraEnableInterrupt = false; + auto size = m_lora->getPacketLength(true); + if(size > 0) + { + //DEBUG_MSG("%d Lora has data %d\n",millis(), size); + sLoraPacket packet; + packet.data.resize(size); + status = m_lora->readData(&packet.data[0], size); + if (status == ERR_NONE) + { +// DEBUG_MSG("%d Lora got packet %d %f\n", millis(),size,m_lora->getSNR()); + packet.RSSI = m_lora->getRSSI(); + packet.SNR = m_lora->getSNR(); + packet.time = millis(); + packet.preambleTime = lastPreamble; + m_loraPackets.push_item(packet); + } + else + { + DEBUG_MSG("Lora error read packet %d\n", status); + } + } + loraEnableInterrupt = true; + m_lora->startReceive(); + } + else + if(m_lora->isPreambleIrq(irq)) + { + //DEBUG_MSG("%d P\n",millis()); + m_lora->clearPreambleIrq(); + lastPreamble = millis(); + } + } + bool hasPacketsToSend = false; + m_loraPacketsToSend.lock(); + if(m_loraPacketsToSend.size() > 0 && (millis()-lastPreamble)>=m_networkProcessor.getMaxPacketDuration()) + { + bool lastLoraReceived = loraReceived; + while (m_loraPacketsToSend.size() > 0) + { + auto packet = m_loraPacketsToSend.front(); + m_loraPacketsToSend.pop(); + //DEBUG_MSG("%d Transmit\n",millis()); + //int64_t t = millis(); + auto res = m_lora->transmit(packet.packet.data.data(),packet.packet.data.size()); + //DEBUG_MSG("%d Transmit %d %d %d\n",millis(),(int)packet.packet.data.size(),(int) res, (int)(millis()-t)); + } + xEventGroupClearBits(loraInterruptEvent,1); + loraReceived = lastLoraReceived; + m_lora->startReceive(); + } + else + { + hasPacketsToSend = m_loraPacketsToSend.size(); + } + + m_loraPacketsToSend.unlock(); + + if(isAGDUpdate()) + { + if(configID!=1) + { + configID = 1; + m_lora->applyConfig(m_agdNetworkConfig.channelConfig); + m_lora->startReceive(); + DEBUG_MSG("Lora switch to AGD config\n"); + } + } + else + { + if(configID!=0) + { + configID = 0; + m_lora->applyConfig(m_networkConfig.channelConfig); + m_lora->startReceive(); + DEBUG_MSG("Lora switch to main config\n"); + } + } + + xEventGroupWaitBits(loraInterruptEvent,1,pdTRUE,pdFALSE,hasPacketsToSend?ticks1ms:ticks5ms); + } +} + +void cAirsoftTracker::core0Thread(cThreadFunction *thread) +{ + DEBUG_MSG("Core 0 Thread on core %d\n",xPortGetCoreID()); + + m_core0ThreadReady = true; +#ifdef DEBUG_USAGE + cCPUUsage usage; +#endif + while (true) + { +#ifdef DEBUG_USAGE + usage.periodStart(); + usage.workStart(); +#endif + unsigned long now = millis(); + + m_commands.lock(); + while (m_commands.size() > 0) + { + sCommand cmd = m_commands.front(); + m_commands.pop(); + m_commands.unlock(); + processCommand(cmd); + m_commands.lock(); + } + m_commands.unlock(); + +#ifdef DEBUG_USAGE + usage.workStop(); + usage.idleStart(); +#endif + int64_t workTime = ((int64_t)millis())-now; + if(workTime<0) + workTime = 0; + if(workTime<25) + delay(25-workTime); + else + delay(1); +#ifdef DEBUG_USAGE + usage.idleStop(); + usage.periodStop("Core0 Loop usage"); +#endif + } +} + +void cAirsoftTracker::processCommand(const sCommand &cmd) +{ + switch (cmd.id) + { + default: + break; + } +} + +void cAirsoftTracker::processExpander() +{ + int64_t now = millis(); + uint16_t gpioab = m_expander->readGPIOAB(); + //if(gpioab!=m_gpioExpander) + { + for(int idx=0; idx=0) + { + uint8_t event = 0; + uint16_t bit = ((uint16_t)1)<<(uint16_t)pin; + if((m_gpioExpander & bit) && ((gpioab & bit)==0)) + { + event = EV_BTN_ON; + } + else + if((m_gpioExpander & bit)==0 && (gpioab & bit)) + event = EV_BTN_OFF; + if(event==0 && m_buttonsTime[idx]) + { + if((now-m_buttonsTime[idx])>=AT_LONG_CLICK_DURATION) + event = EV_BTN_OFF; + } + if(event!=0) + { + if(m_screen->getScreenState()==SS_MAIN) + { + if(m_displaySleep) + { + if(event==EV_BTN_ON) + { + m_idleTimer = millis(); + m_buttonsTime[idx] = 0; + } + } + else + { + if(event==EV_BTN_ON) + { + m_idleTimer = millis(); + m_buttonsTime[idx] = millis(); + } + else + if(event==EV_BTN_OFF) + { + if(m_buttonsTime[idx]) + { + m_idleTimer = millis(); + auto duration = (now-m_buttonsTime[idx]); + if(duration>20) + onButtonClick(idx,duration>=AT_LONG_CLICK_DURATION?ATCT_LONG:ATCT_NORMAL); + m_buttonsTime[idx] = 0; + } + } + } + } + else + { + m_idleTimer = millis(); + m_screen->processEvent(event, idx,0); + } + } + } + } + if(gpioab!=m_gpioExpander) + { + DEBUG_MSG("Expander %04X\n",gpioab); + m_gpioExpander = gpioab; + } + } + + uint16_t ps = analogRead(PSENSOR_PIN); + if(m_ps>0) + m_ps = (m_ps*10+ps)/11; + else + m_ps = ps; +} + +void cAirsoftTracker::sendPacket(const sNetworkPacket &packet) +{ + sLoraPacketToSend sp; + sp.packet = packet; + m_loraPacketsToSend.push_item(sp); + //xEventGroupSetBits(loraInterruptEvent,1); +} + +void cAirsoftTracker::updateDistances(bool force) +{ + if(m_gpsStatus->getHasLock()) + { + cPeers& peers = m_networkProcessor.getPeers(); + bool isNewPos = m_gpsStatus->getSequence()!=m_gpsSeq; + m_gpsSeq = m_gpsStatus->getSequence(); + double lat;// = m_gpsStatus->getLatitude()*1e-7; + double lng;// = m_gpsStatus->getLongitude()*1e-7; + double x = m_mapCenterX==0?m_gpsStatus->getX():m_mapCenterX; + double y = m_mapCenterY==0?m_gpsStatus->getY():m_mapCenterY; + convertMeterToDegree(x,y,lng,lat); + for(auto itr=peers.begin(); itr!=peers.end(); itr++) + { + if(isNewPos || (itr->second.isValidLocation() && (itr->second.positionChanged || force))) + { + cPeer &peer = itr->second; + peer.realDistance = distanceBetween(lat,lng,peer.lat,peer.lng); + peer.distance = distanceXYBetween(x,y,peer.x,peer.y); + peer.courseTo = courseXYTo(x,y,peer.x,peer.y); + peer.positionChanged = false; + if(peer.realDistance>100 && itr->second.isValidLocation()) + { + peer.retransmitRating = peer.realDistance; + } + else + peer.retransmitRating = 0; + } + } + for(auto itr=m_poiMapStatic.begin(); itr!=m_poiMapStatic.end(); itr++) + { + if(isNewPos || (itr->isValidLocation() && (itr->positionChanged || force))) + { + sPOI &poi = (*itr); + poi.realDistance = distanceBetween(lat,lng,poi.lat,poi.lng); + poi.distance = distanceXYBetween(x,y,poi.x,poi.y); + poi.courseTo = courseXYTo(x,y,poi.x,poi.y); + poi.positionChanged = false; + } + } + + for(auto itr=m_poiMap.begin(); itr!=m_poiMap.end(); itr++) + { + if(isNewPos || (itr->second.isValidLocation() && (itr->second.positionChanged || force))) + { + sPOI &poi = itr->second; + poi.realDistance = distanceBetween(lat,lng,poi.lat,poi.lng); + poi.distance = distanceXYBetween(x,y,poi.x,poi.y); + poi.courseTo = courseXYTo(x,y,poi.x,poi.y); + poi.positionChanged = false; + } + } + } +} + +void cAirsoftTracker::updateSideButtons() +{ + auto clearButtonFunc = [&](uint8_t idx) + { + sSideButton *btn = &m_sideButtons.getButtons()[idx]; + btn->action = BA_NONE; + btn->actionLong = BA_NONE; + btn->caption = ""; + }; + + if(m_screen->getScreenState()==SS_MENU) + { + + sSideButton *btn = &m_sideButtons.getButtons()[2]; + btn->action = BA_NONE; + btn->actionLong = BA_NONE; + btn->caption = "action = BA_NONE; + btn->actionLong = BA_NONE; + btn->caption = "UP"; + + btn = &m_sideButtons.getButtons()[1]; + btn->action = BA_NONE; + btn->actionLong = BA_NONE; + btn->caption = "DOWN"; + + btn = &m_sideButtons.getButtons()[3]; + btn->action = BA_NONE; + btn->actionLong = BA_NONE; + btn->caption = "PREV"; + + btn = &m_sideButtons.getButtons()[4]; + btn->action = BA_NONE; + btn->actionLong = BA_NONE; + btn->caption = "OK"; + + btn = &m_sideButtons.getButtons()[5]; + btn->action = BA_NONE; + btn->actionLong = BA_NONE; + btn->caption = "NEXT"; + } + else + switch(m_sideButtonsState) + { + case ATSBS_MAIN: + { + char buffer[32]; + sSideButton *btn = &m_sideButtons.getButtons()[3]; + btn->actionLong = BA_STATUS; + btn->action = BA_NONE; + if(m_playerStatus.status==PS_NORMAL) + btn->caption = ATS_BTN_DEAD; + else + btn->caption = ATS_BTN_ALIVE; + + btn = &m_sideButtons.getButtons()[0]; + btn->action = BA_RADIUS; + btn->actionLong = BA_MAP; + btn->caption = ATS_MRADIUS; + + btn = &m_sideButtons.getButtons()[1]; + btn->action = BA_MENU; + btn->actionLong = BA_NONE; + btn->caption = ATS_MENU; + + #ifndef AD_BLE_NO_CLIENT + btn = &m_sideButtons.getButtons()[2]; + btn->action = BA_BLE; + btn->actionLong = BA_AGD_UPDATE; + if(m_agdUpdateTimer>0) + snprintf(buffer,sizeof(buffer),"%s/AGD UPD (%ds)",m_bleClient.getEnableScan()?"D BLE":"E BLE",(int)(millis()-m_agdUpdateTimer)/1000); + else + snprintf(buffer,sizeof(buffer),"%s/AGD UPD",m_bleClient.getEnableScan()?"D BLE":"E BLE"); + btn->caption = buffer; + #endif + + btn = &m_sideButtons.getButtons()[4]; + btn->action = BA_TIMERS; + btn->actionLong = BA_TIMERS_RST; + btn->caption = "Timers/RST"; + + btn = &m_sideButtons.getButtons()[5]; + btn->action = BA_NONE; + btn->actionLong = BA_SLEEP; + btn->caption = ""; + + break; + } + + case ATSBS_MAP: + { + sSideButton *btn = &m_sideButtons.getButtons()[0]; + btn->action = BA_RADIUS; + btn->actionLong = BA_MAPRESET; + btn->caption = "RADIUS/RST"; + + btn = &m_sideButtons.getButtons()[1]; + btn->action = BA_MAPLEFT; + btn->actionLong = BA_NONE; + btn->caption = "LEFT"; + + btn = &m_sideButtons.getButtons()[2]; + btn->action = BA_MAPEXIT; + btn->actionLong = BA_NONE; + btn->caption = "action = BA_MAPUP; + btn->actionLong = BA_NONE; + btn->caption = "UP"; + + btn = &m_sideButtons.getButtons()[4]; + btn->action = BA_MAPRIGHT; + btn->actionLong = BA_NONE; + btn->caption = "RIGHT"; + + btn = &m_sideButtons.getButtons()[5]; + btn->action = BA_MAPDOWN; + btn->actionLong = BA_NONE; + btn->caption = "DOWN"; + break; + } + + case ATSBS_TIMERS: + { + char buffer[32]; + sSideButton *btn; + if(m_timers[2]->isEnabled()) + { + btn = &m_sideButtons.getButtons()[0]; + btn->action = BA_TIMER; + btn->actionLong = BA_TIMER; + snprintf(buffer,sizeof(buffer),"%s T3/RST",m_timers[2]->isStarted()?(m_timers[2]->isPaused()?"R":"P"):"S"); + btn->caption = buffer; + } + else + clearButtonFunc(0); + + if(m_timersChains.front()->isEnabled()) + { + btn = &m_sideButtons.getButtons()[1]; + btn->action = BA_TIMER; + btn->actionLong = BA_TIMER; + snprintf(buffer,sizeof(buffer),"%s T1->T2/RST",m_timersChains.front()->isStarted()?(m_timersChains.front()->isPaused()?"R":"P"):"S"); + btn->caption = buffer; + } + else + clearButtonFunc(1); + + btn = &m_sideButtons.getButtons()[2]; + btn->action = BA_EXIT; + btn->actionLong = BA_TIMER; + btn->caption = "isEnabled()) + { + btn = &m_sideButtons.getButtons()[3]; + btn->action = BA_TIMER; + btn->actionLong = BA_TIMER; + snprintf(buffer,sizeof(buffer),"%s T4/RST",m_timers[3]->isStarted()?(m_timers[3]->isPaused()?"R":"P"):"S"); + btn->caption = buffer; + } + else + clearButtonFunc(3); + + clearButtonFunc(4); + clearButtonFunc(5); + break; + } + + } +} + +inline static void calcDirectionPoint(double angle, int32_t radius, double &x,double &y) +{ + if(angle<0) + angle += 2*PI; + else + if(angle>2*PI) + angle -= 2*PI; + x = radius*cos(angle); + y = radius*sin(angle); +} + +void cAirsoftTracker::onButtonClick(uint8_t idx,uint8_t type) +{ + uint8_t action = 0; + if(idxisStarted()) + { + if(tc->isPaused()) + tc->resume(now); + else + tc->pause(now); + } + else + tc->start(now); + } + else + tc->reset(); + + } + else + { + cTimer *t; + if(idx==0) + t = m_timers[2]; + else + t = m_timers[3]; + if(type==ATCT_NORMAL) + { + if(t->isStarted()) + { + if(t->isPaused()) + t->resume(now); + else + t->pause(now); + } + else + t->start(now); + } + else + t->reset(); + } + updateSideButtons(); + break; + } + case BA_STATUS: + { + if(m_playerStatus.status==PS_NORMAL) + { + m_playerStatus.status = PS_DEAD; + } + else + { + m_playerStatus.status = PS_NORMAL; + } + updateSideButtons(); + break; + } + + case BA_MENU: + { + m_screen->setScreenState(SS_MENU); + break; + } + + case BA_AGD_UPDATE: + { + if(isAGDUpdate()) + stopAGDUpdate(); + else + startAGDUpdate(); + updateSideButtons(); + break; + } + + case BA_BLE: + { +#ifndef AD_BLE_NO_CLIENT + m_bleClient.enableScan(!m_bleClient.getEnableScan()); + updateSideButtons(); +#endif + break; + } + + case BA_MAP: + { + m_sideButtonsState = ATSBS_MAP; + updateSideButtons(); + break; + } + + case BA_SLEEP: + { + m_idleTimer = 0; + break; + } + + case BA_TIMERS: + { + m_sideButtonsState = ATSBS_TIMERS; + updateSideButtons(); + break; + } + + case BA_TIMERS_RST: + { + for(auto itr = m_timersChains.begin(); itr!=m_timersChains.end(); itr++) + (*itr)->reset(); + + for(auto itr = m_timers.begin(); itr!=m_timers.end(); itr++) + itr->second->reset(); + break; + } + + case BA_MAPLEFT: + case BA_MAPRIGHT: + case BA_MAPUP: + case BA_MAPDOWN: + { + double x,y; + double direction = getDirection(); + switch(action) + { + case BA_MAPUP: direction -= PI/2; break; + case BA_MAPDOWN: direction += PI/2; break; + case BA_MAPLEFT: break; + case BA_MAPRIGHT: direction -= PI; break; + } + calcDirectionPoint(direction,getConfig().radius/10,x,y); + if(m_mapCenterX==0 || m_mapCenterY==0) + { + m_mapCenterX = m_gpsStatus->getX(); + m_mapCenterY = m_gpsStatus->getY(); + } + m_mapCenterX += x; + m_mapCenterY += y; + updateDistances(true); + break; + } + + case BA_MAPRESET: + { + m_mapCenterX = m_mapCenterY = 0; + updateDistances(true); + break; + } + + case BA_MAPEXIT: + { + m_mapCenterY = m_mapCenterX = 0; + m_sideButtonsState = ATSBS_MAIN; + updateDistances(true); + updateSideButtons(); + break; + } + + case BA_EXIT: + { + m_sideButtonsState = ATSBS_MAIN; + updateSideButtons(); + break; + } + + case BA_RADIUS: + { + switch(m_config.radius) + { + case 250: + { + m_config.radius = 500; + break; + } + + case 500: + { + m_config.radius = 1000; + break; + } + + case 1000: + { + m_config.radius = 25; + break; + } + + + case 25: + { + m_config.radius = 50; + break; + } + + case 50: + { + m_config.radius = 100; + break; + } + + case 100: + { + m_config.radius = 150; + break; + } + + case 150: + { + m_config.radius = 250; + break; + } + } + updateSideButtons(); + break; + } + } +} + +void cAirsoftTracker::vibration() +{ + if(m_config.useVibration) + m_vmotor->vibrate(m_config.vibrationTime); +} + +#define prgSendPacket(P,V) SERIAL_PROG.write(newPacketBuffer,serialParser.create_packet(newPacketBuffer,MAX_SERIAL_PACKET_SIZE,P,&V,sizeof(V))) +void cAirsoftTracker::programMode() +{ + byte_t *newPacketBuffer = (byte_t *)malloc(MAX_SERIAL_PACKET_SIZE+4); + bool needReset = false; + int64_t lastTime = millis(); + comm_protocol_parser_c serialParser(cp_prefix_t(SERIAL_APP_1, SERIAL_APP_2, SERIAL_APP_3, SERIAL_APP_4),MAX_SERIAL_PACKET_SIZE); + byte_t *packetBuffer = serialParser.get_packet_buffer(); + FILE *metaFile = NULL; + FILE *dataFile = NULL; + vTaskPrioritySet( NULL, configMAX_PRIORITIES - 5 ); + while((millis()-lastTime)<10000) + { + //bool debug = true;//(millis()-lastTime)>10000; + while(SERIAL_PROG.available()) + { + byte_t incomingByte = SERIAL_PROG.read(); +/* + if(debug) + { + SERIAL_PROG.write('Z'); + SERIAL_PROG.write(incomingByte); + SERIAL_PROG.flush(); + } +*/ + //lastTime = millis(); + int8_t res = serialParser.post_data(&incomingByte,sizeof(byte_t)); + /* + if(debug) + { + SERIAL_PROG.write(res); + SERIAL_PROG.flush(); + } +*/ + if(res== CP_RESULT_PACKET_READY) + { + esp_task_wdt_reset(); + lastTime = millis(); + uint16_t packetSize=serialParser.get_packet_size(); + if(packetSize>=1) + { + uint8_t command = packetBuffer[0]; + switch(command) + { + case PMC_SCREEN_FLASH_META_START: + { + metaFile = fopen(SCREEN_FLASH_META_BINARY_FILE,"wb+"); + byte_t result = 0; + if(metaFile) + prgSendPacket(PMC_SCREEN_FLASH_ACK,result); + else + prgSendPacket(PMC_SCREEN_FLASH_ERR,result); + break; + } + + case PMC_SCREEN_FLASH_META_END: + { + if(metaFile) + { + fflush(metaFile); + fclose(metaFile); + metaFile = NULL; + } + byte_t result = 0; + prgSendPacket(PMC_SCREEN_FLASH_ACK,result); + break; + } + + case PMC_SCREEN_FLASH_META_DATA: + { + byte_t result = 0; + if(metaFile) + { + fwrite(&packetBuffer[1],packetSize-1,1,metaFile); + prgSendPacket(PMC_SCREEN_FLASH_ACK,result); + } + else + { + prgSendPacket(PMC_SCREEN_FLASH_ERR,result); + } + break; + } + + case PMC_SCREEN_FLASH_FILE_START: + { + char fileName[32]; + packetBuffer[packetSize-1] = 0; + snprintf(fileName,sizeof(fileName),"%s%s",SCREEN_FLASH_META_FILE_PATH,&packetBuffer[1]); + dataFile = fopen(fileName,"wb+"); + byte_t result = 0; + if(dataFile) + prgSendPacket(PMC_SCREEN_FLASH_ACK,result); + else + prgSendPacket(PMC_SCREEN_FLASH_ERR,result); + break; + } + + case PMC_SCREEN_FLASH_FILE_END: + { + if(dataFile) + { + fflush(dataFile); + fclose(dataFile); + dataFile = NULL; + } + byte_t result = 0; + prgSendPacket(PMC_SCREEN_FLASH_ACK,result); + break; + } + + case PMC_SCREEN_FLASH_FILE_DATA: + { + byte_t result = 0; + if(dataFile) + { + fwrite(&packetBuffer[1],packetSize-1,1,dataFile); + prgSendPacket(PMC_SCREEN_FLASH_ACK,result); + } + else + { + prgSendPacket(PMC_SCREEN_FLASH_ERR,result); + } + break; + } + + case PMC_SCREEN_FLASH_START: + { + uint32_t result = m_screen->flashProgrammStart(); + prgSendPacket(PMC_SCREEN_FLASH_START_RESPONSE,result); + break; + } + case PMC_SCREEN_FLASH_END: + { + m_screen->flashProgrammEnd(); + int32_t result = 0; + prgSendPacket(PMC_SCREEN_FLASH_ACK,result); + break; + } + case PMC_SCREEN_FLASH_WRITE_COMPRESS: + case PMC_SCREEN_FLASH_WRITE: + { + needReset = true; + int32_t result = 0; + sPMCFlashBlock *fb = (sPMCFlashBlock*)&packetBuffer[1]; + uint8_t *data = &packetBuffer[1+sizeof(sPMCFlashBlock)]; + if(fb && data && fb->size==(packetSize-1-sizeof(sPMCFlashBlock))) + { + if(command==PMC_SCREEN_FLASH_WRITE_COMPRESS) + { + for(int i=0; isize; i++) + { + if(i%2==0) + data[i] ^= 0xAA; + else + data[i] ^= 0x55; + } + } + m_screen->flashWrite(fb->address,fb->size,data); + delay(1); + prgSendPacket(PMC_SCREEN_FLASH_ACK,result); + } + else + { + result = -1; + prgSendPacket(PMC_SCREEN_FLASH_ERR,result); + } + + break; + } + case PMC_SCREEN_FLASH_READ: + { + int32_t result = 0; + sPMCFlashBlock fb = *(sPMCFlashBlock*)&packetBuffer[1]; + if(fb.size<=MAX_SERIAL_PACKET_SIZE) + { + m_screen->flashRead(fb.address,fb.size,packetBuffer); + SERIAL_PROG.write(newPacketBuffer,serialParser.create_packet(newPacketBuffer,MAX_SERIAL_PACKET_SIZE,PMC_SCREEN_FLASH_READ_RESPONSE,packetBuffer,fb.size)); + } + else + { + result = -1; + prgSendPacket(PMC_SCREEN_FLASH_ERR,result); + } + + break; + } + + case PMC_SCREEN_FLASH_EXIT: + { + lastTime = 0; + break; + } + + default: + { + int32_t result = -100; + prgSendPacket(PMC_SCREEN_FLASH_ERR,result); + break; + } + } + } + else + { + int32_t result = -1; + prgSendPacket(PMC_SCREEN_FLASH_ERR,result); + } + serialParser.reset(); + SERIAL_PROG.flush(); + } + else + if(res<=-2) + { + int32_t result = res; + prgSendPacket(PMC_SCREEN_FLASH_ERR,result); + SERIAL_PROG.flush(); + } + } + esp_task_wdt_reset(); + yield(); + } + if(metaFile) + fclose(metaFile); + if(needReset) + { + delay(1000); + ESP.restart(); + delay(1000); + } + vTaskPrioritySet( NULL, tskIDLE_PRIORITY+1); + free(newPacketBuffer); +} + +struct sLoraPacketHeader +{ + uint8_t tag; + uint8_t src; + uint8_t dst; +} __attribute__((packed)); + +void cAirsoftTracker::processLoraAGDPackets() +{ + bool hasUpdate = false; + m_loraPackets.lock(); + while (m_loraPackets.size() > 0) + { + auto packet = m_loraPackets.front(); + m_loraPackets.pop(); + + if (packet.data.size() > sizeof(sLoraPacketHeader)) + { + sLoraPacketHeader *header = (sLoraPacketHeader *)&packet.data[0]; + uint8_t *data = &packet.data[sizeof(sLoraPacketHeader)]; + if (header->tag == LORA_TAG) + { + sPOI poi; + int32_t time1 = 0; + int32_t time2 = 0; + int32_t timeMode1 = 0; + int32_t timeMode2 = 0; + + + poi.lastUpdate = packet.time; + poi.RSSI = packet.RSSI; + poi.SNR = packet.SNR; + poi.symbol = 'D'; + poi.type = POIT_DYNAMIC; + poi.positionChanged = true; + + DynamicJsonDocument jsonBuffer(1024); + JsonArray root = jsonBuffer.to(); + CayenneLPP lpp(0); + lpp.decode(data, packet.data.size() - sizeof(sLoraPacketHeader), root); + for (const JsonVariant &value : root) + { + uint16_t ch = value["channel"]; + switch(ch) + { + case LSID_HACC: + { + poi.hacc = value.as()["value"]; + break; + } + + case LSID_GPS: + { + JsonVariant gvalue = value.as()["value"]; + JsonObject gavalue = gvalue.as(); + poi.lng = gavalue["longitude"]; + poi.lat = gavalue["latitude"]; + poi.alt = gavalue["altitude"]; + break; + } + + case LSID_TIMER1: + { + time1 = value.as()["value"]; + break; + } + + case LSID_TIMER2: + { + time2 = value.as()["value"]; + break; + } + + case LSID_TIMERS_MODE: + { + int v = value.as()["value"]; + timeMode1 = v & 0xF; + timeMode2 = (v & 0xF0)>>4; + break; + } + + } + } + poi.updateXY(); + char buffer[32]; + snprintf(buffer,sizeof(buffer),"R %02d:%02d%s,B %02d:%02d%s",time1/60,time1 % 60,timeMode1==1?"*":"",time2/60,time2 % 60,timeMode2==1?"*":""); + poi.name = buffer; + setPOI(m_agdPOI,poi); + hasUpdate = true; + } + } + } + m_loraPackets.unlock(); + if(hasUpdate) + stopAGDUpdate(); +} + +void cAirsoftTracker::startAGDUpdate() +{ + processLoraPackets(); + m_agdUpdateTimer = millis(); +} + +void cAirsoftTracker::stopAGDUpdate() +{ + m_loraPackets.lock(); + while(!m_loraPackets.empty()) + m_loraPackets.pop(); + m_loraPackets.unlock(); + m_agdUpdateTimer = 0; + updateSideButtons(); +} diff --git a/src/atracker.h b/src/atracker.h new file mode 100644 index 0000000..38e8eb7 --- /dev/null +++ b/src/atracker.h @@ -0,0 +1,231 @@ +#pragma once +#include +#include +#include +#include "power.h" +#include "atglobal.h" +#include "concurrency/Thread.h" +#include "utils.h" +#include "gps/UBloxGPS.h" +#include "radio/LoraRadio.h" +#include "atcommon.h" +#include "atscreen.h" +#include "Adafruit_MCP23017.h" +#include "imu.h" +#include "atNetworkProcessor.h" +#include "comm_prot_parser.h" +#include "atble.h" + +#define BA_NONE 0 +#define BA_STATUS 1 +#define BA_RADIUS 2 +#define BA_BLE 3 +#define BA_MENU 4 +#define BA_MAP 5 +#define BA_MAPLEFT 6 +#define BA_MAPRIGHT 7 +#define BA_MAPDOWN 8 +#define BA_MAPUP 9 +#define BA_MAPEXIT 10 +#define BA_MAPRESET 11 +#define BA_EXIT 12 +#define BA_TIMER 13 +#define BA_TIMERS 14 +#define BA_TIMERS_RST 15 +#define BA_AGD_UPDATE 16 +#define BA_SLEEP 17 + +struct sCommand +{ + uint8_t id; + uint8_t cmd; + int64_t param1; + int64_t param2; + int64_t param3; +}; + +typedef cProtectedQueue cCommands; + +struct sLoraPacket +{ + std::vector data; + float SNR; + float RSSI; + int64_t time; + int64_t preambleTime; +}; + +struct sLoraPacketToSend +{ + sNetworkPacket packet; +}; + + +typedef cProtectedQueue cLoraPackets; +typedef cProtectedQueue cLoraPacketsToSend; + +class cVMotor +{ +protected: + int64_t m_stopTime; + int8_t m_pin; + int8_t m_pin2; + Adafruit_MCP23017 *m_expander; + void setValue(bool b) + { + if(m_pin>=0) + m_expander->digitalWrite(m_pin, b?HIGH:LOW); + if(m_pin2>=0) + m_expander->digitalWrite(m_pin2, b?HIGH:LOW); + } +public: + cVMotor(int8_t pin, int8_t pin2, Adafruit_MCP23017* expander):m_stopTime(0),m_pin(pin), m_pin2(pin2),m_expander(expander) + { + } + + void loop(int64_t now) + { + if(m_stopTime>0) + { + if(now>=m_stopTime) + { + m_stopTime = 0; + setValue(false); + } + } + } + + void loop() + { + loop(millis()); + } + + void vibrate(uint32_t duration) + { + m_stopTime = millis()+duration; + setValue(true); + } + + void stop() + { + m_stopTime = 0; + setValue(false); + } +}; + + +#define AT_BUTTONS_COUNT 6 +//Click type +#define ATCT_NORMAL 1 +#define ATCT_LONG 2 + +#define AT_LONG_CLICK_DURATION 1000 + +#define ATSBS_MAIN 0 +#define ATSBS_MAP 1 +#define ATSBS_TIMERS 2 + +class cAirsoftTracker:public atGlobal, public cNetworkProcessorInterface +{ +protected: + typedef concurrency::ThreadFunctionTemplate cThreadFunction; + UBloxGPS m_gps; + cLoraDevice *m_lora; + cThreadFunction *m_loraThread; + cLoraPackets m_loraPackets; + cLoraPacketsToSend m_loraPacketsToSend; + cATScreen *m_screen; + cThreadFunction *m_core0Thread; + bool m_core0ThreadReady; + cCommands m_commands; + cIMU *m_imu; + Adafruit_MCP23017 *m_expander; + cVMotor *m_vmotor; + uint16_t m_gpioExpander = 0; + int64_t m_timer1 = 0; + int64_t m_timer2 = 0; + uint16_t m_ps = 0; + int64_t m_idleTimer = 0; + int64_t m_screenTimer = 0; + bool m_displaySleep = false; + std::string m_bootMsg1; + std::string m_bootMsg2; + cNetworkProcessor m_networkProcessor; + uint32_t m_gpsSeq = 0xFFFFFFFF; + uint8_t m_serialSignatureState=0; + atBLE m_bleClient; + int64_t m_buttonsTime[AT_BUTTONS_COUNT]; + int8_t m_buttonsIdx[AT_BUTTONS_COUNT]; + uint8_t m_sideButtonsState = ATSBS_MAIN; + int64_t m_agdUpdateTimer = 0; + uint16_t m_agdPOI=0; + int64_t m_sideButtonsUpdateTime = 0; + + void scanI2Cdevice(TwoWire &wd) + { + byte err, addr; + int nDevices = 0; + for (addr = 1; addr < 127; addr++) + { + wd.beginTransmission(addr); + err = wd.endTransmission(); + if (err == 0) + { + DEBUG_MSG("I2C device found at address 0x%x\n", addr); + + nDevices++; + + if (addr == SSD1306_ADDRESS) + { + m_has_oled = true; + DEBUG_MSG("ssd1306 display found\n"); + } +#ifdef AXP192_SLAVE_ADDRESS + if (addr == AXP192_SLAVE_ADDRESS) + { + m_has_axp192 = true; + DEBUG_MSG("axp192 PMU found\n"); + } +#endif + } + else if (err == 4) + { + DEBUG_MSG("Unknow error at address 0x%x\n", addr); + } + } + if (nDevices == 0) + DEBUG_MSG("No I2C devices found\n"); + else + DEBUG_MSG("done\n"); + } + + void loraThread(cThreadFunction *thread); + void core0Thread(cThreadFunction *thread); + void mainThread(cThreadFunction *thread); + void processCommand(const sCommand &cmd); + void processIMU(); + void processExpander(); + void updateBootScreen(); + void updateDistances(bool force=false); + void updateSideButtons(); + void onButtonClick(uint8_t idx,uint8_t type); + void programMode(); + void vibration(); + void startAGDUpdate(); + void stopAGDUpdate(); + bool isAGDUpdate() + { + return m_agdUpdateTimer!=0; + } + void processLoraPackets(); + void processLoraAGDPackets(); +public: + cAirsoftTracker(); + virtual ~cAirsoftTracker(){}; + void init(); + void mainInit(); + void mainLoop(); + virtual void sendPacket(const sNetworkPacket &packet); + cIMU *getIMU() { return m_imu; } + virtual void onScreenStateChange(); +}; diff --git a/src/atscreen.h b/src/atscreen.h new file mode 100644 index 0000000..87c96d8 --- /dev/null +++ b/src/atscreen.h @@ -0,0 +1,128 @@ +#pragma once +#include +#include "atglobal.h" +#include "utils.h" +#include "atcommon.h" + +struct sColor +{ + uint8_t r; + uint8_t g; + uint8_t b; + uint8_t a; + sColor(uint8_t _r, uint8_t _g, uint8_t _b, uint8_t _a=255):r(_r),g(_g),b(_b),a(_a) + { + } + + + sColor(uint32_t c):r((c >> 16)&0xFF),g((c >> 8)&0xFF),b(c&0xFF),a((c >> 24)&0xFF) + { + } + + sColor operator+(const sColor& c) + { + sColor cc(std::min(255,(uint16_t)r+c.r),std::min(255,(uint16_t)g+c.g),std::min(255,(uint16_t)b+c.b),std::min(255,(uint16_t)a+c.a)); + return cc; + } + + uint8_t getA() + { + return a; + } + + uint32_t getRGB() + { + return (((uint32_t)r) << 16) | (((uint32_t)g) << 8) | b; + } + + uint32_t getRBG() + { + return (((uint32_t)r) << 16) | (((uint32_t)b) << 8) | g; + } + + uint32_t getEVEColor() + { + return ((4UL<<24)|(((r)&255UL)<<16)|(((g)&255UL)<<8)|b); + } + + uint32_t getEVEColorA() + { + return ((0x10UL<<24)|a); + } + + +} __attribute__ ((packed)); + +typedef sColor color_t; +struct sScreenTheme +{ + color_t bgColor; + color_t textColor; + color_t bootTextColor; + color_t circleOuterColor; + color_t circleLineColor; + color_t circleBackgroundColor; + color_t circleHeadingColor; + color_t peerTextColor; + color_t peerNormalColor; + color_t peerDeadColor; + color_t peerEnemyColor; + color_t sideButtonsTextColor; + color_t timerTextColor; + color_t timerRectColor; + color_t peerStaticColor; + color_t peerDynamicColor; + color_t peerAccuracyMask; + uint8_t peerAccuracyA; + + sScreenTheme():bgColor(0x0),textColor(0x208020),bootTextColor(255,255,255),circleOuterColor(0x404040),circleLineColor(8,23,153),circleBackgroundColor(89-40, 150-40, 145-40),circleHeadingColor(255,0,0), + peerTextColor(255,255,255),peerNormalColor(0,255,0),peerDeadColor(255,0,0),peerEnemyColor(0xff4dff),sideButtonsTextColor(0x60A060),timerTextColor(255,0,0),timerRectColor(128,128,128),peerStaticColor(0,0,255), + peerDynamicColor(0,0,255),peerAccuracyMask(64,64,64),peerAccuracyA(64) + { + } +}; + +// Screen state +#define SS_BOOT 1 +#define SS_MAIN 2 +#define SS_MENU 3 + +#define EV_BTN_ON 1 +#define EV_BTN_OFF 2 +class cATScreen +{ +protected: + atGlobal &m_global; + sScreenTheme m_theme; + uint8_t m_screenState; +public: + cATScreen(atGlobal &global); + virtual ~cATScreen(); + + virtual bool init(); + virtual void showBootScreen(const char * msg1,const char * msg2)=0; + virtual void showShutdownScreen() {}; + virtual void closeBootScreen()=0; + virtual void beginMainScreen()=0; + virtual void drawPOI(sPOI &poi,int16_t count=0)=0; + virtual void endMainScreen()=0; + virtual void setBacklight(uint8_t level)=0; + virtual void screenOn()=0; + virtual void screenOff()=0; + virtual void drawSideButtons()=0; + virtual void showProgramMode()=0; + virtual void showMenu(){}; + virtual uint32_t getFramesCount()=0; + virtual void loop() {}; + virtual uint8_t getScreenState() { return m_screenState; } + virtual void setScreenState(uint8_t value) { m_screenState=value; } + virtual void processEvent(uint8_t event, uint32_t param1, uint32_t param2){}; + virtual void drawTimers(bool forceAll) {}; + virtual uint16_t getRadius() = 0; + + //Flash interface + virtual uint32_t flashProgrammStart()=0; + virtual void flashProgrammEnd()=0; + virtual void flashWrite(uint32_t address,uint16_t size, uint8_t *data)=0; + virtual void flashRead(uint32_t address,uint16_t size, uint8_t *data)=0; +}; diff --git a/src/atscreendummy.h b/src/atscreendummy.h new file mode 100644 index 0000000..2f5d7c4 --- /dev/null +++ b/src/atscreendummy.h @@ -0,0 +1,29 @@ +#pragma once +#include "atscreen.h" + +class cATScreenDummy: public cATScreen +{ +public: + cATScreenDummy(atGlobal &global):cATScreen(global) {}; + virtual ~cATScreenDummy(){}; + + virtual bool init() { return true; }; + virtual void showBootScreen(const char * msg1,const char * msg2) {}; + virtual void closeBootScreen() {}; + virtual void beginMainScreen() {}; + virtual void drawPOI(sPOI &poi,int16_t count=0) {}; + virtual void endMainScreen() {}; + virtual void setBacklight(uint8_t level) {}; + virtual void screenOn() {}; + virtual void screenOff() {}; + virtual void drawSideButtons() {}; + virtual void showProgramMode() {}; + virtual uint32_t getFramesCount() { return 0;}; + virtual uint16_t getRadius() { return m_global.getConfig().radius; } + + //Flash interface + virtual uint32_t flashProgrammStart() { return 0;}; + virtual void flashProgrammEnd() {}; + virtual void flashWrite(uint32_t address,uint16_t size, uint8_t *data) {}; + virtual void flashRead(uint32_t address,uint16_t size, uint8_t *data) {}; +}; diff --git a/src/atstrings.h b/src/atstrings.h new file mode 100644 index 0000000..e83167c --- /dev/null +++ b/src/atstrings.h @@ -0,0 +1,10 @@ +#pragma once + +#include + +#define ATS_DEAD PSTR("DEAD") +#define ATS_ALIVE PSTR("ALIVE") +#define ATS_BTN_DEAD PSTR("[L]->DEAD") +#define ATS_BTN_ALIVE PSTR("[L]->ALIVE") +#define ATS_MENU PSTR("MENU") +#define ATS_MRADIUS PSTR("RADIUS/MAP") diff --git a/src/calibri_14_L4.rawh b/src/calibri_14_L4.rawh new file mode 100644 index 0000000..5b0fa98 --- /dev/null +++ b/src/calibri_14_L4.rawh @@ -0,0 +1,317 @@ +/*Command Line: fnt_cvt.exe -f legacy -C BT81X -i Q:/fonts/calibri.ttf -s 14 -d 153600 -c setfont2 -l 32 -a -o D:/Projects/Embedded/AirsoftTracker/fonts*/ + +/*95 characters have been converted */ + +/* 148 Metric Block Begin +++ */ +/*('file properties ', 'format ', 'L4', ' stride ', 7, ' width ', 14, 'height', 14)*/ +{ +/* Widths */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,6,7,7,10,10,3,4,4,7,7,4,4,4,6,7,7,7,7,7,7,7,7,7,7,4,4,7,7,7,6,13,8,8,8,9,7,6,9,9,4,4,7,6,12,9,9,7,10,8,6,7,9,8,13,7,7,7,4,6,4,7,8,4,7,7,6,7,7,5,7,7,3,4,7,3,11,7,7,7,7,5,5,5,7,7,10,6,7,6,4,6,5,7,0, +/* Format */ +2,0,0,0, +/* Stride */ +7,0,0,0, +/* Max Width */ +14,0,0,0, +/* Max Height */ +14,0,0,0, +/* Raw Data Address in Decimal: <153748> */ +148,88,2,0, + +/* 148 Metric Block End --- */ + +/*Bitmap Raw Data begin +++*/ +/*The expected raw bitmap size is 9310 Bytes */ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,31,32,0,0,0,0,0,31,32,0,0,0,0,0,31,32,0,0,0,0,0,15,32, +0,0,0,0,0,15,16,0,0,0,0,0,15,16,0,0,0,0,0,14,16,0,0,0,0,0,0,0,0,0,0,0, +0,46,32,0,0,0,0,0,46,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,15,25,128,0,0,0,0,15,25,112,0,0,0,0,14,8,112,0,0,0,0, +13,7,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,29,0,0,0,0,2,208,76,0,0, +0,0,95,255,255,160,0,0,0,6,144,120,0,0,0,0,8,112,150,0,0,0,0,191,255,255,64,0,0,0,12,64, +210,0,0,0,0,13,32,241,0,0,0,0,14,1,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7,96,0,0,0,0,0,9,80,0,0,0,0,4,207,231,0,0,0,0,14,97,58, +0,0,0,0,31,32,0,0,0,0,0,12,196,0,0,0,0,0,1,142,213,0,0,0,0,0,0,127,32,0,0,0, +0,0,14,80,0,0,0,89,33,110,32,0,0,0,27,239,196,0,0,0,0,0,133,0,0,0,0,0,0,148,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,233,0,10,80,0,0,90, +29,32,106,0,0,0,119,10,66,209,0,0,0,106,29,44,48,0,0,0,27,232,135,142,177,0,0,0,4,178,209,166, +0,0,0,29,36,160,119,0,0,0,181,2,209,165,0,0,6,144,0,158,176,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,141,235,16,0,0,0,4,226,29,112,0,0, +0,6,192,12,112,0,0,0,2,244,156,16,0,0,0,0,175,161,0,0,0,0,7,219,176,14,32,0,0,47,49,202, +47,16,0,0,63,0,45,233,0,0,0,30,129,42,251,16,0,0,4,207,232,25,224,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,32,0,0,0,0,0,15,16,0,0, +0,0,0,14,16,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,180,0,0,0,0,0,2,224, +0,0,0,0,0,7,144,0,0,0,0,0,11,96,0,0,0,0,0,14,48,0,0,0,0,0,15,32,0,0,0,0, +0,31,32,0,0,0,0,0,31,32,0,0,0,0,0,14,64,0,0,0,0,0,11,96,0,0,0,0,0,7,160,0, +0,0,0,0,2,224,0,0,0,0,0,0,180,0,0,0,0,0,0,0,0,0,0,0,0,29,16,0,0,0,0,0, +10,96,0,0,0,0,0,6,160,0,0,0,0,0,3,224,0,0,0,0,0,0,242,0,0,0,0,0,0,228,0,0, +0,0,0,0,213,0,0,0,0,0,0,228,0,0,0,0,0,0,243,0,0,0,0,0,3,240,0,0,0,0,0,6, +176,0,0,0,0,0,11,96,0,0,0,0,0,30,16,0,0,0,0,0,0,0,0,0,0,0,0,0,208,0,0,0, +0,0,184,200,160,0,0,0,0,27,250,0,0,0,0,0,184,200,160,0,0,0,0,0,208,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,15,0,0,0,0,0, +0,15,0,0,0,0,0,127,255,255,112,0,0,0,0,15,0,0,0,0,0,0,15,0,0,0,0,0,0,14,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,112,0,0,0,0,0,12,96, +0,0,0,0,0,45,16,0,0,0,0,0,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,127,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,0,0,0,0, +0,0,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,211,0,0,0,0,0,4,208,0,0,0,0,0,9,128,0,0,0,0,0,30,32,0,0,0, +0,0,92,0,0,0,0,0,0,182,0,0,0,0,0,1,225,0,0,0,0,0,7,160,0,0,0,0,0,12,80,0, +0,0,0,0,62,0,0,0,0,0,0,137,0,0,0,0,0,0,211,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,207,213,0,0,0,0,13,113,95,32,0,0,0,78,0,12,96, +0,0,0,107,0,10,128,0,0,0,123,0,9,144,0,0,0,107,0,10,128,0,0,0,94,0,12,96,0,0,0,30, +113,110,16,0,0,0,4,223,196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,231,0,0,0,0,0,155,199,0,0,0,0,0,48,167, +0,0,0,0,0,0,167,0,0,0,0,0,0,167,0,0,0,0,0,0,167,0,0,0,0,0,0,167,0,0,0,0, +0,0,167,0,0,0,0,0,191,255,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,222,178,0,0,0,0,27,33,203,0,0,0,0, +0,0,125,0,0,0,0,0,0,155,0,0,0,0,0,2,228,0,0,0,0,0,28,128,0,0,0,0,0,186,0,0, +0,0,0,11,160,0,0,0,0,0,63,255,255,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,222,178,0,0,0,0,11,33,186,0,0, +0,0,0,0,124,0,0,0,0,0,3,214,0,0,0,0,5,255,194,0,0,0,0,0,2,157,16,0,0,0,0,0, +47,48,0,0,0,73,33,142,16,0,0,0,26,238,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,246,0,0,0,0,0,45,199, +0,0,0,0,0,167,183,0,0,0,0,3,208,183,0,0,0,0,12,64,183,0,0,0,0,106,0,183,0,0,0,0, +175,255,255,144,0,0,0,0,0,183,0,0,0,0,0,0,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,255,250,0,0,0,0,13, +48,0,0,0,0,0,13,48,0,0,0,0,0,13,254,179,0,0,0,0,1,1,158,16,0,0,0,0,0,31,48,0, +0,0,0,0,31,32,0,0,0,72,17,172,0,0,0,0,27,238,162,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,125,252,16,0,0, +0,7,179,3,0,0,0,0,14,32,0,0,0,0,0,47,174,232,0,0,0,0,79,81,62,64,0,0,0,78,0,10, +128,0,0,0,47,32,11,96,0,0,0,13,145,94,32,0,0,0,3,207,212,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,255,255,96, +0,0,0,0,0,30,48,0,0,0,0,0,123,0,0,0,0,0,0,213,0,0,0,0,0,5,208,0,0,0,0,0, +12,112,0,0,0,0,0,63,16,0,0,0,0,0,170,0,0,0,0,0,1,243,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,206, +214,0,0,0,0,14,96,95,16,0,0,0,31,32,31,32,0,0,0,9,196,184,0,0,0,0,1,206,210,0,0,0, +0,29,112,126,32,0,0,0,108,0,11,112,0,0,0,78,48,62,80,0,0,0,7,223,215,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,206,195,0,0,0,0,46,65,125,0,0,0,0,108,0,14,48,0,0,0,78,48,62,80,0,0,0,8,238,190,80, +0,0,0,0,0,14,64,0,0,0,0,0,79,16,0,0,0,19,3,216,0,0,0,0,29,253,112,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,0,0,0,0,0,0,153,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,0,0,0,0,0,0,153,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,144,0,0,0,0,0, +9,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,160,0,0,0,0,0,9,144,0,0, +0,0,0,13,32,0,0,0,0,0,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,64,0,0,0,0,41,213,0,0,0,0,24,231,0,0,0, +0,0,142,32,0,0,0,0,0,24,214,0,0,0,0,0,0,41,212,0,0,0,0,0,0,59,64,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,255,255, +64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,255,255,64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,64,0,0,0,0,0,4, +172,80,0,0,0,0,0,2,156,64,0,0,0,0,3,173,64,0,0,0,4,188,80,0,0,0,0,75,64,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,8,238,161,0,0,0,0,26,18,185,0,0,0,0,0,0,108,0,0,0,0,0,1,185,0,0,0, +0,0,159,177,0,0,0,0,0,151,0,0,0,0,0,0,151,0,0,0,0,0,0,0,0,0,0,0,0,0,169,0, +0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,206,236,112,0,0,2,217,49,20,201,0,0,12,112,0,0, +47,32,0,76,4,222,152,12,64,0,151,30,82,198,12,64,0,180,91,0,195,14,32,0,195,108,22,242,123,0,0,181, +45,232,158,194,0,0,138,0,0,0,0,0,0,46,147,0,0,0,0,0,2,157,255,246,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,208,0,0,0,0,0,60,212,0,0,0,0,0,136, +138,0,0,0,0,0,211,78,16,0,0,0,4,224,14,80,0,0,0,9,144,9,176,0,0,0,14,255,255,241,0,0, +0,94,16,0,230,0,0,0,168,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,254,112,0,0,0,0,197,3,228,0,0,0,0, +197,0,198,0,0,0,0,197,4,226,0,0,0,0,207,255,177,0,0,0,0,197,2,171,0,0,0,0,197,0,78,0, +0,0,0,197,1,171,0,0,0,0,207,254,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,252,80,0,0,0,7,228,19,176,0, +0,0,30,96,0,0,0,0,0,79,16,0,0,0,0,0,95,0,0,0,0,0,0,79,16,0,0,0,0,0,31,80, +0,0,0,0,0,8,212,19,177,0,0,0,0,141,252,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,254,163,0,0,0,0,197,2,158, +32,0,0,0,197,0,11,160,0,0,0,197,0,6,224,0,0,0,197,0,4,240,0,0,0,197,0,6,208,0,0,0, +197,0,11,144,0,0,0,197,2,158,32,0,0,0,207,254,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,255,240,0,0,0,0,197, +0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,207,255,128,0,0,0,0,197,0,0,0,0, +0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,207,255,241,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,255,192,0,0,0, +0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,207,255,144,0,0,0,0,197,0,0, +0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,238,179, +0,0,0,5,230,17,90,0,0,0,29,96,0,0,0,0,0,79,0,0,0,0,0,0,93,0,159,251,0,0,0,79, +0,0,108,0,0,0,30,96,0,108,0,0,0,7,230,17,140,0,0,0,0,92,239,197,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,0, +9,128,0,0,0,197,0,9,128,0,0,0,197,0,9,128,0,0,0,197,0,9,128,0,0,0,207,255,255,128,0,0, +0,197,0,9,128,0,0,0,197,0,9,128,0,0,0,197,0,9,128,0,0,0,197,0,9,128,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0, +0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,212,0,0,0,0,0,0,213,0,0,0,0,0,0,213,0,0,0,0,0,0,213,0,0,0,0,0,0,213, +0,0,0,0,0,0,213,0,0,0,0,0,0,213,0,0,0,0,0,1,227,0,0,0,0,0,238,144,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,197,0,185,0,0,0,0,197,8,193,0,0,0,0,197,94,32,0,0,0,0,200,227,0,0,0,0,0, +204,209,0,0,0,0,0,198,201,0,0,0,0,0,197,46,80,0,0,0,0,197,5,226,0,0,0,0,197,0,155,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0, +0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,207,255, +176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,191,64,0,3,235,0,0,204,160,0,10,204,0,0,198,242,0,30,108,0,0,197,183,0, +121,92,0,0,197,93,0,211,92,0,0,197,14,69,192,92,0,0,197,8,171,96,92,0,0,197,2,254,16,92,0,0, +196,0,185,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,190,32,3,208,0,0,0,205,144,4,208,0,0,0,199,243,4,208,0,0,0,196, +155,4,208,0,0,0,196,30,68,208,0,0,0,196,8,196,208,0,0,0,196,1,233,208,0,0,0,196,0,111,208,0, +0,0,196,0,12,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,108,254,161,0,0,0,7,228,2,188,0,0,0,30,80,0,31,80,0, +0,63,0,0,11,112,0,0,78,0,0,10,144,0,0,63,0,0,12,112,0,0,31,64,0,31,48,0,0,9,211,2, +203,0,0,0,0,125,253,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,253,96,0,0,0,0,197,4,244,0,0,0,0,197,0,184,0, +0,0,0,197,0,183,0,0,0,0,197,5,243,0,0,0,0,207,252,80,0,0,0,0,197,0,0,0,0,0,0,197, +0,0,0,0,0,0,197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,254,145,0,0,0,7,228,2,188,0,0,0,30,80, +0,31,64,0,0,63,0,0,11,112,0,0,78,0,0,10,144,0,0,63,0,0,12,112,0,0,31,64,0,31,64,0, +0,9,211,2,203,0,0,0,0,141,253,174,113,0,0,0,0,0,3,169,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,254,128,0,0,0,0,197,3,229,0,0,0,0, +197,0,184,0,0,0,0,197,4,228,0,0,0,0,207,255,80,0,0,0,0,197,26,176,0,0,0,0,197,1,243,0, +0,0,0,197,0,169,0,0,0,0,197,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,222,161,0,0,0,0,47,65,118,0,0, +0,0,79,16,0,0,0,0,0,29,179,0,0,0,0,0,2,175,161,0,0,0,0,0,2,202,0,0,0,0,0,0, +93,0,0,0,0,119,17,185,0,0,0,0,42,238,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,255,255,160,0,0,0,0,63,0, +0,0,0,0,0,63,0,0,0,0,0,0,63,0,0,0,0,0,0,63,0,0,0,0,0,0,63,0,0,0,0,0, +0,63,0,0,0,0,0,0,63,0,0,0,0,0,0,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,0,5,192,0,0,0,213, +0,5,192,0,0,0,213,0,5,192,0,0,0,213,0,5,192,0,0,0,213,0,5,192,0,0,0,213,0,5,192,0, +0,0,183,0,8,160,0,0,0,110,65,78,80,0,0,0,7,222,198,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,0,0,153,0,0, +0,94,0,0,228,0,0,0,30,64,4,224,0,0,0,10,144,9,144,0,0,0,4,224,13,48,0,0,0,0,228,77, +0,0,0,0,0,153,136,0,0,0,0,0,78,211,0,0,0,0,0,13,192,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,0,7,208, +0,62,0,78,0,12,243,0,122,0,14,64,30,183,0,182,0,10,128,75,107,0,242,0,6,192,135,47,20,208,0,2, +241,196,13,72,128,0,0,198,224,9,140,64,0,0,141,176,5,222,0,0,0,79,112,1,234,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,16, +9,160,0,0,0,12,128,62,32,0,0,0,4,226,184,0,0,0,0,0,172,225,0,0,0,0,0,79,144,0,0,0, +0,0,186,226,0,0,0,0,5,208,170,0,0,0,0,29,80,47,48,0,0,0,124,0,9,176,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +153,0,12,112,0,0,0,63,32,78,16,0,0,0,10,144,183,0,0,0,0,3,228,225,0,0,0,0,0,174,112,0, +0,0,0,0,79,16,0,0,0,0,0,63,0,0,0,0,0,0,63,0,0,0,0,0,0,63,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,127,255,255,16,0,0,0,0,0,139,0,0,0,0,0,3,227,0,0,0,0,0,12,128,0,0,0,0,0,109, +0,0,0,0,0,2,228,0,0,0,0,0,10,160,0,0,0,0,0,78,16,0,0,0,0,0,143,255,255,48,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,160,0, +0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,0,0,0, +166,0,0,0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,0,0,0,166,0,0,0, +0,0,0,166,0,0,0,0,0,0,175,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197, +0,0,0,0,0,0,122,0,0,0,0,0,0,46,16,0,0,0,0,0,11,96,0,0,0,0,0,6,192,0,0,0, +0,0,1,226,0,0,0,0,0,0,167,0,0,0,0,0,0,77,0,0,0,0,0,0,14,48,0,0,0,0,0,9, +144,0,0,0,0,0,3,224,0,0,0,0,0,0,212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,95,224,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0, +0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0, +1,240,0,0,0,0,0,1,240,0,0,0,0,0,95,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,111,64,0,0,0,0,0,201,176,0,0,0,0,4,193,227,0,0,0,0,11, +96,138,0,0,0,0,46,16,46,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,255,255,254,0,0,0, +0,0,0,0,0,0,0,12,64,0,0,0,0,0,2,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,206, +177,0,0,0,0,11,49,184,0,0,0,0,0,0,122,0,0,0,0,6,223,250,0,0,0,0,62,48,122,0,0,0, +0,78,34,202,0,0,0,0,10,237,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,226,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0, +231,222,128,0,0,0,0,236,35,229,0,0,0,0,227,0,153,0,0,0,0,227,0,138,0,0,0,0,227,0,153,0, +0,0,0,236,35,228,0,0,0,0,230,238,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,206,177,0,0,0,0,30,113,102,0,0,0,0,78,0,0,0,0,0,0,108,0,0,0,0,0,0,78,0, +0,0,0,0,0,30,97,102,0,0,0,0,4,223,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,64,0,0,0,0,0,12,80,0,0,0,0,0,12, +80,0,0,0,3,206,141,80,0,0,0,13,113,143,80,0,0,0,62,0,12,80,0,0,0,93,0,12,80,0,0,0, +78,0,13,80,0,0,0,14,97,143,80,0,0,0,4,222,138,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,190,195,0,0,0,0,13,113,109,0,0,0,0,62,0,13,48,0,0,0,95,255,255,48,0, +0,0,77,0,0,0,0,0,0,29,113,0,0,0,0,0,3,206,255,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,206,80,0,0,0,0,8,161,16,0,0,0, +0,10,112,0,0,0,0,0,191,255,16,0,0,0,0,10,112,0,0,0,0,0,10,112,0,0,0,0,0,10,112,0, +0,0,0,0,10,112,0,0,0,0,0,10,112,0,0,0,0,0,10,112,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,5,223,255,32,0,0,0,30,50,212,0,0,0,0,61,0,151,0,0,0,0,30, +50,212,0,0,0,0,45,222,128,0,0,0,0,91,0,0,0,0,0,0,30,254,214,0,0,0,0,123,1,95,16,0, +0,0,154,17,110,0,0,0,0,43,238,195,0,0,0,0,0,0,0,0,0,0,0,226,0,0,0,0,0,0,227,0, +0,0,0,0,0,227,0,0,0,0,0,0,231,222,112,0,0,0,0,236,36,242,0,0,0,0,227,0,213,0,0,0, +0,227,0,197,0,0,0,0,227,0,197,0,0,0,0,227,0,197,0,0,0,0,226,0,181,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0, +14,48,0,0,0,0,0,0,0,0,0,0,0,0,14,32,0,0,0,0,0,14,48,0,0,0,0,0,14,48,0,0, +0,0,0,14,48,0,0,0,0,0,14,48,0,0,0,0,0,14,48,0,0,0,0,0,14,32,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,0,0,0, +0,0,0,213,0,0,0,0,0,0,0,0,0,0,0,0,0,196,0,0,0,0,0,0,196,0,0,0,0,0,0,196, +0,0,0,0,0,0,196,0,0,0,0,0,0,196,0,0,0,0,0,0,196,0,0,0,0,0,0,196,0,0,0,0, +0,0,212,0,0,0,0,0,1,226,0,0,0,0,0,78,144,0,0,0,0,0,0,0,0,0,0,0,0,226,0,0, +0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,227,10,160,0,0,0,0,227,156,16,0,0,0,0, +233,193,0,0,0,0,0,235,192,0,0,0,0,0,227,200,0,0,0,0,0,227,62,64,0,0,0,0,226,6,208,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,226, +0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0, +0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,226,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,222,101,222,80,0,0,236,38,252, +38,224,0,0,227,0,243,0,242,0,0,227,0,227,0,243,0,0,227,0,227,0,243,0,0,227,0,227,0,243,0,0, +226,0,226,0,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,222,112,0,0,0,0,236, +36,242,0,0,0,0,227,0,213,0,0,0,0,227,0,197,0,0,0,0,227,0,197,0,0,0,0,227,0,197,0,0, +0,0,226,0,181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,191,215,0,0,0, +0,13,129,78,80,0,0,0,78,0,8,160,0,0,0,92,0,7,176,0,0,0,78,0,9,144,0,0,0,30,113,78, +48,0,0,0,3,206,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,222,128,0, +0,0,0,236,35,229,0,0,0,0,227,0,153,0,0,0,0,227,0,138,0,0,0,0,227,0,153,0,0,0,0,236, +35,228,0,0,0,0,232,238,112,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,226,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,206, +154,64,0,0,0,13,113,143,80,0,0,0,62,0,12,80,0,0,0,93,0,12,80,0,0,0,78,0,13,80,0,0, +0,14,97,143,80,0,0,0,4,222,140,80,0,0,0,0,0,12,80,0,0,0,0,0,12,80,0,0,0,0,0,12, +64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +230,233,0,0,0,0,0,236,17,0,0,0,0,0,228,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0, +0,0,0,227,0,0,0,0,0,0,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,8,239,128,0,0,0,0,61,16,0,0,0,0,0,46,64,0,0,0,0,0,5,220,48,0,0,0,0,0,8, +192,0,0,0,0,0,7,192,0,0,0,0,111,252,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,96,0,0,0,0,0,10,112,0, +0,0,0,0,191,255,48,0,0,0,0,10,112,0,0,0,0,0,10,112,0,0,0,0,0,10,112,0,0,0,0,0, +10,112,0,0,0,0,0,9,145,16,0,0,0,0,3,222,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,226,0,196,0,0,0,0,242,0,197,0,0,0,0,242,0,197,0,0,0,0,242,0,197,0,0, +0,0,227,0,197,0,0,0,0,200,24,245,0,0,0,0,61,232,180,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,168,0,46,0,0,0,0,109,0,123,0,0,0,0,31,32,197,0,0,0,0,11,113,225, +0,0,0,0,5,198,160,0,0,0,0,1,253,80,0,0,0,0,0,174,16,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,137,0,153,0,136,0,0,77,0,221,0,197,0,0,31,34,206,33,225,0,0,11, +101,154,101,176,0,0,6,169,85,169,96,0,0,2,236,17,236,32,0,0,0,204,0,204,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,108,0,167,0,0,0,0,13,100,209,0,0,0,0,4,237,80,0,0,0, +0,0,222,0,0,0,0,0,6,204,112,0,0,0,0,30,68,225,0,0,0,0,138,0,169,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,0,46,0,0,0,0,93,0,123,0,0,0,0,30,48,198,0, +0,0,0,10,130,241,0,0,0,0,5,214,160,0,0,0,0,0,237,80,0,0,0,0,0,158,16,0,0,0,0,0, +122,0,0,0,0,0,0,198,0,0,0,0,0,2,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,255,176,0,0,0,0,0,11,112,0,0,0,0,0,93, +0,0,0,0,0,0,213,0,0,0,0,0,7,176,0,0,0,0,0,46,32,0,0,0,0,0,95,255,224,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,190,0, +0,0,0,0,2,225,0,0,0,0,0,3,208,0,0,0,0,0,3,192,0,0,0,0,0,7,160,0,0,0,0,0, +110,32,0,0,0,0,0,8,144,0,0,0,0,0,3,192,0,0,0,0,0,3,208,0,0,0,0,0,3,208,0,0, +0,0,0,2,224,0,0,0,0,0,0,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75, +0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0, +0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,91,0, +0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,75,0,0,0,0,0,0,0,0,0,0,0,0, +0,47,128,0,0,0,0,0,3,224,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,0,227,0, +0,0,0,0,0,95,32,0,0,0,0,0,198,0,0,0,0,0,0,240,0,0,0,0,0,1,240,0,0,0,0,0, +1,240,0,0,0,0,0,3,224,0,0,0,0,0,46,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,229,5,128,0,0,0,105,61,41,96,0,0,0,133, +5,235,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*Bitmap Raw Data end ---*/ +} diff --git a/src/comm_prot_parser.h b/src/comm_prot_parser.h new file mode 100644 index 0000000..b1c42fe --- /dev/null +++ b/src/comm_prot_parser.h @@ -0,0 +1,202 @@ +#ifndef COMM_PROT_PARSER_H_ +#define COMM_PROT_PARSER_H_ +#include +#include +#include + +#define __packed_ __attribute__((packed)) +#define CP_RESULT_NEED_MORE 0 +#define CP_RESULT_PACKET_READY 1 +#define CP_RESULT_ERROR_GENERAL -1 +#define CP_RESULT_ERROR_CSUM -2 +#define CP_RESULT_ERROR_PSIZE -3 +#define CP_RESULT_ERROR_SIZE -4 +#define CP_PREFIX_SIZE 4 + +typedef unsigned char byte_t; + +#pragma pack(push) +#pragma pack(1) +typedef struct cp_prefix_t { + cp_prefix_t(byte_t a, byte_t b, byte_t c, byte_t d) { + data[0] = a; + data[1] = b; + data[2] = c; + data[3] = d; + } + byte_t data[CP_PREFIX_SIZE]; +}__packed_ cp_prefix_t; +#pragma pack(pop) + +class comm_protocol_parser_c { +protected: + cp_prefix_t m_prefix; + uint16_t m_max_cmd_size; + byte_t* m_buffer; + uint16_t m_buffer_pos; + byte_t m_state; + uint16_t m_payload_size; + +public: + comm_protocol_parser_c(cp_prefix_t prefix = cp_prefix_t(0xAA, 0xBB,0x33, 0x44), + uint16_t max_cmd_size = 64) : + m_prefix(prefix), m_max_cmd_size(max_cmd_size) { + reset(); + m_buffer = (byte_t*) malloc(m_max_cmd_size); + } + + ~comm_protocol_parser_c() { + free(m_buffer); + } + + uint16_t get_expected_data_size() { + if (m_state <= (CP_PREFIX_SIZE+1)) + return 1; + else + return m_payload_size - m_buffer_pos; + } + + void reset() { + m_buffer_pos = 0; + m_state = 0; + m_payload_size = 0; + } + + byte_t csum(byte_t*data, int32_t size, const byte_t extra = 0) { + byte_t result = extra; + while (size > 0) { + result ^= *data; + data++; + size--; + } + return result; + } + + byte_t *get_packet_buffer() { + return m_buffer; + } + + uint16_t get_packet_size() { + if (m_state == (CP_PREFIX_SIZE + 3)) + return m_payload_size - 1; + else + return 0; + } + + uint16_t get_packet(void *data, uint16_t max_size) { + uint16_t size = get_packet_size(); + if ((max_size >= size) && (max_size > 0)) { + memcpy(data, m_buffer, size); + return size; + } else + return 0; + } + + int8_t post_data(byte_t *data, const uint16_t size) { + int8_t result = CP_RESULT_NEED_MORE; + if ((size > get_expected_data_size()) + || (m_buffer_pos > m_max_cmd_size)) + { + result = CP_RESULT_ERROR_SIZE; + } + else + { + if (m_state < CP_PREFIX_SIZE) { + if (*data == m_prefix.data[m_state]) { + m_state++; + } else + { + if (*data == m_prefix.data[0]) + m_state = 1; + else + result = CP_RESULT_ERROR_GENERAL; + } + } else + switch (m_state) { + case CP_PREFIX_SIZE: { + m_payload_size = *data; + m_state++; + break; + } + + case CP_PREFIX_SIZE + 1: { + m_payload_size = m_payload_size + (((uint16_t)(*data))<<8); + m_state++; + if (m_payload_size == 0 || m_payload_size > m_max_cmd_size) + result = CP_RESULT_ERROR_PSIZE; + break; + } + + + case CP_PREFIX_SIZE + 2: { + memcpy(&m_buffer[m_buffer_pos], data, size); + m_buffer_pos += size; + if (m_buffer_pos >= m_payload_size) { + if (csum(m_buffer, m_payload_size - 1) + == m_buffer[m_payload_size - 1]) { + m_state++; + result = CP_RESULT_PACKET_READY; + } else + result = CP_RESULT_ERROR_CSUM; + } + break; + } + default: { + result = CP_RESULT_ERROR_GENERAL; + break; + } + } + } + if (result < 0) + reset(); + return result; + } + + byte_t get_packet_extra() { + return CP_PREFIX_SIZE + 3; + } + + uint16_t create_packet(void *buffer, const uint16_t max_size, + const byte_t command, const void *data, const uint16_t data_size) { + if (max_size >= (data_size + 1 + get_packet_extra())) { + byte_t *bbuffer = (byte_t*) buffer; + memcpy(bbuffer, &m_prefix, CP_PREFIX_SIZE); + bbuffer += CP_PREFIX_SIZE; + *bbuffer = (data_size + 2) & 0xFF; + bbuffer++; + *bbuffer = ((data_size + 2) >> 8) & 0xFF; + bbuffer++; + byte_t *csum_buffer = bbuffer; + *bbuffer = command; + bbuffer++; + if (data_size > 0) { + memcpy(bbuffer, data, data_size); + bbuffer += data_size; + } + *bbuffer = csum(csum_buffer, data_size + 1); + return data_size + get_packet_extra() + 1; + } else + return 0; + } + + uint16_t create_packet(void *buffer, const uint16_t max_size, const void *data, + const uint16_t data_size) { + if (max_size >= (data_size + get_packet_extra())) { + byte_t *bbuffer = (byte_t*) buffer; + memcpy(bbuffer, &m_prefix, CP_PREFIX_SIZE); + bbuffer += CP_PREFIX_SIZE; + *bbuffer = (data_size + 1) & 0xFF; + bbuffer++; + *bbuffer = ((data_size + 1) >> 8) & 0xFF; + bbuffer++; + byte_t *csum_buffer = bbuffer; + memcpy(bbuffer, data, data_size); + bbuffer += data_size; + *bbuffer = csum(csum_buffer, data_size); + return data_size + get_packet_extra(); + } else + return 0; + } +}; + +#endif /* COMM_PROT_PARSER_H_ */ diff --git a/src/concurrency/Lock.cpp b/src/concurrency/Lock.cpp new file mode 100644 index 0000000..07f5a2e --- /dev/null +++ b/src/concurrency/Lock.cpp @@ -0,0 +1,23 @@ +#include "Lock.h" +#include + +namespace concurrency { + +Lock::Lock() +{ + handle = xSemaphoreCreateBinary(); + assert(handle); + assert(xSemaphoreGive(handle)); +} + +void Lock::lock() +{ + assert(xSemaphoreTake(handle, portMAX_DELAY)); +} + +void Lock::unlock() +{ + assert(xSemaphoreGive(handle)); +} + +} // namespace concurrency diff --git a/src/concurrency/Lock.h b/src/concurrency/Lock.h new file mode 100644 index 0000000..09877cc --- /dev/null +++ b/src/concurrency/Lock.h @@ -0,0 +1,33 @@ +#pragma once + +#include "../freertosinc.h" + +namespace concurrency { + +/** + * @brief Simple wrapper around FreeRTOS API for implementing a mutex lock + */ +class Lock +{ + public: + Lock(); + + Lock(const Lock &) = delete; + Lock &operator=(const Lock &) = delete; + + /// Locks the lock. + // + // Must not be called from an ISR. + void lock(); + + // Unlocks the lock. + // + // Must not be called from an ISR. + void unlock(); + + private: + SemaphoreHandle_t handle; + +}; + +} // namespace concurrency diff --git a/src/concurrency/LockGuard.cpp b/src/concurrency/LockGuard.cpp new file mode 100644 index 0000000..56e8ac8 --- /dev/null +++ b/src/concurrency/LockGuard.cpp @@ -0,0 +1,15 @@ +#include "LockGuard.h" + +namespace concurrency { + +LockGuard::LockGuard(Lock *lock) : lock(lock) +{ + lock->lock(); +} + +LockGuard::~LockGuard() +{ + lock->unlock(); +} + +} // namespace concurrency diff --git a/src/concurrency/LockGuard.h b/src/concurrency/LockGuard.h new file mode 100644 index 0000000..dc09f40 --- /dev/null +++ b/src/concurrency/LockGuard.h @@ -0,0 +1,23 @@ +#pragma once + +#include "Lock.h" + +namespace concurrency { + +/** + * @brief RAII lock guard + */ +class LockGuard +{ + public: + LockGuard(Lock *lock); + ~LockGuard(); + + LockGuard(const LockGuard &) = delete; + LockGuard &operator=(const LockGuard &) = delete; + + private: + Lock *lock; +}; + +} // namespace concurrency diff --git a/src/concurrency/NotifiedWorkerThread.cpp b/src/concurrency/NotifiedWorkerThread.cpp new file mode 100644 index 0000000..7785ecf --- /dev/null +++ b/src/concurrency/NotifiedWorkerThread.cpp @@ -0,0 +1,19 @@ +#include "NotifiedWorkerThread.h" + +namespace concurrency { + +/** + * Notify this thread so it can run + */ +void NotifiedWorkerThread::notify(uint32_t v, eNotifyAction action) +{ + xTaskNotify(taskHandle, v, action); +} + +void NotifiedWorkerThread::block() +{ + xTaskNotifyWait(0, // don't clear notification on entry + clearOnRead, ¬ification, portMAX_DELAY); // Wait forever +} + +} // namespace concurrency diff --git a/src/concurrency/NotifiedWorkerThread.h b/src/concurrency/NotifiedWorkerThread.h new file mode 100644 index 0000000..5ab5a58 --- /dev/null +++ b/src/concurrency/NotifiedWorkerThread.h @@ -0,0 +1,47 @@ +#pragma once + +#include "WorkerThread.h" + +namespace concurrency { + +/** + * @brief A worker thread that waits on a freertos notification + */ +class NotifiedWorkerThread : public WorkerThread +{ + public: + /** + * Notify this thread so it can run + */ + void notify(uint32_t v = 0, eNotifyAction action = eNoAction); + + /** + * Notify from an ISR + * + * This must be inline or IRAM_ATTR on ESP32 + */ + inline void notifyFromISR(BaseType_t *highPriWoken, uint32_t v = 0, eNotifyAction action = eNoAction) + { + xTaskNotifyFromISR(taskHandle, v, action, highPriWoken); + } + + protected: + /** + * The notification that was most recently used to wake the thread. Read from loop() + */ + uint32_t notification = 0; + + /** + * What notification bits should be cleared just after we read and return them in notification? + * + * Defaults to clear all of them. + */ + uint32_t clearOnRead = UINT32_MAX; + + /** + * A method that should block execution - either waiting ona queue/mutex or a "task notification" + */ + virtual void block(); +}; + +} // namespace concurrency diff --git a/src/concurrency/Periodic.h b/src/concurrency/Periodic.h new file mode 100644 index 0000000..e380eb3 --- /dev/null +++ b/src/concurrency/Periodic.h @@ -0,0 +1,26 @@ +#pragma once + +#include "PeriodicTask.h" + +namespace concurrency { + +/** + * @brief Periodically invoke a callback. This just provides C-style callback conventions + * rather than a virtual function - FIXME, remove? + */ +class Periodic : public PeriodicTask +{ + uint32_t (*callback)(); + + public: + // callback returns the period for the next callback invocation (or 0 if we should no longer be called) + Periodic(uint32_t (*_callback)()) : callback(_callback) {} + + protected: + void doTask() { + uint32_t p = callback(); + setPeriod(p); + } +}; + +} // namespace concurrency diff --git a/src/concurrency/PeriodicScheduler.cpp b/src/concurrency/PeriodicScheduler.cpp new file mode 100644 index 0000000..d2fa77f --- /dev/null +++ b/src/concurrency/PeriodicScheduler.cpp @@ -0,0 +1,35 @@ +#include "PeriodicScheduler.h" +#include "PeriodicTask.h" +#include "LockGuard.h" +#include "../timing.h" + +namespace concurrency { + +/// call this from loop +void PeriodicScheduler::loop() +{ + LockGuard lg(&lock); + + uint32_t now = timing::millis(); + for (auto t : tasks) { + if (t->period && (now - t->lastMsec) >= t->period) { + + t->doTask(); + t->lastMsec = now; + } + } +} + +void PeriodicScheduler::schedule(PeriodicTask *t) +{ + LockGuard lg(&lock); + tasks.insert(t); +} + +void PeriodicScheduler::unschedule(PeriodicTask *t) +{ + LockGuard lg(&lock); + tasks.erase(t); +} + +} // namespace concurrency diff --git a/src/concurrency/PeriodicScheduler.h b/src/concurrency/PeriodicScheduler.h new file mode 100644 index 0000000..943da17 --- /dev/null +++ b/src/concurrency/PeriodicScheduler.h @@ -0,0 +1,40 @@ +#pragma once + +#include "Lock.h" +#include +#include + +namespace concurrency { + +class PeriodicTask; + +/** + * @brief Runs all PeriodicTasks in the system. Currently called from main loop() + * but eventually should be its own thread blocked on a freertos timer. + */ +class PeriodicScheduler +{ + friend class PeriodicTask; + + /** + * This really should be some form of heap, and when the period gets changed on a task it should get + * rescheduled in that heap. Currently it is just a dumb array and everytime we run loop() we check + * _every_ tasks. If it was a heap we'd only have to check the first task. + */ + std::unordered_set tasks; + + // Protects the above variables. + Lock lock; + + public: + /// Run any next tasks which are due for execution + void loop(); + + private: + void schedule(PeriodicTask *t); + void unschedule(PeriodicTask *t); +}; + +extern PeriodicScheduler periodicScheduler; + +} // namespace concurrency diff --git a/src/concurrency/PeriodicTask.cpp b/src/concurrency/PeriodicTask.cpp new file mode 100644 index 0000000..40c6a4e --- /dev/null +++ b/src/concurrency/PeriodicTask.cpp @@ -0,0 +1,16 @@ +#include "PeriodicTask.h" +#include "Periodic.h" +#include "LockGuard.h" + +namespace concurrency { + +PeriodicScheduler periodicScheduler; + +PeriodicTask::PeriodicTask(uint32_t initialPeriod) : period(initialPeriod) {} + +void PeriodicTask::setup() +{ + periodicScheduler.schedule(this); +} + +} // namespace concurrency diff --git a/src/concurrency/PeriodicTask.h b/src/concurrency/PeriodicTask.h new file mode 100644 index 0000000..910c0df --- /dev/null +++ b/src/concurrency/PeriodicTask.h @@ -0,0 +1,56 @@ +#pragma once + +#include "PeriodicScheduler.h" +#include "timing.h" + +namespace concurrency { + +/** + * @brief A base class for tasks that want their doTask() method invoked periodically + * + * @todo currently just syntatic sugar for polling in loop (you must call .loop), but eventually + * generalize with the freertos scheduler so we can save lots of power by having everything either in + * something like this or triggered off of an irq. + */ +class PeriodicTask +{ + friend class PeriodicScheduler; + + uint32_t lastMsec = 0; + uint32_t period = 1; // call soon after creation + + public: + virtual ~PeriodicTask() { periodicScheduler.unschedule(this); } + + /** + * Constructor (will schedule with the global PeriodicScheduler) + */ + PeriodicTask(uint32_t initialPeriod = 1); + + /** + * MUST be be called once at startup (but after threading is running - i.e. not from a constructor) + */ + void setup(); + + /** + * Set a new period in msecs (can be called from doTask or elsewhere and the scheduler will cope) + * While zero this task is disabled and will not run + */ + void setPeriod(uint32_t p) + { + lastMsec = timing::millis(); // reset starting from now + period = p; + } + + uint32_t getPeriod() const { return period; } + + /** + * Syntatic sugar for suspending tasks + */ + void disable() { setPeriod(0); } + + protected: + virtual void doTask() = 0; +}; + +} // namespace concurrency diff --git a/src/concurrency/Thread.cpp b/src/concurrency/Thread.cpp new file mode 100644 index 0000000..6e4fddb --- /dev/null +++ b/src/concurrency/Thread.cpp @@ -0,0 +1,25 @@ +#include "Thread.h" +#include "timing.h" + +namespace concurrency { + +void Thread::start(const char *name, size_t stackSize, uint32_t priority, int8_t core) +{ + if(core<0) + { + auto r = xTaskCreate(callRun, name, stackSize, this, priority, &taskHandle); + assert(r == pdPASS); + } + else + { + auto r = xTaskCreatePinnedToCore(callRun, name, stackSize, this, priority, &taskHandle,core); + assert(r == pdPASS); + } +} + +void Thread::callRun(void *_this) +{ + ((Thread *)_this)->doRun(); +} + +} // namespace concurrency diff --git a/src/concurrency/Thread.h b/src/concurrency/Thread.h new file mode 100644 index 0000000..94aeaf2 --- /dev/null +++ b/src/concurrency/Thread.h @@ -0,0 +1,78 @@ +#pragma once + +#include "freertosinc.h" +#include "esp_task_wdt.h" + +namespace concurrency +{ + + /** + * @brief Base threading + */ + class Thread + { + protected: + TaskHandle_t taskHandle = NULL; + + /** + * set this to true to ask thread to cleanly exit asap + */ + volatile bool wantExit = false; + + public: + void start(const char *name, size_t stackSize = 1024, uint32_t priority = tskIDLE_PRIORITY, int8_t core=-1); + + virtual ~Thread() { vTaskDelete(taskHandle); } + + uint32_t getStackHighwaterMark() { return uxTaskGetStackHighWaterMark(taskHandle); } + + protected: + /** + * The method that will be called when start is called. + */ + virtual void doRun() = 0; + + /** + * All thread run methods must periodically call serviceWatchdog, or the system will declare them hung and panic. + * + * this only applies after startWatchdog() has been called. If you need to sleep for a long time call stopWatchdog() + */ + void serviceWatchdog() { esp_task_wdt_reset(); } + void startWatchdog() + { + auto r = esp_task_wdt_add(taskHandle); + assert(r == ESP_OK); + } + void stopWatchdog() + { + auto r = esp_task_wdt_delete(taskHandle); + assert(r == ESP_OK); + } + + private: + static void callRun(void *_this); + }; + + template + class ThreadFunctionTemplate : public Thread + { + public: + typedef void (T::*thread_func_t)(ThreadFunctionTemplate *thread); + + protected: + thread_func_t m_func; + T &m_owner; + + public: + ThreadFunctionTemplate(T &owner, thread_func_t func) : m_func(func), m_owner(owner) + { + } + + protected: + virtual void doRun() + { + (m_owner.*m_func)(this); + } + }; + +} // namespace concurrency diff --git a/src/concurrency/WorkerThread.cpp b/src/concurrency/WorkerThread.cpp new file mode 100644 index 0000000..8ea1e6a --- /dev/null +++ b/src/concurrency/WorkerThread.cpp @@ -0,0 +1,32 @@ +#include "WorkerThread.h" +#include "timing.h" + +namespace concurrency { + +void WorkerThread::doRun() +{ + startWatchdog(); + + while (!wantExit) { + stopWatchdog(); + block(); + startWatchdog(); + + // no need - startWatchdog is guaranteed to give us one full watchdog interval + // serviceWatchdog(); // Let our loop worker have one full watchdog interval (at least) to run + +#ifdef DEBUG_STACK + static uint32_t lastPrint = 0; + if (timing::millis() - lastPrint > 10 * 1000L) { + lastPrint = timing::millis(); + meshtastic::printThreadInfo("net"); + } +#endif + + loop(); + } + + stopWatchdog(); +} + +} // namespace concurrency diff --git a/src/concurrency/WorkerThread.h b/src/concurrency/WorkerThread.h new file mode 100644 index 0000000..66111e7 --- /dev/null +++ b/src/concurrency/WorkerThread.h @@ -0,0 +1,29 @@ +#pragma once + +#include "Thread.h" + +namespace concurrency { + +/** + * @brief This wraps threading (FreeRTOS for now) with a blocking API intended for efficiently converting + * old-school arduino loop() code. Use as a mixin base class for the classes you want to convert. + * + * @link https://www.freertos.org/RTOS_Task_Notification_As_Mailbox.html + */ +class WorkerThread : public Thread +{ + protected: + /** + * A method that should block execution - either waiting ona queue/mutex or a "task notification" + */ + virtual void block() = 0; + + virtual void loop() = 0; + + /** + * The method that will be called when start is called. + */ + virtual void doRun(); +}; + +} // namespace concurrency diff --git a/src/config.h b/src/config.h new file mode 100644 index 0000000..6c806bd --- /dev/null +++ b/src/config.h @@ -0,0 +1,181 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#include +#include +#include + +#define ARDUINOJSON_USE_DOUBLE 1 + +#define DEBUG_PORT Serial // Serial debug port +#ifdef DEBUG_PORT +extern SemaphoreHandle_t debugLock; +#define DEBUG_MSG(...) ({xSemaphoreTake(debugLock, portMAX_DELAY); DEBUG_PORT.printf(__VA_ARGS__); xSemaphoreGive(debugLock);}) +#define LOCK_DEBUG_PORT() (xSemaphoreTake(debugLock, portMAX_DELAY)) +#define UNLOCK_DEBUG_PORT() (xSemaphoreGive(debugLock)) +#else +#define DEBUG_MSG(...) +#define LOCK_DEBUG_PORT() +#define UNLOCK_DEBUG_PORT() +#endif + +#define xstr(s) ssstr(s) +#define ssstr(s) #s + +//AD_V100 - Lora RF95 +//#define AD_V100 + +//AD_V100 - Lora SX1262 +//#define AD_V101 + +#define APP_WATCHDOG_SECS_INIT 70 +#define APP_WATCHDOG_SECS_WORK 15 + +#define GPS_BAUDRATE 9600 +#define GPS_BAUDRATE2 115200 +#define GPS_FREQ 2 +#define LORA_SEND_LOCATION_PERIOD 10000 + +#define AC_WIRE Wire1 +#define AC_ADDRESS 0x68 + +#define FLIP_SCREEN_VERTICALLY +#define FS SPIFFS +#define SCK_GPIO 5 +#define MISO_GPIO 19 +#define MOSI_GPIO 27 +#define NSS_GPIO 18 +#define RESET_GPIO 14 + +#define GPS_SERIAL_NUM 1 +#define GPS_RX_PIN 34 +#define GPS_TX_PIN 12 + +#define RF95_IRQ_GPIO 26 +#define PMU_IRQ 35 +#define SSD1306_ADDRESS 0x3C + +#define I2C_SDA 21 +#define I2C_SCL 22 + +#define I2C2_SDA 0 +#define I2C2_SCL 4 + +#define BUTTON_PIN 38 // The middle button GPIO on the T-Beam +#define VIBRO_PIN 7 +#define VIBRO_PIN2 3 + +#define SX1262_E22 + +#define SX1262_IRQ 33 +#define SX1262_RST 23 +#define SX1262_BUSY 32 +#define SX1262_MAXPOWER 22 + +#define LORA_BW 500.0 +#define LORA_SF 8 +#define LORA_CR 7 +#define LORA_FREQ 912.0 +#define LORA_PRE 8 +#define LORA_SYNC 0x64 +#define LORA_POWER 17 + +#define AGD_LORA_BW 125.0 +#define AGD_LORA_SF 10 +#define AGD_LORA_CR 7 +#define AGD_LORA_FREQ 915.0 +#define AGD_LORA_PRE 8 +#define AGD_LORA_SYNC 0x31 + +#ifdef AD_V100 +#undef USE_SX1262 +#define HAS_AXP20X 1 +#define HAS_GPS 1 +#endif + +#ifdef AD_V101 +#define USE_SX1262 +#undef LORA_POWER +#define LORA_POWER SX1262_MAXPOWER +#define HAS_AXP20X 1 +#define HAS_GPS 1 +#define LORA_CURRENT 140 +#endif + +#ifdef AD_LORA32_V1 +#undef USE_SX1262 +#undef PMU_IRQ +#define HAS_GPS +#define AT_CAN_SLEEP +#undef GPS_FREQ +#define GPS_FREQ 1 + +#define LORA_SCK 5 +#define LORA_MISO 19 +#define LORA_MOSI 27 +#define LORA_CS 18 +#define LORA_RST 14 +#define LORA_IRQ 26 +#define LORA_CURRENT 240 + +#define BATTERY_PIN 39 +#define LED_PIN -1 +#undef I2C_SCL +#define I2C_SCL 19 +#endif + +#ifdef AD_NOSCREEN +#define AD_BLE_NO_CLIENT +#endif + +#define SPI_DISP_SCK 2 +#define SPI_DISP_MISO 13 +#define SPI_DISP_MOSI 14 +#define SPI_DISP_CS 25 +#define SPI_DISP_RESET 4 + +#ifndef AD_NOSCREEN +#define USE_SCREEN_EVE 1 +#endif + +#define DW1000_IRQ 15 +#define DW1000_RST 4 +#define DW1000_CS 5 + +#define PSENSOR_PIN 36 + +#define BTN1_PIN 0 +#define BTN2_PIN 2 +#define BTN3_PIN 1 +#define BTN4_PIN 15 +#define BTN5_PIN 6 +#define BTN6_PIN 14 + +#define SIDE_BUTTONS_COUNT 6 + +#define GNSS_DBD_FILENAME "/config/gnss.dat" +#define MAIN_CONFIG_FILENAME "/config/main.json" +#define NET_CONFIG_FILENAME "/config/network.json" +#define AGD_NET_CONFIG_FILENAME "/config/agdnet.json" + +#define DEFAULT_TZ "EST5EDT,M3.2.0,M11.1.0" + +//Packet Prefix +#define SERIAL_APP_1 0x85 +#define SERIAL_APP_2 0x3B +#define SERIAL_APP_3 0xDE +#define SERIAL_APP_4 0x02 +#define MAX_SERIAL_PACKET_SIZE 4200 + +#define SERIAL_PROG_MODE_SIG1 0x92 +#define SERIAL_PROG_MODE_SIG2 0x5A + +#define SERIAL_PROG_MODE_RESP 0x07 + +#define SERIAL_PROG Serial +#define SCREEN_FLASH_META_FILE "/spiffs/sflash.json" +#define SCREEN_FLASH_META_BINARY_FILE "/spiffs/sflash.dat" +#define SCREEN_FLASH_META_FILE_PATH "/spiffs/" +#define AT_POINTS_FILE_TEMPLATE "/spiffs/p_%s.json" + +#endif \ No newline at end of file diff --git a/src/dwm1000/DW1000Ng.cpp b/src/dwm1000/DW1000Ng.cpp new file mode 100644 index 0000000..3771a80 --- /dev/null +++ b/src/dwm1000/DW1000Ng.cpp @@ -0,0 +1,2153 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +/* + * Copyright (c) 2015 by Thomas Trojer + * Decawave DW1000Ng library for arduino. + * + * 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. + * + * @file DW1000Ng.cpp + * Arduino driver library (source file) for the Decawave DW1000Ng UWB transceiver Module. + */ + +#include +#include +#include +#if defined(__AVR__) + #include +#endif +#include "DW1000Ng.hpp" +#include "DW1000NgUtils.hpp" +#include "DW1000NgConstants.hpp" +#include "DW1000NgRegisters.hpp" +#include "SPIporting.hpp" + +namespace DW1000Ng { + + /* anonymous namespace to host private-like variables and methods */ + namespace { + + /* ########################### PRIVATE VARIABLES ################################# */ + + /* SPI select pin and interrupt pin*/ + uint8_t _ss = 0xff; + uint8_t _irq = 0xff; + uint8_t _rst = 0xff; + Adafruit_MCP23017 *m_expander = NULL; + + /* IRQ callbacks */ + void (* _handleSent)(void) = nullptr; + void (* _handleError)(void) = nullptr; + void (* _handleReceived)(void) = nullptr; + void (* _handleReceiveFailed)(void) = nullptr; + void (* _handleReceiveTimeout)(void) = nullptr; + void (* _handleReceiveTimestampAvailable)(void) = nullptr; + + /* registers */ + byte _syscfg[LEN_SYS_CFG]; + byte _sysctrl[LEN_SYS_CTRL]; + byte _sysstatus[LEN_SYS_STATUS]; + byte _txfctrl[LEN_TX_FCTRL]; + byte _sysmask[LEN_SYS_MASK]; + byte _chanctrl[LEN_CHAN_CTRL]; + byte _networkAndAddress[LEN_PANADR]; + + /* Temperature and Voltage monitoring */ + byte _vmeas3v3 = 0; + byte _tmeas23C = 0; + + /* Driver Internal State Trackers */ + byte _extendedFrameLength; + PacSize _pacSize; + PulseFrequency _pulseFrequency; + DataRate _dataRate; + PreambleLength _preambleLength; + PreambleCode _preambleCode; + Channel _channel; + boolean _smartPower; + boolean _frameCheck; + boolean _debounceClockEnabled = false; + boolean _nlos = false; + boolean _standardSFD = true; + boolean _autoTXPower = true; + boolean _autoTCPGDelay = true; + boolean _wait4resp = false; + uint16_t _antennaTxDelay = 0; + uint16_t _antennaRxDelay = 0; + + /* ############################# PRIVATE METHODS ################################### */ + + /* + * Write bytes to the DW1000. Single bytes can be written to registers via sub-addressing. + * @param[in] cmd + * The register address (see Chapter 7 in the DW1000 user manual). + * @param[in] offset + * The offset to select register sub-parts for writing, or 0x00 to disable + * sub-adressing. + * @param[in] data + * The data array to be written. + * @param[in] data_size + * The number of bytes to be written (take care not to go out of bounds of + * the register). + */ + // TODO offset really bigger than byte? + void _writeBytesToRegister(byte cmd, uint16_t offset, byte data[], uint16_t data_size) { + byte header[3]; + uint8_t headerLen = 1; + + // TODO proper error handling: address out of bounds + // build SPI header + if(offset == NO_SUB) { + header[0] = WRITE | cmd; + } else { + header[0] = WRITE_SUB | cmd; + if(offset < 128) { + header[1] = (byte)offset; + headerLen++; + } else { + header[1] = RW_SUB_EXT | (byte)offset; + header[2] = (byte)(offset >> 7); + headerLen += 2; + } + } + + SPIporting::writeToSPI(_ss, headerLen, header, data_size, data); + } + + /* + * Write Value in Hex or Int format to the DW1000. Single Value can be written to registers via sub-addressing. + * @param[in] cmd + * The register address (see Chapter 7 in the DW1000 user manual). + * @param[in] offset + * The offset to select register sub-parts for writing, or 0x00 to disable + * sub-adressing. + * @param[in] data + * The data Value to be written. + * @param[in] data_size + * The number of bytes to be written + */ + void _writeValueToRegister(byte cmd, uint16_t offset, uint32_t data, uint16_t data_size) { + byte dataBytes[data_size]; + DW1000NgUtils::writeValueToBytes(dataBytes, data, data_size); + _writeBytesToRegister(cmd, offset, dataBytes, data_size); + } + + /* + * Write ONLY ONE bytes to the DW1000. + * @param[in] cmd + * The register address (see Chapter 7 in the DW1000 user manual). + * @param[in] offset + * The offset to select register sub-parts for writing, or 0x00 to disable + * sub-adressing. + * @param[in] data + * The Byte to be written. + */ + void _writeSingleByteToRegister(byte cmd, uint16_t offset, byte data) { + _writeBytesToRegister(cmd, offset, &data, 1); // 1 as data_size because writes a single byte + } + + /* + * Read bytes from the DW1000. Number of bytes depend on register length. + * @param[in] cmd + * The register address (see Chapter 7 in the DW1000Ng user manual). + * @param[in] offset + * The number of bytes expected to be received. + * @param[out] data + * The data array to be read into. + * @param[in] data_size + * The number of bytes to be read. example-> 2 Bytes = 2 as input + */ + void _readBytesFromRegister(byte cmd, uint16_t offset, byte data[], uint16_t data_size) { + byte header[3]; + uint8_t headerLen = 1; + + // build SPI header + if(offset == NO_SUB) { + header[0] = READ | cmd; + } else { + header[0] = READ_SUB | cmd; + if(offset < 128) { + header[1] = (byte)offset; + headerLen++; + } else { + header[1] = RW_SUB_EXT | (byte)offset; + header[2] = (byte)(offset >> 7); + headerLen += 2; + } + } + + SPIporting::readFromSPI(_ss, headerLen, header, data_size, data); + } + + /* + * Write ONLY ONE bit, in a specific register, to the DW1000. + * @param[in] bitRegister + * The register address of the selected bit (see Chapter 7 in the DW1000 user manual). + * @param[in] RegisterOffset + * The offset to select register sub-parts for writing, or 0x00 to disable sub-adressing. + * @param[in] bitRegister_LEN + * The lenght of the register to be written + * @param[in] selectedBit + * The position(in Int or Hex) of the bit in the register + * @param[in] value + * The value of the bit to set. It, obviously, can be true/false or 1/0 + */ + void _writeBitToRegister(byte bitRegister, uint16_t RegisterOffset, uint16_t bitRegister_LEN, uint16_t selectedBit, boolean value) { + uint16_t idx; + uint8_t bitPosition; + + idx = selectedBit/8; + if(idx >= bitRegister_LEN) { + return; // TODO proper error handling: out of bounds + } + byte targetByte; memset(&targetByte, 0, 1); + bitPosition = selectedBit%8; + _readBytesFromRegister(bitRegister, RegisterOffset+idx, &targetByte, 1); + + value ? bitSet(targetByte, bitPosition) : bitClear(targetByte, bitPosition); + + if(RegisterOffset == NO_SUB) + RegisterOffset = 0x00; + + _writeBytesToRegister(bitRegister, RegisterOffset+idx, &targetByte, 1); + } + + // always 4 bytes + // TODO why always 4 bytes? can be different, see p. 58 table 10 otp memory map + void _readBytesOTP(uint16_t address, byte data[]) { + byte addressBytes[LEN_OTP_ADDR]; + + // p60 - 6.3.3 Reading a value from OTP memory + // bytes of address + addressBytes[0] = (address & 0xFF); + addressBytes[1] = ((address >> 8) & 0xFF); + // set address + _writeBytesToRegister(OTP_IF, OTP_ADDR_SUB, addressBytes, LEN_OTP_ADDR); + // switch into read mode + _writeSingleByteToRegister(OTP_IF, OTP_CTRL_SUB, 0x03); // OTPRDEN | OTPREAD + _writeSingleByteToRegister(OTP_IF, OTP_CTRL_SUB, 0x01); // OTPRDEN + // read value/block - 4 bytes + _readBytesFromRegister(OTP_IF, OTP_RDAT_SUB, data, LEN_OTP_RDAT); + // end read mode + _writeSingleByteToRegister(OTP_IF, OTP_CTRL_SUB, 0x00); + } + + void _enableClock(byte clock) { + byte pmscctrl0[LEN_PMSC_CTRL0]; + memset(pmscctrl0, 0, LEN_PMSC_CTRL0); + _readBytesFromRegister(PMSC, PMSC_CTRL0_SUB, pmscctrl0, LEN_PMSC_CTRL0); + if(clock == SYS_AUTO_CLOCK) { + pmscctrl0[0] = SYS_AUTO_CLOCK; + pmscctrl0[1] &= 0xFE; + } else if(clock == SYS_XTI_CLOCK) { + pmscctrl0[0] &= 0xFC; + pmscctrl0[0] |= SYS_XTI_CLOCK; + } else if(clock == SYS_PLL_CLOCK) { + pmscctrl0[0] &= 0xFC; + pmscctrl0[0] |= SYS_PLL_CLOCK; + } else if (clock == TX_PLL_CLOCK) { + pmscctrl0[0] &= 0xCF; + pmscctrl0[0] |= TX_PLL_CLOCK; + } else if (clock == LDE_CLOCK) { + pmscctrl0[0] = SYS_XTI_CLOCK; + pmscctrl0[1] = 0x03; + } else { + // TODO deliver proper warning + } + _writeBytesToRegister(PMSC, PMSC_CTRL0_SUB, pmscctrl0, 2); + } + + /* Steps used to get Temp and Voltage */ + void _vbatAndTempSteps() { + byte step1 = 0x80; _writeBytesToRegister(RF_CONF, 0x11, &step1, 1); + byte step2 = 0x0A; _writeBytesToRegister(RF_CONF, 0x12, &step2, 1); + byte step3 = 0x0F; _writeBytesToRegister(RF_CONF, 0x12, &step3, 1); + byte step4 = 0x01; _writeBytesToRegister(TX_CAL, NO_SUB, &step4, 1); + byte step5 = 0x00; _writeBytesToRegister(TX_CAL, NO_SUB, &step5, 1); + } + + /* AGC_TUNE1 - reg:0x23, sub-reg:0x04, table 24 */ + void _agctune1() { + byte agctune1[LEN_AGC_TUNE1]; + if(_pulseFrequency == PulseFrequency::FREQ_16MHZ) { + DW1000NgUtils::writeValueToBytes(agctune1, 0x8870, LEN_AGC_TUNE1); + } else if(_pulseFrequency == PulseFrequency::FREQ_64MHZ) { + DW1000NgUtils::writeValueToBytes(agctune1, 0x889B, LEN_AGC_TUNE1); + } else { + // TODO proper error/warning handling + } + _writeBytesToRegister(AGC_TUNE, AGC_TUNE1_SUB, agctune1, LEN_AGC_TUNE1); + } + + /* AGC_TUNE2 - reg:0x23, sub-reg:0x0C, table 25 */ + void _agctune2() { + byte agctune2[LEN_AGC_TUNE2]; + DW1000NgUtils::writeValueToBytes(agctune2, 0x2502A907L, LEN_AGC_TUNE2); + _writeBytesToRegister(AGC_TUNE, AGC_TUNE2_SUB, agctune2, LEN_AGC_TUNE2); + } + + /* AGC_TUNE3 - reg:0x23, sub-reg:0x12, table 26 */ + void _agctune3() { + byte agctune3[LEN_AGC_TUNE3]; + DW1000NgUtils::writeValueToBytes(agctune3, 0x0035, LEN_AGC_TUNE3); + _writeBytesToRegister(AGC_TUNE, AGC_TUNE3_SUB, agctune3, LEN_AGC_TUNE3); + } + + /* DRX_TUNE0b - reg:0x27, sub-reg:0x02, table 30 */ + void _drxtune0b() { + byte drxtune0b[LEN_DRX_TUNE0b]; + if(_dataRate == DataRate::RATE_110KBPS) { + if(!_standardSFD) { + DW1000NgUtils::writeValueToBytes(drxtune0b, 0x0016, LEN_DRX_TUNE0b); + } else { + DW1000NgUtils::writeValueToBytes(drxtune0b, 0x000A, LEN_DRX_TUNE0b); + } + } else if(_dataRate == DataRate::RATE_850KBPS) { + if(!_standardSFD) { + DW1000NgUtils::writeValueToBytes(drxtune0b, 0x0006, LEN_DRX_TUNE0b); + } else { + DW1000NgUtils::writeValueToBytes(drxtune0b, 0x0001, LEN_DRX_TUNE0b); + } + } else if(_dataRate == DataRate::RATE_6800KBPS) { + if(!_standardSFD) { + DW1000NgUtils::writeValueToBytes(drxtune0b, 0x0002, LEN_DRX_TUNE0b); + } else { + DW1000NgUtils::writeValueToBytes(drxtune0b, 0x0001, LEN_DRX_TUNE0b); + } + } else { + // TODO proper error/warning handling + } + _writeBytesToRegister(DRX_TUNE, DRX_TUNE0b_SUB, drxtune0b, LEN_DRX_TUNE0b); + } + + /* DRX_TUNE1a - reg:0x27, sub-reg:0x04, table 31 */ + void _drxtune1a() { + byte drxtune1a[LEN_DRX_TUNE1a]; + if(_pulseFrequency == PulseFrequency::FREQ_16MHZ) { + DW1000NgUtils::writeValueToBytes(drxtune1a, 0x0087, LEN_DRX_TUNE1a); + } else if(_pulseFrequency == PulseFrequency::FREQ_64MHZ) { + DW1000NgUtils::writeValueToBytes(drxtune1a, 0x008D, LEN_DRX_TUNE1a); + } else { + // TODO proper error/warning handling + } + _writeBytesToRegister(DRX_TUNE, DRX_TUNE1a_SUB, drxtune1a, LEN_DRX_TUNE1a); + } + + /* DRX_TUNE1b - reg:0x27, sub-reg:0x06, table 32 */ + void _drxtune1b() { + byte drxtune1b[LEN_DRX_TUNE1b]; + if(_preambleLength == PreambleLength::LEN_1536 || _preambleLength == PreambleLength::LEN_2048 || + _preambleLength == PreambleLength::LEN_4096) { + if(_dataRate == DataRate::RATE_110KBPS) { + DW1000NgUtils::writeValueToBytes(drxtune1b, 0x0064, LEN_DRX_TUNE1b); + } else { + // TODO proper error/warning handling + } + } else if(_preambleLength != PreambleLength::LEN_64) { + if(_dataRate == DataRate::RATE_850KBPS || _dataRate == DataRate::RATE_6800KBPS) { + DW1000NgUtils::writeValueToBytes(drxtune1b, 0x0020, LEN_DRX_TUNE1b); + } else { + // TODO proper error/warning handling + } + } else { + if(_dataRate == DataRate::RATE_6800KBPS) { + DW1000NgUtils::writeValueToBytes(drxtune1b, 0x0010, LEN_DRX_TUNE1b); + } else { + // TODO proper error/warning handling + } + } + _writeBytesToRegister(DRX_TUNE, DRX_TUNE1b_SUB, drxtune1b, LEN_DRX_TUNE1b); + } + + /* DRX_TUNE2 - reg:0x27, sub-reg:0x08, table 33 */ + void _drxtune2() { + byte drxtune2[LEN_DRX_TUNE2]; + if(_pacSize == PacSize::SIZE_8) { + if(_pulseFrequency == PulseFrequency::FREQ_16MHZ) { + DW1000NgUtils::writeValueToBytes(drxtune2, 0x311A002DL, LEN_DRX_TUNE2); + } else if(_pulseFrequency == PulseFrequency::FREQ_64MHZ) { + DW1000NgUtils::writeValueToBytes(drxtune2, 0x313B006BL, LEN_DRX_TUNE2); + } else { + // TODO proper error/warning handling + } + } else if(_pacSize == PacSize::SIZE_16) { + if(_pulseFrequency == PulseFrequency::FREQ_16MHZ) { + DW1000NgUtils::writeValueToBytes(drxtune2, 0x331A0052L, LEN_DRX_TUNE2); + } else if(_pulseFrequency == PulseFrequency::FREQ_64MHZ) { + DW1000NgUtils::writeValueToBytes(drxtune2, 0x333B00BEL, LEN_DRX_TUNE2); + } else { + // TODO proper error/warning handling + } + } else if(_pacSize == PacSize::SIZE_32) { + if(_pulseFrequency == PulseFrequency::FREQ_16MHZ) { + DW1000NgUtils::writeValueToBytes(drxtune2, 0x351A009AL, LEN_DRX_TUNE2); + } else if(_pulseFrequency == PulseFrequency::FREQ_64MHZ) { + DW1000NgUtils::writeValueToBytes(drxtune2, 0x353B015EL, LEN_DRX_TUNE2); + } else { + // TODO proper error/warning handling + } + } else if(_pacSize == PacSize::SIZE_64) { + if(_pulseFrequency == PulseFrequency::FREQ_16MHZ) { + DW1000NgUtils::writeValueToBytes(drxtune2, 0x371A011DL, LEN_DRX_TUNE2); + } else if(_pulseFrequency == PulseFrequency::FREQ_64MHZ) { + DW1000NgUtils::writeValueToBytes(drxtune2, 0x373B0296L, LEN_DRX_TUNE2); + } else { + // TODO proper error/warning handling + } + } else { + // TODO proper error/warning handling + } + _writeBytesToRegister(DRX_TUNE, DRX_TUNE2_SUB, drxtune2, LEN_DRX_TUNE2); + } + + /* DRX_TUNE4H - reg:0x27, sub-reg:0x26, table 34 */ + void _drxtune4H() { + byte drxtune4H[LEN_DRX_TUNE4H]; + if(_preambleLength == PreambleLength::LEN_64) { + DW1000NgUtils::writeValueToBytes(drxtune4H, 0x0010, LEN_DRX_TUNE4H); + } else { + DW1000NgUtils::writeValueToBytes(drxtune4H, 0x0028, LEN_DRX_TUNE4H); + } + _writeBytesToRegister(DRX_TUNE, DRX_TUNE4H_SUB, drxtune4H, LEN_DRX_TUNE4H); + } + + /* LDE_CFG1 - reg 0x2E, sub-reg:0x0806 */ + void _ldecfg1() { + byte ldecfg1[LEN_LDE_CFG1]; + _nlos == true ? DW1000NgUtils::writeValueToBytes(ldecfg1, 0x7, LEN_LDE_CFG1) : DW1000NgUtils::writeValueToBytes(ldecfg1, 0xD, LEN_LDE_CFG1); + _writeBytesToRegister(LDE_IF, LDE_CFG1_SUB, ldecfg1, LEN_LDE_CFG1); + } + + /* LDE_CFG2 - reg 0x2E, sub-reg:0x1806, table 50 */ + void _ldecfg2() { + byte ldecfg2[LEN_LDE_CFG2]; + if(_pulseFrequency == PulseFrequency::FREQ_16MHZ) { + _nlos == true ? DW1000NgUtils::writeValueToBytes(ldecfg2, 0x0003, LEN_LDE_CFG2) : DW1000NgUtils::writeValueToBytes(ldecfg2, 0x1607, LEN_LDE_CFG2); + } else if(_pulseFrequency == PulseFrequency::FREQ_64MHZ) { + DW1000NgUtils::writeValueToBytes(ldecfg2, 0x0607, LEN_LDE_CFG2); + } else { + // TODO proper error/warning handling + } + _writeBytesToRegister(LDE_IF, LDE_CFG2_SUB, ldecfg2, LEN_LDE_CFG2); + } + + /* LDE_REPC - reg 0x2E, sub-reg:0x2804, table 51 */ + void _lderepc() { + byte lderepc[LEN_LDE_REPC]; + if(_preambleCode == PreambleCode::CODE_1 || _preambleCode == PreambleCode::CODE_2) { + if(_dataRate == DataRate::RATE_110KBPS) { + DW1000NgUtils::writeValueToBytes(lderepc, ((0x5998 >> 3) & 0xFFFF), LEN_LDE_REPC); + } else { + DW1000NgUtils::writeValueToBytes(lderepc, 0x5998, LEN_LDE_REPC); + } + } else if(_preambleCode == PreambleCode::CODE_3 || _preambleCode == PreambleCode::CODE_8) { + if(_dataRate == DataRate::RATE_110KBPS) { + DW1000NgUtils::writeValueToBytes(lderepc, ((0x51EA >> 3) & 0xFFFF), LEN_LDE_REPC); + } else { + DW1000NgUtils::writeValueToBytes(lderepc, 0x51EA, LEN_LDE_REPC); + } + } else if(_preambleCode == PreambleCode::CODE_4) { + if(_dataRate == DataRate::RATE_110KBPS) { + DW1000NgUtils::writeValueToBytes(lderepc, ((0x428E >> 3) & 0xFFFF), LEN_LDE_REPC); + } else { + DW1000NgUtils::writeValueToBytes(lderepc, 0x428E, LEN_LDE_REPC); + } + } else if(_preambleCode == PreambleCode::CODE_5) { + if(_dataRate == DataRate::RATE_110KBPS) { + DW1000NgUtils::writeValueToBytes(lderepc, ((0x451E >> 3) & 0xFFFF), LEN_LDE_REPC); + } else { + DW1000NgUtils::writeValueToBytes(lderepc, 0x451E, LEN_LDE_REPC); + } + } else if(_preambleCode == PreambleCode::CODE_6) { + if(_dataRate == DataRate::RATE_110KBPS) { + DW1000NgUtils::writeValueToBytes(lderepc, ((0x2E14 >> 3) & 0xFFFF), LEN_LDE_REPC); + } else { + DW1000NgUtils::writeValueToBytes(lderepc, 0x2E14, LEN_LDE_REPC); + } + } else if(_preambleCode == PreambleCode::CODE_7) { + if(_dataRate == DataRate::RATE_110KBPS) { + DW1000NgUtils::writeValueToBytes(lderepc, ((0x8000 >> 3) & 0xFFFF), LEN_LDE_REPC); + } else { + DW1000NgUtils::writeValueToBytes(lderepc, 0x8000, LEN_LDE_REPC); + } + } else if(_preambleCode == PreambleCode::CODE_9) { + if(_dataRate == DataRate::RATE_110KBPS) { + DW1000NgUtils::writeValueToBytes(lderepc, ((0x28F4 >> 3) & 0xFFFF), LEN_LDE_REPC); + } else { + DW1000NgUtils::writeValueToBytes(lderepc, 0x28F4, LEN_LDE_REPC); + } + } else if(_preambleCode == PreambleCode::CODE_10 || _preambleCode == PreambleCode::CODE_17) { + if(_dataRate == DataRate::RATE_110KBPS) { + DW1000NgUtils::writeValueToBytes(lderepc, ((0x3332 >> 3) & 0xFFFF), LEN_LDE_REPC); + } else { + DW1000NgUtils::writeValueToBytes(lderepc, 0x3332, LEN_LDE_REPC); + } + } else if(_preambleCode == PreambleCode::CODE_11) { + if(_dataRate == DataRate::RATE_110KBPS) { + DW1000NgUtils::writeValueToBytes(lderepc, ((0x3AE0 >> 3) & 0xFFFF), LEN_LDE_REPC); + } else { + DW1000NgUtils::writeValueToBytes(lderepc, 0x3AE0, LEN_LDE_REPC); + } + } else if(_preambleCode == PreambleCode::CODE_12) { + if(_dataRate == DataRate::RATE_110KBPS) { + DW1000NgUtils::writeValueToBytes(lderepc, ((0x3D70 >> 3) & 0xFFFF), LEN_LDE_REPC); + } else { + DW1000NgUtils::writeValueToBytes(lderepc, 0x3D70, LEN_LDE_REPC); + } + } else if(_preambleCode == PreambleCode::CODE_18 || _preambleCode == PreambleCode::CODE_19) { + if(_dataRate == DataRate::RATE_110KBPS) { + DW1000NgUtils::writeValueToBytes(lderepc, ((0x35C2 >> 3) & 0xFFFF), LEN_LDE_REPC); + } else { + DW1000NgUtils::writeValueToBytes(lderepc, 0x35C2, LEN_LDE_REPC); + } + } else if(_preambleCode == PreambleCode::CODE_20) { + if(_dataRate == DataRate::RATE_110KBPS) { + DW1000NgUtils::writeValueToBytes(lderepc, ((0x47AE >> 3) & 0xFFFF), LEN_LDE_REPC); + } else { + DW1000NgUtils::writeValueToBytes(lderepc, 0x47AE, LEN_LDE_REPC); + } + } else { + // TODO proper error/warning handling + } + + _writeBytesToRegister(LDE_IF, LDE_REPC_SUB, lderepc, LEN_LDE_REPC); + } + + /* TX_POWER (enabled smart transmit power control) - reg:0x1E, tables 19-20 + * These values are based on a typical IC and an assumed IC to antenna loss of 1.5 dB with a 0 dBi antenna */ + void _txpowertune() { + byte txpower[LEN_TX_POWER]; + if(_channel == Channel::CHANNEL_1 || _channel == Channel::CHANNEL_2) { + if(_pulseFrequency == PulseFrequency::FREQ_16MHZ) { + if(_smartPower) { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x1B153555L, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x15355575L, LEN_TX_POWER); + #endif + } else { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x55555555L, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x75757575L, LEN_TX_POWER); + #endif + } + } else if(_pulseFrequency == PulseFrequency::FREQ_64MHZ) { + if(_smartPower) { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x0D072747L, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x07274767L, LEN_TX_POWER); + #endif + } else { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x47474747L, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x67676767L, LEN_TX_POWER); + #endif + } + } else { + // TODO proper error/warning handling + } + } else if(_channel == Channel::CHANNEL_3) { + if(_pulseFrequency == PulseFrequency::FREQ_16MHZ) { + if(_smartPower) { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x150F2F4FL, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x0F2F4F6FL, LEN_TX_POWER); + #endif + } else { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x4F4F4F4FL, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x6F6F6F6FL, LEN_TX_POWER); + #endif + } + } else if(_pulseFrequency == PulseFrequency::FREQ_64MHZ) { + if(_smartPower) { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x0B2B4B6BL, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x2B4B6B8BL, LEN_TX_POWER); + #endif + } else { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x6B6B6B6BL, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x8B8B8B8BL, LEN_TX_POWER); + #endif + } + } else { + // TODO proper error/warning handling + } + } else if(_channel == Channel::CHANNEL_4) { + if(_pulseFrequency == PulseFrequency::FREQ_16MHZ) { + if(_smartPower) { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x1F1F1F3FL, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x1F1F3F5FL, LEN_TX_POWER); + #endif + } else { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x3F3F3F3FL, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x5F5F5F5FL, LEN_TX_POWER); + #endif + } + } else if(_pulseFrequency == PulseFrequency::FREQ_64MHZ) { + if(_smartPower) { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x1A3A5A7AL, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x3A5A7A9AL, LEN_TX_POWER); + #endif + } else { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x7A7A7A7AL, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x9A9A9A9AL, LEN_TX_POWER); + #endif + } + } else { + // TODO proper error/warning handling + } + } else if(_channel == Channel::CHANNEL_5) { + if(_pulseFrequency == PulseFrequency::FREQ_16MHZ) { + if(_smartPower) { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x140E0828L, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x0E082848L, LEN_TX_POWER); + #endif + } else { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x28282828L, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x48484848L, LEN_TX_POWER); + #endif + } + } else if(_pulseFrequency == PulseFrequency::FREQ_64MHZ) { + if(_smartPower) { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x05254565L, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x25456585L, LEN_TX_POWER); + #endif + } else { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x65656565L, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x85858585L, LEN_TX_POWER); + #endif + } + } else { + // TODO proper error/warning handling + } + } else if(_channel == Channel::CHANNEL_7) { + if(_pulseFrequency == PulseFrequency::FREQ_16MHZ) { + if(_smartPower) { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x12325272L, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x32527292L, LEN_TX_POWER); + #endif + } else { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x72727272L, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x92929292L, LEN_TX_POWER); + #endif + } + } else if(_pulseFrequency == PulseFrequency::FREQ_64MHZ) { + if(_smartPower) { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0x315191B1L, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0x5171B1D1L, LEN_TX_POWER); + #endif + } else { + #if DWM1000_OPTIMIZED + DW1000NgUtils::writeValueToBytes(txpower, 0xB1B1B1B1L, LEN_TX_POWER); + #else + DW1000NgUtils::writeValueToBytes(txpower, 0xD1D1D1D1L, LEN_TX_POWER); + #endif + } + } else { + // TODO proper error/warning handling + } + } else { + // TODO proper error/warning handling + } + _writeBytesToRegister(TX_POWER, NO_SUB, txpower, LEN_TX_POWER); + } + + /* RF_RXCTRLH - reg:0x28, sub-reg:0x0B, table 37 */ + void _rfrxctrlh() { + byte rfrxctrlh[LEN_RF_RXCTRLH]; + if(_channel != Channel::CHANNEL_4 && _channel != Channel::CHANNEL_7) { + DW1000NgUtils::writeValueToBytes(rfrxctrlh, 0xD8, LEN_RF_RXCTRLH); + } else { + DW1000NgUtils::writeValueToBytes(rfrxctrlh, 0xBC, LEN_RF_RXCTRLH); + } + _writeBytesToRegister(RF_CONF, RF_RXCTRLH_SUB, rfrxctrlh, LEN_RF_RXCTRLH); + } + + /* RX_TXCTRL - reg:0x28, sub-reg:0x0C */ + void _rftxctrl() { + byte rftxctrl[LEN_RF_TXCTRL]; + if(_channel == Channel::CHANNEL_1) { + DW1000NgUtils::writeValueToBytes(rftxctrl, 0x00005C40L, LEN_RF_TXCTRL); + } else if(_channel == Channel::CHANNEL_2) { + DW1000NgUtils::writeValueToBytes(rftxctrl, 0x00045CA0L, LEN_RF_TXCTRL); + } else if(_channel == Channel::CHANNEL_3) { + DW1000NgUtils::writeValueToBytes(rftxctrl, 0x00086CC0L, LEN_RF_TXCTRL); + } else if(_channel == Channel::CHANNEL_4) { + DW1000NgUtils::writeValueToBytes(rftxctrl, 0x00045C80L, LEN_RF_TXCTRL); + } else if(_channel == Channel::CHANNEL_5) { + DW1000NgUtils::writeValueToBytes(rftxctrl, 0x001E3FE0L, LEN_RF_TXCTRL); + } else if(_channel == Channel::CHANNEL_7) { + DW1000NgUtils::writeValueToBytes(rftxctrl, 0x001E7DE0L, LEN_RF_TXCTRL); + } else { + // TODO proper error/warning handling + } + _writeBytesToRegister(RF_CONF, RF_TXCTRL_SUB, rftxctrl, LEN_RF_TXCTRL); + } + + /* TC_PGDELAY - reg:0x2A, sub-reg:0x0B, table 40 */ + void _tcpgdelaytune() { + byte tcpgdelay[LEN_TC_PGDELAY]; + if(_channel == Channel::CHANNEL_1) { + DW1000NgUtils::writeValueToBytes(tcpgdelay, 0xC9, LEN_TC_PGDELAY); + } else if(_channel == Channel::CHANNEL_2) { + DW1000NgUtils::writeValueToBytes(tcpgdelay, 0xC2, LEN_TC_PGDELAY); + } else if(_channel == Channel::CHANNEL_3) { + DW1000NgUtils::writeValueToBytes(tcpgdelay, 0xC5, LEN_TC_PGDELAY); + } else if(_channel == Channel::CHANNEL_4) { + DW1000NgUtils::writeValueToBytes(tcpgdelay, 0x95, LEN_TC_PGDELAY); + } else if(_channel == Channel::CHANNEL_5) { + DW1000NgUtils::writeValueToBytes(tcpgdelay, 0xB5, LEN_TC_PGDELAY); + } else if(_channel == Channel::CHANNEL_7) { + DW1000NgUtils::writeValueToBytes(tcpgdelay, 0x93, LEN_TC_PGDELAY); + } else { + // TODO proper error/warning handling + } + _writeBytesToRegister(TX_CAL, TC_PGDELAY_SUB, tcpgdelay, LEN_TC_PGDELAY); + } + + // FS_PLLCFG and FS_PLLTUNE - reg:0x2B, sub-reg:0x07-0x0B, tables 43-44 + void _fspll() { + byte fspllcfg[LEN_FS_PLLCFG]; + byte fsplltune[LEN_FS_PLLTUNE]; + if(_channel == Channel::CHANNEL_1) { + DW1000NgUtils::writeValueToBytes(fspllcfg, 0x09000407L, LEN_FS_PLLCFG); + DW1000NgUtils::writeValueToBytes(fsplltune, 0x1E, LEN_FS_PLLTUNE); + } else if(_channel == Channel::CHANNEL_2 || _channel == Channel::CHANNEL_4) { + DW1000NgUtils::writeValueToBytes(fspllcfg, 0x08400508L, LEN_FS_PLLCFG); + DW1000NgUtils::writeValueToBytes(fsplltune, 0x26, LEN_FS_PLLTUNE); + } else if(_channel == Channel::CHANNEL_3) { + DW1000NgUtils::writeValueToBytes(fspllcfg, 0x08401009L, LEN_FS_PLLCFG); + DW1000NgUtils::writeValueToBytes(fsplltune, 0x56, LEN_FS_PLLTUNE); + } else if(_channel == Channel::CHANNEL_5 || _channel == Channel::CHANNEL_7) { + DW1000NgUtils::writeValueToBytes(fspllcfg, 0x0800041DL, LEN_FS_PLLCFG); + DW1000NgUtils::writeValueToBytes(fsplltune, 0xBE, LEN_FS_PLLTUNE); + } else { + // TODO proper error/warning handling + } + _writeBytesToRegister(FS_CTRL, FS_PLLTUNE_SUB, fsplltune, LEN_FS_PLLTUNE); + _writeBytesToRegister(FS_CTRL, FS_PLLCFG_SUB, fspllcfg, LEN_FS_PLLCFG); + } + + void _tune() { + // these registers are going to be tuned/configured + _agctune1(); + _agctune2(); + _agctune3(); + _drxtune0b(); + _drxtune1a(); + _drxtune1b(); + _drxtune2(); + _drxtune4H(); + _ldecfg1(); + _ldecfg2(); + _lderepc(); + if(_autoTXPower) _txpowertune(); + _rfrxctrlh(); + _rftxctrl(); + if(_autoTCPGDelay) _tcpgdelaytune(); + _fspll(); + } + + void _writeNetworkIdAndDeviceAddress() { + _writeBytesToRegister(PANADR, NO_SUB, _networkAndAddress, LEN_PANADR); + } + + void _writeSystemConfigurationRegister() { + _writeBytesToRegister(SYS_CFG, NO_SUB, _syscfg, LEN_SYS_CFG); + } + + void _writeChannelControlRegister() { + _writeBytesToRegister(CHAN_CTRL, NO_SUB, _chanctrl, LEN_CHAN_CTRL); + } + + void _writeTransmitFrameControlRegister() { + _writeBytesToRegister(TX_FCTRL, NO_SUB, _txfctrl, LEN_TX_FCTRL); + } + + void _writeSystemEventMaskRegister() { + _writeBytesToRegister(SYS_MASK, NO_SUB, _sysmask, LEN_SYS_MASK); + } + + void _writeAntennaDelayRegisters() { + byte antennaTxDelayBytes[2]; + byte antennaRxDelayBytes[2]; + DW1000NgUtils::writeValueToBytes(antennaTxDelayBytes, _antennaTxDelay, LEN_TX_ANTD); + DW1000NgUtils::writeValueToBytes(antennaRxDelayBytes, _antennaRxDelay, LEN_LDE_RXANTD); + _writeBytesToRegister(TX_ANTD, NO_SUB, antennaTxDelayBytes, LEN_TX_ANTD); + _writeBytesToRegister(LDE_IF, LDE_RXANTD_SUB, antennaRxDelayBytes, LEN_LDE_RXANTD); + } + + void _writeConfiguration() { + // write all configurations back to device + _writeSystemConfigurationRegister(); + _writeChannelControlRegister(); + _writeTransmitFrameControlRegister(); + } + + void _useExtendedFrameLength(boolean val) { + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, PHR_MODE_0_BIT, val); + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, PHR_MODE_1_BIT, val); + } + + void _setReceiverAutoReenable(boolean val) { + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, RXAUTR_BIT, val); + } + + void _useFrameCheck(boolean val) { + _frameCheck = val; + } + + void _setNlosOptimization(boolean val) { + _nlos = val; + if(_nlos) { + _ldecfg1(); + _ldecfg2(); + } + } + + void _useSmartPower(boolean smartPower) { + _smartPower = smartPower; + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, DIS_STXP_BIT, !smartPower); + _writeSystemConfigurationRegister(); + if(_autoTXPower) + _txpowertune(); + } + + void _setSFDMode(SFDMode mode) { + switch(mode) { + case SFDMode::STANDARD_SFD: + DW1000NgUtils::setBit(_chanctrl, LEN_CHAN_CTRL, DWSFD_BIT, false); + DW1000NgUtils::setBit(_chanctrl, LEN_CHAN_CTRL, TNSSFD_BIT, false); + DW1000NgUtils::setBit(_chanctrl, LEN_CHAN_CTRL, RNSSFD_BIT, false); + _standardSFD = true; + break; + case SFDMode::DECAWAVE_SFD: + DW1000NgUtils::setBit(_chanctrl, LEN_CHAN_CTRL, DWSFD_BIT, true); + DW1000NgUtils::setBit(_chanctrl, LEN_CHAN_CTRL, TNSSFD_BIT, true); + DW1000NgUtils::setBit(_chanctrl, LEN_CHAN_CTRL, RNSSFD_BIT, true); + _standardSFD = false; + break; + default: + return; //TODO Proper error handling + } + } + + void _setChannel(Channel channel) { + byte chan = static_cast(channel); + chan &= 0xF; + _chanctrl[0] = ((chan | (chan << 4)) & 0xFF); + + _channel = channel; + } + + void _setDataRate(DataRate data_rate) { + byte rate = static_cast(data_rate); + rate &= 0x03; + _txfctrl[1] &= 0x83; + _txfctrl[1] |= (byte)((rate << 5) & 0xFF); + // special 110kbps flag + if(data_rate == DataRate::RATE_110KBPS) { + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, RXM110K_BIT, true); + } else { + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, RXM110K_BIT, false); + } + _dataRate = data_rate; + } + + void _setPulseFrequency(PulseFrequency frequency) { + byte freq = static_cast(frequency); + freq &= 0x03; + _txfctrl[2] &= 0xFC; + _txfctrl[2] |= (byte)(freq & 0xFF); + _chanctrl[2] &= 0xF3; + _chanctrl[2] |= (byte)((freq << 2) & 0xFF); + + _pulseFrequency = frequency; + } + + void _setPreambleLength(PreambleLength preamble_length) { + byte prealen = static_cast(preamble_length); + prealen &= 0x0F; + _txfctrl[2] &= 0xC3; + _txfctrl[2] |= (byte)((prealen << 2) & 0xFF); + + switch(preamble_length) { + case PreambleLength::LEN_64: + _pacSize = PacSize::SIZE_8; + break; + case PreambleLength::LEN_128: + _pacSize = PacSize::SIZE_8; + break; + case PreambleLength::LEN_256: + _pacSize = PacSize::SIZE_16; + break; + case PreambleLength::LEN_512: + _pacSize = PacSize::SIZE_16; + break; + case PreambleLength::LEN_1024: + _pacSize = PacSize::SIZE_32; + break; + default: + _pacSize = PacSize::SIZE_64; // In case of 1536, 2048 or 4096 preamble length. + } + + _preambleLength = preamble_length; + } + + void _setPreambleCode(PreambleCode preamble_code) { + byte preacode = static_cast(preamble_code); + preacode &= 0x1F; + _chanctrl[2] &= 0x3F; + _chanctrl[2] |= ((preacode << 6) & 0xFF); + _chanctrl[3] = 0x00; + _chanctrl[3] = ((((preacode >> 2) & 0x07) | (preacode << 3)) & 0xFF); + + _preambleCode = preamble_code; + } + + boolean _checkPreambleCodeValidity() { + byte preacode = static_cast(_preambleCode); + if(_pulseFrequency == PulseFrequency::FREQ_16MHZ) { + for (auto i = 0; i < 2; i++) { + if(preacode == preamble_validity_matrix_PRF16[(int) _channel][i]) + return true; + } + return false; + } else if (_pulseFrequency == PulseFrequency::FREQ_64MHZ) { + for(auto i = 0; i < 4; i++) { + if(preacode == preamble_validity_matrix_PRF64[(int) _channel][i]) + return true; + } + return false; + } else { + return false; //TODO Proper error handling + } + } + + void _setValidPreambleCode() { + PreambleCode preamble_code; + + switch(_channel) { + case Channel::CHANNEL_1: + preamble_code = _pulseFrequency == PulseFrequency::FREQ_16MHZ ? PreambleCode::CODE_2 : PreambleCode::CODE_10; + break; + case Channel::CHANNEL_3: + preamble_code = _pulseFrequency == PulseFrequency::FREQ_16MHZ ? PreambleCode::CODE_6 : PreambleCode::CODE_10; + break; + case Channel::CHANNEL_4: + case Channel::CHANNEL_7: + preamble_code = _pulseFrequency == PulseFrequency::FREQ_16MHZ ? PreambleCode::CODE_8 : PreambleCode::CODE_18; + break; + case Channel::CHANNEL_2: + case Channel::CHANNEL_5: + preamble_code = _pulseFrequency == PulseFrequency::FREQ_16MHZ ? PreambleCode::CODE_3 : PreambleCode::CODE_10; + break; + default: + return; //TODO Proper Error Handling + } + byte preacode = static_cast(preamble_code); + preacode &= 0x1F; + _chanctrl[2] &= 0x3F; + _chanctrl[2] |= ((preacode << 6) & 0xFF); + _chanctrl[3] = 0x00; + _chanctrl[3] = ((((preacode >> 2) & 0x07) | (preacode << 3)) & 0xFF); + + _preambleCode = preamble_code; + } + + void _setNonStandardSFDLength() { + switch(_dataRate) { + case DataRate::RATE_6800KBPS: + _writeSingleByteToRegister(USR_SFD, SFD_LENGTH_SUB, 0x08); + break; + case DataRate::RATE_850KBPS: + _writeSingleByteToRegister(USR_SFD, SFD_LENGTH_SUB, 0x10); + break; + case DataRate::RATE_110KBPS: + _writeSingleByteToRegister(USR_SFD, SFD_LENGTH_SUB, 0x40); + break; + default: + return; //TODO Proper error handling + } + } + + void _interruptOnSent(boolean val) { + DW1000NgUtils::setBit(_sysmask, LEN_SYS_MASK, TXFRS_BIT, val); + } + + void _interruptOnReceived(boolean val) { + DW1000NgUtils::setBit(_sysmask, LEN_SYS_MASK, RXDFR_BIT, val); + DW1000NgUtils::setBit(_sysmask, LEN_SYS_MASK, RXFCG_BIT, val); + } + + void _interruptOnReceiveFailed(boolean val) { + DW1000NgUtils::setBit(_sysmask, LEN_SYS_STATUS, RXPHE_BIT, val); + DW1000NgUtils::setBit(_sysmask, LEN_SYS_STATUS, RXFCE_BIT, val); + DW1000NgUtils::setBit(_sysmask, LEN_SYS_STATUS, RXRFSL_BIT, val); + DW1000NgUtils::setBit(_sysmask, LEN_SYS_STATUS, LDEERR_BIT, val); + } + + void _interruptOnReceiveTimeout(boolean val) { + DW1000NgUtils::setBit(_sysmask, LEN_SYS_MASK, RXRFTO_BIT, val); + DW1000NgUtils::setBit(_sysmask, LEN_SYS_MASK, RXPTO_BIT, val); + DW1000NgUtils::setBit(_sysmask, LEN_SYS_MASK, RXSFDTO_BIT, val); + } + + void _interruptOnReceiveTimestampAvailable(boolean val) { + DW1000NgUtils::setBit(_sysmask, LEN_SYS_MASK, LDEDONE_BIT, val); + } + + void _interruptOnAutomaticAcknowledgeTrigger(boolean val) { + DW1000NgUtils::setBit(_sysmask, LEN_SYS_MASK, AAT_BIT, val); + } + + void _manageLDE() { + // transfer any ldo tune values + byte ldoTune[LEN_OTP_RDAT]; + uint16_t LDOTUNE_ADDRESS = 0x04; + _readBytesOTP(LDOTUNE_ADDRESS, ldoTune); // TODO #define + if(ldoTune[0] != 0) { + // TODO tuning available, copy over to RAM: use OTP_LDO bit + } + // tell the chip to load the LDE microcode + // TODO remove clock-related code (PMSC_CTRL) as handled separately + byte pmscctrl0[LEN_PMSC_CTRL0]; + byte otpctrl[LEN_OTP_CTRL]; + memset(pmscctrl0, 0, LEN_PMSC_CTRL0); + memset(otpctrl, 0, LEN_OTP_CTRL); + _readBytesFromRegister(PMSC, PMSC_CTRL0_SUB, pmscctrl0, LEN_PMSC_CTRL0); + _readBytesFromRegister(OTP_IF, OTP_CTRL_SUB, otpctrl, LEN_OTP_CTRL); + pmscctrl0[0] = 0x01; + pmscctrl0[1] = 0x03; + otpctrl[0] = 0x00; + otpctrl[1] = 0x80; + _writeBytesToRegister(PMSC, PMSC_CTRL0_SUB, pmscctrl0, 2); + // uCode + _enableClock(LDE_CLOCK); + delay(5); + _writeBytesToRegister(OTP_IF, OTP_CTRL_SUB, otpctrl, 2); + delay(1); + _enableClock(SYS_AUTO_CLOCK); + delay(5); + pmscctrl0[0] = 0x00; + pmscctrl0[1] &= 0x02; + _writeBytesToRegister(PMSC, PMSC_CTRL0_SUB, pmscctrl0, 2); + } + + /* Crystal calibration from OTP (if available) + * FS_XTALT - reg:0x2B, sub-reg:0x0E + * OTP(one-time-programmable) memory map - table 10 */ + void _fsxtalt() { + byte fsxtalt[LEN_FS_XTALT]; + byte buf_otp[4]; + _readBytesOTP(0x01E, buf_otp); //0x01E -> byte[0]=XTAL_Trim + if (buf_otp[0] == 0) { + // No trim value available from OTP, use midrange value of 0x10 + DW1000NgUtils::writeValueToBytes(fsxtalt, ((0x10 & 0x1F) | 0x60), LEN_FS_XTALT); + } else { + DW1000NgUtils::writeValueToBytes(fsxtalt, ((buf_otp[0] & 0x1F) | 0x60), LEN_FS_XTALT); + } + // write configuration back to chip + _writeBytesToRegister(FS_CTRL, FS_XTALT_SUB, fsxtalt, LEN_FS_XTALT); + } + + void _clearReceiveStatus() { + // clear latched RX bits (i.e. write 1 to clear) + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, RXDFR_BIT, true); + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, RXFCG_BIT, true); + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, RXPRD_BIT, true); + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, RXSFDD_BIT, true); + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, RXPHD_BIT, true); + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, LDEDONE_BIT, true); + _writeBytesToRegister(SYS_STATUS, NO_SUB, _sysstatus, LEN_SYS_STATUS); + } + + void _clearReceiveTimestampAvailableStatus() { + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, LDEDONE_BIT, true); + _writeBytesToRegister(SYS_STATUS, NO_SUB, _sysstatus, LEN_SYS_STATUS); + } + + void _clearReceiveTimeoutStatus() { + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, RXRFTO_BIT, true); + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, RXPTO_BIT, true); + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, RXSFDTO_BIT, true); + _writeBytesToRegister(SYS_STATUS, NO_SUB, _sysstatus, LEN_SYS_STATUS); + } + + void _clearReceiveFailedStatus() { + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, RXPHE_BIT, true); + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, RXFCE_BIT, true); + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, RXRFSL_BIT, true); + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, AFFREJ_BIT, true); + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, LDEERR_BIT, true); + _writeBytesToRegister(SYS_STATUS, NO_SUB, _sysstatus, LEN_SYS_STATUS); + } + + void _clearTransmitStatus() { + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, AAT_BIT, true); + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, TXFRB_BIT, true); + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, TXPRS_BIT, true); + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, TXPHS_BIT, true); + DW1000NgUtils::setBit(_sysstatus, LEN_SYS_STATUS, TXFRS_BIT, true); + _writeBytesToRegister(SYS_STATUS, NO_SUB, _sysstatus, LEN_SYS_STATUS); + } + + void _resetReceiver() { + /* Set to 0 only bit 28 */ + _writeValueToRegister(PMSC, PMSC_SOFTRESET_SUB, 0xE0, LEN_PMSC_SOFTRESET); + /* Set SOFTRESET to all ones */ + _writeValueToRegister(PMSC, PMSC_SOFTRESET_SUB, 0xF0, LEN_PMSC_SOFTRESET); + } + + /* Internal helpers to read configuration */ + + void _readSystemConfigurationRegister() { + _readBytesFromRegister(SYS_CFG, NO_SUB, _syscfg, LEN_SYS_CFG); + } + + void _readSystemEventStatusRegister() { + _readBytesFromRegister(SYS_STATUS, NO_SUB, _sysstatus, LEN_SYS_STATUS); + } + + void _readNetworkIdAndDeviceAddress() { + _readBytesFromRegister(PANADR, NO_SUB, _networkAndAddress, LEN_PANADR); + } + + void _readSystemEventMaskRegister() { + _readBytesFromRegister(SYS_MASK, NO_SUB, _sysmask, LEN_SYS_MASK); + } + + void _readChannelControlRegister() { + _readBytesFromRegister(CHAN_CTRL, NO_SUB, _chanctrl, LEN_CHAN_CTRL); + } + + void _readTransmitFrameControlRegister() { + _readBytesFromRegister(TX_FCTRL, NO_SUB, _txfctrl, LEN_TX_FCTRL); + } + + boolean _isTransmitDone() { + return DW1000NgUtils::getBit(_sysstatus, LEN_SYS_STATUS, TXFRS_BIT); + } + + boolean _isReceiveTimestampAvailable() { + return DW1000NgUtils::getBit(_sysstatus, LEN_SYS_STATUS, LDEDONE_BIT); + } + + boolean _isReceiveDone() { + if(_frameCheck) { + return (DW1000NgUtils::getBit(_sysstatus, LEN_SYS_STATUS, RXFCG_BIT) && + DW1000NgUtils::getBit(_sysstatus, LEN_SYS_STATUS, RXDFR_BIT)); + } + return DW1000NgUtils::getBit(_sysstatus, LEN_SYS_STATUS, RXDFR_BIT); + } + + boolean _isReceiveFailed() { + return (DW1000NgUtils::getBit(_sysstatus, LEN_SYS_STATUS, RXPHE_BIT) || + DW1000NgUtils::getBit(_sysstatus, LEN_SYS_STATUS, RXFCE_BIT) || + DW1000NgUtils::getBit(_sysstatus, LEN_SYS_STATUS, RXRFSL_BIT) || + DW1000NgUtils::getBit(_sysstatus, LEN_SYS_STATUS, LDEERR_BIT)); + } + + boolean _isReceiveTimeout() { + return (DW1000NgUtils::getBit(_sysstatus, LEN_SYS_STATUS, RXRFTO_BIT) || + DW1000NgUtils::getBit(_sysstatus, LEN_SYS_STATUS, RXPTO_BIT) || + DW1000NgUtils::getBit(_sysstatus, LEN_SYS_STATUS, RXSFDTO_BIT)); + } + + boolean _isClockProblem() { + return (DW1000NgUtils::getBit(_sysstatus, LEN_SYS_STATUS, CLKPLL_LL_BIT) || + DW1000NgUtils::getBit(_sysstatus, LEN_SYS_STATUS, RFPLL_LL_BIT)); + } + + void _disableSequencing() { + _enableClock(SYS_XTI_CLOCK); + byte zero[2]; + DW1000NgUtils::writeValueToBytes(zero, 0x0000, 2); + _writeBytesToRegister(PMSC, PMSC_CTRL1_SUB, zero, 2); // To re-enable write 0xE7 + } + + void _configureRFTransmitPowerSpectrumTestMode() { + /* Enabled TXFEN, PLLFEN, LDOFEN and set TXRXSW to TX */ + byte enable_mask[4]; + DW1000NgUtils::writeValueToBytes(enable_mask, 0x005FFF00, LEN_RX_CONF_SUB); + _writeBytesToRegister(RF_CONF, RF_CONF_SUB, enable_mask, LEN_RX_CONF_SUB); + } + + void _uploadConfigToAON() { + /* Write 1 in UPL_CFG_BIT */ + _writeValueToRegister(AON, AON_CTRL_SUB, 0x04, LEN_AON_CTRL); + /* Clear the register */ + _writeValueToRegister(AON, AON_CTRL_SUB, 0x00, LEN_AON_CTRL); + } + } + + /* ####################### PUBLIC ###################### */ + + void initialize(uint8_t ss, uint8_t irq, uint8_t rst, spi_host_device_t spihost,Adafruit_MCP23017 *expander) { + // generous initial init/wake-up-idle delay + delay(5); + m_expander = expander; + _ss = ss; + _irq = irq; + _rst = rst; + + if(rst != 0xff) { + // DW1000 data sheet v2.08 §5.6.1 page 20, the RSTn pin should not be driven high but left floating. + m_expander->pinMode(_rst, INPUT); + } + + SPIporting::SPIinit(spihost,expander); + // pin and basic member setup + // attach interrupt + // TODO throw error if pin is not a interrupt pin + if(_irq != 0xff) + attachInterrupt(digitalPinToInterrupt(_irq), interruptServiceRoutine, RISING); + SPIporting::SPIselect(_ss, _irq); + // reset chip (either soft or hard) + reset(); + + SPIporting::setSPIspeed(SPIClock::SLOW); + _enableClock(SYS_XTI_CLOCK); + delay(5); + + // Configure the CPLL lock detect + _writeBitToRegister(EXT_SYNC, EC_CTRL_SUB, LEN_EC_CTRL, PLLLDT_BIT, true); + + // Configure XTAL trim + _fsxtalt(); + + // load LDE micro-code + _manageLDE(); + + // read the temp and vbat readings from OTP that were recorded during production test + // see 6.3.1 OTP memory map + byte buf_otp[4]; + _readBytesOTP(0x008, buf_otp); // the stored 3.3 V reading + _vmeas3v3 = buf_otp[0]; + _readBytesOTP(0x009, buf_otp); // the stored 23C reading + _tmeas23C = buf_otp[0]; + + _enableClock(SYS_AUTO_CLOCK); + delay(5); + SPIporting::setSPIspeed(SPIClock::FAST); + + _readNetworkIdAndDeviceAddress(); + _readSystemConfigurationRegister(); + _readChannelControlRegister(); + _readTransmitFrameControlRegister(); + _readSystemEventMaskRegister(); + + /* Cleared AON:CFG1(0x2C:0x0A) for proper operation of deepSleep */ + _writeValueToRegister(AON, AON_CFG1_SUB, 0x00, LEN_AON_CFG1); + + } + + /* callback handler management. */ + void attachErrorHandler(void (* handleError)(void)) { + _handleError = handleError; + } + + void attachSentHandler(void (* handleSent)(void)) { + _handleSent = handleSent; + } + + void attachReceivedHandler(void (* handleReceived)(void)) { + _handleReceived = handleReceived; + } + + void attachReceiveFailedHandler(void (* handleReceiveFailed)(void)) { + _handleReceiveFailed = handleReceiveFailed; + } + + void attachReceiveTimeoutHandler(void (* handleReceiveTimeout)(void)) { + _handleReceiveTimeout = handleReceiveTimeout; + } + + void attachReceiveTimestampAvailableHandler(void (* handleReceiveTimestampAvailable)(void)) { + _handleReceiveTimestampAvailable = handleReceiveTimestampAvailable; + } + + void interruptServiceRoutine() { + // read current status and handle via callbacks + _readSystemEventStatusRegister(); + if(_isClockProblem() /* TODO and others */ && _handleError != 0) { + (*_handleError)(); + } + if(_isTransmitDone()) { + _clearTransmitStatus(); + if(_handleSent != nullptr) + (*_handleSent)(); + } + if(_isReceiveTimestampAvailable()) { + _clearReceiveTimestampAvailableStatus(); + if(_handleReceiveTimestampAvailable != nullptr) + (*_handleReceiveTimestampAvailable)(); + } + if(_isReceiveFailed()) { + _clearReceiveFailedStatus(); + forceTRxOff(); + _resetReceiver(); + if(_handleReceiveFailed != nullptr) + (*_handleReceiveFailed)(); + } else if(_isReceiveTimeout()) { + _clearReceiveTimeoutStatus(); + forceTRxOff(); + _resetReceiver(); + if(_handleReceiveTimeout != nullptr) + (*_handleReceiveTimeout)(); + } else if(_isReceiveDone()) { + _clearReceiveStatus(); + if(_handleReceived != nullptr) + (*_handleReceived)(); + } + } + + boolean isTransmitDone(){ + _readSystemEventStatusRegister(); + return _isTransmitDone(); + } + + void clearTransmitStatus() { + _clearTransmitStatus(); + } + + boolean isReceiveDone() { + _readSystemEventStatusRegister(); + return _isReceiveDone(); + } + + void clearReceiveStatus() { + _clearReceiveStatus(); + } + + boolean isReceiveFailed() { + _readSystemEventStatusRegister(); + return _isReceiveFailed(); + } + + void clearReceiveFailedStatus() { + _clearReceiveFailedStatus(); + forceTRxOff(); + _resetReceiver(); + } + + boolean isReceiveTimeout() { + _readSystemEventMaskRegister(); + return _isReceiveTimeout(); + } + + void clearReceiveTimeoutStatus() { + _clearReceiveTimeoutStatus(); + forceTRxOff(); + _resetReceiver(); + } + + void enableDebounceClock() { + byte pmscctrl0[LEN_PMSC_CTRL0]; + memset(pmscctrl0, 0, LEN_PMSC_CTRL0); + _readBytesFromRegister(PMSC, PMSC_CTRL0_SUB, pmscctrl0, LEN_PMSC_CTRL0); + DW1000NgUtils::setBit(pmscctrl0, LEN_PMSC_CTRL0, GPDCE_BIT, 1); + DW1000NgUtils::setBit(pmscctrl0, LEN_PMSC_CTRL0, KHZCLKEN_BIT, 1); + _writeBytesToRegister(PMSC, PMSC_CTRL0_SUB, pmscctrl0, LEN_PMSC_CTRL0); + _debounceClockEnabled = true; + } + + void enableLedBlinking() { + byte pmscledc[LEN_PMSC_LEDC]; + memset(pmscledc, 0, LEN_PMSC_LEDC); + _readBytesFromRegister(PMSC, PMSC_LEDC_SUB, pmscledc, LEN_PMSC_LEDC); + DW1000NgUtils::setBit(pmscledc, LEN_PMSC_LEDC, BLNKEN, 1); + _writeBytesToRegister(PMSC, PMSC_LEDC_SUB, pmscledc, LEN_PMSC_LEDC); + } + + void setGPIOMode(uint8_t msgp, uint8_t mode) { + byte gpiomode[LEN_GPIO_MODE]; + memset(gpiomode, 0, LEN_GPIO_MODE); + _readBytesFromRegister(GPIO_CTRL, GPIO_MODE_SUB, gpiomode, LEN_GPIO_MODE); + for (char i = 0; i < 2; i++){ + DW1000NgUtils::setBit(gpiomode, LEN_GPIO_MODE, msgp + i, (mode >> i) & 1); + } + _writeBytesToRegister(GPIO_CTRL, GPIO_MODE_SUB, gpiomode, LEN_GPIO_MODE); + } + + void applySleepConfiguration(sleep_configuration_t sleep_config) { + byte aon_wcfg[LEN_AON_WCFG]; + _readBytesFromRegister(AON, AON_WCFG_SUB, aon_wcfg, LEN_AON_WCFG); + byte aon_cfg0[1]; + memset(aon_cfg0, 0, 1); + + DW1000NgUtils::setBit(aon_wcfg, LEN_AON_WCFG, ONW_RADC_BIT, sleep_config.onWakeUpRunADC); + DW1000NgUtils::setBit(aon_wcfg, LEN_AON_WCFG, ONW_RX_BIT, sleep_config.onWakeUpReceive); + DW1000NgUtils::setBit(aon_wcfg, LEN_AON_WCFG, ONW_LEUI_BIT, sleep_config.onWakeUpLoadEUI); + DW1000NgUtils::setBit(aon_wcfg, LEN_AON_WCFG, ONW_LDC_BIT, true); + DW1000NgUtils::setBit(aon_wcfg, LEN_AON_WCFG, ONW_L64P_BIT, sleep_config.onWakeUpLoadL64Param); + DW1000NgUtils::setBit(aon_wcfg, LEN_AON_WCFG, ONW_PRES_SLEEP_BIT, sleep_config.preserveSleep); + DW1000NgUtils::setBit(aon_wcfg, LEN_AON_WCFG, ONW_LLDE_BIT, true); + DW1000NgUtils::setBit(aon_wcfg, LEN_AON_WCFG, ONW_LLDO_BIT, true); + _writeBytesToRegister(AON, AON_WCFG_SUB, aon_wcfg, LEN_AON_WCFG); + + DW1000NgUtils::setBit(aon_cfg0, 1, WAKE_PIN_BIT, sleep_config.enableWakePIN); + DW1000NgUtils::setBit(aon_cfg0, 1, WAKE_SPI_BIT, sleep_config.enableWakeSPI); + DW1000NgUtils::setBit(aon_cfg0, 1, WAKE_CNT_BIT, false); + DW1000NgUtils::setBit(aon_cfg0, 1, SLEEP_EN_BIT, sleep_config.enableSLP); + _writeBytesToRegister(AON, AON_CFG0_SUB, aon_cfg0, 1); //Deletes 3 bits of the unused LPCLKDIVA + } + + /*Puts the device into sleep/deepSleep mode. This function also upload sleep config to AON. */ + void deepSleep() { + /* Clear the register */ + _writeValueToRegister(AON, AON_CTRL_SUB, 0x00, LEN_AON_CTRL); + /* Write 1 in SAVE_BIT */ + _writeValueToRegister(AON, AON_CTRL_SUB, 0x02, LEN_AON_CTRL); + } + + void spiWakeup(){ + byte deviceId[LEN_DEV_ID]; + byte expectedDeviceId[LEN_DEV_ID]; + DW1000NgUtils::writeValueToBytes(expectedDeviceId, 0xDECA0130, LEN_DEV_ID); + _readBytesFromRegister(DEV_ID, NO_SUB, deviceId, LEN_DEV_ID); + if (memcmp(deviceId, expectedDeviceId, LEN_DEV_ID)) { + digitalWrite(_ss, LOW); + delay(1); + digitalWrite(_ss, HIGH); + delay(5); + setTxAntennaDelay(_antennaTxDelay); + if (_debounceClockEnabled){ + enableDebounceClock(); + } + } + } + + void reset() { + if(_rst == 0xff) { /* Fallback to Software Reset */ + softwareReset(); + } else { + // DW1000Ng data sheet v2.08 §5.6.1 page 20, the RSTn pin should not be driven high but left floating. + m_expander->pinMode(_rst, OUTPUT); + m_expander->digitalWrite(_rst, LOW); + delay(2); // DW1000Ng data sheet v2.08 §5.6.1 page 20: nominal 50ns, to be safe take more time + m_expander->pinMode(_rst, INPUT); + delay(5); // dw1000Ng data sheet v1.2 page 5: nominal 3 ms, to be safe take more time + } + } + + void softwareReset() { + SPIporting::setSPIspeed(SPIClock::SLOW); + + /* Disable sequencing and go to state "INIT" - (a) Sets SYSCLKS to 01 */ + _disableSequencing(); + /* Clear AON and WakeUp configuration */ + _writeValueToRegister(AON, AON_WCFG_SUB, 0x00, LEN_AON_WCFG); + _writeValueToRegister(AON, AON_CFG0_SUB, 0x00, LEN_AON_CFG0); + // TODO change this with uploadToAON + _writeValueToRegister(AON, AON_CTRL_SUB, 0x00, LEN_AON_CTRL); + _writeValueToRegister(AON, AON_CTRL_SUB, 0x02, LEN_AON_CTRL); + /* (b) Clear SOFTRESET to all zero’s */ + _writeValueToRegister(PMSC, PMSC_SOFTRESET_SUB, 0x00, LEN_PMSC_SOFTRESET); + delay(1); + /* (c) Set SOFTRESET to all ones */ + _writeValueToRegister(PMSC, PMSC_SOFTRESET_SUB, 0xF0, LEN_PMSC_SOFTRESET); + } + + /* ########################################################################### + * #### Pretty printed device information #################################### + * ######################################################################### */ + + + void getPrintableDeviceIdentifier(char msgBuffer[]) { + byte data[LEN_DEV_ID]; + _readBytesFromRegister(DEV_ID, NO_SUB, data, LEN_DEV_ID); + sprintf(msgBuffer, "%02X - model: %d, version: %d, revision: %d", + (uint16_t)((data[3] << 8) | data[2]), data[1], (data[0] >> 4) & 0x0F, data[0] & 0x0F); + } + + void getPrintableExtendedUniqueIdentifier(char msgBuffer[]) { + byte data[LEN_EUI]; + _readBytesFromRegister(EUI, NO_SUB, data, LEN_EUI); + sprintf(msgBuffer, "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", + data[7], data[6], data[5], data[4], data[3], data[2], data[1], data[0]); + } + + void getPrintableNetworkIdAndShortAddress(char msgBuffer[]) { + byte data[LEN_PANADR]; + _readBytesFromRegister(PANADR, NO_SUB, data, LEN_PANADR); + sprintf(msgBuffer, "PAN: %02X, Short Address: %02X", + (uint16_t)((data[3] << 8) | data[2]), (uint16_t)((data[1] << 8) | data[0])); + } + + void getPrintableDeviceMode(char msgBuffer[]) { + uint16_t dr; + uint8_t prf; + uint16_t plen; + uint8_t pcode; + uint8_t ch; + byte chan_ctrl[LEN_CHAN_CTRL]; + byte tx_fctrl[LEN_TX_FCTRL]; + _readBytesFromRegister(CHAN_CTRL, NO_SUB, chan_ctrl, LEN_CHAN_CTRL); + _readBytesFromRegister(TX_FCTRL, NO_SUB, tx_fctrl, LEN_TX_FCTRL); + /* Data Rate from 0x08 bits:13-14(tx_fctrl) */ + dr = (uint16_t)(tx_fctrl[1] >> 5 & 0x3); + switch(dr) { + case 0x00: + dr = 110; + break; + case 0x01: + dr = 850; + break; + case 0x02: + dr = 6800; + break; + default: + return; //TODO Error handling + } + /* PRF(16 or 64) from 0x1F bits:18-19(chan_ctrl) */ + prf = (uint8_t)(chan_ctrl[2] >> 2 & 0x03); + if(prf == 0x01){ + prf = 16; + } else if(prf == 0x02){ + prf = 64; + } else{ + return; //TODO Error handling + } + /* PreambleLength from 0x08 bits:18-21(tx_fctrl) */ + plen = (uint16_t)(tx_fctrl[2] >> 2 & 0xF); + switch(plen) { + case 0x01: + plen = 64; + break; + case 0x05: + plen = 128; + break; + case 0x09: + plen = 256; + break; + case 0x0D: + plen = 512; + break; + case 0x02: + plen = 1024; + break; + case 0x06: + plen = 1536; + break; + case 0x0A: + plen = 2048; + break; + case 0x03: + plen = 4096; + break; + default: + return; //TODO Error handling + } + /* Channel from 0x1F bits:0-4(tx_chan) */ + ch = (uint8_t)(chan_ctrl[0] & 0xF); + /* Preamble Code from 0x1F bits:24-31(chan_ctrl) */ + pcode = (uint8_t)(chan_ctrl[3] >> 3 & 0x1F); + sprintf(msgBuffer, "Data rate: %u kb/s, PRF: %u MHz, Preamble: %u symbols, Channel: #%u, Preamble code #%u" , dr, prf, plen, ch, pcode); + } + + /* ########################################################################### + * #### DW1000Ng operation functions ########################################### + * ######################################################################### */ + + void setNetworkId(uint16_t val) { + _networkAndAddress[2] = (byte)(val & 0xFF); + _networkAndAddress[3] = (byte)((val >> 8) & 0xFF); + _writeNetworkIdAndDeviceAddress(); + } + + void getNetworkId(byte id[]) { + _readNetworkIdAndDeviceAddress(); + id[0] = _networkAndAddress[2]; + id[1] = _networkAndAddress[3]; + } + + void setDeviceAddress(uint16_t val) { + _networkAndAddress[0] = (byte)(val & 0xFF); + _networkAndAddress[1] = (byte)((val >> 8) & 0xFF); + _writeNetworkIdAndDeviceAddress(); + } + + void getDeviceAddress(byte address[]) { + _readNetworkIdAndDeviceAddress(); + address[0] = _networkAndAddress[0]; + address[1] = _networkAndAddress[1]; + } + + void setEUI(char eui[]) { + byte eui_byte[LEN_EUI]; + DW1000NgUtils::convertToByte(eui, eui_byte); + setEUI(eui_byte); + } + + void setEUI(byte eui[]) { + //we reverse the address-> + byte reverseEUI[8]; + uint8_t size = 8; + for(uint8_t i = 0; i < size; i++) { + *(reverseEUI+i) = *(eui+size-i-1); + } + _writeBytesToRegister(EUI, NO_SUB, reverseEUI, LEN_EUI); + } + + void getEUI(byte eui[]) { + _readBytesFromRegister(EUI, NO_SUB, eui, LEN_EUI); + } + + float getTemperature() { + _vbatAndTempSteps(); + byte sar_ltemp = 0; _readBytesFromRegister(TX_CAL, 0x04, &sar_ltemp, 1); + return (sar_ltemp - _tmeas23C) * 1.14f + 23.0f; + } + + float getBatteryVoltage() { + _vbatAndTempSteps(); + byte sar_lvbat = 0; _readBytesFromRegister(TX_CAL, 0x03, &sar_lvbat, 1); + return (sar_lvbat - _vmeas3v3) / 173.0f + 3.3f; + } + + void getTemperatureAndBatteryVoltage(float& temp, float& vbat) { + // follow the procedure from section 6.4 of the User Manual + _vbatAndTempSteps(); + delay(1); + byte sar_lvbat = 0; _readBytesFromRegister(TX_CAL, 0x03, &sar_lvbat, 1); + byte sar_ltemp = 0; _readBytesFromRegister(TX_CAL, 0x04, &sar_ltemp, 1); + + // calculate voltage and temperature + vbat = (sar_lvbat - _vmeas3v3) / 173.0f + 3.3f; + temp = (sar_ltemp - _tmeas23C) * 1.14f + 23.0f; + } + + void enableFrameFiltering(frame_filtering_configuration_t config) { + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, FFEN_BIT, true); + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, FFBC_BIT, config.behaveAsCoordinator); + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, FFAB_BIT, config.allowBeacon); + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, FFAD_BIT, config.allowData); + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, FFAA_BIT, config.allowAcknowledgement); + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, FFAM_BIT, config.allowMacCommand); + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, FFAR_BIT, config.allowAllReserved); + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, FFA4_BIT, config.allowReservedFour); + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, FFA5_BIT, config.allowReservedFive); + + _writeSystemConfigurationRegister(); + } + + void disableFrameFiltering() { + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, FFEN_BIT, false); + _writeSystemConfigurationRegister(); + } + + void setDoubleBuffering(boolean val) { + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, DIS_DRXB_BIT, !val); + } + + void setAntennaDelay(uint16_t value) { + _antennaTxDelay = value; + _antennaRxDelay = value; + _writeAntennaDelayRegisters(); + } + + #if defined(__AVR__) + void setAndSaveAntennaDelay(uint16_t delay, uint8_t eeAddress) { + EEPROM.put(eeAddress, delay); + EEPROM.end(); + setAntennaDelay(delay); + } + + uint16_t getSavedAntennaDelay(uint8_t eeAddress) { + uint16_t delay; + EEPROM.get(eeAddress, delay); + EEPROM.end(); + return delay; + } + + uint16_t setAntennaDelayFromEEPROM(uint8_t eeAddress) { + uint16_t delay = getSavedAntennaDelay(eeAddress); + setAntennaDelay(delay); + } + #endif + + void setTxAntennaDelay(uint16_t value) { + _antennaTxDelay = value; + _writeAntennaDelayRegisters(); + } + void setRxAntennaDelay(uint16_t value) { + _antennaRxDelay = value; + _writeAntennaDelayRegisters(); + } + + uint16_t getTxAntennaDelay() { + return _antennaTxDelay; + } + uint16_t getRxAntennaDelay() { + return _antennaRxDelay; + } + + void forceTRxOff() { + memset(_sysctrl, 0, LEN_SYS_CTRL); + DW1000NgUtils::setBit(_sysctrl, LEN_SYS_CTRL, TRXOFF_BIT, true); + _writeBytesToRegister(SYS_CTRL, NO_SUB, _sysctrl, LEN_SYS_CTRL); + } + + void startReceive(ReceiveMode mode) { + memset(_sysctrl, 0, LEN_SYS_CTRL); + DW1000NgUtils::setBit(_sysctrl, LEN_SYS_CTRL, SFCST_BIT, !_frameCheck); + if(mode == ReceiveMode::DELAYED) + DW1000NgUtils::setBit(_sysctrl, LEN_SYS_CTRL, RXDLYS_BIT, true); + DW1000NgUtils::setBit(_sysctrl, LEN_SYS_CTRL, RXENAB_BIT, true); + _writeBytesToRegister(SYS_CTRL, NO_SUB, _sysctrl, LEN_SYS_CTRL); + } + + void startTransmit(TransmitMode mode) { + memset(_sysctrl, 0, LEN_SYS_CTRL); + DW1000NgUtils::setBit(_sysctrl, LEN_SYS_CTRL, SFCST_BIT, !_frameCheck); + if(mode == TransmitMode::DELAYED) + DW1000NgUtils::setBit(_sysctrl, LEN_SYS_CTRL, TXDLYS_BIT, true); + if(_wait4resp) + DW1000NgUtils::setBit(_sysctrl, LEN_SYS_CTRL, WAIT4RESP_BIT, true); + + DW1000NgUtils::setBit(_sysctrl, LEN_SYS_CTRL, TXSTRT_BIT, true); + _writeBytesToRegister(SYS_CTRL, NO_SUB, _sysctrl, LEN_SYS_CTRL); + } + + void setInterruptPolarity(boolean val) { + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, HIRQ_POL_BIT, val); + _writeSystemConfigurationRegister(); + } + + void applyConfiguration(device_configuration_t config) { + forceTRxOff(); + + _useExtendedFrameLength(config.extendedFrameLength); + _setReceiverAutoReenable(config.receiverAutoReenable); + _useSmartPower(config.smartPower); + _useFrameCheck(config.frameCheck); + _setNlosOptimization(config.nlos); + _setSFDMode(config.sfd); + _setChannel(config.channel); + _setDataRate(config.dataRate); + _setPulseFrequency(config.pulseFreq); + _setPreambleLength(config.preambleLen); + _setPreambleCode(config.preaCode); + + if(!_checkPreambleCodeValidity()) + _setValidPreambleCode(); + + if(!_standardSFD) + _setNonStandardSFDLength(); + + // writes configuration to registers + _writeConfiguration(); + // tune according to configuration + _tune(); + } + + Channel getChannel() { + return _channel; + } + + PulseFrequency getPulseFrequency() { + return _pulseFrequency; + } + + void setPreambleDetectionTimeout(uint16_t pacSize) { + byte drx_pretoc[LEN_DRX_PRETOC]; + DW1000NgUtils::writeValueToBytes(drx_pretoc, pacSize, LEN_DRX_PRETOC); + _writeBytesToRegister(DRX_TUNE, DRX_PRETOC_SUB, drx_pretoc, LEN_DRX_PRETOC); + } + + void setSfdDetectionTimeout(uint16_t preambleSymbols) { + byte drx_sfdtoc[LEN_DRX_SFDTOC]; + DW1000NgUtils::writeValueToBytes(drx_sfdtoc, preambleSymbols, LEN_DRX_SFDTOC); + _writeBytesToRegister(DRX_TUNE, DRX_SFDTOC_SUB, drx_sfdtoc, LEN_DRX_SFDTOC); + } + + void setReceiveFrameWaitTimeoutPeriod(uint16_t timeMicroSeconds) { + if (timeMicroSeconds > 0) { + byte rx_wfto[LEN_RX_WFTO]; + DW1000NgUtils::writeValueToBytes(rx_wfto, timeMicroSeconds, LEN_RX_WFTO); + _writeBytesToRegister(RX_WFTO, NO_SUB, rx_wfto, LEN_RX_WFTO); + /* enable frame wait timeout bit */ + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, RXWTOE_BIT, true); + _writeSystemConfigurationRegister(); + } else { + /* disable frame wait timeout bit */ + DW1000NgUtils::setBit(_syscfg, LEN_SYS_CFG, RXWTOE_BIT, false); + _writeSystemConfigurationRegister(); + } + } + + void applyInterruptConfiguration(interrupt_configuration_t interrupt_config) { + forceTRxOff(); + + _interruptOnSent(interrupt_config.interruptOnSent); + _interruptOnReceived(interrupt_config.interruptOnReceived); + _interruptOnReceiveFailed(interrupt_config.interruptOnReceiveFailed); + _interruptOnReceiveTimeout(interrupt_config.interruptOnReceiveTimeout); + _interruptOnReceiveTimestampAvailable(interrupt_config.interruptOnReceiveTimestampAvailable); + _interruptOnAutomaticAcknowledgeTrigger(interrupt_config.interruptOnAutomaticAcknowledgeTrigger); + + _writeSystemEventMaskRegister(); + } + + void setWait4Response(uint32_t timeMicroSeconds) { + _wait4resp = timeMicroSeconds == 0 ? false : true; + + /* Check if it overflows 20 bits */ + if(timeMicroSeconds > 1048575) + timeMicroSeconds = 1048575; + + byte W4R_TIME[LEN_ACK_RESP_T_W4R_TIME_SUB]; + DW1000NgUtils::writeValueToBytes(W4R_TIME, timeMicroSeconds, LEN_ACK_RESP_T_W4R_TIME_SUB); + W4R_TIME[2] &= 0x0F; + _writeBytesToRegister(ACK_RESP_T, ACK_RESP_T_W4R_TIME_SUB, W4R_TIME, LEN_ACK_RESP_T_W4R_TIME_SUB); + } + + void setTXPower(byte power[]) { + //TODO Check byte length + _writeBytesToRegister(TX_POWER, NO_SUB, power, LEN_TX_POWER); + _autoTXPower = false; + } + + void setTXPower(int32_t power) { + byte txpower[LEN_TX_POWER]; + DW1000NgUtils::writeValueToBytes(txpower, power, LEN_TX_POWER); + setTXPower(txpower); + } + + void setTXPower(DriverAmplifierValue driver_amplifier, TransmitMixerValue mixer) { + byte txpower[LEN_TX_POWER]; + byte pwr = 0x00; + + pwr |= ((byte) driver_amplifier << 5); + pwr |= (byte) mixer; + + for(auto i = 0; i < LEN_TX_POWER; i++) { + txpower[i] = pwr; + } + + setTXPower(txpower); + } + + void setTXPowerAuto() { + _autoTXPower = true; + _txpowertune(); + } + + void setTCPGDelay(byte tcpgdelay) { + byte tcpgBytes[LEN_TC_PGDELAY]; + DW1000NgUtils::writeValueToBytes(tcpgBytes, tcpgdelay, LEN_TC_PGDELAY); + _writeBytesToRegister(TX_CAL, TC_PGDELAY_SUB, tcpgBytes, LEN_TC_PGDELAY); + _autoTCPGDelay = false; + } + + void setTCPGDelayAuto() { + _tcpgdelaytune(); + _autoTCPGDelay = true; + } + + void enableTransmitPowerSpectrumTestMode(int32_t repeat_interval) { + /* DW1000 clocks must be set to crystal speed so SPI rate have to be lowered and will + not be increased again */ + SPIporting::setSPIspeed(SPIClock::SLOW); + + _disableSequencing(); + _configureRFTransmitPowerSpectrumTestMode(); + _enableClock(SYS_PLL_CLOCK); + _enableClock(TX_PLL_CLOCK); + + if(repeat_interval < 4) + repeat_interval = 4; + + /* In diagnostic transmit power mode (set next) the bytes 31:0 only are used for DX_TIME register */ + byte delayBytes[4]; + DW1000NgUtils::writeValueToBytes(delayBytes, repeat_interval, 4); + _writeBytesToRegister(DX_TIME, NO_SUB, delayBytes, 4); + + /* Enable Transmit Power Spectrum Test Mode */ + byte diagnosticBytes[2]; + DW1000NgUtils::writeValueToBytes(diagnosticBytes, 0x0010, LEN_DIAG_TMC); + _writeBytesToRegister(DIG_DIAG, DIAG_TMC_SUB, diagnosticBytes, LEN_DIAG_TMC); + } + + void setDelayedTRX(byte futureTimeBytes[]) { + /* the least significant 9-bits are ignored in DX_TIME in functional modes */ + _writeBytesToRegister(DX_TIME, NO_SUB, futureTimeBytes, LEN_DX_TIME); + } + + void setTransmitData(byte data[], uint16_t n) { + if(_frameCheck) { + n += 2; // two bytes CRC-16 + } + if(n > LEN_EXT_UWB_FRAMES) { + return; // TODO proper error handling: frame/buffer size + } + if(n > LEN_UWB_FRAMES && !_extendedFrameLength) { + return; // TODO proper error handling: frame/buffer size + } + // transmit data and length + _writeBytesToRegister(TX_BUFFER, NO_SUB, data, n); + + /* Sets up transmit frame control length based on data length */ + _txfctrl[0] = (byte)(n & 0xFF); // 1 byte (regular length + 1 bit) + _txfctrl[1] &= 0xE0; + _txfctrl[1] |= (byte)((n >> 8) & 0x03); // 2 added bits if extended length + _writeTransmitFrameControlRegister(); + } + + void setTransmitData(const String& data) { + uint16_t n = data.length()+1; + byte* dataBytes = (byte*)malloc(n); + data.getBytes(dataBytes, n); + setTransmitData(dataBytes, n); + free(dataBytes); + } + + // TODO reorder + uint16_t getReceivedDataLength() { + uint16_t len = 0; + + // 10 bits of RX frame control register + byte rxFrameInfo[LEN_RX_FINFO]; + _readBytesFromRegister(RX_FINFO, NO_SUB, rxFrameInfo, LEN_RX_FINFO); + len = ((((uint16_t)rxFrameInfo[1] << 8) | (uint16_t)rxFrameInfo[0]) & 0x03FF); + + if(_frameCheck && len > 2) { + return len-2; + } + return len; + } + + void getReceivedData(byte data[], uint16_t n) { + if(n <= 0) { + return; + } + _readBytesFromRegister(RX_BUFFER, NO_SUB, data, n); + } + + void getReceivedData(String& data) { + uint16_t i; + uint16_t n = getReceivedDataLength(); // number of bytes w/o the two FCS ones + if(n <= 0) { // TODO + return; + } + byte* dataBytes = (byte*)malloc(n); + getReceivedData(dataBytes, n); + // clear string + data.remove(0); + data = ""; + // append to string + for(i = 0; i < n; i++) { + data += (char)dataBytes[i]; + } + free(dataBytes); + } + + uint64_t getTransmitTimestamp() { + byte data[LENGTH_TIMESTAMP]; + memset(data, 0 , LENGTH_TIMESTAMP); + _readBytesFromRegister(TX_TIME, TX_STAMP_SUB, data, LEN_TX_STAMP); + return DW1000NgUtils::bytesAsValue(data, LEN_TX_STAMP); + } + + uint64_t getReceiveTimestamp() { + byte data[LEN_RX_STAMP]; + memset(data, 0, LEN_RX_STAMP); + _readBytesFromRegister(RX_TIME, RX_STAMP_SUB, data, LEN_RX_STAMP); + return DW1000NgUtils::bytesAsValue(data, LEN_RX_STAMP); + } + + uint64_t getSystemTimestamp() { + byte data[LEN_SYS_TIME]; + memset(data, 0, LEN_SYS_TIME); + _readBytesFromRegister(SYS_TIME, NO_SUB, data, LEN_SYS_TIME); + return DW1000NgUtils::bytesAsValue(data, LEN_SYS_TIME); + } + + float getReceiveQuality() { + byte noiseBytes[LEN_STD_NOISE]; + byte fpAmpl2Bytes[LEN_FP_AMPL2]; + uint16_t noise, f2; + _readBytesFromRegister(RX_FQUAL, STD_NOISE_SUB, noiseBytes, LEN_STD_NOISE); + _readBytesFromRegister(RX_FQUAL, FP_AMPL2_SUB, fpAmpl2Bytes, LEN_FP_AMPL2); + noise = (uint16_t)noiseBytes[0] | ((uint16_t)noiseBytes[1] << 8); + f2 = (uint16_t)fpAmpl2Bytes[0] | ((uint16_t)fpAmpl2Bytes[1] << 8); + return (float)f2/noise; + } + + float getFirstPathPower() { + byte fpAmpl1Bytes[LEN_FP_AMPL1]; + byte fpAmpl2Bytes[LEN_FP_AMPL2]; + byte fpAmpl3Bytes[LEN_FP_AMPL3]; + byte rxFrameInfo[LEN_RX_FINFO]; + uint16_t f1, f2, f3, N; + float A, corrFac; + _readBytesFromRegister(RX_TIME, FP_AMPL1_SUB, fpAmpl1Bytes, LEN_FP_AMPL1); + _readBytesFromRegister(RX_FQUAL, FP_AMPL2_SUB, fpAmpl2Bytes, LEN_FP_AMPL2); + _readBytesFromRegister(RX_FQUAL, FP_AMPL3_SUB, fpAmpl3Bytes, LEN_FP_AMPL3); + _readBytesFromRegister(RX_FINFO, NO_SUB, rxFrameInfo, LEN_RX_FINFO); + f1 = (uint16_t)fpAmpl1Bytes[0] | ((uint16_t)fpAmpl1Bytes[1] << 8); + f2 = (uint16_t)fpAmpl2Bytes[0] | ((uint16_t)fpAmpl2Bytes[1] << 8); + f3 = (uint16_t)fpAmpl3Bytes[0] | ((uint16_t)fpAmpl3Bytes[1] << 8); + N = (((uint16_t)rxFrameInfo[2] >> 4) & 0xFF) | ((uint16_t)rxFrameInfo[3] << 4); + + if(_pulseFrequency == PulseFrequency::FREQ_16MHZ) { + A = 113.77; + corrFac = 2.3334; + } else { + A = 121.74; + corrFac = 1.1667; + } + float estFpPwr = 10.0*log10(((float)f1*(float)f1+(float)f2*(float)f2+(float)f3*(float)f3)/((float)N*(float)N))-A; + if(estFpPwr <= -88) { + return estFpPwr; + } else { + // approximation of Fig. 22 in user manual for dbm correction + estFpPwr += (estFpPwr+88)*corrFac; + } + return estFpPwr; + } + + float getReceivePower() { + byte cirPwrBytes[LEN_CIR_PWR]; + byte rxFrameInfo[LEN_RX_FINFO]; + uint32_t twoPower17 = 131072; + uint16_t C, N; + float A, corrFac; + _readBytesFromRegister(RX_FQUAL, CIR_PWR_SUB, cirPwrBytes, LEN_CIR_PWR); + _readBytesFromRegister(RX_FINFO, NO_SUB, rxFrameInfo, LEN_RX_FINFO); + C = (uint16_t)cirPwrBytes[0] | ((uint16_t)cirPwrBytes[1] << 8); + N = (((uint16_t)rxFrameInfo[2] >> 4) & 0xFF) | ((uint16_t)rxFrameInfo[3] << 4); + + if(_pulseFrequency == PulseFrequency::FREQ_16MHZ) { + A = 113.77; + corrFac = 2.3334; + } else { + A = 121.74; + corrFac = 1.1667; + } + + float estRxPwr = 10.0*log10(((float)C*(float)twoPower17)/((float)N*(float)N))-A; + if(estRxPwr <= -88) { + return estRxPwr; + } else { + // approximation of Fig. 22 in user manual for dbm correction + estRxPwr += (estRxPwr+88)*corrFac; + } + return estRxPwr; + } + + #if DW1000NG_DEBUG + void getPrettyBytes(byte data[], char msgBuffer[], uint16_t n) { + uint16_t i, j, b; + b = sprintf(msgBuffer, "Data, bytes: %d\nB: 7 6 5 4 3 2 1 0\n", n); // TODO - type + for(i = 0; i < n; i++) { + byte curByte = data[i]; + snprintf(&msgBuffer[b++], 2, "%d", (i+1)); + msgBuffer[b++] = (char)((i+1) & 0xFF); + msgBuffer[b++] = ':'; + msgBuffer[b++] = ' '; + for(j = 0; j < 8; j++) { + msgBuffer[b++] = ((curByte >> (7-j)) & 0x01) ? '1' : '0'; + if(j < 7) { + msgBuffer[b++] = ' '; + } else if(i < n-1) { + msgBuffer[b++] = '\n'; + } else { + msgBuffer[b++] = '\0'; + } + } + } + msgBuffer[b++] = '\0'; + } + + void getPrettyBytes(byte cmd, uint16_t offset, char msgBuffer[], uint16_t n) { + uint16_t i, j, b; + byte* readBuf = (byte*)malloc(n); + _readBytesFromRegister(cmd, offset, readBuf, n); + b = sprintf(msgBuffer, "Reg: 0x%02x, bytes: %d\nB: 7 6 5 4 3 2 1 0\n", cmd, n); // TODO - tpye + for(i = 0; i < n; i++) { + byte curByte = readBuf[i]; + snprintf(&msgBuffer[b++], 2, "%d", (i+1)); + msgBuffer[b++] = (char)((i+1) & 0xFF); + msgBuffer[b++] = ':'; + msgBuffer[b++] = ' '; + for(j = 0; j < 8; j++) { + msgBuffer[b++] = ((curByte >> (7-j)) & 0x01) ? '1' : '0'; + if(j < 7) { + msgBuffer[b++] = ' '; + } else if(i < n-1) { + msgBuffer[b++] = '\n'; + } else { + msgBuffer[b++] = '\0'; + } + } + } + msgBuffer[b++] = '\0'; + free(readBuf); + } + #endif +} diff --git a/src/dwm1000/DW1000Ng.hpp b/src/dwm1000/DW1000Ng.hpp new file mode 100644 index 0000000..fd871d0 --- /dev/null +++ b/src/dwm1000/DW1000Ng.hpp @@ -0,0 +1,608 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +/* + * Copyright (c) 2015 by Thomas Trojer + * Decawave DW1000Ng library for arduino. + * + * 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. + * + * @file DW1000Ng.h + * Arduino driver library (header file) for the Decawave DW1000Ng UWB transceiver Module. + */ + +#pragma once + +#include +#include +#include +#include "Adafruit_MCP23017.h" +#include "driver/spi_master.h" +#include "DW1000NgConstants.hpp" +#include "DW1000NgConfiguration.hpp" +#include "DW1000NgCompileOptions.hpp" + +namespace DW1000Ng { + /** + Initiates and starts a sessions with a DW1000. If rst is not set or value 0xff, a soft resets (i.e. command + triggered) are used and it is assumed that no reset line is wired. + + @param[in] ss The SPI Selection pin used to identify the specific connection + @param[in] irq The interrupt line/pin that connects the Arduino. + @param[in] rst The reset line/pin for hard resets of ICs that connect to the Arduino. Value 0xff means soft reset. + */ + void initialize(uint8_t ss, uint8_t irq, uint8_t rst, spi_host_device_t spihost,Adafruit_MCP23017 *expander); + + /** + Enable debounce Clock, used to clock the LED blinking + */ + void enableDebounceClock(); + + /** + Enable led blinking feature + */ + void enableLedBlinking(); + + /** + Set DW1000's GPIO pins mode + */ + void setGPIOMode(uint8_t msgp, uint8_t mode); + + /** + Applies the common sleep configuration and on-wake mode to the DW1000 for both DEEP_SLEEP and SLEEP modes. + ONW_LLDO_BIT and ONW_LLDE_BIT are 1 to default. + + @param [in] config struct The sleep/deepsleep configuration to apply to the DW1000 + */ + void applySleepConfiguration(sleep_configuration_t sleep_config); + + /** + Enter in DeepSleep. applySleepConfiguration must be called first. + Either spi wakeup or pin wakeup must be enabled. + -- In case of future implementation of Sleep mode, you must reset proper antenna delay with setTxAntennaDelay() after wakeUp event. -- + */ + void deepSleep(); + + /** + Wake-up from deep sleep by toggle chip select pin + */ + void spiWakeup(); + + /** + Resets all connected or the currently selected DW1000 chip. + Uses hardware reset or in case the reset pin is not wired it falls back to software Reset. + */ + void reset(); + + /** + Resets the currently selected DW1000 chip programmatically (via corresponding commands). + */ + void softwareReset(); + + /** + (Re-)set the network identifier which the selected chip should be associated with. This + setting is important for certain MAC address filtering rules. + This is also referred as PanId + + @param[in] val An arbitrary numeric network identifier. + */ + void setNetworkId(uint16_t val); + + /** + Gets the network identifier (a.k.a PAN id) set for the device + + @param[out] id the bytes that represent the PAN id (2 bytes) + */ + void getNetworkId(byte id[]); + + /** + (Re-)set the device address (i.e. short address) for the currently selected chip. This + setting is important for certain MAC address filtering rules. + + @param[in] val An arbitrary numeric device address. + */ + void setDeviceAddress(uint16_t val); + + /** + Gets the short address identifier set for the device + + @param[out] address the bytes that represent the short address of the device(2 bytes) + */ + void getDeviceAddress(byte address[]); + + /** + Sets the device Extended Unique Identifier. + This is a long identifier of the device. + + @param[in] eui A string containing the eui in its normal notation using columns. + */ + void setEUI(char eui[]); + + /** + Sets the device Extended Unique Identifier. + This is a long identifier of the device. + + @param[in] eui The raw bytes of the eui. + */ + void setEUI(byte eui[]); + + /** + Gets the device Extended Unique Identifier. + + @param[out] eui The 8 bytes of the EUI. + */ + void getEUI(byte eui[]); + + /** + Sets the transmission power of the device. + Be careful to respect your current country limitations. + + @param[in] power Bytes that represent the power + */ + void setTXPower(byte power[]); + + /** + Sets the transmission power of the device. + Be careful to respect your current country limitations. + + @param[in] power Bytes (written as a 32-bit number) that represent the power + */ + void setTXPower(int32_t power); + + /** + Sets the transmission power of the device. + Be careful to respect your current country limitations. + + @param[in] driver_amplifier Base power amplifier + @param[in] mixer Mixer power + */ + void setTXPower(DriverAmplifierValue driver_amplifier, TransmitMixerValue mixer); + + /** + Automatically sets power in respect to the current device settings. + This should be guaranteed to set power under -41.3 dBm / MHz (legal limit in most countries). + */ + void setTXPowerAuto(); + + /** + Sets the pulse generator delay value. + You should use the setTCPGDelayAuto() function. + */ + void setTCPGDelay(byte tcpg_delay); + + /** + Automatically sets pulse generator delay value + */ + void setTCPGDelayAuto(); + + /** + Enables transmit power spectrum test mode that is used for Transmit Power regulatory testing + + @param [in] repeat_interval the interval to repeat the transmission + */ + void enableTransmitPowerSpectrumTestMode(int32_t repeat_interval); + + /** + Sets a delay for transmission and receive + + @param [in] futureTimeBytes the timestamp in bytes of the time of the transmission (in UWB time) + */ + void setDelayedTRX(byte futureTimeBytes[]); + + /** + Sets the transmission bytes inside the tx buffer of the DW1000 + + @param [in] data the bytes to transmit + @param [in] n the length of the array of bytes + */ + void setTransmitData(byte data[], uint16_t n); + + /** + Sets the transmission bytes inside the tx buffer of the DW1000 based on the input string + + @param [in] data the string to transmit + */ + void setTransmitData(const String& data); + + /** + Gets the received bytes and stores them in a byte array + + @param [out] data The array of byte to store the data + @param [out] n The length of the byte array + */ + void getReceivedData(byte data[], uint16_t n); + + /** + Stores the received data inside a string + + param [out] data the string that will contain the data + */ + void getReceivedData(String& data); + + /** + Calculates the length of the received data + + returns the length of the data + */ + uint16_t getReceivedDataLength(); + + /** + Calculates the latest transmission timestamp + + return the last transmission timestamp + */ + uint64_t getTransmitTimestamp(); + + /** + Calculates the latest receive timestamp + + return the last receive timestamp + */ + uint64_t getReceiveTimestamp(); + + /** + Calculates the current system timestamp inside the DW1000 + + return the system timestamp + */ + uint64_t getSystemTimestamp(); + + /* receive quality information. (RX_FSQUAL) - reg:0x12 */ + + /** + Gets the receive power of the device (last receive) + + returns the last receive power of the device + */ + float getReceivePower(); + + /** + Gets the power of the first path + + returns the first path power + */ + float getFirstPathPower(); + + /** + Gets the last receive quality + + returns last receive quality + */ + float getReceiveQuality(); + + /** + Sets both tx and rx antenna delay value + + @param [in] value the delay in UWB time + */ + void setAntennaDelay(uint16_t value); + + #if defined(__AVR__) + /** + Sets both tx and rx antenna delay value, and saves it in the EEPROM for future use + + @param [in] value the delay in UWB time + @param [in] the EEPROM offset at which the delay is saved + */ + void setAndSaveAntennaDelay(uint16_t delay, uint8_t eeAddress = 0); + + /** + Gets the saved antenna delay value from EEPROM + + returns the value of the delay saved in the EEPROM in UWB time + + @param [in] the EEPROM offset at which the delay is saved + */ + uint16_t getSavedAntennaDelay(uint8_t eeAddress = 0); + + /** + Sets the saved antenna delay value from EEPROM as the configured delay + + @param [in] the EEPROM offset at which the delay is saved + */ + uint16_t setAntennaDelayFromEEPROM(uint8_t eeAddress = 0); + #endif + + /** + Sets the tx antenna delay value + + @param [in] value the delay in UWB time + */ + void setTxAntennaDelay(uint16_t value); + + /** + Sets the rx antenna delay value + + @param [in] value the delay in UWB time + */ + void setRxAntennaDelay(uint16_t value); + + /** + Gets the tx antenna delay value + + returns the value of the delay in UWB time + */ + uint16_t getTxAntennaDelay(); + + /** + Gets the rx antenna delay value + + returns the value of the delay in UWB time + */ + uint16_t getRxAntennaDelay(); + + /** + Sets the function for error event handling + + @param [in] handleError the target function + */ + void attachErrorHandler(void (* handleError)(void)); + + /** + Sets the function for end of transission event handling + + @param [in] handleSent the target function + */ + void attachSentHandler(void (* handleSent)(void)); + + /** + Sets the function for end of receive event handling + + @param [in] handleReceived the target function + */ + void attachReceivedHandler(void (* handleReceived)(void)); + + /** + Sets the function for receive error event handling + + @param [in] handleReceiveFailed the target function + */ + void attachReceiveFailedHandler(void (* handleReceiveFailed)(void)); + + /** + Sets the function for receive timeout event handling + + @param [in] handleReceiveTimeout the target function + */ + void attachReceiveTimeoutHandler(void (* handleReceiveTimeout)(void)); + + /** + Sets the function for receive timestamp availabe event handling + + @param [in] handleReceiveTimestampAvailable the target function + */ + void attachReceiveTimestampAvailableHandler(void (* handleReceiveTimestampAvailable)(void)); + + /** + Handles dw1000 events triggered by interrupt + By default this is attached to the interrupt pin callback + */ + void interruptServiceRoutine(); + + boolean isTransmitDone(); + + void clearTransmitStatus(); + + boolean isReceiveDone(); + + void clearReceiveStatus(); + + boolean isReceiveFailed(); + + void clearReceiveFailedStatus(); + + boolean isReceiveTimeout(); + + void clearReceiveTimeoutStatus(); + + /** + Stops the transceiver immediately, this actually sets the device in Idle mode. + */ + void forceTRxOff(); + + /** + Sets the interrupt polarity + + By default this is set to true by the DW1000 + + @param [in] val True here means active high + */ + void setInterruptPolarity(boolean val); + + /** + Applies the target configuration to the DW1000 + + @param [in] config the configuration to apply to the DW1000 + */ + void applyConfiguration(device_configuration_t config); + + /** + Enables the interrupts for the target events + + @param [in] interrupt_config the interrupt map to use + */ + void applyInterruptConfiguration(interrupt_configuration_t interrupt_config); + + /** + Gets the current channel in use + + returns the current channel + */ + Channel getChannel(); + + /** + Gets the current PRF of the device + + returns the current PRF + */ + PulseFrequency getPulseFrequency(); + + /** + Sets the timeout for Raceive Frame. + + @param[in] Pac size based on current preamble lenght - 1 + */ + void setPreambleDetectionTimeout(uint16_t pacSize); + + /** + Sets the timeout for SFD detection. + The recommended value is: PreambleLenght + SFD + 1. + The default value is 4096+64+1 + + @param[in] the sfd detection timeout + */ + void setSfdDetectionTimeout(uint16_t preambleSymbols); + + /** + Sets the timeout for Raceive Frame. Must be sets in idle mode. + Allow the external microprocessor to enter a low power state awaiting a valid receive frame. + + @param[in] time in Îŧs. units = ~1Îŧs(1.026Îŧs). 0 to disable + */ + void setReceiveFrameWaitTimeoutPeriod(uint16_t timeMicroSeconds); + + /** + Sets the device in receive mode + + @param [in] mode IMMEDIATE or DELAYED receive + */ + void startReceive(ReceiveMode mode = ReceiveMode::IMMEDIATE); + + /** + Sets the device in transmission mode + + @param [in] mode IMMEDIATE or DELAYED transmission + */ + void startTransmit(TransmitMode mode = TransmitMode::IMMEDIATE); + + /** + Gets the temperature inside the DW1000 Device + + returns The temperature + */ + float getTemperature(); + + /** + Gets the voltage in input of the DW1000 + + returns The input voltage + */ + float getBatteryVoltage(); + + /** + Gets both temperature and voltage with a single read + + @param [out] temp the temperature + @param [out] vbat the input voltage + */ + void getTemperatureAndBatteryVoltage(float& temp, float& vbat); + + /** + Enables the frame filtering functionality using the provided configuration. + Messages must be formatted using 802.15.4-2011 format. + + @param [in] config frame filtering configuration + */ + void enableFrameFiltering(frame_filtering_configuration_t config); + + /** + Disables the frame filtering functionality + */ + void disableFrameFiltering(); + + /** + WARNING: this just sets the relative bits inside the register. + You must refer to the DW1000 User manual to activate it properly. + */ + void setDoubleBuffering(boolean val); + + /** + Enables frames up to 1023 byte length + + @param [in] val true or false + */ + void useExtendedFrameLength(boolean val); + + /** + Sets the time before the device enters receive after a transmission. + Use 0 here to deactivate it. + + @param[in] time in Îŧs. units = ~1Îŧs(1.026Îŧs) + */ + void setWait4Response(uint32_t timeMicroSeconds); + + #if DW1000NG_PRINTABLE + + /* ##### Print device id, address, etc. ###################################### */ + /** + Generates a String representation of the device identifier of the chip. That usually + are the letters "DECA" plus the version and revision numbers of the chip. + + @param[out] msgBuffer The String buffer to be filled with printable device information. + Provide 128 bytes, this should be sufficient. + */ + void getPrintableDeviceIdentifier(char msgBuffer[]); + + /** + Generates a String representation of the extended unique identifier (EUI) of the chip. + + @param[out] msgBuffer The String buffer to be filled with printable device information. + Provide 128 bytes, this should be sufficient. + */ + void getPrintableExtendedUniqueIdentifier(char msgBuffer[]); + + /** + Generates a String representation of the short address and network identifier currently + defined for the respective chip. + + @param[out] msgBuffer The String buffer to be filled with printable device information. + Provide 128 bytes, this should be sufficient. + */ + void getPrintableNetworkIdAndShortAddress(char msgBuffer[]); + + /** + Generates a String representation of the main operational settings of the chip. This + includes data rate, pulse repetition frequency, preamble and channel settings. + + @param[out] msgBuffer The String buffer to be filled with printable device information. + Provide 128 bytes, this should be sufficient. + */ + void getPrintableDeviceMode(char msgBuffer[]); + #endif + + #if DW1000NG_DEBUG + void getPrettyBytes(byte data[], char msgBuffer[], uint16_t n); + void getPrettyBytes(byte cmd, uint16_t offset, char msgBuffer[], uint16_t n); + #endif +}; diff --git a/src/dwm1000/DW1000NgCompileOptions.hpp b/src/dwm1000/DW1000NgCompileOptions.hpp new file mode 100644 index 0000000..a61c3b8 --- /dev/null +++ b/src/dwm1000/DW1000NgCompileOptions.hpp @@ -0,0 +1,70 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +/** + * Copyright (c) 2016 by Ludwig Grill (www.rotzbua.de) + * Decawave DW1000 library for arduino. + * + * 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. + * + * @file DW1000CompileOptions.h + * Here are some options to optimize code and save some ram and rom + * + */ + +#pragma once + +/** + * Adds printing functions to base driver + * +*/ +#define DW1000NG_PRINTABLE true +/** + * Adds debug functionalities + * +*/ +#define DW1000NG_DEBUG false + +/** + * Optimizes code for the DWM1000 Module + */ +#define DWM1000_OPTIMIZED false + +/** + * Printable DW1000NgDeviceConfiguration about: rom:2494 byte ; ram 256 byte + * This option is needed because compiler can not optimize unused codes from inheritanced methods + * Some examples or debug code use this + * Set false if you do not need it and have to save some space + */ +#define DW1000NGCONFIGURATION_H_PRINTABLE false \ No newline at end of file diff --git a/src/dwm1000/DW1000NgConfiguration.hpp b/src/dwm1000/DW1000NgConfiguration.hpp new file mode 100644 index 0000000..5362238 --- /dev/null +++ b/src/dwm1000/DW1000NgConfiguration.hpp @@ -0,0 +1,73 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +#pragma once + +#include +#include "DW1000NgConstants.hpp" + +typedef struct device_configuration_t { + boolean extendedFrameLength; + boolean receiverAutoReenable; + boolean smartPower; + boolean frameCheck; + boolean nlos; + SFDMode sfd; + Channel channel; + DataRate dataRate; + PulseFrequency pulseFreq; + PreambleLength preambleLen; + PreambleCode preaCode; +} device_configuration_t; + +typedef struct interrupt_configuration_t { + boolean interruptOnSent; + boolean interruptOnReceived; + boolean interruptOnReceiveFailed; + boolean interruptOnReceiveTimeout; + boolean interruptOnReceiveTimestampAvailable; + boolean interruptOnAutomaticAcknowledgeTrigger; +} interrupt_configuration_t; + +typedef struct frame_filtering_configuration_t { + boolean behaveAsCoordinator; + boolean allowBeacon; + boolean allowData; + boolean allowAcknowledgement; + boolean allowMacCommand; + boolean allowAllReserved; + boolean allowReservedFour; + boolean allowReservedFive; +} frame_filtering_configuration_t; + +typedef struct sleep_configuration_t { + boolean onWakeUpRunADC; + boolean onWakeUpReceive; + boolean onWakeUpLoadEUI; + boolean onWakeUpLoadL64Param; + boolean preserveSleep; + boolean enableSLP; + boolean enableWakePIN; + boolean enableWakeSPI; +} sleep_configuration_t; \ No newline at end of file diff --git a/src/dwm1000/DW1000NgConstants.hpp b/src/dwm1000/DW1000NgConstants.hpp new file mode 100644 index 0000000..097a3d7 --- /dev/null +++ b/src/dwm1000/DW1000NgConstants.hpp @@ -0,0 +1,235 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +#pragma once + +#include + +#define GPIO_MODE 0 +#define LED_MODE 1 + + + constexpr float TIME_RES = 0.000015650040064103f; + constexpr float TIME_RES_INV = 63897.6f; + + /* Speed of radio waves (light) [m/s] * timestamp resolution [~15.65ps] of DW1000Ng */ + constexpr float DISTANCE_OF_RADIO = 0.0046917639786159f; + constexpr float DISTANCE_OF_RADIO_INV = 213.139451293f; + + // timestamp byte length - 40 bit -> 5 byte + constexpr uint8_t LENGTH_TIMESTAMP = 5; + + // timer/counter overflow (40 bits) -> 4overflow approx. every 17.2 seconds + constexpr int64_t TIME_OVERFLOW = 0x10000000000; //1099511627776LL + constexpr int64_t TIME_MAX = 0xffffffffff; + + // time factors (relative to [us]) for setting delayed transceive + // TODO use non float + constexpr float SECONDS = 1e6; + constexpr float MILLISECONDS = 1e3; + constexpr float MICROSECONDS = 1; + constexpr float NANOSECONDS = 1e-3; + +/* preamble codes (CHAN_CTRL - RX & TX _CODE) - reg:0x1F, bits:31-27,26-22 */ + +enum class PreambleCode : byte { + CODE_1 = 1, + CODE_2, + CODE_3, + CODE_4, + CODE_5, + CODE_6, + CODE_7, + CODE_8, + CODE_9, + CODE_10, + CODE_11, + CODE_12, + CODE_17 = 17, + CODE_18, + CODE_19, + CODE_20 +}; + +/* Validity matrix for 16 MHz PRF preamble codes */ +constexpr byte preamble_validity_matrix_PRF16[8][2] = { + {0,0}, /* Channel 0 doesn't exist */ + {1, 2}, + {3, 4}, + {5, 6}, + {7, 8}, + {3, 4}, + {0,0}, /* Channel 5 doesn't exist */ + {7, 8} +}; + +/* Validity matrix for 64 MHz PRF preamble codes */ +constexpr byte preamble_validity_matrix_PRF64[8][4] = { + {0,0,0,0}, /* Channel 0 doesn't exist */ + {9, 10, 11, 12}, + {9, 10, 11, 12}, + {9, 10, 11, 12}, + {17, 18, 19, 20}, + {9, 10, 11, 12}, + {0,0,0,0}, /* Channel 5 doesn't exist */ + {17, 18, 19, 20} +}; + +/* transmission/reception bit rate (TXBR) - reg:0x08, bits:14,13 */ +enum class DataRate : byte { + RATE_110KBPS, + RATE_850KBPS, + RATE_6800KBPS +}; + +/* transmission pulse frequency (TXPRF) - reg:0x08, bits:17,16 +* 0x00 is 4MHZ, but receiver in DW1000Ng does not support it (!??) */ +enum class PulseFrequency : byte { + FREQ_16MHZ = 0x01, + FREQ_64MHZ +}; + +/* preamble length (PE + TXPSR) - reg:0x08, bits:21,20,19,18 - table 16 */ +enum class PreambleLength : byte { + LEN_64 = 0x01, + LEN_128 = 0x05, + LEN_256 = 0x09, + LEN_512 = 0x0D, + LEN_1024 = 0x02, + LEN_1536 = 0x06, + LEN_2048 = 0x0A, + LEN_4096 = 0x03 +}; + + +/* PAC size (DRX_TUNE2) - reg:0x08, sub-reg:0x27, bits:26,25 - table 33 +* The value to program the sub-register changes in based of RXPRF */ +enum class PacSize : byte { + SIZE_8 = 8, + SIZE_16 = 16, + SIZE_32 = 32, + SIZE_64 = 64 +}; + +/* channel of operation (CHAN_CTRL - TX & RX _CHAN) - reg:0x1F, bits:3-0,7-4 */ +enum class Channel : byte { + CHANNEL_1 = 1, + CHANNEL_2, + CHANNEL_3, + CHANNEL_4, + CHANNEL_5, + CHANNEL_7 = 7 +}; + +/* Register is 6 bit, 7 = write, 6 = sub-adressing, 5-0 = register value + * Total header with sub-adressing can be 15 bit. */ +constexpr byte WRITE = 0x80; // regular write +constexpr byte WRITE_SUB = 0xC0; // write with sub address +constexpr byte READ = 0x00; // regular read +constexpr byte READ_SUB = 0x40; // read with sub address +constexpr byte RW_SUB_EXT = 0x80; // R/W with sub address extension + +/* clocks available. */ +constexpr byte SYS_AUTO_CLOCK = 0x00; +constexpr byte SYS_XTI_CLOCK = 0x01; +constexpr byte SYS_PLL_CLOCK = 0x02; +constexpr byte TX_PLL_CLOCK = 0x20; +constexpr byte LDE_CLOCK = 0x03; + +/* range bias tables - APS011*/ + +constexpr double BIAS_TABLE[18][5] = { + {61, -198, -110, -275, -295}, + {63, -187, -105, -244, -266}, + {65, -179, -100, -210, -235}, + {67, -163, -93, -176, -199}, + {69, -143, -82, -138, -150}, + {71, -127, -69, -95, -100}, + {73, -109, -51, -51, -58}, + {75, -84, -27, 0, 0}, + {77, -59, 0, 42, 49}, + {79, -31, 21, 97, 91}, + {81, 0, 35, 158, 127}, + {83, 36, 42, 210, 153}, + {85, 65, 49, 254, 175}, + {87, 84, 62, 294, 197}, + {89, 97, 71, 321, 233}, + {91, 106, 76, 339, 245}, + {93, 110, 81, 356, 264}, + {95, 112, 86, 394, 284} +}; + +enum class DriverAmplifierValue : byte { + dB_18, + dB_15, + dB_12, + dB_9, + dB_6, + dB_3, + dB_0, + OFF +}; + +enum class TransmitMixerValue : byte { + dB_0, + dB_0_5, + dB_1, + dB_1_5, + dB_2, + dB_2_5, + dB_3, + dB_3_5, + dB_4, + dB_4_5, + dB_5, + dB_5_5, + dB_6, + dB_6_5, + dB_7, + dB_7_5, + dB_8, + dB_8_5, + dB_9, + dB_9_5, + dB_10, + dB_10_5, + dB_11, + dB_11_5, + dB_12, + dB_12_5, + dB_13, + dB_13_5, + dB_14, + dB_14_5, + dB_15, + dB_15_5 +}; + +enum class SFDMode {STANDARD_SFD, DECAWAVE_SFD}; + +enum class TransmitMode {IMMEDIATE, DELAYED}; + +enum class ReceiveMode {IMMEDIATE, DELAYED}; + +enum class SPIClock {SLOW, FAST}; \ No newline at end of file diff --git a/src/dwm1000/DW1000NgRTLS.cpp b/src/dwm1000/DW1000NgRTLS.cpp new file mode 100644 index 0000000..1e0dcd6 --- /dev/null +++ b/src/dwm1000/DW1000NgRTLS.cpp @@ -0,0 +1,349 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +#include +#include "DW1000NgRTLS.hpp" +#include "DW1000Ng.hpp" +#include "DW1000NgUtils.hpp" +#include "DW1000NgTime.hpp" +#include "DW1000NgRanging.hpp" + +static byte SEQ_NUMBER = 0; + +namespace DW1000NgRTLS { + + byte increaseSequenceNumber(){ + return ++SEQ_NUMBER; + } + + void transmitTwrShortBlink() { + byte Blink[] = {BLINK, SEQ_NUMBER++, 0,0,0,0,0,0,0,0, NO_BATTERY_STATUS | NO_EX_ID, TAG_LISTENING_NOW}; + DW1000Ng::getEUI(&Blink[2]); + DW1000Ng::setTransmitData(Blink, sizeof(Blink)); + DW1000Ng::startTransmit(); + } + + void transmitRangingInitiation(byte tag_eui[], byte tag_short_address[]) { + byte RangingInitiation[] = {DATA, SHORT_SRC_LONG_DEST, SEQ_NUMBER++, 0,0, 0,0,0,0,0,0,0,0, 0,0, RANGING_INITIATION, 0,0}; + DW1000Ng::getNetworkId(&RangingInitiation[3]); + memcpy(&RangingInitiation[5], tag_eui, 8); + DW1000Ng::getDeviceAddress(&RangingInitiation[13]); + memcpy(&RangingInitiation[16], tag_short_address, 2); + DW1000Ng::setTransmitData(RangingInitiation, sizeof(RangingInitiation)); + DW1000Ng::startTransmit(); + } + + void transmitPoll(byte anchor_address[]){ + byte Poll[] = {DATA, SHORT_SRC_AND_DEST, SEQ_NUMBER++, 0,0, 0,0, 0,0 , RANGING_TAG_POLL}; + DW1000Ng::getNetworkId(&Poll[3]); + memcpy(&Poll[5], anchor_address, 2); + DW1000Ng::getDeviceAddress(&Poll[7]); + DW1000Ng::setTransmitData(Poll, sizeof(Poll)); + DW1000Ng::startTransmit(); + } + + void transmitResponseToPoll(byte tag_short_address[]) { + byte pollAck[] = {DATA, SHORT_SRC_AND_DEST, SEQ_NUMBER++, 0,0, 0,0, 0,0, ACTIVITY_CONTROL, RANGING_CONTINUE, 0, 0}; + DW1000Ng::getNetworkId(&pollAck[3]); + memcpy(&pollAck[5], tag_short_address, 2); + DW1000Ng::getDeviceAddress(&pollAck[7]); + DW1000Ng::setTransmitData(pollAck, sizeof(pollAck)); + DW1000Ng::startTransmit(); + } + + void transmitFinalMessage(byte anchor_address[], uint16_t reply_delay, uint64_t timePollSent, uint64_t timeResponseToPollReceived) { + /* Calculation of future time */ + byte futureTimeBytes[LENGTH_TIMESTAMP]; + + uint64_t timeFinalMessageSent = DW1000Ng::getSystemTimestamp(); + timeFinalMessageSent += DW1000NgTime::microsecondsToUWBTime(reply_delay); + DW1000NgUtils::writeValueToBytes(futureTimeBytes, timeFinalMessageSent, LENGTH_TIMESTAMP); + DW1000Ng::setDelayedTRX(futureTimeBytes); + timeFinalMessageSent += DW1000Ng::getTxAntennaDelay(); + + byte finalMessage[] = {DATA, SHORT_SRC_AND_DEST, SEQ_NUMBER++, 0,0, 0,0, 0,0, RANGING_TAG_FINAL_RESPONSE_EMBEDDED, + 0,0,0,0,0,0,0,0,0,0,0,0 + }; + + DW1000Ng::getNetworkId(&finalMessage[3]); + memcpy(&finalMessage[5], anchor_address, 2); + DW1000Ng::getDeviceAddress(&finalMessage[7]); + + DW1000NgUtils::writeValueToBytes(finalMessage + 10, (uint32_t) timePollSent, 4); + DW1000NgUtils::writeValueToBytes(finalMessage + 14, (uint32_t) timeResponseToPollReceived, 4); + DW1000NgUtils::writeValueToBytes(finalMessage + 18, (uint32_t) timeFinalMessageSent, 4); + DW1000Ng::setTransmitData(finalMessage, sizeof(finalMessage)); + DW1000Ng::startTransmit(TransmitMode::DELAYED); + } + + void transmitRangingConfirm(byte tag_short_address[], byte next_anchor[]) { + byte rangingConfirm[] = {DATA, SHORT_SRC_AND_DEST, SEQ_NUMBER++, 0,0, 0,0, 0,0, ACTIVITY_CONTROL, RANGING_CONFIRM, next_anchor[0], next_anchor[1]}; + DW1000Ng::getNetworkId(&rangingConfirm[3]); + memcpy(&rangingConfirm[5], tag_short_address, 2); + DW1000Ng::getDeviceAddress(&rangingConfirm[7]); + DW1000Ng::setTransmitData(rangingConfirm, sizeof(rangingConfirm)); + DW1000Ng::startTransmit(); + } + + void transmitActivityFinished(byte tag_short_address[], byte blink_rate[]) { + /* I send the new blink rate to the tag */ + byte rangingConfirm[] = {DATA, SHORT_SRC_AND_DEST, SEQ_NUMBER++, 0,0, 0,0, 0,0, ACTIVITY_CONTROL, ACTIVITY_FINISHED, blink_rate[0], blink_rate[1]}; + DW1000Ng::getNetworkId(&rangingConfirm[3]); + memcpy(&rangingConfirm[5], tag_short_address, 2); + DW1000Ng::getDeviceAddress(&rangingConfirm[7]); + DW1000Ng::setTransmitData(rangingConfirm, sizeof(rangingConfirm)); + DW1000Ng::startTransmit(); + } + + static uint32_t calculateNewBlinkRate(byte frame[]) { + uint32_t blinkRate = frame[11] + static_cast(((frame[12] & 0x3F) << 8)); + byte multiplier = ((frame[12] & 0xC0) >> 6); + if(multiplier == 0x01) { + blinkRate *= 25; + } else if(multiplier == 0x02) { + blinkRate *= 1000; + } + + return blinkRate; + } + + void waitForTransmission() { + while(!DW1000Ng::isTransmitDone()) { + #if defined(ESP8266) + yield(); + #endif + } + DW1000Ng::clearTransmitStatus(); + } + + boolean receiveFrame() { + DW1000Ng::startReceive(); + while(!DW1000Ng::isReceiveDone()) { + if(DW1000Ng::isReceiveTimeout() ) { + DW1000Ng::clearReceiveTimeoutStatus(); + return false; + } + #if defined(ESP8266) + yield(); + #endif + } + DW1000Ng::clearReceiveStatus(); + return true; + } + + static boolean waitForNextRangingStep() { + DW1000NgRTLS::waitForTransmission(); + if(!DW1000NgRTLS::receiveFrame()) return false; + return true; + } + + RangeRequestResult tagRangeRequest() { + DW1000NgRTLS::transmitTwrShortBlink(); + + if(!DW1000NgRTLS::waitForNextRangingStep()) return {false, 0}; + + size_t init_len = DW1000Ng::getReceivedDataLength(); + byte init_recv[init_len]; + DW1000Ng::getReceivedData(init_recv, init_len); + + if(!(init_len > 17 && init_recv[15] == RANGING_INITIATION)) { + return { false, 0}; + } + + DW1000Ng::setDeviceAddress(DW1000NgUtils::bytesAsValue(&init_recv[16], 2)); + return { true, static_cast(DW1000NgUtils::bytesAsValue(&init_recv[13], 2)) }; + } + + static RangeResult tagFinishRange(uint16_t anchor, uint16_t replyDelayUs) { + RangeResult returnValue; + + byte target_anchor[2]; + DW1000NgUtils::writeValueToBytes(target_anchor, anchor, 2); + DW1000NgRTLS::transmitPoll(target_anchor); + /* Start of poll control for range */ + if(!DW1000NgRTLS::waitForNextRangingStep()) { + returnValue = {false, false, 0, 0}; + } else { + + size_t cont_len = DW1000Ng::getReceivedDataLength(); + byte cont_recv[cont_len]; + DW1000Ng::getReceivedData(cont_recv, cont_len); + + if (cont_len > 10 && cont_recv[9] == ACTIVITY_CONTROL && cont_recv[10] == RANGING_CONTINUE) { + /* Received Response to poll */ + DW1000NgRTLS::transmitFinalMessage( + &cont_recv[7], + replyDelayUs, + DW1000Ng::getTransmitTimestamp(), // Poll transmit time + DW1000Ng::getReceiveTimestamp() // Response to poll receive time + ); + + if(!DW1000NgRTLS::waitForNextRangingStep()) { + returnValue = {false, false, 0, 0}; + } else { + + size_t act_len = DW1000Ng::getReceivedDataLength(); + byte act_recv[act_len]; + DW1000Ng::getReceivedData(act_recv, act_len); + + if(act_len > 10 && act_recv[9] == ACTIVITY_CONTROL) { + if (act_len > 12 && act_recv[10] == RANGING_CONFIRM) { + returnValue = {true, true, static_cast(DW1000NgUtils::bytesAsValue(&act_recv[11], 2)), 0}; + } else if(act_len > 12 && act_recv[10] == ACTIVITY_FINISHED) { + returnValue = {true, false, 0, calculateNewBlinkRate(act_recv)}; + } + } else { + returnValue = {false, false, 0, 0}; + } + } + } else { + returnValue = {false, false, 0, 0}; + } + + } + + return returnValue; + } + + RangeInfrastructureResult tagRangeInfrastructure(uint16_t target_anchor, uint16_t finalMessageDelay) { + RangeInfrastructureResult returnValue; + + RangeResult result = tagFinishRange(target_anchor, finalMessageDelay); + byte keep_going = 1; + + if(!result.success) { + keep_going = 0; + returnValue = {false , 0}; + } else { + while(result.success && result.next) { + result = tagFinishRange(result.next_anchor, finalMessageDelay); + if(!result.success) { + keep_going = 0; + returnValue = {false , 0}; + break; + } + + #if defined(ESP8266) + if (keep_going == 1) { + yield(); + } + #endif + } + + if (keep_going == 1) { + + if(result.success && result.new_blink_rate != 0) { + keep_going = 0; + returnValue = { true, static_cast(result.new_blink_rate) }; + } else { + if(!result.success) { + keep_going = 0; + returnValue = { false , 0 }; + } else { + // TODO. Handle this condition? + } + } + } + } + return returnValue; + } + + RangeInfrastructureResult tagTwrLocalize(uint16_t finalMessageDelay) { + RangeRequestResult request_result = DW1000NgRTLS::tagRangeRequest(); + + if(request_result.success) { + + RangeInfrastructureResult result = DW1000NgRTLS::tagRangeInfrastructure(request_result.target_anchor, finalMessageDelay); + + if(result.success) + return result; + } + return {false, 0}; + } + + RangeAcceptResult anchorRangeAccept(NextActivity next, uint16_t value) { + RangeAcceptResult returnValue; + + double range; + if(!DW1000NgRTLS::receiveFrame()) { + returnValue = {false, 0}; + } else { + + size_t poll_len = DW1000Ng::getReceivedDataLength(); + byte poll_data[poll_len]; + DW1000Ng::getReceivedData(poll_data, poll_len); + + if(poll_len > 9 && poll_data[9] == RANGING_TAG_POLL) { + uint64_t timePollReceived = DW1000Ng::getReceiveTimestamp(); + DW1000NgRTLS::transmitResponseToPoll(&poll_data[7]); + DW1000NgRTLS::waitForTransmission(); + uint64_t timeResponseToPoll = DW1000Ng::getTransmitTimestamp(); + delayMicroseconds(1500); + + if(!DW1000NgRTLS::receiveFrame()) { + returnValue = {false, 0}; + } else { + + size_t rfinal_len = DW1000Ng::getReceivedDataLength(); + byte rfinal_data[rfinal_len]; + DW1000Ng::getReceivedData(rfinal_data, rfinal_len); + if(rfinal_len > 18 && rfinal_data[9] == RANGING_TAG_FINAL_RESPONSE_EMBEDDED) { + uint64_t timeFinalMessageReceive = DW1000Ng::getReceiveTimestamp(); + + byte finishValue[2]; + DW1000NgUtils::writeValueToBytes(finishValue, value, 2); + + if(next == NextActivity::RANGING_CONFIRM) { + DW1000NgRTLS::transmitRangingConfirm(&rfinal_data[7], finishValue); + } else { + DW1000NgRTLS::transmitActivityFinished(&rfinal_data[7], finishValue); + } + + DW1000NgRTLS::waitForTransmission(); + + range = DW1000NgRanging::computeRangeAsymmetric( + DW1000NgUtils::bytesAsValue(rfinal_data + 10, LENGTH_TIMESTAMP), // Poll send time + timePollReceived, + timeResponseToPoll, // Response to poll sent time + DW1000NgUtils::bytesAsValue(rfinal_data + 14, LENGTH_TIMESTAMP), // Response to Poll Received + DW1000NgUtils::bytesAsValue(rfinal_data + 18, LENGTH_TIMESTAMP), // Final Message send time + timeFinalMessageReceive // Final message receive time + ); + + range = DW1000NgRanging::correctRange(range); + + /* In case of wrong read due to bad device calibration */ + if(range <= 0) + range = 0.000001; + + returnValue = {true, range}; + } + } + } + } + + return returnValue; + } + +} \ No newline at end of file diff --git a/src/dwm1000/DW1000NgRTLS.hpp b/src/dwm1000/DW1000NgRTLS.hpp new file mode 100644 index 0000000..30abe99 --- /dev/null +++ b/src/dwm1000/DW1000NgRTLS.hpp @@ -0,0 +1,133 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +#pragma once + +#include + +/* Frame control */ +constexpr byte BLINK = 0xC5; +constexpr byte DATA = 0x41; +constexpr byte SHORT_SRC_AND_DEST = 0x88; +constexpr byte LONG_SRC_AND_DEST = 0xCC; +constexpr byte SHORT_SRC_LONG_DEST = 0x8C; +constexpr byte LONG_SRC_SHORT_DEST = 0xC8; + +/* Application ID */ +constexpr byte RTLS_APP_ID_LOW = 0x9A; +constexpr byte RTLS_APP_ID_HIGH = 0x60; +constexpr uint16_t RTLS_APP_ID = RTLS_APP_ID_LOW | ((uint16_t) (RTLS_APP_ID_HIGH << 8)); + +/* Function code */ +constexpr byte ACTIVITY_CONTROL = 0x10; +constexpr byte RANGING_INITIATION = 0x20; +constexpr byte RANGING_TAG_POLL = 0x21; +constexpr byte RANGING_TAG_FINAL_RESPONSE_EMBEDDED = 0x23; +constexpr byte RANGING_TAG_FINAL_RESPONSE_NO_EMBEDDED = 0x25; +constexpr byte RANGING_TAG_FINAL_SEND_TIME = 0x27; + +/* Activity code */ +constexpr byte ACTIVITY_FINISHED = 0x00; +constexpr byte RANGING_CONFIRM = 0x01; +constexpr byte RANGING_CONTINUE = 0x02; + +/* BLINK Encoding Header */ +constexpr byte BATTERY_GOOD = 0x00; +constexpr byte BATTERY_10_30_PERCENT = 0x02; +constexpr byte BATTERY_0_10_PERCENT = 0x01; +constexpr byte NO_BATTERY_STATUS = 0x03; + +constexpr byte TEMPERATURE_DATA = 0x20; + +constexpr byte EX_ID = 0x80; +constexpr byte NO_EX_ID = 0x40; + +/* BLINK Ext Header */ +constexpr byte BLINK_RATE_AND_LISTENING = 0x01; +constexpr byte TAG_LISTENING_NOW = 0x02; + +enum class NextActivity { + ACTIVITY_FINISHED, + RANGING_CONFIRM +}; + +typedef struct RangeRequestResult { + boolean success; + uint16_t target_anchor; +} RangeRequestResult; + +typedef struct RangeResult { + boolean success; + boolean next; + uint16_t next_anchor; + uint32_t new_blink_rate; +} RangeResult; + +typedef struct RangeInfrastructureResult { + boolean success; + uint16_t new_blink_rate; +} RangeInfrastructureResult; + +typedef struct RangeAcceptResult { + boolean success; + double range; +} RangeAcceptResult; + +namespace DW1000NgRTLS { + /*** TWR functions used in ISO/IEC 24730-62:2013, refer to the standard or the decawave manual for details about TWR ***/ + byte increaseSequenceNumber(); + void transmitTwrShortBlink(); + void transmitRangingInitiation(byte tag_eui[], byte tag_short_address[]); + void transmitPoll(byte anchor_address[]); + void transmitResponseToPoll(byte tag_short_address[]); + void transmitFinalMessage(byte anchor_address[], uint16_t reply_delay, uint64_t timePollSent, uint64_t timeResponseToPollReceived); + void transmitRangingConfirm(byte tag_short_address[], byte next_anchor[]); + void transmitActivityFinished(byte tag_short_address[], byte blink_rate[]); + + boolean receiveFrame(); + void waitForTransmission(); + /*** End of TWR functions ***/ + + /* Send a request range from tag to the rtls infrastructure */ + RangeRequestResult tagRangeRequest(); + + /* Used by an anchor to accept an incoming tagRangeRequest by means of the infrastructure + NextActivity is used to indicate the tag what to do next after the ranging process (Activity finished is to return to blink (range request), + Continue range is to tell the tag to range a new anchor) + value is the value relative to the next activity (Activity finished = new blink rante, continue range = new anchor address) + */ + RangeAcceptResult anchorRangeAccept(NextActivity next, uint16_t value); + + /* Used by tag to range after range request accept of the infrastructure + Target anchor is given after a range request success + Finalmessagedelay is used in the process of TWR, a value of 1500 works on 8mhz-80mhz range devices, + you could try to decrease it to improve system performance. + */ + RangeInfrastructureResult tagRangeInfrastructure(uint16_t target_anchor, uint16_t finalMessageDelay); + + /* Can be used as a single function start the localization process from the tag. + Finalmessagedelay is the same as in function tagRangeInfrastructure + */ + RangeInfrastructureResult tagTwrLocalize(uint16_t finalMessageDelay); +} \ No newline at end of file diff --git a/src/dwm1000/DW1000NgRanging.cpp b/src/dwm1000/DW1000NgRanging.cpp new file mode 100644 index 0000000..d2eed64 --- /dev/null +++ b/src/dwm1000/DW1000NgRanging.cpp @@ -0,0 +1,88 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +#include +#include "DW1000Ng.hpp" +#include "DW1000NgConstants.hpp" +#include "DW1000NgRanging.hpp" +#include "DW1000NgConstants.hpp" +#include "DW1000NgRTLS.hpp" + +namespace DW1000NgRanging { + + /* asymmetric two-way ranging (more computation intense, less error prone) */ + double computeRangeAsymmetric( + uint64_t timePollSent, + uint64_t timePollReceived, + uint64_t timePollAckSent, + uint64_t timePollAckReceived, + uint64_t timeRangeSent, + uint64_t timeRangeReceived + ) + { + uint32_t timePollSent_32 = static_cast(timePollSent); + uint32_t timePollReceived_32 = static_cast(timePollReceived); + uint32_t timePollAckSent_32 = static_cast(timePollAckSent); + uint32_t timePollAckReceived_32 = static_cast(timePollAckReceived); + uint32_t timeRangeSent_32 = static_cast(timeRangeSent); + uint32_t timeRangeReceived_32 = static_cast(timeRangeReceived); + + double round1 = static_cast(timePollAckReceived_32 - timePollSent_32); + double reply1 = static_cast(timePollAckSent_32 - timePollReceived_32); + double round2 = static_cast(timeRangeReceived_32 - timePollAckSent_32); + double reply2 = static_cast(timeRangeSent_32 - timePollAckReceived_32); + + int64_t tof_uwb = static_cast((round1 * round2 - reply1 * reply2) / (round1 + round2 + reply1 + reply2)); + double distance = tof_uwb * DISTANCE_OF_RADIO; + + return distance; + } + + double correctRange(double range) { + double result = 0; + + Channel currentChannel = DW1000Ng::getChannel(); + double rxPower = -(static_cast(DW1000Ng::getReceivePower())); + + size_t index = DW1000Ng::getPulseFrequency() == PulseFrequency::FREQ_16MHZ ? 1 : 2; + if(currentChannel == Channel::CHANNEL_4 || currentChannel == Channel::CHANNEL_7) + index+=2; + + if (rxPower < BIAS_TABLE[0][0]) { + result = range += BIAS_TABLE[0][index]*0.001; + } else if (rxPower >= BIAS_TABLE[17][0]) { + result = range += BIAS_TABLE[17][index]*0.001; + } else { + for(auto i=0; i < 17; i++) { + if (rxPower >= BIAS_TABLE[i][0] && rxPower < BIAS_TABLE[i+1][0]){ + result = range += BIAS_TABLE[i][index]*0.001; + break; + } + } + } + + return result; + } + +} diff --git a/src/dwm1000/DW1000NgRanging.hpp b/src/dwm1000/DW1000NgRanging.hpp new file mode 100644 index 0000000..c6a3c18 --- /dev/null +++ b/src/dwm1000/DW1000NgRanging.hpp @@ -0,0 +1,59 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +#pragma once + +#include + +namespace DW1000NgRanging { + + /** + Asymmetric two-way ranging algorithm (more computation intense, less error prone) + + @param [in] timePollSent timestamp of poll transmission + @param [in] timePollReceived timestamp of poll receive + @param [in] timePollAckSent timestamp of response to poll transmission + @param [in] timePollAckReceived timestamp of response to poll receive + @param [in] timeRangeSent timestamp of final message transmission + @param [in] timeRangeReceived timestamp of final message receive + + returns the range in meters + */ + double computeRangeAsymmetric( + uint64_t timePollSent, + uint64_t timePollReceived, + uint64_t timePollAckSent, + uint64_t timePollAckReceived, + uint64_t timeRangeSent, + uint64_t timeRangeReceived + ); + //TODO Symmetric + + /** + Removes bias from the target range + + returns the unbiased range + */ + double correctRange(double range); +} \ No newline at end of file diff --git a/src/dwm1000/DW1000NgRegisters.hpp b/src/dwm1000/DW1000NgRegisters.hpp new file mode 100644 index 0000000..87b7f40 --- /dev/null +++ b/src/dwm1000/DW1000NgRegisters.hpp @@ -0,0 +1,361 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +#pragma once + +#include + +// no sub-address for register write +constexpr uint16_t NO_SUB = 0xFF; + +// device id register +constexpr uint16_t DEV_ID = 0x00; +constexpr uint16_t LEN_DEV_ID = 4; + +// extended unique identifier register +constexpr uint16_t EUI = 0x01; +constexpr uint16_t LEN_EUI = 8; + +// PAN identifier, short address register +constexpr uint16_t PANADR = 0x03; +constexpr uint16_t LEN_PANADR = 4; + +// device configuration register +constexpr uint16_t SYS_CFG = 0x04; +constexpr uint16_t FFEN_BIT = 0; +constexpr uint16_t FFBC_BIT = 1; +constexpr uint16_t FFAB_BIT = 2; +constexpr uint16_t FFAD_BIT = 3; +constexpr uint16_t FFAA_BIT = 4; +constexpr uint16_t FFAM_BIT = 5; +constexpr uint16_t FFAR_BIT = 6; +constexpr uint16_t FFA4_BIT = 7; +constexpr uint16_t FFA5_BIT = 8; +constexpr uint16_t HIRQ_POL_BIT = 9; +constexpr uint16_t SPI_EDGE_BIT = 10; +constexpr uint16_t DIS_FCE_BIT = 11; +constexpr uint16_t DIS_DRXB_BIT = 12; +constexpr uint16_t DIS_PHE_BIT = 13; +constexpr uint16_t DIS_RSDE_BIT = 14; +constexpr uint16_t FCS_INIT2F_BIT = 15; +constexpr uint16_t PHR_MODE_0_BIT = 16; +constexpr uint16_t PHR_MODE_1_BIT = 17; +constexpr uint16_t DIS_STXP_BIT = 18; +constexpr uint16_t RXM110K_BIT = 22; +constexpr uint16_t RXWTOE_BIT = 28; +constexpr uint16_t RXAUTR_BIT = 29; +constexpr uint16_t AUTOACK_BIT = 30; +constexpr uint16_t AACKPEND_BIT = 31; +constexpr uint16_t LEN_SYS_CFG = 4; + +// device control register +constexpr uint16_t SYS_CTRL = 0x0D; +constexpr uint16_t LEN_SYS_CTRL = 4; +constexpr uint16_t SFCST_BIT = 0; +constexpr uint16_t TXSTRT_BIT = 1; +constexpr uint16_t TXDLYS_BIT = 2; +constexpr uint16_t TRXOFF_BIT = 6; +constexpr uint16_t WAIT4RESP_BIT = 7; +constexpr uint16_t RXENAB_BIT = 8; +constexpr uint16_t RXDLYS_BIT = 9; + +// system event status register +constexpr uint16_t SYS_STATUS = 0x0F; +constexpr uint16_t SYS_STATUS_SUB = 0x04; +constexpr uint16_t IRQS_BIT = 0; +constexpr uint16_t CPLOCK_BIT = 1; +constexpr uint16_t ESYNCR_BIT = 2; +constexpr uint16_t AAT_BIT = 3; +constexpr uint16_t TXFRB_BIT = 4; +constexpr uint16_t TXPRS_BIT = 5; +constexpr uint16_t TXPHS_BIT = 6; +constexpr uint16_t TXFRS_BIT = 7; +constexpr uint16_t RXPRD_BIT = 8; +constexpr uint16_t RXSFDD_BIT = 9; +constexpr uint16_t LDEDONE_BIT = 10; +constexpr uint16_t RXPHD_BIT = 11; +constexpr uint16_t RXPHE_BIT = 12; +constexpr uint16_t RXDFR_BIT = 13; +constexpr uint16_t RXFCG_BIT = 14; +constexpr uint16_t RXFCE_BIT = 15; +constexpr uint16_t RXRFSL_BIT = 16; +constexpr uint16_t RXRFTO_BIT = 17; +constexpr uint16_t LDEERR_BIT = 18; +constexpr uint16_t RXOVRR_BIT = 20; +constexpr uint16_t RXPTO_BIT = 21; +constexpr uint16_t GPIOIRQ_BIT = 22; +constexpr uint16_t SLP2INIT_BIT = 23; +constexpr uint16_t RFPLL_LL_BIT = 24; +constexpr uint16_t CLKPLL_LL_BIT = 25; +constexpr uint16_t RXSFDTO_BIT = 26; +constexpr uint16_t HPDWARN_BIT = 27; +constexpr uint16_t TXBERR_BIT = 28; +constexpr uint16_t AFFREJ_BIT = 29; +constexpr uint16_t HSRBP_BIT = 30; +constexpr uint16_t ICRBP_BIT = 31; +constexpr uint16_t RXRSCS_BIT = 0; +constexpr uint16_t RXPREJ_BIT = 1; +constexpr uint16_t TXPUTE_BIT = 2; +constexpr uint16_t LEN_SYS_STATUS = 4; +constexpr uint16_t LEN_SYS_STATUS_SUB = 1; + +// system event mask register +// NOTE: uses the bit definitions of SYS_STATUS (below 32) +constexpr uint16_t SYS_MASK = 0x0E; +constexpr uint16_t LEN_SYS_MASK = 4; + +// system time counter +constexpr uint16_t SYS_TIME = 0x06; +constexpr uint16_t LEN_SYS_TIME = 5; + +// RX timestamp register +constexpr uint16_t RX_TIME = 0x15; +constexpr uint16_t LEN_RX_TIME = 14; +constexpr uint16_t RX_STAMP_SUB = 0x00; +constexpr uint16_t FP_AMPL1_SUB = 0x07; +constexpr uint16_t LEN_RX_STAMP = 5; +constexpr uint16_t LEN_FP_AMPL1 = 2; + +// RX frame quality +constexpr uint16_t RX_FQUAL = 0x12; +constexpr uint16_t LEN_RX_FQUAL = 8; +constexpr uint16_t STD_NOISE_SUB = 0x00; +constexpr uint16_t FP_AMPL2_SUB = 0x02; +constexpr uint16_t FP_AMPL3_SUB = 0x04; +constexpr uint16_t CIR_PWR_SUB = 0x06; +constexpr uint16_t LEN_STD_NOISE = 2; +constexpr uint16_t LEN_FP_AMPL2 = 2; +constexpr uint16_t LEN_FP_AMPL3 = 2; +constexpr uint16_t LEN_CIR_PWR = 2; + +// TX timestamp register +constexpr uint16_t TX_TIME = 0x17; +constexpr uint16_t LEN_TX_TIME = 10; +constexpr uint16_t TX_STAMP_SUB = 0; +constexpr uint16_t LEN_TX_STAMP = 5; + +// timing register (for delayed RX/TX) +constexpr uint16_t DX_TIME = 0x0A; +constexpr uint16_t LEN_DX_TIME = 5; + +// Receive Frame Wait Timeout Period +constexpr uint16_t RX_WFTO = 0x0C; +constexpr uint16_t LEN_RX_WFTO = 2; + +// transmit data buffer +constexpr uint16_t TX_BUFFER = 0x09; +constexpr uint16_t LEN_TX_BUFFER = 1024; +constexpr uint16_t LEN_UWB_FRAMES = 127; +constexpr uint16_t LEN_EXT_UWB_FRAMES = 1023; + +// RX frame info +constexpr uint16_t RX_FINFO = 0x10; +constexpr uint16_t LEN_RX_FINFO = 4; + +// receive data buffer +constexpr uint16_t RX_BUFFER = 0x11; +constexpr uint16_t LEN_RX_BUFFER = 1024; + +// transmit control +constexpr uint16_t TX_FCTRL = 0x08; +constexpr uint16_t LEN_TX_FCTRL = 5; + +// channel control +constexpr uint16_t CHAN_CTRL = 0x1F; +constexpr uint16_t LEN_CHAN_CTRL = 4; +constexpr uint16_t DWSFD_BIT = 17; +constexpr uint16_t TNSSFD_BIT = 20; +constexpr uint16_t RNSSFD_BIT = 21; + +// user-defined SFD +constexpr uint16_t USR_SFD = 0x21; +constexpr uint16_t LEN_USR_SFD = 41; +constexpr uint16_t SFD_LENGTH_SUB = 0x00; +constexpr uint16_t LEN_SFD_LENGTH = 1; + +// OTP control (for LDE micro code loading only) +constexpr uint16_t OTP_IF = 0x2D; +constexpr uint16_t OTP_ADDR_SUB = 0x04; +constexpr uint16_t OTP_CTRL_SUB = 0x06; +constexpr uint16_t OTP_RDAT_SUB = 0x0A; +constexpr uint16_t LEN_OTP_ADDR = 2; +constexpr uint16_t LEN_OTP_CTRL = 2; +constexpr uint16_t LEN_OTP_RDAT = 4; + +// AGC_TUNE1/2/3 (for re-tuning only) +constexpr uint16_t AGC_TUNE = 0x23; +constexpr uint16_t AGC_TUNE1_SUB = 0x04; +constexpr uint16_t AGC_TUNE2_SUB = 0x0C; +constexpr uint16_t AGC_TUNE3_SUB = 0x12; +constexpr uint16_t LEN_AGC_TUNE1 = 2; +constexpr uint16_t LEN_AGC_TUNE2 = 4; +constexpr uint16_t LEN_AGC_TUNE3 = 2; + +// EXT_SYNC (External Synchronization Control) +constexpr uint16_t EXT_SYNC = 0x24; +constexpr uint16_t EC_CTRL_SUB = 0x00; +constexpr uint16_t PLLLDT_BIT = 2; +constexpr uint16_t EC_RXTC_SUB = 0x04; +constexpr uint16_t EC_GOLP_SUB = 0x08; +constexpr uint16_t LEN_EC_CTRL = 4; +constexpr uint16_t LEN_EC_RXTC = 4; +constexpr uint16_t LEN_EC_GOLP = 4; + +// DRX_TUNE2 (for re-tuning only) +constexpr uint16_t DRX_TUNE = 0x27; +constexpr uint16_t DRX_TUNE0b_SUB = 0x02; +constexpr uint16_t DRX_TUNE1a_SUB = 0x04; +constexpr uint16_t DRX_TUNE1b_SUB = 0x06; +constexpr uint16_t DRX_TUNE2_SUB = 0x08; +constexpr uint16_t DRX_SFDTOC_SUB = 0x20; +constexpr uint16_t DRX_PRETOC_SUB = 0x24; +constexpr uint16_t DRX_TUNE4H_SUB = 0x26; +constexpr uint16_t DRX_CAR_INT_SUB = 0x28; +constexpr uint16_t RXPACC_NOSAT_SUB = 0x2C; +constexpr uint16_t LEN_DRX_TUNE0b = 2; +constexpr uint16_t LEN_DRX_TUNE1a = 2; +constexpr uint16_t LEN_DRX_TUNE1b = 2; +constexpr uint16_t LEN_DRX_TUNE2 = 4; +constexpr uint16_t LEN_DRX_SFDTOC = 2; +constexpr uint16_t LEN_DRX_PRETOC = 2; +constexpr uint16_t LEN_DRX_TUNE4H = 2; +constexpr uint16_t LEN_DRX_CAR_INT = 3; +constexpr uint16_t LEN_RXPACC_NOSAT = 2; + +// LDE_CFG1 (for re-tuning only) +constexpr uint16_t LDE_IF = 0x2E; +constexpr uint16_t LDE_CFG1_SUB = 0x0806; +constexpr uint16_t LDE_RXANTD_SUB = 0x1804; +constexpr uint16_t LDE_CFG2_SUB = 0x1806; +constexpr uint16_t LDE_REPC_SUB = 0x2804; +constexpr uint16_t LEN_LDE_CFG1 = 1; +constexpr uint16_t LEN_LDE_CFG2 = 2; +constexpr uint16_t LEN_LDE_REPC = 2; +constexpr uint16_t LEN_LDE_RXANTD = 2; + +// DIG_DIAG (Digital Diagnostics Interface) +constexpr uint16_t DIG_DIAG = 0x2F; +constexpr uint16_t EVC_CTRL_SUB = 0x00; +constexpr uint16_t EVC_STO_SUB = 0x10; +constexpr uint16_t EVC_PTO_SUB = 0x12; +constexpr uint16_t EVC_FWTO_SUB = 0x14; +constexpr uint16_t DIAG_TMC_SUB = 0x24; +constexpr uint16_t LEN_EVC_CTRL = 4; +constexpr uint16_t LEN_EVC_STO = 2; +constexpr uint16_t LEN_EVC_PTO = 2; +constexpr uint16_t LEN_EVC_FWTO = 2; +constexpr uint16_t LEN_DIAG_TMC = 2; + +// TX_POWER (for re-tuning only) +constexpr uint16_t TX_POWER = 0x1E; +constexpr uint16_t LEN_TX_POWER = 4; + +// RF_CONF (for re-tuning only) +constexpr uint16_t RF_CONF = 0x28; +constexpr uint16_t RF_CONF_SUB = 0x00; +constexpr uint16_t RF_RXCTRLH_SUB = 0x0B; +constexpr uint16_t RF_TXCTRL_SUB = 0x0C; +constexpr uint16_t LEN_RX_CONF_SUB = 4; +constexpr uint16_t LEN_RF_RXCTRLH = 1; +constexpr uint16_t LEN_RF_TXCTRL = 4; + +// TX_CAL (for re-tuning only) +constexpr uint16_t TX_CAL = 0x2A; +constexpr uint16_t TC_PGDELAY_SUB = 0x0B; +constexpr uint16_t LEN_TC_PGDELAY = 1; +constexpr uint16_t TC_SARC = 0x00; +constexpr uint16_t TC_SARL = 0x03; + +// FS_CTRL (for re-tuning only) +constexpr uint16_t FS_CTRL = 0x2B; +constexpr uint16_t FS_PLLCFG_SUB = 0x07; +constexpr uint16_t FS_PLLTUNE_SUB = 0x0B; +constexpr uint16_t FS_XTALT_SUB = 0x0E; +constexpr uint16_t LEN_FS_PLLCFG = 4; +constexpr uint16_t LEN_FS_PLLTUNE = 1; +constexpr uint16_t LEN_FS_XTALT = 1; + +// AON +constexpr uint16_t AON = 0x2C; +constexpr uint16_t AON_WCFG_SUB = 0x00; +constexpr uint16_t ONW_RADC_BIT = 0; +constexpr uint16_t ONW_RX_BIT = 1; +constexpr uint16_t ONW_LEUI_BIT = 3; +constexpr uint16_t ONW_LDC_BIT = 6; +constexpr uint16_t ONW_L64P_BIT = 7; +constexpr uint16_t ONW_PRES_SLEEP_BIT = 8; +constexpr uint16_t ONW_LLDE_BIT = 11; +constexpr uint16_t ONW_LLDO_BIT = 12; +constexpr uint16_t LEN_AON_WCFG = 2; + +constexpr uint16_t AON_CTRL_SUB = 0x02; +constexpr uint16_t RESTORE_BIT = 0; +constexpr uint16_t SAVE_BIT = 1; +constexpr uint16_t UPL_CFG_BIT = 2; +constexpr uint16_t LEN_AON_CTRL = 1; + +constexpr uint16_t AON_CFG0_SUB = 0x06; +constexpr uint16_t SLEEP_EN_BIT = 0; +constexpr uint16_t WAKE_PIN_BIT = 1; +constexpr uint16_t WAKE_SPI_BIT = 2; +constexpr uint16_t WAKE_CNT_BIT = 3; +constexpr uint16_t LPDIV_EN_BIT = 4; +constexpr uint16_t LEN_AON_CFG0 = 4; + +constexpr uint16_t AON_CFG1_SUB = 0x0A; +constexpr uint16_t SLEEP_CEN_BIT = 0; +constexpr uint16_t SMXX_BIT = 1; +constexpr uint16_t LPOSC_CAL_BIT = 2; +constexpr uint16_t LEN_AON_CFG1 = 2; + +// PMSC +constexpr uint16_t PMSC = 0x36; +constexpr uint16_t PMSC_CTRL0_SUB = 0x00; +constexpr uint16_t GPDCE_BIT = 18; +constexpr uint16_t KHZCLKEN_BIT = 23; +constexpr uint16_t PMSC_SOFTRESET_SUB = 0x03; +constexpr uint16_t PMSC_CTRL1_SUB = 0x04; +constexpr uint16_t ATXSLP_BIT = 11; +constexpr uint16_t ARXSLP_BIT = 12; +constexpr uint16_t PMSC_LEDC_SUB = 0x28; +constexpr uint16_t BLNKEN = 8; +constexpr uint16_t LEN_PMSC_CTRL0 = 4; +constexpr uint16_t LEN_PMSC_SOFTRESET = 1; +constexpr uint16_t LEN_PMSC_CTRL1 = 4; +constexpr uint16_t LEN_PMSC_LEDC = 4; + +// TX_ANTD Antenna delays +constexpr uint16_t TX_ANTD = 0x18; +constexpr uint16_t LEN_TX_ANTD = 2; + +// Acknowledgement time and response time +constexpr uint16_t ACK_RESP_T = 0x1A; +constexpr uint16_t ACK_RESP_T_W4R_TIME_SUB = 0x00; +constexpr uint16_t LEN_ACK_RESP_T_W4R_TIME_SUB = 3; +constexpr uint16_t LEN_ACK_RESP_T = 4; + +// GPIO +constexpr uint16_t GPIO_CTRL = 0x26; +constexpr uint16_t GPIO_MODE_SUB = 0x00; +constexpr uint16_t LEN_GPIO_MODE = 4; \ No newline at end of file diff --git a/src/dwm1000/DW1000NgTime.cpp b/src/dwm1000/DW1000NgTime.cpp new file mode 100644 index 0000000..78940ef --- /dev/null +++ b/src/dwm1000/DW1000NgTime.cpp @@ -0,0 +1,33 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +#include +#include "DW1000NgTime.hpp" +#include "DW1000NgConstants.hpp" + +namespace DW1000NgTime { + uint64_t microsecondsToUWBTime(uint64_t microSeconds) { + return static_cast(microSeconds * TIME_RES_INV); + } +} \ No newline at end of file diff --git a/src/dwm1000/DW1000NgTime.hpp b/src/dwm1000/DW1000NgTime.hpp new file mode 100644 index 0000000..088994e --- /dev/null +++ b/src/dwm1000/DW1000NgTime.hpp @@ -0,0 +1,31 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +#pragma once + +#include + +namespace DW1000NgTime { + uint64_t microsecondsToUWBTime(uint64_t microSeconds); +} \ No newline at end of file diff --git a/src/dwm1000/DW1000NgUtils.cpp b/src/dwm1000/DW1000NgUtils.cpp new file mode 100644 index 0000000..ac7b6dd --- /dev/null +++ b/src/dwm1000/DW1000NgUtils.cpp @@ -0,0 +1,141 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +/* + * Copyright (c) 2015 by Thomas Trojer + * Decawave DW1000 library for arduino. + * + * 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. + * + * @file DW1000.cpp + * Helper functions. + */ + +#include +#include "DW1000NgUtils.hpp" +#include "DW1000NgConstants.hpp" +#include "DW1000NgRegisters.hpp" + +namespace DW1000NgUtils { + + /* + * Set the value of a bit in an array of bytes that are considered + * consecutive and stored from MSB to LSB. + * @param data + * The number as byte array. + * @param n + * The number of bytes in the array. + * @param bit + * The position of the bit to be set. + * @param val + * The boolean value to be set to the given bit position. + */ + void setBit(byte data[], uint16_t n, uint16_t bit, boolean val) { + uint16_t idx; + uint8_t shift; + + idx = bit/8; + if(idx >= n) { + return; // TODO proper error handling: out of bounds + } + byte* targetByte = &data[idx]; + shift = bit%8; + if(val) { + bitSet(*targetByte, shift); + } else { + bitClear(*targetByte, shift); + } + } + + /* + * Check the value of a bit in an array of bytes that are considered + * consecutive and stored from MSB to LSB. + * @param data + * The number as byte array. + * @param n + * The number of bytes in the array. + * @param bit + * The position of the bit to be checked. + */ + boolean getBit(byte data[], uint16_t n, uint16_t bit) { + uint16_t idx; + uint8_t shift; + + idx = bit/8; + if(idx >= n) { + return false; // TODO proper error handling: out of bounds + } + byte targetByte = data[idx]; + shift = bit%8; + + return bitRead(targetByte, shift); // TODO wrong type returned byte instead of boolean + } + + void writeValueToBytes(byte data[], uint64_t val, uint8_t n) { + for(auto i = 0; i < n; i++) { + data[i] = ((val >> (i*8)) & 0xFF); + } + } + + uint64_t bytesAsValue(byte data[], uint8_t n) { + uint64_t value = 0; + for(auto i = 0; i < n; i++) { + value |= ((uint64_t)data[i] << (i*8)); + } + return value; + } + + uint8_t nibbleFromChar(char c) { + if(c >= '0' && c <= '9') { + return c-'0'; + } + if(c >= 'a' && c <= 'f') { + return c-'a'+10; + } + if(c >= 'A' && c <= 'F') { + return c-'A'+10; + } + return 255; + } + + void convertToByte(char string[], byte* bytes) { + byte eui_byte[LEN_EUI]; + // we fill it with the char array under the form of "AA:FF:1C:...." + for(uint16_t i = 0; i < LEN_EUI; i++) { + eui_byte[i] = (nibbleFromChar(string[i*3]) << 4)+nibbleFromChar(string[i*3+1]); + } + memcpy(bytes, eui_byte, LEN_EUI); + } + +} diff --git a/src/dwm1000/DW1000NgUtils.hpp b/src/dwm1000/DW1000NgUtils.hpp new file mode 100644 index 0000000..10aad0f --- /dev/null +++ b/src/dwm1000/DW1000NgUtils.hpp @@ -0,0 +1,110 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +/* + * Copyright (c) 2015 by Thomas Trojer + * Decawave DW1000 library for arduino. + * + * 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. + * + * @file DW1000.h + * Helper functions. + */ + +#pragma once + +#include +#include "DW1000NgConstants.hpp" + +namespace DW1000NgUtils { + + /** + Returns target bit value inside a byte array + + @param [in] data the byte array + @param [in] n the length of the byte array + @param [in] bit the bit position + + returns bit value (true = 1, false = 0) + */ + boolean getBit(byte data[], uint16_t n, uint16_t bit); + + /** + Sets the target bit value inside an array of bytes + + @param [in] data the byte array + @param [in] n the length of the byte array + @param [in] bit the bit position + @param [in] val the bit value + + */ + void setBit(byte data[], uint16_t n, uint16_t bit, boolean val); + + /** + Writes the target value inside a given byte array. + + @param [in] data the byte array + @param [in] val the value to insert + @param [in] n the length of the byte array + */ + void writeValueToBytes(byte data[], uint64_t val, uint8_t n); + + /** + Gets the target byte array value + + @param [in] data the byte array + @param [in] n the length of the byte array + + returns the byte array value + */ + uint64_t bytesAsValue(byte data[], uint8_t n); + + /** + Converts from char to 4 bits (hexadecimal) + + @param [in] c the character + + returns target value + */ + + uint8_t nibbleFromChar(char c); + + /** + Converts the target string to eui bytes + + @param [in] string The eui string (in format XX:XX:XX:XX:XX:XX:XX:XX) + @param [out] eui_byte The eui bytes + */ + void convertToByte(char string[], byte* eui_byte); +} diff --git a/src/dwm1000/SPIporting.cpp b/src/dwm1000/SPIporting.cpp new file mode 100644 index 0000000..1bab1d3 --- /dev/null +++ b/src/dwm1000/SPIporting.cpp @@ -0,0 +1,148 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * @file SPIporting.hpp + * Arduino porting for the SPI interface. +*/ + +#include +#include +#include "SPIporting.hpp" +#include "DW1000NgConstants.hpp" +#include "DW1000NgRegisters.hpp" + +uint32_t m_spiClock = 0; +spi_host_device_t m_spiHost; +spi_device_handle_t m_spiHandle = 0; +Adafruit_MCP23017 *m_expander = NULL; + +namespace SPIporting { + + void SPIInitWithClock(uint32_t clock) + { + if(m_spiHandle) + { + spi_bus_remove_device(m_spiHandle); + m_spiHandle = 0; + } + spi_device_interface_config_t devcfg={ + .command_bits = 0, + .address_bits = 0, + .dummy_bits = 0, + .mode=0, + .clock_speed_hz=clock, + .spics_io_num=-1, + .flags = 0, + .queue_size=7, + .pre_cb=NULL, + .post_cb=NULL, + }; + m_spiClock = clock; + spi_bus_add_device(m_spiHost, &devcfg, &m_spiHandle); + } + + namespace { + + constexpr uint32_t EspSPImaximumSpeed = 20000000; //20MHz + constexpr uint32_t SPIminimumSpeed = 2000000; //2MHz + + const SPISettings _fastSPI = SPISettings(EspSPImaximumSpeed, MSBFIRST, SPI_MODE0); + const SPISettings _slowSPI = SPISettings(SPIminimumSpeed, MSBFIRST, SPI_MODE0); + const SPISettings* _currentSPI = &_fastSPI; + + void _openSPI(uint8_t slaveSelectPIN) { + if(_currentSPI->_clock!=m_spiClock) + { + SPIInitWithClock(_currentSPI->_clock); + } + m_expander->digitalWrite(slaveSelectPIN, LOW); + } + + void _closeSPI(uint8_t slaveSelectPIN) { + m_expander->digitalWrite(slaveSelectPIN, HIGH); + } + } + + + void SPIinit(spi_host_device_t spihost, Adafruit_MCP23017 *expander) { + m_spiHost = spihost; + m_expander = expander; + SPIInitWithClock(EspSPImaximumSpeed); + } + + void SPIend() { + spi_bus_remove_device(m_spiHandle); + m_spiHandle = 0; + } + + void SPIselect(uint8_t slaveSelectPIN, uint8_t irq) { + m_expander->pinMode(slaveSelectPIN, OUTPUT); + m_expander->digitalWrite(slaveSelectPIN, HIGH); + } + + uint8_t spi_transfer(uint8_t data) + { + esp_err_t ret; + spi_transaction_t t; + memset(&t, 0, sizeof(t)); + t.flags = SPI_TRANS_USE_RXDATA; + t.length=8; + t.tx_buffer=&data; + ret=spi_device_transmit(m_spiHandle, &t); + assert(ret==ESP_OK); + return t.rx_data[0]; + } + + + void writeToSPI(uint8_t slaveSelectPIN, uint8_t headerLen, byte header[], uint16_t dataLen, byte data[]) { + _openSPI(slaveSelectPIN); + for(auto i = 0; i < headerLen; i++) { + spi_transfer(header[i]); // send header + } + for(auto i = 0; i < dataLen; i++) { + spi_transfer(data[i]); // write values + } + delayMicroseconds(5); + _closeSPI(slaveSelectPIN); + } + + void readFromSPI(uint8_t slaveSelectPIN, uint8_t headerLen, byte header[], uint16_t dataLen, byte data[]){ + _openSPI(slaveSelectPIN); + for(auto i = 0; i < headerLen; i++) { + spi_transfer(header[i]); // send header + } + for(auto i = 0; i < dataLen; i++) { + data[i] = spi_transfer(0x00); // read values + } + delayMicroseconds(5); + _closeSPI(slaveSelectPIN); + } + + void setSPIspeed(SPIClock speed) { + if(speed == SPIClock::FAST) { + _currentSPI = &_fastSPI; + } else if(speed == SPIClock::SLOW) { + _currentSPI = &_slowSPI; + } + } +} \ No newline at end of file diff --git a/src/dwm1000/SPIporting.hpp b/src/dwm1000/SPIporting.hpp new file mode 100644 index 0000000..82c41b3 --- /dev/null +++ b/src/dwm1000/SPIporting.hpp @@ -0,0 +1,82 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * @file SPIporting.hpp + * Arduino porting for the SPI interface. +*/ + +#pragma once + +#include +#include "DW1000NgConstants.hpp" +#include "Adafruit_MCP23017.h" +#include "driver/spi_master.h" + +namespace SPIporting{ + + /** + Initializes the SPI bus. + */ + void SPIinit(spi_host_device_t spihost, Adafruit_MCP23017 *expander); + + /** + Tells the driver library that no communication to a DW1000 will be required anymore. + This basically just frees SPI and the previously used pins. + */ + void SPIend(); + + /** + (Re-)selects a specific DW1000 chip for communication. Used in case you switched SPI to another device. + */ + void SPIselect(uint8_t slaveSelectPIN, uint8_t irq = 0xff); + + /** + Arduino function to write to the SPI. + Takes two separate byte buffers for write header and write data + + @param [in] Header lenght + @param [in] Header array built before + @param [in] Data lenght + @param [in] Data array + */ + void writeToSPI(uint8_t slaveSelectPIN, uint8_t headerLen, byte header[], uint16_t dataLen, byte data[]); + + /** + Arduino function to read from the SPI. + Takes two separate byte buffers for write header and write data + + @param [in] Header lenght + @param [in] Header array built before + @param [in] Data lenght + @param [out] Data array + */ + void readFromSPI(uint8_t slaveSelectPIN, uint8_t headerLen, byte header[], uint16_t dataLen, byte data[]); + + /** + Sets speed of SPI clock, fast or slow(20MHz or 2MHz) + + @param [in] SPIClock FAST or SLOW + */ + void setSPIspeed(SPIClock speed); + +} \ No newline at end of file diff --git a/src/dwm1000/deprecated.hpp b/src/dwm1000/deprecated.hpp new file mode 100644 index 0000000..dda9c2b --- /dev/null +++ b/src/dwm1000/deprecated.hpp @@ -0,0 +1,35 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +#pragma once + +#ifdef __has_cpp_attribute +#if __has_cpp_attribute(deprecated) +#define DEPRECATED [[deprecated]] +#define DEPRECATED_MSG(msg) [[deprecated(msg)]] +#endif // __has_cpp_attribute(deprecated) +#else +#define DEPRECATED __attribute__((deprecated)) +#define DEPRECATED_MSG(msg) __attribute__((deprecated(msg))) +#endif // __has_cpp_attribute diff --git a/src/dwm1000/require_cpp11.hpp b/src/dwm1000/require_cpp11.hpp new file mode 100644 index 0000000..940861a --- /dev/null +++ b/src/dwm1000/require_cpp11.hpp @@ -0,0 +1,29 @@ +/* + * MIT License + * + * Copyright (c) 2018 Michele Biondi, Andrea Salvatori + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*/ + +#pragma once + +#if __cplusplus < 201103L +#error "You need Arduino IDE version >=1.6.6 to use this project as it needs C++11 support." +#endif diff --git a/src/freertosinc.h b/src/freertosinc.h new file mode 100644 index 0000000..818eae6 --- /dev/null +++ b/src/freertosinc.h @@ -0,0 +1,30 @@ +#pragma once + +// The FreeRTOS includes are in a different directory on ESP32 and I can't figure out how to make that work with platformio gcc +// options so this is my quick hack to make things work + +#ifdef ARDUINO_ARCH_ESP32 +#define HAS_FREE_RTOS +#include +#include +#include +#include +#else +// not yet supported on cubecell +#ifndef CubeCell_BoardPlus +#define HAS_FREE_RTOS +#include +#include +#include +#include +#else + +#include + +typedef uint32_t TickType_t; +typedef uint32_t BaseType_t; + +#define portMAX_DELAY UINT32_MAX + +#endif +#endif \ No newline at end of file diff --git a/src/global.h b/src/global.h new file mode 100644 index 0000000..611813a --- /dev/null +++ b/src/global.h @@ -0,0 +1,4 @@ +#pragma once +#include "atracker.h" + +extern cAirsoftTracker *global; diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp new file mode 100644 index 0000000..e960591 --- /dev/null +++ b/src/gps/GPS.cpp @@ -0,0 +1,100 @@ + +#include "GPS.h" +#include "config.h" +#include "timing.h" +#include +#include + +#ifdef GPS_RX_PIN +HardwareSerial _serial_gps_real(GPS_SERIAL_NUM); +HardwareSerial &GPS::_serial_gps = _serial_gps_real; +#else +// Assume NRF52 +HardwareSerial &GPS::_serial_gps = Serial1; +#endif + +bool timeSetFromGPS; // We try to set our time from GPS each time we wake from sleep + +GPS *gps; + +// stuff that really should be in in the instance instead... +static uint32_t + timeStartMsec; // Once we have a GPS lock, this is where we hold the initial msec clock that corresponds to that time +static uint64_t zeroOffsetSecs; // GPS based time in secs since 1970 - only updated once on initial lock + +void readFromRTC() +{ + struct timeval tv; /* btw settimeofday() is helpfull here too*/ + + if (!gettimeofday(&tv, NULL)) { + uint32_t now = timing::millis(); + + DEBUG_MSG("Read RTC time as %ld (cur millis %u) valid=%d\n", tv.tv_sec, now, timeSetFromGPS); + timeStartMsec = now; + zeroOffsetSecs = tv.tv_sec; + } +} + +/// If we haven't yet set our RTC this boot, set it from a GPS derived time +void perhapsSetRTC(const struct timeval *tv) +{ + if (!timeSetFromGPS) { + timeSetFromGPS = true; + DEBUG_MSG("Setting RTC %ld secs\n", tv->tv_sec); +#ifndef NO_ESP32 + settimeofday(tv, NULL); +#else + DEBUG_MSG("ERROR TIME SETTING NOT IMPLEMENTED!\n"); +#endif + readFromRTC(); + } +} + +time_t mktimegm(struct tm *tm) +{ + time_t t; + + int y = tm->tm_year + 1900, m = tm->tm_mon + 1, d = tm->tm_mday; + + if (m < 3) { + m += 12; + y--; + } + + t = 86400 * + (d + (153 * m - 457) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 719469); + + t += 3600 * tm->tm_hour + 60 * tm->tm_min + tm->tm_sec; + + return t; +} +void perhapsSetRTC(struct tm &t, uint32_t ms) +{ + /* Convert to unix time + The Unix epoch (or Unix time or POSIX time or Unix timestamp) is the number of seconds that have elapsed since January 1, 1970 + (midnight UTC/GMT), not counting leap seconds (in ISO 8601: 1970-01-01T00:00:00Z). + */ + time_t res = mktimegm(&t); + struct timeval tv; + tv.tv_sec = res; + if(ms>0) + tv.tv_usec = ms*1000; + else + tv.tv_usec = 0; + + //DEBUG_MSG("Got time from GPS month=%d, year=%d, unixtime=%ld, ms=%d\n", t.tm_mon, t.tm_year, tv.tv_sec,ms); + if (t.tm_year < 120 || t.tm_year >= 300) + DEBUG_MSG("Ignoring invalid GPS time\n"); + else + perhapsSetRTC(&tv); +} + +uint32_t getTime() +{ + return ((timing::millis() - timeStartMsec) / 1000) + zeroOffsetSecs; +} + +uint32_t getValidTime() +{ + return timeSetFromGPS ? getTime() : 0; +} diff --git a/src/gps/GPS.h b/src/gps/GPS.h new file mode 100644 index 0000000..2a34226 --- /dev/null +++ b/src/gps/GPS.h @@ -0,0 +1,71 @@ +#pragma once + +#include "Observer.h" +#include "GPSStatus.h" +#include "../concurrency/PeriodicTask.h" +#include "sys/time.h" + +#define GPS_DIVIDER 10000000 + +/// If we haven't yet set our RTC this boot, set it from a GPS derived time +void perhapsSetRTC(const struct timeval *tv); +void perhapsSetRTC(struct tm &t,uint32_t ms); + +// Generate a string representation of DOP +const char *getDOPString(uint32_t dop); + +/// Return time since 1970 in secs. Until we have a GPS lock we will be returning time based at zero +uint32_t getTime(); + +/// Return time since 1970 in secs. If we don't have a GPS lock return zero +uint32_t getValidTime(); + +void readFromRTC(); + +/** + * A gps class that only reads from the GPS periodically (and FIXME - eventually keeps the gps powered down except when reading) + * + * When new data is available it will notify observers. + */ +class GPS : public Observable +{ + protected: + bool hasValidLocation = false; // default to false, until we complete our first read + + static HardwareSerial &_serial_gps; + + public: + int32_t latitude = 0, longitude = 0; // as an int mult by 1e-7 to get value as double + int32_t altitude = 0; + uint32_t hacc = 0; + uint32_t dop = 0; // Diminution of position; PDOP where possible (UBlox), HDOP otherwise (TinyGPS) in 10^2 units (needs scaling before use) + uint32_t heading = 0; // Heading of motion, in degrees * 10^-5 + uint32_t numSatellites = 0; + + bool isConnected = false; // Do we have a GPS we are talking to + + virtual ~GPS() {} + + Observable newStatus; + + /** + * Returns true if we succeeded + */ + virtual bool setup() { return true; } + + /// A loop callback for subclasses that need it. FIXME, instead just block on serial reads + virtual void loop() {} + + /// Returns ture if we have acquired GPS lock. + bool hasLock() const { return hasValidLocation; } + + /** + * Restart our lock attempt - try to get and broadcast a GPS reading ASAP + * called after the CPU wakes from light-sleep state */ + virtual void startLock() {} + + virtual void reset() {}; + virtual bool canSleep() { return true; } + virtual void shutdown() {} + HardwareSerial &getSerial() { return _serial_gps; } +}; diff --git a/src/gps/UBloxGPS.cpp b/src/gps/UBloxGPS.cpp new file mode 100644 index 0000000..1e9c885 --- /dev/null +++ b/src/gps/UBloxGPS.cpp @@ -0,0 +1,341 @@ +#include "UBloxGPS.h" +#include +#include "global.h" + +#define GPS_DEBUG +#define GPS_DISPLAY_HW + +UBloxGPS::UBloxGPS() +{ +} + +bool UBloxGPS::internalSetup() +{ + bool ok; + ok = ublox.setUART1Output(COM_TYPE_UBX, 3000); // Use native API + if(!ok) return false; + ok = ublox.setNavigationFrequency(GPS_FREQ+1, 3000); // Produce 4x/sec to keep the amount of time we stall in getPVT low + if(!ok) return false; + ok = ublox.setDynamicModel(DYN_MODEL_PEDESTRIAN,3000); // probably PEDESTRIAN but just in case assume bike speeds + if(!ok) return false; + //ok = ublox.powerSaveMode(false, 2000); // use power save mode, the default timeout (1100ms seems a bit too tight) + //if(!ok) return false; + + uint8_t payloadGNSS[] = {0x00,0x00,0x20,0x07, + 0x00,0x08,0x10,0x00,0x01,0x00,0x01,0x01, + 0x01,0x01,0x03,0x00,0x01,0x00,0x01,0x01, + 0x02,0x04,0x08,0x00,0x01,0x00,0x01,0x01, + 0x03,0x08,0x10,0x00,0x00,0x00,0x01,0x01, + 0x04,0x00,0x08,0x00,0x00,0x00,0x01,0x01, + 0x05,0x00,0x03,0x00,0x01,0x00,0x01,0x01, + 0x06,0x08,0x0E,0x00,0x01,0x00,0x01,0x01}; + ubxPacket packetCfg = {0, 0, 0, 0, 0, payloadGNSS, 0, 0, SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED,SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED}; + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_GNSS; + packetCfg.len = 0x3C; + packetCfg.startingSpot = 0; + ublox.sendCommand(&packetCfg,0); + delay(50); + + uint8_t payloadNMEA[] = {0x00,0x41,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; + packetCfg.payload = payloadNMEA; + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_NMEA; + packetCfg.len = 0x14; + packetCfg.startingSpot = 0; + ublox.sendCommand(&packetCfg,0); + delay(50); + +#ifdef HAS_AXP20X + ublox.setSerialRate(GPS_BAUDRATE2,1,3000); + delay(2); + _serial_gps.updateBaudRate(GPS_BAUDRATE2); + delay(50); + + restoreDatabase(GNSS_DBD_FILENAME); +#else + ublox.setSerialRate(GPS_BAUDRATE); + _serial_gps.setRxBufferSize(800); +#endif + //ok = ublox.saveConfiguration(3000); + //assert(ok); + return true; +} + +bool UBloxGPS::setup() +{ + if(serialInitialized) + { + _serial_gps.end(); + delay(10); + serialInitialized = false; + } + if(!serialInitialized) + { + _serial_gps.setRxBufferSize(800); +#ifdef GPS_RX_PIN + _serial_gps.begin(GPS_BAUDRATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN); +#else + _serial_gps.begin(GPS_BAUDRATE); +#endif + serialInitialized = true; + delay(30); + } + //ublox.enableDebugging(Serial); + + // note: the lib's implementation has the wrong docs for what the return val is + // it is not a bool, it returns zero for success + isConnected = ublox.begin(_serial_gps); + + // try a second time, the ublox lib serial parsing is buggy? + if (!isConnected) + { + isConnected = ublox.begin(_serial_gps); + } + + if (isConnected) + { + DEBUG_MSG("Connected to UBLOX GPS successfully\n"); + + if(!internalSetup()) + { + DEBUG_MSG("UBLOX Init error\n"); + return false; + } + concurrency::PeriodicTask::setup(); // We don't start our periodic task unless we actually found the device + + return true; + } + else + { + return false; + } +} + +void UBloxGPS::reset() +{ + uint8_t payloadCfg[4]; + ubxPacket packetCfg = {0, 0, 0, 0, 0, payloadCfg, 0, 0, SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED,SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED}; + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_RST; + packetCfg.len = 4; + packetCfg.startingSpot = 0; + payloadCfg[0] = 0x1; + payloadCfg[1] = 0x0; + payloadCfg[2] = 0; // 0=HW reset + payloadCfg[3] = 0; // reserved + ublox.sendCommand(&packetCfg, 0); // don't expect ACK +} + +void UBloxGPS::loop() +{ + ublox.checkUblox(); + if(lastPvtSeqId!=ublox.pvtSeqId) + { + processPVT(); + } +} + +void UBloxGPS::processPVT() +{ + uint8_t fixtype; + + missPVT = 0; + lastPvtSeqId=ublox.pvtSeqId; + fixtype = ublox.getFixType(0); +#ifdef GPS_DEBUG + DEBUG_MSG("GPS fix type %d\n", fixtype); +#endif + + //DEBUG_MSG("lat %d\n", ublox.getLatitude()); + + // any fix that has time + if (ublox.moduleQueried.gpsSecond) + { + /* Convert to unix time +The Unix epoch (or Unix time or POSIX time or Unix timestamp) is the number of seconds that have elapsed since January 1, 1970 +(midnight UTC/GMT), not counting leap seconds (in ISO 8601: 1970-01-01T00:00:00Z). +*/ + struct tm t; + t.tm_sec = ublox.getSecond(0); + t.tm_min = ublox.getMinute(0); + t.tm_hour = ublox.getHour(0); + t.tm_mday = ublox.getDay(0); + t.tm_mon = ublox.getMonth(0) - 1; + t.tm_year = ublox.getYear(0) - 1900; + t.tm_isdst = false; + perhapsSetRTC(t,ublox.getNanosecond(0)/1000000); + } + + if(ublox.moduleQueried.horizontalAccEst) + hacc = ublox.getHorizontalAccEst(0); + + if(ublox.moduleQueried.pDOP) + dop = ublox.getPDOP(0); + + if(ublox.moduleQueried.SIV) + numSatellites = ublox.getSIV(0); + +#ifdef GPS_DEBUG + DEBUG_MSG("GPS numSatellites %d\n", numSatellites); +#endif + +#ifdef GPS_DISPLAY_HW + ubxHwState hwState; + if(ublox.getHwState(hwState)) + { + DEBUG_MSG("HW State Noise %d, AGC %0.2f (%d)\n", hwState.noisePerMS,hwState.agcCnt*100/8192.0,hwState.agcCnt); + } +#endif + if(global->getConfig().testLat&&global->getConfig().testLng) + { + latitude = global->getConfig().testLat; + longitude = global->getConfig().testLng; + altitude = 0; + heading = ublox.getHeading(0); + + // bogus lat lon is reported as 0 or 0 (can be bogus just for one) + // Also: apparently when the GPS is initially reporting lock it can output a bogus latitude > 90 deg! + hasValidLocation = (latitude != 0) && (longitude != 0) && (latitude <= 900000000 && latitude >= -900000000); + if (hasValidLocation) + { + wantNewLocation = false; + notifyObservers(NULL); + } + } + else + if ((fixtype >= 3 && fixtype <= 4) && ublox.moduleQueried.latitude) // rd fixes only + { + // we only notify if position has changed + latitude = ublox.getLatitude(0); + longitude = ublox.getLongitude(0); + //longitude = -74.6294672*10000000; //OTP GPS + //latitude = 39.9381124*10000000; + //longitude = -74.41993781254924*10000000; //SANJ GPS + //latitude = 39.99472549579622*10000000; + //longitude = -73.98029099999999*10000000; //MSATO GPS + //latitude = 42.207361*10000000; + //longitude = -74.55166537552641*10000000; //R14 GPS + //latitude = 39.9980604701216*10000000; + + //longitude = -76.19249075700209*10000000; //BR2022 GPS + //latitude = 40.94618445451866*10000000; + //longitude = -74.9177937*10000000; //Picasso GPS + //latitude = 39.7361251*10000000; + + altitude = ublox.getAltitude(0) / 1000; // in mm convert to meters + heading = ublox.getHeading(0); + + // bogus lat lon is reported as 0 or 0 (can be bogus just for one) + // Also: apparently when the GPS is initially reporting lock it can output a bogus latitude > 90 deg! + hasValidLocation = (latitude != 0) && (longitude != 0) && (latitude <= 900000000 && latitude >= -900000000); + if (hasValidLocation) + { + wantNewLocation = false; + notifyObservers(NULL); + } + } + else // we didn't get a location update, go back to sleep and hope the characters show up + wantNewLocation = true; + + // Notify any status instances that are observing us + const GPSStatus status = GPSStatus(hasLock(), isConnected, latitude, longitude, altitude, dop, hacc, heading, numSatellites); + newStatus.notifyObservers(&status); + ublox.flushPVT(); + waitPVT = false; +} + +void UBloxGPS::doTask() +{ + loop(); + if(waitPVT) + { + missPVT++; + if(missPVT>4) + { + missPVT = 0; + } + } + waitPVT = true; + ublox.getPVT(0); +#ifdef GPS_DISPLAY_HW + ublox.queryHwState(0); +#endif + + setPeriod(hasValidLocation && !wantNewLocation ? 1000/GPS_FREQ : 1000); +} + +bool UBloxGPS::canSleep() +{ +#ifdef AT_CAN_SLEEP + return !waitPVT; +#else + return false; +#endif +} + +void UBloxGPS::startLock() +{ + DEBUG_MSG("Looking for GPS lock\n"); + wantNewLocation = true; + setPeriod(1); +} + +void UBloxGPS::backupDatabase(const char *filename) +{ + uint8_t *data = (uint8_t *) malloc(8192); + int16_t size=8192; + ublox.pollNavigationDatabase(data,size,5000); + if(size>0) + { + FILE *file; + file = fopen(filename,"wb+"); + fwrite(data,size,1,file); + fflush(file); + fclose(file); + } + free(data); +} + +void UBloxGPS::restoreDatabase(const char *filename) +{ + FILE *file; + file = fopen(filename,"rb"); + if(file==NULL) + return; + fseek(file, 0L, SEEK_END); + size_t size = ftell(file); + fseek(file, 0L, SEEK_SET); + if(size>0) + { + int ss = 64; + uint8_t *data = (uint8_t *) malloc(ss); + while(true) + { + int readed = fread(data,ss,1,file); + if(readed!=0) + ublox.sendNavigationDatabase(data,readed); + if(readed!=ss) + break; + delay(1); + } + free(data); + } + fclose(file); +} + +void UBloxGPS::shutdown() +{ + //ublox.enableDebugging(Serial); + uint8_t *payloadCfg = ublox.payloadCfg; + ubxPacket packetCfg = {0, 0, 0, 0, 0, payloadCfg, 0, 0, SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED,SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED}; + packetCfg.cls = UBX_CLASS_CFG; + packetCfg.id = UBX_CFG_RST; + packetCfg.len = 4; + packetCfg.startingSpot = 0; + payloadCfg[0] = 0x0; + payloadCfg[1] = 0x0; + payloadCfg[2] = 0x8; // 0 = Controlled GNSS stop + payloadCfg[3] = 0; // reserved + ublox.sendCommand(&packetCfg,0); // don't expect ACK +} \ No newline at end of file diff --git a/src/gps/UBloxGPS.h b/src/gps/UBloxGPS.h new file mode 100644 index 0000000..13c9ed6 --- /dev/null +++ b/src/gps/UBloxGPS.h @@ -0,0 +1,43 @@ +#pragma once + +#include "GPS.h" +#include "Observer.h" +#include "../concurrency/PeriodicTask.h" +#include "SparkFun_Ublox_Arduino_Library.h" + +/** + * A gps class that only reads from the GPS periodically (and FIXME - eventually keeps the gps powered down except when reading) + * + * When new data is available it will notify observers. + */ +class UBloxGPS : public GPS, public concurrency::PeriodicTask +{ + SFE_UBLOX_GPS ublox; + uint32_t lastPvtSeqId=0xFFFFFFFF; + bool wantNewLocation = true; + bool internalSetup(); + bool serialInitialized = false; + bool waitPVT=false; + uint8_t missPVT = 0; + void processPVT(); + public: + UBloxGPS(); + + /** + * Returns true if we succeeded + */ + virtual bool setup(); + + virtual void doTask(); + + /** + * Restart our lock attempt - try to get and broadcast a GPS reading ASAP + * called after the CPU wakes from light-sleep state */ + virtual void startLock(); + virtual void reset(); + virtual void backupDatabase(const char *filename); + virtual void restoreDatabase(const char *filename); + virtual bool canSleep(); + virtual void loop(); + virtual void shutdown(); +}; diff --git a/src/imu.cpp b/src/imu.cpp new file mode 100644 index 0000000..6484aac --- /dev/null +++ b/src/imu.cpp @@ -0,0 +1,262 @@ +#include "imu.h" +#include "EEPROM.h" + +#define Pi 3.14159265359 +//#define IMU_DEBUG + +cIMU::cIMU() +{ + m_imu = NULL; + m_isConnected = false; + m_lastUpdate = 0; +} + +void cIMU::adjustMagCalibrationBias(float value,uint8_t axis) +{ + float o,s; + switch(axis) + { + case 0: + { + o = m_imu->getMagBiasX_uT(); + s = m_imu->getMagScaleFactorX(); + break; + } + case 1: + { + o = m_imu->getMagBiasY_uT(); + s = m_imu->getMagScaleFactorY(); + break; + } + case 2: + { + o = m_imu->getMagBiasZ_uT(); + s = m_imu->getMagScaleFactorZ(); + break; + } + } + o+=value; + switch(axis) + { + case 0: + { + m_imu->setMagCalX(o,s); + break; + } + case 1: + { + m_imu->setMagCalY(o,s); + break; + } + case 2: + { + m_imu->setMagCalZ(o,s); + break; + } + } + m_imu->recalibrateMagByBias(); + updateCalibration(); + DEBUG_MSG("Mag X: %0.2f/%0.2f, Y: %0.2f/%0.2f, Z: %0.2f/%0.2f\n",m_calibration.magBiasX,m_calibration.magScaleX,m_calibration.magBiasY,m_calibration.magScaleY,m_calibration.magBiasZ,m_calibration.magScaleZ); +} + +void cIMU::updateCalibration() +{ + m_calibration.signature = CAL_SIG; + m_calibration.magBiasX = m_imu->getMagBiasX_uT(); + m_calibration.magBiasY = m_imu->getMagBiasY_uT(); + m_calibration.magBiasZ = m_imu->getMagBiasZ_uT(); + m_calibration.magScaleX = m_imu->getMagScaleFactorX(); + m_calibration.magScaleY = m_imu->getMagScaleFactorY(); + m_calibration.magScaleZ = m_imu->getMagScaleFactorZ(); + m_imu->getMagMinMax(m_calibration.magMinX,m_calibration.magMaxX,m_calibration.magMinY,m_calibration.magMaxY,m_calibration.magMinZ,m_calibration.magMaxZ); + + m_calibration.gyroBiasX = m_imu->getGyroBiasX_rads(); + m_calibration.gyroBiasY = m_imu->getGyroBiasY_rads(); + m_calibration.gyroBiasZ = m_imu->getGyroBiasZ_rads(); + + m_calibration.accBiasX = m_imu->getAccelBiasX_mss(); + m_calibration.accScaleX = m_imu->getAccelScaleFactorX(); + m_calibration.accBiasY = m_imu->getAccelBiasY_mss(); + m_calibration.accScaleY = m_imu->getAccelScaleFactorY(); + m_calibration.accBiasZ = m_imu->getAccelBiasZ_mss(); + m_calibration.accScaleZ = m_imu->getAccelScaleFactorZ(); +} + +void cIMU::saveCalibration() +{ + updateCalibration(); + EEPROM.writeBytes(CAL_OFFISET,&m_calibration,sizeof(m_calibration)); + EEPROM.commit(); +} + +void cIMU::loadCalibration() +{ + EEPROM.readBytes(CAL_OFFISET,&m_calibration,sizeof(m_calibration)); + if(m_calibration.signature==CAL_SIG) + { + m_imu->setGyroBiasX_rads(m_calibration.gyroBiasX); + m_imu->setGyroBiasY_rads(m_calibration.gyroBiasY); + m_imu->setGyroBiasZ_rads(m_calibration.gyroBiasZ); + + m_imu->setMagMinMax(m_calibration.magMinX,m_calibration.magMaxX,m_calibration.magMinY,m_calibration.magMaxY,m_calibration.magMinZ,m_calibration.magMaxZ); + m_imu->setMagCalX(m_calibration.magBiasX,m_calibration.magScaleX); + m_imu->setMagCalY(m_calibration.magBiasY,m_calibration.magScaleY); + m_imu->setMagCalZ(m_calibration.magBiasZ,m_calibration.magScaleZ); + + m_imu->setAccelCalX(m_calibration.accBiasX,m_calibration.accScaleX); + m_imu->setAccelCalY(m_calibration.accBiasY,m_calibration.accScaleY); + m_imu->setAccelCalZ(m_calibration.accBiasZ,m_calibration.accScaleZ); + } +} + +void cIMU::shutdown() +{ +} + +void cIMU::calibrate() +{ + DEBUG_MSG("Calibrating Gyro\n"); + m_imu->calibrateGyro(); + delay(100); + DEBUG_MSG("Calibrating Accel\n"); + m_imu->calibrateAccel(); + delay(100); + DEBUG_MSG("Calibrating MAG\n"); + m_imu->calibrateMag(); + saveCalibration(); +} +bool cIMU::setup() +{ + EEPROM.readBytes(CAL_OFFISET,&m_calibration,sizeof(m_calibration)); + m_filter = new Madgwick();// new Adafruit_Mahony(); + m_filter->begin(50); + m_lastUpdate = 0; + m_isConnected = false; + void *ptr = heap_caps_calloc(1,sizeof(MPU9250),MALLOC_CAP_8BIT); + m_imu = new(ptr) MPU9250(Wire,0x68); + auto status = m_imu->begin(); + if(status<0) + { + DEBUG_MSG("IMU initialization unsuccessful, %d\n",status); + } + else + { + DEBUG_MSG("IMU initialization successful, %d\n",status); + m_isConnected = true; + if(m_calibration.signature!=CAL_SIG) + { + calibrate(); + } + else + { + DEBUG_MSG("Use calibration data\n"); + m_imu->setGyroBiasX_rads(m_calibration.gyroBiasX); + m_imu->setGyroBiasY_rads(m_calibration.gyroBiasY); + m_imu->setGyroBiasZ_rads(m_calibration.gyroBiasZ); + DEBUG_MSG("Mag X: %0.2f/%0.2f, Y: %0.2f/%0.2f, Z: %0.2f/%0.2f\n",m_calibration.magBiasX,m_calibration.magScaleX,m_calibration.magBiasY,m_calibration.magScaleY,m_calibration.magBiasZ,m_calibration.magScaleZ); + DEBUG_MSG("Mag Min/Max X: %0.2f/%0.2f, Y: %0.2f/%0.2f, Z: %0.2f/%0.2f\n",m_calibration.magMinX,m_calibration.magMaxX,m_calibration.magMinY,m_calibration.magMaxY,m_calibration.magMinZ,m_calibration.magMaxZ); + m_imu->setMagMinMax(m_calibration.magMinX,m_calibration.magMaxX,m_calibration.magMinY,m_calibration.magMaxY,m_calibration.magMinZ,m_calibration.magMaxZ); + m_imu->setMagCalX(m_calibration.magBiasX,m_calibration.magScaleX); + m_imu->setMagCalY(m_calibration.magBiasY,m_calibration.magScaleY); + m_imu->setMagCalZ(m_calibration.magBiasZ,m_calibration.magScaleZ); + + m_imu->setAccelCalX(m_calibration.accBiasX,m_calibration.accScaleX); + m_imu->setAccelCalY(m_calibration.accBiasY,m_calibration.accScaleY); + m_imu->setAccelCalZ(m_calibration.accBiasZ,m_calibration.accScaleZ); + } + m_imu->setAccelRange(MPU9250::ACCEL_RANGE_2G); + // setting the gyroscope full scale range to +/-500 deg/s + m_imu->setGyroRange(MPU9250::GYRO_RANGE_500DPS); + //m_imu->setGyroRange(MPU9250::GYRO_RANGE_500DPS); + // setting DLPF bandwidth + m_imu->setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ); + // setting SRD to 19 for a 50 Hz update rate + m_imu->setSrd(19); + } + return m_isConnected; +} + +cIMU::~cIMU() +{ +} + +#define GYRO_SPEED 1 + +#ifdef IMU_DEBUG +int vvv=0; +#endif +void cIMU::loop() +{ + if(m_isConnected) + { + int64_t now = millis(); + if((now-m_lastUpdate)>=20) + { + float delta = (now-m_lastUpdate)/1000.0; + if(delta>0.5f) + delta = 0.5f; + m_lastUpdate = now; + m_imu->readSensor(); + m_filter->update(m_imu->getGyroX_rads()/GYRO_SPEED,m_imu->getGyroY_rads()/GYRO_SPEED,m_imu->getGyroZ_rads()/GYRO_SPEED,m_imu->getAccelX_mss(), m_imu->getAccelY_mss(),m_imu->getAccelZ_mss(),m_imu->getMagX_uT(), m_imu->getMagY_uT(),m_imu->getMagZ_uT(),delta); +/* + float xM = m_imu->getMagX_uT(); + float yM = m_imu->getMagY_uT(); + float zM = m_imu->getMagZ_uT(); + + float g = 9.8; + float xG = (m_imu->getAccelX_mss()) / g; + float yG = (m_imu->getAccelY_mss()) / g; + float zG = (m_imu->getAccelZ_mss()) / g; + float pitch = atan2(-xG, sqrt(yG * yG + zG * zG)); + float roll = atan2(yG, zG); + + //float pitch = m_filter.getPitchRadians(); + //float roll = m_filter.getRollRadians(); + float xM2 = xM * cos(pitch) + zM * sin(pitch); + float yM2 = xM * sin(roll) * sin(pitch) + yM * cos(roll) - zM * sin(roll) * cos(pitch); + float compHeading2 = (atan2(yM2, xM2) * 180 / Pi)-90; + if (compHeading2 < 0) { + compHeading2 = 360 + compHeading2; + } +*/ + float compHeading = 90-m_filter->getYaw(); + if(compHeading<0) compHeading+=360; + const IMUStatus status = IMUStatus(true,compHeading*100); + newStatus.notifyObservers(&status); +#ifdef IMU_DEBUG + vvv++; + if(vvv%5==0) + { + m_imu->getMagMinMax(m_calibration.magMinX,m_calibration.magMaxX,m_calibration.magMinY,m_calibration.magMaxY,m_calibration.magMinZ,m_calibration.magMaxZ); + Serial.print(m_imu->getAccelX_mss(),6); + Serial.print("\t"); + Serial.print(m_imu->getAccelY_mss(),6); + Serial.print("\t"); + Serial.print(m_imu->getAccelZ_mss(),6); + Serial.print("\t"); + Serial.print(m_imu->getGyroX_rads(),6); + Serial.print("\t"); + Serial.print(m_imu->getGyroY_rads(),6); + Serial.print("\t"); + Serial.print(m_imu->getGyroZ_rads(),6); + Serial.print("\t"); + Serial.print(m_imu->getMagX_uT(),6); + Serial.print("\t"); + Serial.print(m_imu->getMagY_uT(),6); + Serial.print("\t"); + Serial.print(m_imu->getMagZ_uT(),6); + Serial.print("\t"); + Serial.print(m_imu->getRawMagX_uT(),6); + Serial.print("\t"); + Serial.print(m_imu->getRawMagY_uT(),6); + Serial.print("\t"); + Serial.print(m_imu->getRawMagZ_uT(),6); + + //Serial.print("\t"); + //Serial.print(m_imu->getTemperature_C(),6); + DEBUG_MSG("\tHeading %0.2f %0.2f/%0.2f, Y: %0.2f/%0.2f, Z: %0.2f/%0.2f\n",compHeading,m_calibration.magMinX,m_calibration.magMaxX,m_calibration.magMinY,m_calibration.magMaxY,m_calibration.magMinZ,m_calibration.magMaxZ); + } +#endif + } + } +} diff --git a/src/imu.h b/src/imu.h new file mode 100644 index 0000000..6125a7e --- /dev/null +++ b/src/imu.h @@ -0,0 +1,71 @@ +#pragma once +#include +#include "MPU9250/MPU9250.h" +#include "Observer.h" +#include "IMUStatus.h" +#include "AHRS/MadgwickAHRS.h" +#include "AHRS/Adafruit_AHRS_Mahony.h" + +#define CAL_SIG 0x2452 +#define CAL_OFFISET 0 +struct sIMUCalibration +{ + int16_t signature; + float magMinX; + float magMaxX; + float magMinY; + float magMaxY; + float magMinZ; + float magMaxZ; + float magBiasX; + float magBiasY; + float magBiasZ; + float magScaleX; + float magScaleY; + float magScaleZ; + + float accBiasX; + float accBiasY; + float accBiasZ; + float accScaleX; + float accScaleY; + float accScaleZ; + + float gyroBiasX; + float gyroBiasY; + float gyroBiasZ; + sIMUCalibration() + { + signature = 0; + magMaxX = magMaxY = magMaxZ = magMinX = magMinY = magMinZ = 0; + magBiasX = magBiasY = magBiasZ = magScaleX = magScaleY = magScaleZ = 0; + accBiasX = accBiasY = accBiasZ = accScaleX = accScaleY = accScaleZ = 0; + gyroBiasX = gyroBiasY = gyroBiasZ = 0; + } +}; + +class cIMU : public Observable +{ +protected: + MPU9250 *m_imu; + bool m_isConnected; + int64_t m_lastUpdate; + //Adafruit_AHRS_FusionInterface *m_filter; + Madgwick *m_filter; + sIMUCalibration m_calibration; +public: + Observable newStatus; + cIMU(); + virtual ~cIMU(); + virtual bool setup(); + virtual void loop(); + void calibrate(); + void shutdown(); + void updateCalibration(); + void saveCalibration(); + void loadCalibration(); + void setAutoMag(bool v) { m_imu->setAutoMag(v); } + bool getAutoMag() { return m_imu->getAutoMag(); } + void adjustMagCalibrationBias(float value,uint8_t axis); + sIMUCalibration &getCalibration() { return m_calibration; } +}; diff --git a/src/lv_conf.h b/src/lv_conf.h new file mode 100644 index 0000000..74779b3 --- /dev/null +++ b/src/lv_conf.h @@ -0,0 +1,789 @@ +#ifndef LV_CONF_H +#define LV_CONF_H +/* clang-format off */ +#include + +#include "config.h" + +#define CONFIG_LV_TOUCH_CONTROLLER_NONE 1 +//#ifdef USE_SCREEN_EVE +#define CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X 1 +//#endif +#define CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI 1 +#define CONFIG_LV_TFT_DISPLAY_SPI_FULL_DUPLEX 1 +#define CONFIG_LV_TFT_DISPLAY_SPI_TRANS_MODE_SIO 1 +#define CONFIG_LV_DISPLAY_ORIENTATION_LANDSCAPE 1 +#define CONFIG_LV_FT81X_CONFIG_EVE_EVE3_35 1 +//#define CONFIG_LV_TFT_DISPLAY_SPI_HSPI 1 +#define CONFIG_LV_TFT_DISPLAY_SPI_HSPI 1 +#define CONFIG_LV_DISPLAY_WIDTH 320 +#define CONFIG_LV_DISPLAY_HEIGHT 240 +#define CONFIG_LV_TFT_USE_CUSTOM_SPI_CLK_DIVIDER 1 +#define CONFIG_LV_TFT_CUSTOM_SPI_CLK_DIVIDER 5 + +#define CONFIG_LV_DISP_SPI_MOSI (SPI_DISP_MOSI) +#define CONFIG_LV_DISPLAY_USE_SPI_MISO 1 +#define CONFIG_LV_DISP_SPI_MISO (SPI_DISP_MISO) +#define CONFIG_LV_DISP_SPI_INPUT_DELAY_NS 0 +#define CONFIG_LV_DISP_SPI_IO2 -1 +#define CONFIG_LV_DISP_SPI_IO3 -1 +#define CONFIG_LV_DISP_SPI_CLK (SPI_DISP_SCK) +#define CONFIG_LV_DISPLAY_USE_SPI_CS 1 +#define CONFIG_LV_DISP_SPI_CS (SPI_DISP_CS) +#define CONFIG_LV_DISP_PIN_RST (SPI_DISP_RESET) +#undef CONFIG_LV_TFT_DISPLAY_SPI_HALF_DUPLEX + +#define FT81X_FULL 1 + +#define FT81X_ARGB4 1 + +/*==================== + Graphical settings + *====================*/ + +/* Maximal horizontal and vertical resolution to support by the library.*/ +#define LV_HOR_RES_MAX (CONFIG_LV_DISPLAY_WIDTH) +#define LV_VER_RES_MAX (CONFIG_LV_DISPLAY_HEIGHT) + +/* Color depth: + * - 1: 1 byte per pixel + * - 8: RGB332 + * - 16: RGB565 + * - 32: ARGB8888 + */ +#define LV_COLOR_DEPTH 32 + +/* Swap the 2 bytes of RGB565 color. + * Useful if the display has a 8 bit interface (e.g. SPI)*/ +#define LV_COLOR_16_SWAP 0 + +/* 1: Enable screen transparency. + * Useful for OSD or other overlapping GUIs. + * Requires `LV_COLOR_DEPTH = 32` colors and the screen's style should be modified: `style.body.opa = ...`*/ +#define LV_COLOR_SCREEN_TRANSP 1 + +/*Images pixels with this color will not be drawn (with chroma keying)*/ +#define LV_COLOR_TRANSP LV_COLOR_LIME /*LV_COLOR_LIME: pure green*/ + +/* Enable anti-aliasing (lines, and radiuses will be smoothed) */ +#define LV_ANTIALIAS 1 + +/* Default display refresh period. + * Can be changed in the display driver (`lv_disp_drv_t`).*/ +#define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/ + +/* Dot Per Inch: used to initialize default sizes. + * E.g. a button with width = LV_DPI / 2 -> half inch wide + * (Not so important, you can adjust it to modify default sizes and spaces)*/ +#define LV_DPI 40 /*[px]*/ + +/* The the real width of the display changes some default values: + * default object sizes, layout of examples, etc. + * According to the width of the display (hor. res. / dpi) + * the displays fall in 4 categories. + * The 4th is extra large which has no upper limit so not listed here + * The upper limit of the categories are set below in 0.1 inch unit. + */ +#define LV_DISP_SMALL_LIMIT 30 +#define LV_DISP_MEDIUM_LIMIT 50 +#define LV_DISP_LARGE_LIMIT 70 + +/* Type of coordinates. Should be `int16_t` (or `int32_t` for extreme cases) */ +typedef int16_t lv_coord_t; + +/*========================= + Memory manager settings + *=========================*/ + +/* LittelvGL's internal memory manager's settings. + * The graphical objects and other related data are stored here. */ + +/* 1: use custom malloc/free, 0: use the built-in `lv_mem_alloc` and `lv_mem_free` */ +#define LV_MEM_CUSTOM 1 +#if LV_MEM_CUSTOM == 0 +/* Size of the memory used by `lv_mem_alloc` in bytes (>= 2kB)*/ +# define LV_MEM_SIZE (32U * 1024U) + +/* Compiler prefix for a big array declaration */ +# define LV_MEM_ATTR + +/* Set an address for the memory pool instead of allocating it as an array. + * Can be in external SRAM too. */ +# define LV_MEM_ADR 0 + +/* Automatically defrag. on free. Defrag. means joining the adjacent free cells. */ +# define LV_MEM_AUTO_DEFRAG 1 +#else /*LV_MEM_CUSTOM*/ +//# define LV_MEM_CUSTOM_INCLUDE /*Header for the dynamic memory function*/ +//# define LV_MEM_CUSTOM_ALLOC malloc /*Wrapper to malloc*/ +//# define LV_MEM_CUSTOM_FREE free /*Wrapper to free*/ + +# define LV_MEM_CUSTOM_INCLUDE "lvgl_mem.h" /*Header for the dynamic memory function*/ +# define LV_MEM_CUSTOM_ALLOC lvgl_malloc /*Wrapper to malloc*/ +# define LV_MEM_CUSTOM_FREE lvgl_free /*Wrapper to free*/ + +#endif /*LV_MEM_CUSTOM*/ + +/* Use the standard memcpy and memset instead of LVGL's own functions. + * The standard functions might or might not be faster depending on their implementation. */ +#define LV_MEMCPY_MEMSET_STD 0 + +/* Garbage Collector settings + * Used if lvgl is binded 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*/ +# define LV_MEM_CUSTOM_REALLOC your_realloc /*Wrapper to realloc*/ +# define LV_MEM_CUSTOM_GET_SIZE your_mem_get_size /*Wrapper to lv_mem_get_size*/ +#endif /* LV_ENABLE_GC */ + +/*======================= + Input device settings + *=======================*/ + +/* Input device default settings. + * Can be changed in the Input device driver (`lv_indev_drv_t`)*/ + +/* Input device read period in milliseconds */ +#define LV_INDEV_DEF_READ_PERIOD 30 + +/* Drag threshold in pixels */ +#define LV_INDEV_DEF_DRAG_LIMIT 10 + +/* Drag throw slow-down in [%]. Greater value -> faster slow-down */ +#define LV_INDEV_DEF_DRAG_THROW 10 + +/* Long press time in milliseconds. + * Time to send `LV_EVENT_LONG_PRESSED`) */ +#define LV_INDEV_DEF_LONG_PRESS_TIME 400 + +/* Repeated trigger period in long press [ms] + * Time between `LV_EVENT_LONG_PRESSED_REPEAT */ +#define LV_INDEV_DEF_LONG_PRESS_REP_TIME 100 + + +/* Gesture threshold in pixels */ +#define LV_INDEV_DEF_GESTURE_LIMIT 50 + +/* Gesture min velocity at release before swipe (pixels)*/ +#define LV_INDEV_DEF_GESTURE_MIN_VELOCITY 3 + +/*================== + * Feature usage + *==================*/ + +/*1: Enable the Animations */ +#define LV_USE_ANIMATION 1 +#if LV_USE_ANIMATION + +/*Declare the type of the user data of animations (can be e.g. `void *`, `int`, `struct`)*/ +typedef void * lv_anim_user_data_t; + +#endif + +/* 1: Enable shadow drawing on rectangles*/ +#define LV_USE_SHADOW 1 +#if LV_USE_SHADOW +/* 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 +#endif + +/*1: enable outline drawing on rectangles*/ +#define LV_USE_OUTLINE 1 + +/*1: enable pattern drawing on rectangles*/ +#define LV_USE_PATTERN 1 + +/*1: enable value string drawing on rectangles*/ +#define LV_USE_VALUE_STR 1 + +/* 1: Use other blend modes than normal (`LV_BLEND_MODE_...`)*/ +#define LV_USE_BLEND_MODES 1 + +/* 1: Use the `opa_scale` style property to set the opacity of an object and its children at once*/ +#define LV_USE_OPA_SCALE 1 + +/* 1: Use image zoom and rotation*/ +#define LV_USE_IMG_TRANSFORM 1 + +/* 1: Enable object groups (for keyboard/encoder navigation) */ +#define LV_USE_GROUP 1 +#if LV_USE_GROUP +typedef void * lv_group_user_data_t; +#endif /*LV_USE_GROUP*/ + +/* 1: Enable GPU interface*/ +#define LV_USE_GPU 1 /*Only enables `gpu_fill_cb` and `gpu_blend_cb` in the disp. drv- */ +#define LV_USE_GPU_STM32_DMA2D 0 +/*If enabling LV_USE_GPU_STM32_DMA2D, LV_GPU_DMA2D_CMSIS_INCLUDE must be defined to include path of CMSIS header of target processor +e.g. "stm32f769xx.h" or "stm32f429xx.h" */ +#define LV_GPU_DMA2D_CMSIS_INCLUDE + +/*1: Use PXP for CPU off-load on NXP RTxxx platforms */ +#define LV_USE_GPU_NXP_PXP 0 + +/*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 FSL_RTOS_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 + +/*1: Use VG-Lite for CPU offload on NXP RTxxx platforms */ +#define LV_USE_GPU_NXP_VG_LITE 0 + +/* 1: Enable file system (might be required for images */ +#define LV_USE_FILESYSTEM 1 +#if LV_USE_FILESYSTEM +/*Declare the type of the user data of file system drivers (can be e.g. `void *`, `int`, `struct`)*/ +typedef void * lv_fs_drv_user_data_t; +#endif + +/*1: Add a `user_data` to drivers and objects*/ +#define LV_USE_USER_DATA 1 + +/*1: Show CPU usage and FPS count in the right bottom corner*/ +#define LV_USE_PERF_MONITOR 0 + +/*1: Use the functions and types from the older API if possible */ +#define LV_USE_API_EXTENSION_V6 1 +#define LV_USE_API_EXTENSION_V7 1 + +/*======================== + * Image decoder and cache + *========================*/ + +/* 1: Enable indexed (palette) images */ +#define LV_IMG_CF_INDEXED 1 + +/* 1: Enable alpha indexed images */ +#define LV_IMG_CF_ALPHA 1 + +/* 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. 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. + * Set it to 0 to disable caching */ +#define LV_IMG_CACHE_DEF_SIZE 1 + +/*Declare the type of the user data of image decoder (can be e.g. `void *`, `int`, `struct`)*/ +typedef void * lv_img_decoder_user_data_t; + +/*===================== + * 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_task_handler` function */ +#define LV_ATTRIBUTE_TASK_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 + +/* With size optimization (-Os) the compiler might not align data to + * 4 or 8 byte boundary. Some HW may need even 32 or 64 bytes. + * This alignment will be explicitly applied where needed. + * LV_ATTRIBUTE_MEM_ALIGN_SIZE should be used to specify required align size. + * E.g. __attribute__((aligned(LV_ATTRIBUTE_MEM_ALIGN_SIZE))) */ +#define LV_ATTRIBUTE_MEM_ALIGN + +/* Attribute to mark large constant arrays for example + * font's bitmaps */ +#define LV_ATTRIBUTE_LARGE_CONST + +/* Prefix performance critical functions to place them into a faster memory (e.g RAM) + * Uses 15-20 kB extra memory */ +#define LV_ATTRIBUTE_FAST_MEM + +/* Export integer constant to binding. + * This macro is used with constants in the form of LV_ that + * should also appear on lvgl binding API such as Micropython + * + * The default value just prevents a GCC warning. + */ +#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning + +/* 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 + +/*=================== + * HAL settings + *==================*/ + +/* 1: use a custom tick source. + * It removes the need to manually update the tick with `lv_tick_inc`) */ +#define LV_TICK_CUSTOM 1 +#if LV_TICK_CUSTOM == 1 +#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*/ +#endif /*LV_TICK_CUSTOM*/ + +typedef void * lv_disp_drv_user_data_t; /*Type of user data in the display driver*/ +typedef void * lv_indev_drv_user_data_t; /*Type of user data in the input device driver*/ + +/*================ + * Log settings + *===============*/ + +/*1: 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_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 +#endif /*LV_USE_LOG*/ + +/*================= + * Debug settings + *================*/ + +/* If Debug is enabled LittelvGL validates the parameters of the functions. + * If an invalid parameter is found an error log message is printed and + * the MCU halts at the error. (`LV_USE_LOG` should be enabled) + * If you are debugging the MCU you can pause + * the debugger to see exactly where the issue is. + * + * The behavior of asserts can be overwritten by redefining them here. + * E.g. #define LV_ASSERT_MEM(p) + */ +#define LV_USE_DEBUG 0 +#if LV_USE_DEBUG + +/*Check if the parameter is NULL. (Quite fast) */ +#define LV_USE_ASSERT_NULL 1 + +/*Checks is the memory is successfully allocated or no. (Quite fast)*/ +#define LV_USE_ASSERT_MEM 1 + +/*Check the integrity of `lv_mem` after critical operations. (Slow)*/ +#define LV_USE_ASSERT_MEM_INTEGRITY 0 + +/* Check the strings. + * Search for NULL, very long strings, invalid characters, and unnatural repetitions. (Slow) + * If disabled `LV_USE_ASSERT_NULL` will be performed instead (if it's enabled) */ +#define LV_USE_ASSERT_STR 0 + +/* Check NULL, the object's type and existence (e.g. not deleted). (Quite slow) + * If disabled `LV_USE_ASSERT_NULL` will be performed instead (if it's enabled) */ +#define LV_USE_ASSERT_OBJ 0 + +/*Check if the styles are properly initialized. (Fast)*/ +#define LV_USE_ASSERT_STYLE 0 + +#endif /*LV_USE_DEBUG*/ + +/*================== + * FONT USAGE + *===================*/ + +/* The built-in fonts contains the ASCII range and some Symbols with 4 bit-per-pixel. + * The symbols are available via `LV_SYMBOL_...` defines + * More info about fonts: https://docs.lvgl.io/v7/en/html/overview/font.html + * To create a new font go to: https://lvgl.com/ttf-font-to-c-array + */ + +/* Montserrat fonts with 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 1 +#define LV_FONT_MONTSERRAT_14 1 +#define LV_FONT_MONTSERRAT_16 1 +#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 1 + +/* 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, PErisan letters and all their forms*/ +#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ + +/*Pixel perfect monospace font + * http://pelulamu.net/unscii/ */ +#define LV_FONT_UNSCII_8 0 +#define LV_FONT_UNSCII_16 0 + +/* Optionally declare your 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 + +/* Enable it if you have fonts with a lot of characters. + * The limit depends on the font size, font face and bpp + * but with > 10,000 characters if you see issues probably you need to enable it.*/ +#define LV_FONT_FMT_TXT_LARGE 0 + +/* Enables/disables support for compressed fonts. If it's disabled, compressed + * glyphs cannot be processed by the library and won't be rendered. + */ +#define LV_USE_FONT_COMPRESSED 1 + +/* Enable subpixel rendering */ +#define LV_USE_FONT_SUBPX 1 +#if LV_USE_FONT_SUBPX +/* Set the pixel order of the display. + * Important only if "subpx fonts" are used. + * With "normal" font it doesn't matter. + */ +#define LV_FONT_SUBPX_BGR 0 +#endif + +/*Declare the type of the user data of fonts (can be e.g. `void *`, `int`, `struct`)*/ +typedef void * lv_font_user_data_t; + +/*================ + * THEME USAGE + *================*/ + +/*Always enable at least on theme*/ + +/* No theme, you can apply your styles as you need + * No flags. Set LV_THEME_DEFAULT_FLAG 0 */ +#define LV_USE_THEME_EMPTY 0 + +/*Simple to the create your theme based on it + * No flags. Set LV_THEME_DEFAULT_FLAG 0 */ +#define LV_USE_THEME_TEMPLATE 0 + +/* A fast and impressive theme. + * Flags: + * LV_THEME_MATERIAL_FLAG_LIGHT: light theme + * LV_THEME_MATERIAL_FLAG_DARK: dark theme + * LV_THEME_MATERIAL_FLAG_NO_TRANSITION: disable transitions (state change animations) + * LV_THEME_MATERIAL_FLAG_NO_FOCUS: disable indication of focused state) + * */ +#define LV_USE_THEME_MATERIAL 1 + +/* Mono-color theme for monochrome displays. + * If LV_THEME_DEFAULT_COLOR_PRIMARY is LV_COLOR_BLACK the + * texts and borders will be black and the background will be + * white. Else the colors are inverted. + * No flags. Set LV_THEME_DEFAULT_FLAG 0 */ +#define LV_USE_THEME_MONO 0 + +#define LV_THEME_DEFAULT_INCLUDE /*Include a header for the init. function*/ +#define LV_THEME_DEFAULT_INIT lv_theme_material_init +#define LV_THEME_DEFAULT_COLOR_PRIMARY lv_color_hex(0x01a2b1) +#define LV_THEME_DEFAULT_COLOR_SECONDARY lv_color_hex(0x44d1b6) +#define LV_THEME_DEFAULT_FLAG LV_THEME_MATERIAL_FLAG_DARK +#define LV_THEME_DEFAULT_FONT_SMALL &lv_font_montserrat_12 +#define LV_THEME_DEFAULT_FONT_NORMAL &lv_font_montserrat_12 +#define LV_THEME_DEFAULT_FONT_SUBTITLE &lv_font_montserrat_14 +#define LV_THEME_DEFAULT_FONT_TITLE &lv_font_montserrat_14 + +/*================= + * 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_BIDI_DIR_LTR` Left-to-Right + * `LV_BIDI_DIR_RTL` Right-to-Left + * `LV_BIDI_DIR_AUTO` detect texts base direction */ +#define LV_BIDI_BASE_DIR_DEF LV_BIDI_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 + +/*Change the built in (v)snprintf functions*/ +#define LV_SPRINTF_CUSTOM 0 +#if LV_SPRINTF_CUSTOM +# define LV_SPRINTF_INCLUDE +# define lv_snprintf snprintf +# define lv_vsnprintf vsnprintf +#else /*!LV_SPRINTF_CUSTOM*/ +# define LV_SPRINTF_DISABLE_FLOAT 1 +#endif /*LV_SPRINTF_CUSTOM*/ + +/*=================== + * LV_OBJ SETTINGS + *==================*/ + +#if LV_USE_USER_DATA +/*Declare the type of the user data of object (can be e.g. `void *`, `int`, `struct`)*/ +typedef void * lv_obj_user_data_t; +/*Provide a function to free user data*/ +#define LV_USE_USER_DATA_FREE 0 +#if LV_USE_USER_DATA_FREE +# define LV_USER_DATA_FREE_INCLUDE "something.h" /*Header for user data free function*/ +/* Function prototype : void user_data_free(lv_obj_t * obj); */ +# define LV_USER_DATA_FREE (user_data_free) /*Invoking for user data free function*/ +#endif +#endif + +/*1: enable `lv_obj_realign()` based on `lv_obj_align()` parameters*/ +#define LV_USE_OBJ_REALIGN 1 + +/* Enable to make the object clickable on a larger area. + * LV_EXT_CLICK_AREA_OFF or 0: Disable this feature + * LV_EXT_CLICK_AREA_TINY: The extra area can be adjusted horizontally and vertically (0..255 px) + * LV_EXT_CLICK_AREA_FULL: The extra area can be adjusted in all 4 directions (-32k..+32k px) + */ +#define LV_USE_EXT_CLICK_AREA LV_EXT_CLICK_AREA_TINY + +/*================== + * LV OBJ X USAGE + *================*/ +/* + * Documentation of the object types: https://docs.lvgl.com/#Object-types + */ + +/*Arc (dependencies: -)*/ +#define LV_USE_ARC 1 + +/*Bar (dependencies: -)*/ +#define LV_USE_BAR 1 + +/*Button (dependencies: lv_cont*/ +#define LV_USE_BTN 1 + +/*Button matrix (dependencies: -)*/ +#define LV_USE_BTNMATRIX 1 + +/*Calendar (dependencies: -)*/ +#define LV_USE_CALENDAR 1 +#if LV_USE_CALENDAR +# define LV_CALENDAR_WEEK_STARTS_MONDAY 0 +#endif + +/*Canvas (dependencies: lv_img)*/ +#define LV_USE_CANVAS 1 + +/*Check box (dependencies: lv_btn, lv_label)*/ +#define LV_USE_CHECKBOX 1 + +/*Chart (dependencies: -)*/ +#define LV_USE_CHART 1 +#if LV_USE_CHART +# define LV_CHART_AXIS_TICK_LABEL_MAX_LEN 256 +#endif + +/*Container (dependencies: -*/ +#define LV_USE_CONT 1 + +/*Color picker (dependencies: -*/ +#define LV_USE_CPICKER 1 + +/*Drop down list (dependencies: lv_page, lv_label, lv_symbol_def.h)*/ +#define LV_USE_DROPDOWN 1 +#if LV_USE_DROPDOWN != 0 +/*Open and close default animation time [ms] (0: no animation)*/ +# define LV_DROPDOWN_DEF_ANIM_TIME 200 +#endif + +/*Gauge (dependencies:lv_bar, lv_linemeter)*/ +#define LV_USE_GAUGE 1 + +/*Image (dependencies: lv_label*/ +#define LV_USE_IMG 1 + +/*Image Button (dependencies: lv_btn*/ +#define LV_USE_IMGBTN 1 +#if LV_USE_IMGBTN +/*1: The imgbtn requires left, mid and right parts and the width can be set freely*/ +# define LV_IMGBTN_TILED 0 +#endif + +/*Keyboard (dependencies: lv_btnm)*/ +#define LV_USE_KEYBOARD 1 + +/*Label (dependencies: -*/ +#define LV_USE_LABEL 1 +#if LV_USE_LABEL != 0 +/*Hor, or ver. scroll speed [px/sec] in 'LV_LABEL_LONG_ROLL/ROLL_CIRC' mode*/ +# define LV_LABEL_DEF_SCROLL_SPEED 25 + +/* Waiting period at beginning/end of animation cycle */ +# define LV_LABEL_WAIT_CHAR_COUNT 3 + +/*Enable selecting text of the label */ +# define LV_LABEL_TEXT_SEL 0 + +/*Store extra some info in labels (12 bytes) to speed up drawing of very long texts*/ +# define LV_LABEL_LONG_TXT_HINT 0 +#endif + +/*LED (dependencies: -)*/ +#define LV_USE_LED 1 +#if LV_USE_LED +# define LV_LED_BRIGHT_MIN 120 /*Minimal brightness*/ +# define LV_LED_BRIGHT_MAX 255 /*Maximal brightness*/ +#endif + +/*Line (dependencies: -*/ +#define LV_USE_LINE 1 + +/*List (dependencies: lv_page, lv_btn, lv_label, (lv_img optionally for icons ))*/ +#define LV_USE_LIST 1 +#if LV_USE_LIST != 0 +/*Default animation time of focusing to a list element [ms] (0: no animation) */ +# define LV_LIST_DEF_ANIM_TIME 100 +#endif + +/*Line meter (dependencies: *;)*/ +#define LV_USE_LINEMETER 1 +#if LV_USE_LINEMETER +/* Draw line more precisely at cost of performance. + * Useful if there are lot of lines any minor are visible + * 0: No extra precision + * 1: Some extra precision + * 2: Best precision + */ +# define LV_LINEMETER_PRECISE 1 +#endif + +/*Mask (dependencies: -)*/ +#define LV_USE_OBJMASK 1 + +/*Message box (dependencies: lv_rect, lv_btnm, lv_label)*/ +#define LV_USE_MSGBOX 1 + +/*Page (dependencies: lv_cont)*/ +#define LV_USE_PAGE 1 +#if LV_USE_PAGE != 0 +/*Focus default animation time [ms] (0: no animation)*/ +# define LV_PAGE_DEF_ANIM_TIME 400 +#endif + +/*Preload (dependencies: lv_arc, lv_anim)*/ +#define LV_USE_SPINNER 1 +#if LV_USE_SPINNER != 0 +# define LV_SPINNER_DEF_ARC_LENGTH 60 /*[deg]*/ +# define LV_SPINNER_DEF_SPIN_TIME 1000 /*[ms]*/ +# define LV_SPINNER_DEF_ANIM LV_SPINNER_TYPE_SPINNING_ARC +#endif + +/*Roller (dependencies: lv_ddlist)*/ +#define LV_USE_ROLLER 1 +#if LV_USE_ROLLER != 0 +/*Focus animation time [ms] (0: no animation)*/ +# define LV_ROLLER_DEF_ANIM_TIME 200 + +/*Number of extra "pages" when the roller is infinite*/ +# define LV_ROLLER_INF_PAGES 7 +#endif + +/*Slider (dependencies: lv_bar)*/ +#define LV_USE_SLIDER 1 + +/*Spinbox (dependencies: lv_ta)*/ +#define LV_USE_SPINBOX 1 + +/*Switch (dependencies: lv_slider)*/ +#define LV_USE_SWITCH 1 + +/*Text area (dependencies: lv_label, lv_page)*/ +#define LV_USE_TEXTAREA 1 +#if LV_USE_TEXTAREA != 0 +# define LV_TEXTAREA_DEF_CURSOR_BLINK_TIME 400 /*ms*/ +# define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +/*Table (dependencies: lv_label)*/ +#define LV_USE_TABLE 1 +#if LV_USE_TABLE +# define LV_TABLE_COL_MAX 12 +# define LV_TABLE_CELL_STYLE_CNT 4 +#endif + + +/*Tab (dependencies: lv_page, lv_btnm)*/ +#define LV_USE_TABVIEW 1 +# if LV_USE_TABVIEW != 0 +/*Time of slide animation [ms] (0: no animation)*/ +# define LV_TABVIEW_DEF_ANIM_TIME 300 +#endif + +/*Tileview (dependencies: lv_page) */ +#define LV_USE_TILEVIEW 1 +#if LV_USE_TILEVIEW +/*Time of slide animation [ms] (0: no animation)*/ +# define LV_TILEVIEW_DEF_ANIM_TIME 300 +#endif + +/*Window (dependencies: lv_cont, lv_btn, lv_label, lv_img, lv_page)*/ +#define LV_USE_WIN 1 + +/*================== + * Non-user section + *==================*/ + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) /* Disable warnings for Visual Studio*/ +# define _CRT_SECURE_NO_WARNINGS +#endif + +/*--END OF LV_CONF_H--*/ + +#endif /*LV_CONF_H*/ \ No newline at end of file diff --git a/src/lv_settings/lv_settings.c b/src/lv_settings/lv_settings.c new file mode 100644 index 0000000..d5b725d --- /dev/null +++ b/src/lv_settings/lv_settings.c @@ -0,0 +1,1167 @@ +īģŋ/** + * @file lv_settings.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_settings.h" + +/********************* + * DEFINES + *********************/ +#define LV_SETTINGS_ANIM_TIME 300 /*[ms]*/ +#define LV_SETTINGS_MAX_WIDTH 250 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct +{ + lv_btn_ext_t btn; + lv_settings_item_t * item; + lv_event_cb_t event_cb; +}root_ext_t; + +typedef struct +{ + lv_btn_ext_t btn; + lv_settings_item_t * item; +}list_btn_ext_t; + +typedef struct +{ + lv_cont_ext_t cont; + lv_settings_item_t * item; +}item_cont_ext_t; + +typedef struct +{ + lv_cont_ext_t cont; + lv_event_cb_t event_cb; + lv_obj_t * menu_page; +}menu_cont_ext_t; + +typedef struct { + lv_event_cb_t event_cb; + lv_settings_item_t * item; +}histroy_t; + + +/********************** + * STATIC PROTOTYPES + **********************/ +static void create_page(lv_settings_item_t * parent_item, lv_event_cb_t event_cb); + +static void add_list_btn(lv_obj_t * page, lv_settings_item_t * item); +static void add_btn(lv_obj_t * page, lv_settings_item_t * item); +static void add_sw(lv_obj_t * page, lv_settings_item_t * item); +static void add_ddlist(lv_obj_t * page, lv_settings_item_t * item); +static void add_numset(lv_obj_t * page, lv_settings_item_t * item); +static void add_slider(lv_obj_t * page, lv_settings_item_t * item); +static void add_edit(lv_obj_t* page, lv_settings_item_t* item); + +static void refr_list_btn(lv_settings_item_t * item); +static void refr_btn(lv_settings_item_t * item); +static void refr_sw(lv_settings_item_t * item); +static void refr_ddlist(lv_settings_item_t * item); +static void refr_numset(lv_settings_item_t * item); +static void refr_slider(lv_settings_item_t * item); +static void refr_edit(lv_settings_item_t* item); + +static void root_event_cb(lv_obj_t * btn, lv_event_t e); +static void list_btn_event_cb(lv_obj_t * btn, lv_event_t e); +static void slider_event_cb(lv_obj_t * slider, lv_event_t e); +static void sw_event_cb(lv_obj_t * sw, lv_event_t e); +static void btn_event_cb(lv_obj_t * btn, lv_event_t e); +static void ddlist_event_cb(lv_obj_t * ddlist, lv_event_t e); +static void edit_event_cb(lv_obj_t* ddlist, lv_event_t e); +static void numset_event_cb(lv_obj_t * btn, lv_event_t e); + +static void header_back_event_cb(lv_obj_t * btn, lv_event_t e); +static lv_obj_t * item_cont_create(lv_obj_t * page, lv_settings_item_t * item); +static void old_cont_del_cb(lv_anim_t * a); +static void remove_children_from_group(lv_obj_t * obj); + +static void add_style_to_item(lv_obj_t * obj); +static void add_style_to_btn(lv_obj_t* obj); +static void kb_delete(); + +/********************** + * STATIC VARIABLES + **********************/ +static lv_obj_t * act_cont; +static lv_obj_t * menu_btn; +static lv_style_t style_menu_bg; +static lv_style_t style_bg; +static lv_style_t style_item_cont; +static lv_style_t lv_style_transp_fit; +static lv_style_t lv_style_transp_tight; +static lv_style_t lv_style_tight; +static lv_style_t style_value; +static lv_ll_t history_ll; +static lv_group_t * group; +static lv_obj_t* parent=NULL; +static lv_coord_t settings_max_width = LV_SETTINGS_MAX_WIDTH; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Create a settings application + * @param root_item descriptor of the settings button. For example: + * `lv_settings_menu_item_t root_item = {.name = "Settings", .event_cb = root_event_cb};` + * @return the created settings button + */ +lv_obj_t * lv_settings_create(lv_settings_item_t * root_item, lv_event_cb_t event_cb) +{ + if (!parent) + parent = lv_scr_act(); + lv_style_init(&style_value); + lv_style_set_text_color(&style_value, LV_STATE_DEFAULT, lv_theme_get_color_secondary()); + + lv_style_init(&style_menu_bg); + lv_style_init(&style_item_cont); + lv_style_init(&style_bg); + lv_style_init(&lv_style_transp_fit); + lv_style_init(&lv_style_transp_tight); + lv_style_init(&lv_style_tight); + lv_style_reset(&lv_style_transp_fit); + lv_style_set_bg_opa(&lv_style_transp_fit, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_pad_hor(&lv_style_transp_fit,LV_STATE_DEFAULT,0); + lv_style_set_pad_ver(&lv_style_transp_fit,LV_STATE_DEFAULT,0); + + lv_style_copy(&lv_style_transp_tight,&lv_style_transp_fit); + lv_style_set_pad_inner(&lv_style_transp_tight,LV_STATE_DEFAULT,0); + + lv_style_set_pad_inner(&lv_style_tight, LV_STATE_DEFAULT, 0); + + lv_style_copy(&style_bg, &lv_style_transp_tight); + lv_style_set_border_width(&style_bg, LV_STATE_DEFAULT, 0); + + lv_style_set_radius(&style_menu_bg,LV_STATE_DEFAULT,0); + lv_style_set_border_width(&style_menu_bg, LV_STATE_DEFAULT, 0); + + lv_style_set_pad_left(&style_item_cont,LV_STATE_DEFAULT,LV_DPI / 10); + lv_style_set_pad_right(&style_item_cont,LV_STATE_DEFAULT,LV_DPI / 10); + lv_style_set_pad_top(&style_item_cont,LV_STATE_DEFAULT,LV_DPI / 10); + lv_style_set_pad_bottom(&style_item_cont,LV_STATE_DEFAULT,LV_DPI / 10); + lv_style_set_pad_inner(&style_item_cont,LV_STATE_DEFAULT,LV_DPI / 20); + lv_style_set_margin_all(&style_item_cont, LV_STATE_DEFAULT, 0); + +// lv_theme_t *th = lv_theme_get_current(); +// if(th) { +// lv_style_copy(&style_menu_bg, th->style.cont); +// lv_style_copy(&style_item_cont, th->style.list.btn.rel); +// } else { +// lv_style_copy(&style_menu_bg, &lv_style_pretty); +// lv_style_copy(&style_item_cont, &lv_style_transp); +// } +// +// lv_style_copy(&style_bg, &lv_style_transp_tight); +// style_menu_bg.body.radius = 0; +// +// style_item_cont.body.padding.left = LV_DPI / 5; +// style_item_cont.body.padding.right = LV_DPI / 5; +// style_item_cont.body.padding.top = LV_DPI / 10; +// style_item_cont.body.padding.bottom = LV_DPI / 10; +// style_item_cont.body.padding.inner = LV_DPI / 20; + + + menu_btn = lv_btn_create(parent, NULL); + lv_btn_set_fit(menu_btn, LV_FIT_TIGHT); + root_ext_t * ext = lv_obj_allocate_ext_attr(menu_btn, sizeof(root_ext_t)); + ext->item = root_item; + ext->event_cb = event_cb; + + lv_obj_set_event_cb(menu_btn, root_event_cb); + if(group) lv_group_add_obj(group, menu_btn); + + lv_obj_t * menu_label = lv_label_create(menu_btn, NULL); + lv_label_set_text(menu_label, LV_SYMBOL_LIST); + + lv_obj_set_pos(menu_btn, 0, 0); + + _lv_ll_init(&history_ll, sizeof(histroy_t)); + + return menu_btn; +} + +/** + * Automatically add the item to a group to allow navigation with keypad or encoder. + * Should be called before `lv_settings_create` + * The group can be change at any time. + * @param g the group to use. `NULL` to not use this feature. + */ +void lv_settings_set_group(lv_group_t * g) +{ + group = g; +} + +void lv_settings_set_parent(lv_obj_t* p) +{ + parent = p; +} + +/** + * Change the maximum width of settings dialog object + * @param max_width maximum width of the settings container page + */ +void lv_settings_set_max_width(lv_coord_t max_width) +{ + settings_max_width = max_width; +} + +/** + * Create a new page ask `event_cb` to add the item with `LV_EVENT_REFRESH` + * @param parent_item pointer to an item which open the the new page. Its `name` will be the title + * @param event_cb event handler of the menu page + */ +void lv_settings_open_page(lv_settings_item_t * parent_item, lv_event_cb_t event_cb) +{ + /*Create a new page in the menu*/ + create_page(parent_item, event_cb); + + /*Add the items*/ + lv_event_send_func(event_cb, NULL, LV_EVENT_REFRESH, parent_item); +} + +/** + * Add a list element to the page. With `item->name` and `item->value` texts. + * @param item pointer to a an `lv_settings_item_t` item. + */ +void lv_settings_add(lv_settings_item_t * item) +{ + if(act_cont == NULL) return; + + menu_cont_ext_t * ext = lv_obj_get_ext_attr(act_cont); + lv_obj_t * page = ext->menu_page; + + + switch(item->type) { + case LV_SETTINGS_TYPE_LIST_BTN: add_list_btn(page, item); break; + case LV_SETTINGS_TYPE_BTN: add_btn(page, item); break; + case LV_SETTINGS_TYPE_SLIDER: add_slider(page, item); break; + case LV_SETTINGS_TYPE_SW: add_sw(page, item); break; + case LV_SETTINGS_TYPE_DDLIST: add_ddlist(page, item); break; + case LV_SETTINGS_TYPE_NUMSET: add_numset(page, item); break; + case LV_SETTINGS_TYPE_EDIT: add_edit(page, item); break; + default: break; + } +} + +/** + * Refresh an item's name value and state. + * @param item pointer to a an `lv_settings_item _t` item. + */ +void lv_settings_refr(lv_settings_item_t * item) +{ + /*Return if there is nothing to refresh*/ + if(item->cont == NULL) return; + + switch(item->type) { + case LV_SETTINGS_TYPE_LIST_BTN: refr_list_btn(item); break; + case LV_SETTINGS_TYPE_BTN: refr_btn(item); break; + case LV_SETTINGS_TYPE_SLIDER: refr_slider(item); break; + case LV_SETTINGS_TYPE_SW: refr_sw(item); break; + case LV_SETTINGS_TYPE_DDLIST: refr_ddlist(item); break; + case LV_SETTINGS_TYPE_NUMSET: refr_numset(item); break; + case LV_SETTINGS_TYPE_EDIT: refr_edit(item); break; + default: break; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Create a new settings container with header, hack button ,title and an empty page + * @param item pointer to a an `lv_settings_item_t` item. + * `item->name` will be the title of the page. + * `LV_EVENT_REFRESH` will be sent to `item->event_cb` to create the page again when the back button is pressed. + */ +static void create_page(lv_settings_item_t * parent_item, lv_event_cb_t event_cb) +{ + kb_delete(); + lv_coord_t w = LV_MATH_MIN(lv_obj_get_width(parent), settings_max_width); + + if(group) { + if(act_cont) { + remove_children_from_group(act_cont); + } else { + lv_group_remove_obj(menu_btn); + } + } + + lv_obj_t * old_menu_cont = act_cont; + + act_cont = lv_cont_create(parent, NULL); + lv_obj_add_style(act_cont,LV_CONT_PART_MAIN, &style_menu_bg); + lv_obj_set_size(act_cont, w, lv_obj_get_height(parent)); + + menu_cont_ext_t * ext = lv_obj_allocate_ext_attr(act_cont, sizeof(menu_cont_ext_t)); + ext->event_cb = event_cb; + ext->menu_page = NULL; + + lv_obj_t * header = lv_cont_create(act_cont, NULL); + lv_obj_add_style(header,LV_CONT_PART_MAIN, &style_menu_bg); + lv_cont_set_fit2(header, LV_FIT_NONE, LV_FIT_TIGHT); + lv_obj_set_width(header, lv_obj_get_width(act_cont)); +/* + lv_obj_t * header_back_btn = lv_btn_create(header, NULL); + lv_btn_set_fit(header_back_btn, LV_FIT_TIGHT); + lv_obj_set_event_cb(header_back_btn, header_back_event_cb); + if(group) lv_group_add_obj(group, header_back_btn); + lv_group_focus_obj(header_back_btn); + + add_style_to_btn(header_back_btn); + + lv_obj_t * header_back_label = lv_label_create(header_back_btn, NULL); +*/ + lv_obj_t * header_title = lv_label_create(header, NULL); + lv_label_set_text(header_title, parent_item->name); + + bool menu_btn_right = lv_obj_get_x(menu_btn) >= lv_obj_get_width(parent)/2; + + if(!menu_btn_right) { + //lv_cont_set_layout(header, LV_LAYOUT_ROW_MID); + lv_obj_align(header_title, NULL, LV_ALIGN_CENTER, LV_DPI / 20, 0); +// lv_label_set_text(header_back_label, LV_SYMBOL_LEFT); + } else { + lv_obj_align(header_title, NULL, LV_ALIGN_CENTER, LV_DPI / 20, 0); +// lv_label_set_text(header_back_label, LV_SYMBOL_RIGHT); +// lv_obj_align(header_back_btn, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 0); +// lv_obj_align(header_title, header_back_btn, LV_ALIGN_OUT_LEFT_MID, LV_DPI / 20, 0); + } + + lv_obj_set_pos(header, 0, 0); + + lv_obj_t * page = lv_page_create(act_cont, NULL); + lv_obj_add_style(page,LV_PAGE_PART_BG,&style_bg); + lv_obj_add_style(page,LV_PAGE_PART_SCROLLBAR,&lv_style_transp_tight); + lv_obj_add_style(page, LV_PAGE_PART_SCROLLABLE, &lv_style_tight); + lv_obj_add_style(page, LV_CONT_PART_MAIN, &lv_style_tight); + lv_page_set_scrl_layout(page, LV_LAYOUT_COLUMN_MID); + lv_list_set_edge_flash(page, true); + lv_obj_set_size(page, lv_obj_get_width(act_cont), lv_obj_get_height(parent) - lv_obj_get_height(header)); + lv_obj_align(page, header, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); + + ext->menu_page = page; + + histroy_t * new_node = _lv_ll_ins_head(&history_ll); + new_node->event_cb = event_cb; + new_node->item = parent_item; + + /*Delete the old menu container after some time*/ + if(old_menu_cont) { + lv_anim_path_t path; + lv_anim_path_init(&path); + lv_anim_path_set_cb(&path, lv_anim_path_step); + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, old_menu_cont); + lv_anim_set_values(&a, 0, 1); + lv_anim_set_path(&a, &path); + lv_anim_set_time(&a, LV_SETTINGS_ANIM_TIME); + lv_anim_set_ready_cb(&a, old_cont_del_cb); + lv_anim_start(&a); + } + + /*Float in the new menu*/ + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, act_cont); + lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_x); + lv_coord_t w_cont = lv_obj_get_width(act_cont); + lv_coord_t w_scr = lv_obj_get_width(parent); + uint32_t start = !menu_btn_right ? -w_cont : w_scr; + uint32_t end = !menu_btn_right ? 0 : w_scr-w_cont; + lv_anim_set_values(&a, start, end); + lv_anim_set_time(&a, LV_SETTINGS_ANIM_TIME); + lv_anim_start(&a); +} + +/** + * Add a list element to the page. With `item->name` and `item->value` texts. + * @param page pointer to a menu page created by `lv_settings_create_page` + * @param item pointer to a an `lv_settings_item_t` item. + */ +static void add_list_btn(lv_obj_t * page, lv_settings_item_t * item) +{ + lv_obj_t * liste = lv_btn_create(page, NULL); + lv_btn_set_layout(liste, LV_LAYOUT_COLUMN_LEFT); + lv_btn_set_fit2(liste, LV_FIT_PARENT, LV_FIT_TIGHT); + lv_page_glue_obj(liste, true); + lv_obj_set_event_cb(liste, list_btn_event_cb); + if(group) lv_group_add_obj(group, liste); + + list_btn_ext_t * ext = lv_obj_allocate_ext_attr(liste, sizeof(list_btn_ext_t)); + ext->item = item; + ext->item->cont = liste; + + lv_obj_t * name = lv_label_create(liste, NULL); + lv_label_set_text(name, item->name); + + lv_obj_t * value = lv_label_create(liste, NULL); + lv_label_set_text(value, item->value); + lv_obj_add_style(value, LV_LABEL_PART_MAIN, &style_value); + add_style_to_item(liste); + +// lv_theme_t * th = lv_theme_get_current(); +// if(th) { +// th->apply_cb(th,liste,LV_THEME_BTN); +// lv_btn_set_style(liste, LV_BTN_STYLE_REL, th->style.list.btn.rel); +// lv_btn_set_style(liste, LV_BTN_STYLE_PR, th->style.list.btn.pr); +// lv_label_set_style(value, LV_LABEL_STYLE_MAIN, th->style.label.hint); +// } +} + + +/** + * Create a button. Write `item->name` on create a button on the right with `item->value` text. + * @param page pointer to a menu page created by `lv_settings_create_page` + * @param item pointer to a an `lv_settings_item_t` item. + */ +static void add_btn(lv_obj_t * page, lv_settings_item_t * item) +{ + lv_obj_t * cont = item_cont_create(page, item); + + lv_obj_t * name = lv_label_create(cont, NULL); + lv_label_set_text(name, item->name); + + lv_obj_t * btn = lv_btn_create(cont, NULL); + lv_btn_set_fit(btn, LV_FIT_TIGHT); + lv_obj_set_event_cb(btn, btn_event_cb); + if(group) lv_group_add_obj(group, btn); + + lv_obj_t * value = lv_label_create(btn, NULL); + lv_label_set_text(value, item->value); + + add_style_to_btn(btn); + + lv_obj_align(btn, NULL, LV_ALIGN_IN_RIGHT_MID, -LV_DPI/10, 0); + lv_obj_align(name, NULL, LV_ALIGN_IN_LEFT_MID, LV_DPI/10, 0); +} + +/** + * Create a switch with `item->name` text. The state is set from `item->state`. + * @param page pointer to a menu page created by `lv_settings_create_page` + * @param item pointer to a an `lv_settings_item_t` item. + */ +static void add_sw(lv_obj_t * page, lv_settings_item_t * item) +{ + lv_obj_t * cont = item_cont_create(page, item); + + lv_obj_t * name = lv_label_create(cont, NULL); + lv_label_set_text(name, item->name); + + lv_obj_t * value = lv_label_create(cont, NULL); + lv_label_set_text(value, item->value); + lv_obj_add_style(value, LV_LABEL_PART_MAIN, &style_value); +// lv_theme_t * th = lv_theme_get_current(); +// if(th) { +// lv_label_set_style(value, LV_LABEL_STYLE_MAIN, th->style.label.hint); +// } + + + lv_obj_t * sw = lv_switch_create(cont, NULL); + lv_obj_set_event_cb(sw, sw_event_cb); + //lv_obj_set_size(sw, LV_DPI / 2, LV_DPI / 4); + lv_obj_set_size(sw, LV_DPI, LV_DPI/2); + if(item->state) lv_switch_on(sw, LV_ANIM_OFF); + if(group) lv_group_add_obj(group, sw); + + lv_obj_align(name, NULL, LV_ALIGN_IN_TOP_LEFT, LV_DPI/10, LV_DPI/10); + lv_obj_align(value, name, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI/10); + lv_obj_align(sw, NULL, LV_ALIGN_IN_RIGHT_MID, -LV_DPI/10, 0); +} + +/** + * Create a drop down list with `item->name` title and `item->value` options. The `item->state` option will be selected. + * @param page pointer to a menu page created by `lv_settings_create_page` + * @param item pointer to a an `lv_settings_item_t` item. + */ +static void add_ddlist(lv_obj_t * page, lv_settings_item_t * item) +{ + lv_obj_t * cont = item_cont_create(page, item); + + lv_obj_t * label = lv_label_create(cont, NULL); + lv_label_set_text(label, item->name); + lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_LEFT, LV_DPI/10,LV_DPI/10); + + + lv_obj_t * ddlist = lv_dropdown_create(cont, NULL); + lv_dropdown_set_options(ddlist, item->value); + lv_dropdown_set_draw_arrow(ddlist, true); + lv_dropdown_set_max_height(ddlist, lv_obj_get_height(page) / 2); + lv_obj_set_width(ddlist, lv_obj_get_width_fit(cont)); + lv_obj_align(ddlist, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI/10); + lv_obj_set_event_cb(ddlist, ddlist_event_cb); + lv_dropdown_set_selected(ddlist, item->state); + if(group) lv_group_add_obj(group, ddlist); +} + +static void add_edit(lv_obj_t* page, lv_settings_item_t* item) +{ + lv_obj_t* cont = item_cont_create(page, item); + + lv_obj_t* label = lv_label_create(cont, NULL); + lv_label_set_text(label, item->name); + lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_LEFT, LV_DPI / 10, LV_DPI / 10); + + + lv_obj_t* edit = lv_textarea_create(cont, NULL); + lv_textarea_set_text(edit, item->value); + lv_textarea_set_one_line(edit, true); + if(item->param2&&LV_SETTINGS_EDIT_PWD) + { + lv_textarea_set_pwd_mode(edit,true); + } + lv_obj_set_width(edit, lv_obj_get_width_fit(cont)); + lv_obj_align(edit, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 10); + lv_obj_set_event_cb(edit, edit_event_cb); + if (group) lv_group_add_obj(group, edit); +} + +/** + * Create a drop down list with `item->name` title and `item->value` options. The `item->state` option will be selected. + * @param page pointer to a menu page created by `lv_settings_create_page` + * @param item pointer to a an `lv_settings_item_t` item. + */ +static void add_numset(lv_obj_t * page, lv_settings_item_t * item) +{ + lv_obj_t * cont = item_cont_create(page, item); + lv_cont_set_layout(cont, LV_LAYOUT_PRETTY_TOP); + + lv_obj_t * label = lv_label_create(cont, NULL); + lv_label_set_text(label, item->name); + lv_obj_add_protect(label, LV_PROTECT_FOLLOW); + + + lv_obj_t * btn_dec = lv_btn_create(cont, NULL); + lv_obj_set_size(btn_dec, LV_DPI / 2, LV_DPI / 2); + lv_obj_set_event_cb(btn_dec, numset_event_cb); + if(group) lv_group_add_obj(group, btn_dec); + + label = lv_label_create(btn_dec, NULL); + lv_label_set_text(label, LV_SYMBOL_MINUS); + + add_style_to_btn(btn_dec); + + label = lv_label_create(cont, NULL); + lv_label_set_text(label, item->value); + + lv_obj_t * btn_inc = lv_btn_create(cont, btn_dec); + lv_obj_set_size(btn_inc, LV_DPI / 2, LV_DPI / 2); + if(group) lv_group_add_obj(group, btn_inc); + + add_style_to_btn(btn_inc); + + label = lv_label_create(btn_inc, NULL); + lv_label_set_text(label, LV_SYMBOL_PLUS); +} + +/** + * Create a slider with 0..255 range. Write `item->name` and `item->value` on top of the slider. The current value is loaded from `item->state` + * @param page pointer to a menu page created by `lv_settings_create_page` + * @param item pointer to a an `lv_settings_item_t` item. + */ +static void add_slider(lv_obj_t * page, lv_settings_item_t * item) +{ + lv_obj_t * cont = item_cont_create(page, item); + + lv_obj_t * name = lv_label_create(cont, NULL); + lv_label_set_text(name, item->name); + + lv_obj_t * value = lv_label_create(cont, NULL); + lv_label_set_text(value, item->value); + lv_obj_set_auto_realign(value, true); + + lv_obj_align(name, NULL, LV_ALIGN_IN_TOP_LEFT, LV_DPI/8, LV_DPI/8); + lv_obj_align(value, NULL, LV_ALIGN_IN_TOP_RIGHT, -LV_DPI/8, LV_DPI/8); + lv_obj_t * slider = lv_slider_create(cont, NULL); + lv_obj_set_size(slider, lv_obj_get_width_fit(cont), LV_DPI / 4); + lv_obj_align(slider, NULL, LV_ALIGN_IN_TOP_MID, 0, lv_obj_get_y(name) + + lv_obj_get_height(name) + + LV_DPI/10); + lv_obj_set_event_cb(slider, slider_event_cb); + lv_slider_set_range(slider, 0, 255); + lv_slider_set_value(slider, item->state, LV_ANIM_OFF); + lv_obj_set_height(slider, LV_DPI / 20); + if(group) lv_group_add_obj(group, slider); +} + +static void refr_list_btn(lv_settings_item_t * item) +{ + lv_obj_t * name = lv_obj_get_child(item->cont, NULL); + lv_obj_t * value = lv_obj_get_child(item->cont, name); + + lv_label_set_text(name, item->name); + lv_label_set_text(value, item->value); +} + +static void refr_btn(lv_settings_item_t * item) +{ + lv_obj_t * btn = lv_obj_get_child(item->cont, NULL); + lv_obj_t * name = lv_obj_get_child(item->cont, btn); + lv_obj_t * value = lv_obj_get_child(btn, NULL); + + lv_label_set_text(name, item->name); + lv_label_set_text(value, item->value); +} + + +static void refr_sw(lv_settings_item_t * item) +{ + lv_obj_t * sw = lv_obj_get_child(item->cont, NULL); + lv_obj_t * value = lv_obj_get_child(item->cont, sw); + lv_obj_t * name = lv_obj_get_child(item->cont, value); + + lv_label_set_text(name, item->name); + lv_label_set_text(value, item->value); + + bool tmp_state = lv_switch_get_state(sw) ? true : false; + if(tmp_state != item->state) { + if(tmp_state == false) lv_switch_off(sw, LV_ANIM_OFF); + else lv_switch_on(sw, LV_ANIM_OFF); + } +} + +static void refr_ddlist(lv_settings_item_t * item) +{ + lv_obj_t * name = lv_obj_get_child(item->cont, NULL); + lv_obj_t * ddlist = lv_obj_get_child(item->cont, name); + + lv_label_set_text(name, item->name); + + lv_dropdown_set_options(ddlist, item->value); + + lv_dropdown_set_selected(ddlist, item->state); +} + +static void refr_edit(lv_settings_item_t* item) +{ + lv_obj_t* edit = lv_obj_get_child(item->cont, NULL); + lv_obj_t* name = lv_obj_get_child(item->cont, edit); + + lv_label_set_text(name, item->name); + + lv_textarea_set_text(edit, item->value); +} + +static void refr_numset(lv_settings_item_t * item) +{ + lv_obj_t * name = lv_obj_get_child_back(item->cont, NULL); + lv_obj_t * value = lv_obj_get_child_back(item->cont, name); /*It's the minus button*/ + value = lv_obj_get_child_back(item->cont, value); + + lv_label_set_text(name, item->name); + lv_label_set_text(value, item->value); +} + +static void refr_slider(lv_settings_item_t * item) +{ + lv_obj_t * slider = lv_obj_get_child(item->cont, NULL); + lv_obj_t * value = lv_obj_get_child(item->cont, slider); + lv_obj_t * name = lv_obj_get_child(item->cont, value); + + lv_label_set_text(name, item->name); + lv_label_set_text(value, item->value); + + if(lv_slider_get_value(slider) != item->state) lv_slider_set_value(slider, item->state, LV_ANIM_OFF); +} + +static void root_event_cb(lv_obj_t * btn, lv_event_t e) +{ + + if(e == LV_EVENT_CLICKED) { + root_ext_t * ext = lv_obj_get_ext_attr(btn); + + /*Call the button's event handler to create the menu*/ + lv_event_send_func(ext->event_cb, NULL, e, ext->item); + } +} + +/** + * List button event callback. The following events are sent: + * - `LV_EVENT_CLICKED` + * - `LV_EEVNT_SHORT_CLICKED` + * - `LV_EEVNT_LONG_PRESSED` + * @param btn pointer to the back button + * @param e the event + */ +static void list_btn_event_cb(lv_obj_t * btn, lv_event_t e) +{ + /*Save the menu item because the button will be deleted in `menu_cont_create` and `ext` will be invalid */ + list_btn_ext_t * item_ext = lv_obj_get_ext_attr(btn); + + if(e == LV_EVENT_CLICKED || + e == LV_EVENT_SHORT_CLICKED || + e == LV_EVENT_LONG_PRESSED) { + menu_cont_ext_t * menu_ext = lv_obj_get_ext_attr(act_cont); + + /*Call the button's event handler to create the menu*/ + lv_event_send_func(menu_ext->event_cb, NULL, e, item_ext->item); + } + else if(e == LV_EVENT_DELETE) { + item_ext->item->cont = NULL; + } + else if (e ==LV_EVENT_FOCUSED) { + menu_cont_ext_t * ext = lv_obj_get_ext_attr(act_cont); + lv_obj_t * page = ext->menu_page; + lv_page_focus(page, btn, LV_ANIM_ON); + } +} + +/** + * Slider event callback. Call the item's `event_cb` with `LV_EVENT_VALUE_CHANGED`, + * save the state and refresh the value label. + * @param slider pointer to the slider + * @param e the event + */ +static void slider_event_cb(lv_obj_t * slider, lv_event_t e) +{ + lv_obj_t * cont = lv_obj_get_parent(slider); + item_cont_ext_t * item_ext = lv_obj_get_ext_attr(cont); + + if(e == LV_EVENT_VALUE_CHANGED) { + item_ext->item->state = lv_slider_get_value(slider); + menu_cont_ext_t * menu_ext = lv_obj_get_ext_attr(act_cont); + + /*Call the button's event handler to create the menu*/ + lv_event_send_func(menu_ext->event_cb, NULL, e, item_ext->item); + } + else if(e == LV_EVENT_DELETE) { + item_ext->item->cont = NULL; + } + else if (e ==LV_EVENT_FOCUSED) { + menu_cont_ext_t * ext = lv_obj_get_ext_attr(act_cont); + lv_obj_t * page = ext->menu_page; + lv_page_focus(page, lv_obj_get_parent(slider), LV_ANIM_ON); + } +} + +/** + * Switch event callback. Call the item's `event_cb` with `LV_EVENT_VALUE_CHANGED` and save the state. + * @param sw pointer to the switch + * @param e the event + */ +static void sw_event_cb(lv_obj_t * sw, lv_event_t e) +{ + lv_obj_t * cont = lv_obj_get_parent(sw); + item_cont_ext_t * item_ext = lv_obj_get_ext_attr(cont); + + if(e == LV_EVENT_VALUE_CHANGED) { + + item_ext->item->state = lv_switch_get_state(sw); + menu_cont_ext_t * menu_ext = lv_obj_get_ext_attr(act_cont); + + /*Call the button's event handler to create the menu*/ + lv_event_send_func(menu_ext->event_cb, NULL, e, item_ext->item); + } + else if(e == LV_EVENT_DELETE) { + item_ext->item->cont = NULL; + } + else if (e ==LV_EVENT_FOCUSED) { + menu_cont_ext_t * ext = lv_obj_get_ext_attr(act_cont); + lv_obj_t * page = ext->menu_page; + lv_page_focus(page, lv_obj_get_parent(sw), LV_ANIM_ON); + } +} + +/** + * Button event callback. Call the item's `event_cb` with `LV_EVENT_VALUE_CHANGED` when clicked. + * @param obj pointer to the switch or the container in case of `LV_EVENT_REFRESH` + * @param e the event + */ +static void btn_event_cb(lv_obj_t * obj, lv_event_t e) +{ + lv_obj_t * cont = lv_obj_get_parent(obj); + item_cont_ext_t * item_ext = lv_obj_get_ext_attr(cont); + + if(e == LV_EVENT_CLICKED) { + menu_cont_ext_t * menu_ext = lv_obj_get_ext_attr(act_cont); + + /*Call the button's event handler to create the menu*/ + lv_event_send_func(menu_ext->event_cb, NULL, e, item_ext->item); + } + else if(e == LV_EVENT_DELETE) { + item_ext->item->cont = NULL; + } + else if (e ==LV_EVENT_FOCUSED) { + menu_cont_ext_t * ext = lv_obj_get_ext_attr(act_cont); + lv_obj_t * page = ext->menu_page; + lv_page_focus(page, lv_obj_get_parent(obj), LV_ANIM_ON); + } +} + +/** + * Drop down list event callback. Call the item's `event_cb` with `LV_EVENT_VALUE_CHANGED` and save the state. + * @param ddlist pointer to the Drop down lsit + * @param e the event + */ +static void ddlist_event_cb(lv_obj_t * ddlist, lv_event_t e) +{ + lv_obj_t * cont = lv_obj_get_parent(ddlist); + item_cont_ext_t * item_ext = lv_obj_get_ext_attr(cont); + + if(e == LV_EVENT_VALUE_CHANGED) { + item_ext->item->state = lv_dropdown_get_selected(ddlist); + + menu_cont_ext_t * menu_ext = lv_obj_get_ext_attr(act_cont); + + /*Call the button's event handler to create the menu*/ + lv_event_send_func(menu_ext->event_cb, NULL, e, item_ext->item); + } + else if(e == LV_EVENT_DELETE) { + item_ext->item->cont = NULL; + } + else if (e ==LV_EVENT_FOCUSED) { + menu_cont_ext_t * ext = lv_obj_get_ext_attr(act_cont); + lv_obj_t * page = ext->menu_page; + lv_page_focus(page, lv_obj_get_parent(ddlist), LV_ANIM_ON); + } +} + +static lv_obj_t* kb = NULL; +static lv_obj_t* kb_cont = NULL; + +static void kb_delete() +{ + if(kb) + { +// remove_children_from_group(kb); +// lv_group_focus_obj(NULL); + lv_keyboard_set_textarea(kb, NULL); + lv_obj_del(kb); + if(group)lv_group_set_editing(group, false); + kb = NULL; + } + if(kb_cont) + { + lv_obj_del(kb_cont); + kb_cont = NULL; + } +} + +static void kb_event_cb(lv_obj_t* keyboard, lv_event_t e) +{ + lv_keyboard_def_event_cb(kb, e); + if (e == LV_EVENT_CANCEL || e == LV_EVENT_APPLY) { + kb_delete(); + } +} + +static void kb_create(lv_obj_t* ta) +{ + if (kb_cont == NULL) + { + kb_cont = lv_cont_create(parent, NULL); + lv_obj_set_width(kb_cont, lv_obj_get_width(parent)); + lv_obj_set_style_local_bg_opa(kb_cont, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_0); + lv_obj_set_style_local_border_opa(kb_cont, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_0); + } + lv_coord_t y = 0; + lv_obj_t* obj = ta; + while (obj && obj!=parent) + { + y += lv_obj_get_y(obj); + obj = lv_obj_get_parent(obj); + } + lv_coord_t h = lv_obj_get_height(parent); + if (y > (h / 2 - h / 12)) + { + lv_obj_set_y(kb_cont, y-2-h); + lv_obj_set_height(kb_cont, h); + } + else + { + lv_obj_set_y(kb_cont, y+h/10-h/2); + lv_obj_set_height(kb_cont, h); + } + kb = lv_keyboard_create(kb_cont, NULL); + lv_keyboard_set_cursor_manage(kb, true); + lv_obj_set_event_cb(kb, kb_event_cb); + lv_keyboard_set_textarea(kb, ta); + if (group) + { + lv_group_add_obj(group, kb); + lv_group_focus_obj(kb); + lv_group_set_editing(group, true); + } +} + +static void edit_event_cb(lv_obj_t* edit, lv_event_t e) +{ + lv_obj_t* cont = lv_obj_get_parent(edit); + item_cont_ext_t* item_ext = lv_obj_get_ext_attr(cont); + + if (e == LV_EVENT_VALUE_CHANGED) { + if(item_ext->item->param1>0) + strncpy(item_ext->item->value, lv_textarea_get_text(edit), item_ext->item->param1); + else + strcpy(item_ext->item->value, lv_textarea_get_text(edit)); + + menu_cont_ext_t* menu_ext = lv_obj_get_ext_attr(act_cont); + + /*Call the button's event handler to create the menu*/ + lv_event_send_func(menu_ext->event_cb, NULL, e, item_ext->item); + } + else if (e == LV_EVENT_DELETE) { + item_ext->item->cont = NULL; + } + else if (e == LV_EVENT_CLICKED) { + if(kb==NULL) + kb_create(edit); + } + else if (e == LV_EVENT_FOCUSED) { + lv_state_t state = lv_obj_get_state(edit, LV_STATE_DEFAULT); + if (state & LV_STATE_EDITED && kb == NULL) + kb_create(edit); + } +} + +/** + * Number set buttons' event callback. Increment/decrement the state and call the item's `event_cb` with `LV_EVENT_VALUE_CHANGED`. + * @param btn pointer to the plus or minus button + * @param e the event + */ +static void numset_event_cb(lv_obj_t * btn, lv_event_t e) +{ + lv_obj_t * cont = lv_obj_get_parent(btn); + item_cont_ext_t * item_ext = lv_obj_get_ext_attr(cont); + if(e == LV_EVENT_SHORT_CLICKED || e == LV_EVENT_LONG_PRESSED_REPEAT) { + + lv_obj_t * label = lv_obj_get_child(btn, NULL); + int32_t iv = 1; + if (item_ext->item->param1) + iv = item_ext->item->param1; + if(strcmp(lv_label_get_text(label), LV_SYMBOL_MINUS) == 0) item_ext->item->state-=iv; + else item_ext->item->state+=iv; + + menu_cont_ext_t * menu_ext = lv_obj_get_ext_attr(act_cont); + + /*Call the button's event handler to create the menu*/ + lv_event_send_func(menu_ext->event_cb, NULL, LV_EVENT_VALUE_CHANGED, item_ext->item); + + /*Get the value label*/ + label = lv_obj_get_child(cont, NULL); + label = lv_obj_get_child(cont, label); + + lv_label_set_text(label, item_ext->item->value); + } + else if(e == LV_EVENT_DELETE) { + item_ext->item->cont = NULL; + } + else if (e ==LV_EVENT_FOCUSED) { + menu_cont_ext_t * ext = lv_obj_get_ext_attr(act_cont); + lv_obj_t * page = ext->menu_page; + lv_page_focus(page, lv_obj_get_parent(btn), LV_ANIM_ON); + } +} + +bool lv_settings_reopen_last() +{ + histroy_t* prev_hist = _lv_ll_get_head(&history_ll); + + if (prev_hist) { + _lv_ll_remove(&history_ll, prev_hist); + lv_settings_open_page(prev_hist->item, prev_hist->event_cb); + lv_mem_free(prev_hist); + return true; + } + return false; +} + +void lv_settings_back() +{ + if(kb) + { + kb_delete(); + return; + } + lv_obj_t* old_menu_cont = act_cont; + + /*Delete the current item form the history. The goal is the previous.*/ + histroy_t* act_hist; + act_hist = _lv_ll_get_head(&history_ll); + if (act_hist) { + _lv_ll_remove(&history_ll, act_hist); + lv_mem_free(act_hist); + + /*Get the real previous item and open it*/ + histroy_t* prev_hist = _lv_ll_get_head(&history_ll); + + if (prev_hist) { + /* Create the previous menu. + * Remove it from the history because `lv_settings_create_page` will add it again */ + _lv_ll_remove(&history_ll, prev_hist); + lv_settings_open_page(prev_hist->item, prev_hist->event_cb); + lv_mem_free(prev_hist); + } + else { + /*No previous menu, so no main container*/ + act_cont = NULL; + root_ext_t* ext = lv_obj_get_ext_attr(menu_btn); + lv_event_send_func(ext->event_cb, NULL, LV_EVENT_CANCEL, ext->item); + if (group) lv_group_add_obj(group, menu_btn); + } + } + + /*Float out the old menu container*/ + if (old_menu_cont) { + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, old_menu_cont); + lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_x); + lv_coord_t w_scr = lv_obj_get_width(parent); + bool menu_btn_right = lv_obj_get_x(menu_btn) >= w_scr / 2; + lv_coord_t w_cont = lv_obj_get_width(old_menu_cont); + uint32_t start = !menu_btn_right ? 0 : w_scr - w_cont; + uint32_t end = !menu_btn_right ? -w_cont : w_scr; + lv_anim_set_values(&a, start, end); + // lv_anim_set_path(&a, lv_anim_path_ease_in_out); + lv_anim_set_time(&a, LV_SETTINGS_ANIM_TIME); + lv_anim_set_ready_cb(&a, old_cont_del_cb); + lv_anim_start(&a); + + /*Move the old menu to the for ground. */ + lv_obj_move_foreground(old_menu_cont); + } + + if (act_cont) { + lv_anim_del(act_cont, (lv_anim_exec_xcb_t)lv_obj_set_x); + lv_coord_t w_scr = lv_obj_get_width(parent); + bool menu_btn_right = lv_obj_get_x(menu_btn) >= w_scr / 2; + lv_coord_t w_cont = lv_obj_get_width(act_cont); + lv_obj_set_x(act_cont, !menu_btn_right ? 0 : w_scr - w_cont); + } +} + +/** + * Back button event callback. Load the previous menu on click and delete the current. + * @param btn pointer to the back button + * @param e the event + */ +static void header_back_event_cb(lv_obj_t * btn, lv_event_t e) +{ + (void) btn; /*Unused*/ + + if(e != LV_EVENT_CLICKED) return; + lv_settings_back(); +} + +/** + * Create a container for the items of a page + * @param page pointer to a page where to create the container + * @param item pointer to a `lv_settings_item_t` variable. The pointer will be saved in the container's `ext`. + * @return the created container + */ +static lv_obj_t * item_cont_create(lv_obj_t * page, lv_settings_item_t * item) +{ + lv_obj_t * cont = lv_cont_create(page, NULL); + add_style_to_item(cont); + lv_obj_add_style(cont,LV_CONT_PART_MAIN,&style_item_cont); + lv_cont_set_fit2(cont, LV_FIT_PARENT, LV_FIT_TIGHT); + lv_obj_set_click(cont, false); + + item_cont_ext_t * ext = lv_obj_allocate_ext_attr(cont, sizeof(item_cont_ext_t)); + ext->item = item; + ext->item->cont = cont; + + return cont; +} + +/** + * Delete the old main container when the animation is ready + * @param a pointer to the animation + */ +static void old_cont_del_cb(lv_anim_t * a) +{ + lv_obj_del(a->var); +} + +static void remove_children_from_group(lv_obj_t * obj) +{ + lv_obj_t *child = lv_obj_get_child(obj, NULL); + while(child) { + if(lv_obj_get_group(child) == group) { + lv_group_remove_obj(child); + } + remove_children_from_group(child); + child = lv_obj_get_child(obj, child); + } + +} + +static void add_style_to_btn(lv_obj_t* obj) +{ + static lv_style_t style; + /*Create a simple button style*/ + lv_style_init(&style); + //lv_style_set_radius(&style, LV_STATE_DEFAULT, 10); + lv_style_set_bg_opa(&style, LV_STATE_DEFAULT, LV_OPA_0); + lv_style_set_bg_opa(&style, LV_STATE_PRESSED, LV_OPA_80); + lv_style_set_bg_opa(&style, LV_STATE_FOCUSED, LV_OPA_30); + lv_style_set_bg_color(&style, LV_STATE_FOCUSED, lv_theme_get_color_secondary()); + + //lv_style_set_bg_color(&style, LV_STATE_DEFAULT, LV_COLOR_LIME); + //lv_style_set_bg_grad_color(&style, LV_STATE_DEFAULT, LV_COLOR_GREEN); + /*Swap the colors in pressed state*/ + //lv_style_set_bg_color(&style, LV_STATE_PRESSED, LV_COLOR_GREEN); + //lv_style_set_bg_grad_color(&style, LV_STATE_PRESSED, LV_COLOR_LIME); + /*Add a border*/ + lv_style_set_border_color(&style, LV_STATE_DEFAULT, LV_COLOR_WHITE); + lv_style_set_border_opa(&style, LV_STATE_DEFAULT, LV_OPA_70); + lv_style_set_border_width(&style, LV_STATE_DEFAULT, 2); + /*Different border color in focused state*/ + //lv_style_set_border_color(&style, LV_STATE_FOCUSED | LV_STATE_PRESSED, LV_COLOR_BLUE); + /*Add outline*/ + //lv_style_set_outline_width(&style, LV_STATE_DEFAULT, 2); + //lv_style_set_outline_color(&style, LV_STATE_DEFAULT, LV_COLOR_BLUE); + //lv_style_set_outline_pad(&style, LV_STATE_DEFAULT, 2); + + //lv_style_set_radius(&style, LV_STATE_DEFAULT, LV_DPX(10)); + lv_style_set_radius(&style, LV_STATE_DEFAULT, LV_DPX(10)); + lv_obj_add_style(obj, LV_BTN_PART_MAIN, &style); +} + +static void add_style_to_item(lv_obj_t * obj) +{ + static lv_style_t style; + /*Create a simple button style*/ + lv_style_init(&style); + //lv_style_set_radius(&style, LV_STATE_DEFAULT, 10); + lv_style_set_bg_opa(&style, LV_STATE_DEFAULT, LV_OPA_0); + lv_style_set_bg_opa(&style, LV_STATE_FOCUSED, LV_OPA_30); + lv_style_set_bg_color(&style, LV_STATE_FOCUSED, lv_theme_get_color_secondary()); + //lv_style_set_bg_grad_color(&style, LV_STATE_DEFAULT, LV_COLOR_GREEN); + //lv_style_set_bg_grad_dir(&style, LV_STATE_DEFAULT, LV_GRAD_DIR_VER); + /*Swap the colors in pressed state*/ + //lv_style_set_bg_color(&style, LV_STATE_PRESSED, LV_COLOR_GREEN); + //lv_style_set_bg_grad_color(&style, LV_STATE_PRESSED, LV_COLOR_LIME); + /*Add a border*/ + lv_style_set_border_color(&style, LV_STATE_DEFAULT, LV_COLOR_GRAY); + lv_style_set_border_opa(&style, LV_STATE_DEFAULT, LV_OPA_70); + lv_style_set_border_opa(&style, LV_STATE_FOCUSED, LV_OPA_70); + lv_style_set_border_width(&style, LV_STATE_DEFAULT, 2); + lv_style_set_border_side(&style, LV_STATE_DEFAULT, LV_BORDER_SIDE_BOTTOM | LV_BORDER_SIDE_TOP); + /*Different border color in focused state*/ + //lv_style_set_border_color(&style, LV_STATE_FOCUSED | LV_STATE_PRESSED, LV_COLOR_BLUE); + /*Add outline*/ + //lv_style_set_outline_width(&style, LV_STATE_DEFAULT, 2); + //lv_style_set_outline_color(&style, LV_STATE_DEFAULT, LV_COLOR_BLUE); + //lv_style_set_outline_pad(&style, LV_STATE_DEFAULT, 2); + lv_style_set_radius(&style, LV_STATE_DEFAULT, 0); + lv_style_set_margin_all(&style, LV_STATE_DEFAULT, 0); + lv_style_set_margin_bottom(&style, LV_STATE_DEFAULT, -1); + lv_obj_add_style(obj, LV_BTN_PART_MAIN, &style); +} diff --git a/src/lv_settings/lv_settings.h b/src/lv_settings/lv_settings.h new file mode 100644 index 0000000..d2f3cfb --- /dev/null +++ b/src/lv_settings/lv_settings.h @@ -0,0 +1,119 @@ +īģŋ/** + * @file lv_settings.h + * + */ + +#ifndef LV_SETTINGS_H +#define LV_SETTINGS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_SETTINGS_TYPE_LIST_BTN, + LV_SETTINGS_TYPE_BTN, + LV_SETTINGS_TYPE_SW, + LV_SETTINGS_TYPE_DDLIST, + LV_SETTINGS_TYPE_NUMSET, + LV_SETTINGS_TYPE_SLIDER, + LV_SETTINGS_TYPE_EDIT, + + LV_SETTINGS_TYPE_INV = 0xff, +}lv_settings_type_t; + + +#define LV_SETTINGS_EDIT_PWD 1 + +typedef struct { + uint8_t id; + lv_settings_type_t type; + char * name; /*Name or title of the item*/ + char * value; /*The current value as string*/ + int32_t state; /*The current state, e.g. slider's value, switch state as a number */ + int32_t param1; + int32_t param2; + lv_obj_t * cont; + union { + void * ptr; + int32_t int32; + }user_data; +}lv_settings_item_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a settings application + * @param root_item descriptor of the settings button. For example: + * `lv_settings_menu_item_t root_item = {.name = "Settings", .event_cb = root_event_cb};` + * @return the created settings button + */ +lv_obj_t * lv_settings_create(lv_settings_item_t * root_item, lv_event_cb_t event_cb); + +/** + * Automatically add the item to a group to allow navigation with keypad or encoder. + * Should be called before `lv_settings_create` + * The group can be change at any time. + * @param g the group to use. `NULL` to not use this feature. + */ +void lv_settings_set_group(lv_group_t * g); +void lv_settings_set_parent(lv_obj_t* p); +void lv_settings_back(); +bool lv_settings_reopen_last(); + +/** + * Change the maximum width of settings dialog object + * @param max_width maximum width of the settings container page + */ +void lv_settings_set_max_width(lv_coord_t max_width); + +/** + * Create a new page ask `event_cb` to add the item with `LV_EVENT_REFRESH` + * @param parent_item pointer to an item which open the the new page. Its `name` will be the title + * @param event_cb event handler of the menu page + */ +void lv_settings_open_page(lv_settings_item_t * parent_item, lv_event_cb_t event_cb); + +/** + * Add a list element to the page. With `item->name` and `item->value` texts. + * @param page pointer to a menu page created by `lv_settings_create_page` + */ +void lv_settings_add(lv_settings_item_t * item); + + +/** + * Refresh an item's name value and state. + * @param item pointer to a an `lv_settings_item _t` item. + */ +void lv_settings_refr(lv_settings_item_t * item); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_TEMPL_H*/ diff --git a/src/lvgl/lv_theme_material.c b/src/lvgl/lv_theme_material.c new file mode 100644 index 0000000..1a3ec68 --- /dev/null +++ b/src/lvgl/lv_theme_material.c @@ -0,0 +1,1404 @@ +/** + * @file lv_theme_material.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include /*To see all the widgets*/ + +#if LV_USE_THEME_MATERIAL + +#include + +#if defined(LV_GC_INCLUDE) + #include LV_GC_INCLUDE +#endif /* LV_ENABLE_GC */ + +/********************* + * DEFINES + *********************/ + +/*SCREEN*/ + +#define COLOR_SCR (IS_LIGHT ? lv_color_hex(0xeaeff3) : lv_color_hex(0x000000)) +#define COLOR_SCR_TEXT (IS_LIGHT ? lv_color_hex(0x3b3e42) : lv_color_hex(0xe7e9ec)) + +/*BUTTON*/ +#define COLOR_BTN (IS_LIGHT ? lv_color_hex(0xffffff) : lv_color_hex(0x000000)) +#define COLOR_BTN_PR (IS_LIGHT ? lv_color_mix(theme.color_primary, COLOR_BTN, LV_OPA_20) : lv_color_mix(theme.color_primary, COLOR_BTN, LV_OPA_30)) + +#define COLOR_BTN_CHK (theme.color_primary) +#define COLOR_BTN_CHK_PR (lv_color_darken(theme.color_primary, LV_OPA_30)) +#define COLOR_BTN_DIS (IS_LIGHT ? lv_color_hex3(0xccc) : lv_color_hex3(0x888)) + +#define COLOR_BTN_BORDER theme.color_primary +#define COLOR_BTN_BORDER_PR theme.color_primary +#define COLOR_BTN_BORDER_CHK theme.color_primary +#define COLOR_BTN_BORDER_CHK_PR theme.color_primary +#define COLOR_BTN_BORDER_INA (IS_LIGHT ? lv_color_hex3(0x888) : lv_color_hex(0x404040)) + +/*BACKGROUND*/ +#define COLOR_BG (IS_LIGHT ? lv_color_hex(0xffffff) : lv_color_hex(0x000000)) +#define COLOR_BG_PR (IS_LIGHT ? lv_color_hex(0xeeeeee) : lv_color_hex(0x101010)) +#define COLOR_BG_CHK theme.color_primary +#define COLOR_BG_PR_CHK lv_color_darken(theme.color_primary, LV_OPA_20) +#define COLOR_BG_DIS COLOR_BG + +#define COLOR_BG_BORDER (IS_LIGHT ? lv_color_hex(0xd6dde3) : lv_color_hex(0x808a97)) /*dfe7ed*/ +#define COLOR_BG_BORDER_PR (IS_LIGHT ? lv_color_hex3(0xccc) : lv_color_hex(0x5f656e)) +#define COLOR_BG_BORDER_CHK (IS_LIGHT ? lv_color_hex(0x3b3e42) : lv_color_hex(0x5f656e)) +#define COLOR_BG_BORDER_CHK_PR (IS_LIGHT ? lv_color_hex(0x3b3e42) : lv_color_hex(0x5f656e)) +#define COLOR_BG_BORDER_DIS (IS_LIGHT ? lv_color_hex(0xd6dde3) : lv_color_hex(0x5f656e)) + +#define COLOR_BG_TEXT (IS_LIGHT ? lv_color_hex(0x3b3e42) : lv_color_hex(0xffffff)) +#define COLOR_BG_TEXT_PR (IS_LIGHT ? lv_color_hex(0x3b3e42) : lv_color_hex(0xffffff)) +#define COLOR_BG_TEXT_CHK (IS_LIGHT ? lv_color_hex(0xffffff) : lv_color_hex(0xffffff)) +#define COLOR_BG_TEXT_CHK_PR (IS_LIGHT ? lv_color_hex(0xffffff) : lv_color_hex(0xffffff)) +#define COLOR_BG_TEXT_DIS (IS_LIGHT ? lv_color_hex3(0xaaa) : lv_color_hex3(0x999)) + +/*SECONDARY BACKGROUND*/ +#define COLOR_BG_SEC (IS_LIGHT ? lv_color_hex(0xd4d7d9) : lv_color_hex(0x45494d)) +#define COLOR_BG_SEC_BORDER (IS_LIGHT ? lv_color_hex(0xdfe7ed) : lv_color_hex(0x404040)) +#define COLOR_BG_SEC_TEXT (IS_LIGHT ? lv_color_hex(0x31404f) : lv_color_hex(0xa5a8ad)) +#define COLOR_BG_SEC_TEXT_DIS (IS_LIGHT ? lv_color_hex(0xaaaaaa) : lv_color_hex(0xa5a8ad)) + +#define TRANSITION_TIME 0/*((theme.flags & LV_THEME_MATERIAL_FLAG_NO_TRANSITION) ? 0 : 150)*/ +#define BORDER_WIDTH LV_DPX(2) +#define OUTLINE_WIDTH ((theme.flags & LV_THEME_MATERIAL_FLAG_NO_FOCUS) ? 0 : LV_DPX(2)) +#define IS_LIGHT (theme.flags & LV_THEME_MATERIAL_FLAG_LIGHT) + +#define PAD_DEF (lv_disp_get_size_category(NULL) <= LV_DISP_SIZE_MEDIUM ? LV_DPX(10) : (LV_DPX(15))) + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_style_t scr; + lv_style_t bg; + lv_style_t bg_click; + lv_style_t bg_sec; + lv_style_t btn; + lv_style_t pad_inner; + lv_style_t pad_small; + +#if LV_USE_ARC + lv_style_t arc_indic; + lv_style_t arc_bg; + lv_style_t arc_knob; +#endif + +#if LV_USE_BAR + lv_style_t bar_bg; + lv_style_t bar_indic; +#endif + +#if LV_USE_CALENDAR + lv_style_t calendar_date_nums, calendar_header, calendar_daynames; +#endif + +#if LV_USE_CPICKER + lv_style_t cpicker_bg, cpicker_indic; +#endif + +#if LV_USE_CHART + lv_style_t chart_bg, chart_series_bg, chart_series; +#endif + +#if LV_USE_CHECKBOX + lv_style_t cb_bg, cb_bullet; +#endif + +#if LV_USE_DROPDOWN + lv_style_t ddlist_page, ddlist_sel; +#endif + +#if LV_USE_GAUGE + lv_style_t gauge_main, gauge_strong, gauge_needle; +#endif + +#if LV_USE_KEYBOARD + lv_style_t kb_bg; +#endif + +#if LV_USE_LED + lv_style_t led; +#endif + +#if LV_USE_LINEMETER + lv_style_t lmeter; +#endif + +#if LV_USE_LIST + lv_style_t list_bg, list_btn; +#endif + +#if LV_USE_MSGBOX + lv_style_t mbox_bg; +#endif + +#if LV_USE_PAGE + lv_style_t sb; +#if LV_USE_ANIMATION + lv_style_t edge_flash; +#endif +#endif + +#if LV_USE_ROLLER + lv_style_t roller_bg, roller_sel; +#endif + +#if LV_USE_SLIDER + lv_style_t slider_knob, slider_bg; +#endif + +#if LV_USE_SPINBOX + lv_style_t spinbox_cursor; +#endif + +#if LV_USE_SWITCH + lv_style_t sw_knob; +#endif + +#if LV_USE_TABLE + lv_style_t table_cell; +#endif + +#if LV_USE_TABVIEW || LV_USE_WIN + lv_style_t tabview_btns, tabview_btns_bg, tabview_indic, tabview_page_scrl; +#endif + +#if LV_USE_TEXTAREA + lv_style_t ta_cursor, ta_placeholder; +#endif + +} theme_styles_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name); +static void style_init_reset(lv_style_t * style); + +/********************** + * STATIC VARIABLES + **********************/ +static lv_theme_t theme; +static theme_styles_t * styles; + +static bool inited; + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void basic_init(void) +{ + style_init_reset(&styles->scr); + lv_style_set_bg_opa(&styles->scr, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->scr, LV_STATE_DEFAULT, COLOR_SCR); + lv_style_set_text_color(&styles->scr, LV_STATE_DEFAULT, COLOR_SCR_TEXT); + lv_style_set_value_color(&styles->scr, LV_STATE_DEFAULT, COLOR_SCR_TEXT); + lv_style_set_text_sel_color(&styles->scr, LV_STATE_DEFAULT, COLOR_SCR_TEXT); + lv_style_set_text_sel_bg_color(&styles->scr, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_value_font(&styles->scr, LV_STATE_DEFAULT, theme.font_normal); + + style_init_reset(&styles->bg); + lv_style_set_radius(&styles->bg, LV_STATE_DEFAULT, LV_DPX(8)); + lv_style_set_bg_opa(&styles->bg, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->bg, LV_STATE_DEFAULT, COLOR_BG); + lv_style_set_border_color(&styles->bg, LV_STATE_DEFAULT, COLOR_BG_BORDER); + if((theme.flags & LV_THEME_MATERIAL_FLAG_NO_FOCUS) == 0)lv_style_set_border_color(&styles->bg, LV_STATE_FOCUSED, + theme.color_primary); + lv_style_set_border_color(&styles->bg, LV_STATE_EDITED, theme.color_secondary); + lv_style_set_border_width(&styles->bg, LV_STATE_DEFAULT, BORDER_WIDTH); + lv_style_set_border_post(&styles->bg, LV_STATE_DEFAULT, true); + lv_style_set_text_color(&styles->bg, LV_STATE_DEFAULT, COLOR_BG_TEXT); + lv_style_set_value_font(&styles->bg, LV_STATE_DEFAULT, theme.font_normal); + lv_style_set_value_color(&styles->bg, LV_STATE_DEFAULT, COLOR_BG_TEXT); + lv_style_set_image_recolor(&styles->bg, LV_STATE_DEFAULT, COLOR_BG_TEXT); + lv_style_set_line_color(&styles->bg, LV_STATE_DEFAULT, COLOR_BG_TEXT); + lv_style_set_line_width(&styles->bg, LV_STATE_DEFAULT, 1); + lv_style_set_pad_left(&styles->bg, LV_STATE_DEFAULT, PAD_DEF + BORDER_WIDTH); + lv_style_set_pad_right(&styles->bg, LV_STATE_DEFAULT, PAD_DEF + BORDER_WIDTH); + lv_style_set_pad_top(&styles->bg, LV_STATE_DEFAULT, PAD_DEF + BORDER_WIDTH); + lv_style_set_pad_bottom(&styles->bg, LV_STATE_DEFAULT, PAD_DEF + BORDER_WIDTH); + lv_style_set_pad_inner(&styles->bg, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_transition_time(&styles->bg, LV_STATE_DEFAULT, TRANSITION_TIME); + lv_style_set_transition_prop_6(&styles->bg, LV_STATE_DEFAULT, LV_STYLE_BORDER_COLOR); + + style_init_reset(&styles->bg_sec); + lv_style_copy(&styles->bg_sec, &styles->bg); + lv_style_set_bg_color(&styles->bg_sec, LV_STATE_DEFAULT, COLOR_BG_SEC); + lv_style_set_border_color(&styles->bg_sec, LV_STATE_DEFAULT, COLOR_BG_SEC_BORDER); + lv_style_set_text_color(&styles->bg_sec, LV_STATE_DEFAULT, COLOR_BG_SEC_TEXT); + lv_style_set_value_color(&styles->bg_sec, LV_STATE_DEFAULT, COLOR_BG_SEC_TEXT); + lv_style_set_image_recolor(&styles->bg_sec, LV_STATE_DEFAULT, COLOR_BG_SEC_TEXT); + lv_style_set_line_color(&styles->bg_sec, LV_STATE_DEFAULT, COLOR_BG_SEC_TEXT); + + style_init_reset(&styles->bg_click); + lv_style_set_bg_color(&styles->bg_click, LV_STATE_PRESSED, COLOR_BG_PR); + lv_style_set_bg_color(&styles->bg_click, LV_STATE_CHECKED, COLOR_BG_CHK); + lv_style_set_bg_color(&styles->bg_click, LV_STATE_PRESSED | LV_STATE_CHECKED, COLOR_BG_PR_CHK); + lv_style_set_bg_color(&styles->bg_click, LV_STATE_DISABLED, COLOR_BG_DIS); + lv_style_set_border_width(&styles->bg_click, LV_STATE_CHECKED, 0); + lv_style_set_border_color(&styles->bg_click, LV_STATE_FOCUSED | LV_STATE_PRESSED, lv_color_darken(theme.color_primary, + LV_OPA_20)); + lv_style_set_border_color(&styles->bg_click, LV_STATE_PRESSED, COLOR_BG_BORDER_PR); + lv_style_set_border_color(&styles->bg_click, LV_STATE_CHECKED, COLOR_BG_BORDER_CHK); + lv_style_set_border_color(&styles->bg_click, LV_STATE_PRESSED | LV_STATE_CHECKED, COLOR_BG_BORDER_CHK_PR); + lv_style_set_border_color(&styles->bg_click, LV_STATE_DISABLED, COLOR_BG_BORDER_DIS); + lv_style_set_text_color(&styles->bg_click, LV_STATE_PRESSED, COLOR_BG_TEXT_PR); + lv_style_set_text_color(&styles->bg_click, LV_STATE_CHECKED, COLOR_BG_TEXT_CHK); + lv_style_set_text_color(&styles->bg_click, LV_STATE_PRESSED | LV_STATE_CHECKED, COLOR_BG_TEXT_CHK_PR); + lv_style_set_text_color(&styles->bg_click, LV_STATE_DISABLED, COLOR_BG_TEXT_DIS); + lv_style_set_image_recolor(&styles->bg_click, LV_STATE_PRESSED, COLOR_BG_TEXT_PR); + lv_style_set_image_recolor(&styles->bg_click, LV_STATE_CHECKED, COLOR_BG_TEXT_CHK); + lv_style_set_image_recolor(&styles->bg_click, LV_STATE_PRESSED | LV_STATE_CHECKED, COLOR_BG_TEXT_CHK_PR); + lv_style_set_image_recolor(&styles->bg_click, LV_STATE_DISABLED, COLOR_BG_TEXT_DIS); + lv_style_set_transition_prop_5(&styles->bg_click, LV_STATE_DEFAULT, LV_STYLE_BG_COLOR); + + style_init_reset(&styles->btn); + lv_style_set_radius(&styles->btn, LV_STATE_DEFAULT, LV_DPX(32)); + lv_style_set_bg_opa(&styles->btn, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->btn, LV_STATE_DEFAULT, COLOR_BTN); + lv_style_set_bg_color(&styles->btn, LV_STATE_PRESSED, COLOR_BTN_PR); + lv_style_set_bg_color(&styles->btn, LV_STATE_CHECKED, COLOR_BTN_CHK); + lv_style_set_bg_color(&styles->btn, LV_STATE_CHECKED | LV_STATE_PRESSED, COLOR_BTN_CHK_PR); + lv_style_set_bg_color(&styles->btn, LV_STATE_DISABLED, COLOR_BTN); + lv_style_set_bg_color(&styles->btn, LV_STATE_DISABLED | LV_STATE_CHECKED, COLOR_BTN_DIS); + lv_style_set_border_color(&styles->btn, LV_STATE_DEFAULT, COLOR_BTN_BORDER); + lv_style_set_border_color(&styles->btn, LV_STATE_PRESSED, COLOR_BTN_BORDER_PR); + lv_style_set_border_color(&styles->btn, LV_STATE_DISABLED, COLOR_BTN_BORDER_INA); + lv_style_set_border_width(&styles->btn, LV_STATE_DEFAULT, BORDER_WIDTH); + lv_style_set_border_width(&styles->btn, LV_STATE_FOCUSED, BORDER_WIDTH*4); + lv_style_set_border_color(&styles->btn, LV_STATE_FOCUSED, lv_color_lighten(COLOR_BTN_BORDER, LV_OPA_20)); + lv_style_set_border_opa(&styles->btn, LV_STATE_CHECKED, LV_OPA_TRANSP); + + lv_style_set_text_color(&styles->btn, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex(0x31404f) : lv_color_hex(0xffffff)); + lv_style_set_text_color(&styles->btn, LV_STATE_PRESSED, IS_LIGHT ? lv_color_hex(0x31404f) : lv_color_hex(0xffffff)); + lv_style_set_text_color(&styles->btn, LV_STATE_CHECKED, lv_color_hex(0xffffff)); + lv_style_set_text_color(&styles->btn, LV_STATE_CHECKED | LV_STATE_PRESSED, lv_color_hex(0xffffff)); + lv_style_set_text_color(&styles->btn, LV_STATE_DISABLED, IS_LIGHT ? lv_color_hex(0x888888) : lv_color_hex(0x888888)); + + lv_style_set_image_recolor(&styles->btn, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex(0x31404f) : lv_color_hex(0xffffff)); + lv_style_set_image_recolor(&styles->btn, LV_STATE_PRESSED, IS_LIGHT ? lv_color_hex(0x31404f) : lv_color_hex(0xffffff)); + lv_style_set_image_recolor(&styles->btn, LV_STATE_PRESSED, lv_color_hex(0xffffff)); + lv_style_set_image_recolor(&styles->btn, LV_STATE_CHECKED | LV_STATE_PRESSED, lv_color_hex(0xffffff)); + lv_style_set_image_recolor(&styles->btn, LV_STATE_DISABLED, IS_LIGHT ? lv_color_hex(0x888888) : lv_color_hex(0x888888)); + + lv_style_set_value_color(&styles->btn, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex(0x31404f) : lv_color_hex(0xffffff)); + lv_style_set_value_color(&styles->btn, LV_STATE_PRESSED, IS_LIGHT ? lv_color_hex(0x31404f) : lv_color_hex(0xffffff)); + lv_style_set_value_color(&styles->btn, LV_STATE_CHECKED, lv_color_hex(0xffffff)); + lv_style_set_value_color(&styles->btn, LV_STATE_CHECKED | LV_STATE_PRESSED, lv_color_hex(0xffffff)); + lv_style_set_value_color(&styles->btn, LV_STATE_DISABLED, IS_LIGHT ? lv_color_hex(0x888888) : lv_color_hex(0x888888)); + + lv_style_set_pad_left(&styles->btn, LV_STATE_DEFAULT, LV_DPX(40)); + lv_style_set_pad_right(&styles->btn, LV_STATE_DEFAULT, LV_DPX(40)); + lv_style_set_pad_top(&styles->btn, LV_STATE_DEFAULT, LV_DPX(15)); + lv_style_set_pad_bottom(&styles->btn, LV_STATE_DEFAULT, LV_DPX(15)); + lv_style_set_pad_inner(&styles->btn, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_outline_width(&styles->btn, LV_STATE_DEFAULT, OUTLINE_WIDTH); + lv_style_set_outline_opa(&styles->btn, LV_STATE_DEFAULT, LV_OPA_0); + lv_style_set_outline_opa(&styles->btn, LV_STATE_FOCUSED, LV_OPA_50); + lv_style_set_outline_color(&styles->btn, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_outline_color(&styles->btn, LV_STATE_EDITED, theme.color_secondary); + lv_style_set_transition_time(&styles->btn, LV_STATE_DEFAULT, TRANSITION_TIME); + lv_style_set_transition_prop_4(&styles->btn, LV_STATE_DEFAULT, LV_STYLE_BORDER_OPA); + lv_style_set_transition_prop_5(&styles->btn, LV_STATE_DEFAULT, LV_STYLE_BG_COLOR); + lv_style_set_transition_prop_6(&styles->btn, LV_STATE_DEFAULT, LV_STYLE_OUTLINE_OPA); + lv_style_set_transition_delay(&styles->btn, LV_STATE_DEFAULT, TRANSITION_TIME); + lv_style_set_transition_delay(&styles->btn, LV_STATE_PRESSED, 0); + + style_init_reset(&styles->pad_inner); + + lv_style_set_pad_inner(&styles->pad_inner, LV_STATE_DEFAULT, + lv_disp_get_size_category(NULL) <= LV_DISP_SIZE_MEDIUM ? LV_DPX(20) : LV_DPX(40)); + + style_init_reset(&styles->pad_small); + lv_style_int_t pad_small_value = lv_disp_get_size_category(NULL) <= LV_DISP_SIZE_MEDIUM ? LV_DPX(10) : LV_DPX(20); + lv_style_set_pad_left(&styles->pad_small, LV_STATE_DEFAULT, pad_small_value); + lv_style_set_pad_right(&styles->pad_small, LV_STATE_DEFAULT, pad_small_value); + lv_style_set_pad_top(&styles->pad_small, LV_STATE_DEFAULT, pad_small_value); + lv_style_set_pad_bottom(&styles->pad_small, LV_STATE_DEFAULT, pad_small_value); + lv_style_set_pad_inner(&styles->pad_small, LV_STATE_DEFAULT, pad_small_value); +} + +static void cont_init(void) +{ +#if LV_USE_CONT != 0 + +#endif +} + +static void btn_init(void) +{ +#if LV_USE_BTN != 0 + +#endif +} + +static void label_init(void) +{ +#if LV_USE_LABEL != 0 + +#endif +} + +static void bar_init(void) +{ +#if LV_USE_BAR + style_init_reset(&styles->bar_bg); + lv_style_set_radius(&styles->bar_bg, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_bg_opa(&styles->bar_bg, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->bar_bg, LV_STATE_DEFAULT, COLOR_BG_SEC); + lv_style_set_value_color(&styles->bar_bg, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex(0x31404f) : LV_COLOR_WHITE); + lv_style_set_outline_color(&styles->bar_bg, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_outline_color(&styles->bar_bg, LV_STATE_EDITED, theme.color_secondary); + lv_style_set_outline_opa(&styles->bar_bg, LV_STATE_DEFAULT, LV_OPA_TRANSP); + lv_style_set_outline_opa(&styles->bar_bg, LV_STATE_FOCUSED, LV_OPA_50); + lv_style_set_outline_width(&styles->bar_bg, LV_STATE_DEFAULT, OUTLINE_WIDTH); + lv_style_set_transition_time(&styles->bar_bg, LV_STATE_DEFAULT, TRANSITION_TIME); + lv_style_set_transition_prop_6(&styles->bar_bg, LV_STATE_DEFAULT, LV_STYLE_OUTLINE_OPA); + + lv_style_set_border_width(&styles->bar_bg, LV_STATE_FOCUSED, BORDER_WIDTH*4); + lv_style_set_border_color(&styles->bar_bg, LV_STATE_FOCUSED, lv_color_lighten(COLOR_BTN_BORDER, LV_OPA_20)); + + style_init_reset(&styles->bar_indic); + lv_style_set_bg_opa(&styles->bar_indic, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_radius(&styles->bar_indic, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_bg_color(&styles->bar_indic, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_bg_color(&styles->bar_indic, LV_STATE_DISABLED, lv_color_hex3(0x888)); + lv_style_set_value_color(&styles->bar_indic, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex(0x41404f) : LV_COLOR_WHITE); + +#endif +} + +static void img_init(void) +{ +#if LV_USE_IMG != 0 + +#endif +} + +static void line_init(void) +{ +#if LV_USE_LINE != 0 + +#endif +} + +static void led_init(void) +{ +#if LV_USE_LED != 0 + style_init_reset(&styles->led); + lv_style_set_bg_opa(&styles->led, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->led, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_border_width(&styles->led, LV_STATE_DEFAULT, 2); + lv_style_set_border_opa(&styles->led, LV_STATE_DEFAULT, LV_OPA_50); + lv_style_set_border_color(&styles->led, LV_STATE_DEFAULT, lv_color_lighten(theme.color_primary, LV_OPA_30)); + lv_style_set_radius(&styles->led, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_shadow_width(&styles->led, LV_STATE_DEFAULT, LV_DPX(15)); + lv_style_set_shadow_color(&styles->led, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_shadow_spread(&styles->led, LV_STATE_DEFAULT, LV_DPX(5)); +#endif +} + +static void slider_init(void) +{ +#if LV_USE_SLIDER != 0 + style_init_reset(&styles->slider_knob); + lv_style_set_bg_opa(&styles->slider_knob, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->slider_knob, LV_STATE_DEFAULT, IS_LIGHT ? theme.color_primary : LV_COLOR_WHITE); + lv_style_set_value_color(&styles->slider_knob, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex(0x31404f) : LV_COLOR_WHITE); + lv_style_set_radius(&styles->slider_knob, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_pad_left(&styles->slider_knob, LV_STATE_DEFAULT, LV_DPX(7)); + lv_style_set_pad_right(&styles->slider_knob, LV_STATE_DEFAULT, LV_DPX(7)); + lv_style_set_pad_top(&styles->slider_knob, LV_STATE_DEFAULT, LV_DPX(7)); + lv_style_set_pad_bottom(&styles->slider_knob, LV_STATE_DEFAULT, LV_DPX(7)); + + style_init_reset(&styles->slider_bg); + lv_style_set_margin_left(&styles->slider_bg, LV_STATE_DEFAULT, LV_DPX(10)); + lv_style_set_margin_right(&styles->slider_bg, LV_STATE_DEFAULT, LV_DPX(10)); + lv_style_set_margin_top(&styles->slider_bg, LV_STATE_DEFAULT, LV_DPX(10)); + lv_style_set_margin_bottom(&styles->slider_bg, LV_STATE_DEFAULT, LV_DPX(10)); + +#endif +} + +static void switch_init(void) +{ +#if LV_USE_SWITCH != 0 + style_init_reset(&styles->sw_knob); + lv_style_set_bg_opa(&styles->sw_knob, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->sw_knob, LV_STATE_DEFAULT, LV_COLOR_WHITE); + lv_style_set_radius(&styles->sw_knob, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_pad_top(&styles->sw_knob, LV_STATE_DEFAULT, - LV_DPX(4)); + lv_style_set_pad_bottom(&styles->sw_knob, LV_STATE_DEFAULT, - LV_DPX(4)); + lv_style_set_pad_left(&styles->sw_knob, LV_STATE_DEFAULT, - LV_DPX(4)); + lv_style_set_pad_right(&styles->sw_knob, LV_STATE_DEFAULT, - LV_DPX(4)); +#endif +} + +static void linemeter_init(void) +{ +#if LV_USE_LINEMETER != 0 + style_init_reset(&styles->lmeter); + lv_style_set_radius(&styles->lmeter, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_pad_left(&styles->lmeter, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_pad_right(&styles->lmeter, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_pad_top(&styles->lmeter, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_pad_inner(&styles->lmeter, LV_STATE_DEFAULT, LV_DPX(30)); + lv_style_set_scale_width(&styles->lmeter, LV_STATE_DEFAULT, LV_DPX(25)); + + lv_style_set_line_color(&styles->lmeter, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_scale_grad_color(&styles->lmeter, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_scale_end_color(&styles->lmeter, LV_STATE_DEFAULT, lv_color_hex3(0x888)); + lv_style_set_line_width(&styles->lmeter, LV_STATE_DEFAULT, LV_DPX(10)); + lv_style_set_scale_end_line_width(&styles->lmeter, LV_STATE_DEFAULT, LV_DPX(7)); +#endif +} + +static void gauge_init(void) +{ +#if LV_USE_GAUGE != 0 + style_init_reset(&styles->gauge_main); + lv_style_set_line_color(&styles->gauge_main, LV_STATE_DEFAULT, lv_color_hex3(0x888)); + lv_style_set_scale_grad_color(&styles->gauge_main, LV_STATE_DEFAULT, lv_color_hex3(0x888)); + lv_style_set_scale_end_color(&styles->gauge_main, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_line_width(&styles->gauge_main, LV_STATE_DEFAULT, LV_DPX(5)); + lv_style_set_scale_end_line_width(&styles->gauge_main, LV_STATE_DEFAULT, LV_DPX(4)); + lv_style_set_scale_end_border_width(&styles->gauge_main, LV_STATE_DEFAULT, LV_DPX(8)); + lv_style_set_pad_left(&styles->gauge_main, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_pad_right(&styles->gauge_main, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_pad_top(&styles->gauge_main, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_pad_inner(&styles->gauge_main, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_scale_width(&styles->gauge_main, LV_STATE_DEFAULT, LV_DPX(15)); + lv_style_set_radius(&styles->gauge_main, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + + style_init_reset(&styles->gauge_strong); + lv_style_set_line_color(&styles->gauge_strong, LV_STATE_DEFAULT, lv_color_hex3(0x888)); + lv_style_set_scale_grad_color(&styles->gauge_strong, LV_STATE_DEFAULT, lv_color_hex3(0x888)); + lv_style_set_scale_end_color(&styles->gauge_strong, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_line_width(&styles->gauge_strong, LV_STATE_DEFAULT, LV_DPX(8)); + lv_style_set_scale_end_line_width(&styles->gauge_strong, LV_STATE_DEFAULT, LV_DPX(8)); + lv_style_set_scale_width(&styles->gauge_strong, LV_STATE_DEFAULT, LV_DPX(25)); + + style_init_reset(&styles->gauge_needle); + lv_style_set_line_color(&styles->gauge_needle, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex(0x464b5b) : LV_COLOR_WHITE); + lv_style_set_line_width(&styles->gauge_needle, LV_STATE_DEFAULT, LV_DPX(8)); + lv_style_set_bg_opa(&styles->gauge_needle, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->gauge_needle, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex(0x464b5b) : LV_COLOR_WHITE); + lv_style_set_radius(&styles->gauge_needle, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_size(&styles->gauge_needle, LV_STATE_DEFAULT, LV_DPX(30)); + lv_style_set_pad_inner(&styles->gauge_needle, LV_STATE_DEFAULT, LV_DPX(10)); +#endif +} + +static void arc_init(void) +{ +#if LV_USE_ARC != 0 + style_init_reset(&styles->arc_indic); + lv_style_set_line_color(&styles->arc_indic, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_line_width(&styles->arc_indic, LV_STATE_DEFAULT, LV_DPX(25)); + lv_style_set_line_rounded(&styles->arc_indic, LV_STATE_DEFAULT, true); + + style_init_reset(&styles->arc_bg); + lv_style_set_line_color(&styles->arc_bg, LV_STATE_DEFAULT, COLOR_BG_SEC); + lv_style_set_line_width(&styles->arc_bg, LV_STATE_DEFAULT, LV_DPX(25)); + lv_style_set_line_rounded(&styles->arc_bg, LV_STATE_DEFAULT, true); + + style_init_reset(&styles->arc_knob); + lv_style_set_radius(&styles->arc_knob, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_pad_top(&styles->arc_knob, LV_STATE_DEFAULT, LV_DPX(0)); + lv_style_set_pad_bottom(&styles->arc_knob, LV_STATE_DEFAULT, LV_DPX(0)); + lv_style_set_pad_left(&styles->arc_knob, LV_STATE_DEFAULT, LV_DPX(0)); + lv_style_set_pad_right(&styles->arc_knob, LV_STATE_DEFAULT, LV_DPX(0)); + +#endif +} + +static void spinner_init(void) +{ +#if LV_USE_SPINNER != 0 +#endif +} + +static void chart_init(void) +{ +#if LV_USE_CHART + style_init_reset(&styles->chart_bg); + lv_style_set_text_color(&styles->chart_bg, LV_STATE_DEFAULT, IS_LIGHT ? COLOR_BG_TEXT_DIS : lv_color_hex(0xa1adbd)); + + style_init_reset(&styles->chart_series_bg); + lv_style_set_line_width(&styles->chart_series_bg, LV_STATE_DEFAULT, LV_DPX(1)); + lv_style_set_line_dash_width(&styles->chart_series_bg, LV_STATE_DEFAULT, LV_DPX(10)); + lv_style_set_line_dash_gap(&styles->chart_series_bg, LV_STATE_DEFAULT, LV_DPX(10)); + lv_style_set_line_color(&styles->chart_series_bg, LV_STATE_DEFAULT, COLOR_BG_BORDER); + + style_init_reset(&styles->chart_series); + lv_style_set_line_width(&styles->chart_series, LV_STATE_DEFAULT, LV_DPX(3)); + lv_style_set_size(&styles->chart_series, LV_STATE_DEFAULT, LV_DPX(4)); + lv_style_set_pad_inner(&styles->chart_series, LV_STATE_DEFAULT, LV_DPX(2)); /*Space between columns*/ + lv_style_set_radius(&styles->chart_series, LV_STATE_DEFAULT, LV_DPX(1)); + +#endif +} + +static void calendar_init(void) +{ +#if LV_USE_CALENDAR + + style_init_reset(&styles->calendar_header); + lv_style_set_pad_top(&styles->calendar_header, LV_STATE_DEFAULT, 0); + lv_style_set_pad_left(&styles->calendar_header, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_right(&styles->calendar_header, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_bottom(&styles->calendar_header, LV_STATE_DEFAULT, 0); + lv_style_set_margin_top(&styles->calendar_header, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_margin_bottom(&styles->calendar_header, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_text_color(&styles->calendar_header, LV_STATE_PRESSED, IS_LIGHT ? lv_color_hex(0x888888) : LV_COLOR_WHITE); + + style_init_reset(&styles->calendar_daynames); + lv_style_set_text_color(&styles->calendar_daynames, LV_STATE_DEFAULT, + IS_LIGHT ? lv_color_hex(0x31404f) : lv_color_hex3(0xeee)); + lv_style_set_pad_left(&styles->calendar_daynames, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_right(&styles->calendar_daynames, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_bottom(&styles->calendar_daynames, LV_STATE_DEFAULT, PAD_DEF); + + style_init_reset(&styles->calendar_date_nums); + lv_style_set_radius(&styles->calendar_date_nums, LV_STATE_DEFAULT, LV_DPX(4)); + lv_style_set_text_color(&styles->calendar_date_nums, LV_STATE_CHECKED, + IS_LIGHT ? lv_color_hex(0x31404f) : LV_COLOR_WHITE); + lv_style_set_text_color(&styles->calendar_date_nums, LV_STATE_DISABLED, LV_COLOR_GRAY); + lv_style_set_bg_opa(&styles->calendar_date_nums, LV_STATE_CHECKED, IS_LIGHT ? LV_OPA_20 : LV_OPA_40); + lv_style_set_bg_opa(&styles->calendar_date_nums, LV_STATE_PRESSED, LV_OPA_20); + lv_style_set_bg_opa(&styles->calendar_date_nums, LV_STATE_FOCUSED, LV_OPA_COVER); + lv_style_set_text_color(&styles->calendar_date_nums, LV_STATE_FOCUSED, LV_COLOR_WHITE); + lv_style_set_bg_color(&styles->calendar_date_nums, LV_STATE_FOCUSED, theme.color_primary); + lv_style_set_bg_color(&styles->calendar_date_nums, LV_STATE_DEFAULT, + IS_LIGHT ? lv_color_hex(0x666666) : LV_COLOR_WHITE); + lv_style_set_bg_color(&styles->calendar_date_nums, LV_STATE_CHECKED, theme.color_primary); + lv_style_set_border_width(&styles->calendar_date_nums, LV_STATE_CHECKED, 2); + lv_style_set_border_side(&styles->calendar_date_nums, LV_STATE_CHECKED, LV_BORDER_SIDE_LEFT); + lv_style_set_border_color(&styles->calendar_date_nums, LV_STATE_CHECKED, theme.color_primary); + lv_style_set_pad_inner(&styles->calendar_date_nums, LV_STATE_DEFAULT, LV_DPX(3)); + lv_style_set_pad_left(&styles->calendar_date_nums, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_right(&styles->calendar_date_nums, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_bottom(&styles->calendar_date_nums, LV_STATE_DEFAULT, PAD_DEF); +#endif +} + +static void cpicker_init(void) +{ +#if LV_USE_CPICKER + style_init_reset(&styles->cpicker_bg); + lv_style_set_scale_width(&styles->cpicker_bg, LV_STATE_DEFAULT, LV_DPX(30)); + lv_style_set_bg_opa(&styles->cpicker_bg, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->cpicker_bg, LV_STATE_DEFAULT, COLOR_SCR); + lv_style_set_pad_inner(&styles->cpicker_bg, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_radius(&styles->cpicker_bg, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + + style_init_reset(&styles->cpicker_indic); + lv_style_set_radius(&styles->cpicker_indic, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_bg_color(&styles->cpicker_indic, LV_STATE_DEFAULT, LV_COLOR_WHITE); + lv_style_set_bg_opa(&styles->cpicker_indic, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_border_width(&styles->cpicker_indic, LV_STATE_DEFAULT, 2); + lv_style_set_border_color(&styles->cpicker_indic, LV_STATE_DEFAULT, LV_COLOR_GRAY); + lv_style_set_border_color(&styles->cpicker_indic, LV_STATE_FOCUSED, theme.color_primary); + lv_style_set_border_color(&styles->cpicker_indic, LV_STATE_EDITED, theme.color_secondary); + lv_style_set_pad_left(&styles->cpicker_indic, LV_STATE_DEFAULT, LV_DPX(13)); + lv_style_set_pad_right(&styles->cpicker_indic, LV_STATE_DEFAULT, LV_DPX(13)); + lv_style_set_pad_top(&styles->cpicker_indic, LV_STATE_DEFAULT, LV_DPX(13)); + lv_style_set_pad_bottom(&styles->cpicker_indic, LV_STATE_DEFAULT, LV_DPX(13)); +#endif +} + +static void checkbox_init(void) +{ +#if LV_USE_CHECKBOX != 0 + style_init_reset(&styles->cb_bg); + lv_style_set_radius(&styles->cb_bg, LV_STATE_DEFAULT, LV_DPX(4)); + lv_style_set_pad_inner(&styles->cb_bg, LV_STATE_DEFAULT, LV_DPX(10)); + lv_style_set_outline_color(&styles->cb_bg, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_outline_opa(&styles->cb_bg, LV_STATE_DEFAULT, LV_OPA_TRANSP); + lv_style_set_outline_opa(&styles->cb_bg, LV_STATE_FOCUSED, LV_OPA_50); + lv_style_set_outline_width(&styles->cb_bg, LV_STATE_DEFAULT, OUTLINE_WIDTH); + lv_style_set_outline_pad(&styles->cb_bg, LV_STATE_DEFAULT, LV_DPX(10)); + lv_style_set_transition_time(&styles->cb_bg, LV_STATE_DEFAULT, TRANSITION_TIME); + lv_style_set_transition_prop_6(&styles->cb_bg, LV_STATE_DEFAULT, LV_STYLE_OUTLINE_OPA); + + style_init_reset(&styles->cb_bullet); + lv_style_set_outline_opa(&styles->cb_bullet, LV_STATE_FOCUSED, LV_OPA_TRANSP); + lv_style_set_radius(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(4)); + lv_style_set_pattern_image(&styles->cb_bullet, LV_STATE_CHECKED, LV_SYMBOL_OK); + lv_style_set_pattern_recolor(&styles->cb_bullet, LV_STATE_CHECKED, LV_COLOR_WHITE); + lv_style_set_pattern_opa(&styles->cb_bullet, LV_STATE_DEFAULT, LV_OPA_TRANSP); + lv_style_set_pattern_opa(&styles->cb_bullet, LV_STATE_CHECKED, LV_OPA_COVER); + lv_style_set_transition_prop_3(&styles->cb_bullet, LV_STATE_DEFAULT, LV_STYLE_PATTERN_OPA); + lv_style_set_text_font(&styles->cb_bullet, LV_STATE_CHECKED, theme.font_small); + lv_style_set_pad_left(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3)); + lv_style_set_pad_right(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3)); + lv_style_set_pad_top(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3)); + lv_style_set_pad_bottom(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3)); +#endif +} + +static void btnmatrix_init(void) +{ +} + +static void keyboard_init(void) +{ +#if LV_USE_KEYBOARD + style_init_reset(&styles->kb_bg); + lv_style_set_radius(&styles->kb_bg, LV_STATE_DEFAULT, 0); + lv_style_set_border_width(&styles->kb_bg, LV_STATE_DEFAULT, LV_DPX(4)); + lv_style_set_border_side(&styles->kb_bg, LV_STATE_DEFAULT, LV_BORDER_SIDE_TOP); + lv_style_set_border_color(&styles->kb_bg, LV_STATE_DEFAULT, IS_LIGHT ? COLOR_BG_TEXT : LV_COLOR_BLACK); + lv_style_set_border_color(&styles->kb_bg, LV_STATE_EDITED, theme.color_secondary); + lv_style_set_pad_left(&styles->kb_bg, LV_STATE_DEFAULT, LV_DPX(5)); + lv_style_set_pad_right(&styles->kb_bg, LV_STATE_DEFAULT, LV_DPX(5)); + lv_style_set_pad_top(&styles->kb_bg, LV_STATE_DEFAULT, LV_DPX(5)); + lv_style_set_pad_bottom(&styles->kb_bg, LV_STATE_DEFAULT, LV_DPX(5)); + lv_style_set_pad_inner(&styles->kb_bg, LV_STATE_DEFAULT, LV_DPX(3)); +#endif +} + +static void msgbox_init(void) +{ +#if LV_USE_MSGBOX + style_init_reset(&styles->mbox_bg); + lv_style_set_shadow_width(&styles->mbox_bg, LV_STATE_DEFAULT, LV_DPX(50)); + lv_style_set_shadow_color(&styles->mbox_bg, LV_STATE_DEFAULT, IS_LIGHT ? LV_COLOR_SILVER : lv_color_hex3(0x999)); + +#endif +} + +static void page_init(void) +{ +#if LV_USE_PAGE + style_init_reset(&styles->sb); + lv_style_set_bg_opa(&styles->sb, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->sb, LV_STATE_DEFAULT, (IS_LIGHT ? lv_color_hex(0xcccfd1) : lv_color_hex(0x777f85))); + lv_style_set_radius(&styles->sb, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_size(&styles->sb, LV_STATE_DEFAULT, LV_DPX(7)); + lv_style_set_pad_right(&styles->sb, LV_STATE_DEFAULT, LV_DPX(7)); + lv_style_set_pad_bottom(&styles->sb, LV_STATE_DEFAULT, LV_DPX(7)); + +#if LV_USE_ANIMATION + style_init_reset(&styles->edge_flash); + lv_style_set_bg_opa(&styles->edge_flash, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->edge_flash, LV_STATE_DEFAULT, lv_color_hex3(0x888)); +#endif +#endif +} + +static void textarea_init(void) +{ +#if LV_USE_TEXTAREA + style_init_reset(&styles->ta_cursor); + lv_style_set_border_color(&styles->ta_cursor, LV_STATE_DEFAULT, COLOR_BG_SEC_TEXT); + lv_style_set_border_width(&styles->ta_cursor, LV_STATE_DEFAULT, LV_DPX(2)); + lv_style_set_pad_left(&styles->ta_cursor, LV_STATE_DEFAULT, LV_DPX(1)); + lv_style_set_border_side(&styles->ta_cursor, LV_STATE_DEFAULT, LV_BORDER_SIDE_LEFT); + + style_init_reset(&styles->ta_placeholder); + lv_style_set_text_color(&styles->ta_placeholder, LV_STATE_DEFAULT, + IS_LIGHT ? COLOR_BG_TEXT_DIS : lv_color_hex(0xa1adbd)); +#endif +} + +static void spinbox_init(void) +{ +#if LV_USE_SPINBOX + + style_init_reset(&styles->spinbox_cursor); + lv_style_set_bg_opa(&styles->spinbox_cursor, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->spinbox_cursor, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_text_color(&styles->spinbox_cursor, LV_STATE_DEFAULT, LV_COLOR_WHITE); + lv_style_set_pad_top(&styles->spinbox_cursor, LV_STATE_DEFAULT, LV_DPX(100)); + lv_style_set_pad_bottom(&styles->spinbox_cursor, LV_STATE_DEFAULT, LV_DPX(100)); + +#endif +} + +static void list_init(void) +{ +#if LV_USE_LIST != 0 + style_init_reset(&styles->list_bg); + lv_style_set_clip_corner(&styles->list_bg, LV_STATE_DEFAULT, true); + lv_style_set_pad_left(&styles->list_bg, LV_STATE_DEFAULT, 0); + lv_style_set_pad_right(&styles->list_bg, LV_STATE_DEFAULT, 0); + lv_style_set_pad_top(&styles->list_bg, LV_STATE_DEFAULT, 0); + lv_style_set_pad_bottom(&styles->list_bg, LV_STATE_DEFAULT, 0); + lv_style_set_pad_inner(&styles->list_bg, LV_STATE_DEFAULT, 0); + + style_init_reset(&styles->list_btn); + lv_style_set_bg_opa(&styles->list_btn, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->list_btn, LV_STATE_DEFAULT, COLOR_BG); + lv_style_set_bg_color(&styles->list_btn, LV_STATE_PRESSED, COLOR_BG_PR); + lv_style_set_bg_color(&styles->list_btn, LV_STATE_DISABLED, COLOR_BG_DIS); + lv_style_set_bg_color(&styles->list_btn, LV_STATE_CHECKED, COLOR_BG_CHK); + lv_style_set_bg_color(&styles->list_btn, LV_STATE_CHECKED | LV_STATE_PRESSED, COLOR_BG_PR_CHK); + + lv_style_set_text_color(&styles->list_btn, LV_STATE_DEFAULT, COLOR_BG_TEXT); + lv_style_set_text_color(&styles->list_btn, LV_STATE_CHECKED, COLOR_BG_TEXT_CHK); + lv_style_set_text_color(&styles->list_btn, LV_STATE_DISABLED, COLOR_BG_TEXT_DIS); + + lv_style_set_image_recolor(&styles->list_btn, LV_STATE_DEFAULT, COLOR_BG_TEXT); + lv_style_set_image_recolor(&styles->list_btn, LV_STATE_CHECKED, COLOR_BG_TEXT_CHK); + lv_style_set_image_recolor(&styles->list_btn, LV_STATE_DISABLED, COLOR_BG_TEXT_DIS); + + lv_style_set_border_side(&styles->list_btn, LV_STATE_DEFAULT, LV_BORDER_SIDE_BOTTOM); + lv_style_set_border_color(&styles->list_btn, LV_STATE_DEFAULT, COLOR_BG_BORDER); + lv_style_set_border_color(&styles->list_btn, LV_STATE_FOCUSED, theme.color_primary); + lv_style_set_border_width(&styles->list_btn, LV_STATE_DEFAULT, 1); + + lv_style_set_outline_color(&styles->list_btn, LV_STATE_FOCUSED, theme.color_secondary); + lv_style_set_outline_width(&styles->list_btn, LV_STATE_FOCUSED, OUTLINE_WIDTH); + lv_style_set_outline_pad(&styles->list_btn, LV_STATE_FOCUSED, -BORDER_WIDTH); + + lv_style_set_pad_left(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_right(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_top(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_bottom(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_inner(&styles->list_btn, LV_STATE_DEFAULT, PAD_DEF); + + lv_style_set_transform_width(&styles->list_btn, LV_STATE_DEFAULT, - PAD_DEF); + lv_style_set_transform_width(&styles->list_btn, LV_STATE_PRESSED, -BORDER_WIDTH); + lv_style_set_transform_width(&styles->list_btn, LV_STATE_CHECKED, -BORDER_WIDTH); + lv_style_set_transform_width(&styles->list_btn, LV_STATE_DISABLED, -BORDER_WIDTH); + lv_style_set_transform_width(&styles->list_btn, LV_STATE_FOCUSED, - BORDER_WIDTH); + + lv_style_set_transition_time(&styles->list_btn, LV_STATE_DEFAULT, TRANSITION_TIME); + lv_style_set_transition_prop_6(&styles->list_btn, LV_STATE_DEFAULT, LV_STYLE_BG_COLOR); + lv_style_set_transition_prop_5(&styles->list_btn, LV_STATE_DEFAULT, LV_STYLE_TRANSFORM_WIDTH); +#endif +} + +static void ddlist_init(void) +{ +#if LV_USE_DROPDOWN != 0 + + style_init_reset(&styles->ddlist_page); + lv_style_set_text_line_space(&styles->ddlist_page, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_clip_corner(&styles->ddlist_page, LV_STATE_DEFAULT, true); + + style_init_reset(&styles->ddlist_sel); + lv_style_set_bg_opa(&styles->ddlist_sel, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->ddlist_sel, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_text_color(&styles->ddlist_sel, LV_STATE_DEFAULT, IS_LIGHT ? lv_color_hex3(0xfff) : lv_color_hex3(0xfff)); + lv_style_set_bg_color(&styles->ddlist_sel, LV_STATE_PRESSED, COLOR_BG_PR); + lv_style_set_text_color(&styles->ddlist_sel, LV_STATE_PRESSED, COLOR_BG_TEXT_PR); +#endif +} + +static void roller_init(void) +{ +#if LV_USE_ROLLER != 0 + style_init_reset(&styles->roller_bg); + lv_style_set_text_line_space(&styles->roller_bg, LV_STATE_DEFAULT, LV_DPX(25)); + + style_init_reset(&styles->roller_sel); + lv_style_set_bg_opa(&styles->roller_sel, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->roller_sel, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_text_color(&styles->roller_sel, LV_STATE_DEFAULT, LV_COLOR_WHITE); +#endif +} + +static void tabview_init(void) +{ +#if LV_USE_TABVIEW != 0 +#endif +} + +static void tileview_init(void) +{ +#if LV_USE_TILEVIEW != 0 +#endif +} + +static void table_init(void) +{ +#if LV_USE_TABLE != 0 + style_init_reset(&styles->table_cell); + lv_style_set_border_color(&styles->table_cell, LV_STATE_DEFAULT, COLOR_BG_BORDER); + lv_style_set_border_width(&styles->table_cell, LV_STATE_DEFAULT, 1); + lv_style_set_border_side(&styles->table_cell, LV_STATE_DEFAULT, LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_BOTTOM); + lv_style_set_pad_left(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_right(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_top(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_bottom(&styles->table_cell, LV_STATE_DEFAULT, PAD_DEF); + +#endif +} + +static void win_init(void) +{ +#if LV_USE_WIN != 0 +#endif +} + +static void tabview_win_shared_init(void) +{ +#if LV_USE_TABVIEW || LV_USE_WIN + style_init_reset(&styles->tabview_btns_bg); + lv_style_set_bg_opa(&styles->tabview_btns_bg, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->tabview_btns_bg, LV_STATE_DEFAULT, COLOR_BG); + lv_style_set_text_color(&styles->tabview_btns_bg, LV_STATE_DEFAULT, COLOR_SCR_TEXT); + lv_style_set_image_recolor(&styles->tabview_btns_bg, LV_STATE_DEFAULT, lv_color_hex(0x979a9f)); + lv_style_set_pad_top(&styles->tabview_btns_bg, LV_STATE_DEFAULT, LV_DPX(7)); + lv_style_set_pad_left(&styles->tabview_btns_bg, LV_STATE_DEFAULT, LV_DPX(7)); + lv_style_set_pad_right(&styles->tabview_btns_bg, LV_STATE_DEFAULT, LV_DPX(7)); + + style_init_reset(&styles->tabview_btns); + lv_style_set_bg_opa(&styles->tabview_btns, LV_STATE_PRESSED, LV_OPA_50); + lv_style_set_bg_color(&styles->tabview_btns, LV_STATE_PRESSED, lv_color_hex3(0x888)); + lv_style_set_text_color(&styles->tabview_btns, LV_STATE_CHECKED, COLOR_SCR_TEXT); + lv_style_set_pad_top(&styles->tabview_btns, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_pad_bottom(&styles->tabview_btns, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_text_color(&styles->tabview_btns, LV_STATE_FOCUSED, theme.color_primary); + lv_style_set_text_color(&styles->tabview_btns, LV_STATE_EDITED, theme.color_secondary); + + style_init_reset(&styles->tabview_indic); + lv_style_set_bg_opa(&styles->tabview_indic, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&styles->tabview_indic, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_bg_color(&styles->tabview_indic, LV_STATE_EDITED, theme.color_secondary); + lv_style_set_size(&styles->tabview_indic, LV_STATE_DEFAULT, LV_DPX(5)); + lv_style_set_radius(&styles->tabview_indic, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + + style_init_reset(&styles->tabview_page_scrl); + lv_style_set_pad_top(&styles->tabview_page_scrl, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_bottom(&styles->tabview_page_scrl, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_left(&styles->tabview_page_scrl, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_right(&styles->tabview_page_scrl, LV_STATE_DEFAULT, PAD_DEF); + lv_style_set_pad_inner(&styles->tabview_page_scrl, LV_STATE_DEFAULT, PAD_DEF); +#endif +} + + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize the default + * @param color_primary the primary color of the theme + * @param color_secondary the secondary color for the theme + * @param flags ORed flags starting with `LV_THEME_DEF_FLAG_...` + * @param font_small pointer to a small font + * @param font_normal pointer to a normal font + * @param font_subtitle pointer to a large font + * @param font_title pointer to a extra large font + * @return a pointer to reference this theme later + */ +lv_theme_t * lv_theme_material_init(lv_color_t color_primary, lv_color_t color_secondary, uint32_t flags, + const lv_font_t * font_small, const lv_font_t * font_normal, const lv_font_t * font_subtitle, + const lv_font_t * font_title) +{ + + /* This trick is required only to avoid the garbage collection of + * styles' data if LVGL is used in a binding (e.g. Micropython) + * In a general case styles could be simple `static lv_style_t my style` variables*/ + if(!inited) { + LV_GC_ROOT(_lv_theme_material_styles) = lv_mem_alloc(sizeof(theme_styles_t)); + styles = (theme_styles_t *)LV_GC_ROOT(_lv_theme_material_styles); + } + + theme.color_primary = color_primary; + theme.color_secondary = color_secondary; + theme.font_small = font_small; + theme.font_normal = font_normal; + theme.font_subtitle = font_subtitle; + theme.font_title = font_title; + theme.flags = flags; + + basic_init(); + cont_init(); + btn_init(); + label_init(); + bar_init(); + img_init(); + line_init(); + led_init(); + slider_init(); + switch_init(); + linemeter_init(); + gauge_init(); + arc_init(); + spinner_init(); + chart_init(); + calendar_init(); + cpicker_init(); + checkbox_init(); + btnmatrix_init(); + keyboard_init(); + msgbox_init(); + page_init(); + textarea_init(); + spinbox_init(); + list_init(); + ddlist_init(); + roller_init(); + tabview_init(); + tileview_init(); + table_init(); + win_init(); + tabview_win_shared_init(); + + theme.apply_xcb = NULL; + theme.apply_cb = theme_apply; + + inited = true; + + lv_obj_report_style_mod(NULL); + + return &theme; +} + + +static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) +{ + LV_UNUSED(th); + + lv_style_list_t * list; + + switch(name) { + case LV_THEME_NONE: + break; + + case LV_THEME_SCR: + list = lv_obj_get_style_list(obj, LV_OBJ_PART_MAIN); + _lv_style_list_add_style(list, &styles->scr); + break; + case LV_THEME_OBJ: + list = lv_obj_get_style_list(obj, LV_OBJ_PART_MAIN); + _lv_style_list_add_style(list, &styles->bg); + break; +#if LV_USE_CONT + case LV_THEME_CONT: + list = lv_obj_get_style_list(obj, LV_CONT_PART_MAIN); + _lv_style_list_add_style(list, &styles->bg); + break; +#endif + +#if LV_USE_BTN + case LV_THEME_BTN: + list = lv_obj_get_style_list(obj, LV_BTN_PART_MAIN); + _lv_style_list_add_style(list, &styles->btn); + break; +#endif + +#if LV_USE_BTNMATRIX + case LV_THEME_BTNMATRIX: + list = lv_obj_get_style_list(obj, LV_BTNMATRIX_PART_BG); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->pad_small); + + list = lv_obj_get_style_list(obj, LV_BTNMATRIX_PART_BTN); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->bg_click); + break; +#endif + +#if LV_USE_KEYBOARD + case LV_THEME_KEYBOARD: + list = lv_obj_get_style_list(obj, LV_KEYBOARD_PART_BG); + _lv_style_list_add_style(list, &styles->scr); + _lv_style_list_add_style(list, &styles->kb_bg); + + list = lv_obj_get_style_list(obj, LV_KEYBOARD_PART_BTN); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->bg_click); + break; +#endif + +#if LV_USE_BAR + case LV_THEME_BAR: + list = lv_obj_get_style_list(obj, LV_BAR_PART_BG); + _lv_style_list_add_style(list, &styles->bar_bg); + + list = lv_obj_get_style_list(obj, LV_BAR_PART_INDIC); + _lv_style_list_add_style(list, &styles->bar_indic); + break; +#endif + +#if LV_USE_SWITCH + case LV_THEME_SWITCH: + list = lv_obj_get_style_list(obj, LV_SWITCH_PART_BG); + _lv_style_list_add_style(list, &styles->bar_bg); + + list = lv_obj_get_style_list(obj, LV_SWITCH_PART_INDIC); + _lv_style_list_add_style(list, &styles->bar_indic); + + list = lv_obj_get_style_list(obj, LV_SWITCH_PART_KNOB); + _lv_style_list_add_style(list, &styles->sw_knob); + break; +#endif + +#if LV_USE_CANVAS + case LV_THEME_CANVAS: + break; +#endif + +#if LV_USE_IMG + case LV_THEME_IMAGE: + break; +#endif + +#if LV_USE_IMGBTN + case LV_THEME_IMGBTN: + break; +#endif + +#if LV_USE_LABEL + case LV_THEME_LABEL: + break; +#endif + +#if LV_USE_LINE + case LV_THEME_LINE: + break; +#endif + +#if LV_USE_ARC + case LV_THEME_ARC: + list = lv_obj_get_style_list(obj, LV_ARC_PART_BG); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->arc_bg); + + list = lv_obj_get_style_list(obj, LV_ARC_PART_INDIC); + _lv_style_list_add_style(list, &styles->arc_indic); + + list = lv_obj_get_style_list(obj, LV_ARC_PART_KNOB); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->bg_click); + _lv_style_list_add_style(list, &styles->arc_knob); + break; +#endif + +#if LV_USE_SPINNER + case LV_THEME_SPINNER: + list = lv_obj_get_style_list(obj, LV_SPINNER_PART_BG); + _lv_style_list_add_style(list, &styles->arc_bg); + + list = lv_obj_get_style_list(obj, LV_SPINNER_PART_INDIC); + _lv_style_list_add_style(list, &styles->arc_indic); + break; +#endif + +#if LV_USE_SLIDER + case LV_THEME_SLIDER: + list = lv_obj_get_style_list(obj, LV_SLIDER_PART_BG); + _lv_style_list_add_style(list, &styles->bar_bg); + _lv_style_list_add_style(list, &styles->slider_bg); + + list = lv_obj_get_style_list(obj, LV_SLIDER_PART_INDIC); + _lv_style_list_add_style(list, &styles->bar_indic); + + list = lv_obj_get_style_list(obj, LV_SLIDER_PART_KNOB); + _lv_style_list_add_style(list, &styles->slider_knob); + break; +#endif + +#if LV_USE_CHECKBOX + case LV_THEME_CHECKBOX: + list = lv_obj_get_style_list(obj, LV_CHECKBOX_PART_BG); + _lv_style_list_add_style(list, &styles->cb_bg); + + list = lv_obj_get_style_list(obj, LV_CHECKBOX_PART_BULLET); + _lv_style_list_add_style(list, &styles->btn); + _lv_style_list_add_style(list, &styles->cb_bullet); + break; +#endif + +#if LV_USE_MSGBOX + case LV_THEME_MSGBOX: + list = lv_obj_get_style_list(obj, LV_MSGBOX_PART_BG); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->mbox_bg); + break; + + case LV_THEME_MSGBOX_BTNS: + list = lv_obj_get_style_list(obj, LV_MSGBOX_PART_BTN_BG); + _lv_style_list_add_style(list, &styles->pad_small); + + list = lv_obj_get_style_list(obj, LV_MSGBOX_PART_BTN); + _lv_style_list_add_style(list, &styles->btn); + break; + +#endif +#if LV_USE_LED + case LV_THEME_LED: + list = lv_obj_get_style_list(obj, LV_LED_PART_MAIN); + _lv_style_list_add_style(list, &styles->led); + break; +#endif +#if LV_USE_PAGE + case LV_THEME_PAGE: + list = lv_obj_get_style_list(obj, LV_PAGE_PART_BG); + _lv_style_list_add_style(list, &styles->bg); + + list = lv_obj_get_style_list(obj, LV_PAGE_PART_SCROLLABLE); + _lv_style_list_add_style(list, &styles->pad_inner); + + list = lv_obj_get_style_list(obj, LV_PAGE_PART_SCROLLBAR); + _lv_style_list_add_style(list, &styles->sb); + +#if LV_USE_ANIMATION + list = lv_obj_get_style_list(obj, LV_PAGE_PART_EDGE_FLASH); + _lv_style_list_add_style(list, &styles->edge_flash); +#endif + break; +#endif +#if LV_USE_TABVIEW + case LV_THEME_TABVIEW: + list = lv_obj_get_style_list(obj, LV_TABVIEW_PART_BG); + _lv_style_list_add_style(list, &styles->scr); + + list = lv_obj_get_style_list(obj, LV_TABVIEW_PART_TAB_BG); + _lv_style_list_add_style(list, &styles->tabview_btns_bg); + + list = lv_obj_get_style_list(obj, LV_TABVIEW_PART_INDIC); + _lv_style_list_add_style(list, &styles->tabview_indic); + + list = lv_obj_get_style_list(obj, LV_TABVIEW_PART_TAB_BTN); + _lv_style_list_add_style(list, &styles->tabview_btns); + break; + + case LV_THEME_TABVIEW_PAGE: + list = lv_obj_get_style_list(obj, LV_PAGE_PART_SCROLLABLE); + _lv_style_list_add_style(list, &styles->tabview_page_scrl); + + break; +#endif + +#if LV_USE_TILEVIEW + case LV_THEME_TILEVIEW: + list = lv_obj_get_style_list(obj, LV_TILEVIEW_PART_BG); + _lv_style_list_add_style(list, &styles->scr); + + list = lv_obj_get_style_list(obj, LV_TILEVIEW_PART_SCROLLBAR); + _lv_style_list_add_style(list, &styles->sb); + +#if LV_USE_ANIMATION + list = lv_obj_get_style_list(obj, LV_TILEVIEW_PART_EDGE_FLASH); + _lv_style_list_add_style(list, &styles->edge_flash); +#endif + break; +#endif + + +#if LV_USE_ROLLER + case LV_THEME_ROLLER: + list = lv_obj_get_style_list(obj, LV_ROLLER_PART_BG); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->roller_bg); + + list = lv_obj_get_style_list(obj, LV_ROLLER_PART_SELECTED); + _lv_style_list_add_style(list, &styles->roller_sel); + break; +#endif + +#if LV_USE_OBJMASK + case LV_THEME_OBJMASK: + list = lv_obj_get_style_list(obj, LV_OBJMASK_PART_MAIN); + break; +#endif + +#if LV_USE_LIST + case LV_THEME_LIST: + list = lv_obj_get_style_list(obj, LV_LIST_PART_BG); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->list_bg); + + + list = lv_obj_get_style_list(obj, LV_LIST_PART_SCROLLBAR); + _lv_style_list_add_style(list, &styles->sb); + break; + + case LV_THEME_LIST_BTN: + list = lv_obj_get_style_list(obj, LV_BTN_PART_MAIN); + _lv_style_list_add_style(list, &styles->list_btn); + break; +#endif + +#if LV_USE_DROPDOWN + case LV_THEME_DROPDOWN: + list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_MAIN); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->bg_click); + _lv_style_list_add_style(list, &styles->pad_small); + + list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_LIST); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->ddlist_page); + + list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_SCROLLBAR); + _lv_style_list_add_style(list, &styles->sb); + + list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_SELECTED); + _lv_style_list_add_style(list, &styles->ddlist_sel); + break; +#endif + +#if LV_USE_CHART + case LV_THEME_CHART: + list = lv_obj_get_style_list(obj, LV_CHART_PART_BG); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->chart_bg); + _lv_style_list_add_style(list, &styles->pad_small); + + list = lv_obj_get_style_list(obj, LV_CHART_PART_SERIES_BG); + _lv_style_list_add_style(list, &styles->pad_small); + _lv_style_list_add_style(list, &styles->chart_series_bg); + + list = lv_obj_get_style_list(obj, LV_CHART_PART_CURSOR); + _lv_style_list_add_style(list, &styles->chart_series_bg); + + list = lv_obj_get_style_list(obj, LV_CHART_PART_SERIES); + _lv_style_list_add_style(list, &styles->chart_series); + break; +#endif +#if LV_USE_TABLE + case LV_THEME_TABLE: { + list = lv_obj_get_style_list(obj, LV_TABLE_PART_BG); + _lv_style_list_add_style(list, &styles->bg); + + int idx = 1; /* start value should be 1, not zero, since cell styles + start at 1 due to presence of LV_TABLE_PART_BG=0 + in the enum (lv_table.h) */ + /* declaring idx outside loop to work with older compilers */ + for(; idx <= LV_TABLE_CELL_STYLE_CNT; idx ++) { + list = lv_obj_get_style_list(obj, idx); + _lv_style_list_add_style(list, &styles->table_cell); + } + break; + } +#endif + +#if LV_USE_WIN + case LV_THEME_WIN: + list = lv_obj_get_style_list(obj, LV_WIN_PART_BG); + _lv_style_list_add_style(list, &styles->scr); + + list = lv_obj_get_style_list(obj, LV_WIN_PART_SCROLLBAR); + _lv_style_list_add_style(list, &styles->sb); + + list = lv_obj_get_style_list(obj, LV_WIN_PART_CONTENT_SCROLLABLE); + _lv_style_list_add_style(list, &styles->tabview_page_scrl); + + list = lv_obj_get_style_list(obj, LV_WIN_PART_HEADER); + _lv_style_list_add_style(list, &styles->tabview_btns_bg); + break; + + case LV_THEME_WIN_BTN: + list = lv_obj_get_style_list(obj, LV_BTN_PART_MAIN); + _lv_style_list_add_style(list, &styles->tabview_btns); + break; +#endif + +#if LV_USE_TEXTAREA + case LV_THEME_TEXTAREA: + list = lv_obj_get_style_list(obj, LV_TEXTAREA_PART_BG); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->pad_small); + + list = lv_obj_get_style_list(obj, LV_TEXTAREA_PART_PLACEHOLDER); + _lv_style_list_add_style(list, &styles->ta_placeholder); + + list = lv_obj_get_style_list(obj, LV_TEXTAREA_PART_CURSOR); + _lv_style_list_add_style(list, &styles->ta_cursor); + + list = lv_obj_get_style_list(obj, LV_TEXTAREA_PART_SCROLLBAR); + _lv_style_list_add_style(list, &styles->sb); + break; + +#endif + + +#if LV_USE_SPINBOX + case LV_THEME_SPINBOX: + list = lv_obj_get_style_list(obj, LV_SPINBOX_PART_BG); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->pad_small); + + list = lv_obj_get_style_list(obj, LV_SPINBOX_PART_CURSOR); + _lv_style_list_add_style(list, &styles->spinbox_cursor); + break; + + case LV_THEME_SPINBOX_BTN: + list = lv_obj_get_style_list(obj, LV_BTN_PART_MAIN); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->bg_click); + break; +#endif + +#if LV_USE_CALENDAR + case LV_THEME_CALENDAR: + list = lv_obj_get_style_list(obj, LV_CALENDAR_PART_BG); + _lv_style_list_add_style(list, &styles->bg); + + list = lv_obj_get_style_list(obj, LV_CALENDAR_PART_DATE); + _lv_style_list_add_style(list, &styles->calendar_date_nums); + + list = lv_obj_get_style_list(obj, LV_CALENDAR_PART_HEADER); + _lv_style_list_add_style(list, &styles->calendar_header); + + list = lv_obj_get_style_list(obj, LV_CALENDAR_PART_DAY_NAMES); + _lv_style_list_add_style(list, &styles->calendar_daynames); + break; +#endif +#if LV_USE_CPICKER + case LV_THEME_CPICKER: + list = lv_obj_get_style_list(obj, LV_CPICKER_PART_MAIN); + _lv_style_list_add_style(list, &styles->cpicker_bg); + + list = lv_obj_get_style_list(obj, LV_CPICKER_PART_KNOB); + _lv_style_list_add_style(list, &styles->cpicker_indic); + break; +#endif + +#if LV_USE_LINEMETER + case LV_THEME_LINEMETER: + list = lv_obj_get_style_list(obj, LV_LINEMETER_PART_MAIN); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->lmeter); + break; +#endif +#if LV_USE_GAUGE + case LV_THEME_GAUGE: + list = lv_obj_get_style_list(obj, LV_GAUGE_PART_MAIN); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->gauge_main); + + list = lv_obj_get_style_list(obj, LV_GAUGE_PART_MAJOR); + _lv_style_list_add_style(list, &styles->gauge_strong); + + list = lv_obj_get_style_list(obj, LV_GAUGE_PART_NEEDLE); + _lv_style_list_add_style(list, &styles->gauge_needle); + break; +#endif + default: + break; + } + + lv_obj_refresh_style(obj, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void style_init_reset(lv_style_t * style) +{ + if(inited) lv_style_reset(style); + else lv_style_init(style); +} + +#endif diff --git a/src/lvgl_mem.h b/src/lvgl_mem.h new file mode 100644 index 0000000..e50ac91 --- /dev/null +++ b/src/lvgl_mem.h @@ -0,0 +1,11 @@ +#pragma once +#include + +#ifdef __cplusplus +extern "C" { +#endif +void *lvgl_malloc(size_t size); +void lvgl_free(void *ptr); +#ifdef __cplusplus +} +#endif diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..e403fb1 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,85 @@ +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "global.h" +#include "esp_task_wdt.h" +#include +#include "power.h" +#include "atracker.h" +#include +#include + +cAirsoftTracker *global = NULL; +SemaphoreHandle_t debugLock = xSemaphoreCreateMutex(); +void setup() { + //Hardware init + esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT); +#ifdef AD_NOSCREEN +// esp_bt_controller_mem_release(ESP_BT_MODE_BTDM); +#endif + Serial.setRxBufferSize(2048); + Serial.begin(115200); + Serial.setDebugOutput(false); + EEPROM.begin(256); + + FS.begin(true); + + uint32_t seed = esp_random(); + DEBUG_MSG("Setting random seed %u\n", seed); + randomSeed(seed); // ESP docs say this is fairly random + + DEBUG_MSG("CPU Clock: %d\n", getCpuFrequencyMhz()); + DEBUG_MSG("Total heap: %d\n", ESP.getHeapSize()); + DEBUG_MSG("Free heap: %d\n", ESP.getFreeHeap()); + DEBUG_MSG("Total PSRAM: %d\n", ESP.getPsramSize()); + DEBUG_MSG("Free PSRAM: %d\n", ESP.getFreePsram()); + + + auto res = esp_task_wdt_init(APP_WATCHDOG_SECS_INIT, true); + assert(res == ESP_OK); + + res = esp_task_wdt_add(NULL); + assert(res == ESP_OK); + + esp_vfs_spiffs_conf_t spiffs_1 = { + .base_path = "/spiffs", + .partition_label = "spiffs", + .max_files = 32, + .format_if_mount_failed = true + }; + + esp_vfs_spiffs_conf_t spiffs_2 = { + .base_path = "/config", + .partition_label = "config", + .max_files = 32, + .format_if_mount_failed = true + }; + SPIFFS.end(); + if(esp_vfs_spiffs_register(&spiffs_1)!=ESP_OK || esp_vfs_spiffs_register(&spiffs_2)!=ESP_OK){ + DEBUG_MSG("An Error has occurred while mounting SPIFFS\n"); + } + + size_t total = 0; + size_t used = 0; + if(esp_spiffs_info(spiffs_1.partition_label, &total, &used) == ESP_OK) + { + DEBUG_MSG("SPIFFS %s used %d, total %d\n",spiffs_1.partition_label, used, total); + } + if(esp_spiffs_info(spiffs_2.partition_label, &total, &used) == ESP_OK) + { + DEBUG_MSG("SPIFFS %s used %d, total %d\n",spiffs_2.partition_label, used, total); + } + + global = new cAirsoftTracker(); + global->init(); + esp_task_wdt_delete(NULL); +} + +void loop() +{ + delay(1000); +} \ No newline at end of file diff --git a/src/mapTiles.cpp b/src/mapTiles.cpp new file mode 100644 index 0000000..a290c44 --- /dev/null +++ b/src/mapTiles.cpp @@ -0,0 +1,400 @@ +#include "mapTiles.h" +#include +#include +#include "config.h" +#include "atcommon.h" + +void sMapTile::clear() +{ + memset(this,0,sizeof(sMapTile)); +} + +bool sMapTile::loadFromJson(const JsonVariant &json, uint32_t baseAddress) +{ + if(json.containsKey("size")&&json.containsKey("bounds")&&json.containsKey("x")&&json.containsKey("y") + &&json.containsKey("address")&&json.containsKey("image_stride")&&json.containsKey("image_size")&&json.containsKey("image_fmt")) + { + sizeX = json["size"][0]; + sizeY = json["size"][1]; + address = json["address"]; + address += baseAddress; + size = json["image_size"]; + stride = json["image_stride"]; + fmt = json["image_fmt"]; + tileX = json["x"]; + tileY = json["y"]; + bound.x0 = json["bounds"][0].as(); + bound.y0 = json["bounds"][1].as(); + bound.x1 = json["bounds"][2].as(); + bound.y1 = json["bounds"][3].as(); + mapSizeX = bound.x1-bound.x0; + mapSizeY = bound.y0-bound.y1; + return true; + } + return false; +} + +cMapZoomLevel::cMapZoomLevel() +{ + clear(); +} + +void cMapZoomLevel::clear() +{ + memset(&m_zlevel,0,sizeof(m_zlevel)); + m_images.clear(); +} + +void cMapZoomLevel::loadFromBinary(std::ifstream &file) +{ + uint16_t cnt = 0; + file.read((char*)&m_zlevel,sizeof(m_zlevel)); + file.read((char*)&cnt,2); + m_images.resize(cnt); + file.read((char*)m_images.data(),cnt*sizeof(sMapTile)); +} + +bool cMapZoomLevel::loadFromJson(const JsonVariant &json, uint32_t baseAddress) +{ + if(json.containsKey("pixel_size")&&json.containsKey("bounds")&&json.containsKey("images")&&json.containsKey("tile_size")&&json.containsKey("id")) + { + clear(); + m_zlevel.id = json["id"]; + m_zlevel.pixelSizeX = json["pixel_size"][0].as(); + m_zlevel.pixelSizeY = json["pixel_size"][1].as(); + m_zlevel.tileSizeX = json["tile_size"][0].as(); + m_zlevel.tileSizeY = json["tile_size"][1].as(); + m_zlevel.bound.x0 = json["bounds"][0].as(); + m_zlevel.bound.y0 = json["bounds"][1].as(); + m_zlevel.bound.x1 = json["bounds"][2].as(); + m_zlevel.bound.y1 = json["bounds"][3].as(); + const JsonVariant &images = json.getMember("images"); + m_images.resize(images.size()); + for(int i=0; i(); + m_map.bound.x0 = json["bounds"][0].as(); + m_map.bound.y0 = json["bounds"][1].as(); + m_map.bound.x1 = json["bounds"][2].as(); + m_map.bound.y1 = json["bounds"][3].as(); + const JsonVariant &zls = json.getMember("tile_matrix"); + for(int i=0; i=0000) + { + itr = m_maps.erase(itr); + continue; + } + } + itr++; + } + +} + +cMapTilesList cMapProcessor::getTilesToRender(double x, double y, double radius) +{ + cMapTilesList result; + cMap *map = NULL; + if(m_lastMap) + { + if(checkMap(x,y,*m_lastMap)) + { + map = m_lastMap; + } + else + { + m_lastMap = NULL; + } + } + if(!map) + { + for(auto itr=m_maps.begin(); itr!=m_maps.end(); itr++) + { + if(checkMap(x,y,*itr)) + { + m_lastMap = &*itr; + map = m_lastMap; + } + } +// if(map) +// clearUnusedMaps(x,y); + } + if(map) + { + if(!map->isLoaded()) + { + map->loadMapData(); + if(m_callbacks) + m_callbacks->onMapLoad(map); + } + double zoomDiff = 0; + cMapZoomLevel *zoomLevel = NULL; + cMapZoomLevels &zls = map->getMapZoomLevels(); + for(auto itr=zls.begin(); itr!=zls.end(); itr++) + { + sMapZoomLevel &zl = itr->getZoomLevel(); + double zoomSize = std::max(abs(zl.tileSizeX),abs(zl.tileSizeY))/2; + if(!zoomLevel || abs(zoomSize-radius)getImages(); + sBoundaries sb = getScreenBoundaries(x,y,radius); + for(auto itr=tiles.begin(); itr !=tiles.end(); itr++) + { + if(checkIntersection(sb,itr->bound)) + { + result.push_back(*itr); + } + } + } + } + return result; +} + +bool cMapProcessor::checkMap(const double &x, const double &y,cMap &map) +{ + return isPointInside(x,y,map.getMap().bound); +} + +bool cMapProcessor::checkIntersection(const sBoundaries &b1, const sBoundaries &b2) const +{ + return isPointInside(b1.x0,b1.y0,b2) || isPointInside(b1.x1,b1.y0,b2) || isPointInside(b1.x0,b1.y1,b2) || isPointInside(b1.x1,b1.y1,b2) || + isPointInside(b2.x0,b2.y0,b1) || isPointInside(b2.x1,b2.y0,b1) || isPointInside(b2.x0,b2.y1,b1) || isPointInside(b2.x1,b2.y1,b1); +} + +void cMapProcessor::calcTile(double x, double y, const sMapTile &tile, double radius, double heading, double &scaleX, double &scaleY, double &tx, double &ty) +{ + scaleX = (tile.mapSizeX)/(radius*2); + scaleY = (tile.mapSizeY)/(radius*2); + tx = (tile.bound.x0-x)*tile.sizeX/tile.mapSizeX;//*(240/(240+3/scaleX)); + ty = (y-tile.bound.y0)*tile.sizeY/tile.mapSizeY;//*(240/(240+3/scaleY)); +} + +double cMapProcessor::calcDistanceC(double x, double y) +{ + double lat1,lng1; + double lat2,lng2; + convertMeterToDegree(x,y,lng1,lat1); + convertMeterToDegree(x,y+1000,lng2,lat2); + double d = distanceBetween(lat1, lng1, lat2, lng2); + if(d>0) + return abs(1000/d); + else + return 1; +} \ No newline at end of file diff --git a/src/mapTiles.h b/src/mapTiles.h new file mode 100644 index 0000000..661788f --- /dev/null +++ b/src/mapTiles.h @@ -0,0 +1,150 @@ +#pragma once +#define ARDUINOJSON_USE_DOUBLE 1 +#include +#include +#include +#include +#include +#include + +#pragma pack(push, 1) +//16 +struct sBoundaries +{ + float x0; + float y0; + float x1; + float y1; +}; + +//44 +struct sMapTile +{ + uint32_t address; + uint32_t size; + uint16_t sizeX; + uint16_t sizeY; + uint16_t stride; + uint16_t fmt; + uint16_t tileX; + uint16_t tileY; + float mapSizeX; + float mapSizeY; + sBoundaries bound; + sMapTile() { clear(); } + void clear(); + bool loadFromJson(const JsonVariant &json, uint32_t baseAddress); +}; + +//34 +struct sMapZoomLevel +{ + uint16_t id; + sBoundaries bound; + float pixelSizeX; + float pixelSizeY; + float tileSizeX; + float tileSizeY; +}; + +typedef std::vector cMapTiles; +typedef std::list cMapTilesList; +class cMapZoomLevel +{ +protected: + sMapZoomLevel m_zlevel; + cMapTiles m_images; +public: + cMapZoomLevel(); + + sMapZoomLevel &getZoomLevel() + { + return m_zlevel; + } + void clear(); + bool loadFromJson(const JsonVariant &json, uint32_t baseAddress); + void loadFromBinary(std::ifstream &file); + cMapTiles &getImages(); +}; + +//60 +struct sMap +{ + char name[32]; + sBoundaries bound; + uint32_t baseAddress; + uint32_t filePosition; + uint32_t size; +}; + +typedef std::vector cMapZoomLevels; +class cMap +{ +protected: + sMap m_map; + cMapZoomLevels m_zoomLevels; + bool m_loaded; + std::string m_binaryFileName; +public: + cMap(); + sMap &getMap() + { + return m_map; + } + void clear(); + bool loadFromJson(const JsonVariant &json); + cMapZoomLevels &getMapZoomLevels() + { + return m_zoomLevels; + } + void loadHeader(std::ifstream &file,const char *fileName); + void loadMapData(); + bool isLoaded() { return m_loaded; } +}; + + +typedef std::vector cMapsList; +class cMaps +{ +protected: + cMapsList m_maps; +public: + cMaps(); + cMapsList &getMaps() + { + return m_maps; + } + bool loadFromJson(const char *filename); + bool loadFromBinary(const char *filename); + bool loadMapData(sMap *m_map); +}; + +class cMapProcessorCallbacks +{ +public: + virtual void onMapLoad(cMap *map)=0; +}; + +class cMapProcessor +{ +protected: + cMapsList &m_maps; + cMap *m_lastMap; + cMapProcessorCallbacks *m_callbacks; + bool checkMap(const double &x, const double &y,cMap &map); + void clearUnusedMaps(double x, double y); +public: + cMapProcessor(cMapsList &maps,cMapProcessorCallbacks *callbacks); + sBoundaries getScreenBoundaries(double x, double y, double radius) const; + cMapTilesList getTilesToRender(double x, double y, double radius); + bool checkIntersection(const sBoundaries &b1, const sBoundaries &b2) const; + bool isPointInside(const double &x, const double &y,const sBoundaries &b) const + { + return (x>=b.x0 && x<=b.x1 && y>=b.y1 && y<=b.y0); + } + + double calcDistanceC(double x, double y); + void calcTile(double x, double y, const sMapTile &tile, double radius, double heading, double &scaleX, double &scaleY, double &tx, double &ty); +}; + +#pragma pack(pop) \ No newline at end of file diff --git a/src/power.h b/src/power.h new file mode 100644 index 0000000..1d35eea --- /dev/null +++ b/src/power.h @@ -0,0 +1,46 @@ +#pragma once +#include "concurrency/PeriodicTask.h" +#include "PowerStatus.h" + +#define MIN_BAT_MILLIVOLTS 3250 // millivolts. 10% per https://blog.ampow.com/lipo-voltage-chart/ + +#define BAT_MILLIVOLTS_FULL 4100 +#define BAT_MILLIVOLTS_EMPTY 3500 + +#ifdef HAS_AXP20X +#include "axp20x.h" +#endif + +class Power : public concurrency::PeriodicTask +{ +#ifdef HAS_AXP20X +protected: + AXP20X_Class axp; +#endif +public: + Observable newStatus; + + void readPowerStatus(); + int loop(); + virtual bool setup(); + virtual void doTask(); + void setStatusHandler(PowerStatus *handler) + { + statusHandler = handler; + } + + void gpsOff(); + void gpsOn(); + void shutdown(); +#ifdef HAS_AXP20X + AXP20X_Class &getAXP() + { + return axp; + } +#endif +protected: + PowerStatus *statusHandler; +#ifdef HAS_AXP20X + virtual void axp192Init(); +#endif +}; diff --git a/src/progCommon.h b/src/progCommon.h new file mode 100644 index 0000000..e736f01 --- /dev/null +++ b/src/progCommon.h @@ -0,0 +1,29 @@ +#pragma once +#include + +#pragma pack(push, 1) + +#define PMC_SCREEN_FLASH_START 1 +#define PMC_SCREEN_FLASH_START_RESPONSE 2 +#define PMC_SCREEN_FLASH_END 3 +#define PMC_SCREEN_FLASH_WRITE 4 +#define PMC_SCREEN_FLASH_WRITE_COMPRESS 14 +#define PMC_SCREEN_FLASH_READ 5 +#define PMC_SCREEN_FLASH_READ_RESPONSE 6 +#define PMC_SCREEN_FLASH_META_START 7 +#define PMC_SCREEN_FLASH_META_DATA 8 +#define PMC_SCREEN_FLASH_META_END 9 +#define PMC_SCREEN_FLASH_FILE_START 10 +#define PMC_SCREEN_FLASH_FILE_DATA 11 +#define PMC_SCREEN_FLASH_FILE_END 12 +#define PMC_SCREEN_FLASH_EXIT 99 +#define PMC_SCREEN_FLASH_ACK 100 +#define PMC_SCREEN_FLASH_ERR 101 + +struct sPMCFlashBlock +{ + uint16_t size; + uint32_t address; +}; + +#pragma pack(pop) \ No newline at end of file diff --git a/src/radio/LoraDevRF95.h b/src/radio/LoraDevRF95.h new file mode 100644 index 0000000..d346d60 --- /dev/null +++ b/src/radio/LoraDevRF95.h @@ -0,0 +1,64 @@ +#pragma once +#include "LoraRadio.h" +#include "RadioLibRF95.h" + + +class cLoraDeviceRF95:public cLoraDevice +{ +protected: + Module m_module; + RadioLibRF95 m_lora; +public: + cLoraDeviceRF95(sRFModuleConfig &moduleConfig,cLoraChannelCondfig &channelConfig):cLoraDevice(channelConfig), + m_module(moduleConfig.cs, moduleConfig.irq, moduleConfig.rst, moduleConfig.busy, *moduleConfig.spi, *moduleConfig.spiSettings), + m_lora(&m_module) + { + m_intf = &m_lora; + } + + virtual int16_t applyConfig() + { + return m_lora.begin(m_config.freq, m_config.bw, m_config.sf, m_config.cr, m_config.syncWord, m_config.power, m_config.currentLimit, m_config.preambleLength, 0); + } + + virtual void applyConfig(const cLoraChannelCondfig &channelConfig) + { + m_lora.setFrequency(channelConfig.freq); + m_lora.setBandwidth(channelConfig.bw); + m_lora.setSpreadingFactor(channelConfig.sf); + m_lora.setCodingRate(channelConfig.cr); + m_lora.setSyncWord(channelConfig.syncWord); + m_lora.setPreambleLength(channelConfig.preambleLength); + } + + virtual float getRSSI() + { + return m_lora.getRSSI(); + } + + virtual float getSNR() + { + return m_lora.getSNR(); + } + + + virtual int16_t startReceive(uint8_t len = 0) + { + return m_lora.startReceive(len, SX127X_RXCONTINUOUS); + } + + virtual void setDio0Action(void (*func)(void)) + { + m_lora.setDio0Action(func); + } + + virtual void clearDio0Action() + { + m_lora.clearDio0Action(); + } + + virtual void reset() + { + m_lora.reset(); + } +}; diff --git a/src/radio/LoraDevSX1262.h b/src/radio/LoraDevSX1262.h new file mode 100644 index 0000000..1bf9db1 --- /dev/null +++ b/src/radio/LoraDevSX1262.h @@ -0,0 +1,105 @@ +#pragma once +#include "LoraRadio.h" +#include + +class cLoraDeviceSX1262:public cLoraDevice +{ +protected: + Module m_module; + SX1262 m_lora; +public: + cLoraDeviceSX1262(sRFModuleConfig &moduleConfig,cLoraChannelCondfig &channelConfig):cLoraDevice(channelConfig), + m_module(moduleConfig.cs, moduleConfig.irq, moduleConfig.rst, moduleConfig.busy, *moduleConfig.spi, *moduleConfig.spiSettings), + m_lora(&m_module) + { + m_intf = &m_lora; + } + + virtual int16_t applyConfig() + { +#ifndef SX1262_E22 + float tcxoVoltage = 0; // None - we use an XTAL +#else + float tcxoVoltage = + 1.8; // E22 uses DIO3 to power tcxo per https://github.com/jgromes/RadioLib/issues/12#issuecomment-520695575 +#endif + bool useRegulatorLDO = false; // Seems to depend on the connection to pin 9/DCC_SW - if an inductor DCDC? + + if (m_config.power == 0) + m_config.power = 22; + + if (m_config.power > 22) // This chip has lower power limits than some + m_config.power = 22; + + int16_t result = m_lora.begin(m_config.freq, m_config.bw, m_config.sf, m_config.cr, m_config.syncWord, m_config.power, m_config.currentLimit, m_config.preambleLength, tcxoVoltage,useRegulatorLDO); + m_lora.setRxGain(true); + return result; + } + + virtual void applyConfig(const cLoraChannelCondfig &channelConfig) + { + m_lora.setFrequency(channelConfig.freq); + m_lora.setBandwidth(channelConfig.bw); + m_lora.setSpreadingFactor(channelConfig.sf); + m_lora.setCodingRate(channelConfig.cr); + m_lora.setSyncWord(channelConfig.syncWord); + m_lora.setPreambleLength(channelConfig.preambleLength); + } + + virtual float getRSSI() + { + return m_lora.getRSSI(); + } + + virtual float getSNR() + { + return m_lora.getSNR(); + } + + + virtual int16_t startReceive(uint8_t len = 0) + { + uint16_t result = m_lora.startReceive(); + m_lora.setDioIrqParams(SX126X_IRQ_PREAMBLE_DETECTED | SX126X_IRQ_HEADER_VALID | SX126X_IRQ_RX_DONE | SX126X_IRQ_TIMEOUT | SX126X_IRQ_CRC_ERR | SX126X_IRQ_HEADER_ERR, + SX126X_IRQ_PREAMBLE_DETECTED | SX126X_IRQ_RX_DONE | SX126X_IRQ_CRC_ERR | SX126X_IRQ_HEADER_ERR); + return result; + } + + virtual void setDio0Action(void (*func)(void)) + { + m_lora.setDio1Action(func); + } + + virtual void clearIrqStatus(uint16_t s) + { + m_lora.clearIrqStatus(s); + } + + virtual void clearPreambleIrq() + { + clearIrqStatus(SX126X_IRQ_PREAMBLE_DETECTED); + } + + virtual bool isPreambleIrq(uint16_t status) + { + return status & SX126X_IRQ_PREAMBLE_DETECTED; + } + + virtual bool isRxDoneIrq(uint16_t status) + { + return status & SX126X_IRQ_RX_DONE; + } + + + virtual void clearDio0Action() + { + m_lora.clearDio1Action(); + } + + virtual void reset() + { + m_lora.reset(); + } + + virtual uint32_t getIrqStatus() { return m_lora.getIrqStatus(); } +}; diff --git a/src/radio/LoraRadio.cpp b/src/radio/LoraRadio.cpp new file mode 100644 index 0000000..1708959 --- /dev/null +++ b/src/radio/LoraRadio.cpp @@ -0,0 +1 @@ +#include "LoraRadio.h" diff --git a/src/radio/LoraRadio.h b/src/radio/LoraRadio.h new file mode 100644 index 0000000..09b8837 --- /dev/null +++ b/src/radio/LoraRadio.h @@ -0,0 +1,94 @@ +#pragma once + +#include +#include + +struct sRFModuleConfig +{ + RADIOLIB_PIN_TYPE cs; + RADIOLIB_PIN_TYPE irq; + RADIOLIB_PIN_TYPE rst; + RADIOLIB_PIN_TYPE busy; + SPIClass *spi; + SPISettings *spiSettings; +}; + + +#define LR_SYNC 0x31 +class cLoraChannelCondfig +{ +public: + float freq; + float bw; + uint8_t sf; + uint8_t cr; + uint16_t preambleLength; + uint8_t syncWord; + int8_t power; + uint8_t currentLimit; + + cLoraChannelCondfig() + { + freq = 915.0; + bw = 125.0; + sf = 9; + cr = 7; + preambleLength = 8; + syncWord = LR_SYNC; + power = 17; + currentLimit = 140; + } +}; + +class cLoraDevice +{ +protected: + PhysicalLayer *m_intf; + cLoraChannelCondfig m_config; +public: + cLoraDevice(cLoraChannelCondfig &channelConfig):m_intf(NULL),m_config(channelConfig) + { + + } + + virtual ~cLoraDevice(){}; + + virtual int16_t applyConfig()=0; + virtual void applyConfig(const cLoraChannelCondfig &channelConfig)=0; + virtual int16_t transmit(uint8_t* data, size_t len) + { + return m_intf->transmit(data,len); + } + + virtual int16_t receive(uint8_t* data, size_t len) + { + return m_intf->receive(data, len); + } + + virtual size_t getPacketLength(bool update = true) + { + return m_intf->getPacketLength(update); + } + + virtual float getRSSI()=0; + virtual float getSNR()=0; + + virtual int16_t startReceive(uint8_t len = 0) = 0; + virtual void setDio0Action(void (*func)(void)) = 0; + virtual void clearDio0Action() = 0; + virtual int16_t readData(uint8_t* data, size_t len) + { + return m_intf->readData(data,len); + } + + virtual void reset() = 0; + virtual uint32_t getIrqStatus() { return 0; } + virtual void clearIrqStatus(uint16_t s) {} + virtual void clearPreambleIrq() {} + virtual bool isPreambleIrq(uint16_t status) { return false; } + virtual bool isRxDoneIrq(uint16_t status) { return true; } + PhysicalLayer *getIntf() + { + return m_intf; + } +}; \ No newline at end of file diff --git a/src/radio/RadioLibRF95.cpp b/src/radio/RadioLibRF95.cpp new file mode 100644 index 0000000..c82c1b0 --- /dev/null +++ b/src/radio/RadioLibRF95.cpp @@ -0,0 +1,68 @@ +#include "RadioLibRF95.h" + +#define RF95_CHIP_VERSION 0x12 +#define RF95_ALT_VERSION 0x11 // Supposedly some versions of the chip have id 0x11 + +RadioLibRF95::RadioLibRF95(Module *mod) : SX1278(mod) {} + +int16_t RadioLibRF95::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint8_t currentLimit, + uint16_t preambleLength, uint8_t gain) +{ + // execute common part + int16_t state = SX127x::begin(RF95_CHIP_VERSION, syncWord, currentLimit, preambleLength); + if (state != ERR_NONE) + state = SX127x::begin(RF95_ALT_VERSION, syncWord, currentLimit, preambleLength); + RADIOLIB_ASSERT(state); + + // configure settings not accessible by API + state = config(); + RADIOLIB_ASSERT(state); + + // configure publicly accessible settings + state = setFrequency(freq); + RADIOLIB_ASSERT(state); + + state = setBandwidth(bw); + RADIOLIB_ASSERT(state); + + state = setSpreadingFactor(sf); + RADIOLIB_ASSERT(state); + + state = setCodingRate(cr); + RADIOLIB_ASSERT(state); + + state = setOutputPower(power); + RADIOLIB_ASSERT(state); + + state = setGain(gain); + + return (state); +} + +int16_t RadioLibRF95::setFrequency(float freq) +{ + // RADIOLIB_CHECK_RANGE(freq, 862.0, 1020.0, ERR_INVALID_FREQUENCY); + + // set frequency + return (SX127x::setFrequencyRaw(freq)); +} + +#define RH_RF95_MODEM_STATUS_CLEAR 0x10 +#define RH_RF95_MODEM_STATUS_HEADER_INFO_VALID 0x08 +#define RH_RF95_MODEM_STATUS_RX_ONGOING 0x04 +#define RH_RF95_MODEM_STATUS_SIGNAL_SYNCHRONIZED 0x02 +#define RH_RF95_MODEM_STATUS_SIGNAL_DETECTED 0x01 + +bool RadioLibRF95::isReceiving() +{ + // 0x0b == Look for header info valid, signal synchronized or signal detected + uint8_t reg = readReg(SX127X_REG_MODEM_STAT); + // Serial.printf("reg %x\n", reg); + return (reg & (RH_RF95_MODEM_STATUS_SIGNAL_DETECTED | RH_RF95_MODEM_STATUS_SIGNAL_SYNCHRONIZED | + RH_RF95_MODEM_STATUS_HEADER_INFO_VALID)) != 0; +} + +uint8_t RadioLibRF95::readReg(uint8_t addr) +{ + return _mod->SPIreadRegister(addr); +} \ No newline at end of file diff --git a/src/radio/RadioLibRF95.h b/src/radio/RadioLibRF95.h new file mode 100644 index 0000000..c1d1ef0 --- /dev/null +++ b/src/radio/RadioLibRF95.h @@ -0,0 +1,74 @@ +#pragma once +#include + + +/*! + \class RFM95 + + \brief Derived class for %RFM95 modules. Overrides some methods from SX1278 due to different parameter ranges. +*/ +class RadioLibRF95: public SX1278 { + public: + + // constructor + + /*! + \brief Default constructor. Called from Arduino sketch when creating new LoRa instance. + + \param mod Instance of Module that will be used to communicate with the %LoRa chip. + */ + RadioLibRF95(Module* mod); + + // basic methods + + /*! + \brief %LoRa modem initialization method. Must be called at least once from Arduino sketch to initialize the module. + + \param freq Carrier frequency in MHz. Allowed values range from 868.0 MHz to 915.0 MHz. + + \param bw %LoRa link bandwidth in kHz. Allowed values are 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250 and 500 kHz. + + \param sf %LoRa link spreading factor. Allowed values range from 6 to 12. + + \param cr %LoRa link coding rate denominator. Allowed values range from 5 to 8. + + \param syncWord %LoRa sync word. Can be used to distinguish different networks. Note that value 0x34 is reserved for LoRaWAN networks. + + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. + + \param currentLimit Trim value for OCP (over current protection) in mA. Can be set to multiplies of 5 in range 45 to 120 mA and to multiples of 10 in range 120 to 240 mA. + Set to 0 to disable OCP (not recommended). + + \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. + Allowed values range from 6 to 65535. + + \param gain Gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain. + Set to 0 to enable automatic gain control (recommended). + + \returns \ref status_codes + */ + int16_t begin(float freq = 915.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX127X_SYNC_WORD, int8_t power = 17, uint8_t currentLimit = 100, uint16_t preambleLength = 8, uint8_t gain = 0); + + // configuration methods + + /*! + \brief Sets carrier frequency. Allowed values range from 868.0 MHz to 915.0 MHz. + + \param freq Carrier frequency to be set in MHz. + + \returns \ref status_codes + */ + int16_t setFrequency(float freq); + + // Return true if we are actively receiving a message currently + bool isReceiving(); + + /// For debugging + uint8_t readReg(uint8_t addr); + +#ifndef RADIOLIB_GODMODE + private: +#endif + +}; + diff --git a/src/timing.cpp b/src/timing.cpp new file mode 100644 index 0000000..f7cffaa --- /dev/null +++ b/src/timing.cpp @@ -0,0 +1,10 @@ +#include "timing.h" +#include "freertosinc.h" + +namespace timing { + + uint32_t millis() { + return xTaskGetTickCount(); + } + +} // namespace timing diff --git a/src/timing.h b/src/timing.h new file mode 100644 index 0000000..7f741d4 --- /dev/null +++ b/src/timing.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +namespace timing { + + uint32_t millis(); + +} // namespace timing \ No newline at end of file diff --git a/src/utils.cpp b/src/utils.cpp new file mode 100644 index 0000000..4cfa12b --- /dev/null +++ b/src/utils.cpp @@ -0,0 +1,18 @@ +#include +#include "utils.h" + +void getMacAddr(uint8_t *dmac) +{ + assert(esp_efuse_mac_get_default(dmac) == ESP_OK); +} + +const char *getDeviceName() +{ + uint8_t dmac[6]; + + getMacAddr(dmac); + + static char name[20]; + sprintf(name, "BOMB_%02x%02x", dmac[4], dmac[5]); + return name; +} diff --git a/src/utils.h b/src/utils.h new file mode 100644 index 0000000..e768dcd --- /dev/null +++ b/src/utils.h @@ -0,0 +1,43 @@ +#pragma once +#include +#include "concurrency/Lock.h" +#include "concurrency/LockGuard.h" + +template +class cProtectedQueue:public std::queue +{ +protected: + concurrency::Lock m_lock; + uint16_t m_max; +public: + cProtectedQueue(uint16_t _max) + { + m_max = _max; + } + + void lock() + { + m_lock.lock(); + } + + void unlock() + { + m_lock.unlock(); + } + + void push_item(const T& item) + { + concurrency::LockGuard lock(&m_lock); + std::queue::push(item); + while(std::queue::size()>m_max) + std::queue::pop(); + } + +}; + +template +constexpr const T& clamp( const T& v, const T& lo, const T& hi ) { + return (v < lo) ? lo : (hi < v) ? hi : v; +} + +const char *getDeviceName(); diff --git a/version b/version new file mode 100644 index 0000000..ab3ddac --- /dev/null +++ b/version @@ -0,0 +1 @@ +1.0.1203 \ No newline at end of file