├── .gitignore ├── LICENSE ├── README.md ├── data └── .gitignore ├── img ├── PWR.png ├── S.png ├── SMeter.png ├── SMeterBottom.jpg ├── SMeterBottom.png ├── SMeterMiddle.jpg ├── SMeterMiddle.png ├── SMeterTop.jpg ├── SMeterTop.png ├── SWR.png └── bin2array.py ├── include └── README ├── lib └── README ├── platformio.ini ├── src ├── BasicAndGrey.h ├── Core2.h ├── IC705SMeter.cpp ├── IC705SMeter.h ├── Web │ ├── LICENSE │ ├── README.md │ ├── bin2array.py │ ├── button.png │ ├── button_full.png │ ├── indexBasicAndGrey.html │ ├── indexCore2.html │ ├── m5_basic.png │ ├── m5_basic_full.png │ ├── m5_core2.png │ ├── m5_core2_full.png │ ├── screenshot.bmp │ └── screenshot.png ├── WebIndexBasicAndGrey.h ├── WebIndexCore2.h ├── font.h ├── functions.h ├── image.h ├── settings.h └── tasks.h └── test └── README /.gitignore: -------------------------------------------------------------------------------- 1 | .pio 2 | .vscode/.browse.c_cpp.db* 3 | .vscode/c_cpp_properties.json 4 | .vscode/launch.json 5 | .vscode/ipch 6 | .vscode/extensions.json 7 | .vscode/settings.json 8 | .DS_Store -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Armel FAUVEAU 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # IC705SMeter 2 | ![basic](https://img.shields.io/badge/M5Stack-BASIC-blue) 3 | ![grey](https://img.shields.io/badge/M5Stack-GREY-blue) 4 | ![fire](https://img.shields.io/badge/M5Stack-FIRE-orange) 5 | ![core2](https://img.shields.io/badge/M5Stack-CORE2-green) 6 | ![aws](https://img.shields.io/badge/M5Stack-AWS-orange) 7 | 8 | ![licence](https://img.shields.io/github/license/armel/IC705SMeter) 9 | ![language](https://img.shields.io/github/languages/top/armel/IC705SMeter) 10 | ![size](https://img.shields.io/github/repo-size/armel/IC705SMeter) 11 | ![version](https://img.shields.io/github/v/release/armel/IC705SMeter) 12 | ![activity](https://img.shields.io/github/commit-activity/y/armel/IC705SMeter) 13 | 14 | **This project will no longer be maintained. Please see the new [project](https://github.com/armel/ICSMeter/) which is compatible with IC-705, IC-7300 and IC-9700.** 15 | 16 | **An excellent [video](https://www.youtube.com/watch?v=SCPEO7Eiy1E&ab_channel=HAMRADIODUDE) was released by @HamRadioDude about the installation of the IC705SMeter project. It can help you !** 17 | 18 | The IC7505SMeter project allows to equip the extraordinary IC705 produced by ICOM, with a needle S-Meter ! The S-Meter allows to measure the S signal, the Po power and the SWR. It also displays the current frequency, mode and filter. 19 | 20 | ![IC705SMeter S](https://github.com/armel/IC705SMeter/blob/main/img/S.png) 21 | 22 | ![IC705SMeter PWR](https://github.com/armel/IC705SMeter/blob/main/img/PWR.png) 23 | 24 | ![IC705SMeter SWR](https://github.com/armel/IC705SMeter/blob/main/img/SWR.png) 25 | 26 | # Technical architecture 27 | 28 | ## Quick overview 29 | 30 | [M5Stack](https://m5stack.com/) is based on an ESP-32, dual core, which can be clocked up to 240 MHz. M5Stack has 16 MB of flash memory. Like all ESPs, Wi-Fi is of course integrated. The 2 inch IPS color display, based on the ILI9342C chipset, has a comfortable resolution of 320 x 240 pixels. It is very bright. The integrated battery is 110 mAh. It is possible to add an additional battery (700 or 800mAh) if needed. 31 | 32 | In terms of size and weight, it is very compact: 54 x 54 x 18mm for 47.2g. Can be carried in the pocket without any problem ;) 33 | 34 | ## Detailed technical specs 35 | 36 | Here are the detailed technical specs, for the curious: 37 | 38 | | Resources | Description | 39 | | --------- | ------------ | 40 | |ESP32| 240MHz dual core, 600 DMIPS, 520KB SRAM, Wi-Fi, dual mode Bluetooth 41 | Flash| Memory 16MB| 42 | |Power| Input 5V @ 500mA| 43 | |Port| TypeC x 1, GROVE(I2C+I/0+UART) x 1| 44 | |Core|Bottom Port PIN (G1,G2,G3,G16, G17, G18, G19, G21, G22, G23, G25, G26, G35, G36)| 45 | |IPS Screen| 2 inch, 320x240 Colorful TFT LCD, ILI9342C, max brightness 853nit| 46 | |Button| Custom button x 3| 47 | |Speaker| 1W-0928| 48 | |Battery| 110mAh @ 3.7V| 49 | |Antenna| 2.4G 3D Antenna| 50 | |Operating Temperature| 32°F to 104°F ( 0°C to 40°C )| 51 | |Net weight| 47.2g| 52 | |Gross weight| 93g| 53 | |Product Size| 54 x 54 x 18mm| 54 | |Package Size |95 x 65 x 25mm| 55 | |Case Material| Plastic ( PC )| 56 | 57 | ## In addition 58 | 59 | About the QSJ, count around 45€. You then have a complete development platform, totally autonomous, programmable in C and C++, MicroPython and UIFlow, from Linux, Windows or MacOS, all in a compact and ultra ergonomic box. 60 | 61 | 62 | # Installation 63 | 64 | ## Prepare the stack 65 | 66 | The easiest way is to install [PlateformIO for VSCode](https://platformio.org/install/ide?install=vscode) on your PC (Linux or Windows) or on your Mac (Intel or M1). It is a cross-platform and multilanguage development environment that is powerful and pleasant to use. 67 | 68 | Then, still on your PC or Mac, clone the IC705SMeter project via the command : 69 | 70 | `git clone https://github.com/armel/IC705SMeter.git` 71 | 72 | You can also download a [zip archive](https://github.com/armel/IC705SMeter/releases) of the project, if you prefer, and unzip it. 73 | 74 | As I said, an excellent [video](https://www.youtube.com/watch?v=SCPEO7Eiy1E&ab_channel=HAMRADIODUDE) was released by @HamRadioDude about the installation of the IC705SMeter project. It can help you ! 75 | 76 | ## Configuration 77 | 78 | Open the IC705SMeter project with PlateformIO for VSCode. 79 | 80 | ### File `src/settings.h` 81 | 82 | #### Model of M5Stack 83 | 84 | Line 5, check that the constant `BOARD` corresponds to your M5Stack model (by default, the constant is initialized to `BASIC`). So, indicate : 85 | 86 | - `BASIC` if you have an M5Stack BASIC 87 | 88 | ``` 89 | #define BOARD BASIC 90 | ``` 91 | 92 | - `GREY` if you have an M5Stack GREY 93 | 94 | ``` 95 | #define BOARD GREY 96 | ``` 97 | 98 | - `CORE2` if you have an M5Stack CORE2 99 | 100 | ``` 101 | #define BOARD CORE2 102 | ``` 103 | 104 | #### Bluetooth Address of your IC705 105 | 106 | Line 8, change the address of your IC705 if necessary. I have indicated the default value. Refer to the documentation, if needed. 107 | 108 | #### Wifi Configuration 109 | 110 | Line 11 and 12, indicate your SSID and your Wifi password. You can view your IC705SMeter from a simple browser. It is even possible to control it by this way, as the buttons are clickable. In order to display your IC705SMeter in your browser, just go to `http://ip_address_of_your_ic705smeter/`. As a reminder, the IP address that your IC705SMeter retrieves is displayed on the screen. 111 | 112 | > Beware: it's slow! And there is no automatic refresh. You have to click on the background of the screen image to make a new capture. And otherwise, as said, the buttons are functional. 113 | 114 | #### TFT image retention 115 | 116 | To avoid TFT image retention (also called _Burn In_), there is a kind of screen saver. If there is no action on the buttons or PTT, after a delay of 60 minutes, the screen will show the Icom logo. 117 | 118 | You can change the delay, line 14. 119 | 120 | If the screen saver is active and you press a button or the PTT to transmit, the IC705SMeter screen will come back. 121 | 122 | Note that if the connection between your M5Stack and the IC705 has been established and you turn off your IC705 or disconnect the Bluetooth link, the screen will go completely into _sleep mode_. The IC705SMeter screen will come back as soon as the Bluetooth link is established again. 123 | 124 | ### File `platformio.ini` 125 | 126 | If and only if __you are using the M5Stack Core2__, edit the `platformio.ini` file and modify the lines, 127 | 128 | ``` 129 | default_envs = m5stack-basic-grey 130 | ;default_envs = m5stack-core2 131 | ``` 132 | 133 | By, 134 | 135 | ``` 136 | ;default_envs = m5stack-basic-grey 137 | default_envs = m5stack-core2 138 | ``` 139 | 140 | This is the same as changing the target platform, the semicolon being a comment. 141 | 142 | ## Compiling and flashing the M5Stack 143 | 144 | Compile and upload the project to your M5Stack. You are done ! 145 | 146 | # Usage 147 | 148 | Once launched, you must connect your IC705 to your M5Stack via the menu (Set / Bluetooth Set) of your transceiver. Refer to the documentation, if needed. 149 | 150 | Using the buttons, you can change the measurement: 151 | 152 | - left: Po or PWR power 153 | - middle : S signal 154 | - right : SWR 155 | 156 | > Caution: the SWR measurement is reliable up to 3. Beyond that, the documentation provided by Icom is too inaccurate... 157 | 158 | In addition : 159 | 160 | - a long press on the left button allows to decrease the brightness, 161 | - a long press on the central button allows to switch off the M5Stack, 162 | - a long press on the right button allows to increase the brightness. 163 | 164 | > The value of the brightness is preserved at the next restart. 165 | 166 | # Using the Bin Loader (power user only...) 167 | 168 | It's possible to store several applications on the SPI Flash File Storage of your M5Stack or on SD Card Storage. At startup, a procedure is provided to load a particular application. 169 | 170 | ## Preparation 171 | 172 | I will detail here the procedure to deploy IC705SMeter and IC705MultiMeter applications on the same M5Stack. 173 | 174 | ### Step 1 - Compile 175 | 176 | Start by compiling your applications, as you used to do. Nothing changes here. For example, start by compiling the IC705SMeter application. Then do the same with the IC705MultiMeter application. 177 | 178 | ### Step 2 - Collecting the binary files 179 | 180 | That's it, you have compiled the IC705SMeter and IC705MultiMeter application? It's perfect. 181 | 182 | Each compilation has produced a binary. It is this binary that is sent / flashed to your M5Stack, via the USB connection. 183 | 184 | Go to the root of the IC705SMeter folder, which contains the whole project. And go to the : 185 | 186 | - `.pio/build/m5stack-basic-grey`, if you compiled for a GREY or BASIC M5Stack 187 | - `.pio/build/m5stack-core2`, if you compiled for M5Stack CORE2 or AWS 188 | 189 | You will find a `firmware.bin` file there. Now, there are 2 solutions... 190 | 191 | ### Step 2.1 - SD Card Storage (simple) 192 | 193 | Format an SD Card as FAT32. 194 | 195 | Copy the `firmware.bin` at the root of the SD Card. And take the opportunity to rename it, for example, `IC705SMeter.bin`. 196 | 197 | Do the same with the IC705MultiMeter application. Of course rename it with a different name, for example, `IC705MultiMeter.bin`. 198 | 199 | At this point, you should have 2 clearly identified binaries in the root of your SD Card : `IC705SMeter.bin` and `IC705MultiMeter.bin`. 200 | 201 | ### Step 2.2 - SPI Flash File Storage (more difficult) 202 | 203 | Copy `firmware.bin` in the `data` directory at the root of the IC705SMeter folder. And take the opportunity to rename it, for example, `IC705SMeter.bin`. 204 | 205 | > If the `data` folder does not exist, create it. 206 | 207 | Do the same with the IC705MultiMeter application. Go to the root of the IC705MultiMeter folder, which contains the whole project. And go to the directory : 208 | 209 | - `.pio/build/m5stack-basic-grey`, if you have compiled for a M5Stack GREY or BASIC 210 | - `.pio/build/m5stack-core2`, if you compiled for M5Stack CORE2 or AWS 211 | 212 | You will also find a `firmware.bin` file. Copy it, too, in the `data` directory at the __root of the IC705SMeter folder__. And take the opportunity to rename it to, for example, `IC705MultiMeter.bin`. 213 | 214 | > Important, the idea is to copy these 2 binaries in the same directory `data`** (located at the root of the IC705SMeter folder). 215 | 216 | At this point, you should have 2 clearly identified binaries: `IC705SMeter.bin` and `IC705MultiMeter.bin` in the `data` directory at the root of the IC705SMeter folder. 217 | 218 | So let's move on to what is probably the most complicated step. Open the IC705SMeter project from Visual Studio Code, as you would compile it. 219 | 220 | ![Capture](https://github.com/armel/RRFRemote/blob/main/img/flash_1.png) 221 | 222 | Step 1, click on the Platformio icon (the icon with an ant's head...). Step 2, unroll the section : 223 | 224 | - `m5stack-basic-grey`, if you have compiled for an M5Stack GREY or BASIC 225 | - `m5stack-core2`, if you compiled for M5Stack CORE2 or AWS 226 | 227 | ![Capture](https://github.com/armel/RRFRemote/blob/main/img/flash_2.png) 228 | 229 | Finally, step 3, go to the `Platform` sub-section. And click on `Upload Filesystem Image`. 230 | 231 | Wait ! It's coffee time (or beer) :) The contents of the `data` directory will be written to the SPI Flash File Storage of your M5Stack. Are you done? You're there !!!! 232 | 233 | ## Usage 234 | 235 | Start your M5Stack. You should see a black screen, followed by 1, 2 and 3 small dots at the top of the screen. This is the famous Bin Loader ;) 236 | 237 | As soon as the first little dot appears, you can : 238 | 239 | - either press the left or right button, to launch the default application. 240 | - or press the central button. In this case, the Bin Loader menu appears and offers you the list of available binaries in SPI Flash File Storage or SD Card. 241 | 242 | If you have followed the procedure perfectly, you should have a choice between `IC705SMeter.bin` and `IC705MultiMeter.bin`. 243 | 244 | The left and right buttons allow you to switch from one binary to another. And the middle button validates the selected binary. In this case, the selected application will be loaded ;) 245 | 246 | > The loading takes about 20 seconds... 247 | 248 | ## Limitation 249 | 250 | I think it is possible to have 3 or 4 applications cohabit in SPI Flash File Storage. If need more, use SD Card Storage. 251 | 252 | # Donations 253 | 254 | If you find this project fun and useful then [offer me a beer](https://www.paypal.me/F4HWN) :) 255 | 256 | By the way, you can follow me on [Twitter](https://twitter.com/F4HWN) and post pictures of your installation with your M5Stack. It always makes me happy ;) -------------------------------------------------------------------------------- /data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | */ 3 | !.gitignore -------------------------------------------------------------------------------- /img/PWR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/img/PWR.png -------------------------------------------------------------------------------- /img/S.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/img/S.png -------------------------------------------------------------------------------- /img/SMeter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/img/SMeter.png -------------------------------------------------------------------------------- /img/SMeterBottom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/img/SMeterBottom.jpg -------------------------------------------------------------------------------- /img/SMeterBottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/img/SMeterBottom.png -------------------------------------------------------------------------------- /img/SMeterMiddle.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/img/SMeterMiddle.jpg -------------------------------------------------------------------------------- /img/SMeterMiddle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/img/SMeterMiddle.png -------------------------------------------------------------------------------- /img/SMeterTop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/img/SMeterTop.jpg -------------------------------------------------------------------------------- /img/SMeterTop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/img/SMeterTop.png -------------------------------------------------------------------------------- /img/SWR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/img/SWR.png -------------------------------------------------------------------------------- /img/bin2array.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import binascii 3 | import sys 4 | import argparse 5 | 6 | parser = argparse.ArgumentParser(description='Convert binary file to C-style array initializer.') 7 | parser.add_argument("filename", help="the file to be converted") 8 | parser.add_argument("-O", "--output", help="write output to a file") 9 | parser.add_argument("-l", "--linebreak", type=int, help="add linebreak after every N element") 10 | parser.add_argument("-L", "--linebreak-string", default="\n", help="use what to break link, defaults to \"\\n\"") 11 | parser.add_argument("-S", "--separator-string", default=", ", help="use what to separate elements, defaults to \", \"") 12 | parser.add_argument("-H", "--element-prefix", default="0x", help="string to be added to the head of element, defaults to \"0x\"") 13 | parser.add_argument("-T", "--element-suffix", default="", help="string to be added to the tail of element, defaults to none") 14 | parser.add_argument("-U", "--force-uppercase", action='store_true', help="force uppercase HEX representation") 15 | parser.add_argument("-n", "--newline", action='store_true', help="add a newline on file end") 16 | args = parser.parse_args() 17 | 18 | def make_sublist_group(lst: list, grp: int) -> list: 19 | """ 20 | Group list elements into sublists. 21 | 22 | make_sublist_group([1, 2, 3, 4, 5, 6, 7], 3) = [[1, 2, 3], [4, 5, 6], 7] 23 | """ 24 | return [lst[i:i+grp] for i in range(0, len(lst), grp)] 25 | 26 | def do_convension(content: bytes, to_uppercase: bool=False) -> str: 27 | hexstr = binascii.hexlify(content).decode("UTF-8") 28 | if to_uppercase: 29 | hexstr = hexstr.upper() 30 | array = [args.element_prefix + hexstr[i:i + 2] + args.element_suffix for i in range(0, len(hexstr), 2)] 31 | if args.linebreak: 32 | array = make_sublist_group(array, args.linebreak) 33 | else: 34 | array = [array,] 35 | 36 | return args.linebreak_string.join([args.separator_string.join(e) + args.separator_string for e in array]) 37 | 38 | if __name__ == "__main__": 39 | with open(args.filename, 'rb') as f: 40 | file_content = f.read() 41 | ret = do_convension(file_content, to_uppercase=args.force_uppercase) 42 | if args.newline: 43 | ret = ret + args.linebreak_string 44 | if args.output: 45 | with open(args.output, 'w') as f: 46 | f.write(ret) 47 | else: 48 | print(ret) -------------------------------------------------------------------------------- /include/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project header files. 3 | 4 | A header file is a file containing C declarations and macro definitions 5 | to be shared between several project source files. You request the use of a 6 | header file in your project source file (C, C++, etc) located in `src` folder 7 | by including it, with the C preprocessing directive `#include'. 8 | 9 | ```src/main.c 10 | 11 | #include "header.h" 12 | 13 | int main (void) 14 | { 15 | ... 16 | } 17 | ``` 18 | 19 | Including a header file produces the same results as copying the header file 20 | into each source file that needs it. Such copying would be time-consuming 21 | and error-prone. With a header file, the related declarations appear 22 | in only one place. If they need to be changed, they can be changed in one 23 | place, and programs that include the header file will automatically use the 24 | new version when next recompiled. The header file eliminates the labor of 25 | finding and changing all the copies as well as the risk that a failure to 26 | find one copy will result in inconsistencies within a program. 27 | 28 | In C, the usual convention is to give header files names that end with `.h'. 29 | It is most portable to use only letters, digits, dashes, and underscores in 30 | header file names, and at most one dot. 31 | 32 | Read more about using header files in official GCC documentation: 33 | 34 | * Include Syntax 35 | * Include Operation 36 | * Once-Only Headers 37 | * Computed Includes 38 | 39 | https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html 40 | -------------------------------------------------------------------------------- /lib/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project specific (private) libraries. 3 | PlatformIO will compile them to static libraries and link into executable file. 4 | 5 | The source code of each library should be placed in a an own separate directory 6 | ("lib/your_library_name/[here are source files]"). 7 | 8 | For example, see a structure of the following two libraries `Foo` and `Bar`: 9 | 10 | |--lib 11 | | | 12 | | |--Bar 13 | | | |--docs 14 | | | |--examples 15 | | | |--src 16 | | | |- Bar.c 17 | | | |- Bar.h 18 | | | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html 19 | | | 20 | | |--Foo 21 | | | |- Foo.c 22 | | | |- Foo.h 23 | | | 24 | | |- README --> THIS FILE 25 | | 26 | |- platformio.ini 27 | |--src 28 | |- main.c 29 | 30 | and a contents of `src/main.c`: 31 | ``` 32 | #include 33 | #include 34 | 35 | int main (void) 36 | { 37 | ... 38 | } 39 | 40 | ``` 41 | 42 | PlatformIO Library Dependency Finder will find automatically dependent 43 | libraries scanning project source files. 44 | 45 | More information about PlatformIO Library Dependency Finder 46 | - https://docs.platformio.org/page/librarymanager/ldf.html 47 | -------------------------------------------------------------------------------- /platformio.ini: -------------------------------------------------------------------------------- 1 | ; PlatformIO Project Configuration File 2 | ; 3 | ; Build options: build flags, source filter 4 | ; Upload options: custom upload port, speed and extra flags 5 | ; Library options: dependencies, extra library storages 6 | ; Advanced options: extra scripting 7 | ; 8 | ; Please visit documentation for the other options and examples 9 | ; https://docs.platformio.org/page/projectconf.html 10 | 11 | [platformio] 12 | default_envs = m5stack-basic-grey 13 | ;default_envs = m5stack-core2 14 | 15 | [env:m5stack-core2] 16 | platform = espressif32 17 | board = m5stack-core2 18 | build_flags = -O2 19 | framework = arduino 20 | monitor_speed = 115200 21 | board_build.flash_mode = dio 22 | board_build.f_flash = 80000000L 23 | board_build.f_cpu = 240000000L 24 | board_build.partitions = large_spiffs_16MB.csv 25 | platform_packages = framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32/archive/refs/tags/1.0.6.zip 26 | lib_deps = 27 | m5stack/M5Core2@^0.1.0 28 | tobozo/M5Stack-SD-Updater@^1.1.8 29 | 30 | [env:m5stack-basic-grey] 31 | platform = espressif32 32 | board = m5stack-core-esp32 33 | build_flags = -O2 34 | framework = arduino 35 | monitor_speed = 115200 36 | board_build.flash_mode = dio 37 | board_build.f_flash = 80000000L 38 | board_build.f_cpu = 240000000L 39 | board_build.partitions = large_spiffs_16MB.csv 40 | platform_packages = framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32/archive/refs/tags/1.0.6.zip 41 | lib_deps = 42 | m5stack/M5Stack@^0.3.9 43 | tobozo/M5Stack-SD-Updater@^1.1.8 -------------------------------------------------------------------------------- /src/BasicAndGrey.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) F4HWN Armel. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | int btnA, btnB, btnC, btnL, btnM, btnR; 5 | 6 | // Power init 7 | void power() 8 | { 9 | M5.Power.begin(); 10 | } 11 | 12 | // Get Battery level 13 | int8_t getBatteryLevel(bool type) 14 | { 15 | return M5.Power.getBatteryLevel(); 16 | } 17 | 18 | // Control if charging 19 | bool isCharging() 20 | { 21 | return M5.Power.isCharging(); 22 | } 23 | 24 | // Get button 25 | void getButton() 26 | { 27 | M5.update(); 28 | btnA = M5.BtnA.read(); 29 | btnB = M5.BtnB.read(); 30 | btnC = M5.BtnC.read(); 31 | btnL = M5.BtnA.pressedFor(2000); 32 | btnM = M5.BtnB.pressedFor(2000); 33 | btnR = M5.BtnC.pressedFor(2000); 34 | 35 | if (btnL) 36 | { 37 | btnA = 0; 38 | //Serial.println("Left"); 39 | } 40 | else if (btnM) 41 | { 42 | btnB = 0; 43 | //Serial.println("Middle"); 44 | } 45 | else if (btnR) 46 | { 47 | btnC = 0; 48 | //Serial.println("Right"); 49 | } 50 | 51 | /* 52 | Serial.print(btnA); 53 | Serial.print(btnB); 54 | Serial.print(btnC); 55 | Serial.print(btnL); 56 | Serial.println(btnR); 57 | */ 58 | } 59 | 60 | // Manage brightness 61 | void setBrightness(uint8_t value) 62 | { 63 | M5.Lcd.setBrightness(value); 64 | } 65 | 66 | // Shutdown 67 | void shutdown() 68 | { 69 | M5.Power.powerOFF(); 70 | } -------------------------------------------------------------------------------- /src/Core2.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) F4HWN Armel. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | int btnA, btnB, btnC, btnL, btnM, btnR; 5 | 6 | // Expand virtual fucking button 7 | Button myBtnA(0, 200, 100, 80); 8 | Button myBtnB(110, 200, 100, 80); 9 | Button myBtnC(220, 200, 100, 80); 10 | 11 | // Power init 12 | void power() 13 | { 14 | // By default, M5.begin() will initialize AXP192 chip on Core2 15 | M5.Axp.SetLed(0); 16 | } 17 | 18 | // Get Battery level 19 | int8_t getBatteryLevel(bool type) 20 | { 21 | float baterryVoltage = M5.Axp.GetBatVoltage(); 22 | int16_t batteryPercentage = (baterryVoltage < 3.2) ? 0 : (baterryVoltage - 3.2) * 100; 23 | 24 | if (batteryPercentage > 100) 25 | { 26 | batteryPercentage = 100; 27 | } 28 | 29 | if (type == 0) 30 | { 31 | if (batteryPercentage > 80) 32 | { 33 | return 100; 34 | } 35 | else if (batteryPercentage > 60) 36 | { 37 | return 75; 38 | } 39 | else if (batteryPercentage > 40) 40 | { 41 | return 50; 42 | } 43 | else if (batteryPercentage > 20) 44 | { 45 | return 25; 46 | } 47 | return 0; 48 | } 49 | else 50 | { 51 | return batteryPercentage; 52 | } 53 | } 54 | 55 | // Control if charging 56 | bool isCharging() 57 | { 58 | if (M5.Axp.GetBatCurrent() < 0) 59 | { 60 | return 0; 61 | } 62 | else 63 | { 64 | return 1; 65 | } 66 | } 67 | 68 | // Get button 69 | void getButton() 70 | { 71 | M5.update(); 72 | btnA = myBtnA.read(); 73 | btnB = myBtnB.read(); 74 | btnC = myBtnC.read(); 75 | btnL = myBtnA.pressedFor(2000); 76 | btnM = myBtnB.pressedFor(2000); 77 | btnR = myBtnC.pressedFor(2000); 78 | 79 | if (btnL) 80 | { 81 | btnA = 0; 82 | //Serial.println("Left"); 83 | } 84 | else if (btnM) 85 | { 86 | btnB = 0; 87 | //Serial.println("Middle"); 88 | } 89 | else if (btnR) 90 | { 91 | btnC = 0; 92 | //Serial.println("Right"); 93 | } 94 | 95 | /* 96 | Serial.print(btnA); 97 | Serial.print(btnB); 98 | Serial.print(btnC); 99 | Serial.print(btnL); 100 | Serial.println(btnR); 101 | */ 102 | } 103 | 104 | // Manage brightness 105 | void setBrightness(uint8_t value) 106 | { 107 | uint16_t tmp = map(value, 0, 128, 2500, 3300); 108 | M5.Axp.SetLcdVoltage(tmp); // from 2500 to 3300 109 | } 110 | 111 | // Shutdown 112 | void shutdown() 113 | { 114 | M5.Axp.PowerOff(); 115 | } -------------------------------------------------------------------------------- /src/IC705SMeter.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) F4HWN Armel. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | #include 5 | #include "functions.h" 6 | #include "tasks.h" 7 | 8 | // Setup 9 | void setup() 10 | { 11 | uint8_t loop = 0; 12 | 13 | // Debug 14 | Serial.begin(115200); 15 | 16 | // Init M5 17 | M5.begin(true, true, false, false); 18 | 19 | // Init Power 20 | power(); 21 | 22 | // Preferences 23 | preferences.begin(NAME); 24 | option = preferences.getUInt("option", 2); 25 | brightness = preferences.getUInt("brightness", 64); 26 | 27 | // Bin Loader 28 | binLoader(); 29 | 30 | // Wifi 31 | WiFi.begin(WIFI_SSID, WIFI_PASSWORD); 32 | while (WiFi.status() != WL_CONNECTED && loop <= 10) 33 | { 34 | delay(250); 35 | loop += 1; 36 | } 37 | 38 | // Start server (for Web site Screen Capture) 39 | httpServer.begin(); 40 | 41 | // Let's go 42 | #if BOARD == CORE2 43 | M5.Axp.SetLed(0); 44 | #endif 45 | 46 | setBrightness(brightness); 47 | M5.Lcd.setRotation(1); 48 | M5.Lcd.fillScreen(TFT_BACK); 49 | 50 | viewGUI(); 51 | 52 | CAT.register_callback(callbackBT); 53 | 54 | if (!CAT.begin(NAME)) 55 | { 56 | Serial.println("An error occurred initializing Bluetooth"); 57 | } 58 | else 59 | { 60 | Serial.println("Bluetooth initialized"); 61 | } 62 | 63 | // Multitasking task for retreive button 64 | xTaskCreatePinnedToCore( 65 | button, // Function to implement the task 66 | "button", // Name of the task 67 | 8192, // Stack size in words 68 | NULL, // Task input parameter 69 | 4, // Priority of the task 70 | NULL, // Task handle 71 | 1); // Core where the task should run 72 | } 73 | 74 | // Main loop 75 | void loop() 76 | { 77 | static uint8_t alternance = 0; 78 | static uint8_t tx = 0; 79 | 80 | tx = getTX(); 81 | if(tx != 0) screensaver = millis(); // If transmit, refresh tempo 82 | 83 | if (screensaverMode == 0) { 84 | 85 | viewMenu(); 86 | viewBattery(); 87 | viewBaseline(alternance); 88 | 89 | if (btConnected == false) 90 | { 91 | value("NEED PAIRING"); 92 | } 93 | 94 | if (btConnected == true) 95 | { 96 | getMode(); 97 | getFrequency(); 98 | 99 | switch (option) 100 | { 101 | case 0: 102 | getPower(); 103 | break; 104 | 105 | case 1: 106 | getSmeter(); 107 | break; 108 | 109 | case 2: 110 | getSWR(); 111 | break; 112 | } 113 | } 114 | } 115 | 116 | alternance = (alternance++ < 30) ? alternance : 0; 117 | 118 | // Manage Screen Saver 119 | wakeAndSleep(); 120 | 121 | // Manage Web Server if enable 122 | if (WiFi.status() == WL_CONNECTED) 123 | { 124 | getScreenshot(); 125 | } 126 | 127 | vTaskDelay(10); 128 | } -------------------------------------------------------------------------------- /src/IC705SMeter.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) F4HWN Armel. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | #include "settings.h" 5 | 6 | #define BASIC 1 7 | #define GREY 2 8 | #define CORE2 3 9 | 10 | #define TIMEOUT_BIN_LOADER 3 // 3 sec 11 | 12 | #if BOARD == BASIC 13 | #include 14 | #include "BasicAndGrey.h" 15 | #include "WebIndexBasicAndGrey.h" 16 | #elif BOARD == GREY 17 | #include 18 | #include "BasicAndGrey.h" 19 | #include "WebIndexBasicAndGrey.h" 20 | #elif BOARD == CORE2 21 | #include 22 | #include "Core2.h" 23 | #include "WebIndexCore2.h" 24 | #endif 25 | 26 | #include 27 | #include 28 | #include "BluetoothSerial.h" 29 | #include 30 | #include 31 | #include "FS.h" 32 | #include "SPIFFS.h" 33 | #include 34 | 35 | #define VERSION "2.3.3" 36 | #define AUTHOR "F4HWN" 37 | #define NAME "IC705SMeter" 38 | 39 | // Needle 40 | #define TFT_BACK M5.Lcd.color565(255, 248, 236) 41 | #define TFT_MODE M5.Lcd.color565(84, 103, 143) 42 | #define TFT_NEDDLE_1 M5.Lcd.color565(241, 120, 100) 43 | #define TFT_NEDDLE_2 M5.Lcd.color565(241, 170, 170) 44 | 45 | // Bluetooth connector 46 | BluetoothSerial CAT; 47 | 48 | // Preferences 49 | Preferences preferences; 50 | 51 | // Global Variables 52 | WiFiServer httpServer(80); 53 | WiFiClient httpClient; 54 | uint8_t htmlGetRequest; 55 | uint8_t htmlGetRefresh = 3; 56 | uint8_t option = 2; 57 | uint8_t brightness = 64; 58 | uint8_t batteryLevelOld = 0; 59 | uint8_t optionOld = 5; 60 | 61 | uint32_t screensaver; 62 | 63 | float angleOld = 0; 64 | 65 | boolean reset = true; 66 | boolean screensaverMode = 0; 67 | boolean btConnected = false; 68 | boolean batteryCharginglOld = true; 69 | 70 | String modeOld = ""; 71 | String filterOld = ""; 72 | String valStringOld = ""; 73 | String subValStringOld = ""; 74 | 75 | char dataMode = 0; 76 | 77 | const char *menu[] = {"PWR", "S", "SWR"}; 78 | 79 | // Web site Screen Capture stuff 80 | #define GET_unknown 0 81 | #define GET_index_page 1 82 | #define GET_screenshot 2 83 | 84 | // Flags for button presses via Web site Screen Capture 85 | bool buttonLeftPressed = false; 86 | bool buttonCenterPressed = false; 87 | bool buttonRightPressed = false; 88 | 89 | // Bin loader 90 | File root; 91 | String binFilename[128]; 92 | uint8_t binIndex = 0; 93 | 94 | // Optimize SPI Speed 95 | #undef SPI_READ_FREQUENCY 96 | #define SPI_READ_FREQUENCY 40000000 -------------------------------------------------------------------------------- /src/Web/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 James Swineson 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /src/Web/README.md: -------------------------------------------------------------------------------- 1 | # bin2array 2 | 3 | Converts binary file to C-style array initializer. 4 | 5 | Ever wanted to embed a binary file in your program? Trying to serve images and executables from a tiny web server on Arduino or ESP8266? This utility is here to help. 6 | 7 | ## Requirements 8 | 9 | * Python 3 10 | 11 | ## Usage 12 | 13 | I guess it is self-explanatory. 14 | 15 | ``` 16 | usage: bin2array.py [-h] [-O OUTPUT] [-l LINEBREAK] [-L LINEBREAK_STRING] 17 | [-S SEPARATOR_STRING] [-H ELEMENT_PREFIX] 18 | [-T ELEMENT_SUFFIX] [-U] [-n] 19 | filename 20 | 21 | Convert binary file to C-style array initializer. 22 | 23 | positional arguments: 24 | filename the file to be converted 25 | 26 | optional arguments: 27 | -h, --help show this help message and exit 28 | -O OUTPUT, --output OUTPUT 29 | write output to a file 30 | -l LINEBREAK, --linebreak LINEBREAK 31 | add linebreak after every N element 32 | -L LINEBREAK_STRING, --linebreak-string LINEBREAK_STRING 33 | use what to break link, defaults to "\n" 34 | -S SEPARATOR_STRING, --separator-string SEPARATOR_STRING 35 | use what to separate elements, defaults to ", " 36 | -H ELEMENT_PREFIX, --element-prefix ELEMENT_PREFIX 37 | string to be added to the head of element, defaults to 38 | "0x" 39 | -T ELEMENT_SUFFIX, --element-suffix ELEMENT_SUFFIX 40 | string to be added to the tail of element, defaults to 41 | none 42 | -U, --force-uppercase 43 | force uppercase HEX representation 44 | -n, --newline add a newline on file end 45 | ``` 46 | 47 | ## Caveats 48 | 49 | ### Arduino IDE 50 | 51 | **Do not put large source code files in the root folder of your project.** Otherwise some of the following events will happen: 52 | 53 | * One of your CPU cores been eaten up by java 54 | * The splash screen shows up but never loads 55 | * 3rd World War 56 | 57 | Make a new folder inside project root, put the converted file (use `.h` as extension, otherwise may not be recognized) in, then use the following grammer to use it: 58 | 59 | ```C++ 60 | const char great_image[] PROGMEM = { 61 | #include "data/great_image.png.h" 62 | } 63 | ``` 64 | 65 | If you are using ESP8266WebServer to serve static binary files, you can use the following code: 66 | 67 | ```C++ 68 | #include 69 | 70 | // create server 71 | ESP8266WebServer server(80); 72 | 73 | // include the image data 74 | const char image[] PROGMEM = { 75 | #include "data/image.png.h" 76 | }; 77 | 78 | // statis binary file handler 79 | void handleImage() { 80 | server.sendHeader("Cache-Control", "max-age=31536000", false); 81 | server.send_P(200, "image/png", image, sizeof(image)); 82 | } 83 | 84 | void setup() { 85 | // do other things... 86 | // register image handler before server.begin() 87 | server.on("/image.png", handleImage); 88 | // do other things... 89 | server.begin(); 90 | } 91 | ``` 92 | 93 | ### Windows 94 | 95 | Do not use command line redirection (`python bin2array.py test.png > test.png.h`) since CMD will save the file using UTF-16 which is not recognized by some compiler. Use `-O` option to save output to file, or manually convert UTF-16 to UTF-8 for maximum compatibility. -------------------------------------------------------------------------------- /src/Web/bin2array.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import binascii 3 | import sys 4 | import argparse 5 | 6 | parser = argparse.ArgumentParser(description='Convert binary file to C-style array initializer.') 7 | parser.add_argument("filename", help="the file to be converted") 8 | parser.add_argument("-O", "--output", help="write output to a file") 9 | parser.add_argument("-l", "--linebreak", type=int, help="add linebreak after every N element") 10 | parser.add_argument("-L", "--linebreak-string", default="\n", help="use what to break link, defaults to \"\\n\"") 11 | parser.add_argument("-S", "--separator-string", default=", ", help="use what to separate elements, defaults to \", \"") 12 | parser.add_argument("-H", "--element-prefix", default="0x", help="string to be added to the head of element, defaults to \"0x\"") 13 | parser.add_argument("-T", "--element-suffix", default="", help="string to be added to the tail of element, defaults to none") 14 | parser.add_argument("-U", "--force-uppercase", action='store_true', help="force uppercase HEX representation") 15 | parser.add_argument("-n", "--newline", action='store_true', help="add a newline on file end") 16 | args = parser.parse_args() 17 | 18 | def make_sublist_group(lst: list, grp: int) -> list: 19 | """ 20 | Group list elements into sublists. 21 | 22 | make_sublist_group([1, 2, 3, 4, 5, 6, 7], 3) = [[1, 2, 3], [4, 5, 6], 7] 23 | """ 24 | return [lst[i:i+grp] for i in range(0, len(lst), grp)] 25 | 26 | def do_convension(content: bytes, to_uppercase: bool=False) -> str: 27 | hexstr = binascii.hexlify(content).decode("UTF-8") 28 | if to_uppercase: 29 | hexstr = hexstr.upper() 30 | array = [args.element_prefix + hexstr[i:i + 2] + args.element_suffix for i in range(0, len(hexstr), 2)] 31 | if args.linebreak: 32 | array = make_sublist_group(array, args.linebreak) 33 | else: 34 | array = [array,] 35 | 36 | return args.linebreak_string.join([args.separator_string.join(e) + args.separator_string for e in array]) 37 | 38 | if __name__ == "__main__": 39 | with open(args.filename, 'rb') as f: 40 | file_content = f.read() 41 | ret = do_convension(file_content, to_uppercase=args.force_uppercase) 42 | if args.newline: 43 | ret = ret + args.linebreak_string 44 | if args.output: 45 | with open(args.output, 'w') as f: 46 | f.write(ret) 47 | else: 48 | print(ret) -------------------------------------------------------------------------------- /src/Web/button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/src/Web/button.png -------------------------------------------------------------------------------- /src/Web/button_full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/src/Web/button_full.png -------------------------------------------------------------------------------- /src/Web/indexBasicAndGrey.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IC705SMeter Screen Capture 6 | 53 | 54 | 55 |
56 | 57 | 58 | 63 | 64 | 65 | 72 | 73 |
59 | 60 | Screen 61 | 62 |
66 |
    67 |
  • 68 |
  • 69 |
  • 70 |
71 |
74 |
75 | 76 | 77 | -------------------------------------------------------------------------------- /src/Web/indexCore2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IC705SMeter Screen Capture 6 | 52 | 53 | 54 |
55 | 56 | 57 | 62 | 63 | 64 | 71 | 72 |
58 | 59 | Screen 60 | 61 |
65 |
    66 |
  • 67 |
  • 68 |
  • 69 |
70 |
73 |
74 | 75 | 76 | -------------------------------------------------------------------------------- /src/Web/m5_basic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/src/Web/m5_basic.png -------------------------------------------------------------------------------- /src/Web/m5_basic_full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/src/Web/m5_basic_full.png -------------------------------------------------------------------------------- /src/Web/m5_core2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/src/Web/m5_core2.png -------------------------------------------------------------------------------- /src/Web/m5_core2_full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/src/Web/m5_core2_full.png -------------------------------------------------------------------------------- /src/Web/screenshot.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/src/Web/screenshot.bmp -------------------------------------------------------------------------------- /src/Web/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/armel/IC705SMeter/02eebee035586dce3c5804a2bcc785be0b6cc8ec/src/Web/screenshot.png -------------------------------------------------------------------------------- /src/WebIndexBasicAndGrey.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) F4HWN Armel. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | #include // PROGMEM support header 5 | 6 | PROGMEM const char index_html[]={ 7 | 0x3c, 0x21, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, 8 | 0x0a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 9 | 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x63, 0x68, 0x61, 10 | 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 11 | 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x49, 0x43, 0x37, 0x30, 0x35, 0x53, 12 | 0x4d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x43, 0x61, 0x70, 13 | 0x74, 0x75, 0x72, 0x65, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 14 | 0x20, 0x20, 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 15 | 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 16 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 17 | 0x6c, 0x79, 0x3a, 0x20, 0x41, 0x72, 0x69, 0x61, 0x6c, 0x2c, 0x20, 0x73, 0x61, 0x6e, 0x73, 0x2d, 18 | 0x73, 0x65, 0x72, 0x69, 0x66, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 19 | 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 20 | 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30, 0x3b, 0x0d, 21 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 22 | 0x31, 0x30, 0x30, 0x25, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 23 | 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 24 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x74, 25 | 0x61, 0x62, 0x6c, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 26 | 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 27 | 0x72, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 28 | 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x33, 29 | 0x31, 0x33, 0x31, 0x33, 0x31, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 30 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 31 | 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 32 | 0x61, 0x79, 0x3a, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x3b, 0x0d, 33 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 34 | 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 35 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x61, 36 | 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 37 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 38 | 0x62, 0x6c, 0x65, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 39 | 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x33, 0x39, 0x36, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 40 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x33, 0x39, 41 | 0x36, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 42 | 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x30, 0x30, 0x30, 43 | 0x3b, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 44 | 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x20, 0x0d, 45 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 46 | 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 47 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 48 | 0x2d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x75, 0x72, 0x6c, 0x28, 0x27, 0x64, 0x61, 0x74, 49 | 0x61, 0x3a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0x3b, 0x62, 0x61, 0x73, 0x65, 50 | 0x36, 0x34, 0x2c, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 51 | 0x41, 0x41, 0x4e, 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x59, 0x77, 0x41, 0x41, 52 | 0x41, 0x47, 0x4d, 0x43, 0x41, 0x4d, 0x41, 0x41, 0x41, 0x44, 0x2b, 0x35, 0x32, 0x56, 0x34, 0x41, 53 | 0x41, 0x41, 0x41, 0x70, 0x56, 0x42, 0x4d, 0x56, 0x45, 0x55, 0x69, 0x49, 0x69, 0x49, 0x41, 0x41, 54 | 0x41, 0x42, 0x61, 0x57, 0x6c, 0x70, 0x63, 0x58, 0x46, 0x77, 0x77, 0x4d, 0x54, 0x46, 0x52, 0x55, 55 | 0x56, 0x46, 0x57, 0x56, 0x6c, 0x59, 0x64, 0x48, 0x52, 0x30, 0x4a, 0x43, 0x51, 0x6c, 0x55, 0x56, 56 | 0x46, 0x51, 0x31, 0x4e, 0x6a, 0x5a, 0x4c, 0x53, 0x30, 0x74, 0x45, 0x52, 0x55, 0x56, 0x49, 0x53, 57 | 0x45, 0x67, 0x58, 0x46, 0x78, 0x63, 0x6a, 0x49, 0x79, 0x4d, 0x70, 0x4b, 0x53, 0x6b, 0x62, 0x47, 58 | 0x78, 0x74, 0x50, 0x54, 0x30, 0x39, 0x4e, 0x54, 0x55, 0x30, 0x46, 0x42, 0x51, 0x55, 0x54, 0x45, 59 | 0x78, 0x50, 0x2f, 0x41, 0x41, 0x41, 0x75, 0x4c, 0x79, 0x39, 0x59, 0x57, 0x46, 0x67, 0x73, 0x4c, 60 | 0x53, 0x30, 0x38, 0x50, 0x54, 0x31, 0x4b, 0x54, 0x30, 0x34, 0x41, 0x47, 0x42, 0x6a, 0x46, 0x4d, 61 | 0x6a, 0x4b, 0x68, 0x49, 0x53, 0x4c, 0x6d, 0x46, 0x78, 0x5a, 0x66, 0x53, 0x6b, 0x70, 0x43, 0x51, 62 | 0x30, 0x4d, 0x35, 0x4f, 0x6a, 0x6f, 0x2f, 0x51, 0x45, 0x42, 0x4a, 0x53, 0x55, 0x6b, 0x33, 0x4e, 63 | 0x7a, 0x63, 0x5a, 0x47, 0x52, 0x6b, 0x4b, 0x43, 0x67, 0x6f, 0x4f, 0x44, 0x67, 0x35, 0x4b, 0x57, 64 | 0x6c, 0x70, 0x65, 0x58, 0x6c, 0x36, 0x4e, 0x53, 0x55, 0x6d, 0x6b, 0x51, 0x6b, 0x4b, 0x38, 0x50, 65 | 0x54, 0x31, 0x7a, 0x50, 0x54, 0x33, 0x65, 0x49, 0x53, 0x41, 0x32, 0x58, 0x56, 0x31, 0x64, 0x53, 66 | 0x6b, 0x70, 0x54, 0x53, 0x6b, 0x70, 0x78, 0x56, 0x46, 0x54, 0x51, 0x4c, 0x53, 0x33, 0x35, 0x41, 67 | 0x51, 0x44, 0x6c, 0x41, 0x51, 0x43, 0x58, 0x69, 0x67, 0x70, 0x41, 0x41, 0x41, 0x41, 0x49, 0x55, 68 | 0x30, 0x6c, 0x45, 0x51, 0x56, 0x52, 0x34, 0x32, 0x75, 0x7a, 0x61, 0x79, 0x33, 0x62, 0x71, 0x49, 69 | 0x42, 0x53, 0x41, 0x59, 0x55, 0x67, 0x4a, 0x6c, 0x6c, 0x75, 0x31, 0x69, 0x61, 0x34, 0x4e, 0x7a, 70 | 0x43, 0x41, 0x58, 0x75, 0x2f, 0x72, 0x2b, 0x44, 0x33, 0x67, 0x30, 0x6f, 0x4f, 0x62, 0x59, 0x32, 71 | 0x75, 0x55, 0x67, 0x68, 0x73, 0x6e, 0x2b, 0x52, 0x76, 0x45, 0x32, 0x34, 0x56, 0x39, 0x6b, 0x6d, 72 | 0x79, 0x68, 0x68, 0x44, 0x77, 0x47, 0x41, 0x63, 0x77, 0x36, 0x59, 0x52, 0x49, 0x74, 0x67, 0x30, 73 | 0x33, 0x49, 0x43, 0x73, 0x49, 0x63, 0x65, 0x78, 0x41, 0x44, 0x6e, 0x51, 0x50, 0x70, 0x67, 0x56, 74 | 0x4e, 0x50, 0x55, 0x61, 0x43, 0x46, 0x4e, 0x71, 0x30, 0x79, 0x49, 0x38, 0x6c, 0x7a, 0x6b, 0x2b, 75 | 0x52, 0x67, 0x41, 0x49, 0x47, 0x4e, 0x33, 0x43, 0x69, 0x47, 0x34, 0x66, 0x55, 0x50, 0x4c, 0x71, 76 | 0x53, 0x79, 0x76, 0x32, 0x31, 0x35, 0x33, 0x41, 0x77, 0x4e, 0x34, 0x4d, 0x67, 0x59, 0x77, 0x47, 77 | 0x55, 0x50, 0x4c, 0x54, 0x35, 0x39, 0x46, 0x79, 0x7a, 0x73, 0x74, 0x71, 0x2b, 0x69, 0x37, 0x4b, 78 | 0x42, 0x6b, 0x38, 0x46, 0x79, 0x50, 0x32, 0x33, 0x46, 0x62, 0x6f, 0x68, 0x61, 0x7a, 0x51, 0x77, 79 | 0x78, 0x4d, 0x78, 0x48, 0x48, 0x67, 0x6c, 0x4d, 0x4d, 0x57, 0x72, 0x57, 0x56, 0x34, 0x62, 0x43, 80 | 0x66, 0x42, 0x6e, 0x44, 0x48, 0x44, 0x52, 0x4e, 0x4a, 0x68, 0x69, 0x46, 0x62, 0x77, 0x4e, 0x30, 81 | 0x73, 0x48, 0x44, 0x47, 0x4d, 0x42, 0x59, 0x56, 0x50, 0x62, 0x74, 0x50, 0x71, 0x4c, 0x6c, 0x61, 82 | 0x41, 0x48, 0x57, 0x33, 0x6b, 0x38, 0x50, 0x59, 0x65, 0x49, 0x66, 0x4f, 0x30, 0x4e, 0x36, 0x38, 83 | 0x56, 0x2b, 0x47, 0x4d, 0x39, 0x45, 0x71, 0x67, 0x78, 0x61, 0x67, 0x57, 0x6d, 0x48, 0x50, 0x35, 84 | 0x67, 0x76, 0x63, 0x44, 0x49, 0x39, 0x69, 0x4f, 0x4b, 0x6d, 0x35, 0x6e, 0x55, 0x31, 0x39, 0x61, 85 | 0x77, 0x61, 0x33, 0x4a, 0x5a, 0x2f, 0x6a, 0x42, 0x31, 0x72, 0x45, 0x75, 0x43, 0x46, 0x62, 0x38, 86 | 0x4f, 0x71, 0x30, 0x73, 0x72, 0x4e, 0x42, 0x37, 0x68, 0x6e, 0x38, 0x46, 0x73, 0x4e, 0x4a, 0x77, 87 | 0x36, 0x75, 0x4c, 0x62, 0x32, 0x36, 0x69, 0x33, 0x42, 0x34, 0x6f, 0x57, 0x74, 0x5a, 0x2b, 0x33, 88 | 0x45, 0x6e, 0x66, 0x7a, 0x6b, 0x61, 0x42, 0x43, 0x41, 0x78, 0x2b, 0x78, 0x41, 0x43, 0x51, 0x68, 89 | 0x6c, 0x2f, 0x66, 0x49, 0x35, 0x54, 0x66, 0x55, 0x76, 0x51, 0x69, 0x45, 0x46, 0x70, 0x2b, 0x47, 90 | 0x78, 0x7a, 0x68, 0x6c, 0x35, 0x30, 0x68, 0x39, 0x62, 0x57, 0x46, 0x72, 0x54, 0x76, 0x63, 0x45, 91 | 0x79, 0x2b, 0x31, 0x4d, 0x63, 0x4a, 0x65, 0x61, 0x33, 0x54, 0x33, 0x4d, 0x55, 0x43, 0x47, 0x57, 92 | 0x79, 0x78, 0x4e, 0x39, 0x68, 0x53, 0x39, 0x30, 0x76, 0x36, 0x34, 0x36, 0x32, 0x2b, 0x6e, 0x6f, 93 | 0x63, 0x68, 0x67, 0x48, 0x67, 0x50, 0x41, 0x69, 0x39, 0x74, 0x72, 0x47, 0x34, 0x70, 0x65, 0x62, 94 | 0x62, 0x2f, 0x74, 0x71, 0x73, 0x7a, 0x57, 0x30, 0x63, 0x31, 0x6a, 0x4f, 0x4e, 0x39, 0x55, 0x57, 95 | 0x52, 0x32, 0x2f, 0x4b, 0x46, 0x72, 0x42, 0x32, 0x49, 0x6b, 0x71, 0x36, 0x77, 0x65, 0x58, 0x59, 96 | 0x30, 0x7a, 0x55, 0x74, 0x63, 0x56, 0x41, 0x30, 0x55, 0x71, 0x75, 0x4e, 0x62, 0x69, 0x47, 0x57, 97 | 0x59, 0x78, 0x77, 0x65, 0x56, 0x70, 0x67, 0x69, 0x78, 0x56, 0x35, 0x6d, 0x36, 0x64, 0x30, 0x34, 98 | 0x32, 0x38, 0x78, 0x5a, 0x46, 0x30, 0x6c, 0x64, 0x6a, 0x68, 0x53, 0x74, 0x4a, 0x70, 0x44, 0x39, 99 | 0x35, 0x33, 0x58, 0x58, 0x54, 0x46, 0x49, 0x4d, 0x55, 0x42, 0x71, 0x6e, 0x67, 0x4a, 0x5a, 0x2f, 100 | 0x30, 0x48, 0x52, 0x69, 0x6f, 0x6a, 0x4a, 0x65, 0x30, 0x4e, 0x34, 0x42, 0x69, 0x6c, 0x47, 0x46, 101 | 0x44, 0x62, 0x33, 0x77, 0x63, 0x75, 0x4c, 0x6c, 0x57, 0x33, 0x72, 0x79, 0x39, 0x61, 0x51, 0x55, 102 | 0x77, 0x78, 0x67, 0x49, 0x5a, 0x2b, 0x35, 0x32, 0x68, 0x31, 0x65, 0x58, 0x36, 0x78, 0x73, 0x33, 103 | 0x34, 0x6c, 0x63, 0x77, 0x30, 0x38, 0x78, 0x6e, 0x47, 0x2b, 0x72, 0x52, 0x46, 0x4f, 0x30, 0x74, 104 | 0x69, 0x2f, 0x31, 0x6e, 0x57, 0x49, 0x59, 0x43, 0x65, 0x63, 0x59, 0x77, 0x61, 0x61, 0x4e, 0x6f, 105 | 0x52, 0x78, 0x46, 0x71, 0x34, 0x74, 0x35, 0x61, 0x39, 0x54, 0x65, 0x4d, 0x51, 0x4b, 0x73, 0x66, 106 | 0x30, 0x73, 0x78, 0x50, 0x45, 0x58, 0x72, 0x32, 0x2b, 0x69, 0x30, 0x2f, 0x46, 0x61, 0x66, 0x59, 107 | 0x38, 0x51, 0x6d, 0x50, 0x52, 0x4b, 0x4d, 0x6f, 0x67, 0x4a, 0x6b, 0x6e, 0x74, 0x68, 0x4b, 0x41, 108 | 0x67, 0x45, 0x74, 0x55, 0x70, 0x6b, 0x4f, 0x62, 0x30, 0x6b, 0x56, 0x34, 0x66, 0x4b, 0x66, 0x44, 109 | 0x68, 0x6f, 0x50, 0x78, 0x4b, 0x6c, 0x30, 0x62, 0x4f, 0x47, 0x64, 0x6f, 0x67, 0x4a, 0x47, 0x6e, 110 | 0x77, 0x4b, 0x49, 0x41, 0x49, 0x54, 0x6c, 0x73, 0x78, 0x51, 0x6e, 0x46, 0x4a, 0x57, 0x77, 0x64, 111 | 0x35, 0x65, 0x72, 0x50, 0x45, 0x65, 0x47, 0x65, 0x6f, 0x70, 0x68, 0x6d, 0x35, 0x47, 0x69, 0x49, 112 | 0x67, 0x6a, 0x50, 0x4e, 0x36, 0x69, 0x41, 0x65, 0x44, 0x48, 0x46, 0x45, 0x50, 0x6a, 0x6a, 0x58, 113 | 0x69, 0x6d, 0x66, 0x74, 0x5a, 0x31, 0x69, 0x31, 0x4a, 0x49, 0x45, 0x4d, 0x52, 0x30, 0x4a, 0x68, 114 | 0x6a, 0x39, 0x6a, 0x46, 0x50, 0x4a, 0x68, 0x65, 0x49, 0x6f, 0x78, 0x45, 0x43, 0x33, 0x53, 0x30, 115 | 0x51, 0x37, 0x6e, 0x64, 0x79, 0x47, 0x48, 0x6d, 0x50, 0x65, 0x44, 0x4a, 0x33, 0x30, 0x36, 0x61, 116 | 0x6a, 0x5a, 0x34, 0x58, 0x36, 0x71, 0x51, 0x4c, 0x33, 0x61, 0x5a, 0x46, 0x45, 0x54, 0x78, 0x46, 117 | 0x47, 0x50, 0x45, 0x47, 0x49, 0x55, 0x63, 0x6f, 0x55, 0x34, 0x78, 0x41, 0x6d, 0x6c, 0x7a, 0x6a, 118 | 0x41, 0x50, 0x47, 0x4b, 0x4f, 0x54, 0x6f, 0x66, 0x73, 0x54, 0x41, 0x4c, 0x31, 0x4f, 0x6c, 0x48, 119 | 0x48, 0x63, 0x35, 0x68, 0x73, 0x59, 0x59, 0x78, 0x62, 0x31, 0x6a, 0x6a, 0x48, 0x2f, 0x73, 0x30, 120 | 0x54, 0x45, 0x4e, 0x67, 0x44, 0x41, 0x41, 0x41, 0x4d, 0x46, 0x75, 0x73, 0x42, 0x47, 0x53, 0x61, 121 | 0x67, 0x44, 0x2f, 0x44, 0x74, 0x46, 0x41, 0x32, 0x75, 0x47, 0x48, 0x4f, 0x77, 0x76, 0x58, 0x49, 122 | 0x53, 0x4e, 0x45, 0x52, 0x6f, 0x69, 0x4d, 0x45, 0x42, 0x6b, 0x68, 0x4d, 0x6b, 0x4a, 0x6b, 0x68, 123 | 0x4d, 0x67, 0x49, 0x6b, 0x52, 0x45, 0x69, 0x49, 0x30, 0x52, 0x47, 0x69, 0x49, 0x77, 0x51, 0x47, 124 | 0x53, 0x45, 0x79, 0x51, 0x6d, 0x53, 0x45, 0x79, 0x41, 0x69, 0x52, 0x45, 0x53, 0x49, 0x6a, 0x52, 125 | 0x45, 0x61, 0x49, 0x6a, 0x42, 0x41, 0x5a, 0x49, 0x54, 0x4a, 0x43, 0x5a, 0x49, 0x54, 0x49, 0x43, 126 | 0x4a, 0x45, 0x52, 0x49, 0x69, 0x4e, 0x45, 0x52, 0x6f, 0x69, 0x4d, 0x45, 0x42, 0x6b, 0x68, 0x4d, 127 | 0x6b, 0x4a, 0x6b, 0x68, 0x4d, 0x67, 0x49, 0x6b, 0x52, 0x48, 0x79, 0x4b, 0x32, 0x50, 0x65, 0x42, 128 | 0x38, 0x75, 0x65, 0x75, 0x53, 0x58, 0x6a, 0x48, 0x52, 0x65, 0x72, 0x78, 0x72, 0x45, 0x6e, 0x34, 129 | 0x78, 0x77, 0x73, 0x6b, 0x31, 0x45, 0x69, 0x49, 0x30, 0x52, 0x47, 0x79, 0x4d, 0x66, 0x4f, 0x76, 130 | 0x61, 0x73, 0x30, 0x45, 0x41, 0x56, 0x51, 0x46, 0x41, 0x55, 0x4c, 0x47, 0x31, 0x73, 0x5a, 0x68, 131 | 0x43, 0x52, 0x71, 0x47, 0x2f, 0x4b, 0x59, 0x47, 0x42, 0x2f, 0x2f, 0x2f, 0x32, 0x6e, 0x61, 0x44, 132 | 0x6f, 0x79, 0x51, 0x37, 0x6d, 0x37, 0x43, 0x32, 0x72, 0x2b, 0x77, 0x36, 0x6e, 0x4e, 0x67, 0x68, 133 | 0x49, 0x49, 0x52, 0x43, 0x6b, 0x59, 0x6f, 0x47, 0x4b, 0x46, 0x67, 0x68, 0x49, 0x49, 0x52, 0x43, 134 | 0x6b, 0x59, 0x6f, 0x47, 0x4b, 0x46, 0x67, 0x68, 0x49, 0x49, 0x52, 0x43, 0x6b, 0x59, 0x6f, 0x47, 135 | 0x4b, 0x46, 0x67, 0x68, 0x49, 0x49, 0x52, 0x43, 0x6b, 0x59, 0x6f, 0x47, 0x4b, 0x46, 0x67, 0x68, 136 | 0x49, 0x49, 0x52, 0x43, 0x6b, 0x59, 0x6f, 0x47, 0x4b, 0x46, 0x67, 0x68, 0x49, 0x49, 0x52, 0x43, 137 | 0x6b, 0x59, 0x6f, 0x47, 0x4b, 0x46, 0x67, 0x68, 0x49, 0x49, 0x52, 0x43, 0x6b, 0x59, 0x6f, 0x47, 138 | 0x4b, 0x46, 0x67, 0x68, 0x4c, 0x6f, 0x52, 0x34, 0x2b, 0x58, 0x78, 0x63, 0x48, 0x37, 0x59, 0x77, 139 | 0x46, 0x67, 0x30, 0x43, 0x47, 0x4e, 0x2f, 0x2b, 0x4a, 0x72, 0x6e, 0x34, 0x78, 0x58, 0x47, 0x6f, 140 | 0x6b, 0x45, 0x59, 0x6d, 0x39, 0x4d, 0x30, 0x54, 0x66, 0x4e, 0x35, 0x2b, 0x77, 0x78, 0x6a, 0x30, 141 | 0x51, 0x69, 0x4d, 0x7a, 0x63, 0x66, 0x75, 0x44, 0x2b, 0x50, 0x74, 0x46, 0x63, 0x61, 0x69, 0x51, 142 | 0x52, 0x6a, 0x76, 0x4d, 0x46, 0x61, 0x43, 0x63, 0x63, 0x2f, 0x42, 0x43, 0x41, 0x55, 0x6a, 0x46, 143 | 0x49, 0x78, 0x51, 0x4d, 0x45, 0x4c, 0x42, 0x43, 0x41, 0x55, 0x6a, 0x46, 0x49, 0x78, 0x51, 0x4d, 144 | 0x45, 0x4c, 0x42, 0x43, 0x41, 0x55, 0x6a, 0x46, 0x49, 0x78, 0x51, 0x4d, 0x45, 0x4c, 0x42, 0x43, 145 | 0x41, 0x55, 0x6a, 0x46, 0x49, 0x78, 0x51, 0x4d, 0x45, 0x4c, 0x42, 0x43, 0x41, 0x55, 0x6a, 0x46, 146 | 0x49, 0x78, 0x51, 0x4d, 0x45, 0x4c, 0x42, 0x43, 0x41, 0x55, 0x6a, 0x46, 0x49, 0x78, 0x51, 0x4d, 147 | 0x45, 0x4c, 0x42, 0x43, 0x41, 0x55, 0x6a, 0x46, 0x49, 0x78, 0x51, 0x4d, 0x45, 0x4c, 0x42, 0x43, 148 | 0x41, 0x55, 0x6a, 0x46, 0x49, 0x78, 0x51, 0x4d, 0x45, 0x4b, 0x5a, 0x6b, 0x59, 0x57, 0x36, 0x44, 149 | 0x65, 0x4d, 0x4b, 0x34, 0x37, 0x38, 0x47, 0x54, 0x49, 0x2b, 0x50, 0x50, 0x39, 0x50, 0x33, 0x37, 150 | 0x72, 0x77, 0x31, 0x50, 0x56, 0x34, 0x30, 0x43, 0x4f, 0x50, 0x7a, 0x65, 0x44, 0x6f, 0x64, 0x6e, 151 | 0x75, 0x7a, 0x41, 0x56, 0x78, 0x70, 0x77, 0x56, 0x37, 0x47, 0x2f, 0x58, 0x50, 0x62, 0x75, 0x4b, 152 | 0x74, 0x62, 0x79, 0x48, 0x58, 0x4b, 0x66, 0x77, 0x51, 0x67, 0x46, 0x49, 0x78, 0x53, 0x4d, 0x55, 153 | 0x44, 0x42, 0x2b, 0x32, 0x61, 0x4e, 0x6a, 0x41, 0x51, 0x41, 0x41, 0x41, 0x49, 0x42, 0x42, 0x2f, 154 | 0x74, 0x62, 0x54, 0x32, 0x46, 0x45, 0x4b, 0x6a, 0x63, 0x67, 0x59, 0x6b, 0x54, 0x45, 0x69, 0x59, 155 | 0x30, 0x54, 0x47, 0x69, 0x49, 0x77, 0x52, 0x47, 0x53, 0x4d, 0x79, 0x52, 0x6d, 0x53, 0x4d, 0x79, 156 | 0x42, 0x69, 0x52, 0x4d, 0x53, 0x4a, 0x6a, 0x52, 0x4d, 0x61, 0x49, 0x6a, 0x42, 0x45, 0x5a, 0x49, 157 | 0x7a, 0x4a, 0x47, 0x5a, 0x49, 0x7a, 0x49, 0x47, 0x4a, 0x45, 0x78, 0x49, 0x6d, 0x4e, 0x45, 0x78, 158 | 0x6f, 0x69, 0x4d, 0x45, 0x52, 0x6b, 0x6a, 0x4d, 0x6b, 0x5a, 0x6b, 0x6a, 0x4d, 0x67, 0x59, 0x6b, 159 | 0x54, 0x45, 0x69, 0x59, 0x30, 0x54, 0x47, 0x69, 0x49, 0x77, 0x52, 0x47, 0x53, 0x4d, 0x79, 0x52, 160 | 0x6d, 0x53, 0x4d, 0x79, 0x42, 0x69, 0x52, 0x4d, 0x53, 0x4a, 0x6a, 0x52, 0x4d, 0x61, 0x49, 0x6a, 161 | 0x42, 0x45, 0x5a, 0x49, 0x7a, 0x4a, 0x47, 0x5a, 0x49, 0x7a, 0x49, 0x47, 0x4a, 0x45, 0x78, 0x49, 162 | 0x6d, 0x4e, 0x45, 0x78, 0x6f, 0x69, 0x4d, 0x45, 0x52, 0x6b, 0x6a, 0x4d, 0x6b, 0x5a, 0x6b, 0x6a, 163 | 0x4d, 0x67, 0x59, 0x6b, 0x54, 0x45, 0x69, 0x59, 0x30, 0x54, 0x47, 0x69, 0x49, 0x77, 0x52, 0x47, 164 | 0x53, 0x4d, 0x79, 0x52, 0x6d, 0x53, 0x4d, 0x79, 0x42, 0x69, 0x52, 0x4d, 0x53, 0x4a, 0x6a, 0x52, 165 | 0x4d, 0x61, 0x49, 0x6a, 0x42, 0x45, 0x5a, 0x49, 0x7a, 0x4a, 0x47, 0x5a, 0x49, 0x7a, 0x49, 0x47, 166 | 0x4a, 0x45, 0x78, 0x49, 0x6d, 0x4e, 0x45, 0x78, 0x6f, 0x69, 0x4d, 0x45, 0x52, 0x6b, 0x6a, 0x4d, 167 | 0x6b, 0x5a, 0x6b, 0x6a, 0x4d, 0x67, 0x59, 0x6b, 0x54, 0x45, 0x69, 0x59, 0x30, 0x54, 0x47, 0x69, 168 | 0x49, 0x77, 0x52, 0x47, 0x53, 0x4d, 0x79, 0x52, 0x6d, 0x53, 0x4d, 0x79, 0x42, 0x69, 0x52, 0x4d, 169 | 0x53, 0x4a, 0x6a, 0x52, 0x4d, 0x61, 0x49, 0x6a, 0x42, 0x45, 0x5a, 0x49, 0x7a, 0x4a, 0x47, 0x5a, 170 | 0x49, 0x7a, 0x49, 0x47, 0x4a, 0x45, 0x78, 0x49, 0x6d, 0x4e, 0x45, 0x78, 0x6f, 0x69, 0x4d, 0x45, 171 | 0x52, 0x6b, 0x6a, 0x4d, 0x6b, 0x5a, 0x6b, 0x6a, 0x4d, 0x67, 0x59, 0x6b, 0x54, 0x45, 0x69, 0x59, 172 | 0x30, 0x54, 0x47, 0x69, 0x49, 0x77, 0x52, 0x47, 0x53, 0x4d, 0x79, 0x52, 0x6d, 0x53, 0x4d, 0x79, 173 | 0x42, 0x69, 0x52, 0x4d, 0x53, 0x4a, 0x6a, 0x52, 0x4d, 0x61, 0x49, 0x6a, 0x42, 0x45, 0x5a, 0x49, 174 | 0x7a, 0x4a, 0x47, 0x5a, 0x49, 0x7a, 0x49, 0x47, 0x4a, 0x45, 0x78, 0x49, 0x6d, 0x4e, 0x45, 0x78, 175 | 0x6f, 0x69, 0x4d, 0x45, 0x52, 0x6b, 0x6a, 0x4d, 0x6b, 0x5a, 0x6b, 0x6a, 0x4d, 0x67, 0x59, 0x6b, 176 | 0x54, 0x45, 0x69, 0x59, 0x30, 0x54, 0x47, 0x69, 0x49, 0x77, 0x52, 0x47, 0x53, 0x4d, 0x79, 0x52, 177 | 0x6d, 0x53, 0x4d, 0x79, 0x42, 0x69, 0x52, 0x4d, 0x53, 0x4a, 0x6a, 0x52, 0x4d, 0x61, 0x49, 0x6a, 178 | 0x42, 0x45, 0x5a, 0x49, 0x7a, 0x4a, 0x47, 0x5a, 0x49, 0x7a, 0x49, 0x47, 0x4a, 0x45, 0x78, 0x49, 179 | 0x6d, 0x4e, 0x45, 0x78, 0x6f, 0x69, 0x4d, 0x45, 0x52, 0x6b, 0x6a, 0x4d, 0x6b, 0x5a, 0x6b, 0x6a, 180 | 0x4d, 0x67, 0x59, 0x6b, 0x54, 0x45, 0x69, 0x59, 0x30, 0x54, 0x47, 0x69, 0x49, 0x77, 0x52, 0x47, 181 | 0x53, 0x4d, 0x79, 0x52, 0x6d, 0x53, 0x4d, 0x79, 0x42, 0x69, 0x52, 0x45, 0x58, 0x74, 0x30, 0x51, 182 | 0x41, 0x49, 0x67, 0x44, 0x41, 0x42, 0x41, 0x30, 0x41, 0x51, 0x44, 0x77, 0x51, 0x37, 0x32, 0x62, 183 | 0x32, 0x67, 0x47, 0x63, 0x63, 0x4a, 0x76, 0x33, 0x46, 0x57, 0x34, 0x45, 0x42, 0x6b, 0x68, 0x4d, 184 | 0x6b, 0x4a, 0x6b, 0x68, 0x4d, 0x67, 0x49, 0x6b, 0x52, 0x45, 0x69, 0x49, 0x32, 0x52, 0x53, 0x78, 185 | 0x6e, 0x30, 0x67, 0x59, 0x79, 0x75, 0x54, 0x4d, 0x71, 0x35, 0x78, 0x38, 0x74, 0x6c, 0x34, 0x6c, 186 | 0x38, 0x47, 0x2f, 0x5a, 0x43, 0x78, 0x41, 0x52, 0x6f, 0x69, 0x4d, 0x45, 0x42, 0x6b, 0x68, 0x4d, 187 | 0x6b, 0x4a, 0x6b, 0x68, 0x4d, 0x67, 0x49, 0x6b, 0x52, 0x45, 0x69, 0x49, 0x30, 0x52, 0x47, 0x69, 188 | 0x49, 0x77, 0x51, 0x47, 0x53, 0x45, 0x79, 0x51, 0x6d, 0x53, 0x45, 0x79, 0x41, 0x69, 0x52, 0x45, 189 | 0x53, 0x49, 0x6a, 0x52, 0x45, 0x61, 0x49, 0x6a, 0x42, 0x41, 0x5a, 0x49, 0x54, 0x4a, 0x43, 0x5a, 190 | 0x49, 0x54, 0x49, 0x43, 0x4a, 0x45, 0x52, 0x49, 0x69, 0x4e, 0x45, 0x52, 0x6f, 0x69, 0x4d, 0x45, 191 | 0x42, 0x6b, 0x68, 0x4d, 0x6b, 0x4a, 0x6b, 0x68, 0x4d, 0x67, 0x49, 0x6b, 0x52, 0x45, 0x69, 0x49, 192 | 0x30, 0x52, 0x47, 0x79, 0x4e, 0x4f, 0x75, 0x48, 0x53, 0x79, 0x33, 0x43, 0x51, 0x4d, 0x42, 0x47, 193 | 0x49, 0x62, 0x56, 0x6f, 0x6b, 0x59, 0x43, 0x34, 0x68, 0x6a, 0x73, 0x32, 0x5a, 0x56, 0x75, 0x67, 194 | 0x4c, 0x44, 0x39, 0x2f, 0x6b, 0x2f, 0x59, 0x42, 0x41, 0x6d, 0x61, 0x6a, 0x44, 0x76, 0x4a, 0x54, 195 | 0x47, 0x73, 0x44, 0x68, 0x2f, 0x31, 0x75, 0x58, 0x50, 0x6c, 0x48, 0x72, 0x45, 0x42, 0x49, 0x6a, 196 | 0x42, 0x32, 0x52, 0x47, 0x44, 0x73, 0x69, 0x4d, 0x58, 0x5a, 0x45, 0x59, 0x75, 0x79, 0x49, 0x78, 197 | 0x4e, 0x67, 0x52, 0x69, 0x62, 0x45, 0x6a, 0x45, 0x6d, 0x4e, 0x48, 0x4a, 0x4d, 0x61, 0x4f, 0x53, 198 | 0x49, 0x77, 0x64, 0x2b, 0x52, 0x53, 0x6a, 0x54, 0x44, 0x46, 0x65, 0x54, 0x37, 0x6e, 0x59, 0x78, 199 | 0x48, 0x57, 0x4f, 0x30, 0x53, 0x30, 0x78, 0x4c, 0x68, 0x4a, 0x6a, 0x49, 0x31, 0x64, 0x61, 0x59, 200 | 0x67, 0x51, 0x54, 0x59, 0x2f, 0x79, 0x53, 0x47, 0x42, 0x75, 0x35, 0x6f, 0x59, 0x6b, 0x78, 0x68, 201 | 0x71, 0x79, 0x4f, 0x4d, 0x59, 0x71, 0x33, 0x6c, 0x31, 0x78, 0x73, 0x34, 0x74, 0x7a, 0x48, 0x42, 202 | 0x4f, 0x38, 0x78, 0x75, 0x68, 0x51, 0x44, 0x62, 0x37, 0x6e, 0x59, 0x78, 0x47, 0x75, 0x6c, 0x59, 203 | 0x34, 0x49, 0x2b, 0x38, 0x32, 0x6d, 0x4e, 0x65, 0x4e, 0x6c, 0x4f, 0x62, 0x65, 0x52, 0x59, 0x63, 204 | 0x49, 0x78, 0x68, 0x73, 0x7a, 0x46, 0x4f, 0x44, 0x32, 0x34, 0x75, 0x75, 0x64, 0x68, 0x45, 0x70, 205 | 0x69, 0x47, 0x4f, 0x62, 0x63, 0x71, 0x77, 0x55, 0x66, 0x43, 0x42, 0x73, 0x31, 0x78, 0x73, 0x77, 206 | 0x6e, 0x45, 0x4d, 0x55, 0x4c, 0x72, 0x4d, 0x6c, 0x54, 0x42, 0x68, 0x4a, 0x39, 0x75, 0x70, 0x54, 207 | 0x62, 0x7a, 0x32, 0x4d, 0x59, 0x61, 0x70, 0x4b, 0x48, 0x4f, 0x56, 0x69, 0x54, 0x47, 0x47, 0x59, 208 | 0x79, 0x34, 0x32, 0x34, 0x4a, 0x6f, 0x59, 0x6f, 0x2f, 0x47, 0x55, 0x6b, 0x57, 0x39, 0x55, 0x4c, 209 | 0x45, 0x4f, 0x35, 0x32, 0x49, 0x43, 0x46, 0x69, 0x53, 0x6f, 0x74, 0x5a, 0x59, 0x52, 0x42, 0x78, 210 | 0x53, 0x75, 0x66, 0x69, 0x2f, 0x56, 0x64, 0x4f, 0x67, 0x57, 0x54, 0x79, 0x6d, 0x47, 0x47, 0x72, 211 | 0x75, 0x4d, 0x59, 0x49, 0x37, 0x7a, 0x6c, 0x59, 0x6e, 0x57, 0x39, 0x67, 0x55, 0x6e, 0x68, 0x70, 212 | 0x78, 0x69, 0x2b, 0x67, 0x61, 0x6a, 0x4c, 0x78, 0x65, 0x70, 0x71, 0x42, 0x5a, 0x4e, 0x36, 0x4a, 213 | 0x4d, 0x79, 0x51, 0x62, 0x41, 0x63, 0x54, 0x31, 0x62, 0x68, 0x63, 0x72, 0x4d, 0x79, 0x62, 0x47, 214 | 0x49, 0x4d, 0x39, 0x66, 0x73, 0x52, 0x41, 0x6d, 0x6c, 0x65, 0x4b, 0x44, 0x71, 0x2b, 0x35, 0x57, 215 | 0x4e, 0x50, 0x70, 0x55, 0x4d, 0x43, 0x45, 0x57, 0x2b, 0x74, 0x77, 0x69, 0x6d, 0x48, 0x72, 0x39, 216 | 0x41, 0x37, 0x49, 0x6f, 0x33, 0x77, 0x54, 0x57, 0x56, 0x58, 0x57, 0x4d, 0x55, 0x79, 0x4d, 0x52, 217 | 0x35, 0x70, 0x69, 0x49, 0x4e, 0x6f, 0x43, 0x49, 0x70, 0x62, 0x74, 0x37, 0x5a, 0x70, 0x75, 0x50, 218 | 0x55, 0x54, 0x63, 0x49, 0x6d, 0x47, 0x4b, 0x67, 0x5a, 0x56, 0x52, 0x4d, 0x43, 0x6b, 0x77, 0x46, 219 | 0x36, 0x76, 0x78, 0x44, 0x42, 0x4e, 0x56, 0x65, 0x4d, 0x49, 0x35, 0x42, 0x74, 0x6b, 0x53, 0x6b, 220 | 0x6c, 0x5a, 0x71, 0x72, 0x4f, 0x58, 0x55, 0x7a, 0x30, 0x74, 0x41, 0x56, 0x34, 0x52, 0x4c, 0x44, 221 | 0x48, 0x53, 0x2b, 0x67, 0x4b, 0x51, 0x68, 0x6d, 0x52, 0x75, 0x72, 0x4f, 0x49, 0x35, 0x61, 0x51, 222 | 0x52, 0x52, 0x47, 0x6c, 0x32, 0x4a, 0x4d, 0x61, 0x4e, 0x43, 0x51, 0x61, 0x44, 0x6c, 0x6d, 0x57, 223 | 0x73, 0x50, 0x52, 0x51, 0x38, 0x4c, 0x47, 0x4f, 0x2f, 0x77, 0x53, 0x77, 0x33, 0x59, 0x4d, 0x43, 224 | 0x58, 0x66, 0x79, 0x79, 0x66, 0x44, 0x70, 0x71, 0x47, 0x52, 0x49, 0x6a, 0x45, 0x66, 0x36, 0x47, 225 | 0x67, 0x4e, 0x74, 0x6d, 0x46, 0x65, 0x4e, 0x30, 0x71, 0x57, 0x58, 0x6b, 0x36, 0x61, 0x6e, 0x4f, 226 | 0x6e, 0x51, 0x4e, 0x7a, 0x33, 0x66, 0x62, 0x44, 0x45, 0x67, 0x34, 0x78, 0x34, 0x69, 0x49, 0x62, 227 | 0x47, 0x43, 0x49, 0x6c, 0x4e, 0x4b, 0x64, 0x50, 0x63, 0x67, 0x50, 0x43, 0x6b, 0x39, 0x79, 0x66, 228 | 0x75, 0x74, 0x72, 0x55, 0x4a, 0x43, 0x59, 0x69, 0x67, 0x69, 0x58, 0x47, 0x44, 0x4d, 0x33, 0x42, 229 | 0x6f, 0x61, 0x5a, 0x34, 0x6b, 0x43, 0x48, 0x79, 0x2b, 0x31, 0x46, 0x44, 0x70, 0x77, 0x65, 0x36, 230 | 0x6e, 0x51, 0x39, 0x48, 0x77, 0x2b, 0x32, 0x2f, 0x5a, 0x4f, 0x43, 0x64, 0x59, 0x65, 0x45, 0x39, 231 | 0x7a, 0x47, 0x51, 0x62, 0x4d, 0x57, 0x77, 0x59, 0x4f, 0x61, 0x79, 0x50, 0x35, 0x79, 0x6c, 0x78, 232 | 0x67, 0x4e, 0x64, 0x4c, 0x32, 0x35, 0x6f, 0x6d, 0x42, 0x6b, 0x57, 0x65, 0x6f, 0x67, 0x74, 0x37, 233 | 0x6d, 0x4f, 0x67, 0x48, 0x51, 0x78, 0x38, 0x77, 0x71, 0x5a, 0x6f, 0x32, 0x6e, 0x64, 0x6c, 0x4b, 234 | 0x4d, 0x58, 0x2f, 0x43, 0x57, 0x58, 0x5a, 0x74, 0x6d, 0x33, 0x54, 0x46, 0x49, 0x5a, 0x68, 0x6f, 235 | 0x62, 0x68, 0x4a, 0x73, 0x2f, 0x73, 0x2b, 0x42, 0x68, 0x4c, 0x68, 0x30, 0x47, 0x6f, 0x46, 0x43, 236 | 0x78, 0x57, 0x42, 0x2b, 0x46, 0x66, 0x66, 0x33, 0x6b, 0x73, 0x54, 0x50, 0x42, 0x48, 0x65, 0x78, 237 | 0x30, 0x6a, 0x49, 0x6a, 0x62, 0x56, 0x68, 0x45, 0x43, 0x76, 0x51, 0x52, 0x57, 0x55, 0x64, 0x52, 238 | 0x6e, 0x63, 0x78, 0x49, 0x73, 0x4b, 0x2b, 0x31, 0x53, 0x43, 0x65, 0x54, 0x67, 0x65, 0x4c, 0x68, 239 | 0x4e, 0x2f, 0x45, 0x69, 0x4b, 0x77, 0x50, 0x42, 0x75, 0x54, 0x5a, 0x39, 0x45, 0x51, 0x4b, 0x54, 240 | 0x4e, 0x56, 0x62, 0x6a, 0x4c, 0x36, 0x4e, 0x51, 0x51, 0x37, 0x48, 0x6f, 0x57, 0x34, 0x4e, 0x79, 241 | 0x4c, 0x42, 0x34, 0x42, 0x71, 0x58, 0x59, 0x6c, 0x50, 0x56, 0x67, 0x69, 0x58, 0x36, 0x49, 0x6b, 242 | 0x52, 0x41, 0x35, 0x36, 0x71, 0x75, 0x32, 0x4d, 0x45, 0x5a, 0x72, 0x6c, 0x67, 0x6e, 0x79, 0x4d, 243 | 0x4d, 0x7a, 0x61, 0x6d, 0x4b, 0x49, 0x70, 0x75, 0x35, 0x45, 0x63, 0x49, 0x66, 0x34, 0x59, 0x59, 244 | 0x30, 0x47, 0x4f, 0x72, 0x4b, 0x39, 0x43, 0x59, 0x37, 0x54, 0x55, 0x65, 0x46, 0x79, 0x4b, 0x4e, 245 | 0x6e, 0x51, 0x39, 0x45, 0x68, 0x48, 0x2b, 0x33, 0x57, 0x38, 0x44, 0x69, 0x39, 0x66, 0x45, 0x49, 246 | 0x68, 0x2b, 0x59, 0x34, 0x67, 0x41, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x52, 0x55, 0x35, 0x45, 0x72, 247 | 0x6b, 0x4a, 0x67, 0x67, 0x67, 0x3d, 0x3d, 0x27, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 248 | 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x64, 0x20, 0x7b, 0x0d, 249 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 250 | 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x20, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 251 | 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6c, 0x20, 252 | 0x6c, 0x69, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 253 | 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 254 | 0x6f, 0x63, 0x6b, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 255 | 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x34, 0x30, 0x70, 0x78, 256 | 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 257 | 0x20, 0x20, 0x2e, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 258 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x72, 259 | 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 260 | 0x20, 0x20, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x34, 0x30, 0x70, 0x78, 0x3b, 0x20, 0x0d, 0x0a, 0x20, 261 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x20, 0x30, 0x70, 0x78, 262 | 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 263 | 0x3a, 0x20, 0x33, 0x32, 0x30, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 264 | 0x20, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x32, 0x34, 0x30, 0x70, 0x78, 0x3b, 265 | 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 266 | 0x20, 0x2e, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 267 | 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x72, 0x65, 268 | 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 269 | 0x20, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x30, 0x70, 0x78, 0x3b, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 270 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x20, 0x30, 0x70, 0x78, 0x3b, 0x0d, 271 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 272 | 0x35, 0x38, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 273 | 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x33, 0x31, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 274 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 275 | 0x2d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x75, 0x72, 0x6c, 0x28, 0x27, 0x64, 0x61, 0x74, 276 | 0x61, 0x3a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0x3b, 0x62, 0x61, 0x73, 0x65, 277 | 0x36, 0x34, 0x2c, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 278 | 0x41, 0x41, 0x4e, 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x44, 0x6f, 0x41, 0x41, 279 | 0x41, 0x41, 0x66, 0x43, 0x41, 0x4d, 0x41, 0x41, 0x41, 0x43, 0x42, 0x42, 0x43, 0x36, 0x66, 0x41, 280 | 0x41, 0x41, 0x41, 0x62, 0x31, 0x42, 0x4d, 0x56, 0x45, 0x58, 0x43, 0x76, 0x38, 0x76, 0x49, 0x78, 281 | 0x64, 0x4c, 0x48, 0x78, 0x4e, 0x47, 0x4a, 0x68, 0x35, 0x43, 0x47, 0x67, 0x34, 0x7a, 0x45, 0x77, 282 | 0x63, 0x37, 0x48, 0x77, 0x39, 0x43, 0x38, 0x75, 0x63, 0x55, 0x41, 0x41, 0x41, 0x42, 0x78, 0x62, 283 | 0x33, 0x56, 0x69, 0x59, 0x57, 0x61, 0x73, 0x71, 0x62, 0x4f, 0x35, 0x74, 0x73, 0x47, 0x49, 0x68, 284 | 0x6f, 0x39, 0x46, 0x52, 0x45, 0x69, 0x6b, 0x6f, 0x61, 0x75, 0x45, 0x67, 0x59, 0x70, 0x38, 0x65, 285 | 0x6f, 0x49, 0x77, 0x4c, 0x7a, 0x49, 0x72, 0x4b, 0x69, 0x79, 0x6f, 0x70, 0x72, 0x42, 0x31, 0x64, 286 | 0x48, 0x74, 0x4f, 0x54, 0x56, 0x46, 0x4d, 0x53, 0x31, 0x41, 0x68, 0x49, 0x53, 0x49, 0x56, 0x46, 287 | 0x52, 0x55, 0x4b, 0x43, 0x67, 0x75, 0x2f, 0x76, 0x4d, 0x69, 0x31, 0x73, 0x72, 0x32, 0x6d, 0x70, 288 | 0x4b, 0x36, 0x5a, 0x6c, 0x36, 0x47, 0x5a, 0x6c, 0x35, 0x2b, 0x50, 0x6a, 0x5a, 0x61, 0x41, 0x66, 289 | 0x6f, 0x5a, 0x68, 0x58, 0x32, 0x55, 0x2b, 0x50, 0x55, 0x45, 0x38, 0x50, 0x44, 0x2f, 0x64, 0x41, 290 | 0x73, 0x4f, 0x35, 0x41, 0x41, 0x41, 0x41, 0x68, 0x6b, 0x6c, 0x45, 0x51, 0x56, 0x51, 0x34, 0x79, 291 | 0x2b, 0x33, 0x56, 0x53, 0x52, 0x61, 0x45, 0x49, 0x41, 0x78, 0x46, 0x30, 0x53, 0x41, 0x53, 0x67, 292 | 0x67, 0x55, 0x4b, 0x61, 0x46, 0x6c, 0x57, 0x33, 0x37, 0x6e, 0x2f, 0x4e, 0x64, 0x6f, 0x73, 0x77, 293 | 0x48, 0x4f, 0x53, 0x4d, 0x57, 0x39, 0x2b, 0x70, 0x2f, 0x38, 0x44, 0x45, 0x57, 0x57, 0x58, 0x59, 294 | 0x73, 0x30, 0x6f, 0x66, 0x73, 0x2f, 0x74, 0x79, 0x6c, 0x59, 0x36, 0x4a, 0x34, 0x2b, 0x71, 0x59, 295 | 0x6e, 0x58, 0x2f, 0x74, 0x42, 0x75, 0x64, 0x67, 0x67, 0x46, 0x32, 0x70, 0x75, 0x74, 0x76, 0x51, 296 | 0x4d, 0x45, 0x4c, 0x4b, 0x4e, 0x70, 0x33, 0x68, 0x6d, 0x75, 0x6e, 0x51, 0x4a, 0x44, 0x78, 0x46, 297 | 0x78, 0x69, 0x48, 0x53, 0x6b, 0x52, 0x74, 0x41, 0x37, 0x38, 0x54, 0x79, 0x71, 0x69, 0x44, 0x70, 298 | 0x74, 0x42, 0x43, 0x43, 0x79, 0x33, 0x30, 0x6b, 0x49, 0x36, 0x44, 0x6b, 0x6d, 0x36, 0x54, 0x66, 299 | 0x42, 0x47, 0x46, 0x4f, 0x32, 0x7a, 0x73, 0x4b, 0x77, 0x4e, 0x4e, 0x47, 0x76, 0x6b, 0x55, 0x6e, 300 | 0x39, 0x76, 0x36, 0x30, 0x7a, 0x38, 0x39, 0x55, 0x50, 0x47, 0x79, 0x65, 0x76, 0x38, 0x63, 0x6f, 301 | 0x74, 0x37, 0x46, 0x6f, 0x44, 0x6e, 0x56, 0x2b, 0x39, 0x4d, 0x74, 0x46, 0x4e, 0x55, 0x4b, 0x30, 302 | 0x52, 0x33, 0x49, 0x75, 0x54, 0x4d, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, 303 | 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x27, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 304 | 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 305 | 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 306 | 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 307 | 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 308 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x20, 309 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x72, 0x20, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 310 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 311 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x61, 312 | 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 313 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6d, 0x67, 314 | 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x20, 315 | 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x20, 0x73, 0x72, 0x63, 316 | 0x3d, 0x22, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x62, 0x6d, 0x70, 317 | 0x22, 0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 318 | 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x61, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 319 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 320 | 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 321 | 0x20, 0x20, 0x20, 0x3c, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 322 | 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 323 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x75, 0x6c, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 324 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 325 | 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x4c, 0x65, 0x66, 0x74, 326 | 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 327 | 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 328 | 0x6f, 0x6e, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 329 | 0x6c, 0x69, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 330 | 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 331 | 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x64, 332 | 0x69, 0x76, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 333 | 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x3e, 334 | 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0d, 335 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 336 | 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 337 | 0x6f, 0x6e, 0x52, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x74, 0x79, 338 | 0x70, 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 339 | 0x73, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 340 | 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 341 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x75, 0x6c, 0x3e, 0x0d, 0x0a, 0x20, 342 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 343 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x20, 344 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x20, 345 | 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x62, 346 | 0x6f, 0x64, 0x79, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, 0x0a, 347 | }; 348 | -------------------------------------------------------------------------------- /src/WebIndexCore2.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) F4HWN Armel. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | #include // PROGMEM support header 5 | 6 | PROGMEM const char index_html[]={ 7 | 0x3c, 0x21, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, 8 | 0x0a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 9 | 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x63, 0x68, 0x61, 10 | 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 11 | 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x49, 0x43, 0x37, 0x30, 0x35, 0x53, 12 | 0x4d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x43, 0x61, 0x70, 13 | 0x74, 0x75, 0x72, 0x65, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 14 | 0x20, 0x20, 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 15 | 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 16 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 17 | 0x6c, 0x79, 0x3a, 0x20, 0x41, 0x72, 0x69, 0x61, 0x6c, 0x2c, 0x20, 0x73, 0x61, 0x6e, 0x73, 0x2d, 18 | 0x73, 0x65, 0x72, 0x69, 0x66, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 19 | 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 20 | 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30, 0x3b, 0x0d, 21 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 22 | 0x31, 0x30, 0x30, 0x25, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 23 | 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 24 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x74, 25 | 0x61, 0x62, 0x6c, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 26 | 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 27 | 0x72, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 28 | 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x33, 29 | 0x31, 0x33, 0x31, 0x33, 0x31, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 30 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 31 | 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 32 | 0x61, 0x79, 0x3a, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x3b, 0x0d, 33 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 34 | 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 35 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x61, 36 | 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 37 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 38 | 0x62, 0x6c, 0x65, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 39 | 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x33, 0x39, 0x36, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 40 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x33, 0x39, 41 | 0x36, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 42 | 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x30, 0x30, 0x30, 43 | 0x3b, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 44 | 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x20, 0x0d, 45 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 46 | 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 47 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 48 | 0x2d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x75, 0x72, 0x6c, 0x28, 0x27, 0x64, 0x61, 0x74, 49 | 0x61, 0x3a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0x3b, 0x62, 0x61, 0x73, 0x65, 50 | 0x36, 0x34, 0x2c, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 51 | 0x41, 0x41, 0x4e, 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x59, 0x77, 0x41, 0x41, 52 | 0x41, 0x47, 0x4d, 0x43, 0x41, 0x4d, 0x41, 0x41, 0x41, 0x44, 0x2b, 0x35, 0x32, 0x56, 0x34, 0x41, 53 | 0x41, 0x41, 0x42, 0x46, 0x31, 0x42, 0x4d, 0x56, 0x45, 0x55, 0x69, 0x49, 0x69, 0x49, 0x41, 0x41, 54 | 0x41, 0x44, 0x2f, 0x2f, 0x2f, 0x38, 0x77, 0x4d, 0x44, 0x41, 0x64, 0x48, 0x52, 0x33, 0x58, 0x31, 55 | 0x39, 0x63, 0x70, 0x4b, 0x53, 0x6e, 0x32, 0x39, 0x76, 0x59, 0x6a, 0x49, 0x79, 0x50, 0x6e, 0x35, 56 | 0x2b, 0x64, 0x7a, 0x63, 0x33, 0x50, 0x6c, 0x35, 0x65, 0x58, 0x63, 0x33, 0x4e, 0x77, 0x36, 0x50, 57 | 0x44, 0x73, 0x62, 0x47, 0x78, 0x76, 0x4c, 0x79, 0x38, 0x74, 0x50, 0x54, 0x30, 0x2b, 0x50, 0x6b, 58 | 0x4a, 0x44, 0x75, 0x37, 0x75, 0x36, 0x2f, 0x76, 0x37, 0x2f, 0x68, 0x34, 0x65, 0x45, 0x49, 0x43, 59 | 0x41, 0x63, 0x46, 0x42, 0x51, 0x55, 0x4a, 0x43, 0x51, 0x6e, 0x39, 0x2f, 0x66, 0x33, 0x48, 0x78, 60 | 0x38, 0x64, 0x38, 0x66, 0x48, 0x79, 0x37, 0x75, 0x37, 0x73, 0x51, 0x45, 0x52, 0x47, 0x49, 0x69, 61 | 0x49, 0x6a, 0x35, 0x2b, 0x66, 0x6b, 0x36, 0x4f, 0x6a, 0x72, 0x37, 0x2b, 0x2f, 0x73, 0x72, 0x4c, 62 | 0x43, 0x7a, 0x66, 0x33, 0x39, 0x39, 0x54, 0x41, 0x41, 0x41, 0x38, 0x41, 0x41, 0x41, 0x74, 0x4c, 63 | 0x69, 0x37, 0x71, 0x36, 0x75, 0x70, 0x4b, 0x41, 0x41, 0x41, 0x48, 0x41, 0x41, 0x42, 0x50, 0x41, 64 | 0x41, 0x43, 0x78, 0x73, 0x62, 0x46, 0x74, 0x62, 0x57, 0x31, 0x43, 0x41, 0x41, 0x41, 0x71, 0x41, 65 | 0x41, 0x41, 0x31, 0x41, 0x41, 0x43, 0x71, 0x71, 0x71, 0x70, 0x59, 0x41, 0x41, 0x42, 0x70, 0x41, 66 | 0x41, 0x41, 0x68, 0x41, 0x41, 0x42, 0x62, 0x41, 0x41, 0x42, 0x46, 0x41, 0x41, 0x44, 0x61, 0x32, 67 | 0x74, 0x70, 0x6e, 0x61, 0x47, 0x68, 0x46, 0x52, 0x55, 0x55, 0x77, 0x41, 0x41, 0x41, 0x5a, 0x41, 68 | 0x41, 0x44, 0x78, 0x38, 0x66, 0x47, 0x32, 0x74, 0x72, 0x5a, 0x5a, 0x57, 0x56, 0x6c, 0x6b, 0x41, 69 | 0x41, 0x42, 0x67, 0x41, 0x41, 0x41, 0x6d, 0x41, 0x41, 0x44, 0x6a, 0x34, 0x2b, 0x4f, 0x55, 0x6c, 70 | 0x4a, 0x52, 0x54, 0x55, 0x31, 0x4e, 0x4b, 0x53, 0x30, 0x73, 0x53, 0x41, 0x41, 0x41, 0x4f, 0x41, 71 | 0x41, 0x44, 0x30, 0x39, 0x50, 0x52, 0x66, 0x59, 0x47, 0x41, 0x78, 0x4d, 0x6a, 0x4b, 0x65, 0x6e, 72 | 0x70, 0x36, 0x46, 0x68, 0x59, 0x58, 0x55, 0x31, 0x4e, 0x54, 0x4f, 0x7a, 0x73, 0x37, 0x44, 0x78, 73 | 0x4d, 0x51, 0x32, 0x4e, 0x7a, 0x63, 0x56, 0x46, 0x68, 0x5a, 0x31, 0x41, 0x41, 0x43, 0x42, 0x67, 74 | 0x59, 0x47, 0x6d, 0x70, 0x71, 0x61, 0x6a, 0x6f, 0x36, 0x4f, 0x59, 0x6d, 0x5a, 0x6d, 0x4d, 0x6a, 75 | 0x49, 0x78, 0x75, 0x41, 0x41, 0x41, 0x2f, 0x51, 0x45, 0x44, 0x6d, 0x35, 0x75, 0x5a, 0x34, 0x65, 76 | 0x48, 0x67, 0x54, 0x46, 0x42, 0x51, 0x30, 0x4e, 0x54, 0x57, 0x50, 0x6a, 0x34, 0x38, 0x4e, 0x74, 77 | 0x4d, 0x4c, 0x30, 0x41, 0x41, 0x41, 0x4c, 0x49, 0x30, 0x6c, 0x45, 0x51, 0x56, 0x52, 0x34, 0x32, 78 | 0x75, 0x7a, 0x61, 0x53, 0x32, 0x2b, 0x69, 0x55, 0x42, 0x54, 0x41, 0x38, 0x58, 0x73, 0x75, 0x46, 79 | 0x52, 0x6e, 0x66, 0x52, 0x61, 0x64, 0x53, 0x74, 0x52, 0x52, 0x4d, 0x63, 0x41, 0x45, 0x4c, 0x56, 80 | 0x6d, 0x49, 0x43, 0x4c, 0x6b, 0x51, 0x54, 0x55, 0x66, 0x45, 0x52, 0x58, 0x37, 0x48, 0x57, 0x2b, 81 | 0x66, 0x36, 0x66, 0x59, 0x32, 0x77, 0x76, 0x61, 0x75, 0x33, 0x55, 0x47, 0x5a, 0x4d, 0x4b, 0x4a, 82 | 0x4a, 0x50, 0x7a, 0x32, 0x35, 0x6d, 0x77, 0x34, 0x68, 0x38, 0x34, 0x31, 0x36, 0x4f, 0x45, 0x75, 83 | 0x30, 0x52, 0x54, 0x53, 0x51, 0x33, 0x32, 0x43, 0x50, 0x65, 0x63, 0x52, 0x64, 0x38, 0x32, 0x56, 84 | 0x58, 0x4f, 0x77, 0x4e, 0x78, 0x4e, 0x55, 0x37, 0x71, 0x49, 0x4c, 0x4d, 0x58, 0x67, 0x41, 0x6d, 85 | 0x42, 0x71, 0x75, 0x50, 0x6b, 0x6b, 0x30, 0x6d, 0x38, 0x30, 0x4d, 0x75, 0x6f, 0x48, 0x39, 0x6a, 86 | 0x66, 0x53, 0x4c, 0x35, 0x70, 0x4e, 0x48, 0x41, 0x46, 0x37, 0x56, 0x36, 0x32, 0x4f, 0x6f, 0x4d, 87 | 0x39, 0x68, 0x5a, 0x72, 0x6c, 0x34, 0x63, 0x31, 0x30, 0x57, 0x5a, 0x6f, 0x68, 0x74, 0x4b, 0x4e, 88 | 0x70, 0x71, 0x50, 0x56, 0x58, 0x33, 0x74, 0x43, 0x58, 0x43, 0x6e, 0x58, 0x52, 0x56, 0x44, 0x34, 89 | 0x36, 0x66, 0x64, 0x72, 0x56, 0x74, 0x74, 0x55, 0x42, 0x53, 0x53, 0x6b, 0x72, 0x34, 0x32, 0x65, 90 | 0x68, 0x78, 0x2f, 0x56, 0x51, 0x7a, 0x69, 0x36, 0x61, 0x4a, 0x43, 0x55, 0x57, 0x67, 0x6b, 0x71, 91 | 0x74, 0x52, 0x58, 0x76, 0x62, 0x74, 0x2f, 0x78, 0x68, 0x67, 0x41, 0x65, 0x4a, 0x4e, 0x30, 0x58, 92 | 0x36, 0x49, 0x6f, 0x56, 0x4c, 0x4b, 0x64, 0x30, 0x61, 0x64, 0x77, 0x4e, 0x2f, 0x68, 0x62, 0x44, 93 | 0x42, 0x34, 0x38, 0x30, 0x2b, 0x39, 0x54, 0x46, 0x49, 0x46, 0x47, 0x33, 0x6d, 0x32, 0x42, 0x64, 94 | 0x6a, 0x47, 0x47, 0x70, 0x6b, 0x35, 0x54, 0x56, 0x5a, 0x75, 0x65, 0x6b, 0x32, 0x51, 0x35, 0x69, 95 | 0x57, 0x35, 0x41, 0x56, 0x75, 0x67, 0x6e, 0x64, 0x64, 0x4d, 0x53, 0x31, 0x49, 0x73, 0x78, 0x57, 96 | 0x74, 0x76, 0x4d, 0x78, 0x77, 0x79, 0x4b, 0x49, 0x73, 0x74, 0x79, 0x49, 0x2b, 0x50, 0x6e, 0x30, 97 | 0x66, 0x65, 0x4e, 0x2f, 0x62, 0x71, 0x6f, 0x79, 0x4c, 0x49, 0x69, 0x30, 0x52, 0x4e, 0x35, 0x33, 98 | 0x4d, 0x35, 0x71, 0x58, 0x38, 0x59, 0x59, 0x77, 0x4d, 0x59, 0x56, 0x7a, 0x79, 0x37, 0x4e, 0x44, 99 | 0x79, 0x75, 0x47, 0x35, 0x62, 0x57, 0x37, 0x42, 0x58, 0x51, 0x44, 0x33, 0x62, 0x5a, 0x6e, 0x47, 100 | 0x53, 0x4d, 0x7a, 0x51, 0x54, 0x2b, 0x51, 0x53, 0x36, 0x6d, 0x63, 0x4d, 0x50, 0x67, 0x69, 0x42, 101 | 0x76, 0x51, 0x57, 0x44, 0x58, 0x72, 0x55, 0x48, 0x79, 0x39, 0x57, 0x78, 0x67, 0x62, 0x51, 0x62, 102 | 0x64, 0x55, 0x4b, 0x6c, 0x61, 0x48, 0x65, 0x56, 0x4f, 0x69, 0x42, 0x56, 0x48, 0x49, 0x46, 0x38, 103 | 0x6b, 0x63, 0x4d, 0x56, 0x57, 0x32, 0x5a, 0x70, 0x78, 0x5a, 0x69, 0x55, 0x7a, 0x63, 0x41, 0x68, 104 | 0x65, 0x53, 0x70, 0x6d, 0x45, 0x6e, 0x53, 0x67, 0x39, 0x4a, 0x4b, 0x30, 0x44, 0x37, 0x46, 0x30, 105 | 0x4c, 0x54, 0x65, 0x38, 0x4e, 0x68, 0x43, 0x65, 0x58, 0x45, 0x34, 0x51, 0x43, 0x46, 0x71, 0x35, 106 | 0x30, 0x2f, 0x66, 0x35, 0x44, 0x71, 0x56, 0x72, 0x48, 0x6f, 0x65, 0x67, 0x37, 0x54, 0x57, 0x4e, 107 | 0x6a, 0x32, 0x59, 0x74, 0x49, 0x55, 0x61, 0x6f, 0x42, 0x44, 0x4e, 0x2b, 0x4b, 0x31, 0x50, 0x41, 108 | 0x31, 0x4c, 0x61, 0x34, 0x39, 0x57, 0x7a, 0x47, 0x44, 0x42, 0x76, 0x53, 0x4a, 0x53, 0x78, 0x7a, 109 | 0x54, 0x61, 0x67, 0x73, 0x4f, 0x57, 0x4d, 0x71, 0x6b, 0x51, 0x5a, 0x32, 0x54, 0x64, 0x67, 0x38, 110 | 0x43, 0x45, 0x47, 0x62, 0x4d, 0x65, 0x48, 0x54, 0x69, 0x38, 0x4c, 0x48, 0x6c, 0x44, 0x59, 0x48, 111 | 0x67, 0x41, 0x4b, 0x6a, 0x6b, 0x30, 0x5a, 0x78, 0x66, 0x48, 0x67, 0x46, 0x45, 0x50, 0x6a, 0x69, 112 | 0x6f, 0x64, 0x4d, 0x36, 0x65, 0x58, 0x62, 0x6c, 0x53, 0x68, 0x63, 0x37, 0x42, 0x34, 0x66, 0x61, 113 | 0x7a, 0x51, 0x57, 0x70, 0x78, 0x69, 0x71, 0x75, 0x71, 0x35, 0x54, 0x52, 0x6c, 0x77, 0x43, 0x69, 114 | 0x6f, 0x77, 0x6a, 0x55, 0x63, 0x62, 0x33, 0x4e, 0x4f, 0x30, 0x51, 0x59, 0x39, 0x65, 0x55, 0x67, 115 | 0x74, 0x58, 0x48, 0x6b, 0x67, 0x43, 0x4b, 0x7a, 0x4d, 0x61, 0x68, 0x54, 0x48, 0x39, 0x43, 0x65, 116 | 0x42, 0x62, 0x6a, 0x72, 0x72, 0x65, 0x79, 0x67, 0x38, 0x32, 0x75, 0x33, 0x73, 0x4e, 0x33, 0x56, 117 | 0x4a, 0x53, 0x73, 0x73, 0x63, 0x4a, 0x71, 0x76, 0x42, 0x68, 0x5a, 0x2f, 0x6a, 0x30, 0x47, 0x47, 118 | 0x42, 0x6d, 0x5a, 0x44, 0x5a, 0x4c, 0x45, 0x44, 0x6c, 0x43, 0x6b, 0x72, 0x42, 0x2f, 0x42, 0x6f, 119 | 0x31, 0x46, 0x74, 0x31, 0x39, 0x35, 0x69, 0x38, 0x4a, 0x78, 0x4c, 0x6d, 0x58, 0x72, 0x71, 0x46, 120 | 0x56, 0x43, 0x45, 0x48, 0x6f, 0x41, 0x34, 0x49, 0x68, 0x73, 0x51, 0x2f, 0x63, 0x71, 0x44, 0x74, 121 | 0x6f, 0x38, 0x42, 0x71, 0x55, 0x6b, 0x77, 0x52, 0x78, 0x34, 0x42, 0x52, 0x61, 0x77, 0x73, 0x4e, 122 | 0x43, 0x6d, 0x72, 0x73, 0x65, 0x79, 0x52, 0x74, 0x78, 0x68, 0x44, 0x6d, 0x33, 0x31, 0x4f, 0x7a, 123 | 0x41, 0x46, 0x46, 0x37, 0x72, 0x43, 0x64, 0x39, 0x65, 0x66, 0x41, 0x45, 0x62, 0x58, 0x73, 0x55, 124 | 0x4d, 0x59, 0x45, 0x46, 0x4c, 0x33, 0x32, 0x68, 0x4c, 0x36, 0x54, 0x46, 0x38, 0x41, 0x52, 0x77, 125 | 0x63, 0x71, 0x7a, 0x35, 0x38, 0x54, 0x2b, 0x42, 0x53, 0x67, 0x47, 0x51, 0x38, 0x6f, 0x55, 0x65, 126 | 0x5a, 0x57, 0x55, 0x56, 0x33, 0x56, 0x32, 0x6c, 0x4b, 0x70, 0x36, 0x67, 0x47, 0x49, 0x77, 0x36, 127 | 0x72, 0x43, 0x52, 0x6e, 0x54, 0x63, 0x49, 0x67, 0x57, 0x4b, 0x53, 0x78, 0x58, 0x69, 0x61, 0x41, 128 | 0x59, 0x70, 0x42, 0x31, 0x31, 0x54, 0x59, 0x57, 0x64, 0x61, 0x74, 0x6b, 0x64, 0x64, 0x45, 0x38, 129 | 0x4d, 0x36, 0x79, 0x41, 0x4d, 0x57, 0x69, 0x77, 0x6d, 0x49, 0x6b, 0x69, 0x30, 0x42, 0x36, 0x77, 130 | 0x56, 0x75, 0x71, 0x67, 0x34, 0x76, 0x7a, 0x6d, 0x46, 0x6a, 0x4a, 0x34, 0x44, 0x51, 0x4c, 0x78, 131 | 0x47, 0x49, 0x78, 0x62, 0x4b, 0x63, 0x46, 0x4b, 0x42, 0x5a, 0x65, 0x38, 0x46, 0x4e, 0x53, 0x52, 132 | 0x69, 0x4f, 0x6a, 0x44, 0x74, 0x76, 0x69, 0x75, 0x6c, 0x4e, 0x41, 0x73, 0x53, 0x67, 0x38, 0x4a, 133 | 0x74, 0x6e, 0x51, 0x36, 0x4a, 0x4c, 0x68, 0x6a, 0x32, 0x42, 0x54, 0x4a, 0x51, 0x43, 0x4b, 0x78, 134 | 0x63, 0x59, 0x55, 0x57, 0x51, 0x79, 0x44, 0x42, 0x50, 0x38, 0x4a, 0x36, 0x58, 0x52, 0x7a, 0x67, 135 | 0x47, 0x4b, 0x78, 0x75, 0x32, 0x63, 0x4a, 0x53, 0x68, 0x58, 0x69, 0x42, 0x44, 0x46, 0x61, 0x75, 136 | 0x43, 0x53, 0x4d, 0x43, 0x54, 0x63, 0x50, 0x45, 0x6f, 0x78, 0x49, 0x56, 0x57, 0x52, 0x5a, 0x6e, 137 | 0x73, 0x75, 0x41, 0x59, 0x71, 0x46, 0x75, 0x32, 0x61, 0x52, 0x49, 0x72, 0x30, 0x6b, 0x78, 0x69, 138 | 0x44, 0x48, 0x34, 0x43, 0x53, 0x67, 0x57, 0x66, 0x43, 0x71, 0x49, 0x63, 0x58, 0x2b, 0x4d, 0x77, 139 | 0x57, 0x47, 0x4d, 0x36, 0x32, 0x43, 0x4d, 0x2f, 0x39, 0x6c, 0x76, 0x39, 0x75, 0x6a, 0x51, 0x43, 140 | 0x45, 0x41, 0x59, 0x41, 0x49, 0x42, 0x59, 0x52, 0x51, 0x57, 0x71, 0x44, 0x74, 0x68, 0x2f, 0x55, 141 | 0x32, 0x62, 0x67, 0x57, 0x76, 0x45, 0x69, 0x57, 0x53, 0x45, 0x79, 0x51, 0x6d, 0x53, 0x45, 0x79, 142 | 0x41, 0x69, 0x52, 0x45, 0x53, 0x49, 0x6a, 0x52, 0x45, 0x61, 0x49, 0x6a, 0x42, 0x41, 0x5a, 0x49, 143 | 0x54, 0x4a, 0x43, 0x5a, 0x49, 0x54, 0x49, 0x43, 0x4a, 0x45, 0x52, 0x49, 0x69, 0x4e, 0x45, 0x52, 144 | 0x6f, 0x69, 0x4d, 0x45, 0x42, 0x6b, 0x68, 0x4d, 0x6b, 0x4a, 0x6b, 0x68, 0x4d, 0x67, 0x49, 0x6b, 145 | 0x52, 0x45, 0x69, 0x49, 0x30, 0x52, 0x47, 0x69, 0x49, 0x77, 0x51, 0x47, 0x53, 0x45, 0x79, 0x51, 146 | 0x6d, 0x53, 0x45, 0x79, 0x41, 0x69, 0x52, 0x45, 0x53, 0x49, 0x6a, 0x52, 0x45, 0x61, 0x49, 0x6a, 147 | 0x4a, 0x42, 0x66, 0x47, 0x66, 0x65, 0x61, 0x62, 0x46, 0x76, 0x50, 0x6b, 0x59, 0x78, 0x33, 0x58, 148 | 0x4f, 0x77, 0x61, 0x38, 0x31, 0x51, 0x47, 0x32, 0x32, 0x53, 0x55, 0x79, 0x41, 0x69, 0x52, 0x45, 149 | 0x53, 0x49, 0x6a, 0x35, 0x47, 0x50, 0x6e, 0x6a, 0x6c, 0x55, 0x61, 0x42, 0x71, 0x4d, 0x34, 0x69, 150 | 0x70, 0x4e, 0x41, 0x45, 0x59, 0x73, 0x69, 0x32, 0x4b, 0x4a, 0x66, 0x31, 0x64, 0x54, 0x4a, 0x4a, 151 | 0x52, 0x30, 0x79, 0x6d, 0x51, 0x36, 0x5a, 0x75, 0x6b, 0x68, 0x4a, 0x72, 0x56, 0x4b, 0x77, 0x56, 152 | 0x48, 0x7a, 0x2f, 0x42, 0x37, 0x48, 0x6a, 0x56, 0x37, 0x4a, 0x30, 0x75, 0x34, 0x64, 0x79, 0x7a, 153 | 0x69, 0x76, 0x38, 0x34, 0x47, 0x37, 0x2f, 0x4b, 0x77, 0x59, 0x6f, 0x4d, 0x55, 0x43, 0x4a, 0x41, 154 | 0x55, 0x6f, 0x4d, 0x55, 0x47, 0x4b, 0x41, 0x45, 0x67, 0x4f, 0x55, 0x47, 0x4b, 0x44, 0x45, 0x41, 155 | 0x43, 0x55, 0x47, 0x4b, 0x44, 0x46, 0x41, 0x69, 0x51, 0x46, 0x4b, 0x44, 0x46, 0x42, 0x69, 0x67, 156 | 0x42, 0x49, 0x44, 0x6c, 0x42, 0x69, 0x67, 0x78, 0x41, 0x41, 0x6c, 0x42, 0x69, 0x67, 0x78, 0x51, 157 | 0x49, 0x6b, 0x42, 0x53, 0x67, 0x78, 0x51, 0x59, 0x6f, 0x41, 0x53, 0x41, 0x35, 0x51, 0x59, 0x6f, 158 | 0x4d, 0x51, 0x41, 0x4a, 0x51, 0x59, 0x6f, 0x4d, 0x55, 0x43, 0x4a, 0x41, 0x55, 0x6f, 0x4d, 0x55, 159 | 0x4f, 0x64, 0x69, 0x70, 0x4a, 0x54, 0x4b, 0x36, 0x56, 0x71, 0x4d, 0x76, 0x43, 0x43, 0x4d, 0x2b, 160 | 0x58, 0x58, 0x66, 0x4c, 0x6d, 0x61, 0x62, 0x72, 0x30, 0x63, 0x78, 0x73, 0x6d, 0x49, 0x77, 0x74, 161 | 0x70, 0x2f, 0x4e, 0x6f, 0x74, 0x37, 0x76, 0x71, 0x2b, 0x57, 0x66, 0x47, 0x46, 0x6b, 0x78, 0x47, 162 | 0x4c, 0x50, 0x56, 0x75, 0x4a, 0x37, 0x2f, 0x72, 0x6f, 0x72, 0x6c, 0x74, 0x78, 0x68, 0x5a, 0x51, 163 | 0x52, 0x68, 0x50, 0x2f, 0x61, 0x67, 0x73, 0x6e, 0x34, 0x76, 0x62, 0x46, 0x7a, 0x47, 0x79, 0x6f, 164 | 0x6a, 0x43, 0x71, 0x55, 0x54, 0x70, 0x69, 0x76, 0x49, 0x71, 0x52, 0x4a, 0x38, 0x59, 0x6c, 0x4a, 165 | 0x77, 0x59, 0x6f, 0x4d, 0x55, 0x43, 0x4a, 0x41, 0x55, 0x6f, 0x4d, 0x55, 0x47, 0x4b, 0x41, 0x45, 166 | 0x67, 0x4f, 0x55, 0x47, 0x4b, 0x44, 0x45, 0x41, 0x43, 0x55, 0x47, 0x4b, 0x44, 0x46, 0x41, 0x69, 167 | 0x51, 0x46, 0x4b, 0x44, 0x46, 0x42, 0x69, 0x67, 0x42, 0x49, 0x44, 0x6c, 0x42, 0x69, 0x67, 0x78, 168 | 0x41, 0x41, 0x6c, 0x42, 0x69, 0x67, 0x78, 0x51, 0x49, 0x6b, 0x42, 0x53, 0x67, 0x78, 0x51, 0x59, 169 | 0x6f, 0x41, 0x53, 0x41, 0x35, 0x51, 0x59, 0x6f, 0x4d, 0x51, 0x41, 0x4a, 0x51, 0x59, 0x6f, 0x4d, 170 | 0x55, 0x43, 0x4a, 0x41, 0x55, 0x6f, 0x4d, 0x55, 0x47, 0x4b, 0x41, 0x45, 0x67, 0x4f, 0x55, 0x47, 171 | 0x4b, 0x44, 0x4f, 0x78, 0x58, 0x67, 0x58, 0x59, 0x31, 0x41, 0x59, 0x68, 0x6a, 0x4f, 0x79, 0x59, 172 | 0x55, 0x45, 0x59, 0x75, 0x39, 0x32, 0x6d, 0x4c, 0x4f, 0x76, 0x69, 0x34, 0x4e, 0x6f, 0x31, 0x4c, 173 | 0x77, 0x5a, 0x6a, 0x32, 0x31, 0x56, 0x74, 0x38, 0x39, 0x4f, 0x75, 0x58, 0x62, 0x75, 0x65, 0x46, 174 | 0x49, 0x4d, 0x78, 0x6d, 0x64, 0x37, 0x31, 0x34, 0x37, 0x62, 0x70, 0x44, 0x70, 0x36, 0x70, 0x76, 175 | 0x43, 0x43, 0x4d, 0x6a, 0x33, 0x54, 0x54, 0x54, 0x61, 0x37, 0x75, 0x33, 0x78, 0x37, 0x45, 0x47, 176 | 0x4f, 0x51, 0x6a, 0x6c, 0x38, 0x74, 0x4d, 0x44, 0x46, 0x42, 0x69, 0x67, 0x42, 0x49, 0x44, 0x6c, 177 | 0x42, 0x6a, 0x2f, 0x37, 0x4e, 0x47, 0x78, 0x41, 0x41, 0x41, 0x41, 0x41, 0x4d, 0x41, 0x67, 0x66, 178 | 0x2b, 0x74, 0x70, 0x37, 0x43, 0x69, 0x46, 0x52, 0x6d, 0x53, 0x4d, 0x79, 0x42, 0x69, 0x52, 0x4d, 179 | 0x53, 0x4a, 0x6a, 0x52, 0x4d, 0x61, 0x49, 0x6a, 0x42, 0x45, 0x5a, 0x49, 0x7a, 0x4a, 0x47, 0x5a, 180 | 0x49, 0x7a, 0x49, 0x47, 0x4a, 0x45, 0x78, 0x49, 0x6d, 0x4e, 0x45, 0x78, 0x6f, 0x69, 0x4d, 0x45, 181 | 0x52, 0x6b, 0x6a, 0x4d, 0x6b, 0x5a, 0x6b, 0x6a, 0x4d, 0x67, 0x59, 0x6b, 0x54, 0x45, 0x69, 0x59, 182 | 0x30, 0x54, 0x47, 0x69, 0x49, 0x77, 0x52, 0x47, 0x53, 0x4d, 0x79, 0x52, 0x6d, 0x53, 0x4d, 0x79, 183 | 0x42, 0x69, 0x52, 0x4d, 0x53, 0x4a, 0x6a, 0x52, 0x4d, 0x61, 0x49, 0x6a, 0x42, 0x45, 0x5a, 0x49, 184 | 0x7a, 0x4a, 0x47, 0x5a, 0x49, 0x7a, 0x49, 0x47, 0x4a, 0x45, 0x78, 0x49, 0x6d, 0x4e, 0x45, 0x78, 185 | 0x6f, 0x69, 0x4d, 0x45, 0x52, 0x6b, 0x6a, 0x4d, 0x6b, 0x5a, 0x6b, 0x6a, 0x4d, 0x67, 0x59, 0x6b, 186 | 0x54, 0x45, 0x69, 0x59, 0x30, 0x54, 0x47, 0x69, 0x49, 0x77, 0x52, 0x47, 0x53, 0x4d, 0x79, 0x52, 187 | 0x6d, 0x53, 0x4d, 0x79, 0x42, 0x69, 0x52, 0x4d, 0x53, 0x4a, 0x6a, 0x52, 0x4d, 0x61, 0x49, 0x6a, 188 | 0x42, 0x45, 0x5a, 0x49, 0x7a, 0x4a, 0x47, 0x5a, 0x49, 0x7a, 0x49, 0x47, 0x4a, 0x45, 0x78, 0x49, 189 | 0x6d, 0x4e, 0x45, 0x78, 0x6f, 0x69, 0x4d, 0x45, 0x52, 0x6b, 0x6a, 0x4d, 0x6b, 0x5a, 0x6b, 0x6a, 190 | 0x4d, 0x67, 0x59, 0x6b, 0x54, 0x45, 0x69, 0x59, 0x30, 0x54, 0x47, 0x69, 0x49, 0x77, 0x52, 0x47, 191 | 0x53, 0x4d, 0x79, 0x52, 0x6d, 0x53, 0x4d, 0x79, 0x42, 0x69, 0x52, 0x4d, 0x53, 0x4a, 0x6a, 0x52, 192 | 0x4d, 0x61, 0x49, 0x6a, 0x42, 0x45, 0x5a, 0x49, 0x7a, 0x4a, 0x47, 0x5a, 0x49, 0x7a, 0x49, 0x47, 193 | 0x4a, 0x45, 0x78, 0x49, 0x6d, 0x4e, 0x45, 0x78, 0x6f, 0x69, 0x4d, 0x45, 0x52, 0x6b, 0x6a, 0x4d, 194 | 0x6b, 0x5a, 0x6b, 0x6a, 0x4d, 0x67, 0x59, 0x6b, 0x54, 0x45, 0x69, 0x59, 0x30, 0x54, 0x47, 0x69, 195 | 0x49, 0x77, 0x52, 0x47, 0x53, 0x4d, 0x79, 0x52, 0x6d, 0x53, 0x4d, 0x79, 0x42, 0x69, 0x52, 0x4d, 196 | 0x53, 0x4a, 0x6a, 0x52, 0x4d, 0x61, 0x49, 0x6a, 0x42, 0x45, 0x5a, 0x49, 0x7a, 0x4a, 0x47, 0x5a, 197 | 0x49, 0x7a, 0x49, 0x47, 0x4a, 0x45, 0x78, 0x49, 0x6d, 0x4e, 0x45, 0x78, 0x6f, 0x69, 0x4d, 0x45, 198 | 0x52, 0x6b, 0x6a, 0x4d, 0x6b, 0x5a, 0x6b, 0x6a, 0x4d, 0x67, 0x59, 0x6b, 0x54, 0x45, 0x69, 0x59, 199 | 0x30, 0x54, 0x47, 0x69, 0x49, 0x77, 0x52, 0x47, 0x53, 0x4d, 0x79, 0x52, 0x6d, 0x53, 0x4d, 0x79, 200 | 0x42, 0x69, 0x52, 0x4d, 0x53, 0x4a, 0x6a, 0x52, 0x4d, 0x61, 0x49, 0x6a, 0x42, 0x45, 0x5a, 0x49, 201 | 0x7a, 0x4a, 0x47, 0x5a, 0x49, 0x7a, 0x49, 0x47, 0x4a, 0x45, 0x78, 0x49, 0x6d, 0x4e, 0x45, 0x78, 202 | 0x6f, 0x69, 0x4d, 0x45, 0x52, 0x6b, 0x6a, 0x4d, 0x6b, 0x5a, 0x6b, 0x6a, 0x4d, 0x67, 0x59, 0x6b, 203 | 0x54, 0x45, 0x69, 0x59, 0x30, 0x54, 0x47, 0x69, 0x49, 0x77, 0x52, 0x47, 0x53, 0x4d, 0x79, 0x52, 204 | 0x6d, 0x53, 0x4d, 0x79, 0x42, 0x69, 0x52, 0x4d, 0x53, 0x4a, 0x6a, 0x52, 0x4d, 0x61, 0x49, 0x6a, 205 | 0x42, 0x45, 0x5a, 0x49, 0x7a, 0x4a, 0x47, 0x5a, 0x49, 0x7a, 0x49, 0x69, 0x42, 0x30, 0x37, 0x78, 206 | 0x70, 0x45, 0x62, 0x68, 0x4d, 0x49, 0x34, 0x72, 0x75, 0x38, 0x43, 0x4b, 0x58, 0x4d, 0x42, 0x6e, 207 | 0x6f, 0x53, 0x52, 0x41, 0x41, 0x47, 0x6d, 0x77, 0x41, 0x57, 0x34, 0x73, 0x65, 0x75, 0x34, 0x38, 208 | 0x76, 0x32, 0x50, 0x6b, 0x70, 0x6e, 0x64, 0x6c, 0x51, 0x65, 0x6e, 0x69, 0x2f, 0x49, 0x6d, 0x67, 209 | 0x68, 0x55, 0x2f, 0x75, 0x58, 0x36, 0x46, 0x2f, 0x77, 0x59, 0x6a, 0x47, 0x6a, 0x4a, 0x69, 0x4e, 210 | 0x47, 0x54, 0x45, 0x61, 0x4d, 0x69, 0x49, 0x30, 0x5a, 0x41, 0x52, 0x6f, 0x79, 0x45, 0x6a, 0x52, 211 | 0x6b, 0x4e, 0x47, 0x6a, 0x49, 0x61, 0x4d, 0x47, 0x41, 0x30, 0x5a, 0x4d, 0x52, 0x72, 0x43, 0x46, 212 | 0x4f, 0x50, 0x6e, 0x72, 0x78, 0x2f, 0x44, 0x50, 0x2f, 0x76, 0x31, 0x6c, 0x7a, 0x47, 0x47, 0x74, 213 | 0x78, 0x6f, 0x78, 0x4f, 0x6a, 0x42, 0x69, 0x4e, 0x47, 0x54, 0x45, 0x61, 0x4d, 0x69, 0x49, 0x30, 214 | 0x5a, 0x41, 0x52, 0x6f, 0x79, 0x45, 0x6a, 0x52, 0x6b, 0x4e, 0x47, 0x6a, 0x49, 0x61, 0x4d, 0x47, 215 | 0x41, 0x30, 0x5a, 0x4d, 0x52, 0x72, 0x79, 0x2f, 0x32, 0x4f, 0x73, 0x55, 0x63, 0x70, 0x6f, 0x38, 216 | 0x52, 0x62, 0x70, 0x4f, 0x64, 0x76, 0x67, 0x48, 0x54, 0x61, 0x53, 0x55, 0x74, 0x4b, 0x43, 0x75, 217 | 0x37, 0x35, 0x6a, 0x4a, 0x4b, 0x33, 0x45, 0x67, 0x34, 0x70, 0x32, 0x41, 0x37, 0x4f, 0x64, 0x74, 218 | 0x50, 0x79, 0x63, 0x62, 0x53, 0x59, 0x77, 0x57, 0x33, 0x52, 0x55, 0x77, 0x67, 0x6b, 0x6c, 0x64, 219 | 0x63, 0x42, 0x4e, 0x78, 0x7a, 0x47, 0x6d, 0x35, 0x50, 0x78, 0x73, 0x51, 0x30, 0x6a, 0x69, 0x4c, 220 | 0x44, 0x51, 0x78, 0x7a, 0x36, 0x61, 0x53, 0x56, 0x51, 0x71, 0x72, 0x6e, 0x55, 0x39, 0x68, 0x75, 221 | 0x44, 0x74, 0x4c, 0x58, 0x36, 0x4a, 0x5a, 0x44, 0x4f, 0x56, 0x54, 0x42, 0x6c, 0x52, 0x36, 0x6a, 222 | 0x71, 0x47, 0x39, 0x53, 0x4e, 0x76, 0x30, 0x73, 0x42, 0x6e, 0x6c, 0x42, 0x56, 0x69, 0x4a, 0x55, 223 | 0x36, 0x2f, 0x37, 0x78, 0x32, 0x77, 0x37, 0x46, 0x77, 0x4b, 0x72, 0x66, 0x4b, 0x54, 0x6c, 0x4f, 224 | 0x58, 0x76, 0x66, 0x74, 0x4c, 0x2b, 0x56, 0x37, 0x6a, 0x6a, 0x47, 0x71, 0x6b, 0x72, 0x43, 0x6c, 225 | 0x2b, 0x43, 0x63, 0x59, 0x65, 0x30, 0x38, 0x75, 0x77, 0x56, 0x66, 0x55, 0x68, 0x59, 0x37, 0x61, 226 | 0x2b, 0x65, 0x69, 0x38, 0x4f, 0x56, 0x52, 0x49, 0x2b, 0x4b, 0x6c, 0x34, 0x78, 0x68, 0x71, 0x4a, 227 | 0x6c, 0x79, 0x4d, 0x6d, 0x43, 0x66, 0x77, 0x4b, 0x53, 0x37, 0x67, 0x45, 0x70, 0x30, 0x45, 0x6e, 228 | 0x79, 0x32, 0x72, 0x75, 0x6f, 0x79, 0x77, 0x65, 0x4f, 0x6b, 0x33, 0x52, 0x69, 0x6d, 0x6f, 0x71, 229 | 0x44, 0x4f, 0x41, 0x7a, 0x56, 0x49, 0x55, 0x4b, 0x73, 0x36, 0x44, 0x7a, 0x5a, 0x34, 0x63, 0x6f, 230 | 0x54, 0x4c, 0x50, 0x75, 0x50, 0x51, 0x62, 0x59, 0x78, 0x48, 0x71, 0x76, 0x72, 0x48, 0x77, 0x6e, 231 | 0x61, 0x68, 0x32, 0x71, 0x77, 0x67, 0x56, 0x6b, 0x58, 0x64, 0x77, 0x43, 0x56, 0x4b, 0x76, 0x71, 232 | 0x50, 0x68, 0x58, 0x36, 0x48, 0x35, 0x6a, 0x54, 0x46, 0x59, 0x53, 0x4b, 0x6f, 0x6e, 0x78, 0x32, 233 | 0x4c, 0x37, 0x38, 0x38, 0x63, 0x4b, 0x69, 0x57, 0x43, 0x63, 0x77, 0x4d, 0x63, 0x35, 0x75, 0x33, 234 | 0x32, 0x35, 0x6c, 0x54, 0x43, 0x6e, 0x32, 0x47, 0x6d, 0x50, 0x2f, 0x64, 0x6a, 0x45, 0x51, 0x6c, 235 | 0x45, 0x53, 0x46, 0x48, 0x4f, 0x4d, 0x32, 0x52, 0x64, 0x4b, 0x69, 0x6f, 0x73, 0x72, 0x47, 0x75, 236 | 0x45, 0x31, 0x52, 0x51, 0x43, 0x56, 0x6e, 0x58, 0x50, 0x71, 0x4e, 0x41, 0x65, 0x64, 0x51, 0x6b, 237 | 0x5a, 0x6e, 0x76, 0x36, 0x35, 0x32, 0x43, 0x69, 0x4f, 0x2f, 0x36, 0x67, 0x57, 0x2f, 0x32, 0x48, 238 | 0x6a, 0x6f, 0x58, 0x58, 0x44, 0x71, 0x4f, 0x63, 0x56, 0x2f, 0x67, 0x79, 0x75, 0x2f, 0x67, 0x34, 239 | 0x2b, 0x76, 0x51, 0x69, 0x33, 0x4c, 0x67, 0x73, 0x35, 0x77, 0x4b, 0x4c, 0x31, 0x5a, 0x70, 0x58, 240 | 0x44, 0x71, 0x4f, 0x59, 0x65, 0x65, 0x4d, 0x69, 0x79, 0x73, 0x45, 0x52, 0x72, 0x49, 0x49, 0x58, 241 | 0x50, 0x4b, 0x38, 0x67, 0x73, 0x2f, 0x6b, 0x53, 0x6e, 0x79, 0x56, 0x79, 0x58, 0x4c, 0x48, 0x53, 242 | 0x37, 0x38, 0x78, 0x45, 0x45, 0x2b, 0x52, 0x38, 0x47, 0x46, 0x6c, 0x76, 0x77, 0x35, 0x52, 0x57, 243 | 0x51, 0x5a, 0x38, 0x53, 0x4d, 0x4a, 0x4c, 0x63, 0x41, 0x71, 0x75, 0x36, 0x4d, 0x38, 0x43, 0x47, 244 | 0x37, 0x6c, 0x4d, 0x71, 0x50, 0x55, 0x62, 0x41, 0x33, 0x53, 0x49, 0x5a, 0x4e, 0x62, 0x56, 0x70, 245 | 0x48, 0x69, 0x6f, 0x43, 0x61, 0x77, 0x57, 0x64, 0x57, 0x72, 0x7a, 0x6e, 0x47, 0x33, 0x46, 0x51, 246 | 0x65, 0x42, 0x6c, 0x5a, 0x32, 0x2b, 0x4e, 0x43, 0x61, 0x75, 0x68, 0x2b, 0x54, 0x43, 0x6f, 0x64, 247 | 0x42, 0x31, 0x6a, 0x44, 0x39, 0x49, 0x66, 0x33, 0x68, 0x2b, 0x50, 0x4a, 0x6a, 0x75, 0x59, 0x62, 248 | 0x55, 0x61, 0x63, 0x7a, 0x39, 0x6d, 0x6e, 0x44, 0x50, 0x78, 0x58, 0x36, 0x46, 0x53, 0x4f, 0x49, 249 | 0x35, 0x39, 0x48, 0x70, 0x75, 0x55, 0x2b, 0x75, 0x2b, 0x63, 0x59, 0x51, 0x43, 0x42, 0x4e, 0x70, 250 | 0x4c, 0x58, 0x42, 0x47, 0x78, 0x69, 0x4b, 0x39, 0x48, 0x67, 0x43, 0x2b, 0x47, 0x31, 0x57, 0x61, 251 | 0x39, 0x4c, 0x61, 0x4c, 0x72, 0x6a, 0x70, 0x50, 0x4d, 0x59, 0x77, 0x59, 0x6e, 0x52, 0x68, 0x78, 252 | 0x47, 0x6a, 0x49, 0x69, 0x4e, 0x47, 0x51, 0x45, 0x61, 0x4d, 0x68, 0x49, 0x30, 0x5a, 0x44, 0x52, 253 | 0x6f, 0x79, 0x47, 0x2f, 0x47, 0x37, 0x58, 0x58, 0x6e, 0x70, 0x54, 0x42, 0x61, 0x49, 0x41, 0x6a, 254 | 0x73, 0x38, 0x35, 0x63, 0x77, 0x55, 0x66, 0x74, 0x61, 0x33, 0x69, 0x56, 0x62, 0x51, 0x74, 0x5a, 255 | 0x53, 0x61, 0x42, 0x42, 0x53, 0x35, 0x63, 0x71, 0x59, 0x6d, 0x36, 0x55, 0x45, 0x79, 0x73, 0x57, 256 | 0x68, 0x2f, 0x78, 0x6c, 0x62, 0x37, 0x75, 0x39, 0x2f, 0x38, 0x63, 0x39, 0x38, 0x4c, 0x51, 0x56, 257 | 0x68, 0x50, 0x54, 0x7a, 0x56, 0x56, 0x77, 0x63, 0x58, 0x34, 0x62, 0x68, 0x6f, 0x54, 0x64, 0x6e, 258 | 0x7a, 0x4d, 0x45, 0x41, 0x73, 0x57, 0x34, 0x49, 0x42, 0x54, 0x6a, 0x67, 0x6c, 0x43, 0x4d, 0x43, 259 | 0x30, 0x49, 0x78, 0x4c, 0x67, 0x6a, 0x46, 0x75, 0x43, 0x41, 0x55, 0x34, 0x34, 0x4a, 0x51, 0x6a, 260 | 0x41, 0x74, 0x43, 0x4d, 0x53, 0x37, 0x49, 0x6b, 0x52, 0x68, 0x6a, 0x69, 0x70, 0x47, 0x45, 0x77, 261 | 0x78, 0x68, 0x33, 0x55, 0x59, 0x78, 0x46, 0x42, 0x55, 0x67, 0x69, 0x78, 0x46, 0x73, 0x55, 0x59, 262 | 0x38, 0x65, 0x36, 0x72, 0x6f, 0x72, 0x52, 0x76, 0x67, 0x65, 0x53, 0x43, 0x4c, 0x35, 0x53, 0x43, 263 | 0x66, 0x70, 0x54, 0x31, 0x6f, 0x68, 0x57, 0x2f, 0x6a, 0x57, 0x51, 0x52, 0x43, 0x77, 0x4b, 0x30, 264 | 0x54, 0x7a, 0x55, 0x32, 0x45, 0x54, 0x4e, 0x79, 0x47, 0x73, 0x39, 0x44, 0x53, 0x51, 0x52, 0x4c, 265 | 0x2b, 0x73, 0x69, 0x42, 0x6d, 0x53, 0x64, 0x50, 0x66, 0x51, 0x78, 0x34, 0x4f, 0x37, 0x47, 0x51, 266 | 0x42, 0x49, 0x78, 0x6e, 0x49, 0x39, 0x55, 0x44, 0x4a, 0x2f, 0x56, 0x53, 0x78, 0x6a, 0x6f, 0x65, 267 | 0x47, 0x30, 0x67, 0x69, 0x65, 0x69, 0x39, 0x32, 0x68, 0x69, 0x34, 0x47, 0x72, 0x4f, 0x68, 0x78, 268 | 0x49, 0x41, 0x74, 0x66, 0x53, 0x43, 0x4a, 0x61, 0x4f, 0x6b, 0x59, 0x53, 0x67, 0x47, 0x37, 0x54, 269 | 0x6d, 0x48, 0x49, 0x61, 0x67, 0x46, 0x4a, 0x52, 0x4d, 0x31, 0x57, 0x41, 0x65, 0x62, 0x41, 0x59, 270 | 0x47, 0x36, 0x70, 0x39, 0x51, 0x70, 0x49, 0x45, 0x74, 0x6f, 0x62, 0x46, 0x61, 0x4f, 0x30, 0x72, 271 | 0x54, 0x43, 0x59, 0x39, 0x44, 0x46, 0x67, 0x65, 0x7a, 0x30, 0x67, 0x43, 0x56, 0x68, 0x4a, 0x45, 272 | 0x77, 0x4f, 0x7a, 0x4c, 0x47, 0x4f, 0x73, 0x50, 0x73, 0x4f, 0x41, 0x36, 0x65, 0x36, 0x67, 0x44, 273 | 0x43, 0x52, 0x32, 0x45, 0x31, 0x53, 0x4d, 0x73, 0x57, 0x42, 0x69, 0x32, 0x55, 0x58, 0x46, 0x41, 274 | 0x78, 0x4b, 0x2f, 0x6f, 0x59, 0x45, 0x68, 0x75, 0x77, 0x47, 0x63, 0x63, 0x64, 0x6a, 0x6f, 0x47, 275 | 0x4d, 0x30, 0x4a, 0x6b, 0x4e, 0x68, 0x74, 0x4d, 0x68, 0x67, 0x77, 0x55, 0x39, 0x4d, 0x77, 0x52, 276 | 0x72, 0x5a, 0x71, 0x71, 0x6e, 0x4d, 0x44, 0x53, 0x4d, 0x7a, 0x4b, 0x4d, 0x45, 0x4f, 0x6c, 0x34, 277 | 0x56, 0x39, 0x7a, 0x78, 0x74, 0x4f, 0x50, 0x57, 0x31, 0x52, 0x6b, 0x44, 0x65, 0x69, 0x78, 0x45, 278 | 0x61, 0x63, 0x79, 0x6c, 0x4c, 0x30, 0x69, 0x68, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x43, 0x4d, 0x63, 279 | 0x36, 0x6a, 0x33, 0x62, 0x51, 0x7a, 0x6f, 0x73, 0x79, 0x47, 0x51, 0x4f, 0x50, 0x32, 0x75, 0x5a, 280 | 0x7a, 0x43, 0x6b, 0x56, 0x35, 0x39, 0x67, 0x48, 0x4d, 0x53, 0x34, 0x76, 0x74, 0x31, 0x45, 0x65, 281 | 0x61, 0x77, 0x4a, 0x66, 0x52, 0x4f, 0x4a, 0x31, 0x64, 0x4f, 0x64, 0x68, 0x61, 0x46, 0x4d, 0x4e, 282 | 0x71, 0x2f, 0x78, 0x49, 0x49, 0x62, 0x6a, 0x74, 0x43, 0x57, 0x47, 0x54, 0x47, 0x73, 0x48, 0x4a, 283 | 0x44, 0x35, 0x73, 0x6a, 0x59, 0x70, 0x31, 0x77, 0x77, 0x55, 0x50, 0x59, 0x33, 0x41, 0x68, 0x74, 284 | 0x6a, 0x6c, 0x55, 0x4d, 0x67, 0x4d, 0x67, 0x73, 0x57, 0x6e, 0x6f, 0x71, 0x44, 0x53, 0x7a, 0x77, 285 | 0x6f, 0x6c, 0x69, 0x63, 0x43, 0x64, 0x76, 0x32, 0x4b, 0x6a, 0x49, 0x41, 0x70, 0x41, 0x59, 0x6c, 286 | 0x41, 0x46, 0x67, 0x58, 0x55, 0x53, 0x6c, 0x75, 0x41, 0x59, 0x65, 0x59, 0x44, 0x77, 0x41, 0x30, 287 | 0x32, 0x65, 0x4d, 0x39, 0x4b, 0x65, 0x50, 0x51, 0x47, 0x4c, 0x67, 0x54, 0x30, 0x61, 0x6f, 0x32, 288 | 0x4e, 0x31, 0x65, 0x5a, 0x53, 0x2b, 0x47, 0x41, 0x77, 0x38, 0x64, 0x45, 0x35, 0x58, 0x52, 0x34, 289 | 0x41, 0x50, 0x49, 0x32, 0x66, 0x6b, 0x4e, 0x6a, 0x46, 0x69, 0x79, 0x42, 0x6a, 0x7a, 0x45, 0x6f, 290 | 0x73, 0x4e, 0x77, 0x59, 0x4b, 0x46, 0x69, 0x57, 0x73, 0x59, 0x74, 0x6b, 0x4c, 0x4e, 0x52, 0x57, 291 | 0x39, 0x54, 0x30, 0x32, 0x63, 0x4b, 0x49, 0x57, 0x38, 0x74, 0x72, 0x42, 0x7a, 0x45, 0x63, 0x62, 292 | 0x65, 0x68, 0x31, 0x4d, 0x44, 0x4a, 0x4b, 0x65, 0x66, 0x54, 0x43, 0x63, 0x56, 0x59, 0x74, 0x6f, 293 | 0x2f, 0x2f, 0x56, 0x49, 0x6c, 0x66, 0x34, 0x53, 0x48, 0x4f, 0x46, 0x63, 0x55, 0x56, 0x6f, 0x2b, 294 | 0x65, 0x34, 0x49, 0x50, 0x34, 0x32, 0x4d, 0x53, 0x58, 0x59, 0x4a, 0x35, 0x43, 0x77, 0x57, 0x74, 295 | 0x58, 0x58, 0x56, 0x78, 0x45, 0x2b, 0x5a, 0x44, 0x51, 0x69, 0x2b, 0x46, 0x30, 0x4e, 0x5a, 0x76, 296 | 0x6e, 0x6a, 0x32, 0x39, 0x7a, 0x58, 0x32, 0x37, 0x4b, 0x48, 0x6c, 0x35, 0x39, 0x50, 0x30, 0x5a, 297 | 0x39, 0x74, 0x4a, 0x33, 0x59, 0x74, 0x32, 0x72, 0x7a, 0x36, 0x34, 0x77, 0x69, 0x39, 0x32, 0x63, 298 | 0x51, 0x75, 0x43, 0x48, 0x38, 0x52, 0x51, 0x74, 0x4e, 0x75, 0x4a, 0x6a, 0x70, 0x39, 0x4d, 0x30, 299 | 0x37, 0x61, 0x65, 0x4e, 0x2f, 0x55, 0x46, 0x6b, 0x4e, 0x4e, 0x35, 0x62, 0x37, 0x39, 0x35, 0x30, 300 | 0x74, 0x71, 0x37, 0x35, 0x63, 0x33, 0x4d, 0x61, 0x69, 0x48, 0x34, 0x73, 0x52, 0x68, 0x43, 0x75, 301 | 0x79, 0x31, 0x49, 0x33, 0x47, 0x4d, 0x56, 0x58, 0x30, 0x76, 0x79, 0x6e, 0x78, 0x54, 0x35, 0x66, 302 | 0x30, 0x30, 0x70, 0x5a, 0x61, 0x6d, 0x55, 0x36, 0x64, 0x6a, 0x34, 0x7a, 0x62, 0x70, 0x5a, 0x76, 303 | 0x61, 0x54, 0x35, 0x30, 0x52, 0x68, 0x6a, 0x68, 0x30, 0x47, 0x68, 0x36, 0x69, 0x4b, 0x4a, 0x53, 304 | 0x65, 0x37, 0x75, 0x44, 0x54, 0x52, 0x2b, 0x4a, 0x49, 0x62, 0x69, 0x67, 0x4e, 0x39, 0x77, 0x64, 305 | 0x52, 0x50, 0x4a, 0x32, 0x5a, 0x6b, 0x64, 0x75, 0x56, 0x30, 0x41, 0x50, 0x38, 0x44, 0x34, 0x49, 306 | 0x59, 0x33, 0x33, 0x6a, 0x41, 0x35, 0x53, 0x6a, 0x6a, 0x4d, 0x7a, 0x30, 0x57, 0x32, 0x30, 0x68, 307 | 0x63, 0x4e, 0x2f, 0x6a, 0x75, 0x47, 0x49, 0x6a, 0x31, 0x37, 0x4e, 0x79, 0x79, 0x45, 0x35, 0x71, 308 | 0x39, 0x51, 0x6d, 0x36, 0x7a, 0x75, 0x43, 0x2f, 0x78, 0x42, 0x44, 0x45, 0x56, 0x44, 0x70, 0x44, 309 | 0x62, 0x78, 0x71, 0x33, 0x30, 0x5a, 0x79, 0x46, 0x6e, 0x70, 0x7a, 0x37, 0x6b, 0x32, 0x48, 0x73, 310 | 0x48, 0x54, 0x34, 0x6a, 0x7a, 0x47, 0x55, 0x73, 0x66, 0x4d, 0x4f, 0x30, 0x4a, 0x74, 0x55, 0x6d, 311 | 0x7a, 0x4c, 0x6e, 0x64, 0x6e, 0x53, 0x4c, 0x74, 0x71, 0x7a, 0x54, 0x4d, 0x47, 0x31, 0x72, 0x56, 312 | 0x48, 0x54, 0x37, 0x73, 0x6d, 0x6e, 0x38, 0x61, 0x51, 0x50, 0x38, 0x34, 0x6b, 0x63, 0x77, 0x66, 313 | 0x70, 0x53, 0x54, 0x42, 0x74, 0x43, 0x65, 0x43, 0x6c, 0x35, 0x56, 0x46, 0x71, 0x6e, 0x47, 0x61, 314 | 0x5a, 0x69, 0x36, 0x32, 0x35, 0x77, 0x33, 0x70, 0x6e, 0x34, 0x46, 0x37, 0x6a, 0x56, 0x2b, 0x33, 315 | 0x46, 0x39, 0x2f, 0x30, 0x4a, 0x6b, 0x41, 0x67, 0x45, 0x32, 0x49, 0x35, 0x41, 0x41, 0x41, 0x41, 316 | 0x41, 0x42, 0x4a, 0x52, 0x55, 0x35, 0x45, 0x72, 0x6b, 0x4a, 0x67, 0x67, 0x67, 0x3d, 0x3d, 0x27, 317 | 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 318 | 0x20, 0x20, 0x20, 0x74, 0x64, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 319 | 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x20, 0x31, 320 | 0x30, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 321 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6c, 0x20, 0x6c, 0x69, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 322 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x69, 323 | 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 324 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x72, 0x69, 0x67, 325 | 0x68, 0x74, 0x3a, 0x20, 0x34, 0x30, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 326 | 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x63, 0x72, 0x65, 0x65, 327 | 0x6e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x73, 328 | 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x3b, 329 | 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x34, 330 | 0x30, 0x70, 0x78, 0x3b, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 331 | 0x65, 0x66, 0x74, 0x3a, 0x20, 0x30, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 332 | 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x33, 0x32, 0x30, 0x70, 0x78, 0x3b, 333 | 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 334 | 0x3a, 0x20, 0x32, 0x34, 0x30, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 335 | 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 336 | 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x73, 0x69, 337 | 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x3b, 0x0d, 338 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x2d, 0x31, 339 | 0x32, 0x70, 0x78, 0x3b, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 340 | 0x65, 0x66, 0x74, 0x3a, 0x20, 0x30, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 341 | 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x34, 0x35, 0x70, 0x78, 0x3b, 0x0d, 342 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 343 | 0x20, 0x33, 0x31, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 344 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x20, 345 | 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x3c, 0x62, 0x6f, 0x64, 346 | 0x79, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 347 | 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 348 | 0x20, 0x20, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 349 | 0x20, 0x20, 0x20, 0x3c, 0x74, 0x72, 0x20, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 350 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 351 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 352 | 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 353 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x63, 0x6c, 0x61, 354 | 0x73, 0x73, 0x3d, 0x22, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, 355 | 0x22, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x73, 0x63, 356 | 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x62, 0x6d, 0x70, 0x22, 0x2f, 0x3e, 0x0d, 357 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 358 | 0x2f, 0x61, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 359 | 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 360 | 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 361 | 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 362 | 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 363 | 0x20, 0x3c, 0x75, 0x6c, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 364 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 365 | 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x4c, 0x65, 0x66, 0x74, 0x22, 0x3e, 0x3c, 0x64, 366 | 0x69, 0x76, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 367 | 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x3e, 368 | 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0d, 369 | 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 370 | 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 371 | 0x6f, 0x6e, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x74, 372 | 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x63, 0x6c, 0x61, 373 | 0x73, 0x73, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 374 | 0x76, 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 375 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 376 | 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x52, 0x69, 377 | 0x67, 0x68, 0x74, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 378 | 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 379 | 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x61, 380 | 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 381 | 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x75, 0x6c, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 382 | 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 383 | 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 384 | 0x20, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 385 | 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 386 | 0x0d, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, 0x0a, 387 | }; 388 | -------------------------------------------------------------------------------- /src/font.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) F4HWN Armel. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | const uint8_t stencilie8pt7bBitmaps[] PROGMEM = { 5 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xDF, 0xBF, 0x7E, 6 | 0xFD, 0xFF, 0xF7, 0xFE, 0xFF, 0x76, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 7 | 0xFF, 0xAF, 0x5C, 0x1D, 0x70, 0x75, 0xEB, 0xFE, 0xFF, 0xDF, 0x1D, 0x5C, 8 | 0xFD, 0xEA, 0xE3, 0xFE, 0xFF, 0xF7, 0xDF, 0x7D, 0xF7, 0xFF, 0xFF, 0xFE, 9 | 0xFF, 0x8E, 0xEF, 0xBF, 0xB7, 0x71, 0xFF, 0xFE, 0xFF, 0xF7, 0xEF, 0xFF, 10 | 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0x9F, 0x7E, 0xF9, 0xFB, 0xF7, 0xE7, 0xFE, 11 | 0xFF, 0xCF, 0xDF, 0xBF, 0x3E, 0xFD, 0xF3, 0xFE, 0xFF, 0xEF, 0x8F, 0xBF, 12 | 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x7C, 0x7D, 0xFF, 0xFF, 0xFE, 13 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFE, 0xFF, 0xFF, 0xFF, 0xFC, 14 | 0x7F, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 15 | 0xFF, 0xEF, 0xBE, 0xFB, 0xEF, 0xFF, 0xFE, 0xFF, 0x06, 0xED, 0xDB, 0xB7, 16 | 0x6E, 0xC1, 0xFE, 0xFF, 0xBF, 0xBF, 0x7E, 0xFD, 0xFB, 0xC1, 0xFE, 0xFF, 17 | 0x8E, 0xEF, 0xDF, 0x7D, 0xF7, 0xC1, 0xFE, 0xFF, 0x8F, 0xEF, 0xDE, 0x7F, 18 | 0x7E, 0xE3, 0xFE, 0xFF, 0x76, 0xED, 0xDC, 0x3F, 0x7E, 0xFD, 0xFE, 0xFF, 19 | 0x06, 0xFD, 0xFC, 0x7F, 0x6E, 0xE3, 0xFE, 0xFF, 0x8E, 0xED, 0xF8, 0x77, 20 | 0x6E, 0xE3, 0xFE, 0xFF, 0x07, 0xEF, 0xBE, 0xFB, 0xEF, 0xFF, 0xFE, 0xFF, 21 | 0x06, 0xED, 0xD8, 0x37, 0x6E, 0xC1, 0xFE, 0xFF, 0x8E, 0xED, 0xDC, 0x3F, 22 | 0x6E, 0xE3, 0xFE, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFE, 0xFF, 23 | 0xFF, 0xBF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFE, 0xFF, 0xEF, 0xBE, 0xFD, 0xFD, 24 | 0xFD, 0xFF, 0xFE, 0xFF, 0xFF, 0xFE, 0x3F, 0xF8, 0xFF, 0xFF, 0xFE, 0xFF, 25 | 0xBF, 0xBF, 0xBF, 0x7D, 0xF7, 0xFF, 0xFE, 0xFF, 0x9E, 0xDF, 0xBE, 0x7D, 26 | 0xFF, 0xF7, 0xFE, 0xFF, 0xDF, 0xAF, 0x81, 0xAB, 0xFB, 0xFB, 0xFF, 0xFF, 27 | 0xFF, 0x8E, 0xED, 0xD8, 0x37, 0x6E, 0xDD, 0xFE, 0xFF, 0x0E, 0xED, 0xD8, 28 | 0x77, 0x6E, 0xC3, 0xFE, 0xFF, 0x0E, 0xFD, 0xFB, 0xF7, 0xEF, 0xE3, 0xFE, 29 | 0xFF, 0x0E, 0xED, 0xDB, 0xB7, 0x6E, 0xC3, 0xFE, 0xFF, 0x06, 0xFD, 0xF8, 30 | 0x77, 0xEF, 0xC1, 0xFE, 0xFF, 0x06, 0xFD, 0xF8, 0x77, 0xEF, 0xDF, 0xFE, 31 | 0xFF, 0x8E, 0xED, 0xFB, 0xF6, 0x6E, 0xE3, 0xFE, 0xFF, 0x76, 0xED, 0xD8, 32 | 0x37, 0x6E, 0xDD, 0xFE, 0xFF, 0x07, 0xBF, 0x7E, 0xFD, 0xFB, 0xC1, 0xFE, 33 | 0xFF, 0x8F, 0xBF, 0x7E, 0xFD, 0xEB, 0xC7, 0xFE, 0xFF, 0x76, 0xDD, 0x79, 34 | 0xF9, 0xED, 0xDD, 0xFE, 0xFF, 0x7E, 0xFD, 0xFB, 0xF7, 0xEF, 0xC1, 0xFE, 35 | 0xFF, 0x76, 0x0D, 0x5B, 0xB7, 0x6E, 0xDD, 0xFE, 0xFF, 0x76, 0xEC, 0xDA, 36 | 0xB6, 0x6E, 0xDD, 0xFE, 0xFF, 0x8E, 0xED, 0xDB, 0xB7, 0x6E, 0xE3, 0xFE, 37 | 0xFF, 0x0E, 0xED, 0xD8, 0x77, 0xEF, 0xDF, 0xFE, 0xFF, 0x8E, 0xED, 0xDB, 38 | 0xB7, 0x70, 0xFF, 0xFE, 0xFF, 0x0E, 0xED, 0xD8, 0x77, 0x6E, 0xDD, 0xFE, 39 | 0xFF, 0x8E, 0xED, 0xFC, 0x7F, 0x6E, 0xE3, 0xFE, 0xFF, 0x07, 0xBF, 0x7E, 40 | 0xFD, 0xFB, 0xF7, 0xFE, 0xFF, 0x76, 0xED, 0xDB, 0xB7, 0x6E, 0xE3, 0xFE, 41 | 0xFF, 0x76, 0xED, 0xDB, 0xB7, 0x7F, 0xF7, 0xFE, 0xFF, 0x76, 0xED, 0xDB, 42 | 0xB5, 0x6A, 0xE3, 0xFE, 0xFF, 0x66, 0x5E, 0x7E, 0xF9, 0xF5, 0xD9, 0xFE, 43 | 0xFF, 0x76, 0xEF, 0xFE, 0xFD, 0xFB, 0xF7, 0xFE, 0xFF, 0x07, 0xEF, 0xBE, 44 | 0xFB, 0xEF, 0xC1, 0xFE, 0xFF, 0xE7, 0xDF, 0xBF, 0x7E, 0xFD, 0xF9, 0xFE, 45 | 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFE, 0xFF, 0x3F, 0x7E, 0xFD, 46 | 0xFB, 0xF7, 0xCF, 0xFE, 0xFF, 0xFF, 0xBE, 0xBF, 0xFF, 0xFF, 0xFF, 0xFE, 47 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 48 | 0x7F, 0xFF, 0xFF, 0xFE, 0xFF, 0x8E, 0xED, 0xD8, 0x37, 0x6E, 0xDD, 0xFE, 49 | 0xFF, 0x0E, 0xED, 0xD8, 0x77, 0x6E, 0xC3, 0xFE, 0xFF, 0x0E, 0xFD, 0xFB, 50 | 0xF7, 0xEF, 0xE3, 0xFE, 0xFF, 0x0E, 0xED, 0xDB, 0xB7, 0x6E, 0xC3, 0xFE, 51 | 0xFF, 0x06, 0xFD, 0xF8, 0x77, 0xEF, 0xC1, 0xFE, 0xFF, 0x06, 0xFD, 0xF8, 52 | 0x77, 0xEF, 0xDF, 0xFE, 0xFF, 0x8E, 0xED, 0xFB, 0xF6, 0x6E, 0xE3, 0xFE, 53 | 0xFF, 0x76, 0xED, 0xD8, 0x37, 0x6E, 0xDD, 0xFE, 0xFF, 0x07, 0xBF, 0x7E, 54 | 0xFD, 0xFB, 0xC1, 0xFE, 0xFF, 0x8F, 0xBF, 0x7E, 0xFD, 0xEB, 0xC7, 0xFE, 55 | 0xFF, 0x76, 0xDD, 0x79, 0xF9, 0xED, 0xDD, 0xFE, 0xFF, 0x7E, 0xFD, 0xFB, 56 | 0xF7, 0xEF, 0xC1, 0xFE, 0xFF, 0x76, 0x0D, 0x5B, 0xB7, 0x6E, 0xDD, 0xFE, 57 | 0xFF, 0x76, 0xEC, 0xDA, 0xB6, 0x6E, 0xDD, 0xFE, 0xFF, 0x8E, 0xED, 0xDB, 58 | 0xB7, 0x6E, 0xE3, 0xFE, 0xFF, 0x0E, 0xED, 0xD8, 0x77, 0xEF, 0xDF, 0xFE, 59 | 0xFF, 0x8E, 0xED, 0xDB, 0xB7, 0x70, 0xFF, 0xFE, 0xFF, 0x0E, 0xED, 0xD8, 60 | 0x77, 0x6E, 0xDD, 0xFE, 0xFF, 0x8E, 0xED, 0xFC, 0x7F, 0x6E, 0xE3, 0xFE, 61 | 0xFF, 0x07, 0xBF, 0x7E, 0xFD, 0xFB, 0xF7, 0xFE, 0xFF, 0x76, 0xED, 0xDB, 62 | 0xB7, 0x6E, 0xE3, 0xFE, 0xFF, 0x76, 0xED, 0xDB, 0xB7, 0x7F, 0xF7, 0xFE, 63 | 0xFF, 0x76, 0xED, 0xDB, 0xB5, 0x6A, 0xE3, 0xFE, 0xFF, 0x66, 0x5E, 0x7E, 64 | 0xF9, 0xF5, 0xD9, 0xFE, 0xFF, 0x76, 0xEF, 0xFE, 0xFD, 0xFB, 0xF7, 0xFE, 65 | 0xFF, 0x07, 0xEF, 0xBE, 0xFB, 0xEF, 0xC1, 0xFE, 0xFF, 0x9F, 0x7E, 0xF9, 66 | 0xFB, 0xF7, 0xE7, 0xFE, 0xFF, 0xDF, 0xBF, 0x7E, 0xFD, 0xFB, 0xF7, 0xFE, 67 | 0xFF, 0xCF, 0xDF, 0xBF, 0x3E, 0xFD, 0xF3, 0xFE, 0xFF, 0xFF, 0xFD, 0x5D, 68 | 0x7F, 0xFF, 0xFF, 0xFE }; 69 | 70 | const GFXglyph stencilie8pt7bGlyphs[] PROGMEM = { 71 | { 0, 7, 9, 8, 0, -8 }, // 0x20 ' ' 72 | { 8, 7, 9, 8, 0, -8 }, // 0x21 '!' 73 | { 16, 7, 9, 8, 0, -8 }, // 0x22 '"' 74 | { 24, 7, 9, 8, 0, -8 }, // 0x23 '#' 75 | { 32, 7, 9, 8, 0, -8 }, // 0x24 '$' 76 | { 40, 7, 9, 8, 0, -8 }, // 0x25 '%' 77 | { 48, 7, 9, 8, 0, -8 }, // 0x26 '&' 78 | { 56, 7, 9, 8, 0, -8 }, // 0x27 ''' 79 | { 64, 7, 9, 8, 0, -8 }, // 0x28 '(' 80 | { 72, 7, 9, 8, 0, -8 }, // 0x29 ')' 81 | { 80, 7, 9, 8, 0, -8 }, // 0x2A '*' 82 | { 88, 7, 9, 8, 0, -8 }, // 0x2B '+' 83 | { 96, 7, 9, 8, 0, -8 }, // 0x2C ',' 84 | { 104, 7, 9, 8, 0, -8 }, // 0x2D '-' 85 | { 112, 7, 8, 8, 0, -8 }, // 0x2E '.' 86 | { 119, 7, 9, 8, 0, -8 }, // 0x2F '/' 87 | { 127, 7, 9, 8, 0, -8 }, // 0x30 '0' 88 | { 135, 7, 9, 8, 0, -8 }, // 0x31 '1' 89 | { 143, 7, 9, 8, 0, -8 }, // 0x32 '2' 90 | { 151, 7, 9, 8, 0, -8 }, // 0x33 '3' 91 | { 159, 7, 9, 8, 0, -8 }, // 0x34 '4' 92 | { 167, 7, 9, 8, 0, -8 }, // 0x35 '5' 93 | { 175, 7, 9, 8, 0, -8 }, // 0x36 '6' 94 | { 183, 7, 9, 8, 0, -8 }, // 0x37 '7' 95 | { 191, 7, 9, 8, 0, -8 }, // 0x38 '8' 96 | { 199, 7, 9, 8, 0, -8 }, // 0x39 '9' 97 | { 207, 7, 9, 8, 0, -8 }, // 0x3A ':' 98 | { 215, 7, 9, 8, 0, -8 }, // 0x3B ';' 99 | { 223, 7, 9, 8, 0, -8 }, // 0x3C '<' 100 | { 231, 7, 9, 8, 0, -8 }, // 0x3D '=' 101 | { 239, 7, 9, 8, 0, -8 }, // 0x3E '>' 102 | { 247, 7, 9, 8, 0, -8 }, // 0x3F '?' 103 | { 255, 8, 9, 9, 0, -8 }, // 0x40 '@' 104 | { 264, 7, 9, 8, 0, -8 }, // 0x41 'A' 105 | { 272, 7, 9, 8, 0, -8 }, // 0x42 'B' 106 | { 280, 7, 9, 8, 0, -8 }, // 0x43 'C' 107 | { 288, 7, 9, 8, 0, -8 }, // 0x44 'D' 108 | { 296, 7, 9, 8, 0, -8 }, // 0x45 'E' 109 | { 304, 7, 9, 8, 0, -8 }, // 0x46 'F' 110 | { 312, 7, 9, 8, 0, -8 }, // 0x47 'G' 111 | { 320, 7, 9, 8, 0, -8 }, // 0x48 'H' 112 | { 328, 7, 9, 8, 0, -8 }, // 0x49 'I' 113 | { 336, 7, 9, 8, 0, -8 }, // 0x4A 'J' 114 | { 344, 7, 9, 8, 0, -8 }, // 0x4B 'K' 115 | { 352, 7, 9, 8, 0, -8 }, // 0x4C 'L' 116 | { 360, 7, 9, 8, 0, -8 }, // 0x4D 'M' 117 | { 368, 7, 9, 8, 0, -8 }, // 0x4E 'N' 118 | { 376, 7, 9, 8, 0, -8 }, // 0x4F 'O' 119 | { 384, 7, 9, 8, 0, -8 }, // 0x50 'P' 120 | { 392, 7, 9, 8, 0, -8 }, // 0x51 'Q' 121 | { 400, 7, 9, 8, 0, -8 }, // 0x52 'R' 122 | { 408, 7, 9, 8, 0, -8 }, // 0x53 'S' 123 | { 416, 7, 9, 8, 0, -8 }, // 0x54 'T' 124 | { 424, 7, 9, 8, 0, -8 }, // 0x55 'U' 125 | { 432, 7, 9, 8, 0, -8 }, // 0x56 'V' 126 | { 440, 7, 9, 8, 0, -8 }, // 0x57 'W' 127 | { 448, 7, 9, 8, 0, -8 }, // 0x58 'X' 128 | { 456, 7, 9, 8, 0, -8 }, // 0x59 'Y' 129 | { 464, 7, 9, 8, 0, -8 }, // 0x5A 'Z' 130 | { 472, 7, 9, 8, 0, -8 }, // 0x5B '[' 131 | { 480, 7, 9, 8, 0, -8 }, // 0x5C '\' 132 | { 488, 7, 9, 8, 0, -8 }, // 0x5D ']' 133 | { 496, 7, 9, 8, 0, -8 }, // 0x5E '^' 134 | { 504, 7, 9, 8, 0, -8 }, // 0x5F '_' 135 | { 512, 7, 9, 8, 0, -8 }, // 0x60 '`' 136 | { 520, 7, 9, 8, 0, -8 }, // 0x61 'a' 137 | { 528, 7, 9, 8, 0, -8 }, // 0x62 'b' 138 | { 536, 7, 9, 8, 0, -8 }, // 0x63 'c' 139 | { 544, 7, 9, 8, 0, -8 }, // 0x64 'd' 140 | { 552, 7, 9, 8, 0, -8 }, // 0x65 'e' 141 | { 560, 7, 9, 8, 0, -8 }, // 0x66 'f' 142 | { 568, 7, 9, 8, 0, -8 }, // 0x67 'g' 143 | { 576, 7, 9, 8, 0, -8 }, // 0x68 'h' 144 | { 584, 7, 9, 8, 0, -8 }, // 0x69 'i' 145 | { 592, 7, 9, 8, 0, -8 }, // 0x6A 'j' 146 | { 600, 7, 9, 8, 0, -8 }, // 0x6B 'k' 147 | { 608, 7, 9, 8, 0, -8 }, // 0x6C 'l' 148 | { 616, 7, 9, 8, 0, -8 }, // 0x6D 'm' 149 | { 624, 7, 9, 8, 0, -8 }, // 0x6E 'n' 150 | { 632, 7, 9, 8, 0, -8 }, // 0x6F 'o' 151 | { 640, 7, 9, 8, 0, -8 }, // 0x70 'p' 152 | { 648, 7, 9, 8, 0, -8 }, // 0x71 'q' 153 | { 656, 7, 9, 8, 0, -8 }, // 0x72 'r' 154 | { 664, 7, 9, 8, 0, -8 }, // 0x73 's' 155 | { 672, 7, 9, 8, 0, -8 }, // 0x74 't' 156 | { 680, 7, 9, 8, 0, -8 }, // 0x75 'u' 157 | { 688, 7, 9, 8, 0, -8 }, // 0x76 'v' 158 | { 696, 7, 9, 8, 0, -8 }, // 0x77 'w' 159 | { 704, 7, 9, 8, 0, -8 }, // 0x78 'x' 160 | { 712, 7, 9, 8, 0, -8 }, // 0x79 'y' 161 | { 720, 7, 9, 8, 0, -8 }, // 0x7A 'z' 162 | { 728, 7, 9, 8, 0, -8 }, // 0x7B '{' 163 | { 736, 7, 9, 8, 0, -8 }, // 0x7C '|' 164 | { 744, 7, 9, 8, 0, -8 }, // 0x7D '}' 165 | { 752, 7, 9, 8, 0, -8 } }; // 0x7E '~' 166 | 167 | const GFXfont stencilie8pt7b PROGMEM = { 168 | (uint8_t *)stencilie8pt7bBitmaps, 169 | (GFXglyph *)stencilie8pt7bGlyphs, 170 | 0x20, 0x7E, 9 }; 171 | 172 | // Approx. 1432 bytes 173 | 174 | const uint8_t stencilie16pt7bBitmaps[] PROGMEM = { 175 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 176 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 177 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 178 | 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 179 | 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0x3F, 180 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xF3, 0xF3, 0xCF, 181 | 0xCF, 0x3F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 182 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 183 | 0xFF, 0xFF, 0xFF, 0xFF, 0x33, 0xFC, 0xCF, 0xF3, 0x3F, 0xCC, 0xFC, 0x00, 184 | 0xF0, 0x03, 0xF3, 0x3F, 0xCC, 0xFC, 0x00, 0xF0, 0x03, 0xF3, 0x3F, 0xCC, 185 | 0xFF, 0x33, 0xFC, 0xCF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 186 | 0xCF, 0xFF, 0x3F, 0xF0, 0x1F, 0x80, 0x3C, 0xCC, 0xF3, 0x33, 0xC0, 0xFF, 187 | 0xC1, 0xFF, 0xCB, 0xFF, 0x33, 0xCC, 0xCF, 0x33, 0x3C, 0x00, 0xFC, 0x07, 188 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF9, 0xF3, 0xE7, 189 | 0x3F, 0xDC, 0xFF, 0xCF, 0xFF, 0x3F, 0xF3, 0xFF, 0xCF, 0xFC, 0xFB, 0xF3, 190 | 0xC7, 0xFF, 0x1F, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 191 | 0xFF, 0xFF, 0xF7, 0xFF, 0x03, 0xF8, 0x07, 0xCF, 0xCF, 0x3F, 0x3F, 0xE1, 192 | 0xFF, 0x8F, 0xFF, 0xCF, 0xFF, 0x3C, 0xFC, 0xF3, 0xF3, 0xC0, 0x1F, 0xC0, 193 | 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 194 | 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 195 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 196 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFC, 0x3F, 0xF3, 197 | 0xFF, 0xCF, 0xFF, 0x3F, 0xF8, 0xFF, 0xC3, 0xFF, 0x0F, 0xFC, 0x3F, 0xFC, 198 | 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x0F, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xF0, 199 | 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, 0x0F, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 200 | 0xFF, 0xC7, 0xFF, 0x0F, 0xFC, 0x3F, 0xF1, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 201 | 0xFF, 0xC3, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 202 | 0xF3, 0xFF, 0xCF, 0xFC, 0x0F, 0xF0, 0x3F, 0xF3, 0xFF, 0xCF, 0xFF, 0xFF, 203 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 204 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 205 | 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0x3F, 0xF0, 0x3F, 0xC0, 0xFF, 0xCF, 0xFF, 206 | 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 207 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 208 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 209 | 0xFF, 0xCF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 210 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 211 | 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 212 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 213 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 214 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 215 | 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFE, 0x3F, 0xF1, 0xFF, 0x8F, 0xFC, 0x7F, 216 | 0xE3, 0xFF, 0x1F, 0xF8, 0xFF, 0xC7, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 217 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xCF, 218 | 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 219 | 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0x00, 0xF0, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 220 | 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xF8, 0x7F, 0xDC, 0xFF, 0xF3, 0xFF, 0xCF, 221 | 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 222 | 0xFC, 0x00, 0xF0, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 223 | 0x03, 0xF8, 0x07, 0xC7, 0x8F, 0x3F, 0x3F, 0xFC, 0xFF, 0xE3, 0xFF, 0x1F, 224 | 0xF8, 0xFF, 0xC7, 0xFE, 0x3F, 0xF1, 0xFF, 0x8F, 0xFC, 0x00, 0xF0, 0x03, 225 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFE, 0x03, 0xF8, 0x07, 0xDF, 226 | 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFC, 0x1F, 0xF0, 0xFF, 0xFC, 0xFF, 227 | 0xF3, 0xFF, 0xCF, 0x7F, 0x3C, 0x01, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 228 | 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 229 | 0xF3, 0xF3, 0xE0, 0x0F, 0xC0, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 230 | 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 231 | 0x00, 0xF0, 0x03, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xE0, 0x3F, 232 | 0xC0, 0x7F, 0xFC, 0xFF, 0xF3, 0xCF, 0xCF, 0x3F, 0x3E, 0x01, 0xFC, 0x0F, 233 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x07, 0xCF, 234 | 0xCF, 0x3F, 0x3C, 0xFF, 0xF3, 0xFF, 0xC0, 0x3F, 0x00, 0x7C, 0xFC, 0xF3, 235 | 0xF3, 0xCF, 0xCF, 0x3F, 0x3E, 0x01, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 236 | 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xFF, 0xCF, 0xFE, 0x3F, 0xF1, 237 | 0xFF, 0x8F, 0xFC, 0x7F, 0xE3, 0xFF, 0x1F, 0xF8, 0xFF, 0xC7, 0xFF, 0x3F, 238 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 239 | 0x00, 0xF0, 0x03, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xC0, 0x0F, 240 | 0x00, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0x00, 0xF0, 0x03, 241 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x07, 0xCF, 242 | 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xE0, 0x0F, 0xC0, 0x3F, 0xFC, 0xFF, 243 | 0xF3, 0xCF, 0xCF, 0x3F, 0x3E, 0x01, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 244 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xF3, 0xFF, 0xFF, 245 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xF3, 246 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 247 | 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 248 | 0xFF, 0xFF, 0xCF, 0xFF, 0x3F, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 249 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xFF, 0x8F, 0xFC, 250 | 0x7F, 0xE3, 0xFF, 0x1F, 0xF8, 0xFF, 0xE3, 0xFF, 0xC7, 0xFF, 0x8F, 0xFF, 251 | 0x1F, 0xFE, 0x3F, 0xFC, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 252 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 253 | 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 254 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFE, 255 | 0x3F, 0xFC, 0x7F, 0xF8, 0xFF, 0xF1, 0xFF, 0xE3, 0xFF, 0xC7, 0xFF, 0x1F, 256 | 0xF8, 0xFF, 0xC7, 0xFE, 0x3F, 0xF1, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 257 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xF8, 0x1F, 0xCF, 258 | 0x3F, 0x3C, 0xFF, 0xF3, 0xFF, 0x8F, 0xFC, 0x7F, 0xF3, 0xFF, 0xCF, 0xFF, 259 | 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 260 | 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xF3, 0xFF, 0xCC, 0xFF, 0xCC, 0xFF, 261 | 0xC0, 0x03, 0xC0, 0x03, 0xCC, 0xCF, 0xCC, 0xCF, 0xFF, 0xCF, 0xFF, 0xCF, 262 | 0xFF, 0xCF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 263 | 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x07, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 264 | 0xF3, 0xF3, 0xC0, 0x0F, 0x00, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 265 | 0x3C, 0xFC, 0xF3, 0xF3, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 266 | 0x03, 0xF0, 0x07, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xC0, 0x1F, 267 | 0x00, 0xFC, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0x01, 0xF0, 0x0F, 268 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x07, 0xCF, 269 | 0xEF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 270 | 0xFF, 0xCF, 0xFF, 0x3F, 0xBE, 0x01, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 271 | 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0xF0, 0x07, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 272 | 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 273 | 0x3C, 0x01, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 274 | 0x00, 0xF0, 0x03, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xC0, 0x3F, 275 | 0x00, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0x00, 0xF0, 0x03, 276 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xCF, 277 | 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xC0, 0x3F, 0x00, 0xFC, 0xFF, 0xF3, 278 | 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 279 | 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x07, 0xCF, 0xCF, 0x3F, 0x3C, 0xFF, 280 | 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xE0, 0xF3, 0xC3, 0xCF, 0xCF, 0x3F, 281 | 0x3E, 0x01, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 282 | 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xC0, 0x0F, 283 | 0x00, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 284 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xFC, 285 | 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 286 | 0x3F, 0xFC, 0xFF, 0xF3, 0xFC, 0x00, 0xF0, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 287 | 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFC, 0x0F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 288 | 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xCC, 0xFF, 0x33, 289 | 0xFC, 0x0F, 0xF8, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 290 | 0xFC, 0xF3, 0xE3, 0xCF, 0x1F, 0x38, 0xFC, 0xC7, 0xF2, 0x3F, 0xC0, 0xFF, 291 | 0x07, 0xFC, 0x8F, 0xF3, 0x1F, 0xCE, 0x3F, 0x3C, 0x7C, 0xF8, 0xF3, 0xF3, 292 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 293 | 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 294 | 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0x00, 0xF0, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 295 | 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xF1, 0xE3, 0xC0, 0x0F, 0x00, 0x3C, 0x84, 296 | 0xF3, 0x33, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 297 | 0x3C, 0xFC, 0xF3, 0xF3, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 298 | 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x1F, 0x3C, 0x3C, 0xF0, 0x73, 0xC8, 0xCF, 299 | 0x31, 0x3C, 0xE0, 0xF3, 0xC3, 0xCF, 0x8F, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 300 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x07, 0xCF, 301 | 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 302 | 0xF3, 0xCF, 0xCF, 0x3F, 0x3E, 0x01, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 303 | 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0xF0, 0x07, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 304 | 0xF3, 0xF3, 0xC0, 0x1F, 0x00, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 305 | 0xFC, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 306 | 0x03, 0xF8, 0x07, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 307 | 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xE0, 0x1F, 0xC0, 0xFF, 0xFB, 0xFF, 0xFF, 308 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0xF0, 0x07, 0xCF, 309 | 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xC0, 0x1F, 0x00, 0xFC, 0xFC, 0xF3, 310 | 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xFF, 0xFF, 0xFF, 0xF0, 311 | 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x07, 0xCF, 0xCF, 0x3F, 0x3C, 0xFF, 312 | 0xF3, 0xFF, 0xE0, 0x3F, 0xC0, 0x7F, 0xFC, 0xF7, 0xF3, 0xCF, 0xCF, 0x3F, 313 | 0x3E, 0x01, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 314 | 0x00, 0xF0, 0x03, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 315 | 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 316 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xF3, 0xF3, 0xCF, 317 | 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 318 | 0xF3, 0xCF, 0xCF, 0x3F, 0x3E, 0x01, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 319 | 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 320 | 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xEF, 0xDF, 0xDE, 321 | 0xFF, 0x87, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 322 | 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 323 | 0x3F, 0x3C, 0xCC, 0xF3, 0x33, 0xCC, 0xCF, 0x33, 0x3E, 0x01, 0xFC, 0x0F, 324 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xF1, 0xC3, 0xC3, 325 | 0x1F, 0x80, 0xFF, 0x07, 0xFE, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0x8F, 0xFC, 326 | 0x1F, 0xE2, 0x3F, 0x8C, 0x7C, 0x70, 0xF3, 0xE3, 0xFF, 0xFF, 0xFF, 0xF0, 327 | 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFD, 328 | 0xFD, 0xEF, 0xF8, 0x7F, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 329 | 0xFF, 0xCF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 330 | 0x00, 0xF0, 0x03, 0xFF, 0xCF, 0xFE, 0x3F, 0xF1, 0xFF, 0x8F, 0xFC, 0x7F, 331 | 0xE3, 0xFF, 0x1F, 0xF8, 0xFF, 0xC7, 0xFF, 0x3F, 0xFC, 0x00, 0xF0, 0x03, 332 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xC3, 0xFF, 333 | 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 334 | 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF0, 0xFF, 0xC3, 0xFF, 0xFF, 0xFF, 0xF0, 335 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0x1F, 0xFE, 0x3F, 336 | 0xFC, 0x7F, 0xF8, 0xFF, 0xF1, 0xFF, 0xE3, 0xFF, 0xC7, 0xFF, 0x8F, 0xFF, 337 | 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 338 | 0x3F, 0xF0, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 339 | 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFC, 0x3F, 0xF0, 0xFF, 340 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xFC, 341 | 0xFF, 0xE1, 0xFF, 0x33, 0xF8, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 342 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 343 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 344 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 345 | 0xFC, 0x00, 0xF0, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 346 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0x3F, 0xFF, 0x3F, 347 | 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 348 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x07, 0xCF, 349 | 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xC0, 0x0F, 0x00, 0x3C, 0xFC, 0xF3, 350 | 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xFF, 0xFF, 0xFF, 0xF0, 351 | 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0xF0, 0x07, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 352 | 0xF3, 0xF3, 0xC0, 0x1F, 0x00, 0xFC, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 353 | 0x3C, 0x01, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 354 | 0x03, 0xF8, 0x07, 0xCF, 0xEF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 355 | 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xBE, 0x01, 0xFC, 0x0F, 356 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0xF0, 0x07, 0xCF, 357 | 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 358 | 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0x01, 0xF0, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 359 | 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 360 | 0xF3, 0xFF, 0xC0, 0x3F, 0x00, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 361 | 0xFC, 0x00, 0xF0, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 362 | 0x00, 0xF0, 0x03, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xC0, 0x3F, 363 | 0x00, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 364 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x07, 0xCF, 365 | 0xCF, 0x3F, 0x3C, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xE0, 0xF3, 366 | 0xC3, 0xCF, 0xCF, 0x3F, 0x3E, 0x01, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 367 | 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 368 | 0xF3, 0xF3, 0xC0, 0x0F, 0x00, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 369 | 0x3C, 0xFC, 0xF3, 0xF3, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 370 | 0x00, 0xF0, 0x03, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 371 | 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFC, 0x00, 0xF0, 0x03, 372 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFC, 0x0F, 0xFC, 373 | 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 374 | 0x3F, 0xCC, 0xFF, 0x33, 0xFC, 0x0F, 0xF8, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 375 | 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xF3, 0xE3, 0xCF, 0x1F, 0x38, 0xFC, 0xC7, 376 | 0xF2, 0x3F, 0xC0, 0xFF, 0x07, 0xFC, 0x8F, 0xF3, 0x1F, 0xCE, 0x3F, 0x3C, 377 | 0x7C, 0xF8, 0xF3, 0xF3, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 378 | 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 379 | 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0x00, 0xF0, 0x03, 380 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xF1, 0xE3, 0xC0, 381 | 0x0F, 0x00, 0x3C, 0x84, 0xF3, 0x33, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 382 | 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xFF, 0xFF, 0xFF, 0xF0, 383 | 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x1F, 0x3C, 0x3C, 384 | 0xF0, 0x73, 0xC8, 0xCF, 0x31, 0x3C, 0xE0, 0xF3, 0xC3, 0xCF, 0x8F, 0x3F, 385 | 0x3C, 0xFC, 0xF3, 0xF3, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 386 | 0x03, 0xF8, 0x07, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 387 | 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3E, 0x01, 0xFC, 0x0F, 388 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0x03, 0xF0, 0x07, 0xCF, 389 | 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xC0, 0x1F, 0x00, 0xFC, 0xFF, 0xF3, 390 | 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 391 | 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x07, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 392 | 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xE0, 0x1F, 0xC0, 393 | 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 394 | 0x03, 0xF0, 0x07, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xC0, 0x1F, 395 | 0x00, 0xFC, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 396 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x07, 0xCF, 397 | 0xCF, 0x3F, 0x3C, 0xFF, 0xF3, 0xFF, 0xE0, 0x3F, 0xC0, 0x7F, 0xFC, 0xF7, 398 | 0xF3, 0xCF, 0xCF, 0x3F, 0x3E, 0x01, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 399 | 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 400 | 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 401 | 0xFF, 0xCF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 402 | 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 403 | 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3E, 0x01, 0xFC, 0x0F, 404 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xF3, 0xF3, 0xCF, 405 | 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 0xF3, 406 | 0xF3, 0xEF, 0xDF, 0xDE, 0xFF, 0x87, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 407 | 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xFC, 408 | 0xF3, 0xF3, 0xCF, 0xCF, 0x3F, 0x3C, 0xCC, 0xF3, 0x33, 0xCC, 0xCF, 0x33, 409 | 0x3E, 0x01, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 410 | 0xF8, 0xF1, 0xC3, 0xC3, 0x1F, 0x80, 0xFF, 0x07, 0xFE, 0x3F, 0xFC, 0xFF, 411 | 0xF3, 0xFF, 0x8F, 0xFC, 0x1F, 0xE2, 0x3F, 0x8C, 0x7C, 0x70, 0xF3, 0xE3, 412 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xF3, 0xF3, 0xCF, 413 | 0xCF, 0x3F, 0x3C, 0xFD, 0xFD, 0xEF, 0xF8, 0x7F, 0xF3, 0xFF, 0xCF, 0xFF, 414 | 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 415 | 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF0, 0x03, 0xFF, 0xCF, 0xFE, 0x3F, 0xF1, 416 | 0xFF, 0x8F, 0xFC, 0x7F, 0xE3, 0xFF, 0x1F, 0xF8, 0xFF, 0xC7, 0xFF, 0x3F, 417 | 0xFC, 0x00, 0xF0, 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 418 | 0x0F, 0xFC, 0x3F, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xC3, 0xFF, 419 | 0x0F, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x0F, 0xFC, 0x3F, 420 | 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 421 | 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 422 | 0x3F, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 423 | 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, 0x0F, 0xFF, 0x3F, 0xFC, 0xFF, 0xF3, 424 | 0xFF, 0xCF, 0xFF, 0x0F, 0xFC, 0x3F, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFC, 425 | 0xFF, 0xC3, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 426 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xCC, 0xF1, 0x13, 0xE2, 0x3F, 427 | 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 428 | 0xFF, 0xFF, 0xFF, 0xF0 }; 429 | 430 | const GFXglyph stencilie16pt7bGlyphs[] PROGMEM = { 431 | { 0, 14, 18, 16, 0, -17 }, // 0x20 ' ' 432 | { 32, 14, 18, 16, 0, -17 }, // 0x21 '!' 433 | { 64, 14, 18, 16, 0, -17 }, // 0x22 '"' 434 | { 96, 14, 18, 16, 0, -17 }, // 0x23 '#' 435 | { 128, 14, 18, 16, 0, -17 }, // 0x24 '$' 436 | { 160, 14, 18, 16, 0, -17 }, // 0x25 '%' 437 | { 192, 14, 18, 16, 0, -17 }, // 0x26 '&' 438 | { 224, 14, 18, 16, 0, -17 }, // 0x27 ''' 439 | { 256, 14, 18, 16, 0, -17 }, // 0x28 '(' 440 | { 288, 14, 18, 16, 0, -17 }, // 0x29 ')' 441 | { 320, 14, 18, 16, 0, -17 }, // 0x2A '*' 442 | { 352, 14, 18, 16, 0, -17 }, // 0x2B '+' 443 | { 384, 14, 18, 16, 0, -17 }, // 0x2C ',' 444 | { 416, 14, 18, 16, 0, -17 }, // 0x2D '-' 445 | { 448, 14, 16, 16, 0, -17 }, // 0x2E '.' 446 | { 476, 14, 18, 16, 0, -17 }, // 0x2F '/' 447 | { 508, 14, 18, 16, 0, -17 }, // 0x30 '0' 448 | { 540, 14, 18, 16, 0, -17 }, // 0x31 '1' 449 | { 572, 14, 18, 16, 0, -17 }, // 0x32 '2' 450 | { 604, 14, 18, 16, 0, -17 }, // 0x33 '3' 451 | { 636, 14, 18, 16, 0, -17 }, // 0x34 '4' 452 | { 668, 14, 18, 16, 0, -17 }, // 0x35 '5' 453 | { 700, 14, 18, 16, 0, -17 }, // 0x36 '6' 454 | { 732, 14, 18, 16, 0, -17 }, // 0x37 '7' 455 | { 764, 14, 18, 16, 0, -17 }, // 0x38 '8' 456 | { 796, 14, 18, 16, 0, -17 }, // 0x39 '9' 457 | { 828, 14, 18, 16, 0, -17 }, // 0x3A ':' 458 | { 860, 14, 18, 16, 0, -17 }, // 0x3B ';' 459 | { 892, 14, 18, 16, 0, -17 }, // 0x3C '<' 460 | { 924, 14, 18, 16, 0, -17 }, // 0x3D '=' 461 | { 956, 14, 18, 16, 0, -17 }, // 0x3E '>' 462 | { 988, 14, 18, 16, 0, -17 }, // 0x3F '?' 463 | { 1020, 16, 18, 18, 0, -17 }, // 0x40 '@' 464 | { 1056, 14, 18, 16, 0, -17 }, // 0x41 'A' 465 | { 1088, 14, 18, 16, 0, -17 }, // 0x42 'B' 466 | { 1120, 14, 18, 16, 0, -17 }, // 0x43 'C' 467 | { 1152, 14, 18, 16, 0, -17 }, // 0x44 'D' 468 | { 1184, 14, 18, 16, 0, -17 }, // 0x45 'E' 469 | { 1216, 14, 18, 16, 0, -17 }, // 0x46 'F' 470 | { 1248, 14, 18, 16, 0, -17 }, // 0x47 'G' 471 | { 1280, 14, 18, 16, 0, -17 }, // 0x48 'H' 472 | { 1312, 14, 18, 16, 0, -17 }, // 0x49 'I' 473 | { 1344, 14, 18, 16, 0, -17 }, // 0x4A 'J' 474 | { 1376, 14, 18, 16, 0, -17 }, // 0x4B 'K' 475 | { 1408, 14, 18, 16, 0, -17 }, // 0x4C 'L' 476 | { 1440, 14, 18, 16, 0, -17 }, // 0x4D 'M' 477 | { 1472, 14, 18, 16, 0, -17 }, // 0x4E 'N' 478 | { 1504, 14, 18, 16, 0, -17 }, // 0x4F 'O' 479 | { 1536, 14, 18, 16, 0, -17 }, // 0x50 'P' 480 | { 1568, 14, 18, 16, 0, -17 }, // 0x51 'Q' 481 | { 1600, 14, 18, 16, 0, -17 }, // 0x52 'R' 482 | { 1632, 14, 18, 16, 0, -17 }, // 0x53 'S' 483 | { 1664, 14, 18, 16, 0, -17 }, // 0x54 'T' 484 | { 1696, 14, 18, 16, 0, -17 }, // 0x55 'U' 485 | { 1728, 14, 18, 16, 0, -17 }, // 0x56 'V' 486 | { 1760, 14, 18, 16, 0, -17 }, // 0x57 'W' 487 | { 1792, 14, 18, 16, 0, -17 }, // 0x58 'X' 488 | { 1824, 14, 18, 16, 0, -17 }, // 0x59 'Y' 489 | { 1856, 14, 18, 16, 0, -17 }, // 0x5A 'Z' 490 | { 1888, 14, 18, 16, 0, -17 }, // 0x5B '[' 491 | { 1920, 14, 18, 16, 0, -17 }, // 0x5C '\' 492 | { 1952, 14, 18, 16, 0, -17 }, // 0x5D ']' 493 | { 1984, 14, 18, 16, 0, -17 }, // 0x5E '^' 494 | { 2016, 14, 18, 16, 0, -17 }, // 0x5F '_' 495 | { 2048, 14, 18, 16, 0, -17 }, // 0x60 '`' 496 | { 2080, 14, 18, 16, 0, -17 }, // 0x61 'a' 497 | { 2112, 14, 18, 16, 0, -17 }, // 0x62 'b' 498 | { 2144, 14, 18, 16, 0, -17 }, // 0x63 'c' 499 | { 2176, 14, 18, 16, 0, -17 }, // 0x64 'd' 500 | { 2208, 14, 18, 16, 0, -17 }, // 0x65 'e' 501 | { 2240, 14, 18, 16, 0, -17 }, // 0x66 'f' 502 | { 2272, 14, 18, 16, 0, -17 }, // 0x67 'g' 503 | { 2304, 14, 18, 16, 0, -17 }, // 0x68 'h' 504 | { 2336, 14, 18, 16, 0, -17 }, // 0x69 'i' 505 | { 2368, 14, 18, 16, 0, -17 }, // 0x6A 'j' 506 | { 2400, 14, 18, 16, 0, -17 }, // 0x6B 'k' 507 | { 2432, 14, 18, 16, 0, -17 }, // 0x6C 'l' 508 | { 2464, 14, 18, 16, 0, -17 }, // 0x6D 'm' 509 | { 2496, 14, 18, 16, 0, -17 }, // 0x6E 'n' 510 | { 2528, 14, 18, 16, 0, -17 }, // 0x6F 'o' 511 | { 2560, 14, 18, 16, 0, -17 }, // 0x70 'p' 512 | { 2592, 14, 18, 16, 0, -17 }, // 0x71 'q' 513 | { 2624, 14, 18, 16, 0, -17 }, // 0x72 'r' 514 | { 2656, 14, 18, 16, 0, -17 }, // 0x73 's' 515 | { 2688, 14, 18, 16, 0, -17 }, // 0x74 't' 516 | { 2720, 14, 18, 16, 0, -17 }, // 0x75 'u' 517 | { 2752, 14, 18, 16, 0, -17 }, // 0x76 'v' 518 | { 2784, 14, 18, 16, 0, -17 }, // 0x77 'w' 519 | { 2816, 14, 18, 16, 0, -17 }, // 0x78 'x' 520 | { 2848, 14, 18, 16, 0, -17 }, // 0x79 'y' 521 | { 2880, 14, 18, 16, 0, -17 }, // 0x7A 'z' 522 | { 2912, 14, 18, 16, 0, -17 }, // 0x7B '{' 523 | { 2944, 14, 18, 16, 0, -17 }, // 0x7C '|' 524 | { 2976, 14, 18, 16, 0, -17 }, // 0x7D '}' 525 | { 3008, 14, 18, 16, 0, -17 } }; // 0x7E '~' 526 | 527 | const GFXfont stencilie16pt7b PROGMEM = { 528 | (uint8_t *)stencilie16pt7bBitmaps, 529 | (GFXglyph *)stencilie16pt7bGlyphs, 530 | 0x20, 0x7E, 18 }; 531 | 532 | // Approx. 3712 bytes 533 | 534 | const uint8_t YELLOWCRE8pt7bBitmaps[] PROGMEM = { 535 | 0x00, 0xFF, 0xFF, 0xCF, 0xDE, 0xF7, 0xB5, 0x00, 0x31, 0x86, 0x33, 0xFF, 536 | 0xFF, 0xF3, 0x18, 0x63, 0x3F, 0xFF, 0xFF, 0x31, 0x86, 0x30, 0x0C, 0x1F, 537 | 0xEF, 0xFF, 0x33, 0xCC, 0x3F, 0xE7, 0xFC, 0x33, 0xCC, 0xFF, 0xF7, 0xF8, 538 | 0x30, 0x01, 0x8E, 0x33, 0x6C, 0x6D, 0x87, 0x60, 0x0C, 0x03, 0x00, 0x6E, 539 | 0x1B, 0x63, 0x6C, 0xC7, 0x18, 0x00, 0x3C, 0x0F, 0xC3, 0x9C, 0x73, 0x87, 540 | 0xE0, 0x78, 0xDF, 0xBF, 0x3E, 0xC3, 0x9C, 0xFB, 0xFB, 0xBE, 0x30, 0xFF, 541 | 0xC0, 0x7F, 0xCC, 0xCC, 0xCC, 0xCC, 0xF7, 0xEF, 0x33, 0x33, 0x33, 0x33, 542 | 0xFE, 0x55, 0xDD, 0xF5, 0xD7, 0xDD, 0xD5, 0x00, 0x18, 0x18, 0x18, 0xFF, 543 | 0xFF, 0x18, 0x18, 0x18, 0xF6, 0xFF, 0xFF, 0xF0, 0x06, 0x0C, 0x30, 0x61, 544 | 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x00, 0x7F, 0xDF, 0xFF, 0x01, 0xE0, 545 | 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0xFF, 0xBF, 0xE0, 546 | 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 547 | 0x7F, 0xDF, 0xFF, 0x01, 0x80, 0x30, 0x06, 0xFF, 0xFF, 0xF6, 0x00, 0xC0, 548 | 0x18, 0x03, 0xFF, 0xBF, 0xF0, 0x7F, 0xDF, 0xFF, 0x01, 0x80, 0x30, 0x06, 549 | 0x3F, 0x87, 0xF0, 0x03, 0x00, 0x78, 0x0F, 0xFF, 0xBF, 0xE0, 0x01, 0x80, 550 | 0x70, 0x1E, 0x07, 0xC1, 0xD8, 0x73, 0x1C, 0x67, 0x0C, 0xFF, 0xFF, 0xFC, 551 | 0x06, 0x00, 0xC0, 0x7F, 0xDF, 0xFB, 0x00, 0x60, 0x0C, 0x01, 0xFF, 0x9F, 552 | 0xF8, 0x03, 0x00, 0x78, 0x0F, 0xFF, 0xBF, 0xE0, 0x7F, 0xDF, 0xFB, 0x00, 553 | 0x60, 0x0C, 0x01, 0xFF, 0xBF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0xFF, 0xBF, 554 | 0xE0, 0xFF, 0xFF, 0xFC, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 555 | 0x38, 0x0E, 0x03, 0x80, 0x60, 0x00, 0x7F, 0xDF, 0xFF, 0x01, 0xE0, 0x3C, 556 | 0x06, 0xFF, 0xBF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0xFF, 0xBF, 0xE0, 0x7F, 557 | 0xEF, 0xFF, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xFF, 0xF7, 0xFF, 0x00, 558 | 0x3C, 0x03, 0xFF, 0xF7, 0xFE, 0xF0, 0xF0, 0xF3, 0xD8, 0x06, 0x1C, 0x71, 559 | 0xC7, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x18, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 560 | 0xC0, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC7, 0x1C, 0x71, 0xC3, 0x00, 0x7F, 561 | 0xBF, 0xFC, 0x0C, 0x03, 0x00, 0xC7, 0xF3, 0xF8, 0xC0, 0x30, 0x00, 0x03, 562 | 0x00, 0xC0, 0x7F, 0xEF, 0xFF, 0xC0, 0x3C, 0xF3, 0xDF, 0xBD, 0x9B, 0xD9, 563 | 0xBD, 0xFF, 0xCF, 0xEC, 0x00, 0xFF, 0xF7, 0xFE, 0x7F, 0xEF, 0xFF, 0xC0, 564 | 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xFF, 0xFF, 0xFF, 0xC0, 0x3C, 0x03, 0xC0, 565 | 0x3C, 0x03, 0xFF, 0x8F, 0xFC, 0xC0, 0xCC, 0x0C, 0xFF, 0xEF, 0xFF, 0xC0, 566 | 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x00, 567 | 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0xFF, 0xBF, 568 | 0xF0, 0xFF, 0xEF, 0xFF, 0x30, 0x33, 0x03, 0x30, 0x33, 0x03, 0x30, 0x33, 569 | 0x03, 0x30, 0x33, 0x03, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0x00, 0x60, 570 | 0x0C, 0x01, 0xFF, 0x3F, 0xE6, 0x00, 0xC0, 0x18, 0x03, 0xFF, 0xBF, 0xF0, 571 | 0x7F, 0xFF, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0xFF, 0x3F, 0xE6, 0x00, 0xC0, 572 | 0x18, 0x03, 0x00, 0x60, 0x00, 0x7F, 0xEF, 0xFE, 0xC0, 0x0C, 0x00, 0xC0, 573 | 0x0C, 0xFE, 0xCF, 0xFC, 0x03, 0xC0, 0x3C, 0x03, 0xFF, 0xF7, 0xFE, 0xC0, 574 | 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0xFF, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 575 | 0x0F, 0x01, 0xE0, 0x30, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 576 | 0x18, 0x18, 0xFF, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 577 | 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0xFF, 0xBF, 0xE0, 0xC0, 0x78, 0x0F, 578 | 0x01, 0xE0, 0x7C, 0x1D, 0xFF, 0x3F, 0xF6, 0x07, 0xC0, 0x78, 0x0F, 0x01, 579 | 0xE0, 0x30, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 580 | 0xC0, 0x30, 0x0F, 0xFF, 0xFF, 0x7F, 0xFB, 0xFF, 0xFC, 0x30, 0xF0, 0xC3, 581 | 0xC3, 0x0F, 0x0C, 0x3C, 0x30, 0xF0, 0xC3, 0xC3, 0x0F, 0x0C, 0x3C, 0x30, 582 | 0xF0, 0xC3, 0x7F, 0xDF, 0xFF, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 583 | 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x30, 0x7F, 0xDF, 0xFF, 0x01, 0xE0, 584 | 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0xFF, 0xBF, 0xE0, 585 | 0x7F, 0xEF, 0xFF, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xFF, 0xFF, 0xFE, 586 | 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0x7F, 0xEF, 0xFF, 0xC0, 0x3C, 0x03, 587 | 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC6, 0x3C, 0x63, 0xFF, 0xF7, 0xFE, 588 | 0x06, 0x00, 0x60, 0x7F, 0xDF, 0xFF, 0x01, 0xE0, 0x3C, 0x07, 0xFF, 0xBF, 589 | 0xF6, 0x07, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x30, 0x7F, 0xCF, 0xFE, 0xC0, 590 | 0x6C, 0x00, 0xC0, 0x0F, 0xFE, 0x7F, 0xF0, 0x03, 0x00, 0x3C, 0x03, 0xFF, 591 | 0xF7, 0xFE, 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 592 | 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0xC0, 0x3C, 0x03, 0xC0, 593 | 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xFF, 594 | 0xF7, 0xFE, 0xC0, 0x3C, 0x03, 0x60, 0x66, 0x06, 0x30, 0xC3, 0x0C, 0x19, 595 | 0x81, 0x98, 0x0F, 0x00, 0xF0, 0x06, 0x00, 0x60, 0xC0, 0x3C, 0x03, 0xC6, 596 | 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xFF, 597 | 0xF7, 0xFE, 0xC0, 0x3E, 0x07, 0x70, 0xE3, 0x9C, 0x1F, 0x80, 0xF0, 0x0F, 598 | 0x01, 0xF8, 0x39, 0xC7, 0x0E, 0xE0, 0x7C, 0x03, 0xC0, 0x3E, 0x07, 0x70, 599 | 0xE3, 0x9C, 0x1F, 0x80, 0xF0, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 600 | 0x00, 0x60, 0xFF, 0xFF, 0xFC, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 601 | 0xE0, 0x38, 0x0E, 0x03, 0xFF, 0xFF, 0xF0, 0xFF, 0xF1, 0x8C, 0x63, 0x18, 602 | 0xC6, 0x3F, 0xF0, 0xC1, 0x81, 0x83, 0x03, 0x06, 0x06, 0x0C, 0x0C, 0x18, 603 | 0x18, 0x30, 0xFF, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xFF, 0xF0, 0x08, 0x0E, 604 | 0x0F, 0x8E, 0xEE, 0x3E, 0x0C, 0xFF, 0xFF, 0xFF, 0x40, 0xF7, 0x7F, 0xBB, 605 | 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 606 | 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 607 | 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 608 | 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 609 | 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 610 | 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 611 | 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 612 | 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 613 | 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 614 | 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 615 | 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 616 | 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 617 | 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 618 | 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 619 | 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 620 | 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 621 | 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 622 | 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 623 | 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 624 | 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 625 | 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 626 | 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 627 | 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 628 | 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 629 | 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 630 | 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 631 | 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 632 | 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 633 | 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 634 | 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 635 | 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 636 | 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 637 | 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 638 | 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 639 | 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 640 | 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 641 | 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 642 | 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 643 | 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 644 | 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 645 | 0xF1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 646 | 0x33, 0x3D, 0x9F, 0xEC, 0xF0, 0xF7, 0x7F, 0xBB, 0xF1, 0x99, 0x8C, 0xCC, 647 | 0x66, 0x63, 0x3F, 0x19, 0xF8, 0xCC, 0xC6, 0x66, 0x33, 0x3D, 0x9F, 0xEC, 648 | 0xF0, 0xFC, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x7E, 0xFF, 0xFF, 0xFF, 0xFC, 649 | 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x7E, 0x38, 0xDF, 0x7E, 0xFB, 0x1C }; 650 | 651 | const GFXglyph YELLOWCRE8pt7bGlyphs[] PROGMEM = { 652 | { 0, 1, 1, 5, 0, 0 }, // 0x20 ' ' 653 | { 1, 2, 12, 6, 3, -11 }, // 0x21 '!' 654 | { 4, 5, 5, 7, 1, -11 }, // 0x22 '"' 655 | { 8, 11, 10, 13, 1, -10 }, // 0x23 '#' 656 | { 22, 10, 12, 12, 1, -11 }, // 0x24 '$' 657 | { 37, 11, 12, 13, 1, -11 }, // 0x25 '%' 658 | { 54, 11, 12, 13, 1, -11 }, // 0x26 '&' 659 | { 71, 2, 5, 4, 1, -11 }, // 0x27 ''' 660 | { 73, 4, 12, 6, 1, -11 }, // 0x28 '(' 661 | { 79, 4, 12, 6, 1, -11 }, // 0x29 ')' 662 | { 85, 7, 7, 9, 1, -10 }, // 0x2A '*' 663 | { 92, 8, 8, 10, 1, -8 }, // 0x2B '+' 664 | { 100, 2, 4, 4, 1, -1 }, // 0x2C ',' 665 | { 101, 8, 2, 10, 1, -5 }, // 0x2D '-' 666 | { 103, 2, 2, 4, 1, -1 }, // 0x2E '.' 667 | { 104, 7, 12, 9, 1, -11 }, // 0x2F '/' 668 | { 115, 11, 12, 13, 1, -11 }, // 0x30 '0' 669 | { 132, 8, 12, 10, 1, -11 }, // 0x31 '1' 670 | { 144, 11, 12, 13, 1, -11 }, // 0x32 '2' 671 | { 161, 11, 12, 13, 1, -11 }, // 0x33 '3' 672 | { 178, 11, 12, 13, 1, -11 }, // 0x34 '4' 673 | { 195, 11, 12, 13, 1, -11 }, // 0x35 '5' 674 | { 212, 11, 12, 13, 1, -11 }, // 0x36 '6' 675 | { 229, 11, 12, 14, 2, -11 }, // 0x37 '7' 676 | { 246, 11, 12, 13, 1, -11 }, // 0x38 '8' 677 | { 263, 12, 12, 14, 1, -11 }, // 0x39 '9' 678 | { 281, 2, 6, 5, 2, -7 }, // 0x3A ':' 679 | { 283, 2, 7, 4, 1, -4 }, // 0x3B ';' 680 | { 285, 7, 11, 8, 0, -10 }, // 0x3C '<' 681 | { 295, 7, 6, 9, 1, -7 }, // 0x3D '=' 682 | { 301, 7, 11, 9, 1, -10 }, // 0x3E '>' 683 | { 311, 10, 12, 12, 1, -11 }, // 0x3F '?' 684 | { 326, 12, 12, 14, 1, -11 }, // 0x40 '@' 685 | { 344, 12, 12, 14, 1, -11 }, // 0x41 'A' 686 | { 362, 12, 12, 14, 1, -11 }, // 0x42 'B' 687 | { 380, 11, 12, 13, 1, -11 }, // 0x43 'C' 688 | { 397, 12, 12, 14, 1, -11 }, // 0x44 'D' 689 | { 415, 11, 12, 13, 1, -11 }, // 0x45 'E' 690 | { 432, 11, 12, 13, 1, -11 }, // 0x46 'F' 691 | { 449, 12, 12, 14, 1, -11 }, // 0x47 'G' 692 | { 467, 11, 12, 13, 1, -11 }, // 0x48 'H' 693 | { 484, 8, 12, 10, 1, -11 }, // 0x49 'I' 694 | { 496, 11, 12, 13, 1, -11 }, // 0x4A 'J' 695 | { 513, 11, 12, 13, 1, -11 }, // 0x4B 'K' 696 | { 530, 10, 12, 12, 1, -11 }, // 0x4C 'L' 697 | { 545, 14, 12, 15, 0, -11 }, // 0x4D 'M' 698 | { 566, 11, 12, 13, 1, -11 }, // 0x4E 'N' 699 | { 583, 11, 12, 13, 1, -11 }, // 0x4F 'O' 700 | { 600, 12, 12, 14, 1, -11 }, // 0x50 'P' 701 | { 618, 12, 14, 14, 1, -11 }, // 0x51 'Q' 702 | { 639, 11, 12, 13, 1, -11 }, // 0x52 'R' 703 | { 656, 12, 12, 14, 1, -11 }, // 0x53 'S' 704 | { 674, 12, 12, 14, 1, -11 }, // 0x54 'T' 705 | { 692, 12, 12, 14, 1, -11 }, // 0x55 'U' 706 | { 710, 12, 12, 14, 1, -11 }, // 0x56 'V' 707 | { 728, 12, 12, 14, 1, -11 }, // 0x57 'W' 708 | { 746, 12, 12, 14, 1, -11 }, // 0x58 'X' 709 | { 764, 12, 12, 14, 1, -11 }, // 0x59 'Y' 710 | { 782, 11, 12, 14, 2, -11 }, // 0x5A 'Z' 711 | { 799, 5, 12, 7, 1, -11 }, // 0x5B '[' 712 | { 807, 7, 12, 9, 1, -11 }, // 0x5C '\' 713 | { 818, 5, 12, 7, 1, -11 }, // 0x5D ']' 714 | { 826, 9, 6, 11, 1, -11 }, // 0x5E '^' 715 | { 833, 8, 2, 10, 1, 1 }, // 0x5F '_' 716 | { 835, 2, 5, 4, 1, -11 }, // 0x60 '`' 717 | { 837, 13, 12, 14, 0, -11 }, // 0x61 'a' 718 | { 857, 13, 12, 14, 0, -11 }, // 0x62 'b' 719 | { 877, 13, 12, 14, 0, -11 }, // 0x63 'c' 720 | { 897, 13, 12, 14, 0, -11 }, // 0x64 'd' 721 | { 917, 13, 12, 14, 0, -11 }, // 0x65 'e' 722 | { 937, 13, 12, 14, 0, -11 }, // 0x66 'f' 723 | { 957, 13, 12, 14, 0, -11 }, // 0x67 'g' 724 | { 977, 13, 12, 14, 0, -11 }, // 0x68 'h' 725 | { 997, 13, 12, 14, 0, -11 }, // 0x69 'i' 726 | { 1017, 13, 12, 14, 0, -11 }, // 0x6A 'j' 727 | { 1037, 13, 12, 14, 0, -11 }, // 0x6B 'k' 728 | { 1057, 13, 12, 14, 0, -11 }, // 0x6C 'l' 729 | { 1077, 13, 12, 14, 0, -11 }, // 0x6D 'm' 730 | { 1097, 13, 12, 14, 0, -11 }, // 0x6E 'n' 731 | { 1117, 13, 12, 14, 0, -11 }, // 0x6F 'o' 732 | { 1137, 13, 12, 14, 0, -11 }, // 0x70 'p' 733 | { 1157, 13, 12, 14, 0, -11 }, // 0x71 'q' 734 | { 1177, 13, 12, 14, 0, -11 }, // 0x72 'r' 735 | { 1197, 13, 12, 14, 0, -11 }, // 0x73 's' 736 | { 1217, 13, 12, 14, 0, -11 }, // 0x74 't' 737 | { 1237, 13, 12, 14, 0, -11 }, // 0x75 'u' 738 | { 1257, 13, 12, 14, 0, -11 }, // 0x76 'v' 739 | { 1277, 13, 12, 14, 0, -11 }, // 0x77 'w' 740 | { 1297, 13, 12, 14, 0, -11 }, // 0x78 'x' 741 | { 1317, 13, 12, 14, 0, -11 }, // 0x79 'y' 742 | { 1337, 13, 12, 14, 0, -11 }, // 0x7A 'z' 743 | { 1357, 5, 11, 6, 1, -10 }, // 0x7B '{' 744 | { 1364, 2, 12, 4, 1, -11 }, // 0x7C '|' 745 | { 1367, 5, 11, 6, 1, -10 }, // 0x7D '}' 746 | { 1374, 10, 4, 12, 1, -6 } }; // 0x7E '~' 747 | 748 | const GFXfont YELLOWCRE8pt7b PROGMEM = { 749 | (uint8_t *)YELLOWCRE8pt7bBitmaps, 750 | (GFXglyph *)YELLOWCRE8pt7bGlyphs, 751 | 0x20, 0x7E, 15 }; 752 | 753 | // Approx. 2051 bytes -------------------------------------------------------------------------------- /src/functions.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) F4HWN Armel. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | // Bluetooth callback 5 | void callbackBT(esp_spp_cb_event_t event, esp_spp_cb_param_t *param) 6 | { 7 | if (event == ESP_SPP_SRV_OPEN_EVT) 8 | { 9 | screensaver = millis(); 10 | M5.Lcd.wakeup(); 11 | Serial.println("Client Connected"); 12 | btConnected = true; 13 | } 14 | 15 | if (event == ESP_SPP_CLOSE_EVT) 16 | { 17 | M5.Lcd.sleep(); 18 | Serial.println("Client disconnected"); 19 | btConnected = false; 20 | } 21 | } 22 | 23 | // Print battery 24 | void viewBattery() { 25 | uint8_t batteryLevel; 26 | boolean batteryCharging; 27 | 28 | if(screensaverMode == 0) { 29 | // On left, view battery level 30 | batteryLevel = map(getBatteryLevel(1), 0, 100, 0, 16); 31 | batteryCharging = isCharging(); 32 | 33 | if(batteryLevel != batteryLevelOld || batteryCharging != batteryCharginglOld) { 34 | 35 | M5.Lcd.drawJpg(smeterTop, sizeof(smeterTop), 0, 0, 320, 20); 36 | 37 | //M5.Lcd.drawFastHLine(0, 20, 320, TFT_BLACK); 38 | 39 | batteryLevelOld = batteryLevel; 40 | batteryCharginglOld = batteryCharging; 41 | 42 | M5.Lcd.drawRect(294, 4, 20, 12, TFT_BLACK); 43 | M5.Lcd.drawRect(313, 7, 4, 6, TFT_BLACK); 44 | M5.Lcd.fillRect(296, 6, batteryLevel, 8, TFT_BLACK); 45 | 46 | if(batteryCharging) { 47 | M5.Lcd.setTextColor(TFT_BLACK); 48 | M5.Lcd.setFreeFont(0); 49 | M5.Lcd.setTextDatum(CC_DATUM); 50 | M5.Lcd.setTextPadding(0); 51 | M5.Lcd.drawString("+", 290, 11); 52 | } 53 | else { 54 | M5.Lcd.setTextColor(TFT_BLACK); 55 | M5.Lcd.setFreeFont(0); 56 | M5.Lcd.setTextDatum(CR_DATUM); 57 | M5.Lcd.setTextPadding(0); 58 | M5.Lcd.drawString(String(getBatteryLevel(1)) + "%", 290, 11); 59 | } 60 | } 61 | } 62 | } 63 | 64 | // View GUI 65 | void viewGUI() 66 | { 67 | M5.Lcd.drawJpg(smeterTop, sizeof(smeterTop), 0, 0, 320, 20); 68 | M5.Lcd.drawJpg(smeterMiddle, sizeof(smeterMiddle), 0, 20, 320, 140); 69 | M5.Lcd.drawJpg(smeterBottom, sizeof(smeterBottom), 0, 160, 320, 80); 70 | } 71 | 72 | void clearData() 73 | { 74 | angleOld = 0; 75 | 76 | batteryLevelOld = 0; 77 | optionOld = 5; 78 | 79 | filterOld = ""; 80 | modeOld = ""; 81 | valStringOld = ""; 82 | subValStringOld = ""; 83 | 84 | batteryCharginglOld = true; 85 | } 86 | 87 | // Manage rotation 88 | void rotate(uint16_t *x, uint16_t *y, float angle) 89 | { 90 | float xNew; 91 | float yNew; 92 | 93 | // Check that these are not null pointer 94 | assert(x); 95 | assert(y); 96 | 97 | angle = angle * PI / 180; 98 | 99 | xNew = *x * cos(angle) - *y * sin(angle); 100 | yNew = *x * sin(angle) + *y * cos(angle); 101 | 102 | *x = xNew; 103 | *y = yNew; 104 | } 105 | 106 | // Manage map float 107 | float mapFloat(float x, float in_min, float in_max, float out_min, float out_max) 108 | { 109 | return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; 110 | } 111 | 112 | // Print needle 113 | void needle(float_t angle, uint16_t a = 0, uint16_t b = 200, uint16_t c = 0, uint16_t d = 100) 114 | { 115 | uint16_t x, y; 116 | 117 | if (angle != angleOld) 118 | { 119 | angleOld = angle; 120 | 121 | x = a; 122 | y = b; 123 | 124 | rotate(&x, &y, angle); 125 | 126 | a = 160 + x; 127 | b = 220 - y; 128 | 129 | x = c; 130 | y = d; 131 | 132 | rotate(&x, &y, angle); 133 | 134 | c = 160 + x; 135 | d = 220 - y; 136 | 137 | M5.Lcd.drawJpg(smeterMiddle, sizeof(smeterMiddle), 0, 20, 320, 130); 138 | 139 | // M5.Lcd.drawFastHLine(0, 150, 320, TFT_BLACK); 140 | 141 | M5.Lcd.drawLine(a + 2, b, c + 3, d, TFT_NEDDLE_2); 142 | M5.Lcd.drawLine(a + 2, b, c + 2, d, TFT_NEDDLE_1); 143 | M5.Lcd.drawLine(a + 1, b, c + 1, d, TFT_RED); 144 | M5.Lcd.drawLine(a, b, c, d, TFT_RED); 145 | M5.Lcd.drawLine(a - 1, b, c - 1, d, TFT_RED); 146 | M5.Lcd.drawLine(a - 2, b, c - 2, d, TFT_NEDDLE_1); 147 | M5.Lcd.drawLine(a - 2, b, c - 3, d, TFT_NEDDLE_2); 148 | } 149 | } 150 | 151 | // Print value 152 | void value(String valString, uint8_t x = 160, uint8_t y = 180) 153 | { 154 | if (valString != valStringOld) 155 | { 156 | valStringOld = valString; 157 | 158 | M5.Lcd.setTextDatum(CC_DATUM); 159 | M5.Lcd.setFreeFont(&stencilie16pt7b); 160 | // M5.Lcd.setFreeFont(&YELLOWCRE8pt7b); 161 | M5.Lcd.setTextPadding(190); 162 | M5.Lcd.setTextColor(TFT_BLACK, TFT_BACK); 163 | valString.replace(".", ","); 164 | M5.Lcd.drawString(valString, x, y); 165 | } 166 | } 167 | 168 | // Print sub value 169 | void subValue(String valString, uint8_t x = 160, uint8_t y = 205) 170 | { 171 | if (valString != subValStringOld) 172 | { 173 | subValStringOld = valString; 174 | 175 | M5.Lcd.setTextDatum(CC_DATUM); 176 | // M5.Lcd.setFreeFont(&stencilie16pt7b); 177 | M5.Lcd.setFreeFont(&YELLOWCRE8pt7b); 178 | M5.Lcd.setTextPadding(140); 179 | M5.Lcd.setTextColor(TFT_BLACK, TFT_BACK); 180 | // valString.replace(".", ","); 181 | M5.Lcd.drawString(valString, x, y); 182 | } 183 | } 184 | 185 | // Print option 186 | void viewMenu() 187 | { 188 | uint16_t i = 65; 189 | uint8_t j; 190 | 191 | if(option != optionOld) { 192 | optionOld = option; 193 | 194 | M5.Lcd.setTextDatum(CC_DATUM); 195 | M5.Lcd.setFreeFont(&YELLOWCRE8pt7b); 196 | M5.Lcd.setTextPadding(0); 197 | 198 | for (j = 0; j <= 2; j++) 199 | { 200 | if (option == j) 201 | { 202 | M5.Lcd.setTextColor(TFT_BLACK); 203 | reset = true; 204 | } 205 | else 206 | { 207 | M5.Lcd.setTextColor(TFT_DARKGREY); 208 | } 209 | 210 | M5.Lcd.drawString(menu[j], i, 230); 211 | i += 95; 212 | } 213 | } 214 | } 215 | 216 | // Print baseline 217 | void viewBaseline(uint8_t alternance) 218 | { 219 | if(btnL || btnR) 220 | { 221 | M5.Lcd.setTextDatum(CC_DATUM); 222 | M5.Lcd.setFreeFont(0); 223 | M5.Lcd.setTextPadding(160); 224 | M5.Lcd.setTextColor(TFT_DARKGREY, TFT_BACK); 225 | M5.Lcd.drawString("Brightness " + String(map(brightness, 1, 254, 1, 100)) + "%", 160, 160); 226 | } 227 | else { 228 | if (alternance > 20 && WiFi.status() == WL_CONNECTED) 229 | { 230 | M5.Lcd.setTextDatum(CC_DATUM); 231 | M5.Lcd.setFreeFont(0); 232 | M5.Lcd.setTextPadding(160); 233 | M5.Lcd.setTextColor(TFT_DARKGREY, TFT_BACK); 234 | M5.Lcd.drawString(String(WiFi.localIP().toString().c_str()), 160, 160); 235 | } 236 | else 237 | { 238 | M5.Lcd.setTextDatum(CC_DATUM); 239 | M5.Lcd.setFreeFont(0); 240 | M5.Lcd.setTextPadding(160); 241 | M5.Lcd.setTextColor(TFT_DARKGREY, TFT_BACK); 242 | M5.Lcd.drawString(String(NAME) + " V" + String(VERSION) + " by " + String(AUTHOR), 160, 160); 243 | } 244 | } 245 | } 246 | 247 | // List files on SPIFFS or SD 248 | void getBinaryList(File dir, String type) 249 | { 250 | while (true) 251 | { 252 | File entry = dir.openNextFile(); 253 | if (!entry) 254 | { 255 | // no more files 256 | break; 257 | } 258 | 259 | if (strstr(entry.name(), "/.") == NULL && strstr(entry.name(), ".bin") != NULL) 260 | { 261 | //Serial.println(type + "_" + entry.name()); 262 | binFilename[binIndex] = type + "_" + entry.name(); 263 | binIndex++; 264 | } 265 | 266 | if (entry.isDirectory() && strstr(entry.name(), "/.") == NULL) 267 | { 268 | getBinaryList(entry, type); 269 | } 270 | 271 | entry.close(); 272 | } 273 | } 274 | 275 | // Bin Loader 276 | void binLoader() 277 | { 278 | boolean click = 0; 279 | int8_t cursor = 0; 280 | int8_t start = 0; 281 | int8_t stop = 0; 282 | int8_t limit = 8; 283 | int8_t change = 255; 284 | String tmpName; 285 | 286 | if (!SPIFFS.begin()) 287 | { 288 | Serial.println("SPIFFS Mount Failed"); 289 | 290 | M5.Lcd.setTextFont(1); 291 | M5.Lcd.setTextSize(2); 292 | 293 | M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK); 294 | M5.Lcd.setTextDatum(CC_DATUM); 295 | M5.Lcd.drawString("Flash File System", 160, 20); 296 | M5.Lcd.drawString("needs to be formated.", 160, 50); 297 | M5.Lcd.drawString("It takes around 4 minutes.", 160, 100); 298 | M5.Lcd.drawString("Please, wait until ", 160, 150); 299 | M5.Lcd.drawString("the application starts !", 160, 180); 300 | 301 | Serial.println("SPIFFS Formating..."); 302 | 303 | SPIFFS.format(); // Format SPIFFS... 304 | 305 | M5.Lcd.setTextFont(0); 306 | M5.Lcd.setTextSize(0); 307 | 308 | return; 309 | } 310 | 311 | root = SPIFFS.open("/"); 312 | getBinaryList(root, "SP"); 313 | 314 | 315 | if (SD.begin()) { 316 | root = SD.open("/"); 317 | getBinaryList(root, "SD"); 318 | } 319 | 320 | if (binIndex != 0) 321 | { 322 | M5.Lcd.setTextFont(1); 323 | M5.Lcd.setTextSize(1); 324 | 325 | M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK); 326 | M5.Lcd.setTextDatum(CC_DATUM); 327 | 328 | for (uint8_t i = TIMEOUT_BIN_LOADER * 10; i > 0; i--) 329 | { 330 | getButton(); 331 | 332 | if (i % 10 == 0) 333 | { 334 | tmpName += "."; 335 | M5.Lcd.drawString(tmpName, 160, 20); 336 | } 337 | 338 | if (btnA || btnC) 339 | { 340 | SD.end(); // If not Bluetooth doesn't work !!! 341 | return; 342 | } 343 | else if (btnB) 344 | { 345 | click = 1; 346 | break; 347 | } 348 | 349 | vTaskDelay(100); 350 | } 351 | } 352 | 353 | while (click == 1) 354 | { 355 | while (btnB != 0) 356 | { 357 | getButton(); 358 | vTaskDelay(100); 359 | } 360 | 361 | M5.Lcd.setTextFont(1); 362 | M5.Lcd.setTextSize(2); 363 | 364 | M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK); 365 | M5.Lcd.setTextDatum(CC_DATUM); 366 | M5.Lcd.drawString("Bin Loader V0.2", 160, 20); 367 | 368 | getButton(); 369 | 370 | if (btnA) 371 | { 372 | cursor--; 373 | } 374 | else if (btnC) 375 | { 376 | cursor++; 377 | } 378 | else if (btnB) 379 | { 380 | if(binFilename[cursor].substring(0, 4) == "SP_/") { 381 | updateFromFS(SPIFFS, binFilename[cursor].substring(3)); 382 | } 383 | else { 384 | updateFromFS(SD, binFilename[cursor].substring(3)); 385 | } 386 | ESP.restart(); 387 | } 388 | 389 | cursor = (cursor < 0) ? binIndex - 1 : cursor; 390 | cursor = (cursor > binIndex - 1) ? 0 : cursor; 391 | 392 | start = cursor / limit; 393 | 394 | stop = (start * limit) + limit; 395 | 396 | /* 397 | Serial.print(cursor); 398 | Serial.print("-"); 399 | Serial.print(start); 400 | Serial.print("-"); 401 | Serial.print(stop); 402 | Serial.println("----------"); 403 | */ 404 | 405 | if (change != cursor) 406 | { 407 | change = cursor; 408 | M5.Lcd.setTextPadding(320); 409 | 410 | uint8_t i = 0; 411 | for (uint8_t j = (start * limit); j < stop; j++) 412 | { 413 | tmpName = binFilename[j].substring(4); 414 | 415 | if (cursor == j) 416 | { 417 | tmpName = ">> " + tmpName + " <<"; 418 | 419 | if(binFilename[cursor].substring(0, 4) == "SP_/") { 420 | M5.Lcd.setTextSize(1); 421 | M5.Lcd.drawString("SPI Flash File Storage", 160, 50); 422 | } 423 | else { 424 | M5.Lcd.setTextSize(1); 425 | M5.Lcd.drawString("SD Card Storage", 160, 50); 426 | } 427 | } 428 | 429 | M5.Lcd.setTextSize(2); 430 | M5.Lcd.drawString(tmpName, 160, 80 + i * 20); 431 | i++; 432 | } 433 | } 434 | vTaskDelay(100); 435 | } 436 | SD.end(); // If not Bluetooth doesn't work !!! 437 | } 438 | 439 | // Send CI-V Command 440 | void sendCommand(char *request, size_t n, char *buffer, uint8_t limit) 441 | { 442 | uint8_t byte1, byte2, byte3; 443 | uint8_t counter = 0; 444 | 445 | while (counter != limit) 446 | { 447 | for (uint8_t i = 0; i < n; i++) 448 | { 449 | CAT.write(request[i]); 450 | } 451 | 452 | vTaskDelay(100); 453 | 454 | while (CAT.available()) 455 | { 456 | byte1 = CAT.read(); 457 | byte2 = CAT.read(); 458 | 459 | if (byte1 == 0xFE && byte2 == 0xFE) 460 | { 461 | counter = 0; 462 | byte3 = CAT.read(); 463 | while (byte3 != 0xFD) 464 | { 465 | buffer[counter] = byte3; 466 | byte3 = CAT.read(); 467 | counter++; 468 | if (counter > limit) 469 | { 470 | //Serial.print(" Overflow"); 471 | break; 472 | } 473 | } 474 | } 475 | } 476 | vTaskDelay(10); 477 | } 478 | //Serial.println(" Ok"); 479 | } 480 | 481 | // Get Smeter 482 | void getSmeter() 483 | { 484 | String valString; 485 | 486 | char str[2]; 487 | char buffer[6]; 488 | char request[] = {0xFE, 0xFE, IC705_CI_V_ADDRESS, 0xE0, 0x15, 0x02, 0xFD}; 489 | 490 | uint8_t val0 = 0; 491 | float_t val1 = 0; 492 | static uint8_t val2 = 0; 493 | 494 | float_t angle = 0; 495 | 496 | size_t n = sizeof(request) / sizeof(request[0]); 497 | 498 | sendCommand(request, n, buffer, 6); 499 | 500 | sprintf(str, "%02x%02x", buffer[4], buffer[5]); 501 | val0 = atoi(str); 502 | 503 | if (val0 <= 120) 504 | { // 120 = S9 = 9 * (40/3) 505 | val1 = val0 / (40 / 3.0f); 506 | } 507 | else 508 | { // 240 = S9 + 60 509 | val1 = (val0 - 120) / 2.0f; 510 | } 511 | 512 | if (abs(val0 - val2) > 1 || reset == true) 513 | { 514 | val2 = val0; 515 | reset = false; 516 | 517 | if (val0 <= 13) 518 | { 519 | angle = 42.50f; 520 | valString = "S " + String(int(round(val1))); 521 | } 522 | else if (val0 <= 120) 523 | { 524 | angle = mapFloat(val0, 14, 120, 42.50f, -6.50f); // SMeter image start at S1 so S0 is out of image on the left... 525 | valString = "S " + String(int(round(val1))); 526 | } 527 | else 528 | { 529 | angle = mapFloat(val0, 121, 241, -6.50f, -43.0f); 530 | valString = "S 9 + " + String(int(round(val1))) + " dB"; 531 | } 532 | 533 | // Debug trace 534 | /* 535 | Serial.print("Get S"); 536 | Serial.print(val0); 537 | Serial.print(" "); 538 | Serial.print(val1); 539 | Serial.print(" "); 540 | Serial.println(angle); 541 | */ 542 | 543 | // Draw line 544 | needle(angle); 545 | 546 | // Write Value 547 | value(valString); 548 | } 549 | } 550 | 551 | // Get SWR 552 | void getSWR() 553 | { 554 | String valString; 555 | 556 | char str[2]; 557 | char buffer[6]; 558 | char request[] = {0xFE, 0xFE, IC705_CI_V_ADDRESS, 0xE0, 0x15, 0x12, 0xFD}; 559 | 560 | uint8_t val0 = 0; 561 | float_t val1 = 0; 562 | static uint8_t val3 = 0; 563 | 564 | float_t angle = 0; 565 | 566 | size_t n = sizeof(request) / sizeof(request[0]); 567 | 568 | sendCommand(request, n, buffer, 6); 569 | 570 | sprintf(str, "%02x%02x", buffer[4], buffer[5]); 571 | val0 = atoi(str); 572 | 573 | if (val0 != val3 || reset == true) 574 | { 575 | val3 = val0; 576 | reset = false; 577 | 578 | if (val0 <= 48) 579 | { 580 | angle = mapFloat(val0, 0, 48, 42.50f, 32.50f); 581 | val1 = mapFloat(val0, 0, 48, 1.0, 1.5); 582 | } 583 | else if (val0 <= 80) 584 | { 585 | angle = mapFloat(val0, 49, 80, 32.50f, 24.0f); 586 | val1 = mapFloat(val0, 49, 80, 1.5, 2.0); 587 | } 588 | else if (val0 <= 120) 589 | { 590 | angle = mapFloat(val0, 81, 120, 24.0f, 10.0f); 591 | val1 = mapFloat(val0, 81, 120, 2.0, 3.0); 592 | } 593 | else if (val0 <= 155) 594 | { 595 | angle = mapFloat(val0, 121, 155, 10.0f, 0.0f); 596 | val1 = mapFloat(val0, 121, 155, 3.0, 4.0); 597 | } 598 | else if (val0 <= 175) 599 | { 600 | angle = mapFloat(val0, 156, 175, 0.0f, -7.0f); 601 | val1 = mapFloat(val0, 156, 175, 4.0, 5.0); 602 | } 603 | else if (val0 <= 225) 604 | { 605 | angle = mapFloat(val0, 176, 225, -7.0f, -19.0f); 606 | val1 = mapFloat(val0, 176, 225, 5.0, 10.0); 607 | } 608 | else 609 | { 610 | angle = mapFloat(val0, 226, 255, -19.0f, -30.50f); 611 | val1 = mapFloat(val0, 226, 255, 10.0, 50.0); 612 | } 613 | 614 | valString = "SWR " + String(val1); 615 | 616 | // Debug trace 617 | /* 618 | Serial.print("Get SWR"); 619 | Serial.print(val0); 620 | Serial.print(" "); 621 | Serial.print(val1); 622 | Serial.print(" "); 623 | Serial.println(angle); 624 | */ 625 | 626 | // Draw line 627 | needle(angle); 628 | 629 | // Write Value 630 | value(valString); 631 | } 632 | } 633 | 634 | // Get Power 635 | void getPower() 636 | { 637 | String valString; 638 | 639 | char str[2]; 640 | char buffer[6]; 641 | char request[] = {0xFE, 0xFE, IC705_CI_V_ADDRESS, 0xE0, 0x15, 0x11, 0xFD}; 642 | 643 | uint8_t val0 = 0; 644 | float_t val1 = 0; 645 | float_t val2 = 0; 646 | static uint8_t val3 = 0; 647 | 648 | float_t angle = 0; 649 | 650 | size_t n = sizeof(request) / sizeof(request[0]); 651 | 652 | sendCommand(request, n, buffer, 6); 653 | 654 | sprintf(str, "%02x%02x", buffer[4], buffer[5]); 655 | val0 = atoi(str); 656 | 657 | if (val0 != val3 || reset == true) 658 | { 659 | val3 = val0; 660 | reset = false; 661 | 662 | if (val0 <= 27) 663 | { 664 | angle = mapFloat(val0, 0, 27, 42.50f, 30.50f); 665 | val1 = mapFloat(val0, 0, 27, 0, 0.5); 666 | } 667 | else if (val0 <= 49) 668 | { 669 | angle = mapFloat(val0, 28, 49, 30.50f, 23.50f); 670 | val1 = mapFloat(val0, 28, 49, 0.5, 1.0); 671 | } 672 | else if (val0 <= 78) 673 | { 674 | angle = mapFloat(val0, 50, 78, 23.50f, 14.50f); 675 | val1 = mapFloat(val0, 50, 78, 1.0, 2.0); 676 | } 677 | else if (val0 <= 104) 678 | { 679 | angle = mapFloat(val0, 79, 104, 14.50f, 6.30f); 680 | val1 = mapFloat(val0, 79, 104, 2.0, 3.0); 681 | } 682 | else if (val0 <= 143) 683 | { 684 | angle = mapFloat(val0, 105, 143, 6.30f, -6.50f); 685 | val1 = mapFloat(val0, 105, 143, 3.0, 5.0); 686 | } 687 | else if (val0 <= 175) 688 | { 689 | angle = mapFloat(val0, 144, 175, -6.50f, -17.50f); 690 | val1 = mapFloat(val0, 144, 175, 5.0, 7.0); 691 | } 692 | else 693 | { 694 | angle = mapFloat(val0, 176, 226, -17.50f, -30.50f); 695 | val1 = mapFloat(val0, 176, 226, 7.0, 10.0); 696 | } 697 | 698 | val2 = round(val1 * 10); 699 | valString = "PWR " + String((val2 / 10)) + " W"; 700 | 701 | // Debug trace 702 | /* 703 | Serial.print("Get PWR"); 704 | Serial.print(val0); 705 | Serial.print(" "); 706 | Serial.print(val1); 707 | Serial.print(" "); 708 | Serial.println(angle); 709 | */ 710 | 711 | // Draw line 712 | needle(angle); 713 | 714 | // Write Value 715 | value(valString); 716 | } 717 | } 718 | 719 | // Get Data Mode 720 | void getDataMode() 721 | { 722 | char buffer[6]; 723 | char request[] = {0xFE, 0xFE, IC705_CI_V_ADDRESS, 0xE0, 0x1A, 0x06, 0xFD}; 724 | 725 | size_t n = sizeof(request) / sizeof(request[0]); 726 | 727 | sendCommand(request, n, buffer, 6); 728 | 729 | //Serial.print("Get Data"); 730 | 731 | dataMode = buffer[4]; 732 | } 733 | 734 | // Get Frequency 735 | void getFrequency() 736 | { 737 | String valString; 738 | 739 | char buffer[8]; 740 | char request[] = {0xFE, 0xFE, IC705_CI_V_ADDRESS, 0xE0, 0x03, 0xFD}; 741 | 742 | String val0; 743 | String val1; 744 | String val2; 745 | 746 | uint32_t frequency; // Current frequency in Hz 747 | const uint32_t decMulti[] = {1000000000, 100000000, 10000000, 1000000, 100000, 10000, 1000, 100, 10, 1}; 748 | 749 | uint8_t lenght = 0; 750 | 751 | size_t n = sizeof(request) / sizeof(request[0]); 752 | 753 | sendCommand(request, n, buffer, 8); 754 | 755 | frequency = 0; 756 | for (uint8_t i = 2; i < 7; i++) 757 | { 758 | frequency += (buffer[9 - i] >> 4) * decMulti[(i - 2) * 2]; 759 | frequency += (buffer[9 - i] & 0x0F) * decMulti[(i - 2) * 2 + 1]; 760 | } 761 | 762 | valString = String(frequency); 763 | lenght = valString.length(); 764 | val0 = valString.substring(lenght - 3, lenght); 765 | val1 = valString.substring(lenght - 6, lenght - 3); 766 | val2 = valString.substring(0, lenght - 6); 767 | 768 | subValue(val2 + "." + val1 + "." + val0); 769 | 770 | //Serial.print("Get frequency"); 771 | 772 | } 773 | 774 | // Get Mode 775 | void getMode() 776 | { 777 | String valString; 778 | 779 | char buffer[5]; 780 | char request[] = {0xFE, 0xFE, IC705_CI_V_ADDRESS, 0xE0, 0x04, 0xFD}; 781 | 782 | const char *mode[] = {"LSB", "USB", "AM", "CW", "RTTY", "FM", "WFM", "CW-R", "RTTY-R", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "DV"}; 783 | 784 | size_t n = sizeof(request) / sizeof(request[0]); 785 | 786 | sendCommand(request, n, buffer, 5); 787 | 788 | M5.Lcd.setFreeFont(0); 789 | M5.Lcd.setTextPadding(24); 790 | M5.Lcd.setTextColor(TFT_WHITE); 791 | M5.Lcd.setTextDatum(CC_DATUM); 792 | 793 | valString = "FIL" + String(uint8_t(buffer[4])); 794 | if (valString != filterOld) 795 | { 796 | filterOld = valString; 797 | M5.Lcd.fillRoundRect(44, 199, 44, 13, 2, TFT_MODE); 798 | M5.Lcd.drawString(valString, 66, 206); 799 | } 800 | 801 | valString = String(mode[(uint8_t)buffer[3]]); 802 | 803 | getDataMode(); // Data ON or OFF ? 804 | 805 | if (dataMode == 1) 806 | { 807 | valString += "-D"; 808 | } 809 | if (valString != modeOld) 810 | { 811 | modeOld = valString; 812 | M5.Lcd.fillRoundRect(232, 199, 44, 13, 2, TFT_MODE); 813 | M5.Lcd.drawString(valString, 254, 206); 814 | } 815 | 816 | //Serial.print("Get Mode"); 817 | } 818 | 819 | // Get TX 820 | uint8_t getTX() 821 | { 822 | uint8_t value; 823 | 824 | char buffer[5]; 825 | char request[] = {0xFE, 0xFE, IC705_CI_V_ADDRESS, 0xE0, 0x1C, 0x00, 0xFD}; 826 | 827 | if (btConnected == false) return 0; 828 | 829 | size_t n = sizeof(request) / sizeof(request[0]); 830 | 831 | sendCommand(request, n, buffer, 5); 832 | 833 | if (buffer[4] <= 1) 834 | { 835 | value = buffer[4]; 836 | } 837 | else 838 | { 839 | value = 0; 840 | } 841 | 842 | return value; 843 | } 844 | 845 | void getDebug() 846 | { 847 | String valString; 848 | 849 | uint8_t val0 = 60; 850 | float_t val1 = 0; 851 | float_t val2 = 0; 852 | static uint8_t val3 = 0; 853 | 854 | float_t angle = 0; 855 | 856 | uint8_t btnA; 857 | uint8_t btnC; 858 | 859 | while (true) 860 | { 861 | M5.update(); 862 | btnA = M5.BtnA.read(); 863 | btnC = M5.BtnC.read(); 864 | 865 | if (btnA == 1) 866 | { 867 | val0 -= 1; 868 | btnA = 0; 869 | } 870 | if (btnC == 1) 871 | { 872 | val0 += 1; 873 | btnC = 0; 874 | } 875 | 876 | vTaskDelay(100); 877 | 878 | if (val0 != val3 || reset == true) 879 | { 880 | val3 = val0; 881 | reset = false; 882 | 883 | if (val0 <= 13) 884 | { 885 | angle = mapFloat(val0, 0, 13, 42.0f, 30.50f); 886 | val1 = mapFloat(val0, 0, 13, 0, 0.5); 887 | } 888 | else if (val0 <= 26) 889 | { 890 | angle = mapFloat(val0, 14, 26, 30.50f, 23.50f); 891 | val1 = mapFloat(val0, 14, 26, 0.5, 1.0); 892 | } 893 | else if (val0 <= 51) 894 | { 895 | angle = mapFloat(val0, 27, 51, 23.50f, 14.50f); 896 | val1 = mapFloat(val0, 27, 51, 1.0, 2.0); 897 | } 898 | else if (val0 <= 127) 899 | { 900 | angle = mapFloat(val0, 52, 127, 14.50f, -6.50f); 901 | val1 = mapFloat(val0, 52, 127, 2.0, 5.0); 902 | } 903 | else if (val0 <= 179) 904 | { 905 | angle = mapFloat(val0, 128, 179, -6.50f, -17.50f); 906 | val1 = mapFloat(val0, 128, 179, 5.0, 7.0); 907 | } 908 | else 909 | { 910 | angle = mapFloat(val0, 180, 255, -17.50f, -30.50f); 911 | val1 = mapFloat(val0, 180, 255, 7.0, 10.0); 912 | } 913 | 914 | val2 = round(val1 * 10); 915 | valString = "PWR " + String((val2 / 10)) + " W"; 916 | 917 | // Debug trace 918 | Serial.print(val0); 919 | Serial.print(" "); 920 | Serial.print(val1); 921 | Serial.print(" "); 922 | Serial.println(angle); 923 | 924 | // Draw line 925 | needle(angle); 926 | 927 | // Write Value 928 | value(valString); 929 | } 930 | } 931 | } 932 | 933 | bool M5Screen24bmp() 934 | { 935 | uint16_t image_height = M5.Lcd.height(); 936 | uint16_t image_width = M5.Lcd.width(); 937 | const uint16_t pad = (4 - (3 * image_width) % 4) % 4; 938 | uint32_t filesize = 54 + (3 * image_width + pad) * image_height; 939 | unsigned char swap; 940 | unsigned char line_data[image_width * 3 + pad]; 941 | unsigned char header[54] = { 942 | 'B', 'M', // BMP signature (Windows 3.1x, 95, NT, …) 943 | 0, 0, 0, 0, // Image file size in bytes 944 | 0, 0, 0, 0, // Reserved 945 | 54, 0, 0, 0, // Start of pixel array 946 | 40, 0, 0, 0, // Info header size 947 | 0, 0, 0, 0, // Image width 948 | 0, 0, 0, 0, // Image height 949 | 1, 0, // Number of color planes 950 | 24, 0, // Bits per pixel 951 | 0, 0, 0, 0, // Compression 952 | 0, 0, 0, 0, // Image size (can be 0 for uncompressed images) 953 | 0, 0, 0, 0, // Horizontal resolution (dpm) 954 | 0, 0, 0, 0, // Vertical resolution (dpm) 955 | 0, 0, 0, 0, // Colors in color table (0 = none) 956 | 0, 0, 0, 0}; // Important color count (0 = all colors are important) 957 | 958 | // Fill filesize, width and heigth in the header array 959 | for (uint8_t i = 0; i < 4; i++) 960 | { 961 | header[2 + i] = (char)((filesize >> (8 * i)) & 255); 962 | header[18 + i] = (char)((image_width >> (8 * i)) & 255); 963 | header[22 + i] = (char)((image_height >> (8 * i)) & 255); 964 | } 965 | // Write the header to the file 966 | httpClient.write(header, 54); 967 | 968 | // To keep the required memory low, the image is captured line by line 969 | // initialize padded pixel with 0 970 | for (uint16_t i = (image_width - 1) * 3; i < (image_width * 3 + pad); i++) 971 | { 972 | line_data[i] = 0; 973 | } 974 | // The coordinate origin of a BMP image is at the bottom left. 975 | // Therefore, the image must be read from bottom to top. 976 | for (uint16_t y = image_height; y > 0; y--) 977 | { 978 | // Get one line of the screen content 979 | M5.Lcd.readRectRGB(0, y - 1, image_width, 1, line_data); 980 | // BMP color order is: Blue, Green, Red 981 | // Return values from readRectRGB is: Red, Green, Blue 982 | // Therefore: R und B need to be swapped 983 | for (uint16_t x = 0; x < image_width; x++) 984 | { 985 | swap = line_data[x * 3]; 986 | line_data[x * 3] = line_data[x * 3 + 2]; 987 | line_data[x * 3 + 2] = swap; 988 | } 989 | // Write the line to the file 990 | httpClient.write(line_data, (image_width * 3) + pad); 991 | } 992 | return true; 993 | } 994 | 995 | // Get screenshot 996 | void getScreenshot() 997 | { 998 | unsigned long timeout_millis = millis() + 3000; 999 | String currentLine = ""; 1000 | 1001 | httpClient = httpServer.available(); 1002 | 1003 | if (WiFi.status() == WL_CONNECTED) 1004 | { 1005 | // httpClient.setNoDelay(1); 1006 | if (httpClient) 1007 | { 1008 | // Force a disconnect after 3 seconds 1009 | // Serial.println("New Client."); 1010 | // Loop while the client's connected 1011 | while (httpClient.connected()) 1012 | { 1013 | // If the client is still connected after 3 seconds, 1014 | // Something is wrong. So kill the connection 1015 | if (millis() > timeout_millis) 1016 | { 1017 | // Serial.println("Force Client stop!"); 1018 | httpClient.stop(); 1019 | } 1020 | // If there's bytes to read from the client, 1021 | if (httpClient.available()) 1022 | { 1023 | char c = httpClient.read(); 1024 | Serial.write(c); 1025 | // If the byte is a newline character 1026 | if (c == '\n') 1027 | { 1028 | // Two newline characters in a row (empty line) are indicating 1029 | // The end of the client HTTP request, so send a response: 1030 | if (currentLine.length() == 0) 1031 | { 1032 | // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) 1033 | // and a content-type so the client knows what's coming, then a blank line, 1034 | // followed by the content: 1035 | 1036 | screensaver = millis(); // Screensaver update !!! 1037 | 1038 | switch (htmlGetRequest) 1039 | { 1040 | case GET_index_page: 1041 | { 1042 | httpClient.println("HTTP/1.1 200 OK"); 1043 | httpClient.println("Content-type:text/html"); 1044 | httpClient.println(); 1045 | httpClient.write_P(index_html, sizeof(index_html)); 1046 | break; 1047 | } 1048 | case GET_screenshot: 1049 | { 1050 | httpClient.println("HTTP/1.1 200 OK"); 1051 | httpClient.println("Content-type:image/bmp"); 1052 | httpClient.println(); 1053 | M5Screen24bmp(); 1054 | break; 1055 | } 1056 | default: 1057 | httpClient.println("HTTP/1.1 404 Not Found"); 1058 | httpClient.println("Content-type:text/html"); 1059 | httpClient.println(); 1060 | httpClient.print("404 Page not found.
"); 1061 | break; 1062 | } 1063 | // The HTTP response ends with another blank line: 1064 | // httpClient.println(); 1065 | // Break out of the while loop: 1066 | break; 1067 | } 1068 | else 1069 | { // if a newline is found 1070 | // Analyze the currentLine: 1071 | // detect the specific GET requests: 1072 | if (currentLine.startsWith("GET /")) 1073 | { 1074 | htmlGetRequest = GET_unknown; 1075 | // If no specific target is requested 1076 | if (currentLine.startsWith("GET / ")) 1077 | { 1078 | htmlGetRefresh = 3; 1079 | htmlGetRequest = GET_index_page; 1080 | } 1081 | // If the screenshot image is requested 1082 | if (currentLine.startsWith("GET /screenshot.bmp")) 1083 | { 1084 | htmlGetRefresh = 3; 1085 | htmlGetRequest = GET_screenshot; 1086 | } 1087 | // If the button left was pressed on the HTML page 1088 | if (currentLine.startsWith("GET /buttonLeft")) 1089 | { 1090 | buttonLeftPressed = true; 1091 | htmlGetRefresh = 1; 1092 | htmlGetRequest = GET_index_page; 1093 | } 1094 | // If the button center was pressed on the HTML page 1095 | if (currentLine.startsWith("GET /buttonCenter")) 1096 | { 1097 | buttonCenterPressed = true; 1098 | htmlGetRefresh = 1; 1099 | htmlGetRequest = GET_index_page; 1100 | } 1101 | // If the button right was pressed on the HTML page 1102 | if (currentLine.startsWith("GET /buttonRight")) 1103 | { 1104 | buttonRightPressed = true; 1105 | htmlGetRefresh = 1; 1106 | htmlGetRequest = GET_index_page; 1107 | } 1108 | } 1109 | currentLine = ""; 1110 | } 1111 | } 1112 | else if (c != '\r') 1113 | { 1114 | // Add anything else than a carriage return 1115 | // character to the currentLine 1116 | currentLine += c; 1117 | } 1118 | } 1119 | } 1120 | // Close the connection 1121 | httpClient.stop(); 1122 | // Serial.println("Client Disconnected."); 1123 | } 1124 | } 1125 | } 1126 | 1127 | // Manage screensaver 1128 | void wakeAndSleep() 1129 | { 1130 | static uint16_t x = rand() % 232; 1131 | static uint16_t y = rand() % 196; 1132 | static boolean xDir = rand() & 1; 1133 | static boolean yDir = rand() & 1; 1134 | 1135 | /* 1136 | if (screensaverMode == 0 && millis() - screensaver > TIMEOUT_SCREENSAVER) 1137 | { 1138 | for (uint8_t i = brightness; i >= 1; i--) 1139 | { 1140 | setBrightness(i); 1141 | delay(10); 1142 | } 1143 | screensaverMode = 1; 1144 | screensaver = 0; 1145 | M5.Lcd.sleep(); 1146 | } 1147 | else if (screensaverMode == 1 && screensaver != 0) 1148 | { 1149 | M5.Lcd.wakeup(); 1150 | screensaverMode = 0; 1151 | for (uint8_t i = 1; i <= brightness; i++) 1152 | { 1153 | setBrightness(i); 1154 | delay(10); 1155 | } 1156 | } 1157 | */ 1158 | 1159 | if (screensaverMode == 0 && millis() - screensaver > TIMEOUT_SCREENSAVER) 1160 | { 1161 | screensaverMode = 1; 1162 | screensaver = 0; 1163 | M5.Lcd.fillScreen(TFT_BLACK); 1164 | } 1165 | else if (screensaverMode == 1 && screensaver != 0) 1166 | { 1167 | M5.Lcd.fillScreen(TFT_BLACK); 1168 | clearData(); 1169 | viewGUI(); 1170 | screensaverMode = 0; 1171 | 1172 | vTaskDelay(100); 1173 | } 1174 | else if (screensaverMode == 1) { 1175 | 1176 | M5.Lcd.fillRect(x, y, 44, 22, TFT_BLACK); 1177 | 1178 | if(xDir) 1179 | { 1180 | x += 1; 1181 | } 1182 | else { 1183 | x -= 1; 1184 | } 1185 | 1186 | if(yDir) 1187 | { 1188 | y += 1; 1189 | } 1190 | else { 1191 | y -= 1; 1192 | } 1193 | 1194 | if(x < 44) { 1195 | xDir = true; 1196 | x = 44; 1197 | } 1198 | else if(x > 232) { 1199 | xDir = false; 1200 | x = 232; 1201 | } 1202 | 1203 | if(y < 22) { 1204 | yDir = true; 1205 | y = 22; 1206 | } 1207 | else if(y > 196) { 1208 | yDir = false; 1209 | y = 196; 1210 | } 1211 | 1212 | M5.Lcd.drawJpg(logo, sizeof(logo), x, y, 44, 22); 1213 | if(!btConnected) vTaskDelay(75); 1214 | } 1215 | 1216 | Serial.print(screensaverMode); 1217 | Serial.print(" "); 1218 | Serial.println(millis() - screensaver); 1219 | } -------------------------------------------------------------------------------- /src/settings.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) F4HWN Armel. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | // M5Stack Board 5 | #define BOARD BASIC // Your M5Stack Board 6 | 7 | // IC705 Bluetooth 8 | #define IC705_CI_V_ADDRESS 0xA4 // IC705 CI-V default address 0xA4 9 | 10 | // Wifi Config 11 | #define WIFI_SSID "YOUR WIFI SSID" // Your WiFi SSID 12 | #define WIFI_PASSWORD "YOUR WIFI PASSWORD" // Your WiFi Password 13 | 14 | // Screen Saver Time Out 15 | #define TIMEOUT_SCREENSAVER 60 * 60 * 1000 // 60 min default timeout (in milli seconds) -------------------------------------------------------------------------------- /src/tasks.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) F4HWN Armel. All rights reserved. 2 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 | 4 | // Get Button 5 | void button(void *pvParameters) 6 | { 7 | for (;;) 8 | { 9 | 10 | getButton(); 11 | 12 | if(btnA || btnB || btnC) { 13 | screensaver = millis(); 14 | } 15 | 16 | if (btnA == 1 || buttonLeftPressed == 1) 17 | { 18 | option = 0; 19 | buttonLeftPressed = 0; 20 | preferences.putUInt("option", option); 21 | } 22 | else if (btnB == 1 || buttonCenterPressed == 1) 23 | { 24 | option = 1; 25 | buttonCenterPressed = 0; 26 | preferences.putUInt("option", option); 27 | } 28 | else if (btnC == 1 || buttonRightPressed == 1) 29 | { 30 | option = 2; 31 | buttonRightPressed = 0; 32 | preferences.putUInt("option", option); 33 | } 34 | else if (btnL == 1) { 35 | brightness -= 1; 36 | if(brightness < 1) { 37 | brightness = 1; 38 | } 39 | setBrightness(brightness); 40 | Serial.println(brightness); 41 | preferences.putUInt("brightness", brightness); 42 | vTaskDelay(pdMS_TO_TICKS(50)); 43 | } 44 | else if (btnM == 1) { 45 | shutdown(); 46 | } 47 | else if (btnR == 1) { 48 | brightness += 1; 49 | if(brightness > 254) { 50 | brightness = 254; 51 | } 52 | setBrightness(brightness); 53 | Serial.println(brightness); 54 | preferences.putUInt("brightness", brightness); 55 | vTaskDelay(pdMS_TO_TICKS(50)); 56 | } 57 | 58 | vTaskDelay(pdMS_TO_TICKS(50)); 59 | } 60 | } -------------------------------------------------------------------------------- /test/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for PlatformIO Unit Testing and project tests. 3 | 4 | Unit Testing is a software testing method by which individual units of 5 | source code, sets of one or more MCU program modules together with associated 6 | control data, usage procedures, and operating procedures, are tested to 7 | determine whether they are fit for use. Unit testing finds problems early 8 | in the development cycle. 9 | 10 | More information about PlatformIO Unit Testing: 11 | - https://docs.platformio.org/page/plus/unit-testing.html 12 | --------------------------------------------------------------------------------