From 1bd465b33acdb241389cdde1dcdcdcdb8c55789d Mon Sep 17 00:00:00 2001 From: kdmukai Date: Tue, 17 Dec 2024 20:17:21 -0600 Subject: [PATCH] rebuilt with larger partitions --- lib/btclock/mining_pool_stats_handler.cpp | 66 +++ lib/btclock/mining_pool_stats_handler.hpp | 4 + partition_8mb.csv | 2 +- platformio.ini | 1 + src/icons/icons.cpp | 516 +++++++++++++++++++++- src/lib/config.cpp | 10 + src/lib/config.hpp | 1 + src/lib/defaults.hpp | 7 + src/lib/epd.cpp | 6 + src/lib/mining_pool_stats_fetch.cpp | 120 +++++ src/lib/mining_pool_stats_fetch.hpp | 15 + src/lib/screen_handler.cpp | 24 +- src/lib/screen_handler.hpp | 4 +- src/lib/shared.hpp | 2 + src/lib/timers.cpp | 4 + src/lib/webserver.cpp | 8 +- 16 files changed, 782 insertions(+), 8 deletions(-) create mode 100644 lib/btclock/mining_pool_stats_handler.cpp create mode 100644 lib/btclock/mining_pool_stats_handler.hpp create mode 100644 src/lib/mining_pool_stats_fetch.cpp create mode 100644 src/lib/mining_pool_stats_fetch.hpp diff --git a/lib/btclock/mining_pool_stats_handler.cpp b/lib/btclock/mining_pool_stats_handler.cpp new file mode 100644 index 0000000..17eb4c8 --- /dev/null +++ b/lib/btclock/mining_pool_stats_handler.cpp @@ -0,0 +1,66 @@ +#include "mining_pool_stats_handler.hpp" +#include + +std::array parseMiningPoolStatsHashRate(std::string miningPoolName, std::string text) +{ + std::array ret; + ret.fill(""); // Initialize all elements to empty strings + std::string hashrate; + std::string label; + + if (text.length() > 21) { + // We are massively future-proof!! + label = "ZH/S"; + hashrate = text.substr(0, text.length() - 21); + } else if (text.length() > 18) { + label = "EH/S"; + hashrate = text.substr(0, text.length() - 18); + } else if (text.length() > 15) { + label = "PH/S"; + hashrate = text.substr(0, text.length() - 15); + } else if (text.length() > 12) { + label = "TH/S"; + hashrate = text.substr(0, text.length() - 12); + } else if (text.length() > 9) { + label = "GH/S"; + hashrate = text.substr(0, text.length() - 9); + } else if (text.length() > 6) { + label = "MH/S"; + hashrate = text.substr(0, text.length() - 6); + } else if (text.length() > 3) { + label = "KH/S"; + hashrate = text.substr(0, text.length() - 3); + } else { + label = "H/S"; + hashrate = text; + } + + std::size_t textLength = hashrate.length(); + + // Calculate the position where the digits should start + // Account for the position of the mining pool logo and the hashrate label + std::size_t startIndex = NUM_SCREENS - 1 - textLength; + + std::cout << "miningPoolName: " << miningPoolName << std::endl; + + // Insert the mining pool logo icon just before the digits + if (startIndex > 0) + { + if (miningPoolName == "ocean") { + ret[startIndex - 1] = "mdi:braiins_logo"; + } else if (miningPoolName == "braiins") { + ret[startIndex - 1] = "mdi:braiins_logo"; + } + } + + // Place the digits + for (std::size_t i = 0; i < textLength; ++i) + { + ret[startIndex + i] = hashrate.substr(i, 1); + } + + ret[NUM_SCREENS - 1] = label; + ret[0] = "POOL/STATS"; + + return ret; +} \ No newline at end of file diff --git a/lib/btclock/mining_pool_stats_handler.hpp b/lib/btclock/mining_pool_stats_handler.hpp new file mode 100644 index 0000000..b79d8f9 --- /dev/null +++ b/lib/btclock/mining_pool_stats_handler.hpp @@ -0,0 +1,4 @@ +#include +#include + +std::array parseMiningPoolStatsHashRate(std::string miningPoolName, std::string text); \ No newline at end of file diff --git a/partition_8mb.csv b/partition_8mb.csv index 025f649..e0584ae 100644 --- a/partition_8mb.csv +++ b/partition_8mb.csv @@ -4,4 +4,4 @@ otadata, data, ota, 0xe000, 0x2000, app0, app, ota_0, 0x10000, 0x370000, app1, app, ota_1, , 0x370000, spiffs, data, spiffs, , 0xCD000, -coredump, data, coredump,, 0x10000, \ No newline at end of file +coredump, data, coredump,, 0x10000, diff --git a/platformio.ini b/platformio.ini index d2abb92..125ad96 100644 --- a/platformio.ini +++ b/platformio.ini @@ -96,6 +96,7 @@ build_flags = [env:btclock_rev_b_213epd] extends = env:btclock_rev_b +board_build.partitions = partition_8mb.csv test_framework = unity build_flags = ${env:btclock_rev_b.build_flags} diff --git a/src/icons/icons.cpp b/src/icons/icons.cpp index ca69f63..d80fde1 100644 --- a/src/icons/icons.cpp +++ b/src/icons/icons.cpp @@ -1270,12 +1270,524 @@ const unsigned char epd_icons_bitaxe_logo [] PROGMEM = { }; +// 'ocean_logo', 122x250px +const unsigned char epd_icons_ocean_logo [] PROGMEM = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x78, 0x00, 0x1f, 0xc0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfc, 0x00, 0x3f, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0x00, 0x7f, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, 0x00, 0x7f, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xfe, 0x00, 0xff, 0xff, 0xfe, 0x00, 0x3f, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xfc, 0x00, 0x3f, 0xff, 0xfc, 0x01, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xfc, 0x01, 0xff, 0xff, 0xff, 0x80, 0x01, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xc0, 0x00, 0xff, 0xff, 0xfc, 0x01, 0xff, 0xff, 0xff, 0xe0, 0x00, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0x80, 0x01, 0xff, 0xff, 0xfc, 0x03, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xc0, + 0xff, 0xff, 0x00, 0x03, 0xff, 0xff, 0xfc, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x1f, 0xff, 0xc0, + 0xff, 0xfe, 0x00, 0x07, 0xff, 0xff, 0xfc, 0x03, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x0f, 0xff, 0xc0, + 0xff, 0xfc, 0x00, 0x0f, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x07, 0xff, 0xc0, + 0xff, 0xf8, 0x00, 0x1f, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xff, 0xc0, + 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x7f, 0xff, 0xff, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x7f, 0xff, 0xff, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xc0, + 0xff, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xc0, + 0xff, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x7f, 0xc0, + 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x7f, 0xc0, + 0xff, 0x80, 0x00, 0x7f, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xc0, + 0xff, 0x80, 0x00, 0x7f, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x3f, 0xc0, + 0xff, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x3f, 0xc0, + 0xff, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x3f, 0xc0, + 0xff, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x1f, 0xc0, + 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xc0, + 0xfe, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x1f, 0xc0, + 0xfe, 0x00, 0x00, 0x03, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, + 0xfe, 0x00, 0x00, 0x01, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, + 0xfe, 0x00, 0x00, 0x01, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x1f, 0xc0, + 0xfe, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xff, 0xff, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x1f, 0xc0, + 0xfe, 0x00, 0x78, 0x00, 0x7f, 0xff, 0xf1, 0xff, 0xfc, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x1f, 0xc0, + 0xfe, 0x00, 0xfc, 0x00, 0x3f, 0xff, 0xf1, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xc0, 0x1f, 0xc0, + 0xff, 0x00, 0xff, 0x00, 0x1f, 0xff, 0xf1, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xc0, + 0xff, 0x01, 0xff, 0x80, 0x1f, 0xff, 0xf3, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xc0, + 0xff, 0x01, 0xff, 0xc0, 0x0f, 0xff, 0xe3, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x3f, 0xc0, + 0xff, 0x01, 0xff, 0xe0, 0x07, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x3f, 0xc0, + 0xff, 0x81, 0xff, 0xf8, 0x03, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xc0, + 0xff, 0x81, 0xff, 0xfc, 0x01, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xc0, + 0xff, 0x83, 0xff, 0xfe, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xc0, + 0xff, 0xc3, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xc0, + 0xff, 0xc3, 0xff, 0xff, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xc0, + 0xff, 0xe3, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xc0, + 0xff, 0xe3, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xc0, + 0xff, 0xf3, 0xff, 0xff, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xf9, 0xff, 0xc0, + 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xf9, 0xff, 0xc0, + 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0xff, 0xff, 0xf0, 0xff, 0xc0, + 0xff, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xf0, 0xff, 0xc0, + 0xff, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xf0, 0x7f, 0xc0, + 0xff, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xff, 0xf0, 0x7f, 0xc0, + 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf0, 0x07, 0xff, 0xf0, 0x7f, 0xc0, + 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xf8, 0x03, 0xff, 0xf0, 0x3f, 0xc0, + 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xf8, 0x01, 0xff, 0xe0, 0x3f, 0xc0, + 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xf1, 0xff, 0xfc, 0x00, 0xff, 0xe0, 0x3f, 0xc0, + 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x3f, 0xf1, 0xff, 0xfe, 0x00, 0x3f, 0xe0, 0x1f, 0xc0, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x7f, 0xf1, 0xff, 0xff, 0x00, 0x1f, 0xe0, 0x1f, 0xc0, + 0xfe, 0x00, 0xff, 0xff, 0xff, 0x80, 0x01, 0xff, 0xf1, 0xff, 0xff, 0x80, 0x0f, 0xc0, 0x1f, 0xc0, + 0xfe, 0x00, 0xff, 0xff, 0xf0, 0x00, 0x07, 0xff, 0xe1, 0xff, 0xff, 0x80, 0x07, 0x80, 0x1f, 0xc0, + 0xfe, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xe3, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x1f, 0xc0, + 0xfe, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xc0, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xc0, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xc0, + 0xfe, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xc0, + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x1f, 0xc0, + 0xff, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xc0, + 0xff, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0xc0, + 0xff, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x80, 0x00, 0x3f, 0xc0, + 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x80, 0x00, 0x3f, 0xc0, + 0xff, 0x80, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xc0, + 0xff, 0x80, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xc0, + 0xff, 0xc0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xc0, + 0xff, 0xc0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xff, 0xc0, 0x00, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xff, 0xc0, 0x00, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xff, 0x80, 0x01, 0xff, 0xc0, + 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xff, 0x80, 0x03, 0xff, 0xc0, + 0xff, 0xf8, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xff, 0xff, 0x00, 0x03, 0xff, 0xc0, + 0xff, 0xfc, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xff, 0xfe, 0x00, 0x07, 0xff, 0xc0, + 0xff, 0xfe, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xff, 0xfc, 0x00, 0x0f, 0xff, 0xc0, + 0xff, 0xff, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xf8, 0x00, 0x1f, 0xff, 0xc0, + 0xff, 0xff, 0x80, 0x01, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xc0, + 0xff, 0xff, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0x80, 0x03, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xfc, 0x00, 0x3f, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xfe, 0x00, 0x7f, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xc0, 0x0f, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0x80, 0x0f, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0x80, 0x0f, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x07, 0xc0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0 +}; + + +// 'braiins_pool', 122x250px +const unsigned char epd_icons_braiins_logo [] PROGMEM = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xfe, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xf8, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xf0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xe0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xe0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xc0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xc0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xc0, 0x38, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x80, 0x7c, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x80, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x80, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x80, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x80, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x00, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x01, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x01, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xf0, 0x1f, 0x01, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xf0, 0x0c, 0x01, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xf0, 0x00, 0x01, 0xfc, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xf8, 0x00, 0x03, 0xfc, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xf8, 0x00, 0x03, 0xf8, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x01, 0xff, 0xc0, + 0xff, 0xfc, 0x00, 0x07, 0xf0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xc0, + 0xff, 0xfe, 0x00, 0x0f, 0xf8, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0x00, 0x1f, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0x80, 0x3f, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xfc, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xc0, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0x00, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xf8, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xe0, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0x00, 0x03, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xfc, 0x00, 0x0f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0x00, 0x00, 0x01, 0xff, 0x80, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x03, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x03, 0xff, 0x00, 0x00, 0x3f, 0xff, 0xf8, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xfc, 0x00, 0x03, 0xff, 0x00, 0x00, 0x7f, 0xff, 0xfe, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xfe, 0x00, 0x00, 0x03, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0x80, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xf0, 0x00, 0x00, 0x03, 0xff, 0x00, 0x03, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x07, 0xff, 0x81, 0xff, 0xe0, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x07, 0xfe, 0x00, 0x7f, 0xe0, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x00, 0x0f, 0xf8, 0x00, 0x1f, 0xf0, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0xf0, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x07, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xe0, 0x00, 0x0f, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xe0, 0x00, 0x07, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x01, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xc0, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x3f, 0xc0, 0x00, 0x03, 0xfc, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x3f, 0xc0, 0x00, 0x03, 0xfc, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x3f, 0x80, 0x00, 0x03, 0xfc, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x3f, 0x80, 0x00, 0x03, 0xfc, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x3f, 0x80, 0x00, 0x03, 0xfc, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x3f, 0xc0, 0x00, 0x03, 0xfc, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x3f, 0xc0, 0x00, 0x03, 0xfc, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x3f, 0xc0, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x03, 0xff, 0x00, 0x1f, 0xe0, 0x00, 0x07, 0xc0, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0x00, 0x1f, 0xe0, 0x00, 0x06, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xfe, 0x00, 0x03, 0xff, 0x00, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xf0, 0x00, 0x03, 0xff, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x03, 0xff, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xf8, 0x00, 0x00, 0x03, 0xff, 0x00, 0x07, 0xff, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xff, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x01, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x03, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x3f, 0xff, 0xfc, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x7f, 0xff, 0xfe, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xff, 0xff, 0xff, 0x80, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x03, 0xff, 0x00, 0x07, 0xff, 0x00, 0xff, 0xe0, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x03, 0xff, 0x00, 0x0f, 0xfc, 0x00, 0x3f, 0xe0, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xff, 0x00, 0x0f, 0xf8, 0x00, 0x1f, 0xf0, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xf8, 0x00, 0x03, 0xff, 0x00, 0x1f, 0xf0, 0x00, 0x0f, 0xf0, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0x00, 0x1f, 0xe0, 0x00, 0x07, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xfc, 0x00, 0x00, 0x03, 0xff, 0x00, 0x1f, 0xe0, 0x00, 0x07, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xe0, 0x00, 0x00, 0x03, 0xff, 0x00, 0x3f, 0xc0, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x3f, 0xc0, 0x00, 0x03, 0xfc, 0x01, 0xff, 0xc0, + 0xff, 0xf8, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x3f, 0xc0, 0x00, 0x03, 0xfc, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x3f, 0x80, 0x00, 0x03, 0xfc, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x3f, 0x80, 0x00, 0x03, 0xfc, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x07, 0xff, 0xff, 0xff, 0x00, 0x3f, 0x80, 0x00, 0x03, 0xfc, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x3f, 0xc0, 0x00, 0x03, 0xfc, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x3f, 0xc0, 0x00, 0x03, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xc0, 0x00, 0x03, 0xf0, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xe0, 0x00, 0x07, 0x80, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x01, 0xff, 0xff, 0xff, 0x00, 0x07, 0xfe, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x00, 0x07, 0xff, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xfc, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xf8, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xf0, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xfe, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x03, 0xff, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0xfe, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xfe, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xe0, 0x7f, 0xff, 0xf3, 0xff, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0x00, 0x0f, 0xff, 0xc3, 0xff, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xfe, 0x00, 0x07, 0xff, 0x03, 0xff, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xfc, 0x00, 0x03, 0xfc, 0x03, 0xff, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xf8, 0x00, 0x01, 0xf0, 0x03, 0xff, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xf0, 0x00, 0x00, 0xc0, 0x03, 0xff, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x1f, 0x80, 0x00, 0x07, 0xff, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xc0, 0x00, 0x1f, 0xff, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xe0, 0x00, 0x7f, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xe0, 0x01, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xe0, 0x0f, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xe0, 0x3f, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xe0, 0x7f, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xe0, 0x7f, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xe0, 0x7f, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xe0, 0x7f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xe0, 0x7f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0xc0, 0x3f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xfe, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0x00, 0xfc, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xfc, 0x00, 0x38, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xf8, 0x00, 0x10, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xff, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x7c, 0x03, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x1e, 0x00, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x80, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x80, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x80, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x80, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x80, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x80, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x80, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x80, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x80, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x3f, 0x80, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xe0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0 +}; + + // Array of all bitmaps for convenience. (Total bytes used to store images in PROGMEM = 8032) -const int epd_icons_allArray_LEN = 5; +const int epd_icons_allArray_LEN = 7; const unsigned char* epd_icons_allArray[epd_icons_allArray_LEN] = { epd_icons_pickaxe, epd_icons_rocket_launch, epd_icons_lightning, epd_icons_flash, - epd_icons_bitaxe_logo + epd_icons_bitaxe_logo, + epd_icons_ocean_logo, + epd_icons_braiins_logo }; diff --git a/src/lib/config.cpp b/src/lib/config.cpp index 1dac009..f764b54 100644 --- a/src/lib/config.cpp +++ b/src/lib/config.cpp @@ -95,6 +95,11 @@ void setup() setupBitaxeFetchTask(); } + if (preferences.getBool("miningPoolStatsEnabled", DEFAULT_MINING_POOL_STATS_ENABLED)) + { + setupMiningPoolStatsFetchTask(); + } + setupButtonTask(); setupOTA(); @@ -331,6 +336,11 @@ void setupPreferences() addScreenMapping(SCREEN_BITAXE_HASHRATE, "BitAxe Hashrate"); addScreenMapping(SCREEN_BITAXE_BESTDIFF, "BitAxe Best Difficulty"); } + + if (preferences.getBool("miningPoolStatsEnabled", DEFAULT_MINING_POOL_STATS_ENABLED)) + { + addScreenMapping(SCREEN_MINING_POOL_STATS_HASHRATE, "Mining Pool Hashrate"); + } } String replaceAmbiguousChars(String input) diff --git a/src/lib/config.hpp b/src/lib/config.hpp index 51aef87..87dd4d6 100644 --- a/src/lib/config.hpp +++ b/src/lib/config.hpp @@ -18,6 +18,7 @@ #include "lib/ota.hpp" #include "lib/nostr_notify.hpp" #include "lib/bitaxe_fetch.hpp" +#include "lib/mining_pool_stats_fetch.hpp" #include "lib/v2_notify.hpp" diff --git a/src/lib/defaults.hpp b/src/lib/defaults.hpp index 11df69a..8380f46 100644 --- a/src/lib/defaults.hpp +++ b/src/lib/defaults.hpp @@ -58,6 +58,13 @@ #define DEFAULT_BITAXE_ENABLED false #define DEFAULT_BITAXE_HOSTNAME "bitaxe1" +#define MINING_POOL_NAME_OCEAN "ocean" +#define MINING_POOL_NAME_BRAIINS "braiins" + +#define DEFAULT_MINING_POOL_STATS_ENABLED true +#define DEFAULT_MINING_POOL_NAME MINING_POOL_NAME_OCEAN +#define DEFAULT_MINING_POOL_USER "38Qkkei3SuF1Eo45BaYmRHUneRD54yyTFy" // Random actual Ocean hasher + #define DEFAULT_ZAP_NOTIFY_ENABLED false #define DEFAULT_ZAP_NOTIFY_PUBKEY "b5127a08cf33616274800a4387881a9f98e04b9c37116e92de5250498635c422" #define DEFAULT_LED_FLASH_ON_ZAP true diff --git a/src/lib/epd.cpp b/src/lib/epd.cpp index 2b30f26..5281087 100644 --- a/src/lib/epd.cpp +++ b/src/lib/epd.cpp @@ -613,6 +613,12 @@ void renderIcon(const uint dispNum, const String &text, bool partial) else if (text.endsWith("bitaxe")) { iconIndex = 4; } + else if (text.endsWith("ocean_logo")) { + iconIndex = 5; + } + else if (text.endsWith("braiins_logo")) { + iconIndex = 6; + } diff --git a/src/lib/mining_pool_stats_fetch.cpp b/src/lib/mining_pool_stats_fetch.cpp new file mode 100644 index 0000000..6fd3914 --- /dev/null +++ b/src/lib/mining_pool_stats_fetch.cpp @@ -0,0 +1,120 @@ +#include "mining_pool_stats_fetch.hpp" + +TaskHandle_t miningPoolStatsFetchTaskHandle; + +std::string miningPoolStatsHashrate; +std::string miningPoolStatsBestDiff; + +std::string getMiningPoolStatsHashRate() +{ + return miningPoolStatsHashrate; +} + + +void taskMiningPoolStatsFetch(void *pvParameters) +{ + for (;;) + { + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + + HTTPClient http; + http.setUserAgent(USER_AGENT); + String miningPoolStatsApiUrl; + + // TODO: Remove when webui gets proper update + Serial.println("FORCING miningPoolUser"); + preferences.putString("miningPoolName", MINING_POOL_NAME_OCEAN); + + Serial.println("miningPoolName: \"" + preferences.getString("miningPoolName", DEFAULT_MINING_POOL_NAME) + "\""); + Serial.println("miningPoolUser: \"" + preferences.getString("miningPoolUser", DEFAULT_MINING_POOL_USER) + "\""); + + std::string httpHeaderKey = ""; + std::string httpHeaderValue; + if (preferences.getString("miningPoolName", DEFAULT_MINING_POOL_NAME) == MINING_POOL_NAME_OCEAN) { + miningPoolStatsApiUrl = "https://api.ocean.xyz/v1/statsnap/" + preferences.getString("miningPoolUser", DEFAULT_MINING_POOL_USER); + Serial.println(miningPoolStatsApiUrl); + + } + else if (preferences.getString("miningPoolName", DEFAULT_MINING_POOL_NAME) == MINING_POOL_NAME_BRAIINS) { + miningPoolStatsApiUrl = "https://pool.braiins.com/accounts/profile/json/btc/"; + httpHeaderKey = "Pool-Auth-Token"; + httpHeaderValue = preferences.getString("miningPoolUser", DEFAULT_MINING_POOL_USER).c_str(); + Serial.println(miningPoolStatsApiUrl); + } + else + { + Serial.println("Unknown mining pool: \"" + preferences.getString("miningPoolName", DEFAULT_MINING_POOL_NAME) + "\""); + continue; + } + + http.begin(miningPoolStatsApiUrl.c_str()); + + if (httpHeaderKey.length() > 0) { + http.addHeader(httpHeaderKey.c_str(), httpHeaderValue.c_str()); + } + + int httpCode = http.GET(); + + if (httpCode == 200) + { + String payload = http.getString(); + JsonDocument doc; + deserializeJson(doc, payload); + + Serial.println(doc.as()); + + if (preferences.getString("miningPoolName", DEFAULT_MINING_POOL_NAME) == MINING_POOL_NAME_OCEAN) { + Serial.println(doc["result"].as()); + Serial.println(doc["result"]["hashrate_300s"].as()); + miningPoolStatsHashrate = doc["result"]["hashrate_300s"].as(); + } + else if (preferences.getString("miningPoolName", DEFAULT_MINING_POOL_NAME) == MINING_POOL_NAME_BRAIINS) { + // Reports hashrate in specific hashrate units (e.g. Gh/s); we want raw total hashes per second. + std::string hashrateUnit = doc["btc"]["hash_rate_unit"].as(); + Serial.println(doc["btc"]["hash_rate_unit"].as()); + int multiplier = 0; + if (hashrateUnit == "Zh/s") { + multiplier = 21; + } else if (hashrateUnit == "Eh/s") { + multiplier = 18; + } else if (hashrateUnit == "Ph/s") { + multiplier = 15; + } else if (hashrateUnit == "Th/s") { + multiplier = 12; + } else if (hashrateUnit == "Gh/s") { + multiplier = 9; + } else if (hashrateUnit == "Mh/s") { + multiplier = 6; + } else if (hashrateUnit == "Kh/s") { + multiplier = 3; + } + + // Add zeroes to pad to a full h/s output + miningPoolStatsHashrate = std::to_string(static_cast(std::round(doc["btc"]["hash_rate_5m"].as()))) + std::string(multiplier, '0'); + Serial.println(miningPoolStatsHashrate.c_str()); + } + + // if (workQueue != nullptr && (getCurrentScreen() == SCREEN_MINING_POOL_STATS_HASHRATE || getCurrentScreen() == SCREEN_MINING_POOL_STATS_BESTDIFF)) + if (workQueue != nullptr && (getCurrentScreen() == SCREEN_MINING_POOL_STATS_HASHRATE)) + { + WorkItem priceUpdate = {TASK_MINING_POOL_STATS_UPDATE, 0}; + xQueueSend(workQueue, &priceUpdate, portMAX_DELAY); + } + } + else + { + Serial.print( + F("Error retrieving mining pool data. HTTP status code: ")); + Serial.println(httpCode); + Serial.println(miningPoolStatsApiUrl); + } + } +} + +void setupMiningPoolStatsFetchTask() +{ + xTaskCreate(taskMiningPoolStatsFetch, "miningPoolStatsFetch", (6 * 1024), NULL, tskIDLE_PRIORITY, + &miningPoolStatsFetchTaskHandle); + + xTaskNotifyGive(miningPoolStatsFetchTaskHandle); +} \ No newline at end of file diff --git a/src/lib/mining_pool_stats_fetch.hpp b/src/lib/mining_pool_stats_fetch.hpp new file mode 100644 index 0000000..f06207b --- /dev/null +++ b/src/lib/mining_pool_stats_fetch.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +#include "lib/config.hpp" +#include "lib/shared.hpp" + +extern TaskHandle_t miningPoolStatsFetchTaskHandle; + +void setupMiningPoolStatsFetchTask(); +void taskMiningPoolStatsFetch(void *pvParameters); + +std::string getMiningPoolStatsHashRate(); +// std::string getMiningPoolStatsBestDiff(); \ No newline at end of file diff --git a/src/lib/screen_handler.cpp b/src/lib/screen_handler.cpp index 1f2b4a4..5d8c41c 100644 --- a/src/lib/screen_handler.cpp +++ b/src/lib/screen_handler.cpp @@ -33,9 +33,19 @@ void workerTask(void *pvParameters) { parseBitaxeBestDiff(getBitaxeBestDiff()); } setEpdContent(taskEpdContent); - + break; + } + case TASK_MINING_POOL_STATS_UPDATE: { + if (getCurrentScreen() == SCREEN_MINING_POOL_STATS_HASHRATE) { + taskEpdContent = + parseMiningPoolStatsHashRate(preferences.getString("miningPoolName", DEFAULT_MINING_POOL_NAME).c_str(), getMiningPoolStatsHashRate()); + // } else if (getCurrentScreen() == SCREEN_BITAXE_BESTDIFF) { + // taskEpdContent = + // parseBitaxeBestDiff(getBitaxeBestDiff()); + } + setEpdContent(taskEpdContent); + break; } - break; case TASK_PRICE_UPDATE: { uint currency = getCurrentCurrency(); uint price = getPrice(currency); @@ -179,6 +189,16 @@ void setCurrentScreen(uint newScreen) { return; } break; + } + case SCREEN_MINING_POOL_STATS_HASHRATE: { + if (preferences.getBool("miningPoolStatsEnabled", DEFAULT_MINING_POOL_STATS_ENABLED)) { + WorkItem miningPoolStatsUpdate = {TASK_MINING_POOL_STATS_UPDATE, 0}; + xQueueSend(workQueue, &miningPoolStatsUpdate, portMAX_DELAY); + } else { + setCurrentScreen(SCREEN_BLOCK_HEIGHT); + return; + } + break; } } diff --git a/src/lib/screen_handler.hpp b/src/lib/screen_handler.hpp index 6c99a7c..ee658c9 100644 --- a/src/lib/screen_handler.hpp +++ b/src/lib/screen_handler.hpp @@ -6,6 +6,7 @@ #include #include +#include #include "lib/epd.hpp" #include "lib/shared.hpp" @@ -23,7 +24,8 @@ typedef enum { TASK_BLOCK_UPDATE, TASK_FEE_UPDATE, TASK_TIME_UPDATE, - TASK_BITAXE_UPDATE + TASK_BITAXE_UPDATE, + TASK_MINING_POOL_STATS_UPDATE } TaskType; typedef struct { diff --git a/src/lib/shared.hpp b/src/lib/shared.hpp index 4753764..5fc2c2b 100644 --- a/src/lib/shared.hpp +++ b/src/lib/shared.hpp @@ -60,6 +60,8 @@ const PROGMEM int SCREEN_MARKET_CAP = 30; const PROGMEM int SCREEN_BITAXE_HASHRATE = 80; const PROGMEM int SCREEN_BITAXE_BESTDIFF = 81; +const PROGMEM int SCREEN_MINING_POOL_STATS_HASHRATE = 85; + const PROGMEM int SCREEN_COUNTDOWN = 98; const PROGMEM int SCREEN_CUSTOM = 99; const int SCREEN_COUNT = 7; diff --git a/src/lib/timers.cpp b/src/lib/timers.cpp index d84d358..2fdb71c 100644 --- a/src/lib/timers.cpp +++ b/src/lib/timers.cpp @@ -72,6 +72,10 @@ void IRAM_ATTR minuteTimerISR(void *arg) { vTaskNotifyGiveFromISR(bitaxeFetchTaskHandle, &xHigherPriorityTaskWoken); } + if (miningPoolStatsFetchTaskHandle != NULL) { + vTaskNotifyGiveFromISR(miningPoolStatsFetchTaskHandle, &xHigherPriorityTaskWoken); + } + if (xHigherPriorityTaskWoken == pdTRUE) { portYIELD_FROM_ISR(); } diff --git a/src/lib/webserver.cpp b/src/lib/webserver.cpp index 11b9024..0a55ff8 100644 --- a/src/lib/webserver.cpp +++ b/src/lib/webserver.cpp @@ -510,7 +510,7 @@ void onApiSettingsPatch(AsyncWebServerRequest *request, JsonVariant &json) settings["timePerScreen"].as() * 60); } - String strSettings[] = {"hostnamePrefix", "mempoolInstance", "nostrPubKey", "nostrRelay", "bitaxeHostname", "nostrZapPubkey", "httpAuthUser", "httpAuthPass", "gitReleaseUrl"}; + String strSettings[] = {"hostnamePrefix", "mempoolInstance", "nostrPubKey", "nostrRelay", "bitaxeHostname", "miningPoolName", "miningPoolUser", "nostrZapPubkey", "httpAuthUser", "httpAuthPass", "gitReleaseUrl"}; for (String setting : strSettings) { @@ -549,7 +549,7 @@ void onApiSettingsPatch(AsyncWebServerRequest *request, JsonVariant &json) "mowMode", "suffixShareDot", "flOffWhenDark", "flAlwaysOn", "flDisable", "flFlashOnUpd", "mempoolSecure", "useNostr", "bitaxeEnabled", - "verticalDesc", + "miningPoolStatsEnabled", "verticalDesc", "nostrZapNotify", "stagingSource", "httpAuthEnabled"}; for (String setting : boolSettings) @@ -714,6 +714,10 @@ void onApiSettingsGet(AsyncWebServerRequest *request) root["bitaxeEnabled"] = preferences.getBool("bitaxeEnabled", DEFAULT_BITAXE_ENABLED); root["bitaxeHostname"] = preferences.getString("bitaxeHostname", DEFAULT_BITAXE_HOSTNAME); + root["miningPoolStatsEnabled"] = preferences.getBool("miningPoolStatsEnabled", DEFAULT_MINING_POOL_STATS_ENABLED); + root["miningPoolName"] = preferences.getString("miningPoolName", DEFAULT_MINING_POOL_NAME); + root["miningPoolUser"] = preferences.getString("miningPoolUser", DEFAULT_MINING_POOL_USER); + root["httpAuthEnabled"] = preferences.getBool("httpAuthEnabled", DEFAULT_HTTP_AUTH_ENABLED); root["httpAuthUser"] = preferences.getString("httpAuthUser", DEFAULT_HTTP_AUTH_USERNAME); root["httpAuthPass"] = preferences.getString("httpAuthPass", DEFAULT_HTTP_AUTH_PASSWORD);