Compare commits

...

20 Commits

Author SHA1 Message Date
Oliver Kennedy 3531ca36aa
Capen Inkplate 2024-03-20 16:50:19 -04:00
Robert Sorić 05651f6ee3 Merge branch 'dev' 2024-02-19 15:21:18 +01:00
Robert Sorić 68850e9d2b Added RTC for all Inkplates 2024-02-19 15:17:21 +01:00
Robert Sorić 5477f30992 Added RTC for Inkpltae5 2024-02-09 09:40:45 +01:00
Robert Sorić a84b3c11bd
Update README.md
Added an additional instruction for Windows users when flashing the firmware, as pointed out in: https://github.com/SolderedElectronics/Inkplate-micropython/issues/33
2024-01-16 07:54:14 +01:00
Robert Sorić 0c0406f929 Added fix for Inkplate5 temp. read 2023-11-28 08:47:20 +01:00
Robert Sorić 1e89648446 Quick fix for Inkplate 5 2023-11-24 09:15:02 +01:00
Robert Sorić 103e107195 Merge branch 'dev' 2023-10-30 12:00:27 +01:00
Robert Sorić b4008a3677 Updated library, ready to be merged with main 2023-10-30 11:58:59 +01:00
Robert Sorić 1f6828f991 Added frontlight support for Soldered Inkplate 6PLUS 2023-09-04 12:46:00 +02:00
Robert Sorić 1db0e2bcb4 Merge branch 'dev' 2023-06-07 12:40:03 +02:00
Robert Sorić 9359125120 Merge branch 'dev' 2023-05-23 15:40:52 +02:00
Zvonimir Haramustek 6c18b42af2
Merge pull request #11 from Tamarinen/defade-0-1
Prevent bleaching of colors 0 and 1 by colors 2 and 3
2022-02-10 11:27:29 +01:00
Zvonimir Haramustek a57171f55a
Merge branch 'master' into defade-0-1 2022-02-10 11:26:25 +01:00
Zvonimir Haramustek 57f6c5001a
Merge pull request #12 from kratz00/micropython
MicroPython clarifications + minor README.md improvements
2022-02-10 11:24:35 +01:00
Zvonimir Haramustek 01b0d1cd54
Merge branch 'master' into micropython 2022-02-10 11:24:01 +01:00
Steffen Pankratz 4b71b63179 Clarify required MicroPython port (README.md)
Signed-off-by: Steffen Pankratz <kratz00@gmx.de>
2021-11-16 21:07:36 +01:00
Steffen Pankratz ddade182ce Update forum URL: use https instead of http (README.md)
Signed-off-by: Steffen Pankratz <kratz00@gmx.de>
2021-11-16 21:00:32 +01:00
Steffen Pankratz 75d1068cc0 Typo fixes (README.md)
Signed-off-by: Steffen Pankratz <kratz00@gmx.de>
2021-11-16 20:58:19 +01:00
Martin Samuelsson 478b7c7436 Prevent bleaching of colors 0 and 1 by colors 2 and 3
Moving the last ones of colors 0 and 1 out of the way of the trailing
twos of colors 2 and 3 seem to do a good job restoring the former
colors after being bleached by the latter ones, making them crisp again.
2021-10-05 14:08:27 +02:00
41 changed files with 1692 additions and 333 deletions

1
.gitignore vendored
View File

@ -3,3 +3,4 @@ board_config_*.py
init.mpf
lib
.vscode
i2c_scanner.py

Binary file not shown.

View File

@ -0,0 +1,38 @@
# This example will show you how to use the onboard RTC to preserve time across reboots
# Include all the required libraries
from inkplate10 import Inkplate
import time
# Create Inkplate object in 1-bit mode, black and white colors only
# For 2-bit grayscale, see basicGrayscale.py
display = Inkplate(Inkplate.INKPLATE_1BIT)
# Main function
if __name__ == "__main__":
# Initialize the display, needs to be called only once
display.begin()
# Clear the frame buffer
display.clearDisplay()
# This has to be called every time you want to update the screen
# Drawing or printing text will have no effect on the display itself before you call this function
display.display()
# This is how to set the RTC's time
# Arguments are hour, minute, seconds
display.rtcSetTime(9,39,10)
# And this is the date
# Arguments are weekday, day in month, month and year
display.rtcSetDate(5,9,2,2024)
# Show the set time
print(display.rtcGetData())
# Let's wait 10 seconds
time.sleep(10)
# Let's see if the time has updated
print(display.rtcGetData())

View File

@ -28,14 +28,14 @@ if __name__ == "__main__":
display.drawCircle(178, 16, 9, display.WHITE)
display.drawCircle(178, 16, 4, display.RED)
# Draw a red checkerboard pattern
# Draw a red checkerboard pattern with a loop
for x in range(30):
display.fillRect(0 + (5*x*2), 38, 5, 5, display.RED)
for x in range(30):
display.fillRect(5 + (5*x*2), 42, 5, 5, display.RED)
# Draw some lines
# Draw some horizontal lines
display.drawLine(0, 49, 214, 49, display.BLACK)
display.drawLine(0, 51, 214, 51, display.RED)
display.drawLine(0, 53, 214, 53, display.BLACK)
@ -45,5 +45,6 @@ if __name__ == "__main__":
display.drawBitmap(0, 58, soldered_logo, 211, 44, display.RED)
# Display everything on Inkplate's display
# This function must be called after drawing, or else the display won't update
# This function must be called after drawing, or else the display won't update
# The display flickers when it updates and it takes a while, this is normal
display.display()

View File

@ -9,7 +9,7 @@ from inkplate2 import Inkplate
# Import the image
# It should also be copied to Inkplate when copying other libraries
# Check the README!
# Check the README for more info
from color_image_inkplate2 import color_image_inkplate2
# Create Inkplate object
@ -22,7 +22,7 @@ if __name__ == "__main__":
display.begin()
# color_image_inkplate2 is 212x104px, draw it over the whole screen
# Arguments are x start, y start, width, height, and then the image buffer
# Arguments are: x start, y start, width, height, and then the image buffer
display.drawColorImage(0, 0, 212, 104, color_image_inkplate2)
# Show it on the display

View File

@ -7,8 +7,8 @@ import time
from inkplate2 import Inkplate
# Enter your WiFi credentials here
ssid = ""
password = ""
ssid = "Soldered"
password = "dasduino"
# Function which connects to WiFi
# More info here: https://docs.micropython.org/en/latest/esp8266/tutorial/network_basics.html
@ -60,9 +60,12 @@ if __name__ == "__main__":
cnt = 0
for x in response.split("\n"):
display.printText(
10, 20 + cnt, x.upper()
2, 2 + cnt, x.upper()
) # Default font has only upper case letters
cnt += 20
cnt += 10
# Also print to terminal because the screen is small
print(x)
# Display image from buffer
display.display()

38
Examples/Inkplate5/RTC.py Normal file
View File

@ -0,0 +1,38 @@
# This example will show you how to use the onboard RTC to preserve time across reboots
# Include all the required libraries
from inkplate5 import Inkplate
import time
# Create Inkplate object in 1-bit mode, black and white colors only
# For 2-bit grayscale, see basicGrayscale.py
display = Inkplate(Inkplate.INKPLATE_1BIT)
# Main function
if __name__ == "__main__":
# Initialize the display, needs to be called only once
display.begin()
# Clear the frame buffer
display.clearDisplay()
# This has to be called every time you want to update the screen
# Drawing or printing text will have no effect on the display itself before you call this function
display.display()
# This is how to set the RTC's time
# Arguments are hour, minute, seconds
display.rtcSetTime(9,39,10)
# And this is the date
# Arguments are weekday, day in month, month and year
display.rtcSetDate(5,9,2,2024)
# Show the set time
print(display.rtcGetData())
# Let's wait 10 seconds
time.sleep(10)
# Let's see if the time has updated
print(display.rtcGetData())

38
Examples/Inkplate6/RTC.py Normal file
View File

@ -0,0 +1,38 @@
# This example will show you how to use the onboard RTC to preserve time across reboots
# Include all the required libraries
from inkplate6 import Inkplate
import time
# Create Inkplate object in 1-bit mode, black and white colors only
# For 2-bit grayscale, see basicGrayscale.py
display = Inkplate(Inkplate.INKPLATE_1BIT)
# Main function
if __name__ == "__main__":
# Initialize the display, needs to be called only once
display.begin()
# Clear the frame buffer
display.clearDisplay()
# This has to be called every time you want to update the screen
# Drawing or printing text will have no effect on the display itself before you call this function
display.display()
# This is how to set the RTC's time
# Arguments are hour, minute, seconds
display.rtcSetTime(9,39,10)
# And this is the date
# Arguments are weekday, day in month, month and year
display.rtcSetDate(5,9,2,2024)
# Show the set time
print(display.rtcGetData())
# Let's wait 10 seconds
time.sleep(10)
# Let's see if the time has updated
print(display.rtcGetData())

View File

@ -1,5 +1,5 @@
# This example shows you how to use the touchpads
# Only older models of Inkplate10 (e-Radionica Inkplate 10) have them
# Only older models of Inkplate6 (e-Radionica Inkplate 6) have them
# Include required libraries
from inkplate6 import Inkplate

View File

@ -0,0 +1,38 @@
# This example will show you how to use the onboard RTC to preserve time across reboots
# Include all the required libraries
from inkplate6COLOR import Inkplate
import time
# Create Inkplate object in 1-bit mode, black and white colors only
# For 2-bit grayscale, see basicGrayscale.py
display = Inkplate(Inkplate.INKPLATE_1BIT)
# Main function
if __name__ == "__main__":
# Initialize the display, needs to be called only once
display.begin()
# Clear the frame buffer
display.clearDisplay()
# This has to be called every time you want to update the screen
# Drawing or printing text will have no effect on the display itself before you call this function
display.display()
# This is how to set the RTC's time
# Arguments are hour, minute, seconds
display.rtcSetTime(9,39,10)
# And this is the date
# Arguments are weekday, day in month, month and year
display.rtcSetDate(5,9,2,2024)
# Show the set time
print(display.rtcGetData())
# Let's wait 10 seconds
time.sleep(10)
# Let's see if the time has updated
print(display.rtcGetData())

View File

@ -0,0 +1,38 @@
# This example will show you how to use the onboard RTC to preserve time across reboots
# Include all the required libraries
from inkplate6PLUS import Inkplate
import time
# Create Inkplate object in 1-bit mode, black and white colors only
# For 2-bit grayscale, see basicGrayscale.py
display = Inkplate(Inkplate.INKPLATE_1BIT)
# Main function
if __name__ == "__main__":
# Initialize the display, needs to be called only once
display.begin()
# Clear the frame buffer
display.clearDisplay()
# This has to be called every time you want to update the screen
# Drawing or printing text will have no effect on the display itself before you call this function
display.display()
# This is how to set the RTC's time
# Arguments are hour, minute, seconds
display.rtcSetTime(9,39,10)
# And this is the date
# Arguments are weekday, day in month, month and year
display.rtcSetDate(5,9,2,2024)
# Show the set time
print(display.rtcGetData())
# Let's wait 10 seconds
time.sleep(10)
# Let's see if the time has updated
print(display.rtcGetData())

View File

@ -0,0 +1,38 @@
# This example will show you how to use the onboard RTC to preserve time across reboots
# Include all the required libraries
from soldered_inkplate10 import Inkplate
import time
# Create Inkplate object in 1-bit mode, black and white colors only
# For 2-bit grayscale, see basicGrayscale.py
display = Inkplate(Inkplate.INKPLATE_1BIT)
# Main function
if __name__ == "__main__":
# Initialize the display, needs to be called only once
display.begin()
# Clear the frame buffer
display.clearDisplay()
# This has to be called every time you want to update the screen
# Drawing or printing text will have no effect on the display itself before you call this function
display.display()
# This is how to set the RTC's time
# Arguments are hour, minute, seconds
display.rtcSetTime(9,39,10)
# And this is the date
# Arguments are weekday, day in month, month and year
display.rtcSetDate(5,9,2,2024)
# Show the set time
print(display.rtcGetData())
# Let's wait 10 seconds
time.sleep(10)
# Let's see if the time has updated
print(display.rtcGetData())

View File

@ -0,0 +1,38 @@
# This example will show you how to use the onboard RTC to preserve time across reboots
# Include all the required libraries
from soldered_inkplate6 import Inkplate
import time
# Create Inkplate object in 1-bit mode, black and white colors only
# For 2-bit grayscale, see basicGrayscale.py
display = Inkplate(Inkplate.INKPLATE_1BIT)
# Main function
if __name__ == "__main__":
# Initialize the display, needs to be called only once
display.begin()
# Clear the frame buffer
display.clearDisplay()
# This has to be called every time you want to update the screen
# Drawing or printing text will have no effect on the display itself before you call this function
display.display()
# This is how to set the RTC's time
# Arguments are hour, minute, seconds
display.rtcSetTime(9,39,10)
# And this is the date
# Arguments are weekday, day in month, month and year
display.rtcSetDate(5,9,2,2024)
# Show the set time
print(display.rtcGetData())
# Let's wait 10 seconds
time.sleep(10)
# Let's see if the time has updated
print(display.rtcGetData())

View File

@ -0,0 +1,38 @@
# This example will show you how to use the onboard RTC to preserve time across reboots
# Include all the required libraries
from soldered_inkplate6PLUS import Inkplate
import time
# Create Inkplate object in 1-bit mode, black and white colors only
# For 2-bit grayscale, see basicGrayscale.py
display = Inkplate(Inkplate.INKPLATE_1BIT)
# Main function
if __name__ == "__main__":
# Initialize the display, needs to be called only once
display.begin()
# Clear the frame buffer
display.clearDisplay()
# This has to be called every time you want to update the screen
# Drawing or printing text will have no effect on the display itself before you call this function
display.display()
# This is how to set the RTC's time
# Arguments are hour, minute, seconds
display.rtcSetTime(9,39,10)
# And this is the date
# Arguments are weekday, day in month, month and year
display.rtcSetDate(5,9,2,2024)
# Show the set time
print(display.rtcGetData())
# Let's wait 10 seconds
time.sleep(10)
# Let's see if the time has updated
print(display.rtcGetData())

View File

@ -25,19 +25,14 @@ if __name__ == "__main__":
# Frontlight strength can be set from values 0 to 64
# For example:
display.setFrontlight(34)
display.setFrontlight(10)
# Wait 3 seconds
time.sleep(3)
# Slowly gradually increase the frontlight and then decrease it, infinitely
# Slowly gradually increase the frontlight, infinitely
while(True):
# First, increase the brightness gradually
for i in range(0, 60):
display.setFrontlight(i)
time.sleep(0.5) # Wait for 500ms
# Then, decrease
for i in range(60, 0):
display.setFrontlight(i)
time.sleep(0.5) # Wait for 500ms
time.sleep(0.2) # Wait for 200ms

48
Makefile Normal file
View File

@ -0,0 +1,48 @@
BOARD=soldered_inkplate6PLUS
GPIO=PCAL6416A
all: lib
lib: installed/ub_sched.py installed/ub_devices.py installed/conf_room_layout.py
main: lib
python3 pyboard.py --device /dev/ttyUSB0 -f cp conf_room/main.py :
screen /dev/ttyUSB0 115200
installed/ub_sched.py: conf_room/ub_sched.py
python3 pyboard.py --device /dev/ttyUSB0 -f cp conf_room/ub_sched.py :
cp conf_room/ub_sched.py installed/
installed/ub_devices.py: conf_room/ub_devices.py
python3 pyboard.py --device /dev/ttyUSB0 -f cp conf_room/ub_devices.py :
cp conf_room/ub_devices.py installed/
installed/conf_room_layout.py: conf_room/conf_room_layout.py
python3 pyboard.py --device /dev/ttyUSB0 -f cp conf_room/conf_room_layout.py :
cp conf_room/conf_room_layout.py installed/
test: lib
# ./pyboard.py --device /dev/ttyUSB0 -c 'from ub_sched import RoomSchedule, ROOM_CAPEN_212A; import ub_devices; ub_devices.connect(); print(RoomSchedule(ROOM_CAPEN_212A).fetch())'
./pyboard.py --device /dev/ttyUSB0 -c 'from conf_room_layout import refresh; refresh()'
ping:
./pyboard.py --device /dev/ttyUSB0 -c 'print("pong")' #--follow
connect_wifi: lib
./pyboard.py --device /dev/ttyUSB0 -c 'import ub_devices; ub_devices.connect();' #--follow
setup_board:
python3 -m esptool --port /dev/ttyUSB0 erase_flash
python3 -m esptool --port /dev/ttyUSB0 write_flash \
-z 0x1000 esp32spiram-20220117-v1.18.bin
python3 pyboard.py --device /dev/ttyUSB0 -f cp \
${GPIO}.py ${BOARD}.py image.py shapes.py gfx.py \
gfx_standard_font_01.py soldered_logo.py :
install_prereqs:
pip3 install esptool
connect_serial:
screen /dev/ttyUSB0 115200
.PHONY: all lib main test ping setup_board install_prereqs connect_serial connect_wifi

View File

@ -1,6 +1,6 @@
# Driver for the PCAL6416A GPIO expander
# Used in the drivers for the new Soldered Inkplate boards
# MicroPython driver for the PCAL6416A GPIO expander
# By Soldered Electronics
# Based on the original contribution by https://github.com/tve
from machine import Pin as mPin
from micropython import const

View File

@ -5,7 +5,7 @@
The Micropython modules for the Inkplate product family can befound in this repository. Inkplate is a series of powerful, Wi-Fi and Bluetooth enabled, ESP32-based ePaper display products. Its main feature is simplicity. Just plug in a USB cable, load the MicroPython firmware and the required libraries and run your script on Inkplate itself. The Inkplate product family currently includes Inkplate 10, Inkplate 6 and Inkplate 6PLUS, Inkplate 6COLOR and Inkplate 2.
Inkplate 6 was crowdfunded on [Crowd Supply](https://www.crowdsupply.com/e-radionica/inkplate-6), as well as [Inkplate 10](https://www.crowdsupply.com/e-radionica/inkplate-10), [Inkplate 6PLUS](https://www.crowdsupply.com/e-radionica/inkplate-6plus) and [Inkplate 6COLOR](https://www.crowdsupply.com/soldered/inkplate-6color). Inkplate 2 was funded on [Kickstarter](https://www.kickstarter.com/projects/solderedelectronics/inkplate-2-a-easy-to-use-arduino-compatible-e-paper).
All available to purchase from [soldered.com](https://soldered.com/categories/inkplate/).
All available to purchase from [Soldered.com](https://soldered.com/categories/inkplate/).
Original effort to enable MicroPython support for Inkplate was done by [tve](https://github.com/tve/micropython-inkplate6). Thank you!
@ -14,27 +14,33 @@ Original effort to enable MicroPython support for Inkplate was done by [tve](htt
In order to get started with running your code on Inkplate, follow these steps:
1. Install esptool - the command line tool used to upload firmware to the ESP32. Get it from [here](https://github.com/espressif/esptool) (https://github.com/espressif/esptool). Also, install PySerial as it's a requirement. You can download PySerial [here](https://pypi.org/project/pyserial/) (https://pypi.org/project/pyserial). Place them in a both in a working directory.
2. Download or clone this repository by clicking Code -> Download as .zip. Extract to your desired working directory for your MicroPython files, make it a different one than the esptool directory.
2. Download this repository by clicking Code -> Download as .zip, or clone it. Extract to your desired working directory for your MicroPython files, make it a different one than the esptool directory.
3. Copy the esp32spiram-20220117-v1.18.bin file to the esptool directory from the MicroPython directory. Open your terminal/command prompt in the esptool directory.
3. Copy the esp32spiram-20220117-v1.18.bin file to the esptool directory from the MicroPython directory. Then,open your terminal/command prompt in the esptool directory.
4. We need to flash the MicroPython firmware to Inkplate. It is reccomended to flash the one supplied in this repository that you have copied in the previous step, version 1.18. To do this, connect Inkplate via USB-C and first erase the flash memory by running this command:
4. Now we need to flash the MicroPython firmware to Inkplate. It is reccomended to flash the one supplied in this repository that you have copied in the previous step, version 1.18. To do this, connect Inkplate via USB-C and first erase the flash memory by running this command:
```
//Linux/Mac
// Linux/Mac
python3 esptool.py --port /dev/cu.usbserial-1420 erase_flash
//Windows
// Windows
python esptool.py --port COM5 erase_flash
```
If you're having problems on Windows, use:
```
esptool --port COM5 erase_flash
```
**NOTE:** You should change the serial port listed here to the one which corresponds to your connected Inkplate device.
Now it's possible to flash MicroPython firmware. Do so by running this command:
```
//Linux/Mac
// Linux/Mac
python3 esptool.py --chip esp32 --port /dev/cu.usbserial-1420 write_flash -z 0x1000 esp32spiram-20220117-v1.18.bin
// If you're having problems on Mac, use a slower baud rate with the flag "-b 115200"
//Windows
// Windows
python esptool.py --chip esp32 --port COM5 write_flash -z 0x1000 esp32spiram-20220117-v1.18.bin
```
@ -43,11 +49,11 @@ python esptool.py --chip esp32 --port COM5 write_flash -z 0x1000 esp32spiram-202
5. Open a terminal in your MicroPython folder. Now, it's required to copy all the library files and drivers for your Inkplate board, so your MicroPython script can run. Do so with the following command:
```
//Linux/Mac
// Linux/Mac
python3 pyboard.py --device /dev/ttyUSB0 -f cp mcp23017.py inkplate6.py image.py shapes.py gfx.py gfx_standard_font_01.py soldered_logo.py :
//Windows
//This one might need to be started twice
// Windows
// This one might need to be started twice
python pyboard.py --device COM5 -f cp inkplate6.py gfx.py gfx_standard_font_01.py mcp23017.py PCAL6416A.py image.py shapes.py soldered_logo.py :
```
@ -58,10 +64,10 @@ In this command you also need to include all the files your Python script uses (
7. Finally, it's time to run the MicroPython script which will actually run on the device. To demonstrate, we will run the basicBW.py example for Inkplate 6. To run the script, execute the following command:
```
//Linux/Mac
// Linux/Mac
python3 pyboard.py --device /dev/ttyUSB0 "Examples/Inkplate6/basicBW.py"
//Windows
// Windows
python pyboard.py --device COM5 "Examples/Inkplate6/basicBW.py"
```
@ -71,20 +77,22 @@ You can try other examples which will show you all the features of the device.
### Code examples
There are several examples which will indicate all the functions you can use in your own script:
* The basic examples show you drawing shapes, lines and text on the screen in different colors, also a bitmap image in a single color (color image drawing with dithering will be supported soon!)
* The basic examples show you drawing shapes, lines and text on the screen in different colors, also a bitmap image in a single color
* The network examples show you how to use the network features like doing a GET request and downloading a file
* The batteryAndTemperatureRead examples show you how to read the internal battery status and the temperature from the internal sensor
* The exampleSD example shows you how to read image files and text from the SD card
* The gpio_expander example shows how to use the GPIO expander on new Inkplate models
* The touchpad examples show you how to use the touchpad on older Inkplates
More information is provided in the examples themselves in the shape of comments.
### Documentation
Find Inkplate documentation [here](https://inkplate.readthedocs.io/).
### Battery power
Inkplate boards has two options for powering it. First one is obvious - USB port at side of the board. Just plug any micro USB cable and you are good to go. Second option is battery. Supported batteries are standard Li-Ion/Li-Poly batteries with 3.7V nominal voltage. Connector for the battery is standard 2.00mm pitch JST connector (except on Inkplate 2, it uses SMD solder pads for battery terminals). The onboard charger will charge the battery with 500mA when USB is plugged at the same time. You can use battery of any size or capacity if you don't have a enclosure. If you are using our enclosure, battery size shouldn't exceed 90mm x 40mm (3.5 x 1.57 inch) and 5mm (0.19 inch) in height (excluding Inkplate 2, it uses [this battery](https://soldered.com/product/li-ion-baterija-600mah-3-7v/). [This battery](https://soldered.com/product/li-ion-battery-1200mah-3-7v/) is good fit for the Inkplate. Also, Inkplate's hardware is specially optimized for low power consumption in deep sleep mode, making it extremely suitable for battery applications.
Inkplate boards have two options for powering it. The first one is obvious - USB port at side of the board. Just plug any microUSB/USB-C (depending on your board version) cable and you are good to go. The second option is using a battery. Supported batteries are standard Li-Ion/Li-Poly batteries with a 3.7V nominal voltage. Connector for the battery is standard 2.00mm pitch JST connector (except on Inkplate 2, it uses SMD solder pads for battery terminals). The onboard charger will charge the battery with 500mA when USB is plugged at the same time. You can use battery of any size or capacity if you don't have a enclosure. If you are using our enclosure, battery size shouldn't exceed 90mm x 40mm (3.5 x 1.57 inch) and 5mm (0.19 inch) in height (excluding Inkplate 2, it uses [this battery](https://soldered.com/product/li-ion-baterija-600mah-3-7v/). [This battery](https://soldered.com/product/li-ion-battery-1200mah-3-7v/) is a good fit for all Inkplate models. Also, Inkplate's hardware is specially optimized for low power consumption in deep sleep mode, making it extremely suitable for battery applications.
#### ⚠️ WARNING
Please check the polarity on the battery JST connector! Some batteries that can be purchased from the web have reversed polarity that can damage Inkplate board! You are safe if you are using the pouch battery from [soldered.com](https://soldered.com/categories/power-sources-batteries/batteries/lithium-batteries/) or Inkplate with the built-in battery .
@ -102,19 +110,17 @@ All of Inkplate-related development is open-sourced:
- [Arduino library](https://github.com/SolderedElectronics/Inkplate-Arduino-library)
- Hardware design:
- Soldered Inkplate 2 (comming soon!)
- Soldered Inkplate 6 (comming soon!)
- Soldered Inkplate 6PLUS (comming soon!)
- [Soldered Inkplate 2](https://github.com/SolderedElectronics/Soldered-Inkplate-2-hardware-design)
- [Soldered Inkplate 6](https://github.com/SolderedElectronics/Soldered-Inkplate-6-hardware-design)
- [Soldered Inkplate 6PLUS](https://github.com/SolderedElectronics/Soldered-Inkplate-6PLUS-hardware-design)
- [Soldered Inkplate 10](https://github.com/SolderedElectronics/Soldered-Inkplate-10-hardware-design)
- Soldered Inkplate 6COLOR (comming soon!)
- [Soldered Inkplate 6COLOR](https://github.com/SolderedElectronics/Soldered-Inkplate-6COLOR-hardware-design)
- [e-radionica.com Inkplate 6](https://github.com/SolderedElectronics/Inkplate-6-hardware)
- [e-radionica.com Inkplate 10](https://github.com/SolderedElectronics/Inkplate-10-hardware)
- [e-radionica.com Inkplate 6PLUS](https://github.com/SolderedElectronics/Inkplate-6PLUS-Hardware)
- e-radionica.com Inkplate 6COLOR (comming soon!)
- [micropython Inkplate](https://github.com/SolderedElectronics/Inkplate-micropython)
- [OSHWA cerfiticates](https://certification.oshwa.org/list.html?q=inkplate)
### Where to buy & other
### Where to buy
Inkplate boards are available for purchase via:
@ -122,4 +128,4 @@ Inkplate boards are available for purchase via:
- [Crowd Supply](https://www.crowdsupply.com/soldered)
- [Mouser](https://hr.mouser.com/Search/Refine?Keyword=inkplate)
For all questions and issues please reach us via [e-mail](mailto:hello@soldered.com) or our [contact form](https://soldered.com/contact/).
For all questions and issues please reach us via [e-mail](mailto:hello@soldered.com) or our [contact form](https://soldered.com/contact/).

View File

@ -1,105 +1,105 @@
color_image_small = bytearray(
b"\x55\x15\x51\x55\x45\x54\x54\x55\x15\x54\x54\x55\x45\x55\x15\x51\x10\x44\x44\x10\x42\x04\x20\x10\x44\x44\x81\x04\x10\x41\x08\x10\x44\x55\x55\x54\x55\x54\x55\x55\x55\x55\x51\x55\x15\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x44\x51\x15\x11\x54\x45\x45\x45\x44\x45\x45\x44\x51\x11\x51\x14\x44\x10\x41\x04\x10\x41\x04\x04\x10\x41\x10\x41\x04\x10\x41\x04\x11\x04\x44\x45\x44\x45\x45\x11\x11\x11\x15\x11\x51\x44\x51\x11\x44\x45\x11\x11\x45"
b"\x55\x15\x45\x44\x45\x45\x14\x51\x55\x51\x51\x55\x15\x54\x54\x44\x01\x04\x11\x10\x41\x04\x11\x11\x04\x44\x44\x10\x41\x21\x10\x41\x10\x44\x55\x51\x55\x54\x54\x55\x55\x55\x51\x55\x15\x55\x15\x54\x55\x51\x55\x55\x51"
b"\x45\x44\x51\x55\x44\x51\x51\x54\x44\x54\x54\x45\x51\x15\x14\x41\x10\x41\x04\x44\x10\x41\x00\x00\x40\x44\x44\x44\x10\x41\x04\x10\x44\x44\x44\x54\x51\x45\x45\x44\x51\x44\x55\x15\x51\x15\x54\x55\x45\x15\x14\x51\x15"
b"\x51\x55\x14\x44\x55\x15\x15\x15\x15\x15\x15\x51\x15\x45\x11\x10\x04\x10\x48\x04\x10\x41\x11\x10\x11\x04\x11\x04\x44\x10\x41\x10\x10\x44\x55\x15\x45\x14\x54\x55\x15\x55\x11\x51\x15\x45\x15\x11\x51\x51\x55\x15\x51"
b"\x45\x11\x55\x55\x11\x51\x45\x45\x45\x45\x44\x55\x44\x51\x44\x04\x42\x04\x11\x11\x04\x10\x10\x44\x40\x41\x11\x10\x41\x04\x11\x04\x44\x44\x04\x51\x51\x55\x45\x45\x51\x15\x55\x55\x51\x51\x51\x55\x15\x15\x15\x51\x55"
b"\x51\x55\x11\x11\x54\x54\x51\x51\x58\x91\x55\x11\x55\x14\x41\x00\x10\x41\x01\x01\x11\x04\x04\x04\x10\x44\x10\x44\x10\x41\x04\x41\x01\x04\x44\x51\x15\x11\x54\x54\x55\x44\x51\x11\x15\x15\x15\x11\x51\x55\x45\x15\x11"
b"\x55\x11\x55\x54\x55\x15\x54\x54\x46\xa8\x85\x44\x45\x44\x44\x44\x40\x10\x44\x44\x40\x44\x41\x01\x04\x01\x04\x44\x44\x10\x40\x44\x40\x41\x11\x15\x51\x54\x45\x45\x44\x55\x15\x55\x51\x51\x51\x55\x15\x44\x55\x51\x55"
b"\x45\x15\x11\x15\x11\x44\x45\x11\x5a\xaa\xa2\x55\x44\x44\x00\x41\x04\x04\x00\x41\x11\x04\x10\x44\x10\x44\x44\x11\x04\x44\x44\x10\x11\x04\x44\x44\x55\x15\x54\x54\x55\x45\x51\x44\x55\x15\x15\x15\x51\x55\x44\x54\x55"
b"\x51\x51\x54\x51\x54\x55\x51\x54\x46\xa2\xaa\x28\x54\x41\x11\x04\x11\x01\x10\x10\x44\x41\x04\x10\x41\x00\x11\x11\x11\x04\x11\x04\x41\x04\x04\x44\x45\x44\x45\x45\x45\x51\x54\x55\x45\x51\x51\x51\x14\x51\x55\x15\x11"
b"\x54\x55\x15\x14\x45\x44\x54\x45\x5a\x9a\x2a\xa8\x88\x40\x10\x41\x00\x40\x04\x44\x10\x44\x41\x04\x10\x44\x40\x41\x10\x41\x01\x04\x10\x41\x10\x44\x51\x55\x54\x54\x54\x54\x45\x44\x54\x55\x14\x55\x45\x15\x11\x51\x55"
b"\x45\x45\x45\x45\x51\x55\x15\x14\x5a\xaa\x8a\x2a\xaa\x28\x40\x10\x44\x11\x04\x01\x04\x41\x10\x41\x04\x20\x10\x10\x44\x44\x44\x41\x04\x41\x04\x11\x14\x45\x15\x15\x45\x45\x54\x55\x45\x45\x55\x11\x51\x51\x55\x15\x14"
b"\x51\x51\x51\x51\x15\x12\x8a\xaa\x22\x89\xaa\xa2\xa2\xaa\x28\x41\x01\xa0\x41\x10\x41\x10\x11\x10\x41\x04\x04\x44\x10\x44\x10\x10\x44\x10\x41\x10\x44\x55\x45\x45\x14\x54\x55\x14\x54\x54\x45\x54\x55\x15\x15\x51\x51"
b"\x54\x54\x54\x55\x44\x5a\xa2\x22\xaa\xa9\xa2\x6a\x2a\x8a\x8a\x2a\x9a\x99\x99\xa1\x10\x44\x61\x04\x10\x41\x10\x01\x04\x41\x11\x11\x04\x44\x44\x11\x11\x11\x51\x51\x55\x45\x11\x45\x45\x45\x51\x45\x11\x51\x51\x15\x45"
b"\x45\x45\x15\x11\x55\x18\xaa\x2a\x28\x99\x9a\x2a\xa8\xa2\xa6\xa6\xaa\x2a\x66\x9a\x86\x05\xa6\x11\x04\x10\x04\x41\x04\x11\x04\x10\x41\x04\x11\x04\x44\x51\x15\x15\x14\x55\x55\x54\x54\x54\x54\x55\x55\x15\x15\x51\x55"
b"\x54\x55\x45\x54\x45\x46\x22\xa2\x8a\x2a\x66\xa2\x8a\x99\xaa\x6a\x66\xaa\x69\xa8\xa9\x46\xa1\x90\x41\x04\x40\x10\x41\x10\x44\x44\x10\x44\x40\x44\x11\x14\x51\x45\x45\x44\x44\x45\x45\x45\x45\x44\x45\x51\x51\x15\x11"
b"\x45\x44\x51\x14\x51\x5a\xa8\xa8\xaa\x88\xa1\x0a\x99\xa8\xa2\xa6\x66\x25\x9a\xaa\xaa\x66\x1a\xa4\x10\x10\x11\x04\x10\x44\x41\x04\x44\x41\x11\x01\x11\x05\x14\x54\x54\x55\x55\x51\x51\x54\x54\x55\x51\x15\x15\x51\x55"
b"\x51\x51\x55\x45\x14\x48\x8a\x2a\x22\xa8\xa8\x80\xa2\x8a\xa6\x59\x9a\xa9\x96\x28\x99\xa9\xa9\x94\x41\x04\x10\x40\x44\x04\x10\x41\x04\x10\x44\x44\x10\x44\x55\x45\x45\x45\x11\x14\x55\x15\x45\x45\x15\x51\x51\x54\x51"
b"\x54\x54\x44\x55\x45\x5a\xa2\xa2\xa2\x2a\x2a\xa6\xa8\x0a\x19\x96\x62\xaa\x66\x8a\xaa\x5a\x69\x52\x10\x41\x04\x04\x01\x01\x11\x10\x41\x04\x41\x11\x04\x44\x41\x51\x54\x55\x55\x45\x45\x44\x54\x55\x51\x15\x15\x15\x15"
b"\x45\x15\x55\x44\x54\x44\xaa\x28\xa8\x88\x88\x8a\x69\x80\x16\x66\x98\x86\x99\xa8\x69\x99\xa5\x91\x04\x10\x41\x04\x81\x10\x44\x44\x44\x44\x10\x41\x11\x11\x14\x54\x45\x44\x45\x51\x51\x55\x45\x44\x55\x51\x51\x51\x51"
b"\x51\x44\x51\x45\x45\x5a\x22\x8a\x2a\xa2\xa8\xa2\xaa\xaa\x02\x69\xaa\xaa\x99\xaa\x95\x9a\x99\x50\x41\x04\x10\x40\x40\x44\x10\x41\x04\x01\x11\x11\x04\x11\x05\x15\x54\x55\x51\x15\x14\x44\x54\x55\x11\x15\x15\x15\x15"
b"\x55\x55\x14\x54\x51\x12\xa8\xaa\x88\x8a\x2a\x2a\x66\x4a\xa8\x44\x8a\x2a\xaa\x66\x99\xaa\x66\x24\x10\x41\x04\x10\x44\x01\x04\x11\x11\x11\x01\x04\x41\x10\x44\x44\x45\x45\x15\x51\x55\x55\x15\x45\x55\x51\x51\x51\x45"
b"\x44\x45\x45\x45\x15\x58\x8a\x88\xa8\xa2\x88\xa2\xa9\xa2\x8a\xa8\x00\x88\xaa\x69\x96\x58\xa6\xaa\x88\x44\x01\x04\x01\x10\x41\x10\x41\x10\x44\x41\x11\x04\x44\x45\x54\x55\x44\x55\x11\x11\x44\x54\x44\x55\x15\x15\x51"
b"\x55\x51\x51\x55\x51\x12\xa2\xaa\x1a\xa8\xa2\x8a\x6a\x2a\xa2\x8a\xa8\x01\x26\x96\x59\x99\xa6\x22\xa8\xa2\x10\x41\x10\x04\x10\x44\x10\x44\x10\x44\x10\x44\x44\x44\x45\x44\x55\x11\x55\x54\x55\x45\x55\x11\x51\x51\x15"
b"\x44\x54\x54\x44\x55\x1a\x28\x89\x88\x8a\x28\xa2\x26\x88\xa8\xa2\x22\xa0\x02\x66\x9a\x99\x9a\xa8\x8a\x2a\xa2\x04\x04\x41\x04\x04\x44\x11\x04\x11\x04\x41\x04\x44\x51\x55\x11\x55\x14\x55\x14\x54\x45\x55\x15\x15\x51"
b"\x55\x15\x45\x55\x11\x52\x8a\xa2\xaa\xa2\x8a\x2a\x88\xaa\x2a\x2a\xa8\xaa\xa0\x69\xa8\x69\x98\x8a\xaa\x88\xa8\x62\x10\x10\x41\x10\x41\x10\x41\x04\x44\x44\x44\x44\x44\x45\x55\x15\x45\x11\x45\x45\x51\x45\x51\x51\x55"
b"\x45\x44\x54\x45\x54\x52\xa2\x28\x88\xaa\xa2\xa2\x2a\x28\xa2\xa2\x22\x22\x28\xa8\x81\x99\xa6\xa8\x88\xaa\x2a\xaa\x89\x04\x04\x04\x11\x04\x44\x40\x41\x04\x10\x44\x45\x51\x45\x44\x55\x55\x54\x54\x54\x54\x55\x15\x11"
b"\x51\x55\x45\x51\x15\x18\xa2\x8a\xaa\x22\x2a\x28\xa2\x8a\x8a\x2a\x2a\x8a\x2a\xaa\xa0\x89\x98\xaa\xaa\x22\x8a\x22\xa2\xa0\x41\x01\x11\x11\x04\x44\x10\x41\x04\x44\x44\x45\x14\x55\x44\x44\x45\x45\x45\x45\x11\x51\x55"
b"\x54\x44\x51\x15\x45\x52\x28\xa2\x22\xaa\x4a\x8a\x28\xa2\xa2\x8a\x88\xa2\x88\x9a\x4a\x84\x86\x88\x8a\xaa\xa2\xa8\xaa\xaa\x10\x41\x01\x04\x44\x11\x11\x11\x11\x04\x44\x51\x45\x44\x55\x55\x51\x51\x54\x55\x54\x54\x51"
b"\x45\x55\x15\x51\x51\x1a\x8a\x2a\x28\x88\xa2\x8a\x8a\x28\xa8\xa2\xaa\x28\x8a\x2a\xa8\xaa\x20\x06\xa2\x21\xa8\xaa\x18\x69\x01\x10\x44\x41\x04\x44\x10\x41\x04\x41\x11\x14\x54\x55\x44\x44\x54\x54\x55\x11\x15\x45\x55"
b"\x54\x45\x51\x14\x55\x52\x22\x8a\x8a\xaa\xa8\xa2\x28\xa2\x29\x28\x84\xa2\xa2\xa6\x8a\x22\xaa\x00\x06\xaa\x8a\x89\xaa\xaa\x10\x04\x01\x11\x11\x11\x04\x10\x44\x11\x11\x11\x45\x51\x55\x55\x15\x15\x11\x55\x51\x54\x45"
b"\x45\x54\x55\x55\x11\x18\xa8\xa2\x28\x88\x8a\x2a\x8a\x2a\x8a\x8a\x8a\x28\xa2\x2a\xa2\xa8\x88\xa8\x40\x04\x9a\xa8\xa8\xaa\x04\x41\x10\x10\x41\x04\x44\x44\x41\x10\x44\x44\x54\x55\x11\x15\x45\x45\x55\x11\x14\x45\x51"
b"\x54\x45\x14\x45\x55\x0a\x2a\x28\xa2\xaa\x2a\x88\xa2\x88\xa2\xa2\xa2\x8a\x2a\x20\x8a\x2a\x8a\x8a\x28\x02\xa2\x8a\xaa\x9a\x10\x10\x04\x04\x44\x44\x44\x10\x11\x04\x44\x45\x15\x11\x55\x44\x54\x54\x45\x55\x45\x51\x15"
b"\x45\x55\x51\x51\x11\x12\x88\x8a\x28\x8a\x88\xaa\x28\xa2\x28\x88\xa8\xa8\xa2\x8a\xa2\x88\xa8\xa2\x8a\x88\xaa\xaa\x1a\x29\x04\x41\x11\x04\x11\x11\x11\x11\x10\x44\x11\x11\x11\x54\x44\x55\x15\x15\x51\x11\x51\x15\x51"
b"\x54\x51\x15\x15\x44\x08\xa2\xa2\x8a\x88\xaa\x22\x8a\x2a\x22\xaa\x22\x8a\x28\xa2\x28\xa2\x8a\x28\xa2\x2a\x28\x61\xaa\xaa\x10\x10\x00\x41\x04\x44\x44\x44\x04\x11\x11\x11\x14\x45\x55\x45\x45\x45\x15\x54\x55\x51\x55"
b"\x45\x45\x45\x44\x41\x1a\x28\x8a\x22\x8a\x4a\xa8\xa2\x88\xa8\x88\xa8\xa2\x8a\x2a\x22\x28\xa2\xaa\x28\xa2\x8a\x2a\xaa\x9a\x04\x44\x44\x10\x41\x11\x11\x04\x44\x41\x04\x44\x44\x51\x11\x14\x54\x54\x54\x45\x11\x14\x44"
b"\x54\x54\x54\x54\x40\x08\x8a\xa2\xa2\xa2\x28\x8a\x68\xaa\x22\x2a\x22\x8a\x2a\x88\xaa\x8a\x2a\x22\x8a\x28\xa2\x9a\x8a\x89\x44\x01\x01\x04\x10\x41\x11\x44\x41\x10\x41\x04\x45\x15\x55\x45\x45\x45\x15\x55\x55\x55\x55"
b"\x45\x45\x45\x44\x11\x06\xa2\x28\x88\x8a\x8a\xa2\x2a\x22\x8a\x88\xa8\xa2\x88\xaa\x22\x22\x8a\x8a\x8a\x8a\x28\x9a\x9a\xaa\x04\x44\x44\x10\x44\x11\x10\x44\x50\x44\x11\x11\x11\x44\x44\x54\x54\x51\x51\x11\x44\x44\x45"
b"\x54\x54\x54\x41\x00\x48\x8a\x22\x8a\x22\x88\xaa\x8a\x8a\x28\x8a\x28\xa8\xa8\x88\xa2\xa8\xa2\xa2\xa2\x8a\x8a\x15\xa8\x6a\x41\x01\x01\x04\x01\x10\x44\x44\x11\x04\x41\x10\x44\x11\x55\x15\x15\x15\x15\x54\x55\x55\x51"
b"\x55\x55\x44\x40\x44\x0a\x22\x88\xa2\xa8\xa8\x88\xa2\xa2\x8a\x22\x8a\x2a\x2a\x8a\x28\x8a\x28\x62\x28\xa2\x28\xa6\x6a\xaa\x10\x44\x44\x10\x44\x04\x11\x11\x44\x44\x11\x04\x41\x14\x45\x45\x45\x45\x44\x45\x44\x44\x51"
b"\x45\x11\x51\x04\x01\x08\xa8\xaa\x28\x88\x8a\x8a\x28\xa8\xa2\xa8\xa2\x88\x88\xaa\x8a\x22\x8a\x2a\x8a\x28\xa2\x96\x6a\xa6\x04\x40\x41\x04\x10\x41\x11\x11\x14\x44\x41\x10\x44\x44\x51\x11\x11\x51\x55\x54\x55\x55\x15"
b"\x51\x54\x40\x41\x10\x4a\x28\x88\x8a\x28\xa2\x2a\x8a\x2a\x28\x8a\x28\xa2\xa8\x88\xa2\xa8\xa2\x88\xa2\x8a\x28\x99\x59\xaa\x10\x44\x10\x41\x04\x10\x41\x11\x11\x11\x11\x04\x10\x44\x45\x55\x54\x54\x44\x45\x44\x44\x51"
b"\x54\x44\x41\x00\x00\x06\x22\x8a\xa2\x8a\x28\xa2\x2a\x4a\x86\x88\x8a\x28\x86\xa9\x28\x8a\x28\xa2\x8a\xa2\x8a\x19\x99\x89\x04\x41\x10\x41\x01\x04\x10\x44\x45\x11\x10\x44\x44\x44\x44\x44\x45\x15\x55\x51\x51\x55\x15"
b"\x45\x50\x10\x11\x11\x0a\x28\xa2\x22\x22\x8a\x28\xa2\xa2\xa2\xa2\xa2\x8a\x88\x88\xaa\x28\x8a\x28\xa2\x28\xaa\x99\x99\xaa\x44\x11\x04\x10\x44\x41\x04\x10\x44\x51\x14\x41\x04\x11\x14\x55\x51\x45\x11\x14\x54\x51\x51"
b"\x54\x44\x04\x04\x00\x48\xa2\x8a\x28\xa8\xa2\x8a\x28\xa2\x28\xa8\x88\xa2\x2a\x8a\x22\x8a\xa2\x8a\x2a\x8a\x88\x99\x66\x5a\x01\x04\x44\x44\x40\x10\x41\x04\x44\x45\x10\x44\x41\x04\x44\x44\x55\x51\x55\x55\x15\x15\x15"
b"\x44\x41\x01\x00\x44\x0a\x28\xa2\x8a\x21\x28\x8a\x8a\x2a\x8a\x28\xa8\x8a\x88\xa2\xa8\xa1\x28\xa2\x88\x62\xa2\x99\x99\x9a\x10\x41\x04\x10\x11\x04\x10\x44\x11\x11\x11\x10\x44\x41\x11\x51\x44\x54\x44\x45\x15\x45\x51"
b"\x51\x04\x41\x10\x80\x48\x8a\x28\xa2\x8a\x22\x88\xa2\x88\xaa\x2a\x28\xa2\x2a\x28\x8a\x2a\x8a\x28\xaa\x28\xa8\x99\x99\x9a\x11\x10\x41\x05\x04\x41\x04\x41\x11\x11\x14\x44\x10\x44\x11\x15\x51\x45\x51\x51\x44\x51\x15"
b"\x10\x40\x10\x04\x10\x0a\xa2\x8a\x22\x22\x88\xa2\x28\xaa\x22\x8a\x22\x28\x48\xa8\xa2\xa2\x22\x8a\x22\x8a\x22\x16\x59\x9a\x01\x04\x11\x10\x41\x10\x44\x10\x44\x45\x11\x11\x04\x44\x44\x51\x15\x51\x15\x15\x45\x54\x51"
b"\x04\x04\x04\x80\x04\x48\x88\xa2\x28\xa8\xa8\x8a\x8a\x22\xa8\xa2\xaa\x86\x8a\x22\xa8\xa2\xa8\xa2\x88\xa2\xaa\xa5\x99\x9a\x10\x41\x11\x04\x44\x11\x01\x04\x10\x44\x54\x44\x44\x11\x11\x15\x14\x55\x45\x44\x54\x45\x45"
b"\x10\x41\x00\x11\x04\x06\x28\x8a\x28\x8a\x22\xa2\x22\x8a\x2a\x28\x88\x62\x22\x8a\x2a\x28\x8a\x28\xaa\x28\x88\x99\x99\x9a\x55\x50\x40\x44\x11\x04\x44\x41\x04\x44\x45\x14\x44\x44\x44\x51\x45\x11\x51\x55\x15\x54\x54"
b"\x08\x10\x44\x10\x40\x48\x8a\x22\x8a\x22\x28\x8a\x28\xa2\x8a\x8a\x86\x22\xa8\xa2\x88\xa2\xa2\x8a\x22\x8a\x2a\x65\x99\x98\x54\x44\x11\x04\x10\x40\x40\x10\x44\x10\x44\x51\x11\x11\x11\x15\x51\x54\x54\x51\x44\x45\x45"
b"\x04\x04\x01\x00\x10\x0a\xa2\xa8\xa1\xa2\x88\xa2\x88\x88\xa2\x28\xa2\xa8\x88\xa2\x2a\x28\xa8\xa2\x88\xa2\x88\x66\x66\x6a\x94\x11\x10\x41\x04\x44\x11\x04\x41\x04\x45\x15\x44\x44\x45\x11\x45\x45\x15\x14\x55\x54\x51"
b"\x41\x01\x10\x44\x04\x48\x88\x8a\x22\x28\xa2\x28\x4a\x2a\x28\xaa\x28\x8a\x28\x8a\x88\x8a\x2a\x28\xa8\xa2\xa2\x65\x96\x6a\x11\x01\x04\x11\x10\x41\x11\x10\x10\x44\x44\x44\x51\x11\x11\x45\x51\x55\x45\x45\x44\x45\x15"
b"\x00\x40\x04\x01\x00\x08\xa2\x88\xa2\x88\x8a\x88\xa2\x88\x8a\x21\xa2\xa2\x8a\x22\x2a\xa2\x88\xaa\x22\x28\x8a\x59\x99\x99\x95\x44\x12\x10\x44\x11\x04\x11\x04\x44\x11\x14\x54\x51\x51\x51\x15\x11\x51\x51\x55\x51\x51"
b"\x10\x11\x20\x48\x44\x4a\x28\xa2\x28\x8a\x22\x28\x88\xa2\xa2\xa8\xa8\xa8\xa2\xa2\x88\x8a\x2a\x22\x8a\x8a\x28\x65\x99\x9a\x54\x55\x41\x04\x04\x44\x41\x04\x41\x04\x41\x11\x14\x44\x51\x15\x45\x54\x45\x14\x44\x55\x15"
b"\x04\x40\x40\x10\x00\x08\x8a\x2a\x22\x88\xa8\x8a\x2a\x28\x84\x8a\x2a\x22\x28\x88\xa2\x28\xa2\xa1\xa2\x22\x8a\x66\x66\x62\x95\x55\x55\x41\x10\x80\x10\x41\x10\x41\x11\x11\x45\x15\x15\x44\x51\x14\x51\x45\x45\x11\x45"
b"\x10\x10\x11\x01\x04\x4a\x88\x88\xa8\xa2\x22\xa2\x88\x88\xa8\xa2\x8a\x2a\x8a\x2a\x22\x8a\x28\xa8\xa2\xa8\xa2\x65\x96\x5a\x95\x51\x54\x55\x21\x11\x11\x04\x10\x44\x11\x11\x11\x45\x44\x55\x15\x45\x54\x51\x51\x54\x51"
b"\x01\x04\x00\x40\x40\x04\xa2\x8a\x22\x2a\x28\x88\x8a\x2a\x22\x28\xa2\xa2\xa2\x88\xa8\xa2\x4a\x22\x28\x8a\x28\x59\x99\xaa\x45\x15\x55\x55\x55\x04\x10\x41\x04\x11\x10\x44\x44\x51\x55\x11\x51\x14\x45\x14\x54\x45\x55"
b"\x10\x01\x10\x10\x11\x0a\x28\xa2\x28\x88\x8a\x28\xa2\x82\x2a\x28\xa2\x28\x8a\x28\x8a\x28\xa2\x2a\x8a\x8a\x2a\x66\x66\x66\x95\x55\x45\x45\x14\x55\x04\x10\x44\x41\x04\x44\x44\x54\x45\x45\x15\x45\x51\x45\x15\x51\x11"
b"\x08\x40\x04\x04\x00\x42\x8a\x28\x8a\x8a\x88\x8a\x28\xa2\x88\x8a\x2a\x8a\xa2\x8a\x22\x22\x2a\x22\x28\xa2\x88\x65\x99\x6a\x95\x55\x55\x55\x55\x51\x51\x04\x10\x10\x41\x10\x45\x11\x14\x51\x51\x51\x15\x51\x44\x55\x15"
b"\x04\x11\x01\x04\x44\x08\xa2\x22\xa2\x22\x2a\x22\x88\x88\x8a\x22\x88\xa2\x28\xa2\x8a\x2a\x22\xa2\x8a\x28\xa2\x59\x66\x6a\x55\x51\x55\x45\x14\x55\x44\x41\x04\x44\x10\x44\x41\x15\x45\x15\x14\x45\x44\x51\x15\x11\x51"
b"\x01\x00\x41\x00\x02\x0a\x22\x88\x88\xa2\x88\xa8\x8a\x2a\x22\xa2\x28\xa2\x8a\x28\xa2\x88\xa2\x28\xa2\x8a\x28\x99\x99\xaa\x94\x55\x51\x55\x55\x55\x04\x11\x10\x11\x04\x11\x11\x44\x51\x51\x45\x51\x55\x11\x41\x14\x45"
b"\x10\x10\x40\x44\x40\x48\xa8\xa8\xa2\x28\x8a\x22\x22\x88\xa2\x22\x8a\x28\xa2\x8a\x28\xa2\x28\x8a\x28\xa2\x8a\x59\x99\x6a\x95\x55\x55\x55\x45\x44\x44\x41\x04\x40\x44\x41\x11\x15\x14\x54\x54\x51\x11\x44\x51\x45\x51"
b"\x04\x04\x20\x00\x10\x4a\x22\x22\x2a\x22\x88\x8a\x88\x8a\x28\xa2\x22\x8a\x2a\xa2\x8a\x28\x8a\x8a\x22\x28\xa1\x99\x99\xa6\x95\x55\x15\x51\x54\x54\x41\x04\x10\x11\x04\x10\x45\x45\x45\x15\x11\x51\x54\x54\x44\x51\x14"
b"\x01\x01\x04\x44\x04\x04\x8a\x2a\x22\x88\xa2\x88\xa2\x88\x8a\x22\x88\xa2\x88\x8a\xa2\x8a\x88\xa2\x8a\x8a\x2a\x59\x66\x6a\x95\x51\x55\x15\x55\x50\x40\x41\x04\x40\x41\x04\x41\x14\x51\x45\x45\x14\x45\x11\x11\x11\x45"
b"\x80\x40\x10\x01\x01\x0a\x22\x88\xa2\x2a\x28\x92\x28\xa2\x88\xa2\x28\x88\xa8\xa2\x28\xa2\x28\x88\xa2\x22\x89\x99\x99\xaa\x15\x15\x55\x55\x55\x44\x11\x10\x42\x10\x10\x44\x15\x51\x45\x44\x51\x45\x51\x51\x44\x44\x54"
b"\x10\x11\x01\x10\x40\x42\xa2\x28\x8a\x22\x12\x28\x8a\x28\x62\x28\x8a\x2a\x2a\x2a\x28\x88\x8a\x28\xa2\xa8\xa1\x96\x66\x69\x95\x55\x55\x51\x51\x01\x10\x11\x10\x11\x04\x41\x44\x54\x54\x55\x15\x14\x44\x44\x51\x11\x15"
b"\x04\x00\x40\x04\x10\x18\x8a\x88\xa2\x89\x28\x8a\x22\x22\x28\x8a\x22\x88\x88\xa2\x8a\x8a\x88\x8a\x28\x89\x29\x66\x66\x6a\x95\x55\x45\x15\x54\x44\x04\x40\x84\x41\x10\x44\x55\x15\x45\x11\x45\x45\x51\x51\x11\x44\x44"
b"\x04\x44\x04\x40\x81\x08\xa2\x28\x88\x92\x8a\x22\x8a\x28\x8a\x22\x88\xa2\x8a\x28\xa2\x62\x2a\x88\x8a\x12\x8a\x66\x66\x62\x95\x55\x55\x55\x51\x01\x10\x11\x04\x10\x04\x45\x11\x44\x51\x55\x14\x51\x14\x45\x11\x14\x44"
b"\x40\x00\x40\x10\x10\x0a\x22\x8a\x28\x88\x88\xa2\x22\x8a\x22\x88\xa2\x28\xa2\x8a\x18\x8a\x88\xa2\x88\xa2\x21\x99\x99\xaa\x95\x45\x55\x54\x44\x44\x04\x10\x41\x04\x44\x44\x54\x55\x15\x11\x45\x14\x44\x51\x45\x11\x14"
b"\x04\x44\x04\x04\x04\x4a\x28\x88\x86\x28\xa2\x28\xa8\x88\xa2\x28\x8a\x22\x28\x92\x8a\xa2\x28\x84\xa2\x28\xa9\x99\x99\xa6\x91\x55\x51\x55\x41\x04\x41\x04\x10\x44\x41\x15\x14\x45\x45\x14\x51\x51\x45\x11\x11\x14\x45"
b"\x04\x02\x10\x41\x00\x04\x8a\x2a\x22\x8a\x2a\x22\x22\x8a\x28\x8a\x22\x8a\x21\x28\xa2\x2a\x8a\x2a\x2a\x2a\x21\x96\x66\x6a\x15\x55\x15\x45\x10\x41\x20\x41\x04\x41\x11\x11\x45\x51\x51\x45\x14\x44\x41\x11\x45\x45\x10"
b"\x00\x40\x04\x20\x44\x4a\xa2\x88\xa8\x88\x88\xa8\xa2\x22\x8a\x22\xa2\x22\x4a\x28\xa2\x88\xa2\x88\x88\x88\xa9\x66\x66\x6a\x95\x55\x55\x54\x04\x12\x04\x10\x40\x10\x44\x54\x51\x14\x44\x51\x45\x54\x51\x44\x44\x41\x14"
b"\x10\x04\x40\x04\x00\x08\x88\x8a\x22\x8a\x22\x22\x28\xa8\x88\xa2\x28\x92\x22\x8a\x28\xa2\x28\xa2\x8a\x28\x8a\x66\x66\x62\x95\x55\x54\x51\x11\x04\x41\x04\x11\x04\x11\x15\x15\x14\x55\x14\x51\x05\x14\x44\x44\x51\x11"
b"\x08\x40\x04\x40\x41\x0a\x28\xa2\x28\xa2\x8a\x28\x8a\x22\x28\xa2\x8a\x28\xa2\x22\x8a\x2a\x8a\x28\xa2\x88\xa1\x99\x99\xa9\x95\x45\x45\x44\x04\x40\x44\x04\x10\x41\x15\x11\x45\x45\x11\x45\x14\x51\x11\x11\x11\x11\x11"
b"\x00\x10\x40\x10\x10\x12\x8a\x28\x88\x88\xa2\x8a\x22\x28\x8a\x28\x88\x8a\x22\x88\xa2\x88\xa2\x8a\x22\x28\x89\x96\x66\x6a\x94\x55\x55\x01\x01\x04\x01\x01\x04\x11\x11\x44\x51\x11\x45\x11\x44\x44\x44\x45\x11\x11\x11"
b"\x11\x00\x11\x01\x01\x08\x8a\x22\xa2\x8a\x22\x22\x8a\x22\x88\x88\x8a\x22\x28\xa2\x28\xa2\x28\xa2\x28\x8a\x29\x99\x99\xa2\x55\x55\x54\x44\x48\x41\x11\x10\x41\x04\x54\x55\x15\x14\x51\x54\x51\x11\x11\x44\x51\x11\x10"
b"\x00\x11\x00\x40\x10\x00\x48\xa8\x88\xa2\x28\xa2\x22\x88\xa2\x8a\x22\x8a\x22\x28\x88\x8a\x8a\x28\x8a\x22\x89\x99\x99\x2a\x95\x54\x54\x10\x10\x11\x04\x10\x10\x41\x11\x44\x51\x45\x14\x44\x44\x44\x44\x44\x44\x44\x45"
b"\x11\x00\x84\x04\x02\x10\x08\x22\x8a\x22\x8a\x28\xa8\xa2\x28\x88\xa2\x22\x8a\x22\x8a\x28\xa2\x8a\xa2\x88\xa1\x99\x66\xaa\x15\x45\x50\x41\x04\x40\x40\x44\x01\x11\x14\x45\x11\x44\x51\x14\x44\x44\x44\x44\x44\x44\x41"
b"\x00\x48\x00\x40\x80\x04\x01\x00\x62\x88\xa2\x22\x22\x28\x88\xa2\x28\xa2\x22\x28\xa2\x8a\x28\xa2\x28\xa2\x29\x96\x66\xa1\x95\x55\x41\x04\x40\x11\x04\x01\x10\x45\x15\x51\x44\x55\x14\x51\x11\x04\x44\x45\x11\x11\x10"
b"\x10\x01\x10\x20\x11\x02\x10\x10\x08\xa8\x8a\x28\x8a\x22\x8a\x28\x8a\x22\x8a\x22\x22\x22\x8a\x28\x8a\x28\x86\x66\x66\x6a\x55\x54\x10\x42\x11\x00\x41\x10\x41\x11\x44\x44\x55\x11\x15\x14\x41\x10\x44\x44\x45\x11\x11"
b"\x21\x10\x04\x01\x00\x40\x01\x08\x40\x06\x22\x8a\x22\x28\xa2\x12\x88\xa2\x22\x8a\x28\xa2\x22\x8a\x88\x8a\x26\x66\x9a\xa6\x95\x15\x04\x10\x04\x11\x10\x04\x10\x44\x54\x51\x11\x44\x44\x44\x41\x04\x11\x11\x11\x11\x11"
b"\x01\x01\x01\x10\x10\x21\x20\x80\x21\x00\x28\x88\xa2\x88\x86\x28\xa2\x28\xa2\x22\x88\x8a\x28\xa2\x8a\x8a\x29\x99\xa6\x6a\x95\x54\x41\x04\x41\x10\x04\x41\x04\x55\x14\x45\x44\x45\x45\x11\x10\x44\x41\x11\x11\x11\x10"
b"\x10\x10\x10\x01\x01\x00\x00\x12\x00\x48\x00\x8a\x28\x8a\x22\x88\x8a\x22\x28\xa2\x22\x88\x8a\x28\xa2\x22\x86\x66\x66\x89\x91\x50\x10\x41\x10\x04\x40\x40\x45\x44\x45\x14\x45\x44\x51\x10\x04\x01\x10\x44\x44\x44\x44"
b"\x01\x01\x02\x10\x10\x10\x44\x00\x42\x01\x10\x02\x22\x88\xa2\x28\xa2\x28\x8a\x22\x88\xa2\xa2\x88\x8a\x88\xa6\x59\x9a\x6a\x95\x41\x04\x20\x04\x40\x44\x11\x10\x51\x51\x44\x51\x15\x14\x44\x41\x10\x11\x05\x11\x11\x11"
b"\x10\x20\x00\x04\x08\x08\x02\x10\x10\x40\x08\x40\x42\x28\x88\x8a\x22\x8a\x22\x28\x8a\x28\x88\x8a\x12\x8a\x26\x65\x99\xaa\x15\x04\x21\x04\x01\x04\x11\x04\x45\x15\x14\x51\x45\x44\x51\x01\x04\x11\x04\x41\x11\x11\x14"
b"\x01\x01\x04\x40\x80\x40\x40\x08\x00\x08\x00\x20\x04\x08\xa2\x88\x88\x88\xa2\x88\xa2\x22\x28\xa2\xa2\x8a\x26\x59\x99\xa1\x94\x12\x00\x41\x10\x11\x00\x44\x45\x44\x45\x14\x50\x45\x14\x44\x41\x00\x41\x11\x11\x14\x44"
b"\x10\x10\x80\x01\x04\x04\x08\x41\x21\x01\x21\x04\x00\x41\x22\x22\x8a\x28\x88\x8a\x22\x28\x88\x88\x88\xa2\x85\x96\x59\xaa\x90\x80\x44\x10\x04\x00\x44\x11\x11\x15\x11\x45\x15\x11\x44\x40\x10\x11\x10\x01\x04\x44\x44"
b"\x01\x00\x10\x40\x00\x42\x00\x00\x00\x80\x00\x00\x88\x00\x04\x88\xa2\x22\x28\xa2\x22\x88\xa2\x8a\x2a\x28\xa9\x99\x9a\x9a\x81\x04\x01\x01\x01\x10\x04\x11\x44\x45\x14\x44\x44\x51\x11\x04\x04\x40\x04\x44\x41\x11\x11"
b"\x20\x11\x00\x10\x40\x00\x44\x10\x48\x12\x12\x10\x00\x48\x00\x02\x22\x8a\x22\x22\x28\x8a\x22\x22\x88\x8a\x25\x99\x9a\xaa\x10\x10\x40\x41\x10\x04\x41\x14\x51\x41\x44\x51\x51\x15\x10\x41\x10\x11\x10\x10\x10\x44\x44"
b"\x01\x00\x10\x00\x21\x04\x01\x00\x00\x00\x00\x08\x40\x01\x08\x48\x08\xa2\x28\x8a\x22\x22\x22\x88\x8a\x22\x89\x66\x69\xa4\x04\x04\x10\x10\x04\x40\x10\x44\x44\x54\x45\x11\x14\x45\x10\x10\x41\x01\x04\x11\x04\x11\x11"
b"\x10\x21\x01\x21\x00\x40\x80\x20\x44\x10\x44\x00\x12\x10\x80\x04\x04\x12\x88\xa2\x22\x8a\x28\x8a\x22\x88\xa6\x59\x9a\x90\x41\x01\x04\x04\x40\x11\x04\x44\x44\x44\x51\x11\x11\x41\x04\x04\x10\x44\x41\x00\x44\x11\x11"
b"\x04\x00\x10\x00\x10\x08\x00\x04\x00\x04\x02\x04\x00\x00\x10\x80\x40\x00\x8a\x22\x88\xa2\x22\x22\x88\xa8\x86\x66\xaa\x41\x00\x40\x41\x00\x04\x00\x01\x11\x45\x14\x44\x51\x44\x50\x41\x11\x04\x10\x10\x44\x01\x04\x41"
b"\x41\x11\x00\x10\x02\x00\x44\x40\x08\x40\x81\x02\x04\x20\x00\x04\x21\x08\x41\x22\x28\x88\x88\xa2\x28\x8a\x26\x59\xa4\x10\x20\x11\x00\x44\x41\x11\x11\x11\x45\x44\x51\x11\x14\x44\x10\x04\x04\x04\x04\x01\x10\x40\x44"
b"\x00\x00\x08\x01\x10\x40\x00\x08\x40\x08\x10\x20\x02\x01\x20\x40\x00\x81\x00\x04\x88\x8a\x28\x88\x88\xa2\xa5\x9a\xa4\x01\x04\x40\x11\x00\x04\x00\x44\x44\x44\x45\x11\x44\x44\x41\x04\x41\x01\x01\x11\x10\x44\x04\x11"
b"\x12\x04\x01\x00\x04\x10\x48\x00\x08\x40\x42\x01\x20\x10\x01\x08\x48\x10\x22\x08\x0a\x22\x88\x89\x22\x22\x26\x6a\x41\x10\x04\x04\x00\x11\x01\x11\x14\x44\x44\x44\x44\x45\x14\x10\x40\x10\x41\x10\x00\x10\x01\x04\x40"
b"\x00\x40\x40\x11\x00\x00\x01\x04\x00\x04\x00\x40\x01\x00\x42\x00\x00\x02\x00\x00\x40\x48\x88\xa2\x28\x88\x99\xa6\x11\x08\x00\x40\x44\x00\x40\x04\x11\x14\x44\x51\x11\x11\x44\x44\x04\x04\x10\x04\x44\x04\x44\x40\x11"
b"\x21\x00\x10\x80\x81\x04\x10\x00\x44\x80\x84\x01\x00\x48\x20\x44\x04\x20\x11\x10\x04\x00\x62\x22\x22\x28\x99\xa8\x00\x81\x10\x10\x01\x10\x11\x04\x44\x44\x44\x44\x51\x11\x44\x01\x01\x01\x04\x41\x01\x10\x00\x11\x04"
b"\x00\x12\x01\x04\x10\x02\x01\x04\x00\x04\x01\x00\x10\x80\x04\x00\x80\x04\x00\x02\x00\x20\x02\x88\x88\x88\x99\xa1\x11\x00\x04\x08\x40\x04\x00\x51\x44\x44\x44\x45\x11\x51\x11\x10\x10\x40\x00\x40\x44\x04\x44\x40\x40"
b"\x11\x00\x00\x00\x04\x20\x00\x00\x20\x40\x40\x92\x04\x04\x00\x08\x01\x00\x42\x00\x10\x04\x08\x0a\x22\x88\xa6\x10\x40\x44\x01\x04\x10\x40\x44\x11\x14\x51\x44\x44\x44\x11\x44\x04\x04\x11\x04\x11\x04\x10\x44\x11\x04"
b"\x00\x41\x04\x44\x40\x01\x04\x82\x04\x00\x20\x00\x42\x01\x02\x00\x40\x20\x00\x41\x02\x02\x00\x40\x28\x88\x9a\x04\x20\x01\x10\x40\x04\x01\x01\x11\x14\x11\x11\x11\x44\x51\x11\x01\x01\x00\x10\x04\x10\x40\x01\x00\x41"
b"\x10\x10\x10\x00\x08\x40\x40\x00\x40\x84\x04\x10\x00\x10\x20\x44\x08\x01\x04\x00\x20\x41\x10\x01\x00\x62\x24\x10\x04\x41\x00\x04\x10\x40\x44\x45\x05\x11\x44\x51\x11\x11\x01\x10\x40\x11\x01\x01\x00\x11\x10\x44\x10"
b"\x04\x01\x02\x04\x10\x04\x01\x04\x01\x02\x01\x02\x10\x02\x00\x00\x01\x00\x80\x82\x00\x20\x08\x10\x04\x02\x90\x01\x00\x10\x11\x01\x00\x10\x81\x11\x41\x11\x14\x11\x11\x11\x10\x04\x11\x00\x10\x40\x44\x41\x01\x01\x04"
b"\x81\x00\x10\x00\x00\x40\x20\x42\x00\x10\x40\x20\x04\x80\x10\x42\x10\x10\x08\x00\x04\x01\x00\x00\x80\x80\x04\x10\x44\x01\x00\x40\x11\x04\x11\x44\x51\x14\x45\x44\x44\x44\x04\x41\x00\x11\x00\x10\x00\x04\x10\x40\x41")
color_image_inkplate2 = bytearray(
b"\x55\x15\x51\x55\x45\x54\x54\x55\x15\x54\x54\x55\x45\x55\x15\x51\x10\x44\x44\x10\x42\x04\x20\x10\x44\x44\x81\x04\x10\x41\x08\x10\x44\x55\x55\x54\x55\x54\x55\x55\x55\x55\x51\x55\x15\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x44\x51\x15\x11\x54\x45\x45\x45\x44\x45\x45\x44\x51\x11\x51\x14\x44\x10\x41\x04\x10\x41\x04\x04\x10\x41\x10\x41\x04\x10\x41\x04\x11\x04\x44\x45\x44\x45\x45\x11\x11\x11\x15\x11\x51\x44\x51\x11\x44\x45\x11\x11\x45"
b"\x55\x15\x45\x44\x45\x45\x14\x51\x55\x51\x51\x55\x15\x54\x54\x44\x01\x04\x11\x10\x41\x04\x11\x11\x04\x44\x44\x10\x41\x21\x10\x41\x10\x44\x55\x51\x55\x54\x54\x55\x55\x55\x51\x55\x15\x55\x15\x54\x55\x51\x55\x55\x51"
b"\x45\x44\x51\x55\x44\x51\x51\x54\x44\x54\x54\x45\x51\x15\x14\x41\x10\x41\x04\x44\x10\x41\x00\x00\x40\x44\x44\x44\x10\x41\x04\x10\x44\x44\x44\x54\x51\x45\x45\x44\x51\x44\x55\x15\x51\x15\x54\x55\x45\x15\x14\x51\x15"
b"\x51\x55\x14\x44\x55\x15\x15\x15\x15\x15\x15\x51\x15\x45\x11\x10\x04\x10\x48\x04\x10\x41\x11\x10\x11\x04\x11\x04\x44\x10\x41\x10\x10\x44\x55\x15\x45\x14\x54\x55\x15\x55\x11\x51\x15\x45\x15\x11\x51\x51\x55\x15\x51"
b"\x45\x11\x55\x55\x11\x51\x45\x45\x45\x45\x44\x55\x44\x51\x44\x04\x42\x04\x11\x11\x04\x10\x10\x44\x40\x41\x11\x10\x41\x04\x11\x04\x44\x44\x04\x51\x51\x55\x45\x45\x51\x15\x55\x55\x51\x51\x51\x55\x15\x15\x15\x51\x55"
b"\x51\x55\x11\x11\x54\x54\x51\x51\x58\x91\x55\x11\x55\x14\x41\x00\x10\x41\x01\x01\x11\x04\x04\x04\x10\x44\x10\x44\x10\x41\x04\x41\x01\x04\x44\x51\x15\x11\x54\x54\x55\x44\x51\x11\x15\x15\x15\x11\x51\x55\x45\x15\x11"
b"\x55\x11\x55\x54\x55\x15\x54\x54\x46\xa8\x85\x44\x45\x44\x44\x44\x40\x10\x44\x44\x40\x44\x41\x01\x04\x01\x04\x44\x44\x10\x40\x44\x40\x41\x11\x15\x51\x54\x45\x45\x44\x55\x15\x55\x51\x51\x51\x55\x15\x44\x55\x51\x55"
b"\x45\x15\x11\x15\x11\x44\x45\x11\x5a\xaa\xa2\x55\x44\x44\x00\x41\x04\x04\x00\x41\x11\x04\x10\x44\x10\x44\x44\x11\x04\x44\x44\x10\x11\x04\x44\x44\x55\x15\x54\x54\x55\x45\x51\x44\x55\x15\x15\x15\x51\x55\x44\x54\x55"
b"\x51\x51\x54\x51\x54\x55\x51\x54\x46\xa2\xaa\x28\x54\x41\x11\x04\x11\x01\x10\x10\x44\x41\x04\x10\x41\x00\x11\x11\x11\x04\x11\x04\x41\x04\x04\x44\x45\x44\x45\x45\x45\x51\x54\x55\x45\x51\x51\x51\x14\x51\x55\x15\x11"
b"\x54\x55\x15\x14\x45\x44\x54\x45\x5a\x9a\x2a\xa8\x88\x40\x10\x41\x00\x40\x04\x44\x10\x44\x41\x04\x10\x44\x40\x41\x10\x41\x01\x04\x10\x41\x10\x44\x51\x55\x54\x54\x54\x54\x45\x44\x54\x55\x14\x55\x45\x15\x11\x51\x55"
b"\x45\x45\x45\x45\x51\x55\x15\x14\x5a\xaa\x8a\x2a\xaa\x28\x40\x10\x44\x11\x04\x01\x04\x41\x10\x41\x04\x20\x10\x10\x44\x44\x44\x41\x04\x41\x04\x11\x14\x45\x15\x15\x45\x45\x54\x55\x45\x45\x55\x11\x51\x51\x55\x15\x14"
b"\x51\x51\x51\x51\x15\x12\x8a\xaa\x22\x89\xaa\xa2\xa2\xaa\x28\x41\x01\xa0\x41\x10\x41\x10\x11\x10\x41\x04\x04\x44\x10\x44\x10\x10\x44\x10\x41\x10\x44\x55\x45\x45\x14\x54\x55\x14\x54\x54\x45\x54\x55\x15\x15\x51\x51"
b"\x54\x54\x54\x55\x44\x5a\xa2\x22\xaa\xa9\xa2\x6a\x2a\x8a\x8a\x2a\x9a\x99\x99\xa1\x10\x44\x61\x04\x10\x41\x10\x01\x04\x41\x11\x11\x04\x44\x44\x11\x11\x11\x51\x51\x55\x45\x11\x45\x45\x45\x51\x45\x11\x51\x51\x15\x45"
b"\x45\x45\x15\x11\x55\x18\xaa\x2a\x28\x99\x9a\x2a\xa8\xa2\xa6\xa6\xaa\x2a\x66\x9a\x86\x05\xa6\x11\x04\x10\x04\x41\x04\x11\x04\x10\x41\x04\x11\x04\x44\x51\x15\x15\x14\x55\x55\x54\x54\x54\x54\x55\x55\x15\x15\x51\x55"
b"\x54\x55\x45\x54\x45\x46\x22\xa2\x8a\x2a\x66\xa2\x8a\x99\xaa\x6a\x66\xaa\x69\xa8\xa9\x46\xa1\x90\x41\x04\x40\x10\x41\x10\x44\x44\x10\x44\x40\x44\x11\x14\x51\x45\x45\x44\x44\x45\x45\x45\x45\x44\x45\x51\x51\x15\x11"
b"\x45\x44\x51\x14\x51\x5a\xa8\xa8\xaa\x88\xa1\x0a\x99\xa8\xa2\xa6\x66\x25\x9a\xaa\xaa\x66\x1a\xa4\x10\x10\x11\x04\x10\x44\x41\x04\x44\x41\x11\x01\x11\x05\x14\x54\x54\x55\x55\x51\x51\x54\x54\x55\x51\x15\x15\x51\x55"
b"\x51\x51\x55\x45\x14\x48\x8a\x2a\x22\xa8\xa8\x80\xa2\x8a\xa6\x59\x9a\xa9\x96\x28\x99\xa9\xa9\x94\x41\x04\x10\x40\x44\x04\x10\x41\x04\x10\x44\x44\x10\x44\x55\x45\x45\x45\x11\x14\x55\x15\x45\x45\x15\x51\x51\x54\x51"
b"\x54\x54\x44\x55\x45\x5a\xa2\xa2\xa2\x2a\x2a\xa6\xa8\x0a\x19\x96\x62\xaa\x66\x8a\xaa\x5a\x69\x52\x10\x41\x04\x04\x01\x01\x11\x10\x41\x04\x41\x11\x04\x44\x41\x51\x54\x55\x55\x45\x45\x44\x54\x55\x51\x15\x15\x15\x15"
b"\x45\x15\x55\x44\x54\x44\xaa\x28\xa8\x88\x88\x8a\x69\x80\x16\x66\x98\x86\x99\xa8\x69\x99\xa5\x91\x04\x10\x41\x04\x81\x10\x44\x44\x44\x44\x10\x41\x11\x11\x14\x54\x45\x44\x45\x51\x51\x55\x45\x44\x55\x51\x51\x51\x51"
b"\x51\x44\x51\x45\x45\x5a\x22\x8a\x2a\xa2\xa8\xa2\xaa\xaa\x02\x69\xaa\xaa\x99\xaa\x95\x9a\x99\x50\x41\x04\x10\x40\x40\x44\x10\x41\x04\x01\x11\x11\x04\x11\x05\x15\x54\x55\x51\x15\x14\x44\x54\x55\x11\x15\x15\x15\x15"
b"\x55\x55\x14\x54\x51\x12\xa8\xaa\x88\x8a\x2a\x2a\x66\x4a\xa8\x44\x8a\x2a\xaa\x66\x99\xaa\x66\x24\x10\x41\x04\x10\x44\x01\x04\x11\x11\x11\x01\x04\x41\x10\x44\x44\x45\x45\x15\x51\x55\x55\x15\x45\x55\x51\x51\x51\x45"
b"\x44\x45\x45\x45\x15\x58\x8a\x88\xa8\xa2\x88\xa2\xa9\xa2\x8a\xa8\x00\x88\xaa\x69\x96\x58\xa6\xaa\x88\x44\x01\x04\x01\x10\x41\x10\x41\x10\x44\x41\x11\x04\x44\x45\x54\x55\x44\x55\x11\x11\x44\x54\x44\x55\x15\x15\x51"
b"\x55\x51\x51\x55\x51\x12\xa2\xaa\x1a\xa8\xa2\x8a\x6a\x2a\xa2\x8a\xa8\x01\x26\x96\x59\x99\xa6\x22\xa8\xa2\x10\x41\x10\x04\x10\x44\x10\x44\x10\x44\x10\x44\x44\x44\x45\x44\x55\x11\x55\x54\x55\x45\x55\x11\x51\x51\x15"
b"\x44\x54\x54\x44\x55\x1a\x28\x89\x88\x8a\x28\xa2\x26\x88\xa8\xa2\x22\xa0\x02\x66\x9a\x99\x9a\xa8\x8a\x2a\xa2\x04\x04\x41\x04\x04\x44\x11\x04\x11\x04\x41\x04\x44\x51\x55\x11\x55\x14\x55\x14\x54\x45\x55\x15\x15\x51"
b"\x55\x15\x45\x55\x11\x52\x8a\xa2\xaa\xa2\x8a\x2a\x88\xaa\x2a\x2a\xa8\xaa\xa0\x69\xa8\x69\x98\x8a\xaa\x88\xa8\x62\x10\x10\x41\x10\x41\x10\x41\x04\x44\x44\x44\x44\x44\x45\x55\x15\x45\x11\x45\x45\x51\x45\x51\x51\x55"
b"\x45\x44\x54\x45\x54\x52\xa2\x28\x88\xaa\xa2\xa2\x2a\x28\xa2\xa2\x22\x22\x28\xa8\x81\x99\xa6\xa8\x88\xaa\x2a\xaa\x89\x04\x04\x04\x11\x04\x44\x40\x41\x04\x10\x44\x45\x51\x45\x44\x55\x55\x54\x54\x54\x54\x55\x15\x11"
b"\x51\x55\x45\x51\x15\x18\xa2\x8a\xaa\x22\x2a\x28\xa2\x8a\x8a\x2a\x2a\x8a\x2a\xaa\xa0\x89\x98\xaa\xaa\x22\x8a\x22\xa2\xa0\x41\x01\x11\x11\x04\x44\x10\x41\x04\x44\x44\x45\x14\x55\x44\x44\x45\x45\x45\x45\x11\x51\x55"
b"\x54\x44\x51\x15\x45\x52\x28\xa2\x22\xaa\x4a\x8a\x28\xa2\xa2\x8a\x88\xa2\x88\x9a\x4a\x84\x86\x88\x8a\xaa\xa2\xa8\xaa\xaa\x10\x41\x01\x04\x44\x11\x11\x11\x11\x04\x44\x51\x45\x44\x55\x55\x51\x51\x54\x55\x54\x54\x51"
b"\x45\x55\x15\x51\x51\x1a\x8a\x2a\x28\x88\xa2\x8a\x8a\x28\xa8\xa2\xaa\x28\x8a\x2a\xa8\xaa\x20\x06\xa2\x21\xa8\xaa\x18\x69\x01\x10\x44\x41\x04\x44\x10\x41\x04\x41\x11\x14\x54\x55\x44\x44\x54\x54\x55\x11\x15\x45\x55"
b"\x54\x45\x51\x14\x55\x52\x22\x8a\x8a\xaa\xa8\xa2\x28\xa2\x29\x28\x84\xa2\xa2\xa6\x8a\x22\xaa\x00\x06\xaa\x8a\x89\xaa\xaa\x10\x04\x01\x11\x11\x11\x04\x10\x44\x11\x11\x11\x45\x51\x55\x55\x15\x15\x11\x55\x51\x54\x45"
b"\x45\x54\x55\x55\x11\x18\xa8\xa2\x28\x88\x8a\x2a\x8a\x2a\x8a\x8a\x8a\x28\xa2\x2a\xa2\xa8\x88\xa8\x40\x04\x9a\xa8\xa8\xaa\x04\x41\x10\x10\x41\x04\x44\x44\x41\x10\x44\x44\x54\x55\x11\x15\x45\x45\x55\x11\x14\x45\x51"
b"\x54\x45\x14\x45\x55\x0a\x2a\x28\xa2\xaa\x2a\x88\xa2\x88\xa2\xa2\xa2\x8a\x2a\x20\x8a\x2a\x8a\x8a\x28\x02\xa2\x8a\xaa\x9a\x10\x10\x04\x04\x44\x44\x44\x10\x11\x04\x44\x45\x15\x11\x55\x44\x54\x54\x45\x55\x45\x51\x15"
b"\x45\x55\x51\x51\x11\x12\x88\x8a\x28\x8a\x88\xaa\x28\xa2\x28\x88\xa8\xa8\xa2\x8a\xa2\x88\xa8\xa2\x8a\x88\xaa\xaa\x1a\x29\x04\x41\x11\x04\x11\x11\x11\x11\x10\x44\x11\x11\x11\x54\x44\x55\x15\x15\x51\x11\x51\x15\x51"
b"\x54\x51\x15\x15\x44\x08\xa2\xa2\x8a\x88\xaa\x22\x8a\x2a\x22\xaa\x22\x8a\x28\xa2\x28\xa2\x8a\x28\xa2\x2a\x28\x61\xaa\xaa\x10\x10\x00\x41\x04\x44\x44\x44\x04\x11\x11\x11\x14\x45\x55\x45\x45\x45\x15\x54\x55\x51\x55"
b"\x45\x45\x45\x44\x41\x1a\x28\x8a\x22\x8a\x4a\xa8\xa2\x88\xa8\x88\xa8\xa2\x8a\x2a\x22\x28\xa2\xaa\x28\xa2\x8a\x2a\xaa\x9a\x04\x44\x44\x10\x41\x11\x11\x04\x44\x41\x04\x44\x44\x51\x11\x14\x54\x54\x54\x45\x11\x14\x44"
b"\x54\x54\x54\x54\x40\x08\x8a\xa2\xa2\xa2\x28\x8a\x68\xaa\x22\x2a\x22\x8a\x2a\x88\xaa\x8a\x2a\x22\x8a\x28\xa2\x9a\x8a\x89\x44\x01\x01\x04\x10\x41\x11\x44\x41\x10\x41\x04\x45\x15\x55\x45\x45\x45\x15\x55\x55\x55\x55"
b"\x45\x45\x45\x44\x11\x06\xa2\x28\x88\x8a\x8a\xa2\x2a\x22\x8a\x88\xa8\xa2\x88\xaa\x22\x22\x8a\x8a\x8a\x8a\x28\x9a\x9a\xaa\x04\x44\x44\x10\x44\x11\x10\x44\x50\x44\x11\x11\x11\x44\x44\x54\x54\x51\x51\x11\x44\x44\x45"
b"\x54\x54\x54\x41\x00\x48\x8a\x22\x8a\x22\x88\xaa\x8a\x8a\x28\x8a\x28\xa8\xa8\x88\xa2\xa8\xa2\xa2\xa2\x8a\x8a\x15\xa8\x6a\x41\x01\x01\x04\x01\x10\x44\x44\x11\x04\x41\x10\x44\x11\x55\x15\x15\x15\x15\x54\x55\x55\x51"
b"\x55\x55\x44\x40\x44\x0a\x22\x88\xa2\xa8\xa8\x88\xa2\xa2\x8a\x22\x8a\x2a\x2a\x8a\x28\x8a\x28\x62\x28\xa2\x28\xa6\x6a\xaa\x10\x44\x44\x10\x44\x04\x11\x11\x44\x44\x11\x04\x41\x14\x45\x45\x45\x45\x44\x45\x44\x44\x51"
b"\x45\x11\x51\x04\x01\x08\xa8\xaa\x28\x88\x8a\x8a\x28\xa8\xa2\xa8\xa2\x88\x88\xaa\x8a\x22\x8a\x2a\x8a\x28\xa2\x96\x6a\xa6\x04\x40\x41\x04\x10\x41\x11\x11\x14\x44\x41\x10\x44\x44\x51\x11\x11\x51\x55\x54\x55\x55\x15"
b"\x51\x54\x40\x41\x10\x4a\x28\x88\x8a\x28\xa2\x2a\x8a\x2a\x28\x8a\x28\xa2\xa8\x88\xa2\xa8\xa2\x88\xa2\x8a\x28\x99\x59\xaa\x10\x44\x10\x41\x04\x10\x41\x11\x11\x11\x11\x04\x10\x44\x45\x55\x54\x54\x44\x45\x44\x44\x51"
b"\x54\x44\x41\x00\x00\x06\x22\x8a\xa2\x8a\x28\xa2\x2a\x4a\x86\x88\x8a\x28\x86\xa9\x28\x8a\x28\xa2\x8a\xa2\x8a\x19\x99\x89\x04\x41\x10\x41\x01\x04\x10\x44\x45\x11\x10\x44\x44\x44\x44\x44\x45\x15\x55\x51\x51\x55\x15"
b"\x45\x50\x10\x11\x11\x0a\x28\xa2\x22\x22\x8a\x28\xa2\xa2\xa2\xa2\xa2\x8a\x88\x88\xaa\x28\x8a\x28\xa2\x28\xaa\x99\x99\xaa\x44\x11\x04\x10\x44\x41\x04\x10\x44\x51\x14\x41\x04\x11\x14\x55\x51\x45\x11\x14\x54\x51\x51"
b"\x54\x44\x04\x04\x00\x48\xa2\x8a\x28\xa8\xa2\x8a\x28\xa2\x28\xa8\x88\xa2\x2a\x8a\x22\x8a\xa2\x8a\x2a\x8a\x88\x99\x66\x5a\x01\x04\x44\x44\x40\x10\x41\x04\x44\x45\x10\x44\x41\x04\x44\x44\x55\x51\x55\x55\x15\x15\x15"
b"\x44\x41\x01\x00\x44\x0a\x28\xa2\x8a\x21\x28\x8a\x8a\x2a\x8a\x28\xa8\x8a\x88\xa2\xa8\xa1\x28\xa2\x88\x62\xa2\x99\x99\x9a\x10\x41\x04\x10\x11\x04\x10\x44\x11\x11\x11\x10\x44\x41\x11\x51\x44\x54\x44\x45\x15\x45\x51"
b"\x51\x04\x41\x10\x80\x48\x8a\x28\xa2\x8a\x22\x88\xa2\x88\xaa\x2a\x28\xa2\x2a\x28\x8a\x2a\x8a\x28\xaa\x28\xa8\x99\x99\x9a\x11\x10\x41\x05\x04\x41\x04\x41\x11\x11\x14\x44\x10\x44\x11\x15\x51\x45\x51\x51\x44\x51\x15"
b"\x10\x40\x10\x04\x10\x0a\xa2\x8a\x22\x22\x88\xa2\x28\xaa\x22\x8a\x22\x28\x48\xa8\xa2\xa2\x22\x8a\x22\x8a\x22\x16\x59\x9a\x01\x04\x11\x10\x41\x10\x44\x10\x44\x45\x11\x11\x04\x44\x44\x51\x15\x51\x15\x15\x45\x54\x51"
b"\x04\x04\x04\x80\x04\x48\x88\xa2\x28\xa8\xa8\x8a\x8a\x22\xa8\xa2\xaa\x86\x8a\x22\xa8\xa2\xa8\xa2\x88\xa2\xaa\xa5\x99\x9a\x10\x41\x11\x04\x44\x11\x01\x04\x10\x44\x54\x44\x44\x11\x11\x15\x14\x55\x45\x44\x54\x45\x45"
b"\x10\x41\x00\x11\x04\x06\x28\x8a\x28\x8a\x22\xa2\x22\x8a\x2a\x28\x88\x62\x22\x8a\x2a\x28\x8a\x28\xaa\x28\x88\x99\x99\x9a\x55\x50\x40\x44\x11\x04\x44\x41\x04\x44\x45\x14\x44\x44\x44\x51\x45\x11\x51\x55\x15\x54\x54"
b"\x08\x10\x44\x10\x40\x48\x8a\x22\x8a\x22\x28\x8a\x28\xa2\x8a\x8a\x86\x22\xa8\xa2\x88\xa2\xa2\x8a\x22\x8a\x2a\x65\x99\x98\x54\x44\x11\x04\x10\x40\x40\x10\x44\x10\x44\x51\x11\x11\x11\x15\x51\x54\x54\x51\x44\x45\x45"
b"\x04\x04\x01\x00\x10\x0a\xa2\xa8\xa1\xa2\x88\xa2\x88\x88\xa2\x28\xa2\xa8\x88\xa2\x2a\x28\xa8\xa2\x88\xa2\x88\x66\x66\x6a\x94\x11\x10\x41\x04\x44\x11\x04\x41\x04\x45\x15\x44\x44\x45\x11\x45\x45\x15\x14\x55\x54\x51"
b"\x41\x01\x10\x44\x04\x48\x88\x8a\x22\x28\xa2\x28\x4a\x2a\x28\xaa\x28\x8a\x28\x8a\x88\x8a\x2a\x28\xa8\xa2\xa2\x65\x96\x6a\x11\x01\x04\x11\x10\x41\x11\x10\x10\x44\x44\x44\x51\x11\x11\x45\x51\x55\x45\x45\x44\x45\x15"
b"\x00\x40\x04\x01\x00\x08\xa2\x88\xa2\x88\x8a\x88\xa2\x88\x8a\x21\xa2\xa2\x8a\x22\x2a\xa2\x88\xaa\x22\x28\x8a\x59\x99\x99\x95\x44\x12\x10\x44\x11\x04\x11\x04\x44\x11\x14\x54\x51\x51\x51\x15\x11\x51\x51\x55\x51\x51"
b"\x10\x11\x20\x48\x44\x4a\x28\xa2\x28\x8a\x22\x28\x88\xa2\xa2\xa8\xa8\xa8\xa2\xa2\x88\x8a\x2a\x22\x8a\x8a\x28\x65\x99\x9a\x54\x55\x41\x04\x04\x44\x41\x04\x41\x04\x41\x11\x14\x44\x51\x15\x45\x54\x45\x14\x44\x55\x15"
b"\x04\x40\x40\x10\x00\x08\x8a\x2a\x22\x88\xa8\x8a\x2a\x28\x84\x8a\x2a\x22\x28\x88\xa2\x28\xa2\xa1\xa2\x22\x8a\x66\x66\x62\x95\x55\x55\x41\x10\x80\x10\x41\x10\x41\x11\x11\x45\x15\x15\x44\x51\x14\x51\x45\x45\x11\x45"
b"\x10\x10\x11\x01\x04\x4a\x88\x88\xa8\xa2\x22\xa2\x88\x88\xa8\xa2\x8a\x2a\x8a\x2a\x22\x8a\x28\xa8\xa2\xa8\xa2\x65\x96\x5a\x95\x51\x54\x55\x21\x11\x11\x04\x10\x44\x11\x11\x11\x45\x44\x55\x15\x45\x54\x51\x51\x54\x51"
b"\x01\x04\x00\x40\x40\x04\xa2\x8a\x22\x2a\x28\x88\x8a\x2a\x22\x28\xa2\xa2\xa2\x88\xa8\xa2\x4a\x22\x28\x8a\x28\x59\x99\xaa\x45\x15\x55\x55\x55\x04\x10\x41\x04\x11\x10\x44\x44\x51\x55\x11\x51\x14\x45\x14\x54\x45\x55"
b"\x10\x01\x10\x10\x11\x0a\x28\xa2\x28\x88\x8a\x28\xa2\x82\x2a\x28\xa2\x28\x8a\x28\x8a\x28\xa2\x2a\x8a\x8a\x2a\x66\x66\x66\x95\x55\x45\x45\x14\x55\x04\x10\x44\x41\x04\x44\x44\x54\x45\x45\x15\x45\x51\x45\x15\x51\x11"
b"\x08\x40\x04\x04\x00\x42\x8a\x28\x8a\x8a\x88\x8a\x28\xa2\x88\x8a\x2a\x8a\xa2\x8a\x22\x22\x2a\x22\x28\xa2\x88\x65\x99\x6a\x95\x55\x55\x55\x55\x51\x51\x04\x10\x10\x41\x10\x45\x11\x14\x51\x51\x51\x15\x51\x44\x55\x15"
b"\x04\x11\x01\x04\x44\x08\xa2\x22\xa2\x22\x2a\x22\x88\x88\x8a\x22\x88\xa2\x28\xa2\x8a\x2a\x22\xa2\x8a\x28\xa2\x59\x66\x6a\x55\x51\x55\x45\x14\x55\x44\x41\x04\x44\x10\x44\x41\x15\x45\x15\x14\x45\x44\x51\x15\x11\x51"
b"\x01\x00\x41\x00\x02\x0a\x22\x88\x88\xa2\x88\xa8\x8a\x2a\x22\xa2\x28\xa2\x8a\x28\xa2\x88\xa2\x28\xa2\x8a\x28\x99\x99\xaa\x94\x55\x51\x55\x55\x55\x04\x11\x10\x11\x04\x11\x11\x44\x51\x51\x45\x51\x55\x11\x41\x14\x45"
b"\x10\x10\x40\x44\x40\x48\xa8\xa8\xa2\x28\x8a\x22\x22\x88\xa2\x22\x8a\x28\xa2\x8a\x28\xa2\x28\x8a\x28\xa2\x8a\x59\x99\x6a\x95\x55\x55\x55\x45\x44\x44\x41\x04\x40\x44\x41\x11\x15\x14\x54\x54\x51\x11\x44\x51\x45\x51"
b"\x04\x04\x20\x00\x10\x4a\x22\x22\x2a\x22\x88\x8a\x88\x8a\x28\xa2\x22\x8a\x2a\xa2\x8a\x28\x8a\x8a\x22\x28\xa1\x99\x99\xa6\x95\x55\x15\x51\x54\x54\x41\x04\x10\x11\x04\x10\x45\x45\x45\x15\x11\x51\x54\x54\x44\x51\x14"
b"\x01\x01\x04\x44\x04\x04\x8a\x2a\x22\x88\xa2\x88\xa2\x88\x8a\x22\x88\xa2\x88\x8a\xa2\x8a\x88\xa2\x8a\x8a\x2a\x59\x66\x6a\x95\x51\x55\x15\x55\x50\x40\x41\x04\x40\x41\x04\x41\x14\x51\x45\x45\x14\x45\x11\x11\x11\x45"
b"\x80\x40\x10\x01\x01\x0a\x22\x88\xa2\x2a\x28\x92\x28\xa2\x88\xa2\x28\x88\xa8\xa2\x28\xa2\x28\x88\xa2\x22\x89\x99\x99\xaa\x15\x15\x55\x55\x55\x44\x11\x10\x42\x10\x10\x44\x15\x51\x45\x44\x51\x45\x51\x51\x44\x44\x54"
b"\x10\x11\x01\x10\x40\x42\xa2\x28\x8a\x22\x12\x28\x8a\x28\x62\x28\x8a\x2a\x2a\x2a\x28\x88\x8a\x28\xa2\xa8\xa1\x96\x66\x69\x95\x55\x55\x51\x51\x01\x10\x11\x10\x11\x04\x41\x44\x54\x54\x55\x15\x14\x44\x44\x51\x11\x15"
b"\x04\x00\x40\x04\x10\x18\x8a\x88\xa2\x89\x28\x8a\x22\x22\x28\x8a\x22\x88\x88\xa2\x8a\x8a\x88\x8a\x28\x89\x29\x66\x66\x6a\x95\x55\x45\x15\x54\x44\x04\x40\x84\x41\x10\x44\x55\x15\x45\x11\x45\x45\x51\x51\x11\x44\x44"
b"\x04\x44\x04\x40\x81\x08\xa2\x28\x88\x92\x8a\x22\x8a\x28\x8a\x22\x88\xa2\x8a\x28\xa2\x62\x2a\x88\x8a\x12\x8a\x66\x66\x62\x95\x55\x55\x55\x51\x01\x10\x11\x04\x10\x04\x45\x11\x44\x51\x55\x14\x51\x14\x45\x11\x14\x44"
b"\x40\x00\x40\x10\x10\x0a\x22\x8a\x28\x88\x88\xa2\x22\x8a\x22\x88\xa2\x28\xa2\x8a\x18\x8a\x88\xa2\x88\xa2\x21\x99\x99\xaa\x95\x45\x55\x54\x44\x44\x04\x10\x41\x04\x44\x44\x54\x55\x15\x11\x45\x14\x44\x51\x45\x11\x14"
b"\x04\x44\x04\x04\x04\x4a\x28\x88\x86\x28\xa2\x28\xa8\x88\xa2\x28\x8a\x22\x28\x92\x8a\xa2\x28\x84\xa2\x28\xa9\x99\x99\xa6\x91\x55\x51\x55\x41\x04\x41\x04\x10\x44\x41\x15\x14\x45\x45\x14\x51\x51\x45\x11\x11\x14\x45"
b"\x04\x02\x10\x41\x00\x04\x8a\x2a\x22\x8a\x2a\x22\x22\x8a\x28\x8a\x22\x8a\x21\x28\xa2\x2a\x8a\x2a\x2a\x2a\x21\x96\x66\x6a\x15\x55\x15\x45\x10\x41\x20\x41\x04\x41\x11\x11\x45\x51\x51\x45\x14\x44\x41\x11\x45\x45\x10"
b"\x00\x40\x04\x20\x44\x4a\xa2\x88\xa8\x88\x88\xa8\xa2\x22\x8a\x22\xa2\x22\x4a\x28\xa2\x88\xa2\x88\x88\x88\xa9\x66\x66\x6a\x95\x55\x55\x54\x04\x12\x04\x10\x40\x10\x44\x54\x51\x14\x44\x51\x45\x54\x51\x44\x44\x41\x14"
b"\x10\x04\x40\x04\x00\x08\x88\x8a\x22\x8a\x22\x22\x28\xa8\x88\xa2\x28\x92\x22\x8a\x28\xa2\x28\xa2\x8a\x28\x8a\x66\x66\x62\x95\x55\x54\x51\x11\x04\x41\x04\x11\x04\x11\x15\x15\x14\x55\x14\x51\x05\x14\x44\x44\x51\x11"
b"\x08\x40\x04\x40\x41\x0a\x28\xa2\x28\xa2\x8a\x28\x8a\x22\x28\xa2\x8a\x28\xa2\x22\x8a\x2a\x8a\x28\xa2\x88\xa1\x99\x99\xa9\x95\x45\x45\x44\x04\x40\x44\x04\x10\x41\x15\x11\x45\x45\x11\x45\x14\x51\x11\x11\x11\x11\x11"
b"\x00\x10\x40\x10\x10\x12\x8a\x28\x88\x88\xa2\x8a\x22\x28\x8a\x28\x88\x8a\x22\x88\xa2\x88\xa2\x8a\x22\x28\x89\x96\x66\x6a\x94\x55\x55\x01\x01\x04\x01\x01\x04\x11\x11\x44\x51\x11\x45\x11\x44\x44\x44\x45\x11\x11\x11"
b"\x11\x00\x11\x01\x01\x08\x8a\x22\xa2\x8a\x22\x22\x8a\x22\x88\x88\x8a\x22\x28\xa2\x28\xa2\x28\xa2\x28\x8a\x29\x99\x99\xa2\x55\x55\x54\x44\x48\x41\x11\x10\x41\x04\x54\x55\x15\x14\x51\x54\x51\x11\x11\x44\x51\x11\x10"
b"\x00\x11\x00\x40\x10\x00\x48\xa8\x88\xa2\x28\xa2\x22\x88\xa2\x8a\x22\x8a\x22\x28\x88\x8a\x8a\x28\x8a\x22\x89\x99\x99\x2a\x95\x54\x54\x10\x10\x11\x04\x10\x10\x41\x11\x44\x51\x45\x14\x44\x44\x44\x44\x44\x44\x44\x45"
b"\x11\x00\x84\x04\x02\x10\x08\x22\x8a\x22\x8a\x28\xa8\xa2\x28\x88\xa2\x22\x8a\x22\x8a\x28\xa2\x8a\xa2\x88\xa1\x99\x66\xaa\x15\x45\x50\x41\x04\x40\x40\x44\x01\x11\x14\x45\x11\x44\x51\x14\x44\x44\x44\x44\x44\x44\x41"
b"\x00\x48\x00\x40\x80\x04\x01\x00\x62\x88\xa2\x22\x22\x28\x88\xa2\x28\xa2\x22\x28\xa2\x8a\x28\xa2\x28\xa2\x29\x96\x66\xa1\x95\x55\x41\x04\x40\x11\x04\x01\x10\x45\x15\x51\x44\x55\x14\x51\x11\x04\x44\x45\x11\x11\x10"
b"\x10\x01\x10\x20\x11\x02\x10\x10\x08\xa8\x8a\x28\x8a\x22\x8a\x28\x8a\x22\x8a\x22\x22\x22\x8a\x28\x8a\x28\x86\x66\x66\x6a\x55\x54\x10\x42\x11\x00\x41\x10\x41\x11\x44\x44\x55\x11\x15\x14\x41\x10\x44\x44\x45\x11\x11"
b"\x21\x10\x04\x01\x00\x40\x01\x08\x40\x06\x22\x8a\x22\x28\xa2\x12\x88\xa2\x22\x8a\x28\xa2\x22\x8a\x88\x8a\x26\x66\x9a\xa6\x95\x15\x04\x10\x04\x11\x10\x04\x10\x44\x54\x51\x11\x44\x44\x44\x41\x04\x11\x11\x11\x11\x11"
b"\x01\x01\x01\x10\x10\x21\x20\x80\x21\x00\x28\x88\xa2\x88\x86\x28\xa2\x28\xa2\x22\x88\x8a\x28\xa2\x8a\x8a\x29\x99\xa6\x6a\x95\x54\x41\x04\x41\x10\x04\x41\x04\x55\x14\x45\x44\x45\x45\x11\x10\x44\x41\x11\x11\x11\x10"
b"\x10\x10\x10\x01\x01\x00\x00\x12\x00\x48\x00\x8a\x28\x8a\x22\x88\x8a\x22\x28\xa2\x22\x88\x8a\x28\xa2\x22\x86\x66\x66\x89\x91\x50\x10\x41\x10\x04\x40\x40\x45\x44\x45\x14\x45\x44\x51\x10\x04\x01\x10\x44\x44\x44\x44"
b"\x01\x01\x02\x10\x10\x10\x44\x00\x42\x01\x10\x02\x22\x88\xa2\x28\xa2\x28\x8a\x22\x88\xa2\xa2\x88\x8a\x88\xa6\x59\x9a\x6a\x95\x41\x04\x20\x04\x40\x44\x11\x10\x51\x51\x44\x51\x15\x14\x44\x41\x10\x11\x05\x11\x11\x11"
b"\x10\x20\x00\x04\x08\x08\x02\x10\x10\x40\x08\x40\x42\x28\x88\x8a\x22\x8a\x22\x28\x8a\x28\x88\x8a\x12\x8a\x26\x65\x99\xaa\x15\x04\x21\x04\x01\x04\x11\x04\x45\x15\x14\x51\x45\x44\x51\x01\x04\x11\x04\x41\x11\x11\x14"
b"\x01\x01\x04\x40\x80\x40\x40\x08\x00\x08\x00\x20\x04\x08\xa2\x88\x88\x88\xa2\x88\xa2\x22\x28\xa2\xa2\x8a\x26\x59\x99\xa1\x94\x12\x00\x41\x10\x11\x00\x44\x45\x44\x45\x14\x50\x45\x14\x44\x41\x00\x41\x11\x11\x14\x44"
b"\x10\x10\x80\x01\x04\x04\x08\x41\x21\x01\x21\x04\x00\x41\x22\x22\x8a\x28\x88\x8a\x22\x28\x88\x88\x88\xa2\x85\x96\x59\xaa\x90\x80\x44\x10\x04\x00\x44\x11\x11\x15\x11\x45\x15\x11\x44\x40\x10\x11\x10\x01\x04\x44\x44"
b"\x01\x00\x10\x40\x00\x42\x00\x00\x00\x80\x00\x00\x88\x00\x04\x88\xa2\x22\x28\xa2\x22\x88\xa2\x8a\x2a\x28\xa9\x99\x9a\x9a\x81\x04\x01\x01\x01\x10\x04\x11\x44\x45\x14\x44\x44\x51\x11\x04\x04\x40\x04\x44\x41\x11\x11"
b"\x20\x11\x00\x10\x40\x00\x44\x10\x48\x12\x12\x10\x00\x48\x00\x02\x22\x8a\x22\x22\x28\x8a\x22\x22\x88\x8a\x25\x99\x9a\xaa\x10\x10\x40\x41\x10\x04\x41\x14\x51\x41\x44\x51\x51\x15\x10\x41\x10\x11\x10\x10\x10\x44\x44"
b"\x01\x00\x10\x00\x21\x04\x01\x00\x00\x00\x00\x08\x40\x01\x08\x48\x08\xa2\x28\x8a\x22\x22\x22\x88\x8a\x22\x89\x66\x69\xa4\x04\x04\x10\x10\x04\x40\x10\x44\x44\x54\x45\x11\x14\x45\x10\x10\x41\x01\x04\x11\x04\x11\x11"
b"\x10\x21\x01\x21\x00\x40\x80\x20\x44\x10\x44\x00\x12\x10\x80\x04\x04\x12\x88\xa2\x22\x8a\x28\x8a\x22\x88\xa6\x59\x9a\x90\x41\x01\x04\x04\x40\x11\x04\x44\x44\x44\x51\x11\x11\x41\x04\x04\x10\x44\x41\x00\x44\x11\x11"
b"\x04\x00\x10\x00\x10\x08\x00\x04\x00\x04\x02\x04\x00\x00\x10\x80\x40\x00\x8a\x22\x88\xa2\x22\x22\x88\xa8\x86\x66\xaa\x41\x00\x40\x41\x00\x04\x00\x01\x11\x45\x14\x44\x51\x44\x50\x41\x11\x04\x10\x10\x44\x01\x04\x41"
b"\x41\x11\x00\x10\x02\x00\x44\x40\x08\x40\x81\x02\x04\x20\x00\x04\x21\x08\x41\x22\x28\x88\x88\xa2\x28\x8a\x26\x59\xa4\x10\x20\x11\x00\x44\x41\x11\x11\x11\x45\x44\x51\x11\x14\x44\x10\x04\x04\x04\x04\x01\x10\x40\x44"
b"\x00\x00\x08\x01\x10\x40\x00\x08\x40\x08\x10\x20\x02\x01\x20\x40\x00\x81\x00\x04\x88\x8a\x28\x88\x88\xa2\xa5\x9a\xa4\x01\x04\x40\x11\x00\x04\x00\x44\x44\x44\x45\x11\x44\x44\x41\x04\x41\x01\x01\x11\x10\x44\x04\x11"
b"\x12\x04\x01\x00\x04\x10\x48\x00\x08\x40\x42\x01\x20\x10\x01\x08\x48\x10\x22\x08\x0a\x22\x88\x89\x22\x22\x26\x6a\x41\x10\x04\x04\x00\x11\x01\x11\x14\x44\x44\x44\x44\x45\x14\x10\x40\x10\x41\x10\x00\x10\x01\x04\x40"
b"\x00\x40\x40\x11\x00\x00\x01\x04\x00\x04\x00\x40\x01\x00\x42\x00\x00\x02\x00\x00\x40\x48\x88\xa2\x28\x88\x99\xa6\x11\x08\x00\x40\x44\x00\x40\x04\x11\x14\x44\x51\x11\x11\x44\x44\x04\x04\x10\x04\x44\x04\x44\x40\x11"
b"\x21\x00\x10\x80\x81\x04\x10\x00\x44\x80\x84\x01\x00\x48\x20\x44\x04\x20\x11\x10\x04\x00\x62\x22\x22\x28\x99\xa8\x00\x81\x10\x10\x01\x10\x11\x04\x44\x44\x44\x44\x51\x11\x44\x01\x01\x01\x04\x41\x01\x10\x00\x11\x04"
b"\x00\x12\x01\x04\x10\x02\x01\x04\x00\x04\x01\x00\x10\x80\x04\x00\x80\x04\x00\x02\x00\x20\x02\x88\x88\x88\x99\xa1\x11\x00\x04\x08\x40\x04\x00\x51\x44\x44\x44\x45\x11\x51\x11\x10\x10\x40\x00\x40\x44\x04\x44\x40\x40"
b"\x11\x00\x00\x00\x04\x20\x00\x00\x20\x40\x40\x92\x04\x04\x00\x08\x01\x00\x42\x00\x10\x04\x08\x0a\x22\x88\xa6\x10\x40\x44\x01\x04\x10\x40\x44\x11\x14\x51\x44\x44\x44\x11\x44\x04\x04\x11\x04\x11\x04\x10\x44\x11\x04"
b"\x00\x41\x04\x44\x40\x01\x04\x82\x04\x00\x20\x00\x42\x01\x02\x00\x40\x20\x00\x41\x02\x02\x00\x40\x28\x88\x9a\x04\x20\x01\x10\x40\x04\x01\x01\x11\x14\x11\x11\x11\x44\x51\x11\x01\x01\x00\x10\x04\x10\x40\x01\x00\x41"
b"\x10\x10\x10\x00\x08\x40\x40\x00\x40\x84\x04\x10\x00\x10\x20\x44\x08\x01\x04\x00\x20\x41\x10\x01\x00\x62\x24\x10\x04\x41\x00\x04\x10\x40\x44\x45\x05\x11\x44\x51\x11\x11\x01\x10\x40\x11\x01\x01\x00\x11\x10\x44\x10"
b"\x04\x01\x02\x04\x10\x04\x01\x04\x01\x02\x01\x02\x10\x02\x00\x00\x01\x00\x80\x82\x00\x20\x08\x10\x04\x02\x90\x01\x00\x10\x11\x01\x00\x10\x81\x11\x41\x11\x14\x11\x11\x11\x10\x04\x11\x00\x10\x40\x44\x41\x01\x01\x04"
b"\x81\x00\x10\x00\x00\x40\x20\x42\x00\x10\x40\x20\x04\x80\x10\x42\x10\x10\x08\x00\x04\x01\x00\x00\x80\x80\x04\x10\x44\x01\x00\x40\x11\x04\x11\x44\x51\x14\x45\x44\x44\x44\x04\x41\x00\x11\x00\x10\x00\x04\x10\x40\x41")

View File

@ -1,4 +1,3 @@
# 600 x 488
color_image_inkplate6COLOR = bytearray(
b"\x33\x33\x31\x11\x11\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33"
b"\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33"

View File

@ -1,106 +1,106 @@
color_image_ip7 = bytearray(
b"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45"
b"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x55\x15\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55"
b"\x51\x54\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51"
b"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x55\x45\x51\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45"
b"\x51\x55\x15\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x55\x55\x55\x45\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x54\x51\x54\x55\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14"
b"\x55\x55\x45\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x45\x55\x55\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45"
b"\x55\x14\x55\x45\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55"
b"\x55\x55\x51\x55\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x55"
b"\x51\x55\x15\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x51"
b"\x55\x45\x55\x45\x55\x15\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15"
b"\x55\x55\x54\x55\x51\x54\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x56\x55\x15\x55\x45\x55\x51\x59\x54\x55\x55\x15\x55\x45\x65\x51\x51\x54\x55\x55\x15\x95\x45\x55\x51\x55\x55"
b"\x51\x51\x45\x55\x15\x55\x51\x55\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x55\x54\x54\x55\x15\x15\x45\x55\x51\x51\x54\x54\x55\x15\x55\x55\x55\x51\x51\x54\x55\x55\x15\x15\x45\x55"
b"\x55\x55\x55\x51\x55\x45\x55\x45\x55\x15\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x45\x45\x55\x55\x55\x55\x55\x15\x15\x55\x55\x65\x55\x54\x54\x55\x45\x55\x95\x55\x51\x51\x55\x55\x55\x15"
b"\x54\x55\x55\x15\x55\x55\x15\x55\x15\x55\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x54\x55\x45\x51\x64\x54\x55\x51\x55\x15\x45\x55\x51\x55\x55\x51\x55\x15\x55\x45\x55\x15\x51\x54\x55\x51"
b"\x55\x51\x45\x55\x51\x55\x54\x55\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x54\x55\x55\x55\x15\x55\x55\x51\x55\x55\x54\x55\x14\x55\x45\x45\x55\x59\x54\x51\x55\x15\x55\x55\x45\x51\x55"
b"\x45\x55\x55\x55\x15\x45\x55\x51\x51\x45\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x55\x55\x51\x55\x55\x15\x45\x55\x55\x45\x55\x55\x55\x54\x55\x55\x15\x15\x45\x55\x51\x55\x54\x55\x55\x55\x55"
b"\x55\x15\x15\x15\x55\x55\x15\x55\x55\x55\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x45\x45\x15\x45\x55\x54\x55\x15\x14\x56\x45\x65\x45\x45\x54\x55\x55\x54\x55\x54\x55\x51\x45\x51\x55\x15\x15"
b"\x55\x55\x55\x51\x54\x55\x51\x45\x15\x55\x15\x55\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x51\x54\x55\x55\x55\x55\x14\x55\x55\x55\x55\x65\x66\x45\x55\x55\x55\x51\x51\x55\x55\x15\x55\x55\x55\x55\x45\x55\x51"
b"\x51\x51\x51\x55\x45\x51\x55\x55\x54\x51\x54\x54\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x54\x55\x54\x55\x55\x51\x51\x51\x58\xa2\x18\x66\x11\x95\x15\x55\x55\x91\x55\x55\x45\x15\x55\x15\x55\x51\x55"
b"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x55\x51\x45\x51\x55\x15\x55\x55\x58\x59\x99\xa1\x56\x15\x54\x54\x64\x65\x85\x45\x55\x54\x51\x54\x54\x55\x55"
b"\x55\x15\x15\x14\x55\x15\x14\x51\x45\x45\x45\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x45\x55\x55\x55\x45\x55\x45\x45\x16\xa9\x89\x99\x95\x65\x45\x65\x99\x86\x54\x55\x15\x55\x55\x55\x55\x55\x15"
b"\x51\x55\x55\x55\x51\x55\x55\x55\x55\x55\x55\x55\x15\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x54\x55\x15\x95\x96\x55\x54\x55\x55\x6a\x18\x66\x89\x64\x61\x96\x51\x46\x59\x59\x59\x54\x51\x55\x45\x45\x45\x51"
b"\x55\x51\x51\x51\x55\x51\x51\x54\x54\x54\x54\x55\x54\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x55\x55\x54\x51\x45\x51\x45\x55\x16\x19\xa9\xa8\x9a\x45\x99\x59\x16\x99\x24\x51\x55\x45\x55\x45\x55\x55\x55\x55"
b"\x55\x55\x55\x55\x55\x55\x55\x45\x55\x55\x55\x51\x55\x51\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x45\x51\x55\xa2\x64\x65\x55\x51\x54\xa8\xa2\x59\xa8\x55\x66\x45\x69\x26\x55\x56\x91\x55\x95\x54\x54\x54\x54\x55"
b"\x51\x45\x45\x15\x14\x55\x15\x55\x45\x45\x45\x55\x45\x55\x55\x15\x45\x45\x51\x51\x54\x54\x55\x15\x95\x55\x15\x45\x16\x61\x98\x69\x15\x66\x6a\x66\x66\x26\x59\x12\x56\x46\x69\x26\x65\x15\x59\x45\x15\x55\x55\x55\x51"
b"\x55\x55\x55\x55\x55\x51\x54\x55\x55\x55\x55\x15\x55\x15\x15\x55\x55\x55\x55\x55\x55\x55\x55\x59\x15\x55\x55\x55\x59\x19\x85\x91\xa6\x56\x28\xa2\x46\x49\x95\x65\x64\x5a\x66\x64\x49\x55\x14\x55\x55\x45\x45\x45\x55"
b"\x54\x54\x55\x51\x55\x15\x55\x51\x54\x54\x55\x54\x55\x55\x59\x51\x59\x54\x55\x15\x45\x65\x51\x92\x49\x19\x65\x95\x56\x66\x59\x99\x91\x91\xa6\x9a\x64\xa2\x51\x92\x55\x98\x61\x95\x59\x95\x55\x55\x54\x55\x55\x55\x15"
b"\x55\x55\x51\x55\x45\x55\x45\x55\x45\x55\x51\x55\x51\x51\x54\x55\x45\x15\x51\x56\x55\x14\x55\x98\xa2\x62\x44\x54\x51\x48\x64\x99\x1a\x1a\xa2\xa9\x19\x99\x95\x65\x85\x86\x66\x46\x64\x51\x59\x14\x55\x56\x51\x51\x55"
b"\x45\x45\x55\x45\x55\x54\x55\x15\x55\x45\x55\x45\x55\x55\x45\x55\x55\x55\x55\x54\x55\x55\x64\x8a\x69\x2a\x19\x99\x65\x56\x66\x46\x65\x99\x29\x82\x59\xa8\x54\x52\x54\x66\x98\x55\x85\x55\x45\x55\x51\x51\x55\x55\x51"
b"\x55\x55\x15\x55\x51\x45\x55\x54\x55\x55\x15\x55\x15\x15\x55\x45\x15\x51\x45\x45\x51\x54\x8a\x6a\x2a\x99\xa8\x46\x18\x65\x18\x68\x99\x2a\x6a\xa6\x98\x66\x45\xa6\x56\x69\x26\x64\x56\x54\x56\x55\x15\x55\x45\x15\x55"
b"\x54\x55\x54\x54\x55\x55\x55\x55\x51\x59\x54\x55\x55\x54\x54\x55\x54\x55\x55\x55\x55\x46\xa8\x22\x49\x29\x16\xa8\x62\x15\xa5\x96\x21\x56\x24\xa9\x95\x8a\x59\x61\x65\x86\x66\x55\x65\x15\x64\x51\x55\x54\x55\x54\x55"
b"\x55\x51\x55\x55\x55\x55\x45\x15\x15\x45\x55\x51\x51\x55\x55\x55\x55\x66\x99\x55\x15\x55\x2a\x86\xaa\xa2\x65\x92\x15\x99\x51\x91\x66\x66\x4a\x62\x12\x61\x95\x99\x51\x96\x49\x19\x19\x56\x55\x55\x54\x65\x55\x65\x51"
b"\x55\x55\x45\x45\x45\x14\x55\x51\x55\x55\x15\x55\x55\x45\x95\x51\x46\x11\x21\x45\x54\x56\x48\x9a\xa2\x9a\x49\x98\xa9\x64\x66\x16\x98\x91\xa2\x19\x99\x89\x91\x86\x56\x49\x99\x56\x54\x65\x16\x55\x55\x55\x64\x55\x55"
b"\x45\x15\x55\x55\x55\x55\x55\x55\x54\x55\x54\x54\x54\x58\x48\x55\x54\x99\x94\x55\x55\x55\xa6\xa2\xaa\x28\xa1\x66\x21\x91\xa1\x69\x85\x16\x4a\xa6\xa6\x69\x16\x61\x45\x95\x18\x91\x45\x51\x51\x45\x16\x45\x15\x51\x86"
b"\x55\x54\x54\x54\x54\x55\x45\x15\x65\x51\x55\x45\x55\x46\xa5\x96\x28\x59\x54\x66\x16\x44\x62\x8a\x86\x8a\x66\x91\x86\x56\x66\x91\x59\x69\xa2\x68\x64\x6a\x65\x15\x59\x19\x69\x96\x56\x55\x95\x55\x54\x55\x59\x59\x55"
b"\x55\x45\x55\x55\x55\x51\x55\x54\x55\x55\x45\x55\x45\x49\x45\x89\x99\x96\x62\x25\x45\x55\x66\x1a\x2a\x9a\xa8\x66\x68\x66\x48\x5a\x99\x94\x46\x86\x99\x92\x91\xa5\x96\x64\x56\x64\x65\x16\x15\x51\x65\x54\x54\x45\xa6"
b"\x51\x55\x45\x45\x45\x55\x55\x55\x51\x45\x55\x55\x66\x56\x59\x98\xa8\x61\x26\x62\x61\x26\x60\xa9\xa1\xa8\xa6\xa1\x96\x61\x55\x95\x11\x86\x69\xa2\x86\x69\x26\x25\x14\x66\x61\x45\x55\x55\x54\x55\x45\x65\x99\x99\x19"
b"\x55\x55\x55\x55\x55\x15\x14\x51\x55\x55\x51\x45\x91\x22\x28\x88\x66\x4a\xa2\x16\x96\x51\x26\x52\x28\x8a\x4a\x1a\x99\xa6\x99\x49\x69\x59\x94\x99\x99\x86\xaa\x95\x56\x49\x56\x5a\x46\x46\x55\x58\x56\x19\x91\x66\x64"
b"\x55\x14\x54\x54\x55\x55\x55\x55\x54\x54\x55\x55\x48\xa9\x99\xa6\x86\x66\x64\xa5\x19\x96\x61\x99\x96\x16\xa9\xa9\x24\x18\x94\x58\x58\x66\x49\xa2\x21\x9a\x61\x86\x62\x86\x48\x65\x55\x94\x51\x45\x99\x61\x96\x61\x99"
b"\x51\x55\x55\x55\x51\x51\x55\x15\x15\x55\x55\x22\x99\x92\x86\x88\x59\x91\x89\x59\x99\x66\x55\x99\x55\x65\x5a\x62\x69\x68\x19\x9a\x56\x21\x9a\x4a\x69\x8a\x26\xa4\x58\x51\x96\x46\x24\x66\x15\x95\x51\x96\x46\x66\x16"
b"\x55\x55\x45\x45\x55\x55\x45\x55\x55\x45\x94\xa4\xa6\xa6\x69\x99\xa6\x66\x58\x64\x61\x14\x61\x51\x19\x91\x14\x64\x92\x65\x95\x91\x85\x65\x91\xa4\x92\x19\xa9\x25\x66\xaa\x58\x66\x59\x61\xa6\x58\x65\xa9\x99\x29\x99"
b"\x55\x45\x55\x55\x15\x15\x55\x51\x51\x59\x8a\x8a\x48\x0a\x86\x62\x64\x52\x99\x56\x55\x65\x99\x25\x54\x46\x66\x62\x19\x91\x61\x99\x65\x92\x66\x8a\xa4\xa2\x62\x6a\x22\x14\x66\x61\x91\x9a\x61\x15\x98\x46\x66\x61\x65"
b"\x51\x55\x15\x15\x55\x54\x54\x55\x55\x22\x18\x66\xaa\x64\x64\xa6\x86\x65\x09\x85\x64\x59\x56\x56\x65\x59\x85\x19\x96\x46\x5a\x48\x69\x18\x89\x92\x2a\x1a\x26\x21\x64\x69\x59\x99\x64\x98\x98\x66\x46\x65\x18\x96\x45"
b"\x55\x51\x55\x55\x45\x45\x55\x55\x19\xa9\xaa\x8a\x1a\xaa\xa9\x61\x99\x1a\x58\x59\x16\x94\x85\x65\x45\x95\x56\x68\x99\x59\x84\x66\x89\x64\xa2\x2a\x11\xa1\x22\x64\x89\x84\x91\x86\x1a\x19\x92\x66\x61\x99\x26\x66\x56"
b"\x54\x55\x51\x51\x55\x55\x45\x45\x52\x12\x0a\xaa\xa9\x26\x46\x96\x9a\x65\x99\x96\x65\x25\x56\x44\x56\x45\x15\x56\x24\x64\x69\xa1\x92\x21\x84\x99\x22\x1a\x62\x09\x28\x5a\x65\x61\x99\x86\x69\x92\x19\x92\x69\x91\x65"
b"\x55\x55\x55\x55\x54\x55\x55\x55\x58\x2a\x86\x18\x62\x68\xa8\x69\x19\x14\x59\x91\x51\x66\x54\x59\x95\x55\x62\x65\x49\x92\x86\x1a\x62\x9a\x2a\x44\x86\x44\x99\xa6\x85\x92\x48\x86\x46\x66\x26\x26\x56\x26\x62\x16\x61"
b"\x45\x45\x15\x15\x15\x51\x51\x51\x55\x62\xa9\xa6\x66\x86\x66\x46\x91\x65\x92\x15\x96\x51\x45\x66\x61\x46\x56\x46\x06\x65\x99\xa4\xa6\x21\x84\x62\x64\x99\x82\x11\x18\x64\x96\x28\x61\x18\x62\x49\x9a\x62\x59\x65\x92"
b"\x55\x55\x55\x55\x55\x55\x55\x55\x45\x59\x18\xa8\x98\x99\x91\xa4\x56\x66\x55\x66\x59\x25\x59\x14\x55\x55\x15\x41\x09\x18\x88\x9a\x18\x62\x49\x91\x80\x64\x55\x99\x92\x44\x46\x14\x98\x86\x66\x08\x62\x20\x91\x58\x65"
b"\x54\x55\x51\x51\x51\x45\x15\x15\x56\x2a\xaa\x66\x69\x99\x19\x65\x99\x14\x61\x94\x46\x56\x59\x99\x64\x65\x64\x49\x22\x19\x92\x49\x86\x86\x61\x99\x18\x46\x49\x11\x12\x5a\x21\x22\x05\x20\x48\x61\x99\x24\x96\x46\xa6"
b"\x55\x51\x55\x55\x55\x55\x55\x54\x59\x86\x26\x86\x19\x99\x66\x59\x45\x99\x55\x55\x55\x64\x51\x55\x45\x51\x55\x89\x89\x98\x8a\x62\x61\x61\x56\x46\x46\x48\x21\x20\x64\x84\x48\x84\x60\x92\x89\x96\x22\xa8\x65\x9a\x59"
b"\x55\x55\x45\x45\x15\x55\x51\x55\x50\xa2\x62\x69\xa4\x64\x55\x14\x59\x56\x59\x19\x91\x45\x55\x85\x96\x66\x46\x61\x8a\x66\x62\x21\x18\x86\x45\x44\x40\x81\x10\x46\x08\x12\x16\x10\x92\x08\x42\x26\x59\x99\x98\x64\x86"
b"\x45\x15\x55\x55\x54\x51\x55\x45\x65\x56\x16\x1a\x66\x46\xa1\x65\x99\x18\x65\x54\x56\x55\x98\x55\x15\x15\x55\x5a\x48\x91\x84\x62\x89\x18\x64\x84\x48\x52\x06\x10\x41\x10\x40\x1a\x41\x91\x28\x45\x22\x46\x46\x89\x99"
b"\x55\x54\x54\x55\x55\x55\x15\x55\x15\x15\x59\xa4\x89\x99\xa6\x66\x52\x65\x91\x45\x99\x59\x15\x59\x59\x51\x86\x12\x61\xa6\x6a\x66\x62\x86\x21\x06\x11\x05\x44\x48\x12\x11\x04\x84\x66\x10\x04\x98\x64\x64\xa8\x66\x22"
b"\x55\x45\x55\x51\x45\x45\x54\x55\x55\x59\xa6\x2a\x66\x66\x49\x91\x65\x99\x15\x96\x51\x45\x56\x44\x64\x56\x55\x65\x1a\x18\x96\x16\x16\x62\x86\x60\x06\x44\x61\x51\x04\x48\x61\x12\x11\x22\x28\x88\x99\x66\x19\xa2\x89"
b"\x51\x55\x45\x55\x55\x55\x55\x51\x51\x61\x22\x68\x68\x44\xa6\x24\x59\x25\x51\x65\x15\x96\x45\x56\x45\x65\x19\x99\x99\xa9\x85\x65\x92\x29\x28\x54\x80\x61\x14\x86\x11\x11\x00\x08\x42\x04\x04\x86\x44\x49\x91\x19\x9a"
b"\x55\x55\x55\x15\x51\x55\x15\x15\x99\x9a\x66\x86\x9a\xaa\x6a\x6a\x91\x91\x9a\x50\x59\x45\x98\x65\x66\x51\x64\x4a\x62\x84\x66\x46\x66\x5a\x85\x88\x66\x18\x88\x51\x18\x62\x12\x01\x24\x80\x82\x22\x12\x56\x1a\x99\x96"
b"\x55\x14\x55\x54\x55\x45\x55\x55\x48\x8a\x99\xa9\x86\x66\x24\x91\x19\x66\x64\x66\x64\x59\x55\x59\x15\x16\x59\xa8\xa6\x66\x58\x59\x19\x18\x5a\x66\x21\x86\x61\x22\x21\x20\x25\x52\x48\x48\x18\x65\xa1\xa1\x65\x19\x21"
b"\x51\x55\x51\x55\x54\x55\x45\x58\xa6\x64\x88\x62\x92\x49\xa9\xa6\x9a\x48\x66\x58\x55\x94\x51\x91\x69\xa6\x64\x86\x49\x99\x15\x91\x61\x95\x91\x12\x66\x68\x96\x61\x9a\x45\x12\x24\x21\x91\x99\x92\x46\x16\x66\x51\x98"
b"\x55\x55\x55\x45\x45\x56\x55\x16\x46\x8a\x66\x99\xa6\xa2\x64\x99\x24\x55\x91\x45\x99\x65\x65\x56\x92\x61\x29\xa6\x99\x11\x99\x1a\x56\x46\x65\x96\x18\x65\x92\x18\x91\x99\x88\x61\x99\x19\x24\x66\xa9\x98\x45\x96\x65"
b"\x55\x45\x15\x55\x55\x54\x55\x8a\xa8\x66\x9a\xa8\xa8\x66\x89\x9a\x56\x69\x15\x96\x51\x51\x51\x98\x6a\x1a\x92\x64\x51\x66\x46\x54\x65\x64\x46\x59\x65\x91\x89\xa1\x98\x48\x9a\x9a\x61\xa2\x26\x88\x42\x19\x11\x86\x18"
b"\x51\x55\x54\x54\x55\x95\x51\x98\x66\x99\x91\x86\x9a\xa9\x99\x91\x99\x56\x55\x65\x15\x96\x66\x44\xa6\x28\xa6\x15\x9a\x64\x55\x19\x51\x26\x64\x45\x11\x9a\x19\x19\x15\x98\x86\x24\xa6\x19\x91\x99\x99\x65\x99\x59\x86"
b"\x55\x54\x55\x55\x51\x45\x68\xaa\x29\x99\x2a\xa8\xa1\x91\x94\x65\x46\x19\x64\x55\x59\x46\x5a\xaa\x22\x99\x99\x86\x64\x95\x99\x66\x16\x19\x98\x64\x19\x21\x89\x66\x66\x59\x66\x61\x85\x65\x99\x19\x19\x99\x96\x66\x59"
b"\x54\x55\x55\x15\x95\x55\x06\x26\x64\x64\x92\x19\x99\x26\x45\x96\x59\x54\x55\x86\x54\x69\x24\x66\x66\x8a\x24\x59\x1a\x46\x51\x91\x65\x92\x26\x59\x66\x66\x99\x94\x51\x46\x46\x16\x59\x92\x46\x61\x91\x84\x61\x91\x96"
b"\x55\x51\x51\x54\x55\x51\x55\x62\x85\x59\xaa\xaa\x9a\x66\x59\x64\x65\x91\x64\x55\x19\xa6\x9a\x88\xa8\x65\x99\x99\x64\x55\x16\x46\x2a\x29\x55\x16\x59\x28\xa4\x45\x56\x54\x59\x66\x64\xa6\x99\x55\x66\x66\x65\x19\x46"
b"\x45\x55\x55\x55\x51\x55\x59\x24\x59\x98\x88\x61\x26\x64\x66\x45\x94\x56\x45\x66\x58\x92\x8a\x2a\x86\x9a\x66\x46\x45\x66\x69\x26\x51\xa6\x45\x59\x22\xa9\x86\x56\x19\x25\x51\x59\x29\x98\x68\x99\x14\x65\x19\x66\x69"
b"\x55\x15\x15\x45\x55\x15\x51\x85\x66\x26\x2a\x1a\x61\x86\x91\x59\x45\x99\x56\x59\x64\xaa\x26\x98\x69\xa4\x86\x65\x56\x61\x92\x66\xaa\x45\x55\x14\x66\x49\x99\x91\x59\x65\x96\x45\x52\x45\xa6\x65\x59\x51\x55\x94\x55"
b"\x55\x55\x54\x55\x15\x54\x54\x59\x61\x88\x66\x65\x9a\x69\x9a\x9a\x66\x51\x96\x45\x16\x66\x68\xaa\xa8\x66\xa4\x51\x99\x1a\x26\x64\x46\x55\x15\x68\x98\xa6\x19\x15\x91\x14\x59\x56\x55\x99\x86\x14\x56\x55\x64\x55\x51"
b"\x51\x51\x55\x55\x55\x45\x59\x9a\x1a\xaa\x19\x5a\x26\xa4\xa9\x28\x68\x55\x45\x59\xaa\x28\xaa\x61\x99\x89\x95\x95\x86\xaa\x19\x88\x99\x51\x51\x45\xaa\x89\xa4\x59\x59\x65\x45\x14\x65\x19\x59\xa6\x64\x59\x95\x45\x95"
b"\x55\x55\x45\x51\x51\x55\x55\x22\xaa\x19\x94\xa1\xa8\x8a\xa2\x9a\x95\x98\x66\x92\x49\xaa\x8a\xaa\x86\x99\x19\x66\x69\x18\x64\x66\x54\x55\x55\x9a\x46\x6a\x19\x54\x46\x51\x55\x65\x45\x51\x91\x86\x45\x51\x45\x59\x45"
b"\x55\x15\x55\x15\x55\x55\x15\x9a\x21\xa5\x62\x6a\xaa\x6a\x69\xa1\x69\x86\x64\x66\xa6\x24\x9a\x19\xa9\x19\x91\x46\x1a\xa6\x66\x89\x15\x51\x59\x18\xaa\x26\xa4\x66\x99\x15\x64\x54\x55\x55\x16\x59\x96\x55\x56\x54\x55"
b"\x51\x54\x55\x55\x45\x45\x58\xa1\xa6\x54\x69\xa1\x86\xaa\x2a\x16\x44\x99\x9a\xa9\x2a\xaa\xa9\xa8\x62\x66\x56\x69\xa2\x61\x98\x95\x55\x15\x85\x66\x62\xa2\x45\x51\x91\x56\x45\x65\x59\x15\x66\x61\x25\x19\x14\x55\x55"
b"\x55\x55\x51\x54\x55\x55\x86\x8a\x15\x66\xa2\x2a\xaa\x26\x65\xaa\xa9\xaa\x86\x46\xa4\x8a\x18\x9a\x96\x61\x46\x86\x9a\x2a\x89\x99\x45\x55\x56\x48\xa6\x26\x9a\x65\x65\x64\x55\x46\x51\x55\x51\x56\x69\x65\x65\x65\x91"
b"\x55\x45\x55\x45\x54\x55\x68\x69\x59\x12\x1a\x9a\x4a\x62\x61\x98\x6a\x64\x69\x9a\x2a\x98\xaa\xa1\x99\x96\x59\xa8\xa9\x99\x26\x54\x56\x51\x45\x99\xa2\x86\x65\x14\x56\x45\x54\x55\x15\x51\x55\x19\x84\x51\x56\x44\x55"
b"\x51\x55\x15\x55\x55\x51\x2a\x15\x56\xaa\xaa\x28\xa6\x16\x6a\x8a\x92\x8a\x98\x66\x62\x8a\x86\x66\x61\xa5\xa2\x99\x8a\x62\x99\x45\x54\x55\x55\x1a\x66\x6a\x19\x59\x45\x55\x45\x91\x55\x55\x15\x99\x62\x96\x45\x55\x55"
b"\x55\x55\x54\x55\x95\x56\x89\x65\x12\x4a\x26\xa6\xa1\x66\x28\x99\xaa\x66\x66\xa2\x8a\x21\xaa\x19\x1a\x46\x1a\x2a\x66\x29\x94\x55\x45\x51\x91\x62\x1a\x86\x91\x95\x54\x59\x55\x55\x54\x55\x55\x44\x56\x64\x56\x46\x45"
b"\x54\x51\x55\x51\x45\x14\x65\x55\x68\xa9\x8a\x22\x56\x6a\x69\xa8\xa6\x28\xa9\x16\x54\xaa\x46\x66\xa6\x66\xaa\x64\xa2\x99\x45\x56\x55\x95\x55\x66\xa8\x6a\x65\x44\x65\x45\x19\x15\x95\x45\x51\x55\x99\x45\x95\x65\x55"
b"\x55\x55\x45\x55\x55\x54\x54\x51\x8a\xa8\xa2\x65\x95\xa2\x8a\x8a\x4a\x66\x61\xa9\x6a\x46\x99\xa1\x98\x68\x62\xaa\x69\xa4\x55\x45\x51\x51\x45\x91\xa6\xa8\x94\x55\x56\x56\x65\x59\x45\x55\x15\x55\x94\x66\x64\x51\x59"
b"\x45\x55\x55\x15\x51\x55\x55\x54\xa6\x8a\x9a\x59\x46\x1a\xa8\xaa\xa6\x9a\x99\x96\x92\xa4\x64\x9a\x49\xa6\xaa\x46\x22\x45\x59\x54\x55\x15\x55\x16\x8a\x89\x95\x66\x45\x15\x45\x51\x55\x51\x55\x91\x45\x99\x45\x95\x91"
b"\x55\x14\x55\x54\x55\x59\x45\x66\x8a\x98\x65\x15\x5a\xa8\x69\x98\x69\x21\x86\x46\x26\x66\x6a\x66\x9a\x8a\x22\xaa\xa5\x55\x94\x55\x59\x56\x51\x59\x9a\x9a\x46\x54\x55\x64\x55\x15\x51\x55\x54\x55\x56\x54\x69\x65\x15"
b"\x55\x55\x51\x55\x55\x14\x55\x12\x08\x89\x91\x54\x62\x8a\x8a\x86\xa2\x66\x56\x69\xa9\x9a\x1a\x29\x29\xa2\xa6\x48\x59\x99\x45\x65\x91\x64\x55\x96\x28\x62\x55\x15\x64\x65\x55\x55\x15\x45\x65\x55\x55\x19\xa2\x51\x55"
b"\x51\x55\x15\x45\x45\x55\x55\x52\x9a\x65\x55\x65\xa6\x9a\x98\x6a\x66\x99\x64\xa8\x98\x61\xa6\x5a\x64\x98\x82\x26\x64\x54\x55\x51\x55\x45\x66\x51\x5a\xa6\x65\x66\x55\x95\x64\x55\x55\x55\x15\x45\x15\x56\x59\x95\x59"
b"\x55\x45\x55\x55\x55\x55\x45\x4a\x21\x56\x56\x5a\x28\x88\xaa\xaa\x89\x56\x2a\x66\x66\x66\xa1\xa1\xa6\x6a\x0a\x69\x95\x45\x59\x15\x45\x55\x51\x56\x64\x89\x18\x51\x45\x45\x15\x51\x54\x55\x54\x55\x54\x64\x59\x19\x95"
b"\x55\x55\x54\x54\x54\x51\x55\x50\x55\x64\x51\x86\xa2\xa9\x86\x46\x56\x46\x66\x28\x66\x2a\x66\x9a\x46\x86\x66\x91\x45\x55\x95\x55\x56\x59\x15\x85\x99\x99\x55\x95\x55\x55\x55\x55\x45\x51\x55\x55\x45\x55\x65\x64\x51"
b"\x51\x51\x45\x55\x55\x55\x54\x55\x65\x45\x66\x68\xa6\x2a\xaa\xa4\x65\x58\xa2\x99\x92\x64\x69\x25\x99\x9a\xa1\xa6\x56\x64\x51\x51\x51\x45\x66\x59\x18\xa1\xa5\x59\x64\x54\x51\x45\x55\x55\x45\x51\x55\x51\x46\x45\x55"
b"\x55\x55\x55\x51\x45\x54\x55\x55\x54\x55\x92\x8a\x8a\x92\x44\x65\x54\x66\x9a\x66\x6a\xa9\x92\x64\x64\xa8\x9a\x19\x64\x55\x55\x55\x95\x96\x51\x66\x66\x66\x44\x51\x45\x55\x55\x55\x54\x55\x55\x15\x55\x15\x54\x59\x55"
b"\x54\x55\x55\x15\x55\x15\x51\x64\x55\x54\xaa\xa4\xa2\x29\xa5\x55\x45\x4a\xa9\x86\x26\x46\xa6\x66\x6a\x9a\x69\x94\x59\x46\x54\x59\x45\x64\x66\x46\x9a\x19\x55\x95\x55\x45\x55\x54\x55\x51\x55\x55\x45\x55\x65\x65\x19"
b"\x55\x51\x45\x55\x55\x55\x15\x55\x55\x66\x24\xaa\x26\x62\x59\x45\x55\xa9\x24\x99\xa8\x69\x19\x99\x86\x8a\x8a\x66\x64\x55\x15\x51\x56\x15\x96\x59\x21\xa4\x99\x54\x55\x55\x14\x55\x45\x55\x85\x54\x55\x54\x56\x51\x55"
b"\x45\x55\x55\x54\x51\x51\x55\x15\x14\x52\xaa\x88\x88\x95\x45\x55\x16\x2a\xa9\xaa\x45\x9a\x64\x61\xaa\x69\xa4\x99\x19\x65\x59\x95\x55\x66\x46\x4a\x66\x99\x54\x55\x51\x51\x55\x45\x55\x15\x55\x15\x55\x15\x51\x56\x64"
b"\x55\x15\x14\x55\x55\x55\x55\x55\x55\x4a\x28\x64\x95\x54\x55\x51\x59\xa4\x6a\x64\x66\xa4\x56\x5a\x92\x8a\x29\x91\x99\x51\x54\x54\x61\x91\x99\x99\xaa\x46\x45\x64\x55\x95\x55\x55\x55\x54\x55\x55\x51\x55\x55\x15\x45"
b"\x55\x55\x55\x51\x55\x15\x45\x45\x51\xaa\x62\xa1\x51\x65\x54\x55\x58\xaa\x92\x86\x69\x45\x99\xa1\xaa\x69\xa6\x66\x91\x95\x85\x55\x55\x66\x62\x64\xa4\x99\x59\x45\x55\x55\x45\x15\x14\x55\x51\x51\x55\x51\x45\x58\x56"
b"\x51\x51\x55\x15\x45\x54\x55\x55\x15\x22\x26\x16\x55\x55\x55\x55\x5a\x48\xa6\x66\x64\x65\x92\x9a\x24\xa8\xa9\x1a\x15\x55\x55\x86\x45\x46\x19\x8a\x69\x96\x56\x55\x91\x45\x55\x55\x55\x59\x55\x55\x45\x55\x55\x55\x65"
b"\x55\x55\x45\x55\x55\x55\x54\x55\x55\xa6\x89\x55\x54\x51\x45\x45\x92\x89\xa8\x66\x46\x59\xa6\x89\x9a\x86\x91\xa9\x66\x46\x59\x55\x56\x56\x6a\x59\x8a\x64\x64\x59\x55\x54\x55\x51\x55\x94\x54\x54\x55\x15\x55\x15\x51"
b"\x55\x15\x55\x54\x54\x51\x55\x51\x56\x02\x55\x95\x15\x55\x55\x55\x1a\x18\x66\x64\x65\x99\x29\x99\x4a\xaa\x9a\x61\x95\x54\x51\x91\x95\x54\x64\xaa\x99\x15\x55\x54\x54\x55\x51\x55\x45\x15\x55\x55\x55\x54\x51\x54\x55"
b"\x51\x54\x54\x55\x55\x55\x45\x55\x45\x45\x95\x45\x55\x54\x54\x55\x61\xaa\x86\x66\x66\x61\x98\x65\xa4\x98\x66\x99\x51\x45\x96\x65\x45\x15\x86\x61\x29\x65\x85\x85\x55\x55\x55\x15\x55\x55\x15\x15\x51\x55\x55\x55\x66"
b"\x55\x55\x55\x51\x51\x55\x55\x15\x55\x55\x45\x55\x51\x45\x55\x51\x6a\x98\x66\x46\x59\x1a\xa6\x54\x6a\xaa\x92\x19\x15\x99\x64\x54\x55\x55\x5a\x66\x92\x51\x55\x55\x45\x45\x15\x54\x55\x45\x55\x54\x55\x45\x55\x45\x55"
b"\x55\x45\x45\x55\x55\x45\x55\x54\x54\x55\x54\x54\x55\x55\x45\x55\x46\x26\x99\x99\x19\xa6\x15\x45\x52\x49\xa6\x65\x59\x99\x25\x45\x55\x45\x54\x86\x25\x95\x99\x15\x55\x55\x55\x45\x51\x55\x45\x45\x55\x55\x14\x55\x45"
b"\x51\x55\x55\x15\x15\x54\x51\x55\x55\x51\x55\x55\x55\x15\x55\x15\x9a\x98\x64\x65\x92\x61\x54\x55\x6a\xa8\x6a\x65\x94\x61\x99\x55\x51\x55\x19\x69\xa6\x59\x45\x54\x54\x59\x45\x55\x55\x54\x55\x55\x45\x51\x55\x54\x55"
)
color_image_inkplate7 = bytearray(
b"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45"
b"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x55\x15\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55\x45\x54\x55"
b"\x51\x54\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51\x55\x15\x51"
b"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x55\x45\x51\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45"
b"\x51\x55\x15\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x55\x55\x55\x45\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x54\x51\x54\x55\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14\x51\x45\x14"
b"\x55\x55\x45\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55"
b"\x45\x55\x55\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45"
b"\x55\x14\x55\x45\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55"
b"\x55\x55\x51\x55\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x55"
b"\x51\x55\x15\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x51"
b"\x55\x45\x55\x45\x55\x15\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15"
b"\x55\x55\x54\x55\x51\x54\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x56\x55\x15\x55\x45\x55\x51\x59\x54\x55\x55\x15\x55\x45\x65\x51\x51\x54\x55\x55\x15\x95\x45\x55\x51\x55\x55"
b"\x51\x51\x45\x55\x15\x55\x51\x55\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x55\x54\x54\x55\x15\x15\x45\x55\x51\x51\x54\x54\x55\x15\x55\x55\x55\x51\x51\x54\x55\x55\x15\x15\x45\x55"
b"\x55\x55\x55\x51\x55\x45\x55\x45\x55\x15\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x45\x45\x55\x55\x55\x55\x55\x15\x15\x55\x55\x65\x55\x54\x54\x55\x45\x55\x95\x55\x51\x51\x55\x55\x55\x15"
b"\x54\x55\x55\x15\x55\x55\x15\x55\x15\x55\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x54\x55\x45\x51\x64\x54\x55\x51\x55\x15\x45\x55\x51\x55\x55\x51\x55\x15\x55\x45\x55\x15\x51\x54\x55\x51"
b"\x55\x51\x45\x55\x51\x55\x54\x55\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x54\x55\x55\x55\x15\x55\x55\x51\x55\x55\x54\x55\x14\x55\x45\x45\x55\x59\x54\x51\x55\x15\x55\x55\x45\x51\x55"
b"\x45\x55\x55\x55\x15\x45\x55\x51\x51\x45\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x55\x55\x51\x55\x55\x15\x45\x55\x55\x45\x55\x55\x55\x54\x55\x55\x15\x15\x45\x55\x51\x55\x54\x55\x55\x55\x55"
b"\x55\x15\x15\x15\x55\x55\x15\x55\x55\x55\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x55\x15\x45\x45\x15\x45\x55\x54\x55\x15\x14\x56\x45\x65\x45\x45\x54\x55\x55\x54\x55\x54\x55\x51\x45\x51\x55\x15\x15"
b"\x55\x55\x55\x51\x54\x55\x51\x45\x15\x55\x15\x55\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x45\x51\x51\x54\x55\x55\x55\x55\x14\x55\x55\x55\x55\x65\x66\x45\x55\x55\x55\x51\x51\x55\x55\x15\x55\x55\x55\x55\x45\x55\x51"
b"\x51\x51\x51\x55\x45\x51\x55\x55\x54\x51\x54\x54\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x54\x55\x54\x55\x55\x51\x51\x51\x58\xa2\x18\x66\x11\x95\x15\x55\x55\x91\x55\x55\x45\x15\x55\x15\x55\x51\x55"
b"\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x54\x55\x15\x15\x45\x45\x51\x51\x54\x54\x55\x15\x15\x45\x55\x51\x45\x51\x55\x15\x55\x55\x58\x59\x99\xa1\x56\x15\x54\x54\x64\x65\x85\x45\x55\x54\x51\x54\x54\x55\x55"
b"\x55\x15\x15\x14\x55\x15\x14\x51\x45\x45\x45\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x45\x55\x55\x55\x45\x55\x45\x45\x16\xa9\x89\x99\x95\x65\x45\x65\x99\x86\x54\x55\x15\x55\x55\x55\x55\x55\x15"
b"\x51\x55\x55\x55\x51\x55\x55\x55\x55\x55\x55\x55\x15\x55\x54\x55\x55\x15\x55\x45\x55\x51\x55\x54\x55\x54\x55\x15\x95\x96\x55\x54\x55\x55\x6a\x18\x66\x89\x64\x61\x96\x51\x46\x59\x59\x59\x54\x51\x55\x45\x45\x45\x51"
b"\x55\x51\x51\x51\x55\x51\x51\x54\x54\x54\x54\x55\x54\x55\x45\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x55\x55\x54\x51\x45\x51\x45\x55\x16\x19\xa9\xa8\x9a\x45\x99\x59\x16\x99\x24\x51\x55\x45\x55\x45\x55\x55\x55\x55"
b"\x55\x55\x55\x55\x55\x55\x55\x45\x55\x55\x55\x51\x55\x51\x55\x51\x55\x54\x55\x55\x15\x55\x45\x55\x51\x45\x51\x55\xa2\x64\x65\x55\x51\x54\xa8\xa2\x59\xa8\x55\x66\x45\x69\x26\x55\x56\x91\x55\x95\x54\x54\x54\x54\x55"
b"\x51\x45\x45\x15\x14\x55\x15\x55\x45\x45\x45\x55\x45\x55\x55\x15\x45\x45\x51\x51\x54\x54\x55\x15\x95\x55\x15\x45\x16\x61\x98\x69\x15\x66\x6a\x66\x66\x26\x59\x12\x56\x46\x69\x26\x65\x15\x59\x45\x15\x55\x55\x55\x51"
b"\x55\x55\x55\x55\x55\x51\x54\x55\x55\x55\x55\x15\x55\x15\x15\x55\x55\x55\x55\x55\x55\x55\x55\x59\x15\x55\x55\x55\x59\x19\x85\x91\xa6\x56\x28\xa2\x46\x49\x95\x65\x64\x5a\x66\x64\x49\x55\x14\x55\x55\x45\x45\x45\x55"
b"\x54\x54\x55\x51\x55\x15\x55\x51\x54\x54\x55\x54\x55\x55\x59\x51\x59\x54\x55\x15\x45\x65\x51\x92\x49\x19\x65\x95\x56\x66\x59\x99\x91\x91\xa6\x9a\x64\xa2\x51\x92\x55\x98\x61\x95\x59\x95\x55\x55\x54\x55\x55\x55\x15"
b"\x55\x55\x51\x55\x45\x55\x45\x55\x45\x55\x51\x55\x51\x51\x54\x55\x45\x15\x51\x56\x55\x14\x55\x98\xa2\x62\x44\x54\x51\x48\x64\x99\x1a\x1a\xa2\xa9\x19\x99\x95\x65\x85\x86\x66\x46\x64\x51\x59\x14\x55\x56\x51\x51\x55"
b"\x45\x45\x55\x45\x55\x54\x55\x15\x55\x45\x55\x45\x55\x55\x45\x55\x55\x55\x55\x54\x55\x55\x64\x8a\x69\x2a\x19\x99\x65\x56\x66\x46\x65\x99\x29\x82\x59\xa8\x54\x52\x54\x66\x98\x55\x85\x55\x45\x55\x51\x51\x55\x55\x51"
b"\x55\x55\x15\x55\x51\x45\x55\x54\x55\x55\x15\x55\x15\x15\x55\x45\x15\x51\x45\x45\x51\x54\x8a\x6a\x2a\x99\xa8\x46\x18\x65\x18\x68\x99\x2a\x6a\xa6\x98\x66\x45\xa6\x56\x69\x26\x64\x56\x54\x56\x55\x15\x55\x45\x15\x55"
b"\x54\x55\x54\x54\x55\x55\x55\x55\x51\x59\x54\x55\x55\x54\x54\x55\x54\x55\x55\x55\x55\x46\xa8\x22\x49\x29\x16\xa8\x62\x15\xa5\x96\x21\x56\x24\xa9\x95\x8a\x59\x61\x65\x86\x66\x55\x65\x15\x64\x51\x55\x54\x55\x54\x55"
b"\x55\x51\x55\x55\x55\x55\x45\x15\x15\x45\x55\x51\x51\x55\x55\x55\x55\x66\x99\x55\x15\x55\x2a\x86\xaa\xa2\x65\x92\x15\x99\x51\x91\x66\x66\x4a\x62\x12\x61\x95\x99\x51\x96\x49\x19\x19\x56\x55\x55\x54\x65\x55\x65\x51"
b"\x55\x55\x45\x45\x45\x14\x55\x51\x55\x55\x15\x55\x55\x45\x95\x51\x46\x11\x21\x45\x54\x56\x48\x9a\xa2\x9a\x49\x98\xa9\x64\x66\x16\x98\x91\xa2\x19\x99\x89\x91\x86\x56\x49\x99\x56\x54\x65\x16\x55\x55\x55\x64\x55\x55"
b"\x45\x15\x55\x55\x55\x55\x55\x55\x54\x55\x54\x54\x54\x58\x48\x55\x54\x99\x94\x55\x55\x55\xa6\xa2\xaa\x28\xa1\x66\x21\x91\xa1\x69\x85\x16\x4a\xa6\xa6\x69\x16\x61\x45\x95\x18\x91\x45\x51\x51\x45\x16\x45\x15\x51\x86"
b"\x55\x54\x54\x54\x54\x55\x45\x15\x65\x51\x55\x45\x55\x46\xa5\x96\x28\x59\x54\x66\x16\x44\x62\x8a\x86\x8a\x66\x91\x86\x56\x66\x91\x59\x69\xa2\x68\x64\x6a\x65\x15\x59\x19\x69\x96\x56\x55\x95\x55\x54\x55\x59\x59\x55"
b"\x55\x45\x55\x55\x55\x51\x55\x54\x55\x55\x45\x55\x45\x49\x45\x89\x99\x96\x62\x25\x45\x55\x66\x1a\x2a\x9a\xa8\x66\x68\x66\x48\x5a\x99\x94\x46\x86\x99\x92\x91\xa5\x96\x64\x56\x64\x65\x16\x15\x51\x65\x54\x54\x45\xa6"
b"\x51\x55\x45\x45\x45\x55\x55\x55\x51\x45\x55\x55\x66\x56\x59\x98\xa8\x61\x26\x62\x61\x26\x60\xa9\xa1\xa8\xa6\xa1\x96\x61\x55\x95\x11\x86\x69\xa2\x86\x69\x26\x25\x14\x66\x61\x45\x55\x55\x54\x55\x45\x65\x99\x99\x19"
b"\x55\x55\x55\x55\x55\x15\x14\x51\x55\x55\x51\x45\x91\x22\x28\x88\x66\x4a\xa2\x16\x96\x51\x26\x52\x28\x8a\x4a\x1a\x99\xa6\x99\x49\x69\x59\x94\x99\x99\x86\xaa\x95\x56\x49\x56\x5a\x46\x46\x55\x58\x56\x19\x91\x66\x64"
b"\x55\x14\x54\x54\x55\x55\x55\x55\x54\x54\x55\x55\x48\xa9\x99\xa6\x86\x66\x64\xa5\x19\x96\x61\x99\x96\x16\xa9\xa9\x24\x18\x94\x58\x58\x66\x49\xa2\x21\x9a\x61\x86\x62\x86\x48\x65\x55\x94\x51\x45\x99\x61\x96\x61\x99"
b"\x51\x55\x55\x55\x51\x51\x55\x15\x15\x55\x55\x22\x99\x92\x86\x88\x59\x91\x89\x59\x99\x66\x55\x99\x55\x65\x5a\x62\x69\x68\x19\x9a\x56\x21\x9a\x4a\x69\x8a\x26\xa4\x58\x51\x96\x46\x24\x66\x15\x95\x51\x96\x46\x66\x16"
b"\x55\x55\x45\x45\x55\x55\x45\x55\x55\x45\x94\xa4\xa6\xa6\x69\x99\xa6\x66\x58\x64\x61\x14\x61\x51\x19\x91\x14\x64\x92\x65\x95\x91\x85\x65\x91\xa4\x92\x19\xa9\x25\x66\xaa\x58\x66\x59\x61\xa6\x58\x65\xa9\x99\x29\x99"
b"\x55\x45\x55\x55\x15\x15\x55\x51\x51\x59\x8a\x8a\x48\x0a\x86\x62\x64\x52\x99\x56\x55\x65\x99\x25\x54\x46\x66\x62\x19\x91\x61\x99\x65\x92\x66\x8a\xa4\xa2\x62\x6a\x22\x14\x66\x61\x91\x9a\x61\x15\x98\x46\x66\x61\x65"
b"\x51\x55\x15\x15\x55\x54\x54\x55\x55\x22\x18\x66\xaa\x64\x64\xa6\x86\x65\x09\x85\x64\x59\x56\x56\x65\x59\x85\x19\x96\x46\x5a\x48\x69\x18\x89\x92\x2a\x1a\x26\x21\x64\x69\x59\x99\x64\x98\x98\x66\x46\x65\x18\x96\x45"
b"\x55\x51\x55\x55\x45\x45\x55\x55\x19\xa9\xaa\x8a\x1a\xaa\xa9\x61\x99\x1a\x58\x59\x16\x94\x85\x65\x45\x95\x56\x68\x99\x59\x84\x66\x89\x64\xa2\x2a\x11\xa1\x22\x64\x89\x84\x91\x86\x1a\x19\x92\x66\x61\x99\x26\x66\x56"
b"\x54\x55\x51\x51\x55\x55\x45\x45\x52\x12\x0a\xaa\xa9\x26\x46\x96\x9a\x65\x99\x96\x65\x25\x56\x44\x56\x45\x15\x56\x24\x64\x69\xa1\x92\x21\x84\x99\x22\x1a\x62\x09\x28\x5a\x65\x61\x99\x86\x69\x92\x19\x92\x69\x91\x65"
b"\x55\x55\x55\x55\x54\x55\x55\x55\x58\x2a\x86\x18\x62\x68\xa8\x69\x19\x14\x59\x91\x51\x66\x54\x59\x95\x55\x62\x65\x49\x92\x86\x1a\x62\x9a\x2a\x44\x86\x44\x99\xa6\x85\x92\x48\x86\x46\x66\x26\x26\x56\x26\x62\x16\x61"
b"\x45\x45\x15\x15\x15\x51\x51\x51\x55\x62\xa9\xa6\x66\x86\x66\x46\x91\x65\x92\x15\x96\x51\x45\x66\x61\x46\x56\x46\x06\x65\x99\xa4\xa6\x21\x84\x62\x64\x99\x82\x11\x18\x64\x96\x28\x61\x18\x62\x49\x9a\x62\x59\x65\x92"
b"\x55\x55\x55\x55\x55\x55\x55\x55\x45\x59\x18\xa8\x98\x99\x91\xa4\x56\x66\x55\x66\x59\x25\x59\x14\x55\x55\x15\x41\x09\x18\x88\x9a\x18\x62\x49\x91\x80\x64\x55\x99\x92\x44\x46\x14\x98\x86\x66\x08\x62\x20\x91\x58\x65"
b"\x54\x55\x51\x51\x51\x45\x15\x15\x56\x2a\xaa\x66\x69\x99\x19\x65\x99\x14\x61\x94\x46\x56\x59\x99\x64\x65\x64\x49\x22\x19\x92\x49\x86\x86\x61\x99\x18\x46\x49\x11\x12\x5a\x21\x22\x05\x20\x48\x61\x99\x24\x96\x46\xa6"
b"\x55\x51\x55\x55\x55\x55\x55\x54\x59\x86\x26\x86\x19\x99\x66\x59\x45\x99\x55\x55\x55\x64\x51\x55\x45\x51\x55\x89\x89\x98\x8a\x62\x61\x61\x56\x46\x46\x48\x21\x20\x64\x84\x48\x84\x60\x92\x89\x96\x22\xa8\x65\x9a\x59"
b"\x55\x55\x45\x45\x15\x55\x51\x55\x50\xa2\x62\x69\xa4\x64\x55\x14\x59\x56\x59\x19\x91\x45\x55\x85\x96\x66\x46\x61\x8a\x66\x62\x21\x18\x86\x45\x44\x40\x81\x10\x46\x08\x12\x16\x10\x92\x08\x42\x26\x59\x99\x98\x64\x86"
b"\x45\x15\x55\x55\x54\x51\x55\x45\x65\x56\x16\x1a\x66\x46\xa1\x65\x99\x18\x65\x54\x56\x55\x98\x55\x15\x15\x55\x5a\x48\x91\x84\x62\x89\x18\x64\x84\x48\x52\x06\x10\x41\x10\x40\x1a\x41\x91\x28\x45\x22\x46\x46\x89\x99"
b"\x55\x54\x54\x55\x55\x55\x15\x55\x15\x15\x59\xa4\x89\x99\xa6\x66\x52\x65\x91\x45\x99\x59\x15\x59\x59\x51\x86\x12\x61\xa6\x6a\x66\x62\x86\x21\x06\x11\x05\x44\x48\x12\x11\x04\x84\x66\x10\x04\x98\x64\x64\xa8\x66\x22"
b"\x55\x45\x55\x51\x45\x45\x54\x55\x55\x59\xa6\x2a\x66\x66\x49\x91\x65\x99\x15\x96\x51\x45\x56\x44\x64\x56\x55\x65\x1a\x18\x96\x16\x16\x62\x86\x60\x06\x44\x61\x51\x04\x48\x61\x12\x11\x22\x28\x88\x99\x66\x19\xa2\x89"
b"\x51\x55\x45\x55\x55\x55\x55\x51\x51\x61\x22\x68\x68\x44\xa6\x24\x59\x25\x51\x65\x15\x96\x45\x56\x45\x65\x19\x99\x99\xa9\x85\x65\x92\x29\x28\x54\x80\x61\x14\x86\x11\x11\x00\x08\x42\x04\x04\x86\x44\x49\x91\x19\x9a"
b"\x55\x55\x55\x15\x51\x55\x15\x15\x99\x9a\x66\x86\x9a\xaa\x6a\x6a\x91\x91\x9a\x50\x59\x45\x98\x65\x66\x51\x64\x4a\x62\x84\x66\x46\x66\x5a\x85\x88\x66\x18\x88\x51\x18\x62\x12\x01\x24\x80\x82\x22\x12\x56\x1a\x99\x96"
b"\x55\x14\x55\x54\x55\x45\x55\x55\x48\x8a\x99\xa9\x86\x66\x24\x91\x19\x66\x64\x66\x64\x59\x55\x59\x15\x16\x59\xa8\xa6\x66\x58\x59\x19\x18\x5a\x66\x21\x86\x61\x22\x21\x20\x25\x52\x48\x48\x18\x65\xa1\xa1\x65\x19\x21"
b"\x51\x55\x51\x55\x54\x55\x45\x58\xa6\x64\x88\x62\x92\x49\xa9\xa6\x9a\x48\x66\x58\x55\x94\x51\x91\x69\xa6\x64\x86\x49\x99\x15\x91\x61\x95\x91\x12\x66\x68\x96\x61\x9a\x45\x12\x24\x21\x91\x99\x92\x46\x16\x66\x51\x98"
b"\x55\x55\x55\x45\x45\x56\x55\x16\x46\x8a\x66\x99\xa6\xa2\x64\x99\x24\x55\x91\x45\x99\x65\x65\x56\x92\x61\x29\xa6\x99\x11\x99\x1a\x56\x46\x65\x96\x18\x65\x92\x18\x91\x99\x88\x61\x99\x19\x24\x66\xa9\x98\x45\x96\x65"
b"\x55\x45\x15\x55\x55\x54\x55\x8a\xa8\x66\x9a\xa8\xa8\x66\x89\x9a\x56\x69\x15\x96\x51\x51\x51\x98\x6a\x1a\x92\x64\x51\x66\x46\x54\x65\x64\x46\x59\x65\x91\x89\xa1\x98\x48\x9a\x9a\x61\xa2\x26\x88\x42\x19\x11\x86\x18"
b"\x51\x55\x54\x54\x55\x95\x51\x98\x66\x99\x91\x86\x9a\xa9\x99\x91\x99\x56\x55\x65\x15\x96\x66\x44\xa6\x28\xa6\x15\x9a\x64\x55\x19\x51\x26\x64\x45\x11\x9a\x19\x19\x15\x98\x86\x24\xa6\x19\x91\x99\x99\x65\x99\x59\x86"
b"\x55\x54\x55\x55\x51\x45\x68\xaa\x29\x99\x2a\xa8\xa1\x91\x94\x65\x46\x19\x64\x55\x59\x46\x5a\xaa\x22\x99\x99\x86\x64\x95\x99\x66\x16\x19\x98\x64\x19\x21\x89\x66\x66\x59\x66\x61\x85\x65\x99\x19\x19\x99\x96\x66\x59"
b"\x54\x55\x55\x15\x95\x55\x06\x26\x64\x64\x92\x19\x99\x26\x45\x96\x59\x54\x55\x86\x54\x69\x24\x66\x66\x8a\x24\x59\x1a\x46\x51\x91\x65\x92\x26\x59\x66\x66\x99\x94\x51\x46\x46\x16\x59\x92\x46\x61\x91\x84\x61\x91\x96"
b"\x55\x51\x51\x54\x55\x51\x55\x62\x85\x59\xaa\xaa\x9a\x66\x59\x64\x65\x91\x64\x55\x19\xa6\x9a\x88\xa8\x65\x99\x99\x64\x55\x16\x46\x2a\x29\x55\x16\x59\x28\xa4\x45\x56\x54\x59\x66\x64\xa6\x99\x55\x66\x66\x65\x19\x46"
b"\x45\x55\x55\x55\x51\x55\x59\x24\x59\x98\x88\x61\x26\x64\x66\x45\x94\x56\x45\x66\x58\x92\x8a\x2a\x86\x9a\x66\x46\x45\x66\x69\x26\x51\xa6\x45\x59\x22\xa9\x86\x56\x19\x25\x51\x59\x29\x98\x68\x99\x14\x65\x19\x66\x69"
b"\x55\x15\x15\x45\x55\x15\x51\x85\x66\x26\x2a\x1a\x61\x86\x91\x59\x45\x99\x56\x59\x64\xaa\x26\x98\x69\xa4\x86\x65\x56\x61\x92\x66\xaa\x45\x55\x14\x66\x49\x99\x91\x59\x65\x96\x45\x52\x45\xa6\x65\x59\x51\x55\x94\x55"
b"\x55\x55\x54\x55\x15\x54\x54\x59\x61\x88\x66\x65\x9a\x69\x9a\x9a\x66\x51\x96\x45\x16\x66\x68\xaa\xa8\x66\xa4\x51\x99\x1a\x26\x64\x46\x55\x15\x68\x98\xa6\x19\x15\x91\x14\x59\x56\x55\x99\x86\x14\x56\x55\x64\x55\x51"
b"\x51\x51\x55\x55\x55\x45\x59\x9a\x1a\xaa\x19\x5a\x26\xa4\xa9\x28\x68\x55\x45\x59\xaa\x28\xaa\x61\x99\x89\x95\x95\x86\xaa\x19\x88\x99\x51\x51\x45\xaa\x89\xa4\x59\x59\x65\x45\x14\x65\x19\x59\xa6\x64\x59\x95\x45\x95"
b"\x55\x55\x45\x51\x51\x55\x55\x22\xaa\x19\x94\xa1\xa8\x8a\xa2\x9a\x95\x98\x66\x92\x49\xaa\x8a\xaa\x86\x99\x19\x66\x69\x18\x64\x66\x54\x55\x55\x9a\x46\x6a\x19\x54\x46\x51\x55\x65\x45\x51\x91\x86\x45\x51\x45\x59\x45"
b"\x55\x15\x55\x15\x55\x55\x15\x9a\x21\xa5\x62\x6a\xaa\x6a\x69\xa1\x69\x86\x64\x66\xa6\x24\x9a\x19\xa9\x19\x91\x46\x1a\xa6\x66\x89\x15\x51\x59\x18\xaa\x26\xa4\x66\x99\x15\x64\x54\x55\x55\x16\x59\x96\x55\x56\x54\x55"
b"\x51\x54\x55\x55\x45\x45\x58\xa1\xa6\x54\x69\xa1\x86\xaa\x2a\x16\x44\x99\x9a\xa9\x2a\xaa\xa9\xa8\x62\x66\x56\x69\xa2\x61\x98\x95\x55\x15\x85\x66\x62\xa2\x45\x51\x91\x56\x45\x65\x59\x15\x66\x61\x25\x19\x14\x55\x55"
b"\x55\x55\x51\x54\x55\x55\x86\x8a\x15\x66\xa2\x2a\xaa\x26\x65\xaa\xa9\xaa\x86\x46\xa4\x8a\x18\x9a\x96\x61\x46\x86\x9a\x2a\x89\x99\x45\x55\x56\x48\xa6\x26\x9a\x65\x65\x64\x55\x46\x51\x55\x51\x56\x69\x65\x65\x65\x91"
b"\x55\x45\x55\x45\x54\x55\x68\x69\x59\x12\x1a\x9a\x4a\x62\x61\x98\x6a\x64\x69\x9a\x2a\x98\xaa\xa1\x99\x96\x59\xa8\xa9\x99\x26\x54\x56\x51\x45\x99\xa2\x86\x65\x14\x56\x45\x54\x55\x15\x51\x55\x19\x84\x51\x56\x44\x55"
b"\x51\x55\x15\x55\x55\x51\x2a\x15\x56\xaa\xaa\x28\xa6\x16\x6a\x8a\x92\x8a\x98\x66\x62\x8a\x86\x66\x61\xa5\xa2\x99\x8a\x62\x99\x45\x54\x55\x55\x1a\x66\x6a\x19\x59\x45\x55\x45\x91\x55\x55\x15\x99\x62\x96\x45\x55\x55"
b"\x55\x55\x54\x55\x95\x56\x89\x65\x12\x4a\x26\xa6\xa1\x66\x28\x99\xaa\x66\x66\xa2\x8a\x21\xaa\x19\x1a\x46\x1a\x2a\x66\x29\x94\x55\x45\x51\x91\x62\x1a\x86\x91\x95\x54\x59\x55\x55\x54\x55\x55\x44\x56\x64\x56\x46\x45"
b"\x54\x51\x55\x51\x45\x14\x65\x55\x68\xa9\x8a\x22\x56\x6a\x69\xa8\xa6\x28\xa9\x16\x54\xaa\x46\x66\xa6\x66\xaa\x64\xa2\x99\x45\x56\x55\x95\x55\x66\xa8\x6a\x65\x44\x65\x45\x19\x15\x95\x45\x51\x55\x99\x45\x95\x65\x55"
b"\x55\x55\x45\x55\x55\x54\x54\x51\x8a\xa8\xa2\x65\x95\xa2\x8a\x8a\x4a\x66\x61\xa9\x6a\x46\x99\xa1\x98\x68\x62\xaa\x69\xa4\x55\x45\x51\x51\x45\x91\xa6\xa8\x94\x55\x56\x56\x65\x59\x45\x55\x15\x55\x94\x66\x64\x51\x59"
b"\x45\x55\x55\x15\x51\x55\x55\x54\xa6\x8a\x9a\x59\x46\x1a\xa8\xaa\xa6\x9a\x99\x96\x92\xa4\x64\x9a\x49\xa6\xaa\x46\x22\x45\x59\x54\x55\x15\x55\x16\x8a\x89\x95\x66\x45\x15\x45\x51\x55\x51\x55\x91\x45\x99\x45\x95\x91"
b"\x55\x14\x55\x54\x55\x59\x45\x66\x8a\x98\x65\x15\x5a\xa8\x69\x98\x69\x21\x86\x46\x26\x66\x6a\x66\x9a\x8a\x22\xaa\xa5\x55\x94\x55\x59\x56\x51\x59\x9a\x9a\x46\x54\x55\x64\x55\x15\x51\x55\x54\x55\x56\x54\x69\x65\x15"
b"\x55\x55\x51\x55\x55\x14\x55\x12\x08\x89\x91\x54\x62\x8a\x8a\x86\xa2\x66\x56\x69\xa9\x9a\x1a\x29\x29\xa2\xa6\x48\x59\x99\x45\x65\x91\x64\x55\x96\x28\x62\x55\x15\x64\x65\x55\x55\x15\x45\x65\x55\x55\x19\xa2\x51\x55"
b"\x51\x55\x15\x45\x45\x55\x55\x52\x9a\x65\x55\x65\xa6\x9a\x98\x6a\x66\x99\x64\xa8\x98\x61\xa6\x5a\x64\x98\x82\x26\x64\x54\x55\x51\x55\x45\x66\x51\x5a\xa6\x65\x66\x55\x95\x64\x55\x55\x55\x15\x45\x15\x56\x59\x95\x59"
b"\x55\x45\x55\x55\x55\x55\x45\x4a\x21\x56\x56\x5a\x28\x88\xaa\xaa\x89\x56\x2a\x66\x66\x66\xa1\xa1\xa6\x6a\x0a\x69\x95\x45\x59\x15\x45\x55\x51\x56\x64\x89\x18\x51\x45\x45\x15\x51\x54\x55\x54\x55\x54\x64\x59\x19\x95"
b"\x55\x55\x54\x54\x54\x51\x55\x50\x55\x64\x51\x86\xa2\xa9\x86\x46\x56\x46\x66\x28\x66\x2a\x66\x9a\x46\x86\x66\x91\x45\x55\x95\x55\x56\x59\x15\x85\x99\x99\x55\x95\x55\x55\x55\x55\x45\x51\x55\x55\x45\x55\x65\x64\x51"
b"\x51\x51\x45\x55\x55\x55\x54\x55\x65\x45\x66\x68\xa6\x2a\xaa\xa4\x65\x58\xa2\x99\x92\x64\x69\x25\x99\x9a\xa1\xa6\x56\x64\x51\x51\x51\x45\x66\x59\x18\xa1\xa5\x59\x64\x54\x51\x45\x55\x55\x45\x51\x55\x51\x46\x45\x55"
b"\x55\x55\x55\x51\x45\x54\x55\x55\x54\x55\x92\x8a\x8a\x92\x44\x65\x54\x66\x9a\x66\x6a\xa9\x92\x64\x64\xa8\x9a\x19\x64\x55\x55\x55\x95\x96\x51\x66\x66\x66\x44\x51\x45\x55\x55\x55\x54\x55\x55\x15\x55\x15\x54\x59\x55"
b"\x54\x55\x55\x15\x55\x15\x51\x64\x55\x54\xaa\xa4\xa2\x29\xa5\x55\x45\x4a\xa9\x86\x26\x46\xa6\x66\x6a\x9a\x69\x94\x59\x46\x54\x59\x45\x64\x66\x46\x9a\x19\x55\x95\x55\x45\x55\x54\x55\x51\x55\x55\x45\x55\x65\x65\x19"
b"\x55\x51\x45\x55\x55\x55\x15\x55\x55\x66\x24\xaa\x26\x62\x59\x45\x55\xa9\x24\x99\xa8\x69\x19\x99\x86\x8a\x8a\x66\x64\x55\x15\x51\x56\x15\x96\x59\x21\xa4\x99\x54\x55\x55\x14\x55\x45\x55\x85\x54\x55\x54\x56\x51\x55"
b"\x45\x55\x55\x54\x51\x51\x55\x15\x14\x52\xaa\x88\x88\x95\x45\x55\x16\x2a\xa9\xaa\x45\x9a\x64\x61\xaa\x69\xa4\x99\x19\x65\x59\x95\x55\x66\x46\x4a\x66\x99\x54\x55\x51\x51\x55\x45\x55\x15\x55\x15\x55\x15\x51\x56\x64"
b"\x55\x15\x14\x55\x55\x55\x55\x55\x55\x4a\x28\x64\x95\x54\x55\x51\x59\xa4\x6a\x64\x66\xa4\x56\x5a\x92\x8a\x29\x91\x99\x51\x54\x54\x61\x91\x99\x99\xaa\x46\x45\x64\x55\x95\x55\x55\x55\x54\x55\x55\x51\x55\x55\x15\x45"
b"\x55\x55\x55\x51\x55\x15\x45\x45\x51\xaa\x62\xa1\x51\x65\x54\x55\x58\xaa\x92\x86\x69\x45\x99\xa1\xaa\x69\xa6\x66\x91\x95\x85\x55\x55\x66\x62\x64\xa4\x99\x59\x45\x55\x55\x45\x15\x14\x55\x51\x51\x55\x51\x45\x58\x56"
b"\x51\x51\x55\x15\x45\x54\x55\x55\x15\x22\x26\x16\x55\x55\x55\x55\x5a\x48\xa6\x66\x64\x65\x92\x9a\x24\xa8\xa9\x1a\x15\x55\x55\x86\x45\x46\x19\x8a\x69\x96\x56\x55\x91\x45\x55\x55\x55\x59\x55\x55\x45\x55\x55\x55\x65"
b"\x55\x55\x45\x55\x55\x55\x54\x55\x55\xa6\x89\x55\x54\x51\x45\x45\x92\x89\xa8\x66\x46\x59\xa6\x89\x9a\x86\x91\xa9\x66\x46\x59\x55\x56\x56\x6a\x59\x8a\x64\x64\x59\x55\x54\x55\x51\x55\x94\x54\x54\x55\x15\x55\x15\x51"
b"\x55\x15\x55\x54\x54\x51\x55\x51\x56\x02\x55\x95\x15\x55\x55\x55\x1a\x18\x66\x64\x65\x99\x29\x99\x4a\xaa\x9a\x61\x95\x54\x51\x91\x95\x54\x64\xaa\x99\x15\x55\x54\x54\x55\x51\x55\x45\x15\x55\x55\x55\x54\x51\x54\x55"
b"\x51\x54\x54\x55\x55\x55\x45\x55\x45\x45\x95\x45\x55\x54\x54\x55\x61\xaa\x86\x66\x66\x61\x98\x65\xa4\x98\x66\x99\x51\x45\x96\x65\x45\x15\x86\x61\x29\x65\x85\x85\x55\x55\x55\x15\x55\x55\x15\x15\x51\x55\x55\x55\x66"
b"\x55\x55\x55\x51\x51\x55\x55\x15\x55\x55\x45\x55\x51\x45\x55\x51\x6a\x98\x66\x46\x59\x1a\xa6\x54\x6a\xaa\x92\x19\x15\x99\x64\x54\x55\x55\x5a\x66\x92\x51\x55\x55\x45\x45\x15\x54\x55\x45\x55\x54\x55\x45\x55\x45\x55"
b"\x55\x45\x45\x55\x55\x45\x55\x54\x54\x55\x54\x54\x55\x55\x45\x55\x46\x26\x99\x99\x19\xa6\x15\x45\x52\x49\xa6\x65\x59\x99\x25\x45\x55\x45\x54\x86\x25\x95\x99\x15\x55\x55\x55\x45\x51\x55\x45\x45\x55\x55\x14\x55\x45"
b"\x51\x55\x55\x15\x15\x54\x51\x55\x55\x51\x55\x55\x55\x15\x55\x15\x9a\x98\x64\x65\x92\x61\x54\x55\x6a\xa8\x6a\x65\x94\x61\x99\x55\x51\x55\x19\x69\xa6\x59\x45\x54\x54\x59\x45\x55\x55\x54\x55\x55\x45\x51\x55\x54\x55"
)

View File

@ -0,0 +1,110 @@
from soldered_inkplate6PLUS import Inkplate
import time
from ub_sched import Event
START_HOUR = 8
END_HOUR = 18
DISPLAY = Inkplate(Inkplate.INKPLATE_2BIT)
DISPLAY.begin()
BLACK = 0
MONTHS = [
"???",
"Jan.",
"Feb.",
"Mar.",
"Apr.",
"May ",
"Jun.",
"Jul.",
"Aug.",
"Sep.",
"Oct.",
"Nov.",
"Dec.",
]
WEEKDAYS = [
"Mon.",
"Tue.",
"Wed.",
"Thu.",
"Fri.",
"Sat.",
"Sun.",
]
def date_str():
(year, month, mday, hour, minute, second, weekday, yearday) = time.localtime()
# print(weekday, month, mday, year)
return
def drawText(x, y, s, size = DISPLAY.textSize, color = BLACK):
DISPLAY.GFX._very_slow_text(x, y, s, size, color)
def render_display(events):
(year, month, mday, hour, minute, second, weekday, yearday) = time.localtime()
display = DISPLAY
print("On a display of size", display.width(), display.height())
print("Xu Li... Do the thing!")
display.clearDisplay()
print("Drawing header")
drawText(20, 20, "Capen 212A", size = 4)
drawText(680, 30, "{} {} {}, {}".format(WEEKDAYS[weekday], MONTHS[month], mday, year), size = 3)
display.drawFastHLine(0, 60, display.width(), BLACK)
calendar_top = 60
calendar_left = 10
calendar_height = display.height() - calendar_top;
calendar_width = display.width() - 20;
hour_step = calendar_height / (END_HOUR - START_HOUR)
print("Drawing day planner")
for i in range(START_HOUR, END_HOUR):
y = int( (i - START_HOUR) * hour_step + calendar_top )
display.drawFastHLine(
int(calendar_left+40), y,
calendar_width-40,
BLACK
)
hour = i
ampm = "AM"
if hour >= 12:
ampm = "PM"
if hour > 12:
hour -= 12
drawText(10, y+2, "{} {}".format(hour, ampm), size = 1)
print("Drawing events")
for event in events:
if event.start.is_date(year, month, mday) or event.end.is_date(year, month, mday):
print("Drawing {}".format(event.event))
if (not event.start.is_date(year, month, mday)) or event.start.hour < START_HOUR:
low_hour = 0.0
else:
low_hour = event.start.hour + (event.start.minute / 60) - START_HOUR
if (not event.end.is_date(year, month, mday)) or event.end.hour >= END_HOUR:
high_hour = float(END_HOUR - START_HOUR)
else:
high_hour = event.end.hour + (event.end.minute / 60) - START_HOUR
x0 = calendar_left+50
y0 = int(low_hour * hour_step) + calendar_top + 10
w = calendar_width-60
h = int((high_hour - low_hour) * hour_step) - 20
radius = 8
print(low_hour, high_hour, "//", x0, y0, w, h)
display.fillRoundRect(x0, y0, w, h, radius, 1)
display.drawRoundRect(x0, y0, w, h, radius, 0)
drawText(x0+10, y0+10, event.event, size = 2)
else:
print("Skipping {}; not today".format(event.event))
print("Rendering")
display.display()

23
conf_room/main.py Normal file
View File

@ -0,0 +1,23 @@
import ub_devices
import ub_sched
from conf_room_layout import render_display
from time import sleep
sleep(2)
print("Main script!")
sleep(1)
print("Connecting to wifi")
ub_devices.connect()
room = ub_sched.RoomSchedule(ub_sched.ROOM_CAPEN_212A)
while True:
try:
print("Fetching events")
events = room.fetch()
render_display(events)
sleep(600)
except Exception as e:
print(e)
sleep(30)

24
conf_room/ub_devices.py Normal file
View File

@ -0,0 +1,24 @@
# Connection Settings for UB_Devices
# - Oliver Kennedy okennedy@buffalo.edu
# Based on...
# https://www.buffalo.edu/ubit/service-guides/connecting/resnet/boost-gaming.html
import network
import ntptime
from time import sleep
def connect():
nic = network.WLAN(network.STA_IF)
nic.active(True)
while not nic.isconnected():
print("Connecting to wifi...")
nic.connect('UB_Devices', 'goubbulls')
for i in range(1, 10):
if nic.isconnected():
break
sleep(1)
if not nic.isconnected():
print("Connection failed. Sleeping.")
sleep(5)
ntptime.settime()

104
conf_room/ub_sched.py Normal file
View File

@ -0,0 +1,104 @@
# Room Schedule Lookup
# - Oliver Kennedy okennedy@buffalo.edu
# - Adapted from a shell script by Grant Iraci
# https://gist.github.com/iracigt/181d8f0feafb07ec39b26d4869bffd0d
import urequests as request
import json
import time
# Other useful ROOM_IDs:
ROOM_DAVIS_113A = 1768
ROOM_DAVIS_338A = 1769
ROOM_DAVIS_113Y = 3199
ROOM_DAVIS_310 = 2941
ROOM_DAVIS_337 = 3065
ROOM_DAVIS_101 = 611
ROOM_DAVIS_1ST_FLOOR_ATRIUM = 2409
ROOM_DAVIS_2ND_FLOOR_LOUNGE = 2410
ROOM_CAPEN_212A = 3215
ROOM_ANY = -1
# Other useful BLDG_IDs:
BUILDING_DAVIS_HALL = 74
BUILDING_ANY_BUILDING = -1
UB_SCHED_URL = "https://spacerequest.buffalo.edu/EVNTWebApp/AnonymousServersApi.aspx/CustomBrowseEvents"
def dateoct_to_iso(dateoct):
(year, month, mday, hour, minute, second, weekday, yearday) = dateoct
return "{:04}-{:02}-{:02}T{:02}:{:02}:{:02}".format(year, month, mday, hour, minute, second)
def iso_to_datehex(iso):
(iday, itime) = iso.split("T")
(year, month, mday) = iday.split("-")
(hour, minute, second) = itime.split(":")
return (int(year), int(month), int(mday), int(hour), int(minute), int(second))
class EventTime:
def __init__(self, iso):
(iday, itime) = iso.split("T")
(year, month, mday) = iday.split("-")
(hour, minute, second) = itime.split(":")
self.year = int(year)
self.month = int(month)
self.mday = int(mday)
self.hour = int(hour)
self.minute = int(minute)
self.second = int(second)
def is_date(self, year, month, mday):
# print("{} == {} / {} == {} / {} == {}".format(self.year, year, self.month, month, self.mday, mday))
return (int(self.year) == int(year)) and (int(self.month) == int(month)) and (int(self.mday) == int(mday))
class Event:
def __init__(self, e):
self.event = e["EventName"]
self.start = EventTime(e["TimeBookingStart"])
self.end = EventTime(e["TimeBookingEnd"])
self.room = e["Room"]
self.creator = e["GroupName"]
class RoomSchedule:
def __init__(self, room, building = BUILDING_ANY_BUILDING):
self.BLDG_ID = building
self.ROOM_ID = room
def fetch(self):
req = {
"date": dateoct_to_iso(time.localtime()),
"data": {
"BuildingId": self.BLDG_ID,
"GroupTypeId": -1,
"GroupTypeId": -1,
"GroupId":-1,
"EventTypeId":-1,
"RoomId": self.ROOM_ID,
"StatusId":-1,
"ZeroDisplayOnWeb":0,
"HeaderUrl":"",
"Title":"",
"Format":1,
"Rollup":0,
"EncryptD":"https://spacerequest.buffalo.edu/EVNTWebApp/CustomBrowseEvents.aspx",
"PageSize":1000,
"DropEventsInPast":False
}
}
resp = request.post(
url=UB_SCHED_URL,
json=req,
headers={
"Accept": "application/json, text/javascript"
}
)
wrapper = resp.json()["d"]
bookings = [
Event(e)
for e in json.loads(wrapper)["MonthlyBookingResults"]
]
return bookings
if __name__ == '__main__':
room = RoomSchedule(ROOM_CAPEN_212A)
print(room.fetch())

18
i2c_scanner.py Normal file
View File

@ -0,0 +1,18 @@
# Scanner i2c en MicroPython | MicroPython i2c scanner
# Renvoi l'adresse en decimal et hexa de chaque device connecte sur le bus i2c
# Return decimal and hexa adress of each i2c device
# https://projetsdiy.fr - https://diyprojects.io (dec. 2017)
import machine
i2c = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21))
print('Scan i2c bus...')
devices = i2c.scan()
if len(devices) == 0:
print("No i2c device !")
else:
print('i2c devices found:',len(devices))
for device in devices:
print("Decimal address: ",device," | Hexa address: ",hex(device))

View File

@ -1,4 +1,6 @@
# Copyright © 2020 by Thorsten von Eicken.
# MicroPython driver for Inkplate 10
# Contributed by: https://github.com/tve
# Copyright © 2020 by Thorsten von Eicken
import time
import micropython
import framebuf
@ -20,14 +22,15 @@ D_COLS = const(1200)
# Order of 4 values in each tuple: blk, dk-grey, light-grey, white
# Meaning of values: 0=dischg, 1=black, 2=white, 3=skip
# Uses "colors" 0 (black), 3, 5, and 7 (white) from 3-bit waveforms below
WAVE_2B = ( # For Inkplate 10, colors 0, 3, 5-tweaked, and 7 from arduino driver
(0, 1, 0, 0), # (arduino color 5 was too light and color 4 too dark)
(0, 2, 0, 0),
(0, 2, 0, 2),
(0, 1, 2, 2),
(0, 2, 1, 2),
(0, 2, 1, 2),
(1, 1, 2, 2),
WAVE_2B = ( # original mpy driver for Ink 6, differs from arduino driver below
(1, 1, 2, 0),
(1, 1, 1, 0),
(0, 2, 1, 0),
(1, 2, 1, 0),
(0, 0, 2, 2),
(1, 1, 0, 0),
(0, 0, 0, 0)
)
# Ink10 WAVEFORM3BIT from arduino driver
# {{0,0,0,0,0,0,1,0},{0,0,2,2,2,1,1,0},{0,2,1,1,2,2,1,0},{1,2,2,1,2,2,1,0},
@ -56,6 +59,10 @@ EPD_SPH = const(0x00000002) # in W1Tx1
# Inkplate provides access to the pins of the Inkplate 6 as well as to low-level display
# functions.
RTC_I2C_ADDR = 0x51
RTC_RAM_by = 0x03
RTC_DAY_ADDR = 0x07
RTC_SECOND_ADDR = 0x04
class _Inkplate:
@classmethod
@ -174,6 +181,70 @@ class _Inkplate:
def _tps65186_read(cls, reg):
cls._i2c.readfrom_mem(TPS65186_addr, reg, 1)[0]
@classmethod
def rtc_dec_to_bcd(cls, val):
return (val // 10 * 16) + (val % 10)
@classmethod
def rtc_bcd_to_dec(cls, val):
return (val // 16 * 10) + (val % 16)
@classmethod
def rtc_set_time(cls, rtc_hour, rtc_minute, rtc_second):
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
cls.rtc_dec_to_bcd(rtc_second),
cls.rtc_dec_to_bcd(rtc_minute),
cls.rtc_dec_to_bcd(rtc_hour)
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_set_date(cls, rtc_weekday, rtc_day, rtc_month, rtc_yr):
rtcYear = rtc_yr - 2000
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
data = bytearray([
RTC_DAY_ADDR,
cls.rtc_dec_to_bcd(rtc_day),
cls.rtc_dec_to_bcd(rtc_weekday),
cls.rtc_dec_to_bcd(rtc_month),
cls.rtc_dec_to_bcd(rtcYear),
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_get_rtc_data(cls):
cls._i2c.writeto(RTC_I2C_ADDR, bytearray([RTC_SECOND_ADDR]))
data = cls._i2c.readfrom(RTC_I2C_ADDR, 7)
rtc_second = cls.rtc_bcd_to_dec(data[0] & 0x7F) # Ignore bit 7
rtc_minute = cls.rtc_bcd_to_dec(data[1] & 0x7F)
rtc_hour = cls.rtc_bcd_to_dec(data[2] & 0x3F) # Ignore bits 7 & 6
rtc_day = cls.rtc_bcd_to_dec(data[3] & 0x3F)
rtc_weekday = cls.rtc_bcd_to_dec(data[4] & 0x07) # Ignore bits 7,6,5,4 & 3
rtc_month = cls.rtc_bcd_to_dec(data[5] & 0x1F) # Ignore bits 7,6 & 5
rtc_year = cls.rtc_bcd_to_dec(data[6]) + 2000
return {
'second': rtc_second,
'minute': rtc_minute,
'hour': rtc_hour,
'day': rtc_day,
'weekday': rtc_weekday,
'month': rtc_month,
'year': rtc_year
}
# power_on turns the voltage regulator on and wakes up the display (GMODE and OE)
@classmethod
def power_on(cls):
@ -813,9 +884,13 @@ class Inkplate:
def setRotation(self, x):
self.rotation = x % 4
if self.rotation == 0 or self.rotation == 2:
self.GFX.width = D_COLS
self.GFX.height = D_ROWS
self._width = D_COLS
self._height = D_ROWS
elif self.rotation == 1 or self.rotation == 3:
self.GFX.width = D_ROWS
self.GFX.height = D_COLS
self._width = D_ROWS
self._height = D_COLS
@ -1078,3 +1153,12 @@ class Inkplate:
val >>= 1
self.drawPixel(x + i, y + h - j, val)
def rtcSetTime(self, rtc_hour, rtc_minute, rtc_second):
return _Inkplate.rtc_set_time(rtc_hour, rtc_minute, rtc_second)
def rtcSetDate(self, rtc_weekday, rtc_day, rtc_month, rtc_yr):
return _Inkplate.rtc_set_date(rtc_weekday, rtc_day, rtc_month, rtc_yr)
def rtcGetData(self):
return _Inkplate.rtc_get_rtc_data()

View File

@ -1,3 +1,6 @@
# MicroPython driver for Inkplate 2
# By Soldered Electronics
# Based on the original contribution by https://github.com/tve
import time
import os
from machine import ADC, I2C, SPI, Pin
@ -212,9 +215,13 @@ class Inkplate:
def setRotation(self, x):
self.rotation = x % 4
if self.rotation == 0 or self.rotation == 2:
self.GFX.width = E_INK_WIDTH
self.GFX.height = E_INK_HEIGHT
self._width = E_INK_WIDTH
self._height = E_INK_HEIGHT
elif self.rotation == 1 or self.rotation == 3:
self.GFX.width = E_INK_HEIGHT
self.GFX.height = E_INK_WIDTH
self._width = E_INK_HEIGHT
self._height = E_INK_WIDTH

View File

@ -1,3 +1,6 @@
# MicroPython driver for Inkplate 4
# By Soldered Electronics
# Based on the original contribution by https://github.com/tve
import time
import os
from machine import ADC, I2C, SPI, Pin
@ -263,9 +266,13 @@ class Inkplate:
def setRotation(self, x):
self.rotation = x % 4
if self.rotation == 0 or self.rotation == 2:
self.GFX.width = E_INK_WIDTH
self.GFX.height = E_INK_HEIGHT
self._width = E_INK_WIDTH
self._height = E_INK_HEIGHT
elif self.rotation == 1 or self.rotation == 3:
self.GFX.width = E_INK_HEIGHT
self.GFX.height = E_INK_WIDTH
self._width = E_INK_HEIGHT
self._height = E_INK_WIDTH

View File

@ -1,3 +1,6 @@
# MicroPython driver for Inkplate 5
# By Soldered Electronics
# Based on the original contribution by https://github.com/tve
import time
import micropython
import framebuf
@ -55,6 +58,14 @@ EPD_LE = const(0x00000004) # in W1Tx0
EPD_CKV = const(0x00000001) # in W1Tx1
EPD_SPH = const(0x00000002) # in W1Tx1
# Some constants for the RTC
RTC_I2C_ADDR = 0x51
RTC_RAM_by = 0x03
RTC_DAY_ADDR = 0x07
RTC_SECOND_ADDR = 0x04
# Inkplate provides access to the pins of the Inkplate 5 as well as to low-level display
# functions.
@ -100,7 +111,7 @@ class _Inkplate:
cls.GPIO0_PUP.digitalWrite(0)
cls.VBAT_EN = gpioPin(cls._PCAL6416A, 9, modeOUTPUT)
cls.VBAT_EN.digitalWrite(1)
cls.VBAT_EN.digitalWrite(0)
cls.SD_ENABLE = gpioPin(cls._PCAL6416A, 10, modeOUTPUT)
cls.SD_ENABLE.digitalWrite(0)
@ -154,18 +165,22 @@ class _Inkplate:
# Read the battery voltage. Note that the result depends on the ADC calibration, and be a bit off.
@classmethod
def read_battery(cls):
cls.VBAT_EN.digitalWrite(0)
cls.VBAT_EN.digitalWrite(1)
# Probably don't need to delay since Micropython is slow, but we do it anyway
time.sleep_ms(5)
value = cls.VBAT.read()
print(value)
cls.VBAT_EN.digitalWrite(1)
cls.VBAT_EN.digitalWrite(0)
result = (value / 4095.0) * 1.1 * 3.548133892 * 2
return result
# Read panel temperature. I varies +- 2 degree
@classmethod
def read_temperature(cls):
# Power on so TPS is visible on I2C
cls.power_on()
# start temperature measurement and wait 5 ms
cls._i2c.writeto_mem(TPS65186_addr, 0x0D, bytes((0x80,)))
time.sleep_ms(5)
@ -173,11 +188,76 @@ class _Inkplate:
# request temperature data from panel
cls._i2c.writeto(TPS65186_addr, bytearray((0x00,)))
cls._temperature = cls._i2c.readfrom(TPS65186_addr, 1)
# convert data from bytes to integer
cls.temperatureInt = int.from_bytes(cls._temperature, "big", True)
cls.power_off()
return cls.temperatureInt
@classmethod
def rtc_dec_to_bcd(cls, val):
return (val // 10 * 16) + (val % 10)
@classmethod
def rtc_bcd_to_dec(cls, val):
return (val // 16 * 10) + (val % 16)
@classmethod
def rtc_set_time(cls, rtc_hour, rtc_minute, rtc_second):
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
cls.rtc_dec_to_bcd(rtc_second),
cls.rtc_dec_to_bcd(rtc_minute),
cls.rtc_dec_to_bcd(rtc_hour)
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_set_date(cls, rtc_weekday, rtc_day, rtc_month, rtc_yr):
rtcYear = rtc_yr - 2000
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
data = bytearray([
RTC_DAY_ADDR,
cls.rtc_dec_to_bcd(rtc_day),
cls.rtc_dec_to_bcd(rtc_weekday),
cls.rtc_dec_to_bcd(rtc_month),
cls.rtc_dec_to_bcd(rtcYear),
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_get_rtc_data(cls):
cls._i2c.writeto(RTC_I2C_ADDR, bytearray([RTC_SECOND_ADDR]))
data = cls._i2c.readfrom(RTC_I2C_ADDR, 7)
rtc_second = cls.rtc_bcd_to_dec(data[0] & 0x7F) # Ignore bit 7
rtc_minute = cls.rtc_bcd_to_dec(data[1] & 0x7F)
rtc_hour = cls.rtc_bcd_to_dec(data[2] & 0x3F) # Ignore bits 7 & 6
rtc_day = cls.rtc_bcd_to_dec(data[3] & 0x3F)
rtc_weekday = cls.rtc_bcd_to_dec(data[4] & 0x07) # Ignore bits 7,6,5,4 & 3
rtc_month = cls.rtc_bcd_to_dec(data[5] & 0x1F) # Ignore bits 7,6 & 5
rtc_year = cls.rtc_bcd_to_dec(data[6]) + 2000
return {
'second': rtc_second,
'minute': rtc_minute,
'hour': rtc_hour,
'day': rtc_day,
'weekday': rtc_weekday,
'month': rtc_month,
'year': rtc_year
}
# _tps65186_write writes an 8-bit value to a register
@classmethod
def _tps65186_write(cls, reg, v):
@ -390,10 +470,10 @@ class InkplateMono(framebuf.FrameBuffer):
data = int(fb[ix])
ix -= 1
w1ts0[0] = lut[data >> 4]
#w1tc0[0] = EPD_CL
# w1tc0[0] = EPD_CL
w1tc0[0] = off
w1ts0[0] = lut[data & 0xF]
#w1tc0[0] = EPD_CL
# w1tc0[0] = EPD_CL
w1tc0[0] = off
# display_mono sends the monochrome buffer to the display, clearing it first
@ -412,8 +492,8 @@ class InkplateMono(framebuf.FrameBuffer):
ip.clean(2, 1)
ip.clean(0, 11)
#w1ts0 = ptr32(int(ESP32_GPIO + 4 * W1TS0))
#w1tc0 = ptr32(int(ESP32_GPIO + 4 * W1TC0))
# w1ts0 = ptr32(int(ESP32_GPIO + 4 * W1TS0))
# w1tc0 = ptr32(int(ESP32_GPIO + 4 * W1TC0))
# the display gets written N times
t1 = time.ticks_ms()
@ -764,7 +844,7 @@ class Inkplate:
None,
None,
)
def initSDCard(self):
_Inkplate.SD_ENABLE.digitalWrite(0)
try:
@ -783,7 +863,7 @@ class Inkplate:
def SDCardSleep(self):
_Inkplate.SD_ENABLE.digitalWrite(1)
time.sleep_ms(5)
def SDCardWake(self):
_Inkplate.SD_ENABLE.digitalWrite(0)
time.sleep_ms(5)
@ -827,6 +907,15 @@ class Inkplate:
def einkOff(self):
_Inkplate.power_off()
def rtcSetTime(self, rtc_hour, rtc_minute, rtc_second):
return _Inkplate.rtc_set_time(rtc_hour, rtc_minute, rtc_second)
def rtcSetDate(self, rtc_weekday, rtc_day, rtc_month, rtc_yr):
return _Inkplate.rtc_set_date(rtc_weekday, rtc_day, rtc_month, rtc_yr)
def rtcGetData(self):
return _Inkplate.rtc_get_rtc_data()
def readBattery(self):
return _Inkplate.read_battery()
@ -843,9 +932,13 @@ class Inkplate:
def setRotation(self, x):
self.rotation = x % 4
if self.rotation == 0 or self.rotation == 2:
self.GFX.width = D_COLS
self.GFX.height = D_ROWS
self._width = D_COLS
self._height = D_ROWS
elif self.rotation == 1 or self.rotation == 3:
self.GFX.width = D_ROWS
self.GFX.height = D_COLS
self._width = D_ROWS
self._height = D_COLS

View File

@ -1,4 +1,6 @@
# Copyright © 2020 by Thorsten von Eicken.
# MicroPython driver for Inkplate 6
# Contributed by: https://github.com/tve
# Copyright © 2020 by Thorsten von Eicken
import time
import micropython
import framebuf
@ -59,6 +61,10 @@ EPD_SPH = const(0x00000002) # in W1Tx1
# Inkplate provides access to the pins of the Inkplate 6 as well as to low-level display
# functions.
RTC_I2C_ADDR = 0x51
RTC_RAM_by = 0x03
RTC_DAY_ADDR = 0x07
RTC_SECOND_ADDR = 0x04
class _Inkplate:
@classmethod
@ -177,6 +183,70 @@ class _Inkplate:
def _tps65186_read(cls, reg):
cls._i2c.readfrom_mem(TPS65186_addr, reg, 1)[0]
@classmethod
def rtc_dec_to_bcd(cls, val):
return (val // 10 * 16) + (val % 10)
@classmethod
def rtc_bcd_to_dec(cls, val):
return (val // 16 * 10) + (val % 16)
@classmethod
def rtc_set_time(cls, rtc_hour, rtc_minute, rtc_second):
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
cls.rtc_dec_to_bcd(rtc_second),
cls.rtc_dec_to_bcd(rtc_minute),
cls.rtc_dec_to_bcd(rtc_hour)
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_set_date(cls, rtc_weekday, rtc_day, rtc_month, rtc_yr):
rtcYear = rtc_yr - 2000
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
data = bytearray([
RTC_DAY_ADDR,
cls.rtc_dec_to_bcd(rtc_day),
cls.rtc_dec_to_bcd(rtc_weekday),
cls.rtc_dec_to_bcd(rtc_month),
cls.rtc_dec_to_bcd(rtcYear),
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_get_rtc_data(cls):
cls._i2c.writeto(RTC_I2C_ADDR, bytearray([RTC_SECOND_ADDR]))
data = cls._i2c.readfrom(RTC_I2C_ADDR, 7)
rtc_second = cls.rtc_bcd_to_dec(data[0] & 0x7F) # Ignore bit 7
rtc_minute = cls.rtc_bcd_to_dec(data[1] & 0x7F)
rtc_hour = cls.rtc_bcd_to_dec(data[2] & 0x3F) # Ignore bits 7 & 6
rtc_day = cls.rtc_bcd_to_dec(data[3] & 0x3F)
rtc_weekday = cls.rtc_bcd_to_dec(data[4] & 0x07) # Ignore bits 7,6,5,4 & 3
rtc_month = cls.rtc_bcd_to_dec(data[5] & 0x1F) # Ignore bits 7,6 & 5
rtc_year = cls.rtc_bcd_to_dec(data[6]) + 2000
return {
'second': rtc_second,
'minute': rtc_minute,
'hour': rtc_hour,
'day': rtc_day,
'weekday': rtc_weekday,
'month': rtc_month,
'year': rtc_year
}
# power_on turns the voltage regulator on and wakes up the display (GMODE and OE)
@classmethod
def power_on(cls):
@ -816,9 +886,13 @@ class Inkplate:
def setRotation(self, x):
self.rotation = x % 4
if self.rotation == 0 or self.rotation == 2:
self.GFX.width = D_COLS
self.GFX.height = D_ROWS
self._width = D_COLS
self._height = D_ROWS
elif self.rotation == 1 or self.rotation == 3:
self.GFX.width = D_ROWS
self.GFX.height = D_COLS
self._width = D_ROWS
self._height = D_COLS
@ -1042,3 +1116,12 @@ class Inkplate:
val >>= 1
self.drawPixel(x + i, y + h - j, val)
def rtcSetTime(self, rtc_hour, rtc_minute, rtc_second):
return _Inkplate.rtc_set_time(rtc_hour, rtc_minute, rtc_second)
def rtcSetDate(self, rtc_weekday, rtc_day, rtc_month, rtc_yr):
return _Inkplate.rtc_set_date(rtc_weekday, rtc_day, rtc_month, rtc_yr)
def rtcGetData(self):
return _Inkplate.rtc_get_rtc_data()

View File

@ -1,4 +1,6 @@
# Copyright © 2020 by Thorsten von Eicken.
# MicroPython driver for Inkplate 6COLOR
# Contributed by: https://github.com/tve
# Copyright © 2020 by Thorsten von Eicken
import time
import os
from machine import ADC, I2C, SPI, Pin, SDCard
@ -70,15 +72,19 @@ IO_PIN_B5 = const(13)
IO_PIN_B6 = const(14)
IO_PIN_B7 = const(15)
RTC_I2C_ADDR = 0x51
RTC_RAM_by = 0x03
RTC_DAY_ADDR = 0x07
RTC_SECOND_ADDR = 0x04
class Inkplate:
BLACK = const(0b00000000) # 0
WHITE = const(0b00000001) # 1
GREEN = const(0b00000010) # 2
BLUE = const(0b00000011) # 3
RED = const(0b00000100) # 4
YELLOW = const(0b00000101) # 5
ORANGE = const(0b00000110) # 6
BLACK = const(0b00000000) # 0
WHITE = const(0b00000001) # 1
GREEN = const(0b00000010) # 2
BLUE = const(0b00000011) # 3
RED = const(0b00000100) # 4
YELLOW = const(0b00000101) # 5
ORANGE = const(0b00000110) # 6
_width = D_COLS
_height = D_ROWS
@ -104,7 +110,7 @@ class Inkplate:
self.EPAPER_DC_PIN = Pin(EPAPER_DC_PIN, Pin.OUT)
self.EPAPER_CS_PIN = Pin(EPAPER_CS_PIN, Pin.OUT)
#self.SD_ENABLE = gpioPin(self._PCAL6416A, 10, modeOUTPUT)
# self.SD_ENABLE = gpioPin(self._PCAL6416A, 10, modeOUTPUT)
self.framebuf = bytearray(D_ROWS * D_COLS // 2)
@ -161,7 +167,7 @@ class Inkplate:
return True
def initSDCard(self):
#self.SD_ENABLE.digitalWrite(0)
# self.SD_ENABLE.digitalWrite(0)
try:
os.mount(
SDCard(
@ -176,11 +182,11 @@ class Inkplate:
print("Sd card could not be read")
def SDCardSleep(self):
#self.SD_ENABLE.digitalWrite(1)
# self.SD_ENABLE.digitalWrite(1)
time.sleep_ms(5)
def SDCardWake(self):
#self.SD_ENABLE.digitalWrite(0)
# self.SD_ENABLE.digitalWrite(0)
time.sleep_ms(5)
@classmethod
@ -273,6 +279,70 @@ class Inkplate:
def gpioExpanderPin(self, pin, mode):
return gpioPin(self._PCAL6416A, pin, mode)
@classmethod
def rtc_dec_to_bcd(cls, val):
return (val // 10 * 16) + (val % 10)
@classmethod
def rtc_bcd_to_dec(cls, val):
return (val // 16 * 10) + (val % 16)
@classmethod
def rtc_set_time(cls, rtc_hour, rtc_minute, rtc_second):
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
cls.rtc_dec_to_bcd(rtc_second),
cls.rtc_dec_to_bcd(rtc_minute),
cls.rtc_dec_to_bcd(rtc_hour)
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_set_date(cls, rtc_weekday, rtc_day, rtc_month, rtc_yr):
rtcYear = rtc_yr - 2000
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
data = bytearray([
RTC_DAY_ADDR,
cls.rtc_dec_to_bcd(rtc_day),
cls.rtc_dec_to_bcd(rtc_weekday),
cls.rtc_dec_to_bcd(rtc_month),
cls.rtc_dec_to_bcd(rtcYear),
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_get_rtc_data(cls):
cls._i2c.writeto(RTC_I2C_ADDR, bytearray([RTC_SECOND_ADDR]))
data = cls._i2c.readfrom(RTC_I2C_ADDR, 7)
rtc_second = cls.rtc_bcd_to_dec(data[0] & 0x7F) # Ignore bit 7
rtc_minute = cls.rtc_bcd_to_dec(data[1] & 0x7F)
rtc_hour = cls.rtc_bcd_to_dec(data[2] & 0x3F) # Ignore bits 7 & 6
rtc_day = cls.rtc_bcd_to_dec(data[3] & 0x3F)
rtc_weekday = cls.rtc_bcd_to_dec(data[4] & 0x07) # Ignore bits 7,6,5,4 & 3
rtc_month = cls.rtc_bcd_to_dec(data[5] & 0x1F) # Ignore bits 7,6 & 5
rtc_year = cls.rtc_bcd_to_dec(data[6]) + 2000
return {
'second': rtc_second,
'minute': rtc_minute,
'hour': rtc_hour,
'day': rtc_day,
'weekday': rtc_weekday,
'month': rtc_month,
'year': rtc_year
}
@classmethod
def clean(self):
if not self._panelState:
@ -317,9 +387,13 @@ class Inkplate:
def setRotation(self, x):
self.rotation = x % 4
if self.rotation == 0 or self.rotation == 2:
self.GFX.width = D_COLS
self.GFX.height = D_ROWS
self._width = D_COLS
self._height = D_ROWS
elif self.rotation == 1 or self.rotation == 3:
self.GFX.width = D_ROWS
self.GFX.height = D_COLS
self._width = D_ROWS
self._height = D_COLS
@ -504,3 +578,12 @@ class Inkplate:
self.writePixel(x1 + x, y1 + y, pixel_value1)
if x2 < width and y2 < height:
self.writePixel(x2 + x, y2 + y, pixel_value2)
def rtcSetTime(self, rtc_hour, rtc_minute, rtc_second):
return _Inkplate.rtc_set_time(rtc_hour, rtc_minute, rtc_second)
def rtcSetDate(self, rtc_weekday, rtc_day, rtc_month, rtc_yr):
return _Inkplate.rtc_set_date(rtc_weekday, rtc_day, rtc_month, rtc_yr)
def rtcGetData(self):
return _Inkplate.rtc_get_rtc_data()

View File

@ -1,4 +1,6 @@
# Copyright © 2020 by Thorsten von Eicken.
# MicroPython driver for Inkplate 6PLUS
# Contributed by: https://github.com/tve
# Copyright © 2020 by Thorsten von Eicken
import time
import micropython
import framebuf
@ -22,7 +24,7 @@ D_COLS = const(1024)
# Meaning of values: 0=dischg, 1=black, 2=white, 3=skip
# Uses "colors" 0 (black), 3, 5, and 7 (white) from 3-bit waveforms below
#add discharge to waveforms to try to fix them
# add discharge to waveforms to try to fix them
WAVE_2B = ( # original mpy driver for Ink 6, differs from arduino driver below
(0, 0, 0, 0),
(0, 0, 0, 0),
@ -32,12 +34,12 @@ WAVE_2B = ( # original mpy driver for Ink 6, differs from arduino driver below
(1, 1, 2, 0),
(1, 2, 2, 2),
)
# Ink6 WAVEFORM3BIT from arduino driver
# {{0,1,1,0,0,1,1,0},{0,1,2,1,1,2,1,0},{1,1,1,2,2,1,0,0},{0,0,0,1,1,1,2,0},
# {2,1,1,1,2,1,2,0},{2,2,1,1,2,1,2,0},{1,1,1,2,1,2,2,0},{0,0,0,0,0,0,2,0}};
# Ink6 WAVEFORM3BIT from arduino driver
# {{0,1,1,0,0,1,1,0},{0,1,2,1,1,2,1,0},{1,1,1,2,2,1,0,0},{0,0,0,1,1,1,2,0},
# {2,1,1,1,2,1,2,0},{2,2,1,1,2,1,2,0},{1,1,1,2,1,2,2,0},{0,0,0,0,0,0,2,0}};
TPS65186_addr = const(0x48) # I2C address
FRONTLIGHT_ADDRESS = 0x2E
FRONTLIGHT_ADDRESS = 0x2E
TOUCHSCREEN_EN = 12
TS_RTS = 10
TS_INT = 36
@ -65,6 +67,10 @@ EPD_SPH = const(0x00000002) # in W1Tx1
# Inkplate provides access to the pins of the Inkplate 6 PLUS as well as to low-level display
# functions.
RTC_I2C_ADDR = 0x51
RTC_RAM_by = 0x03
RTC_DAY_ADDR = 0x07
RTC_SECOND_ADDR = 0x04
class _Inkplate:
@classmethod
@ -102,18 +108,18 @@ class _Inkplate:
cls.VBAT = ADC(Pin(35))
cls.VBAT.atten(ADC.ATTN_11DB)
cls.VBAT.width(ADC.WIDTH_12BIT)
#Frontlight
# Frontlight
cls.FRONTLIGHT = cls._mcp23017.pin(11, Pin.OUT, value=0)
#Toucscreen
# Toucscreen
cls._tsXResolution = 0
cls._tsYResolution = 0
cls.touchX = 0
cls.touchY = 0
cls._xPos = [0,0]
cls._yPos = [0,0]
cls.xraw = [0,0]
cls.yraw = [0,0]
cls._xPos = [0, 0]
cls._yPos = [0, 0]
cls.xraw = [0, 0]
cls.yraw = [0, 0]
cls._on = False # whether panel is powered on or not
if len(_Inkplate.byte2gpio) == 0:
@ -167,7 +173,7 @@ class _Inkplate:
result = (value / 4095.0) * 1.1 * 3.548133892 * 2
return result
#Frontlight control
# Frontlight control
@classmethod
def frontlight(cls, value):
cls.FRONTLIGHT.value(value)
@ -178,8 +184,73 @@ class _Inkplate:
cls._i2c.writeto(FRONTLIGHT_ADDRESS, bytes((0,)))
cls._i2c.writeto(FRONTLIGHT_ADDRESS, bytes((value,)))
# RTC
@classmethod
def rtc_dec_to_bcd(cls, val):
return (val // 10 * 16) + (val % 10)
@classmethod
def rtc_bcd_to_dec(cls, val):
return (val // 16 * 10) + (val % 16)
@classmethod
def rtc_set_time(cls, rtc_hour, rtc_minute, rtc_second):
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
cls.rtc_dec_to_bcd(rtc_second),
cls.rtc_dec_to_bcd(rtc_minute),
cls.rtc_dec_to_bcd(rtc_hour)
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_set_date(cls, rtc_weekday, rtc_day, rtc_month, rtc_yr):
rtcYear = rtc_yr - 2000
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
data = bytearray([
RTC_DAY_ADDR,
cls.rtc_dec_to_bcd(rtc_day),
cls.rtc_dec_to_bcd(rtc_weekday),
cls.rtc_dec_to_bcd(rtc_month),
cls.rtc_dec_to_bcd(rtcYear),
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_get_rtc_data(cls):
cls._i2c.writeto(RTC_I2C_ADDR, bytearray([RTC_SECOND_ADDR]))
data = cls._i2c.readfrom(RTC_I2C_ADDR, 7)
rtc_second = cls.rtc_bcd_to_dec(data[0] & 0x7F) # Ignore bit 7
rtc_minute = cls.rtc_bcd_to_dec(data[1] & 0x7F)
rtc_hour = cls.rtc_bcd_to_dec(data[2] & 0x3F) # Ignore bits 7 & 6
rtc_day = cls.rtc_bcd_to_dec(data[3] & 0x3F)
rtc_weekday = cls.rtc_bcd_to_dec(data[4] & 0x07) # Ignore bits 7,6,5,4 & 3
rtc_month = cls.rtc_bcd_to_dec(data[5] & 0x1F) # Ignore bits 7,6 & 5
rtc_year = cls.rtc_bcd_to_dec(data[6]) + 2000
return {
'second': rtc_second,
'minute': rtc_minute,
'hour': rtc_hour,
'day': rtc_day,
'weekday': rtc_weekday,
'month': rtc_month,
'year': rtc_year
}
# Touchscreen
#Touchscreen
@classmethod
def touchInArea(cls, x, y, width, height):
x2 = x+width
@ -191,7 +262,7 @@ class _Inkplate:
cls.touchX = cls._xPos[0]
cls.touchY = cls._yPos[0]
if(cls.touchX > x and cls.touchX < x2) and (cls.touchY > y and cls.touchY < y2):
if (cls.touchX > x and cls.touchX < x2) and (cls.touchY > y and cls.touchY < y2):
return True
return False
@ -216,7 +287,7 @@ class _Inkplate:
@classmethod
def tsSoftwareReset(cls):
soft_rst_cmd = [0x77, 0x77, 0x77, 0x77]
helloPacket =bytearray([0x55, 0x55, 0x55, 0x55])
helloPacket = bytearray([0x55, 0x55, 0x55, 0x55])
try:
_Inkplate.tsWriteRegs(TS_ADDR, soft_rst_cmd)
@ -230,7 +301,7 @@ class _Inkplate:
rb = cls._i2c.readfrom(TS_ADDR, 4)
cls._tsFlag = False
if(rb == helloPacket):
if (rb == helloPacket):
return True
else:
@ -250,7 +321,7 @@ class _Inkplate:
ts_intr.irq(trigger=Pin.IRQ_FALLING, handler=cls.tsInt)
_Inkplate.tsHardwareReset()
if(_Inkplate.tsSoftwareReset() == False):
if (_Inkplate.tsSoftwareReset() == False):
cls.ts_intr = Pin(TS_INT, mode=Pin.IN)
return False
@ -279,7 +350,7 @@ class _Inkplate:
cls.xraw[i] <<= 4
cls.xraw[i] |= data[2 + offset]
cls.yraw[i] = ( data[1 + offset] & 0x0F)
cls.yraw[i] = (data[1 + offset] & 0x0F)
cls.yraw[i] <<= 8
cls.yraw[i] |= data[3 + offset]
@ -291,23 +362,31 @@ class _Inkplate:
raw = cls.tsGetRawData()
for i in range(0, 8):
if raw[7] & (1<<i):
if raw[7] & (1 << i):
fingers += 1
for i in range(0, 2):
cls.tsGetXY(raw, i)
if cls.rotation == 0:
cls._yPos[i] = (int)((cls.xraw[i] * D_ROWS - 1) / cls._tsXResolution)
cls._xPos[i] = (int)(D_COLS - 1 - ((cls.yraw[i] * D_COLS - 1) / cls._tsYResolution))
cls._yPos[i] = (int)(
(cls.xraw[i] * D_ROWS - 1) / cls._tsXResolution)
cls._xPos[i] = (int)(
D_COLS - 1 - ((cls.yraw[i] * D_COLS - 1) / cls._tsYResolution))
elif cls.rotation == 1:
cls._xPos[i] = (int)((cls.xraw[i] * D_ROWS - 1) / cls._tsXResolution)
cls._yPos[i] = (int)((cls.yraw[i] * D_COLS - 1) / cls._tsYResolution)
cls._xPos[i] = (int)(
(cls.xraw[i] * D_ROWS - 1) / cls._tsXResolution)
cls._yPos[i] = (int)(
(cls.yraw[i] * D_COLS - 1) / cls._tsYResolution)
elif cls.rotation == 2:
cls._yPos[i] = (int)(D_ROWS - 1 - ((cls.xraw[i] * D_ROWS - 1) / cls._tsXResolution))
cls._xPos[i] = (int)((cls.yraw[i] * D_COLS - 1) / cls._tsYResolution)
cls._yPos[i] = (int)(
D_ROWS - 1 - ((cls.xraw[i] * D_ROWS - 1) / cls._tsXResolution))
cls._xPos[i] = (int)(
(cls.yraw[i] * D_COLS - 1) / cls._tsYResolution)
elif cls.rotation == 3:
cls._xPos[i] = (int)(D_ROWS - 1 - ((cls.xraw[i] * D_ROWS - 1) / cls._tsXResolution))
cls._yPos[i] = (int)(D_COLS - 1 - ((cls.yraw[i] * D_COLS - 1) / cls._tsYResolution))
cls._xPos[i] = (int)(
D_ROWS - 1 - ((cls.xraw[i] * D_ROWS - 1) / cls._tsXResolution))
cls._yPos[i] = (int)(
D_COLS - 1 - ((cls.yraw[i] * D_COLS - 1) / cls._tsYResolution))
return fingers
@ -326,7 +405,6 @@ class _Inkplate:
cls._tsYResolution = ((rec[2])) | ((rec[3] & 0xF0) << 4)
cls._tsFlag = False
@classmethod
def tsSetPowerState(cls, state):
state &= 1
@ -351,8 +429,8 @@ class _Inkplate:
def i2cScan(cls):
return cls._i2c.scan()
# Read panel temperature. I varies +- 2 degree
@classmethod
def read_temperature(cls):
# start temperature measurement and wait 5 ms
@ -911,7 +989,6 @@ class InkplatePartial:
w1tc0[0] = off
# Inkplate wraper to make it more easy for use
@ -1018,9 +1095,13 @@ class Inkplate:
_Inkplate.rotation = x % 4
if self.rotation == 0 or self.rotation == 2:
self.GFX.width = D_COLS
self.GFX.height = D_ROWS
self._width = D_COLS
self._height = D_ROWS
elif self.rotation == 1 or self.rotation == 3:
self.GFX.width = D_ROWS
self.GFX.height = D_COLS
self._width = D_ROWS
self._height = D_COLS
@ -1245,14 +1326,14 @@ class Inkplate:
self.drawPixel(x + i, y + h - j, val)
#Frontlight
# Frontlight
def frontlight(self, value):
_Inkplate.frontlight(value)
def setFrontlight(self, value):
_Inkplate.setFrontlight(value)
#Touchscreen
# Touchscreen
def touchInArea(self, x, y, width, height):
return _Inkplate.touchInArea(x, y, width, height)
@ -1261,3 +1342,12 @@ class Inkplate:
def tsShutdown(self):
_Inkplate.tsShutdown()
def rtcSetTime(self, rtc_hour, rtc_minute, rtc_second):
return _Inkplate.rtc_set_time(rtc_hour, rtc_minute, rtc_second)
def rtcSetDate(self, rtc_weekday, rtc_day, rtc_month, rtc_yr):
return _Inkplate.rtc_set_date(rtc_weekday, rtc_day, rtc_month, rtc_yr)
def rtcGetData(self):
return _Inkplate.rtc_get_rtc_data()

View File

@ -1,3 +1,6 @@
# MicroPython driver for Inkplate 7
# By Soldered Electronics
# Based on the original contribution by https://github.com/tve
import time
import os
from machine import ADC, I2C, SPI, Pin, SDCard
@ -247,9 +250,13 @@ class Inkplate:
def setRotation(self, x):
self.rotation = x % 4
if self.rotation == 0 or self.rotation == 2:
self.GFX.width = E_INK_WIDTH
self.GFX.height = E_INK_HEIGHT
self._width = E_INK_WIDTH
self._height = E_INK_HEIGHT
elif self.rotation == 1 or self.rotation == 3:
self.GFX.width = E_INK_HEIGHT
self.GFX.height = E_INK_WIDTH
self._width = E_INK_HEIGHT
self._height = E_INK_WIDTH

1
installed/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*

0
installed/.gitpreserve Normal file
View File

View File

@ -1,5 +1,6 @@
# Copyright © 2020 by Thorsten von Eicken.
# Driver for the MCP23017 GPIO expander
# MicroPython driver the MCP23017 GPIO expander
# Contributed by: https://github.com/tve
# Copyright © 2020 by Thorsten von Eicken
from machine import Pin as mPin
from micropython import const

0
pyboard.py Normal file → Executable file
View File

View File

@ -1,6 +1,6 @@
# Copyright © 2020 by Thorsten von Eicken.
# Modified by Soldered to work for new Inkplate models
# MicroPython driver for Soldered Inkplate 10
# By Soldered Electronics
# Based on the original contribution by https://github.com/tve
import time
import micropython
import framebuf
@ -56,6 +56,10 @@ EPD_SPH = const(0x00000002) # in W1Tx1
# Inkplate provides access to the pins of the Inkplate 10 as well as to low-level display
# functions.
RTC_I2C_ADDR = 0x51
RTC_RAM_by = 0x03
RTC_DAY_ADDR = 0x07
RTC_SECOND_ADDR = 0x04
class _Inkplate:
@classmethod
@ -324,6 +328,70 @@ class _Inkplate:
cls.vscan_start()
cls.fill_screen(data)
@classmethod
def rtc_dec_to_bcd(cls, val):
return (val // 10 * 16) + (val % 10)
@classmethod
def rtc_bcd_to_dec(cls, val):
return (val // 16 * 10) + (val % 16)
@classmethod
def rtc_set_time(cls, rtc_hour, rtc_minute, rtc_second):
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
cls.rtc_dec_to_bcd(rtc_second),
cls.rtc_dec_to_bcd(rtc_minute),
cls.rtc_dec_to_bcd(rtc_hour)
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_set_date(cls, rtc_weekday, rtc_day, rtc_month, rtc_yr):
rtcYear = rtc_yr - 2000
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
data = bytearray([
RTC_DAY_ADDR,
cls.rtc_dec_to_bcd(rtc_day),
cls.rtc_dec_to_bcd(rtc_weekday),
cls.rtc_dec_to_bcd(rtc_month),
cls.rtc_dec_to_bcd(rtcYear),
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_get_rtc_data(cls):
cls._i2c.writeto(RTC_I2C_ADDR, bytearray([RTC_SECOND_ADDR]))
data = cls._i2c.readfrom(RTC_I2C_ADDR, 7)
rtc_second = cls.rtc_bcd_to_dec(data[0] & 0x7F) # Ignore bit 7
rtc_minute = cls.rtc_bcd_to_dec(data[1] & 0x7F)
rtc_hour = cls.rtc_bcd_to_dec(data[2] & 0x3F) # Ignore bits 7 & 6
rtc_day = cls.rtc_bcd_to_dec(data[3] & 0x3F)
rtc_weekday = cls.rtc_bcd_to_dec(data[4] & 0x07) # Ignore bits 7,6,5,4 & 3
rtc_month = cls.rtc_bcd_to_dec(data[5] & 0x1F) # Ignore bits 7,6 & 5
rtc_year = cls.rtc_bcd_to_dec(data[6]) + 2000
return {
'second': rtc_second,
'minute': rtc_minute,
'hour': rtc_hour,
'day': rtc_day,
'weekday': rtc_weekday,
'month': rtc_month,
'year': rtc_year
}
class InkplateMono(framebuf.FrameBuffer):
def __init__(self):
@ -843,9 +911,13 @@ class Inkplate:
def setRotation(self, x):
self.rotation = x % 4
if self.rotation == 0 or self.rotation == 2:
self.GFX.width = D_COLS
self.GFX.height = D_ROWS
self._width = D_COLS
self._height = D_ROWS
elif self.rotation == 1 or self.rotation == 3:
self.GFX.width = D_ROWS
self.GFX.height = D_COLS
self._width = D_ROWS
self._height = D_COLS
@ -1108,3 +1180,12 @@ class Inkplate:
val >>= 1
self.drawPixel(x + i, y + h - j, val)
def rtcSetTime(self, rtc_hour, rtc_minute, rtc_second):
return _Inkplate.rtc_set_time(rtc_hour, rtc_minute, rtc_second)
def rtcSetDate(self, rtc_weekday, rtc_day, rtc_month, rtc_yr):
return _Inkplate.rtc_set_date(rtc_weekday, rtc_day, rtc_month, rtc_yr)
def rtcGetData(self):
return _Inkplate.rtc_get_rtc_data()

View File

@ -1,6 +1,6 @@
# Copyright © 2020 by Thorsten von Eicken.
# Modified by Soldered to work on new Inkplate models
# MicroPython driver for Soldered Inkplate 6
# By Soldered Electronics
# Based on the original contribution by https://github.com/tve
import time
import micropython
import framebuf
@ -61,6 +61,10 @@ EPD_SPH = const(0x00000002) # in W1Tx1
# Inkplate provides access to the pins of the Inkplate 6 as well as to low-level display
# functions.
RTC_I2C_ADDR = 0x51
RTC_RAM_by = 0x03
RTC_DAY_ADDR = 0x07
RTC_SECOND_ADDR = 0x04
class _Inkplate:
@classmethod
@ -325,6 +329,70 @@ class _Inkplate:
cls.vscan_start()
cls.fill_screen(data)
@classmethod
def rtc_dec_to_bcd(cls, val):
return (val // 10 * 16) + (val % 10)
@classmethod
def rtc_bcd_to_dec(cls, val):
return (val // 16 * 10) + (val % 16)
@classmethod
def rtc_set_time(cls, rtc_hour, rtc_minute, rtc_second):
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
cls.rtc_dec_to_bcd(rtc_second),
cls.rtc_dec_to_bcd(rtc_minute),
cls.rtc_dec_to_bcd(rtc_hour)
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_set_date(cls, rtc_weekday, rtc_day, rtc_month, rtc_yr):
rtcYear = rtc_yr - 2000
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
data = bytearray([
RTC_DAY_ADDR,
cls.rtc_dec_to_bcd(rtc_day),
cls.rtc_dec_to_bcd(rtc_weekday),
cls.rtc_dec_to_bcd(rtc_month),
cls.rtc_dec_to_bcd(rtcYear),
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_get_rtc_data(cls):
cls._i2c.writeto(RTC_I2C_ADDR, bytearray([RTC_SECOND_ADDR]))
data = cls._i2c.readfrom(RTC_I2C_ADDR, 7)
rtc_second = cls.rtc_bcd_to_dec(data[0] & 0x7F) # Ignore bit 7
rtc_minute = cls.rtc_bcd_to_dec(data[1] & 0x7F)
rtc_hour = cls.rtc_bcd_to_dec(data[2] & 0x3F) # Ignore bits 7 & 6
rtc_day = cls.rtc_bcd_to_dec(data[3] & 0x3F)
rtc_weekday = cls.rtc_bcd_to_dec(data[4] & 0x07) # Ignore bits 7,6,5,4 & 3
rtc_month = cls.rtc_bcd_to_dec(data[5] & 0x1F) # Ignore bits 7,6 & 5
rtc_year = cls.rtc_bcd_to_dec(data[6]) + 2000
return {
'second': rtc_second,
'minute': rtc_minute,
'hour': rtc_hour,
'day': rtc_day,
'weekday': rtc_weekday,
'month': rtc_month,
'year': rtc_year
}
class InkplateMono(framebuf.FrameBuffer):
def __init__(self):
@ -844,9 +912,13 @@ class Inkplate:
def setRotation(self, x):
self.rotation = x % 4
if self.rotation == 0 or self.rotation == 2:
self.GFX.width = D_COLS
self.GFX.height = D_ROWS
self._width = D_COLS
self._height = D_ROWS
elif self.rotation == 1 or self.rotation == 3:
self.GFX.width = D_ROWS
self.GFX.height = D_COLS
self._width = D_ROWS
self._height = D_COLS
@ -1070,3 +1142,12 @@ class Inkplate:
val >>= 1
self.drawPixel(x + i, y + h - j, val)
def rtcSetTime(self, rtc_hour, rtc_minute, rtc_second):
return _Inkplate.rtc_set_time(rtc_hour, rtc_minute, rtc_second)
def rtcSetDate(self, rtc_weekday, rtc_day, rtc_month, rtc_yr):
return _Inkplate.rtc_set_date(rtc_weekday, rtc_day, rtc_month, rtc_yr)
def rtcGetData(self):
return _Inkplate.rtc_get_rtc_data()

View File

@ -1,6 +1,6 @@
# Copyright © 2020 by Thorsten von Eicken.
# Modified by Soldered to work on new Inkplate models
# MicroPython driver for Soldered Inkplate 6PLUS
# By Soldered Electronics
# Based on the original contribution by https://github.com/tve
import time
import micropython
import framebuf
@ -40,6 +40,7 @@ WAVE_2B = ( # original mpy driver for Ink 6, differs from arduino driver below
TPS65186_addr = const(0x48) # I2C address
TOUCHSCREEN_EN = 12
FRONTLIGHT_ADDRESS = 0x2E
TS_RTS = 10
TS_INT = 36
TS_ADDR = 0x15
@ -66,6 +67,10 @@ EPD_SPH = const(0x00000002) # in W1Tx1
# Inkplate provides access to the pins of the Inkplate 6 PLUS as well as to low-level display
# functions.
RTC_I2C_ADDR = 0x51
RTC_RAM_by = 0x03
RTC_DAY_ADDR = 0x07
RTC_SECOND_ADDR = 0x04
class _Inkplate:
@classmethod
@ -107,6 +112,10 @@ class _Inkplate:
cls.TPS_INT = gpioPin(cls._PCAL6416A_1, 6, modeINPUT)
cls.TPS_PWR_GOOD = gpioPin(cls._PCAL6416A_1, 7, modeINPUT)
#Frontlight
cls.FRONTLIGHT = gpioPin(cls._PCAL6416A_1, 11, modeOUTPUT)
cls.FRONTLIGHT.digitalWrite(0)
# Misc
cls.GPIO0_PUP = gpioPin(cls._PCAL6416A_1, 8, modeOUTPUT)
cls.GPIO0_PUP.digitalWrite(0)
@ -180,6 +189,81 @@ class _Inkplate:
cls.VBAT_EN.digitalWrite(0)
result = (value / 4095.0) * 1.1 * 3.548133892 * 2
return result
#Frontlight control
@classmethod
def frontlight(cls, value):
cls.FRONTLIGHT.digitalWrite(value)
@classmethod
def setFrontlight(cls, value):
value = (63 - (value & 0b00111111))
data_to_send = bytearray([0, value])
cls._i2c.writeto(FRONTLIGHT_ADDRESS, data_to_send)
@classmethod
def rtc_dec_to_bcd(cls, val):
return (val // 10 * 16) + (val % 10)
@classmethod
def rtc_bcd_to_dec(cls, val):
return (val // 16 * 10) + (val % 16)
@classmethod
def rtc_set_time(cls, rtc_hour, rtc_minute, rtc_second):
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
cls.rtc_dec_to_bcd(rtc_second),
cls.rtc_dec_to_bcd(rtc_minute),
cls.rtc_dec_to_bcd(rtc_hour)
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_set_date(cls, rtc_weekday, rtc_day, rtc_month, rtc_yr):
rtcYear = rtc_yr - 2000
data = bytearray([
RTC_RAM_by,
170, # Write in RAM 170 to know that RTC is set
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
data = bytearray([
RTC_DAY_ADDR,
cls.rtc_dec_to_bcd(rtc_day),
cls.rtc_dec_to_bcd(rtc_weekday),
cls.rtc_dec_to_bcd(rtc_month),
cls.rtc_dec_to_bcd(rtcYear),
])
cls._i2c.writeto(RTC_I2C_ADDR, data)
@classmethod
def rtc_get_rtc_data(cls):
cls._i2c.writeto(RTC_I2C_ADDR, bytearray([RTC_SECOND_ADDR]))
data = cls._i2c.readfrom(RTC_I2C_ADDR, 7)
rtc_second = cls.rtc_bcd_to_dec(data[0] & 0x7F) # Ignore bit 7
rtc_minute = cls.rtc_bcd_to_dec(data[1] & 0x7F)
rtc_hour = cls.rtc_bcd_to_dec(data[2] & 0x3F) # Ignore bits 7 & 6
rtc_day = cls.rtc_bcd_to_dec(data[3] & 0x3F)
rtc_weekday = cls.rtc_bcd_to_dec(data[4] & 0x07) # Ignore bits 7,6,5,4 & 3
rtc_month = cls.rtc_bcd_to_dec(data[5] & 0x1F) # Ignore bits 7,6 & 5
rtc_year = cls.rtc_bcd_to_dec(data[6]) + 2000
return {
'second': rtc_second,
'minute': rtc_minute,
'hour': rtc_hour,
'day': rtc_day,
'weekday': rtc_weekday,
'month': rtc_month,
'year': rtc_year
}
# Touchscreen
@classmethod
@ -962,6 +1046,8 @@ class Inkplate:
self.ipm = InkplateMono()
self.ipp = InkplatePartial(self.ipm)
self.FRONTLIGHT = _Inkplate.FRONTLIGHT
self.GFX = GFX(
D_COLS,
D_ROWS,
@ -1056,9 +1142,13 @@ class Inkplate:
_Inkplate.rotation = x % 4
if self.rotation == 0 or self.rotation == 2:
self.GFX.width = D_COLS
self.GFX.height = D_ROWS
self._width = D_COLS
self._height = D_ROWS
elif self.rotation == 1 or self.rotation == 3:
self.GFX.width = D_ROWS
self.GFX.height = D_COLS
self._width = D_ROWS
self._height = D_COLS
@ -1297,4 +1387,19 @@ class Inkplate:
# For more info, see https://github.com/SolderedElectronics/Inkplate-micropython/issues/24
def activeTouch(cls):
return _Inkplate.activeTouch()
#Frontlight
def frontlight(self, value):
_Inkplate.frontlight(value)
def setFrontlight(self, value):
_Inkplate.setFrontlight(value)
def rtcSetTime(self, rtc_hour, rtc_minute, rtc_second):
return _Inkplate.rtc_set_time(rtc_hour, rtc_minute, rtc_second)
def rtcSetDate(self, rtc_weekday, rtc_day, rtc_month, rtc_yr):
return _Inkplate.rtc_set_date(rtc_weekday, rtc_day, rtc_month, rtc_yr)
def rtcGetData(self):
return _Inkplate.rtc_get_rtc_data()