From 705f27fda9e37d1e76a6e32a202db0b029a6f7f0 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Fri, 10 Nov 2023 19:52:06 +0100 Subject: [PATCH] Improved QR-code setup, added MCAP screen --- data/src/css/style.scss | 8 + data/src/index.html | 2 +- data/src/js/helpers.js | 3 + data/src/js/script.ts | 2 +- lib/qrcode/qrcodegen.c | 3 + lib/qrcode/qrcodegen.h | 4 + platformio.ini | 6 + src/fonts/antonio-semibold30.h | 954 +++++++++++++++++++++++++++++++++ src/fonts/fonts.hpp | 2 +- src/lib/block_notify.cpp | 7 +- src/lib/button_handler.hpp | 2 - src/lib/config.cpp | 42 +- src/lib/config.hpp | 1 + src/lib/epd.cpp | 39 +- src/lib/epd.hpp | 6 + src/lib/led_handler.cpp | 55 +- src/lib/led_handler.hpp | 5 +- src/lib/price_notify.cpp | 6 +- src/lib/screen_handler.cpp | 41 +- src/lib/screen_handler.hpp | 3 +- src/lib/shared.hpp | 8 +- src/lib/utils.cpp | 20 + src/lib/utils.hpp | 3 + src/lib/webserver.cpp | 62 +-- src/main.cpp | 1 + 25 files changed, 1197 insertions(+), 88 deletions(-) create mode 100644 src/fonts/antonio-semibold30.h diff --git a/data/src/css/style.scss b/data/src/css/style.scss index fe56410..6c9ed74 100644 --- a/data/src/css/style.scss +++ b/data/src/css/style.scss @@ -102,6 +102,14 @@ nav { text-align: center; } +.mediumText { + font-size: 3rem; + padding-left: 5px; + padding-right: 5px; + padding-top: 20px !important; + padding-bottom: 20px !important; +} + .digit { font-size: 5rem; padding-left: 10px; diff --git a/data/src/index.html b/data/src/index.html index af72f1e..1c276ea 100644 --- a/data/src/index.html +++ b/data/src/index.html @@ -125,7 +125,7 @@
-
+
Loading, please wait...
diff --git a/data/src/js/helpers.js b/data/src/js/helpers.js index b72a537..5a47d5b 100644 --- a/data/src/js/helpers.js +++ b/data/src/js/helpers.js @@ -5,6 +5,9 @@ Handlebars.registerHelper('splitText', function (aString) { var c = aString.split("/").map((el) => { return "
" + el + "
"; }).join(''); return "
" + c + "
"; } + if (aString.length > 1) { + return "
" + aString + "
"; + } if (aString.length == 0 || aString === " ") { aString = "  "; } diff --git a/data/src/js/script.ts b/data/src/js/script.ts index 35b217e..bd44a6b 100644 --- a/data/src/js/script.ts +++ b/data/src/js/script.ts @@ -1,6 +1,6 @@ import './helpers.js'; -var screens = ["Block Height", "Moscow Time", "Ticker", "Time", "Halving countdown"]; +var screens = ["Block Height", "Moscow Time", "Ticker", "Time", "Halving countdown", "Market Cap"]; toTime = (secs) => { var hours = Math.floor(secs / (60 * 60)); diff --git a/lib/qrcode/qrcodegen.c b/lib/qrcode/qrcodegen.c index 871bc92..2a914b7 100644 --- a/lib/qrcode/qrcodegen.c +++ b/lib/qrcode/qrcodegen.c @@ -1,3 +1,5 @@ +#ifdef USE_QR + /* * QR Code generator library (C) * @@ -1026,3 +1028,4 @@ static int numCharCountBits(enum qrcodegen_Mode mode, int version) { #undef LENGTH_OVERFLOW +#endif \ No newline at end of file diff --git a/lib/qrcode/qrcodegen.h b/lib/qrcode/qrcodegen.h index 6bbc157..66cb6c7 100644 --- a/lib/qrcode/qrcodegen.h +++ b/lib/qrcode/qrcodegen.h @@ -20,6 +20,7 @@ * out of or in connection with the Software or the use or other dealings in the * Software. */ +#ifdef USE_QR #pragma once @@ -383,3 +384,6 @@ bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y); #ifdef __cplusplus } #endif + + +#endif \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 2e2de37..449e5a7 100644 --- a/platformio.ini +++ b/platformio.ini @@ -51,3 +51,9 @@ build_flags = -D NUM_SCREENS=7 build_unflags = ${btclock_base.build_unflags} + +[env:lolin_s3_mini_qr] +extends = env:lolin_s3_mini +build_flags = + ${env:lolin_s3_mini.build_flags} + -D USE_QR diff --git a/src/fonts/antonio-semibold30.h b/src/fonts/antonio-semibold30.h new file mode 100644 index 0000000..4ce97fc --- /dev/null +++ b/src/fonts/antonio-semibold30.h @@ -0,0 +1,954 @@ +const uint8_t Antonio_SemiBold30pt7bBitmaps[] PROGMEM = { + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xE7, + 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x9F, 0x3E, 0x7C, 0xF9, + 0xF3, 0xE3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xBF, 0x7E, 0xFC, 0xF9, 0xF3, 0xE7, 0x8F, 0x1E, 0x3C, 0x78, + 0xF1, 0xE0, 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x07, 0xC0, 0x07, 0xC1, 0xF0, + 0x01, 0xF0, 0x7C, 0x00, 0x7C, 0x1F, 0x00, 0x1F, 0x07, 0xC0, 0x07, 0xC1, + 0xF0, 0x01, 0xE0, 0xF8, 0x00, 0xF8, 0x3E, 0x00, 0x3E, 0x0F, 0x80, 0x0F, + 0x83, 0xE0, 0x03, 0xE0, 0xF8, 0x00, 0xF8, 0x3E, 0x00, 0x3C, 0x1F, 0x00, + 0x1F, 0x07, 0xC0, 0x07, 0xC1, 0xF0, 0x3F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, + 0xF3, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x03, 0xE0, 0xF8, 0x00, 0xF8, + 0x3E, 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x83, 0xE0, 0x03, 0xE0, 0xF8, 0x00, + 0xF0, 0x3C, 0x00, 0x7C, 0x1F, 0x00, 0x1F, 0x07, 0xC0, 0x07, 0xC1, 0xF0, + 0x3F, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, + 0xFF, 0x83, 0xE0, 0xF8, 0x00, 0xF8, 0x3E, 0x00, 0x3E, 0x0F, 0x80, 0x0F, + 0x83, 0xE0, 0x03, 0xE0, 0xF8, 0x01, 0xF0, 0x7C, 0x00, 0x7C, 0x1F, 0x00, + 0x1F, 0x07, 0xC0, 0x07, 0xC1, 0xF0, 0x01, 0xF0, 0x7C, 0x00, 0x7C, 0x1F, + 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x83, 0xE0, 0x03, 0xE0, 0xF8, 0x00, 0xF8, + 0x3E, 0x00, 0x3E, 0x0F, 0x80, 0x0F, 0x83, 0xE0, 0x00, 0x00, 0x70, 0x00, + 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, + 0x03, 0xF8, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xF8, 0x3F, 0xFF, + 0xC7, 0xFF, 0xFC, 0x7F, 0x0F, 0xE7, 0xE0, 0x7E, 0xFE, 0x07, 0xEF, 0xE0, + 0x7E, 0xFE, 0x07, 0xEF, 0xE0, 0x7E, 0x7E, 0x07, 0xE7, 0xE0, 0x7E, 0x7F, + 0x07, 0xE7, 0xF8, 0x00, 0x3F, 0x80, 0x03, 0xFC, 0x00, 0x1F, 0xF0, 0x00, + 0xFF, 0x80, 0x0F, 0xFC, 0x00, 0x7F, 0xE0, 0x03, 0xFF, 0x00, 0x0F, 0xF8, + 0x00, 0x7F, 0x80, 0x03, 0xFC, 0x00, 0x1F, 0xC0, 0x01, 0xFE, 0x00, 0x0F, + 0xE7, 0xE0, 0x7F, 0x7E, 0x07, 0xF7, 0xE0, 0x7F, 0x7E, 0x07, 0xF7, 0xE0, + 0x7F, 0x7E, 0x07, 0xF7, 0xE0, 0x7F, 0x7F, 0x07, 0xF7, 0xF0, 0x7F, 0x3F, + 0xDF, 0xE3, 0xFF, 0xFE, 0x1F, 0xFF, 0xC1, 0xFF, 0xFC, 0x0F, 0xFF, 0x00, + 0x3F, 0xE0, 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0x00, + 0x00, 0x70, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x07, 0xFC, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x03, 0xFF, 0xF8, + 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x7F, + 0xFF, 0xC0, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x3F, 0x00, 0x01, 0xF0, 0x00, + 0x07, 0xE0, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0x1F, 0x01, 0xF8, 0x00, 0x3E, + 0x00, 0x00, 0xFC, 0x07, 0xE0, 0x00, 0xF8, 0x00, 0x03, 0xF0, 0x1F, 0x80, + 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0x7E, 0x00, 0x1F, 0x00, 0x00, 0x3F, 0x01, + 0xF8, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x07, 0xE0, 0x03, 0xE0, 0x00, 0x03, + 0xF0, 0x1F, 0x80, 0x0F, 0x80, 0x00, 0x0F, 0xC0, 0x7E, 0x00, 0x7E, 0x00, + 0x00, 0x3F, 0x01, 0xF8, 0x01, 0xF0, 0x00, 0x00, 0xFC, 0x07, 0xE0, 0x07, + 0xC0, 0x00, 0x03, 0xF0, 0x1F, 0x80, 0x3F, 0x00, 0xFE, 0x0F, 0xC0, 0x7E, + 0x00, 0xF8, 0x1F, 0xFE, 0x3F, 0x01, 0xF8, 0x07, 0xE0, 0xFF, 0xFC, 0xFC, + 0x07, 0xE0, 0x1F, 0x07, 0xFF, 0xFB, 0xF0, 0x1F, 0x80, 0x7C, 0x1F, 0xFF, + 0xEF, 0xC0, 0x7E, 0x03, 0xF0, 0x7E, 0x1F, 0xFF, 0x01, 0xF8, 0x0F, 0x83, + 0xF0, 0x3F, 0xFC, 0x07, 0xE0, 0x7E, 0x0F, 0xC0, 0xFF, 0xF0, 0x1F, 0x81, + 0xF0, 0x3F, 0x03, 0xF7, 0xC0, 0x7E, 0x07, 0xC0, 0xFC, 0x07, 0xDF, 0x81, + 0xF0, 0x3F, 0x03, 0xF0, 0x1F, 0x7E, 0x0F, 0xC0, 0xF8, 0x0F, 0xC0, 0x7D, + 0xFF, 0xFF, 0x07, 0xE0, 0x3F, 0x01, 0xF3, 0xFF, 0xF8, 0x1F, 0x00, 0xFC, + 0x07, 0xCF, 0xFF, 0xE0, 0x7C, 0x03, 0xF0, 0x1F, 0x1F, 0xFF, 0x03, 0xF0, + 0x0F, 0xC0, 0x7C, 0x1F, 0xF0, 0x0F, 0x80, 0x3F, 0x01, 0xF0, 0x00, 0x00, + 0x7E, 0x00, 0xFC, 0x07, 0xC0, 0x00, 0x01, 0xF0, 0x03, 0xF0, 0x1F, 0x00, + 0x00, 0x07, 0xC0, 0x0F, 0xC0, 0x7C, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x01, + 0xF0, 0x00, 0x00, 0xF8, 0x00, 0xFC, 0x07, 0xC0, 0x00, 0x07, 0xE0, 0x03, + 0xF0, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x0F, 0xC0, 0x7C, 0x00, 0x00, 0x7C, + 0x00, 0x3F, 0x01, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0xFC, 0x0F, 0xC0, 0x00, + 0x0F, 0x80, 0x03, 0xF0, 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0xFC, + 0x00, 0x01, 0xF8, 0x00, 0x3F, 0x03, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x7F, + 0x3F, 0x80, 0x00, 0x3F, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0xF8, 0x00, + 0x03, 0xFF, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xFF, 0xC0, 0x00, 0x1F, + 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x7F, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x3F, 0xFE, 0x00, 0x1F, 0xFF, 0xC0, + 0x07, 0xFF, 0xF0, 0x03, 0xF8, 0x7C, 0x00, 0xFC, 0x1F, 0x80, 0x3F, 0x03, + 0xE0, 0x0F, 0xC0, 0xF8, 0x03, 0xF0, 0x3E, 0x00, 0xFC, 0x0F, 0x80, 0x3F, + 0x03, 0xE0, 0x0F, 0xC0, 0xF8, 0x03, 0xF0, 0x7C, 0x00, 0xFE, 0x1F, 0x00, + 0x1F, 0x8F, 0xC0, 0x07, 0xE3, 0xE0, 0x01, 0xF9, 0xF8, 0x00, 0x3F, 0x7C, + 0x00, 0x0F, 0xFF, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x7F, 0xE0, 0x00, 0x1F, + 0xF0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, + 0x3F, 0xE0, 0x00, 0x1F, 0xF8, 0x04, 0x0F, 0xFF, 0x01, 0x03, 0xFF, 0xC0, + 0xE1, 0xFF, 0xF8, 0x7C, 0x7E, 0x7E, 0x1F, 0x3F, 0x1F, 0x8F, 0xCF, 0xC3, + 0xF7, 0xE7, 0xE0, 0xFD, 0xF1, 0xF8, 0x1F, 0xFC, 0x7E, 0x07, 0xFE, 0x3F, + 0x01, 0xFF, 0x8F, 0xC0, 0x3F, 0xC3, 0xF0, 0x0F, 0xF0, 0xFC, 0x01, 0xF8, + 0x3F, 0x00, 0x7E, 0x0F, 0xC0, 0x3F, 0xC3, 0xF0, 0x1F, 0xF0, 0xFE, 0x07, + 0xFC, 0x1F, 0xC7, 0xFF, 0x87, 0xFF, 0xFF, 0xE1, 0xFF, 0xFE, 0xFC, 0x3F, + 0xFF, 0x3F, 0x07, 0xFF, 0x87, 0xE0, 0x7F, 0x81, 0xF8, 0x07, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0x7D, 0xF7, 0xDE, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x8E, + 0x30, 0xC0, 0x00, 0xC3, 0xF3, 0xFD, 0xFF, 0x7F, 0xDF, 0xEF, 0xE3, 0xF8, + 0xFE, 0x3F, 0x0F, 0xC3, 0xF0, 0xFC, 0x3F, 0x0F, 0xC3, 0xF0, 0xFC, 0x3F, + 0x0F, 0xC3, 0xF0, 0xFC, 0x3F, 0x0F, 0xC3, 0xF0, 0xFC, 0x3F, 0x0F, 0xC3, + 0xF0, 0xFC, 0x3F, 0x0F, 0xC3, 0xF0, 0xFC, 0x3F, 0x0F, 0xC3, 0xF0, 0xFC, + 0x3F, 0x0F, 0xC3, 0xF0, 0xFC, 0x3F, 0x0F, 0xC3, 0xF0, 0xFC, 0x3F, 0x0F, + 0xC3, 0xF0, 0xFC, 0x3F, 0x8F, 0xE3, 0xF8, 0x7F, 0x9F, 0xF7, 0xFC, 0xFF, + 0x0F, 0xC0, 0x70, 0xE0, 0x1F, 0xC3, 0xFC, 0x7F, 0xCF, 0xFC, 0xFF, 0x83, + 0xF0, 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, + 0x7F, 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, + 0x0F, 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, + 0xE1, 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, + 0xFC, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC3, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, + 0x3F, 0x87, 0xE3, 0xFD, 0xFF, 0xBF, 0xE7, 0xFC, 0xFE, 0x1C, 0x00, 0x00, + 0x7C, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x81, 0x0C, 0x1E, 0x0C, 0x38, 0x78, + 0x71, 0xF9, 0xE7, 0xEF, 0xF7, 0xBF, 0xCF, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, + 0x0F, 0xFC, 0x00, 0x1F, 0xE0, 0x01, 0xFF, 0xE0, 0x1F, 0xFF, 0xE3, 0xFF, + 0xFF, 0xE7, 0xF7, 0xBF, 0xDF, 0x1E, 0x3E, 0x38, 0x78, 0x70, 0x41, 0xE0, + 0xC0, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x7C, 0x00, 0x03, 0xE0, 0x01, + 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x81, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3E, + 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, + 0xF8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x1E, + 0x1E, 0x1E, 0x1C, 0x1C, 0x3C, 0x3C, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, + 0xFC, 0x00, 0x3E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7C, + 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x7E, 0x00, + 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, + 0xC0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, + 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x07, 0xE0, 0x01, + 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, + 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, + 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3E, 0x00, 0x1F, + 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7C, 0x00, 0x3F, 0x00, 0x0F, 0xC0, + 0x00, 0x03, 0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x3F, + 0xFF, 0xE7, 0xFF, 0xFE, 0x7F, 0x0F, 0xE7, 0xE0, 0x7F, 0x7E, 0x07, 0xFF, + 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, + 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, + 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, + 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, + 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, + 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, + 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0x7E, 0x07, + 0xF7, 0xE0, 0x7F, 0x7F, 0x07, 0xE7, 0xF0, 0xFE, 0x7F, 0xFF, 0xE3, 0xFF, + 0xFC, 0x1F, 0xFF, 0xC1, 0xFF, 0xF8, 0x07, 0xFF, 0x00, 0x06, 0x00, 0x00, + 0xF8, 0x0F, 0xC0, 0xFE, 0x0F, 0xF1, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFD, 0xFF, 0xCF, 0xF0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, + 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, + 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, + 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, + 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, + 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x03, 0xFC, 0x01, + 0xFF, 0xC0, 0x7F, 0xFC, 0x0F, 0xFF, 0xC3, 0xFF, 0xFC, 0x7F, 0xFF, 0x9F, + 0xC3, 0xF3, 0xF0, 0x7F, 0x7E, 0x07, 0xEF, 0xC0, 0xFD, 0xF8, 0x1F, 0xBF, + 0x03, 0xFF, 0xE0, 0x7F, 0xFC, 0x0F, 0xFF, 0x81, 0xFF, 0xF0, 0x3F, 0xFE, + 0x07, 0xFF, 0xC0, 0xFF, 0xF8, 0x1F, 0xFF, 0x07, 0xF0, 0x00, 0xFE, 0x00, + 0x1F, 0x80, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x07, 0xF0, 0x01, + 0xFC, 0x00, 0x3F, 0x80, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0x7F, 0x00, 0x1F, + 0xC0, 0x03, 0xF8, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x07, 0xF0, 0x00, 0xFC, + 0x00, 0x3F, 0x80, 0x07, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xE0, + 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0xFF, + 0xFB, 0xFF, 0xFF, 0x7F, 0xFF, 0xEF, 0xFF, 0xFD, 0xFF, 0xFF, 0x80, 0x03, + 0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x3F, 0xFF, 0xE7, + 0xFF, 0xFE, 0x7F, 0x0F, 0xE7, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, + 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, + 0xF0, 0x00, 0x3F, 0x00, 0x03, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, + 0x7E, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x01, 0xFF, 0xC0, 0x1F, 0xF8, 0x01, + 0xFF, 0x00, 0x1F, 0xF8, 0x01, 0xFF, 0xC0, 0x01, 0xFC, 0x00, 0x0F, 0xE0, + 0x00, 0x7E, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x3F, + 0x00, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, + 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x7F, 0xFE, 0x07, 0xF7, 0xE0, + 0x7F, 0x7E, 0x07, 0xE7, 0xF0, 0xFE, 0x7F, 0xFF, 0xE3, 0xFF, 0xFC, 0x3F, + 0xFF, 0x81, 0xFF, 0xF8, 0x07, 0xFE, 0x00, 0x07, 0x00, 0x00, 0x1F, 0xE0, + 0x00, 0x3F, 0xC0, 0x00, 0x7F, 0x80, 0x01, 0xFF, 0x00, 0x03, 0xFE, 0x00, + 0x07, 0xFC, 0x00, 0x1F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x7F, 0xE0, 0x00, + 0xFF, 0xC0, 0x03, 0xDF, 0x80, 0x07, 0xBF, 0x00, 0x0F, 0x7E, 0x00, 0x3E, + 0xFC, 0x00, 0x79, 0xF8, 0x00, 0xF3, 0xF0, 0x03, 0xE7, 0xE0, 0x07, 0xCF, + 0xC0, 0x0F, 0x1F, 0x80, 0x3E, 0x3F, 0x00, 0x7C, 0x7E, 0x00, 0xF0, 0xFC, + 0x01, 0xE1, 0xF8, 0x07, 0xC3, 0xF0, 0x0F, 0x87, 0xE0, 0x1E, 0x0F, 0xC0, + 0x7C, 0x1F, 0x80, 0xF8, 0x3F, 0x01, 0xF0, 0x7E, 0x07, 0xC0, 0xFC, 0x0F, + 0x81, 0xF8, 0x1F, 0x03, 0xF0, 0x7E, 0x07, 0xE0, 0xF8, 0x0F, 0xC1, 0xF0, + 0x1F, 0x83, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x0F, 0xC0, 0x00, 0x1F, + 0x80, 0x00, 0x3F, 0x00, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0x00, 0x01, 0xF8, + 0x00, 0x03, 0xF0, 0x00, 0x07, 0xE0, 0x00, 0x0F, 0xC0, 0xFF, 0xFF, 0x9F, + 0xFF, 0xF3, 0xFF, 0xFE, 0x7F, 0xFF, 0xCF, 0xFF, 0xF9, 0xFF, 0xFF, 0x3F, + 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, + 0x00, 0x0F, 0xC0, 0x01, 0xF8, 0x00, 0x3F, 0x04, 0x07, 0xEF, 0xF0, 0xFF, + 0xFF, 0x1F, 0xFF, 0xF3, 0xFF, 0xFE, 0x7F, 0xFF, 0xCF, 0xF1, 0xFD, 0xFC, + 0x1F, 0xBF, 0x03, 0xF7, 0xE0, 0x7E, 0xFC, 0x0F, 0xC0, 0x01, 0xF8, 0x00, + 0x3F, 0x00, 0x07, 0xF0, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x03, 0xF8, 0x00, + 0x7F, 0x00, 0x0F, 0xE0, 0x01, 0xFC, 0x00, 0x3F, 0xFE, 0x07, 0xFF, 0xC0, + 0xFF, 0xF8, 0x1F, 0xBF, 0x03, 0xF7, 0xE0, 0x7E, 0xFC, 0x0F, 0xDF, 0x81, + 0xFB, 0xF0, 0x3F, 0x7F, 0x07, 0xEF, 0xF1, 0xFC, 0xFF, 0xFF, 0x1F, 0xFF, + 0xE1, 0xFF, 0xF8, 0x1F, 0xFF, 0x01, 0xFF, 0x80, 0x07, 0x00, 0x00, 0x01, + 0xFC, 0x00, 0x7F, 0xF8, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x83, 0xFF, 0xFC, + 0x1F, 0xFF, 0xF1, 0xFC, 0x1F, 0x8F, 0xC0, 0xFC, 0x7E, 0x07, 0xE3, 0xF0, + 0x3F, 0x1F, 0x81, 0xFD, 0xFC, 0x0F, 0xEF, 0xE0, 0x3F, 0x7F, 0x01, 0xFB, + 0xF8, 0x0F, 0xDF, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, + 0x01, 0xFC, 0x30, 0x0F, 0xEF, 0xF0, 0x7F, 0xFF, 0xE3, 0xFF, 0xFF, 0x1F, + 0xFF, 0xFC, 0xFF, 0xFF, 0xE7, 0xF8, 0x3F, 0xBF, 0x81, 0xFD, 0xFC, 0x07, + 0xEF, 0xE0, 0x3F, 0x7F, 0x01, 0xFB, 0xF8, 0x0F, 0xDF, 0xC0, 0x7E, 0xFE, + 0x03, 0xF7, 0xF0, 0x1F, 0xBF, 0x80, 0xFD, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, + 0xFF, 0x01, 0xFB, 0xF8, 0x0F, 0xDF, 0xC0, 0x7E, 0xFE, 0x03, 0xF3, 0xF0, + 0x1F, 0x9F, 0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xF0, 0x7F, 0x3F, 0xC7, 0xF8, + 0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, 0x7F, 0xFC, 0x01, 0xFF, + 0xC0, 0x00, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, + 0xFE, 0x00, 0x07, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0x80, + 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xF0, 0x00, 0x3F, + 0x80, 0x01, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xE0, 0x00, + 0x3F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFC, 0x00, 0x0F, 0xE0, + 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0x80, 0x01, 0xFC, 0x00, 0x0F, + 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, + 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x3F, 0x80, 0x01, 0xFC, + 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x01, + 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, + 0x00, 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x00, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, + 0xFF, 0xFC, 0x7F, 0xFF, 0xE7, 0xF9, 0xFE, 0x7E, 0x07, 0xEF, 0xE0, 0x7F, + 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07, + 0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, + 0x7F, 0x7E, 0x07, 0xE7, 0xE0, 0x7E, 0x7F, 0x0F, 0xE3, 0xF9, 0xFC, 0x1F, + 0xFF, 0x80, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xFC, 0x3F, 0x9F, 0xC7, + 0xF0, 0xFE, 0x7E, 0x0F, 0xEF, 0xE0, 0x7E, 0xFE, 0x07, 0xEF, 0xE0, 0x7F, + 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07, + 0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xC0, 0x7F, 0xFC, 0x07, 0xFF, 0xC0, + 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xE7, 0xF0, 0xFE, 0x7F, + 0xFF, 0xE3, 0xFF, 0xFC, 0x3F, 0xFF, 0xC1, 0xFF, 0xF8, 0x07, 0xFE, 0x00, + 0x06, 0x00, 0x07, 0xFC, 0x03, 0xFF, 0xE0, 0xFF, 0xFE, 0x1F, 0xFF, 0xC7, + 0xFF, 0xFC, 0xFF, 0xFF, 0xBF, 0x83, 0xFF, 0xE0, 0x7F, 0xFC, 0x07, 0xFF, + 0x80, 0xFF, 0xF0, 0x1F, 0xFE, 0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF, + 0x01, 0xFF, 0xE0, 0x3F, 0xFC, 0x07, 0xFF, 0x80, 0xFF, 0xF0, 0x1F, 0xFE, + 0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF, 0x01, 0xFF, 0xE0, 0x3F, 0xFC, + 0x07, 0xFF, 0xC0, 0xFD, 0xFE, 0xFF, 0xBF, 0xFF, 0xF7, 0xFF, 0xFE, 0x7F, + 0xFF, 0xC7, 0xFF, 0xF8, 0x3F, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0xFC, 0x00, + 0x1F, 0x80, 0x03, 0xFF, 0xC0, 0x7F, 0xF8, 0x0F, 0xFF, 0x01, 0xFF, 0xE0, + 0x3F, 0xFC, 0x07, 0xFF, 0x80, 0xFF, 0xF8, 0x1F, 0xBF, 0x03, 0xF7, 0xE0, + 0xFE, 0xFE, 0x1F, 0x9F, 0xFF, 0xF1, 0xFF, 0xFE, 0x3F, 0xFF, 0x83, 0xFF, + 0xE0, 0x3F, 0xF8, 0x00, 0x20, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, + 0x9F, 0x3E, 0x78, 0xF1, 0xE7, 0x8F, 0x1E, 0x3C, 0xF0, 0x00, 0x01, 0x00, + 0x03, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0xFF, 0x01, 0xFF, 0x07, + 0xFF, 0x1F, 0xFC, 0x3F, 0xF0, 0xFF, 0xE0, 0xFF, 0x80, 0xFE, 0x00, 0xFC, + 0x00, 0xF8, 0x00, 0xFC, 0x00, 0xFF, 0x00, 0xFF, 0x80, 0x7F, 0xE0, 0x3F, + 0xF8, 0x0F, 0xFC, 0x07, 0xFF, 0x01, 0xFF, 0x00, 0xFF, 0x00, 0x3F, 0x00, + 0x1F, 0x00, 0x07, 0x00, 0x03, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, + 0x00, 0xC0, 0x00, 0xE0, 0x00, 0xF8, 0x00, 0xFC, 0x00, 0xFF, 0x00, 0xFF, + 0x80, 0xFF, 0xE0, 0x3F, 0xF0, 0x0F, 0xFC, 0x07, 0xFE, 0x01, 0xFF, 0x00, + 0xFF, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0xFF, 0x01, 0xFF, 0x07, + 0xFE, 0x1F, 0xFC, 0x3F, 0xF0, 0xFF, 0xE0, 0xFF, 0x80, 0xFF, 0x00, 0xFC, + 0x00, 0xF8, 0x00, 0xE0, 0x00, 0x80, 0x00, 0x80, 0x00, 0x07, 0xF8, 0x07, + 0xFF, 0x83, 0xFF, 0xF0, 0xFF, 0xFE, 0x7F, 0xFF, 0x9F, 0xFF, 0xE7, 0xE1, + 0xFF, 0xF8, 0x7F, 0xFE, 0x1F, 0xFF, 0x87, 0xFF, 0xE1, 0xFF, 0xF8, 0x7F, + 0xFE, 0x1F, 0xFF, 0x87, 0xFF, 0xE1, 0xFF, 0xF8, 0x7F, 0xFE, 0x1F, 0xFF, + 0x87, 0xF0, 0x01, 0xFC, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x07, 0xE0, 0x03, + 0xF8, 0x00, 0xFE, 0x00, 0x7F, 0x80, 0x3F, 0xC0, 0x1F, 0xF0, 0x3F, 0xF8, + 0x1F, 0xFC, 0x07, 0xFC, 0x01, 0xFC, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, + 0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x7E, 0x00, + 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, + 0xE0, 0x01, 0xF8, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x7F, 0xFF, + 0x00, 0x00, 0x0F, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0x0F, + 0xFC, 0x7F, 0xE0, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x0F, 0xC0, 0x00, 0x7E, + 0x00, 0xFC, 0x00, 0x01, 0xF0, 0x0F, 0xC0, 0x00, 0x07, 0xC0, 0x7C, 0x00, + 0x00, 0x1E, 0x07, 0xE0, 0x00, 0x00, 0xF8, 0x3E, 0x00, 0x00, 0x03, 0xC3, + 0xF0, 0x0F, 0xF8, 0x1E, 0x1F, 0x00, 0xFF, 0xF0, 0xF8, 0xF8, 0x0F, 0xFF, + 0x83, 0xC7, 0xC0, 0xFF, 0xFC, 0x1E, 0x7E, 0x0F, 0xC1, 0xE0, 0xF3, 0xE0, + 0x7C, 0x0F, 0x07, 0xDF, 0x03, 0xC0, 0x78, 0x3E, 0xF8, 0x3E, 0x03, 0xC1, + 0xF7, 0xC1, 0xE0, 0x1E, 0x0F, 0xBE, 0x0F, 0x00, 0xF0, 0x7D, 0xF0, 0x78, + 0x07, 0x83, 0xFF, 0x87, 0xC0, 0x3C, 0x1F, 0xFC, 0x3E, 0x01, 0xE0, 0xFF, + 0xE1, 0xF0, 0x0F, 0x07, 0xFF, 0x0F, 0x80, 0x78, 0x3F, 0xF8, 0x7C, 0x03, + 0xC1, 0xFF, 0xC3, 0xE0, 0x1E, 0x0F, 0xFE, 0x1F, 0x00, 0xF0, 0x7F, 0xF0, + 0xF8, 0x07, 0x83, 0xEF, 0x87, 0xC0, 0x3C, 0x1E, 0x7C, 0x1E, 0x01, 0xE0, + 0xF3, 0xE0, 0xF0, 0x1F, 0x87, 0x9F, 0x07, 0xC0, 0xFC, 0x3C, 0xF8, 0x3E, + 0x0F, 0xE3, 0xC7, 0xE0, 0xF8, 0x6F, 0xBE, 0x1F, 0x07, 0xFF, 0x3F, 0xF0, + 0xF8, 0x1F, 0xF1, 0xFF, 0x07, 0xC0, 0x7F, 0x87, 0xF0, 0x1F, 0x01, 0xF8, + 0x0E, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x1F, + 0x80, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, + 0x00, 0x0F, 0xE0, 0x00, 0x0C, 0x00, 0x3F, 0xE0, 0x07, 0xE0, 0x00, 0xFF, + 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFF, 0xC0, + 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x01, 0xFF, + 0x00, 0x01, 0xFF, 0x00, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, + 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x03, 0xFF, 0x80, 0x03, 0xFF, + 0x80, 0x03, 0xFF, 0xC0, 0x03, 0xFF, 0xC0, 0x03, 0xFF, 0xC0, 0x03, 0xEF, + 0xC0, 0x03, 0xE7, 0xC0, 0x07, 0xE7, 0xC0, 0x07, 0xE7, 0xE0, 0x07, 0xE7, + 0xE0, 0x07, 0xE7, 0xE0, 0x07, 0xE7, 0xE0, 0x07, 0xE7, 0xE0, 0x07, 0xC3, + 0xE0, 0x0F, 0xC3, 0xF0, 0x0F, 0xC3, 0xF0, 0x0F, 0xC3, 0xF0, 0x0F, 0xC3, + 0xF0, 0x0F, 0xC3, 0xF0, 0x0F, 0xC3, 0xF0, 0x1F, 0xC1, 0xF8, 0x1F, 0x81, + 0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0x81, + 0xF8, 0x1F, 0x81, 0xF8, 0x3F, 0x80, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF, + 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFC, 0x3F, 0xFF, + 0xFE, 0x7F, 0x00, 0x7E, 0x7F, 0x00, 0x7E, 0x7E, 0x00, 0x7E, 0x7E, 0x00, + 0x7E, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x7F, 0x7E, 0x00, 0x7F, 0xFE, 0x00, + 0x3F, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, 0xF1, + 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x7F, 0x07, 0xF3, 0xF8, 0x1F, 0xDF, 0xC0, + 0xFE, 0xFE, 0x07, 0xF7, 0xF0, 0x3F, 0xBF, 0x81, 0xFD, 0xFC, 0x0F, 0xEF, + 0xE0, 0x7F, 0x7F, 0x03, 0xFB, 0xF8, 0x1F, 0xDF, 0xC0, 0xFE, 0xFE, 0x07, + 0xF7, 0xF0, 0x3F, 0x3F, 0x81, 0xF9, 0xFC, 0x1F, 0xCF, 0xFF, 0xFC, 0x7F, + 0xFF, 0xC3, 0xFF, 0xFC, 0x1F, 0xFF, 0xF8, 0xFF, 0xFF, 0xC7, 0xF0, 0xFF, + 0x3F, 0x81, 0xFD, 0xFC, 0x0F, 0xEF, 0xE0, 0x3F, 0x7F, 0x01, 0xFB, 0xF8, + 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, + 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, + 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xBF, 0x81, 0xFD, 0xFC, 0x0F, 0xEF, + 0xE1, 0xFF, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x9F, 0xFF, 0xF8, 0xFF, 0xFF, + 0x87, 0xFF, 0xE0, 0x00, 0x01, 0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0, + 0x3F, 0xFF, 0xC3, 0xFF, 0xFE, 0x1F, 0xFF, 0xF9, 0xFE, 0x1F, 0xCF, 0xE0, + 0x7E, 0x7F, 0x03, 0xFB, 0xF0, 0x1F, 0xDF, 0x80, 0xFE, 0xFC, 0x07, 0xFF, + 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, + 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x00, 0x7F, + 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, + 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, + 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, + 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, + 0x7F, 0x7E, 0x03, 0xFB, 0xF0, 0x1F, 0xDF, 0x80, 0xFE, 0xFE, 0x07, 0xE7, + 0xF0, 0x7F, 0x1F, 0xC7, 0xF8, 0xFF, 0xFF, 0x83, 0xFF, 0xFC, 0x1F, 0xFF, + 0xC0, 0x7F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x60, 0x00, 0xFF, 0xFE, 0x07, + 0xFF, 0xFC, 0x3F, 0xFF, 0xF1, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x7F, 0x07, + 0xFB, 0xF8, 0x1F, 0xDF, 0xC0, 0xFE, 0xFE, 0x03, 0xF7, 0xF0, 0x1F, 0xBF, + 0x80, 0xFD, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, + 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, + 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, + 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, + 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, + 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, + 0xFF, 0xF8, 0x0F, 0xDF, 0xC0, 0x7E, 0xFE, 0x03, 0xF7, 0xF0, 0x3F, 0xBF, + 0x81, 0xFD, 0xFC, 0x0F, 0xEF, 0xE1, 0xFE, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF, + 0x1F, 0xFF, 0xF0, 0xFF, 0xFF, 0x07, 0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, + 0xFE, 0xFF, 0xFE, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, + 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x01, 0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF, + 0xF0, 0x3F, 0xFF, 0xC3, 0xFF, 0xFF, 0x1F, 0xFF, 0xF9, 0xFE, 0x1F, 0xCF, + 0xE0, 0x7F, 0x7F, 0x03, 0xFB, 0xF0, 0x0F, 0xDF, 0x80, 0x7F, 0xFC, 0x03, + 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, + 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x7F, 0xFC, 0x00, 0x0F, 0xE0, 0x00, + 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x1F, 0xFF, 0xF0, + 0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x3F, 0xFF, 0xE1, 0xFF, 0xFF, 0x00, 0xFF, + 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, + 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xEF, + 0xC0, 0x3F, 0x7E, 0x01, 0xFB, 0xF0, 0x0F, 0xDF, 0xC0, 0x7E, 0xFE, 0x07, + 0xF7, 0xF0, 0x3F, 0x9F, 0xC3, 0xFC, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0x1F, + 0xFF, 0x78, 0x7F, 0xF1, 0xC0, 0xFF, 0x0E, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, + 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, + 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, + 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, + 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, + 0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, + 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, + 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, + 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, + 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, + 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFC, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, + 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, + 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, + 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, + 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, + 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xF0, 0x00, + 0x7F, 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x00, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, + 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, + 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0x7E, 0x07, 0xF7, 0xE0, 0x7F, + 0x7E, 0x07, 0xE7, 0xF0, 0xFE, 0x7F, 0x8F, 0xE3, 0xFF, 0xFC, 0x3F, 0xFF, + 0xC1, 0xFF, 0xF8, 0x0F, 0xFF, 0x00, 0x7F, 0xE0, 0x00, 0x60, 0x00, 0xFE, + 0x01, 0xFD, 0xFC, 0x07, 0xF3, 0xF8, 0x0F, 0xE7, 0xF0, 0x1F, 0x8F, 0xE0, + 0x7F, 0x1F, 0xC0, 0xFE, 0x3F, 0x81, 0xF8, 0x7F, 0x07, 0xF0, 0xFE, 0x0F, + 0xE1, 0xFC, 0x1F, 0x83, 0xF8, 0x7F, 0x07, 0xF0, 0xFE, 0x0F, 0xE3, 0xF8, + 0x1F, 0xC7, 0xF0, 0x3F, 0x8F, 0xC0, 0x7F, 0x3F, 0x80, 0xFE, 0x7F, 0x01, + 0xFC, 0xFC, 0x03, 0xFB, 0xF8, 0x07, 0xF7, 0xF0, 0x0F, 0xEF, 0xC0, 0x1F, + 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0x7F, 0xFC, 0x00, 0xFF, 0xF8, 0x01, 0xFF, + 0xF0, 0x03, 0xFF, 0xF0, 0x07, 0xFF, 0xE0, 0x0F, 0xEF, 0xC0, 0x1F, 0xDF, + 0xC0, 0x3F, 0xBF, 0x80, 0x7F, 0x3F, 0x80, 0xFE, 0x7F, 0x01, 0xFC, 0xFE, + 0x03, 0xF8, 0xFE, 0x07, 0xF1, 0xFC, 0x0F, 0xE1, 0xF8, 0x1F, 0xC3, 0xF8, + 0x3F, 0x87, 0xF0, 0x7F, 0x07, 0xF0, 0xFE, 0x0F, 0xE1, 0xFC, 0x1F, 0xC3, + 0xF8, 0x1F, 0xC7, 0xF0, 0x3F, 0x8F, 0xE0, 0x3F, 0x1F, 0xC0, 0x7F, 0x3F, + 0x80, 0xFE, 0x7F, 0x00, 0xFE, 0xFE, 0x01, 0xFD, 0xFC, 0x03, 0xFC, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, + 0x00, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFE, + 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xF0, + 0x00, 0x7F, 0xFF, 0xE0, 0x01, 0xFF, 0xFF, 0xE0, 0x03, 0xFF, 0xFF, 0xC0, + 0x07, 0xFF, 0xFF, 0x80, 0x0F, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFE, 0x00, + 0x7F, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0x7C, 0x01, 0xFF, 0xFE, 0xF8, 0x03, + 0xFF, 0xFD, 0xF0, 0x07, 0xFF, 0xFB, 0xE0, 0x1F, 0xFF, 0xF7, 0xC0, 0x3E, + 0xFF, 0xE7, 0xC0, 0x7D, 0xFF, 0xEF, 0x80, 0xFB, 0xFF, 0xDF, 0x01, 0xF7, + 0xFF, 0xBE, 0x03, 0xEF, 0xFF, 0x7C, 0x0F, 0x9F, 0xFE, 0x7C, 0x1F, 0x3F, + 0xFC, 0xF8, 0x3E, 0x7F, 0xF9, 0xF0, 0x7C, 0xFF, 0xF3, 0xE0, 0xF9, 0xFF, + 0xE7, 0xC3, 0xE3, 0xFF, 0xC7, 0xC7, 0xC7, 0xFF, 0x8F, 0x8F, 0x8F, 0xFF, + 0x1F, 0x1F, 0x1F, 0xFE, 0x3E, 0x3E, 0x3F, 0xFC, 0x7C, 0x78, 0x7F, 0xF8, + 0x7D, 0xF0, 0xFF, 0xF0, 0xFB, 0xE1, 0xFF, 0xE1, 0xF7, 0xC3, 0xFF, 0xC3, + 0xEF, 0x87, 0xFF, 0x87, 0xDE, 0x0F, 0xFF, 0x07, 0xFC, 0x1F, 0xFE, 0x0F, + 0xF8, 0x3F, 0xFC, 0x1F, 0xF0, 0x7F, 0xF8, 0x3F, 0xE0, 0xFF, 0xF0, 0x7F, + 0x81, 0xFF, 0xE0, 0x7F, 0x03, 0xFF, 0xC0, 0xFE, 0x07, 0xFF, 0x81, 0xFC, + 0x0F, 0xFF, 0x03, 0xF8, 0x1F, 0xFE, 0x07, 0xE0, 0x3F, 0xFC, 0x07, 0xC0, + 0x7F, 0xF8, 0x0F, 0x80, 0xFC, 0xF8, 0x00, 0xFF, 0xF0, 0x03, 0xFF, 0xC0, + 0x0F, 0xFF, 0x80, 0x3F, 0xFE, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0xF0, 0x0F, + 0xFF, 0xC0, 0x3F, 0xFF, 0x00, 0xFF, 0xFE, 0x03, 0xFF, 0xF8, 0x0F, 0xFF, + 0xE0, 0x3F, 0xFF, 0xC0, 0xFF, 0xFF, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xF8, + 0x3F, 0xFF, 0xE0, 0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0x0F, 0xFF, 0x7C, 0x3F, + 0xFD, 0xF0, 0xFF, 0xF7, 0xE3, 0xFF, 0xCF, 0x8F, 0xFF, 0x3E, 0x3F, 0xFC, + 0xFC, 0xFF, 0xF1, 0xF3, 0xFF, 0xC7, 0xCF, 0xFF, 0x1F, 0xBF, 0xFC, 0x3E, + 0xFF, 0xF0, 0xFB, 0xFF, 0xC3, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, 0x1F, 0xFF, + 0xF0, 0x7F, 0xFF, 0xC0, 0xFF, 0xFF, 0x03, 0xFF, 0xFC, 0x0F, 0xFF, 0xF0, + 0x1F, 0xFF, 0xC0, 0x7F, 0xFF, 0x01, 0xFF, 0xFC, 0x03, 0xFF, 0xF0, 0x0F, + 0xFF, 0xC0, 0x3F, 0xFF, 0x00, 0x7F, 0xFC, 0x01, 0xFF, 0xF0, 0x07, 0xFF, + 0xC0, 0x0F, 0xFF, 0x00, 0x3F, 0xFC, 0x00, 0xFF, 0xF0, 0x01, 0xF0, 0x01, + 0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0, 0x3F, 0xFF, 0xC3, 0xFF, 0xFF, + 0x1F, 0xFF, 0xF9, 0xFE, 0x1F, 0xCF, 0xE0, 0x7F, 0x7F, 0x03, 0xFB, 0xF0, + 0x1F, 0xDF, 0x80, 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, + 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, + 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, + 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x7F, 0xFC, 0x03, + 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, + 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, + 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0x7E, 0x01, 0xFB, 0xF0, + 0x1F, 0xDF, 0x80, 0xFE, 0xFE, 0x07, 0xF7, 0xF0, 0x3F, 0x1F, 0xC7, 0xF8, + 0xFF, 0xFF, 0xC3, 0xFF, 0xFC, 0x1F, 0xFF, 0xE0, 0x7F, 0xFE, 0x00, 0xFF, + 0xC0, 0x00, 0x70, 0x00, 0xFF, 0xFF, 0x07, 0xFF, 0xFC, 0x3F, 0xFF, 0xF1, + 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0x7F, 0x07, 0xFB, 0xF8, 0x1F, 0xDF, 0xC0, + 0xFE, 0xFE, 0x03, 0xF7, 0xF0, 0x1F, 0xBF, 0x80, 0xFD, 0xFC, 0x07, 0xEF, + 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, + 0xFF, 0xF0, 0x1F, 0xBF, 0x80, 0xFD, 0xFC, 0x07, 0xEF, 0xE0, 0x3F, 0x7F, + 0x03, 0xFB, 0xF8, 0x1F, 0xDF, 0xC0, 0xFE, 0xFE, 0x1F, 0xE7, 0xFF, 0xFF, + 0x3F, 0xFF, 0xF1, 0xFF, 0xFF, 0x8F, 0xFF, 0xF8, 0x7F, 0xFF, 0x03, 0xF8, + 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, + 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, + 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, + 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, + 0x07, 0xF0, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x3F, 0xFC, 0x03, 0xFF, 0xF0, + 0x3F, 0xFF, 0xC3, 0xFF, 0xFF, 0x1F, 0xFF, 0xF9, 0xFE, 0x1F, 0xCF, 0xE0, + 0x7F, 0x7F, 0x03, 0xFB, 0xF0, 0x1F, 0xDF, 0x80, 0x7F, 0xFC, 0x03, 0xFF, + 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, + 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, + 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F, + 0xFF, 0x80, 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, + 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x7F, + 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, + 0x3F, 0x7E, 0x01, 0xFB, 0xF0, 0x1F, 0xDF, 0x80, 0xFE, 0xFE, 0x07, 0xF7, + 0xF0, 0x3F, 0x1F, 0xC7, 0xF8, 0xFF, 0xFF, 0xC3, 0xFF, 0xFC, 0x1F, 0xFF, + 0xE0, 0x7F, 0xFE, 0x00, 0xFF, 0xC0, 0x00, 0x7E, 0x00, 0x01, 0xF8, 0x00, + 0x07, 0xE0, 0x00, 0x1F, 0x80, 0x00, 0x7E, 0x00, 0x03, 0xF0, 0x00, 0x0E, + 0x00, 0x00, 0x20, 0xFF, 0xFF, 0x87, 0xFF, 0xFE, 0x3F, 0xFF, 0xF9, 0xFF, + 0xFF, 0xCF, 0xFF, 0xFF, 0x7F, 0x03, 0xFB, 0xF8, 0x1F, 0xDF, 0xC0, 0x7E, + 0xFE, 0x03, 0xF7, 0xF0, 0x1F, 0xBF, 0x80, 0xFD, 0xFC, 0x07, 0xFF, 0xE0, + 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xDF, 0xC0, 0x7E, 0xFE, 0x03, 0xF7, + 0xF0, 0x1F, 0xBF, 0x81, 0xFD, 0xFC, 0x0F, 0xEF, 0xE0, 0xFE, 0x7F, 0xFF, + 0xF3, 0xFF, 0xFF, 0x1F, 0xFF, 0xE0, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x3F, + 0x83, 0xF9, 0xFC, 0x0F, 0xEF, 0xE0, 0x3F, 0x7F, 0x01, 0xFB, 0xF8, 0x0F, + 0xDF, 0xC0, 0x7E, 0xFE, 0x03, 0xF7, 0xF0, 0x1F, 0xBF, 0x80, 0xFD, 0xFC, + 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, + 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, + 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, + 0xF0, 0x1F, 0xC0, 0x03, 0xFC, 0x00, 0x7F, 0xF8, 0x07, 0xFF, 0xE0, 0x7F, + 0xFF, 0x87, 0xFF, 0xFC, 0x3F, 0xFF, 0xF1, 0xFC, 0x3F, 0x8F, 0xC0, 0xFC, + 0xFE, 0x07, 0xF7, 0xF0, 0x3F, 0xBF, 0x80, 0xFD, 0xFC, 0x07, 0xEF, 0xE0, + 0x3F, 0x7F, 0x01, 0xFB, 0xF8, 0x0F, 0xDF, 0xC0, 0x7E, 0x7F, 0x03, 0xF3, + 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0xC0, 0x01, 0xFF, 0x00, 0x0F, 0xFC, + 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00, + 0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x03, 0xFC, 0x00, 0x0F, 0xF0, 0x00, 0x3F, + 0x80, 0x01, 0xFE, 0xFE, 0x07, 0xF7, 0xF0, 0x3F, 0xBF, 0x80, 0xFD, 0xFC, + 0x07, 0xEF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, + 0x7E, 0x03, 0xFB, 0xF0, 0x1F, 0x9F, 0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xF0, + 0x7F, 0x3F, 0xC7, 0xF8, 0xFF, 0xFF, 0x87, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, + 0x7F, 0xFC, 0x01, 0xFF, 0xC0, 0x00, 0x40, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, + 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, + 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xFC, + 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xE0, 0x07, + 0xF0, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, + 0x1F, 0xC0, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0xFE, + 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xE0, 0x07, 0xF0, 0x03, + 0xF8, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F, 0xC0, + 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x00, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, + 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, + 0x0F, 0xFF, 0x80, 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, + 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, + 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, + 0xC0, 0x3F, 0xFE, 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x7F, 0xFC, 0x03, + 0xFF, 0xE0, 0x1F, 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, + 0x01, 0xFF, 0xF0, 0x0F, 0xFF, 0x80, 0x7F, 0xFC, 0x03, 0xFF, 0xE0, 0x1F, + 0xFF, 0x00, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x3F, 0xFE, 0x01, 0xFB, 0xF0, + 0x0F, 0xDF, 0x80, 0x7E, 0xFC, 0x03, 0xF7, 0xE0, 0x1F, 0xBF, 0x81, 0xFD, + 0xFC, 0x0F, 0xE7, 0xF0, 0xFF, 0x3F, 0xFF, 0xF1, 0xFF, 0xFF, 0x87, 0xFF, + 0xF8, 0x1F, 0xFF, 0x80, 0x3F, 0xF8, 0x00, 0x18, 0x00, 0xFE, 0x00, 0x7F, + 0xFE, 0x00, 0x7E, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x7E, 0x7E, 0x00, 0x7E, + 0x7E, 0x00, 0x7E, 0x7F, 0x00, 0x7E, 0x7F, 0x00, 0xFE, 0x3F, 0x00, 0xFC, + 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, 0x3F, 0x00, 0xFC, + 0x3F, 0x80, 0xFC, 0x1F, 0x80, 0xFC, 0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, + 0x1F, 0x81, 0xF8, 0x1F, 0x81, 0xF8, 0x1F, 0xC1, 0xF8, 0x0F, 0xC1, 0xF8, + 0x0F, 0xC1, 0xF8, 0x0F, 0xC1, 0xF0, 0x0F, 0xC3, 0xF0, 0x0F, 0xC3, 0xF0, + 0x0F, 0xC3, 0xF0, 0x0F, 0xE3, 0xF0, 0x07, 0xE3, 0xF0, 0x07, 0xE3, 0xE0, + 0x07, 0xE3, 0xE0, 0x07, 0xE3, 0xE0, 0x07, 0xE7, 0xE0, 0x07, 0xE7, 0xE0, + 0x03, 0xF7, 0xE0, 0x03, 0xF7, 0xE0, 0x03, 0xF7, 0xC0, 0x03, 0xF7, 0xC0, + 0x03, 0xF7, 0xC0, 0x03, 0xF7, 0xC0, 0x01, 0xFF, 0xC0, 0x01, 0xFF, 0xC0, + 0x01, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, + 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, + 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xF8, 0x03, 0xF7, 0xE0, 0x0F, 0xC0, 0x3F, + 0x7E, 0x01, 0xFC, 0x03, 0xF7, 0xE0, 0x1F, 0xC0, 0x3F, 0x7E, 0x01, 0xFC, + 0x03, 0xF7, 0xE0, 0x1F, 0xC0, 0x3F, 0x7E, 0x01, 0xFC, 0x03, 0xE7, 0xE0, + 0x1F, 0xC0, 0x7E, 0x3E, 0x01, 0xFE, 0x07, 0xE3, 0xF0, 0x3F, 0xE0, 0x7E, + 0x3F, 0x03, 0xFE, 0x07, 0xE3, 0xF0, 0x3F, 0xE0, 0x7E, 0x3F, 0x03, 0xFE, + 0x07, 0xE3, 0xF0, 0x3F, 0xE0, 0x7E, 0x3F, 0x03, 0xFE, 0x07, 0xE1, 0xF0, + 0x3F, 0xF0, 0x7C, 0x1F, 0x07, 0xDF, 0x07, 0xC1, 0xF0, 0x7D, 0xF0, 0xFC, + 0x1F, 0x87, 0xDF, 0x0F, 0xC1, 0xF8, 0x7D, 0xF0, 0xFC, 0x1F, 0x87, 0xCF, + 0x0F, 0xC1, 0xF8, 0x7C, 0xF0, 0xFC, 0x1F, 0x87, 0xCF, 0x8F, 0xC0, 0xF8, + 0xF8, 0xF8, 0xF8, 0x0F, 0x8F, 0x8F, 0x8F, 0x80, 0xF8, 0xF8, 0xF8, 0xF8, + 0x0F, 0x8F, 0x8F, 0x8F, 0x80, 0xFC, 0xF8, 0x78, 0xF8, 0x0F, 0xCF, 0x87, + 0x9F, 0x80, 0xFC, 0xF0, 0x7D, 0xF8, 0x0F, 0xDF, 0x07, 0xDF, 0x80, 0x7D, + 0xF0, 0x7D, 0xF8, 0x07, 0xDF, 0x07, 0xDF, 0x00, 0x7D, 0xF0, 0x7D, 0xF0, + 0x07, 0xDF, 0x03, 0xDF, 0x00, 0x7D, 0xF0, 0x3D, 0xF0, 0x07, 0xFE, 0x03, + 0xFF, 0x00, 0x7F, 0xE0, 0x3F, 0xF0, 0x07, 0xFE, 0x03, 0xFF, 0x00, 0x3F, + 0xE0, 0x3F, 0xF0, 0x03, 0xFE, 0x03, 0xFE, 0x00, 0x3F, 0xE0, 0x1F, 0xE0, + 0x03, 0xFE, 0x01, 0xFE, 0x00, 0x3F, 0xC0, 0x1F, 0xE0, 0x03, 0xFC, 0x01, + 0xFE, 0x00, 0x3F, 0xC0, 0x1F, 0xE0, 0x03, 0xFC, 0x01, 0xFE, 0x00, 0x1F, + 0xC0, 0x1F, 0xE0, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x1F, 0xC0, 0x0F, 0xC0, + 0xFC, 0x01, 0xF9, 0xF8, 0x07, 0xE7, 0xE0, 0x3F, 0x8F, 0x80, 0xFC, 0x3F, + 0x03, 0xF0, 0xFC, 0x0F, 0xC1, 0xF0, 0x7E, 0x07, 0xE1, 0xF8, 0x1F, 0x87, + 0xE0, 0x7E, 0x1F, 0x80, 0xF8, 0xFC, 0x03, 0xF3, 0xF0, 0x0F, 0xCF, 0xC0, + 0x1F, 0x3E, 0x00, 0x7F, 0xF8, 0x01, 0xFF, 0xE0, 0x03, 0xFF, 0x80, 0x0F, + 0xFC, 0x00, 0x3F, 0xF0, 0x00, 0x7F, 0xC0, 0x01, 0xFF, 0x00, 0x07, 0xF8, + 0x00, 0x1F, 0xE0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x07, 0xF0, 0x00, + 0x1F, 0xC0, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x3F, + 0xF0, 0x01, 0xFF, 0xC0, 0x07, 0xFF, 0x00, 0x1F, 0xFE, 0x00, 0x7F, 0xF8, + 0x03, 0xF3, 0xE0, 0x0F, 0xCF, 0xC0, 0x3F, 0x3F, 0x01, 0xFC, 0xFC, 0x07, + 0xE1, 0xF8, 0x1F, 0x87, 0xE0, 0x7E, 0x1F, 0x83, 0xF8, 0x3E, 0x0F, 0xC0, + 0xFC, 0x3F, 0x03, 0xF1, 0xFC, 0x07, 0xC7, 0xE0, 0x1F, 0x9F, 0x80, 0x7E, + 0x7E, 0x00, 0xFB, 0xF8, 0x03, 0xF0, 0xFE, 0x00, 0x7F, 0x7E, 0x00, 0x7E, + 0x7F, 0x00, 0x7E, 0x3F, 0x00, 0xFE, 0x3F, 0x00, 0xFE, 0x3F, 0x80, 0xFC, + 0x3F, 0x80, 0xFC, 0x1F, 0x81, 0xFC, 0x1F, 0x81, 0xF8, 0x1F, 0xC1, 0xF8, + 0x0F, 0xC1, 0xF8, 0x0F, 0xC3, 0xF8, 0x0F, 0xE3, 0xF0, 0x07, 0xE3, 0xF0, + 0x07, 0xE3, 0xF0, 0x07, 0xE7, 0xF0, 0x07, 0xF7, 0xE0, 0x03, 0xF7, 0xE0, + 0x03, 0xF7, 0xE0, 0x03, 0xFF, 0xC0, 0x01, 0xFF, 0xC0, 0x01, 0xFF, 0xC0, + 0x01, 0xFF, 0xC0, 0x01, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, + 0x00, 0xFF, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, + 0x7F, 0xFF, 0xBF, 0xFF, 0xDF, 0xFF, 0xEF, 0xFF, 0xF7, 0xFF, 0xF8, 0x01, + 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F, 0xC0, + 0x0F, 0xE0, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xF8, 0x01, 0xFC, + 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, + 0xE0, 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xFC, 0x01, 0xFC, 0x00, + 0xFE, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xE0, + 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xFC, 0x01, 0xFC, 0x00, 0xFE, + 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, + 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, + 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, + 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, + 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, + 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, + 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, + 0x00, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x03, 0xE0, + 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x01, 0xF0, 0x00, 0x7E, 0x00, + 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x03, + 0xF0, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x01, 0xF8, 0x00, 0x7E, + 0x00, 0x0F, 0x80, 0x03, 0xF0, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x07, 0xC0, + 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xE0, 0x00, 0xFC, 0x00, + 0x3F, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x80, 0x07, + 0xE0, 0x01, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x03, 0xF0, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, + 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, + 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, + 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, + 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, + 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xF0, + 0x00, 0xFF, 0xC0, 0x07, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x7D, 0xF8, 0x01, + 0xF7, 0xE0, 0x0F, 0xCF, 0x80, 0x3F, 0x3F, 0x00, 0xFC, 0xFC, 0x03, 0xE3, + 0xF0, 0x1F, 0x87, 0xC0, 0x7E, 0x1F, 0x81, 0xF8, 0x7E, 0x07, 0xE1, 0xF8, + 0x3F, 0x07, 0xE0, 0xFC, 0x0F, 0xC3, 0xF0, 0x3F, 0x0F, 0xC0, 0xFC, 0x7E, + 0x03, 0xF1, 0xF8, 0x0F, 0xE7, 0xE0, 0x1F, 0xBF, 0x80, 0x7E, 0xFE, 0x01, + 0xFB, 0xF0, 0x07, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0x1F, 0xC3, 0xF0, 0xFC, 0x1F, 0x07, 0xE0, + 0xF8, 0x3E, 0x07, 0x81, 0xE0, 0x3C, 0x00, 0x20, 0x00, 0x7F, 0xF0, 0x0F, + 0xFF, 0x81, 0xFF, 0xFC, 0x3F, 0xFF, 0xE3, 0xFF, 0xFE, 0x7F, 0x8F, 0xE7, + 0xF0, 0x7F, 0x7E, 0x07, 0xF7, 0xE0, 0x7F, 0x7E, 0x03, 0xF7, 0xE0, 0x3F, + 0x7E, 0x03, 0xF7, 0xE0, 0x3F, 0x7E, 0x03, 0xF0, 0x00, 0x3F, 0x00, 0x07, + 0xF0, 0x01, 0xFF, 0x00, 0xFF, 0xF0, 0x3F, 0xFF, 0x0F, 0xFB, 0xF1, 0xFE, + 0x3F, 0x3F, 0xC3, 0xF7, 0xF0, 0x3F, 0x7F, 0x03, 0xF7, 0xE0, 0x3F, 0xFE, + 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, + 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, + 0xFE, 0x07, 0xF7, 0xE0, 0x7F, 0x7F, 0x0F, 0xF7, 0xFF, 0xFF, 0x7F, 0xFB, + 0xF3, 0xFF, 0xBF, 0x1F, 0xF3, 0xF0, 0xFE, 0x3F, 0xFE, 0x00, 0x0F, 0xE0, + 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, + 0x00, 0x0F, 0xE0, 0x80, 0xFE, 0x7F, 0x0F, 0xEF, 0xFC, 0xFF, 0xFF, 0xCF, + 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xF0, 0xFE, 0xFF, 0x07, 0xFF, 0xE0, 0x7F, + 0xFE, 0x07, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, + 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, + 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, + 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, + 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, + 0xFE, 0x03, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFF, 0x07, + 0xFF, 0xF0, 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xCF, 0xEF, + 0xF8, 0xFE, 0x7F, 0x00, 0x00, 0x20, 0x00, 0x7F, 0xF0, 0x0F, 0xFF, 0x81, + 0xFF, 0xFC, 0x3F, 0xFF, 0xE3, 0xFF, 0xFE, 0x7F, 0x8F, 0xE7, 0xF0, 0x7F, + 0x7E, 0x07, 0xF7, 0xE0, 0x3F, 0x7E, 0x03, 0xF7, 0xE0, 0x3F, 0xFE, 0x03, + 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, + 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, + 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, + 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, + 0xFE, 0x03, 0xF7, 0xE0, 0x3F, 0x7E, 0x03, 0xF7, 0xE0, 0x7F, 0x7E, 0x07, + 0xF7, 0xF0, 0x7E, 0x7F, 0x8F, 0xE3, 0xFF, 0xFE, 0x3F, 0xFF, 0xC1, 0xFF, + 0xFC, 0x0F, 0xFF, 0x80, 0x7F, 0xE0, 0x00, 0x70, 0x00, 0x00, 0x03, 0xF8, + 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, + 0xFC, 0x00, 0x0F, 0xE0, 0x18, 0x7F, 0x07, 0xF3, 0xF8, 0xFF, 0xDF, 0xC7, + 0xFF, 0xFE, 0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0xBF, 0xC7, 0xFD, 0xFC, 0x1F, + 0xEF, 0xE0, 0xFF, 0x7E, 0x03, 0xFB, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, + 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, + 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, + 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, + 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, + 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFB, 0xF0, 0x1F, 0xDF, + 0x80, 0xFE, 0xFC, 0x0F, 0xF7, 0xF0, 0x7F, 0xBF, 0xC7, 0xFD, 0xFF, 0xFF, + 0xE7, 0xFF, 0xFF, 0x3F, 0xFB, 0xF8, 0xFF, 0xDF, 0xC3, 0xF8, 0xFE, 0x00, + 0x20, 0x00, 0x3F, 0xF0, 0x0F, 0xFF, 0x81, 0xFF, 0xFC, 0x3F, 0xFF, 0xE3, + 0xFF, 0xFE, 0x7F, 0x0F, 0xE7, 0xF0, 0x7F, 0x7E, 0x07, 0xF7, 0xE0, 0x7F, + 0x7E, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, + 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0xFE, + 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x03, 0xFF, + 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xF7, 0xE0, 0x3F, + 0x7E, 0x03, 0xF7, 0xE0, 0x7F, 0x7E, 0x07, 0xF7, 0xF0, 0x7F, 0x7F, 0x0F, + 0xE3, 0xFF, 0xFE, 0x3F, 0xFF, 0xE1, 0xFF, 0xFC, 0x0F, 0xFF, 0x80, 0x7F, + 0xF0, 0x00, 0x60, 0x00, 0x01, 0xFE, 0x07, 0xFC, 0x1F, 0xF8, 0x7F, 0xF0, + 0xFF, 0xE1, 0xFC, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x83, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, + 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, + 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, + 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, + 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, + 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, + 0x1F, 0x80, 0x3F, 0x00, 0x00, 0x80, 0x00, 0x3F, 0x9F, 0xC7, 0xFE, 0xFE, + 0x3F, 0xFF, 0xF3, 0xFF, 0xFF, 0x9F, 0xFF, 0xFD, 0xFE, 0x3F, 0xEF, 0xE0, + 0xFF, 0x7E, 0x07, 0xFB, 0xF0, 0x1F, 0xDF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, + 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, + 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, + 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, + 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFD, 0xF8, + 0x0F, 0xEF, 0xC0, 0x7F, 0x7F, 0x07, 0xFB, 0xF8, 0x3F, 0xDF, 0xF3, 0xFE, + 0x7F, 0xFF, 0xF3, 0xFF, 0xFF, 0x8F, 0xFD, 0xFC, 0x3F, 0xCF, 0xE0, 0x7C, + 0x7F, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0xFC, 0x40, 0x0F, 0xE3, + 0x80, 0xFF, 0x3F, 0xFF, 0xF1, 0xFF, 0xFF, 0x9F, 0xFF, 0xF8, 0x7F, 0xFF, + 0x80, 0xFF, 0xF0, 0x00, 0x38, 0x00, 0xFE, 0x00, 0x07, 0xF0, 0x00, 0x3F, + 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, 0x00, 0x03, 0xF8, 0x00, + 0x1F, 0xC1, 0xC0, 0xFE, 0x3F, 0x87, 0xF3, 0xFF, 0x3F, 0xBF, 0xF9, 0xFF, + 0xFF, 0xEF, 0xFF, 0xFF, 0x7F, 0xC7, 0xFB, 0xFC, 0x1F, 0xDF, 0xC0, 0x7F, + 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, + 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, + 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, + 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, + 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, + 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, + 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, + 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x3F, 0x9F, 0xCF, 0xE7, 0xF3, + 0xF9, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, + 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, + 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xF1, + 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, + 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0xF1, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, + 0xBF, 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, + 0x00, 0xFE, 0x00, 0x03, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x3F, 0x80, 0x00, + 0xFE, 0x03, 0xFB, 0xF8, 0x0F, 0xEF, 0xE0, 0x3F, 0x3F, 0x81, 0xFC, 0xFE, + 0x07, 0xF3, 0xF8, 0x3F, 0x8F, 0xE0, 0xFE, 0x3F, 0x83, 0xF0, 0xFE, 0x1F, + 0xC3, 0xF8, 0x7E, 0x0F, 0xE3, 0xF8, 0x3F, 0x8F, 0xE0, 0xFE, 0x3F, 0x03, + 0xF9, 0xFC, 0x0F, 0xE7, 0xE0, 0x3F, 0x9F, 0x80, 0xFE, 0xFE, 0x03, 0xFB, + 0xF0, 0x0F, 0xFF, 0xC0, 0x3F, 0xFE, 0x00, 0xFF, 0xF8, 0x03, 0xFF, 0xE0, + 0x0F, 0xFF, 0x80, 0x3F, 0xFF, 0x00, 0xFE, 0xFC, 0x03, 0xFB, 0xF0, 0x0F, + 0xEF, 0xE0, 0x3F, 0x9F, 0x80, 0xFE, 0x7F, 0x03, 0xF8, 0xFC, 0x0F, 0xE3, + 0xF8, 0x3F, 0x8F, 0xE0, 0xFE, 0x1F, 0x83, 0xF8, 0x7F, 0x0F, 0xE0, 0xFC, + 0x3F, 0x83, 0xF8, 0xFE, 0x0F, 0xE3, 0xF8, 0x1F, 0xCF, 0xE0, 0x7F, 0x3F, + 0x80, 0xFC, 0xFE, 0x03, 0xFB, 0xF8, 0x0F, 0xEF, 0xE0, 0x1F, 0xC0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x04, 0x00, 0x30, + 0x3F, 0x9F, 0xE0, 0x7F, 0x8F, 0xEF, 0xFC, 0x7F, 0xF3, 0xFF, 0xFF, 0xBF, + 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xEF, 0xF8, 0xFF, + 0xC3, 0xFF, 0xFC, 0x1F, 0xE0, 0x7F, 0xFE, 0x03, 0xF8, 0x1F, 0xFF, 0x80, + 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0x00, 0xFF, 0xF8, 0x0F, 0xC0, 0x3F, 0xFE, + 0x03, 0xF0, 0x0F, 0xFF, 0x80, 0xFC, 0x03, 0xFF, 0xE0, 0x3F, 0x00, 0xFF, + 0xF8, 0x0F, 0xC0, 0x3F, 0xFE, 0x03, 0xF0, 0x0F, 0xFF, 0x80, 0xFC, 0x03, + 0xFF, 0xE0, 0x3F, 0x00, 0xFF, 0xF8, 0x0F, 0xC0, 0x3F, 0xFE, 0x03, 0xF0, + 0x0F, 0xFF, 0x80, 0xFC, 0x03, 0xFF, 0xE0, 0x3F, 0x00, 0xFF, 0xF8, 0x0F, + 0xC0, 0x3F, 0xFE, 0x03, 0xF0, 0x0F, 0xFF, 0x80, 0xFC, 0x03, 0xFF, 0xE0, + 0x3F, 0x00, 0xFF, 0xF8, 0x0F, 0xC0, 0x3F, 0xFE, 0x03, 0xF0, 0x0F, 0xFF, + 0x80, 0xFC, 0x03, 0xFF, 0xE0, 0x3F, 0x00, 0xFF, 0xF8, 0x0F, 0xC0, 0x3F, + 0xFE, 0x03, 0xF0, 0x0F, 0xFF, 0x80, 0xFC, 0x03, 0xFF, 0xE0, 0x3F, 0x00, + 0xFF, 0xF8, 0x0F, 0xC0, 0x3F, 0xFE, 0x03, 0xF0, 0x0F, 0xFF, 0x80, 0xFC, + 0x03, 0xFF, 0xE0, 0x3F, 0x00, 0xFF, 0xF8, 0x0F, 0xC0, 0x3F, 0xFE, 0x03, + 0xF0, 0x0F, 0xFF, 0x80, 0xFC, 0x03, 0xFF, 0xE0, 0x3F, 0x00, 0xFF, 0xF8, + 0x0F, 0xC0, 0x3F, 0x00, 0x04, 0x07, 0xF1, 0xFC, 0x3F, 0xBF, 0xF9, 0xFD, + 0xFF, 0xCF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFB, 0xFC, 0x1F, 0xDF, 0xC0, 0xFE, + 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, + 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, + 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, + 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, + 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, + 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, + 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, + 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xF0, 0x00, + 0x70, 0x00, 0x1F, 0xF0, 0x03, 0xFF, 0xE0, 0x3F, 0xFF, 0x83, 0xFF, 0xFE, + 0x1F, 0xFF, 0xF1, 0xFE, 0x3F, 0x8F, 0xE0, 0xFE, 0x7E, 0x07, 0xF3, 0xF0, + 0x1F, 0x9F, 0x80, 0xFD, 0xFC, 0x07, 0xEF, 0xE0, 0x3F, 0x7F, 0x01, 0xFB, + 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, + 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, + 0xC0, 0x7F, 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, + 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xDF, 0xC0, 0x7E, 0xFE, + 0x03, 0xF3, 0xF0, 0x1F, 0x9F, 0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xE0, 0x7F, + 0x3F, 0x83, 0xF9, 0xFE, 0x3F, 0xC7, 0xFF, 0xFC, 0x3F, 0xFF, 0xE0, 0xFF, + 0xFE, 0x03, 0xFF, 0xE0, 0x0F, 0xFE, 0x00, 0x06, 0x00, 0x00, 0xFE, 0x7F, + 0x0F, 0xEF, 0xFC, 0xFF, 0xFF, 0xCF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xF0, + 0xFF, 0xFF, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, + 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, + 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, + 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, + 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, + 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x3F, 0xFE, 0x03, 0xFF, 0xE0, 0x7F, 0xFE, + 0x07, 0xFF, 0xE0, 0x7F, 0xFF, 0x07, 0xFF, 0xF0, 0xFE, 0xFF, 0xFF, 0xEF, + 0xFF, 0xFE, 0xFF, 0xFF, 0xCF, 0xEF, 0xF8, 0xFE, 0x7F, 0x0F, 0xE1, 0x80, + 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x0F, 0xE0, 0x00, 0xFE, 0x00, + 0x0F, 0xE0, 0x00, 0xFE, 0x00, 0x00, 0x0F, 0xF3, 0xF8, 0xFF, 0xDF, 0xCF, + 0xFF, 0xFE, 0x7F, 0xFF, 0xF7, 0xFF, 0xFF, 0xBF, 0x87, 0xFD, 0xFC, 0x1F, + 0xEF, 0xC0, 0xFF, 0x7E, 0x03, 0xFB, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, + 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, + 0xFE, 0x03, 0xFF, 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, + 0x3F, 0xFF, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFF, + 0xF0, 0x1F, 0xFF, 0x80, 0xFF, 0xFC, 0x07, 0xFF, 0xE0, 0x3F, 0xFF, 0x01, + 0xFF, 0xF8, 0x0F, 0xFF, 0xC0, 0x7F, 0xFE, 0x03, 0xFB, 0xF0, 0x1F, 0xDF, + 0x80, 0xFE, 0xFC, 0x0F, 0xF7, 0xF0, 0x7F, 0xBF, 0x87, 0xFC, 0xFF, 0xFF, + 0xE7, 0xFF, 0xFF, 0x1F, 0xFF, 0xF8, 0xFF, 0xDF, 0xC1, 0xFC, 0xFE, 0x01, + 0x07, 0xF0, 0x00, 0x3F, 0x80, 0x01, 0xFC, 0x00, 0x0F, 0xE0, 0x00, 0x7F, + 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFE, 0x00, 0x07, 0xF8, 0xFF, + 0xE7, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0xC0, 0xFE, 0x03, + 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, + 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, + 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, + 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, + 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, + 0x80, 0x00, 0x40, 0x00, 0x7F, 0xE0, 0x1F, 0xFF, 0x03, 0xFF, 0xF8, 0x3F, + 0xFF, 0xC7, 0xFF, 0xFC, 0x7F, 0x0F, 0xC7, 0xE0, 0xFE, 0x7E, 0x07, 0xEF, + 0xE0, 0x7E, 0xFE, 0x07, 0xEF, 0xE0, 0x7E, 0x7E, 0x07, 0xE7, 0xE0, 0x7E, + 0x7F, 0x07, 0xE7, 0xF0, 0x7E, 0x3F, 0x80, 0x03, 0xFC, 0x00, 0x1F, 0xE0, + 0x01, 0xFF, 0x00, 0x0F, 0xF8, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x1F, + 0xF0, 0x00, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, + 0x0F, 0xE7, 0xE0, 0xFE, 0x7E, 0x07, 0xF7, 0xE0, 0x7F, 0x7E, 0x07, 0xF7, + 0xE0, 0x7F, 0x7E, 0x07, 0xF7, 0xE0, 0x7F, 0x7E, 0x07, 0xF7, 0xF0, 0x7F, + 0x7F, 0x8F, 0xE3, 0xFF, 0xFE, 0x3F, 0xFF, 0xE1, 0xFF, 0xFC, 0x0F, 0xFF, + 0x80, 0x7F, 0xF0, 0x00, 0x60, 0x00, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, + 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, + 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, + 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, + 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, + 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, + 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFF, 0xC3, 0xFF, 0x83, 0xFF, + 0x07, 0xFE, 0x07, 0xFC, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, + 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, + 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, + 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, + 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, + 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, + 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xC0, 0x3F, + 0xFC, 0x03, 0xFF, 0xC0, 0x3F, 0xFC, 0x07, 0xFF, 0xE0, 0x7F, 0xFE, 0x07, + 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xBF, 0x7F, 0xFB, 0xF3, 0xFF, + 0x3F, 0x1F, 0xE3, 0xF0, 0x30, 0x00, 0xFE, 0x01, 0xFB, 0xF0, 0x0F, 0xDF, + 0x80, 0xFC, 0xFC, 0x07, 0xE7, 0xE0, 0x3F, 0x3F, 0x01, 0xF9, 0xF8, 0x0F, + 0xCF, 0xC0, 0x7E, 0x3F, 0x03, 0xF1, 0xF8, 0x1F, 0x0F, 0xC1, 0xF8, 0x7E, + 0x0F, 0xC3, 0xF0, 0x7E, 0x1F, 0x83, 0xF0, 0xFC, 0x1F, 0x83, 0xF0, 0xFC, + 0x1F, 0x87, 0xC0, 0xFC, 0x3E, 0x07, 0xE1, 0xF0, 0x3F, 0x1F, 0x81, 0xF8, + 0xFC, 0x0F, 0xC7, 0xE0, 0x3E, 0x3F, 0x01, 0xF9, 0xF0, 0x0F, 0xCF, 0x80, + 0x7E, 0x7C, 0x03, 0xF3, 0xE0, 0x1F, 0x9F, 0x00, 0x7C, 0xF8, 0x03, 0xEF, + 0x80, 0x1F, 0x7C, 0x00, 0xFB, 0xE0, 0x07, 0xFF, 0x00, 0x3F, 0xF8, 0x01, + 0xFF, 0xC0, 0x07, 0xFE, 0x00, 0x3F, 0xE0, 0x01, 0xFF, 0x00, 0x0F, 0xF8, + 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0x7F, 0x80, 0xFC, + 0x07, 0xE0, 0x1F, 0x7C, 0x07, 0xE0, 0x3F, 0x7C, 0x07, 0xF0, 0x3F, 0x7C, + 0x07, 0xF0, 0x3F, 0x7E, 0x07, 0xF0, 0x3F, 0x7E, 0x07, 0xF0, 0x3E, 0x7E, + 0x0F, 0xF0, 0x3E, 0x7E, 0x0F, 0xF0, 0x3E, 0x3E, 0x0F, 0xF0, 0x3E, 0x3E, + 0x0F, 0xF8, 0x3E, 0x3E, 0x0F, 0x78, 0x3E, 0x3E, 0x0F, 0x78, 0x7E, 0x3E, + 0x0F, 0x78, 0x7E, 0x3E, 0x1F, 0x78, 0x7C, 0x3F, 0x1F, 0x78, 0x7C, 0x3F, + 0x1F, 0x7C, 0x7C, 0x1F, 0x1F, 0x7C, 0x7C, 0x1F, 0x1E, 0x7C, 0x7C, 0x1F, + 0x1E, 0x3C, 0x7C, 0x1F, 0x1E, 0x3C, 0x7C, 0x1F, 0x3E, 0x3C, 0x7C, 0x1F, + 0x3E, 0x3C, 0xF8, 0x1F, 0x3E, 0x3E, 0xF8, 0x1F, 0x3C, 0x3E, 0xF8, 0x0F, + 0xBC, 0x3E, 0xF8, 0x0F, 0xBC, 0x1E, 0xF8, 0x0F, 0xBC, 0x1E, 0xF8, 0x0F, + 0xBC, 0x1E, 0xF8, 0x0F, 0xFC, 0x1E, 0xF8, 0x0F, 0xFC, 0x1E, 0xF0, 0x0F, + 0xF8, 0x1F, 0xF0, 0x0F, 0xF8, 0x1F, 0xF0, 0x07, 0xF8, 0x1F, 0xF0, 0x07, + 0xF8, 0x0F, 0xF0, 0x07, 0xF8, 0x0F, 0xF0, 0x07, 0xF8, 0x0F, 0xF0, 0x07, + 0xF8, 0x0F, 0xF0, 0x07, 0xF0, 0x0F, 0xE0, 0x07, 0xF0, 0x0F, 0xE0, 0x07, + 0xF0, 0x0F, 0xE0, 0x03, 0xF0, 0x07, 0xE0, 0x03, 0xF0, 0x07, 0xE0, 0x03, + 0xF0, 0x07, 0xE0, 0xFC, 0x03, 0xF3, 0xF0, 0x1F, 0x9F, 0x80, 0xFC, 0xFC, + 0x0F, 0xC3, 0xF0, 0x7E, 0x1F, 0x83, 0xF0, 0xFC, 0x1F, 0x03, 0xF1, 0xF8, + 0x1F, 0x8F, 0xC0, 0xFC, 0x7C, 0x03, 0xF7, 0xE0, 0x1F, 0xBF, 0x00, 0x7D, + 0xF0, 0x03, 0xFF, 0x80, 0x1F, 0xFC, 0x00, 0x7F, 0xC0, 0x03, 0xFE, 0x00, + 0x1F, 0xF0, 0x00, 0xFF, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x00, 0xFC, + 0x00, 0x07, 0xF0, 0x00, 0x7F, 0x80, 0x03, 0xFE, 0x00, 0x1F, 0xF0, 0x01, + 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x7F, 0xF0, 0x07, 0xFF, 0x80, 0x3F, 0x7E, + 0x01, 0xF3, 0xF0, 0x1F, 0x9F, 0x80, 0xFC, 0x7E, 0x07, 0xC3, 0xF0, 0x7E, + 0x1F, 0x83, 0xF0, 0xFE, 0x1F, 0x83, 0xF1, 0xF8, 0x1F, 0x8F, 0xC0, 0xFE, + 0x7E, 0x03, 0xF7, 0xE0, 0x1F, 0xBF, 0x00, 0xFE, 0xFE, 0x01, 0xFB, 0xF0, + 0x0F, 0xDF, 0x80, 0x7E, 0xFC, 0x03, 0xF7, 0xE0, 0x1F, 0xBF, 0x01, 0xFD, + 0xFC, 0x0F, 0xC7, 0xE0, 0x7E, 0x3F, 0x03, 0xF1, 0xF8, 0x1F, 0x8F, 0xC0, + 0xFC, 0x7E, 0x07, 0xE3, 0xF0, 0x3E, 0x0F, 0x83, 0xF0, 0x7E, 0x1F, 0x83, + 0xF0, 0xFC, 0x1F, 0x87, 0xE0, 0xFC, 0x3F, 0x07, 0xE1, 0xF0, 0x1F, 0x0F, + 0x80, 0xF8, 0x7C, 0x07, 0xC3, 0xE0, 0x3F, 0x3F, 0x01, 0xF9, 0xF8, 0x0F, + 0xCF, 0x80, 0x3E, 0x7C, 0x01, 0xF3, 0xE0, 0x0F, 0x9F, 0x00, 0x7C, 0xF8, + 0x03, 0xE7, 0xC0, 0x1F, 0x3C, 0x00, 0x7D, 0xE0, 0x03, 0xFF, 0x00, 0x1F, + 0xF8, 0x00, 0xFF, 0xC0, 0x07, 0xFE, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x00, + 0x07, 0xF8, 0x00, 0x3F, 0xC0, 0x01, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, + 0x80, 0x03, 0xF8, 0x00, 0x1F, 0xC0, 0x03, 0xFE, 0x00, 0xFF, 0xF0, 0x07, + 0xFF, 0x00, 0x3F, 0xF8, 0x01, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0x7F, 0xFF, + 0x7F, 0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0x00, 0x7F, 0x00, 0x7E, + 0x00, 0x7E, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFC, 0x00, 0xFC, 0x01, 0xFC, + 0x01, 0xF8, 0x01, 0xF8, 0x03, 0xF8, 0x03, 0xF8, 0x03, 0xF0, 0x07, 0xF0, + 0x07, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xC0, + 0x1F, 0xC0, 0x1F, 0xC0, 0x1F, 0x80, 0x1F, 0x80, 0x3F, 0x80, 0x3F, 0x80, + 0x3F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7E, 0x00, 0xFE, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7E, + 0x03, 0xFC, 0x0F, 0xF8, 0x3F, 0xF0, 0x7F, 0xE0, 0xFE, 0x03, 0xF8, 0x07, + 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, + 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, + 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, 0xE0, 0x1F, 0xC1, 0xFF, 0x83, 0xFE, + 0x07, 0xF8, 0x0F, 0xE0, 0x1F, 0xF0, 0x3F, 0xF0, 0x0F, 0xE0, 0x0F, 0xC0, + 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, 0x03, 0xF8, 0x07, + 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0x80, 0x7F, 0x00, 0xFE, 0x01, 0xFC, + 0x03, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0xC0, 0x1F, 0xC0, 0x3F, 0xF0, + 0x7F, 0xE0, 0x7F, 0xC0, 0x7F, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFC, 0x03, 0xFC, 0x0F, 0xF8, 0x3F, 0xE0, 0xFF, 0xC0, 0x7F, 0x01, + 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, + 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, + 0x0F, 0xC0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xF0, 0x1F, 0xF0, 0x3F, + 0xC0, 0x7F, 0x01, 0xFC, 0x0F, 0xF0, 0x7F, 0xC3, 0xFC, 0x0F, 0xE0, 0x3F, + 0x80, 0xFE, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, + 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xF0, 0x0F, 0xC0, 0x3F, 0x00, 0xFC, 0x03, + 0xF0, 0x0F, 0xC0, 0x7F, 0x01, 0xFC, 0x3F, 0xF0, 0xFF, 0x83, 0xFE, 0x0F, + 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x08, 0x01, 0xF0, 0x03, 0xF1, 0xFF, 0x80, + 0xF8, 0xFF, 0xFE, 0x7E, 0x3F, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0xC7, 0xFF, + 0xFF, 0xF3, 0xFF, 0xFF, 0xF8, 0x7C, 0x1F, 0xFC, 0x06, 0x00, 0xFE, 0x00 }; + +const GFXglyph Antonio_SemiBold30pt7bGlyphs[] PROGMEM = { + { 0, 1, 1, 13, 0, 0 }, // 0x20 ' ' + { 1, 7, 50, 15, 4, -49 }, // 0x21 '!' + { 45, 7, 19, 24, 9, -49 }, // 0x22 '"' + { 62, 26, 50, 30, 2, -49 }, // 0x23 '#' + { 225, 20, 57, 24, 2, -49 }, // 0x24 '$' + { 368, 54, 52, 63, 4, -50 }, // 0x25 '%' + { 719, 26, 52, 29, 2, -50 }, // 0x26 '&' + { 888, 6, 18, 12, 3, -49 }, // 0x27 ''' + { 902, 10, 58, 17, 4, -51 }, // 0x28 '(' + { 975, 11, 58, 17, 2, -51 }, // 0x29 ')' + { 1055, 22, 21, 26, 2, -48 }, // 0x2A '*' + { 1113, 17, 19, 21, 2, -31 }, // 0x2B '+' + { 1154, 8, 17, 14, 3, -6 }, // 0x2C ',' + { 1171, 13, 4, 20, 3, -24 }, // 0x2D '-' + { 1178, 5, 6, 15, 5, -5 }, // 0x2E '.' + { 1182, 18, 51, 22, 2, -50 }, // 0x2F '/' + { 1297, 20, 52, 26, 3, -50 }, // 0x30 '0' + { 1427, 13, 50, 22, 3, -49 }, // 0x31 '1' + { 1509, 19, 51, 26, 4, -50 }, // 0x32 '2' + { 1631, 20, 52, 26, 3, -50 }, // 0x33 '3' + { 1761, 23, 50, 26, 2, -49 }, // 0x34 '4' + { 1905, 19, 51, 26, 4, -49 }, // 0x35 '5' + { 2027, 21, 52, 26, 3, -50 }, // 0x36 '6' + { 2164, 21, 50, 26, 3, -49 }, // 0x37 '7' + { 2296, 20, 52, 26, 3, -50 }, // 0x38 '8' + { 2426, 19, 52, 26, 3, -50 }, // 0x39 '9' + { 2550, 7, 30, 15, 4, -37 }, // 0x3A ':' + { 2577, 7, 41, 16, 5, -37 }, // 0x3B ';' + { 2613, 16, 29, 21, 2, -35 }, // 0x3C '<' + { 2671, 16, 14, 21, 3, -29 }, // 0x3D '=' + { 2699, 16, 29, 21, 3, -35 }, // 0x3E '>' + { 2757, 18, 51, 25, 4, -50 }, // 0x3F '?' + { 2872, 37, 53, 43, 3, -50 }, // 0x40 '@' + { 3118, 24, 50, 26, 1, -49 }, // 0x41 'A' + { 3268, 21, 50, 27, 4, -49 }, // 0x42 'B' + { 3400, 21, 52, 27, 3, -50 }, // 0x43 'C' + { 3537, 21, 50, 28, 4, -49 }, // 0x44 'D' + { 3669, 16, 50, 22, 4, -49 }, // 0x45 'E' + { 3769, 16, 50, 22, 4, -49 }, // 0x46 'F' + { 3869, 21, 51, 28, 3, -50 }, // 0x47 'G' + { 4003, 21, 50, 29, 4, -49 }, // 0x48 'H' + { 4135, 7, 50, 15, 4, -49 }, // 0x49 'I' + { 4179, 20, 51, 26, 2, -49 }, // 0x4A 'J' + { 4307, 23, 50, 27, 4, -49 }, // 0x4B 'K' + { 4451, 16, 50, 21, 4, -49 }, // 0x4C 'L' + { 4551, 31, 50, 39, 4, -49 }, // 0x4D 'M' + { 4745, 22, 50, 30, 4, -49 }, // 0x4E 'N' + { 4883, 21, 52, 28, 3, -50 }, // 0x4F 'O' + { 5020, 21, 50, 26, 4, -49 }, // 0x50 'P' + { 5152, 21, 59, 28, 3, -50 }, // 0x51 'Q' + { 5307, 21, 50, 28, 4, -49 }, // 0x52 'R' + { 5439, 21, 52, 24, 2, -50 }, // 0x53 'S' + { 5576, 17, 50, 19, 1, -49 }, // 0x54 'T' + { 5683, 21, 51, 28, 4, -49 }, // 0x55 'U' + { 5817, 24, 50, 26, 1, -49 }, // 0x56 'V' + { 5967, 36, 50, 39, 1, -49 }, // 0x57 'W' + { 6192, 22, 50, 24, 1, -49 }, // 0x58 'X' + { 6330, 24, 50, 24, 0, -49 }, // 0x59 'Y' + { 6480, 17, 50, 20, 2, -49 }, // 0x5A 'Z' + { 6587, 12, 52, 20, 5, -49 }, // 0x5B '[' + { 6665, 18, 50, 23, 2, -49 }, // 0x5C '\' + { 6778, 12, 52, 20, 3, -49 }, // 0x5D ']' + { 6856, 22, 26, 28, 3, -49 }, // 0x5E '^' + { 6928, 19, 5, 21, 1, 2 }, // 0x5F '_' + { 6940, 10, 11, 12, 1, -57 }, // 0x60 '`' + { 6954, 20, 44, 27, 3, -43 }, // 0x61 'a' + { 7064, 20, 51, 28, 4, -50 }, // 0x62 'b' + { 7192, 20, 45, 26, 3, -43 }, // 0x63 'c' + { 7305, 21, 51, 28, 3, -50 }, // 0x64 'd' + { 7439, 20, 45, 26, 3, -43 }, // 0x65 'e' + { 7552, 15, 51, 19, 2, -50 }, // 0x66 'f' + { 7648, 21, 51, 27, 3, -43 }, // 0x67 'g' + { 7782, 21, 51, 28, 4, -50 }, // 0x68 'h' + { 7916, 7, 53, 15, 4, -52 }, // 0x69 'i' + { 7963, 9, 59, 15, 2, -52 }, // 0x6A 'j' + { 8030, 22, 51, 26, 4, -50 }, // 0x6B 'k' + { 8171, 7, 51, 15, 4, -50 }, // 0x6C 'l' + { 8216, 34, 44, 42, 4, -43 }, // 0x6D 'm' + { 8403, 21, 44, 28, 4, -43 }, // 0x6E 'n' + { 8519, 21, 45, 27, 3, -43 }, // 0x6F 'o' + { 8638, 20, 51, 28, 4, -42 }, // 0x70 'p' + { 8766, 21, 51, 28, 3, -42 }, // 0x71 'q' + { 8900, 14, 44, 19, 4, -43 }, // 0x72 'r' + { 8977, 20, 45, 24, 2, -43 }, // 0x73 's' + { 9090, 15, 50, 18, 1, -49 }, // 0x74 't' + { 9184, 20, 44, 28, 4, -42 }, // 0x75 'u' + { 9294, 21, 43, 23, 1, -42 }, // 0x76 'v' + { 9407, 32, 43, 35, 1, -42 }, // 0x77 'w' + { 9579, 21, 43, 23, 1, -42 }, // 0x78 'x' + { 9692, 21, 50, 23, 1, -42 }, // 0x79 'y' + { 9824, 16, 43, 20, 2, -42 }, // 0x7A 'z' + { 9910, 15, 56, 21, 3, -50 }, // 0x7B '{' + { 10015, 6, 56, 15, 5, -52 }, // 0x7C '|' + { 10057, 14, 56, 21, 3, -50 }, // 0x7D '}' + { 10155, 26, 10, 32, 3, -33 } }; // 0x7E '~' + +const GFXfont Antonio_SemiBold30pt7b PROGMEM = { + (uint8_t *)Antonio_SemiBold30pt7bBitmaps, + (GFXglyph *)Antonio_SemiBold30pt7bGlyphs, + 0x20, 0x7E, 76 }; + +// Approx. 10860 bytes diff --git a/src/fonts/fonts.hpp b/src/fonts/fonts.hpp index 926e382..057e371 100644 --- a/src/fonts/fonts.hpp +++ b/src/fonts/fonts.hpp @@ -1,7 +1,7 @@ #pragma once #include "antonio-semibold20.h" -// #include "antonio-semibold30.h" +#include "antonio-semibold30.h" #include "antonio-semibold90.h" // #include "oswald-20.h" // #include "oswald-30.h" diff --git a/src/lib/block_notify.cpp b/src/lib/block_notify.cpp index 67caf9a..6e44993 100644 --- a/src/lib/block_notify.cpp +++ b/src/lib/block_notify.cpp @@ -2,10 +2,12 @@ char *wsServer; esp_websocket_client_handle_t blockNotifyClient = NULL; -unsigned long int currentBlockHeight; +unsigned long int currentBlockHeight = 816000; void setupBlockNotify() { + currentBlockHeight = preferences.getULong("blockHeight", 816000); + IPAddress result; int dnsErr = -1; @@ -87,7 +89,8 @@ void onWebsocketMessage(esp_websocket_event_data_t *event_data) currentBlockHeight = block["height"].as(); - Serial.printf("New block found: %d\r\n", block["height"].as()); + Serial.printf("New block found: %d\r\n", block["height"].as()); + preferences.putULong("blockHeight", currentBlockHeight); if (blockUpdateTaskHandle != nullptr) { xTaskNotifyGive(blockUpdateTaskHandle); diff --git a/src/lib/button_handler.hpp b/src/lib/button_handler.hpp index fa503fb..161a361 100644 --- a/src/lib/button_handler.hpp +++ b/src/lib/button_handler.hpp @@ -1,8 +1,6 @@ #pragma once #include -#include -#include #include "shared.hpp" #include "screen_handler.hpp" diff --git a/src/lib/config.cpp b/src/lib/config.cpp index e825a83..f0250b2 100644 --- a/src/lib/config.cpp +++ b/src/lib/config.cpp @@ -10,15 +10,19 @@ void setup() { setupPreferences(); setupHardware(); + setupDisplays(); + if (preferences.getBool("ledTestOnPower", true)) + { + queueLedEffect(LED_POWER_TEST); + } if (mcp.digitalRead(3) == LOW) { preferences.putBool("wifiConfigured", false); WiFi.eraseAP(); - blinkDelay(100, 3); + queueLedEffect(LED_EFFECT_WIFI_ERASE_SETTINGS); } - setupDisplays(); tryImprovSetup(); setupWebserver(); @@ -33,19 +37,23 @@ void setup() xTaskCreate(setupWebsocketClients, "setupWebsocketClients", 4096, NULL, tskIDLE_PRIORITY, NULL); setupButtonTask(); + Serial.printf("Number of free Preferences entries %d", preferences.freeEntries()); + } void tryImprovSetup() { if (!preferences.getBool("wifiConfigured", false)) { + setFgColor(GxEPD_BLACK); + setBgColor(GxEPD_WHITE); queueLedEffect(LED_EFFECT_WIFI_WAIT_FOR_CONFIG); uint8_t x_buffer[16]; uint8_t x_position = 0; // Hold second button to start QR code wifi config - if (!mcp.digitalRead(2) == LOW) + if (mcp.digitalRead(2) == LOW) { WiFiManager wm; @@ -65,25 +73,32 @@ void tryImprovSetup() wifiManager->getConfigPortalSSID().c_str(), softAP_password.c_str()); // vTaskDelay(pdMS_TO_TICKS(1000)); - delay(1000); + delay(6000); const String qrText = "qrWIFI:S:" + wifiManager->getConfigPortalSSID() + ";T:WPA;P:" + softAP_password.c_str() + ";;"; const String explainText = "*SSID: *\r\n" + wifiManager->getConfigPortalSSID() + "\r\n\r\n*Password:*\r\n" + softAP_password; std::array epdContent = {"Welcome!", "", "To setup\r\nscan QR or\r\nconnect\r\nmanually", "", explainText, "", qrText}; setEpdContent(epdContent); + delay(3000); + Serial.println("xTask"); + xTaskNotifyGive(epdTaskHandle); }); - }); - - wm.setSaveConfigCallback([]() { + wm.setSaveConfigCallback([]() + { preferences.putBool("wifiConfigured", true); - }); + delay(1000); + // just restart after succes + ESP.restart(); }); bool ac = wm.autoConnect(softAP_SSID.c_str(), softAP_password.c_str()); - wm.server->stop(); } else { + waitUntilNoneBusy(); + std::array epdContent = {"Welcome!", "", "Use\r\nweb-interface\r\nto configure", "", "Or restart\r\nwhile\r\nholding\r\n2nd button\r\r\nto start\r\n QR-config", "", ""}; + setEpdContent(epdContent); + esp_task_wdt_init(30, false); while (WiFi.status() != WL_CONNECTED) { if (Serial.available() > 0) @@ -99,9 +114,12 @@ void tryImprovSetup() x_position = 0; } } - esp_task_wdt_reset(); } + esp_task_wdt_deinit(); + esp_task_wdt_reset(); } + setFgColor(preferences.getUInt("fgColor", DEFAULT_FG_COLOR)); + setBgColor(preferences.getUInt("bgColor", DEFAULT_BG_COLOR)); } else { @@ -112,7 +130,7 @@ void tryImprovSetup() vTaskDelay(pdMS_TO_TICKS(400)); } } - queueLedEffect(LED_EFFECT_WIFI_CONNECT_SUCCESS); + // queueLedEffect(LED_EFFECT_WIFI_CONNECT_SUCCESS); } void setupTime() @@ -134,6 +152,7 @@ void setupPreferences() { preferences.begin("btclock", false); + setFgColor(preferences.getUInt("fgColor", DEFAULT_FG_COLOR)); setBgColor(preferences.getUInt("bgColor", DEFAULT_BG_COLOR)); @@ -142,6 +161,7 @@ void setupPreferences() screenNameMap[SCREEN_BTC_TICKER] = "Ticker"; screenNameMap[SCREEN_TIME] = "Time"; screenNameMap[SCREEN_HALVING_COUNTDOWN] = "Halving countdown"; + screenNameMap[SCREEN_MARKET_CAP] = "Market Cap"; } void setupWebsocketClients(void *pvParameters) diff --git a/src/lib/config.hpp b/src/lib/config.hpp index b90b96d..81ace25 100644 --- a/src/lib/config.hpp +++ b/src/lib/config.hpp @@ -6,6 +6,7 @@ #include #include +#include #include "shared.hpp" #include "epd.hpp" #include "improv.hpp" diff --git a/src/lib/epd.cpp b/src/lib/epd.cpp index 8aba5a9..75b0ab0 100644 --- a/src/lib/epd.cpp +++ b/src/lib/epd.cpp @@ -80,7 +80,7 @@ void setupDisplays() int *taskParam = new int; *taskParam = i; - xTaskCreate(updateDisplay, ("EpdUpd" + String(i)).c_str(), 10000, taskParam, tskIDLE_PRIORITY, &tasks[i]); // create task + xTaskCreate(updateDisplay, ("EpdUpd" + String(i)).c_str(), 4096, taskParam, tskIDLE_PRIORITY, &tasks[i]); // create task } xTaskCreate(taskEpd, "epd_task", 2048, NULL, tskIDLE_PRIORITY, &epdTaskHandle); @@ -202,7 +202,11 @@ extern "C" void updateDisplay(void *pvParameters) noexcept #ifdef PAGED_WRITE showDigitPaged(epdIndex, epdContent[epdIndex].c_str()[0], updatePartial, &FONT_BIG); #else + if (epdContent[epdIndex].length() > 1) { + showChars(epdIndex, epdContent[epdIndex], updatePartial, &Antonio_SemiBold30pt7b); + } else { showDigit(epdIndex, epdContent[epdIndex].c_str()[0], updatePartial, &FONT_BIG); + } #endif } @@ -335,6 +339,21 @@ void showDigit(const uint dispNum, char chr, bool partial, const GFXfont *font) displays[dispNum].print(str); } +void showChars(const uint dispNum, const String& chars, bool partial, const GFXfont *font) { + displays[dispNum].setRotation(2); + displays[dispNum].setFont(font); + displays[dispNum].setTextColor(getFgColor()); + int16_t tbx, tby; + uint16_t tbw, tbh; + displays[dispNum].getTextBounds(chars, 0, 0, &tbx, &tby, &tbw, &tbh); + // center the bounding box by transposition of the origin: + uint16_t x = ((displays[dispNum].width() - tbw) / 2) - tbx; + uint16_t y = ((displays[dispNum].height() - tbh) / 2) - tby; + displays[dispNum].fillScreen(getBgColor()); + displays[dispNum].setCursor(x, y); + displays[dispNum].print(chars); +} + void showDigitPaged(const uint dispNum, char chr, bool partial, const GFXfont *font) { String str(chr); @@ -426,11 +445,13 @@ void renderText(const uint dispNum, const String &text, bool partial) } } - displays[dispNum].display(partial); + //displays[dispNum].display(partial); } void renderQr(const uint dispNum, const String &text, bool partial) { + #ifdef USE_QR + uint8_t tempBuffer[800]; bool ok = qrcodegen_encodeText(text.substring(2).c_str(), tempBuffer, qrcode, qrcodegen_Ecc_LOW, qrcodegen_VERSION_MIN, qrcodegen_VERSION_MAX, qrcodegen_Mask_AUTO, true); @@ -452,5 +473,17 @@ void renderQr(const uint dispNum, const String &text, bool partial) displays[dispNum].drawPixel(padding + x, paddingY + y, qrcodegen_getModule(qrcode, floor(float(x) / 4), floor(float(y) / 4)) ? GxEPD_BLACK : GxEPD_WHITE); } } - displays[dispNum].display(partial); + //displays[dispNum].display(partial); + + //free(tempBuffer); + //free(qrcode); + #endif } + +void waitUntilNoneBusy() { + for (int i = 0; i < NUM_SCREENS; i++) { + while (EPD_BUSY[i].digitalRead()) { + vTaskDelay(10); + } + } +} \ No newline at end of file diff --git a/src/lib/epd.hpp b/src/lib/epd.hpp index 109bd3f..f679021 100644 --- a/src/lib/epd.hpp +++ b/src/lib/epd.hpp @@ -10,7 +10,10 @@ #include #include +#ifdef USE_QR #include "qrcodegen.h" +#endif +extern TaskHandle_t epdTaskHandle; void setupDisplays(); void taskEpd(void *pvParameters); @@ -19,6 +22,8 @@ void splitText(const uint dispNum, const String& top, const String& bottom, bo void splitTextPaged(const uint dispNum, String top, String bottom, bool partial); void showDigit(const uint dispNum, char chr, bool partial, const GFXfont *font); +void showChars(const uint dispNum, const String& chars, bool partial, const GFXfont *font); + void showDigitPaged(const uint dispNum, char chr, bool partial, const GFXfont *font); extern "C" void updateDisplay(void *pvParameters) noexcept; @@ -34,3 +39,4 @@ void renderQr(const uint dispNum, const String& text, bool partial); void setEpdContent(std::array newEpdContent); std::array getCurrentEpdContent(); +void waitUntilNoneBusy(); \ No newline at end of file diff --git a/src/lib/led_handler.cpp b/src/lib/led_handler.cpp index 83d4874..eaa3ae8 100644 --- a/src/lib/led_handler.cpp +++ b/src/lib/led_handler.cpp @@ -3,7 +3,7 @@ TaskHandle_t ledTaskHandle = NULL; QueueHandle_t ledTaskQueue = NULL; Adafruit_NeoPixel pixels(NEOPIXEL_COUNT, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800); -unsigned long ledTaskParams; +uint ledTaskParams; void ledTask(void *parameter) { @@ -23,6 +23,14 @@ void ledTask(void *parameter) switch (ledTaskParams) { + case LED_POWER_TEST: + pixels.setPixelColor(0, pixels.Color(255, 0, 0)); + pixels.setPixelColor(1, pixels.Color(0, 255, 0)); + pixels.setPixelColor(2, pixels.Color(0, 0, 255)); + pixels.setPixelColor(3, pixels.Color(255, 255, 255)); + pixels.show(); + vTaskDelay(pdMS_TO_TICKS(1000)); + break; case LED_EFFECT_WIFI_CONNECT_ERROR: case LED_FLASH_ERROR: blinkDelayColor(250, 3, 255, 0, 0); @@ -39,6 +47,9 @@ void ledTask(void *parameter) case LED_EFFECT_WIFI_WAIT_FOR_CONFIG: blinkDelayTwoColor(100, 1, pixels.Color(8, 161, 236), pixels.Color(156, 225, 240)); break; + case LED_EFFECT_WIFI_ERASE_SETTINGS: + blinkDelay(100, 3); + break; case LED_EFFECT_WIFI_CONNECTING: for (int i = NEOPIXEL_COUNT; i >= 0; i--) { @@ -109,13 +120,16 @@ void ledTask(void *parameter) break; } - // revert to previous state - for (int i = 0; i < NEOPIXEL_COUNT; i++) - { - pixels.setPixelColor(i, oldLights[i]); - } + // revert to previous state unless power test - pixels.show(); + if (ledTaskParams != LED_POWER_TEST) { + for (int i = 0; i < NEOPIXEL_COUNT; i++) + { + pixels.setPixelColor(i, oldLights[i]); + } + + pixels.show(); + } } } } @@ -124,25 +138,24 @@ void ledTask(void *parameter) void setupLeds() { pixels.begin(); - if (preferences.getBool("ledTestOnPower", true)) - { - pixels.setBrightness(preferences.getUInt("ledBrightness", 128)); - pixels.setPixelColor(0, pixels.Color(255, 0, 0)); - pixels.setPixelColor(1, pixels.Color(0, 255, 0)); - pixels.setPixelColor(2, pixels.Color(0, 0, 255)); - pixels.setPixelColor(3, pixels.Color(255, 255, 255)); - } - else - { - pixels.clear(); - } + pixels.setBrightness(preferences.getUInt("ledBrightness", 128)); + pixels.clear(); pixels.show(); setupLedTask(); + if (preferences.getBool("ledTestOnPower", true)) + { + while (!ledTaskQueue) + { + delay(1); + // wait until queue is available + } + queueLedEffect(LED_POWER_TEST); + } } void setupLedTask() { - ledTaskQueue = xQueueCreate(2, sizeof(char)); + ledTaskQueue = xQueueCreate(5, sizeof(uint)); xTaskCreate(ledTask, "LedTask", 2048, NULL, tskIDLE_PRIORITY, &ledTaskHandle); } @@ -249,6 +262,6 @@ bool queueLedEffect(uint effect) return false; } - char flashType = effect; + uint flashType = effect; xQueueSend(ledTaskQueue, &flashType, portMAX_DELAY); } \ No newline at end of file diff --git a/src/lib/led_handler.hpp b/src/lib/led_handler.hpp index 61c1099..987b688 100644 --- a/src/lib/led_handler.hpp +++ b/src/lib/led_handler.hpp @@ -1,8 +1,6 @@ #pragma once #include -#include -#include #include #include "shared.hpp" @@ -23,7 +21,8 @@ const int LED_EFFECT_WIFI_WAIT_FOR_CONFIG = 100; const int LED_EFFECT_WIFI_CONNECTING = 101; const int LED_EFFECT_WIFI_CONNECT_ERROR = 102; const int LED_EFFECT_WIFI_CONNECT_SUCCESS = 103; - +const int LED_EFFECT_WIFI_ERASE_SETTINGS = 104; +const int LED_POWER_TEST = 999; extern TaskHandle_t ledTaskHandle; void ledTask(void *pvParameters); diff --git a/src/lib/price_notify.cpp b/src/lib/price_notify.cpp index 857ec2c..f6577c5 100644 --- a/src/lib/price_notify.cpp +++ b/src/lib/price_notify.cpp @@ -3,8 +3,8 @@ const char *wsServerPrice = "wss://ws.coincap.io/prices?assets=bitcoin"; // WebsocketsClient client; esp_websocket_client_handle_t clientPrice = NULL; -unsigned long int currentPrice; -unsigned long int lastPriceUpdate = 0; +unsigned long int currentPrice = 30000; +unsigned long int lastPriceUpdate; void setupPriceNotify() { @@ -57,7 +57,7 @@ void onWebsocketPriceMessage(esp_websocket_event_data_t* event_data) lastPriceUpdate = currentTime; // if (abs((int)(oldPrice-currentPrice)) > round(0.0015*oldPrice)) { - if (priceUpdateTaskHandle != nullptr && (getCurrentScreen() == SCREEN_BTC_TICKER || getCurrentScreen() == SCREEN_MSCW_TIME)) + if (priceUpdateTaskHandle != nullptr && (getCurrentScreen() == SCREEN_BTC_TICKER || getCurrentScreen() == SCREEN_MSCW_TIME || getCurrentScreen() == SCREEN_MARKET_CAP)) xTaskNotifyGive(priceUpdateTaskHandle); //} } diff --git a/src/lib/screen_handler.cpp b/src/lib/screen_handler.cpp index 23e0c66..4d4b05f 100644 --- a/src/lib/screen_handler.cpp +++ b/src/lib/screen_handler.cpp @@ -34,7 +34,7 @@ void taskPriceUpdate(void *pvParameters) firstIndex = 1; } } - else + else if (getCurrentScreen() == SCREEN_MSCW_TIME) { priceString = String(int(round(1 / float(price) * 10e7))).c_str(); @@ -45,10 +45,39 @@ void taskPriceUpdate(void *pvParameters) firstIndex = 1; } } - - for (uint i = firstIndex; i < NUM_SCREENS; i++) + else { - taskEpdContent[i] = priceString[i]; + double supply = getSupplyAtBlock(getBlockHeight()); + int64_t marketCap = static_cast(supply * double(price)); + std::string stringValue = std::to_string(marketCap); + size_t mcLength = stringValue.length(); + size_t leadingSpaces = (3 - mcLength % 3) % 3; + stringValue = std::string(leadingSpaces, ' ') + stringValue; + + taskEpdContent[0] = "USD/MCAP"; + + uint groups = (mcLength + leadingSpaces) / 3; + + if (groups < NUM_SCREENS) { + firstIndex = 1; + } + + for (int i = firstIndex; i < NUM_SCREENS-groups-1; i++) { + taskEpdContent[i] = ""; + } + + taskEpdContent[NUM_SCREENS-groups-1] = " $ "; + for (uint i = 0; i < groups; i ++) + { + taskEpdContent[(NUM_SCREENS-groups+i)] = stringValue.substr(i*3, 3).c_str(); + } + } + + if (getCurrentScreen() != SCREEN_MARKET_CAP) { + for (uint i = firstIndex; i < NUM_SCREENS; i++) + { + taskEpdContent[i] = priceString[i]; + } } setEpdContent(taskEpdContent); @@ -179,7 +208,7 @@ void IRAM_ATTR screenRotateTimerISR(void *arg) void setupTasks() { - xTaskCreate(taskPriceUpdate, "updatePrice", 2048, NULL, tskIDLE_PRIORITY, &priceUpdateTaskHandle); + xTaskCreate(taskPriceUpdate, "updatePrice", 3072, NULL, tskIDLE_PRIORITY, &priceUpdateTaskHandle); xTaskCreate(taskBlockUpdate, "updateBlock", 2048, NULL, tskIDLE_PRIORITY, &blockUpdateTaskHandle); xTaskCreate(taskTimeUpdate, "updateTime", 4096, NULL, tskIDLE_PRIORITY, &timeUpdateTaskHandle); xTaskCreate(taskScreenRotate, "rotateScreen", 2048, NULL, tskIDLE_PRIORITY, &taskScreenRotateTaskHandle); @@ -283,6 +312,7 @@ void setCurrentScreen(uint newScreen) case SCREEN_BLOCK_HEIGHT: xTaskNotifyGive(blockUpdateTaskHandle); break; + case SCREEN_MARKET_CAP: case SCREEN_MSCW_TIME: case SCREEN_BTC_TICKER: xTaskNotifyGive(priceUpdateTaskHandle); @@ -308,6 +338,7 @@ void nextScreen() void previousScreen() { + int newCurrentScreen = modulo(getCurrentScreen() - 1, SCREEN_COUNT); String key = "screen" + String(newCurrentScreen) + "Visible"; diff --git a/src/lib/screen_handler.hpp b/src/lib/screen_handler.hpp index 37b69a5..eda91c0 100644 --- a/src/lib/screen_handler.hpp +++ b/src/lib/screen_handler.hpp @@ -5,8 +5,7 @@ #include #include -#include "lib/block_notify.hpp" -#include "lib/price_notify.hpp" +#include "shared.hpp" #include "lib/epd.hpp" extern TaskHandle_t priceUpdateTaskHandle; diff --git a/src/lib/shared.hpp b/src/lib/shared.hpp index bcd44dc..f24632b 100644 --- a/src/lib/shared.hpp +++ b/src/lib/shared.hpp @@ -1,5 +1,7 @@ #pragma once +#include +#include #include #include #include @@ -13,10 +15,12 @@ const PROGMEM int SCREEN_MSCW_TIME = 1; const PROGMEM int SCREEN_BTC_TICKER = 2; const PROGMEM int SCREEN_TIME = 3; const PROGMEM int SCREEN_HALVING_COUNTDOWN = 4; +const PROGMEM int SCREEN_MARKET_CAP = 5; + const PROGMEM int SCREEN_COUNTDOWN = 98; const PROGMEM int SCREEN_CUSTOM = 99; -const PROGMEM int screens[5] = { SCREEN_BLOCK_HEIGHT, SCREEN_MSCW_TIME, SCREEN_BTC_TICKER, SCREEN_TIME, SCREEN_HALVING_COUNTDOWN }; -const int SCREEN_COUNT = 5; +const int SCREEN_COUNT = 6; +const PROGMEM int screens[SCREEN_COUNT] = { SCREEN_BLOCK_HEIGHT, SCREEN_MSCW_TIME, SCREEN_BTC_TICKER, SCREEN_TIME, SCREEN_HALVING_COUNTDOWN, SCREEN_MARKET_CAP }; struct SpiRamAllocator { void* allocate(size_t size) { diff --git a/src/lib/utils.cpp b/src/lib/utils.cpp index 4c0944b..f02dc86 100644 --- a/src/lib/utils.cpp +++ b/src/lib/utils.cpp @@ -9,4 +9,24 @@ String getMyHostname() { byte mac[6]; WiFi.macAddress(mac); return "btclock" + String(mac[4], 16) = String(mac[5], 16); +} + +double getSupplyAtBlock(uint blockNr) { + if (blockNr >= 33 * 210000) { + return 20999999.9769; + } + + const int initialBlockReward = 50; // Initial block reward + const int halvingInterval = 210000; // Number of blocks before halving + + int halvingCount = blockNr / halvingInterval; + double totalBitcoinInCirculation = 0; + + for (int i = 0; i < halvingCount; ++i) { + totalBitcoinInCirculation += halvingInterval * initialBlockReward * std::pow(0.5, i); + } + + totalBitcoinInCirculation += (blockNr % halvingInterval) * initialBlockReward * std::pow(0.5, halvingCount); + + return totalBitcoinInCirculation; } \ No newline at end of file diff --git a/src/lib/utils.hpp b/src/lib/utils.hpp index 2bdd69d..951beec 100644 --- a/src/lib/utils.hpp +++ b/src/lib/utils.hpp @@ -4,4 +4,7 @@ #include "shared.hpp" int modulo(int x,int N); + +double getSupplyAtBlock(uint blockNr); + String getMyHostname(); \ No newline at end of file diff --git a/src/lib/webserver.cpp b/src/lib/webserver.cpp index f5d8c79..c1d31da 100644 --- a/src/lib/webserver.cpp +++ b/src/lib/webserver.cpp @@ -186,7 +186,7 @@ void onApiShowText(AsyncWebServerRequest *request) setEpdContent(textEpdContent); } - // setCurrentScreen(SCREEN_CUSTOM); + setCurrentScreen(SCREEN_CUSTOM); request->send(200); } @@ -203,7 +203,7 @@ void onApiRestart(AsyncWebServerRequest *request) */ void onApiSettingsGet(AsyncWebServerRequest *request) { - StaticJsonDocument<768> root; + StaticJsonDocument<1536> root; root["numScreens"] = NUM_SCREENS; root["fgColor"] = getFgColor(); root["bgColor"] = getBgColor(); @@ -214,11 +214,11 @@ void onApiSettingsGet(AsyncWebServerRequest *request) root["wpTimeout"] = preferences.getUInt("wpTimeout", 600); root["tzOffset"] = preferences.getInt("gmtOffset", TIME_OFFSET_SECONDS) / 60; root["useBitcoinNode"] = preferences.getBool("useNode", false); - root["rpcPort"] = preferences.getUInt("rpcPort", BITCOIND_PORT); - root["rpcUser"] = preferences.getString("rpcUser", BITCOIND_RPC_USER); - root["rpcHost"] = preferences.getString("rpcHost", BITCOIND_HOST); + // root["rpcPort"] = preferences.getUInt("rpcPort", BITCOIND_PORT); + // root["rpcUser"] = preferences.getString("rpcUser", BITCOIND_RPC_USER); + // root["rpcHost"] = preferences.getString("rpcHost", BITCOIND_HOST); root["mempoolInstance"] = preferences.getString("mempoolInstance", DEFAULT_MEMPOOL_INSTANCE); - + root["ledTestOnPower"] = preferences.getBool("ledTestOnPower", true); root["ledFlashOnUpdate"] = preferences.getBool("ledFlashOnUpd", false); root["ledBrightness"] = preferences.getUInt("ledBrightness", 128); @@ -374,33 +374,33 @@ void onApiSettingsPost(AsyncWebServerRequest *request) settingsChanged = true; } - if (request->hasParam("useBitcoinNode", true)) - { - AsyncWebParameter *p = request->getParam("useBitcoinNode", true); - bool useBitcoinNode = p->value().toInt(); - preferences.putBool("useNode", useBitcoinNode); - settingsChanged = true; + // if (request->hasParam("useBitcoinNode", true)) + // { + // AsyncWebParameter *p = request->getParam("useBitcoinNode", true); + // bool useBitcoinNode = p->value().toInt(); + // preferences.putBool("useNode", useBitcoinNode); + // settingsChanged = true; - String rpcVars[] = {"rpcHost", "rpcPort", "rpcUser", "rpcPass"}; + // String rpcVars[] = {"rpcHost", "rpcPort", "rpcUser", "rpcPass"}; - for (String v : rpcVars) - { - if (request->hasParam(v, true)) - { - AsyncWebParameter *pv = request->getParam(v, true); - // Don't store an empty password, probably new settings save - if (!(v.equals("rpcPass") && pv->value().length() == 0)) - { - preferences.putString(v.c_str(), pv->value().c_str()); - } - } - } - } - else - { - preferences.putBool("useNode", false); - settingsChanged = true; - } + // for (String v : rpcVars) + // { + // if (request->hasParam(v, true)) + // { + // AsyncWebParameter *pv = request->getParam(v, true); + // // Don't store an empty password, probably new settings save + // if (!(v.equals("rpcPass") && pv->value().length() == 0)) + // { + // preferences.putString(v.c_str(), pv->value().c_str()); + // } + // } + // } + // } + // else + // { + // preferences.putBool("useNode", false); + // settingsChanged = true; + // } request->send(200); if (settingsChanged) diff --git a/src/main.cpp b/src/main.cpp index 3d01d7d..9d4b5e2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,6 +4,7 @@ #include "ESPAsyncWebServer.h" #include "lib/config.hpp" +#define USE_QR //char ptrTaskList[400];